No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

プログラミングレベルメモ(Java編)

レベル1 基礎文法を理解している

レベル2 オブジェクト指向を使わずにプログラムを組める

レベル3 標準Javaライブラリを使ってプログラムを組める

レベル4 自分でクラスを作れる

レベル5 デザインパターンを理解できる

レベル6 フレームワークのラッパーを作れる

レベル7 独自フレームワークを作れる



こんなもんかな?

あくまで、私の考えるレベルです。


Enjoy coding!

OS Xを10.9(Mavericks)にしてから久々にHomebrewを起動したらエラーが出て起動しなかった話

OS Xを10.9(Mavericks)にしてから久しくHomebrewを使っていなかったのだが、久々に使おうと思い起動したところ、以下のようなエラーがでて起動できず…ぐぬぬ

$ brew version
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': /usr/local/Library/Homebrew/extend/pathname.rb:259: invalid multibyte escape: /^\037\213/ (SyntaxError)
invalid multibyte escape: /^\037\235/
invalid multibyte escape: /^\xFD7zXZ\x00/
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/Homebrew/global.rb:1:in `<top (required)>'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/bin/brew:10:in `<main>'

色々調べてみたら
brew error: invalid multibyte escape : /^\037\235/ after updating to OSX Mavericks · Issue #23655 · Homebrew/homebrew · GitHub
が見つかりました。

どうもMavericksになった時にRubyのデフォルトバージョンが2.0にあがったのだが、Homebrewの方はまだRuby1.8系を使っているから、というのが原因らしい。
直接原因は
multibyte escape: /^\037\213/
このマルチバイト文字のエスケープがうまくいかなかったこと、なのかな?

さて、こちらの投稿を読んで行くと

Changed first line in /usr/local/bin/brew to:
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby

とのことだったので、/usr/local/bin/brewをエディタで開いて、最初の1行目、つまりシェバング行を

#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby

に置き換えたところ解決しました。ふぃ。
Homebrewで使うRubyのバージョンを決め打ちで1.8系にしたわけですね。


バージョンアップしたりすると思わぬところで歯車が食い違って動かなくなることがよくありますよね。日頃からよく動かして腕を慣らしておかないといかんですね。

GriffonのSwingPadがうまく起動できない

とあるお仕事でGriffonを使うことになり、最近Griffonな毎日を送っています。
そんな中、SwingPadを使おうと思って実行しようみたところ、うまく起動できなかったので
メモがてら投稿しておく。

/Applications/Griffon-1.5.0/samples/SwingPad $ griffon -Dgriffon.artifact.force.upgrade=true run-app
Welcome to Griffon 1.5.0 - http://griffon-framework.org/
Licensed under Apache Standard License 2.0
Griffon home is set to: /Applications/Griffon-1.5.0

Base Directory: /Applications/Griffon-1.5.0/samples/SwingPad
Running script /Applications/Griffon-1.5.0/scripts/RunApp.groovy
Resolving dependencies...
Downloading: ant-1.9.3.jar
Download complete.
Downloading: ant-launcher-1.9.3.jar
Download complete.
Downloading: ant-junit-1.9.3.jar
Download complete.
Downloading: jansi-1.9.jar
Download complete.
Downloading: jline-0.9.94.jar
Download complete.
Downloading: commons-io-2.4.jar
Download complete.
Downloading: commons-lang-2.6.jar
Download complete.
Downloading: commons-codec-1.6.jar
Download complete.
Downloading: commons-collections-3.2.1.jar
Download complete.
Downloading: commons-beanutils-1.8.3.jar
Download complete.
Downloading: httpcore-4.1.2.jar
Download complete.
Downloading: httpclient-4.1.2.jar
Download complete.
Downloading: jsch-0.1.48.jar
Download complete.
Downloading: jzlib-1.1.1.jar
Download complete.
Downloading: http-builder-0.6.jar
Download complete.
Downloading: xercesImpl-2.9.1.jar
Download complete.
Downloading: ezmorph-1.0.6.jar
Download complete.
Downloading: xml-resolver-1.2.jar
Download complete.
Downloading: griffon-cli-1.5.0.jar
Download complete.
Downloading: griffon-scripts-1.5.0.jar
Download complete.
Downloading: griffon-rt-1.5.0.jar
Download complete.
Downloading: spring-core-3.2.7.RELEASE.jar
Download complete.
Downloading: spring-beans-3.2.7.RELEASE.jar
Download complete.
Downloading: spring-context-3.2.7.RELEASE.jar
Download complete.
Downloading: spring-context-support-3.2.7.RELEASE.jar
Download complete.
Downloading: json-lib-2.4-jdk15.jar
Download complete.
Downloading: bndlib-1.50.0.jar
Download complete.
Downloading: log4j-1.2.17.jar
Download complete.
Downloading: slf4j-api-1.7.5.jar
Download complete.
Downloading: slf4j-log4j12-1.7.5.jar
Download complete.
Downloading: jcl-over-slf4j-1.7.5.jar
Download complete.
Downloading: jul-to-slf4j-1.7.5.jar
Download complete.
Downloading: groovy-all-2.2.1.jar
Download complete.
Dependencies resolved in 3032ms.
Environment set to development
Resolving framework plugin dependencies ...
Downloading: junit-4.11.jar
Download complete.
Downloading: hamcrest-core-1.3.jar
Download complete.
Framework plugin dependencies resolved in 1779 ms.
Resolving plugin dependencies ...
Some dependencies could not be resolved.
-= INSTALLED =-

-= MISSING =-
+ zonelayout-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ gfx-builder-1.1.0 from griffon-central
   + swing-1.2.0 from griffon-central
? dialogs-0.60 from griffon-legacy
+ jxlayer-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ riverlayout-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ jexplose-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ swingx-builder-0.7 from griffon-central
+ coverflow-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ swing-1.4.0 from griffon-local
+ glazedlists-2.0.0 from griffon-central
   + swing-1.2.0 from griffon-central
+ trident-builder-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ jgoodies-forms-1.0.1 from griffon-central
   + swing-1.0.0 from griffon-central
+ syntaxtext-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ transitions-1.0.0 from griffon-central
   + trident-builder-1.0.0 from griffon-central
      + swing-1.0.0 from griffon-central
+ miglayout-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ tray-builder-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ designgridlayout-1.1.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ css-builder-1.1.0 from griffon-central
   + swing-1.2.0 from griffon-central
+ silkicons-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ macwidgets-builder-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ crystalicons-1.0.0 from griffon-central
   + swing-1.0.0 from griffon-central
+ installer-0.8 from griffon-central
+ jide-builder-1.0.0 from griffon-central
   + swing-1.1.0 from griffon-central
+ jbusycomponent-1.0.0 from griffon-central
   + jxlayer-1.0.0 from griffon-central
      + swing-1.0.0 from griffon-central
   + swingx-builder-0.7 from griffon-central
Could not resolve plugin dependencies. Review all dependencies marked with ! and try again with -Dgriffon.artifact.force.upgrade=true
/Applications/Griffon-1.5.0/samples/SwingPad $ 

ちなみに、最後のエラーメッセージの部分に着目し、

Could not resolve plugin dependencies. Review all dependencies marked with ! and try again with -Dgriffon.artifact.force.upgrade=true

-Dgriffon.artifact.force.upgrade=trueを付けて実行してみたけど結果は変わりませんでした。

ん〜、「!」ってなっているところは無いんだけどなぁ・・・
しいて言えば、

? dialogs-0.60 from griffon-legacy

の部分だけクエスチョンになってるのがいかんのか?

またあとで調べよう。

GitHub Pagesを作成してみた

前からやりたいなと思っていたGitHub Pagesを作成しました。

http://fumokmm.github.io/


こちらの記事を参考にさせていただきながら作成しました。
(余談ですが、この記事のころはドメインが "http://username.github.com/" だったようですが、2014-05-03現在では "http://username.github.io/" になったようですね)

まだなにもありませんが、どうやって使っていこうか考え中です。
SphinxとかJekellとかを使ってみるいい機会かなとも思っています。

中括弧省略問題

例えばif文で、

「処理する行が1行のみであった際は、中括弧を省略できる」

if (条件) 処理;

と、みなさんは最初習ったのではないだろうか。
しかしどうだろう、次のようにも考えられないだろうか。

「条件式のあとは式が一つのみ指定できます。
もし複数指定したい場合は、中括弧で複数の処理を囲むことで指定可能です」

if (条件) {
  処理1;
  処理2;
}

こちらの方が、中括弧は複数の処理をまとめるためのものという本質を捉えているように思える。

しかし、よく目にするコーディングルールには「常に中括弧を付けよ!」みたいなものがあるほどだ。
曲解、理解の逆転もいいところだが、これも、「範囲をミスしにくくする」という現実的な解であるととらえれば頷ける。*1

現実にはいつも設計者の意図を超えた使われ方をするものだ。

もし、しっくりこない説明に出くわしたとして理解できないような概念があったとして、それがスタンダードな考え方だったとしても、どうか落ち込まないで欲しい。
それは今回の中括弧省略問題のようなスタンダードな曲解かもしれない。だから、さまざまな視点から観察し、本質を捉えられるようになるベキだと、わたしは思う。

*1:後者の説明を推奨するならば、学習者はデフォルトで中括弧を使わなくなるだろう。もしかするとこのコーディングルールの設計者はそれを回避するためにあえてそうしているのかもしれない。

システム維持・保守は歯科医の業務に似ているという話

最近、歯の治療のため、歯科医に通っていた、ふもです。
治療中にふと思ったので書き留めておこうと思います。

お客さん=ユーザーさん

歯=運用中のシステム

歯茎の腫れ=エラーや警告

悪い歯並び=スパゲッティコード

歯の矯正=リファクタリング

虫歯=バグ

親知らず=仕様バグ

被せ物が取れた=修正ミス・デグレード

  • 当時治療した歯医と違う歯医にかかるとか、システム開発でいうところの、別会社への修正依頼と一緒

差し歯・入れ歯=一部の機能を作り直し(一からコードを書く)

総入れ歯=新システム構築

虫歯治療=バグ改修

治療後の一週間=初動確認

麻酔=システム停止時間

歯のクリーニング=リファクタリング

歯磨き=ログ監視・データパッチ

治療の際、お客さんの歯を傷つけない=改修の際、運用中のシステムを壊さない

簡単には入れ歯にできない、段階を踏んだ治療を行う=バグ改修で済むならそれを行い、手も足も出ない状況になったら総書き換え

歯以外の部分を傷つけない(唇とか舌とか)=他の外部システムとのインタフェースを壊さない

はーい、口を大きく開いて下さ〜い=要件定義・ヒアリング・影響範囲の見極め

レントゲン写真撮影=システムの解析・影響範囲の見極め

はーい、うがいして下さ〜い=ユーザーテスト

いかがでしょうか?
あなたがシステム維持・保守担当者さんなら、歯医者さんになった気持ちでシステムに向き合ってみると面白いかもしれません。
あなたがシステム開発者なら、なるべく治療せずとも、長く使っていけるシステムを仕上げるよう心がけて下さると助かります。

レッツ80・20!

MacのGoogle日本語入力でバックスラッシュ(\)を入力する方法

「環境設定 -> 一般 -> ¥キーで入力する文字」
で指定可能でした。

真ん中あたりの「¥キーで入力する文字」をクリックして

「バックスラッシュ(\)」に変更

これで、\がさくさく入力できるようになります。