OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi Picoでmrubyが使えるようにしました。

# Raspberry Pi Pico用のmruby
mrubyをRaspberry Pi Pcioで使えるようにしました。

## ソースコードの取得
```
$ git clone https://github.com/k-mana/pico-mruby.git --recursive
```

または

```
$ git clone https://github.com/k-mana/pico-mruby.git
$ cd pico-mruby
$ git submodule update --init --recursive
```

## ビルドツールのインストール
```
$ sudo apt install cmake build-essential gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib rake
```

## ビルド
```
$ cd pico-mruby
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
```

:::note info
pico-sdkのissue#623が発生すると動作しません。 その場合はsrc/pico-sdk/pico_stdio.patchを適用してください。
:::


## アプリケーション
デフォルトはUSBシリアル

### hello_world
* バイナリはbuild/src/hello_world/hello_world.uf2に作られます。
* スクリプトまたはバイトコードを埋め込んだサンプルです。1秒ごとにHello worldを出力します。

### pico_mirb
* バイナリはbuild/src/pico_mirb/pico_mirb.uf2に作られます。
* REPL(Read-Eval-Print Loop)のmirbとして動作します。

### pico_mruby
* バイナリはbuild/src/pico_mruby/pico_mruby.uf2に作られます。
* USBマスストレージにcode.rbまたはcode.mrbが存在する場合、自動的に実行します。
* 実行する優先順位は以下です。
    1. code.mrb
    2. code.rb
    3. REPLモード

* USBマスストレージに書き込むと自動的に再起動します。
* code.rbまたはcode.mrbの実行中にシリアル入力をするとREPLモードになります。
【Rails】タイムゾーンの変更の仕方【初学者の疑問点を簡潔に解説】

## はじめに
　本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
　今回の疑問点は、

　　_タイムゾーンの変更の仕方について_
　
　です。　


## 疑問点についての解説

###結論

config/application.rbファイルのApplicationクラスに`config.time_zone = 'Tokyo'`を追記することでタイムゾーンを日本標準時間に変更することができます。


###詳しい手順
RailsではデフォルトのタイムゾーンはUTC(協定時)となっています。
created_atメソッドやupdated_atメソッドを使って時間を表示させると`2021-12-25 07:17:23 UTC`のよう9時間前の時刻が表示されると思います。
日本標準時間に設定するためには、config/application.rbファイルのApplicationクラスに以下のとおり
`config.time_zone = 'Tokyo'`を記述します。

``` config/application.rb

module sample_app
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config/locales/*.yml').to_s]

    #タイムゾーンの変更
    config.time_zone = 'Tokyo'

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end

```

記述後にcreated_atメソッドやupdated_atメソッドを使った日時の表示が、`2021-12-25 16:17:23 +0900`となっていれば成功です。


## まとめ
最後にポイントをまとめます。

- タイムゾーンを変更するためには、config/application.rbファイルのApplicationクラスに`config.time_zone = 'Tokyo'`を追記する
プログラムを書く時にやること

この記事は[記事は道メン（身内向け）アドベントカレンダー](https://adventar.org/calendars/6306)の12/24の記事です。
# 導入
 最近、「これがわからないので教えてほしい」と言って質問を頂く機会が増えてきました。もちろん答えるのですが、私にとって前提であると思っていたものが欠落している場合があり、そこから教える必要がある例もありました。また、いきなりプログラムを書き始めるような方もおり困惑することもありました。
そこで、今回は私がプログラムを書くにあたってやっていることをそのまま書いていきます。
言語は、PHPとします。
テーマは、簡単に__「九九の結果を二次元配列で作成し、出力する。」__とします。
出力例は以下の通り

    1 2 3 4 5 6 7 8 9
    2 4 6 8
    中略
                 72 81 

# まずやるべきこと
まずやるべきことは、「コードエディタを開いて、`<?php`の文字とにらめっこすること」ではないです。
これは絶対に違います。
__これから書くプログラムの流れを言語化すること__が先です。
最終目標である、九九の表を画面表示させるために何が必要で、それを満たすうえでの条件は何かを見るべきです。

## 流れを言語化する
少々長くなりますが、今回は思考をそのまま書いてみることにします。
今回は説明のため、大まかに流れを考えた後にまとめを書きますが、普段はこれを一度にやっています。
多少雑になっている部分もありますが、本来ここはできるだけ細かく書くべきです。

1. テーマにあるものを達成するためには、九九の結果を二次元配列に格納する部分と、表示させる部分の2つが必要
1. ではまず、格納部について考えるべきである
1. 出力例から推測するに、横をnの段として考えるのが良さそうだ。
1. 二重ループを用いることで、同ギミックは作ることができそう。
1. `iの段のj番目`の概念はそのまま配列の添え字を用いることができそう
1. `iの段のj番目`は`i*j`で求めることができるが、iとjは、0から始めるか1から始めるかも考えておく必要がありそう
1. 0スタート、`i<9`で止まるようにすればいい具合になりそうだ。これはjに関しても同様。
1. ただ、見た目で混乱する可能性がある(?)ので1スタート、`i<=9`で止めるのもアリかもしれない。(配列の添え字が1スタートなのは気持ちが悪いので不採用にしますがナシではないです。どっちがいいかは謎。
1. 格納部のアルゴリズムに関してはこれで大まかには確定したので、次は表示部について考える。
1. これもまた、二重ループを用いて表示することで解決ができそう。i,jに関して注意する点も格納時と一緒

##### つまり次のような流れで作業すればいいことになります

2. 必要な配列の初期化(PHPなのでそこまで厳格にする必要もないが)。今回は`$table`とする
2. ここから格納部の作成 
2. 今回は二重ループを用いる
2. `iの段のj番目`の概念はそのまま配列の添え字を用いる、ただし0の段0番目から8の段8番目という言い方になる点に注意が必要かもしれない。
2. `$table[i][j]= (i + 1) * (j + 1);`としてしまうのがいいかもしれない。
2. 格納部はここまで。次は表示部
2. こちらはforeachを利用して取り出していく。
2. 二重にforeachを利用する。先の格納部と同じ要領。一番上のforeachで`iの段`をすべて取り出す、これは配列の形である。
2. 二回目のforeachでそれぞれの値を取り出す

これで最低限はできるはず。ここまで来て初めてコードとにらめっこが始まります。

#コードを書き始める
ここは正直もう先に流れを書いてしまったため、特に書くことはありません。
書き出した流れの中で、わからないことがあったら都度調べるくらいです。
流れを細かく書きだすことで、わからない場合に「何がわからないのか」を明確にすることができ、質問する場合でも回答者の負担が格段に減ります。

```php:train-algorithm.php
<?php
//九九の結果を二次元配列で作成し、出力する。
$table = array();
for ($i = 0; $i < 9; $i++) {
    for ($j = 0; $j < 9; $j++) {
        $table[$i][$j] = ($i + 1) * ($j + 1);
    }
}

//foreachを利用して、二次元配列を出力する。
foreach ($table as $row) {
    foreach ($row as $value) {
        echo $value . " ";
    }
    echo "\n";
}
?>
```

ここまでで実行すると以下のように表示されるはずです。

```
1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
```

最低限の表示はできました。
もちろんこだわるのであれば、まだ改善できる箇所があります。
例えば、

* 格納時の機構でi,jが0から始まっているため、直感的にわかりづらい点
* 出力時の機構で値が一桁の場合に位置がずれてきてしまう点

がすぐに挙げられるかと思います。今はあえて「どこの機構で」「どのような原因、条件で」「どのような問題が起こるか」を具体的に示しました。こうすれば、どこを見直すべきが後からでもわかるのではないでしょうか。

# 最後に
九九表示を極めるのがこのエントリの主題ではないのでこれくらいにしますが、いきなりコードを書き始めているわけではないことが伝わったならば幸いです。おしまい。
Goをherokuで自動実行する

## はじめに
ついにアドベントカレンダー最終日になってしまいました。
私のクリスマスは帰国によりホテルでの隔離生活であるため、時間だけがありました。

ずっとGoを勉強したかったこともあり、この機会に入門しました。
丁度良いタイミングで中学の頃からの先輩がGoでLIFFアプリを開発していたので、こちらで勉強させていただきました笑。

https://qiita.com/AsuyaKakegawa/items/2e8d27393f2955b32f6f

↑こちらの記事で作成したアプリをherokuにデプロイするところまでします。

## 作成したもの
↓LINEの友達追加から、デモがみれます。
![M_gainfriends_qr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/77b86edd-4cb3-810d-01cc-f4447865a076.png)
天気予報が雨であれば、毎朝6時に公式アカウントから通知が送られてきます。(写真はテスト実装なので、本来は6:00amになります。)
![LINE_capture_662059571.438251.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/8d22ee72-9755-2a1c-e71a-b63208889b6f.jpeg)


## アプリを作成する
Qiita記事を参考にしながら作成しました。作成したリポジトリがこちらです。

https://github.com/YukiOkamoto0206/yasatenki

実際にデプロイするので環境変数を追加してます。

```main.go
// localでは.envファイルを参照するためにこのコメントアウトしている範囲を使用します。
// err := godotenv.Load(".env")
// if err != nil {
//    log.Fatal(err) // .env読めなかった場合の処理
//}
bot, _ := linebot.New(
	os.Getenv("LINE_BOT_CHANNEL_SECRET"),
	os.Getenv("LINE_BOT_CHANNEL_TOKEN"),
)
```

## herokuで新しいプロジェクト作成
heroku create <アプリ名>で Heroku アプリケーションを作成します。

```
$ heroku create <アプリ名>
```

## 環境変数を追加
Settings > Config Varsから環境変数追加

## デプロイ
```
$ heroku git:remote -a <herokuに登録したアプリ名>
$ git push heroku main
$ heroku run ./bin/<herokuに登録したアプリ名>
```
実際に通知が確認できます。

## 毎朝6時に自動実行
### 初期設定
クレジットカードの登録が必要なので、Herokuにカード情報を追加します。
ヘッダーのユーザー > アイコンAccount Settings > Billing > Add Credit Cards

ちなみに住所の書き方は日本と逆順に書きます。

| 情報 | 説明 | 例 |
|:-----------:|:------------:|:------:|
| Address Line 1     | 番地と町名 | #1001 1-2 3-chome Liff Kita-ku|
| Address Line 2        | 部屋番号や建物名を分けてもいいですが、基本Line1に全て入力します      | |
| City     |  市または区      |Hiroshima|
| State/Province     |  都道府県      |Hiroshima|
| ZIP/Postal Code      |  郵便番号   |7123456|
| Country   | 国     | Japan|

### 実行
```
$ heroku addons:create scheduler
$ heroku addons:open scheduler
```
コマンド実行後、画面が切り替わるので、```./bin/<アプリ名>```を設定し完了です。
通知がきていると思います！:grin:

## さいごに
普段フロントエンド専門で開発しているので、Goに触れるのが今回が初めてでしたが、2022年はバックエンドを学習しWebアプリケーションの全体像を理解しているエンジニアになりたいです！
ドローンの開発の面白さと辛さ

# ACCESSとドローン

ドローンを仕事としてやり始めて3年が過ぎました。
始まりはエアロネクストとの業務提携

https://www.access-company.com/news_event/archives/20191009/

今ではまぁ少しは形になってこんな感じに

https://www.access-company.com/products/dx-iot/drone/

ということでドローンの開発の話でもまとめておこうかと思います。

# 技術分野

おそらく、多くのエンジニアはソフト、ハード分離した開発が多いと思いますがドローンの場合、かなり広範囲にやることが有りざっと上げるだけでも多くの分野の知識を使います。

## ハードウェア

* 強電（モーターやESC）
* 弱電（フライトコントローラー、コンパニオンコンピューター、無線）
* メカ（フレーム、外装）
* 空力（ボディ形状、プロペラ）

## ソフトウェア

* 組み込み（フライトコントローラー）
* UNIXアプリケーション（コンパニオンコンピューター）
* アプリケーション（GCS、クラウド）

全部わかる必要は無いけれども知っておいたほうが良いという、なかなか器用貧乏自分に合わせたかのようなスキルを要求されます。

# ドローンの開発って何をするのか

これは会社によってどこからどこまでやるかはまちまちだと思いますが、
現在のACCESS*エアロネクストのドローン開発は全工程社内でやっていてどんな感じかといえば
以下に上げると本当にいろいろやっていて、こなしてきたのが謎です。

* フレームの組み立て
* パーツ選定
* 回路設計
* 回路のケース設計
* 空力解析
* 簡易風洞での測定
* ワイヤーハーネスの作成
* 機体の組み上げ
* パラメーターチューニング
* ソフトウェア開発

言い訳だけすると、仕様書いて打ち合わせして見積もりとって稟議書いて発注する時間で
**一機体分**ならできちゃうんですよね…

## 使っているツールとか
回路 Kicad
3Dパーツ FreeCAD
空力解析 OpenCFD

## 面白さと辛さ

まぁなんといってもほとんどの事を自分たちでやっているので作り上げて飛んだときの嬉しさはソフトだけの開発よりあります。
反面、一機体分ということでやってしまっていてドキュメントがないとか図面がないとか、量産性が皆無だったりするところは結構本気で辛いです。
あと、回路を作れるならある程度はワイヤーハーネスでつなぎまくって作るのではなく基板上にスタックさせるなりで設計したほうが良かったなぁと思っています。

# まとめ
私のこの記事を反面教師としてうまく配線の製造を外部にお願いしたり、組み立てを外部にお願いしたりつつ、ドキュメント類を仕上げるようにすると幸せ度が上がるのではないかと思います。
最後の資格取得から十数年、おじさんでも頑張れば資格が取れました！

#筆者スペック
- 40代のおじさん
- 社会人になってからは、NW監視⇒NW設計構築＋運用とネットワークをメインにサーバを少々程度のインフラスキル（弱小
- プログラムは、はるか昔にCとPerlを独学で弄ってたくらい
- 20代前半に個人ニュースサイトをやっていたので情報収集は好き、ガジェット系の新しもの大好き
- 基本的に勉強は大嫌い！三度の飯より嫌い！（当たり前

#はじめに
会社から「AWS Certified Solutions Architect – Associate 認定（以下SAA）」を受けるよう指示が出て、合格するまでの道のりを書いたものです。

勉強大嫌いなおじさんでも合格する事が出来ました、という話なので、所謂キラキラ系の話でもないし、勉強までにこんだけやったぜー！って話でもないし、ためになる話でも無いですが、少しでも興味があれば読んでいただけると幸いです。

前半は試験へのアプローチとしては意味が無いので飛ばしても大丈夫です。やったことを知りたいだけであれば「再受験に向けてやったこと」からどうぞ。

#はじまり
2019年某日、会社から「AWS Certified Solutions Architect – Associate 認定（以下SAA）」を受けるよう指示が出る。

勉強大嫌いおじさんとしては、かなりのダメージである。

しかし、同タイミングでトレノケートさん主催のSAAトレーニングへ参加出来る事となる。個人学習が大嫌いなので、トレーニングという強制参加イベントでもないと勉強しないため、非常にラッキーである。

トレーニングは3日間。SAA受講に向けた知識詰め込みのため、スピードが速すぎてほとんど頭には入らず。結局自分で勉強するしかなくなった（知識0からであれで受かる人がいたら天才！）

トレーニング終了後、SAA受験に使えるバウチャーも付いてきた。MAX2年間まで延長できる夢のようなチケット。

講師の方からも、忘れないうちに受験した方がいいよ！と言われるが、生来の勉強嫌いが勉強するわけもなく、業務に追われ、様々な理由を付けてのらりくらりと逃げ回る日々・・・。

#それから1年9か月が経過・・・
2021年3月某日

逃げ回っていたSAA試験だが、いい加減受けないとバウチャーが失効してしまうので、いよいよ諦めてSAA試験登録を実施。

研修を受けた時に講師の方からは「まずは申込を。申し込んでしまえばやらざるをえない」と言われていた。確かにその通り！（しかし、日程変更が簡単に出来るため（後述）、あまり意味は無かった）

私は試験というものが大嫌いなうえ、対策本を読むのが超絶苦手である。スマホを弄るのは大好きなので、どうにか勉強やる気にならないか、とスマホベースで勉強できるものを探す。

とりあえず買ったもの
- 「[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/) 」

買ったは良いが、やはりやる気は起きず偶にポチポチ見る程度。


#買ったはいいけど
3月末試験前
・試験前に業務のトラブルやら何やらでやる気が全く無くなる。
・とりあえず1か月延期する。

4月試験2週間くらい前
・某ウマ娘に時間をとられて1日30分程度しか勉強出来ず。

4月試験1週間前
・やっと真面目に勉強始める。

4月試験当日
・試験時間より早めに家を出て、会場近くの喫茶店にてUdemyの総合演習回答＆解説をひたすら読んで詰め込みを試みる。

#初受験結果
672/1000 ※合格は720/1000

正直落ちるだろうなとは思ってたが、想像よりも点数取れていてビックリ。500ちょいくらいだと思っていた…。

その後色々と都合？が合わず相変わらず逃げ回っていたが、多方面からのプレッシャーにより2021/11/28 に受験を決意。


#再受験に向けてやったこと
<dl>
<dt>「[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/) 」</dt>
<dd>前回は基礎と問題慣れが足りていなかったので1.5倍速で流し見する。
細かいところはインプット出来ていないが、ザックリした情報と、何となく見た記憶を得る。</dd>
<dt>「[AWS認定ソリューションアーキテクト アソシエイト試験：短期突破講座（300問の演習問題）](https://www.udemy.com/course/aws-uoyc/)」</dt>
<dd>基礎がある程度出来たら後はひたすらコレ。SAA試験は問題文章が結構独特な言い回しなので、問題になれるためでもある。
一旦無回答で終了すると回答＆解説も出るため、ひたすら読んで質問と回答をセットで理解する。
・正解だけじゃなくそれ以外の解説もなるべく把握する。
・例えば、S3暗号化で不正解にAWS KMSがあったら、それが何をするサービスかも解説されているので覚える。
</dd>
結局まともにやったのは前日（6時間くらい）と当日（2時間くらい）

#試験結果は？・・・
試験内容は前回より難しかった気がする。

回答が怪しいものをカウントしていたが途中で20を超えたので、諦めて最後の見直しもせず完了した。（結果的にこれが良かったのかもしれないけど）

ギリギリ合格！

736/1000（720以上合格）（アブネー！

これで上司に締められることも無くなった。一安心。

#最後に
資格受験が数十年ぶりの勉強嫌いなおじさんでも何とかSAAに合格することが出来ました。
諦めずにやれば何とかなる！！

ただのポエムになってしまいましたが、誰かの何かの役に立つ事があれば幸いです。


#どうでも良い話
採用するか迷ったタイトル
「とあるおじさんの資格取得（スキルアップ）」
D-man bot アップデート計画 2021 文字認識編

## はじめに

2021年のD言語くん Updateによると、今年は441件と例年と比較して大きく減少したことが明らかになりました。

<blockquote class="twitter-tweet"><p lang="und" dir="ltr">2017: 2078<br>2018: 992<br>2019: 866<br>2020: 886<br>2021: 441</p>&mdash; simd (@simd_nyan) <a href="https://twitter.com/simd_nyan/status/1466415766727761934?ref_src=twsrc%5Etfw">December 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

IT系マスコット群雄割拠の昨今、D言語くんのプレゼンスが下がっていると言える…でしょうか？
すべてのD言語くん情報を補足すべく、今回はbotのアップデートを計画します。

## やりたいこと

例えば以下のツイートですが、明らかにD言語くんに関するツイートですが、ハッシュタグ`#DLangMan` がなければ現在のD-man botは捕捉できません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">32人しかいない Walter Bright さんにフォローされてるアカウントの最新3件がこれっておもしろすぎません? <a href="https://twitter.com/hashtag/DLangMan?src=hash&amp;ref_src=twsrc%5Etfw">#DLangMan</a> <a href="https://t.co/9zTGnIuEpz">pic.twitter.com/9zTGnIuEpz</a></p>&mdash; 大堀龍一 (Ryuichi OHORI) (@__DaLong) <a href="https://twitter.com/__DaLong/status/745545519158616073?ref_src=twsrc%5Etfw">June 22, 2016</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これをハッシュタグなしに捉えるために、今回は画像から文字認識を試みます。

## 文字認識

まず文字認識の方法ですが、[Tesseract OCR](https://github.com/tesseract-ocr/tesseract)が使えそうなのでインストールして使ってみます。

```
$ sudo apt install tesseract-ocr tesseract-ocr-jpn
$ tesseract --list-langs
List of available languages (3):
eng
jpn
osd
```

試しにローカルにダウンロードした上記の画像を認識してみます。

```
$ tesseract Cli1sWqVYAE2ZhW.jpg - -l jpn
Warning. Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 253


フォロー

@simd_nyan
#dland enthusiast, D-man evangelist

一
D-man bot                     人2
@d_man_bot
D-man bot is written in D Programming
Languade.

dlang comic strips

\ Q@DlangGuy
Someone had to do it.

揚   John D. Cook
1



《@JohnDCook
Mathematician, consultant, entrepreneur

テ GTNTechnicalStaffin
ロTN                         9
em   @⑥gotechnow
Dallas IT jobs and technical staffin
recruiting. Recruiter. Headhunter
```

期待通り、 `D-man` や `@d_man_bot` が認識できました。

## おわりに

このまま使えそうなので、あとはタイムラインに流れる画像をダウンロードして文字を認識し、D言語くんに関する文字列を含む画像の元ツイートをRTするよう実装するだけです。
次回botのアップデートをお楽しみに！
はじめて学ぶJava Remote Method Invocation(RMI)

# 前書き

技術名を聞いた時には、全くピンとこなかったのですが
調べてみたら面白かったです。

備忘がてら、概要と動向を纏めます。

# 概要

### この技術なに？

* Java Remote Method Invocation(RMI)とは、  
  異なるJVM上のインスタンス(RemoteObject)に設けたメソッドを呼び出す為の機能。
    * RepogitoryからRemoteObject取得後、普段どおりJavaコーディングする。
    * RESTのように「Httpリクエスト投げて...」等と通信を意識する必要は無い。
    * 実装例は[ひしだま](https://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/rmi.html)さんが詳しい。
* Java 1.1で導入。
* java.rmiパッケージ配下に、ServerやClientの関連classとinterfaceが有る。

### 興味深い点

* JVMコンテキストでメソッド呼び出せる。
    * 分散ガベージコレクション機構を備える。
        * RMIで呼び出すと、Server側JVMはClientに参照をリースする。
        * Clientが一定期間リース更新しなければ、Server側JVMはインスタンスをGC可能として扱う。
        * GCタイミングで、マーク済のRemoteObjectも破棄する。
* 通信プロトコルを選べる。
    * Java Remote Method Protocol(JRMP): Java専用。
        * SOAPと比べてXML処理がない分、オーバーヘッド低い。シリアライズのみ行うイメージ。
    * HTTP: 非推奨。
    * Internet Inter-ORB Protocol(IIOP): 標準外だが利点あり。
        * CORBA仕様の一部。Java SE 11で[JEP 320](https://openjdk.java.net/jeps/320)にて標準からは廃止された。
        * Java以外の、異なる言語のObject Request Brokerとも通信が可能。

# 動向

* RemoteObjectには状態が定義されていたがJava SE 15で[JEP 385](https://openjdk.java.net/jeps/385)にて廃止。
    * 以前は[Remote Object Activation](https://docs.oracle.com/en/java/javase/14/docs/specs/rmi/activation.html)で、active/inactive/lazyを切り替え可能だった。

* 数年前の情報によれば、Remote EJBではRMIを利用...だが、現状どうなのか？調べきれず。

# 参考リンク

* パッケージ概要:java.rmi

https://docs.oracle.com/javase/jp/8/docs/api/java/rmi/package-summary.html

* Java Remote Method Invocation(Java SE 8)

https://docs.oracle.com/javase/jp/8/docs/platform/rmi/spec/rmiTOC.html

* RMIと関連技術

https://www.ibm.com/docs/ja/was-nd/8.5.5?topic=rpc-rmi-iiop-using-jax

https://www.ibm.com/docs/ja/sdk-java-technology/8?topic=iiop-understanding-distributed-garbage-collection

https://atmarkit.itmedia.co.jp/fjava/rensai2/objetry02/objetry02.html

https://docs.oracle.com/cd/F25597_01/document/products/wls/docs81/rmi/index.html

https://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/rmi.html

https://www.ibm.com/docs/ja/was-nd/8.5.5?topic=rpc-rmi-iiop-using-jax

https://www.ibm.com/docs/ja/sdk-java-technology/8?topic=guide-rmi-iiop-rmi-iiop

https://www.samuraiz.co.jp/adobeproduct/jrun/docs/jr4/docs/html/Programmers_Guide/introejb2.html
[Unity]UmotionProの使い方ガイド

こんにちはMr_Kです。
チーム開発をしていてアニメーション担当がどうしても出てしまいますよね。
チームに専門の人が入ればいいですが、いないときにできるだけ楽して作りたい！
ということでアニメーションをできるだけ楽に作れるAssetsの紹介です！！

#Umotion とは
https://assetstore.unity.com/packages/tools/animation/umotion-pro-animation-editor-95991
↑このアセットです。
humanoid型のモデルをアニメーションさせるがとても楽になります。
Genericのモデルも使えますが、humanoid型のほうが楽なイメージです。

##早速使い方
インポートしたらエディタ画面を開きます。
![スクリーンショット (378).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/fc67151d-ddcb-e717-1343-fdaf5be884fd.png)
![スクリーンショット (383).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/9d53eca4-401d-b084-4288-a34243d53fe6.png)


Wndow＞UmotionEditor＞ClipEditor
Wndow＞UmotionEditor＞PoseEditor
まずこの2つを開きます。

ClipEditor から File>NewProject>Humanoid でProjectファイルを作ります。
![スクリーンショット (382).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/3b77f784-67c1-9a35-9b96-17a4e246c08d.png)


Unitychanを　PoseEditor＞Select a GameObject にドラッグ＆ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/366e27da-43ad-ffff-8e27-bbad6ffd74c7.png)

ここからアニメーションをいじることができますが、最初から最後目でモーションを作るのは面倒。
なので、アニメーションの基盤を持ってきます！
https://www.mixamo.com/
↑のサイトでいろんなアニメーション素材がダウンロードできます。
結構偏りはありますが、種類は多いのでお勧めです！

上記のサイトでFBX for Unity(fbx)を選択しダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/c77815f5-3d6a-491b-c938-258aaf1f29a1.png)

ダウンロードしたFBXをインポートしてAnimationTypeをHumanoidに変更！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/ecd84d6f-189b-21f9-eb2f-a7f6dfdc6bbc.png)

そしたら ClipEdior＞File＞ImportClip から入れたアニメーションクリップをセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/36ffdd8b-2d0d-2d08-a816-f19a2341d139.png)

![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/4a9c06c2-a3c8-c467-b89a-a6fa199c44d8.gif)

これで基盤のアニメーションが完成です！めっちゃ楽！！

####ここからカスタマイズ

とりあえずアニメーションを入れれたので思い通りの挙動に変えていきます。
まずはIKを作成します。

PoseEditor＞ConfigMode＞IK Setup Wizerdをクリック
そのまま　OK＞Create
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/4808b813-971a-5d6b-6611-f2408ef43435.png)

後は簡単
PoseEditor＞Animation＞AutoKeyをGenericにする。（キーの追加を保存する設定）
PoseEditor＞Display>FK or IK に設定（自分の動かしたいように設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/59060a81-4e36-137d-b230-e2704e3b7e3a.png)

ここからは自由にアニメーションをいじれます。
ほぼUnity標準のAnimationと同じです！
![ダウンロード (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1594638/25ed0e58-dec5-20e2-66d3-f314627ac6c0.gif)

基本的な使い方は以上です。
Humanoid型はIKなどでかなりいじりやすいので作業は楽になると思います！！

##まとめ
とても使いやすいツールだと思います！
使っていてそこまで難しいことをした覚えがないので、初心者がモーションを作るときにはとてもおすすめです！！！！
SQLで最新のレコードのみを取り出す方法

## 概要

事例として、購買情報のテーブルを用意しました。
1ユーザは複数の`購買ID`を持つことが可能です。

🔽入力となるテーブル(テーブル名 : `purchases`)🔽

| purchase_id | user_id | purchase_date | price | 
|:-:|:-:|:-:|:-:|
| 1  | A | 03/01 | ¥40,000 | 
| 2  | A | 01/01 | ¥35,000 | 
| 3  | B  | 01/01 | ¥20,000 | 
| 4  | A  | 02/01 | ¥5,000 | 
| 5  | B  | 04/01 | ¥10,000 | 
| 6  | C  | 02/01 | ¥20,000 | 

今回、各ユーザの最新の購買レコードのみ抽出したテーブルを作成したいとします。
🔽目標となるテーブル🔽

| purchase_id | user_id | purchase_date | price |
|:-:|:-:|:-:|:-:|
| 1  | A | 03/01 | ¥40,000 | 
| 5  | B  | 04/01 | ¥10,000 | 
| 6  | C  | 02/01 | ¥20,000 | 

最新レコードのみ抽出するために、「`GROUP BY`やを使え！」みたいな記事も多いのです。
しかし、GROUP BY対象になるカラム(`user_id`)や、ORDER BY対象になるカラム(`purchace_date`)**以外のカラム情報も取得したい**ときに、`GROUP BY`だとできません。😭

「では、どうやってやるのか？」について、忘備録として残します。

## 方法

**① グループ内で新しい/古いもの順の連番をつける**

`ROW_NUMBER() OVER(PARTITION BY {グループ化する列} ORDER BY {並びかえる列} ASC/DESC)`
とすることで、{並びかえる列}を昇順・降順に並び替え、グループごとに連番（順位）をふることが可能です。

具体例を見てみましょう。

```sql
select 
  *
 from (
   select
    *,
    row_number() over (PARTITION BY user_id ORDER BY purchase_date DESC) AS number
    FROM purchases
  )
```
を用いることによって、以下のテーブルになります。

| purchase_id | user_id | purchase_date | price | number |
|:-:|:-:|:-:|:-:|:-:|
| 1  | A | 03/01 | ¥40,000 | 1 |
| 2  | A | 01/01 | ¥35,000 | 3 | 
| 3  | B  | 01/01 | ¥20,000 | 2 |
| 4  | A  | 02/01 | ¥5,000 | 2 |
| 5  | B  | 04/01 | ¥10,000 | 1 |
| 6  | C  | 02/01 | ¥20,000 |  1 |

**② 値が1のものだけ取得する。**
次に`where number = 1`のものを取得すれば、最新のレコードのみになります！


## 結論

以下のコードでOK！

```sql

 select 
  *
 from (
   select
    *
    row_number() over (PARTITION BY user_id ORDER BY purchase_date DESC) AS num
    FROM purchases
  )
  where num = 1

```

もし違ういいやり方知っていれば、是非教えてください！

## 補足
順位づけの関数は`rank`と`row_number`の２つがあるが、`row_number`を推奨。
理由は、作成日が同一のレコードがあった際に、rankだと同じ数字が複数現れるから。
温度湿度モニタ　M5Stack＋UIFLOW＋Node-RED

使用機材
------
Raspberry Pi 3 Model B
M5Stack Basic
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)　mac　os　11.6

概要
-----
↓今回構築した内容
![Instagram post - 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/7b87c5bb-5c1b-44db-a181-d7d6c4429cfd.png)


↓過去記事からの我が家のスマートホームの現状
![Instagram post - 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/303d1681-605b-4911-a352-d57df7eda5c8.png)


M5Stack　UIFLOW
--------------------
今回M5Stackにビジュアルプラグラミングが可能なツールUIFLOWを使用しました。
M5Burnerをインストールし下記を参考にM5にUIFLOWをインストールしました。

参考

https://qiita.com/tatsuya1970/items/c0a2a317c9d10942cbcb

UIFLOW構成は下記のようにしています。

![Instagram post - 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/7769e0fe-0f97-b11d-7659-6ebb2fc5c236.png)

ローカル環境でnode−redのMQTTブローカーを立ち上げ、M5stackはMQTTで通信しています。
Node-REDには、温度と湿度のデータをJSONで毎分１回データを上げている設定にしています。

↓リビング用
![Instagram post - 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/64f5cd61-e4b3-26f3-de94-d3f38504787e.png)

↓寝室用
Atom　Liteに変更したいところですが、とりあえずMatrixで。
![Instagram post - 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/51092f9e-1c2d-e867-11da-74c845d217e2.png)

Node-RED　MQTT通信
---------------
Node-REDのMQTTの設定は下記となります。
温度と湿度のデータをDASHBOARD　により、チャート形式で保存しています。
リビングと寝室それぞれのデータがほしかったので、複数線のグラフで描画しています。
トピック名をつけて上げれば、重ねて表示が可能です。

参考

https://note.com/akaihoshi/n/nba4f0bdc90bc


↓フロー構成と設定
![Instagram post - 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/982ec282-2230-17c1-e688-5cd0a0e94e84.png)

最終webアプリのダッシュボードは下記のような構成にしています。

↓DASHBOARD　UI
![Instagram post - 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/5529ddf0-7e4e-3b8a-c24c-921c50c15898.png)












参考
------
https://qiita.com/NWLab/items/cb3f434705708c40755b
Ninjaで差分が認識されない現象と解消法

# はじめに
C++で書かれたライブラリのビルドで詰まったのでメモとして残す．

※ビルドシステム周りがよく分かってないので間違っているかも

# 発生した現象
ライブラリを落としてきて，初回ビルドするところまでは成功した．

その後，一部のファイルを `rsync` で転送してライブラリを部分的に更新した．ここで再度 `ninja build` を行うと `ninja: no work to do.`と表示された．

つまり，ファイルの差分が認識されずビルドされなかった．

# 原因
単純に，ファイルのタイムスタンプがずれていた．

タイムスタンプを見ると，ライブラリ全体よりも上書きしたファイルのほうが古くなっていた．これが原因で，ファイルの差分が検出されなくなったらしい．

# 対処法
今回の場合は以下のコマンドで対処した．

```bash
touch 編集したファイルのパス
```

`touch` は指定したファイルのタイムスタンプを更新するコマンド．今回の場合は，ファイルのタイムスタンプを現在の時刻に上書きする．

# 最後に
`rsync` の実行でタイムスタンプがずれたとみられるので，`rsync`のオプションを見直すことでも解決できると思う．
CLEAN CODEのための簡単なしくみ５つ！

1.Use a searchable name.

```php:test.php

$minutes = 3*60;
#何を意味するのか分かりにくい。
```
下記のコードをみてみよう。

```php:test2.php

$minsForOneHour= 60;
$hours=3;

$minutes=$hours*$minForOneHour; 

```
意味が分かりにくい数字がはいるより、それを変数にいれてわかりやすくする。



2.Function name should be verbs.

```php:test2.php
　#functionは同士で表現する。
　$date　#名詞のみだと意味が分かりにくい。
　$getData , $setData　#動詞にすると分かりやすい。
```

そして、Functionはひとつの動作のみ行うことが直感的でわかりやすい。

3.Functionの引き数は3つ以下が適当。
  　多い場合はObjectとで整理する。

4.Functionのパラメータにbooleanをいれて二つのアクションを具現するより、2つのFunctionに分けた方が分かりやすい。
　_2.Function name should be verbs._で説明したように、Functionはひとつの動作のみ行うことが直感的でわかりやすい。  
5. 変数名は省略しすぎないように。
  　省略しすぎてしまうと変数の用途が分かりづらく、コードのメンテナンス性が低下します。




※個人の勉強のメモのための記事でございます。
Blenderで転職した話の記録


##諸注意
ADVENTAR版『[Blender Advent Calendar 2021](https://adventar.org/calendars/6384)』のアドベントカレンダー向け記事となります。

この記事はBlenderを使えることをスキルの一つとして転職活動を行った人の記録です。
当方は就職・転職活動のスペシャリストではないので、行ったこと・得た情報が正しいとは限りません。
就職・転職活動で参考にしようと思っている方は自己責任でお願いします。

##まえがき
2021年12月下旬にとある企業から内定を頂き、転職活動を終えることができました。
1月から入社し、DCCツールはBlenderとなります。
これからも技術を磨くことをやめず、励んでまいります。
応援してくださいました皆様には感謝しております。
誠にありがとうございました。

##要約
####・Blenderでの転職は現状狭き門のように思う。
####・やってやれないことはない。
####・Blenderと他のDCCツールの違いを知っておくことがアピールになるかも。
####・映像分野であれば広く浅くできることもスキルになるかも。


この記事では主に上記に4点について触れていきたいと思います。
ひとまず当方の自己紹介からしていきます。


##自己紹介
<a href="https://twitter.com/McLion0"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966724/0767825c-e0e6-6c81-860f-fc29134c57c2.png" width="200"></a>
名前：マクライオン
年齢：30代
Blender歴：そろそろ8年（ただし、頻繁に何かを作っていたわけではない。）

使えるツール：
・Blender
・AfterEffects
・Premiere Pro
など

ちょっとだけ触ったことあるツール：
・Maya
・Cinema4D
・UE4
など

前職：機械の設計開発職。とはいえ、BlenderでCADからCGにしてチラシや広告動画も作ってました。
転職活動期間：2021年8月～12月下旬（本格的に動いたのは10月下旬から）

##転職の指針
①「映像向け3DCG」の製作を希望職務内容とする。
②可能ならBlenderを使用ツールしたいが、他ツールへの転向も良し。（転向の場合は企業への説明をする）
③勤務地は東京都・神奈川県

##Blenderの求人数
自分は転職サイトを五社くらい使い求人の検索を行っていきました。
検索ワードで「3DCG 映像 東京」で調べると数百～千くらいの求人が出てきます。（サイトにもよりますが）
しかし、「Blender 映像 東京」で調べてみると激減します。
こういう事情もあったので、上記『転職の指針』では他ツールの転向も良しにしました。
Blenderだけで勝負すると他の条件面でかなり選択肢が狭まると感じたのです。

とはいえ、Blenderを使っている企業さんはゼロではありません。
特に設立が新しめの企業さんや新規事業として始めた企業さんだとBlenderを使っているというところがそこそこある印象でした。

##面接の話
面接ではポートフォリオの質疑の機会が多々あったのですが、その中でツールの質問もありました。
自分のポートフォリオの中にはスカルプトを使った作品もあったのですが、企業の技術者の方にBlenderでスカルプトが使えることを知らない方もいらっしゃいました。
その時思ったのですが、企業の使用ツールと比較してBlenderだと何が可能になるかを明確化できると強いと感じました。（もちろん自分のスキルで出来るのであれば）

また、ある企業の面接担当者が言っていたのですが、映像向けCG希望者はモデルだけ作れて映像を作れる人が少ないとのことでした。
つまりモデリングから映像のコンポジットまでの全工程を経験している人があまりいないとのことです。
これが業界全体に言えたことなのかは分かりませんが、CG作れてAfterEffects・Premiere Proなどの動画ソフトまで広く使える人はそれ自体がスキルになるかもしれません。

##まとめ
ここまでをまとめると、

####・Blenderでの転職は現状狭き門のように思う。
⇒やはり業界のシェアはまだ低いのか、求人数は少ない。

####・やってやれないことはない。
⇒Blenderの求人がないことはない。数は少ないけど、ゼロではなかった。ベンチャー企業はBlenderでもいいとこがそこそこある印象。

####・Blenderと他のDCCツールの違いを知っておくことがアピールになるかも。
⇒Blenderで出来ることを知らない人は多い。自分のスキルに被ればアピールポイントになると思いました。

####・映像分野であれば広く浅くできることもスキルになるかも。
⇒あくまで一人の面接担当者から聞いた話ですが、映像を一通りの工程を経験している人はそれがスキルになりえるかも。

ということでした。

最初でも記載させて頂きましたが、ここまでのお話は自分が体験したことを基に書いております。
転職活動をされる方は周囲の方や転職エージェントの方に聞きつつ参考になる話があれば参考にしてください。
ここまでご覧いただき、誠にありがとうございました。

メリークリスマス。
よいお年をお迎えください。
kubernetes環境でのLoki recording rules storage設定ポイント

ドキュメント読んで普通にやっただけなのにやたら躓いたポイントが多かったのでメモ

# 環境

Loki: v2.4.1
Monolithic mode

この先修正・変更があるかと思いますのでバージョンを確認してください

# ドキュメント

https://grafana.com/docs/loki/latest/configuration/#ruler_config

# 出てくるもの

```yaml:config.yaml（の一部）
    ruler:
      ring: # 今回ここはスルー
        kvstore:
          store: inmemory
      storage:
        type: local
        local:
          directory: /etc/loki/rules
      rule_path: /data/rules/rule
      wal:
        dir: /data/rules/wal
      remote_write: # 今回ここはスルー
        enabled: true
        client:
          url: 'prometheusのremote writeエンドポイント'
```

躓きポイントは3種類のローカルなストレージ

- storage
    - ruleの設定ファイルを置くストレージを設定する場所
    - 今回はconfigMapをマウントするので、`local`を使用
- rule_path
    - storageからrule設定ファイルをコピーして置いておく場所
    - 最初storageとの違いがわからなかったけど、storageはs3などのサービスも使えるので、そういう場合は一時的にローカルに保存する流れが必要っぽい（想像）
- wal
    - walとはWrite Ahead Logのこと
    - https://grafana.com/docs/loki/latest/design-documents/2020-09-write-ahead-log/
    - ここではとりあえずローカルにデータを書き込むということがわかっていればヨシ

# storage

ここはconfigMapをマウントするんですが、
__subPathを使うとなぜか読んでくれない__
ので使わずにディレクトリごとでマウントするようにしましょう

理由までは追えてません（なにかわかったら追記したい）

# rule_path

ここはstorageからファイルをコピーするので、書き込みが発生します
コンテナのボリュームは読み込み専用でエラーになるので、書き込み可能なボリュームをマウントしてそこのpathを指定しましょう

# wal
ここも書き込みが発生するので、書き込み可能なボリュームをマウントしてそこのpathを指定しましょう
デフォルト値の`ruler-wal`はどこに対しての相対pathになるのか把握してませんが、基本的な構成だとおそらく読み込み専用ボリュームになると思いますので、実質設定必須になります
また、__公式ドキュメントではwalの記述箇所は`remote_write`の下になってますが、これは何かの間違いで、`ruler`の下でないと動作しません__
（何かしら修正があるはずですが、2021/12/24 v2.4.1の時点でどっちが本来の正しいものなのかわからないのでアップデートを待ちます）
ちなみにその下のwal_cleanerも`ruler`の下が正しいです

https://github.com/grafana/loki/blob/v2.4.1/pkg/ruler/config.go#L17-L25

# :grinning: 
ストレージに関してはこのあたりを押さえておけばとりあえず変に躓くことはないのではないかなと思います
pythonのmultiprocessing.Queueのempty()メソッドは危険

表題の通り危険なので利用を避けるべきです．
これは公式でも言及されている内容です．

代わりに以下のように判定します．

```
if queue.qsize() == 0:
    # 理想的には queue.empty() と同じ結果
    # 実際には様々な問題からそうとは限らない
    # 処理
```

参考：[Why queue is not multiprocessing safe?](https://stackoverflow.com/questions/28685823/why-queue-is-not-multiprocesing-safe)
session_regenerate_idをすべき理由

今日ならった2つのセッション攻撃

①セッションID固定化攻撃
②セッションハイジャック　

を理由にセッションIDをログイン人確認直後に再生成することが望ましい。
（ログイン前にセッションIDの固定化攻撃されて取られたセッションIDをログインすることで無効にする。
　ログイン後の方が重要な情報を持つことになるという前提）


↓参照

https://teratail.com/questions/66426



①セッションID固定化攻撃は
　
　不正なURL（ブラウザ側で発行したセッションIDも使用可能にする機能を悪用）からログインすることで、なりすましになる。

②セッションハイジャックは

セッションIDを盗みだしたり（ネットワーク盗聴などで）、推測でセッションIDをとられること。

PHPではページ移動間などで定期的なセッションID再発行をこころかけましょう。

※個人の勉強のメモのための記事でございます。
PUB400で遊んでみました（本当に遊んでいます）

一年ぶりくらいにPUB400に接続しました。

先回は接続だけして満足していました。

IBM i を好きなだけ触り倒せる場所が別にありましたので、
わざわざここで何かする必要を感じませんでした。

今回はちょっと探検してみることにしました。

```console
EDTLIBL
```
ライブラリリストが表示されます。
ライブラリリストとはWindowsでいうPATH環境変数のようなものです。

何やら楽しそうなライブラリがあるではありませんか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/ea3b7156-2bec-278b-e6d6-f405bb8b41b5.png)
ライブラリの中身を見てみます。

```console
WRKOBJPDM LIB(GAMES400)
```
STRPDM の２番（2. Work with objects）でもＯＫ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/cd42603e-8b1c-e183-cf5b-54e839799ea8.png)
オセロ、スロットといった全く普段のIBM iでは見ることのない名前の*PGMが現れます。

*PGMですのでCALL（実行）できます。
できますが、IBM i 内で見つけただけの内容が分からない*PGMは気軽にCALLしない方が身のためです。

直接CALLされることを想定していないプログラム、もしくは
上流のプログラムで判断を行った後に実行されるべき、データを更新、削除するプログラムかも知れません。

こういう時は*MENUや*CMD、いかにもトップCLPっぽい名前のCLPを探します。

*MENUや*CMDは直接呼び出されるように作ってあることが多いです。
（実行して絶対に死なないとは言っていません。）

特に見つかりませんでしたので、えいっと*PGMをCALLしてみることにしました。

PUB400はSYSVAL（システム値）の表示だけをするコマンドですら権限で使えなくしてある等、
〇〇〇の＊＊＊とは違いかなりその辺りがしっかり設定されています。

探検隊員はSYSVALを変更するコマンドや電源を落とすコマンドを当然試しますが、実行できなくしてありました。

それ程厳しく設定されているので（←当たり前？）実行されて困るようなプログラムは置いていないでしょう。
そして下手なことは起きないでしょう。きっと。えいっ。

ライブラリリストに入っていますので、*PGMの名前だけでCALLできます。

```console
CALL SLOTPGM
```
CUIを駆使したグラフィカルな画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/4de22d2c-0bd2-6dcb-b7d5-2e89a7ac6b01.png)
掛け金を１～３で聞かれていますので、男は黙ってMax Betの３を入力して、実行キーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/3aa7ef85-8e65-cfc5-4ba5-f4a392eea5ab.png)
揃わなかったみたいです。クレジットが３減ってしまいました。

F3で終了して、今度はテトリスを実行します。

```console
CALL TETRISR
```
このブロックはとても扱いに困ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/14b364ba-2776-6732-3e8b-0d54ca8dc17f.png)
テトリスは終了時に挨拶をしてくれます。とても礼儀正しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/7802aae7-bd49-3f0c-ff75-7bab5c4ebd43.png)
以上、PUB400運営側の手の平の上で遊んでみました。またQINTERでぶら下がっている他の人のジョブを終了するプロンプトまで出しましたが、実行はしませんでした。
驚異のFANZA女優検索（ひとり） Advent Calendar 2021のまとめ

この記事は [驚異のFANZA女優検索](https://fanza-actress-bust-search.azurewebsites.net/) Advent Calendar 2021 の 25日目の記事です。

#驚異のFANZA女優検索（ひとり） Advent Calendar 2021
というわけで25日間驚異のFANZA女優検索についてひたすら書き続けた。長かった。そして辛かった。。正直思いついてから実行に移して今日までまさか1日も落とさずにゴールまで迎えられるとは1mmも思っていなかった。最初から落とすかもという保険を書いておいて、実際落とす気満々だった。それがなんとか1日も休むことも遅れることもなく25日間書き続けられることが出来た。これもひとえに自分が頑張ったからだ。

#最初の記事公開後、ひたすら機能を作っていた
8月に[驚異のFANZA女優検索](https://fanza-actress-bust-search.azurewebsites.net)を公開して[【個人開発】DMM.comの女優APIを使って約5万人の女優を検索できる驚異のサービスを作った](https://qiita.com/fabsabsfabsabs/items/e8e3b717dc311ac2176d)を書いた。その後、新機能として[メガネをかけた女優](https://fanza-actress-bust-search.azurewebsites.net/glasses)、[似た顔のFANZA女優検索](https://fanza-actress-bust-search.azurewebsites.net/nearface)、[Twitterをやっている女優](https://fanza-actress-bust-search.azurewebsites.net/twitter)、[Instagramをやっている女優](https://fanza-actress-bust-search.azurewebsites.net/instagram)を思いついて作っていた。TwitterとInstagramは比較的簡単だったが、顔検索は結構時間がかかりそうで、その時に、どうせならバラバラよりまとめて公開した方がインパクトがあるかなと思った。

#内容をAdvent Calendarを書くのも良いかもなと思った
顔検索の実装が大体2か月ぐらいかかるかなと思った時に、ふと11月ぐらいになるなら、完成したらAdvent Calendar に書くのに丁度いいかもなと思った。その時はC#や個人開発などに単発で幾つか乗せるだけのつもりだった。その時作ろうとしたものが5つあって、特に苦労していた顔検索はそれだけで3つぐらい書けそうだなと思った。そこで実装しながら折を見て文章アウトプットを少しずつしていった。そして11月の時点で、下書きレベルのものを含めれば10個ぐらいはカレンダーに書けそうだと思った。

#一人で25日書けないか考え出した
この時に、サイトの内容についても詳しくまとめていけば、さらに10個ぐらいネタがありそうだと思った。だったら合計で20個近いし、一人カレンダーに挑戦してみたら面白いし、インパクトも大きいんじゃないかなと思いだした。そもそも他のカレンダーには書きづらい内容も多いし丁度いいかもしれないと。そこで11月にAdvent Calendarを作ることが出来るようになった段階で[驚異のFANZA女優検索（ひとり） Advent Calendar 2021](https://qiita.com/advent-calendar/2021/fanza-actress-bust-search) を作ってみた。


#12/1の時点で10個は下書きがあった
で実際に12/1の1個目を公開した時点でストックは10個だった。8日目まではサービスの更新作業とデプロイも必要だったので、並行しながらやった。若干のトラブルもあったので結構慌ただしかった。12/10の時点でストックは3個に減っていた。最初はQiita以外に書くのもありかなと思っていたけれど、大分書くのに慣れてきたのもあって結局使い続けた。本当に辛かったのは、12/19からでその時点でストックはもうなかった上に土日も終わってしまっていた。そこからは毎日前日から0時までに文章を書きあげていた。この週は本当にきつくて毎日今日はもう落とすかもなと思っていた。漫画家みたいだ。ただ文章の量にも拘らなくしたのでなんとか今日まで書き続けられた。

#LGTMを（初日以外）あまり意識しなかったのが結果的には良かったかも
1日目の[メガネをかけたFANZA女優をピックアップした](https://qiita.com/fabsabsfabsabs/items/679d0e2e21af28ca9691)は正直ちょっとバズらないかなーと思ってそれなりにしっかり書いた。自分的には思ったよりはLGTMが少なくて残念だった。もちろんこれは受け手側の判断なので、単純に自分の文章の内容が満たなかっただけだ。逆にここで吹っ切れて2日目以降はLGTMを意識しなくなったので、つかないからといって書く気力が削がれなかったのは結果的には良かったかもしれない。ただ[SEO&OGP対応](https://qiita.com/fabsabsfabsabs/items/098edb55e66213b55a81)の最後の疑問に誰かコメントつけてくれないかなと密かに思っていたので、そこに返信がなかったことが実は一番残念だったかも。


#得られたモノとか
構想3か月、制作25日かけて自分のサイトを文章を書いたことは自分にとっても得られたものが多い。自分でサービスを見直す際の資料的価値も高いし、文章で説明したい時に見てもらえる場所があるのは大きい。特に書くまでぼんやりとしかまとまっていなかったこともまとまったし、何より気づいていなかったことに気づけたこともある。特に自分的には昨日24日の[アダルトサイト開発はカーテンの向こう側](https://qiita.com/fabsabsfabsabs/items/26ae584f0bad2a3f0db6)は、書いたことで初めて気づけた内容だ。改めて現在の位置づけを正しく知れたのは大事なことだと思う。

#今後
さて、今後だが、サービス自体が自動で更新する仕組みが出来ているので、しばらく最低限のメンテだけして放置でも良いかもと思っている。今あるもので完成といっても特に問題はないと思っているので、自動更新だけで伸びていくのかちょっと楽しみではある。あ、ただ、[似たプロフィールのFANZA女優を検索出来るようにした](https://qiita.com/fabsabsfabsabs/items/a649a8ab53209fe62b1f)の最後に追記したキャッシュだけは作っておきたいかな。これで元々やりたかった女優ページの最後に似た女優一覧を出すことが出来そうなので。それが終わったら、全く新しい別の構想があるので、それをやろうかなと思う。それではメリークリスマス。
🌺にすいちのぉどをどっかぁでたてまぁす🌺うふふ💞

こんにちはぁ！　みんなの　のぉど　あいどる！　🌺ぱそ美ちゃん🌺　っでぇ〜〜〜〜っっっす🌺☆（ゝω・）vｷｬﾋﾟ
-
きょうはぁ？　にすいちの　のぉどを？たててみるよっっ

にすいちの のぉどっていえばぁ？
じゃば（っていうのかな？）とぉ
どっかぁの やりかたがあるけどぉ

はぁい　みてみてっ　これぇ　５にちめの きじ なんだけどぉ

https://qiita.com/nizveyl/items/80498fef93f2523f174f

　
こっちがその GitHub のぺぇじだよ

https://github.com/44uk/nem-docker

いままでも どっかぁでぇ　にすいちののぉど　たてるほうほうあったけどぉ？
この！だい３のほうほうねっ
あたしはっ！　こんかいはぁ！ このほうほうで　のぉど たててみまーっすっっっ🌺
-
🌻🌻🌻どんどんっ！🌻ぱふぱふぱふぱふぱふぱふぱふぱ🌻🌻🌻
#🌺はっじめっるよん🌺

えとねっ？どっかぁとぉ　どっかぁこんぽぅずが　ひつようねっ！
ここではぁ〜あ🌸しょうりゃくするよっ　てへぺろ💓

git の いんすとぉる🌺
-

    sudo apt-get install git
　
いんすとぉるしたら

    git --version
で　ばぁじょんのかくにん
　

それとぉ　git の せってい

    git config --global user.name $USER
とぉ

    git config --global user.email $USER
これで git の じゅんびは おっけー
　
どっかぁいめぇじのだうんろぉど🌺
-
git の じゅんびが できたので どっかぁのいめぇじを だうんろぉどするよ

    git clone https://github.com/44uk/nem-docker.git
　
つぎはぁ　こんふぃぐふぁいるを　つくるよっ🌺
-
せっていふぁいるを　つくりまぁす

    vi nem-docker/config/nis-client/config-user.properties
「i」をおしてから　にゅうりょりょくしてねっ

なかみは　こうだよっ

    nis.bootName = のぉどのなまえ
    nis.bootKey = もってたらいれてね　なかったらこのぎょうはなしでね
    nis.unlockedLimit = さいだいいにんしゃすう
    nem.host = あいぴぃあどれすかどめいん
「esc」をおして　「:wq」っていれてから　「enter」でほぞんしてね
　

きどうするよっ🌺
-

「nem-docker」でぃれくとり に いどうしてね

    cd nem-docker
　
きどうこまんど　はこうだよっ

    docker-compose up -d
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246298/320b6498-0b0c-a8f6-3c0b-0c3bb515d662.png)
　🌺🌺🌺これで　にすいちの のぉどがたちました！　ぱちぱちぱちっっっ🌺🌺🌺
-
　

#🌺うごいてるのかな？って　かくにんのほうほう🌺

ぶろっくだか の かくにんは　こうでぇす

    curl localhost:7890/node/info|jq
　
せっていした　なまえとかの かくにんは　こうねっ

    curl localhost:7890/chain/height|jq
　
とめたいときは

    docker-compose down
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246298/1cac88db-5bcc-7de7-a5f2-b5d0f1a55dfa.png)
これでとまるの
🌻🌻🌻どぉう？🌺かんたんでしょっっ？🌻🌻🌻
-
---
#⏰どうきじかんを　はやくしたいときの　ほうほう⏰
のぉどを とめます

    docker-compose down
　
ゆぅざぁが どうきでぇたのある でぃれくろりを sudo なしで いじれるようにするよ

    sudo chown -R 1000 data
　
どぉきの でぇたのある でぃれくろりに いどうしましょ

    cd data/nis-client/nis/data
　
ここに いま ある どぉきでぇた を すててぇ　ぽいっ🌻

    rm -f nis5_mainnet.mv.db
　
あたらしい どぉきでぇたを だうんろぉどするの

    wget https://bob.nem.ninja/nis5_mainnet-latest.h2.db.gz
ちょっとぉ　じかんがかかるけど　しんぼーしてね💕

だうんろぉどが おわったら
かいとーしますっ

    gzip -d nis5_mainnet-latest.h2.db.gz
　
かいとーするとね？　こんなふぁいるができまぁす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246298/1aa514ca-6425-ece9-acc0-4f20f2dd267a.png)

かいとーした ふぁいるはぁ このなまえじゃ つかえないからぁ　なまえをかえます　うふふ🌺

    mv nis5_mainnet-latest.h2.db nis5_mainnet.h2.db
※こめ※　もしぃ🌺かいとぉした　ふぁいるめいがぁ　```nis5_mainnet-3_852_955.mv.db.gz```
とかだったらぁ
```nis5_mainnet.mv.db```にふぁいるめいをかえてねっ

はぁい　じゅんんび　かんりょうっっっ
　

そしたらねっ 「nem-docker」の でぃれくろりに もどってぇ

    cd ../../..
　
🌺のぉど　すたあぁ〜とっ！🌺

    docker-compose up -d
どぉきふぁいる の せんとうまで どうきしないとぉ　のぉどのなまえとかがみえなくなるけど？
それがおわったら　みえるようになるよっ

🎄🎄🎄おわりっ！💕えへへっ🎄🎄🎄
-
🌺🌺🌺おあいてはっ！🌼きょにゅ〜のぉど💕　ぱそ美ちゃん（♀）でしたっっっ🌺🌺🌺☆（ゝω・）vｷｬﾋﾟ
-
🌺🎄めりくりっ🎄🌺
クライム toioでクリスマスツリーを演出してみた

<b>きっかけ</b>
toioでなにかしたいなと思ったらtoio Advent Calendar 2021が募集していた。
が空いているのが25日、責任重大（笑）
で、冷蔵庫にクリスマスツリーをtoioで表現することにしました。

<b>画像・動画</b>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">クライムtoioでクリスマスツリー<a href="https://twitter.com/hashtag/toio?src=hash&amp;ref_src=twsrc%5Etfw">#toio</a> <a href="https://t.co/JIZ7cjSZGe">pic.twitter.com/JIZ7cjSZGe</a></p>&mdash; ならなび (@naranavi) <a href="https://twitter.com/naranavi/status/1474393787648872448?ref_src=twsrc%5Etfw">December 24, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">クライムtoio実験。<br><br>toio Advent Calendar 2021なんとかなりそうな予感(^◇^;)<a href="https://t.co/bw8vfzMTUA">https://t.co/bw8vfzMTUA</a><a href="https://twitter.com/hashtag/toio?src=hash&amp;ref_src=twsrc%5Etfw">#toio</a> <a href="https://t.co/2Xcfa0IGZN">pic.twitter.com/2Xcfa0IGZN</a></p>&mdash; ならなび (@naranavi) <a href="https://twitter.com/naranavi/status/1473868131022295043?ref_src=twsrc%5Etfw">December 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



<b>仕掛け</b>
toioの底に薄い強力磁石を貼り付けて冷蔵庫の垂直面を移動できるようにしました。
ちなみに磁石の厚みは1.7mmでした。
緑色の毛糸を引きずってクリスマスツリーにします。
もう一台のtoioで星を飾り付けます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">toioクライムの仕掛け<br>磁石を貼っただけ(笑)<a href="https://twitter.com/hashtag/toio?src=hash&amp;ref_src=twsrc%5Etfw">#toio</a> <a href="https://t.co/3pFs1XGXhC">pic.twitter.com/3pFs1XGXhC</a></p>&mdash; ならなび (@naranavi) <a href="https://twitter.com/naranavi/status/1474239682729095171?ref_src=twsrc%5Etfw">December 24, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<b>プログラム</b>
移動座標をリストにベタ打ちしました。
https://drive.google.com/file/d/1F7TnBRpVB15jea583Dhd1S4L0kNbFKEM/view?usp=sharing
https://drive.google.com/file/d/1Wpxi5KLpOnoEHl67VI99S8erGL62Qt1l/view?usp=sharing
php-mysql-engineをCSVデータの集計に使ってみる

この記事は ラクス Advent Calendar 2021 24日目の記事です。

## `php-mysql-engine`とは
`php-mysql-engine`は、[Psalm](https://psalm.dev/)でも知られるVimeo社が公開したライブラリで、PDOを使ったMySQLの操作をデータベースサーバに接続することなくエミュレートしてくれるというものです。

これを使えばDBを含めた自動テストを手軽に実行できるということで、Vimeo社はもちろん、日本だとpixivの一部サービスでも利用しているそうです。

https://inside.pixiv.blog/2021/02/18/123000

PHPerKaigi 2021のLTでも紹介されていましたね。

https://speakerdeck.com/o0h/phperkaigi2021-lightning-talk

## ところで
話は変わりますが、ログなどの集計にSQLを使いたいことが稀によくありませんか？私はあります。
数ヶ月に一回しか使わないawkよりも、普段よく使うSQLでデータ集計したいところです。

ということで、`php-mysql-engine`を使ってCSVデータを集計できるツール、`csv-query`を作成しました！

https://github.com/takaram/csv-query

記事公開時点 (2021/12/24) ではまだ正常系が最低限動くというレベルですが、一応上記のようなログ集計にも使えるかと思います。

## `csv-query`
### インストール
上記リポジトリをcloneし、`composer install --no-dev`します。
`bin/`ディレクトリの中に`csv-query`コマンドがあります。

### 使い方
`csv-query`は標準入力のデータを`stdin`という名前のテーブルに格納します。コマンドの第一引数にSQLを指定します。
デフォルトでは一行目をヘッダ行とみなし、その内容をカラム名に利用します。

```console
$ cat data.csv
id,name
1,John
2,Alice
3,Dave
4,Bob
$ cat data.csv | csv-query 'SELECT * FROM stdin WHERE id < 4 ORDER BY name'
id,name
2,Alice
3,Dave
1,John
```

オプションによってヘッダ行を無効にしたり、タブ区切りのようなファイルを読み込むことも可能です。詳細は[README](https://github.com/takaram/csv-query#readme)に譲ります。

### システム要件
`PHP>=8.0`, `PDO_mysql`が必要です

## 所感
### `php-mysql-engine`について
- 実際のPDOとは細かい差異がある
    - 先述のpixivさんのブログでもあるように、普通のPDOを使っていれば問題ない場面でも`php-mysql-engine`の制限（またはバグ？）によって動かない場面がありました。
        - CREATE TABLE文に`COLLATE`か`CHARACTER SET`が必要
        - DSNの`mysql:hostname=localhost;dbname=csv_query;`の末尾セミコロンを取るとエラーになる
- まだサポートされていないメソッドもある
    - `PDOStatement::getColumnMeta()`を利用しようとしたところ、未サポートのようで`PDO object is uninitialized`というFatal Errorが発生しました。

### CLIツールの作成
- READMEを先に書くとやりやすい
    - 個人開発ということで、設計書を書いたりはしていませんが、READMEにある程度仕様をまとめたおかげで確認しながら開発を進められました。

## まとめ
通常テスト用ツールとして用いられる`php-mysql-engine`の少し変わった使い方を紹介しました。
SQLの文法は基本的にMySQL準拠なので、普段MySQLで開発している方には特に使いやすいのではないでしょうか。

ちなみに[弊社](https://career-recruit.rakus.co.jp/)が業務で使っているのはPostgreSQLなので、私自身文法など若干馴染めていません。
（誰か`php-pgsql-engine`作ってくれないかな……）
セル・オートマトンで「脳」をシンプルに実装してみよう。その5 -ヘブ則の導入-

前回の[その4](https://qiita.com/yuky_az/items/9fd73452f8283262e54a)までは、ニューロンの入力にかける「重み」は固定されたままでした。
これに、シンプルな学習則である「ヘブ則」を導入し、ネットワークに与える影響を見ていきます。

以下の通りに何回かに分けて解説しますが、今回はその5になります。
[その1 -セル・オートマトンとは？-](https://qiita.com/yuky_az/items/17fff285101ea365982b)
[その2 -セルの並べ方-](https://qiita.com/yuky_az/items/c134fafb9311b9c15651)
[その3 -ニューロンの配置-](https://qiita.com/yuky_az/items/cc5272d1c18270c5f7b2)
[その4 -恒常性と馴化-](https://qiita.com/yuky_az/items/9fd73452f8283262e54a)
[その5 -ヘブ則の導入-](https://qiita.com/yuky_az/items/065b764f59e2720214c2)

## ネットワークにヘブ則を導入
ヘブ則は、以下のようなシナプスの変化で表されます。
①シナプス前細胞が発火
②それによりシナプス後細胞が発火
③シナプスが増強される

シナプスの強度はニューロンの「重み」に相当します。
今回のネットワークには、以下の式に基づきヘブ則を導入します。

***重みの変化量 = 学習係数 × 入力(0 or 1) × 出力(0 or 1)***

今回のニューロンは入力、出力ともに0か1なので、両者ともに1のときのみ重みは変化することになります。
これはシナプス前細胞の発火によるシナプス後細胞の発火に対応します。
学習係数は0.01や0.001などの小さな数で、学習の速さを決定する固定された値です。

以下の動画は、このようなヘブ則を導入した結果です。
ヘブ側なしの場合と有りの場合を比較しています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/hvzJ0poSh3I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
コード: https://github.com/yukinaga/brain_ai_book/blob/master/neural_network_on_torus_4.ipynb

学習係数は0.001、投射ニューロンの割合は25%、抑制性ニューロンの割合は20%に設定しました。
ヘブ側の導入前は同じパターンが再び現れることはありませんでしたが、今回は十分時間が経過すると似たパターンが周期的に出現するようになりました。
ヘブ則によって情報が流れる経路が強化されることで、ネットワークがある種の学習を行なっていると考えることもできます。

## 「感情」と「記憶」
脳の特に海馬や扁桃体は、記憶は感情を密接に結びつけます。
ポジティブな感情、ネガティブな感情を強く感じた時、記憶は長く残りやすい傾向があります。
今回のネットワークに、「感情」を加えてみたらどうなるのでしょうか。
感情を感じた際にのみヘブ則を適用すれば、感情を得るに至った因果を選択的に記憶として残しておくことも可能になるでしょう。
ネットワークの内部か生じた、もしくは外部から与えられた「感情のようなもの」を使って必要な情報の流れを選択的に残す、そのような自律性を備えることができれば、「意識」のようなものに近づいていけるのかもしれません。

Advent Calendarの一連の投稿「セル・オートマトンで「脳」をシンプルに実装してみよう」は以上で終了です。
さらに詳しく知りたい方は、拙著「あたらしい脳科学と人工知能の教科書」をぜひ読んでみてください。
本記事の内容は、この本をベースにしています。
それでは、よいクリスマスを。

【コミュニティ「自由研究室 AIRS-Lab」】
「AI」をテーマに交流し、創造するコミュニティ「自由研究室 AIRS-Lab」が活動中です。
​https://www.airs-lab.jp/​
terraformでclusterからk8sのリソースを作ってみてmanifestの棲み分けについて考えてみる

# はじめに
k8sでIacをやる場合は**GCPとかAWSの世界はterraformでk8sの世界はmanifestで設定する**パターンでそれぞれの設定ファイルを書いてる人は多いんじゃ無いかなと思います。

k8s固有のリソースといいつつ`Ingress`や`Service(type:LoadBalancer)`などはPaaS側にロードバランサーのリソースが生成されたり、GCPの[NEGなんかはk8sの設定にリソースの設定が依存する](https://cloud.google.com/kubernetes-engine/docs/how-to/standalone-neg)ということがあります。

上記のような場合、**どこら辺で双方の棲み分けを区切るのが良いのか**考えてみることとしました。

**注意:この記事では結論が出ません**

# とりあえず書いてみる
とりあえず下記のように書いてみました。

k8s.tf
https://gist.github.com/junpayment/825b1cc35608036eaa37b3bf9c0e65ef

vars.tfvars
https://gist.github.com/junpayment/3cd661d75bbdb7439e4820ebe0d9f26e

オペレーションはこう

```sh
terraform init
terraform apply -var-file=vars.tfvars
```

# 感想s

## terraformのk8sの構造はk8s manifest yamlの構造と大体同じ
`Deployment`の構造を比較してみると構造はほぼ同じです。各パラメタの名前だけ`lowerCamel -> snake_case`になってますね。

terraformで記述していくとk8s側のmanifestでのオペレーションを忘れそうな気がしてたんですが、変に抽象化してるわけじゃなかったんで大丈夫そうですね。

k8s
https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/

terraform
https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/deployment_v1

## context名が事前にわからない
ローカルで作業してるので`gcloud container get-credentials`をした後に`terraform apply`をすることになるんですが、その時まで`config_context`の文字列が決まらない問題があります。

```terraform
provider "kubernetes" {
  config_path    = "~/.kube/config"
  config_context = var.config_context
}
```

context名は例えば`gke_project-name_us-central1-a_cluster-name`のようにプラットフォーム名やゾーン名である程度予測はできるとは思いますが。

## PaaSのリソースとk8sのリソースの依存関係について

`depends_on`で依存関係->ビルド順番を定義できるのはマニフェストを分けてたら出来ないのでこれは良いです。
k8s側のリソースの依存関係ルートは`namespace`と決めておくのが良さそうです。

```terraform
resource "kubernetes_namespace" "test" {
  depends_on = [
    google_container_cluster.test,
    google_container_node_pool.test
  ]
  metadata {
    name = "test"
  }
}
```

## リポジトリの責務の分解
PaaSリソースとk8sリソースの設定について書いてきましたが、アプリケーションのリポジトリはどこまでを責務にするのかも考える必要がありますよね。
例えばwebアプリケーションであれば`Dockerfile`でExposeするポート番号やCDは何をトリガーにするのかとか。

今回は[nginxdemos/hello:plain-text](https://hub.docker.com/r/nginxdemos/hello/)というコンテナイメージを使ったんですがどのポートでListenしてるかは`Dockerfile`というかアプリケーションに依存してます。

```terraform
          image = "nginxdemos/hello:plain-text"
```

```terraform
resource "kubernetes_service" "test" {
  metadata {
    name = "test"
    namespace = kubernetes_namespace.test.metadata[0].name
  }
  spec {
    selector = {
      app = kubernetes_deployment.test.spec[0].template[0].metadata[0].labels.app
    }
    session_affinity = "ClientIP"
    port {
      port = 80
      target_port = 80
    }
    type = "LoadBalancer"
  }
}
```

関心の分離を図りたいならお互いのリポジトリを意識したく無いですよね。

## k8sのapi versionに追随したいぞ
k8s apiのバージョンアップに伴い、k8s manifestも構造変化が発生するので、`kubectl apply`をする場合でも都度構造をメンテナンスする必要があります。

terraform側で構造を抽象化してる訳でも無いっぽいので、全部terraformにしてもメンテナンスコストも同時に解決できるって訳でも無さそうですね。


# まとめ
terraformで全部書く=k8s manifestをterraformで書くこと自体はterraformのstateや依存関係とかのエコシステムを利用できるようになるので、メリットがありそうです。

どこで各リポジトリの責務を分けて行くのかはチームの責務やCI/CD戦略に合わせて考えてみると面白そうですね。


とりとめなく感想を書いただけで結論はないんですが以上です。
PHP プロパティに関しまして。



PHPのClassとfunctionをつかうとき、
プロパティを下記のように生成すると思うが、

```php:test.php

<?php 
class Myclass{
 public $q;
}

```
Class内で生成しなくても、プロパティの生成はできることをおそわりました。


```php:test.php

$test1 = new Myclass();
$test1->$y = 1;

var_dump($test1); 


```
```
結果は
object(test1)#1 (2) {
  ["q"]=>
  NULL
  ["y"]=>
  int(1)
}
```
PHPの講義では、丁寧にプロパティを一々生成してくれますが、
一般的ではないようですが、プロパティをClass内で生成しないコードもあると思うので、
参考までという感じで記事を書いておきます。


```php:test2.php

<?php 
class Myclass2{
    public function __construct($a){
       $this->pdo = $a
}

```
Class内でもプロパティの宣言なしで＄pdoを生成することもできます。




※個人の勉強のメモのための記事でございます。
（udemyの先生に質問して、もらった返答をもとに作成しました。）
youtubeの動画を再生しながら下で紙芝居を再生していくスクリプト

<h3>youtubeの動画を再生しながら下で紙芝居を再生していくスクリプト</h3>
<p>
youtubeの動画を再生しながら、下で紙芝居を再生するスクリプトを作成しました。
</p>
<hr>
githubURL:https://github.com/NanjoMiyako/YouTubeKamiSiba
サンプルページURL:https://nanjomiyako.github.io/YouTubeKamiSiba/

<hr>
使い方
まず下で紙芝居再生用ファイルを読み込ませてから、youtubeで一緒に再生する
動画のIDをセットボタンでセットします。それから上画面でyoutubeの動画を再生
することで秒ごとの指定でyoutubeの動画を再生しながら下で紙芝居を再生します。
<hr>
紙芝居再生用ファイルの書式
紙芝居再生用ファイルの書式は以下のように作成します。

書式
表示時間1(秒単位),画像URL1
表示時間2(秒単位),画像URL2
...

youtubeの動画再生中に表示時間の2秒前になった時点で画像が切り替わるように
なっています。
Rust xmas!

# メリークリスマス！！

Rust xmasです（言いたかっただけ

初Rustなので作法もわかってませんが、`npm`にあった`xmas`を移植してみました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228438/91382817-b318-80e8-d703-69b70b8904f9.png)

## source

https://github.com/novr/rust_xmas

## 書いてみて

- 文字列の扱いが慣れてないためか難しい
- 型推論してくれるんだけど、constはよくわからなかった
- `rand::seq::SliceRandom`便利だった

# 参考

- https://memo.sugyan.com/entry/20111225/1324744827
- https://github.com/sugyan/npm/blob/89d6663e318916abb744c5f7f5f94a206efcd51c/lib/xmas.js
Dockerで実装しているテーブルの内容をターミナルで確認する方法(rails)

# 備忘録として
Dockerを使ってrailsのアプリケーション実装をしている時に、
テーブルの更新内容を確認したくなったので調べた内容を記録しています。



#方法
```
% docker-compose run web rails db  
```
上記のコマンドを入力すると
ターミナルに下記内容が表示されます

```
psql (13.5 (Debian 13.5-0+deb11u1), server 14.1 (Debian 14.1-1.pgdg110+1))
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
Type "help" for help.

○○_development=#
```
 #の後に

```
\d テーブル名;
```
と打てばテーブル詳細が表示されます。
__ex:__ ``\d users;``
と入力すれば

```
                                                Table "public.users"
         Column         |              Type              | Collation | Nullable |              Default              
------------------------+--------------------------------+-----------+----------+-----------------------------------
 id                     | bigint                         |           | not null | nextval('users_id_seq'::regclass)
 first_name             | character varying              |           | not null | ''::character varying
 last_name              | character varying              |           | not null | ''::character varying
 first_name_kana        | character varying              |           | not null | ''::character varying
 last_name_kana         | character varying              |           | not null | ''::character varying
 email                  | character varying              |           | not null | ''::character varying
 encrypted_password     | character varying              |           | not null | ''::character varying
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "index_users_on_email" UNIQUE, btree (email)
    "index_users_on_reset_password_token" UNIQUE, btree (reset_password_token)
Referenced by:
    TABLE "orders" CONSTRAINT "fk_rails_f868b47f6a" FOREIGN KEY (user_id) REFERENCES users(id)
```

みたいな感じで表示されて確認できます。

#　終了方法
```
○○_development=# \q
```
で抜けることができます！！

#最後に
調べていた記事には
__PostgreSQL利用時の操作になる__
と記載がありました！！Mysqlではできないのかもしれません。

https://data-is-friend.com/%e3%80%90rails%e3%80%91%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%81%a7%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e5%86%85%e5%ae%b9%e7%a2%ba%e8%aa%8d%e3%80%90postgresql%e3%80%91/

備忘録として書きましたが誰かの為になることがあれば幸いです！！