大人の科学No.24 4ビットマイコン(GMC-4)の野望! コンパイラだぜ!

東京の方では、「マイコンナイト」が7月5日に開催される様ですが地方ですので参加できません。
http://d.hatena.ne.jp/otonanokagaku/20090629

しかし地方も負けていられません!微力ながら4ビットマイコン応援のため大人の科学24号付録のGMC-4(FX)マイコン用のコンパイラを作ります!

名づけて「GMC-4(FXマイコン)専用ちびBASICクロス・コンパイラ(G4CBASIC)」!!

Windows上で動くアプリで、FXシミュレータ用のfxpファイルも出力できる予定。最適化は最初は無しなのでマシン語としての効率は悪いですが暖かい目で見守ってください。

構文は、こんな感じ。

 変数 AからM
   ARRAY[式]
 単項 NEG
 2項 + -  SFT
 条件 > != = <
 代入式 変数=式
 数値 0〜9,#A〜#F

 FOR 変数=式 TO 式 NEXT
 DO UNTIL 条件式
 IF 条件式 THEN 文 ELSE 文 ENDIF
 BREAK
 END
 
 PRINT 式
 INPUT 変数
 REM コメント
 
 PRINT_OFF
 LED_ON(式)
 LED_OFF(式)
 SOUND(式)
 TIMER(式)
 LED_DISP(式,式)

2009/07/04 | プログラミングCOMMENT(0)TRACKBACK(0)  TOP

大人の科学No.24 4ビットマイコン(GMC-4)を買ってみました。

基本動作の確認は出来たのでこれから遊んでみます。
電子ブロックのFXマイコンは遊んだことがなかったので新鮮ですね。

商品画像    大人の科学マガジン (24) (4ビットマイコン) (Gakken Mook) /大人の科学マガジン編集部 
 ISBN:4056054711 : 発売日 2009/07/01 : 学習研究社 ムック  
 新品:\2,500(2009/07/04 AM01:32)  [ 販売ランキング 31位 ] 
 
学研のサイト
http://otonanokagaku.net/magazine/vol24/index.html

とりあえずアセンブラはあるみたいなので、
http://www.musashinodenpa.com/misc/GMC4/
いろいろと考えて見ます。



2009/07/04 | プログラミングCOMMENT(0)TRACKBACK(0)  TOP

PHP4 「Product Advertising API」をPHP4から使う。その4。Services/Amazon編。

リクエストがありましたので、連載第四弾となります。
1.PHP4 「Product Advertising API」をPHP4から使う。その一。HMACへの道。
2.PHP4 「Product Advertising API」をPHP4から使う。その2。HMAC-SHA256自作編。
3.PHP4 「Product Advertising API」をPHP4から使う。その3。HMAC-SHA256実装編。

本格的な利用ってことで、Services/Amazonでの実装例です。
まず、Services/Amazonの0.8.0以降のバージョンが必要になりますので、下記サイトからダウンロードをお願いします。
Services/Amazon最新
これをローカルに展開するか、PEARの従来のものと入れ替えてください。

では、実装例です。
その2で作ったHMAC-SHA256クラスを使います。

<?php
########################################################################
# アマゾン Services/Amazonの実装編
########################################################################
    
  // IDとキー。自分の情報を設定してください。
    define("SECRET_ACCESS_KEY","secret_access_key");
    define("SUBSCRIPTION_ID","subscription_id");
    define("ASSOCIATE_ID","associate-22");

    //  ライブラリ
    require_once("Services/Amazon.php");    //  Services/Amazonのインストール先に合わせて変更してください。
    require_once('hmac_sha256.php');

//----------------------------------------------
//  Services_Amazonの暗号化をオーバーライド
//----------------------------------------------
class Services_AmazonMHASH extends Services_Amazon {
    //  オーバーライド関数
    function _hash($string_to_sign, $secret_access_key)
    {
        if (function_exists('hash_hmac')) {
            echo "use hash_hmac<br>";
            return hash_hmac('sha256', $string_to_sign, $secret_access_key, true);
        } elseif (function_exists('mhash')) {
            echo "use mhash<br>";
            return mhash(MHASH_SHA256, $string_to_sign, $secret_access_key);
        }
        //  自前のハッシュ関数。
        echo "use local HMAC_SHA256<br>";
        $hmac_sha256 = new HMAC_SHA256($secret_access_key);
        return $hmac_sha256->hmac($string_to_sign);
    }
}

    //  アマゾンサービスのクラスを得る。オーバライドした方のクラスを使います。
    $amazon = new Services_AmazonMHASH(SUBSCRIPTION_ID, SECRET_ACCESS_KEY, ASSOCIATE_ID);
    $amazon->setLocale("JP");
   
    //  アマゾンで検索する。
    $item_list = $amazon->ItemSearch("VideoGames",
                array(  "BrowseNode" => "15782591",
                        "Sort" => '-releasedate',
                        "ResponseGroup" => 'Small,ItemAttributes,Images,OfferFull,Reviews,SalesRank',
                        "ItemPage" => 1));
    //  エラー?
    if (PEAR::isError($item_list)) {
        //  結果なし?
        if( FALSE !== mb_strpos($item_list->message,"リクエストに該当する結果がありません") ) {
        } else {
            //  エラー
            echo( $item_list->message );
        }
    }
    //  結果をダンプ
    $v = var_export($item_list, true);
    $v = str_replace(" "," ",$v);
    $v = str_replace("\n","<br>",$v);
    echo $v;
?>


以上です。
これで情報が取得できるはずですが、何か問題があれば教えてください。

以上です。お役に立ちましたら拍手をお願いします

2009/06/18 | 未分類COMMENT(0)TRACKBACK(0)  TOP

PHP4 「Product Advertising API」をPHP4から使う。その3。HMAC-SHA256実装編。

連載第三弾となります。
1.PHP4 「Product Advertising API」をPHP4から使う。その一。HMACへの道。
2.PHP4 「Product Advertising API」をPHP4から使う。その2。HMAC-SHA256自作編。

順調に開発は進みましたので、いよいよ実装します。

まず、アマゾンの実装サンプルを見てください。
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html

これと同じ結果になるようにプログラムを書きます。
前回作ったHMAC-SHA256クラスを使います。

<?php
########################################################################
# アマゾン Example REST Requestsのシミュレートサンプル
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html
########################################################################
    
    //  ライブラリ。
    require_once('hmac_sha256.php');

 // Record time before hashing
    $time1 = microtime_float();

    //  1.と3.リクエストの準備。形式はアマゾンのサンプルのまま。
    $AmazonUrl = 'http://webservices.amazon.com/onca/xml';
    $params = array();
    $params['Service']        = 'AWSECommerceService';
    $params['AWSAccessKeyId'] = "00000000000000000000";
    $params['Operation']      = 'ItemLookup';
    $params['ItemId']         = '0679722769';
    $params['ResponseGroup']  = 'ItemAttributes,Offers,Images,Reviews';
    $params['Version']        = '2009-01-06';
    $params['Timestamp']      = '2009-01-01T12:00:00Z';
   
    //  2.パラメータをRFC3986に基づいてurlエンコードします。
    $UrlParams = array();
    foreach($params as $key => $val) {
        $UrlParams[RFC3986urlencode($key)] = RFC3986urlencode($key) . '=' . RFC3986urlencode($val);
    }
    //  4.urlエンコードしたパラメータの順序を昇順に並び替えます
    ksort($UrlParams);
    //  5.パラメータを結合してパラメータ文字列を作成します。
    $ParamString = join('&',$UrlParams);
   
    //  6.〜7.電子認証のための文字列を用意します。
    $ParseUrl = parse_url($AmazonUrl);
    $StringToSign = "GET\n".
                    "{$ParseUrl['host']}\n".
                    "{$ParseUrl['path']}\n".
                    "{$ParamString}";
    echo "[StringToSign] : ";
    var_dump($StringToSign);
    echo "<br>";
    echo "<br>";
   
    //  8.HMAC-SHA256でハッシュメッセージ認証コードを作成します。
    $secret_key = "1234567890";//秘密鍵。
 $hmac_sha256 = new HMAC_SHA256($secret_key);
    $signature = $hmac_sha256->hmac($StringToSign);
    //  9.BASE64エンコード
    $signatureB64 = base64_encode($signature);
    echo "[signature] : ";
    var_dump( $signatureB64);
    echo "<br>";
    echo "<br>";
   
    //  10.URLを組み立てる。
    $url = $AmazonUrl.'?'.$ParamString.'&Signature='.RFC3986urlencode($signatureB64);
    echo "[URL] : ";
    var_dump( $url);
    echo "<br>";

    // Record time after hashing
    $time2 = microtime_float();

 // Display difference
    echo "<br />\nRuntime: " . ($time2 - $time1) . " seconds.";


    return;

    // RFC3986に基づいてURLエンコードする
    function RFC3986urlencode($str)
    {
        return str_replace('%7E','~',rawurlencode($str));
    }

    //  時間計測関数
    function microtime_float()
    {
        list($usec, $sec) = explode(" ", microtime());

        return (float)$usec + (float)$sec;
    }
?>






このPHPコードを実行すると、

[StringToSign] : string(250) "GET webservices.amazon.com /onca/xml AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06"

[signature] : string(44) "Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg="

[URL] : string(311) "http://webservices.amazon.com/onca/xml?AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06&Signature=Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D"

Runtime: 0.18074798584 seconds.





となります。signatureがアマゾンのサンプルと一致しているのが確認できるかと思います。
一応これで完成です。
あとは本物のアマゾンAPIに組み込んで使ってください。
ライセンスは特に主張しませんが、同じまま名前だけ変えて配布するのは止めてくださいね。
ではでは。

つづく?(Services/Amazonへの組み込み編は需要あるかな?)

以上です。お役に立ちましたら拍手をお願いします

2009/06/18 | 未分類COMMENT(2)TRACKBACK(0)  TOP

発売日ナビ Windows7対応&アマゾンPAA(Product Advertising API)対応

やっとPAAに対応できました。
現在私の環境でテストランニング中。
まだ、いくつか機能追加したいので今週末新バージョン公開はキビシイかも知れません。
エラー処理やらバックアップやらの対応検討中。

2009/06/08 | 開発状況COMMENT(0)TRACKBACK(0)  TOP

Windows7対応編 Windows7RCを手に入れましたので対応作業中です。GetVersionEx()でWindows7判定方法。

とりあえず、Windows7RCを仮想PC(VMWARE PLAYER)にインストールしました。

私のソフトとしては、
「XP風終了メニュー」
「ボタン工房」
「発売日ナビ」
のWindows7対応版を準備中です。

OSのバージョンチックで、Windows7はWindowsVistaのマイナーバージョン。
ってことでプログラムの修正をしています。

GetVersionEx()でWindowsのメジャーとマイナーバージョンを判定できます。

 // OSをチェックしてフラグを設定する。
 m_version = WINDOWS_98NT;
 static const char * const strPlatformId[] = {
        "VER_PLATFORM_WIN32s","VER_PLATFORM_WIN32_WINDOWS",
        "VER_PLATFORM_WIN32_NT",
    };
  OSVERSIONINFO osvi;
   
 // OSバージョン値を得る。
  osvi.dwOSVersionInfoSize = sizeof(osvi);
  GetVersionEx(&osvi);
  switch( osvi.dwMajorVersion ) { // メジャーバージョン


  case 6:
   // windowsVista以降
   switch (osvi.dwMinorVersion) { // マイナーバージョン
   case 0:
    m_version = WINDOWS_VISTA;
    break;
   case 1:
    m_version = WINDOWS_7;
    break;
   default:
    m_version = WINDOWS_NEXT;
    break;
   }
}


それぞれ動作が確認出来しだい順次配布予定です。



2009/05/22 | プログラミングCOMMENT(0)TRACKBACK(0)  TOP

PHP4 「Product Advertising API」をPHP4から使う。その2。HMAC-SHA256自作編。

前回の"「Product Advertising API」をPHP4から使う。その一。HMACへの道。"の続編です。
http://softyasu.blog121.fc2.com/blog-entry-100.html

今回は自前でHMACを実装します。
HMACはRFC2104として公開されていますので、まずその情報をご覧下さい。
http://www.ipa.go.jp/security/rfc/RFC2104JA.html

で、要約すると次のような処理をします。
(1)秘密キーがハッシュのブロック長より大きければ、秘密キー自体をsha256ハッシュ化する。
(2)秘密キーがハッシュのブロック長より小さければ、0でパディングする。
(3)ipadkeyは、ハッシュのブロック長分の0x36と秘密キーのxorをとって作る。
(4)opadkeyは、ハッシュのブロック長分の0x5cと秘密キーのxorをとって作る。
(5)ipadkeyとメッセージ(ハッシュ化データ)を結合して、sha256ハッシュ化する。
(6)opadkeyと(5)の結果を結合して、sha256ハッシュ化する。
で(6)の結果がMACって事になります。

SHA256ハッシュは下記のものを使っています。
http://www.nanolink.ca/pub/sha256/

では、PHPで書いたHMACのクラスです。

<?php
#####################################################################
#   HMAC-SHA256専用クラス
#       Copyright (c)ソフト屋 巣
#####################################################################

//  sha256ライブラリ
require_once('sha256.inc.php');
   
//  参考:RFC2104 http://www.ipa.go.jp/security/rfc/RFC2104JA.html
class HMAC_SHA256 {

    var $ipadkey;   //innerパッドキー
    var $opadkey;   //outerパッドキー
    var $pack_form; //packフォーマット。ブロック長とフォーマット。
   
    //==================================================
    //  コンストラクタ
    //      $key HMACの鍵
    //==================================================
    function HMAC_SHA256($key)
    {
        $this->pack_form = "H64";   //SHA256専用。
        define("HASH_BLOCK_SIZE",64);    //ブロック長
       
        //  鍵のパディング。
        if(strlen($key) > HASH_BLOCK_SIZE) {
            $key = pack($this->pack_form,sha256($key));//大きい場合はハッシュ化。
        } elseif(strlen($key) < HASH_BLOCK_SIZE) {
            $key = str_pad($key,HASH_BLOCK_SIZE,chr(0));
        }
       
        //  inner/outerパッドキーの作成。
        $this->ipadkey = (substr($key,0,HASH_BLOCK_SIZE) ^ str_repeat(chr(0x36),HASH_BLOCK_SIZE));
        $this->opadkey = (substr($key,0,HASH_BLOCK_SIZE) ^ str_repeat(chr(0x5C),HASH_BLOCK_SIZE));
    }
   
    //==================================================
    //  HMAC関数
    //      $msg メッセージ
    //==================================================
    function hmac($msg)
    {
        //  innerハッシュ
        $hashin = sha256($this->ipadkey.$msg);
        //  innerハッシュにouterを合成してハッシュを求める。
        $hash = sha256($this->opadkey.pack($this->pack_form,$hashin));
        //  パックして持ち帰る。
        return pack($this->pack_form,$hash);
    }
}
?>


今回は、ここまで。
次回は実際にHMACを使うサンプルコードをお見せします。

つづく。

以上です。お役に立ちましたら拍手をお願いします

2009/05/19 | 未分類COMMENT(0)TRACKBACK(0)  TOP

PHP4 「Product Advertising API」をPHP4から使う。その一。HMACへの道。

PHP4から「Product Advertising API」を使う場合の問題点となるのは、電子認証で必要なハッシュ メッセージ認証コードのHMAC-SHA256が簡単に使えないことです。便利なhash_hmac()とかmhash()がデフォルトでは使えませんので、レンタルサーバでは代用策を考えないといけません。
仕方なく、自前で実装の道を探ってみました。

まず、SHA256ハッシュをPHPだけで作り出すフリーのライブラリを探してみます。
色々探して見つけたのがこれ↓
http://www.nanolink.ca/pub/sha256/
「public domain」との事ですし、実行速度的にも申し分ありません。

次はHMACを実装しないといけません。
HMACはRFC2104として公開されていますので、まずその情報を見てみます。
http://www.ipa.go.jp/security/rfc/RFC2104JA.html
なんとなく分かったような分からないような感じです。
wikiは簡単すぎて訳分かりません。
http://ja.wikipedia.org/wiki/HMAC

って事で次回はHMACの実装に挑戦します。 つづく。

便利サイトのご紹介。
http://www.insidepro.com/hashes.php?lang=eng
ここのサイトで、Password:にデータ、HMAC-key::暗号キーを入れると色々なハッシュやHMACを一発表示できます。
ご活用ください。私は検証にとても役立ちました。

以上です。お役に立ちましたら拍手をお願いします。

2009/05/18 | 未分類COMMENT(0)TRACKBACK(0)  TOP

けろへいマンガ番外編 ちなみに私はCOBOLの宣言文が大嫌いでした。

20090514.png

2009/05/14 | 未分類COMMENT(0)TRACKBACK(0)  TOP

アマゾン 「Amazon アソシエイト Web サービス」が「Product Advertising API」に変更。

「Amazon アソシエイト Web サービス」略称AWSの事ですね。
ようするにアマゾン WEB APIの事で検索ワードで問い合わせると情報がXMLで返される仕組みです。
今までもECS4やら色々な呼び方の変更がされてきました。
ただ、Amazonのクラウドサービスの名称がEC2だったり混乱を招いていたのも確かです。
今回、名称変更が通知されました。
http://affiliate-blog.amazon.co.jp/

で、名前が変わるだけなら良いですが、「認証のための電子署名」が必要となりますってことで対応が必要になります。
2009年8月16日までに対応が必要なので、残りの期間は3ヶ月となります。
PHPとかライブラリの対応は間に合うんだろうか?

ってことでしばらくは対応作業を報告していくことになるかと思います。
報告はC++(発売日ナビ)とPHP4(漫画家・小説家データベース)をそれぞれ報告予定。

とりあえず今回は電子署名のための秘密キーの取得方法ついて。
アカウントサービスに行ってください。
https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html
のページの真ん中辺りにある「リソース」の「アカウント設定」をクリックします。
ユーザーIDとパスワードは、AWSのものを使います。
そうすると「アクセスキー情報」のリンクありますので、そちらで秘密キーが入手できます。
今回はここまで、また進展しましたら報告したいと思います。

「Product Advertising API」については下記サイトに情報があります(大半は英語です)。https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html

以上です。お役に立ちましたら拍手をお願いします。

2009/05/10 | 開発状況COMMENT(0)TRACKBACK(0)  TOP

 | BLOG TOP |  NEXT»»