だるろぐ

明日できることは、今日しない。

WebMatrix 3: Windows Store アプリを紹介するヘルパー(未完成)

f:id:daruyanagi:20130616181844p:plain

もしあなたが Windows ストア アプリを作っていて、なおかつ自分のサイトを APS.NET MVC/Web Pages で構築していたならば*1、Web ページに Windows ストア アプリの情報を埋め込みたいと思うかもしれませんね。

公式に oEmbed *2のような仕組みが提供されていればベストなのですが、残念ながらないみたい。仕方ないので、スクレイピングして埋め込み用のコードを取得する HTML ヘルパーを作ってみたいと思います。

*1:そんなやつおんのか?

*2:http://oembed.com/

続きを読む

nosniff 1.0.1

f:id:daruyanagi:20130518211931p:plain

必ず X-Content-Type-Options: nosniff レスポンスヘッダをつけるようにしましょう

機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記

とのことなので、ASP.NET でカスタム HTTP ヘッダを追加する方法 - しばやん雑記 を参考に X-Content-Type-Options: nosniff を付ける NuGet を作っておいた。

Web.config.transform を記述しただけのシンプルなものだけど、いかがでしょうかね。

f:id:daruyanagi:20130518212128p:plain

続きを読む

WebMatrix 3: Sinatra on ASP.NET 「Nancy」 を利用する

f:id:daruyanagi:20130510075606p:plain

Nancy is a lightweight, low-ceremony, framework for building HTTP based services on .Net and Mono. The goal of the framework is to stay out of the way as much as possible and provide a super-duper-happy-path to all interactions.

Hosting Nancy with asp.net · NancyFx/Nancy Wiki · GitHub

Scott Hanselman 氏のブログ(One ASP.NET: Nancy.Templates for Visual Studio - Scott Hanselman)で知ったのですが、 「Nancy」なんてのがあるんですね!

前々からこういうのがほしいなって思ってたんですよね……。

個人的に一番おすすめなのは Pure HTML または Razor (ASP.NET Web Pages)かな。 HTML5/CSS3(Pure HTML)で書くところからはじめて、変数とテンプレート、初歩的なデータベースが使いたくなれば Razor へ進めばいい。もっと大規模なWebサイトであれば、 ASP.NET MVC が利用できるけど、これはちょっと個人用途にはデカすぎる気がした(その中間に、 Ruby で言えば Sinatra とか、軽いフレームワークがあればいいなぁ、と思う)。仮想化だのクラウドだのという言葉を忘れて、 HTML ファイルひとつ、ぽつんと Azure Web Sites に置くところから始めてもらえればと。

#GoAzure に行ってきました! - だるろぐ

で、試そうかなって思ったまま、ちょっとストアアプリの方に浮気している間に、しばやん氏がいろいろ調べてくれていました。

ありがとう! さっそく WebMatrix で動かしてみますかネ。

ちなみに、Nancy は Frank Sinatra のお嬢さんです(ナンシー・シナトラ - Wikipedia)。Sinatra の名前も Frank Sinatra から来ているはず。

続きを読む

少しずつ Web サイトのリニューアルをしていきます。

f:id:daruyanagi:20130506224604p:plain

まずはここから。

仕組み的には Markdown テキストを App_Text フォルダに入れておいて、それを HTML に変換しています。Helper でプラグインっぽく拡張できるのがちょっと自慢。

ソーシャル関連のボタンは、この一連の記事で実装してみたものを使っています。

フィードの出力は以下の記事で実装したものをベースにしています。

今のところキャッシュ機能がないのでそれをつけようかなぁ、と。それ以外にも不満な部分が結構あるので、このサイトで十分に基本機能を練って NuGet パッケージにし、ほかのサイトにも展開していきたいと思います。

WordPress のような既存の大規模 CMS を使うのもいいけど、自分で少しずつ実装した方が“自分の手のひらの上で動かしている”感じがあって僕は好きです。

Windows Azure Web Sites を使って Dropbox からデプロイできたら便利そうなのだけど、ボクのお給料では Azure の維持は少し大変そうなので泣く泣く断念しました。おちんぎんほしぃなりぃ。

P.S.

f:id:daruyanagi:20130507214220p:plain

ロゴ、イケてない?

WebMatrix 3: JSON と JSONP

f:id:daruyanagi:20130421155340p:plain

一連の記事では、FeedCount の結果を JSON でやり取りしていました。

JSON

サーバーサイド

// ~/FeedCount.cshtml

Response.Clear();
Response.ContentType = "application/json";
Response.Write(Json.Encode(data));
Response.End();

渡されるデータ(例)

{"livedoor":6,"total":6}

クライアントサイド

// ~/Script/SocialButtons.js

$.ajax({
    url: '/FeedCount/' + url,
    dataType: 'json',
    success: function (json) {
        element.text(json.total || 0);
    }
});

けれど、Twitter や Facebook における共有数は JSONP で処理していました。それに合わせて、FeedCount も JSONP で処理できないか? と思ったのですが、$.ajax の dataType を 'jsonp' にするだけでは動きません。サーバーサイドにも手を加えなければならないみたい。

続きを読む

WebMatrix 3:危険な可能性のある Request.Path 値がクライアント (:) から検出されました。

f:id:daruyanagi:20130420223145p:plain

WebMatrix 3: フィードの購読者数を取得する(1:サーバーサイド編) - だるろぐ の補足。

http://localhost:11330/FeedCount/https://blog.daruyanagi.jp/

このような URL を受け取ると、

危険な可能性のある Request.Path 値がクライアント (:) から検出されました。

というエラーが出てしまいます。これは ASP.NET のセキュリティ機能のようですね。ただ、自分は Web 系のセキュリティにあまり詳しくないので、これがどのように悪用できるのかさっぱりわからないのですが……(SQLインジェクションかなにかかなぁ?)。いい本をご存知でしたら、どなたか教えてください。

とりあえず、今回はこれを解除してしまいます。あとは自己責任で……

続きを読む

WebMatrix 3: フィードの購読者数を取得する(1:サーバーサイド編)

f:id:daruyanagi:20130420221551p:plain

こんな感じのソーシャル共有+ RSS 購読ボタンをサイトに追加したいな、と思って、今朝少し WebMatrix と格闘していた。

SNS における共有数の取得部分は JavaScript だけで完結するのだけれど、RSS 購読数の取得部分は JavaScript だけでは少ししんどいのかなぁ。Same origin policy というものに引っかかってしまう。まぁ、こういうときは WebMatrix でサーバー側に RSS 購読数を取得するようにすればいいよね。

続きを読む

WebMatrix 3: RSS フィードを出力する(解決編)

f:id:daruyanagi:20130417064526p:plain

できた!

と思ったけど、Internet Explorer ではちゃんと表示できない。なんか XML が尻切れトンボで出力されておる……

WebMatrix 3: RSS フィードを出力する - だるろぐ

この問題を解決しておきましょう。

続きを読む

WebMatrix 3: RSS フィードを出力する

とあるフォルダー内のファイルのリストを RSS で出力したいなぁ、と思って昔に書いた記事(RSS 2.0 を実装する - だるろぐ)をコピペしてみたのだけれど、ちゃんと動かなかった……なぜだ。まぁ、原因を追求するのも面倒だったので、SyndicationFeed クラスを利用して書きなおしてみました。

@using System.IO
@using System.Xml
@using System.ServiceModel.Syndication

@{
    var url = new Uri(Request.Url.Scheme + "://" + Request.Url.Authority);

    // ココらへんはあんまり気にしないで
    var files = Directory.GetFiles(Server.MapPath("~/App_Text/"))
        .Select(_ => new FileInfo(_))
        .Where(_ => !_.Name.StartsWith("_"))
        .OrderByDescending(_ => _.LastWriteTime)
        .Take(10);

    var feed = new SyndicationFeed(App.Title, App.Description, new Uri(url, "Feed"))
        {
            Copyright = new TextSyndicationContent(App.Copyright.ToString()),
            Items = files.Select(file =>
            {
                var name = Path.GetFileNameWithoutExtension(file.FullName);
                
                // ファイルの内容を読み込んで自作の Markdown エンジンにかけている
                var content = TextFormatEngine.Transform(File.ReadAllText(file.FullName));
                
                return new SyndicationItem(
                    name, content.ToString(), new Uri(url, name), name, file.LastWriteTime
                );
            }),
        };

    Response.Clear();
    Response.ContentType = "application/xml";
    var writer = XmlWriter.Create(Response.Output);
    feed.SaveAsRss20(writer);
    Response.End();
}

f:id:daruyanagi:20130417064514p:plain

できた!

f:id:daruyanagi:20130417064526p:plain

と思ったけど、Internet Explorer ではちゃんと表示できない。なんか XML が尻切れトンボで出力されておる……

WebMatrix 3:SwissKnife.T4.AppSettings を使う

f:id:daruyanagi:20130406123715p:plain

Web.config の appSettings セクションをもとにクラスを生成してくれる T4 テンプレート SwissKnife.T4.AppSettings がよさげなので、これが WebMatrix 3 も使えないかなぁ、といろいろ試してみた。

続きを読む