コードはそのプロジェクトメンバー達のスキル上限までにしかならない
コードの完結さやスマートさは、結局はプロジェクトメンバーに左右されるという意味。
より洗練されたコードを目指すのであれば、プロジェクトに携わるメンバーへの教育や布教活動が欠かせない。
コードのスマートさは、将来に渡って長い間コードを維持し続ける際に必須の条権となってくるため、妥協してはならない項目の一つである。
Appletを改修するお仕事とシステムリプレースについてふと思ったこと
どうも、ふもです。
だいぶ長いこと携わってきたシステム維持のお仕事が一区切りついたので、この5月から新しく開発の仕事に関わることになったのですが、新しい仕事内容を聞いてみてガックリ。それは、Appletを改修する仕事だったのです。
Appletと言えば、Javaが出だした頃に目玉として押し出されてきた機能ですよね、ブラウザ上のUIをHTMLよりもリッチにして、ウェブの可能性を求めて作られたのだと思います。企業での導入が盛んに行われたのがたぶん2000年初頭くらいで…その第一次改修があったのがきっと2004年〜2005年くらい。そしてそれからWEB2.0など様々な変革がWEBの世界には起こり、そして更に10年が経過した今、時代に取り残されたかのように、大量のApplet製の業務アプリケーションが世の中に残ることとなったわけです。
企業としても、この膨大な資産をすべて捨てて一から作り直すほどの余裕もなく、当然継ぎ接ぎだらけの改修を続けていくことになります。今回私が関わらせて貰っているのも、こういった経緯かと思われます。歴史は繰り返すという言葉がありますが、VB6アプリをVB.NETアプリにリプレースしましょう!といったノリととてもよく似ているように思います。システムやアプリケーションは自ら変化することができないスタティックな存在です。ですから、一度世に生み出された、長年使い続けなくてはならない大量の業務アプリケーション資産は、後の世代のエンジニアによってリプレースを余儀なくされるというわけですね。中には、もういらなくなった機能など、破棄されてしまう部分もあるでしょうが、業種にも寄るとは思いますが、少なからず、余程大きな業務改革がない限り、業務の内容はさほど変化があるわけではなく、移りゆく世の中の流れ・人々の流行・それからデータそのものなどに併せて、アプリケーションは姿かたちを作り替えられなくてはならないものなのでしょう。
私達エンジニアに出来るせめてものことは、後の世代のエンジニアが頭を悩ませなくても住むように、努めて綺麗なコードを書いたり、シンプルなフレームワーク・データ構造を維持したりして、可読性と機能性のバランスを保ったシステムを構築しておいてあげることだと思います。
いつか、システムがスタティックな存在ではなく、ダイナミックな存在(AI的な?)になるその日まで、我々エンジニアの仕事がなくなることはないでしょう。
SQLのANY, SOME, ALL, USINGについて
どうも、ふもです。
なんだか今年の夏は雨ばっかりですね。
さて、今日はSQLについてです。
現在携わっているお仕事ではOracleデータベースを使っているのですが、とある事情でSQLのリファレンスを眺めていたら、ほとんど使わないキーワードに出会いました。
タイトルにあるように、ANY, SOME, ALLとUSINGについてです。
ちなみにいままで、業務で取り扱ってきた様々なシステムで見かけたことは無かったと記憶しているので、そうとう珍しいんじゃないかなと思います。
機能の詳細はググってもらうとして、ANYとUSINGだけ軽くどんな感じなのか紹介して終わりにしたいと思います。
ANY
ANYはINとほぼ同じ感じで利用できるようです。
SELECT * FROM デーブル WHERE AAA = ANY(10, 20, 30)
個人的に強力だなぁと思ったのは、複数の値の組み合わせでマッチできるところです。
SELECT * FROM デーブル WHERE (AAA, BBB) = ANY( (10, 'a'), (20, 'b') )
ちなみに、SOMEはANYと同じ意味で使えるらしいです。エイリアスですね。
ANYで複数の条件を指定した場合は、そのどれかにマッチした行が残ります。
あと、ALLは逆に全てにマッチした場合のみ行が残るみたいです。
USING
よく使われるキーワードですが、ここではINNER JOINとかLEFT JOINとかのテーブル結合の時に使うもののお話です。
USINGはONの代わりに結合条件を書く時に利用できます。結合するテーブル同士の列名が同じ場合で、等結合となるような場合に利用できます。
FROM T1 INNER JOIN T2 USING (AAA, BBB, CCC)
これは、ONを使った場合の以下と同等の意味になります。
FROM T1 INNER JOIN T2 ON ( T1.AAA = T2.AAA AND T1.BBB = T2.BBB AND T1.CCC = T2.CCC )
列名が揃ってないと使えないですが、だいぶコードの見通しが良くなりますよね。デーブル設計時からこれを見越して、結合する予定の列名は統一しておくと良さそうな気がしました。
さて、いかがだったでしょうか。
私自身は、普段何気無く使っているものの中にもまだまだ未知のものが隠されていることを実感できてなんだか面白かったです。
もうこんなことは知っていると門を閉ざさずに、一度、よく見知った言語や製品などのマニュアルやリファレンスを眺めてみることをお勧めします。
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
の部分だけクエスチョンになってるのがいかんのか?
またあとで調べよう。