1年近く前に、複素積分をインタラクティブに行える Web ページ(Web アプリ?)を作ったのだが、ブログでの紹介がまだだった。
「プログラミング」カテゴリーアーカイブ
Windows で JDK のインストール先を取得
Windows に JDK を入れた時のインスートル先のディレクトリというのは、バージョンによって変わる。これを機械的に取得したい。
環境変数の類は設定されない(公式のマニュアルに、手動で設定する方法が書かれてるくらいだし)ようだが、レジストリを見ればパスを取得できる。
Stack Overflow の質問には reg コマンドを使った回答が付いているが、Windows の場合こういうのはバッチファイルで書くよりも WSH を使った方が文字列処理等がすっきりするだろう。
というわけで書いてみた。
var WshShell = WScript.CreateObject("WScript.Shell");
var JDKKey = "HKLM\\SOFTWARE\\JavaSoft\\Java Development Kit\\";
var CurrentVersion = WshShell.RegRead(JDKKey + "CurrentVersion");
var JavaHome = WshShell.RegRead(JDKKey + CurrentVersion + "\\JavaHome");
var JDKBin = JavaHome + "\\bin";
WScript.Echo(JDKBin);
このファイルを例えば showjdkpath.js という名前で保存して、 CScript /nologo showjdkpath.js と実行すれば、標準出力に javac の場所が出てくる。
Haxe の正規表現のターゲット環境による違い
Haxe で正規表現を使う際には、次のような問題点がある。
- ターゲット環境によって正規表現の細かい文法が違う。
- ターゲット環境によっては、Unicode の code point 単位ではなく、 UTF-16 の code unit 単位で正規表現のマッチングを行うものがある。JavaScript とか JavaScript とか ECMAScript 5 とか
- この場合、
[\uD800-\uDBFF][\uDC00-\uDFFF]というようなパターンを書くなどして、サロゲートペアを自前で処理しないといけない。
- この場合、
また、Haxe に限らなくても、文字列で正規表現のパターンを記述するのには、次のような問題点がある。
- 複雑な正規表現を文字列の形で直接ソースコードに書くのは、コードの読みやすさ的によろしくない。
- 正規表現の文字列を動的に構築する場合も考えると、いろいろカオスになりそう。
そこで、正規表現のパターン文字列を構築する Haxe のライブラリを作ることを考える。ライブラリ側で環境の違いも吸収することにすれば良い。 続きを読む
Haxe を触ってみた感想
Haxe とは、プログラミング言語である。公式サイト
ちょっとだけ使ってみたので、感じたことを書きなぐっておく。
特徴
複数の言語にコンパイルできる(ターゲット一覧):
- Flash (bytecode) / ActionScript
- 言語仕様は ActionScript の影響を色濃く受けているっぽい
- JavaScript
- PHP
- Java, C#, C++ などの静的言語
- 他
良いところ
- 代数的データ型(enum)とパターンマッチ(switch 式/文)がある。
- Haskell で言うところの newtype みたいなやつ(abstract)がある。
- インライン関数がある。
- 実行時コストを気にすることなく another level of indirection を導入できる。
- 条件コンパイルと併用するといい感じに環境の違いを吸収できそう。
- マクロがある。
- 実際どの程度強力かは、あまり使い込んでいないので何とも…。
悪いところ
- Java のように、すべての関数をクラスの中に書かないといけない。main 関数はどこかのクラスの static 関数で定義する。
- Java のようにと言うか、直接的には ActionScript から受け継いだ仕様っぽい。
- 型クラスや deriving がない。
- 代数的データ型を
==で比較できないのが地味に辛い(Haskell ならderiving Eqをやっておけば==で比較できる)。Type.enumEq は、中に enum じゃない物が入っていた場合==で比較してしまうみたいなので、オブジェクトへの参照を含む enum どうしの比較が辛いことになる。 - null の扱いがイマイチ。動的ターゲットと静的ターゲットによって微妙に違う。
- Option<T> 型と Null<T> 型のどちらを使うか迷う。
- NonNull<T> みたいなものが欲しい。
- 標準ライブラリの細かい仕様が、ターゲットに依存する場合がある。具体的には正規表現の EReg。
- Write once, debug everywhere と言う感じ。
- ターゲット依存の挙動を排除するために標準ライブラリの実装を肥大化させるか、ターゲット依存の挙動を許して標準ライブラリの実装をスリムにするかのトレードオフなので、やむを得ない面はある。
- 条件コンパイル(
#if〜#elseif〜#else〜#end)が使えるので、適宜切り分けるべし。
- 簡単なデータ型を作る時に、クラス型か anonymous struct 型か(enum 型か)悩む。
- Static extension を使えば、 anonyomous struct 型や enum 型にもメソッドを追加できる。
- 構築方法が
new Hoge(33, 4)/{foo: 33, bar: 4}/Hoge(33, 4)という風に違うが、 abstract を使えば吸収できそう(全部new Hogeの形で構築できるようになる、はず)。 - 静的言語がターゲットの場合、 anonymous struct 型は効率が悪そうに見えるので避けるべきかもしれない。
- 一方、 JavaScript がターゲットだとクラスよりも anonymous struct の方が良いのか…?と思ったり。
各ターゲットに関して
- JavaScript
- 等値比較を
===ではなく==でやっているのがイケてない。null/undefinedとの比較ならともかく、数値とか文字列とかは===で良くないか。
- 等値比較を
- C++
- 動的言語って感じのソースコードを吐き出す。
- クラスのメタデータ満載。名前(文字列)によるフィールドへのアクセスとか。
- Structural subtyping や(C++ ではなく Haxe の)RTTI を使わない場合にこいつらを抑制する手段はないのか。
- 行番号やスタックの変数の情報と思われるもの(
HX_STACK_LINE,HX_STACK_VAR)はコンパイルオプションの-no-debugで抑制できる。 Null<Int>がDynamicになってる。- 全体的に、もっと静的言語っぽいソースコードを吐き出す余地はあると思う。
- 動的言語って感じのソースコードを吐き出す。
まあ、手書きのコードには敵わないにせよ、知らないターゲット言語でも「とりあえず動く」ものを吐き出せるというのはすごいと思う(null の扱いの違いや正規表現の非互換に目をつぶれば)。
Visual C++ での C99 complex
最近のVisual C++ではC99もある程度サポートしているらしい。
- C99 library support in Visual Studio 2013 | Visual C++ Team Blog
- C++11/14/17 Features In VS 2015 RTM | Visual C++ Team Blog
- “Our C99 Standard Library implementation is complete, except for …” という記述がある。
上記ブログによると、 complex.h の関数もサポートしているらしい。しかし、コンパイラーは _Complex 型をサポートしていない。_Complex 型をサポートしていないのに、 complex.h の関数をサポートしているとはどういうことか。一体、 complex.h の関数は何を受け取って何を返すのか。
確認のため、次のような簡単な C++ のプログラムを書いてみた。 続きを読む
wxWidgets をビルドする
wxWidgets とは、C++で作られたクロスプラットフォームGUIツールキットである。Windows, OS X, GTK+ などに対応している。商用版のある Q なんとかと比べて見劣りするとか言うんじゃないぞ
入手
開発中の最新版を入手しよう。wxWidgets のリポジトリは、現在 GitHub でホストされている。(ただし、Issue の管理は GitHub ではなく wxWidgets Trac を使っている。GitHub でのプルリクはできる)
C言語でなんちゃって2進数リテラル
こういうビットマップ(1ピクセルにつき1ビット)を、整数の配列としてC言語のソースコード中に埋め込みたい:
□□□□□ ■■■■■ □■□■□ □■□■□ ■□□■■ □□□□□
2進数リテラルがあればそれを使うという手があるが、残念ながらC言語には2進数リテラルがない(ちなみに、C++にはC++14から2進数リテラルが入った。また、独自拡張で2進数リテラルが使えるコンパイラーもある)。
というわけで、自分で作ることにした。要件としては
- コンパイル時定数となる
- 桁を空白で区切れる
がある。 続きを読む
C言語の可変長引数マクロで擬似オーバーロード
C99で導入されたプリプロセッサマクロの可変長引数を使って、引数の個数によるオーバーロードっぽいことをするメモ。
参考:
- c – Overloading Macro on Number of Arguments – Stack Overflow
- [C言語] 可変引数マクロの作り方 – Qiita
- 余談 C++ Design: g++とvc++の可変引数マクロの挙動の違い
可変長引数の部分への実引数が0個というのはC言語の規格的にはナシなので、引数が0個の場合には対応しない。(幾つかのコンパイラでは引数が0個でも通るが…)
GCCの場合に0個の引数を処理したい場合、GCC拡張の , ## __VA_ARGS__ みたいなやつを使うといい感じになる。
VC++で
#define CHOOSE(a0,a1,...)
#define hoge(...) CHOOSE(__VA_ARGS__)
という風に書くと、 __VA_ARGS__ の部分が一つの引数(a0)として関数型マクロに渡ってしまうので、ここに書いたコードでは CHOOSE → CHOOSE2 という風にもう一段階噛ませている。
C11の _Generic とかを使えば引数の型によるオーバーロードもできそうだ。先例:
JavaScript近代史
先月はECMAScript 2015 (ECMAScript 6)が採択され、また、WebAssemblyが発表された。多分これらは現代のWebプログラミング言語の歴史に残る出来事だろう。しかし、ここ10年ぐらいのJavaScript/ECMAScriptの歴史と背景事情みたいのをまとめた文章のようなものをあまり見かけないので、ちょっとだけ書いてみることにする。(というよりは「ちょっとだけ調べてみた」の方が適切。あんまりまとまってないし)
Macの受信メールから自動でリマインダーを作成する
何日までに○○しなさいというメールが届いた!けどほったらかしておいたら期限を過ぎていた!そういう経験、あるよね?
そこで、そういうメールが届いたら自動でMacの「リマインダー」に登録されるようにしよう!という話。
続きを読む
