OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveRecord::PendingMigrationError が表示されたら


#エラー画面が出る前の経緯
ユーザー情報を管理するデータベースにアクセスするためのモデルクラスを作成しようと思い、
usersテーブル（ユーザー情報を管理する）と、usersテーブルに対応する Userクラス を作成した。

```
$ rails generate model user name:string email:string password:string image:string comment:text
```

すると

```
Running via Spring preloader in process 2710
      invoke  active_record
      create    db/migrate/20190205145217_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
```

と返ってきて、無事作成されたようである。

再度、Railsを起動して作成中のページを更新したところ、
以下のようなエラー画面が出てきた！

#エラー画面
<img width="919" alt="スクリーンショット 2019-02-06 10.14.12のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/204239/4e47111a-33e6-bb0d-a54b-58f0c2e69427.png">


以下のコマンドで、マイグレートしてテーブルを作成

```
$ bundle exec rails db:migrate
```

再起動すると、無事エラーが解消された。
Linuxbrewを2.0.0に更新する


Migrating Linuxbrew to 2.0.0

古い状態で`brew doctor`を実行すると、次のようなメッセージが出ます。示されたgitコマンドを用いてremote URLを書き換えれば完了です。

When you execute `brew doctor` with old state, you will see the following message. All you need to do is to execute this git command to update the remote URL.

```
Warning: git origin remote is Linuxbrew/brew.

Linuxbrew/brew has been merged into Homebrew/brew!
Linuxbrew/brew will no longer be updated.
The current git origin is:
  https://github.com/Linuxbrew/brew

Please set the origin remote to point at the Homebrew/brew by running:

  git -C "/home/linuxbrew/.linuxbrew/Homebrew" remote set-url origin https://github.com/Homebrew/brew
```
VCCWで設定したhostnameでアクセスできなかった場合試すこと

久しぶりにWordPressのローカル環境をVCCWで構築したときに躓いた話。
なお、Macでの環境構築です。

##環境構築~問題発生まで
vccwのGetting Started(http://vccw.cc/#h2-2)
に書いてある通り、vagrant, virtualboxをインストールしてboxをadd。

```
vagrant box add vccw-team/xenial64
```
次にhostnameを解決するプラグインvagrant-hostsupdaterをインストール。
gitからvccwのダウンロード。

```
git clone https://github.com/vccw-team/vccw.git プロジェクトフォルダ名
```
プロジェクトフォルダ/provision/default.ymlをコピー、site.ymlにリネームしてプロジェクトフォルダ直下に置く。
site.ymlの以下の部分を編集。

```yml

# Network Settings
# お好きなhostname（〇〇.testが良い。）とip
hostname: vccw.test
ip: 192.168.33.10

#
# WordPress Settings
#
version: latest
lang: ja #en_USからjaに変更
title: Welcome to the VCCW
multisite: false
rewrite_structure: /archives/%post_id%

```
できたらプロジェクトフォルダ直下で

```
vagrant up
```
初回は3分ぐらいかかる。完了するとsite.ymlで設定したお好きなhostname、またはipをブラウザでアクセスするとデフォルトのテーマが表示される。

### 問題
自分の場合は設定したhostnameでアクセスしても表示されず(ERR_CONNECTION_TIMED_OUT)、ipでアクセスするとjsやcssが読み込まれない状態で表示された。

##解決プロセス

### 1.vagrant-hostsupdaterを入れているか

```
vagrant plugin install vagrant-hostsupdater
```

### 2.vagrant upの際に正しいログインパスワードを入れているか
vagrant upのあと、hostnameを設定する際にadministrative accessが必要になる。
そのときに正しいログインパスワードを入れてあげる。

```
==> 設定したhostname: [vagrant-hostsupdater] This operation requires administrative access. You may skip it by manually adding equivalent entries to the hosts file.
Password:

```

### 3.hostname、ipは正しく設定されているか
複数立ち上げている場合は異なるhostname, ipが競合するので異なるものを使用する。
また、〇〇.comはもちろん、〇〇.dev, 〇〇.localの使用を避ける。

***

2019.06.20追記

### 4.既存サイトを新たにpullする場合はプラグインDynamic Hostnameを入れる
既にある本番環境Webサイトなどの場合にはhostnameを置換してくれるDynamic Hostnameを入れる必要がある。
https://ja.wordpress.org/plugins/dynamic-hostname/

また、本番環境Webサイトwp-config.phpに[WP_HOME]の設定をする。
```define('WP_HOME', 'https://本番URL');```
JavaScriptで三項演算子を使用する際の注意点！

#問題
こういったjsファイルの記述をif文から三項演算子で一文にしたい。

```message.js
var imagefile = '';
if (message.image.url) {
imagefile = `<img src="${message.image.url}", class = 'lower-message__image'>`;
}
```


#解答


```js
  var imagefile = message.image.url? `<img src="${message.image.url}", class = 'lower-message__image'>` : "";
```

<読みやすいように改行すると、こう>

```js
  var imagefile = message.image.url? 
`<img src="${message.image.url}", class = 'lower-message__image'>` : "";
```



#注意するポイント

元々のjsファイルではtrueしか記述していない、
jsファイルはこれでも動くことができる。

だがしかし、
三項演算子の場合だと　必ず***trueを表す「?」*** と***elseを表す「:」*** がいる


今回の問題の場合、
trueの時は処理をimgの表示
elseの時は何もしないようにしたかった。

そのため、else　　すなわち「:」以下を、 ***""***　　とした。


つまり、

もし message.image.urlがあるならimgタグを使用する。
ない場合は、""を返す。

という式になる。
Elixirでローカルのパスをdepsに定義する


ElixirでOSS開発を始めました。
|> [Webサービスバックエンドライブラリー　Materia](https://qiita.com/tuchiro/items/eb0c5e9a7a1ce67cf1e3)

複数のElixirプロジェクトで分けて開発していると、
依存される共通機能側のプロジェクトを修正しつつ依存する側の機能を確認したい場合がある。

そういった場合は、一時的にdepsにローカルファイルパスを定義すると楽です。

例えば、materiaに依存するプロジェクト開発中にmateriaの修正と合わせて確認したい場合は以下のような定義になります。

```elixir:mix.exs
defp deps do
    [
      {:phoenix, "~> 1.3.0"},
      {:phoenix, "== 1.3.2"},
      {:phoenix_pubsub, "~> 1.0"},
      {:plug, "== 1.5.0"},
      {:phoenix_ecto, "~> 3.2"},
      {:postgrex, ">= 0.0.0"},
      {:phoenix_html, "~> 2.10"},
      {:phoenix_live_reload, "~> 1.0", only: :dev},
      {:gettext, "~> 0.11"},
      {:cowboy, "~> 1.0"},
      {:triplex, "~> 1.2"},
      {:cors_plug, "~> 1.5"},
      #{:materia, "~> 0.1.2"},
      {:materia, path: "{ローカルのパス}/materia", app: false},
      {:ex_doc, "~> 0.13", only: :dev},
      {:logger_file_backend, "~> 0.0.4"},
      {:distillery, "~> 1.0.0"}
    ]
  end
```

まあ、そもそも共通機能の独立性、汎用性という観点から言うと、先に依存される側がテスト済であるべきだとは思うのですが。
場合により便利です。
Python 2.7.x から移行する方法

Python 2.7.x のサポート終了まで1年を切りましたね！

[Python2.7.0 のリリースが2010年7月3日](https://www.python.org/downloads/)ですから、

> 「えっ？僕が入社した時には、すでに3.xでしたよ？」
> 「2.7なんて使ったことがない」

という人も多いことでしょう。一方で**いまだに2.7.xとの腐れ縁が切れない人**も多いと思います。私もそうです。

そこで、今年こそPython 2.7を廃止するべく、3.xへの移行方法を調べてみました。


<!-- more -->


# 公式ドキュメントに載っていた

実は調べるまでもなく、**公式ドキュメントに載っていました**。

> あなたのプロジェクトを、単一ソースで Python 2/3 両方に対応させる基本的なステップは次のとおりです。
>
> - Python 2.7 だけをサポートすることに気を配ってください。
> - 良いテストカバレッジを確保してください。 (coverage.py が推奨されます; pip install coverage)
> - Python 2 と 3 の違いを学びましょう。
> - Futurize (もしくは Modernize) を使ってコードをアップデートしてください。 (たとえば pip install future)
> - Python 3 サポートに関してデグレを防ぐために Pylint を使ってください。(pip install pylint)
> - caniusepython3 を使ってどの依存性があなたの Python 3 の使用を妨げているかを検出できます。 (pip install caniusepython3)
> - 依存性があなたを邪魔しなくなってさえしまえば、Python 2 & 3 への互換性を保つのを保障するために、継続的インテグレーションを使いましょう (tox が複数バージョン Python 相手のテストの手助けをしてくれます; pip install tox)
> - Consider using optional static type checking to make sure your type usage works in both Python 2 & 3 (e.g. use mypy to check your typing under both Python 2 & Python 3).
>
> [Python 2 から Python 3 への移植 — Python 3.7.2 ドキュメント](https://docs.python.org/ja/3/howto/pyporting.html)

最後の行だけ未翻訳なのが残念ですが、標準ライブラリだけでなく**オススメのサードパーティ・ツールまで紹介しています**。さらに、ページの後半には詳細手順も載っています。これだけ充実していれば、作業段階の手順はバッチリですね。

なお、残念ながら「上司を説得する」「予算を確保する」といったステップについては情報がありませんでした。
【Unity】Shader Graphで円柱の頂点をウニョウニョ動かしてみた

ここ最近、ShaderでUnity上の３Dモデルを動かしてみよう！と思い、シェーダーの勉強をしておりました。

そのときに出会ったのがShader Graphです。Shaderを視覚的に作れるGUIツールで、Shaderのscriptを書くのに四苦八苦している自分には救世主のような存在でした。

ウキウキ気分でShader Graphを使ったのですが、私には頂点をイジるまでも大変でした(^p^)

何とか形になったので、備忘録としてQiitaに投稿させて頂きます！
## 完成形
ウニョウニョ動く円柱
![sg2.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/414ec5be-8618-8ebd-99e9-8e31c9ea1be5.gif)


## 全体図
![スクリーンショット_2019-02-06_10_32_44.png](https://qiita-image-store.s3.amazonaws.com/0/314351/c1c91afc-795c-28fd-e23b-ac8558dade39.png)

イメージとしては、yz軸によって頂点のx座標がsin関数に沿うShaderになります。順を追って説明していきます！

### ①サイン波のスピードを入力
![スクリーンショット_2019-02-06_10_35_50.png](https://qiita-image-store.s3.amazonaws.com/0/314351/46f7c43e-3ab3-8d39-6a10-17f46ee5146b.png)

時間×パラメータ値をサイン波に入力することで、速度を表現しています。速度がゼロであれば動かないで動かないですし、大きければ大きいほど俊敏に動きます笑

速度ゼロから徐々に上げていったGifがこちら！
速度をあげると、すばやく左右に動くことが確認できます。
![qiitasg1.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/f0521c69-7157-8f96-6b8a-50dccde0c8ea.gif)

### ②サイン波の周波数を入力
![スクリーンショット_2019-02-06_10_36_06-2.png](https://qiita-image-store.s3.amazonaws.com/0/314351/068fc7d0-ea8e-66a0-584e-b5efa3506fcf.png)
Positionノードからyz領域を取得し、サイン関数に影響するようにします。最終的には①のスピードと②の周波数を足したノードをsineノードに入力すれば、所望の動きが得られます。

周波数をゼロから徐々に上げていったGifがこちら！
周波数をあげると、波１つ単位の幅が狭まっていることがわかります。
![qiitasg2.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/15f101bc-8b22-dd36-9f6a-a0b21335c7a8.gif)

### ③速度＋周波数をx軸にaddして完了！
![スクリーンショット_2019-02-06_10_37_05.png](https://qiita-image-store.s3.amazonaws.com/0/314351/d555cf57-7767-13f0-22e0-d5dd795c363f.png)

①と②のノードを足したモノをsineノードに入力します。そして、入力した値にパラメータを乗算することで、波長の大きさを表現できます。

最後に本来の頂点のx座標(positionノードのx座標)に、サイン波を足して、出力になるpositionに打ち込めば完成です！

## ＋αした動き
振り子のように動く円柱
![sg3.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/8f625533-bed7-6bcb-e9df-33f4255c0eb2.gif)

y座標の根本が動かないようにしたい感じですね。
こちらも簡単に紹介します！
### 波長にy座標を関係させればOK！
<img width="606" alt="スクリーンショット_2019-02-06_11_15_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/314351/d62c806f-76d4-95d1-8736-00a07205c51f.png">

波長のパラメータに、positionノードからy座標を関係させればOKです。そして波長パラメータと乗算すれば完成！

y座標が0であれば、波長ゼロ。y座標が大きくなるにつれて、波長が大きくなる仕組みです。

### 必ずオフセットは入れること！！！
ここで注意すべきポイントは、オフセットでy座標を＋１することです！！！
円柱の場合は、オブジェクトの中心位置が真ん中なので、オフセットを入れないと、円柱の真ん中が動かなくなるだけで変化は見られません。

なので、オブジェクトの全体の位置を＋することで、相対的にオブジェクトの中心位置(0,0,0)を下にズラせば振り子のような動きができます。

私はこの事実に気づかず、１.5時間くらい消耗しました(^p^)

## 最後に
Shader Graphで頂点を動かしたい方はぜひ参考にしてみてください！

## 参考URL
- [【Unityシェーダ】Shader Graph超入門](http://nn-hokuson.hatenablog.com/entry/2018/05/08/212502)
- [動くアート ― シェーダーグラフでアニメーション付きマテリアルを視覚的に作成しよう](https://blogs.unity3d.com/jp/2018/10/05/art-that-moves-creating-animated-materials-with-shader-graph/)
- [Unityのシェーダーグラフについて](https://gametukurikata.com/shader/shadergraph)
PhpStorm の Settings Repository (使う時はリポジトリをプライベートにしましょう！)

# はじめに、
仕事でこの機能を使う時は特に
**リポジトリをプライベートにしておきましょう！！**
意外なものまで公開してしまう可能性があります。

---

複数の環境でPhpStormを使う時に
設定ファイルをGitHubなどのリポジトリからインポートできたら便利ですよね
そんな時に便利なのがこちらの「Settings Repository」です。

# 設定
設定は下記の方法でできます。
他の方法はわかりません。

## File -> Settings Repository

![スクリーンショット 2019-02-06 10.14.48.png](https://qiita-image-store.s3.amazonaws.com/0/20772/3358c120-eaea-3378-3c37-335a2b3fd068.png)

![スクリーンショット 2019-02-06 10.15.09.png](https://qiita-image-store.s3.amazonaws.com/0/20772/8c713f0c-cdf4-ff37-3639-4d0d757184f7.png)

## Preferences -> Tools -> Settings Repository

![スクリーンショット 2019-02-06 11.06.07.png](https://qiita-image-store.s3.amazonaws.com/0/20772/5f00e622-9be4-47b1-48e0-c021723911c7.png)
Spek2でLiveDataのテストをする


そのまま実行するとLooperでエラーが出る

```
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
```

TaskExecutorを継承したテスト用のクラスを作る

``` kotlin
class TestArchTaskExecutor : TaskExecutor() {
    override fun executeOnDiskIO(runnable: Runnable) {
        runnable.run()
    }

    override fun isMainThread(): Boolean {
        return true
    }

    override fun postToMainThread(runnable: Runnable) {
        runnable.run()
    }
}
```

beforeEachTestでExecutorを差し替え、終わったらafterEachTestでnullに差し替える

``` kotlin
object HogeViewModelTest : Spek({

    beforeEachTest {
        ArchTaskExecutor.getInstance().setDelegate(TestArchTaskExecutor())
    }
    afterEachTest {
        ArchTaskExecutor.getInstance().setDelegate(null)
    }

    Feature("機能") {
        Scenario("シナリオ") {
            lateinit var viewModel: HogeViewModel

            val observer = mockk<Observer<Int>>()

            Given("ViewModelの生成") {
                viewModel = createViewModel()
                viewModel.action.observeForever(observer)
            }

            When("なんかすると") {
                viewModel.onClick()
            }

            Then("値が変わる") {
                verify {
                     observer.onChanged(1)
                }
            }
        }

})
```
WindowsのIME切替をMACっぽく

### はじめに
長らくWindowsユーザーでしたが、MACの方が何かと便利そうだったので、自宅PCをMACに変えました。
IME切替はMACの方が断然楽だと感じ始めると、仕事で使うWindowsの半角/全角キーがめっちゃ面倒に感じるようになりました。
あと、こんがらがってミスタイプしたりする。
IMEのオンオフ切替を[無変換][変換]キーに割り当てるようにしたのでメモっておきます。

### Windows10ではその内変わるっぽい
http://www.itmedia.co.jp/news/articles/1812/26/news094.html
にある通り、その内変わるっぽいです。
ので、そこまで待てないよ！な人向け。

### やり方
1. タスクバーにあるIMEのところが画像の状態になっていることを確認する
![1.png](https://qiita-image-store.s3.amazonaws.com/0/199815/2ce14a78-c93e-0de4-a621-e1783a19eb96.png)

1. このように[×]になっている場合、メモ帳などを開いて、文字入力状態にすると出てきます
![0.png](https://qiita-image-store.s3.amazonaws.com/0/199815/fc6fbbf2-dc4a-0acd-cc6a-12579af79f8d.png)

1. タスクバーにあるIMEのところを右クリック
![1.png](https://qiita-image-store.s3.amazonaws.com/0/199815/2ce14a78-c93e-0de4-a621-e1783a19eb96.png)

1. [プロパティ]を選ぶ
![2.png](https://qiita-image-store.s3.amazonaws.com/0/199815/05033a63-82fb-7b66-3806-e5a8e5e486ab.png)

1. [Microsoft IMEの設定]が開くので、左下の[詳細設定]を選ぶ
![3.png](https://qiita-image-store.s3.amazonaws.com/0/199815/270c267f-03f4-cf45-a62b-b2979f640127.png)

1. [Microsoft IME の詳細設定]が開くので、[全般]タブを選び、[編集操作]の[変更]を選ぶ
![4.png](https://qiita-image-store.s3.amazonaws.com/0/199815/59c5d045-a1bd-9dc5-04f6-b375bafc1200.png)

1. [設定]が開く
![5.png](https://qiita-image-store.s3.amazonaws.com/0/199815/0ba6b0ed-38af-a30f-51b0-92546df6115b.png)

1. [*キー]列で[無変換]の行の各割当てをダブルクリックする
この画像では[入力/変換済み文字なし]時の割当てを変更しています。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/199815/b1df66ea-f1aa-2e19-245c-c90cb92e447d.png)

1. [機能選択]が開くので[IME-オフ]を選び、[OK]を選ぶ
![7.png](https://qiita-image-store.s3.amazonaws.com/0/199815/07cb5490-5d52-e31f-cffa-ed1067972a69.png)

1. [変換]キーも同様に[IME-オン]を選ぶ


### まとめ的な
以上で[無変換][変換]キーでIMEの切替が出来るようになります。
半角/全角キーで[IME-オン/オフ]が割り当てられているのが[入力/変換済み文字なし]のみになっていたので、合わせていますが、お好みで他のタイミングでもIME-オンやオフを割り当てておいても良いかもしれません。


### 参考記事
GoogleIME
https://freelifetech.com/ime-with-henkankey/
MicrosoftIME・ATOK
https://weekly.ascii.jp/elem/000/000/188/188160/

仕事ではMicrosoftIMEを使っていて、かつ後者URLの流れで出てこなかったのでここでまとめました。
dimとdimnamesとnames(dim())とnames(dimnames())

ある3×4の行列Aがあったとする。

```R
A <- matrix(runif(3*4), 3, 4)
```

dimはこの行列のサイズを返す。

```R
dim(A)
# [1] 3 4
```

dimnamesはこの行列の行名、列名を一度に設定する。

```R
dimnames(A) <- list(
	X=paste0("x", 1:3),
	Y=paste0("y", 1:4))
```

これにより、dimnames(A)で、該当する情報が返ってくるようになる。

```R
dimnames(A)
# $X
# [1] "x1" "x2" "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
```

後から部分的に、名前を変えることもできる。

```R
dimnames(A)$X[1] <- "xx1"
dimnames(A)
# $X
# [1] "xx1" "x2"  "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
```

このXやYの部分のような、行・列全体に対する名前は、names(dimnames(A))でとってこれる。

```R
names(dimnames(A))
# [1] "X" "Y"
```

ところで、このような名前を、dimのほうで登録しておくこともできる。
このような情報は、names(dimnames(A))とは別の箇所に記述されるらしい。
どちらか書き換えても、変更が連動したりもしない。

```R
# 最初は何も書かれていない
names(dim(A))
# NULL

names(dim(A)) <- c("X", "Y")
dim(A)
# X Y
# 3 4
names(dim(A))
[1] "X" "Y"
```

あとから書き換えることも可能。

```R
names(dim(A))[1] <- "J"
names(dim(A))
# [1] "J" "Y"
```



もっと高次元配列でも同様に考える。
例えば、3×4×5の3次元配列B（テンソル）があったとする。

```R
B <- array(runif(3*4*5), dim=c(3,4,5))
```

dimはこのテンソルのサイズを返す。

```R
dim(B)
# [1] 3 4 5
```

dimnamesはこのテンソルのオーダーごとの名前を一度に設定する。

```R
dimnames(B) <- list(
	X=paste0("x", 1:3),
	Y=paste0("y", 1:4),
        Z=paste0("z", 1:5))
```

これにより、dimnames(B)で、該当する情報が返ってくるようになる。

```R
dimnames(B)
# $X
# [1] "x1" "x2" "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
#
# $Z
# [1] "z1" "z2" "z3" "z4" "z5"
```

後から部分的に、名前を変えることもできる。

```R
dimnames(B)$X[1] <- "xx1"
dimnames(B)
# $X
# [1] "xx1" "x2"  "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
#
# $Z
# [1] "z1" "z2" "z3" "z4" "z5"
```

このX、Y、Zのような、モード全体に対する名前は、names(dimnames(B))でとってこれる。

```R
names(dimnames(B))
# [1] "X" "Y" "Z"
```

dimのほうでもモードの名前を登録しておくこともできる。
テンソルの場合でも、このような情報は、names(dimnames())とは別の箇所に記述されるらしい。

```R
# 最初は何も書かれていない
names(dim(B))
# NULL

names(dim(B)) <- c("X", "Y", "Z")
dim(B)
# X Y Z
# 3 4 5
names(dim(B))
[1] "X" "Y" "Z"
```

あとから書き換えることも可能。

```R
names(dim(B))[1] <- "J"
names(dim(B))
# [1] "J" "Y" "Z"
```
awsコマンドが壊れた

# 背景
MacでHomebrewを使っていると、pythonパッケージでインストールされるPythonのバージョンが2になったり3になったりします。

- [3月1日、Homebrew のデフォルトの Python が Python 3 になります。 - methaneのブログ](https://methane.hatenablog.jp/entry/2018/02/28/3%E6%9C%881%E6%97%A5%E3%80%81Homebrew_%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE_Python_%E3%81%8C_Python_3_%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
- [Homebrewでインストールされる/usr/local/bin/pythonが再びPython2に変更](https://rcmdnk.com/blog/2018/03/10/computer-mac-homebrew-python/)

この変化の前後のタイミングで[awsコマンド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html)をインストールしていると、awsコマンドが壊れることがあります。この時

```sh
dyld: Library not loaded: @executable_path/..
```

で始まるエラーが起きます。

# How to fix

手動で再インストールします。
古いバージョンを消し、[macOS で AWS Command Line Interface をインストールする - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html)を参考にして再インストールします。

## アンイストール
```sh
~ which aws
/usr/local/bin/aws
~ ls -ls /usr/local/bin/aws
0 lrwxr-xr-x  1 root  wheel  22  2  5 22:25 /usr/local/bin/aws -> /usr/local/aws/bin/aws
```

awsコマンドは`/usr/local/aws`にインストールされています。これを削除します。

```sh
sudo rm -rf /usr/local/aws
```

## 再インストール

あとはドキュメントの指示通り`awscli-bundle.zip`をダウンロードしてインストールします。

### 補足
まれに前回インストール時に`awscli-bundle.zip`を解凍した`awscli-bundle`ディレクトリが残っていることがあります。このディレクトリ内には、前回使った古いパッケージファイルが残っています。`awscli-bundle`ディレクトリがある場合は、`awscli-bundle.zip`を解凍する前に消します。

```sh
rm -rf awscli-bundle/
```
ffmpegでAMD GPUを使ったエンコード

# ffmpegコマンド（AMD GPU使用）

```ruby:h264
ffmpeg -i videoin.mp4 -vcodec h264_amf -b 102400k -quality quality -acodec copy videoout.mp4

```
```ruby:h265(hevc)
ffmpeg -i videoin.mp4 -vcodec hevc_amf -b 102400k -quality quality -acodec copy videoout.mkv

```
純粋にビデオエンコード時間の比較をしたかったために
オーディオはコピーにしています。

コーデック末尾に_amf追加することにより
AMD GPUでのエンコードになります。

詳細は
[ffmpegでAMD GPUを使ったエンコード：詳細版](https://instanttry.com/2019/05/17/post-338/)で紹介しています。
MacでOpenPose（tf-pose-estimation）のHelloWorldをしました

# 目的
ポーズ推定をMacで試します。

# 前提
ポーズ推定と言えばOpenPoseがまず浮かんだのでそれを試そうと思いました。結果的に試すことができました。
特筆する内容はありませんが、公式ページを上から追っただけだと少しひかっかったので、自分が後にやろうとしてまた忘れてひっかかると思うのでメモします。
またvirtualenvを使っている部分については、公式のInstallのセクションにはないように必要ではないです。

# 環境
macOS High Sierra 10.13.6
python 3.6.5

# 時期
2019.02.06

# 手順
作業用ディレクトリを作ります

```shellshell:
$ mkdir tf-pose-estimation-test
$ cd tf-pose-estimation-test
```

仮想環境を作り、起動します

```shell:
$ virtualenv --system-site-packages -p -python3 testenv
$ source testenv/bin/activate
```

tf-pose-estimationのリポジトリをcloneします

```shell:
$ git clone https://www.github.com/ildoonet/tf-pose-estimation
```

```shell:
$ cd tf-pose-estimation
```

必要なモジュールをインストールします

```shell:
$ pip3 install -r requirements.txt
```

ポストプロセス用のC++ライブラリをビルドします

```shell:
$ cd tf_pose/pafprocess
$ swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace
```

```shell:
$ cd ../..
```

Tensorflowグラフファイルをダウンロードします

```shell:
$ cd models/graph/cmu
$ bash download.sh
```

テスト実行します

```shell:
$ cd ../../..
```

```
$ python -c 'import tf_pose; tf_pose.infer(image="./images/p1.jpg")'
```

不足しているとエラーが出たものを適宜入れます

```
$ pip3 install opencv-python
$ pip3 install tensorflow
```

テスト実行します

```
$ python -c 'import tf_pose; tf_pose.infer(image="./images/p1.jpg")'
```

![a.png](https://qiita-image-store.s3.amazonaws.com/0/16283/962fd534-0640-bb44-0363-d6a3c859e6aa.png)

実行できました。

# 補足

他にも環境面でいくつかつまづいたことがあって

## XCodeのコマンドラインツールが入っていなかった

入れました

## TensorFlowのインストールでこけた

```
$ pip3 install tensorflow
```

のところでこんなエラーが出たので

```
Collecting tensorflow
  Could not find a version that satisfies the requirement tensorflow (from versions: )
No matching distribution found for tensorflow
```

はじめはpython 3.7.xがインストール済みだったんですが、調べると下記参考サイトのようにまだ3.7.xに対応してないようで。

Tensorflowがインストール出来ない症状を解決する方法（Python 3.7.0） - Qiita
https://qiita.com/locktki/items/abb04846f2251f357650

【対処法】Python3.7ではTensorFlowを利用できない..?
https://pycarnival.com/tensorflow_python37/

3.7から3.6にするのにはインストールには以下あたりを参考にした気がします。

macOSでPythonをHomebrewでインストールしている場合にPython 3.6 系を使う方法 - Qiita
https://qiita.com/Ryuichirou/items/44a45170c1b2781367f8

3.6.5にダウンバージョンしたら動きました。

# 参考

GitHub - ildoonet/tf-pose-estimation: Deep Pose Estimation implemented using Tensorflow with Custom Architectures for fast inference. 
https://github.com/ildoonet/tf-pose-estimation

Openposeのインストール(mac) - Qiita 
https://qiita.com/piyopiyohiyoko/items/a9220c3b2f0e75e1a460
Slim x Twigでdumpを実行するには

# 概要
SlimのテンプレートエンジンにTwigを使っている場合にはデフォルトのままでは**dump()**は無効になっている。有効にするためにはTwigの公式の記述方法では駄目なため調査した結果を残しておく。

# 現象
設定せずに実行しようとすると下記のエラーが表示されます。

```html
Type: Twig_Error_Syntax
Message: Unknown "dump" function.
File: 〜index.html
```

# 方法
## debugの有効化
Twigをコンテナに追加しているところで下記のように設定を追加する。

```php

$container['view'] = function ($container) {
    $view = new \Slim\Views\Twig('../templates', [
        'cache' => false,
        'debug' => true,                               //追加
    ]);

    $view->addExtension(new Twig_Extension_Debug());   //追加

    return $view;
};

```

## dumpの利用方法
テンプレートファイルに以下の記述を追加することで表示される。
`<pre>`タグでくくると見やすく表示される。

```php:全て表示する
<pre>{{ dump() }}</pre>
```

```php:指定したものの表示(eはview->renderで指定したパラメータ名)
<pre>{{ dump(e) }}</pre>
```

## 番外編
フレームワークの制約などで手軽に設定できない場合にこんな方法もあると紹介されてました。

```php:(eはview->renderで指定したパラメータ名)
{{ e|json_encode() }}
```

# 参考
[カイワレの大冒険 Third](http://blog.masudak.net/entry/2016/07/07/230940)
WSL（Ubuntu18.04)にPowerShell Coreをインストール

# Windows Subsystem for LinuxにPowerShell Coreをインストールしてみた
時の、備忘録。

```
# Import the public repository GPG keys
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
 
# Register the Microsoft Ubuntu repository
sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/16.04/prod.list
 
# Update the list of products
sudo -E apt-get update
 
# Install PowerShell
sudo -E apt-get install -y powershell
```

※sudoに「-E」オプションがあるのは、ログインユーザーの環境変数(proxyの設定)を読み込ませるため。
Javascript 0から1 ～最初の一歩～

せっかく業務でJavascript
を触っているので自分の記事にして
まずはひとりごとから
普段知ったことやつまづきを
もくもくと外に吐き出そうかなと(^^♪
##～Hello World! まで
まずは、やった感が一番わかりやすい
画面に描画するところまで！
準備するのは 
○○.html
○○.js
○○.css
の3つ！
テキストを作成して拡張子を変更するだけでサクッと作成できますね(^^)

続いて,○○.htmlを編集します。
ダブルクリックでブラウザで開いちゃう場合は、右クリックから「編集」で

開いたら

```html:greeting.html
<script>
    alert("Hello world!!");
</script>
```
を記入して保存っ！！

○○.html
をブラウザから開いてみると


完←

##.js と.cssの活用

まぁこんだけシンプルな処理であれば、HTMLファイルだけでも完成でもいいのかもしれませんが、スクリプトの処理と見た目の設定と、表示する内容と...と一つに記載してしまうと、

どこかを修正時に必ずそのファイル更新されるため、直接関連のないタグまで差分確認やテストの対象となりかねない。
→役割別に分割していた方が管理しやすく修正もしやすい

HTMLだけではなくJavascript,CSSを活用して
役割分担すると複雑な処理を組む時に煩雑にならないし、何より実装を進めてからの修正しやすい！！
HTML,Javascript,CSS　の役割は

- HTML：画面の描画内容
- Javascript：処理全般
- CSS：画面のデザイン（動作や見た目）

HTMLでいう
```'<script>' 　Javascript
'<○○ style="">' → CSS ```
に引っ越しするイメージに近い


例として簡単なコードを用意

```html:greeting.html
<!DOCTYPE html>
<html>
<head>
<title>サンプル</title>
<script>
   var i = "2018/02/06";
   alert("Hello world!!" + i);
</script>
</head>
<body>
<div id="T1"></div>
</body>
</html>
``` 

このソースを↓に分解して

```html:greeting.html
<!DOCTYPE html>
<html>
<head>
<title>サンプル</title>
</head>
<body>
<div id="T1" style="red">挨拶をしましょう</div>
</body>
</html>
``` 

```js:greeting.js
   var i = "2018/02/06";
   alert("Hello world!!" + i);
```
```css:greeting.css
   body #T1{
       font-color:"red";
   }
```

といった記述が可能です。
第一歩はこれで終了。
どんどん投稿していきます。
Node.js v11.9.0リリースノート

https://nodejs.org/en/blog/release/v11.9.0/

# deps
- OpenSSL has been updated to 1.1.1a, which is API/ABI compatible with the previous OpenSSL 1.1.0j. Note that while OpenSSL 1.1.1a supports TLS1.3, Node.js still does not.
    - OpenSSLが1.1.0jから1.1.1aに更新
        - 1.1.1aはTLS1.3をサポートしているが、Nodejsはまだサポートしていない。
ArduinoIDE1.8.8をwindowsPCにインストールしてみた

#ArduinoIDE1.8.8をwindowsPCにインストールしてみた

まず、以下のサイトへアクセスする
https://www.arduino.cc/en/main/software


![IDE.png](https://qiita-image-store.s3.amazonaws.com/0/355420/f0d02bc9-9baf-9d44-df36-6562c5b56079.png)


windows7なのでWindows Installer, for Windows XP and up を選ぶ
![2.png](https://qiita-image-store.s3.amazonaws.com/0/355420/c46a7b98-d1c2-4995-b03d-4e9e14780e9e.png)


寄付を募る画面に遷移するので、お布施する気がないならJUST DOWNLOAD を選ぶ

DLの終了後インストールが始まる

今日はここまで
【Rails】「テーブルのカラムに定義するNot Null制約」と「モデルに定義するバリデーション（presence: true）」の挙動の違い。

Railsの勉強をしていてハマったのでメモ。

あるテーブルのカラムについて、マイグレーションファイル自体に「null: false」を記入してNotNull制約をする場合と、モデル自体に「validates :カラム名, presence: true」としてnull不許可をする場合、挙動に違いがあります。

「どちらも値にnilが入らないんでしょ？　同じじゃん。」と思いがちですが、たとえば拒否できるデータ構造が異なっており、前者では「空文字（"")」を拒否することが出来ません。


以下でその挙動について詳しくみていきます。


前者の場合（testsテーブルのtitleカラムにNotNull制約を付与)

```ruby:migration.rb
class CreateTests < ActiveRecord::Migration[5.2]
  def change
    create_table :tests do |t|
      t.string :title, null: false

      t.timestamps
    end
  end
end
```
このマイグレーションファイルをbin/rails db:migrateしたあと、Railsコンソールにてnilを保存しようとすると、以下のように弾かれます。

```pry:
irb(main):001:0> Test.new(title: nil).save
（中略）
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR:  null value in column "title" violates not-null constraint)
```


これは想像通りの挙動ですね。
ただし、以下のように「空文字("")」でsaveしたとき、保存できてしまいます。



```pry:
irb(main):001:0> Test.new(title: "").save
   (0.3ms)  BEGIN
  Test Create (0.6ms)  INSERT INTO "tests" ("title", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" \
[["title", ""], ["created_at", "2019-02-05 10:02:31.263051"], ["updated_at", "2019-02-05 10:02:31.263051"]]
   (0.8ms)  COMMIT
=> true
```

NotNull制約したのに！


ここがポイントで、バリデーションでnull不許可した場合は、空文字も拒否することができます。

```ruby:model.rb
class Test < ApplicationRecord
  validates :title, presence: true
end
```

```pry:
irb(main):001:0> test = Test.new(title: "")
irb(main):002:0> test.save
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
=> false
```

これで安心ですね。
また、バリデージョンに基づいて保存に失敗した場合、このtestインスタンスにはバリデーションに基づいたエラー情報が入力されます。

```pry:
irb(main):003:0> test.errors
=> #<ActiveModel::Errors:0x00007f9734965cf8 \
@base=#<Test id: nil, title: "", created_at: nil,  updated_at: nil>, \ 
@messages={:title=>["を入力してください"], @details={:title=>[{:error=>:blank}]}>
```
@messages変数と、@details変数に情報が入ってますね。
(rails-i18nにより日本語化済み)

これは以下のようにして配列の形で取り出したり出来ます。

```pry:
irb(main):004:0> test.errors.full_messages
=> ["titleを入力してください"]
```

バリデーションでのエラーの方が特殊な挙動をしますが、情報を取り出せるので便利です。


# まとめ
・テーブルのカラムに定義するNotNull制約はnilは拒否するが、空文字は拒否しない。
・モデルに定義するバリデージョンでのnull不許可(presence: true)は、nilも空文字も拒否する。そして、拒否したときに（saveに失敗したときに）インスタンスの@messages変数と@details変数の中に定義したバリデーションに基づいた拒否理由を返す。
・nullを許可したくない場合は、ひとまずテーブルもモデルもnull不許可にしておくのがよさそう。
プロキシエディタ/セキュリティプロキシ/ローカルプロキシの簡単な設定 index

# Index

- [プロキシの基本的なトラップの仕方](https://qiita.com/tomoki0sanaki/items/6001d6e2c7d263919c9b)
- [プロキシのタンデム化の仕方(プロキシチェイン)](https://qiita.com/tomoki0sanaki/items/696d14496605f5c6a10b)
- [プロキシの既定のポート](https://qiita.com/tomoki0sanaki/items/633e8a688eabd80bf9e1)
- [プロキシの証明書を信用させる](https://qiita.com/tomoki0sanaki/items/757eb64dd713e35fd9ff)
- [プロキシでの User-Agent の変更](https://qiita.com/tomoki0sanaki/items/533693bf696a580a8835)
- [プロキシのクライアント証明書の指定](https://qiita.com/tomoki0sanaki/items/61b76dc36ac31a10e4e6)

# プロキシを便利に使うための補助ツール

[sSwitchForwarder.exe Manual](https://qiita.com/tomoki0sanaki/items/c62aa67a8102f18b779a)

# 自作プロキシを紹介

[sWebTool Manuals index](https://qiita.com/tomoki0sanaki/items/b8f571ae296a32f7b434)

# 以上
IntelliJでScalaコンパイルをちょっとだけ早くする方法

本当にちょっとした技（という程ではない）ですが、Syntaxハイライト・コードチェック等を一時的に無効にすることでCPUの負荷を下げる→コンパイル速度が上がるっていうだけのことです。

- IntelliJの右下のおじさんアイコンをクリック

<img width="200" alt="スクリーンショット 2019-02-06 10.11.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/33482/a792ee3a-1434-6704-24da-f61e6c06cd30.png">

- PowerSaveModeにチェックを入れる

<img width="330" alt="スクリーンショット 2019-02-06 10.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/33482/21fa8267-ae91-ca04-589e-d2e9f490a418.png">

とすると、Syntaxハイライト・コードチェック効かなくなります。
`体感的` にコンパイル速度若干速くなったりファンが回らなくなったりしました。
JetBrain系の他製品でも同様の機能付いていると思われます。（RubyMineにはありました。）
複数の PDF ファイルを、n-up の条件を変えて結合

#目的
もともとは、1つ目のPDFファイルを1-up で、2つ目のPDFファイルを4-upで出力すること。
応用すると、いろいろなパターンに対応できる。
対象環境はLinux。

#やり方
1. Linuxに予めpdfnupとgs (ghostscript)を入れておく。
1. ファイル毎にpdfnupで、n-up化しておく。
例えば、2x3の6-upにするコマンドの例は、
```
pdfnup --nup 2x3 --suffix 'nup' --frame true target1.pdf
```
等。
1. N-up化したファイルを含め結合したいPDFをgsで結合する。
target0.pdfはそのまま、target1.pdfとtarget2.pdfはn-up化したものをつなげるコマンドの例は、
```
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf target0.pdf target1-nup.pdf target2-nup.pdf
```
等。

#応用
1つのファイルのPDFにおいて、ページ単位でn-upを変更したいなら、ghostscript等でPDFをページ単位でばらしてから、上記方法で再結合すればよい。
PDFのばらし方は、 https://srad.jp/~geln12/journal/542158/ 等で紹介されている模様。
Webフォントを作ってみた

# SVGファイルを用意する
SVGファイルはテキストなのでメモ帳で直書きすることもできるしツールを使ってもいい。
今回はJavaScriptで作ってみた。

[save_svg.html](http://www.maroon.dti.ne.jp/lance/js/svg/save_svg.html) (Chrome Only)
出力したSVGファイルを基に0.svg～9.svgをメモ帳で作る。

```xml:1.svg
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="400">
<g fill="black">
<rect x="150" y="75" width="25" height="100"></rect>
<rect x="150" y="225" width="25" height="100"></rect>
</g>
</svg>
```

```xml:4.svg
<svg width="160" height="320" xmlns="http://www.w3.org/2000/svg">
<g fill="black">
<polygon points="120,70 140,50 140,160, 120,150"></polygon>
<polygon points="120,170 140,160 140,270, 120,250"></polygon>
<polygon points="20,50 40,70 40,150, 20,160"></polygon>
<polygon points="20,160 40,150 120,150 140,160 120,170, 40,170"></polygon>
</g>
</svg>
```

# WOFFに変換する
[IcoMoon](https://icomoon.io/)を利用してSVGファイルをWOFFに変換する。
右上の「IcoMoon App」をクリックする。

![webfont1.png](https://qiita-image-store.s3.amazonaws.com/0/257554/00e20e10-ebd3-1563-23af-08172eb49d18.png)
左上の「Import Icons」をクリックし、0.svg～9.svgを選択する。
Untitled Setにインポートされた10個の画像を選択する。
右下の「Generate Font」をクリックする。

![webfont2.png](https://qiita-image-store.s3.amazonaws.com/0/257554/84f44818-f1f4-96c0-ef18-bb55e9950b49.png)
16進の文字コード30～39を入力する。
右下の「Download」をクリックするとicomoon.zipファイルが出力される。

# 使ってみる
icomoon.zip内のfonts\icomoon.woffを使ったサンプル。
[7seg_clock.html](http://www.maroon.dti.ne.jp/lance/js/charcode/7seg_clock.html)
[7seg_clock2.html](http://www.maroon.dti.ne.jp/lance/js/charcode/7seg_clock2.html)

# 参考
[自作のWEBアイコンフォントの作り方（無料ツールのみでfeedlyフォントを作る）]
(https://nelog.jp/feedly-web-iconic-font)
pipでAttributeError: _versionが出たときの対応

気がつけば`pip install`や`pip freeze`でエラーが出るようになったので対応した。

- pip 19.0.1
- Python 3.6.6

エラーは以下の通り。

```shell
$ pip freeze
Exception:
Traceback (most recent call last):
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2584, in version
    return self._version
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2691, in __getattr__
    raise AttributeError(attr)
AttributeError: _version

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_internal/cli/base_command.py", line 176, in main
    status = self.run(options, args)
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_internal/commands/freeze.py", line 93, in run
    for line in freeze(**freeze_kwargs):
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_internal/operations/freeze.py", line 62, in freeze
    req = FrozenRequirement.from_dist(dist)
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_internal/operations/freeze.py", line 239, in from_dist
    req = dist.as_requirement()
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2716, in as_requirement
    if isinstance(self.parsed_version, packaging.version.Version):
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2551, in parsed_version
    self._parsed_version = parse_version(self.version)
  File "/Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2589, in version
    raise ValueError(tmpl % self.PKG_INFO, self)
ValueError: ("Missing 'Version:' header and/or METADATA file", Unknown [unknown version] (/Users/yag_ays/.pyenv/versions/3.6.6/envs/main/lib/python3.6/site-packages))
```

調べてみると、どうやら`-`から始まるディレクトリが生成されているとエラーが出るようだ。

[pip19\.0\.1 list error"AttributeError: \_version" · Issue \#6194 · pypa/pip](https://github.com/pypa/pip/issues/6194)

実際に上記のログを元にpyenvのsite-packagesに行くと、謎の`-umpy`というディレクトリが存在した。おそらくNumpyをインストール/アップデートするときに生じたゴミと思われる。

```shell
$ cd /Users/yag_ays/.pyenv/versions/main/lib/python3.6/site-packages
$ ls 
total 19112
drwxr-xr-x    3 yag_ays  Users       96  1 24 11:33 -umpy
drwxr-xr-x    3 yag_ays  Users       96  1 24 11:33 -umpy-1.15.1.dist-info
[...]
```

なので、これを別名に書き換えることで解決。

```shell
# ハイフンから始まるファイルを別名に置き換える
$ mv ./-umpy umpy
$ mv ./-umpy-1.15.1.dist-info/ umpy-1.15.1.dist-info
```

```
$ pip freeze
absl-py==0.5.0
aiofiles==0.4.0
alabaster==0.7.12
[...]
```
Vue.js で contenteditable を v-model 風に使う

Vue.js でとても便利な `v-model` ですが `contenteditable` な要素では使えません。 `v-model` は内部的には `v-bind:value` と `v-on:input` をまとめてやってくれているからです。つまり `input` 要素じゃない `contenteditable` では効かないという感じです。

そこで自前でイベントを使って雑に書くとこんな風に書いてしまいますが、これには問題があります。入力するたびにキャレットが文字列の先頭に飛んでしまいます。これは `v-text` が更新されるため自身も render が走ってしまうのが原因です。かといって `v-once` を付けてしまうと、今度は自身を変更するすべがなくなってしまいます。

```vue
<template>
  <div>
    <div contenteditable="true" v-text="content" @input="sync"></div>
    <div>{{ content }}</div>
  </div>
</template>

<script>
import Vue from 'vue'

export default Vue.extend({
  name: 'HelloWorld',
  data () {
    return {
      content: 'sample text'
    }
  },
  methods: {
    sync (e) {
      this.content = e.target.innerText
    }
  }
})
</script>
```

回避方法は至って単純で、もう一つ `contenteditable` 用の変数を用意すること。

```vue
<template>
  <div class="hello">
    <div contenteditable="true" v-text="innerContent" @input="sync"></div>
    <div v-html="content"></div>
  </div>
</template>

<script>
import Vue from 'vue'

export default Vue.extend({
  name: 'HelloWorld',
  data () {
    return {
      innerContent: '',
      content: 'sample text'
    }
  },
  methods: {
    sync (e) {
      this.content = e.target.innerHTML
    }
  },
  mounted() {
    this.innerContent = this.content
  }
})
</script>
```

ついでにコンポーネントにしておきます。

```vue
<template>
    <div contenteditable="true" v-text="innerContent" @input="sync"></div>
</template>

<script>
import Vue from 'vue'

export default Vue.extend({
  name: 'Editor',
  props: ['content'],
  data () {
    return {
      innerContent: ''
    }
  },
  methods: {
    sync (e) {
      this.$emit('update', e.target.innerHTML)
    }
  },
  mounted() {
    this.innerContent = this.content
  }
})
</script>
```

```vue
<template>
  <div class="hello">
    <editor :content="content" @update="sync"></editor>
    <div v-html="content"></div>
  </div>
</template>

<script>
import Vue from 'vue'
import Editor from './Editor'

export default Vue.extend({
  name: 'HelloWorld',
  components: {
    Editor
  },
  data () {
    return {
      content: 'sample text'
    }
  },
  methods: {
    sync (content) {
      this.content = content
    }
  }
})
</script>
```

雑なサンプルですが、こんな感じで `contenteditable` で `v-model` っぽいデータの同期ができます。
OSSコントリビュートは案外簡単だよ、という話


[OSS コントリビュートをなかなか始められなかった頃の自分に伝えたいこと](https://qiita.com/gotchane/items/bbaef0d08eebdb82a344)

という記事を読みました。

小さな貢献であればオープンソースへの貢献は意外と簡単です。

その言語の知識やライブラリーの使用経験がまったくなくてもできることがあります。

私も小さな貢献がいくつかあるので書いてみたいと思います。

# Lispのライブラリーを直した話

メインのエディターはSpacemacsを使っています。いつものようにSpacemacsのプラグインをアップデートして再起動したらエラーが。どうもプラグインの一つがバグってるみたいです。

私はLispはさっぱりわかりません。さてどうしたものか・・・。ソースコードを開いてよくよく見てみました。

どうもカッコが一つ足りないようです。これならわかる。カッコを付け足すと動きました。

![blacken-fix.png](https://qiita-image-store.s3.amazonaws.com/0/52613/a561cd5f-a6d1-15ee-e04e-8de272947b8d.png)

んで[プルリク](https://github.com/proofit404/blacken/pull/13)。

![blacken-fix2.png](https://qiita-image-store.s3.amazonaws.com/0/52613/e549f26a-1c1a-a416-8196-779e64b1b808.png)

俺「なんか動かなかったよ。カッコつけたら治った。Lispわかんないけどエラー無しで動いてるよ」

作者1「ありがと!ナイスキャッチ!」

作者2「コードをGithub上で治すもんじゃないね・・ありがとう。」

# ドキュメントを直した話 その1

pythonにDaskというライブラリーがあります。全く使ったことがないのですが使えないかと思ってドキュメントを読んでました。

「read_sql_table」という関数の説明をしてる箇所で、コード例はなぜか「read_sql」になっていました。

エイリアスかなんかでしょうか?でもなんかおかしいです。

[直して](https://github.com/dask/dask/pull/4114/files)

![dask-fix1.png](https://qiita-image-store.s3.amazonaws.com/0/52613/bc361370-56f1-a770-7cf1-d0893df9f69d.png)

[プルリク](https://github.com/dask/dask/pull/4114)
![dask-fix2.png](https://qiita-image-store.s3.amazonaws.com/0/52613/90788df6-d4cd-027f-6ca7-cd5a602ef7a5.png)



# ドキュメントを直した話 その2

rustのあるライブラリーのドキュメントを読んでました。

rustはThe Bookを半分ぐらい終わったところです。ほとんど使ったことはありません。

へー、これってこんなことするためのものなのね。と思ってたらおや?

タイポが・・・

[直して](https://github.com/TeXitoi/structopt/commit/444c57833cbf0debbc7721f3694bc03631ed39dc)

![structoptfix.png](https://qiita-image-store.s3.amazonaws.com/0/52613/ed17a92e-8599-88b9-9011-5dc8999519ea.png)

[プルリク](https://github.com/TeXitoi/structopt/pull/159)

![structoptfix2.png](https://qiita-image-store.s3.amazonaws.com/0/52613/239e465d-dfa2-c792-e356-4e186ccfed0c.png)



# おわりに

OSSといっても人間が作るもんですのでどこかしら間違いがあります。
ほんのちょっとでもこうやって貢献できると嬉しいですね。
Win10のログイン画面を壁紙フォルダにコピーして，壁紙として使う

似たようなことをしている記事（[Windows10のロック画面の画像がキレイだから壁紙のスライドショーにしたいと思った \- Qiita](https://qiita.com/hsn/items/e80fcf88839ab64eba81)）もあったんだが，pythonでやりたかったので作ってみた．


# 壁紙フォルダへのリンク

まず，壁紙の入っているディレクトリへのシンボリックリンクをwallpaperという名前で作っておく．
ディレクトリのパスをコードに直接かいてもいいけど，うっかりQiitaとかにコピペする時に自分の使ってるユーザ名とか出るのは気持ち悪いので，私は通常はコードに固有名詞が入らないようにしてる．お好みで．
あと，コマンドプロンプトは管理者権限で開かないとリンクを作れないので注意．

```
mklink /D src_dir %LOCALAPPDATA%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets
```

# コード

ログイン画面の画像が消えたらこまるので，一旦複製してから拡張子をつけてリネームし，処理している．

```python
import os
import shutil
import sys
from PIL import Image

src_dir = 'src_dir'
temporal_dir = 'tmp'
dst_dir = 'wallpaper'

# scan destination directory
try:
    files = os.listdir(temporal_dir)
    print(f'{temporal_dir} exists. Do you overwrite here [Y/n]?', flush=True)
    ans = sys.stdin.readline()
    if ans[0] != 'y' and ans[0] != 'Y' and ans[0] != '\n':
        print('aborted!', flush=True)
        sys.exit()
    shutil.rmtree(temporal_dir)
    os.mkdir(temporal_dir)
except FileNotFoundError as ex:
    os.mkdir(temporal_dir)

# copy temporally
for f in os.listdir(src_dir):
    shutil.copyfile('/'.join([src_dir,f]), f'{temporal_dir}/{f}.jpg')

# size check and copy to destination
files = os.listdir(dst_dir)
with os.scandir(temporal_dir) as directory:
    for entry in directory:
        if entry.stat().st_size / 1024 < 100:  # たまにHTMLファイルも混在するので100KiB以下のファイルは除外
            continue
        with Image.open(entry.path) as img:
            w, h = img.size
        if w < 1200 or w < h:  # アイコンや小サイズ画像，縦長画像を除外
            continue
        if entry.name in files:
            continue
        shutil.move(entry.path, dst_dir)

shutil.rmtree(temporal_dir)
```
pythonのhttpサーバ(cgi)を動かしているときにコンソール上にprint結果を表示したい

Pythonの標準ライブラリであるhttp.serverを使って、簡易httpサーバを立て簡単なwebアプリを作る機会があったのですが、そのとき調べた備忘録&ちょっとした説明です。

# cgiを動かしてるコンソール上にprintしたい
プログラムを書いているとき、「あれ、なんかエラー起こしてる。変数の中身がなんかおかしい」となることがあると思います。自分は基本的にものぐさなので、適当にエラー前で怪しい変数をprintしたりしますが、cgi上で動くプログラムだとそうも行きません。
python内でhtml本文を作成しprintするプログラムだと、適当な場所でただprintしても表示されません。一手間加えてhtmlに変数を表示させるような場所を作ったところで、そもそもエラー起こしてたらhtmlが表示されないから意味がなかったり、ajax通信でデータを受け取り結果を返すプログラムだったとしても、同じく受け取り側でなんやかんや……と面倒臭い。
そんなとき、「とりあえず簡易的にでいいから、サーバのログを垂れ流し続けているコンソール上に表示させたい！」と思うこともあると思います。というかあった。そんなときは、以下のようにprint関数の引数fileを指定すればokです。

```python3
import sys
print('いろはにほ',file=sys.stderr)
a=[1,2,3,4]
print(a,a,a,file=sys.stderr)
```

```console:結果
いろはにほ
[1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4]
```

# 何やってるの？
ここから先は、とりあえずやっていることの簡単な解説です。
まず、唐突に出てきたprintの引数fileから。これは、print関数の出力ファイルを指定する引数です。指定できるのは、open()の返り値であるようなファイルオブジェクトです。なので、適当なファイルを書き込み/追記モードでopenして指定すれば、printの結果をファイルに書き込むこともできます。……素直にwriteで書き込むのと何が違うんだって話ですが。
次に、sys.stderrは標準エラー出力を指しています。まあ、読んで字のごとく「特に指定がなかった場合にエラーを出力する場所」のことです。この標準出力がコンソールを指定しているため、print関数の結果がコンソールに表示されるようになったわけです。
ちなみに、デフォルトではprintの出力場所として、sys.stdoutが指定されています。これは標準出力を指定しています。通常コンソールからプログラムを実行する場合、標準出力と標準エラー出力は、どちらも同じコンソールを指しています。なので、プログラムの実行経過や結果をprintした結果も、実行中に発生した何らかのエラーも同じコンソールへと出力されます。
しかし、サーバからプログラムを実行する場合では話が変わってきます。このとき、標準出力は通信先のクライアントへの出力（webサーバへ出力->クライアント）を指しています。なので、引数を指定しないままprintしてもコンソールには表示されませんでした。それに対し、標準エラー出力はサーバを実行中のコンソール(webサーバへ出力->コンソール)を指しています。そこで出力先を標準エラー出力に変更すると、コンソールへと表示されるように変わったわけです。



# 参考サイト

* [Python - python(cgi)でdos画面(windows)にログを出力したい｜teratail](https://teratail.com/questions/154595)
* [2. 組み込み関数 &#8212; Python 3.6.5 ドキュメント](https://docs.python.jp/3/library/functions.html#print)
* [29.1. sys — システムパラメータと関数 &#8212; Python 3.6.5 ドキュメント](https://docs.python.jp/3/library/sys.html#sys.stdin)
* [標準入力・標準出力ってなに? - Qiita](https://qiita.com/angel_p_57/items/03582181e9f7a69f8168#%E5%85%A5%E5%8A%9B%E3%81%A8%E5%87%BA%E5%8A%9B%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB)
* [CGIプログラミング(1)](http://www.rsch.tuis.ac.jp/~ohmi/sys-prog/cgi1.html)
REFPROPをpythonから呼び出す（簡易版）

[REFPROPをpythonから呼び出す@Qiita](https://qiita.com/ina111/items/632ab195bdc2b003a228)という記事を書きましたが、ビルドから始まっていて難しいように見えたようなので、Windowsからインストールした場合の簡単な使い方を書いておきます。

## インストール

REFPORPをインストーラーからインストールした場合は、以下の通りでpythonからREFPROPの関数が使えます。

```
pip install ctREFPROP
```

でctREFPROPをインストール。

pythonスクリプトファイルと同じフォルダにREFPROP64.DLLファイル、FLUIDSフォルダ、MIXTURESフォルダを置いておいて、以下を実行。

```python:sample_REFPROP.py
from ctREFPROP.ctREFPROP import REFPROPFunctionLibrary
RP = REFPROPFunctionLibrary('.')
MOLAR_BASE_SI = RP.GETENUMdll(0, "MOLAR BASE SI").iEnum
MASS_BASE_SI = RP.GETENUMdll(0, "MASS BASE SI").iEnum

# 水の大気圧での沸点[K]
p_Pa = 101325
Q = 0.0
r = RP.REFPROPdll("Water","PQ","T",MOLAR_BASE_SI,0,0,p_Pa,Q,[1.0])
print(r.Output[0])

# メタンの大気圧下沸点近辺での液相の密度[kg/m3]
t_K = 111
p_Pa = 101325
r = RP.REFPROPdll("METHANE","TP","D",MASS_BASE_SI,0,0,t_K,p_Pa,[1.0]) 
print(r.Output[0])
```

## さらなる詳細
一番参考になるのは公式ドキュメントです。
https://pages.nist.gov/REFPROP-docs/
https://trc.nist.gov/refprop/REFPROP.PDF

日本語でもう少し詳細＆関連リンクは以下にまとめています。
[REFPROPをpythonから呼び出す@Qiita](https://qiita.com/ina111/items/632ab195bdc2b003a228)


さらに簡単にREFPROPみたいなことがしたいときには近い機能が実装されている（と言っている）CoolpropのWebアプリを使うと値一つだけ取り出すとかは簡単です。
http://ibell.pythonanywhere.com/

## おまけ
REFPROP有料で使えない，という声も聞こえてきました．
無料で似たような機能を持つCoolPropというプログラムもあります．こちらはC++で実装されていながらpythonなどのラッパーがあります．完全に網羅するわけではないようですが，こちらで満足する人はCoolPropが良いかと思います．
http://www.coolprop.org/
Laravelでテーブル設計をやりなおしたいとき打つコマンド

日曜大工的にプログラミングをやっているのですが、DBの定義が難しく、実装しながら定義を変えたくなるときが頻繁にあります。

そんなときは、migrationファイルを変更して次のコマンド。

// 1.全テーブルドロップして
php artisan migrate:fresh
// 2.seeder実行
php artisan db:seed


2つのコマンドを一気にやりたいとき
// 1 and 2 を1コマンドで
php artisan migrate:fresh --seed

Laravel で migrate 実行時に seed も実行する
https://qiita.com/esu_eichi/items/0cf9dba2c694c8a6b099
Apache nifi のインストール

やってみたのでメモ

# 前提条件
- CentOS7
- Java8インストール済み

# 手順
1. パッケージをダウンロード

    ```
    # curl -LkvOf http://ftp.tsukuba.wide.ad.jp/software/apache/nifi/1.8.0/nifi-1.8.0-bin.tar.gz
    ```

2. 破損がないか確認 [sha256](https://www.apache.org/dist/nifi/1.8.0/nifi-1.8.0-bin.tar.gz.sha256)にハッシュ値がある

    ```
    # sha256sum nifi-1.8.0-bin.tar.gz
    11561e8d505e76af5060a8b039d7ba1ecfe966722e5b824b4d4eed60ea796071  nifi-1.8.0-bin.tar.gz
    ```

3. 展開する

    ```
    # tar zxf nifi-1.8.0-bin.tar.gz
    ```

4. パスワードを設定する

    ```
    # vi nifi-1.8.0/conf/nifi.properties
    ```
    
    ```nifi.properties
    nifi.sensitive.props.key=<password>
    ```

5. 実行用ユーザを作成する

    ```
    # useradd apache
    ```

6. サービスファイルを作成する

    ```
    # vi /usr/lib/systemd/system/nifi.service
    ```
    
    ```nifi.service
    [Unit]
    Description=Apache nifi daemon
    
    [Service]
    Type=forking
    User=apache
    Environment=JAVA_HOME=/usr/java/default
    ExecStart=/opt/nifi-1.8.0/bin/nifi.sh start
    ExecStop=/opt/nifi-1.8.0/bin/nifi.sh stop
    
    [Install]
    WantedBy=multi-user.target
    ```

7. 起動する

    ```
    # systemctl start nifi
    ```

# 参考
- [NiFi System Administrator’s Guide](https://nifi.apache.org/docs.html)
php-master-changes 2019-02-05

今日は opcache のファイルの著作権表記からの年範囲の削除、zend_parse_parameters() 関連の不要テストの削除、カスタムエラーハンドラの引数 $errcontext の削除、不要に error_reporting を設定するテストの修正、mod_php でファイル名等に php7 表記のある箇所の php 表記への修正があった！

# 2019-02-05
## dstogov: Remove copyright years.
- https://github.com/php/php-src/commit/da919a8b658bf65ff0705bc03c28c7be085d6329
- [7.4~]
- ext/opcache で、ファイル冒頭ライセンス部分の著作権表記から年範囲の記述を削除
- [前に他のとこでも消してた](https://qiita.com/sj-i/items/83631bc0e98af31ec7f1#zsuraski-remove-year-range-from-copyright-notice)奴

## nikic: Remove zpp variation tests
- https://github.com/php/php-src/commit/8bc663f43bb3f556866a2f804c422646c4da56f2
- [7.4~]
- 実質 zend_parse_parameters() の挙動を複数の関数に組み込んだ状態でテストしてるだけ、みたいなテストを大量に削除
- [internals で出てた](https://externals.io/message/103886)奴
- まだそこそこありそうらしい

## nikic: Some more test removals
- https://github.com/php/php-src/commit/b5f852a8cb22656dde4aecbfbb9d509d835eb3c5
- [7.4~]
- ↑と同様、別の修正してる時に気付いた分を消した感じ

## nikic: Remove $errcontext argument to error handlers
- https://github.com/php/php-src/commit/2f1f34952e9a0dfb3adcbec82ba69f4ac82b3a3d
- [7.2 で非推奨化](https://wiki.php.net/rfc/deprecations_php_7_2#errcontext_argument_of_error_handler) されていた [set_error_handler()](http://php.net/manual/ja/function.set-error-handler.php) のエラーハンドラの引数 $errcontext を削除

## nikic: Remove unnecessary setting of error_reporting in intl tests
- https://github.com/php/php-src/commit/480fa4225540830302d3f5d2b52c3909e6b127fb
- ext/intl で、テストの際に不要に error_reporting を設定している箇所の修正

## nikic: Remove major version from apache module
- https://github.com/php/php-src/commit/6e3600f41b95d97d11ef48f817e6389a4ee95091
- sapi/apache2handler で、ファイル名等 php7 表記のある箇所を php に修正
/users/sign_in→/sign_inのようにURLを変更したい

#動機
Railsにはdeviseという、ログイン機能を簡単に実装できる機能があります。deviseをインストールしてからrails generateでモデル作ってコントローラ、ビューを順に作成していきます。

[deviseのGitHub](https://github.com/plataformatec/devise)

便利ですが、ひとつ問題が。

サインインサインアウトの際のルーティングがusers/sign_inとかusers/sign_outとなるのが辛い。

例えばhogehoge.com/sign_inとしたいところが、hogehoge.com/users/sign_inとなります。deviseのデフォルト仕様です。

もし仮に、"sign_in"というユーザーがいたらコンフリクトしそうだから変えたいなー、ということでやっていきます。

#最初の考え
[deviseひとつで複数モデルを管理する方法](https://qiita.com/Yama-to/items/54ab4ce08e126ef7dade)
動いていたコードでは単一モデルだったので/sign_inと/users/sign_inを分けられないかなと考えましたが、そうすると本来の目的から逸れてしまっているので今回は除外です。

#実装
official docを参考に、ルーティングの記述を変えていきましょう。

[repository wiki](https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes)
[ruby doc](https://www.rubydoc.info/github/plataformatec/devise/master/ActionDispatch/Routing/Mapper%3Adevise_for)

いくつか方法があるのですが、僕がとったのはpathを空にするやり方でした

> * path: allows you to set up path name that will be used, as rails routes does.
  The following route configuration would **set up your route as /accounts instead of /users:**

https://www.rubydoc.info/github/plataformatec/devise/master/ActionDispatch/Routing/Mapper%3Adevise_for

```
 devise_for :users, path: 'accounts'
```
これを再現するとこう。accountsの部分を空にすれば、urlは/sign_inになります。

```routes.rb
Rails.application.routes.draw do
  devise_for :users, path: '', controllers: {
    sessions:           'users/sessions',
      .
      .
      .
  }
  devise_scope :user do
    get '/sign_up/complete',   to: 'users/registrations#complete'
      .
      .
      .
  end
```

#教訓
ドキュメントは常に確認しましょう
Lesson16: Try it all togetherまとめ Intro to Machine learning@Udacity

#Lesson16の概要
今までのレッスンのまとめ。
画面に機械学習の４ステップ(下記)が表示されて、今までのレッスンの位置づけが説明される。

#内容
1:データ＆解きたい課題(lesson6:Datasets and Questions)
機械学習を使う場合、解きたい課題は何かを定義できるかと、それを解くためのデータを集められるか。
-十分なデータはあるか
-課題は定義できるか
-課題にこたえるための十分/正しい特徴はあるか


2:特徴選択
選んだ機械学習アルゴリズムにあった特徴空間を見つけること。
-Exploration(lesson8?)
外れ値除去とimputation cleaning←習ったっけ？
-Creation([lesson12:feature selection](https://qiita.com/Allovertom/items/24d6d67059b3b6eb1cc5)のmaking new feature?)
人が判断する場合はどのようにするのか、考える。

-Representation([lesson11:texst learning](https://qiita.com/Allovertom/items/c1bd9a121d53c37fc63e))
テキストvectorization：テキスト分析の時の処理ね

-Transforms([lesson13:PCA](https://qiita.com/Allovertom/items/84087cd2bd502116b1bc))
PCA, ICA←ICAって習ったっけ？

-Selection([lesson12:feature selection](https://qiita.com/Allovertom/items/24d6d67059b3b6eb1cc5))
KBest, Percentile, feature elimination

-Scaling(lesson10:feature scaling)
Mean subtraction, Minway scaler, Standard scaler←どこでやったっけなー。。。

3:アルゴリズム選択(lesson5:choose your own algorithm?)
-Labeled data?/Yes
・ordered or continuous output
liner regression, lasso regression, decision tree regression, SV regression←？？
回帰系ですね。(lesson7:regressions)

・non-ordered or discrete output
dicision tree, naive bayes, SVM, ensembles, K nearest neighbors, LDA←？？, logistic regression.
(lesson2:Naive Bayes)
(Lesson3:SVM)
(Lesson4:Decision Trees)

・Labeled data?/No
K-means clustering, spectral clustering？, PCA, mixiture models/EM algorithm, outliner detection.
(lesson9:Clustering?)


-Tune your Algorithm
パラメーター, visual inspection, performance on test data, GridSerchCV
[GridSerchCV:Lesson14: Validationまとめ](https://qiita.com/Allovertom/items/1847a7fc9b1e8fca1965)思い出した。クロスバリデーションを応用して、各パラメータを振ったGridで評価してくれるんだったね。


4:評価([Lesson14: Validationまとめ](https://qiita.com/Allovertom/items/1847a7fc9b1e8fca1965))
-Validate
train test split, k-fold, visualize
-Pick metrics
SSE/r^2, precision, recall, f1 score, ROC curve←?, custom←?, bias/variance


#感想
わからない単語が結構出て来たけど、番外編で調べていきます。