OmniAICreator/Qiita-1.07M huggingface dataset:
考察 > ソフト間通信 > 最長100文字のコマンドを送信, 応答を受信

```txt:動作環境
Windows 7 pro 32bit
```

同じPC上で複数のソフト間の通信について検討中。

今のところ知っている情報より検討

## File Mapping使用

- FileMappingの使用
  1. Sender側でNamed File Mappingを作成
  - Sender側からReceiver側へSendMessage()で書出し完了通知
  - Receiver側がNamed File Mappingから内容を読取る
  - Receiver側からSender側へSendMessage()で読取り完了通知
  - Sender側でCloseHandle()する. File Mappingが削除される

上記の処理において、Sender側からSendMessage()した後に、ある指定のタイムアウト時間(1000msec)で応答がなかった時にCloseHandle()する。

応答については上記の反対を行う。

## Window Message使用

- Window Message使用
  1. Sender: Window Messageで1文字ずつ最大100個のコマンド相当数値を送り続ける
  - Receiver: 100文字(あるいはある指定の終端数値)まで受取る

応答については上記の反対を行う。

スタートビット、ストップビットに相当する文字（に対応するlong型?)を定義しておかないと、Receiver側で通信内容の区切りが分からなくなる。
Herokuでリクエストを受けとり、VPSで処理をするLINE BOTをつくってみた

# 対象

[LINE BOT をとりあえずタダで Heroku で動かす](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516) を参考にタダで Heroku で動かせたひと。
SSL証明書はないけど、固定IPの割り当てられてる VPS （など）を持ってるひと。

# なんとかしたい

`Fixie` プラグインの毎月500リクエストで制限がかかってしまうのをなんとかしたい。

# 対策

Heroku で LINE サーバからリクエストを受け取ってキューイングし、VPS で取り出して LINE API にリクエストを投げる。
`Fixie` に頼らなくてよくなる。
キューイングの仕組みは、[heroku-redis](https://elements.heroku.com/addons/heroku-redis) と [sidekiq](https://github.com/mperham/sidekiq) を使うと簡単。
（ただし heroku-redis はまれに接続情報が変わるので、VPS で redis の運用をした方がより良さそう）

# やってみる

[参考文献](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516)のプログラムを元に改造していく。
まず `app.rb` にあったオウム返し処理を `echoback.rb` に切り出す。（sidekiq の設定もついでにかく）

```app.rb
require 'bundler/setup'
require 'sinatra'
require 'json'
require './echoback'

post '/linebot/callback' do
  params = JSON.parse(request.body.read)

  params['result'].each do |msg|
    Echoback.perform_async(msg)
  end

  "OK"
end
```

```echoback.rb
require 'sidekiq'
require 'httpclient'

Sidekiq.configure_client do |config|
  config.redis = { url: ENV.fetch('REDIS_URL'), namespace: ENV.fetch('RACK_ENV') }
end

Sidekiq.configure_server do |config|
  config.redis = { url: ENV.fetch('REDIS_URL'), namespace: ENV.fetch('RACK_ENV') }
end

class Echoback
  include Sidekiq::Worker

  def perform(msg)
    request_content = {
      to: [msg['content']['from']],
      toChannel: 1383378250, # Fixed  value
      eventType: "138311608800106203", # Fixed value
      content: msg['content']
    }

    http_client = HTTPClient.new
    endpoint_uri = 'https://trialbot-api.line.me/v1/events'
    content_json = request_content.to_json
    http_client.post_content(endpoint_uri, content_json,
        'Content-Type' => 'application/json; charset=UTF-8',
        'X-Line-ChannelID' => ENV["LINE_CHANNEL_ID"],
        'X-Line-ChannelSecret' => ENV["LINE_CHANNEL_SECRET"],
        'X-Line-Trusted-User-With-ACL' => ENV["LINE_CHANNEL_MID"]
      )
  end
end
```

```rb
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
gem 'sinatra'
gem 'httpclient'

# gemも3つ追加
gem 'sidekiq'
gem 'redis-namespace'
gem 'dotenv'
```

```
# Procfile
web: bundle exec ruby app.rb -p $PORT
```

続いて、Heroku と VPS それぞれの環境を整える。
あと LINE の Whitelist に VPS の IP を登録する。

### Heroku

[heroku-redis](https://elements.heroku.com/addons/heroku-redis) をよしなにインストール。
ちなみに heroku-redis はメモリ25MBまで無料枠。

### VPS

ソースコードをもってきて `bundle` する。
`.env` をつくる。

```bash
$ git clone https://github.com/user/sample
$ cd sample
$ bundle
$ vi .env
LINE_CHANNEL_ID='XXXXXXXXXXX'
LINE_CHANNEL_SECRET='XXXXXXXXXXX'
LINE_CHANNEL_MID='XXXXXXXXXXX'
REDIS_URL='XXXXXXXXXXX'
```

`REDIS_URL` は `heroku config | grep REDIS` で確認できる。

最後に `sidekiq` を動かす。 `heroku-redis` の最大コネクション数が20なので、それに収まるように調整する。

```bash
$ bundle exec sidekiq ./echoback.rb -c 5
or
$ bundle exec sidekiq ./echoback.rb -c 5 -d -L /path/to/logfile
```

以上で、LINE BOT に話しかけると Heroku と VPS が連携してオウム返し処理をしてくれる。
Knockoutでイベントハンドラーをバインドする



# ソースコード
```html:alert.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-debug.js"></script>

<body>
    <button data-bind="click: showAlert">clickでalert表示</button>
    <script>
        ko.applyBindings({
            showAlert: () => alert('hello wrold!')
        })
    </script>
</body>
```

## CDN
環境の準備を簡単にするため、KnockoutはCDN経由で取得します。

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-debug.js"></script>
```

## binding
```html
<button data-bind="click: showAlert">clickでalert表示</button>
```

htmlにViewModelのプロパティをバインドします。
`data-bind`属性で、イベント名と呼び出したい関数名を指定します。

## ViewModelを適用
```js
ko.applyBindings({
    showAlert: () => alert('hello wrold!')
})
```

`ko.applyBindings`関数にViewModelを渡します。
ViewModelはオブジェクトで構いません。

ViewModelに呼び出す関数`showAlert`を定義します。

関数の定義にアロー関数を使いましたが、定義方法は

```js
{
    showAlert: function(){ alert('hello wrold!') }
}
```

でも

```js
{
    showAlert(){ alert('hello wrold!') }
}
```

でも、構いません。

# 感想
データのバインドとイベントのバインドが同じ記法なのが不思議な感じです。

# 関連記事
[Knockout.jsのHelloWorld](http://qiita.com/ledsun/items/e843e8e257bf46bb94a4)

# リンク
割と日本語のドキュメントが多いのに助かります。

- [ドキュメント | Knockout.js 日本語ドキュメント](http://kojs.sukobuto.com/docs/introduction) 
- [Knockout : Home](http://knockoutjs.com/index.html)
twitter-bootstrap-railsかbootstrap-sass、どちらをいれるべきか迷ったら


＜注意＞この投稿はRails素人による素人のための投稿です。

Railsでbootstrapを使う方法はいくつかあるが、gemを使うにしてもメジャーどころで以下の２つがあるので迷います。

- twitter-bootstrap-rails
- bootstrap-sass

それぞれの入れ方について記載してあるサイトはたくさんありますが、結局どっちを選べばいいのか、という初歩的な疑問にずばり答えてくれるサイトが見つからなかったので、ずばり言います。

# 決め方

自分のRailsアプリがlessを使っている場合　（例　Gemfileに'less-rails'と書かれている場合）
-> twitter-bootstrap-rails　を使う

自分のRailsアプリがsassを使っている場合　（例　Gemfileに'sass-rails'と書かれている場合）
-> bootstrap-sass　を使う

自分のRailsアプリに両方入っている場合
-> 一旦落ち着いて、なぜ両方入っているのか考える

# 説明

最初の２つはそのものずばりで、それぞれlessとsass向けに作られたgemだから、ということ。
普通に`rails new`して作ったアプリの場合、もともとsass-railsが入るので、ほとんどの人はおとなしくbootstrap-sassを使えば良いはずです。
スタイルの内容は基本的にどちらも同じで、twitter-bootstrap-railsの方がviewファイルを一括でごりごり書き換える機能があったりするが、一回使えば飽きる機能なのでさほどの魅力はないです。

おそらくこの文章をここまで読んでいる人が抱えている問題はlessとsassが一体なんなのかがわかっておらず、最悪の場合いつの間にかその両方をRailsアプリに入れてしまっている第３のケースと考えられます。
なので、まずはどちらかに寄せることを考えましょう。

ただ、「最悪の場合」と言っても上手に付き合えばlessとsassの共存は可能（普通に考えるとやめた方がいいと思いますが）なので、もうどちらにも寄せられないよ！という状況であればbootstrapのgemはどちらか好きな方を入れてしまいましょう。

おしまい
c++ builder / Windowsソフト間通信 > Named File Mapping > 読出し側コード

```txt:動作環境
C++ Builder XE4 on Windows 7 pro
```

http://qiita.com/7of9/items/1e473d014568ff84e925
でFile Mapping書出ししたメッセージを読出す。

```Receiver.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Receiver.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

#define BUF_SIZE 256
#if 1
TCHAR szName[] = TEXT("GlobalMyfileMappingObject");
#else
TCHAR szName[] = TEXT("Global\\MyFileMappingObject");
#endif

void __fastcall TForm3::Button1Click(TObject *Sender)
{
	HANDLE hMapFile;
	LPCTSTR pBuf;

#if 0
	// SECTION_MAP_WRITE | SECTION_MAP_READ
	hMapFile = OpenFileMapping(
				   SECTION_MAP_WRITE | SECTION_MAP_READ,   // read/write access
				   FALSE,                 // do not inherit the name
				   szName);               // name of mapping object
#else
	hMapFile = OpenFileMapping(
				   FILE_MAP_ALL_ACCESS,   // read/write access
				   FALSE,                 // do not inherit the name
				   szName);               // name of mapping object
#endif

	if (hMapFile == NULL){
		String msg = String().sprintf(L"Could not create file mapping object (%d)\n", GetLastError());
		ShowMessage(msg);
		return;
	}

	pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
			   FILE_MAP_ALL_ACCESS,  // read/write permission
			   0,
			   0,
			   BUF_SIZE);

	if (pBuf == NULL){
		String msg = String().sprintf(L"Could not map view of file (%d)\n", GetLastError());
		ShowMessage(msg);
		CloseHandle(hMapFile);
		return;
	}

	MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

	UnmapViewOfFile(pBuf);

	CloseHandle(hMapFile);
}
//---------------------------------------------------------------------------
```

Sender.exeの方でB_sendを押してからReceiver.exeでButton1を押すと読み出しできる。
Windowsソフト間通信 > File Mapping > Link > CloseHandleのタイミング / PostMessage / SendMessage()

http://qiita.com/7of9/items/1e473d014568ff84e925
で試しているFile Mapping

> でしたら、相手がメッセージを取得したことを、逆にPostMessage()してもらってそのタイミングでCloseHandle()するしかないです。

...
> 直接的な原因は
CreateFileMapping(INVALID_HANDLE_VALUE...
ですね。
実在ファイルを指定せずにマッピングオブジェクトを作っているため、
そのハンドルをクローズしたら、名前参照してるものがなくなるため、そのオブジェクトを開けなくなります。
中央線快速で高尾まで乗り過ごさないようにIFTTTでスマホにプッシュ通知する

Webサービス同士をつなぎあわせてくれる超絶便利な[IFTTT](https://ifttt.com/)（イフト）。IFTTTを使って、よく電車を乗り過ごし高尾まで行っちゃう友達のために、阿佐ヶ谷駅付近に来たらスマホ(Android)にプッシュ通知を送ってくれるレシピを作ってみました。これで無駄にタクシーのることもなくなるはず :taxi: 

# 流れ
1. スマホにIFTTTのアプリをインストール
2. Android Locationチャンネルに座標を登録
3. IF Notificationsチャンネルと連携
4. いざ中央線快速に乗る

# 1. スマホにIFTTTのアプリをインストール
Google PlayからIFTTTのアプリをインストールします。インストールできたらIFTTTのアカウントでログインします。Android 6の場合は設定から位置情報を許可してください。
[IF by IFTTT](https://play.google.com/store/apps/details?id=com.ifttt.ifttt)

# 2. Android Locationチャンネルに座標を登録
IFTTTページにあるグローバルナビゲーションから[ユーザーID]→[Create]をクリックしてレシピを作成します。[if this then that]と表示されるので[this]をクリック。さらに[Android Location]を探してクリック。するとTriggerの選択を求められるので、[You enter an area]をクリックし、特定エリアに入ったらトリガー発動するようにします。

座標は下の画像のように指定します。駅についてから発動では遅いので、広範囲で設定します。

![ifttt-train-01.png](https://qiita-image-store.s3.amazonaws.com/0/55103/d88f8557-0a80-ce3a-4501-2f5214e76c47.png)

# 3. IF Notificationsチャンネルと連携
再び[if this then that]と表示されるので、[that]をクリック。さらに[IF Notifications]を探してクリック。アクションは[Send a notification]でプッシュ通知を送信します。プッシュ通知で送る文字列を指定できますが、通知で目覚めた時には見ている余裕が無いと思うので初期状態で良いかと思います。ねんのため、`{{OccurredAt}}着いたぞ！起きろ！高尾まで行っちゃうぞ！`としました。`{{OccurredAt}}`はプッシュ通知を飛ばした時間が入るようです。

# 4. いざ中央線快速に乗る
さあ、中央線快速に乗りましょう。今回指定した阿佐ヶ谷駅は休日快速が止まってくれないので注意してください。

プッシュ通知が来た！...が。

![Screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/55103/ace17305-3b06-8760-903c-9ad581aedf49.png)

# ご...誤差が
9:00AM頃に駅にいたのですが、プッシュ通知が来たのがその50分後とあまりよろしくない誤差があります。時にはプッシュ通知が飛んでこないことも。。。1時間後であれば、高尾から折り返していい感じのタイミングでプッシュ通知来そうですが。。。

しかし、プッシュ通知で起きれるのか、、、 :fearful:
【Mac】El Capitanで日本語入力が遅すぎて何をやってもダメな時の解消法

[元ブログ - 【Mac】El Capitanで日本語入力が遅すぎて何をやってもダメな時の解消法 - 技術は熱いうちに打て！](http://blog.dalt.me/1264)

結構調べてみると困ってる人が多そうだったのでブログにしようかなと思って書きました。

掲題の通りで、El Capitanで文字入力が死ぬほど遅くてつらい。
いろいろ調べてみたけど改善しなくて諦めた人。

多分この方法で治ります。
## 結論
くどくど言ってもアレなので、まず結論から。

<strong>[システム環境設定] - [キーボード] - [入力ソース] - [候補表示] の推測候補表示をオフ。</strong>

かなり改善していませんか？

### 僕が調べてダメだったのはこの辺。

・[Macの文字入力や変換が遅いときに試したい10個のテクニック](http://itea40.jp/technic/mac-troubles/remedy-character-input-of-mac-is-slow/)

・ソースは見つかりませんでしたが、
[システム環境設定] - [アクセシビリティ] - [コントラストを上げる]
とかもあり、これも効果は感じられましたがUIがダサいのなんの。
これだったらちょっと我慢しようかなと思えるレベル。
でも、結果今回の方法を見つけて無事快適なキー入力ライフを得ることができました。

誰かのお役に立てば。
Web API を作るときに見ておきたいもの


* [Web API Design - 開発者が愛するインターフェイスを作る](http://www.infoq.com/jp/news/2012/04/web-api-design-book) (2012-03-29)
* [Restful APIの見つけ方](https://speakerdeck.com/moro/how-to-find-restful-api) (2015-08-19)
* [Web API 設計のベストプラクティス集](http://please-sleep.cou929.nu/20130121.html)
* [RESTとは何か](http://qiita.com/aosho235/items/125af74e2eab66c7a816) (2016-08-01)
Windowsソフト間通信 > Named File Mapping > Link > @ MSDN > szMsg[]の受け渡し

http://stackoverflow.com/questions/5646202/sharing-data-array-between-two-applications-in-delphi
からリンクされていた Named File Mapping

https://msdn.microsoft.com/en-us/library/aa366551(v=vs.85).aspx

2つのプロセスのcode exampleがある。

1つめのプロセスがCopyMemory()にてszMsg[]をを書出し、2つめのプロセスがMapViewOfFile()にて読出ししているようだ。
Windowsソフト間通信 > Link > Fastest IPC method on Windows 7 @ stackoverflow > File Mapping

[Fastest IPC method on Windows 7 @ stackoverflow](http://stackoverflow.com/questions/7127242/fastest-ipc-method-on-windows-7)

> if you just have two applications that want to share a memory block, you should create a named memory-mapped file (backed by the paging file) with CreateFileMapping/MapViewOfFile, that should be the most straightforward and fastest method. The details of file mapping are described on [its page](https://msdn.microsoft.com/en-us/library/aa366556(v=vs.85).aspx) on MSDN.

File Mappingという方法があるようだ。
気になるのは、File Mappingの場合、PCが再起動時に情報が消えてしまうのかどうか。
Windowsソフト間通信 > Link > IPC @ MSDN

関連 http://qiita.com/7of9/items/d5734f83538b74df18bf

IPC(Interprocess Communications)で検索したら以下が見つかった。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574(v=vs.85).aspx

> The following IPC mechanisms are supported by Windows:
Clipboard
COM
Data Copy
DDE
File Mapping
Mailslots
Pipes
RPC
Windows Sockets

上記の大半は初めて目にした。

Window messageが見当たらない。

by Samuel Bronson
> Named pipes and COM are probably the best for local IPC. 



2011年頃のコメントが付いている。
ミュージックライブラリにアクセスするMPMediaQueryと曲を再生するAVAudioPlayerの使い方・注意点

[GetWild退勤的なセンサーアプリを簡単に作れるフレームワークを作ったのでiPhoneに歯痛を心配されたり色々する](http://qiita.com/oubakiou/items/218b6ed08a6faaf5ee8b)

で得た知見シリーズ

(PDF)iPodライブラリアクセスプログラミングガイド
https://developer.apple.com/jp/documentation/iPodLibraryAccess_Guide.pdf

(PDF)Core Audioの概要
https://developer.apple.com/jp/documentation/CoreAudioOverview.pdf

基本的にはこれが出発地点になるドキュメント。

#MPMediaQuery
https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMediaQuery_ClassReference/

端末のライブラリから[MPMediaItem](https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMediaItem_ClassReference/index.html#//apple_ref/doc/constant_group/General_Media_Item_Property_Keys)(アルバムや曲や動画)を検索するためのクエリークラス。[MPMediaPropertyPredicate](https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMediaPropertyPredicate_ClassReference/index.html#//apple_ref/doc/uid/TP40008219)で条件を表現して絞り込む。MPMediaPredicateComparisonはEqualTo|Containes

```swift
internal func search(containsWord: String) -> [MPMediaItemCollection] {
    let query = MPMediaQuery.albumsQuery()
    let predicate = MPMediaPropertyPredicate(value: containsWord, forProperty: MPMediaItemPropertyTitle, comparisonType: MPMediaPredicateComparison.Contains)
    query.addFilterPredicate(predicate)
    return query.collections!
}
```

ドキュメントにも書いてあるが、ライブラリアクセスにはこのMediaQueryを使うか、MediaPickerを使う事になる。MediaPickerで用が足りるのであればMediaPickerの方がクラウド上にあるか否か、DRMといった面倒を見ずに済むので楽。UIImagePickerControllerと立ち位置が似てる。MPMediaItem.persistentID(MPMediaEntityPersistentID)はUint64なので結構大きい。意識しておかないとハマる事はあるかもしれない。

後述するがiCloud上にあるMPMediaItemやDRMで保護された曲はそのままだと再生出来ないため、要件によってはMPMediaItemPropertyIsCloudItem(iOS6.0以降)とMPMediaItemPropertyHasProtectedAsset(iOS9.2以降)で、フィルタリングして検索する必要がある。また、その曲がiCloud上にあるか否かについてはMPMediaItem.cloudItem(iOS8.0以降)、DRMについてはMPMediaItem.protectedAsset(iOS9.2以降)で取得する事が出来る。

https://developer.apple.com/library/ios/releasenotes/General/iOS92APIDiffs/Objective-C/MediaPlayer.html

#AVAudioPlayer

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/

MPMediaItemを再生する。Linked Frameworks and LibrariesにMediaPlayer.frameworkを追加しimportしておく必要がある。

```swift
internal func play(item: MPMediaItem) {
    let url: NSURL = item.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL
    do {
        self.audio = try AVAudioPlayer(contentsOfURL: url, fileTypeHint: nil)
        self.audio?.delegate = self
        self.audio!.play()
    } catch {
        print(error)
    }
}
```

playを維持するためにはAVAudioPlayerのインスタンスをplay()実行後も保持しておく必要がある。playの終了を検知したい場合はdelegateに[AVAudioPlayerDelegate](https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerDelegateProtocolReference/index.html#//apple_ref/doc/uid/TP40008068)を設定しておく必要がある。


またDRMで保護された曲やiCloud上の曲の場合は

```swift
item.valueForProperty(MPMediaItemPropertyAssetURL)
```

の時点で不思議なNullの力によって死ぬことになる。

MPMusicPlayerControllerで用が足りるのであればMPMusicPlayerControllerの方が部品が最初から揃っているし楽。
キノコならわかる！LINE bot ロリポップサーバーで動いた

# LINE botを動かしてみた。
## サーバー：ロリポップ ライトプラン / 言語 PHP5.4

![botsample.png](https://qiita-image-store.s3.amazonaws.com/0/119864/65a9211b-e50a-033d-32c2-e27c16613580.png)

この後、キノコ派と答えるかタケノコ派と答えるかで、運命がきまる :bomb: 

まずはビジネスアカウントを登録しよう！
http://linecorp.com/ja/pr/news/ja/2016/1320

![linebot1.png](https://qiita-image-store.s3.amazonaws.com/0/119864/8cb1e775-e9da-e49c-1d21-701538a920b5.png)

![linebot2.png](https://qiita-image-store.s3.amazonaws.com/0/119864/23c7819c-7941-9310-64f5-8e5c55c5fd93.png)

![linebot3.png](https://qiita-image-store.s3.amazonaws.com/0/119864/7d900911-708f-6230-7494-b6bef986ab05.png)


必要な情報は、
Channel ID
Channel Secret
MID
Callback URL
Server IP Whitelist

参考サイト：http://qiita.com/srea/items/58ba0f7d870a6ee3da2a

うまく動かなかったが、cur_execの戻りをechoすればエラーの原因がわかるかと。
キノコの場合、サーバーIPのホワイトリストが正しく設定できていなかった。

```$result = curl_exec($ch);
```

また、PHPで配列にarrayの代わりに[]を使えるのはPHP5.4以降なので、ロリポップのPHPバージョンにも注意。
SPECファイルを書いてrpmパッケージ自作

## 参考

* [SPEC ファイルを書いて RPM をビルドしてみた | CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/32458077768/spec-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6-rpm-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)

関連(自分のメモ)

* [rpm自作 (pearの例) - Qiita](http://qiita.com/tukiyo3/items/7125805e2e2e39a44a32)
* [rpmbuildで自動で依存関係を付与されるのを回避 - Qiita](http://qiita.com/tukiyo3/items/b65b9ba323570d94eacd)
* [CentOS6のzshのsrpmからCentOS5のrpm作成手順 - Qiita](http://qiita.com/tukiyo3/items/97cec6201c42870abae9)
* [srpmでSPECファイル編集してrpm作ってみた - Qiita](http://qiita.com/tukiyo3/items/77c912c6b4e3b8614852)
* [CentOS6でsrpmの利用の仕方 - Qiita](http://qiita.com/tukiyo3/items/d78bb2fef877f95d7477)
* [[CentOS6] checkinstallでrpmを作る - Qiita](http://qiita.com/tukiyo3/items/a30b604f35271be4e525)
* [CentOS6.8でmysql4.0.30ビルド - Qiita](http://qiita.com/tukiyo3/items/6f5ff12f58a229f7c1c2)


```bash:scripts確認方法
$ rpm -q --scripts libFS-1.0.0-3.1
postinstall program: /sbin/ldconfig
postuninstall program: /sbin/ldconfig
```


## 準備

* `/usr/local/bin/colorizer/colorizer.sed` を rpm化したいとする。

```bash:ディレクトリ作成
mkdir -p /usr/src/redhat/{BUILD,RPMS,SOURCES,SPECS,SRPMS}/
```

* /usr/src/redhat/SOURCES/colorizer.tar.gz の準備

```bash:tar.gzの準備
cd /usr/local/bin/
tar czf colorizer.tar.gz colorizer.tar.gz
mv colorizer.tar.gz /usr/src/redhat/SOURCES/
```

## 修正箇所

```diff:a.spec
+ Name:           colorizer
  Version:        0.1
  Release:        1%{?dist}
  Summary:        example
  
  Group:          Internal
  License:        BSD
  URL:            http://momijiame.tumblr.com/
  Source0:        %{name}.tar.gz
  BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
  
+ %define INSTALLDIR %{buildroot}/usr/local/bin/%{name}/
  
  %description
  %{summary}
  
  %prep
  %setup -q -n %{name}
  
  %build
  
  %install
  rm -rf %{INSTALLDIR}
  mkdir -p %{INSTALLDIR}
  cp -R * %{INSTALLDIR}
  
  %clean
  rm -rf %{buildroot}
  
  %files
+ /usr/local/bin/%{name}/colorizer.sed
  %defattr(-,root,root,-)
  %doc
  
  %changelog
```

```bash:ビルド
rpmbuild -bb a.spec
```

1. colorizer.tar.gzが展開
2. `/usr/src/redhat/BUILD/colorizer/colorizer.sed`がbuildに使われ
3. `/usr/src/redhat/RPMS/x86_64/colorizer-0.1-1.x86_64.rpm` が生成される。
Docker for Macを使ってFirefoxをコンテナ化してみる

Docker for Macのダウンロード・リンクが僕にも届きました。ローカルならではのことと言えばやっぱりGUIかな、ということでコンテナでFirefoxを起動する方法を調べてみました。

## 必要なソフトをインストールする

Homebrewがインストールされていることを前提に話を進めます。必要となるのはsocatとxQuartzで、どちらもHomebrewでインストールすることができます。

```
brew install socat
brew cask install xquartz-beta
```
> **Note:** xquartzのベータ版をインストールしている理由は、Yosemite以降のOSではなんらかのバグがあってX11が立ち上がらないといったコメントを見かけて、それに関連したリンクを辿って行くと、ベータでは治ってるという書き込みがあったからです。リンクが古い可能性もあるので、今はベータでなくても問題ないのかもしれません。

## Dockerfileを準備してFirefox用のイメージを作る

下記の[参考リンク](#参考にしたリンク)にあるものをそのまま使わせて頂きます。。。

```
FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox
```

Dockerfileを作ったらビルドします。

```
docker build -t firefox .
```

## Firefoxを起動する

次に、別のターミナルを開いてフォアグラウンドでsocatをスタートさせます。

```
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
```

そして`docker run`でFirefoxを起動します。

```
docker run -ti --rm -e DISPLAY=192.168.64.1:0 \
    -v /tmp/.X11-unix:/tmp/.X11-unix firefox
```

僕のMacだとDocker用のインターフェースのIPアドレスが`192.168.64.1`だったのですが、もし違うという方があれば、適宜変更して下さい。うまく出来ていればUbuntuの見慣れたウインドウでFirefoxが開きます。Mac上でUbuntuのウインドウというのはなかなか違和感がありますが、ブラウジングのレスポンスはとても快適です。

**最後にオチになりますが、音が出ません。。。**

リンク先のコメントではpulseaudioを使って音声をリダイレクトする方法が紹介されていますが、Macではうまくいかないみたいです。時間がある時にまた調べてみますが、やり方を知っている方（あるいは見つけた方）はコメントを下さい。よろしくお願いします。

## 参考にしたリンク

- [Running GUI apps with Docker](http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/)
- [How to run a Linux GUI application on OSX using Docker](http://kartoza.com/how-to-run-a-linux-gui-application-on-osx-using-docker/)
技術英語 > Until recently, it was still [in the infant stages] of its production. / Let's move onto the next topic.

@ LOE > March 14, 2003

http://loe.org/shows/shows.html?programID=03-P13-00011
> Until recently, it was still **in the infant stages** of its production.


<hr>
stage関連で思い出したのは

> Let's move onto the next topic.

会議でよく出てくる「次の議題へ移りましょう」というフレーズ。

move が来たら onto というように条件反射的に覚えてしまっている。
(move to でも間違いでないと思うが未調査)。
HTML,CSS勉強メモ #17 〜影の底辺だけ切れてる件〜

完成しました！

##**進度**##
ホームページ作成練習完成

##**メモ**##
前回あげた`box-shadow`の底辺だけが消えてしまっている件です。
<dl>
<dt>`overflow: hidden;`</dt>
<dd>メインコンテンツ内を２カラムで作っていますが、`float`の回り込み解除に`overflow: hidden;`を使っていました。
さらにメインコンテンツの高さを`height:auto;`にしていたのではみ出た影が消えてしまっていたというわけです。
今は特に回り込むものもないので`overflow`だけ消そうかと思いましたが、今後編集した時に思わぬレイアウトの崩れが起きないよう、高さをきちんと指定することにして解決しました。</dd>
</dl>

かなり時間かかってしまいましたが、これで完成です。
[完成](https://github.com/marin-takagi/tutorial/commit/93f141ff9965afb63ea466e76c0da125cb69761a)

次回からdotinstallの「レスポンシブなウェブサイトを作ろう」を勉強していこうと思います。
お手軽電子工作

# まずは情報収集

Arduinoでお手軽電子工作：LEDを光らせてみる 
http://deviceplus.jp/hobby/entry_002/
Kinoma Createでコンロの消し忘れを通知するReassuring Boxを作った話 
http://hatone.hateblo.jp/entry/2014/12/02/122521
RaspberryPiを超えるIoT開発デバイス,Kinoma Createが家に届いた。 
http://hatone.hateblo.jp/entry/2014/11/20/121857
5分でわかるFacebook Messenger PlatformのBot概要

噂されていたFacebook MessengerのBotに関する情報がf8で公開されました。
[Messenger Platform Beta](https://messenger.com/platform)といいます。すでに公開されており、Facebook Messenger上で動くBotを実装することが可能です。
このポストでは、大体5分ぐらいでFacebook Messenger Platformの概要がわかることを目指します。また、Linebotとも比較できればと思います。

#Facebook Messenger Platformとは

Messenger上でBotを作るAPIや、Botを見つけられるようにするための概念です。
サラッとしか見ていませんが、Linebotを作るのと同じ程度の労力で作成できそうです。
Facebook Messenger PlatformはSend/Receive APIを提供し、そのAPIを使うことによってBotの実装をすることになります。
メッセージを送信する場合は[Send API](https://developers.facebook.com/docs/messenger-platform/send-api-reference)を使い、
ユーザのメッセージを受信するにはWebhookを使います。LinebotではCallbackと呼んでいますね。

#Messenger Platformが送信できるもの

Messenger PlatformのBotが送信できるのは、単なるテキストだけではなく、
画像や、テンプレートを作成してそのフォーマットでメッセージを送れるようです。これはLinebotもそうですね。
また、送信するメッセージにはボタンを追加できます。
![IMG_1016.JPG](https://qiita-image-store.s3.amazonaws.com/0/36042/51fa9438-3b6f-3777-1187-c2c105a69075.jpeg "IMG_1016.JPG")

また、例えば検索結果の一覧はこのようなカルーセルのようにメッセージを表示できるようです。
![13015519_1700876946816943_6256125032096541789_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/36042/ce629451-f260-ac21-c5e2-e83eb234352a.jpeg "13015519_1700876946816943_6256125032096541789_n.jpg")



すでにこれらのBotが動いているようなので、実際につかってみてはどうでしょうか。
![IMG_1015.JPG](https://qiita-image-store.s3.amazonaws.com/0/36042/a885c5f2-0dd7-4fa5-9fdc-798caffe57f1.jpeg "IMG_1015.JPG")

#Messenger Platformのユーザの入力

ユーザは、

* Text入力
* 提供されたボタンでの入力

の2つの方法でBotに命令を伝えられるようです。
よって、ユーザはすべての情報を自然言語で伝えなくてもいいし、Bot提供者は、想定している反応に対してボタンを提供することができます。（上の画像のView DetailがボタンUI）

Messenger PlatformのBotは、CLIのようなコマンドで命令を出す、というようなコンセプトではなく、このようなボタンUIを活用してスムーズにコミュニケーションをできるようにすることを進めているようです。

#Messenger Platform事例

##SPRING

EC。カルーセルの例の写真に写っている画面がSPRINGのBot。スニーカーを買ったりできるらしい。

##Poncho

面白い方法で天気を教えてくれるBot。会話を楽しんだりもできるらしい。

##CNN

ユーザの履歴から推薦するニュースを選定して、カルーセルで表示。また、"Get a summary"で概要を見たりできる。

#ユーザコントロール

ユーザはBotをブロックできるようです。
ブロックされないように無駄な情報を送るべきではないとのことでしょうか。
去年のf8から、Messengerチームの方が頻繁にSPAMメールの話をしているので、そういうことなのでしょうきっと。

#Botストアはどこへ？

Botストアなるものもできると言われていましたが、そのような発表はありませんでした。
しかし、下記のような方法でユーザにBotの存在を知らせることができます。

###Facebook Pageにリンクをおく
Facebook PageにBotを関連付けることによって、Botをコンタクトリストに追加を促せるようです。

###Messengerアプリ内検索
Botの名前で検索がかけられるように成るようです。

###Webに配置できるボタン
ボタンをWebに配置して、Botをコンタクトリストに追加を促せるようです。
また、その際にユーザのコンテキストなど情報を付加してバックエンドに伝えることができるようです。

###Messenger Link
ボットを追加するURLを生成できるようです。

#重要なポイント

Botはユーザがオプトインしないとユーザと会話はできないようになっているようです。当然といえば当然ですね。
また、プロモーションや広告をユーザに送ることは禁止されているようです。
![IMG_1018.JPG](https://qiita-image-store.s3.amazonaws.com/0/36042/03a8bcc9-1dee-7cfa-b298-f77876a03900.jpeg "IMG_1018.JPG")

最後に、[Botをリリースするには審査が必要です。](https://developers.facebook.com/docs/messenger-platform/app-review)

#まとめ

ざっくりかつ情報が偏っているかもしれませんが、Facebook Messenger PlatformのBotに関してまとめました。
もうすでに(betaだが)一般公開されているので、Botを作り始めることができます！[やってみましょう！](https://developers.facebook.com/docs/messenger-platform/quickstart)
実装面についてもまとめられたらと思います。
楽しいSPA開発をはじめる

# まずは情報収集
Mithrilでコード譜共有サイトを作っている。なかなか素晴らしい。
http://chords.hatenablog.com/ 
仮想DOMという新しい概念
http://qiita.com/advent-calendar/2014/virtual-dom
node.jsのお勉強にちょうど良い↓
http://uraway.hatenablog.com/entry/2015/11/03/node.js%E3%81%A7web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%AB%8B%E3%81%A6%E3%82%8B%E3%81%BE%E3%81%A7%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B
→　自作サーバーはファイルのロードが固定なので、JavaScriptがロードされない

Webサーバー http-serverをNode.js上で動かす
http://day-journal.com/blog/node-js-004-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABweb%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/

最近のトレンドがうまくまとめられている。開発手法やツールについても書かれている。
http://blog.mmmcorp.co.jp/blog/2015/05/21/frontrend/


# 実際にためしてみる

```lang:a.js

# check installed npm
npm ls -g
# launch http-server
http-server

```
HTML,CSS勉強メモ #16 〜応用:footerまで終了〜

昨日の勉強です。


##**進度**##
<dl>
<dt>ホームページ作成練習</dt>
<dd>footerまで終了</dd>
</dl>

##**メモ**##
一応`footer`まで終わりました。
前回から`eyecatch`を加え、それに合わせてテキストなどの色を少し変えました。

[最後まで](https://github.com/marin-takagi/tutorial/commit/38dd3f9b62e59485e63257f5870a686b7a653cb3)


- `contants`の`box-shadow`
 - 最後に一つcontantsの`box-shadow`が下だけ付かず、これが解決したら完成です。
Live2D物理演算解析　１

わかってるつもりで何となくで使ってしまうLive2Dの物理演算。
内部の計算式が公開されておらず一体どんな特性を持っているのかなかなか把握しづらい。
今回はアニメーターのカーブ機能による曲線表示を使い、
パラメーターがどのように曲線に変化をもたらすのかを見ることによって、
Live2Dの物理演算の特性に迫っていこうと思う。

#実験環境と手法
Live2D(modeler,animatior)：ver2.1.09
Live2DViewer：ver2.2.1

モデルはX,Y軸の入力と出力を持つモデルを作成する
-1~1ではオーバーすることは把握済みなので
30倍スケール、300倍スケールの出力も持つ。
fpsは30ですべてを取り扱う。

これに入力をアニメーターで作りMTNファイルにし、Viewerで物理演算を行う。
その後出力をアニメーターに戻し曲線を見比べる。

#実験
##入力の鋭さに関して
入力スケールはX,Y－１～１の範囲
そこにXにおいて０から１への立ち上がり入力を入れる。
このとき1フレーム、3フレーム、15フレームで立ち上がりの早さが違う入力を用意する
![inputs.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/37b7a76d-5dfd-7697-d45b-4c481b393b23.png)

この入力に対し、すべてのパラメータを1で統一した物理演算にかけて結果を重ねてみる
![p1.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/86ed7fcb-52be-184d-101b-70bbe26acc03.png)
![p2.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/9952212d-43ed-ca9c-9d60-c15d62653ea4.png)
![p3.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/791bb558-0b9c-ad48-589b-65edbe8cdaf5.png)


![all1out.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/9faf9c90-5109-3622-48f6-8718ccf3ff47.png)


出力の表示スケールはすべて３００、
顔のXYZが３０スケールだが余裕で飛び出ていることがわかる。
また入力の鋭さが大きく出力に反映されているのもよくわかる。
奇妙なのは1f、3fに見られる**最初の波形**であるが……
公式のHPで物理演算の説明を見るとこうある
![kousiki.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/cb9eaf4a-a63c-3a74-c269-d00cef5131f5.png)


つまり、コレは**振り子が一周してしまっている**。
アクセサリーなどの回転モノであればこの回転は使いようがあるかもしれない
ともあれ物理演算が必要なモノは大抵大回転などはあると逆に困るモノなので振り切れないように値を設定しなければならない
次はこの波形を小さくしていく方向で探っていく。
I2Cで制御できるSCC+互換チップ

# 概要
以前、[I2Cで制御できる80円のPSG互換チップで遊ぼう](http://qiita.com/toyoshim/items/22a173d267f3c90fe36f)という内容で投稿したわけですが、その続編です。予告通りPSG以外の音源にも対応。KonamiのSCC+音源互換です。というか、前回の段階でほとんどできてたんですが、一箇所バグがあって音が腐ってたんでOFFにしてありました。

# SoundCortex
## 特徴
詳細は[前回の投稿](http://qiita.com/toyoshim/items/22a173d267f3c90fe36f)を見ていただくとして、LPC810を使って色々な音源チップをエミュレートしていこう、というモノです。パソコン上でエミュレートするのと比べると以下の様なメリットがあります。

- チップから音が出るのでカッコいい
- 自分の電子工作に組み込んで使える
- I2Cで制御できる（マイコンに優しい）
- 0.1ms以下の超低レイテンシ

![IMG_20160413_015559.jpg](https://qiita-image-store.s3.amazonaws.com/0/12843/4c504dcf-9c9d-1a58-1214-efcd62cdc881.jpeg)


## SCC+互換モード
I2C slave address 0x51でアクセスできます。書き込みはPSG互換モード同様に2 bytes単位で行って下さい。最初の1 byteがSCC+のレジスタアドレス（MSXのメモリにマップされている時の下位8bit）、続く1 byteが書き込む値です。

拡張機能としてレジスタ0xFFに0を書き込むと3.579545MHz（デフォルト）、0以外を書き込むと4MHzのオシレータを繋げたSCCとして動作します。実機はMSXで動くものしか存在しないので4MHzは意味がないのですが、PSGの4MHzモードとセットで使えるように4MHzモードも用意しました。

また0xFFを読みだすとメジャーバージョン1、0xFEを読みだすとマイナーバージョン0が読み出されるはずです。

念のためにSCC+のレジスタマップを載せておきます。ちなみにSCC+はいわゆる(SD)スナッチャーROMに載ってる5音全部の音色が設定できる、GRADIUS 2とかよりちょっとだけ豪華なやつです。波形モーフィングとか？（実装してないです）

| レジスタ   | 内容             |
|-----------|-----------------|
| 0x00-0x1F | Ch.A 波形テーブル |
| 0x20-0x3F | Ch.B 波形テーブル |
| 0x40-0x5F | Ch.C 波形テーブル |
| 0x60-0x7F | Ch.D 波形テーブル |
| 0x80-0x9F | Ch.E 波形テーブル |
| 0xA0      | Ch.A TP[7:0]    |
| 0xA1      | Ch.A TP[11:8]   |
| 0xA2      | Ch.B TP[7:0]    |
| 0xA3      | Ch.B TP[11:8]   |
| 0xA4      | Ch.C TP[7:0]    |
| 0xA5      | Ch.C TP[11:8]   |
| 0xA6      | Ch.D TP[7:0]    |
| 0xA7      | Ch.D TP[11:8]   |
| 0xA8      | Ch.E TP[7:0]    |
| 0xA9      | Ch.E TP[11:8]   |
| 0xAA      | Ch.A 音量[3:0]   |
| 0xAB      | Ch.B 音量[3:0]   |
| 0xAC      | Ch.C 音量[3:0]   |
| 0xAD      | Ch.D 音量[3:0]   |
| 0xAE      | Ch.E 音量[3:0]   |
| 0xAF      | ミキサー          |

0xE0-0xFFあたりにあるモード設定レジスタは詳しく知らないので未対応。波形テーブルはint8_t[32]です。TPはPSGと同じ。音量はPSGとは違って線形になってます。ミキサーはbit 0側がCh.Aに対応。PSGが不論理なのに対してSCCは正論理。

# デモ
YouTubeに[GRADIUS 2のオープニングを鳴らしてみた](https://www.youtube.com/watch?v=NmVnV59aVfY)的な動画をあげてあります。冒頭のぶ〜〜〜〜〜〜〜ん……とかめちゃくちゃいい感じに鳴ってます。

# 最後に
## 使ってみてね
ファームウェアは全てGitHubにて[公開](https://github.com/toyoshim/SoundCortex)しています。PSGとSCC+の両方を有効にしたprebuiltバイナリも置いてありますので、そのまま焼けば美味しく頂けます。一応prebuilt版は24MHz動作にしてみました。9-bit/46.875kHzでの再生です。オーバークロックの48MHzでも安定して動作してるので、最新のソースでは48MHz動作の10-bit/46.875kHz再生にしてあります。まぁ、OPLLを追加するための準備でもあります。

## 今後の予定
MIDIメッセージを受けてADSR付きPSG/SCC+音源として制御するミドルとか作りたいなー、とは思ってます。あと、今の手応えだとPSG/SCC+/OPLL全部が1 chipで回せそうな予感がしてます。OPNやOPMも個別のチップで作れそうですね。あとは気力だけ。

## いいわけ
モード設定レジスタが未実装って以外に、なんか少しバグってる気がします。音が消えて欲しいところで残ることがあるので……SCCも何度か作ってるけど、モードレジスタ実装しなくてもこういう問題は出なかったはず。
あんまり時間かけられてないので、つまらないバグかも。何か気づいたらGitHubでpull requestして頂けるとハッピーです。

(2016/8/14追記：0xAFのミキサーがバグってるようだ、という報告を頂き[修正しました](https://github.com/toyoshim/SoundCortex/commit/002ae801d6e3a36370dc14cacdfc2e7440c79fa0)。minor versionを1に上げたバイナリをアップしてあります）
GAE & Go & Line-Botでハマったところ

# こちらの手順を参考にやってみた

[GAE/GoでLINE Bot Trial](http://qiita.com/koki_cheese/items/6c55a7c6f090e87c7b3c)

# でも、初めてGAE  & Go　つかってログの見かたにハマったのでメモ

```
Callbackにhttps://{project-id}.appspot.com:443/line/receiveを登録したら
一度メッセージを送って
{"statusCode":"427","statusMessage":"Your ip address [IP Address] is not allowed to access this API."}
エラーメッセージに書かれてるIP Addressをwhitelistに登録すれば動きます。
```

ここが具体的にわからんかった。。
LINEからBOTに適当にコメントを送信したあと、GAEのログを見ていく。

実際には　↓　のとおり、 GAEのログを開いていくと `` protoPayload: `` の中に `` line `` があった
![GAE-LOG.png](https://qiita-image-store.s3.amazonaws.com/0/8571/c0fcc550-bd37-50f1-3daa-5ee0b72296ef.png)

このIPをwhitelistに登録して完了！！
SSLを使ったウェブサーバの評価をしてもらう

## 参考にさせていただいたページ
https://blog.kksg.net/posts/nginx-secure-ssl
http://qiita.com/kuni-nakaji/items/5118b23bf2ea44fed96e
https://seven.ne.jp/qualys-ssl-labs-%E3%81%AE-ssl%E8%84%86%E5%BC%B1%E6%80%A7%E8%A8%BA%E6%96%ADssl-server-test%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

## SSLの安全性を評価する
[Qualys SSL Labs](https://www.ssllabs.com/ssltest/) にアクセスして、自分の SSL のドメインを入力してボタンを押す。これだけ。
ただ、やってみたら結構時間がかかりました（5分くらい？）。
たぶん提携先と思われる、[グローバルサイン](https://sslcheck.globalsign.com/ja) から実行したほうが圧倒的に速かったです。
URLをみると、結局は Qualys SSL Labs がやってるようなのですけどね。

## 追記（2016.04.13 2:00）
いやまてよ、と思い立ったので、再度本家（？）で評価を試してみました。
すると、瞬殺でレスポンスが戻ってきました。
グローバルサインからが速いと思ったのは、その前に実行した Qualys SSL Labs のテスト結果がキャッシュされていたから、のような気がします。
javaでsin波を鳴らすだけ（javax.sound.sampled.SourceDataLine）

```java:audio.java
import	javax.sound.sampled.*;
import	java.lang.Math;

public class Audio {
	static	final	int	freq=44100;//サンプリングレートは44100(=CD並
	static	final	double	hz=400;//音は400hz
	public	Audio(){
		try{
			AudioFormat	fmt=new	AudioFormat(freq, 8, 1, true, false);
			SourceDataLine	audio=(SourceDataLine)AudioSystem.getSourceDataLine(fmt);
			audio.open(fmt);
			byte[]	data=new	byte[freq];
			for(int i=0;i<freq;i++){
				data[i]=(byte)(127*Math.sin(2*Math.PI*hz*i/freq));
			}
			audio.start();
			audio.write(data, 0, freq);
		}catch(Exception e){
			e.printStackTrace();
			System.exit(1);
		}
	}
	public static void main(String[] args){
		new	Audio();
	}
}
```
audio.start()を忘れてて梃子摺った。
一サンプルあたりのバイト数をどうやれば上げられるのか分からない。
short[]とかわwrite関数が受け取ってくれないしどうしようか？
【Android】開発版アプリとリリースアプリを一端末に共存させる

だいぶ今更な感じだが、最近対応してみて割と便利だったのでメモ。
アプリに署名するProductID（パッケージ名）が別であれば別アプリとして認識されるので、開発版とリリース用とをGradleのProductFlavorを使ってBuildVariantsで切りかえられるようにします。
今回は「開発版アプリとリリースアプリを一端末に共存させる」までの最短距離を記すので、BuildVariants、BuildType、Flavorについての詳細を知りたい方は[この辺りの記事](http://vividcode.hatenablog.com/entry/android-app/build-variants)をご参考に。


## build.gradleの設定
まずはbuild.gradleにproductFlavorsを追加し、devで署名された場合はapplicationIdがdev用のもので上書きされるように設定しています。productionの場合はdefaultConfigのままにするので空欄で。なお、dev/productionという名前はお好きなものに。
また、アプリ名を切りかえのためにプレースホルダーを設定します。
defaultConfigとproductFlavors->devのmanifestPlaceholdersにappNameを追加し、それぞれアプリ名を指定しておきます。

```xml:build.gradle
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.hoge.hoge"
        manifestPlaceholders = [appName:"@string/app_name"]
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 20
        versionName "2.0.0"
    }

    productFlavors {
        dev {
            applicationId = "com.hoge.hoge.dev"
            manifestPlaceholders = [appName:"@string/app_name_dev"]
        }
        production {
        }
    }
}

```


## AndroidManifestの設定
applicationと最初のactivityに「android:label="${appName}」を記載し、build.gradleで定義したappNameを読み込みます。これでランチャー上のアプリ名がdevとproductionそれぞれのものになります。
また、BroadcastReceiver等は「android:authorities="${applicationId}」を明示してあげないとエラーが出るので注意。

```xml:AndroidManifest.xml
<application
        android:name=".Application"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:label="${appName}">

        <activity
            android:name="com.hoge.hoge.HogeActivity"
            android:label="${appName}">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
・・・
```

## BuildVariantsの設定
debug/releaseそれぞれFlavor付きのvariantが選択できるようになっています。

![スクリーンショット 2016-04-12 23.39.44 2016-04-12 23-40-12.png](https://qiita-image-store.s3.amazonaws.com/0/53088/265bd627-cda6-f67e-7379-cfa85ee6f2f1.png)



debug/relaseで署名しBuildされたアプリは同一端末にそれぞれインストールできます。

![Vysor (Beta) 2016-04-12 23-58-44.png](https://qiita-image-store.s3.amazonaws.com/0/53088/bfb1ab47-2b85-5b57-619f-c3266468c856.png)


## まとめ
非常に簡単でした。
「バージョンごと」「APIの向き先ごと」でアプリを共存させるなどの用途でも活用できそうです。
【iOS】cocos2d-x v3.10で静的ライブラリ作成〜実行まで

覚えきれなくなってきたので、備忘録。Qiita初投稿

静的ライブラリ（Static Library）を使うと、Cleanしたあとやarchiveのたびにcocos2d-xの膨大なライブラリをコンパイルしなくて済むのでビルド時間が圧倒的に短縮されます

##実行環境##
- Xcode7.3
- cocos2d-x v3.10

cocos2d-xのセットアップは済んでいるものとします。（cocosコマンドが使える状態）

##Static Libraryのビルド##
基本的にここを参考にしました
http://discuss.cocos2d-x.org/t/how-to-speed-up-cocos2d-x-build-with-prebuilt-lib/23402

今回はiOS用にビルドするので、
`cocos gen-libs -p ios`
デフォルト設定だとreleaseでビルドされます。僕はこれでデバッグからストアへのリリースまで全てやりましたが特に問題は起こらなかったです。`-p`をつけない場合は全てのデバイス向けにライブラリが生成されるのでとても時間がかかります

完了したら、cocos本体のルートフォルダにprebuiltフォルダが追加されてます
`cocos2d-x-3.10/prebuilt/`
この中にStatic Libraryが置いてあります


##プロジェクトファイルの設定##
`cocos new`した直後のものから始めています

生成されたlibcocos2d iOS.aをプロジェクトファイルにぶちこみます。必要に応じてCopy items if neededのチェックは外します
![スクリーンショット 2016-04-13 0.53.19.png](https://qiita-image-store.s3.amazonaws.com/0/121299/f44989df-cc56-8cc5-e0be-788bbcd3a009.png)

既存のライブラリは削除したいところですが、開発中にライブラリのソースを覗いたりする際に必要となるため、cocos2d_libs.xcodeprojの削除はせずにTargetの削除のみを行います。
![スクリーンショット 2016-04-13 0.59.52.png](https://qiita-image-store.s3.amazonaws.com/0/121299/6a884871-00d5-297c-6760-47b9a8db0b86.png)
この2つのターゲットを削除します。これで元々あったライブラリがビルドされることはなくなります

###ライブラリへのパスを通す###
このまま実行しようとすると次のようなエラーが出ると思います
`ld: library not found for -lcocos2d iOS
clang: error: linker command failed with exit code 1 (use -v to see invocation)`
先ほど追加したlibcocos2d iOS.aへのパスが通ってない場合に出ます。普通にネイティブで開発しててもよくあるやつです。

いつものごとく、Build SettingsのLibrary Search Pathsにファイルへのパスを追加します
私の場合はホームディレクトリのドキュメント内にcocosのルートを置いているので、
`$(HOME)/Documents/cocos2d-x-3.10/prebuilt/ios`
になります。ここは各自の環境に合わせて記述することになると思います

参考：http://tristore.net/?p=1781

##そのほかHello Worldまでに必要な設定##
これでもまだビルドが通らないと思います。いつの間にかGameController.frameworkが要求されるようになるので、これも追加します
![スクリーンショット 2016-04-13 1.11.18.png](https://qiita-image-store.s3.amazonaws.com/0/121299/727415ed-34de-fd33-cfff-3cae3a57e926.png)


実機で動かす場合は、Xcode7.3以降の場合に次のようなエラーが起こります
`libpng error: CgBI: unhandled critical chunk`
Xcode側で追加された何かが悪さをしているようです。
Build Settings内のRemove Text Metadata From Png FilesをNoにすると良いらしいです

参考：http://qiita.com/rustlica/items/d6c7c6dcf03d682d58b1


これで、やっと静的ライブラリを用いた実機によるHello Worldができます

##おわりに##
CocoaPodsを使う方はPodfileかいてpod installすればそのまま使えると思います。警告が結構でてきて気になるので、警告されてる部分の設定にそれぞれ`$(inherited)`を追加してあげると静かになります
Elastic Beanstalk に Rails アプリケーションをデプロイする

だいたいAWSの[ドキュメント](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html#create_deploy_Ruby_rails-install)どおりにできたが、メモ。

## とりあえず、Railsアプリケーションを作る。
Pumaで稼働させたいなら、GemfileにPumaを加えておく。
git を初期化して、commit する。

## Beanstalkへのデプロイの準備

Beanstalkの操作はAWSのコンソールでもできるが、```eb```コマンドが楽。
```eb``` コマンドをインストールしていない場合、macでは ```brew install awsebcli``` でインストールできる。
```eb init```コマンドで作成しているアプリにbeanstalkへのデプロイを初期化する。

```bash
$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) ap-northeast-2 : Asia Pacific (Seoul)
10) sa-east-1 : South America (Sao Paulo)
11) cn-north-1 : China (Beijing)
(default is 3): 8

Select an application to use
1) an_application
2) [ Create new Application ]
(default is 2): 1

It appears you are using Ruby. Is this correct?
(y/n): y

Select a platform version.
1) Ruby 2.2 (Puma)
2) Ruby 2.1 (Puma)
3) Ruby 2.0 (Puma)
4) Ruby 2.2 (Passenger Standalone)
5) Ruby 2.1 (Passenger Standalone)
6) Ruby 2.0 (Passenger Standalone)
7) Ruby 1.9.3
(default is 1): 1
Do you want to set up SSH for your instances?
(y/n): y

Select a keypair.
1) a_key_pair
2) [ Create new KeyPair ]
(default is 2): 2
```

## 環境の作成
環境とはデプロイ先のことと理解すればいいと思う。
環境名を指定しなければ、デフォルトで アプリケーション名-devがつく。
```-s``` をつけると、auto scale は設定されずスタンドアローンとなる。
つけない場合は1〜4台でauto scaleが設定され、ELBも設定される。
また、インスタンスタイプを指定しないとt2.microがデフォルトで設定される。

```bash
$ eb create -s <環境名>
```
実行すると暫く起動までに時間がかかる。タイムアウト時間を長めに設定しておく例を見かけるが、設定しなくても特に問題なかった。
```eb create``` の前に少なくとも一度はコミットしておく必要がある。

Railsをproductionモードでデプロイする場合には環境変数 SECRET_KEY_BASE を設定する必要がある。SECRET_KEY_BASEの値は次のコマンドで得られる。

```bash
$ bundle exec rake secret
```

次のように ```--envvars``` オプションでcreateコマンドで設定することもできる。

```bash
$ eb create <環境名> --envvars SECRET_KEY_BASE=7f81eb591dda7cee92aeeea9866eb0c7...(略)
```

createに設定しなかった場合には AWSのbeanstalkのコンソールのUIでも設定できる。
環境の[設定]-[ソフトウェア設定]を開き、新たに環境変数 SECRET_KEY_BASE を追加して ```bundle exec rake secret``` で得られた文字列をその値として設定する。

デプロイ先は /var/app/current となる。

## デプロイした環境にアクセスする
次のコマンドでブラウザが起動して表示される。

```bash
eb open
```

## Railsアプリケーションを更新する
ソースを変更して、それを再デプロイしたい場合、gitにコミットして次のコマンドで、デプロイできる。

```bash
$ eb deploy
```

## 環境を破棄する
作成されてたEC2インスタンスがterminateされる。
stopは以前はできたっぽいが今はできない...。
また、後で使いたい場合も一旦terminateさせるしかないのかな...。

```bash
eb terminate
```

## 感想
一度使うと、もう自分でEC2にrubyをインストールしてとかする気がなくなるほど便利。
C++のためのAPIデザイン 読書メモ 第2章 その3

http://atosh.hatenablog.com/entries/2016/04/13

# 優れたAPIの特徴(再掲)

* 内部実装が隠蔽されていて,
* 使い方がわかりやすく,
* 疎結合であること

# 疎結合
優れたAPIは結合度が低く凝集度が高い. コンポーネント間の結合を可能な限り低く保とう.
疎結合であるとは, 

* クラスのメソッドの数, メソッドあたりの引数が少なければ, それを呼び出すコンポーネントとの結合度は低い.
* メソッド内部でグローバル変数を書き換えるのは, 結合度が上がる.
* クラスの継承は, クラスの合成(コンポジション)よりも結合度が高い. サブクラスがベースクラスのprotectedメンバにアクセスできるから.
* メソッドのシグネチャを変えた時に, このメソッドに依存するすべてのコードの変更が局所的に行えるならば, 結合度は低い.

## 名前だけの結合
可能な限り前方宣言を使おう. ヘッダで別のヘッダをインクルードすると, 依存性が伝搬していく.

良くない例:

```cpp
#include "my_object.h"

class MyObjectHolder {
public:
    MyObjectHolder(const MyObject& my_object);
    const MyObject& GetMyObject() const;
private:
    MyObject my_object_;
};
```

良い例:

```cpp
class MyObject;  // 前方宣言

class MyObjectHolder {
public:
    MyObjectHolder(const MyObject& my_object);
    const MyObject& GetMyObject() const;
private:
    MyObject* my_object_;
};
```

## メンバ関数よりフリー関数を使おう
フリー関数はクラスのパブリックメンバにしかアクセス出来ないので, 結合度が下がる. また, クラスの機能を最小限に保つことができる. 

良くない例:

```cpp
class Foo {
public:
    ...
    const std::string& GetName() const;
    void PrintName() const;  // 便利メソッドはクラスから独立させるべき
    ...
private:
    std::string name_;
};
```

良い例:

```cpp
class Foo {
public:
    ...
    const std::string& GetName() const;
    ...
private:
    std::string name_;
};
void PrintName(const Foo& foo);
```

## 意図的な冗長性が時には正当化される
論理的にはコンポーネントAがコンポーネントBに依存しているが, ごく一部分にしか依存していない時, 依存部分だけを抽出し, Aにも同じ情報を持たせることで, A→Bの依存を断ち切ることができる.

```cpp
// b.h
class B {
public:
    // たくさんのメンバ関数
private:
    std::string name_;
    // その他たくさんのメンバ変数
};

// a.h
#include "b.h"
class A {
public:
    ...
private:
    B b_;
};
```

上記は, AがBの名前のみ必要である場合に, 以下のようにできる.

```cpp
class B {
public:
    // たくさんのメンバ関数
private:
    std::string name_;
    // その他たくさんのメンバ変数
};

// a.h
class A {
public:
    ...
private:
    std::string name_;
};
```

## マネージャクラスでローレベルクラスをカプセル化
個人的な経験ではXxxManagerクラスは地雷である場合が多く, 特に推奨したくないのでスキップ.

## コールバック, オブザーバー, 通知
イベント発生時に他のクラスに通知する場合の手法.

### コールバック
モジュールBにモジュールAの関数を渡し, 必要なときにBがAの関数を呼び出す仕組み. C++11以前なら関数ポインタ, 以降ならstd::function.

```cpp
class canceled : public std::runtime_error {};

class B {
public:
    B(std::function<void()> callback);
    void DoSomething();
    ...
private:
    std::function<void()> callback_;
    ...
};

B::B(std::function<void()> callback) : callback_(callback) {}
void B::DoSomething() {
    callback_();
    // do something...
}

// 状態を出力したり
B([]{
    std::cout << "Do something." << std::endl;
}).DoSomething();
// キャンセルチェックしたり
std::atomic<bool> has_canceled;
B([&has_canceled]{
    if (has_canceled) {
        throw std::runtime_error("canceled");
    }
}).DoSomething();
```

オブザーバーパターンは第3章で詳しく説明.

### 通知
互いに関連しないコンポーネント間で通知を送る仕組みに関して. シグナル/スロットがよく使われる.

```cpp
// 引数なし戻り値なしのシグナルを作成
boost::signal<void()> signal;
// シグナルにスロットを接続
signal.connect([]{ std::cout << "MySlot called." << std::endl; });
// シグナルを発行することで, 接続されたスロットが呼ばれる
signal();

```

# 安定性, 文書化, テスト

* 適切にバージョン管理されて後方互換性が保たれていること.
* 十分に文書化されていれば, ユーザーがエラー条件やベストプラクティスなどについての明確な情報が得られる.
* 自動テストがあれば既存のユースケースを壊さずにAPIを変更できる.


http://www.amazon.co.jp/C-のためのAPIデザイン-マーティン・レディ/dp/4797369159
RapidSSL（by さくらのSSL）の証明書をnginxで設定する

## この記事の続きです
http://qiita.com/kskomori/items/ba84ae0bb6a3b5bf6305

## 環境（あんまり関係ないかもですが）
|       | バージョン |
|:---:  |:---:|
| OS    | Ubuntu 14.04 LTS |
| nginx | 1.8.1 | 


## 参考にさせていただいたページ
http://qiita.com/sirone/items/da5c3f52d466a929a415
https://blog.kksg.net/posts/nginx-secure-ssl
http://qiita.com/kuni-nakaji/items/5118b23bf2ea44fed96e

## 証明書
### 証明書の取得
私は [さくらのSSL](https://ssl.sakura.ad.jp/) からRapidSSLの証明書を取得しました。
税込み1620円/年！

### さくらのSSLでの取得方法（2016.04.12時点）
1. CSRを作成します。
2. オンラインで申し込みます。
3. メールが届きますので、コントロールパネルからまずはCAが確認するための「認証ファイル」をダウンロードします。
4. 3 でダウンロードした「認証ファイル」を、CSRのCommon Nameに設定したFQDNのサーバに置きます。念のためブラウザでアクセスして、見れることを確認しましょう。
5. ほとなくして、今度はSSLサーバ証明書発行が完了したことをお知らせするメールが届きます。
6. さくらのコントロールパネルから、サーバ証明書をダウンロードしましょう。

### RapidSSLの中間証明書の取得（2016.04.12時点）
1. [ジオトラストさんのRapidSSLのページにアクセス](https://www.geotrust.co.jp/resources/rapidssl/repository/intermediate_sha2.html#b)

2. 「b) 2016年3月1日(火) 仕様変更適用後に発行された証明書：」のところの、証明書の部分をまるごとコピーして、テキストファイルにペーストして保存します。
このとき「-----BEGIN CERTIFICATE-----」や「-----END CERTIFICATE-----」も含めてコピーします。


## サーバに証明書を配置する
1. RapidSSLの中間証明書と、取得したサーバ証明書をくっつけます
`$ sudo cat server.crt ca_rapidssl.cert | sudo tee my-domain.pem`

2. 作成した my-domain.pem を /etc/nginx/ など適切な場所に配置します。
私は /etc/nginx/cert.d/my-domain.20160401.pem といったパスにしています。
また、CSR作成で使った秘密鍵も同じ場所に置いています。


## nginxに証明書を設定する
```
server {
    listen       443 ssl;
    server_name  MY-DOMAIN.jp;
    ssl_certificate     cert.d/my-domain.20160401.pem;
    ssl_certificate_key cert.d/my-domain.cert.20160401.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers         ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;

......（その他設定をいろいろ）
```
SSL証明書にお金をかけず、VPSでLINE BOTを作ってみた


自分の好きな環境・サーバー・VPS等でLINE BOTを作りたいけど、SSL証明書にお金をかけるほどのモチベがない。

そこで、LINEが無料のSSL証明書を受け付けるまでとりあえず、Herokuを経由することで対処してみました。

Herokuを経由するので、ドメインやSSL証明書(https)は不要です。

※[Fixie](https://elements.heroku.com/addons/fixie)は500回/月のリクエスト制限があるので使いたくない。。。

## どうやってやるの？

流れ: LINE -> Heroku -> VPS -> LINE

* LINEからの通知をHerokuで受け取る
* HerokuからVPS等にPOSTで情報を転送
* VPSからLINEに結果をPOST

## 作り方

LINEやHerokuのアカウント作成などは省略します。

### Callback URLの設定

LINEのビジネスアカウントの「Basic Information」にある「Callback URL」にHerokuのアプリURLを指定します。

例: 「https://アプリ名.herokuapp.com:443」

### Server IP Whitelistの設定

「Server IP Whitelist」にVPS等のIPアドレスを設定します。

### LINE->Heroku->VPS用のスクリプト

下のスクリプトをHerokuにアップロードします。
このスクリプトはデータを転送しているだけです。

```php:index.php
<?php
$json_string = file_get_contents('php://input');

$curl = curl_init("http://VPSへのURL");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, $json_string);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charser=UTF-8'));
curl_exec($curl);
curl_close($curl);
?>

```

### VPS->LINE用のスクリプト

下のようなスクリプトをVPS側に配置します。
ここに返答のメインルーチンを記述します。

```php:callback.php
<?php
$json_string = file_get_contents('php://input');
$json_obj = json_decode($json_string);
$to = $json_obj->result{0}->content->from;

$channel_id = "[チャンネルID]";
$channel_secret = "[チャンネルシークレット]";
$mid = "[MID]";

// 任意の処理で返答を作成する
$msg = "こんにちは( ´ ▽ ` )ﾉ";
$response_format_text = ['contentType'=>1, "toType"=>1, "text"=>"$msg"];
                                                                       
$post_data = ["to"=>[$to],"toChannel"=>"1383378250","eventType"=>"138311608800106203","content"=>$response_format_text];

// LINEに送信
$ch = curl_init("https://trialbot-api.line.me/v1/events");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json; charser=UTF-8',
    "X-Line-ChannelID: $channel_id",
    "X-Line-ChannelSecret: $channel_secret",
    "X-Line-Trusted-User-With-ACL: $mid"
));
curl_exec($ch);
curl_close($ch);
?>
```

## 最後に

あまりよろしい方法ではないかもしれませんが、とりあえずはこのような方法で自分の好きな環境・サーバーでLINE BOTが作れます。

LINEがLet's encryptなどの無料証明書を許可した際にはHerokuの経由をやめましょう。
スクリプトの変更は不必要なので修正は簡単だと思います。