FLYING

/* TODO: 気の利いた説明を書く */

巨大なファイル郡をaddしてしまったとき

サブディレクトリに数百MB単位のバイナリファイル郡があるディレクトリで,バイナリファイルについては.gitignoreに指定することでバージョン管理対象外としてリポジトリの肥大化を防いでいたという状況で,なんとはなしにディレクトリ構成を変更して,いつものように

$ git add -A .

などとしたところ,コミット対象にバイナリファイル郡が大量に追加されてしまったので慌てて

$ git reset --mixed

とした。
このときはこの対処で問題は回避されたと思い,しばらくリポジトリを運用していたのだけど,この前

$ df -h

を実行したら当該ディレクトリの合計ファイル容量が予想のおよそ倍になっていることに気が付いた。
当該ディレクトリ以下で大量に容量を消費しているファイルを調べてみたところ,.git/objects以下のファイルが数GBの容量を消費していることが判明。
先に結論を言うと,かつてaddしてしまったバイナリファイル群がgitのオブジェクトとして生き続けていて,これだけのストレージを消費していたのだった。
というわけで,

$ git fsck

を実行して,いくつかのblobオブジェクトがdangling状態(既存のコミットから辿ることのできないオブジェクト)となっていることを確認。
他のユーザーがリポジトリの編集をしていないことを確認した上で(まあ,今回のケースでは一人用リポジトリだから確認する必要もないのだけども)下記のコマンドを実行。

$ git prune

改めてdfコマンドを実行すると,ほぼ予想通りの容量となっていたので,めでたしめでたし,でした。

VPSのスペックアップ記録

10月18日に申し込んでいたServersMan@VPSのスペックアップ実施メールが来た。

以下の日程でスペックアップ作業を実施いたします。

[ スペックアップ日程 ]
----------------------------------------------------------------------
・変更作業日時         : 2013年10月31日 11時00分 〜 18時00分
・対象IPアドレス(IPv4) : *.*.*.*
・対象IPアドレス(IPv6) : *:*:*:*:*:*:*:*

比較のために現状の容量をチェックした。

$ df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/simfs             10G  5.2G  4.9G  52% /
none                  512M  4.0K  512M   1% /dev
$ cat /proc/meminfo
MemTotal:      1048576 kB
MemFree:        603404 kB
Buffers:             0 kB
Cached:              0 kB
SwapCached:          0 kB
Active:              0 kB
Inactive:            0 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      1048576 kB
LowFree:        603404 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:           0 kB
Mapped:              0 kB
Slab:                0 kB
PageTables:          0 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:         0 kB
Committed_AS:        0 kB
VmallocTotal:        0 kB
VmallocUsed:         0 kB
VmallocChunk:        0 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

スペックアップが完了したようなので,もう一度同じコマンドを実行。

$ df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/simfs             50G  5.3G   45G  11% /
none                  512M  4.0K  512M   1% /dev
$ cat /proc/meminfo
MemTotal:      2097152 kB
MemFree:       1673036 kB
Buffers:             0 kB
Cached:              0 kB
SwapCached:          0 kB
Active:              0 kB
Inactive:            0 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      2097152 kB
LowFree:       1673036 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:           0 kB
Mapped:              0 kB
Slab:                0 kB
PageTables:          0 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:         0 kB
Committed_AS:        0 kB
VmallocTotal:        0 kB
VmallocUsed:         0 kB
VmallocChunk:        0 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

予告通りでした。心なしがレスポンスが早くなったような気もする。

おサイフケータイが便利

SO-04E feat. Hatsune Miku*1を今メイン端末として使用中なのだけど、せっかくAndroidなんだしガラパゴス端末なんだしってことでおサイフケータイを使ってみることにした。結論から言うと、便利。難点がないわけではないが、改札やコンビニの支払いなどで財布からSuicaを出したり小銭を出したりしなくていいのは、私のようなコミュ障にとって快適。
グローバル端末が持て囃されていたころにはガラパゴス端末は無駄に機能が多くて不安定だし……と敬遠していたが、現行のXperiaについてはそれほどストレスなく使えると思う。ガラパゴスな環境に住んでいる以上、ガラパゴスな端末が使いやすいのは自明の理。ただし、ドコモ端末にプリインストールされているアプリはPalette UIを含めておおよそ害悪でしかないので、早急に撤廃するか初期設定でユーザーにインストールの有無を選ばせるなりさせてほしい。
(唐突に話を戻す)公共交通系で使えることと、使用範囲が広いことを理由に今はEdyモバイルSuicaをおさいふケータイとして運用している。

メリット

  • スマホ1台でコンビニや公共交通の支払い・出入りが自由にできる
  • 残高照会とチャージがどこでもできるので、改札でピコーン(バタン)ってならない
  • おサイフケータイを使えないiPhoneユーザーを煽ることができる

デメリット

  • スマホのバッテリーが完全に切れると使用不能になる*2
  • モバイルSuicaだと学割付きの定期券を購入するのが面倒*3
  • 申し込みにクレジットカードがおおよそ必須*4

Edyの導入

「おさいふケータイ」のアプリからEdyを選ぶと、楽天のサイトに飛ばされるので、そこでサービス登録を行う。登録が完了したら、Edyアプリをダウンロードすればチャージなどもそこからできる。楽天IDに紐付いている楽天カードがあったので、このあたりの入力は比較的楽にできた。

モバイルSuicaの導入

VIEW系のクレジットカード以外で登録すると年会費1000円が掛かってしまうので、ビックカメラSuicaカードを新しく取得した。このカードの場合、カード自体の年会費は、1度でもクレジットカード決済をすれば免除されるので、ほぼ年会費なしと言って差し支えない。
カード取得のため、まずはオンラインでカード申し込みをして、引き落とし口座などの情報を所定の用紙(PDFがダウンロードできるので、自宅やコンビニのプリンタで印刷する)に記入して郵送する。これが10月4日頃。12日頃に1度本人確認の電話が来て(何を答えたのかは忘れたが、大した内容ではなかったと思う)、18日頃にカードが到着した。申し込みからおおよそ2週間程度、と考えておけば間違いないと思われる。
おサイフケータイ」のアプリからモバイルSuicaを選ぶと、Suicaのサイトに飛ばされてモバイルSuicaアプリのインストールを求められるので、指示に従いインストール。インストール後、アプリを起動するとモバイルSuicaのサービス登録が始まる。ここで取得したVIEWカードのクレジットカードを入力する。サービス登録の段階で1度だけ、既存のSuicaカード定期券をモバイルSuicaに移行できるチャンスが与えられるので、移行したい場合は忘れずに手続きを済ませる。
注意点としては、モバイルSuicaの利用(定期圏内での定期利用を除く)は、サービス登録の翌日午前5時以降に、モバイルSuicaアプリを1回起動した後でないとできないこと。また、アカウントのパスワードを忘れて再発行をする場合は、メールに記載されているリンクからモバイルSuicaアプリを起動することになるが、このときモバイルSuicaアプリを事前に完全終了させておかないと再発行ができない。

使い勝手

EdyにせよモバイルSuicaにせよ、基本的な機能は抑えられているので利用に支障はない。支障はないが、モバイルSuicaアプリのUIはひどい。学割定期券の購入時に「証明書のコピーを郵送しろ」と言い放つ姿勢もどうかと思う(みどりの窓口などでできるようにしてほしい)。今どき、アカウントのパスワードが8文字以下なのもいかにも、という感じがする。

上記がモバイルSuicaアプリのUIなのだけど、見ての通り、明らかにガラケー自体のウェブインターフェイスをそのまま使用している。操作をする度にプログレスダイアログが何度も画面上で点滅するので、挙動不審に見えるのもよくない。お金を扱うアプリなので、正常動作しているのか不安になる。
オートチャージのタイミングについては、Edyの場合はアプリが1時間に1度残高をチェックしてチャージ処理を行うようだ。モバイルSuicaの場合、改札の入場時にオートチャージが行われるらしい。公共交通を使わない日はオートチャージされない、と考えると微妙。

*1:在庫があちこちで余っているらしくて悲しみががある

*2:電源なしで動作するFeliCaカードとは微妙に動作原理が異なるらしい

*3:所定の用紙と学割証明書のコピーをサービスセンターに送付する必要がある

*4:ものによっては銀行でもチャージできるらしいが、あまり意味がないと思う

Windowsで文字化けしない.zip

OSX上のフォルダをzipにするようなケースを考えています。

brew install convmv # これは初回のみ
convmv -r 圧縮するフォルダ名 -f utf8 -t cp932 --notest
# 変換後のフォルダ名はFinderからだと「%xx%xx%xx〜」という見え方になる
zip -r 出力先ファイル名.zip 圧縮するフォルダ名 # 圧縮するフォルダ名は変換後のものを指定する

追記

上記の方法でうまくいく環境もあれば,逆効果になる環境もあるようなので,条件を調査中です。

ある工業高校のカリキュラムをまとめる

高専での情報工学のカリキュラムについて書かれた記事が話題なので,自身の母校である工業高校の(情報分野の)カリキュラムについてまとめてみようと思います。ここで言う工業高校は「東京工業大学附属科学技術高等学校」(以下,「附属高校」とする)です。附属高校在学時の3年間をベースにカリキュラムや体験したアレコレを紹介します。

これは,2006年〜2009年に在学していた私が2013年に自身の記憶・記録を元に書いているものなので,現在のカリキュラムや制度と異なる内容が含まれている可能性があります。ご了承の上お読みください。

附属高校とは

まず,附属高校自体があまり有名ではないと思うので簡単に説明すると,東工大に附属する国内唯一の国立工業高校です。JR田町駅の芝浦口を降りてすぐそばに校舎があるため,山手線や京浜東北線の乗車中に看板を目にすることもあると思います。
工業高校なので,卒業まではストレートに行けば3年間,カリキュラムは工業に関する科目が中心となります。附属高校以外の工業高校については事情を知らないのですが,少なくとも附属高校では,卒業生は理系大学に進学するケースがほとんどであり,大学受験のために一般教養に相当する科目(現代文・古典・世界史等)の授業もそれなりに受けました*1。また,一般高校で受けるような「家庭科」「美術・音楽」「体育」などの科目も普通にありました*2
カリキュラムは1年次と2年次以降で別れており,2年次以降は5つある「分野」のいずれかに所属し,分野専門の授業を中心に受講することになります。分野は大雑把に言うと「応用化学」「機械」「情報」「電気電子」「建築」の5つで,私は情報分野*3に所属していました。
附属高校の生徒全員が東工大に進学できるわけではありませんが,3年次までにそれなりの成績(学年で1〜50位)を収めていれば,3日間を通じて行われる大学側主催の特別推薦選考会*4に参加することができ,そこで東工大の教授の目に留まった約10人がエスカレーターで東工大に入学できる制度(高大連携特別選抜)があります。

1年次のカリキュラム

専門科目としては以下のものがありました。下記のどの科目においても,基本的にテキストは高校オリジナルのものを使います。

科学技術基礎

2年次以降の分野所属を見据え,各分野の専門科目の「さわり」を体験する科目です。1年間を掛けて5分野の導入的な内容を学びます。
課題の例としてはたとえば……

  • 応用科学分野:中和滴定の実験
  • 機械分野:往復スライダクランク機構の模型を制作
  • 電気電子分野:ダイオードによる全波整流回路の実験
  • 建築分野:製図器による作図・相貫体模型を制作
情報技術基礎

多くの大学で行われているであろう「コンピュータ・リテラシー」に相当する科目です。ただし,使用するパソコンのOSがVine Linuxだったりするあたりが少し独特です(ここ数年はUbuntuを使っているとのこと)。内容的にはHTMLでのコーディングを学んだり,C言語の簡単な課題を順番に解いたりします。
課題の例としてはたとえば……

  • Hello, World
  • 半径を入力して球の体積を表示するプログラム
  • 二次方程式をプログラムで解く
  • 配列のソート
数理基礎

通常の高校数学と並行して数理基礎という科目を受講します。専門科目で使う数学を天下り的にインストールするための科目なので,いきなり三角関数や常用対数複素数などをバリバリ使います。

人と技術

技術者倫理の科目です。個人的にあまり思い入れはないので省略。

2年次のカリキュラム

2年次以降は,分野ごとの専門科目を受けることになります。やはりテキストはすべてオリジナルでした。今思うと,プログラミングなんかは普通に市販のテキストを使ったほうがいいのでは……という気はします。
以下は私が所属していた情報分野における専門科目の説明になります。

科学技術

週に3〜4コマを使って実験し,翌週までにレポート提出。これを延々と繰り返す科目です。現役当時は毎週提出日の前日に徹夜していた気がします。
課題の例としてはたとえば……

  • RLC直列回路の実験
  • トランジスタの静特性を調べる
  • ライントレーサーの制作
  • xlibでGUIプログラミング

個人的には,ライントレーサーの制作が毎日居残りして取り組む程度には楽しかったです。いきなりライントレーサーの回路を設計するほどの知識は2年次の生徒にはないので,たたき台として与えられた回路をもとに,PICのプログラミングをして,独自に工夫したライントレーサーを制作しようという課題でした。

ハードウェア技術

オームの法則キルヒホッフの法則に始まる電気回路の基礎を学び,最終的には抵抗・コイル・コンデンサトランジスタを使った簡単な増幅回路の設計を目指します。ハードウェアなだけにハードで,挫折した同期が多かったような気がします。
課題の例としてはたとえば……

ひとりじゃなかなか達成できない感じの課題が出されるので,クラス内で相談して悩んでボーダーをクリアする,RPG感覚の楽しさがありました。当時はクラス用のWikiを開設し,授業ノート的なものを投稿するなどしていました。

プログラミング技術

1年次の情報技術基礎をグレードアップした内容で,より高度なプログラミングの問題をC言語で解いていきます。情報技術基礎がC言語を書けるようにするための科目,プログラミング技術がC言語を実用するための科目,と言った感じです。
課題の例としてはたとえば……

3年次のカリキュラム

2年次から継続するハードウェア技術やプログラミング技術と並行して,下記の科目がありました。

ソフトウェア技術

プログラミング技術でカバーされなかった,Unixコマンドの使い方,パイプの仕組み,ネットワークプログラミングなどを扱う科目です。
課題の例としてはたとえば……

  • awkによるファイル処理
  • ls,grep,wc,tr,sedなどのコマンドの使い方
  • ネットワークプログラミング
課題研究

一応,附属高校が目玉にしているところの科目で,3年次にグループで課題を設定し,数ヶ月を掛けて研究・発表します。
課題の例としてはたとえば……

これに関しては,個人の開発能力だったり,マネジメント能力だったりが問われるので,内容面では大学でやるような卒業研究にはもちろん及ばないものの,経験としてはだいぶ役に立ったかなという気がします。

その他

3年次の3学期に,進路が決まった生徒向けに「数学さきがけ」という講義が開講されていて,そこで俗に「ピンク本」と呼ばれる600ページ以上ある謎の教科書を使いました。これは,当時の数学の先生が執筆したオリジナルのテキストで,大学で学ぶ数学・物理・化学の内容の一部を先取りして,高校生向けの噛み砕いた文体で解説したものです。
ピンク本の内容は,実際に大学に入ってしまえば(進度が早いので)1ヶ月程度で流されてしまう程度の分量ではあるのですが,その詳細かつ直感的な解説から感じられる教育への気迫に在学中は驚いたものでした。
もう1点,特殊なカリキュラムということで覚えているのが,3年次に受けた「数C・Lisp」という謎授業のことです。何故か密室でLispを学んだだけで数Cの単位がもらえました。

コンピュータ愛好会

本筋とは外れるんですが,自分語りをするなら外せないんで書きます。
2年次に,当時のハードウェアの先生が顧問をしているコンピュータ愛好会という怪しげな愛好会に誘われまして,卒業するまでそこでガサゴソと活動していました。
活動の内容としては,下記のようなものがありました。

個人的には,ここで一緒に活動した先輩だったり,コンテスト出場の履歴だったりがその後の進学やら何やらに影響してきた気がするので,こういう場があったことは幸運でした。
情報工学を志す高校生であれば,この手の活動を経験しておいて損はないと思います。

学校の雰囲気

1年次はすべての分野の生徒が同じクラスになるので,多少は女子も居るし,そこまで普通高校と違うようには感じませんでした*5
ただ,2年次になって情報分野に所属すると,そこには「パソコン部」という単語でイメージするような類の(平たく言えばオタクっぽい)人間がたくさん居て,中二病をこじらせつつあった私には居心地がよかったです。それ故に,女子はクラスにひとりしか居ませんでしたし,一般的な高校生活を送りたい人には向かない雰囲気だと思いました*6
一方で,たとえば化学分野だと勉強熱心な進学校のような雰囲気があったり(特に受験期),建築分野は普通の高校に近い人種が生息していたりと,分野による空気の違いはかなりありました。
基本的に校則と言えるものはほとんどなく,制服もなければ行動範囲の制限もない,かなり自由な校風だったと思います。たとえば,教室にXBOX360を置いて放課後にプレイしている一団が居ましたが,特に没収されたりはしていませんでした。

高専との違いは?

ここまでのカリキュラムの例を見てもわかる通り,附属高校のカリキュラムは,基礎から座学で積み重ねる「体系的」なものと言うよりは,実験から入る「実際的」なものだったように思います。授業で使うテキストも,ほとんどが学校オリジナルのものだったので,授業内容にマッチしている反面,体系的に学ぶという点では市販のものの方が優れていると思います。
また,高専が5年間の課程であるのに対し,附属高校は3年間の課程です。なので,いかに工業に偏重しているとは言っても,3年間で高専と同等の知識が身に付くわけではありません。高校での3年間に加え,理系大学に進学して情報工学を数年学んでやっと,「実際的」な知識と「体系的」な知識を結び付けることができるのではないかと思います。

附属高校に行けば技術が身に付く?

元々工業系の科目に興味があって,「是非この分野に所属したい!」という思いがある人であれば,おそらく掛けた時間相応のリターンはあるのではないかと思います。それは,高専であろうと工業高校であろうと同じかもしれません。
逆に,とりあえず的に附属高校に入っても,カリキュラムが肌に合わなかったり,そこにいる人種が苦手だったりすると,不幸なまま3年間を終えることにもなりかねません。特に,附属高校に推薦入試で入学する生徒は,入試の段階で所属する分野を決めなければならない*7ので,なおさらリスクは高いと思われます。

こんな人にお薦めの附属高校

  • 普通の高校生活を送れる気がしない人(同類が比較的多いです)
  • あわよくば東工大に行きたい人(特別選抜が狙えます)
  • 工業系に進みたい人,分野がバッチリ決まってる人(たぶん高専でもOKです)

*1:世界史の授業ではインド史ばかり無駄に詳しく習ったので,普通ではなかったかもしれない

*2:音楽では右翼話で洗脳されたし,体育では無駄にたくさんのレポートを課されたりしたので,やっぱり普通ではなかったかもしれない

*3:正式名称は「情報・コンピュータサイエンス分野」

*4:サマー・チャレンジと呼ばれる

*5:「嘘だろ」という指摘が後輩から入ったので,あんまり普通ではなかったかもしれない

*6:実際,普通に高校生になりたかったという同級生の発言を何度か見聞きした

*7:一般受験生なら科学技術基礎をひと通り体験した後に決められる

html5slidesでプレゼン

tondol/PresentationTemplate · GitHub

Googleのhtml5slidesを使ってスライドを作る機会があったので,テンプレート化してgithubにアップロードした。
CSSを少しカスタマイズして,数式を埋め込むためのjsを追加している。
このテンプレートを使うと,インラインで次のようにして数式を埋め込むことができる。

<article>
	<h3>
		Slide#2 Title
	</h3>
	<ul>
		<li>
			<strong>数式</strong>を挿入するサンプル.
			<ul>
				<li id="formula-1"></li>
				<li id="formula-2"></li>
			</ul>
		</li>
		<li>
			文章の途中にインラインで
			<span id="formula-3"></span>
			挿入することもできる.
		</li>
	</ul>
	<script>
		$("#formula-1").append(TexUtil.create(TexUtil.heredoc(function () {/*
f(t)=\frac{1}{2\pi}\int_{-\infty}^{\infty}F(\Omega)e^{j \Omega t}d\Omega
*/}), 48));
		$("#formula-2").append(TexUtil.create(TexUtil.heredoc(function () {/*
F(\Omega)=\int_{-\infty}^{\infty}f(t)e^{-j \Omega t}dt
*/}), 48));
		$("#formula-3").append(TexUtil.create(TexUtil.heredoc(function () {/*
e^{i\theta}=\cos\theta+i\sin\theta
*/}), 30));
	<script>
</article>

これで次のような結果が得られる。

jsでヒアドキュメントを実現する方法については末尾のリンクを参照のこと。

追記(2013-07-09T23:42:00+09:00頃)

texutil.jsの仕様を変更し,サンプルも併せて書き換えた

Android Studioで外部ライブラリを使うアプリを実行する

Googleから新しいAndroidアプリ開発用IDEであるAndroid Studioが発表されましたね!UIもカッコイイし,モッサリ動くEclipse環境から移行したら幸せになれるんじゃないか?という予感がひしひしとします。そこで,サンプルレベルのアプリを試しにAndroid Studioで作って動かしてみました。

……しかしながら,まだEarly Access Preview版とのことなんで,少し込み入ったアプリを作ろうとするとうまくいきません。Android Studioの導入後,数時間ほどStack Overflowを読みながら格闘した結果,なんとか外部ライブラリ(.jarや.soなどのファイルを必要とするもの)を使うアプリをコンパイル・実行することに成功したので,途中でハマったポイントを紹介します。なお,ここで対象にしているバージョンはVersion 0.1のMac版なので,他のプラットフォームだと同じ手順を踏んでもうまくいかないかもしれません。

Androidプロジェクトの作成

テキトーに「Test」みたいな名前で作成すればいいと思います。こちらのエントリなどが参考になります。

Javaライブラリ(.jarファイル)の導入

Eclipse環境と同様に,libsディレクトリに必要なjarをどんどん突っ込んでいく前提で解説します。

例えば「Test」と言う名前のプロジェクトを作成すると,上図のようなファイルツリーが生成されます。Test/Test以下にlibsというディレクトリがあるので,ここに必要なjarファイルをコピーしてください。

続いてメニューバーの「File」→「Project Structure」を開き,左側のカラムで「Libraries」を選択します。ウィンドウ上部の+ボタンを押してJavaを選択すると,ファイルツリーが表示されるので,先ほどのlibsディレクトリを選択してOKします。Moduleとして追加する対象のプロジェクトを選べと言われるので,「Test-Test」を選択してOKします。なお,元々あったLibraryは(libsディレクトリ全体をLibraryとして追加したので)消してしまって構いません。


LibrariesとModulesの項目が上図のようになっていればOKです。OKを押してProject Structureの画面を閉じましょう。

これだけだとビルド時にエラーが出るので,ビルド構成ファイルであるbuild.gradleを直接編集します。ファイルツリーにbuild.gradleが2つあると思いますが,Test/Test以下にある方のbuild.gradleを次のように編集してください。

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

デフォルトから変更したのはdependenciesの項目で,libsディレクトリ以下のjarファイルをすべて依存ファイルに含めるようにしています。

ネイティブライブラリ(.soファイル)の導入

上図のように,libsディレクトリ以下に各アーキテクチャ用のディレクトリを作り,soファイルを突っ込みます。Eclipse環境だとこれだけでOKですが,Android Studioではちょっとしたハックが必要です。先ほど編集したbuild.gradleを再度開き,次の記述を追加します。

// https://gist.github.com/khernyo/4226923
task copyNativeLibs(type: Copy) {
    from('libs') { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
    pkgTask -> pkgTask.jniDir(new File(buildDir, 'native-libs'))
}
clean.dependsOn 'cleanCopyNativeLibs'

Gradle Android configuration with .so hackで紹介されているハックほぼそのままです(変更されているクラス名の部分のみ編集しました)。まだあまり理解していないためにふわっとした解説しかできないのですが,libsディレクトリ以下の.soファイルを専用のディレクトリにコピーし,コピー先のディレクトリをjniのバイナリがあるディレクトリとして指定しているようですね。

cleanする(大事)

以上で設定は完了ですが,このまま実行しても手元の環境では実行時のNoClassDefFoundErrorが解消しませんでした。これを解消するには,コマンドラインからcleanを実行する必要があります。ターミナルを開き,次のようにしてcleanを実行してください。

$ cd ~/AndroidStudioProjects/Test
$ ./gradlew clean
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.
:Test:cleanCopyNativeLibs UP-TO-DATE
:Test:clean

BUILD SUCCESSFUL

Total time: 10.427 secs

ここまで済んだら,Android Studioから「Run」を選んで実機で実行してみてください。無事アプリが動作すれば完了です。