OmniAICreator/Qiita-1.07M huggingface dataset:
Step Functions で パラレル実行するジョブごとにリトライ

ググってもあまり情報でなかったのでやってみました。

ParallelのBranchのStateごとにretry書くことはできます。
マニュアルだとTypeがTaskかParallelにだけRetryが書けるとかいてあり分かりづらいですが、Parallelの中のTaskかParallelのTypeであればretryが書けます。言葉ではわかりずらいので以下のように失敗するLambda関数を一つ用意して以下をコピペして実行する(ベースはParallelのブループリントです)

```
{
  "Comment": "An example of the Amazon States Language using a parallel state to execute two branches at the same time.",
  "StartAt": "Parallel",
  "States": {
    "Parallel": {
      "Type": "Parallel",
      "Next": "Final State",
      "Branches": [
        {
          "StartAt": "Wait 20s",
          "States": {
            "Wait 20s": {
              "Type": "Task",
              "End": true,
              "Resource": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:test-lambda",
              "ResultPath": "$.chkcount",
              "Retry": [{
                "ErrorEquals": ["States.ALL"],
                "IntervalSeconds": 5,
                "MaxAttempts": 5,
                "BackoffRate": 2.0
               }]
            }
          }
        },
        {
          "StartAt": "Pass",
          "States": {
            "Pass": {
              "Type": "Pass",
              "Next": "Wait 10s"
            },
            "Wait 10s": {
              "Type": "Wait",
              "Seconds": 10,
              "End": true
              
            }
          }
        }
  
      ]
    },
    
    "Final State": {
      "Type": "Pass",
      "End": true
    }
  }
}

```

結果はこのような形でFailしているのがわかります。

![スクリーンショット 0030-06-15 22.02.39.png](https://qiita-image-store.s3.amazonaws.com/0/27932/f67b0233-f9b5-9347-21f0-6d481ff42ac1.png)

実行の履歴を見るとLambdaが6回Failしているのがわかります。つまり5回リトライされ6回目のFailでParallelStateFailになりパラレル処理全体のFailになったことがわかります

![スクリーンショット 0030-06-15 22.02.51.png](https://qiita-image-store.s3.amazonaws.com/0/27932/6bb867c6-6f66-25a1-5d98-1ab975a93781.png)

![スクリーンショット 0030-06-15 22.03.04.png](https://qiita-image-store.s3.amazonaws.com/0/27932/31915941-5fce-3f19-24ac-6c645765710c.png)

![スクリーンショット 0030-06-15 22.03.11.png](https://qiita-image-store.s3.amazonaws.com/0/27932/73e341d1-9dab-32d9-1c02-907bedc329f0.png)
Youtubeで使える隠しコマンド

知っている人もいるかも知れませんが、偶然YouTubeを見ながらキーボードを弄ってたら見つけた隠しコマンドをまとめてみました。

| 操作 　　  |コマンド | 
|:-----------------|:------------------:|
| 停止、再生          |Kキーかスペースキー |
|10秒巻き戻す         |　　Jキー　　|
| 10秒早送り          |　　Lキー　　|
| フルスクリーン       |　　Fキー　　|　
| フルスクリーン解除     | EscキーかFキー|
| ミュート         |　Mキー　|
|検索窓に入力|　/キー　|
phpspreadsheetで日本語が消える件

phpspreadsheetで日本語が消える件についてどなたか知識がある方、解決策を思いつく方お力添えをよろしくお願いします。
githubで協力を頂きましたが未解決です。
よろしくお願いします。
リンクに詳しいやり取りがありますのでよろしくお願いします。
https://github.com/PHPOffice/PhpSpreadsheet/issues/550
Raspberry Pi とNFCタグリーダを使い勤怠管理。出退勤打刻装置を作成（第2回：NG処理とwav音源再生処理の追加）

# はじめに

前回の、「[第1回：まずは完成させる](https://qiita.com/shigeru-yokochi/items/a91c0a3cb1fbb7cafafe)」を改良したので、その変更点をまとめました。


![20180614_144247.jpg](https://qiita-image-store.s3.amazonaws.com/0/146154/d59d2e4e-4501-53dc-babc-2b4c79e8a603.jpeg)


# 改良箇所

## ①　OK時とNG時にそれぞれ異なったWAV音源を鳴らすようにしました。

打刻した際に圧電ブザーを鳴らしていたものを改良しました。
wav音源の再生はRaspberry Pi zero では簡単にできないので簡単に実現できる Raspberry Pi 2を使用しました。
aplayコマンドを使用しています。

## ②　OK時とNG時に専用のLEDを点灯するようにしました。

よりわかりやすくするためOK時にはグリーン、NG時にレッドのLEDが点灯するようにしました。
ＯＫはGPIO_04、ＮＧはGPIO_27を使用。


## ③ ヘルスチェックを追加してシステムが異常時の検知ができるようにしました。

インターネットに接続しているかどうかと、処理プロセスが実行しているかのヘルスチェックを追加しました。
異常の場合はNG(ALM)用のレッドLEDが点灯します

インターネットへのヘルスチェックはgethostbyname()を使用しています。
メインループ中では実施間隔は以下のように調整しています。

```c:
	for (;;) {
	    usleep(100000);    //100ms

        nLoopCnt++;
        if(nLoopCnt>50){
            if(gethostbyname("yahoo.co.jp") == 0){  //インターネット接続しているか
            	digitalWrite(GPIO_04, HIGH);    //ALM(発生)
            }
            else{
            	digitalWrite(GPIO_04, LOW);    //ALM
            }
            nLoopCnt=0;
        }
       .
       .
       .
    }

```

プロセスのチェックは
毎分のcron で以下の処理を実施しています

``` sh:
#! /bin/bash
line=`/bin/ps -elf | /bin/grep  tact | /bin/grep -v grep | /bin/grep -v chkProsess.sh | /usr/bin/wc -l`
if [ $line -ne 2 ]; then
    echo 2 > /tmp/alm.tmp
fi
```

# 処理構成
![akashi3.JPG](https://qiita-image-store.s3.amazonaws.com/0/146154/16c80df7-6b8b-8223-2cf7-af62afb9b92e.jpeg)

# 打刻装置回路図
![tactsw_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/146154/d323177c-952a-4c38-cabd-9bf7316536ee.png)

# コード(GitHub)
https://github.com/shigeru-yokochi/Attendance-Management

# 使用してみて

一か月ほど使用していますが、特に不具合なく動作しています。
何回かプロセスが止まっていてALMのLED点灯しましたが、電源OFF/ONにて復旧することができるので想定内です。

# 次にやること
外部のUSBスピーカから音を出しているので、配線を含めごちゃごちゃしていて醜いのでどうにかしたいです。
小型のアンプ+スピーカを使い筐体内に収めるとか、bluetoothスピーカへ飛ばすとかを考えています。
利用者の使い勝手を向上させるために切り替えスイッチを廃止することも考えています。（例えばNFSリーダを4つ用意するとか）

# 続きはここ

 [第3回：オーディオアンプ+スピーカを含め筐体内に実装](https://qiita.com/shigeru-yokochi/items/b5a9aea510465e6d7676)
vscodeのマイナーだけど便利なショートカット超個人メモ(mac)

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)


次の予測へ移動 control n
前の予測へ移動 control p

コード自動成形(ファイルの全てを成形) shift+option+F

ZenMode command k + z

クリップボードとアクティブファイルを比較 command k c

一致するすべての出現箇所を選択　shift command f

列をソート F9

行を上に移動　alt 上矢印
行を下に移動　alt 下矢印

再帰的に折りたたむ　command k + command [
再帰的に展開　command k + command ]

セーブする前の変更をセーブする前と左右で比較　command k +  command + d 
 
次の検索結果にフォーカス　F4
前の検索結果にフォーカス　shift + F4

複数のファイルで置換 shift command H

Rename F2 (JSXを編集する時に多用)
 プロジェクト全体のrenameはcmd+F2

importの整理 shift+alt+o
　自動的にimportを綺麗に並び替えしてくれる。

ファイル内の関数オブジェクトに移動　cmd+shift+o
  constructorとか、render()とかに移動できる。

行を削除 shift cmd K

定義元を覗く　cmd shift F12
Rx(Reactive Extension)説明スライド(仮)

※9/09のCombGigに向けて早めに準備

# Rxの定義むずいー
FRPとは何か、的なことを
# よくわかんないからまずはコードを見てみよう(普通のリスト操作)

# こんなことや、こんなこともできる
# つまりRxとは、(三つの要素)

# 実は全てのものをStreamにできちゃう
# アーキテクチャレベルで依存される位、これからの常識になりつつある
# (欠点)
ESLintのエラーをまとめてみた Part1

## 今回発生したエラー
- `error  Using target="_blank" without rel="noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener  react/jsx-no-target-blank`
- `error  Assignment to property of function parameter 'target'  no-param-reassign`
- `error  Do not use Array index in keys  react/no-array-index-key`
- `error  Prop type `object` is forbidden  react/forbid-prop-types`
- `error  componentWillReceiveProps is deprecated since React 16.3.0, use UNSAFE_componentWillReceiveProps instead, see https://reactjs.org/docs/react-component.html#unsafe_componentwillreceiveprops  react/no-deprecated`
- `error  propTypes should be placed after trackPage react/sort-comp`

## Using target="_blank" without rel="noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener  react/jsx-no-target-blank
- 意味:`rel="noopener noreferrer"`を追加しましょう
- Qiita:https://qiita.com/togana/items/e739e1ec943862a71757
- やったこと:  `<a>`の中に`rel="noreferrer noopener"`を追加  
- 効果:リファラー(ユーザーのサイト内での動き)情報を簡単に解析されないようにする。

## Assignment to property of function parameter 'target'  no-param-reassign
- 意味:`target`以外の変数を使ってください。
- Qiita:https://qiita.com/M-ISO/items/4cd183e2496c2937a53e

## Do not use Array index in keys  react/no-array-index-key
- 意味:キーに配列要素を使わないでください
- やったこと:キーの変更

## Prop type `object` is forbidden  react/forbid-prop-types
-　意味:`object`を使わないでください
-　やったこと:`object`の変更

## componentWillReceiveProps is deprecated since React 16.3.0, use UNSAFE_componentWillReceiveProps instead, see https://reactjs.org/docs/react-component.html#unsafe_componentwillreceiveprops  react/no-deprecated
- 意味:React16:30だと、 `componentWillReceiveProps`は廃止するから、`UNSAFE_componentWillReceiveProps`を使ってほしい。
- やったこと:上記

## propTypes should be placed after trackPage react/sort-comp
- 意味:`propTyps`は`trackPage`のあとに置いてください
- やったこと:場所の入れ替え
【jQuery】jQueryライブラリURL表

#目的
jQueryがホストされているCDNをまとめました。
ページを開いたらjQueryの位置で開くようにしてあります。
シェア用です。

#置き場表
| CDN |URL|
|:-----------------:|:-----------------:|
| jQuery|https://code.jquery.com/ |
| Google|https://developers.google.com/speed/libraries/#jquery |
|MicroSoft|https://docs.microsoft.com/en-us/aspnet/ajax/cdn/overview#jquery-releases-on-the-cdn |
バニラjsでjqueryの$を使う

#jqueryの$をバニラjsで使う
バニラjsでいちいち`document.querySelector`とか、`document.getElementById`とか書くのは面倒なので`$`で済ましたい。
##コード
es6なら一行で書ける

```javascript
let $ = (selector) => document.querySelector(selector)
```
bindメソッドを使う方法

```javascript
let $ = document.querySelector.bind(document)
```

##例
<p data-height="265" data-theme-id="0" data-slug-hash="pKWNWg" data-default-tab="js,result" data-user="kodamaworld" data-embed-version="2" data-pen-title="jquery$" class="codepen">See the Pen <a href="https://codepen.io/kodamaworld/pen/pKWNWg/">jquery$</a> by kodamaworld (<a href="https://codepen.io/kodamaworld">@kodamaworld</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

<p data-height="265" data-theme-id="0" data-slug-hash="KeeVdK" data-default-tab="js,result" data-user="kodamaparadise" data-embed-version="2" data-pen-title="jquery$" class="codepen">See the Pen <a href="https://codepen.io/kodamaparadise/pen/KeeVdK/">jquery$</a> by kodama (<a href="https://codepen.io/kodamaparadise">@kodamaparadise</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
PlatformIO IDE で Arduino を遊ぶ

PlatformIO IDE がとても素晴らしかったので使い方をまとめてみた。

## インストール

PlatformIO **IDE** といいつつ、実態は [Visual Studio Code](https://code.visualstudio.com)(vscode) と [Atom](https://atom.io) のプラグインになっている。
宗教上の理由で Microsoft 製品を使えないとかでなければ、vscode の方が補完が強力だし色々と高機能でよさげ。
僕は vscode 派なので以下 vscode がインストールされてる前提で。

![スクリーンショット 2018-06-15 19.44.00.png](https://qiita-image-store.s3.amazonaws.com/0/9549/7fb63a74-b395-91dc-a379-1d10cafb0731.png)

なお、Arduino IDE は不要。

## ビルドから実行まで

新規プロジェクトを作成する:

![スクリーンショット 2018-06-15 19.56.41.png](https://qiita-image-store.s3.amazonaws.com/0/9549/4db2d12d-1665-530b-e623-0e7c74368b16.png)

Name と Board を入力する。一般的に入手できそうなボードはだいたい網羅されているっぽい。ESP32 用に色々ダウンロードしたりとかもいらない。

![スクリーンショット 2018-06-15 19.53.50.png](https://qiita-image-store.s3.amazonaws.com/0/9549/e098f58c-2d5a-a97c-4eed-f076599e84b5.png)

でもって src/main.cpp を編集する。ぐいぐい補完が効いてとても気持ちいい。

![スクリーンショット 2018-06-15 20.11.07.png](https://qiita-image-store.s3.amazonaws.com/0/9549/6bf59f34-1b26-0cde-ea58-fc8921774203.png)

ビルドとかの操作は下部のメニューバーから実行できる。

![スクリーンショット 2018-06-15 20.33.11.png](https://qiita-image-store.s3.amazonaws.com/0/9549/f51d7a61-a42d-7f33-8d09-30137e721783.png)

## ライブラリの管理

ライブラリマネージャから検索できる。インストール数が表示されるので、似たようなパケージがあるときに参考になる。

![スクリーンショット 2018-06-15 20.18.59.png](https://qiita-image-store.s3.amazonaws.com/0/9549/efa90612-e92f-6a68-2351-7c437769b102.png)

このまま GUI でインストールすると全プロジェクトで使えるようになるけど、platformio.ini に書いたほうが可搬性があって良さそう（ビルド時にインストールしてくれる）。

![スクリーンショット 2018-06-15 20.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/9549/d91968d5-6be3-e231-6ffe-ff6e3fdcfbf9.png)
順序尺度の因子分析

# 順序尺度の因子分析

Rで探索的因子分析のやり方をメモ。
R、因子分析共に初心者なので、誤りがある場合は、ご指摘いただきたいです。

ordinal scale(順序変数)を使っている探索的因子分析なので、ポリコリックかスピアマンの相関係数を使わないと行けない.（[Polychoric versus Pearson correlations in exploratory and confirmatory factor analysis of ordinal variables | SpringerLink](https://link.springer.com/article/10.1007/s11135-008-9190-y)）

[豊田秀樹(2000)](https://www.amazon.co.jp/%E5%85%B1%E5%88%86%E6%95%A3%E6%A7%8B%E9%80%A0%E5%88%86%E6%9E%90-%E5%85%A5%E9%96%80%E7%B7%A8%E2%80%95%E6%A7%8B%E9%80%A0%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0-%E7%B5%B1%E8%A8%88%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%BC-%E8%B1%8A%E7%94%B0-%E7%A7%80%E6%A8%B9/dp/4254126581)は以下のように述べている。

* 連続変数&連続変数:ピアソンの相関係数
* 順序変数&順序変数:ポリコリック相関係数
* 順序変数&連続変数:ポリシリアル相関係数

カテゴリカルな相関係数が算出できるので、カテゴリカル因子分析や項目反応理論などへ適用できる相関係数。[polycorパッケージによる順序相関係数の算出](http://www.okadajp.org/RWiki/?polycor%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%88%E3%82%8B%E9%A0%86%E5%BA%8F%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0%E3%81%AE%E7%AE%97%E5%87%BA) が参考文献。

## 前準備
普段Pythonを使っているが、今回はRで実装する。
理由は因子分析を行うのに、Rの方がパッケージが豊富であると判断したから。
パッケージをインポート？（表現を知らない）

```r
library(psych)
library(GPArotation)
```


## 因子分析の手順
[Brett Williams(2012)](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.475.8594&rep=rep1&type=pdf)の論文より、手順は以下の通り。

1. データが因子分析に適切か
2. 因子の抽出
3. 因子数の決定基準
4. 回転
5. 解釈と因子の命名


## 1.データが因子分析に適切か
[Brett Williams(2012)](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.475.8594&rep=rep1&type=pdf) は以下の項目をチェックしろとおっしゃってる。

1_1. Sample size
1_2. Correlation matrix
1_3. Variable Ratio
1_4. (Kaiser-Meyer-Olkin Measure of Sampling Adequacy and Bartlett’s Test of Sphericity)←理解できてないので括弧

### 1_1.Sample Size
文献何個か乗せてくれてるけど、大体経験則として300以上らしい。（足りなくてもやってはいけない訳ではない）

### 1_2.Correlation matrix
相関が１つも0.3超えてなかったら考え直せと。
相関使うからそれはそう見たいな感じ。

### 1_3.Variable Ratio
データ数とカラムの比
From 3:1,6:1,10:1,15:1, or 20:1と書いてあるけど、はっきりとは書いてない。

## 2.因子の抽出
Rでポリコリックだと以下の5つは使える。(codeのfmで設定)

* 主因法(pa)
* 重み付き最小２乗法(wls)
* 重みない最小二乗法(uls)
* 最尤法(mle)
* 最小残差法(minres)

## 3. 因子数の決定基準
以下の方法で因子数は決定できる。(codeではnfactorsで設定)
[Rで因子分析　商用ソフトで実行できない因子分析のあれこれ](https://www.slideshare.net/simizu706/r-42283141)が参考文献であり、素晴らしいスライド。このスライド見れば、正直このページいらない笑

以下実行すれば、因子数を決められる。

### スクリープロット
```r
VSS.scree(df)
```

### 平行分析

```r
library(psych)
fa.parallel.poly(df,fa="pc")
# fa:factor analysisのやつ
# parallel:平行分析で
# poly:ポリコリックを使うってことね
```

### MAP基準
```r
VSS(df,n=10,use="complete.obs")
```

固有値の値で決める方法も追記します。

## 4.回転方法
私は以下の二つしか試していない。(codeではrotatoにて設定)
* プロマックス回転(promax)
* バリマックス回転(varimax)

## 実装
ここまでで、実装して結果が出せる。

```r
result <- fa.poly(df,nfactors = 5,
                  fm = 'minres',
                  rotate = 'promax',
                  use = 'complete.obs')

print(result, sort = T)
```
**sort = T**を使うことで、因子負荷量をソートして出してくれるので、つけるべき。

## 5.解釈と因子の命名方法
因子分析は一回やるだけで終わるものではない。
負荷量が0.4以下で効いてない変数に関しては、
もし削除しても良いと判断できれば、削除してもう一度分析を行う。これは何度も繰り返す。

あとは、以下の項目をチェックする必要がある。

* **累積寄与率が低すぎないか**(そもそもモデル使えない)
* 1個の因子が3つ以上の変数か
* 複数の因子に1つの変数がかかりすぎてないか。
* 解釈できるか

## 終わりに
最初にも書きましたが、まだまだサーベイが足りてないので、間違った情報がありましたら、教えていただきたいです。
第13話 アルキメデスの立体

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第13話です。

```math
\#\{Archimedian soild\}=13
```

半正多面体(アルキメデスの立体)は13種類である、という意味です。

半正多面体は正多面体の条件を緩めたもので、正多面体は以下を満たす立体です。
・すべての面が合同な正多角形
・頂点に集まる面の数が同じ
有名な正多面体は立方体ですが、立方体を含めて全部で5種類あります。

半正多面体は、以下の条件を満たす立体です。
・すべての面が正多角形
・頂点に集まる面が同じ形
・一部特殊な形(角柱、反角柱、ミラーの立体)ではない

半正多面体で最も有名なのは、サッカーボールです。
サッカーボールは正六角形と正五角形だけでできています。
そうした半正多面体は全部で13種類あります。

この辺は図があるWikipediaを参考にしたほうがいいですね
[半正多面体](https://ja.wikipedia.org/wiki/%E5%8D%8A%E6%AD%A3%E5%A4%9A%E9%9D%A2%E4%BD%93)
AIで自動生成されたNIKKEI決算サマリー記事にフリーライドしたら著作権侵害になるか

AIと知的財産について色々調べていて、日経が少しおかしなことを言ってないか？と思ったのでちょっと考えてみます。NIKKEIが、[日本経済新聞のサイト上でAIが自動生成した決算サマリー](https://www.nikkei.com/markets/kigyo/page/?uah=DF_SEC8_KSSN__)を記載していることはご存知だと思います。こちらの[決算サマリー自動生成AI紹介サイト](http://pr.nikkei.com/qreports-ai/)でのNIKKEI自身の説明によると、

> 元データである企業の開示資料から文章を作成し、配信するまでは完全に自動化し、人によるチェックや修正などは一切行いません。

つまり人は一切関与していないと明言しています。

一方、同サイトの中では、以下のように権利はNIKKEIに帰属すると明言しています。

> Q6 : 自動作成したコンテンツに関する権利はどこに帰属していますか
>
> A6 : 日経に帰属しております。二次利用のルールなどは[こちら](http://reprint.nikkei.co.jp/index.html)をご覧ください。

これはとても奇妙に見えます。というのも、本記事を書いている2018年6月15日現在、僕は、この「決算サマリーのAIによる自動生成」で創作された記事は著作権を認められないと思うからです。AIの創作物に関しては議論が進められているところですが、現行の法制度ではこの事例は以下のようになると思われます。

1）人間の記者が書いた場合：著作権が認められる
2）AIをワープロ的なツールとして利用し記者が書いた場合：著作権が認められる
3）AIに元ネタのURLを与えて自動作成させた場合：著作権が認められない

[人工知能が作った創作物、現行の法律ではどうなる？](http://www.itmedia.co.jp/news/articles/1703/16/news016.html) という記事に分かりやすい説明がありますが、法制度上は今のところ上記のようにならざるを得ないと言われています。

もし僕が、AIが自動作成したNIKKEI決算サマリーをスクレイピングして、AIで翻訳し多国語で決算サマリーを配信するフリーライドのWebサービスを立ち上げたら、NIKKEIから著作権侵害で訴えられるでしょうか？少なくともAIが自動作成したサマリーのテキスト部分について著作権侵害で訴えられることはなさそうに思います。

知的財産権について少し整理してみます。以下の5つが代表的な知的財産権になりますが、僕にはフリーライドしてもどの権利も侵害していないように思えます。

1）著作権：人が寄与しないAI創作物は著作ではないのでセーフ。NIKKEI自身がAIによる自動生成と認めている。
2）特許権：NIKKEIのWebサイトに掲載された時点で公知なのでセーフ。
3）実用新案権：製品の形状、構造、組み合わせに関わる考案ではないのでセーフ。
4）意匠権：美感の面から創作を保護されるものではないのでセーフ。
5）商標権：テキストに商標が含まれていなければセーフ。含まれていたらNIKKEIもアウト。

果たしてNIKKEIは、AIによる自動生成の創作物に対して何の権利を有しているといっているのでしょうか？

例えば、スクレイピングでテキストデータを毎秒1回収集すると、DDoSアタック並みの威力業務妨害と判断されるかもしれませんが、1時間に1度程度なら妨害にはならないと思われます。でもそれは権利がNIKKEIに帰属するというポイントとは無関係です。

はっ、まさかNIKKEIのAIモデルはFinancial Timesと同じく英国にあって、コンピューター創作物にも著作権を認める英国著作権法が適用されるとかいうちゃぶ台返しか！

今度、この辺りに詳しい法曹界の方にお会いする機会があったら是非一度お伺いしてみたいテーマです。

というところまで書いて、少し記事を寝かせていたら[AI記者が記事を書く時代（下）AIが書いた記事は誰のものなのか？](https://thepage.jp/detail/20170314-00000002-wordleafv?utm_expid=90592221-90.x0Auz-QlTn2yldOAHtyYkA.0&utm_referrer=https%3A%2F%2Fwww.google.co.jp%2F)という記事を見つけてしまい疑問解決というオチでした😅　しかし、ここでNIKKEIが言っている無断で流用されない権利というのは何だろう？著作物でないとNIKKEI自身が認めているにもかかわらず、無断で流用されない権利を有していると言える背景がわからない。NIKKEIの著作物でない以上、流用することをNIKKEIに申し入れるのもおかしいと思います。

しかし、少なくともNIKKEIは「記事には侵害される著作権があるとは思っていないが無断流用は許さん」と言いたいわけですね。何だか、インターネット黎明期にあった無断リンクお断りみたいになってきました。そのうち #インターネット老人会 みたいなハッシュタグの代わりに、第3次AIブーム黎明期のことを懐かしむ何かタグっぽいものが生まれて「そういえば昔NIKKEIが、AIで作成した記事に権利主張してだな」とか語り継がれるのでしょうかね。
Rubyの記事を見たいんだけど、Railsの記事は見たくない時の検索方法

業務、趣味などで素のRubyを扱っている方々、こんにちは。

#結論
マイナス検索でRailsを弾きましょう。（「-」で弾くやつ）

【調べたいこと　-rails】[検索]


以上です。

フレームワーク名がRuby on Railsで名前にRuby入っちゃってるし有名だしでまぁ検索引っかかるよね
Windows 10 + Google Chrome > ブックマークが同期されない問題 > 対処 (2018-06-15)

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: 67.0.3396.87（Official Build） （64 ビット）
```

### 状況

- PC AとPC Bがある
    - ともにWindows 10 v1803
    - ともにGoogle Chrome
- PC AのChromeにてログアウトした
- PC AのChromeにて「閲覧履歴データを消去する」にて各種項目を削除した
- PC AのChromeにてログインしなおした後、ブックマークとアプリの同期が実施されない
    - ブックマークバーにはデフォルト?のものが表示

### 対処

下記を実施することで解決した。

- PC BのChromeにてログアウト
- PC BのChromeにてログイン
    - >> PC Aのデフォルト?のブックマークがPC BのChromeに追加された
- PC BのChromeにて追加されたブックマークを削除
    - >> PC Aにて同期がされた

### 備考

PC Aのみで解決できなかった。

検索したところ、Chromeで同様の不具合の質問があり、回答がついている。
しかしながら、それらの回答で解決した様子は見られない。
LaravelでAWS SNSを利用してSMSを送る

# Laravelのインストール
```sh
$ laravel new LaravelSns
$ cd LaravelSns
$ php artisan --version
Laravel Framework 5.6.25
```

git の設定

```sh
$ git init
$ git add .
$ git commit -m 'init'
```

# aws/aws-sdk-php-laravelのインストール・設定

```sh
$ composer require aws/aws-sdk-php-laravel
```

```diff:config/app.php
'providers' => [
  //...
  /*
  * Package Service Providers...
  */
+  Aws\Laravel\AwsServiceProvider::class,
],
```

設定ファイルを生成

```sh
$ php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"
```

```diff:config/aws.php
+ 'credentials' => [
+   'key'    => env('AWS_ACCESS_KEY_ID'),
+   'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ ],
'region' => env('AWS_REGION', 'us-east-1'),
'version' => 'latest',
'ua_append' => [
  'L5MOD/' . AwsServiceProvider::VERSION,
],
```

.envファイルにそれぞれ設定する

```diff:.env
+ AWS_ACCESS_KEY_ID=
+ AWS_SECRET_ACCESS_KEY=
+ AWS_REGION=
```

# SMSを送る

コマンドを作成

```sh
$ php artisan make:command SendSms
```

```php:app/Console/Commands/SendSms.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\App;

class SendSms extends Command
{
    protected $signature = 'send:sms';
    protected $description = 'SMS送信のテスト';
    public function handle()
    {
        $sns = App::make('aws')->createClient('sns');

        $sns->publish([
            'Message' => 'こんにちは',
            'PhoneNumber' => '+810000000000' // 電話番号を入れる
        ]);

    }
}
```

コマンドを実行

```sh
$ php artisan send:sms
```
Scala & Play2 学習ノート(1)

# Scala & Play2 学習ノート(1)

ここ4,5年C#&Azureマンでやってきましたがこの度転職する運びとなり、新しい職場ではScala&AWSが中心と聞いているので集中的に勉強してみようかと思い学習の経過・メモを記事に残していくつもりです。
ちなみにScala自体は全くの未経験というわけではなく、個人的に勉強して納品とは関係の無い業務ツールを作っていた時期(ソースを見るとScala 2.10.2時代)があります。
かなり忘れている部分もあるのでリハビリを兼ねつつボチボチ画像少なめメモ中心でやっていきます。

## 環境作成

### sbt インストール

なにはなくとも sbt。Macならbrewでinstallするだけ。

```
$ brew install sbt
```

sbt および Scalaのバージョンを確認するには sbt about。

```
$ sbt about
[info] Loading project definition from /Users/xxxx/project
[info] Set current project to xxxx (in build file:/Users/xxxx/)
[info] This is sbt 1.1.6
[info] The current project is ProjectRef(uri("file:/Users/xxxx/"), "xxxx") 0.1.0-SNAPSHOT
[info] The current project is built against Scala 2.12.6
[info] Available Plugins: sbt.plugins.IvyPlugin, sbt.plugins.JvmPlugin, sbt.plugins.CorePlugin, sbt.plugins.JUnitXmlReportPlugin, sbt.plugins.Giter8TemplatePlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.12.6
```

### IntelliJ インストール

昔は Ultimate じゃないと Scala が使えなかった気がしますがその頃買ったライセンスも切れているし Community 2018.1 をインストール。
セットアップ中に Scala Plugin を入れられるのでそこでインストール。

![1-install-scala-plugin.png](https://qiita-image-store.s3.amazonaws.com/0/246831/f047f715-b631-a005-127c-3397b3c41d7a.png)

インストールが終わったら New Project で Scala を選択。ライブラリが未設定なので右の"Create..." から Scalaのバージョンを選択し、グローバルのバージョンとして設定。

![1-new-project-scala.png](https://qiita-image-store.s3.amazonaws.com/0/246831/5a849b5f-6906-bb15-6339-121dae06cf28.png)


## Hello Scalaする

### IntelliJ 上で実行

```scala
object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello Scala")
  }
}
```

パパっとメインクラスを作ってメインクラスで右クリックして実行。

![1-debug-hello.png](https://qiita-image-store.s3.amazonaws.com/0/246831/f00205b7-008e-da15-c6bc-daab9f3892ed.png)

```
Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java 〜
Hello Scala
```

実行はできるけど赤字でなんか出てくるので嫌な感じがしますが、[ここ](https://stackoverflow.com/questions/43003012/class-javalaunchhelper-is-implemented-in-two-places) によると
Macの古いJavaの問題で無害らしい。後でJava入れ直しましょう。

### sbtで実行

これはこれで簡単に動かせて悪くはないのですがやっぱり sbt で動かしたいので sbt プラグインを入れる。
sbtプラグインを入れて IntelliJ を再起動し、今度は sbtベースのプロジェクトを作成。

![1-install-sbt-plugin.png](https://qiita-image-store.s3.amazonaws.com/0/246831/b6275311-f369-f548-a1b5-e6d001c762b1.png)
![1-new-project-sbt.png](https://qiita-image-store.s3.amazonaws.com/0/246831/f775b303-e811-43e2-6ea8-edf452093223.png)

先程と同様にメインクラスを作り、今度は"Edit Configuration" から sbt run を行う sbt Taskを追加。
タスクを実行すると

![1-sbt-run-task.png](https://qiita-image-store.s3.amazonaws.com/0/246831/ad3e1650-5b7f-e3fb-a1cb-b01ac3579a2b.png)

```
[info] Loading project definition from /Users/yossy6954/IdeaProjects/HelloScalaSbt/project
[info] Loading settings from build.sbt ...
[info] Set current project to HelloScalaSbt (in build file:/Users/yossy6954/IdeaProjects/HelloScalaSbt/)
[info] Running com.yossy6954.HelloScalaSbt 
Hello Scala
[success] Total time: 1 s, completed 2018/06/14 19:57:55
```

動きました。ターミナルでプロジェクトのディレクトリに移動し、sbt run でも同様に動作します。
次からは Play2 やっていきます。
Railsのだいたい。ActiveHogeとかActionPageとか

#はじめに
こちらの記事はRuby on Railsのおおよその機能復習用の記事です。ActiveHogeとかActionPageとか、そのへんの内容を、大まかにまとめてます。
#Rails ver...
Ruby on Rails 5.2
#ActionHoge, ActivePage一覧
・ActiveRecord
・ActiveModel
・ActionController
・ActionMailer
・ActionView(erb, slim, haml )
・ActionDispatch
・ActiveJob
・ActionCable(new!)
・ActiveSupport
・ActiveStorage(new!)
、、、
#RailsMVCにおけるActiveHoge, ActionPage
##Model
- ActiveRecord::Base
 - 基本的なデータベースを操作するModelClassのおじいちゃん
- ApplicationRecord < ActiveRecord::Base
 - ActiveRecord::Baseを親に持ち、各ModelClassを子に持つ。みんなのお父さん。
- ActiveModel::Model 
 - Hoge::Page < ActiveModel::Model等で定義。Hogeに対して, moduleであるActiveModelをHoge::Page(Hogeの細かな動作)に継承する事により、Hogeに対する細かな操作を分離する実装が出来る。moduleで定義したりも
 - 二重コロンに関して参照: https://qiita.com/ktarow/items/772014a4f0d48905f3ef


##Controller
- ActionController::Base
 - controller全員のおばあちゃん
- ApplicationController < ActionController::Base
 - ActionController::Baseを親に持ち、多くは各Model毎のコントローラを子に持つ。みんなのお母さん。
- ActionMailer::Base
 - Mailerのおばあちゃん
- ApplicationMailer < ActionMailer::Base
 - ActionMailer::Baseを親に持ち、Mailerそれぞれのclassを子に持つお母さん。Modelでの処理に対して適切な子Mailerの該当メソッドを呼び出し、メールを送ったりする。
 
##View
- ActionView(erb, slim, haml )
 - 同じ名前のコントローラディレクトリにdefaultでは配置される。コントローラのメソッドはdefaultで各viewに対してのrenderをしており、用途により(api使用など)render json: {}等で対応する。
 - erb, slim, haml等のテンプレートエンジンにより、railsが用意している便利なメソッド達とhtml, cssを上手く組み合わせることが出来る。
 - 最近では、viewを使わずコントローラを完全なapiとして、vueやreact等のjsでフロントを構成する事が多い。簡単なCMSではviewを使うのが良いだろう。組み合わせることも可能である。

#その他
- ActionDispatch
 - config/route.rbにrouteを記載することにより、コントローラのルートをいい感じにしてくれる、、、だと、、、思う、、、多分他にもいっぱい、、なにか、、してる、、、求む、、、知識、、、
- ActiveJob
 - バックグラウンドで勝手に処理してほしいことをjobとしてキューに登録することが出来る。
- ActionCable (new!)
 - WebSocketとRailsをいい感じにしてくれる。チャット等が実装しやすくなった。Pub, Sub, Channelの考え方でいい感じにしてくれる。いい感じに、、、、
- ActiveSupport
 - includeしてmodule化して、modelやらの拡張機能を追加する時に便利なクラス。部分的に機能をrequireしてつかったりもしたり。いろんなメソッドに対して様々な拡張機能を持っている。modelが肥大化したりした時にmoduleに切り分ける時などに
- ActiveStorage (new!)
 - ファイルの保存先をいい感じに設定できる機能
config/storage.ymlに使用するストレージの情報を登録して、モデルの該当カラムにhas_OO_attachedを宣言することにより、使用可能。
  - 可能ストレージ
  - ・ローカルディスク
  - ・Amazon S3
  - ・Google Cloud Storage
  - ・Azure Storage
  - ・Mirror Service

#終わりに
大まかな概要しかつかめていません。ActiveSupportやActiveModel等の使いこなしは、実務で培って行きたいと思っております。また、ActionCableやActiveStorage等、新しい魅力的な機能も出てきたので、そこら辺を使ったサンプル等も、今後作ってQiitaでまとめられたら良いなと思います。間違ってる点はガンガン教えて頂けましたら幸いです。
Amazon S3にアップロードしたファイルの完全性を確認する

# はじめに

タイトル通りです。
aws-sdk を使ってでs3にファイルをアップロードする際に、アップロードがきちんとできたかどうかを確認したいことがあると思います。
やり方としては、アップロードの際に `Content-MD5` にアップロードするmd5を指定する、というものです。
そのための方法を解説している記事はあったのですが（[これ](https://qiita.com/imaifactory/items/4745bde5af1f3d07fdfb)とか）、実際にmd5が異なっていたらアップロードが失敗することを確認しているものが少ないようだったので試してみました。

今回はjavascriptを使ってみます。

# アップロード時の完全性担保

s3でアップロードしたファイルの完全性を担保する場合、ContentMD5というパラメータを使います。
こちらはアップロードした際にアップロードしたファイル（マルチパートアップロードの場合、アップロードしたパート）のmd5をリクエストに付与すると、s3側で受け取ったファイルのmd5と照合を行なってくれるというものです。

aws-sdk for javascript で `putObject` によりファイルのアップロードをしたい場合、以下のようになります。

```javascript:upload.js
var AWS = require('aws-sdk');

var credentials = new AWS.SharedIniFileCredentials({
  profile: "profile_name"
});
AWS.config.update({
  region: 'ap-northeast-1',
  credentials: credentials
});

var storeItem = 'hello, world';

var MD5 = require('md5.js');
var md5binary = new MD5().update(storeItem).digest();
console.log(md5binary);
console.log(md5binary.toString('hex'));
md5sum = md5binary.toString('base64');

var s3 = new AWS.S3();
s3.putObject(
  {
    Bucket: 'bucket_name',
    Key: 'tmp.txt',
    Body: storeItem,
    ContentMD5: md5sum
  },
  function(err, data) {
    if (err) console.log(err, err.stack);
    else console.log(data);
  }
)
```

クレデンシャルやバケット適宜読み替えてください。

これを実行してみると

```bash
% node index.js
<Buffer e4 d7 f1 b4 ed 2e 42 d1 58 98 f4 b2 7b 01 9d a4>
e4d7f1b4ed2e42d15898f4b27b019da4
{ ETag: '"e4d7f1b4ed2e42d15898f4b27b019da4"' }
```

となり、s3にファイルのアップロードが可能です。
今回は `putObject`関数で単一のアップロードをしているので、s3のetagはファイルのmd5と一致します。
実際に `echo` コマンドと `md5` コマンドを使って確認してみると、確かにアップロードしたファイルのetagと一致しています。

```bash
% echo -n "hello, world" > foo.txt && md5 foo.txt
MD5 (foo.txt) = e4d7f1b4ed2e42d15898f4b27b019da4
```

# データ破損をcontent md5で検知する

と、言いましたが、意図的にデータの破損をさせることは難しいです。
なので今回は、

- 「データが破損した」
- ＝「アップロードしたファイルのmd5が変わった」
- ＝「アップロードしたファイルのmd5がアップロード時に指定したmd5と異なっている」

と読み替え、アップロードしたファイルのmd5と指定したmd5が異なる場合の挙動を確認してみます。

そのために以下のようにソースコードを変更し、

```diff
 var storeItem = 'hello, world';

 var MD5 = require('md5.js');
-var md5binary = new MD5().update(storeItem).digest();
+var md5tmp = new MD5().update(storeItem);
+md5tmp._a += 1 // 適当にmd5を改ざん
+var md5binary = md5tmp.digest();
 console.log(md5binary);
 console.log(md5binary.toString('hex'));
 md5sum = md5binary.toString('base64');
```

`ContentMD5` で指定するmd5をアップロードされるファイルのものと異なるようにします。
これを実行してみると、

```bash
% node index.js
<Buffer 7c cc 99 9c e3 1c 12 7e 22 18 90 79 53 5a 2a 9e>
7ccc999ce31c127e22189079535a2a9e
{ BadDigest: The Content-MD5 you specified did not match what we received.
    at Request.extractError (...
    ... )
  message: 'The Content-MD5 you specified did not match what we received.',
  code: 'BadDigest',
  region: null,
  time: xxx,
  requestId: 'xxx',
  extendedRequestId: 'xxx',
  cfId: undefined,
  statusCode: 400,
  retryable: false,
  retryDelay: xxx }
```

としっかり失敗します。
適切にmd5を設定できれば、アップロード時のビット欠落等によるアップロードエラーを検知できることがわかります。

今回は単純なputObjectで試しましたが、マルチパートアップロードの場合には、各パートごとにアップロードの完全性担保が必要になります。
具体的には、`putObject` の場合と同様に `uploadPart`でアップロードするパートのmd5を指定すればいいだけです。
git: git stashの使い方

## 概要
- git stashの基本的な使い方

## git stashとは
- gitのコマンドの1つ。
- 変更差分をコミットせずに一時的に退避させることで保存できる。
- 作業中に他のブランチでの作業が必要になったときなどに便利。

## 使い方
### `git stash`
- 変更差分を退避させる。
- untracked fileは退避されない。

### `git stash -u`
- untracked fileも含めて変更差分を退避させる。

### `git stash save コメント`
- 退避にコメントをつけられる。
- `git stash list`で退避のリストを見るときに便利。

### `git stash list`
- 退避させた変更の一覧表示。
- `git stash save`で保存すると何の差分がわかって便利。

### `git stash list -p`
- `git stash list`と`git diff`の合わせ技。
- あんまり見やすくないし、`git stash save`でコメント残しておけば良いので自分はあまり使わない。

### `git stash apply`
- 退避させた変更を戻す。
- 複数の退避がある場合、最新のものを戻す。
- 最新のものより前の変更を戻す場合は`git stash apply 2`のような形で退避リストの何番目かを指定。
- 何番目かは`git stash list`で確認できる。
- 戻した内容は退避リストに残ったまま。

### `git stash pop`
- `git stash apply`の、戻すと同時に退避リストから削除するバージョン。

### `git stash drop`
- 退避リストから変更を削除する。
- `git stash pop`と同じく、最新の変更が削除される。
- 最新以前のものを削除する場合は`git stash drop 2`みたいな感じで。

### `git stash clear`
- 退避リストを全部削除する。
CubismJsComponents(Cubism 3 SDK)でメッシュのクリック検出

# 動機
[CubismJsComponents](https://github.com/Live2D/CubismJsComponents "CubismJsComponents")でSDK 2.1のhitTest()みたいなことをしたかった。

# 結論
containsPoint()を使う。

# 例

## クリック座標が特定のメッシュ上かどうか
appはPIXI.Application(), modelはPIXI.modelBuilder()で読み込んだもの。

```javascript
const meshName = {クリックを検出したいメッシュ名}

app.view.addEventListener('click',(e)=>{
  const clickPoint = new PIXI.Point(e.clientX, e.clientY)
  if(model.getModelMeshById(meshName).containsPoint(ClickPoint)){
    console.log("メッシュ上にある！")
  } else {
    console.log("メッシュ上にない！")
  }
})

```

もっといい方法があれば教えてくださいm(_ _)m
amazon linuxでNode.jsのNEM開発環境を爆速で整える


pythonでのNEM開発環境を説明しましたので、次はNode.jsの開発環境の説明です。
今回はサーバを立ち上げてURLでアクセスするとアカウントを作成するところまで行きます。

nvmをインストールします。

```
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
```

```
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" 
```

node.js のインストール

```
nvm install v8.11.3
```

必要ライブラリのインストール

```
npm install nem-library
npm install url
npm install express
npm install body-parser
```

サーバプログラムです。
nem-libraryをjsで書く方法はDaokaさんに教えていただきました。
TypeScriptじゃなくても動きます。

```js:node.js

const url        = require('url');
const express    = require('express');
const bodyParser = require('body-parser');
const nem        = require("nem-sdk").default;

var app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(function(req, res, next){
    res.header("Access-Control-Allow-Origin","*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
})

app.listen(1337);

const nemlibrary = require('nem-library');
const NetworkTypes = nemlibrary.NetworkTypes, Password = nemlibrary.Password, SimpleWallet = nemlibrary.SimpleWallet;
nemlibrary.NEMLibrary.bootstrap(NetworkTypes.TEST_NET);

app.get('/account', (req, res) => {

	const password = new Password("password");
	const simpleWallet = SimpleWallet.create("simple wallet", password);

	res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
	res.write(simpleWallet.address.pretty());
	res.end();
});

```
CSSで三角矢印を描画




```
CSSのみで三角形を作る方法を解説するよ！｜ついでに扇型や吹き出しも作ってみる - アイデアハッカー
http://ideahacker.net/2013/07/26/5962/
```

```HTML
<div class="sankaku"></div>
```

```CSS
.sankaku{
	width: 0;
	height: 0;
	border: 80px solid transparent;
	border-top: 80px solid #f00;
}
```

##横長三角

```CSS
.sankaku{
	width: 0;
	height: 0;
	border-top: 30px solid #f00;
	border-right: 80px solid transparent;
	border-bottom: 30px solid transparent;
	border-left: 80px solid transparent;
}

    &__nav {
      @include tb($point-tb) {
        width: 1260px;
        margin: 0 auto;
        display: block;
      }
      &Arrow {
        display: block;
        position: absolute;
        top: 50%;
        z-index: 10;
        @include sp($point-sp) {
          width: (38px/2);
          height: (38px/2);
          margin: (-38px/4) 0 0 0;
        }
        @include tb($point-tb) {
          width: 38px;
          height: 38px;
          margin: (-38px/2) 0 0 0;
        }
        a {
          position: relative;
          &:before {
            content: '';
            position: absolute;
            display: block;
            left: 0;
            top: 50%;
            border-top: 1px solid #fff;
            border-right: 1px solid #fff;
            @include sp($point-sp) {
              width: (38px/2);
              height: (38px/2);
            }
            @include tb($point-tb) {
              width: 38px;
              height: 38px;
            }
          }
        }
        &.left {
          transform: rotate(225deg);
          left: 20px;
        }
        &.right {
          transform: rotate(45deg);
          right: 20px;
        }
      }
    }
```
BacklogにGyazoの動画キャプチャを埋め込みする


動きの修正指示に動画を埋め込みたい場合に使えます。
YouTubeの埋め込みも追って作成しますね。

backlog設定条件
マークダウン記法を設定


backlogの課題にGyazo動画キャプチャを貼りたい場合がある。
以下のようにURLの後ろに/rawと付けると動画のプレビューが可能です。


```Backlog
![Alt text](https://gyazo.com/1860c872018a1e6bdee7d34eaf18b6f8/raw)
```
WinMergeのようにMacで差分ファイルを比較「CompareMerge」

納品で「前回とのコード差分をください」という場合、
gitの履歴があるけどコミット多すぎて、コードの差分を見たい場合があります。

Windowsの「WinMerge（ウィンマージ）」の代替となるソフト、
Macの差分比較ファイル「CompareMerge（コンペアマージ）」の使い方をご紹介します。

Terminalやエディタの差分比較は多数ありますが、GUIで操作できるなどメリットが多いです⌨️

## CompareMergeのメリット👍

<img width="226" alt="アイコン画像 CompareMerge（コンペアマージ）" src="https://qiita-image-store.s3.amazonaws.com/0/29272/71f3df75-0ba2-6b28-b79a-751de45cb553.jpeg">

- 日本語のGUIで操作できる👌わかりやすい
- HTMLで比較ファイルが作れる💡納品時に助かる

## 操作画面
![e663ea418070d652694e13f80eac6e84.png](https://qiita-image-store.s3.amazonaws.com/0/29272/e800371c-94d3-fa3a-4446-38e550e77cbd.png)
比較するファイル／フォルダをドロップします。
比較方法はサイズ、日付の設定が可能です。

## ファイル一覧を抽出

![cea20aad06ff2449321507a25e2c06c3.jpg](https://qiita-image-store.s3.amazonaws.com/0/29272/c1ae1f90-9ec0-cbfb-e261-15748b554ee9.jpeg)

差分ファイル一覧をフォルダ単位で一覧にしてくれます。
削除・追加ファイル、差異の有無がひと目でわかります。

## コード内部の変更箇所を抽出

![81e1f6adc3d258b6d49bf2da07682d8a.png](https://qiita-image-store.s3.amazonaws.com/0/29272/31203a80-731b-de1b-365b-63dd9f52b760.png)

変更箇所がビジュアルで確認できるので、具体的な箇所の説明や納品物に便利です🙌


## ソフトのダウンロード

### 有料ダウンロード
‎「CompareMerge」Mac App Store - 有料ソフト 1,700円
https://itunes.apple.com/jp/app/comparemerge/id478570084

### 無料ダウンロード
http://sourceforge.net/projects/comparemergenosandbox/
無料でダウンロードはこちらの英語サイトから可能です。

## 参考URL

<a href="http://d.hatena.ne.jp/soratomo0714/20150826/p1" target="_blank">【Mac】WinMergeに1番近いMac用高性能Diff（差分表示）アプリ「CompareMerge」（日本語対応） - Web関連あれこれ</a>

#こちらの記事の最新情報
メンテナンス済の最新記事をブログで公開してます。

WinMergeのようにMacで差分ファイルを比較する無料ソフト「CompareMerge」（2019年7月）｜エンジニアの日々効率化
https://keycode.digital/develop/586/
Supervisor の conf で HOSTNAME を当てたい

## Supervisor の conf で HOSTNAME を当てたい

下記のような設定ファイルに `$HOSTNAME` を渡したいとときは `$HOSTNAME` を渡すのではなく、 `%(host_node_name)s` で渡します。 ちなみに `%(HOSTNAME)s` はダメでした。

```sample.ini
[program:sample]
command=/bin/sample　--env HOSTNAME=%(host_node_name)s
```

詳しくはこちら http://supervisord.org/configuration.html#program-x-section-values
EC2をSageMakerのように使う

# DeepLearning Ami をSageMakerみたいに使う

##主旨

AWS SageMakerはデータを貯める、学習する、デプロイする、というのは便利だが、
実際にあるデータをゴニョゴニョいじるには、癖がある。
特に、会社に入ってきた新人に使わせるには覚えさせることが多すぎる。

そんなわけで、立ち上げたら簡単にJupyterノートブックが見えるEC2を作ってみました。
基本的に、DeepLearningAmiをベースに、下記の変更を加えます。

### 手順1

下記のファイルを新規で置きます。
起動時にスタートアップで実行するスクリプトです。

```shell
# systemディレクトリを作ります。
mkdir system
# cat でスクリプトを書き込みます
cat > system/start.sh
```


##### 下記ペーストして、Ctrl+Dで終了。
```sh:/home/ubuntu/system/start.sh
#!/bin/bash
jupyter notebook --ip=* --no-browser --config=/home/ubuntu/.jupyter/jupyter_notebook_config.py &
logger 'juyter start...'
```

---

### 手順2

/etc/rc.localを変更します。
なければ下記のようなファイルで新規に置きます。
sudo vi /etc/rc.local
で編集します。

```sh:/etc/rc.local
su -l ubuntu -c 'sh /home/ubuntu/system/start.sh'
exit 0
```

---

### 手順３

シェルで下記を実行します。
jupyterの設定を変更しています。
とくに、トークンでパスワードを設定しています。(変更して使ってください。)
あとブラウザが必要ない状態で立ち上がる。
start.shに実行権限を付与。

```
echo c.NotebookApp.token = "password" >> .jupyter/jupyter_notebook_config.py 
chmod +x /home/ubuntu/system/start.sh 
```

### 上記でうまくいかなかった、手順４

jupyter_notebook_configの書き込みに失敗しました。
"password"がpasswordになってしまって、クオーテーションが消えてしまっていた。
手動で対応する必要あり。echoじゃどうすればいいのか、なんかありそうだけど。。

```shell
vi .jupyter/jupyter_notebook_config.py
```
で最後の行のpasswordを"password"に変更
arXivから機械学習系の論文を購読する

# arXiv
プレプリントサーバーのarXivから機械学習やComputer Vision系の論文を購読しようと思ったけど、方法を忘れて調べなおしたので、そのメモ。

arXivは、論文を公開することのできるサービスです。研究者は、論文誌に投稿する際などに、一緒にこちらにも流すことが多いかと思います。

https://arxiv.org/

arXiv宛に購読のメールを送ることで、自分の関心のある分野の投稿を購読することができます。

査読前の論文なので、読む際のクオリティチェックは自身で行う必要があります。

## 購読方法

購読方法は [arXiv.org help - To Subscribe to the E-Mail Alerting Service](https://arxiv.org/help/subscribe) に書かれていますが、以下のような形式でメールを送ることでできます。

```
To: "購読したい分野のクラス名"@arxiv.org
Subject: subscribe "自分の名前"
add "カテゴリー"
```

分野の一覧は https://arxiv.org/help/archive_list より参照できますが、機械学習、Computer Vision系の論文を購読したい場合は、`Computer Science`の中の`Computer Vision and Pattern Recognition`が該当します。

この場合、クラス名は`cs`、カテゴリは`Computer Vision and Pattern Recognition`になるので、

```
To: cs@arxiv.org
Subject: subscribe "自分の名前"
add Computer Vision and Pattern Recognition
```

により、購読することができます。

## 購読の解除
購読の解除は`add`の部分を`del`に変えることでできます。

```
To: cs@arxiv.org
Subject: subscribe "自分の名前"
del Computer Vision and Pattern Recognition
```

## まとめ

```
To: cs@arxiv.org
Subject: subscribe "自分の名前"
add Computer Vision and Pattern Recognition
```
二次元画像からの三次元物体検知に関する論文

#概要
二次元画像内の三次元オブジェクトに対して*3D bounding boxes* を設定し、立体的な位置関係を明らかにしている

#特筆すべき点
・従来は画像内の元の状態（物体がない状態）がわからなければ三次元的に捉えることができず、一般化できなかった
・従来の技術では実行時間が多くかかった
・multilayer perception(MLP)によってオブジェクトの位置と大きさを学習させた
・従来技術よりも4.7倍の速度での実行が実現できた
・サーチスペースを減らすことで実行速度を早めるだけでなく、3D分類を正確にできるようになった
#すごい点
・この技術により、機械のカメラによって現実世界を三次元的に捉えられるようになり、機能の向上が望める
・実行速度が速いのでリアルタイムで三次元的情報を扱った機能を提供できる
・よりinteractiveな機能を望める

##論文

>引用元
2D-Driven 3D Object Detection in RGB-D Images
https://ieeexplore.ieee.org/document/8237757/
全てのシステムの設定ファイルの場所を表示させる方法

gitconfigの場所がわからなかったので調べていたら、git以外のシステム設定にも役立ちそうな情報を見つけたのでメモ。

https://stackoverflow.com/questions/12117957/global-git-file-location-linux

上記のサイトによれば、man git configコマンドですべてのシステムの設定ファイルの場所が表示されるらしい。
Vue.jsにて郵便番号からの住所自動入力

javascriptにおける郵便番号からの住所自動入力で有名なライブラリにajaxzip3がある。
今はさらに使いやすくなってYubinBangoというライブラリがある。

https://github.com/yubinbango/yubinbango

これは非常に簡単便利:thumbsup_tone1:
しかし、今回取り上げるのはYubinBangoではなく、
そのコアライブラリであるYubinBango-Coreのほう。
ajaxzip3もYubinBangoも内部ではYubinBango-Coreを使っている。

https://github.com/yubinbango/yubinbango-core

何故YubinBango-Coreなのかというと、
今回、Vue.jsで作ったフロントで住所を自動入力出来るようにしたのだが、
YubinBangoは単体で使われることを想定されていて、Vue.jsからは使いづらい。
具体的にはinputのvalueは変わっても、inputに関連付けられたVue.js内のデータは変わらないんですね。上っ面だけ値が変わっても意味がない。

というわけでVue.jsからYubinBango-Coreを使ってみる。
本当なら`npm install yubinbango-core`から`require`などで読み込みたいのだがうまくいかず。誰か教えてください:pray_tone1:
別の方法ということで、ここはjsを直接読み込む。

```
<script src="https://yubinbango.github.io/yubinbango-core/yubinbango-core.js" charset="UTF-8"></script>
```

続いてVue.js内では郵便番号をwatchする。

```
export default {
    data() {
        return {
            zip: null,
            pref_id: null,
            locality: null,
            street: null,
        }
    },
    watch: {
        zip: function(zip) {
            let _this = this
            new YubinBango.Core(zip, function(addr) {
                _this.pref_id  = addr.region_id // 都道府県ID
                _this.locality = addr.locality  // 市区町村
                _this.street   = addr.street　  // 町域
            })
        }
    }
}
```

注意点としては`new YubinBango.Core()`でのコールバックでは`this`がVue.jsの`this`ではなくなってしまうので、
変数に`this`を入れてVue.jsのデータを操作しないといけない。懐かしい:sob:
これで住所を自動で補完出来ます。簡単:thumbsup_tone1:
だけど本当は`require`したいですね:sob:
GitHub Pages のカスタムドメインで HTTPS 証明書が発行されないとき

以前から custom domain で運用している GitHub Pages で、`Unavalable for your site because a certificate has not yet been issued` と出て `Enforce HTTPS` がオンに出来なかった。
ちょうど GitHub 社の方が近くにいたので聞いてみた話をメモする。

- 設定直後ならしばらく待ってみる
- 時間が経ったのに発行されない場合
    - CNAME を一旦消して deploy, 再作成して再度 deploy で作成されるかも
    - またはサポートに問い合わせて手動で発行してもらう

今回の場合だと CNAME の削除・再作成を試してみて、数分で発行ができた。
IB Designables: Failed to render and update auto layout status が出たときの対処法

# IB Designables: Failed to render and update auto layout status が出たときの対処法

## 現象
iPhoneアプリ開発をしていて、CocoaPodsで落としてきたライブラリを利用したとき、Storyboardで「IB Designables: Failed to render and update auto layout status...」というエラーが出るときがあります。
その対処法です。

## 構成
- Xcode 9.4.1
- CocoaPods 1.5.3

## 対処方法
1. 殆どの場合)
　Xcodeを閉じる => pod update => Xcode 起動 => Xcode clean => Xcode build => 「Editor > Refresh All Views」
2. 1で直らない場合)
　Xcode 「Prefarences... > Locations > Derivied Data にあるパスの右にある矢印アイコンからDerivedDataフォルダをFinderに表示」 => DerivedDataをフォルダごと削除 => 1を最初から試す
3. 2でも直らないとき)
　CocoaPods pod --version => 1.5.0以上の時 Podfileにこれを追加

```Podfile.
post_install do |installer|  
  installer.pods_project.build_configurations.each do |config|
    config.build_settings.delete('CODE_SIGNING_ALLOWED')
    config.build_settings.delete('CODE_SIGNING_REQUIRED')
  end
end
```
どうも1.5系のバグらしい。
Macでパスワード付きzipをコマンドだけで作成する

すぐに忘れちゃうので備忘録として。

# やりたいこと

Windowsでも問題なく開けるパスワード付きのzipをMacで作成したい。

# 環境

```shell-session
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1408
```

# 必要なもの

##pwgen##
ランダムな文字列を生成してくれるツール

```shell-session
$ brew install pwgen
```

# zip作成手順

## 1. パスワードを生成してコピーする

```shell-session
$ pwgen 8 1 | pbcopy
```
## 2. zipを作成する

```
$ zip -e [zipファイル名].zip [zipにしたいファイル1] [zipにしたいファイル2] ...
Enter password:    # 先程コピーしているパスワードをペースト
Verify password:   # 同上
```


# 参考
http://baqamore.hatenablog.com/entry/2017/03/31/042735
https://qiita.com/icedpasta1832/items/57d0d9805f04b6e79875
Virtualenvを使いたい!

## やりたいこと
プロジェクトごとにライブラリを分けたい！

## 環境

### ubuntu
```
~/ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
```
### Pythonのバージョン
```
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
```

### pipのバージョン
```
pip 10.0.1 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)
```

## virtualenvをpipでインストール
```
pip install virtualenv
```

## バージョンの確認
``` 
~/ virtualenv --version
16.0.0
```

## virtualenvでプロジェクトフォルダを作成

```
virtualenv -p [Pythonの場所] [プロジェクト名]
```

## virtualenvの環境に入る
```
. [プロジェクト名]/bin/active
```

## virtualenvの環境から出る
```
deactivate
```
Ingress でヘルスチェックのリクエスト先を変更する

# はじめに

* GKE の Ingress ではヘルスチェックのためにデフォルトで `GET /` へリクエストを送信し、ステータスコード `200` が返ってくることを期待している。
* このリクエスト先のパスを変更するには、Ingress のバックエンドのコンテナの `readinessProbe` を設定すれば良い。
  * 作成済みの Ingress のバックエンドの `readinessProbe` を変更した場合、リクエスト先の変更には時間がかかるので注意が必要。

# 設定例

* 以下は素の Nginx の Deployment と Service と Ingress を立ち上げて、ヘルスチェック先を `/healthcheck` に変更する例。

```deployment.yml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /healthcheck
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
```

```service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx-service
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: nginx
```

```ingress.yml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  backend:
    serviceName: nginx-service
    servicePort: 80
```
VBAで自動的にサイトへログインをする

「VBAで自動的にサイトへログインする」までの検証。

↓まずはサイトへ自動的に飛ぶとことから↓
-----------------------------------------------------------------------------

```vb
Dim GCObj
Set GCObj = CreateObject("WScript.Shell")
GCObj.Run ("表示させたいURLを入力")
```

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


これで問題なく表示させることができた。

↓次はログインまで↓
-----------------------------------------------------------------------------

```vb
Sub logIn()
 
Dim objIE 
Set objIE = CreateObject("Internetexplorer.Application")
 
objIE.Visible = True
 
Dim strUrl
strUrl = "ログインするサイトのURL"
 
objIE.navigate strUrl
 
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE 
 DoEvents
 
Loop
 
Dim htmlDoc
Set htmlDoc = objIE.document
 
htmlDoc.getElementById("ログインid").Value = "自分のidを入力" 'id="ログインid"
htmlDoc.getElementById("password").Value = "自分のパスを入力" 'id="password"
htmlDoc.getElementById("ログインfrom").submit
 
End Sub
```

-----------------------------------------------------------------------------
cakephp3 debug_kitが表示されない

cakephp2系の時はpluginフォルダに入れるだけだったんだけど、
cakephp3系では元から入ってるけど表示されなくて
苦労したんでメモ代わりに書いておく。

###前提条件
[公式サイト](https://book.cakephp.org/3.0/ja/installation.html)通りにComposerでインストールしていることが前提。

下記の内容がtrueになっているか確認。

```cake:./config/bootstrap.php
if (Configure::read('debug')) {
    Plugin::load('DebugKit', ['bootstrap' => true]);
}
```

#結論
```linux:./vendor/cakephp/debug_kit/config/bootstrap.php
if (!$service->isEnabled() || php_sapi_name() === 'cli' || php_sapi_name() === 'phpdbg') {
    return;
}
```
この行を下記のように変更する。

```linux:./vendor/cakephp/debug_kit/config/bootstrap.php
if ( php_sapi_name() === 'cli' || php_sapi_name() === 'phpdbg') {
    return;
}
```

####理由

開発サーバーか本番サーバーどうかをcake側が勝手に判断してデバックキットを表示しないようにしていた為。
今回やったのはどの環境でもdebug_kitを出すようにしていつも通り「bootstrap.php」で表示するか判断できるようにした。

[参考サイト](http://kojirooooocks.hatenablog.com/entry/2018/04/19/021442)


##追記（2018年6月19日）
debug_kitのプラグイン内部のコードを書き換えなくてもできますよとコメントで頂いたので修正。

インストール直後は`./config/bootstrap.php`の一番下に書いてあることが多い。
`if (Configure::read('debug')) {}`の場所でdebug_kitのプラグインを読み込む
ここを改修する。

```linux:./config/bootstrap.php
if (Configure::read('debug')) {
    Configure::write('DebugKit.forceEnable', true);
    Plugin::load('DebugKit', ['bootstrap' => true, 'routes' => true]);
}
```

>Configure::write('DebugKit.forceEnable', true);

これをtrueにすることで開発サーバーか本番サーバーにかかわらずに
必ずdebug_kitを表示させるようになる。
この書き方の順番だとdebug_kitを読み込んだ後に上書きする形で読み込むので必ず表示するようになる。
curlのインストール

#curlとは
コマンドラインからhttp/httpsアクセスするためにツールになります。
APIを利用する場合によく使われます。

##curlのインストール
[curlのサイトhttps://curl.haxx.se/](https://curl.haxx.se/)のからダウンロードします。
※Windows10 64bitの場合の手順になります。

サイトにアクセスしたら一番上のメニュー画面のDownloadをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/047239ff-5413-4315-b3ad-2b05dde5aa61.png)

したのほうにスクロールするとWindows用のファイルが置いてあるので
一番した（7.60.0のバージョン）のzipファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/d1ae189e-34aa-c37d-e9e8-3334283796fa.png)

ダウンロードしたらファイルを解凍します。
これで準備完了です。

##curlを使う
コマンドプロンプトを立ち上げます。
僕がよくやるのはデスクトップしたの検索窓に`cmd`と入力します。
するとコマンドプロンプトが検索ででてくるのでクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/eb92f429-bb5c-2c35-3400-27a36962962c.png)

プロンプトを立ち上げたら先ほど解凍したフォルダに移動します。
私の場合は下記のフォルダにcurlの実行ファイルがあるので、黒枠のところをクリックして、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/56ffaba1-e753-63c8-451b-0b49b8f2af97.png)

出てきた文字列をコピーします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/f418b66e-4459-2152-e00f-98653e8e0985.png)

コマンドプロンプトに戻り、 `cd `と入力して先ほどコピーした文字列を貼り付けます。すると実行ファイルがあるところに移動できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/e4136d5e-0b82-0ff0-ab4e-6292be931840.png)

`curl.exe --version`と入力してバージョン情報が表示されれば問題ありません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/698a1767-2ddd-00af-c4b0-b117e3bd8757.png)

それではコマンドでyaooにアクセスしたいと思います。
コマンドプロンプトのデフォルト文字コードがUTF-8ではないため
`chcp 65001`と入力しエンターを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/217fdb30-523f-f0cc-72e7-cd08102ffca8.png)


`curl.exe https://www.yahoo.co.jp`とコマンドを入力し結果が取得すれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264504/fe829350-9351-e520-8917-0f2fbbe79e53.png)
Pythonの疎行列から要素を出力し、C++の配列に代入する

#はじめに
Pythonのsparse matrixをどうしてもC++のvector配列にして使いたいということで僕が行った作業をメモしておく。

#全体の流れ
1.[Python]疎行列要素の出力
2.[C++]読み込み、代入

##[Python]疎行列要素の出力

scipyで作成した疎行列（非ゼロ要素のみを格納している行列）をCSVファイルに出力。

```python
from scipy import io
io.mmwrite('AVWeight',author_venue)
with open('AVWeight.mtx','r') as t:
          lines = t.read().split('\n')  
          lines = lines2[3:]  

import os
import csv
with open('AVWeight.csv', 'wt') as f:
    writer = csv.writer(f)
    for l in lines:
        dat = l.split()
        if len(dat) == 3:
            # 行列位置を０オリジンに
            dat[0] = int(dat[0]) - 1
            dat[1] = int(dat[1]) - 1
            writer.writerow(dat)
```

```sh
$ cat AVWeight.csv 
0,15,2.300000000000000e+01
0,16,4.900000000000000e+01
0,17,1.000000000000000e+01
:
5637,18,1.000000000000000e+00
5638,5,5.000000000000000e+00
5638,6,1.000000000000000e+00
```
あとはこのCSVファイルのインデックス、値を読み込み代入。

#2.[C++]読み込み、代入
##カンマを取り除く
C++の読み込み的にカンマがないほうがやりやすかったため、trコマンドを利用してカンマをスペースに

```shell
$ cat AVWeight.csv | tr ',' ' ' > AVWeight.csv
```

```sh
$ cat AVWeight.csv 
0 15 2.300000000000000e+01
0 16 4.900000000000000e+01
017 1.000000000000000e+01
:
5637 18 1.000000000000000e+00
5638 5 5.000000000000000e+00
5638 6 1.000000000000000e+00
```

##代入
getlineとsscanfを使ってインデックス、値を読み込み代入する。
ここでは二次元vector配列に代入する例を示す。

```c++
#include <string>
#include <iostream>
#include <vectro>
#include <fstream>
using namespace std;

	    int row,col;
	 	int val;
	 	char c[10];
	 	ifstream ifs("AVWeight.csv");
	 	while(getline(ifs,str)){
		 	str.copy(c, 10);
		  	sscanf(c, "%d %d %d", &row, &col, &val);
		  	W[col][row] = val;
		}

```

getline で行を読み取り
sscanfでスペースで区切られた数値を読み込む。

#まとめ
今回は既存のプログラムを利用したいため、vector配列に入れることを目標にした。
しかしC++でもmap型等を使って疎行列を作るほうが好ましい。（結果論）