前の10件 | -
JavaScriptソースの分離 [AIR]
前回の続きですが、まず、ファイルにアクセスしたいと思っています。が、今後コードを追加して行く事を考えると、その前にJavaScriptのソースをHTMLから分離したくなりました。とりあえず、ソースファイルを「main.js」、エントリ関数は「main()」のままとして、HTMLファイルを書き換えました。
さて、ファイルの操作はFileクラスでできそうな感じなのですが、調べているとシステム固有のディレクトリを取得するプロパティがある様です。「アプリケーション」「アプリケーション記憶領域」「デスクトップ」「ドキュメント」「ユーザー」の各ディレクトリパスがあらかじめ設定されているみたいですね。実際に自分でアプリを作成してファイルの作成などをする際はこれらのディレクトリを基点に作成すれば、機種依存が避けられる様です。
まずは、こちらの内容を出力して見るため「main.js」は以下の様にしてみました。
さて、ファイルの読み込みが行いたいのですが、読み込むファイルの指定で固定パスをハードコードするのもなんなので、次はドラッグ&ドロップでファイルのパスを取得する事を試みてみます。
<html> <head> <script src="AIRAliases.js" type="text/javascript"></script> <script src="main.js" type="text/javascript"></script> <title>excercise_html_app</title> </head> <body onLoad="main()"> Hello Adobe AIR! </body> </html> |
さて、ファイルの操作はFileクラスでできそうな感じなのですが、調べているとシステム固有のディレクトリを取得するプロパティがある様です。「アプリケーション」「アプリケーション記憶領域」「デスクトップ」「ドキュメント」「ユーザー」の各ディレクトリパスがあらかじめ設定されているみたいですね。実際に自分でアプリを作成してファイルの作成などをする際はこれらのディレクトリを基点に作成すれば、機種依存が避けられる様です。
まずは、こちらの内容を出力して見るため「main.js」は以下の様にしてみました。
function main() { var application = air.File.applicationDirectory.nativePath; var appStorage = air.File.applicationStorageDirectory.nativePath; var desktop = air.File.desktopDirectory.nativePath; var documents = air.File.documentsDirectory.nativePath; var user = air.File.userDirectory.nativePath; air.trace("application: ", application); air.trace("appStorage: ", appStorage); air.trace("desktop: ", desktop); air.trace("documents: ", documents); air.trace("user: ", user); } |
さて、ファイルの読み込みが行いたいのですが、読み込むファイルの指定で固定パスをハードコードするのもなんなので、次はドラッグ&ドロップでファイルのパスを取得する事を試みてみます。
HTML+JavaScriptでAdobe AIR [AIR]
先日から、こちょこちょ更新し始めましたが、4、5年ぶりにAIRでもいじってみようかとぼちぼちいじり始めています。一応、AIRでは、HTMLとJavaScriptのみでアプリがつくれると言う事なので、その方向で。
Webアプリの作成には、Aptana Studioと言うのが有名らしいので、入れてみたのですが、昔は存在していたらしいAIRの開発環境が今は提供されていない様なので、断念。と言うか、併用するかも知れませんが・・。まあ、とりあえずは大した事もしないと思われるので、以前見つけていた「AIR GEAR」と言う環境で、プロジェクトの作成とテスト実行を行う事にしました。
*
で、いきなりGUIベースのアプリから取りかかると、また頓挫しそうなので、まずはログを出してみることに・・・。AIR GEARでプロジェクトを作成した際に作成されたHTMLファイルに書き足していく事にしました。それがこちら。
ちなみに、JavaScriptのHTML内での使い方もよくわかってないので、これだけでもちょっと手間取ったりして・・。
さて、一応、ソースをなめておきます。
こちら、自動生成されていた気がしますが、まずは「AIRAliases.js」と言うのを読み込みます。エイリアスの定義が含まれているとの事。無くても大丈夫と思われますが、これがあった方が便利な様です。
で、こちらが、ログ出力の関数(と言うかメソッド?)です。これでコンソールにテキストを出力することができます。ここでは、main()と言う関数の中に入れておきました。JavaScriptでエントリ関数の一般的な名前がわからなかったので、C風に・・。そもそも「エントリ関数」と言う概念があるのかどうかも知りませんが・・。
で、HTMLのbodyにイベントに対応した呼び出し関数を定義しておくと呼び出される様です。ここでは、「onLoad」と言うイベントに定義しています。
次は、とりあえずファイルを読み込みたいですかねぇ・・。
【参考】
・aptana
・AmaterasAIR a.k.a. "AIR GEAR" - Project Amateras
・HTML 環境について - Adobe AIR 用 HTML 開発ガイド / AIR 開発の基礎
Webアプリの作成には、Aptana Studioと言うのが有名らしいので、入れてみたのですが、昔は存在していたらしいAIRの開発環境が今は提供されていない様なので、断念。と言うか、併用するかも知れませんが・・。まあ、とりあえずは大した事もしないと思われるので、以前見つけていた「AIR GEAR」と言う環境で、プロジェクトの作成とテスト実行を行う事にしました。
*
で、いきなりGUIベースのアプリから取りかかると、また頓挫しそうなので、まずはログを出してみることに・・・。AIR GEARでプロジェクトを作成した際に作成されたHTMLファイルに書き足していく事にしました。それがこちら。
<html> <head> <script src="AIRAliases.js" type="text/javascript"></script> <script type="text/javascript"> function main() { air.trace("test"); } </script> <title>excercise_html_app</title> </head> <body onLoad="main()"> Hello Adobe AIR! </body> </html> |
ちなみに、JavaScriptのHTML内での使い方もよくわかってないので、これだけでもちょっと手間取ったりして・・。
さて、一応、ソースをなめておきます。
<script src="AIRAliases.js" type="text/javascript"></script> |
こちら、自動生成されていた気がしますが、まずは「AIRAliases.js」と言うのを読み込みます。エイリアスの定義が含まれているとの事。無くても大丈夫と思われますが、これがあった方が便利な様です。
air.trace("test"); |
で、こちらが、ログ出力の関数(と言うかメソッド?)です。これでコンソールにテキストを出力することができます。ここでは、main()と言う関数の中に入れておきました。JavaScriptでエントリ関数の一般的な名前がわからなかったので、C風に・・。そもそも「エントリ関数」と言う概念があるのかどうかも知りませんが・・。
<body onLoad="main()"> |
で、HTMLのbodyにイベントに対応した呼び出し関数を定義しておくと呼び出される様です。ここでは、「onLoad」と言うイベントに定義しています。
次は、とりあえずファイルを読み込みたいですかねぇ・・。
【参考】
・aptana
・AmaterasAIR a.k.a. "AIR GEAR" - Project Amateras
・HTML 環境について - Adobe AIR 用 HTML 開発ガイド / AIR 開発の基礎
aptana studioのエディタの色 [eclipse]
ADT(Andriod Development Tools)のeclipseにAptana Studioを入れた。が、HTMLのエディタの色が気に食わない。背景が黒で文字が白とかになってました。エディタの設定とかを見ても問題無さげだし、どこで設定すればいいのか悩んでいたところ、「環境設定」→「Aptana Studio」→「Themes」で設定可能だとの事。「Eclipse」を選択して解決。
【参考】
・How do I change the background color of aptana studio? - Stack Overflow
【参考】
・How do I change the background color of aptana studio? - Stack Overflow
eclipseのPDE [eclipse]
ADTのeclipseでplug-inのプロジェクトを見ようと思ったが、plug-inに関する選択肢が無かった・・・。本家のeclipseだと、はじめからPDE(plug-in development environment)と言うのが含まれている様子だが、ADTには無い。eclipseなので、後から追加可能だろうと調べていたところ、「Help」→「Install New Software...」で、「Work with」に「http://download.eclipse.org/eclipse/pde/visualization/updates」を設定して追加すれば、インストールできた。
【参考】
・PDE Downloads - eclipse
【参考】
・PDE Downloads - eclipse
ABNFのパーサー [RFC]
RFCの仕様の中で、各種の定義を表記する際にABNFと言う記法が利用されている時があるんですが、このABNFのCのパーサーを出力するソフトってないのかな?と思って探してみたらありました。有名なのかどうかは知りませんが、「APG」と言うのを見つけたので利用してみます。
ソースを展開してビルドをした所、エラーが出ました。
「malloc.h」が無いとか。いろいろ情報を検索してみた所、いろんな意見がある様なのですが、「/usr/include/malloc/malloc.h」にファイルがあるとの事なので、シンボリックリンクを張ってみました。
これで、再度ビルドします。
で、なんか成功したのか失敗したのかよくわからない出力が出ていましたが、「/usr/loca/bin/apg」と言う実行ファイルが出来上がってました。「apg」の実行でこんな感じ。
RFCから抜き出したABNFの定義を処理させてみましたが、どうも下記の様な感じですぐには処理できませんでした。
2, 3はRFCから抜き出したものを編集する事で対処可能ですが、1がちょっと厄介ですね。RFCの定義は一つの仕様内で閉じていない事が多そうな感じですからねぇ・・・。その辺、ちょっとアバウトに扱って、とりあえずできる限り出力してくれるとうれしいんですが・・。どうしましょうかね・・。
【参考】
・APG - coasttocoastResearchinc
・parse2
・VineGen
・Augmented BNF for Syntax Specifications: ABNF
・Comparison of parser generators - WIKIPEDIA
・malloc.h on OS X - /var/log/blog.log
・MacOSXでmallocを使う - 便利なスクリプト
・Tips for Allocating Memory - Mac Developer Library
ソースを展開してビルドをした所、エラーが出ました。
----- $ ./configure $ make ... gcc -DHAVE_CONFIG_H -I. -I../.. -g -O2 -D_APG_CFG_DEBUG -I../../ApgLib -I../../ApgUtilities -MT apg-CommandLine.o -MD -MP -MF .deps/apg-CommandLine.Tpo -c -o apg-CommandLine.o `test -f '../../Generator/CommandLine.c' || echo './'`../../Generator/CommandLine.c ../../Generator/CommandLine.c:31:20: error: malloc.h: No such file or directory make[4]: *** [apg-CommandLine.o] Error 1 make[3]: *** [all-recursive] Error 1 make[2]: *** [all-recursive] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 -----
「malloc.h」が無いとか。いろいろ情報を検索してみた所、いろんな意見がある様なのですが、「/usr/include/malloc/malloc.h」にファイルがあるとの事なので、シンボリックリンクを張ってみました。
----- $ cd /usr/include $ sudo ln -s malloc/malloc.h malloc.h -----
これで、再度ビルドします。
----- $ ./configure $ make $ sudo make install -----
で、なんか成功したのか失敗したのかよくわからない出力が出ていましたが、「/usr/loca/bin/apg」と言う実行ファイルが出来上がってました。「apg」の実行でこんな感じ。
----- $ apg *** input file name is required COMMAND LINE OPTIONS FOUND apg APG(version 6.3) Usage: apg options options: one or more of the following: help options ? - print this help screen help - print this help screen /? - print this help screen /help - print this help screen -help - print this help screen --help - print this help screen version options --version - print version -v - print version /v - print version name options /in:pathname - pathname of input SABNF grammar (required) /out:path - path for generated parser, including trailing delimiter (default = ./ or current working directory) /log:pathname - log output to pathname (default is console) /C:name - C-language parser project name (outputs files name.h & name.c) /C++:name - C++ language parser project name (outputs files name.h & name.cpp) true/false options, all defaults are false /dv - verbose, implies all display options except /dopcodes & /dast /dconfig - display all of the configuration parameters /dgrammar - display input grammar file with one-based line numbers /dwarnings - display grammar syntax warnings /dgrammar-metrics - display grammar metrics /dattributes - display attributes /drules - display rules and udts /dast - display AST records (caution: may generate many records) /dtypes - display the integer type sizes /dopcodes - display grammar opcodes in human-readable format (caution: may generate many opcodes) options are case sensitive and must appear exactly as indicated above paths, pathnames and names must be < 128 in length default values of all true/false options are false -----
RFCから抜き出したABNFの定義を処理させてみましたが、どうも下記の様な感じですぐには処理できませんでした。
- 定義が完全でないと失敗する
- 改行コードはCRLFでないといけない
- 定義の行頭に空白があると失敗する
2, 3はRFCから抜き出したものを編集する事で対処可能ですが、1がちょっと厄介ですね。RFCの定義は一つの仕様内で閉じていない事が多そうな感じですからねぇ・・・。その辺、ちょっとアバウトに扱って、とりあえずできる限り出力してくれるとうれしいんですが・・。どうしましょうかね・・。
【参考】
・APG - coasttocoastResearchinc
・parse2
・VineGen
・Augmented BNF for Syntax Specifications: ABNF
・Comparison of parser generators - WIKIPEDIA
・malloc.h on OS X - /var/log/blog.log
・MacOSXでmallocを使う - 便利なスクリプト
・Tips for Allocating Memory - Mac Developer Library
eclipseでダイヤモンドカーソル [eclipse]
約3ヶ月ぶりの更新ですが、最近久々にコードを書き始めています。で、eclipseと言うか、Androidの開発環境を利用してるんですが、カーソルを動かすのにカーソルキーを使うのがかったるいので、どういうキーバインドになってるのか調べてみた所、検索した限りでは単純にカーソルキーを動かすショートカットはみあたりません・・・。
仕方がないので、設定を確認した所、「General」→「Keys」と言う項目がそれっぽい項目でしたが、見た感じカーソル移動っぽい項目に何も設定されていない様でした。だから、なかったのか・・。既に割り当てられているのなら、それに合わせて慣れようかと思っていましたが、新たに設定するなら慣れ親しんだダイヤモンドカーソルにしようと設定してみました。
赤枠内を変更
変えたのは「Line Down」「Line Up」「Next Column」「Previous Column」。先述の通り、デフォルトでは何も割り当てられていませんでした。
結果は、まあ便利っ!って、最近のプログラマは単純にちまちまカーソル移動をさせる事は少ないんでしょうか・・?
【参考】
・ダイヤモンドカーソル - ウィキペディア
・ダイヤモンドカーソル - MonoBook
・ダイヤモンドカーソル - ITpro
仕方がないので、設定を確認した所、「General」→「Keys」と言う項目がそれっぽい項目でしたが、見た感じカーソル移動っぽい項目に何も設定されていない様でした。だから、なかったのか・・。既に割り当てられているのなら、それに合わせて慣れようかと思っていましたが、新たに設定するなら慣れ親しんだダイヤモンドカーソルにしようと設定してみました。
赤枠内を変更
変えたのは「Line Down」「Line Up」「Next Column」「Previous Column」。先述の通り、デフォルトでは何も割り当てられていませんでした。
結果は、まあ便利っ!って、最近のプログラマは単純にちまちまカーソル移動をさせる事は少ないんでしょうか・・?
【参考】
・ダイヤモンドカーソル - ウィキペディア
・ダイヤモンドカーソル - MonoBook
・ダイヤモンドカーソル - ITpro
Androidプロジェクトのソース構成 [Android]
久々にアプリ開発の続きをやろうかと思って、チュートリアルの続きを見てたら、すっかり前のが抜けてますね・・。やはり、こう言うのは、一気にやってしまう必要がありますね。
ま、それはそれとして、今回は各ファイルがどこにあるのかがよくわからなくなったので、こちらにちょろっと書かれていることを表にしときます。一部、私の追記あり(=間違っている可能性あり)。
下の方の空欄の箇所は、チュートリアルに書かれていないけど、実際のプロジェクトにできてたディレクトリです。後で分かれば追記するかも知れませんし、そのままかも知れません・・・。
ま、それはそれとして、今回は各ファイルがどこにあるのかがよくわからなくなったので、こちらにちょろっと書かれていることを表にしときます。一部、私の追記あり(=間違っている可能性あり)。
AndroidManifest.xml | マニフェストファイルです。アプリケーションの基本的な特徴を定義しておくファイルだとのこと。 | |
src/ | ソースファイルの含まれるディレクトリ。 | |
res/ | リソースが含まれる。具体的なリソースはさらに以下のサブディレクトリに分類されて保存される。 | |
drawable-hdpi/ | high-density(hdpi)向けの描画オブジェクト(ビットマップとか)が保存されるディレクトリ。実際のディレクトリツリーを見ていたら「drawable-ldpi/」「drawable-mdpi/」「drawable-xdpi/」「drawable-xxdpi/」がありますね。それぞれ解像度が違うもの向けなんでしょう。 | |
layout/ | アプリのユーザインタフェースを定義するファイルのディレクトリ。ま、名前からレイアウトの定義が含まれるのでしょう。 | |
values/ | いろんなリソース(文字列や色とか・・)を定義するXMLファイルが含まれるディレクトリ。実際のディレクトリツリーでは「values-sw600dp/」「values-sw720dp-land/」「values-v11/」「values-swv14/」なんかがあります。「strings.xml」もここにあります。 | |
menu/ | チュートリアルには書かれていませんでしたが、たぶんメニュー関連の定義が入るのでしょう。そのうち出て来るかも。 | |
gen/ | ||
Android 4.2.2/ | ||
Android Dependencies/ | ||
bin/ | ||
libs/ | ||
ic_launcher-web.png | ||
proguard-project.txt | ||
project.properties |
下の方の空欄の箇所は、チュートリアルに書かれていないけど、実際のプロジェクトにできてたディレクトリです。後で分かれば追記するかも知れませんし、そのままかも知れません・・・。
Androidアプリ開発再び [Android]
いろいろとやることが分断してなんなんですが、久々に(また)Androidのアプリ開発に興味がわいてきました。以前は、エミュレータを起動させるところまででやめたんですね。たしかエミュレータの動作が重すぎたせいもあって興味が失せた気も・・。現在は、Androidのタブレットも3台保有しており、Smartiaはほぼ置物状態になっているので、開発用の端末としてSmartiaを活用してみたいと思います。なんか、アプリが完成させられたらいいんですけどねぇ・・。
とりあえずは、チュートリアルをなぞっていきます。SDKのバージョンも上がっていると思うので、最新のにしたいと思いますが、一応前回の環境も残したまま新しいのを入れることにします。と言うことで、新規にやる場合と異なる点があったので、ここにメモっておきます。と思ったんですが、実施したのがちょっと前なので、何をしたかちゃんと覚えてないですね・・。記憶に残っているもののみメモっておきます。
さて、環境は前と変わらず、MacOS X の SnowLeopardです。まずは、SDKをダウンロードします。こちらのガイドに従って、ADT付きのものをダウンロードしてインストールしますがインストールは至極簡単で、落としたアーカイブを解凍して「/Developer/」にコピーするだけでした。
で、少しトラブったのがSDKの場所です。設定関連のファイルの場所が前のADTと同じディレクトリになっている様子で、その設定がそのまま残っているため、SDKの場所はこちらで設定し直す必要がありました。おそらく、新規にインストールした場合は自動で正しい場所が設定されるのではと想像しています。「ADT」→「環境設定」→「Android」で「SDK Location」に入れたADT配下のSDKのディレクトリを指定します。私の場合は「/Developer/adt-bundle-mac-x86_64-20130219/sdk」でした。
エラーメッセージが出てたかなんかで設定の必要性に気づいた
続いて、SDK Manager(「Window」→「Android SDK Manager」)で、必要そうなAPI向けのライブラリとかを入れます。私は、Smartia、KT-i7A、Nexus7に該当するものをダウンロードしておきました。
SDK Manager
で、ビルドした時に「Error generating final archive: Debug Certificate expired on xxxx」(エラーメッセージは忘れたので、今検索して逆引き)と言ったエラーメッセージが出たため調べたところ、「~/.android/debug.keystore」を削除すれば問題無しとのことで、その通りに実行しました。証明書の期限が切れているらしいです。これも以前のSDKの残骸のせいですね・・。
こんなくらいでしたかねぇ・・。Smartiaへの接続はチュートリアルに従ってすっと言った様な気がします。MacOS Xでは、ドライバのインストールも不要な様なので・・・。
まあ、ぼちぼち進捗は更新して行くつもりです(こんなんばっかですが・・)。
とりあえずは、チュートリアルをなぞっていきます。SDKのバージョンも上がっていると思うので、最新のにしたいと思いますが、一応前回の環境も残したまま新しいのを入れることにします。と言うことで、新規にやる場合と異なる点があったので、ここにメモっておきます。と思ったんですが、実施したのがちょっと前なので、何をしたかちゃんと覚えてないですね・・。記憶に残っているもののみメモっておきます。
さて、環境は前と変わらず、MacOS X の SnowLeopardです。まずは、SDKをダウンロードします。こちらのガイドに従って、ADT付きのものをダウンロードしてインストールしますがインストールは至極簡単で、落としたアーカイブを解凍して「/Developer/」にコピーするだけでした。
で、少しトラブったのがSDKの場所です。設定関連のファイルの場所が前のADTと同じディレクトリになっている様子で、その設定がそのまま残っているため、SDKの場所はこちらで設定し直す必要がありました。おそらく、新規にインストールした場合は自動で正しい場所が設定されるのではと想像しています。「ADT」→「環境設定」→「Android」で「SDK Location」に入れたADT配下のSDKのディレクトリを指定します。私の場合は「/Developer/adt-bundle-mac-x86_64-20130219/sdk」でした。
エラーメッセージが出てたかなんかで設定の必要性に気づいた
続いて、SDK Manager(「Window」→「Android SDK Manager」)で、必要そうなAPI向けのライブラリとかを入れます。私は、Smartia、KT-i7A、Nexus7に該当するものをダウンロードしておきました。
SDK Manager
で、ビルドした時に「Error generating final archive: Debug Certificate expired on xxxx」(エラーメッセージは忘れたので、今検索して逆引き)と言ったエラーメッセージが出たため調べたところ、「~/.android/debug.keystore」を削除すれば問題無しとのことで、その通りに実行しました。証明書の期限が切れているらしいです。これも以前のSDKの残骸のせいですね・・。
こんなくらいでしたかねぇ・・。Smartiaへの接続はチュートリアルに従ってすっと言った様な気がします。MacOS Xでは、ドライバのインストールも不要な様なので・・・。
まあ、ぼちぼち進捗は更新して行くつもりです(こんなんばっかですが・・)。
MacOSの隠しファイルを削除する [Ruby]
今回はちょっと違う話題を・・。
私は、Macを利用しているんですが、MacOSでは「リソースフォーク」とか言って、ファイルの属性が書かれているファイルが隠しファイルとしてファイル毎に作成されたりします。Mac上でFinderなど普通のアプリを使っている時には特に問題はないのですが、NASを利用してファイル共有していると、結構邪魔なため、これらの隠しファイルを削除するツールを作ってみました。
見えている隠しファイルは「.DS_Store」と各ファイル毎に作成されている「._<filename>」、隠しディレクトリの「.AppleDouble」。ついでに古いディレクトリだと「2EDS_~!3」と言うのも見えています。さらに、ツールを作っている時に気が付いた「._.DS_Store」。かなり前からMacでNASを使ってファイル共有をしてるんですが、その間にNASの入れ替えでターミナルなんかを使って、ファイルの移動などをさせているうちにいろんな種類の隠しファイルが出来ている様です。特に「._.DS_Store」なんかは、隠しファイルの隠しファイルになってるみたいです・・・。
ツールの仕様は下記の通り。
と言う感じで、処理対象はデータを保存しているディレクトリのみのため、仕様はかなり簡素化してます。データと共に設定などを隠しファイルで持っているディレクトリには使用できません。
で、サブディレクトリの探索ですが、再帰で処理して行くと深い階層のディレクトリが処理できなくなる可能性があるため、ディレクトリを見つけたらキュー(今回は配列)に詰めて行き、現在のディレクトリの中の隠しファイルを削除し終わったら、次のディレクトリに進むと言う感じにしました。
後、「._.DS_Store」と言う隠しファイルは「.DS_Store」を削除した瞬間に同時に削除される。つまり「.DS_Store」に対するリソースフォークになってしまっている様子です。このファイルの存在と振る舞いに気づく前は「ファイルが無い」と例外が発生して処理が止まってしまっていたのでした。
また、文字列の処理をするのが面倒だったので、削除の作業は実際にそのディレクトリに移動(chdir)して、作業する様にしています。まあ、これはどっちがいいのかよくわからないですね。
と言う感じで作ったRubyスクリプトをアップしようかと思いましたが、このブログは画像、動画、音声しかアップできない様です。まあ、そんなに長いソースでもないので、ここにコピーしときます。
ちなみに、実行したRubyのバージョンは「ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0]」です。
処理、ソースの善し悪しはさておき、初めて開発系のブログの様な雰囲気になりましたかね??
*
と言うことなんですが、記事を書き終えた後、バグを2個程見つけまして、上記はそれを修正したものとなってます。・・が、既にある程度の処理が終わっている(バグで完全に処理が終わってなかった)ディレクトリに対して実行しただけなので、もしかしたら、修正がうまく行ってない可能性もあったりするかも・・・。
自分用のツールならほっておく(で、運用で対応する)様な内容でしたが、公開するとなると何となく気持ち悪くて、よけいな対応をしてしまいますね・・。更なるバグの指摘やRuby的にはこうした方がいいんじゃないのと言う様なご意見がございましたら、コメントをお願いします。後、根本的なアルゴリズムも・・。
私は、Macを利用しているんですが、MacOSでは「リソースフォーク」とか言って、ファイルの属性が書かれているファイルが隠しファイルとしてファイル毎に作成されたりします。Mac上でFinderなど普通のアプリを使っている時には特に問題はないのですが、NASを利用してファイル共有していると、結構邪魔なため、これらの隠しファイルを削除するツールを作ってみました。
見えている隠しファイルは「.DS_Store」と各ファイル毎に作成されている「._<filename>」、隠しディレクトリの「.AppleDouble」。ついでに古いディレクトリだと「2EDS_~!3」と言うのも見えています。さらに、ツールを作っている時に気が付いた「._.DS_Store」。かなり前からMacでNASを使ってファイル共有をしてるんですが、その間にNASの入れ替えでターミナルなんかを使って、ファイルの移動などをさせているうちにいろんな種類の隠しファイルが出来ている様です。特に「._.DS_Store」なんかは、隠しファイルの隠しファイルになってるみたいです・・・。
ツールの仕様は下記の通り。
- 「.」で始まるファイルを削除
- 「.」で始まるディレクトリはその中身全てと共に削除
- ファイル「2EDS_~!3」を削除
- 引数で指定されたディレクトリ以下、全てのサブディレクトリが対象
と言う感じで、処理対象はデータを保存しているディレクトリのみのため、仕様はかなり簡素化してます。データと共に設定などを隠しファイルで持っているディレクトリには使用できません。
で、サブディレクトリの探索ですが、再帰で処理して行くと深い階層のディレクトリが処理できなくなる可能性があるため、ディレクトリを見つけたらキュー(今回は配列)に詰めて行き、現在のディレクトリの中の隠しファイルを削除し終わったら、次のディレクトリに進むと言う感じにしました。
後、「._.DS_Store」と言う隠しファイルは「.DS_Store」を削除した瞬間に同時に削除される。つまり「.DS_Store」に対するリソースフォークになってしまっている様子です。このファイルの存在と振る舞いに気づく前は「ファイルが無い」と例外が発生して処理が止まってしまっていたのでした。
また、文字列の処理をするのが面倒だったので、削除の作業は実際にそのディレクトリに移動(chdir)して、作業する様にしています。まあ、これはどっちがいいのかよくわからないですね。
と言う感じで作ったRubyスクリプトをアップしようかと思いましたが、このブログは画像、動画、音声しかアップできない様です。まあ、そんなに長いソースでもないので、ここにコピーしときます。
ちなみに、実行したRubyのバージョンは「ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0]」です。
# 指定されたディレクトリ以下にある.ファイルを削除 # サブディレクトリも検索する # .ディレクトリは中のファイルも全て削除 # 「2EDS_~!3」も削除 # # 使用法:ruby del_dot.rb <dir_name> # ディレクトリを検索して、.ファイル、.ディレクトリを削除する class DelDot @dir_stack # 処理すべきディレクトリ名(フルパス)を格納する配列 # 初期化 def initialize(root) @dir_stack = Array[root] end # .ファイルの削除 def del_dot(file) if (file =~ /^\..+/) then File.delete(file) print 'delete ', file, "\n" elsif (file == "2EDS_~!3") then File.delete(file) print 'delete ', file, "\n" end end # .ディレクトリの削除:ディレクトリ内のファイルは全て削除する def del_dotdir(dir) procdir = Array.new.push(dir) deldir = Array.new.push(dir) while procdir.size != 0 curdir = procdir.shift Dir.chdir(curdir) print '---------------------- ', curdir, "\n" Dir.foreach(Dir.pwd) { |file| if File.ftype(file) == "directory" then if (!(file == '.') && !(file == '..')) then procdir.push(Dir.pwd + '/' + file) deldir.push(Dir.pwd + '/' + file) end else File.delete(file) print 'delete ', file, "\n" end } end Dir.chdir(dir + '/..') deldir.reverse_each { |item| Dir.delete(item) print 'delete ', item, "\n" } end # 単一ディレクトリの処理 def proc_dir(cur) Dir.chdir(cur) Dir.foreach(Dir.pwd) { |file| if File.exist?(file) == true then if File.ftype(file) == "directory" then if (file =~ /^\..+/) then # .ディレクトリの処理 if (!(file == '.') && !(file == '..')) then del_dotdir(Dir.pwd + '/' + file) end else # ディレクトリの登録 if (!(file == '.') && !(file == '..')) then @dir_stack.push(Dir.pwd + '/' + file) end end else del_dot(file) end end } end # メイン処理 def proc while @dir_stack[0] != nil cur = @dir_stack.shift print '---------------------- ', cur, "\n" proc_dir(cur) end end end # 引数をクラスに渡す dir_name = ARGV[0] if dir_name != nil then script = DelDot.new(dir_name) script.proc end |
処理、ソースの善し悪しはさておき、初めて開発系のブログの様な雰囲気になりましたかね??
*
と言うことなんですが、記事を書き終えた後、バグを2個程見つけまして、上記はそれを修正したものとなってます。・・が、既にある程度の処理が終わっている(バグで完全に処理が終わってなかった)ディレクトリに対して実行しただけなので、もしかしたら、修正がうまく行ってない可能性もあったりするかも・・・。
自分用のツールならほっておく(で、運用で対応する)様な内容でしたが、公開するとなると何となく気持ち悪くて、よけいな対応をしてしまいますね・・。更なるバグの指摘やRuby的にはこうした方がいいんじゃないのと言う様なご意見がございましたら、コメントをお願いします。後、根本的なアルゴリズムも・・。
GPG [Android]
さて、前回のプロンプトでは名前を求められている様で、デフォルトとしてMacへのログインアカウントが表示されていたので、そのまま入力します。すると次はメールアドレスを求められている様です。ここはgoogleに媚を売って、Gmailのアドレスを入力。すると入力内容の確認の後、今度はカラーが表示されるかどうかの確認が来ました。で、まあカラー表示で了承したところ、初期化が完了したとのこと。
・・・初期化は完了した様ですが、情報がどこに書き込まれたのかがよくわかりませんね・・・。workディレクトリにも「~/bin/」にも何か書き込まれた様な様子はありません。と思ってログを見直したら、「/Volumes/android/work/.repo/」に書き込まれている様ですね。隠しディレクトリでした。
*
さて、ここで、前回強く求められていたGPGをインストールしときます。もしかしたら、上のユーザー情報を入力する時に利用されるだけだったら無駄かも知れませんが、気にしないことに。
インストーラがあったので、それでインストールします。私が落としたのは、Version 2013.03.30で、OS X 10.5 以上が求められている様です。
インストーラ、アンインストーラ
パッケージの中にはインストーラとアンインストーラが入ってました。インストールが完了すると、キーの作成を求められたので、作成。
全然進捗はないですが、今回はここまで。
【参考】
・GPGTools
・Mac GNU Privacy Guard
Your Name [xxxxx]: xxxxx Your Email [xxxxx@mac-mini.local]: xxxxx@gmail.com Your identity is: xxxxx |
・・・初期化は完了した様ですが、情報がどこに書き込まれたのかがよくわかりませんね・・・。workディレクトリにも「~/bin/」にも何か書き込まれた様な様子はありません。と思ってログを見直したら、「/Volumes/android/work/.repo/」に書き込まれている様ですね。隠しディレクトリでした。
*
さて、ここで、前回強く求められていたGPGをインストールしときます。もしかしたら、上のユーザー情報を入力する時に利用されるだけだったら無駄かも知れませんが、気にしないことに。
インストーラがあったので、それでインストールします。私が落としたのは、Version 2013.03.30で、OS X 10.5 以上が求められている様です。
インストーラ、アンインストーラ
パッケージの中にはインストーラとアンインストーラが入ってました。インストールが完了すると、キーの作成を求められたので、作成。
全然進捗はないですが、今回はここまで。
【参考】
・GPGTools
・Mac GNU Privacy Guard
前の10件 | -