がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

ナニカガチガウヨウナ…

元ネタ
よいプログラムほどクラッシュしやすい??
http://oibore-se.blogspot.com/2009/04/blog-post.html

上司から私が作ったプログラムが、
動かなくなった至急対応してくれといわれ、現場に向かいました。


調べたところ、私を引き継いだ後輩のプログラマーが、条件式一箇所修正したのが、
原因とわかりました。


また以前参加したプロジェクトでは、問題が発生したのでコードを調べたら、
!!という条件文がありました。言語はJavaでしたが、!はNOT否定を示す式で、
!!は二重に否定していて、意味がありません。!の間違いではと修正したら、
問題は解決しました。このコードを書いたのは大変優秀な大学の学生でしたが、
QAを実施せず、コードレビューだけでプログラムを収めていました。
コードレビューで、この条件文部分は見逃していたようでした。


また、以前私が修正したSQLのストアドプロシージャでは、SQL文であるフィールドの値を
別のフィールドに設定するUPDATE文を誤ってフィールドの頭に変数を示す記号@
をつけてしまったことで、大量の注文データに誤ったデータが設定されることなり、
それがWebサイトのライセンス認証に影響してしまったことがあります。
この誤りは、単純なテストケースでは発見できず、それ以降ストアドプロシージャについては、
コードレビューも行うようにしたものです。

えと…とりあえず「テストくらいしようよ」とかいうのはおいといて。

しかしながら、こうした技法は一方で、1つのステップに絶対的な意味を持つことになり、一箇所一文字の修正が命取りとなりえます。私がプロジェクトを抜けたり、会社を辞めた後に、「大変だ!動かなくなった!至急対応してくれ!!」を携帯電話を受けて対応を求められるのはそのせいかと最近思い始めているほどです。
使う側から見ると、私がいる間はシステムは安定していたのに、いなくなった途端大トラブルというわけです。


その点、D.R.Yを実践していないプログラムは、品質はよくありませんが、それなりに動いて、不満は残るが大トラブルにもならないような気もします。ただしメンテナンスにかかるコストは大きくなりますが。。

おいら的には完全にNG。
1ステップ(1コード)が重要かつ絶対的な意味を持つのは当然で。
「D.R.Yを実践していないためにそれなりに動いている」っていうのは、言い方を変えると「どこがバグってるかがよくわからないから微妙にバグってるままのプログラムを動かしている」のと同意だと思うです。


ミスったら「ミスった」とはっきりわかるほうがよいと思うのですが、どうなんですかねぇ?


…で、思い出したURI。おいら的にはこっちのほうがコレクト。
間違ったコードは間違って見えるようにする
http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

諸行無常とか無常観とか

こっそりとカテゴリが追加になってる今後の布石は気にせずにw


んと…諸行無常とか無常観とかって単語があるのをみなさんはご存じでしょうか?
coreになるのは「無常」。つまり「常なるもの無し」です。「万物は流転する」と書くと別の人の言葉*1になりますね。意味は一緒ですが。
変化をしないものはない、というのがこの考え方なのですが。


システムにおいても「全く同様」の事が言えるのではないか、と、思っています。
というか、どこかで「これは絶対に変わらない」なんて無意識を持っていませんか?
あらゆるものは変化します流転します無常です。
…という言葉における「あらゆるもの」に含まれないものは、何一つないのですが。きっとそれでもなお人は、つい。
「あらゆるもの」の中から、自分にとって都合の良い、或いは都合の悪いものを意図的に、無意識に、排除してかかります。


今一度。定期的に。
自分の持つ全てを、問い直してみては如何でしょうか?
もしかするとそこには「実はすでに変化した、流転しつつある」新しい流れが、見えてくるかもしれません。


それとも。
「水から茹でられたカエル」のように、ゆっくりと、致命的なところまでゆだってみますか?
「水であるはず」という思い込みにしがみついて。

*1:ヘラクレイトスの言葉だと言われてますが、実際の所、よくわからないみたいですね

URIに関するメモ

真剣に徹底的にmemoです(笑
…とはいえ。結構使いたいシーンはあるんだよなぁ、と。


Uniform Resource Identifier (URI): 一般的構文
http://www.studyinghttp.net/rfc_ja/rfc3986

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty

URI-reference = URI / relative-ref

absolute-URI = scheme ":" hier-part [ "?" query ]

relative-ref = relative-part [ "?" query ] [ "#" fragment ]

relative-part = "//" authority path-abempty
/ path-absolute
/ path-noscheme
/ path-empty

scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

authority = [ userinfo "@" ] host [ ":" port ]
userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
host = IP-literal / IPv4address / reg-name
port = *DIGIT

IP-literal = "[" ( IPv6address / IPvFuture ) "]"

IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

IPv6address = 6( h16 ":" ) ls32
/ "::" 5( h16 ":" ) ls32
/ [ h16 ] "::" 4( h16 ":" ) ls32
/ [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
/ [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
/ [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
/ [ *4( h16 ":" ) h16 ] "::" ls32
/ [ *5( h16 ":" ) h16 ] "::" h16
/ [ *6( h16 ":" ) h16 ] "::"

h16 = 1*4HEXDIG
ls32 = ( h16 ":" h16 ) / IPv4address
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

dec-octet = DIGIT ; 0-9
/ %x31-39 DIGIT ; 10-99
/ "1" 2DIGIT ; 100-199
/ "2" %x30-34 DIGIT ; 200-249
/ "25" %x30-35 ; 250-255

reg-name = *( unreserved / pct-encoded / sub-delims )

path = path-abempty ; begins with "/" or is empty
/ path-absolute ; begins with "/" but not "//"
/ path-noscheme ; begins with a non-colon segment
/ path-rootless ; begins with a segment
/ path-empty ; zero characters

path-abempty = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-noscheme = segment-nz-nc *( "/" segment )
path-rootless = segment-nz *( "/" segment )
path-empty = 0

segment = *pchar
segment-nz = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
; non-zero-length segment without any colon ":"

pchar = unreserved / pct-encoded / sub-delims / ":" / "@"

query = *( pchar / "/" / "?" )

fragment = *( pchar / "/" / "?" )

pct-encoded = "%" HEXDIG HEXDIG

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="

新人さんに捧げる「学び方」

この時期ですし。新人さんが「新しく技術という世界に飛び込む」事も少なからずあろうかと思います。
で…いくつか、memo程度ではあるのですが。


まず基本というか前提として。
「技術は、それが無かった時に苦労したり困ったり無理だったりしたサムシングを、出来るようにしたり楽にしたりするためのもの」であり。
また、そうやって出来た初期の技術が、機能概念を追加されたり削除されたりねじ曲げられたりした紆余曲折の結果が「今の技術」です。
なので。
その技術が「なかった頃の困ったさむしんぐ」とその後の紆余曲折を、できるだけ知ろうと努力してみてください。
こういう時にこそ「繰り言を繰りたおすとっしょり」が便利です(笑


んで。
そのあたりも踏まえたうえで。大まかに、技術の学び方には2種類あると思ってください。
1.根底から
2.上っ面だけ


基本的には1番の「根底から」のほうがそりゃ当然好ましいのですが。
実際問題として「そうそう勉強ばっかりされてても困るから多少は実務も」って側面が、ビジネスとしてはどうしても出てきます。


ただ一方で。2番を「当面」チョイスするのはよいのですが。何となく出来ちゃうものだから1番の勉強をすっかりと怠ってしまう事も多く。
ただ、その場合確実に「応用の利かない」技術者になりますし、その他様々な弊害が出てきます。
でも「とりあえずできる」事も多いので、必ずしも否定仕切れないのが微妙なところです。


学ぶ「姿勢」については、以前に書きましたが( http://d.hatena.ne.jp/gallu/20090228/p1 )。
「何を学ぶのか」という事については…現実も絡めると結構色々とありますので(っても2種類ですが)、ご注意のほどを。ってか自分の意志で選択していきましょう。


ついでに。
「下手に習うと下手がうつる」とか申しますし。
Webサイトにしても書籍にしても、それが必ずしも「よいものだ」とは限りません。特に「有名サイトがぢつは以下略」なんて事も少なくありませんので…ご注意をっても注意のしようがありません orz
ですので。せめて「異なる複数のルートから」平行して学ぶようにしましょう。せめて。
後はやはり「メンター(師)」を見つけることです。………えぇまぁそれが如何に「見つからない」ものか、ある程度理解した上で言ってるんですがね(苦笑

はかる道具の難しさ

んと…そのうちまじめに言及したいのですが、とりあえずまずはざっくりってか見かけたので概ねmemo。


プログラマは履歴書をどう見るか
http://www.aoky.net/articles/steve_hanov/how_a_programmer_reads_your_resume.htm


細かい項目はともかくとして、概ね正鵠を射た内容だと思う。
ただ。人事部の「職務内容に見合うスキル」ってのは。正確には「必要なスキル」という意味ではなくて「"今回使うスキルList"という、どこかから提出された文字配列と合致する文字列」という意味合いである事に注意。
しかもそのList。好意的に見ても「スキルレベル」には言及がなされていませんし、そも本当に必要なスキルは書かれていない事が多いってのもありがちなお話しです。
酷いと「似たプロジェクトであると[認識 | 誤認]した別のプロジェクト」の必要なスキル文字配列のコピペなんて所行も以下略。


なんていうか…1mの長さが必要な糸を選別するのに。
「弊社ではスペクトル分析器とダウジングを併用して計測を行います」とか言われても、純粋に困惑するわけです。
1mの長さが必要なら。通常であれば物差しか。もうちょっと「誤差がタイトなレベルで許されていない」のであれば、相応の「長さを測る機器」を使って欲しいわけです。


っていう話がまったくもって人事部の人には伝わらない事が多いのが、未だに不思議。

うわ微妙…

んと。ちとお仕事でiPhoneのアプリケーションの作成が入りまして。
自分なりにノウリッジを蓄積しようと考えて「iPhoneアプリケーション」タブも作成していたのですが。


その前に。


iPhoneのアプリケーションデベロッパは支払いの遅れとカスタマサービスの無能ぶりにいらいら
http://jp.techcrunch.com/archives/20090324iphone-app-developers-gripe-about-payment-delays-and-dismal-customer-service/

iPhoneのアプリケーションデベロッパは決められた日にAppleから支払いを受けているのだろうか? そうでない人もいるようだ。このiPhone デベロッパフォーラムには、1月の支払いをまだもらっていないとか、もらったけど売り上げに比較して金額が足りないといった苦情のスレッドがいくつもある。本誌に直接、苦情を投稿してきたiPhoneのアプリケーションデベロッパも、Appleからの1月ぶんの支払いが遅れていると言っている。この記事の下のほうに埋め込んだAppleの契約書は、月末締めの45日後払いと明記している。ということは、すでに1週間は遅れていることになるね。


AppleiPhoneアプリケーションの返金制度はデベロッパを破産させる
http://jp.techcrunch.com/archives/20090325apples-iphone-app-refund-policies-could-bankrupt-developers/

iPhoneのユーザがアプリケーションを(Appleの制度では90日以内に)‘返品’したら、デベロッパは売り上げから得た金額を返金しなければならないようだ。しかしここに落とし穴がある。Appleは全額をユーザに返金するが、手数料(売り上げマージン)は取るというのだ。だからデベロッパは売り上げから得たお金を返すだけでなく、Appleに手数料を払わなければならない。App Storeで売れた金額の30%がAppleの手数料だ。だからデベロッパの取り分は70%だが、ユーザに返金する場合はデベロッパは、Appleに売り上げの100%を返金しなければならない。
-中略-
本誌が話を聞いたデベロッパは、返金を受け取ったユーザはそのアプリケーションを使えなくなるはずだが、実際のところどうなるのかよく分からない、と言った。しかも、契約書のこの部分は後から加わったもので、デベロッパが次世代のApp StoreiPhone OS 3.0の公式リリース後)でアプリケーションを売りたいならこれにサインしなければならない。でも、もう1人のiPhoneデベロッパから見せてもらった契約書には、12月の時点ですでにその条項がある。

えと………ちょっとお殿様商売が強すぎるような………
結構、なんだかんだiPhoneアプリケーションって増えるかなぁとは思ってたのですが…これをみると、まず作成業者が逃げ始めるんじゃないですかねぇ? 大企業は多分「個別に特殊な契約で優遇されている」可能性も否定できませんが。


全方位に玉なサービスというものは、なかなかないものですねぇ。