OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Summit Tokyo 2016 / 聴講メモ / サーバーレスの波はホンモノか？ 最前線の開発者に聞くコードでサービスの全てを提供する方法

## ■概要
* サーバーレスアーキテクチャの現場、生の声

## ■登壇者
* モデレータ(M)：西谷 圭介さん（アマゾン ウェブ サービス ジャパン株式会社 技術本部 レディネスソリューション部 ソリューションアーキテクト）... Lambdaの人
* パネリスト(F)：鈴木 健太さん（株式会社 fluct　 fluct開発本部 エンジニア）... 広告配信関連の業務・データ解析基盤の担当の人
* パネリスト(R)：木田 茂穂さん（株式会社リクルートジョブズ　デジタルマーケティング室 マーケティング部 データマネジメントグループ グループマネジャー）...データサイエンティスト

### ■■fluctさんのシステム
* 配信の元データを作成する
* ドキュメントをクロール、本文抽出
* Kinnesis Stream ...

### ■■リクルートさんのシステム
* タウンワークAP
* ユーザ回遊情報からリアルタイム計算
* Lambda, Kinnesis, 特徴量計算, DynamoDB, ポーリングで永続化

## ■サーバレス採用のきっかけ/理由
* (F)サーバレスありきではなかった。Java8の環境が欲しかった。rpmレベルの話ではなく、モニタリング。アラート etc...
* (M)なぜJava8
* (F)Luceneを使いたかった
* (M)主言語は?
* (F)earlang, ruby, Goいろいろ
* (R)最初からLamadaではない。インフラ技術者がいなかった。トライ＆エラーのためスピード重視。

## ■インフラ・アプリの棲み分け
* (M)インフラ・アプリ分かれている？
* (F)配信などの基幹は分かれている
* (R)タウンワークは分かれているが、分析はアプリオンリー
* (M)インフラエンジニアの調達の問題？
* (R)NO,変更頻度からインフラチームとのやりとりはやってられない
* (F)同じ感じ
* (M)どういった切り分け？
* (F)(R)デプロイは開発。導入までがインフラ

## ■Lambdaによる開発の実際、始め方
* (M)Lambdaの実際のところの開発スピードは？
* (F)限定的な使用なので早かった
* (M)運用開始してからコストは？
* (F)並列化による試行錯誤の時間短縮に価値があった
* (R)同じ感じ
* (F)結局、サーバ代よりもエンジニア費用の方が高い

* (M)学習コストは？トータルで見て
* (F)それほどでもなかった
* (R)使いながら覚えられる
* (F)Javaのデプロイの方式に時間がかかった

* (M)どうするのが導入への近道？
* (F)お伺いを立てる時間で試した方が早い
* (R)始めるのに時間を試すような組織はダメ

* (M)事前検証的なことは？
* (F)ほとんどやっていない。node.jsでLambdaの動作モデルを確認した程度
* (R)同じ感じ。実験に近い感じ
* (F)「止まる」挙動など知っておかないとまずい

* (M)どう始めた？
* (F)AWSのドキュメントなどに沿って学習した
* (R)メンバーがドキュメントで学習した

* (M)チームではフォローをどのように？
* (F)リーダーがサポート
* (R)現場ベース

* (M)チーム規模は？
* (F)3人
* (R)6人

* (M)(R)の言語は？
* (R)Python。最新の分析ライブラリが使えるから

## ■Lambdaのデプロイ
* (M)デプロイの実際はどのように？
* (F)S3に置いたら反映される。GitHub への書くブランチへマージのトリガーで、Travis CIで。デプロイは手動
* (R)苦労した。一撃スクリプトを作って使っている

* (M)自動化の上で苦労した点？
* (F)AWSの場合はAPIの使い方さえ分かればOK。Lambda固有で苦労することはない
* (R)同じ感じ

* (M)Functionの数は？
* (F)1コ
* (R)昨日分割していてたくさん

## ■Lambdaのテスト
* (M)テストはどのように?
* (F)普通に単体テスト + CI
* (R)単体テストに加えて、回帰環境で確認もやっている

* (M)多くのコンポーネントを組み合わせているが苦労した点は？
* (R)タイミング等、難しいところはあり模索中

* (M)結合テストは?
* (F)一連の流れを行っている
* (R)同じ感じ。実際の環境で確認することが多い

* (M)単体テストでドライバ、データの準備は大変?
* (F)普通の開発と同じ
* (R)同じ感じ。実際の環境で確認を行うことが多い

* (F)EC2はクラウドフォーメーションを使っているが、Lambdaはどう？
* (M)結合テスト環境を作って自動化している事例もある

## ■Lambdaのデバッグ
* (M)デバッグは？
* (F)CloudWatchのログを愚直に見る
* (M)工夫していることは？
* (F)Kinesisのログをtailするツールを作った、CloudWatch をコンソールではなく AWS Logs で取得、フィルタして見ている
* (R)愚直に見ていて苦労している。Fさんを参考にしたい

---
※当日の生メモです(ほぼ校正していませんm(_ _)m
※登壇者の方の情報など一部 http://www.awssummit.tokyo/devcon/index.html から引用させて頂きました
AWS Summit Tokyo 2016 / 聴講メモ / Slack, Qiita, GitHub 利用者 ＆ 提供者の視点で見る、クラウドとツールの使いどころ

## ■概要
* 開発者で流行りのツールとクラウドの関係について

## ■登壇者
* モデレータ(M)： 吉羽 龍太郎さん（Ryuzee.com）
* パネリスト(N)： 【Slack 利用者】岩瀬 義昌さん（エヌ・ティ・ティ・コミュニケーションズ株式会社　技術開発部 エンジニア）...[外注が主な企業でどのように内製開発を立ち上げ・進化させているのか？](http://www.slideshare.net/iwashi86/ss-58456004) の方
* パネリスト(Q)： 【Qiita 提供者】髙橋 侑久さん（Increments 株式会社　CTO）
* パネリスト(G)： 【GitHub 提供者】藤田 純さん（ギットハブ・ジャパン合同会社　カントリーマネージャー）

## ■会場調査
* Slack使ってる？: そこそこ
* Qiita使ってる？: けっこう
* GitHub使ってる？: かなり
* AWS使ってる？: かなり
* Devの人？: 殆ど
* Opsの人？: 少し
* SIerの人？: 7割

## ■自己紹介
* (N)Slackヘビーユーザ。サービスを開発している
* (Q)書きやすさにこだわったツール
* (G)開発者による開発者のための。。情報提供

## ■なぜこれらのツールが受け入れられているのか？
* (N)開発者との相性は抜群に良い。APIがキーワード
* (Q)使い分け大事
* (G)ユーザが解決したい問題に特化しているから
* (M)3つのプロダクトに共通して、
* (N)UNIX哲学

* (N)盛り上がった話題のストックが面倒くさい、どうしてる？(bot使っているが)
* (Q)リモートワークが主体になってきたので、オフライン問題がある。率先してオンラインに上げるような人大事
* (M)GitHubさんはフルでリモートでしょ？
* (G)オンラインの習慣づけ大事

## ■ツールを取り巻く環境
* (M)取り巻く社会はどう変わった？
* (G)PDCAのPがヘビーで硬直化している問題。速さ大事。失敗するなら早い方が良い。 早くやって、早く失敗して、早く学んでということを許容することが大事
* (M)ツールとの関連は？
* (N)自分はR・D 部門なので早く失敗が求められていて、AWSなどものすごく親和性高い
* (N)100Pのパワポなんてアンチパターン
* (M)本業に集中大事ということ

## ■ツールとクラウドとの親和性
* (M)ツールとクラウドとの親和性
* (G)_
* (M)オンプレの調達の辛さとか無い？
* (Q)サービスがバズったりするとオンプレは無理
* (N)Slackのクラウド親和性高い。全部Slackでやりたくなる。クラウドに統合してChatOps
* (Q)Qiitaチームのオンプレ要望あるが、理由が会社の方針等無意味
* (M)オンプレのGitHub Enterpriseはどうやってるの？
* (G)3ヶ月に1回はスーパーバイザーに載せるイメージを提供するなどしている

## ■ツールの導入・壁
* (M)オンプレとクラウドの実際ってどうなんでしょう？
* (G)やはり、会社や国などセキュリティポリシーなどで、「どこ」が重要視されてクラウドが難しいケースがある

* (M)どうやったらクラウド化？
* (N)ちょっと偉い人はついていけない。ミドルクラスの理解がある人が必ずある。既成事実でボトムアップ
* (M)セキュリティ部門のクリアは？
* (N)顧客情報などはオンプレ
* (M)どう制御？
* (N)人力で消す。教育の徹底

* (M)Qiitaはどう？
* (Q)ボトムアップ、トップダウンはユーザによる。必ず率先してくれる人が必要

* (M)一人じゃ辛いよね。折れちゃう
* (N)折れてから勝負(ｷﾘｯ

* (M)GitHub導入は？
* (G)ロックスターみたいな人(チーム)を味方につける。現場の意見 -> 経営に届くと広まったケース

* (N)社内ハックネタだけど、有名なコンサルタントにガツンと殴ってもらうのがオススメ

* (M)やっぱ人間系？機械的な方法ある？
* (G)まず使ってもうらう
* (M)星取り表で検討など延々と。。という文化もあるが、始めた方良いということですね

* (N)コンサル的に、入れたあとの定量評価などってどうやってるの？
* (M)人件費が一番高いので、見せるように
* (G)ROIはマジックワード。言いたいことはある(そんなんで全部済めば苦労しない)。企業の上位マネジメントは賢い方が多いので、本質を見抜いてくれる方も多い
* (G)SAPの事例。社内ハッカソンにエグゼクティブを巻き込んで成功している

## ■メッセージ
* (M)最後に
* (N)内製頑張るべき。ここに来ているSI の方々も頑張って欲しい。そうすれば日本のソフトウェア開発は変わる
* (M)何ができる？
* (N)勉強会などで、地味に名を得る。「あの会社デキる」と思ってもらう

* (Q)情報共有の重要性を認識していない方が多いので、パイを広げるためには、世論形成が必要。熱量のある方々でムーブメントを起こしたい

* (G)日本のエグゼクテイブ曰く「経営資源(人・物・金)は海外と遜色ないはずなのになぜ海外と差がついているのか？」という話になる。やはり「勇気」「失敗しても良い」「小さいことことから」といった寛容性が必要なのだと思う。「コケても良い会」でも立ち上げたい


---
※当日の生メモです(ほぼ校正していませんm(_ _)m
※登壇者の方の情報など一部 http://www.awssummit.tokyo/devcon/index.html から引用させて頂きました
AWS Summit Tokyo 2016 / 聴講メモ / サーバーレスで構築する、マイクロサービスの未来形

```text
   入
    入
   入入
  入  入
 入     入
```

## ■概要
* サーバレスコンピューティング、AWS Lambdaについて

## ■登壇者
* Tim Wagnerさん (General Manager of AWS Lambda and Amazon API Gateway, Amazon Web Services, Inc.)

## ■導入
* サーバレスコンピューティングとは?
	* VM: ハードの抽象化 => EC2
	* コンテナ: アプリケーションの抽象化 => ECS
	* サーバレス: 言語ランタイムの抽象化 => AWS Lambda
* 3つのメリット
	* サーバ管理不要
	* 継続的なスケーリング
	* アイドル時間は課金されない
* クラウドはスーパーコンピュータ。サーバレスでプログラムできる
* リクエストごとに課金
	* 100msごとに0.21セント
	* リクエストの料金は0.2セント
	* アイドル時間の課金なし
	* 無料利用枠(100万件/月)
* Lambdaの使用
	* BYOC(Node.js, Py, Java) zip
	* 柔軟な使用方法
	* シンプルなリソースモデル
	* プログラミングモデル: SDK etc...
	* オーサリング機能 eclipse, VS プラグイン etc...
	* ステートレス DB、S３などで永続化
	* モニタリングとスケーリング

## ■ユースケース・Lambdaの価値
* データ処理
	* 例: S3バケットトリガー
		* オブジェクト追加 -> S3バケットイベント -> Lambdaで圧縮 -> バケットに戻す
* バックエンド
	* どちらかを選択
		* モバイルアプリ
		* IoTデバイス
	* モバイルバックエンド ブループリント
	* API Gateway: サーバレスAPI
* エコシステム
	* 静的コンテンツを提供: S3
	* 動的コンテンツ: Lambda
	* HTTPアクセスを提供API: API Gateway
	* NoSQLデータストレージ: DynamoDB
* 事例
	* Alexaアプリ + Slack = サーバレスボット
	* Canon
		* マイクロサービスでプリンティングソリューション
	* 岡三
		* バーチャルトレーディング
		* 受注管理システムの中心部分
		* 1/10でデリバーした
	* リクルート: タウンワーク
		* マシンラーニングでエンドユーザに対してレコメンデーション

## ■新しいサービスとベストプラクティス
* 新機能
	* re:Invent 2015以降
		* Node.js 4.2.2
		* ステージ変数
		* Swaggerのインポート/エクスポート etc...
* スケジュール機能: 入門ガイド
	* ウォーム状態
	* キューのポーリング
	* タイマーは増やせる
	* 1分以下でスケジュールできる
* バージョング: 入門ガイド
	* 変更可能な構成情報
	* Lambdaのロールバック: Aliasによる切り替え
	* Blue/Greenデプロイメント
	* クライアント/デバイスのバージョン固定
* LambdaのVPCの基礎
	* 常にVPC内で実行される。セキュリティを有効にする必要はない
	* リソースアクセスを許可することができる
	* VPCはオプション
	* ENIは各自のクォータに計上
	* 十分なIPをサブネットで確保する etc ...
* サーバレス マイクロサービスの作成方法
	* CloudFormation
	* オープンソースフレームワーク(Serverless.com)
	* Flourish(AWS支援のGitHubプロジェクト)

## ■デモ
* CloudFormationによるデモ(Inventoryシステム)
	* Create Stack...
	* API GatewayメソッドをJSON中に定義
	* カスタム(lmbda)関数の実行が可能(サンプルデータの投入など)
* サーバレスコンピューティングのマニフェスト
	* 関数はデプロイメントとスケールの単位
	* プログラミングモデルはマシン、VM、コンテナは見えない
	* 永続的ストレージがあちこちに利用できる
	* スケーリング、プロビジョニング不要
	* アイドル課金なし
	* 関数はどこでも、耐障害性がある
	* BYOC
	* メトリックとロギングは自動的
* サーバレスを始めよう！

---
※当日の生メモです(ほぼ校正していませんm(_ _)m
※登壇者の方の情報など一部 http://www.awssummit.tokyo/devcon/index.html から引用させて頂きました
AWS Summit Tokyo 2016 / 聴講メモ / クラウドとマイクロサービスによる音声操作の新時代 － Amazon Echo & Alexa

## ■概要
* これからのUI/UXは音声だ
* Alexa と連携するマイクロサービス開発は簡単に始められる

## ■登壇者
* Amit Jotwaniさん（Senior Evangelist, AVS（Alexa Voice Service））

## ■なぜ音声が重要か
* タッチは主要なインタフェースではなくなる by Design News
	* スマートフォン、ウォッチ、車載情報機器
	* スイッチを押した方が早い
* 音声はどこでも使える
	* 自然なやりとり
	* 話すだけ
	* 集中できる

## ■Amazon Echoとは
* ハンズフリースピーカー
* 音声認識システム
* 部屋を超える
* 曖昧でも認識
* ミュートボタン
* プライバシー、セキュア
* デベロッパーが機能追加しやすい
* ラインナップ
	* Echo
	* Echo Dot
	* Tap
* AexaはFireTVに対応した

## ■Amazon Alexaとは
* Echoなどの頭脳
* クラウドサービスプラットフォーム
* マシンラーニング、認識、クラウドで処理
* 毎日進化する
* デベロッパ向けエコシステム
	* ALEXA SKILLS KIT
	* AVS(Alexa Voice Service)
		* デバイスに組み込める(e.g. らずぱい
		* REST
		* あらゆるもに組み込んでいく
	* ASR
		* 音声認識
	* NSR
		* 自然言語認識
		* 意図を解析
	* Skills
		* Whether etc...
	* TTS
		* Text To Speach
* シーケンス説明
	* WAKE WORD ... -> TTS
	* 少ない遅延(数ms)
* Alexaが利用可能なデバイス
	* Triby(キッチンデバイス 冷蔵庫に貼る)
	* CoWatch
	* Raspberry Pi(GitHub)
* Alexaが利用可能なアプリ
	* Roger(友達として追加)
	* Lexi

## ■AlexaのSkillとは
* カスタムスキルを追加できる
* Alexa Skills Kit APIを使用する
	* e.g. uber, hit bit 
* サーバレスアーキテクチャによるマイクロサービス
	* AWS Lambdaに統合されている
	* 2つの要素
		* コンフィグレーションデータ(フロントエンド)
			* インタラクションモデルを作る
		* ホステッドサービス
* スキルのライフサイクル
	* Alexa <=> Lambda <=> API Gateway

## ■ライブコーディング
* amazon.developer.com
	* スキルを登録する
		* 意図をJSONで登録
			* intent
			* slot: name, type
		* CUstom Slot Types
		* Utterances
			* Lambdaってなに？
			* Lambdaは何につかう？ etc...
	* Lambdaを登録する
		* AlexaのブループリントをPy用に選択
		* インテント関数を定義する
			* LaunchRequest, IntentRequest, SessionEndRequestの3つを処理
	* 実行ロールを選択し登録する
	* ARNが生成されるのでスキルに登録する
	* ボイスシミュレータでテストする
		* Lambda Requst & Lambda Response
	* API Gatewayに登録
	* パブリッシュ
	* Echoで使う

## ■未来を拓く
* 4500万戸
* _
* _

## ■メッセージ
* 音声が拓く未来。音声はどこでも
* _
* _
* デベロッパーのみなさんよろしくね

---
※当日の生メモです(ほぼ校正していませんm(_ _)m
※登壇者の方の情報など一部 http://www.awssummit.tokyo/devcon/index.html から引用させて頂きました
AWS Summit Tokyo 2016 / 聴講メモ / 中堅・中小企業（SMB）向け AWS 事例紹介

## ■概要
* AWS活用事例の紹介(6つ)

## ■登壇者
* 舟崎 健治さん（アマゾン ウェブ サービス ジャパン株式会社　ソリューションアーキテクト）

## ■イントロダクション
* なぜAWSが採用されるのか?
	* 俊敏性
	* 運用負荷軽減
	* 本来業務への集中
	* 高可用性
	* コストの最適化
	* セキュア

## ■事例1 基幹システム
* 骨子/宣伝
	* 基幹系がフツーに動くよ
* ユーザ
	* イートアンド株式会社
* 課題・背景
	* サーバ数増による管理工数増大、管理者が少ないので自社運用が限界
* なぜ？
	* メンテナンスや立会いなど管理工数削減
* ポイント
	* VPCによるセキュアな環境
	* 業務アプリケーションを順次移行
	* ファイルサーバから手始め。NWの実用性を確認
	* 大臣エンタープライズ　販売管理
	* サイボウズOffice
	* 奉行V ERP
* メッセージ
	* 小さく初めて大きく育てる

## ■事例2 全社システム
* 骨子/宣伝
	* Amazon WorkSpaces良いよ
* ユーザ
	* 株式会社イデラキャピテアルマネジメント
* 従来の課題
	* 移動プロファイルを使用していたため、人数が増え一人10分
* なぜ？
	* WorkSpaces
* 構成
	* Zero Client
	* PCoIP Manager
	* AD
	* ファイルサーバ
	* 勘定奉行
	* グループウェア
	* Direct Connect
* 社内説得
	* BCP対策
	* フレキシブルな働き方
	* DCに比べるとローコスト
* 手順
	* WorkSpacesの検証
	* パートナーと要件定義、、、移行(7ヶ月)
	* VMWareから移行
* メッセージ
	* WorkSpaces + Zero Client + Surface 3が好評

## ■事例3 セキュアネットワーク
* ユーザ
	* 高島株式会社
* 従来の課題
	* オンプレ5年毎の更改をやめたい
* 理由
	* 他者のクラウドに比べてAWS専門ベンダーが多かった
	* スポットで外注、内製化推進
	* AWSの物理サーバの移動、スペック変更は再起動だけ
* 構成
	* Patinoによるセキュアネットワーク
	* まだAD、ファイルサーバ、管理サーバだが、9割を目指す
* 社内説得
	* DC閉鎖をスケジュールすることで二重課金によるコスト増を防ぐ
* メッセージ
	* 想像以上に快適なので最初から全部持っていけば良い

## ■事例4 Oracle Database => Aurora
* 骨子/宣伝
	* Aurora良いよ
		* MySQL互換
		* 自動拡張
		* 成長スピードの早いサービス
* ユーザ
	* 株式会社翻訳センター
* 従来課題
	* データ検索・閲覧システムに機能追加、レスポンス改善したい
	* ライセンス、コストがネック
* 社内の説得
	* 社内他システム事例があり敷居は低かった
* ポイント
	* AWS Schema Conversion Toolによる改修見積もり
	* 既存DB => マイグレーションサーバ => Aurora
	* もともとRDS for Oracle
	* ライセンスコストをCPU、メモリへ転嫁しレスポンス改善

## ■事例5 新規BI導入
* 骨子/宣伝
	* Redshift良いよ
		* 従量課金
		* コストは従来のBIの1/10
* ユーザ
	* 株式会社　柿安本店
* 従来課題
	* AS400 DB2 400 OLTP
	* Tableau + Redshift + Data spider
* 社内説得
	* 定量化が難しく、段階的に効果測定し拡大した
* ポイント
	* 内製したが、サポートのレスポンスが助かった

## ■事例6 他者クラウドからの移行
* ユーザ
	* 日本情報クリエイト株式会社
* 従来課題
	* 他者クラウドの問題点 安定性
	* 業務時間中のメンテナンス
	* 年2回の大規模障害
	* バックアップのコスト
* 社内説得
	* 現場の声が届いていた
* 負荷テスト
	* 80台3日間
	* といった負荷テストのコスト削減

## ■まとめ / ベストプラクティス
* まずは使ってみる
* 小さな実績を重ねる

---
※当日の生メモです(ほぼ校正していませんm(_ _)m
※登壇者の方の情報など一部 http://www.awssummit.tokyo/devcon/index.html から引用させて頂きました
reshapeで指定できるshape

tensorflowで行列を掛けるためにreshapeすることがあると思います。自分で書いていて、こんなことしてもいいのかな？と思ったことがあって確認してみたので、メモを残しておくことにします。

# したいこと
```py3
import tensorflow as tf
x = tf.placeholder(tf.float32, [2, None, 2])
y = tf.reshape([-1, 2])
z = tf.reshape([2, -1, 2])
```

のように、Noneがshapeの途中に出てくる場合に、別のshapeにしてから元に戻せるかということが気になりました。（実際には、途中で、yに行列を掛けて、その結果を本来のshapeに戻したい）

# 調べた
ipythonで、tf.reshape??のように、クエスチョンマークを2つつけると、関数の定義が見れます。もっとも、コメントと他の関数を呼び出しくらいしか出てきませんが、コメントに自分の興味にあったことが書いてありました。

意訳すると、**shapeに整数の列を入れる場合、"-1"を入れるとしたら、それは一つしか入れてはいけない。一つだけなら、他の次元から逆算できるから大丈夫だ**という話です。逆に、この"-1"はどこに入れなければいけないという制限が書いてないので、どこでもいいということでしょう。

# 試してみた

```py3
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, [2, None, 2])
y = tf.reshape(x, [-1, 2])
z = tf.reshape(y, [2, -1, 2])

a = np.array([[[1,2],[3,4]],[[5,6],[7,8]]], dtype=np.float32)

with tf.Session() as sess:
    print(a)
    print(sess.run(z, {x: a}))
```

無事、aとzが同じものが表示されますね。めでたしめでたし。

# 本当にしたかったこと（数学っぽく）

```math
f: \mathbb{R}^{n_k} \rightarrow \mathbb{R}^m
```

という線形写像で、

```math
1\otimes\dots \otimes 1 \otimes f: \mathbb{R}^{n_1} \otimes \dots \otimes \mathbb{R}^{n_{k-1}} \otimes \mathbb{R}^{n_k} \longrightarrow \mathbb{R}^{n_1} \otimes \dots \otimes \mathbb{R}^{n_{k-1}} \otimes \mathbb{R}^{m}
```

のように最後だけ適用させたかった。これをするのにreshapeする必要があるのは、Tensorの名前を冠しているのに・・・と思ってしまう・・・
技術英語 > Verterium cortenide. [If I'm not mistaken], that's a densified composite material. / as I recall / If my memory is correct

@ Star Trek Voyager > INVESTIGATIONS

ワープドライブ内部が事故で損傷しリビルドが必要となった。材料の確保について議論する中Neelixが

> Verterium cortenide. <font color=red>If I'm not mistaken,</font> that's a densified composite material.

http://eow.alc.co.jp/search?q=if+mistaken
> if I'm not mistaken
確か、もし間違っていなければ


<hr>
関連して思い出したのは
> as I recall

http://eow.alc.co.jp/search?q=as+I+recall
>そういえば、今思い出すと、確か

<hr>
That reminds me of ...

> If my memory is correct

http://eow.alc.co.jp/search?q=memory+is+correct
>（人）の記憶が正しければ、（人）の記憶違いでなければ
rundeckのプロジェクト情報をgitで管理

rundeckのprojectのjob情報をgitと連携できるようになったようです

バックアップなどがはかどりそうですね

それでは早速やってみます

# 設定

project設定画面の「SCM」を押下します

![rundeck_git01.PNG](https://qiita-image-store.s3.amazonaws.com/0/20020/6a8b0c92-7f3b-88d4-4079-60f11c753985.png)

するとそれぞれ設定ができるようなので必要な設定を行います

## SCM Export

![rundeck_git02.PNG](https://qiita-image-store.s3.amazonaws.com/0/20020/0f8747b7-6a71-cd4c-2b98-cd8f8ccd944f.png)

WEB UIで設定を変えたりした際にGitへExportできます

ここでリポジトリのURLや鍵の場所、ユーザー名などを入力する

## 不具合？

Branchは指定してもデフォルトだとmasterにpushしてしまうようです

仕方なくサーバに入り一旦ブランチを作成してからpushしたらうまくいきました

また、本当はデプロイユーザでpushもやりたかったのですがgit側にDeployKeyを登録してしまうとreadのみしかできなくなってしまうのでrundeckユーザでgit側に別途鍵を登録しました

### 実際のテキストファイル

ファイル名は `${job名}-${jobID}.yaml`という形式になっています

実際にgit上にexportされたjobの中身を見てみます

```
- description: |-
    sandbox
    test
  executionEnabled: true
  id: 642075a3-f0ec-44fe-af38-383ba4068ca6
  loglevel: INFO
  name: sample job
  nodefilters:
    dispatch:
      excludePrecedence: true
      keepgoing: true
      rankOrder: ascending
      threadcount: 3
    filter: 'tags: sandbox+app'
  nodesSelectedByDefault: true
  schedule:
    dayofmonth:
      day: '*'
    month: '*'
    time:
      hour: '*'
      minute: '*'
      seconds: '0'
    year: '*'
  scheduleEnabled: false
  sequence:
    commands:
    - exec: sleep 10 && hostname
    keepgoing: false
    strategy: step-first
  uuid: 642075a3-f0ec-44fe-af38-383ba4068ca6
```

どんな設定をしているのかはわかりそうですね


### commit,push

各種設定項目を満たせばjob一覧画面からcommit,pushできるようになります

![rundeck_git03.PNG](https://qiita-image-store.s3.amazonaws.com/0/20020/247d0b03-b4ca-5913-452b-e641beefdb14.png)


commitしていないjobに関してはアイコンで知らせてくれるので忘れることはあまりなさそうです

job名の右側の三角ボタンを押下すると「Commit Changes to Git」と出てくるのでそこからコメントなどを入力してcommitできます

commitする際に「Push Remotely」にチェックを入れるとリモートリポジトリにpushされます

これでバックアップはgitに置く事ができて万が一のときも安心ですね

## SCM Import

既にjobのデータがある場合はimportができます

設定はExportと同じような内容で設定します

![rundeck_git04.PNG](https://qiita-image-store.s3.amazonaws.com/0/20020/6977619d-48eb-f237-a439-dcac8ea484a3.png)


importするjobを選択するとimport出来るようです

![rundeck_git05.PNG](https://qiita-image-store.s3.amazonaws.com/0/20020/ae6309eb-fb61-34ac-c36e-d38047eb70e3.png)

こちらもExport同様鍵を登録してimport出来るようにしました

# まとめ

- Exportしてないjobなどもアイコンですぐ気づくことが出来るので便利
- jobファイルを先に作成してImportというのはつらそう？
    - 設定が多ければ多いほど1からyamlファイルを書いてImportするのは大変そう(試してません)
- 基本はGUI操作 -> Exportの流れになりそうだと思いました
- あくまでバックアップ用途かなという印象を受けました
”ブラウザだけ握りしめて来い！”HyperDev

# HyperDevなんぞそれ

Joel Spolsky氏の新サービス「HyperDev」ベータ公開。アカウント不要、Git不要、サーバ申込不要、OSやミドルウェア不要。超簡単なフルスタックのWebアプリ開発環境 － Publickey
http://www.publickey1.jp/blog/16/joel_sporskyhyperdevgitosweb.html

何処ぞの飲み屋は言いました”1500円だけ握りしめて来い！”（消費税別）
それだけあれば好きなだけ飲み食いさせてやると（時間制限あり）

# 始め方

https://hyperdev.com/

にブラウザでアクセスするだけ。以上。
左上のShowで公開するURLが開く。


# ちょっと触った感想

* ベータ版ながら徹底して簡単さを追求しているかんじ
* InviteのURLを相手に渡せば相手とライブコーディングができるらしい
 * ブラウザのタブで開くと同時に編集される
* サインイン（github連携）すればこれまで作成したプロジェクトの一覧が表示される
* https://hyperdev.com/community/ で他の人のも見れる
* キーボードショートカットあり https://github.com/ajaxorg/ace/wiki/Default-Keyboard-Shortcuts
* 503で動かなくなることも。
* Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHzが2コア
* Linux version 4.5.0-0.bpo.2-amd64 (debian-kernel@lists.debian.org) (gcc version 4.9.2 (Debian 4.9.2-10) ) #1 SMP Debian 4.5.3-2~bpo8+1 (2016-05-13)
* /app/srcが書き込みできる個別の領域としてマウントされている。どのくらい容量制限がかかっているのか不明。tmpfsなのでオンメモリ上。
* 仮想マシン上？のコンテナで実行されている
* 仮想マシンのファイルシステムはおそらくext4
* 仮想化ハイパーバイザーはXenで完全仮想化(lscpu)
* コンテナ内部からインターネットへのアクセスは可能
* mongo入っていない？
ElectronのクイックスタートでCannot find module 'app'にハマった件


## Error: Cannot find module 'app'でハマる
下記を参考にElectronをインストールして実行しようとしていたところ、
[electronのインストールでコケた時の解決方法 on OS X](http://qiita.com/masato_t/items/0a0f5f31b8225c3d9e52)
[30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで](http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29)

ずっとこのエラーでハマってしまった...

```
App threw an error during load
Error: Cannot find module 'app'
    at Module._resolveFilename (module.js:438:15)
    at Function.Module._resolveFilename (/usr/local/lib/node_modules/electron-prebuilt/dist/Electron.app/Contents/Resources/electron.asar/common/reset-search-paths.js:47:12)
    at Function.Module._load (module.js:386:25)
    at Module.require (module.js:466:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Applications/MAMP/htdocs/app/index.js:1:90)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:456:32)
    at tryModuleLoad (module.js:415:12)
```

npm-install-missingなども試すもダメ...

## 解決

変数宣言部分を変更。

```
"use strict";

const electron = require("electron");
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
let mainWindow;

// 全てのウィンドウが閉じたら終了
app.on('window-all-closed', function() {
  if (process.platform != 'darwin') {
    app.quit();
  }
});

// Electronの初期化完了後に実行
app.on('ready', function() {
  // メイン画面の表示。ウィンドウの幅、高さを指定できる
  mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadURL('file://' + __dirname + '/index.html');

  // ウィンドウが閉じられたらアプリも終了
  mainWindow.on('closed', function() {
    mainWindow = null;
  });
});
```

Electronのバージョンが変わって
宣言の仕方が変わったって感じですかね。

JavaScript自体も初心者レベルでElectronも初めて触ります。
「その宣言おかしいよ」
「それって当たり前じゃね？」
「◯◯で解決した方がいいよ」
等あればご指摘お願いいたします。


## 参考
[electronのインストールでコケた時の解決方法 on OS X](http://qiita.com/masato_t/items/0a0f5f31b8225c3d9e52)
[30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで](http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29)
[ドットインストールでElectron講座を期間限定で無償で公開していたので視聴して実際試した](http://pineplanter.moo.jp/non-it-salaryman/2016/02/06/dot-install-electron/)
AndroidでDCIM、Pictureディレクトリのパスを取得する


## 概要
AndroidでDCIM,Pictureディレクトリのパスを取得する方法の備忘録です。

## Environmentクラス
パッケージ

```
import android.os.Environment;
```

Android端末の各環境変数を管理するクラス。
Environment.getExternalStorageDirectory()で内部ストレージのパスが取得できる。

## DCIM

```
Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM + "/";
```

##Picture 

```
Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_PICTURES + "/";
```
Amazon Web ServiceにShiny Serverを設置して、User/passwordを設定（リンクとメモ）

がんばって下の４つの記事を全部やりとげた。

1. [AWSに登録してRをインストールする](http://ipub.com/aws)
2. [Shiny Serverをインストールする](http://ipub.com/shiny-aws/)
3. [httpsにする](http://ipub.com/shiny-https/)
4. [ユーザー・パスワードを設定](http://ipub.com/shiny-password-protect/)


## 困ったところ

### SSHでサーバーにアクセス
１番でウェブ上で自分のUbuntuインスタンスを作成した後に、自分のPCからSSHを介してアクセスするところ。PUTTYを用いる方法が色々書いてあったのだけど、なかなかうまくいかなかった。
自分はパソコンのOSもUbuntuで、結局コンソールから下記のコマンドで入れた。

```
ssh -i <作成したpemファイル名> ubuntu@<Public DNS>
```


### Apache 設定ファイルの編集

３番で、`/etc/apache2/sites-enabled/000-default.conf` ファイルを編集するところで、記事をそのままコピーしたところ、Apacheを再起動した時にエラーがでた（`SSLCertificateKeyFile takes only one argument`のような）。
よく見ると "ProxyPreserveHost" の前の改行が抜けていた。
次のように書き換えたら解決した。

```
<VirtualHost *:*>
 SSLEngine on
 SSLCertificateFile /etc/ssl/certs/apache.crt
 SSLCertificateKeyFile /etc/ssl/private/apache.key
 ProxyPreserveHost On
 ProxyPass / http://0.0.0.0:3838/
 ProxyPassReverse / http://0.0.0.0:3838/
 ServerName localhost
</VirtualHost>
```
[改訂版] 2つのオブジェクトをマージする

オブジェクトの変数同士をマージしたいことがあったので、その時に書いたコードを共有します。

```rb
class A
  attr_accessor [:foo, :bar, :hoge, :baz, :piyo]
  def initialize(initial_props = {})
    initial_props.each do |prop_name, prop_value|
      self.send("#{prop_name}=", prop_value)
    end
  end
  def to_h
    hash = {}
    instance_variables.each do |val|
      if self.send(val.to_s.delete("@"))
        hash[val.to_s.delete("@")] = self.send(val.to_s.delete("@"))
      end
    end
    hash
  end
  def merge(another)
    self.class.new(to_h.merge(another.to_h))
  end
end
```

## initialize
```ruby
  attr_accessor [:foo, :bar, :hoge, :baz, :piyo]
  def initialize(initial_props = {})
    initial_props.each do |prop_name, prop_value|
      self.send("#{prop_name}=", prop_value)
    end
  end
```
hashでpropertyを初期化できるようにしておきます。

##to_hを定義

```rb
  def to_h
    hash = {}
    instance_variables.each do |val|
      if self.send(val.to_s.delete("@"))
        hash[val.to_s.delete("@")] = self.send(val.to_s.delete("@"))
      end
    end
    hash
  end
```
まずこのto_hメソッドを定義してインスタンス変数をhashとして返せるようにします。このときif文でnilのものはhashに含まないようにします。

##mergeを定義

```rb
  def merge(another)
    self.class.new(to_h.merge(another.to_h))
  end
```
続いて上で作成したto_hメソッドを使ってmergeを定義します。中でHash#mergeを使って変数同士をmergeしています。to_hメソッドでnilをhashに含めなかったのはこのHash#mergeを使うためです。そうでないと普通にanother_a_objで上書きする事になってしまいます。マージしたhashから新たにインスタンスを作成して返します

##使ってみる
```rb
a_1 = A.new({foo: "foo", bar: "bar"})
=> #<A:0x007f953db0e620 @bar="bar", @foo="foo">
a_2 = A.new({hoge: "hoge", baz: "baz"})
=> #<A:0x007f953db24088 @baz="baz", @hoge="hoge">
a_1.merge(a_2)
=> #<A:0x007f953b662d30 @bar="bar", @baz="baz", @foo="foo", @hoge="hoge">

//値が被った場合は引数側で上書きされる
pry(main)> a_1 = A.new({foo: "foo", bar: "bar"})
=> #<A:0x007f953b623680 @bar="bar", @foo="foo">
pry(main)> a_2 = A.new({foo: "foo_modified", baz: "baz"})
=> #<A:0x007f953da9d0b0 @baz="baz", @foo="foom_odified">
pry(main)> a_1.merge(a_2)
=> #<A:0x007f953dad7d50 @bar="bar", @baz="baz", @foo="foo_modified">
```

うまくいきました！
もっと良いやり方があれば是非ご意見お待ちしていますm
(コメント欄にあるfrom_kyusyuさんにコメント頂きましたコードでエラー処理もされたより良いものも書いてありますのでそちらもご覧ください。)
キーボードパーティクルアプリを作ってみる

キーボードで入力したら、何でも入力をフックして
パーティクルを表示するアプリを作ってみました
（OSXネイティブアプリです）

![image](https://qiita-image-store.s3.amazonaws.com/0/55077/58a5de83-d3cf-3871-6ff7-6b62b0227c41.png)

・ダウンロード＆インストール方法は下記ページよりどうぞー
https://teradonburi.info/static/keyeffect/keyeffect.html


対象OSX
・Yosemite
・El Capitan

作り方に興味ある方はコメントください
OSXネイティブアプリはiOSに比べて色々情報が少なすぎる（’・ω・｀）
Monolog のHandlerを作る 


PHPでよく使われるMonologのHandlerの書き方

## 基本

Monolog は 各種 Handler を追加することで、ログの出力先を追加・変更する事が出来る仕組みになっている。

Handlerを追加する際には `pushHandler`メソドを利用する。

````
$monolog->pushHandler($handler);
````

似たようなメソドに`setHandler`メソドがあるが、これは既存のハンドラセットを配列で置き換えるもの。

````
$monolog->setHandler([$handler]);
````

### Handler について

Handler は `\Monolog\Handler\HandlerInterface`を継承する事が求められるが、

コレを実装するのは何かと手間なので、自分でHandlerを作成する時には`\Monolog\Handler\AbstractHandler`を実装すると良い。

`\Monolog\Handler\AbstractHandler`は`handle(array $record)`の実装が必要で、

通常はこの中でエラーレベルによるハンドラ実行有無の判定を行い、戻り値としてbool型の`$bubbling`を返す。

`$bubbling`がtrueの場合、Monolog はスタックに続く他のhandlerの起動を棄却する。

シンプルなhandlerの例としては

https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/NullHandler.php

がわかりやすい。

また 単純に`write(array $record)`のみを実行すれば足る`\Monolog\Handler\AbstractProcessingHandler`も用意されている。

## 標準出力に書き込む

Herokuとかで必要な奴

````
$handler = new StreamHandler('php://stdout',Logger::WARNING);
$monolog->pushHandler($handler);
return $log;
````

## Databaseに書き込む

PDOHandlerの例がドキュメントに記載されている。

````
<?php

use Monolog\Logger;
use Monolog\Handler\AbstractProcessingHandler;

class PDOHandler extends AbstractProcessingHandler
{
    private $initialized = false;
    private $pdo;
    private $statement;

    public function __construct(PDO $pdo, $level = Logger::DEBUG, $bubble = true)
    {
        $this->pdo = $pdo;
        parent::__construct($level, $bubble);
    }

    protected function write(array $record)
    {
        if (!$this->initialized) {
            $this->initialize();
        }

        $this->statement->execute(array(
            'channel' => $record['channel'],
            'level' => $record['level'],
            'message' => $record['formatted'],
            'time' => $record['datetime']->format('U'),
        ));
    }

    private function initialize()
    {
        $this->pdo->exec(
            'CREATE TABLE IF NOT EXISTS monolog '
            .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)'
        );
        $this->statement = $this->pdo->prepare(
            'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)'
        );

        $this->initialized = true;
    }
}
````
すべてのユーザテーブルのカラムについて、データ型とデフォルト値を調べるSQL

すべてのユーザテーブルのカラムについて、データ型とデフォルト値を調べるSQLは、

```plpgsql
SELECT
    n.nspname || '.' || c.relname AS table,
    a.attname AS column,
    format_type(a.atttypid, a.atttypmod) AS type,
    (SELECT
         pg_get_expr(d.adbin, d.adrelid)
     FROM
         pg_attrdef d
     WHERE
         d.adrelid = a.attrelid AND
         d.adnum = a.attnum AND
         a.atthasdef
    ) AS default
FROM
    pg_attribute a,
    pg_class c,
    pg_namespace n
WHERE
    a.attrelid = c.oid AND
    c.relnamespace = n.oid AND
    a.attnum > 0 AND
    NOT a.attisdropped AND
    c.relkind = 'r' AND
    n.nspname <> 'pg_catalog' AND
    n.nspname <> 'information_schema' AND
    n.nspname !~ '^pg_toast'
ORDER BY
    n.nspname,
    c.relname,
    a.attnum;
```
Docker (for Mac) 小ネタ


みなもすなるDockerなるものを始めてみる。。。というところで目についたDocker for Mac。
Dockerそのものどうこうの前にちょっとした環境についてのメモ書き。

# Docker for Mac

nativeな仮想環境で動くDocker、とのことでダウンロードしたものの、Beta扱いのためコードを入手せよ、となった。
その認証コードの要求登録手順がわからなくて、適当にDockerのサイトのトップ画面からリンクを踏んだら、再ログインの後、登録画面に飛べた、気がする。
5/31に登録して6/2に送付された、ような。

# Docker Toolbox環境のクリア

コードをもらえるまでは現環境で試してみる、とDocker Toolboxを入れた。
特に問題もなく動いたけれど、Docker for Macを有効にしても環境が切り替わっていないような。。。ということで消すことにした。

## Docker Toolbox

そのものずばりの記事があった。

* [Mac OSXでDocker Toolboxのアンインストール](http://qiita.com/minamijoyo/items/ec5b35382797ac08e067 "Mac OSXでDocker Toolboxのアンインストール")

githubから公式なスクリプト、docker/tools/osx/uninstall.shを実行せよ、と


## VirtualBox

Dockerを消してもVirtualBoxは消えてくれない。
なので別途消す。
こちらもそのままの記事があった。

* [MacのVirtualBoxをアンインストール](http://pc-karuma.net/mac-virtualbox-uninstall/ "MacのVirtualBoxをアンインストール")

インストール用dmgをダウンロードしUnisntall.toolアイコンを端末にドラッグして実行。

## Docker for Mac 

モジュールは先にインストールしていたのでToolboxに巻き込まれて消えた？ような気がするので再インストールした。

# 環境リセット

メニューバーのDockerからSettingsを選択するとUninstall/Resetが選択できる。
Resetを選択すると何からなにまできれいにしてくれるらしい。
イメージやコンテナも消える。
そこからやり直したかったので消したけれど。。。
MacBook Pro Retinaの左右USB

# MacBook Pro Retina 15インチのUSBポート、左の方が良い

## 現象
 Kinectや高速USBカメラなどを使用する際、MacBook Pro Retinaの右のポートを使うと不安定になる場合がありますが、先日DJ出演した際、MacBook Pro Retinaの右ポートに機器をつないでPC DJをしようとしたら音レベルが上がらなくて死にそうになりました。

急遽iPhoneをDJミキサーに繋いでギリギリ音を出し、MacBook Pro Retinaを再起動したり、DJソフトウェアSerato DJをいじったりしましたが解決せず、結局USBメモリーに楽曲を書き出して会場据え付けのCDJを使用して事なきを得ました。。

##右のUSBポートは良くない

使用していたDJコントローラー/オーディオインターフェイス AKAI AMXのFAQを見ていると、[「USBポートがPCから遠いと電力が足らなくて音量がでない場合がある、ハブを使ったりするな」との記述](http://www.akaipro.com/kb/article/1698)がありました。USB 5V給電の装置において、USBケーブルの品質(抵抗)によって電流が流れなないことはありますので、「USBケーブルが悪いのか。。」と考え、数種類のUSBケーブルを切り替えて検証しましたが、右ポートで音量が出ない現象は変わりませんでした。

左のUSBポートにつなぐと信号レベルが通常通りになり、正常に稼働しました。

##電圧電流はほとんど変わらないぞ？?

USB電源チェッカーを使用し、AKAI AMXをさまざまな方法で接続した際の電圧・電流を測りました。

| ポート| 経由 | 電圧 | 電流 | AKAI AMX <br/>OUT信号レベル| 
|:----:+:----:+-----:+------:|:----:|
|左USBポート|直結| 5V | 0.36A| High|
|右USBポート|直結| 4.98V | 0.36A| **Low**|
|右USBポート|Anker<br/>パワードハブ| 5.15V | 0.33A| high|
|右USBポート|inateck<br/>バスパワーハブ| 4.89V | 0.36A| high|
|右USBポート|buffalo<br/>バスパワーハブ| 4.62V | 0.37A| high|
|右USBポート|Evergreen<br/>バスパワーハブ| 4.4V | 0.36A| high|

左USBポートと右USBポートの電流電圧はほとんど変わりません。
Ankerの強力なACアダプターを使ったパワードハブを通して安定するのは理解できるのですが、
**何故かバスパワーで電圧が下がってるのにバスパワーハブを経由すると音声信号レベルが正常になります**

謎だ。。

## tips

 * 大事なUSB装置は左USBポートに接続する
 * どうしても左USBポートを使用できない場合はAnker/inateck/buffalo/EvergreenのUSBハブを使用する
 * **PC DJの際には音トラブル対応のためにiPhone/iPod/USBメモリー/CD/レコード/MCネタなどバックアップの手段を準備しておく**
Crystalのplaygroundをローカル環境で実行する

`crystal play` でplaygroundをローカル環境で実行可能です。

## <i class="fa fa-list" style="font-size:1em;"></i> できること
* 実行結果、型情報の表示
* 繰り返し実行の結果もすべて表示
* スクリプトをファイルとしてダウンロード

![download_file.png](https://qiita-image-store.s3.amazonaws.com/0/43480/162702c6-8a19-dee0-4001-5271200f8136.png)

* スクリプトをgistに投稿（要API TOKEN設定）

![gist.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3febb79f-f1c4-1622-3810-1c224c020c57.png)

## <i class="fa fa-play-circle" style="font-size:1em;"></i> デモ
```bash
$ crystal play
Listening on http://localhost:8080
```

![playground.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/996a3309-3524-e5d5-b409-ea0c5539a9de.gif)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Crystal 0.14.1 released!](http://crystal-lang.org/2016/03/21/crystal-0.14.1-released.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [crystal playground](https://github.com/rilian/crystal-playground)
CrystalとRubyのヒアドキュメントの比較

CrystalとRubyのヒアドキュメントを比較します

## :red_circle: Ruby (<<LABEL)
`<<LABEL` の場合、終端のラベルが行頭でないとエラーになります。

```ruby
puts <<EOS
  hoge
  hoge
    hoge
EOS

# EOSを行頭に書かないとエラーになる
#  puts <<EOS
#  hoge
#  hoge
#    hoge
#  EOS
```

### 出力
```
  hoge
  hoge
    hoge
```

## :red_circle: Ruby (<<-LABEL)
`<<-LABEL` 形式にすると、終端のラベルが行頭でなくてもエラーにはなりません。

```ruby
puts <<-EOS
  hoge
  hoge
    hoge
EOS

# EOSを行頭に書かないとエラーになる
  puts <<-EOS
  hoge
  hoge
    hoge
  EOS
```

### 出力
```
  hoge
  hoge
    hoge
  hoge
  hoge
    hoge
```

## :red_circle: Rails
RailsのActiveSupportの **String#strip_heredoc** を使うと
インデントの開始位置を基準に不要の先頭の空白を除去してくれます。

```ruby
require 'active_support/core_ext/string/strip'

def get_hoge
  hoge = <<-EOS.strip_heredoc
  hoge
  hoge
    hoge
  EOS
end

puts get_hoge
```

### 出力
```
hoge
hoge
  hoge
```

## :crystal_ball: Crystal
Crystalのヒアドキュメントは終了ラベルの位置に合わせて
先頭の空白を除去してくれます。

```ruby
puts <<-EOS
  hoge
  hoge
    hoge
EOS

  puts <<-EOS
  hoge
  hoge
    hoge
  EOS
```

### 出力
```
  hoge
  hoge
    hoge
hoge
hoge
  hoge
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Crystal String](http://crystal-lang.org/docs/syntax_and_semantics/literals/string.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Crystal String - ja](http://ja.crystal-lang.org/docs/syntax_and_semantics/literals/string.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ruby String - るりま](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fliteral.html#here)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Rails String#strip_heredoc - Tbpgr Blog](http://tbpgr.hatenablog.com/entry/20140210/1392037606)
Excelで便利なショートカット　～セル移動、選択～

自分が教えてもらって便利だったショートカット
# 1. データ末尾へ移動
Ctrl + 方向キー
現在のデータから値が入力されている最後のセルへ移動します。
下の例ではB3セルからCtrl + →、Ctrl + ↓、Ctrl + ←、Ctrl + ↑と操作しています。
![excel_cell1.gif](https://qiita-image-store.s3.amazonaws.com/0/83184/763bd88c-940b-2b45-24a0-5b2d2b3e1fe1.gif)

# 2. セル選択
Shift + 方向キー
１セルずつ選択範囲を指定します。  
下の例ではB3セルから Shift + → × 2、Shift + ↓ × 3と操作しています。
![excel_cell2.gif](https://qiita-image-store.s3.amazonaws.com/0/83184/ed1b40d6-10c2-7bdf-efd1-751e92cdae36.gif)

# 3. データの末尾までセル選択
Ctrl + Shift + 方向キー
データの末尾まで一気に選択します。  
下の例ではB3セルから Ctrl + Shift + →、Ctrl + Shift + ↓と操作しています。
![excel_cell3.gif](https://qiita-image-store.s3.amazonaws.com/0/83184/f2dbf6dd-f649-c610-ad62-d5d7376501ce.gif)
fillin_formについて


Sledgeにはfill_informという機能がある。
これにハマったのでメモ的に残す。

SledgeはMVCフレームワークだがコントローラ間でパラメータをやり取りしながら

fill_informとは
テンプレートに渡すパラメータのうち、ｉｎｐｕｔタグに同名のものがある時、そのvalueに変数の内容を自動でセットしてくっるというもの。


これを無効にする方法はFAQ.podに下記のように記述されている。

```
=item Q. FillInForm を止めたい

=item A.

fillin_form() アクセサで false をセットする。

デフォルトでは、$r->method eq 'POST' の場合に fillin_form が有効になり
ます。無効にするには、$self->fillin_form(undef); を明示的に呼び出しま
す。dispatch_* のどこで実行してもOKです。

利用するクラス内の全 dispatch_* メソッドでとめたい場合は、

  sub fillin_form { undef }

```

参考

[livedoor/Sledge](https://github.com/livedoor/Sledge)
GoogleVRサンプルをiOSでシュミレーション？

昨日の[Unity初心者がDaydreamのサンプルを試すまで](http://qiita.com/minely/items/a8b92836172ecca85eed)の続きです。

iOSでもサンプル実行は可能と参考にした
[開発者がGoogleの新しいVRプラットフォームDaydreamを試してみて分かったこと](http://www.moguravr.com/daydream-dev-tips/)にあったのでやってみます。

#事前準備
①iPhoneに[UnityRemote](https://itunes.apple.com/jp/app/unity-remote-4/id871767552?mt=8)をインストール

#試す
①コードの変更
　　　EditorDevice.csの変更ですがファイルがどこにあるのかわからないのでCtrl+Fで探し出しました。
<img width="1608" alt="スクリーンショット_2016-06-03_0_17_07.png" src="https://qiita-image-store.s3.amazonaws.com/0/9256/f940978e-efda-db43-e9c3-30ba2e8079df.png">
ダブルクリックしたら参考記事の通りにコードを編集

②UnityRemoteの設定
<img width="375" alt="IMG_1069.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/9256/364d9c16-8d02-c88b-d83c-61f6baed8ed1.jpeg">
iPhoneにインストールするとこんな感じで表示されるとおもうのでしたがってUnityを操作します。
<img width="1639" alt="スクリーンショット_2016-06-03_0_29_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/9256/c299ed62-5957-4322-fd16-5f01c3296bfe.png">
これが終わったら後はまた実行を押せば記事みたいにiPhoneにUnity側の画面が写ってAndroidのコントローラーで操作できます！！！！！！

とりえあずDayDreamちゃんと対応した端末が出るまではこれでいこうとおもいます。
![Cj9IcKsUYAAl2yc.jpg](https://qiita-image-store.s3.amazonaws.com/0/9256/48d1d1c7-eda3-1ba1-d248-e251ed67fec0.jpeg)

**一通りサンプルも動かしたし、ホントにUnityの入門に入ろうと思います。。。。**
terraformでEC2を作ると同時にprivate_ipをRoute53 Internal DNSで俺の考えた最強にイケてるしやばい名前をつける方法

俺です。

EC2のPrivate IPに自分で考えた名前をつける乙なことをしてみたい時のメモです。
countとelementを使うことでterraformでLaunchするEC2の台数が変動してもいい感じにDNS登録されます

以下例

前提: VPC DNS hostnameは有効にすること

# EC2

- variables

```
variable "unko" {
  default = {
    name = "unko"
    ami = "ami-XXXXXXXX"
    instance_type = "c4.2xlarge"
    iam_instance_profile = "unko"
    source_dest_check = true
    ebs_optimized = true
    root_block_device = "gp2"
    root_block_device_size = 100
    count = 2
  }
}
```

- ec2.tf

```
resource "aws_instance" "unko" {
..省略..
  count = "${lookup(var.unko, "count")}"
}
```

# Route53

```
resource "aws_route53_zone" "unko" {
  name = "unko"
  vpc_id = "${aws_vpc.unko.id}"
  vpc_region = "ap-northeast-1"
  tags {
    Type = "Internal DNS"
  }
}

resource "aws_route53_record" "unko" {
  zone_id = "${aws_route53_zone.unko.zone_id}"
  name = "unko-${count.index + 1}-${element(aws_instance.unko.*.availability_zone, count.index)}"
  type = "A"
  ttl = "5"
  count = "${lookup(var.unko, "count")}"
  records = [
    "${element(aws_instance.unko.*.private_ip, count.index)}"
  ]
}
```

```
$ terraform apply
```

これでOK

`完`
Slackの会話から韻を踏んでいるフレーズを検出する

業務上、韻（ライム）を踏んでいるフレーズがどうしても必要になってしまったのでSlackのbot（lita）用にプラグインを作ってみました。
[文章中から韻を踏んでいるフレーズの組み合わせを検出する gem を作りました](http://qiita.com/suzuki86/items/2a2801944a3e393464c7)からrhymerという素敵gemを使わせてもらいます。

# 準備
litaのGemfileに追記します。

```rb:Gemfile
gem 'rhymer', :git => 'https://github.com/suzuki86/rhymer.git'
gem 'lita-rhyme', :git => 'https://github.com/hoshinodis/lita-rhyme.git'
```

あとmecabも入ってるといいです。 `brew install mecab mecab-ipadic`
辞書は[neologd](https://github.com/neologd/mecab-ipadic-neologd)の方が検出しやすいかも

# 見た目
このように長文から韻を踏んでるところを検出してくれます（動作自体はrhymerのそれです）。
複数ある場合はランダムに一つ選んで発言するようにしました。
<img width="504" alt="スクリーンショット 2016-06-02 23.48.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/42777/a084558c-f199-86a6-59aa-775349da10f1.png">

# 感想
普段の何気ない会話や大事な話の最中に空気を読まずに韻を踏むため僕の身長も2cm伸びて彼女もできました。
`rhymer`を作成していただいたsuzuki86さんには感謝の念に堪えません。ありがとうございます。

# ソース
https://github.com/hoshinodis/lita-rhyme

## todo
- `VIBES_THRESHOLD_DEFAULT` `PREFIX_LENGTH_DEFAULT` をlita_configで設定するようにするかも
- そのうちrubygemsに登録する
独自ドメインで Bitly を運用する際の IP アドレスが変わったらしい

要約すると 2016年6月29日以降今までのIPアドレスでは使えなくなるよ！ ということです。
__Aレコードではなく CNAME で`cname.bitly.com` を指定してる方は変更するところはないみたいです！__

詳しくは [ここ](https://bitly.com/change-dns-settings) を見ればわかります！

追記: Bitly の設定項目を追加しました(16年6月3日)

## やること

Aレコードを指定してる方が対象です!
(もしこの記事を見た方でCNAMEを指定していしててBitly側の設定が必要だったら教えて下さい)

### DNS 設定

今まで

- 69.58.188.49
- 69.58.188.50

とAレコードを指定してたところを

- 67.199.248.12
- 67.199.248.13

に変更すればDNSの設定は完了です。

### Bitly 側の設定

DNSの設定後 Bitly にログインすると次のような案内が出ると思います

<img width="371" alt="SS 2016-06-03 0.10.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/96420/6e365bd8-c79b-8d9a-a88a-21dd7567c47d.png">

これは右上のバツ印を押して消してもらっても構いません。

消したあと右上のメニューボタンを押し

- `Settings > Advanced Settings`

と設定の項目を移動すると次の写真用になってると思うので

<img width="284" alt="SS 2016-06-03 0.11.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/96420/b8977ca5-bfe5-d3bf-e8b9-7726d9e7575d.png">

`REVALIDATE NOW` のボタンを押せば完了です!
AWSのEC2とSESでメール送信してみた

メールサーバの移行が必要になったので、AWSのSESを試してみたのだが、新しめのサービスだからか、とにかく情報が少なかったのではまったところなどをメモ。

特にはまったのは下記2点。

- SESでRuby on Railsからメールを送信する
- そもそも SES（Simple Email Service）で何ができるのか？

#1.SESでRuby on Railsからメールを送信する

普通にやり方はググれば[ここ](http://blog.digital-squad.net/article/389286395.html)とか、[ここ](http://okochang.hatenablog.jp/entry/2013/06/27/100115)とかいくらでも出てきます。
ただ、TLSを使わないといけないのだが、特にそういうことが[AWSのSESのドキュメント](http://docs.aws.amazon.com/ses/latest/DeveloperGuide/Welcome.html)にも書いてなかったので、いろいろ試してたまたまわかった感じ。
そもそも、Ruby on Railsのバージョンが古かったので、デフォルトで対応していなかったのがいけないんですかね。
ちなみに、TLSを使った接続は[俺の基地さんの記事](http://yakinikunotare.boo.jp/orebase/index.php?Ruby%20on%20Rails%2FActionMailer%A4%C7TLS%A4%F2%BB%C8%A4%C3%A4%BF%A5%E1%A1%BC%A5%EB%C1%F7%BF%AE)を参考にさせていただきました。本当に助かりました。

#2.そもそも SES（Simple Email Service）で何ができるのか？

もともと、SMTPでメールを送信する機能はあったが、2016年5月現在では、受信したメールをS3に保存したりLambda関数で処理することができる。

ただ、通常のPOP、IMAPのような使い方はできないらしい。

実は、今回これが一番困りました。

「できない」と明言している記事が見つからず、「できることはこれだけなんだから察しろよ」って感じでした。
もしかしたら、Lambdaで頑張ればできるのかもしれないし（ただ、感覚的に外部のメールサーバが必要になりそう）、将来的にはできるようになるのかもしれないですね。

最終的には、SESの利用を諦めて、さくらインターネットのメールボックスを利用することにしたので、これ以上調べていないので、詳しい方いたらご指摘いただけると幸いです。
【自分用】IOSのCore Plot

#公式ドキュメント
http://core-plot.github.io/iOS/index.html

#実装サンプル
##公式サンプル
https://github.com/core-plot/core-plot/tree/master/examples

##サンプル
https://www.raywenderlich.com/13271/how-to-draw-graphs-with-core-plot-part-2
##グラフでリセット
https://teratail.com/questions/21834
##X,Y軸を設定
http://d.hatena.ne.jp/paraches/20110827/1314460684

#メソッド例
##CPTAxis
軸の抽象クラス
##CPTLayer
コアアニメーション層の基本クラス
##CALayer
fundation:QuartzCore
画像ベースのコンテンツを管理し、その内容にアニメーションを実行することができます。
##CPTXYAxis
2次元のXY軸クラス
NSViewController Hierarcy

NSWindowControllerのcontentViewControllerからのNSViewControllerの階層表示

```objc
- (void)showViewControllerHierarchy:(NSViewController *)viewController level:(NSInteger)level
{
	if(!viewController) return;
	
	NSString *desc = [NSString stringWithFormat:@"<%p> %@", viewController, viewController];
	fprintf(stderr, "%*s%s\n", (int)level * 4, " ", desc.UTF8String);
	for(NSViewController *vc in viewController.childViewControllers) {
		[self showViewControllerHierarchy:vc level:level + 1];
	}
}

- (IBAction)showViewControllerHierarchy:(id)sender
{
	[self showViewControllerHierarchy:self.contentViewController level:0];
}
```
rubyでnilを意識しないスマートなコードを書く

# nilを意識しないとは
nilに対して不正なメソッド呼び出しをしようとした時には、その結果がnilであることを期待するようプログラミングをするケースが多いと思います。 そして、その場合には下記のようにActiveSupportのtry!メソッドを使用することが多いと思います。

```ruby:
result = nil
result.try!(&:first_method).try!(&:second_method) # => nil
```
上記のように、nilのときにはメソッド呼び出しを行わない、ということを分岐を書かずに実現することをnilを意識しないと言っています。

※追記：Ruby2.3以降なら通称ぼっち演算子がつかえるそうなので、そちらがベターだと思う。

```ruby:
result = nil
result&.first_method&.second_method # => nil
```

## try!やifを重ねるのは美しくない
```ruby:
result = nil
return result.try!(&:first_method).try!(&:second_method) 
```

```ruby:
result = nil
return nil if result.nil?
temp = result.first_method
return temp.nil? ? nil : temp.second_method 
```
nilの可能性がある変数に対し、nilの場合はメソッド呼び出しを行わない場合、毎回try!やif分岐を加えると、なんだか読みづらくなります。
if分岐に至っては、メソッドチェーンができなくなり最悪です。

## NilClass.method_missingのオーバーライドという黒魔術
なぜnilの場合にメソッドを呼び出さないようにするかというと、nilではない他のクラスのインスタンスに実装されているメソッドを呼びだそうとしている時にnilがレシーバとなると、呼び出すはずのメソッドが存在せず、NilClassからNoMethodErrorが発生するからです。
そして、NoMethodErrorは、存在しないメソッドが呼び出された時に実行されるmethod_missingメソッド内でraiseされています。

つまり、NilClassのmethod_missingメソッドをオーバーライドし、superを呼びださなければNoMethodErrorは発生しないことになります。NoMethodErrorが発生しなければ、try!やif分岐を組む必要もありません。
さらに、nilを返すことでtry!と同じような挙動を実現できます。

```ruby
class NilClass
  def method_missing(name, *args, &block)
    nil
  end
end

result = nil
result.first_method.second_method # => nil
```

## 使う時は慎重に
try!を使わなくてもnilをスルーできるのでコード量が減り、スマートに書くことが出来るようになりますが、タイポに気づきにくくなる等、弊害もあります。

```ruby
result = nil
result.to_S # => nil
result.try!(&:to_S) # => NoMethodError: undefined method `to_S' for nil:NilClass
```
try!の場合はレシーバがnilの時にメソッドを呼ばない。
method_missingのオーバーライドの場合は、NilClassに存在しないメソッドが呼ばれてもエラーが出ないようにする。

というアプローチの違いから起きる弊害です。
emacsの行間隔を変更する

webページなどの長い文書を読んでいると目が疲れるので、emacsの[フォントサイズを変更](http://qiita.com/styzo/items/9251ffc4948fe7b2604f)したり、各バッファの行間隔をインタラクティブに変更したい。
検索すると似たようなことをやっている記事もあるが、自分なりの設定。

```el
;;; 行間のスペースの設定(バッファローカル)
(defun ls0 (ls)
  (interactive "P")
  (setq line-spacing (if (integerp ls) ls nil)))

(defun ls4 () (interactive) (ls0 4))
(defun ls8 () (interactive) (ls0 8))
(defun ls12 () (interactive) (ls0 12))

(defun ls+ ()
  (interactive)
  (setq line-spacing (+ (or line-spacing 0) 1))
  (redraw-frame))

(defun ls- ()
  (interactive)
  (unless (or (null line-spacing) (<= line-spacing 0))
    (setq line-spacing (- line-spacing 1))
    (redraw-frame)))

(global-set-key "\M-]" 'ls+)
(global-set-key "\M-[" 'ls-)
```

`M-x ls0`で隙間なし。
`M-x ls4`で4ピクセル空ける。以下同様。
数前置子指定可 (`M-2 M-0 M-x ls0`など)。
`M-]`で1ピクセルずつ広げる。
`M-[`で1ピクセルずつ狭める。

参考:
[さっとEmacsのフォント・行間のサイズを変更する](http://qiita.com/fujii_0v0/items/24f9427220d9ac9f7f88)
気圧計 (v0.5) + udpLogger (v0.2) 

```txt:動作環境
ESP-WROOM-02 + ユニバーサル基板実装
気圧計: MPL115A2
microSDスロット: CK-40 (sunhayato)
```

気圧計　http://qiita.com/7of9/items/09272fcfb56bd479c679
udpLogger http://qiita.com/7of9/items/6dc086b17fc43715b48b
microSD http://qiita.com/7of9/items/280758359f3d2c0c7fe8


## 気圧計 (v0.5)

[v0.5 @ github](https://github.com/yasokada/esp8266_160528_MPL115A2/releases/tag/v0.5)

以下を追加

- [International Standard Atmosphere](http://qiita.com/7of9/items/d8101e9c5afbcff39f5c)の式を用いて気圧から高度計算
- udpLoggerへ送信

ソースは以下のように分離した

- esp8266_160528_MPL115A2.ino : メイン（気圧計通信含む)
- esp8266_160602_udpTxToLogger.ino : udpLoggerへの通信関連
- lib_160602_calcAltitude.ino : 気圧からの高度計算

気圧計通信をメインから分離した方が見通しがいいかもしれない。


## udpLogger (v0.2)

[v0.2 @ github](https://github.com/yasokada/esp8266_160521_udpLoggerWithAccessPoint/releases/tag/v0.2)

microSD保存時にCRLFが多い不具合を解消。

## 写真

左が気圧計、右がudpLogger

![DSC_0172.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/764a2958-a828-148a-b421-1c885a519323.jpeg)

## データ

気圧計のデータがUDP経由でudpLoggerへ送信され、それがudpLoggerによりmicroSDに保存された。
作成されたファイルは以下。

```TEST.TXT
Pressure(kPa)=101.05,Altitude(m)=22.08
Pressure(kPa)=101.08,Altitude(m)=19.91
Pressure(kPa)=101.06,Altitude(m)=21.61
Pressure(kPa)=101.06,Altitude(m)=21.33
Pressure(kPa)=101.06,Altitude(m)=21.77
Pressure(kPa)=101.05,Altitude(m)=22.21
Pressure(kPa)=101.06,Altitude(m)=21.98
Pressure(kPa)=101.06,Altitude(m)=21.47
Pressure(kPa)=101.05,Altitude(m)=22.13
Pressure(kPa)=101.06,Altitude(m)=21.50
Pressure(kPa)=101.06,Altitude(m)=21.85
Pressure(kPa)=101.06,Altitude(m)=21.75
Pressure(kPa)=101.05,Altitude(m)=22.20
Pressure(kPa)=101.06,Altitude(m)=22.01
Pressure(kPa)=101.05,Altitude(m)=22.54
Pressure(kPa)=101.04,Altitude(m)=23.15
Pressure(kPa)=101.07,Altitude(m)=20.63
Pressure(kPa)=101.05,Altitude(m)=22.54
Pressure(kPa)=101.05,Altitude(m)=22.32
Pressure(kPa)=101.04,Altitude(m)=22.95
Pressure(kPa)=101.07,Altitude(m)=21.13
```

細かい不具合はまだありそう。

天保山登山は今週末か来週末か。To be or not to be. 

連続試験でバッテリーの持ちも気になる。

時刻がないのもこれから。RTCモジュールは今日到着したが。
Qiitaのフィードを無限スクロールにするスクリプト

Qiitaのフィードのもっと読むをクリックするのが面倒なので、スクロールしたら自動読み込まれるスクリプトを書いてみました。地味に便利。

## インストール

greasemonkeyがすでにインストールされている必要があります。
greasemonkeyがインストールされていれば、以下のリンクをクリックでインストールできます。

[インストール](https://raw.githubusercontent.com/akameco/gm-qiita-infinite-more/master/gm-qiita-infinite-more.user.js)

もしくはgithubからインストールしてみてください。

[akameco/gm-qiita-infinite-more](https://github.com/akameco/gm-qiita-infinite-more)

chrome向けにchrome拡張も書いてみましたが、登録料が5ドルかかるとつくってから知ってAppStoreに出してないですが、githubには公開しています。
こちらはインストールは手動です。

[akameco/qiita-infinite-more](https://github.com/akameco/qiita-infinite-more)

## デモ
![qiita.gif](https://raw.githubusercontent.com/akameco/gm-qiita-infinite-more/master/media/qiita.gif)

## コード

スクリプト自体非常に単純で特定の要素に来たら、クリックイベントを発火させているだけです。

```js
// ==UserScript==
// @name        gm-qiita-infinite-more
// @namespace   gm-qiita-infinite-more
// @include     http://qiita.com/*
// @version     1
// @grant       none
// ==/UserScript==

function infinitelyMore() {
	const btn = $('.more-button').get(0);

	if (!btn) {
		return;
	}

	const wHeight = window.innerHeight;
	const wScroll = window.pageYOffset || document.scrollTop;

	const btnOffset = $('.more-button').offset().top;
	if (wScroll > (btnOffset - wHeight)) {
		btn.click();
	}
}

document.addEventListener('DOMContentLoaded', () => {
	window.addEventListener('scroll', infinitelyMore);
	window.addEventListener('resize', infinitelyMore);
});
```
Rails 5からバックポートしたい＆できる新機能：ApplicationRecord

Rails 5もRC版が出てきて、そろそろ仕様が固まってきた頃かと思いますが、見ていたところ、Rails 4へそのまま適用できそうな機能が標準化されていました。

# コントローラーとモデルでの違い
Rails 4でコントローラーを作ると、以下のようになります。

```rb:app/controllers/hoges_controller.rb
class HogesController < ApplicationController
  # 中身は略
end
```

一方で、モデルを作ると以下のようになります。

```rb:app/models/hoge.rb
class Hoge < ActiveRecord::Base
end
```

この2つの大きな違いですが、`ActiveRecord::Base`は`activerecord` gemのクラスなのに対して、`AplicationController`はアプリケーションに用意されたものとなっています。なので、「全コントローラーに共通する処理」を、自分で`AplicationController`に置くことができます。一方で、`ActiveRecord::Base`に共通処理を置くなんて芸当はあまりやりたくないものです。

# Rails 5の機能を見ていて
そんな中でRails 5について書かれていたものを見ていると、[モデルの基底クラスとして`ApplicationRecord`が導入される](http://qiita.com/ryohashimoto/items/09724ad4dddcda01bce3#activerecord%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8Capplicationrecord%E3%81%8B%E3%82%89%E7%B6%99%E6%89%BF%E3%81%95%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB)という話が入ってきました。

で、せっかくなので実装を確認してみると、なんとRails 4にそのまま適用できるものでした。

# AcvtiveRecordと継承
機能だけ継承するときに[ActiveTypeが必要となる](http://qiita.com/jkr_2255/items/271ed85e03c0ae27d5e5)ように、ActiveRecordをふつうに継承してしまえばSTIの機能が働いてしまってうまく行きません。それでは、`ApplicationRecord`はどのような実装なのでしょうか。

```rb:app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
```

と、クラスメソッドの`abstract_class=`で切り替えていました（これ自体はもっと前のRailsからあります）。ということで、同様に実装すればRails 4でも全モデル共通の操作を`ApplicationRecord`へまとめることができます。

余談ですが、既存のモデルの`ActiveRecord::Base`を`ApplicationRecord`に一括置換する際に、うっかり`ApplicationRecord`の基底クラスまで書き換えてしまわないように、お気をつけ下さい。
Railsでdeviseをインストール時に躓いたこと

ひたすらルーティングエラーがでていて頭が爆発しそうになった。

そのエラーコードはサインナップのリンクを押したときだけ

Couldn't find User with 'id'=sign_up

```ruby:html
Extracted source (around line #67):
65
66
67
68
69
70
              
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
```

なんでや！なんでや！
悩みまくって、５０本毛が抜けてから、ふとルートに記述した`devise_for :user`をrootファイルの先頭に記述しなたら治った。

rake routesで違いを確認するも、ルートに記述した順番が記述順に並び変わるだけで他は変化なし。

なんでじゃ！・・・と思いつつ、とりあえず動いたのでヨシ
El Capitan 環境の Sublime Text 3 に sublime-lightning を導入する

お便利エディタ「Sublime Text 3」に sublime-lightning プラグインを導入すれば、Salesforce の Lightning Component の開発も Sublime Text 3 上でできるようになる。

https://github.com/dcarroll/sublime-lightning

しかし Mac OS X El Capitan の環境では設定がやや面倒くさいというお話。

sublime-lightning プラグインは、Salesforce の環境にアクセスして情報を取得するため、 Force.com CLI なるコマンドを利用する。
https://force-cli.heroku.com

Sublime Text 3 で Force.com CLI を利用するためには、Sublime Text 3 がわかるパスに Force.com CLI のバイナリを配置する必要がある。

Mac OS X に sublime-lightning プラグインを導入する方法を説明したブログ等では Force.com CLI を /usr/bin に配置する説明を多く見かける。

ところが El Capitan では System Integrity Protection なるセキュリティ機構が導入されており、ルート権限を持っているユーザでさえも、/usr/bin や /bin 等の管理系コマンドが配置されているディレクトリに対し、コピーや移動をして新たなコマンドを追加することができなくなっている。

この機構を突破することはいくつかの設定を行えば可能になるものの、それはそれでそれなりに面倒くさい。（将来OSのバージョンが上がった場合、同じ方法が使える保証もない）

そんなわけで、System Integrity Protection は受け入れつつ、El Capitan 環境に Sublime Text 3 + Force.com CLI + sublime-lightning を導入する方法を探したところ、以下のブログに情報が書かれているのを発見。

- [Salesforce Lightning support in Sublime Text 3 for Mac OSX](https://meltedwires.com/2015/10/22/salesforce-lightning-support-in-sublime-text-3-for-mac-osx/)

このブログに書かれてる内容は以下のようなもの。

- Force.com CLI を /usr/local/bin 等の、OS利用者がインストールできる実行ファイル管理ディレクトリに配置にコピーする。
- Sublime Text 3 をターミナル等から起動するための "subl" コマンドも /usr/local/bin にシンボリックリンクを貼る。
- ターミナルを開いて、"subl" コマンドを実行して Sublime Text 3 を起動する。
	- このとき /usr/local/bin の subl コマンドが実行され、同じディレクトリに配置した Force.com CLI コマンドを使って Salesforce環境にアクセスできるようになる。
	
ということで、これにて sublime-lightning プラグインが使えるようになったものの、Dock やアプリケーションから Sublime Text 3 を実行したときは、/usr/local/bin のsublコマンドが実行されず Force.com CLI も無効となる。ターミナルから subl コマンドで起動するのを忘れないようにしないと。