OmniAICreator/Qiita-1.07M huggingface dataset:
完全順列をランダムに生成しよう

[全要素が移動する（同じ位置に残らない）shuffle](http://qiita.com/a_hasimoto/items/7ec3fe15967f61bb12c8) で，全てのパターンが出るとは限らない，という議論がなされていたので私も少し考えてみました．

## 完全順列になる確率

いわゆる[完全順列](https://ja.wikipedia.org/wiki/完全順列)（撹乱順列, derangement）の問題です．

$$[1, 2,\ldots, n]$$
というリストを
$$[i_1, i_2, \ldots, i_n]$$
と並び替えたとき，$k\neq i_k\ (k=1, \ldots, n)$ となっているものを完全順列といいます．$n$ 個のリストをランダムに並び替えたとき，それが完全順列になっている確率 $p_n$ の極限値は $1/e$（$e$ はネイピア数で約 $2.71$ ）であることが知られており（収束も非常に速いです），$p_3 = 1/3$ なので，$n\geqq 3$ のとき，だいたい
$$
\frac{1}{3} \leqq p_n\leqq \frac{1}{e} \fallingdotseq 0.367879 
$$
という不等式が成り立ちます．つまり，普通にシャッフルすれば，$1/3$ 以上の確率でそれは完全順列になっているということです．そして，もし完全順列じゃなくてもせいぜい $3$ 回シャッフルすればほぼほぼ完全順列を得ることができるということです．よってあまり芸がないのですが，完全順列になるまでシャッフルを繰り返す，が私の結論でした（笑）．

```python
import numpy as np

def derange(items):
    if not isinstance(items, np.ndarray):
        items = np.array(items)
    index = np.arange(items.size)
    rand_index = index.copy()
    while 0 in index - rand_index: #0を含んでいれば完全順列でない
        np.random.shuffle(rand_index)
    return items[rand_index]
```

```python
for i in range(100):
    print(derange(range(4)))
```

```:out
[1 0 3 2]
[3 2 0 1]
[1 2 3 0]
[3 2 0 1]
[2 3 1 0]
[3 0 1 2]
[3 2 0 1]
[2 3 1 0]
[1 2 3 0]
[3 2 1 0]
[1 2 3 0]
[2 0 3 1]
[3 2 0 1]
[2 3 1 0]
[3 2 0 1]
[2 3 1 0]
[1 3 0 2]
[1 3 0 2]
[3 2 1 0]
[2 3 0 1]
[2 3 0 1]
[2 0 3 1]
[1 3 0 2]
[1 0 3 2]
[2 3 1 0]
[2 3 0 1]
[1 2 3 0]
[3 2 1 0]
[3 0 1 2]
[2 3 0 1]
[1 2 3 0]
[2 0 3 1]
[3 2 1 0]
[3 2 1 0]
[3 2 1 0]
[1 0 3 2]
[1 2 3 0]
[2 3 1 0]
[3 0 1 2]
[1 2 3 0]
[1 3 0 2]
[2 3 1 0]
[2 3 1 0]
[1 2 3 0]
[2 3 1 0]
[1 2 3 0]
[3 2 1 0]
[3 2 0 1]
[2 0 3 1]
[1 0 3 2]
[2 3 1 0]
[1 2 3 0]
[2 3 0 1]
[1 2 3 0]
[2 3 0 1]
[2 3 1 0]
[3 2 0 1]
[3 2 0 1]
[3 0 1 2]
[3 2 1 0]
[2 3 1 0]
[2 0 3 1]
[1 0 3 2]
[1 2 3 0]
[2 0 3 1]
[1 2 3 0]
[2 3 1 0]
[3 2 1 0]
[1 2 3 0]
[2 0 3 1]
[3 0 1 2]
[1 0 3 2]
[3 0 1 2]
[3 2 1 0]
[1 0 3 2]
[3 2 0 1]
[2 3 0 1]
[2 3 1 0]
[2 3 1 0]
[2 3 1 0]
[1 0 3 2]
[3 2 0 1]
[1 0 3 2]
[1 2 3 0]
[1 0 3 2]
[2 3 1 0]
[1 0 3 2]
[1 2 3 0]
[1 2 3 0]
[2 3 1 0]
[3 0 1 2]
[3 0 1 2]
[3 2 1 0]
[3 0 1 2]
[2 0 3 1]
[1 2 3 0]
[1 3 0 2]
[2 3 1 0]
[2 3 0 1]
[3 0 1 2]
```

`[1, 0, 3, 2]` も確認できました．

## 没ネタ

最初に思いついたのは上のものですが，次のような方法も考えました．しかし，実行速度が遅かったので没にしました．

具体例で説明すると
$$[a, b, c, d, e]$$
をランダムに並び替えて
$$[a, b, e, d, c]$$
となった場合，動いていない $a, b, d$ を巡回させるように
$$\begin{align}
a \longmapsto b\\\\
b \longmapsto d\\\\
d \longmapsto a
\end{align}$$
という風に置き換えて，
$$
[b, d, e, a, c]
$$
とするものです．これならば一応確実に完全順列を得られますし，全てのパターンが出てくる可能性はあります（同様な確からしさは不明ですが）．しかしこの場合，動かなかったものが $1$ 個しかなかった場合は，巡回させられないので，それ以外のものと置き換える，という場合分けが必要になり，少しコードが複雑になります．
Mayaでシンメトリ選択している際に片側の頂点を中心に表示する（拡大はしない）

（maya2017LTを使用しています、念のため）
maya2016らへんだとFキーが表題通りの挙動でしたが
maya2017だと2点の中間の位置が中心になってしまいます
以下を設定すれば（拡大はしませんが）解決できます

ウィンドウ＞設定/プリファレンス＞ホットキー エディタ

この画面が出てきます（画像は設定後）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198123/03a72376-cfe9-2a4f-ff1b-8fd4b27131fb.png)

Other Items＞Viewport Items＞Frame Selected Without Child
Frame Selected Without Childを検索し
その割当を解除（Fのところを押して出てきた枠の×ボタン） 


![image.png](https://qiita-image-store.s3.amazonaws.com/0/198123/1719779e-a5ef-26f7-1bf9-678a6ab45d5a.png)

Other Items＞Viewport Menus＞Look At Selection
Look At Selectionを検索し
空欄クリック＞Fキー


これで選択箇所を中心に表示&回転出来るようになります。（拡大はしませんが）
OpenShift Online3 STARTERでNode.js 6.0 x MongoDB 環境を公開してみた②

# ②OpenShiftコンソールまとめ編

あんまりドキュメント読まずに流し見してわりかし想像が入った解説を書いていきます。
なので話半分で読んでください。

## Applications

### Applications - Deploys

そのまんまコンテナデプロイ～公開までやります。
DeploysページにはService(アプリケーションの部品)の一覧があります。
このアプリケーションの場合はNode.jsとMongoDBがそれぞれあります。

そのうちnodejs-mongo-persistent(Node.jsアプリケーション本体)のDeploys詳細ページが↓の画像になります。
Jenkinsでデプロイジョブ作ったようなあれですね。
![](https://goo.gl/mpobMg)

### Applications - Stateful Sets

2017-08-23現在、Technology Previewとなっています。

### Applications - Pods 
コンテナ一覧ぽいです。
AWSのEC2のコンソールみたい。
いやJenkinsでコンテナ起動ジョブ作った時のジョブ履歴みたいな画面の方が近そう。
failとかあるし。
OpenShift Online2 では「ギア」とか呼ばれてたやつ。

### Applications - Services

さっきちらっと出てきましたがアプリケーションを構成する部品の一覧と考えればいいかもです。
OpenShift Online2 では「カートリッジ」とか呼ばれてたやつ。

### Applications - Routes

ルーティング設定です。よくあるやつ。
httpsへのリダイレクトとか証明書設定とかホストネーム設定とかができるようです。
今回はスルー。

## Builds

### Builds - Builds

Jenkinsのビルド用ジョブみたいなものです。
ソースからアプリケーションをビルドするようです。
![Payload Too Large](https://goo.gl/MXFsmR)

終わったらDeploy処理を実行します。

### Builds - Pipelines

Jenkinsのビルドパイプラインそのものみたいです。公式ドキュメントにJenkinsの文字がありました。
お試ししてませんがjenkinsfileというファイルをアプリケーションのBuildConfigに設定すれば使えるようです。
設定は直接埋め込むかGitに入れといてリポジトリルートを起点にしたファイルパスを書くか、どちらかのようです。

[公式マニュアル](https://docs.openshift.com/online/dev_guide/builds/build_strategies.html)

### Builds - Images

Dockerイメージの一覧なようです。
DockerレジストリのURLとかも確認できるようです。

## Resources

### Resources - Quota 

使用中のコンテナリソースを可視化したものと思っておいてよいと思います。
compute-resourcesは起動中のアプリケーションで使用されるリソースです。
compute-resources-timeboundはビルド・デプロイで使用されるリソースです。

### Resources - Membership

お試ししてませんがこのプロジェクトを弄れるユーザーやグループ等を設定できるっぽいです。

### Resources - Config Maps

お試ししてませんがアプリケーション設定かと思われます。
Routes設定があるのでこの機能使って設定変えて
RoutesでコントロールしてBlue-Green Deployment 等の運用手法が使えそうですね。

### Resources - Secrets

各種キーの一覧です。
プライベートGitを使う場合等、ここでCreate SercretからGitにアクセスするためのsshの秘密鍵を設定します。
![Payload Too Large](https://goo.gl/4X5jaD)

### Resources - Other Resources

特に調べてません。現状何も出ていない状況です。

## Storage

子要素はなく、DataBase等のストレージ系サービスの詳細がでるようです。
今回お試しした環境ではMongoDBの情報のみ出ていました。
Status、Capacity等ですね。

## Monitoring

ここも子要素はなく、各Podsの状態、ビルドジョブ、デプロイジョブ等の最新の状態が出ています。

## その他

↓公式ドキュメントでOnline2とOnline3のアーキテクチャを比較。
https://docs.openshift.com/online/getting_started/online_v2_vs_v3.html#architecture-changes
一番でかい変更はkubernetesの導入ですかね。↓参考リンク。すごくわかりやすい。
https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/

PodもServiceもDeploymentもすべてkubernetesの話になるので理解しておくと始めやすいかもですね。

# 関連記事
+ [①OpenShift導入編](http://qiita.com/kimura-y/private/ecf92a80fd5fe8dabde3)  
+ [③OpenShift実践編](http://qiita.com/kimura-y/private/35ec948ae89f219b6fc2)
node.js の nodemailer/mailer モジュールで、SMTP認証無しでメールを送る

node.js で構築したシステムで、社内のSMTPサーバからメールを送ることになりました。

* 社内ネットワーク内のSMTPサーバを使用
* メール送信先も、社内ユーザのみ
* SMTPサーバは認証無しで送信可能(Port:25)

モジュールはnodemailerを使うことにしたのですが、検索しても出てくるのはgmailやSendGridでの送信例ばかりで、どこも認証ありでの送信例です。
このシンプルな条件での送信設定が意外なほど見つからなかったので、送信サンプルを公開しておきます。

# 送信例(nodemailer)

以下のコードで送信できました。
弊社環境では、9行目のtls.rejectUnauthorizedの設定が無いとエラーになりました。

```javascript:mailtest.js
// nodemailerによるメール送信
var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    host: '<メールサーバ>',
    port: 25, // ポート
    use_authentication: false, // 認証しない
    tls: {
        rejectUnauthorized: false // do not fail on invalid certs
    }
});

var mailOptions = {
    from: '<送信元アドレス>',
    to: '<送信先アドレス>',
    subject: 'TEST from nodemailer',
    text: 'TEST MAIL BODY',
};

transporter.sendMail( mailOptions, function( error, info ){
    if( error ){
        return console.log( error );
    } else {
        console.log('Message sent: ' + info.response);
    }
});
```

送信結果です。

```sh
$ node -v
v7.10.0
$ npm ls nodemailer
/home/nakatsu
├─┬ mailer@0.6.7
│ └── nodemailer@0.1.20
└── nodemailer@4.0.1 ### 注：こちらです
$ node mailtest.js
Message sent: 250 ok:  Message 236076747 accepted
```

# 送信例(mailer)

よりシンプルなモジュールのmailerでも送信できました。

```javascript:mailtest.js
// mailerによるメール送信
var email = require('mailer');

email.send({
    ssl: false,
    host : "<メールサーバ>",    // smtp server hostname
    port : "25",               // smtp server port
    domain : "visionarts.com", // domain used by client to identify itself to server
    from: '<送信元アドレス>',
    to: '<送信先アドレス>',
    subject : "TEST from mailer",
    body: 'TEST MAIL BODY',
},
function(err, result){
    if (err) {
        console.log(err);
    } else {
        console.log(result);
    }
});
```

送信結果です。

```sh
$ node -v
v7.10.0
$ npm ls nodemailer
/home/nakatsu
├─┬ mailer@0.6.7 ### 注：こちらです
│ └── nodemailer@0.1.20
└── nodemailer@4.0.1
$ node mailtest.js
True
```

ただし、こちらのmailerモジュールでは、デフォルトのエンコードがquoted-printableになっています。
UTF-8で長い日本語のメールを送った際に希に文字化けする現象が見られたので、今回はnodemailerを採用しました。
(設定に"encoding"を追加すればいいはずなのですが、"base64"を指定しても正しくエンコードされなかったのでそこは未調査です。)
VRのカメラ制御をReactとA-FRAMEで実装

React VRでカメラを自分で制御しようとしたところ、出来なかったのでA-FRAMEを利用しました。
実装にはReactを利用したかったので、aframe-reactでA-FRAMEとReactを連携しています。

# Reactの導入
create-react-appコマンドを利用しました。
「Facebook公式のcreate-react-appコマンドを使ってReact.jsアプリを爆速で作成する」が参考になりました。
http://qiita.com/chibicode/items/8533dd72f1ebaeb4b614

# A-FRAMEとa-frame-reactの導入
1. 「Reactの導入」で作られたAppのディレクトリに移動
2. ` npm install --save aframe aframe-react` を実行

# 実装
VRは「Appのディレクトリ/src/App.js」を編集して実装しました。
カメラのポジションや向き(rotation)を変更してぐりぐり画面が動きます。(3Dオブジェクトを2種類オマケで表示)
本当は360度画像内を自由に動きたかったのですが、360度画像はあくまで背景なので、仕様上無理なのがよく分かりましたw

```Javascript:App.js
import React, { Component } from 'react'
import logo from './logo.svg'
import './App.css'
import 'aframe'
import { Animation, Entity, Scene, } from 'aframe-react'

class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      degree: 90,
      position: "0 10 30",
      rotation: "0 90 0",
      rotationY: 90,
    }

    this.rotate = this.rotate.bind(this)
  }

  componentDidMount() {
    this.rotate()
  }

  componentWillUnmount() {
    if (this.frameHandle) {
      cancelAnimationFrame(this.frameHandle)
      this.frameHandle = null
    }
  }

  rotate() {
    let newDegree = this.state.degree + 0.1
    if (newDegree >= 360) {
      newDegree -= 360
    }

    const afterX = 50 * Math.cos(newDegree * (Math.PI / 180));
    const afterZ = 50 * Math.sin(newDegree * (Math.PI / 180));

    let newRotationY = this.state.rotationY - 0.1
    if (newRotationY <= -360) {
      newRotationY += 360
    }

    this.setState({
      degree: newDegree,
      position: `${afterX} 0 ${afterZ}`,
      rotation: `${afterZ} ${newRotationY} ${afterX}`,
      rotationY: newRotationY,
    });
    this.frameHandle = requestAnimationFrame(this.rotate)
  }

  render() {
    return (
      <Scene>
        <Entity primitive='a-sky' src='[360度画像]'/>
        <Entity primitive='a-sphere' color="green" position="-2 10 -3"/>
        <Entity geometry={{primitive: 'box', width: 5}} position="0 0 -5"/>
        <Entity rotation={this.state.rotation}>
          <Entity primitive='a-camera' position={this.state.position}/>
        </Entity>
      </Scene>
    )
  }
}

export default App
```

# 公開用のファイル出力
「Reactの導入」で紹介したページに記載されていますが、とても簡単でした。
1. 「Reactの導入」で作られたAppのディレクトリに移動
2. ` npm run build` を実行
3. buildディレクトリに出力される

# その他参照
A-FrameとReact.jsでWebサイトのVR化を試みた話
https://developers.cyberagent.co.jp/blog/archives/6717/

A-FRAME
https://aframe.io

ngokevin/aframe-react
https://github.com/ngokevin/aframe-react
がばがばscala独学 - トレイト(3)

# はじめに

下記のテキストを通して、基本的な書き方を学びつつ、個人的に気になったことを検証していくメモ代わりです。
https://dwango.github.io/scala_text/basic.html
本当にありがとう、dwango様・・・

# トレイトの初期化順序

* ざっくりまとめ
    * 初期化順序によっては、初期化されていない変数が出てくる
    * 初期化できていない原因となるtraitを改善することが一番である

## 落とし穴

* 初期化順序によっては機能しない変数が出てくる

    ```scala
    scala> :paste
    // Entering paste mode (ctrl-D to finish)

    trait A { val foo: String }

    trait B extends A { val bar = foo + "world" }

    class C extends B {
      val foo = "hello "
      def printBar(): Unit = println(bar)
    }

    (new C).printBar()

    // Exiting paste mode, now interpreting.

    nullworld
    defined trait A
    defined trait B
    defined class C
    ```
* `nullworld` となって、 `hello world` と期待した結果となっていない

* `lazy` を使用して処理を遅延させる

    ```scala
    scala> :paste
    // Entering paste mode (ctrl-D to finish)

    trait A { val foo: String }

    trait B extends A { lazy val bar = foo + "world" }

    class C extends B {
      val foo = "hello "
      def printBar(): Unit = println(bar)
    }

    (new C).printBar

    // Exiting paste mode, now interpreting.

    hello world
    defined trait A
    defined trait B
    defined class C
    ```
* 初期化が実際に使われるまで遅延される
* デメリット
    * 通常の変数定義より若干処理が重い
    * 複雑な呼び出しでデッドロックが発生
* defによる定義

    ```scala
    scala> :paste
    // Entering paste mode (ctrl-D to finish)

    trait A { val foo: String }

    trait B extends A { val bar = foo + "world" }

    class C(val foo:String) extends B {
      def printBar(): Unit = println(bar)
    }

    (new C("hello ")).printBar()

    // Exiting paste mode, now interpreting.

    hello world
    defined trait A
    defined trait B
    defined class C
    ```
    * デメリット
        * 毎回定義しなければならない点
* 事前定義（Early Definitions）を使う

    ```scala
    scala> :paste
    // Entering paste mode (ctrl-D to finish)

    trait A { val foo: String }

    trait B extends A{ val bar = foo + "world" }

    class C extends {
      val foo = "hello"
    } with B {
      def printBar(): Unit = println(bar)
    }

    (new C).printBar()

    // Exiting paste mode, now interpreting.

    helloworld
    defined trait A
    defined trait B
    defined class C
    ```

* 根本的には `trait B` に問題があるため、 `trait B` を修正したほうがいい
Webpackでフォルダ内の全ファイルを一気にrequireする

Webpackには、CommonJSの`require`よりも強力な、依存関係処理機能があります。

## ふつうの`require`とWebpack

npmで入れたライブラリを指定する場合にしても、自分で作ったファイルを呼び出す場合にしても、ほとんどの状況で`require`すべきファイルはソースコードの時点で決まっているものです。

Webpackでは、リテラルで`require`を行った場合、コンパイル後には`require`の引数が、モジュールの番号に置き換わっています。

## 動的な`require`とコンテキスト

ただ、[CommonJS Modulesの仕様](http://www.commonjs.org/specs/modules/1.0/)でも、`require`が取る引数は一定の書式の「文字列」となっているだけで、もちろんリテラル限定なんてことはありません。任意の文字列を指定することができます。

このような場合、ソースコードの時点では何を`require`するか決まらないので、固定的にコンパイルすることはもちろん不可能です。Webpackでは、`require`するモジュールが決まりきらないコードを発見すると、「requireコンテキスト」を生成します。

requireコンテキストは、ソースコードから判別できる接頭辞・接尾辞（フォルダ位置・拡張子など）からできるだけ絞り込んだ上で、**候補になりうるすべてのモジュール**を用意した上で、最終的に`require`を呼び出した文字列で実際に`require`するものを決定する、というような流れになっています。

## コンテキストを自分で作る
上で述べた「requireコンテキスト」は、Webpackが自動で用意するだけではなく、`require.context`を呼び出すことで、自分で作ることもできます。

```javascript
const context = require.context(directory, useSubdirectories = false, regExp = /^\.\//)
```
引数の意味は次のようになっていますが、コンパイル時に解決しないといけないため、すべて**リテラル**である必要があります。

* `directory`…どこのディレクトリの中身を`require`の対象とするか
* `useSubdirectories`…対象のディレクトリ直下だけ拾うなら`false`、以下の全ディレクトリを対象にするなら`true`
* `regExp`…対象になるファイルが満たすべき条件を書いた正規表現（`/\.js$/`のように、拡張子指定に使うと便利です）

### コンテキストの操作
コンテキストを作っただけでは、`require`は行われません。この`context`は、以下のようなものからなっています。

* `context(パス)`…指定された`パス`のモジュールを`require`する（もちろん、コンテキストになければ失敗）
* `context.resolve(パス)`…指定された`パス`をモジュール番号に変換する（もちろん、コンテキストになければ失敗）
* `context.keys()`…コンテキストに含まれるパスの配列を返す
* `context.id`…コンテキスト自体のモジュール番号

### 実用例
Riot.jsとWebpackを組み合わせる場合、[riot/tag-loader](https://github.com/riot/tag-loader)があるので、これを使えば`.tag`ファイルも`require`できますし、`require('riot')`で呼び出されるRiot本体に、`require`した時点でタグとして登録されます。

Riotのタグをセットする側で`riot.mount('*')`のようにするのであれば、`require`したものを自分で保存しておく必要もない、ということになります。ということで、タグは「ただ`require`しておくだけでいい」ということになります。

このような場合、以下のコードで一括`require`できます。

```javascript
function allRequire(context){
  context.keys().forEach(context);
}

allRequire(require.context('./path/to/tags/', true, /\.tag$/))
```

`forEach(context)`が直感的ではありませんが、`context`自体が「モジュールのパスを受け取って`require`する関数」なので、`forEach`が投げてくる「1つ目が値」というパターンにぴったりなのです。


## 参照

* [Dependency Management（Webpack2のマニュアル）](https://webpack.js.org/guides/dependency-management)
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 序章5

# ドメインに没頭する
> 開発者は、ビジネスの知識を積み重ねるべく、ドメインに没頭しなければならない。(第一部 序章 より)

この本で特に好きな箇所です。

有能な開発者のほとんどが、ドメインについての勉強より、フレームワークや技術を優先し、ドメインの問題をそれにより解決しようとする。

そうではなく、特定のドメインについて学び、ドメインモデリングのスキルを学んでこそ、ソフトウェアの複雑さに対抗できると。

ドメインに没頭しよう！
OpenShift Online3 STARTERでNode.js 6.0 x MongoDB 環境を公開してみた①（※画像大量）

# ①OpenShift導入編

![start](https://goo.gl/7m5tBF)

OpenShift Online3 STARTER。NEWついてます。はい。
サインアップは省略。

## welcome画面
![welcome](https://goo.gl/Q1bgMr)

Reagionは一つだけ。Starterだから？
Starterでもオレゴンとバージニア使えるはず。。。
Proの方は現在us-eastのみで今後EMEAリージョンとAPACリージョンが増える予定っぽい。Plan見た。


[料金プラン](https://www.openshift.com/pricing/index.html)を参照。

## プロジェクト作成
sampleだと使ってるよーって言われた。被っちゃダメらしいのでテスト程度なら日付でも入れておくとよいかも。
![project](https://goo.gl/NjeFtT)

## アプリケーションをプロジェクトに追加

追加の仕方は３タイプあって

1. カタログ（JavaとかNodeJSとか）から選んで追加
2. Dockerイメージから追加
3. 設定ファイルから追加

今回はNodeJS環境を作成しました。
「JavaScript」を選択。
![application](https://goo.gl/RwquZJ)

## Node.js x MongoDB
単純なNode.js環境を選択する場合はバージョンを選択できました。
今回は「Node.js x MongoDB」環境でやるので右側を選択します。
![application](https://goo.gl/xxi8Le)

Node.jsのバージョンは4になってます。が、あとで変更可能なのでこのままいきます。
![application](https://goo.gl/vxMDBm)

というわけで完成しました。
![application](https://goo.gl/Y3ahD9)

OpenShift Online 用のCLIのリンクがあるのでついでにインストールしときます。
![application](https://goo.gl/PLGRkY)
tokenって何？hiddenになってる？て思うかもしれませんがコピーすると値入ってます。
表示しないようにしてるだけのようです。紛らわしい。
あわてず騒がずコピペしましょう。

ダウンロードしてzip解凍したらただのexeなのでご自由にインストール。
公式ドキュメントを見ると「コマンドプロンプトで実行してくれ」と書いてありました。
後は使ってないです。入れただけ。

## OpenShiftコンソール(勝手に命名)
![application](https://goo.gl/ZvPbTU)
以上で完了。コンソールが見れるようになります。
overviewあたりから起動したアプリのURLが見れます。

↓こんな感じのページが開きます。
![application](https://goo.gl/eF7tC3)

# 関連記事
+ [②OpenShiftコンソールまとめ編](http://qiita.com/kimura-y/private/96a45ba51e9184729224)  
+ [③OpenShift実践編](http://qiita.com/kimura-y/private/35ec948ae89f219b6fc2)  

書いた後に思ったこと
ちょっと画像多すぎた。スクロールめんどい。でも放置。
次のページの最後でアーキテクチャの話とか（の参考リンク）がようやく出てくるので仕組みとかはその辺見た方がよいです。
あとは公式。
画像からいちいち名前消してたけど途中からどうでもいいやってなった。
消えてたり消えてなかったりするのはその名残です。
Rubyで Github APIを使って 複数一括Issue登録やラベル付与

ruby の pry console とかから
サクッと、Issueを複数登録したい時メモ


下記のようなクラスを、貼り付けて、

```rb

class Github
  # https://developer.github.com/v3/
  def initialize(user, pass, owner, repo)
    @user = user
    @pass = pass
    @owner = owner
    @repo = repo
  end


  def get_http
    https = Net::HTTP.new("api.github.com", "443")
    https.use_ssl = true
    https
  end

  # https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue
  def add_label(issue_number, labels)
    get_http.start do |https|
      req = Net::HTTP::Post.new("/repos/#{@owner}/#{@repo}/issues/#{issue_number}/labels")
      req.basic_auth @user, @pass
      req.body = JSON.generate labels
      https.request(req)
    end
  end

  # http://developer.github.com/v3/issues/#create-an-issue
  def new_issue(title="", body="", labels=[])
    get_http.start do |https|
      req = Net::HTTP::Post.new("/repos/#{@owner}/#{@repo}/issues")
      req.basic_auth @user, @pass
      issue_info = {
        'title' => title,
        'body' => body,
        'labels' => labels
      }
      req.body = JSON.generate issue_info
      https.request(req)
    end
  end
end
```

```rb
# user, pass, owner, repo や内容を適宜変える
issue_data = [["title", "body", ["labels"]], ["title", "body", ["labels"]]]
github = Github.new(user, pass, owner, repo)
issue_data.each do |i|
  p github.new_issue(i[0], i[1], i[2])
end
```

楽ちんですね (´ω`*)
デプロイしてExecJS::RuntimeError: SyntaxError: Unexpected character '`' が出たとき

#### 【バージョン】
ruby 2.3.1
Rails 5.0.4

#### 【やろうとしたこと】

とあるjsファイルを作成してcapistranoを使用してAWSのサーバーにデプロイした。
すると「ExecJS::RuntimeError: SyntaxError: Unexpected character '`' 」とエラーが出てしまった。

以下　**エラー時のJSファイル。**

~~~~~~~~~~~~~~~~~~~~~~~~~~~js
  function buildHTML(product){
    var html = `<a class="item-link" href="/products/${product.id}">`
  if ("受付中" == $(product.status).selector) {
  html += `<p class="order_now">${product.status}</p>`+
  `<p class="no_underline">残り  ${product.rem_num}</p>`
  }
  if ("受付終了" == $(product.status).selector) {
  html += `<p class="order_end">${product.status}</p>`+
  `<p class="no_underline">申し込み上限に達しました</p>`
  }
  html += `<section class="items">`+
    `<figure class="item-image">`+
      `<img>`+
        `<img height="223" width="340" alt="プロダクト写真" src = "${product.image.url}" >`+
    `</figure>`+
    `<h2 class="top_product_title">${product.title}</h2>`+
    `<div class="info">`+
      `<p class="place">`+
       `<i class="fa fa-map-marker"></i>`+
        `${product.area}`+
      `</p>`+
      `<p class="price">`+
        `<i class="fa fa-shopping-bag"></i>`+
        `¥ ${product.price}`+
      `</p>`+
    `</div>`+
  `</section>`+
`</a>`;
    return html;
  }
....以下略
~~~~~~~~~~~~~~~~~~~~~~~~~~~


>ExecJS::RuntimeError: SyntaxError: Unexpected character '`' 」

「`(バッククォート)」を使うんじゃあない、と言われている。
なるほど。
じゃあシングルクォートか、ダブルクォートを使えばいいんだなと思ったがそうもいかなかった。
${product.status}の変数の中身が表示されないのだ。

どうしよーと思ってたら、ちょっと書き方を変えたら解決した。
考えてみればシンプル。
以外にインターネットで漁ってても同じようなエラーが出てこなかったので書いてみる。

(こんなことに躓くのはやはり開発経験２ヶ月の初心者だからか・・・)


以下は**エラー解消後のJSファイル。**

~~~~~~~~~~~~~~~~~~~~~~~~~~~js
$(function() {
var itemlink = $(".item-link");
var all = "all"

  function buildHTML(product){
    var html = '<a class="item-link" href="/products/' + product.id + '">'
  if ("受付中" == $(product.status).selector) {
  html += '<p class="order_now">' + product.status + '</p>'+
  '<p class="no_underline">残り' + product.rem_num + '</p>'
  }
  if ("受付終了" == $(product.status).selector) {
  html += '<p class="order_end">' + product.status + '</p>'+
  '<p class="no_underline">申し込み上限に達しました</p>'
  }
  html += '<section class="items">'+
    '<figure class="item-image">'+
      '<img>'+
        '<img height="223" width="340" alt="プロダクト写真" src = "' + product.image.url + '" >'+
    '</figure>'+
    '<h2 class="top_product_title">' + product.title + '</h2>'+
    '<div class="info">'+
      '<p class="place">'+
       '<i class="fa fa-map-marker"></i>'
         + product.area +
      '</p>'+
      '<p class="price">'+
        '<i class="fa fa-shopping-bag"></i>'+
        '¥' + product.price +
      '</p>'+
    '</div>'+
  '</section>'+
'</a>';
....以下略
~~~~~~~~~~~~~~~~~~~~~~~~~~~

#### 変更前
「`(バッククォート)」
「${product.status}」

#### 変更後
「'(シングルクォート)」
「+ product.status +」

これで問題なくデプロイできた。
もっとうまいやり方があるらしい。
何かのgemを消すとうまくいくとか。
知ってたら誰か教えてください。
ブラウザのコンソールに変数のスコープが染み出すのを防ぐ

※Chromeで確認済み

**`const`や`let`を用いたとしても、グローバルなスコープで定数/変数を定義するとブラウザのコンソールからアクセスできてしまいます。**(といっても`window`のプロパティになる訳ではありません):

``` javascript
// ブラウザのコンソールで x と入力すると 42 が出力されます
const x = 42;
```

ブロック内に入れてスコープを非グローバル化するとそれが防げます:


``` javascript
// ブラウザのコンソールで x と入力してもアクセスできません
{
  const x = 42;
}
```

---

こういったコンソール汚染が無い方がすっきりしていて好きです
coffeescriptのクラス/インスタンスのメソッド/変数の書き方


```coffeescript:hedachi直伝

class MyClass
  # クラスメソッド
  @classMethod = ()->
    # クラスメソッドを呼ぶ場合
    @classMethod2()
    
    # クラス変数を呼ぶ場合
    @classVar

    # インスタンスメソッドは呼べない

    # インスタンス変数は呼べない


  # クラス変数
  @classVar = 1

  # インスタンスメソッド
  instanceMethod:()->
    # クラスメソッドを呼ぶ場合
    MyClass.classMethod()
    @constructor.classMethod()
    
    # クラス変数を呼ぶ
    MyClass.classVar
    @constructor.classVar

    # インスタンスメソッドを呼ぶ場合
    @instanceMethod()

    # インスタンス変数を呼ぶ場合
    @instanceVar

  # インスタンス変数
  constructor:->
    @instanceVar = 1

```
FragmentでKotlinのby lazyを使ってfindViewByIdするとレイアウト反映できない&リークする件

# 何が起きる？
ちょっと昔のネタなのですが、時々忘れて使いそうになるので、簡単にメモしておきます。
Kotlinではviewへのアクセス時にfindViewByIdしてくれるように、こんな感じで遅延初期化して利用することができます。

```kotlin
private val toolbar by lazy {
    view!!.findViewById<Toolbar>(R.id.toolbar)
} 
```

ただlazyを使うと**一度取得したものをメンバ変数として保持し、次に利用するときも同じインスタンスを返します**。

ここでFragmentのライフサイクルを思い出すと、以下のように**バックスタックから返ってきた時に、onCreateView()がまた呼ばれます**。
![](https://github.com/xxv/android-lifecycle/raw/master/complete_android_fragment_lifecycle.png)

onCreateViewでレイアウトを新しく作って返すと、、メンバ変数で持っているViewは前に作ったレイアウトなので、**リークします**。また、textView.text = "hoge"などしても**レイアウトの見た目に反映されません**。

# ではどうするべき？
ここにそれぞれの方法のメリデメがまとまっています。
https://discuss.kotlinlang.org/t/pros-cons-of-android-view-access-strategies/3160

* 現状、lateinitが一般的っぽい？です
* 一応、Kotlin Android Extensionでもちゃんとやってそうな雰囲気です。
* Architecture ComponentのLifecycleOwnerとKotterKnifeを利用することができれば、以下のコードでできそうです。
https://gist.github.com/chrisbanes/fc4392dcbdc0aa5d99147dc551616676

# 元ネタ
https://twitter.com/chrisbanes/status/897075635142754305
GoogleのAPIでサーバ時間がズレていたことで正しく動かなかったよ、という話

# この記事は？
- Google DriveのAPIを使って定常的に値の操作をしていたが、ある日突然、動かなくなっていた。
- 話のオチとしては、サーバの時刻ズレによって発生したエラーだった。
- あまり同じような記事をみなかったので情報共有と備忘録までに。

# 事の発端
## あれ？動いてない？
とあるスクリプトを作り、
 1. Google Drive API でファイルの一覧を取得し
 2. そのなかから目的のSpreadSheetのIDを取得する
 3. 取得したIDを元にGoogle Sheets API で表の中身を取得する
ということを実行していたのだが、ある日、動かなくなった。

## エラーが出ていた
次のエラーが出ていた。

```text
oauth2client.client.HttpAccessTokenRefreshError: 
invalid_grant: Invalid JWT: Token must be a short-lived token and in a reasonable timeframe
```

## 結論
サーバ時刻が現在時刻と大幅にズレている場合に発生するエラー。
具体的には5分のズレが発生するとエラーとなるらしい。

参考：[Stackoverflow](https://stackoverflow.com/questions/36189612/token-must-be-a-short-lived-token-and-in-a-reasonable-timeframe)

```
caused in my case by a poor synchronisation of the computer's clock 
where the code was executed that had a lag of 5 minutes
 (due to a faulty battery for the internal clock).
```

## そういえば
私の環境は今回はMacBook上にVirtualBoxでCentOSを動かして、そこでcronでスクリプト実行していたのですが、
この日の前日はうっかりMacBookを閉じ、VMがペンディング状態にしてしまったな…ということで
なんとなく当たりがついていたので気がつくことができました。
chronyは起動していたのですが、時刻同期が追いついていなかったようです。


* * *
以上
UISearchBarの変なアニメーションを直す

UISearchBarにあらかじめtextをセットしておいて表示したあと、clearボタンを押した時のplaceholderの表示のされ方が気持ち悪かったので修正した方法。

## before
```swift
class ViewController: UIViewController {
    var searchBar: UISearchBar = {
        let searchBar = UISearchBar()
        searchBar.placeholder = "プレースホルダー"
        searchBar.text = "hogehoge"
        return searchBar
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(searchBar)
    }
}
```
左上から出てきてしまう。
placeholderのframeが{0,0,0,0}から虫眼鏡の左側に移動しているためこのようなアニメーションになってしまう。
![before.gif](https://qiita-image-store.s3.amazonaws.com/0/107427/ebdaef29-ad60-c95f-2c21-a9240465a7f8.gif)
※わかりにくいのでスローアニメーションにしています。

## after
```swift
class ViewController: UIViewController {
    var searchBar: UISearchBar = {
        let searchBar = UISearchBar()
        searchBar.placeholder = "プレースホルダー"

        // 文言をセットする前にこれを呼ぶ
        // これによりplaceholderの表示位置をあらかじめ通常の状態にする
        searchBar.layoutIfNeeded()

        searchBar.text = "hogehoge"
        return searchBar
    }()
}
```
若干左上から表示されるが最初よりはだいぶマシになった。
![after.gif](https://qiita-image-store.s3.amazonaws.com/0/107427/0d9cef25-bb85-90c8-5a67-6aa812290ef8.gif)
Sinatraでローカル環境のWEBrickをHTTPSで動かす

## TL;DR
- [Sinatra + WEBrick + HTTPS][gist]
- WEBrickは起動時のオプションで下記を指定すればよい
  - `SSLEnable: true`
  - `SSLCertificate: [['CN', WEBrick::Utils.getservername]]`[^1]
- SinatraからWEBrick起動時のオプションを渡すには`set :server_settings`を使う


## 環境
- Windows10
  - ruby 2.4.1p111 (2017-03-22 revision 58053) [x64-mingw32]
  - sinatra 1.4.8
- OSX
  - ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
  - sinatra 2.0.0

なお、Sinatraはクラシックスタイルでの利用


## 鍵の作成
下記を参考に作成。
[Creating a Self-Signed SSL Certificate | Heroku Dev Center][heroku]
ただ、最終的にWEBrickで自動作成するなら不要。


## Sinatraでのサーバへの設定
[sinatra/base.rb#L1452][sinatra/base.rb]
つまり

```rb
set :server_settings, options
```

とすればいいので下記の感じに。

```rb
if settings.development?
  require 'webrick/https'
  require 'openssl'
  ssl_options = {
    SSLEnable: true,
    SSLCertificate: OpenSSL::X509::Certificate.new(File.open('./server.crt').read),
    SSLPrivateKey:  OpenSSL::PKey::RSA.new(File.open('./server.key').read)
  }
  set :server_settings, ssl_options
end
```

- `server.crt`と`server.key`は起動前に所定の場所に配置する
  - ただし、WEBrickで自動作成するなら不要
- `if settings.development?`は本番では必要ないための分岐


## WEBrickで証明書を自動作成するようにする
- [Sinatra(WEBrick)でsslサーバをたてる](https://gist.github.com/suruseas/3489236)
  - `初期起動時に鍵を自動生成する`という点の参考にさせて頂く
  - `WEBrick::Utils::create_self_signed_cert`ってのがあることに気がつく
  - WEBrickのソースを眺めてみることにした
- https://github.com/ruby/ruby/blob/ruby_2_4/lib/webrick.rb#L88-L121
  - 普通にHTTPSの場合について書いてあった
  - `SSLEnable`を`true`にして
  - `SSLCertName`を`[['CN', WEBrick::Utils.getservername]]`とかにする
  - 起動のたびに証明書が再作成される
  - 事前作成したものを使用する場合あ先述の方法でOK
- [Sinatra + WEBrick + HTTPS][gist]
  - 以上をもとに必要最低限のコードを書いてみた



[heroku]:https://devcenter.heroku.com/articles/ssl-certificate-self
[webrick/ssl]:https://docs.ruby-lang.org/ja/latest/library/webrick=2fssl.html
[WEBrick::Config::SSL]:https://docs.ruby-lang.org/ja/latest/method/WEBrick=3a=3aConfig/c/SSL.html
[sinatra/base.rb]:https://github.com/sinatra/sinatra/blob/c7655190128fdcc37b160d55e7afc4d4291789ce/lib/sinatra/base.rb#L1452
[gist]:https://gist.github.com/k-ta-yamada/6d3d6c75980dee5cf1dd189e170badce

[^1]: webrick.rb記載のように[%w[CN localhost]]でもいい。
twitterのフォロー数を0にするスクリプト

#フォローしすぎた。。。
twitterをしていると、なんとなく気分でフォロバしていたら、フォロー数が１００，１０００と増えすぎることがありませんか？？
実際僕はよくなります。
そんな時「一旦フォロー数を0にしよう」ということが可能になるスクリプトを考えました。
##やり方
1. twitterのプロフィールページを開き、ブラウザのコンソールを開きます。
2. そして、「フォロー」タブを一番下までスクロールします。
（スクロールは自動で行うスクリプトを書いてもいいですし、手作業でも構いません。）
3. コンソール上に下記のソースコードを貼り付けます。

```js
for(var i = 0;i < $('.following-text').length;i++){
    $('.following-text')[i].click();
}
```
以上

##０にしてすっきり
フォロー整理の時に役立ててください！
APIKeyを利用したcfコマンドでのログイン

少し前にBluemixのID管理画面にAPIKeyが発行できる機能が追加されました。
IBM側で拡張している `bx` コマンドでの利用は確認できていたのですが `cf` コマンドでの確認をしていませんでしたが確認が取れたので情報を共有しておきます。

`apikey` を利用することにより仮にキーが漏洩してもシステム側で容易にリセット可能ですのでこちらを利用して作業をするのがオススメです。とくに Bluemixの場合には IBMIdが利用されており他のIBMのソフトウェアの管理などにも利用されますので扱いには気をつけましょう。

# APIの発行の仕方

`Manage`メニューから`Bluemix API Keys`まで進む

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11540/b6b4bbcb-0890-9d88-e6f3-a7beefe2e1ce.png)

`Create API Key`をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11540/df31f58a-957d-62b3-cca0-06d7a717bab0.png)

情報を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11540/a7e8c8f8-6f95-2187-babd-5bce7d64c2cf.png)

キーが生成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11540/221027f4-f31f-901f-76b4-617065116208.png)

このキーは一度きりしか表示されませんのでダウンロードするか、メモするかしておきましょう。


# bxコマンドでの実行例

```
$ bx login —apikey XXXXXXXXXXXXXXXXXXXXX
API エンドポイント: https://api.ng.bluemix.net
認証中です...
OK

```


# cfコマンドでの実行例

cf側では、ユーザ名が `apikey` となりパスワードが XXXXXを先程の `APIKEY` となります。

```shell-session
$ cf login -u apikey -p XXXXXXXXXXXXXXXXXXXXXXXXXX 
API エンドポイント: https://api.ng.bluemix.net
認証中です...
OK
```

# RESTで利用する際のオプション

これはcfと同様になります。

| 項目 |  | 値 | 備考 | 
|:-----|:---|:----|:--|
|接続先| POST |  http://login.ng.bluemix.net/UAALoginServerWAR/oauth/token | |
|Header| accept | application/json ||
| | authorization|  Basic Y2Y6 | Y2Y6は `cf` |
| | content-type |  application/x-www-form-urlencoded' |
|Data| grant_type | password | |
|    | username | apikey | 固定文字列 | 
|    | password | XXXXXXX| ここにAPIKEYを記入 |
SimulinkでMIDI音源を鳴らす

##はじめに
MATLABでMIDI音源が鳴らせるなら、Simulinkでも鳴るはず。ということで、以下その手順を概説します。

##MIDI再生用Cプログラム
Simulinkには、MIDIを再生する機能はありませんので、MIDI再生用Cプログラムを、Simulinkで実行できる形式にコンパイルし、Simulinkブロックを自作します。以下がCプログラムです。使用コマンドの概説は、[MATLABでMIDI音源を鳴らす](http://qiita.com/lastwaltz/private/0b609fcd0f3b19c988a2)にあります。

	#include <stdio.h>
	#include "stdafx.h"
	#include <Windows.h>
	#include <mmsystem.h>
	#pragma comment(lib, "winmm.lib")

	int miditest(int pitch, int duration, int velocity, int timbre)
	{
	    HMIDIOUT hmo;   // MIDI out handle

	//     int pitch;  // 音程(0～127: C-1～G9)
	//     int duration;   // 音の長さ(msec)
	//     int velocity;   // ベロシティ（音量）
	//     int timbre; // 音色

    	midiOutOpen(&hmo, MIDI_MAPPER, 0, 0, 0); // MIDIデバイスオープン
    	midiOutShortMsg(hmo, 0xC0 | (timbre << 8)); // 0xC*: プログラムチェンジ

    	midiOutShortMsg(hmo, 0x90 | (velocity << 16) | (pitch << 8)); // 0x90: ノートオン
    	Sleep(duration);
    	midiOutShortMsg(hmo, 0x80 | (pitch << 8));     // 0x80: ノートオフ

    	midiOutClose(hmo);                             // MIDIデバイスクローズ
    
    	return 0;
	}

##コンパイル（Simulinkブロックの作成）

以下は、MATLAB環境でSimulink用ブロックを自動生成するためのスクリプトです。Legacy Code Toolという機能を使用し、C言語ベースのプログラムをコンパイルして、Simulinkブロックを作成します。

	%% 初期化
	s = legacy_code('initialize');

	%% S-Function名
	s.SFunctionName = 'sfun_slMIDI';

	%% 関数の入出力形式
	s.OutputFcnSpec = 'int32 y1 = miditest(int32 u1,int32 u2,int32 u3,int32 u4)';

	%% ソースファイル名
	s.SourceFiles = {'slMIDI.c'};

	%% S-Function用Cファイル
	legacy_code('sfcn_cmex_generate', s);

	%% コンパイル   
	legacy_code('compile', s);

	%% ブロック自動作成
	legacy_code('slblock_generate', s);

上記スクリプトの最後の処理（**legacy_code('slblock_generate', s);**）を実行すると、4入力1出力のSimulinkブロックが自動生成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196112/504d6d6f-c4d1-3f00-277d-7cf4ddeb3263.png)

##Simulinkモデルの作成
自動生成されたブロックを用いて、簡単なモデルを作成しました。第一入力は音程、第二入力は音の長さ、第三引数は音量、第四引数は音色です。ここでは、カウンタブロックを使って、第一引数に60～71までの値を順次入力し、半音ずつオクターブの再生をしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196112/0c7a654d-1272-c69a-2626-ec2dac5ada68.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196112/e63b3105-9237-1dba-c1c0-da4450ece650.png)


##まとめ
Simulink環境でもMIDI音源を鳴らすことができました。Legacy Code Toolを使うと、簡単に既存のCコードをSimulink環境に取り込むことができます。
はじめての Go言語、インストール＆さわってみる,MySQLにアクセスしてみる　その１

# 初めての Go
初めてGo言語、初めてみた動機は、あるサーバにphpをインストールできないことでした。というか、単に root権限もらえなかった or お客様の環境なので無茶できなかったことが大きい。そんな訳で、これから色々と触ってみる。

# インストール
https://golang.org/dl/ から最新のgoをダウンロードすればよい。

## Windows の場合
「[Windows に インストーラを使って GoLang を インストールするときの注意点](http://qiita.com/kent_ocean/items/566e6a23d76ef3b4d125)」 を参照するとpathの話で少しﾊﾏﾙっぽいが、go1.8.3 版では特にﾊﾏﾙ点はなかったので素直にインストール or 再起動でいい。

⇒ 実際は、「

## Linux の場合
基本どこでもokです、path さえ通せばねｗ。
私は、下記のようにしました。

```bach:cmd
$ cd ~
$ wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
$ tar xvfz go1.8.3.linux-amd64.tar.gz 
```

で、```.bash_profile``` に下記を追加する。

```bash:.bash_profile
export GOROOT=$HOME/go
export GOPATH=$HOME/go/goroot
export PATH=$PATH:$HOME/go/bin
```

コマンドラインから go が使えればok。試しに hello してみます。

```go:hello.go
package main
 
import "fmt"
 
func main() {
    fmt.Println("Hello hage!!")
}
``` 

実行してみる。

```bash:cmd
$ go run hello.go
Hello hage!!
```

# MySQLに接続してみる
これ！これがやりたかった。go は、Java や php 、Perl などデータベースアクセスを行う場合、別途DBIやらパッケージをインストールする必要がありましたが、そこは後発の go 。すでにそういう一連の基底部分が充実しておりますｗ

## とはいえ
MySQLのドライバは、インスコする必要があります。
それでもインスコは、超絶楽チンちん。

```bash:cmd
$ go get "github.com/go-sql-driver/mysql"
```

## プログラム、プログラム
プログラム（楽しいので３回言ってみた）。ちょいといままでの php と全然勝手が違うのですが、そこは後から開発環境を整えるということにして、とりあえずMySQLにアクセスして結果を返すというサンプルを実行してみる。

> [golangの環境を整えてmysqlに接続する](http://dev.classmethod.jp/server-side/golang-mysql-helloworld/)

```go:mysql.go
package main

import (
    "database/sql"
    "fmt"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(host:3306)/dbname")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    rows, err := db.Query("SELECT TABLE_NAME, PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS where PARTITION_NAME is not null")
    defer rows.Close()
    if err != nil {
        panic(err.Error())
    }

    for rows.Next() {
        var tableName string
        var partitionName string
        if err := rows.Scan(&tableName, &partitionName); err != nil {
            panic(err.Error())
        }
        fmt.Println(tableName, partitionName)
    }
}
```

おお。思ったとおりの結果になったｗ

# 参考にさせて頂いたサイト様

>+ [Go言語の初心者が見ると幸せになれる場所](http://qiita.com/tenntenn/items/0e33a4959250d1a55045)
>+ [GoでMySQLを使ったテストをする](http://mackee.hatenablog.com/entry/2015/05/06/225310)
>+ [http://dev.classmethod.jp/server-side/golang-mysql-helloworld/](http://dev.classmethod.jp/server-side/golang-mysql-helloworld/)
>+ [[Go言語] database/sqlパッケージを使ってみた](http://qiita.com/tenntenn/items/dddb13c15643454a7c3b)
>+ [【はじめてのGo言語】Go言語でアプリケーションを作ってみよう 〜こんにちは、世界編〜](https://liginc.co.jp/327259)
TCPDFのsvgのviewBoxに関するbugfix

　TCPDFのsvgの処理の中で、viewBoxの指定に数値以外（＝マイナスや小数点）が含まれている場合に正しく処理されていないようだったので、パッチを作りました。
（例によって本家にはpull request送っていないので、気が向いた人がいましたら送ってください）



~~~diff:tcpdf-viewbox.diff
--- tcpdf_min/tcpdf.php	Mon Jul 11 01:11:09 2016
+++ tcpdf/tcpdf.php	Wed Aug 23 17:31:39 2017
@@ -23815,7 +23815,7 @@
 				// parse viewbox, calculate extra transformation matrix
 				if (isset($attribs['viewBox'])) {
 					$tmp = array();
-					preg_match_all("/[0-9]+/", $attribs['viewBox'], $tmp);
+					preg_match_all("/[0-9.-]+/", $attribs['viewBox'], $tmp);
 					$tmp = $tmp[0];
 					if (sizeof($tmp) == 4) {
 						$vx = $tmp[0];

~~~
AMP用のHTMLにspotifyのプレイリストを貼り付ける


以下のようにやるといけました

```html:
<html ⚡>
<head>
	<script async custom-element="amp-iframe" src="https://cdn.ampproject.org/v0/amp-iframe-0.1.js"></script>
	...
</head>
<body>
	<amp-iframe src="プレイリスト/アルバムのリンク" width="300" height="380" layout="responsive" frameborder="0" sandbox="allow-scripts allow-same-origin allow-popups"></amp-iframe>
</body>
```

プレイリスト/アルバムのリンクは通常のリンクが`https://open.spotify.com/album/3sJw0GVLzsq0bOFPXBlqaF`だった場合は`https://open.spotify.com/embed/album/3sJw0GVLzsq0bOFPXBlqaF`のように`open.spotify.com/`の後に`embed/`をつけてあげる

これで、AMP表示でもspotifyのプレイリストが表示される
こんな感じで
![スクリーンショット 2017-08-23 18.06.19.png](https://qiita-image-store.s3.amazonaws.com/0/80787/0669b32a-7a48-9919-92a2-ac5cd88f0c59.png "スクリーンショット 2017-08-23 18.06.19.png")


`sandbox="allow-scripts allow-same-origin allow-popups"`が無いと、プレイリストの一曲目しか表示されなくて、ちょっとハマった
こんなんになってしまう
![スクリーンショット 2017-08-23 18.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/80787/442da98a-ad09-85ca-8851-d985593d1346.png "スクリーンショット 2017-08-23 18.07.24.png")

ちなみにApple Musicのプレイリストを貼り付けているWEBページもAMP対応させたいんだけれど、どうやってやればいいかわからん
やり方知っている人は教えてください
マジで(切実)
Dockerコンテナ上でnbdモジュールを読み込む

こんにちは、[@hico_horiuchi](https://twitter.com/hico_horiuchi)です。
Dockerコンテナ上でqow2イメージを展開するためにnbdモジュールを読み込んだので、その方法をまとめておきます。
nbd以外のカーネルモジュールでも同様の方法で読み込むことができるはずです。

## Dockerホストのセットアップ

Ubuntu Server 16.04をインストールしたVMに、個人用のAnsible Playbookを使ってDockerの最新版をインストールしています。
手動でインストールする場合は [Get Docker CE for Ubuntu | Docker Documentation](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/) を参照。

- [hiconyan-com-ansible/roles/docker at master · hico-horiuchi/hiconyan-com-ansible](https://github.com/hico-horiuchi/hiconyan-com-ansible/tree/master/roles/docker)

```
$ git clone git@github.com:hico-horiuchi/hiconyan-com-ansible.git
$ cd hiconyan-com-ansible
$ virtualenv venv
$ source venv/bin/activate
$ pip install -r requirements.txt
$ source venv/bin/activate
$ ansible-playbook -i hosts -t common_apt,common_ssh,docker site.yml
```

## Dockerfileの書き方

Ubuntu 16.04のイメージをベースに、検証用のDockerfileを作成します。
標準で `lsmod` や `modprobe` コマンドが入っていないので、`kmod` パッケージを入れます。
また、`qemu-nbd` コマンドを使うために `qemu-utils` パッケージも必要です。

```
FROM ubuntu:16.04
MAINTAINER Akihiko Horiuchi <12ff5b8@gmail.com>
 
RUN sed -i -e 's/archive\.ubuntu\.com/ftp\.jaist\.ac\.jp/g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get -y upgrade && \
    apt-get -y install bzip2 curl kmod qemu-utils
 
RUN apt-get -y autoremove && \
    apt-get clean && \
    rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* /tmp/* /var/tmp/*
 
CMD /bin/bash
```

```
$ docker build -t nbd .
```

## nbdモジュールの読み込み・qcow2の展開

カーネルモジュールの読み込みや、デバイスへのアクセスのため、`--privileged` オプションでコンテナの権限を拡張します。
`/dev` と `/lib/modules` のディレクトリもマウントする必要があるので、注意してください。

```
$ docker run -it --rm --privileged -v /dev:/dev -v /lib/modules:/lib/modules:ro --name nbd nbd /bin/bash
```

後は、コンテナ上でnbdモジュールを読み込み、適当なqcow2を展開してみるだけです。
(今回はOpenStack用のCoreOSイメージを使用しました → [OpenStack](https://coreos.com/os/docs/latest/booting-on-openstack.html)。)

```
$ modprobe nbd
$ curl -O https://stable.release.core-os.net/amd64-usr/current/coreos_production_openstack_image.img.bz2
$ bunzip2 coreos_production_openstack_image.img.bz2
$ mkdir /mnt/tmp
$ qemu-nbd --connect /dev/nbd0 coreos_production_openstack_image.img
$ mount -o ro /dev/nbd0p1 /mnt/tmp
$ ls /mnt/tmp
$ umount /mnt/tmp
$ qemu-nbd --disconnect /dev/nbd0
$ exit
```

意外と簡単でしたね。

## 参考文献

- [Docker privileged オプションについて - Qiita](http://qiita.com/muddydixon/items/d2982ab0846002bf3ea8)
Macでnode.jsをインストール、npmコマンドも使用可にする【2021.1月最新版】

# 内容

macにnode.jsをインストールする
npmコマンドも使えるようにする

いくつかの記事だとどうもエラーが発生していたので、まとめました。

※2017年に作成した記事ですが、2021年1月に修正更新しました。

# まずはhomebrewをインストール

※すでにインストールされている方は不要

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# nodebrewをインストール

    brew install nodebrew

確認 (バージョンやコマンドのヘルプが表示される)

    nodebrew -v

# バイナリの最新版をインストールする

    nodebrew install-binary latest

※2017年初めくらいから、ここでエラーが出るようになる(2016年頃はエラーは出なかった。)
※2021年1月にも同様のエラーが出ていることを確認

```
Fetching: https://nodejs.org/dist/v15.7.0/node-v15.7.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/XXXX/.nodebrew/src/v15.7.0/node-v15.7.0-darwin-x64.tar.gz: No 
Warning: such file or directory

curl: (23) Failed writing body (0 != 978)
download failed: https://nodejs.org/dist/v15.7.0/node-v15.7.0-darwin-x64.tar.gz
```

エラー対処する。
ディレクトリを作成する

    mkdir -p ~/.nodebrew/src

すると、成功する

```
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v15.7.0/node-v15.7.0-darwin-x64.tar.gz
################################################################################################################## 100.0%
Installed successfully
```


# nodebrewのリストからバージョン選択

    nodebrew list

listで表示されたバージョンから選択する
current:に選択されたバージョンが入っているかの確認

    nodebrew use v15.7.0

これでcurrentに指定したバージョンが入る

# パスを通す

```
$ echo 'export PATH=$PATH:$HOME/.nodebrew/current/bin' >> ~/.bash_profile
```

`vi ~/.bash_profile` で以下を追記する

```
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

ターミナルの再起動もしくは、以下のコマンドを使うことで、永続的に使用可能

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

# nodeとnpmコマンドで、バージョンが確認できる

    $ node -v
    v15.7.0


    $ npm -v
    7.4.3

参考URL
http://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09
http://qiita.com/akakuro43/items/600e7e4695588ab2958d
http://www.hirooooo-lab.com/entry/development/install-node#Nodejs%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%A2%BA%E8%AA%8D
初心者向けJava8ラムダ演習1 解答例

演習問題の回答例です。

http://qiita.com/aya_eiya/items/798fb1d3f87491e9f6fb


## 演習1-1 解答例

```java:Practice1Sol.java
import java.util.List;
import java.util.ArrayList;

public class Practice1Sol {
  static public void main(String[] args) {
    List<String> helloWorld = new ArrayList<String>(3);
    helloWorld.add("Hello");
    helloWorld.add(" ");
    helloWorld.add("World");
    helloWorld.add("!");
    helloWorld.stream().forEach(s -> {
      System.out.print(s);
    });
  }
}
```

## 演習1-1[+α] 解答例

```java:Practice1ASol.java
import java.util.stream.Stream;

public class Practice1ASol {
  static public void main(String[] args) {
    Stream.of("Hello", " ", "World", "!").forEach(System.out::print);
  }
}
```

## 演習1-2 解答例

```java:Practice2Sol.java
public class Practice2Sol {
  static public void main(String[] args) {
    String sourceText = "this is an test script to read.";
    sourceText
      .chars()
      .limit(sourceText.indexOf('.'))
      .map(c -> c > 'm' ? Character.toUpperCase(c) : c)
      .forEach(c -> System.out.print((char) c));
    System.out.print(".\n");
  }
}
```

## 演習1-2[+α] 解答例

実行結果の表示に限れば、例えば以下のように置き換えることは出来るが、このコードは元のループの置き換えとはなっていない。

```java:Practice2ASol.java
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

public class Practice2ASol {
  static private final int MAX = 1024;

  static public void main(String[] args) {
    String sourceText = "this is an test script to read.";
    List<Integer> sumBox = new ArrayList<>(sourceText.length());
    sourceText
      .chars()
      .mapToObj(c->{
        sumBox.add(sumBox.size() == 0 ? c : c + sumBox.get(sumBox.size() - 1) );
        return new AbstractMap.SimpleEntry<>(sumBox.get( sumBox.size()-1),c);
      })
      .filter(ent->ent.getKey()<=MAX)
      .mapToInt(Entry::getValue)
      .map(c -> c > 'm' ? Character.toUpperCase(c) : c)
      .forEach(c -> System.out.print((char) c));
    System.out.print("\n");
    if (sumBox.get(sumBox.size() - 1) > MAX) {
      System.out.println("script stopped for MAX size limitation.");
    }
  }
}
```

このコードを実行したとき、<code>sumBox.size()</code>は終端では、<code>sourceText.length()</code>と一致している。
それは、課題の元のコードにおけるwhileループの停止条件になっても、停止していないことを示している。
すなわち、この置き換え後のコードは無駄な処理を行っており、ループをStreamAPIによって単純に置き換えることが出来ないケースがあることを示している。
[Unity]UIボタンで、ボタン押しても反応しないのにボタンじゃない位置をタップしたら反応するといった問題が起きた場合

<h1>起こったこと</h1>
ボタンを押しても反応しないのだが、ボタンの少し左らへんをクリックすると反応したりするという問題が起きた。

<h1>改善方法</h1>
あれ、もしかしてこれ何か重なってるパターンか？って思って、ボタンの中のTextのwidthとHeightの値がそこそこ大きかった。
あっ...(察し)ってなった。
fontsizeを大きくしたかったので、widthとheightをあらかじめめっちゃ大きくしていた。

widthとheightの値をテキストのサイズと合わせていい感じの値にしたら、ボタンが反応するようになった。

あぁ、やっぱり重なってたのねってなった。

<h1>感想</h1>
UIを使ってると、何か重なって見えないとか反応しないとかたまに起きたりするので、UIで反応しないとかなったら、スクリプトの問題以外なら何か重なってるのではないかと考えるのもいいかもしれないですね
【FileMaker】ログイン切り替えをカードウィンドウで実装(ver.16以降)

システムによっては、広くユーザに見せたいルートと、ログインしないと見れないルートがあると思います。
例えば、
・商品情報は見せたいけれど、購入はアカウントを持っている人だけ
・同じ文章でも、この先はログインしてから
・施設予約で、保有する施設情報は閲覧できるけど、予約はアカウントを持っている人だけ
などでしょうか。

もちろん、カード表示以外にも通常のダイアログ表示で簡単に実装できますが、せっかくバージョンが16になりましたので、カードウィンドウでいきたいと思います。
（単純なウィンドウ表示でも問題なくできますので、ver.16より下のバージョンでも実装可能です）

カードにしたいのは、入力に集中してほしいからです。
つまり、他の部分には入力されたら困るのです。
別画面は入力不可にすればいいのではないか？とも思うのですが、入力できる部分までわざわざ入力のために入力不可の実装をしたくありません。

今回は、施設予約を例に実装をしていきます。

# 動き
では、動きを見てみましょう。
施設情報は誰でも閲覧できる状態だけれど、予約はアカウントを持っている人だけができる、という例になります。

施設一覧から、「予約する」ボタンを押します。
<img width="929" alt="カード1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/6d8e50ca-0855-9e9a-c9b7-fb7158cff28d.png">

ログイン画面が出てきます。
<img width="961" alt="カード2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/080926f7-b23d-7618-bd4e-760c1ec74618.png">

アカウント情報を入力して、「ログイン」ボタンを押します。
<img width="314" alt="カード3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/4fa662e9-9e85-32cf-db3a-c0286b41a7cc.png">

施設予約完了になります。
<img width="792" alt="カード4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/5d673397-2580-fbcc-4bf4-d8912947dcf0.png">

個人情報保護的な立場からすると、予約リストの画面を見せるのはNGですね。
この例では、予約ができていることを確認するためにサンプル表示しています。
実際に構築するときは、最初の画面に戻る方がいいです。

というか、そうしましょう。

# 実装
では、実装です。

## テーブル定義
テーブルは、以下のようなオカレンスを設計します。
<img width="850" alt="カード5.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/6bdd48e1-5237-e118-f473-82421222da95.png">
閲覧・予約する施設を管理する施設マスタ、予約するユーザのアカウントを管理するユーザマスタ、予約の状況を確認する予約リスト、という３つのテーブルです。

ログイン機能を実装する場合、入力されたアカウントを検索してもいいのですが、アカウント数が多くなると検索にも時間がかかりますので、ここはFileMakerらしくリレーションで検索機能を設計しました。

## レイアウト定義
レイアウトは、それぞれのマスタと、予約リストの３レイアウトを基準に、カードウィンドウで表示するログインレイアウトを用意します。
↓のレイアウトで、赤枠で囲んであるレイアウトが、ログイン確認用レイアウトになります。
<img width="493" alt="カード6.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/3b61cc4c-a235-f218-6007-0c193208d7fb.png">
これも確認用という意味合いが強いので、ログインレイアウトだけでも十分機能します。
FileMakerの実装に慣れてきたら、ログインまでの４つのレイアウトだけでいけます。

## スクリプトの実装
施設マスタでの「予約する」ボタンを実装します。
<img width="892" alt="カード7.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/d9030962-510b-1cff-e589-0a4e5c233bdd.png">
このスクリプトは、単純にウィンドウをカード表示するのと、初期値などの設定になります。
「新規ウインドウ」ステップで、ver.16ではウィンドウスタイルとして「カード」が選択できますので、ここで選択します。
ver.16より下のバージョンをお使いの方は、適当なウィンドウスタイルを選択してください。

カードウィンドウ表示したログイン画面では、アカウントをチェックして、実際に予約を行います。
<img width="796" alt="カード8.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/71f6b532-73d2-9a1f-04bb-7ba6c2591bbd.png">
このとき、テーブル定義で設計した、ログインのリレーションを使います。
ログイン時にレイアウトで設置した「ユーザマスタ 3」のアカウント入力グローバルフィールドと、リレーションした「ユーザマスタ 2」のユーザIDがヒットすれば、「ユーザマスタ 2」には該当のユーザレコードが絞り込まれます。

ユーザIDが取得できたら、予約リストに登録していきます。
アカウントがヒットしなかったら、ログインが失敗したことを知らせます。

# 実務では
実際の業務的な仕様では、例えば、
・収容人数で絞り込み
・アカウントのレベルによる予約できる施設のレベルを管理
・ログイン失敗した回数をカウントし、悪質なアタックに備える
・施設のキャンセル機能を実装する
などもあるかと思いますが、基本的にその辺は枝葉な仕様ですので、今回のようなアカウントを管理しながらユーザのしたいことを実現する、というのはカードウィンドウに限らず同じような実装でいけると思います。

いかがでしたでしょうか？
アカウント周りの出し方がわかれば、ログイン機能付きのカスタムAppを作る敷居が低くなりますね。
では、楽しいFileMakerライフを！
Bash on Ubuntu on Windowsから他サーバへのSSHが遅い問題を解決する


SSHしようとするといつも40秒くらい待たされていたが、`-vvv`オプションをつけたところ、Kerberos認証のタイムアウト待ちになっていることがわかった。`/etc/sshd/ssh_config`を以下のように設定して解決。

```:/etc/sshd/ssh_config
(snip)
Host *
# コメントアウトを解除
GSSAPIAuthentication no
(snip)
```
Runtime Changes for Migration from .NET Framework 

.NET Framework 4.Xはインプレース更新だが仕様変更がある点についてリストアップされている資料がある。

Runtime Changes for Migration from .NET Framework 4.5.2 to 4.7
https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/runtime/4.5.2-4.7

----

Runtime Changes for Migration from .NET Framework 4.0 to 4.7
https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/runtime/4.0-4.7

----

.NET Framework のバージョンの互換性
https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/version-compatibility
※記事は日本語だがリンク切れが多すぎる