ラベル misc の投稿を表示しています。 すべての投稿を表示
ラベル misc の投稿を表示しています。 すべての投稿を表示

2016年9月12日月曜日

プログラミングにおける演算子と言語の進化に関する思想録

いきなり紛糾から本文を始めてしまいますが、現代において最も幅広く使われている言語の直系の始祖はC言語です。しかし、このC言語は最大にして不可侵の過ちを犯してしまいました。それはそう、"代入演算子"です。
数学における"="記号は"等価"を表します。a = 1という式は、aは1と等しいという意味であり、それ以外の何者でもありません。しかし、あやつ(C言語)はこの記号に代入という新たな意味を割り当て、代わりに等価演算子は"=="という新たな記号を生み出してしまいました。これにより、数学世界とコンピュータ世界の乖離が発生してしまったのです。

この乖離により、コンピュータ言語への入門のハードルが一段階上がってしまったと言えるでしょう。なぜなら、C言語での代入記号の導入により、その血筋を受け継ぐ言語(いわゆるC系言語)においても、"="記号は、代入演算子として使用される羽目となり、その結果、これら後継言語においても数学世界との乖離を生み出してしまったためです。
代入記号の導入により生み出される混乱は以下の通りです。


  1. if文内で数学の"="記号として、この記号を使用する
  2. 実際には代入となるため、左辺の値が変わってしまう
  3. 特にC言語系においては、if文の条件式になんら制約がないので、コンパイルが通ってしまう
  4. 結果、if文内で変数の値が変わってしまい、想定と違う動作をするバグを作りこんでしまう

もちろん、この程度の落とし穴ならば、人間が細心の注意を払えば回避可能ではありますが、現代のコンピュータ業界において、性能の向上は著しいものがあります。このような、多少のコンピュータリソースの消費で回避できうるミスならば、回避できる機構を用意して、使うべきだというのが持論です。
その持論に沿うように、最近作られた言語では、if文の条件式にbool値を返す式しか書けないようになっていたりして対策が施されています。
登場当初は、その万能性から高級言語と呼ばれていたであろうC言語も、今となっては、中級言語と呼ぶべき存在になってしまいました。今後も、言語が進化を続け、ヒューマンエラーの排除を言語が行ってくれるようになるといいですね。

※思想「録」と言いつつ、1エントリーしかありませんσ^_^;

2014年10月11日土曜日

isucon4の予選に出た話

久々の更新です(半年ぶりぐらい?)。はざまです。
今回は2週間前にisuconの予選に出場してきた話を書きます。珍しく日記的な記事になりそうですね。

詳細はhttp://isucon.net/を参照していただきたいのですが、isuconとは、LINEが主催するWebアプリケーションの最適化コンテストです。毎回、モック程度の小規模なWebアプリを題材にして、リソースの圧縮やインフラ回りの最適化によってある時間内にさばけるリクエスト数の多寡によって競い合うものです。
わが「あーだこーだ」は、スコア26000程度で残念ながら本戦への出場はかなわなかったのですが、my.cnfの設定やAWSのセットアップ方法など、今後に繋がりそうな収穫を多々得られたため、よしとしましょう。
技術系ブログらしい詳細の話は、後日気が向いた時にでも、記載しようと思います。

2013年3月23日土曜日

SharpDevelop用BVEルートファイル作成支援アドインベータ版公開のお知らせ

どうも、こんにちは。はざまです。3回連続でBVEネタです。
表題どおり、前回のポストで発表したSharpDevelop用BVE5ルート作成支援ツールのβ版を公開いたしました。ダウンロードに関してはα版と全く同じなので、前回のポストを参照してください。
α版に比べて、一部不完全だったコードコンプリーション機能の拡充を行い、
Track[a]
のような形の式に対しても、補完候補を提示するようになりました。このとき角括弧の中にカーソルがある場合には、角括弧の前にある型名に合わせてユーザー定義文字列も含めた適切な候補を提示するようになっています。
つまり、
"Sound["と入力する→ルートファイルのヘッダー部分に記述したSound.Loadコマンドからサウンド定義ファイルのパスを取得→その中身を解析して補完候補として提示する
というような感じです。その他にもコマンド名を入力後、開きカッコをタイプすることでそのコマンドに関するドキュメンテーションをツールチップで表示するようになりました。(なお、ドキュメンテーション内に記載されているコマンド引数の型名は当方で勝手に設定したものなので、ツールチップ通りの型を入力したのにBVE5にかけたら弾かれたというような場合にはご一報いただければ幸いです)
 まだ、正式版ではないので、バグや機能の不備など多々問題点があるとは思います(ただのルートファイル作成者の方にとってみれば、SharpDevelopでしか動かないという点が最大の不備かもしれません)が、ルートファイル作成者様方のお力添えとなれるよう、またBVE界の発展にも貢献できるよう今後とも尽力してまいりたいと思います。

(そろそろ、技術系ブログらしく技術ネタを一個くらい挟みたい・・・ )

2013年1月30日水曜日

BVE5用の京王線快速2001列車をATC化する作業を自動化するスクリプト

ご無沙汰してます、はざまです。時が経つのは速いもので、もう2013年も一ヶ月がたとうとしていますね。さて、今回はいつもとちょっと毛色の違う話題をしようと思います。といっても、最終的にはプログラミングの話に落ち着くんですけどね(^_^;)


話は年が明けたのを機に調子が悪くなっていたデスクトップPCのビデオカードを入れ替えたところから始まります。自身初のNvidiaだったので、ドライバー入れるまでにWindowsUpdateのせいで何回も再起動させられるなど、紆余曲折を経て無事セットアップを終え、GeForce660の性能を試してみたくていくつかゲームを試してみたんですが、GPU負荷的には余裕がある。こりゃ、今持ってるゲームじゃ660をフル回転させるのは無理だなと判断して普段使ってるノートPCでは起動できないBVEを久しぶりにやろうと考えてなにか面白そうなルートはないかグーグル先生に訊いてみたら、次のような記事を発見したわけですよ。
これは面白そうだということで、早速櫻井 倫氏作成の2001列車ルートを落としてきて書き換えを始めたんですが、作業を始めて20分ぐらいしてから全部手作業でやるのはかなりめんどいことに気づいたわけです。手作業がめんどいんなら全部自動化すればいいよねということで、今回の本題であるPythonスクリプトにご登場願えるわけですよ。
当のPythonスクリプトはこちらからダウンロードしてください。ページ上部左の"ZIP"ボタンを押せばZIPファイルでダウンロードできるはずです。以下、このスクリプトの使い方の解説に入りますが、多少、コマンドプロンプトなどのコマンドラインの知識が要求されることとPython2.7.3のランタイムがインストールされている必要があることを予めご了承ください。

  1. まず、落としてきたZIPファイルを解凍しましょう。今回使用するのはその中のko_2001というフォルダーの中身です。(まあ、まだko_2001以外にフォルダーがないので、迷うことはないとは思いますが)
  2. 櫻井 倫氏のウェブサイトから2001列車のルートデータを、BVE公式サイトからデータコンバーターをそれぞれダウンロードしてきて解凍します。
  3. 2001列車のルートデータをデータコンバーターに通してBVE5で動く形式にします。(一旦、次のステップに行く前にこの状態で本当にBVE5で動作するか軽くテストしてみるといいでしょう。)
  4. ステップ1で解凍したko_2001フォルダーの中身をBVE5用に変換された2001列車データフォルダーに移動します。標準なら"マイドキュメント\Bvets\Scenarios\"にあるはずです。(このステップは、ステップ6で使用しているコマンドの意味がわかる人は飛ばしても構いません。)
  5. 次にコマンドラインを起動し(Windowsの場合Vista以降か7以降かは定かではありませんが、標準でコマンドプロンプトかWindows PowerShellという2種類のコマンドライン(っぽい)環境が使用できますが、今回のスクリプトはコマンドプロンプトの方でのみ動作確認をしております。Cygwinとか入れている人はそれを使ってもいけますが、コマンドプロンプトに合わせてエラーメッセージのエンコーディングをS-JISに設定しているので、エラーメッセージが文字化けします(多分)。Cygwin使いの人たちはf*ck you cmd.exeとでも叫んでおきましょう(^_^;) )先ほどko_2001フォルダーの中身を移動したディレクトリーに移動します。
  6. コマンドラインに次のコマンドを入力します。
    ko_2001フォルダーの中身を移動した人:
    > python ko_2001_bve5-ify.py Map.txt (なにか適当なファイル名:例えば、Map_ATC.txtなど)

    ko_2001フォルダーの中身を移動しなかった人:
    > python (上記のスクリプトへのパス) Map.txt (なにか適当なファイル名:例えば(ry)
以上で、このスクリプト自体の使い方の解説は終わりです。あとは、シナリオファイルや車両ファイルなどを書き換えれば晴れて2001列車をATC環境で運転できるようになります。運転できるようになるんですが、はっきり言って停車パターンが鬼畜です。全線運転して初見で一回もパターンに引っ掛けずに運転するなんてはっきり言って無理でしょう。あんな鬼畜な停車パターンに毎日耐えて運転しているKOの運転士たちはきっとドMに間違…おっと誰か来たようだ。

今回の2001列車ATC化プロジェクトはここでおしまいですが、今後も(面白そうなルートとやる気があれば)BVE5-ifyプロジェクトと題して今回のようなPythonスクリプトを不定期で公開していくかもしれません(もっとも、今回のはBVE5ならではの機能は一切使っていませんが)。もしもシリーズ化することになったら、そのときはお付き合いください。

※なお、このスクリプトを使用したために発生した不具合に関しては一切責任を負いかねますので、予めご了承ください。また、Python 2.7.3以外での動作は保証しかねます。

2012年10月9日火曜日

JavaScriptの救世主(?)

またまたお久しぶりです。はざまです。
先日、TypeScriptというものが発表されましたね。Microsoft製の型安全なJavaScriptのスーパーセットとのことですが、ネット上ではなんだか盛り上がってるようなので、自分も軽く触った所感でも記しておこうかと思います。

まず、シンタックスについてですが、現行のECMAScriptの要項を素直にそのまま実装した感じといったところでしょうか。型指定子は後置形式ですし、関数シグニチャもHaskellやScalaのような書き方になっています。そういえば、C++11ではこれと似たような関数シグニチャの書き方も出来ましたね。
次に互換性ですが、これは全く危惧する必要は無さそうです。というのも、Typescriptは一旦コンパイルしてしまえばプレーンJavaScriptに翻訳されるようですし、公式サイトにも既存のコード資産を有効活用できる旨がしっかり明記されています。ただ当然、それらのJavaScriptで記述されたコードはTypeScriptの恩恵を受けられないのが残念なところではありますが。(と思ったら、既存のJavaScriptのコードでも型情報を追加する方法はあるみたいですね。公式サイトにはNode.jsとjQueryの例が載っていました)
さていよいよ、TypeScriptの真髄とも言える機能に焦点を当てることにします。まず、名前からも推測できるように「型」が追加されたことで、プレーンJavaScriptでは実際に動かしてみるまで全く予想がつかなかった型不一致や型誤認によるありもしないプロパティーを参照するなどの凡ミスをコンパイル時に発見できるようになり、error-proofなコードが書きやすくなっています。さらに、型の追加による恩恵はこれだけにとどまらず、プレーンJavaScriptでは、コンテキストというものがほぼ存在せず、推測するべくもなかったコード補完機能がパワーアップして使いやすくなったり、随時変数の型が確認できるようになるなど生産性の向上が見込まれます。
また、TypeScriptでは(やはり見た目だけですが)クラスベースのオブジェクト指向が使えます。プレーンJavaScriptでも、ライブラリを使用すれば多少いびつながらもひと通りのOOPはできるので、必須とは言えないかもしれませんが、コードがすっきりするのでプログラマの意図をコードに載せやすくなると言えるでしょう。
その他にもモジュールやラムダ関数(JavaScriptには標準でクロージャーがついていますが、ここでいうラムダ関数は、どうやらほぼクロージャーの糖衣構文のようです。TypeScriptの開発者がC#も開発していたとのことなので、C#のラムダ関数を思い浮かべればイメージしやすいでしょう)もサポートされているようです。
そのへんについてはこれからいろいろいじってみて、後日改めて記事にすることにしましょうか。


まだまだ開発途上のTypeScript。いずれジェネリックプログラミングもサポートするとのことなので、JavaScriptといったらTypeScriptのことを指すことになる日が来るかもしれませんね。
でもその前に、IEでのHTML5やCSS3のサポート範囲を広げてくださいよ、Microsoftさん。


参照したサイト一覧:


※こちらの記事は、あくまで所感です。もしかしたら間違った記述も含まれているかもしれないので、100%鵜呑みにはしないでください。

2012年4月3日火曜日

ブログ始めてみました

いやあ、春ですね〜。なにか新しいことを始めたくなる季節ですよね〜。
というわけでどうも、はざまと申します。以後お見知りおきを。

初回の投稿なので、軽く自己紹介でもしましょうか。
名前は最初に述べたのでいいとして、こちらのブログでは主にWeb(基本的にJavaScriptによるプログラミング。もしかしたらそれに関連してHTML5などの周辺技術も)とNative(ネイティブ環境で動作するプログラミング言語。主にC++)をテーマにこれら言語の仕様やこれらの言語でプログラミングしていて思ったこと、つまづいたこと、使ってみて自分が素晴らしいと思った技術のメモ、別途公開している自作プログラムの解説、製作日記などを綴っていこうと思っています。
よろしくお願いしますm(__)m