OmniAICreator/Qiita-1.07M huggingface dataset:
GrafanaでInfluxDBの値を表示する docker を使う

# 概要

いくつか、時系列データをGrafanaでみてみたいので、表示できるようにしたい。

# 結論

できた。

# 手順

## InfluxDBを起動する

8083と8086にアクセスできるとして

```
docker pull influxdb:1.0.2-alpine
mkdir influxdb
cd influxdb
docker run -p 8083:8083 -p 8086:8086 \
      -v $PWD:/var/lib/influxdb \
      influxdb:1.0.2-alpine
```

## InfluxDBへデータをいれる

1.0.2で試した。
1.0.2のコンテナからドキュメンテーションを押したら404になった。

### データベースを作る

* [InfluxData | Documentation | Writing Data with the HTTP API](https://docs.influxdata.com/influxdb/v1.0/guides/writing_data/)

```
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
```

### データを書き込む

* [InfluxData | Documentation | Writing Data with the HTTP API](https://docs.influxdata.com/influxdb/v1.0/guides/writing_data/)

```
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'
```

### データを検索できるか試す(curl)

* [InfluxData | Documentation | Querying Data with the HTTP API](https://docs.influxdata.com/influxdb/v1.0/guides/querying_data/)

```
curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
```

### データを検索できるか試す。Web Interface

Query 欄に、検索したいものをいれる。
from以降を変えると、ほかのデータを検索できる。

```
select value from cpu_load_short
```

![Screenshot from 2016-11-11 16-27-24.png](https://qiita-image-store.s3.amazonaws.com/0/82011/1c48fd4e-6509-88ec-012c-8be2e8b0fac2.png)




### 最近のデータにする

上のデータが２０１５年のもののようなので、Grafanaで表示したときに最新のものになるようにしたい。

タイムスタンプは以下のようにして作成すると現在時刻になる

```
date "+%s%N"
```

## Grafanaと連携する

grafanaのコンテナは以下を使った

```
monitoringartist/grafana-xxl:3.0
```

grafana-xxlについては

* [grafana-xxl grafana zabbix でプラグインとかいれようとしたら便利なのがあった。 - Qiita](http://qiita.com/manabuishiirb/items/3f5900df202ef567975e)

### Datasourceを追加する

GUIでそれっぽくできるので、それで追加する。

### Graphをつくる

Metricsのところで、FROMの右のdefaultの右側のところをクリックすると選択できるようになるので、
`cpu_load_short` を選択する

![Screenshot from 2016-11-10 18-04-48.png](https://qiita-image-store.s3.amazonaws.com/0/82011/004a47fb-3ec7-3e4d-d5bd-a9a9f866dbe7.png)

こんなかんじのグラフになる

![Screenshot from 2016-11-10 18-06-53.png](https://qiita-image-store.s3.amazonaws.com/0/82011/729bfe4e-a11d-c3bf-ff00-958a01a0f5e4.png)


# これをみたらよさそうだった

わかりやすそうで、実際参考にさせてもらいました。
dweetとの連携もあった

* [DockerのInfluxDBとGrafanaでdweet.ioのデータを可視化する - Qiita](http://qiita.com/masato/items/eab9f76f21cbfd7c9b92)

* [GrafanaとInfluxDBでネットワークリソースの視覚化 - Qiita](http://qiita.com/kooshin/items/a770c6df33fe2ffb2d0b)

* [DockerでサクッとGrafana/InfluxDBを試してみる - そんな今日この頃の技術ネタ](http://blue1st-tech.hateblo.jp/entry/2016/07/04/014614)
【iOS】キーボード周りのNotificationをprotocolでデフォルト実装する

キーボードの表示・非表示でViewの変更などをする際に、ViewControllerごとにaddObserverやremoveObserverを書いたりするのをなんとか減らしたいと思い、下記のような実装をしてみました。

```swift
protocol KeyboardObservable: class {
    var keyboardObservers: [Any] { get set }
    func keyboardWillShow(_ notification: Notification)
    func keyboardDidShow(_ notification: Notification)
    func keyboardWillHide(_ notification: Notification)
    func keyboardDidHide(_ notification: Notification)
    func addKeyboardObservers()
    func removeKeyboardObservers()
}

extension KeyboardObservable {
    func addKeyboardObservers() {
        keyboardObservers = [
            (.UIKeyboardWillShow, keyboardWillShow(_:)),
            (.UIKeyboardDidShow, keyboardDidShow(_:)),
            (.UIKeyboardWillHide, keyboardWillHide(_:)),
            (.UIKeyboardDidHide, keyboardDidHide(_:))
        ].map { NotificationCenter.default.addObserver(forName: $0, object: nil, queue: .main, using: $1) }
    }
    
    func removeKeyboardObservers() {
        keyboardObservers.forEach { NotificationCenter.default.removeObserver($0) }
        keyboardObservers.removeAll()
    }
}
```

- `keyboardWillShow(_:)`
- `keyboardDidShow(_:)`
- `keyboardWillHide(_:)`
- `keyboardDidHide(_:)`

はprotocolによって実装が強制されるので、タイポなどによってactionが呼ばれないというミスが減ります。

```swift
class ViewController: UIViewController, KeyboardObservable {
    
    var keyboardObservers: [Any] = []
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        addKeyboardObservers()
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        removeKeyboardObservers()
    }
    
    func keyboardWillShow(_ notification: Notification) {
        //キーボードが表示される前の処理
    }
    
    func keyboardDidShow(_ notification: Notification) {
        //キーボードが表示された後の処理
    }
    
    func keyboardWillHide(_ notification: Notification) {
        //キーボードが非表示にされる前の処理
    }

    func keyboardDidHide(_ notification: Notification) {
        //キーボードが非表示にされた後の処理
    }
}
```
上記のようにKeyboardObservableを採用することで、キーボードのNotificationをハンドリングしたいViewControllerだけで呼び出しが可能になります。
Macをクリーンで再セットアップしてから開発環境を色々揃えるまで


完全に備忘録がわりに。
クリーン直後のSerriaを想定しています。


#zshの導入とカスタマイズ

[ここ](http://qiita.com/nenokido2000/items/763a4af5c161ff5ede68)を参考に進める

### インストール

```
$ brew install zsh
```

### ログインシェルの変更

```
$ vim /etc/shells
```
```shell:/etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh # この行を追加

```

次に以下を実行

```
$ chsh -s /usr/local/bin/zsh
```

### 少し凝ったzshrcを導入

[zshrc_useful.sh](https://gist.github.com/mollifier/4979906) をコピペ。

#### 最後にsourceして適用

```
% source ~/.zshrc
```


# HomebrewとBrew cask

#### 下準備

ひとまず/usr/localに対して権限を与える。

```
$ sudo chown root:wheel /usr/local
$ sudo chmod 0755 /usr/local
```


### Homebrew

以下を貼り付けて実行

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### Homebrew Cask

同様に以下を実行

```
% brew tap caskroom/cask
```

.zshrcに以下を追加

```~/.zshrc
~~~
export HOMEBREW_CASK_OPTS="--appdir=/Applications"
~~~
```


## 必要に応じて便利ツールたち

### BettorTouchTool

```
% brew cask install bettertouchtool
```

# ソース管理

## SourceTree

```
% brew cask install sourcetree
```

### git

```
brew install git
```

.zshrcに以下を追加

```
PATH=/usr/local/bin:$PATH
```

## 開発環境を入れていく

### Java

```
% brew cask install java
```

### Android開発環境

```
% brew cask install android-studio
```

## Node.jsがらみ

```
% curl -L git.io/nodebrew | perl - setup
```

.zshrcを開き、以下を追加。

```~/.zshrc
~~~
export PATH=$HOME/.nodebrew/current/bin:$PATH
~~~
```

stable版をインストール

```
% nodebrew install-binary stable
```

### Stableを変更
```
% nodebrew ls
```

すると、以下のように出るので、

```
% nodebrew ls
v7.1.0

current: none
```

以下のように打つ。(インストールされているLatestVersionを指定)

```
% nodebrew use v7.1.0
```


### Visual Studio Code

```
% brew cask install visual-studio-code
```

### Sublime Text

```
% brew cask install sublime-text
```


## デザイン系のアプリ群

### Sketch

```
% brew cask install sketch
% brew cask install sketch-toolbox
```

## その他便利アプリ

```
% brew cask install handbrakecli
```
Vagrant 1.8.7でvagrant upできないときの応急対応

# 環境
Mac OS X EI Capitan 10.11.6
Vagrant 1.8.7

# 現象

`vagrant up`でboxを取得するようにした状態で、upするとcurlで落ちる。

```rb
  config.vm.define 'api' do |api|
    api.vm.box = 'api'
    api.vm.box_url = 'https://s3-ap-northeast-1.amazonaws.com/path/to/api.json'
```

```bash
$ VAGRANT_LOG=debug vagrant up api
...
ERROR vagrant: Vagrant experienced an error! Details:
ERROR vagrant: #<Vagrant::Errors::DownloaderError: An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

>
ERROR vagrant: An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.


ERROR vagrant: /opt/vagrant/embedded/gems/gems/vagrant-1.8.7/lib/vagrant/util/downloader.rb:206:in `execute_curl'
...
```

# 原因
```bash
$ /opt/vagrant/embedded/bin/curl --version
dyld: Library not loaded: @rpath/libcurl.4.dylib
  Referenced from: /opt/vagrant/embedded/bin/curl
  Reason: Incompatible library version: curl requires version 9.0.0 or later, but libcurl.4.dylib provides version 7.0.0
```

libcurlのバージョンが古いらしい。

# 応急対応
https://github.com/mitchellh/vagrant/issues/7969

```bash
$ sudo mv /opt/vagrant/embedded/bin/curl{,.bak} 
```
（rmするのも不安なのでmvにしておく）
time要素のdatetime属性はReactではdateTimeだった

# 概要

エラーの通りなので、
わざわざ記事にするようなことではないかなと思ったのですが
大文字小文字に気がつかずしばらくハマったので、もしかしたら誰かの役に立つかもと記事化しました。

time予想のdatetime属性はReactではdateTimeだよという話。

# 本題

```
<time class="date" datetime="2016-01-01">2016年01月01日</time>
```

上記をReactで

```
<time className="date" datetime="2016-01-01">2016年01月01日</time>
```
とするとConsoleで以下のように怒られます　

```
Warning: Unknown DOM property datetime. Did you mean dateTime?
```

timeのTを大文字にして

```
<time className="date" dateTime="2016-01-01">2016年01月01日</time>
```

これで解消。
nodejsの組み込みデバッガを使用して、サーバーサイド開発を行う

nodejsで、サーバーサイド開発を行う際に、変数とかの中身を調べるために、`console.log()`で毎回出力していたが、何かと不便。
調べてみたところ、`node-inspector`というライブラリを入れると、ブラウザのデバッグツールでデバックできるというので試したところ、下記のエラーが出て使えない。

```
/usr/local/lib/node_modules/node-inspector/lib/InjectorClient.js:111
      cb(error, NM[0].ref);

TypeError: Cannot read property 'ref' of undefined
```

同じようにはまってる人の質疑応答があったので読んでいたら、最後にnode自体に同等の機能が組み込まれたから、それ使えって書いてあった。

https://github.com/node-inspector/node-inspector/issues/907

## 使い方

最初使い方がよくわからなかったので、記録を残す。
今、sailsを使っているので、それを使った時の設定方法なども併せて記載する。

### バージョン

nodejs: v6.7.0
sails: 0.12.9

### sailsを適当にセットアップ

とりあえず、局所的にsailsが動くように設定とインストール。よくわからない場合やグローバルに入れたい場合は、調べればすぐ出るので、それで入れる。

```zsh
PATH=./node_modules/.bin:$PATH
typeset -U path

npm install sails
sails new inspect_test
cd inspect_test
rm -rf node_modules
npm install
```

### アプリケーションを作成

とりあえず、コントローラーを作って、アクセスできるように設定する。
コード中に、`debugger;`と入れると、そこがブレークポイントになる。

```zsh
sails generate controller hoge

sed -i -e "/};/i,'/hoge': { controller: 'HogeController', action: 'index' }" config/routes.js
sed -i -e "/};/iindex: function(req, res) {debugger; res.send('hogehaoge')}" api/controllers/HogeController.js
echo 'module.exports = {port:9000}' > config/local.js
```

### 起動

inspectのポート番号は指定しなければ、デフォルトが使用される。

```
node --inspect=9001 app.js
```

### アクセス


起動時に下記のようなURLが表示されるので、localhost部分をサーバーのIPなどに変更して、`chrome`のアドレス欄に入れ、アクセスするとデバッグツールが表示される。

```
chrome-devtools://devtools/remote/serve_file/@xxxxxxxxxxxxxx/inspector.html?experiments=true&v8only=true&ws=localhost:9001/node
```

成功すれば、`node`のコンソールに下記のメッセージが表示される。

```
Debugger attached.
```

あとは、どのブラウザでも良いので、アプリケーションにアクセスすると、`debugger;`と入れたところで処理が止まり、コードがデバッグツールに表示される。もちろん、変数内を見たり、ステップ実行なども可能。

```
http://localhost:9000/hoge
```

### foreverを設定する

開発時は、コード変更のたびに、アプリケーションを再起動する必要がある。`forever`を使用すると、変更したら勝手に再起動するので、楽になるので入れる。デバッガの設定もする。

#### インストール＆設定

```zsh
npm install forever
cat << EOF > .foreverignore
**/.tmp/**
assets/**
views/**/*.ejs
node_modules/**

.idea/**

.git/**
EOF
```

#### 起動

`node`にオプションを渡したい場合は、`-c`で`node`コマンドごと再設定する。

```zsh
forever -c 'node --inspect=9001' -w app.js
```
fabric

fabricのコマンドで外部のサーバーにdeployしようとした時に

```
Username for 'https://github.com':

```

のようにユーザー名とpasswordを聞かれる場合がある。こういうのがあると全自動でできないので非常に面倒。

```
run("git remote set-url origin https://user-name:pass@github.com/UserName/RepositoryName.git")


run("git pull origin master")
```

# 備考
逐次追加します。
[Jenkins] Gitのsshでのクローンが失敗する場合の解決法メモ

毎回セットアップ時に引っかかる点のメモ
todo: ログ取り忘れたので追記する

# 前提知識
Jenkinsは `jenkins` ユーザーでcloneを行います。
そのためJenkinsが参照に行く`~/.ssh/config` は `/var/lib/jenkins/.ssh/config` などになります。

# ~/.ssh/configがない

jenkinsユーザーになって `~/.ssh/config` を作成する

```bash:ssh/configの設定
$ sudo su jenkins

# 以下は gitlab での例
$ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa_gitlab
$ cat << EOS >> ~/.ssh/config
Host gitlab
User git
Hostname gitlab
Port 22
IdentityFile ~/.ssh/id_rsa_gitlab
EOS
```

# hostが解決できていない
(yes/no)の待ちになってしまっているので、一度接続してknown_hostsを解決しておく

```bash:known_hostsの解決
# github とか gitlab とか
$ sudo su jenkins
$ ssh <サーバーURL>
```
Mac に Terraform を homebrew でインストールする方法

## Mac に Terraform を homebrew でインストールする方法

Terraform(https://www.terraform.io/) をインストールする方法を探していると `cask` を使う方法が出てくるのですが、エラーが出てインストールできませんでした。
以下で解決。

```
$ brew install terraform
```

参考URL:
- http://brewformulas.org/Terraform
AWSでrails appをapache × passengerを利用してデプロイするまで

タイトル通り、デプロイまでの流れをまとめました。

##環境
・ruby v2.2.4
・rails v4.2.5
・OS:amazon linux

##準備
> su

>yum update -y
>yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison git

##とりあえずapacheの導入
> yum install httpd httpd-devel curl-devel
自動起動の設定。
> chkconfig /etc/init.d/httpd
> chkconfig httpd on
Apacheを起動。
> service httpd start

これで一応apacheが起動できていることがPublic DNSでアクセスするとわかります。

##rbenv導入からruby導入まで
・amazon linuxにはデフォルトでrubyが入っていますが、
バージョンが古かったり、/var/bin/ruby にpathが通っているとダメであったりと注意が必要です。
（システムワイドにインストールする必要がある）
・目標として、rbenvはrootユーザで/root/.rbenv 以下にインストールしていると、
apacheユーザにruby(内のpassenger gem)の実行権限が無いため、
/usr/local 以下にインストールするようにします。
（デフォルトでインストールされている/var/bin/ruby も /var/local ディレクトリ以下に訂正）

> cd /usr/local
>git clone git://github.com/sstephenson/rbenv.git rbenv
>mkdir /usr/local/rbenv/shims /usr/local/rbenv/versions

> echo 'export RBENV_ROOT=/usr/local/rbenv' >> ~/.bash_profile
> echo 'export PATH=\$RBENV_ROOT/bin:\$PATH' >> ~/.bash_profile
> echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
> source ~/.bash_profile

デフォルトで PATH が参照しない場所にインストールするので、sudoが認識できるようにします。
（.profile 等で操作ユーザの PATH を変更しても通常は sudo はそれを認識しない）
>visudo
　　　 => RBENV_ROOTをenv_keepに追加
Defaults    env_keep += "RBENV_ROOT"
　　　 => secure_pathに/usr/local/rbenv/bin追加
     Defaults    secure_path = /usr/local/rbenv/shims:/usr/local/rbenv/bin:/sbin:/bin:/usr/sbin:/usr/bin

>mkdir /usr/local/rbenv/plugins
cd /usr/local/rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git

>rbenv install 2.2.4
 rbenv rehash
 rbenv global 2.2.4
 ruby -v

ここでバージョンがおかしい場合は which ruby でも確認して反映されてないとわかったらec2を再起動

##gem、railsのインストール
> gem install bundler --no-rdoc --no-ri
 rbenv rehash
 bundle init
 bundle instal --path vendor/bundle

>gem install rails --version "=4.2.5"

##passengerの導入
> gem install passenger --no-ri --no-rdoc

Apacheのモジュールをインストールします。

> passenger-install-apache2-module

出力の中に以下のような内容があるはずです。メモっておいて下さい。

LoadModule passenger_module /usr/lib64/ruby/gems/1.8/gems/passenger-4.0.5/libout/apache2/mod_passenger.so
PassengerRoot /usr/lib64/ruby/gems/1.8/gems/passenger-4.0.5
PassengerDefaultRuby /usr/bin/ruby

ここでファイル/etc/httpd/conf.d/passenger.confを作り、
先ほどメモしておいた3行とともにバーチャルホストを設定します。

>LoadModule passenger_module /usr/lib64/ruby/gems/1.8/gems/passenger-4.0.5/libout/apache2/mod_passenger.so
PassengerRoot /usr/lib64/ruby/gems/1.8/gems/passenger-4.0.5
PassengerDefaultRuby /usr/bin/ruby

>\<VirtualHost *:80>
  　ServerName sample
  　DocumentRoot /usr/local/var/sample/public
  　RailsEnv development
  \<Directory /usr/local/var/sample/public>
    　AllowOverride all
    　Options -MultiViews
  \</Directory>
\</VirtualHost>

##railsプロジェクトの作成
>cd /usr/local/
mkdir var
cd var
rails new sample

##確認
Apacheを再起動し、Public DNSにアクセスするとsampleプロジェクトが表示されます。

>service httpd restart

これでPublic DNSでアクセスできるはずです。
Threejsとionic2でつくるipad appでオブジェクトのクリック判定

clickだと300ms遅延が発生するので、試行錯誤したのでメモしときます。

click
↓
touchstart


http://gupuru.hatenablog.jp/entry/2013/12/02/190413

こちらを参考にして書いたのですが、clickをtouchに変えただけだと、なんかクリック位置が全然ずれてしまってました。

ev.clientX 
↓
ev.touches[0].clientX 

これでいけました
#### 
```

let mouse = { x: 0, y: 0 }   
interface HTMLElementEvent<T extends HTMLElement> extends Event {
  target: T,clientX: any,clientY: any,touches: any 
}

let touchObj  = null;
window.addEventListener( "touchstart", (ev: HTMLElementEvent<HTMLInputElement>) => {
  if (ev.target == renderer.domElement) { 
    let rect = ev.target.getBoundingClientRect()    
    console.log(ev)
    mouse.x =  ev.touches[0].clientX - rect.left
    mouse.y =  ev.touches[0].clientY - rect.top
    mouse.x =  (mouse.x / window.innerWidth) * 2 - 1    
    mouse.y = -(mouse.y / window.innerHeight) * 2 + 1 
    let vector = new THREE.Vector3( mouse.x, mouse.y ,1) 
    vector.unproject(camera)
    let ray = new THREE.Raycaster( camera.position, vector.sub(camera.position).normalize() )
    let click_obj = ray.intersectObjects(targetList,true)
    if ( click_obj.length > 0 && this.toggle_cut == true ){    
      for(let key in this.dataList){
        if(click_obj[0].object.name === this.dataList[key].name){
          touchObj = this.dataList[key]
        }
      }
    } 
  }
})

```

無謀にもthreejs と　ionic2で作ってますがなんとか動いています。
Apacheでhttpをhttpsに強制リダイレクト

# はじめに

Apacheでドメインを設定した際に、https://example.com のようにHTTPS通信にすることが多々あると思います。
常時SSLを設定する場合は、HTTP通信が必要ないのですが、過去に http://example.com といったURLで資料を配っている場合のことを考え、httpでアクセスしたユーザーに対し、httpsへリダイレクトさせておくと便利です。

設定ファイル内に書き込むだけなので特に難しいことはないのですが、色々な情報が出回っており、試した方法がことごとく失敗しました。
この方法であれば上手くいくと思いますので、ぜひ参考にしてください。

# 開発環境

* CentOS 6.8
* Apache 2.2.15 (Unix)

# 設定ファイル

Apacheの設定ファイルが ```/etc/httpd/conf.d/vhost.conf``` で行うと想定しています。

```bash:/etc/httpd/conf.d/vconf
# http経由をhttps経由にリダイレクト
<VirtualHost *:80>
  ServerName example.com:80
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^example\.com
  RewriteRule ^/(.*)$ https://example.com/$1 [R=301,L]
</VirtualHost>
# httpsの設定
<VirtualHost *:443>
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCertificateKeyFile   /etc/httpd/conf/ssl.key/server.key
  SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.crt
  SSLCertificateFile      /etc/httpd/conf/ssl.crt/server.crt
  DocumentRoot /var/www/html/example
  ServerName example.com:443
  CustomLog /var/www/html/example/access.log common
  ErrorLog  /var/www/html/example/error.log
  AddDefaultCharset UTF-8
  <Directory "/var/www/html/example/">
    Options Indexes FollowSymLinks
  </Directory>
</VirtualHost>
```

ApacheにSSL証明書を導入する部分に関しては、「[さくらVPSにSSL証明書を導入しHTTPS通信の構築](http://qiita.com/carat_yoshizaki/items/e6f39a5bfb99900b44b2)」にまとめていますので、こちらも参考になるかと思います。

最後に、設定ファイルを変更後、Apacheを再起動して、変更を反映させます。

```bash:Apacheの再起動
$ sudo service httpd restart
```


# おまけ

フォローお待ちしています！

* Qiita: [Carat 吉崎](http://qiita.com/carat_yoshizaki)
* twitter：[@carat_yoshizaki](https://twitter.com/carat_yoshizaki)
* はてなブログ：[Carat COOのブログ](http://carat-tech.hatenablog.com/)
* ホームページ：[Carat](http://caratinc.jp)

サービス紹介
「数学→プログラミング→Webアプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「[キカガク](https://kikagaku.net)」に興味のある方はお気軽にご連絡ください。
Raspberry Pi2 に I2S DACを接続する

Raspberry Pi2 で I2S DACを使ってみました。

Raspberry Pi 3 でも手順は一緒だと思います。

#環境
* Raspberry Pi 2 model B
 * OS:Raspbian 
* aliexepress で 7.59USDで売っている PCM5102Aのボード ([URL](https://www.aliexpress.com/item/PCM5102-DAC-Decoder-I2S-Player-Assembled-Board-32Bit-384K-Beyond-ES9023-PCM1794-compatible-Raspberry-Pi/32678406932.html))

#Raspberry Pi2とDAC基板の接続

| PCM5102A board | Raspberry Pi2 J8|
|:--|:--|
| BCK  | 12 GPIO1 PCM_CLK |
| DATA | 40 GPIO29 PCM_DOUT|
| LRCK | 35 GPIO24 PCM_FS|
| GND  | 39 GND|
| GND  | 接続してない|
| VCC  | 02 5V|

* PCM5102は3.3V駆動ですが、PCM5102Aボードに載っているレギュレータで3.3Vを生成するためにボードには5Vを供給します。


#RaspbianのI2S設定

* HiFiBerry DACの設定を使います。

##device treeの設定
* /boot/config.txtを編集
* ピンの設定をI2Sにして、ドライバとのマッピングをします。

```
dtoverlay=hifiberry-dac
```

##ドライバの設定
* 最近のRaspbianにはドライバが含まれているのカーネルのコンパイルは不要。
* /etc/modulesを編集。
* 起動時にドライバ snd_soc_hifiberry_dac をロードするようにします。 

```
snd_soc_hifiberry_dac
```

#I2Sのテスト
* ドライバの確認

```
pi@raspberrypi:~ $ lsmod
Module                  Size  Used by
binfmt_misc             6388  1
cfg80211              427855  0
rfkill                 16037  1 cfg80211
snd_bcm2835            20511  0
bcm2835_gpiomem         3040  0
snd_soc_bcm2835_i2s     6354  2
bcm2835_wdt             3225  0
snd_soc_pcm5102a        1763  1
uio_pdrv_genirq         3164  0
uio                     8000  1 uio_pdrv_genirq
snd_soc_hifiberry_dac     2511  0
snd_soc_core          125885  3 snd_soc_bcm2835_i2s,snd_soc_hifiberry_dac,snd_soc_pcm5102a
snd_pcm_dmaengine       3391  1 snd_soc_core
snd_pcm                75698  4 snd_bcm2835,snd_soc_core,snd_soc_hifiberry_dac,snd_pcm_dmaengine
snd_timer              19160  1 snd_pcm
snd                    51844  4 snd_bcm2835,snd_soc_core,snd_timer,snd_pcm
i2c_dev                 5859  0
fuse                   83461  3
ipv6                  347530  34
```

* サウンドデバイスの確認 card1に割り当てらています。
 * card 0, card 1の割り当てが起動毎に異なることがあります。

```
pi@raspberrypi:~ $ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

* 音の再生 card1を指定して再生します。

```
$ aplay -D hw:1,0 test.wav
Playing WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
```

#ドライバ
* linux kernelのドライバは　sound/soc/bcm のあたりにある。
 * https://github.com/raspberrypi/linux/tree/rpi-4.1.y/sound/soc/bcm
 * bcm2835-i2s.c が I2Sのドライバ、Raspbery Pi / Pi 2 / Pi 3 で共通みたいですけど。
 * hifiberry_dac.c　がHiFiBerry DACのドライバ
* PCM5102Aのドライバはsound/soc/codecs/pcm5102a.cにある。
seq2seqで利用可能な日本語対話データセットをダウンロードするツール

[knok/make-meidai-dialogue: Get Japanese dialogue corpus](https://github.com/knok/make-meidai-dialogue) というものを作りました。

# 背景

seq2seq実装をいくつか触ってみて、何かしらの知見を共有したいと思っているのですが、あまり具体例に踏み込んだ話題をなかなか見かけません。
その要因の一つに「日本語」で「対話」の「自由に利用できる」データセットがないことがあるのではないかと考えています。

個人的にTwitterから適度に対話を取得してくるスクリプトを一度作ったことがあったのですが、ノイズが多くかなり手作業でデータをクレンジングする必要がありました。
[LSTMで自然な受け答えができるボットをつくった](http://www.sekailab.com/wp/2015/11/02/lstm-general-responce-bot/)という記事を書かれた人は、ask.fmからデータをクローリングしていますが、やはり苦労はされているようです。

# 今回作ったもの

[githubのREADME](https://github.com/knok/make-meidai-dialogue)にも書きましたが、このツールは[日本語自然会話書き起こしコーパス（旧名大会話コーパス）](https://nknet.ninjal.ac.jp/nuc/templates/nuc.html)をダウンロードして整形するものです。
残念ながらこのコーパス自体は教育・研究目的のみの利用に限るため、整形したデータを直接配布することには問題があります。そのため、ダウンロードと整形処理までを自動化するところまでのスクリプトとして公開しています。

利用する際には[名大会話コーパス利用上の注意 ver. 2 (08-06-30)](http://telldev.cla.purdue.edu/chakoshi/meidai-chuui.html)を参照し、許可されている目的外の利用は避けてください。

## 使い方

READMEにもありますが、基本はmake allするだけです。個々のtargetが何をしているかはMakefileの中を見てください。

スクリプトはpython2/3対応したつもりなのですが、ロケールがCだとpython3でうまく動かなかったので、その時は例えばmake PYTHON=python2 などとしてpython2を指定するか、ロケールをja_JP.UTF-8にしてください。

## 生成ファイルの内容

```sequence.txt
input: (入力文)
output: (出力文)
:
```

先頭にinput/output:が付与され、それ以降がテキストになっています。

## 注意点

* inputは一意となっている(重複しているものは排除)
* 正規化なし(英数字等は全角)
* 人名部分は未処理(F/M000といった形式のまま)
* 同一人物の連続した発話は除外

# 日英翻訳データセット

日英翻訳であれば、いくつか公開されているデータセットはあるようです。

* [Wikipedia日英京都関連文書対訳コーパス](https://alaginrc.nict.go.jp/WikiCorpus/) 
  * 参照: [【機械学習】Google翻訳(みたいなもの)を自作してみた。](http://qiita.com/RyutaYoshi/items/9a809c0a03e02874fabb)
* [京都フリー翻訳タスク (KFTT)](http://www.phontron.com/kftt/index-ja.html) 
  * 参照: [seq2seq-attnニューラル機械翻訳を試す](http://qiita.com/kanjirz50/items/6c9cb7e69e05dd0e7820)

# 今後

実際にこのデータを使っていくつかのseq2seq実装の比較記事を書いてみようと思っています。
bash / ImageMagick > 画像の端を切りながらファイル形式の変換 > bashスクリプト

```txt:動作環境
CentOS 6.8
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Version: ImageMagick 6.7.2-7 2016-06-16 Q16 http://www.imagemagick.org
```

作成したpsファイルに対して以下をしたい。

- pngファイルに変換する
- 上下左右の余分な領域をカット

```conv_exec
#!/usr/bin/env bash

fmt='s/\.ps/\.png/g'

for dd in $(ls *.ps);do
	newfile=$(echo $dd | sed $fmt)
	convert -crop 430x360+50+350 $dd $newfile
	echo $newfile
#	break; # for debug
done
```

```txt:結果
$ bash conv_exec
```

上記でそのフォルダにあるpsファイルすべてをpngに変換する。

切り取り領域の指定(`430x360+50+350`)は実際にconvertをしながら目視調整した。

変換が終わったファイルに関しては以下で確認した。

- eog *.png
- Spaceを連打
   - アニメーション表示
iOS .ipaファイルのプロビジョニングプロファイルを入れ替える

XcodeでiOS向けのアプリケーションを作っていると検証のためなどに過去に作ったアプリケーション(.ipa)のプロビジョニングプロファイルだけを入れ替えたくなることがままあるのでスクリプトを作ってみた。

```bash:replace_mobileprovision
#!/bin/bash
# .ipaファイルを作業ディレクトリに展開する
# リリース用のipaは../Release-iphoneos/MyApplication.ipaと仮定
if [ $# -ne 2 ]; then
  echo "指定された引数は$#個です。" 1>&2
  echo "実行するには<ipaパッケージ> <プロビジョニング>の2個の引数が必要です。" 1>&2
  exit 1
fi

# 引数に渡されたファイル名を絶対パスに変換
ABS_BASE_PATH=$(cd "$(dirname "$1")" && pwd)
IPA_FILE_PATH=${ABS_BASE_PATH%/}/$(basename $1)
prov_base_path=$(cd "$(dirname $2)" && pwd)
PROV_FILE_PATH=${prov_base_path%/}/$(basename $2)
echo "${PROV_FILE_PATH}" 1>&2

# 作業ディレクトリを作成
TMPDIR=`mktemp -d build_temp.XXXXXX`
trap "rm -rfv ${TMPDIR}" EXIT

mkdir -p ${TMPDIR}/AdHoc-iphoneos
cd ${TMPDIR}/AdHoc-iphoneos

# 作業ディレクトリに１番目の引数に渡された.ipaファイルを展開
unzip "${IPA_FILE_PATH}"
PACKAGE_NAME=`ls Payload/`

# パッケージのファイル名に使えそうな値を取得しておく
BUILD_DATE=`date '+%Y%m%d'`
BUNDLE_VERSION=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "Payload/${PACKAGE_NAME}/Info.plist"`
BUNDLE_SHORT_VERSION_STRING=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "Payload/${PACKAGE_NAME}/Info.plist"`
BUILD_VERSION=${BUNDLE_SHORT_VERSION_STRING}-${BUNDLE_VERSION}
# ２番目の引数に渡されたプロビジョニングを検証するとともにプレーンテキストに
/usr/bin/openssl smime -in "${PROV_FILE_PATH}" -inform der -verify > $(basename $2)
TERM_NAME=`/usr/libexec/PlistBuddy -c "Print TeamName" $(basename $2)`

# KeychaneにインストールされているCodeSign用証明書からユニークIDを取り出す
CODE_SIGN_UID=`/usr/bin/security find-identity -p codesigning -v | grep "iPhone Distribution: ${TERM_NAME}" | sed -e 's/^[ ]*//g' | cut -d " " -f 2 | sort | uniq`

# ２番目の引数に渡されたプロビジョニングに入れ替えたパッケージを生成
# Entitlements.plistを取り出す
xcrun codesign -d --entitlements :- "Payload/${PACKAGE_NAME}" 2> /dev/null > "../../${PACKAGE_NAME}.xcent"
# AdHocやDebugではEntitlements.plistのget-task-allowがfalseでないとアプリが実行できない
/usr/libexec/PlistBuddy -c "Set get-task-allow NO" "../../${PACKAGE_NAME}.xcent"
# AdHocやDebugではEntitlements.plistにbeta-reports-activeエントリーがあるとアプリが実行できない
/usr/libexec/PlistBuddy -c "Delete beta-reports-active" "../../${PACKAGE_NAME}.xcent"
# ２番目の引数に渡されたプロビジョニングに入れ替え
cp "${PROV_FILE_PATH}" "Payload/${PACKAGE_NAME}/embedded.mobileprovision"
rm -rf "Payload/${PACKAGE_NAME}/_CodeSignature"
rm -f "Payload/${PACKAGE_NAME}/CodeResources"
# 新しいプロビジョニングに入れ替えたパッケージに署名する
xcrun codesign -f -s ${CODE_SIGN_UID} --entitlements "../../${PACKAGE_NAME}.xcent" "Payload/${PACKAGE_NAME}"
# 出来上がったパッケージの署名を検証する
xcrun codesign --no-strict -vvvv --verify "Payload/${PACKAGE_NAME}"
# パッケージを<パッケージ名>_<BUILD_VERSION>_fix.ipaにアーカイブ
zip -qr "${ABS_BASE_PATH%/}/${PACKAGE_NAME}-${BUILD_VERSION}_fix.ipa" Payload Symbols
rm -rfv ${TMPDIR}
```

2017/02/21 KeyChaneに同じデベロッパーの証明書が２つ以上インストールされているとエラーになるのを(なるべく)回避
シェルで"問答形式（Yes／No）" or "全てYes（-y, -Y）"

シェルスクリプトをそのまま実行した場合、"yes, Yes, YES, y, Y"の 5パターンに一致した場合は処理は継続され、"no, No, NO, n, N"の5パターンに一致した場合は処理はスキップ。

そしてシェルスクリプトのオプションに"-y, --yes"を指定した場合は、全て自動でYesが応答される処理を実装してみた。

以下、ソースコード。

```bash:yes_or_no.sh
#!/bin/bash
# ==================================================================
# オプションチェック
# ==================================================================
FLAG_Y=0
for OPT in "$@"
do
    case "$OPT" in
        '-y' | '--yes')
            FLAG_Y=1
            ;;
        '-h' | '--help')
            echo "Usage: $0 [-y, --yes] [-h, --help]"
            echo ""
            echo "optional arguments:"
            echo "  -y, --yes      answer all yes"
            echo "  -h, --help     show this help message and exit"
            ;;
    esac
done
shift $((OPTIND - 1))

# ==================================================================
# 実行内容
# ==================================================================
[ ${FLAG_Y} -eq 0 ] && echo "処理を実行しますか？[Y/N]"
while true;
do
  [ ${FLAG_Y} -eq 1 ] && READ_ANSWER="yes" || read READ_ANSWER
  case ${READ_ANSWER} in
    # yes, Yes, YES, y, Y の 5 パターンに一致。
    [yY]es | YES | [yY]) echo 'Yesが入力されました。処理を実行します。'
    # ==============================================================
      echo "yes, Yes, YES, y, Y が応答されました。";
    # ==============================================================
    break ;;
    # no, No, NO, n, N の 5 パターンに一致。
    [nN]o | NO | [nN]) echo "Noが入力されました。処理を終了します。"
    break ;;
    # 全ての文字列に一致。
    # つまり上記 6 パターンの何れでもない文字列が入力された場合の処理となる。
    * ) echo "YesかNoを入力してください。" ;;
  esac
done

exit 0
```
Unity5における共通定義のやり方

#はじめに
Unity5を使用したプロジェクトにおいて全体に波及させるような定義(define)が欲しい場合どうやって追加を行うのか簡潔にまとめる。

#Editor上で設定する場合
Editor上部にあるメニューからFile→BuildSettingsを選択し、開いた画面の下部にあるPlayerSettingsボタンを押すとインスペクターに設定項目が出る。
その設定項目からOther Settingsの中のScripting Define Symbolsのテキストを編集すれば自由に定義が可能。

###メリット
簡単。条件とか数字とか文字とかを無視出来るのであれば十分。

###デメリット
たとえばデバッグとリリースで定義を有効にしたり無効にしたり･･･といった制御ができない。


#コード上で定義する
例えばビルドの事前処理部分でSymbols(中身はただのstring)を設定してあげると良い。
```
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup, Symbols);
```
この時のSymbols文字列はEditor側で設定した文字列と同じ形式。
後は色々うまく処理してやれば自由に条件付けした定義で運用可能。
React Native 開発で packager のビルドキャッシュをクリアする方法

React Native の packager cli (デフォルト構成で始めて、`npm start` で起動するやつ) はビルドモジュールをキャッシュして、必要な部分のリビルドしかかからないようにしてくれているため、2度目以降のビルドが高速になって便利ですが、例えば、.babelrc を更新して babel オプションを変えた場合など、キャッシュを一旦クリアしたい場面があります。

そういう場合は、以下のコマンドでキャッシュがクリアできます。

    npm start -- --reset-cache

参考: https://github.com/facebook/react-native/issues/1924

***注意*** 上のスレッドを見てもわかるように、クリアの手順が度々変わっているようなので、上のコマンドでうまく行かない場合は、上のスレッドを漁ってみてください。クリアに成功している場合は、js バンドルのフルビルドが走るため、数十秒 ~ 数分程度のビルド時間がかかるはずです。
Ruby on Rails のマイグレーションで references によって has_one, belongs_to 関連を作るときに unique 制約をつける

例えば、人間と種（たね）のモデルを作り、それらを関連付け、
「ひとりひとり違う種を持つ」という制約を加えたい場合、 has_one 関連を用います。

```
$ bin/rails g model Seed person:references
```

とすると

```rb
    create_table :seeds do |t|
      t.references :person, index: true, foreign_key: true
      # 略
    end
```

という内容のマイグレーションができます。
データベース上でも制約を付けたい場合、person_id もユニークにしたいので、

```rb
t.references :person, index: { unique: true }, foreign_key: true
```

とすることで、データベースにも制約をつけることができます。

## 補足

厳密には、index: にハッシュを渡すことで、 add_index メソッドに渡せるオプションを渡すことができます。

t.references は t.belongs_to とすることもできます。
Apacheでwww無しドメインをwww有りに強制リダイレクト

# はじめに

よくウェブサイトには、www.example.com のようにドメインを設定するのですが、通常の設定のままだとユーザーが直接URLを入力する際には、example.com のようにアクセスすることが多いと思います。
example.com にアクセスした際にも www有りに強制するには example.com に対して、www.example.com にリダイレクトするように設定しておけば大丈夫です。

設定ファイル内に書き込むだけなので特に難しいことはないのですが、色々な情報が出回っており、試した方法がことごとく失敗しました。
この方法であれば上手くいくと思いますので、ぜひ参考にしてください。

# 開発環境

* CentOS 6.8
* Apache 2.2.15 (Unix)

# 設定ファイル

Apacheの設定ファイルが ```/etc/httpd/conf.d/vhost.conf``` で行うと想定しています。

```bash:/etc/httpd/conf.d/vconf
# example.com は強制リダイレクト
<VirtualHost *:80>
  ServerName example.com:80
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^example\.com
  RewriteRule ^/(.*)$ https://www.example.com/$1 [R=301,L]
</VirtualHost>

# www.example.com に関する設定ファイル
<VirtualHost *:80>
  DocumentRoot /var/www/html/example/
  ServerName www.example.com:80
  CustomLog /var/www/html/example/access.log common
  ErrorLog  /var/www/html/example/error.log
  AddDefaultCharset UTF-8
  <Directory "/var/www/html/example">
    Options Indexes FollowSymLinks
  </Directory>
</VirtualHost>
```

設定ファイルを変更後、Apacheを再起動して、変更を反映させます。

```bash:Apacheの再起動
$ sudo service httpd restart
```


# おまけ

フォローお待ちしています！

* Qiita: [Carat 吉崎](http://qiita.com/carat_yoshizaki)
* twitter：[@carat_yoshizaki](https://twitter.com/carat_yoshizaki)
* はてなブログ：[Carat COOのブログ](http://carat-tech.hatenablog.com/)
* ホームページ：[Carat](http://caratinc.jp)

サービス紹介
「数学→プログラミング→Webアプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「[キカガク](https://kikagaku.net)」に興味のある方はお気軽にご連絡ください。
リモートリポジトリのブランチを一気に削除する

# リモートリポジトリのブランチを削除したい
- もう使わないので整理。
- マージ済みのやつは問答無用で削除。
- マージ済みでないやつは、開発中のブランチは削除しない。

#### ******リモートの削除なので、削除されるブランチを一旦確認してから実行してください。******
#### 作業の前後でfetchして最新にしつつ `$ git br -a | grep origin/ | wc -l`とかすれば削除されているのが確認できる。
#### 以下のマージ済/未マージの分け方は、わかりやすいから分けているだけ。最初の一覧はgit br -aとかで一気に指定してもOK

# 環境
Mac

# 手順
##  追跡ブランチを最新にする

```
$ git fetch --prune [リポジトリ名]
```

## リモートリポジトリ（ex. originリポジトリ）のマージ済みブランチを削除
- 1. マージ済みの追跡ブランチ一覧
- 2. originリポジトリの追跡ブランチ一覧
- 3. master、HEAD（よくわからん）を除く
- 4. origin/XXXXXXを、XXXXXXに置換
- 5. リモートリポジトリにあるブランチを削除（このコマンドだけ消して、削除対象のブランチを確認したほうがいい）

```
$ git br -a --merged | grep remotes/origin/ | grep -v -e remotes/origin/master -e remotes/origin/HEAD | sed -e 's%remotes/origin/\(.\)%\1%g' | xargs git push --delete origin
```

## リモートリポジトリ（ex. originリポジトリ）の未マージブランチを削除
- 1. 未マージの追跡ブランチ一覧
- 2. originリポジトリの追跡ブランチ一覧
- 3. 削除したくないブランチ（以下の例だとrelease、developing_branch）を除く
- 4. origin/XXXXXXを、XXXXXXに置換
- 5. リモートリポジトリにあるブランチを削除

```
$ git br -a --no-merged | grep remotes/origin/ | grep -v -e remotes/origin/release -e remotes/origin/developing_branch | sed -e 's%remotes/origin/\(.\)%\1%g' | xargs git push --delete origin
```

## リモートリポジトリ（ex. upstreamリポジトリ）のブランチを削除
##### マージ済みとか関係なくこっちは一気に削除。
- 1. 追跡ブランチ一覧
- 2. upstreamリポジトリの追跡ブランチ一覧
- 3. master, releaseブランチは除く
- 4. remotes/upstream/XXXXXXを、XXXXXXに置換
- 5. リモートリポジトリにあるブランチを削除

```
$ git br -a | grep remotes/upstream/ | grep -v -e upstream/release -e upstream/master | sed -e 's%remotes/upstream/\(.\)%\1%g' | xargs git push --delete upstream
```
kintone プラグイン開発 on Mac

#Mac におけるプラグイン開発環境

[kintone プラグイン開発 on Windows Subsystem for Linux](http://qiita.com/rex0220/items/820e09303bede3cc21b4) を書いたので、mac についても書いておきます。

mac は、最初から bash が使えますので、kintone plugin-sdk を準備するだけです。

- kintone plugin-sdk の準備
- ターミナルを起動して、kintone プラグインパッケージ作成

パッケージ処理時間は、純正だけあって、ほとんど待ち時間なしで完了します。

Windows と比べると、簡単な準備だけでプラグイン開発を行えますのでオススメです。
XYPicの使い方(初歩)

まずはパッケージを読み込みます。

```latex
\documentclass{jarticle}
\usepackage[all]{xy}
\begin{document}
```

基本的な行列表示から見ていきましょう

![スクリーンショット 2016-11-10 13.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/6734/7579339e-13b2-117e-4290-1b95aa5d9027.png)

```latex
$$
\xymatrix{
A & B \\
C & D \\
}
$$
```

矢印を伸ばしてみます

![スクリーンショット 2016-11-10 13.23.29.png](https://qiita-image-store.s3.amazonaws.com/0/6734/c697d650-e8a2-2d2d-d99c-db45e41d6d8d.png)

```latex
$$
\xymatrix{
A \ar[r] & B \\
C & D \\
}
$$
```

左に
![スクリーンショット 2016-11-10 13.24.21.png](https://qiita-image-store.s3.amazonaws.com/0/6734/dfe81992-469f-396a-88f8-05834578e6b9.png)

```latex
$$
\xymatrix{
A  & B\ar[l] \\
C & D \\
}
$$
```

下に

![スクリーンショット 2016-11-10 13.23.50.png](https://qiita-image-store.s3.amazonaws.com/0/6734/43fcb1c6-0392-1cbe-4794-30a05486c847.png)

```latex
$$
\xymatrix{
A\ar[d]   & B\\
C & D \\
}
$$
```

曲げてみます

![スクリーンショット 2016-11-10 13.24.41.png](https://qiita-image-store.s3.amazonaws.com/0/6734/2bc190b8-2565-1646-49d3-824c42cccc2f.png)

```latex
$$
\xymatrix{
A\ar@(ur,ul)[r]   & B\\
C & D \\
}
$$
```

文字を載せてみます
![スクリーンショット 2016-11-10 13.25.05.png](https://qiita-image-store.s3.amazonaws.com/0/6734/c0495579-ff01-0960-57b1-fda08387ac2f.png)

```latex
$$
\xymatrix{
A \ar[r]^f & B \\
C & D \\
}
$$
```

曲げて文字を載せてみます
![スクリーンショット 2016-11-10 13.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/6734/1401759b-5c1c-7fd6-5e83-a8152ced758f.png)

```latex
$$
\xymatrix{
A\ar@(ur,ul)[r]^f   & B\\
C & D \\
}
$$
```



可換図を描いてみます
![スクリーンショット 2016-11-10 13.25.37.png](https://qiita-image-store.s3.amazonaws.com/0/6734/442ba1c2-6699-a22d-f391-5c7005a1e56b.png)

```latex
$$
\xymatrix{
A \ar[r]^f \ar[d]^g & B \ar[d]^k \\
C \ar[r]^l & D \\
}
$$
```

# ツールを作ってみました。

複雑な図式だと表示が崩れてきて記述が大変になるようです。
簡単なMac用のツールを作ってみました。

![スクリーンショット 2016-11-10 18.00.03.png](https://qiita-image-store.s3.amazonaws.com/0/6734/dea96c3d-7a19-c215-486a-3b4c461587fa.png)

RDXYPicSupport
https://github.com/KatagiriSo/RDXYPicSupport/tree/master

previewを押すと右側にテキストが吐き出されます。
LatexItと組み合わせれば少し楽になるのではと思います。
機能を足していきたいです。

## 参考
http://www.math.u-ryukyu.ac.jp/~tsukuda/computer/tex/files/xypic-example.pdf
http://www.math.sci.hokudai.ac.jp/~abenori/tex/index.html#xy-pic
Ansible を書くときの自分ルール

Ansible をそこそこ書いてきて、自分なりに気をつけているところ記載。自分ルールなので他の人からすると、違うところもあるかもしれないが元々の Ansible のコンセプトからも外れないように、公開した時に使う人からも使いやすい事を目標にしている。気づいたら適時追加する。

一言でいうと **Simple is Best** を貫く。生産性や他の人への伝わりやすさ使いやすさを重視する。

## 作るときに特に意識する事
* できるだけ複雑に書かない・表現しない
* **"こだわり・エゴ"**は極力排除する
    * エテしてこの部分にシツコイと複雑になるし、周りにも受け入れられない（ハズ）
* 他の人でも直ぐに理解できるようイレギュラーな事、トリッキーな書き方はしない

## Playbook中に「#」によるコメントは書かない
* 説明は **name** により簡潔に書く

## コマンド系モジュールを使う時は最後の砦
* 既存モジュールで対応できるかを先に考える
    * 特に、sed , awk , sort なんかを``raw``や``shell``モジュールでやろうとした場合、Ansible 側にさえリコメンドされることがある

## タスクは1行書きを意識する
* 引数が極端に多くない、列数が右に流れすぎないのであれば
* 行数は少ないほうが全体が見やすいからスクロールしなくていい

## ブール値や state は変数にしない
* yes/no , true/false など
* state の present/absent など

## 条件分岐をいたずらに増やさない
やろうと思えばできるところもあるが、あまりプログラムちっくになるのは避ける。**職人芸**はいらない。

## jinja2 のフィルタ、多用は禁物
プレイブック中に複数使われだすと、なんだか見た目が汚く見えると同時になんか他にもっといいやり方があるんじゃないか？と思いたくなる。

## 変数について
Role 利用字に必要な変数は defaults/ 下に置き、原則的にユーザはここを編集させない（ロールそのものをカスタムするなどを除く）。ユーザが変数をカスタマイズする場合は vars/ 下で行うようにする。

## べき等を意識する
ここを外すと用途がブレる。（無1回ポッキリのツールとして割り切り、恩恵半分をわかった上で使うならよいが・・・）

## 新しく追加された機能は積極的に使う
使うことで、更にコード行数を減らせる可能性が秘めているものがまれにある。
> 「今までは複数のタスクを数十行書いていたのが、ループ処理の拡張により数行になった」など
Google App Engine（GAE）でPHPを最速で動かしつつ概要を把握する

## Google Cloud Platform（GCP）とGoogle App Engine（GAE）
GCPは、AWSと同じようなクラウドサービスです。
比較に関しては各所で行われているので、ここでは割愛します。

GAEはGCPが提供しているPaaSサービスで、Googleがサーバ運用やスケールアウト等を自動でしてくれる素敵なサービスです。
簡単に言うとHerokuと同じでプログラム書いてデプロイするだけなので、サーバの知識が無くてもOK。
もちろん制約はありますが、サーバを一切気にしなくて良いのは魅力的です。



## 事前準備
GoogleのサービスなのでGmailアカウントを準備しましょう。
次に、[**こちら**](https://cloud.google.com/)からGCPに登録します。無料トライアルあります。
そして、[**こちら**](https://cloud.google.com/appengine/downloads)からSDKをダウンロードしてインストールします。
**※GAEのSDKは赤枠のリンク**

![SDK.png](https://qiita-image-store.s3.amazonaws.com/0/28985/7511296c-4157-7a15-8a92-84030d2fddd3.png)


## プロジェクト作成
GCPのヘッダーからプロジェクト「gae-test」を作成します。
発行されるプロジェクトIDは「gae-test-xxx」となります。プロジェクトIDは後で使うのでメモしておいて下さい。
![プロジェクト.png](https://qiita-image-store.s3.amazonaws.com/0/28985/5b676ed1-f989-9db8-1915-84e421b73ab0.png)



## GAEの画面にアクセス
左上のハンバーガーメニューから「App Engine」にアクセスします。
初めての場合はチュートリアルが始まるとは思いますが、今回はチュートリアルとは違う方法で進めるので興味がある人はどうぞ。


## 開発
GoogleAppEnginLauncherを起動し、左下の「+」からApplicationを作ります。
Application ID：「プロジェクト ID」を指定。今回は「gae-test-xxx」。
Application Derectory：自由に指定して下さい。
Runtime：PHP。

こんな感じになればOK。
![ランチャー.png](https://qiita-image-store.s3.amazonaws.com/0/28985/c7b80dee-f5d1-406c-732c-d495b6606b5f.png)


指定したディレクトリ直下に「gae-test-xxx」ディレクトリが作成され、デフォルトファイルが生成されます。

```
[gae-test-xxx]$ ls -1
app.yaml
favicon.ico
main.php
```

## app.yaml
これがGAEを使う上での最重要ファイルで、apacheの設定に似ています。
例えば、WordPress用に準備されてる[**こちら**](https://github.com/GoogleCloudPlatform/appengine-php-wordpress-starter-project)のapp.yamlを見るとイメージ湧きやすいと思います。

## デバッグ
GoogleAppEnginLauncherの左上にある「Run」をクリックして下さい。
起動に成功すると「Browse」がクリック出来るようになるので、そこをクリックするとブラウザが起動してデバッグが出来ます。
GAEと同じ環境を準備してくれてるそうです。

デフォルトだと、app.yamlでmain.phpにアクセスするように記述されています。
main.phpはお決まりの"Hello world!"を出力するようになっているので、こんな感じで表示されたら成功です。

![debug.png](https://qiita-image-store.s3.amazonaws.com/0/28985/9ad89659-3549-4fad-5b30-d85fcd0150c5.png)


## Deploy
GoogleAppEnginLauncherの右上にある「Deploy」をクリックして下さい。
これだけでデプロイが完了します。FTPでアップロードされると考えたらイメージ湧きやすいと思います。
GAEの画面にアクセスして、「バージョン」メニューをクリックすると、こんな画面が表示されます。
バージョンが1と表示されていますが、これはapp.yamlに記載されている「version」で指定した文字列です。
これを2とするとバージョンがもう一列増えて2が出てきます。
こんな感じです。
![デプロイ後2.png](https://qiita-image-store.s3.amazonaws.com/0/28985/a76c6784-4989-39a8-d95d-baa80282cbeb.png)

app.yamlの「version」を使えばBlue/Greenデプロイが出来ます。2を選んで「トラフィックを移行」すると2が公開されます。
git等のバージョン管理ではなく、デプロイ単位のバージョン管理が出来るのも良いです。
公開されて無くても「デバッグで表示」で内容も確認可能です。

## 最後に
開発環境もデプロイもSDKのみで完結するので、環境毎の設定も必要無いのはかなりのメリットかなと感じました。
今回はGUIで行いましたが、gcloudコマンドとかもあるので、コマンドラインから操作することも可能です。
デメリットや対策は需要がありそうだったら書こうかなって思います。
経験1年の人間が考える、Djangoの利点・欠点

#そもそもDjangoってどういうフレームワークなの
Djangoは、私の感触ではRailsともExpressとも違う、例えの難しいフレームワークだと思っています
個人的には、**ちょっとでかいExpress+大量のバッテリー**と思っています

##何故そう思うか
フレームワーク自体がRailsと比べて単純な上、豊富な便利にWebサイトを作れる**バッテリー**を持ち合わせているからです

# メリット

##単純な構成
Railsはappやconfigや色々なファイルがあるのに比べ、Djangoの場合は大抵以下のファイルしかありません

- アプリ名
    - migrations
    - templates（HTMLファイルを置く場所）
        - 適当なHTML
    - \_\_init\_\_.py（何もないファイル）
    - test.py（テスト用。大抵後でファイルにする）
    - urls.py（URLを書く所）
    - models.py（モデルをORMで書く所）
    - forms.py（フォームに関する記述）
    - apps.py（アプリ名）
    - views.py（URLに応じて色んな処理をする所）

この構成だとviewsが長くなる問題点がありますが、分割したりロジックだけ別コードに書き出したりするという手段が使えるので、意外と問題が生じません

##豊富なバッテリー

- 自動生成されるAdminページ（データを管理出来る所）
- CRUDフォームが簡単に作れる

### 簡単にCRUDフォームが作れる
色々書くと長くなるので端折りますが、例えばユーザーの新規作成は以下だけで出来ます

```py3:views.py
from django.contrib.auth.forms import UserCreationForm
from django.views.generic.edit import CreateView
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User

    
class CreateUser(CreateView):
    model = User
    form_class = UserCreationForm
    template_name = "user.html"

    def get_success_url(self):
        return reverse('index')
```

~~importが長いのはPythonの仕様なので諦めて下さい~~
このコードから、Djangoの以下の特徴を導き出せます

- そもそもUserモデルが自動生成されている
- モデルの新規作成を割と簡単に出来る

その上、標準でまともな暗号技術を使ってくれる為、暗号技術を知る必要性も無いので楽です

### 地味にカバー範囲が広い
他の記事でも書きましたが、ストリーミング配信にも対応している為、SSEにも理論上は対応可能です

# デメリット

## 割とレガシー
標準ではSassもBabelもTypeScriptも使えませんし、使えるようにする処理が結構めんどくさいです

## 日本語の情報が少ない
日本での使用例が少ない為、当たり前のように英語を読まされる事になります
それに、日本人同士での情報交換がしにくかったり、仕事が少なかったりします

## そんなに速くない
フルスタックフレームワークなので仕方ない箇所ではありますが、他のフレームワーク等と比べて速度面での優位性はそこまでありません

## CSRF Tokenがウザい
Ajaxを使うとCSRF Tokenを通さないとブロックされます、地味にウザいのが問題です

# デメリットをカバーする方法

- Django REST Frameworkを使い、フロントエンドはNodeに全て丸投げする
- 英語を覚える
- ロジック箇所がボトルネックになっている場合は、PyPyにぶん投げる
- セキュアなことに安心感を覚える

# 最後に
この記事でDjango使ってみようと思う方が居たら幸いです
それと、私の腕で分析出来る範囲はこの程度ですので、補足等が出来る方がいらっしゃったらぜひお願いします
JavaからGoogleSpreadsheetに書く その1(Google側設定)

やりたいこと
===========

Javaのスタンドアロンプログラム(Digdagのsh>での起動を想定)からGoogleSpreadsheetに書き込む

やったこと
=========

1. 使用API有効化、認証情報ファイル作成
-----------------------------------

Googleログイン済のブラウザで https://console.developers.google.com/ にアクセス

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/c58630df-7382-aa56-6c27-cec812228651.jpeg)

「プロジェクトを作成」を押下

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/1bff82eb-f6af-d8c1-93ae-50899bfd627d.jpeg)

適当なプロジェクト名を入力して「作成」を押下

![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/40595fe4-72de-096c-a3dc-1330d602eb8c.jpeg)

「Google Apps API」配下の「Drive API」を押下

![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/75092ee9-6974-9491-ffab-cd0ef27da7f3.jpeg)

「有効にする」を押下

![15.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/6d3ca9fa-f3a3-7008-42f3-4a84cb67180e.jpeg)

「←」を押下

![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/40595fe4-72de-096c-a3dc-1330d602eb8c.jpeg)

「Google Apps API」配下の「Sheets API」を押下

![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/589e3028-3bb0-533d-0bfb-e0fe36c3a58a.jpeg)

「有効にする」を押下

![16.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/92814e6b-0ab0-af58-9511-19a118f5a198.jpeg)

「認証情報」を押下

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/cf073bfd-f444-985c-c1e8-04d196f2dd3f.jpeg)

「認証情報を作成」を押下

![17.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/ec4c77bd-e326-805f-4d75-5a222ee84397.jpeg)

「OAuthクライアントID」を押下

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/0eaa6c71-6352-9d9f-b238-26574cf9578e.jpeg)

「その他」を選択、適当な名前を入力して「作成」を押下

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/9dd7f9fe-1ec9-26cb-5461-76a21aa1cccd.jpeg)

「OK」を押下

![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/112363/ef77c2cd-359f-51af-8c1e-2ed1751feadc.jpeg)

右下のダウンロードアイコンを押下してJSONファイルをダウンロード

2. Java側
---------

http://qiita.com/pilot/items/be778ed87170f96ddaf7 にて
いまさらNSMutableAttributedStringでRange or index out of bounds


## *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSConcreteTextStorage attribute:atIndex:effectiveRange:]: Range or index out of bounds' *** 

UITableView 上に Custom Cell を作成して、NSMutableAttributedStringを装飾して使用していました。

部分的に下記のコードで、

```swift
cell.bodyTextView.attributedText = nil
```
表示非表示を対応していましたが。。。
該当のCellを選択するとが```Range or index out of bounds```でcrushしてしまう不具合が派生していました。

## 答えは特殊な設定にありました。

```swift
// NOTE: リンクのみ選択を許可
override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let glyphIndex = self.layoutManager.glyphIndex(for: point, in: self.textContainer)
        let characterIndex = self.layoutManager.characterIndexForGlyph(at: glyphIndex)
        // NOTE: textStorageが空の場合でcrashする
        guard let _ = self.textStorage.attribute(NSLinkAttributeName, at: characterIndex, effectiveRange: nil) else {
            return nil
        }
        
        return self
}
```

cellの選択とリンクの選択を取得する為にhitTestでtextStorage内のテキストを判定していた為でした。

```swift
// NOTE: リンクのみ選択を許可
override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let glyphIndex = self.layoutManager.glyphIndex(for: point, in: self.textContainer)
        let characterIndex = self.layoutManager.characterIndexForGlyph(at: glyphIndex)
        // NOTE: textStorageが空の場合でcrashする
        if self.text.isEmpty {
            return nil
        }
        
        guard let _ = self.textStorage.attribute(NSLinkAttributeName, at: characterIndex, effectiveRange: nil) else {
            return nil
        }
        
        return self
}
```


予期しないcrashが多発する辛い事象でした。。
WordPressインストール・初期設定チート


先にDBは作る必要あり。
1.WP CLIのインストール
2.WordPressコアのダウンロード（wpディレクトリ）
3.index.phpの移動
4.コンフィグ設定、WordPressのインストール

```bash
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar --info
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
mkdir wp
wp core download --path="./wp" --locale="ja"
mv ./wp/index.php ./index.php
sed -e 's/wp-blog-header/wp\/wp-blog-header/g' ./index.php > ./index-new.php
mv index-new.php index.php
cd ./wp
wp core config --dbname=wp --dbpass=wordpress --dbuser=wp
wp core install --url={サイトURL} --title="sample site" --admin_user="user" --admin_password="password" --admin_email="{メールアドレス}"
```
Javaで外部プロセス実行(システムコール)を行う

# Javaで外部プロセス実行(システムコール)を行う

## 目的
* Java アプリケーションから外部プロセスを実行する
* 外部プロセスを実行した結果を取得する

## 実行環境
* OS：Windows 7
* 言語：Java 8
* 開発環境：eclipse 
* 今回呼び出す外部プロセス：notepad, mecab

## 外部プロセスを実行する(サンプル：メモ帳を起動する)
メモ帳が起動したら成功

### SystemCall.java

```java:SystemCall.java
import java.io.IOException;


public class SystemCall {

	public static void main(String[] args) {
		String[] Command = { "cmd", "/c", "notepad.exe"}; // 起動コマンドを指定する
		Runtime runtime = Runtime.getRuntime(); // ランタイムオブジェクトを取得する
			try {
				runtime.exec(Command); // 指定したコマンドを実行する
			} catch (IOException e) {
				e.printStackTrace();
			}
	}

}
```

## 外部プロセスを実行した結果を取得する(サンプル：mecabで形態素解析を行った結果を取得する)

### SystemCall2.java

```java:SystemCall2.java
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class SystemCall2 {

	public static void main(String[] args) throws IOException {
		Runtime runtime = Runtime.getRuntime();
		String analysisFilePath = "C:/Users/suzuki_y/Documents/analysisObject.txt"; // mecabで形態素解析したいtxtファイルを指定

		String[] Command = { "cmd", "/c", "mecab.exe " + analysisFilePath }; // cmd.exeでmecab.exeを起動し指定したファイル(filePath)を形態素解析する

		Process p = null;
		File dir = new File("C:/Program Files (x86)/MeCab/bin");// 実行ディレクトリの指定
		try {
			p = runtime.exec(Command, null, dir); // 実行ディレクトリ(dir)でCommand(mecab.exe)を実行する
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			p.waitFor(); // プロセスの正常終了まで待機させる
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		InputStream is = p.getInputStream(); // プロセスの結果を変数に格納する
		BufferedReader br = new BufferedReader(new InputStreamReader(is)); // テキスト読み込みを行えるようにする

		while (true) {
			String line = br.readLine();
			if (line == null) {
				break; // 全ての行を読み切ったら抜ける
			} else {
				System.out.println("line : " + line); // 実行結果を表示
			}
		}
	}
}
```
SSISでスクリプトタスクのWarningをlogに出力する

SSISのスクリプトタスクってとてもデバッグするのが面倒。
特にForeachタスクの中にある場合。

ところが、デフォルトの設定では、ScriptTask内のDts.logメッセージで出力した内容はログに出力されません。

大まかな内容は公式を参照してください。
Integration Services (SSIS) のログ記録
https://msdn.microsoft.com/ja-jp/library/ms140246(v=sql.120).aspx

スクリプト タスクでのログ記録
https://msdn.microsoft.com/ja-jp/library/ms136131(v=sql.120).aspx


スクリプトタスクのログ記録をするには次の手順を踏みます。

1.  [スクリプトタスク]のプロパティで LoggingMode を 既定のUseParentSettingからEnabledに変更
2.  DTSS メニューの [SSIS] > [ログ記録] を選択し、構成ダイアログを表示する。
3.  ログ記録を追加する。
4.  左ペインのツリービューで該当のスクリプトタスクを探してチェックボックスにチェックを入れ、右側のメインにある[詳細]タブをクリックする。
5.  [詳細]設定で[ScriptTaskLogEntry]にチェックを入れる。
6.  パッケージを保存して、デバッグ実行！

自分はデフォの状態で、ScriptTaskLogEntry が表示されなくて困りました。
「SSIS Log ScriptTaskLogEntry not found 」で検索したり。

特に上記の1の手順は重要です。
＃他の方法ご存知の方おしえてくらはい。
Ruby | 配列の中に任意個のハッシュを作る

こんな感じ。

```rb
Array.new(3) { Hash.new }

# => [{}, {}, {}]
```

# 他の書き方

~~こうも書けた。~~ 

書けなかった。コメント欄参照。

```rb
Array.new([Hash.new]*3)

# => [{}, {}, {}]
```

# 環境

- ruby 2.3.1









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Macにrvmをインストールする

公式サイトからrvmをインストール方法をメモ
※gem、githubからもインストール可能

[rvm公式サイト](https://rvm.io/rvm/install)

## 準備
Public key を取得
　`$ brew install gpg2`
　`$ gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3`

## rvmインストール
rvmのインストール
　`$ curl -sSL https://get.rvm.io | bash`
.profileを再読み込み
　`$ source ~/.profile`


オプションについては[公式サイト](https://rvm.io/rvm/install)を参考に。
Rubyを併せてインストール場合は
　`$ curl -sSL https://get.rvm.io | bash -s stable --ruby`