Hatena::ブログ(Diary)

猫とC#について書くmatarilloの雑記 RSSフィード

 

2012年02月06日

100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊

| 100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊を含むブックマーク 100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊のブックマークコメント

翔泳社より発行される『100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊』という本で1冊選んで書きました。

100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊

100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊

私が選んだのは『Weaving the Web: The Original Design and Ultimate Destiny of the World Wide Web』です。

Weaving the Web: The Original Design and Ultimate Destiny of the World Wide Web

Weaving the Web: The Original Design and Ultimate Destiny of the World Wide Web

  • 作者: Tim Berners-Lee
  • 出版社/メーカー: HarperBusiness
  • 発売日: 2000/11/07
  • メディア: ペーパーバック

原稿を公開してよいとのことだったので、matarillo.comで公開します。

matarillo.com: 100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊

仕事でWebアプリケーションを開発している、後輩のWindows技術者に勧めたい

アーキテクチャ重要性を再認識英語で読んでね。

英語の本でごめんなさい。「Webの創成」という題で日本語訳されているんですが、そちらは入手困難ということもあり、勉強になるかなと思って原著をあえて選びました。でも難しい本ではないから心配しないでいいです。……

matarillo.com: 100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊

なお、この本はDevelopers Summit 2012の会場で先行発売されるとのことです。

トラックバック - http://d.hatena.ne.jp/matarillo/20120206

2012年02月01日

猫はハロゲンヒーターで丸くなる

| 猫はハロゲンヒーターで丸くなるを含むブックマーク 猫はハロゲンヒーターで丸くなるのブックマークコメント

久しぶりに猫写真

DSC_0651

点けてると絶対にやってくるウナ。

トラックバック - http://d.hatena.ne.jp/matarillo/20120201

2012年01月11日

VS2010のクライアントプロファイルに5分でサヨナラ

| VS2010のクライアントプロファイルに5分でサヨナラを含むブックマーク VS2010のクライアントプロファイルに5分でサヨナラのブックマークコメント

元記事:C#, VISUAL STUDIO 2010, NO MORE CLIENT PROFILE IN 5MINUTES.

手順1 – Visual Studioに同梱されているプロジェクトテンプレートを見つける

64ビット日本語OSの人は
%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplates\CSharp\Windows\1041
32ビット日本語OSの人は
%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplates\CSharp\Windows\1041

手順2 – VSのテンプレートファイル編集

ConsoleApplication.zipを好きな場所に展開して、含まれているcsConsoleApplication.vstemplateファイルの名前を変更する。たとえば、csConsoleApplication-NoClientProfile.vstemplateなど。

そのファイルをテキストエディタで開いて以下の部分を修正する。

  • <Name>タグの中身を自分が分かる内容で上書き。
  • <Description>タグの中身を自分が分かる内容で上書き。
  • <TemplateId>タグは削除。

手順3 - C#のプロジェクトファイルを編集

consoleapplication.csprojファイルをテキストエディタで開いて以下の部分を修正する。

オリジナル

$if$ ($targetframeworkversion$ >= 4.0)
  <TargetFrameworkProfile>Client</TargetFrameworkProfile>
$endif$

修正後

$if$ ($targetframeworkversion$ >= 4.0)
  <TargetFrameworkProfile></TargetFrameworkProfile>
$endif$

要するに、<TargetFrameworkProfile>タグの中身を空にする。

手順4 - ZIPで固めて配置

先ほどのフォルダを ConsoleApplication-NoClientProfile.zip などの名前で圧縮。ZIPアーカイブにフォルダ自身が含まれないようにすること。

圧縮できたら、ユーザーディレクトリに配置する。

%USERPROFILE%\Documents\Visual Studio 2010\Templates\ProjectTemplates\Visual C#\

トラックバック - http://d.hatena.ne.jp/matarillo/20120111

2011年10月01日

Google Code Jam Japan 2011 練習問題A

| Google Code Jam Japan 2011 練習問題Aを含むブックマーク Google Code Jam Japan 2011 練習問題Aのブックマークコメント

練習問題なら公開してもいいだろう。


問題はこちら。flipflopみたいなSnapperを数珠つなぎした時の出力を求める問題。


問題のサイズを見ると、Largeで1 ≤ N ≤ 30、0 ≤ K ≤ 10^8 なので、O(N * K)なアルゴリズムだと時間がかかってしまう。

そこで頭を使って問題を変換しないといけない。

この手合いであればビット演算でいけるんじゃないかなと予想を立てる。Nは最大で30なので、Nビット整数であればint32に収まる。


というわけで、N=4として、Kを増やしていった時の状態をビット列として書いてみる。

Snapperの状態としては、スイッチon/offと通電のon/pffがある。そして、i回目のスイッチ状態は、i-1回目のスイッチ状態と通電状態で決まる(xorになる)。

Kスイッチ通電
000000001
100010011
200100001
300110111
401000001

というわけで、スイッチ状態のビット列はKの2進表記となる(数学的な証明は省略する)。さあ、これで答えを出力するのにK回ループする必要がなくなった。

通電状態はどうなるかというと、スイッチ状態がONのSnapperが連続していた場合はその次のSnapperまで通電するから、N回ループする中で連続する1の数を数えてもいい(Nは最大で30なので大したコストではない)。

ただ、この手のビット演算には定石があって、スイッチ状態のビット列に1を足したものと元のビット列とのxorを取ると、通電状態のビット列が求められる。

いくつかのビットパターンで試してみよう。

s0000
s+10001
(xor)0001
s0110
s+10111
(xor)0001
s0100111
s+10101000
(xor)0001111

つまり、1を足すと、最初に0が出てくるところまでのビットが反転するから、xorをとると反転しなかったビットが0になるというわけ。

using System;

class Program
{
    static void Main(string[] args)
    {
        var head = Console.ReadLine();
        var testCount = int.Parse(head);
        for (var i = 0; i < testCount; i++)
        {
            var line = Console.ReadLine().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            var n = int.Parse(line[0]);
            var k = int.Parse(line[1]);
            var result = Solve(n, k);
            Console.WriteLine("Case #{0}: {1}", i + 1, result ? "ON" : "OFF");
        }
    }

    private static bool Solve(int n, int k)
    {
        int p = k ^ (k + 1);
        return (p >> n) % 2 == 1;
    }
}
トラックバック - http://d.hatena.ne.jp/matarillo/20111001

2011年08月29日

WEB+DB PRESS Vol.64

| WEB+DB PRESS Vol.64を含むブックマーク WEB+DB PRESS Vol.64のブックマークコメント

出ました。

http://gihyo.jp/magazine/wdpress/archive/2011/vol64

WEB+DB PRESS Vol.64|gihyo.jp … 技術評論社

小野さんの連載『いまどきの.NET開発』、今回はLINQです。

また、今号の特集はどれも読みごたえがありますね。

  1. プログラマが知るべきUIデザインの基本知識
  2. JavaScript最前線
  3. 作って学ぶ日本語入力

WEB+DB PRESSは、だんだんスマートフォンクラウドな記事が多くなってくる感じですね。

トラックバック - http://d.hatena.ne.jp/matarillo/20110829

2011年08月27日

2011/8/23 たけしのコマ大数学科の問題をインラインSVG+JavaScriptで

| 2011/8/23 たけしのコマ大数学科の問題をインラインSVG+JavaScriptでを含むブックマーク 2011/8/23 たけしのコマ大数学科の問題をインラインSVG+JavaScriptでのブックマークコメント

こないだの『たけしのコマ大数学科』はこんな問題だった。

3つの車輪がそれぞれ異なるサイズと速さで回転する観覧車
1番小さい車輪に乗った乗客の軌跡を描け。

  • 車輪Aは反時計回り
  • 車輪Bは車輪Aの7倍の速さで反時計回り
  • 車輪Cは車輪Aの17倍の速さで時計回り
  • 車輪Bは車輪Aの半分の半径
  • 車輪Cは車輪Aの3分の1の半径
自戒を込めた雑記のようなもの - 軌跡の問題

面白かったので、インラインSVGとJavaScriptでアニメーション化してみた。→ http://jsdo.it/matarillo/lDCF

forked: 2011-08-23 koma-univ - jsdo.it - share JavaScript, HTML5 and CSS

けっこう小気味良く動くもんだね。

トラックバック - http://d.hatena.ne.jp/matarillo/20110827

2011年08月05日

夏の黒猫

| 夏の黒猫を含むブックマーク 夏の黒猫のブックマークコメント

黒猫はオートフォーカスや自動露出に向かないと思う。機械任せだとうまくとれないことが多い。

なので今日iPhoneカメラ撮影(Instagram)。

http://instagr.am/p/JZojO/?ref=nf

http://instagr.am/p/JZo_C/?ref=nf

http://instagr.am/p/JZpRS/?ref=nf

トラックバック - http://d.hatena.ne.jp/matarillo/20110805

2011年07月13日

RubyやPythonやScalaやHaskellやC#やF#のリスト(シーケンス)用高階関数

| RubyやPythonやScalaやHaskellやC#やF#のリスト(シーケンス)用高階関数を含むブックマーク RubyやPythonやScalaやHaskellやC#やF#のリスト(シーケンス)用高階関数のブックマークコメント

filter/map/reduceなアレです。

言語ライブラリによって名前が違ったりするので、NyaRuRuさんの対応表ベースにしてたたき台を作っておいたのですが、ちょっとずつ記述が増えてきました。

リスト(シーケンス)用高階関数対応表(Google Spreadsheet)

対応】が意味するところがあいまいだったり、記述がまちまちだったりするところがありますが、まあ気づいた人がうまく修正してくれればと思います。

トラックバック - http://d.hatena.ne.jp/matarillo/20110713

2011年07月11日

Microsoft MVP Award

| Microsoft MVP Awardを含むブックマーク Microsoft MVP Awardのブックマークコメント

今年度も受賞しました。ありがとうございます

昨年度はClient App Devだったんですが、今年はC#に戻ってきました。理由はわからないけど。

JHashimotoJHashimoto 2011/07/13 15:58 MVP受賞おめでとうございます。

matarillomatarillo 2011/07/13 21:42 ありがとうございます。

トラックバック - http://d.hatena.ne.jp/matarillo/20110711

2011年06月17日

WEB+DB PRESSに久しぶりに.NET連載が

| WEB+DB PRESSに久しぶりに.NET連載がを含むブックマーク WEB+DB PRESSに久しぶりに.NET連載がのブックマークコメント

http://gihyo.jp/magazine/wdpress/archive/2011/vol63

WEB+DB PRESS Vol.63|gihyo.jp … 技術評論社

.NET連載と.NET単発記事が載ってます。

.NET連載は尾島&猪股の連名記事(実質尾島が書いてましたが)が載っていた2008年(Vol.43)以来ですね。喜ばしいです。

WEB+DB PRESS10冊買わなきゃ。(そしてアンケートハガキを出そう。)

トラックバック - http://d.hatena.ne.jp/matarillo/20110617

2011年06月05日

covariant method return type

| covariant method return typeを含むブックマーク covariant method return typeのブックマークコメント

ときどきの雑記帖経由。

covariant method return type はあまり知られていない Java の機能です
(JLSの Section 8.4.5を参照してください)。
基本的には、サブクラスでオーバーライドされているときに
メソッドの retrun type を narrow することを Java は許可します。
例をあげましょう:

public class Foo {
}

public class SubFoo extends Foo {
}

public class Bar {
    final Foo foo = new Foo();
    public Foo getFoo() {
        return foo;
    }
}

public class SubBar extends Bar {
    final SubFoo subFoo = new SubFoo();

    @Override
    public SubFoo getFoo() {
        return subFoo;
    }
}

たしかにC#にはない機能。

同じようなことをやる場合はnewキーワードによる隠蔽を使うのが普通なのだけど、次のコードコンパイルできない。

public class Foo {}

public class SubFoo : Foo {}

public class Bar
{
    readonly Foo foo = new Foo();
    public virtual Foo Foo
    {
        get { return foo; }
    }
}

public class SubBar : Bar
{
    readonly SubFoo subFoo = new SubFoo();
    public override Foo Foo
    {
        get { return subFoo; }
    }
    public new SubFoo Foo
    {
        get { return subFoo; }
    }
}

コンパイルできないのは、パブリックプロパティFooが被ってしまうため。

というわけで、インターフェース経由にして、インターフェースの明示的実装を使うしかない。

Foo型を返すプロパティをインターフェース経由にしたければ、こう。

public class Foo {}

public class SubFoo : Foo {}

public interface IBar
{
    Foo Foo { get; }
}

public class Bar : IBar
{
    readonly Foo foo = new Foo();
    public Foo Foo
    {
        get { return foo; }
    }
}

public class SubBar : IBar
{
    readonly SubFoo subFoo = new SubFoo();
    public SubFoo Foo
    {
        get { return subFoo; }
    }
    Foo IBar.Foo
    {
        get { return this.Foo; }
    }
}

SubFoo型を返すプロパティをインターフェース経由にしたければ、こう。

public class Foo {}

public class SubFoo : Foo {}

public interface IBar<T> where T : Foo
{
    T Foo { get; }
}

public class Bar : IBar<Foo>
{
    readonly Foo foo = new Foo();
    public virtual Foo Foo
    {
        get { return foo; }
    }
}

public class SubBar : IBar<SubFoo>
{
    readonly SubFoo subFoo = new SubFoo();
    public override Foo Foo
    {
        get { return ((IBar<SubFoo>)this).Foo; }
    }
    SubFoo IBar<SubFoo>.Foo
    {
        get { return subFoo; }
    }
}

ま、ややこしいです。しかし元記事にも「これが必要となる局面はめったにありません」とあるので、少しくらいややこしくても許容範囲かなと。

使用例としてあげてあるApache Wicket frameworkのような状況なら、1番目のようなインターフェースの使い方でいいでしょう。たぶん。

トラックバック - http://d.hatena.ne.jp/matarillo/20110605

2011年05月07日

C#でfoldr

| C#でfoldrを含むブックマーク C#でfoldrのブックマークコメント

何か間違っている気がするなあ。

  • (追記)戻り値Lazy<T>をやめて、Lazy<T>は引数だけにしてみた。
    • (追記)FoldRightに渡す関数の引数はどっちも遅延評価するようにした。ついでに、Lazy<T>じゃなくてFunc<T>にしてみた。効果は同じ。
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var source = InfiniteLoop();
        var emptyList = Enumerable.Empty<int>();
        var result = source.FoldRight(emptyList, LazyCons);
        var oneToTen = result.Skip(1).Take(10);
        var sum = oneToTen.FoldRight(0, LazyPlus);
        Console.WriteLine(sum); // 55
    }

    static IEnumerable<int> InfiniteLoop()
    {
        for (var i = 0; ; i++)
            yield return i;
    }

    static IEnumerable<T> LazyCons<T>(Func<T> head, Func<IEnumerable<T>> tail)
    {
        yield return head();
        foreach (var element in tail())
            yield return element;
    }

    static int LazyPlus(Func<int> n, Func<int> m)
    {
        return n() + m();
    }
}

public static class EnumerableEx
{
    public static TResult FoldRight<TSource, TResult>(this IEnumerable<TSource> source, TResult seed, Func<Func<TSource>, Func<TResult>, TResult> lazyFunc)
    {
        // ちゃんとDisposeさせるのは面倒なので、今回はやらない。
        return source.GetEnumerator().FoldRight(seed, lazyFunc);
    }

    public static TResult FoldRight<TSource, TResult>(this IEnumerator<TSource> source, TResult seed, Func<Func<TSource>, Func<TResult>, TResult> lazyFunc)
    {
        if (!source.MoveNext())
            return seed;
        var head = source.Current;
        return lazyFunc(() => head, () => source.FoldRight(seed, lazyFunc));
    }
}

ykwyutaykwyuta 2011/05/07 22:58 もはや魔術。。。
InfinityLoopの時点でこういう書き方ができるのがなぜなのかさっぱり。
C#のこういう文法ってどこに書いてあるですか?

matarillomatarillo 2011/05/07 23:40 MSDNにも書いてあるけど読みにくいよね。
岩永さんのサイトがいいんじゃないかな。
http://ufcpp.net/study/csharp/

yield returnについては、これ。
http://ufcpp.net/study/csharp/sp2_iterator.html

ラムダ式については、これ。
http://ufcpp.net/study/csharp/sp3_lambda.html

rst76rst76 2011/05/08 00:07 動かせないので推測なのですけど、これってLazyConsでリストを作ってると思っていいですか?LazyConsの代わりにLazyPlusとかやれば和が求まる?
せっかくmatarilloさんが関数型に転向しつつあるのに(?)、こちらは仕様漏れ対応とかでExcel、Wordを相手に連休を潰してます。orz
ちなみにHaskellチュートリアルとしては↓もおすすめです。
http://learnyouahaskell.com/chapters

matarillomatarillo 2011/05/08 01:54 そのつもりなんだけど、いろいろ触ってると動きが微妙なときがあるなあ。
(無限リストにLazyConsを食わせた無限リストをdropしてtakeして得られた有限リスト)にLazyPlusを食わせたら、合計値がおかしくなった。
普通の有限リストにLazyPlusを食わせたときはちゃんと合計が出てくるんだけど。

Haskellチュートリアルありがとう。わかりやすそうですね。

matarillomatarillo 2011/05/08 02:04 Lazy<T>は引数だけにしてみたら、上コメントの問題は解決したっぽい。

ykwyutaykwyuta 2011/05/10 01:57 なるほど。ありがとうございます
岩永さんのサイトはたまに見てました。
MSDNよりは分かりやすいに違いないのでまずはこっちを読んでみます

2011年05月02日

リア充へ2つの道、あるいは、レッド・グリーン・リファクタリング

| リア充へ2つの道、あるいは、レッド・グリーン・リファクタリングを含むブックマーク リア充へ2つの道、あるいは、レッド・グリーン・リファクタリングのブックマークコメント

MS砂金さんのスライドを見て、さらっと書いた。

http://inomata.lolipop.jp/images/tdd.png

TDD界で何かイベントがあった時に使おう。そうしよう。

トラックバック - http://d.hatena.ne.jp/matarillo/20110502

2011年04月30日

あだあだ 2011/10/26 01:27 今日始めて知った。
既にダウンロードしてあってそのPCのみで開発ができる諸兄はひと安心、で終わってしまった問題なのだろう。
だが、私のように客先に出向き、必要なツールを毎度その場で揃えるような商売だと致命的だ。
Lutzにだったら喜んで払った。もちろんだ。
今までさんざんお世話になった。ありがとう。今後の活躍も応援している。それはもう、問題なく心置きなく払える。
だが、Red Gateは買い取っただけだ。しかも、直後のLutzの発言からするに、無償のまま提供すると嘯いて買い上げ、手のひらを返したわけだ。
Reflectorの火を絶やしてしまわないために?今後のより良い製品の開発のために?商品を提供し対価を得ると言う健全な企業活動?
あまりにも白々しい言葉だ。
Red Gateがなにも開発していないとは言わない。現行バージョンの機能のいくつかはLutzのみの開発では届かなかった領域なのだろう。
だがやはり、Red Gateのやり方は批判を受けるに余りあるものだ。
私はこれからもずっと、Red Gateを批判し、憎み続けるだろう。
そして、Lutzと、Reflectorを愛し、応援し続けるだろう。

matarillomatarillo 2011/10/26 08:40 ブックマークコメントにも書いたけど、RedGateは言い訳してるだけだよね。

2011年04月10日

WindowsのHTTP Server API 2.0、あるいは、多様性は善

| WindowsのHTTP Server API 2.0、あるいは、多様性は善を含むブックマーク WindowsのHTTP Server API 2.0、あるいは、多様性は善のブックマークコメント

HTTP Server APIを一言で言うと、IISが利用しているWindows API。Windows Server 2008とWindows VistaではそのAPIが強化されていて、バージョン2.0となっている。

TechNetのまとめ
http://technet.microsoft.com/ja-jp/library/bb726965.aspx
小山圭介さんの記事
http://keicode.com/windows/nw04.php
What's New for HTTP Server Version 2.0 API
http://msdn.microsoft.com/en-us/library/aa364707.aspx
Using the HTTP Server Version 2.0 API
http://msdn.microsoft.com/en-us/library/aa364703.aspx

で、それを使ったartonさんのおもちゃ

https://github.com/arton/ennou

世の中には「ひとつOSはすべてを統べ」みたいに言う人もいるけれど(ガセーさんとか)、こういうおもちゃは大事だと思う。多様性は善、ですよね。;-)