ページ

2014年1月30日木曜日

沖縄でレンタルサイクルを借りて旅をする

ますます技術が減ってきましたが
沖縄に行ってきましてレンタルサイクルを借りいろいろ回ってきました

1月の末でしたが気温は自転車を漕いでいたら少し暑いくらいでした。

今回2カ所でレンタルサイクルを借りそれぞれの自転車の感想となります。

2カ所ともゆいレール(モノレール)美栄橋駅から徒歩数分圏内ですので近場の宿で十分です。


1カ所目は特定非営利活動(NPO)法人 しまづくりネットです。こちらでは普通の自転車かマウンテンバイクが選べます。最大でも1日1600円程度なのでお得です。
今回借りたのはと呼ばれる機種です。内装ギア8枚のシティーサイクルです。
Ordina A8b











この自転車で下の約28kmぐらいを走行してきました。



首里城周辺の坂道がきつい!!
想像以上でした。でもギアのおかげでなんとかなった・・・
乗り心地はややサドルが固いのかデコボコした道ですと苦しいことがありました
しかし内装ギアが止まっていても変更可能な点がすばらしかったです。
今まで使ったことがなかったですが急に止まっても戻せば軽く走れる感じです。
こちらのコースの掛かった時間はおおよそ4hほどです。山道さえなければ
普通に十分なパワーを発揮します。ギア操作に慣れていないヒトではこちらの方が良さそうです。

2日目はこちらの「沖縄輪」です。
ここはロードバイクも貸してもらえるのです(レンタルとしてはすごく良いものがそろっています。
こちらで借りたのはクロスバイクでGIANTのこのようなやつです。(機種忘れました。
でもこれで1日1500円でした。
ですがデメリットとして、鍵がありません+500円となります。
また、ヘルメットも有料借しがあります。











こちらでは南下を行い山を抜け海から戻ってくるルートをとりました。













だいたい40kmぐらいの走行です。こちらも山登りがあり苦労しましたが
3×8段のギアがあったのでこちらでどうにか耐えしのぎました。(本当に必要か?

こんどはロードも借りて見たいと思います。
2つからそれぞれメリットありデメリットありのお店でした
ですが、お二つともご担当者がご親切に接していただけましたので楽しめました。

オフシーズンでもそれぞれ何台か貸し出しがあるみたいですのでオンシーズンは
あらかじめご予約をお勧めします。

2014年1月19日日曜日

postgresで重複レコードを削除しよう

毎回忘れるのでメモ対応
CREATE TABLE new_table as select distinct * from old_table;

これだと毎回面倒なのでシェル化してみました
#/bin/sh
DATABASE=$1
TABLE=$2
TMP_TABLE="$2_tmp"
BK_TABLE="$2_bk"
psql -c "CREATE TABLE $TMP_TABLE as select distinct * from $TABLE;" -U postgres $DATABASE
psql -c "CREATE TABLE $BK_TABLE as select * from $TABLE;" -U postgres $DATABASE
psql -c "DROP TABLE $TABLE" -U postgres $DATABASE
psql -c "ALTER TABLE $TMP_TABLE RENAME TO $TABLE" -U postgres $DATABASE

方法としては、distinctを利用し結果がユニークになることを利用し

テーブルのコピーを行い再度戻す対応となります

念のためバックアップも作成していますが、こちらは不要なら消すべきかと
PKが存在する系では、難しいかも知れませんが中間テーブルなどでは便利な手法です。

ロードバイクを買おう

ふとロードバイク(自転車)を買おうと思い検索を行い
どれが良いか検討するためまとめました。


目的
電車で現地に持っていき乗ったりできることを考え
軽量のミニベロを検討中

以下が要望です。
・10kg以下であること
・輪行が行いやすいこと
・現在購入可能なモデルであること

以下の条件を満たすロードバイクを探しました。

画像 メーカー 製品名 価格 フレーム素材 COMPONENTS 重量 考察
LOUIS GARNEAU MVTI-R 30万前後 チタン SHIMANO 105 8.0kg 軽いそしてお値段が張ります。ただ調べた中では圧倒的な性能と軽さです。
LOUIS GARNEAU LGS-MV C 20万前後 カーボンSHIMANO 105 8.2kg 先ほどのチタンの下位機種みたいですがかなりの性能ではと思います。
DAHONDAHON MU ELITE20万前後アルミSHIMANO 1059.7kg折りたたみで10kg以下なので候補やや折りたたみ価格乗っている気がしますが候補のうちです。
DAHONDAHON Dash X2020万前後アルミSHIMANO 1059.2kg前述のよりやすく買えそうでロードっぽいです
DAHONDAHON MU ELITE20万前後アルミSHIMANO 1059.7kg折りたたみで10kg以下なので候補やや折りたたみ価格乗っている気がしますが候補のうちです。
DAHONDAHON Dash X2020万前後アルミSHIMANO 1059.2kg前述のよりやすく買えそうでロードっぽいです
KHSKHS P-20RA20万前後アルミSHIMANO ULTEGRA9.4kg11段仕様のミニベロです。さすがにすごいスペック・・・
RaleighRSR RSW RACE13万前後アルミSHIMANO 1058.8kgお値段がお手頃で良いかもただ、あまり量がないみたいなので購入早めにかも
GIOSGIOS PANTO13万前後アルミSHIMANO Tiagra9.8kgデザインと快適性がありそうです。
LOUIS GARNEAULGS-MV 3S13万前後アルミSHIMANO Tiagra8.8kgLOUIS GARNEAUのお手頃モデルです。

とま〜このような感じでした。
極端に高いか少し安めか手頃間を考えると13万前後のモデルを買うのが無難になってしまいそうです。
購入の際の注意として、意外とすぐ売り切れます

2014年1月18日土曜日

koboAPIを使って分析をしてみる

皆様こんばんは、最近楽天を見ていたら
koboのAPIを発見してみたので早速使ってみましたw

とりあえず、だいぶ自分用ですが漫画を自動収集する
blogを作ってみましたw

kobo電子書籍新刊速報

すごく自分用ですw
でも意外と役に立っています
銀の匙とかこれで探しましたw

銀の匙 Silver Spoon(9)










意外と自分用でもAPIとか役に立つのだな〜と感じる次第でした
まだ作ってみただけなので、余分析敵なことができていないのですが
とりあえず新刊の件数を数えてみましたw
----------------------------------------------------
 2014-01-03 00:00:00 |    17
 2014-01-04 00:00:00 |    15
 2014-01-06 00:00:00 |    25
 2014-01-08 00:00:00 |     6
 2014-01-09 00:00:00 |     5
 2014-01-10 00:00:00 |   101
 2014-01-11 00:00:00 |     3
 2014-01-12 00:00:00 |     5

 2014-01-14 00:00:00 |    29
----------------------------------------------------

1月分の現在のないようです。
これから分かるのは、1月1〜1月2はお休みだったのだろう?
という感じしか分からないのですが実際の漫画の発売日と
koboの漫画が出るまでのスケジュールを分析したら単行本の
発売日からいつ位にkoboで出るか予測できるのでは?
まだ構想段階ですがちょっとやってみたいなと思い奮闘中
結果あればメモがてら記載していきます。

2014年1月4日土曜日

GoogleのoAuth2.0への認証手順

今回は、よく悩むGoogleのoAuth2.0の対応について記載いたします。(自分メモの意味が強いですが悪しからず
oAuth2.0はGoogleのサービスであるanalysis,Adsense,Blogger,Youtubeなどの
情報をAPI経由で取得する際に利用ができます。

oAuth2.0の認証トークンを取得する部分を中心に記載いたします。
その後、サンプルコードも順次作っていく予定(たぶん・・・

では、oAuth2.0には主だって3種類の認証の方法があります。
  1. Web Applicationに組み込む
  2. クライアントアプリに組み込む
  3. Android・iOSのアプリに組み込む
ぱっと思い当たるのではこの辺りでしょう。
 今回は「クライアントアプリに組み込む」を中心に記載してきます。
 この「クライアントアプリに組み込む」はバッチ処理にも利用できるので大変便利かと
思います。Googleのドキュメントでは、「urn:ietf:wg:oauth:2.0:oob」こちらになります。
目標は、「アクセストークン」の取得になります。 
では、以下のステップで記載していきます。
  1. Google Consoleにプロジェクトを作成する
  2. APIアクセスを有効化する
  3. oAuth2.0の認証情報を作成する
  4. 一時コード(以下code)を取得する
  5. codeを利用しアクセストークンを取得する
  6. リフレッシュトークンからアクセストークンを取得する


Google Consoleにプロジェクトを作成する

とりあえずこちら(Google Console)にアクセスを行いましょう。
今までプロジェクトを作成したことがなければ、図1のような画面になりここから手順は記載いたします。
すでにご存知の方は、次のステップからどうぞ


図1.プロジェクト新規作成


図2.利用規約の同意





これで初期プロジェクトは作成完了名称がAPI Projectになっているため変更が
必要があれば、画面上の「API Project」を選択し、チェックボックスにチェックを入れ「rename」で対応できる

APIアクセスを有効化する

利用したいAPIを有効化するだけですが、注意点があります。
APIによっては、Google側に承認を得ないと動作しないAPIもあります。
とりあえず画面に移動「APIs & auth」⇒「APIs」で一覧に移動できます。

YouTube Data API v3の場合は認証が必要ないAPIの一つです
こちらの場合は、図3のように登録すると利用できます。

図3.YouTube Data API v3の有効作業画面




では、Google側に承認作業が必要な場合は以下のようになります。
Blogger API v3であれば以下の図4の画面となります。

図4.Blogger API v3の承認画面








各画面で必須が異なるのでご注意ください。
その他には、AdSense Host APIなども認証が必要です。


oAuth2.0の認証情報を作成する

では、本題の認証情報を作成しましょうとは言っても手順は簡単です。
APIs & auth」⇒「credentials」に行き図5の画面にあるように
CREATE NEW CLIENT ID」を選択します。

図5.oAuth2.0の認証情報作成





ボタンを押したら図6の画面が表示されますが
今回は、クライアントアプリ等で動かすのが目的なので
真ん中の「Service account」を指定します

図6.oAuth2.0認証の対象を指定






Create Client ID」を押すと.p12の拡張子ものがDLできます。
こちらはアプリに組み込み利用することがありますが今回は
利用しないのでスルーします。


図7.認証後の画像



登録が完了すると図7のようにoAuth2.0に必要な
Client ID」「Email address」「Public key fingerprints
の3つが出てきます。(こちら他人に漏らさないように)これで準備完了です。


一時コード(以下code)を取得する

ここからは、いよいよアクセストークンを取得するために準備します。
では改めて詳細な方法を記載します。
アクターは、二人います。APIをつなぐ側、とAPIに操作される側です
それぞれGoogleのアカウントです。ここでは、前者をアカウント1、後者をアカウント2と呼びます。
便宜上分けていますが、同意アカウントアカウント1だけでも同様の処理が必要です。

以下の手順になります。
  1. oAuth2.0でアクセスしたい相手にcode作成用のURLを通知する【アカウント1作業】
  2. アカウント1から届いた、URLにアクセスしcodeを取得し、アカウント1に通知する【アカウント2作業】
  3. アカウント2から届いたcodeからアクセストークンを生成【アカウント1作業】

oAuth2.0でアクセスしたい相手にcode作成用のURLを通知する【アカウント1作業】

アカウント2に連絡するURLを作成します。
こちらは、規則があるので単純です。
https://accounts.google.com/o/oauth2/auth?scope={scope}redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id={client_id}&access_type=offline
上記の中でclient_idは図7のClient IDから置き換えます。
scopeについては、アクセスしたいAPIに応じ変更する必要があります主要なものをメモしました。注意点として、URLエンコードする必要があります。
複数個指定の場合はスペース【%20】でつなぎます
認証が必要な分だけ指定してください。
アクセスサービス scope
【エンコード後のscope】
AdSense Host API v4.1 https://www.googleapis.com/auth/adsensehost
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fadsensehost】
Google Analytics API v3 https://www.googleapis.com/auth/analytics
https://www.googleapis.com/auth/analytics.edit
https://www.googleapis.com/auth/analytics.manage.users
https://www.googleapis.com/auth/analytics.readonly
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fanalytics%20https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fanalytics%2eedit%20…】
Blogger API V3 https://www.googleapis.com/auth/blogger
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fblogger】
Google+ API v1 https://www.googleapis.com/auth/plus.login
https://www.googleapis.com/auth/plus.me
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fplus%2elogin%20https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fplus%2eme%20…】

このURLをアカウント2側に送ります。


アカウント1から届いた、URLにアクセスしcodeを取得し、アカウント1に通知する【アカウント2作業】

作業がアカウント2に移ります。アカウント1から教えられたURLをたたくと図8の画面に移動します。
図8.認証画面









認証画面で表示されている項目にアクセスする許可を求めているので
確認後問題なければ「承認する」を選択します。
この画面では、アナリティクスのscpoeを利用しましたが許可以外に
アクセス範囲などを指定する必要があるなど手間があります。
何らかの形でマニュアルかする場合はご注意を
また、図8上部に「API Project」とあります。こちらが
oAuth2.0のプロジェクト名です。こちらが気になる方はご変更をGoogle Console内
APIs & auth」⇒「Consent screen」よりHPやロゴなどの変更ができます。

話を戻し、図8の内容を「承認する」と以下の図9の画面となります。

図9.code取得が面






こちらのテキストの内容をアカウント1に教えてください。
これで、アカウント2の作業は完了です。


アカウント2から届いたcodeからアクセストークンを生成【アカウント1作業】

アカウント2から届いたcodeを利用しアクセストークンを取得します。
前々から出ているようにcodeはアカウント2がアカウント1に許可しましたよとGoogleに通知してるないようです。
アカウント1がGoogleにAPIでアカウント2にアクセスすると通知するのがアクセストークンとなる訳です。
ですのでこの内容が漏洩してもアカウント2は勝手にアカウント1以外からそうさされる訳ではありません。

気を取りなしてcodeからアクセストークンに変換しましょう。
以下のURLからアクセストークンを取得できるのですがPOSTをする必要があります。
私はMacで操作しているためMac用のcurlで記載いたします。
Linuxならwgetでも代用できます。

curl -d "code={code}&clent_id={client_id}&client_secret={client_secret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code"  https://accounts.google.com/o/oauth2/token
こちらのないようです。
{code}はアカウント1からの内容、{client_id}, {client_secret}は図7のGoogle Consoleから置き換えください。

こちらを実行すると以下のような内容が帰ってきます。
{
  "access_token" => "y------------------------",
  "token_type" => "Bearer",
  "expires_in" => 3600,
  "refresh_token" : "1/C------------------------"
}
JSONフォーマットとなります。こちらを利用しAPIで問い合わせを行います。
とりあえずアクセストークンを取得できたのでAPIが使えるようになりました。



リフレッシュトークンからアクセストークンを取得する

最後に、リフレッシュトークンについてです。
先ほど取得したアクセストークンですが、30秒ほどしか持ちません。
これは、セキュリティ上の仕様とのことです。そのため30秒毎に
新しいアクセストークンをアカウント2に依頼するのは現実的ではありませんその際に利用するのが
リフレッシュトークン(以下refresh_token)です。


refresh_tokenを利用することで新しいアクセストークンが取得できます。
こちらもPOSTを実施するような形となります。

curl -d "client_id={client_id}&client_secret={client_secret}&refresh_token={refresh_token}&grant_type=refresh_token" https://accounts.google.com/o/oauth2/token
このような形になります。
レスポンスは、以下
{
  "access_token":"1/-----------",
  "expires_in":3920,
  "token_type":"Bearer"
}
このようになります。こちらのアクセストークンを利用しAPI接続を行います。
長くなりましたが以上が説明になります。
必要あればご活用ください。



ブログを書いている間に気がついたのですがGoogle Console日本語化できるのですね














API Project」を選択し、「Account settings」に行けば設定項目があります。
しっかりと見てみるものです。