2014年度 振り返り

コーディング

f:id:jetBeaver:20150312140715p:plain

業務でgithub使ってるのでそのコミットがほとんどです。MoscapsuleをOSSで公開してスターもらえたのはうれしい。覚えた言語はScalaSwift。どっちも楽しい言語です。

今まで技術書はあまり読んでいなかった*1が今年は必要に駆られたのもあって結構読んだ。特に会社にいっぱい置いてあるので買わなくて済む。全部買ってると結構かかるので。
1つ思ったのは、技術本は電子書籍より紙のほうがいいですね。リファレンスのように引くとなると、電子書籍ではさっとたどり着けない。小説や漫画は電子書籍で十分でした。

チーム開発

趣味でコーディングするのと仕事でするのは違うと実感。特にチームで開発することや、他の人にコードレビューしてもらえたのはすごく良い経験でした。助言・指摘してくれたすべての人に感謝してます。

今後

ライフワークとしてコーディングをしていきたい。ブログも継続したい所存です。ただし訳あって業務でコーディング続けられるかは微妙。残念。

*1:一昨年までいた業界の専門書がそもそも少ないというのもあるけど

【書評】大規模サービス技術入門

はてなの中の人が書いた大規模Webサービスの実践ノウハウ集です。内容は、OSやハードウェアの特性に基づくパフォーマンスの出し方や、DBのスケールアウト、サーバの仮想化や冗長構成、仮想化の話まで多岐に渡ります。途中では、はてなダイアリーで使われる全文検索アルゴリズムの解説まで盛りだくさん。インターンシップ向けに書かれた内容ですが、Web系のインフラエンジニアなら是非読んでほしいです。ただ全くの初心者だと分からないことが多いので、Webサービスの開発経験が少しあったほうがいいですね。

2010年初版の本なので5年ほど前の内容ですが、利用するソフトウェア・ハードウェアの仕組み・特性を理解し、適切に運用することは時代が変わっても同じかと思います。昨今、クラウドサービスが主流になりつつありますが、単純にAWSやAzureを利用するだけでなく、それらの仕組み・特性を理解することが大事ですね。

あと、はてなほどの大規模なサービスはそんなにないので、規模の小さなサービスではスモールな構成からスタートしたほうがいいと思った。サービスの成長予測から適切なインフラの設計・拡張までできる人になれるよう励みます。

インストールにgccコンパイルが必要なgemをプリコンパイルするスクリプト

gemをプリコンパイルするスクリプトです。

gem pre-compile script

使い方

$ cat Gemfile
source "http://rubygems.org"
gem 'http_parser.rb', '~> 0.6.0'
$ bundle package
$ ls
Gemfile  Gemfile.lock  vendor/
$ ls vendor/cache/
http_parser.rb-0.6.0.gem
$ ../gem-native-compile.sh ./
$ ls vendor/cache/
http_parser.rb-0.6.0-x86_64-linux.gem

動作解説

指定されたディレクトリ配下のgemを探して、アンパック`gem unpack `して、ネイティブコンパイル`rake native gem`してるだけです。なので、json-1.8.1.gemなど`rake native gem`に対応していない場合はプリコンパイルできません。

Facetimeオーディオ/LINE/Skypeの音質比較

前回のエントリーでは、Facetimeオーディオの音質について調査しました。今回は、Facetimeオーディオ/LINE/Skypeを比較してみます。

調査内容

可聴領域の広さ

条件

環境:iPhone5SSoftbank 4G)<--> iPhone6(docomo LTE
実験音源:http://cse.fra.affrc.go.jp/akamatsu/at/10/AuditoryTest.html

結果
周波数 Facetimeオーディオ LINE Skype
6kHz
7kHz
8kHz ×
9kHz ×
10kHz ×
11kHz △ *少し遠い ×
12kHz × ×
13kHz × ×
14kHz × ×
15kHz × ×
16kHz × × ×
考察

あれ、あれれ。LINEがすごい。15kHzまで聞こえました。可聴領域は一番です。
でも、ほんと個人的な主観だと人の音声はそれほど聞き取りやすいとは感じないんよ。

つまりね、可聴領域が広ければいいというわけではない!ということな気がしてきた。

で、もう少し詳しく感じたことを言うと、LINEは15kHzまで高い音がキンキンに聞こえるんよ。なのに16kHzになったとたんぴたっと聞こえない。
それに対してFacetimeオーディオの高音域は聞こえるといえば聞こえるけど、11kHzに近づくにつれて段々小さくなる。

ここから推察されるのは、Facetimeオーディオは人の音声が聞き取りやすいようにイコライジングしてるんじゃないかと。
高音域は聞こえるけど抑え目にして(コンプレッサかけてる)、人の音声の1kHzあたりを中心に増幅してるわけじゃないかな。
LINEは16kHzからすぱっとリミッターかけてる感じ。

これはちゃんと調査するなら周波数成分比較をしなければならぬな。
また時間があれば、そのうちやりたいと思います。

MQTT Client for iOS written in Swift

MQTT Clientのswift版作ったので公開。
実体はMosquittoのWrapperです。

flightonary/Moscapsule · GitHub

こんな感じで使えます。

import Moscapsule

// set MQTT Client Configuration
let mqttConfig = MQTTConfig(clientId: "cid", host: "test.mosquitto.org", port: 1883, keepAlive: 60)
mqttConfig.onPublishCallback = { messageId in
    NSLog("published (mid=\(messageId))")
}
mqttConfig.onMessageCallback = { mqttMessage in
    NSLog("MQTT Message received: payload=\(mqttMessage.payloadString)")
}

// create new MQTT Connection
let mqttClient = MQTT.invokeMqttConnection(mqttConfig)

// publish and subscribe
mqttClient.publishString("message", topic: "publish/topic", qos: 2, retain: false)
mqttClient.subscribe("subscribe/topic", qos: 2)

// disconnect
mqttClient.disconnect()

実装にあたってswiftからCをそのまま呼び出せるのでCで実装されたMosquittoを使うのは難しくありません。ただし、swiftで定義したfuncやclosureのポインターをcallbackとしてC側に渡すことはできないので、Objective-Cでブリッジさせるのがコツ。

P.S.
githubってgoogle日本語検索に引っかからないのがイマイチやんね。。。

swiftのコンパイラが落ちる

たいした話じゃないけど、swiftさわりはじめて最初に以下のコード書いてコンパイルしたら、Xcode 6.1のSyntax HighlightingがCrashするわ、コンパイラはSegmentation faultするわで笑ったw

let i = 0
println("%d", &i)

swift的には`println("\(i)")`が正しい)

なんか他にもジェネリクスでこねこねするとコンパイラがセグフォルするケースもあるみたいですが、今のところ文法が正しくてセグフォルすることはないみたいなので実用上は問題ないだろう。

Objective-Cは食わず嫌いだったので良いタイミングでswiftが出てきてよかった。Scalaみたいなところもあって覚えやすい。

Facetimeオーディオの音声品質

2014/12/09 追記
LINEやSkypeと比較しました。

Facetimeオーディオ/LINE/Skypeの音質比較 - Pseudo Engineer - こんなかんじでどうでしょう

はじめに

Facetimeオーディオの音声品質っていいですよね。個人的にはLINEやSkypeよりも聞きとりやすいと感じます。LTE回線同士でも遅延がなく安定していて、通常の電話のメリットなんかないと思えます。

じゃあどれくらい音質がいいのか実験してみましょう。本エントリーでの音質の基準はサンプリング周波数の高さとしますので、低い周波数の音から上げていって、どこまで聞こえるかを試します。

条件

環境:iPhone5SSoftbank 4G)<--> iPhone6(Wifi
実験音源:http://cse.fra.affrc.go.jp/akamatsu/at/10/AuditoryTest.html

結果
周波数 聞こえたか
8kHz
9kHz
10kHz
11kHz △ *少し遠い
12kHz ×
13kHz ×
考察

結構おどろきです。11kHzでも聞こえると言うことは、少なくともサンプリングレートは22kHzということになります。またFacetimeの音声codecはAAC-ELDのようです。(ソース

音声バンド定義だとWBとSWBの間くらいでしょうか。
300-3400 Hz = Narrowband (NB)
50-7000 Hz = Wideband (WB)
50-14000 Hz = Super Wideband (SWB)
20-20000 Hz = Fullband (FB)
(ソース:http://blog.voxygen.co.uk/?p=1132

結論

一般的な回線交換の電話だと3.4kHzまでしか聞こえないので、やはり聞き取りやすいとは思えません。しかし、AMR-WBに対応しているVoLTEの本格導入もあり、これからはよりよいWideband以上が主流となりそうですね。

電話は鈴虫の鳴き声(4kHz)が聞こえないというトリビアもありましたが、それも昔の話になるでしょう。

LINEやSkypeがどうなのかも気になるので、そのうち同様の実験をして比較したいと思います。