OmniAICreator/Qiita-1.07M huggingface dataset:
ES6アロー関数

## アロー関数
`function`キーワード、ブロックの`{}`、`return`の省略

```javascript:アロー関数
// ES5
var add = function(a, b) {
  return a + b;
};

// ES6
var add = (a, b) => {
  return a + b;
};

var add = (a, b) => a + b;

var square = n => n * n;

[1, 2, 3, 4].filter(n => n% 2 === 0).map(n => n * n);
```

http://es6-features.org/#ExpressionBodies
http://es6-features.org/#StatementBodies

### アロー関数のthisの補足
アロー関数を定義したコンテキストで`this`を補足する。 
ES5の場合、setTimeout関数の引数に指定された無名関数の内部では`this`がグローバルオブジェクトを指してしまうので、外側で一度`this`をself変数に保存、もしくはbindメソッドによって`this`を束縛する必要がある。

アロー関数を使うとthisは自動的に補足されるため、selfやbindを自分で書く必要がない。

    


```javascript:thisの補足
// ES5
var john = {
  name: "John",
  helloLater: function() {
    // this (john) を保存しておく
    var self = this;
    setTimeout(function() {
      // ここでのthisはjohnではないのでselfを使う
      console.log("Hello, I'm " + self.name);
    }, 1000);

  }
}
john.helloLater();
// 「"Hello, I'm John"」が１秒後に表示される

// ES6
var john = {
  name: "John",
  helloLater: function() {
    // アロー関数を使うと、
    setTimeout(() => {
      // ここでのthisはjohnなのでそのまま使える
      console.log("Hello, I'm " + this.name);
    }, 1000);
  }
}
```

http://es6-features.org/#Lexicalthis

### 参考
[WEB+DB PRESS vol.87 ECMAScript6特集](http://gihyo.jp/magazine/wdpress/archive/2015/vol87)
Visual Studio Code のインストーラ と Stackoverflow

Visual Studio Code のインストーラは、もちろん Inno Setup です。
すごいですね。最近のMSはOSSを使うのがデフォです。

暇つぶしに、Visual Studio Code の Inno Setup Scriptのコードを見ていたら.....

俺は、堂々とstackoverflowのコードをコピることにした。MSは俺に勇気を与えてくれる。

https://github.com/Microsoft/vscode/blob/master/build/win32/code.iss#L794

```delphi
function WizardNotSilent(): Boolean;
begin
  Result := not WizardSilent();
end;

// http://stackoverflow.com/a/23838239/261019
procedure Explode(var Dest: TArrayOfString; Text: String; Separator: String);
var
  i, p: Integer;
begin
  i := 0;
  repeat
    SetArrayLength(Dest, i+1);
    p := Pos(Separator,Text);
    if p > 0 then begin
      Dest[i] := Copy(Text, 1, p-1);
      Text := Copy(Text, p + Length(Separator), Length(Text));
      i := i + 1;
    end else begin
      Dest[i] := Text;
      Text := '';
    end;
  until Length(Text)=0;
end;
```
Netbeans + JDBC + Amazon Athena でつまづいたところ

もうそこらじゅうにサンプルがあるけど知識が少なすぎてアレだったので一応つまづいたところをふまえてメモ。 

## 前提

とりあえずもう Web コンソールから SQL 実行できるとする。DB名は `logs` としてある。


## リージョン US Standard でバケットを作っておく

JDBC経由で実行した結果は得られるんだが、それをS3に保存することは必須になっている。そしてちゃんとAmazon Athenaが動くリージョンじゃないとダメらしい(エラーになる)。リージョンを `US Standard` としてS3バケットを作成する。


## プロジェクト作成

Netbeans を起動して新規プロジェクト > Java > Javaアプリケーション

## コードのコピペ

[Amazon Athena に JDBC 接続する ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/amazon-athena-jdbc/) を参考にした。

コピペする。


## 認証設定

認証はJDBCドライバに渡すプロパティ一式のなかに、 `aws_credentials_provider_arguments` というプロパティに値を渡すことで `aws_credentials_provider_class` のコンストラクタを指定できるようだ。

ようだ・・・が、いろいろあってこれを用いられなかったのでこのアクセスキーとシークレットアクセスキーを用いる方法でいく。

[Accessing Amazon Athena with JDBC — User Guide](http://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html#creating-a-driver)

上記ページを参考にプロパティ `user` にアクセスキー、同 `password` にシークレットアクセスキーを設定した。

``` Java
    info.put("s3_staging_dir", "s3://us-standar-region-phx-athena");
    info.put("user", "AWSACCESSKEYID");
    info.put("password", "AWSSECRETACCESSKEY");
```

## ライブラリの追加

- [Accessing Amazon Athena with JDBC — User Guide](http://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html) からJDBCドライバを持ってくる
- [AWS SDK for Java | AWS](https://aws.amazon.com/jp/sdk-for-java/) からAWS SDKを持ってくる
- ログ出すモードのとき、このクラスが無いとエラーになっちゃったので必要に応じて [Apache Commons Logging - Download Apache Commons Logging](http://commons.apache.org/proper/commons-logging/download_logging.cgi) から `commons-logging-1.2-bin.zip` をもってくる

上記3つ解凍して、それぞれのjarをプロジェクトに追加する。Netbeasでプロジェクト右クリ > プロパティ > ライブラリ > JAR/フォルダの追加 > を3度


## SQLの実行

Webコンソールではデフォルトデータベースが正しく指定されているが、コレ経由だとちゃんと指定しないとダメぽ。（デフォルトDB指定できるだろうからまぁそれやりゃいいんだろうけど）

例えば 

```SQL
select * from target_table limit 3;
``` 

は 

```SQL
select * from logs.target_table limit 3;
``` 

こんな感じで。
Androidで複数レイアウトが重なっているものをクリックした時の挙動について

# やりたいこと
以下のレイアウトで、TextViewをクリックした時にRelativeLayoutのクリック処理を呼ぶ方法を調べます。
 - RelativeLayout
 - - LinearLayout
 - - - TextView

##前提
レイアウトの重複部分をクリックすると、一番上のレイアウトに対して実装されている処理だけが実行されます。
つまり、以下のように各レイアウトに処理を実装しても、TextViewをクリックした場合はTextViewの処理のみ実行されます。（onTouchを実装した場合は異なります。）

```MainActivity.java
        TextView textView = (TextView) findViewById(R.id.textView);
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
        RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);

        relativeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("RelativeLayout");
            }
        });

        linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("LinearLayout");
            }
        });

        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("textView");
            }
        });
```

###前提の実装確認

今回の画面レイアウトはこんな感じです。シンプルです。
![Screenshot_1488629701.png](https://qiita-image-store.s3.amazonaws.com/0/146508/04b69f41-83d6-0b07-37ea-524fa1fe5351.png)


TextViewの部分(SAMPLE001)をクリックした時：
consoleに**textView**だけが表示される。

この時に、RelativeLayoutのonClickを呼ぶようにします。

##検証
TextViewの実装を以下の通り変更するだけです。

```MainActivity.java
       　textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("textView");
                RelativeLayout grandParent = (RelativeLayout) v.getParent().getParent();</font>
                grandParent.callOnClick();
            }
        });
```
クリックされたViewの親要素を取得します。
取得した親要素に対して

```
grandParent.callOnClick();
```
このようにクリックイベントを発生させれば良いだけです。
consoleに以下の二つが表示されました。

**textView**
**RelativeLayout**

簡単でした。


次はonTouchの場合について書きたいと思いまーす。
Basic Operators - Nil-Coalescing Operator


*Nil合体演算子 Nil-Coalescing operator* は、` (a ?? b)` という構成で成り立っている。

読み方は、「オプショナル a が値を持っている場合は a の値を返し、もし a が nil ならば b の値を返す」となる。

利用の条件としては、

* a は必ずオプショナル型でなければいけない。
* b の値は a が持つ値の型と同じでなければいけない。

nil合体演算子は [三項演算子](http://qiita.com/divisionbox/items/45c1f170319c15f90639) でも表せる。

```swift
a != nil ? a! : b
```

上記例では `a!` と強制アンラップしているが、 `a!` が対象となるのは値が nil ではない場合のみなので、問題は生じない。

```
仕様で、もし a の値が nil ではなかった場合、b の値は一切考慮されない。
```

**使用例**

```swift
// 基本文法での b にあたる
let defaultColorName = "red"

// 基本文法での a にあたる
// 初期値がないので値は nil
var userDefinedColorName: String?

// nil合体演算子で判断している。 userDefinedColorName は nil なので、 defaultColorName の "red" が返される。
var colorNameToUse = userDefinedColorName ?? defaultColorName

// 値格納
userDefinedColorName = "green"

// userDefinedColorName に値があるので、それ、今回は "green" が返される。
colorNameToUse = userDefinedColorName ?? defaultColorName
```
Electron入門 その2 React導入

前回 [Electron入門 その1 Quick Start](http://qiita.com/takumarakann/items/a0dd63d276e2d97d3d57)

今回は、Reactの導入をしてみます。
一旦、Reduxは使わない。

## ディレクトリ構成

```
electron-quick-start
├── .babelrc
├── components
│   └── Top
│       └── top.jsx
├── index.html
├── index.jsx
├── main.js
├── node_modules
└── package.json
```

## モジュールのインストール

Reactで記述するために、下記をインストールします。

```sh
npm i -S babel-core
npm i -S babel-preset-es2015
npm i -S babel-preset-react
npm i -S react
npm i -S react-dom
npm i -S react-router
```

## .babelrcの準備
Babelの設定ファイルです。

```json
{
  "presets": [
    "es2015",
    "react"
  ]
}
```

## index.html
前回作成した、index.htmlを編集します。
事前にトランスパイルした方がいい気もしますが、とりあえず実行時にバベります。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <div id="root"></div>
  </body>

  <script>
    require('babel-core/register')()
    require("./index.jsx")
  </script>
</html>

```

## index.js
react-routerを使ってルーティングするようにします。

```js
/* global document */

import React, { Component } from 'react';
import { render } from 'react-dom';
import { hashHistory, Router, Route, IndexRoute } from 'react-router';
import Top from './components/Top/top.jsx';

class App extends Component {
  render() {
    return <div>{ this.props.children }</div>;
  }
}

const router = (
  <Router history={hashHistory}>
    <Route path="/" component={App}>
      <IndexRoute component={Top} />
      <Route path="/top" component={Top} />
    </Route>
  </Router>
);

render(
  router, 
  document.getElementById('root')
);
```

## top.jsx
Topって表示するだけのコンポーネントです。

```jsx
import React from 'react';

export default class Top extends React.Component {
  render() {
    return (
      <div>Top</div>
    );
  }
}
```

## 実行する

```sh
npm start
```

![スクリーンショット 2017-03-04 21.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/39834/f5a4730e-3e8a-4d7c-43b7-ccac420e6d2d.png)

Topって表示された。
Webアプリケーションエンジニアがディープラーニングに挑戦する際にやったこと(Coursera Week5)

# Coursera Week5
## はじめに
CourseraのWeek5を実施しましたので、私のメモを公開します。
Courseraってなんだ？という方は[Week1](http://qiita.com/KirariGlock/items/d41bdcc6f5ec5ad255fb)から御覧ください。

## ニューラルネットワーク
### 目的関数(CostFunction)
$L$はニューラルネットワークのレイヤの数。
$s$はニューロンの数を表す。（$s_1$は入力レイヤのニューロン数。）
$K$は出力ユニット、クラスの数。
ニューラルネットワークの目的関数は以下のように表す。

### バックプロパゲーション(Backpropagation algorithm)
ニューラルネットワークのコスト関数$J(\theta)$の最小値を求めるためにバックプロパゲーションを使用する。（最急降下法の代わり的な。）
バックプロパゲーションは日本語で誤差逆伝播法という。
最急降下法は入力レイヤから順番に計算していたが、バックプロパゲーションは逆に出力レイヤ側から計算する。
最初の入力レイヤには誤差は無いので計算しない。

### 実装ノート：パラメータのアンロール(implementation note:Unrolling parameters)
ロジスティック回帰ではthetaも最急降下法の結果もベクトルだったが、ニューラルネットワークでは行列になる。
これらの行列を以下のようにベクトルにアンロールすることができる。
```
thetaVec = [Theta1(:); Theta2(:); Theta3(:);];
```
また、reshapeを使用することでもとの行列に戻すことができる。

### Gradient checking
最急降下法が正しく動いているかチェックする。
ただ、このチェックアルゴリズムは非常に遅いので毎回走らせてはいけない。

ニューラルネットワークの学習方法
1.ウェイトを0に近いランダムな数で初期化
2.フォワードプロパゲーション
3.目的関数$J(\theta)$を求める
4.バックプロパゲーション
5.Gradient Checking
6.目的関数$J(\theta)$を最小化する
行数可変のUILabelを表示／非表示（トルツメ）する方法

iOSアプリにて、あるUI要素を内容やボタン操作などにより、表示したり非表示（トルツメ）にしたい時があります。縦方向で言えば、高さ固定のUI要素については、高さの`NSLayoutConstraint`を設定し、それの`constant`プロパティを本来の高さまたは0に切り替えることによって、表示／非表示を切り替えることができます。

しかし、UI要素が行数可変の`UILabel`の場合、中の文字列によって高さが可変のため、上記の方法が使えません。

そこで、高さ0の`NSLayoutConstraint`を設定し、`priority`プロパティを250または750に切り替えることによって、表示／非表示を切り替えることができます。

**高さ0のNSLayoutConstraintの設定**
`priority`プロパティはデフォルトで250に設定しておく
![スクリーンショット 2017-03-04 18.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/83790/572fef47-085e-bf1c-1225-7f3dc7e144fb.png)

```swift:ShrinkCell.swift
class ShrinkCell: UITableViewCell {
    var originalLabelBottomConstraint = CGFloat(0)
    
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var labelHeight: NSLayoutConstraint!
    @IBOutlet weak var labelBottomConstraint: NSLayoutConstraint!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        
        originalLabelBottomConstraint = labelBottomConstraint.constant
    }

    func configure(hidden: Bool) {
        if hidden {
            // 非表示（トルツメ）
            labelHeight.priority = 750 // 高さ0が優先される
            labelBottomConstraint.constant = 0
        } else {
            // 表示
            labelHeight.priority = 250 // UILabelの高さが優先される
            labelBottomConstraint.constant = originalLabelBottomConstraint
        }
    }
}
```

**表示している時**
![スクリーンショット 2017-03-04 20.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/83790/76ab55e3-4a86-f630-4ec1-cc668d0aec2e.png)

**非表示（トルツメ）している時**
![スクリーンショット 2017-03-04 20.52.48.png](https://qiita-image-store.s3.amazonaws.com/0/83790/fef48938-7c4c-4dd0-1455-3b0dbdb250bf.png)
Laravelでseederのデータを入れ直したい時に


１回マイグレートしてしまってまたマイグレートしようとしたらできないじゃん！ってなり、
調べていたらちゃんと入れ直す用のコマンドがありました。ｗ

これで何度でもデータを入れ直すことができます。

```
php artisan migrate:refresh --seed
```
Selenium WebDriverを使ってChromeでモーダルウィンドウにフォーカスしようとしたら失敗した件


**注意**：何がどう上手く行かないかの整理まではしましたが、解決まで辿り着いていません。

##環境
Selenium Webdriver　言語はruby、ブラウザはgoogle chrome。

余談だが、Seleniumで困って検索すると「[Seleniumの種類は色々ある](http://blog.trident-qa.com/2013/05/so-many-seleniums/)が、どのSeleniumについての話か」「Webdriverだとして、使用言語は何か」「ブラウザは何か」がバラバラで結構手間取る。自分はrubyでやろうとしてるけど、このサイトの記述は違う言語だ、みたいなことがよく起きる。つらい。

#やりたい処理、当初の期待
Seleniumを使ってデータを収集・スクレイピングしようとしていた。対象のページでは、JavaScriptのonclickを使って新しいウィンドウがポップアップするようになっている。新たに開かれたページ内の情報を読み込みたい。調べたところ、この形式のウィンドウは「モーダルウィンドウ」または「モーダルダイアログ」という名称らしい。

「Selenium Webdriver モーダルウインドウ」で検索すると、ウィンドウを切り替えて新しいウィンドウにフォーカスする方法が見つかる。
これが一番分かりやすかった。言語はJava。
http://a4dosanddos.hatenablog.com/entry/2014/04/30/001630
```driver.getWindowHandle()```で現在のウィンドウのハンドルを取得する。末尾にsが付いた```driver.getWindowHandles()```だとウィンドウのハンドルの一覧を取得する。

rubyだとメソッド名が若干違っている。
http://www.rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Driver によれば、メソッド名は以下の通り。

```ruby:ruby
driver = Selenium::WebDriver.for :chrome
driver.window_handle # 現在のウィンドウのハンドルを取得する
driver.window_handles # ハンドル一覧を取得する。返り値はArrayになる
driver.switch_to.window(新しいウィンドウのハンドル) #これでウィンドウが切り替わる
```
この辺のメソッドを使えばウィンドウの切り替えが実現できそうだ……と期待した。

#検証
簡単なサンプルコードを書いて検証。間に入れたsleepはページ表示などを確実に完了させるためで、深い意味はない。

```ruby
require 'certified'
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome
driver.navigate.to "https://syncer.jp/jquery-modal-window/demo/modal.html" # URLはモーダルウィンドウのサンプルがあるサイト
sleep 3

driver.find_element(:id, "modal-open").click #idで目的の要素を探してクリック。ウィンドウが開く
sleep 3

p driver.window_handle # -> "CDwindow-c57c9316-cfee-432a-aeac-f705da98ec07"
p driver.window_handles # -> ["CDwindow-c57c9316-cfee-432a-aeac-f705da98ec07"]
p driver.window_handles.length # -> 1
```

あれ、ウィンドウが2つあるはずなのに1つしか無い。これでは期待した方法ではウィンドウ切り替えできない。失敗だ。

#失敗の原因
上の検証までやって力尽きた……。
調べたら、ChromeではshowModalDialogが削除されているので、そのせいだと思われる。
(削除されているのなら、そもそも何でモーダルウィンドウが見られるのかが疑問だが)
参考：https://www.htmlhifive.com/conts/web/view/pitalium-sample/popup-window

**結論：Selenium WebDriverを使ってChromeでテストをし、上記の方法でモーダルウィンドウに切り替えることはできない**
対策……ChromeじゃなくてIEならば行けるらしいので、IEを使うのが一つの手。あとは思いつかない……
[JAWS-UG 磐田] IAMユーザーとグループの作成

# ◆[JAWS-UG 磐田] ハンズオンの補足資料 IAM編 #1
### 管理者用のIAMユーザーとグループを作成します。
**コンソールを使用してIAMユーザーとグループを作成するには**
**１．**[IAMコンソール](https://console.aws.amazon.com/iam)を開きます。
- - -
**２．**ナビゲーションペインで[ユーザー]を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/708e7d45-5c55-c70e-215b-8abc8486211e.png)
- - -
**３．**[ユーザーを追加]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/c7a35938-44fb-7fcf-df34-db6801831bdc.png)
- - -
**４．**ユーザー追加ウイザードの[**ユーザー名**]に作成する名前を入力し、[**アクセスの種類**]は下記のようにチェックします。
　※ユーザー名は、任意の名前を入力してください。名前には、英数字のほかに、プラス記号 (+)、等号 (=)、カンマ (,)、ピリオド (.)、アットマーク (@)、下線 (_)、ハイフン (-) を使用できます。名前は、大文字と小文字が区別されず、最大 64 文字で構成できます。

- [ ] **プログラムによるアクセス**
- [x] **AWSマネジメントコンソールへのアクセス**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/9f525a25-a97a-9601-6950-633ee1343b8f.png)
- - -
**５．**[**コンソールのパスワード**]はそのままで、[**パスワードのリセットが必要**]は下記のようにチェックを外して、[次のステップ：アクセス権限]をクリックします。
　※パスワードを任意で指定したい時は、[カスタムパスワード]を選択しパスワードを入力します。

- [ ] ユーザーは次回のサインインで新しいパスワードを生成する必要があります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/152129c5-6884-cf23-608b-c81d8e869176.png)
- - -
**６．**[ユーザーをグループに追加]を選択し、[グループの作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/6ab5b4d0-6b7f-77d7-5c1f-267b224a709c.png)
- - -
**７．**グループの作成で[**グループ名**]を入力し、ポリシーリストで、[AdministratorAccess] の横のチェックボックスをオンにした上で[**グループの作成**]をクリックします。
　※フィルターに[AdministratorAccess]を入力すると一覧表示数を絞ることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/106b7038-c69b-4333-3e89-862cb244d441.png)
- - -
**８．**グループの作成が完了したら、[次のステップ：確認]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/be34bb52-1d10-5ead-e85f-166af24a9877.png)
- - -
**９．**内容を確認して、[ユーザーの作成]をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/78d19739-8353-4dec-45e6-23c44c349e37.png)
- - -
**１０．**ユーザーの作成に成功したら、[.csvのダウンロード]をクリックしてアカウント情報を保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/13c5e9a7-15a1-3a60-2834-6d12558363e8.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/9f56fad2-ab12-2a8d-03af-2b4637d955d2.png)
- - -
**１１．**保存したファイルをテキストエディタ等で開き、ユーザー名・パスワード・接続先URLを確認してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168665/2d7aebd5-1896-2b63-78cb-4b4e7921ba99.png)
- - -
**※公式マニュアルから抜粋**
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/getting-started_create-admin-group.html
CentOS6 サーバー環境（Nginx + Puma + MySQL）インストール手順

# インスタンス起動

1. CentOS6 をマーケットプレイスから選択して起動

# MySQL のインストール

[参考](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)

1. `sudo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm`
2. `sudo yum install mysql-community-server`
3. `sudo service mysqld start`
4. `sudo grep 'temporary password' /var/log/mysqld.log` で初期パスワードを確認
5. `mysql -uroot -p'初期パスワード'`
6. `ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password4!';`

# NginX のインストール

[参考](https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-6)

1. `sudo yum install epel-release`
2. `sudo yum install nginx`
3. `/etc/nginx/nginx.conf` と `/etc/nginx/conf.d/default.conf` をいじる
4. `sudo /etc/init.d/nginx start`

# Git のインストール

1. `sudo yum install git`

# deploy ユーザーの追加

1. `sudo useradd deploy`

# deploy ユーザーでログインできるようにする

1. `sudo su deploy`
2. `cd ~`
3. `mkdir .ssh`
4. `chmod 700 .ssh`
5. `echo 'some public key' > .ssh/authorized_keys`
6. `chmod 600 .ssh/authorized_keys`

# deploy ディレクトリの作成

1. `sudo mkdir /var/www`
1. `sudo chown deploy /var/www`

# Ruby 環境のインストール

1. `sudo yum groupinstall 'Development Tools'`
2. `sudo yum install -y openssl-devel readline-devel zlib-devel`
2. [Ruby 環境のインストール](http://qiita.com/pandora2000/items/271e642862fe38ec8330)
    - バージョン 2.3.3
    - deploy ユーザーで行う
1. `sudo chmod 755 ~`
    - sudo 権限を持つユーザーで実行。 deploy ユーザーに切り替えたときの rbenv のエラーを防ぐ
    - 要らないかも
1. `sudo su deploy`
2. `rbenv global 2.3.3`
3. `gem install bundler`

# Puma のインストール

[参考](https://gist.github.com/niwo/4526179)

2. `/etc/init.d/puma` を設置する
3. `/etc/puma.conf` を設置する
4. `/usr/local/bin/run-puma` を設置する
5. `sudo chown deploy /usr/local/bin/run-puma`
6. `sudo chmod 755 /usr/local/bin/run-puma`
3. `sudo chkconfig puma on`
4. `sudo yum install redhat-lsb-core`
5. `sudo /etc/init.d/puma start`

# gem mysql2 の依存関係のインストール

1. `sudo yum install mysql-devel`

# Nodejs のインストール

1. `curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -`
2. `sudo yum install -y nodejs`

# SELinux の無効化

1. `sudo vi /etc/sysconfig/selinux`
    - permissive にする
1. `sudo reboot`

# ファイアウォール設定の追加

1. `sudo vi /etc/sysconfig/iptables` に以下の設定を追加
    - `-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
    - `-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT`
[Unityで学ぶC#] 7 if - else

## if文をさらに使いこなそう
---

## 復習
```csharp
if(条件){
  実行される処理
}
```

もし<font color = "red">条件を満たしていれば</font>処理を行う．

これがifの使い方です．

---

## 新しく学ぶこと
もし条件を満たしていれば処理Aを行う．
<font color = "red">それ以外であれば</font>処理Bを行う．

---
## サンプル
<img width="500" alt="スクリーンショット 2017-03-04 20.09.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/8b4c6781-0aa0-97f6-a4f1-df91411c6f17.png">

moneyが50より多ければ，ifの{}の中身が，それ以外であれば<font color = "red">else</font>の{}の中が実行されます．

---
## サンプル
publicでint型を宣言しているため，Inspectorで値を変えることができます．
<img width="500" alt="スクリーンショット 2017-03-04 20.12.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/7388feee-7b83-c7da-468d-4e4a48abc74b.png">

<img width="500" alt="スクリーンショット 2017-03-04 20.12.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/87254268-df41-1566-cec2-12aadedffea7.png">

---
## サンプル
値を49以下にすると，if文の条件を満たさなくなります
![ifelse.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/ba849b9a-17c7-09a2-5f5f-b924a46bee3d.gif)
<img width="500" alt="スクリーンショット 2017-03-04 20.12.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/8fb8ba06-e9a5-692a-9a4e-d0e3ca3db75d.png">

---

## まとめ
```csharp
if (条件) {
	処理A // 条件を満たしていたら
} else {
	処理B // 条件を満たしていなかったら
}
```

---
## おまけ
条件は追加することができます．

```csharp
if (条件1) {
	処理A // 条件を満たしていたら
}else if(条件2){
        処理B // 条件1ではなく，条件2なら
} else {
	処理C // 条件を満たしていなかったら
}
```

---
## {}が多くなるので，　ペアを間違えないように注意しましょう．

---

# おわり
Xcodeをインストールせずに、Command Line Toolsをインストールする方法

## 概要
- 通常、Command Line ToolsをインストールするためにはXcodeが必要になります。
- しかし、Xcodeは容量が大きいので普段使わない方にとっては、とても邪魔になります。
- そこでXcodeをインストールせずに、Command Line Toolsのみをインスールする方法を紹介します。

## Command Line Toolsとは？
- Mac向けに提供されているコマンドツールです。
- キーボードで命令や操作するプログラムのことです。詳しくは以下のサイトをご覧ください。
- 参考:[コマンドラインツール (command line tool)](http://wa3.i-3-i.info/word13504.html)

## 手順
- アップル社のディベロッパーにアクセスします。
https://developer.apple.com/downloads/index.action

- Apple IDとパスワードを入力します。

![90917502-5348-eab5-ff2f-9ce698ea1838.png](https://qiita-image-store.s3.amazonaws.com/0/142810/60efe3e1-4b07-fa32-cb37-6dc9ff67e099.png "90917502-5348-eab5-ff2f-9ce698ea1838.png")

- 検索窓に `Command Line Tools` を入力し、お使いのmacのバージョンに合わせて、インストールしてください。

![スクリーンショット 2017-03-04 19.59.18.png](https://qiita-image-store.s3.amazonaws.com/0/142810/66986030-650b-e075-c7ac-eae25d13d88c.png "スクリーンショット 2017-03-04 19.59.18.png")

![スクリーンショット 2017-03-04 19.59.18.png](https://qiita-image-store.s3.amazonaws.com/0/142810/517f544a-f1c5-ac37-c2e4-f9ee3855000a.png "スクリーンショット 2017-03-04 19.59.18.png")

- ファイルがインスールされたらクリックする。
- 以下の画面が開いたらダブルクリックする。

![スクリーンショット 2017-03-04 20.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/142810/57b5e189-8fee-5357-dcbb-3e44b19e25d9.png "スクリーンショット 2017-03-04 20.05.07.png")

- 以下、画像の手順の通りに実行する。

![スクリーンショット 2017-03-04 20.05.18.png](https://qiita-image-store.s3.amazonaws.com/0/142810/1119d162-48d4-c80c-7c2f-7a7e417f8308.png "スクリーンショット 2017-03-04 20.05.18.png")

![スクリーンショット 2017-03-04 20.05.28.png](https://qiita-image-store.s3.amazonaws.com/0/142810/3c608bee-55b3-c8d6-4c58-f0b199c9259d.png "スクリーンショット 2017-03-04 20.05.28.png")

![スクリーンショット 2017-03-04 20.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/142810/7ed2e14a-711f-22f6-d1df-0563b435a426.png "スクリーンショット 2017-03-04 20.05.38.png")

![スクリーンショット 2017-03-04 20.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/142810/fbbce980-168f-754b-3dfb-fe72b9151b0a.png "スクリーンショット 2017-03-04 20.05.47.png")

![スクリーンショット 2017-03-04 20.06.01.png](https://qiita-image-store.s3.amazonaws.com/0/142810/00b445e2-dfdb-1b1c-1653-d1c70133caa5.png "スクリーンショット 2017-03-04 20.06.01.png")

- 以上で、Command Line Toolsをインスールすることができました。
- Xcodeをインスールせずに出来たので、容量を節約することができます。
- ここからさらにhomebrewなどをインストールしていくことになります。
ドメインをGoogleDomainsに移管しようとした話


さくらで取ってサブドメイン切り出してG Suiteで使ってるドメインを移管してみようと思ってみた

移管先はRoute53でもいいんだけどG Suite用だしGoogleに持って行く
Name Server自体は Google Cloud DNS になるのかな？

…つもりで調べたけど、いきなりメインのドメイン移管でトラブると面倒なので塩漬けのドメインで試してみる



**結論から言うと決済できずに移管できなかったよ！**



# 移管するドメインの情報

- gTLD：.net
- 移管元：さくらインターネット
- 移管先：Google Domains

# 日本で使えるの？

https://domains.google.com/

右上の MANAGED MY DOMAINS から管理画面に移動すると…

> You appear to be in a country where Google Domains is not yet available. Learn more

お前の国では Google Domains 使えねーよ！とのこと

Lern more先を見ると

> You appear to be in a country where Google Domains is not yet available.
> You may manage your existing domains, but you will only be able to make a purchase if you have a billing address in a supported country. Learn more

既存のドメインは管理できるけど購入はNG、ってことなので移管できるよね、きっと

ただし、そのままでは操作ができないので、画面下の Billing / Legal Country を United States に変えて続行

# 移管してみる

## 転入ドメインの現状の確認

https://domains.google.com/

右上の MANAGED MY DOMAINS から管理画面に移動
Transfer in で転入の画面へ移動
対象のドメインを入力して Continue

### Prepare your domain for transfer 画面

以下4つのチェック項目を確認

* (a) Unlock XXXX.net
* (b) Set WHOIS contact info to 'public'
* (c) Confirm registrant contact email address
* (d) Get authorization code

(a),(b),(c) はクリア
ただし(c)の連絡先はさくらのものになっているので要変更(後述)
(d)はまだ移管手続き始めてないのであるわけがない

lockってなんぞや？って思ってたのでそこが通ってて一安心


## 移管元の操作

さくらの以下ページ参照
https://help.sakura.ad.jp/hc/ja/articles/206205801-gTLD%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%BB%A2%E5%87%BA%E6%89%8B%E9%A0%86-%E3%81%95%E3%81%8F%E3%82%89%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%8B%E3%82%89%E4%BB%96%E7%A4%BE%E3%81%B8-

管理者メールアドレスは前述Google Domainsのチェック(c)に相当するもの
Whoisに載るので普段使うアドレスとは別で用意しておいた方が良いかも
今回はサブで使っている outlook.com のアドレスにエイリアスで追加して使用

## registrant アドレスの変更

承認コードと管理者アドレスの変更完了の連絡が来たのでWhoisで確認すると Admin Email のみ申請した管理者アドレスになっている
求められているのは registrant のアドレスなので、さくらのドメインの管理画面から別途変更する

GoogleDomainsの [Transfer in ページ](https://domains.google.com/registrar#t=t&chp=t)で再度対象ドメインの状況を確認

(c)Confirm registrant contact email address が自分のアドレスになっていることを確認する


## 移管申請

GoogleDomainsの [Transfer in ページ](https://domains.google.com/registrar#t=t&chp=t)で再度対象ドメインの状況を確認した続きでそのまま申請する

(d)Get authorization code にメールで来たコードを入力して Accept and Proceed


### Import your domain's web settings 画面

Detect and import my domain's current settings (recommended)
で取り込まれた内容を確認
www用,mailが何レコード、その他が何レコードみたいに数でしか出ないので色々細かく登録してるとめんどくさいかも

ただ今回は塩漬けドメインで愉快なレコードは登録してないので問題なし

Accept and Proceed で続行

### Transfer! 画面

ドメインの現在の有効期限とGoogleでの費用なんかが表示されるので確認

> When you transfer, you retain all the time of your current registration and add an extra year.

転送するとドメイン更新して有効期限が延びる模様

Transfer! で続行


### Confirm contact information 画面

素直に自分の情報を登録

Make my info private. にチェック

Continue で続行

### 決済画面

手持ちのカード(SMBC VISA,SAISON AMEX)じゃダメだった…
最初に言われたとおり、日本はダメってことなんだろう
日本発行のカードだからダメなのか住所がダメなのかは不明
ともあれ断念

# 仕方ないので

Route53に移管したった
移管自体とりやめても良かったんだけど、転出手続き始めておいて、やっぱやめた、はかっこ悪い気がしたので･･･
React Nativeでinit直後の`Print: Entry, ":CFBundleIdentifier", Does Not Exist`を直した

*これ以外にも解決方法があるようなのでこれで解決しなかったら他のエントリも参照ください。

`react-native run-ios`を実行したとき、ログを見ると

```
Installing build/Build/Products/Debug-iphonesimulator/MyApp.app
An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=2):
Failed to install the requested application
An application bundle was not found at the provided path.
Provide a valid path to the desired application bundle.
Print: Entry, ":CFBundleIdentifier", Does Not Exist

Command failed: /usr/libexec/PlistBuddy -c Print:CFBundleIdentifier build/Build/Products/Debug-iphonesimulator/MyApp.app/Info.plist
Print: Entry, ":CFBundleIdentifier", Does Not Exist

```

と出てたので、そのままの場所で

```
ls ios/build/Build/Products/Debug-iphonesimulator/
```

とすると何もない。
なので、ここに色々吐き出すようにxcodeで設定する。

# Xcodeの設定変更
1. xcodeでxcworkspaceを開く
2. Menu > Xcode > Preference > Locations を開く
<img width="304" alt="スクリーンショット 2019-07-14 12.12.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60457/317f8bca-b195-469b-1a19-4c481902c60d.png">


3. Advanced...ボタン押す
<img width="790" alt="スクリーンショット 2019-07-14 21.03.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60457/71500b3d-ff4c-3e24-672b-e39625b5bc5b.png">


4. 以下のように設定。
 
<img width="788" alt="スクリーンショット 2019-07-14 21.03.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60457/058f4c1f-3cab-0a8e-d8a1-1837982a8e07.png">

Doneを押してもう一度`react-native run-ios`で確認。

# Watchmanのpermission errorが出た場合
以前はXcodeの修正をすればよかったのですが、最近改めて確認したら以下のようなwatchmanのエラーが出てしまった。

```
Loading dependency graph...2019-07-14T17:56:49,808: [241456576] opendir(/usr/local/var/run/watchman/gen-state): Permission denied

Watchman:  watchman --no-pretty get-sockname returned with exit code=1, signal=null, stderr= 2019-07-14T17:56:49,808: [241456576] opendir(/usr/local/var/run/watchman/gen-state): Permission denied
```
まぁ、権限あたえるしかないようだったのでchownで権限を与えます。

```
sudo chown -R $USER:$GROUP /usr/local/var/run/watchman/
```

もう一度`react-native run-ios`で確認。

# 参考：環境
```
$ react-native -version
react-native-cli: 2.0.1
react-native: 0.60.3

$ xcodebuild -version
Xcode 10.2.1
Build version 10E1001

$ watchman --version
4.9.0
```

以上！
WordpressにてAdvanced Custom Fieldsの値を記事本文に表示させたい。

企業ホームページをWordPressで構築しております。
これまで簡単なサイトの構築経験はありますが、本格的にWordPressに関わるのは最近なので知識やTipsの投稿というよりは問題点を皆さんのお知恵で解決できればと。

前述通りWordPressで企業サイトを作成していますがその中でいわゆる価格表的なモノを記事本文に表示させたいと模索しています。

- テーマはSimplicity2を使用し通常の投稿ページを使用。カスタム投稿でもOK。
- プラグインとしてAdvanced Custom Fields。
- 上記の表が埋まるようにカスタムフィールドの値は入力済み。


<table>
<tr bgcolor="FFFFFF"><td style="background-color:#FFFFFF;">hoge01</td><td>hoge001</td><td>hoge0001</td></tr>
<tr bgcolor="FFFFFF"><td style="background-color:#FFFFFF;">hoge02</td><td>hpge002</td><td>hoge0002</td></tr>
<tr bgcolor="FFFFFF"><td style="background-color:#FFFFFF;">hoge03</td><td>hpge003</td><td>hoge0003</td></tr>
<tr bgcolor="FFFFFF"><td style="background-color:#FFFFFF;">hoge04</td><td>hpge004</td><td>hoge004</td></tr>
<tr bgcolor="FFFFFF"><td style="background-color:#FFFFFF;">hoge05</td><td>hoge005</td><td>hoge0005</td></tr>
</table>

こんな感じの表を記事本文内に表示させようとしています。
表の下に記事本文や画像などを表示させます（位置は変動するかも）

Advanced Custom Fieldsを使用しているのは入力した値で検索を動かす予定でいます。
本文内にtable組んで入力した場合、上手く検索できないと考えているのと、ソート出来るフォームを追加する予定だからです。

フィールドの表示（出力）方法については色々と検索し試してみました。

- entry-body.php
- functions.php
- home.php
- single-page.php
- single.php

上記のファイルにて色々試しました。
あちこちにコードを記載してみましたがどうにも上手くいかず、皆様のお知恵をお借りしたいと思った次第です。


よろしくお願いいたします。
D言語で引数のfunctionに@nogcが要求された時に、強引にnogcではないものを渡す方法

どうも。
タイトル通りです。

この記事を書くきっかけとなったのが、`core.stdc.signal`の`signal`を使おうとした時に、引数の型が`extern(C) @nogc nothrow void function(int)`を要求していて、`extern(C) void function(int)`を渡そうとしてたけど`@nogc`に苦しめられていたのですが、先日Phobosのコミッターの方とご飯を食べに行った時に、「それ多分適当にキャストすればなんとかなるよ」って言われたのを思い出して試してみた感じです。

##具体的にどういうことか。

次のコードは不正です。

```D:test.d
import std.stdio;
import core.stdc.stdio;

alias handler_t = @nogc nothrow void function();

void handler_executor(handler_t handler) {
  handler();
}

@nogc nothrow void handler_func_1() {
  printf("handler_func_1!\n");
}

void handler_func_2() {
  writeln("handler_func_2!");
}

void main() {
  handler_executor(&handler_func_1);
  handler_executor(&handler_func_2);//←ここがダメ
}
```

`//←ここがダメ`と書いた部分がダメです。というのも、`handler_func_2`には`@nogc`も`nothrow`もついていないからです。

##どうすればいいか
で、どうすればいいか、→つけちゃえばいい。簡単ですね。
キャストして表面的につけてしまえばいいのです。
つまり、

```D:test.d
import std.stdio;
import core.stdc.stdio;

alias handler_t = @nogc nothrow void function();

void handler_executor(handler_t handler) {
  handler();
}

@nogc nothrow void handler_func_1() {
  printf("handler_func_1!\n");
}

void handler_func_2() {
  writeln("handler_func_2!");
}

void main() {
  handler_executor(&handler_func_1);
  handler_executor(cast(handler_t)&handler_func_2);//←これならok
}
```

これで、`@nogc`がついてない`writeln`を内部で呼んでいるのにも関わらず`handler_executor`に`handler_func_2`を渡すことが出来ます。
これはまぁ、強引にキャストすることで型チェックをごまかしているので通るのは当然ですね。
ただ、`@nogc`や`nothrow`というのは、関数の特性を表すためのアノテーションであり、`@nogc`は内部でGCを使わないこと, `nothrow`はその関数が例外を吐かないことを約束することの表明ですが、`non-@nogc`や`throwable`なコードが`@nogc nothrow`の中で呼ばれるのは微妙な気分にはなりますね...(仕方ないですけど。)

##で、結局どんなことができるのか
例えばプログラムが`SIGINT`を受け取った時に特定の処理を行いたい！となった時に、その処理が「`non-@nogc かつ throwable`な処理」であったときにその処理を行うことが出来ます。

```D:test.d
import std.stdio;
import core.stdc.stdlib,
       core.stdc.signal;

alias sighandler_t = extern(C) @nogc nothrow void function(int);

void sigint_handler(int s) {
  writeln("SIGINT!!!");
  exit(0);
}

void main() {
  signal(SIGINT, cast(sighandler_t)&sigint_handler);

  while (true) {
    writeln("LOOP!");
  }
}
```

こんな感じのコードが書けます。
これを応用すると、プログラムが`SIGINT`で終了された時に動いてるスレッドに対して停止命令を出したりできますね。
mxnetをWindowsにインストール

* ビルド済みのライブラリはこちら https://github.com/yajiedesign/mxnet/releases
* 20170304_mxnet_x64_vc14_gpu (A)
* prebuildbase_win10_x64_vc14 (B)
    * の2つをDLし、C:\Program Files\mxnetに配置
* Aの中身をBにコピーする
* C:\Program Files\mxnet\prebuildbase_win10_x64_vc14\3rdparty\cudnn にcuDNNを配置する
* CUDAの設定は済んでいるとする
* setupenv.cmdは実行すると環境変数を自動設定するが、cmdでは1024以上の文字列は切り捨てるので危険。避けるべし
    * もし実行してしまってPATHが吹っ飛んだら、生きているcmdでPATHと打って復元を試みる
* PATHをGUIから通す

![環境変数名の編集 2017-03-04 18.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/12309/b00e27f8-b651-d8f7-5a69-75ee2a5b1152.png)

* cmdでpythonを起動し、import mxnetが通ることを確認する
スクレイピング用のDockerコンテナをつくる

## Dockerfile
```
FROM ubuntu:16.04

# Install.
RUN \
  apt-get update && \
  apt-get install -y python3 python3-pip && \
  pip3 install --upgrade pip && \
  pip3 install selenium && \
  pip3 install beautifulsoup4 && \
  apt-get install -y wget libfontconfig && \
  mkdir -p /home/roor/src && cd $_ && \
  wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 && \
  tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 && \
  cd phantomjs-2.1.1-linux-x86_64/bin && \
  cp phantomjs /usr/local/bin/ && \
  apt-get install -y fonts-migmix

# Add file.
ADD etc/config/local.conf /etc/config/local.conf

# Set environment variables.
ENV LANG ja_JP.UTF-8
ENV PYTHONIOENCODIND utf_8

# Define default command.
CMD ["bin/bash"]
```

## ソースコード
- https://github.com/t-taira/ubuntu-phantomjs 

## 参考
- [Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう](https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-BeautifulSoup-scikit-learn-TensorFlow%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/dp/4802610793/ref=sr_1_15?ie=UTF8&qid=1488619241&sr=8-15&keywords=python+amazon)
Electron入門 その1 Quick Start

## 前書き

デスクトップアプリを作成する為、Electronやってみる。
[公式サイト](https://electron.atom.io/)に載っているQuick Start通りの手順を実行してみる。


## Quick Start

```
# Clone the Quick Start repository
$ git clone https://github.com/electron/electron-quick-start

# Go into the repository
$ cd electron-quick-start

# Install the dependencies and run
$ npm install && npm start
```

## 起動した

![スクリーンショット 2017-03-04 18.07.28.png](https://qiita-image-store.s3.amazonaws.com/0/39834/2236c83b-e96e-bc9b-01ca-a569d12b8dbb.png)

## DevToolsを非表示にする

起動時にDevToolsが起動するの嫌なので、下記コメントアウトする。

```
// Open the DevTools.
// mainWindow.webContents.openDevTools()
```

![スクリーンショット 2017-03-04 18.21.46.png](https://qiita-image-store.s3.amazonaws.com/0/39834/5d4085e1-2963-6f28-0ff5-3a877e2f31d1.png)

ものの数分で、デスクトップアプリが出来た。素敵。

次回 [Electron入門 その2 React導入](http://qiita.com/takumarakann/items/49ae3891decd461fe580)
複数ストレージアカウントを持つ HDInsight クラスタの作成

#HDinsight クラスタ作成時の制約
通常 Azure ポータルより [HDInsight](https://azure.microsoft.com/ja-jp/services/hdinsight/) クラスタを作成する場合、ストレージアカウントは1つしか指定できません。また構築後に Azure ポータルからストレージアカウントを追加する事もできません。
#PowerShell による HDInsight クラスタの作成
これに対し PowerShell による HDInsight クラスタの作成では、ストレージアカウントを追加して構築する事が可能です。これにより HDInsight コンピュートクラスタは複数のストレージに格納されているデータへアクセスする事が可能になります。 

```ps1:createcluser.ps1
# Azure サブスクリプションへのログイン
Login-AzureRMAccount

# 作成済みストレージアアカウント２つを利用 
$storageAccountResourceGroupName = "rg-storage"
$storageAccountName1 = "bigstorage1"
$storageAccountKey1 = (Get-AzureRmStorageAccountKey -ResourceGroupName $storageAccountResourceGroupName -Name $storageAccountName1)[0].value
$storageAccountName2 = "bigstorage2"
$storageAccountKey2 = (Get-AzureRmStorageAccountKey -ResourceGroupName $storageAccountResourceGroupName -Name $storageAccountName2)[0].value

# Spark クラスタ設定項目
$location = "Japan West"
$clusterResourceGroupName = "rg-sparkcluster"
$clusterName = "my-spark"
$sshCreds = Get-Credential
$webCreds = Get-Credential
$storageContainer = "sparkroot"

# Spark クラスタ用のリソースグループをストレージとは別に作成
New-AzureRMResourceGroup -Location $location -Name $clusterResourceGroupName

# ２つのストレージアカウントを持つ Spark クラスタを作成
New-AzureRmHDInsightClusterConfig `
            | Add-AzureRmHDInsightStorage `
                -StorageAccountName "$storageAccountName2.blob.core.windows.net" `
                -StorageAccountKey $storageAccountKey2 `
            | New-AzureRmHDInsightCluster `
                -ClusterType Spark `
                -ClusterTier Premium `
                -OSType Linux `
                -ClusterSizeInNodes 4 `
                -ResourceGroupName $clusterResourceGroupName `
                -ClusterName $clusterName `
                -HttpCredential $webCreds `
                -SshCredential $sshCreds `
                -Location $location `
                -DefaultStorageAccountName "$storageAccountName1.blob.core.windows.net" `
                -DefaultStorageAccountKey $storageAccountKey1 `
                -DefaultStorageContainer $storageContainer
```

上記スクリプトを実行すると Get-Credential により SSH および WEB ログイン用のユーザー名、パスワードの入力画面が 2 回ポップしてきます。それぞれに対話的な入力が必要です。
![コマンドパイプライン.png](https://qiita-image-store.s3.amazonaws.com/0/166732/c9c80f7a-db1d-1478-de6f-ed67b35d50ff.png)

クラスタの作成が成功すると Azure ポータルの HDInsight 管理画面で以下のように2つのストレージアカウントが接続されているのが確認できます。
![2ストレージpng.png](https://qiita-image-store.s3.amazonaws.com/0/166732/95a725aa-5808-92d0-79a6-4119b97f1164.png)

#HDinsight クラスタの破棄と再作成
HDInisght クラスタのコンピュートノードは、通常の Azure 仮想マシンのように停止をする事が出来ません。現状ではクラスタの破棄と再作成を実施する事でクラスタのコンピュート課金を抑制する事が可能です。HDInisght クラスタを破棄した後も利用していたストレージを残しておけば、再度同じストレージをアタッチして作成する事で前回の HDInsight 構成や解析結果等を引き続き利用する事が可能です。このため上記スクリプトでは既存のストレージを利用して HDInsight クラスタを作成する流れを示しています。

以下の画面キャプチャは、HDInisght クラスタを破棄した後のストレージ内のデータ保持状態を示しています。同じストレージおよび storageContainer を指定して HDInsight クラスタを再作成する事で再利用できます。
![sparkroot2.png](https://qiita-image-store.s3.amazonaws.com/0/166732/d273fbf8-2210-c45a-58dd-ec1008aa3fe8.png)
Rails 5.1.0.beta1 と PostgreSQL をローカル Mac でうごかしてみる。scaffold まで。

# PostgreSQL

myapp という rails プロジェクトを作成する前提で、データベース名は `myapp_development` としておきます。（開発環境のデフォルトが {project}_development のため）

```zsh:zsh
$ brew install postgresql

# 起動
$ postgres -D /usr/local/var/postgres

# 上のコマンドはログを出しているので、別コンソールで。作成。
$ createdb myapp_development
```

Ref. [ローカル Mac で PostgreSQL を起動したり停止したり](http://qiita.com/mochizukikotaro/items/84204d5c46b67c9b74f4)

# Rails 5.1.0.beta1

```zsh:zsh
$ mkdir workspace; cd $_
$ bundle init
$ vi Gemfile
```

```rb:Gemfile
source "https://rubygems.org"

gem "rails", "5.1.0.beta1"
```
```zsh:zsh
$ bundle install --path vendor/bundle
$ bundle exec rails new -BT -d=postgresql myapp
$ cd myapp
$ bundle install --path vendor/bundle
$ bundle exec rails s
````

ここまでで、`localhost:3000` にアクセスが可能。

![スクリーンショット 2017-03-04 17.55.50.png](https://qiita-image-store.s3.amazonaws.com/0/45822/42b60913-5795-7d3d-1419-a5d02aef000f.png)

# scaffold

```zsh:zsh
$ bundle exec rails g User name:string email:string
$ bundle exec rails db:migrate
$ bundle exec rails s
```

4系までは、`rake db:migrate` だった。

![スクリーンショット 2017-03-04 18.01.55.png](https://qiita-image-store.s3.amazonaws.com/0/45822/253043ad-fea0-5aa6-a167-46f0a37db236.png)

# フィアル構成について

上のサンプルだとこのようなファイル構成になります。

```
└── workspace
    ├── Gemfile
    ├── Gemfile.lock
    ├── myapp
    │   ├── Gemfile
    │   ├── README.md
    │   ├── Rakefile
    │   ├── app
    │   ├── bin
    │   ├── config
    │   ├── config.ru
    │   ├── db
    │   ├── lib
    │   ├── log
    │   ├── package.json
    │   ├── public
    │   ├── tmp
    │   └── vendor
    └── vendor
        └── bundle
```

いつも、上のような構成でやっていたのですが、これは、Gemfile が２つできます。これでもいいとは思うのですが。もし下のような構成にしたい場合。

```
└── workspace
    ├── Gemfile
    ├── Gemfile.lock
    ├── README.md
    ├── Rakefile
    ├── app
    ├── bin
    ├── config
    ├── config.ru
    ├── db
    ├── lib
    ├── log
    ├── package.json
    ├── public
    ├── tmp
    └── vendor
```

```zsh:Gemfileを上書き
$ bundle exec rails new . -BT -d=postgresql --force
```

とすればよいとおもいます。

以上です。
Sourcetreeでコミット時にovercommitを動くようにする

## 概要
[この記事](http://qiita.com/kompiro/items/6d3b3f2a3836472e1eb8)で紹介されている様に、overcommitと呼ばれているgemを使えば、gitのhookを便利にできます。

ただ、SourceTreeなどの、Gitクライアントはgit commit時にovercommitのコマンドのパスが通っていなく、動作しない。
それを動作するようやりかたを記述する。

## 前提
[この記事](http://qiita.com/kompiro/items/6d3b3f2a3836472e1eb8)を見て、overcommitのコマンドが使えること

## 動かし方
以下のコマンドを用いて、CUIから、Sourcetreeを起動する。
```open -a Sourcetree```

## rubocop設定例
```
PreCommit:
  RuboCop:
    enabled: true
    command: ['bundle','exec','rubocop'] # rubocopをbundle経由で実行する
    on_warn: fail # Treat all warnings as failures
```
Google App EngineのFlexible Environment Java 8でpropertiesファイルを使う

# はじめに
GAEのFlex Java 8でpropertiesファイルなどの設定ファイルを使う方法です。

# TL; DR
* `src/main/webapp/WEB-INF/`配下においておく
* `/var/lib/jetty/webapps/root/WEB-INF/`から読み込む

# 置く場所
App Engineではビルドされたwarファイルなどがtarでアーカイブされ、AppEngine側のDockerコンテナ内に展開されるようになっています。
なので、設定ファイルもtarに含まれるようにする必要があります。

`WEB-INF`に置いておけばwarに含まれるようになります。

なのでこんな感じで`config.properties`を置いておけばOKです。

```bash
.
└── src
    └── main
        ├── appengine
        │   └── app.yaml
        ├── java
        │   └── ...
        ├── main.iml
        └── webapp
            └── WEB-INF
                ├── appengine-web.xml
                ├── config.properties
                └── web.xml
```

tarには他にDockerfileやapp.yaml、warファイルなどが含まれています。

# 見る場所
GAEのFlexでは前述の通りtarがDockerコンテナに展開されます。

`WEB-INF`は`/var/lib/jetty/webapps/root/WEB-INF/`に展開されます。
なのでここからpropertiesファイルを読み込めばOKです。

アプリのワーキングディレクトリは`/var/lib/jetty`になるので相対パスでも指定できます。
'git push -u origin --all'を阻まれたでござるの巻

# こんにちは`Permission denied (publickey).
久しぶりにbitbucketにpushしようとしたら…

```
$ git push -u origin --all
Permission denied (publickey).
fatal: Could not read from remote repository.

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

お馴染みの`Permission denied (publickey).`と遭遇．

とりあえず`「Permission denied bitbucket」`，というシンプルなググりをすると，解決できそうな記事に出会いました．いい時代です．
>
参考文献：Gitで”Permission denied (publickey).” が出たときのメモ
http://qiita.com/sygnas/items/43306a738f01cb7ab45c

さて，これを頼りに解決しますか…

# 解決編
書き忘れてましたがMac OSXの話です．
上記参考文献に従ってまずはsshの鍵を作成します．
デフォルトだとid_rsaに吐かれるようなのですが，既にid_rsaが有ったのでわかりやすいようにbitbucket_rsaという名前で作ります．

```
$ ssh-keygen -t rsa -C <bitbucket登録メールアドレス>
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/***/.ssh/id_rsa): /Users/***/.ssh/bitbucket_rsa
```

この時passphraseを聞かれましたが，いちいちパスワード入れるの面倒くさいので無しでEnterを叩きました．
これで`~/.ssh`に`bitbucket_rsa`と`bitbucket_rsa.pub`が作られたと思います．

で，鍵ができたのでconfigの中身を変更します．

```~/.ssh/config
Host bitbucket.org
  HostName bitbucket.org
  User git
  Port 22
  IdentityFile ~/.ssh/bitbucket_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```
次はbitbucket側に公開鍵情報を登録しに行きます．

```
$ pbcopy < bitbucket_rsa.pub
```
で公開鍵の中身をクリップボードにコピーし．bitbucketのアカウント管理のところに貼ってください．詳しくは下記の参考文献の方を参照してください…
>
参考文献：Bitbucketアカウントに公開鍵をインストールする方法
https://confluence.atlassian.co.jp/pages/viewpage.action?pageId=35095449

さて，これで大丈夫なはず！
ログインできるか確認してみましょう．

```
$ ssh -T git@bitbucket.org
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/***/.ssh/bitbucket_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /Users/***/.ssh/bitbucket_rsa
Permission denied (publickey).
```
あれ…（汗）
パーミッションの設定が開きすぎだぞって怒られました．
そこで，秘密鍵のパーミッションを644(-rw-r--r-)から600(-rw-------)に変更します．

```
$ chmod 600 bitbucket_rsa
```

一応`$ls -la`で確認してみるとちゃんと`bitbucket_rsa`のパーミッションが変更されていたので，再びログインできるか確認．

```
$ ssh -T git@bitbucket.org
logged in as ***

You can use git or hg to connect to Bitbucket. Shell access is disabled.
```

できました．
SoftLayerで使われているＣＰＵをまとめてみて(2017年3月)

以前まとめた
SoftLayerで使われているＣＰＵをまとめてみて(2015年12月)
インテルからも新しいCPUが出てきたりしたのでアップデート、Bluemix Infrastructure(SoftLayer)で追加されたのはE5シリーズです。(Broadwell)
![スクリーンショット 2017-03-04 17.43.12.png](https://qiita-image-store.s3.amazonaws.com/0/59741/50a1a70f-3a8d-5ee3-1ce3-9f95c9daa8e5.png)
さて今年は何が追加されるのか楽しみです。
オフラインリアルタイムどう書くE12 の 回答

参加して解きました。

各行の最大高さを覚えて、どこで止まるかを計算しています。

``` e12.rb

def get_stop_point( board, mino, right )
  mino.map { |w_offset, h_offset, height|
    board[right + w_offset] - h_offset
  }.max
end

def update_board( board, mino, right, stop )
  mino.each { |w_offset, h_offset, height|
    board[right + w_offset] = stop + h_offset + height
  }
end

def solve(input)
  board = Hash.new(0)
  input.scan( /(\d+)([ILOST])/ ) { |right, c|
    right = right.to_i
    mino = {
      'I' => [
        [ 0, 0, 4, ],
      ],
      'L' => [
        [ 0, 0, 3, ],
        [ 1, 0, 1, ],
      ],
      'O' => [
        [ 0, 0, 2, ],
        [ 1, 0, 2, ],
      ],
      'S' => [
        [ 0, 0, 1, ],
        [ 1, 0, 2, ],
        [ 2, 1, 1, ],
      ],
      'T' => [
        [ 0, 1, 1, ],
        [ 1, 0, 2, ],
        [ 2, 1, 1, ],
      ],
    }[c]
    stop = get_stop_point( board, mino, right )
    update_board( board, mino, right, stop )
  }
  board.values.max.to_s
end

def test(input, answer)
  result = solve(input)
  if result != answer then
    puts 'NG: input = %s, answer = %s, result = %s' % [input, answer, result,]
    exit 1
  else
    puts 'OK: input = %s, answer = %s' % [input, answer,]
  end
end


test("1O3L0I0T", "5")
test("0I", "4")
test("0I0I", "8")
test("0I1I2I3I4I", "4")
test("0S0I", "5")
test("0I0S", "6")
test("2S0T2O3I", "8")
test("4O4T1T0S4L1L3L", "10")
test("0S2S4S6S8S10S12S14S", "16")
test("14S12S10S8S6S4S2S0S", "2")
test("5I2O10I0O4L10T9T11L8I2I10I12O7L12T12T12S11T9O10O13I12O10O7I9I7O0S1O2S0L1L", "23")
test("9T14L10L8T4I1T3S5I8T12O3S7L9O7L14T2I7O3S6S2L0L13T10O4I9T7L8S0I12O9S11L11T14T", "27")
test("9S9S7O11O16I2T9O12L10T9O0O13I9O1I2T14S7O9S11T5L7I14T13O0T12I3S10L10O7I15I6S2L12S8I16I3L", "23")
test("11T13I16S15T7O10L12S1I5I8S5I13I15O8S9I1T12I1S5S0L14I12L16T2S2S8L2S14L16O4I13L15L13S11S9T13S9S3L6O", "22")
test("12L10S7I5L14T12S9L1T14I0I5L1T2O18T9L0I15I16L10S1O15I0L17O5L18T4I18L7L7I13I3I12I2S3T5T3S16L14S14O11O15T14S", "17")
test("0S18S2S19I14T7L14L2L6I9I0L4I5L13L15I8S8T2I5I7O18T3S1T7I2L8O0S20T9I14T5L5I1T4L9O8T19T5S12O16T19L4O10O10T14L", "24")
test("7T5L6S4S8T6S10I19O20L14I18L21S7I11S11O1L13T20O9I7L2T8L2S20L3O14L9T17I8L8S14I6T2O11T21O18O6T15T1S3L6O19S18O20S19O16T6S14T", "26")
test("18S2I4S16L13S17I21O8I17T8I14O12T20I20S19S16S13T12T20I22I15O2I2I8I2S18I9I9T6O13O13L17I2L20L2L4I9I19O11T3S10O2S18T12I5O11S19O21S6I17T17S", "26")
test("11L5S0T22S18O13T2O22S15I12I21T16I3I1I22L11L11L22O13S24S15L13T15S19L10O15T7S24T19L0T13O11I12T13S4I24L15O3S19O10L19O0S20L7O11L21I22S18T19T23O8I22S24L0S", "21")
test("7L7I11T7S18O17L8S15L9I3O24S3O1O5O14L9T13S2O25S22T10T8L24S18S13T1O1L6I10I4S13O3S7L10T1T4L17S20I18O15S25S23S21I19T6O24S9L2O2O15L12L8L8O18I18L0T5O", "31")
test("999I999I999I999I999I999I999I999I999I999I999I", "44")
```
TouchDesigner Pythonの外部Moduleを使用する方法

TouchDesignerでは, 以下の方法でモジュールの読み込みを行うことによって, サードパーティ製のPythonライブラリを使用することができます. 

## 64bitビルドされたPythonをインストール
https://www.python.org/downloads/windows/

Windows x86 xxxxxxxx (32bit)
でなく、
Windows x86-64 xxxxxxxx (64bit)
を選択しインストール

## pipコマンドを使って必要なパッケージをインストール

例としてNumPyという数値計算モジュールをインストールしてみます

```cmd
pip install NumPy
```
インストール完了です
![bandicam 2017-03-03 22-30-39-656.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/8513223a-070f-84ab-4fc9-03c2c4043d4f.jpeg)



## TouchDesignerを開き, **Edit**メニューの**Preferences**をクリック
![bandicam 2017-03-04 16-31-50-719.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/6ec9fcd3-4d45-8d9f-528b-6ee9b0ea8ea8.jpeg)


## **General**タブ内の**Python 64-bit Module Path**に 64-bit Pythonの**site-packages**フォルダを追加する.


![bandicam 2017-03-04 16-32-54-591.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/9ce88ebe-84fc-ca46-8ff1-31480f8675e7.jpeg)

このフォルダは, Pythonがインストールされたフォルダの**Lib**フォルダの中にあります

![bandicam 2017-03-04 16-33-27-966.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/e26c0f22-be0b-7890-e92a-b88a335a6041.jpeg)

## Text DATを作成し, 通常のimportコマンドを使ってモジュールが使用できるかテストしてみます

![bandicam 2017-03-04 16-34-26-903.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/9c7471cb-6cb7-feb1-1f40-c331a65fac2e.jpeg)

![bandicam 2017-03-04 16-35-30-106.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/65bb7e4f-016d-60cf-eaac-78cbf215e7d8.jpeg)


#### 参照
https://nvoid.gitbooks.io/introduction-to-touchdesigner/content/Python/9-6-External-Modules.html
オフラインリアルタイムどう書く E12 の ruby による実装例

問題：http://mtsmfm.github.io/2017/03/04/doukaku-e12.html
解答リンク集：http://qiita.com/mtsmfm/items/d307c7b884cd86621262

```ruby
require "benchmark"

TETS={
  "I"=>[0..3],
  "L"=>[0..2, 0..0],
  "O"=>[0..1, 0..1],
  "S"=>[0..0, 0..1, 1..1],
  "T"=>[1..1, 0..1, 1..1]
}

def impl( pos )
  field=Hash.new{ |h,k| h[k]=0}
  pos.each do |n,name|
    tet = TETS[name]
    y=(0...tet.size).inject(0){ |acc,tx|
      [acc,field[tx+n] - tet[tx].min].max
    }
    tet.each.with_index(n) do |t,tx|
      field[tx] = y+t.max+1
    end
  end
  field.values.max
end

def solve( src )
  impl(src.scan( /(\d+)(\D)/ ).map{ |n,t| [n.to_i,t] }).to_s
end

$stdout.sync=true

DATA.map do |line|
  /(?<num>\w+)\s+(?<src>\S+)\s+(?<expected>\S+)/=~line
  actual = nil
  tick = Benchmark.realtime{  actual = solve( src ) }
  okay = actual==expected
  puts( "%s %s %s->%s ( e:%s ) tick=%.3f" % [ ( okay ? "ok" : "**NG**" ), num, src[0,70], actual, expected, tick] )
  okay
end.all?.tap{|x| puts( x ? "everything is ok" : "something wrong" ) }

__END__
0 1O3L0I0T  5
1 0I  4
20  999I999I999I999I999I999I999I999I999I999I999I  44 
```

テストデータの大半は省略。

フィールドの表現は、x座標をキーにして、天井の高さを値にした Hash にした。
それに合わせて、テトロミノの表現も、下端と上端のペアの配列にした。
図を描く都合があったら選べない表現だけど、今回は出題者ではないのでこれでよい。
あと。回転がないからえらべる表現でもある。

所要時間は 三十数分。くだらないバグにハマってしまった。