OmniAICreator/Qiita-1.07M huggingface dataset:
Nginxで複数ドメインに対応する

複数ドメインに対応するためconfを分けていく
大元のnginx.confは以下になります。

## nginx.confの設定
```nginx:/etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    index   index.php index.html index.htm;

}
```

この設定ファイルを複数作るだけ。

```nginx:/etc/nginx/conf.d/domainA.conf
server {
    listen       80;
    server_name  domain.com;
    root         /var/www/html/domainA;
    index        index.php index.html;
    location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/html/domainA$fastcgi_script_name;
        #fastcgi_param  PATH_INFO $fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_read_timeout 180;
    }


    include /etc/nginx/default.d/*.conf;

    location / {
    }

    # redirect server error pages to the static page /40x.html
    #
    error_page 404 /404.html;
        location = /40x.html {
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

}
```
競プロでサンプルケースをテストするCLIを作った


[github.com/elzup/compep - Debug CLI for Competitive programming C\+\+](https://github.com/elzup/compep)


![compep run](https://user-images.githubusercontent.com/2284908/31326947-8df7ad4e-ad06-11e7-99a4-ca013d5804f2.gif)

↑ 左が CLI。右がエディタ。
C++ のコードを編集して保存すると、コンパイル、サンプルケースのテストをします。

Node.js で書きました。
ファイル変更の監視に fs.watch, 標準出力のカラーリングに [chalk](https://github.com/chalk/chalk) を使っています。


# 使い方

```
$ npm install --global compep
$ compep                            # コーディング用のディレクトリで
```

`main.cpp` をコーディング。
`./testcase/main.testcase.txt` にテストケースを書きます。

### 作業ディレクトリ構成
必要なファイル(main.cpp、テストケース)がない場合最初に作られます。

```
├── main.cpp
├── out
│   └── main.out
└── testcase
    └── main.testcase.txt
```

テストしたいケースを以下のフォーマットで書きます。


```
input values of case1
----
output values of case1
====
input values of case2
----
output values of case2
```

入力と出力を`----`区切り、それらのテストケースを`====` 区切りです。(この辺はまだ軽くしか考えてないです)


# 使っていて思うこと
このテスト(というかチェック？)のしかたは AtCoder や Codeforces で使えるんですが TopCoder の形式には使えませんでした。

サンプルケースのコピペは面倒です。なので bookmarklet で問題ごとには一回で済ませられるようにしてます。
atcoder で使っているのはこれです。

```js
javascript:var codes = [].map.call(document.querySelectorAll(".div-sample-copy"), function (e) { return e.nextSibling.innerHTML });var n = 2;var len = Math.round(codes.length/n,10);var ret = [];for(var i=0;i<len/2;i++){    ret.push( codes.slice( i*n, i*n+n ));}var text = ret.map(function (e) { return e.join("----\n"); }).join("====\n");document.write('<pre>' + text + '</pre>');
```

# その他
私は Mac 環境を使っていて、競技プログラミングを C++ で書き始めたのは最近です。C++ (競技プログラミング)のデバッグ方法、作業環境はまだ考え中です。
いいプラグインがあるエディタやツールがあれば教えていただきたいですm(_ _)m。
wysiwygエディタについての学習11


## draft-jsを使ってみる続き

### example

https://github.com/facebook/draft-js/tree/master/examples

### ハンドルオフがうまくいかない

https://draftjs.org/docs/advanced-topics-decorators.html#content

### キーバインド

コードのコメントにAltとCtrlを使った時のAltGraphはバインドしないほうがいいというような記載あり。

### カスタムコンポーネント

https://draftjs.org/docs/advanced-topics-block-components.html
https://github.com/facebook/draft-js/blob/master/examples/draft-0-10-0/media/media.html

## 残課題

https://draftjs.org/docs/advanced-topics-block-components.html

カスタムコンポーネントがまだ動かせていない

https://draftjs.org/docs/advanced-topics-decorators.html#setting-new-decorators

デコレーターの切り替えがうまくいかなかった

## DraftJSとツールバー

プラグインをまとめたモジュールはよさげ

https://github.com/draft-js-plugins/draft-js-plugins
https://www.draft-js-plugins.com/plugin/static-toolbar

draft-jsはツールバーとかは提供せずに純粋なエディタ部分のみなのね。
その辺を追加したのが似たような名前のモジュールとして公開されてたりするってことか。
一旦、ボタンタグでいくか。

## propTypes

サンプルを実装していたら、SDKから怒られたので調べた。

React.jsのProp - Qiita
https://qiita.com/koba04/items/bc13d1f42964278ae14e

古い記事だけど分かりやすい。
外部との普遍なインターフェイスなので型チェックする仕組みってことね

Typechecking With PropTypes - React
https://reactjs.org/docs/typechecking-with-proptypes.html

その後、モジュール化されたと。

## 参考事例

30分で出来るDraft.js+React.js リッチエディタ作成入門 - Qiita
https://qiita.com/mottox2/items/9534f8efb4b09093a304
VS Code でタスク実行（ver. 1.17.0対応）

# VS Code でタスク実行

[こちら](https://qiita.com/socket1016/items/fdcc454e4ffe70a07507)を参考にpython実行タスクを組んでました。

`VS Code`のアップデートのせいか、タスクが `ctrl + shift + B` で実行できなくなっていました。

そこで、`tasks.json`を以下のように編集しました。

```json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "python",
            "type": "process",
            "command": "python3",
            "args": [
                "${file}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "new"
            }
        }
    ]
}

```

`group.isDefault`を`true`にするとキーバインドが効くようです。
「Gem::InstallError: XXXX requires Ruby version」に遭遇した時のRubyのバージョンのあげ方

# はじめに
Railsプロジェクトでおもむろに`bundle install`を実行しようとした時`Gem::InstallError: XXXX requires Ruby version`というエラーが出て実行できないということがあります。これはRubyのバージョン古く、あるgemに対応していない時に起こるものです。

今回は`sample_project`というRailsアプリケーションで上記のエラーが起こったことを想定して`2.2.5`から`2.4.0`に上げる例をもとにRubyのバージョンを上げる方法を説明します。また、Rubyはrbenvでバージョン管理されているものとします。

一般的なrbenvを利用したRubyのバージョンアップ方法もこれから説明する手順で行うことができるので参考にしていただければと思います。

# Rubyバージョンアップ方法

## 現在のバージョンの確認

まずはRubyのバージョンを確認します。

```bash
$ ruby --version
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin16]
```

もしくは以下のように確認できます。

```bash
$ rbenv version
2.2.5 (set by /Users/nishina/sample_project/.ruby-version)
```

rbenvのバージョン一覧から確認する場合は以下のようにします。

```bash
$ rbenv versions

system
2.2.2
* 2.2.5 (set by /Users/nishina/sample_project/.ruby-version)
```

## Rubyのインストール

(任意)Rubyをインストールする前にrbenvのリストを最新の状態に更新しておきます。これを先に実行することで最新のRubyのバージョンもインストール可能なものにリストアップされます。

```bash
# Homebrewのアップデートをする
$ brew update

# ruby-buildをアップデート
$ brew upgrade ruby-build

$ ruby-build --version
-> 日付が直近のものになっていればOK
```


rbenvでインストールできるRubyの一覧を確認します。

```bash
$ rbenv install -l

Available versions:
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  ...
  ...

```

Rubyのバージョンを指定してインストールします。

```bash
$ rbenv install 2.4.0
```

rbenvの中に先ほどインストールされたバージョンがリストアップされていればOKです。

```bash
$ rbenv versions
system
2.2.2
* 2.2.5 (set by /Users/nishina/sample_project/.ruby-version)
2.4.0
```

## Rubyのバージョン変更

インストールしたRubyのバージョンをアプリケーションで利用するように指定します。
`local`と指定することでそのプロジェクトで使うRubyに限定してRubyのバージョンを設定できます。

```bash
$ rbenv local 2.4.0
```

(もし、通常使うRubyのバージョンを変更するのであれば`global`を指定します。)

```bash
$ rbenv global 2.4.0
```

設定し終わったらRubyのバージョンを確認します。
以下のように、sample_projectでは2.4.0が設定されていることがわかります。

```bash
$ rbenv versions

system
2.2.2
2.2.5
* 2.4.0 (set by /Users/nishina/sample_project/.ruby-version)
```

(もし、globalなら以下のように(${ユーザー名}/.rbenv)で指定されるようになります。)

```bash
$ rbenv versions

system
2.2.2
2.2.5
* 2.4.0　(set by /Users/nishina/.rbenv/version)
```


## bundle install再実行

以上でRubyのバージョンを上げることができたいので再度`bundle install`を実行するのですが、
`rbenv rehash`を実行することでbundlerでいれたコマンドを利用することができます。

```
$ rbenv rehash 
```

# 参考
[rbenvをupdateして最新のRubyバージョンをインストール](http://morizyun.github.io/ruby/rbenv-update-mac-homebrew.html)
[rbenv install -l のリストを更新する](http://nafuruby.hatenablog.com/entry/2014/10/11/195016)
ansibleでdockerをいじろうとしてハマった

くそメモです。

# エラーが出た
docker用playbookでauto_removeを試してみようとしたところ、下記のエラーが出た。

```
"'auto_remove' is not compatible with docker-py, and requires the docker python module"
```

# 謎解き
上記でググってみると、ソースが発見できた。

```docker_container.py
---
    if not HAS_DOCKER_PY_2 and client.module.params.get('auto_remove'):
        client.module.fail_json(msg="'auto_remove' is not compatible with docker-py, and requires the docker python module")
---
```

HAS_DOCKER_PY_2とは何ぞや、ということでさらに調べると

```docker_common.py
try:
    from requests.exceptions import SSLError
    from docker import __version__ as docker_version
    from docker.errors import APIError, TLSParameterError, NotFound
    from docker.tls import TLSConfig
    from docker.constants import DEFAULT_TIMEOUT_SECONDS, DEFAULT_DOCKER_API_VERSION
    from docker import auth
    if LooseVersion(docker_version) >= LooseVersion('2.0.0'):
        HAS_DOCKER_PY_2 = True

```

なるほど、dockerのversionが古いから無理なのか…ってpipでインストールしてるはずなんですけど！！

```
# pip list 2>/dev/null | grep docker
docker (2.5.1)
docker-py (1.10.6)
docker-pycreds (0.2.1)
# python -c "from docker import __version__ as v;print v"
1.10.6
```

あ、docker-pyが入ってる…。これがいかんかった。
docker-pyは現在dockerに内包されるようになっている。
[公式github](https://github.com/docker/docker-py)にも「pip install docker」って書いてある。

じゃあdocker-py消そうかな。

```
# pip uninstall docker-py
Uninstalling docker-py-1.10.6:
(略)
Proceed (y/n)? y
  Successfully uninstalled docker-py-1.10.6
# 
```

したっけ、これで2.5.1になって無事auto_remove使えるっしょ…バージョン確認しよう。

```
# python -c "from docker import __version__ as v;print v"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named docker
```

**(||°ਊ°)え…**
モジュール見つかんなくなっちゃったよ…。


ここでもう一度pip uninstallのログを見てみる。

```
Uninstalling docker-py-1.10.6:
  /usr/lib/python2.7/site-packages/docker/__init__.py
```

**そ こ 消 し と っ た ん か い ！ ！ ！**

どうやら、docker-pyを間違って入れてしまって、消すと、docker側の\_\_init\_\_.pyが巻き添えを食ってお亡くなりになり、
パスが通らなくなってしまうようです。ははは。

ということで、docker入れなおします。

```
# pip uninstall docker
(略)
# pip install docker
(略)
# python -c "from docker import __version__ as v;print v"
2.5.1
```

めでたし。
\(auto_removeもチリバツで効いた)

# 教訓
- 昔の記事を鵜呑みにしてpip install docker-pyしない
- もしinstallしちゃったらdockerもpip installし直せ
- うそはうそであると見抜ける人でないとQiitaを使うのは難しい
Java8のお勉強(StaticIFとDefaultメソッド)

初投稿なので書き慣れる意味でも簡単なところから。
Java9も出たのに今更Java8かよって思われちゃうと思いますが・・・。

まずStaticIFとDefaultメソッドを持ったIFを作ります。

```
package java8.staticIfAndDefaultIf;

/**
 * StaticIFとデフォルトメソッドのテスト用（Java8お勉強中）
 * @author komikcomik
 *
 */
public interface StaticIF {

	/** デフォルトメソッドです */
	public default void helloDefault() {
		System.out.println("hello Default");
	}

	/** 普通のメソッドです */
	public void hello();

	/** Staticメソッドです */
	public static void helloStatic() {
		System.out.println("hello static");
	}

}
```
とまあこんな感じでstaticメソッドをＩＦに実装できるようになったらしい。
上記StaticIFインタフェースをimplementsしたのが以下。

```
package java8.staticIfAndDefaultIf;

/**
 * StaticIFの実装クラス .
 * @author komikcomik
 *
 */
public class StaticIFImpl implements StaticIF{

	@Override
	public void hello() {
		System.out.println("hello in Impl");
	}

}
```

ついでにもう一個。こっちはdefaultメソッドをオーバーライドしました。

```
package java8.staticIfAndDefaultIf;

/**
 * StaticIFの実装クラス。
 * こっちはdefaultメソッドをオーバーライドしました。
 * @author komikcomik
 *
 */
public class StaticIFImplDefaultOverride implements StaticIF {
	@Override
	public void hello() {
		System.out.println("hello in ImplDefaultOverride");
	}

	public void helloDefault() {
		System.out.println("override default");

	}
}
```

締めに、この2クラス呼ぶクラスを作成。

```
package java8.staticIfAndDefaultIf;

/**
 * StaticIFを実装した2クラスを呼び出す人。
 * @author komikcomik
 *
 */
public class StaticIFCaller {

	public static void main(String[] args) {
		StaticIF staticIF = new StaticIFImpl();
		staticIF.hello(); // StaticIFImplで実装したのが出る。
		staticIF.helloDefault(); // StaticIFのdafaultメソッド分が出る。
		StaticIF.helloStatic(); // StaticIFのstaticメソッド分が出る。

		StaticIF staticIF2 = new StaticIFImplDefaultOverride();
		staticIF2.hello(); // StaticIFImplDefaultOverrideで実装したのが出る
		staticIF2.helloDefault(); // StaticIFの内容がoverrideされてStaticIFImplDefaultOverrideで実装したのが出てる。

	}
}

```

以下、実行結果。想定通りですね。

```
hello in Impl
hello Default
hello static
hello in ImplDefaultOverride
override default
```

defaultメソッドはIFを継承したサブクラスで全部同じ処理をしぶしぶ書いていたなんてケースでは使えないこともないか。
StaticIFはあまり使いどころが浮かばなかったです。
マイグレーション番号が競合するのが怖くなくなるgitの管理方法ススメ(複数開発)

こんにちは！エイチーム引越し侍の加藤です！

みなさんマイグレートしてますか？

僕もこの会社に入って1年がたちますが既に20回くらいマイグレートしてる気がします。
複数開発環境があるとマイグレーション番号管理ってのが必要になってくると思いますが、
そんな僕くらいマイグレートしてると結構他の人の開発とマイグレーション番号が競合することが多いんですよね。
とってもジェントルマンな僕は「どうぞお先に行ってください、僕のほうが合わせますよ」なんて余裕を見せたりしています。

また、先にスキーマファイルとマイグレーションファイルをリリースしてマイグレートだけ先やるって方も多いかもですが、そうなると仕様変更でスキーマまた変えなきゃってこともありますよね。

そんな2つの状況も簡単に対応できる、
一応我流で編み出した誰かと被っても全然怖くない方法があるので皆さんにご紹介します。

簡単基本３ステップ
①スキーマファイルとマイグレーションファイルだけ作成したブランチAを作る
②モデルファイルを作成してブランチBにcheckoutしてコミット
③ブランチBで開発を行う

なのでAにはスキーマファイルとマイグレーションファイルのみがコミットされている状態で
Bにはモデルファイルと開発したものがコミットされる状態ですね。
※マイグレーションファイルとスキーマはコミットしません
この状態がとっても柔軟に対応できるのを今から説明しますね

# CASE 1 誰かがマイグレーションした場合
さーリリースするぞー！って時にいつの間にかしれっとマイグレーション番号上がっていることってありますよね。
この場合はいったんブランチAに戻りマイグレートを戻します。
そしてマイグレーションファイルを削除して
masterをrebaseして他の人のマイグレーションファイルをブランチAに取り込みます
そこからマイグレーションファイルを作成すればもう番号が新しく付番されますね！
あとはマイグレートしてリリースに入りましょう。

# CASE 2 仕様が変更になってスキーマをさらにいじりたくなった場合
ほぼCASE 1の手順と同じですが、
いったんブランチAに戻ってマイグレートを戻します。
そしてマイグレーションファイルを削除して
スキーマファイルをいじります
再度マイグレーションファイルを作成して
マイグレートします。
ここでモデルファイルを作成するのですが、git stashしてブランチBでgit stash popするとコンフリクトしてしまうかもですが、いい感じにマージできると思います。

# CASE 3 なにもする必要がなくリリースする場合
ブランチAでmerge(pull) requestだして、無事マージされたらリリースしてマイグレート
ブランチBでもmerge(pull) request出して、無事マージされたらリリース
ここでソースチェックが重複しないのがまたいいですよね

以上です。
いかがでしたか？

意外と自分で編み出した方法がみんな知らないなーと思ったので記事にしてみました。
これでマイグレート全然怖くないわー！って人が増えてくれると幸いです。

# 追伸
株式会社エイチーム引越し侍では、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい！という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております！！

> [エイチームグループ採用サイト（Web開発エンジニア職）](http://hikkoshi.a-tm.co.jp/recruit/request.php?ea=ktqiita_migrate_number)
Ruby on Rails データ更新

# 環境

+ CentOS6.5
+ Rails 5.1.4
+ MySQL 5.7
+ Ruby 2.3.1

[RailsでMySQLのテーブル作成](https://qiita.com/shell/items/cc1e66d56b0267c4b4ab)で作成したテーブルを使います。

テーブル名： 

+ users

カラム：

+ id (BIGINT(20)) <= PK
+ uuid (varchar(255))
+ name (varchar(255))
+ age (int(11))
+ created_at (datetime)
+ updated_at (datetime)


# 基本

ID３のユーザのageを５０に更新します。

```
user = User.find(3)
user.age = 50
user.save
```

↓　が実行される

```
SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
UPDATE `users` SET `age` = 50, `updated_at` = '2017-10-09 05:49:44' WHERE `users`.`id` = 3
```

## 複数レコードの場合はどうなるか??

### 全てのレコード更新

usersテーブルの全てのレコードのageを1000にします

```
User.update_all ['age = ?', 1000]
```

これが実行される

```
UPDATE `users` SET age = 1000
```

### 条件に当てはまる複数レコードを更新

例：age = 2のデータのnameをZZZにしたい

イメージ：

```
UPDATE users SET name = 'ZZZ' WHERE age = 2
```

をRailsで実行できるようにしたい。

```
users = User.where('age = ?', 2).update_all(:name => 'ZZZ')
```

イメージ通り、↓が実行された！

```
UPDATE `users` SET `users`.`name` = 'ZZZ' WHERE (age = 2)
```
[修正済み]XamarinでiOS 11 SDKを使うと特定環境でSearchBarが使えないことに対する対処法

Xamarin.Forms 2.5 以降で修正済みです

---

Xamarin.iOS11以前では

```
<StackLayout Orientation="Horizontal">
  <!--  ここにちょっとしたアイコンとか  -->
  <SearchBar HorizontalOptions="FillAndExpand" />
</StackLayout>
```

上記のようなHorizontalな方向のStackLayoutにSearchBarをそのまま挿入することが出来たのですが，Xamarin.iOS11以降ではうまくいかないようです．

XAML Previewで確認すると
`Objective-C exception thrown. Name: NSInternalInconsistencyException Reason: -[UISearchBar sizeThatFits] does not support passing non-finite values ({inf, 56})`
みたいな例外が吐かれます．

なので，

```
<StackLayout Orientation="Horizontal">
  <!--  ここにちょっとしたアイコンとか  -->
  <SearchBar HorizontalOptions="FillAndExpand" WidthRequest="1" />
</StackLayout>
```

みたいに`WidthRequest`を雑につけたりして対処するといい感じでした．

このケースはBugzillaに報告されているようです． 
[Error with SearchBar inside of a Grid with iOS 11 SDK](https://bugzilla.xamarin.com/show_bug.cgi?id=59595)

最近Xamarin.FormsにPRがあったみたいです，早く反映されるといいですね．
[[iOS11] Don't pass infinite value to UISearchBar width #1203](https://github.com/xamarin/Xamarin.Forms/pull/1203)
GitLabのバックアップ先をNASにする

## GitLabのバックアップ先をNASにする
GitLabのバックアップをNASに保存するようにしたのでメモ
GitLabバージョン：GitLab Community Edition 9.1.10

## GitLabのバックアップ方法
GitLabではコマンド1つでバックアップファイルを作ってくれるのでとても便利。

```
$ sudo gitlab-rake gitlab:backup:create
```

バックアップファイルの保存先や保存期間も、[自由に変更できる](http://inaba.hatenablog.com/entry/2016/12/24/051330)。


## NASへのバックアップ保存
NASをmountして、バックアップファイルの保存先をNAS内のフォルダにしようとしたが、フォルダの権限の関係でうまくいかなかったので、バックアップ用シェルスクリプトを用意した。
#### バックアップの保存期間設定
初めに、どれくらい古いバックアップファイルも残すかを設定。今回は保存期間を7日に設定。

```
$ sudo emacs /etc/gitlab/gitlab.rb

#backup_keep_timeを設定（7日間のデータのみを保持）
gitlab_rails['backup_keep_time'] = 604800

#設定反映
$ sudo gitlab-ctl reconfigure 
```

#### バックアップ用シェルスクリプト
バックアップファイルを生成したのち、rsync で --deleteをつけてNASに飛ばすことで、NAS上にも古いバックアップファイルが残らないようにしている。

```
# !/bin/sh

echo "Start backup GitLab"
sudo mount -t cifs //192.168.XXX.XXX/ /mnt/NAS/  -o password=''
sudo gitlab-rake gitlab:backup:create
sudo rsync -au --delete /var/opt/gitlab/backups/ /mnt/NAS/backup/gitlab
```
MacでRails5のbundle install時にnio4rのエラーが出る

* macOS Sierra
* Ruby 2.4.1

Rails5をインストールしようとしたら、`nio4r`のとこでエラーが出る。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
    current directory: /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/nio4r-2.1.0/ext/nio4r
/Users/ryo/.rbenv/versions/2.4.1/bin/ruby -r ./siteconf20171009-1873-ylw7vp.rb extconf.rb
checking for unistd.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/ryo/.rbenv/versions/2.4.1/bin/$(RUBY_BASE_NAME)
/Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:457:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:588:in `try_cpp'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:1095:in `block in have_header'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:945:in `block in checking_for'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:351:in `block (2 levels) in postpone'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:321:in `open'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:351:in `block in postpone'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:321:in `open'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:347:in `postpone'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:944:in `checking_for'
	from /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/2.4.0/mkmf.rb:1094:in `have_header'
	from extconf.rb:5:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions/x86_64-darwin-16/2.4.0-static/nio4r-2.1.0/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/nio4r-2.1.0 for inspection.
Results logged to /Users/ryo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions/x86_64-darwin-16/2.4.0-static/nio4r-2.1.0/gem_make.out

An error occurred while installing nio4r (2.1.0), and Bundler cannot continue.
Make sure that `gem install nio4r -v '2.1.0'` succeeds before bundling.

In Gemfile:
  rails was resolved to 5.1.4, which depends on
    actioncable was resolved to 5.1.4, which depends on
      nio4r
```

書いてある通り、 `mkmf.log` の中身を見てみたら以下の1行が書いてある。

```
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```

Xcode9.0にバージョンアップした為か、ライセンスに同意してない状態だった為にエラーになっていたようでした。
Xcodeを起動して、ライセンス画面で`agree`を選択したらエラー解消されました。
何番煎じかわからないけどモブプログラミングをやってみた

巷で噂のイケてるプログラミング手法があると聞いて、会社の同期＋後輩を誘って、もぶもぶ会を開催しました。

# やったこと

* メンバー：6人
* 設備：50型くらいのモニター＋プロジェクタ
* お題：フルスクラッチでdiffコマンド(文字列比較)を作る
* 使用言語：使ってみたい人が多かったpython3
* ドライバー交代：mobsterを使って、時間区切り

|時間|内容|
|---|---|
|13:00 - 13:05|前説|
|13:05 - 13:15|使用言語とお題の決定|
|13:15 - 14:15|モブプログラミング1週目|
|14:15 - 14:55|1週目振り返り & 休憩|
|14:55 - 15:10|設計|
|15:10 - 16:50|モブプログラミング2週目|
|16:50 - 17:00|振り返り|

# わかったこと(1週目)

* 思ったより楽しかった。
* すぐバグ解決していぇええええ！感があった。
* 他人のコードの書き方がわかる。
  * ネーミングなど。
* ゴールが共有できていないとダメだよね。
  * 設計してないよね。
    * 時間取って設計はやらないとダメなんじゃない？
  * 何をどうするか考えていないと迷う。
* 取り残される感覚はなかった。
  * 一人でやるより手際よかった。
  * 他の人が調べてくれるのがうれしい。
* チーム単位で見るとどうなのか？
  * 生産性はいいのか悪いのか？
* 置き去りになるとしんどい。
  * ついていけない時がある。

楽しかった、一人でやるよりうまくできた、というポジティブな意見がある一方、  
とりあえずで初めて途中で迷子になったよね、一度置き去りになるとしんどい、というネガティブな意見もありました。  

# 次にやること(1週目)

* 設計する
  * 10 - 15分くらい
* 取り残される人が出ないようにする。

ということで、2週目に入る前に、設計する時間を作りました。
15分くらいでざっと全員の認識を合わせ、2週目はテストも書こう、ということでTDDでモブプログラミングを進めました。

# わかったこと(2週目)

* 今回はみんなに助けてもらえたけど、現場では助けてもらえないので、課題がある。
  * コミュケーションの差が出そう。
* 付いてこれない人を引き上げようとした。
* 自分たちがやっていることを共有しながら進めることができた。
* 笑いが多くなった。
* エラー発生時に誰かがすぐ解決してくれる。
* バグが誰の責任にもならない。
* スキル低い人もレベルアップできそう。

# 次にやること(2周目)

* もう1回モブプログラミングやりたい。
  * テーマは誰かの持ち込みか、モブプログラミングをもう1回やる、という場を作る。
* TDDはもう少しやりたい(初経験者より)。

ここで、今回のもぶもぶ会はお開き。  
2週目では、1週目の課題を解決しながら、新しいこと(TDD)を取り入れることができました。

# まとめ

今回、もぶもぶ会と称してお試しでやりました。
問題解決の速さや、楽しい、ということもありますが、スキル・知識の共有が加速されることに意義を感じました。
2周目の最初は、私が「先にテストを書くんだよ」などと言いつつ進めていたのですが、途中からは、メンバーが勝手に、お互いに注意しながら、TDDを進めていました。  

何番煎じかわからないですが、それでも、誰かに共有したくなる、楽しくてイケてるプログラミング手法でした！！！
Ruby on Rails + MySQLデータ挿入

# 環境

+ CentOS6.5
+ Rails 5.1.4
+ MySQL 5.7
+ Ruby 2.3.1

[RailsでMySQLのテーブル作成](https://qiita.com/shell/items/cc1e66d56b0267c4b4ab)で作成したテーブルを使います。

テーブル名： 

+ users

カラム：

+ id (BIGINT(20)) <= PK
+ uuid (varchar(255))
+ name (varchar(255))
+ age (int(11))
+ created_at (datetime)
+ updated_at (datetime)


# データ挿入

## INSERT

```
user = User.new(uuid: 'ABCDEFG',name: 'newUser', age: 99)
user.save
```

もしくは

```
user = User.create(uuid: 'ABCDEFG',name: 'newUser', age: 99)
```

createはnewとsaveを同時に行ってくれる。便利！！

でも、saveを使うとinsert処理の成功・失敗が返ってくるので処理の成否でその後の処理を分けたい場合はsaveを使うべき。

## BULK INSERT

＊BULK INSERTそのものについてはこちらを参考
[バルクインサート (bulk insert)とは](http://wa3.i-3-i.info/word15497.html)

activerecord-importを使用します。

Gemfileに
```
gem 'activerecord-import'
```

を追記し、 bundle installします。

bundle installしたら下記のような処理を書くことによってbulk insertが使用できます。

```
newUsers = []
newUsers << User.new(uuid: 'AAA', name: 'AAAname', age: 90)
newUsers << User.new(uuid: 'BBB', name: 'BBBname', age: 80)
newUsers << User.new(uuid: 'CCC', name: 'CCCname', age: 70)
User.import newUsers
```

実際に実行されたSQLが↓です

```
INSERT INTO `users` (`id`,`uuid`,`name`,`age`,`created_at`,`updated_at`) 
VALUES (NULL,'AAA','AAAname',90,'2017-10-09 05:11:12','2017-10-09 05:11:12'),
(NULL,'BBB','BBBname',80,'2017-10-09 05:11:12','2017-10-09 05:11:12'),
(NULL,'CCC','CCCname',70,'2017-10-09 05:11:12','2017-10-09 05:11:12')
ON DUPLICATE KEY UPDATE `users`.`updated_at`=VALUES(`updated_at`)
```
JSON を treeコマンド風に表示する gem を作った

JSON を tree コマンドっぽく表示出来ます。

http://jsonplaceholder.typicode.com/users/1

```js
{
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
      "lat": "-37.3159",
      "lng": "81.1496"
    }
  },
  "phone": "1-770-736-8031 x56442",
  "website": "hildegard.org",
  "company": {
    "name": "Romaguera-Crona",
    "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
  }
}
```

これがこうなります

```
curl http://jsonplaceholder.typicode.com/users/1 | jt
```

出力

```console
root
├──── "id": 1
├──── "name": "Leanne Graham"
├──── "username": "Bret"
├──── "email": "Sincere@april.biz"
├──── "address"
│       ├──── "street": "Kulas Light"
│       ├──── "suite": "Apt. 556"
│       ├──── "city": "Gwenborough"
│       ├──── "zipcode": "92998-3874"
│       └──── "geo"
│               ├──── "lat": "-37.3159"
│               └──── "lng": "81.1496"
├──── "phone": "1-770-736-8031 x56442"
├──── "website": "hildegard.org"
└──── "company"
        ├──── "name": "Romaguera-Crona"
        ├──── "catchPhrase": "Multi-layered client-server neural-net"
        └──── "bs": "harness real-time e-markets"
```

これとは別ですが、もっと便利なやつで [jq](https://stedolan.github.io/jq/) というものがあります。

## ソースコード

https://github.com/siman-man/jt
PythonでWindows共有フォルダへアクセス

2018/4/23 追記

より詳細な使い方の記事を書きました。

[pysmbの使い方（接続・切断）](https://qiita.com/t2kojima/items/5db8dadaa6e07321d25f)
[pysmbの使い方（ファイル受信）](https://qiita.com/t2kojima/items/6c20a7801467221470ac)
[pysmbの使い方（ファイル送信）](https://qiita.com/t2kojima/items/a6b81de771ac45c9948b)
[pysmbの使い方（ロギング）](https://qiita.com/t2kojima/items/4fc5e2e2c041b2c16824)

----

pythonでWindows共有フォルダへアクセスしたい場合、
pysmbパッケージを使用しsambaで接続する。
http://pysmb.readthedocs.io/en/latest/index.html

##実行環境
python 3.5.3
pysmb 1.1.19

##インストール
pipでインストールする。
`pip install pysmb`

##使い方

###ファイルリストの取得
`\\<ip_address>\temp\a\b\c`のファイルリストを取得する場合

```python:samba_test.py
# !/usr/bin/env python
# coding:utf-8

import platform
from smb.SMBConnection import SMBConnection

if __name__ == "__main__":

    # connection open
    conn = SMBConnection(
        '<user>',
        '<password>',
        platform.uname().node,
        '<remote_hostname>',
        domain='WORKGROUP',
        use_ntlm_v2=True)
    conn.connect('<ip_address>', 139)

    items = conn.listPath('temp', 'a/b/c')
    print([item.filename for item in items])

    conn.close()
```

- itemsへは[SharedFile](http://pysmb.readthedocs.io/en/latest/api/smb_SharedFile.html)クラスのリストが返される。
- tempおよびa/b/cが存在しない場合は当然エラーとなる。
- domainは指定しなくても繋がるよう、domain=''でもOK

###ファイルの取得
`\\<ip_address>\temp\a\b\c\hoge.txt`を`/var/hoge`として保存する。

```python:samba_test.py
# !/usr/bin/env python
# coding:utf-8
""" samba_test.py """

import platform
from smb.SMBConnection import SMBConnection

if __name__ == "__main__":

    # connection open
    conn = SMBConnection(
        '<user>',
        '<password>',
        platform.uname().node,
        '<remote_hostname>',
        domain='WORKGROUP',
        use_ntlm_v2=True)
    conn.connect('<ip_address>', 139)

    with open('/var/hoge', 'wb') as file:
        conn.retrieveFile('temp', 'a/b/c/hoge.txt', file)

    conn.close()
```

- ファイル自体は不要で、中身だけ知りたい場合はBytesIOを使う

    ```python:samba_test.py
    import io

    with io.BytesIO() as file:
        conn.retrieveFile('temp', 'a/b/c/hoge.txt', file)
        file.seek(0)
        print([line.decode() for line in file])
    ```

###ファイルを送る
`/var/hoge`を`\\<ip_address>\temp\a\b\c\hoge.txt`として保存する。

```python:samba_test.py
# !/usr/bin/env python
# coding:utf-8
""" samba_test.py """

import platform
from smb.SMBConnection import SMBConnection

if __name__ == "__main__":

    # connection open
    conn = SMBConnection(
        '<user>',
        '<password>',
        platform.uname().node,
        '<remote_hostname>',
        domain='WORKGROUP',
        use_ntlm_v2=True)
    conn.connect('<ip_address>', 139)

    with open('/var/hoge', 'rb') as file:
        conn.storeFile('temp', 'a/b/c/hoge.txt', file)

    conn.close()
```

- ディレクトリa/b/cが存在しない場合はエラーになるので事前に作成しておく必要がある。
Raspberry Pi 3でPCA9685を使う


最近、プログラミングができていないのですが、仕事で必要になったので、メモしておきます。

# きっかけ
仕事でRaspberryPi 3を使って、サーボモータをたくさん動かさないといけなくなったのですが、標準だとPWMが出せるピンが1本しかないために仕方なく、サーボモータドライバのPCA9685を使うことにしました。

本当はGoでやりたいところですが、GPIOを使った部分のところがPythonが信頼度が高そうなので、ひとまず、Python教に入信しようと思いますｗ

# i2cのセットアップ
Raspberry Pi標準だとi2cが無効になっているため、Raspi-Configで有効にします。

## Raspi-Config
```bash:コマンド
$ sudo raspi-config
```

Interfacing Optionsを選択する。（jessieより前だと、Advanced Optionsにあったみたい？）
![raspiconfig1.png](https://qiita-image-store.s3.amazonaws.com/0/11925/37e760ea-2246-c810-5bc8-37a4ba5b2f55.png "raspiconfig1.png")

I2Cを選択する。
![raspiconfig2.png](https://qiita-image-store.s3.amazonaws.com/0/11925/d83193cc-bbae-447d-cc64-5865cb2edae2.png "raspiconfig2.png")

はいを選択する。（いいえを選択すると無効になる…）
![raspiconfig3.png](https://qiita-image-store.s3.amazonaws.com/0/11925/de65fe18-fd61-5748-c4e9-6914dbf56750.png "raspiconfig3.png")

##/boot/config.txtに通信速度の設定を追加

```bash:コマンド
$ sudo vi /boot/config.txt
```

初期値は100000ですが、通信速度が早すぎてエラーメッセージが出力されるので、最下行か、i2c関連の設定付近に以下を追記する。

```
dtparam=i2c_baudrate=10000
```

# モータドライバのライブラリのセットアップ
## Adafruitの公式リポジトリからソースコードをダウンロード

```bash:コマンド
$ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git

$ git clone https://github.com/adafruit/Adafruit_Python_GPIO.git

$ git clone https://github.com/adafruit/Adafruit_Python_PureIO.git

```

PCA9685のライブラリだけをダウンロードすれば使えるのかと思っていましたが、ファイルがないというエラーメッセージが出ました。

## インストール
それぞれのライブラリで以下のコマンドを実行する。

```bash:コマンド
$ cd Adafruit_Python_PCA9685
$ sudo python setup.py install
$ cd ../Adafruit_Python_GPIO
$ sudo python setup.py install
$ cd ../Adafruit_Python_PureIO
$ sudo python setup.py install
```

# 動作確認

## コマンドで動作確認
まだ、意味はわかっていないのですが、i2cのポートの動作確認ができるようです。

```bash:コマンド
$ sudo i2cdetect -y 1
```

## Pythonで動作確認
できれば、Python3が使いたかった…。

ポート1とポート2にサーボモータ（SG92R）を挿して動作確認しました。ブレッドボードにボタンを2個付けて、それぞれを押すと動作しました。

```python:sample.py
#!/usr/bin/python

import RPi.GPIO as GPIO
import time
import Adafruit_PCA9685

GPIO.setmode(GPIO.BOARD)

GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)

try:
	while True:
		sw1 = GPIO.input(16)
		sw2 = GPIO.input(18)

		if sw1 == 1:
			pwm.set_pwm(1, 0, 600)
		else:
			pwm.set_pwm(1, 0, 375)
		
		if sw2 == 1:
			pwm.set_pwm(2, 0, 600)
		else:
			pwm.set_pwm(2, 0, 375)


except KeyboardInterrupt:
	pass

```

# 参考サイト
* http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_gpio_enable_i2c/
* http://pongsuke.hatenablog.com/entry/2017/01/13/145836
* http://kouzu.info/raspberrypi-twi-7seg/
* https://www.qoosky.io/techs/2316d68b2e

# Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）
コンピューター将棋で使われている技術、用語等


【い】[イリーガルムーブ](http://seiga.nicovideo.jp/watch/mg254811)
【え】[エバーション](http://seiga.nicovideo.jp/watch/mg254811)　[エヌ・ティー・ゼット](http://seiga.nicovideo.jp/watch/mg254881)
【お】[王手回避漏れ](http://seiga.nicovideo.jp/watch/mg254811)　[オキュパイド・ビットボード](http://seiga.nicovideo.jp/watch/mg254881)
【き】[局所解](http://seiga.nicovideo.jp/watch/mg256008)　[局所探索法](http://seiga.nicovideo.jp/watch/mg256008)　[極値](mg256008)
【さ】[最大値](http://seiga.nicovideo.jp/watch/mg256008)　[最良優先探索](http://seiga.nicovideo.jp/watch/mg256008)
【し】[シー・ピー・ユー](http://seiga.nicovideo.jp/watch/mg254881)
【ぜ】[（真の）全幅探索](http://seiga.nicovideo.jp/watch/mg255821)　[（近似の）全幅探索](http://seiga.nicovideo.jp/watch/mg256020)
【た】[縦型ビットボード](http://seiga.nicovideo.jp/watch/mg254988)
【と】[飛び利き](http://seiga.nicovideo.jp/watch/mg254951)
【な】[ナナメの利き](http://seiga.nicovideo.jp/watch/mg254977)　[ナンバー・オブ・トレイリング・ゼロズ](http://seiga.nicovideo.jp/watch/mg254881)
【は】[（飛び利きのビットボードの）ハッシュ・キー](http://seiga.nicovideo.jp/watch/mg254964)
【ひ】[ヒューリスティクス](http://seiga.nicovideo.jp/watch/mg256008)　[ピン](http://seiga.nicovideo.jp/watch/mg254811)
【ふ】[ブロック駒](http://seiga.nicovideo.jp/watch/mg254964)
【ふ】[深さ優先探索](http://seiga.nicovideo.jp/watch/mg255931)　[プレイアウト ](http://seiga.nicovideo.jp/watch/mg255931)
【め】[メート](http://seiga.nicovideo.jp/watch/mg254811)
【も】[モンテカルロ木探索](http://seiga.nicovideo.jp/watch/mg255931)
【や】[山登り法](http://seiga.nicovideo.jp/watch/mg256008)
【よ】[横型ビットボード](http://seiga.nicovideo.jp/watch/mg254988)
【３】[３２ビット・シー・ピー・ユー](http://seiga.nicovideo.jp/watch/mg254988)
【６】[６４ビット・シー・ピー・ユー](http://seiga.nicovideo.jp/watch/mg254988)
Spring Bootでプロパティファイルの値を参照できるようにするまでの手順

##はじめに
このページは主に自分の思い出し用みたいなものです。

##手順
ものすごくざっくり書くと下記の順番となる。

１．プロパティファイルに設定したい値を書く
２．設定読み込みクラスを作る
３．Autowiredして使う

##プロパティファイル（application.yml)

例えば下記のようなapplication.ymlがあったとして

```yaml
ymlSetting:
  stringKey: "なにかしらの文字列"
  mapA:
    key1: "value1"
    key2: "value2"
```
##プロパティファイルを読み込むクラス
application.ymlから値を読み込み、格納するクラスを作成します。
「@ConfigurationProperties」アノテーションのprefixにはapplication.ymlのキーを設定します。
そうすると、このクラスではこの定義を読み込むよー、ということを定義することができます。
（例ではSettingクラスではymlSettingの配下の設定値を読み込むよーと定義しています）

定義したそれぞれの項目はメンバ変数として保持する作りとなっています。
ネストしていない項目(stringKey)はString型で、
子要素がある項目(mapA)はMapとして宣言することができます。

プロパティファイルの値を参照する際は、宣言したメンバ変数のGetterを利用して値を参照することとなります。

Settings.java

```java
package jp.co.sample;
 
import java.util.Map;
 
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
@Component
@ConfigurationProperties(prefix = "ymlSetting")
public class Settings {
    private String stringKey;
    private Map<String, String> mapA;
     
    public void setStringKey(String stringKey){
        this.stringKey = stringKey;
    }
     
    public String getStringKey(){
        return stringKey;
    }
     
    public void setMapA(Map<String, String> mapA){
        this.mapA = mapA;
    }
     
    public Map<String, String> getMapA(){
        return mapA;
    }
}
```

##使い方例
例えばプロパティ値を標準出力する場合、こんな感じとなります。

SpringBootConfigApplication.java

```java
package jp.co.sample;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class SpringBootConfigApplication implements CommandLineRunner{
    @Autowired
    private Setting setting; // プロパティファイル読み込み用クラス
     
  public static void main(String[] args) {
    SpringApplication.run(SpringBootConfigApplication.class, args);
  }
   
  @Override
    public void run(String... args) {
        System.out.println("string = " + Settings.getStringKey());
        System.out.println("key1 = " + Settings.getMapA().get("key1"));
        System.out.println("key2 = " + Settings.getMapA().get("key2"));
    }
}
```
Bashでパスワード管理ツールを自作しました

bashで[パスワード管理ツール](https://github.com/nnabeyang/pwad/blob/master/pwad)を自作しました。名前はpwadです。openssl, mkpasswd, pbcopyに依存しています。

# 環境
* Mac OS
* bash

# 機能

* 1つのパスフレーズで複数のパスワードが管理できる
* パスワードをパスフレーズから取得できる(`pwad get <name>`)
* パスフレーズを変更できる(`pwad newpass`)
* 管理しているパスワードの一覧を標準出力できる(`pwad ls`)
* パスワードを生成し、管理しているパスワードに追加できる(`pwad create <name> <account>`)
* ヘルプを表示する(`pwad --help`)

# 使用例

初期化から登録まで次のようにします。

```bash
$ pwad init
$ pwad set qiita account1 qiita_password
$ pwad set google account2 google_password
$ pwad ls
google qiita
$ pwad get qiita
account1
$ pbpaste
qiita_password
```

`pwad init`で初期化します。パスフレーズを3回問われますが、3回とも同じ文字列を入力します。`pwad get`のときも、パスフレーズの入力を問われます。`pwad set <name> <password>`の代わりに`pwad create <name>`とすると、自動生成されたパスワードが生成が登録されます。

# 課題
PCからスマホにパスワードを渡す方法が無いです。QRコードを生成できると良いかもしれません。

# 実装上のポイント

はじめ、1つのファイルをopensslで暗号化して管理しようとしましたが、1つの名前に対し、1つの値を返すようなハッシュテーブルのようなものを自作しようとしていました。どう考えても面倒なので、結局は1つの名前に対して1つファイルを作成して管理するようにしたら、圧倒的に楽になりました。
初心者向け IDEを使わないgradleとkotlin

#記事の狙い
初心者向けに自分のkotlinコードをプロジェクトにまとめてJar玉にするまでの記事。
僕自身、kotlin初心者なので余計なものが混じってるかもしれません。ツッコミは大歓迎です。
IDEでビルドしたものをデプロイするとかはやめよう。。。

#方針
・見通しの良い骨格になるプロジェクトを作成する。
・IDEはつかわない。
・ビルドまで自動化する。
・ひな形ができたらgithubなどに保存して使いまわせるようにしよう。
・gradleでプロジェクトを管理する。（kotlinコマンドは直接叩かない。）

#良いこと
jar玉にビルドできたらサーバーにサービス化しやすい。
それなりに処理速度が速い（スクリプト言語と比べて）
書きやすい（javaやCなどと比べて）

#インストール
SDKMANを使ってkotlinとgradleをインストールする。

#プロジェクトのひな形をつくる

プロジェクトディレクトリ直下に以下のbuild.gradleを設置する。

```gradle:build.gradle
buildscript {
  ext {
    KOTLIN_VERSION = "1.1.4"
  }

  repositories {
    mavenCentral()
  }

  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${KOTLIN_VERSION}"
  }
}

apply plugin: "kotlin"

repositories {
  jcenter()

    mavenCentral()
    maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
}

dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib:${KOTLIN_VERSION}"
}
task mkJar(type: Jar) {
  manifest {
    attributes 'Main-Class': 'run.MainKt'
  }

  from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
  with jar
}
```

kotlinコードを
{プロジェクトディレクトリ}/src/main/kotlin/run/main.kt 
に設置する。

```kotlin:main.kt
package run 
fun main(args: Array<String>) {
    println("Hello, World!")
}
```

#ビルド
```bash
cd ~/{プロジェクトディレクトリ}/
gradle mkJar
```

#run 
```bash
java -jar build/libs/kotlinSpark.jar
```

#最後に
こうしておけばgitコマンドした後にビルドがすく走るのでまともに開発するつもりなら自分なりのプロジェクト環境を整えておいたほうが良いです。
できたjarを自動的にテストできるようにしておけばgithubの更新を見張って最新ブランチのテストもコマンド一発でできるので初めにまとめておきましょう。
jQuery：セレクタとイベントハンドラざっくり入門

##はじめに
実は今までちゃんと使ったことがなかったので、
私のようなド素人向けに基本的なセレクタとイベントハンドラをまとめます。

※このレベルで今までどうやって生きてきたのか、やってこれたことが奇跡だよなあと恥を忍んで書いています。

##はじめにちゃんと書くやつ
「htmlを読み込んでから処理を実行する」という意味です。
詳細は面倒なので省きますが、忘れないようするべきまじないだと思えばまあいいのではと思います。
詳細が知りたい場合はググりましょう。

```html
<script type="text/javascript">
$(function(){
  //ここに実行させるjQueryのコードを書く
})
</script>
```
##セレクタ
要素を選ぶための記述。 いくつか種類があるのでよく使いそうなものをまとめておきます。

###IDセレクタ
要素のIDで指定します。IDは要素は一意なので、決め打ちでこれってときに使います。

```js
//赤くする
$('#item1').css('color','red');
```

###nameセレクタ
要素のnameで指定します。
同じnameの要素は複数存在する場合もありますが、
その場合は該当する全ての項目に反映されます。

```js
//この名前のやつは全て赤くする
$('item').css('color','red');
```

###classセレクタ
要素のclassで指定します。クラス名に一致する要素すべてに反映されます。

```js
//青いやつはもれなく赤くする
$('.blue').css('color','red');
```

###属性フィルター
特定の属性をもつ要素を取得します。結構細かく指定できます。

```js
//name=radio1のラジオボタンからチェックされているvalueをとる。
$('input[name=radio1]:checked').val();
```

##実行イベント
jQueryではとある要素がこんなことされたときのイベントはこんな処理という実装ができます。
その「こんなこと」にはクリックとかマウスオーバーとかフォーカスとか色々あります。

###クリックしたとき
おそらく最も使うんじゃないだろうか、というやつです。

```js
$('button').on('click', function() {
  alert('クリックされました');
});
```

###キー押下、ペーストなど　（複数指定の場合）
キー押下：keyup
ペースト：paste
ちなみに複数のイベントタイプを半角スペースで区切って指定することで、
複数のイベントに対して一括して、同じイベントを定義することができます。

```js
// text1に対してキー入力またはコピペされたときに発動する処理
$('#text1').on('keyup paste', function() {
  // 処理、たとえば入力チェック
});
```
Reactでwindowに対して、resizeイベントを登録していた時のエラー

# よくわからないエラーが発生

ReactでSemanticUIを使い始め、windowにたいして、Resizeイベントを登録していたある日のこと。

```javascript
componentDidMount() {
    window.addEventListener('resize', () => {
        setState({smallScreen: window.innerWidth < 600});
    });
}
```

上記のコードで、動かした際に、画面をリサイズするたびに、下記のエラーが発生していた。

```error
Warning: setState(...): Can only update a mounted or mounting component. 
This usually means you called setState() on an unmounted component.
This is a no-op. Please check the code for the ****** component.
```
それまでこんなエラー出てなかったもので、突然のことに困惑しつつ、所詮Warningであるからと甘えていたが、下記のようにcomponentWillUnmountイベントにて```removeEventListener```することでで解決した。

```javascript
componentWillUnmount() {
    window.removeEventListener('resize', registeredListener);
}
```

原因は、コンポーネントがアンマウント後も、コールバックが呼ばれていたためですね。

現在だと、React hooksつかって

```javascript
const [screenIsSmall, setScreenIsSmall] = useState(false);

useEffect(() => {
    window.addEventListener('resize', () => {
        setScreenIsSmall(window.innerWidth < 600);
    });

    return () => window.removeEventListener('resize', registeredListener);
})
```

とすれば良いですね。

以上、現場からでした。
高専機構のOffice365アカウントをGmail(またはInbox)で受け取る

Office365、全然ログインしないし、メールを全部Gmailから送受信できたら便利じゃない？ってことでやりました。

## Office365側でやること

1. Office365にログインし、メール(Outlook)を開く
2. 右上の歯車マークを押し、「オプション」を押す（なければ、「アプリの設定」の中の「メール」）
3. 「メール」→「アカウント」→「転送」を選ぶ
4. 「転送を開始する」にチェックを入れ、「メールの転送先」にgmailアドレスを入れる。
5. 上の「保存」をクリック

## Gmail側でやること(Inboxではできなかった)

1. 歯車マークから、「設定」→「アカウントとインポート」を選択。
2. 「名前:」の「他のメールアドレスを追加」を押す
3. 「名前」は適当でいい。メールアドレスにはOffice365のメールアドレスを入れる。「エイリアスとして扱います」にチェックして次のステップに進む。
4. SMTPサーバーには「outlook-japan.office365.com」を、ユーザー名にはOffice365のメールアドレスを(xxxx@xxx.kosen-ac.jpとか)、パスワードにはOffice365のパスワードを入れる。ポートは587のままでOK。終わったらアカウントを追加をクリック。
5. Office365の方にメールが届いているので、メールの中にあるリンクをクリックするか、確認コードをこっちに入力する。




以上で完了
メモ g a e 

# ハンドラ

```
func handler(w http.ResponseWriter, r *http.Request) {
}
```

## r.URL.Hostの値
xxxxxxxx.appspot.com

## リクエストタイムアウト

```
ctxWithDeadline, _ := context.WithTimeout(ctx, 40*time.Second)
httpClient := urlfetch.Client(ctxWithDeadline)
```

# キュー

# 設定ファイル

```yaml:queue.yaml
queue:
- name: q-test
  rate: 1/s
```


## キューの命名規則

```
'^(?:^[A-Za-z0-9-]{0,499}$)$'
```

# memcache

# []byteでやり取り

```
item := &memcache.Item{
	Key:  "key",
	Value: []byte("value"),
}
memcache.Set(ctx, item)
```

```
item, err := memcache.Get(ctx, "key")
value = string(item.Value)
```

## JSONでやりとり

保存

```
d := &Data{何かのデータ}
item := &memcache.Item{
	Key: "xxxx",
	Object: d,
}
err := memcache.JSON.Set(ctx, item)
```

取り出し

```
key := "xxxxx"
d := &Data{}
memcache.JSON.Get(ctx, key, d)
```
2017-10-09 Git > 検討 > 共有ファイルのバージョン管理 > git subtree | git submodule | 自前の仕組み ? 

### 背景

様々なプロジェクトにユーティリティなどの共有したいファイルが数十個あるとする。
その共有ファイルは以下のような条件で保持したい。

- プロジェクトA (出荷済み):
    - v1.0のまま保持
- プロジェクトB (出荷済み):
    - v1.2のまま保持
- プロジェクトC:
    - 最新バージョンを適用しつつテストする



### gitでどうするか

共有ファイルの取扱いに関して、gitの場合、以下の方法があるようだ。

- git subtree
- git submodule

参考: [【手順】git subtreeコマンドの使い方](https://qiita.com/takahashi-kazuki/items/0c34b3bc5da6700d38a5)
> Git subtree
→外部リポジトリを現在のリポジトリのものとして取り込み、手を加えていくときに使用する。
> Git submodule
→外部リポジトリを現在のリポジトリの外のものとして取り込み、今後編集しない時に使用する。

上記のプロジェクト構成の場合、Git subtreeは使えない。
Git submoduleはどうか。

[Git: Submodule地獄からの脱出](https://qiita.com/kohashi/items/f4a50c5436b326e9475b)
などを見ると、使い方をきちんと理解しないと失敗しそう。
学習コストと使用による効率を考えると、使うのがいいのかどうか迷いつつ、今まで使っていない。

### こうしている

2017年10月9日現在、以下のようにしている。

- 共有ファイルだけのリポジトリを作成
- 各ファイルごとにバージョンを付加
    - UtilScreen.cpp: v0.2
    - UtilEncodeDecode.cpp: v0.5
    - etc
- 各ファイルに変更があった時にコミットする
    - 複数ファイルのコミットにしないことで、個々のファイルの過去バージョンを取出せる
        - タグでなくコミットで過去バージョンを検索
- 新しく作るプロジェクトはこのリポジトリから最新ファイルを取得
    - 問題がある場合はバグ修正をしてバージョンを上げる
- 古いプロジェクトはバグ修正以外ではバージョンはそのまま
    - バグ修正時は動作確認済みバージョンを適用
        - 最新版とは限らず、古いバージョンとする場合もありうる

### 余談

Microsoft Visual SourceSafeには「ファイル共有」という機能があった。
一つのプロジェクトで修正した内容は、瞬く間に他のプロジェクトに波及する。

過去のプロジェクトの一部の機能変更時にビルドしなおすと、共有されたファイルの変更も入り、場合によってはエンバグすることになる。

こういう背景もあるため、安易に「（自動）共有」はしたくはない。
動的選択肢の反映と初期値の設定

モーダル画面とかでよく新規／編集するときに、親の選択状態に紐付いて子の選択肢が変わるなんてのは日常茶飯事だけども、vue.jsではこれ以外でやり方ないんだろうか…

```js
    var sample = new Vue({
        el: '#test',
        data: {
            list: [],
            modal: {
                id: '',
                parent_list: [],
                parent_id: '',
                children_list: [],
                children_id: ''
            }
        },
        mounted: function () {
            this.$nextTick(function () {
                $.ajax({
                    type: "GET",
                    url: "/service/parent_list",
                    dataType: "json",
                    success: function($data) {
                        $data.forEach(function(row, index, arr) {
                            sample.modal.parent_list.push({
                                'id': row.id,
                                'name': row.name
                            });
                        });
                    },
                    error: function ($e) {
                        console.log($e);
                    }
                });
            });
        },
        methods: {
            get_children_list: function($bind_func = null) {
                $.ajax({
                    type: "GET",
                    url: "/service/children_list",
                    dataType: 'json',
                    data: {
                        parent_id: this.modal.parent_id
                    },
                    success: function($data) {
                        this.modal.children_list = [];
                        if ($data == null) return;
                        $data.forEach(function(row, index, arr) {
                            sample.modal.children_list.push({
                                'id': row.id,
                                'name': row.name
                            });
                        });
                        if ($bind_func != null) $bind_func();
                    },
                    error: function(e) {
                        console.log(e);
                    }
                });
            },
            // 追加ボタンおした時
            add: function() {
                this.modal.parent_id = '';
                this.modal.children_list = [];
                this.modal.children_id = '';
            },
            // 編集ボタンおした時
            edit: function($row) {
                this.modal.id = $row.id;
                this.modal.parent_id = $row.parent_id;
                // ここ、どうにかならないのん？
                this.get_city_list(function() {
                    sample.modal.children_id = $row.children_id;
                });
            }
        }
    });
```
railsでコメント機能を作る

# この機能の概要

掲示板サイトで投稿に対してコメントを送れる機能。

# フォームの作成

## フォームの設置

```ruby:show.html.erb
    <%= form_tag("/posts/comment") do %>
    <form>
      <div class="form-group">
        <textarea name="comment" class="form-control"></textarea>
        <textarea name="post_id" class="hidden"><%= @post.id %></textarea>
        <textarea name="user_id" class="hidden"><%= @post.user_id %></textarea>
      </div><!--form-group-->
      <button type="submit" class="btn btn-primary">コメント</button>
    <% end %>
```

class="hidden"で見えないようにしてフォームに入力しないけど送りたい値を送る。

## controllerの設定

```ruby:posts_controller.rb
  def comment
    @comment = Comment.new(comment: params[:comment], post_id: params[:post_id], user_id: params[:user_id])
    @comment.save
    redirect_to :action => "show", :id => @comment.post_id
  end
```
```
redirect_to :action => "show", :id => @comment.post_id
```
でコメントした後にそのページでリロードされるようにする

## routesの設定

```ruby:routes.rb
  post "posts/comment" => "posts#comment"
```
メモ書き

# Visual Studio 2017

Minimum Android version は、「SDKバージョンを使用したコンパイルの使用」
を設定する。


# リストボックス

リストビューを使う

「Xamarin.Android の ListView で Item を追加、削除したい（ArrayAdapterとSimpleListItem1）」
http://ytabuchi.hatenablog.com/entry/2016/08/18/001000
Keresメモ：Kerasにperplexityがなかったので書いてみる

#動機
初めはTensorflowでseq2seqをやろうとしていて、サンプルコードを見ながら学習し、近頃Kerasに移行してみました。backendはそのままTenforflowです。

Tensorflowのチュートリアルで提供されているサンプルコードでは、perplexityという指標が学習中にログとして表示されるようになっていて、これがモデルの性能を評価する上での一つの指標となっています。

これをKerasでも利用しようと思ったのですが、KerasのMetricsにはperplexityがなかったので自分で書いてみました。

正確には、自分で書いた後おかしなエラーが出たので他にやっている人がいないか調べたら、すでに議論している方々がいたので、素直にその方々の話の流れに乗っかりました。
(ちなみに上記エラーは、perplexityとは全く関係ありませんでした。)

#perplexityとは
perplexityを自ら説明する自信はないので、勉強の際にお世話になったページをリンクで貼っておきます。

[トピックモデルの評価指標 Perplexity とは何なのか？ - SlideShare](https://www.slideshare.net/hoxo_m/perplexity)

seq2seqにおいては、encoderから出力された固定長ベクトルとdecoder自身の過去の出力をもとに、decoderが次の単語を予測していきます。

簡単に言うと、「次の単語は○○である」の予測確率が0.01だとしたら、それは同程度の確からしさを持った100単語の中から1単語を選ぶ、と捉えることができます。

[Tensorflowのサンプル:translate.py](https://github.com/tensorflow/models/blob/master/tutorials/rnn/translate/translate.py)には、218行目にさらっと登場しています。
1バッチ1ステップとして、100ステップ学習した後にバッチ毎のlossの平均を取り、

```math

perplexity = \mathrm{e}^{loss}

```

としています。
このperplexity、2のloss乗となっている場合もあるのですが、どのような差なのでしょう。lossを計算するときにlogの底を何にしたかで変わる、という認識で良いのでしょうか。
#実装
https://github.com/fchollet/keras/issues/2317

Kerasでperplexityを使いたい人たちが、ここで議論をしていました。
私もたまたま同じようなエラーが出たので投稿してみたのですが、後日全く関係ないミスから生じたものだとわかり、自分で訂正するという醜態をさらしています。

```Python
from keras.losses import categorical_crossentropy
from keras import backend as K
import math

def ppx(y_true, y_pred):
     loss = categorical_crossentropy(y_true, y_pred)
     perplexity = K.cast(K.pow(math.e, K.mean(loss, axis=-1)), K.floatx())
     return perplexity
```

Tensorflowでは先述の式の通りネーピア数を使っていましたし、KerasはTensorflowをbackendにしているので、そのままネーピア数を用いています。

型をfloatxにキャストしたり、などというのはKerasに始めから用意されているlossやmetricsがやっている事を真似しています。

#次にやりたいこと
語彙すべてを対象にしてsoftmaxをやっていては遅すぎるので、Tensorflowのチュートリアルでも紹介されているsampled softmaxをやりたい。
MacでGoogle Assistant SDKを動かす


Google Homeがどんなものか知りたくて、以下を参考にGoogle Assistant SDKをMacで動かしてみました。
ちょっと引っかかったので、メモしておきます。

- OS X 10.11.6 (El Capitan)
- python 3.6 (anaconda)


[How to get Google Assistant on your Windows, Mac, or Linux Machine](https://www.xda-developers.com/how-to-get-google-assistant-on-your-windows-mac-or-linux-machine/)

2017/10/09 現在、導入はこれでOKだったのですが、アシスタントを動かすコマンドは `googlesamples-assistant-pushtotalk` となっていました。
エンターキーを押すとアシスタントが聴いてくれて、しゃべり終わると音声で返答してくれます(英語)。


```
$ googlesamples-assistant-pushtotalk
INFO:root:Connecting to embeddedassistant.googleapis.com
2017-10-09 10:44:21.699 python[74442:7690850] 10:44:21.698 WARNING:  140: This application, or a library it uses, is using the deprecated Carbon Component Manager for hosting Audio Units. Support for this will be removed in a future release. Also, this makes the host incompatible with version 3 audio units. Please transition to the API's in AudioComponent.h.
Press Enter to send a new request...
INFO:root:Recording audio request.
INFO:root:End of audio request detected
INFO:root:Transcript of user request: "OK Google good morning".
INFO:root:Playing assistant response.
WARNING:root:SoundDeviceStream write underflow (size: 1600)
INFO:root:Finished playing assistant response.
Press Enter to send a new request...
````