OmniAICreator/Qiita-1.07M huggingface dataset:
RedShiftクラスタを夜間縮退し、コストカットする

## 背景
* Redshiftは便利ですが、１度作ると原則24時間動き続けるので、利用料金がかさみます。
* 分析業務で人が利用する場合、日中はトランザクションが立て込むものの、夜間はあまり使われない。
* ElasticResizeの登場で、Classic時代に比べてリサイジングが高速になった。（数時間→10分程度）

## この記事について
* 上記背景から、日中は8台、夜間は4台という具合に、クラスター台数を時間毎に変更したい。
* 自動運用できるようにCloudWatchのルールからクラスタ台数変更lambdaをCronでコールする。
* なお、夜間完全に停止して良い場合は、こちらの方法でSnapShot＆停止・起動でも良いと思います。
    * https://www.gixo.jp/blog/5556/

## この記事の注意点
* とりあえずの運用のために書いた雑な記事です。
    * スクリプトでログ出力とか、型チェック、とかしていないです。
* 何かあればコメントください。

## 手順
### 1.lambdaでリサイズ関数を定義
* 下記のように、引数で受けたクラスタ名、クラスタサイズに変更
* 下記は変更予定がないので埋め込んじゃってます。
    * region_name
    * clusterType
    * NodeType
* 私の環境だと,python3.7で動かしています。

```python
import json
import boto3

def lambda_handler(event, context):
    # TODO implement
    name = event["Name"]
    size = event["Size"]
    cli = boto3.client('redshift',region_name='ap-northeast-1')
    
    cli.resize_cluster(
        ClusterIdentifier=name,
        ClusterType='multi-node',
        NodeType='dc2.large',
        NumberOfNodes=size,
        Classic=False
    )
    
```

### 2.cloudwatchにて、cronで上記のlambdaをコールするように登録
* cronで、下記要領で、1のlambdaをコール
    * 朝スケールアップ（4→8)
    * 夜スケールダウン（8→4）

#### 朝（スケールアップ時）

```json
{
  "Name": "Your cluster Name",
  "Size": 8
}

```
#### 夜（スケールダウン時）

```json
{
  "Name": "Your cluster Name",
  "Size": 4
}
```

## 諸々注意点
### RedShift
* Elastic Resizeの制約がある。
    * NodeTypeの変更はできない。（Classic Resizeが必要）
    * single-node → multi-nodeの変更はできない。（Classic Resizeが必要）
    * インスタンス数の変更は、1/2倍　or　2倍
    * Elastic Resizeでは、VACUUMが実行されないのでたまに実行（直接的に関係ないか。。）

* ディスク容量を考慮する。
    * 利用しているディスク領域以下にはリサイズできないので、利用領域とリサイズ後の総容量を確認

### lambda
* 実行権限の付与が必要（RedShiftの操作権限が必要です）
* タイムアウト時間は10～30秒程度に設定
gitのサブモジュールをうまいこと利用したい

# 背景
gitで管理しているプロジェクトのクラスを一部、他のプロジェクトでも使いたい。
丸ごとはいらないし、諸事情からcomposerなりで管理することもできない。
gitのsubmoduleってあんまり使ったことないけど、これでいけるんちゃうかな。

# 他にいい方法あるやろ！
なんかそんな気もするけど、submoduleの理解も兼ねて・・・

# 手順

#### Submoduleとして扱いたいプロジェクト（以下Sとする）をメインプロジェクト（以下Mとする）で使いたい

- MでSをサブモジュールとして呼び込む
- Sを最新にする（特定のバージョンで状態を止めておきたい場合は必要ないが）
- Sから必要無いファイルを外す

# 具体例

### MでSをサブモジュールとして呼び込む

```bash
git submodule add -b <branch> <url>
```

urlはサブモジュールリポジトリのURLです

bオプションで追従するブランチを指定しています。
まあデフォルトブランチを追従する場合bオプションはいらないかと思いますが。

### Sを最新にする（特定のバージョンで状態を止めておきたい場合は必要ないが）
submoduleはaddされた時点での最新コミットを見るように設定されるため、
今後submoduleの更新を追従したい場合には必要なコマンド

```bash
git submodule update --remote
```

これでsubmoduleの中身を最新に更新します。
ただ、他のプロジェクトに依存するのはしんどいので、メジャーリリースのタイミングとかに絞った方が良いかと思います。

### Sから必要無いファイルを外す
これで最新のSがMに含まれたと思いますが、
ほとんどいらないファイルかと思いますので、submoduleから外しちゃいましょう

対象ファイルを選択する手順としてはコマンドからやるのが一般的ですが、
ここは最終的にはプロジェクトのメンバー間で使う想定とし、gitで設定を管理できる形で紹介します。

で、結論から言うと他のメンバー用にこんなスクリプトとファイルをコミットしました。

```tex:.gitmodules
[submodule "<S>"]
	path = <S>
	url = <url>
	branch = <branch>
```
サブモジュールの状態を表すファイル
どこのURLのリポジトリのどのブランチをどこにaddするかを指定するのものです

<br>

```bash:init.sh
#!/usr/bin/env bash
git submodule update -i
cp ./sparse-checkout ./.git/modules/<S>/info/
cd <S>
git config core.sparsecheckout true
git read-tree -mu HEAD
```

開発環境作成の際にメンバーが実行するスクリプトです。名前はなんでもいいです

<br>

```bash:sparse-checkout
app/Services/
app/Repositories/
app/Models/
```

S内の必要なファイルを示したものです
ファイルの中身はこんな感じで必要なファイルをSから見たパスで指定し羅列します
例えば、一番上は`S/app/Services`といったディレクトリを丸ごと残しておく、という指示です

<br>

あと、コミットハッシュ（バージョン）が保存されているので
S自体のディレクトリ(?)もコミットします


#### これにより他のメンバーはinit.shだけを実行すれば、自動的にsubmoduleを引っ張ってきて、かつ特定のファイル以外は葬られる、という感じになります

## init.shの説明

```
git submodule update -i
```

.gitmodulesにしたがってsubmoduleを取得します


```
cp ./sparse-checkout ./.git/modules/<S>/info/
```
sparse-checkoutで設定した必要なファイル情報をgitの設定ディレクトリにぶち込みます

```
cd <S>
```

取得したモジュールSに移動


```
git config core.sparsecheckout true
```
gitのsparse-checkoutという技術を使うための準備


```
git read-tree -mu HEAD
```

上でぶち込んだsparse-checkoutに追従してHEADを更新します


# 免責事項
まだ試験運用中なんでなんか問題起きる可能性もございます。
なんかあれば追記します。。。
CentOS7 で VNCサーバにつながらない時の確認事項

## vncサーバがインストールされているか確認

 - インストール  
yum install tigervnc-server

 - 設定ファイル複製
cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:3.service

 - 設定ファイルの<USER>部分にvncユーザーを設定
/lib/systemd/system/vncserver@.service

		[Unit]
		Description=Remote desktop service (VNC)
		After=syslog.target network.target

		[Service]
		Type=forking
		# Clean any existing files in /tmp/.X11-unix environment
		ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
		ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
		PIDFile=/home/<USER>/.vnc/%H%i.pid
		ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

		[Install]
		WantedBy=multi-user.target

## vnc のサービスが起動しているか確認

vncserver :1
または
vncserver :2

## ファイアウォール(firewalld)にてVNC通信を許可
firewall-cmd --permanent --add-port=5901/tcp
（またはfirewall-cmd --permanent --add-port=5902/tcp）
firewall-cmd --reload
firewall-cmd --list-all

## 参考URL

[CentOS 7 でのVNCServerのインストールと設定 (TigerVNC Serverのインストール) (CentOS Tips)](https://www.ipentec.com/document/linux-centos-7-vncserver-tigervncserver-install)

[CentOS7にWindowsからVNCで接続する方法](https://qiita.com/SkyLaptor/items/48f1bd38f728199ed485)
herokuにLaravel+vueのアプリケーションをデプロイしたらLaravel mixが存在しないエラー

色々試してたら直ったので備忘録

#具体的なエラー
`ErrorException (E_ERROR)`
`The Mix manifest does not exist. (View: /home/vagrant/●●●●/resources/views/app.blade.php)`

ローカルだとMix manifestはnpm run devとかでビルドすると作成されるんだがherokuでそれをどうやってやるかわからんかった

#試した事

とりあえずビルド関連の設定を疑う

###package.json
productionモードでビルドすると
dependencies
の中のものしかインストールされないらしい
そしてlaravel-mixが**dev**Dependenciesの中に記述されていたので
devDependenciesに入ってるモジュールで動作に必要なものの記述を全部
dependenciesの中に移した

###そもそも意図した通りにビルドが終わってるか確認
直らなかったので、そもそもビルドが正常に終わってるのか？と思い（エラーは出ていないが）scriptsに下記を追記
（調べている時に理解したけどlaravel-mixを作成するために必要なコマンドは
ここの中に記述すればいいらしい）

```
"postinstall": "echo postinstallおわったんご",
"heroku-prebuild": "echo heroku-prebuildおわったんご",
"heroku-postbuild": "echo heroku-postbuildおわったんご."
```
再ビルドすると表示されるはずのメッセージが表示されないではないか


もしやと思いherokuのサイトにあるRun consoleコンソールから`npm -v`を実行した
バ　ー　ジ　ョ　ン　番　号　が　出　て　こ　な　い
ということは・・・

###herokuの設定
そもそもnode.jsがBuildpackに含まれていなかった
てっきりデフォルトで入っていると思っていたので盲点だった
Add buildpackから追加
<img width="1202" alt="スクリーンショット 2019-01-24 14.55.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/217652/e14dfd0a-4c82-136c-123c-355edbb24e5e.png">
念のためRestart all dynosから再起動
<img width="233" alt="スクリーンショット 2019-01-24 14.59.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/217652/145a8282-67dc-1602-e0cc-4bbd2c0b149d.png">

明らかにビルド時のログが長くなった！
仕込んだビルド時のメッセージも表示されるようになったので
heroku上でproductionモードのビルドを実行するために
こんな感じに修正

        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "postinstall": "echo postinstall finished!!",
        "heroku-prebuild": "npm run production",
        "heroku-postbuild": "echo heroku-postbuild finished!!"

無事動くようになった、めでたしめでたし
そもそもherokuの使い方わかってなかった感ある


###余談
今回自分は遭遇しなかったが
`sh: 1: cross-env: not found`
こういったエラーが出る場合はこんな感じでフルパスで記載すればいいらしい

    "dev": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development webpack-dev-server --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
    "production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
「break-allやbreak-wordとか、改行どうすりゃいいんだ問題」の解決法

## TL;DR
CSSの改行処理について悩ましい…
何度か悩んだが、自分の中で改行する場合(文字溢れ)のスタイルを決めた。

- 基本的には `overflow-wrap: word-wrap;` で改行
- 例外として、文字内容が制御可能な箇所に限り `word-break: word-all;` も可


## サンプルコード
```
// 改行箇所: 単語で区切る
// NOTE: CSS2の仕様としてword-wrapがあったが、現状はoverflow-wrapに変わった。autoprefixerで自動処理してくれないので、pluginいれるか直書きしておく。
body {
  overflow-wrap: break-word;
  word-wrap: break-word;
}
```
※`word-break: break-word;`も、一見同等なスタイルに見えるけど[CJK用](https://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97)のスタイルのために策定されたものなので、言語によって改行処理が異なる可能性があると考えられるため却下。
禁則処理もレンダリングしてくれてたので、これがいいと思う。

```
// 改行箇所: 幅で区切る
// NOTE: 基本的には使わず、あくまでCJK用のHack的に使う。例外のステートクラスとか作っておくと良いのかも。
.is-wordAll {
  word-break: break-all;
}
```


### 悩み箇所

> 😠 word-wrapが効いてない！

レンダリング時に横幅の計算ができてないので改行処理ができていません。
その場合は、widthなどを指定して対応。

https://w3g.jp/blog/confusing_word-break_word-wrap
こちらに詳しく対応方法の説明あったので参考にさせていただきました。

> 改行させないようにしたい

```
div {
  white-space: nowrap;
}
```
これが良いと思います。
`word-break: keep-all;` とか使いたいとこですが、これもCJK用なので使用しないほうが良さげ。

## 参考

https://w3g.jp/blog/confusing_word-break_word-wrap
https://developer.mozilla.org/ja/docs/Web/CSS/word-break
https://developer.mozilla.org/ja/docs/Web/CSS/overflow-wrap
https://developer.mozilla.org/ja/docs/Web/CSS/text-overflow
メアドをさくっと難読化 [PHP/Laravel/Blade]


表題の件ですが、こんな感じです！

```html:html.blade.php
<script> document.write(atob('{{ base64_encode('hoge@fuga.com') }}')) </script>
```

これでこんな感じに難読化してくれます。解析されませんように。

`<script> document.write(atob('aG9nZUBmdWdhLmNvbQ==')) </script>`
Oracle マニュアルリンク集

# Oracle Database 11g (11.1)
ドキュメント・ライブラリ
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/index.htm

# Oracle Database 11g (11.2)
Oracle Databaseオンライン・ドキュメント 11g リリース2 (11.2)
https://docs.oracle.com/cd/E16338_01/index.htm

# Oracle Database 12c (12.1)
スタート・ガイド
https://docs.oracle.com/cd/E57425_01/121/index.htm

# Oracle Database 12c (12.2)
スタート・ガイド
https://docs.oracle.com/cd/E82638_01/index.html

# Oracle Database 18c
スタート・ガイド
https://docs.oracle.com/cd/E96517_01/index.html
EBSのボリュームサイズを拡張した

## 事前作業

↓とかを読んで事前にEBSの変更しておきましょう。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/console-modify.html

簡単ですね

# 変更後

ここからはec2にsshして作業します。

## 現状確認

`df`と`lsblk`で現状確認しておきます。

```
[ec2-user@ip- ~]$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         463M     0  463M    0% /dev
tmpfs            480M     0  480M    0% /dev/shm
tmpfs            480M  404K  480M    1% /run
tmpfs            480M     0  480M    0% /sys/fs/cgroup
/dev/nvme0n1p1   8.0G  6.9G  1.2G   86% /
tmpfs             96M     0   96M    0% /run/user/1000
[ec2-user@ip- ~]$ lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  150G  0 disk
├─nvme0n1p1   259:1    0    8G  0 part /
└─nvme0n1p128 259:2    0    1M  0 part
```

↑
最近のインスタンスはNVMeになってますね。ただし`/dev/xvd*`にシンボリックリンクあるので、コマンドはNVMeじゃないところと共通にできます。

```
[ec2-user@ip- ~]$ sudo file -s /dev/xvd*
/dev/xvda:    symbolic link to `nvme0n1'
/dev/xvda1:   symbolic link to `nvme0n1p1'
/dev/xvda128: symbolic link to `nvme0n1p128'
```

## パーティションを広げましょう

`growpart`を使ってパーティションを広げます。

```
[ec2-user@ip- ~]$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=314568671,end=314572767
[ec2-user@ip- ~]$ lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  150G  0 disk
├─nvme0n1p1   259:1    0  150G  0 part /
└─nvme0n1p128 259:2    0    1M  0 part
```

↑
はい広がりました。


## ファイルシステムの方も広げましょう

`xfs_growfs`を使ってxfsのファイルシステムも広げてれば完了です。

```
[ec2-user@ip- ~]$ sudo xfs_growfs /dev/xvda1
meta-data=/dev/nvme0n1p1         isize=512    agcount=4, agsize=524159 blks
        =                       sectsz=512   attr=2, projid32bit=1
        =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
        =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
        =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 39321083
[ec2-user@ip- ~]$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         463M     0  463M    0% /dev
tmpfs            480M     0  480M    0% /dev/shm
tmpfs            480M  408K  480M    1% /run
tmpfs            480M     0  480M    0% /sys/fs/cgroup
/dev/nvme0n1p1   150G  7.0G  144G    5% /
tmpfs             96M     0   96M    0% /run/user/1000
```

↑
完了ですね。簡単ですね。

## まとめ

無停止でもディスク容量増やせるので、簡単でいいですね。
でも150GBもあると2千円くらい月額費用が発生するので、もう少し小さくても良かったなと思いました。
Apache2.0.X系で.htaccessによる時間制限のRewrite設定したときのメモ

# はじめに
Apache2.0.X系で.htaccessによる時間制限のRewrite設定したとき、はまったのでメモします。

以下、15:00～22:00のみアクセス許可を例に記載しています。

# 結論:動いた設定
最初に結論で、以下の設定が期待値どおりに動きました。

```
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{TIME_HOUR}%{TIME_MIN} <1500 [OR]
  RewriteCond %{TIME_HOUR}%{TIME_MIN} >2200
  RewriteCond %{REQUEST_URI} !=/maintenance.html
  RewriteRule ^.*$ /maintenance.html [R,L]
</IfModule>
```
# エラーになったケース
## エラーその１：RewriteRule: invalid HTTP response code for flag 'R'

最初、時間制限をどうやって書くのか、といういことで、
[https://blog.shnr.net/?p=165](https://blog.shnr.net/?p=165)
こちらのサイトを参考にしていたのですが、
error_logに"RewriteRule: invalid HTTP response code for flag 'R'"と
出力されてしまいました。

```
ErrorDocument 503 /maintenance.html
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{TIME_HOUR}%{TIME_MIN} <1500 [OR]
  RewriteCond %{TIME_HOUR}%{TIME_MIN} >2200
  RewriteCond %{REQUEST_URI} !=/maintenance.html
  RewriteRule ^.*$ - [R=503,L]
</IfModule>
```

## エラーその２：Unsupported HTTP response code 310

次に
[https://oki2a24.com/2013/10/14/cannot-503-specify-response-status-code-in-apache-2-0-64/](https://oki2a24.com/2013/10/14/cannot-503-specify-response-status-code-in-apache-2-0-64/)
こちらのサイトをみて、
Apache2.0.X系は300～400を指定すると書いてあったので、
レスポンスコードを変えたら動くかと期待したら、
error_logに"Unsupported HTTP response code 310"と
出力されてしまいました。

```
ErrorDocument 310 /maintenance.html
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{TIME_HOUR}%{TIME_MIN} <1500 [OR]
  RewriteCond %{TIME_HOUR}%{TIME_MIN} >2200
  RewriteCond %{REQUEST_URI} !=/maintenance.html
  RewriteRule ^.*$ - [R=310,L]
</IfModule>
```

## エラーその３：301～307ではエラーはでないが、時間外にみれてしまう。
で、301,302...と順々に変更したら、エラーはでないが、
時間外でもサイトがみれてしまう。
308以降を使うと、"Unsupported HTTP response code"になることがわかる。

```
ErrorDocument 301 /maintenance.html
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{TIME_HOUR}%{TIME_MIN} <1500 [OR]
  RewriteCond %{TIME_HOUR}%{TIME_MIN} >2200
  RewriteCond %{REQUEST_URI} !=/maintenance.html
  RewriteRule ^.*$ - [R=301,L]
</IfModule>
```

# おわりに
偶然、結論の書き方をしたら、期待通りの動きをしたのですが、
ぐぐっても古すぎる情報を検索するのは困難なので、
Apacheのバージョンあげてほしいものです。
tslint-reactの一部のみのrule、jsx-keyだけ使いたかった

tslint-reactをextendsで全ルール適用する方法は簡単に見つかるけど、一部を使う方法がすぐに見つからなかった。

```
{
  "rulesDirectory": [
    //x "tslint-react",
    "tslint-react/rules", //ok
    "tslint-plugin-prettier"
  ],
  "rules": [
    "jsx-key": true
  ]
```

node_modules内のこれを見て気づいた
https://github.com/palantir/tslint-react/blob/master/tslint-react.json
fork した子プロセスの終了時に at_exit を実行しない

# 問題

[Sucker Punch](https://github.com/brandonhilkert/sucker_punch) を使っているアプリ内で、[`Kernel.#fork`](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/fork.html) を使うと何故かすべてのキューが終了してしまった。

# 原因

Sucker Punch がキューのシャットダウンを `at_exit` に書いており、
[`Kernel.#fork`](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/fork.html) で作成した子プロセスが終了すると `at_exit` が実行されることが原因だった。

# 対応

[`Kernel.#exit!` のドキュメント](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/exit=21.html)に書いてあった。

> exit! は exit とは違って、例外処理などは一切行ないません。 Kernel.#fork の後、子プロセスを終了させる時などに用いられます。

```ruby
pid = fork do
  # 子プロセスの処理
  exit!
end

Process.waitpid(pid)
```

`fork` や `at_exit` のドキュメントに書かれていなかったので結構彷徨ってしまった…。
Windows10上でインストールせずにPostgreSQL10.6を動かす

何度も調べるのでまとめました。他の環境でもほぼ同じ感じだと思います。

1. https://www.postgresql.org/download/windows/
にアクセスし、zip archiveのリンクをクリック
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/82535/cfdce134-37f2-116d-d62c-19b23e058611.png)

2. Version10.6の Win x86-64 をダウンロード
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/82535/89cde9db-2028-1825-58ee-e22aa03e655a.png)

3. ダウンロードしたzipを c:\bin に解凍(C:\bin\pgsqlとなる)

4. Windowsキー＋Rでcmdを実行し、C:\bin\pgsql に移動
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/82535/48b8ea3d-8113-b76f-0e37-103da8e7e762.png)

    ```powershell:カレントディレクトリの移動
    > cd \bin\pgsql
    ```

5. 以下のコマンドを実行しデータベースを初期化する（途中2回パスワードを聞かれるので設定したいパスワードを入力する）

    ```powershell:データベースの初期化
    > bin\initdb -U postgres -A password -E utf8 -W -D data
    ```
    - -U はデータベースの所有者
    - -A password は認証方式をパスワード認証にする指定
    - -E utf8 は文字コードをUTF-8にする指定
    - -W はパスワードを手入力する指定
    - -D data はデータフォルダを C:\bin\pgsql\data にする指定
6. 以上で準備は完了。起動するには以下のコマンドを実行

    ```powershell:データベースサーバの起動
    > bin\pg_ctl -D data -l pg.log start
    ```
    - -l pg.log はログを C:\bin\pgsql\pg.log に出力する指定

7. SQLを実行するには以下のコマンド（パスワードを聞かれるので設定したパスワードを入力する）

    ```powershell:SQLの実行用シェルを起動
    > bin\psql -U postgres
    ```

    ```:データベース一覧
    postgres=# \l
                                             データベース一覧
   名前    |  所有者  | エンコーディング |      照合順序      | Ctype(変換演算子)  |     アクセス権限
-----------+----------+------------------+--------------------+--------------------+-----------------------
 postgres  | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
 template0 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
 template1 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
(3 行)
    ```
    **よく使うコマンド**

    ```:データベース切り替え
    postgres=# \c postgres
    データベース "postgres" にユーザ "postgres" として接続しました。
    ```
    
    ```:テーブル一覧
    postgres=# \dt
    リレーションが見つかりませんでした。
    ```
    
    ```:テーブル作成
    postgres=# create table test(a int, b text);
    CREATE TABLE
    ```
    
    ```:テーブル一覧
    postgres=# \dt
           リレーション一覧
 スキーマ | 名前 |    型    |  所有者
----------+------+----------+----------
 public   | test | テーブル | postgres
(1 行)
    ```
   
    ```:テーブル定義
    postgres=# \d test
                テーブル "public.test"
 列 |   型    | 照合順序 | Null 値を許容 | デフォルト
----+---------+----------+---------------+------------
 a  | integer |          |               |
 b  | text    |          |               |
    ```
   
    ```:終了
    postgres=# \q
    ```

8. 停止するには以下のコマンドを実行

    ```powershell:データベースサーバの停止
    > bin\pg_ctl -D data stop
    ```
Ubuntu 18.04.1 LTS で端末でのサスペンドの方法

投稿練習を兼ねて。
###端末にこれを打ち込むだけ
端末(ターミナル)を開いて以下のコマンドを打ち込む。

```terminal
systemctl suspend
```
これでサスペンド状態になる。

###サスペンドからの復帰
通常ならキーボードかマウスを触れば復帰できるはず。もしくは電源ボタンを短く一回押せば復帰できるはずです。詳しくは[こちら](https://help.gnome.org/users/gnome-help/stable/power-suspendfail.html.ja)を参照してください。
【初心者必見】ローカル環境構築 Rails編【Mac OS】

[【初心者必見】ローカル環境構築 Ruby編【Mac OS】](https://qiita.com/yukiji/items/bfa71d1983d9ce4e7892)の続きです。


## Bundlerのインストール

```:ターミナル
gem install bundler
```

<br />

インストールされているかを確認するためにバージョンを確認するコマンドを打つ

```:ターミナル
bundler -v
```
<br >

- Bundlerとは
 
> Railsでアプリを作成する際に便利な`gem`と呼ばれるライブラリをインストールするために必要。`gem`同士の互換性を保ちながらパッケージの種類やバージョンを管理してくれる仕組みのこと。


## MySQLのインストール

```:ターミナル
brew install mysql
```

<br >

インストールされているかを確認するためにバージョンを確認するコマンドを打つ

```:ターミナル
mysql --version
```

<br />

 MySQLの起動

```:ターミナル
mysql.server start
#Mysqlなどのデータベースが起動していないと、アプリにアクセスした時にエラーが出ます
```

<br />

- MySQLとは
 
> Railsアプリ等でデータを保存するためのデータベース管理システム
保存したデータを取得してビューに表示させたりするのに使います。
Railsはデフォルトで`SQLite`を使用しますが、利用者数と情報の多さから`MySQL`を推奨します


## Railsのインストール

```:ターミナル
gem install rails
```

<br />

インストールされているかを確認するためにバージョンを確認するコマンドを打つ

```:ターミナル
rails -v
```

<br />

以上でRailsの導入は完了です。
Word2Vecをシンプルに動かすためのサンプルコード

## なに？

日本語でWord2Vecのもっともシンプルなサンプルです。
ポイントは、テキストファイルとか経由しない、日本語なので分かち書きもする、です。

何度やっても忘却の彼方にいってしまうためインターネットを私有化する自分用のメモです。
けれど、誰かの役に立つかもしれないので……

## コード

```python
text = '吾輩は猫である。名前はまだ無い。どこで生れたか頓（とん）と見當がつかぬ。何でも薄暗いじめじめした所でニヤーニヤー泣いて居た事丈は記憶して居る。吾輩はこゝで始めて人間といふものを見た。然（しか）もあとで聞くとそれは書生といふ人間中で一番獰悪（だうあく）な種族であつたさうだ。此書生といふのは時々我々を捕（つかま）へて煮て食ふといふ話である。然し其當時は何といふ考（かんがへ）もなかつたから別段恐しいとも思はなかつた。但（たゞ）彼の掌（てのひら）に載せられてスーと持ち上げられた時何だかフハフハした感じが有つた許（ばか）りである。掌の上で少し落ち付いて書生の顔を見たのが所謂（いはゆる）人間といふものゝ見始（みはじめ）であらう。此時妙なものだと思つた感じが今でも殘つて居る。第一毛を以て装飾されべき筈の顔がつるつるして丸で薬罐（やくわん）だ。其後猫にも大分逢つたがこんな片輪には一度も出會（でく）はした事がない。加之（のみならず）顔の眞中が餘りに突起して居る。そうして其穴の中から時々ぷうぷうと烟（けむり）を吹く。どうも咽（む）せぽくて實に弱つた。是が人間の飲む烟草（たばこ）といふものである事は漸く此頃（このごろ）知つた。此書生の掌の裏（うち）でしばらくはよい心持に坐つて居つたが、暫くすると非常な速力で運轉し始めた。書生が動くのか自分丈（だけ）が動くのか分らないが無暗に眼が廻る。胸が惡くなる。到底助からないと思つて居ると、どさりと音がして眼から火が出た。夫迄（それまで）は記憶して居るがあとは何の事やらいくら考へ出さうとしても分らない。'

from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()

sentences = text.split("。")
tokenizer = Tokenizer()

word_list = []
for sentence in sentences:
    tokens = tokenizer.tokenize(sentence)
    temp_word = []
    for token in tokens:
        if token.part_of_speech.split(",")[0] in ["名詞","動詞"]:
            temp_word.append(token.base_form)
    word_list.append(temp_word)

import gensim
model = gensim.models.word2vec.Word2Vec(word_list, size=100, min_count=1, window=5, iter=100)

# 単語の足し算、引き算
ret = model.wv.most_similar(
    positive = ['吾輩','猫'],
    negative = '猫'
)

for item in ret:
    print(item[0], item[1])

# 単語の類似度 COS類似度のため -1～1
a = model.wv.similarity('吾輩','猫')
print(a)
```

## 少しだけ注意点

事前に `pip` で、`word2vec` と `janome` は入れておいてください。

```bash
> pip install word2vec
> pip install janome
```

1行目の `text` をファイルから読み込むようにすればテキストファイルのものも解析できますが、全て一気に読み込むと非常に大変なので、１行ずつ読み込んで処理していくなどするとよいと思います。

`Word2Vec(word_list, size=100, min_count=1, window=5, iter=100)` の `minc_count` を `1` にしていたり、サンプル用になっています。このあたりは実際はチューニングしてもよいです。
CFEもビルドしてみた。

たまたま転がり込んで来たBCM3380というSOCをいじってみました。BCM3380はBroadcomの最後の頃のmips SOCで珍しい4Kcのマルチコアです。

ターゲットはこれです。

https://github.com/freebsd/freebsd-wifi-build/wiki/Thomson-TCW770

CATVのケーブルモデム用のSOCでJ:COMで使われているNetgearの製品にも入っているようです。

BCM33xxはCATV用でBCM63xxはADSL用で提供されていました。CPUなどは共通のものが使われていてBCM3380はBCM6328に近いと思われます。BCM6328とBCM6318が同じ世代でその前はBCM6368はBCM6358と同じ世代になり、その前の世代はBCM6338とBCM6348がありました。BCM6348はBCM3348と同等と考えられます。63系は68の次に18になりましたが33系はリニアに数字が大きくなったようです。

SPI SOP 16PなFlashなのではがして、DIPなソケットを付けてみました。


![写真（2018-06-13 10.07）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/550d939b-b904-b07e-b1c5-26737dc36a0b.jpeg)

ちょっと高くなりすぎてシールドにあたってしまうので、今度もう少し低い変換を作ります。^ ^;

オリジナルのまま起動してみるとブートとファームが一体化していて、ブートで止めたりコマンドオペーレションをする事が出来ないようです。

これはおそらくeCosを使っていてRedBoot入れずにeCosから直接ファームを起動しているのではないかと想像されます。

しかたがないので、とりあえずブートを作るところからです。

u-bootを移植した人がいるようです。

https://lists.denx.de/pipermail/u-boot/2017-May/291525.html

最近のu-bootはLinuxへの依存が強くなっていて、FreeBSDのLinuxエミュレーションではビルドできなさそうなので、これを使う事はあきらめました。

GPLで提供されているBCM3380のソースにeCosなソースがありましたが、これはRedBootではないので、こちらもあきらめました。

上のu-bootのpatchを見るとBCM6348などをベースに修正している事が分かります。

BCM63xxなブートを探してみたところcfe_bcm63xxというコードがありました。これをBCM33xx用に修正する事にしました、

BCM3380に一番近いと思われるBCM6358をベースにします。

レジスタのアドレスが下記のファイルにあるのでUARTなどのアドレスを書き換えます。

shared/broadcom/include/bcm963xx/6358_common.h

ビルドは以下のディレクトリでgmakeで実行します。gccなどのLinux用のtoolchainはアーカイブに入っていて、いくつかのMakefileをいじったところバイナリは出来ました。

cfe/build/broadcom/bcm63xx_rom

ところがバイナリが極端に小さいのです。Flashに焼いて実行しても何も起きません。

コードをおってみたところ、このディレクトリでビルドできるものは、プリブートローダーで、以下のディレクトリでビルドしたものが実際のCFEのブートローダーのようです。

cfe/build/broadcom/bcm63xx_ram

このディレクトリでビルドするとバイナリが出来て、それをromのディレクトリにflashimg.Sというファイルでダンプして入れ込むようです。

そのダンプ用のツールのhostTools/cmplzmaがなぜかlzmaの圧縮がうまくできないため、デバッグするのも面倒なのでZRouterのoldlzmaを使ってあらかじめ圧縮して、ダンプだけのコマンドに修正しました。

これでそれっぽいバイナリが出来たのですが、やはり起動しません。

コードを読みなおしてCFG_MULTI_CPUSという定義があったので、下記のファイルの定義を0から1にしてみました。

cfe/cfe/arch/mips/board/bcm63xx_ram/include/bsp_config.h

ところがramでビルドするとエラーで通りません。しかたがないので、とりあえずramの時は0でromの時に1にしてビルドしました。

焼いてみたところ、UARTから文字が出力される事が確認できました。

```
HELO
DRAM
```

SETLEDS('H','E','L','O')のようなマクロで、4文字をUARTに出力するようになっています。

UARTがつかえるようなればもうこちらのものです。

と思ったのですが、メモリコントローラーの初期化など結構ハードル高かったです。長期戦になりそうです。

https://oldwiki.archive.openwrt.org/doc/hardware/soc/soc.broadcom.bcm33xx
https://oldwiki.archive.openwrt.org/doc/hardware/soc/soc.broadcom.bcm63xx
https://wikidevi.com/wiki/Broadcom
Reactで scrollの position/top/位置/value/値 の取得



以下の両方でとれる。

```react
<div
	ref={(el)=> console.log($(el).scrollTop()) }
	onScroll={(v)=> {
		// elementが取れる
		console.log(v.target);
	}}
>
```

**注意**

`console.log(v)`

とした時、

targetには `null` と表記された。

が、実際に `console.log(v.target)` とすると

elementが出力された。

やばみ。
Dictionaryをdynamicに変換する

あんまりdynamicって使ったことなかったので作ってみた。

```cs:DynamicDictionary.cs
    public static class DynamicDictionaryExtension
    {
        public static dynamic ToDynamic<TValue>(this IDictionary<string, TValue> dict)
        {
            return new DynamicDictionary<TValue>(dict);
        }
    }

    public class DynamicDictionary<Tvalue> : DynamicObject
    {
        private IDictionary<string, Tvalue> _dict;
        public DynamicDictionary(IDictionary<string,Tvalue> baseDict)
        {
            _dict = baseDict;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            var name = binder.Name.ToLower();
            if (_dict.TryGetValue(name, out var value))
            {
                result = value;
                return true;
            }
            result = null;
            return true;
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            var name = binder.Name.ToLower();
            if (_dict.ContainsKey(name))
            {
                _dict[name] = (Tvalue) value;
                return true;
            }
            _dict.Add(name,(Tvalue)value);
            return true;
        }

        public override IEnumerable<string> GetDynamicMemberNames()
        {
            return _dict.Keys;
        }
    }
```

使い方としてはこう

```cs:Sample.cs
        static void Main(string[] args)
        {
            var dict = new Dictionary<string, string>()
            {
                {"a", "えー"},
                {"b", "びー"},
                {"c", "しー"}
            };


            Console.WriteLine("dict.keys:" + string.Join(",", dict.Keys));
            Console.WriteLine("dict.Values:" + string.Join(",", dict.Values));

            Console.WriteLine("-----");
            var dynamicDict = dict.ToDynamic();

            dynamicDict.a = "エー";
            dynamicDict.d = "デー";

            Console.WriteLine("dict.keys:" + string.Join(",", dict.Keys));
            Console.WriteLine("dict.Values:" + string.Join(",", dict.Values));
        }
```

```text:console
dict.keys:a,b,c
dict.Values:えー,びー,しー
-----
dict.keys:a,b,c,d
dict.Values:エー,びー,しー,デー
```

なんの変哲もひねりもないですが、
dynamic型で受け取る必要がある関係上、varも使えないし、Genericsの型の引数解決も出来ないので

```cs
dynamic dynamicDict = new DynamicDictionary<string>(dict);
```
こう書かざるを得ないのがちょっとアレだったので、拡張メソッド(ToDynamic)を用意。

すると

```cs
var dynamicDict = dict.ToDynamic();
```
こう書ける。というところだけがこだわりポイント。
Bundle コマンドまとめ

なんか

- gem instal bundler
- bundler 
- bunble install


とかか色々あるけど、それぞれ何やってるのかごちゃごちゃしてるからまとめます
ちなみに使ってるフレームワークSinatraです

## gem install bundler
というかまずgemって何かってところからなんですが

> GemはRubyGemsが公開しているライブラリのことです。
> RubyGemsはRuby用のパッケージ管理ツールで、ライブラリの作成や公開、インストールを助けるシステムです。

つまり、**バージョン管理をいい感じにしてくれるrubyライブラリ管理するやつ**です。

引用元
https://tomoyuki65.com/what-is-rubys-gem/

で、「gem install bunder」
って何してるかっていうところなんですが、bundlerってgemを落としてるんです。コマンドよく見るとそのまんまです。

## bundle install

それで、bundlerが１つにgemに過ぎないということはわかった。じゃあ、bundlerってgemは何をしてるのかというところですよ。

bundleて日本語訳すると、こん感じで束ねるって意味です。
gem のbundlerは、gemたちをまとめあげてくれてる人なんですよ。

<img width="496" alt="スクリーンショット 2019-01-24 14.07.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/263783/9c287a92-7ce6-70ea-947f-fd25900523f4.png">


フレームワーク内でなんとなくライブラリ使えてると思いますが、ほんとはbundlerみたいに、gemを１つひとつインストールしないといけないんですよ。

**gem install sinatra**

みたいな感じで。

でもそれってとってもめんどくさいじゃないですか！！
んでですよ、それを解決するのが

**bundle instal** 

なんですよ

そういえば、Gemfileに一覧でinstall ~~~って書くじゃないですか。
あれ全部あのコマンド１つでinstallしてくれるんですよ
すごいですよね


## bundle, bundler

- bundle
- bunder
- bundle install

ってなんかやるとどれも、同じような挙動するじゃないですか
僕もこれ何が違うんかなとずっと思ってたんですがほんとは

全部、おんなじらしいです。

ええええええええええええええ、ほんとかよ。
一旦それで進もう。

## bundle update

なんかたまにエラーをググってると出てきますよね
これ、これ実は、

**bundle install** の友達なんですよ

bundle installするとinstall履歴がgemrock(スペル間違ってる気がする)に履歴みたいにして記録されるんですよ。
で、再度bundle　installするとgemrock をみて、installしてないやつをinstallするんですね

でも、bundle updateは違って、gemrockは見ないで、gemfileに書いてあるgem強制的に全部installするらしいです。

へ〜〜って感じですよね。 できれば、bundle install -f　みたいにして欲しかった





## 最後に


はいいいいいいいいい〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜。まとめ終了
おつかれ
間違ってたらごめんね
ローカル変数を別のメソッド内で使いたい

# swift初心者です。下記コードのmapViewメソッド内のnameという引数をprepareメソッド内で使いたいのですがそれは可能でしょうか？可能であればどのようにすればよいか教えていただきたいです。お忙しいと思いますがよろしくお願いします。


```
func mapView(_ mapView:GMSMapView, didTapPOIWithPlaceID placeID:String,
                 name:String, location:CLLocationCoordinate2D) {
        let position = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude)
        let marker = GMSMarker(position: position)
        
        self.performSegue(withIdentifier: "Second", sender: nil)
      
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "Second" {
            let secondViewController = segue.destination as! SecondViewController
            secondViewController.Text = name as! String
        }
    }
```
rails+vue+webpackerでproductionが真っ白になった件

# 概要

railsとvueの組み合わせで、production環境で画面が真っ白になるという症状に出くわしました。

# 関連issue

https://github.com/rails/webpacker/issues/1520

これを見つけなかったらもっと苦しんでいたと思います。

最終コメントは去年の12月なので割と最近ですね。

# railsにvueをインストール

この環境で

```
Rails 5.2.2
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
```

vueをインストールすると

```
rails webpacker:install:vue
```

最後にこういう警告が出ます。

```
You need to enable unsafe-eval rule.
This can be done in Rails 5.2+ for development environment in the CSP initializer
config/initializers/content_security_policy.rb with a snippet like this:
if Rails.env.development?
  policy.script_src :self, :https, :unsafe_eval
else
  policy.script_src :self, :https
end
Webpacker now supports Vue.js 🎉
```

なるほどこういう設定が必要なのかと納得して追加し、開発環境では問題なく動作していました。

しかしproductionにデプロイしたところ何も見えない状態になり、consoleにもエラー表示などなく、ただしれっとbodyが空になっていました。

# webpackerがおかしいことに気づく

chromeのdeveloper toolsをさらにいろいろ見ていたら、Sourcesタブで返されるjsの中身が全て空になっていました。

<img width="686" alt="Screen Shot 2019-01-24 at 13.36.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/29484/0102325c-ee21-2e70-a0c2-648e80dabd14.png">

これはwebpackerの設定などが何かおかしいのかと思いググり方を変えたところ、前出のissueを見つけることができました。

# 設定を変更

issueにも書いていますが

こうではなく、

```config/initializers/content_security_policy.rb
if Rails.env.development?
  policy.script_src :self, :https, :unsafe_eval
else
  policy.script_src :self, :https
end
```

こう設定することで無事にproductionでも動作するようになりました。

```config/initializers/content_security_policy.rb
if Rails.env.development?
  policy.script_src :self, :https, :unsafe_eval
end
```

こんなどうでもいいところでハマる人を増やさない為にも記事にしました。

二時間ぐらい飛びました。
GitHubでCloneすると「remote: Repository not found.」がでる。

初めてCloneしたら

```
git clone https://github.com/aaaaaa/repo.git
```

下記のエラー

```
remote: Repository not found.
fatal: repository 'https://github.com/aaaaaa/repo.git' not found
```

ユーザ名とパスワードを入れてクローンしなおしたらいけました。

```
git clone https://NAME:PASSWORD@github.com/aaaaaa/repo.git
```

メモ
【一年生の頃の私へつづる言葉⑥】自分用の情報収集URLメモを作っておいて。

・今となっては、当然のごとく使用していることを、ただ手紙としてしたためるだけの記事の第六弾。
・「Orangeごっこ」で過去の私へ毎日長文の手紙を送りつけるという、素敵な「ご執心」ぶりに、毎度毎度の自画自賛。
・「日付指定して送付できないかなー」と、現実と虚構の区別がつかなくなっている事態に、決して気づこうとしない楽天生活。
・よし。今回は早期に作成しておけばよかったことを書こう。

## 情報収集について
### ＜当時＞
- 「やり方」・・・気になったものは、ブックマークかSlack等にメモする程度。  
→特定のニュースサイトや技術サイトを見つけていなかった。  


→最新のトレンドやツール等の発見や、不明事項の調査時間の遅さに大きくつながる。

### ＜現在＞
・[こちらの記事](https://qiita.com/nesheep5/items/e7196ba496e59bb2aa28)を参考にしながら、自分でも見やすさや情報量等を重点に置きながらサイトを調べて、専用のメモを作成。
・下記一覧

- ***学習***
※学習やサンプルアプリ参考等に活用。
    - [フリープログラミングテキスト集](https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books-ja.md)（※使用率高い）  
    - [ドットインストール](https://dotinstall.com/)  
    - [ひしだま's 技術メモページ
](http://www.ne.jp/asahi/hishidama/home/tech/index.html)  
    - [teratail](https://teratail.com/)  
    - [Qiitaアドベントカレンダー](https://qiita.com/advent-calendar)  

- ***ニュース・トレンド・特集***
※毎朝の日課的に見る。多すぎると見切れないので、厳選して少なくする。
    - [はてなブックマーク テクノロジー](http://b.hatena.ne.jp/hotentry/it)  
    - [モヒカンSlack](https://mohikan.slack.com)  
    - [newspicks テクノロジー](https://newspicks.com/theme-news/technology/)  
    - [GIGAZINE](http://gigazine.net/)
    - [TechCrunch](https://jp.techcrunch.com/)
    - [HackerNewsまとめ](https://hackero.co/)

- ***資料作成・参考***
※資料やスライド作成の際に、参考にしている。
※LINEアドセンター公開資料はPDFのため、ダウンロードせずに表示する場合は、[ここ](https://aprico-media.com/posts/1273)を参考。
    - [SlideShare](https://www.slideshare.net/)  
    - [Pinterest](https://www.pinterest.jp/)  
    - [LINEアドセンター公開資料](https://adcenter.linebiz.com/mediaguide/)

- ***息抜き***
※休憩時間や頭のリフレッシュ、ふとしたアイデアの参考等に活用。
    - [オモコロ](https://omocoro.jp/)  
    - [grape](https://grapee.jp/)  
    - [株式会社LIG](https://liginc.co.jp/)  
            
### ＜過去の私へ送る言葉＞
- <font color = "tomato">よく見るサイトはまとめておくと、きっと役に立つよ</font>
- <font color = "tomato">自分用メモに正解はないから、ほんのわずかでもいいから記録していこう。</font>

## まとめ
- 今回は、情報収集URLメモということで、ブックマーク見失いやトレンド見逃しに遭っていたころを思い出しながら、記事を書く。
- 手紙にするにあたって、久々にメモを更新しようと思い、いくつか新規追加したものを、平然と前から見てた感じで文章に載せる「品格欠如行為」。
- 「これで過去の私の手助けとして貢献できたかな」という、恩着せがましさ全開の奉仕精神の私は、このメモで今日も情報収集にひた走る。

## 参考
- https://qiita.com/nesheep5/items/e7196ba496e59bb2aa28  
→こちらの記事を参考にいたしました。大変お世話になりました。
serverless-dynamodb-localにエラーが出た時の対処方法

## はじめに

Serverless Frameworkを使って、　ローカルでAPI GatewayとDynamodbの挙動を確認したかったが、`serverless-dynamodb-local`でエラーが出たのでその対象方法のメモ

## 環境

* serverless 1.36.1
* serverless-dynamodb-local 0.2.31

## 前提

* serverless-dynamodb-local
がインストールされていること


## 遭遇したエラー

```
$ sls dynamodb install
```

何も結果が表示されない

```
$ sls dynamodb start
```
以下のようなエラーが発生

```
Error: spawn java ENOENT
```

## 対処方法

`serverless-dynamodb-local`の0.2.31にはバグがあるらしく、0.2.30を使うようにすると回避出来た。

```
// package.jsonのあるディレクトリ階層で以下実行
$ npm uninstall serverless-dynamodb-local

// バージョン指定でインストール
$ npm install serverless-dynamodb-local@0.2.30
```

これで、`serverless.yml`のディレクトリへ移動し、

```
$ sls dynamodb install

$ sls dynamodb start --migrate
```

でローカルにdynamodbを構築出来る。
Macでsudoが効かない

# 原因
MacでsudoができないのはSystem Integrity Protectionが有効になっているため。

# 対策
**自己責任で**以下を実施。

1. Macをreboot
2. 立ち上がるときに `command + R` を押しっぱなしにして Recovery OSを起動。
3. ターミナルを起動
4. SIPをdisableにする。
   
   ```bash
   csrutil disable
   ```

最後にMacをreboot


# エラーメッセージ

```bash
csrutil: failed to modify system integrity configuration. This tool needs to be executed from the Recovery OS.
```

# 環境

```bash
 ~ % sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.6
BuildVersion:	19G73
```
VSCodeでマルチカーソル機能を使ったら、画面が回転してしまう場合の対応（Windows10）

# 先に結論
Windows側（Intelのグラフィックスドライバ）のホットキー機能を停止する。

「Ctrl＋Alt＋上下矢印」が画面回転とマルチカーソルで重複して割り当てられているために発生する問題なので。

# 手順
- デスクトップの何もないところで右クリック
- グラフィックス・オプション
- ホットキー
- 「無効」を選択

# 余談
画面回転機能をむしろ知らなかったので、マルチカーソルを使おうとして画面が真っ逆さまになったときは一瞬焦りました。。。

それにしても、マルチカーソルは便利ですね！
【Laravel】TerminalからHomestead(vagrant)のDB（PostgreSQL）にPosticoから接続する

タイトル通りです。
ほぼメモ書きです。ほぼ自分用。ご容赦ください。

・Mac OS Mojaveが原因かはわかりませんか、Psequelなどのツールがフリーズする
などが原因で、うまく接続できませんでした。

そこで、下記記事のPosticoというツールを使ったところうまくいったので、記載しておきます。
引用記事：<a href="http://kayakuguri.github.io/blog/2016/06/09/homestead-postgres-via-homestead/">Laravel HomesteadのPostgreSQLにPosticoから接続する</a>

<a href="https://eggerapps.at/postico/">Postico公式サイト</a>

<table>
<thead>
<tr>
<th></th>
<th align="left"> 項目 </th>
<th align="left"> 内容 </th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td align="left"> Nickname </td>
<td align="left"> (なんでも) </td>
</tr>
<tr>
<td></td>
<td align="left"> Host </td>
<td align="left"> localhost (デフォルト) </td>
</tr>
<tr>
<td></td>
<td align="left"> Port </td>
<td align="left"> 5432 (デフォルト) </td>
</tr>
<tr>
<td></td>
<td align="left"> User </td>
<td align="left"> homestead </td>
</tr>
<tr>
<td></td>
<td align="left"> Password </td>
<td align="left"> secret </td>
</tr>
<tr>
<td></td>
<td align="left"> Database </td>
<td align="left"> homestead </td>
</tr>
<tr>
<td></td>
<td align="left"> SSH Host </td>
<td align="left"> 192.168.10.10 </td>
</tr>
<tr>
<td></td>
<td align="left"> Port </td>
<td align="left"> 22 (デフォルト) </td>
</tr>
<tr>
<td></td>
<td align="left"> User </td>
<td align="left"> vagrant </td>
</tr>
<tr>
<td></td>
<td align="left"> Password </td>
<td align="left"> vagrant </td>
</tr>
<tr>
<td></td>
<td align="left"> Private Key </td>
<td align="left"> なし </td>
</tr>
</tbody>
</table>

これで接続できるはずです。

<img width="645" alt="スクリーンショット 2019-01-24 13.26.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/201842/a182c99e-8bfa-d94e-0f4f-d1a9f3695ecb.png">

Connectをクリックして

<img width="736" alt="スクリーンショット 2019-01-24 13.27.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/201842/4fe3691e-4633-fe52-aed6-cf7a57680115.png">

OKです！
xAPIとcmi5の技術リソース

2019年初頭時点での xAPI と cmi5 の技術リソースを集めました。
どちらかというと、eラーニングの教材コンテンツ制作や独自の配信システム（コースウェア）の開発に役に立つかという立場です。



## 仕様書

まずは仕様。

- [xAPI Spec](https://github.com/adlnet/xAPI-Spec)

- [CMI-5 Spec Current](https://github.com/AICC/CMI-5_Spec_Current/)

[日本eラーニングコンソーシアムによる翻訳](https://www.elc.or.jp/edtech/tincan/#cmi_dl)も参照。



## 実装

### LMS

[eラーニングマネージャー5z](http://www.gingerapp.co.jp/information/%E3%80%8Ccmi5%E3%80%8D%E5%AE%8C%E5%85%A8%E5%AF%BE%E5%BF%9C%E3%81%AE-lms%E3%83%97%E3%83%AD%E3%83%88%E7%89%88%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/)
（ジンジャーアップ）
世界初（同社の言）のcmi5完全対応のLMS。

### LRS

[ADL LRS](https://lrs.adlnet.gov/)（ADL）
本家ADLによる**公式の**実装。
データがパブリックになってしまうので、技術開発やテスト用のみに使うこと。

[Learning Locker](https://www.ht2labs.com/learning-locker/) （HT2Labs）
xAPI対応のLRS。
**オープンソース**。有志による Docker イメージなどもある。
日本では[インフォザイン](http://edu.infosign.co.jp/learninglocker)が代理店となっている。

[Rustici LRS](https://rusticisoftware.com/products/rustici-lrs/)（Rustici Software）
xAPI対応のLRS。
同社の[SCORM Cloud](https://rusticisoftware.com/products/scorm-cloud/)環境の一部として無料で使える。

[TANSU](https://xapi.co.jp/tansu/)（ジンジャーアップ）
国産のxAPI対応のLRS。

### AU

[cmi5 AU Simulator](https://github.com/cawerkenthin/cmi5-AU-Simulator)
AU側のリファレンス実装　「Verb に passed を指定する際には extensions に masteryScore や moveOn を入れる」といったベストプラクティスも入っている。

[xAPIWrapper](https://github.com/adlnet/xAPIWrapper)
ADL公式のxAPIライブラリ

_COMING SOON_
2019年1月23日にミーティングで公式の JavaScript ライブラリをつくることになったと発表された。

## 解説記事


[野良ウサギのSCORM - xAPI/CMI5](https://norausa.org/?page_id=258)

[ジンジャーアップ - xAPI ( Experience API )/ LRS/ cmi5 : 機能編](http://www.gingerapp.co.jp/xapi-lrs/)

[LearningSolutions - Make Any HTML File cmi5-Conformant](https://www.learningsolutionsmag.com/articles/2447/make-any-html-file-cmi5-conformant)

[eLearningArt - xAPI Tutorial: Get started in under 1 hour](https://elearningart.com/blog/xapi/)

[eLearning Chef - CMI-5 Moving Forward (cmi5 – sandstone)](http://elearningchef.com/cmi-5-moving-forward-cmi5-sandstone/)

[Initial xAPI/Caliper Comparison](https://www.imsglobal.org/initial-xapicaliper-comparison)
IMS Global Learning によるxAPIとCaliperの比較

## Twitter

仕様策定のためのメーリングリストもあるけれど、一利用者としてトピックをリアルタイムで追いかけるのならTwitterのほうがいい感じ。

[@CMI5Spec](https://twitter.com/CMI5Spec)

[@RISC_Inc](https://twitter.com/RISC_Inc)

[@rusticisoftware](https://twitter.com/rusticisoftware)

[@xAPIGnome](https://twitter.com/xAPIGnome)
MySQLで複数カラムを操作する場合に1クエリでまとめる方法

MySQLで複数カラムを操作する場合に1クエリでまとめる方法です。

```
# 複数カラムの操作を複数行で書く場合
ALTER TABLE USERS ADD INDEX USER_ID_INDEX(USER_ID);
ALTER TABLE USERS ADD INDEX USER_NAME_INDEX(USER_NAME);
ALTER TABLE USERS DROP COLUMN USER_EMAIL;

# カラムの操作を1クエリで書く場合
ALTER TABLE USERS 
  ADD INDEX USER_ID_INDEX(USER_ID),
  ADD INDEX USER_NAME_INDEX(USER_NAME),
  DROP COLUMN USER_EMAIL;
```
wemosで7segLEDでclock

#概要

wemosで、tensorflow.jsで学習した、biasとweightで7セグメントを推定して、時計を実装した。

#写真



![](https://i.ytimg.com/vi/w7JwSIGjfHc/hqdefault.jpg?sqp=-oaymwEZCPYBEIoBSFXyq4qpAwsIARUAAIhCGAFwAQ==&rs=AOn4CLApxDTdS_20eC5ek4ySSF2azJrOCA)


#動画
19:28を表示。
https://www.youtube.com/watch?v=w7JwSIGjfHc

#仕掛け

この記事で、tensorflow.jsで7セグメントを学習した。
https://qiita.com/ohisama@github/items/a1b196599f90d4241c76
biasとweightを取り出して、wemosで推定した。
隠れ層は、20で、変数は、doubleで247個でarduinoでは、無理。
アクチベーションは、sigmoid
7segLEDは、i2cで動く。
時計は、tickerで、動く。
推定が、失敗すると、7segLEDが、ぐちゃぐちゃになるはず。


以上。
LINE Messaging APIのブロックの判定

## 結論
先に書いておくと、まだ出来ない。
※判定方法が不明

## ユーザごとのLINEの配信結果を知りたい
LINEのMessaging APIを使って
LINE@アカウントから複数のユーザに対して配信を行い、
下記の結果を知りたい。
**ユーザごとの配信成功/失敗、ブロックしていて配信出来ない**

## 複数のユーザに対する配信はどのAPIを使う？
最大ユーザーID数が1度に150人の
下記の**マルチキャストAPI**のエンドポイントが公開されている。
`POST https://api.line.me/v2/bot/message/multicast`

これ一択だと一瞬思うが、
**レスポンスを確認しても1人1人の成功/失敗がわからない**ようだ。


ちなみに、2019年1月17日に、
`/bot/message/multicast`エンドポイントを使って
**送信されたマルチキャストメッセージの数を取得出来る**ようになったらしい。

が、パラメータは`date`で`yyyyMMdd`単位でしかわからないようなので、
1回/日しか配信しないとか、
日ごとに定期的に配信とかなら結果をDBに保存して差分とか見れば使えるのかも。
痒いところに手が届きませんな。

ということで、
配信結果がわかるプッシュメッセージをユーザ数分打つことにした。
`POST https://api.line.me/v2/bot/message/push`

## ブロックの判定
配信するAPIも決まったのであとは
ブロック時にどんなレスポンスが返ってくるか
がわかれば問題は解決。

ということでLINE@アカウントをブロックして、
自分宛にPushメッセージを送信してみたところ、
`200 OK`が返ってきた。

まぁ、リクエストは飛んだのだろう。
で、メッセージはというとこちら。
`{}`

<img width="412" alt="スクリーンショット 2019-01-24 13.00.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/201542/63be92b5-7dda-6445-5936-89fb4f826ff8.png">

配信成功もブロックも同じらしい。
記憶が正しければ、前は判定出来た(少なくともメッセージくらいは返ってきた)気がするが、
仕様が変わってしまったのだろうか。

教えて偉い人。
ユーザ管理して、
Unfollowイベント拾ってDBとかでブロックしてる人を管理しないと
ブロックの判定は無理なのだろうか。
片対数グラフを読む

片対数グラフを使って，$y=Ca^{x}$の関係にあるデータの，$C$や$a$を求める方法のメモ．
$y=e^{x}$を例に，片対数グラフから底$e=2.718...$を求めてみます．

# 手順
__1. 片対数グラフにデータをプロット__
__2. 直線の傾き・切片を読み取る__
__3. 指数の底やべきを求める__

# 手順1 片対数グラフを用意
$y=e^{x}$のデータとグラフを作ります．
実際は，次に示すグラフが実験などから得られたという想定です．

```python
import numpy as np
from matplotlib import pyplot as plt

x = np.arange(0, 10, 0.1)
y = np.exp(x)
plt.plot(x, y)
plt.show()
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336657/ae94fab3-9cfc-226d-2214-b39fd8ee3564.png" width=60%>

次に片対数グラフを描画します．

```python
plt.yscale('log') # y軸を対数表示に
plt.plot(x, y)
plt.show()
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/336657/1c455c2f-86f4-c9f6-314a-952d02a4518c.png" width=60%>

片対数グラフで描画すると直線になりました．
この直線の傾きと切片から，本来未知である$y=Ca^x$の$C$と$a$がわかります．

#手順2 傾きと切片を求める
片対数グラフでは，y座標の間隔が調整されているだけで値は変わってません．そのため，このまま直線の傾きを求めようとしても，傾き一定に__見えている__だけなので増加率は場所によって異なってきます．

ではどうするかというと，グラフから読み取れる2つの座標$(x_1, y_1)$,$(x_2, y_2)$のうち，y座標に常用対数$\log_{10}$をとった上で傾き$a$を計算します．

```math
\begin{equation}
a = \frac{\log_{10} y_1-\log_{10} y_2}{x_1-x_2} \\
\end{equation}
```
実際にグラフを読み，適当な二点を取り出してみます．

```python
In [92]: x[10], np.log10(y[10])
Out[92]: (1.0, 0.4342944819032518)

In [93]: x[35], np.log10(y[35])
Out[93]: (3.5, 1.5200306866613813)
```

直線の式を$Y=ax+b\quad(Y=\log_{10} y)$とすれば，通る２点の座標から
$a=0.434...$
$b= 2.220\times 10^{-16}\cong0$
と求まります．

#手順3 指数のべきと底を求める
直線の式を$(y=)$と書き直せば

```math
\begin{eqnarray*}
\log_{10}y &=& ax+b \\
y &=& 10^{ax}10^{b} \\
&=& 10^{0.434x} \\
&=& (10^{0.434})^{x}
\end{eqnarray*}
```
$10^{0.434}=2.716...$なので，だいたい$e=2.718...$に近い値を求めることができました．
Oracleネタ帳 Statspackについていろいろ

# Statspackのインストールについて
あとでまとめる

# スナップショットの取得
SQL*Plusでstatspack.snapプロシージャを実行する

``` sql
exec statspack.snap(i_snap_level => 7);
```

# Statspackレポートの取得
SQL*Plusでspreportスクリプトを実行する

``` sql
@?/rdbms/admin/spreport
```

# スナップショットの削除
SQL*Plusでstatspack.purgeプロシージャを実行する

``` sql
execute statspack.purge(i_num_days=>7, i_extended_purge=>TRUE);
```

# 別サーバで取得したスナップショットを別環境に取り込み、レポートを作成するには
1. Statspackのスナップショットを格納しているスキーマをexpdpでエクスポートする
2. 別環境で任意のスキーマにDumpをインポートする
3. sprepinsスクリプトを実行する

...で良かったはず...

## sprepinsスクリプト
SQL*Plusで実行する

``` sql
@?/rdbms/admin/sprepins
```
Node-RED ノード開発環境構築

# Node-RED ノード開発環境構築

やりたいこと。

- Node-RED は Vagrant の Linux 環境にインストール。
- ノードのソースコードはファイル共有し、ホスト側（Windows）で編集したい。

## Vagrant ファイル共有

ファイル共有の方式によっては、シンボリック・リンクを作成するような操作をサポートしていません。

そのため`npm`を使ったライブラリのインストールが失敗してしまうことがあります。

結論として、今回は`rsync`方式を採用します。

### Vagrantfile 設定

|        設定        |         内容         |
| ------------------ | -------------------- |
| ホスト OS          | Windows 7            |
| ゲスト OS          | Ubuntu 16.04 Server   |
| Vagrant Box        | `bento/ubuntu-16.04` |
| ホスト共有フォルダ | `../data`            |
| ゲスト共有フォルダ | `/vagrant_data`      |

`config.vm.synced_folder`の`rsync__exclude`設定は、除外したいファイルやディレクトリを指定します。

Vagrantfile:

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  config.vm.box = "bento/ubuntu-16.04"

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.synced_folder "../data", "/vagrant_data",
    type: "rsync",
    rsync__exclude: [
      "node_modules/",
      ".git/",
      ".gitignore"
    ]

end
```

### ファイル同期手順

1. ホスト Windows のコマンドプロンプトを起動。
2. `Vagrantfile`がある場所に移動して以下を実行。

```
vagrang rsync
```

また、ファイル更新時に自動で同期したい場合は以下を実行します。

```
vagrant rsync-auto
```

## Node.js インストール

Ubuntu 16.04 のデフォルト`nodejs`のバージョンはかなり古いです。

新しいバージョンをインストールする方法は以下。

Node.js v10.x:

```
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
```

## Node-RED インストール

`node-red`をグローバル・インストールします。

```
sudo npm install -g --unsafe-perm node-red
```

### Node-RED 手動起動

```
node-red
```

`127.0.0.1:1880`でリッスンします。

ホスト Windows のブウラザで`http://192.168.33.10:1880`にアクセスするとページが表示されます。

### Node-RED 自動起動

Node-RED の起動は`pm2`にまかせます。

まず`pm2`をグローバル・インストールします。

```
sudo npm install -g pm2
```

`node-red`起動方法を`pm2`に設定します。

```
pm2 start /usr/bin/node-red -- -v
pm2 save
```

`pm2`自体の起動方法は`systemd`サービスとして登録します。
`pm2 startup`で登録コマンドの内容が表示されます。

```
pm2 startup
```

表示されたコマンドをコピー＆ペーストして実行します。

```
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u vagrant --hp /home/vagrant
```

以上、登録完了です。

#### ログ確認方法

```
pm2 logs node-red
```

#### 再起動方法

```
pm2 restart node-red
```

## ノードのインストール

```
cd ~/.node-red
npm install {ノード・プロジェクトのディレクトリパス}
```

インストール後、ソースを編集したら rsync 同期、Node-RED 再起動で更新できます。
CORS対応まとめ

#呪いの言葉
これいつも出くわすと面倒だから、*curse(呪い)*と発音したい。。。

#設定方法
例としてアイコンフォントファイルをサブドメインで使い回すとしたら
###普通のWebサーバーの場合
.htaccessファイルに以下を記載。

```
SetEnvIf Origin "^https://(.*)\.YOURDOMAIN\.com$" ACAO=$0
Header set Access-Control-Allow-Origin %{ACAO}e env=ACAO
```
###AWS S3の場合
S3のバケットのアクセス制限、「CORSの設定」を選択

```
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
```

###Firebase hostingの場合
firebase.jsonのhostingに以下を追加。

```
"hosting": {
//"public"とか"ignore"に加えて

    "headers": [
      {
        "source": "**/*.@(eot|otf|ttf|ttc|woff|font.css)",
        "headers": [
          {
            "key": "Access-Control-Allow-Origin",
            "value": "*"
          }
        ]
      }
    ]
}
```

#補足（先に断っておくと）
AWSとFirebaseについては、ワイルドカードを使用した条件設定なので、厳密に設定したい場合は別の記事を参考に。

#補足2
追加。[Alibaba Cloudを用いた例](https://qiita.com/kntrttm/items/bc52a4907667c30e0780)