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端末なのでディスクに限界はあるが、PHPMySQLが動けば色々なことができる。
また、MSMTPも動くので、Webアプリからメールを送信することもできるだろう。

Eclipseで作ったアプリをJava IDE (Android)でビルドする

以前も紹介したが、Androidバイス上でアプリをビルドできるJava IDE (Android)〔旧名:Java IDE (driod)〕と言うものがある。
今回はその使用例として、Eclipse上で作成した簡単なアプリを、Java IDE (Android)でビルドする手順を紹介しよう。

手順

  1. EclipsePleiades 4.4 LUNA版、Android SDK R24.0.2)でAndroidプロジェクトを作成する。今回の例では、以下の動作をするHelloアプリを作成した。
    • 起動時はタイトルに「こんにちは」、画面上部に「現在時刻」ボタン、画面中央に「世界よ、こんにちは!」メッセージが表示される。
    • 「現在時刻」ボタンをタップすると、「世界よ、こんにちは!」メッセージが現在時刻に変わる。また、現在時刻がトースト表示される。
  2. Android端末をUSBケーブルでPCに接続し、ポータブルデバイスとしてPCに写ったディレクトリ「/sdcard」に、作成したAndroidプロジェクトのフォルダ「Hello」をコピーする。
  3. 「/sdcard/Hello」ディレクトリに下記のJava IDEプロジェクトファイル「Hello.jip」を作成する。
  4. 以下の各ディレクトリにある「style.xml」で「<style name="AppBaseTheme" parent="***">」の「***」に当たる部分を削除する。
    • /sdcard/Hello/res/values/
    • /sdcard/Hello/res/values-v11/
    • /sdcard/Hello/res/values-v14/
  5. 「/sdcard/Hello/res/menu/main.xml」の「app:showAsAction="never"」を削除する。
  6. 「/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」とする。
  7. 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でのアプリ実行時にタイムアウトが起きる場合の対処

EclipsePleiades 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待ちのタイムアウトを長めに設定すると良い。

  1. Eclipseメインメニューで「ウィンドウ」→「設定」を選択。
  2. 左ツリーで「Android」→「DDMS」を選択。
  3. 右画面で「ADB 接続タイム・アウト (ミリ秒)」を「5000」→「120000」に変更。
  4. 「適用」ボタン、または、「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のモバイル学習環境を入手しよう。

インストール手順

1. Android端末にSuperSUをインストール

名前の「for root」が示すように、インストールに必要なroot権限を得るためにSuperSUをインストールする。

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端末の「USBデバッグ」をオン

詳細は以前の記事を参照して欲しい。

Android端末にSuperSUをインストール

リバーステザリングではAndroid端末側に「Usb tunnel」と言うアプリがインストールされる。
この「Usb tunnel」の動作に必要なroot権限を得るためにSuperSUをインストールする。

PCにAndroid Reverse Tetheringをインストール

このページにアクセスし、ページ内で「Attached Files」を検索して、「Android Reverse Tethering」のZIPファイルをダウンロードする。
今回ダウンロードしたのは「ReverseTethering_3.19.zip」である。
ZIPファイルを適当なローカルフォルダに展開すれば、インストールは完了となる。

AndroidToolの実行

Android端末をUSBケーブルでPCに接続し、前項でZIPファイルを展開したフォルダに存在する「AndroidTool.exe」をエクスプローラで実行する。


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すると良さそうだ。