2011年9月24日土曜日

Visual Studioの1つのプロジェクトで32ビットと64ビットの両方をターゲットにする

ネイティブなDLLを使って32ビットと64ビット対応のアプリケーションを作る場合、コードは同じだが参照するDLLのパスが違うだけという場合があると思います。例えばSystem.Data.SQLite.dllなど。

Visual Studioのプロジェクトの構成でx86やx64を選んでプラットフォームを変えた時に参照するDLLも同時に変える方法がhttp://stackoverflow.com/questions/145803/targeting-both-32bit-and-64bit-with-visual-studio-in-same-solution-projectに載ってました。

英語だし本筋と関係ない議論もあるので、必要なところだけまとめときます。

以下ではSQLite.dllを使い分ける例を示します。

まずx86構成でプロジェクトを作り、32ビット版のSQLite.dllを参照に加えます。

VSを一旦終了させ、上記のプロジェクトの構成ファイル*.csprojを開くと以下のようになっています。

...
<ItemGroup>
<Reference>...</Reference>
<Reference>...</Reference>
<Reference Include="System.Data.SQLite, Version=1.0.75.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\SQLite-1.0.66.0-binaries\bin\System.Data.SQLite.DLL</HintPath>
</Reference>
<Reference>...</Reference>
</ItemGroup>
...

ItemGroup要素の中にプロジェクトの参照設定がずらっと並んでいます。HintPathがDLLのパスです。

ここでSQLite.DLLを条件付きのItemGroupでくくって外に出してやります。

<ItemGroup Condition=" '$(Platform)' == 'x86' ">
<Reference Include="System.Data.SQLite, Version=1.0.75.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\SQLite-1.0.66.0-binaries\bin\System.Data.SQLite.DLL</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
<Reference Include="System.Data.SQLite, Version=1.0.75.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\SQLite-1.0.66.0-binaries\bin\x64\System.Data.SQLite.DLL</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Reference>...</Reference>
<Reference>...</Reference>
<Reference>...</Reference>
</ItemGroup>

こんな風にItemGroup要素を複数定義します。

そしてVSを再起動すると「参照コンポーネント ‘System.Data.SQLite’ が見つかりませんでした」という警告が出ますが、無視してビルドしてみるとプラットフォームの設定毎に適切なDLLがちゃんとロードされます。

2011年9月20日火曜日

iTunesで特定の歌詞が含まれている曲の歌詞を削除する

まず特定の歌詞が含まれている曲を集めて1つのプレイリストにしたい。

普通に探すとたぶん以下のスクリプトが最初に見つかるだろう。

tell application "iTunes"
display dialog "歌詞の一部を入力してください" default answer "" buttons {"Cancel", "OK"} default button 2
copy the result as list to {text_returned, button_pressed}

set thePlaylist to make new playlist with properties {name:text_returned}
with timeout of 60000 seconds
duplicate (every track of playlist "洋楽" whose lyrics contains text_returned) to thePlaylist
end timeout
end tell

ところが上記スクリプトだとなぜかうまくいかない(ほんとは含まれているのに見つけてくれない)。

他のスクリプトを探すとhttp://aurelio.net/soft/itunes-search-in-lyrics/が見つかった。

スクリプトをダウンロードして眺めてみたが、どうやら

duplicate (every track of playlist “洋楽” whose lyrics contains text_returned) to thePlaylist

という方法ではだめらしい。

上記スクリプトでは

set {theLocations, theLyrics} to {location, lyrics} of file tracks of selectedPlaylist
repeat with i from 1 to (count of theLocations)
if userText is in item i of theLyrics then
add {item i of theLocations} to playlist resultsPlaylistName
end if
end repeat

となっている。

いったい何が原因なのかいまいち分からないが、これでうまくいった。

次に歌詞の削除だが、m4aファイルであればhttp://dougscripts.com/itunes/scripts/ss.php?sp=deletelyricsの’Delete Lyrics’で消せることができる。mp3とかだとなぜか消せないので、消したい曲を選択して”ID3 タグを変換” > ver 1.0を選択して変換し、再びID3 タグをver 2.4等に変換すると消すことができる。

2011年9月17日土曜日

Eclipseのbuild.xmlのエクスポートがうまくいかない。

Eclipseのbuild.xmlをエクスポートする機能が動かなくてはまった。

エクスポートしたいプロジェクトはSVNで管理しているプロジェクトなのだが、どうやらプロキシの設定が間違っていたりしてSVNと通信できないとエクスポートできないことがあるらしい。

でも今回はプロキシの設定は正しかったのだが、なぜかエクスポートしようとしてもできなかった。

workspace/.metadata/.logを見ると以下のエラーが出ていた。

org.eclipse.equinox.security.storage.StorageException: No password was found.
Value of "ssl_passphrase" is being stored as a non-encrypted value in the node

どうやらSecureStorageが関係していそうなので、EclipseのPreferences>General>Security>Secure StorageのDefault Secure Storageを削除してもっかい試してみると今度は無事にbuild.xmlがエクスポートできました。

2011年9月11日日曜日

Redmine REST APIで日時指定をして工数取得

Redmine REST APIを使って工数を取得するプログラムを作っているのですが、開始日や終了日を指定して取得したかったので調べてみました。

通常の工数取得方法は以下のURLに書いてあります。

http://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries

ただ、開始・終了日の指定方法は書いてなかったので、できないのかと思っていましたがfromとtoパラメータを以下のように指定することでできました。

http://hoge.co.jp/projects/my_project/time_entries.xml?from=2011-08-01&to=2011-08-20