2017年1月21日土曜日

簡単にGmailの下書きを作れるGemを作ったお

GmailApiJp
https://github.com/kenta-s/gmail_api_jp

GmailのAPIを使っていろいろできるんだけども、
少し難しかったり日本語を使う場合は特別な処理が必要だったりして大変なので、
簡単に扱えるGemを作りました。

いまのところ下書きを作成するだけですが、必要に迫られたら拡張していく予定です。

使い方

まずはアプリケーションを認証しないといけないので、こちらを参考にclient_secret.jsonを用意してください
https://developers.google.com/gmail/api/quickstart/ruby

そしてgem install
$ gem install gmail_api_jp

gmail_draft.ymlというファイルを配置(通常はアプリケーションのルートディレクトリ)して、
中身はこんな感じ
application_name: 認証時に入力したアプリケーション名 
client_secrets_path: "/Path/to/your/client_secret.json"


下書きにしたいメールのテキストを変数なりに準備して
text =<<TEXT
To: foo@example.com
Cc: bar@example.com, baz@example.com
Subject: こんにちは

こんにちは
ご機嫌いかがですか
TEXT

draft = GmailApiJp::Draft.new(text)
draft.create_draft
で、Gmailにログインすると下書きができているはず。

※初回のGmailApiJp::Draft.new時はアプリケーションを認証するために対話モードでトークンの入力を求められます。
指示に従って認証してください。

Issue, PRまってます

2017年1月11日水曜日

RubyでGmail用APIを使って下書き(draft)を作成

タイトルの通りだが意外と情報が少なくて苦労した。

以下(公式)で公開されているものをベースにしているので、まずはこのURL内のサンプルコードが正しく動作することを確認することを推奨する。
認証の方法などもこちらに記載されている。 https://developers.google.com/gmail/api/quickstart/ruby

※使用しているgoogle-api-clientのバージョンは0.9.20
require 'google/apis/gmail_v1'
require 'googleauth'
require 'googleauth/stores/file_token_store'

require 'fileutils'

class GmailDraftJP
  OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
  APPLICATION_NAME = 'Gmail API Ruby Quickstart' # 適宜変更
  CLIENT_SECRETS_PATH = 'client_secret.json'
  CREDENTIALS_PATH = File.join(Dir.home, '.credentials',
                               "gmail-ruby-quickstart.yaml")
  SCOPE = "https://mail.google.com/"

  def initialize(text)
    @service = Google::Apis::GmailV1::GmailService.new
    @service.client_options.application_name = APPLICATION_NAME
    @service.authorization = authorize
    @text = text.encode("ISO-2022-JP") # これがないと日本語が文字化け
  end

  def create_draft
    user_id = 'me'

    draft = Google::Apis::GmailV1::Draft.new
    message = Google::Apis::GmailV1::Message.new
    message.raw = @text
    draft.message = message

    @service.create_user_draft(user_id, draft)
    puts "====== Draft created ====="
  end

  private

  def authorize
    FileUtils.mkdir_p(File.dirname(CREDENTIALS_PATH))

    client_id = Google::Auth::ClientId.from_file(CLIENT_SECRETS_PATH)
    token_store = Google::Auth::Stores::FileTokenStore.new(file: CREDENTIALS_PATH)
    authorizer = Google::Auth::UserAuthorizer.new(
      client_id, SCOPE, token_store)
    user_id = 'default'
    credentials = authorizer.get_credentials(user_id)
    if credentials.nil?
      url = authorizer.get_authorization_url(
        base_url: OOB_URI)
      puts "Open the following URL in the browser and enter the " +
           "resulting code after authorization"
      puts url
      code = gets
      credentials = authorizer.get_and_store_credentials_from_code(
        user_id: user_id, code: code, base_url: OOB_URI)
    end
    credentials
  end
end
ポイントはスコープの指定と、message.rawに渡す文字列、それから日本語に対応するためのエンコーディング。

こんな感じでcreate_draftメソッドを呼ぶとGmailで下書きが作成されているはず:
text =<<TEXT
To: foo@example.com
Cc: bar@example.com, baz@example.com
Subject: こんにちは

Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.
TEXT

draft = GmailDraftJp.new(text)
draft.creat_draft
最初の一回目は認証を行う必要があるので指示に従ってtokenの入力などを行う。

ソースコードはGitHubにも公開しているのでどぞ
https://github.com/kenta-s/gmail-draft-jp
=> Gem化したのでこのレポジトリは削除しました

2016年11月15日火曜日

AWS SDK for Ruby v2 でバケット内のファイルを移動(リネーム)する

AWS SDK for Ruby で S3バケット内のファイル移動


AWD SDK for Ruby V2の情報なので注意!

ざっくり書くと以下のような感じでS3のバケット内のファイルをリネーム(移動)できる


resource = Aws::S3::Resource.new(
  region: "Region",
  credentials: "YourCredential"
)

bucket = resource.bucket("BucketName")

from = bucket.object('from/file')
to = bucket.object('to/file')

from.move_to(to)

2016年11月3日木曜日

Angular Tour of Heroesの7.HTTPで GET http://localhost:3000/traceur 404 (Not Found) が出たら

Angular2をやってみようと思いチュートリアルをやっていると、
7.HTTPの章で以下のようなエラーに遭遇

zone.js:1382 GET http://localhost:3000/traceur 404 (Not Found)scheduleTask @ zone.js:1382ZoneDelegate.scheduleTask @ zone.js:245Zone.scheduleMacroTask @ zone.js:171(anonymous function) @ zone.js:1405send @ VM20690:3fetchTextFromURL @ system.src.js:1051(anonymous function) @ system.src.js:1781ZoneAwarePromise @ zone.js:518(anonymous function) @ system.src.js:1780(anonymous function) @ system.src.js:2809(anonymous function) @ system.src.js:3387(anonymous function) @ system.src.js:3701(anonymous function) @ system.src.js:4093(anonymous function) @ system.src.js:4556(anonymous function) @ system.src.js:4825(anonymous function) @ system.src.js:407ZoneDelegate.invoke @ zone.js:232Zone.run @ zone.js:114(anonymous function) @ zone.js:502ZoneDelegate.invokeTask @ zone.js:265Zone.runTask @ zone.js:154drainMicroTaskQueue @ zone.js:401ZoneTask.invoke @ zone.js:339
dashboard:17 Error: (SystemJS) XHR error (404 Not Found) loading http://localhost:3000/traceur(…)

systemjs.config.jsの
'angular-in-memory-web-api': 'npm:angular-in-memory-web-api',

'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js'
に。

'angular-in-memory-web-api': {
  main: './index.js',
  defaultExtension: 'js'
}

を削除したら動いた。
ここまで順調だったのに、これで1時間ハマってしまった。。。
参考:
http://stackoverflow.com/questions/40349887/tour-of-heroes-tutorial-issue-with-angular-in-memory-web-api

2016年10月9日日曜日

$ brew install hoge で Error: Empty installation

El Capitanにrbenvをinstallしようと思って $ brew install rbenv を打つも以下のエラー

==> Installing dependencies for rbenv: ruby-build
==> Installing rbenv dependency: ruby-build
==> Using the sandbox
Error: Empty installation

エラーでググっても大した情報は出てこない。 手順を間違えているようにも思えない。

そこで –verbose オプションを付けて実行してみる

$ brew install --verbose rbenv
==> Installing dependencies for rbenv: ruby-build
==> Installing rbenv dependency: ruby-build
==> Using the sandbox
/usr/bin/sandbox-exec -f /tmp/homebrew20160929-18347-1b0zrum.sb nice /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -W0 -I /usr/local/Homebrew/Library/Homebrew -- /usr/local/Homebrew/Library/Homebrew/build.rb /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/ruby-build.rb --verbose
Error: Empty installation

うーん、なにもおかしいところは見当たらな、、、い!?!?
と思ったら実行されているコマンド nice に心当たりが。

なんと僕は nice というコマンドが存在していることを知らずに同名のコマンドを自作してしまっていた。

削除後もう一度実行すると無事完了した

🍺 /usr/local/Cellar/rbenv/1.0.0: 36 files, 62.0K

なんともマヌケな理由でハマってしまったがniceコマンドを知るキッカケになった。
niceは、優先順位を指定してコマンドを実行するというコマンドらしい。

もう一つ教訓。自作コマンドは引数チェックをしっかりやろう。

Docker for Macのimagesの保管場所を別のパスに変えたい!

※2016年9月24日時点での情報です。古くなっているかもしれません。

いつの間にかDocker for Macのstableが出ていたのでインストールしてみた。
がしかし問題が。

僕が使っているMacBook Airは64GBのやつで、データは基本的に外付けのなにかに保存しておかないとやってられない。
こんなマシンを選んだ自分をいままで100回くらい呪った。
でも仕方ないね。他のやつは高かったからね。

Dockerのimageが一つで1GBとか持っていくからもうシャレにならないので、
imagesの置き場のパスを変える方法を調べてみたんだけどどうやら公式ではサポートされていない様子。
(ただ、困ってる人たくさんいたからそのうちサポートされるかも)

↓以下ワークアラウンド的な対処↓

一回Dockerを止めて、’com.docker.driver.amd64-linux’を移動させる。

$ mv ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux /path/to/your/new_dir/

そしてシンボリックリンク張る
$ ln -s /path/to/your/new_dir/com.docker.driver.amd64-linux/ ~/Library/Containers/com.docker.docker/Data/

そのあとDockerを起動すればOK

Gem textsnatcher の紹介

Gem作ったお

textsnatcherというGemを作ってみたので紹介。
URL: https://github.com/kenta-s/textsnatcher

使い方

まずはrequire

require 'textsnatcher'

そして

Textsnatcher::Snatch.exec(url, xpath)

で指定されたページの対象DOMのテキストを返す。

例としては以下のような感じ

Textsnatcher::Snatch.exec('https://github.com/rails/rails/releases', '//*[@id="js-repo-pjax-container"]/div[2]/div[1]/div[2]/ul/li[1]/div/div/h3/a/span')
# => "v3.2.22.5"

なにが嬉しいの?

Railsのリリース状況を監視して変更があったらメールを飛ばす、みたいなことをやることを想定して作ったけど、シンプルにテキストを返すだけだから他にもいろいろ使えるかも?

IssueやPRもらえると喜びます
https://github.com/kenta-s/textsnatcher