スキマハコ

わすれがちなスキマな事を詰め込んでいます。ITの他に暮らしについても書いています。

Webサーバは要求に対してシングルスレッドだった!!

ただしWebrickに限る(たぶん)

動かしてみた。

1.サーバ
 ↑ Aブラウザが要求
2.サーバ(Aの処理が長引いている)
 ↑ Aブラウザが応答まち
3.サーバ(Aの処理が長引いている)
 ↑ Aブラウザが応答まち
 ↑ Bブラウザが要求
4.サーバ(Aの処理が長引いている)
 ↑ Aブラウザが応答まち
 ↑ Bブラウザが要求受付まち

Aの要求を返さない限り、Bはずっと要求を受け付けてくれるのを待機してる。
たぶん、タイムアウトの設定はあるんだけど、使い物にならないよね!!!*1

対策として、以下の方法ができそう。*2

  1. ApatchServerを使う
  2. 噂のWebSocketに対応しているServerを使う
  3. Webサーバとアプリサーバを分ける

*1:そもそも、Webrickは開発用サーバなので、負荷がかかるようなことはさせないべきです

*2:そもそも、長い処理をWebサーバが平気でやってることが間違いだってことはわかってるんです…

かけだしたプログラマは夢をみるか

アイデム エンジニアキャリアHacks共有プロジェクト
5年後の「エンジニアの働き方」は、どう変わっていてほしいですか?

つられてみました。

想定対象読者

  1. IT業界の業務の従事した期間が通算して1〜3年
  2. SEっていってるけどプログラマ

自分の現状

  1. 従事期間は3年
  2. SEっていってるけどプログラマ
  3. 地方勤務

プログラマという仕事にあこがれたというより、「ものづくり」に憧れたとき、一番自分に合っていそうだなあと思ったのがプログラマでした。
 あんまり業界分析とかしないままこの業界に入ってきましたので、「自分にあってそうだなあ」というてきとーな印象でしかありません。
(まあそれでも3年続いてるので、てきとーな印象もなかなか間違っていなかったのかもしれません)

現実のぼくが見ている世界

従事期間3年程度の私が見渡す範囲というとこんな感じになります。

赤いところが見えてる範囲です。(もじ汚い!!!)
会社のなかの、自分のかかわっているプロジェクトの事と、そのプロジェクトにかかわってくるメンバーのこと。
この程度しか見えていない…と思います。

仕事に従事するなかで、得たことを社内ではアウトプットしていますが「プログラマ」として技術的なアウトプットは出来てないなーと実感しています。
大体業務に忙殺されて自己満足におわっちゃうんですよね。

今は社内に目標とする先輩がいらっしゃるのでがんばれますが…
もし先輩がいなくなったら目標を失ってやる気も落ちるんだろうなあ…

話がずれました。

エンジニアとしてどうありたいか

やっぱり「技術」を突き詰めたい!
なんでもしりたい!たのしみたい!
5年後であっても、自分の考え方は変わらないと思っています。

もっともっと外を!

外的要因「地方勤務」と内的要因「視野が狭い」ということが自分の世界が狭い、ということを解消したいと思っています。
そのために今興味があることが「勉強会」です。
恥ずかしながら、まだ一度も参加したことがありません。

と、言うことで「五年後には地方でも都心頻度で勉強会が開催され、やりとりが活発にされる」ような環境になればいいなーと思ってます。

とりあえず都心のほうでjavarubyrailsの勉強会に参加してみようかな―

MercurialとSubversionの連携

Subversionで管理しているリポジトリをマスタとして、後は自分でローカルにbranch分けていろいろしたい!と思っていたので、表題についてはずっと憧れてた。
今回なんとか導入出来たので、その手順など。

環境は中央リポジトリsvnでWindows2003、クライアントはWindows7

参考:
HgSubversion
HgSubversionでMercurialとSubversionを連携させる
hgsubversionの導入
hgsubversionでFreeBSD svnをもってくる

だいたい↑のところを見ていたらなんとかなる。

連携のためにやること。

  1. Subversionのインストール
  2. Mercurialのインストール
  3. hgsubversionのインストール
  4. Mercurialファイルの設定
  5. svnのクローンを作ってリポジトリ

Subversionのインストール

TortoiseSVNではだめらしいので、Apatch Subversionの何かしらをダウンロード。コマンドを提供してないとだめ!らしい。
参考にしたHPのLinkをたどってmsiをダウンロード。
→今回ダウンロードしたバージョン(Setup-Subversion-1.6.6.msi

Mercurialのインストール

これはTortoiseHgでよい。インストールされるし、パスも通る。
 TortoiseHgをインストールしました。デフォルトまんま。
→バージョン:tortoisehg-2.2-hg-2.0-x86.msi

hgsubversionのインストール

 MercurialSubversionの連携に必要。
 コマンドライン(コマンドプロンプト)でインストール。

# プロキシの場合で接続しているときは、プロキシをセット。
set http_proxy=XX.XX.XX.XX:ポート番号
# ダウンロードしたいディレクトリに移動後、ダウンロードのコマンドを実行。
hg clone http://bitbucket.org/durin42/hgsubversion
# パラメタにインストールパス指定してもいいよ。
hg clone http://bitbucket.org/durin42/hgsubversion
win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension
abort: error: getaddrinfo failed

なんかエラーが出る。wikiを確認したら、Mercurialの環境設定ファイルに以下を追記しろとのこと。

[win32text]
warn = False

メモ)
環境設定ファイルの場所はどうやら一定じゃないらしい。ダウンロードしたバージョンやOSによるのかも。
TortoiseHgは(Windows) %USERPROFILE%\Mercurial.iniにありました。
(Windows) %USERPROFILE%\.hgrc
(Windows) %USERPROFILE%\Mercurial.ini
(Windows) %HOME%\.hgrc
(Windows) %HOME%\Mercurial.ini

(Unix, Windows) /.hg/hgrc
Configure your hgrc to enable the extension by adding the following lines:

Mercurial環境設定ファイルへ追記

ダウンロードしたhgsubversionへのパスを指定。
hgsubversionが二つ出来ているので、二つ目までをパスに指定。

[extensions]
hgsubversion = (任意のダウンロードディレクトリ)/hgsubversion/hgsubversion

次!にsvnのための追記。

[extensions]
rebase=
svn=(任意のダウンロードディレクトリ)/hgsubversion/hgsubversion

これでsvn://に対してダウンロード(クローン?)が可能になる。

文字化け対策

utf-8はいろいろ文字化けるらしい。
また、svnのコミットログも化ける。

変換のツールダウンロード。
hg clone http://bitbucket.org/tinyfish/hg-fixutf8/

それにしたがってhg環境ファイルも書き換え。

[extensions]
fixutf8= (任意のダウンロードディレクトリ)/hg-fixutf8/fixutf8.py

とおもったら、だめっぽい。
これがなんかじゃまする!
Hgが動かなくなる!!!!!!!!!!!!!
コマンドプロンプトの文字化けは解消するんだけど、動かないんじゃ意味ないよね。。。

環境変数に追加

HGENCODING=utf-8
HGENCODINGMODE=replace →これはまだ試してない。

svnのクローンを作ってリポジトリ

hg clone svn://XXXX/repo
(hg clone --startrev リビジョン番号 svn://XXXX/repo)

うまくいくはず!

カスタムコントロールとユーザコントロールの違いって??

C#で人が作ったのを改造してコントロールの拡張ライブラリを触った事は有るんだけど、1からってどうしたらいいの?dllって?のレベルなので調べようとしたら、タイトル。
以下はそれっぽいまとめ。

ユーザコントロール

ベースはフォームっぽい。
その上に標準コントロールをのせて、共通で良く使うコントロールの組み合わせ・メソッド・プロパティを共通部品として扱おう、という扱いみたい。

カスタムコントロール

標準コントロールを拡張し、共通部品にするかんじ?
例えば、テキストボックスに入力規制機能をつけてみたり。
*1

2011/04/19 11:04

どうもMSの方でも呼び名が統一されていない??
(参考*2*3
多分どっちでも良いんだろうなあ。
(前述のカスタムコントロールを組みわせて前述のユーザコントロール作成も不可能ではないから)

①複数コントロールを組み合わせて、それを部品化する
②標準コントロールを拡張する

って二つがあると覚えておこう…。
参考サイトで何とかなるかな?やってみる。

*1:どうも、Expressではカスタムコントロールが作れない悪寒…。

*2:http://code.msdn.microsoft.com/10-C-2da030c6/

*3:http://msdn.microsoft.com/ja-jp/library/ms745025%28v=vs.80%29.aspx#creating_a_custom_control

BindingSourceと単純なコントロールをバインドする

 BindingSourceとしてTextBoxをはじめとするUI系コントロールとバインドした時に、入力値が誤っている場合にフォーカスが外れなくなる障害が発生した。その調査を行っていて気付いたこと、分かった事について以下にまとめる。*1

 バインドした時に期待されるのがBindingSourceとControlの同期である。ここでの同期とは以下の事を指す。

  1. Adapterを介して取得したデータ情報がBindingSourceに格納されることでバインドを設定した項目情報がControlに描画を含めて反映される
  2. ユーザがControlに入力した情報がプログラムを記述することなく、BindingSourceに反映される。

 同期の仕組は「変更通知」により実現している。BindingSourceとControlがそれぞれ変更を通知しあって値を設定・描画等を行っている。
 
 ControlからBindingSourceへの変更通知のとき、Controlの情報を「検査」する。
 「検査」結果がOKであればBindingSourceに格納します。NGの場合は処理をキャンセルする。
 以下にフローチャートを記述する。
 
 検査はバインドしているDBの項目に一致しているかどうかを検査する。
 例えば、日付型の項目とバインドしている(Control)テキストボックスに0000/00/00を入力する。すると、結果がfalse(DBに設定することが出来ない値)と判断され、処理がキャンセルされる。
 この処理を行っている時に発生するイベントをValidatingとValidatedという。
  

ValidatingとValidated

 このイベントはLeave→Validating →Validatedの順番で発生する。コントロールがフォーカスを失って(Leave)、ユーザの入力を検査し(Validating)、検査後にBindingSourceに値を反映する(Validated)。もし検査が誤った場合、Validatingは「フォーカスを失う」処理をキャンセルし、Validatedは発生しない。
 

対応策案

 ValidatingとValidatedのため、バインドしたコントロールはDB登録が不可能な値を設定した時にフォーカスが外れない、という障害が発生した。この症状に対応するには以下の方法が考えられる。

  • Control.CausesValidation プロパティをFalseにする

CausesValidationは前述したValidatingとValidatedを抑止するプロパティである。これをFalseにすると検査と検査後の設定処理が行われなくなるため、「誤った値が設定されたとき」にフォーカスが外れなくなることはなくなる。

  • 問題点

 ValidatingとValidatedはControlの値を検査し、BindingSoruceに設定する動作を行っていたため、これを抑止するとControlとBindingSoruceの同期がとれなくなってしまう。
 対応策として、バインドしているControlの値を直接BindingSoruceに設定する事が考えられるが、バインドの利点が無くなってしまう。

  1. Leaveイベント時に値を設定する。

 Leaveイベント時にDB項目として矛盾しない値を設定すると、この問題は発生しなくなる。

  • 問題点

 自動的に値が設定されてしまうので、入力ユーザが意図しない値が登録されてしまう可能性がある。
 そのため、以下の制御が考えられる。

  1. ユーザが分かりやすいように背景色を設定する(登録する・しないはユーザまかせ)
  2. 異常フラグ等を設定して、登録前に全項目をチェックし、その状態の時は登録を行わないようにする(システムで制御)

参考:
http://msdn.microsoft.com/ja-jp/library/xz45s2bh%28v=vs.85%29.aspx
http://msdn.microsoft.com/ja-jp/library/ms993236.aspx

*1:前に調べたものをdocにまとめてたんですけど、間違いとかありそうなので、こちらにアウトプット。
図で〜とか言ってるところは、wordで書いてたので省略。後から追記するかもしれません。

テスティングフレームワーク利用について

仕事関係でちょこちょこ調べていたんだけど調べた結果、プロジェクト内では使わないことになったのでテキストをコピペ。使い方というよりは概念よりですね。
このまとめは私見がありまくってるので注意してくださいー。

利点

  • テストを自動化、さらにプログラム化することで手順を踏んで値を確認する必要が無い。
    • 作成の手間はあるが、1度作成してしまえば再度テストする時の手間が省ける。
  • 仕様変更が行われた場合、プログラムを修正したとき既存の処理に影響が無いか確認するテストが前回作成したものを一気に行えばいいので簡単。
  • VB限定かもしれないが、デバッグのたびにビルドを行っている→その必要が無い。
  • 複数パターンを前もって登録しておけば何度も入力操作をおこなう必要が無い。
  • テストを作成して保持することができるので、入力に関してはどんなテストによってエラーが出たかを管理することが出来る
    • (形として残る)
  • 複数テストを行う場合、操作の手間が省ける。
    • (細かくテストを作成しておけば、そのテストを組み合わせて順次実行していくテストも作成可能?確認していない)
  • テストファーストの場合
    • テストがどれだけ完了しているかで進捗管理につながる
      • そうでないとべつにそうでもない。 
  • テストが厳密に行う事が出来る→品質の向上?

欠点

  • そこまでする必要があるのか。
  • 慣れるまで時間がかかる
  • 複数パターンを試したい時、初めの作成が多少手間(CSVデータの作成かメソッドの複数作成) 
  • UIの動作確認は行えない。あくまでメソッドの中身。表示の確認は現行通り。
  • テスト項目をきめていない、そこまで厳密に行っていないので必要かよくわからない。
  • メソッドのパラメータ→結果調査くらいならオブジェクトテストベンチで十分。ほかのオブジェクトからデータを設定などする必要があるデータは設定が面倒(複雑)