for (int i = 0; i < (int) ((bigArray.length + 99) /100); i++)
に対してこのコメント「配列を100個ずつに分割するコードなんですよ。えええええ。なんだこれ。99っていったいどこから出てきた?しかもこのコード、コメントなしなんですよ?このコードがコメントなしで伝わるコードなわけないだろと」。書き直させたのがこのループ
for (int i = 0; i < bigArray.length; i+=100)
■ (x+N-1)/N (ただし 0<=x, 0<N)
っていうのは切り捨て除算で端数を切り上げる定型なのであって、書き直し前と後のループの違いは、ループカウンタが分割後の配列のインデックスになってるか分割前の配列のインデックスになってるかであり、どちらに着目しても結局両方のインデックスを使うのだから大差はない。どちらのループも書ける下請けの人の方が上等ですな。■思い出話。この定型を初めて見たのってビットマップ配列を処理するコードでのこと。ビットマップの横幅は4バイトアラインのためパディングが入ることがあって端数を切り上げたものが実際のバイト幅……みたいなことをよっちゃんいかの人(今はひよこ将棋とかやねうら王の人?)の古いサイト(BM98'S ROOMつう)のどこかで読んだと思う(※嘘を書いてたらそれは俺の記憶違い)。■「たとえば、関数を書くとなると、なにをするにしても、int process() { String str; int i, j; ・・・ return 0; }
という書式で書きたがる。まるでそういう決まりがあるかのように。ここで、変数str、i、jは処理の最中にどんどん意味合いが変わる。intでは表現できない情報を返す必要がある場合は戻り値はStringになる。複数の情報を返す場合は、Stringの中にカンマ区切りで情報を記載すし、呼び出し側でカンマ分割して復元する、なんてことを平気でやる。構造体ってなんのためにあるか知ってますか。
」 Stringを使ってる時点で言い逃れはできない感じだけど、構造体はレジスタに入らないから関数の戻り値にはできないとか、そういう制限のあるコンパイラがあったと思うんだよね。まさしくそういう決まりがあった。変数の使い回しはスタックの節約とか? 一度たたき込まれたことを律儀に守ってるんじゃあないでしょうか。■「for (int i =0; i < length; i++) { }
繰り返しもこう書かなくてはいけないという明確な意思があるようだ。
」 eachだ forEachだ mapだ someだ anyだ everyだ reduceだ selectだと目的ごとにメソッドを選ぶのがわかりやすいか、たったひとつの道具(forループ)を使うのがわかりやすいかは見かたにより判断が分かれる。知識レベルが大きく違っていたり平均レベルが低かったりする多人数が理解できる最大公約数的存在がどちらかといえば……。自分の身の丈をよく知っている。■しかしこの節操のなさは擁護できない。「急にモダンなスタイルのコードが出現した場合、それはどっかからのコピペである。」■「
要素に対して加工処理を実行します - function elementProcess(elm)」 あかん、笑う。つくづく思うけど、今どきの言語は識別子に大概の Unicode文字が使えるから、低レベルでドメスティックな現場では日本語を使わないとダメよ。しかしそれであっても、母語であっても、理路整然と矛盾のない文章をすべての人間が書けるというわけではないのだけど(それでも英語で書かせるよりはまし)。■「
なぜかパラメータ名に10とかShiftJisとかの値が入ってる。この、パラメータ名とそこに入れる値が区別ついてないっていうパターンは驚くことにかなり頻発する。」 園児や発達障害者ではあったと思うけど、こういう間違い方の事例を集めたものが面白そう。自分を例にして間違えたわけではない理由を考えると、パラメータが取り得る値のひとつを代表値として名前に使用することで、その変数の具体的イメージが掴みやすくはなる。変数名を「文字コード」という総称にするより「シフトJIS(など)」とした方が具体的でわかりやすいという傾向があるのでは? 数学者に関する笑い話のようなエピソードを読んだ。「
済みませんが,もう少しわかり易く抽象的に説明して頂けませんか」 自分らは数学者ではないので……。■「
「有効状態のものだけを取得」したい場合、isEnabledFalseにはなにを指定すれば良いのだろうか。だれにもわからない。多分本人ですらわからないんじゃないか。繰り返して言うけど、頭がおかしいんだとおもいます。」 あかん、腹がよじれる。車の運転だけじゃない。たぶんコンピュータの方が(平均すると)よっぽどましなプログラミングをする。■ところで仁王っていうゲームの実況動画を見ていたら「
装備の重さの、上限に対する比率が100%を超えています」というメッセージが出てきていた。日本語に不自由していますか? 「装備の重さが上限を超えています」ではいかんの? ひょっとして 100%、75%、50%とかの数字に意味があるの? ←「上限」というのと「比率」というのがステータス画面で使用されているキーワードだった。じゃあ……まあ……。
【最大50%OFF】スキルUP応援!プログラミングフェア/【50%OFF】お金の不安を解消する本フェア」 中まで読まなくても件名くらい読みましょうね。ただまあ、文庫新書漫画以外の本を電書で買うふんぎりはまだついていないのだけど。■他にも目を付けていてまだ買っていない「【Reader Store】APIデザインの極意 Java/NetBeansアーキテクト探究ノート(Jaroslav Tulach,柴田 芳樹) : インプレス - 電子書籍」が半額。読み捨てにするにはもったいない内容だからこそ紙の本で買いたいんだけど、半額ならそうなってもいいかって気にさせる。
C++1z タプルを展開して関数呼び出しするapply関数」(C++1zの言語拡張まとめ - Faith and Brave - C++で遊ぼう)■つまり、引数リストがオブジェクトになり、プログラムから操作可能な対象になるということ。ごく最近のことだけどこれ(BugReport/211 正規表現キーワードで dll がエラーを返すと落ちる)に関連してソースを見たときに、BMatchという APIと BMatchExという拡張された APIが目に入って、引数がひとつだけ追加されているという違いがあるんだけど、それがために2つの APIを呼び分けるためにはソースコード上で if や条件演算子を使って、ベタに呼び出しコードを書いて並べなければいけなかったりする。そういう分岐を、局所化してまとめたり外部に追い出したりできるのが嬉しい。■もうひとつしょうもないことに目がとまった。「
非推奨だったbool型に対するインクリメント演算子を削除」未初期化の bool変数をインクリメントすると必ず trueになるっていうの、2か月前(20161214)にパッチを読むにあたって(パッチの内容とは関係ないけど)初めて知ったんだけど、使えなくなるのか。使わないけど。■タプルと applyに戻る。「
C++14で追加されたコンパイル時整数シーケンスを使用した最初の標準ライブラリ実装になります」 コンパイル時? 整数? やっぱり bindしかないの?■整数型と対比されるものがなんなのかわかっていない。だって例では std::stringを含むタプルを渡してるもの。
このファイルの名前を変更すると、'A_files' フォルダに属さなくなります。ファイルの名前を安全に変更するには、このファイルを開き、新しい名前で保存してから 'A_files' を削除します。このファイルの名前を変更しますか?」とメッセージが出る。このメッセージの目的はよくわからない。A_filesを削除するときに B.htmlと A.htmlの両方があれば A.htmlの方が一緒に削除されるし、A.htmlがリネームされて B.htmlになっていれば一緒に何も削除されないというそれだけのことだ。何が危険なのか。■A.htmlを A.htmに名前変更しようとしても同じメッセージが出るが、ファイルとディレクトリの関連が失われることはなかった(片方を削除すると両方がごみ箱に入った)。■A.htmlと A.htmというファイルが同時に存在するときに A_filesを削除すると、A.htmlと A.htmを加えた3つがごみ箱に入った。■A.htmlというファイルと A_filesというファイルのあいだには関連は生じないようだった。■すでに実験で明らかになってるけど、最初は Zone.Identifierと同じように代替ストリームに関連ファイル名が書き込まれてるのかもと思ったが、単純にファイル名の慣例に基づく判断だったみたい。エクスプローラーの判断か、エクスプローラーにアタッチされた外部プログラムの判断かはわからないけど。■悪しき自動化だと思う。数日前には動画に付けた匿名コメントが自分の Twitterアカウントにも流れていたということが話題になったし、さらに前には iPhoneで裸を自撮りした(ことのある)教師が部活動の様子を iPadで撮影させていたところ、女生徒がその画像を見るところとなり逮捕されるなどした。これが機械の裏切りでなくてなんだというのだ。機械というかソフトウェアか。プログラミングでできることならなんでもできますよ。でもお呼びじゃないんですよ。ただ、コントロールを明け渡してくれればそれでいい。