OmniAICreator/Qiita-1.07M huggingface dataset:
Yaml についてあれこれ忘れるので、戯れて覚える

なにかとお世話なる Yaml ですが、いつも雰囲気でやっていました。もう少し仲良くなりたいなと思いましてこれを書きます。

そもそも、ハッシュの中のリストの書き方が、

```yaml
a:
- b # 行頭スペースなし
- c
```

でも

```yaml
a:
 - b # 行頭スペースあり
 - c
```

でも良いということから端を発しています。

ぼくは、書き方の統一感が好きなので、Rails では Rubocop とかが好きで、yaml ファイルのこのユレが気になって仕方がないのです。Rubocop でこの辺のことを制御できるのかは知らないのですが。そもそもどっちが正しいのかをわかっていなかったのです。結論どっちも正しい。

# ruby => yaml

`to_yaml` という便利なものがあります。

```console
pry(main)> puts ({"a"=>[1,2]}.to_yaml)
---
a:
- 1
- 2
=> nil
```

（こんな感じで、配列の行頭にスペースがない...。まあいいのですが。）

# yaml => ruby

`YAML.load` という便利なものがあります。

```console
pry(main)> YAML.load("a: 1")
=> {"a"=>1}

pry(main)> YAML.load(%Q{a:\n- 1\n- 2})
=> {"a"=>[1, 2]}

pry(main)> YAML.load(<<EOF)
pry(main)* a:
pry(main)*  - b
pry(main)*  - c
pry(main)*    d
pry(main)* EOF
=> {"a"=>["b", "c d"]}
```

# Anchor, Alias, Merge

よくみるのは、以下のようなもの

```yaml
a: &a
 foo: 1
 bar: 2

hoge:
 piyo: 3
 <<: *a
````

これは、ruby だとこんな感じになります。

```console
pry(main)> YAML.load(<<EOF)
pry(main)* a: &a
pry(main)*  foo: 1
pry(main)*  bar: 2
pry(main)* hoge:
pry(main)*  piyo: 3
pry(main)*  <<: *a
pry(main)* EOF
=> {"a"=>{"foo"=>1, "bar"=>2}, "hoge"=>{"piyo"=>3, "foo"=>1, "bar"=>2}}
```

アンカー: `&`
エイリアス: `*`
マージ: `<<`

をつかっています。なので、それぞれ理解すると良いと思う。

# 改行について

`|` と `>` には以下の違いがあります。

```console:\nになる
pry(main)> YAML.load(<<EOF)
pry(main)* a: |
pry(main)*  My
pry(main)*  name
pry(main)*  is
pry(main)* EOF
=> {"a"=>"My\nname\nis\n"
```

```console:スペースになる
pry(main)> YAML.load(<<EOF)
pry(main)* a: >
pry(main)*  My
pry(main)*  name
pry(main)*  is
pry(main)* EOF
=> {"a"=>"My name is\n"}
```

`|-` とか `>-` を使うと、最終行末の `\n` をなくすことができます。


# 配列の中のハッシュの中の、改行

この書き方で少し悩みました。

```yaml:スペース１つはエラー
- a: 1
- b: |
 hoge
 piyo
- c : 3
```

```yaml:スペース２つもエラー
- a: 1
- b: |
  hoge
  piyo
- c : 3
```

```yaml:スペース３つはOK
- a: 1
- b: |
   hoge
   piyo
- c : 3
```

でも、このスペースの数でミスるのはいやなので、以下のように書いています。

```yaml
- a: 1
- 
 b: |
  hoge
  piyo
- c : 3
```

以上です。すこし Yaml と仲良くなれた気がします :pear:
上司からの「Windows × Nginx でSSL環境つくっておいて」を5分で終わらせる

先日、上司から「Windows × Nginx でSSL環境つくっておいて」という司令。いや、ご依頼がありました。
5分で終わるな〜と思いつつ始めたものの、普段はMacなのでWindowsでの環境構築に少々手間取りました。
ということで、次回は「5分で終わります」と答えられるように、備忘録を残す。

最終的なディレクトリ構造はこんな感じ

```
C:
├── OpenSSL-Win64
│   　└── bin
│　   　    └── openssl.exe
├── ssl
│   　├── server.crt
│  　 ├── server.csr
│ 　  └── server.key
└── nginx
   　 ├── nginx.exe
  　  └── conf
   　　     └── nginx.conf
```

## 証明書の生成
### 1. OpenSSLのインストール
[ここ](http://slproweb.com/products/Win32OpenSSL.html)からOpenSSLをインストールしてパスを通す。

※ インストールファイル
64bit: Win64 OpenSSL v1.1.0g Light
32bit: Win32 OpenSSL v1.1.0g Light

### 2. 証明書を生成する
```shell:コマンドプロンプト
$ cd /
$ mkdir ssl
$ cd ssl
$ openssl genrsa -out /ssl/server.key 2048
$ openssl req -new -key server.key > server.csr
$ openssl x509 -in server.csr -days 90 -req -signkey server.key > server.crt
```

## Nginxの起動

### 1. Nginxのダウンロード
[ここ](https://nginx.org/en/download.html)からStable version(nginx/Windows-x.x.x)をダウンロードして適当な場所に配置。

### 2. nginx.confの設定

nginx.confはダウンロードしたフォルダ内のconfフォルダに格納されている。

```conf:nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        listen       443;
        server_name  localhost;

        ssl                  on;
        ssl_certificate      C:\ssl\server.crt; # 「2. 証明書を生成する」で生成したファイルを指定
        ssl_certificate_key  C:\ssl\server.key; # 「2. 証明書を生成する」で生成したファイルを指定

        location / {
            root html;
            index index.html index.htm;
        }
    }
}
```

### 3. 起動
```shell:コマンドプロンプト
$ cd /nginx # 「1. Nginxのダウンロード」で配置したフォルダ
$ start nginx #　停止は nginx -s quit
$ tasklist /fi "imagename eq nginx.exe" # プロセスが起動していることを確認
```

## 確認

https://127.0.0.1 にアクセスすると「Welcome to nginx!」が表示される。
後は適宜、locationの設定を変えればOK。
はい、５分でいけますね。
scipy > Bessel functions > scipy.special.jv | scipy.special.yv | AMOSパッケージ

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```


https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py
において以下の記載がある。

> `from scipy.special import jv, yv`

jv, yvとは何か?

https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.jv.html
https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.yv.html

第1種Bessel関数と第2種Bessel関数のようだ。


https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.jv.html
> For positive v values, the computation is carried out using the AMOS [R511] zbesj routine, 

AMOSというのはnetlib.orgで公開されているFortranパッケージのようだ。
http://netlib.org/amos/
Storeの永続化にredux-persistを使う

## [redux-persist](https://github.com/rt2zz/redux-persist)とは
主に、次の機能によって、Storeの状態を永続化します。

- ReduxのStoreの状態（State）を **localStorage** （Web）や、 **AsyncStorage** （react-native）などのStorageに保存する
- Storageに保存した状態をアプリ起動時に読み込ませる

## 事前準備
### redux-persistのインストール
[yarn](https://yarnpkg.com/lang/ja/)が使える環境ならば、適用したいプロジェクトのルートで次のコマンドを実行し、redux-persistをインストールします。

```
yarn add redux-persist
```

## 使い方
基本的な使い方を紹介します。
### 永続化の設定
```/src/configureStore.js
import { createStore } from 'redux'
import { persistReducer, persistStore } from 'redux-persist'
import storage from 'redux-persist/lib/storage'

import rootReducer from './reducers'

// 永続化の設定
const persistConfig = {
  key: 'root', // Storageに保存されるキー名を指定する
  storage, // 保存先としてlocalStorageがここで設定される
  whitelist: ['todos'] // Stateは`todos`のみStorageに保存する
  // blacklist: ['visibilityFilter'] // `visibilityFilter`は保存しない
}

// 永続化設定されたReducerとして定義
const persistedReducer = persistReducer(persistConfig, rootReducer)

const store = createStore(
  persistedReducer,
  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)

export const persistor = persistStore(store)
export default store

```

### `PersistGate`でルートcomponentをラップ

```/src/index.js
import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { PersistGate } from 'redux-persist/integration/react'

import App from './components/App'
import store, { persistor } from './configureStore'

// persistor.purge() これを実行すると、Storageに保存された情報がクリアされる

render(
  <Provider store={store}>
    <PersistGate loading={null} persistor={persistor}>
      <App />
    </PersistGate>
  </Provider>,
  document.getElementById('root')
)

```

アプリを起動し、StoreにStateが保存されると、同期的にStorageにもState情報が保存されます。

<img width="378" alt="スクリーンショット 2018-03-11 0.33.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/199911/5c3424a3-4cbf-dc1c-8831-5a8bb773bf50.png">
↓ 
<img width="1045" alt="スクリーンショット 2018-03-12 7.09.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/199911/8aec4273-373e-0c48-3b3a-577a4c34416b.png">

逆に、ブラウザをリロードしたり、ブラウザを再起動してアプリを起動すると、Storageに保存された情報がStoreのStateに反映されます。

### Storageのクリア
`persistor = persistStore(store)`によってオブジェクトを生成し、`persistor.purge()`を実行すると、Storageに保存された情報がクリアされます。

### 保存する/しないStateを指定
永続化の設定で、`whitelist`および`blacklist`を指定することによって、それぞれ保存する、保存しないStateを任意に設定することができます。

```js
const persistConfig = {
  key: 'root', // Storageに保存されるキー名を指定する
  storage, // 保存先としてlocalStorageがここで設定される
  whitelist: ['todos'] // Stateは`todos`のみStorageに保存する
  // blacklist: ['visibilityFilter'] // `visibilityFilter`は保存しない
}
```


## サンプルコード
https://github.com/galoi/redux-persist-sample

下記を実行することで、直ぐに試すことができます。

```sh
# ホームディレクトリに移動
cd ~/
# サンプルコードをclone
git clone https://github.com/galoi/redux-persist-sample
# プロジェクトのルートに移動
cd redux-persist-sample
# 必要なライブラリをインストール
yarn
# アプリを起動
yarn start
```
Github APIの検索でページングを利用する

RubyからGithub APIへアクセスするために[Octokit](https://github.com/octokit/octokit.rb)を利用する。OctokitはGithub APIのRubyラッパー。

## Gemfile

直接使うgemはOctokitのみ。

```
gem 'octokit'
```

## Github APIアクセストークンの取得

`scopes`は公開情報へアクセスするだけなら何も指定しなくてもよい。`note`は作成したトークンの名前になるので分かりやすいものにした方が後で便利。

```ruby
require 'octokit'

client = Octokit::Client.new(
  :login    => 'Github ID',
  :password => 'PASS')

token = client.create_authorization(
  :scopes => ["user"], :note => "トークン名",
  :headers => { "X-GitHub-OTP" => "二段階認証の数字" })

# token.tokenは今後使うので保存しておく
```

一度アクセストークンを作れば次回以降は下記のようにクライアントオブジェクトを作成できる。

```ruby
client = Octokit::Client.new(access_token: token.token)
```

## 検索結果のページング

Github APIで検索のページングを利用するには、クエリパラメーターの`page`の値を変えていけばよい。

```ruby
  repos = []
  page = 1

  loop do
    resource = nil
    retry_count = 0

    begin
      resource = client.search_repositories("stars:1000..3000", page: page, per_page: 100)
      repos.concat resource.items
    rescue Octokit::TooManyRequests => e
      retry_count += 1
      if retry_count <= 3
        sleep client.rate_limit.resets_in
        retry
      else
        puts "Retries exhausted: #{e.inspect}"
        break
      end
    rescue => e
      puts "Something error: #{e.inspect}"
      break
    end

    break unless client.last_response.rels[:next]
    page += 1
  end
```

## 注意点：同じ検索条件で取得できる結果は1000件まで

上記の検索条件では1000件（10回のループ）でページングが終わってしまう。これはGithub APIの制限によるもの。

この制限を回避するには、ページングが終わるたびに検索条件を少し変えるとよい。（リポジトリの作成日を検索条件に入れるなど）

## 参考リンク

https://developer.github.com/v3/search/
https://help.github.com/articles/understanding-the-search-syntax/
https://github.com/octokit/octokit.rb
Rails Tutorial 4章メモ

#●4.3　配列と範囲演算子
##・文字列⇒配列変換
文字列.split(区切り文字)
※区切り文字のデフォルトはスペース

##・配列の要素にアクセス
a[数字]
a[-1]で最後の要素
a.first,a.second,a.third.....

##・配列に対するメソッド
###要素が含まれているか？
⇒a.include?(要素)
###要素をソート
⇒a.sort
###並びを逆に
⇒a.reverse
###並びをシャッフル
⇒a.shuffle
※a.shuffle[0..7]にするとシャッフルしてから冒頭の8文字のみ返す

##配列に対するメソッドをa自身に適用したい場合(破壊的メソッド)
⇒a.sort!

###・要素を配列に追加
a.push(要素)
a << 要素

###・範囲オブジェクトを返す
(0..9).to_a

##繰り返し処理
###数値の繰り返し
範囲オブジェクト.each |i| do 
-繰り返す式
end

###繰り返す回数を指定する場合
数字.times{繰り返す式}

###文字列等、範囲オブジェクトの各要素に対して適用する繰り返し
[A B C].map{|char| char.downcase}
⇒["a","b","c"]

##ハッシュとシンボル
###ハッシュの定義
user = {} #空のハッシュ
user["first_name"] = "Michael" #first_nameをキーに、値がMichael
user["last_name"] = "Hartl" #last_nameをキーにHartlが値
###シンボルを使ったまとめた定義
h2 = { name: "Michael Hartl", email: "michael@example.com" }
ざっくばらんメモ_26：kaggle bowl2018

###kaggle bowl2018
[コンペ](https://www.kaggle.com/c/data-science-bowl-2018)
[code](https://github.com/festa78/kaggle_bowl2018)
前回はUNetを用いた予測を行った。
今回はもう少し最新の手法を試す。
選んだのは[Dilated Residual Network](https://arxiv.org/abs/1705.09914)で
こちらは[コードが公開](https://github.com/fyu/drn)されているため適用しやすい。
このモデルを学習するためには規定のフォルダ構造にしなければならないので、
その前処理のみを行って実際に学習を行った。
結果：LB0.222でむしろUNetより結果が悪化してしまう。
cityscapesなどの多クラスかつ高解像度なタスクで高性能をたたき出しているが、
今回の低解像度かつ２クラスのみのモデルには相性が悪いのかもしれない。
Laravel で .env の値が読み込まれない時はキャッシュの存在を疑う


Laravel で .env の値が読み込まれない。 env()で値が取れない。という場合、 bootstrap/cache/config.php の存在を疑いましょう。

このファイルは下記のコマンドで生成される設定のキャッシュファイルです。

```bash
$ php artisan config:cache
```

このファイルが存在すると env() は常にnullを返します。
設定のキャッシュをさせたいときは env() は設定ファイルの中でのみ使用しましょう。

ちなみに下記コマンドで設定キャッシュファイルを削除すれば env() で値が取れるようになります。

```bash
$ rm -f bootstrap/cache/config.php
```

ツッコミ歓迎！！
Chrome HeadlessをDebianで動かすためのTips

# 背景
情報共有を行うに至った経緯

1. 備忘録
2. 情報共有
3. 指摘をもらう

#ユースケース
Debianサーバもしくは他Linuxサーバ(Ubuntu等)にChromeHeadlessをインストール

#手順
```shell:chrome.sh
apt-get update
// 対象OSのChromeのパッケージをダウンロード（例はamd64)
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
// インストール後、必要なライブリーをアップデート
dpkg -i google-chrome*.deb || apt update && apt-get install -f -y
```

#レポジトリー
参考までに当時のレポジトリーを共有

```shell:chrome.list
deb http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch main contrib non-free
deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free
deb http://security.debian.org/debian-security/ stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security/ stretch/updates main contrib non-free
```

 #参考情報
- ヘッドレス Chrome ことはじめ | Web | Google Developers
https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja
- Amazon Linux 2 で Headless Chrome を動かしてみた
https://qiita.com/aibax/items/fade7e417f6c096a879b
Windows10にPHPを導入し、Apacheで利用できるようにする。

#1.はじめに
こんにちは。こむぎです。AmazonEC２をいじり倒すうえで、まずWindowsのローカルな環境で特にDB操作など、検証がしたいと思っており、Windows環境でDBをいじれる環境を構築しています。環境構築の一つとして、今回はPHPを導入していきます。

#2.この記事のゴール
Windows10にPHPを導入し、PHPを動かせる環境を構築する。
ブラウザでphpinfoを表示させ、phpが動作することを確認する。

#3.導入した主なもの
PHP-7.2.3RC1-Win32-VC15

#4.手順
##4-1.PHPのインストール
###4-1-1.[公式](https://windows.php.net/qa/)からPHPのファイルをダウンロード
php-7.2.3RC1-Win32-VC15-x64.zipをC:/に解凍
フォルダ名[php-7.2.3RC1-Win32-VC15-x64]を [php-7.2.3]にリネーム

##4-2環境変数設定
###4-2-1.C:php-7.2.3のPathを通す
[コントロールパネル]→[システムとセキュリティ]→[システム]→[システムの詳細設定]→[環境変数]

<img src="https://qiita-image-store.s3.amazonaws.com/0/124676/98294a2e-9e6c-6228-d60c-e64b5820b832.png" width=50%>

[Path]→[編集]
<img src="https://qiita-image-store.s3.amazonaws.com/0/124676/812c5bc0-dab3-75f3-009d-7ba095f0d52d.png" width=50%>

[参照]を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/124676/a17e10c7-4515-7f91-eb59-83f183f4f4cd.png" width=50%>

c:/php-7.2.3を選択して[OK]
<img src="https://qiita-image-store.s3.amazonaws.com/0/124676/3b4cc5b1-8b88-69ad-f0aa-cc6e50236f98.png" width=50%>

##4-3.phpのバージョン確認

```
php -v 
```
以下のようにバージョンが表示されれば、Pathが正しく通っている。

```
PHP 7.2.3RC1 (cli) (built: Feb 15 2018 17:57:31) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
```


以降はApacheでphpを利用したいときに必要な手順のため、Apacheを利用しない方は不要です。

##4-4.httpd.confの設定

###4-4-1.httpd.confにphpモジュール追加、拡張子登録等
httpd.confの最後に以下を追加

```conf:httpd.conf
LoadModule php7_module "c:/php-7.2.3/php7apache2_4.dll"
Loadfile "c:/php-7.2.3/php7ts.dll"
Loadfile "c:/php-7.2.3/libpq.dll"
PHPIniDir "c:/php-7.2.3"
AddHandler php7-script .php
AddType application/x-httpd-php .php
AddType application/xhttpd-php-source .phps
```

###4-4-2.httpdを再起動
```
C:/apache/httpd-2.4.29-Win64-VC15/Apache24/bin>httpd -k restart
```


##4-5.phpinfo.phpで動作確認
###4-5-1.phpinfo.phpを作成
C:/apache/httpd-2.4.29-Win64-VC15/Apache24/htdocs/
htdocs配下にphpinfo.phpというファイルを作成。

```php:phpinfo.php
<?php
phpinfo();
?>
```


![phpinfo-20180312.PNG](https://qiita-image-store.s3.amazonaws.com/0/124676/bf4836cd-a3dc-1cf4-c8d9-e7e97579fb71.png)


#5.おわりに
Phpinfoを表示されるまでかなり時間を要しました。モジュールが正しく参照されていなかったり、80ポートが他で使われていたり、ブラウザのキャッシュが残っていたり・・・
結局、PCの再起動を行い、httpdを起動させたら無事phpinfoを表示させることができました。後程、トラブルシュートの記事を書こうと思っています。
お疲れさまでした。
SQLAlchemyのqueryで項目を１つだけ指定すると要素数１のタプルが返るよ

標題のとおりです。最近、たまにインターンの人が引っかかっているのを見るので。

```python3:tekito.py
s = Session()
names = s.query(SomeTable.name).filter(SomeTable.id.in_([1, 2, 3])).all()
Session.remove()
# flaskでjsonにして返す
# return jsonify({'names': names})
```

これ、returnする前にnamesをprintすると…

```python3
[('taro',), ('jiro',), ('sabu',)]
```

ファッ！？
まあ、一般にはSQLで一つだけを取ってくるということは少なく、複数の項目を取ってきたときにはタプルになるのが自然なので分かるのですが、**取得項目が一つでも、要素数1のタプルになります**。ご注意下さい。

ただのリストにしたい場合は`[name[0] for name in names]`など。
Wordpressでアップロードサイズがかわらないんだが（そんなこともありました。）

.htaccessやphp.iniを使ったやり方を試して、
**あれ？アップロードサイズかわらない！？**ってなりました。

.htaccessとphp.iniのやり方は、他の記事をみていただくとして、
それ以外でうまくいかない条件と対応方法をおいときます。

## 条件：マルチサイトにしている
はい、そのまんまです。
これ、**ネットワーク管理の設定で、アップロードファイルのサイズを制限しているようです。**

## 解決：アップロードファイルのサイズを上げる方法
**ネットワーク管理（親管理画面）　＞　設定　＞　ネットワークの設定**
ここに
**アップロードファイルの最大サイズ**
という項目があるので、コレを変更しましょう！

ちなみに**アップロードファイルの種類**、**サイトごとのファイル上限**も設定できます。

---
同じ悩みを持った人が解決できれば良いなと思います。
Javaでカンマ区切りで文字列連結するいくつかの方法

Javaで配列やリストをカンマ区切りの文字列連結したいことがあり、StringJoinerクラス以外でできる方法がないのかなと調べたのでメモ。
最終的にはStringUtils#join()を使いました。
Stringの配列であればString#join()で良かったのですが、int配列だったのでStringUtilsにしました。

ここから先は調べた内容を紹介していきます。

# StringJoinerを使った方法
StringJoinerクラスはJava7から使えます。
String型の配列ではない場合はString型に変換する必要があります。

```java
import java.util.StringJoiner;
import java.util.Arrays;

public class StringJoinerSample {
  public static void main(String args[]) {
    int[] arr = {1, 2, 3, 4, 5};
    StringJoiner sj = new StringJoiner(",");
    Arrays.stream(arr).forEach(i -> sj.add(String.valueOf(i)));
    System.out.println(sj.toString()); // => 1,2,3,4,5
  }
}
```

# String#join()を使った方法
Stringの配列であれば、`String#join()`が使えます。
`String#join()`はJava8から使えます。

```java
public class MyClass {
    public static void main(String args[]) {
        String[] arr = {"en", "ja", "fr", "es", "zh"};
        String str = String.join(",", arr);
        System.out.println(str); // => en,ja,fr,es,zh
    }
}
```

Listを引数にとることもできます。

```java
import java.util.Arrays;
import java.util.List;

public class MyClass {
  public static void main(String args[]) {
    List<String> list = Arrays.asList("en", "ja", "fr", "es", "zh");
    String str = String.join(",", list);
    System.out.println(str); // => en,ja,fr,es,zh
  }
}
```

# Collectors#joiningを使った方法
List<String>型のコレクションであれば以下のように連結することも可能です。

```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MyClass {
  public static void main(String args[]) {
    List<String> list = Arrays.asList("en", "ja", "fr", "es", "zh");
    String str = list.stream().collect(Collectors.joining(","));
    System.out.println(str); // => en,ja,fr,es,zh
  }
}
```

また、前後を丸括弧()で囲むことも可能です。

```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MyClass {
  public static void main(String args[]) {
    List<String> list = Arrays.asList("en", "ja", "fr", "es", "zh");
    String str = list.stream().collect(Collectors.joining(",", "(", ")"));
    System.out.println(str); // => (en,ja,fr,es,zh)
  }
}
```


# StringUtils#join()を使った方法
StringUtilsクラスはorg.apache.commons:commons-lang3に入っています。
gradleとかmavenでライブラリをインストールする必要があります。

```java
org.apache.commons:commons-lang3:3.6
```

以下のように１行で書くことができます。
`StringUtils#join()`はObjectの配列を引数にとるので
`ArrayUtils#toObject()`を使用してIntegerクラスの配列に変換しています。

```java
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

public class MyClass {
    public static void main(String args[]) {
        int[] arr = {1,2,3,4,5};
        String str = StringUtils.join(ArrayUtils.toObject(arr), ",");
        System.out.println(str); // => 1,2,3,4,5
    }
}
```

他にもGoogle GuavaのJoinerクラスを使った方法などあります。

最後までお読み頂きありがとうございました。
不備や質問などはコメント欄、編集リクエスト、Twitterなどからお願い致します。
他にも方法があれば教えていただけると幸いです。
bundle install時のパス解決

ruby-opencvなど`gem install`時にパスを指定する機会がある。
`gem install ruby-opencv  --with-opencv-dir=/path/to/opencvdir`

`bundle install`時に同じことするのはどうやるんだろうと調べたら以下の手段が見つかった。

```
bundle config build.ruby-opencv --with-opencv-dir=/path/to/opencvdir
bundle install
```
Check Point CoreXLを学ぶ

# はじめに
Check Point Software Technologiesのファイアウォールで使われている技術CoreXLについて勉強します。

# CoreXLとは何か
Check PointのOS上ではFirewall Kernelと呼ばれるプログラムが動作しており、NICから受け取ったパケットをPolicy表上でチェックします。CPUが1コアで動作している場合にはFirewall Kernelも1つのプログラムで動作すれば良いのですが、複数コアのCPUが動作する場合には各CPUコア上でFirewall Kernelに相当するプログラムが並列に動くと都合が良くなります。これを実現する仕組みがCoreXLです。

# CoreXLの構成要素
前項で書いたように、CoreXLは各CPUコアに効率良く仕事を割り振る仕組みです。ここで行わなければいけない仕事は大きく2つに分かれ、以下の2種類のプログラムが担当します。
1. Firewall Instance
2. Security Network Distributor (SND)

Firewall InstanceはパケットのPolicy表でのパケットチェックを担当し、各パケットを通過させるかドロップするかを決定します。1つのCPUコアでは1つのFirewall Instanceが動作し、複数のCPUコア上でそれぞれ独立したFirewall Instanceが動作することになります。
Policy表ベースでの通信許可はL4で行われ、スリーウェイハンドシェイクのSYNパケットが検査に使われます。Policy表によって通過させることが決まった通信に関しては、各Firewall Instanceがコネクションテーブルでコネクションを管理します。

SNDはNICからパケットを受け取り、どのコアで動いているFirewall Instanceにチェックを担当させるかを決定して振り分ける仕事を行います。またSNDは各Firewall Instanceからコネクションテーブルの情報を受け取って統合し、コネクションが確立している通信に関しては同じFirewall Instanceで処理させるように振り分けを行います。

CPUコアの割り振り方ですが、デフォルトでは2コアがSNDに、残りのコアがFirewall Instanceに振り分けられます。現在の割り振りを確認するには`fw ctl affinity -l -r -a -v`コマンドを使います。

# 参考文献
[Understanding Check Point CoreXL Part 1](https://youtu.be/ryM8PHjfpU8)
[Security Gateway Performance Optimization - Part 3 - CoreXL](https://youtu.be/NI-yJz0AG6M)
[ATRG: CoreXL](http://supportcontent.checkpoint.com/solutions?id=sk98737)
sublime + venv + pylsで入力補完

# pylsとは
pylsはpython向けのlanguage-server-protocol (lsp)実装です。
リポジトリはこちら
https://github.com/palantir/python-language-server

lspは簡単に言うとエディタ支援の共通規格みたいなもの？らしいです。

# python側の準備
今回はpylsをグローバルではなくvenv環境にインストールします。

```
python -m venv .venv
. .venv/bin/activate
pip install python-language-server
deactivate
```

# sublime側の準備
まず、sublimeにlspのpackageをインストールします。
Package Controlで下記をインストールすれば完了です。
https://github.com/tomv564/LSP


次に、lspの設定ファイルを編集します。
今回はグローバルにpylsをインストールする訳ではないのでfalseにしてます。

```
{
	"clients":
	{
		"pyls":
		{
			"enabled": false
		}
	}
}
```

最後に、projectの設定ファイルを編集してpylsを起動できるようにします。

```hoge.sublime-project
{
	"folders":
	[
		{
			"path": "/hoge"
		}
	],
	"settings":
	{
		"LSP":
		{
			"pyls":
			{
				"command":
				[
					"/hoge/.venv/bin/pyls"
				],
				"enabled": true
			}
		}
	}
}
```

補完が効くようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93971/5b1f68a4-a54c-8e92-2702-c746608b83ff.png)
pythonで動画を扱う環境作り

pythonで動画を扱うために、opencvを導入したが、少し嵌ったので記述する。

# opencvインストール
pipを使ってインストールした
[download](https://www.lfd.uci.edu/%7Egohlke/pythonlibs/#opencv)
上記リンクから、opencv_python‑3.4.0‑cp35‑cp35m‑win_amd64.whlをダウンロードした。
しかし、contribの方が良いのかもしれない。

download後、コマンドプロントで該当フォルダに移動し、pipでインストール。

```
pip install opencv_python‑3.4.0‑cp35‑cp35m‑win_amd64.whl
```

importしようとすると、はじめは

```
ImportError: numpy.core.multiarray failed to import
```

が出たため、

```
pip install numpy --upgrade
```

で更新すると、エラーが出なくなった。


## 動作確認
まずは、pythonの対話インターフェースから、

```py
import numpy
import cv2
```
を試してみた。エラーがでなければOK。

次に、サンプルaviを落としてきて、
下記を参考に、動画の再生と、静止画取り出し保存をやってみた。

[動画を扱う¶](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html#display-video)

[Python-OpenCVで動画をフレーム分割して画像として保存](http://testpy.hatenablog.com/entry/2017/07/13/003000)

## 参考

[OpenCV 3（core + contrib）をWindows & Python 3の環境にインストール＆OpenCV 2とOpenCV 3の違い＆簡単な動作チェック](https://qiita.com/hitomatagi/items/d5d475a446ec9c73261e)

[Python 3.6 に OpenCV 3.3 など環境を構築する](http://testpy.hatenablog.com/entry/2017/07/13/003000)

[RuntimeError: module compiled against API version a but this version of numpy is 9](https://stackoverflow.com/questions/33859531/runtimeerror-module-compiled-against-api-version-a-but-this-version-of-numpy-is)

[OpenCV-Pythonチュートリアル](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/index.html#)
Rubyの各メソッドと優先順位

Rubyでメソッドを呼び出すことをメソッドの探索やメソッド名の解決と言いますが、Rubyはこれらをどの様に処理しているか簡単にまとめてみようと思います、初学者向け。

`obj`というオブジェクトがあったとして、`obj.m`というメソッド呼び出しがあった場合、Rubyは以下の優先順位でメソッドの探索を行います。

1. objの特異メソッド
2. objのクラスのmというインスタンスメソッド
3. objのクラスがインクルードしているモジュールのインスタンスメソッド(includeされた順とは逆順でモジュールを検索する)
4. スーパークラスのインスタンスメソッド
5. スーパークラスがインクルードしているモジュールのインスタンスメソッド
6. 見つからない場合、`method_missing`メソッドが呼び出される

特異メソッドやらインスタンスメソッドなど色々出てきたのでそれぞれについて簡単に説明します。

#特異メソッド(singleton method)
特異メソッドとは、特定のオブジェクト固有のメソッドです。

```ruby
obj = "object"           #　Stringクラスのオブジェクト

def obj.hello            # objの特異メソッド
  puts "hello " + self
end

obj.hello                # => "hello object"

obj2 = "object2"
obj2.hello               # helloはobjの特異メソッドなのでobj2では使えません
```

obj2では、undefined method `hello'とエラーを吐いてしまいます。

#インスタンスメソッド
その名の通りインスタンスオブジェクト(`Hoge.new`してできるやつ)から呼び出せるメソッドです。

```ruby
class Greeting
  def hello              # Greetingクラスのインスタンスメソッド 
    puts "hello"
  end
end

obj = Greeting.new
obj.hello                # => "hello"

Greeting.hello           # これはGreetingクラスのクラスメソッドです、エラーを吐きます 
```

急に出てきたクラスメソッドというやつはクラスオブジェクトが持つメソッドで、この例で使おうとするとGreetingクラス内で`def self.hello`の様に定義して`Greeting.hello`という様に使います、インスタンスを生成していない所に注意してください。

#インクルードされたモジュールのインスタンスメソッド
Rubyでは、`include Hoge`と書くことで、Hogeモジュールが他の所でも使える様になります。
モジュールとはメソッド等をまとめることができるもので、オブジェクトが作成できないクラスの様な感じです。

```ruby
module Greeting
  def hello
    puts "hello"
  end
end

class NoHello
  include Greeting      # Greetingモジュールをインクルード
end

obj = NoHello.new
obj.hello               # => "hello"
```

この様に、helloメソッドを実装していないクラスのインスタンスからhelloメソッドを呼び出すことができます。

#スーパークラスのインスタンスメソッド
Rubyでは、スーパークラスを継承してサブクラスを作成することで、スーパークラスのメソッドを呼び出すことができます。
Rubyは純粋なオブジェクト指向の言語なので、全てのクラスはObjectというスーパークラスのサブクラスです。

```ruby
class Super           # スーパークラス
  def hello           # スーパークラスのインスタンスメソッド
    puts "hello"
  end
end

class Sub < Super     #　Superクラスを継承してサブクラスを作成
end

obj = Sub.new
obj.hello             # => "hello"

obj2 = Super.new
obj2.hello            # もちろんこれも"hello"です 
```

スーパークラスがインクルードしているモジュールのインスタンスメソッドというのは、`Super`の中でインクルードした場合を考えればわかると思います。

#missing_method
`missing_method`は、メソッドを探索してどこにも見つからなかった場合に最終的に呼び出されるメソッドです。
呼び出されると`NoMethodError`を出します。

```ruby
obj = "object"
obj.no         # => "undefined method `no' for "object":String (NoMethodError)"
```

<br>
ちなみにRubyは、メソッド探索に成功するとキャッシングするので同じメソッドをその後検索するときは高速に処理される様になります。

#参考文献
[プログラミング言語 Ruby](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E-Ruby-%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8-%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D/dp/4873113946)
enumの元の値を参照したい

# モデルでenum

```
class Model < ApplicationRecord
  extend Enumerize
  enumerize :gender, in: { male: 1, female: 2 }
end
```

# 普通に参照

```
Model.first.gender
=> "female"
```

# enumかかる前の値を参照（rails5）

```
Model.first.gender_before_type_cast
=> 2
```

# ちなみに、

モデルで、genderを`numericality`でvalidationしてると・・・

```
class Model < ApplicationRecord
  extend Enumerize
  validates :gender, numericality: true
  enumerize :gender, in: { male: 1, female: 2 }
end
```

updateするとき、`numericality`でひっかかる。

```
Model.first.update(hoge: "ほげほげ")
=>ActiveRecord::RecordInvalid:
  バリデーションに失敗しました:genderは数値で入力してください
```

enumにしてれば、数値で変えても文字で変えても適切に変更されるので`numericality`は外す。

```
Model.first.gender
=> "female"

Model.first.update!(gender: 1)
=> true
Model.first.gender
=> "male"
Model.first.gender_before_type_cast
=> 1

Model.first.update!(gender: "female")
=> true
Model.first.gender
=> "female"
Model.first.gender_before_type_cast
=> 2
```
Windowsでもコマンドラインで開発環境構築(Chocolatey)

Linux環境ではyumやapt-getを使ったことがある人でも
Windowsではブラウザで配布サイトを巡回してインストーラをダウンロードして
インストールしているという人も少なくないはず

本記事はWindows用のコマンドラインパッケージマネージャ[Chocoratey](https://chocolatey.org/)を利用して
コマンドラインでWeb開発でよく使う言語・ツールをインストールする手順です

- Chocorateyを使用するにはWindows7以降で  
  Windows PowerShell v2以上,.NET Framework 4以上が必要です

# Chocolateyのインストール

#### Windows PowerShell を使う場合
- Windows 7の場合  
  スタートメニュー[すべてのプログラム]-[アクセサリ]-[Windows PowerShell]右クリックし[管理者として実行]

```powershell:
> Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

```powershell:Chocolateyの主なコマンド
> choco upgrade chocolatey
Chocolatey自身のアップデート

> choco search <フィルタ文字列>
フィルタ文字列にマッチ＆関連するパッケージのリストを表示

> choco install <パッケージ名>
指定パッケージ(と依存パッケージ)をインストール

> choco upgrade <パッケージ名>
指定パッケージを最新版に更新
```

`choco`コマンドを使用するにはPowerShell(またはcmd.exe)を管理者として実行する必要があります
install/uninstall/upgrade実行後は更新された環境変数を適用するためにPowerShell(またはcmd.exe)を再起動する必要があります

# 言語・アプリのインストール

### Git
```powershell:
> choco install git -y
```

### Java (JDK 9)
```powershell:
> choco install jdk9 -y
```


### PHP
```powershell:
> choco install php -y

> choco install composer -y
```

### NodeJS (Nodistを利用)
```powershell:
> choco install nodist -y
```

```powershell:nodistでNodeJS(ここではv8.10.0)をインストールする
> nodist

> nodist ds

> nodist + 8.10.0

> nodist 8.10.0

> node -v
```

# ブラウザ・IDEのインストール

### Google Chrome
```powershell:
> choco install GoogleChrome -y
```

### Atom
```powershell:
> choco install Atom -y
```

### Visual Studio Code
```powershell:
> choco install VisualStudioCode -y
```

# 仮想環境のインストール

### VirtualBox
```powershell:
> choco install virtualbox -y
```

### Docker
- Windows 10 Pro (64bit) の場合  
  Docker for Windows をインストール

```powershell:
> choco install docker-for-windows -y
```

- Windows 7 Pro (64bit) の場合  
  [Docker Toolbox](https://docs.docker.com/toolbox/) をインストール

```powershell:
> choco install docker-toolbox -y
```
プラグインを使わないjQueryクロスフェード

背景などで流しっぱなしにする時に使えそうなクロスフェードするスライドショーをプラグインを使わずに書いてみたいと思います。

サンプルコード
---

[DEMO](https://codepen.io/shirahama_mika/pen/ZxYmLW/)

HTML

```html


<div class="wrapper">
  <div style="background-image: url(https://picsum.photos/6858/4574?image=1080);"></div>
  <div style="background-image: url(https://picsum.photos/5472/3648?image=1070);"></div>
  <div style="background-image: url(https://picsum.photos/5472/3648?image=835);"></div>
</div>

```

SCSS

```scss

.wrapper{
  width: 100%;
  height:100vh;
  position:fixed;
  div{
    height:100%;
    width:100%;
    background-size: cover;
    position: absolute;
    top:0;
    left:0;
  }
}

```
JS

```javascript

$(function(){
  $('.wrapper div:gt(0)').hide();
  var interval = 6000,
      anim = (function () {
      var i = 0,
          timing = interval / 1000 * 60;
      return function () {
          if (i % timing === 0) {
              $('.wrapper div:first-child').fadeOut(2000).next('div').fadeIn(2000).end().appendTo('.wrapper');
          }
          i++;
      };
  })();
  (function animloop() {
      anim();
      window.requestAnimationFrame(animloop);
  })();
});

```

`requestAnimationFrame`でおよそ毎秒60回(60fps)でiに加算されていって大体６秒のインターバルで（iの値が360で割り切れる時）に一番上のdivがfadeOutしていって一番最後に追加されるみたいな感じでクロスフェードしてます。正確にインターバルの時間を図りたかったらやっぱり`setInterval`使ったほうがわかりやすいかもしれない。

クロスフェードぐらいだったらそこまで時間をがっつり制御しなくてもいいのかなと思って参考サイト様のやり方を参考に書いてみました。簡単でいい方法があれば教えてください。


参考
---
[いまさらrequestAnimationFrameを理解する](http://lealog.hateblo.jp/entry/2013/10/01/235736)
プラグインを使わない超カンタンなモーダルウィンドウの作り方

ちょっとしたモーダルをプラグインを使わずに簡単に書くためのメモになります。
ほぼ参考サイト様のまんまですが、モーダルを天地中央に置く記述はCSSにまかせて、
より短いコードにしています。

サンプルコード
---

[DEMO](https://codepen.io/shirahama_mika/pen/ddMqrp)

HTML

```html

<a href="javascript:void(0)" id="js_modal_open" class="btn">modal</a>
<div class="modal">
    <div class="modal-btn_box">
        <a href="javascript:void(0)" class="close_btn" id="js_modal_close"><i data-icon="ei-close" data-size="m"></i></a>
    </div>
    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium
        quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.</p>
</div>

```

CSS

```css

.btn{
  display: block;
  margin: 100px auto;
  padding: 10px 0;
  width: 140px;
  color: #fff;
  background: #333;
  text-align: center;
  text-decoration: none;
}
.modal{
  display: none;
  width: 40%;
  position: absolute;
  top: 50%;
  left: 50%;
  background: #fff;
  padding: 20px;
  transform: translate(-50%,-50%);
  box-sizing: border-box;
  z-index: 1;
  @media screen and (min-width: 480px) {
	  width: 80%;
  }
}
.modal-btn_box{
  text-align: right;
}
.close_btn{
  display: inline-block;
  width: 50px;
  height: 50px;
  color: #333;
}
.is-overlay{
  display: none;
  width: 100%;
  height: 120%;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 0;
  background-color: rgba(0,0,0,.6);
}


```

js

```javascript

$(function(){
  $('#js_modal_open').on('click', function(){
      $(this).blur(); //ボタンからフォーカスをはずす
      if($('.is-overlay')[0]){ // すでにオーバーレイが存在していたら何もしない
          return false;
      }
      $('body').append('<div class="is-overlay"></div>');　// オーバーレイをセット
      $('.is-overlay').fadeIn(300);
      $('.modal').fadeIn(400);
      // オーバーレイとモーダルをaddでまとめてフェードアウト後モーダル自身を削除
      $('.is-overlay').add($('#js_modal_close')).on('click', function(){
          $('.modal').add($('.is-overlay')).fadeOut(300, function(){
              $('.is-overlay').remove();
          });
      });
  });
});

```

`add()`で要素をまとめて指定するとこんなに簡単に☓ボタンだけでなくモーダル外をクリックした時にも非表示にできるように書けるのだなと勉強になりました。


参考
---
[jQuery　プラグインを使わないでモーダルウィンドウを表示する方法](http://skill-stock.hokoweb.com/skill/155/)
Vueプロジェクトでnormalize.cssを読み込む方法

ResetCSSとして人気のあるnormalize.cssをvueのプロジェクトで使ってみました。
その際に、どのように読み込ませるか迷ったので、自分の採用したやり方を記録しておきます。

## 前提
- vue-cliを使用
- webpackテンプレートでプロジェクトを作成

## normalize.cssをインストール
normalize.cssはnpmでインストール可能です。
まず、npmでインストールを行いましょう。

```bash
$ npm install -D normalize.css
```

## App.vueファイルでimport
つぎに、Vueアプリケーションのルートとなるvueファイルにて、先ほどインストールした `normalize.css` をimportします。
vue-cliでwebpackテンプレートを使用してプロジェクトを作成した場合は、 `App.vue` にimportします。

下記のように `<script>` ブロックに `import 'normalize.css'` を追記しましょう。

```vuejs
<script>
import 'normalize.css'

export default {
  name: 'App'
}
</script>
```

## 完了！
以上で、これだけの手順でnormalize.cssを読み込ませることができます。

本来であれば、webpackのcss-loader等を別途インストールし、webpackのconfigファイルに設定する必要がありますが、vue-cliのwebpackテンプレートを使用している場合、すでにそれらがインストールされているので設定不要ですぐに使い始めることが可能です。

上記の方法以外にも、normalize.cssファイルをダウンロードし、 `static` ディレクトリに配置した上で、index.htmlにてcssファイルを読み込ませる方法もあります。
しかし、npmを用いてインストールし、webpackでひとつのファイルにbuildするようにしたほうが、アップデートの追従もしやすく取り回しも楽で良いかと思います。
Androidアプリケーション開発入門(開発環境の整備)

# Androidアプリケーション開発入門(開発環境の整備)

起動後に "Hello World" という文字が表示されているだけのAndroidアプリケーションを作成しながら、開発の流れを学んでいきます。  
今回は **「開発環境の整備」** に重点を絞って解説します。

---

## 1) "Android Studio" のダウンロード / インストール / 初期設定

以下のページに網羅的に記載されている。

* [\[Android\] Android Studio をインストールする手順（Windows） | nyan のアプリ開発](https://akira-watson.com/android/adt-windows.html)
    1. PCのシステム要件の確認
    2. Android Studio のダウンロード・インストール
    3. SDKの追加インストール

> **「3. SDKの追加インストール」** については、 [最新のAndroidプラットフォームバージョン別シェア](https://developer.android.com/about/dashboards/index.html) を確認し、追加インストールするものを決めると良い。  
> **2018-03-12現在** だと、9割方カバーするには **Lolipop** あたりまでインストールしておく必要がある。


## 2) "Android Studio" の日本語化

インストールした直後の **"Android Studio"** はメニューやボタンなどがすべて **英語表記** となっているため、英語が苦手な方は日本語化するのがよい。  
日本語化は以下のサイトが参考になる。

* [Android Studioのインストールと日本語化(3.0日本語化手順追記) | FidsCreate](https://fidscreate.com/tool/android-studio#japanese3)

流れを箇条書すると以下のようになる。

1. 日本語化プログラムをダウンロード
    * ![](https://api.monosnap.com/rpc/file/download?id=2O3H6UmSPAsZ7wm6HMD11Yog8Ldoon)
2. `setup` プログラムを実行
3. 事前にインストールしている **"Android Studio"** 実行プログラムを日本語化変換対象として指定

![](https://api.monosnap.com/rpc/file/download?id=gSiBOx9HuSMRKl7e3fkfvGqDf6SvB4)



---

## 参考資料

* [Android Studioのインストールと日本語化(3.0日本語化手順追記) | FidsCreate](https://fidscreate.com/tool/android-studio#japanese3)
* [\[Android\] Android Studio をインストールする手順（Windows） | nyan のアプリ開発](https://akira-watson.com/android/adt-windows.html)
モニタもキーボードもマウスも使わずにRaspberry Piでssh接続をできるようにする

# はじめに
Raspberry Piのセットアップには、最低限モニタ、キーボードが必要です。GUIセットアップをする場合はマウスも、Raspberry Pi Zero/Zero Wの場合は変換ケーブルなど、細々と必要な機材が多いです。
CUI、ssh接続で運用するだけであれば、OSイメージを書き込んだSDカードにいくつかファイルを追加することで、sshサーバの有効化、Wifi設定を事前に行い、これら設定が有効な状態で起動させることができます。

# 用意するもの
1. Raspberry Pi 3
2. パソコン（Windows、Mac、LinuxどれでもOK）
3. sshクライアントソフト（Windowsの場合はTeraTerm、Mac/Linuxの場合はsshコマンドの使用を想定。）
4. LANケーブル

# sshサーバを有効にする
SDカードの起動用パーティションはFAT32形式なので、WindowsやMacでも直接操作することが出来ます。
Windowsならエクスプローラ、MacならFinderでOSイメージを書き込んだSDカードのルートディレクトリを参照し、sshというファイルを作成します。ファイルの中身は空で構いません。
![p1.png](https://qiita-image-store.s3.amazonaws.com/0/43330/30d24f41-9832-2cfd-5ef7-a879bca20147.png)


# Wifi設定をする
OSイメージを書き込んだSDカードのルートディレクトリに、wpa_supplicant.confというファイルを作成します。
![p2.png](https://qiita-image-store.s3.amazonaws.com/0/43330/351c256e-f3f5-1679-8f0e-3a64f2378213.png)

作成したファイルをテキストファイルで開き、以下の内容を入力します。
ssid、pskにそれぞれ、WifiのSSID、パスワードを入力し、保存します。

```text:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="----Your-WiFi-SSID----"     <- WifiのSSIDに変更する
        psk="----PLAIN-PASSPHRASE----"    <- Wifiのパスワードに変更する
}
```

保存後、Raspberry PiにSDカードを差し込み、PCとRaspberry Piを有線LANで接続してからRaspberry Piの電源を入れます。

# 有線LAN経由でRaspberry Piにssh接続する
少し待ってRaspberry Piが起動したころあいを見計らって、sshで接続します。
Windowsの方はTeraTermなどのsshクライアント、Macの方はsshコマンドで接続します。設定は下表のとおりです。

| 設定 | 値 |
|:--|:--|
| 接続先 | raspberrypi.local |
| ユーザー名 | pi |
| パスワード | raspberry |

```shell:Macの場合のコマンド
ssh pi@raspberrypi.local
>パスワード入力が求められたら「raspberry」と入力する
```

[2019/2/17追記]
Windowsから.localに接続するためには[Bonjour for Windows](https://support.apple.com/kb/DL999?viewlocale=ja_JP&locale=ja_JP)をインストールしてください。iTunes for Windowsに含まれているようなのでiTunesインストール済みの場合はインストール不要です。


# IPアドレスを固定にする
Wifi経由でsshで接続するために、Raspberry PiのWifiアダプタに固定IPアドレスを設定します。
固定IPアドレスを設定するには/etc/dhcpcd.confの設定を変更する必要があり、Raspberry Pi上でテキストエディタで書き換える必要があります。
viコマンドで編集しようとおもいましたが、Raspberry Piインストール直後は、本家viコマンドしかインストールしかされておらず、私にとっては使いづらかったため、vimを追加でインストールします。

```shell
sudo apt-get install vim
```

vimのインストールが完了したら、/etc/dhcpcd.confをvimでオープンします。

```shell
vi /etc/dhcpcd.conf
```

dhcpcd.conf内にはIPアドレスを静的に設定する箇所がコメントアウトされています。以下の設定のコメントを解除し、Wifi環境にあわせて設定を変更します。
以下は設定の一例です。

```text:/etc/dhcpcd.conf
# Example static IP configuration:
interface wlan0                         <- コメント解除。無線LANインターフェース名に変更
static ip_address=192.168.1.101/24      <- コメント解除。IPアドレスを指定。
# static ip6_address=XXXXXXXXXXX
static routers=192.168.1.1              <- コメント解除。RouterのIPアドレスを設定。
static domain_name_servers=192.168.1.1  <- コメント解除。RouterのIPアドレスを設定。
```

/etc/dhcpcd.confを保存後、rebootコマンドでRaspberry Piを再起動します。

```shell
sudo reboot
```

rebootコマンド実行後、ssh接続が切断されたらLANケーブルを外し、Wifi経由で設定した固定IPアドレスでssh接続ができれば成功です。

# 終わりに
Raspberry Piの初期セットアップの際はさまざま機材が必要で面倒でしたが、この方法ならLANケーブル１本で完結できるので、準備が非常に楽になりました。
【zsh, bash】macでPATHを通す方法  - not found と出てしまったら

## やること

__1. `~/.zshrc`(あるいは `~/.bash_profile` )に任意のPATHを追記__
__2. `source` で反映させる。__

上の2点を達成できればいいので無理に `vi` や `vim` を使う必要はありません。
とにかくPATHを追記してsourceしてください。
ref: [vim/vi](#vivim)


## 1. 設定ファイルの作成
### a. デフォルトシェルを確認
macOS Catalina以降はzshです。

```shell
$ echo $SHELL        // デフォルトシェルを表示する
/usr/local/bin/zsh   // zshの場合
```
ターミナルの設定ファイルが存在しない場合はシェルに応じた設定ファイルを作成してください。
- bashの場合 `.bash_profile` 
- zshの場合 `.zshrc`


### b. シェルに応じた設定ファイルを作成
```shell
$ cd ~                // ホームディレクトリに移動する
$ ls -a               // カレントディレクトリの情報を表示する
```
`.zshrc` または `.bash_profile` が存在しなければここで表示されません。
それぞれのシェルに応じた設定ファイルを作成しましょう。

``` shell
$ touch .zshrc 
  または
$ touch .bash_profile 
```

vimコマンドで作成と編集を同時に行うことも可能です: [vim/vi](#vivim)


<br>

## 2. 設定ファイルの編集
### a. 作成した設定ファイルを編集する

```
$ open ~/.zshrc  
  または
$ open ~/.bash_profile
```

テキストエディタを選択する場合: [open](#open)

### b. 設定ファイルに追記する

インストールしたものによってパスは異なります。

```
export PATH=(パス):$PATH
```

例） nodebrewでnode.jsを管理している場合は以下のようになります。

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

編集後、保存してください。

### c. 追記した内容を反映する
これ、忘れがちです。

```
$ source ~/.bash_profile
```

### d. 確認
バージョンを確認するコマンドを実行することで確認します。
これもnodeの例です。

```
$ node -v
v12.16.1       // pathが通っていない場合はcommand not foundになる
```

通りませんか？ 編集後に保存して `source` しましたか？

## Appendix
### vi/vim

| key       | 内容           |
|-----------|----------------|
| i | 挿入モード |
| [esc] | コマンドモード |
| ZZ | 上書き保存しvimを終了 |
| :w |  内容を保存 |
| :q! | 保存せずに終了 |
| h,j,k,l | ←,↓,↑,→(移動) |

参照：[よく使う Vim のコマンドまとめ](https://qiita.com/hide/items/5bfe5b322872c61a6896)

### open
`$ open ~/.bash_profile -a Atom` のように `-a + [Application]` でテキストエディタを指定できます
オフラインリアルタイムどう書く F10 のPython実装例 

他の方と解き方が同じで投稿するほどでもないかと思っていたのですが、何か参考になることもあるかと思い残しておきます。

問題 : http://nabetani.sakura.ne.jp/hena/ordf10updown/
実装リンク集 : https://qiita.com/Nabetani/items/dae474bc17827f9b1537

```py
def number2yx(number):
    b = int((number - 1) ** 0.5)
    start = b ** 2 + 1
    a = min(number - start, start + b * 2 - number)
    return (a, b) if (b % 2 == 1) ^ (a == number - start) else (b, a)

def yx2number(y, x):
    if y < 0 or x < 0: return '-'
    a, b = sorted((y, x))
    start = b ** 2 + 1
    return start + (a if (b % 2 == 1) ^ (a == y) else b * 2 - a)

def solve(data):
    y, x = number2yx(int(data))
    return ','.join(str(yx2number(y + dy, x + dx))
                    for dy, dx in ((-1, 0), (1, 0), (0, -1), (0, 1)))

def test(data, expect):
    answer = solve(data)
    print("%s %s %s %s" % (answer == expect and 'OK' or 'NG', data, expect, answer))

test( "1", "-,2,-,4" );
test( "10", "9,25,-,11" );
test( "1", "-,2,-,4" );
test( "2", "1,9,-,3" );
test( "4", "-,3,1,5" );
test( "26", "25,49,-,27" );
test( "43", "42,56,44,58" );
test( "72", "71,73,57,93" );
test( "82", "81,121,-,83" );
test( "91", "92,112,90,110" );
test( "100", "-,99,65,101" );
test( "122", "121,169,-,123" );
test( "141", "142,140,104,148" );
test( "145", "-,146,144,196" );
test( "320", "321,319,261,329" );
test( "504", "503,505,465,557" );
test( "563", "564,562,498,590" );
test( "906", "905,907,895,1019" );
test( "1047", "1046,1048,1002,1134" );
test( "1111", "1068,1204,1110,1112" );
test( "1338", "1257,1401,1339,1337" );
test( "1613", "1612,1614,1588,1752" );
test( "1845", "1686,1854,1846,1844" );
test( "1921", "1922,1920,1780,1952" );
test( "2517", "2516,2518,2484,2688" );
test( "2670", "2671,2669,2535,2739" );
test( "2798", "2613,2821,2799,2797" );
test( "2841", "2778,2994,2840,2842" );
test( "2896", "2897,2895,2725,2937" );
test( "3050", "3001,3225,3049,3051" );
test( "3354", "3355,3353,3147,3375" );
test( "3563", "3564,3562,3402,3638" );
test( "4454", "4261,4525,4455,4453" );
test( "5397", "5262,5558,5396,5398" );
test( "5592", "5363,5659,5593,5591" );
test( "6122", "6121,6123,6047,6363" );
test( "6772", "6771,6773,6677,7009" );
```
IBM Cloud で Natural Language Classifier (NLC) のサービスを作成して資格情報 (Credentials) を払い出すコマンド


# はじめに

件名そのままです。備忘まで。
引数の説明を追加しました(3/13)
GUIでやりたい人はこちらをご覧ください (https://qiita.com/nmakino/items/e5f400881d97762d3a14)

## 要約

要約するとこうです。

```
> cf login
> cf create-service natural_language_classifier standard "NLC-demo-makino-20180313"
> cf create-service-key "NLC-demo-makino-20180313" "Credentials-1"
> cf service-key "NLC-demo-makino-20180313" "Credentials-1"
```

- 引数説明
 - ``natural_language_classifier`` はサービス名です。``cf marketplace``で確認します。
 - ``standard`` はプラン名です。こちらも``cf marketplace``で確認します。
 - ``NLC-demo-makino-20180313`` はサービスインスタンスの名前です。好きなものを付けます。
 - ``Credentials-1`` は資格情報の名前です。このままでかまいません。
 
- 補足
 - cfコマンドはここからインストールします。(https://docs.cloudfoundry.org/cf-cli/install-go-cli.html)
 - プロンプトが「>」なのはWindowsでコマンドプロンプトを使ったからです。

以下詳しいログです。

## ログイン

API endpoint、ID、PWを入力後、組織とスペースを指定します。
エンドポイントで作成されるリージョンは決まってしまうようです。
(参考: https://qiita.com/hrs-nkym/items/64a0ad13ea0a2aad8267) 

```
>cf login
API endpoint> api.ng.bluemix.net
Email> 自分のID(メールアドレス)を入れる
Password> パスワード入れる
Authenticating...
OK

Select an org (or press enter to skip):
1. XXXX
2. YYYY

Org> 1 ※番号で選ぶ
Targeted org XXXX

Select a space (or press enter to skip):
1. AAAA
2. BBBB

Space> 1 ※番号で選ぶ
Targeted space AAAA

API endpoint:   https://api.ng.bluemix.net (API version: 2.92.0)
User:           makino[at]example.com
Org:            XXXX
Space:          AAAA
```

## サービス作成

サービス名とプラン名を指定してサービス作成します。

```
>cf create-service natural_language_classifier standard "NLC-demo-makino-20180313"
Creating service instance NLC-demo-makino-20180313 in org XXXX / space AAAA as makino[at]example.com...
OK
```

引数はそれぞれ以下を指定します。

- ``natural_language_classifier`` はサービス名です。``cf marketplace``で確認します。
- ``standard`` はプラン名です。こちらも``cf marketplace``で確認します。
- ``NLC-demo-makino-20180313`` はサービスインスタンスの名前です。好きなものを付けます。

## 資格情報（サービスキー）の作成

サービスインスタンス名、資格情報の名前を指定して、資格情報作成します。

```
>cf create-service-key "NLC-demo-makino-20180313" "Credentials-1"
Creating service key Credentials-1 for service instance NLC-demo-makino-20180313 as makino[at]example.com...
OK
```

引数は以下です。

- ``NLC-demo-makino-20180313`` は create-service で指定したサービスインスタンス名を指定します。
- ``Credentials-1`` は資格情報の名前です。このままでかまいません。

## 認証情報を表示

サービスインスタンス名、資格情報の名前を指定して、作った認証情報の中身を表示します。

```
>cf service-key "NLC-demo-makino-20180313" "Credentials-1"
Getting key Credentials-1 for service instance NLC-demo-makino-20180313 as makino[at]example.com...

{
 "password": ".....",
 "url": "https://gateway.watsonplatform.net/natural-language-classifier/api",
 "username": "....."
}
```

引数は以下です。

- ``NLC-demo-makino-20180313`` は ``cf create-service`` で指定したサービスインスタンス名を指定します。
- ``Credentials-1`` は ``cf create-service-key`` で指定した資格情報の名前を指定します。

出てきた3つの値をコピーしておき、APIを呼ぶときに使います。

# その他

- GUIの手順 (https://qiita.com/nmakino/private/e5f400881d97762d3a14)
rails c、rails routesコマンド不要 gem annotate

ずっと抱えていた次の悩みを解消してくれるgemを知ったので、まとめました。

・このモデルどういうカラムもってたっけ？、どういう型だったっけ？と思っとき、`rails c`する。

・ルーティングを確認したいとき、`rails routes`コマンドをたたく。

gem annotateを使うと、これらの作業が不要になります。

#gem annotateの概要
・schema情報をモデルの上部もしくは下部にコメントとして表示
・ルーティング情報をroutes.rbの上部もしくは下部にコメントとして表示

#実行環境
ruby 2.3.0
Rails 5.1.5

#手順（schema情報の追加）

```ruby:Gemfile
gem 'annotate'
```

```ruby:ターミナル
bundle install
```

```ruby:ターミナル
bundle exec annotate
```
モデルを確認すると、以下のように、ファイルの上部にコメントが追加されている。
<img width="510" alt="スクリーンショット 2018-03-11 23.16.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/242288/0f46627f-5d8e-5950-e955-2978a1e46ccf.png">

同時に、fixtures、test、spec、factoryの各ファイルにもコメントが表示される。

**参考**
`rake db:migrate`を実行すると自動的にannotateさせたい場合は、次のコマンドをたたく。

```ruby:ターミナル
rails g annotate:install
```

`rake db:migrate`を実行すると同時にannotateさせたくない場合は、`rails g annotate:install`は実行せず、`rake db:migrate`の都度、`bundle exec annotate`を実行する。

#手順（routes.rbにルーティング表示）
ターミナルで次のコマンドを実行

```ruby:ターミナル
annotate --routes
```
rails routesをたたいたときの実行結果がコメントとして表示される。
<img width="592" alt="スクリーンショット 2018-03-11 23.28.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/242288/5eb3146a-e901-5050-b4e5-99d2f1ab536c.png">

#参考にしたサイト
[github:annotate_models](https://github.com/ctran/annotate_models)
apm publishコマンドでAtomパッケージが公開できないときのトラブルシューティング

`apm publish`コマンドでAtomパッケージを公開するときにエラーが発生してハマったので解決方法を共有したいと思います。

## GitHubに2段階認証を設定していると公開時にコケる
1. ローカルリポジトリでリリースタグを付与
2. リモートリポジトリにプッシュ
3. パッケージ更新APIを叩いて、新バージョンがリリースされたことを通知

まず、Atomパッケージを公開するときは`apm publish`コマンドを実行しますが、そのときの処理は上記のとおり行われているようです。

```
$ apm publish minor
Preparing and tagging a new version ✓
Pushing v0.5.0 tag Username for 'https://github.com': kentaro-m
Password for 'https://kentaro-m@github.com':
✗
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/kentaro-m/coverage-markers/'
```

今回は2番目のリモートリポジトリへのプッシュで認証がうまく行かずにこけてしまいました。

## 解決方法は2つ

### 手動リリース: Gitタグをプッシュして、タグ指定して公開
```
$ git push origin vX.Y.Z
```

一度`apm publish`を実行すると、ローカルリポジトリではリリースタグが付与されているので、そのタグをリモートにプッシュします。

```
$ apm publish --tag vX.Y.Z
```
リモートにプッシュしたタグを指定して、`apm publish`を実行するとパッケージが公開できます。

### 自動リリース: パーソナルアクセストークンで認証して公開
```
$ apm publish minor
Preparing and tagging a new version ✓
Pushing v0.5.0 tag Username for 'https://github.com': kentaro-m
Password for 'https://kentaro-m@github.com': <repo権限をもったパーソナルアクセストークン>
```
`apm pubslish`コマンド実行時の認証で、GitHubログイン時に使用しているパスワードの代わりにパーソナルアクセストークンを使用すると問題なく認証できます。

<img width="768" alt="パーソナルアクセストークンの設定画面" src="https://qiita-image-store.s3.amazonaws.com/0/38478/522348e3-5d04-7625-4da2-7398b98353c4.png">

パーソナルアクセストークンは[GitHubの設定ページ](https://github.com/settings/tokens)から作成できます。権限はrepoを付与します。

## さいごに
Atomパッケージ公開のトラブルシューティングについて紹介しました。このようなAtomパッケージ開発時のトラブルはGitHubの[Atom Organization](https://github.com/atom)配下のIssueを見ると解決策が載っていたりするので困ったときはそちらを参照するのが良いかと思います。