OmniAICreator/Qiita-1.07M huggingface dataset:
ショートカットを使ってiPhoneまたはiPadでKindle書籍を簡単に買う

# はじめに

iPhoneやiPadのAmazonアプリではAppleの設けている制約の為、Kindle書籍は購入できません。同じページを Safariなどのウェブブラウザで開いて購入する必要があります。

FirefoxやChromeなどSafari以外のブラウザをインストール済みであれば、Amazonアプリの商品ページで「シェアする」ボタンを押して出てくる共有シートからこれらのブラウザを選択すればよいですが、ここではどうしてもSafariで開きたいという（ぼくの）要望にこたえてみました。

# ショートカットの作成

標準でインストールされているショートカットAppで以下のようなショートカットを作成します。タイトルは "Safariで開く" にしています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10742/f1b4df2c-ccfa-f337-a61a-9b31de60adf7.png" alt="ショートカット: Safariで開く" width="300"  />

作成したら、詳細画面を開き、「共有シートに表示」をONにし、共有シートタイプを選択します。テキストとURLをONにしておけば大丈夫だと思います。

これで準備完了です。

このショートカットのリンクはこちらです。

- https://www.icloud.com/shortcuts/0b87b96eac494f20a569f62747bfad11

# やってみる

Amazonアプリの商品ページで「シェアする」ボタンを押して共有シートを開くと、「Safariで開く」という選択肢が表示されているはずです。これをクリックすれば Safari でAmazonの商品ページが開き、ワンクリックでKindle書籍を購入できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10742/348b2514-b2cf-3249-d472-d29aaad2189c.png" width="300" alt="共有シート" />
WebAssembly + C/C++ でもインラインアセンブラ使いたい

# はじめに

Cでx86とかarmターゲットだとインラインアセンブラを書けるけれども、WebAssemblyターゲットでもインラインアセンブラ書きたいですよね...? ~~(そんな人はこれまでにいなかったと願っておくのです)~~

各サンプルに、[WebAssemblyStudio](https://webassembly.studio) での実行用プロジェクトへのリンクを追加しています。ソースファイルの編集はPCブラウザでなければ正常にできませんが、スマホでも実行ができると思います。必要に応じて活用してください。

## 対象読者

- wasi-sdk または emscripten を使って、C言語ソースファイルから WebAssembly を吐き出したことがある
- [WebAssembly テキストフォーマット](https://developer.mozilla.org/ja/docs/WebAssembly/Understanding_the_text_format)にすこしでも馴染みがある

## 目標

- C言語ソースファイル中のインラインアセンブラとして、WebAssembly テキストフォーマットを使いこなせるようになる

## 注意書き

WebAssemblyターゲットのインラインアセンブラに関する情報は、皆無に等しい状態です。そのため、筆者の手元の環境でコンパイル/実行できるサンプルを掲載しています。

## 検証環境

- emscripten 2.0.3
- clang 12.0.0

# レベル1: 加減乗除

シンプルに `12 + 34` を計算し、その値を main 関数の戻り値としています。

オンラインサンプル: [WebAssembly Studio#?zaqqdfn25vo](https://webassembly.studio/?f=zaqqdfn25vo)

```C
int main() {
  __asm (
    "i32.const 12\n"
    "i32.const 34\n"
    "i32.add     \n"
    "br 0"
  );
}
```

スタックに 12, 34 を追加し、スタック上の2数を足してスタックに戻し、スタック上の数値を関数の戻り値にするという、WebAssemblyスタックマシンでの一連の命令です。

# レベル2: 変数を読み書きする

変数 `val` にインラインアセンブラで書き込みを行うものです。

オンラインサンプル: [WebAssembly Studio#?81by60h3kr4](https://webassembly.studio/?f=81by60h3kr4)

```C
int main() {
  int val;

  __asm (
    "i32.const 12\n"
    "i32.const 34\n"
    "i32.add     \n"
    "local.set %0"
    : "=r"(val)
  );

  return 0;
}
```

変数 `val` はスタック上に存在しますが、`"=r"(val)` と指定することで、スタック変数をローカル変数にコピーする処理をコンパイラが追加してくれます。

# レベル3: 関数呼び出し

C言語標準関数の puts をインラインアセンブラで呼んでみます。

オンラインサンプル: [WebAssembly Studio#?imnemdya3kg](https://webassembly.studio/?f=imnemdya3kg)

```C
int main(void) {
  const char Hello[] = "Hello World\n";
  
  __asm (
    "local.get %0\n"
    "call %1\n"
    "drop"
    : : "r"(Hello), "i"(puts)
  );
}
```

`call` 命令が、スタック上の値を引数の数だけ渡して関数を呼ぶ命令です。

サンプルでの `%1` の代わりに関数名を指定することもできます。しかし、C++に持っていった時にマングリング名を指定するか `extern "C"` をつけたりするよりは、関数を即値として渡してしまった方が楽だったりします。(コンパイル結果も間接呼び出しではなく直接呼び出しになる)
[rails] サーバーが動かなくなった事件


#事件内容

突然サーバーが動かなくなり
control Cを押してもサーバーダウンできなくなってしまった。


#解決方法


ターミナルで以下のコマンドをうつ
これは開いてるファイルを一覧表示してくれます

```
 lsof -i
```


0000のところは PIDの番号を打ってください
ruby のPIDの番号を打ってください

```
kill -9 0000
```


###私はこれで解決しました！

サーバー止まったりしたら焦りますよねw
何がエラーなのかも出てこなくて汗だくでした
( railsのサーバーはバグる？ことが多いとどこかの偉い人が
いってたな...知らんけど...)
C言語をAWSで使用する場合の環境構築

#前提

業務でC言語を使用することになったので事前学習でドットインストールで勉強することに。
しかし、ドットインストールの[C言語入門](https://dotinstall.com/lessons/basic_c)は、ローカル環境構築の前提。
ローカル環境構築ではロケットスタートできないためAWSでポチれる環境構築方法を調べた

#環境
Windows10
AWS cloud9


#やりかた

AWS cloud9よりcreate envirmentをしワークスペースを作成する。
あとは普通に「xxxx.c」と拡張子ｃのファイルを作成すればよい。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734661/cb64c008-e9db-a04a-66b9-bba587af6818.png)



ちなみにC言語はコンパイル必須なので、gcc -o hello hello.cでコンパイルしたのち、./helloでバッシュ実行している。

```c:hello.c
ec2-user:~/environment $ gcc -o hello hello.c
ec2-user:~/environment $ ./hello
x = 10, y = 5.200000, c = A
```
[Swift] Swiftでpopcntが欲しい時はnonzeroBitCountを使う

タイトル通りです。
2週間ほどビット演算の必要なプログラムをSwiftで書いていたのですが、このメソッドの存在に気付かず自前でextensionを生やしていました。[nonzeroBitCount | Apple Developer Documentation](https://developer.apple.com/documentation/swift/int/2886050-nonzerobitcount)の通り、`nonzeroBitCount`が同等の計算をしてくれます。
メソッド名のせいか、「Swift popcnt」「Swift bitcount」とかで検索してもなかなか出てこないので厄介でした。
以上です。
PowerShell@MacOS でTeamsに接続する

#PowerShellをインストールする
###macOS への PowerShell のインストール

```
brew cask install powershell
```

[macOS への PowerShell のインストール](https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7)

###PowerShellのUpdate

```
brew update
brew upgrade powershell --cask
```

###pwsh起動
```
$ pwsh
PowerShell 7.0.3
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/powershell
Type 'help' to get help.

PS /Users/>
```

###Teamsに接続する

```
PS > Connect-MicrosoftTeams
WARNING: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code G8DxxxQZ5 to authenticate.
2020-10-06T15:44:49.9344210Z: 7xxcf32d-xxx4-40f3-8e72-b8d9xxxf4abd - LoggerBase.cs: ADAL PCL.CoreCLR with assembly version '3.19.2.6005', file version '3.19.50302.0130' and informational version '2a8bec6cxx76d0c1ef8xxxxxbdcxxda2d2605056' is running...
2020-10-06T15:44:49.9352790Z: 734xxx2d-4094-40f3-8e72-b8d9xxxf4abd - LoggerBase.cs: === Token Acquisition started:
	CacheType: null
	Authentication Target: User
	, Authority Host: login.microsoftonline.com
```
メッセージのとおり、https://microsoft.com/devicelogin にアクセスしてコードを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105131/a9826d0a-1faf-a012-9cff-81a057b43dcf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105131/5d6b7d92-0479-754c-d949-425be3352df8.png)


[Docs  Reference  MicrosoftTeamsPowerShell  Connect-MicrosoftTeams](
https://docs.microsoft.com/ja-jp/powershell/module/teams/connect-microsoftteams?view=teams-ps)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105131/5749c1c5-3ede-ea89-a1e6-8a3174e8d562.png)


[リファレンスはこちら](https://docs.microsoft.com/ja-jp/powershell/module/teams/connect-microsoftteams?view=teams-ps)

[チーム一覧を取得したい(PowerShell)
](https://mokudai.jp/knowledge-base/msteams/get-team-list-in-powershell/
)

[PowerShell で Office 365 に接続するときのおまじない](https://mokudai.jp/knowledge-base/o365-admin/powershell-fixed-spell2)
package.jsonの構造

#プログラミング勉強日記
2020年10月7日
package.jsonをよくわかっていないままnpmを使ってインストールしてたので、この機会に構造を学ぶ。

#package.jsonとは
　依存関係を示したファイルで、このファイルにプロジェクトに必要なパッケージの名前とバージョンを記述すればnpmが必要なパッケージをインストールする。
　package.jsonはnode環境のアプリの設定が書かれたファイルみたいなもので、Bundlerのようなもので、開発に使う依存ライブラリと本番で使う依存ライブラリを書くことができる。

　（RailsのGemfileみたいなものなのかな、、？[こちらの記事](https://qiita.com/mzmz__02/items/c8f5337f2991ccdd5d4f)でRailsのGemfileやGemfile.lockについて扱ってます）

#構造

```json:デフォルトの構造
{
  "name": "express-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```
　これをもとに1つ1つ見ていく。

| 名前 | 説明|
|:--:|:--:|
| name  | アプリ名。それ以外に特に意味はない値。 |
| version | アプリのバージョン。更新したら数値を自分で手動で変える。 |
| description | アプリの説明。それ以外に特に意味はない値。 |
| main | npm run ~で起点となるファイル。明示的に使用する場合が殆どなのであまり利用しない。|
|scripts | npm経由でプログラムを実行してくれる仕組み。｜
| keywords | npmパッケージハブにアップした際の検索に利用。アップしないなら特に意味はない。|
| author | アプリ制作者。アップしないなら必要ない。|
| license | ソフトウェア・ライセンスを記載。アップしないなら必要ない。|


##おまけ
　expressやmongodbなどをインストールすると以下のようになる。

```json
{
  "name": "express",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "moment": "^2.29.0",
    "mongodb": "^3.6.2",
    "mongoose": "^5.10.7"
  }
}
```

#npmを使ってインストールするとき
　npmを使ってインストールするときに、最後に`--save`を付けるとpackage.jsonに書き込みされる。package.jsonに書き込むことで、他のパソコンにプロジェクトを送った時に`npm install`のコマンドを入力するだけで、package.jsonに記述されたものがすべてインストールされるので便利。

#参考文献
[npm/package.jsonの使い方](https://www.codebu.org/posts/how-to-use-npm/)
[npmとpackage.json使い方](http://kokudori.hatenablog.com/entry/2013/04/04/025521)
Laravel 7でnunomaduro/phpinsightsを導入する

#前提
Laravel7　アップグレード時にphpinsightsが死亡
Laravel 7でphpinsights使いたい

#原因
>Note for Laravel 7 users: phpinsights requires PHP 7.3+, and PHPUnit 9.0+. For upgrading PHPUnit, you can use following command:

PHP 7.3
PHPUnit v9以上
が必要

#やりかた
PHP7.3へあげる

PHPUnitを`^9.0`にする

```
composer require --dev phpunit/phpunit:^9.0 --update-with-dependencies
```

phpinsightsをいれる

```
composer require nunomaduro/phpinsights
```

#参考
https://phpinsights.com/get-started.html#within-laravel
Unity 手書きでさくっとIK (Inverse Kinematics)

# UnityでHumanoid（人型）モデルにポーズをつけたい
最初はanimationファイルの中で各関節の曲がり具合を手動で編集してました
めちゃくちゃ大変
Very Animationなど使いやすいソフトもありますが、それでも大変

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221796/adb73381-63a2-8106-f158-908ec2b7b593.png)
パラメータ多い…


# なぜ大変なのか
3Dモデルのアニメーションは各関節の位置や曲がり具合で定義します

しかし、例えばコップを取る動作、私たちは「手をコップの位置に持ってくる」ということしか意識していません
右ひじを45度曲げて、肩を10度下げて・・・などと日常考えているわけではありません

それを3Dモデルでいきなりやろうとしても、非常に難しい


# そこでIK
逆に目標物の位置や向きから各関節の位置や曲がり具合を計算することもできます
IK(= inverse kinematics)といいます
普通にその方がいいよね？

# やり方
- Unityに適当なHumanoidモデルをインポート、Scene上に設置
    - Import SettingsでRig->Animation TypeがHumanoidなことを確認
- Unityに以下スクリプトをインポート

```c#:IKTest.cs
using UnityEngine;
using System.Collections;

public class IKTest : MonoBehaviour {

  public Transform lookAtObject = null;
  public Transform handR = null;
  public Transform handL = null;
  public Transform waist = null;
  public Transform footR = null;
  public Transform footL = null;

  private Animator animator;

  void Start()
  {
    animator = GetComponent<Animator>();
  }

  void OnAnimatorIK()
  {
    if (lookAtObject != null) {
      animator.SetLookAtWeight(1.0f, 0.8f, 1.0f, 0.0f, 0f);
      animator.SetLookAtPosition(lookAtObject.position);
    }

    if (handR != null) {
      animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);
      animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1);
      animator.SetIKPosition(AvatarIKGoal.RightHand, handR.position);
      animator.SetIKRotation(AvatarIKGoal.RightHand, handR.rotation);
    }

    if (handL != null) {
      animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
      animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
      animator.SetIKPosition(AvatarIKGoal.LeftHand, handL.position);
      animator.SetIKRotation(AvatarIKGoal.LeftHand, handL.rotation);
    }

    if (waist != null) {
      animator.bodyPosition = waist.position;
      animator.bodyRotation = waist.rotation;
    }

    if (footR != null) {
      animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
      animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
      animator.SetIKPosition(AvatarIKGoal.RightFoot, footR.position);
      animator.SetIKRotation(AvatarIKGoal.RightFoot, footR.rotation);
    }

    if (footL != null) {
      animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
      animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
      animator.SetIKPosition(AvatarIKGoal.LeftFoot, footL.position);
      animator.SetIKRotation(AvatarIKGoal.LeftFoot, footL.rotation);
    }
  }
}

```


- このスクリプトをHumanoidモデルにドラッグしてコンポーネントとしてアタッチ
- 手足・腰・見てる物の5つの目印となるオブジェクトを作成（SphereでもCubeでも）
- 先ほどのコンポーネントにそれぞれドラッグしてアタッチ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221796/f456d93f-3574-94e5-9d54-aca78df20f2a.png)

- Game再生

![IKTest.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221796/6d98351e-6623-efae-74b6-be517857f1c4.gif)

できた！

# 参考

公式のドキュメント: [IK](https://docs.unity3d.com/ja/current/Manual/InverseKinematics.html "IK")
アプリケーションのオリジナルロゴを簡単に作る方法(スマホで簡単)

#個人アプリのロゴを簡単に作成しよう！(Rubyの記述あり)
##必要なもの
* 「Pics art」
![20b59e6a2f37c51db0f66b2a3a0f7fff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/9e0be83f-5cd4-440e-6909-acc8feace7a0.png)

* 「背景透明化」
![0d3dfded9fc57049f6e37e3058a0d374.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/b31931c3-2e71-5114-1949-85effa82a1ee.png)
（それぞれapp storeで無料で取得できます）

#好きなように書く！
Pics art
![IMG_1429.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/60399ebc-949e-7b29-1832-95fbad2dbc44.jpeg)
#背景透明化する！
![IMG_1430.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/1930da1a-94d1-aacd-437c-ef7a02b8f6a5.jpeg)
⬇️
![IMG_1431.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/9109ab7e-dc7f-5713-dfc0-4f3e8c4860bd.jpeg)
#完了したらエアドロップでMacBookへ！
#ロゴ作成のポイントは<font color="Red">背景透明化</font>をしっかりすることです！

##MacBookに移動させた時点でファイル名を「logo.png」とかにしておくといいでしょう！
###ビューやらでやること
* assetsの配下に「image」フォルダを作成し、logo.pngを入れ込む
* ビューでimage/logo.pngを呼び出す記述をする
* 以上(CSSやそのままビューでサイズを調整する事を推奨します)

#app/assets/stylesheets/image/logo.png
こんな感じ（logo.pngはあくまで例えです）
![eabfbf345316a6022418c3ef0c05b033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/5a3a6ac0-2569-70d5-d201-915ddf1e3255.png)
#次にimageをビューに呼び込む記述
```java:title
<div class="main-logo">
  <%= link_to image_tag("logo.png", class:"main-icon"), "" %>
</div>
```
#これだけです！
###class名はなんでも構いません！ご自由に！
#こんな感じでうまくできてます！
![d544f6e1ab3bb430bf109362d561fe3c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/50ba3789-a487-bf01-3da2-c76c89191c93.png)
#まとめ
画像の数が多すぎるとアクティブストレージやAWSを使わないとパンクしてしまうと思うのですが個人でアプリケーションを作成するくらいなら直接imageフォルダに格納した方が圧倒的に楽です。
以上本日の学びでした〜！
VSCodeでArduinoのSerial Portが選択できない問題 [2020/10/07現在]

現在のところVSCodeでArduinoのシリアルポートを選択できない事象が発生している。
この問題はVSCode 1.48以前を使用することで解決することができた。

# 現在使用しているVSCodeのアップデートを停止する
ダウングレードした際、そのままだと自動でバージョンアップされてしまうのでダウングレード前に自動アップデート機能を停止しておく。
設定から検索欄に`update`とでも入力して画像に移っている2つの設定をオフにする。
![スクリーンショット 2020-10-07 002455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703910/1171ee00-90a3-b9f9-4cec-eec2d1d0b30c.png)


# VSCode 1.48.xのダウンロード
[VSCode 1.48.xのダウンロードページ](https://code.visualstudio.com/updates/v1_48)

画像のオレンジ色の四角部分にあるリンクからダウンロードする。
自分はWindowsのSystem版をダウンロードした。
が、ふつうはUser版がいい。自分も今はUser版を使っている。たいてい普通にVSCodeを入れたときはUser installerが使われているはずだからだ。
![Screenshot_2020-10-07 Visual Studio Code July 2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703910/0c5e76e1-c5d2-c5b0-7aff-c98680890935.png)

その後普通にインストールしたら完了。

書き込むことができた。
![スクリーンショット 2020-10-07 002752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703910/04af53fd-de06-63ee-c6ce-84da1dbc9219.png)

# 参考文献
* [Cannot select serial port (VS Code, Arduino Extension)](https://github.com/microsoft/vscode-arduino/issues/1099) - Github


# 追記
2020年10月7日23時26分　使用するインストーラの種類についての説明を追加
ruby でタブ区切りで並び替えしたい

タブ区切りのテキストから並び替えをして見やすくしたと備忘録

###まず、もととなるタブ区切りのテキスト
   
    profile.txt #LR utf-8 
    john	m	19
    micheal	m	28
    abbie	f	31
    dabid	m	17
    claire	f	26


左から”名前、性別、歳”がタブ区切りで載っています。
名前順にして並び替えたいと思います。


まず、テキスト自体どういう風に出力されるか確認します。

    File.open("meibo.txt") do |text|
      text.each_line do |line|
        p line
      end
    end

でファイルを展開すると

    $ ruby example.rb
    "john\tm\t19\n"
    "micheal\tm\t28\n"
    "abbie\tf\t31\n"
    "dabid\tm\t17\n"
    "claire\tf\t26\n"



と表されるので、タブスペースと改行コードを除いた各行の配列を作り
ソートして、標準出力します。


##大まかな流れ
1.ファイルを開き、読み込みができるようにする
2.名前順にソートをかける
3.標準出力する


#1.ファイルを開き、読み込みする
各行を`[名前,性別,年齢]`のようにして一旦、配列に入れます。
    
    profile = []

    File.open("profile.txt") do |text|
      text.each_line do |line|
        profile << line.chomp.split("\t")
      end
    end

各行の末文に`\n`を取り除くために`.chomp`しタブ区切りしているので`.split("\t")`区切りることによって

    $ ruby example.rb
    [["john", "m", "19"],
    ["micheal", "m", "28"],
    ["abbie", "f", "31"],
    ["dabid", "m", "17"],
    ["claire", "f", "26"]]

という風に配列`profile`が綺麗に`[名前,性別,年齢]`と必要なデータだけ取れました。

#2.名前順にソートをかける
rubyには`sort_by`メソッドがあるのでこのメソッドを利用して名前順にします。

    profile_sort =  profile.sort_by{|man| man[0]}
    pp profile_sort

出力結果は

    $ ruby example.rb
    [["abbie", "f", "31"],
    ["claire", "f", "26"],
    ["dabid", "m", "17"],
    ["john", "m", "19"],
    ["micheal", "m", "28"]]

となり、無事名前順に並び変わりました。

#3.標準出力する
ここまできたら、ソートした配列を出力しリダイレクトして並び替えをします。

    profile_sort.each do |text|
      puts text.join("\t")
    end

配列の文字列を`\t`で繋いで連結します。`puts`で出力された時にタブく区切りされるようになります。
また、`puts`は改行して出力してくれるのでわざわざ`puts text.join("\t")+"\n"`と
改行コードを書かなくても大丈夫です。

これを実行して出力結果が

    $ ruby example.rb
    abbie	f	31
    claire	f	26
    dabid	m	17
    john	m	19
    micheal	m	28


はい、これでタブ区切りのファイルを並び替えが成功しました。
herokuでのrailsアプリケーションのrakeタスクの定期実行について

## この記事で書くこと
N番煎じなことは百も承知だが、忘れないように書いておく。

wheneverというgemがheroku上で動かないのを知らなかったので、そのままデプロイして翌日、あれ？データが作られてない。。。？？という悲劇が自分の作ったサービスで起きてました。  :crying_cat_face: 


## どうしたらいいか
[heroku schedulerの公式ドキュメント](https://devcenter.heroku.com/articles/scheduler)
heroku schedulerというaddonが用意されている。ので、それを使う。

addonを追加して、 ` lib/tasks/scheduler.rb` にtask内容を追加

```lib/tasks/scheduler.rb
desc 'ジョブの用途を書く'
task ジョブ名: :environment do
  # 処理
end
end
```

期待する実行周期を選択し、jobに `rake ジョブ名`　を入力し、設定完了。


### 蛇足
単体の実行なら以下
`heroku run rake タスク名`
ローカル環境のCentOSにSquidをInstallした


検証でSquidセットアップする必要があったのですが、基本的にインターネット接続なし。
ということで、ローカル環境でSquidセットアップする方法をまとめておきます。

#経緯
・最初はUbuntu上にInstallしようと思った。
・踏み台サーバ経由でSquidファイル転送した。
・Ubuntuにインストールしようとするも、Gccエラー、Makeエラーで断念。
・結局、CentOSにInstallすることにしました。

#環境
- Ubuntu

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
```

- CentOS

```
[root@centos squid-4.13]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```
##Ubuntuにインストール（途中まで）
###踏み台サーバ経由でtarファイルを転送

```
 #scp ./squid-4.13.tar.gz root@172.22.2.102:/var/tmp/
```

SCPのPermissionエラーが出る場合はディレクトリの権限を変更します。

 [scpコマンドでPermission deniedが出るときの対処法
](https://hacknote.jp/archives/49429/
)


###解凍
```
[root@centos etc]# tar zxvf squid-4.13.tar.gz
```
###GCCのインストール
コンパイラがないというエラーが出るのでGCCをインストールします。

```
configure: error: no acceptable C compiler found in $PATH
```

＜参考になったリンク＞
https://gcc.gnu.org/
[gccをソースからビルド／インストールする](
https://qiita.com/liveralmask/items/6ed4a98ebb3bf6b7f707)
[configure, make, make install とは何か](
https://qiita.com/chihiro/items/f270744d7e09c58a50a5)
[./configure;make;make installにはどんな意味がある？](https://www.itmedia.co.jp/help/tips/linux/l0302.html)
[ソフトウェアパッケージのコンパイル、インストール、実行](https://www.codereading.com/unix-tutorial/tut7.html)

###makeのインストール
その後、./configureしてmakeしようとしたらmakeがないと怒られました。

```
ubuntu:~/tmp$ make
The program 'make' is currently not installed. You can install it by typing:
sudo apt-get install make
```
そこで[Ubuntu Package](https://packages.ubuntu.com/focal/make)からmakeをインストールしたのですが、考えたらこのファイルをmakeできない…詰んだ。

ということでCentOSにインストールすることにした。

#CentOSにSquidインストール
- 同様にSquidファイルをCentOSに転送
- configure, make, make install

できました。
AtCoderのA～C問題でよく間違えてたこと

# A問題
## for文を使わない
A問題はfor文なしで解けます。
入力は最大で4文字なので、if文を列挙しても時間はかかりません。
[例題：ABC175A](https://atcoder.jp/contests/abc175/tasks/abc175_a)
↑  Rが何回続いたのかを判定する問題です。if文を使えば、Rが続いた回数で場合分けできます。

###切り上げ
覚え方は「切って上げる」。-1で切って、割る数で上げる。覚えるのが面倒ならマクロを作りましょう。
[例題：ABC157A](https://atcoder.jp/contests/abc157/tasks/abc157_a)
Q：Nページの書類を両面印刷すると、最小で何枚の紙が必要か

```c++
//ans = (N-1+2)/2;
#define dup(x,y) (((x)+(y)-1)/(y))
ans = dup(n,2);
```
###大きいほうを選ぶときは、ifよりmax
```c++
//if(a > b) ans = a;  // コードが長いです。
//else ans = b;       // コードが長いです。
ans = max(a,b);  // 1行でかけます。
```

###Yes,Noの出力はマクロ
```c++
#define yn {puts("Yes");}else{puts("No");}
if(a >= 30) yn;  // 入力が30以上ならYes。未満ならNo。
```

# B問題
## 小数点
小数点は誤差の温床。不要な割り算は使わないようにしましょう。掛け算にすればOKです。

```c++
//if(sqrt(a*a + b*b) == c)  //小数が出る
if(a*a + b*b == c*c)  // 小数が出ない
```
小数を出力する問題は桁数に注意しましょう。多めに出力する分には問題ないので、どーんと大きくいきましょう。「正しい値との絶対誤差または相対誤差が 10^(−9) 以下であれば正解とみなされる」なら、15桁くらい出しておきましょう。
ギリギリを狙うとWAが出るので注意。

```c++
#define shousuu cout << fixed << setprecision(15);
shousuu;  // 以降の出力が小数点以下15桁になる。
```

###オーバーフロー
数が大きくなりそうなら、intではなくlonglongを使いましょう。マクロを使うとllで省略できます。
llでもオーバーフローするなら、割り算にしましょう。
[例題：ABC169B](https://atcoder.jp/contests/abc169/tasks/abc169_b)

```c++
//ans *= a;  // そのまま掛け算するとオーバーフローする場合は……
const ll LINF = 1001002003004005006ll;
if(ans < LINF / a) ans *= a;  // オーバーフローしないかチェックしてから、掛け算をする。
```

# C問題
## コーナーケースを確認する。
例題が全部通っても過信してはいけない。

## 超便利なset
setは２つの機能を持っています。
・重複した値の削除
・昇順ソート
「同じ要素があるか答えよ」という問題はもちろんですが「条件を満たす数を列挙せよ」という問題にも役立ちます。例えば「Nの約数を列挙せよ」という問題の場合、通常なら重複をif文で除外して昇順ソートが必要ですが、setなら一発です。

## 重複なしループ
例えば「異なる数や点を3つ選び、条件を満たしているものの個数を求める」といった問題に使えます。

```c++
rep(i,n) rep(j,i) rep(k,j)
```

## 解けなかったらD問題へ
CよりDが簡単なこともあります。DよりEが簡単なときもあります。
（自分はまだ一度も体験してませんが）




# 勉強用の記事
[Visual Studio Codeで競プロ環境構築](https://qiita.com/AokabiC/items/e9312856f588dd9303ed)
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)
[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編：競プロを始めよう】](https://qiita.com/e869120/items/f1c6f98364d1443148b3)
[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編：目指せ水色コーダー！】](https://qiita.com/e869120/items/eb50fdaece12be418faa)
コードカバレッジの種類について

# コードカバレッジ

## 本記事の概要
本記事では、下記3種類のカバレッジについて記載する。

- ステートメントカバレッジ（C0：命令網羅）
- ブランチカバレッジ（C1：分岐網羅）
- 単純条件カバレッジ（C2：条件網羅）

## 説明で用いるサンプルコード

    if (条件文a1 || 条件文a2) {　//判定条件A
		命令文1
	} else{
		命令文2
		
	} if (条件文b1 && 条件文b2) {	//判定条件B
		命令文3
	}

<br>

## ステートメントカバレッジ（C0：命令網羅）
### 結論
- 実行可能なステートメント（命令）のうち、**テストで実行された命令の割合**のこと<br>
⇒カバレッジを100％にするには、実行可能なステートメントを全て少なくとも1回は実行する必要がある

### 上記サンプルコードの場合
- 命令文1～3のステートメントを行う2つのテストケースが必要

## ブランチカバレッジ（C1：分岐網羅）
### 結論
- 全ての判定条件のうち、**テストで実行された判定条件の割合**のこと<br>
⇒カバレッジを100％にするには、それぞれの判定条件の真偽が少なくとも1回は実行する必要がある

### 上記サンプルコードの場合
- 下記の2つのテストケースが必要（※それぞれの判定条件の真偽が少なくとも1回は実行されていることが確認できる）

1. 判定条件A：真、判定条件B：偽
2. 判定条件A：偽、判定条件B：真

## 単純条件カバレッジ（C2：条件網羅）
### 結論
- 全ての条件文のうち、**テストで実行された条件文の割合**のこと<br>
⇒カバレッジを100%にするには、それぞれの条件文の真偽が少なくとも1回は実行する必要がある

### 上記サンプルコードの場合
- 下記の2つのテストケースが必要（それぞれの条件文の真偽が少なくとも1回は実行されていることが確認できる）

1.  条件文a1：真、条件文a2：偽、条件文b1：真、条件文b2：真<br>
→判定条件A：**真**、判定条件B：真
2. 条件文a1：偽、条件文a2：真、条件文b1：偽、条件文b2：偽<br>
→判定条件A：**真**、判定条件B：偽

- なお、上記の例のようにC2のカバレッジが100％でも、C0, C1のカバレッジが100％になるとは限らない

## 参考
- [ホワイトボックステストにおけるカバレッジ（C0/C1/C2/MCC）について](https://qiita.com/bremen/items/8b6542467d2a0066e5af)
- [カバレッジ(網羅率)分析とは](https://www.techmatrix.co.jp/t/quality/coverage.html)
ImageJを使って光の点滅間隔の時系列データを動画から抽出する

##はじめに
動画などでホタルの点滅の間隔を知りたいときに手作業で行うのは地獄です。
なんとかして、ほどほどの自動化を行いたいと思いその忘備録を兼ねてメモします。

##使用するもの
・元動画(.AVI)
・ImageJ

#やり方
●ImageJに動画をドラッグ・アンド・ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/c5cfa6d4-75f7-58f6-ee81-11515e994e28.png)
こんなかんじでFrame数とかが出てくる。
このときに、輝度の情報を扱いやすくするために"Convert to ..."のチェックボックスをチェックしておきましょう。

すると、こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/6d5154df-46d4-e667-7f06-fff7610f7234.png)

※通常は1フレーム目が表示されます。
※この画像では533フレームにまで移動したものを見せています。

ここで白く見えるのは、明かりだと思ってください。
ちなみに、この時には54個くらいの個体の点滅パターンを解析する必要があったので、1つ1つの動画をあらかじめ横一列に並べる前処理をしています。

##解析するエリアを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/75cf320a-73fc-aae5-bd8e-bc54d7ded524.png)

図のように光っている場所について四角の枠で領域の選択をします。

##予備の解析の実行
「Image」→「Stacks」 →「Plot Z-axis Profile」
の順番で輝度の時系列データ(のグラフ)が吐き出されます。

動画の長さによっては、結構な時間がかかります。
最初に試してみたいだけの人は、四角からではなく点あるいは線だけの選択をすると良いです。

ちなみに処理中はこんな画像がでます。右下のプログレスバーが出てくるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/1c6a7560-c01e-6ee7-51b0-aa953be118e4.png)

終わるとこんな画像が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/1bacee8e-c6ca-b9bf-3cc0-184935457ee5.png)

見方としては、横軸はフレーム数になります。
そして、縦軸は明るさを意味します。
グラフが上下しているのは、点滅を意味しています。
※この方法で行う際は、点で選択したほうが直感的に理解ができましたね。

##本番
解析したい位置を選んで
「Image」→「Stacks」 →「Reslice」
を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/649bde0e-058d-f51e-943a-26bf0c0b6a77.png)
このように線を配置して実行すると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/9df0d2cf-f630-27d6-4734-9a5363e34bbc.png)
ひたすらスライスを作成していきます。
ちなみに、四角で選ぶと線の数×縦のピクセル数だけスライスをつくるのでハチャメチャに時間がかかります。
選択する領域は気をつけてください。

さきほどの処理が終わるとこのような画像になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/7d51d5ff-07ed-ede9-f68e-b4c60632fabb.png)

読み取る線の長さの範疇に、7個体の点滅があると読み取ります。
ここで、画像の中で縦軸は時間になります。たとえば、今回は5322フレームの時間の動画なのですが、縦のピクセル数も5322ピクセルだけあります。

この状態では扱いづらいので、Image→Transform→Rotate...から画像を90度回転させましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/86b8e615-2b30-e19f-f012-8eadbd88fdaa.png)

次にイメージを拡大して、走査線を引きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/2ac83544-9ffe-c655-c5cf-b5f4e5afd89f.png)

その状態で、command+kでグラフを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681294/4206a267-65a6-02e2-2066-1ece756860a2.png)

あとは、画像中の左下にあるボタン"List"をおすとテキストcsvデータが得られるのでコピペしてエクセルに貼り付けましょう。

お察しの通り、この走査線を手動でずらしながら、都度、グラフを表示してコピペする作業はそれなりに苦行です。

一方で完全な自動化をせずにあえてこのようにもしていて、明るさを検出する領域を誤る可能性が大いにあります。この整合性を取りに行くのは個人的には地獄だったので、手作業の時間を犠牲にしつつ納得しながらデータを取り切る事を優先しました。

※光る場所の位置が上下ずれていて、一本の線では拾いきれないという場合は、四角形の領域を選択→全ての画像の足し算→一枚の合成された絵からグラフ化の過程を踏むとよいです。
四角形の領域を選択後にImage→stacks→z-project→sum sliceの処理をおこなうことになります。
"Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1."の対処法

## 内容に関して
- チェリー本で有名な伊藤さんがとても分かり易い記事を書かれているのでそちらを見てください。
    - https://qiita.com/jnchito/items/e23b1facc72bd86234b6

## 解決策
- Railsの場合、クエリの実行やMySQLの設定を変更しなくても大丈夫！以下のように書き換えるだけです！
    - rails db:resetで行った場合変更が反映されないので注意！
    - rails db:dropとrails db:createを実施すること
        - おそらくrails db:migrate:resetでもいける。

``` config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4 #追記
  collation: utf8mb4_bin #追記
  reconnect: false
```
SAP GUI設定_メニューでトランザクションコード(T-Code)の表示・非表示

SAPコンサルタントやABAP開発者は日常の作業で頻繫に利用する機能があります。最初はメニューの階層を展開しながら対象機能を探して、実行します。時がたつにつれてERPシステムになれつつある。もっと効率的な実行方法を求めるかと思います。SAP ERPシステムはその機能が存在します。コマンドフィールドでT-Codeを直接に入力してエンターキーを押下すれば対象機能を実行できます。この方法は先に対象機能のT-Codeを覚えておく必要がある。下記の通り、「メニューでT-Codeを表示する」の設定方法を共有します。
#機能のT-Codeをメニューで表示する
SAP GUI第一画面でメニュー：「補足」=>「設定」
![SAP_GUI_DisplayTechnicalName.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760424/ba1063e0-4fbb-1aea-0036-06a6fdede881.jpeg)

設定前後の効果
![SAP_GUI_DisplayTechnicalName_compare.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/760424/608f0d1c-c4f0-54d8-d091-4b9a5b91a931.jpeg)

以上、メニューでT-Codeを表示できます。逆にT-Codeを非表示したい場合、「技術名称表示」のチェックを外してください。
無料のOpenShift on IBM CloudでWatson音声認識アプリを試す。

無料で試せるOpenShiftアプリ、今回はWatsonの音声認識を試してみました。
元ネタはこちらです。
https://developer.ibm.com/patterns/transcribe-audio-in-real-time-or-from-an-audio-file/
Githubのページはこちら
https://github.com/IBM/speech-to-text-code-pattern/blob/master/README.md

アプリ画面は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/a6a42be8-91eb-a723-0e07-8f77d15adf6f.png)
　左下のメニューでサンプル音声を再生したり、パソコンの音声で試したり、音声ファイルをアップロードしたりして音声認識を試せます。

やり方は
- OpenShiftの準備
- Watson Speech to Textサービスの作成
- OpenShiftのポータルでデプロイ

# OpenShiftの準備
 https://qiita.com/osonoi/items/a5d3a5fe78455c842f42 のページに上の方法を使ってOpenShiftのコンソール画面に行ってください。
IBM Demos https://www.ibm.com/demos/

# Watson Speech to Textサービスの作成
 IBM Cloudのページにログイン、カタログからSpeech to textを作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/970c3d13-8c14-96b9-f3d6-827727f72023.png)
作成したらSpeech to textのページンい行ってAPI Key, URLをどこかにコピーしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/84ab27b0-70d5-2c5a-dcb5-e727d684539e.png)

# OpenShiftのポータルでデプロイ
最初にS2Iを使ってアプリをデプロイします。
左上のAdministratorをDeveloperにして”From Git"を選択
URLは　https://github.com/IBM/speech-to-text-code-pattern
言語はnode.jsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/6fb4ac65-92f8-dfa0-1023-dedd3f6afeeb.png)

 そのあとは手順通りにやればいいのですが、私はconfig mapではなくSecretでやりました。
https://github.com/IBM/speech-to-text-code-pattern/blob/master/doc/source/openshift.md
Secretの作り方はProject DetailsからSecretをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/d322d1f0-7ecb-2642-cb38-521571f4dc9d.png)
"Create" --> "Key?Value Secret"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/ac1319ae-e297-032b-c599-2ae95ba8cfd8.png)
一つ一つ入れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/b3c74f25-7fb8-c1e9-8f8b-eeb11af98508.png)
入力するのは下の４つ。先ほどIBM Cloud, Speech to textでコピーしたAPI Key, URLを使ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/b5d23619-945f-a18a-183f-96f6259781f7.png)
入力したらSaveしてアプリに関連づけてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/9d6690b7-321b-fc8b-83e5-58584ed9e568.png)
自動的にデプロイされます。Topologyを見て下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/ed8919bd-14a3-182a-beb2-68f617c532eb.png)
Routeをクリックするとアプリは面がブラウザーの別タブで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/b6f49b62-74a2-1491-f164-090e03a97cbe.png)
Elasticsearchのよく使うコマンド集

備忘録としてまとめます。

# よく使うコマンド
#### インデックス一覧の確認
インデックス名や、インデックスの状態を確認することができる。

```
curl -XGET "$ELASTICSEARCH_URL/_cat/indices?v"
```

#### エイリアスの確認
```
curl "$ELASTICSEARCH_URL/_alias?pretty"
```

#### インデックスのマッピングの確認

```
curl "$ELASTICSEARCH_URL/$INDEX_NAME/_mapping?pretty"
```

#### ドキュメント一覧
インデックスに入っているドキュメントの一覧を確認することができる。

```
curl -XGET "$ELASTICSEARCH_URL/$INDEX_NAME/_search?pretty"
```

#### ドキュメント１件取得
インデックスにちゃんとドキュメントが入ったか確認することができる。

```
curl "$ELASTICSEARCH_URL/$INDEX_NAME/_search?pretty" -H "Content-type: application/json" -d '{"size":1}'
```

#### 最新のドキュメント1件取得
timestampは特定フィールドに書き換えること
```
curl -X GET "$ELASTICSEARCH_URL/$INDEX_NAME/_search?pretty" -H "Content-Type: application/json" -d'
{
  "size": 1,
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ]
}'
```

#### ドキュメントの件数確認

```
curl -sS -XGET "$ELASTICSEARCH_URL/$INDEX_NAME/_count?pretty"
```

#### エイリアス確認

```
curl -XGET "$ELASTICSEARCH_URL/_aliases?pretty"
```

#### ESのクエリ実行
```
curl -XGET "$ELASTICSEARCH_URL/$INDEX_NAME/_search?pretty' -H "Content-Type: application/json" -d '{ESのクエリ}'
```

sample
```
curl -X GET "$ELASTICSEARCH_URL/$INDEX_NAME/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "terms": {
      "id": ["1", "2", "3"]
    }
  }
}
'

```

## 参考
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html

https://blog.kozakana.net/2019/10/elasticsearch-confirmation-commands/
[Laravel] 削除機能

##概要

よくあるCRUDの個人メモ。
詳細画面からデータを削除するまでの過程を簡単にまとめる。

## 前提条件

以下記事を参考に、詳細画面が作成されていること。
https://qiita.com/Hiroto10/items/566f817625d79d727299

## Controller

ルーティングを確認すると、`destory`メソッドを編集することで削除機能を実現できる。

```app/Http/Controllers/TasksController.php
    public function destroy($id)
    {
        $task = Task::findOrFail($id);
        $task->delete();

        return redirect('/');
    }
```

## View

削除機能に新規画面は不要なため、詳細画面にボタンを配置する。

```resources/views/tasks/show.blade.php
  {!! Form::model($task, ['route' => ['tasks.destroy', $task->id], 'method' => 'delete']) !!}
    {!! Form::submit('削除', ['class' => 'btn btn-danger']) !!}
  {!! Form::close() !!}
```

詳細画面に削除ボタンが表示され、正常にデータを削除できたらok。
【画像保管計画】Pillow Image to Blob in MySQL

# 背景
　かつて誰もが為し得なかった神への道を目指し、僕はPythonで動画サイトのサムネ画像をスクレイピングで色々収集してまして、それをPillowモジュールで加工したものをMySQLで作ったテーブルのBlobカラムに保管しておきたいという必要に迫られました。画像の数は大量にあるので、ストレージの節約のため、いちいちファイルに書き出したりせずにオンメモリでBlobカラムに挿入する方法が欲しかった。その過程で調べて得られた手順をここに残しておきます。

# BLOBフィールド、展開！
以下のようなBLOB型のカラムimgfileを含んだimg_materialテーブルをMySQLのDBで定義しておきます。

```
CREATE TABLE `img_material` (
  `video_id` char(11) NOT NULL DEFAULT '' COMMENT '動画ID',
  `imgfile` blob DEFAULT NULL COMMENT '画像ファイル'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

```

# P.I.L.緊急排出！！
次のように指定したURLからrequestsで取得した画像があり、それをpillowのImageオブジェクトに格納し、トリミング加工をしています。

```
from PIL import Image
import urllib.request as req
import io

thumbnail_url = "https://xxx.xxx.xxx/xxxxxx.jpg" # 取り込みたいサムネ画像のURL
f = io.BytesIO(req.urlopen(thumbnail_url).read())#URLからサムネ画像を展開
thumbnail = Image.open(f).convert('RGB') #Imageオブジェクトに格納
thumbnail = thumbnail.crop((0, 11, 120, 79))#黒帯部分をトリミング
```
一旦Imageオブジェクトに変換して加工しましたが、これを上記のテーブルのBlobカラムであるimgfileへ格納したい！なのでもう一度ByteIOによりバイナリデータに戻します。

```
imgdata = io.BytesIO()
thumbnail.save(imgdata, "JPEG") 
imgdata.seek(0) #ファイルの先頭へ
imgfile = imgdata.read() #バイナリデータを格納
```
こうしてできたimgfileを先ほど定義したBlobカラムのあるテーブルへINSERTします。

#挿入、カラム並べて
MySQLdbにより、DBへの接続を行います。db_configの中身は、ご自分の環境に合わせて適宜変えてください。

```
import MySQLdb

# DB設定
db_config = {
    'host': 'localhost',
    'db': 'database_name',
    'user': 'root',
    'passwd': 'your_password',
    'charset': 'utf8',
}

# 接続する
conn = MySQLdb.connect(
  host=db_config['host'], 
  db=db_config['db'], 
  user=db_config['user'],
  passwd=db_config['passwd'], 
  charset=db_config['charset']
  )
```

上記ののコネクションから得られたカーソルにより、先述のimgfileを挿入するINSERT文を実行します。

```
# SQLクエリ
SQL_INSERT_IM = '''
  insert into img_material
  values(%s,%s)
'''

# DB操作用にカーソルを作成
cur = conn.cursor()

try:
    # 挿入データをタプルに格納
    insert_blob_tuple = ("VIDEO000001", imgfile)
    # INSERT文を実行
    result = cur.execute(SQL_INSERT_IM , insert_blob_tuple)
    conn.commit()
    print("Image data inserted successfully as a BLOB into table", result)

except MySQLdb.Error as error:
    print("Failed inserting BLOB data into MySQL table {}".format(error))

finally:
    if conn.open:
        cursor.close()
        conn.close()
        print("MySQL connection is closed")
```

# 参考資料
Image Module — Pillow (PIL Fork) 7.2.0 documentation
https://pillow.readthedocs.io/en/stable/reference/Image.html
io --- ストリームを扱うコアツール &#8212; Python 3.8.6 ドキュメント
https://docs.python.org/ja/3/library/io.html
BLOB 型と TEXT 型
https://dev.mysql.com/doc/refman/5.6/ja/blob.html
裏死海文書
https://w.atwiki.jp/evacommu/pages/92.html
【Docker】docker-compose上のRailsアプリのDBデータをバックアップ＆リストアする方法【MySQL】

現在業務委託でRailsアプリを使ってスクレイピングでデータ収集のお手伝いをさせていただいてるのですが、Docker環境を使っているため何かの拍子にうっかりvolume等を削除してしまったら大変なので、処理が終わるたびにデータのバックアップを取ってます。（レコード数33万件ほどある）

その方法をご紹介します！

##バックアップ手順

バックアップデータを突っ込みたいファイルをRailsのrootディレクトリにつくり以下のコマンドを実行する。

```shell

$ docker exec -it CONTAINER_NAME（例:myapp_db_1） mysqldump DATABASE_NAME(例:myapp_developmentなど) > backup.sql
```


##リストア(インポート）手順

取り込みたいバックアップファイル（dump.sql)をRailsのrootディレクトリにつくり以下のコマンドを実行する。

```shell

$ docker cp dump.sql mydocker_db_1:/tmp/dump.sql
$ docker exec -it myapp_db_1 bash
$ mysql -u USER_NAME -p -h HOST_NAME(database.ymlのhost名,dbとか) DB_NAME(myapp_developmentなど) < /tmp/dump.sql
```
docker exec -it myapp_db_1 bashでコンテナ内に入り、mysqlコマンドでインポートできます！

今後はデータのバックアップも自動化できればなおいいと思うので挑戦していきたいです！

以上です！
## 読んでいただきありがとうございます！
ご指摘などあればコメントいただけると嬉しいです！
UbuntuにDockerでZabbixを入れて、同じホストでDockerを監視する

# 環境
| 環境 | バージョン |
|:--|:--|
| OS | Ubuntu 20.04 LTS |
| monitoringartist/dockbix-xxl | latest |
| monitoringartist/dockbix-agent-xxl-limited | latest |

## 補足
dockbixは、dockerのzabbixで他のdockerプロセスを監視できるようになっているzabbix。

# 入れるまで
こちらの方の記事が良いです。
https://qiita.com/ko-he-8/items/c88c00dbc4e4f8b868b8


# 文字化け対応
```sh
sudo yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
mv /usr/local/src/zabbix/frontends/php/assets/fonts/DejaVuSans.ttf DejaVuSans.bk
ln -s /usr/share/fonts/ipa-pgothic/ipagp.ttf /usr/local/src/zabbix/frontends/php/assets/fonts/DejaVuSans.ttf
```
日付スラッシュ区切り撲滅委員会

プログラミングする際に日付の扱いがスラッシュ区切りだとちょいちょい面倒になることはエンジニアのみなさまには周知の事実かと思われますが、いつまで経っても

　　　**な　く　な　ら　な　い**

そんなわけで日付スラッシュ区切り撲滅委員会の立ち上げをここに宣言したいと思います。

なお、ここで問題にしているのは、UIや外部サービスの等のなんらかのシステム境界線上において発生する、文字列で定義された日付フォーマットのことです。

プログラム内部で日付を扱う場合は、区切り文字云々が問題になる文字列ではなく何らかの日付オブジェクトでやるべきでは？　と言われましたらそれはまったくその通りです。

# 設立の主旨
## スラッシュでなければなにで区切ればいいのか？

ハイフンです。

`YYYY/MM/DD` ではなく `YYYY-MM-DD` って書きましょう。

## なぜスラッシュ区切りではいけないのか？

日本語で「●/●/●」と区切られて日付が表示されている場合、暗黙的に「年/月/日」を意味します。これはコンピュータシステム用途として定義されたものではなく、手書きの文化から引き継いだものと思われます。

しかし、英語でスラッシュ区切りで日付を記入する場合、暗黙的に「月/日/年」を意味します。

なお、同じ英語圏でもイギリスだと「日/月/年」になるそうです。（さっき知った）

参考：
https://mysuki.jp/english-date-1468

つまり、西暦2020年10月6日と意図して「2020/10/06」と示したとき
アメリカ英語式では西暦6年（※）2020月10日を意味し
イギリス英語式では西暦6年（※）10月2020日を意味するわけです
※または20部分を省略したとみなし、2006年

バグる気しかしないですね

## それに伴う二次的な理由

おそらくは上記の理由により、大抵のプログラミングライブラリで日付を扱う場合、ハイフン区切りのYYYY-MM-DDを使用します。

スラッシュ区切りにも一見対応している場合がありますが、解釈フォーマットが上記で言う日本式なのかアメリカ英語式なのかイギリス英語式なのかは判然としません。（なおライブラリの開発者のボリュームゾーンを考えると、大抵の場合アメリカ英語式と推測されます）

利用側からフォーマットを指定してあげるインターフェースがあればスラッシュでもパトラッシュでも（**ここジョーク！**）正しく解釈させられるでしょうが、フォーマットの指定方法がない、または不完全なため使えない・使いづらい・わざわざデフォルトでない方法で扱うほどの話ではない、などの様々な事情により、プログラムを書いていればいずれどこかではハイフン区切りの日付形式にお世話になることになります。

つまり、スラッシュ区切り日付を使用している箇所があると、状況によりどこかで日付フォーマットをハイフン区切りに変換する必要が出てきます。ハイフン区切りを使う箇所とスラッシュ区切りを使う箇所とでフォーマットをうまく切り替えて扱う、という気遣いが必要になるわけです。

バグる気しかしないですね

# スラッシュ区切り撲滅に向けた委員会活動

## ユーザインターフェース

スラッシュ区切りはそもそも日付手書きの文化から引き継いだものであろう、と先に申し上げました。
そんなわけで大抵のユーザさんはスラッシュ区切りに見慣れています。

### 過激派向け

それでも全部ハイフン区切りにします。入力も表示もなんなら手書きも全部ハイフンでやれ！！！

### 穏健派向け

表示や入力インターフェースに、ユーザの要望や歴史的経緯上スラッシュ区切りがあるのはいったんやむなしとします。いまは臥薪嘗胆の時と思い耐えましょう。
来るべき時（いつのなんであるかは不明）のために、内部的な値の持ち方でスラッシュを使うのはやめ、出来る限りハイフンで統一しましょう。

なおUI的にも、`ここで言うスラッシュ区切りはYYYY/MM/DDを意味しているのである` ということを、プレースホルダーなどを利用してさりげなく宣言しましょう。 `スラッシュ区切りの日付というのがYYYY/MM/DDを意味している、というのは、あくまで日本の慣例の中で通じる暗黙知にすぎない` ことを理解しましょう。

スラッシュ区切りの日付がなおユーザにはYYYY、MM、DDだけを入力させて、自動で `YYYY年MM月DD日` なんて出し、親切丁寧なインターフェースに見せかけてさりげなくスラッシュをリストラするのも素敵ですね。

## ユーザインターフェース以外

### 過激派向け

全部ハイフン区切りにします。

### 穏健派向け

新規でクローズドなやつは全部ハイフン区切りにします。
既存ですでにスラッシュ区切りにされている場合は、まあその、可能かつ有用な範囲でハイフン区切りにしましょう。
ハイフン区切りを推進しすぎてバグの温床みたいなものを生み出すのもよくないですよね:relieved:

自分で管理していないシステムに起因してスラッシュ区切りが避けられない場合（例：使いたいサービスが提供しているAPIのI/Fがスラッシュ区切り日付である、など）は、血の涙を流しながらIF定義箇所でハイフン区切りをスラッシュ区切りに変換するコードを書くのがよいと思います。
意見が言える立場なら「日付はハイフン区切りのほうがいいかも…？」と提案してみるなどもありですね。

# 異論は認める

以上、ここ最近どうしても気になっているので思いつくまま書き散らかしてみましたが、ご指摘等ありましたらいただけますと幸いです。

# 余談

なお個人的には、仕事では現状に合わせて素知らぬ顔でスラッシュ区切りにすることもあるも、プライベートでは明らかな日本語書類の手書きの年月日ですら、自由フォーマットの場合は必ずハイフン区切りで書く、隠れ過激派です。

スラッシュ区切りで書こうとすると心のどこかが拒否反応を起こします。

横に `YYYY/MM/DD形式で` って注意書きがあればそれに従って書くんですが、そんなものがある紙の書類は見たことない。

（といってもそんな注意書きがあった場合は、今度はYYYY、MM、DDという表示についての暗黙知が求められちゃったりするわけですけども）

同士求む。
Elasticsearchの検索クエリについて

# 本記事の概要
Elasticsearchのリファレンスを読みながら、検索クエリについてまとめました！
クエリの理解に役立てていただけたら幸いです。

最初にまず、検索クエリを実行したときElasticsearchがどういう風に結果を返すのか
について触れたいと思います。

その後、実際にクエリの例を参考にしながら解説していきます。

# Elasticsearchは検索結果をどう返すのか
結論から言うと、検索用クエリのマッチ度が高いドキュメント順に返却します。
ここでいうマッチ度を関連性スコアと呼びます。

デフォルトでは、Elasticsearchは一致する検索結果を関連性スコアで並び替えます。
関連性スコアはドキュメントがクエリとどの程度一致しているかを測定します。

関連性スコアは検索APIの**_score**として返されます。
_scoreが高いほど、ドキュメントの関連性が高くなります。

関連性スコアの計算方法はクエリの種類ごとに異なります。

# Elasticsearchの検索クエリ
```file:Elasticsearch

GET /search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title" :   "Elasticsearch" }},
        { "match": { "content" : "Search" }}
      ],
      "filter": [
        { "term":  { "status" : "published" }},
        { "range": { "publish_date" : { "gte" : "2015-01-01" }}}
      ]
    }
  }
}
```
queryではドキュメントとどの程度一致するのかという指標を、関連性スコア(_score)として返します。

must句とshould句のスコアは組み合わされており、一致するクエリが多いほど高いスコアを返します。
boolクエリは、以下の複数種類のクエリを組み合わせることができます。

|クエリ              |説明|
|:------------------|:------------------|
|must              |必ずドキュメントに一致しなければいけない。スコアに貢献する。|
|filter              |一致しないドキュメントは除外される。スコアは無視する。|
|should              |一致する場合、スコアに貢献する。|
|must_not       |必ずドキュメントに含まれてはいけない。スコア無視する。|

matchクエリは、指定されたテキスト、数値、日付、またはブール値に一致するドキュメントを返します。
**あいまい一致**のオプションを含む、全文検索を実行するための標準クエリです。
検索文字のタイプミスがあっても、自動的に補完してくれます。

termクエリは、指定されたフィールドに**正確**な用語を含むドキュメントを返します。
rangeクエリは、指定された範囲内の用語を含むドキュメントを返します。

他にもリファレンスにたくさん載っているので、気になった方はぜひ参照してみてください。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html
自分なりにAWSの主要サービスをまとめてみた。

#【自分なりにAWSの主要サービスをまとめてみた。】

AWSクラウドプラクティショナーの学習をしています。
自分の独断と偏見で重要そうだなと判断したものをまとめました。
個人メモのような感じです。

##・コンピューティングサービス

###Amazon EC2 (Elastic Compute Cloud)
AWS上の仮想的なプライベートサーバー。起動されたものをEC2インスタンス。

###AWS Elastic Beanstalk
マネージドな仮想マシンでソフトウェアを実行できるサービス。

###Amazon Lightsail
Amazonの提供するホスティングサービス。様々なアプリがある。とても簡単にデプロイ可能。

###AWS Lambda
サーバーなし、かつイベント駆動でコードを実行できるサービス。

###Amazon Machine Image (AMI)
EC2インスタンス起動に必要なEBSの全体のイメージ(スナップショット)などを指す。

##・コンテナサービス

###Amazon ECS (Elastic Container Service)
EC2やFargate上でコンテナを起動できるサービス。コンテナ化したアプリの管理が容易。

###Amazon EKS (Elastic Kubernetes Service)
Amazonの提供するKubernetesのフルマネージドサービス。

###AWS Fargate
ECS/EKSで稼働するコンテナ用サーバーレスコンピューティングエンジンであり、プロヒジョニング不要。

##・ストレージサービス

###Amazon EBS (Elastic Block Store)
ブロックストレージ。 EC2から直接マウントして利用。

###Amazon S3 (Simple Storage Service)
ファイルストレージ。直接マウントはNG。 HTTP経由で大容量なファイルを置くことが可能。

###Amazon S3 Transfer Acceleration
S3に高速でデータをアップロードできるサービス。

##・データベースサービス

###Amazon RDS (Relational Database Service)
マネージドなMySQL、PostgreSQLデータベース。

###Amazon Aurora
クラスタ構成の高性能なマネージドリレーショナルデータベース。

###Amazon DynamoDB
大規模&スケーラブルなマネージド非リレーショナルデータベース。

###Amazon Redshift
データウェアハウス。ストリーム処理ができるデータを大量に保存可能。

##・移行、転送サービス

###Amazon Migration Hub
データセンタからAWSへマイグレーションの進行状況の確認ができるサービス。

###Amazon Database　Migration Service 
データセンタをRDSへ安全にマイグレーションできるサービス。

###AWS DataSync
AWSとデータセンタ間でデータを同期できるサービス。

##・ネットワークサービス

###Amazon VPC (Virtual Private Cloud)
プライベートな仮想ネットワーク。VPC内で自システムのAWSリソースの起動が可能。

###Amazon VPN (Virtual Private Network)
オンプレミス、リモートオフィス、デバイス、AWS間で安全に接続できるソリューション。

###Amazon Route 53
AWS提供のDNS。ドメインネームとレコードを管理。

###Amazon CloudFront
AWS提供のグローバルコンテンツッ配信ネットワーク。

##・開発者用ツール

###AWS CodeCommit
AmazonによるプライベートGitリポジトリによるコード保管ツール。

##・マネジメント、ガバナンスサービス

###AWS Organizations
AWSアカウント間での請求一元化や、アクセス、コンプライアンス、リソースなど共有できるサービス。

###Amazon CloudWatch
リソースとアプリケーションからログを取得してモニタリングできるサービス。

###AWS Auto Scaling
設定したルールに基づき、リソースのスケーリングを実現するサービス。

###AWS CloudFormation
テンプレートを使ってAWSのリソースを作成、管理できるサービス。

###AWS Config
AWSリソースのインベントリーと変更履歴を監査するサービス。

##・セキュリティ、アイデンティティ、コンプライアンスサービス

###AWS IAM (Identity & Access Management)
ユーザーなどを認証してリソースへのアクセスを認可できる権限システム。

###Amazon Cognito
ユーザーとパスワードの管理システム。アプリケーションのユーザー管理に便利。

###Amazon GuardDuty
CloudTrailやVPCフローログなどのイベントを元にセキュリティ脅威を検出するサービス。

###Amazon Inspector
AWSにデプロイしたアプリケーションの脆弱性、 ベストプラクティスからの逸脱等を評価するサービス。

###AWS Certificate Manager
SSL/TSL証明書のプロビジョニング、管理、(無料の) デプロイができるサービス。

###AWS WAF (Web Application Firewall)
脆弱性やセキュリティ侵害からウェブアプリやAPIを保護するファイアウォール。

###AWS Shield
分散サービス妨害(DD0S)に対するフルマネージドの保護サービス。可用性を向上させる。

###AWS Artifact
AWSのコンプライアンスレポートにオンデマンドでアクセスできるサービス。

##・アプリケーション統合サービス

###Amazon SQS (Simple Queue Service)
メッセージキューサービス。

##・コスト管理サービス

###AWS CUR (Cost and Usage Report)
AWSサービスの包括的なコストと使用状況のレポートを提供するサービス。

###AWS Budgets
AWSサービスの予算を作成し、超過の場合にアラートサービス。

###TCO Calculator
AWSのTCO計算ツール。

##さいごに。

問題集を一通り解いてみて、自分的に重要度が高いのではと判断したものをまとめました。
これらをまずは確実に覚えようと思います。

AWSのこれ重要だよといったものがありましたら、是非教えていただけると嬉しいです。
自己学習方法➁：休日の勉強時間の作り方

# 勉強時間を確保するための課題

子どもが産まれてから自分のために勉強時間を設けることが大変難しい
平日はまだしも、休日は･･･
それでもこっそり勉強会に参加してみると

妻「それって仕事じゃないんやろ。」
子ども「一人で出かけてずるい。」
ってなる。

労働時間以外でもフル稼働でソースを書くべし！みたいな程は思っていないが、
職場では取り扱わない技術を調べたり、技術系の動画を見たり、好奇心が満たされる程度の時間は調達したい。
これが最低限度できないとストレスとなるため、実現可能かつ継続可能な施策を検討してみる

# 解決したいこと

* 家事・育児はなるべく今まで通りにやる
* 土日の過ごし方に影響しない時間を確保する

---

## 現状分析

まずは家族全員の平日や休日のライフサイクルを把握する

![休日の勉強時間の作り方.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150628/15384ee8-199b-1a64-9114-93183fdd96fd.jpeg)

## 考察

* 完全に１人になれるのは子ども達が寝ている間のみ
* 平日・休日ともに夕食後から入浴まで、入浴から就寝までに自由な時間がある
* 入浴はどちらかが一緒に入ればいいので、妻が入ってくれると30分が確保できる
* 子ども達の稼働時間内では30分以上の勉強はできない
* 子ども達は食事前によくケンカする。お腹が減っていると仲良くできない。逆に食後は仲良く遊び始める。開始30分ぐらいはケンカしない
* 手がかかったり目が離せないことがあるが、1日の中に30分程度のロスタイムが何度もあって、合計すると約2時間。

---

## 計画・アクション

* 大まかな勉強時間を制定する（朝・日中・夜）
* 子ども達の稼働時間内ではいつでも開始でき、すぐに中断できるようにする
    * 学習内容は事前に決める
    * Myルールを決める

## 学習内容は事前に決める

学習したいことや興味があることは常時Trelloに溜めておく。
↓
学習内容を予習しておき、かかる時間をざっくり見積る。
学習内容を30分単位でざっくり分解する。例）読書であれば、1章5分、2章は10分
時間が読めないものは15分と仮定する。15分経った後に続けるかどうかを考える。
全てのタスクには締め切り時間を設定する。
※誰がやっても実現可能は内容にする
↓
どの時間帯（朝・日中・夜）で実施するかを決める。

### Myルール

現代人は忙しくて集中できる時間を確保するのが難しい。
しかし、たった15分の時間を１日の中で１回も作れないことなんかない。15分も集中できないのは他に原因がある。

* 作業中にSNSやSlackからの通知に反応してしまい、どこまでやったかわからなくなることがある。
* 作業中に人から話かけられて、返事した後にどこまでやったかわからなくなることがある。

集中できていないのではなく自分から集中状態を解除しているだけ。
作業中の通知やコミュニケーションは一切無視するぐらいがよい。宣言した時間が終わってから対応すればよい。

### 勉強時間：朝

子ども達の宿題が終わる10時ぐらいまでは比較的邪魔されないため、全集中が必要なことをする。
学習内容：コードを書く、デプロイする、設計する、登壇資料を作成する。⇒主にアウトプット
学習内容は２つまでとする。３つ以上は時間が足りない。
課題が発生した際、優先度が低い事象ならば夜に持ち越す。
調査に15分以上かかった場合は潔く諦める。他の学習をするか夜に持ち越す。

### 勉強時間：日中

子ども達の稼働時間内では、いつでも開始でき、すぐに中断できることから学習内容を選定する。
学習内容：技術記事を読む、動画見る。課題の原因を調査する。⇒ダラダラとスマホ使っている時間と一緒

### 勉強時間：夜

入浴中または入浴後～就寝前までの時間を利用して、主に学習計画を練る。
主な作業：学習内容や時間を見直す。朝の続きをする。課題の調査をする。社外イベントに参加する。

# まとめ

* タスクを実現可能なサイズにまで分解することは私生活においても大切。
* 休日の日中時間は効率重視で考えすぎないこと。家族と一緒に過ごすことも大切にする。
* 子どもの成長に応じてアップデートが必要。
GCP: Operations (Stackdriver, Logging, Monitoring) 

# Operations

こと、旧Stackdriverについて書きます。
実際の中身としては、LoggingとMonitoringに分かれています。
https://cloud.google.com/products/operations

# Logging
## コンセプト
https://cloud.google.com/products/operations
いろいろなGCPのサービスのログをとるサービスです。
APIやライブラリを使えば、GCP以外のログも取得てきます。

- ログエントリのサイズ: 256KBまで
- 監査ログなどはデフォルトで400日間保持する、ほかのサービスではデフォルト30日
- クエリできる
- GCS, BigQuery, Pub/Subにエクスポートできる
- ロールとしてviewerとwriterなどがある
- ログの種類
    - GCP
    - ユーザーログ: agent, api, client library
    - Audit log: 監査ログ
    - Access Transparency log: グーグルのスタッフがアクセスしたログ
    - マルチクラウドログ: awsやazure
- ログエントリ: 名前, リソース, タイムスタンプ, ペイロードを持つ

## How-to
https://cloud.google.com/logging/docs/how-to

エージェントを使うときの一般的な構造。
<img src=https://cloud.google.com/logging/docs/images/logging-agent-operation.png width=640 />

ログをルーティングできる
<img src=https://cloud.google.com/logging/docs/images/logs-router-image.png width=640 />

### Customer-Managed Encryption
https://cloud.google.com/logging/docs/routing/managed-encryption

- Cloud KMSを使う
- ユーザーがカギを作る、カギはクラウドに保管する
    - 鍵もオンプレに保存する場合はCSEKとなる、GCSとGCEくらいしか使えない

### BigQueryへのエクスポート
https://cloud.google.com/logging/docs/export/bigquery

- BigQueryへのstreaming insertができる
- ログののフィールド名がほぼそのままBigQueryのフィールド名になる
- date-sharded tablesかpartitioned tablesが作成される

## Security logging
https://cloud.google.com/logging/docs/audit/access-transparency-overview など

- access transparency
- audit log
- G suite audit log

## Multi tenant logging on GKE
https://cloud.google.com/stackdriver/docs/solutions/gke/multi-tenant-logging

概略図
<img src=https://cloud.google.com/stackdriver/images/multi-tenant-gke.svg width=640 />

...
Loggingについては以上です。

# Monitoring

ログやメトリクスを可視化するツールです。

## Concept
https://cloud.google.com/monitoring/docs/monitoring-overview

- Black-box monitoring: ユーザーが使うようにサービスをコールして、サービスの状態を監視できる。サービスの内側の状態は見ない。
- White-box monitoring: OpenCensusのようなライブラリーを使って、サービスの重要な箇所をモニタリングできる。内側も見れる。
- Grey-box monitoring: サービスが動いている環境の状態をモニタリングできる。
- Logs-based metrics: Cloud Loggingで収集されたデータによるメトリクス。
- 時系列データはメトリクスエクスプローラーやチャートで可視化できる。
- アラーティングポリシーでメトリクスに応じて通知できる。
- Black-boxモニタリングを使ってuptime checkという、定期的なサービスの状態チェックができる。
- ワークスペースにモニタリングデータをまとめることができる。
- ワークスペースはプロジェクトをホストしていて、GCPやAWSのデータを表示できる。
- VPCを使うことで、ペリメーターの外からのアクセスを制限できる。
- エージェントやサードパーティライブラリをつかった時系列データは、ラベルに基づいたリージョンに保存される
- Googleプロダクトのデータはそのサービスがデプロイされている場所に保存される。

## How-to
https://cloud.google.com/monitoring/docs/how-to

Monitoring Query Languageでモニタするメトリクスのクエリができる。

...
Monitoringについては以上です。
How-toは項目が多いわりに記載するほどのものはない感じでした。
メディアクエリを書いてレスポンシブ対応してみた話

## 【使用言語】
CSS

## 【きっかけ】
サンプルサイトを作成して行く過程で、PCとSP（スマホの略）を別々の表示にしたいと思った。
のでググってみると、メディアクエリなんちゃらというのがヒット。
試しにやってみることにした。

## 【解決策】
CSSにてメディアクエリを設定する

```
/* pc表示時のスタイル指定*/
@media screen and (min-width: 415px) {
　※ここにPC用のスタイル指定を記述
}
/* sp表示時のスタイル*/
@media screen and (max-width: 414px) {
　※ここにSP用のスタイル指定を記述
}
```
上記記述で
　画面サイズが415px以上と判定された場合→PC
　画面サイズが414px以下と判定された場合→SP
という意味でPC/SPの判別を行っている。

header部分で判別をさせる方法もあるが、こちらだと1つのCSSファイル上で
画面の表示を管理できるのでこちらを採用した。

##参照サイト
[レスポンシブの基本、メディアクエリの書き方](https://sole-color-blog.com/blog/71/)
【rails】バリデーション（validation）の使い方

バリデーションについて学習いたしましたので、
アウトプットとして、バリデーションの特徴と使い方を紹介いたします。

#validationとは？

バリデーションとは、
「入力フォームを通じてビューからサーバー側へパラメーターが送られてきた際、正常な値か検証する機能」です。

主な使用例としては、フォームの中身があるかないかを検証し、
ない場合はエラーを表示します。

例えば、userの電話番号の入力を必須にする場合。

```
validates :e-mail, presence: true
```

こうすることで、e-mailが入力されていない場合、エラーを表示することができます。


#validates_presence_ofをコードを減らそう
先ほど提起したように値が空じゃないか確認する場合、
validates_presence_ofを使うと、より簡素化することができます。

```csharp:例
validates_presence_of :e-mail: 
```

これでe-mailが入力されていない場合、エラーを返すことができるようになります。