OmniAICreator/Qiita-1.07M huggingface dataset:
AnsibleによるDocker Engineのインストール(Ubuntu 16.04 LTS）

[Docker公式のUbuntuでのDockerインストール手順](https://docs.docker.com/engine/installation/linux/ubuntu/) を
Ansibleで自動化して、Playbook配布可能な状態にしておこうと思います。

※2017/03/25 追記
dockerが17にバージョンアップしたので、修正版を追加します。
商用版のEEは利用していないので、コミュニティ版のCEのインストール方法のみです。

# 事前準備
事前準備として、Ansibleのインストール手順
```
apt-get update
apt-get install -y software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get install -y ansible
```

# Dockerのインストール（docker 17.03.0-ce　で検証済み）
``` playbook.yml
# hostsなどの記述については省略します。
- name: Check kernel version.
  fail: msg="Kernel {{ ansible_kernel }} is not supported."
  when: "ansible_kernel | version_compare('3.10', '<')"

- name: apt-get install packages
  apt: pkg={{ item }} state=present update_cache=yes
  with_items:
    - apt-transport-https
    - ca-certificates
    - curl
    - linux-image-extra-virtual
    - linux-image-extra-{{ ansible_kernel }}
    - software-properties-common

- name: Check docker gpg key.
  shell: apt-key fingerprint 0EBFCD88 | grep 0EBFCD88
  register: docker_gpg
  ignore_errors: True
  changed_when: False

- name: Add Docker’s official GPG key
  shell: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  when: docker_gpg | failed

- name: define lsb_release -cs
  shell: lsb_release -cs
  ignore_errors: True
  register: lsb_release

- name: set up the stable repository
  shell: add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ lsb_release.stdout }} stable"

- name: Install docker-ce.
  apt: name=docker-ce state=present update_cache=yes
  notify:
    - restart docker
```


# Dockerのインストール（docker version 17以前）
``` playbook.yml
# hostsなどの記述については省略します。
- name: Check kernel version.
  fail: msg="Kernel {{ ansible_kernel }} is not supported."
  when: "ansible_kernel | version_compare('3.10', '<')"

- name: apt-get install packages
  apt: pkg={{ item }} state=present update_cache=yes
  with_items:
    - curl
    - linux-image-extra-{{ ansible_kernel }}
    - linux-image-extra-virtual
    - apt-transport-https
    - ca-certificates

- name: Check docker gpg key.
  shell: apt-key list | grep 2C52609D
  register: docker_gpg
  ignore_errors: True
  changed_when: False

- name: Add Docker’s official GPG key
  shell: curl -fsSL https://yum.dockerproject.org/gpg | sudo apt-key add -
  when: docker_gpg | failed

- name: define lsb_release -cs
  shell: lsb_release -cs
  ignore_errors: True
  register: lsb_release

- name: set up the stable repository
  shell: add-apt-repository "deb https://apt.dockerproject.org/repo/ ubuntu-{{ lsb_release.stdout }} main"

- name: Install docker-engine.
  apt: name=docker-engine state=present update_cache=yes
  notify:
    - restart docker
```
あとは`docker version` などでインストールされていることを確認してみてください。  
誤記についてのご指摘や、よりよい方法のご提案などは歓迎します！
以上です。お疲れ様でしたー。
「SSL/TLS」についてまとめる。

#「SSL」とは
- Secure Socket Layer
- 暗号化通信プロトコルの**元々の規格。**
- 様々な脆弱性問題から、**現在では使われていない。というか禁止されてる。**
    - ダウングレード攻撃( SSL2.0 )
    - POODLE攻撃( SSL3.0 )
    - etc...

#「TLS」とは
- Transport Layer Security
- SSL3.0の次版として登場
- SSLの機能に加え、強固なセキュリティを実現
    - 共通化暗号方式として AES が選択可能。( TLS1.1 )
    - ハッシュアルゴリズムとして SHA-256 を採用。( TLS1.2 )
    - etc..

#何で「SSL/TLS」と言われるのか
- 上記の通り、SSLの後にTLSが出てきた
- SSLの名前が広く知れ渡っているため、併記されているだけで、上記の通り、現在はSSLは使われていない。
- なので、
    - 「SSL/TLS」と言われれば、TLS
    - 「TLS/SSL」と言われれば、TLS
    - 「TLS」と言われれば、TLS
    - 「SSL」と言われれば、SSL

<br>
( ･ω･ )ここで一息...
<br>

#「SSL/TLS」で出来る事
- 通信内容の暗号化
    - 暗号化通信のプロトコルですからね...
    - 公開鍵暗号方式とか共通鍵暗号方式とかありますが、どういう仕組みになってるんでしょう
- 通信相手の認証
    - SSL/TLSでやりとりするという事は、鍵や証明書が必要になってきます
    - その鍵や証明書はどこから発行されたものなのでしょう？
    - きちんとした鍵と証明書を持っていれば、**通信相手が正当な相手**という事が分かりますね！！！

この二つについては、別途まとめます。
まとめたらリンク貼るので、参考までに。
Daydream対応SDKでCardboard的な視線ポインターを使う方法

よく見たらGvrPointerInputModule.csにきちんと説明書いてあったんですけど、
それを見つけるまで情報が見つからず詰まったので共有させてください。

##環境
- Unity 5.4.2f2-GVR13
- Google VR SDK for Unity v1.10

##実装方法
１．Assets>GoogleVR>Prefabs>UIからGvrReticlePointerを選択
<img width="439" alt="スクリーンショット 2017-02-01 23.29.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/d43c4690-3202-849f-89a5-910b2344fa31.png">

２．MainCamera配下にD&D
<img width="275" alt="スクリーンショット 2017-02-01 23.34.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/4be8a532-5096-8e38-efe0-f75bda778a24.png">

３．お好みに合わせてGvrReticlePointerカーソルの色味や大きさを変更
<img width="290" alt="スクリーンショット 2017-02-01 23.39.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/b79ba265-7c7b-1a8e-dda0-fc3f0d2e800d.png">

##背景
googleさんが提供しているVRプラットフォームDaydream。
最大の特徴はBluetoothでペアリングされるコントローラーです。

Google VR SDK for Unityの公式ページにも、
Cardboardアプリをコントローラ対応にする方法が丁寧に書いてあります。
https://developers.google.com/vr/unity/guide

しかし、例えば初めてのユーザーさんに、
とりあえず説明無しでまず体験してほしいというシーンもあるはず。。。
そんな時(ちょっとクセのある)Daydreamのコントローラーを説明するよりも、
とりあえず視線合わせたら反応できるCardboard的な視線ポインターを、
使いたくなったりもするのかと思ってます。

視線で指し示すコントローラーはgoogleさんでは、
gaze-based selection（見つめて選択）と呼んでいるようですが、
そのためのGvrGazeというClassは削除されており途方にくれておりました。
「情報セキュリティ」についてまとめる。

#そもそも「情報セキュリティ」って何？

##「CIA」を維持する事

###C：機密性( Confidentiality )
- 情報へのアクセスが認められた者のみアクセスできる状態

###I：完全性( Integrity )
- 情報が破壊/改ざんされていない状態

###A：可用性( Availability )
- 情報が必要な者が必要な時にアクセスできる状態

##以下の「拡張特性」も押さえられていると◎

###真正性
- 情報システムの利用者が、確実に本人であることを確認できる状態

###責任追跡性
- ユーザがシステムにアクセスした記録を追跡できるようにする状態

###否認防止
- ある活動又は事象が起きたことを、後になって否認されないように証明できる状態

###信頼性
- 意図した動作及び結果に一致できる状態


##「脅威」となるのは？
###なりすまし
- 第三者が当事者になりすまして不正な行為を行う事
    - ex) 第三者が、Aさんのtwitterアカウントを使ってツイート

###改ざん
- 悪意を持ったユーザによって情報が不正に改ざんされる
    - ex) twitterで、Aさんが「頑張ろう」とツイートしたのに、第三者によって「帰りたい」に書換えられる

###盗聴
- ネットワークに流れる情報（データ）は、第三者に盗み見られる事
    - ex) AさんがBちゃんがtwitterでDMしてるのを、第三者が通信を傍受される

###否認
- 当事者が過去の自分の行動を否定する事
    - ex) 第三者が誹謗中傷ツイートして削除して、炎上したのに、「やってない！！！」と言い張る

<br />

> 参考文献
> [Wikipedia](https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3)
> [IPA](https://www.ipa.go.jp/security/pki/012.html)
> [情報ｾｷｭﾘﾃｨｽﾍﾟｼｬﾘｽﾄ(情報処理安全確保支援士) - SE娘の剣 - ](http://sc.seeeko.com/archives/4064066.html)


<br>

余談
今後、少しずつ掘り下げながら書いていきます。
Rubyで期間のフォーマット

# ruby-durationを使う
https://github.com/peleteiro/ruby-duration

## インストール
```ruby:Gemfile
gem 'ruby-duration'
```

## フォーマットの書式
https://www.rubydoc.info/gems/ruby-duration/Duration:format

## 例
```ruby
Duration.new(10.days).format("%tdu") # => "10 日"
Duration.new(10.days).format("%thu") # => "240 時間"
Duration.new(10.days).format("%tmu") # => "14400 分"
Duration.new(10.days).format("%tsu") # => "864000 秒"
```
JavaScriptオブジェクト指向（クラス的なものを作るサンプル）

# 概要

JavaScriptでオブジェクト指向するときのサンプルコードです。

以下のWebサイトを参考にしました。

[JavaScript におけるクラスの作成と継承](http://d.hatena.ne.jp/vividcode/20110218/1298057185)

# サンプルコード

```js


(function() {
  // For compatibility
  // IE10以下に対応
  // prototypeとconstructorを設定して継承する
  Function.prototype.inherit = function(base) {
    var f = function() {};
    f.prototype = base.prototype;
    this.prototype = new f();
    this.prototype.constructor = this;
    return this;
  };
   
  // 名前空間の文字列を「.」で区切る
  function splitNs(nsStr) {
    return nsStr.split(".");
  }

  // 名前空間を作成して末端のオブジェクトを返す
  function ret(nsStr) {
    function ret_helper(rt, symo) {
      if(symo.length > 0) {
        var now = symo.shift();
        if(!(Object.prototype.toString.call(rt[now]) 
            === '[object Object]')) {
          rt[now] = {};
        }
        return ret_helper(rt[now], symo);
      } else {
        return rt;
      }
    }

    return ret_helper(window, splitNs(nsStr));
  }

  // 指定した名前空間のオブジェクトを指定したオブジェクトから参照できるようにする
  window.use = function(nsStr, self) {
    var nss = splitNs(nsStr);
    var obj = self[nss[0]];
    for(var i = 1; i < nss.length; i += 1) {
      obj = obj[nss[i]];
    }
    self[nss[nss.length - 1]] = obj;
  };

  // 名前空間を作成して受け取った関数のthisに登録されたものをすべて作成した名前空間に登録する
  window.ns = function(sym, fn) {
    fn.call(ret(sym));
  };
})();

(function () {
  // 名前空間「rtns.classes」を使用
  ns('rtns.classes', function() {
    // コンストラクタFooを定義
    function Foo() {
      this.x = 2;
    }

    // プロトタイプにメソッドを定義
    Foo.prototype.foo = function() { 
      console.log("foo", this.x); 
    };

    // スタティックメソッドに相当するものを定義
    Foo.staticFoo = function() {
      console.log("static foo");
    };

    // 名前空間に登録して外部から参照できるようにする
    this.Foo = Foo;
  });
})();

(function () {
  // rtns.classes.FooをFooとしてアクセスできるようにする
  use('rtns.classes.Foo', this);

  ns('rtns.classes', function() {
    // Fooを親としてコンストラクタBarを定義
    function Bar() {
      // Fooで定義されているプロパティを作成する
      Foo.call(this);

      // Bar独自のプロパティ
      this.y = 3;
    }

    // プロトタイプを設定して継承する
    // Object.setPrototypeOfが定義されているブラウザではinheritsは不要です
    if(Object.setPrototypeOf) {
      Object.setPrototypeOf(Bar.prototype, Foo.prototype);
    } else {
      Bar.inherit(Foo);
    }

    // Bar独自のメソッドを定義
    Bar.prototype.bar = function() { 
      console.log("bar", this.x, this.y); 
    };

    this.Bar = Bar;
  });
})();

(function() {
  use('rtns.classes.Foo', this);
  use('rtns.classes.Bar', this);

  // Fooのインスタンスを作成
  var f = new Foo();
  // Fooのインスタンスメソッドfooを呼んでみる
  f.foo();

  // Barのインスタンスを作成
  var b = new Bar();
  // Fooで定義されているメソッドをプロトタイプチェーンをたどって呼んでみる
  b.foo();
  // Barで定義されているメソッドを呼んでみる
  b.bar();

  // FooとBarそれぞれのプロトタイプになにが定義されているか確認
  console.log((Foo.prototype.foo)? "Foo has foo" : "Foo has'nt foo");
  console.log((Foo.prototype.bar)? "Foo has bar" : "Foo has'nt bar");
  console.log((Bar.prototype.foo)? "Bar has foo" : "Bar has'nt foo");
  console.log((Bar.prototype.bar)? "Bar has bar" : "Bar has'nt bar");

  // Fooのスタティックメソッドを呼んでみる
  Foo.staticFoo();
})();


```
ApplicationSettingsBase.Properties と PropertyValues

# ApplicationSettingsBase.Properties と PropertyValues

格納されている値が、似ているようで異なるので調べた。
`ApplicationSettingsBase` は、C# の Windows Form アプリケーションであれば `Properties.Settings.Default` として扱うインスタンスの基底クラス。

## Properties

ユーザ設定が存在しない場合のデフォルト値
Visual Studio を使うなら、プロジェクトのプロパティで [設定] タブのエディタで編集した値がデフォルト値で、これを操作できる。

```csharp
// 次でアクセスできる
Properties.Settings.Default.Properties[設定名]?.DefaultValue
```

## PropertyValues

ユーザ設定値
Visual Studio でビルドすると実行可能ファイルと同じフォルダに出力され、実行環境に配布する `実行ファイル名.exe.config` に設定した値が格納され、これを操作できる。

配布する config ファイルは XML 形式なので、配布後に編集することも可能だが、アプリケーションが `Properties.Settings.Defalut` の仕組みを利用する限りは、設計時に定義する `Settings.Designer.cs` のプロパティしか読み込まれない。

```csharp
// 次でアクセスできる
Properties.Settings.Default.PropertyValues[設定名]?.PropertyValue
```

## 確認した環境
- 日本語 Windows 10 Home 64 ビット
- Visual Studio Community 2015 Update 3
Windows 10にGVimベースのPython開発環境を構築する（３） GVim8.0 & Python3.6編


2017年2月1日，AnacondaでPython 3.6が使用できるようになったので，GVimを再度コンパイルします．[第１回の記事](http://qiita.com/daizutabi/items/72fa1c2f05d721e5cd48)の焼き直しになります．

Windows 10, 64 bitビットPCにGVimベースのPython開発環境を構築します．Windowsのアカウント名は daizu とし，主に `C:\Users\daizu\AppData\Local` 下に各プログラムを配置します． 

# Python

なにはともあれPython．Windowsでは [Anaconda](https://www.continuum.io/)  でPython環境を構築するのが便利です．

インストール対象の選択では，Just for me を選び，Destination folder をデフォルト設定の `C:\Users\daizu\Anaconda3` から `C:\Users\daizu\AppData\Local\Anaconda3` に変更します．Advanced Options は両方ともチェックします．デフォルトの設定がされるほか，実行ファイルの置かれたディレクトリが `PATH` に追加されます．

# その他もろもろ

以下のプログラムは，[第１回の記事](http://qiita.com/daizutabi/items/72fa1c2f05d721e5cd48)を参照．

* MinGW-w64 - for 32 and 64 bit Windows
* MSYS2
* Git
* Lua

# GVim

GitHubからソースを取得します．コマンドプロンプトを開き，

```bat
$ cd AppData\Local
$ git clone https://github.com/vim/vim.git
```

とします．

コンパイルするためのバッチファイル `makevim64.bat` を下記の参考URLからダウンロードし，`C:\Users\daizu\AppData\Local\vim` にコピーします．LuaとPythonのバージョンに合わせるために，`makevim64.bat` を以下のように編集します．

```bat:makevim64.bat
setlocal
:: path to MinGw64
set USERNAME=daizu
set USERDOMAIN=

set PYTHON3=C:/Users/daizu/AppData/Local/Anaconda3
set PYTHON3_VER=36
set DYNAMIC_PYTHON3=yes

set LUA=C:/Users/daizu/AppData/Local/lua-5.3.2
set LUA_VER=53
set DYNAMIC_LUA=yes

md bin
cd src

:: Clean
mingw32-make -f Make_ming.mak GUI=yes clean ARCH=x86-64

:: GUI x64
mingw32-make -f Make_ming.mak GUI=yes OLE=no FEATURES=HUGE ARCH=x86-64

set OUTDIR=../bin
copy *.exe "%OUTDIR%"
copy .\GvimExt\*.dll "%OUTDIR%"
copy *.dll "%OUTDIR%"
copy .\xxd\*.exe "%OUTDIR%"

cd ..
endlocal
```

コマンドプロンプトで，`C:\Users\daizu\AppData\Local\vim` に移動し，

```bat
$ makevim64.bat
```

としてコンパイルします．

コンパイルに成功したら，`C:\Users\daizu\AppData\Local` に `vim80-daizu` フォルダを作成し，さらにその下に `vim80` ディレクトリを作成します．`vim` をコンパイルしたディレクトリ (`C:\Users\daizu\AppData\Local\vim`)下の `runtime` 内のディレクトリとファイル一式を`vim80`下にコピーします．次にコンパイルした実行ファイル `gvim.exe` と `vimrun.exe` を `C:\Users\daizu\AppData\Local\vim\bin` から `C:\Users\daizu\AppData\Local\vim80-daizu` にコピーします．そして，参考URLから64ビット用の `iconv.dll`, `libintl.dll` を取得し，同じく `vim80-daizu` ディレクトリ下にコピーします．

GVimの設定ファイル `_vimrc`・`_gvimrc` を，`C:\Users\daizu\vimfiles\dotfiles` 下につくります．以下は動作確認のためだけの例です．

```vim:_vimrc
 set enc=utf-8
```

```vim:_gvimrc
 colorscheme desert
```

これらをホームディレクトリにリンクします． 管理者権限でコマンドプロンプトを開き，

```bat
$ mklink c:\Users\daizu\_vimrc C:\Users\daizu\vimfiles\dotfiles\_vimrc
$ mklink c:\Users\daizu\_gvimrc C:\Users\daizu\vimfiles\dotfiles\_gvimrc
```

とします．


参考URL
> https://sites.google.com/site/fudist/Home/vim-nihongo-ban/mingwvim

# 追記

Matplotlibを使おうとすると，

```text
This application failed to start because it could not find or load
the Qt platform plugin "windows" in "".

Reinstalling the application may fix this problem.
```

とエラー発生．

```bat
$ conda uninstall pyqt
$ conda install pyqt
```

で実行できるようになった．
Scheme (R6RS) でひらけ！ポンキッキ

Scheme を使った記事「[lambda を隠した書き方 (35) - 第25回シェル芸勉強会 Q2 -- ひらけ！ポンキッキ](http://qiita.com/nakataSyunsuke/items/4e7e5fd174e34eac1b25)」を見てこれは面白そうな問題だと思いました。

R6RS ならばユニコードの範囲の文字を扱えることが保証されているので余計な処理にわずらわされずワンライナに出来そうだったのでやってみました。

```
$ echo '(import(rnrs))(let*((s"ひらけ！ポンキッキ")(d(string-append s s))(n(string-length s)))(do((i 0(+ i 1)))((= i n))(put-string(current-output-port)d i n)(newline)))' |scheme -q
```
```
ひらけ！ポンキッキ
らけ！ポンキッキひ
け！ポンキッキひら
！ポンキッキひらけ
ポンキッキひらけ！
ンキッキひらけ！ポ
キッキひらけ！ポン
ッキひらけ！ポンキ
キひらけ！ポンキッ
```

ここでは、 Chez Scheme を用いましたがコードは R6RS の範囲内で書いたので他の R6RS 処理系でも同じように動作するはずです。
Excelに入力したURLをQRコードに変換してセルに貼り付け

# 概要
一気にQRコードを作りたかったので、Excelに入力されたURLをQRコードにしてみました。
ポイントはGoogle Chart Apiです。

## 2019-05-27 追記
こんなツールを発見。こちらの方が良さげ。
【QRコードビルダー】
http://qr.ag-media.jp/


# 実際の例
![excel_qr.gif](https://qiita-image-store.s3.amazonaws.com/0/16917/b6b2bb29-1185-b85e-c99a-dcf5115c2757.gif)

# 手順詳細
1. 新規ワークシートを作る
2. A列にQRコードにしたいURLを入力
3. 「Alt + F11」を押す
4. 「Alt + i」のあと「Alt + m」を押す
5. 下のコードを張り付け
6. 「Alt + F8」をおしてInsertQrcodeを選んで実行

```
Sub InsertQrcode()
    Dim i As Long, v As String
    On Error Resume Next
        For i = 1 To 9999
            v = Cells(i, "A").Value
            If v = "" Then Exit Sub 'カラになったら抜ける
            If Left(v, 4) = "http" Then 'httpで始まるurlが対象
                With Cells(i, "A")
                    .RowHeight = 100
                    .VerticalAlignment = xlTop
                End With
                Set obj = ActiveSheet.Pictures.Insert("http://chart.apis.google.com/chart?cht=qr&chs=80x80&chl=" + v)
                With obj
                    .ScaleHeight 1, msoTrue
                    .ScaleWidth 1, msoTrue
                    .Top = Cells(i, "A").Top + 16
                    .Left = Cells(i, "A").Left + 2
                End With
            End If
        Next i
    On Error GoTo 0
End Sub
```

※ QRコードを全部削除したいときは、F5をおして「セル選択」、「オブジェクト」を選んでOKを押す、「DEL」で削除。
[C#] パスからファイル名/ディレクトリ名の取得

パスからファイル名/ディレクトリ名の取得方法メモ

```csharp:パスからファイル名の取得
System.IO.Path.GetFileName(file_path)

System.IO.Path.GetFileName(@"C:\path\to\file.txt")
```

```csharp:パスからディレクトリ名の取得
System.IO.Path.GetDirectoryName(file_path)

System.IO.Path.GetDirectoryName(@"C:\path\to\file.txt")
```

# 参考
[Path.GetFileName メソッド (String) (System.IO)](https://msdn.microsoft.com/ja-jp/library/system.io.path.getfilename(v=vs.110).aspx)
[Path.GetDirectoryName メソッド (String) (System.IO)](https://msdn.microsoft.com/ja-jp/library/system.io.path.getdirectoryname(v=vs.110).aspx)
[パスからファイル名、拡張子、ディレクトリ名、ルートディレクトリ名等の情報を取得する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/file/pathclass.html)
変換で便利なショートカット

## お伝えしたいこと
Macで変換について便利なショートカットを覚えたのでそれの共有です。

## 覚えたショートカット
変換中に「英数」ボタン2回連打→打ち込んだ文言を全てアルファベット化

### 例
あいうえお
↓
変換中に「英数」ボタン2回連打
↓
aiueo

## 使いどころ
例えば、英文を日本語入力のまま書き出したりした際にわざわざデリートしないで上記のショートカットを使うと便利です。

## お礼
簡単な記載になりますがご参考になれば幸いです。お読みいただきありがとうございました。
Ubuntuの一時ファイルをRAMディスクに保存する

#はじめに
Electronアプリケーションで、Zipファイルでアーカイブされた画像ファイルを表示すべく少しづつ調査しています。
Zipファイルは、ファイル解凍せずに表示することができるのですが、次の問題があります。

1. 7zip形式のファイルに対応できない。(たぶんrarとかも)
2. スライドショー表示する場合には、実ファイルの方が都合が良い。
3. メモリ消費量が大きくなる

一時的に、ファイル解凍した場合気になるのが、HDDの場合はレスポンスで、SSDであれば書き換え回数です。
気にし過ぎかも知れませんが、対策を考えてみました。

##RAMディスクを利用する
Ubuntuでは、tmpfsというファイルシステムが利用されています。
名前から察する通り一時的なファイルを置くためのRAMディスクのためのファイルシステムです。
再起動したときには綺麗さっぱりファイルが無くなりますが、オンメモリで読み書きされるためとても高速です。
さらに利用されていない空き容量は、OSが利用できるためメモリ効率も良いようです。
調べてみると`/dev/shm`が、tmpfsで、利用可能な状態になっています。

##環境変数を設定するだけで利用できる
freedesktop.orgという規格があり、準拠したアプリケーションは、環境変数`XDG_CACHE_HOME`に、パスが設定されていれば、そこをキャッシュとして利用する約束になっています。
ちなみに、chromeとかもfreedesktop.org規格に対応しているため一時ファイルなどが、RAMディスクに保存されるようになります。

```:~/.xprofile
# キャッシュディレクトリの指定
export XDG_CACHE_HOME=/dev/shm/.cache-$(whoami)
# 他のユーザは読み書きできないようにする
mkdir -p ${XDG_CACHE_HOME}
chmod 700 ${XDG_CACHE_HOME}
```
参考:[一般ユーザのfreedesktop.org準拠アプリケーション向けキャッシュディレクトリをメモリ上に配置する](http://d.hatena.ne.jp/kakurasan/20090902/p1)

環境変数が設定されていない場合には、`${HOME}/.cache/`が使用されます。

#おわりに
Electronのアプリケーションをfreedesktop.org準拠に作成しておけば、ユーザーの設定によって、高速なRAMディスクを選択できそうです。
UniRx で使える Observable.Using

[実務で使っているUnityの便利モジュール・実装パターン3選 - Technology of DeNA](http://engineer.dena.jp/2016/12/dena-engineer-advent-calendar-2016-1-unity.html) で紹介されている `Using` が便利そうだったんですが、使ってみようとしたらいまいち使いにくかった [^1] ので、使えるものを用意しました。
結論としては、 [Rx.NET](https://github.com/Reactive-Extensions/Rx.NET) の `Observable.Using` がほぼそのまま使えました。


```csharp:Observable.Using.cs
using System;

namespace UniRx
{
    public static partial class Observable
    {
        // https://github.com/Reactive-Extensions/Rx.NET/blob/371c83c621562a2259580a03f0cb5bf8680ea720/Rx.NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs#L417-L441
        public static IObservable<TSource> Using<TSource, TResource>(
            Func<TResource> resourceFactory,
            Func<TResource, IObservable<TSource>> observableFactory)
        where TResource : IDisposable
        {
            return Observable.Create<TSource> (observer =>
            {
                var source = default(IObservable<TSource>);
                var disposable = Disposable.Empty;
                try
                {
                    var resource = resourceFactory();
                    if (resource != null)
                    {
                        disposable = resource;
                    }
                    source = observableFactory(resource);
                }
                catch (Exception exception)
                {
                    return new CompositeDisposable(Throw<TSource>(exception).Subscribe(observer), disposable);
                }

                return new CompositeDisposable(source.Subscribe(observer), disposable);
            });
        }
    }
}
```

これを Assets/Plugins/ の下に置くと、元の UniRx の `Observable` に `.Using` が生えます。

使用例:

```csharp
Observable.Using(() => new UnityWebRequest(), request =>
{
    // いろいろ設定…。
    request.url = "URL";
    return request.Send().AsObservable().Select(_ => request.responseCode);
})
.Subscribe(code => Debug.Log(code));
```

# Rx.NET の NO_PERF

https://github.com/Reactive-Extensions/Rx.NET/blob/371c83c621562a2259580a03f0cb5bf8680ea720/Rx.NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs#L417-L441

条件コンパイルの `NO_PERF` の時のコードを今回使ったんですが、この `NO_PERF` は Rx 1.1 の頃のパフォーマンス改善前のコードのようです。
http://stackoverflow.com/a/22691962
`Observable.Using` を使うようなタイミングなら UniRx のパフォーマンスはあんまり気にしなくて大丈夫かと思います。

[^1]: 元の `Using` では `new` した `UnityWebRequest` が `observableFactory` に渡されないので、そこが使いにくいです。
PowerShellを用いてActiveDirectoryのユーザをグループに追加する

#ユーザ名の命名規則を踏まえて一括で新たなグループに追加する
まず，ActiveDirectoryのドメインユーザの中でユーザログオン名が「abc」で始まるアカウントを，新たに作成したドメイングループ「ABC」へ登録することを試みました．

##ドメインユーザの中でユーザログオン名に「abc」を含むアカウントを抽出する

https://codezine.jp/article/detail/6109

を参考にするとドメインユーザを抽出するにはGet-ADUserコマンドレットを使いフィルタをかけるとよいみたいなので

`Get-ADUser -Filter {UserPrincipalName -like "abc*"}`

とやってみると抽出できたので，結果を変数に入れておくことにします．

`$IDs = Get-ADUser -Filter {UserPrincipalName -like "abc*"}`

##抽出したアカウントをグループに追加する

抽出したアカウントを１つ１つ追加しようと

`foreach($ID in $IDs){`

で始めて，ループで処理することにしました．

http://blog.powershell-from.jp/?p=1320

を参考にするとグループに追加するには，Add-AdGroupMemberコマンドレットを使うとよいようです．

`Add-AdGroupMember -Identity 'ABC' -Members $ID`

で登録できました．

ということで，下記のようなプログラムで目的が実現できました．

```abc.ps1
$IDs = Get-ADUser -Filter {UserPrincipalName -like "abc*"}

foreach($ID in $IDs){
   Add-AdGroupMember -Identity 'ABC' -Members $ID
}
```
Qiita線上のポエム

Qiitaにポエムじゃない記事ポエム認定されて消されたのでポエム以外の記事全部消した。いちいちお前の越えちゃいけないポエムラインに気を遣って書いてられるか。Mediumに行こうかと思ったけどシンタックスハイライトがなくて断念。はてなを1年ぶりくらいに触ったら動作がもっさりストレスフルだったのがかなり速くなってて使用に耐えるようになったのでこっちに戻ることにしよう。
俺の愛するMySQLWorkbenchが応答しなくなったとき

`Tables` > `table-name` > 右クリ > `Select Rows` ってやっても返事しねぇ…。なんてことになったとき、これやったら効果あったよって話。

あくまでも予想、手探り、経験であって、どこかに問い合わせた結果とかじゃないんで注意。

 使ってる OS は macOS 。おそらく自動保存されたデータやキャッシュが悪さをしているだろうので、ディレクトリ名から予想して。

1. まずは愛するMySQLWorkbench を終わらせる。
2. 下記コマンドを実行してキャッシュをクリアする。

``` shell
$ cd ~/Library/Application\ Support/MySQL/Workbench
$ mv cache cache_
$ mkdir cache
```

これでよくなった。
VBSでCRUD その２

#概要
VBSでデータの永続化やってみる。
x64環境用。

#インストール
Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント


#テーブル生成
create.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cd & "\test.mdb;"
sql = "CREATE TABLE blog_data (id integer IDENTITY(1,1) NOT NULL PRIMARY KEY, title text NOT NULL, body text NOT NULL, modified timestamp DEFAULT NOW() NOT NULL)"
Set rs = db.Execute(sql)
msgbox "ok"
```

#Create（生成）
add.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cd & "\test.mdb;"
sql = "INSERT INTO blog_data(title,body) VALUES('test', 'test')"
Set rs = db.Execute(sql)
msgbox "ok"
```

#Read（読み取り）
view.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cd & "\test.mdb;"
sql = "SELECT * FROM blog_data"
Set rs = db.Execute(sql)
Do Until rs.EOF
    msgbox "id:" & rs(0) & " title:" & rs(1) & " body:" & rs(2) & " mod:" & rs(3)
    rs.MoveNext
Loop
```

#Update（更新）
edit.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cd & "\test.mdb;"
sql = "UPDATE blog_data SET title='test2', body='test2' WHERE id=2"
Set rs = db.Execute(sql)
msgbox "ok"
```

#Delete（削除）
del.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cd & "\test.mdb;"
sql = "DELETE FROM blog_data WHERE id=1"
Set rs = db.Execute(sql)
msgbox "ok"
```
よく使うけどすぐ忘れるコマンドメモ

## 置換

### sed

上書きして置換

```
$ sed -i '' s/before/after/g' PATH_TO_FILE
```

- `-i`の引数に文字列を入れると、バックアップとしてそのsuffixのついたファイルを残してくれる

## 文字列分割

### cut

デリミタとフィールドを指定してほしい部分だけ取ってくる

```
$ echo "aa:bb" | cut -d: -f1
```

- `-d`でデリミタ指定
- `-f`でフィールド指定


### awk

抽出したものを加工したい場合とかにはawk使うと便利

```
$ echo "aa:bb" | awk -F ':' '{print $1}'
```

- `-F`でデリミタ指定
- `print`で欲しい部分を出力

## 文字列を渡してbash実行

### bash

文字列から`bash`実行
パイプ処理とかもまとめて`xargs`に渡したいときとかによく使う

```
$ bash -c "echo hello"
```

# Sunippets

## 全てのファイルの全ての`hoge`を`huga`に置換したい場合

```
$ grep -r hoge ./ | cut -d: -f1 | sort | uniq | xargs -I{} sed -i '' 's/hoge/huga/g' {}
```
CakePHP3でEntityのプロパティがない場合Exceptionを吐くプラグインを作成した

# CakePHP3でEntityのプロパティがない場合Exceptionを吐くプラグインを作成した

## 前段

CakePHP3になって色々便利になったはなったんですが、困ったこともボチボチある感じ。  
困ったことの一つにEntityでそのプロパティがない場合にnullが返ることだったりします。

```php
<?php
$entity = $this->Topics->get($id);
// titleはあるけどtypoした
// nullが出力
echo $entity->tilte;
```

これ、CakePHP2だと`undefined index`が出て、typoしたとかわかるんですが、CakePHP3だと`null`が出力されてしまうので、気づきにくいです。  
ただの一覧とかならまだいいんですが、計算ロジックの間とかだとなかなかミスに気づけないことが多くて困ってました。

## つーわけで
~~一時間ちょいで~~[作ってみた](https://github.com/satthi/entity-column-check)

## 使い方（READMEそのまんまｗ)

### Entity

```php
<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;
use EntityColumnCheck\Model\Entity\EntityColumnCheckTrait;

class Topic extends Entity
{
    // 追加項目
    use EntityColumnCheckTrait;
    protected $_accessible = [
        '*' => true,
        'id' => false
    ];
    // 例外として設定するカラム
    protected $entityColumnCheckAllowField = [
        'file',
        'img'
    ];

    //&getメソッドをoverride
    public function &get($property)
    {
        $value = parent::get($property);
        $this->getEntityColumnCheck($property);
        return $value;
    }
}
```

## まとめ
まだ、実践投入もしてないので設定が足りてるかとかよくわからない感じ。  
使えるといーなーとぼんやり思ってるところ。

なお、すでに動いているプログラムに突っ込むのはあんまりお勧めできません。

```php
if (is_null($entity->hoge)) {

}
```
みたいな判定入れて、hogeってフィールドが存在しない場合は当然エラーになりますので。。。ちょうつらいことになると思います。。。
Stringなど、Int以外のenumの中身をfor in~などで列挙する

使いたい日がまた来ると思うので備忘録。
以下を参考にさせていただきました。
http://stackoverflow.com/questions/24007461/how-to-enumerate-an-enum-with-string-type

## コード
環境：Swift2.3
※諸事情により3.0以降ではない。注意

```swift:Vegetable.swift
enum Vegetable: String {
    case carrot = "にんじん"
    case onion = "たまねぎ"
    case potato = "じゃがいも"
    
    /**
     Vegetableの配列を取得する
     */
    static func iterateEnum<T: Hashable>(_: T.Type) -> AnyGenerator<Vegetable> {
        var i = 0
        return AnyGenerator {
            defer { i += 1 }
            let next = withUnsafePointer(&i) { UnsafePointer<Vegetable>($0).memory }
            return next.hashValue == i ? next : nil
        }
    }
    
    /**
     Vegetableの要素一覧を取得する
     - returns Vegetable要素一覧
     */
    static func getVegetables() -> [Vegetable] {
        var vegetables = [Vegetable]()
        for vegetable in Vegetable.iterateEnum(Vegetable) {
            vegetables.append(vegetable)
        }
        return vegetables
    }
}

```
ec2ctl memo


# list
## select column
- `-S` sort

`ec2ctl list -o table -a tag:Name,private_ip_address,public_ip_address,state.name -S tag:Name`

### column list
- tag:xxx
- private_ip_address
- public_ip_address
- state.name
- ...

## search by
via tag
`ec2ctl ec2 list -s 'tag:Env=production'`

via instance-type
`ec2ctl ec2 list -s 'instance_type=c4.large'`

multi criteria regexp supported
`ec2ctl ec2 list -s 'tag:Env=production,tag:Name=web.*'`


# execute

## On windows
with `--platform-type Windows`

list
`ec2ctl list -s 'tag:Name=web.*' --platform-type Windows`
confirm `ssm:ping_status = Online`

exec
`ec2ctl ec2 execute -s 'tag:Name=web.*' --platform-type Windows -c "ls"`
CSSの属性セレクタでスマートぶってはイケナイ話

## 概要

命名規則に基づいて似たようなクラス名のバリエーションがたくさんあるときに、属性セレクタでパターンマッチをつかって書いたら一括してできてエレガントそうな気配がします。

が、

たとえば属性セレクタによる指定で、 `[class^='hoge'] {}` という書き方だと、実は `class="fuga hoge"` という属性にマッチしない問題などがあるので注意という話。

## 説明

```html
<button class="btn-normal">ボタン</button>
<button class="btn-like">いいね</button>
<button class="btn-submit">投稿する</button>
```

こういう感じでCSSフレームワークぽいものを作るときに属性セレクタで一気にやると楽ですよね。

```css
[class^='btn-'] {
  padding: 4px 8px;
  border:1px solid #ccc;
  border-radius:6px;
}
```

ただ、これは `class` 属性値の先頭に `btn-xxxx` を記述する前提になっていて、
下記のように製作者が意図しない使い方をされたときに破綻します。

```html
<button class="is-dangar btn-normal">ボタン</button>
<button class="is-liked btn-like">いいね</button>
<button class="is-disabled btn-submit">投稿する</button>
```

属性セレクタによる部分マッチは、一見`jQuery.fn.hasClass();` のようなノリで `class` 属性内のセレクタを配列化してひとつひとつに対して `^=` してくれるように見えるんですが、実際には `"is-dangar btn-normal"` という文字列に対して評価していますので、`class` 属性の先頭に期待するセレクタを記述しないと反映されないという **暗黙のルールを利用者に強いる** 羽目になります。


これを回避するには下記のように先頭にかぎらずどこかしらでマッチすればいいような指定も可能です。

```css
[class*='btn-'] {
  padding: 4px 8px;
  border:1px solid #ccc;
  border-radius:6px;
}
```

これはこれでいいのですが、下記のようなものにもマッチするおそれがあるので、やはり **暗黙のルール** というか罠が存在していることになります。

```html
<div class="btn-list"><!-- 意図せずここにもマッチしてしまう -->
  <button class="is-dangar btn-normal">ボタン</button>
  <button class="is-liked btn-like">いいね</button>
  <button class="is-disabled btn-submit">投稿する</button>
</div>
```

このへんは想定している運用の内容次第ではありますが、 SASSなどの継承をうまく使い `%btn {}` のように共通化するか、 `btn btn-normal` のようにセレクタを疎に設計するようにするほうがよいのではないかと思います。

## 簡単なDEMO

http://jsdo.it/yd_niku/QgCZ


---
スマートに省略して書いたような気になってハマったオジサンの備忘録でした。かしこ。
scrapyのJSON出力を日本語にする方法


scrapyで日本語を含むページをクロールすると、その結果のJSONに\uXXXXという文字列が大量に埋め込まれてしまいます。
これを防ぐためには、settings.pyに以下のように書きましょう。

```python
FEED_EXPORT_ENCODING='utf-8'
```

参考
https://doc.scrapy.org/en/latest/topics/feed-exports.html#feed-export-encoding
AWSコマンドが突然うごかなくなるケースに遭遇

# 現象

## エラー

ある日突然以下のエラーを出し、AWS CLIコマンドが動かなくなる。

```
An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials
```

## 原因

インスタンスのClockがずれた。

## 応急処置

次のコマンドを実行する

```bash
sudo ntpdate ntp.jst.mfeed.ad.jp
```

## 恒久対応

NTPなど時刻の同期をちゃんと設定する。

# 詳しく

AWSサーバのインスタンス情報などを取得するためのコマンド、たとえば以下のようなもの

```bash
export EC2_INSTANCE_ID=`wget -q -O - http://instance-data/latest/meta-data/instance-id 2> /dev/null`
aws ec2 describe-instances --filters Name=instance-id,Values="$EC2_INSTANCE_ID"
```

これを使う際には以下のようなAWS CLIを使うための認証用の環境変数を設定しないと、今回のようなAuthエラーがでて使えないのはよく知られているし、普通にドキュメントに書いてある。

```bash
export avail_zone=`wget -q -O - http://instance-data/latest/meta-data/placement/availability-zone`
export AWS_DEFAULT_REGION=`echo -n ${avail_zone}|sed -e 's/[a-z]$//'`
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXX
```

これを設定しておけば通常は認証はOKだ。

だが、認証が失敗するケースはこれだけではない。

インスタンスのOSのClockがズレている場合も認証エラーになるのだ。

問題が起きたのは次のイメージから作ったインスタンス。

```
ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20160114.5 (ami-9abea4fb)
```

このイメージのデフォルトではNTPの設定がされていないため、負荷をかけると時刻がずれていくのであるらしい。

それで、ある日突然AWS CLIが動かなくなり、それを利用していたCronなどがエラーを吐くようになった。

AWSでUbuntuのイメージを使ってインスタンスを作っている人はOSのクロックが同期しているか確認した方がいい。
GitHubで閲覧中のリポジトリを切り換えるブックマークレットを作った


作成2分、効果大:D

### おことわり
この記事は複数のリポジトリを頻繁に見る、もしくは切り換える人向けです。

### 需要
会社では同じ組織アカウントの下に大量のリポジトリがあります。
また僕個人のアカウント名の下にもリポジトリが沢山あります。

で、それらを頻繁に切り換える場合、ブックマークだと当然マークしたページに遷移しますね。
大体はそのリポジトリのホームでしょうか。

けど実際は「AリポジトリのIssues」から「BリポジトリのIssues」にジャンプしたい事の方が多いです。
複数のリポジトリのIssuesを全部みたいとか、PullRequestsを全部みたいとか。

### ブックマークレット
こんな感じのブックマークレットを沢山作っておく
当然`dst`は自分で埋める

```JavaScript
javascript:
var dst = 'repo-name';
var src = window.location.href;
window.location.href = src.replace(src.split('/')[4], dst);
```

<img width="1206" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/389cea8b-55b4-e6b1-dd73-99b7ae917388.png">

これを押すと`suzuki-hoge/dev-note/pulls`から`suzuki-hoge/repo-name/pulls`に遷移出来る。

### 他
+ 組織アカウントとかも変えたければちょっと改良すれば出来るでしょう
+ `suzuki-hoge/dev-note/pull/2345`から`suzuki-hoge/repo-name/pull/2345`に遷移すると、遷移先にその番号が存在しないとリンク切れになる
  + 遷移前にリンク切れをチェックして、切れてたら`suzuki-hoge/repo-name/pulls`に遷移するとかやっても良い
  + けどとにかく軽く動かしたかったので、リンク切れ覚悟で使う
+ ZenHubを入れるとリポジトリ切り換えプルダウンが出てくるけど、あれはいちいちリポジトリ一覧を参照してるっぽいのでプルダウンを開くのに時間がかかる

### 結論
僕が気に入ったのでベネ
ポケモンに格言を喋らせる

# モチベーション

ジョークコマンドの `fortune` と `cowsay` を組み合わせると牛がいろいろ喋ってくれるんですが、

```bash
$ fortune | cowsay
 _____________________________________
/ QOTD:                               \
|                                     |
| Flash! Flash! I love you! ...but we |
| only have fourteen hours to         |
|                                     |
\ save the earth!                     /
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

`cowsay` のポケモンが喋ってくれる版があったので、
https://github.com/possatti/pokemonsay

日本語で格言を喋らせてシュールにしてみようかと。

![スクリーンショット 2017-02-01 18.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/41925/50a926ff-35a4-18cb-dee5-ba5ea892b891.png)

とりあえず `fortune` と `cowsay` は入ってる前提で進めます。

# 名言をダウンロード

とりあえず[ここ](http://web.archive.org/web/20060930055512/http://worris.sakura.ne.jp/fortune.html)から「星が見える名言集」 `fortune-meigen.tar.gz` を落としてきて、
ひとまず `~/.fortune` に展開。

文字コードが euc-jp なので utf8 に変換しておきます。

```bash
$ cd ~/.fortune
$ nkf -w meigen > meigen.utf8
$ strfile meigen.utf8
```

# cowsayの日本語対応

ほぼ[こちら](http://mjhd.hatenablog.com/entry/cowsay-japanese-edition)に書いてある通りだけど、1箇所 `binmode STDOUT, ":utf8";` を追加してあります。

diff置いときます。
https://gist.github.com/arc279/fa2df27ec8a0093be4daf9aadacde2a8


# pokemonsay を入れる

https://github.com/possatti/pokemonsay

を落としてきて、`./install.sh` すると、`~/.pokemonsay/cows` にcowファイルが展開されます。

ここでおもむろに

```bash
$ cd ~/.pokemonsay/cows
$ sed -i '/binmode/s/^/#/g' *
```

一括で `binmode STDOUT, ":utf8";` をコメントアウト。


# 実行

`~/bin/pokemonsay` にコマンド入ってると思うので、

```
$ fortune .fortune/meigen.utf8 | ~/bin/pokemonsay
```

とかやると喋ってくれます。
冒頭の画像参照。

`.bashrc` とかに書いとくとわりとうざいです。

最後の行にタブ文字が入ってる都合で、出典の人名が長い場合とかだと、
吹き出しの長さがうまく計算できないくて折り返しのあたりで文字化けするので、
`-w 100` とかで吹き出し少し広めにとっておくと良いと思います。


# その他参考

http://d.hatena.ne.jp/kakurasan/20070824/p1
Dagger2でActivityのprivateなフィールドにInjectする。

compile 'com.google.dagger:dagger:2.7'

## エラー

```java:MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Inject
    private BooksPresenter presenter;

}

```

## 成功

```java:MainActivity.java

public class MainActivity extends AppCompatActivity {
    
    private BooksPresenter presenter;

    @Inject
    public void setPresenter(BooksPresenter presenter) {
        this.presenter = presenter;
    }

}

```
Ruby on Rails | ActiveRecord で オブジェクト同士を==で比較した場合、全属性が同値かどうかは検証しない

っぽいです（`==`は`id`が同値かどうかを検証する）。RSpecではまったのでメモ。


# 検証

```rb
# ID が同じだと true 
Book.new(id: 1) == Book.new(id: 1)
=> true

# ID が違うと false
Book.new(id: 1) == Book.new(id: 2)
=> false

# ID が同じで title が違っても true
Book.new(id: 1, title: 'サピエンス全史') == Book.new(id: 1, title: 'チョコレートの世界史')
=> true
```

# 対策

全属性が同値かどうかを検証するには、attributes同士を比較するとか？ もっと良い方法がありそうな気が。。

```rb
Book.new(id: 1, title: 'サピエンス全史').attributes == Book.new(id: 1, title: 'サピエンス全史').attributes
=> true

Book.new(id: 1, title: 'サピエンス全史').attributes == Book.new(id: 1, title: 'チョコレートの世界史').attributes
=> false
```


# 環境

- Rails 4.2.7.1

# 参考

[RailsによるアジャイルWebアプリケーション開発第4版](https://books.google.co.jp/books?id=dHmPKAPqO-4C&pg=PA259&lpg=PA259&dq=activerecord+%E5%90%8C%E5%80%A4&source=bl&ots=12Gopq9Etu&sig=YaDk8JHtqTtcbfcG8kkkSQEEke8&hl=en&sa=X&ved=0ahUKEwjYtOGLz-7RAhXJVrwKHaCLBzEQ6AEINDAD#v=onepage&q=activerecord%20%E5%90%8C%E5%80%A4&f=false)

![image](https://cloud.githubusercontent.com/assets/13635059/22502151/12da6ec4-e8af-11e6-81bc-23650c7b98f3.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
railsで普通のリンクをajax通信に変更するテンプレートセット

#railsで普通のリンクをajax通信に変更するテンプレートセット
たまに使いたくなる普通のリンクをAjax通信に変更するテンプレセットをまとめてみました。

今回は削除ボタンをAjaxにしてみるよ！

リンクにこの２つのオプションをつける

```rb:index.html.slim
#JavascriptでAjax通信が成功した時のイベントをくっつけるためにclassつける
, :class => 'delete_button'

#これをつけるとAjax通信になる
, remote: true
```

つけよう！！

```rb:今までのリンク
= link_to '削除', product_path(product), data: { confirm: '削除する?' }, method: :delete
```

```rb:変更後のリンク
= link_to '削除', product_path(product), data: { confirm: '削除する?' }, method: :delete, :class => 'delete_button', remote: true
```

ついた！！！

Ajax通信が成功した時のための jsを書こう　
※注意：slim使ってます

```js:index.html.slim
javascript:
  $('.delete_button').bind("ajax:complete", function(xhr, response, status){
    result = JSON.parse(response.responseText)[0]
    if(status=="success"){
      alert('成功したよ！' + result["id"] + "番のデータが消えたよ！！")
    }else{
      alert("エラーが起きたので削除できませんでした")
    }
  })
```


controllerを編集しよう

```rb:変更前
  def destroy
    respond_to do |format|
      format.html { redirect_to hoge_path, notice: '削除しました' }
    end
  end
```

```rb:変更後
  def destroy
    if @product.destroy
      render json: [ "id" => @product.id ] , status: 200
    else
      render json: [ "id" => @product.id ] , status: 500
    end
  end
```

,status 200 と入れるとJS側のstatus変数に success　という文字列が入る(数字じゃないよ！！！)
,status 500 と書くと失敗に成る。

終わり
Amazon Linux の PostgreSQL を最新にする手順

以下は、**2017年1月31日時点**の情報です。


Amazon Linux の PostgreSQL は **9.5.4**  これを最新の **9.6.1** にバージョンアップする手順を解説します。

注意点
* `sudo`は、省略しているので、適宜追加してから実行してください。
* パスの設定時は各環境で異なる可能性があるので、`ls`などで確認してから設定してください。

手順
1. PostgresSQL 9.6.1 をインストール
1. ユーザpostgresのホームディレクトリの変更
1. ユーザpostgresのパスワードを設定
1.  シェルの設定追加

## 1. PostgresSQL 9.6.1 をインストール

```bash
# 最新のバージョンを探す。
yum list | grep -E 'postgresql..-server' | sort

# 見つかった最新バージョンをインストールする。
# xxx-server を指定すれば、依存関係を確認して他のパッケージもインストールしてくれる。
yum install postgresql96-server
```

参考: [yumでPostgreSQLをインストールしてみよう - Let's postgres](http://lets.postgresql.jp/documents/tutorial/yum/yum)

## 2. ユーザpostgresのパスワードを設定

インストール時点で、ユーザpostgres には、パスワードが設定されていないため、パスワード設定を行う。

```bash
passwd postgres
```

## 3. ユーザpostgresのホームディレクトリの変更

Amazon Linux では、初期セットアップ時点で、PostgreSQL 9.5.4 がインストール済みのため、ユーザpostgresは、PostgresSQL 9.5.4 でログインするようになっているので、それを Postgres 9.6.1 でログインするように変更する必要がある。

```bash
# postgres のホームディレクトリを確認
cat /etc/passwd | grep postgres
```

```bash:結果
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql95:/bin/bash
```

ホームディレクトリが `/var/lib/pgsql95` となっているため、 `/var/lib/pgsql/9.6` に変更する。

``` bash
# ユーザpostgres でログインする。
su - postgres

# ホームディレクトリを変更する。
usermode -d /var/lib/pgsql/9.6
```


## 4. シェル設定の変更

```bash
# postgres でログインする。
su - postgres

# シェルの設定ファイルを開く
vi ~/.bash_profile
```

```shell:~/.bash_profile
# たぶん、PGDATA=/var/lib/pgsql95/data となっているので、以下に変更する。
export PGDATA=/var/lib/pgsql/9.6/data

# 既定値でPATHにPostgres9.5.4のパスが設定されれているので、末尾ではなく、先頭に追加する必要がある。
export PATH=/usr/pgsql-9.6/bin/:$PATH
```

以上で、最新のPostgresが使用できるようになるはずです。
NGINX + unicorn + Rails 設定時のハマりどころ

Rails Tutorial の成果物を EC2 で動かすための環境構築でハマった箇所のメモです。

1.  unicorn と nginx の起動ユーザが一致している必要があるらしい。
    [aws nginx + unicorn (13:permission dnined) while connecting to upstream でハマッた時に試したことのTIPS](http://qiita.com/UltraBirdTech/items/4f1a4a490cfc19298ad0)

1. unicorn.sock ファイルの配置場所は、 /tmp/ではなく、railsディレクトリ配下の tmp/に配置する必要があるらしい。

1. httpでアクセスすると、https にリダイレクトしてしまう場合、以下の設定を追加する。

    ```ruby:config/environments/production.rb
    # 既定値は、 config.force_ssl = true
    config.fore_ssl = false
    ```

1. cssが反映されない場合、以下の設定を追加する。

    ```ruby:config/environments/production.rb
    config.serve_static_files = true
    ```
React-Nativeで実機iPhoneにインストールする

[React Native入門3　〜API&リスト&実機でGO+debug〜](http://yutamasun.sakura.ne.jp/blog/2016/04/19/react-native3/)のサンプルコードを写経していたが
シミュレーターでは問題なかったのにXcodeでビルドするとエラーになったのでその解決方法などを残しておく。

# TL;DR

結論からいってしまうとアプリの名称やBundle Identifier、開発者登録などの情報が漏れていただけだった。

# 対象読者 or 前提条件 or 環境

## 前提条件

- ↑のReact Native入門3のサンプルコードに間違いがないこと
    - シミュレーター上で問題なく動作していれば恐らく問題ない

## 対象者

- iOSで一度も開発したことがない人
- 長らくXcodeを触っていないためビルドなどの作法を忘れている人
- react-nativeで開発しようと考えている人


## 環境

```
MacBook Pro (Retina, 15-inch, Late 2013) {
　　OS: macOS Sierra 10.12.2（16C67）,
　　プロセッサ: 2.3 GHz Intel Core i7,
　　メモリ: 16 GB 1600 MHz DDR3,
　　グラフィックス: Intel Iris Pro 1536 MB
}
```

```
$ react-native -v
react-native-cli: 2.0.1
react-native: 0.40.0
```

# 解決方法

1. Xcodeの左端（ナビゲーターエリアというらしい）のSampleAppをクリック
2. Xcode真ん中（エディタエリア）の↓の画像で囲った部分に必要な情報を書き込む
    - なおサンプルコードの通りにやっているとBundle　Identifierがすでに入力済みだと思うがすでに使用されているというエラーが出るので適当に書き換える
3. SampleApp/SampleAppTestsの両方に必要な情報を入力する
4. 再生ボタンを押す
5. iOSのビルドが通ってiPhoneアプリが立ち上がる、やったぜ！
    - それでも起動しないケース「信頼されていない開発元」的なポップアップがでてアプリが起動できないかもしれないがその場合は[Xcode7で1円も払わずに自作iOSアプリを実機確認する](http://qiita.com/FumihikoSHIROYAMA/items/a754f77c41b585c90329)にかかれている手順を適宜実行してください

<img width="480" alt="スクリーンショット 2017-02-01 17.13.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/18493/1a809b9d-0503-6029-9e38-b49069e8dde6.png">

<img width="480" alt="スクリーンショット 2017-02-01 17.14.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/18493/6b6005f2-12ea-1feb-92af-09c93ad88d19.png">

# 参考

- [React Native入門3　〜API&リスト&実機でGO+debug〜](http://yutamasun.sakura.ne.jp/blog/2016/04/19/react-native3/)
- [Xcode7で1円も払わずに自作iOSアプリを実機確認する](http://qiita.com/FumihikoSHIROYAMA/items/a754f77c41b585c90329)

# あとがき

超絶つまんねーことでハマったなーという気持ちでいっぱいです、この野郎！！！

## 追記:

なお、```react-native```のバージョンが違うからなのかわからないけども```jsCodeLocation```関連をコメントアウトする処理は必要なかったです。
……というかコメントアウトしたら逆に起動直後にアプリがフリーズした。
Goの勉強がてらにssh先を登録しておいて、選択して接続するツール作ってみた

Goでコマンドラインツール作ってみようと思い立ったので、最近ssh先が多くてわちゃわちゃしてきたなというのもあって、ssh先を保存しておいて、一覧から選択してsshするツール作ってみました。

# github

https://github.com/h-tko/goshel

## 使い方

以下でインストールして

```
$ go get -u github.com/h-tko/goshel
```

```
$ goshel
```

でコマンド起動、もしくは

```
$ goshel -l
```

で登録されている接続先一覧表示。

だけです、一旦。

設定ファイルはただのcsvなのでめんどくさかったら手でいじる設計に。

Goからコンソールをクリアする(/usr/bin/clear的なこと）方法がわからず対話の部分が汚くなってくのなんとかしたい、、、orz
Azure AppService on Linux で Git デプロイするときの注意点

AppService on Linux は現時点ではまだパブリックプレビュー中です。

## デプロイ資格情報のとおりに認証情報送っても通らない
デプロイオプションを一度切断して、再度デプロイオプションから接続します  
接続後にデプロイ資格情報を作った場合、その情報が渡っていないような気がしています

## リポジトリ内の DocumentRoot がリポジトリ直下でない
たとえばリポジトリ直下の `src` ディレクトリを Root に置きたいケースでは、アプリケーション設定で `DEPLOYMENT_SOURCE` を指定します
上記ケースでは `/home/site/repository/src` を指定します

よくわからない状態になった場合は AppService を作り直すか、以下の手順を行います

- デプロイオプションを一度切断
- Kudu で `rm -rf /home/site/repository/*`
`.gitignore` なども残ってないか確認
- Kudu で `rm -rf /home/site/wwwroot/*`

## git push で error: RPC failed, result=22, HTTP code = 502 が出る
Windows 版同様に、大きいコミットの送信はデフォルト設定だと失敗しやすいようです
バッファサイズを大きくしたうえで `git push` します

```
git config --local http.postBuffer 157286400
```
CodeIgniter URIパスとセグメントをごにょる

# こんなバグがあった

## 画面概要
- 検索フォーム付きの一覧画面がある。
- 仮にこのページのURLを「/seach/list」とする。

- このページのページネーション用パラメータは
/seach/list/2
/seach/list/3
というふうに後ろにつく。

- 検索用パラメータはセッションに保存している。

- 検索フォームにはこのようなリセットボタンがある。

```html:reset.html
<button type="button" onclick="location.href='http://localhost/seach/list'">reset</button>
```
viewのソースは

```php:reset_v.php
<button type="button" onclick="location.href='<?= base_url() . uri_string() ?>'">reset</button>
```
こんな感じ。

- GET/POST両パラメータが何もない時に検索用セッションをクリアする。

## 何が起きたか

概要を見て「ん？」て思う人もいるでしょう、
2ページ目以降でリセットボタンが効かない！
効かない！効かない！何回クリックしても効かない！テストしろよ！

# 改善策

## ページネーション用パラメータ消せばいいじゃん
まあそうなんですが、どうやって消そうか。
パスの最後の「/」より前が数値だったらそこ消そうか、is_numeric()使ったらいける。
いや、なんかそれはダサいぞ。

## で
URIのセグメントというものにたどり着く。（これがかっこいいかは不明）
僕が説明するよりHPを見た方がわかりやすいと思う。
[軽量PHPフレームワーク 'CodeIgniter' 徹底ガイド！：CI_URI](http://www.ci-guide.info/practical/core/uri/)

## こうなった

```php:reset_v_fix.php
<button type="button" onclick="location.href='<?= base_url() . ($this->uri->segment(3) ? str_replace($this->uri->slash_segment(3, 'leading'), '', uri_string()) : uri_string()) ?>'">reset</button>
```

第3セグメントが存在する場合はuri_string()から「/ ＋ 第3セグメント」を消す。

ええ。それだけです。
CentOS7でSSHのポート番号を変更する

### いつも忘れちゃうので備忘録
centos7構築する際の手順としてSSHをつぶしてそのほかのポート番号を空けたいときにみるやーつ。
ここでは22から2222に変更しています。適宜読み換えてください。

## 現在の状態を確認

`$ systemctl status firewalld`

`$ firewall-cmd --list-all`

```
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

```

## sshd_configの修正

`$ sudo vi /etc/ssh/sshd_config`

```diff:
- # Port 22
+ Port 2222
```

`$ sudo systemctl restart sshd`

## firewalldの設定からSSHを削除

`$ sudo firewall-cmd --permanent --remove-service=ssh`

## firewalldの設定にssh-2222を追加

既存のssh.xmlをcopyしてssh-2222.xmlを作成する

`$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-2222.xml`

ssh-222.xmlファイル内のポート番号を22から2222に変更する

`$ sudo vi /etc/firewalld/services/ssh-2222.xml`

```diff:
-  <port protocol="tcp" port="22"/>
+  <port protocol="tcp" port="2222"/>
```

`$ sudo firewall-cmd --permanent --add-service=ssh-2222`

## firewalldをリロード

`$ sudo firewall-cmd --reload`

## 変更後の状態を確認

`$ firewall-cmd --list-all`

```
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh-2222
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```

## http、httpsを追加する場合は以下のコマンド

`$ sudo firewall-cmd --permanent --add-service=http`

`$ sudo firewall-cmd --permanent --add-service=https`
Promiseの練習

Promiseのデバッグしてて、Promiseのチェーンがうまく動いてるか確かめたいだけなのになんでXHR発効してるんだろとか考えてたら、別にIOしなくても内部のモック的なものは同期関数でよいことに気づいたのがきっかけ。

# 直接スタイルの足し算関数

```js
function succ(a) {
    return a + 1;
}

console.log(succ(1));
```

# 継続渡しスタイルの足し算関数

```js
function succCPS(a, callback) {
    callback(a + 1);
}

succCPS(1, console.log);
```

# 1 + 1 + 1を求める

```js
succCPS(1, (a) => {
    succCPS(a, console.log);
});
```

# 1 + 1 + 1 + 1を求める

```js
succCPS(1, (a) => {
    succCPS(a, (b) => {
        succCPS(b, console.log);
    });
});
```

おめでとう、コールバック地獄へようこそ。

# Promiseの導入

```js
function succPromise(a) {
    return new Promise((resolve) => {
        resolve(a + 1);
    });
}

succPromise(1).then(console.log);
```

# 1 + 1 + 1 + 1再び

```js
succPromise(1).then(succPromise).then(succPromise).then(console.log);
```

コールバック地獄がメソッドチェーン地獄になった。やったぜ。(?)

# 体裁を整える (Promise.resolve)

```js
Promise.resolve(1).then(succPromise).then(succPromise).then(succPromise).then(console.log);
```

# 体裁を整える (reduceと組み合わせる直列処理)

```js
[1, 1, 1, 1].reduce((promise) => {
    return promise.then(succPromise);
}, Promise.resolve(0)).then(console.log);
```

- - -

* コールバックを受ける関数書くならPromiseを返すべき
* 本稿では簡単のため失敗する可能性のある関数を考えていない点に注意
* reduceの引数逆のほうがよくね
【チームで】開発チームでアジャイルを進めるためのプラクティスリスト【日々更新】

# はじめに
何か思いつく要素があれば、追記をお願いいたします:metal_tone1:

# チケット駆動開発やおっつけでの開発になっていることへのプラクティス
- [ ] １ヶ月単位でのリリース予定を作る
- [ ] ３ヶ月単位でのリリース予定を作る
- [ ] デイリースタンドアップミーティング
- [ ] スプリントレビュー・デモの実施
- [ ] プロダクトの方向性を決定するためのインセプションデッキの実施
- [ ] かんばん作成

# チームの生産性・ベンチマークが測れていないことへのプラクティス
- [ ] 見積もりの実施
- [ ] 相対見積もりの実施
- [ ] チームの生産性の計測（ベロシティ計測）
- [ ] リリース日の取り決め（週1？週2？）
- [ ] 割り込み作業に関する取り決め
- [ ] リリース単位での定期的な振り返り実施（隔週）

# プライオリティ・優先度がブレブレな開発チームのプラクティス
- [ ] 見積もりの実施
- [ ] プライオリティの定期的な見直し（スプリント計画時）
- [ ] プロダクトオーナーの決定
- [ ] ITSへの起票・一覧化
- [ ] ベネフィットを精緻化（POマター）

# ITSが四散していることへのプラクティス
- [ ] 開発チケットはredmineへ寄せる
- [ ] 開発チケットはJIRAへ寄せる
- [ ] 開発チケットはBacklogへ寄せる
- [ ] 開発チケットはTrelloへ寄せる
- [ ] 開発チケットはWaffleへ寄せる

# 作業の割り振りが個人単位になっていることへのプラクティス
- [ ] １ヶ月単位でのリリース予定を作る
- [ ] １スプリント単位でのチームの目標を作る

# その他
- [ ] アイスブレイクの実施
- [ ] 会議の進め方のルール決め
Jenkins Pipeline の１１個のベスト・プラクティス

# 1.公式のJenkins Pipeline Pluginを使用する

類似のもの（Build Pipeline plugin or Buildflow plugin）ではなく、公式のものを使用する。

* 公式のPipelline Pluginは日々改善している
* Jenkinsのマスターノードが再起動したとしても継続する機能を提供済みで、他のプラグインの機能を代替する機能を提供する予定。

# 2.Pipeline as Codeにする
JenkinsFileをバージョン管理システムに登録することで、他のソフトウェアと同様のバージョン管理とテストができる。
Pipelineスクリプトのデフォルト名はJenkinsFile。
IDE,GitHubにgroovyと認識され、コード補完、コードハイライトなどが効くように、スクリプトの始めに以下を追加する。

``` groovy
#!groovy 
```

# 3. 論理的なまとまりを１つのstageに定義する

もともとstageは論理的なまとまりに用いる。セットアップなどは１つのstageにはせず、論理的なまとまりで１つのstageを定義する。

```
stage 'build'
//build
stage 'test'
//test 
```

結果として、stageが可視化される。

<img width="626" alt="pipeline-vis.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/7c3d90bb-645a-505f-6302-4ccceffefef9.png">


# 4. 処理は１つのnodeブロックで囲う

* デフォルトでは、JenkinsFileスクリプトはリソースをあまり使わないマスターノードで動く。
* JavaのコンパイルなどはJenkinsの分散機能を使用して、slaveノードで行う。

```
stage 'build'
node{
    checkout scm
    sh 'mvn clean install'
} 
```

# 5. なるべくparallel処理を書く

* parallel処理はPipeline処理を早くする。
* 開発者、チームへ早いフィードバックができる。

```
parallel 'shifting':{
    //everything
}, 'left':{
    //I can
}
```

# 6. parallel処理にも必ずnodeを定義する
parallel処理は複数のnodeで処理を分散して行うために使うので、nodeを定義しなければならない。

``` 
parallel 'integration-tests':{
    node('mvn-3.3'){ ... }
}, 'functional-tests':{
    node('selenium'){ ... }
}
```

# 7. nodeブロック内でinputは使ってはいけない

* inputはダイアログが押されるまでPipeline処理を停止する。そのダイアログが選択されるまでは時間がかかる。
* slaveノードは高リソースを処理するためのノードであり、ダイアログで停止してしまうとリソースの無駄遣いになってしまう。

そのため、inputはnodeの外側に記述する。

```
stage 'deployment'
input 'Do you approve deployment?'
node{
    //deploy the things
}
```

# 8. inputはtimeoutでラップする

Pipelineにはタイムアウトを設定するtimeoutがあるので、inputはtimeoutでラップする。

* inputをtimeoutでラップすることで、ダイアログがずっと選択されない場合にも処理がクリーンアップされる

```
timeout(time:5, unit:'DAYS') {
    input message:'Approve deployment?', submitter: 'it-ops'
}
```

# 9. 環境変数をglobal variableに定義してはならない
環境変数をglobalに設定（ex. export AA=BB）するのではなく、withEnvを使用して環境変数を設定する。

* 環境変数をglobalに設定すると、他にも影響が発生する。

``` 
withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {
    sh "mvn clean verify"
}
```

# 10. stashをなるべく使う
stage間またはnode間でファイルをやり取りする場合はarchiveではなくstash/unstashを使う。

* stash/unstashはstage間、node間でファイルを共有するためのコマンド。
* archiveは長期保存のためのコマンド。
* ソースをやりとりする場合はstash/unstash。中間成果物のバイナリーを保存する場合はarchive。

```
stash excludes: 'target/', name: 'source'
unstash 'source'
```

# 11.  timestampsブロックを使いまくる

timestampsを使用すると、コンソールログに実施時間が表示される。
デフォルトでついていてほしい機能なので、timestampsブロックを多用する。

```
timestamps {
  // process
}
```


# 参考
https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugin