OmniAICreator/Qiita-1.07M huggingface dataset:
Orthoverse∅使い方　その2

# Orthoverse∅のコンテンツの作り方

Orthoverse∅のコンテンツ作成の方法を説明します。

# 基本

マークアップテキストを書いてWebでアクセスできるように公開するだけです。
とりあえず手っ取り早い方法として、GithubPagesがお勧めです。
もちろん、自分でWebサーバーをたててもよいでしょう。
書いたテキストがそのまま公開されるようにしてください。
広告のタグ挿入や、その他のヘッダーなどが勝手に追加されるものでは動作しない可能性が高いです。

# 例

以下のリポジトリで試験用のコンテンツを公開しています。
https://github.com/oho-sugu/ovtestpages

# 参考情報

タグはMozillaの[A-Frame](https://aframe.io)を参考にしています。

# 使えるタグ・機能

## Cubeを出す

https://github.com/oho-sugu/ovtestpages/blob/master/Cube.homl

```
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Hello World</title>
<meta name='description' content='Hello World'>
</head>
<body>
<a-scene>
<a-box color='white' depth='1' height='1' width='1'>
</a-scene>
</body>
```

DOCTYPEとか見てないのでなんでもいいんですが、htmlに一応擬態します。
うまくやればA-Frameと互換性のある仕組みができそうなので、今後の課題です。
HTMLと同じタグは適当。パーサーでは読み飛ばしています。
重要なのは、`<a-scene>`と`<a-box>`で、
`<a-scene>`で囲まれた領域が3Dコンテンツで解釈されレンダリング・実行されます。
`<a-box>`の属性で、サイズや色を指定しています。
これで、原点に1m四方の白いキューブが表示されます。

### 座標系は？

現在のOrthoverse∅のコンテンツから見える座標系は、コンテンツを配置した空間IDの矩形の中心点の地表が原点0となります。
単位はmになるので、ここで指定した大きさがそのまま現実空間に重畳されます。

## 位置

https://github.com/oho-sugu/ovtestpages/blob/master/BigCube.homl

```
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Hello World</title>
<meta name='description' content='Hello World'>
</head>
<body>
<a-scene>
<a-box color='white' depth='10' height='10' width='10' position='0 20 0'>
</a-scene>
</body>
```

position属性で位置を指定します。
上の例では10m四方の大きなキューブが20m上空に重畳されます。

## アニメーション

https://github.com/oho-sugu/ovtestpages/blob/master/AnimationTest.homl

```
<a-box  position='  0 0 0' animation='property: object3D.position.z; to: 2; dur: 3000; loop: true; easing: easeinsine;' color='white' depth='0.2' height='0.2' width='0.2'></a-box>
```

こんな感じでアニメーションを属性で設定することもできます。
Z軸に初期位置から＋2mまで、3000msで移動、ループする、サインカーブでイージング、などの設定が可能です。
上記のURLの例のファイルには対応しているイージングパターンを網羅して挙げてあります。

## 画像を貼り付け

https://github.com/oho-sugu/ovtestpages/blob/master/AssetTest.homl

```
<a-scene>
<a-assets>
<img id="test" src="https://3.bp.blogspot.com/-Qgaed374Dcs/VtlMwoqu74I/AAAAAAAA4VU/JNzq8TSeQ-4/s800/ar_kakuchou_genjitsu.png">
</a-assets>
<a-entity geometry="primitive: plane" material="src: #test" rotation="0 180 0"></a-entity>
</a-scene>
```

`<a-assets>`タグを使って、外部リソースを参照することができます。
試しにいらすとやさんのARの画像を板ポリに貼ってみています。
id属性を参照のために使います。

## モデルの読み込み

https://github.com/oho-sugu/ovtestpages/blob/master/GLTFTest.homl

```
<a-scene>
<a-assets>
<a-asset-item id="gltf" src="https://aframe.io/aframe/examples/assets/models/tree1.glb">
</a-assets>
<a-entity gltf-model="obj: #gltf"></a-entity>
</a-scene>
```

3Dモデルを読み込むこともできます。対応しているのは、gltf/glb、VRM、obj（テクスチャなし）などです。

## スクリプティング

https://github.com/oho-sugu/ovtestpages/blob/master/Test.homl

```
<script type='text/lua'>
i = 0;
function start()
return
end
function update()
    i=i+1
    document:GetEntityByID('test'):GetComponentBase('rotation'):Set('x',''..i)
return
end
</script>
</head>
<body>
<a-scene scale="0.1 0.1 0.1">
<a-box id='test' color='blue' depth='1' height='1' width='1' position='1 1 1' rotation='30 0 30' scale='1.5 1.5 1.5'>
</a-scene>
</body>
```

スクリプトも動きます。現在は位置や回転をスクリプトから操作できます。

# おわりに

一部でA-Frameとの互換性が取れていなかったり奇妙な動作があったりと、
まだ開発途中な状況ですが、今後より使えるものになるようにしていきます。
【IchigoJam】フルカラーLEDを紫色に光らせるには

先日、こんなツイートを目にした。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E6%B2%B3%E6%BF%AF%E5%B1%B1%E6%95%99%E5%AE%A4?src=hash&amp;ref_src=twsrc%5Etfw">#河濯山教室</a> 22.11.25<br>初めての子がきてくれたり、マイカムロボ製作中だった子のPGロボが完成したり、カニロボPGを体験してみたり、4人でフルカラーLEDを紫色に光らせるにはどうしたら良いか考えてみたり、いろんな子がいろんなことをしていた教室でした✨<br>多様な感じが良い👍<a href="https://twitter.com/hashtag/IchigoJam?src=hash&amp;ref_src=twsrc%5Etfw">#IchigoJam</a> <a href="https://t.co/mxiTBcww5U">pic.twitter.com/mxiTBcww5U</a></p>&mdash; PCN武生 (@pcntakefu) <a href="https://twitter.com/pcntakefu/status/1597142899933659136?ref_src=twsrc%5Etfw">November 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そこで、フルカラーLEDを紫色に光らせるにはどうしたら良いかを考えてみた。
~~紫色といえば高城れに…？~~
あまり複雑なことは考えたくないので、「無限の猿」を使うのが良さそうだと考えた。

# 無限の猿

無限の猿 (と自分が呼んでいるもの) は、以下のアルゴリズムである。

1. 解を何個か適当に生成する
2. 生成された解の中から「一番いい」ものを選ぶ
3. 選んだ解をちょっとだけ変えて、他の解を何個か適当に生成する
4. 2に戻る

これを繰り返していくと、けっこういい感じの解になりがちである。

# 無限の猿でWS2812を設定する

WS2812は、マイコン内蔵(電源に加えて信号線1本で制御可能)のフルカラーLEDであり、IchigoJam 1.4.0 以降で制御に対応している。
今回は、このWS2812が8個連なったハードウェアを用い、色の設定値に対して無限の猿を適用する。

![WS2812が8個連なったハードウェア](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/94878e99-4681-891a-c430-57a2b006c2ef.jpeg)


具体的には、以下のプログラムを用いる。

```
10 ' ｲﾛｻﾞﾙ
20 FOR I=0 TO 23
30 [I]=RND(256)
40 NEXT
50 WS.LED 8
60 K=INKEY()
70 IF K<48 OR 56<K GOTO 60
80 IF INKEY()<>0 GOTO 80
90 IF K=48 ?"RESET":GOTO 20
100 K=K-49
110 ?[K*3];",";[K*3+1];",";[K*3+2]
120 FOR I=0 TO 7
130 IF I=K GOTO 200
140 FOR J=0 TO 2
150 V=[K*3+J]+RND(63)-31
160 IF V<0 V=0
170 IF V>255 V=255
180 [I*3+J]=V
190 NEXT
200 NEXT
210 GOTO 50
```

20～40行目で初期解をランダムに生成し、50行目でそれをLEDに反映させる。
さらに、60～80行目でどの色が「一番良い」かを1～8のキーで選択させている。
0のキーが押された場合は、リセットしてまた初期解をランダムに生成する。(90行目)
1～8のキーが押された場合は、その設定値を出力し(110行目)、
「選ばれた解から少し変えた解」をランダムに生成する。(120～200行目)
なお、設定値は「緑、赤、青」の順番である。

WS2812の電源を接続し、DINをIchigoJamのLED端子に接続してから、プログラムを実行する。
例えば、初期解はこのようにバラバラな色になっている。
(そのままだと明るすぎたので、ティッシュを巻いている)

![初期解](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/02453a34-f589-891e-5cfe-8ba87ff52f2e.jpeg)

この中から紫色に近いと思う色を選ぶと、このようにそれに近い色が生成される。

![1手進めた状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/81af13f0-ffce-0f62-c669-776d6149ade8.jpeg)

これを繰り返していくことで、良いと感じる色に近付いていけることが期待できる。

# おまけ

今回のプログラムのJavaScript版を作成した。
上に並んでいる8個の四角をクリックすることで、色を選択する。
色を選択すると、近い色が生成されるとともに、選択した色とそのカラーコードが下に表示される。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="abKjVjB" data-user="mike_cat" style="height: 300px; 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/mike_cat/pen/abKjVjB">
  Color Monkey</a> by MikeCAT (<a href="https://codepen.io/mike_cat">@mike_cat</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# おわりに

IchigoJamはjig.jpの登録商標です。
A Philosophy of Software Designを読みました

この記事はクラスター [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cluster) 1日目の記事です。

クラスターでは主にroom serverのサーバーエンジニアをしている @yoan と言います。
最近タコスにハマってキッチンが油まみれです。

今年の英語の本を12冊(月イチペース)読むという目標を立てました。
12/1時点で7冊と目標到達できなそうですが、アドベントカレンダーにはその中でとても印象深かった「A Philosophy of Software Design」(以後 `APoSD`)を紹介したいと思います。

https://amzn.asia/d/7z6szlv

先程調べたところ発売日は昨年の7月なのですが、`洋書 Software Design, Testing & Engineering Books` の売れ筋ランキングで現在も1位になっていました。
未翻訳ですがたくさんの方が日本語で記事を書かれていますのでご存知の方もいると思います。

APoSDはソフトウェアの複雑性の定義を出発点に複雑性を減らす設計や方針を述べられた本なのですが、個人的に好きなのは「郷に行っては郷に従え」のような泥臭い(失礼)アドバイスもあり単にソフトウェア設計だけではなくチームでの開発も視野に入った本で非常に親近感が湧きました。

(筆者は現在スタンフォード大学で教授をやられていますが、もともとソフトウェア関連で起業されていた方で商業用の開発経験も反映されているのかなーと勝手に思っています)

本記事ではAPoSDを多くの方に興味を持ってもらいたく、私自身が感銘を受けたポイントやすぐに真似できそうなところに絞って紹介したいと思います。

## 複雑性とは

本書では複雑性を下記のように定義しています

> Complexity is anything related to the structure of a software system that makes it hard to understand and modify the systems

DeepL先生に訳してもらうと

>  複雑さとは、ソフトウェアシステムの構造に関するもので、システムの理解や変更を困難にするものである

となります。

複雑性が高いことで様々なデメリットを受けます
-  小さい改修にも多大な労力が必要 (change amplification)
- 理解するのが難しい (cognitive load)
- 改修による副作用がないと言い切れない (unknown unknown)

また複雑性は作者より読者に現れると書かれています。
日常でも自分はシンプルにかけたと思っても、レビュワーからコメントをもらったり、数カ月前の自分のコードが読みにくいといった経験は皆さん経験されてると思います。

複雑性が高いソフトウェアは修正箇所が増える、実装期間が長くなる、副作用が出るといった状況を引き起こし、結果開発工数や開発期間の増加の原因になります。

## Module should be deep

ではどのようにソフトウェアを設計するとよいのでしょうか？
筆者は**deep module**を心がけることを紹介しています。

### deep moduleとは

モジュールを簡略化した図が下記になります。
(個人的にAPoSDの象徴的な図だと思ってます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19783/8c6980d8-8dc8-0caa-e3ce-c40aa3d21ba5.png)

縦を機能(Functionality)横をインターフェース(Interface)とした四角形でモジュールを表しています。
そして機能が多く(深く)インターフェースが少ない(短い)モジュールをdeep module、その逆をshallow moduleと呼んでいます。

それではなぜdeep moduleが良いのでしょうか？

インターフェースはモジュールの機能を抽象化してユーザーに利用してもらいます。
APoSDでは抽象化を下記のように定義しています。

> An abstraction is a simplified view of an entity, which omits unimportant details.

DeepL先生で訳してもらうと、

>抽象化とは、ある実体を、重要でない細部を省いて簡略化したものである。

となります。
抽象化することで重要でない部分が省かれるので認知負荷が下がります。
つまり適切に抽象化されたインターフェースは利用者の認知負荷の低い複雑性の低いモジュールとなります。これが高機能だったらdeep moduleだと言えます。

例えば圧縮形式のdeflateやzstdも解凍・圧縮といったインターフェースがあるだけでそのアルゴリズムを意識する必要はありません。
本書で紹介されているdeep moduleの最たる例としてUNIXのfile ioが挙げられており、インターフェースはopen, read, write, lseek, closeなどです。
これに対し機能としてストレージはHDDかSSDか、ファイルシステムはなにか、メモリにキャッシュするかなど様々なレイヤーで機能が存在しています。もちろんユーザーはそんなこと考えなくてもファイルが読み込めます。

### 個人的に面白かった点

クラスは小さくあるべきと教わります。
railsにおけるfat controllerや神クラスなど一つのモジュールが肥大化する例はよくありますし、それを分割する(large -> small)ことで例えばテストがしやすくなるので小さいクラスの良さは理解できます。
しかし著者はこの議論を一歩進めて、1つのlarge moduleを単純に分割しただけでは無数のshallow moduleができるだけでインターフェースが増えるので複雑と述べています。

この話を読んで数年前railsを開発していた当時、rubocopのメソッドの最大行数を警告する項目で議論した事を思い出しました。
当時自分は「短い = シンプルだからいいのでは？」と考えていました。
しかし結果として関数名の命名に悩む、無駄な継承により責務の曖昧なクラスが増え自身の記憶キャパを超え毎回コードを参照するといった事をしていました。

メソッドを横に分割するだけでは不十分で、縦に抽象化を増やすことで認知負荷を下げることなのだと学びました。
そう考えるとある程度規模のあるシステムには必ず層があります。
ネットワークのOSI参照モデルやCPU > OS > アプリケーションといったレイヤーです。

レイヤが別れていると責務も明確になるので、説明も楽ですし新しい概念が生まれたときも対応しやすいです。

## おわりに

APoSDでもdeep moduleのあとレイヤーの話が続いて行きます (chapter 7. Different Layer, Different Abstraction など)
もし興味がありましたらぜひご購入を検討してください！
【Next.js】"window is not defined."のエラー対処法


ブラウザ側にしか存在しないグローバルオブジェクトのwindowやdocumentを参照しようとすると、エラーが起きます。

## 対処法

windowオブジェクトが存在するかどうかをtypeof windowでチェックし使用する。

```javascript
if (typeof window !== "undefined") {
 // 処理を記述
}
```

もしくは以下

```javascript
if(process.browser){
 // 処理を記述
}
```
こちらは非推奨の警告が出ていたため最初の記述で対処した。
※next.js 12系(2022年11月現在)


## 参考

https://qiita.com/ku1987/items/e592cb5133659c3136de
.latexmkrcの設定

# .latexmkrcの設定
`.latexmkrc`ファイルを、忘れないように備忘録として書いておく。

~~~.latexmkrc
$pdf_mode         = 3;
$latex            = 'uplatex -halt-on-error';
$latex_silent     = 'uplatex -halt-on-error -interaction=batchmode';
$bibtex           = 'upbibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
~~~
AWSハンズオン_７_VPCの２_VPCエンドポイントを利用してS3バケットにアクセスする

AWSの初心者のさとしです
ハンズオンで勉強メモとして投稿いたします。
ご覧になったみんなさんにお役に立てればうれしいです
※：間違ったところがあれば、ご指摘していただければ幸いです
#### 本文
本日のハンズオン内容は下図のように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/503bf68b-a047-8926-c74b-84747913d1ab.png)
文字で説明すると
プライベートサブネットのEC２インスタンスからVPCエンドポイントを使って、S3にアクセスする
#### 手順：
１，プライベートサブネットのEC２インスタンスにS3アクセス用のIAMロールを作って、設定する
２，VPCエンドポイントを作成して、パブリックサブネットのEC2インスタンスを踏み台として、プライベートのEC２インスタンスにアクセスして、そこからS3へアクセスしていきます。

#### VPC及びサブネットの作る手順は下記の記事を参照する
https://qiita.com/ShuSaToShi/items/a74c5dee46094cf2588d

下図のように、両方のサブネットにEC２インスタンスが作成されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/be334e03-919b-b96a-2e81-20f265564af3.png)
#### S3ロールの作成は下記の記事を参照する
https://qiita.com/ShuSaToShi/items/a7434203963a699a77d2

### ロールにアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/1b80e12b-1e9d-9585-f814-b48af41a881d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/03d82e0b-db96-6ee9-e757-b8d8b1a1e797.png)
### VPCエンドポイントを作る（VPCサービス⇒エンドポイント）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/c670e1d0-2d8a-16a5-8cdd-085ab747f289.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/43f1b3bc-31c7-b4c8-2d86-9de4bcefd79f.png)
VPCエンドポイントができました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/30f9262d-73db-03be-61ee-6e87b929bb62.png)

#### 下記の流れはパブリックサブネットのEC2インスタンスを踏み台として、プライベートのEC２インスタンスにアクセスして、そこからS3へアクセスしていきます。
もっと詳細な参考は一番の記事にあります

パブリックサブネットのEc2インスタンスにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/b0d59957-1d09-b419-0f03-21bf18117293.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/ea01369e-d056-6993-6982-e43820f7d6b9.png)
プライベートのインスタンスにアクセスできました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/5f59144f-49a1-b887-61d9-9dfe499abecc.png)
#### S3へアクセスして（コマンド：aws s3 ls --region ap-northeast-1）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488091/3a86ad40-843a-14d2-9237-05863a243fdd.png)

#### 上記のように、何も出てこないですけど、S3へアクセスできることを証明できます
TableModule vs DomainModel

![02.TableModule vs DomainModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/dbc23831-3d96-6526-f7a7-294dc68f438f.png)

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

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

Table Module は、データベーステーブルひとつにつき、その操作を担うオブジェクトをひとつ設けることで、Transaction Script がどこで何を行うかわからない状況を、少し緩和するアイデアです。このアプローチは、長大化してしまった Transaction Script の当座のリファクタリングに、とても向いています。

Table Module として部分に分割されたビジネスロジックは、実行の結果影響を及ぼす範囲がひとつのテーブルに限定されるので、Transaction Script よりも小さな粒度で動作を確認できます。部分的な動作テストであれば、テスト用データベースも、限られたテーブルの準備だけで済むようになります。

しかし、Domain Model ほどの自由度はありません。データベースの構造に縛られず、複雑な問題をどのように抽象化して解決してもかまわないのが、Domain Model のメリットです。Table Module によって得られる秩序は、逆に、設計にデータベースの物理的な構造からの制約を受けることになります。

Domain Model はデータベース構造に縛られない、プログラミングの世界で問題を考える方法です。なので、純粋なロジックをいくらでも切り出すことができます。データベースを必要としない単体テストによって、かなり広範囲にモデルの信頼性を確保できるのも、Table Module や Transaction Script にない、Domain Model のメリットです。

しかし、より重要なのは適材適所です。せいぜい 2 つか 3 つほどのテーブルに対して、比較的簡単な操作を行うだけでよい場合、ある程度の秩序を保ちつつ、コードから直接的に SQL を意識できる Table Module が、ちょうどいい選択になってくるかもしれません。
ちまたで噂の tRPCとは。

# 概要

* こんにちは。 KDDIアジャイル開発センターの小板橋です。 
* **本記事は、[KDDIアジャイル開発センター Engineer & Designer Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kag)の2日目の記事です。**
* 今回は、巷で噂の **tRPC** についてをまとめつつ、検証してみたというものになります。

https://trpc.io/

# tRPCとは？？

* 例えば、3層のwebアプリケーションや、BFF(Backend For Frontend) を使用した複数のバックエンド API を吸収するようなものを配置したアプリケーションを考えた時に、フロントから REST API などでやりとりさせようとすると API における型定義がとても重要なのは想像しやすいでしょう。
* そのために、例えば OpenAPI によるAPIの型定義ファイルを用いて開発を進めることで、事故をなるべく防止しようと努めると思います。
* ただ、このAPIの定義ファイル、正しくメンテナンスもしくは抜け漏れ等が発生した場合、疎通確認時に疎通できなくなり、あれどっちの問題？バックエンド？フロントの呼び出し部分？？など問題が発生した経験があるのではないでしょうか。(私はあります。w)

**そんな問題を解決さ。tRPCの登場！！**

* **tRPC** とは、一文でまとめると、あるプロジェクトがフルスタックの TypeScript で作られている場合、コード生成に依存することなく、**クライアントとサーバーの間で型を直接共有できる**というものです。

**え、やばくね？？**
**そうなんです。やばいんです。**

## RPC とは？

* tRPC と聞いたときに、え、あの gRPC とか RPC とかあれでしょ？と思われるのではないでしょうか。
* そもそもの RPC というのは、リモートプロシージャコール の略で、遠隔手続き呼び出しなどと呼ばれるプロトコル、規約のことを指します。
* RPC では、あるコンピュータからネットワーク越しに別のコンピュータで動作するプログラムをプログラム中の手続きや関数、メソッドなどを呼び出すのと同じ手順で呼び出すものであり、呼び出し時にネットワークレイヤを意識することなく抽象化したものと言えそうです。
* そのため、ネットワーク上で双方で RPC による通信をするために通信規約として RPC プロトコルが定められている。
* ただ、この RPC でやり取りをする際のデータフォーマットというのは、いくつかあり例えば、メッセージを XML で記述する XML-RPC や JSON で記述する JSON-RPC などがあります。
* ただ、これら、RPC でやり取りする際に バイナリ形式だとデータの取り扱いが大変だったり、テキストベースのプロトコルだと通信における転送効率が良くないという問題がありました。
* そこで登場したのが、**gRPC** です。

https://grpc.io/

* gRPC というのは、Googleが開発したRPC 実現のためのプロトコルです。
* gRPC を使うと IDL を使い API 仕様をファイルとし定義でき、そこからサーバーとクライアントに必要なソースコードのひな形を生成することができます。
* また、[Protocol Buffers](https://developers.google.com/protocol-buffers) を使いデータをシリアライズし、高速な通信を実現できます。

## さて、では gRPC と tRPC の違いはなんだろう？

* 実はこれらを比較するのは良くなく、tRPC は、gRPC のように スキーマを作成し、Protocol Buffers のようにバイナリベースのプロトコルでかつデータをシリアライズし高速化を目指すとかではなく、クライアントとサーバーの間で型を直接共有できるための RPC フレームワークなのです、

# 試してみよう

* ということで、早速やってみてどういうことなのかを目で見て確認していきましょう。
* 下記に tRPC のサンプルアプリがあるのでこちらで動作を見ていきます。

https://github.com/trpc/examples-next-prisma-starter

```
npx create-next-app --example https://github.com/trpc/trpc --example-path examples/next-prisma-starter trpc-prisma-starter
cd trpc-prisma-starter
yarn
yarn dx
```

* 左タブにあるのは、サーバサイドの実装で、右タブにあるのは、クライアントサイドの実装になります。
* 検証するのは、サーバ側の型情報を変更した際にクライアントサイド側でどう見えるのかを試します。
* ここで注目いただきたいのが、右タブの94行目の t.procedure.input() の部分なのですが、ここで入力された値を検証します。

![スクリーンショット 2022-12-02 1.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/5865c910-ea93-44fa-617c-75be192b39d3.png)

* 今は、title が string().min(1).max(32) と指定されているので、これを bigint に変えてみましょう。そうすると。。
* クライアント側が title は bigint だよとエラーを吐くようになりましたね。

![スクリーンショット 2022-12-02 1.12.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/3adde735-39ac-db16-b4d7-924219012fc9.png)

# まとめ

* 今回は、tRPC についてに触れ、実際に検証する中でデモアプリ内のクライアントサイドとサーバーサイドとの間で型が直接共有されていることを確認してみました。
* アプリケーションを全て TypeScript で作っている場合は、かなり便利なのではないでしょうか。
* 是非是非お試しくださいー！

# 参考文献

https://trpc.io/

https://qiita.com/oohira/items/63b5ccb2bf1a913659d6

https://zenn.dev/is_ryo/articles/08a9710d9f6ee2
【パソコン初心者】CPUとは？性能が高いCPUとは？

# 目次
- CPUとは？
- CPUの性能を知るためのポイント
    - [コア数](#コア数)
    - [スレッド数](#スレッド数)
    - [クロック周波数](#クロック周波数)
    - [キャッシュ容量](#キャッシュ容量)
    - [CPUのメーカー](#CPUのメーカー)

# CPUとは？

日本語だと「中央演算処理装置」。セントラルプロセッシングユニット。パソコンの頭脳的な役割を担う装置。性能の良し悪しは動作周波数の数値が高い帆ほど処理能力が高いと思ってOK。一般的に○.○GHz(ギガヘルツ)と表記される。
*CPUは動作的に熱を発する。熱暴走を起こさないようにクーラーが付いている。

# CPUの性能を知るためのポイント


## コア数

コアとはCPUの核になる部分のことで、コアの数が多いほど同時に伝える処理の数が増える。例えば4コアのCPUの場合1コアのCPUの４つ分の処理を同時に行うことができる。音楽を聴きながらインターネットを楽しむなど、複数の作業を同時に行う場合はコア数の多いCPUを搭載したデバイスを選ぼう。

## スレッド数

CPUが実行する処理の単位を指す名称です。基本「1コアにつき1スレッド」となっていることが多いが、1つのコアにつき2スレッドある「マルチスレッドディスク」もあるみたい。1コア1コアすれどと2コア2スレッドだったら後者の方が処理が早い。スレッドは擬似的に処理できるコアを増やすと考えればいいと思う。

## クロック周波数

CPUの処理速度を示す数値です。単位はHz。この数値が大きくなればなるほど高速処理になる。ただし、処理速度に比例して、消費電力や発熱量の目安となる。(TDP)も大きくなるのでクーラーと電源は大型にするのがおすすめ。

## キャッシュ容量

CPUに内蔵されている高度なメモリのこと。CPU外部から受け取ったデータを一時的に保存しておく場所。CPUが動作する際はメインメモリ(RAM)からデータを受け取ることで処理している。メインメモリはCPUよりも処理が遅いため、キャッシュデータを一時保存して処理速度の低下を防いでいる。

## CPUのメーカー

Intel, AMD
ECCV2022の枝刈り論文 (1)

# 概要

この記事では、[ECCV2022](https://eccv2022.ecva.net/)の枝刈り論文を紹介します。[^1]

[^1]: 画像や数式は論文から引用しています。


# Prune Your Model Before Distill It

https://arxiv.org/abs/2109.14960

- 概要：枝刈りしてから蒸留する方法の提案
- 新規性：Unstructured枝刈りからの蒸留で効果が上がることを示した。理論解析し、枝刈りはlabel smoothと同じ効果があることを示した。
- キモ：枝刈り(Sparsityによる正則化)はlabel smoothより重みが平均的に小さくなるため蒸留しやすくなると主張した。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/f6aab24e-8261-a3d1-a095-0a681a7eb482.png)
- 評価：ResNet〜MobileNetV2で実験した。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/84274d5c-1ce0-99ab-e9b1-35f6fa349bf7.png)


# CPrune: Compiler-Informed Model Pruning for Efficient Target-Aware DNN Execution

https://arxiv.org/abs/2207.01260

- 概要：CPrune. TVMなどで、コンパイラに枝刈り情報を通知して最適化する枝刈り。
- 新規性：モデル圧縮とコンパイラ最適化を別々にせずくっつける。
- キモ：中間表現に分類して最適化する。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/3f50a0ac-6edb-ca1f-cb0e-95abc6be8301.png)
- 評価：TVMでCPU, GPUで実験した。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/8fd6876e-222b-f14a-6895-a4a7ce8f7249.png)
AudioDAC(PCM5102A)をESP32で動かした

# はじめに
先月から卓上オーディオインターフェースを作る為に色々試作＆実験を繰り返しており
前回はOpampを使用したアンプ＆ミキサー(加算回路)を作って試した。

前回はあくまでアナログ部分の処理の話だったが、最終的にはデジタル信号も受けられるようになりたいので
今回はデジタルI2S信号をスピーカーを通して出力する為にTI社のAudioDAC(PCM5102A)を作ってDAC基板を作成してみた

基板はいつもお世話になっているJLCPCBで4層基板、5枚で700円でした。

JLCPCBのサイトはこちら！
https://jlcpcb.com/

JLCPCBは新規ユーザー向けに54ドルのクーポンを配っており、安く基板を作れます！
https://jlcpcb.com/JPV

# 今回作ったもの

PCM5102AはAudioDACの中でもそれなりに資料の多く、なんならamazonなどでAdafruitなど色々な会社の評価ボードが売っている。
その辺を使用して試してみてもいいが、最終的な目標のオーディオインターフェースは規制品の基板を使用しないで作る予定なので
そこらへんも含めて基板に起こしてマイコンで動かしてみた。

ちょうど秋月にPCM5102AのオーディオDACキットが売っていたのでその回路はそのキットを参考に使用部品などにアレンジを加えた。
[ＰＣＭ５１０２Ａ使用３２ｂｉｔ／１９２ｋＨｚオーディオＤＡＣキット](https://akizukidenshi.com/catalog/g/gK-12332/)
秋月はちょこちょこ世界部品が世界で一番安かったり(誇張)するからすごい
ステレオジャック等はちょっとチープな見た目だが５０円とクソ安いので今回のような試作実験などにはピッタリだ。

基板はアナログ、デジタルで電源を分けているので４層で作った。
下の写真を見てもらえればこれ頑張れば２層でいけるんじゃね？って思うかも知れないが面倒くさいので４層で作った。
JLCPCBで２層で２００円、４層で６００円なら４層で楽に作った方が得だな！
![cad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/585b3523-5fe5-c835-e8aa-3ba6c7480767.png)

完成品はこちら↓
基板は小さければ小さいほどかっこいいと思っているので、かなり小さく作った。
毎度のことながらJLCPCBは基板の製造は安いのにクオリティが高くて良いです。
どうせ部品の性能を見るためだけの試作だからって適当に半田付けしすぎたかも…
![IMG_0596 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/73a1ca45-f159-ebeb-7749-f3610932bb66.jpeg)


# 実際に動かしてみた
今回マイコンは秋月のESP32ボードを使用。
[ＥＳＰ３２－ＤｅｖＫｉｔＣ－３２Ｅ　ＥＳＰ３２－ＷＲＯＯＭ－３２Ｅ開発ボード　４ＭＢ](https://akizukidenshi.com/catalog/g/gM-15673/)

I2Sの仕様、及びサンプルコードは下記のYoutubeの動画を参考にした
[ESP32 Sound - Working with I2S](https://www.youtube.com/watch?v=m-MPBjScNRk)
動画投稿者の解説記事
[Sound with ESP32 – I2S Protocol](https://dronebotworkshop.com/esp32-i2s/)

解説記事にはマイク、SDカードを使ったmp3プレイヤーなどがあったが、その辺の周辺機器を用意するのは面倒なので
周辺機器が必要ないインターネットラジオをサンプルプログラムとして使用した。

ピンアサインはインターネットラジオのプログラム内に書いてあるが一応記載すると
PCM5102A⇔ESP32-DevKitC
DIN      ⇔　IO22
BCK      ⇔　IO26
LRCK     ⇔　IO25

![IMG_0597.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/f2dcedde-e326-b3d5-9416-3524af42f1ba.jpeg)


実際に動かしてみるとラジオが聞こえてきました。
波形もしっかり出ています。(波形を乗せても何の意味もないが…)
![5 - コピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867623/f242cbd7-7e0a-3555-3fba-4c18a994ee15.jpeg)

# 今回出来なかった事

今回本当にやりたかった事はUSB-I2Sだが、やり方がどうしても分からず実現する事が出来なかった。
しかし、Interface誌の2021年8月号にRaspberry pi picoを使用したUSBオーディオDACの記事が載っているのでそれを見てみると
「raspberry pi picoの公式ウェブサイトには、USB-I2S変換が行えるサンプルプログラム(usb_sound_card)が用意されています」(P.122)
とのこと。

今回はとりあえずESP32でのインターネットラジオで済ませたが、
次はラズピコを使用して今度こそUSB-I2Sを実現させたい。

# 最後に

今回、実際に上手くいかなかったのでアンプと一緒にした基板を作成する前に一度試しておいて本当に良かったと思う。
こういった試作でも日本のP板.comなら3万円くらいになってしまうので数百円で基板が出来るのは本当に便利だ。

みんなもJLCPCBを使って基板を注文してみよう！

JLCPCBへの注文の仕方や、KiCad6での製造データ作成方法は他の記事に書いているので参考にしてみて下さい。
[JLCPCBで基板を作ろう[KiCad6編]](https://qiita.com/Konbanwa11/items/4e1d14b7cdc2282063fb)
[JLCPCBで４層基板を作った](https://qiita.com/Konbanwa11/items/f44084b8963d0147c9f6)

JLCPCBは新規ユーザー向けに54ドルのクーポンを配っているので是非JLCPCBで基板を作ってみよう！
https://jlcpcb.com/JPV
ExpressRouteについて

●ExpressRoute
オンんプレミスネットワークとマイクロソフトデータセンターを閉域網で接続するサービスであり、インターネットをしようしないため高い安全性と安定したパフォーマンスを持つ。

■ExpressRoute接続を使用して、Azure内の仮想ネットワークだけでなくPaas,SaaSとして提供されているAzureサービスとMicrofost 365サービスにアクセスすることができる。

●ExpressRoute回線のSKU
▲ローカル
ExpressRouteの接続場所から最も近いリージョンにのみ接続可能なSKU。もし、東京で契約した場合は、東日本リージョンのみ接続できる。
課金モデルは無制限のみで課金は発生しない。提供される回線帯域幅は1Gbps以上に限定。

▲Standard
同一地域内のりーじょんに接続可能なSKU。

▲Premium
接続場所を問わず、特殊リージョンを除く世界中の全てのリージョンに接続可能なSKU。
Next.jsブログの開発環境構築

[Next.jsで０からブログ作成 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nextjs_blog_create) の２日目の記事です。
本記事をご覧いただき、ありがとうございます。
本当にギリギリのタイミングで書いています。
これを書いている数時間後にはワールドカップ 日本対スペイン戦です。
この記事を見てるころには、結果が出てると思うので、皆さん、いかがでしたでしょうか？


話が逸れてしましましたが、今回は環境構築についてです。
# はじめに
私の使用している端末ですが、MacBook Air 2013年版を使用しています。
メモリも4GBしかなく、動作も遅く開発が満足にできる代物ではありません。
Next.jsで何かする程度であれば、VS Codeを使って、開発できるかと思います。

ただ、普段使いのiPadもあり、空き時間に開発できれば良いかなと考えています。
ですので、今回はブラウザで開発できるし、AWSのリソースと手軽に連携できるCloud9を使用したいと思います。

# Cloud9 とは？
> AWS Cloud9 は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。これには、コードエディタ、デバッガー、ターミナルが含まれています。Cloud9 には、JavaScript、Python、PHP などの一般的なプログラム言語に不可欠なツールがあらかじめパッケージ化されているため、新しいプロジェクトを開始するためにファイルをインストールしたり、開発マシンを設定したりする必要はありません。Cloud9 IDE はクラウドベースのため、インターネットに接続されたマシンを使用して、オフィス、自宅、その他どこからでもプロジェクトに取り組むことができます。


公式より引用させていただきました。

https://aws.amazon.com/jp/cloud9/

普段から、主にiPadで利用しており、某コーヒーショップなどでコーディングしたりしています。

:::note warn
iPadの場合、タブの×で閉じる事ができないのと、
右クリックが効かない問題がありますが、工夫でなんとかなるレベルです。
ターミナルのCtr＋Cも効きませんので、ターミナルを閉じて終了させてます。
:::

# 構築してみた
AWSのコンソールからCloud9 を選択し、「Create environment」を選択します。
![スクリーンショット 2022-12-01 23.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2022657/30b152ad-a134-f636-9cf6-224788d227ed.png)


詳細は以下のように入力しました。
![スクリーンショット 2022-12-01 23.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2022657/54553bee-1089-a788-1fac-a37b01bd9ccf.png)
![スクリーンショット 2022-12-01 23.07.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2022657/9709a2a7-f39b-efa1-2bd1-61503492d19c.png)
![スクリーンショット 2022-12-01 23.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2022657/5b31bbba-883b-8413-0f97-e609610d1d4e.png)


最後の「Create」ボタンの押下で環境作成が開始されます。（すぐ終わります。）

:::note warn
Timeoutは設定してください。
放置した場合、自動的にインスタンスを停止してくれます。
落とし忘れて課金されてしまった　などの事故を防ぐことができます。
:::

完了後、「Open」で起動することができます。
![スクリーンショット 2022-12-01 23.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2022657/47a9489b-d203-97bf-9ad2-dac9d2293bb2.png)

Cloud9の画面
![スクリーンショット 2022-12-01 23.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2022657/b7f4c8b7-3990-d84e-0b28-12b80898b221.png)

# おまけ
EC2として作成されているので、EC2の一覧から停止させることもできます。
![スクリーンショット 2022-12-01 23.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2022657/3c93c85f-649c-df9f-d697-9a82ec609ba4.png)

# さいごに
今回で開発環境構築が終わりました。
次回は、プロジェクトの作成を行なっていこうと思います。
ONLY OFFICE始めました（NextCloudとの連携） ～MicrosoftOfficeからの脱却～

# 要約
- UbuntuにOnlyOfficeドキュメントサーバを構築する。
- Collabora CODEより圧倒的に簡単。
- 手順
  - Nextcloudは構築済みとする。NextcloudにOnlyofficeアプリを入れる。
  - OnlyOffice公式ドキュメントの通りにコマンドを実行せよ。
https://nextcloud.stylez.co.jp/onlyoffice
  - 日本語対応のために、このパッケージをwget <url> し、sudo apt install <ダウンロードした.deb> -y
http://ftp.us.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.8_all.deb
  - SSL化のためにLetsEncryptを利用。DigitalOceanの記事の通りにコマンドを実行せよ。ドメイン名の部分は自分の設定したドメインなりIPアドレスなりに変更せよ。
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04-ja
  - NextcloudのOnlyOfficeアプリの設定を行う。OnlyOffice鯖のURLとキーを入力する。キーはOnlyoffice鯖内の/etc/onlyoffice/documentserver/local.jsonにNextcloud連携用のキーが保存されているからコピーして貼り付けよ。
  - うまく行かないときは、iptablesなり、UFWなりを確認せよ。Onlyoffice鯖はデフォルトで80番ポートで通信を行う。クラウド利用の場合はVNWのFW設定も確認せよ。
 
以上。



# はじめに
この記事は[SLP（香川大学プログラミング研究会 アドベントカレンダー2022）](https://adventar.org/calendars/7569)の4日目の記事です。
ぜひ、他の記事も 見てください！

# 概要
OnlyOfficeを導入する記事です。
NextCloudも利用します。

MicrosoftOfficeとかGoogleDocumentsって便利ですよね～。
でもMicrosoftやGoogleに頼りすぎるのは嫌だ。OSSがいい～っていう人は一定数いるんじゃないでしょうか。
ローカル環境だったら、LibreOfficeが有名ですけど、オンライン用OSSオフィススイートは無いのかな～って調べてみたら、「OnlyOffice」が有名みたいなので、早速トライするゾという話です。

# 環境
コアサーバー(GMOのレンタルサーバ)
Google Cloud Platform（無料枠 VM E2micro）Debian

# やること
+ 鯖立て
Only Office を利用するには2つのサーバを立てる必要があります。

https://nextcloud.stylez.co.jp/onlyoffice

  + Communityサーバ(今回はレンタルサーバに入れます)
    + ファイルの保存場所 OSSのOnedrive的なオンラインストレージ 
    + NextCloudのインストール
  + Documentsサーバ(GCPに入れます)
    + ドキュメントの操作をする
    +  OnlyOfficeServerのインストール

+ SSL/TLS対応
  + Let'sEncryptを利用します
  + Let'sEncryptは無料で利用できるTLSの認証局で、HTTPSを利用した通信を手軽に導入できます。

+ CommunityサーバとDocumentsサーバの連携

# NextCloudインストール
自分はレンタルサーバに入れたので、ボタンポチポチゲーだったのですが、GCPとかにいれる人はググってみてください。たくさん情報あると思います。

# OnlyOfficeServerのインストール
公式サイト見ましょう。
英語ですが、ブラウザ右クリックで日本語にGoogle翻訳したら、そこそこ読めると思います！
apt-get は apt に読み替えましょう。
システム要件満たしてなくても動きます（Docker版はROM不足で動かないけど）

mscorefontsを入れるところがあるのですが、自分の環境ではうまくインストールできませんでした。
ここからダウンロードできます。ダウンロードした.debファイルをsudo apt install <ファイルパス> してください。
https://ftp.us.debian.org/debian/pool/contrib/m/msttcorefonts/ttf-mscorefonts-installer_3.8_all.deb


https://helpcenter.onlyoffice.com/installation/docs-community-install-ubuntu.aspx

# Let's EncryptでOnlyOfficeServerとの通信を暗号化
OnlyOfficeサーバをHTTPS対応しないと、ファイルダダ漏れになるのでLet'sEncryptで証明書を取得します。
OnlyOfficeはNginxで動いています。なので、Nginxの情報を参照してください。
DegitalOceanっていう開発者向けVPSが書いてくれてる情報が非常にわかりやすくて良きです。

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04-ja

https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04-ja

# CommunityサーバとDocumentsサーバの連携
1. NextCloudにOnlyOfficeのアプリを追加
1. NextCloudのAdministratorSettingのONLYOFFICE設定にアクセス
1. ドキュメントサーバのURLとシークレットキーを入力し保存する
   + シークレットキーは ドキュメントサーバの/etc/onlyoffice/documentserver/local.json に保存されてます

# 完了
NextCloudのOnlyOfficeの設定画面で指定した拡張子のファイルはDocumentサーバを利用して開くことができるようになります。

# 現状出来ていないこと
+ フォント周りの設定

# 今回触れなかったこと
+ ドメイン周りの設定

# 終わりに
なんか〆の言葉いるかな～って思ったけど、何書けばいいか分かりません。
冒頭にも書きましたが、[SLP（香川大学プログラミング研究会 アドベントカレンダー2022）](https://adventar.org/calendars/7569)の他の記事も見てください！
なぜJS、PythonをメインにやっているひとがC#を学んだのかとその利点

これはyuriacatsアドベントカレンダー2日目の記事です

---
プログラマーが知るべき９７のこと[^1]「[学び続ける姿勢](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%AD%A6%E3%81%B3%E7%B6%9A%E3%81%91%E3%82%8B%E5%A7%BF%E5%8B%A2/)」でも述べられている
>「達人プログラマ」を読み、学んだことを実践してみる。本の教えに従い、毎年1つ新しい言語を学ぶ。たとえ言語が無理でも、少なくとも毎年1つは新しい技術、ツールについて学ぶ。そうして未知のものに触れることは、新たな発想の元になる。

この教えにしたがい、新しい言語を学ぼうと考えていた。当初はRustやGoなどの最近流行りの言語をやろうと思っていたが
- オブジェクト指向に対する直感が湧かなかった
- 型タグではない「型付き言語」を学んだことがなかった
- C#オタクが近くにいた

上記の理由からちょっと触ってみようかなという感覚でC#の学習を始めた。文法を一通り洗って再帰下降パーサーを作るくらいまではやった。C#を活かせるコードが書けるレベルではないくらいなのはご了承ください。

## 使った教科書

[スラスラわかるC#第二版](https://amzn.to/3iprm4y)

## やったこと

上記の教科書をよむ。数ヶ月後に8時間くらいペアプロ？をしながら再帰下降パーサーを書いてみた。
1日1時間前後とって1ヶ月ほどで読了。


## 感じたメリット

- オブジェクト指向プログラミングって手法よりも今では言語機能に近いものも多いのだなということを実感できました
- 型に対する意識が高まった。
- プロパティなどを書いてバリデーションするということを意識してコーディングをするようになった。

個人的な考えとしては、ツールというのは初めから出来合いのものをうまく使っているだけだと「なぜ」そのツールが使われているかということを意識せずに使うことができ、「困った状態」になるという発想すら起こらない場合もある。古くからある言語を学ぶことは、何で困って今使っている言語ができているかを見つめ直すいいきっかけになりました。


## 個人的、実用性としては高くないが学んでおくと良さそうな言語

- C# もしくは　Java　（オブジェクト指向を見たい時に）
- Elm　（Reactに影響を与えた言語）
- C　（メモリ周りのつらさを知る）
- Haskell　（関数型プログラミング）

[^1]:無料公開されているようです：https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/
Bitcoin Core v24.0に入ったmempoolfullrbfについて

日本時間で11月25日にBitcoin Core v24.0がリリースされました。

https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-24.0.md

今回のリリースで最も特徴的な変更である「mempoolfullrbf」について簡単に解説したいと思います。

Bitcoinには[BIP125](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki)で提案されたReplace By Fee（RBF）という機能があります。

これは、後で手数料を上乗せするかもしれないというフラグをトランザクションごとに立てるものです。

混雑時に、mempoolに入っている安い手数料のTXを高い手数料のTXで置き換えたい時に使います。

Bitcoinではかつて「first-seen」という原則があり、二重支払いがあった場合、mempoolに最初に取り込んだTXを優先し、後発は無視するポリシーでしたが、混雑時に手数料を上乗せするRBF的には不便でした。

v24.0では、mempoolfullrbfをtrueとし、RBFを許容します。

将来的に、すべてのトランザクションでRBFを有効にするfull-RBFの案もあり、mempoolfullrbfオプションで、full-RBFを有効化できますが、デフォルトはoffです。

デフォルトではopt-in RBFのみ許可されます。

Bitcoin Core以外の実装のいくつかでは、full-RBFを有効にしているものもあります。

マイナーだけでなく、中継ノードがmempoolfullrbf設定でopt-in RBFを有効にすると、転送するトランザクションに違いが出てくるでしょう。

Bitcoin Coreでは慎重にfull-RBFはデフォルトで無効ですが、opt-in RBFで様子見をするのだと思います。

今回の話で分かったことがありましたらまた書きたいと思います。
SIerからWEBエンジニアに転職して感じたこと(メンタル的な話)

# はじめに
初めまして、Qiitaで初めて投稿します。
SIerからWEBエンジニアに転職して感じた大事にしたいなと感じたことをつらつらと書いていきます。
ようやく掴み始めた感覚なので、振り返ろうと思い投稿してみます。

軽く自己紹介しますと、
* ４年制大学の情報理工学部を卒業
* 大手SIerに就職(2年弱)
* 広告代理店のWEB開発をしている自社開発系企業に転職(1年)

※注意
以下、企業による特徴の違いを記述しますが、あくまで主観であり、
自身の体験に基づいているため、一般的なものではありません。

# SIerからWEBエンジニアに転職して感じたこと(結論)
いきなり結論から言いますと、
SIerからWEBエンジニアに転職して最も変化したことは「目的意識」が強くなった
ということです。

目的意識とは文字通り、目的を持って全ての行動をするということです。
振られたタスクに対して、
「なぜそれをするのか？」、「何のためにやるのか？」、「そのタスクをするとどうなるのか？」
ということを考えながら仕事をするということです。
タスクというのは、先輩から振られた小さなタスクから、
開発の要件定義のような大きなタスクなど全てを含みます。

これ、大事だと思っている人は多くいらっしゃるかと思いますが
本気で目的を持って考えて取り組んでいる人は
少数派のような気がします。(体感)
脳死でタスクやった方が楽ですからね。。。

# なぜ目的意識が強くなったのか
個人的な分析としては業界または仕事柄的な違いがあるのかなと感じています。
どっちが良い、悪いと言う話ではなく、それぞれサービスの特徴が違うために生じる環境差だと思っています。

SIerのような受託系の企業の場合、主なサービスとしては顧客が欲しいと思ったものに対して
課題解決するための手段としてシステム開発を行います。
要するに、完成品がある程度見えいている状態でエンジニアに仕事が回ってくるわけです。

一方、自社開発系の企業の場合、主なサービスとしては、
完成品が見えていない状態からエンジニアの仕事が始まります。
そもそも課題すら見えていない状態から始めることもあります。
これには語弊がありますが、課題が見えていないと言うよりも課題はあるが課題として
整理できていないため、見えていないと言うことです。
そう言う状態からエンジニアは仕事を始めるため、その課題を解決するための目的を強く意識する必要があるのです。

# 目的意識が強いと何が良いのか
一言で言うと「自分軸を持って行動できる」です。
自分軸を持つと、判断に迷った時の判断材料として自分自身を助けてくれます。
例えば、そもそも今やっているそのタスクは不要の可能性がありますので、
その分、他の大事なタスクに割く時間ができるわけです。
また、タスクを完了させるやり方として２通り考えられるが、どっちが良いか迷った時に、
目的を明確にした自分軸を持っているとどっちの方がより目的を達成できるかと言う判断ができるようになります。
さらに、判断軸を持つと言うことは、当事者意識を持つことができると言うことなので、
自分で仕事を操ることができるようになり、ストレスが軽減します。

# 目的意識が強いことのデメリットは？
全ての行動に目的意識を持つことは正直かなりしんどいです。
常に考えを張り巡らせながら仕事をするので、
考える時間はいつもの倍以上になります。
脳死でタスクをこなした方がよっぽど楽なのは明白ですね。

# どうやって目的意識を持つことができるのか
先ほど、環境に差異があったため目的意識を強くすることができたと書きましたが、
これは自分自身で気づいた場合なので、この記事を読んでいる皆さんは
すでに気づいた方も多いのではないかと思います。
つまり、目的意識とは意識なので、意識をすれば良いのです。
と簡単に言いましたが、気づいたところでその意識をそもそも忘れてしまうと言うことがあるでしょう。
その場合は、目的意識を持つための具体的な行動に結びつける仕組み化が大事だと思います。
例えば、新たにタスクが振られた場合、すぐに作業に取り掛かるのではなく
このタスクは何のためにするのか？ゴールは？前提条件は？
と言うフレームワークを使ってパズルのように埋めていくのです。
そうやって具体的に考えを順に巡らせることで自然に整理されていき、
目的意識を持つことができるでしょう。

# 最後に
そもそもなぜ目的意識について考えようと思ったのかというと、
最近ではフリーランスになって企業に依存せず、自立し、自分で資産を作り出そう
という世の中の流れを感じ、ふと自分自身を振り返ったことがきっかけでした。
フリーランスのように自立して稼いでいくと言うのは非常に魅力的で、
楽しそうだと感じますが、
企業で社員として働きながらも、目的意識を持って自分で仕事を見つけ、自立した社会人生活を
送ることはできるのではないかなと考えています。

Qiitaで初めて投稿してみて、
自分が感じていたことを投稿しようと思った時に
それを言語化することの難しさや、大事さを感じることができました。
なので、今後はこういったメンタリティ的な分野や技術的な分野についても投稿していこうと思っています。
エンジニア1年目が初めて出会った製品達

## 1.はじめに


現場に送り出されてから、早4ヶ月が経ちました。
毎日色んな会議に出席していますが、出席していて思うのはなんといっても…
"カタカナが多すぎる！！！"

初めて会議に参加したころよりも慣れてきたとはいえど、
それでも聞いたことない言葉が毎日一つは出てくる始末。
未だに異国の地に飛ばされた気分になります。

そんな中、分からない用語をメモして調べてみたところ…
カタカナ英語かと思いきや、製品の名前だった！！
というものが多々出てきました。

エンジニア歴が長い人にとっては常識だと思うのですが、
今回は自分の備忘録の意味もこめて、出会ったソフトウェアなどの製品を
まとめていきたいと思います。




# 2.ソフトウェア一覧

|ソフトウェア名|概要               |
|-------------|------------------|
|Apache|世界的に普及しているオープンソースのWebサーバソフト。LinuxやWindowsなど様々なOSで動作させることができ、汎用性が高い。
|Apache Kafka|JavaとScalaで書かれているオープンソースの分散ストリーミング送受信処理基盤。|
|Datadog|SaaS型の運用監視サービス。可用性が高く横断的なモニタリングであらゆるWebサービスの内部状態を監視する。|
|Elasticsearch|Linuxベースの全検索エンジン。大容量のデータの中から必要な情報を高速で取り出すことができる。|
|Fluentd|様々なデータの収集を統一することができるオープンソースのデータコレクタ。多機能、高速かつ信頼性高くデータ転送を行うことができる。主にRubyで記述されている。|
|Fuse(Red Hat Fuse)|Apache Camelなどのオープンソースコミュニティに基づいたオープンソースの統合プラットフォーム。連携システム同士の粗結合を実現でき、プロトコルの変換などを容易に行うことができる。|
|Grafana|マルチプラットフォームで動作するオープンソースのWebアプリケーション。あらゆるデータベースの可視化やアラートの設定などができる。|
|Jenkins|オープンソースの自動化サーバ。開発のビルドやテスト、デプロイなどの自動化を支援することでCICDの実現を可能にする。|
|Java Virtual Machine(JVM)|Javaで作成されたアプリをWindouwsやMacOSなどで動かすために必要となるアプリ。|
|kibana|オープンソースのデータ可視化ツール。Elastic Searchなどと連携して出力されたデータを図表などのかたちでみやすく整形、表示してくれる。|
|nginx|Webサーバアプリの一種。大量処理が得意でかつ高速。Webサイトの利用を向上させる機能が豊富。また、設定が比較的容易。|



# 3.おわりに

まとめてみて、ソフトウェアなのかプラットフォームなのかなど分類などを気にした方が頭に入りやすいなと感じたので、今後も意識していきたいと思います。
内容については、今後もまだまだ増えていくと思うので都度更新していけたらと思っております。
閲覧いただきありがとうございました。


# 4.参考
・IT用語辞典
　https://e-words.jp/

・「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
　https://wa3.i-3-i.info/index.html

・カゴヤのサーバー研究室
　https://www.kagoya.jp/howto/

・Red Hat
　https://www.redhat.com/ja
DoctrineとEloquent比較大全2: レコードの追加

day2の今日は、day1で定義したレコードを表すクラス（Entity, Model）を使って、Doctrine・Eloquentそれぞれのレコードを1件追加（登録, insert）する方法を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;

require __DIR__.'/../vendor/autoload.php';

$newBook = new Book();
$newBook->setTitle('ちょうぜつソフトウェア設計入門');

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';
$entityManager->persist($newBook);
$entityManager->flush();
```
<https://github.com/77web/doctrine-vs-eloquent/blob/dd6ebe256dcc08507ad00954059ed59306394c3a/Doctrine/Usecase/create_new_record.php>

- Bookエンティティのインスタンスを新しく作ります。
- Bookのインスタンスのtitleプロパティに書名をセットします。（setterを利用）
- BookのインスタンスをEntityManagerのpersist()に渡します。
- EntityManagerのflush()を呼びます。
- もしデータベースへの接続がない状態で実行すると、 `$entityManager->flush()` の時点でエラーになります。

## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Book;

$newBook = new Book();
$newBook->title = 'ちょうぜつソフトウェア設計入門';
$newBook->save();
```
<https://github.com/77web/doctrine-vs-eloquent/blob/dd6ebe256dcc08507ad00954059ed59306394c3a/Eloquent/Usecase/create_new_record.php>

- Bookモデルのインスタンスを新しく作ります。
- Bookのインスタンスのtitleプロパティに書名をセットします。
- Bookのインスタンスのsave()メソッドを呼び出します。
- もしデータベースへの接続のない状態で実行すると、save()の時点でエラーになります。
酷すぎる自分のSQL（Laravel query builder）を掃除した話

Laravelのクエリビルダを使ってデータを取得する際のアプローチが力技もいいところでしたので、修正していった過程を投稿します。

`Laravel version 8.83.26`
`MySQL version 8.0.31`

### やりたいこと
**下記のロジックを成立させるクエリを作成したい**
- ユーザーがログイン時にPOPUPを表示
- POPUPは管理画面から登録可能
- ユーザーはPOPUPを見た時「次回から非表示」を選択できる
- 「次回から非表示」をしたPOPUPは除外して表示

### 元々の実装案
３つのテーブルをJOINさせて表示させようとしていた。
- POPUP内容を登録するテーブル（`notifications`）
- ユーザーテーブル(`users`)
- 「次回非表示」を選択したユーザを登録する中間テーブル（`notificatoin_user`）
※中間テーブルは[Laravelの命名規則](https://readouble.com/laravel/8.x/ja/eloquent-relationships.html)に従って命名

### 最初の構文（ひどい）
```php
//notificationController内

DB::table('users')
            ->leftJoin('notification_user', 'notification_user.user_id', "=", 'users.id')
            ->rightJoin('notifications', 'notifications.id', "=", 'notification_user.notification_id')
            ->where('users.id', "=", null)
            ->orWhereNotIn('users.id', [$auth_user->id])
						->get();
```
やっていることは、一言で言うと、
***「全部取得しちゃえ！」***
です。
エンジニアになる前から、上記のようなクエリを作成する機会がなかったので、ここでしっかり整理しておこうと思い執筆しました。
上記の記述は全てを取得している状況なので、ここから無駄な肉を削ぎ落として行きます。

### 修正した構文が以下の通り。
```jsx
DB::table('notifications as n')
        ->select( 'n.id as id',
                  'n.image as image',
                  'n.already_read as already_read', 
                  'n.hide_next_time as hide_next_time', 
                  'n.jump_link as jump_link', 
                  'n.notify_priority as notify_priority', 
                  'nu.read as read',
                  'nu.hide_next as hide_next' )
        ->leftJoin('notification_user as nu', function ($join) {
            $join->on('n.id', "=", 'nu.notification_id')
                 ->where('nu.user_id', "=", auth()->user()->id);
        })
        ->where('nu.user_id', null)
        ->orderBy('n.notify_priority')
        ->orderBy('n.id')
        ->get();
```

ちょうどこちら[【SQL】今日からできるクエリチューニング](https://qiita.com/lvn-okino/items/263d3eecdf07e2099db1)にSQLのパフォーマンス向上に関する記事もあったので、実際に活用してみました！

### 主な修正点
- そもそも`users` テーブルをJOINする意味が全くないので削除
- `$join->on` を追加して、JOINに制約を追加
- `where` の前にリクエストユーザーのIDと中間テーブルのユーザーIDの一致データを抽出する方式に変更
→これによって、JOINの段階で`user_id` カラムには自分のID以外のレコードを`null` にすることができる。
- エイリアスを設定（クエリの処理速度が上がるらしい）

これで少しは綺麗に記述できている、はず。。
間違っていたり、もっといい書き方があれば押して得ていただけると嬉しいです！
PowerAutomateの社内展開を始めた２０２２年の振り返り

この記事は、[Power Automate Advent Calendar 2022](https://qiita.com/advent-calendar/2022/powerautomate) 12月2日担当分の記事です。

# はじめに
一年前は、一年後、これ程社内でPowerAutomateに関係するとは思いませんでした。
そんな中アドベントカレンダーを見て、Power Automateに関連すればなんでもＯＫとあり、うちの社内で起こった変化をまとめてみる、それが誰かの気づきや参考になればと思い今回投稿します。

# 去年と今年の違い
去年は社内ではほぼ私一人だけの利用でした。
一年経って、社内では５名以上使用してます。
人数だけ見ると少ないのですが、ようやく社内普及への第一歩を踏み出すことが出来ました。現在は様々な動きがあり一年後には１００名以上が自分で作成できる環境に変化を期待。

# 去年行っていたこと
自分の部署の発信ツールを使って、こういうツールありますよ！便利ですよ！とＰＲ。
また業務で実際自分も利用しているので、その方法の紹介でした。

主目的がFormsの集計だったため、社内でFormsを利用する機会が少なかったこともあり、使える場面が限定的であり、興味を引くことが出来なかったこと。それに気づいたのは今年に入り随分立ってからでした。
その為、今年はもっと実務に近いフローを作成して、利用して貰うこととしました。

# 今年行ったこと
前年度の反省を踏まえ、自社の業務で実用頻度が高い業務であり展開可能なものでないと難しいと思い、その視点で検討することにしました。
まずPowerAutomateを触れて貰える一年にしようと決め、関係者で取り組めそうな人を巻き込むことに。

# 実際に行ったこと
### 0\.フローの選定
PowerAutomateのテンプレートを基に事例を検索。
その中から、業務上切っても切り離せないメールの発信を選定
[Microsoft Power Automate テンプレート スケジュールに従ってメールを送信する](https://powerautomate.microsoft.com/ja-JP/templates/details/86c2c250bc1311e6b2e2c98b01575bae/%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AB%E5%BE%93%E3%81%A3%E3%81%A6%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B/)

### 1\.実行者の選定
新しい取り組みを入れましょうという割に、現状はとかく否定的な人が多い。
例：自分より部下のXXさんに試してもらってはどうかな。
　　今のところ自分は困ってないから必要ない　など。
と言っていても始まらないため、口説き落とせば何とかなりそうな人をそそのかしました。
### 2\.実際のフローの作成
コロナ禍でありパソコン会議が身近にあり、パソコン会議で画面を共有しながらマンツーマンで設定を進めました。
まずはとにかくこのツールに慣れてもらうことを最優先。そして分かりやすく、難しくしないこと。
### 3\.フローの完成からの思わぬ落とし穴
２の実行後、このツールの便利さを知ったため、自ら作成してみたそうです。それが半年に１度のメールであるにも関わらず即時発信になってしまったとのこと。青くなりながら慌てて電話が。
対応は出来たので事なきを得ましたが、細かい仕様を省いて説明したために生まれた勘違いによって思わぬ事態が起こってしまいました。
PowerAutomateはフローが９０日動作しないと止まってしまうため、半年単位での設定は難しいため、現在は毎日起動し、指定日に発信する仕組みへと変更しました。
### 4\.それでも何とか前に進んだ結果、社内で受賞
弊社では、投稿された事例で効果の大きいものに表彰するという仕組みがあり、こちらに投稿したところ受賞すること運びとなりました。
これをきっかけに、PowerAutomateを知りたいという人たちに教えていくこととなりました。
### 5\.受賞により起こった変化
１年前までは、使っていたのは自分だけという状況でした。
受賞をきっかけにツールを知り、使いたいという人が増えました。
また、先般はグループ会社内でのＰＲをする機会に恵まれ、問い合わせが増え、現在進行形で社内への展開・拡大を行っております。

# まとめ
ＲＰＡを使って効率よく仕事をしましょう。みたいな言葉があふれる昨今。
社内を振り返ってみると、日常的にExcelやOutlookは使う。そのほかにTeamsやSharePointも使い、たまにFormsなども使う。
でも、Microsoft 365 E3プラン契約にも関わらず、PowerAutomateやPowerBIなど使う人はいないという矛盾に、１年前から取り組みを開始しました。
ネット上で情報を集めたり本を買ってみたり、いろいろと模索。
しかも、紹介だけでは立ち行かないことを知りました。
また、「もっと簡単に、このツールに歩み寄ることが大事」だという気づきもありました。

　別の場面では、ＲＰＡを利用してもらうことが出来た理由はなんですか？と聞かれることがありました。
　これについては、やはり実際の実務に見合ったフローを作成し、利用させることが大事であり、まず使うツールを慣れてもらうことが重要だと伝えました。
習うより慣れよで、失敗事例もありましたが、この方はこれをきっかけに更に取り組んでいろいろ作り始めたようで、教えた側としては嬉しく思っているところです。
ＲＰＡが便利という記事はよく見るのですが、浸透させるのは本当に難しいです。
日本人の気質なのか、弊社独特のものか。変化しろと言いながらも、変化を拒む人が多い。
その中で協力者を見つけることがまず難しく、見つかっても今回のようにうまく行くとも限らない。
でも実際使ってみて便利さを知れば、黙っていてもステップアップしていくこともある。
冒頭で５人と書きましたが実際はもっと多いかもしれませんが、去年よりも利用する人が増えたのは事実です。
野良ロボットを作らないためにどうするかなど考えることは様々ありますし、他社事例でも先行導入して失敗してという話も耳にします。
そのため、慣れることが浸透への第一歩であると考えます。

# さいごに
初めてのアドベントカレンダーへの投稿予約後、周りを見ると技術的な事例が多いようで場違いかなとも思わなくもありませんが、初心者ということで突っ走ってみました。
以上、お付き合いいただきありがとうございました。
目に見えない文字を悪用してサイトを好き放題荒らされた話

# ある日のこと

僕の運営している『[ブラウザで遊べる絵チャット（令和最新版）](https://drawtalk.laineus.com/)』に、このような投稿がされてしまいました。

![Screenshot from 2022-11-29 21-31-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/1e6c3918-b340-c2e7-9427-19be03642bfd.png)

正直こんな荒らしは毎日のようにあるのですが、普段であればすぐに他のユーザーによって通報され、対処されます。

しかし、このユーザーは、**何故か他ユーザーに通報されることなく**、荒らし続けることができていました。

スクショをよく見ていただきたいのですが、通常であれば、「善良ユーザーA」のように発言の横にユーザーが名が表示され、そのユーザー名をクリックすることでプロフィールを表示することができるようになっています。

しかし、**荒らしているユーザーには、なんと名前がない**のです。

名前がないと、ユーザー名を押下することができず、プロフィールも表示できません。

**違反行為の通報は、プロフィールから行うようになっている**ため、このユーザーは**他ユーザーから通報されることなく**、好きなだけおちんちん祭りを続けることができてしまったのです。

## バリデーションちゃんとしてたのに！

ユーザー名には、空文字を設定できないように、以下のようなバリデーションを行っていました。

```js
const submit = (name) => {
  const trimedName = name.trim()
  if (!trimedName) return alert('名前は必須です')
  // ..
}

submit('') // 弾かれる
submit(' ') // 空白文字だけの場合も弾かれる
```

クライアント側だけでバリデーションしていたってオチでもありません。
サーバーサイドでも同様のバリデーションを行っていました。

では何故ユーザー名の無いユーザーが現れてしまったかと言うと、、

# Unicodeには描画されない文字が多数存在する

以下の例をご覧ください。

```js
const submit = (name) => {
  const trimedName = name.trim()
  if (!trimedName) return alert('名前は必須です')
  // ..
}

submit('⁠') // 弾かれない（！？）
```

一見、空文字を渡しているので、先ほど同様alertが出そうですが、上記のソースコードのsubmitは弾かれず、alertが表示されません。

実は、`submit('⁠')`のクォート内には、表示されない文字が含まれています。

このような目に見えない文字は、**見えないだけで存在はしている**ので、Booleanに変換すればtrueになってしまいます。

trimでも取り除けませんし、文字数を数えてもカウントされてしまいます。

```js
// 普通のあいうえお
console.log('あいうえお'.length) // -> 5

// あいうえおの間に目に見えない文字が含まれている
console.log('あ⁠い⁠う⁠え⁠お'.length) // -> 9
```

冒頭の荒らしユーザーは、このような文字をユーザー名に用いていたのです。

# 対処方法

調べた限り、このような表示されない文字はたくさんあるようで、それらを簡単に検出する方法は見つけられませんでした。

とりあえず僕のサイトに関しては、何かしら有効な文字さえ含まれていればいいので、見えない文字を見つけるのではなく、**見える文字が1文字以上含まれていることをバリデーションする**ことにしました。

```js
if (!name.match(/[a-zA-Zぁ-んァ-ヶｱ-ﾝﾞﾟ一-龠]/)) return false
```

*追記: [Unicode property escapes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes)でより賢くできるようです。*

# 目に見えない文字が生むその他の問題

他にも以下のような悪用が行えてしまうようです。

- [バレずに情報をリークしたり](https://labs.cybozu.co.jp/blog/akky/2018/04/leaker-detection-by-zero-width-characters/)
- [他の開発者にバレないようにソースコードにバックドアを仕込んだり](https://www.bleepingcomputer.com/news/security/invisible-characters-could-be-hiding-backdoors-in-your-javascript-code/)

# 例えばQiitaでも…

Qiitaの記事はタイトル未入力では投稿できませんし、半角/全角スペースを使ってごまかすこともできませんが、さきほどの目に見えない文字を用いることで、[Qiitaの記事でもタイトルの無い記事](https://qiita.com/laineus/private/9221cf30964de2537973)を投稿することができました。

![Screenshot from 2022-11-29 19-08-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/fb026db7-0178-5de4-e9d3-cd94cde0997e.png)

:::note alert
同様のことができるサイトが他にもあると思いますが、これを悪用した不正やイタズラはおやめください
:::

# おわり

Unicodeについて詳しくありませんでしたが、こういう特殊な文字もあるんだなーと頭に留めておこうと思いました。

---

https://qiita.com/laineus/items/7a682f9d4d1bd36643f9
DNSサーバの種類

「DNSサーバ」といわれるものには、役割に応じていくつか種類があります。
しかし、記事や書籍を見ると、それぞれに呼称がいくつかあり混乱してしまいます。
そこで、その全体像を整理してみました。

# DNSの全体イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598740/d03de51f-8348-5e92-b055-1d97a1cad3f9.png)

## DNS権威サーバ（コンテンツサーバ）
 - インターネット上で名前(FQDN)に対応するIPアドレスとゾーン情報(コンテンツ)を`ゾーンファイル`として保持し、FQDNに対するIPアドレスを回答するサーバ。
 - 基本的に自身が管理しているドメインに対しての問い合わせにしか応答しないため、クライアントから問い合わせられる様々なFQDNに対して、DNS権威サーバを探し名前解決をするサーバ（DNSキャッシュサーバ）を準備する必要がある。（example.comの権威サーバが解答するのは***.example.comの名前を持つサーバのIPだけ）


## DNSキャッシュサーバ（リゾルバ、フルサービスリゾルバ）
 - PCなどクライアントからの`再帰問合せ`に対して、各権威サーバをたどり名前解決を行うDNSサーバ。
 - 問合せされたFQDNに対し、権威サーバに対してルート`(.)`→`.com`→`example.com`という流れで下位の権威サーバに順々に名前解決（反復問い合わせ）を行い、クライアントにIPを教えてくれる。
 - 一度解決した情報は、一定時間保持（キャッシュ）しておき、同じ問い合わせが来た際には、そのキャッシュから解答することで効率的な名前解決を行う。
 - Google Public DNS (8.8.8.8, 8.8.4.4) などの特殊な例を除き、特定のクライアント（プロバイダの契約者や、企業の場合は社内イントラ内のPCなど）からの問い合わせしか受け付けない。



## DNSフォワーダ（DNSプロキシ）
 - キャッシュサーバのようにクライアントからのクエリを受け付けるが、自身で名前解決は行わず、キャッシュサーバにクエリを転送（フォワード）するだけのサーバ。
 - 何らかの理由でキャッシュサーバに直接通信させたくない、あるいはクライアントがインターネットに通信出来ない場合に名前解決を中継せるために利用される。


## 内部DNSサーバ
 - インターネットには公開しない企業内イントラなど内部ネットワークでも名前で通信したいときに権威サーバとして構築されるサーバ。
 - パブリックに公開するゾーンではないため、ドメイン名は、管理者が自由に決めることが可能。

## DNSルートサーバ
 - ドメインツリーの頂点であるルートドメイン（.）の権威サーバ。
 - 世界中に分散された13台（※）の権威サーバから構成され、もしこのサーバが全部とまるとインターネット上のすべての名前解決ができなくなる。
> ※：ルートDNSサーバのIPアドレスは13個ですが、実体としてのサーバはAnyCastにより1IPに対して分散配置された複数台のサーバで可用性向上がされています。

# 蛇足：AWSのDNSサービスとの対応付け
- DNS権威サーバ：`Route53`
- DNSキャッシュサーバ：`Route53 Resolver for Hybrid Clouds(旧Amazon Provided DNS)`
- DNSフォワーダ：`Route53 Resolver `
- 内部DNSサーバ：`Route53 Private Hostzone`
過去のgit commitの変更内容を修正したいときの手順

# この記事は？

[ことみん Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kotomin_m) 2日目の記事です！

どういう人が読むといい記事か？
* 複数コミットした後にいくつか前に`git commit`した内容を変更したいことに気づいた人
* gitの概念はおおよそ分かるが`git rebase`はあまり使った経験がない人
* `git rebase`の具体的な手順を知りたい人
* 入社して3ヶ月後の私


# どのコミットを修正するか git log で確認しよう

`git log --oneline`を実行します。
`git log --oneline -n 10`のように、`-n`オプションで最新コミットから何行分出力するかを指定することもできます。

```
$ git log --oneline
bdc5250 (HEAD -> main) 4番目のコミット
9979f07 3番目のコミット
c05eebe 2番目のコミット
96a616c 1番目のコミット
```

例えば今回は、`9979f07 3番目のコミット`の差分を修正します。

# git rebase -i を使って編集しよう

修正したいコミットは`9979f07 3番目のコミット`です。
修正に必要なのはその1つ前のコミットIDなので、今回必要なのは`c05eebe 2番目のコミット`です。

`2番目のコミット`のコミットIDの`c05eebe`を指定して`git rebase -i`を実行します。

```
$ git rebase -i c05eebe
```

実行すると、このように表ターミナルに表示されています。

```
pick 9979f07 スクレイピングしたデータを保持するための型の定義
pick bdc5250 一覧ページからデータを取得

# Rebase c05eebe..bdc5250 onto c05eebe (2 commands)
以下略
```
次の順で操作し、修正するコミットを指定します。
1. 編集モードに入る
1. 修正したいコミット`9979f07 3番目のコミット`の行の`pick`を`edit`に編集する
1. 保存して終了する

編集したあとの内容がコチラです。

```
edit 9979f07 スクレイピングしたデータを保持するための型の定義 ←この行の先頭を編集しました
pick bdc5250 一覧ページからデータを取得

# Rebase c05eebe..bdc5250 onto c05eebe (2 commands)
以下略
```

保存して終了したあとは、修正したかったソースコードを編集してください。

編集が終わったらその状態でコミットを修正するため、以下のgitコマンドを順番に実行します。

```
$ git add .
$ git commit --amend
$ git rebase --continue
```

これで無事に編集が完了しました。お疲れさまでした。

すでにリモートブランチにpushしていた場合は、修正した内容を上書きするため`git push -f`のように`-f`オプションをつけてpushしてください。

```
$ git push -f
```

# おわりに

コレお覚えたらもう`git commit -m "refactor: typoを修正`をしなくても良くなりますね。
AWS Resource Explorerの別アカウント検索について

# はじめに
こんにちは、株式会社ジールの[@Suguru-Terouchi](https://qiita.com/Suguru-Terouchi)です。
今回は先月リリースほやほやのResource Explorerについて記載していきたいと思います。

# Resource Explorerとは
一言で言うと検索サービスですね、残念ながら執筆（2022/12/02）時点では日本語ページはまだないようです。
https://aws.amazon.com/jp/resourceexplorer/

「管理とガバナンス」部門の期待の新人で以下の場所にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/6f3e1435-3d1d-3be5-05a9-a5deb98bde7e.png)
※↑ちなみにまだベータ版だけど、皆様待望の「ダークモード」が利用可能になっています！

概要や簡単な使い方などはこちらに素晴らしい記事があるのでこちらを参照して頂ければと思います。
https://dev.classmethod.jp/articles/aws-resource-explorer-new/

# Resource Explorerの検索範囲
はい、ということで本記事の本題に入ります。
こちらが検索画面の一部になるのですが、クエリ機能があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/e0cff83d-4265-d050-f9c5-e38017ec47cc.png)
なにげなくクエリの「情報」を参照してみると・・・？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/02dfb020-09ab-e872-2405-ef214b6a5f8d.png)

    accountid:123456789012

・・・なんと！「accountid」での検索が可能と書いてあるではないですか！
早速、意気揚々とOrganizationsに所属しているアカウントIDで検索してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1963640/1b95c98e-f61a-fc82-44f5-5594976f9326.png)
はて、、、検索の使い方は合っているはず。。
その後、Resource Access Managerを使ってリソースの共有を設定したりしても結果は変わらずでした。

一旦、検証を断念してAWSサポートに問い合わせをしたところ、
以下のような回答が返ってきました。

    大変恐れ入りますが、Resource Explorer では現在、他アカウント（組織内のアカウントを含む）のリソースを検索いただくことはできません [1] 。
    Resource Explorer では現在、アカウント内に限り、リソースの検索を実施いただけます。
    
    参考資料 [1] より抜粋
    ```
    Q. Can I search my resources across AWS accounts or across an AWS Organization?
    No, you cannot currently search across AWS accounts or AWS Organizations.
    You can search only within a single account across AWS Regions where you enabled AWS Resource Explorer. 
    ```
    
    お客様のご期待に沿えない結果となり、大変恐縮ではございますが、何卒ご理解賜れますと幸いでございます。
    なお、Resource Explorer において組織内のアカウントや組織外のアカウントのリソースを検索したいというご要望につきましては、既に海外の製品担当部署にて認識しているとともに、他のお客様からも同様のお問い合わせをいただいており、本件に関しましても当該部署にフィードバックをさせていただきました。
    機能追加の可否や対応時期についてのお約束はいたしかねますが、今後のアップデートをお待ちいただけますと幸いです。

    ■ 参考資料
    [1] Resource Search – AWS Resource Explorer FAQs – Amazon Web Services
    https://aws.amazon.com/jp/resourceexplorer/faqs/ 
ふむ、・・・ということはまだしばらくは別アカウントのリソース検索はお預けということですね。

# まとめ
いかがでしたでしょうか。

今後のアップデートに期待というところですが、
同じような考えに行きつく方もいるかと思い備忘録として残しておきます。

ご参考になれば幸いです。

# データ活用をサクッと始めるなら！
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
 
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area