OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQLにおけるパーティショニングの実装


大規模なテーブルを展開して処理する前処理プログラムを書いている中で，そもそも自機のメモリにデータが全展開するだけの容量がなく，プログラムを複数回に分散して省メモリ化したいと考えたので，今後のためにもテーブルパーティションに関してメモしておく．

実はPostgreSQLではパーティショニングに関する専用の組み込み機能を持たないらしい．．そこでテーブルの継承を利用して機能を実装する．

##親テーブル（マスターテーブル）の定義

まず最初に全てのパーティションが継承する親テーブルを宣言する．このテーブルには実データを格納せずに全て子テーブルに分散して格納する．

```
## サンプルテーブル

CREATE TABLE test (
    id bigint PRIMARY KEY,
    name character varying,
    date timestamp without time zone,
    content character varying
);
```

##子テーブル（サブテーブル）の定義
次に，実データの格納先となる親テーブルを継承した子テーブル定義する．テーブルにはそれぞれCHECKで検査制約を付与する．この検査制約によってデータの格納するパーティションを決定するが，この時に1つのデータが複数のパーティションに共存しないように検査制約を設定する必要がある．

```
CREATE TABLE test_2012 (
    CHECK ( date >= TIMESTAMP WITHOUT TIME ZONE '2012-01-01' AND date < TIMESTAMP WITHOUT TIME ZONE '2013-01-01')
) INHERITS (test);
CREATE TABLE test_2013 (
    CHECK ( date >= TIMESTAMP WITHOUT TIME ZONE '2013-01-01' AND date < TIMESTAMP WITHOUT TIME ZONE '2014-01-01')
) INHERITS (test);
CREATE TABLE test_2014 (
    CHECK ( date >= TIMESTAMP WITHOUT TIME ZONE '2014-01-01' AND date < TIMESTAMP WITHOUT TIME ZONE '2015-01-01')
) INHERITS (test);
CREATE TABLE test_2015 (
    CHECK ( date >= TIMESTAMP WITHOUT TIME ZONE '2015-01-01' AND date < TIMESTAMP WITHOUT TIME ZONE '2016-01-01')
) INHERITS (test);
CREATE TABLE test_2016 (
    CHECK ( date >= TIMESTAMP WITHOUT TIME ZONE '2016-01-01' AND date < TIMESTAMP WITHOUT TIME ZONE '2017-01-01')
) INHERITS (test);
```

同時に，この検査制約によってINSERTに遅延が発生するので各子テーブルにインデックスを貼り処理の高速化を計る．

```
CREATE INDEX test_2012_date_idx ON test_2012 (date);
CREATE INDEX test_2013_date_idx ON test_2013 (date);
CREATE INDEX test_2014_date_idx ON test_2014 (date);
CREATE INDEX test_2015_date_idx ON test_2015 (date);
CREATE INDEX test_2016_date_idx ON test_2016 (date);
```

##トリガ関数の定義
最後に親テーブルにデータがINSERTされた時に，適切なパーティションにデータが中継されるようにトリガ関数を定義する．

```
CREATE OR REPLACE FUNCTION test_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
    IF ( NEW.date >= TIMESTAMP WITHOUT TIME ZONE '2012-01-01' AND
         NEW.date < TIMESTAMP WITHOUT TIME ZONE '2013-01-01' ) THEN
        INSERT INTO test_2012 VALUES (NEW.*);
    ELSIF ( NEW.date >= TIMESTAMP WITHOUT TIME ZONE '2013-01-01' AND
            NEW.date < TIMESTAMP WITHOUT TIME ZONE '2014-01-01' ) THEN
        INSERT INTO test_2013 VALUES (NEW.*);
    ...
    ELSIF ( NEW.date >= TIMESTAMP WITHOUT TIME ZONE '2016-01-01' AND
            NEW.date < TIMESTAMP WITHOUT TIME ZONE '2017-01-01' ) THEN
        INSERT INTO test_2016 VALUES (NEW.*);
    ELSE
        RAISE EXCEPTION 'Date out of range.  Fix the test_insert_trigger() function.';
    END IF;
    RETURN NULL;
END;
$$
LANGUAGE plpgsql;
```

この関数を定義した後，上記のトリガ関数をクライアントからのINSERTからよぶトリガをテーブルに定義して完了である．

```
CREATE TRIGGER insert_test_trigger
    BEFORE INSERT ON test
    FOR EACH ROW EXECUTE PROCEDURE test_insert_trigger();

```
実際にあった scala.App の怖い間違い

今日見たかもしれない話。

Scala を学び始めると比較的最初の方に出て来るであろう `scala.App` ってありますね。 継承すると `def main()` を定義しなくて良いやつ。

```scala
object Main extends App {
  println("Hello World")
}
```

`main()` 関数が生えるので、次のように実行できます。

```scala
Main.main(Array()) // Hello World が印字される
```

これで App の使い方は覚えました。

さて、次のように同じような object が２つあったとします(`Main1` と `Main2`)。

```scala
object Main1 extends App {
  def printClassName(): Unit = println("Main1")

  println("Start")
  printClassName()
  println("Finish")
}

object Main2 extends App {
  def printClassName(): Unit = println("Main2")

  println("Start")
  printClassName()
  println("Finish")
}
```

似たような処理が複数箇所にあるのは良くないので、共通の親クラス(`SuperMain`)にまとめます。

```scala
trait SuperMain extends App {
  def printClassName(): Unit

  println("Start")
  printClassName()
  println("Finish")
}
object Main1 extends SuperMain {
  def printClassName(): Unit = println("Main1")
}
object Main2 extends SuperMain {
  def printClassName(): Unit = println("Main2")
}
```

… さて、何を間違ったでしょうか？
caskのパッケージ読み込み

emacsのカスタマイズをしようとしたら、caskで詰まったので、備忘録として。
（pathの設定を直せばいい気がするけど、やり方がわからなかったので応急処置として）
cask自体は以下を参考
- http://cask.readthedocs.io/en/latest/guide/usage.html
- http://vdeep.net/emacs-cask
- http://qiita.com/tadsan/items/6c658cc471be61cbc8f6
- http://syohex.hatenablog.com/entry/20140424/1398310931


さて、はまったのは、 `cask install`と`cask update`のパスが、emacs-24.5に通っていた点。
emacs-25.2を使用していたので、パッケージがインストールされず、elispで読み込めなかった。

この場合、以下のようにEMACSのオプションをつけたら、きちんとパッケージがインストールされた。
```
$ EMACS="emacs-25.2" cask install
```

本当は、caskのpathを変えればよかったけど、やり方がわからなかったorz
【CentOS】grep検索で行数も表示する

grep検索を行う際、行数も表示して欲しいので、
毎回`-n` オプションを使用していたのですが、毎回打つのは案外面倒です。

ということで、.bashrcにaliasを登録しておきます。

以下コマンドにて登録
`$ echo "alias grep='grep -n'" >> ~/.bashrc`

登録後、設定を反映
`$ . ~/.bashrc`

上記を行っておけば、
以降、`-n`をつけなくても行数も表示してくれるようになります。
pythonでiperfを動かす

# はじめに
iperfをシェルスクリプトではなく、pythonで動かしたくなったが、日本語のドキュメントがなかったため、簡単にやりかたを残しておきます。

# 環境
Ubuntu 14.04
python 3.5.1

# 準備
まずpython wrapperをpipを使ってインストール。
`pip install iperf3`
pipを使わずにgithubのレポジトリから直接インストールすることも可能。

    git clone https://github.com/thiezn/iperf3-python.git
    cd iperf3-python
    python3 setup.py install

# 使い方
サーバ側のコード

```python:iperf_server.py
#!/usr/bin/env python3

import iperf3

server = iperf3.Server()
print('Running server: {0}:{1}'.format(server.bind_address, server.port))

while True:
    result = server.run()

    if result.error:
        print(result.error)
    else:
        print('')
        print('Test results from {0}:{1}'.format(result.remote_host,
                                                 result.remote_port))
        print('  started at         {0}'.format(result.time))
        print('  bytes received     {0}'.format(result.received_bytes))

        print('Average transmitted received in all sorts of networky formats:')
        print('  bits per second      (bps)   {0}'.format(result.received_bps))
        print('  Kilobits per second  (kbps)  {0}'.format(result.received_kbps))
        print('  Megabits per second  (Mbps)  {0}'.format(result.received_Mbps))
        print('  KiloBytes per second (kB/s)  {0}'.format(result.received_kB_s))
        print('  MegaBytes per second (MB/s)  {0}'.format(result.received_MB_s))
        print('')

```

次にクライアント側のコード

```python:iperf_client.py
#!/usr/bin/env python3

import iperf3

client = iperf3.Client()
client.duration = 10 # Measurement time [sec]
client.server_hostname = '192.168.1.1' # Server's IP address

print('Connecting to {0}:{1}'.format(client.server_hostname, client.port))
result = client.run()

if result.error:
    print(result.error)
else:
    print('')
    print('Test completed:')
    print('  started at         {0}'.format(result.time))
    print('  bytes transmitted  {0}'.format(result.sent_bytes))
    print('  retransmits        {0}'.format(result.retransmits))
    print('  avg cpu load       {0}%\n'.format(result.local_cpu_total))

    print('Average transmitted data in all sorts of networky formats:')
    print('  bits per second      (bps)   {0}'.format(result.sent_bps))
    print('  Kilobits per second  (kbps)  {0}'.format(result.sent_kbps))
    print('  Megabits per second  (Mbps)  {0}'.format(result.sent_Mbps))
    print('  KiloBytes per second (kB/s)  {0}'.format(result.sent_kB_s))
    print('  MegaBytes per second (MB/s)  {0}'.format(result.sent_MB_s))
```
# おわりに
これで取り敢えず、ネットワークのスループットを計測することができる。
サーバ(192.168.1.1)とクライアントが10秒間iperf3を使って測定を行う。
今回のコードでは変更していないが、コマンドライン上で実行するiperfと同様に、ポート番号やUDP/TCPの指定をすることも可能。

# 参考文献
https://pypi.python.org/pypi/iperf3
https://github.com/thiezn/iperf3-python
Visual Studio Code がとても重い場合

Hyper-V上で動作しているWindows Server 2012 R2上で
Visual Studio Codeを使ったときCPU使用率が100%になったので、その対処法。
自宅のPCではサクサク動いて、明らかにスペック良いのになぜだろうと思ってたら、

https://github.com/Microsoft/vscode/issues/17097
に原因が書いてました。

VMがシングルコアだと重くなる。。。。そうなんだ。。。

とりあえずHyper-V上で動いている対象OSのコア数を増やしたらサクサク動くようになりました。

そもそも論として、こんな使い方してる人ってあんまりいないから大体の人は無問題。
PCユーザのためのバッグパックおすすめメーカまとめ

MacBook PRO、あるいはGPU付きPCを使ってるPCユーザの皆さんが数年に一度遭遇する『リュックを新調したいが、どれを買えばいいか分からない問題』。
よくSNS上でおすすめを聞いてるのを見るのでまとめを作りました。
おすすめにあたってのポイント。

# 15inchが入る
最低でも15inchのMacBook proが入ること。
スリーブ内蔵じゃ無いタイプはスリーブ込みで入ることが大前提。

# バックパックタイプ
2kg以上のPCを斜めがけしてるとそのうち腰をやってしまいます。
トートでも体のバランスがおかしくなる。

# そこそこの防水性
軽い雨ぐらいは防いで欲しい。

# パッド入り
無いと肩痛くなる。

# 30リットル以上
PC以外にアダプタとかその他機材入れてると30リットルぐらいは最低必要です。

というわけで以下おすすめメーカ。

# Mission Workshop
https://missionworkshop.com/
ど定番。社内でのユーザ多し。
かなりガッチリしたファブリックでバッグ本体も丈夫。

# BACH
http://www.barriojapan.com/bach.html
最近よく見かける。丸っこいデザイン。
そのぶん軽い。

# Bagjack
http://www.bagjack.com/
これも最近よく見る。モジュラー式になってて色々カスタムできる。

# Beruf S Collection
http://www.bm-bag.jp/scollection/
バックの外にPCケースを取り付けられる仕様。僕は今これです。

# LEXDRAY
ブランドタグがフランス国旗カラーだったりとシャレオツ感がある。スペックの割にはちょい高め。
https://www.lexdray.com/

# Cote & Ciel
http://www.coteetciel.jp/
有機的な形が特徴。四角い箱とかが入りづらい。
PC収納場所が完全に別になってるのがポイント高い。
RailsでModelではなくシンボルのキーを持つHashの配列を取得する

`pluck`だと配列の配列が返ってくるのと、`as_json`だと`Hash`のキーがシンボルではなく文字列なのを対策。

```.rb
require 'lambda_driver'
posts = Post.select(:id, :title).map(&:as_json >> :symbolize_keys)
```
Dreamweaver CC 2017.1のリアルタイムプレビュー〜body要素のonload属性とwindow.onloadハンドラ〜

Dreamweaver CC 2017.1の[リアルタイムプレビュー]を使うと、`<body>`要素の`onload`属性も`window.onload`ハンドラハンドラも呼び出されなくなりました。Dreamweaver CC 2015.2や、ローカルからブラウザで開けば正しく動きます。少し調べてみました。

#ローカルサーバーを開くとき悪さをしているらしい
Dreamweaver CC 2017から[[リアルタイムプレビュー](https://helpx.adobe.com/jp/dreamweaver/using/whats-new.html#preview)]が採り入れられ、ページがローカルサーバーで開かれるようになりました。状況証拠から判断して、ローカルサーバーを開くための処理がもっとも怪しい容疑者です。

あとの検証から、ほぼ間違いないという裏づけが採れました。Dreamweaver CC 2017の[リアルタイムプレビュー]の問題を避けるには、イベント[`load`](https://developer.mozilla.org/docs/Web/Reference/Events/load)や[`DOMContentLoaded`](https://developer.mozilla.org/docs/Web/Reference/Events/DOMContentLoaded)にリスナーとして処理を加えるのがよいでしょう。

#window.onloadのハンドラは上書きされる
Dreamweaver CC 2017の[リアルタイムプレビュー]が何をやっているのか気になります。そこで、つぎのようなテスト用のコードを書きました。

```js
window.onload = function() {
	alert('window');
}
window.onmousedown = function() {
	var body = document.body;
	console.log('widdow:', window.onload);
	console.log('body:', body.getAttribute('onload'));
}
```
```html
<body onLoad="alert('body')">
```

ウィンドウの中をクリックしてたしかめると、[リアルタイムプレビュー]で読み込まれるdeviceClientScript.jsが`window.onload`のハンドラを書き替えているようです(図001)。

####図001■JavaScriptコンソールの出力
![dwcc2017_window_onload.png](https://qiita-image-store.s3.amazonaws.com/0/128949/8b730520-81b3-1757-b2f9-9b7574606537.png)

#window.onloadと\<body\>要素のonload属性
`<body>`要素の`onload`属性はどこにいったのでしょう。テスト用コードでは、属性値は残っていることが確かめられました(前掲図001参照)。また、問題について検索していたとき、`window.onload`と`<body>`要素の`onload`属性にいて「[window, document, body のonload,onreadyイベントのそれぞれの違いの解説](http://www.phenomena.co.jp/blog/2015/04/14/window-document-body-%E3%81%AEonloadonready%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E9%81%95%E3%81%84%E3%81%AE%E8%A7%A3%E8%AA%AC/)」につぎのような記述をみつけました。

> 最近のブラウザで実験してみたところ、二つが同時に使われる場合には、body.onloadのみが起動されます。body.onloadが存在しなければwindow.onloadが起動されます（現在Chrome 41及びFirefox 36で確認済み）。

でしたら、たとえ`window.onload`が上書きされても、`<body>`要素の`onload`ハンドラは呼び出されてよいはずです。そこで、[リアルタイムプレビュー]は使わず、ローカルからファイルをブラウザで開きました。

すると、なんということでしょう。たしかに、`<body>`要素の`onload`ハンドラの記述にしたがって警告ダイアログが開きました。けれども、コンソールの出力を見ると、`window.onload`ハンドラの処理が書き替わっています(図002)。`window.onload`イベントで、`<body>`要素の`onload`ハンドラのJavaScriptコードが実行されているようです。

####図002■JavaScriptコンソールの出力 ー ローカル
![dwcc2017_body_onload.png](https://qiita-image-store.s3.amazonaws.com/0/128949/92bd29bf-0fc6-7d82-4987-7d8c7fdac8b6.png)

筆者の環境では、Chrome/Firefox/Safariとも同じ結果です。あいにく、その仕様はみつけられませんでした。`<body>`要素の`onload`属性は「ブラウザによって処理が異なる」ことがあるという説明も見かけました(「[ページ読み込み後に処理を行う方法](http://so-zou.jp/web-app/tech/programming/javascript/event/handler/onload.htm#no3)」)。現在であれば、はじめに述べたとおりイベントリスナーを用いるのがよさそうです。
androidでkotlinを使ってMap#forEachを使うとNoClassDefFoundError

Androidアプリでkotlinを使っているときに、以下のコードのように `Map#forEach` を使うと `NoClassDefFoundError` でアプリがクラッシュします。

```Kotlin
val map = mapOf(Pair("test", "test"))
map.forEach { k, v -> Log.d(TAG, "key: $k, value: $v") }
```

これは基本的にはAndroidではJavaのStream APIを使用できないため、kotlin -> javaに変換し実行する際に `Map#forEach` がKotlinのMapではなく、JavaのMapと勘違いしてしまいます。

## 解決方法

```Kotlin
val map = mapOf(Pair("test", "test"))
map.forEach { (k, v) -> Log.d(TAG, "key: $k, value: $v") }
```

そこで上記のコードのように `k, v` を `(k, v)` としてあげることでパラメータを一つにしてあげることで、Kotlinの `Map#forEach` を使うことができます。

## 参考
[java.lang.NoClassDefFoundError $$inlined$forEach$lambda$1 in Kotlin - StackOverFlow](http://stackoverflow.com/questions/42869086/java-lang-noclassdeffounderror-inlinedforeachlambda1-in-kotlin)
Qiitaのデータを眺めてみる

数週間前に[QUANON](http://qiita.com/QUANON)氏がQiitaレジェンドになりたいと言っていました。
そこで何かの役に立たないかと、とりま2017/03/01 〜 2017/04/30のQiitaの投稿データを集計してみました。

できたもの： https://y-takey.github.io/qiitaros

（キタロスと言いたかっただけなのかもしれない…）

## 1. データ収集

### 使用API

指標として「いいね」の数を取得したかったのですが、[Qiita API v2](http://qiita.com/api/v2/docs)では提供されていないようでした。記事ごとのHTMLページを取得してスクレイプすることも考えましたが、記事数が多くAPIの利用制限に引っかかるために断念しました。
[Qiita API v1](http://qiita.com/api/v1/docs)ではストック数が提供されていたので、これを代わりに用いました。「いいね」と「ストック数」にある程度の相関があるかなという前提です。（未検証）

### 収集範囲

本当は少なくとも過去1年分くらいのデータが欲しかったのですが、利用制限を超えるし、サーバに負荷をかけるのも躊躇われたので2ヶ月分に絞りました。

### 収集方法

Qiita API v1では1回の取得件数(per_page)が100、最大ページ番号(page)が50という制約があります。
その為、数カ月分のデータをそのまま取得しようとすると、ページ数が超過してしまいます。これを回避するために範囲内を10日ずつに区切りながら取得しました。
またレスポンスヘッダ内にlink情報が入っているので、パースし最終ページ番号を取得しました。
つまり日付とページの2重ループです。

ちなみに、検索条件の日付はUTCだけどレスポンス内の日付はJSTのようで、結果に5/1 09:00(JST)までのデータが含まれていました。

ちゃちゃっと実装したかったので馴染みのあるRubyで書きました。
コードは[こんな](https://github.com/y-takey/qiitaros/blob/master/crawler.rb)感じです。
なお、取得したデータは加工して[data配下](https://github.com/y-takey/qiitaros/tree/master/data)においています。

## 2. 集計表示

主な使用ライブラリ等は以下です。（詳細は省略）

* [webpack](https://github.com/webpack/webpack)
* [Material Design Lite](https://github.com/google/material-design-lite)
* [React](https://github.com/facebook/react)
* [React Heat Calendar](https://github.com/y-takey/react-heat-calendar)
* [Chart.js](https://github.com/chartjs/Chart.js)
* [PivotTable.js](https://github.com/nicolaskruchten/pivottable)
KVM上のゲストマシンをhttpサーバーにした勉強メモ


ホストマシンからゲストマシンへhttp接続する方法を学ぶことが目的。

##環境
KVM環境
ゲストマシン：fedora21.x86_64

##手順

1. httpdのインストール
2. httpサービスの起動
3. firewalldの設定
4. telnetによる検証

##1.httpdのインストール
ゲストマシンにhttpdをインストールする。

```
# yum install httpd
```

## 2.httpdサービスの起動
インストールしたhttpdサービスを起動する。

```
# systemctl start httpd
```

##3.firewalldの設定

こちらの記事を参考にさせていただきました。
[CentOS7のfirewalldをまじめに使うはじめの一歩（systemdも少し）](http://qiita.com/shrkw/items/8410e9cb65eb789a40e1)

デフォルトゾーンを調べ、NICが割り当てられていることを確認する。

```
# firewall-cmd --get-default-zone
FedoraServer
# firewall-cmd --list-interfaces
eth0
```

デフォルトゾーンに、httpサービスを追加する。

```
# firewall-cmd --add-service=http --zone=FedoraServer --permanent
success
# systemctl reload firewalld
```

##4.telnetによる検証
telnetでポート80にアクセスし、接続できたら成功。
ブラウザからもhttp接続できるようになっている。

```
# telnet xxx.xxx.xxx.xx 80
Trying xxx.xxx.xxx.xx...
Connected to xxx.xxx.xxx.xx.
Escape character is '^]'.
```

以下のようなメッセージが出る場合、失敗。

```
# telnet xxx.xxx.xxx.xx 80
Trying xxx.xxx.xxx.xx...
telnet: Unable to connect to remote host: No route to host
```

ssh接続が出来たり、pingが通るにもかかわらず上記のメッセージが出るようであれば
firewalldの設定をもう一度見直す。

#参考
[システム管理者のガイド 第12章 WEBサーバー](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/ch-Web_Servers.html)
[CentOS7のfirewalldをまじめに使うはじめの一歩（systemdも少し）](http://qiita.com/shrkw/items/8410e9cb65eb789a40e1)
ニューラルネットワークの歴史〜概要〜

#はじめに

ニューラルネットワークには第一次、第二次、第三次という三つのニューロブームがあった。
第一次ニューロブームは、1958年ロゼンブラットによる、単純パーセプトロンの発見であった。
しかしその後、XOR問題*1という、単純パーセプトロンで解けない問題が発見され、ブームは去った。
しかし、のちに多層パーセプトロンを用いるとXOR問題が解決されることがわかった。
第二次ニューロブームは、1986年にでビッドラメルハートらの「誤差逆伝播法」により多層パーセプトロンの学習が高速化されたことで起きた。しかし、そのブームも学習データの不足から、精度が出ずに廃れていった。
第三次ニューロブームは、2000年代後半にビッグデータの入手が容易になり、コンピュータの性能自体も向上してきたときに、起きた。2007年にアンドリュー・ング氏がディープラーニングという言葉を用いた。2012年にはジェフリー・ヒントン教授らのグループが画像認識のコンテストで、技術的ブレークスルーを起こした。同年2012年にはまた、猫の特徴抽出をディープラーニングでおこなった、グーグルの猫が有名になった。2016年には、デミス・ハサビス率いるディープマインド社が囲碁のプロ棋士に勝ったり、イアン・グッドフェローがGANモデルを考案したり、最近のニューラルネットワークの発展は目覚しい。

#第三次ニューロブーム以前の年代表

|年号|技術|人物|
|:-----------------:|:------------------:|:------------------:|
| 1943 | [EMBODIMENTS OF MIND](http://www.gifu-nct.ac.jp/elec/deguchi/sotsuron/oka/node5.html)提案 | W. MCCLLOCH     W.PITTS |
| 1949 | [Hebb's rule](https://bsd.neuroinf.jp/wiki/%E3%83%98%E3%83%96%E5%89%87)提案 | D.Hebb |
| 1951 | [世界初のニューラルネットマシン](https://en.wikipedia.org/wiki/Stochastic_neural_analog_reinforcement_calculator)作成 | M. Minsky |
| 1958 | [パターン認識の可能性](http://www-ailab.elcom.nitech.ac.jp/lecture/neuro/par1.html)提示 |　F. Rosenblatt |
| 1969 | 神経回路論 | 甘利教授 |
| 1969 |  コグ二トロン神経回路論 | 福島教授 |
| 1969 | パーセプトロンの限界提示 | M. Minsky |
| 1969〜80 | AIの冬第1期 |       ------     |
| 1984 | [Hopfield model](http://rishida.hatenablog.com/entry/2014/03/03/174331)提案 |  J. Hopfield |
| 1986 | [Boltzman Machine](http://rishida.hatenablog.com/entry/2014/03/06/131727)提案 |  Hinton & Sejnowski |
| 1986 | [Back Propagation](http://d.hatena.ne.jp/nowokay/20080701/1214915017)紹介　| Rumelhart & McClelland |
| 1987〜93 | AIの冬第２期 |   ------    |
| 2006 | [オートエンコーダ](http://sig.tsg.ne.jp/ml2015/ml/2015/06/15/pretraining.html)提案　　| G. Hinton |
| 2012 | [高精度ディープラーニング](www.image-net.org/challenges/LSVRC/2012/)作成　　| G. Hinton |

#参考
「ディープラーニング、ビッグデータ、機械学習あるいはその心理学」　著　浅川
http://business.nikkeibp.co.jp/article/bigdata/20150419/280107/?P=1
AWS EBSのルートディスク拡張した際のサイズ拡張のやりかた

いつも忘れるのでメモっておく
環境はUbuntu14.04

## AWSコンソール上
EBSボリュームの「アクション」⇒「Modify Volume」
指定のサイズに設定

## 対象インスタンス上
```
# root
sudo su -

# 認識されてるか確認
lsblk

# 現在のサイズ確認
df -hT

# サイズ拡張
growpart /dev/xvda 1
resize2fs /dev/xvda1

# サイズ確認
df -hT
```
`git clean -f`を知らなくて全く意味のないコマンドを書いた思い出

よくわからないけど、以下のような状態になりました。全部消したいです。

```bash
$ git status
On branch master
Your branch is up-to-date with 'upstream/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	 (copy: conflict on 2017-05-09).gitignore
	app/assets/javascripts/front/solutions.js (copy: conflict on 2017-05-09).coffee
	app/assets/stylesheets/front/detailmain (copy: conflict on 2017-05-09).scss
	app/assets/stylesheets/front/theme (copy: conflict on 2017-05-09).scss
	app/controllers/mypage/profiles_controller (copy: conflict on 2017-05-09).rb
	app/controllers/user/mail_activate_controller (copy: conflict on 2017-05-09).rb
	app/models/user (copy: conflict on 2017-05-09).rb
	app/views/console/solutions/_form.html (copy: conflict on 2017-05-09).slim
	app/views/pages/index.html (copy: conflict on 2017-05-09).slim
	config/initializers/paperclip (copy: conflict on 2017-05-09).rb
	db/schema (copy: conflict on 2017-05-09).rb
	spec/requests/console/solutions_spec (copy: conflict on 2017-05-09).rb

nothing added to commit but untracked files present (use "git add" to track)
```

```bash
$ git clean -f
```

を使えば良いのですが、それを知らないぼくは、**ただただ意味のないコマンド** を書きました。

```
$ git status -s | cut -c4- | sed -e 's/\([ |\(|\)]\)/\\\1/g' | xargs rm -fr
```

勉強になりました。ありがとうございました。

## 追記

Untracked なファイルを消すには、`git clean -f` で良いのですが、ディレクトリだとこのコマンドは削除してくれなかったです。なので、たくさんいらないディレクトリとか、ファイルとかがあるときは、上の思い出コマンドも使えるかもしれないと思いました。（そんな機会は訪れないと思いますが...

## 追記2
`git clean -df` でディレクトリも消せました。めでたしめでたし。
Rails5.1@webpackerをリモートホストのDocker環境で使うときのメモ

この方法はobsoleteかな？↓の方法でどうぞ
[Rails5.1@webpackerのDocker環境で使うときのメモ 2017/11/11 \- Qiita](https://qiita.com/tetsuyainfra/items/efb5d453648e7d36f58d)

# はじめに
- javascript_pack_tagはmanifest.jsonをパースしている
- 別ホスト上のDockerだと,webpack-dev-serverが認識するアドレスとブラウザから見た時のアドレスが異なるのでmanifest.jsonに記載されているアドレスがブラウザから見て正しくないとget出来ない
- webpack-dev-serverにhost(ListenするIP)とpublicPath(ブラウザから見た時のホスト名)を教えれば良い
- dev-serverがブラウザリクエストのHost名をチェックしているので、それを無効化する

# 関連
- [Vagrant+webpack-dev-serverでプライベートIPに接続できない時の対処 ](http://qiita.com/msykd/items/7e72c4a942610e39b317)
  - localhostで実行するときはこの方法でOK
- [--host 0.0.0.0 Not working · Issue #882](https://github.com/webpack/webpack-dev-server/issues/882)
    - [fix: disableHostCheck should be defaulted to true by nick-woodward · Pull Request #890](https://github.com/webpack/webpack-dev-server/pull/890/files)
  - disableHostCheck: trueがデフォルトになるプルリクエストでてた 

## 変更点
```yml:config/webpack/development.server.yml
default: &default
  enabled: true
  host: localhost
  port: 3080              # 今回はこのportにした
development:
  <<: *default
  host: dev0.devopt.local # development環境だけで良いので変更
```


```js:config/webpack/development.server.js
module.exports = merge(devConfig, {
  devServer: {
//    host: devServer.host, // <- 
    host: "0.0.0.0",        // <- 書き換え
    port: devServer.port,
    compress: true,
    historyApiFallback: true,
    contentBase: resolve(paths.output, paths.entry),
    disableHostCheck: true, // <- 追加
    publicPath
  }
})
```


# 出力
```sh:BEFORE
$ bin/webpack-dev-server
 10% building modules 2/2 modules 0 active
Project is running at http://localhost:3080/
webpack output is served from http://localhost:3080/packs/
```

```sh:AFTER
$ bin/webpack-dev-server
 10% building modules 2/2 modules 0 active
Project is running at http://0.0.0.0:3080/ 待ち受けアドレス
webpack output is served from http://dev0.devopt.local:3080/packs/ ブラウザからアクセスするURL

```
Excel設計書作成時の便利なお手軽マクロ

#EXCEL設計書作成における効率アップ
最近、EXCELで設計書などのドキュメントを作成しています。その際に、使用しているお手軽マクロで効率がかなりアップした内容のメモ書きです。EXCEL方眼紙方式でドキュメント作る方は知っておくとかなり役に立つと思います。
個人的には**20%近く効率化できた**と感じています。
マクロは個人用マクロブックに保存するので、**設計書ファイルにマクロを埋め込むわけではありません。**
Excel2016と2013で試しました。
#やったこと
**コピペの効率アップ**です。通常コピペだと、Ctrl + C, Ctrl + V のショートカットキーを使うことが多いと思います。ただ、この方法だと罫線やフォントなど邪魔なものもくっついてくるので「形式を選択して貼り付け」から「値」のみを貼り付けることばかりしていました。この値貼り付けにショートカットキーを割り当てて一手間で処理するマクロを作成しました。
#マクロ登録方法
以下の3ステップでマクロ登録をします。

1. マクロ有効化
[エクセル（Excel）のリボンに「開発」タブを追加表示](http://www.724685.com/weekly/qa111027.htm)

2. マクロ記録
開発タブで「マクロの記録」ボタンを押して、新規マクロを登録してください。
マクロの保存先を「個人用マクロブック」にして、ショートカットキーを使いやすいキーに設定します。
特に何も記録せずにすぐに「開発」タブで「記録終了」を押します。

3. ちょっとVBA追記
開発タブで「マクロ」ボタンを押して、「2. マクロの記録」で登録したマクロを選択して「編集」ボタンを押します。そこで出てきたエディタに下記のコードを貼り付けます。
※「表示されていないブックのマクロは編集できません。・・・」と怒られたらば、表示タブから「再表示」を選択して"PERSONAL.XLSB"を選んでから実行ください。

```vbnet:Paste.bas
Sub SpecialPaste()
'
' SpecialPaste Macro
'
' Keyboard Shortcut: Ctrl+g
'
On Error GoTo pasteText
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

Exit Sub
pasteText:
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:= _
False


End Sub

```


#改善点
10分くらいで作ったことと、私のVBA知識少ないこととで、改善点多いです。
・クリップボードに何もない状態でペーストするとエラー発生(「終了」を押せばいいです)
・「元に戻る」が使えません。マクロ実行の場合は使えないようです。
datadogでタグを使って1モニターから複数の通知先を出し分け設定する

結論： is_matchでがんばる

datadogを使用していると、「このホストからのアラートはroom-aに、このホストからのアラートはroom-bに、でroom-bのときは ＠channelつけて」などの出し分けをしたくなります。
これまではシステムグループや役割に応じてタグを付与して、モニターを複数作成するという運用を続けていましたが、同じ監視をおこなうモニターが複数できあがり、SaaSを使用しているにもかかわらず運用コストが非常に大きくなってしまったので、 **どうにかして1つのモニターで通知先を分けられないか**を調べていたところ、 `is_match` を使うことで対応できたので覚書として投稿します。

## タグを設定してis_matchで拾う

datadog-agentを起動している・これから起動するホストのdatadog.confを編集します。
tagsの項目に以下のようにタグを追加します。

```datadog.conf
tags: alert_to:slack-room-a
```

> tagsはコロン区切りで複数設定できます。
> `tags: alert_to:slack-room-a,role:api`

このファイルでagentを起動した場合、datadog monitorのtemplateで以下のように記述すると条件分岐することが可能です。

```
{{#is_match "host.alert_to" "slack-room-a"}}
@slack-a
{{/is_match}}
```

先程datadog.confで設定した `alert_to` というタグキーは、 `host.alert_to` という形でとれます。
なお、どういうタグを指定できるかはmonitorの編集画面にある `Use message template variables` をクリックすると使用可能なタグを確認することが出来ます。
（これは独自に追加したtagについても表示されるので、とても役立ちます

![](http://docs.datadoghq.com/static/images/monitor/notification.png)
※ 画像元： http://docs.datadoghq.com/ja/monitoring/

> 詰まりポイント： {{#is_match "alert_to" "slack-room-a"}} だと引っかかりません。気をつけましょう

## タグがない場合の対応方法

既に起動中のインスタンス等のケアやあえてタグを付与しない運用を行うといった対応で、 **タグがない場合は特定の通知先に通知する**といったことが必要になると思います。
その場合、以下の記述をすることでタグが設定されていない条件分岐をすることが可能です。

```
{{^is_match "host.alert_to" ""}}
this host is no alert_to tag
{{/is_match}}
```

ただし、この方法だと「タグだけは設定されている」という場合を拾うことができません。
設定漏れに気をつけましょう。

## 記述例

以上を振り返り、各モニターで以下の例のように状態やタグを踏まえた通知出し分けの記述することができます。
（見やすいようにスペースを入れています。）

```
{{#is_warning}}
{{#is_match "host.alert_to" "slack-room-a"}} @slack-a {{/is_match}} 
{{#is_match "host.alert_to" "slack-room-b"}} @slack-b {{/is_match}} 
{{^is_match "host.alert_to" ""            }} @slack-c {{/is_match}} 
{{/is_warning}} 

{{#is_alert}}
<!channel> 障害発生。対応してください
{{#is_match "host.alert_to" "slack-room-a"}} @slack-a @pagerduty-a {{/is_match}} 
{{#is_match "host.alert_to" "slack-room-b"}} @slack-b @pagerduty-b {{/is_match}} 
{{^is_match "host.alert_to" ""            }} @slack-c @pagerduty-c {{/is_match}}
{{/is_alert}}

{{#is_recovery}}
{{#is_match "host.alert_to" "slack-room-a"}} @slack-a {{/is_match}} 
{{#is_match "host.alert_to" "slack-room-b"}} @slack-b {{/is_match}} 
{{^is_match "host.alert_to" ""            }} @slack-c {{/is_match}} 
{{/is_recovery}}
```

## おまけ

試してみてダメだったパターン集

```
{{^alert_to}} {{/alert_to}}                 #=> syntaxは問題ないが、機能せず常に（いわゆる）else句に入った

{{^host.alert_to}} {{^host.alert_to}}       #=> syntax error

{{^"host.alert_to"}} {{^"host.alert_to"}}   #=> syntax error
```
Amazon Linuxでundefined symbol: PR_GetEnvSecure

先週まで動いていたはずのAPIが動かないので
ログを確認すると
以下のエラーが出ていました。

# エラー内容
```
/usr/sbin/httpd: symbol lookup error: /usr/lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure
```

NSSのライブラリ？
触っていない。

# 見つけた解決策
centOS,Redhatは解決済み
http://stackoverflow.com/questions/42728905/google-client-php-api-err-empty-response-error

でもうちはAmazon Linux..

apatchの再起動しても動かない..

依存関係も確認した。

```
ldd /usr/lib64/libnsssysinit.so
        linux-vdso.so.1 =>  (0x00007ffefe353000)
        libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007f7e05805000)
        libplc4.so => /lib64/libplc4.so (0x00007f7e05600000)
        libplds4.so => /lib64/libplds4.so (0x00007f7e053fb000)
        libnspr4.so => /lib64/libnspr4.so (0x00007f7e051be000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7e04fa2000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f7e04d9d000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f7e049db000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f7e047d3000)
        /lib64/ld-linux-x86-64.so.2 (0x00005648fb388000)
```


もう一度stackoverflowを見直すと

# 解決策
http://stackoverflow.com/questions/29724175/err-empty-response-when-trying-to-access-phpmyadmin/31914962

```
Fixed by restarting Apache via stop and start (apachectl restart is not sufficient).
```
***restart is not sufficient***

リスタートじゃダメだと、バッチリ書いてあった。

```
[root@ip-xxx-xxx-x-xxx init.d]# sudo service httpd stop
Stopping httpd:                                            [  OK  ]
[root@ip-xxx-xxx-x-xxx init.d]# sudo service httpd start
Starting httpd:                                            [  OK  ]
```

以上で動くようになりました。


## restartとstop&startの違い

http://httpd.apache.org/docs/2.2/stopping.html

https://doruby.jp/users/yokian/entries/Apache_restart_graceful_stop_

# 原因
定期的に`sudo yum　security update`していたので
そのタイミングで動かなくなったようです。
viewport の設定

name="viewport"
これがスマートフォンのサイトですよという合図

content="width=device-width"
幅をデバイスの幅に合わせてねって指示
端末ごとのサイズに応じてフレキシブルな表示ができる一方、細かい表示の統一はやりづらい。


content="width=480"にすると幅480pxの仮想的なウインドウが作られる。
JSのdocument.documentElement.clientWidthなんかも480を返すし、media queryの条件判定でも480pxの画面幅が使われる。

数字を明確に指定しているので端末ごとの表示を統一できるが、逆に言うと大きな画面サイズの端末でも小さな画面サイズの端末と同じ表示になるため、スペースの有効活用ができない

initial-scale=1.0
初期表示時のスケールを指定します。
initial-scaleに1より小さな値は使わないのが無難

その他
minimum-scale
ズームイン時の最小スケールを指定します。
(例)
minimum-scale=1.0


maximum-scale
ズームアウト時の最大スケールを指定します。
(例)
maximum-scale=0.5

user-scalable
ユーザがスケールイン、アウト可能かの設定
(例)
user-scalable=no

target-densitydpi

Android の場合、密度を指定できます。
(例)
target-densitydpi=device-dpi

縦向き、横向きで文字の大きさを変えたくない場合
css で body に下記を設定
-webkit-text-size-adjust: 100%;

ズームイン、ズームアウトについて
・user-scalable=no で設定すると拡大、縮小ができなくなります。
・maximum-scale 、 minimum-scale 、initial-scale を同じにすると拡大、縮小ができなくなります。


他
★画面の見た目を完全に固定したい場合。ピクセル、%にて設計(基準は固定値)
viewport の設定

```
<meta name="viewport" content="width=640" />

```
initial-scale を指定した場合、width=device-width と initial-scale と width で大きい方が適用される。

・表示する端末全ての幅が仮想の 640 で固定され、解像度が大きい端末では 640 を基準として拡大表示され、解像度が小さい端末では小さく縮小表示されます。
・画面の横幅が1000px だろうが、仮想で横幅 640 で計算され 1000px の画面全体に仮想画面の 640 で表示されます。
・画面設計は横幅 640 で設計します。
・% 指定でコーディングしても問題ありません。

・端末の画面の大きさが小さくても、大きくても表示される内容の比率は固定されるため、見た目が変わらない。
・% で指定しても px で指定しても、基本的には等倍で表示されるので全ての端末で同じように表示させられる。
・画面設計がシンプルになる。
・横幅を指定し設計ができるため設計が容易である。

・小さい端末では文字、画像が小さく、大きい端末では文字、画像が大きくなります（フォントサイズを画面比率で指定した場合）。
・端末が大きくても表示される内容もそのまま拡大されるだけなのでユーザビリティ的には少々悪い（タブレットの場合は全体の大きさはそのままに情報量を増やしたほうが好ましい）。ただし、タブレット等ではメディアクエリーを利用で切り分ける方法もある。

★画面のサイズを端末の横幅サイズに合わせたい場合　% 指定で全て等倍も可能
viewport の設定

```
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
(iPhone6 の場合、375)
<meta name="viewport" content="width=device-width, initial-scale=0.5" />
(iPhone6 の場合、750)

```

・設定されるサイズは端末のピクセル単位で設定される。
・全て%で指定した場合、その１と同じ用に全ての端末で等倍表示させることも可能。
・スマフォの場合はポイントサイズが基準となるため 0.5 を設定することでピクセル数の解像度で横幅を設定できます。1 で設定した場合、ポイント数が設定されるため、解像度の半分のピクセル数が設定されます。
・表示する端末によって画面の幅が異なるため、コンテンツを等倍で表示したい場合は、スタイルで % を指定します。
・端末サイズに関係なく同じサイズで表示したい場合は px で指定します。(dpi が同じと仮定)
・画面サイズが保証できないため基本的には px で指定しない方が好ましい、ただし、理解して指定する場合は問題ない。padding は px で、内容は % で指定など。

・% を利用することで異なる画面サイズでも等倍表示することができるため、基本的に % 単位にて設計できます。
・px を利用することで px を利用して（ dpi が同じと仮定）異なる画面サイズでも同じ大きさで表示させることができます。
・% 指定、px 指定の両方を指定して設計することも可能、柔軟に指定できるため基本的にはこちらがおすすめ。
・タブレットなど、画面が大きい端末には項目を多く表示させる設計も可能。
・全て % で指定した場合、どの端末で同じ大きさで表示させることが可能です。

・px を利用した場合、画面の大きさによって見え方が異なるため設計と確認が必要
smalruby-editorをEC2で起動



## スモウルビー(smalruby)について

_smalruby-editorは、Scratchのように命令ブロックを組み合わせて、プログラムを作成するためのビジュアルプログラミングエディタです。命令ブロックからRubyのプログラム、また、Rubyのプログラムから命令ブロックに変換できることが特徴の一つです。_
(http://smalruby.jp/blog/2017/01/14/smalruby-editor-0-4-1-has-been-released.html)


smalruby-editorはのsmalrubyのGUI環境ですね。
今回はこれをAmazonLinuxへインストールします。


## smalruby-editor


https://github.com/smalruby/smalruby-editor


下手にバージョンを変えると関連ライブラリがconflictしてエラーが出まくりハマりにハマったので、
[Gemfile](https://github.com/smalruby/smalruby-editor/blob/master/Gemfile)に指定されているRubyやRailsのバージョンで起動するのが宜しいかと思います。

指定されているバージョンは以下です。

* Ruby 2.3.3
* Rails 4.0.3


## AmazonLinux

インストールした環境は以下。

* AmazonLinux t2.micro


## サーバーのセットアップ

インストールしたものは以下。これらのインストール方法は省略しますね。

* Nginx 1.10.2
* MySQL 5.5
* Git 2.7.4
* rbenv
* ruby2.3.3


## AmazonLinuxへSDLをインストール

インストールコマンドをシェルスクリプトにまとめてくれた方がいたので、そのまま拝借し実行しました。

[gboudreau/install-ffmpeg-amazon-linux.sh](https://gist.github.com/gboudreau/f24aed76b4cc91bfb2c1)

## smalruby-editorのインストール

基本的にREADMEに記載されている通りに実行していけばOK。

```
export RAILS_ENV=production

cd /var/www/html
git clone https://github.com/smalruby/smalruby-editor.git
cd smalruby-editor
bundle
cp config/database.yml.mysql2 config/database.yml
```

DBの設定など。

**config/database.yml**

```yml
production:
  adapter: mysql2
  encoding: utf8
  database: smalruby-editor_production
  pool: 5
  username: root
  password: password
  host: localhost
```

```bash
bin/rake db:create
bin/rake db:migrate
```

## 起動

unicorn + Nginxの構成で起動するため、config/unicorn.rbに設定を追記しました。

**config/unicorn.rb**

```ruby
@path = "/var/www/html/smalruby-editor/"
listen "#{@path}tmp/smalruby-editor.sock"
pid "#{@path}tmp/pids/unicorn.pid"
stderr_path "#{@path}log/unicorn.stderr.log"
stdout_path "#{@path}log/unicorn.stdout.log"
```

Nginx側の設定

**/etc/nginx/conf.d/unicorn.conf**

```
upstream unicorn {
  # nginxとunicornの連携
  server unix:/var/www/html/smalruby-editor/tmp/smalruby-editor.sock;
}

server {
  listen       80 default_server;
  access_log /var/log/nginx/smalruby-editor_access.log;
  error_log /var/log/nginx/smalruby-editor_error.log;

  root /var/www/html/smalruby-editor/public;

  try_files $uri/index.html $uri @unicorn;

  client_max_body_size 20M;

  location @unicorn {
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_host;
     proxy_pass http://unicorn;
  }
}
```

最後にunicornとnginxを起動。

```bash
bin/bundle exec unicorn -c config/unicorn.rb -E production -D
/etc/init.d/nginx start
```
golang1.8.1とintellijの設定のメモ

# はじめに
- Goを書こうと思ってIDEの設定をググりながら設定してたけど割りと古いバージョン(intellij,golangともに)の時のものが多く、現行とはちょっと異なってたのでメモ的に残す

# バージョン
- golang1.8.1
- IntelliJ IDEA 2017.1.2

# 利用したplugin
- Go Lang Plugin
- File Watchers

# 関連情報
- glide(https://github.com/Masterminds/glide) を利用してvendorにinstallしたライブラリはversion固定でいれる

# ここからが設定の話（本題）
## Project SDKの設定
- File > Project Structure
![スクリーンショット 2017 05 09 17.51.46.png  2024×1426 .png](https://qiita-image-store.s3.amazonaws.com/0/106937/be8eb75d-ea87-d5d4-2ec9-491fdff14933.png)

## goimportsの設定
- glide経由でvendorディレクトリに`golang.org/x/tools/cmd/goimports`をinstallしてそれを設定したかったけどうまく読めなかった...
- なので自分は`go get golang.org/x/tools/cmd/goimports` してrootに入ったgoimportsをintellijに設定した
    - せっかくglide使ってたが、解決策まだない
![スクリーンショット 2017 05 09 18.26.39.png  2030×1428 .png](https://qiita-image-store.s3.amazonaws.com/0/106937/2482cb01-4171-1671-1922-0b401262bda4.png)
ど素人が岡山マストドンを構築した時にハマったポイント2つ


ど素人ながらマストドンの構築を行ってみましたよ
https://mstdn.okayama.jp/about


どのように構築するかは皆さんまとめていますので、個人的にハマったところをメモです。
以下のサイトを参考に構築しました。本当にありがとうございます！
https://hyper-text.org/archives/2017/04/mastodon-instance-single-user.shtml


# メールのTXTレコード設定方法
SparkPostっていうサービスを利用してメールの設定を行いました。
https://www.sparkpost.com/

ユーザー登録が終わるとドメインを登録します。
それが終わるとDNSの設定しろとなるので、DKIM（Domainkeys Identified Mail）レコードの値を言われたとおりにDNSのTXTレコードとして設定します。

ここで分からなかったのが、TXTレコードを追加するときに設定する「エントリー名」です。
このエントリー名には、DKIMレコードの値が表示されている右側にある「Hostname」に書かれている値を指定してください。

# nginxのrootの設定
一通り設定が終わってアクセスしてみると、こんな現象になりました。


- mstdn.okayama.jp/　繋がらない
- mstdn.okayama.jp:3000　繋がる　→　httpsにリダイレクトされてる？が、レイアウトが崩れる

nginxのログ`/var/log/nginx/error.log`を見てみると「assets」がエラーになっていました。

```
2017/04/28 17:12:53 [error] 25817#25817: *52 open() "/home/mastodon/live/public/assets/application-hogehoge.css" failed (2: No such file or directory), client: 211.2.161.143, server: mstdn.okayama.jp, request: "GET /assets/application-hogehoge.css HTTP/1.1", host: "mstdn.okayama.jp", referrer: "https://mstdn.okayama.jp/about"
```

そんなディレクトリ存在しねーよってことだと思うのですが、そりゃーないですよ。
そんな所にはインストールしてないので。

結局nginxの以下の設定をしたことで解決したのですが、どのサイトを見ても修正していないので何かやり方が間違っているのでしょうか...

```nginx
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name mastodon.example.com;
  root /home/mastodon/live/public; # ここを修正した /opt/mastodon/public
  index index.html index.php index.xml;
```
AutoHotKeyで、TextExpander風にスニペットに他のスニペットを埋め込んだりしたい


AutoHotKeyをTextExpanderのようなスニペット展開アプリとして利用しています。

TextExpanderには、スニペット内に別のスニペットを挿入することができますが、このようなことはAutoHotKeyではできないのでしょうか。

## AutoHotKeyにおけるスニペット展開スクリプト
ユースケースによって様々な実装がありますが、私の場合、ホットストリングから、文字列をペースト（性格には`Ctrl+V`キーを送る）する関数をコールしています。

```ahk
::ahk:: ; Abbreviations相当部分
	PasteString("AutoHotKey") ; Snippet相当部分
	Return
```

このように、ホットストリングラベルのサブルーチン内で関数コールがされている状態です。

`PasteString`関数のコードは以下のとおりです。これは関数ライブラリとして利用しています。

```ahk
PasteString(String){
    Backup := ClipboardAll
    Clipboard := String
    Send,^v
    Sleep,250 ; Ctrl+Vによる貼り付け処理が終わるまで適当に待つ
    Clipboard := Backup
    Return
}
```

## 変数の利用
例えば、メールアドレス等を、必要とするすべてのスニペットに直接記述するのではなく、メールアドレスのみが記述されたスニペットを呼び出す形で利用したい。

ホットストリング`gmail`で`hogehoge@gmail.com`を、`mymail`で`メールアドレス：hogehoge@gmail.com`をペーストするような場合です。

このような場合、変数に格納して参照するのが簡単です。

```ahk
::gmail::
    Gmail = hogehoge@gmail.com
    PasteString(Gmail)
    ; ペーストされる文字列は`hogehoge@gmail.com`
    Return
::mymail::
	PasteString("メールアドレス：" . Gmail)
    ; ペーストされる文字列は`メールアドレス：hogehoge@gmail.com`
	Return
```

`global`宣言とかしなくていいのかというと、AutoHotKeyでいうローカル変数というのは**関数内で格納された変数**のみを指すのであって、サブルーチンを含むそれ以外の場所で格納された変数は全部グローバルです。

もちろん、ホットストリングのサブルーチン以外の場所で変数に格納しておいても問題ありません。

```ahk
Gmail = hogehoge@gmail.com
::gmail::
    PasteString(Gmail)
    ; ペーストされる文字列は`hogehoge@gmail.com`
    Return
::mymail::
	PasteString("メールアドレス：" . Gmail)
    ; ペーストされる文字列は`メールアドレス：hogehoge@gmail.com`
	Return
```

<!-- ただこれだと、スクリプト上のグローバル変数がメモリを専有し続けるので、値がとんでもなく長大になる場合などは、ホットストリングラベルの実行のたびに変数をクリアしたいかもしれません。 -->

## ホットストリングラベルの呼び出し
ホットストリングはラベルなので、`Goto`でジャンプできます。(無論`Gosub`でも。)

```ahk
::gmail::
    Gmail = hogehoge@gmail.com
    PasteString(Gmail)
    ; ペーストされる文字列は`hogehoge@gmail.com`
    Return
::github::
	ghhome = https://github.com/hogehoge
    PasteString(Github)
    ; ペーストされる文字列は`https://github.com/hogehoge`
    Return
::myprof::
	PasteString("メールアドレス：")
    GoSub, ::gmail
	PasteString("`n／Github：")
	Goto, ::github
    ; ペーストされる文字列は、
	; `メールアドレス：``hogehoge@gmail.com`｀／Github：``https://github.com/hogehoge`
	Return
```

しかしこれだと、`PasteString`関数のコールのたびに`sleep`がかかるため、実行段階ではスマートさに欠けます。

一応、各`PasteString`に`If`を書いておいて、`Gosub`する側でフラグ立てて`Gosub`だったらペーストしないで戻るとかできなくはないですが、別にそこまでしたくないなという感じ。

自動置換型ないし`Send`を使うタイプのホットストリングだと、まとめて1回でも2回に分けても大差ないのですが、それはそれで単純な実行速度の遅さだったり、日本語の扱いが神経質だったりの問題があります。（参考：[ユニコード版で利用する](http://ahkwiki.net/Hotstrings#.E3.83.A6.E3.83.8B.E3.82.B3.E3.83.BC.E3.83.89.E7.89.88.E3.81.A7.E5.88.A9.E7.94.A8.E3.81.99.E3.82.8B)）

### Abbreviations-Snippets対応表を別に用意する

まあこんな感じで、txtでもcsvでも。

```Snippets.txt
; 左右の区切りはタブ文字
Gmail	hogehoge@gmail.com
Github	https://github.com/hogehoge
...
```

それで、`PasteString`関数で`Loop,Read`＋`StringSplit`かなにかで参照すると。ただ、対応表が肥大化すると実行速度がえらいことになりそうだし、ホットストリングと対応表の両方に追加していくのも、まあそれも自動化すればいいのですがやっぱり面倒。

これが一番TextExpanderに近い動作といえばそうなのでしょうが。

## というわけで
結論としては、変数に格納しております。
Swift3で文字列を分割(split)する方法


使用言語とツールのバージョン情報は次のとおりです
swift3.1
Xcode 8.3.2


*初心者の備忘録です。*
*お役に立てたら幸いです。*

*さっそくコメントいただきましたので修正させていただきました。*


#スペース区切りの文字列の分割

```
import Foundation

let str = "abc def ghi"
let array = str.components(separatedBy:CharacterSet.whitespaces)
print(array[0])//"abc"
print(array[1])//"def"
print(array[2])//"ghi"
```
以前に他の方に書かれた記事を見ると2つ目のスペースも配列に入っているようでしたが、Swift3.1時点ではスペースは配列には入らないようになったみたいです。
また、`.components`以下を入力補完するとわかるように`separatedBy:`のあとは`CharacterSet`型というのは明白なので省略して`str.components(separatedBy: .whitspaces)`でもOKです。


#カンマ区切りの文字列の分割

```
import Foundation

let str = "abc,def,ghi"
let array = str.components(separatedBy:",")
print(array[0])//"abc"
print(array[1])//"def"
print(array[2])//"ghi"
```
スペース区切りのときの`separatedBy:`のあとを`","`ダブルクオーテーションで囲んだカンマで指定してあげるだけでできました！
たとえばスラッシュで区切った文字列を分解したいときは`"/"`
hogeで区切った文字を分解したいときは`"hoge"`を`separatedBy:`のあとに指定すればOK。

#改行区切りの文字列の分割

```
import Foundation

let str = "abc\ndef\nghi"
let array = str.components(separatedBy:CharacterSet.newlines)
print(array[0])//"abc"
print(array[1])//"def"
print(array[2])//"ghi"

```

こちらもスペース区切りの文字列とほぼ一緒で違うのは`separatedBy:`のあとの指定を`CharacterSet.newlines`とするだけです。
スペース区切りのと同様に`str.components(separatedBy: .newlines)`もOKです。
<br>

*以上となります。ココ間違っている！もっといい方法がある！などなどなんでも指摘等いただけると嬉しいです。*
タイトルの横に線をつけるスタイル

下記の画像のようにタイトル横に線を引くスタイル。

![スクリーンショット 2017-05-09 17.46.52.png](https://qiita-image-store.s3.amazonaws.com/0/113764/1a83df04-912d-2588-994a-8b00bbcb09b5.png)

```style.css
h1 {
    background: none;
    position: relative;
    text-align: center;
    width: 500px;
    margin: 0 auto;
}

h1::before {
    border-top: 2px solid #000;
    content: "";
    position: absolute;
    top: 50%;
    left: 0;
    width: 100%;
}

h1 span {
    background-color: white;
    display: inline-block;
    padding: 0 1em;
    position: relative;
}

```

```index.html
<h1><span>タイトルテキスト</span></h1>
```

たまーに使うので、メモ。
Angular CLIでテンプレートのコードがAoTコンパイル通らないケース

Angular CLIで `ng build` ではエラーにならないのに、`ng build --aot` や `ng build --prod` ではエラーになるケースがあります。

エラーとなるのはテンプレート部分のコードで、次のようにstring型の変数の頭に+を付けてnumberに変換していると軒並みエラーになってしまいます。


```ts:app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <div>
      <input type="text" [(ngModel)]="valueA" (ngModelChange)="doCalc()" />
      x
      <input type="text" [(ngModel)]="valueB" (ngModelChange)="doCalc()" />
      = {{resultValue}}
    </div>
    <button (click)="calc(+valueA, +valueB)">NG calc</button>
    <button (click)="resultValue = +valueA * +valueB">NG calc2</button>
    `
})
export class AppComponent {
  valueA: string = '1';
  valueB: string = '2';
  resultValue: number;

  constructor() {
    this.doCalc();
  }

  doCalc() {
    this.calc(+this.valueA, +this.valueB);
  }

  calc(a: number, b: number) {
    this.resultValue = a * b;
  }
}
```

これを `ng build --aot` すると `+valueA ` や `+valueB` の部分から以下のエラーが出ます。

> Argument of type 'string' is not assignable to parameter of type 'number'.
> The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
> The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.

なんのこっちゃなエラーで混乱しますが、ようするにテンプレート部分にごちゃごちゃしたコードを書かなければいいのです。と解釈して直しましょう...

※環境は @angular/cli 1.0.2, Angular 4.1.1です。以前のバージョンではこのようなコードでもエラーになりませんでしたが、現在はダメみたいです。

Template Syntaxついては[【Angular.io】 Template Syntax まとめ](https://qiita.com/manakuro/items/f2952236bd0a38843916)によくまとまっています。
cakephpで実行したSQLを確認する方法

結構書いた人多いと思うが、私は使った時なぜかどうしてもログが出てこなかったので、ここで詰まってる人もいるのかなぁーと思って
まずは、自分のコントローラーにこういうメソッドを追加しましょう

```ArticlesController.php
private function getLastQuery() { //privateはあるかどうか構わないがprivateの方をおすすめ
        $dbo = $this->Article->getDatasource(); //モデル名はArticleとする時
        $logData = $dbo->getLog();
        $getLog = end($logData['log']);
        $this->log($getLog['query'],LOG_DEBUG);
}

//使うとき
function test(){
        $this->Article->find('all');
        $this->getLastQuery(); //とりあえず見たいヘルパーの後ろに追加
}
```
けど偶にこんなように空のログが出る時もある

```debug.log
2017-05-09 16:57:10 Debug: Array
(
    [log] => Array
        (
        )

    [count] => 0
    [time] => 
)
```
SQLを確認する行為は、debuggerのクラスは2以上じゃないといけない
なので`cakephp/app/Config/core.php`をいじらないといけない

```cakephp/app/Config/core.php
Configure::write('debug', 2);
```

さらに共通のコンポーネントを作りました、よかったら使って見ましょう

```QueryComponent.php
<?php
App::uses('AppComponent', 'Controller/Component');
class QueryComponent extends AppComponent {

    public function getAllQuery($modelName) { 
        $model = ClassRegistry::init($modelName);
        $dbo = $model->getDatasource(); 
        $logData = $dbo->getLog();
        foreach ($logData['log'] as $key => $data) {
            $querys[$key]['query'] = $data['query'];
        }
        $this->log('Get ALL query of Model:'.$modelName,LOG_DEBUG);
        $this->log($querys,LOG_DEBUG);
    }

    public function getLastQuery($modelName) { 
        $model = ClassRegistry::init($modelName);
        $dbo = $model->getDatasource(); 
        $logData = $dbo->getLog();
        $getLog = end($logData['log']);
        $this->log('Get last query of Model:'.$modelName,LOG_DEBUG);
        $this->log($getLog['query'],LOG_DEBUG);
    }
}
```
rails db:create でデータベースが作れる


コマンド叩くと`config/database.yml`の設定に応じてデータベースを作ってくれる。

```
$ rails db:create
$ psql -l
            Name             | Owner | Encoding |   Collate   |    Ctype    | Access privileges
-----------------------------+-------+----------+-------------+-------------+-------------------
 hoge_rails_development | taku  | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 hoge_rails_test        | taku  | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
```


知らなかった...
Railsで使う<% %>と<%= %>について

どちらも、Railsを使うようになるとよく見るようになるものですが、HTMLやCSS、javascript、Ruby等を学んでいても出てこない(~~勉強を続けてるとだいたいどこかで見るでしょうが~~)ため、初見では「なんじゃ、これ？」となるでしょう。

これは**html.erbのファイルで扱われるもの**です。

基本的にhtml.erbのファイルはviewsという見た目に関するファイルの格納されているディレクトリに入っていますが、<% %>も<%= %>もそれらにRubyの処理を施すためのものになります。
前者と後者の違いは、いざ作成した内容をブラウザに表示するとなった時に、その内容が目に見える形で出てくるか否か、ということです。

以下の例は<% %>で囲まれた内容の例になります。

```ファイル名.html.erb
<% provide(:title, 'ホーム') %>
<h1>サンプル</h1>
```
上記のような内容の場合、ブラウザにはh1で囲われた「サンプル」という文字列しか映りません。
(ちなみに、上の内容がどういうものかは別の記事で書いている「[yieldについて](http://qiita.com/Evazain2/items/e7d27c6717b430302967)」で解説しています)

もう一つ、<%= %>についてですが、こちらはRubyの処理を行うと同時に、ブラウザに表示されます。以下はその例です。

```ファイル名.html.erb
<!DOCTYPE html>
<html>
<head>
  <title>アプリ名 | <%= yield(:title) %></title>
  中略
</head>
<body>

<%= yield %>

</body>
</html>
```
この内容についても詳しいところは[yieldについて](http://qiita.com/Evazain2/items/e7d27c6717b430302967)で解説していますが、yieldで引っ張ってきた内容を、それぞれブラウザ上で表示します。

```
<% %>は表示しないRubyの処理
<%= %>は表示もするRubyの処理
```
と、以上のように覚えておけば大丈夫かと思います。
SQLserverでdatetimeの項目を「yyyy年mm月dd日」の形式で表示する

# 概要

SQLserverでdatetimeの項目を「yyyy年mm月dd日」の形式で表示する方法です。

function等を使えば精緻な処理が可能だが、 FORMAT 関数が利用できないバージョンを使用している人、権限の問題がある人、大げさな処理を入れたくない人用

# 記述方法
*「yyyy年mm月dd日」形式
`left(STUFF(STUFF(STUFF(convert(varchar,GETDATE(),120),11,0 ,'日'),8,1,'月'),5,1,'年'),11)`
メモ：Laravelでredisを利用するときの関数の参照先

Laravelでredisを使用するとき、redisを実際に操作する関数がLravel側のドキュメントでは一覧で見ることができずに探すのに少し苦労したので備忘

##### ここを見ればOK

+ Redisを操作する関数の一覧(predis/predisのgithub上のソース)
https://github.com/nrk/predis/blob/v1.1/src/ClientInterface.php

##### 参考ページ

+ LaravelのRedis公式ドキュメント

https://readouble.com/laravel/5.3/ja/redis.html
https://laravel.com/api/5.4/Illuminate/Redis/Database.html
型を緩く判定するトレイツ

C++ において、ある名前のメンバ関数をクラスが持っているかどうか、また、そのメンバ関数が想定する型に一致するかどうかを判定するトレイツの定義を以前に紹介しました。

≫ [メンバの存在を判定する](http://qiita.com/SaitoAtsushi/items/d12735d5a17b33af1563)

しかし、この手法は型チェックが厳密すぎます。 必要以上に制約を厳しくしてしまう可能性があります。

まず、説明のため `int` を受け取って `int` を返すメンバ関数 `foo` を持っているかどうか判定するトレイツを同じ手法で作ってみます。

```cpp:foo_traits.h
// -*- mode:c++ -*-
#include <type_traits>

template<class T>
class has_foo {
  template<class U, int (U::*)(int)>
  struct helper_t { typedef T type; };

  template<class U, class V = T>
  struct helper : std::false_type {};

  template<class U>
  struct helper<U, typename helper_t<U, &U::foo>::type> : std::true_type {};

public:
  static const bool value = helper<T>::value;
};
```

このとき、以下のようなクラスたちを判定するとどうなるでしょうか？

```cpp:sample.cpp

#include "foo_traits.h"

class sample1 {
public:
  int foo(int x) {
    return x;
  }
};

class sample2 {
  public:
  char foo(int x) {
    return x;
  }
};

class sample3 {
public:
  int foo(long int x) {
    return x;
  }
};

class sample4 {
public:
  template<class T>
  T foo(T x) {
    return x;
  }
};

#include <iostream>

int main(void) {
  std::cout << has_foo<sample1>::value << std::endl;
  std::cout << has_foo<sample2>::value << std::endl;
  std::cout << has_foo<sample3>::value << std::endl;
  std::cout << has_foo<sample4>::value << std::endl;
  return 0;
}
```

結果はこうなります。

```
$ clang++ sample.cpp -std=c++11
$ ./a
1
0
0
1
```

しかし、返却値が `char` 型のときにそれを `int` 型の変数で受けても汎整数拡張でうまいこと処理されますし、仮引数が `long int` 型のところに `int` 型の値を渡そうとしても同様です。 `foo` が実質的に `int` 型の値を受け取って `int` 型の値を返すと__<ruby>看做<rp>(</rp><rt>みな</rt><rp>)</rp>せる</ruby>__ような場合には真を返すような緩い判定をする方法を考えてみました。

```cpp:foo_traits.h
// -*- mode:c++ -*-
#include <type_traits>

template<class T>
class has_foo {
  template<class U, class V = T>
  struct helper : std::false_type {};

  template<class U>
  struct helper<U, typename std::enable_if<std::is_convertible<decltype(static_cast<U*>(nullptr)->foo(int())), int>::value, T>::type> : std::true_type {};

public:
  static const bool value = helper<T>::value;
};
```

`decltype` の中に__実際に `int` 型の値を渡す式を書いてみる__という方法で判定しています。 また、返却値の型の判定には `is_convertible` を使いました。

このトレイツを使うと上述のサンプルはいずれも真を返します。

```
$ clang++ sample.cpp -std=c++11
$ ./a
1
1
1
1
```
Xamarin.Formsで単体テスト


Xamarin.FormsのPCLのユニットテストをやってみる。

なお、PCLでテストできるのはロジック部分のみ。
UIやプラットフォーム固有のもの（デバイスまわりとか）をテストする場合は、各プラットフォーム向けの単体テスト用プロジェクトを作成する必要あり。

## 単体テスト用プロジェクトを作成

[その他][.NET]にある[NUnit ライブラリ プロジェクト]を選択して新規プロジェクトを作成する。

![new_project.png](https://qiita-image-store.s3.amazonaws.com/0/169798/273437dd-0223-4b5c-98f3-bec0029fa57c.png "new_project.png")

## 参照を追加

担当テスト用プロジェクトの[参照]に、テスト対象にするPCLプロジェクトを追加する。

![edit_reference.png](https://qiita-image-store.s3.amazonaws.com/0/169798/f826b4fd-d677-6fe7-acbc-321095498db7.png "edit_reference.png")

こんな感じ。

![project_tree.png](https://qiita-image-store.s3.amazonaws.com/0/169798/78916258-42a7-c879-7924-8088047397ed.png "project_tree.png")
</div>

## テストモジュール作成

まず、テストしたいクラスはこれ。
これはPCLプロジェクトにある。

```c#:MyService.cs
namespace MyApp.Services
{
	public class MyService
	{
		public string Greet()
		{
			return "Hello from MyService.";
		}
	}
}
```

で、単体テスト用プロジェクトに、Test.csをリネームするなりして、このような↓↓↓クラスを作成。

```c#:MyServiceTest.cs
using NUnit.Framework;
using System;

using MyApp.Services;

namespace MyApp.UnitTest
{
	[TestFixture()]
	public class MyServiceTest
	{
		[Test()]
		public void TestGreet()
		{
			MyService service = new MyService();
			Assert.AreEqual("Hello from MyService.", service.Greet());
		}
	}
}
```

## テスト実行

単体テスト用プロジェクトを選択した状態で、メニューバーの[実行][単体テストを実行する]を選択する。

![run_unit_test.png](https://qiita-image-store.s3.amazonaws.com/0/169798/dcff66ba-b6e3-6862-913f-a91da8918752.png "run_unit_test.png")

するとテストが実行され、結果が[テスト結果]ペインに表示される。

![test_result.png](https://qiita-image-store.s3.amazonaws.com/0/169798/ebc9c085-90a1-19ae-9153-cfcc0eef7776.png "test_result.png")

グリーンです。OKですね。

とりあえずは以上です。



## こちらを参考にしました

Testing with Xamarin Forms
https://forums.xamarin.com/discussion/21504/testing-with-xamarin-forms