OmniAICreator/Qiita-1.07M huggingface dataset:
nginxのfastcgi_paramsとfastcgi.confの違い

nginxをインストールすると/etc/nginx以下に設定ファイルが作成される。
その中にfastcgi_paramsとfastcgi.confがあるがこれらは中身がほぼ同じ。
違いや意図を調べてみた。

## fastcgi_params

```s
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
```

## fastcgi.conf

```s
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
```

## 違い
fastcgi.confの方は `fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;` の記述がある。
他は同じ。

## nginxの歴史
0.6系?のころ、nginxの設定はよくこうなっていた

```nginx.conf
location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /var/www/foo$fastcgi_script_name;
    fastcgi_pass backend;
}

```

その後、コミュニティのドキュメント化が発達にするにつれて、rootをハードコーディングするのではなく$document_rootを使う人と古い設定スタイルを使う人の二分化が起こりました。

fastcgi_paramは配列ディレクティブと呼ばれ、複数設定することができます。設定が重複した場合はnginxはそのまま複数の値をfastcgiに私、どの値を使うかはfastcgiの実装によります。(多くの場合最後の値が使用される。たぶん)

この挙動により、fastcgi_paramsの中にSCRIPT_FILENAMEを定義すると混乱を招く可能性があるため、定義することができませんでした。

その後、0.3.30リリースでfastcgi.confが追加されました。
fastcgi.confにはSCRIPT_FILENAMEの定義があり、$document_rootが使用されています。

## 参考
https://blog.martinfjordvald.com/nginx-config-history-fastcgi_params-versus-fastcgi-conf/
[シェルスクリプト]Debian環境で一発でDocker構築するシェルスクリプトを書いた

Debian環境でDockerをインストールするシェルスクリプトを書いたので備忘録として載せます

```
#!/bin/sh
set -e

# aptパッケージの更新
sudo apt-get update

# パッケージをインストール
sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common

# Dockerの公式GPGキーを追加
sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

# 安定したリポジトリを設定
sudo add-apt-repository \
     "deb [arch=amd64] https://download.docker.com/linux/debian \
     $(lsb_release -cs) \
     stable"

# aptパッケージの更新
sudo apt-get update

# Dockerのインストール
sudo apt-get install docker-ce docker-ce-cli containerd.io

# docker-composeのインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```
web会議に常に真顔/笑顔で参加できるアプリ

この記事は[クソアプリ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kuso-app)の12日目の記事です。

## プロローグ

時は2020年、新型コロナウイルスが世界中で猛威を振るい、エンジニア達はリモートワークを余儀なくされた。
日々繰り返されるweb会議。
エンジニア達は疲弊し、会議画面には苦悶の表情が映されることが多くなった。
「このままではいけない…」
この惨状を打破すべく、ある一人の男が立ち上がったのだった。（※フィクションです）

## 今回作ったもの
前置きはこれくらいにして、今回作ったクソアプリをご紹介します。


### このアプリできること

webカメラで撮影された自分の顔と予め用意した顔画像とを交換する、所謂Face Swap処理をした映像を作り、TeamsやZoomなどのWeb会議に流すことができます。
![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654508/d8c4019a-5999-9397-83f3-997e7c168d02.png)

これを使うことにより、常に真顔や笑顔の映像を作り出し、お好みの会議の雰囲気を作ることが可能となります！

## デモ

実際にこのアプリを使用した結果がこちらになります。
![magao.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654508/1dc9b606-fb56-d658-4b67-4ccc8ea09460.gif)

いかがでしょうか？真剣な表情で会議に参加している様子が伝わるかと思います。


また、使用する画像を変更することで、会議に終始にこやかな笑顔で参加することも可能です。
![smile.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654508/f157baaf-b5a0-5505-0240-634fadb26b8b.gif)

ときにはミスター・ビーンになりきり、参加メンバを笑わせるのも良いかもしれません。
![bean.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654508/da4698b2-b693-d5f3-ed76-3ae08aaeb078.gif)


## 使用した技術

今回このアプリには以下の技術を使用しました。

* Windows10
* C++(VisualStudio2019)
* OpenCV
    * contribのfaceモジュールを使用
* ycapture

偉大な先人達の知恵をお借りしてそれらを適当に繋いでおります。
特に[ycapture](http://yzwlab.net/ycapture/)は素晴らしいプログラムで、これを使用することで、加工した画像を仮想カメラに流す事ができるようになります。

アプリのソースコードはこちらになります。
https://github.com/onushi-k/face-swap-yc-client
ycaptureに映像を流し込むクライアント部分のみになりますので、実行には別途ycaptureやOpenCVのビルド/インストールが必要となります。

## 処理の内容

#### 下準備
* 静止顔画像から顔を抽出
    * CascadeClassifier を使用して、顔領域を検出
        * 検出器にはOpenCVに予め用意されているhaarcascade_frontalface_alt.xmlを使用しました。
    * 検出した顔領域に対して、顔の特徴点を抽出
        * 抽出にはOpenCVの[Facemark API](https://docs.opencv.org/master/d7/dec/tutorial_facemark_usage.html)を使用しました。

#### メイン処理
* カメラ画像をキャプチャ
* カメラ画像から顔を抽出
* 下準備で抽出した顔をカメラ画像に貼り付け
    * 貼り付けについては[こちらの記事](https://www.learnopencv.com/face-swap-using-opencv-c-python/)を参考にしています。
        * 顔の特徴点の抽出までは下準備で行った処理と同じで、その後凸包を求め、ドロネー分割を行い、メッシュを貼り付け先にアフィン変換しseamlessCloneしています。（←ヨクワカッテナイ）
* ycaptureの仮想カメラに流し込む

処理の中で顔の検出に失敗した場合には、そのフレームでの処理をスキップするようにしたため、素顔が露出することはほぼありません。
（"ほぼ"と書いたのは、たまに顔の検出位置が極端にずれて素顔が露出してしまうことがあるためです…）

### 反省

* Face Swapの位置がフレームごとにずれるので動画でみるとぐにゃぐにゃした顔になり不気味さを醸し出しています。
    * 今回、FaceSwapはOpenCVで実現しているのですが、顔を傾けたりするとすぐに検出に失敗します。dlibの方がロバストだという情報があるため、そちらのほうが良かったかもしれません。
    * もっと言えば、令和最新版としてはDeep Learningを使うべきだったかもしれません。機会があれば挑戦してみたいと思います。
* そもそも弊社ではweb会議でカメラをONにすることは滅多にないので、使い所がありませんでした。

## まとめ

以上、WITHコロナ時代にweb会議で活躍する(?)クソアプリをご紹介しました。
明日は@sada_lp1さんが「今年最後のクソをひねり出します」とのことです！楽しみです！
part3 if構文



# 制御構文

今回は制御構文について学ぶ
最後にはうるう年

    入力がうるう年かどうかを表示するプログラムをかけ
    1.うるう年は4で割り切れる数の年
    2.100で割り切れる年はうるう年ではない
    3.400で割り切れる年はうるう年
    4.2004,1999,1900,2000で試す
    5.それぞれtrue, false, false, true


## if 構文

まずは書式から

```ruby
if 条件1 then
  条件1が真の時に実行するコマンド
elsif 条件2 then
  条件1が偽で条件2が真の時に実行するコマンド
elsif 条件3 then
  条件1が偽かつ条件式2がのときにで条件式3が真の時に実行するコマンド
else
  全ての条件が偽の時に実行するコマンド
end
```



まず条件1が評価され、真の場合thenが実行され、偽の場合elsifが実行される。そしてすべてのelsifが偽の場合、elseからendまでのコマンドを実行する。
elseは記述しなくてもよく、elsifは好きな数記述することができる。


で、条件てどう書くの？


## 関係演算子

まずは書式

```ruby
左辺　演算子　右辺
```

で関係演算子てなんですの？
条件に対し、真か偽かで判断するものである。
さて種類は&#x2026;

| 記述   | 演算子 | 意味           |
|:-------|:-------|:---------------|
| a == b | ==     | aがbに等しい   |
| a != b | !=     | aとbが等しくない|
| a > b  | >      | aがbより大きい |
| a >= b | >=     | aがb以上       |
| a < b  | <      | aがbより小さい |
| a <= b | <=     | aがb以下       |


これらは左辺と右辺の数値や文字列が等しいかどうか、大小の関係を比較することができる。比較した結果は上記の表の意味に適合すると真、不適合の場合に偽を返す。


これだけでも書けるがものによってはelsif並びまくって読みずれぇ！となりかねないのでもう少し簡潔にかけるものを&#x2026;


## 論理演算子

まずは書式

```ruby
条件1 演算子 条件2
```

これ用いることで条件1と条件2がともに真なら&#x2026;とelsifの数が減らせて簡潔に見えるのでは？
で、何があるの？

| 記述    | 演算子 | 意味                                   |
|:--------|:-------|:---------------------------------------|
| a && b  | &&     | aとbがともに真の場合に真               |
| a ｜｜b | ｜｜   | aかbの少なくともどちらかがが真の場合に真|
| !a      | !      | aが真の時に真,偽のときに真             |


これらを使っていって最終的には、うるう年の課題へいきたいなぁ&#x2026;


## 四則演算

最終目的にいくならこれもいるなぁだいたい使うものを示す。

| 演算子 | 内容 | 具体例 |
|:-------|:-----|:-------|
| +      | 加算 | 5　+ 3 |
| -      | 減算 | 4 - 2  |
| \*     | 乗算 | 2 \* 8 |
| ／     | 除算 | 8 / 2  |
| %      | 剰余 | 13 % 3 |
| \*\*   | べき乗| 12\*\*2|

だいたい意味はわかりますよね？



で、これでいけるのかな？
まだ足りない気もする、4つで試すなので、繰り返しかあ


## eachメソッド

これはオブジェクトにある要素を順に取り出し、順に処理を行う。
まずは書式

```ruby
オブジェクト.each do |変数|
  実行するコマンド1
  実行するコマンド2
end
```

まだよくわかんない気もするので具体例を示す。うるう年を踏まえて&#x2026;

```ruby
year = [2004, 1999, 1900, 2000]
year.each do |num|
 print("num = ", num)
end
```

実行結果は

    num = 2004
    num = 1999
    num = 1900
    num = 2000

となっている
これは使えるぞ&#x2026;


# 課題へ&#x2026;

上記の手法を使って課題を解いてみよう
さて、まずは日本語で条件を整理してみよう
入力は4で割り切れる。また100では割り切れなく、400で割り切れる
入力 % 4 `= 0 でtrue, 入力 % 100 =` 0 && 入力 % 400 != 0 はfalse
てことは
条件部は

```ruby
if year % 100 == 0 && year % 400 != 0
  p false
elsif year % 4 == 0
  p true
else
  p false
```

になるはず。
てなわけでこれにeach構文を加えてみて&#x2026;

```ruby
num = [2004,1999,1900,2000]
num.each do |year|
  p year
  if year % 100 == 0 && year % 400 != 0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end
end
```

そして実行結果が

    2004
    true
    1999
    false
    1900
    false
    2000
    true

イケてるじゃん
始めのif文をelsifを使って2つに分けることも可能だが、やはりelsif減らすとスッキリするかな〜？今日はここまでです。


## 参考文献

[チャート式ruby-Ⅲ](https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8)



------
 - **source** ~/my_ruby/grad_members_20f/members/majesty99/for_post/ruby3.org
OCamlでUninhabited typeを書くいくつかの方法

これは[ML Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ml) 11日目の記事です。

OCamlでUninhabited type（値の存在しない型）を書くための方法をいくつか紹介します。

## 空のバリアント型を使う

現在書くならいちばん素直な方法。

```ocaml
type void = |
```

[refutation case](https://ocaml.org/releases/4.11/htmlman/gadts.html#p:gadt-refutation-cases)を使うと `absurd` 関数が書ける。

```ocaml
let absurd : void -> 'a = function _ -> .
```

ちなみに空の多相バリアント型は書けない。間違って下のように書くと、 `[]` という唯一のデータコンストラクタを持つ `void` 型が定義されてしまう（OCaml 4.03.0 から `[]` と `(::)` をユーザー定義型のコンストラクタとして使えるようになった）。

```ocaml
type void = []
```

## GADTを使う

GADTで型の等価性述語をつくり、それでありえない等価性を表現しようとする。

```ocaml
type (_, _) eq = Eq : ('a, 'a) eq

type void = (int, string) eq
```

型チェッカーは `int` ≠ `string` なことを知っているので refutation case で納得してくれる。

```ocaml
let absurd : void -> 'a = function _ -> .
```

## レコードの多相フィールドを使う

∀a. a で⊥を表現するやつ。

```ocaml
type void = { v : 'a. 'a }

let absurd x = x.v
```

## 🙅‍♂️`type void = Void of void`

実は `let rec` でふつうに値が作れてしまう（リファレンスマニュアルの [8.1 Recursive definitions of values](https://ocaml.org/releases/4.11/htmlman/letrecvalues.html) の節を参照）。

```ocaml
type void = Void of void

let rec absurd (Void x) = absurd x

let rec void = Void void
```

レコードの多相フィールドの場合は、同じことをすると（当然）型エラーになる。

```ocaml
let rec void = {v = void}
(*
Line 1, characters 20-24:
Error: This field value has type 'b which is less general than 'a. 'a
*)
```

## 🙅‍♂️`type void`

```ocaml
type void
```

`type void` は一見よさそうだが、OCaml的には型定義の実体をシグネチャで隠蔽した場合と区別できない。Standard MLのように`datatype`宣言が分かれていればどうにかなったのだろうが。

## おまけ: Haskellの場合

Haskell 2010から`data`宣言の右辺が必須でなくなったので `data Void` でよい。

```haskell
data Void

absurd :: Void -> a
absurd a = case a of {}
```

### 参考 

* [4.2 User-Defined Datatypes - Haskell 2010 Language Report](https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-680004.2)
* [Data.Void](http://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Void.html)
クラスタのノード欠損を復旧しようとしてクラスタを丸ごと落とした話

これは、私が若…くはないけどピカピカのAWS1年生だった、数年前のお話です。

## 何をやらかしたのか
### やらかし前の状態
本番運用しているWebアプリケーションの裏側に、EC2インスタンス3台でクラスタを組んだ某データストア製品を使用していました。データはクラスタ内でレプリケーションされており、1台がダウンしただけならクラスタは稼働を継続できます。2台がダウンするとクラスタ全体が機能しなくなります。
![working.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/677a3fb3-7990-96e4-1234-caa249e2e0d5.jpeg)
ある日、3台のうち1台で障害が発生してインスタンスへ疎通できない状態になりました。この時点ではクラスタは正常に応答しており、あと1台ダウンしない限りはサービスに影響が出ない状態でした。
![down1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/81c5731a-09f1-7fad-9291-93e8cab65a96.jpeg)
まず、ダウンしてしまったインスタンスを再起動して復旧させようとしました。ところがEC2マネジメントコンソールから再起動、停止を選択しても障害中のインスタンスは反応しません。そして私は間違いを犯します。
### やらかしたこと
この日は休日の午前であり、一番詳しい人はまだ寝ているようです。私は焦りました。

「やばい。早く3台構成に戻さないと、あと1台止まったらクラスタ全体が止まってしまう。」

既存のサーバが壊れてしまったなら、新しくサーバを作ってクラスタに参加させるしかありません。サーバのセットアップには複数のセットアップスクリプトを実行する必要があり、焦った状態で正しく実施できる自信がなかったので、正常稼働中インスタンスのディスクを元に新たなインスタンスを起動しようとしました。そしてAWS EC2コンソールで稼働中のインスタンスを選択して、 `アクション > イメージ > イメージの作成` を実施しました。
![snapshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/ae7c33be-2f9e-1912-dfcb-e99f8c0bab16.png)
操作を終えて数秒後、我に返りました。あれ今「再起動しない」って項目なかった? しかもチェック外れてなかった? もう一度イメージ作成画面を開いてみよう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/48c0ce98-b8f5-df53-df31-90f2330aa072.png" width="400px">
あっっ
## やらかした結果何が起きたのか
私は悟りました。ノード喪失に耐えて正常稼働していたクラスタに、自らの手でとどめを刺してしまったのだと。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/a6db4279-9960-17c8-5c58-86d4acf3834a.png" width="400px">
3台中2台が残り正常稼働していたデータストアのクラスタでしたが、再起動のために追加で1台が止まった結果、クラスタ全体が停止して無応答になりました。そして、そのクラスタに依存していた複数のWebアプリケーション機能しなくなり、再起動が完了するまで数万回のアクセスに対してエラーで応答し続けたのでした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/937f3896-03e3-76f3-26dc-49a247f78741.jpeg">
## 惨劇はなぜおこってしまったのか
この惨劇は複数の判断ミスが連続したことによって生まれています。

>やばい。早く3台構成に戻さないと

やばくありません。1台倒れても大丈夫なための冗長構成です。焦って本番を弄り回すほうがやばいのです。

>既存のサーバが壊れてしまったなら

実は、もう少し待てば既存のサーバが復旧してきたのですよ…判断が拙速でしたね。

>サーバのセットアップには複数のセットアップスクリプトを実行する必要があり、焦った状態で正しく実施できる自信がなかった

セットアップスクリプトを整理しておいてください。というか、セットアップ手順も分かってないのによく本番を触ろうと思ったな。

>正常稼働中インスタンスのディスクを元に新たなインスタンスを起動

正規の手順でセットアップしなさい。思いつきで適当な操作をするな。

>あれ今「再起動しない」って項目なかった? しかもチェック外れてなかった?

ダイアログをちゃんと読みなさい。

そして、誤判断の裏には障害に対する準備不足という根本原因がありました。

## 二度と惨劇を起こさないためにどうしたのか
2度とこのような失敗を起こさないために、障害対応手順の明記と障害対応訓練を実施しました。
### 障害対応手順の明記
既存のノード復旧を待つか、新規ノードを作成するかの判断のポイント。どんな手順で対応すればよいか等々、明確で正確な障害対応手順書を作りました。(なかったんかい!!
### 障害対応訓練
開発環境で実際にクラスタの一部ノードを落とし、手順に従ってアプリケーションに影響を出さずに復旧できることを確かめつつ、障害対応の訓練をしました。対応手順には操作に対する反応に応じて次の行動を決める分岐があり、繰り返し訓練を行って全パターンを網羅的に確認しました。

次に同じ障害が起きても、何の問題もなく対処できるはずです(それが普通です...)
## 蛇足
この記事では盛大にやらかしている私ですが、成果も出してるんですよ常にやらかしてるわけではないんですよ、ということで別のアドベントカレンダーへのリンクを貼らせてください。今年は[Supershipグループ](https://qiita.com/advent-calendar/2020/supership)と[Elastic Stack (Elasticsearch)](https://qiita.com/advent-calendar/2020/elasticsearch) のアドベントカレンダーに参加します。こちらも目を通していただけると幸いです。
シンボリックリンクとハードリンクの違い

#シンボリックリンクの特徴

- ファイルやディレクトリへの参照
- リンクを削除しても元のファイルには影響がない。
- ファイルとディレクトリのどちらに対しても作成できる。
- どこにでも作成できる。
- 作成方法：lnコマンドにオプションの「-s」を付けて、
`ln -s <元ファイル> <リンクファイル>`にして実行

#ハードリンクの特徴

- ファイルの**実体**への参照
- ハードリンクを作ると１つのファイルを２つの名前で参照できる。
- ファイルに対しては作成できるがディレクトリに対しては作成できない。
- 同じパーティションにしか作成できない。
- 作成方法：lnコマンドを使って、`ln <元ファイル> <リンクファイル>`にして実行
[Rails]views ファイル作成＃textが表示される



#＃textが表示される

表示していない＃textという文字列が表示されたので、調査しました。

![スクリーンショット 2020-12-30 23.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985261/2a0bf01b-1272-a1c1-91e7-f9477c77c03f.png)

間違ったソースコード　index.html.erb↓

```
<h1>トップページ</h1>
<%= @posts.each do |post| %>
  <div>
    <%= post.memo %>
    <%= post.created_at %>
  </div>
<% end %>
```

posts_controller.rb ↓

```
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
end
```

@posts = Post.all で DB内の情報を持ってきて html に渡して、<% %> で html に埋め込む。
htmlファイルを見てみると2行目 <%= %> になっているので、@posts も表示させてしまっていたと言うことでした。
今回表示させたいのは、 post.memo と post.created_at だけだから正しくは、↓

```
<h1>トップページ</h1>
<％ @posts.each do |post| %>
  <div>
    <%= post.memo %>
    <%= post.created_at %>
  </div>
<% end %>
```


#まとめ
<%= %> で html に埋め込んで表示。
<% %> で html に埋め込むだけ。
pyenv-virtualenvによる仮想環境の構築/Python（インストール、環境設定、パッケージ）Mac環境

こんにちは、かをるです。

今回は、pyenv-virtualenvの構築についてご紹介していきます！

パッケージのインストール方法については前回の記事をご覧ください。
【Python パッケージ（ライブラリ）のpipコマンドを使ったインストール方法】

同じバージョンで別の環境構築をしたい場合に、virtualenvというプラグインを使用しPyhonの仮想環境を構築することができます。

ブログに投稿しました。

https://kaworublog.com/pyenv-virtualenv/
コミットメッセージ間違えた！というときに使うコマンド

ああ〜〜コミットメッセージ間違えてしもたんやというときに使うコマンド。


## 直前にコミットしたメッセージを変更する

```
$ git commit --amend -m "新しいコミットメッセージ"
```

## 2つ以上前のコミットメッセージを変更する

```
$ git log
```

で何番目のコミットメッセージを変更したいか確認してから...

```
$ git rebase -i HEAD~X
//Xには何番目のコミットメッセージを変更したいかを入れる
```

viエディタが開くので、修正したいコミットの``pick``を``edit``に書き換えて保存する。

## でもそんなの覚えられないよという方は

GitUpがおすすめです。
[Gitクライアント「GitUp」をマウスフリーで使って爆速バージョン管理](https://qiita.com/riku_sasaki/items/a4cafdc0a5e347d4c78d)でかなり詳しく取り上げられています。

## 感想

直前のコミットの修正ぐらいならコマンドで問題なかったんですが、rebaseするとなると、ややこしくて、一回盛大にやらかして泣きながらその修正を1時間ぐらいかけて行うということが起きてしまいました。
それからは偉い人に教えてもらったGitUpを使っています。
ビデオ会議システム的な物を自分でこしらえてみる

# ビデオ会議システム的な物を自分でこしらえてみる ~紹介編~
WebRTCを使った開発をして共有したくなってしまったので共有してみようと思います。
何本かに分けて投稿していこうと思っています。
今回は紹介編として具体的な実装の話はしません。
いかに楽してWebRTCを使った会議システム的な物を作るかをお話ししていこうと思うので、それに使う要素の話を今回は主にしていきます。

#1. なんで自分で作るんだよ
最近某ウィルスの影響でリモートワークとか、先方との会議はテレカンでとかいう機会が増えて、今までZoomとかTeamsとかのリモート会議ができるようなツールを使ってこなかった人も触る機会が増えたと思います。

TeamsとかZoomって機能沢山あるしみんな使ってるしで便利？なんだと思うんですが、個人的にはテレカンってなんか、マイクとかの不具合とかであんま好きじゃないんですよね...

なので個人的にはDiscordとかのボイスチャットツールの方が好きだったりします。
そこで周りには自分の好きなツールばかりを布教して回っているのですが、そのためにはZoom・Teamsの事を知る必要がある(ネガキャンしてやるぜ)と思って調べてみた次第です。

#2. WebRTCについて調べてみた
そこで、ちょいちょい見かけたのがWebRTCというワード。
初めてみるタームだったのでwikiで調べてみると、
> ウェブブラウザやモバイルアプリケーションにシンプルなAPI経由でリアルタイム通信（英語: real-time communication; RTC）を提供する自由かつオープンソースのプロジェクトである。

> ウェブページ内で直接ピア・ツー・ピア通信を行うことによって、プラグインのインストールやネイティブアプリをダウンロードを行わなくても、ウェブブラウザ間のボイスチャット、ビデオチャット、ファイル共有などを実装できるようになる。
> WebRTCは、アップル、Google、マイクロソフト、Mozilla、Operaがサポートしており、World Wide Web Consortium（W3C）およびInternet Engineering Task Force（IETF）で標準化が進行中である。

> WebRTCの目的は、「ブラウザ、モバイルプラットフォーム、IoTデバイス向けのリッチで高品質なRTPアプリケーションを、開発できるようにし、共通のプロトコルセットで通信できるようにすること」である。

> リファレンス実装がBSDライセンスのフリーソフトウェアとして公開されている。また、マルチメディアフレームワークのGStreamerをベースに実装されたOpenWebRTCという別のフリー実装も存在する。

こんなことが書いてありました。
要約すると

1. オープンソースである
2. リアルタイムな通信を実現する
3. P2Pで通信する

みたいな感じでしょうか。

ウェブ上でリアルタイムなコミュニケーションを実装するために使える感じですね。

#3. Skywayを使ってみよう
リアルタイムな通信を実現してくれると言っても、そうそう簡単には行きません。

P2Pの通信をするためにシグナルリンクサーバを用意する必要がありますし、NAT越えをしなくてはいけなかったりと色々と実際にWeb上でシステムを作ろうと手を動かしてみると手間が掛かるということがわかります。

そこでその問題を解決してくれるのが[Skyway](https://webrtc.ecl.ntt.com/)という、SDKです。
Peerの管理やルームチャットの実装に便利なAPIまでなんでもござれの神様のような存在なのですが、最も嬉しいのは、上述したシグナルリンクサーバやNAT越えに至るまで全部Skyway側で管理してくれちゃうんです。

#4. 最後に
想像以上に前段が長くなってしまったので実装編は次回に回します。
次回は「Skywayを使って個人チャットをサッと実装してみる」みたいなフワッととした感じで記事を書きたいと思います。
できれば年内に...
自作キーボード9 キーボード基盤はんだ付け完成

# 右側の基板はんだ付け完了

![IMG_20201230_205116.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/a05ca8f7-18f2-0888-6700-972bd33e6a99.jpeg)

とうとう完成した。
抵抗の位置と穴の幅が狭すぎて窮屈すぎたのでKicadのPCB基盤設計図を直しておいた。
動作上問題ないため、もちろんこのまま使う。

# いよいよ左右を連携させてテスト

キースイッチはまだつけてないため、ジャンパ線でスイッチの穴を手動でショートさせテストする

![IMG_20201230_223823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/875305ee-1246-71ed-4a78-7d494a908a84.jpeg)

# 結果

![IMG_20201230_223831.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/2db6a8a5-2888-f9d0-b163-bcdb137d461d.jpeg)

ちゃんと左右のキー認識してるーーー。
ゼロから基盤設計しはじめて、3か月経過し、やっと動いた様子を目の当たりにし
めちゃくちゃうれしい。


# 今後の予定
ケースとプレートは初めての3DCADで何度も設計ミス等や採寸のミスを見つけ、
再見積を依頼した。

Elecrowの担当者はその度にちゃんと対応してくれるので感心。
Elecrowは素材毎の単価がわからないから、毎回見積を依頼する必要がある。
どの素材がいくらするのかがわからない点がとても不便だ

最後の設計修正があり、造形体積が大きくなるので実際には金額が1.5倍ぐらいになると思う。
トッププレートはアクリル1.5mmは強度的に割れるらしいので金属で作りたい。再見積もり中

|見積先|見積日|見積バージョン|素材|Elecrowサービス名|価格|製造日数|加工オプション|
|:---|:---|:---|:---|:---|---:|:---|:---|
|Elecrow|2020/12/30|case_rev0|PLA|3D printing|$70|5 days after order confirmed|Polishing|
|Elecrow|2020/12/30|case_rev0|UV Curable Resin(Similar to ABS)|3D printing|$72|5 days after order confirmed|Polishing|
|Elecrow|2020/12/30|case_rev0|送料|Shipping to Japan|$13.9||0.5kg|
|Elecrow|2020/12/29|plate_rev0|Black Acrylic|Laser Cutting service|$20|5 days after order confirmed||
|Elecrow|2020/12/29|plate_rev0|送料|Shipping to Japan|$13.9||0.5kg|
|Elecrow|2020/12/22|case_rev0|ABS|CNC Milling Service|$130|7 days after order confirmed||
|Elecrow|2020/12/14|plate_rev0|PLA|3D printing|$20||Thickness: 1.5mm|
|Elecrow|2020/12/14|plate_rev0|送料|Shipping to Japan|$17.01||0.6kg|
|DMM.make|2020/12/12|case_rev0|PA12　ナチュラル（MJF）|3Dプリントサービス|￥22,265||0.6kg|

かれこれ3か月以上かかったが、いよいよ完成が見えてきた。
ここまでのソースファイルを一式githubにまとめた。
https://github.com/kirin123kirin/keyboard

<br><br>
<td><font size="6">
※Amazon商品へのリンクは「Amazon.co.jpアソシエイト」を使用しています。
「Amazon.co.jpアソシエイト」とは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。
</font>
</td>
スクリーンショット早見表


|対象画面|保存先|Mac OS|Windows|
|---|---|---|---|
|全画面|クリップボード|Shift + Command + Control + 3|PrintScreen|
|〃|画像ファイル|Shift + Command + 3|Win + PrintScreen|
|指定範囲|クリップボード|Shift + Command + Control + 4|Win + Shift + S|
|〃|画像ファイル|Shift + Command + 4|-|
|指定ウィンドウ|クリップボード|Shift + Command + Control + 4 -> Space|Alt + PrintScreen|
|〃|画像ファイル|Shift + Command + 4 -> Space|Win + Alt + PrintScreen|
CASL2で汎用レジスタどうしの中身を交換する

CASL2で汎用レジスタどうしの中身を交換するする方法をまとめます。

下の例はGR2とGR3の中身を交換します。
他の汎用レジスタを使用せず、交換します。
WCASL-IIというシミュレータで確認済みです。

＜XORを使う方法＞
GR2(GR2)は「GR2の中身はGR2である」ことを表し、
GR3(GR3) は「GR3の中身はGR3である」ことを表すこととする。

(1) XOR	GR2,GR3
GR2(GR2^GR3) <- GR2(GR2) ^ GR3(GR3) 
GR2には、(GR2^GR3)が格納される。 

(2) XOR	GR3,GR2
GR3(GR3^(GR2^GR3)) <- GR3(GR3) ^ GR2(GR2^GR3)
GR3^(GR2^GR3)　= (GR3^GR3)^GR2 = 0^GR2 = GR2である。
GR3には(GR3^(GR2^GR3))が格納されされるが、GR2のことである。
GR3の中身がGR2に変化した。 

(3) XOR	GR2,GR3
GR2((GR2^GR3)^GR2) <- GR2(GR2^GR3) ^ GR3(GR2)
(GR2^GR3)^GR2 = (GR2^GR2)^GR3 = 0^GR3 = GR3である。

GR2には((GR2^GR3)^GR2)が格納されるが、GR3のことである。
GR3の中身がGR2に変化し、交換が完了した。 

＜スタックを使う方法＞
GR2,GR3の順番でPUSHし、同じ順番でPOPすれば、中身を交換できる。

```
MAIN	START
;交換（その１）
	LAD	GR2,2
	LAD	GR3,3
	XOR	GR2,GR3
	XOR	GR3,GR2
	XOR	GR2,GR3
;交換（その２）
	LAD	GR2,2
	LAD	GR3,3
	PUSH	0,GR2
	PUSH	0,GR3
	POP	GR2
	POP	GR3
;
	RET
	END
```
【Swift】簡単な画面遷移まとめ

# パターン

- ボタンを押したら画面遷移
- 条件で画面遷移
- 変数を渡して画面遷移

追加するかも。

## ボタンを押したら画面遷移

1. 『NEXT』とか『次へ』みたいなボタンを設置する。
2. ボタンを `controlキー` を押しながらクリックして遷移したい画面にドラッグドロップ

![スクリーンショット 2020-12-05 19.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/5118ec9a-6f60-68cb-0b54-1106c6e283ea.png)

3. そしたらオプションが出てくるので選択する

![スクリーンショット 2020-12-05 19.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/0f132ffb-7bdc-9f57-a76b-8504dc4bce66.png)

## 条件で画面遷移

1. 上部のアイコンを `controlキー` を押しながらクリックして遷移したい画面にドラッグドロップ

![スクリーンショット 2020-12-05 19.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/514f8bf2-26eb-a049-86bf-9d373c99af0a.png)

2. 上記の『3』と同じくオプションが出てくるので選択する

![スクリーンショット 2020-12-05 19.21.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/78bcce6c-6ee3-5966-b242-77dbf6cf5ea9.png)

3. 画面遷移の矢印（"Segue" セグエという）をクリックしてIdentifierで名前（というかID）をつける

![7fddf47749010b61ea2655b2e425fe18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/bc4afe8f-bc81-120e-fd49-5377fb3349d1.png)

4. `if` の中でコードを書く

```swift:ViewController.swift
    if 条件式 {
      // 『3』で設定したIDを書く
      performSegue(withIdentifier: "next", sender: nil)
    }
```

## 変数を渡して画面遷移

1. `prepare` のメソッドを書いて値を渡す準備をする

`prepare` と書いて出てきたものを選択すると自動補完してくれる。

![スクリーンショット 2020-12-05 20.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/37045009-444b-de9f-90a2-cf5ba2486ce3.png)

### 渡す

```swift:ViewController.swift

  // 渡したい変数
  var face = "(´・ω・｀)"

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    // 遷移先のコントローラ名を書く。ここではNextViewController
    let nextVC = segue.destination as! NextViewController
    
    // 受け取る先で定義する変数名（後述）に渡したい変数を代入する  
    nextVC.nextFace = face
  }
```

### 受け取る

```swift: NextViewController.swift

  // 例えばLabelを設置しておいてそこで受け取る
  @IBOutlet weak var nextLabel: UILabel!
  var nextFace = ""

  override func viewDidLoad() {
        super.viewDidLoad()

      nextLabel.text = nextFace
    }
```

遷移先のLabelに `(´・ω・｀)` が表示される。
実用的なところでは計算した答えとか遷移先に渡すとかがいいと思う。
太陽光発電の発電量をロギングしてみた。(3)Microbit間無線通信とRaspberryPi-Microbit間シリアル通信で、測定値をロギング

[【太陽光発電の発電量をロギングしてみた。目次】](https://qiita.com/takoyakiya/items/6b318ab83bcac86c966c)
## Microbit間無線通信とRaspberryPi-Microbit間シリアル通信で、測定値をロギング

ここでは、電流・電圧測定モジュールINA260を接続したMicrobitから、他のMicrobitに測定データを無線通信で転送し、USB接続されたRaspberryPiとシリアル通信してRaspberryPiで測定値をロギングする。

#### ● Microbitの無線通信

Microbitは独自の無線通信により、他のMicrobitとデータ通信することができる。
Microbitの無線通信は意外とすごい。
冷蔵庫の中にMicrobitを入れて、庫外のMicrobitに温度データを送信できる。
試しに停止中の電子レンジにも入れてみたが、通信可能だった。

無線を使用するには、MakeCodeでは以下のブロックを使用するだけである。
・イニシャル処理で、送信側・受信側で同じ無線グループを設定　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/b3f2f16a-254f-c846-6d30-b5cd631b4f35.png)

・送信側：「無線で送信」する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/f5b78b0d-b661-d4a0-00a0-a2d314ad72a5.png)

・受信側：「無線で受信したとき」トリガーを使用して受信値を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/77673a69-6d02-7034-c23f-d953384f30d6.png)

以下、[MakeCode](https://www.microsoft.com/ja-jp/makecode)で編集した、センサー接続側のソースの全体像である。
測定値を無線で他のMicrobitに送信している。

【センサー接続側プログラム】
![Microbit電流測定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/d29362d0-e118-4515-66dc-778556cbdbcf.png)

#### ● Microbit-Raspberry間のシリアル通信

Microbitでシリアル通信すれには、MakeCodeで「高度なブロック」－「シリアル通信」を使用する。
以下はRasberryPiにUSB接続するMicrobitのプログラムである。
無線受信したデータをシリアル通信で送信する。

【シリアル通信側プログラム】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/a3d381d0-7f4b-4d78-e379-f4229f828cea.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627239/9e98807c-7a75-e727-a7d9-5209f77d5b74.png)

#### ● RaspberryPi側シリアル通信

RaspberryPiとMicrobitは、USBケーブルで接続する。
RasberryPiでLXTerminalを起動し、以下のscreenコマンドを実行することでMicrobitの送信データを受信して表示することができる。

```shell
sudo screen /dev/ttyACM0 115200
```

しかし、ロギングするならもう少し手を加えたいので、pythonで書いてみる。

```python
import serial
import struct
import datetime as dt

use_port = "/dev/ttyACM0"

_serial = serial.Serial(use_port)
_serial.baudrate = 115200
_serial.parity = serial.PARITY_NONE
_serial.bytesize = serial.EIGHTBITS
_serial.stopbits = serial.STOPBITS_ONE
_serial.timeout = 15

try:
    while True:
        rx = _serial.readline()
        st = "{0},{1}".format(dt.datetime.now(), rx)
        print(st)
        with open('/home/pi/current_{}.log'.format(dt.date.today()), mode="a") as f:
            f.write(st)

except Exception as ex:
    print(ex)
finally:
    _serial.close()
```




[【太陽光発電の発電量をロギングしてみた。目次】](https://qiita.com/takoyakiya/items/6b318ab83bcac86c966c)
[Rails] 情報編集画面に遷移した際、編集前の情報が全てフォームに入力された状態にする


---
投稿した本の詳細ページから編集ページに遷移した際、
すでにフォームに現在の投稿情報が入力されている状態を作る。

```Books_controller.rb
class BooksController < ApplicationController

  def edit
    @book = Book.find(params[:id])
  end
end
```

```ruby:edit.html.erb
<div class="books-sell-main">
  <h2 class="books-sell-title">本の情報を入力</h2>
  <%= form_with model: @book, local: true do |f| %>
    <%= f.file_field :image, id:"book-image" %>
    <%= f.text_area :title, class:"books-text", id:"book-name" %>
  <% end %>
</div>
```

<%= form_with model: @book, local: true do |f| %>の@bookには
items#editで取得したレコードの情報が格納されており、それをブロック変数 f にも
保持させています。
これのおかげでf.text_fieldと書くだけで、@bookに格納されている情報を呼び出し
ビューに反映することができます。

パスの指定が必要ないのは
form_withの機能で、
引数として渡されたモデルクラスのインスタンスが中身の入ったインスタンスの場合、updateアクションへ処理を振り分けてくれているからです。

反対に、引数として渡されたモデルクラスのインスタンスが中身の入っていないインスタンスの場合は、createアクションへ処理を振り分けてくれます。

今回の@bookは中身の入ったインスタンスのため、updateアクションへ振り分けられます。


---
データベースに保存しない場合のform_withの書き方

```ruby
<%= form_with url: "パス" do |form| %>
  # フォーム内容
<% end %>
```



データベースに保存する場合のform_withの書き方

```ruby
<%= form_with model: モデルクラスのインスタンス do |form| %>
  # フォーム内容
<% end %>
```
DXライブラリ HTML5版を使用時、ビルド時追加したソースを自動的にコンパイル＆リンクする方法(VSCode版, Windows)


DXライブラリ HTML5版を使ってブラウザで動くゲームを作ってみる (VSCode版, Windows)
https://qiita.com/nokotan/items/d2dff1559f981e5e3da5

上記のページには自動的にソースを探してコンパイル＆リンクする方法が書かれていなかったので、備忘録も込めてこちらに書いておきます。

#何が必要？
どうもVSCodeは自分のやり方が悪いのか『1つ目の命令文 & 終わったら2つ目命令文』みたいな感じで書いても2つ目の命令文が始まる前に止まってしまう。
これを解決するためにcmakeとか考えては見たものの、最初からbatファイル書けばいいのでは？となった。
よってbatファイルで解決することにする。

#batファイルを作るには
テキストで書き込んで拡張子を『.bat』に変えれば良い。

#必要なbatファイルは？
コンパイル、リンク（デバッグ）、リンク（リリース）のbatファイル。

#ソースは？

*compile.bat*

```
for %%f in (*.cpp) do (em++ %%f -c -o %%~nf.o -O0 -std=c++17 -g4 -IDxLibForHTML5 )
```

*build_debug.bat*

```
call compile.bat
@echo off
setlocal enabledelayedexpansion
set myvar=
for  %%i In (*.o) DO set myvar=!myvar! %%i
echo %myvar%
em++%myvar% -o index.html -O0 -std=c++17 -g4 -LDxLibForHTML5 -lbullet -lfreetype -logg -lpng -lvorbis -lz -lDxDrawFunc -lDxUseCLib -lDxLib --emrun -s FULL_ES2=1 -s ALLOW_MEMORY_GROWTH=1 --source-map-base http://localhost:8080/ --preload-file assets@/ --shell-file template.html
```

*build_release.bat*

```
@echo off
setlocal enabledelayedexpansion
set myvar=
for  %%i In (*.o) DO set myvar=!myvar! %%i
echo %myvar%
em++%myvar% -o index.html -O0 -std=c++17 -LDxLibForHTML5 -lbullet -lfreetype -logg -lpng -lvorbis -lz -lDxDrawFunc -lDxUseCLib -lDxLib --emrun -s FULL_ES2=1 -s ALLOW_MEMORY_GROWTH=1 --source-map-base http://localhost:8080/ --preload-file assets@/ --shell-file template.html
```

#2回もbatファイル呼ぶのが面倒なのでまとめる

*build_compile_debug.bat*

```
call compile.bat & call build_debug.bat
```

*build_compile_release.bat*

```
call compile.bat & call build_release.bat
```

プロジェクトフォルダに上記５つのbatファイルを置く。
デバッグなら、『build_compile_debug.bat』
リリースなら、『build_compile_release.bat』
を実行すれば良い。
たぶん、コマンドプロンプトではなくpowershellではないと動かないかも？
【Vue.js】条件を算出プロパティに記述

Vueでv-ifの条件をHTMLタグではなくJS側で記述する方法 についてまとめました。

## 【要約】

算出プロパティを使った書き方で条件付きレンダリングを実装してHTMLの可読性を保つ方法について学んでいきます。

## 【算出プロパティとは】

算出プロパティは「data関数内のプロパティなどの値を再計算して、計算結果が即座に反映される値として扱えるようにするもの」です。

### 使うことのメリット

算出プロパティを使うことで、ロジックをHTMLではなくJS側で管理してHTMLの可読性を挙げることが出来ます。

本来見た目を表す役割のHTMLに複雑なロジックを書くことは好ましくありません。HTMLに直接v-ifなどの処理を記述すると、複雑な処理になるほどHTMLの可読性が下がるからです。

## 【実際に書いてみる】

v-ifの条件式を算出プロパティでJS側に記述する例です。

JS側は以下の様に記述します。

1. computedプロパティを定義
2. 算出プロパティcheck_ageを記述してv-ifの条件式を書いています。

```jsx
const peaple = new Vue ({
  el: '#app',
  data:{
      age : '19'
  },
	//computedプロパティを定義
  computed:{
		//算出プロパティcheck_ageを記述
    check_age: function(){ 
      return this.age >= 20;
    }
  }
});
```

HTML側は算出プロパティ名の「check_age」を記述するだけで非常にスッキリ書くことが出来ました。

```html
<div id="app">
	<p v-if="check_age">成人です。</p>
	<p v-else>未成年です</p>
</div>
```

## 算出プロパティの省略書き

算出プロパティも以下のように「: function」部分を省略して記述することが可能です。

```jsx
//computedプロパティを定義
  computed:{
		//算出プロパティcheck_ageを記述
    check_age(){ 
      return this.age >= 20;
    }
  }
```

## 【補足v-show】

v-ifのように「要素を表示、非表示にする」v-showというものがあります。

### v-ifとの違い

- 要素の表示/非表示の切り替えをCSSのdisplay: none;で行う
- 条件分岐が使えない

### v-showの仕様場面

v-showはcssで表示の切り替えを行うことで、レンダリングのふかがv-ifに比べて少ないことがメリットです。

- 単純に〜の場合は表示するという条件の場合
- 加えて切り替えの頻度が高い場合

上記のような場面ではv-showのほうが向いていると言えます。

### v-showの書き方

v-ifと全く同じで、上記のHTMLを使う場合以下のようになります。

```jsx
<div id="app">
	<!-- v-showの記述 -->
	<p v-show="check_age">成人です。</p>
</div>
```

## 【まとめ】

- 算出プロパティとは、複雑なロジックをHTMLに書かないようにするためのプロパティ
- v-ifは表示 / 非表示 / 別のものを表示する時に使う
- v-showは単純な表示/非表示かを切り替える時に使う

これらを駆使することで短いコードで読みやすく、負荷の低いプログラムが作れるようになりそうです。

おつかれさまでした！
Webの仕組み

#【Webの仕組み】

[MDN Webのしくみ](https://developer.mozilla.org/ja/docs/Learn/Getting_started_with_the_web/How_the_Web_works)を基にWebについて備忘録として残します。

##WebブラウザでWebページを表示させる。

Webに接続されたコンピュータはクライアントとサーバと呼ばれる

・クライアントは、一般的なWebユーザーが使うインターネットに接続されたデバイスであり、これらのデバイスで利用できる Web にアクセスするソフトウェアのこと。

・サーバとは、Webページ、サイト、アプリケーションを保存しているコンピュータ

※クライアントデバイスがWebページにアクセスしたいときは、Webページのコピーがサーバからクライアントにダウンロードされ、ユーザーのWebブラウザに表示される

##クライアントとサーバの他に重要なもの。

<strong>インターネット接続：</strong>Web上でデータの送受信を可能にする。

<strong>TCP/IP：</strong>どのようにWeb上をデータが動くかを定義した通信プロトコル

<strong>HTTP：</strong>クライアントとサーバが対話する方法を定義するアプリケーションプロトコル

<strong>DNS：</strong>Webサイトの住所録のようなもの。

　ブラウザにWebアドレスを入力すると、ブラウザはWebサイトを取得する前にDNSを見て、Webサイトの本当のアドレスを探す。
　ブラウザはWebサイトがどのサーバにいるかを探し出す必要があり、それでHTTPのメッセージを正しい場所に送ることができる。

<strong>コンポーネントファイル：</strong>Webサイトは多くの異なるファイルで構成される。

　主に2種類のファイルに当てはまります。
　・<strong>コードファイル：</strong>Webサイトは主にHTML、CSS、JavaScriptから作られる。
　・<strong>アセット：</strong>Webサイトを構成するコード以外のすべての材料の集合的な名前。

　例）画像、音楽、動画、PDF、Word文書など。

##ブラウザにWebアドレスを打ち込んだ時に何が起こっているか

1、ブラウザは、DNSサーバにアクセスし、Webサイトのあるサーバの実際のアドレスを探す。

2、ブラウザは、サーバにHTTPリクエストメッセージを送信して、Webサイトのコピーをクライアントに送るよう求める。

3、メッセージ、およびクライアントとサーバ間でやりとりされるその他すべてのデータは、TCP/IPを使用してインターネット経由で送信される。

4、サーバがクライアントのリクエストを承認すると、サーバはクライアントに「Webサイトを見ることができます。」といったようなメッセージを送る。

5、そして、Webサイトのファイルを、データパケットでブラウザに送信し始める。ブラウザは小さな塊を完全なWebサイトに組み立て、表示される。
ローカル開発環境の構築

#Gitのインストール

以下のサイトを参照してGitをインストールしました。
https://prog-8.com/docs/git-env-win

#Dockerのインストール
以下のサイトを参照しました。
https://sukkiri.jp/technologies/virtualizers/docker/docker-win_install.html

#Docker-composeのインストール

#ssh鍵の生成
以下のサイトを参照しました。
https://eh-career.com/engineerhub/entry/2017/01/31/110000#%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%892-SSH%E3%81%AE%E9%8D%B5%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

Git Bashを立ち上げ、以下のコマンド入力し、ssh鍵を生成しました。

```
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

* -t：鍵のタイプを指定。
* -b：鍵の長さを指定。短いとセキュリティ的に危険。
* -C：鍵のコメントを追加できる。

鍵の権限を変更します。

```
$ chmod 600 ~/.ssh/id_rsa
```

```
$ vim ~/.ssh/config
```

```
Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_github
```

以上の設定により、ssh githubと入力しただけで、指定したホスト名・ユーザ名・秘密鍵が自動で指定される。

#Githubへのssh接続

```
$ ssh github
```

以下のように出れば接続はOKです。

```
Hi ~~~~! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```



#参照サイトと異なる作業をした点のみ記載

ブランチを切る前にコミットをしなければなりませんでした。

```
$ git commit --allow-empty -m "xxx"
```

#CentOSで作成していた本番用環境のプッシュ

##CentOSにgitをインストール

```
# yum install git
```

##リモートリポジトリに現段階の環境をプッシュ
以下のサイトを参考にしました。
https://kitsune.blog/git-command


#ローカルにリモートリポジトリの環境をクローン
AWS認定データアナリティクス 合格のためにやったこと

# 初めに
先日、AWS認定データアナリティクスに合格しました。
776点/1000点（合格点=750点）とギリギリでしたが…
勉強を進めるにあたっては、先人の皆様の記事が大変役に立ったので、私もこれから受験される方のお力に少しでもなれればと思い、この記事を書いています。

# やってよかったこと
## 1.先人の記事での情報収集
私が一番最初にやったのはこれでした。
皆様がどのように勉強したかが分かりますし、学習のポイントなども書いてあったりして大変参考になりました。Udemyのオンライントレーニングを購入しようと思ったのは@nasuvitzさんの記事がきっかけです。

 [「AWS 認定ビッグデータ 専門知識」試験に合格するまでのオススメ勉強法](https://qiita.com/nasuvitz/items/239ebf788c7c6206a2c1)

## 2．Udemyのオンライントレーニング
各サービスの理解にはUdemyのオンライントレーニングを使用しました。
触ったことのないサービスがほとんどでしたが、「解説動画を見る→分からないところをググる」を繰り返すことで効率よく理解を深めることができたと思います。単元ごとの小テストと模擬試験（65問）も付いており、試験問題の雰囲気を掴む上でも非常に有用でした。

とても役に立ったので、これから勉強を始める方には是非おすすめしたいです。
Udemyはなんやかんやで頻繁にセールをやっているので、その時を狙いましょう。私は1500円くらいで購入しました。

[AWS Certified Data Analytics Specialty - Hands On!](https://www.udemy.com/course/aws-big-data/)

## 3．Skillcertproの模擬試験
試験問題は問題文も選択肢もかなり長文になっているため、知識はもちろんですが、問題に対する慣れも合格する上で重要となります。
私はUdemyで一通りの知識が付いたと思ったタイミングで、Skillcertproという海外のサイトで合計370問からなる模擬試験（問題集？）を購入し、問題を解きまくりました。選択肢の中には知らないサービスが出てくることも多く、それらを調べて覚える、ということも平行して行うことで問題に慣れる同時に知識面の充実させることもできました。

しっかり解説もあるのでこちらもおすすめです。なお、こちらもUdemyと同様にいつでもセールをやっていて、1500円くらいで購入できました。
[AWS Data Analytics Exam Questions 2021](https://skillcertpro.com/product/aws-data-analytics-questions/)
# やらなくてもよかったこと
## 公式の模擬試験
問題数が20問と少ない上に解説がなく、自分の選択したものが正しかったかも分かりません（後で点数だけ教えてくれるスタイル）。私は無料バウチャーを使用したので費用負担はなかったのですが、4000円の価値はないかなと思いました。

# やればよかったこと
## 1. AWS公式の無料eラーニング
この存在に試験前日の夜まで気づかなかったため、私は受講できませんでしたが、これを一番最初にやるべきでした。練習問題も受けることができます。
実際に受けてないのでクオリティは分かりませんが、無料なのでやって損はないと思います。これを受けてみて、理解しきれないところがあればUdemyを買う、の流れがいいかもしれません。
[Exam Readiness: AWS Certified Data Analytics - Specialty](https://www.aws.training/Details/eLearning?id=46612)
## 2. BlackBelt、ホワイトペーパーの読み込み
私はUdemyやSkillcertpro問題集で分からなかったところだけググる、という勉強の進め方をしていました。そのため、結果的に辿り着くことはあっても、しっかり読み込むということはしませんでした。
ここら辺をしっかりやっていれば、もう少し余裕のある点数になったかなと思います。

# 勉強する上でのポイント
私なりに思ったことを書いておきます。
試験では、類似する機能やサービスとの違いが分かってないと解けない問題が多いです。

* Kinesis Datastreams、Kinesis Firehose
* Athena、Spectrum
* HDFS、EMRFS
* KMS、CloudHSM

そのため勉強する際は、類似する機能/サービスは何か？その違いは何か？それぞれの使いどころはどこか？というところ理解し、覚えていくことがポイントだと思います。

# 感想
最後に今回試験を通じて思ったことを2つ。

* 勉強効率を上げるために、有料コンテンツは積極的に使うべき
    * Udemy、Skillcertpro合わせて3000円以上の出費となりましたが、勉強時間を減らせたこと、一発合格できたことを考えると有効な投資だったと思います
* 問題を解きまくって慣れることが試験に合格する上で重要
    * どの試験でもそうですが、この試験は問題文/選択肢ともに長いので、特に当てはまると思います  

以上、少しでも皆さんのお役に立てれば幸いです。
未経験から応用情報技術者に合格する！(1) 応用情報技術者試験が未経験にはおすすめの理由

#前書き
こんにちは！僕は以前の記事でも簡単には書かせていただいたんですが、某プログラミングスクールで半年間勉強をさせていただきました。
しかし実は、このスクールには入る前からある資格を持っていました。それは応用情報技術者と、医療情報技師です。
なぜこの二つの資格を取得したかと言うと、元々漠然とITエンジニアに転職したいなあという思いがあり、とりあえず取っ掛かりとして勉強をして資格を取ろう！と思ったからです。それまではITに関する勉強もしたことがなく、ちょっとパソコンをいじるのが好きというレベルの知識でした。そこで今回は未経験から応用情報技術者にどのように合格したかを書いていきます！
今回はなぜ応用情報技術者から受けたのか？を書いていきます。

#そもそも応用情報技術者とは？
そもそも応用情報技術者試験とは国家資格の一つで、ITエンジニア向けの試験では基本情報技術者試験より一つ上のレベルの試験となります。
詳しくは応用情報技術者試験についてのページをごらんください。
https://www.jitec.ipa.go.jp/1_11seido/ap.html
試験は春と秋に行われ、その合格率はおよそ２０〜25%程度です。
試験は午前と午後に分かれており、午前は4択問題が80問、午後は11問(1問につき選択および記述の小問が4〜６問あります)で構成されており、それぞれで60点以上獲得すると合格となります。午前問題は1問につき1.25点なので48問正解すれば合格となります。一方で午後問題は、1問につき20点満点ですが、それぞれの問題の正答率によって各小問の配点が異なります。また記述問題もあるため、どれだけ正解できれば合格できるか、一概には言えません。正解率や正解の基準については試験の合格発表後に公表されます。ちなみに記述問題もあるため、午前問題をクリアできなかった場合は採点すらしてくれないです。

#なぜ応用情報技術者から取得したのか？
それではなぜ基本情報ではなく、応用情報技術者に挑戦したのかと言うと、午後問題で回答する必要のある問題の違いからです。基本情報技術者試験の場合、午前問題は4択で、難度も応用情報技術者に比べると低いですし、午後問題は全て選択問題になるのですが4択ではなく、複数の選択肢から複数選ぶ問題も多くあるので、しっかりとした知識がないと解けません。また初学者にとってハードルの高いいわゆるテクノロジ系の問題を多く選択する必要があります。

##基本情報技術者の午後問題は・・・
具体的な違いを言うと、基本情報技術者の午後問題は、まずセキュリティに関する問題を必ず回答する必要があります。そしてハードウェア、データベース、ネットワークソフトウェアのテクノロジ系と、マネジメント系、ストラテジ系の計6問から4問、更にアルゴリズム問題と、プログラミング言語を使ったソフトウェア開発の2問も必ず回答する必要があります。アルゴリズム、ソフトウェア開発の問題は初学者にはハードルが高く、更にこの2つで20点ずつ、40点の配点があり、テクノロジ系を取れないと午後問題は合格できません。

更に・・・令和2年秋の試験は延期となり、1月から3月に行われるようですが、形式が変更されるようで、選択問題はテクノロジ系から1つ、マネジメント系、ストラテジ系から1つと、更にアルゴリズム、ソフトウェア開発がそれぞれ25点ずつの配点となるそうです。なので未経験の場合かなり学習しないと難しいのではないのでしょうか？

##応用情報技術者の午後問題
一方、応用情報技術者の午後問題は、1問目のセキュリティ問題は必ず回答する必要がありますが、残りの4問は自由に選択できます。更にプログラミング、システムアーキテクチャ、ネットワーク、組込システム開発、データベース、情報システム開発のテクノロジ系問題もありますが、マネジメント系2問、ストラテジ系2問用意されているため、テクノロジ系の問題に挑戦しなくても良いのです。

テクノロジ系は計算や、コードの解読が必要であり、実務経験がある方はその延長で比較的楽にクリアできるかもしれませんが、初学者にはやはり勉強し、それを応用してプラスアルファして回答する必要がありかなりハードルが高いです。一方でマネジメント系、ストラテジ系は、午前問題をクリアし、言葉の意味さえわかればあとは国語の問題のような状態です。どこかに答えがあるのでそれを探せば正解できます。つまり文系の人はより解きやすいと思います。lまたこの二つの分野はどんな仕事でも耳にすることが増えている言葉も多く、仕事をしている人は繋げやすいのではないのでしょうか。
また組込システム開発の問題も簡単な計算で正解が出せるものも多く、比較的解きやすいので、問題選択の幅もあります。ちなみに、僕は令和元年春の試験に合格しましたが、セキュリティの問題を試験後に見ると、応用情報よりも基本
情報の問題の方が難しく感じました。セキュリティの問題は難度に大きな差はないと思います。

#まとめ
とにかく試験に合格したい人は応用情報技術者がおすすめです！
合格を目標にすることに賛否はあるかと思いますが、資格を取るように職場などから勧められている人や、未経験の方にの参考になれば幸いです。
ただし、午前問題はテクノロジ系50問、マネジメント系10問、ストラテジ系20問であり、テクノロジ系を取れないと絶対に落ちるので、勉強は必要です・・・というわけで、次回は午前問題について、勉強法や試験の解き方を書いていきます！
基本情報処理技術者試験 Python のサンプル問題を外部ライブラリを使用せず実装しました

基本情報処理技術者試験（FE）午後試験  Python のサンプル問題が下記のURLで公開されました。
https://www.jitec.ipa.go.jp/1_00topic/topic_20191028.html

matplotlibという外部ライブラリを使っています。
Python3をインストールしただけでは、このサンプルは実行できません。
そこで、外部ライブラリを使わず、turtleモジュールだけで実装しました。
紹介いたします。

```
"""
命令列はファイルから読み込む
ファイル名はコマンド引数で指定する
"""
import sys
import turtle
import re
 
def parse(str): 
    return [(x[0], int(x[1:])) for x in str.split(';')] 

def draw_init():
    turtle.shape('turtle')
    turtle.home()
    turtle.clear()
 
def draw(str): 
    opelist = parse(str) 
    stack = [] 
    openo = 0 
    while openo < len(opelist): 
        code, num = opelist[openo] 
        if code == 'U': 
            turtle.penup() 
        elif code == 'D': 
            turtle.pendown() 
        elif code == 'F': 
            turtle.forward(num) 
        elif code == 'B': 
            turtle.backward(num) 
        elif code == 'T': 
            turtle.left(num) 
        elif code == 'H':
            turtle.home() 
        elif code == 'X':
            turtle.setx(num) 
        elif code == 'Y':
            turtle.sety(num) 
        elif code == 'R': 
            stack.append({'openo': openo, 'rest': num}) 
        elif code == 'E': 
            if stack[-1]['rest'] > 1: 
                openo = stack[-1]['openo']
                stack[-1]['rest'] -= 1 
            elif stack[-1]['rest'] <= 1: 
                stack.pop() #stackの末尾の要素を削除する
        openo += 1 

#コマンド引数からファイル名を取り出す
filename = sys.argv[1]
#ファイルを開き、操作の文字列を読み込む
try:
    file = open(filename)
    opestr = file.read()
    opestr = re.sub('#.*\n', '', opestr)            #コメントを行末まではぎ取る
    opestr = re.sub(' \t\n', '', opestr)            #空白行をはぎ取る
    opestr = re.sub(r"([A-Z]{1})", r";\1", opestr)  #区切りのセミコロンを挿入する
    opestr = opestr.lstrip(";")                     #先頭の余分なセミコロンを削除する
#描画する
    draw_init()
    draw(opestr)
#例外の処理を行う
except Exception as e:
    print(e)
#ファイルを閉じる
finally:
    file.close()
```


次に操作するためのファイルの例を紹介します。

```
#点線の星を描く
R5
    R20
        D0
        F5
        U0
        F5
    E0
    T216
E0
```
＜実行結果＞
![点線の星.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154307/5d9ce186-9dee-ad45-344b-fe727138e33f.png)
Hyper-VでCentOS8.3をインストール時にKernel panic - not syncing:Attempted to kill init! exitcode=0x00007f00

７年前くらいのPCにHyper-Vが入ってたので、CentOS8.3を入れたときのお話。
ホストOS：Windows8.1Pro
ゲストOS：CentOS8.3
仮想ソフト：Hyper-V

CentOSは任意の場所にダウンロードしておいた。
他サイトを参考にHyper-V上に仮想マシンを新規作成。
もちろんセキュアブートは無効にして、起動。

１．セキュアブートは無効

![セキュアブート.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983024/bdf41f5c-6f2a-5d76-4d18-e259a10fcb87.png)

２．起動してみる

![起動画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983024/d36a7501-1a5b-8b67-2861-aa1c659ae76c.png)

３．Kernel panicで起動しない
![カーネルパニック.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983024/58690d6c-c03d-8f8c-89f8-b12fd9c6db9b.png)

【原因】
メモリ不足。ゲストOSに設定したメモリが足りな過ぎたみたい。
画面の一番上に、「Initramfs unpacking failed:write error」とでている。
CentOS8の推奨メモリは４ＧＢだから・・・そうだよね。５１２ＭＢで動くわけないんだ。

【対応方法】
再度、仮想を新規作成して、メモリを1024に設定する。
![メモリ1024.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983024/80e7933f-f3f9-8b3e-dd65-11311d7bdcc8.png)
Sourcetreeのfetchが永久に終わらないとき試したいことリスト

腹立ちますよね、これ。

- Sourcetreeの設定でアカウントを追加する
    - 参考：[SourceTreeでpullもfetchもできなくなったときの対応](https://qiita.com/YKEI_mrn/items/55886d4c63952ac18ebc)
- Hostを書き換える
    - 参考：[SourceTreeでGitリポジトリに急にpullやfetchができなくなった時の対処](https://qiita.com/honmaaax/items/23052c8aa495a4d947ad)
- システムのGitに切り替える
    - 参考：[macOS版SourceTreeでgit pullもgit fetchもできないときの対応](https://wandering-engineer.tech/2018/04/04/macos-sourcetree-git-pull-fetch-failed/)
- Githubのアクセストークンを再取得する
    - 参考：[GitHub – アクセストークンの作成・取得方法とgit操作での使い方](https://howpon.com/5308)
    - 今回記事を書いたときにはこれで治ったが、これで治るという話は特に見つからなかった。ダメ元で試したら治った。盲点すぎる。
IBM Event Streams to Netcool/OMNIbus連携

Red Hat Open Shift on IBM Cloudの性能監視にsysdigをりようすることとなったので、既存監視システムのNetcoolに連携する必要があったので手順をまとめみる


# Event Streams準備
IBM Event Streams for IBM Cloudを開始する
（フリープランでもNetcoolへの連携は可能）

## トピック
  「管理」画面より新規のトピックを作成しておく
![スクリーンショット 2020-12-30 21.30.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974623/c98a33d6-793c-3b8b-34e8-ae2e446d5007.jpeg)

## 接続情報
「サービス資格情報」画面よりMessageBus Probe接続用に資格情報を作成しておく
![スクリーンショット 2020-12-30 21.30.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974623/e9c460e6-c834-ed89-9442-39d638bec1b9.jpeg)


作成した鍵の詳細から以下の情報を確認しておく
* api_key
* kafka_brokers_sasl
* user
* password

# MessageBus Probe設定概要

導入手順はNetcool/OMNIbusの一般的なProbeのインストール手順と同様

構成が必要なのは以下のファイル

* $OMNIHOME/probes/linux2x86/message_bus_kafka.props
* $OMNIHOME/java/conf/kafkaClient.properties
* $OMNIHOME/java/conf/kafkaConnectionProperties.json
* $OMNIHOME/java/conf/kafkaTransport.properties

例
 
```props:$OMNIHOME/probes/linux2x86/message_bus_kafka.props
Manager : 'Kafka'
MessageLog : '$OMNIHOME/log/message_bus_kafka.log'
PropsFile : '$OMNIHOME/probes/linux2x86/message_bus.props'
RulesFile : '$OMNIHOME/probes/linux2x86/message_bus_kafka.rules'
TransportType : 'KAFKA'
TransportFile : '$OMNIHOME/java/conf/kafkaTransport.properties'
TransformerFile : '$OMNIHOME/probes/linux2x86/message_bus_parser_config.json'
MessagePayload : 'JSON'
``` 
Event Streamsで作成した資格情報等をここで設定する　

```props:$OMNIHOME/java/conf/kafkaClient.properties
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer

key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=org.apache.kafka.common.serialization.StringSerializer

acks=all
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
ssl.protocol=TLSv1.2
ssl.enabled.protocols=TLSv1.2
ssl.keystore.location=/opt/IBM/tivoli/netcool/platform/linux2x86/jre_1.8.0/jre/lib/security/cacerts
ssl.keystore.password=changeit
ssl.keystore.type=JKS
group.id=<Consumer-group-Name>

sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required serviceName="kafka" username="token" password="*************************";
``` 
Event Streamsへの接続情報を設定する

```props:$OMNIHOME/java/conf/kafkaConnectionProperties.json

{
  "zookeeper_client" :
    {
      "target" : "",
      "properties" : "",
      "java_sys_props" : "",
      "topic_watch": false,
      "broker_watch": false
    },
  "brokers" :"<KAFKA_BROKERS_SASL>",
  "topics": "<Event Streams TOPIC NAME>",
  "kafka_client" :
    {
      "properties" : "$OMNIHOME/java/conf/kafkaClient.properties",
      "java_sys_props" : "$OMNIHOME/java/conf/kafkaClient_javaSys.properties"
    }
}
```

```props:$OMNIHOME/java/conf/kafkaTransport.properties

KafkaClientMode=CONSUMER
ConnectionPropertiesFile=$OMNIHOME/java/conf/kafkaConnectionProperties.json
```  
古いバージョンのMessageBus Probe（11.0で確認）では資格情報の互換性の問題によりエラーとなるため、最新バージョン（13.0.x）の利用を推奨
Splunkで文字列を逆順にする。

[THE REVERSE CIPHER](http://inventwithpython.com/hacking/chapter5.html)をSplunkでやってみた。

```zsh:reverse.zsh
echo 'Three can keep a secret, if two of them are dead.' | rev
```

```python:reverse.py
message = 'Three can keep a secret, if two of them are dead.'
message[-1::-1]
```
とコマンドですぐにできる逆順への並び替え。

Splunkでやろうとすると、

```javascript:reverse.spl
| makeresults 
| eval message = "Three can keep a secret, if two of them are dead."
| eval counter=mvrange(1,len(message) + 1)
| stats values(message) as message by counter
| sort 0 - counter
| eval txt=substr(message,counter,1)
| streamstats count as counter
| eval counter=counter + 25
| eval counter_txt="!!".printf("%c",counter)."##"
| stats values(eval(counter_txt.txt)) as reverse values(message) as message delim=""
| rex mode=sed field=reverse "s/!!.##(.)/\1/g"
| nomv reverse
```

と大事になる。

理由としては

- マルチバリューを逆順にする関数がない。
    - `mvsort()`はAsciiコード順にしかならない :cry:
- フィールド単位で操作は可能だけど、フィールド内の操作する関数が少ない。
- ループできない。
- `list()`は１００文字制限がある。

ということもあり`values()`でなんとか整列をさせようと頑張ったのがこの形。

reverse|	message
|:--|:--|
.daed era meht fo owt fi ,terces a peek nac eerhT|	Three can keep a secret, if two of them are dead.

となんとか完成。

頻繁に使うなら、外部pythonスクリプトを用意した方がいいかもしれません。
Rails  Bootstrap導入

Bootstrap導入

##動作環境
ruby 2.5.1p57
Rails 5.2.4.4

##Gem導入

```Gemfile
gem 'bootstrap'
gem 'jquery-rails'
```

```
bundle install
```

##application.cssをリネームする

```
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
```

##application.scssで読み込む

```
@import "bootstrap-sprockets";
@import "bootstrap";
```

##application.jsに追記

```app/assets/javascripts/application.js
@import "bootstrap-sprockets";
@import "bootstrap";
```

##サーバー立ち上げる
もともと立ち上げていた場合には、一旦おとして再起動させる
[Linux] 常に追記されていくログ監視する方法

常に追記されるログを追いかけて表示する方法を紹介します

# tailコマンド

```shell-session:shell
$ tail -f ${ログファイル}
```

# less の forever オプションを使用する

```shell-session:shell
$ less ${ログファイル}
```

ファイルを開いたら、 `F` (Fの大文字)を入力します

* `/${検索ワード}` を入れて特定の文字列をハイライトすることもできます
* 追いかけるのを止めて、任意の場所へスクロール出来るのでtailよりは使い勝手が良いケースがあります

ログの表示を止めるには `Ctrl + C` キーを押します。
単にログを表示させたいときは `tail` 、細かく見たいときは `less` などと適宜に使い分けするのが良いと思います

logrotateなどでファイルが置き換わった場合、置き換わったファイル名が元と同じだとしても監視が止まってしまうのでご注意ください。置き換わった場合はコマンドを一度終了してから開き直す必要があります
UE4　第2日目　年末マテリアル廻り強化プログラム

前回は岩のマテリアルがほぼ完了して、あとは最終調整との事で、自分の思い描いている森の中に川があるシーンの作成。
アセットのENV廻りは全部UE4マーケットプレイスから。（よく言えば岩のモデリングぐらいはやりたいが時間がないので妥協）
エフェクトはグロー光らせてるだけなので特に何も特別な事はしてません。
（配置してポスト調整したぐらいだから特になんか書くことがないので）

一番苦手意識があったシーケンサーと今回でお友達になれて高画質で撮る方法も分かったので、自分的には大きな収穫。
動画投稿できないぽいので以下のURLから
https://www.youtube.com/watch?v=d7V1EodiJG4&feature=youtu.be