OmniAICreator/Qiita-1.07M huggingface dataset:
【競プロ】逆元の計算方法のチートシート

毎回逆元の計算方法を忘れるので、備忘録として残します。

## TLDL;
整数Nの逆元(inverse)の求め方
```
inv = pow(N, MOD-2, MOD)
```

## 上記の計算式が成り立つ理由
フェルマーの小定理を使います。[wiki](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%83%AB%E3%83%9E%E3%83%BC%E3%81%AE%E5%B0%8F%E5%AE%9A%E7%90%86)
p を素数とし、a と p は互いに素とするときに、 以下が成り立つ。
```math
a^{p-1}≡1 (mod \ p)
```

今回 $a^{-1}$ を modで取りたいとした時に、以下のxを求めることを考えます。

```math
a^{-1}≡x (mod \ p)
```

フェルマーの小定理の両辺に $a^{-1}$ をかけます。
```math
\displaylines{
a^{p-1} \times a^{-1} ≡ a^{-1} (mod \ p) \\
a^{p-2}≡ a^{-1} (mod \ p)
}
```

上記より、$a^{-1}$ が $a^{p-2}$のmod pで表すことが示せました。

## nCrの例題
逆元はnCrを求めるときなどでも非常に役立ちます。
例）${}_{1000}C_9$ $(mod \ p)$ を求める場合 $(p = 10^9+7)$

$1000!$ をまず求めます。
```python
MOD = 10**9 + 7
fact = [1]*(1001)
for i in range(1, 1001):
  fact[i] = fact[i-1] * i % MOD
```
fact[1000]で$1000!$が求まります。
次に$1000!$までの逆元を求めます。

```python
invfact = [1]*(1001)
for i in range(1, 1001):
  invfact[i] = pow(fact[i], MOD-2, MOD)
```

${}_nC_r$は$n! / ((n-r)!*r!)$であるため、答えは以下になります。
```python
ans = fact[1000] * invfact[1000-9] % MOD * invfact[9] % MOD 
```
LWC と Leaflet.js でマップを表示してみよう！

皆様、お久しぶりです！
今回は、LWC で [Leaflet.js](https://leafletjs.com/index.html) というオープンソースの地図表示系 JavaScript ライブラリを使う機会があったので備忘録も兼ねて紹介してみたいと思います。

# Leaflet.js の取り込み
まずは、作成済みの sfdx プロジェクトに Leaflet.js のライブラリを取り込んで、静的リソースとして追加します。

```bash
$ sf static-resource generate -n LEAFLET -d force-app/main/default/staticresources
$ npm install leaflet
$ cp -r node_modules/leaflet/dist/* force-app/main/default/staticresources/LEAFLET
$ npm uninstall leaflet
```
ライブラリの取り込みには、[公式サイト](https://leafletjs.com/download.html)からダウンロードしてきても問題ありませんが、ここでは NPM を使ってインストールしたものを静的リソースに移動して使っています。ライブラリ自体はNPMに管理してもらう必要がないので、静的リソースへの複製後、アンインストールしてます。


# マップ表示コンポーネントを作成する
それでは早速、Open Street Map のタイルレイヤーを使って、シンプルなマップを表示してみましょう。

```html:mapComponent.html
<template>
    <div class="map" lwc:dom="manual"></div>
</template>
```

```javascript:mapComponent.js
import { LightningElement } from "lwc";
import LEAFLET from "@salesforce/resourceUrl/LEAFLET";
import { loadStyle, loadScript } from "lightning/platformResourceLoader";
export default class LeafletMap extends LightningElement {
  isResourceLoaded;

  renderedCallback() {
  
    // DOM にアクセスする必要があるので、
    // 描画の完了を待って一度だけリソースを読み込む
    if (!this.isResourceLoaded) {
      Promise.all([
        loadScript(this, LEAFLET + "/leaflet.js"),
        loadStyle(this, LEAFLET + "/leaflet.css")
      ]).then(() => {

        // リソースが読み込まれたらフラグを立てる
        this.isResourceLoaded = true;

        // マップを初期化
        const mapContainer = this.template.querySelector(".map");
        const map = L.map(mapContainer).setView([35.684505, 139.76257], 16);

        // Open Street Map のタイルレイヤーを表示
        L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
          attribution:
            '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
        }).addTo(map);
      });
    }
  }
}
```
```css:mapComponent.css
.map {
  height: 600px;
  z-index: 0;
}
```

組織にデプロイ後、ページに配置してみましょう。
こんな感じで表示されれば成功です。
![Screenshot 2023-11-27 at 10.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/9a33fa99-8ad2-e4d2-e414-8babb110684b.png)

# タイルレイヤーの変更
タイルレイヤーを変更することで、Open Street Map が提供するマップ以外のマップを利用して見た目を変えることができます。以下の Leaflet Providers からどんなマップが提供されているかプレビューすることもできます

- [Leaflet Providers](https://leaflet-extras.github.io/leaflet-providers/preview/)

ここでは ArcGIS で提供されるマップを読み込んてみます。

```javascript:mapComponent.js(抜粋)
L.tileLayer(
          "https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}",
          {
            attribution:
              "Tiles &copy; Esri &mdash; Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community"
          }
        ).addTo(map);
```
その結果、表示されるのがこちらのマップです。

![Screenshot 2023-11-27 at 10.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/7cc0ee48-8f9b-6de5-8810-3545a47cbc29.png)

# 最後に
いかがでしょうか。
マップの表示ソリューションにはいくつかのライブラリが存在していますが、LWC では利用できないものをあるので、要件に合えばぜひ、Leaflet.js の利用も検討してみてください。
【デプロイ/Streamlit】EC2から抜けてもstreamlit runが走り続けるように実装する。

# 【お知らせ】GENDAアドベントカレンダー
GENDAアドベントカレンダーのお知らせです。
GENDAアドベントカレンダーは、株式会社GENDAに所属するメンバーがお送りするアドベントカレンダーです。

https://qiita.com/advent-calendar/2023/genda

12月1日からの25日間、GENDAのプロダクト開発や組織開発に関わるメンバーが、毎日多種多様なテーマの記事をお届けする予定となっております。



# 今回の課題
streamlitで作成したアプリをEC2にgit cloneして`$ streamlit run`コマンドを実行し、アプリをEC2上で動かすところまで実装できた。
しかし、EC2から抜けると`$ streamlit run`が停止してしまうことに気づいた。

なので、今回は`$ streamlit run`がEC2上で動き続けるように、streamlitアプリのデーモン化に挑戦した。


# 実装手順
streamlitアプリを動かし続けるために以下の手順で実装した。
1. `service`ファイルを作成する。
2. 各種コマンドを実行する。

※streamlitのinstallや`streamlit_app.py`の用意は、既に終わっているものとします。

## 1. `service`ファイルを作成する。
systemdの`service`ファイルを作成する。
以下のような、`/etc/systemd/system/streamlit_app.service`を作成する。
```streamlit_app.service
[Unit]
Description=デーモン化のテスト
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/ssm-user/streamlit
ExecStart=/home/ssm-user/.pyenv/shims/streamlit run /home/ssm-user/streamlit/streamlit_app.py
Restart = on-failure

[Install]
WantedBy=multi-user.target
```
上記のファイルの意味は以下の通り。
### Unit セクション
#### Description
サービスの説明。

#### After
このサービスが依存するターゲットやユニットを指定し、そちらの処理が完了するまで待機する。
今回は`network.target`を設定しているので、ネットワークの設定が完了するまで、
上記のファイルに記述の処理の実行を待機するようになっている。

### Service セクション

#### Type
`ExecStart`で指定したコマンドでサービスの処理を起動した時に、サービスの「起動完了」の判定タイミングを指定する。
`simple`はデフォルトの設定値で、プロセスが起動した時点で起動完了となる。
#### WorkingDirectory
サービスが実行される作業ディレクトリを指定する。
#### ExecStart
サービスを開始する際に実行されるコマンドを指定する。
サービスが開始する際に、`streamlit run`コマンドが実行されるように指定しているイメージ。

※Streamlitを`/home/ssm-user/.pyenv/shims/streamlit`にインストールしてあり、`/home/ssm-user/streamlit/streamlit_app.py`にstreamlitのコードがある。

#### Restart
サービスの再起動条件を指定する。
`on-failure`は、サービスが失敗した場合に再起動することを示している。

### Installセクション
#### WantedBy
サービスをどのターゲットに関連付けるかを指定する。
`multi-user.target`は通常、ユーザーがログインする際に起動するターゲット。
サービスはこのターゲットに関連付けられて実行される。

## 2. 各種コマンドを実行する。
1.`streamlit_app.service`の変更をsystemdに変更させる。
```cl
$ sudo systemctl daemon-reload
```
2.`streamlit_app.service`を起動時に自動的に有効化する。
```cl
$ sudo systemctl enable streamlit_app.service
```
3.`streamlit_app.service`を起動する。
```cl
$ sudo systemctl start streamlit_app.service
```
4.`streamlit_app.service`の現在の状態を表示する。
※サービスが正常に動作しているかなどを確認できるので、問題が発生していれば対応する。
```cl
$ sudo systemctl status streamlit_app.service
```

# 参考
https://hogetech.info/linux/base/systemd

https://qiita.com/ledmonster/items/5f2e1633d4124cb978fe
Windows11 HDD(2TB)→SSD(1TB)への換装

Ubuntu live USB を使う

HDDのパーテションを(1TB)以内に、左詰め
　→パーテションの縮小はWin-ディスク管理
　→パーテションの移動はUbu-GParted

Ubuのターミナルから以下のコマンドを実行
sudo dd if=/dev/sda of=/devsdb bs=16M conv=noerror,sync status=progress
　→エラーがあっても強制的に続行
　→スピード優先でddコマンドを採用

上記ddコマンド処理完了後、GPartedにて、ssd確認。
パーテション領域エラー
下記、gdiskコマンドにて、修復
sudo gdisk /dev/sdb
x
v
e
m
w

GPartedにて、再度確認
パーティションOK

SSDパーティション調整
　→SSDが使用可能な最大までパーティションを調整

HDD→SSD 物理的に載せ替える

参考:
https://qiita.com/elm200/items/44108983f4eee85dcb15
https://kappaseijin.hatenablog.com/entry/20160924/1474683913
https://yurufuwadiary.com/ubuntu-clone-to-ssd
https://blog.onodai.com/posts/2019-02-19-tue
Linux及びMacターミナルでファイルを検索する方法

## 要　旨
Linux及びMacターミナルでファイルを名前で検索する方法について記述します。
## 実行環境等
コンピューター: iMac 21.5インチ　2017年モデル
macOS: Ventura 13.6.1
## 実施要領
### 名前で検索する
```python:
$ find -name "usdjpy"
```
上記は、大文字小文字を区別して検索します。
大文字小文字を無視して検索する場合は、次のように入力します。
```python:
$ find -iname "usdjpy"
```
### ファイルの名称の一部を使用して検索する
usdjpyで始まるファイルを全て表示するには、次のように入力します。
```python:
$ find / -type f -name "usdjpy*"
```
## 結　言
今回は、Linux及びMacターミナルでファイルを名前で検索する方法について記述しました。
useContentfulLiveUpdates - RangeError: Maximum call stack size exceeded


You might miss passing `sys.id` property to the `useContentfulLiveUpdate`.

```js
// `post` should contain `sys.id` property.
const updatedPost = useContentfulLiveUpdates(post);
```

> It’s necessary that the provided information to the hook contains the `sys.id` for identification.
> https://www.contentful.com/blog/elevate-your-contentful-and-next-js-workflow-with-live-preview/

`useContentfulLiveUpdates` may recursively search `sys.id` property in its object.
ダイナミックディスクサイジングの発表

<font color="Grey">*[Announcing Dynamic Disk Sizing](https://aiven.io/blog/announcing-dynamic-disk-sizing)の翻訳です。*</font>

2022年6月17日

# ダイナミックディスクサイジングの発表

Aivenの全サービスで、ご自身でストレージの追加予約が可能です。プランを変更する必要はありません！

Aivenのお客様は、セルフサービスとしてAivenの全サービスプランのディスク容量割り当てを自由に調整することができます。これはどういうことでしょうか？プランを切り替えることなく、追加ストレージを予約できるようになりました。


Dynamic Disk Sizing（頭文字をとってDDSと呼んでいます）は、Aiven Console上で使用するディスク容量を調整することができます。プランで定義されている容量の3倍まで調整可能です。


この機能はAWS、GCP、Azure環境で利用可能です。


## Aiven サービスにおける動的ディスクサイジング


通常、Aivenの固定ストレージ割り当てプランから選択するのは簡単です。しかし、アプリのデータ量が非常に多い場合など、他のすべてをスケールアップすることなく、より多くのストレージが必要になることがあります。DDSを使えば、実際のニーズに基づいて、よりパーソナライズされたプランを作成することができます。


プランのデフォルト容量の3倍の最大容量に達するまで、10GB単位でストレージを追加できます。そして何より、Aiven Consoleですぐに最終的な価格を直接確認することができます。


追加ストレージの価格は、増加したディスクサイズを処理するために必要な追加のバックアップストレージもカバーしています。


## AivenでDDSを始めよう


Dynamic Disk SizingはAiven Consoleで直接実装できます。調整したいサービスを見つけ、**Overview**タブで**Add Storage.**をクリックします。

![Adding storage](https://cdn.sanity.io/images/sczeoy4w/production/c79f85598955f82624c8802e6b66ee57ffecbceb-1018x165.png?q=80&fit=min&auto=format&dpr=1.5)


## まとめ


Aivenのサービスをまだご利用でない方は<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントをフォローし、製品や機能関連の最新情報をご確認ください。
【AWS re:Invent 2023 】朝5時に起きてヨガ体験してきた

# はじめに

re:Inventが本日から開催されています！
自身のスキルアップや、最新情報を入手できるだけでなくネットワーキングも活発に行われるre:Inventで、多くの参加者と交流し、日本に持ち帰れる多くの知見や経験を吸収したいとおもいます:sunglasses:

一部のセッションはオンラインでの視聴も可能です。詳細は公式サイトをご確認ください。

https://reinvent.awsevents.com/


# 朝から会場前には長蛇の列
5時に起きて、ホテルを出たのは5時45分ごろで、まだ薄暗い中を会場に向かいました。
街中にはあまり人がいませんが、すでにランニングをしている方々を多く見かけ、朝型の生活に羨望の眼差しを向けました:sleepy:

![e43b54e8-655f-ab43-dd9c-d80d963ae752.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/5a8ef057-2173-b5c9-421f-6279ed3c2e3c.jpeg)



ヨガセッションはWynnで朝6時半から開催されましたが、早朝だというのに開始時刻前にはすでに行列ができていました！私はほとんど通常の服装で参加したのですが、ヨガウェアを着ている参加者も多く見受けられました。

![e8059737-c162-5f4a-bf89-6e213a72d423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/1669a0ff-3244-3fa6-0c95-44a2de9d0991.png)



# 想像よりハードなヨガでしたが、朝からいい汗をかきました:sparkles:

会場内にはお水だけでなく、軽食としてフルーツも用意されていました:apple:
ヨガマットは配布され、各人ストレッチをしていよいよ始まります！

指導するインストラクターが2名、ポーズや呼吸のタイミングを教えてくださるインストラクターが1名で、お手本を見ながら、ヨガ初心者の私もなんとかついていくことができました！

リラックスできる呼吸を伴うヨガポーズだけでなく、少々ハードなポーズも多かったので、朝からしっかり汗をかけました！瞑想の時間には、心地よい音楽のもとで思考を手放し、頭をすっきりとさせることができたので、re:Inventの初日にふさわしいセッションでした:sunny:


# 最後に

ヨガマットは、専用のre:Inventロゴ入り袋に入れて持ち帰ることができました:balloon:
ヨガセッションは今日だけでしたが、明日以降もホテルの部屋でセルフヨガを楽しみたいと思います！

![5019dfb6-59ac-95bf-87c5-ccf1025a749c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/5a5b53e2-8063-18d9-b709-56bc62868901.jpeg)



# 弊社では一緒に働く仲間を募集中です！
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。
https://engineer.po-holdings.co.jp/
BUILD FAILED (macOS 13.5 on arm64 using ruby-build 20231114)

# 事象
- M2 Macで `rbenv install 3.2.2` が通らない

## 解決策
- .bashrcにhomebrewのpathを明示する
```bash
export PATH="/opt/homebrew/bin:$PATH"
```
- .bashrcでRUBY_CONFIGURE_OPTSを指定する
```bash
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
```

---

## 原因と流れ
### 原因1(homebrewのpath)
.bashrcの記載を変えた際に、homebrewのpathを消去してしまっていた

```bash
$ rbenv install 3.2.2
ruby-build: using openssl@3 from homebrew
==> Downloading ruby-3.2.2.tar.gz...
-> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19.5M  100 19.5M    0     0  9946k      0  0:00:02  0:00:02 --:--:-- 9963k
==> Installing ruby-3.2.2...
ruby-build: using readline from homebrew
ruby-build: using libyaml from homebrew
-> ./configure "--prefix=$HOME/.rbenv/versions/3.2.2" --with-openssl-dir=/usr/local/opt/openssl@3 --enable-shared --with-readline-dir=/usr/local/opt/readline --with-libyaml-dir=/usr/local/opt/libyaml
-> make -j 10

BUILD FAILED (macOS 13.5 on arm64 using ruby-build 20231114)
(省略)
```

詳細ログ
```bash
(省略)
ld: warning: search path '/opt/homebrew/opt/libffi/lib' not found
ld: warning: search path '/opt/homebrew/opt/libffi/lib' not found
(省略)
```
homebrewでインストールしたライブラリが見つからないことがわかる。

#### 解決策
```
export PATH="/opt/homebrew/bin:$PATH"
```
---

### 原因2(RUBY_CONFIGURE_OPTSの指定)
```bash
$ rbenv install 3.2.2
==> Downloading ruby-3.2.2.tar.gz...
-> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19.5M  100 19.5M    0     0   9.9M      0  0:00:01  0:00:01 --:--:-- 10.0M
==> Installing ruby-3.2.2...
ruby-build: using readline from homebrew
ruby-build: using libyaml from homebrew
-> ./configure "--prefix=$HOME/.rbenv/versions/3.2.2" --enable-shared --with-readline-dir=/opt/homebrew/opt/readline --with-libyaml-dir=/opt/homebrew/opt/libyaml --with-openssl-dir=/opt/homebrew/opt/openssl@1.1
-> make -j 10
-> make install
-> "$HOME/.rbenv/versions/3.2.2/bin/ruby" -e <SCRIPT>
Loading the Ruby openssl extension failed (cannot load such file -- openssl)
See the extension log at (省略)
ERROR: Ruby install aborted due to missing extensions

BUILD FAILED (macOS 13.5 on arm64 using ruby-build 20231114)
```

#### 解決策

`Loading the Ruby openssl extension failed`で検索してみると、下記の記事を見つけました。(ありがとうございます！！)

https://qiita.com/jnchito/items/c21390aaa87732d24c91

記事に記載されていた下記のコマンドを実行で、無事ruby 3.2.2のインストールに成功
```bash
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
```
Amazon EFS の料金ページを読んで勘違いした話

Amazon EFSのライフサイクル管理の機能を東京リージョンで使おうとした際に、AWSのPricingページを確認したところ下記の表記となっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8fea6cfa-345f-edd7-2f01-8a867cc78198.png)

2023年11月現在、ライフ細部管理を利用したファイルシステムの効果的なストレージ料金（一部リージョン）と記載されており。

この一覧の中にリージョンの中に東京リージョンは記載されていませんでした。

この一覧を見て、東京リージョン使えるはずだけど？　なんで記載がないんだ？

と疑問に思い調べました。

[Amazon EFS 低頻度アクセスの料金値下げで、ストレージ費用を最適化](https://aws.amazon.com/jp/blogs/news/optimize-storage-cost-with-reduced-pricing-for-amazon-efs-infrequent-access/)

リリース時のブログにも下記の記載がある通り、EFSが利用できる東京リージョンで対応しているはずだし。

>Amazon Elastic File System IA ライフサイクル管理は本日より、Elastic File System が提供されているすべてのリージョンで利用できます。

そもそも料金表にも低頻度アクセスの単価書いてあるし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5e0ea511-17f4-a5a6-890a-5890bb1527cd.png)

とここまで調べて気が付きました。

最初の画像は各リージョンの単価表ではなく、各リージョンで80%のデータを低頻度アクセスストレージクラスに保管している場合の月額を試算した結果でした。

なので、全リージョンの試算をしているわけではなく、特定リージョンの試算を試算結果を書いているだけで。

表題にも赤枠のようにちゃんと一部リージョンと書いてありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3d068bb7-d477-ca4e-b1e5-08021e036f5c.png)

## 総評

Pricingページにサービスが利用できるリージョンならば金額の記載がある前提で。

EFSのPricingページでは単価表ではなく、試算表の金額を記載している部分があり、それを何らかの単価表だと誤認。
試算表の東京リージョンの金額が表示されていなかったため、なにかサービスとして東京リージョンでは使えない部分がある？　といった勘違いをしてしてしまいました。

なので今回はただ東京リージョンの低頻度アクセスの試算がされていなかっただけの話。（よく読み込まずに試算表の金額を何かの単価表だと勘違いして読み飛ばしてしまった）

ドキュメント読むときは、思い込みだったり予測だったりで勘違いしないように、ちゃんと書いてあること読むように気を付けたいと感じた話でした。
【AWS re:Invent 2023 】認定者ラウンジに行ってみた。

# はじめに
2023年11月27日から AWS re:Invent 2023 が開催されました！
基調講演で未来の話を聞き、新サービスの発表、活用事例のセッションを聞き、自身のスキルを向上、ビジネスのヒントを得る貴重な機会と言えます:fist:

# re:Invent では1日3セッションが限界説
2000を超えるセッションを可能な限り聴講したい、と思ってもそのセッションが別のホテルの場合、シャトルバスなどの手段で長距離を移動する必要があり、聴講は1日3セッションが限界と言われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/8d273b6d-6453-955a-539f-7c15b33fd943.png)


移動する手段はあるものの、慣れない異国の地、かつ英語でのキャッチアップ、Game Day に参加して自分の出来なさっぷりに打ちひしがれた場合、認定者ラウンジに行くのがオススメです。


大丈夫です、少しくらいゆっくりしても学びの場はまだまだ続きます。


# 一息つくなら認定者ラウンジ（条件あり）
AWS認定資格（なんでもOK）を持っていることが条件になりますが、認定者ラウンジでは以下の設備、サービスを利用することができ、ゆっくり休めることが出来ます。

- 電源/テーブルを完備
- ドリングサービス
- 軽食（あると聞きましたが、私が行ったときにはまだ出てなかったです）
- 認定グッズの配布

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/a5ea025d-1a85-2aca-2c1f-e687cb1dc8b1.png)


こちらは丸いテーブルの上においたドリングサービスのコーヒーカップ。
会場の近くにスターバックスもありますが、無料で飲めるのはとても助かりますね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/9e3bbde9-33fa-b3ce-9714-1596a6db670c.png)


aws certified と描かれた長いテーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/dd37cc56-e663-668f-2ad0-aee0bfe54a10.png)



# みんな大好き認定グッズ
グッズをもらって気付いたのですが、AWS認定資格が今年で10周年のようです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/6ad5dc98-74a6-6185-c4c9-57257d98dcfc.png)


貰った認定グッズの全量はこちら。
各認定資格ごとに用意されたシールとレゴです。
個人的には子供のお土産にレゴが丁度良いかなーと思ってたりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822205/2c68957a-6115-619c-4e36-7b0ddaad3a9f.png)


# 最後に
AWS re:Invent は学びの場です。この貴重な場を活かすためにも、程よく休憩を挟みつつ、全力でキャッチアップしていきたいですね！
JavaScriptにおける2種類のインポートとエクスポート

# JavaScriptにおける2種類のインポートとエクスポート

JavaScriptのモジュールシステムは、コードを整理し、再利用性を高めるために重要です。モジュールシステムの中心的な概念は「エクスポート」と「インポート」です。これにより、異なるJavaScriptファイル間で関数、クラス、オブジェクトなどを共有することができます。ここでは、JavaScriptにおける2種類のエクスポートとインポート方法について説明します。

## エクスポートとインポートとは

JavaScriptでは、モジュールからコードを「エクスポート」して、別のモジュールでそのコードを「インポート」することができます。これにより、コードの再利用性が高まり、保守性や可読性が向上します。

### デフォルトエクスポート

#### 受け渡しファイル（エクスポート）
- **使用方法**: `export default <クラス名や変数名>;`
- **説明**: デフォルトエクスポートは、モジュールから単一の値をエクスポートする方法です。エクスポートする値が1つだけの場合に適しています。デフォルトエクスポートをどうファイル内で複数回行うことは出来ません。

#### 受け取りファイル（インポート）
- **使用方法**: `import <任意の名前> from "./<ファイル名>";`
- **説明**: インポート時にはエクスポートされた値に任意の名前を付けることができます。ファイル名は、エクスポートされたモジュールのパスです。

### 名前付きエクスポート

#### 受け渡しファイル（エクスポート）
- **使用方法**: `export { <クラス名や変数名> };`
- **説明**: 名前付きエクスポートは、モジュールから複数の値をエクスポートする場合に使用されます。各値はその名前でエクスポートされます。

#### 受け取りファイル（インポート）
- **使用方法**: `import { <同じ名前> } from "./<ファイル名>";`
- **説明**: インポートする際は、エクスポートされた名前と一致させる必要があります。カッコ内で複数の値を指定することができます。

## パッケージのインポート

JavaScriptでは、多くの便利な機能やツールがパッケージとして提供されています。これらのパッケージをプロジェクトに組み込むには、パッケージのインポートが必要です。

- **使用方法**: `import <パッケージ名> from "<パッケージ名>";`
- **説明**: インストールされたパッケージから特定の機能やクラスをインポートします。パッケージ名は、通常そのパッケージの名前です。

JavaScriptのエクスポートとインポートの概念を理解し、適切に使用することで、コードの再利用性と整理が大幅に向上します。これにより、大規模なプロジェクトでも効率的な開発が可能になります。
StepFunctionsから外部APIを叩く機能が追加されたので、Slackに投稿してみる

StepFunctionに嬉しいアップデートが来ました！
[External endpoints and testing of task states now available in AWS Step Functions](https://aws.amazon.com/jp/blogs/aws/external-endpoints-and-testing-of-task-states-now-available-in-aws-step-functions/)

- 外部APIを叩けるようになった
- ステート単体でのテストができるようになった

の二本立てですが、この記事では前者の外部APIを叩くというところを試しています。

外部APIを叩けるとなると、真っ先にやりたいのはSlackへの投稿と相場が決まっています。
これでSlackに投稿するためのLambdaを書かなくていい！！

## やってみた
StepFunctionsのコンソールから新しいステートマシンを作成します。
「http」でステートを検索してみると、「Call thir-party API」がありました。これです！
![スクリーンショット 2023-11-28 4.48.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/73259027-31ca-ccca-9fb7-2262cb3e5740.png)

このステートをドラッグして入れてあげて、状態名とSlackのWebhookURLを入力します。メソッドはPOSTです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/885d6fdb-0955-8b0e-1dcc-4628369cf495.png)

その下に、Authenticationの項目があります。
「その理由をご覧ください」のリンクをクリックすると、次のような画面が出てきます。どうやらEventBridgeの外部APIを叩く機能を呼び出すようですね。EventBridge側で認証等もやってくれると。
ということで、「EventBridge接続を作成」をクリックします。
![スクリーンショット 2023-11-28 4.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/ca4ce518-8b6c-806c-59e9-d33737061d90.png)

SlackのWebhookには特に認証はありませんが、何かしらの認証が求められるのでダミーの値を入れておきます。
ちなみに、送信先タイプに「パートナー」を指定するとSlackがありますが、これはSlack App用なので今回は使用しません。
![スクリーンショット 2023-11-28 4.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/c2b0ffd5-f963-070e-bf00-fbcf8b522cbd.png)

作成ボタンを押して、「接続ARN」をコピーします。
![スクリーンショット 2023-11-28 5.27.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/e6c3cd6a-8f8b-bd1d-123c-d8ba9ffcaef0.png)

StepFunctionsの画面に戻り、Authenticationの項目に接続ARNを設定します。
![スクリーンショット 2023-11-28 5.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/e2b193e5-b735-12ff-6d66-7d4468cf8ef1.png)

次に、WebhookURLに渡すRequestBodyを指定します。
今回は、入力から渡ってきたテキストを投稿するようにしています。投稿時の名前も上書きするようにしてみました。
入力を渡す項目のキーは、`text.$`のように、`.$`を付けることに注意してください。
![スクリーンショット 2023-11-28 5.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/18328258-15fe-0dcd-186d-de195ac63c25.png)

ステートマシンを保存します。特に指定しなければロールが自動で作成されるので、内容を確認します。
![スクリーンショット 2023-11-28 4.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/c97a6736-8adc-6d4a-ba8c-c66b79c32f54.png)

無事にステートマシンができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/1000285d-1474-0fc8-9349-bc8529361cc3.png)

「実行を開始」をクリックして、試しに動かしてみましょう。Slackに投稿するテキストを渡してあげます。
![スクリーンショット 2023-11-28 4.58.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/3fead7e3-8f5a-f0a3-c120-98481b322be0.png)

成功すればちゃんとSlackに投稿が来ているはずです。
![スクリーンショット 2023-11-28 4.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/5a095ea2-1302-10ff-1d70-7704fe633048.png)
![スクリーンショット 2023-11-28 5.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/4e4cabaf-02f3-e9c7-e5d6-687c68ed0de8.png)

## まとめ
StepFunctionsから外部APIが叩けるようになったということは、ステートマシンにさまざまなSaaSが組み込めるようになったということです。
今回はSlackを試しただけですが、まさに可能性は無限大！StepFunctionsがますます楽しくなりますね！
8ビットの除算器を作って遊ぶ。(小規模マイコンで除算器なし)

8ビットの除算器を作って遊ぶ。(小規模マイコンで除算器なし)

x 両方とも符合処理が抜けているから正の数限定(負の数は、なし)

目的
教育目的の完全な遊び
シフトして先に引くやつ
ARM M0/M0+など除算器なし
情報系の大学とかでハード概論で
ほぼほぼ最後に出てくるやつ
最後の最後は、64ビット
浮動小数点の除算
真面目にやると試験時間中に
解けないやつ


オンラインコンパイラ

https://paiza.io/ja

axは、アキュムレータ


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int ax;
    int bx; //割られる数
    int cx; //割る数
    int dx; //答え
    
    //bx=128;
    //cx=1;
    //dx=0;
    
    //bx=64;
    //cx=1;
    //dx=0;

    //bx=32;
    //cx=1;
    //dx=0;

    //bx=16;
    //cx=1;
    //dx=0;

    //bx=8;
    //cx=1;
    //dx=0;

    //bx=4;
    //cx=1;
    //dx=0;

    //bx=2;
    //cx=1;
    //dx=0;
    
    //bx=1;
    //cx=1;
    //dx=0;

    bx=192;
    cx=3;
    dx=0;
   
    
    ax=cx<<7;
    bx=bx-ax;
    if(bx >= 0){dx=dx|(1<<7);}else{bx=bx+ax;}
    
    ax=cx<<6;
    bx=bx-ax;
    if(bx >= 0){dx=dx|(1<<6);}else{bx=bx+ax;}
    
    ax=cx<<5;
    bx=bx-ax;
    if(bx >= 0){dx=dx|(1<<5);}else{bx=bx+ax;}
    
    ax=cx<<4;
    bx=bx-ax;
    if(bx >= 0){dx=dx|(1<<4);}else{bx=bx+ax;}
    
    ax=cx<<3;
    bx=bx-ax;
    if(bx >= 0){dx=dx|(1<<3);}else{bx=bx+ax;}
    
    ax=cx<<2;
    bx=bx-ax;
    if(bx >= 0){dx=dx|(1<<2);}else{bx=bx+ax;}
    
    ax=cx<<1;
    bx=bx-ax;
    if(bx >= 0){dx=dx|(1<<1);}else{bx=bx+ax;}
    
    ax=cx;
    bx=bx-ax;
    if(bx >= 0){dx=dx|1;}else{bx=bx+ax;}
    
    
    
    printf("ax=[%d]\n",ax);
    printf("bx=[%d]\n",bx);
    printf("cx=[%d]\n",cx);
    printf("dx=[%d]\n",dx);
    
    
    
}



```

結果


```

ax=[3]
bx=[0]
cx=[3]
dx=[64]


```
BigQueryアップデートのサクッと紹介 + 実用編（LLMを用いたテキスト分析）前編

# はじめに
こんにちは、しゃんはいと申します。
社内ではデータ関連の業務をやってます。

皆さんは BigQuery を使っていらっしゃいますか？
BigQueryは日々便利なエコシステムがアップデートされており、様々なデータの種類に対しての分析が簡単に実行できるようになってきました。

非常にアップデートも早くリリースを振り返れていないのが自分の中でもモヤモヤ。。。

そこで本記事の**前編ではBigQueryのアップデートをサクッとまとめ**ます。**後編ではBigQuery から LLM を利用してレビューの分析の実行**してみようと思います。
今回は前編の記事となります。


# TL;DR
- **BigQueryのアップデート（LLM関連）:前編**
- BigQueryからLLMを利用してレビューの分析：後編


# BigQueryのアップデート
最近のリリースノートから目ぼしい物をピックアップして紹介します。
（※本記事は2023/12/01時点のものとなります）
詳しい説明はあまりしませんが、情報をまとめています。


## 1. Vertex AI 大規模言語モデル（LLM） リモートモデル機能（GA）
BigQueryには**リモートモデルという機能**が提供されています。**リモートモデル**とは、Vertex AIで作成したモデルをBigQueryで利用するための機能となります。
こちらの機能がLLMモデルに対しても、一般提供（GA）となりました。

chatGPTを呼び出すUDFを作成してる人もいるのではないでしょうか？
この機能は**簡易なSQLのみでモデル作成や利用が可能なのがメリット**です。

▶︎ 詳細はこちらのドキュメントをご参照ください。
[The CREATE MODEL statement for remote models](https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-create-remote-model)


### その他テキスト操作の上で利用可能な関数
BigQueryでは便利な関数も提供されており、参考にしてみてください。

- [ML.TRANSLATE 関数](https://cloud.google.com/bigquery/docs/translate-text?hl=ja)
リモートモデルを利用してテキスト翻訳を行うことができる関数
- [ML.UNDERSTAND_TEXT 関数](https://cloud.google.com/bigquery/docs/understand-text?hl=ja)
リモートモデルを利用してテキスト理解を行うことができる関数
- [ML.GENERATE_TEXT_EMBEDDING 関数](https://cloud.google.com/bigquery/docs/generate-text-embedding?hl=ja)
リモートモデルを利用してをembedding行うことができる関数


## 2. マルチリンガルでのEmbedding生成
最近では検索分野でも有名になっているベクトル化の機能になります。

これまで提供されていた`textembedding-gecko`では英語だけの対応でした。
新たに提供されるモデルのバージョン`textembedding-gecko-multilingual`では日本語を含む多様な言語に対応可能となりました。

▶︎ 詳細はこちらのドキュメントをご参照ください。
[Language coverage for textembedding-gecko-multilingual models.](https://cloud.google.com/vertex-ai/docs/generative-ai/embeddings/get-text-embeddings?hl=ja#language_coverage_for_textembedding-gecko-multilingual_models)


## 3. BigQuery DataFrames
Python利用者の中には、BigQueryのデータをノートブック上でPandasライクに操作したい人がいるのではないでしょうか？
BigQuery DataFramesを利用すると、**BigQueryの多大な演算リソースを用いてPandasを利用**できます。


▶︎ 詳細はこちらのドキュメントをご参照ください。
[BigQuery DataFrames](https://cloud.google.com/python/docs/reference/bigframes/latest)

# 最後に
簡素ではありましたが、最近のBigQueryのリリースを中心に情報をまとめました。LLMが中心にはなりましたが、BigQueryでできることはどんどん増えています。これからも機能拡充に期待したいと思います。

もし、上記をもう少し理解したい＆興味がある方は以下の記事を参考にしてみてください。
- [Google Cloud、大規模言語モデルで NLP を強化](https://cloud.google.com/blog/ja/products/ai-machine-learning/google-cloud-supercharges-nlp-with-large-language-models)
- [Vertex AI Embeddings for Text で実現する LLM のグラウンディング](https://cloud.google.com/blog/ja/products/ai-machine-learning/how-to-use-grounding-for-your-llms-with-text-embeddings)
- [Google Cloud Next ‘23 で発表したこと全 161 件 – まとめ](https://cloud.google.com/blog/ja/topics/google-cloud-next/next-2023-wrap-up)
2023/11/28主にITとかセキュリティの記事

偽のブラウザアップデートをダウンロードさせるClearFakeキャンペーン、Mac版が登場(11/26)
https://www.zaikei.co.jp/article/20231126/747296.html

ハッカーはGmailを狙う、あなたのアカウントを保護する3つのステップ(11/26)
https://forbesjapan.com/articles/detail/67481

クラウド無料枠が尽きるまで不正利用する「フリージャッキング」の実態　200ドル近くを“食い逃げ”する例も(11/26)
https://news.yahoo.co.jp/articles/dea706b7deaa2f61974affd6baf71b3bd3086b40?source=rss

「サポート詐欺」に電話してみた　「自称」マイクロソフト社員、片言の日本語で電子マネー購入を要求(11/26)
https://news.yahoo.co.jp/articles/bb80b16ae2b3aeb50ccba5b804f2cf375f6aabb3?source=rss

偽の三菱UFJ銀行から「口座規制」と嘘つく詐欺SMSが着弾(11/26)
https://ascii.jp/elem/000/004/171/4171458/?rss

AWS CDK で S3 バケットポリシーによるアクセス制限を公開バケットに設定する場合は、aws_s3.BucketPolicy で明示的にバケットポリシーを作成しよう(11/25)
https://dev.classmethod.jp/articles/aws-cdk-s3-bucket-policy-for-access-control/

サイバー捜査、国際協力を加速　警察庁、ユーロポールと連携(11/26)
https://news.yahoo.co.jp/articles/950ba15ef5fbd614b29838514c0672fcb3bc649f?source=rss

今後のデータ貿易を左右する？IPEF閣僚会合で日本が世界に提唱した“DFFT”とは？(11/26)
https://news.yahoo.co.jp/articles/f80819c9b714c9067f1b968929219e7808f931f1

IPアドレスとポート番号(11/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/111600022/

車載RISC-Vマイコン開発に弾み、EDA・IP大手のSynopsysが24年にコア提供(11/27)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08651/

Armがマイコン向けコアの新製品、クルマや産業機器の推論性能をアップ(11/27)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08650/

ITパスポートが保有資格で3位に浮上、AWS認定各種資格の保有率がマイナスに転じる(11/27)
https://xtech.nikkei.com/atcl/nxt/column/18/02661/112100001/

テレワークは「オワコン」か、最新調査に見る働き方の今(11/27)
https://xtech.nikkei.com/atcl/nxt/column/18/02657/112100001/

事業モデル創出こそ商社の生業、双日はDXの先に「IX」を目指す(11/27)
https://xtech.nikkei.com/atcl/nxt/column/18/01159/111000050/

ETC利用照会に不正アクセス　メールの「＠より前」利用か(11/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/111600057/

技術者の仕事は「運用より開発が重要」だ、そんな当たり前が通らない日本のITの闇(11/27)
https://xtech.nikkei.com/atcl/nxt/column/18/00148/112200310/?i_cid=nbpnxt_ranking
isucon13 参加記（ポエムだよ）

# はじめに
isucon13に百万円ドリブンで出ました。

127149点で11位だったので、いい生活賞をもらえるみたいいです、ありがとうございます。

でも本当は百万円がほしいです。

百万円を手に入れるには、例のあのやばい1位のチームを超える必要があります。あのチームを超えるには人間の限界を超えないとだめです。もはや真っ当な戦略ではもう勝てません。

真っ当な戦略はもうみんな書いているし、勝つためには真っ当じゃない戦略を突き詰めたいので、今回はやった真っ当じゃない戦略を残しておきます。

# ChatGPTに書いてもらう

人間は雑魚なので、もう全部ChatGPTに書いてもらうといいです。
今回も実際 getUserStatisticsHandlerの　n+1問題をChatGPTに書いてもらいました。

```go
... 中略 ...
query := `
SELECT COUNT(*) FROM users u
INNER JOIN livestreams l ON l.user_id = u.id
INNER JOIN reactions r ON r.livestream_id = l.id
WHERE u.id = ?`
... 中略 ...
```

のN+1を直して！って頼んだら直してくれて、そのまま貼ったら通って点数が1.５倍くらいになりました。

最強のプロンプトエンジニアになってもっと複雑なN+1も全部ChatGPTに解消してもらえれば人間の壁を超えられると思います。


# Copilotに従う

今回弊チームでは ETagの仕様にミスって時間を無限に溶かしてしまいました。

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/ETag

具体的には
```
ETag: 33a64df551425fcc55e4d42a148795d9f25f89d4
```
と書いていて、ダブルクォーテーションが抜けていました。

これを解消する鍵はChatGPTに思えますが、ChatGPTにそのまま投げてもダブルクォーテーションが抜けていることを指摘できませんでした。

...検討の結果、Copilotに従ってコードを書いていればダブルクォーテーションがついたコードを書けていたことがわかりました。

もはや人間がコードを書くとミスるので、Copilotにひな形を作ってもらうほうがいいです。

# 他の嘘解法

```go
"SELECT * FROM reservation_slots WHERE start_at >= ? AND end_at <= ? FOR UPDATE"
```

reserveLivestreamHandlerのこれが遅くなった時、とてもトランザクションな回に見えますが、これの遅い理由は実は範囲検索なので

```
//   id   slot   start_at      end_at
//  ... 
// 8758 |    5 | 1732399200 | 1732402800
// 8759 |    5 | 1732402800 | 1732406400
```

ときれいになっていることを利用して、

```
id := 8759 + int((req.StartAt - 1732402800) / 3600)
// ... 
"SELECT slot FROM reservation_slots WHERE id = ? FOR UPDATE"
```

とするとSlowQueryLogから消えて点数が1.５倍くらいになりました。

こういう嘘解法を積み重ねていきましょう。

# さいごに

ほかの解法は全部真っ当なやつなので省略します。

実は今回は9割くらい真っ当にやりました。

エモ力が足りない。

かなしいね。

さいごに我らがういうれお先輩の言葉を貼って結びとします。

https://twitter.com/uiu______/status/1729001909250568348

おわり
レポジトリの複製方法

### 【概要】
---

gitHubのレポジトリを複製する方法です。

※備忘録代わりになります。

### 【環境】
---
・Github
・Git


### 【背景】
---
手順の前に標記の背景です。
今回は、作成した`docker環境`を綺麗のまま、検証用として実行し、使い回しできるようにできます。
また、自分の使用したい`docker環境`を他の人に展開して資料として残しておく意味でも使用できますので、ぜひご活用ください。

### 【追記】
---

2回目以降で使用する方向けです。詳細は、下記をご参照ください。

```terminal:ターミナル
mkdir copy_git
cd copy_git

git clone --mirror 複製元github_SSH .git
git remote set-url origin 複製先のGithub_SSH 

cd .git
git push --mirror 複製先のGithub_SSH 

cd ..
rm -rf copy_git
```

### 【手順】
---

今回`複製したい元ファイル`は、以下になります。

![スクリーンショット 2023-11-28 2.05.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538926/1858dc30-972e-8535-67ce-e2761f59e52b.png)

1.まずは、`複製先のレポジトリ`を作成しましょう。
今回は、`new-next.js`とレポジトリ名を命名します。

![スクリーンショット 2023-11-28 2.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538926/e82b4cd0-38cd-7674-4215-9c338729783c.png)

上記のように内容を打鍵したらスクロールし、`create repository`で作成します。

2.次に、複製したい元ファイルの内容を、`git clone`で落としてきましょう。

![スクリーンショット 2023-11-28 2.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538926/120d8b4b-7297-959a-4ac3-c56bb37bb92d.png)

今回は、フォルダを分けて管理します。

```terminal:ターミナル
mkdir copy_git  //フォルダ作成

cd copy_git     //フォルダ移動                                  

git clone --mirror git@github.com:iijima-naoya-45b/next.js.git .git
  ┗<git clone --mirror 複製元レポジトリ .git>
```

上記の解説です。

cloneする際に、`--mirror`オプションを指定することで、完全なリモートリポジトリのコピーが可能です。全てのリモートブランチやリモートタグがローカルにコピーされ、リモートリポジトリの全履歴が保持されます。また、`.git`を末尾につけるようにしてください。今回は、`.git`の変更履歴のみ複製先のレポジトリで使用します。(逆にその他ファイルは作成されません。)

3.

```terminal:ターミナル
git remote set-url origin git@github.com:iijima-naoya-45b/new-next.js.git 
  ┗<git remote set-url origin 複製先のレポジトリ>
```

`git remote set-url`については、リモートリポジトリのURLを変更するためのGitコマンドです。ここを、`複製先のレポジトリにしましょう。`紐付けを行います。

4.
```terminal:ターミナル
cd .git
git push --mirror git@github.com:iijima-naoya-45b/new-next.js.git
  ┗<git push --mirror 複製先のレポジトリ>
```

上記で複製先のリモートの状態がローカルと一致するようにpushを行います。


5.下記のように新しいレポジトリが作成できれば問題なしです！！

[![Image from Gyazo](https://i.gyazo.com/7e81b874dd41a16e527e3df3bdb4c693.gif)](https://gyazo.com/7e81b874dd41a16e527e3df3bdb4c693)

6.最後にゴミを削除しておきましょう

```
cd ..
rm -rf copy_git
```

### 【引用】
---
https://qiita.com/syuji-higa/items/e380289502c7896daf0f
【PyTorch】conv_transpose2dの設定

この記事は[京都大学人工知能研究会KaiRA Advent Calendar](https://qiita.com/advent-calendar/2023/kyoto-kaira) 5日目の記事です。

`conv2d`のカスタム関数を作成している時にbackward処理で`conv_transpose2d`をどう使えば良いか困ったので、`conv_transpose2d`の仕様を備忘録としてまとめます。

公式ドキュメントはこちら。

https://pytorch.org/docs/stable/generated/torch.nn.functional.conv_transpose2d.html

## 動作イメージ
[ConvTranspose2dのドキュメント](https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html#torch.nn.ConvTranspose2d)にも記載の通り、`conv_transpose2d`は`conv2d`の勾配計算に使えます。すなわち、`y = conv2d(x, w)`とした時に`x`の勾配は`conv_transpose2d(y.grad, w)`で計算できます。

`y = conv_transpose2d(x, w)`とした時の動作は以下のようになります。左側が`x`、真ん中が`w`、右側が`y`です。`x`の赤ピクセルに`w`の青ピクセルをかけた値が`y`の緑ピクセルに足されていきます。

<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629111/95282a09-eda2-b104-a537-2b0df1302545.gif">

以下設定パラメータについてまとめます。


## stride
出力先の座標を`stride`の数ずつスライドさせます。デフォルトでは`1`です。
`y = conv_transpose2d(x, w, stride=2)`とした時の動作は以下のようになります。

<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629111/55664220-185a-181f-8df1-f0323f585376.gif">


## padding
計算結果から、`padding`分だけ切り取られます。デフォルトでは`0`です。
`y = conv_transpose2d(x, w, stride=2, padding=1)`とした時の動作は以下のようになります。出力は中央の4ピクセルだけになります。

<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629111/1691c7f5-afcb-2fc2-becc-6c113fd16c37.png">


## output_padding
計算結果に対して、右側と下側にzero paddingを行います。デフォルトでは`0`です。
`y = conv_transpose2d(x, w, stride=2, output_padding=1)`とした時の動作は以下のようになります。`padding`も1以上に指定した場合は、output_paddingが先に適用されます。

<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629111/d7cf8db9-0a1a-a206-ccdc-fb75b0f0031c.png">

## dilation
出力先の座標が`dilation`飛ばしになります。デフォルトでは`1`です。
`y = conv_transpose2d(x, w, dilation=2)`とした時の動作は以下のようになります。

<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629111/1ce8f521-6e47-93f4-1d88-8dbb1fb21739.gif">

## conv2dとの対応
([ドキュメント](https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html#torch.nn.ConvTranspose2d)にも書いていることですが…)
冒頭にも述べた通り、`y = conv2d(x, w)`とした時に`conv_transpose2d(y.grad, w)`として`x`の勾配を計算できます。この時、`stride`、`padding`、`dilation`が両方で同じ値に設定されている必要があります。また、`conv2d`を計算する時に`stride`が1より大きい場合には端ピクセルが切り捨てられる場合があるため、そうした場合に勾配のサイズが合うように`output_padding`が設定されます。
Kinesis Lambdaにおける処理順序の保障

## Kinesisのシャード

Kinesis clientは挿入する各レコードに、partition keyを指定する。
Kinesisは、このpartition keyをハッシュ値を元に、どのシャードにレコードを入れるかを決定する。
シャード内では、レコードの読み取り順序が書き込み順序と同じになることが保証される。

## kinesis Lambdaの並行性について

Pararellizatino Factor は、1 Kinesis shardあたりにいくつのLambdaが張り付くかを意味する。
以下で設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/15a7467d-c883-bb22-418d-9854730ec8e3.png)


### デフォルトは、Parallelization Factor = 1

デフォルトで、1 Lambda per 1 Kineiss shard。
結果として、シャード内のレコードの処理順序は、書き込み時の順序と一致する。

### Parallelization Factor >= 2 を設定した場合

Parallelization Factorを増やすことで、１シャード内のイベントを複数のLambdaで並行に処理することができる。この場合のレコード処理順序は、同一partitiona key内でのみ保障される。




## Ref

https://aws.amazon.com/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/
歌舞伎の大向こうさんを機械学習でイメトレをしてみた

# 来たる日のために大向うさんの掛け声を練習する  
突然ですが、大向うさんをご存知でしょうか。
歌舞伎の上演中に[大向こう](https://www.kabuki-bito.jp/lets-kabuki/words/)という方が、絶妙なタイミングで演者に対して掛け声を掛けるのですが、それがまたとても良い声なのです。  
来たる日に備えて…というのは冗談として、日常で掛け声を格好良く掛けたい。ついでに掛け声かけたら返答して欲しい。
ということで、大向うさんの掛け声を練習したり、掛け声を掛けると反応してくれたりするwebアプリを作成してみました！

https://capable-pudding-98f1c7.netlify.app/

# 使い方
**アプリ名「大向こうさんのイメトレアプリ」**

https://x.com/mmmrym112/status/1729285534252670987?s=20

①「成駒屋！」の掛け声練習ができます。  
大向こうさんの掛け声に近いと褒めてくれます。

②「待ってました」と声を掛けると粋な返しをしてくれます。

# 作り方 
### 環境設定
CodePen（HTML/CSS/JavaScript）
Teachable Machine

### 使用ライブラリ, API
ml5.js
Web Speech API

### コード  
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExrpvVL" data-user="mmmrym" 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/mmmrym/pen/ExrpvVL">
  掛け声判定</a> by mmmrym (<a href="https://codepen.io/mmmrym">@mmmrym</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>  
  
  
①掛け声練習で使用したTeachable Machineのモデルは、[大向こうさんの成駒屋](https://park.org/Japan/Kabuki/japan/sound-j.html)と、自分で掛けた成駒屋、環境音の3クラスを学習させて作成しました。  
②掛け声を掛けてみるでは、「待ってました！」以外に「中村屋！」と言ってみてもよいかもしれません。

![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565590/4102eb8e-bce8-76b2-ef5e-f0ccadf0e79a.png)  


# 贔屓の屋号(音源)がなかった…  
知らんがなという感じでしょうが、次は中村屋で作りたいです。  
※平成中村座の小倉公演で成駒屋さんが活躍されているのを観たりして、成駒屋さんも好きです！  

# おわりに  
これでいつでも掛け声の練習と掛け声を掛けることができるようになりました。掛け声を練習するだけでは飽きてしまうので、返答してくれるのも良いですね。

# 反省点
①と②がどちらも音声入力で①が無限ループしているため、音声入力が被ってしまいました。。。。

①掛け声練習に作成したモデルは成駒屋(大向うさん)と成駒屋(私の掛け声)で学習したため、私が掛け声を掛けるとほぼ、まだまだ！と言われてしまいました。わざといつもと違う言い方で成駒屋と掛ければ良かったです。   
②掛け声を掛けてみると返答の声が機械音になっているので、残りは想像で舞台の雰囲気を賄うことになりました。返答の「待っていたとはありがてぇ」を録音し、その音源を再生するとしても良さそうです。
バルクインサートについて、そのメリット・デメリットを整理

:::note
**バルクインサートとは**
リレーショナルデータベース（RDB）のテーブルに行を追加する際、複数の行を一回のSQL文の実行で追加すること。INSERT文に複数行のデータを列挙する。
:::

### バルクインサートのメリット
##### 効率性
バルクインサートは、個別のインサートステートメントを使用するよりもはるかに高速。これは、大量のデータを扱う際に特に重要。

##### パフォーマンスの向上
一度に多くの行を挿入することで、データベースのトランザクションコストが削減される。これにより、特に大規模なデータ移行やバッチ処理においてパフォーマンスが向上する。

##### リソースの最適化
ネットワークラウンドトリップやディスクI/Oの回数が減るため、システムリソースをより効率的に使用できる。

##### 一貫性の維持
トランザクション内でバルクインサートを使用することで、データの一貫性を維持しやすくなる。すべてのデータが一度にコミットされるため、途中での失敗があった場合にロールバックが容易。



### バルクインサートのデメリット
##### メモリ使用量
バルクインサートでは、処理するデータ全体をメモリに保持する必要があるため、大量のデータを扱う場合はメモリ使用量が増加する。

##### ロックの問題
データベースによっては、バルクインサート中にテーブルや行に対する長時間のロックが発生することがあり、他のトランザクションのパフォーマンスに影響を与える可能性がある。

##### エラーハンドリングの複雑さ
大量のデータを一度に処理するため、エラーが発生した場合に問題の特定や修正が複雑になることがある。

##### トランザクションログの肥大化
一度に多くのデータを挿入すると、トランザクションログが大きくなることがあり、これがパフォーマンスの問題やディスクスペースの消費を引き起こす可能性がある。
Keycloakのカスタマイズ（Quarkus版）

# 記事の目的
* カスタマイズSPIの開発・デプロイ方法を把握できる
* 大体どういうカスタイマイズポイントがあり、OpenStandiaでのカスタマイズ事例を紹介してどういうことができるか把握できる（具体的な開発やサンプルの作成は別記事に任せる）

# 気をつけるポイント
* Quarkus版になって変わることを意識する過去記事から変わらない部分は流用する

# はじめに
Keycloakはアドオンで様々なカスタマイズを行うことができます。

2017年にKeycloakのカスタマイズ方法やカスタマイズポイントを紹介しましたが
KeycloakはJBossではなくQuarkusで動くようになり、OpenStandiaでは様々なカスタマイズ開発を行ってきました。

https://qiita.com/yoonis/items/298d580f7e93e56ddf6a#%E4%BB%8A%E6%97%A5%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8

本記事は、最新情報を元に過去と同様のコンセプトでQuarkus版Keycloakのカスタマイズ方法とカスタマイズポイントを紹介しています。

とはいえ変わらないことも多いので、過去からアップデートを...。

JBoss版からカスタマイズモジュールのデプロイ方法などは変わりましたが、カスタマイズ方法は本や公式ドキュメントなどで詳しく紹介されているためカ簡潔に留めます。
2023年版は、これまで実施してきたOpenStandiaでのカスタマイズ事例の紹介に重きを置いてみました。
＃偶に発生する要件に対応した事例も最後に紹介するので、同じ問題を抱えた人の一助になることも期待...。

カスタマイズを駆使することで、Keycloakでこんなことができるんだ！が伝わるといいな思って書いた記事です。

# カスタマイズ方法

# SPI


# リンク週
https://qiita.com/yoonis/items/298d580f7e93e56ddf6a

https://www.keycloak.org/docs/latest/server_development/#_themes
Happy Holidays 2023 from OpenChain Japan

# はじめに
こんにちは。今年から、OpenChain Japan Planning SWGのリーダーを務めております渡邊です。
**OpenChain Japan WGのアドベントカレンダー<font color="Red">2023</font>へようこそ！**
私たちOpenChain Japan WGは、OSS(Open Source Software)のコンプライアンスに関する活動をしている日本のコミュニティです。最近では、新しいトレンドであるSBOMやOSPOなどの新しいテーマにも、海外のチームと連携しながら積極的に取り組んでいます。
今年も、OSS界隈の最新情報と私たちの活動報告について、25日間にわたってお届けします。このアドベントカレンダーを通して、私たちの活動やOSSコンプライアンスの重要性に興味を持っていただき、参加したいなと思っていただけるようになれば幸いです。
# OpenChain Japan 全体会合
今年は数年ぶりとなるリアル開催の全体会合を再開し、活動を更にパワーアップさせることができました。今年開催した全体会合を振り返ってみましょう。
全体会合の資料や録画は[こちら](https://openchain-project.github.io/OpenChain-JWG/meeting-minutes.html)に纏まっていますので、興味のある方はアクセスしてみてください。

### 第26回全体会合(2023年2月9日)　＠日立ソリューションズ

3年ぶりに開催できたリアルでの全体会合では、「SPDX用拡張機能 on VSCode」の紹介、「プロセスマネジメント標準とISO/IEC 5230の適合」と「OSS教育の整備・全社展開」に関する2つの事例発表があり、再開にふさわしい充実した内容の会合となりました。

### 第27回全体会合(2023年5月18日)　＠NEC
OSS活用の参考情報として有用な情報を纏めて公開している活動である「OSS鳥観図活動」と「FAQ SWG活動」の紹介と、5月初旬にバンクーバーでおこなわれたOSS Summit North America参加メンバーからの「SBOMトピックス -SPDX v3.0最新情報-」の共有がありました。

### 第28回全体会合(2023年7月11日)　＠Ridgelinez(富士通)
第一部では「Open SSFの紹介」「教育SWGの新教育教材について」「OSSライセンススキルの人材育成」のテーマで、有識者からの詳しい発表がありました。第二部ではブレイクアウトセッションということで、参加者がテーマ毎の少人数のチームに分かれてディスカッションをおこないました。

### 第29回全体会合(2023年10月5日)　＠ソシオネクスト
本会合は、秋の京都という素晴らしいロケーションで2日間にわたって開催されました。一日目は、ソシオネクストさん・村田製作所さんによる取り組み事例の紹介、「SBOM関連の文書と組織の関係図」の発表のほか、SBOMに関するライトニングトークとして各社の取り組み状況がシェアされました。二日目は、Co-Located EventとしてAutomation&SBOM、OSPO、FAQの各SWGの会合がおこなわれ、普段とは異なるサブグループの活動を体験する良い機会になりました。

# おわりに
2024年も、全体会合を通じてコミュニティ活動を活性化させていきたいと思います。ご興味のある方は是非参加してくださいね。

# English Summary
OpenChain Japan WG is constantly hold all-member meetings every 3 month. Please refer to our [meeting logs and materials](https://openchain-project.github.io/OpenChain-JWG/meeting-minutes.html) on github. We are looking forward to you joining our next meeting!
新卒から2年間で監視・運用業務を行なったこと思うつぶやき


# はじめ　:pencil2:
本記事について、新卒から2年ほどNW監視・運用業務を行ってきました。
この記事はその２年間で行ってきたことについて、色々と感じたこと学んだことを記事にしています。



# 記者の業務内容について　:bulb:	
記者の業務内容は以下の通りです。
・監視業務
・運用業務
・受付業務
・他雑務
※基本的にはIT業務でよく言われる、下流工程と言われるものです



### 記者のスペックは？　:boy_tone1:
関西の大学21卒の文系であり、未経験でインフラ会社に就職した新参者の社畜エンジニアです。
大学卒業前はIT関連は未知の世界くらいわけ訳が分からなかった。
タイピングはデスノートのLなみに遅い。※1分間ではかったとき20文字だったかな？
なぜ意味がないWord2013　Excel2013取得した......
なぜかクラウドだけ触ったことあるが、NWやserverってなに？ってレベル。（プログラミング不可）

この記事の投稿時のスペックとしては、NWについてアソシエイトレベル程です。
NWやServer含め業務での構築経験はなし、プログラミングなどもできないです。


# ①日々の業務の中で感じたこと　:thought_balloon:
日々、上記のような業務をこなっていると感じることがあります。
それは、良くも悪くも「自分たちが、世間の人が業務を行えるように日々尽くしている」と思わされます。
これに対して、いろいろと思う人もいるとお思いますが、自分達が上記業務を行わなければ、現地ユーザ含め様々な人に影響がでます。
※監視・運用業務を行なっている身からすると、ある意味上からも下からも色々と言われるのが大変..... 　:sob:	
とても重要だとでありことから、「あたりまであり、その当たり前がとても重要」であるのがこの業務だと思っています。
<br>

また先輩エンジニアに聞く下記のようなことを聞きます。
　　「業務を経験を得て構築や要件定義などの上流工程ができる......」
ですが最近では、新卒から上流工程から入る会社も多くあり、下流工程などの業務はさらっと済ませて終わることが多いそうです。
（教育含めやらないこともあるらしく、羨ましい限り......）
なお、一部の人（上司や立場の偉い人等）は上流工程ができる人は、下流の業務をあまり知らない人もいるらしく。
様々な意味を含め話が通じない人も多々いるのが辛い 　:sob:

以上が感じることです。



# ②これまでの業務の中で学んだこと　:muscle:
上記の業務を行っている中で、下記のようなことを学びました。
・NWの知識が深まる
・WindowsPC知識が少ない人が多いので持っている知識が役にたつ
・自身のやる気のモチベーションが上がる、ないしは保てる
・業界別の情報が入る
・タイピング力が上がる
・仕事をこなす上での能力（対応力、主体性、チーム・リーダー力？）が身に付く
・社会人レベルが上がる
※伝える力の言語や非言語等のコミニュケーション力が上がる（個人的）
※文章を書く・考える力が上がる（個人的）

他にも挙げられますが、これらが大まかに学んだ項目になります。
一つずつ説明すると長くなりますので一部省きますが、2つ目と５つ目の項目だけ理由を書きます。
※2つ目と5つ目は意味がわからないかと思い記載します

<br>
2つ目に関しての理由は、Windowsの知識を持っていることで、周りの人が端末操作で困れば助けることができ、業務影響を回避できます。
同じ職場のメンバーは、NW知識はあるもののWindowsの知識は少ない人が多いです。
NWは当たり前ですが、Windowsに関する知識があるのは意外がられ、使用端末の調子が悪くなるとよくヘルプを求められます。
※主業務ではないため仕方ないことではあるかも......
その中でなぜWindowsの知識があるかというと、意欲的興味で勉強したり、以前にヘルプデスク業務を行っていたこともあり、知識があります。
そのことから、Windowsの知識を持っていると役に立ち、色々と周りに助けることができます。　:sob:	

<br>
<br>
5つ目に関しては、仕事のこなす上での能力として対応力や主体性はもちろん、チーム・リーダー力が身に付きます。
「対応力や主体性」に関しては説明は省きますが、「チーム・リーダー力」に対しては説明します。
どんな仕事でも言われることではありますが、監視・運用業務は特に一人ではできません。
逆に一人で業務を対応すると問題が発生する可能性があり、仮に問題が発生しなくとも、周りで一気に対応しないと終れません。
自分は現在リーダーなので、その日のメンバーと声を出し合って仕事をしないと、何をしているかが見えないため、それにより問題が発生することもあります。
また、メンバーに仕事を振り、困っている場合は助けたり、業務を巻き取ったりします。
このようなことを繰り返すことでチーム力が上がっていきます。　:triumph:	



# さいご　:pencil2:
最後に、日々の業務を行うことで感じたこと・学んだこと記載しましたが、これを見て違うと思う方もいるかと思います。
なので、あくまで個人的な意見であり、自身の感じとことであるため、感じ方や考え方は人それぞれです。
ですが、この記事を見ている人は恐らく新卒の方や未経験の転職を考えている社会人の方のだと思います。
（そうでない人も見てもらえれば嬉しいです）
この記事をみて少しでも参考になれば嬉しいです。
[構造バイオインフォマティクス] pymolでpi結合を考察する

# pymolでpi結合を調べる
創薬の研究において重要なのは薬剤（化合物）と標的（タンパク質）の相互作用です。
相互作用は、化合物とタンパク質の分子間結合を`Pymol`を用いて調べます。結合の種類として水酸基による水素結合といった極性結合や、二重結合同士のpi結合といった疎水性結合があり、前者はFreeのpymolに備えついてます。しかし後者はついておらず、手動でやる必要があります。しかも、結合の見方はネットであまり書かれてないです。
そこで本記事では、pi結合の自分なりの調べ方を紹介します。

# pi結合の定義って？
結合の定義は原子間距離や角度で定められていることが多いです。水素結合について[水素結合のパラメータの定義](https://qiita.com/hnishi/items/a96b346c6b9b928b5651)に判定基準が定義されていますが、pi結合に関しては明確な定義はありません。論文上のX線結晶構造などを参考にして、pi結合の原子間距離がいくらか見てみたところ、4~7Åがありました<sup>[1](https://pubmed.ncbi.nlm.nih.gov/34403732/)</sup>。大分幅があるようですね。

このようにpi結合の原子間距離の幅は大きいようです。おそらく水素結合に比べてpi結合は電子の非局在化範囲が大きく、軌道が重なりやすいためかなと考えられます。

そんなわけで、「原子間距離を測って4~7Åだったらpi結合の可能性あり」くらいには言えそうだと思いました。

# pi結合の距離を測ろう
さて実際にpi結合を調べ方を説明しましょう。よくあるpi結合はベンゼン環との結合ですね。
「どうやってベンゼン環中央と距離を測るんだろ？」となりますが、結論としては「ベンゼン環中央に便宜上の原子（pseudoatom）を置いてその原子との距離を測る」っといった操作を`Pymol`で行います。具体的な操作方法を見ていきましょう。


### pseudoatomをベンゼン環中央におく。
では実際に`Pymol`で距離をはかってみましょう。目標は画像のように見ることです。今回はPDB:1HPVを用いドメインBの46M（メチオニン）の硫黄に結合した水素原子と、53F（フェニルアラニン）のベンゼン環とのpi結合を調べます。目標は下のような画像を得ることです。
![image](https://www.pymolwiki.org/images/thumb/3/33/Pseu1.png/800px-Pseu1.png)


以下コマンドで取得します。
```
fetch 1hpv
```
取得したら、ドメインBの46M（メチオニン）と53F（フェニルアラニン）をlineで表示したら、写真のようにメニーバーで[Mouse-> 2 Buttom viewing]をクリックします。
![スクリーンショット 2023-11-28 0.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/d8b6f8f2-79a9-ad52-06a0-56259077ac89.png)

Mouseのモードを変更したら、ベンゼン環の対角線の炭素原子（パラ位）をクリックします。すると、原子にボールマークが付き、右のオブジェクトバーに`pk1`と`pk2`が出てきます。それぞれクリックした炭素原子を指します。
![スクリーンショット 2023-11-28 0.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/b433bb35-73be-c3b4-7d77-fef42d45ab9c.png)

ボールマークをつけたら、以下のコマンドを打ちます。
コマンドの意味は、「pk1とpk2の中点にpi_centerと名付けたpseudoatomをおく」です。成功すれば写真のように、右のオブジェクトバーに`pi_center`が出てきます。
```put_pseudoatom_at_pi_center
pseudoatom pi_center, pk1|pk2
```
![スクリーンショット 2023-11-28 0.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/b25afe1a-59c3-2740-3717-a0350ee4e480.png)

### 距離の計測
最後にpi_centerとメチオニンの硫黄に結合した原子の距離を測ります。メニューバーで[Mouse -> Select mode -> Atoms]を選択後、[Wizard -> Measurement]を選択します。距離を測る原子をクリックすれば、以下のように距離が表示されます。
![スクリーンショット 2023-11-28 0.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/64c1ba68-c1f3-5464-8b9d-aa9bfb02c434.png)

以上によって、pi結合を調べることができました。

# 終わりに
今回は原子間距離のみでpi結合を評価しました。ひとまず一つのやり方として紹介したいと思います。

不十分な点として、判定基準に原子間距離以外の要素は必要か、ということがあります。これに関してはわかり次第、記事を更新していきます。ありがとうございました！
あなたの作った画像アップローダー、投稿者の個人情報ダダ洩れだよ！

https://qiita.com/laineus/items/91101002201a67b38a68

---

# 自前のアップローダーで起きる問題

## 開発者 ――
インフルエンサーとファンをつなぐコミュニティサイト「Qitter」を作ったぞ！
テキストと画像をPOSTするだけのシステムだから、全部自前の実装で作っちゃったぞ。

![job_programmer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/c22ba9e5-5df0-8906-6dbf-ca44cccc30b2.png)

## 投稿者 ――
今日もQitterに投稿しなくちゃ！
「晩ご飯なう！」

![photo_jidori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/be600a9a-44fa-5be4-6d0b-353de9dec033.png)

## 閲覧者 ――
「推しちゃんの投稿ｷﾀｰ!」
「推しちゃんの投稿した画像は全部保存しちゃうぞ！」

![kanki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/3d9b1d12-74f5-e18d-81a6-a68e4b8f7c5a.png)

「ん…？」

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/73987aa8-eb7f-eb90-72f3-d24d8b94e5d9.png)

「撮影場所…、つまりこれは**推しちゃんの住所**では！？」

![pose_necchuu_smartphone_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/d4a9aae6-0adb-5cd0-2578-d1fb098b2621.png)

「………」

![pose_necchuu_smartphone_man2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151137/235d9702-660d-5567-05a2-8d06337a458b.png)

**そして炎上へ ――**

# 何故このようなことが起きるのか
**画像には、画像自体のデータ以外にも、テキスト情報を保持できる仕組みがあります。**
**有名なものだと、jpg形式におけるEXIF情報です。**

スマートフォンで撮影すると、位置情報（緯度経度）がEXIF情報に付与されたり、
一眼レフで撮影すると、カメラのメーカーや撮影時の設定がEXIF情報に付与されたり
Photoshopで加工して保存すると、ソフトの名称とバージョンがEXIF情報に付与されたり、
さまざまな情報がいつの間にかこの領域に保存されています。

**冒頭の例では、撮影時の緯度経度が付与された写真がアップロードされ、そのままWeb上で配信されてしまいました。**

# どのように対策するべきか
画像データからEXIF情報部分を削除することが可能です。

**冒頭の例のような事故が起こりうるWebサービスにおいては、画像アップロード時にシステム側でEXIF情報を削除するような処理を実装する必要があります。**

ちなみに、iPhoneでは画像アップロード時に緯度経度部分を自動で削除してくれる仕様があったりと、ユーザー側にも情報流出を防止する仕組みがあるようです。

# EXIF情報の削除方法

画像アップロード機能を実装する際、画像処理ライブラリを用いて、リサイズや圧縮をする場合も多いと思います。

そのように何かしらの加工を挟んでから保存している場合は、その工程の中で既にEXIF情報が削除されている場合があります。

そうでなかった場合、**画像処理ライブラリを使ってEXIF情報を明示的に削除**しましょう。

有名どころでは「[ImageMagick](https://imagemagick.org/)」というソフトウェアがあり、多くのサーバーサイド言語では、このソフトウェアをプログラムから操作するためのライブラリが存在します。

## 実装例（ImageMagick + PHP）

```php
$imagick = new Imagick('input.jpg'); // 読み込み
$imagick->stripImage(); // EXIF情報等のデータを削除
$imagick->writeImage('output.jpg'); // 保存
$imagick->destroy();
```

# pngだからって安心できない！

EXIFってjpgとかだけでしょ？という認識はちょっと危険かもしれません。

pngには、補助チャンクという保存領域が用意されています。
jpg形式の画像をpngに変換した際に、ご丁寧にEXIF情報をこのpngの補助チャンクに転記してくれる場合があるそうです。

さらに、2017年に追加されたpngの仕様にて、EXIF用のチャンク領域が追加されたようです。

https://note.com/walking_poppo/n/n29a20b82f1b8

そのため、「pngに変換して保存してるから大丈夫」とは言い切れないため、
pngを用いるケースでも情報が削除されているか確認したほうがよさそうです。

## おわりに

この問題って結構危ないことになりかねない割に、普通にプログラミングを勉強しているだけだと習う機会がない気がします。

少しでも周知につながれば幸いです。

---

https://qiita.com/laineus/items/a511b02c4e198d65c74a

https://qiita.com/laineus/items/995957422f32383da00b

https://qiita.com/laineus/items/9d7f0c45be94c35bb3a9
データのモデリング（設計・設定のイメージ）

「データソース」 〜 「データのモデリング」フェーズ の設計・設定のイメージです。

![データのモデリング_20231127-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626635/43d1f52d-8ebc-d256-8a43-338096dad483.jpeg "データのモデリング")

:::note info
Power BI作成の流れ（下図）の赤枠部分に対応しています。

![Power BI作成の流れ_20231113-01(データのモデリング).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626635/b0f513b5-f945-b7ec-67c8-5dec133163d8.jpeg "Power BI作成の流れ（データのモデリング）")
:::

https://qiita.com/NoriyukiT/items/5fb5e1c259c10900736d