OmniAICreator/Qiita-1.07M huggingface dataset:
Zybo > Chronicles blog 17 > TTC > Triple Timer Counter > You can use these TTCs as timers or to output waveforms on the Zynq SoC’s EMIO or MIO pins. 

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-One-Adam/ba-p/407537

> You can use these TTCs as timers or to output waveforms on the Zynq SoC’s EMIO or MIO pins. 

ユーザガイド UG585 Figure 8-3にTTC関連のBlock Diagramが書かれている。

出力(Wave-Out)として MIO / EMIO が選択できる。

また、設定によって、GICへのInterrupt出力をできる。
コピペしてすぐ確認できるHaskellの条件分岐

# はじめに
この記事は、[Haskell で条件分岐](http://qiita.com/rooooomania/items/1623e5b981a30fbc8427)を元に作成しています。
簡潔でわかりやすいリンク元様に感謝:relaxed:しつつ、こちらでは、コピペしてそのまま確認できるものを用意してみました。

# case
- 単純なcase文

```hs
foo n =
  case n of
    0 -> 0
    1 -> 1
    _ -> -1
```

- ガード条件付きcase文

```hs
foo n =
  case n of
    0 -> 0
    1 -> 1
    _  | n < 0     -> -1
       | otherwise -> error "out of range!"
```

またパターンマッチでは、それぞれ以下のように書くこともできます。

```hs
foo 0 = 0
foo 1 = 1
foo n = -1
```

```hs
foo 0 = 0
foo 1 = 1
foo n
  | n < 0     = -1
  | otherwise = error "out of range!"
```

# if

- 単純なif文

```hs
foo n =
    if n >= 0
      then "true"
      else "false"
```

- else内でさらにif文分岐

```hs
foo n =
    if n < 0
      then "negative"
      else if n > 0
        then "positive"
        else "zero"
```
# ガード
```hs
foo n
  | n < 0     = error "fibo out of range"
  | n < 2     = 1
  | otherwise = foo (n - 1) + foo (n - 2)
```
ちなみに上記はフィボナッチ数列です。[^1]

# ifをcaseに変換する
```hs
foo b =
  case b of
    True  -> 1
    False -> 0
```

# ガードを case に変換する
```hs
foo n = 
  case n of
    _  | n < 0     -> error "fibo out of range"
       | n < 2     -> 1
       | otherwise -> foo (n - 1) + foo (n - 2)
```

[^1]: 参考：http://www.geocities.jp/m_hiroi/func/haskell03.html
Ubuntu16.04 (Unity7)の環境設定をcliで設定

## コツ

```bash:設定前
gsettings list-recursively > before.txt
```

`システム設定`にてポチポチ変更する

```bash:設定後
gsettings list-recursively > after.txt
```

```bash:差分を確認
diff before.txt after.txt
```

* その他、[Github](https://github.com/search?q=dconf+write+%2Forg%2Fgnome%2Fsettings-daemon%2Fplugins%2Fmedia-keys&type=Code&utf8=%E2%9C%93)で検索するとよい。

## キー設定

* 要: Xorg

```ruby:change_settings.sh
# ウィンドウサイズの変更をAlt+右クリックに変更
gsettings set org.gnome.desktop.wm.preferences resize-with-right-button true

# AltキーでHUBが表示されるのを無効化
gsettings set org.compiz.integrated show-hud "['']"

# win+Enterで端末起動
dconf write /org/gnome/settings-daemon/plugins/media-keys/terminal "'<Super>Return'"

# win+eでnautils起動
dconf write /org/gnome/settings-daemon/plugins/media-keys/home "'<Super>e'"

# 日付も表示
gsettings set com.canonical.indicator.datetime show-date true

# ロックしない
gsettings set org.gnome.desktop.screensaver lock-enabled false

# 画面をオフにする時間(1時間)
gsettings set org.gnome.desktop.session idle-delay 3600

# キーリピート速度
gsettings set org.gnome.desktop.peripherals.keyboard delay 300
gsettings set org.gnome.desktop.peripherals.keyboard repeat-interval 25

# win+w
gsettings set org.gnome.settings-daemon.plugins.media-keys www '<Super>w'
# win+t
gsettings set org.gnome.settings-daemon.plugins.media-keys email '<Super>t'

# 端末でアクセラレーターキーを有効にする(Alt+Eで編集を開くなど)
gsettings set org.gnome.Terminal.Legacy.Settings mnemonics-enabled true

# Vinoのvnc接続用 (TLS無効化。gvncviewerを使えば設定不要)
gsettings set org.gnome.Vino require-encryption false
```

## その他メモ

| 項目| key |
|:--|:--|
| 画面キャプチャ(範囲指定) | Shift + PrintScreen |
| 画面キャプチャ(現在のウィンドウ) | Alt + PrintScreen |
| 画面のロック | Control + Alt + L |
技術英語 > We have done this several times over the course of this blog so it should be [second nature] to you now.

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 1816/2129

> We have done this several times over the course of this blog so it should be <font color=red>second nature</font> to you now.

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1113886581

> Second natureとは毎日の習慣などで頭を使わなくても身についてしまっているような感覚です。たとえば毎日仕事で電卓を使っていてブラインドタッチでキーが押せるのはSecond natureです。

VoyagerでNeelixがTuvokに対して言っていたのは覚えているが、どういう場面だったかは忘れた (lapse of memory)。

<hr>
記憶の種類で自転車の乗り方などの「手続き記憶」という定義があるが、それと関係あるのだろうか。
CentOS7.0でカーネルパニックを発生させてみる

既に色々記事がありますが、実際に手を動かしてやってみたのでメモ。

# 参考

+ [逆引きUNIXコマンド/Linuxでカーネルパニックを発生させる方法](http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/Linux%E3%81%A7%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%91%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E7%99%BA%E7%94%9F%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95.html)
+ [Linuxのカーネルパニック](http://aozorlinux.exblog.jp/9365765/)

# 環境

+ CentOS Linux release 7.0.1406 (Core)
+ VirtualBox 5.0.4
+ Vagrant

# そもそもカーネルパニックとは

[カーネルパニック](http://www.sophia-it.com/content/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%91%E3%83%8B%E3%83%83%E3%82%AF)

>カーネルパニックとは、オペレーティングシステム（OS）のカーネル部分において、何らかの理由で致命的なエラーが発生し、安全に復旧することができなくなった状態のことである。
カーネルパニックが発生すると、OSは完全に停止してしまい、強制終了を行って再起動する以外に対応方法がなくなる。
カーネルパニックは主にUNIX系OSにおいて用いられる表現であるが、UNIXから派生したLinux系OSやMac OS Xにおいても、同上の状況をカーネルパニックと呼ぶことがある。Windows系OSでは、同様の状況はブルースクリーンと呼ばれることが多い。

Linuxで実際にカーネルパニックが発生したことを見たことはないのですが、Windowsのブルースクリーンだと見たことがあります。

OSは完全に停止し、強制終了を行って再起動する以外の方法がなくなると。では以下より実際に色々触ってみたいと思います。

# カーネルパニックを発生させる

以下でカーネルパニックを発生させることができます

```bash
$sudo sh -c "echo c > /proc/sysrq-trigger"
```

上記をsshログインしているVM上で実行すると、 恐らくOSが停止してしまい、Ctrl+Cなどを実行して反応がなくターミナルを削除せざるをえなくなりました。
なお、上記の状態でVirtualBoxを見ると仮想マシンの状態はrunningとなったままです。ただし、再度ターミナルからsshによるリモートログインを試みてもエラーとなってしまいます。

再起動によって事象改善が見込める場合もあるということでOSの再起動をします。

```bash
$vagrant reload
```

再起動完了後は無事sshログインができるようになりました。

# カーネルパニック発生時に再起動するようにする

デフォルトの状態ではカーネルパニック発生時に何も起きず、利用者側で明示的に再起動を行う必要があります。
上記についてカーネルパラメーター(kernel.panic)を設定することでカーネルパニック発生時に自動的に設定した秒数後に再起動する事が出来るとのことなのでやってみます。

まずは、現在の設定を確認します。

```bash
# ファイルでkernelパラメーターを確認
$cat /proc/sys/kernel/panic
0

# sysctlコマンドでkernelパラメーターを確認
$sysctl kernel.panic
kernel.panic = 0
```

上記の値を0より大きい値で設定すると設定した秒数後に再起動します。

## 一時的に設定する

以下のコマンドで一時的にカーネルパニック時の再起動を設定できます。一時的とは今起動しているOSが再起動するまでで、再起動した場合には設定が無効化されています。

```bash
# 設定
$echo 5 > /proc/sys/kernel/panic

# 確認
$cat /proc/sys/kernel/panic
5
$sysctl kernel.panic
kernel.panic = 5
```

設定ができてそうなので、同じ方法でカーネルパニックを発生させてみます。
今度はsshで確立していた通信のコネクションが切断され、VirtualBoxの画面を見ているとどうやら再起動していることも分かりました。

少し時間を待ってからsshログインを試みると無事ログインができました、

また、`/var/log/boot.log`についても追記がされており、再起動したことが確認できました。

なお、カーネルパラメーターを確認すると設定が元に戻っていることも確認できます。

```bash
$cat /proc/sys/kernel/panic
0

$sysctl kernel.panic
kernel.panic = 0
```

## 恒久的に設定する

sysctlコマンドや/proc/sys/kernle/panicファイルによって設定した場合一時的な設定となるため、恒久的な設定が必要です。

以下のファイルを変更した対応します。

```/etc/sysctl.conf
kernel.panic = 5
```

また、上記はreboot後に有効かとなるため、明示的に設定を行います。

```bash
# 設定が反映されていない
$sysctl kernel.panic
kernel.panic = 0

# 反映
$sysctl -p

#確認
$sysctl kernel.panic
kernel.panic = 5
```

この状態で再度カーネルパニックを発生させます。
先ほどと同じようにVMが再起動し、sshログインができるようになった後、カーネルパラメーターを確認してみます。

```bash
$sysctl kernel.panic
kernel.panic = 5
```

今度は無事設定内容がreboot後も設定されていました。
el capitan の osascript には " -l JavaScript" と言語指定するとプロトコルを認識しないバグがある？

```js:objc-sandbox.js
ObjC.registerSubclass({
    name: "Delegate",
    superclass: "NSObject",
    protocols: ["NSApplicationDelegate"]
})
```

上記コードを言語指定オプション付きで実行するとプロトコルが存在しないというエラー。

```
$ osascript -l JavaScript objc-sandbox.js
objc-sandbox.js:0:23: execution error: Error on line 1: Error: protocol does not exist (-2700)
```

言語指定なしで実行すると問題なくプロトコルを認識する。

```
$ osascript objc-sandbox.js
```

`osascript`は`.js`拡張子のテキストファイルをJavaScriptコードとして自動認識し実行するようなので言語指定しなければ実質問題はないようだ。
emacs 24にjediを入れる

emacsに、pythonの補完システムであるjediを入れる。ネット上にたくさん情報があるはずなのに１時間以上戦う羽目になったのでメモ。

参考ページ
[[python] macにemacs24 + jediをインストールしてみた](http://hungry-bros.com/archives/893)
[emacsのjediパッケージの使い方](http://hiroom2.jimdo.com/2015/09/20/emacs%E3%81%AEjedi%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)

# emacsのバージョン
ここで書くやり方はMELPAのpackage-installに依存するので、emacs 24 が推奨されます。
（一応emacs 23でもMELPAをつかえる方法があるっぽいけど、割愛します）

# MELPA
以下をinit.elに追加。

```el
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(when (< emacs-major-version 24)
  (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
(package-initialize)
```

# M-x package-install
公式HPには``M-x package-install RET jedi RET``でいけるよ！って書いてあるが（RETがEnterの意味だっていうことも途中で気づいた）、
初めてMELPAとかELPAとか使う人は`M-x package-list-packages`しないとpackage-listが更新されず、見つけられないっぽい（？）

というわけで、`M-x package-list-packages`してから`M-x package-install RET jedi RET`しましょう。もしくはpackage-list-packagesから直接インストールね。

# 後処理
利用しているpythonの環境にvirtualenvを入れて、
init.elに以下を追加。

```el
(require 'jedi)
(add-hook 'python-mode-hook
          '(lambda()
             (jedi:ac-setup)
             (setq jedi:complete-on-dot t)
             (local-set-key (kbd "M-TAB") 'jedi:complete)))
```

ここまで完了したら、最後に``M-x jedi:install-server``をすればおっけー、、、のはず。
WordPressでウェブシステムを作る時によく入れているプラグイン

# 

| プラグイン名 | 説明 |
|:----------------------------|:------------------------------------|
| Add Page From Template | テンプレートから固定ページを作成するプラグイン。中規模ぐらいになると各種環境でDBに固定ページを作成するのが大変なので。|
| Advanced Custom Fields (ACF) | カスタムフィールド周りをいじるならこれ。|
| Advanced Custom Fields Pro (ACF Pro) | 上記ACFの有料版。繰り返し項目が便利。これだけでちょっとしたシステム化ができちゃう。オプションページも何気に便利。|
| Akismet | 運用開始後にお客さんからスパムのことで相談を受ける事が多いので先に入れる。 |
| BackWPup | バックアップ。プリフィクス指定でバックアップできるので便利。 |
| Custom Post Type Permalinks | カスタム投稿タイプのシングルをpost_idで運用する際に。 |
| Custom Post Type UI | カスタム投稿タイプを作る時はこれ。古くからあるプラグインで便利だけど、間違えてslugを日本語で作ったりすると困る。 |
| Debug Bar | デバッグバー。他のデバッグバープラグインと組み合わせて使う。 |
| Debug Bar Actions and Filters Addon | アクションフックとフィルターを調べる事が出来る。挙動がおかしいな、というときはこれで調べることができる。 |
| Debug Bar Console | PHPとMySQLをデバッグバーで使える。一見すると便利そうだけど、でもちゃんと開発するときはsshとmysqlを繋いでいることがほとんどなので意外に活躍の場は少ない。 |
| Debug Bar Rewrite rules | リライトルールを一覧で見ることができる。`global $wp_rewrite; var_dump($wp_rewrite);` って書かなくて便利。 |
| Duplicate Post | 記事の複製。開発、運用ともに重宝。開発時にはテストデータを作成するためによく使う。 |
| Jetpack | ジェットパック。アクセス数の多いサイトではPhotonを重宝。すごいプラグイン。ただしシステム的には勝手に色々と有効化されると困る機能も有るので注意。ログイン画面が変わってお客さんから苦情が来たり。 |
| Post Type Switcher | カスタム投稿タイプを変更できる。開発時の仕様変更でカスタム投稿タイプを新設した際などに。ただし大量の変更は無理なのでSQLを発行。|
| Show Current Template | 現在利用しているテンプレートを表示。テンプレートヒエラルキーに従ってちゃんと表示されているかの確認。|
| WP Multibyte Patch | いつも入れているけどあまり恩恵を理解していない。でもとにかく入れている。 |


# インストール用ワンライナーのメモ

```bash
$ wp plugin install add-page-from-template codepress-admin-columns backwpup db-prefix-change custom-post-type-rewrite custom-post-type-ui custom-post-type-widgets debug-bar debug-bar-actions-and-filters-addon debug-bar-console fg-debug-bar-rewrite-rules duplicate-post  wp-multibyte-patch --activate
```
bakeの観点からのcakephp2と3の違い

## MVC全てをbakeする
### cakephp2
なし？

### cakephp3
```
cake bake all モデル名
cake bake all --everything # 全てのモデルの場合
```

## adminのbake
### cakephp2
bake中にインタラクティブに指定

### cakephp3
```
./cake bake モデル名 --prefix admin
```

## adminルーティングの有効化
### cakephp2
app/config/core.phpの次の行のコメントを外す：

```
Configure::write('Routing.prefixes', array('admin'));
```

### cakephp3
次の3行をconfig/routes.phpに追加する：

```
Router::prefix('admin', function ($routes) {
  $routes->fallbacks(DashedRoute::class);
});
```

## テーブルにおける、primary keyの指定
### cakephp2
任意

### cakephp3
必須
What's new in the Support Library(Google I/O 2016)メモ

プロダクトで使いやすくて大好きなSupport Libraryなのでメモとして残しておきます。
抜けているところがあると思いますのでご指摘お願いします。
**驚いたところを太字にしておきます。**
動画はここにあるのでこれを見れば間違いないです
https://www.youtube.com/watch?v=w45y_w4skKs


# v4 Support Library

**FragmentにcommitNow() 24.0で追加
同期的にFragmentのtransactionが可能**
(ライフサイクルで悩まされにくくなるかも？)
詳細は what the fragmentのセッションで説明があるようです。

NotificationCompat.MessagingStyle 24.0で追加
(API Level 18からNotificationListenerServiceを使った面白い機能も追加されて使える？）

**NotificationManagerCompat.areNotificationsEnabled()がAPI 19から利用できる(ユーザーが通知をブロックしているか取得できる)**
一応通知を出すアプリはどの程度ブロックされているのか見ておく良さそうですね。


MediaBrowserServiceCompatとMediaBrowserCompat 23.2で追加
音楽の再生などができる。Compatibilityがあるので便利そう(ちょっと良くわかっていません)
Universal Android Music Playerで使っているのでサンプルによい
https://github.com/googlesamples/android-UniversalMusicPlayer

# Custom Tab 
24.0で改善
Minimum SDK:15
アプリ内WebViewの代わりに使え、ページ内にいるかのようにChromeなどで開くことができる
コンテンツのプリロードができるので一瞬で開いたりできる
良くないところとして、メモリが足りないと消えたりする
**FireFoxなど他のブラウザでもカスタムタブが開けるようになる**
ToolbarやBottomBarの設置などUIカスタマイズなどが可能

# VectorDrawable
ベクトル画像が利用できる
Android StudioによるサポートとSupportLibraryによるサポートが有る
SupportLibraryによるサポートはbuild.gradleに明示的に書く必要がある
apkサイズが小さくできる

StateListDrawbleなどでVectorDrawableを利用できる機能はメモリの問題がある
それを許容して23.4.0で利用できる
以下をActivityに書くことで許容する

```java
static {
 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
```


# NightMode
NIGHT_MODE_AUTOで自動で昼と夜でUIを切り替えできる

# **ColorStateLists**
24.0で追加
**selectorで色を指定できる
Viewがdisableになっている時に色を使って透明度を入れるといったことができる**
これ欲しかったやつです。
プログラムでは以下で取得

```java
AppCompatResources.getColorStateList(getContext(), R.color.tint_nomal);
```

AppBarLayoutの閉じている時と、開いている時のElevationがStateListAnimatorを使って制御できるようになった

# 今後
Support v4のminmumSdkVersionを上げるかもしれない
Support v4をsupport-fragmentやsupport-mediaなどに分割する
Pepper SDK for Android Studioを使ってみた

Pepper SDK for Android Studio（ベータ版）が昨日発表されましたね！
これによって、Android向け開発者の方も容易にロボアプリが開発可能となるわけですが、
Choregrapheの立ち位置ってどうなっていくんでしょうか…。

ということはさておき！
ひとまずはお決まりの`Hello world!`までやってみたいと思います！


導入は[こちら](https://android.aldebaran.com/doc/installation.html)を参考にしていきます。

##準備
###環境
- Android Studio 2.1 Beta2（version1.5以上あれば大丈夫です）

Android Studio がインストールされていない場合は[こちら](https://developer.android.com/studio/index.html)へ。
されている場合は、

- Android SDK version 5.1.1 (API 22, Lollipop)-
- SDK Build-Tools22.0.1

を追加しておきましょう。


###Pepper SDK Plugin
Pepper SDKを入れましょう。
`Preferences... > Plugins > Browse repositries... `と進み、検索欄にPepperと打つとPluginが出てくるので、インストールします。

![スクリーンショット 2016-05-19 23.32.46.png](https://qiita-image-store.s3.amazonaws.com/0/92359/a63cbe01-8414-05c6-4335-326acb105b61.png "スクリーンショット 2016-05-19 23.32.46.png")

再起動すると、Android Studioのメニューにアイコンが追加されました。

![スクリーンショット 2016-05-20 0.11.05.png](https://qiita-image-store.s3.amazonaws.com/0/92359/bc46e2fc-3902-d4e6-455c-d0b0acf66c87.png "スクリーンショット 2016-05-20 0.11.05.png")

###Robot SDK and tools
Pepper SDKのインストールが終わったら、追加されたアイコンをクリックすると以下の画面が出てきますので、
`Apply`を押してダウンロードしましょう。（時間がかかりますので気長に待ちましょう）

![スクリーンショット 2016-05-19 23.53.32.png](https://qiita-image-store.s3.amazonaws.com/0/92359/e07d6bf2-3966-0c3f-4b0d-734dbe46f068.png "スクリーンショット 2016-05-19 23.53.32.png")


##ロボットアプリ
[Creating Robot Project](https://android.aldebaran.com/doc/create_project.html#create-project)を参考に進めました。

###プロジェクト作成
`File > New > New Project` でプロジェクトを作成します。
デバイス選択は Phone and Tablet、Android 5.1を選択しました。

作成後、`File > New > Robot Application`を選択すると、Pepper関連のアイコンが使用可能となります。

###Hello, world!
ロボットに「Hello, world!」としゃべらせるには、たったこれだけでOKです。

```java:MainActivity.java
import android.app.Activity;
import android.os.Bundle;

import com.aldebaran.qi.sdk.object.interaction.Say;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Say say = new Say(this);
        say.run("Hello world!");

    }

}
```

###実行
実行方法は[Run & Debug](https://android.aldebaran.com/doc/run_debug.html#run-debug)に書いてありました。

Emulatorの設定を変更する必要があります。

1. `robot app > Edit Configurations...`を選択
	![スクリーンショット 2016-05-20 2.01.46.png](https://qiita-image-store.s3.amazonaws.com/0/92359/c982f78c-5eef-d5dd-a2ce-4eb581b83317.png "スクリーンショット 2016-05-20 2.01.46.png")


2. AVD Options	を x86 / GPU（チェック）に設定
3. Apply


ここまでできたらあとは実行するだけ！
`robot app`してちょっと待つと…

デフォルトで設定されていたNAOが「Hello,world!」としゃべりました。

![スクリーンショット 2016-05-20 1.51.49.png](https://qiita-image-store.s3.amazonaws.com/0/92359/d73e8c30-c29e-8181-21b4-9fed77e3b07d.png "スクリーンショット 2016-05-20 1.51.49.png")


##まとめ
これまではChoregrapheで動かしていたPepper(NAO)を、Android Studioからもあっさり動かすことが出来ました。
チュートリアルまでほとんど詰まることなく出来たので、ぜひ試してみてください。


##参考
[Pepper SDK for Android](https://android.aldebaran.com/doc/index.html)
3行のソースコードを入れるだけで機械学習できると噂のindicoをNode.jsで使って機械学習入門してみる


こんばんわ。
機械学習というワードはすごく盛り上がっているけど少し離れたところで見ている感じでした。

![](https://i.gyazo.com/86431db1c19bffa31b602e7bfe45cadb.png)

[づや会](http://lig.connpass.com/event/30420/)というイベントで機械学習ネタをやることになり、何かやらねばと思っていたところ、この記事([機械学習について調べてみたら、3行のソースコードを入れるだけで機械学習できるサービスがあった（前編）](http://liginc.co.jp/275684))を読んで機械学習の入門はこういうところからでもありかなと思った次第です笑

ちなみに発表資料は[こちら](https://speakerdeck.com/n0bisuke/ji-jie-xue-xi-deben-dang-falsetubuyaki-duyahui-vol5-ji-jie-xue-xi-falsehua-number-liginc-10fen)です。

## indico

![](https://i.gyazo.com/05fb28a3f5e7c15f7b9d2b2b25204ffc.png)

`3行のソースコードを入れるだけで機械学習できるサービス`です。

主に`テキスト解析`と`画像解析`の機能を使えます。

### 使い方(主に管理画面)

* まずはユーザー登録をしてログインしてください。
* ログインするとダッシュボードを見ることができます。

![](https://i.gyazo.com/feca141dd78c6177a3edbd97acda4313.png)

* API Keyを確認しつつ`Quickstart`を選択しましょう。

このように`Sentiment Analysis(感情分析)`が選択されています。

![](https://gyazo.com/4edb6709b2a04fbef144aab86efda683.png)

* 下部で`Sentiment Analysis(感情分析)`のデモがあるので確認しましょう

![](https://i.gyazo.com/0419081b28674acc6c7a5a28b0b3722f.gif)
>指定したテキストのポジティブ具合を数値で出してくれます。

なるほど...
こういうの全然使ったことなかったので新鮮です。

## 3行で機械学習
Pythonだとまじで3行で処理できちゃいます。

```app.py
import indicoio
indicoio.config.api_key = 'API KEY'
indicoio.sentiment_hq("I love writing code!")
```

### Node.jsから使ってみる

僕はほぼほぼNode.jsなのでNode.jsで使ってみます。

まずはindico.ioをインストールしましょう。

> https://www.npmjs.com/package/indico.io

```bash
$ npm i indico.io
```

以下のコードで簡単に感情分析を行えます。

```app.js
var indico = require('indico.io');
indico.apiKey =  'API KEY';

var response = function(res) { console.log(res); }
var logError = function(err) { console.log(err); }

// single example
indico.sentimentHQ("I love writing code!")
  .then(response)
  .catch(logError);
```

実行します。 `I love writing code!`という文字列のポジティブ具合を

```
$ node app
0.676276445388794
```

これで`I love writing code!`は`67%`のポジティブということが分かりました。

同様に文字列を`I'm tired`と入れて実行すると`32%`とだいぶネガティブな表現ということが分かり、 `Delicious kebabs` (->ケバブおいしい)と入れて実行すると`97%`とかなりポジティブな表現ということが分かります。

## 画像解析も使ってみる

`indico.~~`でテキスト解析や画像解析の色々な機能が使えます。
どんなメソッドがあるからは[ドキュメント](https://indico.io/docs)を確認しましょう。

けっこうたくさんAPIがあるので色々試してみたいですね。

* contentFiltering

`contentFilteringメソッド`は画像のフィルター機能を提供してくれます。

![](https://i.gyazo.com/52cd1a37f10ef2e076e127abcef5a317.gif)

こんな感じで18禁画像かどうかを判定してくれます。

`contentFiltering()`の引数に画像のパスを記載すると判定してくれます。

```app.js
/*省略*/

indico.contentFiltering("http://hogehgoe.com/hogehoge.png")
  .then(response)
  .catch(logError);
```

```bash
$ node app.js
0.9999968409538269
```

ちなみにこのプログラムを実行したときの写真は18禁画像でしたね笑

## まとめ

こんな感じでindicoを使うとサクッと機械学習を利用することができました。

今回は簡単なAPIの使い方をやりましたが、どんなところで使うかって部分ももっと考えていきたいですね。

![](https://i.gyazo.com/159d75fbaed299bea3e2a0cf87c3f7a8.png)

> [本当のつぶやきで機械学習](https://speakerdeck.com/n0bisuke/ji-jie-xue-xi-deben-dang-falsetubuyaki-duyahui-vol5-ji-jie-xue-xi-falsehua-number-liginc-10fen)
Flaskとtensorflowとherokuで「hello world」を動かしてみた


Flaskというpythonの小規模なフレームワークとtensorflowを利用して
herokuで「hello world」を動かしてみました！

## 参考url

Flask を触ってみる + Heroku で動かす
http://qiita.com/sqrtxx/items/2ae41d5685e07c16eda5

TensorFlowで Hello Worldを動かしてみた&その解説
http://dev.classmethod.jp/machine-learning/tensorflow-hello-world/

TensorFlowでのMNIST学習結果を、実際に手書きして試す
http://d.hatena.ne.jp/sugyan/20151124/1448292129

## やったこと
- とりあえずローカル環境で動かしてみる
	- 開発ディレクトリを作成と移動
	- tensorflow をアクティベート
	- Flask のインストール
	- インストールされてるパッケージを確認
	- hello.py を作る
	- ローカルで実行する


- herokuにあげてみる
	- Procfile を用意する
	- requirements.txt を用意する
	- .gitignore を作る
	- herokuにデプロイ
	- webページを開く

## 前提（自分の環境）

OS X IE Capitan 10.11.4

- python 2.7.10
- tensorflow 0.6.0

をインストール済み


## とりあえずローカル環境で動かしてみる

### 開発ディレクトリを作成と移動

	$ mkdir tensorflow-hello
	$ cd tensorflow-hello
	

### tensorflow をアクティベート

	$ source ~/tensorflow/bin/activate


### Flask のインストール

	$ pip install Flask


### インストールされてるパッケージを確認

	$ pip list


### hello.py を作る

```hello.py

# hello.py

import tensorflow as tf
import multiprocessing as mp

from flask import Flask

app = Flask(__name__) 

@app.route('/')
def hello_world():
	core_num = mp.cpu_count()
	config = tf.ConfigProto(
	    inter_op_parallelism_threads=core_num,
	    intra_op_parallelism_threads=core_num )
	sess = tf.Session(config=config)
 
	hello = tf.constant('hello, tensorflow!')
	return sess.run(hello)

if __name__ == '__main__':
	app.run()


```
	
### ローカルで実行する

	$ python hello.py
	* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

http://127.0.0.1:5000/
にアクセスしてみると

![スクリーンショット 2016-05-19 23.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/64452/f9217c50-bd70-7ef0-fb3d-d3a013592ead.png "スクリーンショット 2016-05-19 23.31.59.png")

こんなかんじになった！はろー！



## herokuにあげてみる

### Procfile を用意する

```Procfile
web: gunicorn hello:app --log-file -
```

### requirements.txt を用意する

requirements.txt を書き出して

	$ pip freeze > requirements.txt
	
そのあと

	https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

をファイルの最後に追加する

ちなみに自分のrequirements.txtはこんなかんじになった

```requirements.txt

Flask==0.10.1
gunicorn==19.4.5
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
Werkzeug==0.11.9
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

```



### .gitignore を作る

```.gitignore

*.pyc
*.pyo
tensorflow-hello

```

### herokuにデプロイ

	$ git init
	$ git add .
	$ git commit -am "tensorflow hello"
	$ heroku apps:create tensorflow-hello
	$ heroku buildpacks:add heroku/python
	$ git push heroku master


### webページを開く

	$ heroku open


![スクリーンショット 2016-05-19 23.39.57.png](https://qiita-image-store.s3.amazonaws.com/0/64452/27059888-7ff4-0f87-2abd-ec2253f2b1e4.png "スクリーンショット 2016-05-19 23.39.57.png")



herokuの環境でも実行できました！
学習させたりといったことには向いてないと思いますが
判別させたりするのになどには使えるのではないかなと思ってやってみました。

何かご指摘等あれば頂けると嬉しいですmm
git commit 時に Emacs.app を起動しない方法

# 問題

Homebrew で emacs 24.5 をいれたところ、git commit 時にターミナルから Emacs.app が起動されるようになった。

毎度別アプリケーションが開くのはわずらわしいからターミナル内で済ませたい。
alias 設定して emacs たたいても emacsclient を呼ぶようにしていたが、git commit 時には効いてない模様。

# 解決

.gitconfig に emacs ではなく emacsclient を指定。

```
[core]
  editor = emacsclient
```

快適。

# 参考
[MacにHomebrewでEmacsを導入＆便利なエイリアスで起動速度UP](http://vdeep.net/mac-homebrew-emacs)

# 追記（2016/08/18）

上記設定だと、コミット時に revert 確認される時がある。
（ないときもあるのがよく分からない）

以下の様な設定だと解消されることを確認。
正直 emacs の設定がまだ理解しきれてないので、もう少し検証したい。
ちなみに -nw は別ウィンドウを開かずに emacs を利用するオプション。

```
[core]
  editor = emacs -nw
```
pyenv 環境の Django コマンドを cron で動かす


ちょっとハマったのでメモ。

/var/www/example 以下に pyenv 環境が適用される状況

```bash
cd /var/www/example
pyenv local example
```

crontab を編集

```bash:/etc/crontab
BASE_DIR=/var/www/example

* * * * * user cd $BASE_DIR/myapp && /usr/local/pyenv/shims/python manage.py command
```

python のパスは `which python` で調べる
左辺のマイナスを右辺でプラスしても同値にならない日付計算

Dateのインスタンス同士で加減算してしまうと数値になってしまうので気をつけましょうという話。

```.rb
pry(main)> Date.new(2015,3,31) - Date.new(2014,4,1) == 1.year - 1.day
# => false
pry(main)> Date.new(2015,3,31) == Date.new(2014,4,1) + 1.year - 1.day
# => true
```
Cocoapods 1.0.0で注意すること

#はじめに
Cocoapodsが5月10日に1.0.0をリリースしました。
そこでチーム開発をしていたプロジェクトでエラーが発生したので、共有いたします。

#エラー内容
Cocoapodsにターゲット指定が必要になりました。
これまでPodfileは以下のように記載していました。

```rb:Podfile
platform :ios,'9.0'
use_frameworks!
pod 'SwiftDate'
pod 'SlideMenuControllerSwift'
pod 'Firebase/Core'
pod 'Firebase/Messaging'
pod 'Firebase/Database'
pod 'Firebase'
pod 'Firebase/Auth'
```

これでFirebaseがアップデートされたことでpodのほうもアップデートしようと、```pod update```のコマンドを打ったところ以下のようなエラーが表示されてしまいました。

```
[!] The dependency `SwiftDate` is not used in any concrete target.
The dependency `SlideMenuControllerSwift` is not used in any concrete target.
The dependency `Firebase/Core` is not used in any concrete target.
The dependency `Firebase/Messaging` is not used in any concrete target.
The dependency `Firebase/Database` is not used in any concrete target.
The dependency `Firebase` is not used in any concrete target.
The dependency `Firebase/Auth` is not used in any concrete target.
```

つまり、どのターゲットでもpodが使われていませんよと

#エラー対策
そこでターゲット指定を行いました。
Podfileにおいては、Podは以下のような形式でターゲットを指定します。

```rb
platform :ios,'9.0'
use_frameworks!
target 'ターゲット先(プロジェクト名やプロジェクトのテスト名)' do
# ここでpod 'hoge'と記載する
end
```

今回ではこのようにしました。

```rb:Podfile
platform :ios,'9.0'
use_frameworks!
target 'ターゲット先(プロジェクト名やプロジェクトのテスト名' do
pod 'SwiftDate'
pod 'SlideMenuControllerSwift'
pod 'Firebase/Core'
pod 'Firebase/Messaging'
pod 'Firebase/Database'
pod 'Firebase'
pod 'Firebase/Auth'
end
```

#このようなことを防ぐために
ターゲットやオプション(platform指定など)を手書きするのは、ミスが起こりやすいですし、なにより面倒くさい。そこで、Cocoapodsには```pod init```という便利なコマンドが用意されていますので、かならず使いましょう。
```pod init```を打つことで、Podfileが自動で生成され、さまざまなオプションもコメントアウトの形で提供されるので、絶対に使いましょう。

以下が、```pod init```を打つことで生成されるPodfileです

```rb:Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

target 'Sample' do
  # Comment this line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for Sample

  target 'SampleTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'SampleUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

```

今回はSampleという名前のプロジェクトで```pod init```を行いました。
Kotlinで20行でDIコンテナを書いた


社内の勉強会で、[matzがruby20行でDIコンテナを書いた話](http://www.rubyist.net/~matz/20091003.html)が話題になり、kotlinで実装してみました。
現状の実装だとすべてSingletonとなってしまいますが、シンプルさを優先ということで。

ソースを[yamamotoj/DISample](https://github.com/yamamotoj/DISample)においておきます。


# DIコンテナ本体

```kotlin:DIContainer.kt

class DIContainer {
    private class Item<T : Any>(val resolver: (DIContainer) -> T) {
        private var instance: T? = null
        fun resove(container: DIContainer) =
                instance ?: resolver(container).apply { instance = this }
    }

    private val items = mutableMapOf<String, Item<out Any>>()
    private fun <T> createKey(cls: Class<T>, name: String?): String = cls.name + name

    @Suppress("UNCHECKED_CAST")
    fun <T : Any> resolve(cls: Class<T>, name: String? = null): T =
            synchronized(items) { (items[createKey(cls, name)] as Item<T>) }.resove(this)

    fun <T : Any> register(cls: Class<T>, name: String? = null, resolver: (DIContainer) -> T) =
            synchronized(items) { items.put(createKey(cls, name), Item(resolver)); Unit }
}

```


# 依存関係の定義

今回injectするクラス群はこちら

```kotlin
class A()
class B(val a: A)
class C()
class D(val b: B, val c: C)

```

Application classで依存関係を定義します。

```kotlin:DISampleApplication.kt
class DISampleApplication : Application() {
    val container by lazy {

        // dependency definition
        DIContainer().apply {
            register(A::class.java) { A() }
            register(B::class.java) { B(resolve(A::class.java)) }
            register(C::class.java) { C() }
            register(D::class.java) { D(resolve(B::class.java), resolve(C::class.java)) }
        }
    }
}

```

# Activityへの注入

`by lazy`が便利です。

```kotlin:MainActivity.kt

class MainActivity : AppCompatActivity() {

    // inject
    val d by lazy { (application as DISampleApplication).container.resolve(D::class.java) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("log", d.toString())
    }
}

```
inoutのパラメータとクロージャ

`inout` のパラメータとクロージャを併用したときの挙動でちょっとハマりました。（＠Swift 2.2）

```swift
func test(inout param: Int) -> () -> Void {
    let closure = {
        param = param + 1
    }
    closure()       // 呼び出し(A)
    return closure
}

var x = 42
print(x)    // "42"
let closure = test(&x)
print(x)    // "43" : (A)で呼んだから + 1 されてる
closure()   // 呼び出し(B)
print(x)    // "43" : (B)でまた呼んだのに + 1 されてない。なぜ？
```

# どうなってるの？

`inout` にしたパラメータ変数をクロージャでキャプチャすると、

- クロージャが関数内で呼び出される場合は、元の変数に対して操作が行われる。
- クロージャが関数を抜けたあとに呼び出される場合は、どうやら元の変数の **コピー** に対して操作が行われているっぽい。意味が無い！

# この挙動は、将来のSwiftでは変わるらしい

Limiting `inout` capture to `@noescape` contexts
https://github.com/apple/swift-evolution/blob/master/proposals/0035-limit-inout-capture.md

これによると、将来のSwiftでは、`inout` のパラメータ変数を（暗黙的に）キャプチャできるのは `@noescape` がついたところに渡すクロージャに限定されるようです。関数から抜ける可能性のあるクロージャではエラーになるそうです。

※最初の例の `test` 関数が戻り値Voidでクロージャを戻さない下記のような場合でもエラーになるのかどうかは不明。個人的にはエラーになって欲しくない。

```swift
func test(inout param: Int) {
    let closure = {
        param = param + 1
    }
    closure()       // 呼び出し(A)
}
```

また、キャプチャするには明示的に `[ ]` を使う必要があるらしいですが、そうすると、immutableになるので変更はできなくなるみたいです。

```swift
func test(inout param: Int) -> () -> Void {
    let closure = { [param] in
        // paramを使う処理（値の変更はできない）
    }
    return closure
}
```

# 関数を抜けたあとでも期待する動作をさせるには

値を `inout` パラメーターで参照渡しさせるのではなくて、クラス経由で参照渡しさせるようにすれば回避できました。ちょっとスマートさに欠ける気がしますけど。

```swift
class Wrapper {
    var value: Int
    init(value: Int) { self.value = value }
}

func test(param: Wrapper) -> () -> Void {
    let closure = {
        param.value = param.value + 1
    }
    closure()       // 呼び出し(A)
    return closure
}

var x = Wrapper(value: 42)
print(x.value)    // "42"
let closure = test(x)
print(x.value)    // "43" : Aで呼んだから + 1 されてる
closure()   // 呼び出し(B)
print(x.value)    // "44" : Bでまた呼んだから + 1 されてる
```
WindowsからMacBookに切り替えて良かったこと悪かったことまとめ

これまで10年ほどWindowsユーザーでしたが、
昨年MacBookに切り替えて、良かったこと悪かったことをまとめました。

Macを買おうか迷っている方や、Macを持っている方の振り返りにどうぞ。


参考までに、私がMacBookを購入した理由は、以下3点です。
- WindowsPCが壊れかけていたこと
- Windows以外のOSを使ってみたかったこと
- ノートPCで探していたが、デザインがベストだったこと



###良かった点
- アルミフレームがカッコイイ　･･･デザイン重視の方はMac一択！
- iCloudでオールインワン　･･･バックアップとか便利ですね
- パッチ適用とか無い　･･･アップデートはありますが楽です
- トラックパッドが便利すぎる　･･･マウスいりませんね
- Excelも使える　･･･使用感は違うものの、一応使えます

###良くなかった点
- Windows専用アプリ・ゲームが多い　･･･Macで使えないモノは多いです
- ファイルシステム構成がよく分からない　･･･ディレクトリ構成が分かりづらいのが不安です
- ショートカットキーが異なる　･･･最初はなかなか慣れませんが、覚えると便利
- CommandキーとControlキーの違いがわからない　･･･混乱します。。。
- かな英数切り替えで１を入力してしまう　･･･Windowsの英数かな切り替えの場所に、数字の１キーがあります、これはなかなか慣れません。。。



###MacBookを買って結果どうだったか？
結果的には「良かった」と思います。

Windowsのほうが便利なこともありますが、
新たな発見や、カルチャーショック的なものを体験できて、良かったです。

また、慣れれば便利に使いこなせます。特殊な用途があれば別ですが、
うまく使えるかどうかはユーザー次第だと思います。

知らないものを体験してみようとか、確実な用途・メリットがあるという方には、良いと思います。
違うOSで編集されたファイルの改行コードをviで修正する方法

viで対象ファイルを開いて以下のコマンドを入力
```vim
:set fileformat=unix
```
windowsで作成したファイルをlinuxへ移動した時に改行コードが原因で動かない時があって
わざわざサクラエディタの正規表現で置換して再移動してたけど、これならその場で直せて便利。
tcpdumpでPacket Capture

iPXEを使ってPXEBootをやっております。
iPXEのサイトによるとPXEBoot時のPacket CaptureをIntercept(捕まえる)しておくと問題の分析がやりやすいそうです。

GUIのないLinuxやQNAPのようなサーバーにはWiresharkを仕掛けることはできません。
tcpdumpならCUIで動きます。
CommandLine上で全て動きます。

さらにtcpdumpのdumpファイル=PacketCaptureをWiresharkに読み込んで分析することができます。

tcpdumpでdumpファイルを保存し、Wiresharkで分析するところまでをやってみます。

##環境
- Debian jessie
- Dnsmasq(proxydhcp) + iPXE
- SSHd

##tcpdumpインストール

PXEのPacketを捉えるにはPXE Serverにtcpdumpを仕掛けてPacket Captureするのが手っ取り早い。

PXE Serverにtcpdumpをインストールします。

```bash:tcpdumpをインストール
$ sudo apt-get install tcpdump

```

##tcpdumpでPacket Capture

1. PXE ServerにTerminalでログインしておきます。
2. ClientでPXEBootした瞬間に以下のコマンドを実行します。

```bash:PXEをCapture
$ cd ~
$ tcpdump -w ipxe.pcap
```

3. Bootが終わるまでCaptureし続けます。
4. Ctrl + cでtcpdumpを止めます。

##Wiresharkに分析させる

MacだとFilezillaを使わずに、SCPコマンドを使ってサーバーからファイルを取得することができます。

```bash:scpでPacketCaptureをget
$ cd ~
$ scp user@pxeserverip:~/ipxe.pcap ~/Desktop
$ ls ~Desktop/ipxe.pcap
ipxe.pcap
```

###Wiresharkで読み込む。

1. Wiresharkを起動
2. ファイル > 開く
3. ipxe.pcapを開く
4. 表示フィルターに ip.addr == pxeserverip and ip.addr == clientip を入れる。
5. 表示フィルターの右端のフィルター適用を押す

こうすると、PXESERVERのパケットとClientのパケットだけを分析できます。
GitHubでマージ済みだが削除されていないブランチを削除するRuboty Plugin, ruboty-byebranch を作った #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
GitHubでマージ済みだが削除されていないブランチを削除するRuboty Plugin, ruboty-byebranch を作った

## <i class="fa fa-cube" style="font-size:1em;"></i> 用途
GitHub Flow を利用していて、トピックブランチを作成し、Pull Request を出したあと
マージ済みのブランチを削除し忘れて気がついたらブランチのリストが増えてしまっている。
そんな時手動で消すことに頼るのはめんどくさい。
そこで、マージ済みのブランチを削除する [ruboty-byebranch](https://github.com/tbpgr/ruboty-byebranch) を作成しました。
[ruboty-byebranch](https://github.com/tbpgr/ruboty-byebranch) はマージ済みブランチを削除する機能だけを提供し、定期実行は [ruboty-cron](https://github.com/r7kamura/ruboty-cron) に任せます。

## <i class="fa fa-cube" style="font-size:1em;"></i> Installation

Add this line to your application's Gemfile:

```ruby
gem 'ruboty-byebranch'
```

And then execute:

    $ bundle

## <i class="fa fa-terminal" style="font-size:1em;"></i> Commands

|Command|Pattern|Description|
|:--|:--|:--|
|byebranch|/byebranch (?&lt;user&gt;.+?) (?&lt;repository&gt;.+?) (?&lt;exclude_branches&gt;.+?)\z/|Delete merged branches|

## <i class="fa fa-file-text-o" style="font-size:1em;"></i> Usage
### byebranch
https://github.com/tbpgr/eto をターゲットとした場合の例

* Delete merged branches

~~~
@ruboty byebranch tbpgr eto master,release
success delete branch - test
success delete branch - test2

@ruboty byebranch tbpgr eto master,release
target branch is not exist.
~~~

## <i class="fa fa-gears" style="font-size:1em;"></i> ENV

|Name|Description|
|:--|:--|
|GITHUB_USER|GitHub USER|
|GITHUB_TOKEN|GitHub API Token|

## <i class="fa fa-puzzle-piece" style="font-size:1em;"></i> Dependency

Nothing

## <i class="fa fa-pencil-square" style="font-size:1em;"></i> メモ
この Plugin の作成およびこの記事の作成には以下の gem を利用しています

* [ruboty-generator](https://github.com/tbpgr/ruboty-generator) <i class="fa fa-external-link" style="font-size:1em;"></i>
* [ruboty-megen](https://github.com/tbpgr/ruboty-megen) <i class="fa fa-external-link" style="font-size:1em;"></i>
* [ruboty-articlegen](https://github.com/tbpgr/ruboty-articlegen) <i class="fa fa-external-link" style="font-size:1em;"></i>

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-byebranch GitHub](https://github.com/tbpgr/ruboty-byebranch)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-byebranch RubyGems](http://rubygems.org/gems/ruboty-byebranch)
gh-pagesでサイトを公開できる環境をささっと作る。

## gh-pagesの使い方

gh-pagesを使うと、簡単なサイトを公開することができるのでちょっとした検証に便利。

**ローカルから作成しても、リモートから作成してもどっちでも構いません**

- ローカルから作成する場合
- リモートから作成する場合

### ローカルから作成する場合

１. ローカルにgh-pagesに公開したいディレクトリを作成する。なんか作っておく(index.htmlとか)
２. git init, git add, git commit

```bash:ローカルの作業ディレクトリ内で
$ cd 作業するディレクトリ
	
$ git init 
	
$ git add -A
	
$ git commit -m "index.htmlを作成"
	
```

３. リモートにリポジトリを作成する(リポジトリ名だけでよいよ)
![スクリーンショット 2016-05-19 22.06.51.png](https://qiita-image-store.s3.amazonaws.com/0/96985/bd42b5d5-7339-4496-a3e9-5ce99bc0fcdd.png)

４. リモートの環境をローカルに登録する。

```bash:作業中のローカルディレクトリ
$ git remote add origin あなたのリポジトリ

下の画像の、git@github.com:あなたの名前/リポジトリ名の部分
```

![スクリーンショット 2016-05-19 23.11.10.png](https://qiita-image-store.s3.amazonaws.com/0/96985/ba6e0ca9-0140-f2e7-c638-de404a555bec.png)


５. リモートにプッシュする

```bash:作業ディレクトリ
$ git push -u origin master
```

６. リモートでgh-pagesブランチを切る
![スクリーンショット 2016-05-19 22.12.13.png](https://qiita-image-store.s3.amazonaws.com/0/96985/8620ce6f-f6a3-5931-d6d7-70651a86888a.png)

７. settingsを見てみる

![スクリーンショット 2016-05-19 22.12.34.png](https://qiita-image-store.s3.amazonaws.com/0/96985/5199791f-5d00-e456-e04e-4fe5afbbf324.png)

８. 緑色で、URLが表示されていればOK.

### リモートから作成する場合

１. リポジトリを作成します(リポジトリ名だけでよいよ)
　ローカルの時と同じ

２. 作業ディレクトリを作成したい場所でgit clone

```bash:ディレクトリをつくりたいとこで
$ git clone git@github.com:ユーザ名/リポジトリ名.git

ディレクトリができるので、

$ cd 今できたディレクトリ
```

４. 試しにindex.htmlを作成してみる
５. git add, git commit, git push

```bash:作業ディレクトリ
$ git add -A 

$ git commit -m "index.htmlを作成"

$ git push -u origin master
```

以下、ローカルの時と同じ
６. リモートでgh-pagesをきる
７. settingsを見てみる
８. 緑色で、URLが表示されていればOK.


**gh-pagesの作り方でした**

### 補足

リポジトリのトップにindex.htmlがあるならいいんだけど、**dist/index.html**のように１つ下の階層にindex.htmlがあるならアクセスするURLも１つしたの階層にアクセスしないと**404 not found**になっちゃうので注意。

**README.md**にURLを書いておけばめんどくさくなくて良い。

ローカルの作業ディレクトリでREADME.mdを作成。

```markdown
http://あなたのURL/index.html

といった感じに
```

```bash
$ git add -A

$ git commit -m "README.mdにURLを記述"

$ git push -u origin gh-pages
```

---

**gh-pagesで作業して問題なければmasterにmergeする**


ローカルで作業する場合、**gh-pages**で作業しておく。
**gh-pages**で作業しておいて、**master**にmergeすることでbranchも覚えれる(はずW)。

ローカルで作業（branchは、gh-pages)

```bash
$ git branch  # 現在のbranchを確認

masterにいるなら

$ git checkout gh-pages

作業する

$ git add -A

$ git commit -m "gh-pagesで作業した内容"

$ git push -u origin gh-pages
```

色々、作業して、コミットする。んで、マージする。

```bash
$ git branch # 現在のbranchを確認

$ git checkout master # masterに切り替える

$ git merge gh-pages # gh-pagesの内容をmasterにも反映させる

$ git push -u origin master # masterにプッシュする
```

また、作業する時は**gh-pages**にブランチを変えて作業開始

```bash 
$ git branch

$ git checkout gh-pages
```
dein.vimのインストール自体にハマってしまったメモ


vimに興味があって、プラグインをこれから使おうとdein.vimを使おうとしたら、dein.vimのインストール自体に大分引っかかってしまったので記録として残しておきます。

公式ページ　https://github.com/Shougo/dein.vim
に則ってなんとなくなにをしているのかを訳しながらいきます


>
1. Run below script.
>
```console
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh {specify the installation directory}
```

・早速つまずいたところ。最初のコードは、「"installer.sh"という名前のファイルを作ってその中にリクエストしたURLの中身を記入して現在のディレクトリに置いておくよ」という意味だとわかったけども、そのファイルをどこに置いておくかを迷った。

・調べた結果、どうやら`~/.cache/dein`というところにdein.vimをインストールするのが通例の一つらしいので

```console
#まず
$ mkdir -p ~/.cache/dein
#とした後に
$ cd ~/.cache/dein
#で移動してその状態で
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh ~/.cache/dein
#と打ってあげる
```
	
とやればうまくいきました。

・で、肝心なのはこの次で、`2, Edit your .vimrc like this.`の部分のようにコードをvimrcに記載してもvimrcが読み込んでくれなかった。

・質問投稿サイトで聞いてみたら、最後のコマンドを打った後に出てくるサンプルコードをしっかりコピーして使わないと`.vimrc`が読み込んでくれないということが判明しました
	
```vim
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=$HOME/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('$HOME/.cache/dein')
  call dein#begin('$HOME/.cache/dein')

  " Let dein manage dein
  " Required:
  call dein#add('$HOME/.cache/dein/repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here:
  call dein#add('Shougo/neosnippet.vim')
  call dein#add('Shougo/neosnippet-snippets')

  " You can specify revision/branch/tag.
  call dein#add('Shougo/deol.nvim', { 'rev': '01203d4c9' })

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------
```

・こんな感じのが出てくるからしっかりとコピーしてvimrcの末尾に貼っておく。

・ついでに一番最後の部分のコメントアウトを外すのも忘れない

・あとはvimを実行すれば、インストールを開始してくれるはず。

・他のプラグインを入れたいと思ったら

```bash
#省略

call dein#add('Shougo/neosnippet.vim')
call dein#add('Shougo/neosnippet-snippets')

#githubのリポジトリ名を打ち込む
call dein#add('thinca/vim-quickrun')
```
こんな感じでインストールできます。

教えてくださった方、ありがとうございます！
リージョンの文字列反転

```
(defun replace-region-to-text (text beg end)
  (delete-region beg end)
  (insert text)
  )

(defun reverse-region-string (&optional beg end)
  (interactive "r")
  (replace-region-to-text (apply 'string
                                 (reverse
                                  (string-to-list
                                   (buffer-substring beg end))))
                          beg end))

```
fluentdを使ってpapertrailにTCP+TLS経路でログを送る

papertrailというログ集約サービスがある。
ここはsyslogプロトコルでログを受け付けてくれて、fluent-plugin-remote_syslogというプラグインもあるのだが、素のUDPしかサポートされていなかったりする。
それがバックエンドに使っているremote_syslog_loggerというgemがあるのだが、それがUDPプロトコルを使っていて、このgemはTCP+TLSをサポートしていない。

まあ、これには理由があって過去のPRでリジェクトされている。
主な理由はloggerがブロッキングすると困るんだけど、それを真面目にハンドリングするためのコードを入れたくないので、UDPだけサポートするということらしい。
このサービスのメインのクライアントはgolangで書かれたremote_syslog2とrsyslog(syslog-ng)だと思うので、そっち使えってことなんだろうと思うけど、fluentdから送りたいものもある。

しかし、素のudpでインターネットを経由してログを送るってのはちょっと……。
それに、fluentdを使う場合、別にブロッキングしようがfluentdのbuffered output pluginの構造が面倒見てくれるはずなので、そんなの気にする必要が無い。

仕方ないので、それぞれforkしてカスタマイズした。
今はgithubから直接インストールして利用しているので、gemとしてリリースはしていない。

https://github.com/reproio/remote_syslog_logger/tree/support-tcp
https://github.com/reproio/fluent-plugin-remote_syslog/tree/use-custom-logger

```
<match message.warn>
  type remote_syslog
  host <%= node[:papertrail][:host] %>
  port <%= node[:papertrail][:port] %>
  severity warn
  hostname <%= node.name %>
  protocol tcp
  tls true
  ca_file /etc/papertrail-bundle.pem
</match>
```

こんな感じでいけるようにした。
ca_fileは、papertrailのサイトから落としてくる。でないとverifyに失敗する。
Microsoft Cognitive Servicesの登録方法


Microsoftが提供している[Cognitive Services](https://azure.microsoft.com/ja-jp/services/cognitive-services/)は、
テキスト、音声、視覚、知識、Bingでの検索等を簡単かつ効率的に処理出来るSDK/APIサービスです。
Cognitive Servicesにて提供されているAPIは多数ありますが、代表的なものには次のAPIがあります。

**Face API**
写真に含まれる顔を検出、識別、分析、グループ化、タグ付けするAPI
**Speech API**
音声をテキストへ、またそのテキストを再び音声に変換するAPI
**Text Analytics API**
テキストセンチメント分析を行い、キーフレーズやトピック・言語を検出するAPI
**Bing Web Search API**
Bingの検索エンジンを用いてwebサイトを検索するAPI
　　
なおCognitive Servicesで提供されているAPIには無料で使用できるものが多く、
手軽に使用できる点もウリの一つです。
また有料版においてはazureを契約することで、新規契約から一ヶ月間は約20000円分の
API呼出が実質無料で可能となります。（2016/05現在）

そこで今回はCognitive Servicesで無料提供されているBing Image Search APIを例に取り、
Cognitive Servicesのサービス利用登録プロセスを以下に記しておきます。
## Bing Image Search API を使う手順

**1.Microsoftアカウント登録**
※ Microsoftアカウント登録に関しては、下記サイトで詳しく説明されているのでここでの説明は割愛します。
[Microsoft アカウント登録手続き](https://www.microsoft.com/ja-jp/msaccount/signup/own.aspx)
　
**2.Cognitive Servicesのページから、Microsoftアカウントでログインする**
[Cognitive Services](https://www.microsoft.com/cognitive-services)のページを開き、
topページ右上の[My Account]のリンクより、１で作成したMicrosoftアカウントでログインします。
　
<img width=70% alt="006.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13490/da2d0587-cfb9-0954-1648-a828e4402255.jpeg">
　
**3.Cognitive ServicesのAPI利用手続き**
Cognitive Servicesのtopページにある[APIs]タグから[Bing Image Search]を選択しクリック。
　
<img width=70% alt="001.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13490/7f0e140b-ba41-f996-254b-40a5af9b8215.jpeg">

[Bing Image Search API](https://www.microsoft.com/cognitive-services/en-us/bing-image-search-api)のtopページに遷移したら、[Get started for free]のボタンをクリック。
　
<img width=70% alt="003.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13490/93748323-2202-0292-b660-5f9ffcd827ba.jpeg">


API一覧表が表示されるので、[Bing Search - Preview]の項目にチェックが入っているか確認。
　
<img width=70% alt="002.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13490/89b6af7e-fc4a-1c1e-3432-7e6a4bc26c3b.jpeg">


ページ下部の[I agree〜]と[Contact me〜]をそれぞれチェックしたら[subscribe]ボタンをクリック。
　
<img width=70% alt="004.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13490/8021a178-fc62-1499-33d0-543c7bb94e0a.jpeg">
　

これでAPIの利用登録は一通り完了となります。
　
**4.サブスクリプションキーの取得確認**
[My account]のページにて表示される[My free subscriptions]の中に
[Bing Search – Preview]のKey1・Key2が掲載され、[State]が"active"になっていればAPI利用が可能です。
（ShowをクリックすればKeyが表示される。）

この際にAPI処理に用いるサブスクリプションキー（Subscription Key）が2つ表示されます。
これはAPI利用時にリクエストヘッダ情報として埋め込むもので、
それをプログラム中で用いることでWebAPIをスローすることが可能となります。
なお2つのキーはどちらを用いても構いません。
　
<img width=70% alt="005.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/13490/565779a8-0825-3cbd-9a39-d9d22d1bf0ba.jpeg">
【iOS】AdMobの新しいNativeAd(GADNativeExpressAdView)を試す

Google I/O 2016でAdMobもNativeAdに対応するということがわかったため早速ためしてみたいと思います

##AdMobのNativeAdの種類
AdMobのNativeAdにはNative Ads ExpressとNative Ads Advancedの二種類があるようです。

- Native Ads Express
新しく登場したタイプのネイティブ広告です。
アプリ内にはGADNativeExpressAdViewというViewのみを配置し、Viewの中身をAdMobの管理画面からcssで編集するという形式です。今回の記事ではこちらのものを試してみます。

- Native Ads Advanced
他社アドネットワークでよく見かけるタイプのネイティブ広告です。
広告リクエストが返ってくるとアイコン画像やタイトル、インストールURLなどがもらえて、自前でデザインしたViewにそれらを自由に配置する形式です。
こちらはまだクローズドベータの段階で、一部の開発者にしか機能を公開していないそうです。


##広告タグの生成
新しくなったAdMob管理画面から、ネイティブフォーマットの広告IDを作成します。

![スクリーンショット 2016-05-19 9.22.12.png](https://qiita-image-store.s3.amazonaws.com/0/121299/b336b8ee-072f-1200-ca6b-9f30ce7d43c1.png)

このような感じで、この画面からGADNativeExpressAdViewをデザインするみたいです
直感的で結果もすぐ確認できいい感じだと思います


##SDKのインストール
cocoapodsを用いてSDKをインストールします。

```rb:Podfile
source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '7.0'

target 'NativeAdTest' do
  use_frameworks!
  pod 'Firebase/AdMob'
end
```

プロジェクトのルートディレクトリで`pod init`してPodfileを作成、上のように書き込み、`pod install`します。
AdMobは新しくFirebaseの傘下に入ったようです。といっても、今までのSDKからとくに変化はないようです。同じものを参照しているみたいです。


##GADNativeExpressAdViewの設置
###ストーリーボードを使ってViewの設置
GADNativeExpressAdViewは新しいネイティブ形式の広告Viewではありますが、今までのGADBannerViewとほぼ同じように扱うことができそうです


![スクリーンショット 2016-05-19 22.23.44.png](https://qiita-image-store.s3.amazonaws.com/0/121299/06cc3fa0-16a5-e5b1-70f9-59765d6c983d.png)
ストーリーボードにUIViewを設置し、ClassをGADNativeExpressAdViewに指定します。
サイズと位置をAutoLayoutで指定してあげます。今回はど真ん中に360x100で表示させます。

設置がおわったら、管理するViewControllerにひも付けします

###コードで広告ユニットIDを設定
```swift:ViewController.swift
    @IBOutlet weak var nativeExpressAdView: GADNativeExpressAdView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.lightGrayColor() // 分かりやすいように背景色をつける
        
        // 広告ユニットIDの設定
        nativeExpressAdView.adUnitID = "あなたの広告ユニットID"
        nativeExpressAdView.rootViewController = self
        
        // 広告リクエストの送信
        let request = GADRequest()
        nativeExpressAdView.loadRequest(request)
        
    }
```
広告IDをセットして、リクエストを送信するだけでネイティブ広告を読み込むことができます。バナー広告のときと本当に変わりませんね。


##表示結果
<img width="375" alt="IMG_1181.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/121299/e7f00403-c443-ab02-d0d8-614a9bb98666.png">
無事表示することができました。

##おわりに
みんなが試しているせいでリクエストが集中しているのか、単に在庫がないのかわかりませんが、なかなか表示されません。表示されないと思ったら気長に待ってみるものいいかもしれません。

今回はストーリーボードを使った設置方法を紹介しましたが、コードから設置することも可能だと思います。既存のGADBannerViewにかなり近い感じでほとんどネイティブ広告だということをコードから意識しなくていいのは楽です。デザインの編集はAdMobの管理画面からですのでストアに出したあとでも変更することができたりします。
form_forタグとrequireメソッドはセットで使用する

form_forタグはparamsの配列の中にモデル名をキーにもつ配列を生成する

requireメソッドを使ってparamsのハッシュで使用するキーを制限する。
permitメソッドで受け取るリクエストパラメータの制御を行います。

例：
def update_params
    params.require(:user).permit(:family_name, :first_name, :family_name_kana, :first_name_kana)
end

※よくある応用
margeメソッドを使って別のハッシュと繋ぐこともある。
eachメソッドとmapメソッドの違い

どちらも配列の中身を１つずつ取り出してブロックという構文を繰り返し実行します。
mapメソッドはそれに加えて、ブロックの返り値を集めた新しい配列を作成します。

配列オブジェクト.map {|ele| ブロックの処理}

例：
squares = numbers.map {|number| number * number}
Firefox（<49）でもbackground-position-xしたい！～CSS Variablesで再現する

# 追記（2017/10/17）

Firefox 49では`background-position-x`が正式サポートされるようになったので、以下のようなワークアラウンドは不要となっています。

# 以下、昔の内容をそのまま残しています

2次元的にスプライト画像を並べているような場面で便利な`background-position-x/-y`ですが、正式なプロパティではなく、IE・Edge・Webkit系では動きますが、Firefoxでは対応していません。

もちろん、`background-position x y;`とするのが正式ですし、SCSSなどを使えばまとめて生成してしまうこともできなくはないのですが、「CSS Variables」という新規格を使った面白い解決法を見つけたので、それについてまとめてみます。

なお、CSS Variablesの対応ブラウザは少し前からのFirefoxと最新のWebkit/Blink系で、MS系が非対応なので、「これを使って積極的に何か組む」にはまだ向いていません。

# カスタムプロパティの宣言
CSS Variablesでのカスタムプロパティは、`--abc: value;`のような形で、ふつうのCSSプロパティと同様に宣言します。最初はハイフン2つで、残りのプロパティ名では大文字・小文字の区別があります。

そして、このカスタムプロパティも他のCSSプロパティ同様に、**継承されます。**

```css:カスタムプロパティの継承
:root{
  --hoge: 2px;
}

ul{
  --hoge: 10px;
}
```

このように書いた場合、`ul`の外では`--hoge: 2px;`に、中では`--hoge: 10px;`になります。このように継承することが、使う分には重要なポイントとなってきます。

# カスタムプロパティを使う
カスタムプロパティは、他のCSSプロパティの**値**として、`var(カスタムプロパティ名)`として使うことができます。なお、Sassの変数とは違って、セレクタやプロパティに使うことはできません。また、`--hoge: 2;`の時に、`margin-left: var(--hoge)px`と書いても、`margin-left: 2 px`のようにみなされてうまく動きません（もちろん、`margin-left: calc( var(--hoge) * 1px)`のようにすることはできます）。

そして、この変数展開は、要素ごとに**その要素に適用されたカスタムプロパティで**行います。

```css:サンプルCSS
:root { --color: blue; }
div { --color: green; }
#alert { --color: red; }
* { color: var(--color); }
```

```html:上のCSSを適用した結果
<p>:rootそのままの青色</p>
<div>divには緑色が指定されています</div>
<div id='alert'>
  #alertに指定された赤色
  <p>外側の#alertから継承した赤色</p>
</div>
```

継承関係はCSSそのままということで、ここもSassの変数と異なります。

# 実践（`background-position-x/-y`の再現）
ということで、2×3に並べたスプライトを考えてみます。

```css:元のCSS
#parent a.buttons{
  /* サイズ指定や画像置換など */
  background-position-y: 0;
}

#parent a#foo{
  background-position-x: 0;
}
#parent a#bar{
  background-position-x: -80px;
}
#parent a#baz{
  background-position-x: -160px;
}

#parent a:hover{
  background-position-y: -30px;
}
```

これをCSS Variablesでも表してみると、

```css:適用後
#parent{
  /* 変数のデフォルト指定 */
  --bgX: 0;
  --bgY: 0;
}

#parent a.buttons{
  /* サイズ指定や画像置換など */
  background-position-y: 0;
  background-position: var(--bgX) var(--bgY);
}

#parent a#foo{
  background-position-x: 0;
}
#parent a#bar{
  background-position-x: -80px;
  --bgX:-80px;
}
#parent a#baz{
  background-position-x: -160px;
  --bgX:-160px;
}

#parent a:hover{
  background-position-y: -30px;
  --bgY: -30px;
}
```

と、再現することができます。


# 参考資料
* [StackOverflow](http://stackoverflow.com/questions/14844407/background-position-y-doesnt-work-in-firefox-via-css/29282573#29282573)
* [Working Draft](https://drafts.csswg.org/css-variables/)