OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel5】認識機能を実装した際に追加される「Auth::routes()」にオプションを指定してカスタマイズする

# `php artisan make:auth`は便利だけど登録機能は別で作りたい

という場合があると思うので、標準で実装される登録機能のルーティングを外してみたりしてみます。
（**※Laravel5.7系以上**）

# ソース

`php artisan make:auth`を実行後、ルーティングに以下のコードが自動追加されると思うので、こいつに引数を渡していく

```routes\web.php
Auth::routes();
```

ちなみに上記のルーティング情報は以下の通りです。
![WS000045.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/f9a196b7-54bd-133a-06ba-639441dbf719.jpeg)


`Auth::routes()`に対して以下のようにオプションで引数をbooleanで渡してやるとルーティングの設定をON/OFFできる

```routes\web.php
Auth::routes([
    'verify'   => true, // メール確認機能（※5.7系以上のみ）
    'register' => false, // デフォルトの登録機能OFF
    'reset'    => true,  // メールリマインダー機能ON
]);
```

上記のルーティング情報は以下の通り。`register`が消えて`verify`が追加されていると思います。
![WS000046.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/071d43ae-0554-dde3-be7b-321ed67c888e.jpeg)


大本のソースは以下（`laravel\framework\src\Illuminate\Routing\Router.php`）にあります。
コードを見てもらったらわかると思いますが、デフォルトで`register`（登録機能）と`reset`（パスワードリマインダー）はスカフォールディングした段階で有効になるように書かれています。
（以下のソースはLaravel5.8系なので、**新機能のメール確認機能**の`verify`が記述されていてかつデフォルトで無効になるようになっています）

```laravel\framework\src\Illuminate\Routing\Router.php
    /**
     * Register the typical authentication routes for an application.
     *
     * @param  array  $options
     * @return void
     */
    public function auth(array $options = [])
    {
        // Authentication Routes...
        $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
        $this->post('login', 'Auth\LoginController@login');
        $this->post('logout', 'Auth\LoginController@logout')->name('logout');

        // Registration Routes...
        if ($options['register'] ?? true) {
            $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
            $this->post('register', 'Auth\RegisterController@register');
        }

        // Password Reset Routes...
        if ($options['reset'] ?? true) {
            $this->resetPassword();
        }

        // Email Verification Routes...
        if ($options['verify'] ?? false) {
            $this->emailVerification();
        }
    }
```

# おわり
- 使用してない機能はルーティングをOFFにして不要なコントローラーは削除しておきましょう
- ただし、↑の引数で設定を切り替えられるのは5.7系以前は実装されてないみたいなので注意してください。
Laravel-Mixで本番環境コンパイル時に環境変数の間違いをビルドで知らせる

# 背景

しょうもない話ですが、 `.env`で環境変数の間違いをしたことがあります。
本番環境(production)のハズなのに開発環境(develop)をしてしまったりとか
(ありえない間違いですが、ヒューマンエラーなので起こりうる)。

## 対応
`webpack.mix.js` にて以下コードを追加

```js
if (mix.inProduction() && process.env.MIX_APP_ENV !== "production") {
  const errMsg = "本番環境コンパイル時は環境変数を「production」に設定してください！";
  throw new Error(errMsg);
}
```

`.env`でMIX_APP_ENVが「production」じゃなければ例外を投げてビルドを強制終了すれば良いかな？
Kingfisher v5.7.0対応の既存Swiftソースの修正

　Kingfisherバージョンを最新のv5.7.0にあげると既存いくつのメソットが
deprecatedされたので、その対応をメモして置きます。 Swiftバージョンは4.2

### １） KingfisherManager.shared.cache.retrieveImageInDiskCache() メソット
```swift:ImageDownloader.swift
 let diskImage = KingfisherManager.shared.cache.retrieveImageInDiskCache(forKey:URLString)
```
以下のようにクローチャでImageを読み込むように

```swift:ImageDownloader.swift
 var diskImage : UIImage? = nil
 KingfisherManager.shared.cache.retrieveImageInDiskCache(forKey:URLString) { result in
     switch result {
         case .success(let value):
             if let image = value?.alwaysOriginal {
                 diskImage = image
             }
         case .failure(let error):
             print("Error: \(error)")
         }
     }
```
### 2） KingfisherManager.shared.cache.store() メソット

```swift:ImageDownloader.swift
 KingfisherManager.shared.cache.store(roundedImage, original: originalData, forKey: URLString, toDisk: true, completionHandler: {
     print("キャッシュ後の処理")
 })
```
以下のようにクローチャでそれぞれメモリキャッシュとハードディスクキャッシュ後の処理をそれぞれ対応できるように

```swift:ImageDownloader.swift
 let parsedOptions = KingfisherParsedOptionsInfo([])
 KingfisherManager.shared.cache.store(roundedImage, original: originalData, forKey: URLString, options: parsedOptions, toDisk: true, completionHandler: { result in
   switch result.memoryCacheResult {
       case .success():
           print("メモリキャッシュ成功後の処理")
       }
   switch result.diskCacheResult {
       case .success():
           print("ハードディスクキャッシュ成功後の処理")
       case .failure(let error):
           print("Error: \(error)")
       }
   })
```

### ３） KingfisherManager.shared.downloader.downloadImage() メソット

```swift:ImageDownloader.swift
 KingfisherManager.shared.downloader.downloadImage(with: URL, options: optionInfo, progressBlock: progressBlock) { (image, error, imageURL, originalData) -> () in
   if let image = image, let originalData = originalData {
     print("ダウンロードされたImageの処理")
   }
}
```
以下のようにクローチャのresult結果でそれぞれのImageとDataを取得するように

```swift:ImageDownloader.swift
 KingfisherManager.shared.downloader.downloadImage(with: URL, options: optionInfo, progressBlock: progressBlock) {
   result in
   switch result {
   case .success(let value):
   let image = value.image
   let originalData = value.originalData　
     print("ダウンロードされたImageの処理")
   case .failure(let error):
        print("Error: \(error)")
   }
 }
```
詳しい説明になりませんが、助けになったらと思います。
間違い所がありましたら、ご指摘くださいますように。

参考URL：
https://github.com/onevcat/Kingfisher/wiki/Kingfisher-5.0-Migration-Guide
属性セレクタを閉じ忘れると、SafariとiPhoneでjQueryが動かない

スマホで一部jQueryの動作が聞かなくなるという現象が起きた。

例えば以下のようなコード。
属性セレクタを利用してアコーディオンを実装した。

```js
	$('[data-acc-cont').hide();
	$('[data-acc-click').click(function(e){
		e.preventDefault();

		var key = $(this).attr('data-acc-click');
		var $target = $('[data-acc-cont="'+key+'"]');

		if($target.length) {
			$(this).toggleClass('is-open');

			if($(this).hasClass('is-open')) {
			// open
				$target.slideDown();
			}else{
			// close
				$target.slideUp();
			}
		}

		return false;
	});
```

chrome、firefoxだと動く。
しかしiPhoneだと動かない。

safariのコンソールでやっとエラーが吐かれてた。

```
Error: Syntax error, unrecognized expression: [data-acc-cont
```

ただの属性セレクタの閉じ忘れやん…、基礎すぎて呆れるわ…。
勝手に解釈するのやめて…。
Laravel で updateOrCreate を使う際に Unknown column 'id' in 'where clause'  でハマった

### 概要

Laravel の Eloquent が持っている updateOrCreate という関数を使った。
https://readouble.com/laravel/5.7/ja/eloquent.html

MySQL でも気軽に Upsert 処理ができて便利だと思った。

実装例
```App\VeryGoodSystem::updateOrCreate(
    ['user_id' => 12345],
    ['is_registered' => true]
);```

いざ利用してみたところ、下記のようなエラーが出た。
```Unknown column 'id' in 'where clause' ... ```

エラーを追うと、 updateOrCreate で実行されている SQL 文に ```where `id` is null``` という条件が付いていることがわかった。

コードを見ても、 ```id``` という変数を使っている所は無く、途方に暮れながら調べていたら、良い Q&A を見つけた。（最下部、参考サイト）

つまり、 model に primaryKey が設定されていないと default で id という文字列を使って updateOrCreate 用の SQL を作成してしまうようだった。

利用している Model に ```$primaryKey = 'user_id'``` の一行を追加することで解決した。

### 参考サイト
https://laracasts.com/discuss/channels/eloquent/understanding-of-updateorcreate
JavaScriptで[ 0, 1, 2, 3, 4 ]のような連番の配列を生成する方法

JavaScriptで`[ 0, 1, 2, 3, 4 ]`のような連番の配列を生成する方法です。

```js
[...Array(5)].map((_, i) => i) //=> [ 0, 1, 2, 3, 4 ]
```

spread operator`...`と、arrow function`=>`を使っているためES6以降で動作します。

## 解説

上のコードは3つのパートに分けられます。

### パート1: `Array(5)`

これは要素数が5つ(=スロットが5つあるだけ)の空っぽの配列を作る。`undefined`が5つ入るわけでない。

```js
Array(5) //=> [ <5 empty items> ]
```

### パート2: `[...Array(5)]`の`[... ]`の部分

要素数が5つある配列をspread operatorにかけて、`undefined`5つの配列に変形している。

```js
[...Array(5)] //=> [ undefined, undefined, undefined, undefined, undefined ]
```

### パート3: `.map((_, i) => i)`

`map`メソッドで`undefined`5つの配列を、インデックス番号が値になった配列に変形している。

```js
[ undefined, undefined, undefined, undefined, undefined ].map((_, i) => i)
```

## 応用: `[ 1, 2, 3, 4, 5 ]`のように1始まりにしたい場合

```js
[...Array(5)].map((_, i) => i + 1) //=> [ 1, 2, 3, 4, 5 ]
//                            ^^^ mapのコールバック関数で+1の演算をすればよい  
```

※ `(_, i) =>`のアンダースコアは第1引数を使わないという意味です。第2引数だけ使いたいのですが、第1引数も受け取る必要があるため、_を置いています。
特定のコマンドだけ別ユーザで実行する

##目的
特定のコマンドだけ別ユーザで実行する。
プロジェクトで規定されてる、シェルの実行ユーザだとoracle周りのコマンドを叩く権限がないので何とかしたい。

##例
```sh
# シェルの実行ユーザで実行される
touch start.txt

# ここだけoracleユーザで実行する
su - oracle -c sqlplus ***/***@*** @***.sql

# シェルの実行ユーザで実行される
touch end.txt
```

##所感
-c  オプションってこういう風に使うのか。
[man su](https://linuxjm.osdn.jp/html/gnumaniak/man1/su.1.html)見ても、この説明からこんな挙動をするとは思えないよねぇ。
>-c command, --command=command
対話的なシェルを起動するのではなく、シェルに -c オプションとともに command (実行されるコマンドライン一行) を渡す。


ところで、qiitaのタグで「shell」と「ShellScript」と「shellスクリプト」でタグ分かれてるの何とかならんのかしら。
cuDNN初期化エラーが出てTensorFlowGPUの学習ができなくなったけど解決した話

　Jupyterでコード書いて機械学習しようとしたとき、エラー吐いてどハマりしたので共有しといた方が良いと思った話です。

#環境
　Anaconda+JupyterとCUDA+TensorFlowGPU+Kerasでディープラーニングさせている。CUDAは10.0、cuDNNも該当バージョンをインストール済み。CPU版はアンインストールした。ちゃんと動くはずの環境。ていうか今までちゃんと動いてた。

#状況
　Kerasで学習をさせようとするとエラーを吐く。1回目はちゃんと動く。でも、他のコードを実行すると止まる。場合によっては1回目でも止まる。PC再起動させると1回は治る。でも2回目はエラー。えらー。error。
　昨日までちゃんと動いてたのに。何もしてないのに壊れた。

　具体的にはこんな感じのエラーメッセージが出て動かない。

`UnknownError: 2 root error(s) found.
  (0) Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
	 [[{{node conv2d_1/convolution}}]]
	 [[metrics/acc/Mean/_193]]`

#調べる
　エラーを読むと、cuDNNの初期化に失敗してるらしい。ググってみたらどうやらcuDNNのPATHが通ってないとこうなるよ、とのこと。
　環境変数調べる。ちゃんとパス通ってるように見える。Anacondaごと再インストールしても症状が治らない。そもそも1回はちゃんと動くのが最高に意味不明でCOOL。
　入れなおせど入れなおせど我が症状治らざり。

#ぢっとタスクマネージャを見る
![タスクマネージャ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448703/7583f340-f2c3-6050-9b5c-f5ce143586eb.png)

　Jupyter終了させているのに**Pythonプロセスが生きてた**。しかもえらい量メモリ確保してる。この辺でなにかおかしいことに気付く。もしかしてJupyterって終了させてもメモリ解放しない？いやいやそんなまさか…

#再度調べる

> [作業していたブラウザのタブを閉じるだけでは終了したことにはなりません](https://code-graffiti.com/how-to-use-jupyter-notebook/#toc17)

　**そのまさかだった**。JupyterNotebookは**タブを閉じてもプログラムは終了しない**とのこと。まじか。今までタブを閉じて終わらせてた。無知って怖い。
　このあたりでJupyterのこの辺の仕様が原因な気がしだしてTensorFlowのGPU確保の仕方も調べる。

#そしてTensorFlowの仕様
　TensorFlow-GPUは、デフォルトだとGPUの**空いている領域をすべて確保**しようとする。すべてです。ALL。
　つまり、TensorFlow-GPUを使った機械学習プログラムを複数同時に走らせると1つめは普通に通るけど2つめはGPUを確保できないので**初期化に失敗する**。これが`cuDNN failed to initialize`の正体。
　そしてJupyterをタブ閉じで終わらせると**GPUを確保したままゾンビ化する**。その後Jupyterを立ち上げ直しても**GPUはゾンビ化したコードに専有されたまま**なのでこれも初期化失敗する。これが1回目でも学習失敗する症状の正体。
　試しに1つめのコードを走らせたあと、Jupyter上でコードを停止させてから2つめを走らせると、**普通に動いた**。CUDAもcuDNNもAnacondaも悪くない。悪いのはGPUをひとり占めしようとするTensorFlowと**タブを消したらゾンビ化する**Jupyterやったんや。

#結論
　コードは実行が終わったらちゃんと停止させましょう。Jupyterを終了させるときはちゃんとQuiteで終わらせましょう。TensorFlowが確保するメモリ量を制限するやり方も有効です。やり方は以下の記事が分かりやすいです。おわり。

- [tensorflow2.0 + kerasでGPUメモリの使用量を抑える方法](https://qiita.com/studio_haneya/items/4dfaf2fb2ac44818e7e0)

#参考文献
- [jupyter notebook上でkeras+tensorflow-gpuで学習するとGPUメモリが開放されなくて困ってる](https://qiita.com/studio_haneya/items/06645547195f38fefcaf)
- [JupyterNotebookでGPUのメモリを解放する方法-Windows編](https://betashort-lab.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/python/jupyternotebook%E3%81%A7gpu%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-windows%E7%B7%A8/)
CheckPoint機器に関するTips

(yyyy.mm.dd追記)

---

# はじめに

Checkpointをさわる機会があり、今後また関わる時用の備忘録として残します。
構築手順も気が向いた時に載せる予定です。

当記事を参考にする上で、以下の点に注意してください。

- 投稿主が機器構築時に得られた知見を記載しているので、ものによってはマニュアルに記載のないものもあったり、サポート外のものもあったりします。実際に活用するときは自己責任でお願いします。 
- 以下のバージョンで確認取れてますが、その他のバージョンの場合コマンドが弾かれる可能性があるので注意。

```
> show version all
Product version Check Point Gaia R80.20 
OS build 101
OS kernel version 2.6.18-92cpx86_64
OS edition 64-bit
```

# どんな人向け？

- CheckpointのCLIコマンド使いたいけどあまりわからない。
- パラメータシート作る時に何を参考にしたら良いかわからない。

# Expertモードについて

Expertモードに移行すると、Unixコマンドを使うことができます。
(※)Gateway⇔Management間のSIC認証する際もExpertモード必須のようなので注意。

移行するにはまずExpertパスワードを設定する必要があります。

```
# Expertモードパスワードを設定
set expert-password
```


# 知ってると便利なコマンド

Gaiaパラメータシート作る分には、とりあえず以下コマンド打っておけば一通り情報は取れる想定です。

## Gaia ( ホスト名> )

```
# ページ自動送り
set clienv rows 0

# コンフィグ情報
show configuration

# OSバージョン
show version all

# インターフェイス情報(MACアドレス確認等)
show interfaces all
```

## Expertモード ( [Expert@ホスト名:x]# )

Expertモードに切り替える際、パスワード設定しておかないと切り替えられないので注意。

```
# ハードウェア情報(Serial番号確認等)
dmidecode

# Linuxカーネル情報
cat /proc/version 
```

# 監査(Audit)ログについて

FW運用していると出てくるのが監査ログですね。
(※)以下、ポリシーによって許可、拒否されたトラフィックログを監査ログとします。

適用しているポリシー内のルールで、Log出力するよう設定しておけばSmart ConsoleのLog & Monitorに出力します。
GUI上でやるのもいいですが、だいたい監査ログは毎日取得する必要があるのでこれを運用に載せるのはスマートではないです。
そこで、スマートにCLIベースでやりたい、あわよくば自動化する方法を紹介します。

## CLIベースでポリシーログを取得

Expertモードで作業する必要があるので、事前にExpertモードのパスワードを設定しておく必要があります。

ポリシーログは以下に格納されております。

```
# ログディレクトリ
cd /var/log/opt/CPsuite-R80.20/fw1/log

# ポリシーログ
ls -l
～中略～
-rw-rw---- 1 admin root   xxxxxxxx mmm dd hh:nn yyyy-mm-dd_hhnnss.log
～中略～
```

上記ディレクトリ内のファイルを見ると他にもいろんなログがあったんですが、時間がなく調べきれませんでした(ヽ´ω\`)
catコマンド等で直接ファイルの中は文字化けして見れませんので、ユーティリティの`fwm logexport`でエクスポートする必要があります。
※ASCIIコードで出力

```
/opt/CPsuite-R80.20/fw1/bin/fwm logexport -i (ポリシーログファイル名) -o (出力ログファイル名) -n -p

```

各オプションは以下の通りです。-n、-pは入れておくと早くなるとかなんとか。
-i : 入力ログファイル名
-o : 出力ログファイル名
-n : ログファイルのIPアドレスをホスト名解決しない
-p : ログファイルのポート番号をサービス解決しない

`/bin/gzip`もあるので、出力ログファイルをgzipで固めてFTP転送するといい感じになります。

## あわよくば自動化したい

`/home/admin`に上記処理のシェルスクリプトを置いてCronによる自動化も可能です。
また、Gaia上からも`Job Scheduler`上で設定できます。
※Job Shcedulerでシェル登録すると、Cronも自動的に登録されるので実質同じっぽいです。



# 補足事項

- 初回はブラウザからログインして操作することになる。

# おわりに

`dbeditコマンド`によるポリシーオブジェクトやルール作成ができるようですがよくわからず。
次構築するときはそこらへん突き詰めたいですね。


# 参考文献
[Command Line Interface R80.20 Reference Guide - fwm logexport](https://sc1.checkpoint.com/documents/R80.20_GA/WebAdminGuides/EN/CP_R80.20_CLI_ReferenceGuide/html_frameset.htm?topic=documents/R80.20_GA/WebAdminGuides/EN/CP_R80.20_CLI_ReferenceGuide/204519)
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.と出てきたときの対処法

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#どういうエラーなのか
railsのリポジトリをクローンしてきてちゃんと動くか確かめようとした時に発生しました！
やったことはbundle installをしたら最後に以下のような感じのものが出てきました

```
//省略
An error occurred while installing mysql2 (0.5.2), and Bundler
cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source
'https://rubygems.org/'` succeeds before bundling.
```
エラーに対応策が書いていたので

```
gem install mysql2 -v '0.5.2' --source'https://rubygems.org/'
```
そのまま入力したのですが解決されず

なんなんやこれはって思っていたら以下の記事を見つけました。恐らくほとんど一緒のエラー？
なのかと思うのですが記事に書いてあるとの解決策を試したところ問題解決しました。
[mysql2 gemインストール時のトラブルシュート](https://qiita.com/HrsUed/items/ca2e0aee6a2402571cf6l)

```
$ gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
Building native extensions with: '--with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib'
```

このように入力したらやっと問題なくbundle installできました。
Railsではこのようなエラーに遭遇することが多いのですがなぜ、そもそもこのようなエラーが起きているのかの原因究明を参考にした記事のようにできていなかったので全てできるかは分からないですが徐々にしていきたいと思います。
Notion の文字の大きさを拡大する方法

## Notion とは

Evernote のすごいやつです。MarkdownやTeXで数式もかけます。
GUIでいじれるデータベースみたいなのもついてます。

https://www.notion.so/

## Notion の文字の大きさを拡大する方法（Mac）

`cmd ^`

小さくする方法は、 `cmd -` です。
間違えて小さくしたときに、`cmd shift +` で戻せなくてハマったので書きました。
サポートに問い合わせても、 `cmd shift +` で戻せるよと返事をいただきましたが、
そんなことはなかったです。
MySQLのRangeパーティションの指定とpartitionの削除方法

## partitionの追加方法

~~~
CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
    PARTITION p9 VALUES LESS THAN (MAXVALUE)
);
~~~

上記例でいうと、
2008-01-01未満のreport_updated日付のデータはp0に格納され、
2008-01-01〜2008-04-01未満の日付のデータはp1に格納される。
なので、トランザクション系のデータは不要になったらパーティションごと削除するということが簡単に行える。

テーブル作成時に未来何年分か作成しておくとサービス稼働後に追加しなくて済むので楽。

*RANGE COLUMNSはMySQL5.5から*

## partitionの削除方法

テーブルのパーティション指定でそのパーティションに格納されているデータを削除できる。

~~~ 
ALTER TABLE quarterly_report_status DROP PARTITION p2; 
~~~

## 余談
ちなみに公式にこういう記述もあった。

>従業員ジョブコードに基づいてテーブルをパーティション化できます。たとえば、正規従業員に 2 桁のジョブコード、オフィスおよびサポート従業員に 3 桁のコード、および管理職に 4 桁のコードが使用されると想定すると、次のステートメントを使用してパーティション化されたテーブルを作成できます。

従業員コードの採番ルールの定義帯を分別することによりこういうパーティション分割も可能というのはtimestampで設定できるのだから確かに、なるほどなと思った。
従業員コードを削除するのか？というのは置いておくとしてこういう定義の方法はどこかしらで使えそうだと思う。

~~~
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (job_code) (
    PARTITION p0 VALUES LESS THAN (100),
    PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN (10000)
);
~~~




参照：https://dev.mysql.com/doc/refman/5.6/ja/partitioning-range.html
flaskでfoliumを使いHeatマップ表示

※既にanaconda環境でFlask,folimu環境構築済みであることが前提です。

## 1.Flask環境に下記pythonファイル、htmlを組み込む
### 1-1.ファイル
```console
(flask-web) [xxx Flask]$ tree
.
├── flask-test
│   ├── folium_heat_map.py
│   └── templates
│       └── folium_heat_map.html
```
### 1-2.folium_heat_map.py
```python
##############################################
# foliumを使ってheatmap表示する
##############################################
import folium

from folium.plugins import HeatMap
from flask import Flask,render_template,request

#インスタンス生成
app = Flask(__name__)

@app.route('/folium_heatmap')
def foliummap():
  #地図の中心の緯度、経度
  start_cords=(35.681236,139.767125)
  folium_map = folium.Map(location=start_cords, zoom_start=15)

  #ヒートマップ用プロット作成 ***************
  hiatdata = list()
  location_1 = (35.681236,139.767125)
  location_2 = (35.6762009,139.7666254)

  for i in range(5):
    hiatdata.append(location_1)

  for i in range(100):
    hiatdata.append(location_2)

  #HeatMap作成
  HeatMap(hiatdata, radius=30).add_to(folium_map)
  
  #保存
  folium_map.save('templates/heat_map.html')
  return render_template('folium_heat_map.html')

if __name__ == "__main__":
  #Webサーバ立ち上げ
  app.debug=True
  app.run(host='xxx.xxx.xxx.xxx')
```
### 1-3.folium_heat_map.html
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>folium Map Test</title>
</head>
<body>
  <div style="height:768px; width:1024px;">{% include "heat_map.html"%}</div>
</body>
</html>
```
## 2.実行する
```console
(flask-test) [xxx flask-test]$ python folium_heat_map.py
 * Serving Flask app "folium_heat_map" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://xxx.xxx.xxx.xxx:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 217-574-955
```
## 3.ブラウザで確認する
### http://xxx.xxx.xxx.xxx:5000/folium_heatmap
![heatmap.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236342/bb1e02e0-5ba5-0584-27e1-89bbe351b24f.png)
Octoparse Japanは1周年を迎えました！

2018年から、新たな成長戦略の一環として、[Octoparse](https://www.octoparse.jp/)は日本市場に進出し始めました。今年の７月、Octoparseは日本語サービスをリリースしてから一年になりました。ご利用いただいた皆さんには大変感謝しております。感謝の気持ちを込めまして、2019年7月18日（木）～7月26日（金）の期間で1周年記念セールを開催いたします。（セールの詳細は[こちら](https://www.octoparse.jp/octoparse-japan-1st-anniversary-event)）


#Octoparseについて

世界中のユーザーから愛用されているOctoparseは、初心者から高級者向けの[Webスクレイピングツール](https://www.octoparse.jp/)です。直感的に操作できる操作画面、コーディングせず簡単なポイントアンドクリック操作をして、Webサイトからすべてのテキストを収集ことが可能です。取得したデータはExcel、HTML、CSV、またはご指定のデータベースのような構造化フォーマットに保存されます。Octoparseを通して、コードを書くことなく、Web上から情報を手軽にスクレイピングすることができ、しかも大幅な時間短縮ができるようになりました。

 

#過去1年間にやったこと

あっという間に1年が過ぎ去ったように見えて、振り返ってみると色んな事があったことに気付きます。

##1.独立の日本語サイトとサポートサービス

去年６月日本進出してから、[日本語サイト](https://www.octoparse.jp/)ではほとんどの内容ページが日本語化されましたが、ログイン、新規登録、お問い合わせ関わる機能ページは英語版のみがあります。ユーザー体験を改善するために、今年の一月では、それらの機能ページを全部日本語化にしました。また、今回の改善に伴い、日本語のお問い合わせやトレーニングも可能にし、これまで英語サイトで受付の方にも日本語でサポートを提供しています。それに、スマホで見やすい・使いやすいように、Web サイトのスマホ対応もしています。


##２.日本語バージョンのソフトウェア

Octoparseのクライアントが英語のUIなので、お使いの不便などによりお客様から日本語バージョンが欲しいというお声を受けることもしばしばありました。という訳で、二ヶ月間の努力で、今年の2月27日に要望の多かった日本語バージョン7.2.0をリリースいたしました。しかし、このバージョンはベタ版なので、重くて使いにくくて、機能改善が数多く実装されたあと、「[Octoparse 7.2.6](https://www.octoparse.jp/Download)」をリリースいたしました。使い勝手が格段に向上しています。

##３.日本語のチュートリアル

チュートリアル、活用例、FAQ、スクレイピングの紹介ブログなど、たくさん用意しています。各チュートリアルはGIF画像を使って、操作の手順がよく説明されていますが、文字とGIFの形で分かりづらいところがたくさんあると思います。それらのチュートリアルのに従って、データのスクレイピングするタスクを作るのがうまくいかない方もたくさんいます。ですから、Octoparseの機能や魅力なども伝わりやすくように、ソフトの日本語化をきっかけに、複雑な操作方法や言葉では伝えられない動きなどを動画形式で紹介したいと思います。今年の５月、初めての方向けにOctoparseの[入門レッスン動画](https://www.youtube.com/channel/UCS23IL_rwHhMd24J4wZJ4iQ/playlists)をご用意しています。このシリーズは8つのレッスンに分けて、OctoparseをダウンロードすることからWebデータを抽出するまでの基本操作についてご説明いたします。必要なものを揃えてフローに沿って作業していけば、誰でも簡単にWebデータをスクレイピングすることが可能です。これからもいろいろな動画を作って、チュートリアルの内容を豊富しようとします。

##４.業界初のWebスクレイピングテンプレート

もしパワーポイントテンプレートのようにWebスクレイピングにもテンプレートがあれば、対象となるWebサイトのテンプレートを選択して、収集したいデータを選択してスクレイピングを開始できますよね。Octoparseは業界初の革新的な[Webスクレイピングテンプレート](https://www.octoparse.jp/blog/a-revolutionary-web-scraping-software-to-boost-your-business-easier/)という機能をリリースしました。Webスクレイピングテンプレートを使うと、プログラミング知識の少ない/ない人でも簡単にWebスクレイピングを達成できます。具体的には、Octoparseのソフトには数十種類のあらかじめ作成されたテンプレートがあり、パラメータ（ターゲットWebサイトのURL、検索キーワードなど）を入力するだけで、データが抽出されてきます。この時点でテンプレートはAmazon、Instagram、Twitter、YouTube、楽天市場、Googleマップなど多くの人気サイトがカバーされています。

##５.法人プラン

法人ユーザーの大規模なデータ抽出プロジェクトを満足する、Webスクレイピングを簡単にご使用いただくことを目的として、今年の三月Octoparseは[法人様向けプラン](https://www.octoparse.jp/blog/enterprise-plan/)をリリースしました。法人様向けプランは複数ユーザーのアクセス、Webベースのデータ管理と検索、拡張性のあるクラウドリソースを特徴として、あらゆる規模のデータスクレイピングを達成できます。

 

日本語クライアント開発や新機能リリースなどの形で運営改善を少しずつ実践してきたら、いつの間にか今年の7月が間近に迫っていたというのが実情です。色々とご不便な操作をさせてしまいつつも、これらの努力により、Octoparseの日本語サイトは月間ユニークビジター数が10万人を超えるまでに成長しました。たくさんのお客様にOctoparseを選んでもらえた事、とても感謝しております。

ユーザー数の増加により、ユーザーから多くの高評価を得ました。皆さんからのご意見がOctoparseをより良いサービスに成長させる大きな原動力となりますので、ぜひお聞かせください。
![评价.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/c7e1681a-63c3-fff7-5851-75b64ad43e98.png)



この一年間、成長を実感しましたが、Octoparseにはきっと多くの不足が存在しています。これからもユーザーとの交流を踏まえて、今までよりも積極的なサービスを提供して、大きく成長できるように日々努力していきますので、今後ともどうぞ宜しくお願い致します。
Mac(Catalina)でbash to zsh

# macOSをMojaveからCatalinaにしたら、デフォルトのシェルがbashからzshに変わってしまった

## zsh知らんけどbashから移行する
ユーザディレクトリ内のbashの設定を移行

```
chsh -s /usr/local/bin/zsh
cat ~/.bash_profile >> ~/.zprofile
cat ~/.bashrc >> ~/.zshrc
```

## Install Zsh Theme
ついでに、テーマを設定してみる
下記から他のテーマも見れる
https://www.slant.co/topics/7553/~theme-for-oh-my-zsh#4

```
brew tap sambadevi/powerlevel9k
brew install powerlevel9k
source /usr/local/opt/powerlevel9k/powerlevel9k.zsh-theme" >> ~/.zshrc
```
nokogiri が macOS でインストールできない

## 環境
* macOS High Sierra 10.13.6
* Ruby 2.3.8 (わけあって古い)

## 現象
macOS で nokogiri を `bundle install` すると、事前に `brew install libxml2` しているにもかかわらず libxml2 が見つからないと言われて失敗します。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
 
   current directory: 省略
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using system libraries.
Using pkg-config gem version 1.1.9
checking for libxml-2.0... no
checking for libxslt... no
checking for libexslt... no
ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed.
*** extconf.rb failed ***
```

## 対処

既知の対処法として、下記を事前に実行していましたが、うまくいきませんでした。いろいろググってみましたがわからず。

```
bundle config build.nokogiri --use-system-libraries
```

が [nokogiri 公式](https://nokogiri.org/tutorials/installing_nokogiri.html#macos) を確認すると、以下を指定するようにとあり、そのとおりにしたらうまくいきました。

```
bundle config build.nokogiri --use-system-libraries \
  --with-xml2-include=$(brew --prefix libxml2)/include/libxml2
```

## 結論
公式は見よう。
特定の範囲のみプリントアウトする方法[Chrome/Nuxt.js/CSS]

# 解決したいこと

ある特定の要素（divタグの範囲内など）をプリントアウトしたい。
そもそものやり方と、Chromeの場合、背景色のCSSがあたらない問題に直面したので
備忘録を書きます。

まとめると本記事で解決することは以下の通りです。

* ボタンを押したら特定の範囲のみプリントアウトできる
* Chromeで背景色が反映されない問題を解決する

注：Nuxt.jsを使っている前提で書きますのでご了承ください。
部分的に置き換えてもらえたら普通に使えると思います。

## 特定の範囲のみプリントアウトする

実装方針は色々考えましたが、一番コード量が少なくて済みシンプルな方法を選択しました。
以下の手順で実装します。

1. プリントアウトのボタンが押されたら、プリントアウトした特定の要素以外の要素をDOMから全て除外
2. プリントウィンドウを開く
3. プリントウィンドウからメインウィンドウにコントロールが戻ったらリロードすることで元の状態に戻す

具体的な実装は以下の通りです。

```vuejs:component.vue
<template>
  <div>
　　<p>プリントされない。</p>
    <div id="printable">
　　　<p>プリントされます。</p>
    </div>

　　 <button @click="print()">完了</button>
  </div>
</template>

<script>
export default {
  methods: {
    print() {
      window.document.body.innerHTML = document.getElementById(
        'printable'
      ).innerHTML  // (1
      window.print()   // (2
      this.$router.go({ path: this.$router.currentRoute.path, force: true }) // (3
    }
  }
}
</script>
```

この方法であればcomponent分けしていても、
親であるページに関係なくプリントしたい要素だけプリント出来ると思います。

## Chromeでmedia:print時に背景色が反映されない問題の解決

bodyに以下のプロパティーを設定すれば解決できます。

```css:assets/css/app.scss
body {
   -webkit-print-color-adjust: exact;
}
```

## まとめ

特定範囲のプリント、あっさり出来ると思ってましたがこれって言う実装がなく（もしかしたらある？)...
いくつかの方法で実装しましたが、今回紹介した方法に落ち着きました。
コード量も３行程度なのでお手軽ですし^^
では。
agora.io SDKを利用したライブコマースサンプル(WebRTC版)

#概要
2018年頃からEC市場でライブコマースをよく見かけるようになりました。
ライブコマースの開発を希望するお客様が増えてきた為、簡易なサンプルを実装しました。
サンプルの方針として、フレームワークを使用すると移植しにくさがあると思いますので、各言語ベタでコーディングしています。
[Githubに公開しています](https://github.com/fu-jimoto/AgoraIO-LiveCommerce-Sample)
2021/11/12追記
[サンプルコードを追加で公開しました](https://github.com/fu-jimoto/AgoraIO-LiveCommerce-Sample/tree/v4)
 
 - Signaling SDKをRTM SDKに変更
 - WebSDKを4系に変更

#開発環境
macOS Mojave 10.14.1
VisualStudioCode 1.29.1
Chrome 72.0.3626.121
AgoraVideoSDK for Web 2.8.0(※SDK最新版は[こちら](https://docs.agora.io/en/Video/downloads))
PHP 5.5.26
MySQL 5.5.42


#機能一覧
・ライブ作成
・ライブ配信(Web SDK)
・ライブ視聴(Web SDK)
・チャット(Signaling SDK)
・ハート送信(Signaling SDK)
・延べ視聴人数/ハート数のリアルタイム表示
・同時視聴数の記録(RESTFull API)

#実装のポイント
##同時視聴数の記録
実装の手法は様々です。要件に合わせて異なってきます。
今回は、Channelに接続している人＝視聴しているとしてagora.ioが提供しているRESTFull APIを利用しています。
https://docs.agora.io/en/Agora%20Platform/dashboard_restful_communication?platform=All%20Platforms

```php:put_live_count.php
        $channelName = BASE_CHANNEL_NAME . $_GET['live_id'];
        $url = sprintf("%s/%s/%s/%s/%s",REST_API_URL,"channel","user",APP_ID,$channelName);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERPWD, REST_API_USER . ":" . REST_API_PASS);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $json = curl_exec($ch);
        curl_close($ch);
        $data = json_decode($json, true);
        $count = 0;
        if($data['success'] && isset($data['data']['audience_total'])){
            $count = $data['data']['audience_total'];
        }
        $sql = sprintf("insert into session (live_id,count,created_at) value(%s,%s,now())",$pdo->quote($_GET['live_id']),$pdo->quote($count));
        $pdo->query($sql);

```

#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e236027b40017bb98a92)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e236027b40017bb98a92)
TouchPlayer LicenseでもKantanMapperを操作できるという話

オッス！おら初心者！
みんなー！TouchPlayerライセンス使ってるー？

# 焦った話

先日ちょっとした展示を作る案件があって、実機用にTouchPlayer Commercialのライセンスを購入しました。
開発用マシンで作って、さああとは実機にいれてKantanMapperの調整すれば完了、と思っていたのですが、

みなさん知ってます？
TouchPlayerライセンスがアクティブなTouchDesignerの画面ってこんなのなんです。

![スクリーンショット 2019-07-19 10.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16556/cf8d6675-de27-d98e-4fb0-39b64489e16c.png)

つまり
![スクリーンショット 2019-07-19 10.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16556/667b0327-4566-e5fa-d96c-42beddfc192c.png)
んですよ。

# 解決した話

で焦ったんですが、

```python
op('kantanMapper').par.Open.pulse()
```

とかやれば難なく開けました。
トリガーはなんでも良いと思うんですけど、例えば左ボタンクリックとかにしちゃうとKantanMapperの調整作業中もOpenが走ってうざいので、僕は中ボタンクリックにしました。

![スクリーンショット 2019-07-19 10.34.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16556/46f54114-3a03-2800-31d0-27b1e62ecc9a.png)

メインウィンドウでSaveすればちゃんと調整結果も保存されてくれます。

# 余談

TouchPlayerライセンスでは編集機能が使えないという話なんですが、上に書いたようにちゃんと保存できるし、なんならナンバリングのバックアップもしっかり取ってくれるし、そして何より
![スクリーンショット 2019-07-19 10.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16556/8408f0c0-855d-6742-72a2-3aad85443a45.png)
OP Create Dialogも開けるので、予想ですが編集ウィンドウの描画がされないだけでCommercialならCommercialのフル機能が生きてるTouchDesignerが走ってるっぽい気がします。
ということは心眼で見ればTouchPlayerライセンスでも、、、ごにょごにょ。

※記事執筆時点の最新版( Build 2019.16600 )での情報です。
※公式が編集不可って言ってるんだから編集したい人はちゃんとPlayerじゃないライセンス買いましょう。
※カスタムインストールで入れるTouchPlayerでなく、普通にインストールしたTouchDesignerにTouchPlayerライセンスをインストールした場合の話です。前者は試してないのでどうなってるかわかりません。
VSCodeでterraformを楽にするための少しのスニペット

![t.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/8b5f3765-f403-9736-6775-f60b7e836970.gif)


**VSCode** で **terraform** を書いている

Autocompleteのため使用しているプラグインが
まだ、v0.11.x にしか対応していないため、v0.12系の記述ができない。

具体的には、変数を使用する際の記述法が対応していない。
せっかくterraform v0.12系を使いたいのに。。

![SnapCrab_NoName_2019-7-19_10-36-10_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/1b7e7a7b-1c83-cfb0-47b1-58acf7ecf19f.jpeg)

仕方なく、v0.11系の記法で書いてるが、面倒になってきたので

VSCodeで**スニペットを登録** するまでのTipsを残しておく.


## 環境

Terraform ヴァージョン

```bash
$ terraform version
Terraform v0.12.4
+ provider.aws v2.19.0
+ provider.template v2.1.2
```

**AutoCompleteのプラグイン**  Terraform 1.3.12を使っている。

![SnapCrab_NoName_2019-7-19_10-32-42_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/fa06cf51-7d4e-d9e0-0896-555408aeac18.jpeg)


## スニペット

File > Preferences > **User Snipets**

```json
## File > Preferences > **User Snipets**
{
	"var tf-0.11x": {
		"prefix": "var",
		"body": [
			"\"${$1}\"",
		],
		"description": "Variable assign"
	}
}
```

これで、**var** と打つことで、 **"${}"** が挿入されるようになった。

![t.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/bf8c10f4-d2be-279d-f36a-b0786453290a.gif)


![SnapCrab_NoName_2019-7-19_10-33-25_No-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/4247ff02-0a04-624f-4c32-8989a8ff837b.jpeg)

以上
RDS いろいろ

#1.「特定時点への復元」をした場合エンドポイントはどうなるか#

RDSでは、「特定時点への復元」の機能があり、ポイントタイムリカバリをすることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1dfd5d81-0ae2-53b9-e50f-4eec7f9d7925.png)

この特定時点への復元時に、「DB インスタンス識別子」は復元前のものと別の識別子でなければ作成できない。
そのため、エンドポイントも変更になってしまう。
EC2からRDSのエンドポイントを指定している場合、EC2側の設定変更をするのではなく、RDS側で識別子を変更する。
1.元のDBインスタンスの識別子を適当な別名のDBインスタンスの識別子に変える。
2.新しいDBインスタンスの識別子を元のDBインスタンスの識別子に変える。


#2.マスター/レプリカ構成での停止の制限#

マスター/レプリカで構成されていたとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5d35866b-b076-9439-9d43-2f21027265ea.png)

この構成ではマスターは停止できません。レプリカを削除する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cb9c56fc-58d8-7cc0-28dd-89cac7fa5a99.png)

リードレプリカである DB インスタンスは停止できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2f46b124-8b1f-3223-648a-d36692659b9e.png)


#3.暗号化していないRDS DBインスタンスを暗号化するには#

スナップショットから新たにRDS DBインスタンスを作成時に暗号化するのは、EC2と同じだが、
1.「スナップショットのコピー」で暗号化し、スナップショットのコピーを作成する。
2.暗号化したスナップショットから「スナップショットの復元」で、新たにDBインスタンスを作成する必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/108037ed-f7ad-ab5e-b0ea-1456eec33faa.png)


#4.自動スナップショットの保存期間が0にならない#

マスターで自動スナップショットの、保存期間を0にすると1~35にしてくださいと表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a923dd8d-c9ba-2f5d-f751-48255107bc96.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/12cb555c-ce1d-a5b2-e64e-b2ccba4ba526.png)

リードレプリカでは、リードレプリカログの管理用にバックアップが必要なため、保持期間を 0 に設定することはできません。なので、レプリカを削除する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/3dff48d5-e669-ef13-e986-7928a4cb379f.png)
array_merge_recursiveで文字列が配列になる

array_merge_recursiveではまったのでメモ。

デフォルト値に対してPOSTされてきた値で上書きするって感じで下記の様なコードを書いてみました。

```php
$default = [
    'Model' => [
        'title' => 'DefaultTitle'
    ]
];
$post = [
    'Model' => [
        'title' => 'PostTitle',
        'user_name' => 'Ryuji'
    ]
];
var_dump(array_merge_recursive($default, $post));
```

期待してる結果は下記のような感じだったんですが…

```
array(1) {
  ["Model"]=>
  array(2) {
    ["title"]=> 
    string(9) "PostTitle"
    ["user_name"]=> 
    string(5) "Ryuji"
  }
}
```

結果はこちら

```
array(1) {
  ["Model"]=>
  array(2) {
    ["title"]=>
    array(2) {
      [0]=>
      string(12) "DefaultTitle"
      [1]=>
      string(9) "PostTitle"
    }
    ["user_name"]=>
    string(5) "Ryuji"
  }
}
```

```title``` が配列になって "DefaultTitle" と "PostTitle" が入ってきました^^;

この例だと ```array_merge``` で十分だけど、2階層目のキーの有無が増えると、array_mergeだと足りないのよね…

このときはCakePHP2だったんで、Hash::mergeつかってやりたいことは実現できたけど、なかったら自前で処理するのをつくらないとダメですかねぇ。
初心者のWebポートフォリオ作ってみた①


#とりあえずフレームワーク
基本は自分で構築していきたいと考えたので、CSSフレームワークは使わずに今回は作成していこうと決め、次のような目標をたてました。

・レシポンシブなサイトにする
・モーションを加える
・お問い合わせ画面をpythonとmysqlで実装
・見やすいコードを書く

デザインを中心に勉強してきたので、しかっりとここでサイト構築の流れを今回はつかんでいきたいなぁと思います…

まずは、メインとなる画面のフレームワークを考えました。
とりあえず、今回はfigmaを用いてデザインの構築をしました。簡易的にデザインした部分のcssコードも記述されるので実際にコードを書きだすときに効率的にコーディングでき、初めのフレームワーク作りには結構おすすめです！

無料で使用できるWebサービスなので是非使ってみてください！
figma:https://www.figma.com/

メインビジュアルのみを簡単に構成
![tittle](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454254/e8a7736b-8411-11a5-d5e5-079bcc92ac26.png)

#SEO対策と携帯表示での対策
htmlでまずは、以下のようにSEO対策を施していきました。

```html

<!-- 検索エンジンに読み込んでもらうSEO対策 -->
<meta name="description" content="Web・アプリのデザインを行っています。企画からデザイン・コーディングまでの一連の流れをこなすことが可能です。お気軽にお問い合わせください">
<meta name="kyewords" content="Portforio,ポートフォリオ,Webサイト,スマホアプリ,アプリ,デザイン,イラスト,コーディング,ウェブ,制作">

<!-- スマホで開いたときに番号やメアドの検索を非表示にする -->
<meta name="format-detection" content="telephone=no,addr=no,emai=no">

<!-- スマホでの表示を調整 -->
<meta name="viewport" content="width==device-width,initial-scale=1.0,maximum-scale=1.0,user-scale=0">

<!-- OGPタグの設定 -->
<meta property="og:title" content="ONODA RINA'S PORTFORIO">
<meta property="og:image" content="メイン画像URL">
<meta property="og:type" content="Website">
<meta property="og:site_name" content="ONODA RINA'S PORTFORIO">
<meta property="og:description" content="Portforio,ポートフォリオ,Webサイト,スマホアプリ,アプリ,デザイン,イラスト,コーディング,ウェブ,制作">
<meta property="fb:app_id" content="App-ID（15文字の半角数字）">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="サイトのURL貼る">
<meta name="twitter:image" content="ogpのURL貼る">

```


ここで作っていて感じたのがOGPタグの設定って結構重要なんだなということですね。
これをつけるとSNSで表示されるリンク先のホームページ情報の文章や画像が固定されるようで、こういうもので見え方を調整していくのだなと学びました。

#配置でつまづいた
次に、メインビジュアルの構築をしていきました。ここで、つまづいたのが文字を回転させて配置を行った際に%指定でleftやbottomを調整したところ斜めに動いていしまい上手く配置できなかったことです。px指定で動かしたら普通に調整できたのですが、なぜ斜めに動いたのかがいまいちわからなかったです。

```css

.contact-head{
    position: absolute;
    right: 15px; ←%にすると斜めにずれてしまう
    top: 300px;
    color: #000000;

    transform: rotate(-90deg);
    z-index: 10;
}
```

こんな調子でレイアウトしていきメインのところだけ構築できました。
来週はメインビジュアルを完成させられたらと思います。
flaskで簡単なテストページを作成する

※anacondaでflask開発環境構築が済んでいることが前提となります。

## 1.任意のフォルダに移動しtemplatesフォルダを作成する
```console
(flask-test) [xxx flask-test]$ mkdir templates
(flask-test) [xxx Flask]$ tree
#フォルダ階層
├── flask-test
│   └── templates
```
## 2.flask-test直下に以下Pythonファイル(main.py)を配置する
```python
from flask import Flask,render_template,request
#インスタンス生成
app = Flask(__name__)

#/indexでrequestが来た場合の処理
@app.route('/index/')
def index():
  message='Hello Flask Index'
  return render_template('index.html',message=message)

if __name__ == "__main__":
  #Webサーバ立ち上げ
  app.debug=True
  app.run(host='xxx.xxx.xxx.xxx')
```
## 3.templates直下に以下index.htmlを配置する
```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Hello Flask Index</title>
</head>
<body>
  <div>{{message}}</div>
</body>
</html>
```
## 4.実行する
```console
(flask-test) [xxx flask-test]$ python main.py
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://xxx.xxx.xxx.xxx:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 217-574-955
```
## 5.ブラウザに下記URLを入力する
### http://xxx.xxx.xxx.xxx:5000/index/
![image.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236342/751064b1-a578-cb42-642d-dfa8421599eb.png)
Gentooでlibtinfo.so.5がないときの対処法

# はじめに
TabNineをインストールするためにcqueryをビルドしていたら，libtinfo.so.5がないためにビルドに失敗したので，libtinfo.so.5をインストールする方法を探した．

# インストール方法
```console
$ sudo emerge -a "ncurses:5"
```
ncursesのバージョン5をインストールすることで，一緒にlibtinfo.so.5がついてくる．バージョン指定のためにダブルクオーテーションは必須です．
**このバージョン5のncursesをアンインストールすると，一緒にlibtinfo.so.5も消えるので注意．**
ただし，```sudo emerge -c```では削除の対象にされなかったので，意図的に消そうとしない限りは消えない．

# 参考
Gentoo Forums :: View topic - libtinfo.so.5 missing, how to create? [Solved]
https://forums.gentoo.org/viewtopic-t-1082942-start-0.html
外付けキーボードをUS配列、ノートPCのキーボードをJIS配列で併用して使う方法

# 前提
* HHKBのUS配列キーボードがメルカリで安く売っていた
* なんかかっこよさそうだったので購入した
* 会社で支給されているノートPCのキーボードはJIS配列
* 打ち合わせなどでノートPCで入力するときもある
* その時はJIS配列の方がいい

# 目的
* 外付けキーボードを繋いでいるときは、US配列で使用する
* 外付けキーボードを外しているときは、JIS配列で使用する

# 作業
1. Windowsの言語設定で使用するキーボードをJIS配列にする
![画面1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/371db98e-87f9-81cc-7319-753a728cb335.gif)

2. 外付けキーボードの**デバイスインスタンスパス**を特定する
![画面2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/59570ec2-b40d-e122-3cbb-c48ef40877be.gif)

3. キーボードのレジストリを書き換える
以下の設定を追加する

* KeyboardSubtypeOverride / REG_DWORD / 0
* KeyboardTypeOverride / REG_DWORD / 4
![画面3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/d69c319f-7c4e-fbfb-0d2c-9454133efe3d.gif)

4. 再起動したら併用して使えるようになります
cv::Matの要素の型を簡単に調べたい！

#調べ方
cv::Mat型変数の要素のタイプを調べたいときがある！
そのときは、flgasメンバ変数を16進数でprintするか、デバッガで見るなどして、値を確認しよう！
下2桁が以下の表の16進数値と一致するタイプを探せば型がわかる。

|マクロ名|10進数値|16進数値|
|---|--:|--:|
|CV_8U|0|0|
|CV_8S|1|1|
|CV_16U|2|2|
|CV_16S|3|3|
|CV_32S|4|4|
|CV_32F|5|5|
|CV_64F|6|6|
|CV_16F|7|7|
|CV_8UC1|0|0|
|CV_8UC2|8|8|
|CV_8UC3|16|10|
|CV_8UC4|24|18|
|CV_8SC1|1|1|
|CV_8SC2|9|9|
|CV_8SC3|17|11|
|CV_8SC4|25|19|
|CV_16UC1|2|2|
|CV_16UC2|10|a|
|CV_16UC3|18|12|
|CV_16UC4|26|1a|
|CV_16SC1|3|3|
|CV_16SC2|11|b|
|CV_16SC3|19|13|
|CV_16SC4|27|1b|
|CV_32SC1|4|4|
|CV_32SC2|12|c|
|CV_32SC3|20|14|
|CV_32SC4|28|1c|
|CV_16FC1|7|7|
|CV_16FC2|15|f|
|CV_16FC3|23|17|
|CV_16FC4|31|1f|
|CV_32FC1|5|5|
|CV_32FC2|13|d|
|CV_32FC3|21|15|
|CV_32FC4|29|1d|
|CV_64FC1|6|6|
|CV_64FC2|14|e|
|CV_64FC3|22|16|
|CV_64FC4|30|1e|
skype group


今日、skypeでgroup通話しようと思って資料収集中。

grpoup通話はじめて。

skype自体も、うまく使いこなせていない。
IDが複数になっていて、使い分けれていない。
機材によってはカメラがない。
機材によってはWi-Fiがない。

去年、下呂と東京で通話したとき、旅館の騒音をさけると電源と電波が届きにくく、ご迷惑をおかけしました。ごめんなさい。

グループ通話
https://www.skype.com/ja/features/group-calls/

グループ ビデオ通話
https://www.skype.com/ja/features/group-video-chat/

Skype で通話をする方法を教えてください。
https://support.skype.com/ja/faq/fa10613/skype-detong-hua-wosurufang-fa-wojiao-etekudasai
「Skype でグループ通話をする方法を教えてください。」
をクリック
>[通話 ] audio call button リストから、[新しい通話] ボタンを選択します。
通話相手にする参加者をすべて選択します。
[通話] audio call button ボタンを選択します。 



skypeでグループ通話を行う為の2つの手順
https://skype.macdrivelove.com/entry10.html

Skypeがグループ通話で参加者50名をサポート、ライバルたちを抜く
https://jp.techcrunch.com/2019/04/07/2019-04-05-skype-now-supports-up-to-50-group-call-participants-topping-rivals/

Skypeのグループ通話の使い方！複数で同時通話/ビデオ通話するやり方は？
https://applica.info/skype-group-call
【SSH】SSHについて誰よりも不正確に、だけど読みやすく解説してみた。

# 前提
正確な情報は、やはり[一次情報](http://www.openssh.com/)です。
なのでドキュメントなり硬めのリファレンスが読める方は、言うまでもありませんがそちらを読んで下さい。

## この記事を書く意義は？
一番は私自身の理解の整理です。
読んで頂くメリットとしてはSSHを**なんか訳がわからないもの**から
**話半分で聞いたことがある**ようになれるかも知れない事です。
公式ドキュメントを読める体力を少しづつ付けていけるといいですね。

## SSHとは？
「他のパソコンを遠隔操作する仕組み」です。
情報を置いているサーバーなんかと通信することが多い。
Githubやbitbucketなんかにソースコードを置く場合にも使えますね。

## セキュリティ
当然大事な情報を置くわけですから、誰でも見られては困ります。
セキュリティのために**公開鍵** **秘密鍵**を使います。

## 公開鍵
これ↓です。
![lock_nankinjou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431639/eda0021a-bbf3-0878-a07c-6c3e914c6914.png)

## 秘密鍵
これ↓です。
![key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431639/86575b70-20e5-a705-847e-a2e96896c5d5.png)

## 鍵はどのように使う？
公開鍵をサーバーなど通信先に置きます。
秘密鍵を自分のパソコンに置いて置きます。
秘密鍵を持っているのでサーバーにSSHでアクセスできます。

## 何がいいの？
秘密鍵がないと開けられないので安全です。
ちょっとフリー素材が見つからなかったので、
文章で説明しますが、所謂パスワードを設定する方法だと
上記の方法とは違いダイヤルロックをかけているような状態ですね。
なので番号がわかれば解錠できてしまいます。

## パスワードなんてわからないでしょ？
普通わからないんですが、色々解読方法があります。
単純なものでいうとブルートフォース（総当たり）での解錠。

## 総当たりする暇な奴がいるのか？
もちろん手動ではなくプログラムを使います。
物理的なダイヤル錠で総当りするとなると鍵屋さんが持つような、
大げさな機械が必要ですが、プログラムなら簡単なもので無料で手に入ります。
そういう危険性なく利用できるということです。

# 最後に
ご覧の通り具体的な鍵の生成手順や、設定などには一切触れていません。
しかし何もしないよりは出来ることをした方がマシ。
ということでこの記事に限らずザックリ概要を掴むのは無駄じゃないのではないでしょうか？
AWS Cloud9 調べてみた

★雑に記載しているため、今後アップデート予定

独断と偏見で、Cloud9のプロジェクト適用について考えてみました。

#どこで、Cloud9とは？使い方は？を調べたらいいか。
とりあえず、下記を見たらいい。

・ブラックベルト
>https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

・ユーザーガイド
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/welcome.html

#Cloud9とは
Webブラウザから使える統合開発環境、いわゆるクラウドIDE。
コードを記述、実行、デバッグができる。
Amazonに買収されて、AWSのサービスの一員となったらしい。

#Cloud9のメリット
・開発環境をローカルにインストールする必要がない
　※ローカルマシンのスペックを気にする必要がない。（いわゆるSaaS）
・インターネットにつながれば、どこでも作業が可能
・ソースの共同開発が可能
・サーバレス開発（lambda）が容易らしい。
　※ちょっと試してみたいな。。
>https://aws.amazon.com/jp/cloud9/

#使用パターンを調べる（会社で使用するのか、チームで使用するのか）
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/get-started.html

#会社適用に関して
スモールスタートがいいと思う。
大掛かりにはじめて、結局やりませんでしたってこともよくあるので。。
⇒使用パターン、チームセットアップ
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/setup.html

#チームセットアップに関して
①IAMの設定
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/setup.html#setup-give-user-access

　◎IAMグループの作成
　　個人的には、いったん2グループで初めてもいいと思う。
　　1.管理者グループ（ポリシー：AdministratorAccess）
　　　※ポリシーはAWSCloud9Administratでもいいが、その場合は、
　　　　別途、AdministratorAccessのグループを作る。
　　　　そうでないと、ユーザーの追加ができないから。
>https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/getting-started_create-admin-group.html

　　2.Cloud9ユーザーグループ（ポリシー：AWSCloud9User）
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/auth-and-access-control.html

　◎IAMユーザーの作成
　　ユーザーを作成し、所属グループを設定することで、
　　そのグループのポリシーがアタッチされた状態になる。

②AWS Cloud9 の追加設定オプションの設定
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/setup-teams.html

　ユーザーの環境作成の制限とかできるらしい。
　例えば、意図せずユーザーにEC2(サーバ)を複数台作成されてしまったとする。
　その場合に、１年間の無料枠を鑑みると、EC2１台常時起動だと無料であるが、
　２台以上だと確実にお金がかかってくる。
　そういうケースに、オプション設定はありかもしれない。

③Cloud9の環境作成
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/create-environment.html

④Cloud9の使用方法を勉強する。
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/tutorial.html

⑤共有環境を設定する。
>https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/share-environment.html

#使ってみた
下記のサンプルプログラムを実行してみた。
・python
・php

いままでは下記の感じでやっていた。
・python：　anacondaをインストールして付属のspyderで動作確認をしていた。
・php　 ：　Zamp PHPをインストールしてブラウザで動作確認していた。

Cloud9を使用すると、手軽に環境が作れ、
複数言語のプログラムを横並びで実行して表示できる。
※下のコンソールがpython実行結果、右のブラウザがPHP実行結果
![cloud9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/3a1f5f04-9d6b-4b4b-0227-450f0352077f.jpeg)

下記の場合に便利かと思いました。

仕事関連で、家で勉強がてらプログラムを動かしてみたい。
環境整備めんどくさい。
あ、CLoud9でちょろっと確認しよ。

に最適な気がしました。
自宅ＰＣのスペックを気にする必要もないですし。

＜参考＞
・PHPの準備
　https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-python.html

・Pythonの準備
　https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/sample-python.html
　▼python3を使用する場合
　https://qiita.com/r-wakatsuki/items/bcaab62850944b1d605a
7の倍数

#問題文
1以上10N以下の整数のうち7の倍数の割合を求めよ。

#ソース
```php
<?php
//入力値
$nyu = "4";
//乗算対象数値
$ten = 10;
//乗算
$jyo = pow($ten,$nyu);
//7を割る 小数点は切り上げ
$total = $jyo / 7;
$total = floor($total);
//7の倍数の割合計算
$kekka = $total / $jyo;

echo $kekka;

?>
```
nodejsでgit mvのループ処理

`_`付いてない.scssをgit mvで`_`付けてリネームする必要があって、コマンドを調べてたんですが、macOSだとfindに`-print`引数が無かったりして積みました。
代わりにnodejsのコンソールで似たようなコマンドを実装することに。

```bash
node
```

```js:node
// カレントディレクトにある_付いてない全てのscssを_付けてリネーム
require('fs').readdirSync('.').filter(file => file.match(/^(?!_).*?\.scss$/)).forEach(scss => require('child_process').execSync(`git mv ${scss} _${scss}`, { stdio: 'inherit' }))
// git mv hoge.scss _hoge.scss
// git mv fuga.scss _fuga.scss
// git mv piyo.scss _piyo.scss
```

jsしか読めないのつらい
[zappa + boto3 + rekognition DetectLabels]で　KeyError: 'Instances'

zappaでlambdaデプロイしたら、rekognition DetectLabelsのレスポンスがローカル環境と変わってハマった。

解決方法
----
1. デプロイパッケージにboto3を含める。(zappa deployするディレクトリでpip install boto3 -t .)

2. zappa_settings.jsonを

```zappa_settings.json
{
    "dev": {
        "app_function": "your_app.app",
        "aws_region": "your_region",
        "profile_name": "your_profile_name",
        "project_name": "your_project_name",
        "runtime": "python3.6",
        "s3_bucket": "your_s3_backet",
        "exclude": ["/var/runtime/boto*"] //追加
}
}
```

にする。

原因
-----
lambda内にデフォルトで搭載されているboto3のバージョンが古いことが原因らしい。
（バージョンによってDetectLabelsのレスポンスが若干違うっぽい）

zappaのドキュメント曰く、
>By default, Zappa will exclude Boto, because it's already available in the Lambda execution environment.

>"exclude": ["*.gz", "*.rar"], // A list of regex patterns to exclude from the archive. To exclude boto3 and botocore (available in an older version on Lambda), add "boto3*" and "botocore*".

とのことなので、デフォルト搭載のboto3を呼ばれないようにする。

cloud watch logを追うと、`Loading JSON file: /var/runtime/botocore/data/endpoints.json`とあったので、`"exclude": ["/var/runtime/boto*"]`を追加した。

`"exclude": ["*.a"]`でもいけた。
a = (b[i++] != '\n')? b[i]: '\0'; みたいなコードってかっこいいの？

##どうなの？
####`a = (b[i++] != '\n')? b[i]: '\0';`

僕からするとこのコードを見たとき、
iってどのタイミングでインクリメントされるんだっけ・・
結局、b[i++] != '\n'のときに変数aに入るのはb[i]とb[i+1]どっちなんや・・
そもそも不定動作にならんのか？とか思ってしまう訳です。

ANSI規格では・・
機種依存か？コンパイラ依存か？不定動作か？
・・あ～、調べるの面倒くせー。
C言語やってたら知ってて当然だろレベルなのこれ？
試練あたえてくんなよ！とか反切れ状態になります。

最初から素直に

`a = (b[i] != '\n')? b[i+1]: '\0';`
`i++;`

こう書かれたら、ふ～んで終わってたのに！とか思うんです。

この主題のコードに限らず、インクリメント演算子を無理に利用したり、
条件文中に代入文を無理に入れて、1行にまとめて書こうとしてる？
みたいなコードをちょくちょく見かけます。

そうされると、

・文法的には、どのように動作するべきなのか
・実際にはどのように動作しているのか
・どのように動作することが作者の真意なのか
・作者は誤解していないか
・作者は実際の動作をわかって書いているのか

など疑問が湧き出てきてそれだけで憂鬱まっしぐらです。
文法を調べたり、実際に動かしてみたり、かなりの負担です。
さらに周りの文脈から汲み取らないといけないとなると
尚泣きたくなります。

その他、

`if(((c=fgetc(fp))==EOF)||(c=='\n')){
	/* 処理 */
}`

のように一行でまとめられるより

`c = fgetc(fp);
if((c == EOF) || (c == '\n')){
	/* 処理 */
}`

のように分割して書いてる方が安心して読めるのです。

##僕の想いとしては
色々な批判はあるかと思いますが、
「規格でこう決まっているから、こんな感じに省略して書いていい」
という考え方が嫌いです。
規格依存、コンパイラ依存のような書き方は悪だと思います。
ちょっと冗長に書くだけで、依存性無くなるんならそっちとるべきやろ！
と思うわけです。
もしコーディング時にわざわざ規格を調べて書いていたとしたら、
他人はそれを読むときに、やはり規格を調べなければならないよね・・


以上、現場からコードリーディング時の
悲痛な叫びをお送りしました。