2012年1月30日月曜日

Blogger でタイトル一覧を表示する方法

このブログをカスタマイズする際に、ラベルでタイトル一覧を出したいなぁと夢想し、早速 Google 先生に聞いてみたところ、下記サイトを紹介してくれた。








やってみるも、表示されず。。。さらに調べてみると、埋め込むコードの位置を <b:includable id='main' var='top'> の後にするといいという記述を見つけてやってみると表示された。しかしこのままでは、「前の投稿」「次の投稿」でもタイトル一覧が表示されてしまう。そりゃ判定文が、URL で判定してたらそうなるわな。で、代替えになる判定材料を Layouts Data Tags - Globally Available Data で調べてみると、ふむふむ、ちょっと力技だけどタイトルの比較でいけそう!ってことが判明。早速、試してみるといい感じで表示される。




以下、作り方の手順を記す


テンプレートのHTMLの編集ボタンをクリック


ウィジェットのテンプレートの展開をチェック


<b:includable id='main' var='top'> を検索し、その下に下記コードを貼付ける



<!-- ADD -->
<b:if cond='data:blog.pageType != &quot;item&quot;'>
<b:if cond='data:blog.title != data:blog.pageTitle'>
<ul id='post-title-navigation'>
<span>このページの記事一覧</span>
<b:loop values='data:posts' var='post'>
    <li>
    <b:if cond='data:post.title'>
      <a expr:href='&quot;#&quot; + data:post.id'><data:post.title/></a>
    <b:else/>
      <a expr:href='&quot;#&quot; + data:post.id'><data:post.id/></a>
    </b:if>
    </li>
</b:loop>
</ul>
</b:if>
</b:if>




Google Chart で QR コードを作ろう

QR コードを作りたかったら、Google Chart を使うと簡単に出来ますよっていうお話。


使い方をググってみても、URL(API) を手打ちで頑張っている人が結構いるようで、そんなことしなくても簡単に作れる Wizard が用意されています。


Google Chart Tools Chart Wizard





  1. Editor タブを選ぶ。
  2. Chart Type を QrCode に。
  3. Options for QR Code を Shift_JISにしたほうが良さげ(UTF-8だと携帯で見たら文字化けした)。Text が多い場合は「H」がいいかもね。







あとは適当に入力したら、結果 Image と Link 文字列/タグ文字列が生成されるので、それを使って HP に埋め込むもよし。名刺に使うのもよし。



名刺

まったく気にしていなかったけどよく、よく考えると名刺作ってない!!!


お客様との手続きで、作業開始が確定してないけど、早くて2月1日。つまり明後日。焦るわぁ。


焦ったらとりあえず Google 先生に質問。ふむふむ。自作だとデザイナーじゃない分、素人感が出るし、年月で色あせたり水でにじんだりしちゃうから作ってもらった方がいいのね。承知しました(三田さん風)。


ネットで注文出来るところを探してみたら VistaPrint ってところが有名よさげ。レイアウトを決めて、必要項目を入力し、QR コードを作って完成!ん?アップロードした QR コードがピンぼけしてるけど大丈夫かなぁ。と思いつつ手続きを進めていって気づいたけど、送料が意外と高い!そして2月1日に間に合わない。



 スロー: 約21日間 - ¥859
 スタンダード: 約14日間 - ¥1,590
 プライオリティー: 約7日間 - ¥1,873
 エクスプレス+: 3営業日 - ¥2,918


なんで支払いにくるまで期間と送料がわからないようになってるんだろう。1時間返せ!と思いつつ、ほかをあたってみる。


はんこ屋さんとかでも名刺印刷やってるっぽいから明日朝一で電話してみるか。




-----
2012/02/01 追記
はんこ屋さんとか写真屋さんに注文しても値段の総額があまり変わらなそうだったので、VistaPrint で発注することにした。

自宅用マシンをどうするか...

.NET エンジニアとはいっても、自宅ではMac ユーザだったりする。


退職した事により Windows が触れなくなってしまい、はて、どうしたものか。


.NET 限定であれば MONO でしばらくやり過ごすという手もあるが、確定申告用のソフトの購入とかを考えると、やはり Windows であったほうが何かと便利。


OS だけ買って bootcamp で Mac に Windows を入れる方法もある。(何気に性能は良かったりする)


これで2、3万。


PC を買うとなるとそれなりのスペックが必要なので、安くて7、8万。


5ヶ月くらい無給になるので、出費はなるべく押さえたいところなんだけど。


Office とか Visual Studio とかも考えると頭をかかえる。

2012年1月29日日曜日

[C#]ConcurrentDictionaryをDictionaryのように扱う

マルチスレッドな処理系アプリケーションで、Dictionary クラスを使う際は毎度排他ロックをかけていて面倒だと感じていましたが、.NET Framework 4.0 から ConcurrentDictionary クラスなるものが登場し、その煩わしさが解消されました。

このクラスは追加や削除時は自動で排他制御を行ってくれるという優れもの(性能面ではそうとはいえないけれども。。。)なのです。

使い方は下記に詳しいが、簡単に言うと Dictionary クラスとは別物なので使い方が変わってしまっているのです。

■方法: ConcurrentDictionary の項目を追加および削除する
http://msdn.microsoft.com/ja-jp/library/dd997369.aspx

きっと使い勝手はよくなっているとは思うのですが、従来の Dictionary と同じように扱いたいという場合は、なんてことない。IDictionary でインスタンスを受け取るようにすればよさそうです。

            IDictionary dictionary = new ConcurrentDictionary();

どこにもそんなやり方書かれてないので、正しいかどうかは不明ですが(使う場合は自己責任でお願いします)、色々試してみたところ、いちお、排他制御はかかっているみたい。

[ASP.NET]ルートからの相対位置取得

        public static bool InitializeApplication(HttpServerUtility Server)
        {

            // ルートディレクトリパス取得
            Uri root = new Uri(Server.MapPath("."));

            // ルートから相対位置のパス取得
            Uri path = new Uri(root, "../hogehoge");

        }




[C#]インスタンスをXML文字列化

インスタンスをXML文字列に変換したり、XML文字列からインスタンスを復元したりしてみます。

    var serializer = new XmlSerializer(typeof(Entity));

    // インスタンス生成
    var entity1 = new Entity();
    entity1.Data1 = 2;
    entity1.Data2 = 3;

    // インスタンスをXML文字列に変換
    var stringWriter = new StringWriter();
    serializer.Serialize(stringWriter, entity1);
    string entityString = stringWriter.ToString();

    Console.WriteLine(entityString);
    // WRITE:
    // <!--?xml version="1.0" encoding="utf-16"?-->
    // <entity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    //   <data1>2</data1>
    //   <data2>3</data2>
    // </entity>


    // XML文字列からインスタンスを復元
    TextReader reader = new StringReader(entityString);

    Entity entity2 = (Entity)serializer.Deserialize(reader);


    [Serializable]
    public class Entity
    {
        public int Data1 { get; set; }
        public int Data2 { get; set; }
    }



[C#]ビット配列とかバイト配列とか

    byte[] source = { 0x00, 0x01, 0x02, 0x04 };
    byte[] destination = { 0x00, 0x01, 0x02 };

    // ビット配列に変換
    var sourceBit = new BitArray(source);
    var destinationBit = new BitArray(destination);

    // 差分をとってみる
    var differenceBit = sourceBit.Xor(destinationBit);

    // ビット配列をバイト配列に変換する
    byte[] difference = new byte[source.Length];
    differenceBit.CopyTo(difference, 0);

関連

[C#]int型配列->string配列->CSV形式に変換


            // int型の配列
            int[] intArray = { 1, 2, 3, 4, 5, 6 };


            // string型の配列に変換
            string[] stringArray = Array.ConvertAll(intArray, delegate(int value)
            {
                return value.ToString();
            });

            // 配列をCSV文字列に変換
            string csvString = string.Join(",", stringArray); 

[C#]配列の比較

これも Enumerable クラスで出来ます。(またLinq)


            string[] first = { "aaa", "bbb", "ccc" };
            string[] second = { "aaa", "bbb", "ccc" };
            Console.WriteLine(Enumerable.SequenceEqual(first, second));

[C#]配列の結合

Enumerable クラスを使えば簡単に出来ます。

            byte[] source = { 0x00, 0x01, 0x02, 0x04};
            byte[] destination = { 0x00, 0x01, 0x02 };

            byte[] result = Enumerable.Concat(source, destination).ToArray();

関連

[C#]二重起動抑止

の覚書。
using System.Diagnostics;

            // アプリケーションのプロセス名を取得
            string thisProcessName = Process.GetCurrentProcess().ProcessName;

            // すでに起動している場合
            if (Process.GetProcessesByName(thisProcessName).Length > 1)
            {
                // アプリケーションを終了する
                return;
            }

[C#]配列の初期化

例えば1000コの配列の初期値を全て同じ値で初期化したい場合、
FOR 文でぐるぐる回して設定するなんて美しくない!!!と思いますよね(笑)
NET Framework 3.5で追加された Linq を使えばシンプルに出来ます。
↓こんな感じです。

    // 1000要素の配列を0xFF初期化
    byte[] byteArray = Enumerable.Repeat<byte>(0xFF, 1000).ToArray();


関連

2012年1月28日土曜日

[ASP.NET]最も簡単にListViewで行の任意の位置をクリックで行選択する

テーブルの行選択は意外と難しい。

色々試行錯誤した結果、↓こうするのが一番シンプルと思われる。
  • ItemTemplate内に隠し選択ボタンを用意する
  • TRタグのonclickに隠し選択ボタンでポストバックさせるスクリプトを設定する

実際のコードで見てみると↓こんな感じ。


Default.aspx
<ItemTemplate>
    <tr onclick="<%# GetRowClickScript(Container) %>">
        <td style="display:none;">
            <asp:Button ID="SelectButton" runat="server" CommandName="Select" Text="選択"/>
        </td>
Containerを渡すのがポイント。
ButtonはLinkButtonでも可。


Default.aspx.cs
        /// 
        /// 行クリックスクリプト取得
        /// 
        /// ListViewItem
        /// 選択ボタンクリックスクリプト
        public string GetRowClickScript(object container)
        {
            ListViewItem item = (ListViewItem)container;
            Control button = item.FindControl("SelectButton");
            return Page.ClientScript.GetPostBackEventReference(button, "");
        }
これより簡単に出来る方法があれば、是非ご教授願いたい。