[ETC]社内報に書いた私の自己紹介

私が所属している会社では『べこんし』という名前の社内報があります。今月号に、社員紹介のコーナーで私の高校時代までのエピソードを書いて掲載してもらいました。その内容をこのブログでも転記しておきます。

      • -

出羽 健一

両親が健康第一を願って「健一」と名付けたそうです。出身は大阪。兄弟は姉と妹。


保育園の頃から、ひょうきんな性格でよく「将来は、吉本に行くべきだ」みたいなことを言われていました。(当時は、吉本自体がなんのことか知りませんでしたが、、、。)


小学校の時に、ある日突然、父が高価なパソコンを買ってきたものの、ほとんど使われることがなかったので、僕のゲーム機として活用していました。今では違法ですが、当時は、パソコンソフトのレンタル屋さんがあって、そこからゲームソフトとコピーソフトをレンタルして、コピーしてから返却することを頻繁におこなっていました。交通費とレンタル料金を低く抑えるために、結構な距離でしたが自転車で1日2往復していたのが懐かしい。今思えば、これが僕の初めてのパソコンとの出会いです。


小学校時代は、ケンカも良くやりました。自分は空手を習っていたのですが、実践では、打撃の展開になることはほとんど無く、プロレス的な組み合いになることが多かった。当時は、プロレスが流行っていたので、ケンカとはそのようなものだというイメージを持っていました。 それだけに、男3兄弟でケンカ慣れしている打撃派の奴に、コテンパンに負けた時は、今までのやり方が通用しないだとか、根本的にルールが違うといった理由で、肉体的なものよりも精神的なダメージが大きかったのを覚えています。(プロレスラーの高田延彦が、ヒクソングレイシーに負けた時と同じようなショック)


中学時代には、転校という貴重な経験をしました。転向した翌日に百人一首大会があり、ルール違反スレスレ(違反?)の戦法をその場で思いついて、なんと学年で優勝してしまったのがありえない思い出です。


勉強はほとんどしなかったので、転校前は、成績はオール3とかだったのですが、転校後はとても柄の悪いことで有名な中学校で、周りがあまりにも勉強しない奴が多かったのか、 成績が4と5だけになりました。自分は何も変わっていないのに、評価がこれほど異なることに違和感を感じました。当時は、これを深く考察することは無かったのですが、長いものに巻かれることなく、物事を建設的に批評的して本質的に捉えることの重要性を肌で感じました。


高校時代は、水泳部に所属。球技が苦手だったという理由で水泳自体は高校から始めたのですが、3年生の頃には、大阪府の公立高校だけの大会で優勝するまでの成績を収めることができました。ここから自ら学んだ大切な教訓があります。それは「マイナーな分野でトップになる」ということです。


1年生の終わりの頃には、平泳ぎを専門的に練習していたのですが、なかなか芽がでませんでした。そんな中で、200Mバタフライの競技人口がとても少ないことに着目しました。同じトップになるにしても、競技人口が多い種目と少ない種目では必要な練習量がかなり違う。でも、トップはトップ。というわけで、200Mバタフライにターゲットを定めて、ひたすら練習に取り組みました。この戦略のおかげで、高い目標達成の実現可能性が見えてきて、非常に高いモチベーションで望めたことが大切な成功要因でした。


当時は文系だったのですが、ある理系の大学の水泳部から勧誘があって、理系に転向することになりました。今、思えば、この出来事がなければ、理系の会津大学に出会うこともなかったでしょう。


今回は高校時代までのエピソードを紹介させて頂きました。機会があれば、次回は、浪人時代からのエピソードを紹介をさせて頂きます。最後まで、読んで頂いてありがとうございました。

doOnceとdoFinish

下記のTeedaWikiページによると、
http://www.seasar.org/wiki/index.php?Teeda%2FgettingStarted#p1b893e1

doFinish の使い方は、以前まで、次のように記載されていました。

doFinish
doFinishでもTransactionTokenが発行され、DoubleSubmit防止のJavaScriptがrenderされる。

それに加え、doFinishでは、サーバ側でviewIdごとに一定数管理している Pageの状態をすべて破棄する。


しかし、どうやら、上記の説明は間違っていました。今は、次のようになっています。(というか、私の方でshotさんに確認して、書き換えさせて頂きました。)

doFinish
doFinishでは、サブアプリケーションスコープ内で管理しているプロパティを全てクリアします。

内部的には、Session に "javax.faces.internal.scope.SubApplicationScope" というキーに関連付けられたMapがあって、このMapにサブアプリケーションスコープとして管理してある全てのプロパティが詰め込まれおります。そして、doFinishメソッドが呼ばれた後に、このMapをクリアする感じになっています。

doOnceメソッドによる二重登録防止

Teedaでは、doOnceからはじまるメソッドをPageクラスに用意することで、二重登録防止を実現できます。


二重登録防止とは、例えば、「登録」→「確認」→「完了」のような画面仕様において、確認ページから完了ページの間で、insert処理をする際に、以下のイレギュラーケースに対策を施して、同じデータが重複して登録されることを避けることです。

  • 確認ページでダブルクリックする。
    (サーバ処理が遅いと、ユーザーはイライラして、ガンガン押してしまうのがコワい)
  • 登録完了後に、ブラウザの戻るボタンで確認ページへ行って、再度、登録ボタンを押す


Teedaで、二重登録防止をするには、doOnceから始まるメソッドを用います。たったこれだけです。上記の例だと、確認ページに、例えば、 doOnceRegister メソッドを用意するだけです。それだけで、HTMLファイルのHIDDENタグ、および、Session 内にトランザクショントークンが発効され、doOnceRegisterメソッドが呼ばれる直前に2つのトランザクショントークンを比較します。内容が同じであれば、doOnceRegisterメソッドを呼ぶ。内容が異なっていれば、doOnceRegisterメソッドを呼ばずに、完了ページに遷移します。


この2つのトランザクショントークンをチェックする仕組みで、「ダブルサブミット」と「戻って再登録」に対して、2重登録させないことを実現しています。「戻って再登録」を実施すると、2度目の完了画面にも関わらず、1件しかDBに登録されていない振る舞いになる。チェックに引っかかっても、エラー画面にせずに、メソッドを呼ばずに次の画面に遷移する仕組みが良いですね。逆に、2回目のリクエストでエラー表示する仕様だと、サーバ処理が遅いために、ダブルクリックした場合は、1件分の登録は成功しているにも関わらず、エラー画面が表示されるなんて状況になってしまいかねないので、よろしくない。

ダブルサブミット(二重送信)を防止しつつ、サブアプリケーションスコープのプロパティをクリアするには?

「登録」→「確認」→「完了」のinsert処理を呼び出すメソッドは、doOnce と doFinish のどちらを使うべきだろうか?


doOnceを使った場合、ダブルサブミット対策はできるが、登録完了後に、完了ページから登録ページへ行くと、登録ページに以前の入力値が残っている。これは、なんとしても避けたい。だからと言って、確認ページ内で doFinish メソッドを使うと、ダブルサブミット対策が手薄になってしまう。doOnce と doFinishの併用ができると良いが、現段階(Teeda 1.0.10)はできない。うーん、困った。


あまり、スマートなやり方ではなく、裏技っぽいが、以下のようにすると、この要件を満たすことができる。

@RemoveSession(name = "javax.faces.internal.scope.SubApplicationScope")
public Class doOnceRegister() {
...
}

※ この方法は、複数のウィンドウがあった場合、全てのウィンドウの状態を破棄するので、マルチウィンドウの場合は、うまく動作しないので、推奨できません。

RemoveSessionアノテーションは、メソッド呼び出しが終わった時点で、name属性で指定したセッションキーの値を削除するものです。この機能を使って、サブアプリケーションスコープが管理しているプロパティを全て削除することができます。


だだし、サブアプリケーションスコープのプロパティを削除したことで、変数にNullが入ることを想定していない箇所では、NullPointerException が発生してしまうので、注意する必要があります。

Kumu.Html.Disabledによるダブルサブミット(二重送信)を防止

Kumu.Html.Disabled というjavascriptのライブラリを使うことで、クライアントサイドの「ダブルサブミット(二重送信)」の防止を行うことができます。使い方はとても簡単で、以下のようにJavaScriptファイルをインクルードするだけです。




詳しくは、以下を参照してください。

 Kumu.Html.Disabledとは
 http://teeda.seasar.org/ja/kumu_disabled.html

styleClass属性DynamicProperty

[Seasar-user:10295] によると、

> DynamicPropertyのメソッドはget+id+属性名という名称で
> Pageクラスに定義できる仕様ですが、
> HTMLのclass属性もDynamicPropertyのメソッドに
> 出来ないのでしょうか?


HTMLのタグにstyleClass属性を追加しておき、
get + StyleClass + 属性名 のメソッドを作ることで、DynamicProperty が実現できるそうです。


JSFでは class属性だけは特殊なので、styleClass属性となります.