6月 24

Macで古いJDK(Java SE)をアンインストールする方法。Oracleのページに解説がありました。このページ最後の Uninstalling the JDK というパラグラフに書いてありますが、単純にrmコマンドで当該ディレクトリ以下を削除すればよいようです。

$ cd /Library/Java/JavaVirtualMachines/

$ ls -al
total 0
drwxr-xr-x 5 root wheel 170 6 19 02:40 .
drwxr-xr-x 5 root wheel 170 9 19 2014 ..
drwxr-xr-x 3 root wheel 102 9 19 2014 jdk1.8.0_20.jdk
drwxr-xr-x 3 root wheel 102 3 11 23:07 jdk1.8.0_40.jdk
drwxr-xr-x 3 root wheel 102 6 19 02:40 jdk1.8.0_45.jdk

$ du -sh *
312M jdk1.8.0_20.jdk
327M jdk1.8.0_40.jdk
327M jdk1.8.0_45.jdk

$ sudo rm -rf jdk1.8.0_20.jdk

$ sudo rm -rf jdk1.8.0_40.jdk

上記は削除までの流れですが途中duコマンドで消費サイズ調べたら1個あたり300MB以上ありました。頻繁に更新するけど削除した記憶がない人はたぶんごっそり残ってるでしょうから、もう使わないものをザックリ消せば空き容量稼げるでしょう。

12月 25

Play Framework プロジェクトを activator eclipse でeclipse用に設定した後にconf/routesを書き換えても反映されなかったのですが、一度 activator clean を実行しないといけないらしい。

12月 20

Java,Scala言語用フレームワーク Play Framework について、インストールからeclipseとの連携までを記載。基本的に公式ページ(日本語訳あり)を見ながらやるのがよいと思うのでここでは軽く流す程度にしておきます。※注意:Rails勉強中に見つけて興味持った程度なので詳しくはありません。

Play Framework 公式ページ。
https://www.playframework.com/
Play Framework ダウンロードページ。
https://www.playframework.com/download
ドキュメント。(2.3.x系、日本語)インストール・開発方法など一通り解説あり。
https://www.playframework.com/documentation/ja/2.3.x/Home

1.activator ダウンロード&インストール

今回試したPlay Frameworkのバージョンは2.3.7(activator 1.2.12)です。古いバージョンはメインとなるコマンドがplayコマンドでしたが、最近のバージョン(2.3以降?)ではactivatorというより汎用的なコマンドに変わっています。ダウンロード&ZIP展開してどこか適当なディレクトリに配置します。その他 Play Framework を使うにはJDK6以上が必要とのことなのでなければダウンロード&インストールしておきます。

2.環境整備

java, javac, activator コマンドがコマンドプロンプトで実行できるようPATH環境変数を設定します。設定後コマンドプロンプトを起動して

$ java -version
$ javac -version
$ activator help

を実行してバージョン情報・ヘルプ等表示されればOKでしょう。

3.プロジェクト作成

Playプロジェクトを作成するには“activator new [プロジェクト名]”を実行します。

$ activator new myapp

初回実行時は必要なファイルをダウンロードするので多少時間がかかります。しばらくするとプロジェクトの元となるテンプレートをどれにするか選択を求める画面が表示されます。

Fetching the latest list of templates…

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
1) minimal-akka-java-seed
2) minimal-akka-scala-seed
3) minimal-java
4) minimal-scala
5) play-java
6) play-scala
(hit tab to see a list of all templates)

ここではJavaベースプロジェクトを作成するので“5) play-java”を選択します。これでmyappディレクトリの中にJavaベースのPlayプロジェクトが作成されました。activatorコマンドのプロジェクト名の後ろにテンプレート名を直接指定することも可能。

$ activator new myapp play-java

テンプレート選択画面にリンクがありますがテンプレートリストはhttp://typesafe.com/activator/templatesを参照。

4.実行&ブラウザで確認

プロジェクトを作成するだけで実行に必要なファイル・設定などが一式作成されますのですぐに実行できます。プロジェクトディレクトリに入って“activator run”を実行します。

$ cd myapp
$ activator run

ここでも初回実行時に必要なファイルをダウンロードするので多少(かなり?)時間がかかります。以下のようなメッセージが表示されたらサーバ起動成功です。

— (Running the application, auto-reloading is enabled) —

[info] play – Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console…)

ブラウザで“http://localhost:9000”にアクセスするとmyappプロジェクトの画面が表示されます。サーバ終了はCtrl-Dです。サーバ起動時にbind関連エラーが表示されるときは既に同じポート(9000)を他のプログラムがLISTENしている可能性があります。netstatコマンド等で確認してそのプログラムを停止するか、以下のようにしてLISTENポートを他の番号にしてください。

$ activator “run 9001”

※ダブルクォーテーションは必須です。
詳しくはこのあたりが参考になると思います。

5.Javaソース編集&ブラウザアクセス

ブラウザでアクセスしたときにまだコンパイルされていないJavaソースファイルがあると自動的にコンパイルされます。つまりJavaソースファイル修正&ブラウザアクセスだけで修正が反映されるということです。プロジェクトディレクトリ内にあるapp/controllers/Application.javaの

return ok(index.render(“Your new application is ready.”));

return ok(index.render(“Hello, World!”));

に変更してブラウザでアクセスすると、自動的にコンパイルされて変更後の内容がブラウザに表示されます。

6.eclipseにプロジェクトをインポート

Playではプロジェクトをeclipseにインポートできるよう設定を調整する機能が付いています。プロジェクトディレクトリ内で下記コマンドを実行するとeclipseにインポートできるようになります。

$ activator eclipse

コマンド実行後”[info] Successfully created Eclipse project files for project(s):”といった文字列が表示されれば完了。eclipseを起動してプロジェクトをインポートすればeclipseで開発できるようになります。

7.eclipseでデバッグ実行

eclipseでデバッグ実行するやり方。まずactivatorコマンドに-jvm-debug引数を付けてJavaVMをデバッグできる状態で起動します。

$ activator -jvm-debug run

次にeclipseのプロジェクト名を右クリックして「デバッグ」-「デバッグの構成」を選択。「リモートJavaアプリケーション」を選択して「新規の起動構成アイコン」を押下。デバッグ実行したいプロジェクトを選択してポート番号を9999(-jvm-debugのデフォルトポート)に変更して、適用ボタン押下、デバッグボタンを押下します。エラーダイアログ等表示されなければデバッグ状態になっています。先ほど編集したapp/controllers/Application.javaのindex()メソッドのreturn文にブレークポイントを貼ってブラウザでアクセスすると、そのブレークポイントで停止するはずです。

デバッグ用ポート番号はデフォルトで9999です。変更したいときは-jvm-debugの次に指定します。

$ activator -jvm-debug 9991 run

HTTPサーバ用ポートとデバッグ用ポート両方変更したいときは以下のようにします。

$ activator -jvm-debug 9991 “run 9001”

12月 10

ようやく時間ができたので以前から興味あった Ruby とか Ruby on Rails いじって遊んでます。Ruby on Rails 4 アプリケーションプログラミングという本がよさげなのでこの本で勉強中(というか遊び中)なのですが、第1章 導入編 の Ruby や Ruby on Rails をインストール・セットアップしている箇所でいくつか躓いた・気になった点があったのでそれらについてメモっておきます。

1.Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

railsとかbundleコマンド使って何かしようとするとこのエラー(SSL証明書認証失敗?)が表示されて何もできなくなることがあります。対策がココにありました。同ページ中程の“Manual solution to SSL issue”に対応の仕方があります。簡単に説明すると、新しい証明書(AddTrustExternalCARoot-2048.pem)を入手して、RubyGems の証明書ディレクトリ(例えば、C:\Ruby21-x64\lib\ruby\2.1.0\rubygems\ssl_certs)に新しい証明書をコピーでOK。これで”certificate verify failed”のエラーは出なくなります。

この他に RubyGems のバージョンをアップグレードすれば解決するという話もありますが、Windows版RubyGemsの2.4系はバグ報告があって推奨していないらしいです。(RubyInstaller 同梱 RubyGems は 2.2.2)

あとは、Gemfile の source ‘https://rubygems.org’ を http にすればOKってのも見つけましたが…個人的にhttpsをhttpにすれば解決ってのはイヤな感じです。

2.No source of timezone data could be found. (TZInfo::DataSourceNotFound)

これは Windows 64bit 版 Ruby 固有らしいです。
Gemfile の
gem ‘tzinfo-data’, platforms: [:mingw, :mswin]

gem ‘tzinfo-data’, platforms: [:mingw, :mswin, :x64_mingw]
にして bundle update すればOK。

3.DL is deprecated, please use Fiddle が表示される件

例えば rails -v でバージョン情報を表示するときに”DL is deprecated, please use Fiddle”と表示されます。これについて『たのしいRuby 第4版』正誤表に少し解説があります。原因は Ruby Installer for Windows に添付されている readline ライブラリが DL という古いライブラリを使っているために表示される警告で、使用上は特に問題ないそうです。deprecated なので新しいバージョンではFiddleになって表示されなくなるかもしれませんね。(放置かもしれません)

5月 31

C#でHttpWebRequest,HttpWebResponseあたり使ってHTTP通信したときWebサーバが 500 Internal Server Error など返してくるとWebExceptionが発生しますが、このときのステータスコード(500)を取りたいときは以下のようにします。

try {

} catch (WebException e) {
statusCode = (int)((HttpWebResponse)e.Response).StatusCode;
}

ちなみにWebサーバー落ちてるときも同様にWebException発生しますがe.Response==nullなのでnullチェックは入れておいた方がいいと思います。

10月 27

Javaでメソッドやクラスなどに@Deprecatedというアノテーションを付けると非推奨にできます。

開発環境によりますが例えばeclipseでは非推奨メソッドを使っているところでは取り消し線が引かれるので視覚的にわかりやすくて重宝します。

C#でこれと同じようなことをするにはObsolete属性を使います。

Obsolete属性を付けるとコンパイル後使用箇所に波線が表示されます。引数なしだと単なる警告として処理されます。引数に文字列を記述すると、エラー一覧ウィンドウの説明に引数の文字列が表示されます。

デフォルトは警告扱いですがエラーとして扱いたいときは第2引数にtrueを指定します。

言うまでもありませんが、警告はビルドできますがエラーはビルドに失敗します。ケース・バイ・ケースで使い分けるといいでしょう。

6月 04

SQL Server のファイルをCドライブからDドライブに移動したかったのでやり方を調べたら、ALTER DATABASE 文を使えばできることがわかりました。
http://msdn.microsoft.com/ja-jp/library/ms189133.aspx
とか
http://msdn.microsoft.com/ja-jp/library/ms345483.aspx
を見ながらやればできるのですが、最後にONLINEにするときにアクセスエラーがでました。

メッセージ 5120、レベル 16、状態 101、行 1
物理ファイル “D:\MSSQL_DATA\sample_db.mdf” を開けません。オペレーティング システム エラー 5: “5(アクセスが拒否されました。)”。
メッセージ 5120、レベル 16、状態 101、行 1
物理ファイル “D:\MSSQL_DATA\sample_db_log.ldf” を開けません。オペレーティング システム エラー 5: “5(アクセスが拒否されました。)”。
メッセージ 945、レベル 14、状態 2、行 1
ファイルにアクセスできないか、メモリまたはディスク領域が不足しているので、データベース ‘sample_db’ を開けません。詳細については、SQL Server エラー ログを参照してください。
メッセージ 5069、レベル 16、状態 1、行 1
ALTER DATABASE ステートメントが失敗しました。

どうも、移動したファイルに SQL Server 用の権限を付与する必要がある模様。やりかたは、「プロパティ」-「セキュリティ」-「編集」-「追加」-「詳細設定」-「検索」ボタンを押して、「検索結果」内の「SQLServerMSSQLUser$xxx$yyy」(名前は環境によって違うかも)をダブルクリックして追加。アクセス許可ダイアログに戻って「SQLServerMSSQLUser$xxx$yyy」のフルコントロールの許可をチェックして、「特殊なアクセス許可」以外にチェックが付くようにします。この状態で、ALTER DATABASE ~ SET ONLINE;を実行したところ問題なく処理されました。本当にこれでいいのかどうかは不明。一応テーブルの読み書きはできてます。ちなみ確認した環境は、SQL Server 2008 R2 Express Edition です。

2月 17

.NET Framework (C#)でコンボボックスの値に列挙体(Enum)のメンバーを指定する簡単な方法です。

// 値の設定
comboBox1.DataSource = Enum.GetValues(typeof(ComboBoxStyle));
// 値の取得
ComboBoxStyle style = (ComboBoxStyle)comboBox1.SelectedValue;

これはComboBoxStyle列挙体メンバーSimple,DropDown,DropDownListをコンボボックスの値として使用する例です。普通のアプリケーションでは列挙体のメンバー名をそのまま画面表示に使うことはないと思いますが、例えばデバッグとかテスト用アプリケーションで条件としてEnum値を指定できるようにしたいなんてときに使えると思います。

6月 02

#pragma mark でコメントを書くとそれがXcodeの関数リストに表示されるのでわかりやすくていい感じです。

こんな感じでコメントが関数リストに表示されます。日本語使えるのがいいですね。
コメント部分を”-“(ハイフン)にするとセパレータになります。

ちょっとしたことですが有効活用すれば効率上げられそうです。

6月 02

Xcode環境から現在作成中のアプリケーションを起動するときに引数を付けて起動したい!なんてことが度々あります。これをやるにはXcodeの左側ツリーの「実行可能ファイル」内の対象ファイルを選択してから右クリックして「情報を見る」ー「引数」です。

ここに「起動時に渡される引数」を設定できます。追加した引数毎にチェックボックスが付いていてON・OFFで有効・無効を指定できるので結構便利です。

NSLogを使って引数リストを出力してみます。

NSProcessInfo * processInfo = [NSProcessInfo processInfo];
NSLog(@”arguments=%@”, [processInfo arguments]);

出力結果は以下のとおり。(「実行」ー「コンソール」の出力)

2011-06-02 00:58:19.541 Args[34204:a0f] arguments=(
“/Users/foo/Documents/Args/build/Debug/Args.app/Contents/MacOS/Args”,
“-d”,
“/tmp”,
“-d”,
“/tmp”,
“-d /tmp”
)

設定画面でチェックボックスを付けた引数文字列を空白デリミタで単純連結して実行しているようです。設定画面の3番目の -d /tmp はそれぞれ別の引数として解釈されています。空白を含めたい場合は5番目の”-d /tmp”のようにダブルクォーテーションで括ればいいみたいです。このあたりはUnixそのままですね。ABCという引数はチェックボックスがOFFなので引数として渡されません。

引数の設定画面では各引数の編集ができるほか、ドラッグすれば順番の入れ替えもできますのでテストする上でかなり便利に使えると思います。

preload preload preload