巨大なファイル郡を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をおさいふケータイとして運用している。
メリット
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の場合、改札の入場時にオートチャージが行われるらしい。公共交通を使わない日はオートチャージされない、と考えると微妙。
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コマを使って実験し,翌週までにレポート提出。これを延々と繰り返す科目です。現役当時は毎週提出日の前日に徹夜していた気がします。
課題の例としてはたとえば……
個人的には,ライントレーサーの制作が毎日居残りして取り組む程度には楽しかったです。いきなりライントレーサーの回路を設計するほどの知識は2年次の生徒にはないので,たたき台として与えられた回路をもとに,PICのプログラミングをして,独自に工夫したライントレーサーを制作しようという課題でした。
3年次のカリキュラム
2年次から継続するハードウェア技術やプログラミング技術と並行して,下記の科目がありました。
ソフトウェア技術
プログラミング技術でカバーされなかった,Unixコマンドの使い方,パイプの仕組み,ネットワークプログラミングなどを扱う科目です。
課題の例としてはたとえば……
課題研究
一応,附属高校が目玉にしているところの科目で,3年次にグループで課題を設定し,数ヶ月を掛けて研究・発表します。
課題の例としてはたとえば……
- フーリエ変換による音声認識
- 独自言語インタプリタの制作
- マルチプラットフォームファイル共有ソフトの制作
これに関しては,個人の開発能力だったり,マネジメント能力だったりが問われるので,内容面では大学でやるような卒業研究にはもちろん及ばないものの,経験としてはだいぶ役に立ったかなという気がします。
その他
3年次の3学期に,進路が決まった生徒向けに「数学さきがけ」という講義が開講されていて,そこで俗に「ピンク本」と呼ばれる600ページ以上ある謎の教科書を使いました。これは,当時の数学の先生が執筆したオリジナルのテキストで,大学で学ぶ数学・物理・化学の内容の一部を先取りして,高校生向けの噛み砕いた文体で解説したものです。
ピンク本の内容は,実際に大学に入ってしまえば(進度が早いので)1ヶ月程度で流されてしまう程度の分量ではあるのですが,その詳細かつ直感的な解説から感じられる教育への気迫に在学中は驚いたものでした。
もう1点,特殊なカリキュラムということで覚えているのが,3年次に受けた「数C・Lisp」という謎授業のことです。何故か密室でLispを学んだだけで数Cの単位がもらえました。
コンピュータ愛好会
本筋とは外れるんですが,自分語りをするなら外せないんで書きます。
2年次に,当時のハードウェアの先生が顧問をしているコンピュータ愛好会という怪しげな愛好会に誘われまして,卒業するまでそこでガサゴソと活動していました。
活動の内容としては,下記のようなものがありました。
- IPAの情報処理技術者試験を受験する
- (情報処理技術者試験の試験勉強を兼ねて)IT・簿記選手権大会という高校生向けの大会に出場する
- 高校生向けのプログラミングコンテストに出場する
個人的には,ここで一緒に活動した先輩だったり,コンテスト出場の履歴だったりがその後の進学やら何やらに影響してきた気がするので,こういう場があったことは幸運でした。
情報工学を志す高校生であれば,この手の活動を経験しておいて損はないと思います。
学校の雰囲気
1年次はすべての分野の生徒が同じクラスになるので,多少は女子も居るし,そこまで普通高校と違うようには感じませんでした*5。
ただ,2年次になって情報分野に所属すると,そこには「パソコン部」という単語でイメージするような類の(平たく言えばオタクっぽい)人間がたくさん居て,中二病をこじらせつつあった私には居心地がよかったです。それ故に,女子はクラスにひとりしか居ませんでしたし,一般的な高校生活を送りたい人には向かない雰囲気だと思いました*6。
一方で,たとえば化学分野だと勉強熱心な進学校のような雰囲気があったり(特に受験期),建築分野は普通の高校に近い人種が生息していたりと,分野による空気の違いはかなりありました。
基本的に校則と言えるものはほとんどなく,制服もなければ行動範囲の制限もない,かなり自由な校風だったと思います。たとえば,教室にXBOX360を置いて放課後にプレイしている一団が居ましたが,特に没収されたりはしていませんでした。
高専との違いは?
ここまでのカリキュラムの例を見てもわかる通り,附属高校のカリキュラムは,基礎から座学で積み重ねる「体系的」なものと言うよりは,実験から入る「実際的」なものだったように思います。授業で使うテキストも,ほとんどが学校オリジナルのものだったので,授業内容にマッチしている反面,体系的に学ぶという点では市販のものの方が優れていると思います。
また,高専が5年間の課程であるのに対し,附属高校は3年間の課程です。なので,いかに工業に偏重しているとは言っても,3年間で高専と同等の知識が身に付くわけではありません。高校での3年間に加え,理系大学に進学して情報工学を数年学んでやっと,「実際的」な知識と「体系的」な知識を結び付けることができるのではないかと思います。
附属高校に行けば技術が身に付く?
元々工業系の科目に興味があって,「是非この分野に所属したい!」という思いがある人であれば,おそらく掛けた時間相応のリターンはあるのではないかと思います。それは,高専であろうと工業高校であろうと同じかもしれません。
逆に,とりあえず的に附属高校に入っても,カリキュラムが肌に合わなかったり,そこにいる人種が苦手だったりすると,不幸なまま3年間を終えることにもなりかねません。特に,附属高校に推薦入試で入学する生徒は,入試の段階で所属する分野を決めなければならない*7ので,なおさらリスクは高いと思われます。
こんな人にお薦めの附属高校
See also
関連
ネタ元:
画像引用元:
附属高校卒業生の回顧録としては,b4たかし氏の下記のシリーズが詳しいです。
- 東工大附高校を振り返る (1) 学校の雰囲気とか | b4log
- 東工大附高校を振り返る (2) SSH科目 | b4log
- 東工大附高校を振り返る (3) いろんな授業 | b4log
- 東工大附高校を振り返る (4) 高大連携 特別選抜 って? | b4log
- 東工大附高校を振り返る (5) 附属高校の、これから | b4log
もしこの記事の内容に間違いや補足などがありましたら,コメント欄にコメントをお願いします。なるべく早めに対応いたします。
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版なので,他のプラットフォームだと同じ手順を踏んでもうまくいかないかもしれません。
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」を選んで実機で実行してみてください。無事アプリが動作すれば完了です。