Archive for 10月, 2006

31
2006

AtomAPIとWSEE

| No Comments | No Trackbacks | はてなブックマークへ追加 | del.icio.usへ追加 |

AtomAPIとWSEE認証はよくセットになっているけど、AtomAPIでWSEE認証を使うのは仕様なのでしょうか?ふと疑問に思いました。

30
2006

AmazonWeb APIでAssociateTagを付けてASINで商品を検索、見つかったDetailPageURLにはTag=xxxが付いているもののそのページに飛ぶとReDirectされて、AssociateTagが消えてしまいます。これについて、Forumで質問と回答を見つけました。

http://developer.amazonwebservices.com/connect/thread.jspa?threadID=10829&tstart=15

DetailPageURL

Posted: Jun 14, 2006 1:27 AM in response to: chironjpn Reply

chironjpn さま

onomatope さまご指摘の通り、アソシエイトタグはリダイレクト後表示されなくなりますが、最大24時間有効です。

詳細につきましては、以下Amazonアソシエイト・プログラム運営規約の

4. 紹介料をご参照ください。

http://affiliate.amazon.co.jp/gp/associates/network/help/operating

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

Aya at Amazon

というわけで、TagがURLから消えるのは仕様。ただし、24時間有効とのこと。

「Amazonアソシエイト・プログラム運営規約の 4. 紹介料」によると。

商品販売が紹介料支払いの対象となるためには、お客様が乙のサイトの特別リンクをクリックスルーして本サイトにアクセスされ、一つのセッションにおいて商品をお客様のショッピングカートに入れ、または本サイトの1-Click注文により購入しなければなりません。セッションは次のいずれかの時点で終了します。(a) お客様が最初にクリックスルーしてアクセスしてから24時間が経過した時点、(b) お客様が商品の注文を確定した時点、または(c) お客様が乙のサイト上の特別リンク以外の方法により本サイトにアクセスした時点。甲が紹介料を支払うのは、その商品の注文が確定し、商品が発送され、支払いが完了した場合に限ります。

とあり、紹介料が発生するセッションは

  • (a) 24時間経過
  • (b) 注文を確定した時点
  • (c) 特別リンク以外でAmazonにアクセスした時点

によって終了するらしい。

特別リンクというのは、おそらく WebAPI でとれる DetailPageURL のことと思われます。

29
2006

ソフトウェアとはもっと技術的に深くてかつ、芸術的要素もあるものだというのが自分の主張なのですが、どうもその考えに会社どころか日本という国に対してすらギャップを感じます。


これは戦後の工業の発展という流れを抜け出せてないのではないかとふと思いました。ビジネスやプロセスも確かに重要なんですが、技術や創造性という意味ではまったくキラメキを日本に感じなくなっています。


ビジネスとしてメリットがあるからやる、コストを下げるためにオフショア開発を検討する。たしかに企業として意味のある行為なのですが、何故日本からLastfmやYouTubeのような心躍るサービスがうまれないのか。


どこか日本のソフトウェアに対する考えみたいなものに疑問を感じる毎日です。

29
2006

LastFM

| No Comments | No Trackbacks | はてなブックマークへ追加 | del.icio.usへ追加 |

LastFMの昔のサンプルコードを眺めながらライブラリ化しようと心に誓いました。しかし、ClientIDのもらいかたがわかりません。RUSSさんに言うと良いらしいのですが、どこでコンタクトをとれるのか不明。

28
2006

Winamp SDKにはメタデータ取得のためのAPI(message)があり、これを駆使して再生中のコンテンツのタイトルやらアーティストやらを取ることが可能です。が、おそらくこれらのAPIは同一プロセス内のPlug-inから呼び出されることを最初は想定しているもの。で、SongWidgetのように外部プロセスからアクセスするにはメモリのプロセス間共有が必要です。

例えば再生中のfilepathを取得する場合には、Winamp領域のメモリを読む必要があります。ウインドウハンドルは分かっているので、GetWindowThreadProcessIdでProcessIDを取得し、OpenProcessでプロセスハンドルを取得、ReadProcessMemoryで指定のプロセスのメモリを読ませてもらいます。コードにすると以下のようになります。

CStringA str;
char szBuffer[_MAX_PATH] = {0};
DWORD dwPID;
GetWindowThreadProcessId(hWnd, &dwPID);
HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwPID);
if (hProcess) {
DWORD dwRead;
BOOL bRet = ReadProcessMemory(hProcess, psz, szBuffer, sizeof(szBuffer), &dwRead);
if (bRet) str = szBuffer;
CloseHandle(hProcess);
}

さて、さらにアーティストやらメタを取る場合はさらに大変です。Winampプロセスにまずメモリを確保して、そこにメタデータを書いてもらい、さらに取得する。さらっと書くとこんな感じです。98/Meと2000/XPでメモリの確保の方法を変えないといけないのでちょっと面倒です。

typedef LPVOID (WINAPI *virtAllocEx)(
HANDLE hProcess,  // process within which to allocate memory
LPVOID lpAddress, // desired starting address of allocation
DWORD dwSize,     // size, in bytes, of region to allocate
DWORD flAllocationType,
// type of allocation
DWORD flProtect   // type of access protection
);
typedef BOOL (WINAPI *virtFreeEx)(
HANDLE hProcess,  // process within which to free memory
LPVOID lpAddress, // starting address of memory region to free
DWORD dwSize,     // size, in bytes, of memory region to free
DWORD dwFreeType  // type of free operation
);
CStringA getMetadataInfo(HWND hWnd, const CStringA& strFileName, const CStringA& strField)
{
CStringA strMetadata;
const int cbSize = 1024; // TBD
OSVERSIONINFO osVersion;
extendedFileInfoStruct extFileStruct;
osVersion.dwOSVersionInfoSize = sizeof(osVersion);
GetVersionEx(&osVersion);
// for pointer in Winamp process
extendedFileInfoStruct* pExtFileStructRemote = NULL;
char* pszFileNameRemote = NULL;
char* pszFieldRemote = NULL;
char* pszBufferRemote = NULL;
if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HINSTANCE hKernel = GetModuleHandle("kernel32.dll");
if (!hKernel) return strMetadata;
// Get handle over WinAmp process
DWORD dwWinAmpProcId;
GetWindowThreadProcessId(hWnd, &dwWinAmpProcId);
HANDLE hWinampProc = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, dwWinAmpProcId);
if (!hWinampProc) return strMetadata;
virtAllocEx allocEx = (virtAllocEx)GetProcAddress(hKernel, "VirtualAllocEx");
virtFreeEx	freeEx	= (virtFreeEx)GetProcAddress(hKernel, "VirtualFreeEx");
// Allocate the buffers in WinAmp address space
pExtFileStructRemote = (extendedFileInfoStruct*)allocEx(hWinampProc, NULL, sizeof(extFileStruct), MEM_COMMIT,PAGE_READWRITE);
pszFileNameRemote	= (char*)allocEx(hWinampProc, NULL, strFileName.GetLength()+1, MEM_COMMIT,PAGE_READWRITE);
pszFieldRemote		= (char*)allocEx(hWinampProc, NULL, strField.GetLength()+1, MEM_COMMIT,PAGE_READWRITE);
pszBufferRemote		= (char*)allocEx(hWinampProc, NULL, cbSize, MEM_COMMIT, PAGE_READWRITE);
// Fill the buffers allocated
DWORD dwRet;
WriteProcessMemory(hWinampProc, pszFileNameRemote, (void*)((LPCSTR)strFileName), strFileName.GetLength()+1, &dwRet);
WriteProcessMemory(hWinampProc, pszFieldRemote, (void*)((LPCSTR)strField), strField.GetLength()+1, &dwRet);
extFileStruct.filename	= pszFileNameRemote;
extFileStruct.metadata	= pszFieldRemote;
extFileStruct.ret		= pszBufferRemote;
extFileStruct.retlen	= cbSize;
WriteProcessMemory(hWinampProc, pExtFileStructRemote, &extFileStruct, sizeof(extFileStruct), &dwRet);
// Send request to Winamp
if ( SendMessage(hWnd, WM_WA_IPC, (WPARAM)pExtFileStructRemote, IPC_GET_EXTENDED_FILE_INFO) ) {
char* pszBuffer = new char[cbSize+1];
if (pszBuffer) {
ReadProcessMemory(hWinampProc, pszBufferRemote, pszBuffer, cbSize, &dwRet);
strMetadata = pszBuffer;
delete [] pszBuffer;
}
}
// Clean the Winamp address space
freeEx(hWinampProc, pExtFileStructRemote,	0, MEM_DECOMMIT);
freeEx(hWinampProc, pszFileNameRemote,		0, MEM_DECOMMIT);
freeEx(hWinampProc, pszFieldRemote,			0, MEM_DECOMMIT);
freeEx(hWinampProc, pszBufferRemote,		0, MEM_DECOMMIT);
// Close the process
CloseHandle(hWinampProc);
}
else if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
// Allocate the buffers in global address space
HANDLE hFileExtFileStruct	= CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE|SEC_COMMIT, 0, sizeof(extFileStruct), NULL);
HANDLE hFileFileName		= CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE|SEC_COMMIT, 0, strFileName.GetLength()+1, NULL);
HANDLE hFileField			= CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE|SEC_COMMIT, 0, strField.GetLength()+1, NULL);
HANDLE hFileBuffer			= CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE|SEC_COMMIT, 0, cbSize, NULL);
pExtFileStructRemote	= (extendedFileInfoStruct*)MapViewOfFile(hFileExtFileStruct, FILE_MAP_WRITE, 0, 0, 0);
pszFileNameRemote		= (char*)MapViewOfFile(hFileFileName,	FILE_MAP_WRITE, 0, 0, 0);
pszFieldRemote			= (char*)MapViewOfFile(hFileField,		FILE_MAP_WRITE, 0, 0, 0);
pszBufferRemote			= (char*)MapViewOfFile(hFileBuffer,		FILE_MAP_WRITE, 0, 0, 0);
// Fill the buffers allocated
strcpy(pszFileNameRemote, (LPCSTR)strFileName);
strcpy(pszFieldRemote, (LPCSTR)strField);
pExtFileStructRemote->filename	= pszFileNameRemote;
pExtFileStructRemote->metadata	= pszFieldRemote;
pExtFileStructRemote->ret		= pszBufferRemote;
pExtFileStructRemote->retlen	= cbSize;
// Send request to Winamp
if (SendMessage(hWnd, WM_WA_IPC, (WPARAM)pExtFileStructRemote, IPC_GET_EXTENDED_FILE_INFO)) {
char* pszBuffer = new char[cbSize+1];
if (pszBuffer) {
memcpy(pszBuffer, pszBufferRemote, cbSize);
strMetadata = pszBuffer;
delete [] pszBuffer;
}
}
// Clean the global address space
UnmapViewOfFile(pExtFileStructRemote);
UnmapViewOfFile(pszFileNameRemote);
UnmapViewOfFile(pszFieldRemote);
UnmapViewOfFile(pszBufferRemote);
CloseHandle(hFileExtFileStruct);
CloseHandle(hFileFileName);
CloseHandle(hFileField);
CloseHandle(hFileBuffer);
}
return strMetadata;
}
28
2006

Winamp 音量取得

| 1 Comment | No Trackbacks | はてなブックマークへ追加 | del.icio.usへ追加 |

Winamp SDKを見ていても、音量取得するようなメッセージのIDがありません。IPC_SETVOLUMEはあっても、IPC_GETVOLUMEがないのです。

http://valgus.x0.com/blog/2006/02/winamp.html(Winampの音量値が取れなかった…)にて同じ悩みを持っている方がおられました。しかし、Winamp Remote(http://widgets.yahoo.com/gallery/view.php?widget=36544)でできているっぽいので頑張って探してみました。

そしてThe Code Projectで見つけました。http://web6.codeproject.com/audio/winamp2api.asp?df=100&forumid=14866&exp=0&select=444899&fr=26を読むと、IPC_SETVOLUMEでLPARAMを-666でSendMessageすると音量取得できるようです。

27
2006

My Outlook Today 1.1.3をSubmitしました。いくつかバグを修正しました。ただ、時差があるとは言え、今日は金曜日なので更新されるのは来週月曜日になるかもしれません。

26
2006

3000

| No Comments | No Trackbacks | はてなブックマークへ追加 | del.icio.usへ追加 |

SongWidgetで3000DLを越えました。そしてYahooの人がスクリーンショットを変えてくださりました。

ジャケットとアマゾンのレビューコメントが表示された画面が出たのでかなり雰囲気が伝わるかと。

http://widgets.yahoo.com/gallery/view.php?widget=40613

Good Job.

25
2006
詳説 正規表現 第2版

詳説 正規表現 第2版

を持っている人に読ませてもらったが内容が濃い。濃すぎる。これで5000円はちょっと高いし図書館で借りた方が良さそうだ。

もっとリファレンス的なものはないだろうか?

これくらいのハンドブック的なものが良いのでしょうか。しかし、本屋で見つけられませんでした。

正規表現デスクトップリファレンス

正規表現ハンドブック

正規表現ポケットリファレンス

25
2006

音楽とWeb2.0

| No Comments | No Trackbacks | はてなブックマークへ追加 | del.icio.usへ追加 |

音楽で前から面白そうだなと思うWebサイトをあげるとすると



あたり。


日本でWeb2.0風企業となるとどういった会社なのかわからないけど、mixiとかはてなとかグリーとかなのだろうか。


日本では音楽配信はあっても音楽サービスのベンチャー企業って全然ない気がするが気のせいか。著作権が厳しいからなのか儲からないからなのか。でもSNSに大きなビジネスモデルがもとからあったとも思えない。


http://www.veena.jp/は面白いと思ったけど、どうも運営会社はSIerっぽい気がする。


ないなら作ってしまえという話もあるけど、音楽サービスのベンチャーを起こすにはどうしたらいいのだろう。