SirMilesの独り言 このページをアンテナに追加 RSSフィード


2011-09-29

[]Amazon Product Advertising APIの仕様変更について

 また仕様変更。今度は、AssociateTagパラメータが必須だとか。

 以前の仕様変更に関するエントリで、AssociateTagを入れるとエラーになるので省いたという顛末を紹介しましたが、今度は必須になるので、どうにかしなければなりません。

 ただ追加しただけでは、全く動作しないので、悩みに悩んだ挙句、ググッて見つけたのは、

キーを作成する際、AWSAccessKeyIdパラメータは、各種パラメータの最初に置かなければならない

ということ。

 つまり、キーを取得する際に、AssociateTagをひっくるめてソートしてしまうと、AssociateTagが最初に配置される為、間違ったキーを生成するばかりか、アクセスも出来ない…というかなり厳しい仕様のようです。

 さて、点在するスクリプトを、これからコツコツ修正します…orz

2011-04-22

[]SirMiles.com リニューアル

 MovableType5の研究(という練習?)が終わったので、SirMiles.comのポータルリニューアルしてみました。

f:id:SirMiles:20110424091633j:image

 同時に、「海賊戦隊ゴーカイジャーを見たか?」を単独ブログ化しました。

 結局やってしまいました(笑)。

 よろしくお願い致します。

2009-07-22

[]「藤巻浩のお気楽道場(DTM MAGAZINE)」に参上 pt.3

 またまた参上。今度は「G Minor」という曲です。

D

 「Independence」という音源のフリー版に、パイプオルガンのすごい音が入っていたので、どうしても使いたくなってしまい、バロック風のフレーズを主体にして作りました。

 ただし、この曲の出来にはあまり納得できておらず、冗長というか何というか、モヤモヤしていました。

 フレーズ的にはそれなりに魅力がありますけど、どうも展開感が乏しいんですね。

 藤巻先生には、私自身が気になっていたポイントをズバリ見抜かれ、冗長な部分をバッサリとカットする手法と、展開のアイディアをご提示いただきました。いつも参考になります。ちなみに、私が特に気に入っているサビ的な部分は、先生にも「気持ちいい部分」とご評価頂いた感じで、かなり嬉しい気分になりました。

 藤巻先生の「コード作曲講座」では、楽曲分析の手法が紹介されていますが、これも非常に参考になります。元々、楽譜からハーモニーを読み取る作業は割と得意な方なのですが、四声体とテンションをきちんと取り込んで考え始めたのは、この「コード作曲講座」を読み始めてからなので、注意深く楽譜オーディオ番組とを利用させていただいてます。

 最近は仕事の都合もあって、音楽制作がままならない状態なのですが、休みの日を利用して「勉強の成果」なるものを完成させましたので、「次の次」に投稿しました。「次の次」ということは、「次」の投稿も既に済んでいるということです(笑)。

2009-05-21

[]AmazonアソシエイトWebサービスの名称変更に伴う署名認証(Perl)

 Amazonアソシエイトで、Webサービスを利用している方々のホットな話題です。

 いや〜、参りました。

 突如メールが届いて、簡単に言えば「3ヶ月の猶予期間をあげるから、その間にAWSを使っているアプリの仕様変更をして下さい」とのことです。

 仕様変更の内容はというと、リクエスト日時をTimestampパラメータに含めることと、シークレット・アクセス・キーを使って「RFC2104 HMAC-SHA256」で署名ハッシュを作ってリクエストに追加するというもの。

 いや〜、参りました(笑)。

 何の事かさっぱりだったのですが、ググりまくって日本語やら英語やら読み漁って、ようやく移行完了。

 まず、さくらインターネットを使っていて、PerlのDigest::SHAが使えないのでCPANをユーザレベルでインストールこちらを参考にしました。

 CPANでDigest::SHAをインストールしたものの、どういじってもPerlスクリプトから見られないので、仕方なくスクリプト内に、

use lib qw(〜場所〜);

を書くことに。これにより、

use Digest::SHA qw(hmac_sha256_base64);

を書けます。

 で、後は各パラメータをソートした後、「hmac_sha256_base64」を使用してSignatureパラメータを作ってやるわけですが、この辺を参考にすればOK。

 ただし、日本語のキーワードで検索する場合は、

ecs.amazonaws.jp
/onca/xml
AWSAccessKeyIdやらのパラメータ

の方が良さそう。さらに、AssociateTagパラメータがあると必ずエラーが返ってくるようなので除外。エラーにはなりませんが、私はSubscriptionIdも除外しました。

 なお、Perlでの変更の要点は、以下の通り。一部前述と重複します。なお、リクエストパラメータは、既にURIエスケープされているものとします。

 Digest::SHAのhmac_sha256_base64を使う。

use Digest::SHA qw(hmac_sha256_base64);

 タイムスタンプは「yyyy-mm-ddThh:mm:ssZ」形式。次のサブルーチンで生成できます。

sub gettimestamp {
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
    my $ts = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ",$year+1900,$mon+1,$mday,$hour,$min,$sec);
    $ts =~ s/:/%3A/g;
    return $ts;
}

 署名を作るサブルーチン。シークレットアクセスキーを「0123456789」と仮定。

sub getsignature {
    my($sortedparams) = @_;
    my $data      = "GET\n"."ecs.amazonaws.jp\n"."/onca/xml\n".$sortedparams;
    my $key       = '0123456789';
    my $signature = hmac_sha256_base64($data, $key);

    $signature .= '=' while length($signature) % 4;

    return URI::Escape::uri_escape($signature);
}

 Webサービスへのリクエストパラメータは、アルファベット順にソートしておく。

my $timestamp = gettimestamp();
my $sortedparams = "AWSAccessKeyId=........&ItemPage=1&Keywords=.......&Operation=ItemSearch&ResponseGroup=Medium&SearchIndex=.......&Service=AWSECommerceService&Timestamp=$timestamp&Version=2009-01-06";

 このサブルーチンを呼び出して、Signatureパラメータとしてリクエストに加えます。

my $signature = getsignature($sortedparams);
my $requesturl = "http://ecs.amazonaws.jp/onca/xml?$sortedparams&Signature=".$signature;

 これで、リクエストが可能になります。

2009-05-11

[]「藤巻浩のお気楽道場(DTM MAGAZINE)」にまた参上

 今度は、「Devadatta(ダイバダッタ)」という曲で参上です。

D

YouTubeに上げたのは制作途中の音源なので、やや異なります。

 勢いだけで作り上げた感も強いこの曲。インド系フレーズが思いついた瞬間から突っ走って作りました。

 当然、金銀銅賞など頂くべくもない曲ですが、藤巻先生にはかな〜りお褒め頂いてしまい、私が今一番懸念している「コードワーク」についても「素晴らしい」と評価して頂きました。と言いつつ、今号の「コード作曲講座」の裏コードに触れて早くも火傷しそうな私ですが^^;

 一応、「アマチュア志向」の投稿者にはやや甘めで応じるというスタイルなので、その辺りを考慮したとしても、やっぱり良い評価を頂くと気分がいいです(笑)。

 今回の藤巻先生のアドバイスは、音ネタを加えていくという手法。なるほどと思わされること多々でした。藤巻先生が加えてくださった音は、とっても派手で賑やか。そこまでハジけていいんですね!

 なお、次号には投稿せず、次々号には既に投稿済み。今度はこの曲とはベクトルが全然違う、ちょっと真面目な感じになっていますが、もしかすると藤巻先生をガッカリさせるかも!?

2009-04-24

[]ひたすら勉強

 先日「DTM MAGAZINE」の「藤巻式コード作曲講座」に触れましたが、超充実のオーディオ番組が付録DVDに収録されているので、iPodに移して、運転中はおろかランニングの時まで中毒のように聞いています。

 最初は、沢山出てくるコードネームを頭の中で繰り返して反芻するような聞き方をしていましたが、あまりに聞き過ぎたのか、最近では音が出てくると鍵盤が頭の中に浮かぶまでに(笑)。たまに間違えてますが(ダメじゃん)。

 元々絶対音感の持ち主ではあるのですが、この歳になってテンション系和音が徐々に聞き分けられるようになるとは夢にも思いませんでした。やっぱり訓練は大事なんですねぇ。

 この講座、毎月が楽しみで楽しみで仕方ありません。

 是非、藤巻先生には少しでも長く、このコーナーを連載して頂きたいです。


 で、これまで「理論」といったものを敬遠していた私が、遂に手を出したのが、これ。

標準 ポピュラーコード理論 改訂新版

標準 ポピュラーコード理論 改訂新版

 書店で何冊か眺めて、この本が一番「藤巻式コード作曲講座」の内容補完に役立つのではと思い、すぐに購入。給料前で金欠でしたけど、衝動買いです。

 読み進めていますけど、やっぱりこの世界は深淵ですねぇ。

 頑張って、つっかえているものを突破しようと思います。

2009-04-09

[]「藤巻浩のお気楽道場(DTM MAGAZINE)」に参上

 DTM MAGAZINEという、私がDTMに触りだした頃から(ホントに昔っから)ある雑誌。

 今回、初めて自作曲を投稿してみました。

 「幽戸 ~KAKURIDO~」という曲なのですが、今年に入って音楽熱が再燃後、初めて作った曲です。

D

YouTubeに上げたのは制作途中の音源なので、やや異なります。

 私が盛んにDTMしていた頃は「オーディオの編集って何?」という感じだったので、新しい制作環境を導入すると、浦島太郎状態。特にミックスで音は歪むわ音量合わないわで大変でしたが、何とか完成。

 現在はやや慣れた手つきで少しずつ制作しております。

 で、肝心の「藤巻浩のお気楽道場」ですが、藤巻先生(何と憧れのハネケン先生に師事されたそうです!)が、私のようなアマチュアにもアドバイスを下さるという、有難〜いコーナー。

 各月で素晴らしい作品に与えられるという金銀銅賞狙いは当然無理として(笑)、プロのコメントとアドバイスを頂いてみたくなり、血迷って投稿しました。

 何と、「打ち込みは良く出来ている」とお褒め頂きました!

 実は殆どのパートを手で弾いていて、いわゆる打ち込みらしい打ち込みは殆どしてないのですが…。やっぱり、ステップよりリアルタイム録音の方が生っぽくてカッコいいですからね。藤巻先生はその辺を見抜いてらっしゃったのでしょう。

 あと、ディストーションギターの音をお褒め頂きました。

 アレは本物のギターを弾いてるのではなく、「Independence」というVSTiのフリー版にあった、凄いギターの音色に目をつけ、キーボードで何回も練習してギターっぽく聞こえるように弾いている…というのがタネアカシ。元々凄くリアルな音源なのですが、本物っぽく聴こえた(?)というのは最高に嬉しかったですね。

 藤巻先生のアドバイスとしては、ミックスに遊びの余地があることと、音の質感について。

 私はハイファイ好みなので、ローファイの発想がなく、ローファイのフィルタをかけて頂いた音には衝撃を受けました。とても勉強になります。

 実は次号にも既に曲を投稿してしまいました。投稿曲が著しく増加している為、次号からはアドバイス外になる可能性が大(笑)。

 更にその次は、もうちょっと勉強して洗練されたものを投稿する……かも知れません。


 藤巻先生は他に「コード作曲講座」も連載されていて、こちらも毎号楽しみにしています。

 かつて、エレクトーンで3和音のカデンツを叩き込まれた私には、正に目から鱗。カッコいい響きが嬉しくて、つい子供のエレクトーンの練習時間を奪って鍵盤を押さえてしまいます。これから頭脳改革するのは難しくはありますけど、何とかコードワークをモノにしたいと思います。カッコいいコードが押さえられると、遊び弾きにも色気が出ますからね。


 ホント、DTM MAGAZINE購読を復活して良かったと思う今日この頃でした。藤巻先生には感謝感謝の嵐です。

2008-11-28

[]Microsoft Visual C++ 2008 で、恐らく最良解決な2つのListViewの同期スクロール

 System::Windows::Forms::ListViewには、2つのListViewの同期スクロール機能がありません。

 そこで、ListViewを継承してカスタムコントロールを作るわけですが、スクロールイベントを拾っても、どこかで動作がおかしかったり、うまく同期しなかったりと、腹を立てることになります。

 というわけで、Viewプロパティが、System::Windows::Forms::View::Details限定ならば、次のようなコードでうまく動作するという事例をご紹介(納品した製品でうまく動いているのでOKだと思います)。

#pragma once

#define WIN32_LEAN_AND_MEAN
#pragma comment(lib, "user32.lib")
#include <windows.h>
#include <CommCtrl.h>

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Collections::Generic;
using namespace System::Windows::Forms;

namespace MyControls {

public ref class MyListView : public System::Windows::Forms::ListView
{
public:
	// コンストラクタ
	MyListView()
	{
		View = System::Windows::Forms::View::Details; // Details限定

		mVScrollSynchronizedListView = nullptr;

		mOldScrollY = 0;
		mSyncScroll = false;
	}

	// 垂直スクロールを同期させるリストビュー
	[CategoryAttribute("特殊")]
	[DescriptionAttribute("垂直スクロールを同期させるリストビューを指定します")]
	property MyListView^ VScrollSynchronizedListView
	{
		MyListView^ get() {
			return mVScrollSynchronizedListView;
		}
		void set(MyListView^ x) {
			mVScrollSynchronizedListView = x;
		}
	}

	// 垂直スクロールの旧位置
	[BrowsableAttribute(false)]
	property int OldScrollY
	{
		int get() {
			return mOldScrollY;
		}
		void set(int x) {
			mOldScrollY = x;
		}
	}

	// 連動スクロール開始
	[BrowsableAttribute(false)]
	property bool SyncScroll
	{
		bool get() {
			return mSyncScroll;
		}
		void set(bool x) {
			mSyncScroll = x;
		}
	}

protected:

	// 連動スクロール用イベント処理
	virtual void WndProc(Message %m) override
	{
		ListView::WndProc(m);

		if(mSyncScroll
		&& m.Msg==WM_PAINT) {
			SCROLLINFO si;
			ZeroMemory(&si,sizeof(SCROLLINFO));
			si.cbSize = sizeof(SCROLLINFO);
			si.fMask  = SIF_POS;

			if(Items->Count
			&& ::GetScrollInfo((HWND)Handle.ToPointer(),SB_VERT,&si)) {
				if(mOldScrollY!=si.nPos) {
					if(mVScrollSynchronizedListView) {
						int dx = 0;
						int dy = (si.nPos - mOldScrollY) * Items[0]->Bounds.Height;

						mVScrollSynchronizedListView->OldScrollY = si.nPos;
						::SendMessage((HWND)mVScrollSynchronizedListView->Handle.ToPointer(),LVM_SCROLL,(WPARAM)dx,(LPARAM)dy);
					}
				}
				mOldScrollY = si.nPos;
			}
		}
	}

private:

	MyListView^ mVScrollSynchronizedListView;
	bool        mSyncScroll;
	int         mOldScrollY;
};
}

 もう、描画イベントを全部キャプチャして無理矢理スクロールしてしまえということです。

 このコントロールをフォームに2つ貼り付けて…。

listView1->VScrollSynchronizedListView = listView2;
listView2->VScrollSynchronizedListView = listView1;

listView1->SyncScroll = true;
listView2->SyncScroll = true;

とすれば、listView1とlistView2の垂直スクロールが同期します。

 勿論、水平スクロールの同期もこのコードをちょっと改造すれば対応可能です。

2008-10-10

[]動的URLを静的URLリダイレクトする

 Web上に沢山載っていたのは、静的URLを動的URLリダイレクトするというもの。

http://www.olddomain.com/optimus/prime.html

  ↓

http://www.newdomain.com/optimus.cgi?id=prime

 今回、sirmiles.comから一部コンテンツを移転するにあたり、逆パターンが突如必要になりました。

http://www.olddomain.com/optimus.cgi?id=prime

  ↓

http://www.newdomain.com/optimus/prime.html

 .htaccessを使って、次のように記述するとOK。

RewriteEngine on

RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule (.*)\.cgi$ http://www.newdomain.com/$1/%1.html? [R=301,L]

 RewriteCondでキャプチャしたグループが%1で参照できるとは知りませんでした(苦笑)。

2008-05-02

[]Repl-Ace on .NET

 完成。公開しました。

 Repl-Ace on .NET

 サイトが Movable Typeテンプレそのままで手抜きっぽいのはご容赦。