しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

京都合宿に参加して URL Rewrite Visualizer を作った話

4 月からお手伝いしている一休.comの開発メンバーが、京都で 2 泊 3 日の開発合宿するという話を聞いたので、密かに紛れ込んできました。

f:id:shiba-yan:20160811125121j:plain:w450

事前に予習が必要だったのですが、数話だけ見た状態で合宿に突入しました。

f:id:shiba-yan:20160815001335p:plain

ちはやふるに関しては他の人がまとめてくれると信じているので割愛します。競技かるたをすると 1 日で 3kg 痩せると聞いてダイエットクラスタが騒めきました。

作ったもの

Visual Studio には Directed Graph Markup Language (DGML) というファイルを操作する機能が用意されているので、それを利用して URL Rewrite のルール依存関係を表示するツールを作りました。

例えば以下のような URL Rewrite のルールを用意して、DGML を書き出します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Redirect from blog">
          <match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
          <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
        </rule>
        <rule name="Redirect from page">
          <match url="^page/([_0-9a-z-]+)/([0-9]+)" />
          <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
        </rule>
        <rule name="Redirect from top">
          <match url="^top$" />
          <action type="Redirect" url="article/12345/12345" redirectType="Found" />
        </rule>
        <rule name="Redirect from root">
          <match url="^$" />
          <action type="Redirect" url="top" redirectType="Found" />
        </rule>
        <rule name="Error response">
          <match url="^error$" />
          <action type="AbortRequest" />
        </rule>
        <rule name="Rewrite to article.aspx">
          <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
          <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

書き出したファイルを Visual Studio で開くと、有向グラフとして表示されます。特に説明は要らないと思いますが、ルール間の依存関係が視覚化されていることが分かりますね。

f:id:shiba-yan:20160814234431p:plain

DGML の操作に必要な GraphModel ライブラリは Visual Studio のインストールディレクトリにありますが、場所がちょっとわかりにくいのでスクリーンショットだけ貼っておきます。

f:id:shiba-yan:20160815000836p:plain

実際の Rewrite ルールなどで試していないので、多分微妙な動作とか普通にあると思いますが、今回の実装のメインは正規表現で定義された match url をどうやって作るか、という部分でした。

正規表現にマッチする入力文字列を作るために、今回は Fare というライブラリを使いました。元々の Java 実装を C# に移植したライブラリになります。

Fare.Xeger クラスを使うと、簡単に正規表現にマッチするランダムな文字列を生成してくれます。使い方も以下のようにとてもシンプルです。

var xeger = new Fare.Xeger("^blog/([_0-9a-z-]+)/([0-9]+)");

var str = xeger.Generate();

これで入力文字列が生成されるので、あとは上から順に Rewrite ルールを辿って行って GraphModel の表現にマッピングしているだけです。

GraphModel は Node と Link を追加していくだけで、いい感じにグラフを作ってくれるので良い感じでした。

京都での食事

食事は基本的に全て naoya さんが案内してくれました。お昼はラーメンとつけ麺で迷いつつも、みんながつけ麺だったのでラーメン選ぶぐらいひねくれてるのが私です。

f:id:shiba-yan:20160811142307j:plain

某はてな社のすぐ近くにある店でしたが、インターンしてた時には毎日が忙しすぎて事務所から一歩も外に出なかったなと思い出しました。大学生の頃なのでとても懐かしい話です。

夜も最高の店で、ここも烏丸御池の近くでした。みんなで進捗を気にせず飲む酒は最高という感じです。

f:id:shiba-yan:20160812210328j:plain

f:id:shiba-yan:20160812211753j:plain

f:id:shiba-yan:20160812212556j:plain

京都って安くて美味しい店多いんだと思いなおしました。また個人的にも食べに行きたいお店でした。

合宿の準備などは全て任せっきりで、本当に乗っかっただけで申し訳ない気持ちでいっぱいですが、集中してコーディング出来たのと楽しい時間を過ごすことが出来て最高でした。