Jumboのブログ!

たわいのない事をメモ的に残す日記のような技術ブログです。
お役に立つかは自信がありません。
ここの内容を少しずつホームページに反映していきたいと思います。
<< June 2009 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>

美味しいビールを飲むためのジョッキー

以前に凍らせて使うジョッキーを使っていました。でも冷凍室を占領するって撤去されてしまっていたんですが、どうしてもまた使いたくて家中探しても見つかりませんでした...

実は以前に使っていた用途はアイスコーヒーを飲むことが主でした。当時はあまりビールを飲んでいませんでしたから...

でも今は冷えた美味しいビールを飲みたくて凍らせたジョッキーが欲しいのです。

で、探してみました。商品名もわからなかったので色々なキーワードで検索して見つけたのがこちら。



こちらの店は送料が高い。北海道は千円を超えます。商品より高い送料って...



こちらの店は送料が630円で統一されています。



こちらも送料は630円です。

ちなみにアマゾンでも調べてみました。

アイス・ビアジョッキー
アイス・ビアジョッキー
厨房卸問屋 名調

アマゾンですがマーケットプレイスなので送料は無料になりません。どこで買うか悩みどころです。
日記 | permalink | comments(0) | trackbacks(0)

Team Foundation ビルドでビルド番号を生成する2 ファイル検索編

自動ビルドでビルド番号を各ファイルに反映させるためにはAssemblyInfo.vbやAssemblyInfo.csを探し出す必要がありますが、どうにも良い方法が見つからなかったのでプログラムを作ってしまいました。
下のソースはビルドプロジェクトに組み込むアセンブリのソースで、指定されたディレクトリから指定されたファイル名を探し出して、そのフルパスのファイル名のリストを返します。
Requiredアトリビュートは入力パラメータです。Outputアトリビュートは出力パラメータとなります。
SourceDirは検索先のディレクトリ名、FileNamesは検索するファイル名のリストです。
結果はSourceListでフルパスファイル名のリストを返しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;

namespace FileSearch
{
    public class SelectFileList : Task
    {
        private string sourceDir;
        private string[] fileNames;
        private List<string> sourceList=new List<string>();

        [Required]
        public string SourceDir
        {
            private get { return sourceDir; }
            set { sourceDir = value; }
        }

        [Required]
        public string[] FileNames
        {
            private get { return fileNames; }
            set { fileNames = value; }
        }

        [Output]
        public string[] SourceList
        {
            get { return sourceList.ToArray(); }
        }

        public override bool Execute()
        {
            foreach (string filename in FileNames)
            {
                ProcessDirectory(SourceDir, filename);
            }
            return true;
        }

        private void ProcessDirectory(string targetDirectory,string targetFileNames)
        {
            string[] fileEntries = Directory.GetFiles(targetDirectory, targetFileNames);
            if (fileEntries.Length > 0)
            {
                foreach (string fileName in fileEntries)
                {
                    sourceList.Add(fileName);
                }
            }
            string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
            foreach (string subdirectory in subdirectoryEntries)
            {
                ProcessDirectory(subdirectory, targetFileNames);
            }
        }
    }
}


これをビルドプロジェクトが入っているフォルダにコピーしてチェックインしてください。
具体的にはTF add FileSearch.dllを行って、TF checkin FileSearch.dllを実行します。

これをビルドプロジェクトから呼び出すには

<UsingTask
    TaskName="FileSearch.SelectFileList"
    AssemblyFile="FileSearch.dll"/>


と使用を宣言した後に

<SelectFileList
      SourceDir="$(SourceDir)¥xxxxxx¥Src"
      FileNames="AssemblyInfo.vb">
  <Output
      TaskParameter="SourceList"
      ItemName="SourceList" />
</SelectFileList>


として呼び出します。ファイル名はリスト渡しですが1つしか指定しなくても正しくリストとして渡されます。

次回はこれを使ってファイルのバージョンを書き換えるところを残します。
テクニカル日記 | permalink | comments(0) | trackbacks(0)

Canonプリンタのインクあれこれ

我が家のプリンタ「Canon MP830」のインクを買い足ししようとアマゾンを検索。
BCI-7e 4色パックで3,220円。やっぱり高いよね。パックで割安感を出しているけど基本的に1本千円だからやっぱり高い。

Canon インクタンク BCI-7e 4色マルチパック
Canon インクタンク BCI-7e 4色マルチパック
キヤノン

そもそもこのインクの価格はプリンタ本体を安く売りインクで元を取る商売。インクは消耗品なので儲けが大きくなる仕組みなんだけど欧米でこの商売が問題となり低価格インクなんかも扱っている。この低価格インクはインクの量を減らして価格を下げているだけで印刷1枚あたりの単価が高くなるようになっている。あんまり使わない人はコストパフォーマンスは悪いけど販売価格が安いこちらのインクを使ってねと言う商売。
何で消耗品のインクを割高で売ることが問題になったかというと詰め替えインクや再生インク、互換インクなどが低価格で販売することを妨害するようなことをしたから。
BCI-7eシリーズにはICが組み込まれていて偽物カードリッジでは動作しないようになっている。
本体を安く売ってインクを別なところから買われては商売あがったりと言うわけ。
この商売方法はCanonだけでなくHPでもやっているからたちが悪い。だからプリンタ業界そのものに対して欧米ではクレームが付いたというわけである。

でもCanonの肩を持つわけではないけど使用頻度が低い人が再生インクや詰め替えインクを使うとヘッド詰まりが起きてしまうので要注意。私は過去に2台のプリンタを詰め替えインクによるヘッド詰まりで買い換えに追い込まれたことがあります。ヘッドだけ買い換えれば済む話のようだがカードリッジ内のインクが長期放置に耐えられないので買い換えヘッドが即詰まってしまう結末。よってヘッドとインクを全て買い換えをしなければ解決しないのだが、それを行うと新品のプリンタが買えちゃう価格まで行ってしまう...

その経験から高くても純正インクを使用するようになったのだが、やっぱりインクを買うときに捻出しなければならない価格を考えると懐が痛い。

で、最近まで気づかなかったけどBCI-7eシリーズに3色パックとかも出てきてたのね。

キヤノン インクタンク BCI-7e 3色 (C/M/Y) マルチパック BCI-7E/3MP
キヤノン インクタンク BCI-7e 3色 (C/M/Y) マルチパック BCI-7E/3MP
キヤノン

なるほど黒インクはいつも余るのでこれは助かる。今回は黒インクも買わなきゃならないので4色パックにするが、このパックはありがたい。

で、BCI-9BKが入った5色?パックなる物もあるのね。

キヤノン インクタンク BCI-7e 4色 (BK/C/M/Y) +BCI-9BK マルチパック BCI-7E+9/5MP
キヤノン インクタンク BCI-7e 4色 (BK/C/M/Y) +BCI-9BK マルチパック BCI-7E+9/5MP
キヤノン

もっと早くに知っていればそれぞれ個別色のインクを買わずに済んだのに...まぁ〜仕方がないので次回は是非3色パックか5色?パックを買うことにします。

ちなみに写真台紙もCanon純正を使っています。最近はこれですね。

キヤノン写真用紙・光沢 ゴールド L判 400枚 GL-101L400
キヤノン写真用紙・光沢 ゴールド L判 400枚 GL-101L400
キヤノン

これはドライバが純正用紙に向けて補正しているために他社用紙だと発色がいまいちピントこないためです。気にしない方にはどうでも良いことなのですが、ここでも私はCanonにはめられているような気がしてきました...

どうでもいい話ですがCanonはキャノンと書くべきかキヤノンと書くべきかとても悩みます。悩んだあげくCanonで統一して書いています。紛らわしいことしないで社名をキャノンにして欲しい今日この頃です。
日記 | permalink | comments(0) | trackbacks(0)

Team Foundation ビルドでビルド番号を生成する

TFS2008を使い始めて早半年。まだまだ使いこなせいてませんが、今回は自動ビルドでのビルド番号を生成することにチャレンジしてみました。
役に立たないMSDNとインターネット検索で見よう見まねでコツコツと作り上げましたので、忘れないうちにアップしておきます。
何分素人が作成しているので間違いだらけだと思いますが、何をやったのか私自身忘れそうなのでメモとして残します。

まず役立たずのMSDNはこちらです。
方法 : ビルド番号をカスタマイズする

これを読むとターゲットって何?タスクって何?と疑問が次から次へと湧き出てきます。

ターゲットの説明はこちらにあります。
カスタマイズ可能な Team Foundation のビルド ターゲット

ビルドの作業手順がターゲットとして定義されており、その中でもカスタマイズできるターゲットとカスタマイズできないターゲットがあるとのことです。
ビルド番号を生成したいのならばBuildNumberOverrideTargetでやりなさいと言うことです。

続いてタスクですが、ターゲット内で実行されるコマンドのようなことです。

タスクの説明はこちらです。
MSBuild タスク リファレンス

スクリプトのコマンドがいくつか定義されており、これらで何とかせいと言うのがビルド定義のようです。

で、色々調べてビルド番号を保持する方法がわからず、始めはSQL Server上に専用のテーブルを構築し、そこからビルド番号を取得するプログラムを作成して参照するようにしていましたが、MSBuild Community Tasks Projectなるものを知り、そちらで実現させる方法に変更しました。

MSBuild Community Tasks Project

こちらからインストールモジュールをダウンロードしてインストールすればタスクが拡張されます。
<Import Project="$(MSBuildExtensionsPath)¥MSBuildCommunityTasks¥MSBuild.Community.Tasks.Targets" />
と記述すれば利用することができます。

ちなみにターゲットとタスクの関係がある程度理解できてきたら以下の場所に実際にターゲットが定義されているファイルがありますので参照してみると参考になります。
C:¥Program Files¥MSBuild¥Microsoft¥VisualStudio¥TeamBuild¥Microsoft.TeamFoundation.Build.targets

絶対にこのファイルは修正してはいけません。カスタマイズはビルドプロジェクトファイルで行ってください。
でもMSDNの説明ではどうやって使って良いのかわからないタスクなど、パラメータの設定方法など参考になることが沢山あります。

変数関係も私としてはとてもあやふやな状態です。
変数と言うよりパラメータと呼んだ方が良いようですが、<PropertyGroup>で定義するようです。これはターゲットの外で定義しても中で定義しても良いようですが、おそらくスコープは違うでしょう。
使い方は<名前>値</名前>が原則です。これを参照する場合は$(名前)となります。但し、このパターンは単一の値しか持たない変数です。リストと言うか配列として値を持つ場合には

<名前 Include="値"/>
<名前 Include="値"/>
<名前 Include="値"/>

と同じ名前で入れたい値を続けて指定します。この場合、指定する値はIncludeで指定します。これにより指定した値がリストとして積み上がります。
また、値のところにワイルドカードを指定するとファイルのリストが格納されます。
このリストを参照するのは@(値)となります。

さて、本題のビルド番号ですが、以下がそのコードです。
チームプロジェクトのルートにVersion.txtを配置します。このテキストの内容は「1.0.0.0」などとしておきます。
VersionタスクでBuildTypeにIncrementを指定することにより$(Build)にVersion.txtから1加えた値が返ってきます。またVersion.txtも「1.0.1.0」に変更されます。
VersionタスクでVersion.txtが変更されるので、その前にCheckoutしています。これをしておかないとGet直前は読み取り専用となっているのでエラーになります。
またBuildNumberOverrideTargetではまだソースコードを取得していません。よって、本来ならばGetしたときに作られているディレクトリをこのタイミングで作成し、Version.txtだけをGetしています。
Versionタスクを実行した後は忘れずにCheckinしておきましょう。

ビルド番号で重要なのが$(BuildNumber)です。ビルドする上でのビルド番号をこの変数に格納しておきます。この変数の値がそのまま出力先のフォルダ名になるので注意しましょう。
始めは$(BuildNumber)に数値だけのビルド番号を格納し、UpdateBuildNumberDropLocationタスクで出力先を変更すれば...と思っていたのですが、ビルドが終わった後のCopyタスクでは$(BuildNumber)を使って出力先フォルダを指定しているので何の意味もありませんでした。
よって$(BuildNumber)には出力先フォルダ名を指定するようにします。私の場合はどうしてもフォルダ名に日付が欲しかったのでTimeタスクから現在の日付を取得して日付付きのフォルダ名を生成するようにしています。

とりあえず今回はビルド番号を取得するまでのお話しです。次回はこのビルド番号をAssemblyVersionやAssemblyFileVersionに反映させる方法を説明したいと思います。

<PropertyGroup>
  <TF>&quot;$(TeamBuildRefPath)¥..¥tf.exe&quot;</TF>
  <SourceDir>$(SolutionRoot)</SourceDir>
</PropertyGroup>

<Import Project="$(MSBuildExtensionsPath)¥MSBuildCommunityTasks¥MSBuild.Community.Tasks.Targets" />
<Target Name="BuildNumberOverrideTarget">

  <Time>
    <Output TaskParameter="Month" PropertyName="Month" />
    <Output TaskParameter="Day" PropertyName="Day" />
    <Output TaskParameter="Year" PropertyName="Year" />
    <Output TaskParameter="Hour" PropertyName="Hour" />
    <Output TaskParameter="Minute" PropertyName="Minute" />
    <Output TaskParameter="Second" PropertyName="Second" />
  </Time>

  <Exec Command="MKDIR $(SourceDir)" Condition="!Exists('$(SourceDir)')" />
  <Exec WorkingDirectory="$(SourceDir)"
      Command="$(TF) get Version.txt /all"/>

  <Exec WorkingDirectory="$(SourceDir)"
    Command="$(TF) checkout Version.txt"/>

  <Version VersionFile="$(SourceDir)¥Version.txt" RevisionType="None" BuildType="Increment">
    <Output TaskParameter="Major" PropertyName="Major" />
    <Output TaskParameter="Minor" PropertyName="Minor" />
    <Output TaskParameter="Build" PropertyName="Build" />
    <Output TaskParameter="Revision" PropertyName="Revision" />
  </Version>

  <Exec WorkingDirectory="$(SourceDir)"
    Command="$(TF) checkin /comment:&quot;Daily-Build: Version Update ($(Major).$(Minor).$(Build).$(Revision)) &quot; /noprompt /override:&quot;Daily-Build: Version Update&quot; Version.txt"/>

  <CreateProperty Value="$(BuildDefinition)_$(Year).$(Month).$(Day)($(Major).$(Minor).$(Build).$(Revision))">
    <Output TaskParameter="Value" PropertyName="BuildNumber" />
  </CreateProperty>

</Target>
テクニカル日記 | permalink | comments(0) | trackbacks(0)

TFSで他人のチェックアウトを取り消す方法

TFSの自動ビルドでチェックアウト/チェックインのテストをしていたところ、チェックアウトしたところでエラーとなりチェックアウト状態で保留になってしまいました。
まだTFSをそんなに勉強していない私には他人がチェックアウトしたファイルを取り消す方法など知らず、色々と調べていくつものコマンドをたたきまくった結果、何とかチェックアウトを取り消す事ができたのでメモしておきます。

まず、相手のファイルの位置を知るために次のコマンドを実行します。ワークスペース名はTFSのソース管理でそのファイルのプロパティを開けば判明します。
tf status Version.txt /workspace:aaaaaa /user:bbbbbb

aaaaaaはワークスペース名、bbbbbbはユーザ名を指定します。
これでファイルの在処がわかったので、次にUndoでチェックアウトを取り消します。
tf undo /workspace:aaaaaa;bbbbbb cccccc

aaaaaaはワークスペース名、bbbbbbはユーザ名、ccccccはローカルのファイル名です。
ローカルのファイル名はパスを省略する書き方などあるようですが、自動ビルドではどのようになっているのかいまいち良くわからないので、ここは気持ちよくフルパスで指定してあげるとチェックアウトがキャンセルされます。

できればTFSのソース管理で右クリックメニューにチェックアウトを強制キャンセルするコマンドが出てくれれば嬉しいのですが、残念ながらコマンドを入力しなければ解決できないようです。

とりうえず、ここまで書けば次回は困らないかな...
テクニカル日記 | permalink | comments(0) | trackbacks(0)

ブログ内の右サイトを整理

なんだか最近ブログの右側がごちゃごちゃしてきて気になっていました。
色々と評価するために貼り付けていましたが、その評価の結果も良くわからない状況です。
よって今回バッサリと削除することにしました。

以下が今回削除したパーツ達です。




ネットでラクラクチケット予約購入、e席リザーブでシックスワンダフリー












日記 | permalink | comments(0) | trackbacks(0)

楽天で激安DVD-Rをみつけた!!

我が家のDVD-Rの在庫が無くなってきたので安いDVD-Rが無いか探していたら楽天に激安DVD-Rがありました。
何が激安って送料無料なんですよこれが。北海道在住の我が家としてはありがたい限りです。

【取寄品:5営業日程度にて発送】【送料無料】[三菱化学メディア]録画用DVD-R(120分/1-8倍速対...
日記 | permalink | comments(0) | trackbacks(0)

激安のCAT6対応LANケーブルを見つけたのだが...

LANケーブルが無くなったので新たにLANケーブルを購入しようと色々と調べていたらカテゴリ6で100mケーブルが6千円を切っていたので驚きました。

エレコム EU RoHS指令準拠 CAT6対応 LANケーブル 100m/リール巻(ライトグレー) LD-CT6/LG100/RS
エレコム EU RoHS指令準拠 CAT6対応 LANケーブル 100m/リール巻(ライトグレー) LD-CT6/LG100/RS
エレコム

ケーブルだけでは使えないので玉も探しましたが、カテゴリ6対応の玉って高いんですね。でも何が違うんだろう???とりあえずCAT5Eで100個入っている物にしてみます。

ELECOM LD-RJ45TY100 CAT5E対応RJ45コネクタ(ヨリ線仕様)
ELECOM LD-RJ45TY100 CAT5E対応RJ45コネクタ(ヨリ線仕様)
エレコム

この組み合わせでギガLANに対応できるのかが良くわかりませんが、とりあえずHUBはギガ対応にしておきます。

corega CG-SW08GTX 8ポート Giga スイッチングハブ パワーコントロール機能 RoHS CG-SW08GTX
corega CG-SW08GTX 8ポート Giga スイッチングハブ パワーコントロール機能 RoHS CG-SW08GTX

問題なのはケーブル職人としての私の腕ような気がしますが...これでギガが出れば嬉しいな。でもどうやってギガ出ているか計測すれば良いんだろう???
日記 | permalink | comments(0) | trackbacks(0)

札幌の「ラーメン二郎」

私は札幌在住のジロリアンです。東京に住んだことはありませんが出張で東京に行くたびに二郎巡りをしていました。三田の本店には何度行ったかわかりません。一番のお気に入りは神保町です。相撲二郎もチャレンジしました。関内のつゆなしも食べました。

最近は東京に出張することもなくなり二郎の禁断症状が出始めていたところです。

そんな中、とあるブログで二郎チックなラーメンを出すところが琴似にあると知り意気揚々と行ってきました。

ラーメン屋の名前は「らーめん てら」です。「てつや」で修行していた主人がやっているとあるサイトに載っていました。東京に居たときに「ラーメン二郎」を食べていたとのことで、それを何とか再現してみたかったとブログにはありました。

では早速、「てら」の紹介です。

らーめん てら

琴似駅のすぐ近く、コジマ電気から高架を挟んで反対側にあります。メニューには「二郎」の文字はどこにもありません。

「らーめん てら」のメニュー

「極太にんにく醤油」が二郎チックなラーメンです。極太麵につきゆで時間に10分ほどかかりますとの注意書きもありました。

「らーめん てら」の二郎風ラーメン

この写真は大盛りです。「やさいましまし」とか頼もうかと思いましたが、バイトと主人が見分けられなかったので今回は諦めました。ちなみに二郎のように野菜だけを大量にゆでていないので多分「ましまし」などのトッピングは無理でしょう。

味は懐かしい二郎でした。食べはじめは二郎であることに感動を覚えます。ちょっとからくち(濃いめ)のスープは目黒に似ています。でも食べ続けたときの後味が二郎とは違うんですよね。残念です。でも二郎の禁断症状は止まりましたので体は二郎と認定したのでしょう。禁断症状を止めたい方は是非お試しあれ。

ちなみに、二郎の経験が無い方は検索するとジロリアンによる二郎情報が豊富に出てきます。東京に行ったときにでもチャレンジしてみてください。初心者には新橋をお薦めします。軽くてあっさりしています。二郎の中では一番食べやすいでしょう。でも二郎通になれば物足りない二郎君です。
一番のお勧めはやっぱり神保町でしょう。そのかわり1時間待ちは覚悟してください。夜遅くにしか行けない場合は歌舞伎町がベストです。でも野菜が他の二郎より物足りなさを感じます。
出張で品川に泊まるのであれば北品川が行きやすくて平均的な二郎が食べられます。北品川ですが品川から歩いて行くことが可能です。

私に財力と体力があれば三田本店か神保町に修行に行き札幌で二郎を開店したいぐらい二郎好きです。北大近くでオープンして腹ぺこ学生相手に奮闘できればな〜と夢見ています。二郎は自分で製麺しなければ二郎の看板を出すことができません。そんなこんなでそう簡単には二郎の看板は出せないのですが札幌での知名度が低いのでどこまで成功できるやら...いや夢ですから...
日記 | permalink | comments(0) | trackbacks(0)

名前付きパイプによるWCFでのコネクションプール

WCFを使ったアプリケーションのテストをしていて名前付きパイプのバインドにはコネクションプールがあるようなのでテストしてみた。

ちなみにバインドはカスタムにしています。これは名前付きパイプを直接バインド指定すると余計なバインドが付いて初回のコネクションが遅くなります。カスタムにしてバイナリメッセージと名前付きパイプを指定することにより初回起動の遅さは解消できます。

で、コネクションプールの話に戻りますが、namedPipeTransportにconnectionPoolSettingsがあります。このidleTimeoutでプールする時間を指定します。単位は何なんでしょうね。TimeSpanなので100nsなんでしょうか...でも見た目はミリ秒ぽいです。この例は既定値の値を表しています。多分2秒なんだと思っていますが違いますかね。


<bindings>
  <customBinding>
    <binding name="TEST">
      <binaryMessageEncoding />
      <namedPipeTransport>
        <connectionPoolSettings idleTimeout="00:02:00" />
      </namedPipeTransport>
    </binding>
  </customBinding>
</bindings>



クライアントを生成、呼び出し、クローズをfor文で繰り返した場合、既定値とidleTimeoutをゼロにした場合では明らかに速度が違います。プールされていると言うことでしょう。
この値を大きくすれば「つなぎっぱ」が可能と言うことになるのでしょうが、maxOutboundConnectionsPerEndpointで同時接続数が設定されています。既定値は10になっています。接続数が設定値を超えると接続が空くまで待たされます。接続する相手が不特定多数の場合はコネクションプールの設定は慎重にした方が良いでしょう。
テクニカル日記 | permalink | comments(0) | trackbacks(0)


ブログ内検索:

サイト検索:





スカウター : Jumboのブログ!