OmniAICreator/Qiita-1.07M huggingface dataset:
Rspec実装時のエラー

# Rspec実装時に謎のエラー
rspecをポートフォリオに入れようとし`bundle install`すると謎のエラーが、、、、

```
$ bin/rails g rspec:install
Running via Spring preloader in process 24630
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Deprecation warning: Expected string default value for '--test-framework'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Could not find generator 'rspec:install'. Maybe you meant 'channel', 'assets' or 'scaffold'
Run `rails generate --help` for more options.
```

謎すぎて解決するまで２時間かかりました泣
環境変数が違うのとか、データベースミスったとか
`Could not find generator 'rspec:install'. Maybe you meant 'channel', 'assets' or 'scaffold'
Run rails generate --help for more options.`
のあたりが怪しいとか色々調べた結果、、、

```
$ spring stop
```
これで解決できました。　古いプロセスに接続していたのが原因だったようです。
初学者がハマらないように記事として残しておきます、、、
Nim：プロジェクトの共同開発時に、nimbleで依存パッケージをローカルの開発環境にインストールする。

# プロジェクトを共有した場合に、自分の開発環境に必要パッケージをインストール

 Githubにリポジトリがあり、それをcloneし、自分のローカルの開発環境に必要なパッケージをインストールする場合は、以下の手順。

```shell

# リポジトリクローン
git clone https://github.com/プロジェクト名

# クローンしたディレクトリに移動
cd プロジェクト名

# nimbleでDependencies（依存ライブラリ）のみインストール
nimble install -dy

```

# インストールしたパッケージの表示

 nimbleファイルのDependenciesを作るには、nimbleコマンドだけでは不可能なのか？
 nimbleのissueを見ると今は実装はないけど、優先度低になっている。

[▶参考：Command to add dependencies into .nimble file](https://github.com/nim-lang/nimble/issues/612)

 手動にしろ、シェルなどを使うにしても、自作する場合、インストールしたパッケージのリストが必要。その場合は、以下のコマンド。


```shell
nimble list -i
```

# パッケージをプロジェクト別に分ける

　ただし、上記をする前提として、パッケージの保存先をプロジェクトごとに分けた方がよいと思われる。その場合は、以下のようにnimbleのディレクトリを指定して、パッケージをインストール。

```shell
nimble install パッケージ --nimbleDir:dirname
```
CocoaPods導入 framework not found FBSDKCoreKit への対処法

<h1>問題点</h1>
Firebaseと連携させたFacebookログイン機能をもつアプリ実装中の出来事です。

CocoaPodsを導入しても、『おい、frameworkが見つからんぞ』
と4時間ほど怒られていたので、備忘録もかねて、記録しておきます。
間違い等あれば、ご指摘頂けると幸いです。

**エラーの内容**
` ld: framework not found FBSDKCoreKit for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation) `

<h1>解決策</h1>
- Podfileのコメントアウト（ platform :iOS,'13.4' ）を解除した（明示的に記述した）。
- Project名 -> TARGETS -> Link Binary With Libraries -> +ボタンから、使用したいframeworkを明示的に取り込む。

<h2>参考資料</h2>
- https://guides.cocoapods.org/syntax/podfile.html#platform
- https://ja.coder.work/so/ios/1813234
- https://stackoverflow.com/questions/30663180/no-such-module-parse
[Spark] RDD (Dataframe) の Partition ID を調べる

# 環境

* Spark 2.4.4
* Apache Zeppelin 0.9.0-preview1
* macOS 10.15 において、 Dockerに環境を構築
* Scala


# 経緯（読み飛ばし可能）

* Sparkの検証、学習をしていると、partition ID を確認したくなることがあります。
* 今まで、mapPartitionsWithIndex()を使って、調べていました。
* itrの型の指定、DF<->RDDの変換が大変だと感じていました。

```
val df1 = spark.range(0, 4, 1, 3)
df1.show

val df2 = df1.rdd.mapPartitionsWithIndex((i:Int, itr:Iterator[java.lang.Long]) => itr.map(l => (l, i))).toDF("id", "partition id")
df2.show

+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
+---+

+---+------------+
| id|partition id|
+---+------------+
|  0|           0|
|  1|           1|
|  2|           2|
|  3|           2|
+---+------------+
```

# 違う記述方法を発見

* 上記の方法以外でも、spark_partition_id() を呼べば partition ID を取得できそうです。
* Zeppelin上では、明示的にimportしなくても使えるに見受けられます。

```
import org.apache.spark.sql.functions.spark_partition_id

val df1 = spark.range(0, 4, 1, 3)
df1.show

val df2 = df1.select(col("id"), spark_partition_id().as("partition id"))
df2.show

+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
+---+

+---+------------+
| id|partition id|
+---+------------+
|  0|           0|
|  1|           1|
|  2|           2|
|  3|           2|
+---+------------+
```
美大生のためのプログラミング入門（随時更新中）

※ Qiita では、本文部分のみの印刷に苦労します。そのため、同じ内容を以下のページにも掲載しています。プリンツアウトしたり PDF 化したい人は、こちらのページを利用して下しさい：

[http://gurakura.sakura.ne.jp/series/美大生のためのプログラミング入門/](http://gurakura.sakura.ne.jp/series/%E7%BE%8E%E5%A4%A7%E7%94%9F%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80/)

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

**第 0 章 はじめに**
https://qiita.com/iigura/items/b5e368bc8bc5e1b86f8b

**第 1 章 準備 - Processing のインストール**
https://qiita.com/iigura/items/d7df16d1a3d74f6ae544

**第 2 章 キャンバスを作る**
https://qiita.com/iigura/items/b70deef1bc5d818d5063

**第 3 章 はじめての描画**
　3.1 直線を描く
　https://qiita.com/iigura/items/fe250cb7cd83241af882
　3.2 直線をより魅力的にする
　https://qiita.com/iigura/items/01e35f7fcd88114b1a42

**第 4 章 四角形を描く**
　4.1 基本的な四角形の描き方
　https://qiita.com/iigura/items/fb10baf070e85b74fbcc
　4.2 自由な四角形の描き方
　https://qiita.com/iigura/items/67d3a287f23de587f406
　4.3 不自由な四角形の描き方
　https://qiita.com/iigura/items/6364347d7dae6b998d8e

**第 5 章 変数**
https://qiita.com/iigura/items/3439e516234fec10c333

**第 6 章　繰り返し（ループ）**
https://qiita.com/iigura/items/0aa9773636dc99e65cdf
docker imageの依存するimageを調べる

# 状況
none：noneなイメージが３０個以上はできていた（汗

containerとvolumeは気をつけていたのだが
imageもdocker image ls -aして確認しないとできるのね（泣

# none：noneなイメージができる原因
検証してくれている記事がありました。
わかりやすい、ありがたや。
[Dockerにnone:noneなイメージが生まれてくる理由](https://suin.io/540)
同じ名前でイメージを作ろうとする動作をさせると
none:noneなイメージが生成されるようです。

# 削除を試みる

```dockerrm.sh

$docker image rm abac5498ae67
Error response from daemon: conflict: unable to delete abac5498ae67 (cannot be forced) - image has dependent child images

```

どうやらimage間でも依存関係（親子関係）があるようでまず親を確認してねと出ています。

# Docker imageの依存関係を確認する｜シェルスクリプト
以下のシェルスクリプトでイメージの依存関係を表示できます。

```dependence-image.sh

for i in $(docker images -q)
do
    docker history $i | grep -q $1　 && echo $i
done | sort -u

```

実行する時は以下のような形です。
コマンドファイルの後ろにコンテナIDを渡してあげると
dependence-image.shの引数として$1に渡して実行できます。

```do.sh

$ ./dependence-image.sh abac5498ae67

```

ソースは以下参考記事そのままです。ありがたや。
[>>Docker imageの削除方法](https://qiita.com/matsuzan/items/d7de91564b1fadec27ca)
Raspberry Pi で IPV6 を使う

Raspberry Pi で IPV6 を使ってみました。

Raspberry Pi で　ip addr を実行

```text
$ ip addr
（省略）
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:22:cf:fb:7b:33 brd ff:ff:ff:ff:ff:ff
    inet6 2001:240:28d5:4900:222:cfff:fefb:7b33/64 scope global dynamic mngtmpaddr 
       valid_lft 14182sec preferred_lft 14182sec
    inet6 fe80::222:cfff:fefb:7b33/64 scope link 
       valid_lft forever preferred_lft forever
```

そこで、他の端末から ping をかけました。

```text
$ ping -c 3 2001:240:28d5:4900:222:cfff:fefb:7b33
PING 2001:240:28d5:4900:222:cfff:fefb:7b33(2001:240:28d5:4900:222:cfff:fefb:7b33) 56 データ長(byte)
64 バイト応答 送信元 2001:240:28d5:4900:222:cfff:fefb:7b33: icmp_seq=1 ttl=64 時間=17.1ミリ秒
64 バイト応答 送信元 2001:240:28d5:4900:222:cfff:fefb:7b33: icmp_seq=2 ttl=64 時間=5.63ミリ秒
64 バイト応答 送信元 2001:240:28d5:4900:222:cfff:fefb:7b33: icmp_seq=3 ttl=64 時間=4.23ミリ秒
```

ssh でログイン

```text
$ ssh 2001:240:28d5:4900:222:cfff:fefb:7b33
Linux tulip 4.19.97-v7+ #1294 SMP Thu Jan 30 13:15:58 GMT 2020 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
```

nmap を使ってみました。

```text
$ nmap -6 2001:240:28d5:4900:222:cfff:fefb:7b33
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-08 15:23 JST
Nmap scan report for 2001:240:28d5:4900:222:cfff:fefb:7b33
Host is up (0.014s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 2.45 seconds
```
Docker Windows (WSL2) で centos:6 等の古いコンテナが Exited (139) で起動しない問題の対処法

## 結論

[Docker Hub: centos](https://hub.docker.com/_/centos) の `A note about vsyscall` に書かれている現象が起きています。`centos:6` に限らず、Linux kernel 4.11 以前をベースとした古いコンテナでよく発生するようです。


## 問題

Docker Desktop for Windows (WSL2 backend) を使っていて `centos:6` を動かそうとすると、起動せずに `Exited (139)` で即落ちるというエラーに遭遇しました。

```shell:centos6だと落ちる
> docker run -it --rm centos:6 bash
> docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                        PORTS               NAMES
6c33d78abb9c        centos:6              "/bin/bash"         17 seconds ago      Exited (139) 7 seconds ago                        sad_wescoff
```

`centos:7` の場合は問題なく起動します。コンテナに依存する問題のようです。

```shell:centos7は問題なく起動する
> docker run -it --rm centos:7 bash
[root@de06793c93fe /]# 
```


## 対処法

Docker Desktop for Windows (WSL2 backend) で問題を回避するには `%USERPROFILE%/.wslcofig` に設定を追加して PC を再起動します。[参照: GitHub microsoft/WSL Issue#4694](https://github.com/microsoft/WSL/issues/4694)

```txt:%USERPROFILE%/.wslconfig
[wsl2]
kernelCommandLine = vsyscall=emulate
```

再起動して .wslconfig の設定が反映されたか確認するには、適当な WSL2 で以下のコマンドを実行します。`vsyscall=emulate` が表示されていれば OK です。

```shell:vsyscall=emulateが表示されていればOK
> wsl cat /proc/cmdline
initrd=\initrd.img panic=-1 pty.legacy_count=0 nr_cpus=4 vsyscall=emulate
```

そうすると、以降は起動できるようになります。

```shell:centos6でも起動するようになる
> docker run -it --rm centos:6 bash
[root@4464b48b5c69 /]#
```


## 原因

「単に `docker run centos:6` しただけで落ちるなら FAQ なのでは？」と思って [Docker Hub: centos](https://hub.docker.com/_/centos) を見に行ったら `A note about vsyscall` に答えが書いてありました。

> If running docker run --rm -it centos:centos6.7 bash immediately exits with status code 139, check to see if your system has disabled vsyscall:
> 
> $ cat /proc/self/maps | egrep 'vdso|vsyscall'
> 7fffccfcc000-7fffccfce000 r-xp 00000000 00:00 0                          [vdso]
> $
> 
> vs
> 
> $ cat /proc/self/maps | egrep 'vdso|vsyscall'
> 7fffe03fe000-7fffe0400000 r-xp 00000000 00:00 0                          [vdso]
> ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
> 
> If you do not see a vsyscall mapping, and you need to run a CentOS 6 container, try adding vsyscall=emulated to the kernel options in your bootloader

「もし `docker run --rm -it centos:centos6.7 bash` がすぐに status code 139 で終了する場合は、あなたのシステム（ホスト）の vsyscall が disable になっていないか調べてください。vsyscall マッピングが表示されず、CentOS 6コンテナーを実行する必要がある場合は、ブートローダーのカーネルオプションに `vsyscall=emulated` を追加してみてください」とのことで、問題の現象ドンピシャです。

そこで、Docker Desktop for Windows (WSL2 backend) で vsyscall がどうなのか調べると [GitHub microsoft/WSL Issue#4694](https://github.com/microsoft/WSL/issues/4694) に WSL2 で `vsyscall=emulate` を有効にする方法がありました。

私の場合は、これで解決しました。

### centos:6 以外でも同じ問題は起きる

Linux kernel 4.11 から vsyscall がデフォルトで無効になったため、この問題は、

1. vsyscall が無効なホスト OS 上（最近の Linux は全部そう）で、
2. vsyscall を利用している古いコンテナを docker で起動する

場合に発生するようです。

古いコンテナを起動して `Exited (139)` が起きる場合は、まずこの問題を疑ったほうが良いかもしれません。

## 環境

* Windows10 [Version 10.0.19041.264]
* docker 2.3.0.3 (45519) WSL2 backend
【windows CMD】ディレクトリのシンボリックリンクをコマンドで設定する。

自分用のメモとして投稿。

普段はエクステンションで、右クリックメニューからGUI上でやっていたのですが、
エクステンションが入っていないPCで作業することがあったため、自分用のメモとして投稿。。。

#■やり方
```shell
mklink /D リンク先パス リンク元パス
```
Yupに「親の値を参照する」機能が実装されたので嬉しくてまとめ

#はじめに
[Formikで利用する場合のYupのカスタマイズ](https://qiita.com/kspotfujita/items/12d6e21334b3ae1cda59)で色々使い方を書いたのですが、その頃には実装されていなかった、[Yup](https://github.com/jquense/yup)で`test()`関数を実行するときに「親の値を参照する」機能がついに5月末に実装されたので使い方をまとめました。基本の使い方は判っている前提で書きます。これまでは色々裏道を使ってなんとか処理していましたが、これでとても使えるライブラリになりました。

#対応バージョン
v0.29.1から

#実装

```js:
Yup.object().shape({
  name: Yup.string().require(),
  parts: Yup.array().of(
    Yup.object.shape({
      name: Yup.string().required(),
      weight: Yup.number()
        .min(0)
        .test('maxWeight', '合計129.3Kg以上はNG', function(value) {
          if (value == null || value === '') return true;

          let robot = this.from[1].value; //<--------ここで参照
          let maxWeight = 0;
          robot.parts.forEach(part => {
            maxWeight += part.weight;
          });
          if (maxWeight > 129.3) {
            return false;
          }
          return true;
        }),
    })
  ),
});
```
こんな風に、`this.from`変数を使って上位の構造にアクセスできるようになりました。
`from`変数の中身はネストの深さに応じた配列となります。
例えばpart「頭」のweightを編集中の場合、

`this.from[0].value`の中身は

```js:
{name: '頭', weight: 30 },
```

`this.from[1].value`の中身は

```js:
{
    name: 'ドラえもん',
    parts: [
      { name: '頭', weight: 30 },
      { name: 'ボディー', weight: 39 },
      { name: '足', weight: 30 },
      { name: '手', weight: 30 },
    ],
  }
```

と、なります。ネストが深ければ、　`from[2], from[3], ...` と増えていきます。

#訂正
当初 `from[x]` で、値を参照できるように当初書いてしまいましたが、 正しくは `from[x].value` です。
KVMとHappyHackingKeyBoradの話

職場で常にPCを3，4台使用しているのですが、うちの社員の標準的な構成が

- デスクトップ2台＋ノートPC1台
- デスクトップ1台＋ノートPC2台
- ノートPC3台

という構成でして、私のデスクトップ3台＋ノートPC1台構成に対応しているKVMがない…

ということで、メルカリで4PC用のKVMを安く購入したのですが…

普通のキーボードとマウスは使えるんです。
たまに色が変な時がありますが、古い中古を新品の20％以下の価格で購入しているので贅沢は言いません。

ただ…私の愛用HHKBが使えないんです…
Realforceも使えないんです…

前の切り替え器の時は使えていたのになんで？？
という感じなのですが、まぁ使えないものは仕方がない。


けど高い金だして手に入れたHHKB Hybrid Type-S を使いたい。
マウス用のポートに刺せば使えるんだが…

と思っていたところで、RealforceをKVMで使えなかったのは、
Nロールオーバーを実現するためにキーボードじゃなくてUSBデバイス扱いみたいな状態にしているからだったという記事を発見。
もしかして、HHKBもキーボードじゃないってことか。。。


ということで、KVM切替専用の自作キーボードを作り、KVMのUSBキーボードを指すためのポートに装着。マウス用のポートにUSBHUBを指して、マウスとHHKBを刺せば使えるようになるのでは…？

ということを思い立ちまして。。。


まだ思い立っただけで動いていないのですが、
備忘録として記事としてまとまりもしていない状態ですが投稿させていただきます。

まずはUSBHUBでマウスポートにマウスとHHKBを2本差ししたらどうなるか検証するところからスタートかなぁ…
楽しみ。。
機械学習入門~K最近傍法の表を出してみる~（+エラー対処）

#はじめに

k最近傍法について学びたく、グラフを表示させようとしたところ、次のようなエラーメッセージが出てしまったので解決方法を載せておきます。

おそらく同じエラーが出る方もいるかと思うので参考にしてください。

#エラーメッセージ

何かをインポートしてと言っているのでしょう。
ただ全くわからないので検索をかけて無理やり解決させました。

```python:erorr.py
FutureWarning: Function make_blobs is deprecated; Please import make_blobs directly from scikit-learn
  warnings.warn(msg, category=FutureWarning)
```

#解決方法

以下のコードをインポートさせるとエラーメッセージが消えてくれました。

```python:success.py
from sklearn.model_selection import train_test_split
X, y = mglearn.datasets.make_forge()

X_train, X_test, y_train, y_test = train_test_split(X, y, ramdom_state=0)
```

#Jupyter Notebookでk最近傍法のグラフを表示させる

```python:nearest_neighbor_method_column1.py
import mglearn
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
X, y = mglearn.datasets.make_forge()
```
```python:nearest_neighbor_method_column2.py
mglearn.plots.plot_knn_classification(n_neighbors=3)
```

n_neighbors=" "のところでkの数を表しています。

この数を自由に変えてみると当たり前ですが、平均値が変わっていきます。

最後までご覧いただきありがとうございました。
JMP ユーザー インタビュー vol.2

![_SAT4100.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417820/bd87f7b0-df63-1ac0-5a40-01a1a8609be7.jpeg)
**濱口 勝重 氏**
**株式会社村田製作所**

**JMPユーザー歴：**
1999年5月頃から
**私の意外な一面：**
シャイなところです。人見知りなので第一印象では怖く見えることがあるようですが、実際はそうではなく、温和で社交的な性格です。
温泉やサウナが好きで、東京近辺はかなり行きました。頻繁に利用したのは、羽田空港や東京駅に近い大井町の「おふろの王様®」です。いろいろなお風呂がありサウナが広いです。他には、練馬区の「久松湯」、東松山の「蔵の湯」、武蔵小山の「清水湯」もオススメです。東京以外では出雲市駅前の「らんぷの湯」もいいですね。小さいけれどとても泉質が良いです。

**1.JMPの機能で最も気に入っているものは？**
データとグラフのリンク機能です。グラフで興味のある部分をクリックすると、グラフとデータがハイライトする点です。

**2.初めての仕事は何でしたか？**
大学1年の夏休みに家電量販店で働きました。将来、電機関係の仕事に就きたいと思っていたところ、大学でアルバイトの募集があったのがきっかけです。オーディオ関係のフロアを担当していて、初めて売れた商品がソニーの「ウォークマン®」だったのを覚えています。働くうちに「こっちが真剣にならないと相手は何も興味を持ってくれないな」と気づきました。「この商品を私はこんな風に感じていて、だからこれを良いと思っている」ということを一心に本気で話すと、お客様に伝わって買ってくださることがあったのを覚えています。

**3.統計に関心をもったきっかけは何でしたか？**
一般財団法人日本科学技術連盟主催の「品質管理セミナーベーシックコース」という6か月間のセミナーを受講したのがきっかけです。それ以前にも数式や計算への理解はある程度ありましたが、数式として分かっていても、それがどういう意味をもって仕事でどう使われるのかの理解が不充分でした。このセミナーで基本から順番に学んでいく過程で、統計への理解が深まって自然に関心が高まりました。ちょうど同じ時期に、社内でJMPを導入することになり、さらに興味を持ちました。

**4.統計的に関わる仕事を最初に行ったのはいつでしたか？**
1997年に、自社製統計解析ソフトウェアの改訂業務が最初です。当時はMS-DOSからWindows®への変遷の時期で、MS-DOSベースで作られていたものをWindows®ベースへの移植と、社内ユーザーのサポートを行っていました。

**5.プロフェッショナルとして、最も誇らしく感じた瞬間は？**
社内研修の受講後に「このデータをどのように解析したらいいですか？」と踏み込んで相談を受けることがあります。こういう時に「統計やデータ解析を学んで、興味を持ってくれたんだな」と実感が湧いてとても嬉しく感じました。
また最近、社内の業務支援としてデータ解析の相談を受けたことがありました。相談者から説明を聞きながらいっしょに解析するのですが、グラフのリンク機能を使って確認していくと、ある時点での変化に気づき「この時に設備のメンテナンスをしたのではないですか？」と尋ねたところ、まさにそれが原因であり、データ解析で判明したことに相談者が非常にびっくりしていたのを見ると嬉しかったですね。

**6.仕事のどの部分が好きですか？**
今は社内研修の講師をしています。現場のサポートを行っていると、以前私が教えた内容、たとえば、実験計画法などを業務が変わってからも自分で関心を持って使ってくれている社員がいたり、「JMPでデータ解析をやっているんです」と声をかけてくれる社員もいます。仕事でそのような反応が得られるのは、やはりやりがいを感じます。

**7.最近JMPをどのように活用していますか？**
SQC（Statistical Quality Control、統計的品質管理）の教育と、社内エンジニアのフォローアップに使っています。実際にJMPを業務のなかでどう活用すれば良いか実践的に指導しています。

**8.JMPを用いた最初のプロジェクトは何でしたか？**
従来使用していた自社製ソフトウェアを他社製のもの（JMP）への切替プロジェクトでした。製造工程データをデータベースに蓄え始めており、そのデータを解析するには自社製ソフトウェアはパワー不足だったので、JMPの「探索的データ分析」が非常に有効ということが分かり、JMPを導入することになりました。当時は日本語版JMPの発売前でしたので、英語版JMPでJMPサポートスタッフに教えてもらいながら、社内向けJMP操作マニュアルを作成しました。

**9.JMPの開発者や、John Sallに何か伝えたいことはありますか？**
「決定的スクリーニング計画」では、6因⼦か7因⼦であれば最低でも20回の実験数が必要となりますが、実際に開発する立場からするとその数をこなすのは簡単ではないでしょう。少ない実験数で結果を出せる機能や、いま持っているさまざまなデータや知識から最適な実験を計画してくれる機能が欲しいところです。

**10.将来的に、データサイエンスやアナリティクスの分野は、どのように変化すると思いますか？**
AIの進歩によって、いま行われている「データ解析」は将来AIが全部行うようになるでしょう。そうなると、総合的でクリエイティブな分野こそが「人の仕事」になります。
我々メーカーでクリエイティブな領域といえば「研究開発」です。その仕事のなかで統計をいかに活かしていくかがこれから重要になると考えています。つまり、ゆくゆくはデータサイエンティストとしての仕事になっていくのかなと考えています。
大量のデータを使って解析するというのはもう「人の仕事」ではなくなり、いかに少ないデータで結果を出していくかというところで勝負になっていくからこそ、人間がちゃんと考えていく必要があるのです。JMPがそういう所をアシストしてくれるソフトウェアであり続けて欲しいと願っています。

■	さあ始めよう！
JMPの全機能を30日間試せるトライアル版で、データからさらなる情報を導き出せることを実感してください。
さあ始めましょう。

ダウンロードは[**コチラ！**](https://www.jmp.com/ja_jp/download-jmp-free-trial.html?utm_campaign=td7013Z000002sEGsQAM&utm_source=JMPblog&utm_medium=)
美大生のためのプログラミング入門：準備編 Processing をインストールしよう

※ Qiita ではコンテンツ部分のみの印刷が簡単にはできません。本文部分をプリントしたい人や PDF 化したい人は http://gurakura.sakura.ne.jp/hellomondrian/setupprocessing/ を見て下さい（同じ内容です）。

# はじめに
　このシリーズでは、Processing というソフトウェアを用いて、プログラミングを学んでいきます。説明されているプログラムを実際に動作させるには Processing が必要となります。この文書では Processing のインストール方法と簡単な動作確認について説明します。

# ダウンロード＆インストール
　Processing は、[processing.org](http://processing.org/) で配布されています。無料のソフトウェアです。

[http://processing.org](http://processing.org/) にアクセスすると、次のような画面が現れます。

![Processing.org のトップページ](http://gurakura.sakura.ne.jp/img/helloMondrian/Processing_org.png)

ここで、左側にある "Download" というところをクリックし、自分が使用しているコンピュータに適合するファイルをダウンロード＆インストールします。

# Processing の起動
　無事インストールが完了したら、Processing を立ち上げてみましょう。Processing が起動すると、次のような画面になると思います（画像は Mac 版です）。

![Processing を起動した様子](http://gurakura.sakura.ne.jp/img/helloMondrian/processingWindow.png)

ウィンドウのタイトルバーの表示などは、インストールしたバージョン等により変化します。

　このウィンドウにプログラムを入力して、実行ボタンをクリックすると Processing のプログラムが実行されます。本シリーズ「[美大生のためのプログラミング入門](https://qiita.com/iigura/items/37180d127da93d0b8abb)」では、このウィンドウにプログラムを入力して、実行ボタンを押し、プログラムが正しく動作しているか否かを、都度、確認していくこととなります。

## Processing の動作確認
　このセクションの最後として、インストールした Processing が正しく動作するかどうか確認しておきましょう。Processing は何もプログラムを入力しなくても、実行することができます。プログラムを何も入力せず、実行ボタンをクリックしてみて下さい。

もしかすると、少し時間がかかるかもしれませんが、次のようなウィンドウが表示されれば、インストールした Processing は、ひとまず正常に動作していると判断して良いでしょう。

![何も入力しない時のウィンドウの画像](http://gurakura.sakura.ne.jp/img/helloMondrian/emptyProgram.png)

　無事、Processing の動作が確認できたら、このセクションは終了です。
お疲れ様でした。
Docker Compose + Apache 2.4 でリバースプロキシをする最小の httpd.conf

- Web アプリケーションを開発している
- 本番環境では前段にリバースプロキシサーバを挟むことになっている
- そのリバースプロキシサーバからは何らかのリクエストヘッダが追加されてリクエストが流されてくる

こういう状況で、開発環境でも同じ状況を再現したい、という場合。

最も簡単な方法は [ModHeader](https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj?hl=ja) などのブラウザ拡張を利用してリクエストヘッダを書き換える方法だが、もっとちゃんと再現したい場合は自分で Nginx や httpd を動かす必要がある。

明らかに Nginx でやったほうが簡単なのだけど、今回は本番環境のリバースプロキシサーバが httpd で動いているので開発環境も httpd でやることにした。

Apache (httpd) といえばデフォルトの設定ファイル (httpd.conf) がとても長くて、どこが本当に必要な行なのかわからなくて嫌になってしまう。
今回はできる限り httpd.conf のデフォルト設定を削除して最小限の記述でリバースプロキシができるように試行錯誤してみた。

``` yml:docker-compose.yml
version: '3'

services:

  app:
    # ポート 3000 で http を serve するアプリ

  proxy:
    image: httpd:2.4
    ports:
      - 8080:80
    volumes:
      - ./httpd.conf:/usr/local/apache2/conf/httpd.conf
    environment:
      PROXY_PATH: /
      PROXY_URL: http://app:3000/
      USER_ID: '012345'
```

``` conf:httpd.conf
Listen 80

# 必須モジュール
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authz_core_module modules/mod_authz_core.so

# root で実行しないようにする
LoadModule unixd_module modules/mod_unixd.so

User daemon
Group daemon

# エラーログを stderr に流す
ErrorLog /proc/self/fd/2

# リバースプロキシの設定
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyPass ${PROXY_PATH} ${PROXY_URL}
ProxyPassReverse ${PROXY_PATH} {$PROXY_URL}

# リクエストヘッダを追加する
LoadModule headers_module modules/mod_headers.so

RequestHeader add X-Forwarded-User ${USER_ID}
```

`docker-compose up` してブラウザから http://localhost:8080/ にアクセスして Web アプリケーションの画面が表示されれば OK。

## アクセスログも流したい場合
上記の設定だと httpd のエラーしか Docker のログには出力されないが、アクセスログも流したい場合は以下を追加すればよい。

``` conf
# アクセスログを stdout に流す
LoadModule log_config_module modules/mod_log_config.so

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /proc/self/fd/1 combined
```
Python超初心者の超初心者のためのPython #型（type）と型（type）の確かめ方

環境
windows7　（Mac Book Pro 16inch欲しい）
Visual Studio Code
chrome

この記事はプログラミング初心者かつPython初心者に向けて記述します。

1.Pythonの型（type）の種類と型（type）の確かめ方

##integer
 1
123 
-1234

等の数（整数）。プラスもマイナスも含みます。

```python:style.py
print(type(1))
#<class 'int'>「整数だよー」と言っている。

print(type(123))
#<class 'int'>これも「整数だよー」

print(type(-1234))
#<class 'int'>マイナスでも「整数だよー」
```

***
##string
こんにちは
Hello Python
I'll be back
Comment allez-vous?
コロナはもうたくさんだ

等の文字（文字列）です。

```python:type.py
print(type("こんにちは"))
#<class 'str'>stringの頭文字3つを取って'str'。つまり文字（文字列）です。

print(type("Hello Python"))
#<class 'str'>これも「文字列ですよー」と言っている。

print(type("Comment allez-vous?"))
#<class 'str'>フランス語でも「文字列ですよー」

print(type("コロナはもうたくさんだ"))
#<class 'str'>ウィルスも「文字列ですよー」
```

***
##floating point numbers
1.0
-3.14

等の小数点（浮動小数点数*1）
*1浮動小数点数ってなにそれ？は[こちら](https://wa3.i-3-i.info/word14959.html)に詳しく記載されています。

```python:type.py
print(type(1.0))
#<class 'float'>floating pointの頭文字5つを取って'float'。つまり小数点（浮動小数点数）です。

print(type(-3.14))
#<class 'float'>マイナスでも「小数点（浮動小数点数）だよー」
```



***
##complex numbers
3j
3.21j

虚数。なんのこっちゃ！
ググってみたら[こちら](https://atarimae.biz/archives/500)がわかりにくいけどわかりやすく書かれています。

```python:type.py
print(type(3j))
# <class 'complex'>「きょっ、虚数です！」

print(type(3.21j))
# <class 'complex'>「八丈島のキョ・・・ではなくて虚数です。」
```

***
##boolean
True（Tは大文字）
Fals（Fは大文字)
幸いなことにbooleanはこの2種類しかないです。「わたくしbooleanと書いてブーリアンと発します」

```python:type.py
print(type(True))
# <class 'bool'>「ブーリアンです」

print(type(False))
# <class 'bool'>「高木ブーリアンです」

***
複数バージョンのGoを扱う

## 環境

OS: macOS Mojave Version 10.14.6

## 手順

[manage-install](https://golang.org/doc/manage-install)のまま。

### ソースのダウンロード

```bash
# 任意のバージョンをダウンロード
$ go get golang.org/dl/go1.14
# ~/sdk に配布
$ go1.14 download
```

### 環境変数の変更

```sh:~/.bash_profile
export GOPATH=$HOME/go
export GOROOT=$HOME/sdk/go1.14 # 追加
export PATH=$PATH:/${GOROOT}/bin:${GOPATH}/bin
```

## その他

> GOROOT and GOPATH are environment variables that define this layout. GOROOT is a variable that defines where your Go SDK is located. You do not need to change this variable, unless you plan to use different Go versions. GOPATH is a variable that defines the root of your workspace.

GoLandのWebサイトではあるが、GOPATHとGOROOTの説明が分かりやすかった。（[Configuring GOROOT and GOPATH](https://www.jetbrains.com/help/go/configuring-goroot-and-gopath.html)）

## 参考

* [What should be the values of GOPATH and GOROOT?](https://stackoverflow.com/questions/7970390/what-should-be-the-values-of-gopath-and-goroot)
* [PATHを通すために環境変数の設定を理解する (Mac OS X)](https://qiita.com/soarflat/items/d5015bec37f8a8254380#%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E6%A4%9C%E7%B4%A2%E3%83%91%E3%82%B9%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D%E3%82%92%E9%AB%98%E3%81%8F%E3%81%97%E3%81%9F%E3%81%84)
debianのmsmtpで認証はOnにしてセキュリティはOffにする方法

# はじめに

Dockerでレンタルサーバのような開発環境を作成したい。

[Docker HubにあるPHP-Apache](https://hub.docker.com/_/php?tab=description)は、Debianで構築されている。

[centOS](https://www.centos.org/)だと、[ssmtp](https://wiki.archlinux.jp/index.php/SSMTP)なのだが、Debianだと[msmtp](https://wiki.archlinux.jp/index.php/Msmtp)が使うようだ。

msmtpでTLSなどの暗号化はオフにして、SMTP Authだけ使いたい場合の設定がわからなかった。

# 問題点

`/etc/msmtprc`でAuth Onに設定するとどうしても、暗号化の指定も行われてしまう。

```bash
# A system wide configuration file is optional.
# If it exists, it usually defines a default account.
# This allows msmtp to be used like /usr/sbin/sendmail.
account default

# The SMTP smarthost
host maildev(Dockerで構築しているメールキャッチャーのホスト)

port 25
auth on
tls off
tls_starttls off
user smtpuser
password smtppassword

# Construct envelope-from addresses of the form "user@oursite.example"
# auto_from on
#maildomain oursite.example
from test@web


# Syslog logging with facility LOG_MAIL instead of the default LOG_USER
# syslog LOG_MAIL
logfile /var/log/msmtp.log
```

このように設定をした場合に、
`msmtp.log`に以下のようなエラーが出力されてメールが送信されない。

```bash
Jun 08 12:59:26 host=maildev tls=off auth=on user=smtpuser from=test@web recipients=***@example.com,***@gmail.com errormsg='cannot use a secure authentication method' exitcode=EX_UNAVAILABLE
```

# 解決策

**auth login**にする必要があった。
これでメールが送信された。

```bash
# A system wide configuration file is optional.
# If it exists, it usually defines a default account.
# This allows msmtp to be used like /usr/sbin/sendmail.
account default

# The SMTP smarthost
host maildev(Dockerで構築しているメールキャッチャーのホスト)

port 25
auth login <= ここを変更
tls off
tls_starttls off
user smtpuser
password smtppassword

# Construct envelope-from addresses of the form "user@oursite.example"
# auto_from on
#maildomain oursite.example
from test@web


# Syslog logging with facility LOG_MAIL instead of the default LOG_USER
# syslog LOG_MAIL
logfile /var/log/msmtp.log
```

# 参考URL

* [archlinuxのmstmpの解説ページ](https://wiki.archlinux.jp/index.php/Msmtp)
* [MSMTP Issue on Plesk community](https://talk.plesk.com/threads/msmtp-issue.330690/)
Bigquery のスニペットをメモする

## 移動平均線

```SQL
-- 3週移動平均 
  avg(target.amount) OVER (
    ORDER BY target.week ASC
    ROWS BETWEEN 3 PRECEDING AND CURRENT ROW 
  ) AS moving_average_3_week
```

## IDを振り直す
```SQL
SELECT ROW_NUMBER() OVER (ORDER BY users.id) AS new_id, users.*
FROM users
```

## テーブルをまたいだデータのうち最初のものを抽出する
```SQL
-- ユーザーの最初のアクションのコードを取得する
WITH t1 as (
    SELECT 
        user_id
        , action_code
        , action_date
        , ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY action_created DESC ) AS num
    FROM Integrated_actions
)

SELECT user_id
    , action_code
    , action_date
FROM t1
where num = 1
```

## 昨年対比、前月対比
```SQL
    year
    , uriage
    , uriage / LAG(uriage,1) OVER (PARTITION BY category_flg ORDER BY year) AS YoY
```
```SQL
    month
    , uriage
    , uriage / LAG(uriage,1) OVER (ORDER BY month) AS MoM
```

## 最も出現率が多いもの

https://qiita.com/chatrate/items/e8d3a6cec35dfef4524b

```SQL
SELECT
  APPROX_TOP_COUNT(fruits, 1)[offset(0)] AS approx_top_count
FROM
  UNNEST(["apple", "apple", "pear", "pear", "pear", "banana"]) AS fruits;
```

値のみがほしいとき
```SQL
SELECT
  APPROX_TOP_COUNT(fruits, 1)[offset(0)].value AS approx_top_count
FROM
  UNNEST(["apple", "apple", "pear", "pear", "pear", "banana"]) AS fruits;
```




## URL文字列をデコードする

```SQL
CREATE TEMPORARY FUNCTION urlDecode(s STRING)
RETURNS STRING
LANGUAGE js AS "return decodeURI(s);";

with db as (
    select '%e3%83%86%e3%82%b9%e3%83%88' as url
)

select
    db.url AS url
    , urlDecode(db.url) AS decoded
from
    db

```

| url |  decoded | 
| --- |  --- | 
| %e3%83%86%e3%82%b9%e3%83%88 | テスト |
Octoparse：Macユーザー向けのWebスクレイピングツールがリリース！

元記事：https://www.octoparse.jp/blog/web-scraping-tool-for-mac/

世の中では、Webデータ収集を容易にする[スクレイピングツール](https://www.octoparse.jp/blog/the-10-best-web-scraping-tools/)がたくさんありますが、macOSに対応できるのがまだ少ないです。iPhone人気も背景に年々Macのシェアが伸びている中で、スクレイピング業界でもMacへの対応も必須とのことで、お客様より長らくご要望をいただいておりました。

そこで、業界で一番人気のスクレイピングツールである「[Octoparse](https://www.octoparse.jp/)」は、従来のWindows版に加え、Mac版をついにリリースいたしました！（ダウンロードは[こちら](https://helpcenter.octoparse.jp/hc/ja/articles/360013048720)）
 
#Octoparse for Macの機能

 
##Webスクレイピングテンプレートを備え

そもそも、Octoparseはコードを書く必要もなく、あらゆるWebサイトからデータを手軽に抽出できるスクレイピングツールです。Webスクレイピングテンプレート機能は、誰でも簡単にWebスクレイピングを利用できるように設計されています。パラメータ（WebサイトのURL、検索キーワードなど）を入力するだけで、データがすばやく抽出されてきます。

現時点では、Octoparseには数十種類のあらかじめ作成されたテンプレートがあり、Amazon、楽天市場、Twitter、YouTube、Googleマップなど多くの人気サイトがカバーされています。詳しい情報は[こちら](https://service.octoparse.com/ja-jp/web-scraping-template)
![template.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/d071fc48-2bf4-ebe2-0e86-45617fc39011.gif)


 

 

 

##「Webページの自動認識」機能を追加

もし取得したいサイトがテンプレートにない場合、カスタマイズモードを利用することができます。「Webページの自動認識」機能を追加するにより、WebページのURLアドレスを入力するだけで、Octoparseは自動的にWebページを分析し、Webページ上のテキスト、画像、リンクなどの情報を識別でき、ワークフローを自動的に生成するようになります。複数の認識結果が表示され、簡単に切り替えられ、一般的なニーズを満たすことができると思われます。超初心者でも手軽にデータをスクレイピングできるようになりました！
![sns.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/0bb64fe4-f332-b106-9e14-471d142326e6.gif)


たとえ識別が失敗しても、直感的に操作できる画面で、簡単なポイントアンドクリックをして、Webサイトからデータを手動で選択することもできます。取得したデータはExcel、HTML、CSV、またはご指定のデータベースのような構造化フォーマットに保存されます。
![6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/040434f7-a8e3-0ae4-cb41-35541f72240f.gif)

 



##クラウドで定期実行が可能

Octoparseは、24時間データ抽出可能のクラウド型プラットフォームを提供しております。これにより、スクレイピングの定期実行が可能になります。例えば、特定のWebページを定期的にチェックしたり、抽出されたデータをクラウドストレージに即時にエクスポートするなど、自分のパソコンを起動しないで実行できます。また、複数のクラウドサーバーがあり、同時動作ができるので、データ抽出が速くなり、対象サイトに追跡されるやアクセス拒否される可能性を最小限に抑えます。
![2020-05-07_15-15-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/abad5bd9-68ad-9915-ebd6-e72aaba7b37a.png)


 
Webスクレイピングツールを探しているMacユーザーはぜひOctoparseをお試しください。
LaravelのFile::makeDirectoryでパーミッションを指定する

# LaravelのFile::makeDirectoryでパーミッションを指定する

File::makeDirectory($path, 0757, true);　としても、0755にしかならない問題

ファイルまたはディレクトリを作成したときに設定されるデフォルトのファイルアクセス権は、ユーザーマスクによって制御されるため、0755までしか。。。

どうするのか？

## umask(0)しましょう

```
// ディレクトリを パーミッション 0757 で作成する
umask(0);
\File::makeDirectory($path, '0757');
```

これでOK
javascriptの備忘録 2020.6.8

久々にがっつり触ったが忘れそうなのでメモ

###IE互換
いまだにIEサポートしないといけないシステムもある。(LAN環境ならいいのか)
構文きっちりしないとスクリプトエラー
関数引数の最後の,とかあると動かない。

```javascript:ダメだった例
function sum(a,b,)
```

##最近のJS
###オブジェクトが便利

```javascript
let person = {
/* ほぼなんでも詰め込める */
};
```

###配列も便利

```javascript
let tags = [];
```

###varとletの違い
letの方が変数汚染しないからこちら推奨。

###アロー演算子に注意(IEは×)

```javascript
const funcA = (a,c) => {
}
```

###テンプレート文字列（IEは×）
デバッグログにも便利。
フォーマット識別子や条件分？も使える模様。

```javascript
const test = 'Hello';
const who = 'Sato';
console.log(`${test}, ${who} san.`);
/* Hello, Sato san.と表示される */
```

###HTML要素へのアクセス

```javascript
/* メモリ上に作成 */
const div = document.createElement('div');

/* id名で指定 */
const localVideo = document.getElementById('my_video');
localVideo.display = "none";

/* class名で指定 */
/* クラスの場合はCollectionクラスが変えるので[0]とかforEachで各要素で操作する */
const remoteVideos = document.getElementsByClassName('other_video');
remoteVideos[0].display = "";
```

###async/awaitが便利（IEは×）

###jqueryは今だに健在。
なくしたいけど、これからも共存する方向かな。

###input type="radio/checkbox"の設定取得
美大生のためのプログラミング入門：はじめに

※ Qiita では、コンテンツのみの印刷に苦労するため、同じ内容を以下のページにも掲載しています。プリンツアウトしたり PDF 化したい人は、こちらのページを利用して下しさい：

http://gurakura.sakura.ne.jp/hellomondrian/intro/


# はじめに
　この文書は、とある美大で実際に行った授業のテキストを元に作成されています。理系学生と異なり、美大生は必ずしもプログラミングの素養があるとは限りません。

しかし、美術大学においても、メディアアートやインタラクティブなインスタレーションなど、プログラミングの知識が求められることが多い状況となっています（状況を知っている方からすれば「何をいまさら」という感じでしょうが…）。そのため、美大生にも理解できるよう、できるだけ具体的な例を多く示して分かりやすい説明を心がけました。

　もちろん、美大生の中にも驚くほどプログラミング能力が高い学生は存在します。とは言っても、平均としては（当たり前ですが）理系の大学生と比較すると、より丁寧な説明が必要であると経験的には感じています。そのため、理解の早い人にとっては少々冗長であると感じられるかもしれませんが、それはこのような理由によるものです。

## Processing
　この一連の文書では、Processing というシステムを用いてプログラミングについて説明していきます。Processing は Java という言語を用いて初心者でも簡単にプログラムによりコンピュータグラフィックス(CG）アニメーションを製作できるシステムです。

　最近では Java に限らず Python や JavaScript というプログラミング言語を用いることもできますが、この講座では Java を用いて説明していきます。

## よいプログラムとは
　このシリーズでは、プログラミングの基礎はもちろんのこと、良いプログラムとは何か？を抽象化という軸にて説明していきます。良いプログラムの定義については、数学のような明確な定義はまだありません。

　しかし、このシリーズでは、より柔軟なプログラム・より変化に強いプログラムを良いプログラムとして、説明を進めていきます。

## リファクタリングのテキストとしても
　プログラムの動作を変えずに、プログラムリスト（＝ソースコードと呼んだりします）を変更する行為をリファクタリングを呼びます。この講座では、リファクタリングを通じて、よりよいプログラムに変化していく様子もあわせて提示していきます。

　この文書は、冒頭で述べたように美大生にむけての学習コンテンツとして作成されましたが、リファクタリングの実際を紙上にて体験できる内容となっていますので、プログラム初心者はもちろんのこと、脱初心者を目指す方にとってもリファクタリングのテキストとして利用していただけるのではないかと思っています。
Ansible PostgreSQL Serverに指定したdatabaseがあるかを判定

# 環境

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ ansible --version
ansible 2.9.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ansi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
```

# 事前準備

``Ansible``で操作する対象サーバ(ノード)に``python-psycopg2``が必要なので``postgresqlxx-server``とかインストールするときに一緒にインストールしておくこと！
※``postgresql_query``を実行するために必要

# 忙しい人のための答え

```yml:main.yml
- name: is exists database postgres
  postgresql_query:
    db: "postgres"
    login_user: "postgres"
    login_password: "{{ user_passwd_postgres_db }}"
    port: "5432"
    query: |
      select 1 as exists from pg_database where datname = 'postgres'
  register: query_res

- debug:
    msg: "{{ query_res.rowcount }}"
```

# 解説

``postgresql_query``の結果を``register``すると以下のようになる

```yml:main.yml
- name: get database list
  postgresql_query:
    db: "postgres"
    login_user: "postgres"
    login_password: "{{ user_passwd_postgres_db }}"
    port: "5432"
    query: |
      select 1 as exists from pg_database where datname = 'postgres'
  register: query_res

- name: debug
  debug:
    msg: "{{ query_res }}"
```

```bash
TASK [test : get database list] ***********************
ok: [192.168.56.104]

TASK [test : debug] ***********************************
ok: [192.168.56.104] => {
    "msg": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "failed": false,
        "query": "select 1 as exists from pg_database where datname = 'postgres'\n",
        "query_result": [
            {
                "exists": 1
            }
        ],
        "rowcount": 1,
        "statusmessage": "SELECT 1"
    }
}
```

私の場合は``query_res``に格納したので、``query_res.query_result``で結果にアクセス可能。
これは配列であり、今回の結果は1行しかないことが自明なので``[0]``で1要素目にアクセス。ありがたい事に結果は``json``だ。

ただこれだと``SELECT``の結果が0件の場合はエラーになるので``query_res.rowcount``が正解。

存在しないDBを検索した場合は以下のとおり。

```bash
TASK [test : get database list] ***********************
ok: [192.168.56.104]

TASK [test : debug] ***********************************
ok: [192.168.56.104] => {
    "msg": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "failed": false,
        "query": "select 1 as exists from pg_database where datname = 'hoge'\n",
        "query_result": [],
        "rowcount": 0,
        "statusmessage": "SELECT 0"
    }
}
```

この場合は``"query_result" : []``になってしまうので、``rowcount``見るほうがいい。
【エラー対応方法共有】Snowflakeにて、Power BI Desktopから、Azure ADアカウントによる接続エラーへの対応方法について

# 概要
Power BI Desktopから、Snowflakeに接続した際に下記エラーがでた場合の対応方法の1つを共有します。Snowflakeに、Power BI セキュリティ統合時の入力ミスが原因でした。
> Failed to update data source credentials: ODBC:ERROR [28000] OAuth access token expired. [275843085].

上記エラーは、Snowflake社ドキュメントに記載がある通り、サポートへの問い合わせ対応が必要となるものであり、本件では解決しない可能性もあります。

> | 動作                                                         | エラーメッセージ                                             | トラブルシューティングアクション          |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ----------------------------------------- |
| Snowflakeは、期限切れの AAD トークンをPower BI  から受け取ります。 | データソースの認証情報を更新できませんでした。ODBC：ERROR  [28000] OAuth アクセストークンが期限切れです。 [<番号>]。 | Snowflakeサポートにお問い合わせください。 |

引用元：[Power BI SSO からSnowflakeへ](https://docs.snowflake.com/ja/user-guide/oauth-powerbi.html)


# エラー原因
下記SQLを実行しており、"external_oauth_issuer"に入力すべき"AZURE_AD_ISSUER"の最後に"/"を入力していないことでした。

```sql
create security integration powerbi
    type = external_oauth
    enabled = true
    external_oauth_type = azure
    external_oauth_issuer = 'https://sts.windows.net/a828b821-f44f-4698-85b2-3c6749302698'
    external_oauth_jws_keys_url = 'https://login.windows.net/common/discovery/keys'
    external_oauth_audience_list = ('https://analysis.windows.net/powerbi/connector/Snowflake')
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';
```

# エラー対応方法
下記の箇所を修正したSQLを実行することで、接続ができました。

修正前

```sql
    external_oauth_issuer = 'https://sts.windows.net/a828b821-f44f-4698-85b2-3c6749302698'
```

修正後

```sql
    external_oauth_issuer = 'https://sts.windows.net/a828b821-f44f-4698-85b2-3c6749302698/'
```
特定のWP_Queryをあちこちで使い回す



functions.phpに関数を書く

```
function myquery_args() {
  global $myquery_args;
  $myquery_args = array(
    'post_type' => '投稿タイプ',
    'posts_per_page' => -1,
    'tax_query' => array(
      array(
        'taxonomy' => 'タクソノミー名',
        'field' => 'slug',
        'terms' => 'ターム名',
      ),
    ),
  );
}
add_action( 'after_setup_theme', myquery_args );
```


出力箇所

```
<?php
  $myquery_query = new WP_Query($myquery_args);
  if($myquery_query->have_posts()): while($myquery_query->have_posts()): $myquery_query->the_post();
?>
```

header.php、footer.phpは関数をglobal宣言しないと使えないっぽい

```
 <?php 
  global $myquery_args;//←これ
  $myquery_query = new WP_Query($myquery_args);
  if($myquery_query->have_posts()): while($myquery_query->have_posts()): $myquery_query->the_post();
?>
```
Cookieが保存されなくなった

ある日突然、Cookieが保存されなくなった。
それを発見したときは、あーなんか追加したし、そのへんでミスがあったんだろうな〜と思ったが、、
どんなに差分確認しても、どこもCookieに関する部分を触っていない・・・
なぜ・・・？

（一瞬、ついにその時が来たのか・・とも思いましたが、保存されているものもあったり、開発環境は保存されないが、本番環境は保存されていたので、なんかしら原因があることは確定していました。）


と、結構時間掛けて原因わかりませんでしたが、原因は保存容量のオーバーでした。

参考
https://qiita.com/pipiox/items/95554673ba3b078ac112
https://ageo-soft.info/knowhow/112/

上の記事は、最近何回も見ていたので、（Cookie使わないように書き換えなきゃな〜と色々調べていました。）
なぜピンとこなかったんだろうと、自分でも思いましたが、
なぜ、すぐに気づけなかったかを説明します。

### Cookieの保存容量は最大4KB

え、少な！！と思うかもしれませんが、Cookieに保存するのは文字列なので、4KB超えるほど使っているかどうかなんて意識していませんでした。

### URLエンコードされる

保存できなくなったCookieに保存していたのはjsonをstringifyしたものでしたが、保存前の文字数を確認しても、4KB超えそうなものではありませんでした。
Cookieに保存できている環境で、ChromeのDevToolsのCookieを確認したら、あ！ValueがURLエンコードされている！！
コピーして確認したら、4000文字超えている！！！
なんと！今までがギリギリで生きていたようでした(ﾟдﾟ)

### 容量オーバーしてもエラーはでない

なぜ、なかなかこれに辿りつけなかったのかというと、どこにもエラーが出ていなかったから。
コンソールエラーが出るわけでもなく、途中までが保存され、呼び出した時にエラーになるわけでもなく、ただただ保存されませんでした。

たまたま、同じボタンを押下したタイミングで、2つのCookieを保存していました。
1つは保存されるのに、もう1つは保存されない。なんで？？？
本当に不思議でした。

## 対応方法

原因を調べても、容量オーバーの可能性を説明しているものがほとんどなかったので書こうと思いましたが、このままではただの愚痴を言っているだけになってしまいそうなので、私の対応方法を載せます。

### Cookie -> Local Storage

もともと、Cookieで書かれているものを別の方法で置き換える予定でした。
Nuxt.jsで開発をしているので、StoreかLocal Storageかなーと。
一部は、もう上記のどちらかになっているものもありますが、時間に追われていたので、とりあえずLocal Storage（保存容量：5MB～10MB）にすれば解決することはわかっていたので、Local Storageに置き換えました。

[cookie-universal-nuxt](https://www.npmjs.com/package/cookie-universal-nuxt)を使っていました。

```js

this.$cookies.set("cookie-name", "cookie-value", {
  path: "/",
  maxAge: 60 * 60 * 24 * 7
});

const cookieRes = this.$cookies.get("cookie-name");

this.$cookies.remove("cookie-name");
```

Vue.jsでよく使われているのは[vue-cookie](https://www.npmjs.com/package/vue-cookie)でしょうか？

```js
this.$cookie.set("cookie-name", "cookie-value", 7);
 
this.$cookie.get("cookie-name");
 
this.$cookie.delete("cookie-name");
```

[Local Storage](https://developer.mozilla.org/ja/docs/Web/API/Window/localStorage)はプラグインじゃなくていいと思います。

```js
localStorage.setItem('local-storage-name', 'local-storage-value');

const localStorageRes = localStorage.getItem("local-storage-name");

localStorage.removeItem("local-storage-name");
```

ほぼほぼ一括置換で完了できると思います。

注意点としては、cookie-universal-nuxtは `data` で `get` できましたが、Local Storageは `data` で `getItem` できないので、 `mounted` などに記述する必要があります。
Railsチュートリアルを加速するcloud9の小技・ショートカット: Railsチュートリアル備忘録 


これからRailsチュートリアルを始める方、
始めたところ、という方向けの備忘録にしていきたいと思います

RailsチュートリアルではオンラインIDE環境のcloud9の使用が推奨されています
このcloud9をより快適に使用できるようになることを目的とします

##キーボードショートカット（mac環境）
###必須
説明不要
`command + c` > コピー
`command + x` > カット
`command + v` > ペースト
`command + z` > 操作を戻す

###ファイル操作
####検索

```ruby:app/views/sessions/new.html.erb
```

操作したいファイルを探す際、
ファイルの場所が曖昧な際など、
画面左のツリーからviews...とたどらずに目的ファイルに到達可能

とりあえず一つ覚えるなら、
`command + e` or `command + o` > キーワード検索（ファイル）

ほかには、
`command + i` > キーワード検索（タブ）
`command + p` > キーワードで一括検索

####ファイルパスの取得(要カスタマイズ)
mac標準では
`command + option + c`でファイルパス取得が可能

これをcloud9環境でも実現したい

cloud9のタブが開かれている状態で
Preference(右上歯車 or `command + ,`) > 
keybindings > 
copyFilePathのkeystrokeのところで`command + option + c`キーをタイプ

<img width="859" alt="スクリーンショット 2020-06-09 9.13.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649386/ed0d7fd2-8503-6584-4a42-c6388e77eb60.png">

アクティブタブや、ツリー上で使用可能です

他にも便利なカスタマイズがあれば教えていただきたいです

####保存・閉じる
`command + s ` > 変更を保存

`alt + w` > タブを閉じる
その後、変更の保存を問うダイアログが表示されますが、
私の環境では'enter'でSaveが選択されます
`alt + w` からの `enter`で保存して閉じるの感覚

`command + w`はchromeのタブが閉じます
万が一閉じてしまってもcloud9に再度ログインすれば作業内容の復元は可能




###エディタ操作編
更新予定
Dockerを使った、サクッと作ってパッと捨てられるNode.js環境

待ちに待ったWindows 10 May 2020 Update（WSL2）もリリースされ、WindowsへのDockerの敷居も下がってきそうです。
そこで、Dockerで作る使い捨てやすいNode.jsの開発環境についてまとめておこうと思います。

![main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242655/f9f9c46e-3755-be38-a5bb-1963b53bfa46.png)

## Why NodeJS with Docker :thinking:
※前置きです（読み飛ばし可）

![250px-Docker_(container_engine)_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242655/46b12ea3-e278-164d-d154-0c679e6fdba7.png)

### 現状のバージョン管理方法
- Mac (メイン)
    - [anyenv](https://github.com/anyenv/anyenv) 経由で [nodenv](https://github.com/nodenv/nodenv)
- Windows (サブ)
    - ~~漢らしく~~zipを解凍してパスを通す
        - `nvm`があるのは知っていましたが、~~バージョン指定するほどの開発もしてなかったため、~~入れるのが手間で。。。

### 不満 :thumbsdown:
- コマンド覚えるのが苦手なので、逐一調べるのが億劫。<br>（たまにしか使わないコマンドなので尚更。。。）
    - 新しいバージョンいれたり、古いバージョン消したり、、、
- WindowsとMacで導入手順やコマンドが違う<br>(社内で~~布教~~サポートがしづらい)
- `package.json`のscriptをWindows,Mac考慮しながら書くの辛い。
- `package-lock.json`がたまにプラットフォーム(OS)によって変わるため、<br>別OSで作った環境で`npm install`するとコケることがある。


### 解決策
同じOS上でNode.jsを実行させればいいのでは？:thinking:
　→ Docker使おう:tada:

※よく手順で出てくる`Dockerfile`や`docker-compose.yml`は、コンテナが残ってしまって後始末がめんどくさいので、コンテナが残らない手順にしています。


**--ここから本編です--**

## 前提
- Dockerがインストールされていること


## Dockerイメージの取得
[docker hubの公式イメージ](https://hub.docker.com/_/node/)から任意のバージョンのDockerイメージを取得する。
※ alpine系がイメージサイズが小さいためオススメ。

```sh:console
% docker pull node:14-alpine
```

※ この手順は省略可（後でdocker runするタイミングで、イメージ未取得の場合は自動取得してくれるため）


## Nodeコマンドの実行 
基本以下ルールで実行するだけです。

- ローカルのディレクトリをDockerコンテナの好みの場所（`/home/node`とか？）にマウントする
- マウントしたディレクトリを作業ディレクトリに指定する
- サーバ機能を利用する場合は、必要なポートのマッピングを行う

```sh:example
# 作業用ディレクトリ作成
% mkdir workdir
% cd workdir
# プロジェクトの初期化
% docker run --rm -it \
%   -v "$PWD":/home/node/app \ # マウントの設定
%   -w /home/node/app \ # 作業ディレクトリの指定
%   node:14-alpine \ # イメージの指定
%   npm init -y # コンテナ内で実行したいコマンド
# モジュールのインストール
% docker run --rm -it \
%   -v "$PWD":/home/node/app \
%   -w /home/node/app \
%   node:14-alpine \
%   npm install --save-dev http-server
# 実行（ポートマッピング追加）
% docker run --rm -it \
%   -v "$PWD":/home/node/app \
%   -w /home/node/app \
%   -p 8080:8080 \ # ポートマッピング
%   node:14-alpine \
%   npx http-server
```

## 後始末
- コンテナは残っていないため掃除不要
- 不要になったイメージは定期的にガーッと削除しましょう

以上です。
【GAS】APIを簡単に自作してみる

## 前提
Googleアカウントを作成

### 1.　Googleメニューからドライブを選択

![名称未設定-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/d7cfd693-743a-60d9-f0ea-f14e274c4bcc.jpeg)

### 2. Google Apps Script選択

新規　→　その他　→　Google Apps Script

![スクリーンショット 2020-06-08 12.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/0478392d-c0dc-61d4-dca9-5dd3efdae7bc.png)


### スクリプトを編集

- タイトル変更（任意）

無題のプロジェクト　→　WebApi

- ファイル変更（任意）

コード.gs　→　main.gs

- スクリプト記述

```js:main.gs
function doGet(e) {
  const data = [
    {
      id:  "000",
      title: "タイトルが入ります。",
      description: "説明文が入ります。",
      createdAt: "2020-06-06T00:58:57Z"
    }
  ];
  const payload = JSON.stringify(data)
  const output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(payload);
  
  return output;
}
```
配列で入れていく
`const data = [{key名: "データ",key名: "データ",　...}, {...}, ...];`

key名は自由に入れることができる。
ただし、わかりやすい名称にすること。

### 3. Webアプリケージョンとして導入

タブバーの
公開 → ウェブアプリケーションとして導入...

#### 項目
- Current web app URL: こちらのURLがキーとなる。これを各自のコードに読み込ませて取得する
- Project version: 更新履歴 更新する際はNewを選択してAPI情報を書き換える
- Execute the app as: 管理者アカウント
- Who has access to the app: アクセス権限(only myself or Anyone,even anonymous)
※初回はアクセス権限のみ設定、更新時はProject versionを「New」に設定

### 4. アプリケーションに組み込む

Git HubにReactベースでデータ入れていますので、試してみてください。
※手順はREAD ME参照

[Git Hub URL]

- create-react-app
https://github.com/dai-570415/react-getapi
https://github.com/dai-570415/engineer-chat


- Next.js
https://github.com/dai-570415/hello-next
Oracle Graph Server and Client 同一ホップ数のshortestpath結果

## ゴール
 - Oracle Graph Server and Clientの最短経路抽出クエリについて挙動をまとめる

## 前提
 - Graph Server and Client(20.2)がインストール済みであること
 - 検証環境は以下の通り。

```
[oracle@localhost ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)
```

## 手順
```
opg-jshell> var g = session.<Integer>newGraphBuilder(IdType.INTEGER).addVertex(1).addVertex(2).addVertex(3).addVertex(4).addEdge(1,1,2).addEdge(2,1,3).addEdge(3,2,4).addEdge(4,3,4).build();
opg-jshell> g.publish();
```
![image (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/63d6aa84-3695-f626-f52e-35d600fdb814.png)

```
opg-jshell> g.queryPgql("select id(n) as src, count(e) as num_hops, id(m) as dst match shortest ((n)-[e]->*(m)) where id(n) = 1 and id(m) = 4").print();
+----------------------+
| src | num_hops | dst |
+----------------------+
| 1   | 2        | 4   |  ★同一ホップ数のものは経路がまとめられて出力される
+----------------------+
$10 ==> PgqlResultSetImpl[graph=anonymous_graph_4,numResults=1]
```
AndroidStudioでレイアウトをデザイン(layout_weight)

#AndroidStudioでレイアウトをデザインする(layout_weight)
AndroidStudio3.6.3現在、レイアウト方法は**LinearLayout**か**ConstraintLayout**を使うのが一般的のようです。
LinearLayoutには**horizontal**と**vertical**のパーツが用意されていますが、中身は同じでorientation値が異なるだけです。
ConstraintLayoutはLinearLayoutよりさらに高機能になっているようです。
※と言ってもそこまで使いこなせないわけですが

ConstraintLayoutでレイアウトを思い通り配置してみましょう。

それではConstraintLayoutを配置します。配置したConstraintLayoutを選択した状態で■をドラッグして位置や大きさを変更します。

配置したConstraintLayoutの中にボタンを3つ配置します。ConstraintLayoutにパーツを配置する場合はレイアウト画面へドラッグするよりコンポーネントツリーへドラッグする方が確実です。配置する親子関係を間違えた場合はコンポーネントツリー画面で修正が可能です。

ボタン3つはそれぞれ idを bt1、bt2、bt3とします。split画面でコードを変えつつデザインをみてみます。
レイアウトの指示は再度これを見て参考にして下さい。
![topstart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637460/01843f63-5b39-3e94-039e-3813c42468d7.png)
1.bt1のStartをドラッグしてConstraintLayoutのStartへドロップ
2.bt2のStartをドラッグしてbt1のEndへドロップ
3.bt3のStartをドラッグしてbt2のEndへドロップ
これで表示のルールが決まりました。左からbt1、bt2、bt3の順に並んで表示されます。

##ボタンの表示幅をConstraintLayoutの幅に応じて変更
このままではボタンは並びましたがConstraintLayoutの左側に表示されただけで、使われていない空間が存在します。
ボタンの横幅をConstraintLayoutに合わせるには**layout_weight**を使います。

split画面では新規要素の追加が出来ないので画面を**デザイン**に切り替えます。
ボタンの3つそれぞれのlayout_weightを1に、layout_widthを"0dp" に変更してみましょう。

するとボタンの横幅がConstraintLayoutの横幅いっぱいになるように広がります。
layout_weightに設定した「1」を比率を表すようです。
全て1に設定したのでボタン3つがそれぞれ 1:1:1 の比率で表示されるようです。