Rails 4.1.8でExecJS::ProgramErrorが発生する
随分前に会社の人からもらった本「たのしい開発 スタートアップRuby」を読んで、今更だがRuby on Railsを試して見た。
RailsのインストールにはRailsInstallerを使用した。
現時点のRailsのバージョンは4.1.8で、本に記載の3.2.1よりも随分と新しい。
Railsと合わせてインストールされるRubyのバージョンは2.1.5だった。
動作環境はWindows 7 Home Premiumである。
本に記載の手順で以下のコマンドを実行すると、さっそくエラーが発生した。
> rails new hoge_app : : run bundle install : : Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://rubygems.org/gems/threa d_safe-0.3.5.gem) An error occurred while installing thread_safe (0.3.5), and Bundler cannot continue. Make sure that `gem install thread_safe -v '0.3.5'` succeeds before bundling.
上記メッセージの指示通りに「gem install」を実行しても、次々と同様のエラーが発生する。
> gem install thread_safe -v '0.3.5' > cd hoge_app > bundle install : : Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://rubygems.org/gems/execj s-2.4.0.gem) An error occurred while installing execjs (2.4.0), and Bundler cannot continue. Make sure that `gem install execjs -v '2.4.0'` succeeds before bundling.
これを解決するために、hoge_appフォルダ以下のGemfileの先頭行を変更した。
source 'https://rubygems.org' ↓ source 'http://rubygems.org'
上記修正で「bundle install」は成功したので、次のステップに進んだ。
> rails g scaffold book title:string memo:text > rake db:migrate > rails s
WEBrickによるWEBサーバが起動するので、WEBブラウザで以下のURLにアクセスするとエラーが発生した。
- URL
- http://localhost:3000/books
- エラー
- ExecJS::ProgramError in Books#index
コントローラでcoffeeスクリプトがエラーになったようだ。
幸い同様の事例が見つかったので、そのページに記載の方法で解決することができた。
- 参考
- http://qiita.com/scivola/items/ec7625118fcf6de5203a
- 解決策
- 以下のようにGemFileでcoffee-script-sourceのバージョンを指定する行を追加。
次に「bundle update coffee-script-source」を実行。
gem 'coffee-rails', '~> 4.0.0' ↓ gem 'coffee-rails', '~> 4.0.0' gem 'coffee-script-source', '1.8.0'
これで正常に動作した。
Palapa Web ServerでPHP/MySQLを動かす
Android端末(MeMO Pad HD7)で動くWebサーバを探したところ、Palapa Web Serverが見つかったのでさっそくインストールしてみた。
端末のブラウザで http://127.0.0.1:8080/ にアクセスすると、何もないディレクトリが表示された。
HTTPサーバであるLighttpdのドキュメントルートはデフォルトで /sdcard/pws/www となるので、以下のお決まりの phpinfo.php を保存し、ブラウザで http://127.0.0.1:8080/phpinfo.php にアクセスすると、ちゃんとPHPの各種設定が表示される。
<?php phpinfo(); ?>
MySQLには残念ながらmysqlコマンドは付属していないので、データベースの作成などの初期設定をするためにはphpMyAdminでアクセスすることになる。
Palapa Web Serverのアプリの「DB Server Settings」でphpMyAdminをオンラインでインストールし、ブラウザで http://127.0.0.1:9999/phpmyadmin/ にアクセスすると、phpMyAdminのログイン画面が表示されるので、Palapa Web Serverのサイトに記載のユーザ名とパスワードでログインできるので、後は好きにすれば良い。
なお、Sourceforgeにある phpMyAdmin-4.1.14.8-all-languages.zip をインストールすれば、日本語でphpMyAdminが使えるようになるので便利である。
Android端末なのでディスクに限界はあるが、PHPやMySQLが動けば色々なことができる。
また、MSMTPも動くので、Webアプリからメールを送信することもできるだろう。
Eclipseで作ったアプリをJava IDE (Android)でビルドする
以前も紹介したが、Androidデバイス上でアプリをビルドできるJava IDE (Android)〔旧名:Java IDE (driod)〕と言うものがある。
今回はその使用例として、Eclipse上で作成した簡単なアプリを、Java IDE (Android)でビルドする手順を紹介しよう。
手順
- Eclipse(Pleiades 4.4 LUNA版、Android SDK R24.0.2)でAndroidプロジェクトを作成する。今回の例では、以下の動作をするHelloアプリを作成した。
- 起動時はタイトルに「こんにちは」、画面上部に「現在時刻」ボタン、画面中央に「世界よ、こんにちは!」メッセージが表示される。
- 「現在時刻」ボタンをタップすると、「世界よ、こんにちは!」メッセージが現在時刻に変わる。また、現在時刻がトースト表示される。
- Android端末をUSBケーブルでPCに接続し、ポータブルデバイスとしてPCに写ったディレクトリ「/sdcard」に、作成したAndroidプロジェクトのフォルダ「Hello」をコピーする。
- 「/sdcard/Hello」ディレクトリに下記のJava IDEプロジェクトファイル「Hello.jip」を作成する。
- 以下の各ディレクトリにある「style.xml」で「<style name="AppBaseTheme" parent="***">」の「***」に当たる部分を削除する。
- /sdcard/Hello/res/values/
- /sdcard/Hello/res/values-v11/
- /sdcard/Hello/res/values-v14/
- 「/sdcard/Hello/res/menu/main.xml」の「app:showAsAction="never"」を削除する。
- 「/sdcard/Hello/src/to/msn/wings/hello/MainActivity.java」で「btn.setOnClickListener」メソッドに登録する「View.OnClickListener」を親クラスとした無名クラスの「onClick」メソッドの「@Override」アノテーションを削除する。また、「import android.support.v7.app.ActionBarActivity;」の代わりに「import android.app.Activity;」とし、「public class MainActivity extends ActionBarActivity」の代わりに「public class MainActivity extends Activity」とする。
- Java IDE (Android)に下記の「Hello.jip」を指定してアプリをビルドする。
Hello.jip
{ "stName":"Hello", "stLibsDir":"", "bUseTimeLog":false, "stDexlibsDir":"", "stExcludeDirs":"", "stMainJava":"src\/to\/msn\/wings\/Hello\/MainActivity.java", "stAPK":"", "stAssetsDir":"", "stAndroidJarPath":"" }
サンプル
AVDでのアプリ実行時にタイムアウトが起きる場合の対処
Eclipse(Pleiades 4.4 LUNAを使用)でAndroidアプリを実行したとき、AVD(Android Virtual Deviceのこと、Android SDK 24.0.2を使用)の起動や応答が遅いために以下のようなエラーが「コンソール」ビューに出力され、結局、アプリの実行に失敗することがある。
[2015-01-05 00:37:16 - プロジェクト名] Waiting for HOME ('android.process.acore') to be launched... [2015-01-05 00:38:32 - プロジェクト名] emulator-5554 disconnected! Cancelling '開始アクティビティ名 activity launch'!
[2015-01-05 00:59:40 - プロジェクト名] Uploading プロジェクト名.apk onto device 'emulator-5554' [2015-01-05 00:59:45 - プロジェクト名] Failed to install プロジェクト名.apk on device 'emulator-5554': タイムアウト [2015-01-05 00:59:46 - プロジェクト名] 起動はキャンセルされました!
このようなエラーが発生する場合、以下の手順で、ADB待ちのタイムアウトを長めに設定すると良い。
- Eclipseメインメニューで「ウィンドウ」→「設定」を選択。
- 左ツリーで「Android」→「DDMS」を選択。
- 右画面で「ADB 接続タイム・アウト (ミリ秒)」を「5000」→「120000」に変更。
- 「適用」ボタン、または、「OK」ボタンをクリック。
以上(メモ)
SQLで色々計算する小技
なんとかごとの合計/集計/平均
SELECT nantoka,SUM(numbmer) FROM table GROUP BY nantoka ORDER BY nantoka; SELECT nantoka,COUNT(numbmer) FROM table GROUP BY nantoka ORDER BY nantoka; SELECT nantoka,AVG(numbmer) FROM table GROUP BY nantoka ORDER BY nantoka;
EXCELのVLOOKUPみたいな方法
UPDATE table1 INNTER JOIN table2 ON table1.field1 = table2.field1 SET table1.field2 = table2.field2; UPDATE table1 INNTER JOIN table2 ON table1.field1 = table2.field1 INNTER JOIN table3 ON table1.field3 = table3.field3 SET table1.field2 = table2.field2, table1.field4 = table3.field4;
EXCELの重複を削除みたいな方法
SELECT DISTINCT(field) FROM table;
SQLite Installer for RootでSQLのモバイル学習環境を入手
どのバージョンからかは不明だが、少なくともASUS MeMO Pad HD7のAndroid 4.2.2には存在しないsqlite3をインストールして、SQLのモバイル学習環境を入手しよう。
インストール手順
2. SQLite Installer for Rootでsqlite3をインストール
1) Google PlayからSQLite Installer for Rootをインストールし、実行すると以下の画面が表示されるので、「Install」ボタンをタップする。
3) 左上のバージョンをタップすると、インストール可能なsqlite3のバージョンが一覧できる。
4) 最新のバージョン(3.7.6)を選択して「Go」ボタンをタップする。
5) 進捗画面が表示される。
6) root権限の許可画面が表示されるので「許可」ボタンをタップする。
7) sqlite3のインストールが完了する。
アプリ内課金について
Google Playでアプリ内課金があると表示されていたので、インストールするのに躊躇したが、メイン画面の「Remove ADs」ボタンで広告表示を消すために必要なだけで、sqlite3をインストールするのには何の障害もなかった。
実際にsqlite3を使ってみる
Android端末のUSBデバッグをオン(詳細は以前の記事を参照)にし、PCに接続してからコマンドプロンプトを開いて、以下のコマンドを実行する。
> adb shell shell@android:/ $ cd sdcard cd sdcard shell@android:/sdcard $ sqlite3 hoge.sqlite sqlite3 hoge.sqlite SQLite version 3.7.16 2013-03-18 11:39:23 [www.ptsoft.org] [www.ptdave.com] Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> create table fruit ( create table fruit ( ...> name varchar(20), name varchar(20), ...> price int price int ...> ); ); sqlite> insert into fruit (name, price) values ("apple", 100); insert into fruit (name, price) values ("apple", 100); sqlite> insert into fruit (name, price) values ("orange", 50); insert into fruit (name, price) values ("orange", 50); sqlite> insert into fruit (name, price) values ("ayashii", 9999); insert into fruit (name, price) values ("ayashii", 9999); sqlite> select * from fruit; select * from fruit; apple|100 orange|50 ayashii|9999 sqlite> .header on .header on sqlite> .mode column .mode column sqlite> select * from fruit; select * from fruit; name price ---------- ---------- apple 100 orange 50 ayashii 9999 sqlite> .databases .databases seq name file --- --------------- ---------------------------------------------------------- 0 main /mnt/shell/emulated/0/hoge.sqlite sqlite> .q .q shell@android:/sdcard $ exit exit
PCからadbで操作してもモバイルの目的を果たしていないが、Terminal IDE(以前の記事を参照)で使用すれば目的は果たせる。
リバーステザリングでPCのネットワーク環境を使う
通常テザリングと言えば、携帯端末を経由してPCをネットワークに接続することだが、リバーステザリングは逆にPCを経由して携帯端末をネットワークに接続することである。
ここで紹介するリバーステザリングは、無線LANに接続できない環境にあるWiFiモデルのAndroid端末を、PC経由でネットワークに接続可能とする強力なものだ。
今回はASUS MeMO Pad HD7で試して見た。
手順は以下の通りである。
Android端末にSuperSUをインストール
リバーステザリングではAndroid端末側に「Usb tunnel」と言うアプリがインストールされる。
この「Usb tunnel」の動作に必要なroot権限を得るためにSuperSUをインストールする。
PCにAndroid Reverse Tetheringをインストール
このページにアクセスし、ページ内で「Attached Files」を検索して、「Android Reverse Tethering」のZIPファイルをダウンロードする。
今回ダウンロードしたのは「ReverseTethering_3.19.zip」である。
ZIPファイルを適当なローカルフォルダに展開すれば、インストールは完了となる。
Android端末を接続
前項で表示された「Android Reverse Tethering x.xx」画面の「Select a device」のドロップダウンリストが空欄の場合は「Refresh」ボタンをクリックする。
それでもドロップダウンリストが空欄の場合はUSBケーブルの接続状態を確認する。
ドロップダウンリストにデバイス名が表示されたら、「Connect」ボタンをクリックする。
PCに上記の画面が表示されてしばらくすると、Android端末で「Usb tunnel」がインストール&自動実行され、以下の画面が表示されるので「許可」ボタンをタップする。
接続が完了すると、「Android Reverse Tethering x.xx」画面の「Connect」ボタンが「Disconnect」ボタンに変化し、Android端末でネットワーク接続が可能となる。
通信できないAndroidアプリ
以下のメディア関連アプリは未対応のポートで通信を行うために動作しなかった。
ただし、AccuRadioはHTTP(80ポート)を使用しているので動作するようだ。
また、変わり種としては監視カメラソフトのアロバビュー モニター デモも動作したが、その際はHTTP以外にICL-TWOBASE2(25001ポート)を使用していた。
なお、Google Play(5228ポート)も正常に動作する。
調子が悪いときの対処
AccuRadioが接続し難い現象が発生している。
このように接続し難い場合はADBを一旦KILLすると良さそうだ。