指定したユーザーのはてなブックマーク一覧を取得する

いいかげん、そろそろプログラミングネタを書かねば。 ってことで、C# で「指定したユーザーのはてなブックマーク一覧を取得する」サンプルを書いてみた。

はてなブックマークに専用の API が見当たらないので、RSS フィードを取得してパースしている。 オフセットも指定できるから、これはこれで XML を返す Web API と見れなくもない。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace HatenaBookmarkSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var bookmarks = GetUserBookmarks("griefworker", 100)
                .GetAwaiter().GetResult();

            foreach(var b in bookmarks)
            {
                Console.WriteLine(b.Title);
                Console.WriteLine(b.Url);
                Console.WriteLine(b.Comment);
                Console.WriteLine();
            }

            Console.WriteLine("Enter で終了します。");
            Console.ReadLine();
        }

        static async Task<IEnumerable<Bookmark>> GetUserBookmarks(string userId, int offset = 0)
        {
            var httpClient = new HttpClient();

            // RSS フィードなのでレスポンスは XML
            httpClient.DefaultRequestHeaders
                .Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

            // User-Agent を設定しないと nginx にはじかれる
            httpClient.DefaultRequestHeaders
                .UserAgent.Add(new ProductInfoHeaderValue("HatenaClient", "0.0.1"));

            var requestUri = $"http://b.hatena.ne.jp/{userId}/rss";
            if (0 < offset)
            {
                requestUri += $"?of={offset}";
            }

            var rss = await httpClient.GetStringAsync(requestUri);

            var document = XDocument.Parse(rss);

            var bookmarks = document.Descendants()
                .Where(e => e.Name.LocalName == "item")
                .Select(ToBookmark)
                .ToList();

            return bookmarks;
        }

        static Bookmark ToBookmark(XElement element)
        {
            var bookmark = new Bookmark();

            foreach(var e in element.Descendants())
            {
                switch (e.Name.LocalName)
                {
                    case "title":
                        bookmark.Title = e.Value;
                        break;
                    case "link":
                        bookmark.Url = e.Value;
                        break;
                    case "description":
                        bookmark.Comment = e.Value;
                        break;
                }
            }

            return bookmark;
        }
    }

    class Bookmark
    {
        public string Title { get; set; }

        public string Url { get; set; }

        public string Comment { get; set; }
    }
}

実行結果は次の通り。

f:id:griefworker:20170405153751p:plain

はてなブックマークREST API で用意してくれたらいいんだけどな。

うえすたん 木の葉モール店

警固に本店がある『うえすたん』の木の葉モール店がオープンしていたので行ってみた。

注文したのはサイコロステーキとハンバーグのコンボ。サイコロステーキが一番人気だけど、でもハンバーグも気になる、そんな自分にぴったり。

サイコロステーキは予想以上の柔らかさで、ハンバーグを食べたかと間違うほどだった。こいつは旨いな。コンビの80グラムではとても食べ足りない。ハンバーグはしっかりと練られていて口当たりが良かった。でも、ビフテキ屋なんだから、もっと肉肉しくていいのに。

サイコロステーキ気に入った。今度からコンビではなく、サイコロステーキ 200 グラムを注文することにしよう。

うえすたん 木の葉モール店

食べログ うえすたん 木の葉モール店

『からかい上手の高木さん(1)〜(5)』を読んだ

ネットでたびたび話題になった、『ゲッサン』で連載中の『からかい上手の高木さん』をKindleでまとめ買いして読んだ。

西片くんが主人公なのかな。その西片くんが、となりの席の高木さんにひたすらからかわれ続ける。簡単にいうとそんなマンガ。やられっぱなしではいられないと、西片くんは何度も仕返ししようとするが、高木さんの方が何枚も上手で結局からかわれてしまう。好きな女子にちょっかいを出す男子というのはあるけど、このマンガはその逆を行っている。そんな高木さんに大人は悶えてしまう。

西片くんが高木さんに勝つ日は訪れるのだろうか。最新の5巻では西片くんのクリティカルがあった。ああいうのがもう少しあってもいいと思う。ただ、西片くんは勝利よりもからかわれることを読者に望まれてるだろうから、最後まで勝利は難しいかもしれない。

このマンガをラブコメに分類することに違和感ある。2人が結ばれるかどうかは気にならない。むしろ、今の距離感の2人の話をずっと読んでいたい。まぁ、5巻の最初、大人になった高木さんが出てくる衝撃回で、未来の2人がどうなっているのかについて、一応の正史がわかったからというのもあるが。まさか読者すらもからかうとは。恐れ入った。

今後も高木さんに目が離せそうにない。

『服を着るならこんなふうに(1)〜(4)』を読んだ

『最速でおしゃれに見せる方法』の著者 MB 氏が携わっているマンガ。ヤングエースUPで連載中。

web-ace.jp

MB 氏が著書やブログやメルマガで公開している、「カジュアルとドレスのバランス」をはじめとした理論をマンガで学ぶことができる。 マンガなので文章よりもスッと入ってきやすいし、何よりマンガとして普通に面白い。 そもそも、ファッションを題材にした、しかも男性向けのマンガってほとんど知らないから貴重ですらある。

『マスタリングTCP/IP 入門編』を読んだ

「ITエンジニアに読んでほしい!技術書・ビジネス書大賞 2017」で、 『マスタリングTCP/IP 入門編』が技術書部門ベスト10に入っていたので購入。 自分自身、TCP/IP を理解できているかと聞かれたら怪しいところはあるので、 復習のつもりで読んでみた。

本書で扱っている『TCP/IP』はプロトコルTCP と IP だけを指すのではない。 UDP や HTTP や FTP などなど、インターネットを構成するプロトコル群の総称。プロトコルといったら OSI 参照モデルが真っ先に紹介されるが、実際に使われているのは TCP/IP で、OSI 参照モデルとTCP/IP の関係性に混乱したのはいい思い出だ。OSI 参照モデルとの関係性はもちろんのこと、そもそもの成り立ちから解説してあるので、昔の自分が最初に本書と出会っていれば、すんなり理解できただろうな。

あと解説がとにかく丁寧。フレームやパケットが運ばれていく様子を、郵便や宅急便といった現実世界のものに例えて説明しているので、イメージが掴みやすい。図をふんだんに使うだけでなく、図内の矢印に番号を振ったり、細かい書き込みを加えたりと、細部まで力が入っており、理解の助けに何役もかっていた。

今もなお支持されているだけある。 新人に読ませたい本としてたびたび本書の名前を聞くが、 それも納得。

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

アンリ・シャルパンティエの『金のなめらかミルクレープ』と『銀のチョコミルクレープ』

会社帰りに立ち寄ったアンリ・シャルパンティエに、運良く『金のなめらかミルクレープ』と『銀のチョコミルクレープ』がまだ残っていたので買って帰った。食べ比べたかったのに、売り切れてることが多くて、何度出直したことか。

ミルクレープは以前「究極のミルクレープ」と銘打って売り出していたときと変わらぬ美味さ。チョコミルクレープの方もチョコの甘さの加減が絶妙で、これまた美味かった。そしてどちらも層が多くてきめ細かく、滑らか。

食べ比べてみて、どっちが美味かったかと聞かれたら、甲乙つけられないとしか言えない。今後、ミルクレープとチョコミルクレープのどちらを選ぶか本気で悩みそうだ。

関連ランキング:ケーキ | 天神南駅西鉄福岡駅(天神)天神駅

郷家のつけ麺

天神で好みのつけ麺が食べられる店を探している。行きつけの店はどこも職場からは遠くて、昼休みに到底行けないもんで。

郷屋のつけ麺が、福岡の情報番組かグルメ雑誌のランキングで一位になったという情報を入手したので、久しぶりに行ってみた。

f:id:griefworker:20170321215034p:plain

つけ麺を注文。麺は大盛りで。

f:id:griefworker:20170321215100p:plain

つけ汁はサラッとしていて旨味が濃縮されているタイプだった。チャーシューの肉片が入っていて、お得感ある。カボスを搾ると爽やかになって、夏なんかに良さそう。まるげんのつけ麺が近いかもな。

f:id:griefworker:20170321215120p:plain

麺はツルツルで喉越しがすごく良い。大盛りだとかなりのボリュームで、完食したけど満腹になった。

f:id:griefworker:20170321215158p:plain

情報通り美味だった。特に肉片入りのつけ汁が気に入った。ドロッとした濃厚つけ汁が好みだけど、こういったサラッとしたのも良いもんだ。