OmniAICreator/Qiita-1.07M huggingface dataset:
Unity のバージョン番号の見方

Unity のバージョン番号形式 (**Unity X.Y.Z[fp]W**) は、どれが最新なのかよくわからなくなったので、こちらに記載します。特に f と p がわからない。個人的解釈なので誤りがあれば指摘してください。

# TL;DR
‘f’ はオフィシャルリリース、‘p’ はパッチリリース。'f' より 'p' が新しくリリースされたバージョンです。十分に品質テストされているのはオフィシャルリリースなので、'f' が付いているバージョンを使えば問題ありません。

# 対象読者
Unity 使用者

# 公式情報
Unity の公開技術情報によると下記のように記載があります。
[Unity のダウンロードとインストール](https://docs.unity3d.com/ja/540/Manual/InstallingUnity.html)
>**Unity X.Y.Z[fp]W** の名前がつけられ、**‘f’** はオフィシャルリリース、**‘p’** はパッチリリースを指します。

## 公式情報の解釈
**Unity X.Y.Z = Unity major.minor.update[fp]number** という形式です。パッチリリースは、オフィシャルリリース後に公開されますので、基本 **'p'** が付いている方が新しくリリースされたバージョンです。

## どれを使えばいいの？
'p' のパッチバージョンは、Unity から頻繁 (ウィークリー ペース)にリリースされるバージョンです。
'f' のオフィシャルバージョンは、十分に品質テストをされています。

基本は **'f' のオフィシャルバージョンを使えば問題ありません。**
どうしても必要な修正が含まれている場合は、'p' のパッチバージョン使ってください。

## 参考:実際の Unity リリース日の例
["Unity ダウンロード アーカイブ"](https://unity3d.com/jp/get-unity/download/archive)、["パッチリリース"](https://unity3d.com/jp/unity/qa/patch-releases) ページから確認できるリリース日は下記の通りです。

|Unity バージョン|リリース日 |
|:--------------|:---------|
|2017.1.2       |2017/10/6 |
|2017.1.2p1     |2017/10/13|
|2017.1.2p2     |2017/10/21|
|2017.1.2p3     |2017/10/27|

# 参考情報
情報をまとめるに辺り参考にした Web サイトです。
- [Unity のダウンロードとインストール](https://docs.unity3d.com/ja/540/Manual/InstallingUnity.html)
- [What does the f stand for in the version number?](https://answers.unity.com/questions/555890/what-does-the-f-stand-for-in-the-version-number.html)
- [What does p stand for in a release version?](
https://answers.unity.com/questions/1165187/what-does-p-stand-for-in-a-release-version.html)
- [【2017/8/22追記】Unityのパッチを当てる方法](http://magicbullet.hatenablog.jp/entry/UnityPatch)

# 補足1: Unity ベータ版プログラムについて
["Unity ベータ版プログラムについて"](https://unity3d.com/jp/unity/beta) ページからダウンロードできる Unity ベータ版は、**Unity X.Y.Zb = Unity major.minor.update[b]number** の形式 (例: Unity 2017.3.0b10) になります。通常のダウンロード ページ([Unity のアップデート](https://store.unity.com/ja/download?ref=update), [Unity ダウンロード アーカイブ](https://unity3d.com/jp/get-unity/download/archive)) からは、ダウンロードできません。

# 補足2: Unity 複数バージョンのインストールについて
[Unity のダウンロードとインストール](https://docs.unity3d.com/ja/540/Manual/InstallingUnity.html)
> インストール前に既存のフォルダー名を変更しておけば、問題なく両方のバージョンを同一コンピューター上に共存させることができます。

##### Unity が 複数インストールされている例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156393/fc5ac0d0-cb47-3650-0656-28bcc555dc04.png)
(上記画像でインストールされている Unity バージョン
: Unity 5.3.4f1, Unity 5.5.4f1, Unity 5.6.1f1, Unity 5.6.2f1, Unity 5.6.3p4, Unity 2017.1.0f3, Unity 2017.1.2f1, Unity 2017.1.2p3, Unity 2017.2.0.p1-MRTP4)
Spriteクラスを継承して値を持つ画像を作る[Cocos2d-x]

#はじめに
普通のSprite(画像)だと数値を持つことが出来ないため継承して拡張して使用する
とても重要でよく作ることになるクラス
継承するクラスを変えればさらに用途が広がる


```cpp:Sample.h
#ifndef __Sample__
#define __Sample__

#include <iostream>
#include "cocos2d.h"

class Sample : public cocos2d::Sprite
{
public:
    void calData();
    
protected:
    //元の画像の上にさらに画像を追加できる
    //ヘッダーに書いておくとcpp内のどの関数からもアクセス出来る
    cocos2d::Sprite* addSprite;
    int data;

    //sceneと同じでupdateでフレームで回すことが出来る
    void update(float dt);
    
public:
    //getterとsetterを同時に作成
    //このget~とset~で親からアクセスすることが出来る
    CC_SYNTHESIZE(bool, start, Start);
    CC_SYNTHESIZE(int, count, Count);

    Sample();
    ~Sample();
    virtual bool init();
    static Sample* create();
};

#endif /* defined(__Sample__) */

```

```cpp:Sample.cpp
#include "Sample.h"

using namespace cocos2d;
using namespace StringUtils;

//コンストラクター
//作成されるときに起こる処理
//:以降で数値の初期化をすることが出来る
Sample::Sample()
:count(0)
{
}

//デストラクター
//このクラスが終わるときに起こる処理
Sample::~Sample()
{
}

Sample* Sample::create()
{
    Sample* ret = new Sample();
    
    if (ret && ret->init())
    {
        ret->autorelease();
        return ret;
    }
    else
    {
        CC_SAFE_DELETE(ret);
        return NULL;
    }
}

bool Sample::init()
{
    std::string fileName;
    
    //作成したい画像のファイルパス
    fileName = "sample.png";
    
    if (!Sprite::initWithFile(fileName)) return false;
    
    //Sceneと同じで下の一文でフレームをぶん回す
    //scheduleUpdate();
    
    addSprite = Sprite::create("addSprite.png");
    addSprite->setPosition(Vec2(getContentSize() * 0.5));
    addChild(addSprite, 1);
    
    return true;
}

void Sample::update(float dt){
    //常に動かしたい処理を書く
}

void Sample::calData(){
    //このクラスの処理を書く
}
```

自分の作りたい関数や変数を持たす
プレイヤーやエネミーなど用途は様々

#次回
何か考える
RubyのFaradayを使ってJIRA APIを操作してみる

# やってみたこと
- Jiraチケットの作成
- 作成したチケットへのコメント投下
- 作成したチケットのクローズ

基本的に以下のURLをみながら実装
[JIRA Cloud REST API Reference](https://docs.atlassian.com/jira/REST/cloud/)
[はじめての JIRA REST API](https://qiita.com/yutwatan/items/36291d3833eb963fa583)
モデルで実装してrailsに機能追加

# Jiraチケットの作成

```ruby:jira_api.rb
class JiraApi

  def initialize
    @jira_host_url = 'https://<jira_hostname>'
    @conn_jira = Faraday::Connection.new(:url => @jira_host_url) do |builder|
      builder.request :url_encoded # リクエストパラメータを URL エンコードする
      builder.request :basic_auth, "AUTH_MAIL", "AUTH_PASS"
      #builder.response :logger # リクエストを標準出力に出力する
      builder.adapter :net_http # Net/HTTP をアダプターに使う
      #builder.request :retry, max: 10, interval: 0.01 #リトライする場合
    end
  end


  def create_issue(body)

    _hash = {
        "fields" => {
            "project" => {
                "key" => "TEST_PJ"
            },
            "summary" => "【自動チケット作成】test",
            "assignee" => {
                "name" => "REPORTER_MAIL"
            },
            "priority" => {
                "id" => "3"
            },
            "description" => "#{body}",
            "reporter" => {
                "name" => "REPORTER_MAIL"
            },
            "timetracking" => {
                "originalEstimate" => "60"
            }
        }
    }

    res = @conn_jira.post do |req|
      req.url "/rest/api/2/issue"
      req.headers['Content-Type'] = 'application/json'
      req.body = JSON.pretty_generate(_hash)
    end

    @jira_id = JSON.load(res.body)['key']
    @jira_url = "#{@jira_host_url}/browse/#{@jira_id}"
    return res.status.between?(200, 299), @jira_url, @jira_id
  end

  ...
end

```


# 作成したチケットへのコメント投下

```ruby:jira_api.rb
class JiraApi
  ...
  
  def add_comment(comment)
    _hash = {
        "body" => comment
    }
    res = @conn_jira.post do |req|
      req.url "rest/api/2/issue/#{JIRA_ISSUE_ID}/comment"
      req.headers['Content-Type'] = 'application/json'
      req.body = JSON.pretty_generate(_hash)
    end
    return res.status.between?(200, 299)
  end

 ...
end

```


# 作成したチケットのクローズ


```ruby:jira_api.rb
class JiraApi
  ...

  def close_issue
    _hash = {
        "transition" => {
            "id" => "2"
        }
    }
    res = @conn_jira.post do |req|
      req.url "rest/api/2/issue/#{JIRA_ISSUE_ID}/transitions"
      req.headers['Content-Type'] = 'application/json'
      req.body = JSON.pretty_generate(_hash)
    end
    print res.status
    return res.status.between?(200, 299)
  end

end
```

transitionのid番号が何に対応するかは
`https://<jira_hostname>/rest/api/2/issue/#{JIRA_ISSUE_ID}/transitions`
にGETリクエストを送ると調べられるます

# 感想
いろんな種類のapiが揃っていてかなり色々な使い方ができそう
今回のwebアプリではjiraのチケットを作業ログ代わりに使うことで、
様々な人がみやすい形で残すことができた
白っぽい文字(白,臼,日,曰,目,且,旦,亘)で動くプログラミング言語を作った

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/91558/d6d2dfc6-b540-2dbf-32e0-0a6e1d730c06.png)

# 作ったもの
**[白っぽいやつら - 白っぽい文字だけで動くプログラミング言語](https://redshoga.github.io/shiroppoi/)**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/9dc6aafc-c389-687b-94da-4662fca08c6f.png)

↓動作してるGIF
![out.gif](https://qiita-image-store.s3.amazonaws.com/0/91558/acd3905b-d40f-14e2-713a-6da0e5e11315.gif)


# 命令一覧
命令は以下のような対応になっています。

| 命令 | Brainf*ck | 動作 |
|:---:|:---:|:---|
| 白 | + | ポインタが指す値をインクリメントする |
| 臼 | - | ポインタが指す値をデクリメントする |
| 日 | > | ポインタをインクリメントする |
| 曰 | < | ポインタをデクリメントする |
| 目 | , | 入力から1バイト読み込んで、ポインタが指す先に代入する |
| 且 | . | ポインタが指す値を出力に書き出す |
| 旦 | [ | ポインタが指す値が0なら、対応する**亘**の直後にジャンプする |
| 亘 | ] | ポインタが指す値が0でないなら、対応する**旦**にジャンプする |

# 動機
日と曰の違いが分からな過ぎて。


# 詳細
Brainf*ckの文字を白っぽい文字(白,臼,日,曰,目,且,旦,亘)に置き換えただけのものです。
Webの実装は[ドットインストールのもの](https://dotinstall.com/lessons/basic_brainfck)とほとんど同じです。
詳しくは[ソースコード](https://github.com/redshoga/shiroppoi)を見てください。

# サンプルコード
"Hello,world!"を出力するコードです。
めちゃくちゃ読みづらいですね。

```
白白白白白白白白白旦日白白白白白白白白日
白白白白白白白白白白白日白白白白白曰曰曰
臼亘日且日白白且白白白白白白白且且白白白
且日臼且臼臼臼臼臼臼臼臼臼臼臼臼且曰白白
白白白白白白且臼臼臼臼臼臼臼臼且白白白且
臼臼臼臼臼臼且臼臼臼臼臼臼臼臼且日白且
```

上記のコードの実行例が以下の通りです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/bee9b2c3-6d1c-5b2a-30a7-62cd57f8dd63.png)
**こんな感じでちゃんと出力されます。**

# 番外編(その他のコード)

実際に実行してみてください。

↓💩

```
白白白白白白白白白旦日白白白白白白白白白曰臼亘日白白白白且曰白白白白白白白白白旦
日白白曰臼亘日白白白白白白白且曰白白白白白白白白白旦日臼曰臼亘日臼臼且白白白白白
且白且曰白白白白白白白白白旦日臼臼臼臼臼臼臼臼曰臼亘日且
```

↓オフ会👽

```
白白白白白白白白白旦日白白白白白白白白白白白白曰臼亘日白白白白白白白且曰白白白白
白白白白白旦日臼臼曰臼亘日且曰白白白白白白白白白旦日白曰臼亘日白白白白且臼臼臼且
曰白白白白白白白白白旦日臼曰臼亘日臼且曰白白白白白白白白白旦日臼臼臼臼臼臼臼曰臼
亘日臼臼且曰白白白白白白白白白旦日白白白白白白白白白曰臼亘日白白且曰白白白白白白
白白白旦日臼曰臼亘日臼臼且臼臼臼臼臼臼臼且曰白白白白白白白白白旦日臼臼臼臼臼臼臼
曰臼亘日臼臼且曰白白白白白白白白白旦日白曰臼亘日白白白白白白白且曰白白白白白白白
白白旦日臼曰臼亘日臼臼臼臼臼臼臼且曰白白白白白白白白白旦日白白白白白白白白曰臼亘
日白白白白白白且臼臼臼臼臼且白白白白白且
```

↓💰

```
白白白白白白白白白旦日白白白白白曰臼亘日白白白白白白白白且臼臼臼臼臼且且且曰白白
白白白白白白白旦日臼曰臼亘日臼臼臼臼臼臼臼且曰白白白白白白白白白旦日白白白白白白
白曰臼亘日白白白白且白白白白白且白白白白白白白且白白白白白白且曰白白白白白白白白
白旦日臼臼臼臼臼臼臼臼臼曰臼亘日臼臼臼臼且曰白白白白白白白白白旦日白白白白白白白
白白曰臼亘日白白白白白白白白且曰白白白白白白白白白旦日臼臼曰臼亘日臼臼且曰白白白
白白白白白白旦日白曰臼亘日且曰白白白白白白白白白旦日臼臼臼臼臼臼臼臼曰臼亘日臼臼
臼臼臼臼且曰白白白白白白白白白旦日白白白白白白白白曰臼亘日且白白白白白白白且白白
白白且曰白白白白白白白白白旦日臼曰臼亘日臼臼且白且曰白白白白白白白白白旦日臼臼臼
臼臼臼臼臼曰臼亘日且
```

↓ブンブン

```
白白白白白白白白白旦日白白白白白白白曰臼亘日白白白且曰白白白白白白白白白旦日白白
白白白曰臼亘日白白白白白白且臼臼臼臼臼臼臼且曰白白白白白白白白白旦日臼臼臼臼臼臼
臼臼曰臼亘日臼臼臼臼臼臼且曰白白白白白白白白白旦日白白白曰臼亘日白白白白白白白且
曰白白白白白白白白白旦日白白白白白曰臼亘日白白白白白白且臼臼臼臼臼臼臼且曰白白白
白白白白白白旦日臼臼臼臼臼臼臼臼曰臼亘日臼臼臼臼臼臼且曰白白白白白白白白白旦日白
白白白曰臼亘日白白白白且曰白白白白白白白白白旦日白白白曰臼亘日白白且白白白白白白
白且且白白白且曰白白白白白白白白白旦日臼臼臼臼臼臼臼臼曰臼亘日臼臼臼臼臼臼臼且曰
白白白白白白白白白旦日白白白白白白曰臼亘日白白白且曰白白白白白白白白白旦日白白曰
臼亘日白白白白且白白白白白白且曰白白白白白白白白白旦日臼臼臼曰臼亘日臼臼臼臼臼臼
且曰白白白白白白白白白旦日白白白曰臼亘日白白白白白白且曰白白白白白白白白白旦日臼
臼曰臼亘日臼且白白白且
```

# その他リンク
なんか文字列を表示させたいときに一から書くのはめんどくさい時は以下を使うと楽です。
[Brainfuck Text Editor
](http://tsoft-web.com/sub/brainfuck/editor.html)

# 宣伝
良かったらフォローお願いします:cheese: [@redshoga](https://twitter.com/redshoga)
ボックスを真ん中に配置する方法(忘備録メモ)

```css
.createForm__content {
  position: absolute;
  left: 50%;
  width: 720px;
  margin-left: -360px;
  background: #f4f4f4;
  box-sizing: border-box;
  border-radius: 4px;
}
```
leftを50%に移動させ、
widthの半分の長さをmargin-leftに指定する。

アドバイスいただきました。↓
`margin-left: -360px;`の代わりに`transform: translateX(-50%);`を使用する。

CSS3が使えて要素の幅が決まっていない場合には後者を使用するのがベスト。
offsetWidthの落とし穴

JavaScriptで幅を取得するときに`offsetWidth`を使っていたら、少しハマりました。

# トラブル

「中身の最大幅に合わせて幅を調整する」必要の生じた場面があったので、[こちらの記事](https://qiita.com/Sinraptor@github/items/1b3802db80eadf864633)を参考にして、「実際に表示する場所と同じレイアウトのスタイル」をかけた要素を用意して、`offsetWidth`で幅を測ってみました。

そして、その幅を本来表示させる箇所に適用した…ところ、なんと幅が足りず途中で改行が入ってしまう事態となりました。

# 原因と対策

[`.offsetWidth`のMDNページ](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/offsetWidth)に説明がありますが、

> This property will round the value to an integer.

つまり、`.offsetWidth`は値が整数に丸められる、ということです。そのため、小数の幅で切り捨てられた場合には実際の表示幅より`.offsetWidth`のほうが小さくなってしまうのです。その値をセットすれば、1ピクセル未満ではあるけど幅が足りなくなってしまった、という寸法です。

対策としては、MDNにあるように`.getBoundingClientRect().width`を使って値を取れば、小数値まできっちり取れます（フロートの高さ揃えなど、1ピクセル未満の誤差も出せないような場合はこちらが必要になります）。今回の場合は、最大1.5ピクセル広くなることは問題でなかったので、`.offsetWidth`の値に1を足して、小さくならないようにすることで対応しました。
将棋のAPIがあったら対戦つくれそうかな(4)・。・クロスドメインかーぁ、とりあえずリンクで。

SMaiL (VS版) β

http://logotypetofu.html.xdomain.jp/sp_smail/smailvs.html


(2017.11.27 変更)
・+ / も URIエンコードしたつもりで文字列データ生成
・VS Mode オフ状態で、Next(APIへ次の一手をきく) ⇒ bestmoveをVSRxへコピペ ⇒ Move(相手、上側の駒を動かす) ことができるように変更

VS Mode オン で 平手初期状態になる。
VS Mode オフ で 全ての駒を動かせるので、局面を並べて次の一手をAPIにきいてみる・。・こともできる。

ぐらいまで、現状で置いておこう。

スペースのまま文字列を作って、エンコードすればいいだけだったな。

+が認識されない、相手の駒が飛び越えてとんでくるという面白い動きをしていました(香車が自分の歩を飛び越えてくる)。戻ってきたデータに+が表示されるようになったので・。。・たぶん、対策出来ていると思います。

--------------------------------------

んーーー、クロスドメイン許可してもらえるように頼む・。・というのもあるけれど。

ちょっと、セキュリティとか？。

そういうのは、詳しくないので。

諦める・。・けれど・。・APIの記事にある方法でリンク作って送ってみよう。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/215245/1e7aebab-9ebc-50ba-dde6-893049972a19.png)

石器時代だな。

ボタンをクリックする、APIに次を教えてもらって、ウインドウにJSONを表示する。

表示する・。・お好きな回答をコピペしてボタンを押せば駒が動く(これは、まだ作っていません)。

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/215245/18eae272-dda8-a435-78f5-e370d832822b.png)

とりあえず、それで十分だな。
自己ループのテストよりは、対局している感じもするし。

-------------------------------

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/215245/9b9a5928-dec7-8fee-a01c-644949f607aa.png)

・VS Modeボタンをクリックする、先手(下側)で対局開始

・駒を動かしてリンクを更新
・APIに送って、次の一手をもらう
・bestmoveをコピペでMoveボタンで相手駒を動かす

ぐらいまで作り込み。
動かせます、が、ほぼノーチェック。
通信のエラーも処理なし。

テスト版なので、ローカルでのみ使うことにして。

この話は(4)で〆。
【Swift】HexString => Data【iOS】


# ヘキサ文字列からData型への変換メモ

Dataクラスを拡張してイニシャライザを追加

```swift
extension UnicodeScalar {
    var hexNibble:UInt8 {
        let value = self.value
        if 48 <= value && value <= 57 {
            return UInt8(value - 48)
        }
        else if 65 <= value && value <= 70 {
            return UInt8(value - 55)
        }
        else if 97 <= value && value <= 102 {
            return UInt8(value - 87)
        }
        fatalError("\(self) not a legal hex nibble")
    }
}

extension Data {
    init(hex:String) {
        let scalars = hex.unicodeScalars
        var bytes = Array<UInt8>(repeating: 0, count: (scalars.count + 1) >> 1)
        for (index, scalar) in scalars.enumerated() {
            var nibble = scalar.hexNibble
            if index & 1 == 0 {
                nibble <<= 4
            }
            bytes[index >> 1] |= nibble
        }
        self = Data(bytes: bytes)
    }
}
```

エントリポイントにて

```swift
let data:Data = Data( hex:"3c91d3c062df9caa79b4b2353c12a1295512987200002")
```

cf.
[NSData from hex String?](https://stackoverflow.com/questions/32231926/nsdata-from-hex-string)
配列の要素の重複をチェックする

# 配列の要素の重複を汎用的にチェックする

配列の要素の重複をチェックしたく以下の extension を実装してみた。

```swift
extension Array {
    func hasDuplicatedElements(where predicate: @escaping (Self.Element, Self.Element) throws -> Bool) rethrows -> Bool {
        var checkedOffsets: [Int: [Int]] = [:]
        for lhs in self.enumerated() {
            checkedOffsets[lhs.offset] = [lhs.offset]
            for rhs in self.enumerated() {
                let checked = checkedOffsets[rhs.offset]?.contains(rhs.offset) ?? false
                guard !checked else { continue }
                if try predicate(lhs.element, rhs.element) { return true }
                checkedOffsets[lhs.offset]!.append(rhs.offset)
            }
        }
        return false
    }
}
```

こんな model と配列があったとして、

```swift
struct Model {
    let id: String
}

let models = [Model(id: "x"), Model(id: "x")]
```

こんな感じで使える。`Element` が `Equatable` に準拠してなくても使える。

```swift
models.hasDuplicatedElements { (lhs, rhs) -> Bool in lhs.id == rhs.id } // true
```

すでに確認した要素同士の比較を避けているので、 for 文の回る回数は最大で 要素数の二乗 / 2 となるはず。
汎用的に書いたのでどこでも使えるぞ〜ってことで一旦満足した。

# 結局上のコードは捨てた

現状で配列の重複チェックなんて特定のモデル以外で書かないし、汎用的に書くことを諦めれば for 文の回る回数も最大で配列の要素数となるので、使うモデルクラスのみに extension を生やしてそれを使うことにした。

```swift
extension Array where Self.Element == Model {
    func hasDuplicatedElements() -> Bool {
        var ids = Set<String>()
        for model in self {
            if ids.contains(model.id) { return true }
            ids.insert(model.id)
        }
        return false
    }
}
```
Dockerfile ENTRYPOINTとCMDについて

# Dockerfile ENTRYPOINTとCMDについて

## 参考元
Dockerfile: ENTRYPOINT vs CMD
https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/


## 問題
DockerfileのENTRYPOINTとCMDはどう違うのか


## 結論

### 共通点

どちらも、containerがstartしたときに実行されるexecutableを指定する

### 相違点

CLIから実行する際のoverrideする方法が異なる

- CMD

``docker container run <image> <cmd>`` のようにimageあとの引数でoverrideできる

- ENTRYPOINT

``docker container run --entrypoint <cmd> <image>`` のようにoverrideするには明示的に ``--entrypoint`` flagが必要

##補足

```docker
FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping", "-c", "3"]
CMD ["localhost"]
```

のように併用すると  CMDの値が ENTRYPOINTに追加され, ``"/bin/ping -c 3 localhost"`` が実行コマンドになる.
ENTRYPOINTとCMDを併用する場合は Exec formでENTRYPOINTとCMDを記述しなければいけない点に注意


ENTRYPOINTはこのcontainerがENTRYPOINTで指定されたコマンドで起動されることを意図しているという強いmessageになる
このFutureを使ったコードは出来損ないだ、正しく実行されないよ

みたいなことをいうときに使うサンプルコード：

```scala:NGなコード
import com.twitter.finagle.Failure
import com.twitter.util.{Await, Future}

object Example {
  def ng: Future[Int] = {
    val x = 1 / 0
    Future.value(x)
  }

  def main(args: Array[String]): Unit = {
    val x = ng handle {
      case _: Throwable => Failure.rejected("invalid value")
    }
    println(Await.result(x))
  }
}
```

=>

```:標準エラー
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Example$.ng(Example.scala:5)
	at Example$.main(Example.scala:8)
	at Example.main(Example.scala)
```

Exceptionがhandleされない。401 Authorization Requiredなどの4xx系のエラーを返そうとしたときに5xx系のエラーが返ってしまう。


```scala:OKなコード
import com.twitter.finagle.Failure
import com.twitter.util.{Await, Future}

object Example {
  def ok: Future[Int] = Future {
    1 / 0
  }

  def main(args: Array[String]): Unit = {
    val x = ok handle {
      case _: Throwable => Failure.rejected("invalid value")
    }
    println(Await.result(x))
  }
}
```

=>

```:標準出力
Failure(invalid value, flags=0x09) with NoSources
```
ScriptableObjectで発生した Check that the definition is in a file of the same name.について

#ScriptableObjectではまったのでメモ

よくこんなSampleで動作確認とかしますよね。

`ScriptableSample.cs`

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;

    public class Sample : ScriptableObject
    {
        public int Counter;
    }

    public class ScriptableSample
    {
        [MenuItem("Assets/Create/ScriptableSample")]
        public static void CreateAsset()
        {
            Sample ObjSample = ScriptableObject.CreateInstance<Sample>();
            string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Data/" + typeof(Sample) + ".asset");

            AssetDatabase.CreateAsset(ObjSample, path);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }

Unity5.5で動いたので、安心してUnity5.6.2で動かしてみるとWarningが出ます！Unity2017でも同じようです。
`No script asset for Sample. Check that the definition is in a file of the same name.`

Warningの内容からdefinition　定義が無いと怒られているみたいです。
さて定義とは何でしょう。
あれこれぐぐっていたらここにぶつかりました。
[When building AssetBundles some scriptable objects get corrupted](https://answers.unity.com/questions/1379538/when-building-assetbundles-some-scriptable-objects.html)

最後にこんな説明がありました。
`A ScriptableObject must have his own name file. For example, your StructureSettings definition must be in "StructureSettings.asset" file. Please check your definition place about StructureSettings.`

ScriptableObjectにはそれを定義するファイルが必要だということです。
”ファイル？”

そう、file。

そこで、こんな感じ（↓）に変更してみると。Warningは消えました！
ScriptableObjectを作る時は、ファイル名とセットのクラスが定義されていることが大事なんですね。

`ScriptableSample.cs`

    public class ScriptableSample : ScriptableObject
    {
        public int Counter;

        [MenuItem("Assets/Create/ScriptableSample")]
        public static void CreateAsset()
        {
            ScriptableSample ObjSample = ScriptableObject.CreateInstance<ScriptableSample>();
            string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Data/" + typeof(ScriptableSample) + ".asset");

            AssetDatabase.CreateAsset(ObjSample, path);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }


ちなみにファイルを二つに分け、
`Sample.cs`と`ScriptableSample.cs`
Sample.cs側は
`public class Sample : ScriptableObject{}`

ScriptableSample側で、
`CreateAsset()`という形でもWarningは出ませんよ。
Onesignalで利用アカウントのユーザーデータをcsvでダウンロードする方法

# やりたいこと
push通知サービス「Onesignal（ワンシグナル）」に格納されているユーザーデータをcsvでダウンロードする

# 手順
1. コンソール（コマンドライン）を立ち上げる
2. ```curl -X POST -H "Authorization: Basic REST_API_Key" -H "Content-Type: application/json" -d '{
    "extra_fields": ["location", "rooted", "ip", "country"], "last_active_since": "1469392779"
}' "https://onesignal.com/api/v1/players/csv_export?app_id=One_Signal_App_ID"```
を叩く

※「REST_API_Key」と「One_Signal_App_ID」は、管理画面→App Settings→Keys & IDsにあります。それらをコピペして上記に当てはめてください。
<img width="713" alt="Screen Shot 2017-11-24 at 19.11.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/164107/89da9e05-b45c-81f4-3262-d412acb83029.png">
3. 上記コマンドを叩くと、```{"csv_file_url":"https://onesignal.s3.amazonaws.com/csv_exports/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/users_XXXXXXXXXXXXXXX_201X-XX-XX.csv.gz"}```
という値が返ってくる。
「https://....csv.gs」をコピペしてブラウザからアクセスするとダウンロードされる。

# やろうと思った経緯
・大量のユーザーデータから、あるIPアドレスやあるブラウザごとにソートしたいときに、管理画面上だけでできなかったので。

# 参考
https://documentation.onesignal.com/docs/accounts-and-keys#section-keys-ids
HSP3.5 HGIMG4 で高品質circle代用

# HGIMG4 で 高品質 circle 代用

HGIMG4 では circle 命令を使って2D楕円を簡単描画できますが16分割でありアンチエイリアスもかかっていません。そこで描画負荷が高い代わりにもうちょっとだけ高画質な楕円描画を用意してみました。
フラグメントシェーダーでユーザー指定の gcopy(実際に使用する命令は celput) を実装します。

# シェーダーファイルの作成
まず以下のファイルを作成します。

```glsl:res/shaders/sprdisc.frag
#if defined(OPENGL_ES) || defined(GL_ES)
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#endif

#define PI 3.1415926535

uniform vec4 u_px;

uniform sampler2D u_texture;
varying vec2 v_texCoord;

void main() {
	vec2 pxo = (v_texCoord - 0.5) * u_px.z;
	vec2 ned = vec2(abs(pxo.x / u_px.x), abs(pxo.y / u_px.y));
	float yrate = atan(ned.y, ned.x) / PI * 0.5;
	float rate = mix(u_px.x, u_px.y, yrate);

	float lv = rate / u_px.w * (1.0 - length(ned));

	gl_FragColor = texture2D(u_texture, v_texCoord);
	gl_FragColor.a = lv;
}
```
# 使い方
シェーダーの uniform u_px でパラメータを調整し celput(gcopy) で実際の描画を行います。

```hs:
#include "hgimg4.as"

	gpreset
	setcls CLSMODE_SOLID, 0x000033

	vs = "res/shaders/sprite.vert"
	fs = "res/shaders/sprdisc.frag"
	gpusershader vs,fs, ""
	side = 512
	buffer 2, side,side, screen_offscreen + screen_usergcopy
	celdiv 2, side,side, side/2, side/2
	gpgetmat id_mtl, 2, GPGETMAT_OPT_SCRMAT

// 横半径、縦半径、buffer の一辺の大きさ、アンチエイリアス幅
	gpmatprm4 id_mtl, "u_px", 250.0, 150.0, side, 2.0

	redraw 0
	color 255,128,0
	boxf
	redraw 1

	gsel 0
	gmode 2
	repeat
		getreq fps, SYSREQ_FPS
		
		redraw 0

		color 224,224,224
		circle 50,50, 400,400, 0

		pos 600,300
		celput 2
		
		pos 8,8
		mes strf("%2d [fps]", fps)
		redraw 1
		await 1000/60
	loop
```
実行すると以下のようになります。

|実行結果|
|:---:|
|![z03disc1.png](https://qiita-image-store.s3.amazonaws.com/0/213145/df805a3d-85b4-dfa4-d513-a0ba67f36d68.png)|
|左が circle 命令, 右が今回の楕円描画|

上記サンプルではオレンジ色一色に塗りましたがなにか画像を貼り付けて楕円にくりぬいたりすることもできると思います。
Raspberry Pi3にTensorFlowをインストールしたので備忘録としてメモっておく

#はじめに
Raspberry Pi3にTensorFlowをインストールする記事は多々ある。
以下の記載も、参考にさせて頂いた投稿と重なる部分が多い(ほぼ同じでは…)。
ここでは、自分の備忘録としてメモっておくことにする。

# TensorFlowのインストール
RaspberryPi用のTensorFlowは用意されていないので、samjabrahams氏のGitHubで公開されているリポジトリを利用する。

[samjabrahams/tensorflow-on-raspberry-pi](https://github.com/samjabrahams/tensorflow-on-raspberry-pi "")

READMEに従ってインストールしていく。

```
$ sudo apt-get install python-pip python-dev
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl
```
mockライブラリは一旦uninstallしてから再度installする。

```
$ sudo pip uninstall mock
$ sudo pip install mock
```

#OpenCVのインストール
後々、USB接続のwebカメラを接続し、画像をキャプチャするのでOpenCVもインストールしておく。

```
$ sudo apt-get install python-imaging
$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv
```
#Kerasのインストール
Kerasはpipでインストールする。

```
$ sudo pip install keras
```
関連ライブラリもインストールする。
pipでインストールするより、apt-getでインストールしたほうが速いらしい。

```
$ sudo apt-get install python-scipy
$ sudo apt-get install python-h5py
```

#TensorFlowのチュートリアル
TensorFlowのインストールが完了したので[チュートリアル(MNIST For ML Beginners](https://www.tensorflow.org/get_started/mnist/beginners))をやってみる。
mnist_softmax.pyのコードを1行ずつ解説していく、とあるがいきなり実行してみる。


```
$ python mnist_softmax.py 
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting MNIST_data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

(中略)
MemoryError
```

上記の様にMemoryErrorが発生。SWAP領域の容量を増やすことにした。

```
$ sudo vim /etc/dphys-swapfile
```

下記の様に"CONF_SWAPSIZE=100"とあり、100MBしか無いので1024MB位に増やしておく。

```
# where we want the swapfile to be, this is the default
#CONF_SWAPFILE=/var/swap

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=100
```
設定を変更して保存。

```
$ sudo /etc/init.d/dphys-swapfile restart
$ swapon -s
```

SWAP領域が増えたのでMemoryErrorが解消され、MNISTのチュートリアルが実行できるようになった。
ひとまず、TensorFlowのインストールからチュートリアルまでの手順をメモっておく。
Vimで二分探索する

# 注意

実用性は無いです。

# 前提

```
vim -u NONE -i NONE -N -c 'put=range(1000)' -c '$ delete' -c 'set cul'
```

* 初期状態ではバッファの各行が 0, 1, 2, ... 999 で埋まっている
* 探索する値は何でもいいけど今回は42ということにしておく

# 手順

```
:let s=42^Mqqgs50%zzgsy$@=@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"^Mq@q
```

* `^M` はcarriage returnに置き換えること

# 結果

![t.gif](https://qiita-image-store.s3.amazonaws.com/0/100649/5219e78c-a45f-f41e-d919-2f58c464c958.gif)

# 解説

## Step 1: 人間に読める形に分解する

```
:let s=42^Mqqgs50%zzgsy$@=@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"^Mq@q
```

↓

1. `:let s=42^M`
  * 探す値を変数 `s` に代入
2. `qqgs50%zzgsy$@=@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"^Mq`
  * 何か凄そうだけど……全体は `qq ... q` なのでキーボードマクロの記録をしてるだけ
3. `@q`
  * `...` の操作をもう一度やる

## Step 2: 記録された `...` の正体

```
gs50%zzgsy$@=@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"^M
```

↓

1. `gs`
  * 1秒sleep
  * 動きを人間の目でも認識できるよう仕込んでる(省略可)
2. `50%`
  * **バッファ全体の大体50%くらいの位置に移動**
3. `zz`
  * カーソル行が画面の中央に表示されるようビューを調整
  * 動きを人間の目でも認識できるよう仕込んでる(省略可)
4. `gs`
  * 1秒sleep(省略化)
5. `y$`
  * カーソル行の内容をコピー
6. `@=@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"^M`
  * 何か凄い事をやってる

## Step 3: 何か凄い事の正体

```
@=@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"^M
```

↓

1. `@=`
  * レジスタ `=` の内容をキーボードマクロとして実行する
  * 実行する内容は「この後に書いた式の評価結果」なので……
2. `@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"`
  * これが何か凄い式
3. `^M`
  * 式の終わりを示すcarriage return

## Step 4: 何か凄い式の正体

```
@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"
```

↓

1. `@0==''`
  * 最後にコピーした内容(=カーソル行の内容)が空文字列か判定する
2. `　?"SNot found\<Esc>"`
  * 空文字列なら全要素探索し終えたので終了
3. `　:@0<s`
  * カーソル行の内容が探索対象の値より小さいか判定する
4. `　　?'dgg@q'`
  * 小さいならバッファの前半を消して二分探索を再実行
5. `　　:@0>s`
  * カーソル行の内容が探索対象の値より大きいか判定する
6. `　　　?'dG@q'`
  * 大きいならバッファの後半を消して二分探索を再実行
7. `　　　:"IFound: \<Esc>"`
  * ここまで来たら探索対象の値が見つかったので終了

## ポイント

```
qqgs50%zzgsy$@=@0==''?"SNot found\<Esc>":@0<s?'dgg@q':@0>s?'dG@q':"IFound: \<Esc>"^Mq@q
```

↓ (これの骨格だけを抽出すると)

```
qq...@=...''?'...@q':'...'^Mq@q
```

↓ (より本質的なところを抽出すると)

```
qq...@q...q@q
```

* 1個目の `@q`: **キーボードマクロ `q` の記録中なのに `@q` で実行してる**
  * この段階ではレジスタ `q` の内容は空なので、 `@q` しても何も起きない
* 2個目の `@q`: 先程レジスタ `q` に記録された内容が実行される
  * この段階ではレジスタ `q` の内容は沢山あるので、 **`@q` の実行で更に `@q` が再帰的に実行される**
ASP.NET > aspcore2 > angular4 > Can't resolve　Module not foundが出てデプロイできない件


# Can't resolve './../$$_gendir/ClientApp/app/app.module.browser.ngfactory'　

デプロイ時にCan't resolve './../$$_gendir/ClientApp/app/app.module.browser.ngfactory'　　Module not found
が出て、にっちもさっちもいかなくなった件

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/aa2e9ca2-fb9a-ecb3-c437-856550c6a918.png)


突然、デプロイ時にエラーが出るようになってドハマリしました。

Webを調べてもいまいちヒットしません。
https://github.com/ionic-team/ionic/issues/13356
https://github.com/angular/angular/issues/18380



## 結果
試行錯誤の末、結果、よくわからないが治りました。

プロジェクトをクリーンして、
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/8f8a940a-e692-b154-cc0a-0a27a7b38233.png)

リリースでリビルド
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/84d07b65-c050-a266-2fe6-e506856d96d2.png)


その後、配置を行ったらエラーになりませんでした。


## 原因
原因はよく分かりません。何かの誤操作をしたのかもしれないし、そうではないかもしれない。
かなり疑問が残りますし、これでヨシとはしたくないですが、
たぶん後ほど、この処理を何度も繰り返すうちに原因がわかるでしょう。
Windows 10 > Shift押しながらシャットダウン > 完全にシャットダウンする > BIOS確認などに使う

```txt:動作環境
Windows 10 Pro (64bit) Fall Creators Update適用済
```

今日、修理作業をしてくれた人に聞いた事項。

Shift押しながらシャットダウンすることで、完全なシャットダウンができるとのこと。
高速スタートアップにならないため、BIOSの確認などするときに使うとのこと。

以下を見つけた。
https://dynabook.com/assistpc/faq/pcdata2/016705.htm
twitter APIで返ってきた配列がリツイートかどうかPHPで判別する

twitter APIで得た情報をリツイートかどうか判別して除外し特定の条件のものだけをデータベースに登録したかった。ひとまずtwitterOAuthあたりでタイムラインを取得してみる。

```php:twitterrequest.php
　　//適当にコネクトする部分はググってください。
$TwitterOAuth = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);
$request = $TwitterOAuth->get("statuses/home_timeline",array("count" => 50));
　foreach($request as $tweet){
　　//ツイートを一つ一つ取り出す
   $text = $tweet->text;
　}
```

リツイートは配列の中のtextが"RT @~"で始まる。
phpで冒頭に"RT "という文字列を含むかどうかを調べるためにstrposを使った。あとは正規表現くらいしかないっぽい。
strposは指定した文字が文字列の何文字目から始まってるかを返してくれる。
`strpos(文字列,指定した文字)`
という使い方だそう。
$textがリツイートの場合、RTから始まるため0が帰ってくる。リツイートでない場合、RTという文字列を含んでいなければbool(false)が、含んでいれば何文字目で始まるかの数字が返ってくるため、bool(false)の時、としてしまうとエラーが起きそう。
そのため「!(エクスクラメーション)」を使ってIF文で判別しようと思い、比較演算子を使ってboolがどういう挙動をするかを実験。結果は以下。


```php:withRT.php
//取り出したテキストがリツーイトの場合
	$text ="RT @Qiita:…<br>";
	$finder   = "RT ";
	$pos = strpos($text, $finder);//var_dump($pos)するとint(0)が返ってくる
	
	var_dump($pos===0);//bool(true) 
	var_dump(!$pos===0);//bool(false) 
	var_dump($pos!==0);//bool(false)
```

```php:withoutRT.php
//テキストがリツイートじゃない場合
	$text ="@qiita:…<br>";
	$finder   = "RT ";
	$pos = strpos($text, $finder); //var_dump($pos)がだいたいbool(false)になる
	
	var_dump($pos===0);//bool(false) 
	var_dump(!$pos===0);//bool(false) 
	var_dump($pos!==0);//bool(true)
```
　というわけで!$pos===0の挙動が予想と違ったので、

```
if($pos !==0){
//リツイートじゃない場合の処理
}
```

と書けばリツイートを除外できるっぽい。
Djangoのローカルテスト環境からGoogle Cloud SQLを使用する


## はじめに
Google Cloud SQLもDjangoで使用するDBの選択肢の一つです。
Djangoを開発中のローカル環境からProxyを使って接続する、私が主に使用している方法です。
Proxyの部分は[公式](https://cloud.google.com/sql/docs/mysql-connect-proxy?hl=ja)をなぞるのみです。
この記事はmacOSですが、LinuxでもProxyのインストールコマンドが違うのみで、その他は同様かと思います。

環境
OS: macOS 10.12 Sierra
Python: 3.6.3
Django: 1.11.2
Cloud SQL: 第二世代 MySQL 5.7

## 前提
以下、前提です。  

#### Cloud SDKはインストールされており、認証も済んでいる
されていない場合はこちらが公式です -> [Cloud SDK のインストール](https://cloud.google.com/sdk/downloads?hl=ja)
え?認証?よくわからないって場合はとりあえずこれでいけるかと思います。
参考までに。

```bash
gcloud auth application-default login
```

#### Cloud SQLのインスタンスは作成されている
第二世代 MySQL 5.7 で。

#### Cloud SQLのAPIは有効化されている
Google Cloud Platform(以下、GCP)上の左上メニュー -> 「APIとサービス」から見つかります。Google Cloud SQL APIのことです。

#### MySQLはローカルマシンにインストールされている
されていますか?
念のため、MySQLがポート3306を使用してされていないことを確認してください。

```bash
lsof -n -P -i:3306
```

です。使われてたら止めてやってください。

## Cloud SQLで接続ユーザーを作成する
Cloud SQLダッシュボードからユーザーを作成してください。
Cloud SQLダッシュボード:「左上のメニュー」->「SQL」
インスタンスを選択し、「インスタンスの詳細」から「ユーザー」で「ユーザーアカウントの作成」というボタンが見つかるはずです。

ここでは
ユーザー名: testuser
パスワード: password

ということにします。

## Proxyのインストール
インストールしたいディレクトリへ移動してください。
そして`curl`です

```bash
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
```

Linuxの場合は[こちら](https://cloud.google.com/sql/docs/mysql/connect-admin-proxy?hl=ja)から
そして実行権限を付与

```bash
chmod +x cloud_sql_proxy
```

## Proxyを開始
接続するインスタンスの「インスタンス接続名」を調べます。
GCPのダッシュボード左上のメニューからSQLを選択し、接続したいインスタンスを選択します。すると、インスタンスの詳細という画面から「このインスタンスに接続」という箇所がありますので「インスタンス接続名」をコピーしてください。

その上で、cloud_sql_proxyをインストールしたディレクトリへ移動し、下のコマンドを実行します。
もちろん`<INSTANCE_CONNECTION_NAME>`を上でコピーした「インスタンス接続名」で置き換えてください。つまり、`-instance="aaaa:bbb:ccc"`といった形です。  
ちなみに、Macだと`-instance`の後にDoubleQuotation""なしでも大丈夫ですがLinuxだとダメです。ハマったことあります。

```bash
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306
```

## MySQLセッションの開始とデータベースの作成
Proxyを起動している状態で先ほど作成した`django`というユーザーでログインしましょう。プロトコルはtcpです。

```bash
mysql -h localhost --port 3306 --protocol tcp -u root -p
```

PostgreSQLの場合はこちらです

```bash
psql -U postgres -h 127.0.0.1 --port 5432
```

MySQLセッションが開始できたらDjangoで使用するデータベースを作成しておきましょう。データベース名はtestdbとします。

```bash
CREATE DATABASE testdb;
```

## pymysqlのインストールとDjangoの設定
MySQLをDjangoで使用するたの設定です。
Djangoで使用する環境へ移動し、pymysqlをpipでインストールします。

```bash
sudo apt install libmysqlclient-dev
pip install PyMySQL
```

インストールしたら、Djangoプロジェクト内に以下を記述します。ベストプラクティスはわかりませんが、データベース設定を変更したいので今回はsetting.pyに記述します。

```vim
import pymysql

pymysql.install_as_MySQLdb()
```

さて、そのままデータベース設定を変更しましょう。
何も変更していない状態では以下の設定のはずです。

これを

```vim
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```

こうです

```vim
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
	    'NAME': 'testdb',
	    'USER': 'testuser',
	    'PASSWORD': 'password',
	    'HOST': 'localhost',
	    'PORT': '3306'
    }
}
```


あとは`python manage.py migrate`してあげれば(まだ`makemigrations`していなければ`makemigrations`も)、あたかもローカル環境のデータベースに接続しているような感覚で開発ができるはずです。

ちなみにサーバ環境では、サーバのIPをCloud SQL側で承認ネットワークに追加し、setting.pyの`HOST`をCloud SQLのIPにしてやるとそのまま使えたりします。
Python Controlで、状態フィードバックのゲインを求める。

###目的
Python Controlで、状態フィードバックのゲインを調べる。


###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)


###状態フィードバックのゲインを求める。
[control.place](http://python-control.readthedocs.io/en/latest/generated/control.place.html)
関数により、希望の極配置とするための状態フィードバックゲインKを求める。

control.place(A, B, p)

 - Parameters
  - A: System 行列
  - B: Control 行列
  - p: 希望の極配置
 - Returns:	
  - K: A-BKで希望の固有値を与える状態フィードバックのゲイン


###サンプルコード

```python:./slicot-test.py
#!/usr/bin/env python

import numpy as np              # Numerical library
from scipy import *             # Load the scipy functions
from control.matlab import *    # Load the controls systems library
from matplotlib import pyplot as plt

# Parameters defining the system
m = 250.0			# system mass
k = 40.0			# spring constant
b = 60.0			# damping constant

# System matrices
A = matrix([[1, -1, 1.], [1, -k/m, -b/m], [1, 1, 1]])
B = matrix([[0], [1/m], [1]])
C = matrix([[1., 0, 1.]])
sys = ss(A, B, C, 0);


# Controllability
Wc = ctrb(A, B)
a = np.mat(A)
print "Wc = ", Wc
if np.linalg.matrix_rank(Wc) != a.shape[0]:
   print ("System not Controllability\n")
else :
   print ("System Controllability\n")


# Eigenvalue placement
#from slycot import sb01bd
K = place(A, B, [-3, -2, -1])
print "Pole place: K = ", K
print "Pole place: eigs = ", np.linalg.eig(A - B * K)[0]


sys_fb = ss(sys.A-sys.B*K, sys.B, sys.C, sys.D)
out_fb, t_fb =  impulse(sys_fb, T = arange(0, 10, 0.01))
plt.plot(t_fb, out_fb)
plt.ylim([-1,1])
plt.show()

```

```
$ ./slicot-test.py 
Wc =  [[ 0.         0.996      2.24064  ]
 [ 0.004     -0.24064    0.7935424]
 [ 1.         1.004      1.75936  ]]
System Controllability

Pole place: K =  [[ 15.80864382  -3.63298165   7.85453193]]
Pole place: eigs =  [-3. -2. -1.]
```
![state_feedback.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/f20ce9c7-daed-6458-66c1-1d338b59ed7d.jpeg)
希望の極配置([-3, -2, -1])に設計できていることが確認でき、
インパルス応答に対して、状態フィードバックにより振動が収束している。

サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###注釈
この記事はPython Controlのexample [slicot-test.py](
https://github.com/python-control/python-control/blob/master/examples/slicot-test.py)の解説です。

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)
[PythonControlで1自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)
[PythonControlで2自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3604156086351a07e860)
シェル — スペースが含まれる配列要素をループする

# 注意

コメント欄参照

# 検証

ループの中で、添え字を使って配列要素にアクセスする。

```bash:example.sh
arr=(
"Space delimited text A"
"Space delimited text B"
"Space delimited text C"
)


for ((i = 0; i < ${#arr[@]}; i++))
do
  echo "${arr[$i]}"
done
```

# 結果

```
$ bash example.sh
```

```
Space delimited text A
Space delimited text B
Space delimited text C
```

# 問題

以下の書き方では、スペースの区切りで別要素として扱われてしまっていた。

```bash:example.sh
arr=(
"Space delimited text A"
"Space delimited text B"
"Space delimited text C"
)

for item in ${arr[@]}; do
  echo "$item"
done
```

```
$ bash example.sh
```

```
Space
delimited
text
A
Space
delimited
text
B
Space
delimited
text
C
```

# 環境

- bash 4.4.0








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Visual Studio | WPF > グラフ > LiveCharts > zooming and panning

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

### 処理内容

下記の機能を使う。

- zooming
    - 拡大、縮小
- panning
    - 表示位置をずらす

### 参考

- [Zooming and panning](https://lvcharts.net/App/examples/v1/wpf/Zooming%20and%20panning)

### code

上記の参考リンクではcode behindで設定している。
下記ではXAMLでの設定。

`Zoom="Xy"`を追加する。
他に"X", "Y", "None"があるようだ。

```MainWindow.xaml.cs
<Window x:Class="_171124_t1650_zooming.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171124_t1650_zooming"
        xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <lvc:CartesianChart Series="{Binding seriesCollection}" Height="250"
                                LegendLocation="Right"
                                Zoom="Xy"/>
        </StackPanel>        
    </Grid>
</Window>
```
   
```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// 以下を追加
using LiveCharts;
using LiveCharts.Wpf;

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

        private void graph_init()
        {
            gd = new GraphData();

            var sc = new SeriesCollection {
                new LineSeries
                {
                    Title = "pi",
                    Values = new ChartValues<double> { 3, 1, 4, 1, 5, 9, 2 }
                },
                new LineSeries
                {
                    Title = "napier",
                    Values = new ChartValues<double> { 2, 7, 1, 8, 2, 8, 1, 8 }
                }
            };

            gd.seriesCollection = sc;
            this.DataContext = gd;
        }

        GraphData gd;
        public class GraphData
        {
            public SeriesCollection seriesCollection { get; set; }
        }
    }
}
```

### 使い方

[Zooming and panning](https://lvcharts.net/App/examples/v1/wpf/Zooming%20and%20panning)
> use the mouse wheel to zoom in/out, click, hold and drag for panning.

- マウス真ん中のwheel上下: 拡大、縮小
- マウスでドラッグ: 表示位置をずらす

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/702686e8-672d-8929-9799-8a02d98856da.png)
Ruby 知っとけ技

いつもいつも書き方を忘れるので、メモ書き

# Hashから値だけを取り出す
`Hash#values`を使う

```rb:sample.rb
profile = {"name" => "TomoProg", "blood" => "AB"}
profile.values # ["TomoProg", "AB"]
```

# 配列の要素をとある文字で区切りたい
`Array#join`を使う

```rb:sample.rb
profile = ["TomoProg", "AB"]
profile.join      # "TomoProgAB"
profile.join(',') # "TomoProg,AB"
```

# 文字列をとある文字で区切りたい
`String#split`を使う

```rb:sample.rb
profile = "TomoProg,AB"
profile.split(',') # ["TomoProg", "AB"]
```

# 数値をカンマ区切りにしたい
`to_s(:delimited)`を使う

```rb:sample.rb
num = 123456789
num.to_s(:delimited) # "123,456,789"
```
Docker と POSIX シグナル

Docker でコンテナが終了されるとき、どういう場合だとどのシグナルが送信されて、どうすれば変更ができるか。

いつもよくわからなくなるのだけど、まとめてみたら案外大したことはなかった。

## 先にまとめ
- コンテナを終了するときは基本的に `SIGTERM` が送信される
    - `SIGTERM` で終了できなかったときは `SIGKILL` が送信される
- `kill` サブコマンドを使うと任意のシグナルをコンテナに送信できる
- どのような場合でも何らかの方法で終了シグナルを変更することができる

## プロセスを終了する系のシグナル
おさえておいたほうが良さそうなのだけ抜粋。

| シグナル番号 | シグナル名 | キーボード入力 | 概要 |
|---|---|---|---|
| 2 | SIGINT | Ctrl + C | キーボードからの割り込み (Interrupt) |
| 3 | SIGQUIT | Ctrl + / | キーボードによる中止 (Quit) |
| 9 | SIGKILL | | 強制終了 (Kill) |
| 15 | SIGTERM | | 終了 (Termination) |

詳しくは： [Linuxのシグナルまとめ \-\- ぺけみさお](https://www.xmisao.com/2013/11/10/linux-kill-signals.html)

## Docker での各種操作とその終了シグナル
デフォルト (`SIGTERM`)
+ Dockerfile の `STOPSIGNAL` 設定
+ Docker (Compose|Swarm) での個別設定

で終了シグナルが決まる、という感じ。

### Docker 単体
- `docker stop <container>`
    - デフォルトで `SIGTERM` が送信される
    - イメージの Dockerfile で [`STOPSIGNAL`](https://docs.docker.com/engine/reference/builder/#stopsignal) が設定されている場合、そのシグナルが送信される
- `docker kill <container>`
    - デフォルトでは `SIGKILL` が送信される
    - `-s, --signal <SIGNAL>` オプションを指定することで任意のシグナルを送信することができる

### Docker Compose
- `docker-compose stop <service>`
    - デフォルトで `SIGTERM` が送信される
    - docker-compose.yml で [`stop_signal`](https://docs.docker.com/compose/compose-file/#stop_signal) が設定されている場合、そのシグナルが送信される
- `docker-compose kill <service>`
    - デフォルトでは `SIGKILL` が送信される
    - `-s <SIGNAL>` オプションを指定することで任意のシグナルを送信することができる

- `docker-compose down <service>`
    - `stop` と同じ

### Docker Swarm
- `docker service update <service>` でコンテナが更新される場合
    - デフォルトで `SIGTERM` が送信される
    - サービスに `--stop-signal <SIGNAL>` が設定されている場合、そのシグナルが送信される (`service create` 時に指定する、もしくは `service update` で設定する)
- `docker service scale <service>=0` (Scale Down する場合)
    - `update` と同じ
情報処理安全確保支援士の登録手続きにかかったお金

# はじめに
バイト先から2万円もらえたので情報処理安全確保支援士に登録を申請してみました。
結論から言うと足が出ました。

## 前提
- 情報セキュリティスペシャリストに合格している
- 住民票は住んでいるところにある
- 本籍は遠くにある

## お金のかかるもの
https://www.ipa.go.jp/siensi/#section4 に掲載されている登録手続きに必要な書類のうち、お金のかかる書類

- 登録申請書
    - 登録免許税
    - 登録手数料
- 登記されていないことの証明書
- 市区町村の交付する身分証明書または身元証明書
- 住民票の写し

# 実際にかかったお金（実績値）
## 登録申請書の部

|お金 |場所 |備考|
|:--|:--|:--|
|9000円|郵便局|収入印紙|
|10700円|銀行|振り込んだ証明|
|108円|銀行|手数料|
|450円|郵便局|送料（簡易書留）|
|82円|郵便局|領収書返送用の切手代|

小計：20,040円
早速足が出ました :thinking: 

## [登記されていないことの証明書](http://houmukyoku.moj.go.jp/tokyo/static/i_no_02.html)の部
これは各地の法務局・地方法務局で貰えます。
郵送で欲しい場合は東京法務局に送りましょう。僕は直接いきました。

|お金 |場所 |備考|
|:--|:--|:--|
|300円|法務局|東京法務局は神保町にあります|
|800円|電車|地下鉄高い|

小計：1100円
交通費はぼかしてます。

## 市区町村の交付する身分証明書または身元証明書
**本籍**のある市区町村が発行します。住民票とは別のところです(僕の場合)。

|お金 |場所 |備考|
|:--|:--|:--|
|300円|市役所|郵便小為替|
|100円|郵便局|↑の発行手数料|
|120円|郵便局|返送用封筒の切手|
|120円|郵便局|送料|

小計：880円
郵便小為替は16時までしか買えません。郵便局自体は17時まで空いてるので注意しましょう。
あと手数料とかは市区町村に確認しましょう。

## 住民票の写し
**住民票**のある市区町村が発行します。

|お金 |場所 |備考|
|:--|:--|:--|
|300円|市役所|発行手数料|

小計：300円
これはよく使うので簡単ですね。

## 節約できたお金

- 封筒代 - バ先の封筒を使いました。
- 交通費 - バ先が役所の近くで助かった。

## 節約できるかもしれないお金

- 身元証明書の通信費 - 本籍と住民票が同じところにあればもっと楽だった。

## プライスレスなもの
- かかった時間


# 合計
**22,320円**

職場に登録料もらうときはこれぐらいもらいましょう。

## おわり
バイト先がお金を出してくれたおかげで情報処理安全確保支援士に登録申請出来ました。
今後お金がかかる講習会とかもバ先負担になったら嬉しいな :smile:

来年の4月1日に登録されるらしいのでなんとか20歳のうちに情報処理安全確保支援士を名乗れそうです。
Kotlinで複数メソッドを持つInterfaceを実装する

## 概要
KotlinでRetrofit2を使ったAPI実行を試していて
enqueueでCallback<T>を実装するときに
onResponseとonFailureの二つのメソッドを持っていてハマったのでメモ書きです。

## 実装

``` kotlin
var servie = RetrofitServiceGenerator.createService()
servie.getUser("testuser").enqueue(object: Callback<Users> {
    override fun onResponse(call: Call<Users>?, response: Response<Users>?) {
        response?.body()?.let {
            // 処理
        }
}
    override fun onFailure(call: Call<Users>?, t: Throwable?) {
        t?.let {
            // 処理
        }
    }
})
```

キモは object: の後に Interfaceの型を書いて overrideでJavaのようにメソッドをoverrideする必要があるということです。
ラムダでは表現できないみたい。

インターフェースの実装だけを抜き出すと以下のように書けます。

``` kotlin
var callback = object: Callback<Users> {
　　　　override fun onResponse(call: Call<Users>?, response: Response<Users>?) {
　　　　　　　　// 処理
　　　　}

　　　　override fun onFailure(call: Call<Users>?, t: Throwable?) {
　　　　　　　　// 処理
　　　　}
}
```

Swiftのクロージャの方がこの点は直感的で扱いやすいなと思いました。
macを新しくして`rails s`しようとして `start_tcp_server': no acceptor (port is in use or requires root privileges) でたけど、portは空いてるんですけど

# 背景
- 最近macを変えた
- 移行アプリケーションで旧macからデータ移行した
- rails4.2.6
- ruby2.3.1
- `rails s`しようとしたら `'start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)`
- `sudo rails s` しても同じエラーなので権限じゃなさそう
- 同じportは使ってない。絶対使ってない。

# 解決法
- /etc/hostsに`127.0.0.1 localhost`を追記する（！）

# 一言
- エラー文言がなかなかいじわるだと思った
- まさかhostsだとは、、
  - っていうか、デフォルトでlocalhostのhosts設定してないのか、、、
- stackoverflowに助けられた
  - [リンク](https://stackoverflow.com/questions/27851440/eventmachine-start-tcp-server-no-acceptor-port-is-in-use-or-requires-root)
- 超限定的な条件だけど、結構ハマってつらかったので一応書いておく
PythonControlで可制御性・可観測性を調べる

###目的
Python Controlで、可制御性・可観測性を調べる。


###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)

###可制御と可観測性
可制御とは、システムの状態を入力で動かす(制御する)ことができるか？、
可観測性とは、システムの状態を出力から推定する(観測する)ことができるか？、
を表す。

###可制御を調べる
可制御は、可制御行列がフルランクであるか、否か、で判断する。

[control.ctrb(A, B)](http://python-control.readthedocs.io/en/latest/generated/control.ctrb.html)

 - Parameters
  - A: System 行列
  - B: Control 行列
 - Returns:	
  - Wc: 可制御行列



###可観測性を調べる
可観測は、可観測行列がフルランクであるか、否か、で判断する。

[control.obsv(A, C)](http://python-control.readthedocs.io/en/latest/generated/control.obsv.html)

 - Parameters
  - A: System 行列
  - C: Output 行列
 - Returns:	
  - Wo: 可観測行列

###行列の階数(ランク)を調べる
　行列の階数(ランク)はNumPyの関数matrix_rank()で求めることができる。

[numpy.linalg.matrix_rank()](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.matrix_rank.html)


###サンプルコード

./test-statefbk.py

```
#!/usr/bin/env python

import numpy as np              # Numerical library
from scipy import *             # Load the scipy functions
from control.matlab import *    # Load the controls systems library

# Parameters defining the system
m = 250.0			# system mass
k = 40.0			# spring constant
b = 60.0			# damping constant

# System matrices
A = matrix([[1, -1, 1.], [1, -k/m, -b/m], [1, 1, 1]])
B = matrix([[0], [1/m], [1]])
C = matrix([[1., 0, 1.]])
sys = ss(A, B, C, 0);
print sys


# Controllability
Wc = ctrb(A, B)
a = np.mat(A)
print "Wc = ", Wc
if np.linalg.matrix_rank(Wc) != a.shape[0]:
   print ("System not Controllability\n")
else :
   print ("System Controllability\n")

# Observability
Wo = obsv(A, C)
print "Wo = ", Wo
if np.linalg.matrix_rank(Wo) != a.shape[0]:
   print ("System not Observability\n")
else :
   print ("System Observability\n")



```



サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###注釈
この記事はPython Controlのexample [test-statefbk](
https://github.com/python-control/python-control/blob/master/examples/test-statefbk.py)の解説です。

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)
[PythonControlで1自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)
[PythonControlで2自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3604156086351a07e860)