2014年1月26日日曜日

MacBookPro Retina買いました

しばらく古いPCの処分ばかりしていて、新しいPCを買ってなかったせいか無性に欲しくなりました。以前から欲しいなと気になっていたMacBookPro RetinaをしばらくHPで眺めていて我慢できなくなり注文!(ポチッとな)現在、現役で使っているMacBookAirが5年くらい前の代物で、そろそろ何時お亡くなりになってもおかしくない状況でしたから。(今のところそんな様子は微塵もありませんが、なにせSSD搭載タイプなので逝くときはいきなり逝っちゃうでしょう。HDD搭載タイプみたいに逝きそうになる様子なんか見せてくれないでしょうから。後、最近ちょっとCPUのFanがうるさくなったのが気になってました)

さて、注文して3日後には家に届けられてきました。

開封前の箱です。相変わらずSimpleです。美意識へのこだわりが見えます。














箱の横です。一言「MacBookPro」としか書かれていません。Retinaとも何もかかれてなく、一瞬不安になります。













ふたを開けてご対面です。他のApple製品もそうですが、マニュアルなんてなく、製品がそのままきれいに、しかもぴっちりと入っています。













本体を取り出すと電源ケーブルの付属品(これが唯一の付属品です)がきれいにおさめられています。毎度のことながら感動的に美しいです。













1週間ほど使っていますが、さすがにRetinaディスプレイ、美しいの一言です。普段は外部ディスプレイを接続、さらに一緒にBluetooth外部キーボードも合わせて購入しましたので、それで快適なプログラム開発環境を構築しています。


おまけ:
この写真に写っているもの何かわかります?自分が最初(正確には2台目)に購入したMacです。CPUにモトローラの68K(正確にはMMUを実装した68030です)を使ってた、初期のMacintosh SE30です。捨てるのが惜しくて、記念に外部ケースだけ保存してあります。(内部には9-inchモノクロCRTが入っていた一体型のPCです)20年以上前の代物で、当時はこれで遊んだものです。(正確には本当に最初に購入したMacはMacintosh SE(HDDなし)で、それを友人に売り、ちょっとバージョンアップしたSE30を買ったんですけどね。SEはFDDが2台ついていてシステム起動に3.5FDを2枚くらい?入れて起動してたと思います。キャリング・バッグも買いましたよw ちょっと日本人には大きく重すぎて移動したときに使う根性なかったんで、一度も移動して使ったことありませんが。)

2014年1月17日金曜日

Androidの温度センサは搭載されているのか?

最近、寒いせいなのかGalaxy S2のバッテリーの消耗が早くなった気がしています。2年以上たってますから古いといえば古いんですが、この厳しい寒期になってからそれまで3日くらいは(少なくとも2日以上)もっていたバッテリーが2日(48H)もちません。(夜は寒い居間に置きっぱなし)

ふと思ったのが、Android API内のSensorに温度センサがあったので、それでデータが取得できないかということです。(温度によって、バッテリーのもちに差がでるのかどうか確認してみたい)温度センサのリソースの取得APIは以下になります。

List sensors = sensorManager.getSensorList(Sensor.TYPE_TEMPERATURE);

(注:Android4.0からは更に湿度センサも追加され、温度センサを取得するには TYPE_TEMPERATURE → TYPE_AMBIENT_TEMPERATURE になります。)

サンプルプログラムで確認してみると、値が「0」固定で変わりません?Debugしてみると、上記APIで返されるセンサの個数が「0」でした。(センサが搭載されていない?)
試しにもう一つ持っているAndroid端末の(初代)Nexus7で動かしてみても、やはり「0」、温度センサは持っていないようです。
そういえば、某誌によく掲載される分解記事でも地磁気センサとかジャイロとかにどこ製のチップが使われているとか登場してきてても、特に温度センサについての記述を見た記憶がありません。確かに携帯に温度センサまで付けても用途は思いつかないのですが、それじゃなんでAPIが存在しているんでしょう?(しかも湿度センサのAPIまで追加して)
おそらくAndroidを携帯以外に、家庭内の機器制御にも利用することを考えているんでしょうかね?

2014年1月12日日曜日

MacBookAirに最新OS(Mavericks)を入れてみる

手持ちのMacBookAir(といってもかなり前に購入した、初代からマイナーチェンジしたばかりのバージョンです。例のジョブスがプレゼンで封筒から出して見せて薄さを強調してみせたタイプ。)に、Mavericksを入れてみました。タダだということだし。(SnowLeopardまではOSを購入してバージョンアップしてありました)
発表直後はちょっと躊躇したんですが、レビュー見てみると予想通り「何か遅くなった」、「フリーズするアプリがある」とかありましたが、自分が普段使ってるアプリなら問題なさそうなので実験です。(人柱ともいいます)
念のため、まずTimeMachineで最新のBackUpを取っておき、DL開始です。(ちなみにこのタイプのMacBookAirには有線のLANソケットがありません、デザイン優先です。さすがにWiFiでは耐え難かろうと、このときだけはUSBによる有線LANアダプタを使いました。)

結果ですが、特に何の問題もなくインストールできてしまい、ちょっと拍子抜けです。プログラムのデバッグするときなどは外部ディスプレイをつないでますが、今回から両方の画面にメニューバーが表示されるようになり便利になりました。
また、速度的には体感できるほどの差は自分では感じられませんでした。(特に追加の小物は入れてませんしね)
ただ、タッチパッドの画面スクロール(指2本で上下)がデフォルトではこれまでと逆(タブレットと同じ方向)なのは他のWindowsノートを操作するのと混乱しそうなので、設定を変えときました。

現在のMacBookAirの主な使用目的はAndroidアプリ開発になっていますが、特に問題なくADTも動くようです。まあ今のところは問題なしというところです。

2日後:
Mavericksにしてみて感想ですが、

  • システム終了がSnowLeopardのときは2,3秒だったのが5,6秒くらいに伸びた。(それでも十分、WindowsはおろかLinuxよりも早いですが、、、たった2MBしかメモリ搭載していないのに。)
  • CPUの負荷率はたいして変わっていない(めったに50%超えていない)のに、やたらFANが回るようになった?(風切り音が結構うるさくなった。これは通常負荷率が上がってCPU温度が高くなり、回転数が上げられる時の状態なんだけど・・・)
  • Finderの使い勝手がかなり変わり、まだ全然慣れてない。(まあこれはWindowsだろうがLinuxだろうが、バージョンが上がるときにはよくある話)
こんなところですか。MacBookAirは初代からSSDがHDDの代わりに採用されていたので、SSDへのアクセスが増えているのかどうかは体感上は感じられませんでした。(OSのメジャーバージョンが上がると、大抵は使用メモリが増え、swapが多くなり体感上の速度が遅くなるものですが。)
そういえばパフォーマンスメーターのメモリ使用量を見てみたらLinuxと同じように未使用のメモリはすべてファイルキャッシュに利用していると表示されてました。これって以前からだったろうか?
→これはMacBookAirがメモリを2GBしか搭載していないためでした。メモリ8GBのヤツで確認したらファイルキャッシュは2GBちょっとのサイズで、空きメモリをすべて利用しているわけではありませんでした ^^;

2014年1月11日土曜日

node.jsの勉強、謎の動作?

最近あまり話題になってないけど、一時期やたらnode.jsが騒がれていたと思います。特徴として、

  • イベントドリブンなので大量のrequestを受信しても問題が起きない。(単に停止するという、最悪な状態は発生しないよ、というサービスサイドの要求)
  • JavaScriptが基本で、生産性が高い(本当か?)
  • 一方、まだバージョンが0.Xの状態で安定性に欠ける(メモリリークもひどい。これは最初の利点とちょっと矛盾しますが)
とりあえず触ってもみずにあれこれいうのも何なので、少しやってみました。で、動いたことは動いたんですが、ちょっと謎の動きがあり、原因がまだつかめてません。

【現象】
server.on('request', function(req, res) { }

クライアントであるブラウザからの要求(request)のイベントに反応して行う処理を記述する部分ですが、chromeと、IE/FireFoxで動きが異なる。
問題はchromeの方。ページ更新を1回しかしていないのに、2回処理が動いてしまう。
しかもWireSharkで通信内容を調べてみると、node.jsから返信している2回目の内容を画面に反映していない。(従って、連続してページ更新を行うと、1回ごとに2回分の処理が行われるように見える)
但し、送信ボタンを押して処理を行う、というイベント処理では特に2回動くということはなく、chrome/IE/FireFoxとも同じ動きをしています。

WireSharkのログを比較しても、若干違いがあるのはわかるんですが、node.jsがパケットの何をトリガに、このイベントを発生しているのかまだよくわかってないためもう少し時間がかかりそうです.。

少しnode.jsを調べていたら、それらしいhintがみつかりました。そういえばchromeはURL表示欄にFaviconを表示しています。それらはページ更新の際、個別のrequestとしてServerには認識されるそうです。Server処理の方できちんと区別して、試してみて確認しないと。

Ubuntuの画面にUnityパネルが表示されなくなった?

Core2Duoのマシンに入れているUbuntu13で、kernel 3.8.0.-35に更新したところ、ログイン後の画面がおかしくなりました。(電源onでログインする設定にしていますので、通常ならUnityのパネルがでてくるところですが、、、、)
  • なんか画面解像度が小さくなり、縦横にやたら真っ黒な空白が(モニタ設定や画面設定が壊れているっぽい)
  • Unityパネルが表示されない。(通常なら以下のような画面になります)


しばし悩みましたが、そういえばこのPCにはビデオカードにnVidia(GT8900、ちょっと古いやつ)が入れてあり、ドライバを変更していました。ためしに古いKernelで起動すると、画面設定は以前のとおりフルスクリーンで表示されますが、あいかわらずまっさらなログイン画面です。


これでもマウスの右クリックで画面設定のwindowは表示されるので、そこからシステム設定に移り、ドライバをXorgのデフォルトを使用するに戻してから最新Kernelで起動すると画面解像度は正しく表示されるようになりました。(なぜか、その状態で再度nVidiaのドライバを使用するようにしても、画面解像度がおかしくなることなくなりました)

こんな画面ですがgnome window managerは一応動いているらしく、ショートカットキーで端末(shell)は起動できます。(CTRL + ALT + T)shellさえ開いてくれれば、ファイル操作のexplorerもどきも「nautilus」で直接コマンド起動してやればいいし、ブラウザも「chromium-browser」とコマンド実行してやれば動きます。システムを止めるにはログアウトしてやればログイン画面になり、そこから再起動、シャットダウンが実行できます。(CTRL + ALT + DEL)


普段使いにはなんの不自由もありません。かえって画面がすっきりして気持ちいくらいです。(実はUnityの画面パネルがどうしても好きになれない)
もうすぐメジャーバージョンアップでUbuntu14がReleaseされるという話があるので、しばらくこのまま使っていこうと思います。


20140118追記
あれから時々調査して、やっと解決しました。window-manager自体には本当に問題がないか試しに新規アカウントを作成し、ログインしてみるとUnityパネルは通常どおり表示されました。ということは、普段使っているアカウントのgnomeに関する設定ファイルのどれかがおかしくなったということです。
ネットで見ると色々な解決方法が出てくるんですが、全部ダメでした。最後に試したのが、~/.config/dconf/以下にあるuserファイル(バイナリのdataファイルです。ログイン毎に更新されるようです)を初期化(要は削除してしまえということです)することでした。自分は一応念のため別のディレクトリにmvしておきました。(注意:もちろんこの作業をするときは、別のアカウント、例えば先程新規に作成したアカウント等でログインして行います)これでUnityパネルは復活しました。
もちろんそれまでのパネル設定は初期設定に戻ってしまっていますので、再度設定しなおしです。またそれ以外にもアプリによっては設定が入っている可能性があります。現状、chromeを開いたらgoogleアカウントのパスワードを聞かれてきて、2段階認証コードを再度要求されました。(例の携帯に数字をメールしてくるやつです)他にも設定が初期化されてしまっているアプリがあるかもしれません。
しかしここにいたるまで何種類の解決方法があったことか、、、しかもそこに記載されているファイルの位置や名前が微妙に違っており、「Unityまだ安定していないな〜」というのを改めて感じました。嫌いなんだけどこれがUbuntuの標準なのでシステムアップデートの度に設定変更するのが面倒なため、unityを渋々使っています。

Nexus7 KitKat更新(その2)

4.2.2に続けて更新され、しばらく使っていましたがあいかわらずいまいちな使い勝手です。
(前回記事)Nexus7 KitKat更新
これって自分のNexus7が初代だからなんでしょうかね?不満は以下の通りです。
  • あいかわらず画面の回転に対する反応が遅い。(回転しても、アプリ側にスクリーンサイズが縦横変わったのが十分反映されず、画面端っこが黒抜きの状態のときも)
  • WiFiの暗号キーを忘れることはなくなりましたが、電源ボタンOn(といってもSleepからの起動)時にそもそもWiFiとの接続が切れていて、自分で操作してもWiFiの回路が動かないのか親機が全然表示されない、時間がかかることがよくある。
  • アプリの切り替えに時間がかかるようになった?
確かにバッテリーの持ちは良くなった実感はあります。アプリの切り替えが多少遅いのも我慢できる範囲内なんですが、WiFiの接続はなんとかしてほしい!

2014年1月6日月曜日

Ubuntuのnode.js実装

今度はnode.jsを少しかじってみようと思い、手元のUbuntu13に環境を準備します。(こういうこと考えると、vagrantで仮想環境の自動構築って便利だと初めて実感しました。最初は、なんでそんな気機能が必要なのか思いつかなったんで)

ググってみると、ソースをDLしてビルドする人、Ubuntuのapt-getで済ます人、半々のようです。どちらがいいか迷ったんですが、ソースからビルドすると大抵後で削除するのが面倒なことが多いです。他のものに影響を与えても原因追究しづらいし。
ということで、まずはすなおにUbuntuのapt-getでインストールします。


$ sudo apt-get install nodejs npm
[sudo] password for hoge:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています    

node.js本体とパッケージを管理するnpmを個別にインストールするようです。
メッセージが大量に流れますが、特に問題なくインストールは終了しました。

簡単なプログラムを以下に示します。(JavaScriptになります)
hello.js
var http = require('http');
var server = http.createServer();
server.on('request', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World!');
res.end();
});
server.listen(1337, '192.168.24.64');
console.log('Server running at 1337');


赤字はport番号と、(自PCの)IPアドレスです。
これで実行は以下の通りです。


$ nodejs  hello.js
Server running at 1337


(注:他のサイトの例では'node’コマンドでしたが、今回なぜか'nodejs’に変わっていました。おそらくubuntuだけの実装だと思われます)


あとはブラウザで当該port番号で開いてみれば動作を確認できます。無事"Hello World!"の表示を確認できたので、いくつかサンプルを試してみました。

そのうち「ejs」というテンプレートを処理するパッケージを使用するサンプルがでてきて(よく使われるようです)、まずそれをインストールしないといけません。ここでパッケージ管理のnpmの出番になります。

$ npm install ejs
npm http GET https://registry.npmjs.org/ejs


npm ERR! Error: failed to fetch from registry: ejs
npm ERR!     at /usr/share/npm/lib/utils/npm-registry-client/get.js:139:12
npm ERR!     at cb (/usr/share/npm/lib/utils/npm-registry-client/request.js:31:9)


なんだろう?Ubuntu独自実装のnodejsに問題があるのか?

後日、VMPlayer上に試験環境として用意してある別のPC上のUbuntuにソースからDLしてインストールしてみました。

$  ./configure
$  make
$  sudo make install

(/usr/local以下にinstallされた。わりと行儀がいい。)
次にnpmをインストールしようと思ったが、サイトにあったやり方を見ると、何をしようとしているのかよく意味がわからない。他のサイトではnode.jsと一緒にインストールされるとあったが、調べてみると、/usr/local/bin/npmと既に存在していた。

$ npm install ejs
npm http GET https://registry.npmjs.org/ejs
npm http 200 https://registry.npmjs.org/ejs
npm http GET https://registry.npmjs.org/ejs/-/ejs-0.8.5.tgz
npm http 200 https://registry.npmjs.org/ejs/-/ejs-0.8.5.tgz
ejs@0.8.5 node_modules/ejs
$

サイトの出力例とは若干違うが(バージョンも違うし)、普通にインストールできた。

やはり、Ubuntu独自の実装に問題がありそうだ。