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

Kindle Paperwhiteが結構よかった件

$
0
0

30日返品キャンペーンがあるので「ちょっと試してみるか」なんて上から目線で注文して数日。

はい、もう返品する気ないです。

いいなーと思ったこととか、これは…と思ったことを幾つか挙げときます。

良かったところ

外でも読みやすい

会社に行ったふりして、定時まで公園で暇を潰すこととかよくあると思いますが、そんな時、気になる電子書籍を買ってその場で読むことができます。でも、スマホタブレット等の液晶は外で見るにはちょっと辛いですよね。映り込みとか、視野角とか。その点、Kindle Paperwhiteは外でも見やすいです。電子ペーパー様々ですね。

例えば、テーブルに置いてご飯を食べながら読書するなんていうのもふつーにできます。

バッテリーが長持ち

バッテリーのことを気にする必要が殆どないです。タブレットなら使わなくても数日おきに充電しないといけなかったり、自分の場合だといざ使おうとしたときにバッテリーがなかったりすることが多かったんじゃないかと思います*1

軽い

200gちょいしかないので、ゴロゴロしながら読む事もできます。仰向けになって読んでて、眠くなって顔の上に落としたとしてもそれほど大事にはならないと思います。

良かったところ(Kindleというプラットフォームに関して)

安く買える

大抵の電子書籍は紙の本よりも割引されて売ってます。日替わりや月替わりでセールしてたりもするので、あまり読まなかったな分野の本も「ちょっと買って読んでみようかな」って気になります。

同期が便利

外に出てる時のちょっとした時間の合間にスマホで読んで、家に帰ったらその続きはKindleで読んだりできるので、本を読む機会が多くなった気がします。その分、TwitterFacebookのタイムラインを追う時間が減ったかもしれません。

とはいっても、この辺はKinoppyでもできる事ですね。

これは…と思ったところ

プライムの無料本はKindle端末でしか読めない

プライムにはいれば毎月1冊無料で本が読めるので、プライム会員になってもすぐに元取れそうです。しかし、この無料本はKindle端末でしか読めないっぽいです。つまり、さっき書いた「スマホ<=>Kindle端末」という使い方ができない。

本を買いすぎる

紙の本に比べると安く、しかも手軽に買えてしまうので、本を次々と買ってしまいそうになります。私はいつの間にか積ん読が4冊くらいになっててこれはアカンと思ってるところ。

裸だと持ちづらい

自分が裸だとという意味ではないです。Kindle Paperwhiteを裸で持つとついつい手から滑り落ちそうになります。これは持ち方が悪いとか理由があるのかもしれませんが、落としそうなので電車の中で立った状態では怖いかなぁという気がします*2

スマホとページ送りのインターフェースが若干違う

スマホKindle端末を行ったり来たりすると少し気になるかもしれません。スマホはフリックもしくは画面の端をタッチすることでページ送り(戻し)する様になっていますが、Kindle Paperwhiteは画面の左端から3/4くらいまでの範囲をタッチするとページ送り、右から1/4くらいの範囲をタッチするとページ戻しになります。

私は画面の真ん中当たりをタッチしてページ送りするのですが、Kindle Paperwhiteの操作に慣れた状態でスマホ版を使用すると、画面の真ん中をタッチしてしまいページ送りではなくメニューが表示されてむぐぐ・・・という事が多いです。

まとめ

まぁ、なんだかんだ言いつつ、すっかり気に入って使ってます。

一番は電子ペーパーが読みやすいってことですかねぇ。Kinppyならソニー Reader使えば良いのかと今気がつきました。でも買うにはちょっと勇気がいるかなぁ*3

Kindle Paperwhite(ニューモデル)

Kindle Paperwhite(ニューモデル)

*1:Surface RTはいつもそんな感じ。Androidタブレットは持ってないから知らん

*2:自分は電車に乗らないのであまり問題ないけど

*3:その前に、今は予算がないですが


ブログ等で「```」を入力すると画面中央にグルグルした何かが表示される

$
0
0

はてなブログQiita等のMarkDownが使えるサービスでソースコード等を記載する際、「```」を使うと思います。

Chromeに限った話なのかもしれませんが、「```」を入力すると画面にこんなのが表示されるようになりました。

f:id:nakaji999:20140724005839p:plain

なんぞこのグルグルは?と思いながらしばらく待っても消える気配がありません。何より、それ以降文字の入力ができなくなります。

原因

Evernote Web Clipperが影響してました。

オプションを見るとショートカットにこんなのが・・・

f:id:nakaji999:20140724010220p:plain

Webクリッパーの起動ショートカットが「`」に割当たっていますが、確認したところ連続して2回入力するとWebクリッパーが起動します。

Markdown使用する際には連続で3つ入力しますが、そうすると動作がおかしくなって先のグルグル画面のままになってしまうようです。

というわけで、ショートカット使ってまでクリップしまくらない私はサクッと「キーボードショートカットを有効にする」のチェックを外しました。

GoogleMapでクリックされた位置を取得する

$
0
0

ASP.NETに直接関係ないけど、カテゴリーはASP.NETにしておきます(意味不明)。

イベントサイト等で会場の地図を載せますよね。

そんな時、裏のメンテナンス画面で地図を表示するための情報を登録する事になりますが、そこで緯度経度を入力させたり、Googleマップで作成したiframeタグを入力させるのはさすがにかっこ悪いです。

というわけで、Google Maps JavaScript API v3を使用して位置情報を取得しましょう。

書いてる内容は公式サイトのサンプルをちょこっといじった程度ですけどね。

画面サンプル

クリックした地点の緯度と経度の情報がテキストに表示されます。

f:id:nakaji999:20140724003036p:plain

コードサンプル

コードについてはこんな感じ。

@{
    Layout = null;
}

<!DOCTYPE html><html><head><title>クリックされた位置を取得する</title><metaname="viewport"content="initial-scale=1.0, user-scalable=no"><metacharset="utf-8"><style>html, body, #map-canvas{height: 500px;
            width: 500px;
            margin: 20px;
            padding: 20px;
        }</style><scriptsrc="~/Scripts/jquery-1.10.2.js"></script><scriptsrc="https://maps.googleapis.com/maps/api/js?v=3.exp"></script><script>        $(function(){            google.maps.event.addDomListener(window, 'load', initialize);function initialize(){var mapOptions = {                    zoom: 15,                    center: new google.maps.LatLng(Number($("#latitude").val()), Number($("#longitude").val()))
};var map = new google.maps.Map($("#map-canvas")[0], mapOptions);var marker = new google.maps.Marker({                    position: map.getCenter(),                    map: map});                google.maps.event.addListener(map, 'click', function(e){var loc = e.latLng;                    marker.setPosition(loc);                    $("#latitude").val(loc.lat());                    $("#longitude").val(loc.lng());});}});</script></head><body><inputid="latitude"type="text"value="33.8391574" /><inputid="longitude"type="text"value="132.76557520000006" /><divid="map-canvas"></div></body></html>

やってることはシンプルで、

  • 地図を緯度/経度を指定して初期化し、地図の中心にマーカーを置く
  • 地図のクリックイベントでマーカーの位置をクリックされた地点にセット&テキストに緯度経度情報を表示

たったこれだけですけど、JavaScriptど素人にはなかなか・・・

GoogleMapで住所などから位置を取得して表示する

$
0
0

この前投稿したやつに関連して

前回ので自分でマップをクリックして位置情報が取れるようになりましたが、予め住所や施設名がわかっている場合はそれを入力してサクッと位置を特定したいですよね。

画面サンプル

f:id:nakaji999:20140724013149p:plain

コードサンプル

前回のコードは引き継いでません。

@{
    Layout = null;
}

<!DOCTYPE html><html><head><title>住所などから位置を取得する</title><metaname="viewport"content="initial-scale=1.0, user-scalable=no"><metacharset="utf-8"><style>html, body, #map-canvas{height: 500px;
            width: 500px;
            margin: 20px;
            padding: 20px;
        }</style><scriptsrc="~/Scripts/jquery-1.10.2.js"></script><scriptsrc="https://maps.googleapis.com/maps/api/js?v=3.exp"></script><script>        $(function(){var map;var marker;var geocoder;            google.maps.event.addDomListener(window, 'load', initialize);function initialize(){var mapOptions = {                    zoom: 15,                    center: new google.maps.LatLng(Number($("#latitude").val()), Number($("#longitude").val()))
};                map = new google.maps.Map($("#map-canvas")[0], mapOptions);                marker = new google.maps.Marker({                    position: map.getCenter(),                    map: map});                geocoder = new google.maps.Geocoder();}            $("#geocode").click(
function(){var address = $("#address").val();                    geocoder.geocode({'address': address }, function(results, status){if(status == google.maps.GeocoderStatus.OK){var loc = results[0].geometry.location;                            map.setCenter(loc);                            marker.setPosition(loc);                            $("#latitude").val(loc.lat());                            $("#longitude").val(loc.lng());}else{alert('Geocode was not successful for the following reason: ' + status);}});});});</script></head><body><inputid="latitude"type="text"value="33.8391574" /><inputid="longitude"type="text"value="132.76557520000006" /><divid="panel"><inputid="address"type="text"value="愛媛県松山市"><inputtype="button"value="Geocode"id="geocode"></div><divid="map-canvas"></div></body></html>

Geocoderクラスのgeocodeメソッドを使用するのがポイントですね。

GoogleMapで地図の倍率を取得する

$
0
0

今週はGoogle Maps JavaScript API v3を使ってゴニョゴニョしていました。

きっかけは「イベントの検索サイト等で会場の地図を(Googleマップで)表示させたい」→「メンテ画面でGoogleマップを使ってポイントを設定したいなぁ」というところから始まりました。

今回は地図の倍率を取得する方法です。

わざわざブログに書くほどの事かい?という気はしますが、気にせず投稿します。

画面サンプル

f:id:nakaji999:20140725235113p:plain

コードサンプル

地図の倍率が変更されたタイミング(zoom_changedイベント)でMapクラスのgetZoom()メソッドで倍率を取得します。

@{
    Layout = null;
}

<!DOCTYPE html><html><head><title>地図の倍率を取得するサンプル</title><metaname="viewport"content="initial-scale=1.0, user-scalable=no"><metacharset="utf-8"><style>html, body, #map-canvas{height: 500px;
            width: 500px;
            margin: 20px;
            padding: 20px;
        }</style><scriptsrc="~/Scripts/jquery-1.10.2.js"></script><scriptsrc="https://maps.googleapis.com/maps/api/js?v=3.exp"></script><script>        $(function(){            google.maps.event.addDomListener(window, 'load', initialize);function initialize(){var mapOptions = {                    zoom: Number($("#zoom").val()),                    center: new google.maps.LatLng(33.8391574, 132.76557520000006)
};var map = new google.maps.Map($("#map-canvas")[0], mapOptions);                google.maps.event.addListener(map, 'zoom_changed', function(e){                    $("#zoom").val(map.getZoom());});}});</script></head><body>地図の倍率:<inputid="zoom"type="text"value="15"/><divid="map-canvas"></div></body></html>

「『納品』をなくせばうまくいく」出版記念会 〜 ビール片手に倉貫さんと語る会に参加

$
0
0

「『納品』をなくせばうまくいく」出版記念会 〜 ビール片手に倉貫さんと語る会に参加して来ました。

「『納品』をなくせばうまくいく」出版記念会 〜 ビール片手に倉貫さんと語る会

「ドリンク、軽食付き。アルコールの持ち込み大歓迎!」ということでしたので、会場近くのエルベ24で缶ビールを6本買っていきました。

倉貫さんの話を聞いて

プログラマとして働き続ける為にはという感じのテーマで話してもらいました。その中で自分なりの解釈とか心に残ったことを書き散らかしておきます。

※倉貫さんの伝えたい事とずれてる可能性はあります

プログラマとは

ここでいうプログラマというのはSI界隈でいうコーディングするだけの「PG」ではなく、事業を理解した上で提案、開発、運用までシステム開発の全のフェーズをカバーできるスキルを持った人。

これだけ聞くと「中小零細企業プログラマは大体一人で全部やってるから、それと同じもんじゃない」と思われそうだけど、何か違う気がします。技術力?ビジネスマインド?なんだろう。

契約は定額制

大きい会社も小さい会社も全て同じ月額料金で契約する。定額の中でできる範囲でお客さんに価値を提供する。

できる範囲というのが特徴的だなぁと思いました。毎週の成果を約束しないことでプログラマの消耗を防ぐことに繋がってるんだと思います。ただ、毎週目標を達成できないでいるとお客さんの満足度は下がるし、お客さんの事業にも影響が出てくると思うのでそこはきちっとしとかないとマズいはず。(「契約を継続して貰う事」つまり「お客さんのビジネスがうまくいく事」というソニックガーデンの目的が達成できなくなる)

そう考えると中途半端な技術力ではこのビジネスモデルを成立させるのは難しいと思います。しかし、既存の人月ビジネスで発生する「時間をかけた方が儲かる(技術力が高いと儲からない)」というジレンマは発生しないので、プログラマにとってはやり甲斐のある環境といえるでしょう。(自分の技術力向上が会社の利益に繋がるという意味でも)

わかったこと

自分の言葉では全然うまく表現出来ません。詳しくは倉貫さんのブログや本*1を読んでもらうのがいいと思います。

参加して感じたこと

高い技術力だけでなく、ビジネススキルも求められる本当の職人集団だと改めて感じました。

今回、ギルド参加を目指して訓練されてる方にお会いしたのですが、目をキラキラさせて「考え方とか技術とかすごく勉強させてもらってます」と話されていたのが印象的でした。

最後に倉貫さんのブログから印象的な文を引用させてもらって終わりにしたいと思います。

小さな会社と幸せな働きかた ~ これからのリーダーに必要な思考と行動のヒント | Social Change!

急拡大を目指すのではなく、お互いのことをわかりあって、尊敬しあえる仲間たちと共に、楽しく働き、豊かに暮らす。そんな働く人の幸せを実現するための環境として会社があるという考えかたです。英語での「カンパニー(company)」の語源は、「パンを分け合う仲間」ということからきてると言います。目の前のパンを分け合える程度の大きさの会社が理想ではないでしょうか。

今回、企画・運営して頂いた方々へ~短い時間でしたが、すばらしい時間をありがとうございました。

「納品」をなくせばうまくいく ソフトウェア業界の“常識

「納品」をなくせばうまくいく ソフトウェア業界の“常識"を変えるビジネスモデル

私がASP.NETを選択した理由

$
0
0

思い返せば、今までいろんなものに目移りしてきた。

アプリでいうと、Webアプリ、WindowsPhoneアプリ、Androidアプリ、WPFSilverlight等に手を出した。

言語ならC#JavaPHPRubyといったところだろうか。*1

そんなことを振り返って、感じたのは「なんだ、結局どれも中途半端で何も身になってないじゃないか」

いろいろ手を出してきた理由

大きく3つくらいあるかなと思う。

1. 他人に影響されて

勉強会やSNSで知り合った人がその分野に詳しい場合に「自分もああなりたい(少しでも近づきたい、話ができるようになりたい)」って手を付けるパターン。

そういう人は遙か上のレベルにいるので、ちょっと勉強したくらいではそこに到達することはできない。少しは近づけるのかもしれないが、肩を並べて話ができるようになったためしがない。

2. 今後の仕事のことを考えて

「これは仕事で役に立ちそう(役に立つかも)」と思って手を出すパターン。

役立ったことは大いにあるけど、逆も然り。CakePHPでいうと「会社でPHP使ってるんだったら、フレームワーク使って効率化せなアカンでしょ」という思いで勉強したけど、仕事でそんなにPHP使うことがなかった。おまけに、PHPが好きになれなかったのが致命的。

3. 愛

「これは知っときたい」とか、「知っとかなきゃダメでしょ」と思って手を出すパターン。好きだから、とか義務感に近いものもあるかもしれない。

自分の場合、C#を始め、Microsoftの技術についてはこの思いが強いかな。*2

お父さんの決意

広く浅い知識も必要ですが、如何せん広く浅いだけで終わってるのは自分としてはいかんと思う。

そこで「選択と集中」を意識することにした。

ASP.NETに関する分野でがんばる

Microsoftの技術でいうと、Windowsストアアプリ等もありますが、あえて目を背けることにする。 それと、ASP.NETとは言ってもWeb Formは個人的に好きになれないので敬遠。

ASP.NETな理由

1. C#が好きだから

C#だけじゃなくてVisual Studioも好き。せっかくなら自分が好きな道具を使いたいよね。

2. ステキな人がいるから

ASP.NET界隈には抱かれてもいいステキな人がたくさんいる*3。誤解されるといけないけど「自分もああなりたい(少しでも近づきたい、話ができるようになりたい)」っていうこと。

いつも素人の疑問に答えてくれてありがとうございます。

3.お布施してるから

MSDNライセンスね。

4. 今後役立ちそうだから

WebFormはアレですが、それ以外は他の言語、フレームワーク等でも基本的な考え方は応用できるんじゃないかと思う。

選択と集中」するリスクや課題

特にない気がする。

広く浅い知識があるだけで、何もできないより。特定分野で何かできた方がいいと思うし、一つのことをしっかりやっておいた方が他への応用も利くと思う。

お仕事に繋がるかどうかという意味では会社でASP.NET MVCとか言っても、「ハァ?何それ?」って反応だけどそこは布教していくかどうにかすればいいだけのこと。

最後に

そんなわけで、ASP.NETラブな痛いおっさんキャラでいきますのでよろしくお願いします。

*1:関数型言語(F#、Scala)については本を買ったものの全く読めてない

*2:思いと実際にキャッチアップできてるかは別の話

*3:もちろん他の分野にもそう思える人はたくさん居る

VisualStudio:GitHub等に恥ずかしい設定(アクセストークンなど)をアップしないようにする方法

$
0
0

どこかで見かけた気がするのですが、忘れたので自分で設定してみてその結果を残しておきます。

経緯

「ちょっと面白いもん作ったぜ!みんな見てみてー」とGitHubやBitbucketにソースをアップしたものの、Webサービスのアクセストークン等がべた書きされてて違う意味でアピールしちゃったなんてことになると悲しいですね。

だからといって、公開するソースにいちいちマスクするのは面倒ですね。

そんな時、今回紹介する方法で丸っと解決しましょう。

Web.config(App.config)を使う

ハードコーディングはやめて少なくともWeb.configを使いましょう。ただ、Web.config本体には公開しても問題ないようにマスクした内容にしておきます。

  • Web.config
<configuration><appSettings file="D:\秘密の設定\local.config"><add key="consumerKey"value="*****" /><add key="consumerSecret"value="*****" /><add key="accessToken"value="*****" /><add key="accessSecret"value="*****" /></appSettings></configuration>

ポイントはappSettings要素にfile属性で別のファイル(例ではlocal.config)を指定します。このファイルの中に書かれた内容が優先して使用されます。

  • local.config
<appSettings><add key="consumerKey"value="本来の値" /><add key="consumerSecret"value="本来の値" /><add key="accessToken"value="本来の値" /><add key="accessSecret"value="本来の値" /></appSettings>

file属性を指定した要素(appSettings)から書き始める必要があります。*1

もちろん、local.configはバージョン管理対象外となるように別のパスに置いておくか、.gitignoreに入れておくかしておく必要があります。

これで恥ずかしくない

これでローカルで実行する際にはlocal.configに書いた内容が使用され、GitHubにはマスクした内容がアップされるようになりました。

ちなみに、file属性で指定したファイルがなくてもエラーにはなりません。

Azure Webサイトにデプロイする場合

これに加えて、Azure Webサイトにデプロイする場合はどうするかというと、Webサイトの「アプリケーションの設定」で上書きしてあげます。

f:id:nakaji999:20140807005412p:plain

*1:書き方に問題があれば実行時にエラーになります


Microsoft Azure WebJobを使って前日の PV をツイートするコードを書いてみた

$
0
0

この前、しばやんが以下のブログを書いてるのを見て、「よし、自分もやってみよう」と思ってからはや4日。一通り形になった(気がしただけだった…)のでブログに書き残しておきます。

準備

まずはVisual Studio 2013 Update3を適用しましょう。

その他にGoogle AnalyticsAPITwitterAPIの設定が必要ですが、その辺のことはしばやんのブログを見てもらったらいいと思います。

Microsoft Azure WebJobプロジェクトの作成

Visual Studio 2013 Update3から作成できるようになったMicrosoft Azure WebJobテンプレートを使ってプロジェクトを作成します。

f:id:nakaji999:20140807234510p:plain

必要なパッケージのインストール

NuGetで以下のパッケージをインストールしておきます。

上記リンクを見るのが面倒な人はパッケージマネージャコンソールで以下のコマンドを実行して下さい。

PM> Install-Package Google.Apis.Analytics.v3
PM> Install-Package CoreTweet

コード

面倒なのでstaticおじさんな感じでべたっと書きます。Google AnalyticsAPI周りははっきり言ってしばやんの丸パクリです。

using System;
using System.Configuration;
using System.Security.Cryptography.X509Certificates;
using CoreTweet;
using Google.Apis.Analytics.v3;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;

namespace TweetPV_WebJob
{
    // To learn more about Microsoft Azure WebJobs, please see http://go.microsoft.com/fwlink/?LinkID=401557class Program
    {
        staticvoid Main()
        {
            try
            {
                var analyticsKeyFile = GetSettings("analyticsKeyFile");
                var certificate = new X509Certificate2(analyticsKeyFile, "notasecret", X509KeyStorageFlags.Exportable);

                // Scopes は指定しないとエラーになる
                var analyticsCredentialId = GetSettings("analyticsCredentialId");
                var credential =
                    new ServiceAccountCredential(new ServiceAccountCredential.Initializer(analyticsCredentialId)
                    {
                        Scopes = new[] { AnalyticsService.Scope.Analytics, AnalyticsService.Scope.AnalyticsReadonly }
                    }.FromCertificate(certificate));

                // HttpClientInitializer に credential 入れるのは違和感あるけど正しいらしい
                var service = new AnalyticsService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "TweetPV",
                });

                // Azure は UTC なので +9 時間して -1 日
                var date = DateTime.UtcNow.AddHours(9).AddDays(-1).ToString("yyyy-MM-dd");

                // ****** はメモしたビューの ID
                var analyticsViewId = GetSettings("analyticsViewId");
                var task = service.Data.Ga.Get("ga:" + analyticsViewId, date, date, "ga:pageviews").ExecuteAsync();
                task.Wait();

                var pv = int.Parse(task.Result.Rows[0][0]);
                var message = string.Format("昨日のなか日記のPVは {0} でした", pv);

                var consumerKey = GetSettings("consumerKey");
                var consumerSecret = GetSettings("consumerSecret");
                var accessToken = GetSettings("accessToken");
                var accessSecret = GetSettings("accessSecret");

                var token = Tokens.Create(consumerKey, consumerSecret, accessToken, accessSecret);
                token.Statuses.UpdateAsync(status => message).Wait();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
            }
        }

        publicstaticstring GetSettings(string key)
        {
            var value = Environment.GetEnvironmentVariable(key);
            try
            {
                if (!string.IsNullOrWhiteSpace(value)) returnvalue;

                value = ConfigurationManager.AppSettings[key];
                returnvalue;
            }
            finally
            {
                Console.WriteLine("{0}:{1}", key, value);
            }
        }
    }
}

Azure WebJobプロジェクトはローカル環境ではコンソールアプリケーションとして実行できます。コンソールアプリケーションと何が違うの?と言われると、正直違いはないと思います。Azure WebJobとして発行できるかどうかの違いじゃないでしょうか。

ちなみに、アクセストークン等の設定は先日書いたブログ+αの処置をしてます。

configファイルから設定読み込むだけで良いはずなのに何で環境変数まで見ているのかは、この後で説明します。

App.configはこんな感じ。

<?xml version="1.0" encoding="utf-8"?><configuration><appSettings file="D:\Visual Studio 2013\秘密の設定\TweetPV_WebJob\local.config"><add key="analyticsKeyFile"value="key.p12" /><add key="analyticsCredentialId"value="*****@developer.gserviceaccount.com" /><add key="analyticsViewId"value="99999999" /><add key="consumerKey"value="*****" /><add key="consumerSecret"value="*****" /><add key="accessToken"value="*****" /><add key="accessSecret"value="*****" /></appSettings> ~略~
</configuration>

Azureに発行する

そして、Azureにデプロイするわけですが、Webサイトの作成からWebJobの設定まで全てVisual Studioでできちゃいます。

ソリューションエクスプローラのプロジェクトを右クリックして「Azure WebJobとして発行する」を実行します。

f:id:nakaji999:20140808001901p:plain

するとウィザードが起動して、発行するWebサイトの指定(新規作成も可)やWebJobの設定ができるようになります。

f:id:nakaji999:20140807234435p:plain

ちょっとした問題

アクセストークン等の秘密の設定についてちょっと悩みました。Webサイトの場合はアプリケーション設定で上書きすればいいよねーという事を書きましたが、WebJobはWebサイト上で動くexeなんですよね。なので、ConfigurationManagerのAppSettingsではアプリケーション設定に書いた値を取ってくることができません。

そこで、Visual Studio Onlineのコンソールで遊んでいるとアプリケーション設定に書いた内容が環境変数に反映されているのを発見。

f:id:nakaji999:20140808005637p:plain

そこで先ほどのソースに戻りますが、Azure上では環境変数に設定されている値を使用して、ローカルではApp.configの値を使用する様な小細工をしたわけです。

ここまで書いて気がついた

スケジュール実行する場合には「WebJobs-[リージョン]」という名前でスケジューラが作成される様なのですが、西日本リージョンでは動いてないようです。

f:id:nakaji999:20140808010623p:plain

スケジューラ単体で作成(スクリーンショットでは「TweetPV」)した場合は動いているみたいなので、西日本はWebJobsに対応してないのかなぁ。

と思って、米国西部にデプロイしてみたけど同じだった…にわかにはこれ以上難しいので、えらい人に教えてもらおうと思います。

Azure Webサイトとスケジューラーを使って前日の PV をツイートする仕組みを作ってみた

$
0
0

先日「 Microsoft Azure WebJobを使って前日の PV をツイートするコードを書いてみた - なか日記」というエントリを書きましたが、これは結局うまくスケジュール起動させることができませんでした*1

実はれより前に考えていた仕組みがありまして、それでは思った通りのことができてたのでそれを紹介しようと思います。

基本的なコードは先日のブログとほとんど変わらないのでブログには載せずにGitHubリポジトリに上げときます。

方式

一言でいうと、Microsoft Azure上で「スケジューラからWebサイトのWebAPIをつんつんする」方式です。

1.Azure Webサイト上にWebAPIを公開する

要求を受けるとその中で昨日のPVを取得し、ツイートする。というAPIを作成します。

例えば、 http://[適当な名前].azurewebsites.net/api/TweetPV をGETするとPV取得してツイートする感じです。

2.スケジューラで設定

定期的に上記APIをたたくようにスケジューリングします。

例えば、こんな感じ。

f:id:nakaji999:20140808233927p:plain

まとめ

昨日の記事が中途半端だったので、一応こんなやり方で定期的にツイートできるよっていう紹介してみました。

もちろん、このやり方が全てではないし、他にもっと良いやり方があると思います。

でも、これだとGitHub等からデプロイ連動できるし、他にツイートしたいことがあればAPI増やせば良いだけだし、結構良いんじゃないかなぁと個人的には感じてます。

もっと勉強します。楽しいです。それでは、また。

*1:やり方が間違ってるという可能性は大いにありますが

Azure PowerShellを使うための下準備

$
0
0

Azure PowerShellを使用すると、PowerShellでAzureのいろんな操作が行えるようになります。

Azure PowerShellは標準ではインストールされていないので、WebPI*1を使用してインストールする必要があります。

小話

先日、このブログのPVをツイートする仕組みを作っのですが、

それに前後して酢酸先生もブログを書かれてて、

その結果、

さすがですね。1500PVなんてスゴイです。

そして、二人ともツイートする時間は0:05に設定されている様です。

ちょっと恥ずかしいやないの

人の役に立つ記事が少ないのでPVが少ないのはしょうがないですが、この二人のPVを見るとちょっと気後れしちゃいますね。

というわけで、ツイートする時間を変えようと思いました。

よーし、お父さんも0:05にツイートしちゃうぞ

というわけで、この前しばやんがブログに書かれてた方法でスケジューラの変更をすることにしました。

ここからが本第

前置き長すぎますね。まぁ、日記なのでカンベンして下さい。

しばやんのブログをまるパクリして設定しようとしたのですが、

PS C:\> $startTime = [DateTime]::Parse("2014-08-09T15:05:00Z");
PS C:\> Set-AzureSchedulerHttpJob -Location "Japan West" -JobCollectionName nakaji-api -JobName tweetpv -StartTime $startTime
Set-AzureSchedulerHttpJob : No current subscription has been designated. Use Select-AzureSubscription -Current <subscriptionName> to set the current subscription.
発生場所 行:1 文字:1
+ Set-AzureSchedulerHttpJob -Location "Japan West" -JobCollectionName nakaji-api - ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Set-AzureSchedulerHttpJob]、Exception
    + FullyQualifiedErrorId : Microsoft.WindowsAzure.Commands.Scheduler.SetSchedulerHttpJobCommand

サブスクリプション指定してないやないか。コラッ」ってエラーになっちゃいました。

最初にAzureへの認証をしましょう

そりゃそうだわなって話ですね。

というわけで、以下の様なコマンドで設定しました。

#認証
Add-AzureAccount

#アカウントで管理してるサブスクリプションの一覧を表示
Get-AzureSubscription

#サブスクリプションを選択する
Select-AzureSubscription -Current

#スケジューラの時刻を変更する(しばやん先生のまるパクリ)

# 開始時間の DateTime を作成(めんどくさいから Parse してる)
$startTime = [DateTime]::Parse("2014-08-09T15:05:00Z");

# 必須なのは Location / JobCollectionName / JobName
Set-AzureSchedulerHttpJob -Location "Japan West" -JobCollectionName nakaji-api -JobName tweetpv -StartTime $startTime

こんへんに情報載ってましたね。

明日が楽しみだ

f:id:nakaji999:20140809011612p:plain

明日からしばやん、酢酸先生と同じタイミングでツイートします!!(たぶん)

*1:Microsoft Web Platform Installer

Amazonプライムをうっかりしたけど良い対応してもらった件

$
0
0

この前*1Kindle Paperwhiteを買った時に「プライム会員なら月に1冊無料で本が読める*2」というのに興味があって、無料お試ししてました。

そうしたところ、先日カードの利用通知にプライム会員年会費の請求がきてました。

「あれれ、確認したつもりだったのに自動的に有料会員に移行しちゃった(」と思いながら何気に呟いてみたところ、Amazonカスタマーサービスさんから連絡を頂きました。

最初は、「年間3900円なので、単純計算だと月平均330円くらいの本を選んでたら元は取れるのでまぁまぁお得なんかなぁ。おまけにお急ぎ便も使えるし。」なんて考えてたのですが、以下の様な個人的な問題があったので今回は一旦キャンセルさせてもらいました。

キャンセルした理由

1. 無料本を探すのが面倒

Kindle端末から探す必要がある*3のですが、Paper Whiteは画面の表示速度が早くないのでまぁまぁストレスを感じます。なので、無料とはいえ読みたい本を探すのが結構面倒くさい。

2.お急ぎ便があまり意味をなさない

関東や関西ならその日のうちに届いたりするのかもしれませんが、ここは四国です。注文時のお届け予定日を見る限り、通常でもお急ぎ便でも変わらなかった*4ので、このメリットは殆どないなぁという感じでした。

でも感謝してます

この連絡をもらう前に実は商品をポチってたんです。もちろんお急ぎ便でw

ということは、「特典を利用されていない場合は」という条件を満たしませんね。

こりゃ、キャンセルは無理かなぁと思いながら手続きしてみると・・・

f:id:nakaji999:20140809221727p:plain

お、月割りで返金してくれるの???

というわけで、ありがたくキャンセルされてもらいました。

どうでもいいけど

同じ日に自分と同じことつぶやいてる方が二人いらっしゃいました。

*1:Kindle Paperwhiteを購入(?) - なか日記

*2:特定の本に限るけど

*3:PC等のブラウザからは無料本の購入(?)ができない

*4:商品によっては1日くらい違うのかもしれないけど

Microsoft Azure WebJobのスケジューラの件

$
0
0

Microsoft Azure WebJobを使って前日の PV をツイートするコードを書いてみた - なか日記で、最後にスケジューラが動かなくて中途半端な結果になってましたが、改めて新しいWebサイトにデプロイしてみたところちゃんとスケジューリングできました。

前回うまくいかなかった原因は不明です(´ω`)

WebサイトのWEBジョブ

WebサイトのWEBジョブを見るとちゃんと登録されてました。

f:id:nakaji999:20140810230636p:plain

ここの「スケジュール」をクリックすると、スケジューラの画面に移動します。

スケジューラ

f:id:nakaji999:20140810230819p:plain

WebJobs-JapanWestという名前のジョブ コレクションが作成されて、そこへジョブが登録されています。

ジョブの内容

f:id:nakaji999:20140810231139p:plain

指定されたURLへPOSTするとASP.NETが良い感じに認証もしてくれた上で、サーバ上の実行プログラム(EXE)を実行してくれる仕組みのようです。

この前書いた↓の方法でも同じような事はできますが、プラットフォームとして提供してもらった方がいろんな面で安心ですね。 Azure Webサイトとスケジューラーを使って前日の PV をツイートする仕組みを作ってみた - なか日記

GitBucketでプライベート環境にGitHubクローン環境をサクッと作ったった

$
0
0

今日はこんな事がありました。

Gitの良いところを上手に伝えられなかったのが残念です。

協議の間、自分は中央リポジトリをどうやって公開しようかなぁと考えていました。始めてのGitなので変な環境にしちゃって「なんか、Gitっていまいちだよねー」なんてことになってしまうと悲しいです。

そこでふと思い出したのがGitBucketです。

ちょこっと試してみたら5分もかからずに使える状態に持って行けたのでこれはお手軽でイイ!という事でブログに書きます。

GitBucketってなに?

AtlasianのBitBucketと名前が似てて紛らわしいですが、GitBucketはScalaで作成されたGitHubクローンです。 GitHubクローンといえば、GitLabもありますが、インストールはGitBucketの方が簡単そうです。

必要なもの

はい。たったこれだけです。*1

下準備

下記URLから最新のwarファイルをダウンロードしておきます。

実行してみる

コマンドプロンプトから以下のコマンドを実行します。

> java -jar gitbucket.war

http://localhost:8080/にアクセスして、以下のような画面が表示されれば成功です。

f:id:nakaji999:20140814220003p:plain

管理者ログイン

管理者としてroot(パスワードも同じ)が登録されているので、まずはログインして一般ユーザーの登録などするといいと思います。

ポートを変更する

デフォルトのポートは8080です。変更したい場合は起動時のパラメータでポートを指定します。

> java -jar gitbucket.war --port=9090

データの保存先

設定やリポジトリのデータの保存先は、デフォルトではホームディレクトリ配下の.gitbucketになります。(ex. C:\Users\nakaji.gitbucket)

この場所を変更したい場合も起動時のパラメータで指定します。

> java -jar gitbucket.war --gitbucket.home=D:\GitBucket

その他の情報は本家のGitHubリポジトリをみてもらえたら地位と思います。

まとめ

超お手軽にGitHubクローン環境なんてステキですね。

これでGitに慣れてもらい、ブランチがそれなりに使えるようになって、プルリクエストでコードレビューなんていいじゃない! そのうちGitHub Enterprise契約して・・・と夢は広がったのですが、冒頭の通り残念な結果になりました。これにめげず、痛いおっさんと思われても良いので良いものは薦めていきたいと思います。

*1:きっと

後先考えず、はてなブログProにしたった

$
0
0

さっき、はてなブログProにしました。

きっかけはあの人のひところから

え、なになに?Proにしたら何かいいことあるの?と思って聞いてみたら、

Oh!no!これはアカンで。お小遣いがアレな自分にとってはまぁまぁしんどい。

それでも、某氏は薦めてきます。

いろんな人の意見

何人かProについてコメントもらいました。

なるほど。ブログを通して、良い習慣を身につけるきっかけを得るというわけですね。

今日の話

そういやGoogle AdSenseのアカウント作ってたなぁとか思い出してみてた気がついた。そしてつぶやいた。

某氏からまた背中を押されました(三度目)。

いろいろ思うところがあって申し込み

お小遣いはアレですが、思い切って申し込みました。後悔はしません。

思うところは別の日に書きたいと思います。


「もっと○○してからにしよう」をやめる

$
0
0

今朝、はてなブログProの契約をしました。

勢いでやっちゃったって雰囲気もありますが、ちょっとだけ考えたんです。

もっと○○してからにしよう

「もっと○○してからにしよう」って思うことって多くないでしょうか?私は結構あります。

  • もっと考えをまとめてから発言しよう
  • もっと文面を見直してからメールしよう
  • もっとExcel方眼紙を綺麗に整えてから提出しよう

などなど。

でも、よくよく考えるとこれって結構むだが多いですよね。

早くフィードバックもらおう

時間かけてないで、さっさとすることしてフィードバックもらった方が一歩も二歩もより早く先に進めますね。

そんなわけで、最近はさっさと出してしまうことにしてます。もちろん、最低限のクオリティは確保した上でですけどね。

ブログに書いたこの件なんかもそうです。

もっとやりたいことはあったけど、さっさと公開しました。それにより、らまっこさんに参加者登録の仕組みを作ってもらい、無事勉強会当日に利用することができました。

はてなブログProも同じ

はてなブログProに申し込んだのも同じです。

Pro固有の機能には個人的にそれほどメリットを感じていませんでした。

自分が感じてたメリットは以下のようなものです。

  • ブログネタを探す為にもっとアンテナを張るようになる(情報力up)
  • 技術系の記事を書くためにいろいろ意識するようになる(技術力up)
  • 内容や構成を考えるようになる(文章力up)

ひと言でいうと、「自分がもっと考えたり、情報に敏感になる」のが目的です。

これであれば「もっとたくさん記事が書けるようになってから、Proにしたんでいいんじゃない。」と思われるんじゃないでしょうか。

そうですね。モチベーションが高い人ならそうだと思います。でも、自分の場合「せっかく課金したんだから」というきっかけというか、追い込みが必要な気がしました。お金がかかってなければ、ブログ書かなくなっても痛くもかゆくもない*1ですから。

そんあわけで、今回も「もっと○○してからにしよう」をやめて、思い切ってProの契約をしたというわけです。

そんな中、たまたま結城浩さんの書かれた記事を目にしました。

人間、生きられる時間は限られてます。その中で、いつ来るかわからない時期を待って足踏みしているのはもったいないですよね。

*1:そんな事はないけど、それはまた別の機会に

愛媛(松山)にいてよかったこと

$
0
0

だるやなぎさんが見ず知らずのおばちゃんに助けてもらったそうで、

いいねぇと呟いたら、依頼を受けたので私が良いなぁと思うことを書きます。

仕事面(IT関連)

正直、いけいけどんどんな感じではないです。地元に仕事が溢れているかという問に対してはNOかな。これはどこの地方でも同じでしょう。時代の変化に合わせて、仕事の仕方を変えていく必要がある時期なのだと思います。

お客さんと直接やりとりできる

地元には中小企業が多いので、1次請け・2次請け…といった多段請け負いしてると価格が高くなりすぎて見向きされません。お客さんと直接話をして、自分たちでものを作って価値を提供する事になります。現場が見えると、お客さんが何に困っているのか、その為に自分たちがどう行動すべきなのかがわかるので楽しいですね。

それと、直接やりとりすると自分たちでコントロールできることが多くなります。ですので、Excelに貼り付けた画面のスクリーンショットといった価値のないものを作る必要もありません*1

新しいビジネスモデルを試せる(はず)

相手が中小企業なのでそんなに費用も出せません。その中で「これはいい」とお客さんに思ってもらえるビジネスモデルであれば導入してもらいやすいと考えます。

納品のない受託開発のように毎月定額制で技術顧問と一緒にシステムを育てていきましょうというのもありなんじゃないかなぁと。ただ、定額費用をずっと出し続けてもらうだけの余裕があるかという問題はあります。

IT技術者としての面

IT技術者としてどう仕事していくか(生きていくか)を考えるのには良い環境です。

Agile459の存在

主に愛媛で活動しているAgile459というコミュニティがあります。

アジャイルな開発について勉強しようぜー」というのではなく、アジャイルな開発/ビジネスを軸に「エンジニアとして幸せに生きる」事や「地域をどうよくしていくか」を考えるコミュニティです。

地元企業をはじめ、フリーランス、最近よく耳にするリモートなど、いろんな働き方をしている人が集まっているので、多方面のいい話が聞けます。

そういえば、ちょうど良いタイミングで、以下のイベントが8月30日に開催されますね。

いつもほぼ同じメンバー

どの勉強会に行っても大体同じ人がいます。もちろん、新しく参加される方もいますけど。

勉強会自体、10人から多くて30人規模になる事が多いです。小規模であるぶん、参加者同士で話がしやすく、その気になれば、1回の勉強会で全員と話をすることも可能です。結果、何回か勉強会に参加すると、そのうち6~7割の人が知り合いという状況にすぐなります。

初めて勉強会に参加する時、「自分以外は皆知り合いで、内輪ネタで盛り上がって疎外感を感じそう」なんて心配する人もいるんじゃないかと思いますが、思い切って1回参加すればすぐ溶け込めます。そして、他の勉強会に行ってもその時に知り合った人は何人か必ずいますw

生活面

それなりに店はある

関東や関西のように有名なショップがあるのかといわれればないと思います。でも、個人的には必要十分なものが揃ってます。

それに、大抵のものは通販で買えちゃいますからね*2

災害が少ない

松山ですが、台風の影響で大雨とか殆どありません。南からの湿った風は四国山脈ががっちりブロックしてくれてます*3

20年近く前に一度渇水で断水があったらしいですが、ここ数年は節水しましょうっていう話も聞かなくなりました。

魚が美味い

美味しい魚が安く食べられます。

お店に行くのも良いですが、自分たちで新鮮な魚を料理して食べるともっと旨いです。「魚のさばき方とかわからんし…」という人には、ゆるふわ.rbというコミュニティがあるので、顔を出してみるといいでしょう。

「買った魚はちょっと…」という人は自分で釣ることもできます。海がすぐそこにあるので、ちょっと出かけて竿を出せます。私も以前はアオリイカやヤズ*4、サワラ、スズキなんかを釣って食べてました。

その他

だるやなぎが生息している

松山に来ると生のだるやなぎに会うことができます。

毎月1回はだるやなぎを囲んでご飯を食べることになってます*5ので、興味がある人は声かけて下さい。

最後に

まぁ、要するに「住めば都」って事ですよ。また何かこれは!と思うことがあったら書きます。

*1:そんなの作ってたら値段が上がって受注できない

*2:地元にお金が落ちないのでこれはこれで問題

*3:そのせいで高知では大雨になるんですが…

*4:ハマチの小さいの(ブリ - Wikipedia

*5:といいつつ、7月はできなかったけど

イケダハヤト氏による松山の良いところ紹介

$
0
0

先日、IT技術者としてというか、なんとなーく松山に住んでて良かったなぁと思うことを書きました。

ちょうどそれと同じタイミングで、大洲で愛媛をホンキで考える「KnocknRollえひめ 2014」というイベントがあったようです。

そこにイケダハヤト氏がパネラーとして参加されていたようです。

わかりやすく解説

そして今日(昨日か)、イケダハヤト氏が記事を書かれてました。

「愛媛県松山市」は移住におすすめ。その理由をざっくり解説します : まだ東京で消耗してるの?

感想

いやー、やっぱり松山ってええところやね。というのは置いといて、やっぱり書くことを仕事にしてる人は違うなぁと。

わかりやすさというか、おお、「松山ってよさそうじゃん」って思わせる内容にただただ関心。

はてなブログのRSSからエントリー情報を取得する

$
0
0

現在、このブログのページビューをつぶやくBotを作ってMicrosoft Azure上で運用しています。

GoogleAnalyticsから情報を取ってくるために標準インスタンスである必要がある*1のですが、月々結構良いお値段がかかってしまします。

24時間365日起動しているにもかかわらず、そのサイトを使用するのはPVをつぶやく一瞬だけというのは超もったいない。これではイカンというわけで、過去24H以内に書いたブログのタイトルとURLをつぶやくBotを作ってみました。

その時やったことをちょっと切り出してブログに書きます。

といっても、何も大したことしてません。

サンプル

記事のタイトルだけを取ってくるサンプルです。

staticvoid Main(string[] args)
{
    var doc = XDocument.Load("http://nakaji.hatenablog.com/rss");

    var ns = doc.Root.Name.Namespace;
    var items= doc.Descendants(ns + "item");

    foreach (var item in items)
    {
        Console.WriteLine(item.Descendants(ns + "title").First().Value);
    }
}

RSS2.0のフォーマットは以下を見て下さい。

*1:やり方によっては無料でもいけるみたいだけど

酢酸先生が「AED検索 Web版」をローンチした件について

$
0
0

酢酸先生がAED検索のWeb版をブログで公開されてました。

AED検索 Web版を作りました - 酢ろぐ!

http://blog.ch3cooh.jp/entry/20140819/1408446000

WEB版とありますが、Windowsストアアプリ版もあります*1

詳しいことは酢酸先生のブログを見て下さい。

思ったこと

初音さんとがりっちさんの会話をきっかけに、挑戦してみようと思われたとか。

うまくいえませんが、この辺のアンテナの張り方というか、考え方は見習いたい。

「誰かが何か言ってる→自分で作ってみよう」とか、「こんなのないかなぁ→自分で作ってみよう」といった事がふつーにできるようになりたいです。

そういえば、先日、酢酸先生からふるさと納税検索サイトを作ってみたら!?と話を振ってもらいました。

せっかく振ってもらったのに、

なんていってる場合じゃないですね。

「もっと良いの作ってやる」とか、せめて「しょぼくてもイイから自分でやってみよう」にならないと。

手を動かさないとわからない事がたくさんある

前にも書きましたが、本読んだだけでわかった気になるのは危ないです。「いざ実戦投入しようとしたときにどうしたら良いかわからんことばかりで前に進まない。」なんて事に陥ります。

酢酸先生も以下のように書かれてます。

ネイティブアプリのようにインタラクティブに富んだものが作れるレベルには達していませんが、ちょっとずつASP.NET MVCを使ってWebサービスを作るノウハウが溜まって来ました。

手を動かしてノウハウをためるのが大事ですよ。やっぱり。

そんなわけで、昼間手を動かせないのであればしっかり夜に手を動かしたい。 そしてブログネタもそうですが、日々の何気ないことにしっかりアンテナ張っていきたい。 と改めて感じさせられる1日でした。

それと、画面構成とか、収益に関することもですね。

*1:こっちの作者は初音さん

Viewing all 848 articles
Browse latest View live