シンタックス・ハイライト機能はソーシャルコーディングで拡充したほうがよいかも
正直にいえば、はてなのgithubリポジトリーか何かにシンタックスハイライトのとこだけ公開してもらって、みんなでプルリクぶんなげるほうがいいと思うんだよね。
はてなの中の人が興味ない言語とか、世の中にはたくさんあるわけで。
参考までに、Qiitaは Pygmentsを 使ってる ことがはっきりしてるんで、気に入らなければコントリビュートすればいいんだよね。
まあ、それはそれとして、サポートを希望する言語として F# を挙げておくね。 (←そもそもキーワードリンクもされてない。Elixirのパイプライン演算子に影響を与えた言語だよ!)
指定するのはファイルタイプってなってるけど、C#は cs
だから、F#は fs
になるのかな。
どうせなら、csharp
とかfsharp
でも対応されるといいのに。
ファイルタイプ cs
を指定したサンプル。(C# もVer6など最新バージョンに対応するといいのにね)
public async Task<int> Hoge() { await Task.Delay(1000); return 12; }
ファイルタイプ fs
を指定したサンプル。これがハイライトされないんで、現状はしかたなく ocaml
を指定してごまかしている。
open Suave open Suave.Http open Suave.Http.Applicatives open Suave.Http.Successful open Suave.Web let app = choose [ GET >>= choose [ path "/hello" >>= OK "Hello GET" path "/goodbye" >>= OK "Good bye GET" ] POST >>= choose [ path "/hello" >>= OK "Hello POST" path "/goodbye" >>= OK "Good bye POST" ] ] startWebServer defaultConfig app
できれば、はてなブログじゃなくてはてなグループの方もアップデートしてもらえると、そっちにF#のコードを載せるときにうれしいのだけど。
(追記).NET/Windows系技術者から見ると、F#もPowerShellも、まあずいぶん放置されてるという感じで、たぶんはてなの中の人にはこれらのユーザーは存在しない、少なくともほっといていいレベルと思われてると理解していますよ。 他にもBooやNemerleなんてのも、Pygmentsにはあるけどはてなにはない(そもそも言語として認識されてる気がしない).NET系言語ですね。まあPygmentsにあるからといって、さすがにVisual FoxProは対応しなくていい気がしますが。
割と些末なI18N活動
こないだ2件ほどPRを出したのでそれについてメモしておきます。
StephenStrickland/GcmSharp i18N: add a support for multi-byte characters.
WebRequest.ContentLength
に文字列のLength
を設定してたので、それはSystem.Encoding.UTF8.GetByteCount()
を使ってねというだけのもの。受け入れられてマージ済み。
dahlbyk/posh-git Allow to use UTF8 characters on a branch name
posh-gitでブランチ名に日本語を使うとプロンプトが化けるので、git status
コマンドを発行する前後で[Console]::OutputEncoding
をutf8にしてまた戻すというダーティハック。
実はこれ、良い解決法ではぜんぜんなくて、PowerShellを操作するとすぐに日本語のところがおかしくなる。(というか、マルチバイト文字の出力がダブってしまう)
上の状態でEnter
を2回たたくと、下の状態になる。
(Warningが出てるのは、フォントがラスターフォントのままだったからです)
ともあれPRを元に議論が開始して、よりよい解決法が見つかればという思いでPRを送ったのだけど、問題が伝わらなかったのか、今のところ放置されている。後日またPRを更新したいなと思う。
coreclr Book of the Runtime日本語訳プロジェクトに協力中です。
そんなわけで、coreclrやらcorefxやらroslynやらの調べ物をし
ようと思って日々過ごしているわけですが、最近気付いたもので、coreclrのリポジトリの中に、"Book of the Runtime" (BotR) と呼ばれるドキュメント集があって、.NETランタイムの内部設計についていろいろ解説してあるのです。これはなかなか興味深い。ランタイムの各コンポーネントの担当者がまとめた文章を集めたものであるらしく、コードの詳細までは踏み込まないけど、内部実装の理解がそれなりに得られるものだと思います。というわけで、少しずつ読み解きながら翻訳してみたいと思っています。翻訳したドキュメントは、このリポジトリに置いておきたいと思います。翻訳を手伝っていただける方は随時募集しています(既にわたしだけのプロジェクトではないです)。
というわけで翻訳を手伝っています。
とりあえず現在は、型システムのチャプターをやっつけて、スレッドのチャプターに着手しています。
適当な日本人の名前や住所をランダムに作れる gimei を C# に port した。
gimei は、日本人の名前や、日本の住所をランダムに返すライブラリです。テストの時などに使います。似たようなライブラリにfakerがあります。fakerはとても優れたライブラリで、多言語対応もしていますが、ふりがな(フリガナ)は流石に対応していません。gimei ふりがな(及びフリガナ)に対応しています。
Big Sky :: 適当な日本人の名前や住所をランダムに作れる gimei を golang に port した。
オリジナルは ruby gems です。
というわけで、gimeiおよびgo-gimeiを真似してC#で書いてみました。
.NET port of gimei
PM> Install-Package dot-gimei
gimeiおよびgo-gimeiと違うとこ:
- データはDLLに埋め込んでしまいました。
- そうはいっても差し替えたいこともあるだろうから、
Gimei.Generator
クラスを作っておきました。こいつのコンストラクタにTextReader
を食わせてください。 IsMale
プロパティとIsFemale
プロパティはbool?
型です。(ざわ……ざわ……)- 新しく
Gender
プロパティを追加しました。型はGenderIdentity
列挙体です。 - 政治的に使いにくいAPI
using System; using DotGimei; class Program { public static void Main(string[] args) { var name = Gimei.NewName(); Console.WriteLine(name); // 斎藤 陽菜 Console.WriteLine(name.Kanji); // 斎藤 陽菜 Console.WriteLine(name.Hiragana); // さいとう はるな Console.WriteLine(name.Katakana); // サイトウ ハルナ Console.WriteLine(name.Last.Kanji); // 斎藤 Console.WriteLine(name.Last.Hiragana); // さいとう Console.WriteLine(name.Last.Katakana); // サイトウ Console.WriteLine(name.First.Kanji); // 陽菜 Console.WriteLine(name.First.Hiragana); // はるな Console.WriteLine(name.First.Katakana); // ハルナ Console.WriteLine(name.IsMale); // false var male = Gimei.NewMale(); Console.WriteLine(male); // 小林 顕士 Console.WriteLine(male.IsMale); // true Console.WriteLine(male.IsFemale); // false var address = Gimei.NewAddress(); Console.WriteLine(address); // 岡山県大島郡大和村稲木町 Console.WriteLine(address.Kanji); // 岡山県大島郡大和村稲木町 Console.WriteLine(address.Hiragana); // おかやまけんおおしまぐんやまとそんいなぎちょう Console.WriteLine(address.Katakana); // オカヤマケンオオシマグンヤマトソンイナギチョウ Console.WriteLine(address.Prefecture); // 岡山県 Console.WriteLine(address.Prefecture.Kanji); // 岡山県 Console.WriteLine(address.Prefecture.Hiragana); // おかやまけん Console.WriteLine(address.Prefecture.Katakana); // オカヤマケン Console.WriteLine(address.Town); // 大島郡大和村 Console.WriteLine(address.Town.Kanji); // 大島郡大和村 Console.WriteLine(address.Town.Hiragana); // おおしまぐんやまとそん Console.WriteLine(address.Town.Katakana); // オオシマグンヤマトソン Console.WriteLine(address.City); // 稲木町 Console.WriteLine(address.City.Kanji); // 稲木町 Console.WriteLine(address.City.Hiragana); // いなぎちょう Console.WriteLine(address.City.Katakana); // イナギチョウ var prefecture = Gimei.NewPrefecture(); Console.WriteLine(prefecture); // 青森県 } }
「Web系企業が教えてくれないWindowsではじめるWebプログラミング」の想定読者
SlashDotのACさんたちとか、Web系企業のひととかとは、前提が違うと思うんですよ。 スタートとゴールが未定義だと議論が発散するから意味ないんですよね。 なので、いま私が念頭に置いていることをメモっておきますよ。
スタート
- PCのWebブラウザ(種類は問わない)で不自由なくWebブラウジングできる人
- ぐぐれる人(Web検索して情報を得ることができ、かつその情報の有効性について何らかの判断ができる)が望ましい
- 何らかの手続き型言語で何らかのプログラムを書いたことあって、ループとか関数とかコンパイルとか黒い画面とかそういうので怯まない人が望ましいけど、必須ではない(そのあたりから解説してもいい)
ゴール
- PHPでもRailsでもいいけど、ドットインストール (http://dotinstall.com/) で自学するときの前提知識をつける
具体的には、以下のようなことを一通りカバーする
- ブラウザ(HTTPクライアント)とWebサーバがやっていることがHTTP/1.0くらいのレベルでイメージできる
- HTMLとXMLの最大公約数的なシンタックス(開始タグ終了タグ属性コメントエスケープあたり、木構造の理解が望ましい)がわかる
- 静的HTMLとCSSをすげえ簡単なレベルで書ける
- anchorタグでリンクしている2-3枚のHTMLをlocalhost上の何らかのWebサーバに置いて、ブラウザからアクセスしてリンクをたどって確認できる
- formタグのある静的HTMLと、それを受け取って動的HTMLを返す何らかのプログラムをlocalhost上の何らかのWebAppサーバに置いて、ブラウザからアクセスしてフォームにポストして確認できる(GET/POST両方やれるべき)
- DOMがどういうものかイメージできる
- JavaScriptが要求されてロードされて実行される流れがなんとなく把握できてる
- bodyのloadとbuttonのclickあたりにJavaScriptのイベントハンドラを仕掛けたHTML+JavaScriptを書ける
- クッキーとセッション状態がどういうときに使われるか、簡単な例を説明できる
- クッキーとセッション状態を使った単純なWebアプリケーションを書ける
また、以下のことは範囲外とする
- データ永続化と取得
- セキュリティ(これはインターネットに向けてサービスやアプリを公開する前に叩き込む必要があるけど、教えることが多くて困る)
- 特定の言語プラットフォームやフレームワークを前提とする知識
- HTML5などのモダンWeb標準
- AltJSやモダンJavaScript
「Web系企業が教えてくれないWindowsではじめるWebプログラミング」という連載を始めます
始めるって書いておけばなかったことにするわけにもいかないだろう。
週一ぐらいのペースでQiitaに記事を書いていこうかなと思います。
それともあれかな?定期勉強会を開いて、そっちから記事なりなんなりに起こしたほうがいいかな?
とりあえず、SlashDotにぽろっと書いたら変な怨嗟コメントがついたけど転載しておきますね。
Web系のプログラミングをWindowsで覚えようとすると嫌になってプログラミングを断念するからさっさとWindowsは捨てたほうがいいというあれ。たぶんWAMPとかXAMPP for Windowsとかそういうあれとか、gitとか、そういうのをイメージして言ってんだろうし、それは一理あるけども。 とはいえ、プログラミング初心者がVisual Studio+ASP.NET MVC+C#でプログラミングを覚えて、その後MacでもLinuxでも使うようになったって別にいいじゃんと思うわけだ。
はいはい、誰も使ってないプロプラ技術(実際にはそんなこともないけど、それを置いておいたとして)にロックインされるといいたいわけね。でもほんとにロックインされるか?プログラミングを「はじめる/おぼえる」のと「つづける」は違うと思うし、「はじめる/おぼえる」のハードルを下げることには意味があると思う。HTTPとか、HTMLとか、CSSとかJSとかを一通り覚えるにあたって、VSだとできないなんてことあるかね。ないよ。
何で多くの人が、MS系技術とFOSS系技術を両方学ぶのは無理とか無駄って思ってるんだろうね。 無理なくできるよ。そして、プログラミングを覚えるハードルを下げるという意味では無駄なんかじゃないよ。
HTML Parser "dcsoup" のバージョンを 0.2.0 に更新しました。
ライブラリに含まれるクラスのプロパティが、Javaっぽい部分と、jQueryっぽい部分と、.NETっぽい部分がぐちゃぐちゃになってます。いずれきちんとした指針を立てた上で整理したいのですが。
と書いてたあたりをやっつけました。
具体的には
// getter public string Text() { return text; } // fluent setter public Element Text(string text) { this.text = text; return this; }
みたいになってたところを
public string Text { get; set; }
みたいにプロパティにしてしまった上で、jQueryライクなメソッドチェーンのためには
public static class FluentUtility { public static Element Text(this Element self, string text) { self.Text = text; return self; } }
と、拡張メソッドで対処しました。
これが本当にいいのかというと、ちょっとわからないのですが。