SQLアンチパターン読了 #sqlap

SQLアンチパターン

SQLアンチパターン

買いました&読みました。開発者であれば読んで損はない良書です。っていうかシステム開発で対価を頂こうって人は読みましょう。
まだまだRDBMSのシステムは無くならないでしょうし、生み出されていくと思われます。転ばぬ先の杖としてこの本の情報があると「あの時ああしとけば良かった」と悔やむことや後任の担当者に恨まれることが少なくなるでしょう。

システム開発を長いことやってて修羅場を経験している人にしてみたら新しい驚きはないと思います。なので、こういう「べからず集」は、情熱はあるけど経験の少ない人にこそ読んで欲しいと考えます。
先人たちの過ちを自らも経験して学ぶ、というのはあまりにも時間がもったいない。
「若いうちの苦労は買ってでもしろ」とは言いますが、誰も経験したことのない苦労をすべきであって、誰かがした苦労は避けた方がいいと思うんです。時間は有限ですもの。失敗から学ぶことは多いですが、すべて体験しなきゃいけないかというとそうでもない(ハズ)。

この本には、誰かがした苦労がたくさん詰まっています。これを読んだ人は少なくともこのような問題からは避けられるはずです。*1
違う問題に遭遇して頭を使うようにしましょうよ。

システムは作って終わりでなく、作ってからがスタート。仕様変更もバシバシくるわけです。本書にはそんな時にも対応できるようなノウハウがたっぷり詰まってます。場当たり的な対応でその場はしのげてもいつか帰ってくるんだぞ、ということが垣間見えるのではないでしょうか。*2


あと、個人的な意見ですが、DBを使ったテストはSlow Testsになりますが、やっておいて損はないと思います。Mockを駆使して使わないようにするのも良いですが、最終的にRDBMSから取得するデータが違ってたら意味ないですし、カラム変更によってデグレっても気づきにくいですしね。結合して始めて「あらら」とならないようにしましょうね。少しでも複雑だなぁと思ったSELECTは自動化の対象にしましょうぜ。

*1:間違った方向に進めようとする上司を説得するネタ帳としても有効ですw

*2:まぁ、いい加減な対応をした人に必ず帰ってくるわけでもないってのが世知辛い世の中ですが

Eclipse+Maven+Tomcat7+複数プロジェクトな環境を作る

表題の環境(Seasarプロジェクト使用)を作ろうとしてたんです。

[入れるもの]
Eclipse 4.2
m2eclipse
sysdeo-tomcat 3.3(Tomcat7を使用したいので)

[忘れちゃいけない]
ふたがわさんのDevLoader改変モジュール


で、Tomcatプラグイン/プロジェクトの設定をして、EclipseからTomcatを実行したのですが、java.lang.VerifyErrorが投げられて実行できません。
よくよく調べてみると、Tomcat7用のDevLoaderがあるみたいなので、そちらを使ってみますが・・・。
改変部分が無いからClassNotFoundExceptionが出ます。さらに、.#webclasspathに記述されるpathの中でプロジェクトを参照している箇所がフルパスで記述されていませんでした。むー、動かないー。


で、作ってみた

誰かが作ってくれるのを待っててもしょうがないので、作ってみました。ベースはTomcat7のDevLoader。
https://github.com/nemuzuka/tomcat7-devloader-ex


使い方

ビルドした、devloader7-1.0.0.jarを$TOMCAT_HOME/libに配置して下さい。(元々のDevLoaderは不要です)

除外処理は、ふたがわさんの部分を丸パクリ拝借しました。
$TOMCAT_HOME/confにdevloader.confを配置すれば追加で除外設定をします。

プロジェクト参照に関しては、
$TOMCAT_HOME/confにreferencePath.confを配置します。
指定内容は、
[参照プロジェクトまでのpath,プロジェクトの出力ディレクトリのpath]
を指定します。


例えば、参照プロジェクト(app-common)が、
C:/eclipse/workspace/project
ディレクトリに配置されていて、出力ディレクトリがEclipse上で
/target/classes
と設定されている場合、referencePath.confには、

C:/eclipse/workspace/project,/target/classes

と記述します。
LoaderがLoadする際に、
C:/eclipse/workspace/project/app-common/target/classes
をクラスパスに追加します。*1


情報が見つけられなかったので無駄に頑張った気もするのですが、もっと他にいい方法があれば、教えてください。
ってか、みんなはTomcat*2で開発してないのかなー?


ちなみに

上記モジュールはTomcat7用ですが、sysdeo-tomcat 3.3でTomcat6を使う際にも同様の問題が発生したので、上記処理を組み込んだものも作成しました。
https://github.com/nemuzuka/tomcat-devloader-ex

*1:複数行指定可能で、先頭行から順番にディレクトリが存在するまで繰り返します

*2:というかそもそもJava

成果発表

持て余した時間を、子供の相手もそこそこに、個人的なアプリ開発に費やしてました。
もう飽きた見せてもいいくらいになってきたのでお披露目しようかと思います。

Mishima

夏前から作ってた、GAE/Jで動作するITS。スマフォ用画面もあります。
サイト
ソースコード

Yoita

LL言語も嗜んでみようと思いたち、RoRでつくってみたスケジューラ。Facebook連携とかやってみました。Heroku上で動作。
サイト
ソースコード

Koshiji

家にあるスケジュールボード的なものをイメージして、(主に家族間の)メッセージのやりとりができるようにしたかったんだけど、ごちゃごちゃしてきてわけがわからなくなりました・・・。GAE/Jで動作します。
サイト
ソースコード


基本的にサーバからJSONでデータ貰ってjsでレンダリングしてます。新し目のブラウザであれば大きな問題は無いと思います*1。この方式にもかなり慣れてきました。
GAE上で動作するアプリはGoogleアカウントが必要ですが、デモサイトもあるので動かしてみて感想を頂ければ嬉しいです。

*1:IEは気にしてません

第28回 長岡IT開発者勉強会に参加してきた #nds28

9/22にNDSに参加してきました。
「スーツvsギーク討論会」というテーマでディスカッション形式でした。勉強会でディスカッションってめずらしかったです。皆さんが現在に至るまでの経緯の違いからか、伝えたいことが伝わらず歯がゆく思うこともありましたが、最終的に「ゴールは一緒なので協力しましょうよね」、という落とし所になってよかったと思います。こういう話でムズムズしている人は、社内でやってみたらいいのに、と思いました。そっちの方がわだかまり少なくなると思います*1


僕の勝手なイメージからすると「スーツ」「ギーク」って、自分に壁を作っているだけだと思うんです。僕は「スーツ(ギーク)」だから「ギーク(スーツ)」の話はわからないと言っているように思えて。「俺がこんなに頑張ってるのに報われないのはギーク(スーツ)の奴らのせいだ」って言いやすくしてるだけじゃないかな、なんて歯がゆく思ってましたが、今回の人たちはそうではありませんでした。本当に「できる人」ってのは両方の素養を持っている人なんだろうと思ってまして、私もそうありたいと常日頃考えている次第です。ギークだってコスト意識持つべきだし、スーツだっていつまでもStr◯tsベースの自社フレームワークを使いまわしてシステムを開発することに疑問を持つべきです。*2


僕の話になりますが、仕事である以上気が進まなくてもやらなければならないことが往々にしてあります。そんな中でも自分が選択し決定した中で仕事をして少しでもモチベーションを高く維持したいと思った時にはプライムで仕事をするしかないと思い、技術だけでなくマネージメントの勉強もするようになりました。技術だけだと結局マネージャに良いように使われる、マネージメントだけだとデベロッパーに嘘をつかれても気づかない、と思ったからです*3
他人が頼りないなら自分がなってやるという選択肢もあると思います。それを放棄するのなら状況はきっと変わらないし、押し付けられたと思いながら言われたことをやるしか無いと思うんです。お互いの話が(納得できなくても)理解できるような人間になりたいなぁ、と思ってます。


今回の勉強会は学生さんの参加が多かったので意味がわからないことも多かったと思いますし、必要以上に怖がらせたこともあったと思います。若干煽ってしまった感があります。ごめんなさい。ですが、SIとWeb系でのビジネスの違いはあれど、開発に携わってお金を貰う以上、一人でやるのでなければこの手の話は出てきます。すでにお金を払う人がいる時点で一人じゃないですしね。それに、閉じられた世界で気の合う仲間と仲良くビジネスをする、というのは現実問題無いでしょう*4。それだけ、お金を稼ぐというのはシビアなんです。


ただ、今までの技術的な興味が「プロジェクトの成功率を上げる」ことから始めていたのですが、純粋に「楽しいからプログラムする」ということからこともしてみたいなーと思うようになりました。静的言語は最近の他人からは敬遠されるのかな・・・。

勢いで描いたLT

*1:決裂しても責任は取れませんがw

*2:JDKも新しい奴に対応しましょうよ!

*3:まぁ、無条件に他人を信じれない性格なんですよね。で、まぁ、どっちから見ても使いづらい中途半端な社会人ができあがってしまったのですがw

*4:あったとしてもそう遠くない未来に破綻するんじゃないかな

OmniAuthを使って認証する際のキャンセル処理

表題の通りなのですが、Facebookの認証画面でキャンセルされると

OmniAuth::Strategies::OAuth2::CallbackError

の例外が発生します。

まぁ、キャンセルされることは少ないでしょうから放っておいても大丈夫な気がしますが、やっぱりかっこ悪い。対応してみましょう。


/config/initializers/omniauth.rbに次の文を追加

OmniAuth.config.on_failure = SessionsController.action(:oauth_failure)

※キャンセル時、SessionsControllerクラスのoauth_failureメソッドが呼ばれることを定義します。


で、コントローラ(/controllers/sessions_controller.rb)にoauth_failureメソッドを追加

class SessionsController < ApplicationController
  def oauth_failure
    flash[:notice] = "キャンセルしました。"
    redirect_to "/"
  end
end

※この例ではメッセージを設定して、指定URLにリダイレクトする処理を記述します。


RoRはこういうの楽でいいですねぇ。

バージョンアップ

お陰様で Mishima を何人かの方から使用していただいています。
で、PCブラウザ向けに作成したものなのでスマフォでは見づらいと意見を頂きましたので、スマフォブラウザ用に対応してみました。

jQuery Mobileで作っており、若干モサい感じがしますが、しばらくこれで様子を見て下さいませ。

local + productionで静的ファイルが見つからない

RailsのAsset Pipelineの対応で、

# config/environments/production.rb

config.assets.compile = true

で逃げていたのですが、稼働中のサーバに対して無駄なリソース使うことになるのでイケてないと思い、対応しようと思った時のメモです。

productionで動作させるときには、
app/assets/javascripts/application.js
app/assets/stylesheets/application.css
config/environments/production.rbのconfig.assets.precompile
等を編集しただけではダメで、

bundle exec rake assets:precompile

で、プリコンパイルしておく必要があるので、実行しておきます。
で、serverをproductionで実行。


・・・あれ?

cssやjsが404となります。
生成されたhtml見ても該当するファイル名はpublic/assetsに存在します。

ブラウザから直接叩いても404です。

試しにHerokuにあげてみると、問題なく動作している模様。
不思議な状況です。

google先生に聞いてみると、このような情報が!
Rails3.2で production にした途端にapplication.css が参照できなくなる:お題目うぉっち


config/environments/production.rbの「config.serve_static_assets」を
コメントアウトすることできちんと動作しました。


WEBrickで動作確認してると、こんな状況になるみたいですね。
うーん、Railsのハードルはやっぱり高いよ・・・