はらこメモ

プログラミングに関して調べたことについてのメモ書きです。言語はバラバラ…。

「PHP」Windows64bit環境でも整数型は32bit

Windows64bit環境では整数型は32bitに制限されている。

WindowsではデータモデルがLLP64「IL32P64」が採用されてるいるため

※PHP7からは64bitに統一されるみたい。

参考ページ
64bit環境とPHP - hnwの日記
64ビットコンピューティング最前線:64ビットになると何が変わる?――64ビットプログラミングのデータモデル (1/2) - ITmedia エンタープライズ

PHP: rfc:size_t_and_int64_next

「JavaScript」for文の書き方

JavaScriptにおけるfor文の書き方メモ

その1

for(var i = 0; i < arr.length; i++){  
 //普通のfor文
}


その2

var len = arr.length;  
for(var i = 0; i < len; i++){  
 //arr.lengthにアクセスする回数が減るため、その1より速いらしい
}


その3

for(var i=arr.length; i--;){   
 //i--が0になると、falseになるためfor文を抜ける。
 //lengthの比較の条件文がなくなるので、その2より速いのかな。
 //iを使って処理する場合は、その1とその2とは順序が逆になる。
 //この書き方は知らなかった…。
}


Firefoxfirebugコンソールでやってみた。

var arr = [];
for(var i=0; i<=100; i++){
  arr[i] = i; 
}

console.time('timer1');
for(var i = 0; i < arr.length; i++){  
    //処理なし
}
console.timeEnd('timer1');

console.time('timer2');
var len = arr.length;  
for(var i = 0; i < len; i++){ 
    //処理なし
}
console.timeEnd('timer2');

console.time('timer3'); 
for(var i = arr.length ; i--;){  
    //処理なし   
}
console.timeEnd('timer3');

結果(1000000回の平均)

//配列を1000000個にしてやってみた
timer1:411.299ms
timer2:395.832ms
timer3:249.372ms


参考にしたページ:
make a record of…: [JavaScript] JavaScript 高速化 for編。lengthだけじゃないよ!
JavaScript:処理時間計測方法 | 覚え書き.com

「HTML」Input要素が1つだけのFormはEnterキーでsubmitする

Input要素が1つだけのFormはEnterキーでsubmitする(暗黙のsubmit)。

<form action="./" method="post">
    <input type="text" name="test">
</form>




複数ある場合はsubmitしない(hiddenは除く)。

<form action="./" method="post">
    <input type="text" name="test1">
    <input type="text" name="test2">
</form>






この仕様を知らなくてしばらく悩んでしまったのでメモ…。


詳しくは下記を参照
【HTML】入力欄が1つだけのフォームはEnterキー押下でsubmitされる。submitボタンがなくても。 at softelメモ
jQueryでENTERキーによるSubmitを防止する - xykの日記

「PHP」JSONのエスケープ

json_encode関数を利用するときは、次のオプションを利用すること。

json_encode($val, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);

JSON_HEX_TAG
すべての < および > をそれぞれ \u003C および \u003E に変換する。
JSON_HEX_AMP
すべての & を \u0026 に変換する。
JSON_HEX_APOS
すべての ' を \u0027 に変換する。
JSON_HEX_QUOT
すべての " を \u0022 に変換する。

安全に使うためには、たくさん指定しないといけないみたい。
普通に変換されると思ってオプションなしで使ってしまいそうですね。

詳しくは下記を参照
JSONのエスケープ | yohgaki's blog
PHP: 定義済み定数 - Manual

シフトJISの5C問題

シフトJISコードでプログラムを書いた場合、
出力した文字が文字化けする場合がある。

#include <stdio.h>
int main(void){
	printf("表示");
	return 0;
}

実行結果
侮ヲ

詳しくは、
:: Shift-JISの文字化けについて | KENT-WEB ::

簡単に書くと、
「表示」を文字コードに直すと
表  示
95 5C 8E A6
になるが、\の文字コードが5Cなので、
表の5Cがエスケープ記号として解釈されてしまい文字化けてしまう。

※※
上記のプログラムは、
bcc32でコンパイルしたら文字化けしなかったけど、
gccコンパイルしたら文字化けした。

「Java」リテラル文字列のインスタンス

リテラル文字列について、
同じ文字列の場合は、同一インスタンスを参照する。

public static void main(String[] args) {
	String str1 = "str";
	String str2 = "str";

	if(str1==str2){
		System.out.println("true");
	}else{
		System.out.println("false");
	}
}

実行結果

true

リテラル文字列をプログラム上にたくさん書いても、
メモリの無駄使いにならないんやねー。

詳しくは下記を参照
リテラル文字列のインスタンスと参照について - しゅんの雑感日記

「Java」空文字の判定

Javaで空文字を判定する場合

if(str==null || "".equals(str)){
 nullまたは空文字
}

より

if(str==null || str.length() == 0){
 nullまたは空文字
}

の方が一般的で速い。

equalsを使うと遅いのでString.length()を使うこと。