OmniAICreator/Qiita-1.07M huggingface dataset:
HSTS (HTTP Strict Transport Security) の導入

HTTPで接続した際に、強制的にHTTPSへリダイレクトし、以降のそのドメインへの接続はすべてHTTPSとする機能が[HSTS (HTTP Strict Transport Security)](https://ja.wikipedia.org/wiki/HTTP_Strict_Transport_Security "HSTS") である。[RFC6797](https://tools.ietf.org/html/rfc6797 "RFC6797")で標準化されている。

これはHTTPヘッダに以下を含むことで実現される。

`Strict-Transport-Security:max-age=有効期間秒数;includeSubDomains `

max-ageではHTTPSで通信する期間を設定する。また、includeSubDomainsを指定することで、サブドメインにもHSTSが適用されるように設定できる。

HSTSのサポートは、[2015年6月9日にマイクロソフトがIEへのサポートを追加した](http://blogs.windows.com/msedgedev/2015/06/09/http-strict-transport-security-comes-to-internet-explorer-11-on-windows-8-1-and-windows-7/ "HTTP Strict Transport Security comes to Internet Explorer 11 on Windows 8.1 and Windows 7")ことで、すべてのメジャーブラウザにおいてサポートが完了し、HTTPサーバーとしてもApacheを始めとし設定が可能だ。


# Apacheの設定
Apacheにおいては、以下のバーチャルホストの設定になる。
ここではexample.comのサブドメインすべてにHSTSが適用されるように設定されており、365日（31,536,000秒）が有効期間である。

```
<VirtualHost *:443>
	ServerName example.com
	SSLEngine on
	Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>`
```

# その他のHTTPサーバーの設定
IPA（情報処理推進機構）の[SSL/TLS暗号設定ガイドライン～安全なウェブサイトのために（暗号設定対策編）～](http://www.ipa.go.jp/security/vuln/ssl_crypt_config.html "SSL/TLS暗号設定ガイドライン") のAppendix B.4. HTTP Strict Transport Security（HSTS）の設定方法例を参照。

# Preloaded HSTS
HSTSを用いても、最初の接続にHTTPを用いる限り、完全なセキュリティは実現されない。これを解決するために、ChromeではPreloaded HSTS、すなわち最初からブラウザにHSTSを組み込めば良い。これはブラウザ本体にHSTSで接続するドメインのリストを持つことにより実現できる。

Chromeに組み込まれたPreloaded HSTSは[ここ](https://code.google.com/p/chromium/codesearch#chromium/src/net/http/transport_security_state_static.json "Preloaded HSTS List")で参照できる。

また、ChromeのPreloaded HSTSに組み入れるためには、[こちら](https://hstspreload.appspot.com "HSTS Preload Submission")から申請する。

特定のドメインがPreloaded HSTSとして登録されているかどうかの確認はChromeのアドレスバーに`chrome://net-internals/#hsts` を入力し表示されるChrome Net-Internalsのページから確認することもできる。"Query domain"にドメイン名を入力し、QueryをすることでHSTS情報を得ることができる。以前に訪れたドメインの場合は、"Delete domain"でそのドメインを一度削除すると良い。

![スクリーンショット 2015-07-01 17.42.47.png](https://qiita-image-store.s3.amazonaws.com/0/33915/c214a2cf-b0c8-7f45-c508-b48eb1735f6a.png "スクリーンショット 2015-07-01 17.42.47.png")

# 参考情報
* [RFC6797 HTTP Strict Transport Security (HSTS)](https://tools.ietf.org/html/rfc6797 "RFC6797")
* [cybozu.com を真に常時 SSL にする話 | Cybozu Inside Out | サイボウズエンジニアのブログ](http://developer.cybozu.co.jp/tech/?p=6096 "cybozu.com を真に常時 SSL にする話")
* [The Chromium Project HTTP Strict Transport Security](http://www.chromium.org/hsts "Chromium HSTS")
* [HTTP Strict Transport Security comes to Internet Explorer 11 on Windows 8.1 and Windows 7](http://blogs.windows.com/msedgedev/2015/06/09/http-strict-transport-security-comes-to-internet-explorer-11-on-windows-8-1-and-windows-7/ "HTTP Strict Transport Security comes to Internet Explorer 11 on Windows 8.1 and Windows 7")
* [IPA（情報処理推進機構） SSL/TLS暗号設定ガイドライン～安全なウェブサイトのために（暗号設定対策編）～](http://www.ipa.go.jp/security/vuln/ssl_crypt_config.html "SSL/TLS暗号設定ガイドライン")
Androidでカスタムフォントを簡単に導入(Caligaphy)


先日、[弊社(heathrow, Inc)](http://heathrow.co.jp/)の自社サービス[FAVRICA - あらゆるファッション通販サイトをまとめて検索](https://favrica.net/)の[Android版](https://play.google.com/store/apps/details?id=net.favrica.android&hl=ja)を無事リリースすることが出来ました。

公開を記念して、開発で得たノウハウなどをまとめて公開しております.
[FAVRICA Android版公開記念、いろんなノウハウ公開 - Qiita](http://qiita.com/unosk/items/c89dba8291e7f8fc1f8c)

---

FAVRICAでは要所、要所にカスタムフォントを導入した、下のようなかっこいいデザインになってます.

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/15445/d09a9e53-3e6e-cd2e-aa75-53613673711f.png "Slice 1.png")


さて、Androidでのカスタムフォントですが、
[Calligraphy](https://github.com/chrisjenx/Calligraphy)というライブラリを使うと、すごく簡単に導入できます.

こんな感じです.

```
<TextView
    fontPath="fonts/SackersGothicStd-Medium.ttf"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
```


以下、導入方法.


## 導入方法

### 1. build.gradleに追加
```app/build.gradle
dependencies {
    compile 'uk.co.chrisjenx:calligraphy:2.1.0'
}
```

### 2. Applicationで初期化処理

```Application.java
public class MyApplication extends Application {

    @override
    public void onCreate() {
        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                .setFontAttrId(R.attr.fontPath)
                .build());
  }
}
```

### 3. Activityで設定
```Activity.java
public class MyActivity extends Activity {

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    }
}
```

### 4. カスタムフォントを配置
`app/src/main/assets`に配置します.

ちなみにFAVRICAではSackersGothicなるかっこいいフォントを使ってます.

```
app/src/main/assets/fonts
└── SackersGothicStd-Medium.ttf
```

### 5. Viewで設定
```
<TextView
    fontPath="fonts/SackersGothicStd-Medium.ttf"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
```
chef-clientでnodejsをインストールするときに「gpg: keyserver timed out」エラーが発生する

# エラー内容

~~~
================================================================================
Error executing action `add` on resource 'apt_repository[node.js]'
================================================================================


Mixlib::ShellOut::ShellCommandFailed
------------------------------------
execute[install-key 1655a0ab68576280] (/var/chef/cache/cookbooks/apt/providers/repository.rb line 28) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '2'
---- Begin output of apt-key adv --keyserver keyserver.ubuntu.com --recv 1655a0ab68576280 ----
STDOUT: Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.yuuCkD6HSP --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyring /etc/apt/trusted.gpg.d//zabbix-official-repo.gpg --keyserver keyserver.ubuntu.com --recv 1655a0ab68576280
STDERR: gpg: requesting key 68576280 from hkp server keyserver.ubuntu.com
gpg: keyserver timed out
gpg: keyserver receive failed: keyserver error
---- End output of apt-key adv --keyserver keyserver.ubuntu.com --recv 1655a0ab68576280 ----
Ran apt-key adv --keyserver keyserver.ubuntu.com --recv 1655a0ab68576280 returned 2
~~~

# 原因

gpgコマンドはデフォルトで11371番ポート使用するのですが、chef-clientを実行したサーバの11371番ポートが空いていなかったせいで、インストールが失敗しました。

# 解決方法

chefのroleの設定ファイルで、nodejsのkeyserverを「hkp://keyserver.ubuntu.com:80」に変更します。

~~~
# roles/my-role.json

{
  "name": "my-role",
  "default_attributes": {
    "nodejs": {
      "keyserver": "hkp://keyserver.ubuntu.com:80"
    }
  },
  "json_class": "Chef::Role",
  "description": "",
  "chef_type": "role",
  "run_list": [
    "recipe[nodejs]"
  ]
}
~~~

# 参考

* [nodejs::repo recipe timing out to keyserver for ubuntu](https://github.com/redguide/nodejs/issues/45)
* [ポート制限のある環境でUbuntuにPPAリポジトリを追加する](http://teppeis.hatenablog.com/entry/20110605/1307254225)
and returnを使うときの注意点

###`render`や`redirect to`を複数用いるときの注意点

```rb
if home.nil?
  render :action => "new"
else
  render layout: 'new/mobile/default_no_footer'
end
```

としてしまうと

```
An AbstractController::DoubleRenderError occurred in
```

と怒られてしまいます、なのでここで使用するのが`and return`

```rb
if home.nil?
  render :action => "new" and return
else
  render layout: 'new/mobile/default_no_footer' and return
end
```

もちろん`return`でも大丈夫です。

```rb
if home.nil?
  render :action => "new" 
  return
else
  render layout: 'new/mobile/default_no_footer' 
  return
end
```

`render`を複数使用する際の注意点として、`render`を複数回呼び出すとエラーになるため、条件分岐した後「`and return`」で明示的に終了させる。[renderに関するレファレンスにも書いてあります](http://railsdoc.com/references/render)。

慣れてきたりすると、行数を使いたくないので

```rb
render :action => "index"  and return unless if @user.nil?
```

のようにスマートに書いたりします。
ここまではエラーが出てからでもなんとなくわかるのですが。。。

一瞬???てなったときがあったのでメモしておきます。

```rb
self.render_404 and return if @hogehoge.blank? 
@client = Client.find_by_id(params[:client_id])  
render layout: 'new/mobile/default_no_footer' if @user
```

みたいに書き、ロジックが走るとエラーが出ます。

```
An AbstractController::DoubleRenderError occurred in 　・・・・・・
```

あれ？これを防ぐために`and return`を書いたのになと思ったのですが出てるもんは仕方ないのでとりあえず前に`if`を出して普通に書いてみたら・・・エラーが出ないで直った。

なんでかわからなかったので調べてみたらありました！！

##`and return`を使用できるとき
エラーが出ている文をよくみてみると、要するにrenderの戻り値がたまたま `true` なのを利用して、 `and` で受けて次の文を書いているだけっぽいです。なので万が一 `false` や `nil` を返してきたら `return` は実行されないということらしい。

今後、注意していきたいものです。
EC-CUBEのプロファイラの表示の仕方

EC-CUBE3では、デバッグモードが有効のときに、搭載されているSymfonyのWebプロファイラを表示することができます。


## デバッグモードへの変更

![Screen Shot 2015-07-01 at 17.13.58.png](https://qiita-image-store.s3.amazonaws.com/0/73113/94522be7-8640-be19-53ea-5ca142e6fe3d.png)

URLの部分に注目してください。
通常、 `http://localhost/{管理画面パス}/` と表示されている箇所が、
`http://localhost/index_dev.php/{管理画面パス}/` へと変更されています。
これだけでデバッグモードが有効になり、Webプロファイラが表示されます。

右下に見えている(sf)というのがWebプロファイラです。

## Webプロファイラの表示の仕方

 `index_dev.php` を通してアクセスしたあと、(sf)の文字をクリックしてみてください。

![Screen Shot 2015-07-01 at 17.14.17.png](https://qiita-image-store.s3.amazonaws.com/0/73113/214409ba-d2e5-20f2-65e6-ae7051a5d26b.png)

このような表示に切り替わりましたか？
今はエラーがなく動いている画面で表示したため、このような表示になっています。

エラーが出た際は、 `200` となっている箇所が `500` や`404` などの表示に切り替わります。
その状態で、数字をクリックすることで、どの箇所で `Exception` が出たのか、どのルーティングを通ったのかなどを画面上で確認することができます。


## 注目したい機能

エラー発生時のデバッグに役立つのは上記でお伝えできたかと思います。
ですが、さらに注目したい機能も備えています。

それは、一番右にあるデータベースアクセスのデバッグ機能です。

![Screen Shot 2015-07-01 at 17.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/73113/4fe153a3-8801-5702-1847-6975e6af7161.png)

この画面では、 アクセスによって 

* どれだけクエリが走ったか
* クエリの実行

などの情報が表示されます。
表示が遅くて気になる際や、負荷試験を行いたいときなどは、是非参照してください。
MySQLのSELECT結果をCSVで保存する


権限が足りなくて into outfile によるエクスポートができない場合に役立つと思います！

```
mysql -uuser_name db_name -p -B < sample.sql | sed -e 's/\t/,/g' > sample.csv
```

参考にしたページ
http://ryoff.hatenablog.com/entry/2013/01/07/145917
EC-CUBE3のインストールでこけたら見る記事

# EC-CUBE3のインストールでこけたら見る記事

EC-CUBE3.0.0には、WEBインストーラが付属していますが、
ある条件下では、インストーラが正常に動作しない場合があります。

早く試したいと思うので、クイックリファレンス的に記します。
見る箇所は以下です。

* `/app/config/eccube/path.yml`
    + path設定が、おかしい
* `/{DOCUMENT_ROOT}/index.php`
* `/{DOCUMENT_ROOT}/install.php`
    + `autoload.php` への相対パスがおかしい
* `/{DOCUMENT_ROOT}/.htaccess`
    + Rewrite設定がおかしい


### ある条件下とは

基本構成では、
```
[EC-CUBE ROOT DIR] 
├───app
|  ├─ cache/ 
|  ├─ config/
|  ├─ plugin/
|  |    └──  SmaplePlugin/
|  ├─ template/
|  |    ├──  Admin/ 
|  |    ├──  [DesignTemplate] 
|  |    └──  Default/
|  |
|  ├─  upload/
|  └─  .htaccess
|
├── src/ 
|  └── Eccube/
|    ├── Resource/template/ 
|    |     ├── Admin/
|    |     └── Default/
|    ├── Resource/doctrine/ 
|    |     └── migration/
|    └── Application.php
|
├── html/
|  ├─index.php
|  |   
|  ├─ template
|  |    ├─  Admin/ {css, img, js}  
|  |    ├─  Default/ {css, img, js}  
|  |    └─  [DesignTemplate]/ {css, img, js} 
|  |   
|  ├─ plugin/
|  |    └─  SamplePlugin/ {css, img, js} 
|  |   
|  ├─ user_data
|  |   
|  └─ upload/
|
├── vendor/
├── .htaccess （web.config ）
└── robots.txt
```

となっています。
これが基本形となり、インストーラもこの構成をもとに作っています。
「この構成」とは、 「srcからhtmlへの相対が `src/../html` 」となっている状態のことを指します。

なので、レンタルサーバなどで、
`src/../public_html` や `src/../../html` となる場合は、最初に述べた箇所を確認して、正しく修正する必要があります。
gvm install gradleでSSL certificate problem 発生時の対応

## 環境
##### **Mac** 
OS 10.10.4
##### **gvm**
2.2.0 
##### **curl**
7.37.1 (x86_64-apple-darwin14.0) libcurl/7.37.1 SecureTransport zlib/1.2.5

## やったこと
### 1.gvmを使ってgradleのupdate
```gvm install gradle```
### 2.発生したエラー
```
$ gvm install groovy

Downloading: groovy 2.4.3

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (60) SSL certificate problem: Invalid certificate chain
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of /Users/iju/.gvm/archives/groovy-2.4.3.zip or
        /Users/iju/.gvm/archives/groovy-2.4.3.zip.zip, and cannot find /Users/iju/.gvm/archives/groovy-2.4.3.zip.ZIP, period.

Stop! The archive was corrupt and has been removed! Please try installing again.
```

### 3.対応したこと
https://github.com/gvmtool/gvm-cli/issues/327
にある通り、
```echo insecure >> ~/.curlrc```
をしてverificationをoffし、再度
```gvm install groovy```
しただけ。

## まとめ
他にもあるっぽいけど、特に問題なければcurlのverificationをoffにするだけでよいっぽい。
QiChatを使ってPepperを自由に動かす。【まとめ】

##関連記事
僕の作成した記事ですが、紹介させてもらいます。

>QiChatを使ってPepperを自由に動かす。【チュートリアル】
>http://qiita.com/DeveloperRyo87/items/83a7d0327116214892d4
>QiChatを使ってPepperを自由に動かす。【イベント】
>http://qiita.com/DeveloperRyo87/items/da5a73f15f0da3aea2a2
>QiChatを使ってPepperを自由に動かす。【コラボラティブ】
>http://qiita.com/DeveloperRyo87/items/d4b3f9ae411fc685239a
>QiChatを使ってPepperを自由に動かす。【まとめ】<-本記事
>http://qiita.com/DeveloperRyo87/items/7a72c039efe2d2954c7b

##始めに
Qichatを使えば、Dialogボックスだけである程度の物事を管理できるようになるので、その辺をまとめた記事がなかったので、作成しようと思います。

今回も、先に記事を公開して、暇があるタイミングで更新していくスタンスで行きたいと思います。

##確認方法
###確認環境
MacBook Pro (Retina, 13-inch, Late 2013)
コレグラフ2.1.3
NAO 2.1.3(basic Channelインストール済み)
うちにはNAOしかいないのでとりあえず、NAOで。
Pepper欲しい。

##方針
とりあえず、チュートリアルとして、ルールの使い方や、コンセプトの使い方を簡単に説明して、そのあとは本題のイベントを使った話とか、コラボラティブな話とか書いていきたいです。



##これで何ができる？
上記で、Qichatの簡単な説明とEventの説明をしましたが、Dialogを使って行えることはコラボラティブにすることができ、対話アプリケーションと関連付けされるので、NAOとコミュニケーションを取ることが簡単に行えるようになります。

上記で説明したイベント以外にも、NAOqiのEventも使えたりするので活用の幅は大きいです。
例えば、対話アプリケーションが起動している状態で、手を触ったりすると話しかける！と言ったアプリケーションを作成することが出来ます。

特定のInteractiveアプリケーションを起動させ続けて、何かしらの動作をさせるより、人とコミュニケーションを取ることを優先するのであれば、この作成方法はおすすめできると思います。


##感想
~~まだまだ、ドキュメントを読み足りていないので、細かく目を通したい。
この記事も、まだまだ書き足りていないので、どんどん書き足していこうと思っています。
今後とも宜しくお願いします。~~

記事を分割しました。
現在はただ分割してあるだけなのでまだ見難いかもしれませんが、おいおい直していきます。
##参考URL

>Qichat - Syntax
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html#dialog-rules

>Qichat - Cheatsheet
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog_syntax_cheat_sheet.html?highlight=cheat
QiChatを使ってPepperを自由に動かす。【コラボラティブ】

##関連記事
僕の作成した記事ですが、紹介させてもらいます。

>QiChatを使ってPepperを自由に動かす。【チュートリアル】
>http://qiita.com/DeveloperRyo87/items/83a7d0327116214892d4
>QiChatを使ってPepperを自由に動かす。【イベント】
>http://qiita.com/DeveloperRyo87/items/da5a73f15f0da3aea2a2
>QiChatを使ってPepperを自由に動かす。【コラボラティブ】<-本記事
>http://qiita.com/DeveloperRyo87/items/d4b3f9ae411fc685239a
>QiChatを使ってPepperを自由に動かす。【まとめ】
>http://qiita.com/DeveloperRyo87/items/7a72c039efe2d2954c7b

##始めに
Qichatを使えば、Dialogボックスだけである程度の物事を管理できるようになるので、その辺をまとめた記事がなかったので、作成しようと思います。

今回も、先に記事を公開して、暇があるタイミングで更新していくスタンスで行きたいと思います。

##確認方法
###確認環境
MacBook Pro (Retina, 13-inch, Late 2013)
コレグラフ2.1.3
NAO 2.1.3(basic Channelインストール済み)
うちにはNAOしかいないのでとりあえず、NAOで。
Pepper欲しい。

##方針
とりあえず、チュートリアルとして、ルールの使い方や、コンセプトの使い方を簡単に説明して、そのあとは本題のイベントを使った話とか、コラボラティブな話とか書いていきたいです。


##コラボラティブ
名の通り、Dialogはコラボレーションできるのです。
NAOに、「座って」「立って」などの指示を出すと動いてくれたり、「何ができる？」などと聞くと内蔵アプリケーションの一つを言ってくれたりとしますが、これは"対話"アプリケーションと別のDialogが組み合わさって動いているものです。
細かくは割愛しますが、コラボラティブを使うと、毎回アプリケーションをトリガーセンテンスで呼び出してから、会話を行う必要がなくなります。

早速簡単な作り方を説明します。
###コラボラティブアプリケーションの作り方

1. "協調的対話としてパッケージコンテンツに追加"にチェックを入れる。
![スクリーンショット 2015-06-30 14.38.08.png](https://qiita-image-store.s3.amazonaws.com/0/35860/43fba536-99d3-aa5c-ac20-4a40eba56f51.png "スクリーンショット 2015-06-30 14.38.08.png")

2. 結線していないダイアログボックスを置く
![スクリーンショット 2015-06-30 14.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/35860/a4741e4f-ccdc-0b84-fac9-f80f64321089.png "スクリーンショット 2015-06-30 14.38.35.png")
1. インストール！
1. 完成！！

##これで何ができる？
上記で、Qichatの簡単な説明とEventの説明をしましたが、Dialogを使って行えることはコラボラティブにすることができ、対話アプリケーションと関連付けされるので、NAOとコミュニケーションを取ることが簡単に行えるようになります。

上記で説明したイベント以外にも、NAOqiのEventも使えたりするので活用の幅は大きいです。
例えば、対話アプリケーションが起動している状態で、手を触ったりすると話しかける！と言ったアプリケーションを作成することが出来ます。

特定のInteractiveアプリケーションを起動させ続けて、何かしらの動作をさせるより、人とコミュニケーションを取ることを優先するのであれば、この作成方法はおすすめできると思います。


##感想
~~まだまだ、ドキュメントを読み足りていないので、細かく目を通したい。
この記事も、まだまだ書き足りていないので、どんどん書き足していこうと思っています。
今後とも宜しくお願いします。~~

記事を分割しました。
現在はただ分割してあるだけなのでまだ見難いかもしれませんが、おいおい直していきます。

##参考URL

>Qichat - Syntax
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/dialog-syntax_full.html#dialog-rules

>Qichat - Cheatsheet
>http://doc.aldebaran.com/2-1/naoqi/audio/dialog/aldialog_syntax_cheat_sheet.html?highlight=cheat
Rails4 - Carrierwave・Rmagick 導入



**インストール**

rmagickは画像をリサイズしたりするのに必要です。


```rb:Gemfile
gem 'carrierwave'
gem 'rmagick'
```

mongoidを使っている場合は、

```rb:Gemfile
gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
```
を追記

```bash
bundle install
```


ImageMagickをイントールしていないのなら、エラーが出るはず。
Amazon LinuxにImageMagickをインストールするには下記。


```bash
yum -y install libjpeg-devel libpng-devel
yum -y install ImageMagick ImageMagick-devel
```


**アップローダ作成**

```bash
rails g uploader image
```

```rb:app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base  

 # リサイズしたり画像形式を変更するのに必要
  include CarrierWave::RMagick

 # 画像の上限を700pxにする
  process :resize_to_limit => [700, 700]

  # 保存形式をJPGにする
  process :convert => 'jpg'

  # サムネイルを生成する設定
  version :thumb do
    process :resize_to_limit => [300, 300]
  end

  # jpg,jpeg,gif,pngしか受け付けない
  def extension_white_list
    %w(jpg jpeg gif png)
  end

 # 拡張子が同じでないとGIFをJPGとかにコンバートできないので、ファイル名を変更
  def filename
    super.chomp(File.extname(super)) + '.jpg' if original_filename.present?
  end

 # ファイル名は日本語が入ってくると嫌なので、下記のようにしてみてもいい。
 # 日付(20131001.jpgみたいなファイル名)で保存する
  def filename
    time = Time.now
    name = time.strftime('%Y%m%d%H%M%S') + '.jpg'
    name.downcase
  end

end
```

**mount_uploaderを指定する**

```rb
class User < ActiveRecord::Base
    # 下記を追加
    mount_uploader :image, ImageUploader
```
最新のXcodeでXcode Plug-insを動くようにする（Xcode 7動作確認済）

# 新しいXcodeにアップデート

アップデート完了おめでとうございます！
Plug-inはきれいに動かなくなっているはずです！

# 動くようにする手順

## DVTPlugInCompatibilityUUIDを調べる

Xcodeのinfo.plistに割り当てられているDVTPlugInCompatibilityUUIDという値を以下のコマンドで抽出します。

```bash
$ defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID
7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90
```

## インストール済みのPlug-insたちのInfo.plistにDVTPlugInCompatibilityUUIDを仕込む

Plug-insが配置されているディレクトリ以下のInfo.plistすべてに上記で調べた DVTPlugInCompatibilityUUID を書き込んでいきます

```bash
$ find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90
```

## Xcodeを再起動する

Xcodeを再起動したら以下の様なダイアログが表示されるので ```Load BUndles``` を選択します。

![スクリーンショット 2015-07-01 16.38.30.png](https://qiita-image-store.s3.amazonaws.com/0/30355/69cc1783-5a2b-639a-1409-1c44ea43a286.png)

## 万が一 ```Skip Bundles``` した場合

以下のコマンドを実行すると再度上記のダイアログが表示されます。

```bash
$ defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-6.4
```

## 参考

以下を参考にさせてもらいました

http://qiita.com/dealforest/items/c1443512f1db00a8a7c6
cocos2dx2系がios8.4上の反応

iOS8.4が出たですが、cocos2dx3.xがうまく行ったようですね。

でもcocos2dx2系がなんか死んだ見た、ビルドエラー出たですけど。
２系を使う人が多いと思いますが。ここが個人的なアドバイスを書きます。

原因はファイル
CCDirectorCaller.mm
になりまして、
[EAGLContext setCurrentContext: [[EAGLView sharedEGLView] context]];

エラー原因は
MPPlayableContentManagerContextのcontextを初期化できないみたい。

まぁ、クラスの名前を見るとわかると思いますが、これが多分、apple musicがcontextによるの改造ですね。

cocos2dxがopenglですので、別にメディアとか関係ないから、そこが書き方を変わって

EAGLView* glView = [EAGLView sharedEGLView];
[EAGLContext setCurrentContext:glView.context];

に変更すればOKの感じです。

ちなみに、
ここをコメントアウトした人が多いと思いますが、
この
-(void) doCaller: (id) sender
関数ですが

テキスト入力の時、音声入力を切り替える時に使うもののようです。
音声切り替える時がopenglのcontextを無くしてはならないので、ここがちゃんと動けるように設定したほうがいいと思います。
PSR7のHttp/Messageを使ったファイルアップロード処理

とうとう策定された[PSR-7（Http/Message](https://github.com/php-fig/http-message)）を使った場合、ファイルアップロードの処理がどうなるか書いてみました。　

PSR-7の策定にまで持っていった「Matthew Weier O'Phinney」さんという方が作ったPSR-7実装「[zendframework/zend-diactoros](https://github.com/zendframework/zend-diactoros)」を参考にしてます。他の実装では構築方法などが微妙に違うかもしれませんが、APIは同じになります。


サンプルコード
--

### アップロードフォーム

次のようなアップロードフォームを想定します。

```html
<form method="post" enctype="multipart/form-data">
  <input type="file" name="up[0]" />
  <input type="submit" />
</form>
```

名前が配列になってます。従来のPHPだと、この場合の処理がメチャクチャ面倒でした。


### サーバー側の処理

まずはリクエストオブジェクトを生成します。

```php
use Psr\Http\Message\UploadedFileInterface;
use Zend\Diactoros\ServerRequestFactory;

$request = ServerRequestFactory::fromGlobals();
if ($request->getMethod()!=='POST') {
    exit;
}
// UploadedFileInterfaceの配列を読み込む
$uploaded_files = $request->getUploadedFiles();
if (!isset($uploaded_files['up'][0]) || !$uploaded_files['up'][0] instanceof UploadedFileInterface) {
    exit;
}
/** @var UploadedFileInterface $upload */
$upload = $uploaded_files['up'][0];
```

一応、メソッドがPOSTであること、目的のファイルがアップロードされたことぐらいはチェックしてみました。

これで、アップロードされたフィアルについての`UploadedFileInterface`のオブジェクトが取得出来ました。ここからは、この`$upload`オブジェクトを操作します。


`UploadedFileInterface`オブジェクト
----

### エラーチェック

ファイルのアップロードエラーをチェックします。例えば…

```php
if ($upload->getError()===UPLOAD_ERR_NO_FILE) {
    die('ファイルをアップロードして下さい');
}
if ($upload->getError()===UPLOAD_ERR_FORM_SIZE) {
    die('サイズが大きすぎます');
}
if ($upload->getError()!==UPLOAD_ERR_OK) {
    die('OKじゃないです。エラーです');
}
// エラー無し
```

エラーチェックも簡単、というか迷わない感じです。


### ファイルの操作

ストリームを取得して、中身を読み取ります。

```php
$stream = $upload->getStream();
// streamを使って書きだす。
$stream->rewind();
while (! $stream->eof()) {
    echo $stream->read(4096);
}
// ファイルポインターを抜き出して、書きだす。
$fp = $stream->detach();
rewind($fp);
fpassthru($fp);
```

あるいは別ファイルへ移動します。

```php
$upload->moveTo('/path/to/new/file');
```

アップロードエラーがある状態で、`getStream`あるいは`moveTo`を使うと例外を投げます。また`moveTo`は一度しか使えません。もちろん移動する際には`move_uploaded_file`を使ってアップロードされたファイルしか移動しません。


最後に
----

説明しなくても使えぐらい簡単なAPIと思いますが、PSR-7で便利になった点の一つだと思ったので書いてみました。
FAVRICA Android版でつかっているライブラリのまとめ


先日、[弊社(heathrow, Inc)](http://heathrow.co.jp/)の自社サービス[FAVRICA - あらゆるファッション通販サイトをまとめて検索](https://favrica.net/)の[Android版](https://play.google.com/store/apps/details?id=net.favrica.android&hl=ja)を無事リリースすることが出来ました。

公開を記念して、開発で得たノウハウなどをまとめて公開しております.
[FAVRICA Android版公開記念、いろんなノウハウ公開 - Qiita](http://qiita.com/unosk/items/c89dba8291e7f8fc1f8c)

---


## [RxAndroid](https://github.com/ReactiveX/RxAndroid)
はやりのリアクティブプログラミング.
非同期処理周りとList操作あたりで使ってます.
詳しくは別途記事を書こうと思います.


## [Timber](https://github.com/JakeWharton/timber/)
デフォルトの`Log`クラスをラップして、いい感じに使いやすくしてくれる.

## [Dagger2](http://google.github.io/dagger/)
DependencyInjection(依存性注入)のためのライブラリ.
Jakeのこのスライドがすごくわかりやすかったです.
[Dependency Injection with Dagger 2 (Devoxx 2014) // Speaker Deck](https://speakerdeck.com/jakewharton/dependency-injection-with-dagger-2-devoxx-2014)


## [Butter Knife](https://github.com/JakeWharton/butterknife)
定番ViewInjection用ライブラリ.
まどろっこしい本質的でないコードが消え去り、すっきりと簡単にかけます.

## [EventBus](https://github.com/greenrobot/EventBus)
定番EventBus.
同様のものにsquareの[otto](https://github.com/square/otto)がある.
こっちのgreenbotのライブラリではイベントを処理するスレッドを簡単に設定できるので、今回はこっちを採用.

## [Retrofit](https://github.com/square/retrofit)
RESTクライアント.

これの便利な使い方も~~多分~~別途記事に書きます.

## [Picasso](https://github.com/square/picasso)
画像ダウンロードライブラリ. 
プレースホルダー画像の設定とか、画像を角丸にするなんかも簡単にできます.
もちろんキャッシュにも対応.


## [google-gson](https://code.google.com/p/google-gson/)
JSONとJavaオブジェクトの変換をやってくれるライブラリ.
Retrofitと組み合わせて、WebAPIが返すJSONをエンティティに変換する際に利用.

## [Parceler](https://github.com/johncarl81/parceler)
ObjectのParcelへの変換をアノテーションによって行うライブラリ.
成功法でParcelに変換するには、すごく煩雑な記述をしなければならず、これを使うと革命的に簡単になるのでオススメ.

## [Android Saripaar v2](https://github.com/ragunathjawahar/android-saripaar)
入力のバリデーションをアノテーションによって行うライブラリ.

必須項目チェックや、メールアドレス形式かどうかとか、自前で検証項目作ったりできたりと高機能.

## [LeakCanary](https://github.com/square/leakcanary)
しらずしらずにやってしまうメモリーリークを検出してくれるライブラリ.
どんなアプリでも導入を推奨.

## [Calligraphy](https://github.com/chrisjenx/Calligraphy)
カスタムフォントを使いやすくするためのライブラリ.
FAVRICAでは価格表記部分におしゃれなフォント使っています.
[git-flow](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html)


git-flowの記事のメモ

## サポートブランチ

* Feature branch
	* 分岐元: develop
	* マージ先: develop
	* ブランチ名の慣習: master, demelop, release-*, hotfix-*以外ならOK!
	* 内容
		* 今度のリリースに入る新しい機能を開発する時に用いる．
* Release branch
	* 分岐元: develop
	* マージ先: develop, master
	* ブランチ名の慣習: release-*
	* 内容
		* リリースブランチは製品リリースの準備の時に用いる．
		* 分岐するタイミングは，developブランチが新しいリリースの望ましい状態を反映している時．
		* 次のリリースで追加する機能は，developブランチにマージされていなければならない．
		* 将来のリリースで追加する機能のブランチは，developブランチにマージされてはいけない．
		* リリースブランチがmasterブランチにマージされてリリース完了後，リリースブランチをdevelopブランチにマージする．
* Hotfix branch
	* 分岐元: master
	* マージ先: develop, master
	* ブランチ名の慣習: hotfix-*
	* 内容
		* masterブランチですぐに解決しなければならない問題があれば，そのタグが付けれているmasterブランチから分岐する．
		* 修正が完了したら，Hotfix branchをmasterブランチにタグをつけてマージする．
		* その後，developブランチにもマージする．
		* この時，リリースブランチが存在していれば，developブランチではなくリリースブランチにマージする．


## 備考
### マージ
* --no-ff フラグを使ってマージを行うと，マージ先にフィーチャブランチが存在したという情報が残る．
ubuntu 14.04でdockerを使って遊んでみる

「えー、普通docker使って構築するでしょ　なんでも」って言われて「また何でもブラックボックス化かぁ」と思ってるみゅみゅです。
サービスをdockerを使ってコンテナ化にしちゃって運用するのが普通だそうです。
（誰が決めた普通なのかは下っ端の私には聞けませんでした）
コンテナってSolaris8の時にSolarisコンテナで痛い目を見てるのでやだなぁと思いながらも、やらないで口だけで文句を言うのは嫌なので、Dockerを覚えます。

### Dockerのインストール

色々なやり方があるかと思いますが、[公式サイト](https://docs.docker.com/installation/ubuntulinux/)通り進めていきたいと思います。

```shell-session
root@raidtest:~# uname -r
3.16.0-30-generic

※一応念のためバージョンの確認　3.10以上じゃないとダメだそうです

root@raidtest:~# sudo apt-get update
※　ずらずらずら～と・・・

root@raidtest:~# sudo apt-get install wget
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
wget は既に最新バージョンです。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 111 個。

root@raidtest:~# wget -qO- https://get.docker.com/ | sh

・・・ずらずらずら～と　そして最後

f you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

root@raidtest:~#

※usermodはオプショナルだからまぁ　いいかなぁ。。。

root@raidtest:~# sudo docker run hello-world

※確認だそうです

root@raidtest:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              91c95931e552        10 weeks ago        910 B

hello-world のイメージが入りました。

```

### 遊んでみる　その１

kibanaを使いたい言われたので、kibanaのリポジトリーを入れてみます。
適当に探してみたら、
https://registry.hub.docker.com/u/devdb/kibana/
こんなのがありましたので書かれてる通り進めてみます。

```shell-session
root@raidtest:~# docker pull devdb/kibana:latest
latest: Pulling from devdb/kibana
（ここからずらずら～とダウンロードとか色々）

root@raidtest:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
devdb/kibana        latest              bf8cc6e7c506        5 weeks ago         884.7 MB
hello-world         latest              91c95931e552        10 weeks ago        910 B

※なんかイメージが入った！

root@raidtest:~# docker run -d --name kibana -p 5601:5601 -p 9200:9200 devdb/kibana
68df56f9fc85f53df2e5d5447a381575f5356e4c7afc7171bd1debe3ec550135

※特になんか怒られなかった！

この状態で、インストールしたマシンのIP:5601　にアクセスしたらkibanaの画面が出てきました。

```

うん、なんだろう。。。簡単ですね。。。。
Google 音声認識api の制限なしで使う方法(裏ワザ的な）

#音声認識について

音声認識機能は今、巷で話題になっています。
音声認識を気軽に使える環境も増えてきて、音声認識したいと思う方も増えているはず

親切な人がGoogleでの音声認識apiの使い方を公開してくれています。

事前準備(Google Chromeのみ設定可能）

The Chromium Projects
http://www.chromium.org/developers/how-tos/api-keys
(2015.07.01引用)

Google Speech API ver.2の使い方
http://qiita.com/mountcedar/items/be1e5d54fcef8f3a4bda
(2015.07.01引用)

この便利なapiですが1日50回の利用制限が・・・
解除する方法がないかグーグル力を使って調査しました（英語）

#結論から言うとapiでの方法はないです。

ただし下記フォーラムを参考にすると

https://groups.google.com/a/chromium.org/forum/#!searchin/chromium-dev/speech$20api/chromium-dev/TJRsxtxkB_Y/NMtVlltC0loJ

>Yes, a key is required for the HTTPS Speech API and it is limited to 50 requests per day. It is only available for development and personal use.  We currently do not offer additional quota nor the ability to pay for additional quota.

>However, for Android and Chrome applications, Google speech recognition and speech synthesis are available without this limit:
JavaScript Web Speech API: available to websites running on Chrome (Desktop and Android): Docs, Tutorials ASR, TTS. It's free to use providing you abide by the Chrome Terms of Service. (See Chrome's "About Google Chrome" menu).
Java Android Speech API: available to Android Apps: the Android SDK includes speech: Docs, ASR, TTS. It's free to use providing you abide by the Android Terms of Service.

上記の記述からAndroidとChromeのみ制限なしで使えるみたいです。

JavaScript Web Speech API:Chromeからなら制限なし
Java Android Speech API:Androidからなら制限なし

通常の方法ではできないという結論ですが、このような裏ワザを使えば出来るみたいです。
まだ試してないので誰か試してみてください！！！！
自前のサーバ等からgoogle appsで管理しているドメインにメールが送れなくなった時の対処


## 症状

- 自前サーバでなにがしかのサービスを運営していて
- メール等はgoogle appsを利用している
- 自前サーバから自ドメインにメールが突如送れなくなる
    - google appsの`レポート > メールログ検索`で確認すると`Message rejected by Google Groups. Please visit http://mail.google.com/support/bin/answer.py?hl=en&answer=188131 to review our Bulk Email Senders Guidelines.`というようなエラーが出ている
- spfレコード等を設定しても改善しない

## 対処法

google appsの`アプリ > Google Apps > Gmail の設定 > 詳細設定`にアクセスし、迷惑メールの項目のホワイトリストの欄に自前サーバのIPを入力する。

![console.png](https://qiita-image-store.s3.amazonaws.com/0/8199/3ca7e021-71e7-072e-1352-f886fc59338d.png)
c++ builder > TPageControl > TTabSheetの入替え > TTabSheet.PageIndexを書換える

```txt:動作確認
C++ Builder XE3
```

TPageControl内のタブシートの入れ替えをしたい。

タイトルに記載のプロパティを変更すればいい。

http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+201001/10010027.txt
FAVRICA Android版公開記念、いろんなノウハウ公開


先日、[弊社(heathrow, Inc)](http://heathrow.co.jp/)の自社サービス[FAVRICA - あらゆるファッション通販サイトをまとめて検索](https://favrica.net/)の[Android版](https://play.google.com/store/apps/details?id=net.favrica.android&hl=ja)を無事リリースすることが出来ました。

>
自分の好きなブランドをフォローするだけで、ブランドの入荷アイテム・ブログの最新情報を、まとめて見ることができるアプリです。
googleやyahooのような便利な検索機能もあるので、眺めるだけでなく、本気で服を探したい時でもFAVRICAさえ開けば、欲しいものをカンタンに見つけることができます。

## 恩返しがしたい ~~それと少し宣伝もしたい~~
Androidをがっつりやるのは1.6時代以来で浦島太郎状態でした。
いろんな事が様変わりし、かつてのノウハウも役に立たず...

このアプリをリリースできるまで、多くのQiitaの投稿やブログ記事などに助けられました。

そこで、FAVRICAの開発で得たノウハウなどを公開し、少しではありますが恩返しできればと思います!


## 目次
- [FAVRICA Android版でつかっているライブラリのまとめ - Qiita](http://qiita.com/unosk/items/79123222618234fcd7f3)
- FAVRICA Android版でのサーバー、クライアントのデータ同期戦略
- [Facebook/Twitterに対応したURLの共有Intentを作成する方法](http://qiita.com/unosk/items/79e74d0855234cf53ebf)
- AndroidでRxJavaを使い非同期処理をよろしくやる
- RetrofitとRxJavaで無限スクロールに対応
- SyncAdapterで定期処理
- [Androidでカスタムフォントを簡単に導入(Caligaphy)](http://qiita.com/unosk/items/f75457199d0ae49f58f9)

**準備でき次第、順次公開します**

## 参考にしたサイトなど
#### 全般
- [Android再入門 〜Eclipseのことは忘れろ〜 #nds40 - Qiita](http://qiita.com/Nkzn/items/b31829890ba83a7fd618)

#### テスト
- [Android - Robolectric に対応したプロジェクトを作る - Qiita](http://qiita.com/KeithYokoma/items/79ab2d1d37e70f149fcb)
- [Espresso 2.0とRobolectricを併用したテスト環境の作り方 - Qiita](http://qiita.com/Nkzn/items/d5f30bfe31bdf329860b)

#### 設計
- [android10/Android-CleanArchitecture](https://github.com/android10/Android-CleanArchitecture)
- [glomadrian/MvpCleanArchitecture](https://github.com/glomadrian/MvpCleanArchitecture)
- [pedrovgs/EffectiveAndroidUI](https://github.com/pedrovgs/EffectiveAndroidUI)
- [konifar/twipe at release/0.1.0](https://github.com/konifar/twipe/tree/release/0.1.0)

#### ライブラリ
- [wasabeef/awesome-android-libraries](https://github.com/wasabeef/awesome-android-libraries)
- [イマドキなイカした Android のオープンソースライブラリ集 - Qiita](http://qiita.com/KeithYokoma/items/fb6872a72a75e9b6f2e6)
- [android-best-practices/README.ja.md](https://github.com/futurice/android-best-practices/blob/master/translations/Japanese/README.ja.md)


## FAVRICAの紹介
![favrica.png](https://qiita-image-store.s3.amazonaws.com/0/15445/a15ae30c-b484-d598-f8e9-87695b312681.png "favrica.png")

[FAVRICA:人気ファッション通販・ブログをまとめ読み - Google Play の Android アプリ](https://play.google.com/store/apps/details?id=net.favrica.android&hl=ja)

>
アプリ１つで公式通販／ショッピングサイト／ブログをまとめて探せる、読める、検索できる。
カンタン・サクサク。通販・ブログまとめ読みできるファッションアプリ、FAVRICA（ファブリカ）です。
herokuでハイブリッドアプリを動かす

<h1>Herokuに公開</h1>
herokuでcordova ionicで作成したアプリを公開する。

ProcFileに記述 :```web:node web.js```

```heroku create```

```heroku ps:scale web=1```
![error](https://gyazo.com/e938598b3e6c615e0bdaa7f3d919cc10.png)
→herokuにデプロイしてから実行すればいい

```git add .```
```git commit -m "comment"```
```git push origin master```
```git heroku master```

```heroku ps:scale web=1```でできた。

いざ見てみる:```heroku open```
こんなエラーがでた
![error](https://gyazo.com/4a04ab5294bd67090484b2a023774358.png)

とりあえず:```heroku logs```でログをみてみた


なんかうまくいかない・・・
herokuのページからionicテンプレートをデプロイできた
こっちだとうまくうごく、今後問題を解決していきたい
button_toでIEだけ値が送られない

helperでbuttonタグを作成していたんだが、IEだけ値がsubmitされない現象にぶつかってしまった。。。

```
def original_tag
  button_to(aaa_path, class: 'btn') do
    concat hiddenfield_tag 'abc', 'a1'
    concat hiddenfield_tag 'cde', 'a2'
    concat '戻る'
  end
end
```

開発ツールでHTMLを見てみるとこんな形になっている。

```
<form method="post" class="btn" action="aaa">
	<button type="submit">戻る
		<input type="hidden" id="test_input" name="abc" value="a1">
		<input type="hidden" id="test_input" name="cde" value="a2">
	</button>
</form>
```

まずHTMLがおかしいんだけど、これだとIEだけ値が送られないみたい。

で、inputタグを外に出すためにはbutton_toのparamsに値を設定してあげます。

```
def original_tag
  b_params = {}
  b_params[:abc] = 'a1'
  b_params[:cde] = 'a2'
  
  button_to(aaa_path, class: 'btn', params: b_params) do
    concat '戻る'
  end
end
```

```
<form method="post" class="btn" action="aaa">
	<button type="submit">戻る
	</button>
	<input type="hidden" id="test_input" name="abc" value="a1">
	<input type="hidden" id="test_input" name="cde" value="a2">
</form>
```

これで解決！
IE6～11 ドキュメントモード 互換 設定一覧

DOCTYPE、X-UA-Compatible、互換表示ボタン、複雑な仕様盛りだくさんでM$さんには苦しめられました。互換の確認だけでどれだけのコストがかかったことか…

とりあえず現時点でドキュメントから、設定とドキュメントモードをまとめてみた。

**互換表示ボタンOFF**
![image](https://qiita-image-store.s3.amazonaws.com/0/69798/c33c5bcb-9d84-c03f-c191-0f2feae66071.png)

**互換表示ボタンON**
![image](https://qiita-image-store.s3.amazonaws.com/0/69798/7e275349-ab44-7500-bbe8-c517df11d9a5.png)
elixirを利用してdocker apiを叩いてみた

DockerのREST APIを叩いてくれるelixirのlibraryを探してみましたが、

動かないものが多かったので、[HTTPotion](https://github.com/myfreeweb/httpotion)を利用して、叩いてみました。

mix.exsは下記の通りです。

```exs
defmodule Samplemix.Mixfile do
  use Mix.Project
     
  def project do
    [app: :samplemix,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end
     
  # Configuration for the OTP application
  #  
  # Type `mix help compile.app` for more information
  def application do
    [applications: [:logger, :httpotion, :json]]
  end                                                                                                                                                                                                        
     
  # Dependencies can be Hex packages:
  #  
  #   {:mydep, "~> 0.3.0"}
  #  
  # Or git/path repositories:
  #  
  #   {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
  #  
  # Type `mix help deps` for more examples and options
      #{:nklib, git: "https://github.com/Nekso/nklib.git", tag: "v0.1.0"}, 
      #{:nkdocker, git: "https://github.com/Nekso/nkdocker.git", tag: "v0.118.1"} 
  defp deps do
    [   
      {:httpotion, "~> 2.1.0"},
      {:json, "~> 0.3.0"}
    ]   
  end 
end  
```

呼び出すためのスクリプトは下記の通りです。

```ex
defmodule Samplemix do
  # dockerが動いているホスト
  @base_url "http://*.*.*.*:2375"
 
  HTTPotion.start

  # container一覧を取得する
  @response HTTPotion.get (@base_url <> "/containers/json")
  def start_link, do: @response
 
  @containers JSON.decode!(@response.body)
  def containers, do: @containers
 
  def show_containers() do
    Enum.each(@containers, &IO.puts(&1["Id"]))
  end
end  
```

mixでつくったディレクトリで以下のように、インタラクティブに開始して実行してみます。

```bash

iex -S mix
```

```ex
iex> Samplemix.containers
[%{"Command" => "/usr/bin/supervisord -n", "Created" => 1432868027,
   "Id" => "979903937a7fa6eb9b57696d47f32b203bdd1054d39d0fa22975217b0752b021",
   "Image" => "private-registry:5000/ubuntu-1404:latest", "Labels" => nil,
   "Names" => ["/ubuntu1410"],
   "Ports" => [%{"IP" => "0.0.0.0", "PrivatePort" => 80, "PublicPort" => 80, 
   "Type" => "tcp"},
   %{"IP" => "0.0.0.0", "PrivatePort" => 22, "PublicPort" => 20022,
   "Type" => "tcp"}], "Status" => "Up 30 hours"}]   
```

行けました。

こんなのりで、dockerを操作するelixir系のライブラリも実装されているのかな、という期待感をもって、githubのライブラリを漁っていきます。
よく使うRailsいろいろ

自分用メモに(随時更新予定)

```bash:コントローラ作成
rails g controller [名前(全部小文字で複数形)] [機能１] [機能２] ...　
```

```bash:ActiveRecord追加
rails g model [名前(先頭大文字(アッパーキャメル)で単数形)] [カラム名:型] [カラム名:型] ...　
```

```bash:ActiveRecordカラム追加
rails g migration AddUserIdToBestScore user_id:string
```
[ActiveRecordインデックス追加](http://ruby-rails.hatenadiary.com/entry/20140810/1407634200#migration-add-remove-index)

```rb:NOT-NULL設定
class CreateBestScores < ActiveRecord::Migration
  def change
    create_table :best_scores do |t|
      t.integer :score, :null => false
      t.string :user_id, :null => false
      t.timestamps null: false
    end
  end
end
```

```rb:ActiveRecord検索OR
    list = FriendShip.where("user1_id = ? OR user2_id = ?", user, user)
```

```rb:ActiveRecord検索AND
    list = BestScore.where( user_id: uid, stage_id: sid )
    # 一件だけでいい時は
    result = BestScore.find_by( user_id: uid, stage_id: sid )
```
```rb:行追加
    BestScore.create(:user_id => uid, :stage_id => sid, :score => score)
```
```rb:ActiveRecordカラム参照
    result = BestScore.find_by( user_id: uid, stage_id: sid )
    if result != nil then
      result[:score]
    end
```
```rb:ActiveRecordカラム更新
   result[:score] = score
   result.save()
```

## 以下ActiveAdmin
```bash:モデル追加
rails g active_admin:resource Hoge
```
Provisioning Profile のUUIDを調べる


* Xcode を立ち上げる
* メニューから[Xcode] - [Prefarences...] を開く
* Apple ID を選択し、[View Details...] を開く
* 一覧からプロビジョニングプロファイルを選択し右クリック、メニューから[Show in Finder]を選択
* Finderが開き選択されているファイルの名前（拡張子を除いた部分）がUUID
[awk] 配列を二次元配列として使う

# awkにおける多次元配列

awkでは、他言語でよく見かける多次元配列という機能が実装されていません。しかし、一次元配列を工夫すれば、多次元配列として利用することができます。

その方法とは、引数にカンマ区切りで値を複数格納させます。例えば、x[y, z]だと、引数にyとzをとる二次元配列として使えます。

# 入力データ例

```
001 1 yamada
002 3 suzuki
003 5 tanaka
```

# コード例

```
awk '{
    names[$1, $2] = $3;
}
END {
    for (i in names) {
        print i, names[i];
    }
}' test.txt
```

ENDの部分で格納した配列をすべて表示させる処理を行っています。

# 出力結果

```
0023 suzuki
0011 yamada
0035 tanaka
```

# 特定の要素を取得

仕組みとしては、添え字が文字列に変換され、間にセパレータをはさみ一次元配列の引数として解釈されます。

したがって、特定の要素を取得する場合の例は次のようになります。

```
awk '{
    names[$1, $2] = $3;
}
END {
    print names["002", "3"];
}' test.txt
```

この結果、suzukiが出力されます。

ちなみに、文字列間をつなぐセパレータとは、デフォルトで"\034"と決められており、先ほどの例だと、names["002\0343"]という形でアクセスしてもsuzukiという要素が取得できます。

以上、awkで擬似的に多次元配列を使う方法でした。ここでは、二次元配列のみ紹介しましたが、２より大きな次元の配列になっても話は同じです。
gitを使ってみたい

# Git の解説書
[Pro Git 日本語版電子書籍公開サイト](https://progit-ja.github.io/)
[transitive.info: Git 使い方 見出し一覧](http://transitive.info/article/git/)

# ローカルでとりあえず作業ができる程度
+ ローカルリポジトリの作成
`git init`
+ ファイルの状態の確認
`git status`
+ 新しいファイルの追跡
`git add *`
`git add -p`
`git add .`
+ ローカルリポジトリへコミット
`git commit -a`
`git commit -m "**"`
+ コミット後の修正
`git commit --amend`
+ コミット履歴
`git log`
`git log --graph`
`git log -3` 直近３つのログ
`git --no-pager log` ページャを使わない
+ ブランチ作成
`git branch <branch name>`
`git checkout -b <branch name>` 作成と新しいブランチへの切り替え
+ 差分
`git diff`
`git diff --cached`
`git diff --staged`
+ 削除
[git 上のいろんなことをなかったことにする](http://qiita.com/mdstoy/items/6de0aaa06dcd0cc46102)
`git rm`
`git rm --cached` ファイルは残しつつGitでは追跡しない。
`git reset` addした内容を削除
`git branch -d`マージされたブランチを削除
+ ファイルの移動
`git mv file_from file_to`
+ 作業を隠蔽
`git stash` `git stash list` `git stash pop` `git stash drop stash@{1}`

# 設定

```
$ git config --global user.name xxx
$ git config --global user.email xxx@yyy.zz
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.last "show -1 HEAD --stat -p"
$ git config --global core.pager "lv -c -Iu8 -Ou8"
$ git config --global color.ui  true
$ git config --global color.diff true
$ git config --global --list
user.name=xxx
user.email=xxx@yyy.zz
core.editor=vim
core.pager=lv -c -Iu8 -Ou8
alias.st=status
alias.co=checkout
alias.last=show -1 HEAD --stat -p
color.ui=true
color.diff=true
```

```sh:.gitconfig
[user]
        name = xxx
        email = xxx@yyy.zz
[core]
        editor = vim
        pager = lv -c -Iu8 -Ou8
[alias]
        st = status
        co = checkout
        last = show -1 HEAD --stat -p
[color]
        ui = true
        diff = true
```
Slackへ自動投稿するコメントのアイコンを変更してみた

[運営中のPlayer!](https://itunes.apple.com/jp/app/id897872395)のKPI管理として、SlackへのKPI自動投稿を行うようにしたことで、ちらほらカスタマイズしたくなりまして、まずはシンプルにアイコンの変更をしました！

#### 実際の投稿

__デフォルト__
![スクリーンショット 2015-07-01 14.46.28.png](https://qiita-image-store.s3.amazonaws.com/0/58836/1d7b8aed-848c-2b4b-e3c6-352ef4de5155.png)

__カスタマイズ__
![スクリーンショット 2015-07-01 14.46.33.png](https://qiita-image-store.s3.amazonaws.com/0/58836/6795cd63-ee7f-3072-1a4a-b55e1a10593c.png)

__カスタマイズ__
![スクリーンショット 2015-07-01 14.46.38.png](https://qiita-image-store.s3.amazonaws.com/0/58836/91f67673-5993-6a31-d345-22a3d1aa7c27.png)


#### 前回の記事
[スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた](http://qiita.com/abe-perorist/items/dec054e95b473364cae6)


#### 今回のコード


```js:コード.gs
// 共通部分
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: 'Slackのtoken',
  channelId: "SlakckのチャネルのID",
  userName: "botの名前",
  icon_Emoji: ":kissing_closed_eyes:", // この`:kissing_closed_eyes:`部分を自由に変えてください！！
}

var postMessage = function(text) {
  UrlFetchApp.fetch(slack["postUrl"], {
    "method" : "post",
    "payload" : {
      token: slack["token"],
      channel: slack["channelId"],
      username: slack["userName"],
      icon_emoji: slack["icon_Emoji"],  // この部分を追加してください！！
      text: text
    }
  });
}

// 数値元によって変更する箇所
function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[③];

 var dauvalues = sheet.getSheetValues(④)*100;
 var daybeforevalues = sheet.getSheetValues(④)*100;

 var dau = dauvalues.toFixed(⑤)
 var daybefore = daybeforevalues.toFixed(⑤)

 if (  daybefore > 0 ){
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsup: ՞ਊ ՞):thumbsup:");  
 }else{
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsdown: ՞ਊ ՞):thumbsdown:");  
 }
}
```

#### 解説

今回はとてもシンプルで、前回のコードに2行付け加えるだけでオッケーです！

その2行とは、
` icon_Emoji: ":kissing_closed_eyes:",`と`icon_emoji: slack["icon_Emoji"],`です！

そして、アイコンを変更するときは、`:kissing_closed_eyes:`を[EMOJI CHEAT SHEET](http://www.emoji-cheat-sheet.com/)
の中から、自由に選んでいただいたものをコピペして変更してくだされば完了です！
PayPal Express Checkout カスタマイズ方法のまとめページ

WEBサイトにPayPal決済を組み込むAPIソリューションExpress Checkoutですが、
実は様々なカスタマイズが可能で、売り手さんのビジネスに最適化されるようになっています。

API Referenceをくまなく読めばそれらの情報は得られるのですが、以下にカスタマイズのステップがまとめられていました。（英語ですが）

https://developer.paypal.com/docs/classic/express-checkout/integration-guide/ECCustomizing/

ロゴやサイト名のカスタマイズ、
不要なフィールド(配送が不要な場合の配送住所）、
請求先や氏名、メールアドレスのデフォルト入力、
海外に販売しているサイトは、購入者の国をデフォルト設定

などに対応するだけでもカゴ落ち率が減るのではと思います。
OMSA を CLI からサクッとインストールする。 (CentOS 6.x)


DELLのサーバをLinuxで使うときに、管理系のプログラムをサクッとインストールしたかった。

* 作業の対象は DELL PowerEdge R210-II。
* ドキュメントは http://linux.dell.com/repo/hardware/omsa.html を参照


# DELLのOSMAリポジトリを参照するようにする。

現在は付属のDVDでも提供されているが、DVDがついていないサーバもあるので、ネットワーク経由のインストールが便利だ。
DELLの yum repository を参照するように設定をしておく。

```
% wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | sudo bash
```

# 対象のパッケージをインストールする。

必要なパッケージは次の３つ。

* srvadmin-all: Install all OSMA components
* srvadmin-webserver: Install Web Interface
* srvadmin-idrac: Install components to manage the Dell Remote Access Card

インストールは、yum でインストール。

```
% sudo yum install srvadmin-all
% sudo yum install srvadmin-webserver
% sudo yum install srvadmin-idrac
% rehash
```

# 手動起動

/opt/dell/srvadmin 以下にインストールされるので、起動スクリプトを実行する。

```
% sudo /opt/dell/srvadmin/sbin/srvadmin-services.sh start
Starting Systems Management Device Drivers:
Starting dell_rbu:                                         [  OK  ]
Starting ipmi driver:
Already started                                            [  OK  ]
Starting Systems Management Data Engine:
Starting dsm_sa_datamgrd:                                  [  OK  ]
Starting dsm_sa_eventmgrd:                                 [  OK  ]
Starting dsm_sa_snmpd:                                     [  OK  ]
Starting DSM SA Shared Services:                           [  OK  ]
Starting DSM SA Connection Service:                        [  OK  ]
```

無事起動できた。

## コマンドラインツールを使ってデータを取得してみる。

```
% omreport chassis
Health

Main System Chassis

SEVERITY : COMPONENT
Ok       : Fans
Ok       : Intrusion
Ok       : Memory
Ok       : Processors
Ok       : Temperatures
Ok       : Voltages
Ok       : Hardware Log
Ok       : Batteries

For further help, type the command followed by -?
```
※ omreport は /opt/dell/srvadmin/bin 以下にインストールされる。

# Webアクセスインターフェース

https://<IP Address>:1311/ でアクセス可能。ID とパスワードは、root のアカウントを使用する。

![draclogin.png](https://qiita-image-store.s3.amazonaws.com/1866/16682/2ce3c3b8-4b83-7fac-17ed-7abd2d1c02b0.png "draclogin.png")

ストレージの情報もWebで確認することができる。

![2.png](https://qiita-image-store.s3.amazonaws.com/1866/16682/62f7f15e-8812-03b9-f7f9-33f73463a42a.png "2.png")


# 起動設定

ひと通り確認できたら、サーバ起動時にdaemonが自動起動するように設定する。

```
$ sudo /opt/dell/srvadmin/sbin/srvadmin-services.sh start
$ sudo chkconfig --list
...
dataeng         0:off   1:off   2:on    3:on    4:on    5:on    6:off
dsm_om_connsvc  0:off   1:off   2:off   3:on    4:off   5:on    6:off
dsm_om_shrsvc   0:off   1:off   2:on    3:on    4:on    5:on    6:off
dsm_sa_ipmi     0:off   1:off   2:off   3:off   4:off   5:off   6:off
...
```

ということで、これで起動時にdaemonが自動起動される。
Heroku Schedulerを使ってChatworkに定期ポストする


# モチベーション
Chatworkに定期ポストして、簡素なリマインダーにしたくあります。
お金はなるべく使わない方向が嬉しいです。

# 要するに
[Defining Node.js task for Heroku Scheduler - Rafal Spacjer blog](http://www.spacjer.com/blog/2014/02/10/defining-node-dot-js-task-for-heroku-scheduler/)と[ledsun/post-chatwork-message](https://github.com/ledsun/post-chatwork-message)を組み合わせます。

# 手順
## 配置する空プロジェクトを作ります
ディレクトリを作ります。

```
mkdir notyfication-sender
```

gitを初期化します。

```
cd notyfication-sender
git init
```

npmライブラリーを使いたいのでpackage.jsonを作ります。

```
npm init
```

コミットします。

```
git add .
git commit -m "init"
```

## 配置します

herokuにログインします。

```
heroku login
```

アプリケーションを作ります。

```
heroku create notyfication-sender
```

配置

```
git push heroku master
```

## 通知コマンドを作ります

利用するnpmパッケージを追加します。

```
npm install --save post-chatwork-message
```

binディレクトリを作ります。

```
mkdir bin
```

通知コマンドを作ります。

```
cd bin
touch notify
```

次のshebangを指定するとnode.jsのスクリプトが実行できます。

```
#!/usr/bin/env node
```

notifyコマンドの中身は次のようになります。

```
#!/usr/bin/env node
var postChatworkMessage = require('post-chatwork-message')
var APIKey = 'YOUR_API_TOKEN',
roomId = 'TARGET_CHATROOM_ID'

postChatworkMessage(APIKey, roomId, 'hello world')
```

試しに実行します。

```
node notify
```

指定したチャットルームに通知ができれば成功です。


## 通知コマンドを配置します

```
git add .
git commit -m "Code for scheduler task"
git push heroku master
```

試しに実行してみます。notyfication-senderディレクトリで次のコマンドを実行します。

```
heroku run notify
```

指定したチャットルームに通知ができれば成功です。

## スケジューラーを設定します

herokuのアドオンを追加します。notyfication-senderディレクトリで

```
heroku addons:create scheduler:standard
heroku addons:open scheduler
```

次の画面が開きます。

![スクリーンショット 2015-07-01 11.25.25.png](https://qiita-image-store.s3.amazonaws.com/0/15964/020a9088-cd7b-fb59-17ab-a062766dfed5.png "スクリーンショット 2015-07-01 11.25.25.png")


`Add new job`をクリックします。

コマンド名に`notify`を、FREQUENCYを`Every 10 minutes`に設定します。

![スクリーンショット 2015-07-01 11.27.28.png](https://qiita-image-store.s3.amazonaws.com/0/15964/55254f75-31a3-ebf0-a8fb-3b08e2aa094e.png "スクリーンショット 2015-07-01 11.27.28.png")

`Save`ボタンをクリックします。

10分毎にチャットルームに通知がくれば成功です。
動作確認ができたら、不要になったjobは削除しましょう。