読者です 読者をやめる 読者になる 読者になる

「入門 考える技術・書く技術」読んだ

読書メモ

入門 考える技術・書く技術

入門 考える技術・書く技術

この本で何を解決したくて読んだの?

「伝わりやすい」文章を書きたい

どんな本なの?

「論理的に伝わりやすい文章」を書く方法を教えてくれた本

どうすれば、判りやすい文章が書けるの?

以下の方法に従って文章を作れば良い

  1. 読み手が欲しい、主メッセージを探す
  2. 主メッセージから、文章構造を組み立てる
  3. 文章構造をロジックでつなぐ
  4. ロジックでつないだ文章構造から、文章を作り上げる

読み手が欲しい、主メッセージを探す

  • OPQ分析 を使って、読み手の課題を明確にする
    • Objective : 望ましい状況 ( 例 : 相手に伝わる文章が書ける! )
    • Problem : 問題点、現状 ( 例 : 文章が相手に伝わらない )
    • Question : 読み手の疑問 ( 例 : 何か良い方法はないか? )
  • OPQを元に、Questionに忠実で具体的な回答( Anser )を書く (例 : 以下の方法に従って文章を作れば良い )
  • O→P→A を結びつける同一の尺度( レール )を決める
    • 同じ問題でもレールが異なれば、異なるAnserになる。 読み手が求めているレール、OPQをヒアリングすること
    • 「不良資産が見つかった」というPの場合、レールは「不良資産」なのか、「監視体制」なのか?
  • Anserはこの時点では、仮のものでよい

主メッセージから、文章構造を組み立てる

  1. Anserの直接支持するメッセージ( キーライン ) を探す
  2. リストアップした キーライン を元に、Anser を調整する
  3. 逆に、調整したAnser を支持する キーライン を追加/調整する
  4. さらにキーラインを支持する 段落メッセージ を作っていく
    • もし、キーラインが決まらない場合、段落メッセージ を先に列挙し、それをグループ化する方法もある

ポイント : 「so what(それで何が言いたいの?)」を繰り返す

文章構造をロジックでつなぐ

帰納法を使う

  • 帰納法 : 複数の前提から結論を導くロジック展開
    • 例 : 馬Aの心臓は1つ、馬Bの心臓は1つ、馬Cの心臓は1つ → 馬は心臓が1つであろう
    • ビジネス文書のロジック展開の8割は帰納法
    • 前提は 同じ種類の考え であること
    • 主部が同じ、述部が同じ、意味が同じ
    • ピラミッドの上下に「なぜならば」「具体的には」を入れて、しっくり来る文章になるか

演繹法を使う

  • 帰納法 : 前提が正しければ、結論は必ず正しいロジック展開
    • 例 : 馬は哺乳類→哺乳類は心臓が1つ→馬は心臓が1つ
    • 前提が正しいかチェックする

ロジックでつないだ文章構造から、文章を作り上げる

  • ここまでに作ったピラミッドのメッセージをそのまま形にする
  • 文章に置き換えられない場合は、ロジックがおかしいか、メッセージが絞りきれていないか
  • 文章の最後に 次にとるべき行動 を書く

要約メッセージを文章にする時のコツ

「体言止め」「名刺表現」の禁止

  • 見出しではなく、何を言いたいのか?をハッキリさせる
  • ✕「アジアの経済成長率の推移」◯「東南アジア各国はここ5年20%近く経済成長している」

曖昧な表現の禁止

  • ✕「商品の価格が問題である」◯「商品の小売価格にばらつきがありすぎる」

「 しりてが」言葉の禁止

  • メッセージは基本的に1主語、1述語の短文
  • 2つの文をつなげたい場合は、文の論理的な関係が曖昧になってしまうので、英語では「and」は使わない
  • 日本語の場合、「〜し」「〜であり」「〜だが」
  • ロジカル接続詞 を使う
    • 「〜する時に」「〜である一方」「〜であるがゆえに」など

この本を読んだ気づき

  • 自分の文章は
    • 「誰に何をして欲しくて書くか? 」が明確ではなかった
    • 主メッセージと、段落メッセージの列挙で終わっており、キーラインや論理展開が無く、ぼんやりした文章だった

この本を読んだ後どうするの?

  • 上記を意識しながら、ピラミッドを使って文章を書いてみる

かせいさんの開発環境2017

会社で新しいMacBookPro頂いたので、環境構築がてら最近の自分の開発環境を記録してみます

あんまり珍しいものは入れてないですね

GUIアプリ

Vivaldi

  • Chromeベースのwebブラウザ
  • Vimperator に慣れすぎてFireFoxから出れなかった自分を動かしてくれた神ブラウザ
  • cmd-E で開いているタブ、履歴、ブックマークからインクリメンタル検索ができるクイックコマンドが便利すぎる!!
  • 日本語入力がこなれていなかったり、ショートカットキーと、form入力が干渉したりするのが欠点
    • 今後に期待

機能拡張

  • 1Password : パスワード管理
  • Create Link : 現在開いているタブのマークダウンリンクを作れる機能拡張
  • Tab Nullpo+ : タブのopen/close時の挙動をカスタマイズできる機能拡張。新しいタブを今のタブの隣に出したいので使用

Dropbox

  • 定番すぎる
  • 開発では dotfiles の共有がメイン

Evernote

  • こちらも定番
  • 自分用メモに

1Password

  • パスワード管理ツール
  • 思い切って有料版を購入!
    • 買うならAppStoreより、直接オフィシャルサイトで買ったほうがライセンスの取り回しが良いですよ!!
  • lastpassから転向
  • lastpassbasic認証も保持してくれるけど、それ以外の使い勝手は1passwordが上だった

Alfred

  • 普通にランチャーと、クリップボード管理ツールとして使用中
  • 特に凝ったことはしてない

Skich

Iterm2

  • ターミナルエミュレータ
  • 賛否あるけどマウス選択で出力をコピーしたいので使用中
  • 最新版を入れたら長音符 を入力すると勝手にバックスラッシュに変えられてしまうので、 再現しない2.1.4 を使用中

Shiftit

  • ショートカットでwindowを上下左右に寄せたり、別のモニターに移してくれるユーティリティ
  • 主に右をターミナルにして、左をブラウザやSlackにしている場合が多い

KeepingYouAwake

  • スリープしないようにしてくれるユーティリティ -最近は caffeine よりこっちのほうが良いという噂を聞いて移行

CUI

homebrew

  • 楽なのでbrew
  • brew cask は未使用

macvim

brew install macvim --with-lua --with-override-system-vim
  • neovimに移行するかもしれない

vimプラグイン

  • 検討中

rbenv

ついでに nokogiri インストール用メモ

brew install libxml2
brew link --force libxml2
bundle config build.nokogiri --use-system-libraries

direnv

  • .envrc にある環境変数を自動的に読んでくれる
  • bundler--binstubs を使っている場合、以下のようにすると bundle exec が不要になる
PATH_add #{binstubsで指定したPATH}

参考 : mgi.hatenablog.com

ricty

  • 読みやすいフォント
  • オフィシャルのインストール手順がめんどいので、 homebrew でなんとかする
$ brew tap sanemat/font
$ brew install ricty
$ cp -f /usr/local/Cellar/ricty/**/fonts/Ricty*.ttf ~/Library/Fonts/ 
$ fc-cache -vf

参考 : github.com

percol

  • 標準入力で来たものをインクリメンタルに絞り込むツール
  • vimmerだと Unite が感覚的に近い感じ
$ brew install pyenv
$ xcode-select --install
$ pyenv install 3.6.0
$ pyenv global 3.6.0
$ python  —version
$ pip install percol
  • 以下のリンクを参考に、 ^R で history をインクリメンタル検索するようにした

blog.zoncoen.net

autojump

  • j で、最近移動したpathにインクリメンタル検索で移動できる
  • こちらも、上記リンクを参考に設定

tree

  • ディレクトリ構造を樹木図的に表示してくれるコマンド。何かと便利

macに入っている標準をそのまま使っているGUIアプリ

  • git
  • screen

Amazon Elastic Beanstalk でデプロイ時に database.yml に database.example.yml をsymlinkする方法

AWS Elastic Beanstalk Rails

database.yml をgitにcommitしたくないよね... そんな時に

先に方法

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/01a_symlink_database_yml.sh":
    mode: "000777"
    content: |
      #!/bin/bash
      cd /var/app/ondeck/config
      ln -sf database.example.yml database.yml
  • ~/.ebextensions/20_symlink_database_yml.config

概要

デプロイ処理の途中で、database.ymldatabase.example.yml をsymlinkしている

どうやっているの?

~/.ebextensions について

  • Elastic Beanstalkでは、コードの ~/.ebextensions/ に、のデプロイ前後に実行するコマンドや、ファイルを追加するための設定を格納できる
    • ただし、デプロイの途中に何かを挟むことはできない
  • files: は、コードが展開される前に、指定したpathに、content の内容のファイルを設置する

/opt/elasticbeanstalk/hooks/appdeploy/pre/01a_symlink_database_yml.sh について

  • /opt/elasticbeanstalk/hooks/appdeploy/ は、デプロイ時に実行されるシェルが格納されているディレクト
  • 辞書順にシェルが実行されるので、適切な名前のシェルを追加することで、任意の処理をデプロイ処理の途中に紛れ込ませることができる
  • pre/01a_symlink_database_yml.sh の場合、コードを展開した後に実行される
  • /var/app/ondeck は、コードが最初に展開されるディレクト
    • デプロイ処理に成功すると、 /var/app/current に mv される
  • 上記方法は、オフィシャルなドキュメントに明示されている方法ではないので、今後の更新で使えなくなるかも

雑記

  • Elastic Beanstalk的には、 database.yml をcommitして欲しい様子
  • heroku だと、heroku環境用の database.yml を生成してくれる

参考

ロードバランシングしている場合、サーバまたいでもRailsのcookie sessionって保持されるか不安になった時に見るページ

Rails

いつもはkey-valueストアでやっているので、cookie sessionを使うとなった時に心配になったのでメモ

先に結論

sessionは保持される

理由

cookie sessionは、ブラウザ側でsessionの情報を保持して、サーバ側に情報を持たないから

cookieおさらい

cookie : webサーバと、ブラウザ間で情報を管理するプロトコル(RFC6265)

  • key=value で情報を保持
  • リクエスト/レスポンスヘッダでやりとりする
  • 適用範囲 : path, domainを指定可能
    • domain 未指定の場合、発行したdomain上でだけ受信可能
  • 有効期限 : 未指定の場合ブラウザを閉じたら終了

session

webサーバとブラウザで情報を管理する仕組み ログイン情報とか、カートに何が入っているかとか

cookie session

  • sessionの情報をcookieを使って管理する
  • railsでのsessionの管理方法のデフォルト
  • valueは暗号化されて格納される

欠点

  • cookieのサイズ上限は4Kbyte(safariの場合)
  • 大量のデータを保持した場合、通信量が増える
  • ブラウザ側でデータを改変できる

cookie以外のsession管理方法

(やや別件) ロードバランシングした場合、複数サーバを跨ると困るところは?

  • /tmp ディレクトリに一時ファイルを生成して、そのpathをcookieに入れて処理している場合
  • メモリにsession情報を入れている場合(cookieにはsession idのみ)

参考リンク

Amazon Elastic Beanstalk で t2.micro で Rails をデプロイすると、gem install に失敗する件

Rails AWS Elastic Beanstalk

先に結論

原因

bundle install 時に メモリが不足が原因で native extension のビルドに失敗している

エラーメッセージ

An error occurred while installing nokogiri (1.6.8.1), and Bundler cannot
continue.
Make sure that `gem install nokogiri -v '1.6.8.1'` succeeds before bundling.

eb-activity.log

  Installing nokogiri 1.6.8.1 with native extensions

  Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

      current directory: /opt/rubies/ruby-2.3.1/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.1/ext/nokogiri
  /opt/rubies/ruby-2.3.1/bin/ruby -r ./siteconf20161205-3296-zuwti1.rb extconf.rb 
  Cannot allocate memory - /opt/rubies/ruby-2.3.1/bin/ruby -r ./siteconf20161205-3296-zuwti1.rb extconf.rb 2>&1

swap を大きくするとか回避する方法もあるけれど、お金を惜しんで手間を掛けるのは、PaaS の精神に反しているとおもったので、お金で解決

HerokuのDBにAmazon Elastic Beanstalkからアクセスする

AWS Elastic Beanstalk Rails heroku

これは何?

Herokuで運用しているアプリを、ふとAmazon Elastic Beanstalkに移行したくなった

けれど、軽く試すためだけのために、DBを移行するの大変

そんな時にお手軽に試す為の方法の記録

Heroku から DB の情報を取得する

heroku では、database.yml に接続するDBの情報を書かなくても良い感じに繋ぐけど、Amazon Elastic Beanstalk から heroku のDBに接続するためには、接続情報が必要

heroku config で調べる場合

$ heroku config

=== ***** Config Vars
DATABASE_URL:             postgres://#{username}:#{password}@#{hostname}:5432/#{db_name}

rails config で調べる場合

$ heroku run rails console

irb(main):001:0> ActiveRecord::Base.connection_config
=> {:adapter=>"postgresql", :pool=>5, :timeout=>5000, :database=>"*****", :username=>"*****", :password=>"*****", :port=>5432, :host=>"*****"}

それぞれ、出てきた情報をメモする

database.yml に設定を追記する

直接書くのはよろしくないので、以下のようにして、環境変数から値を取るようにする

production:
  <<: *default
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host: <%= ENV['HOSTNAME'] %>
  port: 5432

Elastic Beanstalk に環境変数を設定する

eb setenv DB_NAME=******
eb setenv USERNAME=******
eb setenv PASSWORD=******
eb setenv HOSTNAME=******.amazonaws.com

以上

slack に書かれた内容を Amazon Polly で読み上げてみた

AWS ruby

この記事は feedforce Advent Calendar 2016の6日目です!!

www.adventar.org

昨日は、tjinjinドラッカー風エクササイズをチームで試してみました でした

cross-black777.hatenablog.com

期待マネジメント大事ですね。 ウチのチームも一度やってみたら面白いかもしれないですね...

さて、実用的な記事はやってもらえたので、私の方は技術ネタでお茶を濁したいと思います!

Amazon Polly で遊ぼう!

先日の AWS re:Invent 2016 では、色々なサービスがローンチされてすごかったですね!

今日はその中から、音声読み上げサービスである Amazon Polly で遊んでみようと思います!

Amazon Polly ってなあに?

公式blogに詳しい解説がありました

Amazon Polly – 文章から音声へ、47の声と24の言語 | Amazon Web Services ブログ

特徴をかいつまむとだいたいこんな感じです

  • クラウド音声読み上げサービス
  • 今までの音声読み上げサービスよりも精度が高く、よりネイティブに近い発音なのが特徴
  • 毎月500万文字までは無料(!) 以降は1文字 $0.000004 生成される音声1分あたり$0.004

pollyコンソール で 簡単に試すことができるので、色々遊んでみると良いと思います。 主観ですが、今までの音声読み上げと比べるとだいぶ違和感が減ったなぁと感じました

既に sdk も使えるようですので、なにか面白い使いみちを考えてみましょう...

Amazon Polly の使い道を考える

slackの流れは追っておきたいけれど、そのために作業を中断するのはしたくない。そんな時ありませんか?

そんなときに、そう。読み上げてもらえば...!

でき上がったものがこちらになります

youtu.be

しくみ

ソースコード

こちらになります。 ruby で実装しています。また afplay を使っている関係上 macOS のみで動作します

github.com

ハマったポイント

APIを使ってslackのchannelのメッセージをリアルタイムに取得する方法が分からずにハマりました

  • slack の Real Time Messaging API には Bot 用のAPIキーが必要
  • Botが所属している channel のメッセージしか取れない
    • channel に呼ぶには Bot をメンションする

まとめ

入力した文章が読み上げられるってそれだけで結構楽しいですね!

半分ネタで作ってみたのですが、コンテキストスイッチを乱されずに情報が追えるので、あれ? 意外に実用度高くない...? などと思っているところです

参考リンク

明日は、フィードフォースボドゲ部部長 および 日本酒会会長 の kano-e の 「RailsエンジニアがFacebook広告を出稿してみた」です!

tech.feedforce.jp

Ad業界エンジニア必見!!! あと手書きのスライド資料が温かみがあって良い感じです!