OmniAICreator/Qiita-1.07M huggingface dataset:
CommonLispでQueueを実装

## ソース

```common-lisp:queue.lisp
(provide :queue)

(defpackage :queue
  (:use :cl)
  (:export :create
           :enqueue
           :dequeue
           :emptyp
           :list-from))
(in-package :queue)

(defstruct queue
  (list nil)
  (tail nil))

(defun create (l)
  (make-queue :list l
              :tail (last l)))

(defun dequeue (q)
  (let* ((l (queue-list q))
         (head (car l)))
    (setf (queue-list q) (cdr l))
    head))

(defun enqueue1 (q element)
  (let ((new-tail (list element)))
    (if (queue-list q)
        (setf (cdr (queue-tail q)) new-tail)
        (progn
          (setf (queue-list q) new-tail)
          (setf (queue-tail q) new-tail)))
    (setf (queue-tail q) new-tail))
  q)

(defun enqueue (q &rest elements)
  (dolist (e elements)
    (enqueue1 q e))
  q)

(defun emptyp (q)
  (null (queue-list q)))

(defun list-from (q)
  (queue-list q))
```

## 使い方

```common-lisp:main.lisp
(require :queue "queue.lisp")

(defun main ()
  (let ((q (queue:create '())))
    (print (queue:emptyp q))      ; T
    (print (queue:dequeue q))     ; NIL
    (print (queue:enqueue q 4))   ; #S(QUEUE::QUEUE :LIST (4) :TAIL (4))
    (print (queue:enqueue q nil)) ; #S(QUEUE::QUEUE :LIST (4 NIL) :TAIL (NIL))
    (print (queue:enqueue q 5 6)) ; #S(QUEUE::QUEUE :LIST (4 NIL 5 6) :TAIL (6))
    (print (queue:dequeue q))     ; 4
    (print (queue:emptyp q))))    ; NIL
```
New Relic REST API を使ってコードをプッシュするときにマーカー表示する

## Newrelicとは？

そもそもNewrelicとはどういうものなのか？

> New Relic は、デジタルビジネスのあらゆる重要指標を観測可能にする「オブザーバビリティ（可観測性）プラットフォーム」を提供しています。デジタルビジネスを構成するアプリケーションやインフラストラクチャだけでなく、ユーザー側の顧客体験状況までをも観測可能にするため、企業はデジタルサービスの障害検知、顧客体験の低下検知、潜在的な問題やボトルネックを早期特定し解決する DevOps チームを生み出します。
> 
> 
> 全世界で15,400社以上、ならびにFortune 100企業の過半数で導入されています。日本でもすでに数百社を超えるお客様のデジタル変革を支援しています。
> 

## コードをプッシュしたタイミングをマーカー表示する

今回やりたかったことは、新しいコードをPushしたタイミングで、Newrelicの管理画面にマーカーを表示し、

修正後のコードでどのぐらいサイトの改善ができたかを明確にしたかった。

マーカーを表示するメリットとして、修正の前後のパフォーマンスを比較することができるので、修正によってどのぐらいサイトが改善されたかを明確にすることができます。

## 実装方法

今回は以下の工程で実装を進めてい行きました。

- コードの修正
- GitへPush
    - Github ActionsでHook処理を行う
    - Newrelic Rest APIを使用
- Newrelicに連携
- Newrelic管理画面でマーカーを確認する

### Newrelic REST APIに必要な情報

- 必須項目
    - アプリケーションID
    - Git SHA, リビジョン
- オプション
    - チェンジログ
    - 説明
    - デプロイメントを投稿したユーザー
    - デプロイメントのタイムスタンプ

### リクエストのサンプル

以下のような形式でPush時にcrulでPOSTをします。

```json
curl -X POST 'https://api.newrelic.com/v2/applications/{application_id}/deployments.json' \
     -H 'X-Api-Key: { api-key }' -i \
     -H 'Content-Type: application/json' \
     -d \
'{
  "deployment": {
    "revision": "string",
    "changelog": "string",
    "description": "string",
    "user": "string"
  }
}'
```

### Github Actions

プッシュを行った際に、Curlコマンドを叩く処理をGithub Actionsに記述することでマーカーを自動で生成することができます。

```yml
name: newrelic_deployment

on:
  push:
    branches:
      - '**'
  workflow_dispatch:

jobs:  
  build:
    runs-on: ubuntu-latest
    steps:            
      - name: Newleric Deployment
        if: always()
        run: |
          if [ '${{ job.status }}' = 'success'　]; then
            COLOR="good"
          else
            COLOR="danger"
          fi

          curl -X POST 'https://api.newrelic.com/v2/applications/{application_id}/deployments.json' \
             -H 'X-Api-Key: { api-key }' -i \
             -H 'Content-Type: application/json' \
             -d \
            '{
              "deployment": {
                "revision": "string",
                "changelog": "string",
                "description": "string",
                "user": "string"
              }
            }'
```

## まとめ

今回はNewrelicのREST APIを使ってプッシュ時にCurlでPOSTする方法について紹介をしてきました。

マーカーを付けることで修正前と修正後でどのような変化があったかを明確にすることができます。
ReactNative+ExpoでAndroidアプリをリリース

# はじめに
この記事は [Google Developer Student Clubs Japan Advent Calendar 2022](https://qiita.com/advent-calendar/2022/gdsc-jp) 2日目の記事です。
はじめまして！GDSC HitotsubashiのLeadをやっております、oreoです。
一橋大学法学部に在籍中で、エンジニアインターンではReactを使ったwebアプリ開発に参加しています。
個人では、GDSC Hitotsubashiに所属しているメンバーとReactNativeでモバイルアプリの開発もしており、先日Androidアプリをリリースしました。リリースする際にExpoが便利だと感じたので記事にしました。
# ReactNativeとは
Expoの説明に入る前にReactNativeの説明をします。
ReactNativeはモバイルアプリケーションフレームワークです。iOSとAndroidの両方で動作するクロスプラットフォーム開発が可能です。同じクロスプラットフォームアプリ開発のフレームワークとしては、Googleが開発したFlutterなどがあります。
# Expoとは
ExpoはReactNative用の開発ツールです。ネイティブ機能の組み込みに一部制約があるようですが、開発環境の整備や実機での動作確認が簡単であるというメリットがあります。実機テストはExpo Goというアプリを実機にインストールして開き、expoのアカウントでログインするだけでテストしたいアプリを動かすことができます。今回はExpoの環境構築は割愛させていただきます。
# Androidアプリをリリースする際に便利だと感じたこと
Androidアプリをリリースするためには通常[Google Play Console](https://developer.android.com/distribute/console?hl=ja)というツールを使用します。アプリのテスト版や製品版を公開するためにはここにaabファイル（Android App Bundle）をアップロードする必要があります。
![2022-12-01 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1488423/5a7017ac-017f-aad9-d786-9857a76c2df8.png)
aabを作成するためにまずビルドする必要がありますが、これはExpo CLIを使ってコマンドライン上で`eas build`と打てばビルドできます。そして[Expo](https://expo.dev)のアプリのページでビルドの状況を確認したり、aabファイルをダウンロードしたりすることができます。
このように簡単にaabファイルをアップロードすることができ、あまり躓かなかったのですが、最終テスト版をアップロードする際に少し躓きました。![S__10297354.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1488423/240870b6-0c64-d9a9-c4e0-9a0492aaa111.jpeg)
APIレベルが31に達していなかったためaabファイルをアップロードすることができませんでした。AndroidアプリのAPIレベルを変更するためには通常build.gradleとAndroidManifest.xmlにAPIレベルを記述する必要があるそうですが、expoのアプリにはbuild.gradleがなかったため困りました。しかし、色々調べて試してみたところ、Expo SDKをアップデートするだけでAPIレベルが31に達しました。Expo SDKを最新に保っていればこちらで特に記述しなくてもAPIレベルの制限に引っかからないのは便利だと思いました。
ということで無事にリリースできました。
# さいごに
今回はReactNativeとExpoとAndroidアプリのリリースの手順を簡単に紹介しました。
GDSC Hitotsubashiはまだまだメンバーを募集中です。私たちと一緒にアプリを開発してみませんか？
最後までお読みいただきありがとうございました。
整える手順

プロデルには，数値や日付を指定した書式で出力する`整える`手順があります。[マニュアル](https://docs.utopiat.net/rdr/manual/verbs/totonoeru.html)によれば，

0. 基本:【内容】を【書式】桁に整える：文字列
0. 日時形式を【書式】に整える
0. 数値を【書式】に、整える：文字列
0. 日時期間形式を【書式】に、整える：文字列

の4つです。

それぞれの使い方を確認します。

## 桁に整える

```プロデル
100を5桁に整えて報告する。
1.00を5桁に整えて報告する。
-1.0を5桁に整えて報告する。
’-2.3を5桁に整えて報告する。’エラー
100000を5桁に整えて報告する。
1000.000を5桁に整えて報告する。
-1000.000を5桁に整えて報告する。
’-2.3456を5桁に整えて報告する。’エラー
「あ」を5桁に整えて報告する。
「あいうえおかきくけこ」を5桁に整えて報告する。
```

```
00100
00001
-00001
100000
01000
-01000
    あ
あいうえおかきくけこ
```
数値は整数でのみ使えます。
負の数については，-は桁数に入りません。
文字列の場合，右寄せになります。ただち，数値と見なせる文字列は数値と同じ結果になります。

## 日時形式を整える

```プロデル
日付は、「2022/12/02 21:01:02」を日時形式化
日付を【書式】に整えて報告する。
```

### 一括指定

|書式|出力|
|---|---|
|d|2022/12/02|
|F|2022年12月2日 21:01:02|
|f|2022年12月2日 21:01|
|g|令和4年12月2日 21:01|
|G|2022/12/02 21:01:02|
|O|2022-12-02T21:01:02.0000000|
|o|2022-12-02T21:01:02.0000000|
|R|Fri, 02 Dec 2022 21:01:02 GMT|
|r|Fri, 02 Dec 2022 21:01:02 GMT|
|s|2022-12-02T21:01:02|
|T|21:01:02|
|t|21:01|
|U|2022年12月2日 21:01:02|
|u|2022-12-02 21:01:02Z|

### 個別指定

|書式（例）|出力|
|---|---|
|gy:gyy|令和4:令和04|
|g:gg|令和:令和|
|y:yy:yyy:yyyy:yyyyy|22:22:2022:2022:02022|
|M:MM:MMM:MMMM|12:12:12:12月|
|d:dd:ddd:dddd|2:02:金:金曜日|
|t:tt|午:午後|
|H:HH:h:hh|21:21:9:09|
|m:mm|1:01|
|s:ss|2:02|
|f:ff:fff:ffff:fffff:ffffff:fffffff|0:00:000:0000:00000:000000:0000000|
|z,zz,zzz|+9,+09,+09:00|

※fは秒よりも小さい単位（fffはミリ秒）

## 数値を整える

[サンプルコード](https://docs.utopiat.net/rdr/manual/primitive/number.htm#%E6%95%B4%E3%81%88%E3%82%8B)の解説をします。

```プロデル
1.235を「00.00」に整えて報告する
```

0は任意の数字1桁を表します。.は小数点です。この場合，2桁.2桁にするよう指定していることになります。

```
01.24
```

整数部分は1ですが，2桁にせねばならないので01になります。小数部分は235ですが，2桁にせねばならないので24になります。

```プロデル
0.123456を「#,0」に整えて報告する
```

#は0と異なり，対応する数字がなければ0で埋めずに表示しません。また，不要な0は省略されます。
0,#や#,#あるいは0,0とすると，カンマ区切りになります。.がないので，小数点以下は表示しない指定です。

```
0
```

```プロデル
0.123456を「0.00%」に整えて報告する
```
%をつけるとパーセントが付きます。

```
12.35%
```

```プロデル
30を「000;[000];ゼロ」に整えて報告する
-30を「000;[000];ゼロ」に整えて報告する
0を「000;[000];ゼロ」に整えて報告する
```

セミコロンで区切ると，`正の値の場合;負の値の場合;ゼロの場合`という意味になります。
セミコロン1つの場合は，`0以上の値の場合;負の値の場合`です。
サンプルの負の場合の値が`[000]`となっていますが，文字列内で`[]`を使うと式を表しますから，ここでは数値の000が指定されていることになります。数値の000は0なので，3桁にはなりません。また，負の値にマイナスを付けたい場合は-をつけておく必要があります。

```
030
30
ゼロ
```

## 日付期間形式を整える

力尽きました。
【Git】誤ったブランチで作業した場合の対処法

## 対処法

以下のコマンドを実行して変更を正しいブランチに移動します。  

```terminal
git stash push

git switch 正しいブランチ

git stash pop
```

- `git stash push`  
  変更を一時退避する。  
  Untracked filesも含める場合には`-u`を追加する。  
- `git switch ブランチ`  
  ブランチを移動する。  
- `git stash pop`  
  一時退避させた変更を反映する。  
  同時に退避したデータを削除する。  
  正しいブランチがない場合には`git stash branch <branchname>`を実行するとブランチの作成と退避した変更の反映が同時に実行できる。
ベテランエンジニアに伝えたいこと

## やさしい気持ちでお読みください
アドベントカレンダー2日目にして早くも存続の危機に直面しておりポエムで繋ぎますから許してください。

## 人の話は聞こう
去年の話になりますが、自宅のPCが不調で知り合いに相談したら、電源変えろと言われました。
僕の経験上、PCが壊れるときは大体ストレージで、たまにマザーが燃えたりグラボ焼いたりですが、電源なんか10年経ってもピンピンしてます。

それを、よく見もしないで即答するなんて、おまえはなにを言っとるんだ。
それで忠告を無視して、ストレージ変えたり、マザー変えたり、グラボ変えたり（去年のグラボは高かった）しましたが、改善せず、最後は電源変えたら直りました。ええ。

人の話は聞きましょう。
自分の経験なんてハナクソみたいなもんです。

あとで聞いた話ですけど、電源は3年くらいで壊れるらしいです。
コルセアは初期不良が多いです。サポートは親切です。

## 人の話をうのみにしない
トラブルのときって焦ってるから、状況判断を誤ります。
証拠がslackに残ってると通報されても、どうか落ち着いてください。

「この書き込みを見てください、こいつが犯人です。」

何しとんねんワレと打ち込んだあとよく見たら、トラブルとは全く無縁の1ヶ月前の書き込みでした。
鳩が豆鉄砲を食らったような顔というのを初めてみました。人から聞いた話です。
半年前の飲みのお誘いにレスしたこともあります。たのしいしょくばです。

## 最後に
もう最後です。名残惜しいです。
教訓めいたことを書こうと思いましたがやめておきます。
明日はもう少しエンジニアぽいの書いてくれるといいなあ。
新人エンジニアは何も考えずに手を上げようという話

WHIの7つの「Value」に沿ったエピソードを語ってください！ by Works Human Intelligence Advent Calendar 2022

### なぜこのカレンダーに参加したのか

私は現在正社員のwebエンジニアとしてお仕事させてもらっています。(バックエンドが好きだけど、フロントも書く)
アルバイトも含めるとエンジニア歴がもう少しで2年になるというところでWHIさんのAdventカレンダーを見つけたので、少しポエムっぽい？記事を書きたいなと思い、参加させていただくことにしました。

自分への戒めも含めてこの記事を書きたいなと思いました。

WHIの7つの「Value」は以下のものを掲げています。

- Work fun! 「遊び心で仕事を楽しむ」
- Ownership「当事者意識を持ってやり切る」
- Respect「一緒に働く仲間とお客様を尊重する」
- Know our Customers「お客様の価値を創造する」
- Solve「本質を追求し問題を解決する」
- Honor the Challenge「失敗を恐れず挑戦する」
- Integrity「品格を持って誠実に取り組む」

この中で自分が好きなvalue、話をしたいなと思ったvalueは以下のvalueです。
**Honor the Challenge「失敗を恐れず挑戦する」**

これについて少し書きたいと思います。

### valueについての考え
**失敗を恐れずに挑戦をする**というのはなかなか簡単なようでできない人も多いと思います。
誰しも**失敗**というのは怖いものです。
エンジニアでゆうと
そもそも自分のレベルで実装できるのか？、、、
バグを生み出したらどうしよう、、、
障害が起きたら、、、
パフォーマンスが急激に落ちたら、、、
などなど考え出すと色々あります。

また、歴が長い人ほど、できて当たり前、失敗しなくて当たり前という風に見られたりするので、なおさら失敗は怖いものだと思います。
あの人にできないって思われたらどうしよう、、、
周りからのできないというレッテルを貼られるのでは？、、、
失敗が怖い、、、

### 自分のマインド
上記のことを踏まえると、自分も失敗が怖いけど、、、とにかく若いうち、経験が浅いうちに色々やらかした方が良いのでは？とやはり思います。

経験が浅いから失敗するだろう、多分できないだろう、あいつには無理だよと思われている方が気楽ですし、ハードルがすんごい低いです。
だから少々やらかしても良いから(よくはないけど)、失敗しそうなタスクを今のうちにいっぱいやっておきたいなと思うわけです。

なので、僕は自分がやらかしそうなタスク、パッと見出来なさそうなタスクをいつもやるようにしています。
今できることだけやっていても、失敗しない代わりに、自分は成長もしないし、良い意味でも悪い意味でも**大事な経験**ができないからです。

また、わからない、できないタスクの方が頭を使うし、個人的には楽しいですね。
のめりこめるというか、時間が気づいたらこんなに経っていたみたいな。

ここで題名のことをこの記事を見ている方に伝えたいと思うわけです。

**エンジニアは何も考えずに手を上げよう**

経験の浅い人ほど、失敗はどうとか何も考えずに降ってきたタスクが難しかろうがなんだろうが、脳死で手を上げてやってみようという話です。
というか難しそうなやつはむしろ絶対やった方がいいですよね。
良い経験値が積めるはず！

そうやって色々経験して、自分のできることの幅を広げることがエンジニアにとっても社会人にとっても必要かなと思います。

実装のやり方がわからなければ先輩のエンジニアに泣きつけば良いし、障害が起きたら、先輩のエンジニアに泣きつけば良いんです。
その時は方針だけ聞くようにして、答えをもらわないようにしましょう。
自分で考える癖が無くなりますから。

本当に困った時、迷った時は良い感じに先輩エンジニアに泣きつけば良いというのが僕の考えです。

また、その失敗はチームの責任でもあるはずなんです。
コードレビューや、テストも通ったはずなのに、起こるバグはみんなが見逃しているということ。
その人だけじゃなく、他のみんなの責任でもあるのでは？という考えもありますね。

仕事における失敗って、お客さんに迷惑をかけたとか、障害を起こしたとか色々あるかと思いますが、個人的には大事なすごく大事な経験なのかなとも思います。

うまくいった時より、やらかした経験の方が自分の中に**色濃く残る**ものなので、同じ失敗を踏まないことが多いのかなという気がしています。

### 自分が思う市場価値の高いエンジニア
自分が思う市場価値の高いエンジニアはやはり、難しいことを経験したり多くの失敗をしているのではないか？と思います。
経験した深さが深い人ほど話せることは多いですし、自分から何もやってこなかった人は過去を振り返ってみても何をやっていたっけ？となるわけです。

なので、エンジニアとして成長するためにも**失敗を恐れずに挑戦をする**ということを掲げて、仕事をしているだけでもどんどん経験値が増え、価値も高まってくるのではないかと思います。


### 総括
今回はWHIさんの7つのvalueのうちの一つ
**失敗を恐れずに挑戦をする**
について少し記事を書いてみました。

失敗しても良いよとは言いませんが、フォローできる、リカバリーできるようにしておけば失敗の怖さも軽減するはず！
というか**失敗**という捉え方をやめて、**良い経験**という捉える方が良いかもしれません。


少しでも良いな、参考になったなという方はLGTMを押してくださると幸いです。

自分からどんどん経験や失敗をしていくようにしましょう！
僕も頑張ります！

最後まで見ていただきありがとうございました！
GCEのデフォルトサービスアカウントにEditor権限を渡さない方法

Google Compute Engineのインスタンスを立ち上げるときに、特に指定をしない場合はデフォルトのサービスアカウントが紐づくことになります。

https://cloud.google.com/compute/docs/access/service-accounts#default_service_account

このサービスアカウントは、`PROJECT_NUMBER-compute@developer.gserviceaccount.com` というアカウント名でEditor権限をもちます。
Editor権限はGCPにおいてかなり強い権限であり、IAM系以外のほぼ全ての操作を行うことができます。
そのため、多くの場合でこの権限は過剰です。

このデフォルトサービスアカウントの生成そのものを停止することはできませんが、Editor権限の付与を停止することはできます。
停止をするためにOrganization Policyを使います。

`automaticIamGrantsForDefaultServiceAccounts` というPolicyをONにすることで、そのポリシーが適用されたOrganization, Folder, Projectで生成されたデフォルトサービスアカウントがEditor権限を持たなくなります。
そして、その後に必要な権限だけを付与することができます。

https://cloud.google.com/resource-manager/docs/organization-policy/restricting-service-accounts#disable_service_account_default_grants

このポリシーをOrganizationレベルで適用する例を以下に示します。
これを適用するとそのOrganization内で新たに作成されるデフォルトサービスアカウントが権限を持たない状態になります。
なお、既に生成されているサービスアカウントの権限が剥奪されることはなく、それらの権限はそのままになります。

```terraform
data "google_organization" "org" {
  domain = "<Orgのドメイン名>"
}

resource "google_organization_policy" "gce-default-sa" {
  org_id     = data.google_organization.org.org_id
  constraint = "iam.automaticIamGrantsForDefaultServiceAccounts"

  boolean_policy {
    enforced = true
  }
}
```
Pythonで中学 比例の計算・グラフを描く方法

Pythonで中学 数学の比例の計算を解く方法とグラフを描く方法を紹介します。

## 準備1

公式を頭に入れておきます。

**y=ax （aは比例定数）**

## 準備2

Pythonで **中学 文字式・方程式** の計算ができるようにしておきます。

やり方はこちら

**Pythonで中学 文字式の計算 - Qiita https://qiita.com/akiba_burari/items/55ddae0c065fdccdef16**

https://qiita.com/akiba_burari/items/55ddae0c065fdccdef16

**Pythonで中学方程式の計算 - Qiita https://qiita.com/akiba_burari/items/d185a2224c7bb87e5cdf**

https://qiita.com/akiba_burari/items/d185a2224c7bb87e5cdf

## 比例の計算問題を解く

実際に中学の比例 計算問題を解いていきます。

### Q1  yはxに比例し、x=6のとき、y=-18である。このとき、x、yの関係を式に表すと、yの値はいくつになりますか？

**＜解き方＞**


公式「y=ax」にxの値とyの値を代入する


-18=6a

-3=a
a=-3

この値を公式にあてはめると、

y=-3x

になる

（答え）-3x

普通に計算した方が早いですが、今回はあえて**Python**でこの問題を解いてみます。

これをPythonで解くと、以下のようになります。

コードをコピペして試してみてください。

```
import sympy 

x = sympy.Symbol('x') 
y = sympy.Symbol('y') 
a = sympy.Symbol('a') 

expr1=-18 #左辺
expr2=-(6*a)　#右辺 マイナスをかける

print(sympy.solve(expr1+expr2, a)) #aの値を出す
#出力結果[-3]
```
a=-3となり、公式にあてはめると、

y=-3x

（答え）-3x



## 比例のグラフを描く

次は比例のグラフを描いていきます。

### 問題 y=3xのグラフを描きなさい。

**＜解き方＞**

x=1のときのyの値を求める

y=3

x=2のときのyの値を求める

y=3*2
y=6

※以下、省略

これらの値をもとにグラフを「**手書き**」で描いていくのが一般的な方法です。

しかし、手で描くのは非常に面倒です。

そこで今回はPythonのライブラリ「**Matplotlib**」を使って描いていきます。


## Matplotlibのインストール

ターミナル上でMatplotlibをインストールします。


```
pip install matplotlib
```

## コードを書く

以下のコードをコピペしてpyファイルとして保存し、実行してみてください。
```
import numpy as np
import matplotlib.pyplot as plt

x = [1, 2] # x座標
y = [3, 6] # y座標

plt.plot(x,y) 
plt.savefig('figure01.jpg') #画像として保存
```

作成した画像はローカルストレージ上に保存されています。

Chromebookの場合、「ファイル」フォルダを開き、

Linuxの保存ファイルを確認してください。

figure01.jpg

ファイル開くと、グラフが表示されます。

![](https://github.com/AkibaBurari/zenn_connect/blob/main/images/figure01.jpg?raw=true)


Matplotlibを使うと、いろいろなグラフを描くことができます。

参考サイトで確認し、いろいろと試してみてください。

## 参考サイト 一覧

【初心者向け】Matplotlib入門 | Pythonを使ってデータを可視化してみよう！ | AI Academy Media https://aiacademy.jp/media/?p=154

【Python】matplotlibでグラフを作成する方法【総まとめ】 - 理系のための備忘録 https://science-log.com/pc%E9%96%A2%E9%80%A3/%E3%80%90python%E3%80%91matplotlib%E3%81%A7%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%80%90%E7%B7%8F%E3%81%BE%E3%81%A8%E3%82%81%E3%80%91/

Linuxで画像ファイルを表示する - Qiita https://qiita.com/hitoshi_xyz/items/75359cb4891e28cb0e40

## 関連記事

【超基礎編】Pythonで中学 数学の問題を自動作成する方法 - Qiita 

https://qiita.com/akiba_burari/items/f8a11cf0533b889e0af3

Pythonで中学方程式の計算 - Qiita 

https://qiita.com/akiba_burari/items/d185a2224c7bb87e5cdf

Pythonで中学 文字式の計算 - Qiita 

https://qiita.com/akiba_burari/items/55ddae0c065fdccdef16

Python で計算する準備　足し算・引き算・掛け算・割り算・分数・累乗 - Qiita 

https://qiita.com/akiba_burari/items/5bb4c083b30768a33aa1
CpawCTF Writeup Level 2 Q18.[Forensic]leaf in forest (注意<spoiler>)

# Q18.[Forensic]leaf in forest
```
このファイルの中にはフラグがあります。探してください。
フラグはすべて小文字です！
```

ファイルを調べる
```
$ file misc100 
misc100: pcap capture file, microsecond ts (little-endian) - version 0.0 (linktype#1768711542, capture length 1869357413)
```
pcapと書かかれているので拡張子を.pcapをつけwiresharkで開こうとするが何も出てこない。

そこでcat misc100を入力すると大量のlovelive!が出てくる。
lovelive!の文字を消せばフラグが出てきそう。

```:main.cpp
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main(){
    ifstream reading_file;
    string filename = "misc100";
    reading_file.open(filename, ios::in);
    string reading_line_buffer;
    while(getline(reading_file, reading_line_buffer));
    string chars = "lovelive!";
    for (char c: chars) {
        reading_line_buffer.erase(remove(reading_line_buffer.begin(), reading_line_buffer.end(), c), reading_line_buffer.end());
    }
    cout << reading_line_buffer;
}
```

```
>g++ main.cpp
>a.exe
ﾔﾃｲ｡％CCCPPPAAAWWW{{{MMMGGGRRREEEPPP}}}
```

cpaw{mgrep}
国内におけるMLOpsサービス事例について

# はじめに
こちらの記事は[インテックアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/intec)の2日目の記事です。
本記事では、MLOpsに関するサービスについて調査した内容をまとめていきます。

MLOpsは、Google Cloud Next 2018で有名になった概念で、**DevOps for ML**として、機械学習システム特有の課題解決のために導入されています。そこから時間が経ち、MLOpsが各社で徐々にサービス化されてきました。

MLOpsの概要については、[こちらの記事](https://qiita.com/nokoxxx1212/items/d2c36b0b22ab0da6c759)に大変わかりやすくまとまっていますので、一読をお勧めします。


# 対象読者
- MLOpsに興味のある方
- 機械学習システムを扱っている or 扱ったことがある方


# MLOpsサービス
ここからは、現在MLOpsをサービスとして提供している企業とそのサービス内容について、まとめていきます。

## NEC
NECでは、**モデルの作成から運用支援までのライフサイクルをトータルに支援**する、MLOpsサービスを提供しています。
具体的には、AIを実運用へ導入した後の運用のプロセスと必要なテンプレートを整備したソリューションのようです。

~~~
挙げている課題
    - 検証時に精度の出ていたモデルが、実運用では精度が出なくなった
    - 精度を上げるためにモデルを再学習しても、精度が上がらない
~~~

### サービス内容について
| 提供サービス | サービスの詳細 |
|:-|:-|
| モデルのモニタリング  |  定常的なモデルのモニタリング <br> 精度劣化やデータの傾向変化時にアラート送信および次のアクションの提言 |
| モデルの更新  | モデルの再学習 <br> 再学習後のモデルと運用中のモデルの比較  |
| モデルの継続的な改善  | 業務内容変更に応じた分析内容等の変更 <br> 業務遂行時の課題解決案の提言  |

https://jpn.nec.com/mlops/index.html

https://jpn.nec.com/ai/index.html


## NTT DATA 
NTT DATAでは、**既存のDevOpsサービスにおける顧客へ素早く価値を届けるためのノウハウをベースに、多数のAI案件で得られた知見を適用し開発**したMLOps導入サービスを提供しています。
具体的には、機械学習システムによるビジネス価値の創出の難しさの解決を図るソリューションのようです。

~~~
挙げている課題
    - PoCから商用フェーズへの移行ができない
    - デリバリースピードが出せず、ビジネス価値が維持できない
~~~

### サービス内容について
| 提供サービス | サービスの詳細 |
|:-|:-|
| 機械学習版DevOpsツールの導入  |  案件ごとにテーラリングしたツールの提供 |
| 継続的なモデル評価（CE）を <br> 行うパイプラインの導入  | 常に価値を生み出せるモデルを商用サービスへ繰り返しリリース  |
| 運用作業の自動化  | ①モデル開発 <br> ↓ <br> ②デプロイ <br> ↓ <br> ③モデル精度監視 <br> ↓ <br> ④データ作成・再学習 <br> ↓ <br> ①モデル開発 <br> ↓ <br> … <br> のサイクルを効率化  |

https://abler.nttdata.com/solution/altemista/mlops.html

https://www.slideshare.net/nttdata-tech/mlops-case-study-ite-winter-2021-nttdata


## TDSE
TDSEでは、**機械学習を利用した本番運用を支援し、ビジネス利用を促進するため、モデルの作成から本番環境へのデプロイ、精度監視といった一連の機械学習プロセスの効率化を行う**MLOps支援サービスを提供しています。

~~~
挙げている課題
    - MLOps環境が、業務においてはセキュリティポリシーのためにすべての機能をクラウド上で展開することが困難な場合があること
~~~

### サービス内容について
| 提供サービス | サービスの詳細 |
|:-|:-|
| オープンソースによるMLOps環境のスクラッチ構築サービス  | MLflowなどの主要なオープンソースを組み合わせたテンプレートを活用した、顧客ごとの最適環境の提供 |

https://www.tdse.jp/service/data-utilization/mlops/

## Headwaters
Headwatersでは、**AIシステム開発/運用の効率化とナレッジの蓄積/活用を行うMLOpsプラットフォーム SyncLect CL** を提供しています。

~~~
挙げている課題
    - データサイエンティストとソフトウェアエンジニアの間に壁があることが要因で、機械学習プロジェクトがPoCの壁を越えず、実運用まで至りづらい
    - 機械学習の専門的な学習モデルの精度向上と、システム運用における安定稼働を行う人材は別々のスキルであることが多い
~~~

### SyncLect CLについて
SyncLect CLは、AIシステム開発/運用の効率化とナレッジの蓄積/活用を行うMLOpsプラットフォームで、機械学習プロセスを自動化するものとなっています。
具体的には、下記のような特徴を持つようです。
- 各AI案件にて作成された特徴量エンジニアリングのライブラリ化
- 上記ライブラリをパイプライン化して実行可能な機能として提供
- AI開発/運用における各工程の半自動/自動化
    - アノテーション
    - 特徴量エンジニアリング
    - 学習
    - 評価
    - デプロイ
- モデルの学習、評価、推論におけるマシンリソース管理の自動化

https://www.headwaters.co.jp/service/ai/synclect_cl.html

# まとめ
今回は国内4社で提供されているMLOpsサービスについて、調査した内容をまとめました。
所感ですが、MLOpsサービスと一口にいっても、各社が機械学習システムを実運用化する上で課題としてあげている部分は若干異なっており、それだけ機械学習システムにおける課題は多岐にわたるということを改めて認識しました。

個人的には、NTT DATA MLOps導入サービスの中で、CE（継続的なモデル評価）という言葉が出てきたのが印象的です。
MLOpsは、DevOpsのCI（継続的インテグレーション）とCD（継続的デリバリー）に、CT（継続的トレーニング）が加わったものと言われますが、実運用においては、モデルの精度を監視して評価し、評価結果に応じて次のアクションにつなげる流れが重要になります。CEという言葉を定義することで、機械学習システムにおけるモデルの監視や評価の重要性が、MLOpsに初めてトライする方にも分かりやすく伝わると感じました。
MySQL闇歴史　MySQLのクラウド旧サービス

現在のオラクルのクラウドサービスOCI (Oracle Cloud Infrastructure)はGeneration 2 Cloud(略してGen 2)という構成になってる。2があるなら1もあった。このGen 1にはなかなかMySQLのクラウドデータベースが用意されなかったが、2016年9月にMySQL Cloud Serviceという名称でサービスが提供開始された。

知名度：★★☆☆☆
闇度　：★★★☆☆
紆余曲折度：★★★★★

MySQLの開発チームが運用も担当し、MySQL Eneterprise Editionベースというのは現在の[MySQL HeatWave Database Service](https://www.oracle.com/mysql/heatwave/)と同じ。ところがデータベースのマネージドサービスと言いながらインスタンスを作成した後はSSHで接続する。いや、データベースのマネージドサービスなのにSSHなの？
![MCS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102878/04d77f79-93c2-3f93-c9cf-2ff957bfa23f.png)
*MySQLマネージドサービスにつないだらプロンプトがこれ*

そう、MySQLサーバーが稼働するOSつながった状態となる。SSHだもんね。んで、気を取り直してMySQLサーバーに接続しようとするとデフォルトのユーザーopcではダメでoracleという一般ユーザーに変更しろと言われる。MySQLを使うのにユーザー名はoracleなのね、という謎感を味わえる。ストレージの利用状況をfdで確認できちゃったりフォルダ構成もマニュアルに書かれていたりと斬新なサービスだった。レプリケーションもGUIでポチポチでは無く普通にmy.cnf書き換えてCHANGE MASTER TO打ったりする ~~それマジでマネージドサービスなの？~~ 柔軟性の高いサービスであった。

~~運良く~~ 運悪くGen 2登場が迫っていたため大幅な改良も行われること無く、現行のMySQL HeatWave Database Serviceのコア機能であるMySQL Database Serviceに取って代わられることとなった。

MySQL HeatWave Database Serviceの名称に落ち着くまでも紆余曲折はあった。
1. 「MySQL Database Service」の名称で登場
2. 分析エンジンは「MySQL Analytics Cloud Service」としてリリースされると予告
3. プレスリリースで「MySQL Database Service Analytics Engine」として製品発表
4. プレスリリースの約1週間後のオラクルの決算発表では「MySQL HeatWave Database Service」

*最後の名称変更はハワイ方面からの神託(oracle)があったとかなかったとか。

ちなみにMySQL HeatWave Database Serviceの分析エンジンHeatWave無し構成にはこれといった名称が無いため中の人は困っており、単に「MySQL Database Service」と呼んでみたり「MySQL HeatWave Database Service without HeatWave Cluster」みたいな意味不明なことになったりする模様。
転職してからの自分の変化をふりかえってみた


# この記事について
この記事は[Hajimari Advent Calendar 2022](https://adventar.org/calendars/8321)の1日目の記事です。
そして、このAdventCalendarを作った、その日に書いてます笑
本当に勢いで作ってしまったので、どんな内容を書いても大丈夫なように
「書く内容はなんでも大丈夫」と入れました。

しかし、流石に今日の今日で1日目を書くのは、言い出した自分しかいない。ってことで
せっかくなので、今年の7月に転職した自分の変化をふりかえってみたいと思います。

# 長野に引っ越しました
転職事由でもあるけれど、地元に帰って働きたいなぁ。と考えていたことを実現しました。

転職する前も、リモートワークをしていたので、
毎日会社に出社。ということをしていたわけではないのですが、
それでも、地元の空気を吸って生活をしながら、働きたい。という
自分の希望を叶えることができました。

# 時間感覚に慣れてきました
以前は、乗換案内などのアプリを使って、時刻を確認したり、
まぁ、乗れなければ、余裕もって移動始めれば、次の電車でも。という感覚でいたのが
乗り過ごしたら取り返しがつかない。という恐怖も感じつつ笑
それを楽しめるくらいには慣れてきました。

# 積極的になった？
転職に伴って、働き方自体や仕事内容が
大きく変わったわけではありませんでした。

ただ以前よりもチャレンジする機会が、たくさんあることに気づきました。
前職でも、もしかすると、同じだけのチャレンジができたのかも知れません。
ただ、前職ではそれに気づくことができなかった、あるいは蓋をしていたように感じています。

それは、地元に帰ってきて働きたい。という思いだったり、
周りにいるメンバが、以前の職場よりも身近に感じることで、支援したい。という思いだったり、
そういった気持ちの部分での変化が、自分をよりチャレンジさせてくれるようになったと感じています。

# 終わりに
このAdvent Calender も一つの新しいチャレンジです。
まず、やってみる。
もしかしたら、今年の参加者は自分一人だけで終わってしまうかも知れません。
それでも、やってみたら、わかったことが生まれて、じゃあ、次は？と
広がっていくと考えて、まずはチャレンジしてみることにしました。
願わくば、誰かと一緒に、新しい経験が積めるように。
次の1年をより楽しく過ごせるように。
XP入門

## はじめに
XPについて社内で勉強会を開催したので、その内容をまとめておきます。
[エクストリームプログラミングの書籍](https://www.amazon.co.jp/dp/B012UWOLOQ/)を読んだ上でかなり噛み砕いた内容になっていますので、間違いがありましたらご指摘ください。

また、勉強会資料をそのまま流用した記事となりますので、記事としては読みづらい部分があるかもしれませんがご容赦ください。

## XP入門
### こんな事で悩んでいませんか？
![XP入門.pptx のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/56df247b-7fa3-90c5-904b-2063410c9863.jpeg)
こんな悩みをXPでなら解決できます！

### XPとは
![XP入門.pptx のコピー (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/339607ca-aaff-47a6-96ea-8a54ac67fd3d.jpeg)
XPと聞いてペアプロやTDDといった手法を思い浮かべる人は多いのではないでしょうか？
間違ってはいませんが、それだけがXPではありません。

![XP入門.pptx のコピー (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/9851bfc3-d463-25cc-44fa-107e0cf7f3a9.jpeg)

### XPの基本
![XP入門.pptx のコピー (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/4b9b83c7-e221-18f5-688e-55748931c9eb.jpeg)
XPの基本的な要素には『価値』『原則』『プラクティス』があります。
初めにあげた『ペアプロ』や『TDD』はこの中の『プラクティス』にあたります。
XPというと、『プラクティス』だけに焦点を当てがちですが、価値や原則の部分をきちんと理解してプラクティスに取り組むことが大切です。

### XPの『価値』
![XP入門.pptx のコピー (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/676e874b-d128-a193-9468-2edc37cc9d63.jpeg)
XPの価値を必要と感じられないならXPはやらない方がいいと言っても過言ではないと思います。

### XPの『原則』
![XP入門.pptx のコピー (6).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/7ba0ae25-b030-bd31-8f51-d1a3f79a59d5.jpeg)

### XPの『プラクティス』
![XP入門.pptx のコピー (7).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/d861d57e-db35-90f7-1835-de9907ad3b54.jpeg)
※これは主要なプラクティスを挙げたものです

### 具体例
価値・原則・プラクティスの関係性を理解するために、具体例で考えてみましょう
![XP入門.pptx のコピー (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/78c7864b-4650-ce88-2af0-d4dd7a8c532f.jpeg)
今回はXPの『価値』の一つである『コミュニケーション』を取り上げます。
『コミュニケーション』を向上させるにはどのような方法を取るべきでしょうか？
- いつでも会話できるようにする？
- ドキュメントをたくさん残しておく？

このような時に考えるのが『原則』です。

![XP入門.pptx のコピー (8).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/d846a2d1-0799-7af5-ef47-4ac2ff886a8b.jpeg)

今回は『人間性の原則』が判断の基準となります。
これによると、方法1の方が『コミュニケーション』という価値を達成するのに適している、ということになります。

最後に『いつでも会話できるようにする』という事を実現するために『プラクティス』を考えます。

![XP入門.pptx のコピー (9).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/fd79092d-9e62-77cf-cc38-ecd1723111ee.jpeg)

今回は『全員同席』『チーム全体』というプラクティスが適しているので、実際に取り入れる。という流れになります。

### まとめ
![XP入門.pptx のコピー (10).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592724/1837dc47-eea9-0122-7112-2ee20e1ec55b.jpeg)
『ペアプロ』や『TDD』などの『プラクティス』をやっているとXPをやっていると勘違いしてしまいがちです。
改めて、価値をおく対象は正しいか？その価値を実現するために行動しているか？という事を考えてみてください。

## 参考文献
[エクストリームプログラミング|(著)ＫｅｎｔＢｅｃｋ,ＣｙｎｔｈｉａＡｎｄｒｅｓ(訳) 征典](https://www.amazon.co.jp/dp/B012UWOLOQ/)
矩形選択(くけいせんたく)

# エディタごとのショートカットキー

## Visual Studio Code
(Windows)[Ctrl] + [Shift] + [Alt] + 矢印キー

## Eclipse
[Shift] + [Alt] + A

## さくらエディタ
[Shift] + F6

## メモ帳
不可

# その他

## ブラウザ
デフォルトではどのブラウザもない
UiPathのライセンス情報を確認する

# はじめに
仕事でUiPathカスタマーサポートに問い合わせる機会があったのですが、
入力必須情報であるライセンスIDを調べるのにもたついたのでメモとして残します。
この記事はRPA（ロボティック・プロセス・オートメーション） Advent Calendar 2022 11日目の記事です。


# 結論
 cmdで以下のコマンドを入力してライセンスの情報を確認できます。
~~~
C:\Users>"c:\Program Files\UiPath\Studio\UiPath.LicenseTool.exe" info
~~~

# 実行結果
こんな感じでライセンス情報が確認できました。
~~~
C:\Users>"c:\Program Files\UiPath\Studio\UiPath.LicenseTool.exe" info
ライセンスの登録ステート: ActiveLicense
アクティベーション ID: UIP-xxxxxxxxx
ライセンス コード: 1234-5678-9012-3456
開始日 (UTC): yyyy-MM-dd
終了日 (UTC): yyyy-MM-dd
猶予期間 (日数): 14
猶予期間を含む終了日 (UTC): yyyy-MM-dd
次の確認日: yyyy-MM-dd
 Success
~~~

# そのほか作業用コマンド

* ライセンスの削除
~~~
"c:\Program Files\UiPath\Studio\UiPath.LicenseTool.exe" deactivate
~~~
* ライセンスの追加
~~~
"c:\Program Files\UiPath\Studio\UiPath.LicenseTool.exe" activate -l ライセンスコード
~~~

# 参考文献
https://docs.uipath.com/robot/lang-ja/docs/licensetool-command-descriptions

公式ドキュメントにも記載がありました。

# おわりに
コマンド入力に対して苦手意識があったのですが、
今回の件をきっかけに少しだけ苦手意識が克服できたように思います。
また、ライセンス情報の確認方法は調べれば出てくるものではありましたが、
自分の中に手順やコマンドをしっかりと落とし込むためにはやはり自分なりに纏めてアウトプットするのが一番確実だと思い纏めました。

自分と同じようなことで躓いたり、苦手意識を持ってる方に届けば幸いです。
サイト内の「検証ツール」でjQueryが使えないとき

# $ is not a functionが出てくる場合

chromeやfirefoxでスクレイピングのために「検証ツール」(ディベロッパーツール)を開いた時。

「これを取得するためにはどうやってコードを書けばいいのかな〜ふんふんこういう構造になっているのね。」

などと考えて、例えば以下コードをコンソールに打ち込んで、さあいざ取得できるかテストすると思います。

```javascript:とりあえずのテスト
$("div.class_name_1").text().trim()
```

なのに出てくるのはこんな表示だった時。

```$ is not a function```

でもやっぱり取得の仕方があっている時。

これはサイトのページ内でjQueryが読み込まれていない(?)のが理由みたいです。
下のコードをコンソールに打ち込むと、検証ツールでもjQueryが使えるようになります。

```javascript:読み込み用コード
document.body.appendChild((function(){
  var jq = document.createElement("script");
  jq.src = '//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js';
  return jq;
})());
```

タブを変えた時はまた使えないので、その都度入力しましょう。
Thymeleaf構文について

## Thymeleafとは

javaのテンプレートエンジンのひとつとなっており、ThymeleafはSpring Bootでの使用が推奨されています。MVCモデルでいう「V（ビュー）」にあたる部分です。

## メリット

- 独自のタグを使用しないので、普通のHTMLファイルをそのままJavaで使用できること。
- 専用の記述があるが、かなり簡単で学習コストがかからない。
- HTMLファイルに影響を与えない。

## 色々な変数式
|変数式|${...} |
|---|---|
|選択変数式 |*{...}  |
|メッセージ式|#{...} |
|リクURL式|@{...}|
|フラグメント式| ~{...}|

## 構文一覧

### th:field

サブミットする場合に指定

`th:field=”${userForm.userId}”` 

th:fieldを使用すると、Javaクラスとバインドすることができる。
Modelに登録されたキー名.フィールド名でバインドできる。

### th:text

画面へ文字列を出力する

```html
<span th:text=”${form.userName}”>テスト</span>
結果
<span>ホゲータ</span>
```

上記”テスト”の部分は、th:textによる出力が優先される。

### th:utext

HTMLとして出力したい場合。

ただし、スクリプトなどを書いてまうと、その通り実行されてしまうため、入力値を出力する箇所での使用はおすすめしません。

### th:value

テキストボックスなどの値にセットする場合に使用する
```html
<input type=”text” th:value=”${from.textValue}”/>
結果
<input type=”text” value=”1”/> 
```

### th:object

指定したタグの中でthymeleafを使用する際に、変数名を省略できる

```html
<form th:object=”${userFrom}”>
    <span th:text=”${userName}”>テスト</span>
</from>
結果
<form>
    <span>ホゲータ</span>
</form>
```

### th:action

fromタグThymeleafで記述する場合に使用する。

URLを指定する場合、@で記述することで適切なURLを返却するようになる

```html
<form th:action=”@{/user/index}”></form>
結果
<form action=”/user/index/”></form>
```

formタグのaction属性の内容を置換する。

### th:if

式がtrueとなる場合にのみ、該当のタグを出力する
```html
<span th:if=”${userForm.userId == null}”>ユーザーIDがありません</span>
<span th:if=”${userForm.userId ≠ null}” th:text=”${userForm.userName}”>テスト</span>
結果
formクラスのuserIdがNULLの場合 : <span>ユーザーIDがありません</span>
formクラスのuserIdがNULLでない場合 : <span>ホゲータ</span>
```



### th:each

配列・リストをループ処理する場合に使用する。
th:each=”ループ中の変数名  : ${ループする配列}”
```html
<ul>
   <li th:each=”${items: userForm.Name}”></li>
<ui>
結果
<ul>
  <li>ホゲータ</li>
  <li>クワッス</li>
  <li>ニャオハ</li>
<ul>
```

### th:block

HTMLとして出力されない、Thymeleaf専用のタグ

```html
<label class="detail_label">
  <span class="title">担当エリア</span>
	// 値がnullの場合の処理
  <th:block th:if="${usersCreateForm.areas == null}">
    <span class="detail_data" th:text="null"></span>
  </th:block>
	// 値が入っているときの処理
  <th:block th:unless="${usersCreateForm.areas == null}">
    <span class="detail_data" th:text="*{areas.areasName}"></span>
  </th:block>
</label>
```

th:ifとth:unlessでif elseの書き方ができる。

値を入れる際にどこがnullなのか確認して条件分岐を書く。
【初心者向け】PHPの環境構築手順

# はじめに

今回の記事では、これからPHPで学習を始めるという方向けに

PHPの環境構築について分かりやすく解説していきたいと思います！

# 1. PHP（復習）

環境構築を進める前に、PHPについて簡単にまとめてみましたので復習がてらにご確認ください。

:::note info
**PHPの特徴**
・動的なWebサイト開発ができるプログラミング言語の1つ
・Javascriptはクライアントサイド（ブラウザ）の言語で、PHPはサーバーサイド（プログラム中）の言語
・HTMLに組み込んで使える
・データベースとの相性も良い
・WordPress、Facebook、Yahoo!、ぐるなび等はPHPで開発されている
:::

エディタはVSCODEを使用していきます。
# 2. 環境構築

環境構築とは、その言葉の通りサービスを開発する環境を整えることです。
プログラミングにおける環境構築には、「実行環境」と開発環境」の２種類があります。
「実行環境」とは、プログラムやソフトウェアが稼働するために必要な環境のことで、「開発環境」とは、
システム開発をする為に必要な環境のことです。
一般的なアプリ開発からリリースまでの流れは、「開発環境」で開発されたシステムを「テスト環境」で動作確認を行い、
特に問題がなければ「本番環境」に流しリリースということになります。
また、自分のパソコンの「開発環境」のことを「ローカル環境」と言います。
今回はこの「ローカル環境」の構築にフォーカスして解説していきたいと思います。

## 2-1. MAMPとXAMPP

まずは「ローカル環境」を構築するために使うツールをご案内します。
### ・MAMP
![MAMPロゴ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985441/7352b1be-2046-a4de-a758-07645d69e9c3.jpeg)


MAMPはM（Mac）A（Apache）M（MySQL）P（PHP）の略で必要な環境をまとめて整えることのできるパッケージです。
「Apache」はWebサーバー、「MySQL」はデータベース管理システム、「PHP」はプログラミング言語となります。
Webサーバーなどの構築は初心者には難しく、プログラミングを学習する前にここで挫折してしまう方います。
MANPを使うことで簡単に開発を始めることができます。

　[【Windows】MAMP公式ダウンロード](https://www.mamp.info/en/windows/)
　[【Mac】MAMP公式ダウンロード](https://www.mamp.info/en/mac/)

- 公式サイトにアクセスしたらまず「Free Download」を押します。
- mac版とwindows版と表示されるので、ご自分のOSに合わせて選択して下さい。クリックするとダウンロードが開始しますので
- ダウンロードができたらインストーラを開きます。
- 今回、MAMP PROは使用しないのでチェックボックスは2つともチェックを外しておきましょう。
- その後利用規約の画面になるので、「I accept the agreement」で承諾し、NEXTボタンを押します。
- インストール先を選択して、再度NEXTボタンを押します。
- フォルダ名を確認して、再度NEXTボタンを押します。
- デスクトップにアイコンを作成したい場合はチェックを入れて、NEXTボタンを押します。
- 「Install」→ 「Finish」→ 「Finish」でインストール完了です。



### ・XAMPP
![xamppロゴ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985441/5f91b854-45d2-2094-ccf6-69f060e6cc3f.jpeg)

XAMPP はX（cross(x)-platform）A（Apache）M（MySQL）P（PHP）P（Perl）の略でMAMP同様必要な環境をまとめて整えることのできるパッケージです。
cross(x)-platform（クロスプラットフォーム）とは、ここではOSのことを指します。
Perlとは、オープンソースのスクリプト言語です。XAMPPではPerlの実行環境も同時にインストールされます。
 
　[【Windows & Mac】XAMPP公式ダウンロード](https://www.apachefriends.org/jp/index.html)※MacはOS X 向けを選択

- 使うパソコンのOSに合わせてダウンロードします。
- ダウンロードができたらインストーラを開きます。
- 英語で警告が出ると思いますが、気にせず「ok」で進みます。
- セットアップ画面になったらNEXTボタンを押して進みます。
- インストールコンポーネントをすべて選択し（すべて選択済みであればそのままでOK）NEXTボタンを押します。
- インストールフォルダを選択し再度NEXTボタンを押します。
- 「言語（Language）」は英語のままで、Nextを押します。
- 「BitNami for XAMPP」も気にせずNEXTを押します。
- ready to InstallでNEXTを押せばインストールが始まります。
- 最後にアクセス許可をして「Finish」でインストール完了です。

# PHP学習を始めるなら

PHPを実践的に学ぶなら、忍者CODEの無料問題集をご活用ください！

また、Web制作をさらに極めたいという場合は、有料コンテンツの甲賀(KOGA)もおすすめです。

少し応用的なHTML、CSSの問題からWordPressの知識まで幅広く体系的に学べます。

https://ninjacode.work/

https://koga.ninjacode.site/?ni=q_6
(Open)LiteSpeedでphp.iniに記述した一部の設定が反映されない

# (Open)LiteSpeedでphp.iniに記述した一部の設定が反映されない
発生した環境：UbuntuServer22.04.1 LTS + OpenLiteSpeed 1.7.16 + LiteSpeedPHP8.0または8.1（直感が正しければそれ以前でも発生すると思われる）

表題の件、具体的にはmax_execution_timeがデフォルトでは30〜60秒になっていると思うのだが、これを「-1」とか「86400」とかに書き換えてLiteSpeedをリロードしても反映されない。
このため、確実に30〜60秒を超える処理について、phpプログラムが時間内に処理を終えることができなかった場合、タイムアウトにより処理が中途終了してしまい意図した通りの動作にならない。
リファレンスではphp.iniを書き換えるか.htaccessで指定するか見たいなことを書いてあるのだが、実際にやってみても有効化しても反映されない。
また、WebAdminでタイムアウト制限を変更しても期待した通りの動作をしない。

結論から言うと、WebAdmin -> バーチャルホスト -> 設定したいドメイン -> Rewrite と進み、ReWriteルールをオンにし、Rewriteルールに以下のように記述すると意図した通りの動作をするようになった。

```
<IfModule Litespeed>
SetEnv noabort 1
SetEnv noconntimeout 1
RewriteEngine On
RewriteRule (YourPHP-Program) - [E=noabort:1, E=noconntimeout:1]
</IfModule>
```
![スクリーンショット 2022-11-17 14.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/c5e88077-ad7c-bc2a-11e3-d674acfe7356.png)

上掲は一例であり、(YourPHP-Program)の部分は適宜置き換えられたい。
スクリーンショットの例では無差別に全ファイルに対して実行時間無制限を適用するように書いてあるが、実際には有限に設定した方が良いだろう。

他のphp.iniに存在する設定については概ねphp.iniの通りに動作するのに、何故かphp_execution_timeの項目だけ反映されず、ローカルテスト環境であるMAMPのphp.iniの設定を見直したり、色々と時間を取られてしまった。

何かと忘れっぽい自分のためと、もしLiteSpeedをお使いの方で同様の問題にぶち当たった方がおられたら、と思い、備忘録として残しておく。
System.Timers.Timerはスレッドセーフではない


# 概要

* `System.Timers.Timer` の `Elapsed` イベント登録はスレッドセーフではないので適切にロックをする必要がある。

# 経緯

`System.Timers.Timer` を使用して、定期的に処理を実行させつつ処理の内容を変えるために `Elapsed` イベントにメソッドを指したり抜いたりしていたところ、たまに抜かれたはずの処理が走っている現象に出くわした。
まぁタイマーの使い方としてはあまり正しくない気もしなくはないが。

# 再現コード

```
class TimerRemoveFail
{
    public TimerRemoveFail()
    {
        var timer = new Timer { AutoReset = false, Interval = 1 };
        var tasks = new List<Task>();

        foreach (var _ in Enumerable.Range(0, 100))
        {
            tasks.Add(Task.Run(() =>
            {
                timer.Elapsed += OnElapsed;
                timer.Elapsed -= OnElapsed;
            }));
        }

        Task.WaitAll(tasks.ToArray());

        Console.WriteLine("Start");
        timer.Start();
        Console.ReadLine();
    }

    void OnElapsed(object _, EventArgs __)
    {
        Console.WriteLine("Not Removed!!!");
    }
}
```

* 実行結果

```
Start
Not Removed!!!
Not Removed!!!
Not Removed!!!
Not Removed!!!
```

.NET6 でも発生する。

# 対処方法

`Elapsed` に `+=`,`-=` しているところを適切に lock ステートメントでくくってしまえば良い。

# 原因

https://github.com/microsoft/referencesource/blob/master/System/services/timers/system/timers/Timer.cs

```
        public event ElapsedEventHandler Elapsed {
            add {
                onIntervalElapsed += value;
            }
            remove {
                onIntervalElapsed -= value;
            }
        }
```

`add` `remove` メソッドを書かずに自動実装イベントに任せたときでも `Interlocked` を使用してマルチスレッドに配慮されているのにどうして。。。
下記記事が参考になる。
https://ufcpp.net/study/csharp/sp_event.html#auto-event

# というか

https://learn.microsoft.com/en-us/dotnet/api/system.timers.timer?view=net-6.0

上記を見ると、Tipに

System.Timers.Timer (this topic): fires an event at regular intervals. The class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
(System.Timers.Timer (このトピック): 一定時間ごとにイベントを発生させます。このクラスは、マルチスレッド環境におけるサーバベースまたはサービスコンポーネントとして使用することを意図しています。）

って書いてあるのに、Noteに

The event-handling method might run on one thread at the same time that another thread calls the Stop method or sets the Enabled property to false. This might result in the Elapsed event being raised after the timer is stopped.
(イベント処理メソッドとは別のスレッドがStopメソッドを呼び出したり、Enabledプロパティをfalseに設定したりすると、タイマーを停止した後に Elapsed イベントが発生する可能性があります。)

ってあったりして、あまりマルチスレッド向きとは言えない気がするなぁ。
Raspberry Pi Pico (micropython) と PC の Python 間をUSB 1本で通信する

　通信といっても Thonny の下の Shell みたいなモノがそのまま動けばいいんじゃい！という感覚で色々調べたものの、みんな UART 変換なりを使っていたり、USB 周りに手を出すと mbed OS と干渉して死ぬみたいな記事を見てなんとか使えないものかと試行錯誤した軌跡

# 概要

- プログラム用のUSBだけで通信する
- 書き込み読み取り量に比例するが大体1500Hz〜2300Hzくらい

# こんな人に

- ラズピコ本体と PC と繋ぐ USB ケーブルしかない
- わざわざ UART-USB 変換を買いたくない
- ファームウェアやOS等の深い部分を触って壊したくない
- **とりあえず動けばいい**

# 非対象者

- ちゃんと通信したい方
- より適切な方法を知ってる方（教えてください）

# 環境

- Thonny 4.0.1 (Windows 10 / macOS Ventura)
- Python 3.9
  - pyserial 3.5 

# Raspberry Pi Pico 側のコード

main.py

```Python
while True:
    s = input()
    print(s)
```

# PC側のコード

test.py

```Python
import serial
from tqdm import tqdm

PORT = 'COM*'  # Windows の場合
PORT = '/dev/cu.usbmodem*'  # Mac の場合
BAUD = 115200

ser = serial.Serial(
    port=PORT,
    baudrate=BAUD,
    timeout=1,
    write_timeout=1,
    exclusive=True,
)

N = 30000

for i in tqdm(range(N)):
    send_bytes = bytes('{:06d}\r\n'.format(i), 'utf-8')

    ser.write(send_bytes)
    ser.flush()

    receive_bytes = ser.read_all()
    receive = receive_bytes.decode('utf-8').splitlines()

    if not len(receive) > 1:
        continue

    # print('send: {:06d} recv: {}'.format(i, receive[1]))
```

### 実行結果

```
% python test.py
100%|███████████████| 30000/30000 [00:12<00:00, 2337.89it/s]
```

# ハマったポイント

- `ser.readline()` だと書き込みありで回した場合にゴミが溜まるのか `write_timeout` で落ちてしまった
  - Mac だと動くっぽい（環境による？）

- `ser.read_all()` すると前後にいろいろ入る

- Thonny を閉じてリセットする儀式
全身を使ってアバターを動かす【MetaQuest2 x AzureKinect】

![about1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987303/37a62f04-4bcb-1e01-42b0-66c74125f700.png)
概要
---------------------------------------

VR（仮想現実）は専用のゴーグルを装着し、仮想的な3D空間を分身となるアバターを通して現実のように疑似体験できる仕組みです。

:::note info
VRゴーグルだけでは体全体の動きに合わせてアバターを動かすことはできません。そこで、センサー端末でVRゴーグルで動かせない体の部位を補い、全身アバターを実現しました。
:::
センサー端末（Azure Kinect）の前に立って、VRゴーグル（Meta Quest2）を装着することで、フルトラッキングのVRアバターを実現しました。
<img width="100%" alt="全身アバター" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987303/fb08d39e-ea52-17ce-41bf-e10c4df5e372.gif"/>

システムについて
---------------------------------------
**MetaQuest2**と**AzureKinect**でそれぞれが得意な体の部位の認識結果を合成し、フルトラッキングなアバターを実現します。体にモーションキャプチャーのような機器を付ける必要はありません。
![フルトラッキング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987303/3381f810-9c22-2784-9c5d-31e5491d7d9c.png)
Meta Quest2はハンドトラッキングとリップシンクを行い、手と口の動きを認識しています。Azure Kinectは体全体の動きを認識しています。ふたつのデバイスの認識結果を合成してフルトラッキングを実現しています。

![about3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987303/9c553f4a-4541-97d5-98fc-f25c0d21b4aa.png)
複数人に対応しています。また、背景を動画にすることで仮想空間の3Dモデルを作成しなくてもアバター動画を撮影することができます。

デバイスについて
---------------------------------------
![devices.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987303/37cb8b94-a559-c929-e830-b3cc71a630f0.png)
[Meta Quest2（VRゴーグル）](https://www.meta.com/jp/quest/products/quest-2/)
[Azure Kinnect（センサー端末）](https://azure.microsoft.com/ja-jp/products/kinect-dk/)

アバターについて
---------------------------------------
アバターは**VRoid Studio**, **Ready Player Me**で作成したもの動作チェックしてます。
![editors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987303/26839b06-329b-19b5-cce1-41cc1a81ee50.png)
[VRoid Studio](https://vroid.com/)
[Ready Player Me](https://readyplayer.me/)

今後の展開
---------------------------------------
:::note info
アバターを使ったプロモーション動画の制作をしていく予定です。アバター作成から動画編集まで一気通貫の依頼を受けられるよう準備してます。伝えたいことをアバターに乗せて届けるお仕事ができたらいいなと思ってます。
:::

好きなラーメンと硬さ
---------------------------------------
濃いめの味付けのラーメンが好きです。
好きな麺の硬さはカタです。
CpawCTF Writeup Level 2 Q17.[Recon]Who am I ? (注意<spoiler>)

# Q17.[Recon]Who am I ?
```
僕(twitter:@porisuteru)はスペシャルフォース2をプレイしています。
とても面白いゲームです。
このゲームでは、僕は何と言う名前でプレイしているでしょう！
フラグはcpaw{僕のゲームアカウント名}です。
```

キーワードでググればスコアボードの写真が出てくるのでそのアカウント名がフラグとなる。

cpaw{parock}
CpawCTF Writeup Level 2 Q16.[Network+Forensic]HTTP Traffic (注意<spoiler>)

# Q16.[Network+Forensic]HTTP Traffic
```
HTTPはWebページを閲覧する時に使われるネットワークプロトコルである。
ここに、とあるWebページを見た時のパケットキャプチャファイルがある。
このファイルから、見ていたページを復元して欲しい。
http_traffic.pcap
```
問題の通りに.pcapファイルをwiresharkでHTTPとしてエクスポートすると.jsやら.cssやら出てくる。
htmlファイルであろうnetwork100という名前のファイルに識別子.htmlを付与し、
htmlから読み取れるファイル構造通りにcssとjsを入れる。
整理した後にhtmlファイルを開くとボタンがあり、クリックするとフラグが現れる。


![スクリーンショット 2022-12-01 194935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/813031/ef47f421-a3b7-bc1a-50fb-487baa084bfa.png)

htmlファイルの開き方だが、ブラウザで任意のファイルの場所
````
file:///C:/Users/yourname/Doc/ctf/Cpawctf/Level2/q16/network100.html
````
と入力すればよい
cpaw{Y0u_r3st0r3d_7his_p4ge}
初心者：AWS AutoScaling試してみた

# はじめに
いろいろと触る機会が多かったので自分でも試してみました。
VPC・EC2インスタンス周り等は作成済み想定です。
AutoScalingに関しては下記サイト参考。
[Amazon EC2 Auto Scaling とは](https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html)


# 大まかな流れ

1. AMI作成
2. 起動テンプレート作成
3. AutoScalingグループ作成
4. 動作確認


# 1. AMI作成

* ナビゲーションペインより「インスタンス」
対象のEC2インスタンスを選択し「アクション」を押下、「イメージとテンプレート ＞ イメージを作成」を押下する。
イメージ作成画面が表示されるので名前等設定する。
![QT-AS-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629107/1a37e499-2545-62c3-5d92-19090d71434c.png)

* ナビゲーションペインより「AMI」
イメージが作成されていることを確認する。
![QT-AS-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629107/137e99b0-54bb-4551-7628-1dcc36a5a8cf.png)


# 2. 起動テンプレート作成

* ナビゲーションペインより「起動テンプレート」
起動テンプレートを作成を押下する。
起動テンプレート作成画面が表示されるので名前等設定する。
「アプリケーションおよび OS イメージ (Amazon マシンイメージ)」に検索バーに上記で作成したAMIの名前を入力する。（ここでは[QT-AMI-20221129]）
対象のAMIが表示されたら「選択」を押下する。
![QT-AS-TMP-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629107/4a8c3806-2aae-5119-3dd4-ec30d7e15fd1.png)
「最後に起動テンプレートを作成」を押下し、起動テンプレートが作成されたことを確認する。


# 3. AutoScalingグループ作成

* ナビゲーションペインより「Auto Scaling グループ」
AutoScalingグループの作成を押下する。
AutoScalingグループ作成画面が表示されるので名前等設定する。
起動テンプレートに上記で作成した起動テンプレートを選択する。（ここでは[QT-AutoScaling]）
![QT-AS-AS-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629107/09a93d42-f965-6baa-ff6b-f213b8a1e245.png)

* ネットワークに任意のVPC・AZとサブネットを設定する。
![QT-AS-AS-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629107/1464548e-243f-5377-e52f-c64efae4e6bc.png)
その他について画面に従い設定する。（省略可能）
最後に確認し「AutoScalingグループを作成」を押下し、作成されたことを確認する。


# 4. 動作確認

EC2インスタンスを停止し、自動で復旧するかを確認する。

* ナビゲーションペインより「インスタンス」
対象のEC2インスタンスを停止する。
![QT-AS--EC2-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629107/c72500e4-3da0-d0ca-2605-421561e89389.png)

* その後EC2インスタンスが自動で復旧すれば成功。
インスタンスIDとAZが変わっていることが確認できます。
![QT-AS--EC2-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629107/01cbef6d-6e61-a6d4-2962-e4ff80db4ea1.png)


# おわりに

ほぼ操作手順書のようなものになってしまいましたが、今回の経験でAutoScalingの基礎的な部分を学べたと思います。
これをもとに改良などしていこうかと思います。
DjangoでWebAppを作ってみよう#00 環境構築編

# 要約
このテンプレートはいいぞ．ぜひ使っていただけると嬉しく思います．

https://github.com/RTa-technology/Django-template

# はじめに
私がDjangoを使用したプロジェクトで使いまわしているtemplateを使ってDjangoの使い方を解説していこうと思います．Djangoの使い方に関しては先人たちの知恵のほうが良く解説されていることと思いますので備忘録程度に読んでいただければと思います．


# 用意するもの
* IDE/Code Editor
* Docker
* Python>=3.8

# 推奨レベル
* Gitの操作が一通りわかる．(clone, fetch, pull, push...etc)
* Pythonの開発環境が整っている

# 0. templateを使ってリポジトリを作ってみよう．

https://github.com/RTa-technology/Django-template

こちらのリンクをクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533325/b58d836d-59e0-d7e7-4260-fe9a20286bde.png)
`Use this template`からこのテンプレートを用いてリポジトリを作成することができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533325/17cf19a6-83c3-4d6a-5f61-05320e41e338.png)
必要な情報を記入して`Create repository from template`を押せば作成完了です．

# 1. ローカルで動かしてみよう
ここでは実際にローカル環境で動作することを確認していきます．

## 1.1 Dockerが入っていることを確認する
```bash
docker version
```
にてバージョンを確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533325/7c8672a2-d151-de0f-3910-f5977ed5335b.png)
実行できない場合はDockerが本当に入っているか確認し，入っていなければ他の記事を参考に導入してください．

## 1.2 git clone
[省略]
各々git cloneしていただければと思います．

## 1.3 Docker composeでコンテナをビルド，起動させる
cloneしたディレクトリに行って，以下コマンドを実行します．
```bash
docker-compose up -d --build
```
恐らく初回は1分ほど待つと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533325/25773fd5-ffc4-110f-89ea-36c5aa9a7e1b.png)
```
[+] Running 3/3
 - Container <ディレクトリ名>-db-1     Started
 - Container <ディレクトリ名>-app-1    Started
 - Container <ディレクトリ名>-nginx-1  Started    
```
という表示が出るでしょう．

その後，

http://localhost:8002/

にアクセスすれば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533325/dff18830-63e8-1418-fe2d-b0d1de0e994c.png)
のような画面が出てくることと思います．

その後，
```bash
docker-compose exec app python manage.py flush --no-input
docker-compose exec app python manage.py makemigrations
docker-compose exec app python manage.py migrate
docker-compose exec app python manage.py collectstatic --no-input --clear
docker-compose exec app python manage.py createsuperuser
```
これらのコマンドを実行してください．

以上で，Djangoの環境構築が完了しました．

次記事にてDjangoの使い方に関して解説していきます．
MySQL闇歴史　MySQL Fabric

https://qiita.com/advent-calendar/2014/mysql_fabric

↑そう、MySQL Fabricはつらいのである

知名度：★★★☆☆
闇度　：★★★★★
つらい度：★★★★★

MySQLサーバーの高可用性構成のためにMySQL Fabric構成にしてメタデータのレポジトリのMySQLサーバーの高可用性構成のためにMySQL Fabric構成にしてメタデータのレポジトリのMySQLサーバーの高可用性構成のためにMySQL Fabric構成にしてメタデータのレポジトリのMySQLサーバーの高可用性構成のためにMySQL Fabric構成にしてメタデータのレポジトリのMySQLサーバーの高可用性構成のためにMySQL Fabric構成にしてメタデータのレポジトリのMySQLサーバーの高可用性構成のために以下無限ループ

ちなみにその後は正常進化を遂げてMySQL Group ReplicationベースのMySQL InnoDB ClusterがMySQLサーバーの推奨の高可用性構成になった。
Windows,Cygwinでgnuplotを使うための作業


# 概要
PCを新調したのでCygwinでgnuplotを使える環境を改めて作る。この先また困るだろうからとりあえず記録でもつけておく。
# Cygwinの作業
[https://www.cygwin.com](https://www.cygwin.com)からsetup-x64.exeをダウンロード。Cygwin/Xのほうからはダウンロードできなかった。
setpu-64.exeを起動して進める。
### packageをいれる
左上にあるViewからCategoryを選択し、baseをまとめて入れた。検索窓からgnuplotと検索してgnuplot-X11、gnuplot-base、gnuplot-debuginfoを入れた。
あとは、遊ぶためにxeyesを入れた。
### よくわからん設定。.bashrc
このまま進めてもディスプレイを認識できないらしい。cygwin64/home/ownerにある.bashrcをエディタで開いて、上の方に
```.bashrc
DISPLAY=localhost:0
```
と書き込んだ。
# Xmingの作業
[https://ja.osdn.net/projects/sfnet_xming/releases/](https://ja.osdn.net/projects/sfnet_xming/releases/)のXming-6-9-0-31-setup.exeをダウンロードした。起動して適当に進める。XmingとXLaunchが入る。インストーラを終わる際にかってにLaunchしてくれた、確か。のちにXLaunchを起動しただ次へを押し続けて終わった。
# gnuplotの作業
gnuplotのterminalをx11にする。cygwin64/home/ownerにファイル`.gnuplot`を作って中に
```.gnuplot
reset
set terminal x11
```
と書き込む。gnuplotを起動する際に自動で実行されるらしい。
gnuplotを起動してから`set terminal x11`と打ち込む、でも可能。だけど、gnuolotを起動する度にやる必要があるので面倒。

これで作業は完了。
# 使う
Xmingを起動する。バックグラウンドでXmingが走っているあいだにCygwin64 Terminalを起動する。あとはgnuplotで何か描くなり好きにしておくれ。その際、`unable to open dysplay 'localhost:0'`などと出るならば、Xmingが起動できていないかterminalがx11ではないかのどちらかが原因だと思う。
備忘録：HTML送信時における処理実行順

# 経緯
onclick, onsubmitの違いとHTML属性(論理属性)の判定順を正確に理解しておらず、
共通した実装に至るまで遠回りして沼ったのでメモ書き

# HTMLソースコードの一例
```
<form onsubmit="return bbb()" action="">
    <input type="" required />
    <button type="submit" onclick="aaa()"/>
</form>
```

# 判定処理順
1. submitボタン押下
1. onclick判定
1. requiredなどinputタグに記載された処理
1. onsubmit判定
1. formタグのaction実行
1. action先の実行

# 考察
・論理属性によるエラー文・エラー処理
・jsでのエラーチェック
どちらを優先するか、どこまで共通実装されているかを判断基準に
onsubmit, onclickの使い分けにおけるコード実装とするのが良さそう

例：
required属性が設定されているが、アラートで文字を表示させたい時
onsubmitではなく、onclickで処理させる

```
<form id="myForm">
    <input type="" required>
    <button type="submit" onclick="validate()">
</form>
<script>
function validate() {
    const form = document.getElementById('myForm');
    if (!form.checkValidity()) {
        alert('入力項目が不足してます。');
    }
}
</script>
```