2017年1月16日月曜日

[JavaScript] arguments変数を本物の配列に変換する方法

JavaScriptで任意の関数の戻り値の真偽を逆転するような関数を生成するには以下のようになる。
function not(pred) {
  return function(args) {
    return !pred.apply(null, arguments);
  }
}

var p = not(function () { return true; });
console.log(p());
// false

p = not(function (x) { return x; });
console.log(p(false));
// true

arguments変数はすべての関数で特別に用意されるローカル変数で、lengthプロパティを持っているし、一見配列のように振る舞う。
例えば、渡されたすべての引数をconsoleに出力したければ、こうなる。

2017年1月10日火曜日

[unix,perl,正規表現] perlでsed,grep,awkライクに

sedでダブルクォートで括られてる("ABC")ような文字列の置換をしようとしていたんだけど、うまくいかなかった。

$ sed -e 's/"[^"]+"/"xxx"/g'
"foo"
"foo"
"f+"
"xxx"

これだと、ダブルクォートの中が以外の任意の1文字と"+"の場合しかマッチない。
ダブルクォートの中には必ず1文字以上ある事を意図して"+"記号を使っていたんだけど、どうもsedではこれを特殊記号として扱ってくれないらしい。
なので、以下だとうまくいく。

$ sed -e 's/"[^"][^"]*"/"xxx"/g'
""
""
"foo"
"xxx"

どうしてこんなことになるかというと。。。

2017年1月5日木曜日

[Java]System propertiesとOutputStreamからの文字列取得

Javaを使ったプログラムででエラーが起こった時に使っていたJavaのバージョンやOSの環境が知りたいことはよくある。
その度に確認するのも大変だよね。
なので、プログラムの起動時にSystem propertiesの値をログなんかに出力しておくといいかもしれない。

単純に標準出力に出力するのであれば、以下のようにすればいい。

PropertiesSample.java
class PropertiesSample {
    public static void main(String ...  args) {
        System.getProperties().list(System.out);
    }
}

2016年12月26日月曜日

[Java,JNI]JNIでクラス検索するときのパッケージ名

OracleのJNIドキュメントに載っているサンプルプログラムを参考にして、Cからパッケージ名付きクラスのmainメソッドを呼びだそうとしたんだけど、うまくいかなかった話。

Java Native Interface Specification
5. The Invocation API


これを元にして、 local.PropertiesSample クラスの main メソッドを呼び出してみよう。

2016年12月19日月曜日

[gcc]gccでC99とPOSIXを同時に使いたかったのだ

[Java][C]JavaのvolatileとCのvolatileでシグナルハンドラを作るときの注意を書いたけど、今どきのマルチスレッドプログラムとはシグナルハンドラを定義するやり方では相性が悪い。
というわけで、そんなときはsigwaitを使うのがいいみたい。

ところが、以下のようなサンプルプログラムを作って、コンパイルしようとすると、エラーメッセージがいっぱい出てきてしまった。

2016年12月12日月曜日

[シェルスクリプト]シェルスクリプトでの関数定義の記法

bashで関数を定義するには以下の3つの記法がある。

# 関数名()
func1() {
  echo 'func1'
}

# function 関数名
function func2 {
  echo 'func2'
}

# function 関数名()
function func3() {
  echo 'func3'
}

2016年12月7日水曜日

[Apex]現在の会計年度を取得するApexコード

開発中のForce.comアプリで、Apexコードから現在の会計年度を取得する必要が出てきました。
Apexの標準クラスからで簡単に取れるかと思いきや、そんなものはないらしいので自分で実装することにしました。

例えばエス・ジーはSalesforceの会計年度設定で「会計年度期首月」を12月、「会計年度の表記」を「期末月に合わせる」としているので、今日が2016年12月1日の場合、会計年度は2017年となります。これをApexコードで取得できるようにします。
↓のコードを参考に、期首月が1月のパターンを考慮しました。