ひとつのことって何だ?

頭のよさがすべてではない。成功者がもっている特質「Grit」とは何か?

http://lifehacking.jp/2009/08/what-is-grit-and-why-you-need-it/

Grit をもっている人にありがちなもう一つの特徴は、「一つのことに集中する」という特質だということが記事では挙げられています。

たとえばピアノを学んでいる子供がいたとして、音楽的才能が同じくらいとした場合に、ピアノだけに集中し、ピアノの演奏に必要な経験と失敗の蓄積だけをためている子供と、チェロやサックスにも手を出している子供では、当然前者の子供の方が成長が速くなります。

ほんとにこんなこと書いてるの?って原文に飛んでみたらほんとに書いてた。この例は納得いかないなぁ、成長って、何を評価したんだろう?ピアノの演奏技術を機械的に評価?*1


いろんなことを学んで、(Steve Jobsの言うように)点と点を繋げることができる人は、他人が見れば全然関係ないことやってるように見えて、本人の頭の中では「ひとつだけのこと」をやってるのと同じなんじゃないか。
自分の経験上、本当にピアノがうまくなりたけりゃサックスもチェロも練習しろって言いたい。音楽的な表現力を磨くためのひとつの方法として。

*1:だとするなら当然の結果だろうけど

Clean Code

「Clean Code」序論の挿絵ネタ↓

コードの品質を測定するのに有効な、唯一の方法:(コードレビューにおける)分あたりの「なんじゃこりゃ」

あるとおもいます!*1


Clean Code アジャイルソフトウェア達人の技

Clean Code アジャイルソフトウェア達人の技


実例の大量のコード付きなので、ちょっと読むのに時間かかりそうだけど、やっぱこの人の本は楽しいから好き。まだプログラミング経験浅い人は、マーチンの前著も読んでみるといい。GOFデザインパターンとかOOPLでよく言われる原則(Open/Closedの原則とか)の詳しい解説はそっちに載ってるんで。

*1:例えばhttp://d.hatena.ne.jp/oui27/20090716のコードを業務でそのまま持って来られたら「なんじゃこりゃ」を10回は言って突き返すだろうな。

HTTPで複数ファイルをPOSTしたい

WebClientクラスにはUploadFileとかDownloadFileとか便利なメソッドがたくさんありますが、複数ファイルのPOST機能は用意されていないらしく、仕方なくWebRequestを使って自作した。

  • RequestのContentTypeは「multipart/form-data; boundary=1234567890」とする。(boundaryは何でも良さそうなので、適当な英数字を指定)
  • RequestのStreamには、区切り文字列、ヘッダ、ファイル内容を、ファイルの数だけ繰り返す。この時、改行コードの位置と個数は重要。
--1234567890
Content-Disposition: form-data; name="フォーム名1"; filename="ファイル名1"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

(ここにファイル内容)
--1234567890
Content-Disposition: form-data; name="フォーム名2"; filename="ファイル名2"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

(ここにファイル内容)
--1234567890
Content-Disposition: form-data; name="フォーム名3"; filename="ファイル名3"
・
・
・
以下略


コードはこんな感じ

using System;
using System.Collections.Generic;
using System.Net;
using System.IO;

namespace Upluad
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "http://localhost:1588/Upload.aspx";
            List<string> files = new List<string>();
            files.Add("C:\\Tmp\\up\\test.zip");
            files.Add("C:\\Tmp\\up\\test2.zip");

            UploadFiles(url, files);
        }

        private static void UploadFiles(string url, List<string> files)
        {
            string tick = Environment.TickCount.ToString();
            System.Text.Encoding enc = System.Text.Encoding.UTF8;

            WebRequest req = WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "multipart/form-data; boundary=" + tick;

            byte[] boundary = enc.GetBytes("--" + tick);
            byte[] crlf = enc.GetBytes("\r\n");
            List<byte[]> headers = new List<byte[]>();
            
            //ヘッダの作成とデータサイズの計算
            long contentLen = 0;
            for (int i = 0; i < files.Count; i++)
            {
                //ヘッダ
                string header = "Content-Disposition: form-data; name=\"upfile" + i.ToString() + "\"; filename=\"" + Path.GetFileName(files[i]) + "\"\r\n" +                     
                                "Content-Type: application/octet-stream\r\n" +
                                "Content-Transfer-Encoding: binary\r\n\r\n";

                headers.Add(enc.GetBytes(header));

                //1ファイルごとのデータサイズ
                contentLen += headers[i].Length + new FileInfo(files[i]).Length;
            }
            //全体のデータサイズ
            req.ContentLength = contentLen + ((boundary.Length + crlf.Length + crlf.Length) * files.Count) + boundary.Length;


            //送信
            using (Stream reqStream = req.GetRequestStream())
            {
                for (int i = 0; i < files.Count; i++)
                {
                    //送信ファイル
                    using (FileStream fs = new FileStream(files[i], FileMode.Open, FileAccess.Read))
                    {
                        //ヘッダ
                        reqStream.Write(boundary, 0, boundary.Length);
                        reqStream.Write(crlf, 0, crlf.Length);
                        reqStream.Write(headers[i], 0, headers[i].Length);

                        //ファイル内容
                        byte[] buf = new byte[0x1000];
                        int readSize = 0;
                        while (true)
                        {
                            readSize = fs.Read(buf, 0, buf.Length);
                            if (readSize == 0) break;

                            reqStream.Write(buf, 0, readSize);
                        }

                        reqStream.Write(crlf, 0, crlf.Length);
                    }
                }
                reqStream.Write(boundary, 0, boundary.Length);

                WebResponse res = req.GetResponse();
            }
        }
    }
}

SQLServer 2008の本

本屋を覗いたらSQLServer 2008の良さげな本発見。2008はまだ業務で使ってないので詳しく調べてなかったけど、知らない機能が色々増えてた…。

上巻はRDB部分に関することがメインで、下巻はAnalysis ServicesとかReporting Servicesとかの周辺のサービスや、ADO.NETを使って.NETアプリからどうやってデータアクセス部分を開発するかってのがメイン。特に、Analysis Servicesの開発方法について詳しく解説している本は貴重なので、ちょっと欲しいかも。*1

発売日を同じくして「インサイド Microsoft SQL Server 2005 T-SQL編 (マイクロソフト公式解説書)」なんていうのも出てた。ただし、SQLの基本的な部分はともかくとして、あんまりマニアックな構文使われると困るので程々に…

*1:SQLServer 2000の頃に比べればMSDNにかなり詳しく載ってるけど、本は少ない

Silverlight 3のHttpWebResponse

Silverlight 3が明日正式リリースされるとかニュースで見たので、以前から気になっていた*1HttpWebResponseのステータスコードはどうなったのか調べてみたところ、リファレンスは以下のようになっていました↓
http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode(VS.95).aspx

たしか2の頃のこのページには200と404しか書いてなかった記憶があるから…今回はまともにステータスコードが取得できるってことでしょうか。(今更試すのはめんどい)

*1:http://d.hatena.ne.jp/oui27/20080827

MIDIプロセッシング

MIDIコントローラからLogicのシンセを操作する時、いろいろとインテリジェント?なMIDIプロセッシングを挟みたいという話。

この手のことをやるツールとしては何故かGUIでロジックを描く系のが一番多くて、昔Reaktorを触ったとき、一回普通のプログラミング言語で疑似コード書いてから、Reaktorのオブジェクトでどう表現するかなんてことやってて、結局馴染めなかったんよね。*1
Max/MSPはその点、オブジェクトの作成でインテリセンスが使えたり、すぐリファレンスに飛べたり、オブジェクトのIN/OUTの説明がtooltipで表示されるとか、群を抜いて使いやくなってるとは思う。あれはすごい。(でもやっぱり馴染めないかも)

あ、Logicにエンバイロメントがあるけど、あれは流れてくるMIDIの加工は簡単にできるけど、複雑なルールに従って柔軟に生成するってのが難しそう。

MIDIならやっぱ自分でプログラム書いた方が早いかな。CoreMIDIとCocoa覚えるついでに。

*1:SQL ServerのIntegration ServicesとかDTSも大嫌い

ouiLead Demo Video 4

ver 1.3 Beta


ベンドアップと装飾音の機能を追加。さらにウィンドシンセっぽい歌い方ができるようになりました。
発音時の図形表示の負荷が気になったのでCoreAnimationからOpenGL ESに書き直し、パラメータカーブ等の調整してver 1.3としてリリースしました。

ver 1.3 Alpha


今までで最も大掛かりなネタです。ドラム、ティンパニ、SEなどのパーカッション系は別のシンセですが、それ以外の全てを18トラック使ってouiLeadで弾きました。
これのソロのパートを弾くためにスケールの機能を追加しましたが、こんな小さいタッチパネルで速いフレーズはそもそも向いていないですね…。