2013年11月27日水曜日

SQLite MySQLにインポートする

SQLiteで作成したデータベースをMySQLにインポートする。

参考サイト
sqlite エクスポート → mysql インポート - 0 _ 0

SQLiteのデータベースをエクスポートする


まずはSQLiteのデータベースをSQL文で出力する。

/*---------------------------------------------------------------------------*/
$ sqlite3 hoge.db
sqlite3> .output huga.sql
sqlite3> .dump
/*---------------------------------------------------------------------------*/

データベース開いて、出力先を変更して、ダンプする。

エクスポートしたデータを整形する


そのままMySQLにインポートしようとすると怒られる。
MySQLに対応したデータに形を整えてあげよう。
  • PRAGMA foreign_keys=OFF; を削除する
  • INSERT時のテーブルを囲っている"を削除する
  • BEGIN TRANSACTION を START TRANSACTION に書き換える
  • 文字列を使用しているところで文字化けする場合COLLATEで文字コードを指定
自分の環境で出てきたエラーしか対処していないので、対応すべき点は他にもあるかも。
MySQLからインポートしたデータベースでやったからか、テーブル構造では全く怒られなかった。

MySQLでインポート


エラーが出なければ完了。出たら対応。

2013年11月26日火曜日

C# SQLiteDataAdapterでUpdate

ぼちぼちSQLiteにも慣れたような気のせいのような。
Select文で取ってきたデータを処理する方法として、
SQLiteはSQLiteDataReaderを使う方法と、SQLiteDataAdapterを使う方法がある。
今回は、後者で取ってきたDataTableをいじったから
もとのデータベースに反映させたいよう、というお話。

基本的な流れ


参考サイト

SQLiteDataAdapterのUpdateメソッドにDataTableを渡せばよいとな?

/*---------------------------------------------------------------------------*/
// hoge.dbに接続
SQLiteConnection conn = new SQLiteConnection("hoge.db");
conn.open();

// fugaテーブルのデータを取ってくる
SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from fuga", conn );
DataTable data = new DataTable();
adapter.Fill(data);

// なんかデータテーブルをいじる

// 更新
adapter.Update(data);
/*---------------------------------------------------------------------------*/

で、ほんともう単純にやってみたら例外吐かれた。
なんでも「有効なUpdateCommandがないわよ。ばかね」だそうで。

SQLiteCommandBuilderでコマンドを自動生成する


参考サイト

テーブルごとに有効なコマンドを自分で設定するのなんて正気の沙汰じゃない。
そもそもそれなら自分でデータベースを直でいじるわい、と思っていたら、
自動生成してくれるクラスがあった。

/*---------------------------------------------------------------------------*/
SQLiteCommandBuilder bulider = new SQLiteCommandBuilder(adapter);
adapter.Update(data);
/*---------------------------------------------------------------------------*/

たったこれだけで勝手に各種コマンドを自動生成してくれるそうで。大助かり。
これでSQLiteDataAdapter を使ってのデータベース更新ができるようになった。

補足:PRIMARY KEYの設定


データベースのKEYの設定をちゃんとしていないと、SQLiteCommandBuilderで実は怒られる。
更新時のWHERE句の指定でプライマリキーを使用するのだと思う。多分。
ちゃんと設定してあげよう。

SQLite テーブル一覧を取得する

SQLiteでテーブル一覧を取得しようと思う。

SQLiteのコマンドを使う


参考サイト

.tablesなんていういかにもなコマンドがある。

/*---------------------------------------------------------------------------*/
.tables
/*---------------------------------------------------------------------------*/

これを使うとテーブル一覧がずらりと表形式で出てくる。

SQL文で取得する


参考サイト

上記の方法だと、直接SQLiteを実行しているときじゃないと一覧が取得できない。
他のプログラムで使用したいと思っていたので、SQL分を使って取得したい。

/*---------------------------------------------------------------------------*/
select name from sqlite_master where type='table' order by name;
/*---------------------------------------------------------------------------*/

そんなときはこのコマンドで一発さ!
order byは並び替えなので、あってもなくてもいいと思う。見易さが変わるだけ。
C#で試してみたら、結果は
1行1列名前だけ×テーブル数
のデータを持ったデータセットが返ってきた。

2013年11月25日月曜日

SQLite 外部ファイルからSQL文を読み込む

SQLiteでは.readコマンドを使うと、外部ファイルからSQL文を実行できる。
これを使えば外部のデータベースからSQL文をエクスポートして移植することも夢ではない!
今回はphpMyAdminを使ってMySQLから移植してみた。

参考サイト

MySQLからSQL文を出力する


phpMyAdminならデータベースのトップに移動してエクスポートから。
mysqldumpというコマンドを実行させてもいい、っぽい。

オプションを弄って1行ずつの出力にしておこう。
phpMyAdminなら「エクスポート方法」を「詳細」に設定して、
「すべての INSERT 文にカラム名を含める 」にチェックを入れればいい。
エラーが分かりやすくなる。

SQLiteに入力する


まずはなにも考えずに速攻移植さ!

/*---------------------------------------------------------------------------*/
sqlite3 .read hoge.sql
/*---------------------------------------------------------------------------*/

当然のごとく失敗。MySQLとSQLiteだと色々相違点があるので怒られるようだ。
それくらいは許容してくれもいいじゃないかよ、と思うけどそんなことは許さないSQLite。
phpMyAdminも「他のデータベースシステムまたは古い MySQL サーバとの互換性」とかいう
項目があるけど、SQLiteは含まれていない。
それ用のツールもないようなので、自力で変換する。

SQLファイルの変換


参考サイトを記載しておきつつ、なぜかエラー見ながら地道にやったばかたれちゃん。
機能をフルに使っているわけではないので他にもあるかもしれないけど、
大体以下の点に気をつければなんとかなった。
  • コメントアウト?(/*~*/;)されてる行は全て削除
  • 行頭にSETを含む行は全て削除
  • KEY関連の設定は全て削除
  • 少なくともPRIMARY KEYは保持できる。エラーでた気がしたんだけどな…。
  • テーブルのオプション(ENGINE, DEFAULT CHARSETなど)は削除
  • AUTO_INCRIMENTは削除
  • データベースへつけているコメント(COMMENT)は削除
  • ストアドルーチンを設定している箇所を削除
phpMyAdminで吐き出したsqlファイルということ前提。
エラーで怒られてるところを全部消して行けばいずれたどり着く。
正直、参考サイトのほうが良くまとまっているので、そっちを参考にしたほうが絶対いい。

今度こそSQLiteに出力する


コマンドを実行してエラーが出なければ成功。
ちゃんと移植できているか中身を確認しておこう。

C# ディレクトリのファイル一覧を取得する

コンソールツールなんか作ってると、ディレクトリのファイル一覧が取得したくなる。
指定ディレクトリ(または現在のディレクトリ)のファイルに対して特定の処理を行うとか。
そんなわけでやってみた。

ファイル一覧を取得する


/*---------------------------------------------------------------------------*/
string[] files = Directory.GetFiles(directory);
/*---------------------------------------------------------------------------*/

これだけでいいんだから驚き。directoryにはディレクトリのパスが入っている。
なお、特定の拡張子のファイルだけが欲しいときはこうする。

/*---------------------------------------------------------------------------*/
string[] files = Directory.GetFiles(directory, "*.txt");
/*---------------------------------------------------------------------------*/

テキストファイルだけを取ってくる例。
ワイルドカードを使うパターンは多いので、分かる人はわざわざ調べなくても出てきそう。

現在のディレクトリのパスを取得する


GetFilesは引数としてディレクトリ名を要求する。
引数なしなら現在のディレクトリ、なんて気の利いたことはしてくれない。
なので、現在のディレクトリを取得する方法も一緒に調べた。

/*---------------------------------------------------------------------------*/
    string directory = Directory.GetCurrentDirectory();
/*---------------------------------------------------------------------------*/

うーん、まんまだ。インテリセンス見ただけで気づく人も普通にいそう。

C# foreachでDictionaryのキーと値を同時に取得する

C#ではIEnumerableインターフェースを継承してるクラスで、foreachを使用することができる。
コレクションの全ての要素を一回ずつ読み込んでくれる機能。
forと違ってループ回数の指定とか面倒なことしなくてもいいのでなにかと便利。

で、PHPとかにもある機能なんだけども、PHPだと連想配列のキーも一緒に取得できる。
ならC#でもきっとできるさ、と思って調べてみたら、あった。

参考サイト

やり方は簡単。

/*---------------------------------------------------------------------------*/
foreach (KeyValuePair<string, string> pair in dictionary)
{
// なんかする
}
/*---------------------------------------------------------------------------*/

以上。
IDictionaryの要素が<TKey,TValue>のペアで構成されているため、
それを受け取れるようにしたのがKeyValuePairだそうな。

2013年11月22日金曜日

SQLite データをインポートする

C#でSQLiteを使っていて、既存のデータベースと同じデータを扱う必要が出た。
そうなると当然その既存のデータベースからインポートしてしまいたい。
結論から言うと、C#環境下ではできなかった。
もしかしたらできるのかもしれないけど、なんちゃってプログラマにはわからなかった。
SQLiteをダウンロードしてそっちでデータベースを作ってからC#側で使うしかないのかな?

SQLiteをダウンロード



サイトからファイルをダウンロード。
zipファイルを任意のフォルダに解凍すると、sqlite3.exeというファイルがぽつねんとできる。
あとはコマンドプロンプトから叩いてやるだけ。

テーブルにデータをインポートする


参考サイト

今回インポートするのはcsv。
データがダブルクォーテーションで囲まれていると失敗するらしい。
それから、1行目のデータがカラム名じゃなくても失敗する。
全部文字列だったら失敗しないかもしれない。
コマンドプロンプトでexeを展開したフォルダに移動。コマンドを叩いてやろう。

/*---------------------------------------------------------------------------*/
$ sqlite3 -separator , hoge.db ".import hoge.csv hoge"
/*---------------------------------------------------------------------------*/

-separatorオプションでセパレータ(区切り文字)を指定できるので、
カンマ区切りじゃなくても問題はなさそう。

/*---------------------------------------------------------------------------*/
$ sqlite3 hoge.ds
sqlite> .import hoge.csv hoge
/*---------------------------------------------------------------------------*/

この方法でもできるそうだけど、separatorの指定はどうやるんだろうか?
普通にでいいのかな?



/** 同日追記 **/

参考サイト
データをファイルからインポート

区切り文字は「.separator」で変更可能。
それから、カラム名もファイルからインポートするとデータ型が全部TEXTになってしまうようだ。
テーブルそのものは事前に作っておいて、データだけインポートしろってことかな。

jQuery 「jQuery Slider²」を使い、さらに弄ってみた

以前bxsliderを使う記事を上げた。
じゃあもうスライダーはこれでいいな、と思っていたら、
なぜかまったく関係ない要素表示が乱れるというバグが発生。
原因が全然分からんかったので、jQuery Slider²に乗り換えてみた。

参考サイト
とても簡単で軽量なjQueryスライダー「jQuery Slider2」を使ってみる | bl6.jp

まずは実行だ


というわけでサイトからダウンロードしてきてテスト。
特に特別なこともなく、jsファイルとcssファイルを読み込んだら、
htmlに動かしたい要素を追加してjavascriptで要素を指定してやるだけ。

さて、ここでひとつ問題にぶち当たった。
どうにもjQuery Slider²はページナビを右端から順繰り表示がデフォらしい。
オプションやcssを弄ってどうにかならんかと思ったけど、
オプションにはないし、cssはabsoluteが指定されているしでどうしようもない感じ。
仕方ないから、jsファイルを弄る。

ページナビをセンタリングする


参考サイト

使用ツール

まずはcssから余計な要素を削除しする。具体的にはtopとかrightとか。
leftは50%指定に変更。

/*---------------------------------------------------------------------------*/
.jquery-slider-pages {
   overflow: visible;
   position: absolute;
   bottom: 5px;
   left: 50%;
}
/*---------------------------------------------------------------------------*/


そしてjsファイルをツールで整形。
jquery-slider-pagesクラスを追加している部分で

要素数×ページナビの横幅÷2

ピクセル分margin-leftをマイナスしてあげよう。

/*---------------------------------------------------------------------------*/
if (settings.showProgress) {
positionEls.CSS("margin-left", -(count*pixel/2)+"px");
$this.append(positionEls);
}
/*---------------------------------------------------------------------------*/

これでセンタリングが完了。
それっぽい見た目にはなったかな。

2013年11月20日水曜日

C# SQLiteを使ってみた

「SQLite? なにそれ?」状態の自分がSQLiteを使ってみた。

SQLiteってなんぞや?


参考サイト

色々と特徴が書き出されてるけど、要はアプリケーションに組み込む形でデータベースが
使えるとさえ分かっていればいいんだな。いいんだよね?

SQLiteをダウンロード


参考サイト

公式サイトにダウンロードしに行くと、なんかたくさんファイルがあった。
ちゃんと違いがあるみたいなので、上記サイトをよく読んで自分の環境にあったやつを使おう。
すごく丁寧に解説されている。
なぜかインストーラを使うと失敗するので、今回はzip版をダウンロード。

Visual C#で使う


参考サイト

いろんなページで参照に追加する追加する言ってるけど、どうするんだと思っていたら、
本当にプロジェクトに参照を追加するだけでよかったというオチ。
  1. 適当なプロジェクトを作る
  2. 「参照の追加」の「参照」タブから解凍したSystem.Data.SQLite.dllを追加
実行する際はexeと同じフォルダにSQLite.Interop.dllを追加してやろう。
サンプルとして上記サイトに書いてあるコードを実行させてもらいました。
テーブル追加、レコード追加、読み込み、出力の流れ。
動いた。

テーブルを作成すると、
実行ファイルと同じ場所にテーブルのデータファイル(?)が出来上がる。
当然同じテーブルは作れないので連続でテストする時は注意。

コマンドプロンプト ファイルを削除する

コマンドプロンプトでファイルを削除する。

/*---------------------------------------------------------------------------*/
del hoge.fuga
/*---------------------------------------------------------------------------*/

名前が一致したファイルを削除する。
ワイルドカードも使えるので、フォルダ内の特定拡張子のファイルを削除したいときなんかに。

/*---------------------------------------------------------------------------*/
del *.jpg
/*---------------------------------------------------------------------------*/

何気に便利。

2013年11月18日月曜日

コマンドプロンプト ファイルから文字列を検索して行を出力

簡単なファイル操作なり、処理なりは、
コマンドプロンプトないしバッチファイルのほうが楽かもしれないと最近思った。

コマンドプロンプトを使用してファイルから指定文字列を検索。
それを行で出力する。

参考サイト
コマンドプロンプト findstr - [文字列や正規表現を使って文字列を検索する]

/*---------------------------------------------------------------------------*/
findstr /N test test.txt > output.txt
/*---------------------------------------------------------------------------*/

上記の例では、test.txtから、testという文字列を検索。
行番号付きで、output.txtというファイルに書き出している。

色々オプションがあり、正規表現も使えるので、やたらややこしい条件がなければ、
大抵の検索はこれで済むと思われる。

2013年11月15日金曜日

C# アプリケーションを終了する

そもそもアプリを起動するためのデータが取得できなかっただとか、
アプリケーションに必須なものが取得できずアプリを終了せざるをえないこともあるだろう。
あるいは、閉じるボタン以外の場所をクリックしたいときに終了するとか。

そんなわけでどうすればアプリケーションを終了できるのかを調べてみた。

参考サイト
アプリケーション(自分自身)を終了させる: .NET Tips: C#, VB.NET

上記サイトによると、3つの方法で終了できるらしい。

/*---------------------------------------------------------------------------*/
this.Close();
System.Windows.Forms.Application.Exit();
System.Environment.Exit(0);
Environment.FailFast("イベントログに書き込む")
/*---------------------------------------------------------------------------*/

上から順番に、
  • メインフォームを閉じる
  • フォームアプリケーションの終了
  • エントリポイントを抜ける
  • 強制終了
だそうな。

上記2つはフォームアプリケーションでしか使用できないので、コンソールは下の2択。
さらにFailFastはアプリケーションの状態悪化時なんかに呼び出すべきものであるらしいので、
よほどのことがない限り、コンソールはEnvroiment.Exitでよさそう。

フォームアプリケーションは全部選択できるんだけど、上記の理由によりFailFastはなし。
Envroiment.Exitはプロセスを強制的に終了してエントリポイントを抜けるため、
呼び出した場所以降のメソッドが呼ばれない。
Closeは、そもそもメインフォーム以外の場所から呼べんじゃないですか。
参照を持っていれば話は別だけども。
ということでApplication.Exitが一番よさそう。

C# フォームアプリケーションで複数ウィンドウ

フォームアプリケーションをやっていたら、
フォームBで選択されたデータをフォームAに反映したいという状況になった。
フォームBがモーダルダイアログならShowDialogで問題ないんだけど、
フォームAと常に一緒に表示されているウィンドウなので、親子関係を構築する。



親子関係の構築の仕方は簡単。子ウィンドウのShowメソッド呼び出し時に親を渡す。

/*---------------------------------------------------------------------------*/
public FormA() {
        this.Shown += delegate(object sender, EventArgs e) {
        Form formB = new Form();
        formB.Show(this);
        };
}
/*---------------------------------------------------------------------------*/

上記の例では、コンストラクタでShownイベントハンドラを設定し、
イベントハンドラ内でフォームBを生成、親として自分自身を渡している。
コンストラクタ内で直接やると、親のインスタンスが生成されておらず、
期待通りの結果にならないので注意。

表示位置もこちらで自由に指定したいのなら、
StartPositionプロパティをFormStartPosition.Manualに設定して Location を弄る。

常にその配置に固定したいならMoveやResizeにイベントハンドラを設定。

2013年11月14日木曜日

C# FileDialogとカレントディレクトリ

C#のフォームアプリケーションではファイル操作を行うときにファイルダイアログを使うと、
専用のダイアログを開いてファイルを選択できる。

このファイルダイアログ、適当に生成して使うと、
たまげたことにアプリケーションのカレントディレクトリを変更しやがる。
相対アドレスを直接指定して画像ファイルを読み込みとかしていると、
当然のごとく読めなくなった。

こういうときは、RestorDirectoryプロパティをtrueにしてやるといい。

/*---------------------------------------------------------------------------*/
OpenFileDialog dialog = new OpenFileDialog()
{
   RestoreDirectory = true,
};
DialogResult result = dialog.ShowDialog();
/*---------------------------------------------------------------------------*/

上記のコードではOpenFileDialogで行っているが、SaveFileDialogでも同様。

ところで、newしたあとに{}で囲むとプロパティを操作できるのね。
機能名がわからんから詳しく調べられてないんだけど、なんなんだこりゃ?

2013年11月13日水曜日

C# Formあれこれ

ツール作成にはC#が便利だ! というのをどこかで聞いたような聞いていないような。
C#のフォームアプリケーションを試してみたので、メモを残しておく。



まずは単純にフォームを表示するだけ

  1. VisualStudio or VisualC#を立ち上げる。
  2. 「ファイル」→「新しいプロジェクト」→「Windowsフォームアプリケーション」
完成! あらやだ簡単。なにもないフォームを表示するだけだけど。
ここから色々いじくっていくのだ。

フォームデザイナを使う


C#にはフォームデザイナという機能があって、
メニューやテキストボックスなどのコントロールをグラフィカルに追加できる。
試しに使う方法と使わない方法を試してみたけど、使ったほうが圧倒的に楽。
デザインを変更するときもぽちぽちするだけですむのはありがたい。

  1. デザイナを開いた状態で右側の「ツールボックス」へマウスオン
  2. 使いたいコントロールをデザイナ上の好きな場所へドラッグオンドロップ

イベントハンドラを追加する


フォームアプリケーションは
ボタンを押す、指定時間経過などのイベントにしたがって処理を行う「イベント駆動方式」。
ちゃんと意味を理解したのはいまさらだったりする。我ながらひでえ。
そんなわけで、ユーザーのアクションに対して適切な処理を行うためには、
イベントを追加してやらにゃなりません。
デザイナを使用していると、これも簡単に行える。(クリック系の処理に限る)

  1. 追加したコントロールをダブルクリック。
  2. ソースコードにイベントハンドラ定義用の関数が追加され、ついでにそこが開く。
  3. 処理を書き込む。



とりあえず基本中の基本をやってみたのをまとめてみた。
これだけでも簡単なツールは作れると思う。
イベントもほしいイベントは大抵用意されているので、ちょっと調べればすぐ出てくる、はず。

javascript でtrim

ちょくちょくjavascriptを使う機会が出てきたような、そうでもないような。
環境に依存するところもあるけど、いろんな環境でサポートされているので、
覚えておくと後々便利そうだと思った。



意外なことにjavascriptにはtrim関数がないので、
replaceを使ってそれっぽい処理を実装する必要がある。

参考サイト
Javascript で trim するには

上記サイトより
/*---------------------------------------------------------------------------*/
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, "");
}
String.prototype.ltrim = function() {
    return this.replace(/^\s+/, "");
}
String.prototype.rtrim = function() {
    return this.replace(/\s+$/, "");
}
/*---------------------------------------------------------------------------*/

リテラルの最後の/の後にgを入れると条件に該当する全ての要素に対して
処理をしてくれるもの、と思われる。調べた感じ。

正規表現を使って、行頭・行末の文字を検索している。
できればスペース以外のやつもtrimで排除できるといいな、
と思ったんだけども予想以上に面倒そう。
その場合は素直にreplaceを呼んだほうが早いかもしれない。




2013年11月5日火曜日

CakePHP2.x フォルダのファイルを全て削除する

とりあえずwebroot以下にあるhogeフォルダのテキストファイルを削除する。

/*---------------------------------------------------------------------------*/
    App::uses( "Folder", "Utility" ); 
$dir = new Folder( WWW_ROOT."hoge".DS );
$files = $dir->find( '.*\.txt' );
foreach( $files as $file ) {
$file = new File( $dir->pwd().DS.$file );
$file->delete();
}
/*---------------------------------------------------------------------------*/

webroot以下のファイルは基本リソースになるので
プログラムで消す機会はそうそうないとは思うけども。

2013年11月4日月曜日

android-ndk インストールからテストまで

久しぶりにandroidをいじろうと思ってeclipceを立ち上げたら、アプリケーションの実行時に以下のエラーが出て動かなくなった。

 /*---------------------------------------------------------------------------*/
    failed to initialize monitor thread: unable to establish loopback connection
/*---------------------------------------------------------------------------*/

ネットで軽く調べても原因がわからんかったので、いっそのこと最初から入れなおしてやる! と奮起した。
その際に悪戦苦闘したのでメモを残しておく。

AndroidSDKインストール(ついでに日本語化も)


参考サイト
Androidアプリケーション開発環境の構築(ADTバンドル版SDK編)
Android開発をJava 7で行う
  1. AndroidSDKをダウンロードして適当なフォルダに解凍
  2. Java SE Development Kit (JDK)をダウンロード。インストール。
  3. Pleiadesをインストールして解凍
  4. 解凍したフォルダのfeaturesとpluginsのフォルダをeclipce内の同名フォルダに上書き
以上。今のSDKはeclipceが同梱されているバージョンが配布されており、昔に比べて余計な設定の必要がなくてとても楽になった。
JDKは推奨バージョンじゃない場合は「設定」からjreを追加してコンパイラ準拠レベルを推奨バージョンに変更する必要があるらしい。

AndroidNDKインストール



参考サイト
Android NDKを使った開発環境の構築
  1. AndroidNDKをダウンロードして適当なフォルダに解凍。
  2. 「設定」「Android」「NDK」からNDK Locationを解凍したフォルダに設定する
おしまい。

AndroidSDKのサンプルを実行してみる


新しい環境も整えたところで、もうようわからんエラーは出ないだろう、と意気揚々と適当なサンプルを実行。
はい、また同じエラー出ました!

 /*---------------------------------------------------------------------------*/
    failed to initialize monitor thread: unable to establish loopback connection
/*---------------------------------------------------------------------------*/

ええい! なんなのだ貴様は! と本腰入れて調査を開始。
で、仕方ないから全然読めない英語を雰囲気から読み取りつつ見つけた情報を試す。
eclipce.iniの末尾に以下の設定を追加。

/*---------------------------------------------------------------------------*/
    -Djava.net.preferIPv4Stack=true
/*---------------------------------------------------------------------------*/

動いたー! とりあえず原因までは調べてないけど動くようになったので先に進む。
あとで調べようとは思っているけど、誰か理由がわかる人がいたらよければ教えてください。

AndroidNDKサンプルを実行する


SDKも動いたところで、NDKも大丈夫だろうととりあえずGLES使っているサンプルを実行。
この時にエミュレータの「ホストGPUを使用する」の設定にチェックを入れとかないと
動かないので気をつけよう。
それから、Nexus7を使うとなぜかエミュレータが動かなくなる。別のマシンなら問題なし。なぜ?

で、この一連の作業してる時に知ったんだけど、
今のeclipceってcygwinがなくてもNDKのビルドできるのね。
プロジェクトを右クリックして「Androidツール」のサブメニューから「Add Native Support」を選択。
で、表示されたダイアログをOK。名前は変えても変えなくてもいい。
命名規則に従う形にするのが無難かな?
これだけでNDKのビルドができるようになる。

そしてついに実行。そしてさすがというべきかやはりというべきか、エラー。というか落ちた。
こういう時こそデバッガの出番だぜ! と思って起動したらこっちもエラー。なんじゃそりゃ。

/*---------------------------------------------------------------------------*/
   Unable to detect application ABI's
/*---------------------------------------------------------------------------*/

こんな感じのエラーが出てきまして。
他にもずらずら出てる大量のエラーを読み解く。

どうもAndroidManifest.xmlの設定がよろしくないっぽい。
APP_PLATFORMのバージョンとminSdkVersionが違うよ、と怒られているんだと思う。
実際minSdkVersionをAPP_PLATFORMに合わせたらこのエラーは出なくなった。

でも別のエラーで怒られた。
NDK_DEBUG=1がどうこうというメッセージが出ていたので、
プロジェクトのプロパティからビルドオプションにNDK_DEBUG=1を付けたしてやると動いた。
ちなみに後でもう一回試してみたら、オプションを付加しなくても怒られない不思議。


中途半端だけどいろいろ限界なので一回ここでやめる。
続きはまた気が向いたときに追記か新しい記事で。




/** 11/19 追記 **/

結局サンプルは動かせなかったけれど、
適当に作ったndkのプロジェクトが動くところまでは行った。
メモメモ。

参考サイト
Windows で Android NDK を使ってみる

結局デバッグはこれでもうまくいかなかった。
その原因は、なんてこったい。パスの通し忘れだった。
環境変数PATHを設定する。

/*---------------------------------------------------------------------------*/
 C:\android\android-ndk
/*---------------------------------------------------------------------------*/

実際には自分の環境のNDKを解凍したフォルダにパスを通す。
ついでにSDK周りのPATHもチェックしたらこっちは大丈夫だった。
これをやったらデバッグはできるようになった。
でも、相変わらずglesを使ったプロジェクトは落ちるし、サンプルは動かない。

どこのサイトで見たのかは忘れたけど、
エミュレータだとglesのプロジェクトが動かない、というのがあったような気がする。
GPUだかハードウェアだかがどうだか。
実機でテストしようと思ったら、持ってる端末がくそ過ぎてPCにデバイスがダウンロードできない。
glesはまたの機会に持ち越しだ! 諦めたわけじゃないよ!

んで、サンプルのほうは、どうもバージョンによる違いが出てるみたい。
サンプルによってはそもそもビルドすら通らないこともざらにある。
なので、もういっそのこと新規プロジェクトを作ってみたら、普通に動いた。
公式サンプルが信用できないってどうなのよ?

以上。
一応インストールから空のプロジェクトの実行まで。
glesは諦めたわけじゃない。諦めたわけじゃ、ないんだ。

2013年11月1日金曜日

cakephp2.x 他のコントローラのビューを使用する

ひとつのコントローラから別のコントローラのビューを使用したいときはこうする。

/*---------------------------------------------------------------------------*/
    $this->render( "../controller/view" );
/*---------------------------------------------------------------------------*/

コントローラごとに機能を分けるのが理想であって、極力使わないほうがいいんだろうけど。