2013/04/30

RubyMine

RubyMineの安売りを狙ってたのに、セール期間がいつの間にか始まり、知らない間に終わってた。
何か新しい言語を習得するときにIDEは割りと重要な役割を果たすと思う。VC++(標準機能のみ)はIDEが貧弱で苦労した。
Rubyには良いIDEが無いと思ってたが、RubyMineはすごく良かったのでぜひ欲しい。有償でも欲しいと思った。しかし安売り制度があるならそれを使いたい。
次の安売りはいつかな

2013/04/21

VisualStudioの使い勝手について

VisualStudio 2010の拡張機能プラグインに「VAssistX」と「AStyle」を入れた。少し追加設定は必要だが最高にやり易くなった。
AStyleの設定↓(個人的な好み、チームで開発する時はチームで決めるべき)
--style=kr --indent=force-tab=4 --pad-oper --pad-header --unpad-paren 
--mode=c 
設定は「ツール」→「オプション」で開くダイアログの中にAStyle Formatterが増えているはずなのでそこで行う。拡張機能の設定を行う場所はばらばらだ。メニューバーに増えていたりオプションダイアログに増えていたり…

しかし、その中のVAssistXは有償で、かなり高いことが分かったので、「Highlignterr」という拡張に入れ替えた。こちらは簡単な色分けだけだが十分見やすいので良し。

あと「Productivity Power Tools」というMS純正の拡張を入れた。VAssistXが使えなくなったのは残念だがこれでも十分。

EclipseやNetBeansを使いなれたJavaプログラマがデフォルト機能のみのVSを使うと使い勝手にかなりの不満を持つんじゃないだろうか。
 ・「AStyle」でオートフォーマット
 ・「Highlignterr」で変数の種類等によるコードの色分け
 ・「Productivity Power Tools」で関数名をCtrl+クリックでコード追跡
だけでも入っていれば最初に触れたときのギャップがかなり縮まると思う。
標準のコードハイライトとか最近のテキストエディタ以下だもんね。
自分も今まで仕事で仕方なく使ってたのだが、これらの機能が揃ってからは、VSでの作業が3倍くらい楽しくなった。
(拡張機能を探すときはVC++専用の拡張とかVB専用の拡張などがあるので注意が必要。)

Highlignterrは極稀にVisualSturioのエラー終了を引き起こす。ある操作をすると必ず落ちるんだよなぁ、って思ったときは先ずHighlignterrを無効化してみよう・・。

2013/04/20

MySQLとJRuby on Rails メモ

JRuby 1.5.6で運用してたがいつのまにか1.7.3まで出てた。深く考えずに更新してみた。

いろいろ変えることになった。
そもそも別にアップデートしないでも良いかなと思ってたが、RubyMineを使っていて「.find(:all,...)」は古いよ、と言われたので「.all(...)」に直した。
すると 実行段階で1.5にはそんなメソッド無いよ、と言われた。
で芋づる式にアップデートすることにしたら意外と初期設定とか忘れてることが多いのでまとめてメモる。

◆MySQLについて

最初からなのでMySQLについて最低限のコマンド類
> create database <DBName>;
> create user <userName>@"<hostname>" identified by "<password>";
> grant all on <DBName>.* to <userName>@"<hostname>";
これはリモートホスト<hostname>から、データベース<DBName>を使うユーザ<userName>さんを作成するコマンド(ちょっと間違ってたので修正)。
運用時の安心感のため、ダンプ出力とリストアのコマンドもメモる。
MySQLのコマンドラインではなく、コマンドプロンプトで
# mysqldump -u <userName> -p<password> <DBName> > dump.sql
# mysql -u <userName> -p<password> <DBName> < dump.sql
とやる。リストアの時は先にDBNameというデータベースを作成しておかないといけない。

◆JRuby on Railsが動くまで

config/database.yml でDB接続情報を正しく入れたら
プロジェクトフォルダ内で、
# rake db:migrate
でデータベースが作成される。

 プロジェクトフォルダ内で、
# jruby -S script/rails server
で起動する。( -e production でプロダクションモードで起動)。

さて実際にやってみるとdb:migrateで泥沼のようにはまる。
# rake db:migrate
と、久々にやったらInnoDBがオフになってたようで
 ActiveRecord::JDBCError: unknown storage engine 'innodb'
というエラーが出た。

my.ini で skip-innodb という行が有効になってたのでコメントアウトし、再起動。

# rake db:migrate
とやったら
 You have already activated rake 10.0.3, but your Gemfile requires rake 0.8.7
とりあえずrakeをさらにアップデートしてみる(←この対処方法は酷いかもw)
# bundle update rake

rakeは10.0.4になり、db:migrateをやると
 'rake/rdoctask' is obsolete and no longer supported. Use 'rdoc/task'
となった。

後に引けないのでGemfileの
「gem 'rails' '3.0.3'」 「gem 'rails'」にしてみる(railsも最新を使う)(よく分かんないけどちゃんとバージョン指定してやんないと。この書き方は良くないと思うよ)。
でbundle installやってdb:migrateすると一応うまくDBが作られた。

railsをスタートしてアクセスすると
 undefined method `debug_rjs=' for ActionView::Base:Class
というエラー。これは「config/environments/xxx」ファイルに記述されている、config.action_view.debug_rjs = trueが要らないらしいので削除。

最期に
 no such file to load -- /lib/jar/xxx.jar
とエラー。
あるrbファイルのrequire文だが、このパスの指定は確かに変だ。昔から間違えてたらしい。なんで動いてたんだろうねw
jar/xxx.jarに変更してやっといつもの画面が出た。

もうひとつ、JavaScriptライブラリがprototypeからjQueryに変わってたのでJavaScriptが動かなかった。手動でapplication.html.erbに
  <%= javascript_include_tag 'prototype' %>
などいくつかを追記し、全て動いたぞと。
さらに言語仕様の変更もあるだろうからその対応をすれば完璧。

…そんなとこかな?

2013/04/19

Refactoring Ruby on Rails

Rubyのメソッド名をキャメルケースからRuby準拠に書き改めている際に
"Template is missing ....."
というエラーが起きてしまった。調べると、

 http://stackoverflow.com/questions/6495046/template-is-missing
This error happens if you don't redirect in the create method of you controller.
Are you redirecting in the create method in the controller or rendering the new form, incase of error?
Without the redirect in the create method in the controller, you need to define create.html.erb. Usually, after successful creation, you redirect to some other page like shown below....

ということで、「メソッド名」と「ファイル名.html.erb」が対応していないと起こるエラーらしい。微妙な違和感もあるが、まぁJavaもクラス名とファイル名は対応させるもんね。

それよりRuby準拠の命名規則がRuby学習中には(覚えている限り)どこにも書いてなかったということが問題だ。そのせいで全面的にリファクタリングしなきゃならないことになったんだし。サンプルコードだけで察せよというのは無理だろう。
C言語もそうだけど、そういう重要なことはちゃんと周知徹底して欲しい。

今RubyMineを試用中で、色々指摘されている。↓を一度読んでみることが大事だ。
https://github.com/bbatsov/ruby-style-guide

# bad - how many 0s are there?
num = 1000000

# good - much easier to parse for the human brain
num = 1_000_000
マジかよそれはやり過ぎだって。

# Never use then for multi-line if/unless.
# bad
if some_condition then
  # body omitted
end

# good
if some_condition
  # body omitted
end
じゃぁ構文エラーにすればいいのに…

多少ビビる規則もあるが一読するとやり易くなると思った。

CoInitialize()について

半日かけてデバッグしてたので書きます。
CoUninitialize()をコメントアウトで解決した。
CoInitialize()をプログラムの他のところ行っているなら、それ以降呼び出したDLL内などで、勝手にCoUninitialize()をやるとすっごいエラーになる。
CoInitialize()、CoUninitialize()についてよく知らないのに書いてるとこんな目にあう。
なので、
HRESULT comInited = CoInitialize(NULL);

~処理~

if (SUCCEEDED(comInited)) {
    CoUninitialize();
}
とやると良い。(初期化が成功したときだけ、終了する)

2013/04/18

洗濯石鹸

かつて私の姉は言いました。

「一番高い洗剤を買ってきて」

一瞬意味がわからなかったのでどういうことか聞いてみると、こういうことだ。
「洗剤は高いと言ってもたかが知れている。さらに 一回の使用量に金額を換算するとその差は無視しても良いほど小さくなる。それならば迷うことなく一番高い洗剤を買って良い洗剤で洗濯をするべきだ。」

その割り切ったものの考え方、合理的に少しでも良い生活を送ろうとする姿勢に、感動したものだ。
しかしそこに誤れる論法がある。

「一番高い洗剤」は「一番良い洗剤」なのか。

そうではないと思う。
良い洗剤が安売りされていることもあるだろうし、最高級の入れ物に入った洗剤が一番高いのかも知れない。

そもそも値段を比較し、成分を比較し、実際に使ってみて初めて良い洗剤かどうか分かるものだ。

あれから数年経ったが未だに自分にとって良い洗剤が何なのか分からない。

しかし今新たなる挑戦として洗濯石鹸を買ってみた。確かに値段は高い。しかし、かつて姉に教わったように、一回の使用量で考えるとそれほど変わらない。そして洗浄力、さっぱりとした洗い上がり、いかにも石鹸という地味系の香り(これはすすぎが足りないとちょっと鼻につく)全てに満足しました(まだ2回しか使ってないけど)。



ちなみに↓も使ってみました。オラウータン好きなあなたへ。

これにも満足しましたが、上記の洗濯石鹸よりさらに割高になるかな?こちらは全くの無臭な洗い上がりです。
↓の無香料漂白剤と合わせて全く無臭な洗濯が出来ます。

VCでQtとBoost

2008は2年古いので2010に変えてみた。(2010も3年古いが・・)
VC++2010Expressで Boostライブラリを使えるようにする方法 と
VC++2010Expressで Qt(キュート)を使えるようにする方法を書き留めます
内容はQtBoostを参考に、ヴァージョンアップで変わったとこがあるので一応書いておきます。

Boost ! ! ! !

http://www4415ui.sakura.ne.jp/blog/?p=409
Boostのインストールはもっと簡単になってます。上記サイトを見ればすぐわかります。


Boost!は公式からZipでダウンロード。
C:/Program Files/boost/boost_1_47_0に入れた。
VC++2010用のライブラリファイルを作ります。
スタートメニューに「Visual Studio 2010コマンドプロンプト」があるので起動します。
Zipで落とすと普通にbjamが含まれてるはずなので、「bjam.exe --toolset=msvc-10.0 --prefix=c:/tmp --build-type=complete link=static release install」と打った(--toolsetと--prefixは少し変えた)。
リリース用ライブラリだけだったので+「variant=debug,release stage」を追加してみた。
すると c:/tmp にフォルダが2つ?くらい出来たので「C:/Program Files/boost/boost_1_47_0」にコピー(移動)した。 (後半はこっちが役に立った)
VC++2010 の、「VC++ディレクトリ」を変更しますが、ソリューションごとに設定するので最後に書きます。

Qt ! ! ! !

QtはQtSDKとは違います。
公式より「Qt 4.7.4 for Windows(VS 2008, 228 MB)」をDL、インストールしました。
ちょっと迷いますが標準の「C:/Qt4.7.4」へインストールしました。 ライブラリを使えるようにするため、コンパイルが要ります。
先ず環境コンパイルだそうです。
スタートメニューに「Visual Studio 2010コマンドプロンプト」があるので起動します。
C:/Qt4.7.4に移動し、
 set QMAKESPEC=win32-msvc2010 configure -debug-and-release -D _CRT_SECURE_NO_WARNINGS
と打ちます。
何か聞かれるので
o
と打ちます(OpenSource版の意味)
何か聞かれるので
y
と打ちます(許諾しますの意味)。

次に、ライブラリコンパイルだそうです。 同じ場所で、 nmake と打ちます。時間かかります。 それが終ったら環境変数を設定します。
QMAKESPEC : win32-msvc2010 PATH : %path%;C:/Qt4.7.4/bin;C:/Qt4.7.4/lib でサンプルなどが動くようになります。

Qt及びBoostを使うプロジェクトの作り方

先ずVC++2010でQtのプロジェクトを作ります。
新規プロジェクトで全般よりメイクプロジェクトを選択。
ちゃんとした設定は後でやるのでビルドコマンドに「a」とか「b」とか入れます(空欄だと変になる)。

そのプロジェクトのプロパティを開き、「構成プロパティ」の(Debug用の)「ビルドコマンドライン」に qmake -project qmake nmake debug と3行入れます。  
リリース用ビルド設定は最後のdebugをreleaseに変えます(nmakeだけだとビルドしません)。 
出力にはファイル名の前に「$(ConfigurationName)」を加えます(環境があってないと思うので調節が要ります)。
クリーンは「nmake debug-clean」と入れます。 「VC++ディレクトリ」の設定をします。
ソリューションのプロパティの何処かに「VC++ディレクトリ」があります。 「ディレクトリを表示するプロジェクト」から「インクルードファイル」を選び、追加作成で「C:/Qt/4.7.4/include」と、「C:/Program Files/boost/boost_1_47_0」を加えます。 「ディレクトリを表示するプロジェクト」から「ライブラリファイル」を選び、追加作成で「C:/Qt/4.7.4/lib」と、「C:Program Files/boost/boost_1_47_0lib」を加えます。
これでQtとBoostを使ったプログラムのコンパイル、実行が出来るようになります。
-- Main.cpp --
#include <iostream>
#include <string>
#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <boost/shared_ptr.hpp>

typedef boost::shared_ptr<QString> QStringPtr;

int main(int argc, char *argv[])
{
 QStringPtr str ;
 str.reset( new QString( "hello world"));
 QApplication application( argc, argv);
 QMainWindow  mainWindow;

 mainWindow.setWindowTitle( *str.get() );
 mainWindow.resize( 300, 200); 
 mainWindow.show();
 return application.exec(); 
}

Cascade constractor

知ってる人にとっては当たり前だが知らない人は知らないという定石コーディング
オーバーライドの連鎖 コンストラクタでの例
public Human(Calendar birthDay, String firstName, String lastName) {
   this.birthDay = birthDay;
   this.firstName = firstName;
   this.lastName = lastName;
}

public Human(String firstName, String lastName) {
   this(null, firstName, lastName);
}

public Human(String lastName) {
   this(null, null, lastName);
}

public Human() {
   this(null, null, null);
}
初期値を詳細に設定できるコンストラクタと適当に作るコンストラクタを用意するが、初期化のコードは詳細なコンストラクタに纏める書き方。
どのコンストラクタを使っても初期化コードは同じものが使われるのでコードの重複が避けられる、という例。