OmniAICreator/Qiita-1.07M huggingface dataset:
Symfony 1.4のschema.ymlからRuby on Railsのmodelを生成する

昔からあるプロジェクトを移行しようと思ったときに、とりあえず移行先のプロジェクト
でDBにアクセスして、挙動を確認したり、バッチ処理など、影響の小さい部分から
移行作業を進めたいということがあると思います。
今回はsymfony 1.4のプロジェクトのDBの定義(schema.yml)からRuby on Railsのmodelを作成
してみます。
# Ruby on Railsのmodel Generatorコマンドの確認
Ruby on RailsにはmodelのGeneratorコマンドでmodelを作成することが出来ます。
何もオプションを加えずにgenerateコマンドを実行した場合にはmigrationファイル
まで作成されてしまいますが、

```
$ bin/rails generate model product
      invoke  active_record
      create    db/migrate/20170724105123_create_products.rb
      create    app/models/product.rb
      invoke    test_unit
      create      test/models/product_test.rb
      create      test/fixtures/products.yml
```
model generator コマンドで引数を指定せずにusageを表示してみると
--no-migrationを加えることで、migrationファイルを作成せずに
modelファイルを作成できることがわかります。

```
$ bin/rails generate model
Usage:
  rails generate model NAME [field[:type][:index] field[:type][:index]] [options]

Options:
      [--skip-namespace], [--no-skip-namespace]  # Skip namespace (affects only isolated applications)
      [--force-plural], [--no-force-plural]      # Forces the use of the given model name
  -o, --orm=NAME                                 # ORM to be invoked
                                                 # Default: active_record

ActiveRecord options:
      [--migration], [--no-migration]        # Indicates when to generate migration
                                             # Default: true
...
```

--no-migrationを指定して実行すると、migrationファイルを作成せずに
modelのみが作られることが確認できます。

```
$ bin/rails generate model product --no-migration
      invoke  active_record
      create    app/models/product.rb
      invoke    test_unit
      create      test/models/product_test.rb
      create      test/fixtures/products.yml
```

# RakeタスクからのGeneratorコマンドの実行
--no-migrationのオプションをつけてgenerate modelをすれば、modelが
作成されることは分かりましたが、modelが多い場合はコマンドを手作業で
実行するのも大変になります。
そのためにSymfonyのschema.ymlを読み取って、rakeで一括でgenerate modelを
する仕組みを作ります。
以下のようにrakeからRails::Generators.invokeを使うことで
generate modelと同じ処理をすることが出来ます。

```
Rails::Generators.invoke 'active_record:model', ["product", "--no-migration" ]
```


例えば、symfonyのチュートリアルサイト [3日目: データモデル - - Symfony](http://symfony.com/legacy/doc/jobeet/1_4/ja/03?orm=Doctrine)にある
schema.ymlをプロジェクトのrootディレクトリに設置して、読み込む場合の処理は
以下のようになります。

```ruby:symfony.rake
namespace :symfony do
  desc "generate model from symfony 1.4 schema.yml"
  task :import_schema => [:environment] do
    schema = YAML.load_file(Rails.root.join('schema.yml'))
    models = schema.keys
    # generate model
    models.each do |el|
      Rails::Generators.invoke 'active_record:model', [el.tableize.singularize, "--no-migration" ]
    end
  end
end
```

schema.ymlとgenerate modelのコマンドの表現を合わせるためにtableizeや
singularizeメソッドを使って、適切な文字にします。
```
bin/rake symfony:import_schema
```

あとは上記のコマンドを実行すれば、modelを作成することが出来ます。
VBScript で Excel ファイルの「ウィンドウ枠の固定」をしている位置を取得する

Excel VBA でウィンドウ枠の固定位置を取得したい場合、Web で検索すると ActiveWindow の SplitRow と SplitColumn を利用する方法か ScrollRow と ScrollColumn を利用する方法のいずれかがヒットします [^1]。

しかし VBScript（Excel.Application 経由）で同メソッドを使用すると、期待した値が返ってこないケースがありました。

仕方なく私は ActiveWindow.Panes(1) つまり分割されている左上の領域の情報も利用して、次のように取得しました [^2]。

```vbnet
Dim rw, cl
With xlsObj.ActiveWindow
    If 1 < .Panes.Count() Then
        rw = .SplitRow + .Panes(1).ScrollRow
        cl = .SplitColumn + .Panes(1).ScrollColumn
    Else
        ' ウィンドウ枠の固定や分割がされていない
        rw = 0
        cl = 0
    End If
End With
```

[^1]: ちなみに後者を利用します。前者は A1 セルが見えていない状態でウィンドウ枠の固定を行うと期待した値が返らないためです。

[^2]: このサンプルでは説明を簡略化するため Excel ファイルを開くなど、一部の処理を割愛しています。
PHPで機械学習(php-ml)

# 概要
もう機械学習といえばやって当たり前でしょくらいの感覚になりつつあるような気がして
以前ちょっとさわってはみましたが、、、

* [【初心者向け】MacでDockerを使ってTensorFlowを試す(Jupyter Notebook)](http://qiita.com/hikarut/items/ce0ab9bcc6d2a7d7aa05)
* [【初心者向け】MacでDockerを使ってTensorFlowの画像認識を試す](http://qiita.com/hikarut/items/c7a0e45a962b16c7907a)

本当にサンプルを実行するだけ何となく動きはわかったものの、例えばこれを使って何かプロダクトに反映する
みたいな部分は難しいなぁと思っていました。
理由は**Pythonが読めない、書けない！**(笑)のも大きな理由だなと思い、
普段慣れているPHPで機械学習がないかと探したところ良さそうなものがあったので試してみました。


# 準備
composerでパッケージのインストール


```
$ sudo composer require php-ai/php-ml
```

以上。

# サンプルコード
サンプルコードもいっぱい乗っていますが、いくつかピックアップして紹介します。


## k近傍法
k近傍法は、ほぼあらゆる機械学習アルゴリズムの中で最も単純である。あるオブジェクトの分類は、その近傍のオブジェクト群の投票によって決定される（すなわち、k 個の最近傍のオブジェクト群で最も一般的なクラスをそのオブジェクトに割り当てる）

* [k近傍法](https://ja.wikipedia.org/wiki/K%E8%BF%91%E5%82%8D%E6%B3%95)
* [K最近傍分類器](http://mogile.web.fc2.com/phpml/20170529/machine-learning/classification/k-nearest-neighbors/)

サンプルコードの実行

```php
require_once 'vendor/autoload.php';

use Phpml\Classification\KNearestNeighbors;

$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];

$classifier = new KNearestNeighbors();
$classifier->train($samples, $labels);

echo $classifier->predict([3, 2]);
// return 'b'
```

## 複合線形回帰
線形回帰に付いている複合という単語は、2つ以上の標本パラメータが目的を予測するために使われることを意味します。

* [最小二乗線形回帰](http://mogile.web.fc2.com/phpml/20170529/machine-learning/regression/least-squares/)

サンプルコード

```php
require_once 'vendor/autoload.php';

use Phpml\Regression\LeastSquares;

$samples = [[73676, 1996],
            [77006, 1998],
            [10565, 2000],
            [146088, 1995],
            [15000, 2001],
            [65940, 2000],
            [9300, 2000],
            [93739, 1996],
            [153260, 1994],
            [17764, 2002],
            [57000, 1998],
            [15000, 2000]];
$targets = [2000,
            2750,
            15500,
            960,
            4400,
            8800,
            7100,
            2550,
            1025,
            5900,
            4600,
            4400];

$regression = new LeastSquares();
$regression->train($samples, $targets);
echo $regression->predict([60000, 1996]);
// return 4094.82
```

## ピアソン相関
2つの確率変数の間にある線形な関係の強弱を測る指標である。
普通、単に相関係数といえばピアソンの積率相関係数を指す。

* [相関係数](https://ja.wikipedia.org/wiki/%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0)
* [統計値](http://mogile.web.fc2.com/phpml/20170529/math/statistic/)

サンプルコード

```php
require_once 'vendor/autoload.php';

use Phpml\Math\Statistic\Correlation;

$x = [43, 21, 25, 42, 57, 59];
$y = [99, 65, 79, 75, 87, 82];

Correlation::pearson($x, $y);
// return 0.549
```

# 感想
導入からサンプルコード実行までかなり簡単に使えると思いました。PHPが慣れている人ならサンプルコードから実際に学習データを何かしらのプロダクタトに反映させて機械学習を取り入れるというのできそうかなという印象でした。やはり普段慣れているコードだと違うなと実感しました。笑
ただ他の資料とかでも見ますがやはりPythonができるならPythonを使った方がいいのかなと思います。(TensorFlow,Chainer,Kerasなどなど)
こちらにもあるようにPythonは人気が高まりつつあるような気もするので、そろそろ勉強した方がいいのかなと思いました。。([Pythonが2017年の覇権言語に](http://www.softantenna.com/wp/software/ieee-spectrum-top-programming-languages-2017/))


# 参考資料
* [php-ml](https://github.com/php-ai/php-ml)
* [PHP-ML - PHPのための機械学習ライブラリ](http://mogile.web.fc2.com/phpml/20170529/)
* [PHP-MLを使用して気軽に機械学習にトライしてみる](https://www.slideshare.net/serima1/phpml)
Node-RED で MariaDB にアクセスする

次の４つのノードを配置して、結ぶ。
"http in" "template" "mysql" "http response"

![mysql_jul2401.png](https://qiita-image-store.s3.amazonaws.com/0/179446/25e977ea-cf2f-09d7-4947-8d7a89ab45ff.png)

"template"
設定先を、msg.topic とし、テンプレートに SQL 文　(select * from cities) を入れる


![mysql_jul2402.png](https://qiita-image-store.s3.amazonaws.com/0/179446/90545fbd-0e99-9f3d-39f9-4a7e94e3b273.png)

"mysql"
user,password,database を設定する

![mysql_jul2403.png](https://qiita-image-store.s3.amazonaws.com/0/179446/18ecd304-2f65-38b5-77c1-65e06a8072ef.png)

デプロイしてから、ブラウザーでアクセスした結果

![mysql_jul2404.png](https://qiita-image-store.s3.amazonaws.com/0/179446/9fb9eeda-c07a-aa66-5124-2e51f4d80442.png)

MariaDB (MySQL) に、mysql コマンドでアクセスした状況

![mysql_jul2405.png](https://qiita-image-store.s3.amazonaws.com/0/179446/78749a92-c103-ef18-4438-ea35e823f41c.png)
WindowsでRails環境を構築する

#始めに
WindowsでRails環境を構築する手順を記載する
開発環境は以下の通り
Windwos10
JRuby 9.1.12.0
Oracle12

#序章
前回の投稿でNetBeansを使ってRubyの実行環境まで整えた。
NetBeansにはRailsを自動的にインストールする機能があるから、すぐにRails開発ができる・・・
わけではない（笑）
というのも、現時点（2017年7月24日段階)でのRailsの最新版は5.12で"rails sever"コマンドを実行するためには、Ver5以上のactiverReordが必要だ
一方でJRubyからactiverecordを使うためにはactiverecord-jdbcsqlite3-adapterが必要で、この最新版がactiverReord ver5に対応していない（泣）
このままだと、NetBeansでRailsのプロジェクトが作成できないので、activerecordのver4系を使うため、RailsのVerを落としてRailsプロジェクトを作成する必要があるので、以下、その手順を示す

#NetBeansでRails5.12のプロジェクトを作成する
NetBeansでRails5.12のプロジェクトを作成しようとすると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/11892371-f960-b83a-8b71-f891b701b2ff.png)
プロジェクトがいつまでたっても作成されない
ためしに、コマンドラインでrails serverを実行すると
```
Bundler::GemRequireError: There was an error while trying to load the gem 'activerecord-jdbcsqlite3-adapter'.
Gem Load Error is: undefined method `alias_method_chain' for #<Class:ActiveRecord::Base>
```
がでており、activerecord-jdbcsqlite3-adapterとactiverecordのverがあっていないことが分かる

#Rails4.2.9を導入する
activerecordのverを4系にダウングレードさせるにはRailsもver4系にダウングレードさせる必要がありそうだ。
以下、Railsをver4系にダウングレードさせる方法を記載する
##Rails5.12のアンインスト―ル(※1) 
以下のコマンドでRails5.12をアンインスト―スする
`gem uninstall -v 5.1.2 rails`

(※1)Rails5.1.2は別にアンインストールする必要はない。Rails5.1.2とRails4.2.9が両方存在して、Rails4.2.9でRailsプロジェクトを作成したい場合は
`rails _4.2.9_ new アプリケーション名`
のコマンドを打てばよい。
ただ、どうせRails5.1.2は今のところ使う予定がないので、不必要なVerはあると間違いのもとになるので削除することにした

##Rails4.2.9のインストールする
以下のコマンドでRails4.2.9をインストールする
`rails install -v 4.2.9`

##Railsアプリケーションを作成する
お決まりのコマンドでRailsモジュールを作成する
`rails new mysample`
次にRailsサーバーをこれもお決まりのコマンドで立ち上げる
`rails server`
サーバーが立ち上がったら、コンソールに表示されている
`http://localhost:3000`
をブラウザに入力して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/9246f6cf-93d0-3565-1746-761d671ae647.png)
が表示されれば、疎通は無事完了している

#NetBeansでのRails4.2.9プロジェクトの作成
NetBeansでRails4.2.9を指定してプロジェクトを作成してみる・・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/8a821ba6-e588-c7e7-4bba-4b859318bc79.png)
が↑のようなエラーが出てうまくいかない
NetBeans上でRails4.2.9のモジュールを扱うためには以下の手順を踏む必要がある
##コマンドプロンプトでrailsプロジェクトを作成する
`rails new mysample11`
のようにコマンドプロンプトでrailsプロジェクトを作成しておく
##作成したプロジェクトをNetBeans上に取り込む
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/8e89a6c2-ad02-fc88-448f-3f2b9e549a67.png)
「Ruby on Rails Application with Existing Sources」
から先ほど作ったプロジェクトをNetBeans上に取り込むとNetbeans上でRailsの開発ができるようになる
AWS 認定ソリューションアーキテクト – プロフェッショナル 合格までに勉強したこと

# 概要

AWS 認定ソリューションアーキテクト – プロフェッショナル　合格までに勉強したことを共有します。

私のスペックは[アソシエイト合格までの経緯](http://qiita.com/sugiyasu-qr/items/878794c67c0a36749ff5)を参照ください。

# まず初めに模擬試験を受けてみる

サンプル問題を見た後、すぐに模擬試験を受けました。
アソシエイト合格で貰えるバウチャーを使うと無料で受けられます。
アソシエイトの勉強の時は BlackBelt の資料を読み込んだだけで対応できましたが、それでは無理っぽいなと思いました。サービスを使う上での勘所、嵌り所を良く分かっている必要がありそうです。

ここで「敵を知った」ことで効率良く勉強できたと思います。

# 勉強する

アソシエイト勉強の時に読んだ BlackBelt の資料を読み返しましたが、それだけでなく、AWS公式サイトの「よくある質問」(https://aws.amazon.com/jp/faqs/) を読みました。
公式サイト以外だと[クラスメソッドさんの入門記事](http://dev.classmethod.jp/series/aws-re-entering-2015/)なども少し読みましたが、やはり「よくある質問」を読むのが一番重要だと思います。

# 試験を受ける

80問で170分です。約3時間の試験です。
1問あたり2分なので、良く分からない問題で考え込むと時間がキツくなります。タイムマネジメントはしっかりしましょう。

# 感想

所詮ペーパーテストではありますが、様々なサービスやセキュリティ、ネットワークについて勉強することで、AWSのユーザーとして確実にレベルアップができたなと思います。
AWSのプロを目指すなら、取った方がいい資格だと思います。
Azure Function CD/CI (App Service Editor Ver.)

# 前回の積み残し

[前回記事](http://qiita.com/ykajiro/items/fafdbe0690313331dc3d)

前回記事での検証事項の残タスクである、
キー情報の変更です。

スロットを利用したスワップでもキー情報は変更されません。
function毎にcodeを設定することは難しいので、
masterキーを利用することになるかと思います。
このmasterキーは変更されないので、
認証については一旦問題ないです。

デプロイ時のダウンタイムの検証については、
functionsが遅すぎて検証できませんでした。
shellでloopで100回程回してみましたが、
レスポンスが遅く常に切れている状態でした。
おそらく並列度を設定しないと行けないです。
また、初回起動が遅い点については対策が必要そうです。


# CD/CIについての検討

前回githubとの連携を行いました。
githubでのデプロイはローカルでの検証ができません。
また、ポータルでもReadOnlyとなります。

つまり、レビュー時は机上での確認しかできず、マージ後に動確という流れになります。
これはうまくgithubフローに乗っていないので、別の方法を検討します。

Azure Functionsは[ローカルで起動できるランタイム](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-runtime-overview)も提供しています。
要件にはWindows OSやWindows Server、SQL Serverなどが必要となっています。
これはMacでは無理な話なので、じゃあ開発インスタンスをAzureで用意するといったことが考えられます。
結構面倒な話になってきました。

代案となるのがApp Service Editorです。
「いづれかのAzure Functions」->「プラットフォーム機能」->「App Service Editor」で起動できます。
App Service Editorはオンライン版Visual Studio Codeです。

# App Service Editor調査

はじめに、App Service Editorですが認証の仕組みがよくわからず、
Functionsによっては起動したり、slotでは認証エラーとなったり、
別のslotで起動できたりと状況がわかりませんでした。。
これを本番運用に組み込むのは難しいです。
inkでターミナルappを作る


[ink](https://github.com/vadimdemedes/ink)とは、ターミナル上で動くインタラクティブなアプリケーションをReactライクに作ることのできるフレームワークです。
あくまでもReact **ライク** であって、Reactそのものが動いているわけではありません。
React周辺の知識がある程度あれば、誰でもアプリケーションを作ることができます。

↓こんな感じのものが簡単にできます。(デモ用に作った、なるべくたくさんのコンポーネントを使っただけの無意味なアプリケーションです。[GitHubのリポジトリ](https://github.com/y-takey/ink-all-stars))
![demo](https://raw.githubusercontent.com/y-takey/ink-all-stars/master/.github/demo.gif)

ちなみに[react-ink](https://github.com/vigetlabs/react-ink)等の類似モジュールがありますが、それらとは無関係です。

この記事ではinkのREADMEを見ただけでは分かりにくいであろう、環境の作り方等を記します。

# 手順

## 0. 新規作成

適当なディレクトリを作り、普通のnpmと同じように `yarn init` します。
聞かれる各種事項には適当に答えてください。

## 1. 使用モジュールのインストール

ink本体の他にbabel-cli, babel-core, babel-plugin-transform-react-jsxも必要になるので併せてインストールします。
(厳密には必須ではないですが、ないと不便なので使用を推奨します。)

```
$ yarn add -D ink babel-cli babel-core babel-plugin-transform-react-jsx
```

なお、ink自体はコンポーネントとしては小さなライブラリですので、必要に応じで追加コンポーネントをインストールします。詳しくは後述します。

## 2. babelの設定

inkでは `h` というプラグマが使用されるため、以下のようにpackage.jsonに追加しておきます。

```json
  "devDependencies": {
    ~
  },
  "babel": {
    "plugins": [
      [
        "transform-react-jsx",
        {
          "pragma": "h",
          "useBuiltIns": true
        }
      ]
    ]
  }
```

## 3. アプリケーション本体の作成

適当にアプリケーション本体をsrc/index.jsに作るとします。

```js
const { h, render, Component } = require('ink');

class App extends Component {
  render() {
    return <div>Hello ink</div>;
  }
}

render(<App/>);
```

前述したpragmaの `h` は一見不要に見えますが、ないと実行時エラーとなります。

## 4. アプリケーションの実行

最終的にはトランスパイルして出力されたファイルをnodeで実行しますが、開発時にはbabel-nodeで実行した方が便利だと思います。
私の場合はpackage.jsonに以下のようなスクリプトを書いておいて、 `yarn ex` ですぐに実行できるようにしました。

```json
{
  "scripts": {
    ~
    "ex": "./node_modules/.bin/babel-node src/index.js"
  },
  ~
}
```

---

ターミナルに"Hello ink"と出力されたら成功です。
ここまでできて、かつReactの知識もあれば後はコンポーネントを作り込んでいくだけです。

# その他の特徴とか

* `componentWillMount` 等のライフサイクルもReactと同じ
* `this.state`や `this.props` もReactと同じ
* reduxも使える
* renderに使用できるプリミティブ要素は `<div>`, `<span>`, `<br>` だけ。divとspanの違いは改行される・されない、程度の認識でOK。("プリミティブ要素"とは便宜的に使っているだけです)
* 2017/07/24時点で以下の追加コンポーネントがある。最新は[README](https://github.com/vadimdemedes/ink#useful-components)を参照
  * [ink-redux](https://github.com/vadimdemedes/ink-redux)
  * [ink-text-input](https://github.com/vadimdemedes/ink-text-input)
  * [ink-password-input](https://github.com/vadimdemedes/ink-password-input)
  * [ink-progress-bar](https://github.com/brigand/ink-progress-bar)
  * [ink-spinner](https://github.com/vadimdemedes/ink-spinner)
  * [ink-console ](https://github.com/ForbesLindesay/ink-console)
  * [ink-image](https://github.com/kevva/ink-image)
  * [ink-checkbox-list](https://github.com/MaxMEllon/ink-checkbox-list)
  * [ink-marquee](https://github.com/y-takey/ink-marquee)
  * [ink-flower](https://github.com/y-takey/ink-flower)

(手前味噌ですが、下２つの `ink-marquee`, `ink-flower` は私が作りました。)
AngularのSPAをローカルでサクッと確認するにはangular-http-serverが便利

AngularでのSPA開発に便利な、[angular-http-server](https://www.npmjs.com/package/angular-http-server)というnpmパッケージの紹介です。

以前から開発環境で使っている、[http-server](https://www.npmjs.com/package/http-server)というパッケージ。 
`http-server`というコマンドを実行するだけでカレントディレクトリをドキュメントルートにした簡易HTTPサーバーが立ち上がるという便利なやつです。
しかし、ビルド済みのAngularプロジェクトをhttp-serverで実行すると、「存在しないパスを指定した際にindex.htmlにリダイレクトする」という設定がされていないために、ルーティングの確認ができません。
そんな時便利なのが、[angular-http-server](https://www.npmjs.com/package/angular-http-server) いかにもすぎる名前ですが、「存在しないパスを指定した際にindex.htmlにリダイレクトする」という設定がされているため、ルーティングの確認も行うことができます。  

## インストール

どこでも実行できるように、今回はグローバルにインストールします。

```bash
$ npm install -g angular-http-server
```

## 使ってみる

Angular-CLIで作成したプロジェクトを例に、ビルド済みページの動作確認を行ってみます。

まずは、`ng build`でプロジェクトをビルド

```bash
$ ng build
```

プロジェクトルートディレクトリ以下に`dist`ディレクトリが作成され、ビルド済みファイルが作成される。

```
./dist/
├── favicon.ico
├── index.html
├── inline.bundle.js
├── inline.bundle.js.map
├── main.bundle.js
├── main.bundle.js.map
├── polyfills.bundle.js
├── polyfills.bundle.js.map
├── styles.bundle.js
├── styles.bundle.js.map
├── vendor.bundle.js
└── vendor.bundle.js.map
```

`dist`に移動して、`angular-http-server`コマンドを実行します。

```bash
$ angular-http-server
```

ブラウザから`localhost:8080`にアクセスすると、トップページが表示され、その他ルータで設定したパスへのリンクも正常に行えるかと思います。

### オプション

ポート番号指定

```bash
angular-http-server -p <ポート番号>
```

HTTPSでサーバー起動

```bash
angular-http-server --https
```

CORSを有効化

```bash
angular-http-server --cors
```


## 最後に

便利です。
Node-RED で、JSON ファイルを読む

Node-RED で、JSON ファイルを読む方法

１）次の ５つの node を配置する
　"http in" "file" "json" "function" "http response"

![node-red_jul2401.png](https://qiita-image-store.s3.amazonaws.com/0/179446/2c0ddbf9-079b-576e-ad5d-a2ab664720e5.png)

２）"http in"
URL を /json にする

![node-red_jul2402.png](https://qiita-image-store.s3.amazonaws.com/0/179446/d4a17468-02ff-bf72-f32c-32517560268b.png)

３）"file"
ファイル名を入れる　例：/var/tmp/json/cities.json

![node-red_jul2403.png](https://qiita-image-store.s3.amazonaws.com/0/179446/dc99128e-a2a3-efb6-c410-b5a05b979211.png)

４）"json"
デフォールトのまま

![node-red_jul2404.png](https://qiita-image-store.s3.amazonaws.com/0/179446/3c34de89-b3f7-af97-4f50-0d0f1df195e4.png)

５）"function"

![node-red_jul2405.png](https://qiita-image-store.s3.amazonaws.com/0/179446/0dad7d48-7b25-5b8d-aae0-a075b917e7e5.png)

```js
var dict_aa = msg.payload
var str_out = "<table>"
for (var key in dict_aa)
{
     str_out += "<tr>"
     str_out += "<td>" + key + "</td>"
     str_out += "<td>" + dict_aa[key].name + "</td>"
     str_out += "<td>" + dict_aa[key].population + "</td>"
     str_out += "<td>" + dict_aa[key].date_mod + "</td>"
     str_out += "</tr>"
}
str_out += "</table>"
msg.payload = str_out
return msg;
```


６）"http response"
デフォールトのまま

![node-red_jul2406.png](https://qiita-image-store.s3.amazonaws.com/0/179446/14e9a5cd-322d-ae8d-fd76-04f2aa89c6f3.png)

７）node を結んでデプロイする

![node-red_jul2407.png](https://qiita-image-store.s3.amazonaws.com/0/179446/e34701fa-db36-c188-d93d-189084ebe9ba.png)

８）ブラウザーで http://127.0.0.1:1880/json にアクセスする

![node-red_jul2408.png](https://qiita-image-store.s3.amazonaws.com/0/179446/98b64ea7-b434-069c-f7da-2ccad688eb6e.png)

入力に使った JSON ファイル

```json:cities.json
{
 "t0921":
 {"name": "宇都宮",
 "population": 84516,
 "date_mod": "2001-3-16"}
,
 "t0922":
 {"name": "小山",
 "population": 91237,
 "date_mod": "2001-4-21"}
,
 "t0923":
 {"name": "佐野",
 "population": 63489,
 "date_mod": "2001-5-21"}
,
 "t0924":
 {"name": "足利",
 "population": 72561,
 "date_mod": "2001-6-23"}
,
 "t0925":
 {"name": "日光",
 "population": 61743,
 "date_mod": "2001-9-21"}
,
 "t0926":
 {"name": "下野",
 "population": 52398,
 "date_mod": "2001-8-14"}
,
 "t0927":
 {"name": "さくら",
 "population": 45182,
 "date_mod": "2001-7-05"}
,
 "t0928":
 {"name": "矢板",
 "population": 37617,
 "date_mod": "2001-10-14"}
,
 "t0929":
 {"name": "真岡",
 "population": 52698,
 "date_mod": "2001-9-19"}
,
 "t0930":
 {"name": "栃木",
 "population": 47912,
 "date_mod": "2001-11-23"}
,
 "t0931":
 {"name": "大田原",
 "population": 52317,
 "date_mod": "2001-9-22"}
,
 "t0932":
 {"name": "鹿沼",
 "population": 62158,
 "date_mod": "2001-8-25"}
,
 "t0933":
 {"name": "那須塩原",
 "population": 82719,
 "date_mod": "2001-6-27"}
,
 "t0934":
 {"name": "那須烏山",
 "population": 38157,
 "date_mod": "2001-5-14"}
}
```
【Salesforce】サイトで公開したページが「構築中です。」と表示される場合

# トラブルシューティング
以下を確認する
・サイトに対象のVFページを追加しているか。
・サイトゲストユーザプロファイルに、VFページとApexコントローラの権限を与えているか
・移動先のURLのドメインが、サイト用のドメインになっているか

# 補足
×↓
（Apex）
public PageReference nextPage { 
　　get { 
　　　　return Page.VF_NextPage; 
　　}
　　set;
}
（Visualforce）
```<a href="{! nextPage}">次ページ</a>```

○↓
（Apex）
public PageReference nextPage() {
　　return Page.VF_NextPage;
}
（Visualforce）
```<apex:commandbutton action="{! nextPage}" value="次ページ" />```

（下の場合は、Salesforceが裏側でサイト用ドメインにURLを変換してくれるので、サイトゲストユーザプロファイルでも閲覧できる。）



参考
http://shige-mon.blogspot.jp/2017/09/salesforce_27.html
[jQuery] フォームをJSONにしてPOSTする

# あらまし

jQueryを使って、HTMLのフォームでsubmitボタンを押したときにAjaxでPOSTするコードをここにメモしておく。

# コード

```js
$('#postForm').submit((event) => {
  $.post({
    url: "/path/to/post",
    data: $('#postForm').serialize(), // ここで#postFormをもっかい書くのやだなあ
    success: () => { console.log('success'); },
    dataType: 'json',
  })
  event.preventDefault();
})
```

`preventDefault()`しておかないと、普通にPOSTも走ってページ遷移してしまうようだ（試してない）。

# 追記

> `// ここで#postFormをもっかい書くのやだなあ`

コメント頂きましたが、`$(event.currentTarget)`と書けるようです。
やったね！

# 参考

* https://api.jquery.com/jQuery.post/
* https://api.jquery.com/submit/
Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution

```
Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
```

Symfony2でこの謎のエラーが出た場合は、アパッチの再起動するべし！

###参考
http://pentan.info/php/failure_name_resolution.html
【気になるポイントまとめ】jUnit実践入門

https://www.amazon.co.jp/dp/477415377X
これのまとめ。自分の言葉で表現しないとちゃんと理解できないので。あと自分で復習したくなったとき用。
# Part1 jUnit入門
* ユニットテストとは、最も小さい粒度のテストであり、実行できる仕様書となることが特徴だ。さらにその目的は、全てのテストをきちんと書いておけば、影響範囲を気にせず、デグレードを恐れずソースコードを変更できるということを達成するためである
* 検証はまとめて行わずフィールドごとに行う、もしくはカスタムMatcherを使おう。でないとどこが問題かが分かりにくい。
* テストメソッドのthrows句はthrows Exceptionでエラーを詳細に列挙しなくてよい。したところで何もテストに影響は与えない
* テスト対象のクラスやオブジェクトは`sut(System Under Test)`と表記し、はっきりさせる
* 期待値は`expected`、実測値は`actual`と表記することで分かりやすくなる。プロダクトのソースと違い意味合いを変数名にするよりこちらの方がわかりやすい
* できるだけテストを行いやすい（関数的な）メソッドを書こう
  * メソッドが戻り値を持つ
  * 副作用がない
  * 同じ状態、同じパラメータの場合常に同じ値を返す
* SetUp（準備）, Exercise（実行）, Verify（検証）を分けてテストメソッドを書こう
* `@DataPoints`でfixturesをまとめた場合、どのようなデータで失敗したかがメッセージで分からない。`assertThat(msg, actual, expected)`を活用しよう

## Tips
例外の送出を検証する場合
<pre>@Test(expected = IllegalArgumentException.class)</pre>

指定時間で終わらない場合に失敗させる
<pre>@Test(timeout = 100L)</pre>

テストを実行しない
<pre>@Ignore</pre>

各種メソッドに貼るアノテーション

| アノテーション | 命名 | メモ |
|---|---|---|
|`@Before`|public void setUp() throws Exception|各`@Test`の前に1度実行される|
|`@After`|public void tearDown() throws Exception|各`@Test`の後に1度実行される|
|`@BeforeClass`|public void setUpClass() throws Exception|最初の`@Test`の前に1度実行される|
|`@AfterClass`|public void setUpClass() throws Exception|最後の`@Test`の後に1度実行される|

つまり、順序で言うとテストケースが2件ある場合は`@BeforeClass→@Before→@Test→@After→@Before→@Test→@After→@AfterClass`となる
// TODO サンプルつくる

# Part2 jUnitの機能と拡張
* テストをまとめて行うにはSuiteを使えばいいよ。でも結局Mavenとか使う方が便利だよね
* テストコードには同じようなコードが登場しやすい。かといってそれらをまとめるとテストケースの意図が不明瞭になる
* テストクラス内では`@RunWith(Enclosed.class)`を使ってテストをカテゴリごとに分けよう。カテゴリはデータの状態をを基準に分けるとよいかも。なぜならそうすると`@Before`の処理をうまくまとめられるはずなので。// TODO サンプルつくる
* テストクラス間をまたぐ処理を書きたくなったら親クラスを作りがちだが、これは大きな親クラスを作りがちになる手法なので、Utilクラス等を推奨する
* 実際にテストを実行する際に必要なオブジェクトや入力値、期待値といったものをまとめて`fixtures（備品という意味）`と呼ぶ。テストコードではここがどうにも長くなってしまいがちなのでここを工夫しよう
* ユニットテストではfixturesはケースごとに独立しているべき、が基本戦略
* JUnitではケースごとにテストクラスのインスタンスが生成されケースが実行される。そのためクラスのインスタンス変数等はケースごとに初期化される
* fixturesのセットアップにはいくつかパターンがあるよ // TODO サンプルかく
  * インラインセットアップ（テストケースの中に書く）
  * 暗黙的セットアップ（`@Before`に書く。ただ、そこに書くのは共通部分だけでケースの中にも書くのもあり）
  * staticメソッドに切り出す
  * 外部ファイル(yaml,xml)等を用いたセットアップ
* １つのケースに色んなパターンのパラメータでテストを試したい場合は`@Theory`と`@DataPoint`を使おう
* テストランナーを軽く拡張するのが@Rule。tempFolderを簡単に作れたりする

## Tips
### 便利そうなMatcher

| Matcher | Sample | Note |
|---|---|---|
|nullValue| is(nullValue())|
|not|is(not(0))|
|notNullValue|is(notNullValue())|
|sameInstance|is(sameInstance(expected))|プリミティブ型に対して使うとオートボクシングされた参照が比較対象となる|
|instanceOf|is(instanceOf(Sample.class))|
|hasItem|`assertThat(sut.getList(), hasItem("Hello"))`|`hasItems`もあるよ|

その他は、greater, less, empty, is, same, equalとかで `Ctrl+Space` すれば幸せになれるかも。

### カテゴリ化したテストを実行するサンプル
// TODO ちゃんとサンプル作る
<pre>
@RunWith(Categories.class)
@ExcludeCategory(SlowTests.class)
@SuiteClasses(SlowAndFastTest.class)
public class CategoriesTests {
}
</pre>
GUIの無いLinux上でSeleniumからHeadless Chromeを使うとsendKeysでエラーになる

2017/07/24 時点

* ChromeDriver 2.30
* Debian 8 Jessie(Dockerコンテナ上で実行)
* google-chrome-stable 59.0.3071.115-1


Chromeでは、59からヘッドレスモードを利用できるようになりました。

* https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja

元々はXvfbを使ってSeleniumのテストを動かしていたのですが、ヘッドレスにできるなら不要では！と思い、ヘッドレスモードで動かしてみました。

JavaでSeleniumを利用する場合は以下のように`ChromeOptions`で`--headless`と設定を追加してやれば良いです。

```java
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver Driver = new ChromeDriver(chromeOptions);
```
https://thefriendlytester.co.uk/2017/04/new-headless-chrome-with-selenium.html

自身は[Selenide](http://selenide.org/)を使っているので、以下のようにmavenの-Dオプションでシステムプロパティを設定して動かしました。

```bash
$ mvn test -Dchromeoptions.args=headless
```

ヘッドレスモードで実行すると、起動はするのですが以下のエラーが出てきました。
環境的にはGUIの無いLinux上で動かしているのですが、ヘッドレスならXvfbはいらないはず…

```
WebDriverException: unknown error: an X display is required for keycode conversions, consider using Xvfb
```

エラーを調べていくと、以下のバグレポートを発見しました。
どうやらChromeDriverのバグで、`sendKeys`がうまく動かない模様です。
(workaroundとして、JavaScriptで頑張って`sendKeys`などを利用しないようにすれば回避できるようですが、ちょっと面倒過ぎる…)

* [1772 \- Chromedriver running against canary chrome w/ headless flag requires XVFB for sendKey interactions \- chromedriver \- Monorail](https://bugs.chromium.org/p/chromedriver/issues/detail?id=1772)

このバグのステータスはFixedになっており、ChromeDriver 2.31では直るようです。
ただし、記事投稿時点ではまだリリースされていません。(最新は2.30)

* https://sites.google.com/a/chromium.org/chromedriver/downloads

とりあえず直近はheadlessを利用せず、Xvfbで対応しておくのが良さそうです。


## 追記

記事を投稿したら、速攻で [うらがみ⛄\(@backpaper0\)さん](https://twitter.com/backpaper0) から以下のツイートが。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">SelenideならfastSetValue=trueで回避できるかも？と思ったけどどうだろう（適当）( ˙꒳​˙ )</p>&mdash; うらがみ⛄ (@backpaper0) <a href="https://twitter.com/backpaper0/status/889426363781754880">July 24, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

調べると`fastSetValue`を`true`にすると、Seleniumに組み込まれている`sendKey`を利用せず、JavaScriptで実行するようになるとか。(用途としては、高速化目的なよう)

* http://selenide.org/javadoc/4.5/com/codeborne/selenide/Configuration.html#fastSetValue

実際に適用してみると…テストが通る…！！

> (workaroundとして、JavaScriptで頑張ってsendKeysなどを利用しないようにすれば回避できるようですが、ちょっと面倒過ぎる…)

て部分の対応を、`fastSetValue=true`で見事に解決した模様。
しかし、パッとこの対応を思いつくうらがみさん凄い…＼(^o^)／
Nginx の rewrite ディレクティブの ^ って何？

```
server {
    listen 80;
    server_name example.com;
    rewrite ^ https://$host$request_uri? permanent;
}
```

この `^` (キャレット) ってどういう意味なんでしょうか？いつも思考停止でコピペしているので知りませんでした。そこで調べてみました。

[rewrite](http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite) の第 1 パラメータは正規表現で、この正規表現にマッチした URI を第 2 パラメータに置き換えます。`^` は行頭を意味し、`^` のみの場合はあらゆる文字列にマッチします。つまり、あらゆる URI を置き換えるという意味のようです。

ところで、公式のテックブログの [Creating NGINX Rewrite Rules](https://www.nginx.com/blog/creating-nginx-rewrite-rules/) という記事には次のように書かれています。

> This is less efficient than the equivalent return directive, because it requires NGINX to process a regular expression, albeit a simple one (the caret [ ^ ], which matches the complete original URL). The corresponding return directive is also easier for a human reader to interpret: return 301 more clearly indicates that NGINX returns code 301 than the rewrite ... permanent notation does.

```
server {
    listen 80;
    server_name example.com;
    rewrite ^ https://$host$request_uri? permanent;
}
```

は

```
server {
    listen 80;
    server_name example.com;
    return 301 https:/$host$request_uri;
}
```

と書いた方がパフォーマンスがよく、なおかつ「301 redirect を返す」ということが読み取れるので可読性にも優れているということらしいです。なるほど :innocent:
[RxJava] [1,1,2,2,3,3,1,1] を [[1,1], [2,2], [3,3], [1,1]] のようにグルーピングする

# あらまし

RxJavaで入力として取ったデータを一定のルールでグルーピングして受け取りたいケースがあった。
連続しない値はまとめたくないので、[`toMultiMap()`](http://reactivex.io/documentation/operators/to.html)や[`groupBy()`](http://reactivex.io/RxJava/javadoc/rx/Observable.html#groupBy)は使えない。

# 解

こんな感じになった。
題名と違って`true`, `false` を使っているのはどうか見逃してほしい。

同値の判断は`.distinctUntilChanged()`でできるはず。

```java
import rx.Observable;

public class RxJavaPlayground {
	public static void main(String[] args) {
		Observable.just(false, false, true, true, false, true, true)
		.publish(p -> {
			return p.buffer(() -> p.distinctUntilChanged());
		})
		.filter(x -> x.size() > 0)
		.subscribe((x) -> System.out.println(x));
		/*
		 * =>
		 * [false, false]
		 * [true, true]
		 * [false]
		 * [true, true]
		 */
	}
}
```

`.distinctUntilChanged()`で新しいデータが出る（グルーピングが終わる）タイミングで、
そこまで溜め込んだデータを出す（`.buffer()`の機能）ようにしている。

`Observable`を`.buffer()`と`.distinctUntilChanged()`の両方が読むため、`.publish()`でHotにしている。


# 参考

http://stackoverflow.com/questions/31314345/rxjava-buffer-wind
Djangoのmigrateで生成されたSQlite3に接続する

Djangoで開発するとき、標準ではSQlite3を使うように設定されており、ローカル環境で開発するときは、SQliteをそのまま使うケースも多いと思う
基本的にはadminサイトでデータの確認などをすれば良いと思うけど、コマンドラインからテーブルの中身とか構造を確認したい時はmanage.pyがあるディレクトリで下記のコマンドを叩けばDBに接続できる

```
./manage.py dbshell
```

settingsをlocal_settings.pyとかで分けている場合は、以下のコマンド

```
./manage.py dbshell --settings=プロジェクト名.local_settings
```
Linuxコマンド集

便利だったり、よく使ったりするコマンドまとめ。随時更新。  

## ファイルサイズを適当な単位で表示  
- dfは「ディスク・ドライブの使用量」、duは「ディレクトリ内のファイル容量」をそれぞれ表示する  
- .bashrcにエイリアスとして書いておいても良い

```bash  
$ ls -lh  
$ df -h  # ディスク・ドライブ
$ du -h  # ディレクトリ
```

## ファイルの行数などを表示
- 行数、単語数、バイト数の順

```bash
$ wc [option] [file名]

# option
$ wc -l    # 行数のみ
$ wc -w    # 単語数のみ
$ wc -c    # バイト数のみ
```

## ファイルの末尾をリアルタイム表示
- 実行中にファイルが更新されているか確認できて便利

```bash
$ tail -f [file名]
```

## ファイルの結合
- ワイルドカードも使用可能

```bash
$ cat file1.txt file2.txt > new_file.txt

# 元からあるファイルに追記する
$ cat file2.txt >> file1.txt
```

## ディレクトリ内のファイル数をカウント
- lsを使ってカウント
- -1オプションで1行に1ファイルずつ表示させ行数を表示

```bash
$ ls -1 | wc -l

$ ls -U1 | wc -l # ソートしなくすると早くなる（lsはデフォルトでソートするため）

$ ls | wc -w # 単語数でカウントしても良い
```

- findを使ってカウント

```bash
$ find . -type f | wc -l
```

## ファイルの解凍・圧縮
- tar.gz

```bash
$ tar -zxvf xxxx.tar.gz # 解凍
$ tar -zcvf xxxx.tar.gz dirctory # 圧縮
```

- zip

```bash
$ unzip xxxx.zip # 展開
```

- tar

```bash
$ tar -xvf xxxx.tar # 解凍
$ tar -cvf xxxx.tar # 圧縮
```
nmap よく使うオプション

#はじめに
nmapでよく使うオプションをめもる

#オプションとその意味
##-sS
TCPのSYNパケットを送ってSYN+ACKが帰ってくるかを調べる。
TCPコネクションを完璧に開くわけではないので秘匿性が高い。
上記のことから、ハーフオープンスキャンとも呼ばれる。

##-Pn
pingを送らずに、全てのホストが「生存している」とみなす。
大半のネットワークはpingで使われるICMPを許可していないことからこのオプションの仕様が推奨される。

##-A
ターゲットに関するより詳細な情報を検知する。
具体的にはOSとバージョンの検知など

#参考

* [Nmap リファレンスガイド](https://nmap.org/man/jp/)
* [Linuxコマンド集-[nmap]](http://itpro.nikkeibp.co.jp/atcl/column/14/230520/072800001/)
SwiftのProtocolでTraitを実装する


## はじめに

今回は趣味で開発しているアプリでTraitを実装することがあったのでそれのアレ

**Trait** とは **形質**

実装し終わったら「あ〜そういう意味か。」というような納得できました。ミックスイン的なやつらしいです。(ミックスインではない)

## 内容

- Reachabilityを使って各UIViewControllerでネットワークステータスを確認する
- ネットワークステータスに変更があればそれに対応した動作をさせる

ざっとこれ

## 環境

- 情弱社会人2年目iOSエンジニア
- ~~Pythonが好き~~
- Xcode 8.3.3
- Swift 3.1
- macOS Sierra 10.12.4

## 準備

- Xcodeプロジェクトの作成
- ReachabilityをDLして打ち込む [公式](https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html)
  - 公式のものなのでCocoaPods, Carthageなどで入れたやつとかは知らない！！

## サンプル

### CustomViewController.swift

```swift
import UIKit

class CustomViewController: UIViewController {

    fileprivate var reachability = Reachability.forInternetConnection()

    override func viewDidLoad() {
        super.viewDidLoad()
        reachability?.startNotifier()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChange(_:)), name: NSNotification.Name.reachabilityChanged, object: nil)
    }

    deinit {
        reachability?.stopNotifier()
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.reachabilityChanged, object: nil)
    }

    ・・・

    // MARK: - Reachability's notification target method

    func networkStatusChange(_ sender: Notification) {
        let networkStatus = reachability?.currentReachabilityStatus()
        if networkStatus == NotReachable {
            return
        }
        something()
    }
}

// MARK: - ReachabilityStatusChange

extension CustomViewController : ReachabilityStatusChange {}
```

だいたいこんな感じの内容  
今回はオンラインになったときに以下で作成する `something()` メソッドを呼び出す形

### UIViewController+Reachability.swift

とりあえずクラス拡張としてファイルを生成しました。

```swift
import UIKit

protocol ReachabilityStatusChange {
    func something()
}

// これをコメントインした場合は、すべてUIViewControllerに反映される
// extension UIViewController : ReachabilityStatusChange {}

extension ReachabilityStatusChange where Self : UIViewController {

    func something() {
        print("オンラインになった！")
    }
}
```

## 最後に

これですべて動作させたいクラスファイルに関して `something()` メソッドの実装を書くことがなくなった。幸せになれた。  

何か間違い等あればご指摘いただけると幸いです:;(∩´﹏`∩);:
GASをローカル環境で開発

# 参考

参考にしたWebサイト

- [https://github.com/danthareja/node-google-apps-script](https://github.com/danthareja/node-google-apps-script)

## コマンドラインツールでnode-google-apps-scriptインストール

```
npm install -g node-google-apps-script
```

## Googleドライブの認証情報を取得
- googleドライブから任意のフォルダに新規でGoogle Apps Scriptファイルを作成

![newGasFile.png](https://qiita-image-store.s3.amazonaws.com/0/99705/b4819f2d-d74f-b836-aa8d-412165d6a1ed.png)

- 新規作成したGASファイルのリーソース　→　Cloud Platform プロジェクトをクリック
![project.png](https://qiita-image-store.s3.amazonaws.com/0/99705/ceb11878-0124-b899-5ed0-efb97b0bd5b9.png)

- ポップアップ画面が表示されて、青色の[project_name _ project_id_#############]をクリック
![blue.png](https://qiita-image-store.s3.amazonaws.com/0/99705/862de6e3-d3f1-29a5-e9ec-dea8640e7d57.png)

- CloudコンソールのAPI Managerへ遷移するので、ライブラリでGoogle Drive APIを有効にする
![driveApi.png](https://qiita-image-store.s3.amazonaws.com/0/99705/8e58e13b-0094-ba72-e603-865d72c0e28a.png)

- 認証情報を作成 → OAuthクライアントIDをクリック
![oaith2.png](https://qiita-image-store.s3.amazonaws.com/0/99705/b0efb449-e4ad-8e55-a68f-bcd10e13d01a.png)

- アプリケションの種類「その他」にチェック　→　名前を入力→作成
![other.png](https://qiita-image-store.s3.amazonaws.com/0/99705/482aeb3b-75f8-357b-8030-5f68d752a476.png)

- 作成したOAuth2.0クライアントIDのJSONファイルをダウンロード
![json.png](https://qiita-image-store.s3.amazonaws.com/0/99705/4aa4228c-3756-f7c3-74a3-f85d1105dab7.png)

- 任意のディレクトリで任意のフォルダを作成、移動

```
mkdir gas-test
cd gas-test
```

- 先程作成した任意のフォルダーにダウンロードしたJSONファイルを移動

## 認証作業

```
gapps auth client_secret_[クライアントID].json
```

- コマンドライン上に認証にURLが出現
![copy.png](https://qiita-image-store.s3.amazonaws.com/0/99705/47a314a8-f977-d58c-1bd2-d2168fceffe3.png)

- ブラウザを開いて、コマンドラインでコピーしたURLを開く
・アカウント選択
・Google Driveへのアクセスの許可を実行して、下記のページに遷移したら、ページを削除
![close.png](https://qiita-image-store.s3.amazonaws.com/0/99705/b8af4d47-dea5-1a36-0f52-2863792de897.png)


- コマンドラインに戻り、下記の赤枠の「Suuccessfully Authenticated with Google Drive!」が表示されたら認証成功です
![copyAndPaste.png](https://qiita-image-store.s3.amazonaws.com/0/99705/73d43ae9-5e2b-6ba9-5f34-2a171472b2a5.png)

- 認証が終わったら、client_secret_[クライアントID].jsonファイルを削除


## プロジェクトを初期化・アップデート

- はじめに作成したGASファイルのIDで初期化します

```
gapps init [fileID]
```

- src/コード.jsとgapps.cofig.jsonファイルが生成される
- src/コード.jsファイルを修正してコマンドラインでアップロード

```
gapps upload
```

 Google DriveのGASファイルのコード.gsを確認するとソースコードがローカル環境で修正したコード.jsのソースコードにアップデートされていることが確認できます。
Node-RED のかわったノード

単なるメモ。随時更新します。

[mockingbird](https://flows.nodered.org/node/node-red-contrib-mockingbird)
テストデータを吐いてくれる
[data-generator](https://flows.nodered.org/node/node-red-node-data-generator)
これも同様

[web-worldmap](https://flows.nodered.org/node/node-red-contrib-web-worldmap)
地図を描画してくれる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7046/8e20d4d1-8929-e551-9317-d468fe5e58a2.png)

[msg-speed](https://flows.nodered.org/node/node-red-contrib-msg-speed)
msg の速度を毎秒出力してくれる
SSL証明書の期限取得

SSL証明書の期限取得する関数です。戻ってくるのがＪＳＴではないので、調整しています。

```
# ssl の期限の読み込み
def get_ssl_end(domain):
    import ssl
    import OpenSSL
    import datetime
    from datetime import datetime as dt
    cert = ssl.get_server_certificate((domain, 443),
    ssl_version=ssl.PROTOCOL_SSLv23)
    x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
    return((dt.strptime(str(x509.get_notAfter())[2:16],'%Y%m%d%H%M%S')  + datetime.timedelta(hours=9)).strftime('%Y %m %d'))
```
GoogleAppsScript　スクリプトのプロパティの超簡単な使い方

GoogleAppsScriptの`スクリプトのプロパティ`の簡単な説明が無かったので作成。
他にも色々使い方があるけれど、一番とっつきやすそうなものをピックアップして紹介。

# 使い方
ファイル -> プロジェクトのプロパティ
![スクリーンショット (42).png](https://qiita-image-store.s3.amazonaws.com/0/150591/3ed7923a-e3a8-aa9e-4300-b98eaac008d7.png)

スクリプトのプロパティ -> 行の追加
![スクリーンショット (43).png](https://qiita-image-store.s3.amazonaws.com/0/150591/ff9c7c22-768c-6cc9-982c-33392e510666.png)

名前と保存したい値を書き込んで保存。
![スクリーンショット (44).png](https://qiita-image-store.s3.amazonaws.com/0/150591/48997b3f-eefa-259d-eece-583b1589f951.png)


コードを使って呼び出し。

```js
var KEY = PropertiesService.getScriptProperties().getProperty("AWS_KEY");
var SECRET = PropertiesService.getScriptProperties().getProperty("AWS_SECRET");
// AWSに接続する //
```
これだけ！

# 利点
 * コード本文と定数(マジックナンバー)が分離する
 * コードをコピペしてQiitaに公開しても個人情報(APIキー)が流出する心配がない
 * プロジェクト内ならグローバルに使える

---
…需要があったら追加でまとめるかも。
SplunkでDocker運用監視

前回、Docker Logging Driverを使ってコンテナ内のログをSplunkに入れてみました。
http://qiita.com/kikeyama/items/515d65906537239e04d2

今回はDockerコンテナの稼働状況をSplunkで監視してみます。

# はじめに
今回利用するのはDockerを監視するSplunk Appです。
GitHubにリポジトリ発見。これを `git` かダウンロードしよう。
https://github.com/splunk/docker-itmonitoring

# 使い方
非常に簡単です。
Splunk側でデータ受信を設定して、Appを入れて、Dockerが入っているサーバーでForwarderコンテナを起動するだけ。

## Step 1. Splunkインスタンスの準備
### 1) データ受信設定
_[設定] > [転送と受信]_
<img width="454" alt="Screen Shot 2017-07-24 3.53.17 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/e0711cee-c01a-f2f8-f954-cfe84569d5d4.png">

_[受信の設定] をクリック_
<img width="516" alt="Screen Shot 2017-07-24 3.53.38 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/b995fbb4-aba6-8370-1e42-2096b80d5d3f.png">

_[新規] をクリック_
<img width="232" alt="Screen Shot 2017-07-24 3.53.46 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/45276bbd-d7cb-8f79-e910-524faa03b968.png">

_ポート番号に **9997** を入力して保存_
<img width="401" alt="Screen Shot 2017-07-24 3.53.57 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/25b9f23e-7652-506a-8e6e-e1e8d8d11b7f.png">

これで、ポー9997でデータを受信する準備ができました。
ちゃんと9997を開けておきましょう。


### 2) Splunk Appコピー
Splunkインスタンスの `$SPLUNK_HOME/etc/apps/` にGitHubから落としてきた以下のフォルダをコピー
**app-docker**
**ta-dockerlogs_fileinput**
**ta-dockerstats**
**ta-ucplogs-sysloginput**


### 3) Splunk再起動
```
$SPLUNK_HOME/bin/splunk restart
```


## Step 2. Forwarderの準備
実際にDockerコンテナが動いているサーバーに **Splunk Universal Forwarder** のイメージを入れてコンテナ起動
https://hub.docker.com/r/splunk/universalforwarder/

```bash
docker pull splunk/universalforwarder:latest
```

```bash
docker run --name splunkuniversalforwarder \
  --env SPLUNK_START_ARGS=--accept-license \
    --env SPLUNK_FORWARD_SERVER=splunk_ip:9997 \
  --env SPLUNK_USER=root \
  --volume /var/lib/docker/containers:/host/containers:ro \
  --volume /var/log:/docker/log:ro \
    --volume /var/run/docker.sock:/var/run/docker.sock:ro \
    --volume volume_splunkuf_etc:/opt/splunk/etc \
    --volume volume_splunkuf_var:/opt/splunk/var \
    -d splunk/universalforwarder:6.5.3-monitor
```

`SPLUNK_FORWARD_SERVER` で指定する `splunk_ip` にStep 1で使ったSplunkインスタンスのIPアドレスもしくはホスト名、FQDNを指定しましょう。

### Forwarderってナニ？
Splunkにログやデータを転送するエージェントのことです。
Splunkにログを送るときはForwarderを各サーバー、もしくはSyslogサーバーにインストールして転送設定します。

今回の場合、コンテナ起動時に上記コマンドを使用すると勝手に転送設定ができます。


### Splunkにログインして確認してみる
ログイン後トップ画面の左側に **Docker** App発見。クリックしてみる。
<img width="464" alt="Screen Shot 2017-07-24 4.09.54 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/2b0f507a-c530-8490-fe88-de1902902a52.png">

おぉ
![screencapture-52-36-48-112-8000-en-US-app-app-docker-docker_overview-1500880395775.png](https://qiita-image-store.s3.amazonaws.com/0/174837/c46bda7b-eafe-f789-15b1-b0b77abd9803.png)

いい感じにコンテナの稼働状況やCPU使用率を確認できますね。

システムがマイクロサービス化されて分散配置されたコンテナもこれで容易に管理できそうです。
開発したアプリケーションのイメージを展開して起動した直後に問題があれば、これで早期発見できるかも。

# 最後に
Splunkには[Splunkbase](https://splunkbase.splunk.com/)というApp公開用のプラットフォームがあるのですが、そこに入っていない（2017年7月24日現在）ところをみると、まだ開発段階なのかもです。
ご利用は自己責任で。まずは検証環境で使ってみるといいかもです。
Rで例外処理

```
tryCatch(
  { エラーを出すかもしれない処理 }
  , error = function(e) { エラーに対して行う処理 }
)
```

と書く。遺伝子発現行列geneに対して網羅的にt検定をしてp値を得たい場合。Rのt検定の関数は一群すべてNAだった場合などにはエラーとなってしまう。このような項目にはとりあえず1を入れて処理したい場合。

```
ps = c()
for(i in 1:nrow(genes)){
  tryCatch(
    {ps[i] = t.test(genes[i,case], genes[i,cont])$p.value}
    , error = function(e){ps[i] = 1}
  ) 
}
```
【Wordpress】テーマファイルのURL取得は get_theme_file_uri を、パスにはget_theme_file_pathを。【子テーマ】

Wordpressのディレクトリ取得には `get_theme_file_uri` を使いましょうという話。

子テーマ化する時にハマったのでメモ。

2017年7月時点でググるとまだ、`get_template_directory_uri()`やら `get_stylesheet_directory_uri()`やらがバシバシ出て来ますが、子テーマのときは `get_stylesheet_directory_uri()`て名前おかし過ぎる・・・と思って調べたら4.7から出来てました。

**get_theme_file_uri()**
https://developer.wordpress.org/reference/functions/get_theme_file_uri/

例えばfunctions.phpにjsファイルを指定する時に、

```
wp_enqueue_script( 'main-script', get_theme_file_uri() . '/js/main.js', array(), '1.0.0', true);
```

とか書いておくと、後で子テーマ作る時とかに慌てなくて済みます。今までは`get_stylesheet_directory_uri()`を使うのだったけれど、多分名前おかしすぎるのでそれっぽい名前の関数が出来たのでしょうね（偏見です）。

で、親テーマのディレクトリが欲しいときはこちらを。
**get_parent_theme_file_uri**
https://developer.wordpress.org/reference/functions/get_parent_theme_file_uri/

うん、分かりやすくなった！

・・・て言っても中身は`get_template_directory_uri()`と`get_stylesheet_directory_uri()`ガッツリ使ってあるのでちょっともにょるのですが・・・。wordpressの歴史を感じる瞬間。`get_theme_root_uri()`から何とかならんかったのかな、と思索しかけて宇宙の彼方に飛んでいきそうだったので止めました。

あと、パスの場合は

**get_theme_file_path()**
https://developer.wordpress.org/reference/functions/get_theme_file_path/

を使うそうです。
Macで外部ディスプレイが映らない場合は「shift + control + option + 電源」でSMCリセットを実施すると直る(強制リブートします！)

# Macで外部ディスプレイが映らない場合の対処法

外部のディスプレイに繋いだままスリープしたりすると、スリープを解除しても外部ディスプレイが映らなくなる。
接続し直したり、ディスプレイの設定をいじっても復帰せず。
`shift + control + option + 電源`　でSMCリセットを実施すると直る。
＊リブートになるので、大事なデータは保存しておきましょう。

## 環境

- MacBook Pro (Retina, 13-inch, Late 2012)
  - 2.5 GHz Intel Core i5
  - 8 GB 1600 MHz DDR3
  - Intel HD Graphics 4000 1536 MB
- Dell P2715Q
  - MiniDisplayPort(Thunderbolt) -> DisplayPort

## SMCリセット手順

1. DisplayPortケーブルを外す
2. アプリをすべて閉じる
2. `shift + control + option + 電源`で電源を落とす
3. 電源を入れる

-----
検索・アドレスバーに URL を完全に表示する

OperaはデフォルトではURLが省略されて表示されてしまい見難いのですが、設定変更方法がちょっと分かりにくかったので備忘として残しておきます。

#設定方法

 1. 設定
 * ブラウザ
 * 「詳細設定を表示」のチェックをオン
 * ユーザーインターフェイスの「検索・アドレスバーに URL を完全に表示する」のチェックをオン

#バージョン

 * `Opera developer 48.0`
 * `48.0.2657.0 (PGO)`
AWS Organizationsでアカウントの新規作成とログイン時の注意点

#AWS Organizationsとは

複数のAWSアカウントを統合するためのアカウント管理サービス。
社内では主にメンバーアカウントの一括請求するために利用していますが、各アカウントに対してのサービスのアクセス制限も可能。

今回、新規案件用にアカウントを取得するためアカウントを作成する必要があったのですが、、ちょっとした勘違いで初めてOrganizationsからアカウントの作成を行いました

#AWS Organizationsを使って、アカウント作成してみる
コンソールのトップページ右上から[自分の組織]をクリック。

![AWS-OZ01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/cb8a675d-d254-4f98-2df7-99cd35f86d7b.png)

[Accounts]　＞　[Add account]

![AWS-OZ02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/32d55a27-2759-196c-609a-d77c131a0df6.png)

今回は新規アカウントの作成なので[Create account]を選択。
必要事項を入力し、Createするとアカウントが作成されます。

![AWS-OZ03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/04472f34-e19f-e555-044a-f0a12c42b323.png)

これで作成は完了です。
通常アカウント作成の際に必要となる、


 - クレジットカード情報の入力
 - AWSから電話があり、伝えられた認証コードを入力する

といった作業がないので、社内で権限がないメンバーにも気軽に作成を依頼することができそうです。

#Organizationsでアカウントを作成する際の注意点
ただし、注意点もあります。

AWS Organizations を使用して作成した場合、新しいアカウントの初期パスワードはルートユーザーに割り当てられません。そのため、ルートユーザーとしてアカウントに初めてアクセスする場合は、アカウントのパスワード復旧プロセスを行う必要があります。
[引用元：組織のメンバーアカウントへのアクセスと管理
](http://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_accounts_access.html)

そう、Organizationsからアカウントを発行する場合パスワード設定箇所がどこにもありません。
アカウントを取ることはできても、このままではログインすることができないので、上記の方法を使ってパスワードの設定が必要です。ご注意ください。
完全クローズドな開発環境に不審なリクエスト

まず、前提として私の環境ですがWindowsにVirtualBox／Vagrantを使ってローカル開発環境を構築してあります。
VM環境にrails/mongrel
ホスト側にapacheでリバースプロキシを置いてます。

クライアント⇔リバースプロキシ（Windows）⇔WEBアプリ（VM）

ざっくり言うとこんな感じ。
ローカルだけで完結している完全クローズドなWEB開発環境です。

#本題
開発中は`tail -f`でDEBUGログを常にウォッチできる状態にしているのですが、ある日突然ページのリロードもなにもしていないのにリクエストがどこからか飛んでくるようになりました。
秒単位で見てきっちり15分間隔でのリクエストなので機械的なアクセスであることは間違いなさそうです。
cronは何も設定していません。

はて？そしたらなんだろう？

最近変わったことといったら、動作確認用ブラウザをOperaに変更したことぐらいです。
（標準機能としてADブロッカーがあったので導入しました。笑）

リクエストされているURLからの憶測で、ブラウザ上の履歴に対してリクエストが走っているのではないかと思い確認してみると、しっかり履歴に残っていました。
試しに履歴を削除してみると、、、止まった！
アクセスログも確認してみたらUAはOperaの様子。

<details><summary>アクセスログ（掲載用に少し加工してあります）</summary>

```
127.0.0.1 - - [24/Jul/2017:13:06:43 +0900] "GET /hoge HTTP/1.1" 200 14911 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36 OPR/48.0.2657.0 (Edition developer)"
127.0.0.1 - - [24/Jul/2017:13:21:43 +0900] "GET /hoge HTTP/1.1" 200 14911 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36 OPR/48.0.2657.0 (Edition developer)"
127.0.0.1 - - [24/Jul/2017:13:36:43 +0900] "GET /hoge HTTP/1.1" 200 14911 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36 OPR/48.0.2657.0 (Edition developer)"
127.0.0.1 - - [24/Jul/2017:13:51:43 +0900] "GET /hoge HTTP/1.1" 200 14911 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36 OPR/48.0.2657.0 (Edition developer)"
127.0.0.1 - - [24/Jul/2017:14:06:43 +0900] "GET /hoge HTTP/1.1" 200 14911 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36 OPR/48.0.2657.0 (Edition developer)"
```

</details>

全ての履歴に対してこんな処理が走っているのかどうかまでは調べていません。
ブラウザシェア的にOperaを使っているユーザはかなり少数派だと思いますが、ブラウザの仕様としてこういったことがあるようです。
coffeescript + iCheckでのチェックボックスの全選択を実装方法

`iCheck`
http://icheck.fronteed.com/
※iCheckではイベントのとり方が特殊なので注意

###coffeescript側

```hoge.coffee
$('#all_check').on "ifChecked", $.proxy(@all_checked, @)
$('#all_check').on "ifUnchecked", $.proxy(@all_unchecked, @)
$('.categories').on "ifChecked", $.proxy(@categories_changed, @)
$('.categories').on "ifUnchecked", $.proxy(@categories_changed, @)
    
all_checked: (e) ->
  @categories = $('.categories')
  @categories.iCheck('check')
    
all_unchecked: (e) ->
  if $('.categories :checked').length == $('.categories :input').length
    @categories = $('.categories')
    @categories.iCheck('uncheck')

categories_changed: (e) ->
  if $('.categories :checked').length == $('.categories :input').length
    $('#all_check').iCheck('check')
  else
    $('#all_check').iCheck('uncheck')
```

###template側

```hoge.html.erb
<%= check_box_tag :all_check, false, false,{} %>全て選択
<div class="categories">

  <!-- ここのdivの中にチェックボックス郡を配置 -->
  <%= check_box_tag :hogehoge, false, false,{} %>

  <!-- もちろんform_forで複数で対応も -->
　　　　<%= f.check_box :hogehoges, {}, piyo.id, nil %>
</div>
```


##仕組み
チェックボックスを`<div class="categories">`で囲い

1.`全て選択`がチェックされたら`中の要素`を全て
2.`全て選択`がアンチェックされたら`中の要素`を全てアンチェック
3.`中の要素`がチェックorアンチェックされたら、チェック数と要素数と比べて、すべてチェックされていれば`全て選択`をチェック、それ意外は`全て選択`をアンチェック


##メリット
よくみる実装だと、全て選択を押した後に中の要素をアンチェックしても全て選択がチェックされたままだが、
この方法なら連動してくれる。
wgrib2をDockerコンテナにインストールした話

# 概要
こんにちわ。Weathernews 新入社員の 百々 です。
たまに社内でトドと呼ばれますが、ドドです。本名です。本当です。

今回は、気象データを扱うためのコマンドツール wgrib2 をDockerコンテナで動かしてみます。


## wgrib2とは
wgrib2は、WMO（世界気象機関）で定めている気象データ形式GRIB2を使用するためのコマンドツール。
作成は、アメリカのNOAAが行なっており、直近の更新は2017年2月となっている。（※2017年6月現在）
（参考 http://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/）

なお、GRIB2形式データは、主に数値予報モデルなどで使用されている。


# 背景
wgrib2を扱う需要が高いので、環境依存をなくすため、これをDocker化したかった。

きっかけは、wgrib2のインストールでは`makefile`の中身をOSなどの環境ごとに変更しなければならず、インストールでトラブルが発生したことから始まった。

`makefile`の変更は、多くの場合はコメントアウトの付け外しではある。が、ヒューマンエラーや微妙なローカル環境の違いにより、`make`で長い時間待たされた挙句エラーを発生😡させてしまうので、Dockerさえ入っていればコマンド一発でインストールできるようにしたかった。


# wgrib2をUbuntuベースのDockerコンテナへインストールする

dockerfileにインストール手順を記載してdockerコンテナを作成して、実現した。


## Dockerfile
```Dockerfile:Dockerfile
FROM ubuntu:latest

# Install libraries for installing wgrib2
RUN apt-get update && apt-get install -y wget \
	build-essential \
	gfortran \
	zlib1g-dev

# Setting for libraries
ENV CC gcc
ENV FC gfortran

# Download wgrib2
RUN cd ~ \
	&& wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz \
	&& tar xvzf wgrib2.tgz

# Install wgrib2
RUN cd ~/grib2/ \
	&& make \
	&& cp wgrib2/wgrib2 /usr/local/bin/wgrib2
```


### 解説
Ubuntuにwgrib2をインストールするためには、`gcc`と`gfortran`及び`zlib1g-dev`がいるので、これらを`apt-get`を使ってインストールする。
`gcc`は、`build-essential`パッケージに同包されているものを使用する。

wgrib2の`makefile`には、どのコンパイラを使用するかを環境変数`CC`及び`FC`から選択する。よって、これらを`ENV`を使用して定義しておく。

後は、wgrib2をダウンロードしてインストールするだけでOK。


## docker build
```
$ docker build -t weathernews/wgrib2:1.0 .
```

もし部屋が暑いなら、ビルドが終わるのを待つ間にハーゲンダッツでも食べましょう。きっと幸せになれます✌️

## wgrb2の実行
```
$ docker run -i -t weathernews/wgrib2:1.0 wgrib2 -version
v0.2.0.6c 2/2017  Wesley Ebisuzaki, Reinoud Bokhorst, John Howard, 
Jaakko Hyvätti, Dusan Jovic, Daniel Lee, Kristian Nilssen, Karl Pfeiffer, 
Pablo Romero, Manfred Schwarb, Gregor Schee, Arlindo da Silva, 
Niklas Sondell, Sam Trahan, Sergey Varlamov
```

インストールできたことを、確認できました！

あとは、GRIB2データをマウントして、好きなように`wgrob2`コマンドを実行していきましょう。


# おわりに
Docker化したことで、Dockerさえ入っていれば気軽にGRIB2データを扱えるようになり、ハッピーだと思います。
おしまい。😄
EC2インスタンス上にインストールしたMySQLにSequelProで接続する。

メモです。
DBを同じ場所に置くのは本来はセキュリティ上好ましくないそうですが、某学校のカリキュラムです。
書いておきます。

# 攻略法

この画面を開いてください。
<img width="612" alt="スクリーンショット 2017-07-24 13.46.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/187119/0d1f746c-2c8e-4f24-29b0-f8d9509798ee.png">

名前 なんでもいいです
MySQL Elastic IPを入力
ユーザ名 root
パスワード mysqlのパスワード
データベース　空欄
ポート　空欄
SSHホスト 上のElastic IPに同じ
SSHユーザ ec2-user
SSH鍵 隠しファイルを解除して、秘密鍵を選ぶ
SSHポート 空欄

こんな感じでいけます！

# 隠しファイルを選べるようにするには？
僕が実行したコマンドは以下です。

<img width="404" alt="スクリーンショット 2017-07-24 13.49.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/187119/b66f0fc6-cd26-34a7-f204-e83acb863ef4.png">