OmniAICreator/Qiita-1.07M huggingface dataset:
ProxmoxでノードのIDを変更する方法

Proxmoxでクラスターを設定していて順番を間違って設定してしまった場合、
```
root@hoge01:~# pvecm nodes

Membership information
----------------------
    Nodeid      Votes Name
         1          1 hoge01 (local)
         2          1 hoge03
```
Nodeidが以下のようになってしまうことがある。
構築段階であれば、一度ノードを削除して正しい順番でクラスターを設定しなおしてもいいが簡単な設定があったのでメモ。

```
root@hoge01:~# less /etc/pve/corosync.conf 

~~~~~一部抜粋~~~~~

nodelist {
  node {
    name: hoge01
    nodeid: 1
    quorum_votes: 1
    ring0_addr: ＊＊＊.＊＊＊.＊＊＊.※※※
  }
  node {
    name: hoge03
    nodeid: 2
    quorum_votes: 1
    ring0_addr: ＊＊＊.＊＊＊.＊＊＊.※※※
  }
}

~~~~~
```
と書いてあるだけなので、クラスターの親ホスト側でこのNodeIDを変更して保存してあげるだけでOK。
変更が終わったらrebootかけておけば安心かなと。
```

nodelist {
  node {
    name: hoge01
    nodeid: 1
    quorum_votes: 1
    ring0_addr: ＊＊＊.＊＊＊.＊＊＊.※※※
  }
  node {
    name: hoge03
    nodeid: 3
    quorum_votes: 1
    ring0_addr: ＊＊＊.＊＊＊.＊＊＊.※※※
  }
}

```

結構簡単な作りなんですねえ。と思った次第。
CTO興味ある人へ：CTOの業務についてその９　システムチェック

CTOを長年やってるとよく聞かれる質問です。
```
CTOの仕事ってどんな仕事があるんですか？
```
から始まった**CTOの業務について**のその9です。

# システムチェック
セキュリティ管理含めて、システムチェックもCTOのタスクの一つです。
## コストチェック
全社のシステムが気付いたらコストが膨らんでいるとか良くあります。
- サーバーを落としたくないので冗長すぎるシステム構成
- 心配なので見もしないデータの長期保管
- 余剰気味な人員構成
現場では、心配からくるものなので当たり前になってる場合が多いため、CTOにより各PJのシステムの投資チェックをオススメします。
![スクリーンショット 2022-12-12 13.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/e6df9b26-0d21-e6ce-3a3f-b3d7c418231d.png)

## 拡張性・保守性チェック
こちらは、コストチェックと同じく、現場では日々の案件に追われて忙しく、放置され気味なため、CTOにより各PJのシステムの拡張性・保守性チェックをオススメします。
![スクリーンショット 2022-12-12 13.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6b0bfc13-6171-8806-4717-c7c6a2d73b46.png)
## 技術的負債チェック
CTOにより各PJのシステムの技術的負債チェックし、返済する時期なのかをジャッジします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/befd1334-13b4-3c46-6118-07f10df38eee.png)
## クラウド＆Saas(ASP)チェック
クラウドツールやSaas(ASP)ツールを利用した方が総合コストが下がり、アジリティがるのに、システムとして保有しているものをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4d4ff548-0c6c-8aa6-5c37-1f12816dda7b.png)
# まとめ
このタスクは、日頃から現場でシステム開発をやってるメンバーにはジャッジし難い部分です。足元の収益性やタスク作業で目線が下がってる現場に対して、権限と責任を持っているCTOがすべきタスクです。１年に１度のタスクですがボリュームも大きいため放置しがちですが、しっかりと取り組む事が必要です。

ひき続き記事を書いていきますので、フォロー、イイねお願いします！

# シリーズ記事まとめ
CTO興味ある人へ：CTOの業務についてその１　会社組織内での話
https://qiita.com/k1morikawa@github/items/5e9022a99a51d9a57576
CTO興味ある人へ：CTOの業務についてその２　チームビルディング/採用
https://qiita.com/k1morikawa@github/items/b2b3fb2246bd0984bab1
CTO興味ある人へ：CTOの業務についてその３　チームビルディング/評価制度
https://qiita.com/k1morikawa@github/items/edb2e3c20ce02a201eec
CTO興味ある人へ：CTOの業務についてその４　チームビルディング/キャリア戦略
https://qiita.com/k1morikawa@github/items/9a6573dbba510c699362
CTO興味ある人へ：CTOの業務についてその５　チームビルディングまとめ
https://qiita.com/k1morikawa@github/items/7a4c9163a69cd9303e90
CTO興味ある人へ：CTOの業務についてその６　組織設計
https://qiita.com/k1morikawa@github/items/0b59893da6ecbb886a64
CTO興味ある人へ：CTOの業務についてその７　技術力アップ
https://qiita.com/k1morikawa@github/items/fa50105d0e6af34a9961
CTO興味ある人へ：CTOの業務についてその８　セキュリティ管理
https://qiita.com/k1morikawa@github/items/a4d773ac12b4c4c745a5
Arduino UNOとカラーOLED SSD1331で遊ぶ3 (「46」よろーを表示)

x Adafruit SSD1331 OLED Driver Library for Arduino を　インストール
x Adafruit GFX Library を　インストール

目的
カラーOLEDのテスト

sclk 13　, SCL
mosi 11 , SDA
cs 10 , CS
rst 9 , RES
dc 8 , DC

有機ＥＬディスプレイ　０．９５インチ　９６×６４ドット　ＲＧＢ
[QT095B]
通販コード　P-14435
発売日　2019/09/02


![o_cop252.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bffde513-5b7d-270a-74da-a2659e4d93fa.jpeg)



前のページへ


https://qiita.com/caa45040/items/35a7ee9c49a6d78bd535


資料


https://qiita.com/jakalada/items/793a6cf5ff2796db4e86


プログラム


```c++



//OLED_SSD1331_NUM_TEST1

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>


// You can use any (4 or) 5 pins
#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8


// Color definitions
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF


Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, cs, dc, rst);

//初期化
void setup() {

  display.begin();

  //display.fillScreen(BLACK);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.fillScreen(BLACK);

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);

  //46を設定
  int tempval = 46;

  //表示変換する
  char str1[3];
  str1[0] = '0' + (tempval/10);
  str1[1] = '0' + (tempval%10);
  str1[2] = 0;

  // 1行目に数字を表示
  display.println(str1);

  delay(1000); //1秒待つ

}//loop





```
翻訳 なんてものについて知らなかったこと


2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。翻訳。右クリックでできる翻訳。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/9b6fbb6a-df6c-6d5a-d31b-eaef148f6a22.png)
汚染ソリューション。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/23be0cc1-59ec-456a-ad18-67e151907615.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f0905ca5-361f-0367-3106-91470e11cdd1.png)


> 2021年にTEDに参加して以来、メンバーコミュニティから放射されるサポートと積極性に感動しています。
 
> 非営利団体として、TEDは、視点を変えるアイデアを誰もがどこからでも利用できるようにするという単一の使命に焦点を当てています。私たちは、場所やステータスに関係なく、アイデアがどのようにあなたにインスピレーションを与えるかを常に見たり聞いたりします。あなたが私たちがこの仕事をする理由です。 
 
> あなたの貢献により、私たちは事業を継続できるため、私たちはあなたや他の何百万人もの人々に、学び、成長し、つながるための新しい方法を提供し続けることができます。メンバーになるか、あなたの人生で特別な人にメンバーシップを与えることによって、今日TEDをサポートしてください。12月31日までに3,000人の新会員を迎えるという目標を設定しており、寄付ごとに1人の会員が近づきます。この重要な時期にご検討いただきありがとうございます。
 
> 誠に
> アレクサンドラ・シラディ、TEDメンバーシップ、オペレーションマネージャー

誠に、この翻訳精度は各人各様ですよね...

[【機械翻訳精度】マイクロソフトドキュメントをMicrosoft/Google/DeepLで翻訳比較 - トマシープが学ぶ](https://bibinbaleo.hatenablog.com/entry/2020/04/24/210524)
[「DeepL」公式の「Microsoft Edge」向け拡張機能が登場 ～品質の高さで知られるAI翻訳サービス - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1461467.html)

注意事項としてはこれだが

https://qiita.com/jnchito/items/5667091e00cdf38d299a

[Azure Logic Apps](https://qiita.com/e99h2121/items/a69e40d016f5df01b061) でも使えるのやで。

https://learn.microsoft.com/ja-jp/connectors/translatorv2/

せわしなくなってきた！今年私が知らなかったことでした :snowboarder:
renderメソッドで複数のページを集約する

# 技術的なこと
　いい加減技術的なことを書かないといけない。renderメソッドを使って、似通ったページを集約することを考えよう。メリットはメンテナンスが楽になる、ということ。デザインや文面を変更するときに、修正する箇所が少なくなる。

　目標の登録画面と、編集画面を一緒にした。

```erb:app/views/plans/new.html.erb
<%= render "layouts/header", title: "目標登録" , bg_color: "primary" %>
<%= render "form" ,title: "登録"%>
```

```erb:app/views/plans/edit.html.erb
<%= render "layouts/header", title: "目標編集" , bg_color: "primary" %>
<%= render "form" ,title: "編集"%>
```

　こんなふうに書いている。レンダリング先のページも必要。


# 解説

　renderメソッドは「表示させるviewファイルを指定して表示」するメソッドである。（ドキュメントより）。
　さきのコードでは`views/plans/new.html.erb`　から `views/layouts/_header.html.erb`　と`views/plans/_form.html.erb`　を参照している。

　また、`title`とか`bg_color`と書いているが、こうやってインスタンス変数をつくって、飛んだページで参照することができる。たとえば`_header.html.erb`　は以下のように書いている。

```erb:app/views/layouts/_header.html.erb
<header id="main-header" class="py-2 sub_header bg-<%= bg_color %> text-white">
  <div class="container">
    <div class="row">
      <div class="col-md-6">
        <h4><i class="fas fa-cog"></i><%= title %></h4>
      </div>
    </div>
  </div>
</header>
```
`<%= bg_color %>` はbootstrapを適用した時に使う、背景色の指定だ。`primary`とかそんなのが入る。

`<%= title %>` に目標編集とか目標登録とか、そんな文面が入る。


# 整理とか集約とか

　開発も落ち着きつつあって、次はデザインの修正やテストの充実とか、そんなことをやっていくフェーズになってきた。日々コードを書いていく。
モーショントレイルを使って遊ぶ

モーショントレイルは見てておもしろいですね。

https://knowledge.autodesk.com/ja/support/maya/getting-started/caas/CloudHelp/cloudhelp/2022/JPN/Maya-Animation/files/GUID-2DFBE283-1A1E-4194-B6C5-B4E0F72D61CA-htm.html

キーフレームの情報がダイレクトに反映されるので、何かに使えそう・・・・

表示されてるし、選択できるし、きっと何かshapeを持っててるんだろうな。

という安易な発想からスタートしました。

観察
-

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/22dfd2a8-4656-1956-330a-54ad14626235.png)

なるほど解らん。

それっぽいのは points 

```
import maya.cmds as cmds
cmds.getAttr("motionTrail1.points")

```
でなんかいっぱい帰ってきた！

で、これらの位置は何だろうかというのを確認してみる

```
import maya.cmds as cmds
points = cmds.getAttr("motionTrail1.points")

for point in points:
    node = cmds.createNode("joint")
    cmds.xform(node,ws =True,t = point[:-1])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/306caed9-05c4-d569-847e-1d20c4616163.png)

ｿﾞﾜﾜ
なるほど、カーブの位置情報ですね。

加工
-

じゃぁこれを加工してあげればいいんですが・・・
このアトリビュート array型なのでここから加工するのがﾒﾝﾄﾞｲ

なので、exprespyを活用してみようかと
https://github.com/ryusas/maya_exprespy

pointsをもらってきて
```
points = motionTrail1.points
```

これをカーブデータに変換して、既存のnurbsCurveに差し込む
```
points = motionTrail1.points

pointArrayFn = api.MFnPointArrayData(points)
curveData = api.MFnNurbsCurveData().create()
api.MFnNurbsCurve().createWithEditPoints(pointArrayFn,3, api.MFnNurbsCurve.kOpen, False, True, True, curveData)
curveShape1.create = curveData
```

さてどうでしょうかね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0f12ceed-528d-585c-3df8-7201e66efb83.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/a071492c-207c-335d-ea73-9df248fdc1ea.png)

うん　出てますね。

キーフレームを変えても
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/226a3a5f-004f-b078-6202-d133cc2ca6bc.png)

ついてきてくれますね。
こうなればただのnurbsCurveなので色々できそうですな！

まとめ
-

- exprespy便利ですね
- motionTrail 過ぎたフレームの色かわるので、現在位置取れる。
- 実際アニメーションさせるとどうなるかはちょっと心配
2022/12/20主にITとかセキュリティの記事

「Samba」にセキュリティアップデート - 4件の脆弱性を解消
https://www.security-next.com/142329

公表資料の墨塗り処理に不備、秘匿情報が閲覧可能に - 新潟大
https://www.security-next.com/142241

VMwareのクラウド運用管理ソリューションに複数の脆弱性
https://www.security-next.com/142332

メタバースは2030年に25兆円市場へ、JEITAが先端デジタル技術の世界市場を予測(12/15)
https://xtech.nikkei.com/atcl/nxt/news/18/14317/

データ復旧費用や契約のトラブル回避へ、5団体がベンダーチェックシートを公開(12/19)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07521/

IT資格の新旧交代　AWSがオラクル超え(12/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/121300133/

「IPはもはや限界」、ファーウェイの新提案が世界で物議(12/19)
https://xtech.nikkei.com/atcl/nxt/mag/ne/18/00092/00003/

BIPROGYの報告書もザルだった、尼崎市「泥酔USB紛失事件」はこれで幕引きか(12/19)
https://xtech.nikkei.com/atcl/nxt/column/18/00148/121600263/

国際的なデータ移転ルールどう作るか？「DFFT」を各国がいま議論するワケ(12/19)
https://xtech.nikkei.com/atcl/nxt/column/18/02299/121400001/

iPhoneやAndroid端末が採用する「パスキー」、パスワードレス認証普及の課題とは(12/19)
https://xtech.nikkei.com/atcl/nxt/column/18/00086/00240/

深刻化するメモリー需要の低迷、それでもサムスン電子が減産しない理由(12/19)
https://xtech.nikkei.com/atcl/nxt/mag/ne/18/00001/00290/

個性豊かな8種類の軽量Linux、選択の決め手は何？(12/19)
https://xtech.nikkei.com/atcl/nxt/column/18/02261/112100001/

Windows 10の煩わしい「迷惑通知」、徹底的に排除してスッキリさせよう(12/19)
https://xtech.nikkei.com/atcl/nxt/column/18/02267/111800010/

営業支援系システムを内製開発　入力のムダ減らし利用率向上
コニカミノルタジャパン(12/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/120900119/

プリハイジャック攻撃（Pre-hijacking Attacks）(12/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/121200130/

「ビジネスモダナイズ」を目指せ　DXと違いBTが駄目だった訳とは(12/19)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/121300128/
【GMC-4】インチキじゃんけん

学研の4ビットマイコン GMC-4 で、一見じゃんけんのようなゲームを作ってみた。

# 遊び方

0 (グー)、1 (チョキ)、2 (パー) のいずれかのキーを押して自分の手を選択する。
自分の手を選択すると、選択した手を表す2進LEDが光り、7セグメントLEDに相手の手が表示される。
相手の手は、6 (グー)、A (チョキ)、0 (パー) のいずれかで表示される。(手の形をイメージした設計)

# 仕様

2人で行う通常のじゃんけんでは、1回手を出すと、1/3の確率で勝ち、1/3の確率で負け、1/3の確率であいこになる。
しかし、今回のプログラムでは、プレイヤーは1/8の確率で勝ち、7/8の確率で負け、あいこになる確率は0である。
勝つか負けるかをランダムで決め、プレイヤーの手を見てから後出しで手を出すのである。

Tモールの「CMじゃんけん」で全然あいこが出ないことから思いついた。

# プログラム

以下のプログラムは、[MikeAssembler](https://mikecat.github.io/mike_assembler/) でアセンブルできる。

```
target gmc4

	; プレイヤーの操作
	;   グー   : 0
	;   チョキ : 1
	;   パー   : 2
	; プレイヤーの出す手 (2進LED)
	;   グー   : 2ビット目
	;   チョキ : 1ビット目
	;   パー   : 0ビット目
	; 相手の出す手 (7セグメントLED)
	;   グー   : 6
	;   チョキ : A
	;   パー   : 0

	TIA 0
	TIY 0xE
	AM
	TIY 0xF
	AM
main_loop:
	CAL RSTO
	CAL DSPR
	; Zレジスタ : 勝敗制御用ルーレット
	TIY 0
	CH
key_wait:
	CH
	AIY 2
	CH
	KA
	JUMP key_wait
	; 3以上の値が入力された場合は、戻る
	AIA 0x10 - 3
	JUMP key_wait
	; 押された手を2進LEDに表示する
	CAL CMPL
	CY
	CAL SETR
	CY
	; さらに、勝てる手に変換する
	CAL CMPL
	AIA 5
	; ルーレットが0だった場合、1を引いて負ける手にする
	CH
	CIY 0
	JUMP no_win
	CH
	AIA -1
	CH
no_win:
	CH
	; mod 3 をとる (3以上だったら3を引く)
	AIA 0x10 - 3
	JUMP mod_no_rollback
	AIA 3
mod_no_rollback:
	; 出す手を7セグメントLEDに表示する数字に変換する
	TIY 0xD
	AM
	M+
	AM
	M+
	AIA 8
	JUMP hand_decided
	AIA -2
hand_decided:
	AO
	CAL SHTS
key_release_wait:
	KA
	JUMP main_loop
	JUMP key_release_wait
```

以下は、このプログラムの機械語表現である。

```
  | 0 1 2 3  4 5 6 7  8 9 A B  C D E F
--+-----------------------------------
0 | 8 0 A E  4 A F 4  E 0 E D  A 0 2 2
1 | B 2 2 0  F 0 F 9  D F 0 F  E 4 3 E
2 | 1 3 E 4  9 5 2 D  0 F 3 0  2 9 F 2
3 | 2 9 D F  3 8 9 3  A D 4 6  4 6 9 8
4 | F 4 5 9  E 1 E 9  0 F 0 8  F 4 8
```

# 解説

まず、キーから0～2の入力を受け付ける。
これに-3を足すと、それぞれ -3 (0b1101)、-2 (0b1110)、-1 (0b1111) となる。
これをビット反転すると、2 (0b0010)、1(0b0001)、0 (0b0000) となり、2進LEDの点灯位置が求まる。
もう一度ビット反転して元に戻し、5を足すと、2～4になる。
これは、0 (グー) に対して 2 (パー) などのように、3で割った余りがプレイヤーの出した手に勝てる手になっている。
プレイヤーの出した手に勝てる手にするには、さらに1を引けばよい。
すると、例えば 0 (グー) に対して 1 (チョキ) のようになる。
これらの計算で求まった値は3以上にはなり得るが6以上にはならないので、3以上であれば3を引くことで3で割った余りが求まる。
これは、まず3を引いてみて、0未満になったら3を足して取り消す、という処理で実現できる。
3を引いて0未満になるかは、例えば0に-3を足すことを考えるとわかるように、キャリーが無いかで判定できる。
最後に、求まった0～3の手を、7セグメントLEDに表示する数字に変換する。
今回は、0を6、1をA、2を0に変換することにした。
6とAの差は4なので、まず数値を4倍する。
すると、0は0、1は4、2は8になる。
これに8を足すと、それぞれ 8、C、0 となり、変換前が2のときは変換したい0となった。
さらに、このとき変換前が2のときはキャリーがあり、それ以外のときはキャリーが無い。
よって、キャリーが無ければさらに2を引くことで、求めたい 6、A、0 を求めることができる。

# 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/ZqcxP7mnnAQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
フォロワーシップを発揮し続けるためのフローチャートはいたってシンプルだった話

この記事は、[Ateam LifeDesign Advent Calendar 2022 シリーズ2](https://qiita.com/advent-calendar/2022/ateam-life-design)の20日目の記事です。

## この記事は
以前社内でスピーチで話した内容を再度まとめたものです。

## フォロワーシップとは
例えば[このあたりの記事](https://mba.globis.ac.jp/careernote/1239.html)がわかりやすそうです。
一定の市民権を得ている言葉だと思いますので、ここでの説明は割愛します。

## 当時考えていたこと
僕自身に、苦手なことはたくさんありますが、数少ない得意なことの１つがフォロワーシップです。
自分自身は特に努力をしたとかではなく自然と身についていたところが大きかったのですが、
メンバーとの1on1で、案外苦手な人が多いな、と気づき、あるときスピーチの題材にしました。

話を聞いていると、リーダーや上司の発言について「実は会社のあの方針にイマイチ納得いっていない」とか、「あのときの◯◯さんの発言、ちょっとモヤっとしていて・・・」みたいなことがときどき出てきていて、
一方自分はわりといつでも会社や上司と方針が擦り合ってて、”納得してるんだからあとは全力でやるだけ！”な状態が多く、このギャップはなんだろうと考えました。

## 自分の思考＆行動グセを一旦フローチャート化
いったん書いてみた図がこれです。
至ってシンプルで「納得いくまで質問する」だけじゃん？という図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/b3cd6811-4e1c-9a04-9ea5-f5f6d909344c.png)
でもよくよく話を聞いていくと、メンバーからは「そりゃあそうできたら理想ですけど、実際は・・・」という話が出てきました。
それは、
「リーダーや上司と話すとその場では納得できたように思えるが、後でやっぱり違うと感じる」とか
「リーダーや上司に論破されてしまうが、モヤモヤが残る」といったパターン。

弊社では、上司が「偉い人」のような位置づけにしていないですし、
実際起きているコミュニケーションも、高圧的だったりメンバーの意見に耳を傾けない、なんてことは無いはずです。
しかし、得てして上司やリーダーは”口がうまい”ってことはありますよね(笑)

もしかしたらそういう能力も含めて評価されているとか、活躍できている要因になっているかも知れませんし、
もしかしたら社会人経験が長かったり、多くの部下の相談を聞き続けたりしていると、同じ問題について思考する経験が多くて持論が確立されているのかも知れません。
僕自身、たしかに「なんかうまいこと説得されちまったな」ということはときどきあります。（最近は少ないかも。新卒時代はしょっちゅうあった）

## フローチャートをアップデート
これを受けて更新したチャートがこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/3c1df443-c01c-bd5c-bc73-393fecc3e710.png)
一番下に、「モヤモヤを言語化できる？」という分岐が加わり、Yesのときはこれまで通り、リーダーに再度質問しています。
がしかし、 **Noの場合、意味不明な結末を迎えています。**

これ、何がおきているか解説します(笑)
上司やリーダーの言っていることが絶対違うと感じるならそれを指摘するなり質問するなりしているのですが、
「モヤモヤを言語化できない」ということは、上司の発言も一理あるはずなんです。
少なくとも何らかの筋が通っているように聞こえる。
ただ、どこかに前提の違いか何かがあるのでモヤモヤしている。

僕の場合はですが、この状態でこれ以上悩むのは無駄に感じてしまいます。
この時点で、「モヤッとはするが自力で解消はできまへん」という、開き直ったみたいなステータスがくっきりしているので、
こういうとき僕は、少なくとも一理はある上司の方針に一旦全乗っかりして、
**思考を深めるのではなく状況を進めることを優先させます。**
すると、案外見えていなかった前提が見えて結局賛同できるパターンもありますし、
モヤモヤが言語化できて「あれ、やっぱ僕のほうが正しいんじゃない？」となるパターンもありますし、
薄々心のどこかでは気づいていたけど、自分が自分のやり方に固執したかっただけだったな、という気持ちの整理がつくパターンも稀にあります。
あくまで僕の場合です。

## そうじゃなくて・・・
で、またこれをメンバーに説明してみると、
「確かにそういう考えでうまくいくときもありますけど、普通に平行線で理解得られんときもありますよね」と。。
まああるっちゃあるかあ・・・
昔、これからはUXにこだわっていかないと！と主張してもなかなか理解が得られなかった時代とか、たしかにありました。

## さらにチャートを更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/4b2eceae-5e3f-d0fb-c29a-a3e6a631cae2.png)
それならばと、「平行線」パターンを追加です。
平行線とは、これ以上お互いもう新しい要素がなく、議論に折り合いがつかないまま着地もできず、という状態。
僕の場合、これもやっぱり、**議論を深めるのではなく状況を進めることを優先させます。**

## 最初のチャートであってた説
結局、これ以上なんの条件分岐が加わっても、同じ回答になる気がします。
つまるところ、「じゃあもう一旦やってみよ」という形で納得してしまっているので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101405/e507919e-f46b-091b-a261-5f281fe5e95e.png)
最初のこの図で言う「すっきり解決」になっているんですよね、僕の場合。
これ、「試着力」というやつでは。
結局この考えでわりといつでも気持ちよく働けているので、その成功体験も手伝って持論として定着している部分もありそうです。


あまり賢いノウハウ、という着地では無いんですが、ここまで話して
うちのメンバーの皆さんはわりと納得というか、肩肘を張らないで良くなることが増えました。

もちろん、こだわること・持論を突き詰めることも大切な前提ではありますが、
実際問題組織の中で何もかも詳細まで納得（もっというと共感）はできないケースもあるかも知れません。
顕在化していない悩みで手や歩みを止めず、一旦試着してみることをおすすめします。
Kageki (TD4互換機) で足し算

[TD4の命令を実行できる自作CPU「Kageki」](https://elchika.com/article/9ac9fd67-86c5-4b1b-a355-4f662e8af794/)で入力される2個の数値の足し算を行ってみた。

# 今回の仕様

入力ポートの下位3ビットで足される数を指定し、最上位ビットを立ち上げることで決定する。
入力ポートの下位3ビットで足す数を指定し、最上位ビットを立ち下げることで決定する。
出力ポートに和を出力する。

# プログラム

```
位置 機械語   アセンブリ言語
---------------------------------
0    00100000 FIRST:  IN  A
1    00001000         ADD A, 1000
2    11100000         JNC FIRST
3    01100000 SECOND: IN  B
4    01011000         ADD B, 1000
5    11100111         JNC ENTER
6    11110011         JMP SECOND
7    01011000 ENTER:  ADD B, 1000
8    00001111 LOOP:   ADD A, 1111
9    11101100         JNC FINISH
A    01010001         ADD B, 0001
B    11111000         JMP LOOP
C    10010000 FINISH: OUT B
D    11110000         JMP FIRST
```

0～2番地で、足される数を読み込む。`1000` を足すことで、最上位ビットは0となり、0～7の数値となる。
3～7番地で、足す数を読み込む。`1000` を足すことで最上位ビットは1となるので、もう一度 `1000` を足すことで0～7の数値にする。
8～B番地で、足し算を行う。一方の数から1を引き、負にならなければ他方の数に1を足す、ということを繰り返す。
C～D番地で、和を出力する。

# 実行結果

入力ポートに [Pmod SWT](https://digilent.com/shop/pmod-swt-4-user-slide-switches/)、出力ポートに [1-Digit 7seg Board](https://elchika.com/article/fb155241-6490-4cbf-ae85-c166c3743874/#h_1-Digit%207seg%20Board) を接続して実行した。
Pmod SWTのスイッチは端子を左向きにしたとき左から順に1、2、3、4と並んでいるが、今回は2進数として見やすいよう、ケーブルを用いて右のスイッチから順にビット0、1、2、3に接続した。
なお、今回は10Hzのクロックを用いて実行しており、本家TD4でも実行しやすいはずである。

<iframe width="560" height="315" src="https://www.youtube.com/embed/GYqWI-DOiqQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
ReactHooksについてまとめる（Performance Hooks useTransition）

# 概要
ReactHooksのPerformance Hooksについてのメモ記事です。基本的にReactの公式ドキュメントの咀嚼記事となっています。

今回は useTransition編です。


## useTransition
useTransitionは、UIをブロックすることなく状態を更新することができるReact Hookです。

Transitionとは？
→ 遷移や移行という意味を持つ

### State更新をノンブロッキングトランジションとしてマーキングする

コンポーネントのトップレベルでuseTransitionを呼び出し、いくつかのState更新を非ブロックトランジションとしてマークします。

useTransitionは2つの要素を持つ配列を返します。

1つ目は保留中の遷移があるかどうかを示す isPendingフラグ。
2つ目は状態の更新をトランジションとしてマークできるstartTransion関数。

```jsx
function TabContainer() {
  const [isPending, startTransition] = useTransition();
  const [tab, setTab] = useState('about');

  function selectTab(nextTab) {
    startTransition(() => {
      setTab(nextTab);
    });
  }
  // ...
}
```

トランジションは、低速なデバイスでもユーザーインターフェースの更新をレスポンスよく行うことができるようにします。

トランジションを使用すると、再レンダリングの途中でも UI の応答性を維持できます。たとえば、ユーザーがタブをクリックした後、気が変わって別のタブをクリックした場合、最初の再レンダリングが終了するのを待たずに、タブをクリックすることができます。

以下の例を触ってみるとわかりやすいです。

https://codesandbox.io/embed/autumn-darkness-kgs8wi?fontsize=14&hidenavigation=1&theme=dark

## トランジション中にPendingされているビジュアル状態を表示する

useTransitionが返すisPendingブール値を使用して、トランジションが進行中であることをユーザーに示すことができます。例えば、タブボタンに特別な "pending "ビジュアルステートを持たせることができます。

```jsx
function TabButton({ children, isActive, onClick }) {
  const [isPending, startTransition] = useTransition();
  // ...
  if (isPending) {
    return <b className="pending">{children}</b>;
  }
  // ...
```


こちらもsandboxの例を見てみましょう。
Post（slow）をクリックしてみると、タブがグレーになり、時間が立つと黒くハイライトされます。このように状態が遷移している際のPending中に表示を切り替えることができます。

https://codesandbox.io/embed/suspicious-dan-incjze?fontsize=14&hidenavigation=1&theme=dark

# 参考

https://beta.reactjs.org/apis/react/useTransition
Createjsでマウスの右ボタンのmousedownを取得

```javascript
document.addEventListener("contextmenu",(e)=>{
    e.preventDefault();
},true);

displayObject.addEventListener("mousedown",(e)=>{
    if(e.nativeEvent.button == 0){
        console.log("左");
    }else{
        console.log("右");
    }
});
```
【復刻版】黒帯のためのLOOP(2)

はじめに
========

この連載ではCommon LispのLOOPマクロをサンプルを使って紹介する。
LOOPマクロは (cl-loopを用いることで) Emacs Lispでも利用可能である。

【[Common Lisp: loopマクロ用法抄](http://smpl.seesaa.net/article/29800843.html)より引用】
> Grahamの _ANSI Common Lisp_ では嫌われていて碌に説明のないloopマクロ。一方、 _実践Common Lisp_ では対照的に好んで用いられていて、全編に渡って頻繁に使われている。しかしloopマクロは難しいという意識があるのかその説明は第22章とかなり後回しにされており、ちぐはぐな感を受ける。ここでは、 **黒帯のためのLOOP** という題のつけられたその章で解説されているloopマクロの用法を整理してみた。
> 
> _ANSI Common Lisp_ での黒魔術扱いに敬遠していたloopマクロだったが、こうして整理してみるとそれほど難しく考えずとも便利に使うことができそうだ。
> 
> [実践Common Lisp](http://www.amazon.co.jp/exec/obidos/ASIN/4274067211/)
> 作者: Peter Seibel,佐野匡俊,水丸淳,園城雅之,金子祐介
> 出版社/メーカー: オーム社
> 発売日: 2008/07/26
> メディア: 単行本（ソフトカバー）

LOOPのパーツ(**黒帯のためのLOOP**より)
============

LOOPの中では次のようなことができる。

* 数値的な変数や多様なデータ構造にわたる変数を更新していく
* ループしている間に見える値を収集(collect)、計数(count)、合計(sum)、最小化(minimize)、最大化(maximize)する
* 任意のLisp式を実行する
* いつループを終了するかを決定する
* それらを条件付きで実行する

上記に加えて、LOOPは以下のようなシンタックスを提供する。

* ループ内で使用するローカル変数の生成
* ループの前後に実行する任意のLisp式の指定

サンプル (GNU Emacs 28.2 で動作確認しています)
=======

また、@javacommons さんの以下の記事内の xpand-macro/xpand を用いてマクロ展開結果を取得しています。

https://qiita.com/javacommons/items/8fb62f9052df31582168


今回は…
========

今回は、LOOP マクロに関する Emacs Lisp と Common Lisp の非互換性について紹介します。

## ベクターのリードシンタックスの違い

* 厳密には、LOOPマクロ自体の違いではないですが…

```cl:CLISPの場合
CLISP> (loop for i across #(1 2 3) do (print i))

1
2
3
⇒NIL
```

```elisp:ELISPの場合
(cl-loop for i across [1 2 3] do (print i))
    |
    |
    v
(let* ((--cl-vec-- [1 2 3])
       (--cl-idx-- -1)
       (i nil))
  (while (and (setq --cl-idx-- (1+ --cl-idx--))
              (< --cl-idx-- (length --cl-vec--)))
    (setq i (aref --cl-vec-- --cl-idx--))
    (print i))
  nil)


1

2

3
nil
```

## 値の累積(accumulation)に関する違い

* Emacs Lisp では、以下のように concat (文字列の結合) accumulation が使えます。

```el:ELISPのみ
(cl-loop for str in '("A" "B" "C")
         for sep = "" then ","
         concat sep
         concat str)
    |
    |
    v
(let* ((--cl-var--_1 '("A" "B" "C"))
       (str nil)
       (sep nil)
       (--cl-var--_2 "")
       (--cl-var--_3 t))
  (while (consp --cl-var--_1)
    (setq str (car --cl-var--_1))
    (setq sep (if --cl-var--_3 "" ","))
    (setq --cl-var--_2 (concat --cl-var--_2 sep))
    (setq --cl-var--_2 (concat --cl-var--_2 str))
    (setq --cl-var--_1 (cdr --cl-var--_1))
    (setq --cl-var--_3 nil))
  --cl-var--_2)

"A,B,C"
```

最後に
======

他にも非互換等ありましたらコメント等でお願いします。
サーバレスキャッシュサービス Momento とは？

# 概要

* 注目度が高まりつつあるサーバレスキャッシュサービス Momento。
* 今回は、そんな Momento とは何かについて調べつつ検証していきたいと思います。

## Momento とは

* 一言で言って仕舞えば、サーバレスキャッシュサービスなのだ。
* プロビジョンや、スケーリング等の管理は不要で、サクッとキャッシュできる機能を持っている。

## 特徴

* プロビジョンが不要で、管理もいらない
* 最低料金がなく、従量課金
* 1 API の呼び出しだけでも利用できる
* 計画停止が無い
* インスタンスも無い

## ユースケースは？

* DynamoDB テーブルのキャッシュ
* AWS Lambda でキャッシュ
* S3における高いPUT/GET などのコストがかかるワークロードでキャッシュ
* Mongo や Cassandra 等の他のクラウドサービスの DB をキャッシュ
* Redis / memcached からそのまま置き換え
* リアルタイム予想のための機械学習ワークフローでキャッシュ
* NewSQL DB をキャッシュ
* RDS / Aurora をキャッシュ


## よしやってみよう

* まずは、momento-cli をインストールしてみます。

```
> brew tap momentohq/tap
> brew install momento-cli
```

* 認証情報を設定します。
* Momento での認証は認証トークンを介して行われるので、CLI から直接 Momento Serverless Cache 認証トークンにサインアップします。

```
> momento account signup aws --email <TYPE_YOUR_EMAIL_HERE> --region <TYPE_DESIRED_REGION>
```

* Momento から認証トークンがメールで送信されます。
* このトークンを使用するように CLI を設定します。

```
> momento configure                                                                                                ok  10s  01:37:06
Token: xxxxxxxxxxxxxx
Default Cache [default-cache]: examp-cache-server
Default Ttl Seconds [600]: 60
example-cache successfully created as the default with default TTL of 60s
```

* 遊んでみましょう。
* お、キャッシュさせて遊んでみましたが、TTL を 60秒に設定していたため、60秒経過後にはキャッシュが削除されましたね。

```
 ~  momento cache set --key HI --value koitabashi  ok  01:39:35
 ~  momento cache get --key HI   ok  01:39:39
koitabashi
 ~  momento cache get --key HI   ok  01:39:41
koitabashi
 ~  momento cache get --key HI   ok  01:39:56
koitabashi
 ~  momento cache get --key HI   ok  01:39:59
koitabashi
 ~  momento cache get --key HI   ok  01:40:12
koitabashi
 ~  momento cache get --key HI  ok  01:40:14
 ~  1 err  01:41:16
```


## まとめ

* 一旦ここまでとします。
* 楽にキャッシュサービスである Momento を利用することができましたね！
* 次回は、AWS 環境上で Momento を試していきます。

# 参考文献

https://jp.gomomento.com/

https://docs.momentohq.com/?__hstc=10882667.641157307846f7e583e1055c41458831.1671265354609.1671265354609.1671265354609.1&__hssc=10882667.4.1671265354609&__hsfp=108765593
M1 Macにjava17をインストール

[oracleのjava17ダウンロードページ](https://www.oracle.com/java/technologies/downloads/#java17)に行き、M1 mac用インストーラをダウンロードする。
注意すべきはM1とインテルの違い。
```
・Arm 64 DMG Installer・・・M1用
・x64 DMG Installer・・・インテル用
```
あとは普通にインストールするだけ。

#### バージョンチェック
```
java -version
```

#### インストール先
```
/usr/libexec/java_home -V
```

## 参考サイト
https://amateur-engineer.com/mac-jdk-install/
AWS WAFのハードリミット


# 概要

**AWS WAF**を設定する機会が多かったのですが、WCUを制限緩和してもらった際の記録です。

# 内容

## AWSリソースの上限値
AWSでは、基本的にリソースの使用数などの**デフォルト制限値**があり
例えばよくあるものとして、以下のようなものが挙げられます。

- リージョン毎の、**VPC数**　5つまで
- リージョン毎の、**NAT Gatewayの数**　10まで
- リージョン毎の、**EIPの数**　5つまで

これらの値は、マネジメントコンソールの[Service Quotas](https://ap-northeast-1.console.aws.amazon.com/servicequotas/home)から現状確認ができます。
**上限を変更**してもらうときは、「クォータの引き上げをリクエスト」あるいは[AWSサポート](https://support.console.aws.amazon.com/support/home?region=ap-northeast-1#/)に依頼します。

ただしどこまでも制限緩和できるものではなく、**ハード的な制限もあるので限界数があります。**

## WAFの場合

WAFでは、要件によっては沢山のブロックルールを追加することがあります。
ルールには**WCU = WebACL容量ユニット** という、ルール毎に決められた値が存在します。

例えば、WebACLには**無料の各種AWSマネージドルール**があるためフル活用して
以下のようなものを適用してみます。
Admin protection（ルール名）：100（WCU）
Anonymous IP list：50
Known bad inputs：200
Linux operating system：200
PHP application：100

すると、WCUは650となり、**デフォルト制限である1500**の半分程度を使用した状態になります。

次に、**有償ルール**を使用してさらに最新の傾向を追えるようにします。
OWASP Top 10 Rule Set：1400　（Cloudbric社の例）

ここで合計で2050となり、デフォルト値では適用できなくなります。


## AWSサポートに依頼

先日、こういったパターンでAWSサポートで依頼する必要がありました。

どうやら、1500-2500までは対応いただけるのですが
**2500がハードリミット**があり、それ以上はできないとの回答でした。


## できる対策

WAFのルールは魅力的なルールも多いです。
しかし、特にマネージドルールと併用している場合は**対応範囲が重複**していることが多かったりします。

例えば、OWASP Top10系のSQL Injection対応がある場合ですが
AWSマネージドルール側で同じルール（SQL database）は必要ないと判断できます。
この辺りは、有償ルールをサブスクリプションした際にも、詳細ルールを個別でBlock設定できるため判断可能です。


## 料金の注意点

WAFの料金は[こちら](https://aws.amazon.com/jp/waf/pricing/)で、例えばバージニアリージョンでは

Web ACL	5.00USD、月あたり (時間で案分)
ルール	1.00USD、月あたり (時間で案分)
リクエスト　100 万リクエストあたり0.60USD 
+インテリジェントな脅威の軽減　といった形です。　※他に無料利用枠もあります。

注意点として、リクエスト料金単価は**WCUをあげた場合以下のように変動します。**（2022/11時点）
   0-1500WCUの場合：100万リクエストあたり$0.60
1500-2000WCUの場合：100万リクエストあたり$0.80
2000-2500WCUの場合：100万リクエストあたり$1.00

大量にアクセスを捌く受けるサービスの場合は、**案外料金がかかる場合があるので**見積もりの際は注意してください。


# まとめ

今回はWCUについて忘れないように記載しました。

他のリソースの場合も同じですが、WCU緩和依頼の際は**あらかじめWebACLを作っておき**
そのARNも先に共有すると、よりスムーズに対応いただけます。

また、こういった申請は時間がかかることもあるため、**開発段階で早めの時期に済ませましょう。**
RemoteFacade & DataTransferObject

![19.RemoteFacade & DataTransferObject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/e125ae82-ed06-b60c-9489-bd24b04fe93b.png)

https://bliki-ja.github.io/pofeaa/RemoteFacade/

https://bliki-ja.github.io/pofeaa/DataTransferObject/

この 2 つは「分散パターン」に分類されています。

Remote Facade はネットワーク越しのデータアクセスのパフォーマンスを改善するためのパターンです。

複雑なデータモデルをオブジェクトで表現すると、いずれかの起点から関連オブジェクトを辿り、さらにその関連オブジェクトを辿って... といったようなプログラムを組むことになります。オンメモリのときは、オブジェクトを辿るコストはほとんどありませんが、遅いネットワーク、あるいはオーバーヘッドの大きいプロトコルを経由する場合、複雑なオブジェクト構造に直接アクセスするのは、パフォーマンス上の問題になってきます。たとえば、HTTP の REST API を設計するとき、データアクセスの粒度をレコードひとつづつとした場合、子要素が 10 あり、それぞれの子が持つ 10 の孫が必要なとき、瞬間的に必要な HTTP リクエスト数は 111 になります。

Facade パターンは、複数のオブジェクトの複雑な操作を隠蔽し、代表となる単一のオブジェクトを設けて簡単な操作を提供するというアイデアです。Remote Facade は Facade パターンが作る構造を、簡単さのためではなくパフォーマンスのために活かします。遅いリモートコールの受け口で、ありのままのオブジェクトの代わりに、アプリケーション都合に合わせて要約された形式のオブジェクトを作ります。たとえば請求書を表示するアプリケーションであれば、請求先 ID を持つ請求オブジェクトではなく、請求先企業名、請求先住所、請求明細、といった項目をすべて含む (できれば書式統一なども済ませた) オブジェクトにするのです。そうすれば、遅い通信の量を最小化できます。

Domain Model のエンティティとしては冗長だけれど、データ転送には適していると言える形に翻訳された形式のオブジェクトを、Data Transfer Object (DTO) と呼びます。コール側と送り側で同じ形式の DTO を共有しておき、インスタンスをエンコードしたものをデコードすると、同じオブジェクト復元できる、というふうに利用します。

DTO は、リモートアクセスごとに設けられ、それぞれ異なる形式になります。複数の DTO の間には、重複する部分も発生します。また、ひとつの DTO 内でも、Identity Map 上は同じインスタンスになているものが、参照箇所それぞれに展開されたりする場合もあります。DTO は、データ正規化や一意性管理に関係のあるエンティティではありません。分類で言うと Value Object になります (とはいえ、PoEAA には、だからといって DTO イコール Value Object と呼ぶ習慣には同意できない、といった批判が書かれています)。
[mapbox]フィルタリングしたレイヤーをクラスター化した結果が０になるのを防ぐ

具体的には下記のような症状を防ぐ方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2d852a28-9293-cbce-5f03-77f79d8046bf.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ba4419df-418f-d315-a6f0-35b9b342d700.png)
動画だとわかりやすいのですが、レイヤーのフィルタリングでポイントが表示されていないにもかかわらず、クラスター化すると顕在化し'0'と表示されます。
https://youtu.be/XAmTpVcJfCQ

今回使用させてもらったのは[国土数値情報の医療機関データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P04-v3_0.html)です。
全国の医療機関一覧が位置情報とともに取得でき、かつ[医療機関分類コード](https://nlftp.mlit.go.jp/ksj/gml/codelist/MedClassCd.html)によって区分けされています。これを扱いやすい形にしてmapboxにて表示しました。

レイヤーのフィルタリング方法としては、まず
```
getFilterExpressionPart = function(_ckFlags){
    var tmpEpr = ['any'];
    if((_ckFlags&1)==1){ tmpEpr.push(['==',1,['get','code']]); } // P04_001
    if((_ckFlags&2)==2){ tmpEpr.push(['==',2,['get','code']]); }
    if((_ckFlags&4)==4){ tmpEpr.push(['==',3,['get','code']]); }
    return tmpEpr;
}
```
のような関数で表示する分類に応じたフィルターを作成し、

```
       map.addLayer({
            id: 'hospital-point',
            type: 'circle',
            source: 'hospitalSrc',
            filter: ['all',['!', ['has', 'point_count']],epr],
             :
```
で表示するようにしています。

クラスターレイヤーの設定には
```
        map.addSource('hospitalSrc', {
            'type': 'geojson',
            'data':hospitalAll,
            cluster: true,
            clusterMaxZoom: 10, // Max zoom to cluster points on
            clusterRadius: 20, // Radius of each cluster when clustering points (defaults to 50)
            clusterMinPoints:2,
            clusterProperties: {
                'sump': ['+', ['case', epr, 1,0 ]], //
            }
        });
```
のようにsumpを作成しこれを使用しました。

その結果が上記になるのですが、結論としては

```
        map.addSource('hospitalSrc', {
            'type': 'geojson',
            'data':hospitalAll,
            filter: epr,
            cluster: true,
            clusterMaxZoom: 10, // Max zoom to cluster points on
            clusterRadius: 20, // Radius of each cluster when clustering points (defaults to 50)
            clusterMinPoints:2,
            clusterProperties: {
                'sump': ['+', ['case', epr, 1,0 ]], //
            }
        });
```

のように、sourceに```filter: epr``` を追加することで回避することができました。
sourceにもfilter使えたんですね。。勉強になりました。

https://youtu.be/sxGf27RPoVc
[Day24] ドキュメントとリソースの読み込み

本記事は一人アドベントカレンダー企画の一つです。
[30代未経験エンジニアが25日後にJavaScriptをマスターするカレンダー](https://qiita.com/advent-calendar/2022)

[JAVASCRIPT.INFO](https://ja.javascript.info/)を元にJavaScriptを勉強していき、そこで学んだ知識をアウトプットしていきます。
２５日でJAVASCRIPT.INFOをやりきり、未経験エンジニアがJavaScriptをマスターする過程を投稿していきます。



## 2.2.1 ページのライフサイクル: DOMContentLoaded, load, beforeunload, unload
### 知らない単語
- ハンドラとは
  - コンピュータプログラムやその一部分で、何らかの処理要求が発生したときに起動されるもの

- トリガとは
  - きっかけになる出来事が起こったら自動的に特定の処理を起動するソフトウェアの仕組み

### 学んだこと
HTML ページのライフサイクルは、3つのイベントを持つ

DOMContentLoaded – ブラウザが HTML を読み込み、DOM ツリーは構築されたが、写真 img のような外部リソースやスタイルシートはまだ読み込まれていない可能性がある
load – ブラウザがすべてのリソースを読み込んだ
beforeunload/unload – ユーザがページを離れようとしている時

- DOMContentLoaded と scripts

ブラウザが最初にHTMLをロードし、script.../script に出くわすと、DOM の構築を続けることができないので、このようなスクリプトがすべて実行された後にのみ DOMContentLoaded は発生する可能性がある

外部スクリプトも、スクリプトがロードされ実行されている間はDOM の構築は一時停止するので、DOMContentLoaded は外部スクリプトも待つ
async または defer もつ外部のものを除いたすべてのスクリプトが実行される

- document
document.readyState – ドキュメントの現在の状態で、変更は readystatechange イベントで追跡することが可能
loading – ドキュメントを読み込み中
interactive – ドキュメントはパースされ、DOMContentLoaded とほぼ同じ時間に発生する
complete – ドキュメントとリソースが読み込まれ、window.onload とほぼ同じ時間に発生する

### 感想
現在のドキュメントがどのような状態にあるのかをしっかり把握したい。



## 2.2.2 スクリプト: async, defer
### 知らない単語
- 無し

### 学んだこと
- defer

defer 属性はブラウザにスクリプトを待たないよう指示する代わりに、ブラウザは HTML の処理を継続し、DOM を構築する、スクリプトは バックグラウンドでロードされ、DOM が完全に構築されたときに実行される

defer を指定する
```javascript
<p>...content before script...</p>

<script defer src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script>

<!-- すぐに表示されます -->
<p>...content after script...</p>
```
要は
defer をもつスクリプトはページをブロックしないし、DOM が準備できた時に実行される

- async

async 属性は defer に似て、スクリプトをブロックしない

async 属性はスクリプトが完全に独立していることを意味する

ブラウザは async スクリプトをブロックしない
他のスクリプトは async スクリプトを待たず、async スクリプトも待たない
DOMContentLoaded は async スクリプトの前で発生する可能性がある

- 共通点

async と defer には共通点が1つある
スクリプトのダウンロードはページのレンダリングをブロックしないので、ユーザはページコンテンツを見ることができ、＝そのページのことを知ることができる

### 感想
スクリプトをブロックしないので、async 属性は deferと似ている。間違えないように特徴を捉えて覚えたい。



## 2.2.3 リソース読み込み: onload と onerror
### 知らない単語
- iframes
　　- HTMLのタグの一つで、Webページ内に矩形の領域を設け、別のWebページなどを読み込んで表示するもの

### 学んだこと
スクリプト, iframes, 画像 などの読み込みを追跡するイベント

onload – ロードが成功
onerror – エラーが発生

- スクリプトの読み込み

外部スクリプトにある関数を呼び出す時、
下記のようにして動的にロードできる
```javascript
let script = document.createElement('script');
script.src = "my.js";

document.head.append(script);
```
スクリプトの読み込みを待ってから初めて呼び出せる

- script.onload

主なヘルパーは load イベントで、スクリプトがロードされ、実行された後にトリガされる
```javascript
let script = document.createElement('script');

// 任意のドメインから任意のスクリプトがロードできる
script.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js"
document.head.append(script);

script.onload = function() {
  // スクリプトはヘルパー関数 "_" を作る
  alert(_); // 関数は利用可能
};
```
- script.onerror

スクリプトの読み込み中に発生したエラーは error イベントで追跡することが可能

### 感想
script.onloadとscript.onerrorについて学んだが、readystatechange イベントもリソースに対して機能する。しかしload/error イベントの方がシンプルなため、殆ど使われない。
役割は同じでも様々な種類のイベントやメソッドがあるので、間違えないようにしたい。


# 最後に
スクリプトやリソースについて学んできたが、時間が経つと忘れてしまうので、書き方をしっかり覚えておいて、実際に使う場面ですぐに思い出せるようにしたい。
また、次の記事で最後なので、終わってからもう1度しっかり復習して定着させるようにする。
IntelliJでspring bootビルド時の、javaバージョン関係のエラー

「17は無効なターゲット・リリースです」っていうエラーが出たので、調査した所、以下のサイトを発見。

＜参考サイト＞
https://amateur-engineer.com/intellij-gradle-java11-error/

以下あたりを見るといいらしい。
- Project > Project SDK のJavaバージョン
- Modules> Sources > Language level のJavaバージョン
- Modules> Dependencies > Module SDK のJavaバージョン
- Build Tools > Gradle > Gradle JVM のJavaバージョン
　※mavenの時は「Build Tools > Maven > インポーターのJDK」かな？
バージョン番号値を比較（シェルスクリプト）

こんにちは。
二つのバージョン番号の値を比較するシェルスクリプトを作りました[^1]。```bc``` コマンドで数値比較させています。
* 対応するバージョン番号は、xx.yy.zz　という形式で、各２桁以下とし、また xx.yy　や xx でも対応します。

```console
$ echo "3.0.1 > 3" | ./bc_ver.sh 
true
```

```bc_ver.sh
#!/bin/sh

## functions
bc_f () {
  [ "$(bc)" -eq 1 ]   # "222222 > 111111" => true, for example
}

ver2int_f () {
  echo "$1" | awk -F. '{printf "%2d%02d%02d", $1,$2,$3}'  # xx.yy.zz => xxyyzz
}

convert_f () {
  set $(cat)
  echo "$(ver2int_f "$1")" "$2" "$(ver2int_f "$3")"
}

split_f () {
  perl -pe 's/([\d\.]+).*?([=<>]+).*?([\d\.]+)/$1 $2 $3/g'  # "xx<yy" => "xx < yy", for example
}

## main
[ -p /dev/stdin ] && INPUT=$(cat) || INPUT="$@"
echo "$INPUT" | split_f | convert_f | bc_f && echo true || echo false

exit

```

[^1]: 参考：「[シェルスクリプトやmakefileでのバージョン番号 x.y.z の比較](https://qiita.com/akegashi/items/35bde2af80682ca77a70)」
Azure Monitorについて

●Azure Monitor
Azureサービス全体が監視できる。「エンドツーエンドで監視ができる」と表現される。テナント、サブスクリプション、リソース、仮想マシンなどで実行されるOS、そのOS内で実行されるアプリケーションなどを監視できる。

既定では収集されない監視データもあり、それらを収集するためには追加の構成画で必要。例えば、Azure仮想マシンのゲストOSの監視データを収集するには、そのためのエージェントまたは拡張機能を仮想マシンにインストールする必要がある。
ゲストOsの監視データを収取するエージェントにはAzure Monitorエージェント(AMA)、拡張機能にはWindows Azure Diagnostics(WAD)やLinux Azure Diagnostics(LAD)があり、それらをインストールすることにより、ゲストOS上のログやパフォーマンスデータが収集される。

※拡張機能を使用した場合は、その診断データはストレージアカウントに格納される。

●Azure Monitorが収集した全てのデータは２つの基本的な型に該当する
・メトリック
特定の時点におけるシステムの何かの側面を表す数値であり、簡単に言えばパフォーマンスデータ。

・ログ
システムないで発生した操作や変化の記録。

●メトリックの参照
AzureMonitorにはメトリックを参照するための機能としてメトリックエクスプローラーがある。
メトリックデータベース内のデータを対話的に分析して、一定期間にわたる複数のメトリックの値をグラフ化できる。
日本語入力ソフトSKKの紹介


[テクノロジー検証 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/technology_validation) 17日目の記事です。

本記事では日本語入力ソフトSKK(Simple Kana to Kanji conversion program)を紹介します。

# 1. 概要

SKKは1987年に生まれた日本語入力ソフトです。テキストエディタ emacs 上で動作します。
一般的なMS-IMEなどと同じく、主にローマ字入力されたひらがなを漢字に変換します。
変換方法がなかなかクセのある仕組みで、万人向けではありませんが、こんな方式もあるんだなと知るのも面白いかと思います。


# 2. 特徴

(私の思う)SKKの特徴は以下の2点です。

### 単語分解を行わない

日本語は英語と違い、単語がスペースで区切られていません。
そのため、辞書を用いて漢字変換を行うには、文を単語単位に分解する必要があります。
多くの日本語入力ソフトはソフトウェアが単語分解を行い、分解した単語を漢字変換します。
いっぽうでSKKでは、単語分解を人間(入力者)が行う必要があります。

### 文脈を読まない

例えば「はかる」という言葉は文脈によって使用する漢字が異なります。(図る、測る、計るなど)
[Google 日本語入力](https://www.google.co.jp/ime/)などのソフトウェアでは、文脈から適切な言葉を選択してくれます。
いっぽうでSKKは、そのような類推は行ってくれません。

# 2. 例文による一般的な日本語入力ソフトとの比較
ここでは「今日は医者までの距離を測ろう」という例文をGoogle日本語入力とSKKとで入力してみます。

## 1. Google 日本語入力の場合
Google日本語入力では、とくに深く考えずに先頭から最後までローマ字で入力しスペースキーで変換します。
以下では△はスペースキー入力を表しています。
~~~
kyouhahaisyamadenokyoriwohakarou△　→ 今日はい者までの距離を測ろう
~~~~
ソフトウェアによる単語分解の結果、単語の切る場所が意図通りになりませんでした。
カーソルキーなどで意図通りに変える必要があります。
しかし「はかる」は文脈を読んで正しく変換してくれました。

## 2. SKKの場合
SKKでも基本はローマ字で入力します。
ローマ字の最初の文字を大文字で入力すると、その後に入力する文字が変換対象となります。
スペースキーで変換を開始します。意図通りの結果がでなければ、スペースキーをまた押して次の候補を表示させます。
ここで注意が必要なのは、SKKは基本的に変換候補は単語でなければならない点です。
単語の区切りは入力者が指定する必要があるわけです。
Kyouha△では「今日は」は出せません。Kyou△haと入力する必要があります。

逆に考えれば、入力者が指定しますので、ソフトウェアによる単語区切りの失敗が発生しません。

~~~
Kyou△ha → 今日は
Isya△madenoKyori△wo → 医者までの距離を
~~~

続いて送り仮名についてです。
SKKでは送り仮名の一部が含まれて辞書に登録されています。
例えばSKKの代表的な辞書である[SKK-JISYO.L](http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1#p8)では「測ろう」を変換する場合に使用されるエントリは以下のように登録されています。
~~~
はかr /図;和解を図る/測;距離を測る/計;時間を計る,見計らう/量;体重を量る/諮;委員会に諮る/謀;暗殺を謀る/企/圖;「図」の旧字/
~~~
(;以降はアノテーション用です。SKKでは変換候補ごとにアノテーションをつけることができます。詳細は省略します。)

例文に戻ると
~~~
HakaRo → 図ろ
~~~
Hakaで「はか」までが変換対象になります。そして送り仮名のRを大文字で入力することで
SKKに対して「はか」までが変換候補で送り仮名にrが使われることが伝わります。
結果、oまで入力することで上記のように「図ろ」と変換されます。

上記特徴のように、SKKでは文脈をよみません。辞書の先頭もしくは前回使用した候補を最初に表示します。
初めて「はかr」を変換するときには辞書の先頭の「図r」が用いられます。
次の変換からは最後に確定した候補が最初に表示されます。
つまり、人が必要に応じてスペースキーを押して、正しい漢字を選ぶ必要があるわけです。

~~~
HakaRo△u → 測ろう
~~~

# 3. どんな人におすすめか?

「パソコンの漢字変換は頭が悪い」と不満に思っている人におすすめです。
あまりソフトウェアを信用しておらず、自分の入力する漢字は細かく自分で指定したい、という人にも向いています。
送り仮名の入力がスムーズにいくと気持ちが良いので、まるで文房具で文を書いているような感覚も味わえます。

しかしながら、送り仮名や漢字の知識がないと、かえってストレスが溜まるかもしれません。
私も以前はSKKを常用していましたが、実は最近はSKKを使い始めてもすぐMS-IME等に戻ってしまっています。
なかなか使う人を選ぶ方式であると言えるでしょう。

# 4. どうやって試す?

冒頭で書いたように、SKKはemacsというテキストエディタで動作するソフトウェアです。
しかしながら、emacsに依存せずOSネイティブな環境にもSKKライクなソフトウェアが実装されています。

Windows環境であれば、[CorvusSKK](https://nathancorvussolis.github.io/)がいちばん手っ取り早いでしょう。
[Microsoft Storeからインストール](https://apps.microsoft.com/store/detail/XPFCXLSGH2H786)することができます。

macOS環境であれば[AquaSKK](https://aquaskk.osdn.jp/)をどうぞ。

# まとめ

日本語入力ソフトSKKを紹介しました。
説明を読むとややこしいと感じるかもしれませんが、使ってみるとその名の通りシンプルです。（使いやすいという意味ではありません）
興味を持った方は試してみてはいかがでしょうか
【フロントエンド】Storybookを導入するといいよ

## はじめに

みなさんはStorybookを導入しているでしょうか？
僕の場合は、あまりスタイルをいじらないので、ずっとその恩恵がわからなかった。というのがあります。

ただ、チームで導入していいなと思うことがいくつかあったので今回記事にしようと思いました。

## Storybookとは？

![](https://storybook.js.org/images/develop/time-frame-overview.svg)

色々なことができてしまうので、定義が難しいのですが、

- UI（コンポーネント）作成
- テスト
- ドキュメント作成

みたいなことができるツールです。

## 何がいいの？

### 1. UIの検証・構築をアプリケーションを介さずにできる

UIの検証・構築がアプリケーションを立ち上げることなくできます。

![スクリーンショット 2022-12-20 0.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136353/680ab8f7-1bc2-11f8-262f-4039e4bd326d.png)


Controlsという項目でコンポーネントとパラメータを変更することができます。
以下のようにargsを定義しておくことで実現可能です。

```tsx
import { Button } from './Button';

export default {
  /* 👇 The title prop is optional.
  * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading
  * to learn how to generate automatic titles
  */
  title: 'Button',
  component: Button,
};

const Template = (args) => ({
  //👇 Your template goes here
});

export const Primary = Template.bind({});
Primary.args = {
  variant: 'primary',
};

export const Primary = {
  args: {
    variant: 'primary',
  },
};
```

構文も簡単ですし、コンポーネント側で型をきちんと書いておけば推論もしてくれるので作るのも苦になりません。

### 2. デザイナーとの意思疎通ができる

デザイナーから他のUIと統一感のないコンポーネントがFigmaやXDでもらうことがしばしばあるかと思います。

特に

- ユーザーのITリテラシーが高くないサイト
- 日常的に使うサービスではなく、使い方がわからないサイト

などの場合、ある程度機能のオンボーディングが必要となったりして、その場その場で強調したいコンテンツなどが変わり、デザインの統一がしづらかったりします。

ただ、統一感のないデザインは逆にユーザーのことを惑わせたりもします。
なので、これは共通化すべきだ、これは共通化しなくてもいい。

というのは実装を行うエンジニアとデザイナーがコミュニケーションをとりつつやる必要があります。

Figmaなどで共通認識をとる方法もありますが、Storybookもおすすめです。
なぜなら、コンポーネント名や引数名を共通言語とすることができるからです。

共通言語があるというのはコミュニケーションにおいてとても大切です。スムーズに物事が伝わります。

### 3. テストが行える

コンポーネント変更により意図しない変更が入っていないか？UIが崩れていないかを検証するんですね。

#### ビジュアルリグレッションテスト

僕たちのチームでは、ビジュアルリグレッションテストを行っています。

![スクリーンショット 2022-12-20 0.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136353/a3ad3960-2226-909e-8e80-edd42a151d77.png)

CI上で前回のmainブランチとの差分を検知し、変わったコンポーネントを表示します。

#### インタラクションテスト

これは僕たちのチームではできていないですが、インタラクションテストも実現可能です。

![スクリーンショット 2022-12-20 0.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136353/dd579ff5-ec34-7d31-90fb-48f077b32bce.png)

ワークフローを書き、実際にユーザーがアクションを起こした場合どういう挙動をするのかテストすることができます。

ミニE2Eのようなものかなと思います。
小さな単位でこの検証ができるのはとても良いですよね。

## まとめ

Storybookについて紹介してみました。
デザイナーとの共通認識を取ったり、現状のシステムに組み込むのも少し難しいので、導入コストが少し高いですが、うまく運用していけるとかなり強力な武器になってくれるのでぜひ使ってみてください。
GitLabの利用

# 初めに
CI/CDの勉強をしようとGitlabの導入を検討した。
Gitlabはリモートリポジトリとして利用ができるほか、CI/CDの構築が行える。
今回はアカウント登録の作業をテキストベースでまとめておく。
# Gitlab利用登録
1. Gitlabの公式ページからFreeでSaaSバージョンのGitlab登録ページへ遷移する。
1. 所望の登録方法でアカウントの登録を行う。利用用途は学習用途を選択。

※初回は英語表記のため、アカウントを作成してから左にあるメニュータブからセッティングを選択し、日本語設定を行った。
※プロジェクトの作成を求められるので、適当に新規に作成する。
※SaaS版とオンプレ版の二つがあるので、利用用途に合わせて選択する。
※複数人で利用する場合や利用製薬に引っかからないかを確認。

# eclipseとGitlabの連携
1. eclipseをダウンロード後、EGitをインストールする。
1. GitLabのクローンURIを設定してプロジェクトをローカルのeclipseからクローンする。試しにテキストファイルをコミット、プッシュしてGitLabコンソール上で最新版になっているかを確認する。

# 今後の予定
1. Gitのコマンドを一通りやってみて問題がないことを確認する。
1. AWS EC2にアプリサーバを構築し、CI/CDパイプラインを実装する。
ラインを超えてるか判定するやつでリキャプチャもどきを作ってみた

クソアプリアドベントカレンダー2022 19日目担当の<a href="https://twitter.com/HironobuOhashi">大橋＠ハシタス<a>です！

日付が変わってからの投稿で大変申し訳ないです。。。。。

昨年参加したいなーと宣言していたので今回は乗っかってみました。

ネタ的にはChatGPT使ってアプリ書けばいいかーとたかを括ってたらネタが被る＆著作権問題など私が考えていたものよりしっかりとやられていたのでこれはやってはいかんと思い・・・なんとか頑張って書きました。

> 企画の壁打ち・企画書の自動生成・コード生成までChatGPTさんにやってもらった (小説風)
> https://qiita.com/alclimb/items/91d9183aed12fd6db4f8

とても素晴らしい内容でした（感服）


で、今回何をやったかというと先日のワールドカップでも日本の三苫選手がつないでくれた疑惑のライン判定がありましたね。
疑惑もなにも高精度のカメラとボールに内蔵されたセンサーで出ていないっていう判定なのでまぁまぁまぁなのですが。

それをどうにか、って思ってたのですが流石世の中は甘くなく、めちゃくちゃすごいアプリが夜に流れてきたのでびっくり仰天でした。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">サッカーボールがフィールドから出てるか出てないか判定するゲーム作ってみた <a href="https://t.co/TT8uayqGCE">pic.twitter.com/TT8uayqGCE</a></p>&mdash; ZAWA WORKS@12/22~25展示会開催 in 大阪梅田 (@zawa_works) <a href="https://twitter.com/zawa_works/status/1600123278521430016?ref_src=twsrc%5Etfw">December 6, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


とはいえ何か作らなくてはという事で・・・・いわゆるリキャプチャでよくあるようなお遊びアプリを作るかな
と思ってボールがラインを超えているかの判定するのを作ってみました。

こんな感じで仕様をざっと書いて、コード書いて、Qiita書いてで3時間くらいですかね・・・
![スクリーンショット 2022-12-19 22.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952618/6bf71fb3-e8a7-628d-7d15-a3f81cc8b3f5.png)


画面録画したやつ
https://drive.google.com/file/d/1dvT8zhypZmVSLihJMp1xIPqx-wjKSEGK/view
※QiitaはiFrameの埋め込みできないんですね・・
<iframe src="https://drive.google.com/file/d/1dvT8zhypZmVSLihJMp1xIPqx-wjKSEGK/preview" width="640" height="480" allow="autoplay"></iframe>


コードはこんな感じです。普段はPMなのでコードは書いてなく、、、突貫でjQueryとか使ってるのは許してください・・・
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="jOpOaNw" data-user="hironobu" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/hironobu/pen/jOpOaNw">
  Untitled</a> by Hironobu Ohashi (<a href="https://codepen.io/hironobu">@hironobu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

趣旨にあっているか分からないですが、考えて作りきった自分を褒めたいと思います！

来年はUnityでクソゲー作りたいと思います！
Rustでアセンブリを出力したい

この記事は [Qiita株式会社のカレンダー | Advent Calendar 2022 - Qiita](https://qiita.com/advent-calendar/2022/qiita-inc) の7日目の記事です。

## これはなに

以下の記事を読んで、Rustをビルドしたときのアセンブリを見てみたいと思い、アセンブリを出力する方法を調べたので書く。

- [RustのABIと共有ライブラリ - mox692 のブログ](https://mox692.hatenablog.com/entry/2021/12/05/212023)
- [Rustと少しのC - The Embedded Rust Book](https://tomoyuki-nakabayashi.github.io/book/interoperability/c-with-rust.html)
- [Application Binary Interface - The Rust Reference](https://doc.rust-lang.org/reference/abi.html)

## 結論

```console
$ rustc --emit asm main.rs
```

Intel syntaxで出力したい場合は、

```console
$ rustc --emit asm -C 'llvm-args=-x86-asm-syntax=intel' main.rs
```

https://doc.rust-lang.org/rustc/command-line-arguments.html#--emit-specifies-the-types-of-output-files-to-generate

アセンブリが出力されたことを確認。

```console
$ head main.s
        .text
        .intel_syntax noprefix
        .file   "main.89363361-cgu.0"
        .section        .text._ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17hbac26043a2d15d39E,"ax",@progbits
        .p2align        4, 0x90
        .type   _ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17hbac26043a2d15d39E,@function
_ZN3std10sys_common9backtrace28__rust_begin_short_backtrace17hbac26043a2d15d39E:
        .cfi_startproc
        sub     rsp, 24
        .cfi_def_cfa_offset 32
```

## Ref

- [RustのABIと共有ライブラリ - mox692 のブログ](https://mox692.hatenablog.com/entry/2021/12/05/212023)
- [Rustと少しのC - The Embedded Rust Book](https://tomoyuki-nakabayashi.github.io/book/interoperability/c-with-rust.html)
- [Application Binary Interface - The Rust Reference](https://doc.rust-lang.org/reference/abi.html)
- [Rustのゼロコスト抽象化の効果をアセンブラで確認](https://blog.rust-jp.rs/tatsuya6502/posts/2019-12-zero-cost-abstraction/)
- [--emit-specifies-the-types-of-output-files-to-generate | Command-line Arguments - The rustc book](https://doc.rust-lang.org/rustc/command-line-arguments.html#--emit-specifies-the-types-of-output-files-to-generate)
linuxでもhomebrewが使えるらしい

## はじめに

タイトルの通りです。

## homebrewとは

macOSでお馴染みのパッケージ管理システムです。

macOS上で、ソフトウェアの導入を単純化するもの。これを用いて様々なパッケージをインストールすることができます。

## パッケージ管理システムとは

### パッケージ

実行ファイルや設定ファイル、ライブラリなどを一つのファイルとしてまとめているものをパッケージと呼ぶ

### パッケージ管理システム

上の書いたパッケージのインストールやアンインストール作業を一元的管理するもの

パッケージやライブラリの依存関係などが管理できる

linuxでは各ディストリビューションのパッケージ管理システム（apt, yum, packman）がある

### 公式サイトからの直インストールではダメなのか？

そのやり方だと、新しいバージョンが出るたびに前のバージョンのファイルを削除し、再度ダウンロード・インストールする必要があり、前バージョンの関連ファイルを削除したり、どれが関係するファイルかを探したりなど、手間な上に難しい場合もある

コマンド一つで管理できる方が圧倒的に楽

## homebrewをlinuxにインストールできるの？

ちょっと前にlinux対応していました

[https://brew.sh/index_ja](https://docs.brew.sh/Homebrew-on-Linux)

ただし、macOSでbrewインストール出来るものが全てlinuxでもインストール出来るというわけではなく、対応していないものもあるので注意してください

## homebrewを導入するメリット

- aptやyumなどのパッケージ管理システムではパッケージ管理されていなく、リポジトリ化されていないプログラムの導入・更新が楽になる
    - 例えば…
    - Hugo
    - docker-compose
    - lazydocker など
    - これらは更新があるたびに、公式サイトからダウンロードして入れ替える必要がある場合があるが、これがbrew update xxx みたいに簡素化できる
- Linuxのパッケージ管理よりも更新が早い
    - 新しいバージョンのプログラムを利用できることが多い
    - RedHad系のパッケージはバージョンが古いことが多いので、Homebrewを導入するメリットがあるらしい

## インストール

公式ページにインストール方法が書いてあります

[https://brew.sh/index_ja](https://brew.sh/index_ja)