Quantcast
Channel: なか日記
Viewing all 848 articles
Browse latest View live

nkd.jp ドメインを取りました

$
0
0

さっき nkd.jp ドメインを取りました。サイトはまだありません。

nkj.jpじゃないのは空いてなかったからです。nkd.jpなのは酢酸先生の提案です。

はてなブログProにしたので、blog.nkd.jp なんてのも良いですね。

だるやなぎ様みたいに「俺のことがしりたければこのサイト見ろ」なサイトを作るのもカッコイイと思います。*1

でも、今はそれより遊びたいことがあるので、そっち優先で行こうと思います。

以下、簡単に経緯をまとめておきます。

経緯

きっかけは酢酸先生のこの発言。

なるほど、何か面白そう。

で、どこで取るのがいいかなーと思ってふとつぶやいたら、

酢酸先生が反応してくれて、

いろいろ調べてくれて、

「なかでぃー」でいけばいいじゃない。という提案までしてもらった感じです。

なるほど。時代は短いドメインか。

というわけで、nkd.jpを取りました。

年間1,000円かかるけど、それくらいはお小遣いでなんとか・・・

無駄にならないよう有意義に使っていきたいと思います。

追記

鋭い指摘を頂きました。

ちょっとショックだったけど、こう考えることにしました。

俺ってかしこいかも。

追記2

Oh, no...

*1:自分の場合、コンテンツがしょぼくなるのは目に見えてますが…


4ステップでAzure Webサイトに独自ドメインを設定する

$
0
0

昨日、nkd.jpドメインを取得したのでさっそくAzure Webサイトに設定してみました。

1.web ホスティングプランの確認

独自ドメインを設定するにはお金の掛かるプラン(共有、基本、標準)にしておく必要があります。 [スケール] 管理ページで確認しておきましょう。

f:id:nakaji999:20140824001102p:plain

2.ドメインの設定

[構成] 管理ページにある「ドメイン名」セクションから「ドメインの管理」ボタンを押します。

f:id:nakaji999:20140824001345p:plain

すると、下のような画面が表示されます。

f:id:nakaji999:20140824003054p:plain

CNAMEレコードに
www.yourdomain.com から nkd-jp.azurewebsites.net
または
awverify.www.yourdomain.com から awverify.nkd-jp.azurewebsites.net
を参照設定をしなさいということなのでそうすることにします。

ついでに、Aレコード用のIPアドレスも表示されてますのでそれも合わせてせってしましょう。

3.DNSレコードの追加

私はスタードメインで取得したので、管理ツールから以下のような設定を行いました。

f:id:nakaji999:20140824005511p:plain

4.ドメインの設定

ドメインの管理」に戻ってドメイン名を入力します。テキストフィールドの右端に緑のチェックマークが付けば登録することができます。

f:id:nakaji999:20140824011849p:plain

チェックマークが付かない場合はCNAMEの設定が間違っているかDNSの伝播に時間がかかってるのかもしれません。

独自ドメインでのアクセス

そんなわけで、独自ドメインでアクセスできるようになりました。

f:id:nakaji999:20140824011515p:plain

SgmlReaderを使ってはてなカウンターからPVを取得する

$
0
0

以前、以下のエントリで書きましたが、既往のPVをツイートするBotを動かしています。

PVが少ないのは置いといて、GoogleAnalyticsからPVの情報を取得していましたが、今のやり方だと基本インスタンス以上にする必要があり、お財布的にちょっと厳しい。違う方法(OAuthを使う)だと共有インスタンスなどでもいけるんじゃないかという噂を耳にしたのですが、力不足でよくわかりません。。

なので、安直にカウンターからPVを取ってくるようにしました。

方針

日付別ページの「トータルアクセス数」を取ってくるようにします。

f:id:nakaji999:20140825014411p:plain

SgmlReaderのインストール

Htmlを解析するのにSgmlReaderを使用します。

詳細は下記公式GitHubや@さんのブログを見てもらったらいいと思います。

インストールはパッケージマネージャコンソールで下記コマンドを実行します。

Istall-Package SgmlReader

サンプルコード

はてなにログインして、はてなカウンターのページを取得しています。

WebClinetではCookieが使用できない*1ので、@さんが下記エントリで書かれていたCustomWebClientをそのまま使わせてもらってます。

string html;
using (var wc = new CustomWebClient() { Encoding = Encoding.UTF8 }) { 
    wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

    wc.UploadString("https://www.hatena.ne.jp/login", "POST", "name=[はてなのID]&password=[パスワード]");

    html = wc.DownloadString("http://counter.hatena.ne.jp/[はてなのID]/report?cid=101&date=2014-08-24&mode=access");
}

XDocument xml;
using (var sgml = new SgmlReader() {IgnoreDtd = true })
{
    sgml.InputStream = new StringReader(html);
    xml = XDocument.Load(sgml);
}
var ns = xml.Root.Name.Namespace;
var count= xml.Descendants(ns + "table")
    .Where(x => x.FirstAttribute.Value == "totalcount")
    .Descendants(ns + "strong")
    .First().Value;
Console.WriteLine("2014-08-24のPVは {0} でした", count);

これで無料(共有)インスタンスに変更することができました(ホッ

*1:認証状態の保存に必要

VMware ESXi:Windows Server 2012の仮想マシンにて共有フォルダからファイルをコピーするとESXi自体が死ぬ件の対処方法

$
0
0

タイトル長いですね。そして「死んだ」だなんて怖いところですね。IT業界というところは。

あらまし

VMware ESXi上にWindows Server 2012仮想マシンを立てました。

その仮想マシンから、別の仮想マシンが共有しているファイルをローカルにコピーしようとすると、ESXi自体が下のような画面で落ちちゃいました。

f:id:nakaji999:20140826175513j:plain

ESXiが落ちるなんて今まで見たことなかったので、なかなかたまげました。

どうもそこそこサイズの大きいファイルをコピーしたときに発生する感じ。でも、100%再現する訳でもありません。

さすがにちょっと見て見ぬふりはできないなぁということで、調べてみました。

Knowledge Baseに何か載ってた

調べていると、以下の情報にたどり着きました。

現象

  • ESXi 5.x host fails with a purple diagnostic screen.
    (ESXi 5.x のホストが紫の診断画面になって死んじゃう)
  • ESXi host is running virtual machines using an E1000 or E1000e virtual network adapter.
    (ESXiホストは E1000 か E1000e のネットワークアダプタを使った仮想マシンを稼働している)
  • The purple diagnostic screen contains entries similar to:
    (紫の診断画面に以下に似た内容が表示される)
@BlueScreen: #PF Exception 14 in world wwww:WorldName IP 0xnnnnnnnn addr 0x0
PTEs:0xnnnnnnnn;0xnnnnnnnn;0x0;
0xnnnnnnnn:[0xnnnnnnnn]E1000PollRxRing@vmkernel#nover+0xdb9
0xnnnnnnnn:[0xnnnnnnnn]E1000DevRx@vmkernel#nover+0x18a
0xnnnnnnnn:[0xnnnnnnnn]IOChain_Resume@vmkernel#nover+0x247
0xnnnnnnnn:[0xnnnnnnnn]PortOutput@vmkernel#nover+0xe3
0xnnnnnnnn:[0xnnnnnnnn]EtherswitchForwardLeafPortsQuick@#+0xd6
0xnnnnnnnn:[0xnnnnnnnn]EtherswitchPortDispatch@#+0x13bb
0xnnnnnnnn:[0xnnnnnnnn]Port_InputResume@vmkernel#nover+0x146
0xnnnnnnnn:[0xnnnnnnnn]Port_Input_Committed@vmkernel#nover+0x29
0xnnnnnnnn:[0xnnnnnnnn]E1000DevAsyncTx@vmkernel#nover+0x190
0xnnnnnnnn:[0xnnnnnnnn]NetWorldletPerVMCB@vmkernel#nover+0xae
0xnnnnnnnn:[0xnnnnnnnn]WorldletProcessQueue@vmkernel#nover+0x486

処置方法その1

以下のバージョンでは解消されているようなので、アップデートするという方法があります。

  • ESXi 5.5 Update 1
  • ESXi 5.1 Update 2
  • ESXi 5.0 Patch ESXi500-201401001

処置方法その2

E1000シリーズの仮想アダプタを使用せず、VMXNET3 を使用する。

処置方法その3

ゲストOSにおいて、E1000仮想アダプタのRSSを無効にするか、RSSマルチキューを1にする。

自分がしたこと

VMXNET3 の仮想アダプタを追加して、E1000アダプタを削除しました。

これで幾つかファイルコピーしてみましたが、現象は発生しなかったので解決したと思われます。

雑な短縮URLサービスを作りました

$
0
0

この前、nkd.jpドメインを取得たことをブログに書きましたが、その一番の目的(?)であるオレオレ短縮URLサービスを作りました。

タイトルは酢酸生成のパクrオマージュによるものです。

f:id:nakaji999:20140829030542p:plain

くじけそうになったけど公開

4ステップでAzure Webサイトに独自ドメインを設定する - なか日記にて作成中の画面をチラ見せしたところ、酢酸先生から鋭い指摘を頂きました。というものの、まずは最低限使える状態になったので公開しちゃいます。

さすが酢酸先生

そんなこんなしている間に酢酸生成は短縮URLを組み合わせたこんなサービスを作成されててさすがだなぁと。

http://cdn-ak.f.st-hatena.com/images/fotolife/c/ch3cooh393/20140827/20140827024805.png

ソース

ウンコードって言われそうですが、ここに置いてます。

今後

  • どれだけクリックされたか見ることができる
  • WebAPIを公開

なんだかありきたりですね。 やっぱり何かと組み合わせないと面白くないかなぁ。

とりあえず、これからもぼちぼち手を動かしていきたいと思います。

私がブログを書く3つの理由

$
0
0

ブログを書いてる人はそれぞれどんな目的で書いてるんだろう。とふと思った。

photo by Rick Payette

私の場合、大きく以下の3つ。

  1. 自分のことを知ってもらう
  2. 物事を考える時間を持つ
  3. 人の役に立つ

1. 自分のことを知ってもらう

これが一番の目的。

ブログを書き、FacebookなりTwitterに情報を流すことで、自分がどんなことに興味を持ってて、どんなことをしてるか、何を考えているかなどを多少なりとも知ってもらう事ができる。

「アホやなーこいつ」とか思われても気にしない。

それによるメリットは以下の通り。

初対面の人への予備知識

勉強会等に参加する際、始めて会うけどオンラインでは既に知ってるという人が何人かいる事が多い。そんな人と話をする際、事前に自分のことを晒しておけば話のきっかけにもなるので相手も話しやすいと思うし、自分も話しやすい。

がんばらなくていい

背伸びしてブログを書くことはできないので、その時の考え方や知識がそのまま現れてくる。そうするとブログを書いてるのを知ってる人と話すのが楽になる。

簡単に言うと良いかっこをしなくて良い、知ったふりをしなくていい(できない)ということ。

自分のレベルを晒してるので今更良いかっこしようとしても無駄ということだ。

2. しっかり考える時間を持つ(考えを整理する)

ふと「○○についてブログ書こう」と思い、頭の中でイメージするものの、いざブログに書こうとするとなかなか筆が進まない*1ことが多い。それはうまく情報が整理できていないからだと思う。

今はPCの前に座って時間をかけて考えを整理したり、文章の書き方を考えたりしている。この時間は無駄ではないと思うが時間がかかりすぎるのでもっと訓練が必要。

3. 人の役に立つ

人の役に立つ情報を発信していきたいが、現状それほど役に立つ情報は発信できてない。

いまだに何年も前に書いた記事が多く読まれてたりするのだけれど、これは過去の自分に負けた気がして悔しい。

最後に

この記事も目的は「自分の事を知ってもらう」のが一番の目的。少しずつでもメッキを剥がしていく感じ。

ブログを書く3つの理由以外にもう一つ。承認要求ってやつ。やっぱりふぁぼられたりリツイートされたり、いいね!されると多少なりとも嬉しい。

でも、アドラー先生は「幸せになりたいなら、他人の目なんか気にするな。承認要求なんて捨てちまえ。」とおっしゃっていた気がするけど。

嫌われる勇気―――自己啓発の源流「アドラー」の教え

嫌われる勇気―――自己啓発の源流「アドラー」の教え

*1:筆は使わないが、こんな時はどんな言葉が適切なんだろう?

C#でDozensのAPIを叩いてDNSレコードを操作してみた

$
0
0

この間、Azure Webサイトに独自ドメインを設定する方法を書きました。

その中で、スタードメインの管理コンソールでDNSレコード弄ったよって事を書いたところ、@さんからAmazonのRoute 53っていうサービスを教えてもらいました。

なるほど!

ドメインのレコード管理をAPIで弄れたり、独自のALIASレコードなんてのがあるので、サイトの切り替え(本番とステージングを差し替える)とか、サイトの作成自体を自動化するとかそんな時に役立ちそうですね。

無知と思われても良いからブログに書いて公開してみるもんですね。いろいろためになることをいろんな人が教えてくれます。

勉強不足を痛感しながら、Route 53にレコード登録後、ネームサーバを変更して試してしまた。

で、気がついたんですが、Route 53ってお金いるんですね(

それはちょっとお父さんには厳しいなぁ。どーせ個人でちょこっと使うだけなので、スタードメインのに戻そうかしら?と思ってたら・・・

No1な方が教えてくれた

なんと、Dozensっていうのがあるのね。

というわけで、さっそく登録して切り替えたのでした。

ここからが本第

前置き長いですね。

せっかくなのでDozensのAPI使ってみようかなと試してみました。

本来ならPowerShellを使いたいところですが、一旦C#でえいやっと必要になりそうなAPIをちょっと動かしてみたソースが以下のものになります。

DozensのIDはもちろんですが、APIキーもアカウントを登録した段階で発行されています。これを使って認証すると、1日有効なトークンが発行されるので、後はそのトークンを使ってAPI叩いて下さいねってことらしいです。

C#でDozensのDNSレコードを操作する ref: http://qiita.com/nakaj ...

今度はPowershell

今回、DynamicJson使いましたがPowershellの場合はどうやってJsonを編集するのが良いのかなぁと思ってググってみたら@さんのブログに書いてありました。

なるほど、ConvertTo-Json,ConvertFrom-Jsonっていうのがあるんですね。これなら簡単そう。

ReSharperのライセンスが切れてたので更新した

$
0
0

先日、ReSharperが8.2.2に更新されてたので、寝る前にインストールしておきました。

そして今日、Visual Studioを起動すると、「ライセンスが6月で切れてんで。評価版にするか支払済ませてやー」と叱られてしまいました。

過去のブログによると、私はバージョン7のライセンスを買っていたようです。1年間のアップグレードサブスクリプションなので、その間のバージョンアップ(7→8)はインストールを許してくれたけど、今回はそうはいかんでということですね。

ReSharperのライセンス更新はライセンスが切れた翌日から1年間になります。私の場合だと6月18日に切れていたので、更新は2014年6月18日~2015年6月17日の間になりますので、更新手続きを伸ばしたところで何の得にもなりません。

というわけで、さっそく更新しました。投資対効果を考えて*1前回に引き続き「C# Edition」です。

なんでReSharperが必要なの?

私の場合、「クソコード書いてんじゃねぇ!もっとすっきりした書き方あるだろうが!氏ねー」なんて罵倒してくれる人がいないぼっち開発なのでとても重宝してます。

例えば、

dynamic record = records.Where(x => x.name == "test.nkd.jp").First();

なんて書いていると、ReSharperさんがそっと「あなた、そこはもっとシンプルに書けるのよ。ほら、見てご覧なさい。書き換えちゃう?」って優しく指摘してくれて、おまけに書き換えまでしてくれます。

f:id:nakaji999:20140904045732p:plain

局所的ではありますが、コードレビューしてくれてる感じ。ありがたいです。

その他にもいろいろ便利な機能がありますが、使いこなせてない感はぷんぷんしています。

誰かReSharper勉強会でもしてくれないかなぁ。松山で。

ReSharperについて

詳しいことは公式サイトで

日本語の情報もググってみると多少は出てくると思います。

お値段ですが、個人ユーザーならこんな感じ。

  • 新規購入
Full Edition$199
C# Edition$149
VB.NET Edition$149
  • ライセンスの切替、継続
Upgrade Full edition to 8.x$119
Upgrade C# or VB.NET edition to 8.x$89
Renew upgrade subscription for Full edition$119
Renew upgrade subscription for C# or VB.NET edition$89

ReSharper Essentials

ReSharper Essentials

*1:VB.NETは使わないという決意でもある


WebAPIのパラメータにstringの変数を指定してたら思ったようにバインディングしてもらえなかった件

$
0
0

WebAPIでこんな感じのメソッドを用意してました。

public HogeApiModel Post([FromBody]string message)

そんで、APIのテストしようとFiddlerからRequestBodyに「message=hogehoge」をセットしてPOSTするのですが、なぜかmessageにバインディングしてくれません。

Fiddlerの使い方が悪いん?とか悩むこと1時間、何気にググってみたら同じ事で悩んでる人がいました。

詳しい動作についてはここで説明されてるみたいですが、ごめんなさい。勉強不足で良く理解できません。MVCとはバインディング時の動作が違うんだなーくらいにしか…

結局

以下のようなリクエスト用のクラスを作って、

publicclass ApiRequestModel
{
    publicstring Message { get; set; }
}

こんな事しちゃいました。

public HogeApiModel Post([FromBody]ApiRequestModel requestModel)

これはあかんやろ

なんかよくわからんけど、こうやったら上手くいったのでそうしました」って、一番あかんやつですね。

ちゃんと勉強して原因(メカニズム)を理解しないとなぁ。

ASP.NET MVC 4 and the Web API

ASP.NET MVC 4 and the Web API

雑な短縮URLサービスに登録用のWebAPIを追加しました

$
0
0

この前公開した雑な短縮URLサービスに短縮URLを登録するWebAPIを追加しました。

使い方は以下の通りです。

短縮URLの登録

POST http://nkd.jp/api/ShortUrls

Request

url: 短縮したいURL

Sample

{
  "url": "http://nakaji.hatenablog.com/"
}

Response

Id: 通番
Original: 元のURL
Short: 短縮URL
Hash: URLの識別子
User: 常にnull
Counter: 参照された回数

Sample

{
  "Id":19,
  "Original":"http://nakaji.hatenablog.com/",
  "Short":"http://nkd.jp/129f5f",
  "Hash":"129f5f",
  "User":null,
  "Counter":0
}

ちなみに

同URLをGETすると登録されてる全URLの一覧が取ってこれたりします。

勉強不足

WebAPIのパラメータにstringの変数を指定してたら思ったようにバインディングしてもらえなかった件 - なか日記に書きましたが、本質を理解できてなくて余計な時間を取られました。一度通れば次は問題ない所だとは思いますが。

一応、下記サイトをさらっと目を通して最低限の知識は得ましたが、それでも設計や実装面でも悩むことが多いです。

悩ましい所

  • 設計面
    • どういう名前(URL)にするのがいい
  • 実装面
    • エラー時のレスポンスはHttpResponseMessageを返すのがいいのか、それともHttpResponseExceptionを投げるのがいいのか

実践あるのみだとは思いますが、自分が手を動かしていろいろ疑問を持った上で他の人が書いたコードを見るのが良いのかもしれないですね。

LINEでiTunesを買って欲しいと言われた件

$
0
0

世の中ではLINEが流行ってるみたいですね。私もIT技術者として時代の流れに乗るべくアカウント登録していますが、連絡を取り合う知り合いがいません。

あぁ、この感じ、どこかで感じたことがあるなぁと思い返してみると、招待がないと参加できなかった頃のmixiですね。友達がいなくて誰からも招待されなかったのは良い思い出です。

久しぶりに関西の友人から連絡があった

突然、「今都合がいいですか?」とメッセージが飛んできました。

何の警戒もせず、「なんでしょう?」と反応する私。友人に対して、この反応はちょっとどうなん?と自問自答しながら、何の話なんかなぁと想像を巡らせていました。

松山に遊びに来るとか?

もしかして、松山に引っ越そうと思うんだけど~なんて相談?

まさかまさか、結婚するんで式に来てなんてお誘いだったらどうしよう。でも、ここ数年合ってないしさすがにそれはないかなぁ

なんて考えながら待ってると返事が来ました。

「近くのコンビニでiTunesを買って頂けませんか」

違う意味でテンション上がるの巻

お、これってもしかして最近話題の乗っ取りってやつ?

とりあえず「乗っ取られてるでー」とスクリーンショットを友人に送った後、しばらく相手してもらって楽しい時間を過ごしました。

こういうときに気の利いたやりとりができる人ってすばらしいと思います。

f:id:nakaji999:20140908235059p:plain

そして、しばらくすると返事が返ってこなくなりました(友人が処置を行ったらしい)。

相手が誰であれ、突然返事が来なくなったら寂しいですね。なんだかフラれた時のような気持ちになりました。

そして平常運転へ

今日からはまた平常運転です。僕のLINEはAmazonさんからのお知らせしか来ません。

ASP.NET Identity:Twitter認証でログインする方法

$
0
0

ASP.NET Identity によりWebサイトへのログインをTwitterFacebook,Google+等の認証で行う事が簡単にできるようになってます。

f:id:nakaji999:20140911012329p:plain

実は、今まで使ったことなかったのですが、ちょっと真面目に使ってみようと思います。

諸事情により、今回はTwitterでの認証を行ってみたいと思います。

プロジェクトの作成

ASP.NETプロジェクトを作成します。

f:id:nakaji999:20140911015813p:plain

「認証の変更」で「個人ユーザー アカウント」を選択しておきます。

f:id:nakaji999:20140911015820p:plain

プロジェクトの作成が終わったら、一度デバッグ実行してポートを確認しておくといいと思います。

Twitterアプリの準備

まずはTwitterAPIが使えるようにアプリケーションを登録しておく必要があります。下記サイトにアクセスします。

アプリケーションの登録

トップページから「Create New App」ボタンを押してアプリケーションを作成します。

f:id:nakaji999:20140911020654p:plain

まずはデバッグ実行で確認するので以下のようにしておきます。アドレス部分を localhostにすると登録時にエラーになりますので、127.0.0.1にしておく必要があるので注意して下さい。

Website : http://127.0.0.1:64003/
Callback URL : http://127.0.0.1:64003/Account/ExternalLoginCallback

Callback URLについては、AccountControllerに用意されているメソッドが呼び出されてるようにしておきます。

Twitterでの認証を許可する

登録ができたら「Settings」タブの「Allow this application to be used to Sign in with Twitter」にチェックを入れておきます。

f:id:nakaji999:20140911021628p:plain

APIキー等を確認

次に「API Keys」タブを開いて API key と API secret の値を控えておく必要はないですが、後で参照するので気に留めておく程度でいいです。

Twitterでの認証を有効にする

App_Start\Startup.Auth.cs を開きます。

そして、以下のようにコメントアウトされているTwitterに関する部分を有効にして、consumerKey と consumerSecret に先ほど確認した API key と API secret の値をセットします。

// 次の行のコメントを解除して、サード パーティのログイン プロバイダーを使用したログインを有効にします//app.UseMicrosoftAccountAuthentication(//    clientId: "",//    clientSecret: "");//app.UseTwitterAuthentication(//   consumerKey: "",//   consumerSecret: "");//app.UseFacebookAuthentication(//   appId: "",//   appSecret: "");//app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()//{//    ClientId = "",//    ClientSecret = ""//});

こんな感じですね。

app.UseTwitterAuthentication(
   consumerKey:"{API key の値}",
   consumerSecret:"{API secret }");

動作確認

以上でやらないといけないことは終わりです。さっそく実行してみましょう。

画面右上の「ログイン」をクリックするとエントリの最初に貼り付けていた画面に遷移しますので、「Twitter」と書かれているボタンを押すと見覚えのある画面が表示されます。

f:id:nakaji999:20140911023532p:plain

「ログイン」ボタンを押すと呼び出し元のアプリケーションにリダイレクトされて以下の画面が表示されます。

f:id:nakaji999:20140911023724p:plain

Twitterで認証はしたけど、あくまでユーザ管理の基本はユーザID(メールアドレス)が必要ですよ。ということですね。

いわれるがままにメールアドレスを登録するとサイトへのログインが完了します。

f:id:nakaji999:20140911024326p:plain

ねっ、簡単でしょう?

次回*1はこの認証情報を使ってツイートしてみたいと思います。

*1:そのうち書くと思う

ASP.NET Identity:Twitter認証時の情報でツイートする方法

$
0
0

この前、Twitter認証する方法を紹介しましたが、今回はその時の情報からTwitterAPIを使ってツイートしてみたいと思います。

Access tokenとAccess token secretを取得する

前回Twitterアプリケーション登録時に発行されているAPI keyとAPI secretはもちろん必要ですが、これに加えてユーザ毎に払い出されるAccess tokenとAccess token secretが必要です。

Access tokenとAccess token secretは次の様なコードで取得することができます。

Startup.Auth.csの修正

認証時にTwitterからAccess tokenとAccess token secretが通知されますが、標準で用意されていたコードでは参照できません。以下のように認証が完了した際に一時的に保存してあげる必要があります。

//app.UseTwitterAuthentication(//   consumerKey: "{API key の値}",//   consumerSecret: "{API secret の値}");
var options = new TwitterAuthenticationOptions();
options.ConsumerKey = "{API key の値}";
options.ConsumerSecret = "{API secret の値}";
options.Provider = new TwitterAuthenticationProvider()
{
    OnAuthenticated = async (context) =>
    {
        context.Identity.AddClaim(new Claim("ExternalAccessToken", context.AccessToken));
        context.Identity.AddClaim(new Claim("ExternalAccessTokenSecret", context.AccessTokenSecret));
    }
};
app.UseTwitterAuthentication(options);

AccountController.csの修正

Access tokenとAccess token secretを一時的に保存しましたが、一連の認証動作が終わると捨てられてしまいます。その為、初回ログイン(ユーザ登録)時に以下のように永続化を行います。

public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
    if (User.Identity.IsAuthenticated)
    {
        return RedirectToAction("Index", "Manage");
    }

    if (ModelState.IsValid)
    {
        // 外部ログイン プロバイダーからユーザーに関する情報を取得します
        var info = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (info == null)
        {
            return View("ExternalLoginFailure");
        }
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
        var result = await UserManager.CreateAsync(user);
        if (result.Succeeded)
        {
            result = await UserManager.AddLoginAsync(user.Id, info.Login);
            if (result.Succeeded)
            {
                // ユーザ情報の登録が完了してから、AccessTokenとAccessTokenSecretを永続化する
                var claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
                var claims = claimsIdentity.Claims;
                foreach (var claim in claims)
                {
                    if ((claim.Type == "ExternalAccessToken") || (claim.Type == "ExternalAccessTokenSecret"))
                        await UserManager.AddClaimAsync(user.Id, claim);
                }
                // ここまで

                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                return RedirectToLocal(returnUrl);
            }
        }
        AddErrors(result);
    }

    ViewBag.ReturnUrl = returnUrl;
    return View(model);
}

動作確認してみる

Twitterからログインして、メールアドレスを入力、ユーザ登録が完了すると AspNetUserClaims テーブルに Access token と Access token secret が保存されていると思います。

f:id:nakaji999:20140912023340p:plain

後はこれを使ってツイートすれば良いだけですね。

Twitterアプリケーションの設定変更

Twitter Application Managementから、該当アプリケーションの Permission を「Read and Write」にしておく必要があります。

f:id:nakaji999:20140912023935p:plain

ツイートしてみる

CoreTweetのインストール

ツイートするためのライブラリはいつもの様に CoreTweet を使用しますので、 パッケージマネージャのコンソールから以下のコマンドでインストールを行います。

PM> Install-Package CoreTweet

ツイートする処理を書く

AspNetUserClaims テーブルに格納している Access token と Access token secret を使ってツイートします。

var usermgr = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var claims = await usermgr.GetClaimsAsync(User.Identity.GetUserId());

string accessToken = "", accessTokenSecret = "";

var firstOrDefault = claims.FirstOrDefault(x => x.Type == "ExternalAccessToken");
if (firstOrDefault != null) // TokenとTokenSecretはペアで登録されるのでnullチェックは片方のみ行う
{
    accessToken = firstOrDefault.Value;
    accessTokenSecret = claims.FirstOrDefault(x => x.Type == "ExternalAccessTokenSecret").Value;
}

var token = Tokens.Create("{API key の値}", "{API secret の値}", accessToken, accessTokenSecret);
token.Statuses.Update(status => "テスト");

参考

今回の方法は松崎 剛さんのブログを参考にさせて頂きました。細かい話についてはこちらを見て頂くのがいいと思います。

修羅イバーことはまもつ先生からのどごし生を頂いた件

$
0
0

九州でAzureといったらこの方しかいませんね*1

修羅イバーことはまもつ先生から「のどごし生」をプレゼントして頂きました。

はまもつ先生ありがとうございます!

いきさつ

TwitterのTLをなにげに見たら、「自転車の初心者といってプレゼントもらってたアカウントは実はBotだった」的な話を目にしました*2

「この手があったか!」と思い、自分も以下の様なやりとりをしたわけです。

ここで、この前作った雑な短縮URLサービスを使って、Amazonのほしい物リストを投稿しました。

どれくらいクリックされたかわかるので、「おお、50人がクリックした~」とか「100人超えた~」 とか楽しんでました。(この時点でのどごし生が欲しい云々は忘れて満足してた)

ヤマト運輸は突然に

そんなことがあったのもすっかり忘れてた15日の夕方、突然チャイムが鳴りました。

インターホンからは「ヤマト運輸で~す」の声。

妻からは「なにを買うたん」という冷ややかな言葉と視線。

「い、いや、なんも買ってないで」

特に思い当たる節がなくてもきょどってしまうのはなぜなんでしょうね。

玄関を開けるとお兄さんがのどごし生の段ボールを持って立ってました。

やりたいこと

せっかく頂いたプレゼントですので大事に頂きたいと思います。

ブログ書いたら1本飲んで良いとか、PV500超えた日は1本飲んで良い*3とか、楽しみながら消費したいですね。

それと、のどごし生の消費が楽しめるWebサービス作ってみたいです。残弾数を管理して、API公開するとか、ツイートするとか、Blogのサイトバーに表示するとかくらいしか思いつきませんけどね。

*1:九州の方をあまり知らない

*2:その時はチラ見だったけど、このことだったみたい

Twitterにて「ロードバイク初心者です!」←実はロードバイクをもらおうとする『ロードバイクくださいbot』だった模様 ぶる速-VIP

*3:この条件だといつ飲めるかわからんけど(現在最高400強)

「ブログを開設してから、もうすぐ10周年!!」らしい件

$
0
0

はてなブログじゃないですよ。

BIGLOBEで開設してたウェブリブログってやつで、こんなメールが届いてました。

○━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━●
           ブログを開設してから、もうすぐ10周年!!
●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━○

ウェブリブログに登録してから、あと2日で10周年になります。
ウェブリブログ事務局のまーさです。
ご利用いただき、ありがとうございます!

    雑記
      http://nkj.at.webry.info/


この10年間にあなたのブログで生み出された訪問回数は・・・

    908 件 になります。


過去のブログを振り返ると、昔の自分が考えたり感じていたことから
新たな気づきが生まれたりするものです。

  最初に書いた記事は "Kissデジ購入" でしたね
   http://nkj.at.webry.info/200409/article_1.html

ブログを始めてから、あなたのライフスタイルは変わりましたか?
ぜひ、今の思いをブログに記録しておいてください。

後で見直すと非常に貴重な記録になります。

いやー、懐かしいですね。

まだ結婚する前ですね。

相変わらず、物欲まみれですね。

そして、1ヶ月で更新が止まってるあたりなんて、自分らしいなぁと思います。

それにしても、BIGLOBEさんもなかなか切ないことを伝えてくれますね。

この10年間にあなたのブログで生み出された訪問回数は・・・

908 件 になります。

今のブログなら3日で更新する件数ですね。すばらしい。

太り具合の変遷

で、まぁ、太ってきた云々の記事があったので過去を振り返ってみました。

10年前:太ってきた。ヤバイ

8年前:自転車に乗り始めた

7年前:痩せてきた♪最大時(78kg)からマイナス15kgくらいに

5年前:仕事が忙しくて自転車に乗れなくなってきた。でも、それまでの貯金でなかなか太りにくい(気がする)

3年前:殆ど自転車に乗らなくなった(年に両手で数えられるくらい)

最近:太ってきた。ヤバイ

歴史は繰り返すのか…

あぁ、自転車ブログ*1更新してないなぁ…

*1:Yahoo!ブログで書いてたけど、気の迷いではてなに移行したっきり


IIS Expressでlocalhost以外のアドレスでアクセスする方法

$
0
0

Visual Studioデバッグ実行すると、デフォルトでは http://localhost:63543/みたいなアドレスでアクセスすることになりますよね。

しかし、OAuthのコールバック先として、localhostが指定できない場合など、localhost以外のホスト名でアクセスしたい場合もあると思います。

「hosts ファイル等で名前解決できるようにしてアクセスすれば良いだけでしょ」と思ったのですが、そうでもなかったのでブログに書いておきます。ちなみに、127.0.0.1でアクセスする場合にもこの処置が必要です。

hosts ファイルの編集

C:\Windows\System32\drivers\etc 配下にある hosts ファイルにアクセスしたいホスト名を登録します。

127.0.0.1    mydomain.com

IIS Express の applicationhost.config を編集

C:\Users[ユーザ名]\Documents\IISExpress\config 配下に格納されている IIS Express の構成ファイル(applicationhost.config)を編集します。

以下のように<binding protocol="http" bindingInformation="*:63543:mydomain.com" />を追記します。

<site name="WebApplication1"id="67"><application path="/"applicationPool="Clr4IntegratedAppPool"><virtualDirectory path="/"physicalPath="c:\users\nakaji\documents\visual studio 2013\Projects\WebApplication1\WebApplication1" /></application><bindings><binding protocol="http"bindingInformation="*:63543:localhost" /><binding protocol="http"bindingInformation="*:63543:mydomain.com" /></bindings></site>

URLの予約

このコマンドを実行しないと、管理者権限で起動した Visual Studio以外で IIS Express を起動できなくなります。

管理者で起動したコマンドプロンプトから以下のようなコマンドを実行します。

> netsh http add urlacl url=http://mydomain.com:63543/ user=Everyone

URL 予約を正常に追加しました

プロジェクトのURL変更

プロジェクトのプロパティで、プロジェクトのURLを変更しておきましょう。

f:id:nakaji999:20140919021305p:plain

やるべきことは以上

以上で設定は完了です。Visual Studioから実行して意図したホスト名でアクセスできていることを確認しましょう。

なんてえらそうなこと書いたけど

No1さん(@)としばやん(@)に教えてもらったことでした。

ミスターNo.1さん

しばやん

以前ブログに書かれてるのに気がついた。

みなさん、いつもありがとうございます

いつもいろいろ教えてくれてありがとうございます。おかげで毎日楽しく生きてます。

CoreTweetでPINコード使わずにTwitter認証する方法

$
0
0

CoreTweetでOAuthを使った認証をするサンプルが見当たらなかったのでブログに書いておきます。

個人的な経緯

Webサイトに何かメッセージを投稿すると同時にその内容をツイートをさせたい場合、どうするのが良いでしょう。

このウインドウを使えば簡単(そう)ですが、内容を変更できてしまうのでちょっと違う気がします。

f:id:nakaji999:20140919030054p:plain

結果、Webサイト(アプリケーション)を認証してもらって、メッセージの投稿から一連の流れでツイートさせるのが良いんじゃないかという結論に至りました。

そこで、以前書いたASP.NET Identityを使ってツイートする記事を使えば良いかなとも思ったのですが、この方法だとサイトに「ユーザー登録してもらわないといけない」ので利用する側としてはお手軽じゃないと思います。

結論:CoreTweetを使ってアプリを認証しよう

結局、CoreTweetを使ってTwitter認証する仕組みを実装することにしました。

実装サンプル

というわけで、サンプルコードです。

事前準備として、Twitter Application ManagementサイトにてTwitterアプリケーションの登録が必要です。その辺はググってもらうかBingってもらえればいろいろ情報が出てくると思いますので割愛します。

CoreTweetのインストールはパッケージマネージャコンソールからInstall-Package CoreTeweetで行えます。簡単ですね。

認証ページの呼び出し

登録したTwitterアプリケーション用に発行されたAPIキーとAPIキーシークレットを使用して、OAuthSessionインスタンスを取得します。

この時、認証完了後にリダイレクトするURLを指定します。このパラメータを指定しなかった場合、認証後にPINコードが表示されます。

また、このインスタンスに格納されている情報が後々必要になるので、セッション情報へ格納しておきます。

そして、認証ページにリダイレクトします。

publicclass AuthController : Controller
{
    public ActionResult Twitter(HomeIndexViewModel model)
    {
        var oAuthSession = OAuth.Authorize("{TwitterApiKey}", "{TwitterApiKeySecret}",
                                        "http://mydomain.com:63543/AuthCallback/Twitter");

        // セッション情報にOAuthSessionの内容を保存
        Session["OAuthSession"] = oAuthSession;

        return Redirect(session.AuthorizeUri.OriginalString);
    }
}

認証ページ

見慣れたこんな画面にリダイレクトされるので「連携アプリを認証」します。

すると、事前に指定したURLへリダイレクトされます。

f:id:nakaji999:20140921025738p:plain

リダイレクト先でアクセストークンの取得

リダイレクト時にパラメータとして oauth_token と oauth_verifier が渡されます。

トークンを取得する際、認証ページのURLを取得した際の情報と oauth_verifier を使用します。

publicclass AuthCallbackController : Controller
{
    public ActionResult Twitter(string oauth_token, string oauth_verifier)
    {
        // OAuthSessionインスタンスを復元
        var oAuthSession = Session["OAuthSession"] as OAuth.OAuthSession;
    
        var token = session.GetTokens(oauth_verifier);

        // token から AccessToken と AccessTokenSecret を永続化しておくとか、// セッション情報に格納しておけば毎回認証しなくて良いかもreturn Redirect("~/");
    }
}

あとがき

これだけのことするのに結構時間を食ってしまいました。言葉では「OAuth使って認証すれば良いじゃん」のひと言で済みますが、いざやってみるとわかっていない事がいろいろと明確になってきます。

しかし、そのおかげで次からはさくさくっと手が動く訳ですから、やはりいろいろ手を動かしとかないとなぁと感じた1週間でした(おい

ASP.NET MVC5関連本の発売ラッシュ(?)

$
0
0

以前、ASP.NETで生きていきますと高らかに宣言したものの、大した成果を出せてない今日この頃。

APRESSで買った「Pro ASP.NET MVC 5 (Expert's Voice in ASP.Net)」の進捗もひどい有様ですが、9月から10月にかけて何冊かASP.NET MVC5に関する本が発売されます。

次期バージョン(ASP.NET vNext)の話もちらほら聞きますが、今正式リリースされてるのはMVC5なので気にせず勉強しましょう。*1

ASP.NET MVC(エムブイシー)5実践プログラミング

こちらはもう発売されてますね。*2

プログラミングASP.NET MVC第3版 ASP.NET MVC 5対応版

プログラミングASP.NET MVC 第3版 ASP.NET MVC 5対応版

プログラミングASP.NET MVC 第3版 ASP.NET MVC 5対応版

こちらは2014年10月30日発売。「プログラミングMICROSOFT ASP.NET MVC (Microsoft Press)」の最新版ですね。

*1:しばやん先生もMVC5を勉強しておいても無駄にはならないと言ってました

*2:あれ、はてなブログの機能ではうまく表示されへんぞ

早起きは三文の得だったかもしれない話

$
0
0

こんなブログでも楽しみにしてくれてる人がいるってありがたいことですね。

3時に目が覚めた

たまたま昨日早く寝たので、今朝は3時頃目が覚めました。

そして、ASP.NET MVCで遊ぼう(タイムシフト予約した Fate/Zero後半を観よう)とPCの前に座ってTwitterのTLを見る*1と、なにやらKindleアスキーの技術書が285円で売ってるとかなんとか。

で、さっそくチェックしてみると、確かに285円になってる本がたくさん。

おお、これはありがたい!といろいろ物色してみるものの、いざ買うとなると285円とはいえ「あれもこれも買っちゃえー」とならないのは、きっと次のような理由からだと思います。

  • 原資が少ない
  • Kindleでコードって読みにくいじゃね?という不安
  • あれもこれも手を広げることへの不安(ASP.NET中心で行くって決めたのに)

それでも思い切ってポチったのがこれ。

JavaScriptもろくすっぽ勉強してないのにね。

そして現在

285円で買った本は900円になってました。他の本も285円じゃなくなってるみたいですね。

カドカワ祭りの設定ミスによるお祭りだったのかな?知らんけど。

とりあえず、早起きして良かった。

でも、Fate/Zeroは残り1時間を残して視聴期限切れになってしまったので、最後まで見ようとすると1,000円弱かかりそう。あれ、損してる気がする・・・

*1:ASP.NETもニコ動でもないやんか

自サイトのURLを取得する方法

$
0
0

Twitter認証後のコールバック先URLなど、自サイトのURLを指定することがあると思います。

Web.configにパラメータとして登録するという力技もありますが、環境を作る度に設定が必要なので面倒ですよね。なんか簡単な方法ないかなーというのでこんな感じでやっつけてみました。

Request.Urlを使う

ControllerクラスのRequest.Urlを使うことにしました。もちろん、HTTPないしHTTPSでの要求がないと使えません。

Url(Uriクラス)の情報は下記を参照して下さい。

その1

Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery, "");

AbsoluteUriにはhttp://mydomain.com:63543/Candidate/Timeline?userId=4e30969cのような値が格納されているので、 PathAndQueryに格納されている/Candidate/Timeline?userId=4e30969cの値で置き換えてやれば…という感じ。

ちょっとやっつけ感がひどいですね。

その2

string.Format("{0}://{1}", Request.Url.Scheme, Request.Url.Authority);

Schemeではhttp等のスキーム名が、Authorityにはmydomain.com:63543といったサーバ名とポート番号が取得できますのでこれを繋げてあげる感じ。

これならまぁいいかなーというのでこっちを使うことにしました。

所感

きっともっといいやり方があるはず。「そんな小細工せんでもこれ使えや」的な

追記(10/4) これがベストな方法だと思う

@さんが教えてくれました。ありがとうございます。

ちゃんとメソッドが用意されていたんですね。

すっきりしました!

Viewing all 848 articles
Browse latest View live