General |
![]()
翔泳社より発行される『100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊』という本で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
原稿を公開してよいとのことだったので、matarillo.comで公開します。
matarillo.com: 100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
仕事でWebアプリケーションを開発している、後輩のWindows系技術者に勧めたい
アーキテクチャの重要性を再認識。英語で読んでね。
英語の本でごめんなさい。「Webの創成」という題で日本語訳されているんですが、そちらは入手困難ということもあり、勉強になるかなと思って原著をあえて選びました。でも難しい本ではないから心配しないでいいです。……
matarillo.com: 100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
なお、この本はDevelopers Summit 2012の会場で先行発売されるとのことです。
C# |
![]()
元記事:C#, VISUAL STUDIO 2010, NO MORE CLIENT PROFILE IN 5MINUTES.
ConsoleApplication.zipを好きな場所に展開して、含まれているcsConsoleApplication.vstemplateファイルの名前を変更する。たとえば、csConsoleApplication-NoClientProfile.vstemplateなど。
そのファイルをテキストエディタで開いて以下の部分を修正する。
consoleapplication.csprojファイルをテキストエディタで開いて以下の部分を修正する。
$if$ ($targetframeworkversion$ >= 4.0) <TargetFrameworkProfile>Client</TargetFrameworkProfile> $endif$
修正後
$if$ ($targetframeworkversion$ >= 4.0) <TargetFrameworkProfile></TargetFrameworkProfile> $endif$
要するに、<TargetFrameworkProfile>タグの中身を空にする。
先ほどのフォルダを ConsoleApplication-NoClientProfile.zip などの名前で圧縮。ZIPアーカイブにフォルダ自身が含まれないようにすること。
%USERPROFILE%\Documents\Visual Studio 2010\Templates\ProjectTemplates\Visual C#\
C# |
![]()
練習問題なら公開してもいいだろう。
問題はこちら。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 | スイッチ | 通電 |
|---|---|---|
| 0 | 0000 | 0001 |
| 1 | 0001 | 0011 |
| 2 | 0010 | 0001 |
| 3 | 0011 | 0111 |
| 4 | 0100 | 0001 |
というわけで、スイッチ状態のビット列はKの2進表記となる(数学的な証明は省略する)。さあ、これで答えを出力するのにK回ループする必要がなくなった。
通電状態はどうなるかというと、スイッチ状態がONのSnapperが連続していた場合はその次のSnapperまで通電するから、N回ループする中で連続する1の数を数えてもいい(Nは最大で30なので大したコストではない)。
ただ、この手のビット演算には定石があって、スイッチ状態のビット列に1を足したものと元のビット列とのxorを取ると、通電状態のビット列が求められる。
いくつかのビットパターンで試してみよう。
| s | 0000 |
| s+1 | 0001 |
| (xor) | 0001 |
| s | 0110 |
| s+1 | 0111 |
| (xor) | 0001 |
| s | 0100111 |
| s+1 | 0101000 |
| (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; } }
出ました。
WEB+DB PRESS Vol.64|gihyo.jp … 技術評論社
小野さんの連載『いまどきの.NET開発』、今回はLINQです。
また、今号の特集はどれも読みごたえがありますね。
こないだの『たけしのコマ大数学科』はこんな問題だった。
3つの車輪がそれぞれ異なるサイズと速さで回転する観覧車の
自戒を込めた雑記のようなもの - 軌跡の問題
1番小さい車輪に乗った乗客の軌跡を描け。
面白かったので、インラインSVGとJavaScriptでアニメーション化してみた。→ http://jsdo.it/matarillo/lDCF
forked: 2011-08-23 koma-univ - jsdo.it - share JavaScript, HTML5 and CSS
けっこう小気味良く動くもんだね。
General |
![]()
filter/map/reduceなアレです。
言語やライブラリによって名前が違ったりするので、NyaRuRuさんの対応表をベースにしてたたき台を作っておいたのですが、ちょっとずつ記述が増えてきました。
リスト(シーケンス)用高階関数対応表(Google Spreadsheet)
【対応】が意味するところがあいまいだったり、記述がまちまちだったりするところがありますが、まあ気づいた人がうまく修正してくれればと思います。
General |
![]()
今年度も受賞しました。ありがとうございます。
昨年度はClient App Devだったんですが、今年はC#に戻ってきました。理由はわからないけど。
JHashimoto
2011/07/13 15:58
MVP受賞おめでとうございます。
matarillo
2011/07/13 21:42
ありがとうございます。
.NET |
![]()
WEB+DB PRESS Vol.63|gihyo.jp … 技術評論社
.NET連載と.NET単発記事が載ってます。
.NET連載は尾島&猪股の連名記事(実質尾島が書いてましたが)が載っていた2008年(Vol.43)以来ですね。喜ばしいです。
C# |
![]()
ときどきの雑記帖経由。
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番目のようなインターフェースの使い方でいいでしょう。たぶん。
C# |
![]()
何か間違っている気がするなあ。
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)); } }
ykwyuta
もはや魔術。。。
InfinityLoopの時点でこういう書き方ができるのがなぜなのかさっぱり。
C#のこういう文法ってどこに書いてあるですか?
matarillo
MSDNにも書いてあるけど読みにくいよね。
岩永さんのサイトがいいんじゃないかな。
http://ufcpp.net/study/csharp/
yield returnについては、これ。
http://ufcpp.net/study/csharp/sp2_iterator.html
ラムダ式については、これ。
http://ufcpp.net/study/csharp/sp3_lambda.html
rst76
動かせないので推測なのですけど、これってLazyConsでリストを作ってると思っていいですか?LazyConsの代わりにLazyPlusとかやれば和が求まる?
せっかくmatarilloさんが関数型に転向しつつあるのに(?)、こちらは仕様漏れ対応とかでExcel、Wordを相手に連休を潰してます。orz
ちなみにHaskellチュートリアルとしては↓もおすすめです。
http://learnyouahaskell.com/chapters
matarillo
そのつもりなんだけど、いろいろ触ってると動きが微妙なときがあるなあ。
(無限リストにLazyConsを食わせた無限リストをdropしてtakeして得られた有限リスト)にLazyPlusを食わせたら、合計値がおかしくなった。
普通の有限リストにLazyPlusを食わせたときはちゃんと合計が出てくるんだけど。
Haskellチュートリアルありがとう。わかりやすそうですね。
matarillo
Lazy<T>は引数だけにしてみたら、上コメントの問題は解決したっぽい。
ykwyuta
なるほど。ありがとうございます
岩永さんのサイトはたまに見てました。
MSDNよりは分かりやすいに違いないのでまずはこっちを読んでみます
.NET |
![]()
Why we reversed some of our Reflector decision
あだ
今日始めて知った。
既にダウンロードしてあってそのPCのみで開発ができる諸兄はひと安心、で終わってしまった問題なのだろう。
だが、私のように客先に出向き、必要なツールを毎度その場で揃えるような商売だと致命的だ。
Lutzにだったら喜んで払った。もちろんだ。
今までさんざんお世話になった。ありがとう。今後の活躍も応援している。それはもう、問題なく心置きなく払える。
だが、Red Gateは買い取っただけだ。しかも、直後のLutzの発言からするに、無償のまま提供すると嘯いて買い上げ、手のひらを返したわけだ。
Reflectorの火を絶やしてしまわないために?今後のより良い製品の開発のために?商品を提供し対価を得ると言う健全な企業活動?
あまりにも白々しい言葉だ。
Red Gateがなにも開発していないとは言わない。現行バージョンの機能のいくつかはLutzのみの開発では届かなかった領域なのだろう。
だがやはり、Red Gateのやり方は批判を受けるに余りあるものだ。
私はこれからもずっと、Red Gateを批判し、憎み続けるだろう。
そして、Lutzと、Reflectorを愛し、応援し続けるだろう。
matarillo
ブックマークコメントにも書いたけど、RedGateは言い訳してるだけだよね。
General |
![]()
HTTP Server APIを一言で言うと、IISが利用しているWindows API。Windows Server 2008とWindows VistaではそのAPIが強化されていて、バージョン2.0となっている。
で、それを使ったartonさんのおもちゃ。
https://github.com/arton/ennou
世の中には「ひとつのOSはすべてを統べ」みたいに言う人もいるけれど(ガセーさんとか)、こういうおもちゃは大事だと思う。多様性は善、ですよね。;-)