OmniAICreator/Qiita-1.07M huggingface dataset:
MacOSでPHP7.2にxdebugを組み込みデバッグする

`brew php56-xdebug`が使えなくなっていたので、調べ直しました。

MacOSにははじめからapache2+php7.1がインストールされていますが、それを使った場合はうまくいきませんでした。そのため、nginx+php-fpmという組み合わせで動かします。

xdebugのインストールには、MacOSの場合pecl(pear)を使うことが推奨されていたため、そちらを利用します。

https://xdebug.org/docs/install#pecl

```sh
brew install php@7.2
pecl install xdebug
brew install nginx
```

この場合、設定ファイルは以下になります。

* php: /usr/local/etc/php/7.2/php.ini
* nginx: /usr/local/etc/nginx/nginx.conf

```/usr/local/etc/php/7.2/php.ini
zend_extension="xdebug.so"
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port="9001"
xdebug.profiler_enable=0
xdebug.profiler_output_dir="/tmp"
xdebug.max_nesting_level=1000
xdebug.idekey = "PHPSTORM"
[PHP]

...
```

1行目に大胆にも設定が追加されています。その後ろにdebugの設定を追加します。VSCodeを使った場合、リモート接続として設定しなければ動作しませんでした。

続いて、nginxで.phpをphp-fpmに流すようにします。

```/etc/nginx/etc/nginx/nginx.conf
http {
    ...
    server {
        listen       8080;
        server_name  localhost;

        location / {
            #root   html;
            root   /Users/nnyn/Documents/vscode-debug-specs/php;            
            index  index.html index.htm;
        }

        location ~ \.php$ {
            root           /Users/nnyn/Documents/vscode-debug-specs/php;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
```

これらをサービスとして起動します。

```sh
brew services start php@7.2
brew services start nginx
```

ログは以下に出力されます。

* php: /usr/local/var/log/php-fpm.log
* nginx: /usr/local/var/log/nginx/

phpinfo.php を置いて、http://localhost:8080/ にアクセスします。

```php:phpinfo.php
<?php phpinfo(); ?>
```

xdebugの項目があれば正しくxdebugが組み込まれています。

<img width="1052" alt="Screen Shot 2018-07-28 at 16.26.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/3413/c6b2d465-cf12-00ca-8677-96af3bd5c7a5.png">

あとは、VSCodeなど自分のエディタでデバッグ！

### つまずいたところ

* phpが別の場所にもインストールされていて、xdebugをビルドした際にそちらを見ていた→`phpize`を実行し、目的のphpにパスが通っているか確認する。php@7.1はうまく行かず、php@7.2ではpeclがインストールされて、prcl経由でインストールできた。

### VSCode側の設定

https://github.com/74th/vscode-debug-specs/blob/master/php/.vscode/launch.json
railsでcheck_boxを複数作りたい場合

ruby on rails 

例えば、クイズのテーブルがあって、クイズのカテゴリのテーブルもあり、クイズとクイズのカテゴリーは、多対多の関係になっていて、Categorizationという結合テーブルがある場合を考えます。
このような場合において、webサイトの表示にクイズのカテゴリを、チェックボックスで選択したいという課題について考えます。

参考）http://www.tom08.net/entry/2016/09/16/175801
のbefore_saveが大切でした。
自分の場合、before_save :category_ids_slim としました。
before_saveを使わないと、Quizテーブルのcategory_idsのカラムの中身が、
[¥"1¥"]のようになり、利用する際に困ってしまいます。そのため、before_saveが必要となります。
以下、参考ソースコードの紹介

```app/model/quiz.rb
class Quiz < ApplicationRecord
  has_many  :categorizations
  has_many  :quiz_categories, through: :categorizations

  before_save :category_ids_slim

  def category_ids_slim
    self.category_ids.gsub!(/[\[\]\"]/, "").gsub!(" ","") if attribute_present?("category_ids")
  end
end
```
（↑gsubが２つあるのは、苦肉の策です。）


```app/views/quiz/edit.html.erb
      <% if @quiz.category_ids.split(",").index("1") %>
        <%= f.check_box :category_ids, {multiple: true, :checked => true}, "1", nil %>
      <% else %>
        <%= f.check_box :category_ids, {multiple: true}, "1", nil %>
      <% end %>
      <%= label_tag :category_ids, '日本史' %>


      <% if @quiz.category_ids.split(",").index("11") %>
        <%= f.check_box :category_ids, {multiple: true, :checked => true}, "11", nil %>
      <% else %>
        <%= f.check_box :category_ids, {multiple: true}, "11", nil %>
      <% end %>
      <%= label_tag :category_ids, '世界史' %>
```
もちろん、each do 〜 end で繰り返した方がいいのですが、頭の良くない自分は、１つ１つ階段を上がっていく感じでないとプログラムを組めないので、頭の良くない人向けに書いています。
railsでチェックボックスを複数使う場合は、multiple: trueと書きます。すると、@quiz.category_idsの変数が配列として認識されます。
上の内容だと、日本史のチェックボックスにチェックがついていると、1がcategory_idsの配列に追加され、チェックがついてないと何も追加されません。
日本史と、世界史にチェックがついていると、category_idsには、[¥"1¥", ¥"11¥"]のような文字列（配列？）が入ります。（この¥"が邪魔なので、beofre_saveで削除します）
なぜ1と11にしたかというと、@quiz.category_ids.include?("1")とすると、配列に11が入っている場合にも、trueとなってしまうので、それを確認するためです。なので、includeを使うと良くないので、今回は、split(",").index("1")というようにして、解決しています。
リテラルとかenumとかは後で実装します。

ということで、個人的にかなり時間がかかったので、メモついでに書きました。きれいなコードではないと思いますが、参考になるなら見て下さい。他のサイトの解説ではよくわからなかったのと、解説サイトが少なかったので、書きました。


#追記
コードのリファクタリング　その１　
上のコードをeachで繰り返し処理に変更し、さらにリテラルを排除しました。

```app/views/quiz/edit.html.erb
<% QuizCategory.all.each do |c| %>
<% if @quiz.category_ids.split(",").index(c.category_id.to_s) %>
  <%= f.check_box :category_ids, {multiple: true, :checked => true}, c.category_id, nil %>
<% else %>
  <%= f.check_box :category_ids, {multiple: true}, c.category_id, nil %>
<% end %>
<%= label_tag :category_ids, c.name %>
<% end %>
```
shairport-sync インストールメモ


```console:
% brew install shairport-sync
% mkdir -p ~/Library/LaunchAgents/
% curl https://gist.githubusercontent.com/knoopx/86059a11f535a5345af31e9f3fb5eb72/raw/661539e78f579934bdead9b0648de4b21a46c088/shairport.sync.plist > ~/Library/LaunchAgents/shairport.sync.plist
% launchctl load ~/Library/LaunchAgents/shairport.sync.plist
```

iPhone とかで Airport の共有先に Mac の名前が出て iPhone の音を Mac で鳴らせるようになる。

[shairport-sync](https://github.com/mikebrady/shairport-sync) は shairport から fork されたプロジェクトで、開発の滞っている shairport に代わるプロジェクトである。
sklearnのPipelineを使うとコードをシンプルに書けるらしい

# PipelineなしとPipelineありのコードを比較しよう
まだPipelineの恩恵があまりわかっていませんが
PipelineなしとPipelineありのコードを比較したいと思います。
Pipelineありのコードのほうが、今後いくつものモデルを作成するときに
便利そうだな……という感覚はあります。

Python 3.6.4

# Pipelineなし
```python:test_normal.py
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# set dataframe
dataset = load_boston()
X = pd.DataFrame(dataset.data, columns=dataset.feature_names)
y = pd.DataFrame(dataset.target, columns=['y'])

# 訓練とテストに分割
X_train,X_test,y_train,y_test = train_test_split(X,
                                                 y,
                                                 test_size=0.20,
                                                 random_state=1)

# 整形
y_train = y_train.as_matrix().ravel()
y_test = y_test.as_matrix().ravel()

# 標準化
sc = StandardScaler()
sc.fit(X_train)
X_train = sc.transform(X_train)
X_test = sc.transform(X_test)

# 学習
ols = LinearRegression()
ols.fit(X_train, y_train)

# 寄与率
print(r2_score(y_test, ols.predict(X_test)))
```

# Pipelineあり

```python:test_pipeline.py
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# set dataframe
dataset = load_boston()
X = pd.DataFrame(dataset.data, columns=dataset.feature_names)
y = pd.DataFrame(dataset.target, columns=['y'])

# 訓練とテストに分割
X_train,X_test,y_train,y_test = train_test_split(X,
                                                 y,
                                                 test_size=0.20,
                                                 random_state=1)

# 整形
y_train = y_train.as_matrix().ravel()
y_test = y_test.as_matrix().ravel()

# Pipelineによる置き換え
from sklearn.pipeline import Pipeline

# Pipelineは任意のヘッダがつけられる?
# sc:StandardSclar(標準化)
# es:Estimator(推定器)

pip_ols = Pipeline([('sc',StandardScaler()),
                     ('es',LinearRegression())])

# 学習
pip_ols.fit(X_train, y_train)

# 寄与率
print(r2_score(y_test, pip_ols.predict(X_test)))
```
Vue.jsでGETやPOSTを実装する際の非公式・公式ライブラリーについて

## 概要
最近、仕事で必要に迫られVue.jsの学習を始めたところ、Vue.jsでPOSTやGETでリクエストを投げる際のライブラリーに非公式のものと公式のものがあることを知りました
( 今更感が凄いのはご愛嬌...)  

## 非公式

`vue-resource`

>vue-resourceの非公式化に関するリンク
https://jp.vuejs.org/2016/11/03/retiring-vue-resource/

AngularJSでGETやPOSTを実装する際に利用する `$resource` と同じ様に使えるイメージです。なお現在、こちらのライブラリーは、上記のリンクにあるように2016年以降 `非推奨` のライブラリとなっています。

```js
methods:{
 fetchData(){
   this.$http.get('api/hoge').then(response=>{
     何らかの処理
   }).error(function (data, status, request) {
     エラー処理
   })
 }
}
```

## 公式

`axios`

>関連リンク
https://jp.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html

こちらはVue.js公式のpromiseベースのHTTPクライアントとして `推奨` されているライブラリーとされています。
基本的にこちらを使うのが良さそうです。
(以下の例はTODOアプリを作った時のもの)

```js
methods: {
 fetchTasks: function () {
   axios.get('/api/tasks').then((response) => {
      for (let i = 0; i < response.data.tasks.length; i++) {
        this.tasks.push(response.data.tasks[i])
      }
   }, (error) => {
      console.log(error);
   });
 },
```

## 最後に
本記事は自身のVue.js学習途中の備忘録として投稿させて頂きました！
無知なことから内容に誤りなどあることと思います。
もし投稿内容に不備がありましたら、お手数ですがコメント頂ければ幸いです :pray:
[180728]Gitlab の Merge Request から学ぶ

今日のは難しい...

# [Resolve "Making instance-wide data tools more accessible"](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20679/diffs)
instance statistics っている namespace を作って、統計情報をそっちに移動。
そこに対して権限を付けて見れる人を調整してる。

もともとは Admin の下にあったので、admin only だったんだと思う。

それを `instance_statistics_visibility_private` っていうのを boolean でもって他のユーザーにも表示するのかをコントロールしてる感じ。

# [Stop building Route rows on the fly](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20313/diffs)

> This MR ensures that all existing projects and namespaces have a route, and removes the code for dynamically generating routes.

存在しているすべての Project と Namespace は route を持っているので、動的に作っていた route を削除してるってことだと思う。

この規模のリポジトリだからだとは思うけど、migration ファイルに class とか定義して `up` , `down` してるのは初めて見た。

こんな感じで書いてあるけど、なんでこんな書き方をしているのか...

既存テーブルをいじりたいけど、 Application 内の model とかのコードに影響を与えないようにこの書き方にしてるのか？

今の知識では理解できないので、一応メモだけ！

```rb
class GenerateMissingRoutes < ActiveRecord::Migration

  ...

  class User < ActiveRecord::Base
    self.table_name = 'users'
  end
end
```
textlintに.Rmdをmarkdownとして認識させる

textlint 11をインストールした上で、`~/.textlintrc`に以下の記述を追加する。

```json
{
    "plugins": {
        "@textlint/markdown": {
            "extensions": [".Rmd"]
        },
        ...
    },
    ...
}
```

- 参考: [textlint 11リリース | Web Scratch](https://efcl.info/2018/07/23/textlint-11/)
Vue.js と Nuxt.js のライフサイクル早引きメモ

# Vue.js

## Lifecycle

![lifecycle.png](https://qiita-image-store.s3.amazonaws.com/0/5051/90d782cc-b0e8-f3f9-947a-a2ca8270272c.png)

- [Lifecycle Diagram - The Vue Instance — Vue.js](https://vuejs.org/v2/guide/instance.html#Lifecycle-Diagram)

## Lifecycle, in case with SSR

> 
Since there are no dynamic updates, of all the lifecycle hooks, only `beforeCreate` and `created` will be called during SSR. This means any code inside other lifecycle hooks such as `beforeMount` or `mounted` will only be executed on the client.

- [Component Lifecycle Hooks | Vue SSR Guide | Writing Universal Code](https://ssr.vuejs.org/guide/universal.html#component-lifecycle-hooks)

# Nuxt.js

## The big picture

![Nuxt Lifecycle](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5051/126ef71f-1c84-f0a6-5a5c-0f0a6ea8ec71.png)

間違いあれば、ご指摘頂けると助かります :pray: 

## Middlewares, the big picture

![DeqXp7PUwAAvMIk.jpg](https://qiita-image-store.s3.amazonaws.com/0/5051/8ad915c8-13b1-fd91-e008-929757afcb15.jpeg)

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Understanding modules, serverMiddleware and plugins in Nuxt Js Configuration <a href="https://twitter.com/nuxt_js?ref_src=twsrc%5Etfw">@nuxt_js</a> <a href="https://twitter.com/vuejs?ref_src=twsrc%5Etfw">@vuejs</a> ✍️ <a href="https://t.co/QSubHBkECP">pic.twitter.com/QSubHBkECP</a></p>&mdash; krutiepatel (@KrutiePatel) <a href="https://twitter.com/KrutiePatel/status/1002781159997100033?ref_src=twsrc%5Etfw">June 2, 2018</a></blockquote>

## Lifecycle hooks, the big picture

![DeDKSyuUwAARbq-.jpg](https://qiita-image-store.s3.amazonaws.com/0/5051/517751c9-e1a3-815e-8555-903c752a05cf.jpeg)

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Understanding Nuxt.js Lifecycle Hooks... <a href="https://twitter.com/nuxt_js?ref_src=twsrc%5Etfw">@nuxt_js</a> <a href="https://twitter.com/vuejs?ref_src=twsrc%5Etfw">@vuejs</a> ...had ton of fun creating this diagram. ✍️ <a href="https://t.co/nDu1dXRfEF">pic.twitter.com/nDu1dXRfEF</a></p>&mdash; krutiepatel (@KrutiePatel) <a href="https://twitter.com/KrutiePatel/status/1000022559184764930?ref_src=twsrc%5Etfw">May 25, 2018</a></blockquote>

![nuxt-schema.png](https://qiita-image-store.s3.amazonaws.com/0/5051/263c2654-2406-2272-969f-0c0abf8fda26.png)

> According to this diagram, the hooks happen in this order: `nuxtServerInit`, middleware, and then `fetch` and `asyncData`. 

- [Async Data Options in Vue's Nuxt.js](https://zendev.com/2018/06/07/async-data-options-in-vue-nuxt.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5051/c85d396c-66be-1124-5b6d-635d89b06213.png)

- [Understanding how fetch works in Nuxt 2.12 - NuxtJS](https://nuxtjs.org/blog/understanding-how-fetch-works-in-nuxt-2-12/)
[iOS] アプリのバックグラウンド／フォアグラウンドを処理する

アプリのバックグラウンド／フォアグラウンド切替わった時に処理を行いたい場合、**AppDelegate** で処理します。

```swift:AppDelegate
class AppDelegate: UIResponder, UIApplicationDelegate {

    func applicationDidEnterBackground(_ application: UIApplication) {
        // バックグラウンドで処理したい内容
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // フォアグラウンドで処理したい内容
    }
```

各View で処理したい場合は、通知を登録して処理を行います。

```swift:MyViewController
class MyViewController: UIViewController {

override func viewWillAppear(_ animated: Bool) {
    // フォアグラウンド・バックグラウンドの通知の登録
    NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.viewWillEnterForeground(_:)), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.viewDidEnterBackground(_:)), name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
}

@objc func viewWillEnterForeground(_ notification: Notification?) {
    if (self.isViewLoaded && (self.view.window != nil)) {
        // フォアグラウンドで処理したい内容
    }
}
  
@objc func viewDidEnterBackground(_ notification: Notification?) {
    if (self.isViewLoaded && (self.view.window != nil)) {
        // バックグラウンドで処理したい内容
    }
}

override func viewWillDisappear(_ animated: Bool) {
    // フォアグラウンド・バックグラウンドの通知の解除
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
}
```

## バックグラウンドにならないケース
以下の場合バックグラウンド扱いされないようで、**applicationDidEnterBackground** は呼ばれないようです。
　　- タスク画面
　　- CallKit画面
Docker for MacでKubernetesが利用可能になったので使ってみた

# はじめに
Dockerコミュニティ版の最新バージョン **Docker Community Edition 18.06.0-ce**より、MacOSとWindowsで正式にKubernetesが統合されました。既にインストールしている人は、バージョンアップを行いKubernetes機能を有効にすることで、Kubernetesを使用できます。

本記事は、Docker for MacのKubernetesインストールについて簡単にまとめました。

## Docker for MacでKubernetesを使用する
Dockerを無料で使用する場合、コミュニティ版と言われる安定したバージョンの**Stable**と、最新の機能が取り込まれたエッジバージョンの**Edge**があります。これまでDocker for MacでKubernetesを使用する場合は、**Edge**バージョンを選択する必要がありましたが、Stableでのリリースが発表され、正式にDocker DesktopにKubernetesが統合されることになりました。

ソースは[こちら](https://blog.docker.com/2018/07/kubernetes-is-now-available-in-docker-desktop-stable-channel/)です。

### Kubernetesのインストール
既にDocker for Macがインストールされていて、バージョンアップによりKubernetesをインストールする手順になります。Docker for Macをインストールしていない場合は先にインストールしてください。

1. Dockerを起動すると、バージョンアップのポップアップが表示されるので[Install Update]をクリックする。
![スクリーンショット 2018-07-28 11.24.15.png](https://qiita-image-store.s3.amazonaws.com/0/221759/c41fc47a-9d05-832b-4d07-cabe7e748c1d.png)

2. [Install and Reaunch]をクリックする。
![スクリーンショット 2018-07-28 11.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/221759/429d4c68-6d29-7b54-a012-e9f625265741.png)

3. [OK]をクリックし、管理者のパスワード入力が求められるので入力する。
![スクリーンショット 2018-07-28 11.28.42.png](https://qiita-image-store.s3.amazonaws.com/0/221759/8a4e8ba0-ce1a-4d3e-7ce2-c0ab2e769810.png)

4. インストール完了後、[preferences]を見るとKubernetesのアイコンが表示される。
![スクリーンショット 2018-07-28 11.30.29.png](https://qiita-image-store.s3.amazonaws.com/0/221759/3cd7fdf5-58c9-da48-8abc-703087aada52.png)

5. [Enable Kubernetes]にチェックを入れて、[Kubernetes]を選択し、最後に[Apply]をクリックする。
![スクリーンショット 2018-07-28 11.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/221759/8c5d926d-7c6d-bd34-2384-b2c24ffc2285.png)

6. [Install]をクリックする。
![スクリーンショット 2018-07-28 11.34.43.png](https://qiita-image-store.s3.amazonaws.com/0/221759/78475afa-ceda-7d72-d427-c0c6cab85080.png)

7. インストール完了後、[Run in background]をクリックし、Kubernetesが起動することを確認する。
![スクリーンショット 2018-07-28 11.35.28.png](https://qiita-image-store.s3.amazonaws.com/0/221759/804049e5-9f05-9693-2cfa-656aac3fec29.png)

# さいごに
[本家の[Installing kubeadm]](https://kubernetes.io/docs/setup/independent/install-kubeadm/)より、システム要件を確認すると以下の通りでした。

>・One or more machines running one of:
・Ubuntu 16.04+
・Debian 9
・CentOS 7
・RHEL 7
・Fedora 25/26 (best-effort)
・HypriotOS v1.0.1+
・Container Linux (tested with 1576.4.0)
・2 GB or more of RAM per machine (any less will leave little room for your apps)
・2 CPUs or more
・Full network connectivity between all machines in the cluster (public or private network is fine)
・Unique hostname, MAC address, and product_uuid for every node. See here for more details.
・Certain ports are open on your machines. See here for more details.
・Swap disabled. You MUST disable swap in order for the kubelet to work properly.


インストール完了後、Kubernetesが中々起動しませんでした。
気がついたら起動できたのですが、Docker for Macはデフォルトで使用可能メモリが２GBになっているので、4GBのMacだと動作が重く使い物になりません。

なので、[preferences]-[Advanced]の[Memory]を1.0GiBに引き下げることで起動はできましたが、本来のパフォーマンスを出すならKubernetesを動かすプラットフォームとなるマシンのメモリに8GBは必要そうです。
sklearnのStandardScalerについて愚直にデバッグしてみた

# 標準化とは
標本に標準化を適用することで平均0、標準偏差1の分布になります。
sklearnのStandardScalerクラスで標準化を適用できますが、
機械学習初学者にとって他のPGを見ても当たり前のように使っていて
理解が追いつかなかったので愚直にデバッグして動きを理解しました。

Python 3.6.4

```python:test_standardscalar.py
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# set dataframe
dataset = load_boston()
X = pd.DataFrame(dataset.data, columns=dataset.feature_names)
y = pd.DataFrame(dataset.target, columns=['y'])

print('--head------------------------')
print(X.head())
print('--describe--------------------')
print(X.describe())

# 訓練とテストに分割
X_train,X_test,y_train,y_test = train_test_split(X,
                                                 y,
                                                 test_size=0.20,
                                                 random_state=1)

print('--split------------------------')
print(X_train.describe())

# 標準化
print('--StandardScaler---------------')
sc = StandardScaler()

# 平均0 標準偏差1に変換する
# X_trainの統計量を取得する
sc.fit(X_train)

# X_trainを平均0、標準偏差1の分布に変換する
X_train = sc.transform(X_train)
print('--X_train----------------------')
print(np.mean(X_train, axis=0))
# 直感的にわかりづらいので四捨五入
print(np.round(np.mean(X_train, axis=0)))
print(np.std(X_train, axis=0))

# X_trainで標準化をおこなっているので
# X_testにも同様に適用するとX_testでは平均0,標準偏差1にならない
X_test = sc.transform(X_test)
print('--X_test-----------------------')
print(np.mean(X_test, axis=0))
print(np.std(X_test, axis=0))
```
【swift】依存性逆転の原則についてまとめる

依存性逆転の原則(Dependency Inversion Principle)は以下になる。

> ・上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである
・「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである

色々試行錯誤したり質問したりしてなんとなく理解できたので、まとめていく。

# 上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである

## 上位のモジュールが下位モジュールに依存しているパターン

```swift:depend.swift
// 適当に選んで、残りのパラメーター捨ててる
struct User {
    let login: String
    let id:Int
    let url: URL
    let score: Double
}

// 下位モジュール
class GitHubSearchRepository {
    func getUsers(query: String, completion: @escaping ([User]) -> Void) {
        // なんらかの実装
    }
}

// 上位モジュール
class SearchUsecase {
    
    let repository = GitHubSearchRepository() // 実装に依存
    
    func searchUsers() {
        repository.getUsers(query: "apple") { users in
            // なんらかの実装
        }
        
    }
}
```

## 問題点
GitHubSearchRepositryに変更が入ったり、別の実装を利用したくなった場合に、Usecase側のコードを修正する必要がある。

つまり**修正が閉じていない。**

## 依存性逆転させたパターン
```swift:Dip.swift
// 抽象
protocol GitHubSearchRepositoryProtocol {
    func getUsers(query: String, completion: @escaping ([User]) -> Void)
}

// 上位モジュール
// 実際はこのユースケースもDipSearchUsecaseProtocolとかに適合している
class DipSearchUsecase {
    
    let repository: GitHubSearchRepositoryProtocol // 抽象に依存
    
    init(repository: GitHubSearchRepositoryProtocol) {
        self.repository = repository
    }
    
    func searchUsers() {
        repository.getUsers(query: "apple") { users in
            // なんらかの実装
        }
    }
}

// 下位モジュール
class GitHubSearchRepositoryV3: GitHubSearchRepositoryProtocol { // 抽象へ依存
    
    func getUsers(query: String, completion: @escaping ([User]) -> Void) {
        // GitHub API3 での実装
    }

}

// 下位モジュール
class GitHubSearchRepositoryV4: GitHubSearchRepositoryProtocol { // 抽象へ依存
    
    func getUsers(query: String, completion: @escaping ([User]) -> Void) {
        // GitHub API4 での実装
        // API v4はまだないが、でた場合は実装が破壊的かもしれない。
        // しかし、実装が抽象へ依存しているので、DIを切り替えるだけで変更できる
    }
    
}

/*
DIする
*/

let repository = GitHubSearchRepositoryV3()
// ver4を使うときは、　let repository = GitHubSearchRepositoryV4() とするだけ
let usecase = DipSearchUsecase(repository: repository)
```

## 良い点
上位モジュールが下位モジュールの実装に依存しておらず抽象依存しているため、**修正が閉じている。**
外部から適切な依存性注入(Dependency Injection)を利用すれば良いだけ。

上位のモジュールも下位モジュールも、お互いの都合を考える必要がなくなった。

# 「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである
この文章は理解が難しかった。
しかし、ここでいう「依存」という言葉の定義を、オブジェクト指向で利用される「使用関係」を表す依存の意味ではなく、一般的な
> 他のものにたよって成立・存在すること。

という意味で理解するとうまく消化できた。

つまり、
> `GitHubSearchRepositoryProtocol` が、`GitHubSearchRepositoryV4` の実装によって成り立つ

ではなく

> `GitHubSearchRepositoryV4` が　`GitHubSearchRepositoryProtocol` の宣言によって成り立つ。

という関係を作るのがDIP。

**DIPでは実装に合わせてインターフェースを変えるのではなく、インターフェースに実装を合わせる。**

# 利用したコード
PlaygroundをGithubに置きました
https://github.com/syatyo/DIP/tree/master

# 参考・関連
[オブジェクト指向設計原則とは](https://qiita.com/UWControl/items/98671f53120ae47ff93a)

[swiftで 依存関係逆転の原則 を使ってテストしやすい設計にする
](https://qiita.com/peka2/items/4562456b11163b82feee)
Go言語—バッファなしのチャンネルに送受信するとデッドロックが起こる理由

# 疑問

表題のとおり。
なぜバッファなしのチャンネルに対して、メイン処理で送受信をおこなうとデッドロックが発生するのか。

# バッファリングなし

チャンネルはデフォルトではバッファを持たない。

これが何を意味するかというと、並行処理で走る「レシーバー」の受信準備ができているときにだけ、チャンネルに値を送信できるということだ。

## 例

```go
package main

import "fmt"

func main() {
	// バッファを持たないチャンネルを作る
	messages := make(chan string)

	// 別の goroutine で受信準備をする
	go func() { fmt.Println(<-messages) }()

	// メイン処理 ( メインの goroutine ) でチャンネルに値を送信する
	messages <- "value"
}
```

[Playground](https://play.golang.org/p/DqOQUfpr3qr)

# バッファリングあり

だがチャンネルにバッファを持たせた場合、レシーバーがいない場合でも、チャンネルに指定個数分の値を持たせることが出来る。

## 例


[Go by Example: Channel Buffering](https://gobyexample.com/channel-buffering) からほぼそのまま

```go
package main

import "fmt"

func main() {

    // 2個のバッファを持ったチャンネルを作成
    messages := make(chan string, 2)

    // レシーバーは存在しない状態だが、チャンネルは値を二個まで持てる
    messages <- "buffered"
    messages <- "channel"

    // 同じくメイン処理で、チャンネルから二回の受信をおこなえる
    fmt.Println(<-messages)
    fmt.Println(<-messages)
}
```

[Playground](https://play.golang.org/p/PM-GC2FIxEC)



まったく実用的な例ではないが、別の goroutine を走らせなくても、メイン処理だけでチャンネルへの値の送受信が出来ているのが分かる。

(バッファ個数を指定しないと、チャンネルに値を送信しようとした時点でデッドロックが発生し、エラーが起こる)

# 疑問

ではなぜ、非メインの goroutine の中で送信だけをおこなう場合、デッドロックが発生しないのか。
 

## 非メインの goroutine での送信は、他の goroutine の受信を待つ

~~っぽい。たぶん。~~

というわけではないことが後ほど分かった。

その後書いた記事 — [Go言語—チャンネル、バッファ、ブロック、デッドロックを理解する ( そして楽しいgoroutine ) - Qiita](https://qiita.com/YumaInaura/items/ae02c12b9c37a3ef7ac0)


```golang
package main

import "fmt"
import "time"

func main() {
	communicate_channel := make(chan bool)
	orphan_channel := make(chan bool)

	// チャンネルにメッセージを送信しようとする
	// あとでメイン処理で受信がおこなわれる
	go func() {
		fmt.Println("Before send message to communicate channel") // Run
		communicate_channel <- true                               // Run
		fmt.Println("After sent message to communicate channel")  // Run
	}()

	// もうひとつのチャンネルにメッセージを送信しようとする
	// だがどこでも受信はおこなわれないので、実際の送信はおこなわれない (デッドロックも起こらない)
	go func() {
		fmt.Println("Before send message to orphan channel") // Run
		orphan_channel <- true                               // Wait
		fmt.Println("After sent message to orphhan channel") // Not run
	}()

	// 片方のチャンネルだけからメッセージを受信する
	<-communicate_channel

	time.Sleep(300 * time.Millisecond)
}
```

[Playground](https://play.golang.org/p/qAqFQL4k1-K)


# 感想

- あくまでチャンネルは、goroutine間の値の送受信のためのものなので、メイン処理だけで使おうとしてもエラーが起るのは当たり前。(という理解)
- 最初、チャンネルが持つバッファの位置づけというか、役割がまったく分からなかった。
  - なぜメイン処理だけでチャンネルに値を送受信しようとすると、デッドロックが発生するのか。
  - なぜ (go 文を使うなどして) goroutine で同じことをした場合は、同じ問題が発生しないのか。
  - 並行処理でレシーバーを走らせた場合は、バッファがなくても全く問題ないように見えたので、さらに謎が深かった。
- この部分を理解するのに相当苦労したが、ふりかえれば全部 Go Example に書かれていた。

# 環境

- go version go1.10.3 darwin/amd64

# 参考

- [Go言語  — go文を書かなくても goroutine は走っている - Qiita](https://qiita.com/YumaInaura/items/f32f204e667206307184)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Selenium driverエラー(The driver is not executable)の解決方法

# 背景

Seleniumを動かす際、エラーになってしまった。
eclipseのコンソールには...

```
java.lang.IllegalStateException: The driver is not executable
```


#原因

ChromeDriverへの実行権限がない。

#解決

実行権限をつけるとによって解決！


```
chmod +x [ChromeDriver]
```
個人学習メモ＃９　


データベースのテーブル構造
excelのようなモノと似ている。

構造
-
テーブル
ーーフィールド
ーーレコード

webサービスやアプリを作る際に、それぞれのアプリ一つにつき「データベース」を１つ作る

データベースの中にたくさんのテーブルがあって、テーブルの中に「フィールド（テーブルの列）」・「レコード（テーブルの行）」がある。

テーブルの種別に関して
-
intーデータ番号、数量

varcharー名前、タイトル、メールアドレスなどの短い文字列

textー長い文字列、ブログ記事、メール本文など

datetimeー投稿日時、最終更新日など



今日学んだコマンド
-
テーブルの削除　DELETE FROM テーブル名
Qiitaに記事を投稿してみる

# はじめに
開発時にはいつもお世話になっているQiitaさん．
メモと知識整理を主な目的として，引っかかったところとその解決方法を時々更新していきたいと思います．

初めてのQiita更新ということで，テストがてらQiitaでの記事投稿方法について説明していきます．


# 1. アカウント登録
メール認証まで完了すればOKです．
興味のあるジャンルなどを選択しておくとQiitaを有効に活用できそうですね．

# 2. 投稿記事作成
サイト右上にある[:pen_fountain:投稿する]　ボタンを押すと次のような画面になります．
![2018-07-28_14h46_42.png](https://qiita-image-store.s3.amazonaws.com/0/276179/b714e625-b64a-365e-2900-06ccd8876aa2.png)

この左側の部分にMarkdown記法で記事を書いていきます．
リアルタイムでプレビュー（右側）が表示されるのもありがたいですね．

#3. 記事投稿
記事が作成できればあとは投稿するだけです．右下に[Qiitaに投稿]ボタンがあるのでそこをクリックし，利用規約に同意して投稿すれば完了です．
右の▲部分を押せば限定投稿なども選択できます．
![2018-07-28_14h54_49.png](https://qiita-image-store.s3.amazonaws.com/0/276179/cce5a69a-dcaa-663b-4632-9b56db2a00b5.png)

#4. おわりに
これから投稿頑張っていきます！
ご意見アドバイス等ぜひお願いいたします．
時刻同期chronyの導入

# 概要

時刻同期のNTPサーバとして、chronyを導入する。
なおデフォルトでインストールされている。

# chronyの導入

#### chronyのインストール

以下のコマンドでchronyをインストールする。

```bash:chronyのインストール
sudo yum -y install chrony
```


#### chronyの設定

以下のコマンドで設定ファイルのバックアップを取得する。

```bash:chrony.confのバックアップ
sudo cp -piv /etc/chrony.conf /etc/chrony.conf.`date "+%Y%m%d"`

<出力結果>
`/etc/chrony.conf' -> `/etc/chrony.conf.YYYYMMDD'
```

以下のファイルを編集し、chronyの設定を行う。

```text:/etc/chrony.conf
#Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
### NTP Server begin
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
### NTP Server end
（中略）
# Allow NTP client access from local network.
### NTP Server begin
#allow 192.168.0.0/16
allow 192.168.11.0/24
### NTP Server end
（以下、省略）
```

以下のコマンドでchronyを起動し、再起動時に自動起動するように設定する。

```bash:chronyの起動
sudo systemctl restart chronyd
systemctl status chronyd

<出力結果>
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2018-07-28 11:12:24 JST; 3h 22min ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
 Main PID: 639 (chronyd)
   CGroup: /system.slice/chronyd.service
           mq639 /usr/sbin/chronyd

```

```bash:chronyの自動機能設定
sudo systemctl enable chronyd
```

#### chronyの動作確認

以下のコマンドで設定したNTPサーバから時刻同期しているかを確認する。

```bash:chronyの動作確認
chronyc sources

<出力結果>
210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-b2.nict.go.jp             1   6   377    31  +1285us[ +158us] +/- 7948us
^- ntp1.jst.mfeed.ad.jp          2   6   377    31   +669us[ +669us] +/-   74ms
^- ntp2.jst.mfeed.ad.jp          2   6   377    31  +1009us[+1009us] +/-   83ms
```


# 次の手順



以上
LabVIEW Linux 2018 PythonNode


# LabVIEW2018から追加されたPythonNodeをLinux版でも試す
[Windows版で試した](https://qiita.com/alucky4416/items/62d2f08a29350770da01)ので、Linux版でも試してみた

## LabVIEW2018から追加されたPythonNodeをLinux版でも試す
RedHat developersに登録すると１ライセンス分無料と使えるRHEL7を使って、LabVIEW 2018 Linux版(64bit)をインストール、その環境で PythonNode を試してみた

*なお、LabVIEW Linuxは、いまなお日本語表示やデバイスドライバ等に問題を抱えている状態ですので、実用目的での利用を推奨するものではありません。*

## Python のインストール
デフォルトインストールされていた。python のVersionは 2.7.5だった

## 関数パレット、サンプル
Windows版と同じ

サンプルは以下のフォルダに入っている
/usr/local/natinst/LabVIEW-2018-64/examples/Connectivity/Python/

Open Python SessionのPythonバージョンには、今回デフォルトインストールされていたもものをそのまま使用したので、「2.7」を選択。

## Pythonスクリプト自体のデバッグ
  LabVIEWでPythonスクリプトを実行できるといっても、細かいデバッグはできないので、事前にデバッグして単体で動くことを確認しておくこと。
[ruby]括弧を使うことで、ブロックの引数に渡した配列の入れ子を展開することができる

## 結論
ブロックの引数で、以下のような配列を展開したい場合、
引数を()で囲むことで展開できる
※1階層のみ

```ruby
arr = [["hoge"], ["bar"], "foo"]
arr.each { |(ele)| 
  puts ele.length
}
```

ただ、個人的には
flattenで書く方があとから見直すときによいと思う:thinking: 

## 比較

```ruby:test.rb
#!/bin/ruby
arr = [["hoge"], ["bar"], "foo"]
arr.each { |ele| 
  puts ele.length 
  puts ele.class
}

puts '---'

arr.each { |(ele)| 
  puts ele.length 
  puts ele.class
}
```

実行してみます

```bash
$ ruby test.rb
1
Array
1
Array
3
String
---
4
String
3
String
3
String
```

なお、次元が1つ下がるだけのようなので、入れ子の入れ子みたいなのは展開できないようです。

```ruby:test2.rb
#!/bin/ruby
arr = [["hoge"], ["bar"], "foo", [["piyo"]]]
arr.each { |(ele)| 
  puts ele.length 
  puts ele.class
}
```

```bash
$ ruby test2.rb
4
String
3
String
3
String
1
Array
```

ただ、個人的にはわかりづらい点と、
私自身も仕組みも理解できていない点、
何階層まで展開するかの指定ができる点を考慮するとflattenという
配列を平坦化するメソッドを使った方がよりよいかなと思います :relieved: 
cf. https://docs.ruby-lang.org/ja/2.5.0/method/Array/i/flatten.html

```ruby:test3.rb
#!/bin/ruby
arr = [["hoge"], ["bar"], "foo", [["piyo"]]].flatten(1)
arr.each { |ele| 
  puts ele.length 
  puts ele.class
}
```

```bash
$ ruby test3.rb
4
String
3
String
3
String
1
Array
```

## 経緯
以下の問題を解いた後、他の人の回答を見ていたところ
今回の書き方をみつけた
https://yukicoder.me/problems/no/345
メソッドに@VisibleForTestingを付けていこうと思った

## VisibleForTesting概要
* guavaで定義されているアノテーション
* テストのためやむを得ずpublicやprotected、package privateにする場合に付与
* このアノテーションを付ける、付けないで特に動作は変わらない（中身は空のinterface）
  * 実際にソース確かめたい方は[こちら](https://google.github.io/guava/releases/19.0/api/docs/com/google/common/annotations/VisibleForTesting.html)。

## ソースコードのサンプル
```java
@VisibleForTesting
protected void doSomething() {
  // ...
}
```

こんなアノテーションがあるなんて今まで知らなかった。へぇ〜、確かにぱっと見で「なんでprotectedなの？」っていうのが分かりやすくなった気がする。guavaを使っているプロジェクトなら、せっかくなので使ってみるのがいいかもしれない。

ちなみに、protectedよりpackage privateの方が公開範囲が狭いので、package privateにしておく方が無難かもしれない。（確かJunit実践入門にも書いていたような気がする…）

## けっこう使われているの？
GitHubで検索してみると、それなりに使われているアノテーションっぽい。KotlinでもVisibleForTestingを付けているプロジェクトもあった。

## 他にも似たようなアノテーションってあるの？
[com.google.common.annotations](https://google.github.io/guava/releases/19.0/api/docs/com/google/common/annotations/package-frame.html)
業務で使えそうなのはVisibleForTestingだけかな。

## これを書いた背景
2,3年ぶりにJavaを書いていて、学びがあったのでメモしておきました。
もしかしたら日々でAndroidアプリを書いている人だったら常識レベルなのかな？
riotタグにjsonで連想配列を渡してやるとvalueが消える件

# 背景
riotのカスタムタグに連想配列をjsonで渡そうとした時に起きた現象。
ドツボに嵌ったので共有

# 環境
- MacOs High Sierra
- php 7.1.14
- laravel5.5.40（今回多分関係ない）
- riotjs3.10.3

# どういった現象か

```php
$array = ['name' => 'John', 'age' => 24];
``` 

この配列を



```html:member.html
<member status='<?= json_encode($array) ?>'></member>   //riotタグ
```

といった風にjsonに変換してriotタグに渡してやる

```html:member.tag
<member>
  <script>
    console.log(this.opts.status)
  </script>
</member>
```

console.logでパラメータを確認すると

```console
name age
```

と出力される

# どこにいったvalue?

連想配列のキーだけになっている。なんで？
こんな感じになってほしいのだが・・・

```php
{name: "John", age: 24}
age:24
name:"John"
```

#　原因
[公式](https://riot.js.org/ja/guide/)に答えがありました。


>クラス省略記法
RiotはCSSクラス名について特別な文法をもっています。例えば、
>
```html
<p class={ foo: true, bar: 0, baz: new Date(), zorro: 'a value' }></p>
```
は、”foo baz zorro”として評価されます。

クラス省略記法として解釈されていたんですね。（なんでかはソース読めばいいんでしょうが、別の機会に）

# 回避方法

json_encodeされたものを、さらに中括弧でくくってやると、クラス省略記法としては解釈されないみたいです。

```html:member.html
<member status='<?= "{" . json_encode($array) . "}" ?>'></member>   //riotタグ
```

流石に不恰好なので、こんな感じのヘルパー関数を作成して、

```php
if (!function_exists('json_encode_for_riot')) {

    /**
     * @param $mixed mixed 配列もしくはCollection
     * @return string
     */
    function json_encode_for_riot($mixed): string
    {
        return '{' . json_encode($mixed) . '}';
    }
}
```

使えば、まあ、良いかも

```html:member.html

<member status='{{ json_encode_for_riot($array) }}'></member>   //riotタグ
```

### 他にエレガントな回避方法ないんですかね・・・。

# 参考（というか答え）

最初はよくわからなかったのですが、最終的にはおそらく同じ現象だと理解できました。
ありがとうございます。

[RiotのカスタムタグにJSONを渡す](https://qiita.com/jkr_2255/items/da85757d170c013bac8b)
Leap Motionファームウェア初期化

Leap MotionのドライバとSDKを入れたのにデバイスが認識されなくて困ったので、備忘録を残しておきます。


# 環境
- エディション： Windows 10 Home
- バージョン： 1803
- OSビルド： 17134.165


# 症状
- タスクトレイ内ではコントローラーがオフの状態
- Leap Motionコントロール パネルのトラブルシューティングではデバイス未接続の状態
- デバイスマネージャーに「West Bridge」と表示されてしまう
    - 正常であれば「Leap Motion Contoller」が出てくるはず
        - カメラ、イメージング デバイス、ユニバーサル シリアル バス コントローラーあたりを確認

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/221810/ccee320b-d4b9-eb84-b9e2-a4e912dd7b9c.png)


# 対策
調べていくと、どうやらファームウェアのリセットが必要ということがわかってきました。
各種エントリに貼られている公式ファームウェアリセットツールへのリンクが切れているケースが多く、「leap motion firmware reset tool」でググって出てきた[最新のexe](https://leapmotion.app.box.com/s/72vze9oitxsjmh7y5j505ckcft8mloxg)をダウンロード。

- Leap Motion Softwareをアンインストール
- ファームウェアリセットツールを適用
    - 適用が完了した時点で、今まで反応のなかった本体側面のLEDが緑色に点灯
- 最新版のSDKをインストール
    - ここでは[Leap_Motion_Developer_Kit_4.0.0+52173.zip](https://developer-archive.leapmotion.com/downloads/external/v4-developer-beta/windows)をダウンロードした

これで無事Leap Motion Controllerが認識され、ビジュアライザーなどで動作確認が取れるようになりました。
海の向こうから遥々やってきたデバイスが置物にならなくて良かった…


# 参考URL
- [トラブルシューティングガイド / Leap Motion](https://support.leapmotion.com/hc/en-us/articles/223782688-Troubleshooting-Guide)
- [Firmware Restore Tool needed / Leap Motion Forums](https://forums.leapmotion.com/t/firmware-restore-tool-needed/562)
Cython では .pyx をコンパイルした .c もコミットすべき（かも？）

- Cython の `Cython.Distutils` を `setup.py` で使わない方がいいかもしれない。
- .pyx を cython でコンパイルした .c もコミットしてしまえばいい
- でも、モヤモヤする

# Cython.Distutils の困ったところ

Cythonでは、`setup.py`用の関数が用意されています。

```python
# setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("example", ["example.pyx"])]
)
```

これを使えば、**「誰でも `python setup.py install` でビルドできるようになる」わけではありません。**当たり前ですが、**`setup.py` を実行する前にCython自体を予めインストールしておく必要がある**のです[^1]。

[^1]: .wheel形式（ビルド済みバイナリ）を配布するならこの問題は起きません。なので「全アーキテクチャ向けのwheelを提供する」も１つの解決策ではあるでしょう。

自分が使うツールならまだ我慢できますが、PyPIなどで公開するならば、**`pip install hoge` だけでインストールできおるようにしたい**ものです。

# 僕がやったこと

`Cython.Distutils` は使わず、`setuptools`標準の機能だけを使うようにし、
**cythonで生成したC言語のソースをGitレポジトリにコミット**してしまいました。

これにより**インストール時にはcythonが不要になります**。

```
レポジトリにコミットしている（主要な）ファイル:

setup.py
_pyjq.pyx <-- cython言語のソースコード（C言語ライブラリを呼び出す部分）
_pyjq.c   <-- cython言語のソースコードを cython でコンパイルして生成したC言語のソース
```
https://github.com/doloopwhile/pyjq/tree/v2.1.0


```
# setup.py
from setuptools import setup
from setuptools.extension import Extension
from setuptools.command.build_ext import build_ext

setup(
  cmdclass={"build_ext": build_ext},
  ext_modules=[Extension("_pyjq")]
)
```

# モヤモヤするところ

Gitレポジトリを運用するときは、大体どこでも、

- レポジトリにはソースコード（.py や .pyx）だけをコミットする
- 中間生成物（.pyc や .o） はコミットしない
- ビルド結果（.exe や .wheel）もコミットしない

というルールで運用していると思います。

今回追加したC言語のソースは、.pyx から生成できる中間生成物なので、ルールに従えばコミットするべきではない・・・。

でも、例えばGo言語の場合`go generate`で自動生成したファイルをGitレポジトリでコミットしたりするので、`.c` をコミットするのもあり・・・だと思います。
VRフレームワーク「A-Frame」でHello 3D World


VR流行ってますね。私もOculas Goが出たあたりから興味が湧いてきたので
簡単にWebでVRが作れるMozilla謹製のフレームワーク「A-Frame」を触ってみたいと思います。

本当はmiddleman + s3_syncで静的ホスティングにしたいところですが
取り急ぎ今回は[過去に作ったPlayFramework + Heroku環境](https://qiita.com/mopinfish/items/a991e748d7d34591fcb5)で手軽に公開します。


ローカルの開発環境でaframe.jsを実行するために、Content-Security-Policyヘッダ用に下記の設定を追加しました

```
play.filters.headers.contentSecurityPolicy = "script-src 'self' https://aframe.io 'unsafe-eval'; object-src 'self'"
```

とりあえず[公式ドキュメント](https://aframe.io/docs/0.8.0/introduction/)にある下記のサンプルコードを動かしてみる。

```
<html>
  <head>
    <script src="https://aframe.io/releases/0.8.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
      <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
      <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
      <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
      <a-sky color="#ECECEC"></a-sky>
    </a-scene>
  </body>
</html>
```

これだけでこんな感じのVR空間が作れる。
![Hello  3D World.png](https://qiita-image-store.s3.amazonaws.com/0/29188/99a9acac-bfb7-4c4d-79f7-f41356a6eb34.png "Hello  3D World.png")


実際の動きはこんな感じ。
https://play-misc.herokuapp.com/

各要素の詳細については後日追記予定

## 感想
マークアップだけでそれっぽい3Dが実現できるのは非常に楽で良いですね。
もう少し凝ったVR空間を作成できるように引き続きA-Frameについて調査してみたいと思います。
【Vue】v-forでリストレンダリングしたv-modelが連動してしまう


### なぜ？
入力フォームを追加&削除できるように`v-for`でリストレンダリングさせて作っていたら、
1つの入力フィールドを変更すると、他の入力フィールドも連動して変更されてしまう・・・
`v-model`でデータバインディングはそれぞれの要素を指しているのになんで？？？😭😭😭

### ソースコード

以下のソースになります（サンプル）

```vue
  <div id="app">
    <div v-for="(item, index) in items"
         :key="index"
    >
      <div>
        <div>
          <h3>No.{{ index + 1 }}.</h3>
          <a v-if="totalCount > 1"
             href="#"
             @click.prevent="removeItems(index)"
          >削除</a>
        </div>

        <div>
          <p>タイトル</p>
          <input type="text" v-model="item.title">
        </div>

        <div>
          <p>内容</p>
          <textarea v-model="item.content"></textarea>
        </div>
      </div>
    </div>
    <a v-if="!isLimitOver" href="#" @click.prevent="addItems">追加する</a>
  </div>

```

```javascript
const DEFAULT = {
	title: 'タイトル',
	content: '内容'
}

new Vue({
  el: '#app',
  data () {
    return {
      items: [DEFAULT], 
      count: 1,
      limit: 10
    }
  },
  computed: {
    isLimitOver () {
      return this.items.length >= this.limit
    },
    totalCount () {
      return this.items.length
    }
  },
  methods: {
    addItems () {
      this.items.push(DEFAULT)
      this.count++
    },
    removeItems (target) {
      this.items.splice(target, 1)
      this.count--
    }
  }
})

```

[実際に動くfiddleはこちら](https://jsfiddle.net/mnq7rk2e/)


### 原因

↓デフォルトの値を定義したこの定数オブジェクトが原因でした😂

```
const DEFAULT = {
	title: 'タイトル',
	content: '内容'
}
```

これは追加するたびに、定義された同じオブジェクトを配列にプッシュしていました。
したがって、新しい独立したオブジェクトではなく、同じオブジェクトの複数のコピーがある状態になっていたわけです💦
つまり、同じデータオブジェクトのため、全て共有されているので連動していたわけですね😓



### 解決策

データオブジェクトをコンポーネント内の関数にする✌️


```javascript

new Vue({
  el: '#app',
  data () {
    return {
      items: [{
        title: 'タイトル',
        content: '内容'
      }], 
      count: 1,
      limit: 10
    }
  },
  computed: {
    isLimitOver () {
      return this.items.length >= this.limit
    },
    totalCount () {
      return this.items.length
    }
  },
  methods: {
    addItems () {
      this.items.push(this.independentObejct())
      this.count++
    },
    removeItems (target) {
      this.items.splice(target, 1)
      this.count--
    },
     /**
     * 追加した関数
     * @return {[Object]}
     */
    independentObejct () {
      return {
        title: 'タイトル',
        content: '内容'
      }
    }
  }
})

```


コンポーネントのVueインスタンスが同じデータオブジェクトを共有しないように、
`independentObejct()`メソッドとしてデータオブジェクトを関数にしました


[修正後はこちら](https://jsfiddle.net/9un3jy6L/)


### 参考

https://stackoverflow.com/questions/49533419/using-v-model-in-v-for
UnityでOculusGoのコンテンツの見た目系を作っててわからなかったところのメモ

#1.フレアレイヤー(Flare Layer)のつけ方。
##1.1.アセットストアからダウンロード
まずアセットストアよりLens Flaresをダウンロードします。
##1.2.Point Lightを追加
次にポイントライトを追加し、**インスペクター**を開くと**ライト**の中に**フレア**があるのでそこに**Assets** > **Lens Flares**の中のファイルを一つ**ドラッグアンドドロップ**しましょう。
##1.3.コンポーネントの追加
どのカメラにつければ良いかわからなかったので色々試した結果
**OVRCamaraRig** > **TrackingSpace** > **CenterEyeAnchor**
にコンポーネントを追加してあげるとOculusGoで実行した際に動くようになります。これで画面がギラギラになってすごそうに見えます。

#2.Post Porcessing Stack v2を付けるときの注意点
Post Processing Stack v2を使ってBloomを使いたいと思ったときに躓いたことです。上記と同じく**CenterEyeAnchor**にコンポーネントを追加して使います。
自分の環境では**プレイヤー設定**のところを**マルチパス**にしなければ左目が表示されなかったので**シングルパス**の場合は**マルチパス**にすれば正常に表示されるかもしれません。

#3.Graphics APIsについて
**Graphics APIs**を**Vulkan**だけにしてしまうと正常に表示されなくなってしまうので注意。
よくわからない場合は**自動グラフィックスAPI**にチェックを入れておくと良いと思われます。

#4.HDRのつけ方について
**CenterEyeAnchor**の**Allow HDR**にチェックボックスを付けてもOculusGoに転送後は表示されませんでしたが、

```
編集 -> プロジェクト設定 -> グラフィックス設定 -> Androidタブ -> 高中低のそれぞれのティア
```

の規定値のチェックを外してHDRを使用にチェックを付けると使えるようになりました！

#まとめ
外観を盛ればすごいVRコンテンツに見える
UnityJSON形式での保存と読込

JsonUtilityを使ってJSON形式で保存するとき、悩みに悩んだため、初心者でもわかるように、書き込んで、それを読み取るサンプルプログラムを示しておきます。
自分自身も初心者なので一部間違いがあるかもしれませんが、参考になると嬉しいです。
###ソースコード
```C#
using System.Collections; //このコードでは必要とされていませんが、使う機会が多いので参照
using System.Collections.Generic; //このコードでは必要とされていませんが、使う機会が多いので参照
using UnityEngine; //いろいろなところで必要
using System; //JsonUtilityを扱うために必要
using System.IO; //ファイル読み書き用

[Serializable] //JSONWrite直列化
public class JSONWrite //クラスを定義
{
    public int posData; //変数を定義
}

public class JSONPacker : MonoBehaviour {
    private string DataPath; //ここに保存するパスが入ります
    private void Start()
    {
        DataPath = "保存したい場所/ファイル名.txt"; //変数を初期化するのには定数（決まった数）でなければいけないので、変数の定義が済んだ後に、データパスを代入します。
        JSONWrite DataIn = new JSONWrite(); //DataInに、JSONWriteクラスを入れる（たぶん違いますがそう考えるとわかりやすいです）
        DataIn.posData = 10; //JSONWriteのposDataを10に
        string SaveData = JsonUtility.ToJson(DataIn); //JSONWriteクラスをJsonに変換、string型SavaDataとして保管
        File.WriteAllText(DataPath, SaveData, System.Text.Encoding.UTF8); //DataPathに保管されているパスを指定しテキストとして保管
        Debug.Log(SaveData); //デバックログに結果を出力
        JSONWrite Uncode = JsonUtility.FromJson<JSONWrite>(File.ReadAllText(DataPath)); //DataPathに保管されているパスを指定しテキストを読み取り
        Debug.Log("Out" + Uncode.posData); //JSONをJSONWriteクラスに変換した結果を出力
    }
}

~~~
DataPathは自分の場合"C:/Asset/ProjectFile/Unity's/original_data.txt"のようにしました。
\\で指定するとエラーが出ると思います。
DataPathは保存したい場所に合わせて変えてください。
【N予備校】例外処理　JSONファイルが読み込めない！原因を探る方法

## まずはエラーの部分を探る
```js
try{

const data = fs.readFileSync(fileName, 'utf8');

tasks = new Map(JSON.parse(data));

}  catch (ignore){

console.log(ignore); // この行を追加

console.log(fileName + 'から復元できませんでした');

}
```
**console.log(ignore);** を追加することにより **catch (ignore)** した内容を出力できる。

```shell-session
vagrant@ubuntu-xenial:~/workspace/todo$ node

> 'use strict';

'use strict'

> const todo = require(`./`);

ReferenceError: fileNaame is not defined

at Object.<anonymous> (/home/vagrant/workspace/todo/index.js:8:32)

at Module._compile (module.js:643:30)

at Object.Module._extensions..js (module.js:654:10)

at Module.load (module.js:556:32)

at tryModuleLoad (module.js:499:12)

at Function.Module._load (module.js:491:3)

at Module.require (module.js:587:17)

at require (internal/module.js:11:18)

at repl:1:14

at ContextifyScript.Script.runInThisContext (vm.js:50:33)

./tasks.jsonから復元できませんでした

undefined
```

これで原因が
**ReferenceError: fileNaame is not defined at Object.<anonymous> (/home/vagrant/workspace/todo/index.js:8:32)**
だった事が分かりました。

## あとは修正する

該当部分を修正し

```shell-session
    vagrant@ubuntu-xenial:~/workspace/todo$ node
    
    > 'use strict';
    
    'use strict'
    
    > const todo = require(`./`);
    
    undefined
    
    > todo.list();
    
    [ 'ノートを買う' ]
```

これでJSONファイルが読み込めました！


## N予備校って優しい解説から急に難しくなりますよね
独自フォーラムとかありますけどQiita的な記事投稿ができないのが難点。

※2020年1月更新
##MENTAでコードレビューやプログラミング勉強相談を行っています！
お気軽にメッセージを下さい！
[プラン](https://menta.work/plan/1461)はこちらになります！
近接センサーで画面をオフにする（Android）

近接センサーで画面をオフにするには、以下のコードで可能です。

```Java
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
   :
// 有効にする
wakeLock.acquire();
   :
// 無効にする.
wakeLock.release();
```

これをどのタイミングで実行するかですが、
Activity のライフサイクルから考えると、**onStart()** または **onResume()** で有効にして、**onStop()** または **onPause()** で無効にする、で**だいたい**動きます。

## Samsung ではうまく機能しない
ところが、Samsung で確認すると、画面がオフにならずにちらついてしまいます！
全てで確認したわけではありませんが、Samsung以外では近接センサーを塞ぐと画面がオフになるだけですが、Samsung では **onPause()**/**onStop()** がコールされてしまいます。
**onPause()** または **onStop()** で **wakeLock.release()** すると、画面が表示されることで今度は **onStart()**/**onResume()** が呼ばれ、再度 **wakeLock.acquire()** で有効になり画面がオフになる。すると、また **onPause()**/**onStop()** がコールされ・・・・以降処理がループされることで画面がちらつく結果となります。

## 対策
対策として、無効にする処理を行うイベントを **onPause()** から **onWindowFocusChanged()** に変更しました。
画面のフォーカスが外れた場合に無効とするようにすることで、有効／無効ループに入らないようにするとともに、画面が裏に回った場合は無効にできるようになりました。

```Java:onCreate()
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
```

```Java:onResume()
if(!wakeLock.isHeld()) {
    wakeLock.acquire();
}
```

```Java:onWindowFocusChanged()
onWindowFocusChanged(boolean hasFocus) {
    if (!hasFocus) {
        // 近接センサーを無効
        if(wakeLock.isHeld()) {
            wakeLock.release();
        }
    }
}
```

```Java:onDestroy()
if(wakeLock.isHeld()) {
    wakeLock.release();
}
```

Android の機種依存、面倒だなぁ・・・
StellaTrim - New Step by Step Roadmap For Slim Body

Actually StellaTrim something I have never thought of. The Internet is huge. They can get really cranky. This is worth gold. That is a high octane approach. We'll take that risk. If that is the case, StellaTrim is for you. 

Where do I begin? This keeps me going, "Actions speak louder than words." I can be as dense as a San Francisco fog. Now you can't just put up a StellaTrim that erases a color for a StellaTrim. StellaTrim needs help. It wasn't smart. As you'll see, "If at first you don't succeed, redefine success." I just wish I had more enlightenment as it concerns StellaTrim. 

Nonetheless, StellaTrim means Weight Loss and you can do that by investing time. This is sort of higgledy piggledy but I hope you understand. Yeah, we hope so. I do expect that StellaTrim provides a mixture of options to its audience. It's not an effortless decision. 

That's like we've begun a bunch of StellaTrim clones. That means economic survival. I imagine this is understood however, that approach takes some time to grasp for oodles of men and women. I saw an aces multimedia presentation relative to StellaTrim. Some localities have laws subsidizing StellaTrim. I have found StellaTrim to be immense. 

You may have tried StellaTrim in the past with little or no success. It's just plain mean. This is everything you must know germane to StellaTrim. In point of fact, it's actually the only positive with StellaTrim. We'll get right to the point: You need to learn more relating to StellaTrim. I sense you'll discover that I'm a wellspring of theory. It is the best money can buy. StellaTrim drives me nuts sometimes. Perhaps we should go over the basics of StellaTrim. Close only counts in horseshoes, hand grenades and nuclear explosions. Granting all that, StellaTrim is not just about having StellaTrim. 

Make it effortless for StellaTrim. It's the moment to rejuvenate your StellaTrim. In that case, for starters, most StellaTrim have StellaTrim because of this wherever I read the most recent StellaTrim news release. I need to balance the cost. Do you mind if I just pick your brain concerning StellaTrim? It's simply that recently StellaTrim has been brought up to new heights. As a matter of fact, let's take a moment and look into this. That has an authentic flavor. 

You need to dedicate yourself to your StellaTrim. We'll also tell you how you could even use StellaTrim and not actually have to spend money on StellaTrim. 

https://revivagenixfacts.com/stellatrim/