OmniAICreator/Qiita-1.07M huggingface dataset:
zshrc-complete導入の備忘録 in mac

### zshrc-complete、README.mdについての備忘録　in mac
#### OS：MacOS Monterey ver.12.4
#### zshrc-completeのインストール in mac 
Macにzshrc completeを導入しました。
リポジトリ[[1]](https://github.com/marlonrichert/zsh-autocomplete)のREADME.md、Manual installation部分に詳しいです。
記事内容は、導入と分かりづらかった点についてです。

#### (1) クローン
適当な場所にgitからクローンします。サンプル例だと、Git以下にクローンしています。
（ない場合は、"mkdir Git”で作ってやってください）
```
% cd ~/Git  # Gitディレクトリに移動

% git clone --depth 1 -- https://github.com/marlonrichert/zsh-autocomplete.git　　　#　Gitディレクトリ内にソースをクローン
```
#### (2) .zshrcに追記
　.zshrc内のcompdefの記述の前に、スクリプトを追記してやってください。
（compdefが無ければどこでも良いはずです）
　”~/”　以下は、（1)でクローンした場所で読み替えてやってください。
read.meでは、(1)のように、Gitディレクトリ以下にクローンしているので、以下にzsh-autocomplete.plugin.zshが存在しています。
```
~/Git/zsh-autocomplete/zsh-autocomplete.plugin.zsh
```
よって、以下のようなスクリプトを追記してやってください。
```
source ~/Git/zsh-autocomplete/zsh-autocomplete.plugin.zsh
```
繰り返しになりますが、自分の環境でのzsh-autocomplete.plugin.zshへのパスを追記してあげてください。

#### (3) compinit を.zshrcから削除
　もしあれば、compinit を.zshrcから削除してやってください。

#### (4) Macなので[1]の(4)の手順は省略します。
　同上です。

#### tips
　クローンしている場所さえ把握していれば、トラブルなく導入できると考えています。

　mkdirして、そのままとかがトラブルの原因として考えられるかもしれません。

時間があれば、追記・修正予定です

【引用・参考文献】
[1] https://github.com/marlonrichert/zsh-autocomplete
GKEを整理したい : ノードプールについて

## 前書き
Google Kubernetes Engine (GKE)はGoogle Cloudのサービスの1つで、
コンテナオーケストレーションツールであるKubernetes (K8s)を用いた、コンテナのデプロイ、管理及びスケーリングが行えるサービスです

オンプレでのK8s運用に比べると様々なことが簡単に行えるとのこと
ただ、それでも様々な機能があるゆえになかなか最初は理解しにくいです

ですので、特定の機能に絞り、自分なりの理解を整理します
今回はStandardモードのクラスタにおける、ノードプールについてです
※ Autopilotモードにおいては、ノードは自動管理されます（[ドキュメント](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-overview)）

## ノードプール
[ノードプール](https://cloud.google.com/kubernetes-engine/docs/concepts/node-pools)とは、クラスタ内において、ノードをグルーピングして管理するための仕組みです
1つのノードプール内のノードは全て同じ構成で、ノードのスケーリングやアップデートをひとまとめに管理することができます

ノードのマシンタイプに応じて、ローカルSSDやGPUの設定もノードプールにて行います

### クラスタ作成時の制約
クラスタ作成時は必ず1のノードプールを作成する必要があります
またこの時、コンソール・gcloudコマンド共にノード数を0とすることはできません

クラスタ作成後にノード数を0とすることは可能です
```
# クラスタ作成直後のノード
$ kubectl get node
NAME                                                  STATUS   ROLES    AGE   VERSION
gke-dohara-test-clus-dohara-test-node-980897df-srtc   Ready    <none>   78m   v1.23.8-gke.1900

# ノード数を0個に
$ gcloud container clusters resize dohara-test-cluster --node-pool dohara-test-nodepool01 --num-nodes 0
Pool [dohara-test-nodepool01] for [dohara-test-cluster] will be resized to 0.

Do you want to continue (Y/n)?  Y

Resizing dohara-test-cluster...done.
Updated [https://container.googleapis.com/v1/projects/solid-pact-363008/zones/asia-northeast1-a/clusters/dohara-test-cluster].

# クラスタ内のノードが0に
$ kubectl get node
No resources found
```

### Kubernetesラベル
各ノードにはノードプール名やマシンタイプ、配置可能なPod数など、ノードプールに関する設定がラベルとして付与されています
ノードプール名については`cloud.google.com/gke-nodepool`で付与されます

また、ノードプールの設定から任意のラベルを付与することもできます

**gcloudコマンド（[ドキュメント](https://cloud.google.com/sdk/gcloud/reference/container/node-pools/update#--node-labels)）**
```
gcloud container node-pools update ${ノードプール名} --cluster ${クラスタ名} --node-labels hoge=hoge
```

### ノードのスケーリング
#### 手動でのスケーリング
各ノードグループのノード数は手動で変更することが可能です

**gcloudコマンド（[ドキュメント](https://cloud.google.com/sdk/gcloud/reference/container/clusters/resize)）**
```
gcloud container clusters resize ${ノードプール名} --cluster ${クラスタ名} --num-nodes ${希望ノード数}
```

#### クラスタオートスケーラー（[ドキュメント](https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler)）
自動的にノード数を調整してくれる機能です

基本的には有効化した後は最小数と最大数を指定するだけですが、
応用設定として、クラスタの設定としてスケーリングの方針を指定すること等も可能です（[ドキュメント](https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler#autoscaling_profiles)）

### ノードのアップグレード
[こちら](https://qiita.com/r-dohara/items/e0135c238a7b26e3a3c8#%E3%83%8E%E3%83%BC%E3%83%89%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89)の記事で取り扱っています

### その他機能
#### GKE Sandbox ([ドキュメント](https://cloud.google.com/kubernetes-engine/docs/concepts/sandbox-pods))
簡単に言うと、コンテナと、ノードのカーネルの間に仲介役を用意することで、コンテナからカーネルを保護する仕組みです

コンテナランタイムはノードにおいて強い権限で稼働していることが多く、
仮に悪意のあるコードがコンテナで実行された場合、その権限をもってノードのシステムコールを利用される可能性があります

GKE Sandboxはオープンソースである[gVisor](https://gvisor.dev/docs/)を用いて、カーネルの代わりにコンテナへシステムコールを提供する機能となります
テトリスを題材にpythonを学べるツールを作成してみた話2

### 目次
- 自己紹介
- 取り組み背景
- 取り組み内容
- 動かしてみた様子
- 今後の課題

---

### 自己紹介
・ハンドルネーム: @seigot
・関西在住の社会人
・python歴：3年〜ほど
・Qiita: https://qiita.com/seigot
・GitHub: https://github.com/seigot

・前回: [Qiita記事 テトリスを題材にpythonを学べるツールを作成してみた話](https://qiita.com/seigot/items/0b42a807217dbe636226)
・今回: [Qiita記事 テトリスを題材にpythonを学べるツールを作成してみた話2](https://qiita.com/seigot/items/0b42a807217dbe636226)

---

### 取り組み背景（再）
・本業でpythonを使用する機会がない人からするとなかなか学ぶきっかけがない。
・文法を学ぶだけでは使用イメージが湧かず挫折しがちである
・しかし、アプリ開発や競プロ等をいきなり始めるのはハードルが高いと感じる

・刺激を受けた
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">人気ブロガーからあげ先生のとにかく楽しいAI自作教室 [楽天] <a href="https://t.co/ffJvnWW5Te">https://t.co/ffJvnWW5Te</a> <a href="https://twitter.com/hashtag/rbooks?src=hash&amp;ref_src=twsrc%5Etfw">#rbooks</a> <a href="https://t.co/GXTZxiu8UG">pic.twitter.com/GXTZxiu8UG</a></p>&mdash; cm-pr0225 (@cmpr001) <a href="https://twitter.com/cmpr001/status/1466252470678855680?ref_src=twsrc%5Etfw">December 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


---

### テトリスを題材にpythonを学ぶ試み
・[Tetris in PyQt5](https://zetcode.com/gui/pyqt5/tetris/)などを参考に、テトリスの本体部分を準備
・ブロックを動かす部分は独自に拡張できるように実装

前回
・サンプルコードも実装、まだ初心者レベル
・ムーブが愚直
<blockquote class="twitter-tweet"><p lang="in" dir="ltr">Tetris <a href="https://t.co/mfCBQbkMO3">pic.twitter.com/mfCBQbkMO3</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1544635088113397760?ref_src=twsrc%5Etfw">July 6, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

### もっと動かしてみた様子
・友人にサンプルコード改良を相談
・強いのがでてきた
・せっかくなので対戦形式にしてみた

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">tetris のAI同士で対戦とかしてみたり <a href="https://t.co/ak4etzdOue">pic.twitter.com/ak4etzdOue</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1572630631343067137?ref_src=twsrc%5Etfw">September 21, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

### まとめ
・テトリスを題材にpythonを学べるツールを作成してみた
・ものが動くと面白い
・対戦がアツい

### 今後の課題
・より強いテトリス制御プログラムを作ってみたい
・機械学習要素を実装してみたい
・（可能な範囲で）pythonテトリス最強トーナメント的なものをやってみたい。興味ある方とかいるんだろうか。

---

以上

---

### （備考）

スコアをグラフ化すると分かりやすい(matplotlib)

![スクリーンショット 2022-09-22 20.33.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/4eab7dd3-ca0d-30ac-8c4b-4525b3594c03.png)


---

（備考）
ソースコードは以下です！
https://github.com/seigot/tetris
Laravel テスト用のシーダーを初回のみ実行する

Laravelのデータベーステスト時に予めデータ投入しておきたい時のtipsです。
各テストに依存するシーダーは各シーダーで実行するのが良いと思いますが、マスターデータ等システム全般で使用するものはテスト前に実行しておきたいです。

## 事前情報

`tests/TestCase.php` はLaravelが元々用意してくれているファイルです。
`TestCase` を継承して各テストクラスを作っていきます。

```php:tests/TestCase.php
<?php

declare(strict_types=1);

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
}
```

`phpunit.xml` でテスト用のDockerコンテナを指定してます。

```xml:phpunit.xml
    <php>
        <env name="DB_CONNECTION" value="mysql"/>
        <env name="DB_HOST" value="db-testing"/>
    </php>
```

https://qiita.com/ucan-lab/items/42c1814d8bd69895374c

## 手順

`tests/TestCase.php` 下記のように書き換えます。

```php:tests/TestCase.php
<?php

declare(strict_types=1);

namespace Tests;

use Database\Seeders\TestingDatabaseSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
    use RefreshDatabase;

    protected string $seeder = TestingDatabaseSeeder::class;
}
```

`$seeder` には1つのシーダーを指定できます。
今後複数のシーダーを呼び出すことを考慮してテスト用のシーダークラスを作ります。

```shell-session
$ php artisan make:seeder TestingDatabaseSeeder
```

```php:database/seeders/TestingDatabaseSeeder.php
<?php

declare(strict_types=1);

namespace Database\Seeders;

use Illuminate\Database\Seeder;

final class TestingDatabaseSeeder extends Seeder
{
    /**
     * @return void
     */
    public function run(): void
    {
        $this->call([
            RolesAndPermissionsSeeder::class,
        ]);
    }
}
```

`$this->call()` 関数にテスト時に実行したいシーダークラスを指定します。

## 補足

`RefreshDatabase` トレイトが用意されています。

- [RefreshDatabase](https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Testing/RefreshDatabase.php)

```php:vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php
trait RefreshDatabase
{
    use CanConfigureMigrationCommands;
}
```

- [CanConfigureMigrationCommands](https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Testing/Traits/CanConfigureMigrationCommands.php)

```php:vendor/laravel/framework/src/Illuminate/Foundation/Testing/Traits/CanConfigureMigrationCommands.php
trait CanConfigureMigrationCommands
{
    /**
     * Determine the specific seeder class that should be used when refreshing the database.
     *
     * @return mixed
     */
    protected function seeder()
    {
        return property_exists($this, 'seeder') ? $this->seeder : false;
    }
}
```

`seeder` プロパティにシーダークラスを指定するとデータベースリフレッシュ時にシーダーを実行してくれます。

`RefreshDatabase` トレイトはマイグレーションスキーマが最新であればデータベースをマイグレートしません。(初回のみ実行される)
2回目以降はデータベーストランザクション内でテストが実行されるので、`TestingDatabaseSeeder`だけ実行されたクリーンな状態でテストが実行されていきます。

## 参考

https://readouble.com/laravel/9.x/ja/database-testing.html
【Rails】render :json に modelメソッドの返り値を追加する方法


# きっかけ
`controller`の返り値を`json`形式で返却する時、モデルで定義されている`attributes`しか返すことができません。そんな時、他の`attributes`を追加する方法が分からず困ることがあったので、備忘録として残します。

# attributeを追加する
`render json:` に、`methodsオプション`をつけ、`model`で定義したメソッドを呼び出す。

# 使い方
例えば・・・
以下のようなモデルがあったとする。
```ruby
create_table "users", force: :cascade do |t|
  t.string "first_name", null: false
  t.string "last_name", null: false
  t.datetime "created_at", precision: 6, null: false
  t.datetime "updated_at", precision: 6, null: false
end
```

で、以下のようにで`ActiveRecord`で見つけた`user`オブジェクトの結果を`json`形式で返す場面があったとする。
```ruby
user = User.find_by(id: 1)
render json: user

# 返り値
{
  data: {
    id: 1
    first_name: "山田",
    last_name: "太郎",
    updated_at: "2022-09-20T23:34:11.502Z",
    created_at: "2022-09-11T06:11:08.726Z"
  }, 
  status: 200,
  config: {・・・},
  ・・・
}
```

この返却値の中にモデルメソッドの処理結果を追加したい。
例えば、以下のようにモデルで、`User`の`full_name`を取得するメソッドがあったとする。
これを先程の`jsonデータ`に含めたい。
```ruby
class User < ApplicationRecord

  def full_name
    first_name + ' ' + last_name
  end
end
```

以下のように`methodsオプション`を追記することで、`full_name`は`attribute`じゃないにもかかわらず、他の`attribute`と同じように`Hash`に取り込まれます。

```ruby
user = User.find_by(id: 1)
render json: user, methods: :full_name

# 返り値
{
  data: {
    id: 1
    first_name: "山田",
    last_name: "太郎",
    updated_at: "2022-09-20T23:34:11.502Z",
    created_at: "2022-09-11T06:11:08.726Z",
    full_name: "山田 太郎"
  }, 
  status: 200,
  config: {・・・},
  ・・・
}
```
[Railsガイド](https://railsguides.jp/active_model_basics.html#activemodel-serializers%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)に書かれている通り、`ActiveRecord`は`ActiveModel::Serializationモジュール`を自動で`include`しているので、[インスタンスメソッド](https://api.rubyonrails.org/v6.0.3.3/classes/ActiveModel/Serializers/JSON.html#method-i-as_json)である、`as_json`や`methodsオプション`が何もせずとも使えるようです。


そのため、以下のように書いても同様の結果が得られます
```ruby
user = User.find_by(id: 1)
render json: user.as_json(methods: :full_name)
```

# 必要のないattributeを排除する
こちらもドキュメントに書かれている通り、`only`オプションを追加することで必要な`attribute`を絞ることができます。他にもオプションが用意されているので状況に応じて使い分けることができます。
```ruby
user = User.find_by(id: 1)
render json: user, only: [:id, :first_name]

# 返り値
{
  data: {
    id: 1,
    first_name: "山田"
  }, 
  status: 200,
  config: {・・・},
  ・・・
}
```

# 参考にした記事
[Rails における JSON のシリアライズと向き合う 🦜](https://qiita.com/sakuraya/items/924ec3c3001938071407#activemodelserialization)

# 最後に
ここまでご覧いただきありがとうございます。m(_ _)m
備忘録のつもりで書きましたが、誰かのお役に立てば嬉しく思います。
Incorrect datetime value: '0000-00-00 00:00:00' for column g-rush.customer.datetime at row 1

# DATETIME型を追加したらエラーに阻まれた
PHP初学者です。
phpmyadminでDATETIME型を追加した際に3時間ぐらい沼って抜け出せたので共有したいと思います。

# エラー文
```
Incorrect datetime value: '0000-00-00 00:00:00' for column g-rush.customer.datetime at row 1
```
![スクリーンショット 2022-10-11 22.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708236/07a18587-b99a-36bf-dc58-ad07694abad3.png)
# 原因
TIMEDATE型は既にレコードが存在していると既存のレコードに値を補完できずに失敗する仕様みたいです

# 追加するには
# 1 レコードの中身を空にする
操作をクリックして下の方にある"テーブルを空にする"を実行すると追加できます
![スクリーンショット 2022-10-11 23.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708236/ea4cf9ed-6fea-5419-95cd-5be38209fdff.png)

# 2 NULL許可を設定する
値を空にしたくない場合、追加する際にあるNULLをチェックします
![スクリーンショット 2022-10-11 23.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708236/fa92180b-8fdd-aed4-fac7-487a7cadc3aa.png)

# 3 DEFAULT値を設定する
追加する際にあるDEFAULT値を設定すればok
まだ試してないので実践して見てください

# 終わり
これは初見殺し🥹
Nuxt.jsでfakerを使って日本語ダミー文章を生成する

公式サイト
https://fakerjs.dev

Githubはこちら
https://github.com/faker-js/faker

インスコ
```
npm install --save-dev @faker-js/faker
```


メソッド一覧(公式Githubより)

```
Module	Example	Output
Address	faker.address.city()	Lake Raoulfort
Animal	faker.animal.cat()	Norwegian Forest Cat
Color	faker.color.rgb()	#cdfcdc
Commerce	faker.commerce.product()	Polo t-shirt
Company	faker.company.companyName()	Zboncak and Sons
Database	faker.database.engine()	MyISAM
Datatype	faker.datatype.uuid()	7b16dd12-935e-4acc-8381-b1e457bf0176
Date	faker.date.past()	Sat Oct 20 2018 04:19:38 GMT-0700 (Pacific Daylight Time)
Finance	faker.finance.amount()	¥23400 (After setting locale)
Git	faker.git.commitMessage()	feat: add products list page
Hacker	faker.hacker.phrase()	Try to reboot the SQL bus, maybe it will bypass the virtual application!
Helpers	faker.helpers.arrayElement(['a', 'b', 'c'])	b
Image	faker.image.cats()	https://loremflickr.com/640/480/cats 
Internet	faker.internet.domainName()	muddy-neuropathologist.net
Lorem	faker.lorem.paragraph()	Porro nulla id vero perspiciatis nulla nihil. ...
Music	faker.music.genre()	R&B
Name	faker.name.firstName()	Cameron
Phone	faker.phone.phoneNumber()	+1 291-299-0192
Random	faker.random.locale()	fr_CA
Science	faker.science.unit()	{ name: 'meter', symbol: 'm' }
System	faker.system.directoryPath()	/root
Vehicle	faker.vehicle.vehicle()	Lamborghini Camry
Word	faker.word.adjective()	adorable
```



fakerの読み込み
```
<script>
import { faker } from "@faker-js/faker";
export default {
  mounted() {
~~~~~~~~~省略~~~~~~~~~~~
```


ロケールで地域を設定する jaが日本語
```
 faker.locale = "ja";
```


computedでプロパティーに入れる

```
computed: {
    fake() {
      faker.locale = "ja";
      return faker.lorem.paragraph(); //文章を作成する
    },

```


template内で表示する


```
   <p>{{ fake }}</p>
```


実行結果
```
きょうかい 陳列室 陳列室. しゃこ こうおつ いちだい きょうふ くつじょく 
つうやく 気持ちいい 譜面 電源 あれる. 合う 無糖 はなはだ 病床
 この頃 そだてる 安泰 伝統 つまる. 提案する はなはだ うえる.
```

サーバー介さなくてもできるの便利。
以上です！簡単だね！
pyenv install x.x.xがエラー終了．．．原因は最近必須になったあのモジュールに有った

Pythonのバージョン切り分けにpyenvを愛用しています．加えてrbenv,goenv,nodenvも愛用しています．今後も`**env`の利用が増加する可能性も有りそうです．そこで`anyenv`繋がりで全ての`**env`を管理出来る様にするための作業をしました．pyenvを除いて全て上手く再構築出来ました．ところが，pyenvだけ上手く復活しません．pyenv install 3.10.7と実行しようものなら，怒濤のエラー．．．:scream: :scream_cat: 仕方が無いので，最新バージョンのPython環境の構築には対応していないHomebrew版のpyenvを再度インストールするも，こちらも正常に動作せず，同様のエラー終了に．．．:scream: :scream_cat: 万事休すかに思われたのですが，原因を探ってみると意外な事実が判明しました．この記事はその記録です．

# 分かった事実: Python3.10.xからOpenSSL1.1.1が必須に
以下の記事で言及が有りますが，どうやらPython3.10.xからOpenSSL1.1.1が必須になりました．これよりも古いバージョンのOpenSSLがインストールされている場合にはbuild出来ない様です．pyenvではPythonをソースコードからbuildして環境構築を実行します．これは関連が有りそうな予感

https://www.python.jp/news/wnpython310/require-openssl11.html

# エラーログを辿ると
エラーログはここに格納されているよといったメッセージがbuildのエラー終了時に出力されるので，エラーログを探ってみることに．`OpenSSL`で検索したところ，以下の内容がヒット．．．

```vim
 1495 Could not build the ssl module! 
 1496 Python requires a OpenSSL 1.1.1 or newer
```

# .bash_profileを確認
筆者の環境ではOpenSSLは最新版がインストール済のため，Pathが登録されていないのではないかと疑い，.bash_profileを確認してみました．以下の様にOpenSSL 3について既に環境情報が登録されていました．

```bash
PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"
LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib $LDFLAGS"
CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include $CPPFLAGS"
PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@3/lib/pkgconfig $PKG_CONFIG_PATH"
```

## OpenSSL 1.1に関する環境情報を追加
OpenSSL 3ということはOpenSSl 1.1.1 or newerという条件を満たしていそうですが，エラーになってしまうので，OpenSSL 1.1についても情報を追記しました．この後，pyenv install 3.10.7を実行したところ，問題無く動作しました．根本原因は分からず終いとなりましたが，pyenvはこれで動作する様になりました．ひょっとするとOpenSSL 3ではバージョンが新しすぎるのかもしれません．

```bash
PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"
LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib $LDFLAGS"
CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include $CPPFLAGS"
PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@3/lib/pkgconfig $PKG_CONFIG_PATH"
PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"
LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib $LDFLAGS"
CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include $CPPFLAGS"
PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig $PKG_CONFIG_PATH"
```

# まとめ
OSSではよく有ることですが，トラブルシューティングのメモは忘れた頃に再発するトラブル解決のため，今後も積極的に残していこうと思います．
arxiveの論文をDeepLのAPIで翻訳する

# 目的
Materials Infomaticsの最近のトレンドが把握したいけど、英語が苦手で論文のタイトルすら読むのがしんどい。そんなことを思っていると、arxivやDeepLのAPIがあることが判明。 
[パナソニックHD 横山氏ツイート](https://twitter.com/yoko_materialDX/status/1558770410845618181)
早速使ってみた。

# 結果
とても使いやすくて、結果も閲覧しやすかった。
ただし、5分で、1ヶ月上限の50万字を突破してしまった。
有料会員は、¥630+¥2500/100万文字。
このペースだと、¥30,000/時間のペースで破産しかねないので、有料会員は一旦見送り。
## DeepLのAPI取得
DeepLのユーザー登録をして、APIを取得。無料版だと1ヶ月50万文字まで翻訳可能。
本人確認のため、クレジットカードの登録はあるが、自動的に有料会員への移行はないので安心。
[DeepL](https://www.deepl.com/ja/docs-api)
## スクリプト
ブラウザで開くと見やすいので、.mdで保存してみる。
検索クエリは、
cs.LG：learning(学習)
cond-mat.mtrl-sci(物性物理学-材料工学)

```python
import arxiv
import deepl

AUTH_KEY = "************"

def get_arxiv_results():
    print('getting data from arxiv"')
    search = arxiv.Search(query='cat:cs.LG AND cat:cond-mat.mtrl-sci')
    titles, abstracts, urls = [], [], []
    for result in search.results():
        titles.append(result.title)
        abstracts.append(result.summary)
        urls.append(result.pdf_url)
    return titles, abstracts, urls

def make_input(idx, title, abstract, url):
    text = f' \
# {idx}: {title} \n \
{abstract}  \n \
[URL]({url}) \n \
'
    return text

def main():
    titles, abstracts, urls = get_arxiv_results()
    with open("20221011_deepl.md", "a") as f:
        print("translating")
        translator = deepl.Translator(AUTH_KEY)
        for idx, [title, abstract, url] in enumerate(zip(titles, abstracts, urls)):
            print(f"`{idx} in {len(titles)}")
            title_ja = translator.translate_text(
                text=title.replace("\n", ""), target_lang="JA"
            )
            abstract_ja = translator.translate_text(
                text=abstract.replace("\n", ""), target_lang="JA"
            )
    
            text = make_input(idx, title_ja, abstract_ja, url)
            f.write(text)

if __name__ == '__main__':
    main()
```

## .mdをVSCodeやブラウザで閲覧
英語で読むよりサッと理解できた...のか。
少なくとも言語の問題はない。
![ブラウザで閲覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/38ee3728-4955-c92f-9f1e-0cd0b85aaad5.png)

おしまい。
created_atとupdated_atの表示を変更する方法

# created_atとupdated_atを日本時間へ変更する方法

config/application.rbに以下のコードを記述する

```config/application.rb
config.time_zone = 'Tokyo'
```


```config/application.rb
require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module App名
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # 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.
    config.time_zone = 'Tokyo'　　# ここにタイムゾーンを追記する
  end
end
```
`% rails s`でサーバーを再起動すると表記が下記のような日本時間に変わる
[![Image from Gyazo](https://i.gyazo.com/00fbd6d09c309ce3222391507127cba8.png)](https://gyazo.com/00fbd6d09c309ce3222391507127cba8)


## 表示を変更する

config/initializersディレクトリにtime_formats.rbファイルを作成する
time_formats.rbに下記の記述をする

```config/initializers/time_formats.rb
Time::DATE_FORMATS[:datetime_jp] = '%Y/%m/%d %H:%M'
                                    # '%Y年 %m月 %d日 %H時 %M分' など表示させたいフォーマットにする
```

`% rails sでサーバーを再起動

## viewへの反映

```html.erb
<%= xxx.created_at.to_s(:datetime_jp) %>
<%= xxx.updated_at.to_s(:datetime_jp) %>
```
created_at, updated_atで
to_sメソッドを呼び出して、引数にフォーマット名を指定
(to_sとは配列を文字列に変換するメソッドで、配列の各要素を文字列に変換して連結した文字列を返す)


下記のように表示が変わる
[![Image from Gyazo](https://i.gyazo.com/4a3706fe6eebddf7d852fc74ba7b84ce.png)](https://gyazo.com/4a3706fe6eebddf7d852fc74ba7b84ce)

/参考にした記事/
https://qiita.com/tomo_k09/items/e4f19947d35890500492
Pythonで特定の日付以前の過去のTweetを消去する

  - [やること](#やること)
  - [背景](#背景)
  - [想定読者](#想定読者)
  - [概要](#概要)
  - [作業手順](#作業手順)
  - [ソースコード](#ソースコード)
  - [感想](#感想)
  - [まとめ](#まとめ)
  - [参考記事](#参考記事)

## やること  
- Pythonで特定の日付以前の過去のTweetを消去する。

## 背景
- qiitaでも書くか～って思ったときに、Twitterアカウントをプロフィールに乗せたい気がする。
- あまりにも昔のTweetが残っていると恥ずかしい。
- でも最近のTweetは残しておきたい。

## 想定読者
- 自力でツイ消しプログラムを書きたい人
- 全件消すのではなく、特定の日付以前のTweetのみを消去したい人
- Pythonの基本的な文法がわかる人
- Linuxの環境変数設定がわかる人
- TwitterAPIのトークンなどの発行方法がわかる人
- Twitterからアーカイブを取得する方法がわかる人

## 概要
- コマンドラインから入力した年月日以前のツイートを消すスクリプト。
- TwitterにアクセスするためのPythonライブラリはtweepyを使用。多分なんでもいいと思う。
- TimezoneはUTCにしてある。

## 作業手順
- 実行する前にTwitterから取得したアーカイブファイルtweets.jsをpythonスクリプトと同じディレクトリに配置する。
- tweets.jsはじめの`window.YTD.tweets.part0 = `という部分は消しておく。
- 事前にマシンの環境変数にkeyやtokenを書いておく __Pythonファイル内にベタ書きしてgitに上げるとえらいことになるから注意__
- コマンドラインでスクリプトを実行する。
- 消したい期間の最終日付を`YYYYmmDD`形式で入力する。

## ソースコード
```python
# coding: utf-8
'''
# before use This script...

## Prepare archive file
- Get archive from Twitter.
- We use tweets.js from the archive
- Put tweets.js in this directory.
- Delete 'window.YTD.tweets.part0 = ' from tweets.js

## write your key and token in your machine's environment variable like below
export CONSUMER_KEY="xxxxxxxxxxxxxxx"
export CONSUMER_SECRET="xxxxxxxxxxxxxxx"
export ACCESS_TOKEN="xxxxxxxxxxxxxxx"
export ACCESS_TOKEN_SECRET="xxxxxxxxxxxxxxx"
'''

import os
import datetime
from dateutil import tz
import json
import tweepy



print('set maximum YYYYMMDD')
target_ymd  = input()
target_ymd = datetime.datetime(
                int(target_ymd[:4]), # YYYY
                int(target_ymd[4:6]), # MM
                int(target_ymd[6:]), # DD
                tzinfo = tz.gettz('UTC'))# Timezone


print(f'Tweets until {str(target_ymd)} is going to delete.')

consumer_key = os.environ['CONSUMER_KEY']
consumer_secret = os.environ['CONSUMER_SECRET']
access_token = os.environ['ACCESS_TOKEN']
access_token_secret = os.environ['ACCESS_TOKEN_SECRET']

auth = tweepy.OAuth1UserHandler(
    consumer_key, consumer_secret, access_token, access_token_secret)
api = tweepy.API(auth)

with open('tweets.js', encoding='utf-8', mode='r') as f:
    tweets = json.load(f) 
    counter = 0
    
    for tweet_i in tweets:
        tweet_datetime = tweet_i['tweet']['created_at']
        tweet_datetime = datetime.datetime.strptime(tweet_datetime, "%a %b %d %H:%M:%S %z %Y")
        tweet_text = tweet_i['tweet']['full_text']
        tweet_id = tweet_i['tweet']['id']
        if tweet_datetime <= target_ymd:
            print(tweet_datetime)
            print(tweet_text)
            print(tweet_id)
            try:
                api.destroy_status(tweet_id)
                counter += 1
            except Exception as e:
                print(e.args)

print(f'{counter} tweets has deleted')
```


## 感想
- 最初は`api.user_timeline`から順番にツイートを呼び出せると思ったが、件数制限で引っかかって撃沈した。悲しい。
- アーカイブのJSONの中身を確認するのが大変だった。階層構造のどこに何が入っているかとか、日付のフォーマットとか。

## まとめ  
これで皆さんも、垢バレに備えて程ほどにツイ消しできますね。  
よいTwitterライフを!!  

## 参考記事
[Twitter API と Python でツイートを一括削除](https://mytech-blog.com/twitter-api-python/)
キャッシュ対策：クエリパラメータ

取得するパスやURLにクエリを追加することで、Webサイトの更新時にキャッシュがかからないようにできる。

# 記述
### 例）通常の記述
```
<img src="./images/hoge.jpg">
<link rel="stylesheet" href="./stylesheets/style.css">
<script src="./script/main.js"></script>
```
### 例）クエリパラメータ追加後の記述
```
<img src="./images/hoge.jpg?20221011">
<link rel="stylesheet" href="./stylesheets/style.css?20221011">
<script src="./script/main.js?20221011"></script>
```
``yymmdd``形式のクエリパラメータを追加することで、その指定した日以降のファイルが自動的に取得される。  
他にもクエリの種類はあるっぽいが、基本的には``yymmdd``形式で十分そう。  
※日付を記載することで、バージョン管理も可能


# 参照
- [ウェブサイト更新時のキャッシュ対策にファイルへのクエリパラメータを追加する](https://designsupply-web.com/media/marketing/6519/)
- [キャッシュ削除のお願いをなくそう！CSSが更新されない問題を解決
](https://suzunon.com/web-develop/css/cache-delete/)
Docker imageのJDKを使ってwebアプリを起動する

Dockerfileを作成する
```Dockerfile:Dockerfile
FROM amazon-corretto-17
ARG JAR_FILE=./build/libs/*.jar
COPY ${JAR_FILE} ./
ENTRYPOINT ["java","-jar","spring-security-demo-0.0.1-SNAPSHOT.jar"]
```
※`spring-security-demo`の部分はアプリ名

IntelliJで↓の実行構成を作成して実行すると、localhost:8080にアプリが立ち上がる。
![スクリーンショット 2022-10-11 22.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/c18b432d-9b1c-ed31-8e5a-9a6949c606bf.png)
mailコマンドでのメール送信でmyoriginの設定が効かない!

## `mail`コマンドでメールが届かない!
サーバから`mail`コマンドでちょっとしたメールを飛ばしたかったのだが、メールが届かなかった
ログを見てみると
```/var/log/mail.log
Domain of sender address xxx@xxxxx not exist
```
となっていた
@以下はこのサーバの`hostname`になっていて、これはDNS登録してないので、たしかに存在しない
それで先方のメールサーバから拒否られてるわけだ
## `From:`のドメインが変えられない!
じゃあ`From:`のドメイン名を適当な存在するドメイン名に変えればいいじゃないかと思い調べると`postfix`の`main.cf`で`myorigin`を設定すればOK、と出てきたのだが、これをしてもなぜか`From:`のドメインが変わらない
`mail`コマンドを使うときに`-r`オプションを使って`From:`を指定してあげれば問題は解決するのだけど、`mail`コマンドを使う時に毎回それを書かないといけないのはちょっと嫌だ
```
mail -r from@xxxx.co.jp to@xxxx.co.jp
```
それにせっかく`postfix`に`myorigin`という設定があるんだからできないわけないのだ、なのになかなか原因が見つからない
## 解決
`mailutils`の`mail`コマンドを使ってると`myorigin`は無視して勝手に`hostname`を使うんだそうな、なにそれ
というわけで代わりに`bsd-mailx`の`mail`コマンドをインストールすれば解決
```
sudo apt install bsd-mailx
```
これだけで問題ないと思うが、必要があればupdate-alternativeを使ってちゃんとbsd-mailxを使うように変更
```
sudo update-alternative --config mailx
```
HSM とは

## 勉強前イメージ

いやわかんない・・・ちょっとぱっと目についた言葉でした。

## 調査

### HSM とは

Hardware Security Module の略で、暗号化やデジタル署名の生成に使用する鍵を保管するハードウェアになります。
鍵はだいたい128-2048bitのバイナリデータで、万が一漏洩すると暗号が解読されて機密情報が漏洩したりする可能性があります。
そのようなことが怒らないように安全に鍵を保管するデバイスとしてできたのがHSMになります。
高度なセキュリティを求められる製品等で使われています。

HSMの要件については段階的に規定があり、どの規定を満たしているのかによって保証されるセキュリティ水準が変わります。

### HSMの機能

HSMの機能としてはデータを保管するだけではないのです。
以下の機能があります。

- 鍵を安全に保管する

基本的な機能で、HSMを壊してデータを取り出すということもありえるので
耐タンパー性と言って、物理攻撃に対しても安全にも守れるように工夫がされています。

- 鍵を使って暗号演算や電子署名演算を行う

HSM内部で暗号処理などを行う機能で
HSMに内蔵されているプロセッサは高機能なものなので暗号処理を高速化するものとしても使うことが出来ます。

- 鍵の生成

鍵の生成ができることでHSMの内部で生成された鍵は
HSMの外部に出ないような運用ができるようになります。

- 乱数の生成

乱数といっても法則性があったり分布の偏りがあり、とてもランダムに乱数を作ることは難しいことです。
HSMは物理的に乱数を発生させる仕組みを持っており、それから乱数を生成することが出来ます。

## 勉強後イメージ

物理的に壊したときに鍵が破壊されるらしい・・・・耐ダンパー性すごい・・・

## 参考

- [HSM 【Hardware Security Module】 ハードウェアセキュリティモジュール](https://e-words.jp/w/HSM.html)
- [第1時限目 HSMとは](https://www.sarion.co.jp/ref/ref_hsm_primer_sec1.html)
replitでLiveViewを体験しよう

replitというブラウザーだけでElixirが体験できるサービスがあります。
そして、LiveViewも体験できることを知りました。
さっそく体験してみましょう。

前提
　・replitのアカウントを作成済みであること
　・ブラウザが使えるPC等があること
　・replitにログイン済みであること

## Createをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/666c471d-c81a-db68-6b82-d674b6a97e4b.png)

## Elixirで検索してPhoenixをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/8b63115b-8b31-6ff0-72d6-ca5e5f091b0d.png)

## Create Replitをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/0c35f2ca-f2f4-853f-ebb5-32b440dfec04.png)

## Runをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/802d9c13-a50c-9642-a779-35d50b02931c.png)

## 起動するとPhenixの画面が表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/16d38e77-e0b3-6df9-47d2-d0b1d41d0baa.png)

では、LiveViewを体験して見ましょう

## shellでmix phx.gen.liveを実行

```mix phx.gen.live Accounts User users name:string```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/f5f80851-c6b5-41e2-cbf8-0406f53e74ff.png)

## router.exを編集
mix phx.gen.liveの結果を下記の通りに貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/49f2a2ef-2480-aacd-95e6-e24b1c60ddcb.png)

## shellでmix ecto.migrate を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/15d44ce7-374a-8402-702f-79c098b2c40d.png)

## 新しいタブで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/777deb7d-67f5-83c5-5479-4f22f30e0622.png)

## Urlの最後に/usersを追加してEnter
![Screenshot 2022-10-11 22.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/3a898a28-4b39-efd4-f6bb-de9b4c3da064.png)

これで完成です。

## 使ってみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/4c11cb3d-2a17-48ad-6fef-c9057ecac6f2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/d13acc2c-52d9-44ce-1f78-adfe42df8f04.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/06651404-883b-4485-475a-d92d9daac095.png)
Twitter / Pelikanをちょっとお試し

# 初めに

最近プライベートではRustで遊ぶことが多いのですが、Twitterでブラブラしていたらコレに触れている方がいたので興味を持ちました、が今日のお話。

ポエム程度の記録記事です。

# サイト

Peli"c"anではなく、peli"k"an

https://www.pelikan.io/

ソースはこちら。

https://github.com/twitter/pelikan

# Pelikanとは

- Rust製キャッシュフレームワーク
- Twitter社でTwemcache(MemcachedをTwitterがフォークしたもの）とRedisを使ってたけど色々問題あったので開発
- Twemcache、RedisとAPI互換

説明の原典はコチラ。

https://www.pelikan.io/2019/why-pelikan.html

# お試し

そもそもMemcachedも使ったことありませんな私ですが、試すだけ試します。

お試し環境はM1 MacBook Air(M1, 2020) Monterey 12.6

```:Terminal
git clone https://github.com/twitter/pelikan.git
cd pelikan
cargo build --release
```

workspace-inheritanceが必要だけど安定版には入っていないということでビルド失敗。
Rustのバージョンが1.64からは入っている。（自分の環境は1.63でした。)



```
error: failed to load manifest for workspace member `/Users/xxxxxx/projects/pelikan/src/common`

Caused by:
  failed to parse manifest at `/Users/xxxxxx/projects/pelikan/src/common/Cargo.toml`

Caused by:
  feature `workspace-inheritance` is required

  The package requires the Cargo feature called `workspace-inheritance`, but that feature is not stabilized in this version of Cargo (1.63.0 (fd9c4297c 2022-07-01)).
  Consider adding `cargo-features = ["workspace-inheritance"]` to the top of Cargo.toml (above the [package] table) to tell Cargo you are opting in to use this unstable feature.
  See https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#workspace-inheritance for more information about the status of this feature.
```

ありがたいお言葉通りCargo.tomlに足してもいいのですが、Cargo.tomlが複数ありますし（めんどい）、素直にRustのバージョンを上げた方がよろしかろうということで

```:Terminal
rustup update stable
```

2022/9/22に1.64の安定版が出ていました。ありがたし。
https://blog.rust-lang.org/2022/09/22/Rust-1.64.0.html

# 無事ビルドができたので

実行

```:Terminal
target/release/pelikan_segcache_rs
```

Pelikanさんがポート12321を開けて待ってます。

```
2022-10-11T12:23:46.141+00:00 INFO [admin] running admin on: 127.0.0.1:9999
2022-10-11T12:23:46.141+00:00 INFO [server::listener] running server on: 0.0.0.0:12321
```

開いているポートがあれば刺してあげるのが礼儀です。

```:Terminal
telnet localhost 12321
```

Memcachedを全く知らない私が見ようみまねで値を登録してみます。
setで値を登録。

```:Terminal
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set foo 0 0 3
bar
STORED
```
getで値を取得。

```:Terminal
get foo
bar
END
```


Memcachedのコマンドの扱いはコチラが分かりやすかったです。感謝。

https://qiita.com/tisurugi/items/a5fa0c3babef3fee60b0

# 終わりに

今回は「とりあえず動かしてみた」です。

実際にMemcachedやRedisなどの実績があるものを評価作業なしのエイヤで置き換えることにはならないと思いますが（そもそも自分は使ってない）、Rust製か〜、萌えるな〜と悦に入るにはオツな一品でした。


# 補足：Windowsの場合

WSL2上でも環境作りました。
（純粋なWindows上ではないですが・・・。）

cmakeとclangが素のWSL2に入っていなかったので、aptで入れました。

それ以外は特に手順的に変わるところはありません。

# 補足:開発者からの説明動画

https://www.youtube.com/watch?v=y1pPAMM4SDQ&ab_channel=ScyllaDB
【応用情報・G検定・E資格】それぞれ２週間以内で合格した話

## 記事の内容

- ポエム
- イキり記事
- ２週間で何をやったか
- 高度情報のエンベデッドシステムスペシャリストを受け終えたので今年のまとめ
- 資格を難しいと感じて敬遠してる方のハードルが下がれば幸いです

### バックグラウンド

- 機械系の大学院卒
    - 学生時代はロボティクス関連の研究
    - 学生時代からC++とPythonは使っていた
- 現在はJTCで一応DeepLearningの開発
- 趣味プログラマ

## 1. 応用情報

- 2022春受験
- 得点
    - 午前：72.5
    - 午後：79
- 結構ギリギリだった
- 勉強時間：帰宅後2時間 * 14 = 28時間

### やったこと

#### 午前問題

- [過去問道場][link-1]をひたすら周回
- 午前は過去問を過学習すれば良い
- 計算問題は解き方だけ理解して答えは暗記（試験の余った時間で検算すればいいので）
   
#### 午後問題

以下の５つ（+ 予備としてシステムアーキテクチャ）の過去問を一周

- 情報セキュリティ
- プログラミング
- 組込みシステム開発
- 情報システム開発
- システム監査

なるべく知識問題が少なくその場で解ける問題を選択（業務で使ってる方はDBとかもいいと思います）
最低限必要な知識問題は午前問題を過学習した過程で身についてるはずなので、それだけあれば十分です

よくストラテジやサービスマネジメントがおすすめされている記事を見かけますが正直肌に合いませんでした
システム監査は生まれたときから知ってる内容だと思うのでオススメです

自分でも意外でしたが応用情報対策で学んだシステム監査が一番業務で活きてます（JTCメーカだからかも）

## 2. G検定

- 2022#2 (7月開催)
- シラバス分野別得点率（小数点以下切り捨て）
    １．人工知能とは.  人工知能をめぐる動向. 人工知能分野の問題：72%
    ２．機械学習の具体的手法：86%
    ３．ディープラーニングの概要：100%
    ４．ディープラーニングの手法：94%
    ５．ディープラーニングの社会実装に向けて：94%
    ６．数理・統計：100%
    ７．法律・倫理・社会問題：92%
- 勉強時間：前日４時間
- 一番なめてかかって一番簡単だった

### やったこと

- [Study-AI社模擬テスト][link-2]を１周
- [GRI模擬試験][link-3]１周
- 上記２つをHTMLで保存

G検定はカンペOKなので模擬テスト及びその回答を保存しておくと便利です
公式テキストも購入しましたが、本は検索し辛いですしKindle版も正直検索のUIがイマイチ…だったので使ってないです

## 3. E資格

- 2022#2(8月末開催)
- 分野別の得点率
    応用数学：90 ％
    機械学習：78 ％
    深層学習：75 ％
    開発環境：82 ％
- 勉強時間： 3時間 * 1週間 = 21時間
    - 実際には受験資格を得るための研修があるので、そちらは結構しっかり勉強した
- E資格の講座はスキルアップAI社の研修を受講（社内研修で受けられたので）
    - 研修ではPytorchやTensorFlowのフレームワークを取り扱わない
    - 使ったことがないとややハードル高いかも
- 正直受験前はもう無理だと思っていた

### やったこと

- 研修経由で配布される例題（JDLAからだからどこを受けてももらえるっぽい？）
- スキルアップAI社より配布された模擬試験

内容は守秘義務らしくあまり書けないが
ディープラーニングだけかと思ったら結構数学や非ディープな機械学習手法についても出ました
3つ（＋エンベデッド）の中では個人的に一番難しかったです
JDLA経由の例題はかなり参考になりました
研修から始まり試験で習熟度もわかるので非情報系が体系的に学ぶという意味では非常に為になりました
~~情報系の人まで研修受けなきゃ受験資格得られないのはどうなん？と思う~~

## まとめ

- 資格は過去問ゲー
- 過去問を暗記するだけじゃ学ぶ意味が〜みたいなこと言う人は無視していいと思う
- まずは形にするのが大事で、本質的な理解は後からついてくる
    - コードを書くエンジニアならまずやってみることが重要なのは分かるはず
- **もちろん計画的に勉強できるならその方がいいです**（夏休み最終日に宿題やるタイプなので）
- エンベデッドも2週間で多分受かってるので追記したい

## 関連リンク

- [過去問道場][link-1]
- [Study-AI 模擬テスト][link-2]
- [GRI 模擬試験][link-3]

[link-1]: https://www.ap-siken.com/apkakomon.php
[link-2]: https://study-ai.com/generalist/
[link-3]: https://gri.jp/news/13625
VSCodeからCloud9にSSH接続しようとしたらPermission denied(publickey)と出て沼った話

初投稿になります。拙いところがあるかもしれませんが後学のために備忘録として示しておきます
(こんな初歩的なミスにハマる人がいるかはさておき)

# 結論
ユーザ名はきちんと確認しましょう。
```terminal:Cloud9_Terminal
R4iw3r_Udemy:~ $ cd /home/
R4iw3r_Udemy:/home $ ls
ubuntu
```
R4iw3r_Udemyの部分は自分が任意でつけた名前ですがこの部分はユーザ名ではありません。
`home`ディレクトリ直下にあるディレクトリの名前がユーザ名になります。
自分は上記の方法で確認した、もとい気づきましたが、
```terminal:Cloud9_Terminal
R4iw3r_Udemy:/home $ whoami
ubuntu
```
のほうがディレクトリの移動の必要もなく確実ですね。

# 経緯
Udemyのとある講座でCloud9を用いてRubyの開発入門をするコースがあります。
そこで普段からVSCodeを愛用している自分はCloud9のIDEが肌に合わず、VSCodeのSSHでできないかなと思い

https://qiita.com/hayate_h/items/93273285cdc7372ae569

以下の記事を参考に見よう見まね(脳死ともいう)で接続を試みました。
が、接続できずログを見返すとタイトルのような状況に陥りいろいろ調べてみても解決せず見事に沼りました。

# 原因
講座の方でCloud9の環境を作成する際に、以下のようにUbuntu Serverを選択したことでユーザ名`ec2-user`などとはならず、環境作成もSSH接続の際の設定も脳死でやっていた自分は見事にハマったというわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842805/cf32636d-de09-bc9c-f101-b5c290be2841.png)

# 最後に
今回のは自分がユーザ名をどこで確認すればよいのか知らなかったというのもありますが、灯台下暗しという言葉があるように、思いがけない落とし穴がある可能性があります。  
設定はきちんと確認しましょう。  
経験を積まれた方なら少ないかと思いますがQiitaなどのサイトや講座を見て見よう見まねで環境開発をしてしまうような自分含めた初学者には陥りやすい罠かもしれません。

## P.S.
本記事を投稿後学習を進めていたらメモリ容量が足りなくなったのかSSHが切断されることがちらほらありました。  
あまりに回数が多くこのまま無理して使っていたら時間がいくらあっても足りないと感じたため結局Cloud9のIDEを使うことにしました。
無償利用枠のt2.microではSSHはスペック不足のようです。

# おまけ
本文中のとある講座

https://www.udemy.com/share/101WGM3@MoGGrKYBcNYsF_ZPNl5ny94MZuoqjTXRah2lS4U0BR_gbWqch7hRm9fxENtwoZNaSQ==/

Web開発に必要なものを手を動かしながら一通り学ぶことができ、講師の方は実務での経験も交えながらわかりやすく話してくださいます。
広く浅くという感じですので経験者/中級者以上には知っている内容しかないかもしれませんが、初めて触る際の入口にはもってこいです。
セールの時でであれば23.5時間というボリュームのビデオ講座をお手軽価格で見られコスパ◎です。
興味のある方はぜひ。
Vue CLI に tailwind を導入

## ディレクトリ構成
```
node_modules/
public/
    ├─ index.html
    └─ output.css
src/
    ├─ assets/
           └─ css/
                  └─ input.css
    ├─ components/
           └─ HelloWorld.vue
    ├─ App.vue
    └─ main.ts
package.json
tailwind.config.js
vue.config.js
```

## tailwind インストール
```bash
npm install -D tailwindcss
npx tailwindcss init
```

## tailwind 初期設定

```tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,vue}"],
  theme: {
    extend: {},
  },
  plugins: [],
};
```

## input.css の作成
src/assets/css/input.css を作成

```input.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

## package.json に scripts 追記
これで、 `npm run serve` するだけで tailwind のビルドも一緒に走るようになる
```diff_json
"scripts": {
+ "serve": "npm run watch:tailwind & vue-cli-service serve",
+ "watch:tailwind": "npx tailwindcss -i ./src/assets/css/input.css -o ./public/output.css --watch",
+ "build": "npm run build:tailwind & vue-cli-service build",
+ "build:tailwind": "npx tailwindcss -i ./src/assets/css/input.css -o ./public/output.css",
"lint": "vue-cli-service lint"
},
```

`npm run watch:tailwind` を実行して、public/output.css が生成されるか確認する

## main.ts にて css 読み込み
```diff_typescript
import { createApp } from "vue";
import App from "./App.vue";

// tailwind
+ require("../public/output.css");

createApp(App).mount("#app");
```

## tailwind が反映されるか確認
`npm run serve` を実行

適当にHelloWorld.vue を書き換えて tailwind の class を記述し反映されるか確認
```HelloWorld.vue
<template>
  <h1 class="text-3xl font-bold underline">Hello world!</h1>
  <button class="bg-green-500 font-semibold text-white py-2 px-4 rounded">
    ボタン
  </button>
</template>
```

![スクリーンショット 2022-10-11 22.15.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320035/88252405-997b-865b-0957-a90303e85925.png)

反映されていれば、OK

## 参考
https://tailwindcss.com/docs/installation
Xen とは

## 勉強前イメージ

仮想化のなんかやった気がする。
もっとハード寄りの・・・・

## 調査

### Xen とは

ゼンと読み、GPLv2ライセンスでオープンソースの仮想化ソフトの一つです。
仮想マシンモニタ(VMM)の一つで
ハイパーバイザーとしてコンピュータの資源を一括管理し、ゲストOSには仮想マシンとして振る舞います。
ゲストOSには以下の2つのモードで動作を行います。

- [完全仮想化](https://qiita.com/miyuki_samitani/items/178eff60570eeb8849ce) : 物理マシンにOSとインストールするときと同様、ブートローダーからカーネルを起動
- [準仮想化](https://qiita.com/miyuki_samitani/items/178eff60570eeb8849ce) : オーバーヘッドが少ない方式でハードウェアの拡張はできない

### そもそも仮想化にはタイプがある

仮想化には以下2つのタイプがあります。

- ホスト型

OS上にソフトウェアをインストールし、そのソフトウェアで仮想マシンを実行する方法
仮想化専用OSを用意する必要はないが、HWへのアクセスがホストOSを経由しないといけないので十分性能が出ないデメリットがあります。

- ハイパーバイザー型

サーバへ直接インストールを行って仮想化ソフトを起動する方法
AWSで使用されているXenはハイパーバイザー型です。
ホストOSの機能を使わずにHWの制御が可能です。

ホスト型・ハイパーバイザー型の違いとしては以下のような画像になります。
ホスト型はパソコンの中でVMとしてテスト的に動かすのに適しており、
ハイパーバイザー型は大規模なサービスを稼働させるために使用するのに適しているイメージです。

![1Xen とは - diagrams.net - Google Chrome 2022-10-11 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/064f0b69-3993-42ba-7563-01b3ed409679.png)

## 勉強後イメージ

ホスト型とハイパーバイザー型が知ってるようで全然覚えられてなかったから丁度勉強できてよかった。

## 参考

- [AWSが使用しているXenの動作について](https://www.acrovision.jp/service/aws/?p=1693)
- [Xen](https://e-words.jp/w/Xen.html)
ブラウザ内にPDFを並べて表示

リモートで画面共有しながら説明する際に複数のPDFを並べる必要がありました。

ブラウザ内に表示させたかったので HTML を書いてみました。

# スプリッター

サイズ調整したかったので既存のライブラリを使用しました。

* https://split.js.org/

今回は CDN 経由で利用します。

* https://cdnjs.com/libraries/split.js

# HTML

必要最低限の内容を示します。

```html
<!DOCTYPE html>
<html lang="ja" style="height:100%">
<head>
    <meta charset="utf-8">
    <title>PDF</title>
    <style>
        .gutter { background-color: #eee; }
        .gutter.gutter-vertical { cursor: row-resize; }
    </style>
</head>
<body style="height:100%; margin:0; padding:0">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/split.js/1.6.5/split.min.js"></script>
    <div class="split" style="height:100%">
        <div id="split-0">
            <embed src="1.pdf" type="application/pdf" style="width:100%; height:100%">
        </div>
        <div id="split-1">
            <embed src="2.pdf" type="application/pdf" style="width:100%; height:100%">
        </div>
        <div id="split-2">
            <embed src="3.pdf" type="application/pdf" style="width:100%; height:calc(100% - 8px)">
        </div>
    </div>
    <script>
        Split(["#split-0", "#split-1", "#split-2"], { direction: "vertical", minSize: 10 });
    </script>
</body>
</html>
```

`height:calc(100% - 8px)` で無駄なスクロールバーが出ないように微調整しています。
paizaラーニング レベルアップ問題集 Aランクレベルアップメニュー JavaScript 素数判定

素数判定 (paizaランク C 相当)

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_calculation_step3

JavaScriptで解いてみました。

# 解答例
Nの条件が`1 ≦ N ≦ 10 ^ 10`なので、ふつうに、Nが、2からN-1まで、割り切れるか調べると、タイムオーバする可能性があります。
数学的な証明は省きますが、N-1まで調べなくても、Nの0.5乗(ルートN)の整数まで調べればOKです。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const N = Number(lines[0]);

//Nが１ならば素数でない
if (N === 1) {
    console.log("NO");
//nが２ならば素数    
} else if (N === 2) {
    console.log("YES");
//それ以上の時    
} else {
    //2で割り切れたら4以上の偶数なので素数ではない
    if (N % 2 === 0 ) {
        console.log("NO");
    } else {
        //3以上の奇数で割り切れるか
        for (let i = 3; i <= Math.sqrt(N); i += 2) { //ルートNまででOK
            //割りきれたら素数ではない
            if (N % i === 0) {
                console.log("NO");
                break;
            }
            //最後までいったら素数
            if (i + 2 > Math.sqrt(N)) {
                console.log("YES");
            }
        } //for

    } //if N%2
       
} //if N=1,2
```

# 解答例(C++の場合参考)
N が素数である場合に is_prime が true に、素数でない場合に false にします。
N が 1 である場合には、例外的に is_prime を false にしています。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const n = Number(lines[0]);

let is_prime = true;//素数判定

if (n == 1) {
    is_prime = false;
}

for (let i = 2; i * i <= n; i++) {
  if (n % i == 0) {
    is_prime = false;
  }
}

if (is_prime) {
  console.log("YES");
} else {
  console.log("NO");
}
```

# 解答例(Python3の場合参考)
N が素数である場合に is_prime が true に、素数でない場合に false にします。
N が 1 である場合には、例外的に is_prime を false にしています。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const N = Number(lines[0]);

let is_prime = true;//素数判定

if (N == 1) {
    is_prime = false;
}

for (let i = 2; i <= N**0.5; i++) { //Nの0.5乗まででOK
  if (N % i == 0) {
    is_prime = false;
  }
}

if (is_prime) {
  console.log("YES");
} else {
  console.log("NO");
}
```
Qiitaアカウント作成してみました

# 当面
- 書く予定はありません  
- 資格取得したらノウハウ共有  
- 引き当てたバグの速報とワークアラウンドの共有とか 

# バグ記載例
# Catalyst9300
- Stackのバグ解消されてなくない？Secondary側のIFから設定変更しようとしたら、config同期が取れなくなってSecondary側がreload起こすバグがIOS17台でも起きる。IOS16で解消されているような記載になってるけど。
【Anuglar】Quickstartにて「npm start」すると「TS1005」エラーが出る際の解決方法

# 書籍「Angularアプリケーションプログラミング」における開発環境構築で躓いた

　Anuglarの学習を開始したところ、開発環境構築の段階で躓居ってしまった。グーグル検索で色々探しまわったが、クリアに記述している記事を見つけられなかった。自分でいろいろ試して解決できたので、その内容をまとめて記す。

　Angularの学習書籍「[Angularアプリケーションプログラミング](https://www.amazon.co.jp/dp/B074M54GM5?tag=keiji009-22&linkCode=ogi&th=1&psc=1)」では、Angular公式が用意している学習教材レポジトリ「quickstart」で開発環境を整える。ここのソースと、現在ダウンロードが可能なフレームワークのバージョンがあっていないため、ビルドができないのである。npm startを実行すると、TS1005エラーでビルドができない。エラー内容は,が無いことを示すものだが、該当ファイルを開いても、,の不足部分は無い。現在ダウンロード可能なTypeScriptとRxjsのバージョンと、プログラム内で利用指定しているバージョンが異なることが直接の原因のようである。.jsonファイルの修正が必要となる。

# 解決策：installするversion指定を新しくする

### 1.json ファイルを修正する

　　フォルダ内の最上階層にあるpackage.jsonファイルを修正する。TypeScriptとRxjsのversionを書き換える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460864/16bac595-3b2a-3aaf-7178-215b12dd1ede.png)

　私の環境でインストール済みのTypeScriptのverが4.8.3のため、4.8.3と修正。rxjsのバージョンは、5.5.12に修正

### 2.  再度 npm installを実行する
### 3.  再度 npm start を実行する

上記の手順でnpm start が無事にビルド可能となる。
# 余談

　configで指定しているバージョンと、現在利用な可能なバージョンが異なることによるエラーであることはすぐに察しがついた。しかし、どのファイルを修正すればいいのか、修正してnpm start してもエラーが出続けていた。

　必要な手順は、jsonのversionを書き換えた後、再度installをすることだった。これに気付くのに時間がかかってしまった。

# 参考ページ

　**[FAQ［Angularアプリケーションプログラミング］](https://wings.msn.to/index.php/-/A-06/978-4-7741-9130-0/)**

　↑著者が自身のサイトで当現象について触れている

# 追記

 第3章で、筆者のサンプルソースをダウンロードし、WEBサーバをnpm start をすると、同様のエラーで起動しない。上記と同じようにpackage.jsonを修正して、npm installから実施し直す必要がある
React + TypeScript + Plotly で3次元グラフ　サンプルコード付き

# はじめに
Plotlyは3次元グラフも作れて表示後も拡大や画像出力も対応している便利ライブラリだったので、Angularで使っていたのですがReactでも使いたいシーンが出てきました。
その際に、どのライブラリをインストールしたらいいか調べたり、こと3次元グラフにおいてサクッとコピペで動かしつついじって覚える良さげなコードが転がってなかったので、記事にしてみました。

ちなみに今回の3次元グラフの動機に関しては、なんかすごいね、と思わせたい意図で導入しただけで~~こんなのは飾りです。偉い人にはそれがわからんのです。~~ 

個人的には**グラフ表示をする際は「ひと目でわかりやすい」を大事にして欲しい**と思います。
~~・・・が、偉い人にはそれがわk~~

そして大好きなTypeScriptの旨みを生かすためにも、
**せっかくの型サポートの恩恵を受けられるように、ここに型指定しておくといいんじゃない？**
という意味でサンプルコードを書いています。

# 結論的手順

前提としてReact/Typescriptの環境は整っているものとします。
### インストール
ライブラリのインストールと型のインストール
```
npm i plotly.js react-plotly.js
npm i --save-dev @types/plotly.js @types/react-plotly.js
```

### サンプルコード
ソースコードを読めばわかるのですが、ミソとしてはデータ用の変数にPlotData型を指定をすると型サポートが効いて、設定できるプロパティ（グラフ表示の設定項目）がわかるので便利ってことです。（で、ここまでくれば詰まった際のドキュメントも読みやすいはず）


``` ThreeGraph.tsx
import React from 'react';
import Plot from 'react-plotly.js';
import {Layout, PlotData} from "plotly.js";

type Props = {}

const ThreeGraph: React.FC<Props> = () => {

  // データの型指定でPartial<PlotData>をつけておくと型サポート使えて便利です
  // データ群1
  const data1:Partial<PlotData> = {
    type: 'scatter3d',
    x: [1,5,9,7],
    y: [-9,4,3,0],
    z: [2,2,2,2],
    marker:{symbol:'circle', opacity:1, size:3},
    mode: 'markers',
    text: ['A', 'B', 'C', 'D'],
    name: 'Group_1',
  }
  
  // データ群2 ちなみに群1と群2は自動で色分けしてくれる。便利！
  // 手動で設定したいなら marker:{color:***}
  const data2:Partial<PlotData> = {
    type: 'scatter3d',
    x: [-6,5,3,-2],
    y: [-4,9,4,6],
    z: [-2,-2,-2,-2],
    marker:{symbol:'circle', opacity:1, size:3},
    mode: 'markers',
    text: ['E', 'F', 'G', 'H'],
    name: 'Group_2',
  }
  
  // 以下はXYZの軸が欲しかったので無理矢理作った
  const lineX:Partial<PlotData> = {
    type: 'scatter3d',
    x:[-10,10],
    y:[0,0],
    z:[0,0],
    mode: 'lines',
    line:{color:'black'}
  };
  
  const lineY:Partial<PlotData> = {
    type: 'scatter3d',
    x:[0,0],
    y:[-10,10],
    z:[0,0],
    mode: 'lines',
    line:{color:'black'}
  };
  
  const lineZ:Partial<PlotData> = {
    type: 'scatter3d',
    x:[0,0],
    y:[0,0],
    z:[-10,10],
    mode: 'lines',
    line:{color:'black'}
  };
  
  const layout1:Partial<Layout> = { title: '３次元グラフ'};
  
  // 下にある<Plot data = {}> のdataの型は Partial<PlotData>[]
  // サンプルとしてわかりやすいように型を書いています
  const allData:Partial<PlotData>[] = [data1, data2, lineX, lineY, lineZ]
  
  return (
    <Plot data={allData} layout={layout1} />
  );
};

export default ThreeGraph;

```

上記コンポーネントで下記のようなグラフが出ます。（スクショですいません）
実際のブラウザ上ではぐりぐり回せます。

あとは触りながらドキュメント読んで更新していきましょうー
![newplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295930/12071c56-df48-81b2-5b1b-a552d5f5c81e.png)

ちなみに余談ですが、
ソースコード自体Partial使った型指定をしていますが、もし仮にPartialでオプション化してなかったら元々のプロパティを全て記述しなければいけません。つまり地獄。

Partialってなんぞ、という方は[こちら](https://typescriptbook.jp/reference/type-reuse/utility-types/partial)
ONLYOFFICE Documents 5.5 for Android、パスワードや塗りつぶし図形、UIを改善

みなさん、こんにちは！ONLYOFFICE Documents for Androidをバージョン5.5にアップデートしました。今回のリリースでは、パスワード保護、塗りつぶし図形、より直感的なインターフェースなど、モバイルでの文書編集がパワーアップしています。

## モバイルビュー

モバイルビューで、テキスト文書内のコンテンツをより快適に閲覧できます。

どこにあるのか：ドキュメントを開く → 「設定」アイコンをタップ → 「モバイルビュー」スイッチャー

また、ドキュメントのデフォルトの表示モードとして設定することも可能です。

## パスワードによる保護

機密ファイルへの不正アクセスを禁止するためのパスワードを設定します。あらゆる種類の文書で利用可能です。

どこにあるのか：ドキュメントを開く → 「設定」アイコンをタップ → 「保護機能」

## 図形に対する塗りつぶしやカスタマイズ

新しいフィリングタイプ、グラデーション、テクスチャ、パターンを追加しました。

どこにあるのか：「シェイプ」設定 → 「シェイプ」タブ → 「スタイル」 → 「シェイプの塗りつぶし」 → 「グラデーション/画像/パターン」 ONLYOFFICE Documents 5.5 for Android with passwords, shape filling, and UI improvements

また、陰影をつけることで形状を立体的に見せることができます。

## 表計算ソフトの地域設定

スプレッドシートの設定で地域を選択すると、通貨、日付、時刻が自動的に変換されます。

どこにあるのか：スプレッドシートを開く → 右上の「設定」アイコンをタップ → 「地域設定」

数値のデリミターも手動で調整可能です。

## プッシュ通知

ドキュメントの最新変更点をチェックするために、通知を有効にしましょう。

どこにあるのか： 「設定」→「ONLYOFFICE Documents」→「通知を許可する」

## その他の改善点

* ドキュメント作成時のショートカット（アプリアイコンを長押ししてファイル形式を選択）
* 検索とフィルタリングの更新
* パフォーマンスの向上とバグフィックス

ONLYOFFICE Documents v5.5をお使いのAndroidデバイスに今すぐ無料でダウンロードしましょう。

[**今すぐダウンロード**](https://play.google.com/store/apps/details?id=com.onlyoffice.documents)
swift UI 画面の向き　横

![スクリーンショット 2022-10-11 21.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/0d7f971e-3202-9a79-2937-dc7d0addf372.png)

UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight

どちらの向きも対応させたいのであれば両方、どちらか片方ならどちらかでOKです