【無料】herokuからメールを送信する
お手軽でWebサービスが構築できてとても便利なheroku。
アドオンがとても充実していて無料でもかなり色々なことができます。
今回はそんなherokuでメールを送ってみたので手順をまとめておきます。
設定はとても簡単、しかも基本料無料です!
使用したアドオン
今回使用したのはSendGridのアドオンです。
選んだ理由は主に以下の2つです。
- プロダクト名にBetaが付いていないので安定して動いてるのかなーと思い込み
- 一日200通のメールの送信までは無料
メールを送るまでの手順
アドオン登録
まずはSendGridのアドオン画面から登録を行うか、
もしくはプロジェクト内で以下のコマンドを使って
$ heroku addon:add sendgrid
でsendgridアドオンを登録します。
sendgrid内での設定
次にSendGridのページで設定作業を行います。(アドオン登録できていればherokuのアプリ詳細画面にリンクができています)
最初にこのページへ行くと×印が付いている個所があります。
「Configure Account Settings」をクリックすると統計情報やテンプレートに関する設定が行えます。
僕は以下の設定で「Updating settings」しました。
これで全てのマークがチェック印に変わります。
sendgridパッケージの導入
ここからはローカルプロジェクトの設定です。
今回はNode.jsの場合で行っていきます。
その他の言語についてもherokuのドキュメントページで解説されていますのでそちらを参照してください。
Node.jsの場合の導入はnpm install
を使って1コマンドです。
$ npm install sendgrid --save
コード記述
いよいよメールを送信していきます。
herokuのドキュメントページにもあるように以下のような記述をします。
var sendgrid = require('sendgrid')( process.env.SENDGRID_USERNAME, process.env.SENDGRID_PASSWORD ); sendgrid.send({ to: 'receiver@domain', from: 'sender@domain', subject: "メールタイトル", text: "メール本文" }, function(err, json) { callback(err); });
あとはherokuにデプロイしてこのスクリプトを実行してみましょう。
上記の例だとreceiver@domain宛てにメールが送られます!
このスクリプトは基本的にはheroku上でしか動作しませんので注意です。
理由としてはprocess.env.SENDGRID_USERNAME
とprocess.env.SENDGRID_PASSWORD
はherokuの環境上で設定される環境変数のため、ローカルでは値が用意できずにメール送信できません。(逆に言えばherokuにデプロイした状態でこれらの環境変数を直接見てソースを書き換えればローカルからでもメール送信できます。)
こんな使い方がおすすめ
無料枠の範囲ではユーザへのメール送信には向いていないような気がします。(一日200件までなので)
そのため無料枠での有効なのはサーバの状態などを管理者にメール送信してお知らせするといった使い方に向いているのではないでしょうか。
例えば以下の様なシチュエーションです。
- サーバが処理できなかったとき(500エラー)
- 定期的に動くような処理の実行結果(Heroku Scheduler)
- herokuにデプロイされたことをメールでお知らせ
【Android】GunosyやSmartNewsからワンタップでPocket登録する
GunosyやSmartNews、いまや毎日の情報収集には欠かせないアプリとなっている方も多いのではないでしょうか。
使い方
1.画面内に大きく表示されたボタンをタップ
2. URLをコピーしてPocket連携
Gunosy
「URLをコピー」をタップします。
これだけでPocketへ登録できました。
SmartNews
仕組みは?
自動化して楽になろう
toPocketをリリースしました!
どんなアプリ
AndroidユーザでPocket(formerly read it later)を使っているユーザ向けのアプリです。 Pocketへの投稿/登録を即座に行えるようになります。
Google Playからダウンロードもしくはtopocketで検索
使い方
アプリを起動しアイコン画像をタップしてONの状態にしておきます。
初回のみ認証があり、その後ステータスバーにtoPocketからお知らせが表示されます。
このお知らせが表示されている間にURLをコピーしてください。 自動的にURLの記事や動画などがPocketに投稿/登録されます。
作った理由
ものすごく単純です。 Gunosyを使っているのですがPocketへの連携が難しいな、と思いました。
AndroidでPocketへ投稿するのかなりめんどい
— Shoichi Matsuda (@shoma2da) 2014, 2月 3
課題解決しよう
— Shoichi Matsuda (@shoma2da) 2014, 2月 3
これを改善しようと思いたち開発を始めました。
開発期間
できるだけスピードを意識したかったので期間的には1週間、実質の開発日数は3日程度(7〜8時間ぐらい?)でした。 エラーハンドリングなどかなりあまい気がしているので今後改善も進めていきます!
是非ともダウンロードをお願いします!
Google Playからダウンロードもしくはtopocketで検索
Travis CIならCIの導入コストを限りなく0に近づけられる
対象者
- githubを使っている方
- CI用のサーバを用意するのが面倒な方
- Jenkins構築につまづくことが多い方
- Jenkinsのプラグイン管理などが面倒な方
はじめに
みなさんCIしてますか?
その際の環境はどのようにしているでしょうか? VPSなどのレンタルサーバでJenkins構築、なんて方が多いのではないでしょうか。
僕もこのように構築していたのですが、サーバ用意が面倒だったりJenkins構築周りでつまづいたりしてとても憂鬱な作業でした。
そんな方向けに、今回はCIプラットフォームであるTravis CIの導入方法を解説していきます。
Travis CIとは
Travis CIとはGithub上のソースを対象にしてCIを実行できるWebサービスです。 Githubのソースコードがpublicであれば利用料は無料です!
非常に簡単な設定で自動ビルドやデプロイなど詳細な設定が可能です。 また、多数のプログラミング言語をサポートしており無料なことも相まって話題となっています。
Travis CI導入手順
はじめはpushする度にecho "hello world"
を実行できるようにしていきます。
まずはログイン
https://travis-ci.org/ に行って右上のログインボタンを押し、Githubアカウントでログインします。
[画像]
プロジェクトをCIの対象にする
https://travis-ci.org/profile からプロジェクトを有効(ON)にします。
プロジェクト内に.travis.yml
を作成する
今回はhello worldと表示できるようにしてみます。 Travis CIはこのymlファイルを見てリポジトリにpushする度に自動でコマンド実行などを行います。
$ cd PROJECT_ROOT $ vim .travis.yml #script: # echo 'hello world!' #と記述する $ cat .travis.yml script: echo 'hello world!'
リポジトリにpushする
あとはpushするだけです。
$ git push YOUR_REMOTE_HOST YOUR_BRANCH
Travis CIの画面を確認してみましょう。 以下のように自動でスクリプトが実行されているはずです。
導入については以上で終了です。 たったこれだけでリポジトリにpushする度に簡単に自動ビルドなどを行うことが出来るようになりました。
ここからは公式ドキュメントなどを参照して.travis.yml
の書き方の詳細を把握していくといいと思います。
テストがないコードをどのようにテストしていくか
みなさんテスト書いてますか?
最近のプログラマ界隈ではテストや自動化の話題が非常に多くなっていますよね。
そんなことを言いつつ僕もつい最近テストについて発表しました。
テストが書けるようになってくると実装に自信が持てたり、変更を恐れなくなったりなど良いことが非常に多いです。
基本的には是非書いたほうが良いテストですが、実際の開発現場ではそう簡単にいくものではありません。
これまでに誰か(もちろん自分でも!)が書いたテストのないコードに手を入れていくことが非常に多いのではないでしょうか。
リーン開発の現場にこうしたレガシーコードについての戦略が記載してあったというのもありますが、自分自身もこのような状況に出くわすことが多いので今の思いをまとめておきます。
どうやってテストしていく?
実際にテストのないコードをテストしていこうとする場面を想像してみてください。
僕の知っている中では選択肢として以下の2パターンが挙がることが多いです。
- チーム全体でテストを書くことを決意して、一気にテスト環境やテストを揃えていく
- コードの修正や追加をしていく際に必ずテストを付けるようにして少しずつテスト環境やテストを揃えていく
結論を言うとほとんどの場合、後者がベターな選択肢ではないかと考えています。
そのように考えている理由を説明していきます。
この2パターンは「テストをすること」に関してははチーム全体の合意が取れている前提のものです。
名著レガシーコード改善ガイドでは「編集して祈る」か「保護して変更する」かという2パターンの方法ついて述べています。
しかしこれらはあくまで修正の方法論について述べているものですので上記とは意味合いが異なります。
それで、誰がテストに詳しいの??
仮に先程述べたうちの前者、「チーム全体でテストを書くことを決意して、一気にテスト環境やテストを揃えていく」を選択したとします。
ではテストを書きましょう!となりますが、実際問題としてテストに詳しい開発者はそう多くないはずです。
(一方ではてなやクックパッドはテストに関してかなり先行していそうですね。すごい!!)
そのような状況でテストを初めてしまっても、そもそもテストの粒度や書き方を学ぶのに相当の時間的コストがかかってしまいます。
また、テストするということはプロダクトのコードにもほぼ必ず手を入れることになります。
(テスト不可能だったりそのままのプロダクトコードだと非常に複雑なテストを書かなければならない場合が出てくるため)
テストへの理解があやふやなまま、テストができるようにプロダクトコードを変える。
これは非常に危険なことではないでしょうか?
実装が非常に簡単、といった箇所であれば問題ないかもしれませんが「一気にテスト環境やテストを揃えていく」と決めるということは、そのような箇所だけではなく全ての箇所を見ていくことになります。
長い期間書けてテストを揃えたけど、プロダクトとしての動作を保てなかった...では全く意味がありませんよね。
そこってほんとに手を入れるべき??
ソースにはどうしても「良く変更する箇所」と「全然変更しない箇所」が出てきます。
このうち「良く変更する箇所」については是非とも早めにテストを用意しておくべきでしょう。
変更ごとにテストを実行することによって安心してプロダクトに組み込んでいくことができます。
一方で「全然変更しない箇所」はどうでしょうか。
もう少し詳しく言うと「全然変更しないけど期待通り動いている箇所」です。
結論から言えばこうした箇所のテストは後回し、更にいえばそのままずっとテストなしでも問題ないのではないかと思っています。
(ここに対する意見は人それぞれ大きく異なりそうな気がしています)
冒頭に述べた後者の選択肢「コードの修正や追加をしていく際に必ずテストを付けるようにして少しずつテスト環境やテストを揃えていく」としていればこうした箇所は触れられることはなく、半自動的にテストされないままになります。
昨今のソフトウェア業界は以前にも増して更に加速度を増しています。
「今は修正の必要がないけどテストコードでより高い安全性を確保する」よりも「新機能の追加や既存の不具合を修正」を素早く行ってユーザに価値を届けていくことの方に基本的には重点を置くべきではないかと思います。
(テストを揃えておくことはもちろん大事ですよ!!念のため。)
YAGNIという言葉もありますし、過度な先読みは最終的には無駄な作業を生む可能性を考えると良いのではないでしょうか。
自動化も一緒にやる??
テストを書いていくとJenkinsなどを使って自動化(CI)したくなってきます。
確かにコミットしただけでビルドやテスト、デプロイなどを自動で行えることは革命的に素晴らしいものです。
しかし、テストと合わせて自動化ツールもほぼ同時に導入しようとするのには少し考えなおした方が良いかもしれません。
テストを書いていくとテスト用のデプロイ環境やダミーの入力値の準備といった周辺環境の念入りな準備が必要になります。
自動化ツールはあくまで手動で実行できるものをトリガーのタイミングで実行させるだけのものです。
テスト自体の周辺環境があまり固まっていないのに自動化ツールを導入すると、 テストの周辺環境を変える→テストが通ることを確認する→!!自動化の設定を変える!!→!!自動化できているか確認する!! などと自動化に関する工程が増えてしまいます。
テスト自体に慣れてきていれば自動化の設定変更は苦にならないかもしれませんが、テスト自体があやふやなのに自動化についても気にしなければならない!となると精神的負担も非常に大きくなってしまいます。
楽になるための自動化ツールで苦しくなってしまっては元も子もありませんよね。
まとめ
テストのないコードに対するテストをどう行っていくかについて述べました。
一気にテスト環境を整えきろう!と意気込んでしまいがちですが、その方法ではスーパーエンジニアでもない限り失敗してしまうことが多いのではないでしょうか。
個人的には「コードの修正や追加をしていく際に必ずテストを付けるようにして少しずつテストの環境やテストを揃えていく」という選択がベターな気がしています。
テストを少しずつ書いていくことによってテスト自体(あるいはプロダクトの特徴など)に慣れ、それを続けていくことで環境が整い自動化していける、といった少しずつ前に進んでいく手順です。
是非みなさんも考え、実践してみてください。
また、より良い方法などあれば是非教えていただきたいです!
アプリ開発者じゃなくてもわかるクックパッドアプリ勉強会まとめ #potatotips #android #ios
クックパッドでは月に一度、potatotipsという名で社外の開発者も招いてアプリ勉強会を行っています。 詳細としては発表者だけが参加できる、持ち時間1人5分のtips共有会です。発表内容はiOS/Androidに関するTipsとされています。 これまでに3度開催されました。
まとめ
早速まとめていきます。
発表内容とその簡易的な説明をしていきます。
各タイトルの頭にAndroidならA:
、iOSならI:
を付けます。
(詳細な資料があるもののみをまとめの対象とさせていただきます。)
第一回
発表内容一覧 です。
A:
No More 手書きViewHolder
→Andoridのリスト表示の際にはパフォーマンス向上のための"おなじみの仕組み"を毎回実装することが多いがこれを簡単にする方法についてI:
No More いろんなサイズの画像(スノーマンから始めよう)
→ユーザの端末(iPadやiPhoneなど)の画面サイズはそれぞれ違うのでいろいろな大きさの画像が必要になってしまう。この問題に対する文字のパスを取得し、ベクター画像のように扱う方法の提示I:
Downloadable Storyboards!
→iOSアプリの見た目を作成するためのファイル(通常はアプリに含まれます)をアプリの実行時にダウンロードして使う方法I:
5分で分かるiBeacon
→Bluetoothを使った位置や距離感をつかむための最新技術について、その概要や実装についてI:
UINavigationBarの隅々までタップしたい
→通常、iPhoneの上部のバーのタップ領域は限られているが、この領域の拡張方法とライブラリ化について説明A:
Anroid Design Guide 3つのポイント
→Androidの画面デザインについて。色、部品の大きさ、文字I:
ユーザービリティ向上ネタ
→アプリを提供する上でのユーザビリティ向上策について11個。画像取得タイミングやタイトル表示、階層の行き来の仕方などA:
Development, Staging, Production...
→アプリの配布環境ごとのビルドの自動化についてその実例I:
Switching Icon.png depending on each enviroment
→本番用と開発用のアプリのアイコンを変える試みとスクリプトによる自動化I:
Debugger の Tips
→デバッグ時に使用するコンソールを便利に使うための設定I:
iOS 7 compatibility issues (UITextView)
→iOS7のテキスト表示部品に残っているバグに対する対処方法。また、拡張されたテキスト表示部品の実装と公開I:
AVSpeechSynthesizerとロケール
→音声読み上げの際の簡単な言語判定方法A:
Android SDK Toolsのおさらい
→Android開発環境に含まれるコマンド24個についてI:
5分でわかるiOS7のiAdとTips
→iOSで使える広告iAdの使い方I:
iOSでジオコーディング
→緯度経度と住所の変換方法。サーバサイドの負荷に注意。A:
New Android Bootstrap
→Webでは有名なBootstrap、そのAndroid版について設定方法や実装方法について
第二回
発表内容一覧です。
I:
Xcode 5 & iOS 7でカバレッジを取る話
→最新の開発環境を使ったテストカバレッジの取得A:
ActiveAndroidの初期化にかかる時間を4分の1にする
→DB入出力に係る時間コストを抑える方法I:
Objective-CでRAII便利最高 →オブジェクトとリソース管理のパターンについてI:
XXXKit ~ それははしかのような物 ~
→画像をグリッジ(画面のチラツキ)させるライブラリの紹介と、Objective-Cのカテゴリ機構についてA:
ViewStickerを作りました
→iOSと同様なリストセクションの表示ができるようになるライブラリの作成I:
~時には起こせよエクセプション
→例外処理をさまざま試すことでクラッシュを防ぐコードを書いていこうという試みA:
Custom Lint Check
→不具合を発見するためのツールにおける設定を自作
第三回
発表内容一覧です。
I:
下位互換コード隠蔽のストイシズム
→バージョン対応のコードをいかにして自然に実装するかA:
アプリの評価を良くするということについて考える →Android/iOSのストア評価について。ライブラリの紹介などI:
便利なSyntax及びUnicodeを使ってアイコンを出す方法
→便利なブロック文法説明、Unicodeでアイコン表示、三項演算子の使用方法についてA:
アプリでもオブジェクト指向エクササイズ ★おすすめ!★
→オブジェクト指向を身につけるための強力なコーディング規約について紹介I:
Provisioning Profileファイルを活用してみる!Tips
→アプリを端末に入れる際に必須である設定ファイルの便利な活用方法についてI:
iOS 7 なMessage Appの作り方
→LINEのようなアプリをiOSでどのような実装で作れるかの紹介A:
ちょっと優しい入力項目
→決定ボタンを押した際の挙動など、こまかな入力項目に関する実装方法I:
やはりお前らのiOS7対応は間違っている
→多く語られるiOS7の対応方法についての誤解と好ましい実装方法についてI:
Secrets of launch arguments
→実行時の引数を便利に渡す方法の紹介A:
TDDでアプリ開発。カバレッジ8%を目指せ(消費税連携!?)
→全解像度、全OS、全CPUに対応した自動テストについてI:
xctestコマンドを知っていますか?
→最新の開発環境におけるテスト用のコマンドについて紹介A:
KotlinでAndroidアプリ開発!(後編)
→Android開発は通常Javaだが、Kotlinという言語を使った開発の紹介I:
死んだオブジェクトの生まれ故郷を探す
→オブジェクトのメモリ使用についてのログを見ることでオブジェクトの生成から破棄までを追うA:
Gradleの共通ルーチンをテストする(後編)
→Android開発は通常Javaだが、Groovyという言語を使った開発の紹介とビルドシステムを使ったテストについてI:
mogeneratorでモデルクラス作成
→クラスを作成するためのツールの紹介と使い方A:
AndroidのHTTPライブラリってどれがいいんでしょうか
→多数あるHTTPリクエストの実装方法について3つを提示して比較
詳細を知りたい方は
iOS
- クックパッドのLT会に参加してきたのでiOSのtipsをまとめる
- 第2回 #potatotips に参加してきたのでiOSのtipsをまとめる
- 第3回はヤフー開催! #potatotips で発表されたiOSのtipsまとめ
Android
- potatotips (iOS/Android開発Tips共有会) 第1回
(まとめページ見つからなかったので見つからなかったので参加者一覧ページです) - potatotips (iOS/Android開発Tips共有会) 第2回
(まとめページ見つからなかったので見つからなかったので参加者一覧ページです) - 第3回 #potatotips で発表されたAndroid Tipsのまとめ
【SF傑作漫画!】プラネテス一巻のあらすじ
今年は月に一つは漫画を読むことが目標です。
今月のお題はこちら。
あらすじ
2070年代の人類を描いた漫画です。
人々は宇宙に飛びとは月面での開発を進め、火星や木星への探索計画も進んでいました。