11/06/2015

Ubuntuで、Android本体(Android Open Source Project)のソースコードをビルドしてみる

AndroidのOS基本部分はソースが公開されていることは、ご存じの方も多いと思いますが、最近ちょっと、Androidのアーキテクチャをリサーチしてみたり、手を加えてみたい欲求が出てきたので、ソースコード取得&ビルドまでをやってみる。の記録。

本家ページは以下。手順も書いてある。
http://source.android.com/source/index.html


サポートされている開発環境は、Ubuntu14.04 or Macで、メモリー16GB、ディスク100GB以上(ソース)、ビルドするなら150GB〜200GBいるとか書いてある。

うちには、そんな贅沢なスペックのマシンはありません。でもやる。最近中古で買ったメインマシンのHP Spectre(Ivy Bridge)がメモリー4GB、SSD250GBと、きわどいスペックですが、きっとビルド遅いだけで済むでしょう。Windows10マシンとして使っていたところ、急遽Ubuntu14.04 64bitをインストール。ハードウェアも、ほどよく枯れているので、とくにトラブルもなく快適動作。SkylakeのPCほしー。コスパ的に私が買うのは2年後の中古かなー。


まずは、要るものインストール

JDKから

$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk



別のJDKをデフォルトにしている人は以下で、切り替える

$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac

なんだか、OpenJDK使えとな。Oracleのじゃなくて。ここはとりあえず、従っておく。Googleさんのスタンスとして、このへんどうなんだろう。AndroidStudioだとOracleのリンクが指定されていたり。AOSPは、別扱いなのだろうか。まあ、今はいいや。今度、ちゃんとドキュメントちゃんと読みます。


コンパイルに必要なものをインストール

$ sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip


USBでAndroidデバイスを認識できるようudev設定追加。ハードウェアにデプロイしないのなら要らないと思われ。

$ wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules


ソースをダウンロードするのに、repoというコマンドを使うので、その下ごしらえ

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo


ソースを取得するディレクトリ作成。私はとりあえずaospとしましたが、好きな名前でOKです。

$ mkdir aosp
$ cd aosp


repo初期化

$ repo init -u https://android.googlesource.com/platform/manifest


ブランチ指定したい人は、以下のように指定。ブランチ一覧はここを参考に。

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

ソース取得

$ repo sync


家のネット環境がイモ(Wimax)なせいか、頻繁にエラーで中断される。何度かやり直して、Done。
この時点でソースの総容量が、約13GB、うーん。推奨環境では100GBという話だったが、ちゃんと全部取得できてるんやろか。

とりあえず、ビルドまで通してみる。

$ source build/envsetup.sh
$ lunch aosp_arm-eng

引数のビルドタイプはプロセッサアーキやハードウェアの指定+user, userdebug, engとある。eng(多分エンジニアリングとかの意と思われ)はデバッグ可能な開発者向けビルド的なやつっぽ。タブで補完すれば、指定可能なオプションが確認できる。

現時点で選択可能なのは以下だった。

aosp_angler-userdebug
aosp_arm-eng
aosp_arm64-eng
aosp_bullhead-userdebug
aosp_deb-userdebug
aosp_flo-userdebug
aosp_flounder-userdebug
aosp_fugu-userdebug
aosp_hammerhead-userdebug
aosp_hammerhead_fp-userdebug
aosp_mips-eng
aosp_mips64-eng
aosp_shamu-userdebug
aosp_x86-eng
aosp_x86_64-eng
full_fugu-userdebug
m_e_arm-userdebug
mini_emulator_arm64-userdebug
mini_emulator_mips-userdebug
mini_emulator_x86-userdebug
mini_emulator_x86_64-userdebug



$ make -j4

知ってる人は多いと思いますが、-j4は並列コンパイルのスレッド数を指定。ホストマシンのコア数によって加減する。当然、多くすれば、コンパイルが早いが、マシン性能を超えて指定しても、早くはならない。一般にコア数の2倍程度が良好とされるが(昔の目安)、最近は4コア8スレッドとか、物理コア1つにつき、ハイパースレッディングで仮想コア2つみたいなアーキになってきたりしてるので、そのあたりも踏まえて、自分のマシンで、いろいろ試して、いい感じの並列数を探すのがいいのかもしれない。

で、ビルドが、なんとか終わる、正確に測ってなかったが、 Core i7-3517U  1.90GHz (2Core, 4Thread) のCPUで、-j4オプションで、約4時間くらい。

早速、実行してみる。実機デバイスに焼くというてもありますが、今、デプロイしちゃっていい端末や、開発ボードもないので、エミュレーターで起動させてみる。

$ emulator





なんとも言えない、やっちまった感漂うブートスプラッシュの趣。



うーん。なんだか、しょぼいホーム画面です。Nexus5を愛用してるので、それに近いものが出てくると勝手に予想してましたが、思いの外、オープンソースになってる部分だけでは、しょぼい感じのようです。ビルド指定が、ただのarmだからだろうか。hammerhead(nexus5のコードネーム)というビルドオプションもあるので、次はそれでやってみようかな。


ちょっと、目を疑ったので、ビルド情報確認。

Android6.0で、ビルドナンバーには今日の日付と、私の名前入ってます。どうやら、私がビルドしたものに間違いないようです。

ちなみに、ビルド後の作業ディレクトリの総容量は約41GBでした。ごにょごにょしていくと増えていくんでしょうが、思ったほどでかくなくて、助かりました。最近、ラップトップの内蔵ストレージが、SSDやeMMCになって容量あたりのコスト高いですからねえ。足りなくなりがち。 とりあえず、当初の目標であるソース取得からビルドまでは、無事できましたので、これからイジって行きたいと思います。

今回はこんなところで。



11/03/2015

Asus x205taでUbuntu14.04LTSを使う タッチパッド対策

5月くらいから、Asus x205taにUbuntu14.04をインストールして使っておりましたが、(LinuxMintはやめた)タッチパッドが、スクロールできなかったり、タップ無効にできなかったりで、不便でしたが治りました。

LinuxMint等、Ubuntu派生ディストリはこの方法で行けると思われます。

といっても、カーネルが対応したというだけのこと。ただのマウスっぽく認識していたところ、カーネル4.3以上でタッチパッドとして認識するようになりました。

4.3以上で対応するということは、前情報で知っていたので、kernel ppaにて、 まだか、まだかと、こまめにチェックしてカーネル取っ替え引っ替えしていたところ、4.3の安定版が提供され始めたのでインストール

http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.3-wily/

↑から、

linux-headers-4.3.0-040300-generic_4.3.0-040300.201511020949_amd64.deb
linux-headers-4.3.0-040300_4.3.0-040300.201511020949_all.deb
linux-image-4.3.0-040300-generic_4.3.0-040300.201511020949_amd64.deb

をもらってきて、$sudo dpkg -i linux*

だけで、タッチパッドがまともになりました。カーネルモジュールや、X11関連の設定ファイルは特にイジらなくてもよさげ。これで、2本指スクロール。タップ無効ができて快適になりました。



が、しばらく使っていて、よくフリーズする。経験即で、カーネル4.2以上だとx205taは固まる頻度が高い感じがする。acpiとi2cのなんかっぽい情報は、web上で、ちらほら見かけますが、このカーネルバージョン(あるいはビルドオプション)でも、今一つのよう。現時点で、安定性を重視するならタッチパッド諦めて、4.1系を使っていたほうが無難かも。

あと、サウンドとblue toothは依然、認識せず。パーフェクトになるには、まだまだカーネル開発が進むのを待つ必要がありそうです。カーネルソースを自力でイジればいいんでしょうが、ヘタレなので今の所、待ちのスタンスで(笑)

今日は以上です。


11/02/2015

このところ、頭脳がこんがらがり気味なので、生活に禅を取り入れてみようと。

このブログは技術ネタがメインですが、故スティーブジョブス氏や、Googleでも禅を取り入れているようで、ストレスフルで変化の激しいIT業界で生きていくには、禅は有用なツールとなりえるのではなかろうか。

というわけで、金沢で初心者が気軽に座禅ができるらしいということで、大乗寺の座禅会に参加してみました。






 木々が美しい参道をてくてく歩いて行き、門をいくつかくぐると本殿に到着。駐車場から結構歩きます。(15分くらいかな)今回は行けませんでしたが、公園や、前田家の墓地が隣接しているそうで、そちらも観光スポットになっているようです。






中はわりと、地味で質素な感じです。


座禅会は毎朝4:00と、日曜1:30からやっているそうです。初心者は日曜のやつがお勧めとのことだったので、そちらに参加。予約は特にしなくても、おもむろに行ってOKでした。HPによると企業、団体向けに数日、泊まり込みで修行僧と一緒に禅修行することもできるらしい。

1:15分くらいに行って、受付を済ませます。氏名、住所、電話番号と、「初めてのかた」に丸をつけるような簡単な名簿記入だけです。毎回、初心者の方も多いらしく、手慣れた感じでサクサク、システマチックに進みます。座禅入門的パンフレットと、法話のプリントもらって談話室のようなところに案内され、それらに目を通していると、お坊さんがやってきて、パンフレットに沿って、作法を一通り説明して頂けました。手の組み方、合掌の仕方、足の組み方、歩き方等々。




といっても、この段階で、完璧に作法をマスターしてください、というわけではなく、やりながら指導して頂けます。

で、お坊さん曰く、人間、無になることはできないので、思考は浮かぶままに、深く追及せず、流していってくださいとのこと。禅は無になることを目指すんだ、という思い込みがありましたが、そういうわけでもないみたい。

座禅場は、さすがに、写真撮れる雰囲気ではありませんでしたが、なんとも静かで素朴な空気感です。どでかいカメムシが、けっこう居ます。

座布団の上に座禅用のボール状のクッションが置いてあり、これを揉みほぐして、ふっくらさせることから始まります。
で、前後に合掌、一礼して、(周囲の人に、ここでやらせて頂きます、よろしくね的な意)座について足を組みます。

足の組み方ですが、両足を腿の上に乗せるのがベストっぽいですが、片方だけでもアリで、どっちの足が上とかは、それほどこだわらなくていいっぽ。体固い人は、普通のあぐらでもOKとのこと。私は、片足だけ腿の上で、挑戦しましたが、数分で足もげそうになって、集中できなかったので、無理せず、あぐらにしました。

目は半閉じで、斜め下45度を見る。完全に閉じると眠くなるからだそうです。で、座禅というと寝てたりすると、肩をぶっ叩かれるイメージあるかと思いますが、どうやら、自主的に気合い入れてほしい人は首を左に傾け、肩を開けると叩きますという感じみたいです。いきなり不意打ちで、ぶっ叩かれることは無いようです。私は姿勢が悪かったようで、背中をツンツンされて、背筋伸ばしました。

そんなこんなで40分ほど座禅しました。途中トイレ休憩があります。この際も、小股で、座禅上の前を回るという作法があります。

体験してみて、感じた事は、40分は、全く長く感じず、苦痛でもなかった。もっとやってもいいくらい。だが、それ以上は冗長になるだけっぽい感じもするので40分は、程よい時間かなと思う。

初めは、隣の人とかが、気になったり、自分の姿勢が気になったり、足痛いという雑念がありましたが、やってるうちに、建物や、目の前の障子、カメムシに意識が向いて、そのうち、それらも気にならなくなっていって、自分の思考を、どんどん流していくと、半覚醒というか、心地よいトランス状態というか、緊張感と意識が残っている、夢うつつ状態というか、植物とか石ころのような感じというか、そこに存在するべくして存在する感というか、自我や価値観みたいなものが、あってないもの。ただそこに存在するだけ、それでOKじゃん感というか。言葉では言い表すのは難しいですが、そんな感じ。やってる途中、頭のこめかみから前頭部にかけて、ジンジンした。

終わったら、脳みそに湿布張ったような、スーッと感があった。(医学的にいいことなのかはわからないが)


3時頃に座禅終えて、その後4時頃まで、和尚さん的な方の法話があり、これが、また面白い。

政治家さんや、経営者やスポーツ選手の方など、メンタルきつい人達は、座禅をやりにくるという話を実話エピソードを交えてお話しして頂けたり、念、想、観をやめて自分の見方を一度捨てて、心を投げ出す。執着を手放すことで、次のものを得ることができる。刻々と変わる変化に対応して行けるということ。その他諸々、為になるお話を聞くことができ、勉強になりました。

法話が終わったら、お茶とお菓子が振る舞われます。でも、みなさん、さくさく帰る方がほとんど。あまり雑談もなく。もそもそ食べて帰路につきました。中々、有意義な時間だった。

これは、月一くらいで、やってみてもいいかなと思った。





10/11/2015

CEATEC JAPAN 2015 に行ってきた

CEATEC JAPAN 2015 に行ってきました。最先端ITやエレクトロニクスの展示会です。

気になったものを写真撮って話聞いてきた。


まずは、会場の様子。今回は、Iot、ウェアラブル、アイウェアを中心に見てきました。オートモーティブ、ロボット関係も結構見受けられました。3Dプリンタ関係は縮小傾向かもな印象。













以下、気になったもの。



鯖江 x murata



アイウェア、ヘッドマウントディスプレイ関係はEpsonさんや、vuzixさんも新製品を展示してましたが、今回、Fujitsuさんの網膜照射型が体験できて、初体験してきました。網膜照射型の利点は、フォーカスフリーで、目のピント合わせを意識させないというところ。遠くを見ていても、像がぼやけない。あと、目が悪い人でも見えるらしいです。目の健康的にどうなんだろうと思いましたが、レーザー規格的にクリアしているそうです。














ロボット、ドローン系も多く展示していました。





BOEというメーカーは初めて知りましたが、10Kディスプレイを展示してました。高解像はとどまることを知らないですねー。UHD(ウルトラハイディフィニション)という用語を初めて知った。4Kや8KをUHDと言うらしいっす。




Forram8さんは精力的に展示会出していて、よく見かけます。お馴染みのVRシミュレーターとかデモしてました。





Mitsubishiさんで、Asus Xtionを使った3Dスキャナのデモをやっていて、フリーハンドで大雑把に動かしているのに、かなりの精度でデモの部屋を広範囲でつなぎ合わせスキャンできていて驚いた。




ファーウェイさんのAndroidのウォッチ。デザインや大きさが自然になって、つけてもいいかもと思えるレベルになってきましたねー。バッテリ毎日充電とか、面倒臭そうだけど、それでもいいくらいに便利なんだろうか。






AERIAL IMAGINGさんの空中ディスプレイ。直接、体験できなかったが、傍から見ていて、かなり、ホログラムでした。特殊な透過パネルに映像を照射して、空中に3次元で結像してるっぽい。
手で触れても何もないが、空中画面にタッチで操作出来ているように見えた。これほしい!
 http://aerialimaging.tv/




まとめ

クラウドコンピューティングが一般化してきたところで、Iot周りの実用性や低価格化により、CPS(Cyber Physical System)という潮流がきているなーと感じた。パーソナルロボットやウェアラブルデバイスも、情報の入出力として現実とデジタルの融合の役割を担ってくる予感。

デベロッパーとしての問題は、そうした恵まれたインフラを、どのように応用して価値を生み出していくかちゅうことですが、そうした環境も低コストで利用できるようになり、個人のアイデアを実現するのに敷居がずいぶん下がってきている。面白い世の中になりそう。

10/06/2015

Nexus 5にAndroid 6.0 Marshmallowのファクトリーイメージを焼いてみる(Ubuntuで)

Android 6.0 Marshmallowがリリースされましたが、OTAでアップデートされるのを待ってられず、勢い余ってファクトリーイメージを焼いてしまう。先日、不調だったNexus5のバッテリを自力で交換しちゃったし、もうメーカー保証なんてアテにしません。

普段使いのNexus5をやっちまうのはリスキーな気もするが、誘惑に勝てず。ファクトリーイメージの焼き方覚えれば、不具合あったらLollipopに戻せるさー(多分)。

ハマりポイントをメモっとく

ホストPCはUbuntu14.04 64bitです。JDKと、AndroidSDKは導入済み前提で、今回使うコマンド「adb」と「fastboot」はSDKのplatform-toolsに入っている。

USB経由でadbを使えるようにしておく必要がある。「/etc/udev/rules.d/50-android.rules」に以下を追記しておく

SUBSYSTEM=="usb",SYSFS{idVendor}=="18d1",MODE="0666"

1. 以下から、Nexus5用の6.0のファクトリーイメージをダウンロード。ホームとかに解凍しておく。一応、このページにやり方書いてあるので、ほぼそのままやる。


2. 端末をfastbootモードで起動する。方法は2つ
  ・ ホストPCから、「$ adb reboot bootloader」
  とやるか、
  ・ nexus5の場合、電源OFFの状態から、端末の音量キーUP,Down両方を押しながらパワーボタンで起動させる

3. 「$ fastboot oem unlock」コマンドで、アンロックするわけですが、ここで、ハマりポイント。< waiting for device >と出て、一向に進まず。どうやらLinux環境だと、rootじゃないとこれがうまく実行されないぽ。なので「sudo -i」とかでルートになって実行。

4. 次に、ファクトリーイメージを解凍して中に入っている「flash-all.sh」を実行するのだが、これの中身はfastbootコマンドの応酬なので、ルートのままで実行。この時、カレントディレクトリを移動するので、AndroidSDKにパスを一時的に通しておく。
「 # export PATH="$PATH:/home/hoge/android/android-sdk-linux/platform-tools"」としておいて、「# ./flash-all.sh」

6.  ひと通り終わったら、再びfastbootで起動させ、「$ fastboot oem lock」しておく

ちょっと雑なまとめですが、こんな感じで焼けました。起動に時間がかかったのでヒヤヒヤしたが、動いてます。なんだか、6.0になったからといって、ぱっと見、UIもなんにも変わってない感じ。若干、ペタッと感が増した気も。とりあえず、しばらく使ってみる。





今回はこんなところで。

10/04/2015

Ubuntu14.04 64bitでAndroidビルドしようとしてaaptでエラー出る対策メモ

以前、Ubuntu14.04 64bit上のAndroid Studioで、アプリをビルドしようとしてaaptがエラーでビルドできない対策が、曖昧だったので、改めて小ネタメモ。

原因は、aaptが32bitのバイナリで実行するのに32bitのライブラリが、必要なんだが、ホストが64bitなので、別途、32bitライブラリが要るっつうこと。以下のものをインストールすれば、OKと判明

sudo apt-get update
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6


8/29/2015

Asus x205ta にLinuxMintインストール&Wifi、MicroSD有効化(Ubuntu, Debianにも)

最近、商売気が強くなってきたUbuntuより、LinuxMintに乗り換えたほうが幸せな予感と思い、試運転も含めてインストール。

インストール手順を記録。

1. http://www.linuxmint.com/よりLinux Mint 17.2 Cinnamon 64bit版をダウンロード

2. Universal USB Installerを使ってUSBメモリにインストールディスクを書き込む

3. bootia32.efiをもらってきてUSBメモリの「/EFI/BOOT/」にコピー

4. x205taのBIOS設定でSecure Boot ControlをDisableにしておく、インストール段階では内蔵Wifiが使えないのでUSBのWifiアダプタか、有線LANアダプタでもつないで、どうにかインターネットに繋がるようにしておく。

5. USBメモリから起動して、普通にインストール。キーボードが勝手に連打されたりする現象があったりするのでパスワード入力とか気をつける。現象は後でアップデートすると治るのでとりあえず我慢。

6. インストール後、このままでは、32bitUEFIの関係で再起動してもSSDから起動しないので、USBメモリのGrubを使ってSSD内のLinuxMintを起動する。USBメモリから起動し、Grubの起動選択画面で、「ctrl-c」でプロンプトに落ちて、以下を入力。(ちなみにタブで補完できる)

> linux (hd1,gpt2)/boot/vmlinuz-3.16-0-38-generic root=/dev/mmcblk0p2 reboot=pci,force
> initrd (hd1,gpt2)/boot/initrd-3.16-0-38-generic 
> boot

7. 32bitUEFI用Grubをインストール。これでSSDから直接起動できる。以前、Ubuntu14.04のインストールを試した時はEFIバリアブルへブートローダーの登録に失敗していて、面倒くさいことになっていたが、このバージョンのLinuxMintでは問題なかった。これでUSBメモリ無しで自力で起動。

$ sudo apt-get install grub-efi-ia32

7. このままだと、内蔵Wifi、MicroSDカードリーダー等が使えない。これはカーネルをかなり新しめにバージョンアップし、ゴニョゴニョすると解決する。チップセットが新しいのでカーネルのドライバ対応が追いついていないんですね。http://kernel.ubuntu.com/~kernel-ppa/mainline/より新し目のカーネルパッケージをもらってくる。今回はv4.1.6-unstable/を使用。

$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-headers-4.1.6-040106-generic_4.1.6-040106.201508170230_amd64.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-headers-4.1.6-040106_4.1.6-040106.201508170230_all.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-image-4.1.6-040106-generic_4.1.6-040106.201508170230_amd64.deb
$ sudo dpkg -i linux*


8. Wifiチップのファームウェアをセットアップ

$ wget https://android.googlesource.com/platform/hardware/broadcom/wlan/+archive/master/bcmdhd/firmware/bcm43341.tar.gz
$ tar -zxvf bcm43341.tar.gz
$ sudo cp fw_bcm43341.bin /lib/firmware/brcm/brcmfmac43340-sdio.bin
$ sudo cp /sys/firmware/efi/efivars/nvram-74b00bd9-805a-4d61-b51f-43268123d113 /lib/firmware/brcm/brcmfmac43340-sdio.txt


sysfsutilsをインストール

$ sudo apt-get install sysfsutils


「/etc/sysfs.conf 」に以下を追記

bus/platform/drivers/sdhci-acpi/INT33BB:00/power/control = on


7. MicroSDカードリーダーを有効化する。「/etc/modprobe.d/sdhci.conf」に以下を追記(無ければ新規作成)

options sdhci debug_quirks=0x8000

で、以下を実行

$ sudo update-initramfs -u -k all

これで、再起動すれば、めでたく、内蔵Wifiとカードリーダーが使えてるはず。これで、かなり実用度アップ。

現時点では、オーディオはダメですが、いずれカーネルが対応すれば使える日もくることを期待しつつ。あと、タッチパッドの2本指スクロールや、タップ無効が効かないのが地味に不便。ただのマウスとして認識しているのかもしれない。対策知っている方いらっしゃいましたら、ぜひ教えて頂きたいです。

今回はこれくらいで。


参考URL: https://wiki.debian.org/InstallingDebianOn/Asus/X205TA



8/05/2015

Visual Studio 2015をちょっと触ってみる

Windows10がリリースされ、早速使い始めてます。戸惑いながらも、慣れてきました。Windows8.1からのアップグレードでしたが、今のところ不具合のあるアプリケーションもなく、ちょい重いかなというくらいで、ボチボチイケてます。
Windows8由来のタイルスタイルのUIやストアアプリはもう迷走気味な気がしますが、ゲームコンソールやフォン、タブレットを統合したユニバーサルアプリという方向に向かっているようですね。OneDriveが使うときに使うものだけダウンロードではなく、完全同期する仕様に戻ってしまったのは、微妙。使い勝手はこのほうがいいんですが、SSDが32GBとかの容量の小さいローエンドのAtomタブレットやスティックPCでは結構厳しいのではと思いつつ。

さて、本題。Visual Studio 2015が、正式リリースされていたので、ちょっと試しながら、気になった点を書こうかと。

まず、サードパーティーの開発ツールとの統合が目立ちます。UnityやXamarin、Cocos2dがテンプレートとして用意され、必要なものがインストールされていなければ、自動的にダウンロード&インストールされて便利な感じ。Xamarinとの親和性が増し、Visual StudioでiOSやAndroidのアプリがC#で作成できるのは、なんとも違和感があります。以前からXamarinを使っている人には朗報かもしれませんが、個人的には、流行るのか疑問。
このところワンソースでいろんなプラットフォームに対応できる潮流がありますが、Webアプリに近いカジュアルな物ならいい気がしますが、端末固有のハードウェアをフル活用するようなものや、端末毎のUIデザインの考え方の違い、パフォーマンスがシビアなアプリで、いったいどこまで有用なのかなー。



で、Androidプロジェクトをちょっとやってみたところ、まず、エラーが出た。Android SDKのパスを指定する必要がありました。私はAndroid Studioもインストールしてあったので、その時に自動的にインストールされるAndroid SDKのパスを指定してOKでした。
Android SDKマネージャーや、エミュレーターマネージャー、LogCat、DDMSは統合され、ツールバーのボタンから起動できるようになってました。
で、ブランクアプリをビルドしてみたが、エミュレーターを立ち上げるのにメモリが2Gもいるとか言われて、今のPCでは厳しかった。実機のNexus5繋げたが、どうもVisualStudioから認識されていないみたい。DDMSでは認識するんだが、Runのところで選択できず。ちょっと設定が必要なのかも。


続いて、iOS、やっぱりというか、Xamarinのテクノロジーを使っているわけで、ビルドには、結局ビルドサーバーとしてMacが必要なようです。うーん。まあ、予想はしていましたが、やっぱそうだよね。




あと、個人的に、オッと思ったのは、DirectXプロジェクトで使える、シェーダーデザイナーとモデルエディター。実はVisual Studio2012からあったみたい。シェーダーデザイナーはビジュアルプログラミングでシェーダーをパッチ感覚で作成できみたい。モデルエディターは3Dモデラーのよう。プリミティブなモデルならサクッと作成できるものの、細かくモデリングするには圧倒的に機能不足な感が。まあ、搭載するだけ偉い。今後の機能充実に期待。




今回はこんなところで。

7/29/2015

キャッシュの話

昔、キャッシュで苦労したことを思い出して、記事にしようと思い立つ。

まず、キャッシュとは何ぞやという話から。

今日のコンピュータシステム、PCやスマホも含め、各々役割を持ったチップ間のデータ転送によって動いています。このうち、根幹を成す構成部品としてはCPU、メモリ、ストレージ(SSDやハードディスク)があり、例えば、特定のアプリケーションを実行しようとした場合、ストレージに沢山保存されているアプリケーションプログラムやデータの中から、必要なものをメモリにロードし、CPUがメモリからその瞬間に処理すべきコードを逐次読み込み、実行するという階層構造になっています。

つまり、ストレージは動作が遅いけども、プログラムやファイル等のデータを沢山保存できる。メモリはストレージほど沢山データを蓄えることはできないが、ストレージよりも高速に動作します。しかし電源を切ると内容は消えてしまう一時的な作業場のようなものです。CPUは高速にプログラムを実行したりデータを計算したりしますが、その瞬間に扱う位の小さなデータしか保持していられない。
この一連の流れを料理に例えるなら、ストレージは食材を保存しておく冷蔵庫、メモリは食材を調理するためのまな板、CPUはコックさんという感じです。


というわけで、CPU、メモリ、ストレージ間で、階層的なデータのやり取りがあるわけですが、その間には著しい動作速度の差があり、コンピュータシステム全体のパフォーマンスに大きく影響しています。どんなにCPUが高性能でもストレージが遅ければ、そこがボトルネックになってしまうわけです。

で、コンピュータは、これだけではなく、様々な速度差のある半導体の集合から成っており、各々の速度差を緩和しようという仕組みがキャッシュなわけです。具体的には、速度差をある程度、吸収する小さな一時記憶を設けるのです。

で、このキャッシュ。動作の仕方に大きく分けて2つの方式があり、今回はこれをまとめておこうという話です。


1. ライトスルー(Write Through)

データを転送する場合、書き込みと読み込みの2方向が発生します。この方式では、よく読み込まれるデータをより高速な記憶媒体に置き、書き込み方向の動作はキャッシュしません。キャッシュはキャッシュラインという単位で扱われ、一度アクセスがあったデータをキャッシュ領域に保持し、同じデータの読み込みがあったらキャッシュ領域から読み込むことで読み込みを高速化します。しかし、キャッシュ領域はより小さいので、使われないデータほど入れ替わっていきます。この入れ替わり方にもいくつかの方式があるのですが、それはまた今度まとめます。


2.ライトバック(Write Back)

この方式では、ライトスルーの動作に加え、書き込みもキャッシュされます。キャッシュラインに書き込み、どっかのタイミング(実装による)で非同期的に、実際の記憶域に書き込みが行われます。パフォーマンス的にはライトスルーよりも良いのですが、これが結構複雑な問題を生みます。つまり、書き込んだ側は、書き込みが終わったと思って処理を進めますが、書き込まれた側は、一時的に記憶しているだけです。実際の記憶域とのデータに差が生まれます。一対多の通信の場合、別の装置が同じ場所のデータを読み込んだ場合に不整合を処理する機構が必要になったり、(これをコヒーレンシとか言う)実際の記憶域に書き込む前に接続が切れたり、電源が落ちた場合に、データに不整合が生じます。なので、話はライトスルーよりも格段に複雑になり、トラブルも起こりやすいです。


今回は、こんなとこです。あと、インテルチップでライトコンバインとかのキャッシュ動作もあったりします。グラフィック系のデータで、一画面分とか、かなりまとまったデータを扱う場合に有効とかなんとか。次はもうちょっと突っ込んだ話を書きたいと思っています。





7/17/2015

aptコマンド小ネタ

LinuxでUbuntuやLinuxMint、Debian等のaptがパッケージマネージャのディストリビューションで便利なネタのメモ

apt-get update

で、システムに登録されているパッケージ情報を更新し、

apt-get install software-name

とすると、ソフトウェアパッケージをネットからダウンロードしてきてインストールできるわけですが、一字一句違わず正確なパッケージ名が分からないとインストールできないわけです。

そこで、便利なのが、apt-cacheというコマンド

apt-cache search keyword

とすると、その文字列を含むパッケージ名を検索できます。また、何かコードを書いて、ビルドしようとしたり、サンプルソースコードをビルドしようとしてヘッダーやライブラリが無くてエラーということはよくある話です。そんな時は、apt-fileが便利です。

apt-file update
apt-file search "file-name"

とやると、そのファイルが含まれるパッケージが検索できます。


あと、ディスク容量を節約するのに以下が役に立ちます。

apt-get clean

とすると、過去にインストールするためにダウンロードされたパッケージのキャッシュをクリアできます。一度インストールしてしまえば、再インストールするとき意外、不要なので、積極的にクリアしても問題ないです。再インストールするときは、キャッシュが無ければ再ダウンロードされるだけで、同じパッケージを何回もインストールし直すこと自体あまり無いことなので、このキャッシュが活躍することはあまり無いと思われます。

それから

apt-get auto-remove

とやると、使われていないパッケージを一括削除できます。aptパッケージマネージャでは、一つのアプリケーションをインストールする際、そのアプリケーションを動作させるのに必要な依存パッケージを芋づる式にインストールしてくれて便利なのですが、パッケージを削除したり更新したりしていると、そうした芋づるインストールされたパッケージが、実は今はもう使っていないということがよくあります。ですが、自動的にインストールされたものは何に使われているのか判断が難しいという問題があり、このコマンドがそのあたりをうまいことやってくれます。



今回はこのへんで。


5/15/2015

Ubuntu 15.04でAndroid開発環境を構築してみる。

というわけで、やってみた手順をまとめておく


  1. JDKはOracleのやつを使う。Oracleからダウンロードすやるやつはdebパッケージになってなくて、既存のパッケージとの競合解決がめんどくさいので、今回はppaリポジトリから。
  2. sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    sudo apt-get install oracle-java7-installer
  3. そろそろEclipse離れしてみようかと、Android SDK Tool Only + Intellij CEを試してみたところ、結構いい感じで開発できそうだが、Android開発メインならサンプルコードのダウンロード機能やAndroid SDKが統合されて至れり尽くせりなAndroid Studioの方がやっぱ便利っぽい感触。(https://developer.android.com/sdk/index.html)。ダウンロードしてandroid-studio/bin/studio.shで起動。ここで、ハマりポイント。適当にサンプルとかをビルドするとaaptがエラーという旨が。ファイルはあるのに、実行ができない事態。これが、32bitバイナリで64bit版Linuxだと実行できないことが判明。で、Andorid Studioのページよく見たら書いてあった。(https://developer.android.com/sdk/installing/index.html?pkg=studio) ia32-libs, lib32ncurses5-dev, lib32stdc++6 をインストールせよと。
  4.  sudo apt-get install ia32-libs lib32ncurses5-dev lib32stdc++6 
    だが、しかし、ia32-libsは古いパッケージでUbuntu15.04では廃止っぽい。これなしでも、なんだか実行できるようになったが、過去にインストールしたパッケージで、なんかしんないけど解決できてるだけかもです。 あと、Android Studioだと、adbが一緒にインストールされてる気配だったが、一応Ubuntuでもandroid-tools-adbパッケージがある。
  5. で、USBで繋いだ実機にデプロイするには、端末繋いでlsusbしてみてベンダーIDを確認。
  6. $ lsusb 
    Bus 001 Device 005: ID 2019:ed17 PLANEX GW-USValue-EZ 802.11n Wireless Adapter [Realtek RTL8188CUS]
    Bus 001 Device 006: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)
    Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
    Bus 001 Device 003: ID 0bda:57b5 Realtek Semiconductor Corp. 
    Bus 001 Device 002: ID 8087:07e6 Intel Corp. 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  7. /etc/udev/rules.d/50-android.rulesを作成して、以下を追加。18d1のところは端末のベンダーID。別の端末を複数登録するにはこのファイルに追記すればいいはず。
  8. SUBSYSTEM=="usb",SYSFS{idVendor}=="18d1",MODE="0666"
とりあえず、こんな感じで、開発進められるかなー。

5/13/2015

Asus x205taにUbuntu14.04LTSをインストール

Asus x205taがコスパが良くUbuntuマシンにしようと思って買ったもののBay trailのPCはすんなりとはインストールできないとわかって、Windowsで我慢してたが、重い腰を上げてチャレンジ。

問題は、BIOSが32bit UEFIでレガシBIOS互換モジュール無しなところ。
つまり32bit UEFIブートしかできない。がしかし、Ubuntuを含め、32bit版のインストールディスクではUEFIブートをサポートしていない。(というか、Linuxカーネルが32bitでUEFIをサポートしない方針っぽい)64bitのインストールディスクは64bitUEFIブートしかサポートしていない。というめんどくさいことになっているのです。Linuxサイドでは、64bit CPUにわざわざ32bit UEFIを使うなんてことが想定外なのでしょう。

Bay trailは64bitでも動くのだが、このマシンを含め、最近の低価格タブレットのマシンでは、なぜか、32bit UEFIを実装している。インテルさんの都合か、BIOSベンダーさんの都合か、大した理由などないのか、まあいいや。

一日こねくりまわして、何とかできたので手順をざっくりまとめておく。


1. Ubuntu14.04の64bit版インストールディスクをダウンロードする。
    http://www.ubuntu.com/download/desktop

2. Universal USB Installerをダウンロードする。(Windowsで作業する場合。別のLinuxマシンがある人はddとかで。)
    http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/

3. Universal USB Installerを使って、USBメモリにUbuntuのインストールディスクを書き込む。

4. bootia32.efiをダウンロード。32bitUEFIブートしてGrubを起動させるためのEFIアプリケーション。自力でビルドすることもできそうだが、せっかくなので、実績ある有志の成果物を使わせて頂く。
    https://github.com/jfwells/linux-asus-t100ta/blob/master/boot/bootia32.efi
    (ちなみに、LinuxMintやUbuntu14.10、Ubuntu15.04のインストールディスクももこいつで起動できた)

5. USBに書き込んだインストールディスクの中の「/EFI/BOOT/」ディレクトリにbootia32.efiをコピー。

6. x205ta側の設定。起動時に「f2」キーを押してBIOS設定画面に入り、Security->Secure Boot Menu->Secure Boot ControlをDisableに。いわゆるセキュアブートを無効にする。あと、Advanced->USB Configuration->USB Controller SelectをEHCIにしておいたほうが無難なようだ。あと、内臓Wifiが使えないので、USBのWifiアダプタをつけとく。

7. USB刺して、再起動。起動時に「esc」キーで、ブートデバイス選択画面に入って、「UEFI: USB MassStorage Device」を選択。USBから起動。

8. Ubuntuを普通にインストールして、再起動。だが、このままでは起動してくれない。というのも、64bitのインストールディスクは64bitUEFIマシンを想定していて32bitUEFIブート用のGrubをインストールしてくれないから。なので、まずは、USBインストールディスクのGrubでマシンにインストールされたUbuntuを立ち上げるという方法を採る。USBインストールディスクからマシンを起動Grubメニューで「c」キーを押し、Grubのコマンドラインに入り、以下を入力

$ linux (hd1,gpt2)/boot/vmlinuz-3.13-0-52-generic root=/dev/mmcblk0p2 reboot=pci,force
$ initrd (hd1,gpt2)/boot/initrd-3.13-0-52-generic 
$ boot

めでたく起動したら、32bit UEFIブートを何とかする。ネットを見て回っていると、grubのソースをビルドしてバイナリ作ってインストールという方法を取っている記事を見かけることが多かったが、パッケージで何とかしてみる。「grub-efi-ia32」をインストール。

$ sudo apt-get install grub-efi-ia32

で、たぶん、本来これだけでいいっぽいのだが、これのインストール中に「efibootmgr」が実行され、EFIのバリアブルにブートローダーを登録するのに失敗している。というか、EFIバリアブルにアクセスできてなさそうな感じ。「Try modprobe efivars」とでるが、やっても駄目だった。これはカーネルモジュールの問題なのか、UEFIが32bitだからなのか、原因不明。とは言え、モノはそろっているし、そもそもファイル名だけの話っぽいので、さしあたって、今回はファイル入れ替え作戦で回避

$ cd /boot/efi/EFI/ubuntu
$ sudo cp grubx64.efi grubx64.efi.bak
$ sudo cp grubia32.efi grubx64.efi

ちょっとスマートではないが、他にいい方法思いついたらまた試してみる。恐らく、何らかの方法でEFIバリアブルに、grubia32.efiを登録できればいいと思われる。不思議なのは、どこかの段階で、ubuntu/grubx64.efiは登録されているということ。

なので、この環境で、手順さえ踏めば行ける気がするのだが。(これをやる前に、15.04のインストールを試みたので、その名残の可能性もある) 

追記:その後、改めてUbuntu15.04のインストールを試したところ、Ubuntuのインストール途中で、grub-efi-amd64-signedのエラーでクラッシュ。これを無視して、USBから起動させ、apt-get install grub-efi-ia32したところ、efivarsに関する問題も出ず。

ファイル入れ替えはせずに普通に起動。インストーラがクラッシュしているので、なんか気持ち悪いが、使えるには使えそうな感触。逆に言えば、15.04のカーネルか、efibootmgrあたりで問題が修正されているのかもしれない。 で、再起動。試行錯誤したなかで、上手く行った部分だけ、まとめるとこんな感じ。手順抜けてる可能性もあります。この通りやっても上手く行かないこともあるかも。そしたら、連絡ください。試行錯誤思い出します。以下のページが非常に参考になりました。先人の知恵に感謝致します。


http://brownbro.github.io/blog/2015/01/15/asus-x205ta-with-lubuntu/ http://sturmflut.github.io/linux/ubuntu/2015/01/21/installing-ubuntu-15.04-on-baytrail-tablets/ http://www.geocities.jp/cowfish_lactoria/mstick1-euc.html http://orumin.blogspot.jp/2013/01/grubefi.html