OmniAICreator/Qiita-1.07M huggingface dataset:
Python3 + venv + VSCode + macOS な開発環境の構築


#目的
表題のような開発環境を構築することと、その環境を移行しやすくする。


#環境
- macOS Sierra
- なんらかの方法でPython3.6インストール済み（`brew install python3`が一番簡単？）
- VSCodeの`code`コマンドをインストール済み

#要件
- Python3でしか開発しない
- VSCodeを使いたい
- VSCodeでIntelliSense、Linting、Formattingしてほしい
- `pip`でインストールしたパッケージ一覧を保存して、他の環境で再構築したい
- グローバルな`pip`でグローバルな環境を汚したくない

#ツール
という要件を満たすようなツールを作った。
https://gist.github.com/KoheiKanagu/b3ba2bb68d36509b6cee054e077bd415

```shell-session
$ python3 pset.py -h
usage: pset.py [-h] [--init] [-i] [-s] [-j] [-c]

This script deitals : http://qiita.com/KoheiKanagu/items/752c64aeeb154970d22e

optional arguments:
  -h, --help     show this help message and exit
  --init         Initialize Python virtual environment
  -i, --install  Install packages from "requirements.txt"
  -s, --sync     Sync packages using of pip-compile and pip-sync
  -c, --code     Open VSCode at virtual environment
```

##それぞれのargumentsの動き
###--initすると
- `python3 -m venv`を使って、 **.env** という名前の仮想環境を作る。 
- pip-toolsをインストールする
- **requirements.in**が無ければ作り、pip-toolsと書き込んでおく。

###--installすると
- installすると同ディレクトリに **requirements.txt** があれば `pip install -r requirements.txt`でパッケージ達をインストールする。

###--syncすると
- **requirements.in** をpip-compileして、pip-syncする

###--codeすると
- `source .env/bin/activate && code ./` して仮想環境を引き継いだVSCodeを起動する。

#備考
##Formatting
グローバルな環境に **autopep8** かなんかをインストールしておけば良い。 

後述するLintingのように、formatterは仮想環境の中にあるパッケージなどは見る必要がないので、グローバルにインストールしててもちゃんとFormattingしてくれる。

##Linting
例えば **pylint** を使うとなると、グローバルにインストールしておいても、仮想環境でインストールしたパッケージ達を見てくれないので、IntelliSenseできない。 

そこで、仮想環境に **pylint** をインストールすれば、仮想環境内でのパッケージ達を見てくれるので、IntelliSenseできる。

jupyterも同様に仮想環境にインストールしたものでないとパッケージ達を見つけられない

##VSCodeの状態
ツールを使うと、        
`source .env/bin/activate && code ./`という風にVSCodeを起動する。 

そのため、VSCodeの端末で `pip freeze` などをしてもらうと分かるが、VSCodeは仮想環境を引き継いでいる。 

そのため、プログラムを実行する場合にその端末から実行すると、仮想環境で実行される。 

また、[Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner) を使っても同じく仮想環境で実行することができる。

###エクスプローラーの表示
VSCodeの画面左のエクスプローラーに **.env** が出てくるため、その中身が検索に引っかかるし、中にあるhtmlとかcssなどのいろいろなファイルに対してLinterがブチギレるので、以下のように `files.exclude`に追記する。 

すると無視されてエクスプローラーには表示されないし、Linterも怒らなくなる。 

もちろん仮想環境的には問題ない

```json
"files.exclude": {
    "**/.git": true,
    "**/.svn": true,
    "**/.hg": true,
    "**/CVS": true,
    "**/.DS_Store": true,
    "**/.env/**": true
}
```


##パッケージのインストール
`source .env/bin/activate` してから`pip install`する。

ただし、pip-compileとpip-syncの利用を想定しているので、**requirements.in** に必要なパッケージを書いて、`python3 pset.py --sync` した方が楽

**requirements.in** に何も書いてない状態で--syncしてしまうと、pip-syncの機能によってインストール済みのパッケージが全部消えるので注意



##tips
###Python2.7への対応
**pyenv** などと連携すればできるとは思うが、個人的に2.7は必要ないので試してはいない。

###ディレクトリ名の変更時の注意
こんな `~/MyProject/.env/*` ディレクトリ名内で仮想環境を作った時、 `~/MyProject2/.env/*` という風に名前を変えてしまうと、 `source ~/MyProject2/.env/bin/activate` しても仮想環境に移行できなくなる。
 
その時は `.env` を一旦削除して再設定するといい
node fetch　の例

```js
 
/**
   * getJSON
   * httpを通じてurlからJSONを取得してくる処理
   * @params {String} url 取得対象のURL
   */
  Project.getJSON = function(url){
    let http = require('http');
    http.get(URL, (res) => {
      let body = '';
      res.setEncoding('utf8');
      res.on('data', (chunk) => { body += chunk; });
      res.on('end', (res) => {
        console.log(res);
        return res = JSON.parse(body);
      });
    }).on('error', (e) => {
      console.log(e.message);
    });
  }






  /**
   * getHTML
   * httpを通じてurlからhtmlを取得してくる処理
   * @params {String} url 取得対象のURL
   * @return body
   */
  Project.getHTML = function(url){
    fetch(url).then(function(res) {
    }).then(function(body) {
      return body;
    }).catch(function(err) {
      console.log(err);
    });
  }
```
PHPの設定ファイルの優先順位メモ

## 設定ファイルの優先順位

ふとした拍子に忘れてしまうのでメモしておく。

#### 優先順位

設定ファイルの優先順位は以下の通り。
右に行くほど後から読み込まれる（=左で設定した内容を上書きする）

`php.ini < httpd.conf < .htaccess < ini_set()`

この設定の内、、`php.ini`に書かれた内容は"Master Value"。
`httpd.conf`、`.htaccess`、`ini_set()`関数で設定される値は"Local Value"となる。

これらの設定はCLI上で`php -i`コマンド（Local Valueのみ）、もしくは`phpinfo()`をソースコードに記述して実行することで確認可能。


#### 設定ファイルの場所を探すコマンド早見表

|ファイル|探し方|備考|
|---|---|---|
|php.ini|$ php -i &#124; grep php.ini<br>を実行。|もしくは`phpinfo()`で確認可能|
|httpd.conf|3つの内いずれか<br>（ソースインストール等）：/usr/local/apache2/conf/<br>（CentOS等）：/etc/httpd/conf/<br>（MacOS等）：/etc/apache2/|$ps aux &#124; grep httpd<br>でプロセスを確認して3つ内どれか判断する。<br>[コチラを参照](http://qiita.com/nekogeruge_987/items/b43481ea46b809d3a2f1)|
|.htaccess|---|制御したいディレクトリにある|
|ini_set()|---|ソースコードにある|
assertを有効にする


#設定ディレクティブ

http://php.net/manual/ja/function.assert.php

```
1: コードを生成して実行する (開発モード)
0: コードを生成するが、実行時には読み飛ばす
-1: コードを生成しない (運用モード)
```

#iniファイルを探す

今回はVagrantを使ってるので、まずはVagrantの中のフォルダに移動。

```
php -i | grep ini
```

とすると、

```
Configuration File (php.ini) Path => /etc/php/7.1/cli
```

と出てくるので、まずは参照してみる。

```
vi /etc/php/7.1/cli/php.ini 
```

`/assert`でアサーテーションについて記述されているところを検索できる。
`n`で進める。

#編集して、ディレクティブを変える

```
sudo vi /etc/php/7.1/cli/php.ini 
```

で編集できるようにして、`1`にする。
`:x`で保存する。
Kotlinでクラスオブジェクトを参照する(Javaのクラス名.classの代わり)


こんにちはsekitakaです。

javaで`クラス名.class`をKotlinではどのように記述すればよいのか迷ったのでメモしておきます。

# staticに取得
以下のように`::class.java`を使うことで、クラスオブジェクトを使う事ができます。

```Kotlin
val jclass = String::class.java
val kclass = String::class.java.kotlin
println(jclass) // class java.lang.String
println(kclass) // class kotlin.String
```

# インスタンスから取得
@meeniex さん頂いたコメントを元に追記。
インスタンスからは以下のように参照できます。

```kotlin
val jclass = s.javaClass
val kclass = s.javaClass.kotlin 
println(jclass) // class java.lang.String
println(kclass) // class kotlin.String
```
awkメモ

オークと読むらしい.
sed や grep のようなテキスト処理ツールに演算機能を持たせた拡張ツール.
効率的にテキストファイルを処理でき、CSV や TSV 形式のファイルを簡易に処理できる.
while, if とか普通にプログラミングできる.
####```-F```
区切り文字を変更
#####```awk -F, '{print $1}'```
出力結果を「,」区切りにし、1列目を出力
####```NR```
行数を表す
####```ORS```
出力レコード区切り文字
#####```awk '{if(NR%100)ORS=",";else ORS="\n";print}'```
出力結果をカンマ区切り 100件毎に改行いれる

####```if```
#####```tail -f access.log | awk '{if($8 >= 400) {print $0}}'```
アクセスログから http ステータスコード 400 以上を出力する


####```qコマンド```
csv, tsv に対して、 sql を使えるコマンド
#####```cat test.csv | q -d , "select c1 from - "```
-d ・・・ 区切り文字指定
c1 ・・・ カラム指定 (この場合 1番目)
- ・・・ 標準入力されたもの. csv 等のファイル名入れてもいい
【rails】urlからサイトの情報を引き出す。【スクレイピング】

不特定多数のサイトから、情報を取得したい！
なんとなくそんな気分になることもあるかと思います。
今回はスクレイピングでhtml情報を取得し、欲しい要素を抽出するの二段階と考えてみます。

・HTML情報の取得 --  Mechanizeを利用して、スクレイピングできるようにする。
・欲しい要素の抽出　--　　headのmetaタグから情報を取得する。

head内は個人の趣味のページだとちゃんとmetaタグが記述されていないこともありますが、
SNSに取り上げられることを視野に入れたある程度規模の大きなサイトであればしっかりと記述してあります。
以下が参考です。↓

OGPとは
https://uideal.net/knowledge/glossary/ogp/

## Mechanizeを利用して、スクレイピングできるように。

まずはmechanizeというgemをインストールします。

gemfileに以下を記述

```ruby:gemfile
gem 'mechanize'
```
bundle updateして再起動しましょう。


mechanize(公式)
https://github.com/sparklemotion/mechanize

Rails スクレイピング手法 Mechanizeの使い方
http://qiita.com/shizuma/items/d04facaa732f606f00ff


## headのmetaタグから情報を取得する。

まずはmetaタグではないですがページタイトルから。これは簡単です。

```ruby:article_controller.rb
agent = Mechanize.new
page = agent.get(params[:article][:url])

title = page.title
#titleを取得
```
これで取得できます。簡単ですね。

次にサイトの概要ですが。これはmetaタグの中にあります。
metaタグなんて、普段触らないし、どう指定すればいいの？という方もいるかと思います。
中カッコ[]で指定します。

```ruby:article_controller.rb
agent = Mechanize.new
page = agent.get(params[:article][:url])

content = page.at('meta[property="og:description"]')
#metaタグのうち、property="og:description"のものを取得
```

ストロングパラメータ内でまとめて取得できますね。

```ruby:article_controller.rb
def create
  Article.create(article_params)
end


def article_params
  agent = Mechanize.new
  page = agent.get(params[:article][:url])
  content = page.at('meta[property="og:description"]')[:content]
  params.require(:article).permit(:url)params.require(:article).permit(:url).merge(title: page.title,text: content,source: site_name)
end
```

これでスクレイピングしたものを保存できます。用途に合わせて画像を取得してもいいかも知れません。その場合はいかが参考になるかと思います。

og:image 徹底解説、意味も設定画像スペックもこれでばっちり！2015年5月時点最新版
https://blog.sixapart.jp/2012-06/ogimage.html
つらいPresenterと、つらくないPresenter

## まえおき

MVPアーキテクチャとか、クリーンアーキテクチャとかで、Presenterというものが出てきます。
ビジネスロジックをごにょごにょした結果などをActivityやFragmentに映し出すためのインターフェース、みたいなやつです。

個人的に、Presenterというものが「なんかしっくりこないなー」と思ってるところを書いてみただけなんですが、みなさんどうやって設計してるんでしょう・・・

## つらいPresenter

Presenterそのものがつらいというよりは、ベースの設計思想がこういうパターンのやつ。

![b21cfbaa-a8cd-226e-dc56-9caf0d2a7fdf.png](https://qiita-image-store.s3.amazonaws.com/0/74571/438df768-e328-c129-a44e-10341227f188.png)

1. API通信を開始
2. プログレスを表示
3. API通信が終わったらプログレスを消す

みたいなのをActivityやFragmentが主導でやるようなやつ。

UseCase/Presenter/Repositoryがきれいに分かれていたとしても、RxJavaでコールバック地獄は回避したとしても、ベースの考えがこういうやつだと、ただただ状態管理が複雑化することが多いです。

```java
interface XXXPresenter {
  void showProgress();
  void hideProgress();
}
```

みたいなのが1つでもあれば、すでに、つらい設計パターンです。

## なにがつらいか？

`showProgress()` はActivityやFragmentでくるくる表示をすればいい、というのは軽率で、
実際にはActivityやFragmentは独自にAndroidフレームワークが規定するライフサイクルを持っています。

`showPregress()`が **onResume()〜onPause() の間に限って呼ばれるのか、ライフサイクルガン無視で呼ばれるのか**は、結局**ユースケースとかリポジトリとかを見てみないとわからない**・・・みたいなことになりがちです。

あとは、くるくるを出している間は、処理をブロッキングする必要があるのか、ブロッキングしなくていいのか。
ブロッキングする必要があるなら、

```java
interface XXXPresenter {
  void showProgress();
  void hideProgress();
  void enableEditor();
  void disableEditor();
}
```

のようにメソッドを足せばいい？それ、ActivityやFragmentでやりたいことが増えるたびに、Presenter増やしてやるの？
editorのオンオフはやるけど、前の画面に戻るのをブロックするの？しないの？

みたいな感じで、だんだんと状態が増えてわけがわからなくなる。

そもそも、PresenterってそんなにActivityやFragmentの事情を知ってるべきなんだっけ・・・？って考えにもなってきます。

　

## （比較的）つらくないPresenter

![3028f1c9-8f76-47c9-7a59-d4115b873431.png](https://qiita-image-store.s3.amazonaws.com/0/74571/8ed1b154-8cda-a2a3-b970-384df777652c.png)

一見、さっきよりもコンポーネントが増えて、複雑化してるじゃん、と思うかもしれないけど、ポイントはそこではありません。
**画面の状態遷移がなくなっている**というのが最大のポイントです。

Activity/Fragmentは、自分のライフサイクルを考慮して、状態モデルを `subscribe`/`unsubscribe`し、状態をそのまま画面に写像する、という考えです。

この場合、UseCase/Presenterは

```java
class XXXXUsecase {
  void postMessage(String body);

  void subscribeFetchingState();
  void unsubscribeFetchingState();
  void subscribeMessageList();
  void unsubscribeMessageList();
}

interface XXXXPresenter {
  presentFetchingState(int state);
  presentMessageList(List<Message> messages);
}
```

のようになるでしょう。

具体的に通信中に何をすべきか、はActivity/Fragmentにゆだねていて、くるくるを出すのも、UIをブロックするのもすべてActivity/Fragmentの自由です！

あと、UseCaseでsubscribeしてからunsubscribeするまでだけ、presentXXX() が呼ばれる、というルール付けがあることで、ライフサイクルの考慮もしやすくなります。

　

## おわりに

[android-architectures](https://github.com/googlesamples/android-architecture) のコード読んでも、実際に作ってみても、いまいちパッとしないところをなんとなく書いてみただけです・・・。ショボい記事ですんません。

皆さんどういう設計にしてるんでしょう、このあたり・・・
SVNコミット時、JenkinsでWildFlyに自動デプロイ

#SVNコミット時、ビルド、デプロイタスクを自動化したい
特に目新しい話ではありませんが、掲題の内容を実現する記事が見当たらなかったので、その方法をメモします。
実行環境には、Java、Maven、Jenkins、Subversion、WildFlyが適切にインストールされているものとします。

#環境
以下の環境で試しています。
CentOS 7.3
Java 1.8
WildFly 10.0.0.Final
Maven 3.3.9（WildFly Maven Plugin 1.1.0.Finalを使うには、Maven 3.1.1以上が必要です）
WildFly Maven Plugin 1.1.0.Final
Jenkins 2.46.3
Subversion  1.7.14

#WildFly Maven Pluginの導入
mavenからWildFlyへデプロイするために「WildFly Maven Plugin」を導入します。
以下は、pomの記述例です。

```xml:pom.xml
<build>
  <plugins>
    <plugin>
      <groupId>org.wildfly.plugins</groupId>
      <artifactId>wildfly-maven-plugin</artifactId>
      <version>1.1.0.Final</version>
      <configuration>
        <hostname>WildFlyが稼動しているサーバのホスト名</hostname>
        <port>WildFlyの管理コンソールのポート番号</port>
        <username>管理コンソールにログインするためのユーザ名</username>
        <password>管理コンソールにログインするためのパスワード</password>
      </configuration>
    </plugin>
  </plugins>
</build>
```
hostnameのデフォルトは「localhost」なので、同じサーバ上でJenkinsとWildfFlyを動作させている場合、指定する必要はないと思います。また、portのデフォルトは「9990」なので、こちらも変更していなければ指定は不要です。
Configの詳細は[ここ](https://docs.jboss.org/wildfly/plugins/maven/latest/deploy-mojo.html)で確認できます

#Jenkinsでジョブを作成
SVNコミット時に実行するジョブを作成します。
ジョブで行うことは、SVNからソースをチェックアウト、mavenでビルド、デプロイです。
以下は、ジョブの設定例です。

##ソースコード管理
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/7a398172-0417-d3ae-4495-5f1fc4dcb49b.jpeg)

##ビルド・トリガ
SVNからジョブを呼び出すために必要な認証トークンを設定します。
トークンは[Jenkins]>[ユーザ名]>[設定]>[APIトークン]から確認できます。
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/a2028487-fabc-f7e4-2dbc-6534323cd486.jpeg)

##ビルド
まず、「clean install」でビルドして、「wildfly:deploy」でデプロイしています。
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/83813/de7de6af-e79c-9eae-2e23-59aaeb4904a8.jpeg)

#SVNのフックスクリプトを作成
SVNコミット時に、上記のジョブを実行するために「post-commit」スクリプトを作成します。
作成したスクリプトに実行権限がないと、
post-commit hook failed (exit code 255) with no output.
みたいなエラーが出るのでご注意を。

```bash
$ cd [リポジトリのルートディレクトリ]/hooks/
$ vi post-commit

#!/bin/sh
api_token=TOKEN_NAME

curl https://[ビルドトリガで確認したURL]?token=$api_token

$ chmod 774 post-commit
```
#完了
以上で、SVNにコミットすると、JenkinsでビルドとWildFlyへのデプロイが自動的に行われるようになりました。
Ubuntuセットアップ（ネットワーク、ポート、Java）

個人的によくやるUbuntuのセットアップを備忘録的にまとめています。

## 前提条件
+ ホストOS : macOS Sierra
+ ゲストOS : Ubuntu 16.04 LTS
+ VirtualBox上に構築


## やりたいことリスト
+ ネットワーク設定（ホストからssh接続できるように）
+ Javaインストール
+ ポート開放



## ネットワーク設定


1.SSHサーバのインストール

 ```
sudo apt-get install openssh-server
```

2.Host Only Networkの作成
VirtualBoxのツールバーからVirtualBox VM->環境設定->ネットワーク->ホストオンリーネットワークに移動します。
右側にある3つのアイコンの一番上（アダプタの追加）をクリックしてネットワークを追加します。

![VirtualBox1.jpg](https://qiita-image-store.s3.amazonaws.com/0/121758/8e404824-e3b9-8386-68c4-e90692ae2584.jpeg)



3.仮想マシンのネットワーク
同じくVirtualBoxで使用する仮想マシンから設定->ネットワーク->アダプタ-2に移動します。
割り当てでホストオンリーアダプタを選択し、先程作成したネットワークを選択します。
（高度を展開し、MACアドレスも確認しておきます）

![Virtualbox3.jpg](https://qiita-image-store.s3.amazonaws.com/0/121758/78de6cc3-4aa6-693b-e8f3-1fac0a510113.jpeg)


4.ゲストOS側でのネットワーク設定
VirtualBox上でゲストOSにアクセスし、右上のホイールアイコンからシステム設定->ネットワークに移動します。
ハードウェアアドレスがホストオンリーアダプタで設定したMACアドレスと同じ設定項目を選択し、オプションをクリックします。

![VirtualBox4.jpg](https://qiita-image-store.s3.amazonaws.com/0/121758/8d32090d-e60f-e299-21fe-8761451ad183.jpeg)

IPv4設定タブに移動し、方式を手動に変更し、手動でIPアドレスを設定します。
（細かい設定は要件次第で適宜変更してください）

![VirtualBox5.jpg](https://qiita-image-store.s3.amazonaws.com/0/121758/b2c293f4-de67-127c-b9a3-168eaae6d7b9.jpeg)


ここまで設定できれば、ホストOSからログインができます。
（Macのターミナルからであれば以下のコマンドでログインが可能です。）


```
ssh <ユーザ名>@<IPアドレス>
```
 

## Java(Oracle)インストール

デフォルトでUbuntu用のOracle Javaは用意されていないので、PPA経由でインストールします。

1.PPAリポジトリの追加

```
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
```

2.Javaインストール

```
sudo apt-get install oracle-java8-installer
```

特に説明はありません。

## ポート開放

Ubuntuではポート開放用にufw（uncomplicated firewall）というのがあるので、
こちらをインストールし設定します。

1.ufwのインストール

```
sudo apt-get install ufw
```

2.ufwの設定を許可（起動）

```
sudo ufw enable
```

3.デフォルトですべてのポートを閉鎖

```
sudo ufw default DENY
```

4.必要なポートのみ開放（例ではSSH:22番、HTTP:80番を開放）

```
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
```



## 参考文献
参考文献、、、というよりほぼ丸パクリみたいな感じですが、とても参考になった記事をあげておきます。
[VirtualBox上のUbuntuにSSHで接続するための設定](http://smys0515.hatenablog.com/entry/2016/02/29/080000)
[apt-getでJavaをインストールしよう (Ubuntu)](apt-getでJavaをインストールしよう (Ubuntu))
[ufwを使って簡単にファイアウォールを設定する](http://qiita.com/yoh-nak/items/46935af3c5c4036e93b3)
screen

### screen
接続が切れても消えないため、リモート操作する際に中断されたら困る処理をする際に使用.
また複数のプロセスを共有可能.
Ctrl + a は行頭移動で割り当てられていて使用頻度高いため、 a → t の設定になってます

####```screen -ls```
セッション一覧表示

####```screen -S 名前```
セッション名をつけて起動

####```screen -d 名前または -ls で表示された pid```
指定したセッションを抜ける ( 実行中の処理は消えない )

####```screen -r 名前または -ls で表示された pid```
指定した名前を使用

####```Ctrl + t```
スクリーン移動

####```Ctrl + t → S```
画面分割

####```Ctrl + t → tab```
画面移動

####```Ctrl + t → ESC```
画面内移動
Rails5でuft8mb4対応

いい感じにまとまってるページがなかったのでまとめておきます。

## Mysql(MariaDB）の対応

```
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
```

## Railsの対応

* `config/initialize`に追加

```ruby
# config/initializers/ar_innodb_row_format.rb

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    module CreateTableWithInnodbRowFormat
      def create_table(table_name, options = {})
        table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
        super(table_name, table_options) do |td|
          yield td if block_given?
        end
      end
    end

    class AbstractMysqlAdapter
      prepend CreateTableWithInnodbRowFormat
    end
  end
end
```

* database.ymlを修正

```yaml
# config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
```
一時的に現在の pane を全画面表示する

重複: [tmuxのペインを最大化する - Qiita](http://qiita.com/k2nakamura/items/d011472c63025ef6c32e) で既に書かれてた。

---

tmux で window を複数の pane に分割して作業をしていて、ふとした拍子に「あーこの pane をもっと大きく表示して〜」と思うことがある。 そういう時は `<prefix> z` を使うと良い。これを実行すると一時的に現在の pane が全画面表示になる。もう一度 `<prefix> z` を押せばもとに戻る。（z は zoom の z を意図しているっぽい）

ただしこれはデフォルトの設定にすぎないので、もしかすると設定が消えているかも知れない。その場合は .tmux.conf に

```bash
bind -T prefix t resize-pane -Z
```

を追加するか（この場合 `<prefix> t` に割り当てられる）、tmux のコマンドプロンプトで `resize-pane -Z` と入力すればいい。
VBAでCSV取込

# 外部データの取り込み機能
一行ずつカンマの数を数えるなんてめんどくさいのでエクセルの機能を使う。（超速い）
おせっかい（自動変換）を防ぐために全ての列を文字列として取り込む。
1行目にタブが含まれていればタブ区切り、タブが無ければカンマ区切りで取り込む。
※カンマ区切り、タブ区切りの判定はそれぞれの環境に合わせてください
データ取込後にデータ接続を解除する。

```vb:import_csv
'FileName  Variant 取り込みファイル名
'SheetName String  貼り付け先シート名
Sub import_csv(FileName as Variant, SheetName As String)
On Error GoTo ErrorHandler
    Application.ScreenUpdating = False

    Dim csvsheet As Worksheet   '貼り付け先のシート
    Dim sample As String        'サンプル行
    
    '取込ファイルの1行目をsampleに格納
    Open FileName For Input As #1
    Line Input #1, sample
    Close #1
    
    'すべての列を文字列で取り込むために長さ255の配列を用意する（Excelの最大列数が255）
    Dim v(255) As Long
    Dim i As Long
    For i = 0 To 255
        v(i) = 2  'xlTextFormat
    Next

    'シートを空にする
    Set csvsheet = ThisWorkbook.Sheets(SheetName)
    csvsheet.Cells.Clear
    
    'データ取込
    With csvsheet.QueryTables.Add(Connection:="text;" & FileName, Destination:=csvsheet.Range("A1"))
        'サンプル行にタブが含まれている場合はタブ区切り、それ以外はカンマ区切りで取り込む
        If InStr(sample, vbTab) > 0 Then
            .TextFileTabDelimiter = True
        Else
            .TextFileCommaDelimiter = True
        End If
        '全ての列を文字列で取り込む
        .TextFileColumnDataTypes = Array(v)
        '文字コードを指定（Shift-JIS）
        .TextFilePlatform = 932
        '取込を実行
        .Refresh
        'データ接続の情報削除
        .Parent.Names(.Name).Delete
        .Delete
    End With

    MsgBox "CSV取り込みが完了しました。" , vbOKOnly
GoTo Finally:
ErrorHandler:
   MsgBox "エラーが発生しました" & vbCrLf & Err.Description & "(" & Err.Number & ")", vbExclamation
Finally:
    Application.ScreenUpdating = True
End Sub
```
Visual Studio / WPF > IDE > Error: 'Greeting'はインターフェイスメンバー 'INotifyPropertyChange.ProPertyChanged'を実装しません。> マウスクリックでの対処

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

http://gushwell.ldblog.jp/archives/52301656.html
を参考に学習中。

## エラー

### code 

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//
using System.ComponentModel;

namespace _170605_t1120_singleBinding
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class Greeing : INotifyPropertyChanged
    {
        private bool _isFriendly;
        public bool IsFriendly
        {
            get { return _isFriendly; }
            set {
                if (value != this._isFriendly)
                {
                    this._isFriendly = value;
                    NotifyPropertyChanged("IsFriendly");
                }
            }
        }

        public event PropertyChangedEventHandler hndlr;

        private void NotifyPropertyChanged(string info)
        {
            if (hndlr != null)
            {
                hndlr(this, new PropertyChangedEventArgs(info));
            }
        }
        public void Greet()
        {
            NotifyPropertyChanged("Message");
        }
    }
}
```

### エラーメッセージ

> 'Greeting'はインターフェイスメンバー 'INotifyPropertyChange.ProPertyChanged'を実装しません。

## 対処

赤波線のところにマウスカーソルを持っていく。

![2017-06-05_11h28_40.png](https://qiita-image-store.s3.amazonaws.com/0/32870/fcdfbd70-3697-acf7-92d0-7fe0ad821b17.png)

> 考えられる修正内容を表示する (Alt+EnterまたはCtrl*.)

という記載をクリックしてみると以下が表示される。

![2017-06-05_11h30_28.png](https://qiita-image-store.s3.amazonaws.com/0/32870/13dcf24f-ea09-362b-50a1-114fa219b5ce.png)

次に「インターフェイスを実装します。」を選択すると以下の行が追加された。

```
        public event PropertyChangedEventHandler PropertyChanged;
```

`PropertyChanged`という名前でなく、自分で勝手に決めたhndlrという命名が間違いだった。

```txt:間違い
        public event PropertyChangedEventHandler hndlr;
```

IDEのこの便利な機能はどこまで使っていいものかは要検討。
Raspberry Pi 3でBitbucketに公開鍵を登録する


# 1. 概要

Raspberry Pi 3でBitbucketに上げたプログラムをcloneしようとするとエラーがでたので公開鍵を登録したときのメモ。Raspberry Pi 3に限定される訳ではないと思いますが。自分向けのメモとして。

# 2. 用意するもの
* Raspberry Pi 3

# 3. 参考サイト

* [Set up SSH for Git - Atlassian Documentation](https://confluence.atlassian.com/bitbucket/set-up-ssh-for-git-728138079.html)
* [bitbucket のプライベートリポジトリを clone しようとしたら &quot;Permission denied&quot; って怒られる - sseze&#39;s blog](http://sseze.hatenablog.com/entry/2013/01/03/155711)
* [Bitbucketでssh接続してpushするまで | kazsoga blog](http://kazsoga.com/bitbucket-ssh-push-aws/)

# 4. 手順

登録せずに`git clone git@bitbucket.org:...`しようとすると以下のエラーが出ます。

```
Warning: Permanently added 'bitbucket.org,104.192.143.2' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

```

そこで公開鍵を登録します。

## 4.1 公開鍵の生成

Raspberry Piのターミナルで以下のように打ち込みます。
```
cd .ssh/
ssh-keygen -t rsa
```

以下のような質問に答えると生成されます。
`Enter file in which to save the key (/home/pi/.ssh/id_rsa):`
`Enter passphrase ( empty for no passphrase):`
`Enter same passphrase again:`

## 4.2 公開鍵の登録

`cat ~/.ssh/id_rsa.pub`で表示されます。

Raspberry PiのブラウザでBitbucketにログインし、左下のアイコンのbitbucket settingsからSSH鍵というメニューに入り、「鍵を追加」を押します。


![miyano-yuji___ssh_鍵_—_Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/94069/eb93993b-ab05-1f14-3a47-2342fd4d38a6.png "miyano-yuji___ssh_鍵_—_Bitbucket.png")

![miyano-yuji___アカウント設定_—_Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/94069/51fa2580-847a-9450-cd58-225b1de51fc2.png "miyano-yuji___アカウント設定_—_Bitbucket.png")


![miyano-yuji___ssh_鍵_—_Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/94069/1bdf9d00-4beb-0ba9-4f65-71417fdee105.png "miyano-yuji___ssh_鍵_—_Bitbucket.png")

先程ターミナル上に表示されたキーをコピーして貼り付けます。Labelのところは分かりやすい名前をつければいいと思います。今回は「Raspberry Pi 3」にしました。

![miyano-yuji___ssh_鍵_—_Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/94069/c8c19818-ba8a-7a74-e636-ac6ab0a32b0b.png "miyano-yuji___ssh_鍵_—_Bitbucket.png")

これで再度`git clone`できるかを確かめます。
入力配列をシャッフルした配列を返す関数

自分用メモ

入力配列をシャッフルした配列を返す関数

```javascript
function shuffle(ary) {
  var newAry = [];

  while(ary.length > 0) {
    var i = Math.floor(Math.random() * ary.length)
    var v = ary.splice(i, 1)[0];
    newAry.push(v);
  }
  return newAry;
}
```

---
追記

[__hage](http://qiita.com/__hage)さんより、Arrayの`sort`を使った方がより簡潔に書けるとのコメントをいただきました。

```javascript
ary.sort(function(a,b){return Math.random()-0.5})
```

確かに簡潔

---
追記2
[iMasanari](http://qiita.com/iMasanari)さんより、sortの使い方によって偏りが出てしまうそうです。
以下の方法なら均一に混ざるとのことでした。

```javascript
const shuffle = (arr) =>
  arr.map((value) => ({ value, random: Math.random() }))
    .sort((a, b) => a.random - b.random)
    .map(({ value }) => value)
```
Dockehubにて、mssql-server-linux-with-mssql-tools公開しました


## はじめに
[SQL Server on Linux](https://hub.docker.com/r/microsoft/mssql-server-linux/)に、クライアントツールが入って ~~いない~~ いなかった(*)ので、インストールしたイメージを作成して、Dockehubにて公開しました。

[imunew/mssql-server-linux-with-mssql-tools](https://github.com/imunew/mssql-server-linux-with-mssql-tools)

※ 2017/5/17に同梱されるようになったようです。
https://github.com/Microsoft/mssql-docker/tree/master/linux/preview#connect-to-microsoft-sql-server

## 使用上の注意
### Dockerマシンのメモリは、3.25GB以上に設定
`SQL Server on Linux`が3.25GB以上メモリを使用するので、あらかじめメモリを3.25GB以上に設定しておきます。
`Docker for Mac`の場合は、下記のリンクを参考に設定してください。

- https://docs.docker.com/docker-for-mac/#advanced

### 環境変数の設定
`End-User Licensing Agreement`への同意と、saのパスワードを環境変数にて設定する必要があります。

- `ACCEPT_EULA=Y`
- `SA_PASSWORD=<YourStrong!Passw0rd>`

## 使い方
基本的な使い方は、`SQL Server on Linux`と同じですし、[README](https://github.com/imunew/mssql-server-linux-with-mssql-tools/blob/master/README.md)見てもらえれば、すぐ使えるかと思います。
何か困ったことがあったら、issuesやpull-requestいただければ幸いです。

## 類似のDockerイメージ
後から気付いたのですが、すでに、`mssql-tools`をインストールした、`SQL Server on Linux`のイメージが複数ありましたので、いくつかピックアップしておきます。

- [datagrip/mssql-server-linux](https://hub.docker.com/r/datagrip/mssql-server-linux/)
- [militellovinx/mssql-server-linux](https://hub.docker.com/r/militellovinx/mssql-server-linux/)

## 参考URL
- [Run SQL Server 2017 on Docker](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-docker)
- [Install SQL Server command-line tools on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools)

## おわりに
プロジェクトごとに、毎回同じようなDockerfile書くなーと思ったら、Dockehubにて公開すると便利なので試してみてください。
ではでは。
Avoid warning of 'brew doctor' with fish & pyenv

## tl;dr
Just add following function to `~/.config/fish/config.fish`

```
function brew
    set -xl PATH $PATH # Protect global PATH by local PATH
    if type -q pyenv; and contains (pyenv root)/shims $PATH
        set -e PATH[(contains -i (pyenv root)/shims $PATH)]
    end

    command brew $argv
end
```

## 説明
pyenvをインストールした後、`brew doctor`を実行すると警告が出るようになります。詳しくは[pyenvのリポジトリのissue](https://github.com/pyenv/pyenv/issues/106)を参考のこと。

当該issueによれば、解決方法の一つとして、`.bashrc`に

```
alias brew="env PATH=${PATH//$(pyenv root)\/shims:/} brew"
```

と書くなどがあります。が、これはあくまでbashでの話。シェルにfishを使うとそうもいきません。

そこで最初に書いた通り、`brew`コマンドを上書きするfunctionをfishの設定ファイルに定義することでとりあえず解決しました。

もし他にもっと良い方法があればコメントしてくださると助かります。
model.rbで複数のカラムに対して同じvalidationを適用する

何回も`validates hoge, presence: true`って書くのだるいし、DRYに反してますよねー。

そこで、配列とeachでまとめてしまいます。

```model.rb
[:name, :email,...,:address].each do |v|
    validates v, presence: true
end
```

..みたいな記事を書きたかったのですが、これでいいんですかね？ググっても複数のカラムのユニーク制限..みたいな話しかなく。

あまりにも当たり前過ぎて誰も書いてないんですよね...?過去の自分のために書いておきます。

## 2017/06/06追記：with_optionsを使う

コメント頂きました。`with_options`というのがあるようです！

```rb
with_options presence: true do
  validates :name
  validates :email
  validates :address
end
```
**参考**
http://api.rubyonrails.org/?q=with_options
HerokuアプリのSlug Sizeを簡単に減らす方法

Herokuで作成したアプリには、Slug Sizeというものがあります。

Slug SizeはブラウザからHerokuにログイン後、アプリ名をクリック→Settingsをクリック→Infoからわかります。

Slug Sizeが大きいと、

- アプリの起動が遅くなる
- 500MB制限に引っかかる

といったデメリットがあります。

そんなSlug Sizeを簡単に減らす方法があります。

まず、heroku-repoというプラグインをインストールします。

``` 
heroku plugins:install heroku-repo 
```

次に以下の2つのコマンドを入力します。
your-app-nameには自分のアプリ名を入力します。

``` 
heroku repo:gc --app your-app-name
heroku repo:purge_cache --app your-app-name 
```

そして、

``` 
git push heroku 
```
をした後にSlug Sizeを見るとサイズが減っています。

僕はこれで、109MBあったアプリのSlug Sizeを58MBにまで減らすことができました。
アプリの起動も若干速くなったような気がします。

ぜひ試してみてください。

参考：
https://robots.thoughtbot.com/how-to-reduce-a-large-heroku-compiled-slug-size
Kotlin+Dagger2+RxJava2+CleanArchitectureのメモ

# はじめに
Kotlin初心者がKotlin+Dagger2+RxJava2+CleanArchitectureで開発するときのTips。
といっても、「Javaだとこう書いてたけどKotlinだとどうなるの？」という部分がほとんど。
Kotlinの文法が解ってれば不要な内容でもあるのでほぼ自分用のメモ

*追記する可能性がないこともない*

# `@Component`で複数のModuleを指定する書き方
`{}`のところは`arrayOf(~)`になる
`XXX.class`は`XXX::class`になる


```java:RootComponent.java
@Singleton
@Component(modules = {ApplicationModules.class, RepositoryModules.class } )
public interface RootComponent {
    Context getContext();
}
```

```kotlin:RootComponent.kt
@Singleton
@Component(modules = arrayOf(ApplicationModule::class, RepositoryModules::class))
interface RootComponent {
    val context: Context
}
```

# コンストラクタでの`@Inject`の書き方
プライマリコンストラクタで指定する
その時には、`constructor`の記載が必要

```java:SomeRepository.java

public class SomeRepository implements SomeDataSource {
    final Context mContext;

    @Inject
    public SomeRepository(Context context) {mContext = context;}

}
```

```kotlin:SomeRepository.kt
class SomeRepository @Inject constructor(val context:Context): SomeDataSource {
}
```

# RxJavaのZip系で出て来るFunctionあたりの書き方
BiFunctionになる。
型推論してくれるかなぁと思ったけどしてくれなかった（ひょっとしたら書き方があるかもしれないけど)

```java:SomeClass.java(retroRambda使用)

Observable<Pair<String,int>> someMethod(String data1, int data2) {
   return Observable.zip(Observable.just(data1), Observable.just(data2), (e1, e2) -> new Pair(e1, e2));
}
```

```kotlin:SomeClass.kt
fun someMethod(val data1:String, val data2:Int): Observable<Pair<String,int>> {
   return Observable.zip(Observable.just(data1), Observable.just(data2), BiFunction<String, Int, Pair<String, Int>> {e1, e2 -> Pair(e1, e2)})
}
```
Railsでformから送ったパラメータをenum用にint型に変換する

## enum型は便利だけどフォームには不便
データベースでは整数型で保存してくれるけど、普段は文字列みたいに扱えるenum型。これをフォームで利用しようとしたんだけど、"2"は整数じゃないです、みたいなエラーでできなかった（当たり前）

パラメータを送るときのオプションで整数型に変換できないのかな〜、とか思ったけどどうやらなさ気だったんで、コントローラー側で変換することに。

## 整数に変換したいのは整数にできるやつだけ

フォームから何かを送信する時に普通にstring型のままでいいのも一緒に送信することもあると思うので、整数できるものだけを変換します。

当たり前ですが、全部の値をいきなり、`to_i`したらエラーになるので。そもそも整数にできるか調べます。

```rb
def integer_string?(str)
   Integer(str)
   true
 rescue ArgumentError
   false
end
```
http://taro-tnk.hatenablog.com/entry/2012/12/17/001552
こちらのブログを参考にさせてもらいました。

そんでもって然るべきコントローラーのprivate部分にこんなのを用意します。

```xxx_controller.rb
def params_int(model_params)
    model_params.each do |key,value|
      if integer_string?(value)
        model_params[key]=value.to_i
      end
    end
end
```

これで`@model.update(params_int(model_params))`みたいに使えば、無事int型になります。

## その他注意

関係ないですが当時、気が狂っていたのか、カラムをstring型に指定していたため、何回やり直してもnilのままで値を入れることができませんでした。integerに指定しておきましょう。
Gentooとpipの微妙な関係


他パッケージ上で導入されたpip等のパッケージ管理ツールをrootで操作するのはあまりオススメされない。
例えばGentoo上でのpip。
Gentoo Wiki上でも次のように書かれている。

https://wiki.gentoo.org/wiki/Pip

> Warning
>Running pip as root is not advised. It can render important system tools like emerge useless.

「rootでpipを操作するのは推奨されない。emergeのような重要なシステムツールを役に立たなくする可能性がある」

それを忘れてうっかり `pip install --upgrade pip` した結果がこれだよ！

```shell-session
 # emerge -uDNp @world
 
 <snip>
 
 * This package will overwrite one or more files that may belong to other
 * packages (see list below). You can use a command such as `portageq
 * owners / <filename>` to identify the installed package that owns a
 * file. If portageq reports that only one package owns a file then do
 * NOT file a bug report. A bug report is only useful if it identifies at
 * least two or more packages that are known to install the same file(s).
 * If a collision occurs and you can not explain where the file came from
 * then you should simply ignore the collision since there is not enough
 * information to determine if a real problem exists. Please do NOT file
 * a bug report at https://bugs.gentoo.org/ unless you report exactly
 * which two packages install the same file(s). See
 * https://wiki.gentoo.org/wiki/Knowledge_Base:Blockers for tips on how
 * to solve the problem. And once again, please do NOT file a bug report
 * unless you have completely understood the above message.
```

virtualenvは良い文明。噛み締めつつ再構築しよう。
久々にCoreOSを触ったらハマった点

* [CoreOS用cloud-config.ymlメモ2 - Qiita](http://qiita.com/tukiyo3/items/615afb0509bf76f4f277)

## dockerが自動起動しなかった

* [Docker daemon doesn't start on boot on CoreOS - Server Fault](https://serverfault.com/questions/743087/docker-daemon-doesnt-start-on-boot-on-coreos)

```
sudo systemctl enable docker
```

## 手動でcloud-config.ymlを変更したい場合

```bash:
# 書式チェック
coreos-cloudinit -validate=true -from-file=./cloud-config.yml
# 再起動せずに反映
coreos-cloudinit --from-file ./cloud-config.yml
# 再起動後も有効
sudo cp cloud-config.yml /var/lib/coreos-install/user_data
reboot
```

## lsの文字化け対応

```yaml
write_files:
  - path: /etc/environment
    permissions: 0755
    content: |
        LANG=C.utf8
        LC_CTYPE=C.utf8
        LC_ALL=C.utf8
```

* LC_CTYPE : lsのエンコード


## DHCP無効

```rb:clod-config.yml
coreos:
  units:

    - name: systemd-networkd.service
      command: restart

write_files:
  - path: /etc/systemd/network/10-static.network
    permissions: 0644
    content: |
      [Match]
      Name=eth0
      [Network]
      DHCP=none
      Address=172.16.2.2/24
      Gateway=172.16.2.1
      DNS=8.8.8.8
      DNS=8.8.4.4
```


## タイムゾーン

```rb:clod-config.yml
coreos:
  units:

    - name: timezone.service
      command: start
      content: |
        [Unit]
        Description=timezone
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
```
C++ における class と struct の違い

[ブログ記事](http://secret-garden.hatenablog.com/entry/2015/12/11/000000)からの転載です。

この記事は[初心者 C++er Advent Calendar 2015](http://www.adventar.org/calendars/922)の11日目の記事になります。  
今日はクリスマス・イブ！！ってことで、せっかくなので穴が空いていた11日目の記事を書きました。  
<del>クリスマスとか早く爆発してほしい</del>  
<br>  
さて、C言語にデータ構造を定義するための `struct` という機能がありました。  
C++ では更にクラスを定義するための `class` という機能が新たに加わりました。

## struct とは

C 言語ではデータ構造を定義するための機能です。  
例えば、次のように独自データを定義することができます。

```cpp
struct person{
	int id;
	int age;
	char name[20];
};

person homu = { 0, 14, "homu" };
```

※C言語の場合は `typedef` する必要があるが、今回は C++ の例題なので省略。

## class とは

`class` とは簡単に言うと『`struct`に関数が定義できるようになった』ようなものです。  

```cpp
class person{
	// アクセシビリティ
	// public 以下は全部公開される
public:
	int id;
	int age;
	std::string name;

	// 情報を出力する関数
	void
	print(){
		std::cout << "id:"   << id << std::endl;
		std::cout << "age:"  << age << std::endl;
		std::cout << "name:" << name << std::endl;
	}
};

person homu = { 0, 14, "homu" };
homu.print();
//  * [output]
//
// id:0
// age:14
// name:homu

```

このように `class` は自身に対して関数を定義して、自身の変数を参照したりできます。  
また、他にもオブジェクト指向でいう継承や多態性などと言った機能もあります。

## C++ における struct

ここまでの説明で、  
「ほーなるほどねー `class` って変数だけじゃなくて関数を定義できるのが `struct` と違うんだー」  
と、思ったかも知れませんが、実は C++ では `class` だけではなくて `struct` でも関数を定義することができます。

```cpp
// class ではなくて struct
struct person{
	int id;
	int age;
	std::string name;

	// 情報を出力する関数
	void
	print(){
		std::cout << "id:"   << id << std::endl;
		std::cout << "age:"  << age << std::endl;
		std::cout << "name:" << name << std::endl;
	}
};

person homu = { 0, 14, "homu" };
homu.print();
//  * [output]
//
// id:0
// age:14
// name:homu
```

ほぼ一緒ですね。

## C++ における class と struct の違い

「じゃあ結局 `class` と `struct` って何が違うの？」  
というのですが、これは

* `class` はデフォルトのアクセシビリティが `private`
* `struct` はデフォルトのアクセシビリティが `public`

という違いになります。  
例えば以下の2つの定義は同等になります。

```cpp
struct X{
	// デフォルトのアクセシビリティは public
	int get_value();
private:
	int value;
};

class X{
	// デフォルトのアクセシビリティは private
	int value;
public:
	int get_value();
};
```

このように `struct` では `public` がデフォルト、`class` では `private` デフォルト、という形になります。  
また、スコープ内での定義以外でも継承するクラスのアクセシビリティも同じです。

```cpp
struct X : /* デフォルトでは public 継承 */ Base{
	
};

class X : /* デフォルトでは private 継承 */ Base{
	
};
```

逆に言ってしまえば、C++ で `class` と `struct` はデフォルトのアクセシビリティ以外の違いはありません。  
以上が『C++ における class と struct の違い』になります。


## おまけ

`class` と `struct` が機能的にはほぼ一緒と言うことはわかったと思いますが、どう使い分ければいいのかはいまいちよくわからないと思います。  
これに関しては人それぞれ（クラスっぽいものは `class` にしたり、データ構造は `struct` にしたりect...）だと思いますが、わたしは、

* 上部に `public` を定義
* 下部に `private` を定義

するという理由から `class` ではなくて `struct` のみを使用しています。  
具体的には以下のような感じです。

```cpp
struct X{
	// 公開するメンバ関数
	int get_value();
private:
	// 非公開なメンバ変数
	int value;
};

// class を使う場合は、以下のように無駄に public をつける必要がある
// class X{
// public:				// class の場合は上部に public をつける必要がある
// 	int get_value();
// private:
// 	int value;
// };
```

こんな感じです。  
まぁあとはメタプログラミングをやっているとどうしても継承する機会が多くなって、継承するたびにいちいち `public` をつけるのがめんどくさいので `struct` を使ってるというのもありますが。  
このあたりは自分のスタイルに合わせて決めているとよいと思います。
SSH接続でNo route to host


ssh で接続時に　No route to host といわれた。

```
~ $ ssh -P 2234 fuga@hoge.jp
ssh: connect to host 2234 port 22: No route to host
```


単に、ポートを指定するパラーメータが、大文字になっていた。
それだけ。
誤）```
~ $ ssh -P 2222 fuga@hoge.jp
```


正）```
~ $ ssh -p 2222 fuga@hoge.jp
```

異常に恥ずかしい。
9. FUJITSU K5 に Rancher を導入

このページは、
FUJITSU Cloud サービス K5 を使ってみる - Qiita
http://qiita.com/ynott/items/a256669c692625c5fd25
の「9. FUJITSU K5 に Rancher を導入」のページです。

ownCloud/Nextcloud を動かして、と思っていましたが、Rancherを動かして、その上でNextcloudを動かせばいいじゃん。
ということに思い至った(遅いわ！)ので、まず、Rancherを動かしてみます。

#1. Rancherを動かす
Rancher を動かすのに必要なサーバーは、以下の2種類です。
・Rancher Server(以下、Server)
・Rancher Host(以下、Host)
Serverは、基本的に1台です(冗長構成も可能)が、Hostは複数立てられます。
ひとまず両方とも1台づつ立てます。

ServerはWebGUI接続で操作するので(CLIコマンドもありますが)、httpポートを空けておきます。
＃K5には、Loadbalancerもあるのでhttps に対応するのも簡単ですね。

Serverは面倒なのでGlobalIPのついている踏み台サーバーで動かします。
HostはKernelが古いといろいろあるので、Ubuntuイメージを選択します。
＃Kernelが3.10のCentOS-7は基本的に使いたくありません。

CentOS --> Server
Ubuntu --> Host

しかし、ここで問題発生、K5には、Ubuntuのイメージは以下のものしかありません。

* Ubuntu 14.04 LTS

なんと、14.04 LTS までしかない。
＃というか、今どき Ubuntu 16.04 LTS イメージぐらい入れてほしい。

仕方がありません、Ubuntu 14.04 LTS をブートして、do-release-upgrade で 16.04 LTSにしました。
注：16.04 LTSは、ちゃんと動いています。

# 2. K5での DHCP設定 について(横道)
仮想ネットワークで、DHCP設定時にDNS設定しなかったので、bootするときにDHCPでIPアドレスが配られますが、DNSが/etc/resolv.conf に入りません。。後から設定を変更することもできません...。
(某なかの人から、「APIで仮想ネットワーク作れば設定できるかも」とコメントがありました。なるほど。)

手動で/etc/resolv.conf を書き換えてたりしましたが、あまりにもバカバカしい(仮想ネットワークを作り直しもアレだし)したので、dhclient に設定を追加しました。

```
# cat /etc/dhcp/dhclient.conf 

timeout 300;
retry 60;

interface "eth0" {
    prepend domain-name-servers 8.8.8.8;
}
```

また、K5 では、AWSと違って、プライベートIPをインスタンス作成時に指定できないことに注意しましょう。

# 3. Ubuntu 16.04 LTS を保管
Snapshotでアップグレード後のイメージを取っておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/8733c54b-1d16-8e85-b162-e40e09eaaed9.png)

# 4. Ubuntuをブート
スナップショットを取ったら、ブートして、

* zsh をインストール
* ansible をインストール
* docker-ce をインストール
します。

# 5. Rancher Server をインストール
Dockerが入ればこっちのもんです。
以下のコマンドでRancher Serverをインストールします。

```
sudo docker run -d --restart=unless-stopped -p 80:80 rancher/server
```
外部からの接続は、セキュリティーグループで制限しておきます。

無事起動しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/6ba4c901-6bbc-d188-6fff-50e3d799c3a9.png)

最新バージョンの 1.6.1 にしてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/02fdb960-7e7e-c4be-d95c-d4beb77453e5.png)

# 6. Rancher Host をインストール

いつものホスト追加画面を出して、CUIからコマンドラインを叩きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/052ba856-f1c9-3ee6-fd9e-f3529ed4fa3d.png)

追加されました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/926ed0b5-5d92-3508-5381-f0545aa725b6.png)


# 7. myカタログを追加

某氏お手製のマイカタログを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/14d38621-afa2-4f2f-745b-1c38ff53432e.png)

最近、Manage Catalogというのが追加されたんですね。
ここはまだ日本語化されていませんでした。コミュニティで頑張って翻訳しないとですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/a4ee3b0d-098f-4088-09a8-05677b53b533.png)

# 8. まとめ
普通のIaaSとしてのK5では、Rancher を使うのは何の問題もありませんでした。
Loadbalancerをうまく使えば、Rancher Serverの冗長構成も比較的簡単につくることができるでしょう。

しかし、Ubuntu OSの問題や、RancherOSを動かすなどはハードルの高いところもあります。
「データベース仮想サーバ」のDBサーバーも残念ながら、Postgresqlなので残念ながら利用できません。
Docker イメージregistory も別途用意する必要があります。

次は、Rancher で 何かDockerコンテナーを動かしてみたいと思います。
[10. Nextcloud on K5 導入](http://qiita.com/ynott/items/f047af5f2c1f667d5530)
cygwinをタブ化するfattyで少し快適


### ダウンロード&使い方
 [github - fatty](https://github.com/juho-p/fatty)

<table>
<tr>
<th>起動</th>
<td>(fatty.exeのディレクトリへ移動して)fatty</td>
</tr>
<tr>
<th>新タブ開く</th>
<td>ctrl + shift + T</td>
</tr>
<tr>
<th>タブ閉じる</th>
<td>ctrl + shift + W</td>
</tr>
<tr>
<th>タブ移動</th>
<td>shift + ← or →</td>
</tr>
</table>



### 参考画像
![fatty.png](https://qiita-image-store.s3.amazonaws.com/0/107536/8b00749a-4721-7683-72e4-d207e4bed31b.png)



### 分からなかった点
* 配布先のgithubではfattyのショートカットを作成してデフォルトでcygwinを指定できると書かれているっぽいのですが、良くわからず毎回cygwinで`fatty`コマンドを打って起動しています

* タブ毎の背景色設定が出来ないっぽい

### その他
* ConEmuを試してみたけど下記のような感じで使い物にならなかった（原因調べてないです）

```
$ ls
Segmentation fault
```
Unityでシンセサイザーを！

#MySynthesizer
UnityのAssetStoreで公開中のソフトウエアシンセサイザーの紹介です。

[アセットストア「MySynthesizer」](https://www.assetstore.unity3d.com/jp/#!/content/52577)
UnityでFM音源や波形テーブル音源で音楽を奏でたりリアルタイムに効果音を生成できるプラグインです。

c#によるクラスライブラリ(dll)なので基本的にはどのプラットフォームでも動きます。
ただし・・すっごく重いんです。

##機能
- FM音源(OPM風4OP)
- ロービット波形テーブル音源(5bit32サンプル)
- PCM音源(AudioClipの波形にループやエンベロープを付けられます)
- SoundFont2対応！
- MML(MusicMacroLanguage)シーケンサー
- リアルタイム発音(1.6からWebGL対応!)
- AudioClip生成
- ローレベルではMIDI風のAPI

##同梱ツール(Windows専用コンソールアプリ)
- MML再生プログラム(DirectSoundかwavファイルへ出力)
- Standard MIDI File(STD,SMF,MID)からMMLへの変換プログラム。

ツールは全て.Netのc#でソースも同梱しています。

##制限事項
- 重い！(SF2>=FM>>>>PCM=WT)
- デフォルトでは各音源同時発音数は8音のみ(最大32)
- デフォルトのサンプリング周波数は31250Hz(最大192kHz?)
- WebGLではAudioClipのデータをとれなかったのでSS8(簡易サンプリング音源）は使用不可、代わりにSondFontを使ってください。
- プラグイン(dll)のソースは非公開
- MMLが独自仕様なのでちょっとわかりにくいかも。
- 音色がまだ用意できていません・・

##想定している使い方
- MMLなので音楽データがわりと小さく配信アプリに最適！？
- MMLをテキストエディタで書くだけなのでゲームジャム等でその場で打ち込めます！
- ランタイムにAudioClipへ出力できるのでアプリ立ち上げ時に変換しておくと効果音とかに使い勝手がいいかも？
- やろうと思えばリアルタイムにテンポやキーを変えたり曲の流れも変えられるのでより効果的な演出が可能！
- MegaDriveやGameBoy、SuperFamiconのような音が出るのでチップチューンにいかが？
- FM音源やロービット波形音源はプロシージャルな効果音に最適！
- SondFont2に対応したのでGM音源をインポートすればmidとして配布されているデータもコンバートしてそのまま使用可能！
- セクション（小節の集まり）毎のコールバックとバリエーション機能（トラックの組を指定し切り替えられる）によりインタラクティブなゲーム音楽が可能！？(1.7)
- MIDファイルをランタイムにMMLへコンバートし再生する機能も追加！(1.7)

##無料なのでまずはお試しを！


##バージョン
現在1.7が公開中
Unityのバージョンは5.0.4から対応しています。
Rails 5.1.1のWebpackerでnode_modules内のCSSライブラリ使用時のWarning


Webpackerにyarnで入れたCSSライブラリを組み込んでコンパイルしようとすると以下のようなWarningが毎回出てきました。

```
09:28:18 hot.1  |     WARNING in ./~/css-loader?{"minimize":false}!./~/postcss-loader/lib?{"sourceMap":true}!./~/resolve-url-loader!./~/sass-loader/lib/loader.js?{"sourceMap":true}!./app/javascript/app-style.scss
09:28:18 hot.1  |     (Emitted value instead of an instance of Error) postcss-smart-import: /****/app/javascript/app-style.scss:1:0: Failed to find '~materialize-css/dist/css/materialize.css'
```

コンパイル自体は正常にできていましたが、気になったので少し調査。

CSS周りの構成は[WebpackerのGithub](https://github.com/rails/webpacker)を参考に、以下のような感じにしています。

```./app/javascript/packs/application.js
import '../app-style'
import 'materialize-css/dist/js/materialize.js'

console.log('Hello World from Webpacker');
```

```./app/javascript/app-style.scss
@import '~materialize-css/dist/css/materialize.css';
```


エラー内容的には、app-style.scssのimport指定がおかしいみたいですね。
いろいろ調べてると少し違う内容ですが見つけました。

https://github.com/rails/webpacker/issues/461


@importの指定の拡張子を取り除くことでWarningが出ないようになりました。

```./app/javascript/app-style.scss
@import '~materialize-css/dist/css/materialize';
```
node.jsでmd5を計算

標準ライブラリのcryptoを使う。

```js
// @flow
'use strict'
const crypto = require('crypto')

function md5hex(str /*: string */) {
  const md5 = crypto.createHash('md5')
  return md5.update(str, 'binary').digest('hex')
}

const hello = 'hello'
const hello2 = 'hello2'

console.log(md5hex(hello))
// 5d41402abc4b2a76b9719d911017c592
console.log(md5hex(hello2))
// 6e809cbda0732ac4845916a59016f954
```
【Laravel 5.4】マイグレーションで postgresql に テーブル カラム コメント を付ける。

### はじめに
最近は、DBからER図をリバース作成するツールとかがある。
しかし laravel のマイグレーションのコメントは MySQL しか対応していない。
(MySQL はテーブル作成時にコメントつけられるからだろうな。)
ポスグレでマイグレーションの度にコメントが消えると、毎回コメントを入れ直す必要がでてきて、リバース作成ツールとか使えないのもなんなのでちょっと対応策を考えてみた。
### Postgresql だったらテーブル・カラムコメントを後づけ
ポスグレの場合 ->comment() を使っても何も起こらないので mysql だった場合も想定して ->comment() もつけておく。
もし config/database.php の default が pgsql だったら、テーブル・カラムにコメントを付けるSQLを発行する。

```php:2014_10_12_000000_create_users_table.php
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id')->comment('ID');
            $table->string('name')->comment('ユーザ名');
            $table->string('email')->unique()->('メアド');
            $table->string('password')->('パスワード');
            $table->rememberToken();
            $table->timestamps();
        });
        if (config('database.default') == 'pgsql')) {
            DB::select("COMMENT ON TABLE users IS 'ユーザ'");
            DB::select("COMMENT ON COLUMN users.id             IS 'ID'");
            DB::select("COMMENT ON COLUMN users.name           IS 'ユーザ名'");
            DB::select("COMMENT ON COLUMN users.email          IS 'メアド'");
            DB::select("COMMENT ON COLUMN users.password       IS 'パスワード'");
            DB::select("COMMENT ON COLUMN users.remember_token IS 'リメンバトークン'");
            DB::select("COMMENT ON COLUMN users.created_at     IS '作成日時'");
            DB::select("COMMENT ON COLUMN users.updated_at     IS '更新日時'");
        }
    }
```
### 早く Postgresql も comment 対応して欲しい。
MySQLがOSS界ではスタンダードだけれど、トランザクションやバキュームの関係から商用ではポスグレを選択するケースも少なくないので、できれば早く標準でサポートして欲しいなぁ。

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
XRDP 導入手順

# はじめに
RyzenCPUが発売されて暫く立ち、そろそろデスクトップPCの買い替えを検討したい
VGAカードも新しい環境へもっていき、このマシンはできるだけヘッドレス運用できればと考えたので、
Windows消去、LinuxでXRDPを導入した環境構築を行った
無駄に詰まったのでその点のメモを記す

# 対象環境
OS : Linux Mint 18.1 x64

# 失敗手順 : X11RDP-o-Maticとapt-get
X11RDP-o-Maticは公式を見て頂くとわかるが、どうやらXRDPのgitの最新ブランチに対してうまく動かず、
まともに動作しない。(事実シェルがすぐ終了する)

apt-getは導入できることはできるが、version 0.6系と古い(現在の最新が0.9.1)ので却下した

# 導入手順 1 : ビルド環境の導入
ビルドに必要なライブラリ群を導入する

```bash
$ sudo apt-get -y install libx11-dev libxfixes-dev libssl-dev libpam0g-dev libtool libjpeg-dev flex bison gettext autoconf libxml-parser-perl libfuse-dev xsltproc libxrandr-dev python-libxml2 nasm xserver-xorg-dev fuse automake git
```

# 導入手順2 : gitからXRDP関連をcheckout
XRDP関連のファイルをチェックアウトする

```bash
$ git clone https://github.com/neutrinolabs/xrdp.git
$ git clone https://github.com/neutrinolabs/xorgxrdp.git
```

# 導入手順3 : サービス設定ファイルの導入
一から作るのが面倒なので、apt-getを利用して現在のapt-getで導入されるXRDPサービス設定をベースにすることにした

```bash
$ sudo apt-get -y install xrdp
$ sudo apt-get -y remove xrdp
```

# 導入手順4 : ビルド&インストール
XRDP関連ファイルをビルド、インストールする

```bash
$ cd xrdp
$ ./bootstrap
$ ./configure --enable-fuse --enable-jpeg
$ make
$ sudo make install
$ cd ../xorgxrdp
$ ./bootstrap
$ ./configure
$ make
$ sudo make install
```

# 導入手順5 : windowManagerの登録
立ち上げるWindow Manager を.xsessionに書き込む
mate

```bash
$ echo "mate-session" > ~/.xsession
```

cinnamon

```bash
$ echo "cinnamon-session" > ~/.xsession
```

# 導入手順6 : サービスの書き換え
XRDPのサービスファイルを修正する

/lib/systemd/system/xrdp.serviceと、  
/lib/systemd/system/xrdp-sesman.service  
の2ファイルを以下のように変更する

変更前

```txt
EnvironmentFile=-/etc/sysconfig/xrdp
EnvironmentFile=-/etc/default/xrdp
```

変更後

```txt
#EnvironmentFile=-/etc/sysconfig/xrdp
EnvironmentFile=-/etc/xrdp
```

その後、サービスの更新を行う

```bash
$ sudo systemctl daemon-reload
$ sudo systemctl enable xrdp.service
$ sudo service xrdp restart
```

# 確認
別マシンからアクセスしてみる
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/2754/6a39dc13-bf84-a3c3-9639-16a3be501aa0.png)
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/2754/ac2ed4f9-65e5-dca0-d0d7-ef1eaecda185.png)
DirectoryIndex出力のカスタマイズ


## apache

### httpd.conf

* [mod_autoindex - Apache HTTP サーバ バージョン 2.4](http://httpd.apache.org/docs/2.4/ja/mod/mod_autoindex.html)


```diff:/etc/apache2/apache2.conf
  <Directory /var/www/html/>
  	Options Indexes FollowSymLinks
  	AllowOverride None
  	Require all granted
  	#
+ 	IndexOptions +FoldersFirst
+ 	IndexOptions +NameWidth=*
  </Directory>
```

* フォルダを最初に表示
* フォルダ名が長くても表示

![mod.png](https://qiita-image-store.s3.amazonaws.com/0/25728/20d5c9fb-9c70-d716-21cc-adb31dc18148.png)


## nginx

### /etc/nginx/sites-available/default

* [Module ngx_http_autoindex_module](http://nginx.org/en/docs/http/ngx_http_autoindex_module.html)

```diff
  server {
  	listen 80 default_server;
  	root /var/www/html/;
  	index index.html index.htm index.nginx-debian.html;
  	server_name _;
  	location / {
+ 		autoindex on;
+ 		autoindex_localtime on;
+ 		charset UTF-8;
  		try_files $uri $uri/ =404;
  	}
  	location ~ \.php$ {
  		root           /usr/share/nginx/html;
  		fastcgi_pass   127.0.0.1:9000;
  		fastcgi_index  index.php;
  		fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
  		include        fastcgi_params;
  	}
  }
```

* DirectoryIndex を有効
* サーバーのタイムゾーンを使用

![nginx.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1ba8446f-f4d4-99b7-4df9-c7a3a25d6667.png)