#mixi #mixi #form #oauth #post #signature

現象

MixiモバイルアプリのフォームからPOSTするとOAuth Signatureが不一致で検証が通らない。

デバッグ

フォームをPOSTするときはフォーム内のデータがOAuthのBase StringのNormalize Request Parametersに含まれます。 これはOAuthに仕様に準じてます(http://oauth.net/core/1.0a/#anchor13)が、 なぜかMixiだと通れないです。

<form action="?guid=ON&url=http%3A%2F%2Fexample.com%2Ffoo%2F" method="post">
  <input name="field1" type="text" value="value1" />
  <input type="submit" value="送信" />
</form>

こんなフォームがあるとして、中のfield1がNormalize Request Parametersに存在するとダメだってことが検証でわかりました。

回避方法

フォームPOSTする箇所を特定して、その場合はOAuth Signatureを検証しないようにしました。

参考リンク

同じ現象にあった方がいました:

#php #php #snippet

curl_multi系を使って、プロセス数を指定して実行するマルチスレッド処理です。

urlは配列で受け取って、もし指定したプロセス数より多い場合は分割して実行するようになってます。

このサンプルコードではこのブログの幾つかのurlに対してtitleを取得しました。

<?php
/**
* 指定したプロセス数で並列処理を実行する
*
* @param array $url_list URLの配列
* @param boolean $url_as_key 結果配列を返すときに、urlをキーにする
* @param int $timeout タイムアウト秒数 0だと無制限
* @return array 結果配列
*/
function execute($url_list, $url_as_key = false, $timeout=0) {
    // set your process number
    $process = 5;
    $is_over_process = false;
    if ($process < count($url_list)) {
        // chunk url list / process number*
        $url_chunk = array_chunk($url_list, $process);
        $is_over_process = true;
    }
    $ret = array(); 
        
    if ($is_over_process && !empty($url_chunk)) {
        foreach ($url_chunk as $key => $url_list) {
            echo "chunk start:{$key}\n";
            
            $res = fetch_multi_url($url_list, $url_as_key, $timeout);
            if (!empty($res)) {
                $ret = array_merge($ret, $res);
            } else {
                continue;
            }
        }
    } else if (!$is_over_process && !empty($url_list)){
        $ret = fetch_multi_url($url_list, $url_as_key, $timeout);
    } else {
        echo "url invalid::";
    }
    
    return $ret;
    
}
/**
 * curl_multi_execの並列処理
 * ほぼboilerplate
 *
* @param array $url_list URLの配列
* @param boolean $url_as_key 結果配列を返すときに、urlをキーにする
* @param int $timeout タイムアウト秒数 0だと無制限
* @return array 結果配列
 */
function fetch_multi_url($url_list, $url_as_key, $timeout) {
    $mh = curl_multi_init();
    foreach ($url_list as $i => $url) {
        $ch[$i] = curl_init($url);
        curl_setopt($ch[$i],CURLOPT_RETURNTRANSFER,1);
        //タイムアウト
        if ($timeout){
            curl_setopt($ch[$i],CURLOPT_TIMEOUT,$timeout);
        }
        curl_multi_add_handle($mh,$ch[$i]);
    }
    //URLを取得
    //すべて取得するまでループ
    $active = null;
    do {
        $mrc = curl_multi_exec($mh,$active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($active and $mrc == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh,$active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }
    if ($mrc != CURLM_OK) {
        echo '読み込みエラーが発生しました:'.$mrc;
    }
    //ソースコードを取得
    $res = array();
    foreach ($url_list as $i => $url) {
        if (($err = curl_error($ch[$i])) == '') {
            // url_as_keyがtrueの場合、urlをキーとして格納
            if ($url_as_key) {
                $res[$url] = curl_multi_getcontent($ch[$i]);
            // そうでない場合は、ただ配列に入れる
            } else {
                $res[$i] = curl_multi_getcontent($ch[$i]);
            }
        } else {
            echo '取得に失敗しました:'.$url_list[$i].'<br />';
        }
        curl_multi_remove_handle($mh,$ch[$i]);
        curl_close($ch[$i]);
    }
    curl_multi_close($mh);
    return $res;
}
// 並列実行したいurl list
$url_list = array(
    "https://kinopyo.com/ja/blog/ipad-2-not-charging-when-connected-to-pc-usb/",
    "https://kinopyo.com/ja/blog/the-first-app-i-installed-to-ipad2/",
    "https://kinopyo.com/ja/blog/chrome-warn-before-quitting-with-command-q-in-mac/",
    "https://kinopyo.com/ja/blog/reply-to-all-always-in-gmail/",
    "https://kinopyo.com/ja/blog/lion-fullscreen-shortcut-key-conflict-with-evernote-client/",
    "https://kinopyo.com/ja/blog/how-to-set-gesture-for-chrome-to-swipe-back-and-forth-in-lion/",
    "https://kinopyo.com/ja/blog/3-free-ebooks-for-study-coffeescript/"
);
// start time
$start_time = microtime(true);
// execute
$res = execute($url_list, true);
// execute time
$time = microtime(true) - $start_time;
// play with the result
// here I just get the page title
$titles = array();
foreach ($res as $url => $html) {
    preg_match('{<title>(.*)</title>}',$html, $match_title);
    $titles[$url] = $match_title[1];
}
echo "Result:\n";
echo "time:{$time} sec\n";
print_r($titles);

参考:PHPでマルチスレッド(バックグラウンド処理)を実現する方法

#charging #ipad #ipad #pc

ipad2-not-charged

iPad2をPCのUSBに繋ぐと「充電していません」(Not Charging)のメッセージが右上に出ます。Macbook Proは問題なかったです。

どうやらPC(あるいは結構古いMac)のUSBは十分の電力を提供できないらしいです。すクルーンをオフにしてNot Chargingのままでも一応チャージはできるんですが、4倍くらい遅いと言われてます。

ASUS Ai Chargerという面白いツールも見つかりました。なんとPCでiPod, iPhone, iPadの充電を50%くらいスピードアップできるそうです。全部のマザーボードをサポートしているようですが、自分は試していません。。

参考:https://discussions.apple.com/thread/2789455?start=0&tstart=0

#chrome #tips #mac

MacでGoogle Chromeを使う時、誤操作でcommand+wを押したかったのに間違ってcommand+q押しちゃってChromeアプリケーションを閉じたことはありますか?それを防ぐために既にいろいろ方法が出てますが、いつの間にかChrome自体で簡単に設定できるようになりました!

方法

Chromeのアプリケーションをアクティブにし、一番上のトップバーからChrome -> Warn Before Quitting (⌘Q)をチェックすればOKです。

Chrome_wanr_before_quitting

こうすればCommand + Qは警告のメッセージが出て、長押しで終了するようになります。

#gmail #tips #tool #webservice

ビジネスでもWeb版のGmailを使えるようになりましたが、しょっちゅう「全員に返信」を忘れてしまいます。

Gmail_reply_to_all

それを防ぐために常に全員返信するように設定しておきましょう。Gmail右上の設定-> Labs-> 常に全員に返信 を有効にする で完了。

Gmail_setting_reply_to_all

#lion #evernote #mac

Lionにはフルスクリーンという機能がありますね。Safari、MailとかPreviewといったMacネーティブなアプリではView->Enter Full Screenでフルスクリーンモードに入れます。

Lion_Fullscreen

そのショットカットキーは control + shift + fですが、自分の環境だとこれはEvernoteクライアントの検索ショットカットキーと衝突します。正確にはEvernoteのほうが優先で占めて、Lionフルスクリーンが効かなくなります。

解決方法はEvernoteクライアントの検索ショットカットキーを他に設定するか、キャンセルしてLionを再起動することです。再起動しないとショットカットキーの変更は有効にならないからです。

Evernote_Preferences_shortcuts

#chrome #lion #mac

2011/09/30更新

現時点の最新版(15.0.874.54 beta)のChromeに更新したらTrackpadでは2本指スワイプ、MagicMouseでは1本指スワイプでページのBack/Forward遷移できるようになりました!もうBetterTouchToolに頼らなくてもいいですよ〜


Lionにアップグレードして、新しいジェスチャーをONにしたらChromeでの2本/3本指での左右スワイプによるブラウザのback/forwardのページ遷移が効かなくなりました。少し調べたので、その結果をまとめます。

1. Three finger dragを使わない前提

このThree finger dragは自分は大好きですが、もしこれを使わない方でしたら解決は速いです。 システム設定のトラックパッドを開き、More GestureタブのSwipe between pagesのジェスチャーを3本指或いは2本/3本指に設定。 swipe_between_pages

これでChromeで3本指左右スワイプが効きます。2本指はまだ認識できないっぽいですが、Safariではどっちでもうまく対応できてしかもアニメーションでページ遷移ができます。

こうすればThree finger dragは自動でオフになります。 Three_finger_drag_off

2. Three finger dragも使いたいならBetterTouchToolを使う

BetterTouchToolでこのようにChrome専用のジェスチャーを設定します。 BetterTouchTool

2本指のスワイプのアクションを⌘(Command) + {と⌘(Command) + }に設定します。これはChromeでのページ遷移のショットカットキーです。実際使ってみたら使い心地はあまりよくないですが。。

他のジェスチャー設定はMacをLionにアップグレードして最初に設定したのはトラックパッドを御覧ください。 BetterTouchToolはトラックパッドを便利にするためのツールです。詳しい使い方はこの記事http://nori510.com/archives/4208を参考してください。