OmniAICreator/Qiita-1.07M huggingface dataset:
llama-3-youko-8bは『雪国』の冒頭をどうトークナイズするのか

[rinna](https://rinna.co.jp)から「[llama-3-youko-8b](https://huggingface.co/rinna/llama-3-youko-8b)」という日本語モデルがリリースされたので、早速トークナイザを試してみることにした。

```
>>> from transformers import AutoTokenizer
>>> tkz=AutoTokenizer.from_pretrained("rinna/llama-3-youko-8b")
>>> print(tkz.convert_ids_to_tokens(tkz("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"]))
['åĽ½', 'å¢ĥ', 'ãģ®', 'éķ·', 'ãģĦ', 'ãĥĪ', 'ãĥ³ãĥ', 'į', 'ãĥ«', 'ãĤĴ', 'æĬľ', 'ãģĳ', 'ãĤĭãģ¨', 'éĽª', 'åĽ½', 'ãģ§ãģĤãģ£ãģŁ', 'ãĢĤ', 'å¤ľ', 'ãģ®', 'åºķ', 'ãģĮ', 'çĻ½', 'ãģıãģª', 'ãģ£ãģŁ', 'ãĢĤ']
```

うー、それは「[Meta-Llama-3-8B](https://huggingface.co/meta-llama/Meta-Llama-3-8B)」や「[suzume-llama-3-8B-japanese](https://huggingface.co/lightblue/suzume-llama-3-8B-japanese)」と全く同じパターン…

```
>>> text="国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。"
>>> x=tkz(text,return_offsets_mapping=True)
>>> for i,(s,e) in zip(x["input_ids"],x["offset_mapping"]):
...   print(text[s:e],text[s:e].encode("utf-8"),ascii(tkz.convert_ids_to_tokens(i)))
...
国 b'\xe5\x9b\xbd' '\xe5\u013d\xbd'
境 b'\xe5\xa2\x83' '\xe5\xa2\u0125'
の b'\xe3\x81\xae' '\xe3\u0123\xae'
長 b'\xe9\x95\xb7' '\xe9\u0137\xb7'
い b'\xe3\x81\x84' '\xe3\u0123\u0126'
ト b'\xe3\x83\x88' '\xe3\u0125\u012a'
ンネ b'\xe3\x83\xb3\xe3\x83\x8d' '\xe3\u0125\xb3\xe3\u0125'
ネ b'\xe3\x83\x8d' '\u012f'
ル b'\xe3\x83\xab' '\xe3\u0125\xab'
を b'\xe3\x82\x92' '\xe3\u0124\u0134'
抜 b'\xe6\x8a\x9c' '\xe6\u012c\u013e'
け b'\xe3\x81\x91' '\xe3\u0123\u0133'
ると b'\xe3\x82\x8b\xe3\x81\xa8' '\xe3\u0124\u012d\xe3\u0123\xa8'
雪 b'\xe9\x9b\xaa' '\xe9\u013d\xaa'
国 b'\xe5\x9b\xbd' '\xe5\u013d\xbd'
であった b'\xe3\x81\xa7\xe3\x81\x82\xe3\x81\xa3\xe3\x81\x9f' '\xe3\u0123\xa7\xe3\u0123\u0124\xe3\u0123\xa3\xe3\u0123\u0141'
。 b'\xe3\x80\x82' '\xe3\u0122\u0124'
夜 b'\xe5\xa4\x9c' '\xe5\xa4\u013e'
の b'\xe3\x81\xae' '\xe3\u0123\xae'
底 b'\xe5\xba\x95' '\xe5\xba\u0137'
が b'\xe3\x81\x8c' '\xe3\u0123\u012e'
白 b'\xe7\x99\xbd' '\xe7\u013b\xbd'
くな b'\xe3\x81\x8f\xe3\x81\xaa' '\xe3\u0123\u0131\xe3\u0123\xaa'
った b'\xe3\x81\xa3\xe3\x81\x9f' '\xe3\u0123\xa3\xe3\u0123\u0141'
。 b'\xe3\x80\x82' '\xe3\u0122\u0124'
```

やはり「トンネル」が3バイト・5バイト・1バイト・3バイトの4トークンにブッタ切られている。「抜」「け」「ると」とか「白」「くな」「った」とかも、そのままほったらかしで、日本語トークナイザとしてはヒドイ状態だ。これだと日本語の精度が上がらないと思うのだけど、実際のところ、どうなんだろう。
iPhoneの画面をubuntuに映しだす(画面共有　ミラーリング　UxPlay)

iPhoneやiPadの画面共有の設定を5分以内で行えたので備忘録のため投稿します。
なお、模倣する際は自己責任でお願いします。環境は以下の通りです。

【PC】
OS:UBUNTU LTS 24.04
CPU:i5-1135G7
ネットワーク:Wi-Fi6　WPA2　(5Ghz)　
メモリ:16GB
SSD:PCIe512GB
TPM:2.0
UEFI

【スマホ】
iPhone XR
OS:iOS 17.4.1
ネットワーク:上記と同様


【実行したこと】※OS起動~端末　の所作は省略します。

1.両端末とも同じWi-Fiに接続する。

2.sudo apt install uxplay　を実行する。

3.sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav　　を続けて実行する。

4.インストールした「UxPlay」を起動し、iPhoneと接続

5.これにて完了
Fly Postgres利用時にローカル環境でEcto経由でのPostgreSQLへの接続

Elixirでデータベース操作を行う場合には、[Ecto](https://hexdocs.pm/ecto/Ecto.html)を利用することが多いと思います。

その際に、Fly.ioの「[Fly Postgres](https://fly.io/docs/postgres/)」をデータベースとして利用している場合に、ローカル環境で動かす際にEctoの設定方法にちょっとハマったので、備忘のために対応方法を書き残しておきます。

## 前提

**Fly  Postgres**で、「**Fly Postgres Cluster**」を作成しているという前提とします。

公式ページの情報に従い、ここではクラスター名「**pg-test**」で作られたとする。

また、その際の設定は以下とします。

```sh
Postgres cluster pg-test created
  Username:    postgres
  Password:    45V1YkwVDUzbkHj
  Hostname:    pg-test.internal
  Flycast:     fdaa:2:45b:0:1::7
  Proxy port:  5432
  Postgres port:  5433
  Connection string: postgres://postgres:45V1YkwVDUzbkHj@pg-test.flycast:5432
```

https://fly.io/docs/postgres/getting-started/create-pg-cluster/

## Fly Postgresへの接続するためのポートフォワーディング

Fly Postgresクラスターは、Fly.io内のプライベートネットワーク以外からアクセスするには、以下の対応をする必要があります。

* 方法1: flyコマンドを経由して、ポートフォワーディングする
* 方法2: Fly Postgresクラスターのマシンに、外部アクセス用のIPアドレスを割り当てる

なお、方法2の場合には、IPアドレス割り当ての料金が発生します。

そこで、今回は、方法1の「flyコマンドを経由して、ポートフォワーディングする」で対応します。

### ポートフォワーディングの設定

Fly.ioの通信はすべて「**WireGuard**」を経由して行われます。（WireGuard自体の説明は割愛します）

ここで、ローカル環境では「`flyctl`（または`fly`）」コマンドを経由することで、WireGuardを意識せずに、ローカル環境からFly Postgresへの接続ができます。

今回は、`flyctl proxy`コマンドを利用することで、アプリケーションはポートフォワード元のアクセス先へつなぎ、ポートフォワードを通じて、Flyコマンド経由でFly Postgresに接続する形となります。

今回は、localhostの15432ポートを指定する形とします。

```sh
flyctl proxy 15432:5432 -a pg-test
```

成功すると、以下のようなメッセージが出てきます

```sh
Proxying local port 15432 to remote [pg-test.internal]:5432
```

## Ecto側での設定


今回の例は、Ecto単体で動かした場合を想定しています。
実行内容は、Ectoの「Getting Started」に準じます。

https://hexdocs.pm/ecto/getting-started.html

また、ここでは「Fly Postgres クラスター」への接続に関する部分のみを記載しています。

では、本題。

データベースに接続するための設定を`config/config.exs`に記載しますが、その際には、以下のように記述します。

```ex:config/confog.exs
import Config

config :friends, Friends.Repo,
  database: "friends",
  username: "postgres",
  password: "45V1YkwVDUzbkHj",
  hostname: "localhost",
  port: "15432"

config :friends, ecto_repos: [Friends.Repo]
```

または、以下のように記述します。

```ex:config/confog.exs
import Config

config :friends, Friends.Repo,
  url: "postgres://postgres:45V1YkwVDUzbkHj@localhost:15432/friends"

config :friends, ecto_repos: [Friends.Repo]
```

今回は、ポートフォワーディングをしているので、hostomaeはlocalhost、ポート番号は15432となります。
これらは別々に指定する必要があります。
自分は、hostnameについてポート番号まで指定してしまっていたので、接続できずに10分程度悩んでしまっていました。


Ectoでデータベース作成の際に、以下のようにコマンドを実行するのですが、その際に出来上がる`config/config.exs`のテンプレートには、localhostのみでportは用意されていなかったので追加する必要があります。

```sh
mix ecto.gen.repo -r Friends.Repo
```

最初にurlでやっておけばハマらなかったかもですね。
Nationalのツインパルックを分解してみた

## はじめに
こんにちは。bockringです。
先日家の電灯を蛍光灯タイプのツインパルック(National製・型番:HHFZ5250からLEDに換装(？)しました。

本体画像は…なくても皆さん予想はつくでしょう。普通のシーリングライトです(まさか写真を撮り忘れたなんて言えない)。

一応Panasonicさんの方で製品ページが引き継がれていたのでそこから写真を引用しておきます。
![IMG_1082.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/22629ddb-d927-e852-acb1-ef5abf4c9ee6.jpeg)


## いざ分解
とりあえず分解です。分解して、出てきた基板はこんな感じです。
![IMG_1074.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/a1357001-1585-5493-a368-d0e6bf53a074.jpeg)
ツインパルックのシーリング(カバー付き)を分解したことがある方ならおそらく見たことがあるように感じると思います。

裏面の部品についてはほとんど取っていない(というか力をかけすぎて失敗しました…w)ため、写真は撮っていません。ということでこの基板を今から供養(意味:部品取りにする)していきます。

## 供養開始
先ほども見た通り、大きな部品がかなり多い印象で、ジャンパも多い模様。数も多いのでほんの少しだけとはいえ、手が疲れそうですね。

ちなみに所有している半田関係だと、
半田ごて:goot PX-280
半田吸い取り機:ENGINEER SS-02
と、おそらくそこまで悪い物ではないはず(と思っています)。

ではここからは根性で外していきます。しかしまた使っている吸い取り機はバネが強いもんで…右利きなので左手の親指が痛くなります(笑)

作業シーンは「指が痛い！」しか考えていないので、写真なんてもの、撮るのを忘れていました(またかよ)。

それでは早速取り終わった後の基板をどうぞ。
![IMG_1076.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/a5d45022-89ef-429c-91a3-32c6caf5aec9.jpeg)
なんというか、壮観ですね。あんなにも色とりどりの基板だったのに、ここまで茶色になるとは。物事全て茶色なんですね(？)

もちろんここまで外したら部品はこんな感じです。
![IMG_1075.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/7031faf2-6d3d-1f1b-3b0d-a1a1f41a66ad.jpeg)
電解コンが1つだけ白いですが、それは製造工程でフィルムがけに失敗していたからですね。ビニテで包み直しました。途中で「あれ？+と-どっちだっけ？！」みたいになって大変でした…(笑)

1つだけ取るのに成功したMOSFETはこちら。
![IMG_1078.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/dd7383f1-4bf4-d3cf-a170-84011cdf3344.jpeg)
↑読みにくいですが、東芝セミコンのロゴがあります。

## すこし余談
先ほどの「1つだけ取るのに成功した」についてですが、「1つだけ」ということは…そうです残りの2つは失敗しました。すっかり取り方を忘れていて、力をかけて割っちゃいました…

でもその失敗した2つのうち1つは失敗とはちょっといいがたいもの。
それがこちら。
![IMG_1079.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/175cc48a-b56b-7191-e00f-7d3cbd8f7cb6.jpeg)
ちょっと暗いしピントも合っていませんね。もう1段階倍率を上げます。
![IMG_1080.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/cdda7df2-3917-dd0c-d5e0-13f4bc3089cf.jpeg)
半田を溶かしながら割ったのでちょっとはんだがのっていますが、これ、「MOSFETってこんな感じだよー」ってテキストとかで見そうな層になってるのが見れちゃいました。

そう、こんな感じの図。
![IMG_1081.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/4fc92bdc-1e54-2911-5957-ce543e1e2808.jpeg)
↑InfineonのPDFより。2024年5月3日閲覧。著者はピーター B. グリーンさんだそうです。2022年2月10日著。

色々編集していますがお気になさらず。少し分かりにくい図を引っ張って来てしまいましたが、なんか「言われてみたらそうかもー！」ってなりません？

ちなみに私の中での正しい取り方は
①両側の足に少しだけ多めに半田を盛る
②足が多く分かれている方の半田をよく温める(溶かす)
③すぐにもう片方の足の半田も溶かす
④溶けたらすぐにラジオペンチなどで足を浮かす
(・もし足と基板がまだ半田で繋がっていたら溶かして繋がっていない状態にすること。)
⑤部品をペンチ又はピンセットなどで支えながら残ったピンの方も半田を溶かして外す。
⑥ピンが曲がったら直す
これだけです。慣れたら簡単ですがこれを忘れて失敗…いや貴重なものが見れた気がするのでもうヨシとします！(笑)

:::note info
追記(2024/5/6):
半田ごてに取り付けているコテ先も成功のカギになります。
コテ先は無難にC型(又はBC型)でも良いですが、K型がおすすめです(D型でも表面積が大きければ可)。B型やI型、J型などは避けておきましょう。

おすすめコテ先(直径5mm・K型)
HAKKO(FX-600・FX-601・FX-600Dなどに適合):T18-K
goot(PX-280・PX-280Eのみに適合):PX-28RT-5K
:::


## おわりに
最後まで読んでいただきありがとうございました。色々ありましたが部品、回収できてよかったです。またこれからの記事で登場するかも？ということでまた次回の投稿で会いましょう。

それではまた〜
【セキュリティの基本】キルチェーンとは

こんにちは！！！



今日はセキュリティにおいて重要な考え方であるキルチェーンについて解説していきます。

キルチェーンとは
-----
まず、キルチェーンとは軍事用語の一つで攻撃の構造化に関係した用語です。


今回はそれのIT版である
サイバーキルチェーン
ユニファイドキルチェーン

について紹介しようと思います！

拙い文章ですが学習の助けになれば幸いです！



サイバーキルチェーン
----
攻撃の構造化に関する軍事用語がキルチェーンとお話ししましたが
その考え方をサイバーセキュリティに置き換えられないか？？という考え方から2009年に提唱されたのが『サイバーキルチェーン』という考え方です。
サイバーキルチェーンはまず標的型攻撃における攻撃の段階を8つに細分化しました。

・偵察（空いているポートの確認などの情報収集）
・武器化（脆弱性を突くためのマルウェアを開発）
・配送（出来上がったマルウェアを標的に渡す）
・攻撃（マルウェアが実行される）
・インストール（感染）
・遠隔操作（マルウェアによって作成されたバックドアなどを通してアカウントの権限昇格などを行う）
・目標達成（情報の奪取や重要ファイルの暗号化などの目標達成）

以上の8つですが覚えておいてほしいのはこの考え方はあくまで防衛側に対して作られたものであり攻撃時の参考にするようなものではありません。


さらに言うとサイバーキルチェーンは外部からの標的型攻撃に対して作られた考え方でありネットワークセキュリティやマルウェアに対して非常に有用ですが
内部に潜む脅威（倫理観の欠如した社員による情報漏洩）などにはまた個別で対策（ログ解析やEDRなど）を立てる必要があります。


サイバーキルチェーンを使った対策の立て方についてはネットに情報があるので興味あればググってみてください。


サイバーキルチェーンの課題
----
一番重要なこととして
攻撃者がこのチェーンに基づいて攻撃を組み立てているのではなく防衛側が攻撃に基づいてチェーンを組み立てているという面にあります。


なので防衛側が対策できない攻撃の起点だったりを使われてしまった場合は負けてしまうのです

例えば
キルチェーンに基づき対策をベンダと協議しました
→PCに対してテストを実行してもらい見つかった脆弱性にしっかり対策立てました！
→今回足がかりになったマシンはベンダとの契約範囲外でした。（契約範囲外への攻撃試行は違反になるため）
→負けです。
これが攻撃者有利だといわれる所以のように感じます。
セキュリティにおける課題でもありますね。

つづく、、、、



雑記
----
後半ではユニファイドキーチェーンについて書いていこうと思います。明日は飲み会だから明後日かな～？



そういえばISC2の提供しているCC模擬テスト受けたら79点でした。無料だし来月受けてみようかなｗ
基底とは

# 定義
線型空間$V$の有限個のベクトル$\boldsymbol{e}_1, \boldsymbol{e}_2, ... , \boldsymbol{e}_n$がつぎの二条件を充すとき、$\boldsymbol{e}_1, \boldsymbol{e}_2, ... , \boldsymbol{e}_n$は$V$の基底であると言う
- $e_1, e_2, ... , e_n$は線形独立である
- $V$の任意のベクトルは，$\boldsymbol{e}_1, \boldsymbol{e}_2, ... , \boldsymbol{e}_n$の線型結合として表される

（斎藤正彦：線型代数入門，東京大学出版会，1966．）

# 補足
線型空間$V$のベクトル$\boldsymbol{a}_1, \boldsymbol{a}_2, ... , \boldsymbol{a}_n$に対し、
- $ c_1\boldsymbol{a}_1 + c_2\boldsymbol{a}_2 +  ...  + c_n\boldsymbol{a}_n = \boldsymbol{0} $ ならば $ c_1 + c_2 + ... + c_n = 0$が成り立つ時、$\boldsymbol{a}_1, \boldsymbol{a}_2, ... , \boldsymbol{a}_n$は**線形独立**であると言う
- $ c_1\boldsymbol{a}_1 + c_2\boldsymbol{a}_2 +  ...  + c_n\boldsymbol{a}_n $ の形のベクトルを、$\boldsymbol{a}_1, \boldsymbol{a}_2, ... , \boldsymbol{a}_n$の**線型結合**と言う

線型空間（ベクトル空間）の定義は「数学の景色」による説明がわかりやすいです。
https://mathlandscape.com/vector-space/

# 参考文献

佐藤恒雄, 野澤宗平：初歩から学べる線形代数，培風館，2007．
Claude API入門

# Claude 3 APIを使ってPythonからClaude AIを呼び出して、面白いダジャレを自動生成しよう！

Claude 3 APIを使うと、PythonからClaude AIを簡単に呼び出すことができます。今回は、APIを使ってClaude AIに面白いダジャレを自動生成してもらうサンプルコードを紹介します。プログラミングの知識があまりない方でも、すぐに実装できるので、ぜひチャレンジしてみてください！

## 事前準備

まずは、`anthropic`パッケージをインストールします。

```
pip install anthropic
```

## コード例

以下は、Claude 3 APIを使ってClaude AIを呼び出し、面白いダジャレを自動生成するPythonコードの例です。

```python
import anthropic

client = anthropic.Anthropic(
    # デフォルトでは環境変数 "ANTHROPIC_API_KEY" から読み込まれます
    api_key="取得したAPIキー",
)

message = client.messages.create(
    model="claude-3-haiku-20240307",
    max_tokens=100,
    temperature=1,
    system="あなたは面白いダジャレを言えるユーモアに満ちたアシスタントです。これから単語を言うのでダジャレを3つ考えてください。",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "電話"
                }
            ]
        }
    ]
)

print(message.content[0].text)
```

## 使い方

1. `api_key`には、Anthropic社のWebサイトから取得したAPIキーを指定します。
2. `system`パラメータにはClaude AIに対するプロンプトを指定します。今回は、「あなたは面白いダジャレを言えるユーモアに満ちたアシスタントです。これから単語を言うのでダジャレを3つ考えてください。」というプロンプトを指定しています。
3. `messages`パラメータには、ユーザからの入力データを指定します。今回は、「電話」という単語を指定しています。

すると、以下のような出力例が表示されます。

> 電話にでんわ

## まとめ

Claude 3 APIを使えば、面白いダジャレを自動生成するプログラムが簡単に作れます。プロンプトを工夫すれば、もっと面白いダジャレが生成できるかもしれません。APIを活用して、あなただけのユニークなダジャレ生成プログラムを作ってみてください！
Docker入門


# Docker入門

Dockerを使ってHelloWorldを実行してみます。

## HelloWorldを実行してみます

DockerコンテナにはHelloWorldというコンテナがあるので、
次のコマンドを実行します。

>$ docker run hello-world

```Docker

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:a26bff933ddc26d5cdf7faa98b4ae1e3ec20c4985e6f87ac0973052224d24302
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

hello-worldコンテナを実行することができます。
メッセージにはコマンド実行後の説明が表示されています。

## 現在のイメージとコンテナを表示

>$ docker images

```
$ docker images
REPOSITORY                                TAG                                                                           IMAGE ID       CREATED         SIZE
hello-world                               latest                                                                        d2c94e258dcb   12 months ago   13.3kB
```

latestタグを持ったhello-worldイメージが確認できます。

## 起動中のコンテナを確認

>$ docker ps

```
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

何も表示されていないのは、hello-worldコンテナはメッセージ出力が終わるとコンテナが停止します。
なので、起動中のhello-worldはありません。

## 停止中のコンテナを確認する

>$ docker ps -a

```
$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
71f2f67ea17b   hello-world   "/hello"   4 minutes ago   Exited (0) 4 minutes ago             infallible_proskuriakova

```

停止中のコンテナの中にhello-worldのイメージが確認できます。

## コンテナを削除する

>$ docker rm [コンテナID]

```
$ docker rm 71f2f67ea17b
71f2f67ea17b
```

docker ps -a で記載のある CONTAINER IDを指定して削除をします。

## イメージを削除する

>$ docker rmi hello-world

```
$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:a26bff933ddc26d5cdf7faa98b4ae1e3ec20c4985e6f87ac0973052224d24302
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
Deleted: sha256:ac28800ec8bb38d5c35b49d45a6ac4777544941199075dff8c4eb63e093aa81e
```

最後にイメージを削除すれば跡形なくコンテナが消えてしまいます。
npm依存関係の競合エラーの解決方法

# はじめに
プロジェクト開発中に**npm install**コマンドを実行するとき、依存関係の競合によってエラーが発生することがあります。特に、異なるライブラリ間で同じ依存ライブラリのバージョンが一致しない場合、この問題が起こります。この記事では、npm依存関係の競合エラーが起きた際の解決策を説明します。

# 1. --legacy-peer-deps オプションを使用する
依存関係の競合が原因でインストールが阻まれる場合、**--legacy-peer-deps** オプションを使用してコマンドを実行します。これにより、npmは古い挙動に戻り、peer dependenciesの競合を無視してパッケージのインストールを試みます。以下のコマンドで実行できます。

```bash
npm i drizzle-orm @neondatabase/serverless --legacy-peer-deps
```
この方法は一時的な解決策であり、問題を根本から解決するためには他の手段を検討する必要があります。

# 2. 依存関係のバージョンを調整する
プロジェクトのpackage.jsonファイルを開き、使用しているパッケージのバージョンが互換性を持っているかどうかを確認します。必要に応じて、バージョンを上げたり下げたりして競合を解消することが重要です。これにより、より安定した開発環境を確保できます。

# 3. 別のパッケージを検討する
特定のパッケージが依存関係の問題を引き起こしている場合、代替のライブラリを検討することが有効です。時には、別のパッケージがより新しい依存関係や改善された機能を提供することもあります。

# 4. 環境を一時的に変更する
使用しているNode.jsやnpmのバージョンを変更することで問題が解消される場合があります。特に、古いプロジェクトに新しいライブラリを導入する際には、環境のバージョンを見直すことが役立ちます。

# 最後に
これらの手順を試しても問題が解決しない場合は、詳細なエラーログを確認し、問題の根本原因を特定することが重要です。正確な依存関係の設定を行い、安定した開発環境を維持することを心がけましょう。
Windows10からRaspberry PiへSSH接続

## はじめに
SSHサーバの機能はRaspberry Piにデフォルトで準備されているようですので、今回はクライアントPC（Windows10）からRaspberry PiにSSH接続してみます。

## 設定
まず事前にRaspberry PiのSSHサーバ機能を有効にします。以下のコマンドをLXTerminalに入力します。
`sudo raspi-config`

**8 Advanced Options -> A4 SSH**と選択し、SSHサーバ機能を有効化します。
![DSC01158.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/7ac54ef7-302f-856d-e82a-e0fbfb641795.jpeg)
![DSC01159.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/2707789c-b622-d240-d111-db9ee2f2a441.jpeg)

Raspberry Piを以下のコマンドで再起動し、
`sudo reboot`

Windows10から接続するためのRaspberry PiのIPアドレスを調べます。
`ifconfig`
![DSC01154.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/d6a4169e-794d-7c87-81fe-80b5b9999077.jpeg)

## Windows10からRaspberry Piへ接続
Windows10のTeratermを起動し、ホスト(T)に上記で調査したRaspberry PiのIPアドレスを入力しTCPポート:22 サービス:SSHでOKボタンを押下すると
![win10toraspi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750854/80c7c7a0-017b-b00a-dc9a-55fa4047dda4.png)
Raspberry Piに接続ができます。また、Teratermのファイルメニュー->SSH SCP...からファイル転送もできます！
Next.jsプロジェクトでコマンドを短縮する方法

# はじめに
**Next.js**で開発を行う際に、よく使うコマンドを短縮して効率的に作業を進めたいと思うことは多いですよね。**package.jsonのscripts**セクションを使えば、繰り返し使うコマンドを短縮して、簡単に実行できるように設定することができます。ここでは、その設定方法と例をご紹介します。

# package.jsonでのコマンド短縮の基本
package.jsonは、Node.jsプロジェクトの設定ファイルであり、プロジェクトの依存パッケージや実行スクリプトなどを定義できます。ここでコマンドを設定することで、長いコマンドを短いエイリアスで実行できるようになります。

# 設定手順
1．プロジェクトのルートにある**package.json**ファイルを開きます。
2．scriptsセクションを見つけます。このセクションがなければ、新しく追加します。
3．短縮したいコマンドをスクリプトとして追加します。
※ 例えば、データベース接続ツールであるdrizzle-kitのstudioコマンドをよく使用する場合、次のように書くことができます。

```json:package.json
"scripts": {
  "db:studio": "npx drizzle-kit studio"
}
```

# コマンドの実行方法
設定したエイリアスを使ってコマンドを実行するには、コマンドラインで以下のように入力します。

```bash:
npm run db:studio
```
これで、**npx drizzle-kit studio** を実行する代わりに **npm run db:studio** と入力するだけで済むようになります。

# まとめ
このように**package.json**の**scripts**を活用することで、コマンドを手動で入力する際の手間やタイプミスを減らすことができます。コマンドの管理を効率的に行い、開発の生産性を向上させましょう！
Kivyの日本語化

## 概要
Kivyは日本語対応していないため、日本語を使おうとすると文字化けする。
そのため、日本語フォントを追加し、日本語を使えるようにする必要がある。
※対応はプロジェクトごと

## 手順
1. Googleから日本語フォントをダウンロードする。
https://fonts.google.com/noto/specimen/Noto+Sans+JP
1. プロジェクト直下に「font」というフォルダを作成する。
1. 作成した「font」フォルダに日本語フォントファイルを格納する。
フォントファイルはttfファイルで、好みのフォントを選択する。
1. main.pyに日本語フォントを使用するように記載を追加する。
```py:main.py
from kivy.core.text import LabelBase, DEFAULT_FONT
from kivy.resources import resource_add_path
from kivy.utils import platform
import os

# フォントファイルを指定
font_path = os.path.join(os.path.dirname(__file__), "font", "NotoSansJP-Regular.ttf")
resource_add_path(os.path.dirname(font_path))
LabelBase.register(DEFAULT_FONT, font_path)
```
電子チケット 101 - 入場管理の仕組みと流れ

# PythonとQRコードを使った電子チケット入場管理
[トップページに戻る](https://qiita.com/xiaolinstechclub/items/5d1deb0816234dc278b7)

:::note info
Pythonの基礎文法を書けるのが前提となります。
Pyhonが書けない方はこちらの教材がおすすめです：
https://qiita.com/katsuki_ono/items/2dd1ff68dd4e740eb2ab
https://qiita.com/AI_Academy/items/b97b2178b4d10abe0adb （長め）
:::
### なぜPython?
電子チケットを作成して入場管理を行うには、様々なパッケージが公開されていて、誰にでも親しみやすいPythonが好ましい。Pythonは様々なパッケージを利用してウェブサイト作成や簡単なアプリ開発から、オリジナルのマクロを作成したりと使用用途は無限大である。そんななかで、今回はPythonのQRコードを作るパッケージを使用する。
:::note info
わからないことがあったらいつでもSlackやLineで聞いてね〜
:::


## 仕組み
QRコードチケットをつかった入場管理の流れは、こんな感じです：
__準備段階__
1. 一人一人のチケットにIDを振り、QRコード [^1] を作成する。
    >例：「J2D45番 中林 中太郎」という文字列をID化した文字列が書いてあるQRコードを作成。このQRコードを読むと、「2445」というIDがそのまま表示される。

[^1]: データを一瞬で読める画像に変換する技術

2. チケットのIDと、その人の関連情報をデータベース [^2] に保存する
		データベースの例：

    |名前|ID|入場状態（未/済）|
    |--|---|---|
    |J2D45番 中林 中太郎|2445|未|

3. 終わり

[^2]: テーブル式（行列）でデータを保存しておけるもの（ファイル）

__本番__
1. 提示されたQRコードを専用のQRコードリーダーで読む
	> QRコードリーダーは読んだ情報をパソコンにそのまんま「入力」します（キーボードみたいに）
2. リーダーが読んだ情報をデータベースと参照する
    > 名前ではなくIDで参照しよう
3. マッチしている「ID」の「入場状態」を「済」に変更する
    > このとき既に「済」となっていたらエラーとなる
4. 終わり

### 開発のステップ基礎

1.  __パーツ分け__：全体のシステムを「仕組み」単位に分割して、仕組みの中に必要なそれぞれのパーツとその役割を考える
2.  __関係性__：それぞれのパーツが互いにどう触れ合うかを図で書いて表す（可視化）
3.  __作成__：図に書いた通りに実装する


## まとめ
音楽祭や文化祭でしようする予定の、QRコードを使った電子チケットシステムの仕組みについて解説しました。興味がある方は、Pythonを使ったQRコードの作り方もチェックしてみてください。

[次のレッスンに進む](https://qiita.com/xiaolinstechclub/items/24a8bc099b8ef4ec73b6)
電子チケット 102 - QRコードメーカーを作る

# QRコードを印刷できる簡単なプログラムを作ってみよう！

[トップページに戻る](https://qiita.com/xiaolinstechclub/items/5d1deb0816234dc278b7)
[前回：QRコード電子チケットシステムの仕組み](./qrcode-101.md)

### 必要な物

* Python
* お好きなコードエディター（おすすめは[VS Code](https://code.visualstudio.com/)）

### 開発のステップ

「[開発のステップ](https://qiita.com/rum1324/private/7bd881dccea18cb6d53b#%E9%96%8B%E7%99%BA%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E5%9F%BA%E7%A4%8E)」に従って、どうやったら「QRコードメーカー」を作れるか考えよう！
1. パーツ分け
    「QRコードメーカーに必要な機能はなんだろう？」

    :::note info
    必要な機能とパーツをリストアップしてみよう！
    :::

    例は以下参照

    <details> <summary>（例）</summary>

    * QRコードに入れる情報をインプットする機能
    * QRコードを作成する機能
    * QRコードを指定した場所に保存する機能

    これらの機能をPythonで実装してみよう！
    </details>

1. 関係性
    入力　--データ-->　プログラム
1. 作図
    **QRコード作成プログラム**
    ![QRコード入場管理 - QRコード作成＿テスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1731035/8b191fc0-751e-2fef-d26e-c81877651141.jpeg)


### モジュールをインストール

QRコードを作成するには qrcode を使います。
`
pip install qrcode
`

## QRコードの生成

`python
img = qrcode.make("Hello World!")
img.save('test.png') #先にセーブ

img.show()
`
生成されたQRコードが正しいかどうかは、http://qrcode.red/ で確認できます。

## QRコードの生成（詳細設定）

詳細な設定を行うこともできます。
`python
import qrcode
from PIL import Image

qr = qrcode.QRCode(
    version=3,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=2,
)
qr.add_data('Hello World!')
qr.make(fit=True)

img = qr.make_image(fill_color="black", back_color="white").convert('L')
img.save('test.png')

img.show()
`
* version
    * セル数を決めるパラメータで、1から40の値に設定できます。
    * 1で21セルx21セル、2で25セルx25セル、40で177セルx177セルです
    * 以下参照
        * https://www.qrcode.com/about/version.html
* error_correction
    * 誤り訂正レベルで以下のパラメータから選択します
        * ERROR_CORRECT_L
            * 7％以下のエラーを修正
        * ERROR_CORRECT_M
            * 初期設定値
            * 15％以下のエラーを修正
        * ERROR_CORRECT_Q
            * 20％以下のエラーを修正
        * ERROR_CORRECT_H
            * 30％以下のエラーを修正
* box_size
    * ボックスのピクセル数
    * border
    * 境界線の太さ
    * 初期値4（最小設定値）

## UIを作成

`python
import qrcode

print("qrcodeを作成します。")
input_data = input("QRコードにいれるデータを入力してください： ")

qr = qrcode.QRCode(
    version=3
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=2,
)
qr.add_data(input_data)
qr.make(fit=True)

img = qr.make_image(fill_color="black", back_color="white").convert('L')
save_path = input("保存する名前を決めてください：　")
img.save(save_path + '.png')
print(f"'{save_path}.png'をセーブしました！)

img.show()
`print()`で情報を表示します。
`input()`でユーザーが入力したデータを`qrcode.png`というファイルで保存するプログラムを作成してみました！

## まとめ

PythonでQRコードを作る簡単なプログラムを作成してみました。
他にも自由にカスタムしてみてください。\
オススメの他記事：[PythonとOpenCVのみでカメラからQRコード読み取り](https://qiita.com/aquilaneo/items/d2fc3531357a6e6fb558)
日本語プログラミング言語Mind８で十進数計算（階乗計算）

##　階乗を計算
リカーシブコールと単なる繰り返し構文の2とおりで、100！を計算してみました。
```
※タイトル 多倍長整数や小数をｍｉｎｄ独自で定義し計算する。 
"lnum-sub01S"を　コンパイルする。  
"lnum-sub02S"を　コンパイルする。   
"lnum-sub03"を　コンパイルする。
階乗数は　Ｌ小数型Ｓ 長さ　300。
階乗とは　（整数　→　Ｌ整数）　※リカーシブコール
　		乗数Wは　変数
	乗数Wに　入れる
	乗数Wが　１と　等しい
		ならば　"１"を　　返し　終わり
		さもなければ
　　　　　　乗数Wから　一つ引いた　階乗を　
　			乗数Wを　Ｌ整数と整数の掛け算結果Ｓを　返す
		つぎに。

メインは　　　　　　　　（ ・ －－＞ ・ ）
	計時開始
	"100!="を　表示し　100の　階乗を　表示する　改行する
	経過時間を　文字列変換し　表示し　「ミリ秒経過」と　表示する 改行する
	
　　計時開始
	"1"を　階乗数に　入れる
	100　回数指定し
		階乗数と　回数を　Ｌ整数と整数の掛け算結果Ｓを　階乗数に　入れる
	繰り返す
	"100!="を　表示し　階乗数を　表示する　改行する
	経過時間を　文字列変換し　表示し　「ミリ秒経過」と　表示する。
```
### 実行結果
```
c:\mind8\pmind\sample>kaijo
100!=+93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
0ミリ秒経過
100!=+93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
15ミリ秒経過
```
なぜか、リカーシブが圧倒的に高速のようです。
シャオリン's  テッククラブ - 記事一覧

### 記事一覧表
| プロジェクト | ページ |
|:-:|:-:|
|電子チケット|[101：入場管理の仕組みと流れ](https://qiita.com/rum1324/private/7bd881dccea18cb6d53b)|
|電子チケット|[102練習：QRコードメーカーを作ってみよう！](https://qiita.com/rum1324/private/a307512f5546cf14b72f)|

## 最後に
Pythonをはじめとしたプログラミングや、テクノロジー系のプロジェクトに興味がある友達がいたら、どんどんテッククラブに誘ってください！
みんなで盛り上げていきましょう！
Python基礎 101 - 始めに

## 始めに

テックアカデミーのPython講習では、「読む・開発・聞く」という一連の流れを通してPythonの基礎スキルを身につけます。Qiitaを自習用教材として使い、週1の授業でわからないことややってみたいことについて講師に相談するという流れになります。

半年をかけて中級トピックにも触れていくので、ぜひ気合いを持って取り組んでください！\
一番大事になるのはわからないことや気になることをすぐにネットで調べたりする好奇心です！

### スケジュール予定表

5月〜8月：Python基礎\
9月〜12月：Python中級\
2025年以降 &#8594; 新規プロジェクト参加

## プログラミング / Pythonとはなにか？
シャオリン's  テッククラブ（XTC）では、プログラミングとは問題を解決するツールだと考えています。プログラミングを学ぶのは目標ではなく、やりたいことを成し遂げるための手段です。

具体的には、XTCではこのような問題解決に取り組んでいます：
1. 文化祭・音楽会での紙チケットの不便を解消 → 電子チケットを作成
2. プログラミングを学んでも実際に活かす機会が足りない → XTC創立
3. プログラミングに興味があるけど、続けられる自信がない → テックアカデミー作成

また、問題解決だけでなく、学校にエンターテイメントを届ける活動にも励んでいます。例えば、三田国際についてなんでも聞けるAIを自作してみたり、アンケートを元に三田国際適正診断を作成してみたり。最大限想像力を活かして面白いプロジェクトを作っていきましょう！

シャオリン's  テッククラブが現在採用しているプログラミング言語はPythonで、現在存在するプロジェクトの99%がPythonで書かれています。\
Pythonとは、プログラミング初心者におすすめされる言語の一つで、
- 簡単に始められる
- 幅広く使える
- 情報が豊富

という特徴があります。

#### コンパイル型言語 vs インタープリタ型言語
プログラミング言語が動作するのには、私たちが理解できる「プログラミング言語」からコンピュータが理解できる「マシン語（0と1で構成された言語、バイナリー言語とも言われる）」に翻訳する必要があります。プログラミング言語をマシン語に変換するプログラムを**コンパイラー**または**インタープリター**と言います。

それぞれの違い：

||<div style="width:290px">コンパイル型</div>|<div style="width:290px">インタープリタ型</div>|
|---|---|---|
|**特徴**|ソースコード全てをマシン語に翻訳してから実行|**実行しながら**マシン語に翻訳する|
|**実行スピード**|早い|遅い|
|**有名な言語**|C, Java, Go, Flutter|**Python**, JavaScript|

## Pythonの活用事例
Pythonは汎用性の高さで有名ですが、実際の活用事例を見てみましょう。

#### 1. YouTube

Pythonはウェブアプリ（ブラウザで動くアプリ）を作成することが出来ます。特に、世界中にユーザーがいるYoutubeは、常に動画がアップロードされる状況で、大容量の動画を処理するプラットフォーム開発に、Pythonが威力を発揮しています。

#### 2. Amazon


Amazonは、数多くの品目を管理しているため、変化していく情報を制御しつつ、拡張性があり、他のプログラミング言語とも連携しやすいPythonを積極的に使用しています。
また、Amazonには顧客が検索した情報などをもとにレコメンドを表示させる機能がありますが、機械学習に適しているPythonを使って、それぞれの顧客のニーズを分析し、購買意欲を高めるのに一役買っています。

#### 3. DropBox

オンラインストレージサービスを提供しているDropBoxも、Pythonを導入する企業の一つです。
現在提供されているDropBoxは、サービスを構成するプログラムすべてがPythonのコードで書かれています。
DropBoxは、2007年に創業のスタートアップ企業ですが、これほど多くのユーザーを持つ企業に成長した背景には、Pythonの利用が関係しているのかもしれません。

#### 4. DEVI

PythonはAIや機械学習に長けている言語なため、DEVIなどのオリジナルAIを作成することもできます。他にも、データやグラフを扱うのにも長けているため、データサイエンスなどの分野でも幅広く使われています。

#### 5. 電子チケットシステム

Pythonの汎用性の高さがわかる活用例の一つに、皆さんお馴染みQRコードを使った電子チケットシステムがあります。
  - チケットの発行・送信
  - ユーザー情報の管理
  - QRリーダーのPCアプリ
  - ウェブサーバー

などの全てがPythonを使用して作られています。


他にもPythonは**Netflix**や**Instagram**など、幅広い場面で使われています。


## 最後に
プログラミングを学ぶ上でわからないことは無限に出てきます。\
わからないことがあったら、**すぐ**にググりましょう。それでもわからなかったら、テッククラブの先輩などに聞いてみましょう。
**絶対に放置しないでください。**

以上、楽しみながら頑張りましょう！

[次のレッスンに進む](https://qiita.com/xiaolinstechclub/items/7d000c5134a2352ec29d)
Dell PowerEdge R620にUbuntu Server 22.04を入れたい

## はじめに
最近逸般の誤家庭を目指してヤフオクで落札したPowerEdge R620にUbuntuServerをインストールしようと思います。
結構古めの機体なので予想以上にセットアップに手間取ってしまいました、
エンタープライズ向けの製品ということもあり情報が少なかったので誰かの参考になれば幸いです。
スクリーンショットが撮れなかったのでわかりずらいと思いますがご容赦ください。

## インストールまでの流れ
1\. Boot Managerへ移動
2\. Lifecycle Controller(LCC)へ移動
3\. RAID設定
4\. インストールメディアからOSインストール

## Boot Managerへ移動
サーバの電源をオンにしてDELLのロゴが表示された際にF11を押してBoot Managerへ入ります。

## LCCへ移動
Launch Lifecycle Controlleを選択しLCCプログラムを起動します。
左側のタブからOS Deploymentを選択し、OS Deployを選択してRAID設定、OSインストールを行います。

## RAID設定
LCCからOSをインストールする際は、まずRAIDを構成しないとOSインストールできないためRAIDの設定を行います。
### RAIDレベルの設定
まずRAIDのレベルを設定します。設定で生きるRAIDレベルは以下の通りです。
1\. RAID 0
2\. RAID 1
3\. RAID 5
4\. RAID 6
5\. RAID 10
6\. RAID 50
7\. RAID 60

0～10までは知っていましたが50と60は初耳でした。
調べてみると2つ以上のRAID5またはRAID6のアレイをRAID0でストライピングアレイを構成するようです！
すごいディスクが必要になりそうですね、

今回は冗長性を持たせるためにRAID0を選択しました。

### 物理ディスクの選択
RAIDを組みたい物理ディスクを選択します。
プロトコル、メディアタイプ等は各自にあわせた設定をします。
今サーバにHDDが2つしか入っていないのでALL Selectを選択して次へ行きました。

### 仮想ディスク属性の設定
RAIDによって構成される仮想ディスクについての設定を行います。
仮想ディスク名やサイズを選択できますが、今回は仮想ディスク名だけ設定して他はデフォルトの構成で行いました。

### 概要確認
設定した仮想ディスクの内容が表示されます。
問題なければ次へ行きます。
この際、「新しい設定が適用されると選択したRAIDコントローラからすべての既存の仮想ディスクが削除される」と警告されますが問題なければyesを選択します。

## インストールメディアからOSインストール
ここまできてようやくOSのインストールを始められます。
### インストールするOSの選択
まず、インストールするOSを選択します。
Microsoft Windows Server 2012やRed Hat Enterprise Linux 6.4 x64等がありますがやはり10数年前のサーバということもあり古いですね^^;
今回はUbuntu Server 22.04をインストールするのでAny Other Operating Systemを選択します。

:::note warn
Ubuntu Server 22.04は導入できましたが24.04はインストーラーが仮想ディスクを認識できなかったためインストールできないようです。
:::

### インストールモードの選択
先ほど選択したOSによってUnattended installかManual installを選択できますが、Any Other Operating SystemではManual installしか選択できません。
こちらを選択します。

### OSメディアの挿入
OSのイメージファイルが入ったメディアをサーバに挿入してnextを選択します。
ここで問題が発生しました。
USBメモリにイメージファイルを入れてサーバに接続していたのですがLCCが認識してくれません。
フォーマットやコネクタの問題か、そもそもOSがサポート外なのか等いろいろ考えて2日が経過してしまいました。
途方に暮れていたら以下の記事を見つけました。

https://qiita.com/xxpisu/items/48c78222bde5ea8167ad

なんとUSBメモリではなくDVDディスクでないとOSがインストールできなかったそうです。
サーバの機種は違いますがこれの所為ではないかと考え早速AmazonでDVDメディアとドライブを購入しました(出費が(´;ω;｀))。
そしてDVDメディアを挿入するとちゃんと認識してくれました！
この後rebootしてUbuntu Serverのインストーラーが起動しました。

## まとめ
今回は初めてのラックマウントサーバのセットアップを行いました。
DVDメディアでないと認識してくれなかったり、OSのバージョンによってインストールできなかったりと行き詰ってばかりでしたが、やはりできた時の達成感はいいですね！
この記事が誰かの助けになれば嬉しいです。
建築構造力学用語をまとめていく


http://mechanics.civil.tohoku.ac.jp/bear/nisikozo.pdf


![IMG_5923.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/a910fca1-4491-c330-ec7e-97e0e7152cd9.jpeg)
はり、トラス、ラーメン構造
![IMG_5924.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/2266e3b0-a870-93ce-534e-6799af85168c.jpeg)
ローラー支点、ヒンジ支点、固定端


![IMG_5925.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/ea92ab2c-2cd9-ceb2-3595-845b0c801b8a.jpeg)
右から
集中荷重、モーメント荷重、分布荷重、等分布荷重、等辺分布荷重

![IMG_5926.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/47b316ce-28b6-7d5e-b3de-256008e031f9.jpeg)

自由物体図

![IMG_5927.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/e6ebbd3d-dbc0-88e1-ffda-6d8427bdb31b.jpeg)
たわみの微分方程式
曲げモーメントとらたわみ角とたわみ


![IMG_5928.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/3340dc56-5906-0444-58d0-a49e605e9002.jpeg)
片持ばり

![IMG_5929.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/0648ea91-3a61-47ad-3b7b-e81eba92c354.jpeg)
張出しはり(シーソー)と単純はり

輪軸、線断面図、曲げモーメント

![IMG_5930.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/bb9a7b74-ddce-e06e-df50-d6023a1462c2.jpeg)

せん断力 軸力

![IMG_5931.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/8cb5d74a-3c3d-2fa9-84d1-3126069eab5d.jpeg)
曲げモーメント せん断力 軸力
![IMG_5932.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/2f138487-aec8-10d0-e140-b0bb3022d77d.jpeg)


フックの法則とひずみ

https://archi2.ace.nitech.ac.jp/ichi2/rc/5/5-1/molu.html

モールの応力円


![IMG_5933.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/811f2137-d740-138a-be4b-f8d98b88dfdf.jpeg)
弾性荷重法

![IMG_5934.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/bf614028-e12a-00b5-2b1e-d8029d03b388.jpeg)

座屈の基礎式 座屈荷重
オイラー荷重

http://library.jsce.or.jp/jsce/open/00067/1982/1982-0008.pdf

セカント (Secant) 式
![IMG_5935.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/b883eb41-6b47-a906-f6b8-cfea715f42ba.jpeg)
移動荷重  影響線 連行荷重

![IMG_5936.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/3a8446a8-17fb-af7c-e66d-ced96ed901b2.jpeg)

不安定なはり 安定 静定ばり

http://www.akashi.ac.jp/miyoshi/str_eng/Theme04/%E8%A3%9C%E8%B6%B3%E8%B3%87%E6%96%991_3%E9%80%A3%E3%83%A2%E3%83%BC%E3%83%A1%E3%83%B3%E3%83%88%E6%B3%95.pdf

3連モーメント法

https://yomoriki.com/material-mechanics/28818/

ひずみエネルギー

http://crystallization.eng.niigata-u.ac.jp/%E6%9D%90%E6%96%99%E5%8A%9B%E5%AD%A6%E3%81%AE%E5%9F%BA%E7%A4%8E.pdf

応力



https://www.aiwachisho.co.jp/blog/building-structure/


木材 鉄筋コンクリート
【C#】MacOSでSharpAudioを使うとNullReferenceExceptionが発生するのを治す

C#でマルチプラットフォームに音声を再生するライブラリとしてSharpAudioというものがあります。

https://github.com/feliwir/SharpAudio

今回はこのライブラリをMacOSで動かそうとしてとても苦労したので、解決法を備忘録として雑に書きます。

# 環境
CPU Apple M3
MacOS 14.4.1

SharpAudio 1.0.65-beta
SharpAudio.ALBinding 1.0.65-beta

# バグ発生！

```csharp:Program.cs
    using SharpAudio;
    
    var engine = AudioEngine.CreateDefault();
    var buffer = engine.CreateBuffer();
    var source = engine.CreateSource();

    // Play a 1s long sound at 440hz
    AudioFormat format;
    format.BitsPerSample = 16;
    format.Channels = 1;
    format.SampleRate = 44100;
    float freq = 440.0f;
    var size = format.SampleRate;
    var samples = new short[size];

    for (int i = 0; i < size; i++)
    {
        samples[i] = (short)(32760 * Math.Sin((2 * Math.PI * freq) / size * i));
    }

    buffer.BufferData(samples, format);

    source.QueueBuffer(buffer);

    source.Play();
```

GitHubのreadmeにある例を動かそうとすると、4行目で
`Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.`
というようなエラーが出ます。

`var engine = AudioEngine.CreateDefault();`のところでAudioEngineのインスタンス生成がうまくいかず、次の行でNull～という状態です。

# 原因
OpenALのライブラリをSharpAudio.ALBindingが読み込むときにOpenALライブラリが見つからなかった場合、例外が出ずにそのまま進んでしまうようです。
```csharp:SharpAudio/src/SharpAudio.ALBinding/AlNative.cs
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
    names = new[]
    {
        "/usr/local/opt/openal-soft/lib/libopenal.dylib",
        "libopenal.dylib",
        "soft_oal.so"
    };
}
```
SharpAudio.ALBindingは、MacにOpenALがインストールされていればそれを、無ければ実行ファイルと同じ階層にあるダイナミックライブラリを参照するようです（最後の一個はよくわからない）。

# 解決？方法
おそらくOpenALをインストールすれば治りそうですが、私の環境ではどうしてもOpenALをインストールできなかったので、実行ファイルと同じフォルダにlibopenal.dylibを配置する作戦でいくことにしました。

libopenal.dylibは結構使われているようなのでそこからコピーしてきます。Minecraftとかに入ってるみたいですね。
私は以下リンクのファイルを改名して使いました。
https://github.com/MonoGame/MonoGame.Dependencies/blob/master/openal-soft/MacOS/Universal/libopenal.1.dylib

ただこれだとアプリを配布する際に同梱するわけにもいかないので、また考えないといけませんね。
ライセンスが許すならば自前でビルドして同梱したり、インストール時にビルドスクリプトを走らせるとかになるのでしょうか。

これでエラーが出ず、正常に再生されるようになりました。
5 benefits of softphone/ソフトフォンの 5 つのメリット

比類のない柔軟性: ソフトフォンは、マイクとスピーカーを備えたインターネット対応デバイスであればどこでも使用できます1。これにより、リモート作業とエージェントのモビリティが可能になります2。
費用対効果が高い: ソフトフォンは高価なハードウェアが不要なため、一般に従来の電話システムよりも安価です13。
コラボレーションの強化: ソフトフォンには、通話処理を改善し、コラボレーションを強化し、コミュニケーションを簡素化する機能が搭載されていることがよくあります。例としては、通話転送、CRM 統合、ビデオ会議、インスタント メッセージングなどがあります3。
追加のハードウェアは不要: 従来の電話とは異なり、ソフトフォンは物理デバイスではありません。これは、使い慣れた電話インターフェイスをデバイスに提供するソフトウェアです1。
簡単に拡張可能: ソフトフォンは簡単に拡張できるため、通信機能を迅速に調整する必要がある企業に最適です。
アジャイルソフトウェア開発においてドキュメント管理方法（インセプションデッキ）

## インセプションデッキの概要

インセプションデッキは、アジャイルソフトウェア開発においてプロジェクトの初期段階で作成される重要なドキュメントです。プロジェクトのビジョン、目的、ゴール、スコープ、リスクなどを明確にし、チームメンバーとステークホルダーの間で共有することを目的としています。インセプションデッキは、プロジェクトの企画およびプランニングに関する内容を網羅しており、チームの方向性を合わせるために欠かせません。

インセプションデッキは、プロジェクトの関係者全員が参加するワークショップを通じて作成されることが多く、チームメンバーだけでなく、ステークホルダーとのコミュニケーションツールとしても活用されます。

## インセプションデッキの構成要素

以下は、インセプションデッキに含まれる典型的な項目とその説明です。

| 項目 | 説明 |
|------|------|
| エレベーターピッチ | プロジェクトの概要を30秒から2分程度で簡潔に説明する文章。プロジェクトの価値や目的を明確に伝えます。 |
| プロジェクトのビジョン | プロジェクトが目指す将来の状態や、実現したい価値を明確にします。 |
| プロジェクトの目的 | プロジェクトが達成しようとしている具体的な目的を定義します。 |
| 対象ユーザーと利用シーン | プロダクトやサービスの対象となるユーザーや顧客を特定し、利用シーンを想定します。 |
| 実現するべき機能 | プロジェクトで実現するべき機能や要件を、優先順位付きで列挙します。 |
| 成功の定義 | プロジェクトの成功とは何かを定義し、成功基準を明確にします。 |
| スコープ | プロジェクトの範囲を定義し、実施事項と対象外事項（Out of Scope）を明確にします。 |
| やらないことリスト | プロジェクトで実施しない事項を明確にし、スコープを明確にします。 |
| 制約事項 | プロジェクトの制約事項（期間、予算、リソースなど）を特定し、対応策を検討します。 |
| リスクと対応策 | プロジェクトの潜在的なリスクを洗い出し、リスクの影響度と発生確率を評価した上で、対応策を検討します。 |
| チームの役割と責任 | プロジェクトに関わるチームメンバーの役割と責任を明確にし、意思決定プロセスを定めます。 |
| 開発プロセス | プロジェクトで採用する開発プロセスやアプローチを定義し、イテレーションの長さやスプリントの進め方を決定します。 |
| コミュニケーション方法 | チーム内および関係者とのコミュニケーション方法を定め、会議体や連絡手段を明確にします。 |
| パッケージデザイン | プロジェクトの成果物（ソフトウェア、ドキュメントなど）のパッケージ構成や提供方法を定義します。 |
| 概算見積もり | プロジェクトの規模や工数の概算見積もりを行い、リソース配分や期間設定の参考にします。 |
| 次のステップ | インセプションデッキの作成後、次に取り組むべきことを明確にし、優先順位をつけます。 |

## インセプションデッキの役割

1. チームとステークホルダーの価値観とゴールの共有: インセプションデッキは、プロジェクトの目的や価値観をチームメンバーとステークホルダーの間で共有し、一致させるための強力なツールです。
2. プロジェクトのスコープ管理: インセプションデッキは、プロジェクトの範囲を明確に定義し、スコープクリープを防ぐために役立ちます。
3. リスクマネジメント: インセプションデッキは、プロジェクトの潜在的なリスクを早期に特定し、対応策を検討するための基盤となります。
4. コミュニケーションの円滑化: インセプションデッキは、プロジェクトの関係者全員が理解できる形式で作成されるため、チーム内およびステークホルダーとのコミュニケーションを円滑にします。
5. 意思決定の迅速化: インセプションデッキは、プロジェクトの重要な意思決定を前倒しで行うことを可能にし、開発中の手戻りを減らすことができます。

インセプションデッキは、アジャイルソフトウェア開発において欠かせないドキュメントであり、プロジェクトの成功に大きく貢献します。インセプションデッキを適切に作成し、活用することで、チームはプロジェクトの全体像を共有し、効率的かつ効果的に開発を進めることができるでしょう。
Hatékony hírlevélírás

A hírlevélírás olyan művészet, amely segíthet abban, hogy kapcsolatot teremts az ügyfeleiddel és érdeklődőiddel, megtartsd őket tájékoztatva és elkötelezve tartsd őket a vállalkozásod iránt. Ahhoz azonban, hogy a hírleveled hatékony legyen, fontos, hogy figyelembe vedd az alábbi aranyszabályokat

Értékes Tartalom
A legfontosabb az, hogy a hírleveled tartalma értékes legyen az olvasóid számára. Nyújts hasznos információkat, tippeket, tanácsokat vagy exkluzív ajánlatokat, amelyek relevánsak és érdekesek lehetnek az olvasók számára.

Rövid és Velősen
Az olvasóid időértékes, ezért ügyelj rá, hogy a hírleveled rövid és tömör legyen. Koncentrálj az esszenciális információkra, és kerüld a felesleges hosszúságot és a túlzott részletezést.

Személyre Szabott Megközelítés
Próbáld meg személyre szabni a hírleveledet az olvasóid érdeklődési körének és viselkedésének megfelelően. Használj személyes köszöntést, és alkalmazd az olvasóid nevét a levelekben, hogy közelebb érezzék magukat hozzád.

Képek és Grafikák
Használj vonzó képeket és grafikákat a hírleveledben, hogy vizuálisan vonzóbbá és érdekesebbé tedd a tartalmat. Ügyelj azonban arra, hogy a képek ne legyenek túl nagyok, és hogy az olvasók számára könnyen betöltsék azokat az e-mail fiókban.

Hangsúlyos CTA-k
Helyezz hangsúlyt az olyan hívásokra a cselekvésre (CTA), mint például a vásárlás, a regisztráció vagy a további információk kérése. Győződj meg róla, hogy a CTA-k jól láthatók és könnyen elérhetők az olvasók számára.

Rendszeres és Konzisztens Küldés
Küldd el a hírleveledet rendszeresen, hogy az olvasóid megszokják és várnak rá. Ügyelj arra, hogy a küldéseid konzisztensek legyenek az időpontok és a tartalom tekintetében.

Mérés és Optimalizálás
Kövesd nyomon a hírleveled teljesítményét, és figyeld az olvasási arányokat, az elkötelezettségi mutatókat és az értékesítéseket. Használd ezeket az adatokat az optimalizáláshoz és a hírlevél stratégiád finomításához.

A hírlevélírás lehetővé teszi számodra, hogy közvetlen kapcsolatot teremts az olvasóiddal, és segítségével növelheted az elkötelezettségüket és a vásárlói konverziókat. 

https://pallascommunication.hu/hirlevel-iras/
リモートワーク＋時々出社のハイブリッドワークの働き方

## ハイブリッドワークの働き方
出社のみから、リモートワークだけを経て、
現在はハイブリッドワークという働き方に落ち着いて、
日々、会社で社内システムなどを開発・運用などして、エンジニアライフを過ごしています。

ハイブリッドで働くまでに、

```
出社のみ
　↓
リモートワークのみ
　↓
ハイブリッドワーク
```

を経てきたので、
この流れの中で感じたことなど、
この記事に書いていきたいと思います。

## 出社のみ→リモートワークのみに変化
元々、リモートワークにするように会社には相談していましたが、
コロナの影響を受けたタイミングを機に、
出社のみからリモートワークのみに変わりました。

出社のみの時は、やはり、設計・開発・運用をするにしても、
「通勤時間」という時間は、なかなか、その時間に充てることが難しかったなと思います。
出勤している間も、頭で考えることはできますが、
社内に設計内容を落とし込むときに、資料化する必要があり、
「通勤時間がなくなれば、その時間で、共有資料を作り終えるのに」
と思っていましたが、
やはり、リモートワークになることで、
この辺りの時間が取れるので、１週間あたりのアウトプットの量は確実に増えましたね。

## リモートワークのみ→ハイブリッドワークに変化
コロナも落ち着き、出社の再開の話が出たときに、
リモートワークでの生産性の向上などもあったので、
完全に出社のみという働き方に戻すのではなく、
リモートワーク＋出社というハイブリッドワークの働き方で、
リモートワークの生産性を活かしながら、
細かな部分の認識のずれをなくすためにこの働き方を取り入れました。

## 現在のハイブリッドワークの状況は？
現在は、週１を目安に社員は出社しています。
出社のタイミングで各部門の社員も出社しているので、
必要に応じて、直接、話したり、MTGしたりすることができます。
この出社のタイミングについては、
生産性の面でも、特に出社頻度を増やす必要はないかと感じています。

## 一緒に働いてもらえるメンバーを募集中です！
現在、私が働いている株式会社ウォーネクトでは、正社員となってもらえるエンジニアとデザイナーを募集しております。
本社は京都市の四条河原町あたりにあり、利便性も良いので、
近畿圏で週１、オフィスに通えそうな方がいらっしゃれば、
興味を持って頂けると嬉しいなと考えています。
もし、興味を持って頂けたら、
カジュアル面談等を行っていますので、
気軽にご連絡いただければ嬉しいです

### 採用ページ
正社員のエンジニア・デザイナーを募集中です！

https://recruit.wonect.jp/

### Wantedly
Wantedlyにも募集を掲載中です！

https://www.wantedly.com/projects/1659892

https://www.wantedly.com/projects/1689354


### メールでのご連絡先
カジュアル面談などのご相談も気軽にご連絡ください
h.ishimoto@wonect.com
ローカルのディレクトリをgithubのリポジトリに繋げる

## 概要
ローカルで開発しているディレクトリをgithub連携する。


## 手順
#### 1 githubで追加したいリポジトリを用意する

#### 2 連携したいローカルのディレクトリにリモートリポジトリを追加する。
・以下コマンドをローカル環境で実行する。
```git
git remote add origin <リポジトリのURL>
```
#### 3 ローカルのファイルをコミットする。

#### 4 pushする。
以下コマンドをローカル環境で実行する。
```git
git push --set-upstream origin master
```
javaのシングルトン（Singleton）パターン

## はじめに

シングルトンパターンは、あるクラスのインスタンスが1つだけ存在することを保証するデザインパターン。グローバルな状態を持つオブジェクトや、複数のインスタンスを持つことが望ましくない場合に使用。

## シングルトンパターンの概要

シングルトンパターンは以下の特徴を持つ。
- private なコンストラクタ: 外部からのインスタンス化を防ぐ。
- static なインスタンス変数: クラスの唯一のインスタンスを保持。
- static な getInstance メソッド: インスタンスを取得するための唯一の方法。

```mermaid
classDiagram
    class Singleton {
        -instance: Singleton
        -Singleton()
        +getInstance() Singleton
        +someMethod()
    }

    Singleton --> Singleton: Creates
```

## シングルトンパターンの利点

- グローバルなアクセスポイントを提供。
- インスタンスが1つだけ存在することを保証。

## サンプルコード (Java)

```java
//　シングルトンを実現するクラス
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

// 使用例
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
// singleton1 と singleton2 は同じインスタンスを参照
```

## 注意点

- マルチスレッド環境では、インスタンスの生成に関して注意が必要。スレッドセーフ処理からでないとシングルトンでも各々のスレッドでインスタンスが生成されてしまう。
- 依存関係が増えることで、ユニットテストが難しくなる可能性あり。
- グローバルな状態を持つことで、コードの結合度が高くなる可能性あり。
- 実質グローバル変数と同じようなものになってしまう。

## まとめ

シングルトンパターンは、クラスのインスタンスを1つだけ生成し、グローバルなアクセスポイントを提供するデザインパターン。適切な状況で使用することで、グローバルな状態の管理やリソースの制御が容易になる。ただし、マルチスレッド環境での使用や、テスト容易性、コードの結合度については注意が必要。

[他のデザインパターン一覧](https://qiita.com/gts/items/a5df06c243191a883381 "タイトル")
jaxの各ループ(fori_loop, while_loop, scan)の使い方

# はじめに
### jaxと、この記事の説明
- jaxは高速な並列計算が得意なpythonライブラリ
- jaxは<font color="#0072BC">**pythonの通常のfor文やwhile文を使わず**</font>、
**fori_loop, while_loop, scan**を使うことが推奨されている
  - XLAでのコンパイル時に、いい感じに最適化できて高速になるらしい
  - 中間状態の効率化が行われ、メモリ効率も良くなるらしい
- ここではこれらの使い方を紹介します

### なぜjax？
<font color="#a9a9a9">私は他人のソースコードが全部jaxで書いてあったので、仕方なく手を出している</font>

# fori_loopの使い方
基本的な使い方は次の通りである。for文を単に関数に押し込めたような形だ。
```python:fori_loopの使い方
import jax

def body_fun(i, val):
    return val + i  # i番目のループで構成した値を返却 → 次のループで使用されるvalとなる

# 最終ループで構成したvalがresultに格納される
result = jax.lax.fori_loop(
    0,        # i=0から始める
    10,       # i<10まで実行する
    body_fun, # for文の中で実行する関数
    0,        # 実行する関数に渡すvalの初期値
) 

print(result)  # 0 + 1 + 2 + ... + 9 = 45
```

[公式サイト](https://jax.readthedocs.io/en/latest/_autosummary/jax.lax.fori_loop.html#jax.lax.fori_loop)に書いてある動作の疑似コードは以下の通り:
> ```python
> def fori_loop(lower, upper, body_fun, init_val):
>     val = init_val
>     for i in range(lower, upper):
>         val = body_fun(i, val)
>     return val
> ```

# while_loopの使い方
基本的な使い方は次の通りである。while文を単に関数に押し込めたような形だ。
```python:while_loopの使い方
import jax

def condition_fun(val):
    return val < 10 # whileの繰り返し条件の評価値を返却する

def body_fun(val):
    return val + 1 # このループで構成した値を返却 → 次のループで使用されるvalとなる

# 最終ループで構成したvalがresultに格納される
result = jax.lax.while_loop(
    condition_fun, # 繰り返し条件をvalから判定する関数
    body_fun,      # while文の中で実行する関数
    0,             # 実行する関数に渡すvalの初期値
)

print(result)  # 1 + 1 + 1 ... + 1 = 10 (10未満のとき1ずつ加算した結果)
```

[公式サイト](https://jax.readthedocs.io/en/latest/_autosummary/jax.lax.while_loop.html#jax.lax.while_loop)に書いてある動作の疑似コードは以下の通り:
> ```python
> def while_loop(cond_fun, body_fun, init_val):
>     val = init_val
>     while cond_fun(val):
>         val = body_fun(val)
>     return val
> ```

# scanの使い方
リストから1つずつ取り出して処理して、結果のリストにappendするような操作はよくすると思う。つまり次のような処理だ:
```python
ys = []
for x_i in xs:
   y_i = func(x_i)
   ys.append(y_i)

# ys = [func(x_i) for x_i in xs] というリスト内包記法と同じ処理
```

この操作をまとめたのがscanだ。
基本的な使い方は次の通りで、body_funの構成がfori_loopやwhile_loopと比べて少し複雑になる。
```python:scanの使い方
import jax
import jax.numpy as jnp

def body_fun(val, x):
    return val + x, val + x  # (次のvalの値, appendする出力)

# 最終ループで構成したvalと、構成したリストysが返却される
final_val, ys = jax.lax.scan(
    body_fun,      # ループの中で実行する関数
    0,             # 実行する関数に渡すvalの初期値
    jnp.arange(5), # [0, 1, 2, 3, 4]; 1つずつ処理するデータx
)

print(final_val)  # 10 (0 + 1 + 2 + 3 + 4)
print(ys)  # [0, 1, 3, 6, 10]; 累積値
```

[公式サイト](https://jax.readthedocs.io/en/latest/_autosummary/jax.lax.scan.html#jax.lax.scan)に書いてある動作の疑似コードは以下の通り:
> ```python
> def scan(f, init, xs, length=None):
>     if xs is None:
>         xs = [None] * length
>     carry = init
>     ys = []
>     for x in xs:
>         carry, y = f(carry, x)
>         ys.append(y)
>     return carry, np.stack(ys)
> ```


# おわりに
- 最初慣れるのは大変だが、そんなに難しくもない
- if文も使うべきではなく、jax.lax.condやjnp.whereを使えと言われている（そのうち記事書くかも）
[Answer Blog] AZ-104 合格体験記

# はじめに
お久しぶりです。。。暫く Qiita 開けない状況が続いておりました。
今回は以下のアンサーブログということで、合格体験記です！
これまた世にありふれているのは承知の上でございます。

https://qiita.com/SobaNyaku/items/7a221f0ccda49f0e760f

# 前提
以下は持っています。
* SAA ([AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/))
* SAP ([AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/))
* Azure Fundamentals ([AZ-900](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-900/))


# AZ-104とは
詳細は飛ばします。ありふれているので。一応リンクだけ載せておきます。

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-administrator/?practice-assessment-type=certification

受かると `Azure Administrator Associate` の認定資格を得ることができます。
※ 認定資格と認定試験(今回の場合は AZ-104) があって、認定試験に合格すると認定資格が得られるようです
※ ほとんど 1 対 1 で対応してますが、複数試験に合格しないと認定されない資格もあります


# 対策

* LinkedIn Learning
以下を見ました。少し高いですが。
2倍速でも聞き取りやすく、2 時間弱で視聴することができるため、おすすめです。

https://jp.linkedin.com/learning/exam-prep-microsoft-azure-administrator-az-104

* Udemy
安い時に買えば値段は高くないですが、時間は長いです。その分内容はあります。

https://www.udemy.com/course/az-104-microsoft-azure-administrator-jp/?couponCode=JUST4U02223

* プラクティス評価
いわゆる模擬試験があります。無料なので絶対受けておくべきです。

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-administrator/practice/assessment?assessment-type=practice&assessmentId=21&practice-assessment-type=certification

* ~~Learn の AZ-104 試験準備ビデオを視聴する~~
不合格体験記に書いたビデオを見ようとしたのですが、英語で挫折しました。

https://learn.microsoft.com/ja-jp/shows/exam-readiness-zone/preparing-for-az-104-manage-azure-identities-and-governance-1-of-5

# 感想
正直、難しかったです。結構細かいこと聞かれるので、感覚的には AWS 試験より辛かったです。 AWS 試験は時間との勝負なところがあるのでまた違った辛さがありましたが。

次は AZ-305 を挑戦しようとしてましたが、作戦変更します。
この感じだと AZ-305 受からないのでもう少しスキル磨こうと思います。。。

# 次の資格
AI-900 -> AZ-700 -> DP-900 -> AZ-305 -> かなぁ。

おすすめの進め方あったら教えてください。
また合格したら体験記書きます。早く体験記の需要がある試験に受かりたい！

# おわりに
最後まで見ていただき、ありがとうございます。
よかったらチャンネル登録（フォロー）、高評価（いいね:heart_decoration:）、コメント:pen_fountain:などなど何でもお願いします:pray:

週一で投稿目指しています。もし何かリアクションをしてくれるとやる気が出るので、次週は投稿することを約束します。(小声)

このブログで 半年継続バッジ貰えた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659255/4eb5c3d1-d19a-85f8-5270-e4b062b31c03.png)
DP-420学習メモ

## はじめに
DP-420を取得したので、復習がてら記事作成。
DP-420はCosmos DB特化試験。NoSQLデータベースの知識は前提として必要。
変更フィードなどはAZ-204と範囲が一部被っているので割愛。

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-cosmos-db-developer-specialty/?practice-assessment-type=certification#certification-practice-for-the-exam

## 論理パーティション
データベース内のコンテナ内の項目を分割したサブセット=論理パーティション

論理パーティションに関連付けられているキー=パーティションキー
論理パーティション内で一意のキー=項目ID

https://learn.microsoft.com/ja-jp/azure/cosmos-db/index-overview

論理パーティション数に制限は無いが、各論理パーティション内に格納できるデータは最大20GB。論理パーティションがトランザクションのスコープになるので、パーティションキー戦略はクエリパフォーマンス向上に重要。

## 物理パーティション
1つ以上の論理パーティションが物理パーティションにマップされる。
内部的には物理パーティション間でデータとスループットを分散する。物理パーティションはCosmos DB側で管理されるので、パーティション設計の際は論理パーティション間でクエリが偏らないようにパーティションキーを設計する。(それが物理パーティション間での分散にも繋がる)

## インパーティションクエリ・クロスパーティションクエリ
クエリ実行の際、WHERE句にパーティションキーを含んだ等値フィルターを指定すると、クエリを対応する物理パーティションにルーティングする(インパーティションクエリ)ことができる。

例えば`StudentID`がパーティションキーだとしたら、以下のようにするとインパーティションクエリになる。
```SQL
SELECT * FROM c WHERE c.StudentID = '123456'
```

逆に範囲フィルター(例えば`c.StudentID > '123456'`)を使ったりパーティションキー以外のキーでフィルターをすると、全ての物理パーティションのインデックスに対してクエリが実行される(クロスパーティションクエリ)。
物理パーティションが複数あるような大きなコンテナであれば、クロスパーティションクエリが少なくなるようなパーティション設計にするとパフォーマンス向上が見込める。

Cosmos DBの操作にかかるコストは要求ユニット(RU)で表される(後述)が、RUの消費量を論理パーティション間で均等になるようなパーティション設計が重要。
ワークロードのほとんどがクエリであれば、クエリの等値フィルタで使われるプロパティをパーティションキーに設定するとクロスパーティションクエリの数を抑えることができる。

## スループット

スループットは、サーバレス、手動、自動スケーリングから選択できる。
ざっくりとした選び方の目安として、サーバレスは予測不可能・平均は低いが時折バーストするようなトラフィック、手動は安定・予測できるトラフィック、自動スケーリングは安定していない・予測不可能なトラフィックに適している。

サーバレスと自動スケーリングが似ているけど、サーバレスは従量課金で、手動・自動スケーリングはプロビジョニングされたスループットに対して課金。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/throughput-serverless

## 要求ユニット(RU)
RUはデータベース操作に必要なシステムリソースを抽象化したもので、コストもRUに基づいて計算される。1RU=1KBのポイント読み取り。
(ポイント読み取り=パーティションキー+項目IDでのキー/値参照。コストを抑えるには、なるべくクエリでなくポイント読み取りで値を取得するようにする。)

https://learn.microsoft.com/ja-jp/azure/cosmos-db/request-units

10KBのポイント読み取りなら100RUなのかというとそうではなく、以下を見ると100KBのポイント読み取りは10RUになっている。(読み取り容量と使用システムリソースは完全に比例するわけではないからかな？)

https://learn.microsoft.com/ja-jp/azure/cosmos-db/optimize-cost-reads-writes#point-reads

## Azure Synapse Link for Azure Cosmos DB
Cosmos DB内のデータの準リアルタイム分析に利用される。Synapse Link自体はCosmos DBとSynapse Analyticsを統合する、クラウドネイティブのHTAP。

Cosmos DBの分析ストアは分析用に完全に分離された列ストアであるが、デフォルトではパーティション分割されない。
カスタムパーティション分割機能で分析ストアのデータをパーティション分割することで、クエリパフォーマンスを向上させることができる。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/synapse-link

## おわりに(学習しての所感)
Azure Cosmos DB分析ワークロードを有効にする(Synapse Linkまわり)は試験ガイドにはバッチリ書いてあるけど、DP-420のトレーニングだけだと手薄になりがちかなと思った。DP-203でAzure Synapse Analytics出てくるので重点的にやりたい。