#b-navbar { height:0px; display:none; visibility:hidden; }

ページ

2011年12月8日木曜日

SSLの有無によるリファラーの渡り方

Refererは便利ですが、SSLと非SSLではヘッダ情報としての
挙動が変わるのでメモ。

以下、遷移パターンごとに。

※同一ドメインか、クロスドメインかでもテストしましたが、
挙動は同じでした。


(1)非SSLページ → 非SSLページ: Referer渡る☆
↑一般的な遷移ですね。

(2)非SSLページ → SSLページ : Referer渡る☆


(3)SSLページ  → 非SSLページ: Referer渡らない★


(4)SSLページ  → SSLページ : Referer渡る☆



もし渡って欲しい!という趣旨の開発をしているなら、
(3)は要注意です。


もし、渡って欲しくない!という趣旨の開発をしているなら、
(4)は要注意です。
SSLページは、同一ドメインでもクロスドメインであっても、
SSL同士であれば、Refererが渡ります。


主要なブラウザ、
FF,Chrome,IEiOS標準、Android
の2011年12月での最新版でテストしました。
サーバーは(関係ないと思いますが一応)Apache2です。

2011年11月6日日曜日

Javascript var_dump

  
document.write( var_dump ( "変数名" ) ) ;
  
  
 function var_dump(data,addwhitespace,safety,level) {
        var rtrn = '';
        var dt,it,spaces = '';
        if(!level) {level = 1;}
        for(var i=0; i<level; i++) {
           spaces += '   ';
        }//end for i<level
        if(typeof(data) != 'object') {
           dt = data;
           if(typeof(data) == 'string') {
              if(addwhitespace == 'html') {
                 dt = dt.replace(/&/g,'&amp;');
                 dt = dt.replace(/>/g,'&gt;');
                 dt = dt.replace(/</g,'&lt;');
              }//end if addwhitespace == html
              dt = dt.replace(/\"/g,'\"');
              dt = '"' + dt + '"';
           }//end if typeof == string
           if(typeof(data) == 'function' && addwhitespace) {
              dt = new String(dt).replace(/\n/g,"\n"+spaces);
              if(addwhitespace == 'html') {
                 dt = dt.replace(/&/g,'&amp;');
                 dt = dt.replace(/>/g,'&gt;');
                 dt = dt.replace(/</g,'&lt;');
              }//end if addwhitespace == html
           }//end if typeof == function
           if(typeof(data) == 'undefined') {
              dt = 'undefined';
           }//end if typeof == undefined
           if(addwhitespace == 'html') {
              if(typeof(dt) != 'string') {
                 dt = new String(dt);
              }//end typeof != string
              dt = dt.replace(/ /g,"&nbsp;").replace(/\n/g,"<br>");
           }//end if addwhitespace == html
           return dt;
        }//end if typeof != object && != array
        for (var x in data) {
           if(safety && (level > safety)) {
              dt = '*RECURSION*';
           } else {
              try {
                 dt = var_dump(data[x],addwhitespace,safety,level+1);
              } catch (e) {continue;}
           }//end if-else level > safety
           it = var_dump(x,addwhitespace,safety,level+1);
           rtrn += it + ':' + dt + ',';
           if(addwhitespace) {
              rtrn += '\n'+spaces;
           }//end if addwhitespace
        }//end for...in
        if(addwhitespace) {
           rtrn = '{\n' + spaces + rtrn.substr(0,rtrn.length-(2+(level*3))) + '\n' + spaces.substr(0,spaces.length-3) + '}';
        } else {
           rtrn = '{' + rtrn.substr(0,rtrn.length-1) + '}';
        }//end if-else addwhitespace
        if(addwhitespace == 'html') {
           rtrn = rtrn.replace(/ /g,"&nbsp;").replace(/\n/g,"<br>");
        }//end if addwhitespace == html
        return rtrn;
     }//end function var_dump



ソース:http://snippets.dzone.com/posts/show/4296

多次元配列のソートまとめ

■PHP1
<?php
$list = array(
array("no"=>3, "cat"=>5, "body"=>"リンゴ"),
array("no"=>2, "cat"=>4, "body"=>"みかん"),
array("no"=>4, "cat"=>5, "body"=>"ナシ"),
array("no"=>6, "cat"=>3, "body"=>"バナナ"),
array("no"=>1, "cat"=>4, "body"=>"オレンジ")
);
usort($list, create_function('$a, $b', 'return $a["cat"]-$b["cat"];'));

print_r("<pre>");
print_r($list);
print_r("</pre>");
?>


■PHP2
$hoge = array(
array('id'=>'3','date'=>'2010.10','name'=>'イカ娘'),
array('id'=>'1','date'=>'2010.10','name'=>'それでも町は廻ってる'),
array('id'=>'2','date'=>'2010.11','name'=>'百花繚乱サムライガール'));
これを一番目の要素で並び替えたいときは。

//いったんソートするキーを配列で取り出して、
foreach($hoge as $key=>$value){
$id[$key] = $value['id'];
}

array_multisort($id ,SORT_ASC,$hoge);

//これで並び替え完了。DESCもできます。



■Javascript1

<script language="JavaScript" type="text/javascript"><!--
var list = [
{"no":3, "cat":5, "body":"リンゴ"},
{"no":2, "cat":4, "body":"みかん"},
{"no":4, "cat":5, "body":"ナシ"},
{"no":6, "cat":3, "body":"バナナ"},
{"no":1, "cat":4, "body":"オレンジ"}
];
list.sort(function(a, b) {return a.cat-b.cat});

var text="";
for(var i=0; i<list.length; i++) {
text += "\n no:" + list[i].no + " cat:" + list[i].cat + " body:" + list[i].body;
}
alert(text);
//--></script>

 多次元配列listをcatの上り順だけでソートしていますが、noを含めた複数条件でソートする場合、list.sortの部分を以下のように書き直します。
list.sort(function(a, b) {return a.cat-b.cat || a.no-b.no});


単に「||」で追加したソート条件を区切るだけ。条件が増えれば、その分「||」で継ぎ足していけばOK。実にシンプルで美しいコードです。



参考:
http://ma-bank.com/item/752
http://d.hatena.ne.jp/raharu0425/20101020/1287539676
thanks!

2011年11月2日水曜日

PHPでの left,right関数

参考:http://ameblo.jp/totally-awesome/entry-10696108413.html 様


function right($str,$n){
  //文字コードUTF-8で、right関数。$strの右から$n文字取得
  return mb_substr($str,($n)*(-1),$n,"UTF-8");
}

function left($str,$n){
  //文字コードUTF-8で、left関数。$strの左から$n文字取得
  return mb_substr($str,0,$n,"UTF-8");
}


上記は、全角文字も1文字と数えるとき。 もしバイト数で数えるならば、

function right($str,$n){
  //文字コードUTF-8で、right関数。$strの右から$n文字取得
  return substr($str,($n)*(-1),$n);
}

function left($str,$n){
  //文字コードUTF-8で、left関数。$strの左から$n文字取得
  return substr($str,0,$n);
}

SQLiteManagerレコード削除できないとき!

SQLite で SQLiteManager を使っていると、
レコード削除できない症状が出た。

■原因:
http://sebisawa-private.blogspot.com/2010/09/sqlitemanager.html
によると、php.ini の magic_quotes_gpc が、
Onになっているとダメっぽい。

■対策:
http://pentan.info/php/magic_quotes_on.html
の情報をもとに、下記のコードを:
SQLiteManager の配下の include / common.lib.php の冒頭に、


// magic_quotes_gpc = On の場合の対策
if (get_magic_quotes_gpc()) {
function strip_magic_quotes_slashes($arr)
{
return is_array($arr) ?
array_map('strip_magic_quotes_slashes', $arr) :
stripslashes($arr);
}

$_GET = strip_magic_quotes_slashes($_GET);
$_POST = strip_magic_quotes_slashes($_POST);
$_REQUEST = strip_magic_quotes_slashes($_REQUEST);
$_COOKIE = strip_magic_quotes_slashes($_COOKIE);
}



上記ソースを追加。

■結果:
解決した。


 

2011年7月25日月曜日

さくらVPS 512MBプランのサービス断の状況を調べてみた

≫ Link : 障害・メンテナンス・機能追加 | さくらインターネット http://www.sakura.ad.jp/news/sakuranews/newsindex.php
から512MBプランのIPアドレスを抜き出して、ソートしてみた。
(2011年7月9日~7月25日の15日間)



■分かったこと

・1台の物理マシンあたり、23個ぐらいのIPアドレスを収容しているっぽい
・15日間にサービス断(故障または計画メンテ)は、全体で37回
・短いもので15~20分。長いもので2~4時間。
 大胆に、相乗平均して、60分と見なそう。

・ソートしたリストをざっと見て…
 1IPアドレスあたり平均2回ぐらいかな、ひっかかるのは。

※さくらの全IP知らないので、正確に分かりませんが、
あなたが以下のどれかのIPアドレスだと固定して(最悪の想定ですが)、
該当する回数を前後見てみてください。1回から3回ぐらい止まるでしょう。

・よって、1アカウント1ヵ月あたり、2時間ほど止まる。
 稼働率は99.7%。



■感想:
まあ月額1000円なので、そんなもんか?
思ったより止まるねー

まあ最悪の想定下での、平均信頼度なので、
「このぐらいは覚悟がいるね」ってことで。

余裕があれば、もう少し(+500円)お金出して
1Gプランにしたほうが稼働率は断然高いみたい。

さくらさんには、
平均稼働率、平均故障時間長、平均故障間隔を
公開して欲しいなー。
一方、アマゾンEC2 の SLA記載の稼働率は 99.5%。
意外と低いが…これは最悪ケースの保障値(返金レベル)
だからそんなもんか。



■データ(ソート後)
<2011年7月9日~7月25日の15日間>

182.48.46.231~182.48.46.254
182.48.46.63~182.48.46.86
182.48.47.179~182.48.47.202
182.48.47.83~182.48.47.106
182.48.54.0~182.48.54.255
182.48.55.0~182.48.55.255
182.48.56.0~182.48.56.255
182.48.56.111~182.48.56.134
182.48.56.135~182.48.56.158
182.48.56.207~182.48.56.254
182.48.56.39~182.48.56.182
182.48.56.39~182.48.56.62
182.48.56.63~182.48.56.86
182.48.57.0~182.48.57.255
182.48.57.11~182.48.57.130
182.48.57.11~182.48.57.34
182.48.57.155~182.48.57.226
182.48.57.59~182.48.57.82
182.48.57.83~182.48.57.106
182.48.58.0~182.48.58.255
182.48.58.111~182.48.58.134
182.48.58.39~182.48.58.254
182.48.59.0~182.48.59.255
182.48.59.107~182.48.59.130
182.48.59.11~182.48.59.226
182.48.59.203~182.48.59.226
182.48.60.0~182.48.60.255
182.48.60.135~182.48.60.158
182.48.60.159~182.48.60.182
182.48.60.39~182.48.60.254
182.48.60.63~182.48.60.86
182.48.61.0~182.48.61.255
182.48.61.107~182.48.61.130
182.48.61.11~182.48.61.226
182.48.61.179~182.48.61.227
182.48.61.83~182.48.61.106
49.212.0.39~49.212.0.254
49.212.1.11~49.212.1.226
49.212.2.40~49.212.2.85
49.212.2.87~49.212.2.253
49.212.3.12~49.212.3.34
49.212.3.207~49.212.3.224
49.212.3.36~49.212.3.58
49.212.3.61~49.212.3.82
49.212.3.84~49.212.3.200
49.212.4.118~49.212.4.134
49.212.4.136~49.212.4.158
49.212.4.160~49.212.4.205
49.212.4.207~49.212.4.254
49.212.4.39~49.212.4.62
49.212.4.88~49.212.4.110
49.212.5.101~49.212.5.226
49.212.5.101~49.212.5.226
49.212.5.11~49.212.5.99
49.212.5.11~49.212.5.99
49.212.6.63~49.212.6.86
49.212.6.63~49.212.6.86
49.212.86.111~49.212.86.134

 

2011年6月30日木曜日

GoogleAdsenseを非同期で読み込む

http://la.ma.la/misc/js/lazy_writer/ を利用する。
IEでは動作しないので、読み込み側のスクリプトを一部改変(太字部分)。

・表示させたい箇所に、(幅は各自 変えてね)
<div id="adsense_1" style="width:120px;height:90px;"></div>
<div id="adsense_2" style="width:120px;height:90px;"></div>
<div id="adsense_3" style="width:120px;height:90px;"></div>

・HTML末尾に、
<pre><code>
<script type="text/javascript" src="lazy_writer.js"></script>
<script type="text/javascript">
var adsense_url = "http://pagead2.googlesyndication.com/pagead/show_ads.js";
document.lazy_writer(adsense_url, function(str){
var id = "adsense_" + this.script_count;
if (str.match(/iframe/i)) {
document.getElementById(id).innerHTML = str;
}else {
document.getElementById(id).innerHTML = '代替HTML(IEとか用)';
}


});
</script>
</code></pre>

・そのあと、Google支給のコード

2011年6月29日水曜日

フォームからの送信値を配列で送る方法

チェックボックスで同じ設問で、複数選択可能なときなど。

formのname属性を「hoge[]」とする。
<input type="checkbox" name="a[0]" value="1">
<input type="checkbox" name="a[1]" value="2">

↓GETメソッドなら、
http://localhost/test/index.php?a[]=1&a[]=2

こうすると、
$arr_data = $_POST["a"];
で受け取って代入する変数も配列型になり、
$arr_data[0]=1
$arr_data[1]=2
が得られる。
 

2011年6月28日火曜日

PHP 配列の値がユニークか(重複がないか)調べる

引数は、添え数字の配列(普通の配列)で、
重複がなければ(ユニークならば)true、重複があればfalse。


function is_arrayUnique ( $array ) {

$array_value = array_count_values( $array );
$num = count($array);

for($i=0; $i < $num; $i++){

if($array_value[$array[$i]] > 1){
return false;
}
}

return true;
}

2011年6月27日月曜日

PHPから外部プログラム起動できないときにありがちなこと

コマンドラインからだと動かせる外部プログラムが、
system関数とか、shell_exec、exec関数を使って、
PHPから叩くと、動いてくれない。
エラーもはき出さない。

・・・そういうときにありがちなこと。


▼プログラムにパスはとおっていますか?

例えば、
「proramname --command 」ではなくて、
「/usr/bin/proramname --command 」と書く。


▼プログラムでファイル生成をさせる場合:
→ 生成箇所のディレクトリのパーミッションは正しいですか?

書き込み禁止にしていると、PHPは書き込めません。
FTPソフトとか、SSHの画面から変更しましょう。

 
→ パーミッションは「ディレクトリ」と「ファイル」両方に留意

2011年6月23日木曜日

【WheelRedirector】→ブラウザGoogleChromeで、ホイールスクロールが効かなくなる→【WizMouse】



Wheel Redirector(ホイールリダイレクター)便利ですよね。
ウィンドウをアクティブにしなくても、マウスでポインタが乗っかている状態だけで、その窓をスクロールができるすぐれもの。

UNIXやMACでは当たり前の機能を、Windowsでも使える!ので人気でした。


しかし・・・


2004.2.13以降、バージョン1.7.3でWheel Redirectorの更新が止まったままのためか、いろいろ最新の環境では不具合があるようです。

とくに最新のGoogleクロームで、ホイールスクロールできなくなるという致命的不具合が。


そこで・・・


「WizMouse」に乗り換えました。
最新の環境でも、快適に動きます。英語ですが、なんとか頑張りましょう。


紹介:
http://all-freesoft.net/system8/utility/wizmouse/wizmouse.html
C-NETからダウンロード:
http://download.cnet.com/WizMouse/3000-18487_4-10907935.html
 ↓
「Download Now」ボタン。
 ↓
ダウンロードしたアイコンをダブルクリックして、インストール
 ↓
とりあえず、私のXP環境での設定です。ご参考までに。






※追記
国産のWheelPlusでもいけるかも
http://www.vector.co.jp/soft/win95/util/se252624.html

※追記
NY Wheel でもいけるかも
http://park1.wakwak.com/~y-nagano/Programs/nywheel/



2011年6月16日木曜日

PHP:配列操作:high番目をlow番目に繰り上げる


$aaa = array();
$aaa[0]["color"] = "red";
$aaa[0]["image"] = "apple";

$aaa[1]["color"] = "blue";
$aaa[1]["image"] = "nasubi";

$aaa[2]["color"] = "green";
$aaa[2]["image"] = "hourensou";

$aaa[3]["color"] = "yellow";
$aaa[3]["image"] = "lemon";



print_r( $aaa ) ;
print "<br />";

$aaa = KuriageArray ( $aaa , 3,1);

print_r( $aaa ) ;
print "<br />";



function KuriageArray( $ary_input, $high, $low ) {
//high番目をlowに移動して、それ以下の順番を繰り下げる
//(降格・繰り下げはできない。すなわちhigh>=low)

$num_input = count ( $ary_input );
$ary_output = array();

for ($ixx = 0; $ixx < $low ; $ixx++) {
$ary_output [$ixx] = $ary_input [$ixx] ;
}

$ary_output [$low] = $ary_input [$high] ;

for ($ixx = $low + 1 ; $ixx < $high+1 ; $ixx++) {
$ary_output [$ixx] = $ary_input [$ixx - 1] ;
}
for ($ixx = $high + 1 ; $ixx < $num_input ; $ixx++) {
$ary_output [$ixx] = $ary_input [$ixx ] ;
}

return $ary_output;

}



↓出力---------------------------
Array
(
[0] => Array
(
[color] => red
[image] => apple
)

[1] => Array
(
[color] => blue
[image] => nasubi
)

[2] => Array
(
[color] => green
[image] => hourensou
)

[3] => Array
(
[color] => yellow
[image] => lemon
)

)

Array
(
[0] => Array
(
[color] => red
[image] => apple
)

[1] => Array
(
[color] => yellow
[image] => lemon
)

[2] => Array
(
[color] => blue
[image] => nasubi
)

[3] => Array
(
[color] => green
[image] => hourensou
)

)


昇格、入替が、順位繰り下げができている。

PHP:配列操作

転置する(行と列を入替える):
http://aki.adam.ne.jp/bbs/question/detail.php?rt=2751&id=2751

<?
$ary1 = array(1,2,3,4,5);
$ary2 = array("a","b","c","d","e");
$ary3 = array("あ","い","う","え","お");
$ary[] = $ary1;
$ary[] = $ary2;
$ary[] = $ary3;
print_r($ary);
foreach($ary AS $key => $item){
foreach($item AS $key2 => $item2){
$data[$key2][] = $item2;
}
}
print_r($data);
?>

PHP:配列の値を入れ替える関数


//テスト配列 
 $aaa = array();
 $aaa[0]["color"] = "red";
 $aaa[0]["image"] = "apple";
 $aaa[1]["color"] = "blue";
 $aaa[1]["image"] = "nasubi";
 $aaa[2]["color"] = "green";
 $aaa[2]["image"] = "hourensou";
 $aaa[3]["color"] = "yellow";
 $aaa[3]["image"] = "lemon";

//関数
//引数(対象配列,入替元,入替先)
 function SwapArray( $input, $nn, $mm ) {
    $val1 = $input[ $nn ] ;
    $val2 = $input[ $mm ] ;
    $input[ $nn ]= $val2;
    $input[ $mm ]= $val1;
    return $input;
 }

//test
 print_r( $aaa ) ;
 print "
"; $aaa = SwapArray ( $aaa , 1 ,2 ); print_r( $aaa ) ; print "
";
出力
Array
(
    [0] => Array
        (
            [color] => red
            [image] => apple
        )

    [1] => Array
        (
            [color] => blue
            [image] => nasubi
        )

    [2] => Array
        (
            [color] => green
            [image] => hourensou
        )

    [3] => Array
        (
            [color] => yellow
            [image] => lemon
        )

)

Array ( [0] => Array ( [color] => red [image] => apple ) [1] => Array ( [color] => green [image] => hourensou ) [2] => Array ( [color] => blue [image] => nasubi ) [3] => Array ( [color] => yellow [image] => lemon ) )
配列の[1]と[2]が入れ替わった

2011年6月12日日曜日

FaceBookの「いいねボタン」を10秒で設置する方法



ページやサイトごとに、
公式サイト(末尾に記載)から毎回作るのは、
ちょっと面倒なので、簡単スクリプトを作りました。

下記のコードをコピペするだけで、
設置したページのURLを自動で取得してくます。



↓動作例







■公式な情報はこちら
http://www.facebook-japan.com/iine.html
http://developers.facebook.com/docs/reference/plugins/like/


検索用タグ:JavaScript、ブログパーツ、blogparts、auto detect page url、検知

2011年6月3日金曜日

Operaで、特定のページが途中で開かなくなる



■症状:
・特定のページが開けない(重いページ?)というか、開いている途中で固まる。サイトやページによって うまく開けたり、開けなかったり


■原因:
・ブラウザのキャッシュの保存先を、外部ドライブに変更していて、そのドライブをPCから外した。そのためページを開いた際に、Operaが存在しないドライブにアクセスを試みたまま、動作しなくなる。


■失敗した試み
・「opera:config」で修正しようとしたが、 ⇒ 内部通信エラーとなって開けない。
・とあるサイトには「C:\Documnet ant Settings\ログインしているユーザー名\Application Data\Opera\Opera\profile\ 」を削除したらよいとかあるが、 ⇒ そんなファイルは見あたらなかった



■成功した解決方法:
(1)C:\Documents and Settings\ログインしているユーザー名\Application Data\Opera\Opera\
を開く。

(2)その中に、「 operaprefs.ini」というファイルがあるので、念のためバックアップをとったうえで、開く。

(3)「Cache Directory4=」で始まる行がある。そのイコールの右辺が、無効なドライブだったので、適切なドライブ、フォルダ名に変更して保存
 
(4)オペラを再起動




 

2011年2月14日月曜日

VOCALOID2 Editor 起動時に『合成エンジンを開けません!』と表示される

VOCALOID2 Editor (めぐっぽいど、がくっぽいど)
起動時に『合成エンジンを開けません!』と表示されて起動できない。
Activate2.exeで再アクティベートをしてもダメだ。



原因は、vocaloid(VOCALOID2.exeやDSE2.dll)を入れたフォルダを
移動してしまったため。

最初にインストールした元の位置に戻す
(私の場合 D:\vocaloid)、起動できるようになった。

それでもだめなら、ボカロ再インストールです。


その他参考(今回はこの原因は関係なかったけど):
http://www1.ssw.co.jp/techdb/read.php?FID=44&TID=1000&p=1#1933
こちらにも公式情報有り。

VOCALOID2 Editor 起動時に
「合成エンジンを開けません!(CANNOT OPEN SYNTHESIS ENGINE!)」と表示される
-------
以下のような(1)(2)(3)いずれかの原因が考えられます

(1)インストール時、起動時のユーザーアカウント権限。
(2)VOCALOID2 のインストール、起動は、必ず管理者(アドミニストレータ)権限を持つユーザーアカウントで実行してください。

・DSE2.dllファイルの有無、破損(*)。
・VOCALOID2.exe と同じフォルダ(通常は、C:\Program Files\VOCALOID2)にDSE2.dllファイルが存在しない場合、もしくは、DSE2.dllファイルが存在するにもかかわらずエラーが発生してしまう場合(*)。

(*)このような場合には、製品を再インストールして、再度起動をお試し下さい。

(3)古いバージョンのソフトウェアをインストール

Lily(リリィ) -> がくっぽいど のような順番でインストールした場合、新しいライブラリに対応していない古いバージョンのVOCALOID2ソフトウェアで上書きされてしまいます。
このような場合には、再度新しい方(この例ではLily(リリィ))の製品ディスクを使用してVOCALOID2ソフトウェアをインストールしてください。なお、このときカスタムインストールで「VOCLAOID2 Editor」と「VOCALOID2 VSTi」のみをインストールいただければ結構です。