OmniAICreator/Qiita-1.07M huggingface dataset:
zstd vs deflate on zswap

パラレルATAからしかbootできない自機で、HDDが死亡寸前。
今時、パラレルATA接続のストレージなんて手に入らない。
そこで、[kexec機構][kexec]を用いた最小限のlinuxカーネルとinitial ram filesystemをCDに焼き、USBメモリに格納したシステムへ[chainload][chainload]。

[kexec]: https://ja.wikipedia.org/wiki/Kexec "kexec - Wikipedia"
[chainload]: https://en.wikipedia.org/wiki/Chain_loading "Chain loading - Wikipedia"

USBフラッシュメモリの寿命は書き込みによって減るので、swap領域への書き込みを減らすために[zswap][zswap]を導入。
ここで、zswapの圧縮アルゴリズム選択で気になったのでネット検索したところ、2024年5月現在、多くのサイトで勧められている圧縮アルゴリズムzstdが、小さなファイルでは圧縮率がよくないらしい。
自分がこのことを知ったのは[2016年のOSS圧縮ツール選択カタログ #Linux - Qiita][2016]を読んでから。
zstdの開発元でも、[Compression ratio worse than zlib for small blobs - Issue #1134 - facebook/zstd - GitHub](https://github.com/facebook/zstd/issues/1134)として認識されているようだ。
そして、swapはページ単位で行われ、自機の属するアーキテクチャであるx86でのページサイズは4キロバイト。
[Squash Compression Benchmark - GitHub Pages](http://quixdb.github.io/squash-benchmark/)によると、4キロバイト前後のファイルサイズでは、zstdはスピードではdeflateを上回るが圧縮率では負ける。
なので、自分は圧縮率優先でdeflateをzswapの圧縮アルゴリズムに選択した。

>新しめのツールはbrotli以外ファイルヘッダが大きそうですね
>逆に言うと、gzip/bzip2はまさに汎用と言えるさすがの性能です

[2016年のOSS圧縮ツール選択カタログ #Linux - Qiita][2016]の結語は参考になる。

[zswap]: https://ja.wikipedia.org/wiki/Zswap "Zswap - Wikipedia"
[2016]: https://qiita.com/nishemon/items/818cc64dc2f8577edd87 "2016年のOSS圧縮ツール選択カタログ #Linux - Qiita"
FBXで配布されているアニメーションデータをIK RetargetでUEでグレイマンにリターゲットする

# 概要
ここの概要欄で配布されているAnimationをUEグレイマンにリターゲットします。神曲だー！
https://www.youtube.com/watch?v=lUDPjyfmJrs&list=PLyukpGUU-sdxNDFlEYa8LiLe-4j_ut5md&index=2

配布されているデータはMMDデータとFBXのアニメーションデータ(Meshなしボーンのみ)のようです。このFBXデータをUEにimportします。グレイマンとはボーン構造が違うので、IK Retargetでグレイマンにリターゲットします。

次の動画のようになります。ついでにVroidにもリターゲットしました。細かいところでズレはあるのが問題ですが、リターゲットしただけにしては意外といい感じですね。

https://youtu.be/yoe1bvVl9WY

# 環境
- Windows
- Unreal Engine 5.4

# 手順

## モーションデータのダウンロード
以下のページの概要欄からモーションデータをダウンロードしてください。
https://www.youtube.com/watch?v=lUDPjyfmJrs&list=PLyukpGUU-sdxNDFlEYa8LiLe-4j_ut5md&index=2
MMD用のデータとFBXがあります。今回はFBXの方を使います。


## Blenderで仮のメッシュを当てる
配布されているFBXはボーンとモーションデータだけですが、Unreal Engineはメッシュの無いデータはインポートできないので(Unityは出来るらしい)、仮で適当なメッシュを当てます。

BlenderでFBXを読み込みます。

適当なBoxを置いて親子付けしWeightを割り当てます。
Box→ボーンの順で選択し、右クリックからParent/With Automatic Weights を選択します。これでボーンとメッシュの対応関係が設定されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/d2257f06-3716-d3b5-7833-d1f400bb4c1b.png)

タイムラインを動かしてBoxが変形すればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/2b4406f8-9be1-6a58-7e0d-91ca11aa08ef.png)

FBXでエクスポートしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/5de62498-b29e-6505-0793-2123337872d7.png)

## Unreal Engineでインポート
出力したFBXをUnreal Engineでインポートします。
SkeltalMeshのインポートにチェックが付いていることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/c4c78210-6d4b-89fd-99c1-9928cdc7142f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/5adb30fa-6407-f69f-1a01-d2dfbf5fb351.png)

アニメーションを開くと蠢く立方体が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/ae634111-e9e2-3646-c953-c615315fe6e2.png)


## IK Rigでアニメーションをリターゲット
IKリグ、IKリターゲッタを作成して、リターゲットされたアニメーションを出力します。
以下の動画の通りにやれば大丈夫でした。IKリグを作成時にスケルトンを選択する画面が出ると説明されていますが5.4では出ないようです。IKリグ作成後、UIから選択してください。
またHipMasterを右クリックからRetargetRootに設定してください(画像)。

https://www.youtube.com/watch?v=2Cuopzta_Ak


細かい設定は次の画像を参考にしてください。

IKリグ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/42652b1a-6c49-25fc-9ac0-8eb7ddcc0c97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/d44cbfdf-3992-8923-1537-c309e07b3052.png)


IKリターゲッタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/5102ddc5-4d8c-d280-b927-b17897df8a42.png)

動画の指示にしたがいAnimationファイルを書き出してください。

## 設定
Animation BluePrintを作成して、書き出したAnimationを適応させたら完了です。この辺りは通常のAnimationの設定と同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638047/e36b2f98-0d94-92fe-a285-f52b5708fdc5.png)


# 補足
## その他試したこと
5.4でリターゲットが簡単になったみたいですが、今回のワークフローでは上手くいきませんでした。もう少しボーンが似ている必要があるのか、仮でおいているメッシュがBoxなのがよくないのか。
https://www.youtube.com/watch?v=AE-X1-M97jM


## 展望
- グレイマンではなくもう少し可愛いアバターにする必要があるかと思いますが、大体のアバターはグレイマン基準にボーンを組んでるので、ここからはなんとかなるんじゃないかと思ってます。
Where Digital Excellence Begins

Buzz Connect Media is your dedicated partner in navigating the dynamic realm of digital marketing and website development solutions. Our mission is to empower businesses to thrive online by providing a comprehensive suite of services tailored to enhance their digital presence. From captivating website design and custom development to seamless maintenance and robust digital marketing strategies, we are committed to delivering exceptional results that exceed expectations. Our team of experienced professionals combines innovation, creativity, and industry expertise to help clients connect with their target audience effectively. With a focus on continuous improvement and staying ahead of industry trends, we strive to unlock the full potential of every client's online presence and propel their business to new heights. Trust Buzz Connect Media to be your guide in the ever-evolving digital landscape.
Visit us at: https://buzzconnectmedia.com/
一点集中型の自分がマルチタスクをこなすためにGTD始めた

## はじめに
> 私が思うに，眼の前に現れた時ではなくて，ぎりぎりになってから行動を決める人が多すぎる。

### この記事を書いた目的
社会人3年目になって公私ともにマルチタスクを求められるようになってきたきがします~~(本当はマルチタスクなどやりたくない)~~。マルチタスクをうまくこなせるようになりたいと思い，調べたところGTDというタスク管理の考え方に則ればその時に集中すべきことを明確にできるらしく，これが自分に会ってそうだと思ったので勉強したことをまとめました。マルチタスクに苦しんでいる人の助けになればと思います。

[参考文献](https://www.amazon.co.jp/%E5%85%A8%E9%9D%A2%E6%94%B9%E8%A8%82%E7%89%88-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEGTD-%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%95%E3%83%AA%E3%83%BC%E3%81%AE%E6%95%B4%E7%90%86%E8%A1%93-%E3%83%87%E3%83%93%E3%83%83%E3%83%89%E3%83%BB%E3%82%A2%E3%83%AC%E3%83%B3/dp/4576151878)

### 著者について
- 2024年4月でセキュリティエンジニア3年目に突入。
- twitter: [@sigma5736394841](https://twitter.com/sigma5736394841)
- 趣味: テニス，プログラミング，ハウスダンス(初心者)，海外旅行

---

## GTDとはなにか

### GTDの概要
- Gettings Thingd Doneの略。タスク管理方法の一つ。
- 次にやるべきことを明確にすることで本来やるべきことに集中できるような環境を整えることを目指す。

### GTDのメリット
- 次にやることが具体的になって行動力が高まる。
- 責任の所在が明確になる
- マイナス感情が減る。

> [!NOTE]
> マイナス感情は，自分との約束を守れなかった時に生じるので，そもそも約束をしなかったり，約束を見直すことで回避できる。

### そもそもタスクが気になるのはなぜか
気になることに対して，以下の部分が決まっていないと心や脳はそのことについて考え続けてしまい，思考力の低下を招いてしまいます。そのため，忙しいときほどタスク管理が必要不可欠なのです。

- 次やることが明確でない
- 期限が明確でない
- 次やることを教えてくれるリマインダーがない。

---

## GTDの進め方

以下のステップに基づいてタスクを整理します。

1. 把握する: 気になる全てのことを把握する(インボックスにいれる) --> 自分はタスク管理ツールAsanaを使っていますが，把握の時点でツールを使うと思いついたことを書くまでにタイムラグがあることと，PCを使うと他のことが気になってしまうので紙に書くようにしています。
2. 見極める: 把握するの部分で作った気になることリストに対して次にどのようなアクションを行うか整理します。2分以内でできることならその場でやるようにする，人に任せるなら誰に任せるのか，タスク化してあとでやるかを見極めるようにしています。
3. 整理する: やるべきことをタスクとして整理します。。時間の縛りのあるものはカレンダーに入れてしまう。今やる必用がないものは以下の様に分類するのがおすすめです。
  - ゴミ箱(やらないと決める)
  - いつかやる(今はやらないがいつかやれたらいいものを忘れないように)
  - カレンダー(特定の日時まで無視していいものや何かの期限のメモ，あとで検討したいこと)
  - 資料(役に立つ資料をまとめておく)
4. 更新する: 行動の選択肢を最新の状態に更新する。
5. 選択する: 今やるべきことを選択する。以下項目がどれくらいか具体的に数値化してみると良さそう。
  - 現在の状況
  - 使えるエネルギー --> 時間によって変わりそう(ご飯食べた後は単純作業の方がいいとか)
  - 使える時間
  - 優先度

↓自分のタスク管理ツールの例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/ce82cee7-9d77-d2d5-12ef-ee99f23ca59d.png)


---

## GTDをやるうえでのワンポイントアドバイス

### 次の行動リストを場合分けしてみる

場合分けしてその条件でやることを分類しておくと良さそうです。以下が場合分けの例です。

- 電話をする
- パソコンが使える時
- 外に出ている時
- 会社にいないと出来ないこと
- 自宅でないとできないこと
- 誰かと相談が必用なもの
- 連絡待ち
- 電車の中

自分は電車の中でやることが決まっていないとダラダラすごしてしまうため，一旦AsanaにTrainというセクションを作り，電車の中でやることを予め決めておくことにしました。

### 週次レビュー
- 毎週，俯瞰的にタスクを見直す時間をとることが大切です。

---

## 認知学とGTD
最後に認知学的に見たGTDの有効性を書いておきます。

### 分散認知(外部脳の価値)
> 頭はパターン認識に基づいてアイデアを生み出すが，多くのものごとを覚えておけるような仕組みにはなっていない。

> 情報があふれる中で関連データを管理し，認識しておく能力には限りがあるということ，そのため「外部の脳」を構築し，有効活用することが不可欠である。

### 済んでいないことによって生じる負荷の軽減
- 済んでいないことがあると頭の多くのスペースが占領され，名飼うな思考と集中力が制限されてしまう。

### フロー
- GTDをやることで眼の前のことに集中できるようになり，フローが生じやすくなる。

---

## 何から始めるか

[はじめてのGTDストレスフリーの整理術](https://www.amazon.co.jp/%E5%85%A8%E9%9D%A2%E6%94%B9%E8%A8%82%E7%89%88-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEGTD-%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%95%E3%83%AA%E3%83%BC%E3%81%AE%E6%95%B4%E7%90%86%E8%A1%93-%E3%83%87%E3%83%93%E3%83%83%E3%83%89%E3%83%BB%E3%82%A2%E3%83%AC%E3%83%B3/dp/4576151878)を読むのが手っ取り早いと思います。

読む時間がない人は，一旦気になることリストを作ってご自身のお使いのタスク管理ツールを使って管理しながらうまく行かない部分をやりながら自分にあったやり方を探すとかでもいいと思います。
読んでくださりありがとうございました。
Happy GTD life!!
モチベーションの保ち方がわからない初心者におすすめしたいこと

## はじめに

初心者の方、プログラミングのモチベーションを保てていますか？
プログラミングのモチベーションを保てず、やめようか考えている方もいるかもしれません。
個人的な考えなのですが、プログラミングをやめてしまう原因のナンバーワンとして、プログラミングを学習することが目的になってしまい、何かを作る前にプログラミングのモチベーションがなくなってしまうことだと考えています(要出典)
しかし、プログラミングの楽しい点は何かを作ることであり、個人的にはプログラミング学習は最低限にして早く何か作ることに挑戦したほうがいいと思います
(プログラミングに慣れてくるとプログラミング自体が楽しくなってきますが、それにはプログラミングをたくさんやらないとそのような考えにはならないと思います)
ここではプログラミングで何か作ることに特化して初心者が何をしたらいいか、また何の言語を選んだほうがいいか説明します

## おすすめすること
初心者におすすめすることです
何か作り終えることに特化して説明しているので、ある程度プログラミングができるようになったら避けるべき内容も含まれています

### コピペすること
何かできないことがあり、ネットに落ちているコードで解決しそうであればコードの意味が分からなくてもコピペすることをおすすめします
コピペは悪と言われますが、途中でプログラミングをやめてしまうことのほうが問題です
プログラミングのモチベーションを保つためには何かを完成することを優先するべきです

### ChatGPTを活用する
これもコピペすることと似ています
ChatGPTはバグの修正、エラーが出る原因を調べる、実装までやってもらうことなどができ、プログラミング学習の強力な味方です
お金を出せるならGPT-4への課金をおすすめします


## 言語
ここではおすすめの言語を紹介します
もちろんプログラミングは手段であり、やりたいことがはっきりしているならそれに適した言語を使うことをおすすめします
(ここには書きませんでしたが、ゲームを作りたい場合Scratchのようなビジュアルプログラミングもおすすめです)

### JavaScript
JavaScriptをおすすめする理由
- できることの多さ
    - 初心者のうちは別の言語を覚えるより一つの言語で色々したほうがいい
- 他人に作ったものを見せやすい
    - モチベを保ちやすい
- ブラウザで動くプログラムを作るにはほぼ必須級なため、スキルが腐りにくい

### Python
Pythonをおすすめする理由
- できることの多さ
- ライブラリなどが非常に豊富にある

## おすすめしない言語
### C
初心者にはおすすめしません
罠がたくさんあること(エラーがわかりにくいなど)、したいことを実現するために必要なコードが多くなる傾向にあるからです

## 終わりに
繰り返しになりますが、プログラミングの学習において、一番難しいことはモチベーションを保つことです
この記事がプログラミング初心者の一助になれば幸いです
あるブランチで進めていた内容を、やっぱりmainブランチから新しく切って進めたい場合

ブランチbでコミットA,B,Cとしたあとに、やはりブランチaから新しくブランチcを切って、コミットA,Bの内容でコミットしたくなった場合の方法です

![スクリーンショット 2024-05-07 23.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083286/8001e902-bcb4-cb1a-b236-cb1ffcb0c7a5.png)


ブランチaにチェックアウトしたあとに新しくブランチcを切ります
```
git checkout a
git checkout -b feature-c
```

git cherry-pickを用いてコミットA,Bの内容を取り組みます
```
git cherry-pick Aのコミットid Bのコミットid
```
あとはプッシュするだけです

仕事でこうすればよかったという備忘録で書いております、試していないので間違いがあればご指摘ください。

こちらの参考記事様がすべてです。
https://qiita.com/okmtz/items/62aa5a25f75b1754a861
40代エンジニア志望、CI/CD はじめの一歩

## はじめに

こんにちは！

4月から「響け！ユーフォニアム」の3期が始まっていたのに気付きつつ、例の事件を思い出してしまうからか、なかなか見れずにいた[@nyakako13](https://qiita.com/nyakako13 "Qiita ページ") です。

・・・が、少し前にやっと見始めました。

やっぱり京アニの作画は綺麗すぎる。
コンクールに直向きな登場人物やストーリーもアツいです。

中高生に戻れるなら吹奏楽部に入りたいw（元剣道部）

<br>

りあクト！の著者さんも見てますね。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ゆるキャン△の綾乃の声、どう聞いても家でリラックスしてるときの黄前久美子部長。</p>&mdash; 大岡由佳『りあクト! 第4版』BOOTHで販売中！紙本も (@oukayuka) <a href="https://twitter.com/oukayuka/status/1781172367416541473?ref_src=twsrc%5Etfw">April 19, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<br>

さて本題です。

参加中の[JISOU](https://projisou.jp/ "JISOU")の2つ目の課題を終えたので感想や気づきを残したいと思います。


## 作成したもの

前回の課題では、Reactで学習記録アプリを作りました。

https://qiita.com/nyakako13/items/ec4603b7f1aeda8fdfa4

今回の課題では、前回のアプリに対して
1. Supabaseをバックエンドとして、データを永続化
2. Firebase Hostingにデプロイ
3. Github Actionsで自動デプロイ
4. Jestとreact-testing-libraryでテスト実装
5. Github Actionsで自動テスト
6. README作成

とざっくりこんな内容でした。

https://github.com/nyakako/react-js-study-record


## 感想

Firebaseで

https://qiita.com/nyakako13/items/9028164efddb9dc8c206

https://qiita.com/nyakako13/items/9c18026fdce3c1dd5845

<br>

Github Actionsで

https://qiita.com/nyakako13/items/0b1b216aaf8a6dc75f55

と多少苦戦しましたが、

今回の課題でダントツで苦しんだのがJestでのテスト実装でした。

テスト自体が初めてだったのもありますが、
UIのテストの概念、非同期のテストがなかなかピンと来なかったです。

ここはもしかしたらロジック的なバックエンドのテストの方が個人的にはとっつきやすかったのかもしれないと感じました。


公式ドキュメントや記事を読みまくって実装するのに必死すぎて記事にも残せなかったのが心残りです。


今後は改めて、小さなことでもアウトプットしながら積み上げていきます。


## おわりに
よかったら[X(@nyakako13)](https://twitter.com/nyakako13 "Xプロフィール")もフォローしてもらえると嬉しいです。

[Qiita100投稿](https://qiita.com/nyakako13/items/03ad61cfb82a1582b5d1)まで残り92！

未経験や浅経験、厳しいと言われている年代でエンジニアへの転職活動されている方、負けずにがんばりましょう！！

# JISOUのメンバー募集中

プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp
【React】mouseenter イベントが発生した際に押下されていたボタンを判定する方法

mouseenterイベントが発生した際に押下されていたボタンを判定するには`MouseEvent.buttons`を使用します。以下の場合には主ボタンが押下されていたか判定できます。

```tsx
import { useCallback, useEffect, useRef, useState } from 'react'
import { Button } from '@/components/buttons/button'

export function Sample({ children }: { children: React.ReactNode }) {
  const handleMouseEnter = (ev: React.MouseEvent<HTMLDivElement>) => {
    if (ev.buttons === 1) {
      // 主ボタンが押下されていた場合の処理
    }
  }

  return (
    <div onMouseEnter={handleMouseEnter}>
      {children}
    </div>
  )
}

```

各ボタンの値は以下のとおりです。

| 値 | ボタン |
| --- | --- |
| 0 | ボタンが押されていない、または初期化されていない |
| 1 | 主ボタン (通常は左ボタン) |
| 2 | 副ボタン (通常は右ボタン) |
| 4 | 補助ボタン (通常はマウスホイールボタンまたは中央ボタン) |
| 8 | 第四ボタン (通常は「ブラウザーで戻る」ボタン) |
| 16 | 第五ボタン (通常は「ブラウザーで進む」ボタン) |

複数ボタン押下されている場合には値が合計されます。

https://developer.mozilla.org/ja/docs/Web/API/MouseEvent/buttons
【Python】zipファイルを一括で展開するコード

zipファイルをまとめて抽出するコードを作成したので、
その備忘録としてこちらに記します。

本コードを記述するにあたり

・[Python公式ドキュメント](https://docs.python.org/ja/3/library/zipfile.html)
・[Pythonでディレクトリを（存在するかどうか確かめて存在しなかったら）作成する](https://qiita.com/harutine/items/bda5de790a155254b622#6-%E3%81%BE%E3%81%A8%E3%82%81)

を参照しました。
コードはpythonの標準ライブラリを使用しているため、追加で `pip install` を行う必要はありません。

# 本コード

```python: extractZip.py
import os
import zipfile
from tkinter import *
from tkinter import filedialog


current_dir = os.path.dirname(__file__)
targets = filedialog.askopenfiles(initialdir=current_dir, filetypes=[('zip file', 'zip')])

for target in targets:
    target_folder = os.path.basename(target.name).split('.')[0]
    with zipfile.ZipFile(target.name, 'r') as zf:
        for file in zf.namelist():
            file_path = ''
            with zf.open(file) as f:
                contents = f.read()
                file_path = os.path.join(current_dir, target_folder, file)
                os.makedirs(os.path.dirname(file_path), exist_ok=True)
                with open(file_path, 'wb') as w:
                    w.write(contents)
```

## 簡単な説明

*  `tkinter.filedialog.askopenfiles`

上記コードを実行すると、ダイアログが開きます。展開したいzipファイルを選択し（複数ファイル可能）、「開く」を押下すると実行したPythonモジュールと同階層にzipファイル名と同じフォルダが作成され、その配下にアーカイブされたファイルが展開されます。

* `zipfile.ZipFile`

`with`構文を用いると便利なのでこれを使用。読み込みモード('r')でzipファイルを読み込み、zipファイル内の各ファイルをフォルダ階層ごとに走査、フォルダ構造を再現しつつファイルを出力していきます。
なお、`contents = f.read()` はバイト列のため `with open(file_path, 'wb') as w:` のようにバイト書き込みモードを `wb` にしています。`contents_decode = contents.decode()`により文字列に直してから、書き込みモード`w`で出力するとしても問題ありません。

# まとめ

さらっと記述できましたが、あると便利かなと思いました。
また、 `os.makedirs(os.path.dirname(file_path), exist_ok=True)` の `exist_ok=True` にするとフォルダ作成がストレスフリーですね。
umask値の否定との論理積がわからなくて苦戦した話。

LPICのお勉強中につまずいたので忘備録。

Q.ファイルを新規作成したとき、「rw-r-----」パーミッションになるumask値として適切なものを選択肢の中から選べ。

簡単ですね。rw-は420→6、r--は400→4、---は000→0。
ファイルのパーミッションは666だから、666-640で26

あれ？そんなもの選択肢になくないか。で詰みました。

それでは、どうやって正解にたどり着いたか順に解説していきます。

まず、666と640を1桁ずつ2進数で考えます。
6は2進数で110ですね。4は100、0は000となります。

するとこのようになります。
666:110 110 110 
640:110 100 000

論理積とはざっくり考えると、すべて真なら真(1)。そうでなければ偽(0)。
1と0なら0。0と1なら0。0と0なら0。1と1なら1といった感じです。

ここで、タイトルにもあります「umask値の否定との論理積」のお話です


666:110 110 110 
umask:11? 10? 00?
640:110 100 000

110と何かの論理積は110となりますね。
何かというのは11?と推定できます。
1と0なら0。0と1なら0。0と0なら0。なので、?が何かは断定できません。

ここで、11? 10? 00?について否定にしてあげる必要がありますね。
00? 01? 11?

あとは00? 01? 11?に矛盾しない回答を選択肢から選べば良いです。


以下のサイトを参考にさせて頂きました。
論理積
https://wa3.i-3-i.info/word11662.html
ビットマスクの演算(もう、これだけ見たら私の記事いらないかも・・・なぐらいわかりやすいです)
https://namileriblog.com/linux/linux_permission_umask/

Linux初学者で中々これ！という正解ワードを検索できるまでに時間がかかったので、みなさんこちらを見て幸せになってくれたら嬉しいです！
Posit Cloud （旧RStudio Cloud）とGitHubの連携

Posit Cloud（旧RStudio cloud）とGitHubの連携で色々とハマったけど、最終的にうまく連携できるようになったので、連携方法をメモ書き。

参考にしたのはこのYouTube動画

<iframe width="560" height="315" src="https://www.youtube.com/embed/JeDWlcFsFAA?si=mUSSANRgKvjeV5zq" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



## まずはGitHubでRepositoryを作成
既にRepositoryがあるならこれは飛ばしてよい

作成出来たら`https://github.com/<username>/<Repository_Name>`をコピー

## Posit CloudでNew Projectを作成
「New Project from Git Repository」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/fd1ea31f-454e-2de7-3c7f-3674b2bc0524.png)

「URL of your Git Repository」に先ほどコピーしたURLを貼り付けて「OK」をクリック。

暫くすると（ちょっと時間がかかって、画面が白くなったりして焦るが気長に待つ！）、Repositoryからファイル一式がクローンされる。

## とりあえずCommitしてPush（弾かれる）

最初のPushについてはアカウントの入力がもとめられる。まずは普通に`<username>`を入れればよい。
ついで「パスワードの入力」が求められる。この「パスワード」という文言が落し穴なのだが、普通にGitHubのパスワードを入力しても以下のような表示がでて弾かれてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/e91dbf1f-7037-54d9-3a74-362b7f9d6df1.png)

2行目のURLが長すぎて読みにくいのだが、この表示の中のエラーメッセージには、「2021年8月13日でパスワードでの認証はサポートされなくなった。現在の推奨の認証方法についての情報は[`https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls`](https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls)を見てくれ」と書いてある。

ということでアクセスしてみると、Pesonal Access Token を作って、そのTokenをパスワードとして書き込めとのこである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/2bacbfa9-deb9-4ec6-93ac-555819ff9241.png)

## Personal Access Tokenの作成

ということでTokenの作成である。
GitHubの自分のページの右上にある自分のアカウントのアイコンをクリック
↓
「Settings」をクリック
↓
左のメニューの一番下にある「<> Developer Settings」をクリック
↓
左のメニューの一番下にある「Personal Access Token」をクリック
↓
「Fine-grained tokens」と「Tokens (classic)」とがあるが、Fine云々の方はよくわからなかったので、とりあえずToken (Classic)を選択。
↓
「Generate new Token」を選択して、さらに「Generate new Token (Classic)」を選択
↓
NoteにTokenの識別名を入力し、Expiration（有効期限）と、Tokenでアクセスできる範囲（Scope）の設定をする。
とりあえずScopeは「repo」にチェックをつけた
↓
「Generate token」をクリックすると、画面にトークンが表示されるので、長ったらしいTokenをコピー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/b47d8df5-0897-8897-cf60-395cc4129f1b.png)


## 改めてPush
改めてPushすると、さっきと同じように、<username>とパスワードを聞かれるので、パスワードに先ほどコピーしたトークンを貼り付けて「OK」。

これでGitHub上のRepositoryに変更内容がPushされるようになる。

## 今後
一度これを通すと、~~とりあえず当面は改めてパスワードが求められなくなる。~~
ただ、Tokenに有効期限があるので、有効期限が切れるとパスワードが通らんくなるのではないかと思われる。

実際にはSessionが切れると、またTokenの入力が求められた。どうやらユーザ名とTokenはSession単位でしか保持されないようだ。

入力を求められるたびに毎回Tokenを作るというわけにはいかないので、一度作ったTokenをPositCloud上にPAT.txtとか名前のファイルを作って保存した上で、そのファイルは.gitignoreに入ることにした。
VScodeの便利なショートカット

# VScodeの便利なショートカット

windows:`alt+↑or↓ `
mac: `option+↑or↓`
行を丸ごと移動できる。
範囲を指定すると複数行移動できて便利です。

windows:`ctr+shift+k`
mac:`command+delete`
行を一括で削除

windows:`ctr+d`
mac:`command+d`
範囲を指定したwordと同じwardを選択してくれます。

`alt+click`
複数の行を選択できます。

windows:`ctl+shift+k`
mac: `cmd+shift+k`
選択した行の削除

windows: `alt+十字キー`
mac: `alt+十字キー`
選択した行の移動
GPUの負荷につながるOverDrawを減らす対策

# 前提条件
- Unity2022.3.6f1 を使用して書いています
- built-in や URP を使用した各プロジェクトにて確認しています

# OverDraw について
描画時に同じ部分を何度も描画していることを指しています。
不透明半透明問わず発生しますが、半透明の場合は全てOverDrawが発生します。
2DのUIは基本半透明のため OverDraw が発生します。3Dなどのメインを描画した後に行うことが多く回避し辛いです。

全てを対策することは現実的とは言えませんし、表現に制限をかけてしまうことがあります。目標とするスペックに対して問題になりやすい部分を開発初期からケアしていくのが良いかなと思います。

# OverDraw が発生するとどう問題になるのか
描画に時間がかかり、FPSの低下などにつながります。
特に解像度の高い VR などでは影響が大きくなりやすいです。

# OverDraw への対策
:::note info
開発メンバーと相談を行いながら対策していくことなります。
アセットに影響すること多く、開発メンバーの理解を得て進めることが重要になります。
:::

### 使用していない描画を削除する
使用していない描画を削除することで、不要な描画を減らすことができます。
[Frame Debugger](https://docs.unity3d.com/ja/2022.3/Manual/frame-debugger-window.html "Unityドキュメント") を使用して不要な描画が起きていないか確認することができます。


### 半透明の描画物を減らす
テクスチャのAlpha抜きで見た目を作っているものをメッシュ化して不透明化することで、半透明の描画物を減らすことができます。
Alphaの値が小さく面積の大きなポリゴンを何十枚と重ねて見た目を作っている場合は 1枚あたりを濃くするなどで枚数を減らす事で削減につながることがあります。

[Scene View の Shaded Wireframe や Overdraw](https://docs.unity3d.com/ja/2022.3/Manual/ViewModes.html "Unityドキュメント") を使用して、半透明の描画物を確認することができます。

### 描画の順番を調整する
不透明は Geometry の 2000 になっていること、
AlphaClip(Cutout)を使用している場合は AlphaTest の 2450 になっていること
半透明は Transaparent の 3000 になっていることを確認します。

不透明で問題のない描画を半透明で行ってしまうと必要のない OverDraw が発生してしまいます。

詳細の順番は、[Unity の RenderQueue の定義](https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Rendering.RenderQueue.html)を参照ください。


考えている順番で描画が行われているようにして OverDraw を削減し、順番を意識することで勿体ない描画に気づきやすくなります。

### メッシュを一体成型にする
メッシュを一体成型にすることで、メッシュ内のポリゴンの描画順番による OverDraw を回避することができます。
back カリングなどを使用している場合は、表面のポリゴンが複数重なっているところで OverDraw が発生します。

# 最後に
放置すると開発中盤や終盤などで大きな問題になることもあります。
FPSが下がれば体感を損ねる事も多いので、対策していくことでプロジェクトへ貢献になると考えています。

目に見える問題よりも影響度合いが見えづらいため、
変更前と変更後で効果量を可視化していくのがおススメです。
RecordのIterableをいい感じにmapしたい

RecordのListをmapしたい

mapの引数はT toElement(E e)なので
final (id, name) = e;
などとするか
$1などのわかりづらいgetterを使わないといけない。

```dart
void main() {
  List<(int, String)> recordList = [
    (1, '山田'),
    (2, '佐藤'),
    (3, '鈴木'),
  ];

  recordList.map((e) {
    final (id, name) = e;
    return id.toString() + name;
  });

  recordList.map((e) => e.$1.toString() + e.$2);
}
```

以下のような拡張を用意する

```dart
extension IterableRecord2<T1, T2> on Iterable<(T1, T2)> {
  Iterable<T> mapRecord<T>(T toElement(T1 t1, T2 t2)) =>
      map((e) => toElement(e.$1, e.$2));
}
```
そうするとこう書ける、いい感じ

```dart
void main() {
  List<(int, String)> recordList = [
    (1, '山田'),
    (2, '佐藤'),
    (3, '鈴木'),
  ];

  recordList.mapRecord((id, name) => id.toString() + name);
}
```

量産する

```dart
extension IterableRecord3<T1, T2, T3> on Iterable<(T1, T2, T3)> {
  Iterable<T> mapRecord<T>(T toElement(T1 t1, T2 t2, T3 t3)) =>
      map((e) => toElement(e.$1, e.$2, e.$3));
}

extension IterableRecord4<T1, T2, T3, T4> on Iterable<(T1, T2, T3, T4)> {
  Iterable<T> mapRecord<T>(T toElement(T1 t1, T2 t2, T3 t3, T4 t4)) =>
      map((e) => toElement(e.$1, e.$2, e.$3, e.$4));
}
```

パッケージ！使ってみてね😁

https://pub.dev/packages/record_iterable_utils
エンジニア管理ツールでも作る①構想

# 概要
エンジニア管理ツールを作成する様子を記録することで、初学者の助けになれば

# 動機
私はSESとして働いているわけですが、我々エンジニア(商品)がちゃんと管理されているのか常日頃から疑問に思っていました。
社員のスキルを一覧で見ることができたら、お客さんに「こういう人材揃ってます」って言えるでしょうし、新入社員には「こういう会社です」って言えるでしょうし、既存社員も「こんな人達と働いてるんだ」って思ってもらえると思うんですよ。

---

*ほならね、自分が作ってみろって話でしょ？そう私はそう言いたいですけどね。*
ーー某YouTube r

---

と言うことで作ってみる事にしました。


# 目標
* エンジニアのスキルが一覧で見えるような管理サイト
* エンジニアアカウントと管理者アカウントで使い分けたい
* エクセルで作成したスキルシートをアップロードできるようにしたい
* サイト上でも編集できるようにしたい
* サイトからスキルシートをダウンロードできるようにしたい

さて、どこまで達成できるんでしょうね。


# 環境
* MacOS Monterey 12.7.4
* Docker 24.0.6
* (エディターはVS Code)

Dockerで作成していくのでOSに関係なく再現できるかと思います。

## Dockerとは
コンテナという仮想マシンみたいなやつ(仮想マシンではない)をポンポン作成してしまう超技術です。
初心者に方にはとっつきにくいところではありますが、ある程度理解してしまえば環境構築がものすごく楽になるのでしっかり勉強することをおすすめしておきます。

何が嬉しいかというと、この先いろいろやっていくと「Nodeのこのバージョンでしか動かない」とか「このアプリケーション動かしたいけど環境作るの面倒だな」という場面が2億回あります。
そんなとき、Dockerを使うとバージョン違いの環境を瞬時に用意できたり、「Windows nginx install」みたいに検索しなくてもすぐにアプリケーションを試したりすることができます。

Dockerのインストールに関しては「OS名 Docker install」で検索してください。

## Docker Composeとは
今回はDocker Composeという技術を使います。
Dockerを調べると分かるんですけど毎回長ったらしいコマンドを打たないといけなかったり、コンテナ同士の疎通のためにネットワークを作らなきゃいけなかったりと少々面倒なんですよね。

これを解決するのがDocker Composeです。
Docker ComposeはコマンドをYAMLファイルにまとめて書いておくことで、コマンド一発でDockerに関する全ての設定をやってのけます。

### YAMLファイルとは
データの構造をいい感じに書くための形式です。
Docker Composeでは`docker-compose.yml`ってファイルを今の場所から勝手に探して実行してくれます。

### `docker-compose` or `docker compose`
ハイフンあり版となし版があります。
多分、ハイフンあり版`docker-compose`は有志の方が作成して、みんなが使うようになってきて、「便利だし公式で出しちゃうか」となってdockerに組み込まれたんだと思います。(想像)
なのでDockerの古いバージョンだとハイフンなし版`docker compose`は使えないです。
ハイフンあり版`docker-compose`を使いたい場合はDockerとは別に`docker-compose`コマンドを別途インストールしてあげる必要があります。

性能は大差ないので今回は`docker compose`を使用します。

https://qiita.com/kotobuki5991/items/e2af78c11b4571f904e5


# 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537927/7df64820-0759-a204-a4ec-3ae34321e2e9.png)

大体こんな感じで行きます。
Nginxをリバースプロキシとして立てて、WebUIはNext.js、APIはFlaskに任せます。
図に入れ忘れましたが、DBはMySQLを使用します。

## 技術選定
使ったことあるやつで固めました。

Nginx ... 歴史あるWebサーバーで知見がいっぱい
Next.js ... npmで色んなフロント用パッケージ使えそう
Flask ... 個人的にPythonが一番書きやすいので
MySQL ... DBに特に好みはないので適当

## フロントとバックの分離
フロントから必要な情報だけをAPIで取得することで、最小限の画面更新で済むようにします。
あと、役割分担がはっきりしてデバッグがしやすくなります。多分。

Next.jsでもサーバーサイドの処理を書くことはできるので、こちらにAPI処理を任せてしまってもいいんですが、JavaScriptで処理をゴリゴリ書くのは苦手なのでPythonでやっていきます。

## ディレクトリ構成


コンポーネント毎にディレクトリを切って管理していきます。

```
.
├── README.md
├── web
├── api
├── front
├── db
└── docker-compose.yml
```

さて、下準備も終わったので次回から順番に環境構築してきます。

# 次回
Next.jsの環境構築

https://qiita.com/k-jimon/items/34becb7bd9aabdae6d10
HR02の発熱対策

# 我が家に5Gがやってきた! でもね、、、
2023年の春先のことである。家の周辺で5Gのアンテナが建ったので、ドコモの新機種、HR02の予約開始日にオンラインで注文して速攻で手に入れた。
初回のSpeedtestでは470Mbpsの下り速度を発揮した。
これで「クソ遅いAirの10倍の速度を手に入れた！」と喜んだのもつかの間、早々に問題にぶち当たる。

それは、「時々、通信できなくなる」というもの。

# 調べてみると
通信できないときは以下の特徴がある。
* DNSの名前解決ができていない。
* 接続モードが4G+に切り替わっている。

HR02の製造元であるSHARPには次のようなQ&Aが掲載されている。

::: note info
【home 5G  HR02】連続で通信していると、本体が熱くなったり通信速度が遅くなったり途切れることがある
* 端末の内部温度が一定以上になると、一時的に通信速度が遅くなったり途切れたりすることがありますが、故障ではありません。また、端末の動作保証温度の範囲内であっても連続でご使用になると、温度の上昇を防止する為に一時的に5Gから4Gへの通信が切り替わることがありますが、故障ではありません。温度が下がると5G通信が出来るようになります。
* 電力消費を抑えるために、以下の設定を変更していただく事で温度上昇を抑えることが出来ます。
・Wi-Fi機能を使用しない場合は、Wi-Fi機能をOFFにしてください。設定ツール画面で →［基本設定］→「Wi-Fiの利用」を無効にすることで設定可能です。有線接続の場合のみ可能となります。
:::

::: note info
【home 5G  HR02】通信が5Gから4Gに切り替わった
* ご利用のエリアによっては、5Gから4Gへの切り替わりが発生する可能性があります。また、ご使用状況によっては端末が高温になり、一時的に5Gから4Gに切り替わることがございますが、故障ではありません。温度が下がると5G通信が出来るようになります。
:::

HR02本体を触ると確かに熱い。隣に並べたAir4ターミナルは触っても冷えてた感じしかないのに、HR02は本体側面の上部から天板にかけて熱を持っている。
上面で44℃って何よ、、、

Webブラウザが真っ白になるような状況でも、すでに開始した状態にあるWebミーティングやOneDriveのデータ同期は継続できているし、8.8.8.8とか外へのPINGは通る。
推測だが、発熱によりHR02のDNSサーバ機能に不具合が生じており、4G+に切り替わっても温度が下がるまでは復旧しないのではないか？

# 対策

1. （暫定対応）DHCPサーバのDNS設定に、8.8.8.8 を追加する
1. （発熱対策１）HR02を4G固定する
1. （発熱対策２）HR02の無線LAN機能を停止する

もともと、再設定のわずらわしさを避けるために Wifiルーターは別に建てていているので、どの対策を打っても面倒はない。
結局、4G固定にしたら安定したのでした。

# 半年たって
秋になって速度が遅いのに不満を持って、4G固定にしたままだったことを思い出したので、そろそろ電波状況も改善しただろう？と思って、再び5Gを掴むようにAuto設定に変更すると、、、、
おお、どうやらイケているようだ。このまましばらく様子を見ることにする。
そして、当時、忘備録代わりに書きかけたこの記事の下書きの存在も、そのまま１年ほど忘れ去られるのでした。
はじめてのプルリク


先日Githubで人生初のプルリクをしました。Typoの修正です。
そしてそのプルリクを理解しながら実践した記録です。

## 別のブランチで作業する

新しくブランチを作ってそこで変更しました。Typoの修正です。

## まずGithubでforkする

GithubでForkしたリポジトリに変更をpushします。
こうするとプルリク先が出るようです。

## プルリクを出す前にマージしなくていい

プルリクはGitlabにおけるマージリクエストにあたるそうです。
すなわち、プルリクの本質は、「自分のブランチを相手のブランチにマージしてほしい」というお気持ち＋理由を提出すること、と考えたほうがわかりやすいかもしれません。

## マージするときに（忘れずに）相手のブランチを選ぶ

注意しましょう、私は間違えちゃいました。以後気をつけます。

でも間違えたら直せばいいだけです。
後で直せるんです。
でも直したことはちゃんとみんなにバレます。

## プルリクで会話ができる

プルリクのConversationでは文字通り純粋にテキストベースの会話ができるだけでなく、会話に絵文字でいいねしたりできます。ちょっとだけSlackみたいです。
そして、この会話と一緒に相手のブランチを直した履歴も出ます。やっぱりすぐバレます。

## そしてその後

この記事を書いている段階ではまだマージされていません。今後このプルリクがどうなるか楽しみです。
Node.jsを私用パソコンで始めてみる

# Node.jsを始めてみる

2024年1月から開発業務未経験でSierに入社し、2月からNode.jsとAWSを用いた開発業務に関わっており、覚えてことを少しずつアウトプットしていきます。
※初歩的で浅い内容になると思いますが、未経験のときに欲しかった記事&自分が忘れないために記事としております。
 もし誤った内容があればご指摘いただければ修正いたします。

最初はNode.jsを始めるための準備を行います。
※案外準備する段階って1回しかしないから忘れがち。。。

### Node.jsをインストールする

下記サイトからNode.jsのインストーラーをダウンロードしてください。
[Node.js](https://nodejs.org/en)

![スクリーンショット 2024-05-07 21.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763467/fbc1c191-86b9-4cee-4faf-dee8604ea02c.png)

四角で囲っている`LTS`とついているボタンをクリックしてインストーラーをダウンロードしてください。
※Node.jsのサイトはよくレイアウトが変わるため`LTS`と表示されているバージョンを
 ダウンロードしてください。
 LTS(Long-Term support):長期サポートされているバージョン(動作の品質が保証されている)

ダウンロードしたインストーラーを起動させ、`OK`、`Next`で進めてインストールを進める。

### インストール確認

インストール後、コマンドプロンプト or ターミナルなどで以下のコマンドを実行し
バージョンが表示されればインストール完了となります。
※表示されるバージョンはインストールしたバージョンによって変わります

```
node --version
v20.11.0
```

### Node.jsの作業ディレクトリを作成する

Node.jsで作業ディレクトリを作成します。

プロジェクト名などに応じた名前でディレクトリを作成してください。
私は`Documents`ディレクトリに`test`ディレクトリを作成しました。

コマンドプロンプト or ターミナルで作成したディレクトリ(私の場合は`test`ディレクトリ)に移動してください。

その後、下記コマンドを実行してください。
```
npm init -y
```
作業ディレクトリに`package.json`が作成されます。
`Node.js`はパッケージ管理に`package.json`を利用するため
その準備が出来た状態になります。

これからソースコードを記載したりパッケージをインストールしていく準備が出来ました。

実際の開発業務で未経験の人がこの作業を行うことはないと思いますが
自己学習では必要な操作なので忘れないように残しておきます。

これ以降はまた別の記事にします。
※Node.jsをパソコンにインストールしたくない場合はDockerを用いたり、
 指定したバージョンをダウンロードしたい場合nodebrowなどで出来ますが
 最初からその方法を行うのはハードルが高いと思うので直接自分のパソコンに設定しました。
普段からALBを使っているサービスでALB使ってちょっと雑だけど簡単にメンテナンス画面を表示する方法

## 概要

普段からALBを使ってバランシングしているサービスにて、そのままALBのリスナー設定を追加して雑に、ただしお手軽に割とちゃんとしたメンテナンス画面を出す方法をまとめる。

## 前提

ALBを使って証明書の設定と、HTTPS 443がEC2やlambdaなどのリソースにロードバランシングされているものとする。

## 注意

本方法はメンテナンス画面を出す際に一瞬接続が途切れる場合があります。おそらく500系のエラーでサーバーに到達しない旨のレスポンスがリスナーのポート切り替えタイミングで返ります。
許容できないサービスの場合は本方法はおすすめできません。

## 準備

1. ALBの一覧でALB名をクリックする
1. 「リスナーとルール」のタブを開く
1. 「リスナーの追加」をクリックする
1. 下記のように設定してリスナーを追加する。

    | 項目 | 内容 | 備考 |
    | --- | --- | --- |
    | プロトコル | HTTPS |  |
    | ポート | 444 | 現在使っている443以外なら何でもいい |
    | OpenID または Amazon Cognito を使用する | チェックしない |  |
    | アクションのルーティング | 固定レスポンスを返す |  |
    | レスポンスコード | 503 |  |
    | コンテンツタイプ | text/html |  |
    | レスポンス本文 | 下記に記載されている内容をコピーして貼り付け |  |
    | セキュリティカテゴリ | すべてのセキュリティポリシー |  |
    | ポリシー名 | ELBSecurityPolicy-TLS13-1-2-2021-06 (推奨) |  |
    | 証明書の取得先 | ACMから | 自分のサービスの場合通常のHTTPSのアクセス時の証明書をACMで管理しているため<br>この辺は皆さんの環境に合わせていただきたい |
    | 証明書 | サービスアクセス時に使っている証明書を選択 |  |

    - レスポンス本文のHTML

        ```html
        <!DOCTYPE html>
        <html lang="ja">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>メンテナンス中</title>
            <style>
                body {
                    font-family: Arial, sans-serif;
                    background-color: #f4f4f4;
                    margin: 0;
                    padding: 20px;
                    display: flex;
                    justify-content: center;
                    align-items: center;
                    height: 100vh;
                }
                .maintenance {
                    text-align: center;
                    background-color: #fff;
                    padding: 50px;
                    border-radius: 10px;
                    box-shadow: 0 4px 8px rgba(0,0,0,0.1);
                }
                h1 {
                    color: #333;
                }
                p {
                    color: #666;
                }
            </style>
        </head>
        <body>
            <div class="maintenance">
                <h1>メンテナンス中</h1>
                <p>現在、システムメンテナンスを行っています。<br>ご不便をおかけして申し訳ありませんが、しばらくお待ちください。</p>
            </div>
        </body>
        </html>
        ```

## メンテナンス画面を出す

1. 現在HTTPSの443ポートでバランシングしているリスナーのポート設定を一時的に445ポートなどに変更する
1. 今回追加したリスナーの444ポートの設定を443ポートに変更する
1. 当該ドメインでアクセスするとメンテナンス画面が表示される。（はず、、！）

    ![CleanShot 2024-05-07 at 22.07.46@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/5faa6dc3-11db-0368-3933-b52834fdf51c.png)
機械学習における重み減衰率を理解して過学習を防ごう

モデルの過学習を防ぐための手法の1つ。数学的にはL2正則化と同義。

重みの値が大きくなりすぎるのを防ぐために、重みの大きさに比例したペナルティを損失関数 L に与える。

$$L’ = L + \frac{\lambda}{2} \sum_{i=1}{w_i^2}$$

ここでλは正則化の強さを調整するハイパーパラメータであり、Transformersライブラリに含まれるTrainingArgumentsで引数として使えるweight_decayではこの値を設定している。

- λの役割: 過学習の防止

重みが大きいと、小さな入力の変化に対しても出力が大きく変動することがある。

これはモデルがデータの微小な変動やノイズに対して敏感に反応している状態を示しており、過学習の典型的兆候である。

λを増やすことで、モデルはデータの本質的なパターンを捉えつつ、訓練データのノイズに過剰に適合することを防げる。

その結果、モデルによる予測は入力データの微小な変化に対して頑健になる。
関数の引数を使ってオブジェクトの値を取得する

# はじめに

関数の引数を使ってオブジェクトの値を取得する方法を綴ります。

# 実装方法

### オブジェクトを用意する
```javascript
const user = {
  name: '太郎',
  age: 18,
}
```

### 関数を用意する

```javascript
const userValue = (key) => {
  return user[key];
}
```

これだけです。
**user.key**とすると**undefined**になってしまうので注意が必要です🤣
hyakuvba roop bc

  ' 宛先のセル範囲を指定
    Set rng = Range("A1:A10") ' 適切なセル範囲を指定してください

    ' 宛先を取得
    For Each cell In rng
        If cell.Value <> "" Then
            recipient = recipient & cell.Value & ";"
        Else
            Exit For
        End If
    Next cell
Playwright v1.44.0の新機能をまとめてみる

# はじめに

2024年5月7日にplaywright version 1.44.0がリリースされました。
この記事ではv1.44.0の新機能について紹介します。

https://github.com/microsoft/playwright/releases/tag/v1.44.0

# assertionsの新機能
## toHaveAccessibleName

どんな機能か

locatorが指定されたアクセシブル名を持つ要素かどうかをみる。`aria-label`と`aria-labelledby` の名前を見る

サンプルコード
```typescript
import { test, expect } from '@playwright/test';

test('sample toHaveAccessibleName', async ({ page }) => {
  await page.goto('https://hotel.testplanisphere.dev/ja/');

  const locator = page.getByRole('button')
  await expect(locator).toHaveAccessibleName('ログイン');
});
```

ドキュメント: https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-name
アクセシブル名について: https://developer.mozilla.org/ja/docs/Glossary/Accessible_name

## toHaveAccessibleDescription

どんな機能か

locatorが指定されたアクセシブル説明を持つ要素かどうかをみる。`aria-describedby`属性の説明をみる

サンプルコード
```typescript
test('sample toHaveAccessibleDescription', async ({ page }) => {
  await page.goto('https://bttb.jp/bootstrap5/index.php?strkey=aria-describedby');

  const locator = page.getByPlaceholder('メールアドレスを入力');
  await expect(locator).toHaveAccessibleDescription('キャリアメールは届かない場合があります。');
});
```

ドキュメント: https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-description
アクセシブル説明について: https://developer.mozilla.org/ja/docs/Glossary/Accessible_description

## toHaveRole

どんな機能か

locatorが指定されたARIAロールを持つ要素かどうかをみる。

サンプルコード
```typescript
test('sample toHaveRole', async ({ page }) => {
  await page.goto('https://hotel.testplanisphere.dev/ja/signup.html');

  const locator = page.locator('button[type=submit]');
  await expect(locator).toHaveRole('button');
});
```


ドキュメント: https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-role
ARIAロールについて: https://www.w3.org/TR/wai-aria-1.2/#roles

# locator handlerの新機能

 * `page.addLocatorHandler()`で追加されたハンドラを実行した後、Playwrightはハンドラをトリガーしたオーバーレイが表示されなくなるまで待機するようになった
 * 新しいnoWaitAfterオプションを使用することで、この動作を無効化することができる
 * `page.addLocatorHandler()`の新しいtimesオプションを使用することで、ハンドラを実行する最大回数を指定できる
 * `page.addLocatorHandler()`のハンドラは、引数としてロケータを受け取れるようになった
 * 以前に追加したロケーターハンドラーを削除するための新しい`page.removeLocatorHandler()`メソッドが追加された

removeLocatorHandlerのドキュメント: https://playwright.dev/docs/api/class-page#page-remove-locator-handler

# その他追加機能

 * `apiRequestContext.fetch()`の`multipart`オプションで同じ名前のフィールドをサポートするようになった
 * `expect(callback).toPass({ intervals })`は、`expect.toPass.intervals`オプションを使用して、グローバルに`testConfig.expect`内またはプロジェクトごとに`testProject.expect`内で設定できるようになった
 * `expect(page).toHaveURL(url)`は、`ignoreCase`オプションをサポートするようになった
 * `testProject.ignoreSnapshots`は、プロジェクトごとにスクリーンショットの期待値をスキップするかどうかを設定できるようになった
 * JUnitレポーターで`includeProjectInTestName`オプションをサポートするようになった
 * `suite.entries()`(v.1.44.0の新機能)は、子テストスイートとテストケースをその宣言順に返す
     * `suite.type`および`testCase.type`を使用して、リスト内のテストケースとテストスイートを区別できる
 * Blobレポーターで単一のオプション`outputFile`を使用してレポートファイルパスを上書きすることができるようになった

# Command lineについて

`--last-failed`オプションで前回の実行で失敗したテストのみを実行することができるように

```
// コマンドの例
$ npx playwright test tests/example.spec.ts --headed --project chromium --last-failed
```
[ReviewAI 使用例] 松屋 [新大久保 韓国料理店]

# はじめに

レビュー分析AIサービスの ReviewAI (レビューアイ) を開発しています。
本記事ではレビュー分析の例として、新大久保の韓国料理の人気店を取り上げていきます！
[人気店の記事をまとめているページはこちらです。](https://qiita.com/RetegyLink/items/3d94852bf25a724a82cc)

今回は、松屋 の食べログに集まっているレビューを分析します。

## 松屋

伝統韓国料理のお店だそうです。

> JR新大久保駅より　徒歩10分
> 東新宿駅から212m

[食べログ](https://tabelog.com/tokyo/A1304/A130404/13000028/)

## ReviewAI (レビューアイ)

弊社 RetegyLink が開発中のレビュー分析 AI です。
https://reviewai.next-seed.work/
試作版を公開中で、現在は
- [食べログ](https://tabelog.com/)
- [じゃらん](https://www.jalan.net/)
のレビューを分析できます。

# レビュー分析

さっそくですが、こちらが分析結果です！
スープ・キムチ・カムジャタン・チヂミと美味しそうな単語が並んでいます。
一方で、人・味でオレンジ色が目立って気になるところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/f27049cd-b5bc-3b63-acf3-e2d2f1d375bf.png)



## スープ

<font color=steelblue>**良い評価**</font>

- ④おじやセット鍋のスープを少し残しておじやにしてくれます。
- チヂミ、砂肝、キムチ、ナムル、タコ鍋をオーダーうん、どれも美味い、特にタコ鍋のスープが最高！
- この美味しいスープを吸った、〆のご飯は最高でした。
- うまみの塊のスープがしみこみ、おこげと共にいただくのも楽しみの一つ。


## キムチ

<font color=steelblue>**良い評価**</font>

- キムチもすごい量
- 豚とキムチやっぱり最強！
- 普通のキムチの濃厚さも好きだがたまにそれが口を占めてしまうことが多い中さっぱりしてて歯応えたっぷり是非是非食べて欲しい
- 白菜キムチやカムジャタンなど唐辛子が多めのお料理も甘辛で辛いのが苦手な人にとっても結構挑戦しやすい辛さかなと思いました。

# カムジャタン

<font color=steelblue>**良い評価**</font>

- カムジャタンからのおじや、最高です。
- カムジャタンは大、中、小とありますが2名であれば小で十分だと思います。
- カムジャタンは少しピリ辛で食べやすい辛さです。
- カムジャタンを日本に初めて提供したお店ということで、追加これがめちゃめちゃ美味しかった！！


## チヂミ

<font color=steelblue>**良い評価**</font>

- ♪じゃがいももホクホクでよく味が染みていてマイウー(*^o^*)追加のチヂミは結構なデカさにびっくりしましたがかなり薄めなので問題なく食べれましたw
- チーズチジミははチーズたっぷりで、タコ鍋の辛さにはちょうどよかったー生マッコリもおすすめです！！
- 松屋チヂミ1,800円もピザのLより直径が大きく、満足。
- でも牛骨の旨味が溶け込んでて最高でしたチヂミもとんでもないサイズ笑



## 人

量が多すぎて戸惑う人もいるようです。

<font color=steelblue>**良い評価**</font>

- ママはとても良い人
- 全てボリュームがたっぷりあり4人でこの量は十分。
- 4人で中サイズがちょうど良かったです。
- 女性3人でこの量は多すぎましたが美味しかったので大満足でした♡︎.。◯タコ鍋+〆のご飯


<font color=chocolate>**黄色・橙色の評価**</font>

- 4人くらいで来ないと食べきれないというのが残念なところではあるが、今回はカムジャタン小とキムチ盛り合わせを注文。
- 8人なら良いけど9人はダメ（誕生席ダメ）らしい。



## 味


<font color=steelblue>**良い評価**</font>

- 甘めで好きな味。
- 濃い目の味が好きな私達には、味のバランスが最高でした‼
- カムジャタンは濃厚でお肉もじゃがいもも沢山入っていて文句ない味です。
- カムジャタンはSサイズとライスを注文、見た目はとても辛そうなのですが優しい味で美味しい〜


<font color=chocolate>**黄色・橙色の評価**</font>

- 韓国ブームの影響で以前より予約が取りづらくなりましたが、確実に味の質、接客の質は落ちていると思います。
- 雑炊もコゲ味しか残らず残念。
- 同じお鍋を注文しても味が濃かったり薄かったり…



## ReviewAI の改善点

味の変化などを述べる文が、いつ書かれたのか確認する機能があった方が安心できそうですね。
ちなみにデータを確認したところ、今回の該当の文は古めのレビューからの抜粋のようでした。

# おわりに

ボリュームたっぷりカムジャタンを楽しめそうなお店でしたね！

観点ごとの詳細を確認されたい方は、ぜひサイトにアクセスして確認してください！
レビュー分析AI の [ReviewAI](https://reviewai.next-seed.work/) は試作版を公開中です。
今回分析した 松屋 の URL はこちらです。
```
https://tabelog.com/tokyo/A1304/A130404/13000028/
```

今後どんどん使いやすくしていく予定ですので、
ぜひ皆様の ReviewAI に関するご意見を[アンケート](https://docs.google.com/forms/d/e/1FAIpQLSc-yVTDeqqMc9GqM93BvzaYWCB6wyToesYj_wl8bhwKgw8LqQ/viewform?usp=sf_link)で教えてくださると幸いです。
ローマ字から漢字かな交じりに

# mecab-skksvについて

mecabが一発で自然なかな交じり文を出力するためにどうしたらいいのでしょうか？格闘してみました。

## 梅棹式かなづかいを復習しときます

このルールに従ってひらがなだけの文をかいておけば、すこしはMeCabの精度があがるのでは？

- よんだひとにわかってもらえるようにかく
- 耳で聞いただけで意味がわかるようにこころがける
- やさしいことばで正確に自分がいいたいことをあらわすことばをさがしてつかう
- むずかしい漢語や同音異義語のおおい漢語はさける
- 単文連続でかくようにこころがける

漢字を音よみと、限定された訓よみにつかう.

>>漢字とかなのつかいわけの基本原則は、漢語は漢字で書き、和語はかなで書く.
>>むつかしい漢語はさけ、できるだけやさしいことばをつかう。
>>和語の場合、「きる」(切る、着る)や、「にる」(煮る、似る)のように、意味が>>判読しにくいときには、漢字をつかうこともゆるす。

‐ 切る→切断する
‐ 着る→着用する
‐ 煮る→煮詰める、煮込む
‐ 似る→似通わせる

こうすればさらにMeCabにやさしいとおもいます。

### やまとことばがつかえるときにつかう

```
しちょうできる きかんが もうのこりすくなく,
5/3が しちょうせいげん の さいしゅうび
```

-> `市長できる 機関が もう残り少なく, 5/3が 市長制限 の 最終日`

```
みききできる おひにちが すでに のこりすくなく,
5/3 が その おわりのひ です.
```

-> `見聞きできる お日にちが すでに 残り少なく, 5/3 が その 終りの日 です.`

### 日本語とは？

日本語は、最後に来る(述語)以外はみんな(補足部)とかんがえると、

```
(補足部)-(補足部)-(補足部)-(補足部)-(述語)
```

たとえば「京都まで新幹線であしたいく」のように
原則として、補足部はながい順にならべる.

しかしmecabが得意とする出現順ってのがあるとおもう。

「うめさおじしんましんのしんてんをみることもなく, たかいした」
→ 「梅棹自身マシンの進展を見ることもなく, 他界した」

これでいける！！

`ましんのしんてんをみることもなく, たかいしてしまったうめさお.`
->
`マシンの進展を見ることもなく, 他界してしまった梅棹.`

もとはつぎのようだ。「梅棹は機器の進展を見ずに他界してしまった」
ダメ要素は、

- 助詞の"は”をつかってる
- 機器って同音異義語がある。（危機etc）
- からくりとすればいいかな？

>> 同音異義語のおおい漢語はさける。

`うめさおじしんからくりのしんてんをみることもなく, たかいした`
-> `梅棹自身カラクリの進展を見ることもなく, 他界した`


### おまけ：助詞の"は(わ)"をつかわないようにする

"は (わ)" をなるべくつかわないようにしましょう.
MeCabが助詞の「は」を"歯"と変換することがあまりにも多いです.

## おまけ：長いけどもMeCabがんばった例

```
ひとつのしんぷるせんてんすのなかに しんぷるせんてんすが
"いれこ"となっているものをかかないようにする。
また、せつぞくしでつないだだけのへいれつしたながいぶんしょうを
かかないようにする。
くてんがうてるなら、うつ
```

```
一つのシンプルセンテンスの中にシンプルセンテンスが"入れ子"と
なっているものを書かないようにする。
また、接続詞でつないだだけの並列した長い文章を書かないようにする。
句点が打てるなら、打つ
```

単文（＝シンプルセンテンス）とか複文（≒入れ子文）っていうのは、ジャーゴンだからしかたないですかね？単文（以下SSとする）みたいなかんじ？

```
せんご、あめりか による せんりょうしはいが はじまったときだ. えいぶんたいぷ をつかえたあめりかじん.
それにたいし、てがきのにっぽんじん. ずっと すくない あめりかじんのかずで おなじりょうの じむしょりを
こなした. れきぜんとした ちがいだった. しかし、にっぽんも そのご, せかいに かんたる けいざいたいこくに
なった. ちゃいなもじかなまじり-ぶん を いじ したまま, それを なしとげた. じむしょりのうりょく って
それほどのもんだいじゃない. そんな ひはんも あるだろう. うめさお が それにこたえて いわく, 
にっぽん の じむしょり にたずさわる ひとのかず が おうべい より ずっと おおく, それが けっかんを
おぎなった と.
```

```
戦後、アメリカ による 占領支配が 始まった時だ. 英文タイプ を使えたアメリカ人. それに対し、
手がきの日本人. ずっと 少ない アメリカ人の数で 同じ量の 事務処理を こなした. れきぜんとした 
違いだった. しかし、日本も その後, 世界に 冠たる 経済大国に なった. チャイナ文字かな交じり-文 ヲ
維持 したまま, それを 成し遂げた. 事務処理能力 って それほどの問題じゃない. そんな 
批判も あるだろう. 梅棹 が それに答えて いわく, 日本 の 事務処理 に携わる 人の数 が 
欧米 より ずっと 多く, それが 欠陥を 補った と.
```

むかしからおもっていたが、`漢字`って同音異義語がおおくて、つかいたくない単語No1にちかい。しかし、いいかえられない。チャイナ文字だと苦肉の策感が半端ない。真名? 本字? 男文字?

`KKMB=漢字かな交じり文` みたいにどこかでことわって、つかうしかないですか？
Git 基本操作（超初心者）


## Git について

Webサイトなどを作る際など、複数人での共同開発をスムーズに進めるためのシステム。

## Git の流れ

1. コードを変更する。
2. 共有する準備をする。
3. 共有する。

## 共有の仕組み

Gitではリモートまたはリモートリポジトリという共有のファイル保管場所を使用する。

個人がローカルリポジトリ内で編集したファイルを、リモートリポジトリにアップロードし、それをダウンロードすることで開発者同士がファイルを共有することができる。

## 基本操作

ターミナルを用いて操作する。

```
$ git init
```
「init」は「initialaize」の略であり、「初期化」を意味する。

共有するファイルを選択する。

```
$ git add ファイル名
```

選択したファイルを記録する。

```
$ git commit -m "メッセージ"
```

メッセージ部分には **「コミット内容がわかるメッセージ」** を記述する。


リモートリポジトリを登録する。

```
$ git remote add リモートリポジトリ名 URL
```

リモートリポジトリにファイルをアップロードする。
この操作を **プッシュ** という。

```
$ git push origin master 
```

リモートリポジトリのファイルをダウンロードする。
この操作を **プル** という。

```
$ git pull origin master
```
こんなのあったらおもしろいんじゃないか構想　過去～現在

# そもそもこの記事は何？

- 自分のアイデアの書きなぐり



# 高校時代(2016~2019)

## あるwebサイト運用している物理的に離れている複数のwebサーバーでRAIDを組む

### なぜこれを考えたのか
- 同一のデータを複数サーバーに保存したかった
  - これによりユーザーから(物理的に)一番近いサーバーに接続することで遅延を小さくできるのではないかと考えた
-  当時はRAIDでデータの同期ができると思っていた

### 現実
- `CDNでやりたかったことが実現されてた`
- そもそもRAIDはそんな使い方想定してない


## 重複を考える必要のないID生成

### なぜこれを考えたのか

- 発行済みのIDと被っていないか検証する良いアルゴリズムを思いつかなかった

### 構想

- 時間(sec単位)と乱数(数桁)をつなげれば良いのでは
  - 当時は[誕生日のパラドックス](https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9)の事を知らなかった＆考えてもいなかった

### 現実
- `UUIDv7登場`

# 大学時代(2019~2023)

## スマートフォン同士でP2P通信をすることで災害時でも使えるアプリ

### なぜこれを考えたのか

- 現在の通信インフラに頼ることなく通信の必要があると考えた
  - 停電による基地局の機能停止
  - 登山中の遭難
- P2Pでなんかやってみたかった（ブロックチェーンブームだったし・・・）

### 構想

1. 端末Aが端末Bにメッセージの送信を試みる(ただし端末Aはアンテナが立っていない)
1. 端末Aの近くを端末Cが通る
1. その際端末Aは端末Cに端末B宛のメッセージを送信する(端末Cのユーザーは内容を見ることができない)
1. 端末Cは既存の通信インフラが整っている地域まで移動する
1. 端末Cは端末B宛に端末Aから送信されたとしてメッセージを送信する
1. 端末Bは端末Aからのメッセージを受信する

### 現実

- アプリを大勢の人に使ってもらう必要がある
  - 現実的に一個人のアプリでは無理な量
- AirTagが似たようなことやった・・・
  - AirTagの近くを通った別ユーザーのiPhone経由でAppleのサーバーにAirTagの位置情報を送る


## 同じ講義を受けている人が抗議の情報を追加したら全員に反映される時間割アプリ

### なぜこれを考えたのか

- コロナ禍により同級生としゃべらなくなった
  - 講義の情報が入りづらくなった(課題の締め切り日など)

### 構想

1. 同じ講義を取っているA, B, Cがいる
1. Aが講義の中で出された課題の締め切り日などをアプリに登録する
1. B, CがAの登録した情報を確認できる

- これにより仲の良さに関わらず情報共有ができると考えた


### 現実

- アプリを作成し、[技育展2021](https://talent.supporterz.jp/geekten/2021/)で登壇した
  - ユーザーを獲得するのはとても大変ということを思い知らされた


## HDDのプラッタを乱数テーブルとして乱数生成

### なぜこれを考えたのか

HDD上に保存されるデータの位置はデバイスにより異なる＆書き換わるため、これを元に乱数生成可能ではないかと考えた。


### 構想
1. HDDのヘッドを往復させプラッタのランダムな位置のセクタのデータを取得する
1. ヘッドを適当に動かすためセクタのデータは意味をなさず、ファイルシステムのランダムな位置のデータを取得する
1. セクタのデータは上記よりランダムなため、乱数生成可能と考えた


### 現実

- 大容量のHDDはほとんど書き換わらないであろうから乱数生成の種としてはあまりに脆弱
- `/dev/random`でいいじゃん




# 社会人時代(2023~)

## 脳を模したデータの保存

### なぜこれを考えたのか

- 昨今話題のLLMなどは深層学習を使用している
  - 深層学習のモデルはニューラルネットワークを模している
    - したがって脳を模倣したデータの保存ができるのではないか

### 構想

※生物あまりわからないので想像を含む

- 脳はニューロン同士が結合している
  - 脳が処理(画像処理・自然言語など)する部分の模倣は可能である(GAN・LLMなど)
  - 脳が保存する部分も可能ではないか
    - ベクトルデータベースによる単語の結びつきなど

もっと言うとより汎用的なグラフDBにデータを保存することで、脳の模倣をよりうまくでき、様々な学習モデルの精度向上が狙えるのではないか

つまり学習モデルをI/Oとし、グラフDBを海馬のように扱うことでより汎用的で精度の良いAIの作成が課のではないか？

#### 懸念点

- 学習モデルをI/Oとした場合、おそらくグラフDBに保存されるデータを人間が読むことは不可能


## 日本語LLMのモデル案

### なぜこれを考えたのか

- 英語で文章を作成する際はa~zまでの26種類が必要である。一方日本語で文章を作成するには英語に比べ非常に多い種類(ひらがな・漢字)が必要である
  - そこで日本語の文章を生成する際は2つのモデルを使用することでより汎用的なLLNを作成することが可能ではないか

### 構想
- モデルは下記の2つをつなげる
  1. ひらがなの文章を作成するモデル
  1. ひらがなを漢字・カタカナに変換するモデル

このように分割することで、今までより小さい変数での言語モデルの生成が可能である。
また変換部分を別モデルとしたことで、既存の漢字等への変換アルゴリズムの使用や特殊な用語への対応が容易に対応可能となり、より汎用的なLLMの作成が可能ではないかと考える。
また、この変換モデルを別言語へ変換するモデルにすることで翻訳も可能になるのではないかと考える

https://x.com/hika019/status/1836570224625357052
無名クラス

## はじめに

無名クラスについてまとめる

### 無名クラス

その名の通り、名前を持たないクラス。
定義したクラスを後から利用しないことがわかっているクラスを定義するのに利用する。

#### メリット

・コードをシンプルに表現でき、見た目にも関連性を把握しやすい。
・式が許されている場所であれば、どこにでも記述できる。
・名前がないので、そもそも名前が競合する恐れがない。

#### 参考コード

`execute`メソッドでは、あらかじめ決められた前後の処理を挟んで、与えられた任意の処理を実行できるものとする。

```php:class_anonymous.php
interface Runnable {
    function run();
}

class MyClass {
    public function execute(Runnable $rc) : void {
        // ダミー処理(本来はなんらかの前処理を実装)
        print 'start...';
        // 利用者から指定された処理を実行
        $rc->run();
        // ダミー処理(本来はなんらかの後処理を実装)
        print 'end...';
    }
}

$cls = new MyClass();
$cls->execute(new class implements Runnable {
    public function run() : void {
        print 'process...';
    }
});

// 実行結果：start...process...end...
```
PL/SQL　改修時の罠

# DECODE
何年にもわたって複数の人が改修をしてきたSQLを修正するときに
思いもよらぬ罠があったので備忘として残します。

PL/SQLには複数の条件分岐が存在します。

IF、CASE、DECODE

その中でも特にDECODEはしれっと紛れていることが多く
組み込まれると一瞬立ち止まる内容でもあります。

DECODEの意味合いとしては
```SQL
SELECT
    DECODE(TEST, 条件１ , 結果１ ,  条件２ , 結果2　,結果３（ELSE）)
FROM
    TABLE;
```
としたとき
TABLEに存在するTESTというカラムの内容に対して
条件１の場合結果１を
条件２の場合結果２を
それ以外の場合結果３を
値として返すという条件分岐式になっています。

テーブルとカラムをシンプルに置き換えるだけの改修だと思っていた私は
置換でシンプルにしたところ、このDECODEの部分をいじってしまったため
約2時間答えを求めてテスト用にSQLを動かすバッチをたたく羽目になりました。

# 条件絞
DBの改修などをするときに覚えておきたいのが
件数を絞ること
JAVAとは異なり、SQL関連は一度DBにアクセスすると
処理に時間がかかりがちです。
特に新規で作成したDBなどは構成がごちゃっとしていてレスポンスが悪いこともしばしば

そこで条件を絞らないと痛い目を見るわけです。

例えばMySQLならLIMIT句があり以下のように絞ることができます
```SQL
SELECT 列名 FROM テーブル名 LIMIT 10
```
今回の場合だと1件目から10件目までを取得するようになっています。

補足ですが、OFFSET句を使うと何件目までを除外しての出力が可能であり、
LIMIT 10 OFFSET 100
とすると、1~100件目を除外し、101件目から10件の取得をしてくれます。
（私はあまり使いませんが)


Oracleの場合は少し癖があり、
ROWNUMを使ってあげます
WHERE句内に入れることで件数の絞り込みが可能です。

```SQL
SELECT 列名 FROM テーブル名 WHERE ROWNUM <= 5
```

この場合だと5件目までの取得を行います。

ROWNUMは的確に何年目を絞り込むことなどもできるため、デバッグにも使えますし、動作を確認したいときにとりあえず件数を絞りあとでまとめて条件文を削除したりしています。



思いのほか改修に時間がかかる場合、
何かしらの独特なSQLが紛れ込んでいる場合があるため、
SQLを一度流れに沿って読むのは大事だと実感した次第です。
【忘備録】Wxxx: Ignoring swapfile from Nvim process <PID>の解消方法

## 動機
楽しくneovimで開発していたら急にこんなエラーが出てきて困った
ソースファイルが見つからないらしい。
急に楽しくなくなった。

```
tsserver: 1: <semantic> TypeScript Server Error (4.9.5)
Could not find source file:.
Error: Could not find source file: .
    at getValidSourceFile
    at Object.getDocumentHighlights 
    at Session.getDocumentHighlights 
    at Session.handlers.ts.Map.ts.getEntries._a.<computed> 
    at Session.executeWithRequestId 
    at Session.executeCommand 
    at Session.onMessage 
    at process.<anonymous> 
    at process.emit 
    at emit
    at process.processTicksAndRejections 
```

しかも、エラーが発生するファイルと発生しないファイルがあってイミフだった。

よく見てみると、エラーがでるファイルはエラーが起こる直前に

```
Wxxx: Ignoring swapfile from Nvim process <PID>
```

の警告がされていた。

なので、このPIDのswapfileを削除すればエラー解消。
だけど、.swpいらねえなと思って次の設定をしました。

## 解決


```lua
-- swapfileを作成しないように設定
vim.opt.swapfile = false
```

上記はluaでの設定。vimscriptだと

```vimscript
set noswapfile
```

## 結論

私、swapfileだいっきらあい
だって意味ないもおん

https://www.youtube.com/watch?v=yCBLpq-E1FI