OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelでEnum機能を使ってみた


LaravelのプロジェクトでEnumを使う機会があったので、簡易ではありますが備忘録としてその機能について綴っていきます:santa_tone1::gift:

## enumとは？簡単な特徴
* 列挙型のこと
* PHP8.1〜から使用可能
* 事前に列挙した固定値を取得できる
* 定義に飛ぶことができる(config()では定義ジャンプ不可なのでここも便利なところ！)
* 無効な型の割り当て防止になる
* boolやfloatは指定できない
* 単一型のみ指定できる(◯string　☓string | int)

## enumを使用した経緯
* プロジェクトで、既存DBに登録されていない固定のコード値を複数取り扱う必要があった
* プロジェクトが最新Laravel11での開発であったため、php artisanでenum作成が容易にできること
* 開発者が10名以上いること、また開発リポジトリが複数存在するため、コードの統一性・シンプルかつ可読性を高めることを重視
以上の理由でenumが採用されました。

上記のように、Laravel11では
```php
php artisan make:enum 列挙型(Enum)名
```
でapp/Enums配下に上記で作成したEnumファイル が簡単に作成されます！

## 使用例
:star2:会員判別用のEnumを作成し、指定した数値と日本語名を活用

### 1. 会員判別用Enumファイルの作成
```php
php artisan make:enum MemberType
```

### 2.作成されたEnumの編集
app/Enums/MemberType
```php
<?php
namespace App\Enums;

/**
 * CertificationCategory Enum class
 *
 */
enum MemberType: int
{
    case MEMBER = 1;
    case ASSOCIATE_MEMBER = 2;
    case NO_MEMBER = 3;

    public function label(): string
    {
        return match($this) {
            self::MEMBER => '会員',
            self::ASSOCIATE_MEMBER => '準会員',
            self::NO_MEMBER => '非会員',
        };
    }
}
```

### 3-1.基本の使い方
```php
MemberType::from(1)
// MemberType::MEMBER
MemberType::from($member)->label()
// 会員

MemberType::tryFrom(5);
// 存在しない値の場合、tryFromはnullを返す
MemberType::from(5);
// fromはErrorを返す
```


### 3-2.ラベル名取得を少し応用
:star2:selectタグの選択肢をEnumのラベル名をforeachして表示させます

resource/views/test.blade.php
```php
@php
    use App\Enums\MemberType;
@endphp

<select name="member_type">
    @foreach (MemberType::cases() as $member)
        <option value="{{ $member->value }}">
            {{ $member->label() }}
        </option>
    @endforeach
</select>
```
結果(※cssの設定等は割愛します)

![FE8A80BD-068C-461B-A58B-59A09BF792FA_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3137748/dd97508d-78fd-04a2-be31-b3de2d18486c.jpeg)

以上です！
StartsWithの罠

StartsWithは結構便利でTextInputコントロールのTextで
Galleryの検索に利用したりするがこの前罠に嵌ってしまった。

下記２つのリスト
PostListとMemberListがあるとする。
MemberリストのPostNoにはPostListから引用したNoを記載する。
（検証の為にPost列も作成している）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/a4623b95-52c2-4b73-7f48-56123573779f.png)

次に
Post名をそのままStartsWithでフィルターをかけたものと
PostNoをLookUpで引用しStartsWithにてフィルターしたものを比較してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/0999a202-4289-a478-7f80-88f8c9ada49b.png)

ぱっと見はほぼ一緒に見えるのですが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/d70d22ff-dd5e-e8b5-52ed-688dca82de8e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/57dfaef5-d9ba-c68a-d9c6-48fb4c6960e0.png)

TextInputのTextがmanaの時点でPostNoを引用したものに関してはLookUpの中身を見たらわかるのですが
TextInputのTextが""の時に、データが見つからない理由がわからなかった。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-startswith
Learnを参考にちょっと悩んでひらめいた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/992fd476-9554-40c5-edab-3cbab808b802.png)
あ、Textが空の場合はtrueを返す。つまりこれは""の場合
（前回のTTextInputコントロール　Defaultプロパティ　""と空白のトラップ参照）
https://qiita.com/sionnct/items/fb15adb3fac4ea978b27
TextInputのTextが""の場合は、LookUpの式はBlankを返すのでデータが見つからないことが分かった。

ちなみにTextInputコントロールのDefaultプロパティを空白にするとtrueを返さなくなりデータが見つからなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/d1d4ee29-a4fb-1b80-cd6f-f4ad805d3e4d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/fd5f154a-870c-7e15-2c5f-2fae22c33898.png)
Heasoftのbuildの際に起こるld: library not found for -ltinfoの対処法

## 初めに
HEASoft6.34をダウンロードする必要があったのですが、その際に出た一つのエラーに苦しみましたので共有させていただければと思います。

環境
python：3.12.3
HEASoft：6.34

## エラー内容
./configureとmakeはうまくいくが、make install の際に、以下のエラーコードとともに、
インストールがストップしてしまう。
```bash:bash
ld: library not found for -ltinfo
```

## 解決方法
第一にltininfoを含むソフトウェアであるncursesをインストールします。
```bash:bash
brew install ncurses
```
次に以下のコマンドを打ってみましょう
```bash:bash
pkg-config --cflags --libs ncurses
```
出力結果は以下のようになっているはずです。
```bash:bash
-D_DARWIN_C_SOURCE -DNCURSES_WIDECHAR -
I/opt/homebrew/Cellar/ncurses/6.5/include/ncursesw -
I/opt/homebrew/Cellar/ncurses/6.5/include -
L/opt/homebrew/Cellar/ncurses/6.5/lib -
Wl,-search_paths_first 
-lncursesw
```
最後が-lncurseswとなっていれば、以下の方法でこのエラーは治ります。
(-ltinfoと書かれていれば、以下の方法ではない原因があります)

### HEASoftのmakefileの書き換え
ここからはltinfoからlncurseswを用いてmakeするように変更していきます
第一に以下のディレクトリに移動します
```bash:bash
cd ~/adsoft/heasoft-6.33.2/tcltk/tclreadline
```
内部にあるMakefleをvs codeなどで開きます。

以下のようになっていると思いますので、LIBSを変更します。

変更前
```bash:bash
CPPFLAGS = -I/opt/homebrew/opt/tcl-tk/include
LDFLAGS = -L/opt/homebrew/opt/tcl-tk/lib
LIBS = -ltinfo  /Users/watanabeyuuki/adsoft/heasoft-6.34/heacore/readline
```

変更後
```bash:bash
CPPFLAGS = -I/opt/homebrew/opt/tcl-tk/include
LDFLAGS = -L/opt/homebrew/opt/tcl-tk/lib
LIBS = -L/opt/homebrew/opt/ncurses/lib -lncursesw
```

以上でうまく動くと思います。

## 原因
heasoftが6.33から6.34に変更される際に、-lncursesから -ltininfoに変化したため、このエラーが起きています。この前あったメンテナンスで治っていればいいのですが、どうなるかわかりませんのでここに書かせていただきます。
我々はCoffeeScriptを書く時にもRailsの実行を使いたかったんだよ

# app/assets/javascripts/foo.js.coffee で Rails の変数を使いたい

諸般の事情から、スクリプトを使って `<img>` タグの `src` を特定の条件下でアプリケーション側のアセットに置き換えたい、という事があったんですよ。

大雑把に書くと、つまりこういうのですね。

```coffeescript
# app/assets/javascripts/foo.js.coffee
# 今時 jQuery なんて使ってんのかよ、と言われるとまぁ…
$ ->
  $('img.portrait').on 'error', ->
    $(this).attr 'src', '/assets/portrait/no-image.png'
```

ただ、Railsのアセットって最終的にはフィンガープリント付与される関係で、これだとアセットプリコンパイルされる環境ではそのままだと参照出来ないわけで、Railsの `asset_path` ヘルパーなりを利用して実際に有効なパスを書かないといけないわけです。

でも、CoffeeScriptって、Railsの変数とか実行結果をそのまま置けないじゃないですか。多分。
※色々調べた結果「ない」と結論付けていますが、実際には全然あるかもしれません

```coffeescript
# つまり、こういうのが書きたい
$(this).attr 'src', "#{asset_path('portrait/no-image.png')}"

# けどこれコンパイル結果はこうなるから、全然期待通りじゃないじゃん
#=> $(this).attr('src', `${asset_path('portrait/no-image.png')}`);
```

なので、Railsの方の実行を踏まえたJavaScriptアセットを記述する時にはCoffeeScriptは使えません。故に、Railsの実行が使えるERBを採用し、結果こうなります。

```ERB
<%# app/assets/javascripts/foo.js.erb %>
$(function(){
  $('img.portrait').on('error', function(){
    $(this).attr('src', '<%= asset_path("portrait/no-image.png") %>');
  });
});
```

……ほんの些末な一節を書く、たったそれだけのために。
それだけのために、CoffeeScriptのいい感じの記述が使えない。この世は間違ってる。

# じゃあERBも併せて使えばよかったんだよ！

アセットパイプラインの動作って、拡張子を連結させてたら末端から順に処理してくれるらしいじゃないですか。
もしかしたら全然常識の範囲なのかもしれないですが。どうして誰も教えてくれなかったんだ！
~~「聞かれなかったからさ」~~

ということで、ERBで当該のパス出力部分だけを実行させた後、改めてCoffeeScriptで評価すると、いい感じに期待結果が得られるというわけです。

```coffee
# app/assets/javascripts/foo.js.coffee.erb
$ ->
  $('img.portrait').on 'error', ->
    # 本命の portrait/no-image.png の期待通りのパスが文字列として設定される：うれしい
    $(this).attr 'src', '<%= asset_path("portrait/no-image.png") %>'
```

### 余談: Slimテンプレートでもやりたいんだけど

まぁSlimテンプレート内で `coffee:` 文脈からRailsの実行を引用したい場合は知りません。そっちは取り敢えず `javascript:` 文脈で変数に突っ込むとかで対応するでもいいんじゃないですかね……。

```slim
// テンプレートの描画側でスクリプト仕込む系実装
javascript:
  // 最近は let とか使うんだっけ？ JavaScriptにわか勢だからあんま詳しくない
  var noImagePath = "#{asset_path('portrait/no-image.png')}";

coffee:
  $ ->
    $('img.portrait').on 'error', ->
      $(this).attr 'src', noImagePath
```

# 参考

参考っていうか、なんならRailsガイドにほぼダイレクトに書かれてましたわ！
[Railsガイド v6.1 アセットパイプライン #2.3.3 JavaScript/CoffeeScriptとERB](https://railsguides.jp/v6.1/asset_pipeline.html#javascript-coffeescript%E3%81%A8erb)

結論：ドキュメントはちゃんと隅々まで読み込みましょう
スプレッドシートを爆速で翻訳する / GOOGLETRANSLATE() MAP() LAMBDA() 関数の使い方

# はじめに

ACCESS Advent Calendar 2024 の8日目です。

今年一番お金と時間を無駄にしたことは「夏に家のエアコンクリーニングをして、1週間後に壊れてしなきゃ良かった」の渡邉直彦です。

スプレッドシートを爆速で翻訳する方法、GOOGLETRANSLATE(), MAP(), LAMBDA() 関数の使い方、をまとめます！

# 結論

以下のような関数をスプレッドシートに入力するとその下のセル全て翻訳してくれます。

## 日本語→英語翻訳時

```
=MAP(D2:D, LAMBDA(text, IF(text = "", "", GOOGLETRANSLATE(text, "ja", "en"))))
```

## 日本語→台湾語（繁体字）翻訳時

```
=MAP(D2:D, LAMBDA(text, IF(text = "", "", GOOGLETRANSLATE(text, "ja", "zh-TW"))))
```

## スクリーンショット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/735e700f-f79e-c17f-2324-35b7bcc8c939.png)

* B列：台湾語・繁体字（GOOGLETRANSLATE() による機械翻訳）
* C列：英語（GOOGLETRANSLATE() による機械翻訳）
* D列：日本語

# 背景

* 2024/10韓国出張、2024/11台湾出張、と2ヶ月連続出張になり、準備が忙しすぎた
* 「そこまで力を入れなくて良い、ある程度の精度で良い情報」を機械的に翻訳したい
  * フライト、オフィス住所、ホテル住所、タクシー予約、の情報など
* 「ちゃんと意思疎通したい情報」の翻訳に時間を使いたい
  * 会議アジェンダ、狙い、の意識合わせなど

# （ChatGPT さんによる）よく分かる解説

## 1段階目： GOOGLETRANSLATE()

### 機能

* 指定したテキストを別の言語に翻訳

### 形式

```
=GOOGLETRANSLATE(text, "source_language_code", "target_language_code")
```

- text: 翻訳したいテキスト
- "source_language_code": 翻訳元の言語コード（例えば日本語）
- "target_language_code": 翻訳先の言語コード（例えば英語）

### 例

* 「こんにちは」→「hello」

```
=GOOGLETRANSLATE("こんにちは", "ja", "en")
```

## 2段階目：LAMBDA()

### 機能

`LAMBDA`関数は、カスタム関数を定義するためのもの。
単独でも使用可、`MAP`関数など他の関数と組み合わせて使用することも可。

### 形式

```
=LAMBDA(parameter, 処理)(引数)
```

- parameter: 関数に渡す引数の名前
- 処理: 引数に対して実行したい処理内容
- 引数: 実際に関数に渡す値やセル参照

### 例

```
=LAMBDA(text, UPPER(text))(D2)
```
入力された`text`を大文字に変換する。
「hello」→「HELLO」

## 3段階目：MAP()

### 機能

指定した範囲内の各セルに対して同じ処理を適用する。
必ず LAMBDA() 関数と組み合わせて使用する。

### 形式

```
MAP(D2:D, LAMBDA(text, 処理))
```

* D2:D: 処理対象となるセル範囲
* LAMBDA(text, 処理): 各セルの値をtextとして受け取り、指定した処理を実行

### 例

```
=MAP(D2:D, LAMBDA(text, UPPER(text)))
```
D2から下の各セルのテキストを大文字に変換する。

## 4段階目：MAP() & LAMBDA() & GOOGLETRANSLATE()

### 例

```
=MAP(D2:D, LAMBDA(text, GOOGLETRANSLATE(text, "ja", "en")))
```

D2から下の各セルのテキストを英語に翻訳する。

## 5段階目：MAP() & LAMBDA() & GOOGLETRANSLATE() & IF()

最後に、IF関数を追加して、空セルへのエラー対策をします。

```
=MAP(D2:D, LAMBDA(text, IF(text = "", "", GOOGLETRANSLATE(text, "ja", "en"))))
```

- IF(text = "", "", ...): セルが空の場合は空のままにし、そうでない場合のみ翻訳を実行

この追加により、空のセルに対してGOOGLETRANSLATEを実行することで発生する可能性のあるエラーを防止できます。

IF() が無いと、翻訳元セルが空の場合、翻訳先セルは以下のような表示になります。
```
#VALUE!
```

IF() があれば、翻訳先セルは空欄です。


## 参考：公式ヘルプページ

https://support.google.com/docs/table/25273?hl=ja

# おわりに

ACCESS Advent Calendar 2024 、明日の担当は @aFumihiroSaito です。お楽しみに！🎉
Power BIでデータインテグリティを考える

製薬業界での業務に携わり始めてから意識し始めたデータインテグリティをテーマに、Power BIでのデータ共有で思ったことを書いています。

## データインテグリティとは
全てのデータがライフサイクルを通じて一貫性を保ち、完全かつ正確であることを意味します。FDA（アメリカ食品医薬品局）やMHRA（イギリスの医薬品・医療製品規制庁）などの規制当局から基準となるガイダンスが発表されており、特に製薬業界において遵守が求められている概念です。
データの完全性、一貫性、正確性を担保することで、患者の安全性を担保することを目的としています。

## ALCOAの原則とは
データインテグリティを語るときには必ず出てくるキーワードですが、データインテグリティを遵守するためには「ALCOA原則」(もしくはCCEAを追加した「ALCOA＋原則」)を満たしている必要があります。どのような観点で何を気を付けるべきなのか、具体的に説明されているのでわかりやすいです。詳しくは下記サイトをご覧ください。

https://ja.wikipedia.org/wiki/ALCOA-CCEA%E5%8E%9F%E5%89%87

これらは基本的にはPower BIに取込むデータではなく、一次データを生成する段階において遵守すべき原則であるかと思いますが、Power BIでデータを扱う際にも気をつけるべきことがあるのではないかと思いました。

## アクセス管理
会社にてPower BIを使用する際にはデータ共有が頻繁に行われていますが、ALCOA原則のもと、データの正確性を担保するためはアクセス管理について十分に検討する必要がありそうです。共有するデータに対して適切なアクセス権が付与されていないと、意図しているいないに関わらず、データが改竄される可能性は高くなります。

ではどのようにアクセス管理をするのがよさそうでしょうか？

・このデータの機密性はどの程度ですか？
・このデータにアクセスする必要がある人は誰ですか？
・どのレベルのアクセス権が必要ですか？

Power BIに限らない話ですが、アクセス権付与の依頼が来る/してもらうことを避けるために？、かなり広範囲でアクセス権を付与してしまうことがありますが、Principle of Least Privilegeのもと、本来データの共有相手には必要最低限の権限のみが付与されるべきです。
Segragation of Dutiesの観点からも、ロール別にアクセス権を分けて管理するのが理想です。例えばデータ管理者、レポート作成者、レポート閲覧者で権限を分けて、それぞれ必要な権限"のみ"を付与します。
そして、これらのアクセス権は"承認"されて付与されていることを示すために、申請=>承認、というプロセスを経ること、そのプロセスを準備しておくことも必要かと思われます。

またPower BIではセマンティックモデル、データフロー、ワークスペース、レポート、Power BIアプリなどに対して共有設定を行えるようになっていますが、どこで共有設定を行うべきなのか、動作を理解した上で設定する必要がありそうです。

やみくもに共有せずに、上記を意識しながらデータ共有の設計は行いたいです。

https://learn.microsoft.com/ja-jp/power-bi/guidance/fabric-adoption-roadmap-governance


以上
【OpenID Connect】shell芸で学ぶJWTの署名検証

## 前回の記事

https://qiita.com/sigma_devsecops/items/096936c580617a31624a

前回の記事では作成されたJWTをデコードして中身を確認しました。
今回は作成したJWTを検証してみます。

## JWTの検証をやってみる

1. まず，JWTの署名に使われている暗号化形式を調べます
    
    ```shell
    cat jwt_sample.txt
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    
    awk -F "." '{print $1}' jwt_sample.txt | sed 's/-/+/g; s/_/\//g' | awk '{ l=length($0) % 4; if (l > 0) printf "%s%s", $0, substr("==", 1, l); else print $0 }' | base64 -d
    {"alg":"HS256","typ":"JWT"}
    ```
    
    :::note
    [前回の記事](https://qiita.com/sigma_devsecops/items/096936c580617a31624a)を参照
    :::
    
2. HS256形式の署名を作成します。`your-256-bit-secret`が共通鍵です。

    ```shell
    awk -F "." '{print $1 "." $2}' jwt_sample.txt | tr -d '\n' | openssl dgst -hmac "your-256-bit-secret" -sha256 -binary | base64 | sed -e 's/+/-/; s/\//_/g; s/=//g'
    SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    ```

    :::note info
    JWTのヘッダとペイロードを.で連結したものから`tr`で改行を削除し，opensslで作ったバイナリをbase64urlでエンコードしています。
    :::

3. 元のJWTの署名部分と比較してみる

    ```shell
    awk -F "." '{print $3}' jwt_sample.txt 
    SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    ```

    2と同じ値になっているのでJWTが改ざんされていないことがわかります。

---
JavaScript/オブジェクトでの分割代入

# オブジェクトの分割代入
分割代入とは…
オブジェクトや配列から特定のプロパティや要素を簡単に取り出すための構文

## 分割代入を使う場合と使わない場合の比較
### 分割代入を使わずにオブジェクトのプロパティを取り出す場合
```javascript
const menu = {
  isSetMenu: true,
  mainMenu: {
    mainName: 'Cheeseburger',
    topping: 'cheese',
  },
  sideMenu: 'french fries',
  drink: 'cola',
  setPrice: 8.5,
};

const isSetMenu = menu.isSetMenu;
const mainName = menu.mainMenu.mainName;
const topping = menu.mainMenu.topping;
const sideMenu = menu.sideMenu;
const drink =menu.drink;
const setPrice = menu.price;

console.log(mainName);  //Cheeseburger
console.log(setPrice);  //8.5
```

### 分割代入を使ってオブジェクトのプロパティを取り出す場合
```javascript
const menu = {
  isSetMenu: true,
  mainMenu: {
    mainName: 'Cheeseburger',
    topping: 'cheese',
  },
  sideMenu: 'french fries',
  drink: 'cola',
  setPrice: 8.5,
};

const {
  isSetMenu,
  mainMenu: {
    mainName,
    topping,
  },
  sideMenu,
  drink,
  setPrice,
} = menu;

console.log(mainName);  //Cheeseburger
console.log(setPrice);  //8.5
```

## 分割代入の便利な機能
```javascript
const menu = {
  isSetMenu: true,
  mainMenu: {
    mainName: 'Cheeseburger',
    topping: 'cheese',
  },
  sideMenu: 'french fries',
  drink: 'cola',
  setPrice: 8.5,
};

const {
  isSetMenu,
  mainMenu: {
    mainName: burger,  //変数名を"burger"と指定
    topping,
  },
  // sideMenuは取り出さない
  drink,
  addMenu = 'onion rings',  //未定義のプロパティにデフォルト値を設定
  ...others  //残余プロパティを取得
} = menu;

console.log(isSetMenu);  //true
console.log(burger);  //Cheeseburger
console.log(topping);  //cheese
console.log(addMenu);  //onion rings
console.log(others);  //{setPrice: 8.5, sideMenu: "french fries"}
```

## 分割代入を関数の引数としての使用
```javascript
const menu = {
  isSetMenu: true,
  mainMenu: {
    mainName: 'Cheeseburger',
    topping: 'cheese',
  },
  sideMenu: 'french fries',
  drink: 'cola',
  setPrice: 8.5,
};

const printMenu = ({
  isSetMenu,
  mainMenu: {
    mainName: burger,
    topping,
  },
  drink,
  addMenu = 'onion rings',
  ...others
}) => {
  console.log(isSetMenu,burger,topping,drink,addMenu,others);
};

printMenu(menu);
//true 'Cheeseburger' 'cheese' 'cola' 'onion rings' {sideMenu: 'french fries', setPrice: 8.5}
```

## 参考記事
[分割代入 - JavaScript - MDN Web Docs - Mozilla](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
LINE WORKS API メッセージ送信 ユーザー指定 テキスト

# LINE WORKS API を使用してユーザーにメッセージを送信する

この記事では、LINE WORKS API を使用して、特定のユーザーにテキストメッセージを送信する方法を解説します。

以下の URL で Google Colab を使って簡単に試せます。
https://colab.research.google.com/drive/1qS2v4r5YDbfX4Zd8iVm_XiswFQUpJBwD?usp=sharing

## 必要な準備

1. **LINE WORKS Developer Console での設定**
   - Bot を作成し、`Bot ID` を取得します。
   - Bot を対象ユーザーにメッセージ送信可能な状態に設定します。

2. **ユーザー ID の取得**
   - LINE WORKS の管理画面で `userId` を確認します。ユーザーのログイン ID やメールアドレス形式で指定可能です。

3. **Access Token の発行**
   - LINE WORKS API を使用するためのアクセストークンを取得します。

## スクリプト

以下のスクリプトを使用して、特定のユーザーにテキストメッセージを送信します。

```python
import requests
import json

# 必要な変数を入力
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"  # @param {type:"string"}
BOT_ID = 2000001  # @param {type:"integer"}
USER_ID = "userf7da-f82c-4284-13e7-030f3b4c756x"  # @param {type:"string"}

# API エンドポイント
API_URL = f"https://www.worksapis.com/v1.0/bots/{BOT_ID}/users/{USER_ID}/messages"

# メッセージの内容
message_content = {
    "content": {
        "type": "text",
        "text": "こんにちは、これは特定のユーザーへのテストメッセージです！"
    }
}

# HTTP ヘッダー
headers = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json"
}

# POST リクエストの送信
response = requests.post(API_URL, headers=headers, data=json.dumps(message_content))

# レスポンスの確認
if response.status_code == 201:
    print("メッセージが正常に送信されました！")
else:
    print(f"エラーが発生しました: {response.status_code}")
    print(response.text)
```
## スクリプトのポイント

### 必要なパラメータ

1. **`ACCESS_TOKEN`**
   - LINE WORKS API の認証に使用されるアクセストークンです。

2. **`BOT_ID`**
   - 使用する Bot の ID です。LINE WORKS Developer Console から取得できます。

3. **`USER_ID`**
   - メッセージを送信する対象のユーザー ID です。
   - ユーザーのログイン ID やメールアドレス形式で指定可能です。

### メッセージの構造

送信するメッセージは以下の形式を取ります。

- **`type`**
  - メッセージのタイプを指定します（例: `text`）。
- **`text`**
  - 実際に送信するテキストメッセージを指定します。

#### 例:
```json
{
  "content": {
    "type": "text",
    "text": "こんにちは、これは特定のユーザーへのテストメッセージです！"
  }
}
```
### レスポンス例

成功時:
```plaintext
メッセージが正常に送信されました！
```

失敗時:
アクセストークンが無効な場合:
```plaintext
エラーが発生しました: 401 {"error":"Unauthorized","error_description":"Invalid access token"}
```

## 応用

- **多言語対応**
  - `i18nTexts` プロパティを追加することで、メンバーの言語設定に応じたメッセージを送信できます。
  
- **他のメッセージタイプ**
  - テキスト以外のメッセージ（スタンプ、テンプレートなど）にも対応可能です。

## まとめ

このスクリプトを使用すれば、LINE WORKS API を使ったユーザーへのメッセージ送信を簡単に行えます。ぜひ試してみてください！
RのINLAをインストールする(超短編)

# 目的
Rで地理生物学の空間統計を行う際に扱おうと考えた**INLA**というライブラリをインストールした際のエラーを何とかするために、私なりに解決した方法です。

非常に短いですが、誰かの作業の助けになればと思います。

# 必要なもの
R (version 4.4.1)
INLA 2024.06.27のzipファイル [ここから入手](https://inla.r-inla-download.org/R/stable/bin/windows/contrib/4.4/)

# やること
①Rコンソールの起動
②上のメニューの「パッケージ」→「Install package(s) from local file」を選択
③INALのzipファイルを選択
④動作確認 (INLAのサンプルコードを全て実行し、関数の出力が問題なく行われれば成功)
```r
library(INLA) #エラーが出なければOK
```

# おまけ
INLAのサンプルコード ([サイト](https://davidbolin.github.io/rSPDE/articles/rspde_inla.html))を実行する際、fmesherでエラーが出ること場合があります。
以下で解決できる場合があります。
```r
if (!requireNamespace("fmesher", quietly = TRUE)) {install.packages("fmesher", repos ="https://inla.r-inla-download.org/R/stable")}
```

以上、つい先日、かなりの時間をかけてしまったことだったので、同様の問題にぶつかっている人に向けて短くまとめました。
Hyper-V上でCisco CML 2.8 FreeTierがgrubから進まないを解決する

この記事はHyper-V上にCisco CML2.8 FreeTierを入れたのに以下の画面で止まって起動できない！という問題を解決します。

結論だけ見たい人向け
```
grubで"splash"を消して起動して
sudo vi /etc/default/grub
 -> GRUB_CMDLINE_LINUXからsplashを削除
sudo update-grub
```

# 前置き

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/45a8c6d2-ecd2-23b8-92b9-f421f70cbab9.png width=50%>

インストール自身は@caribou_hyさんの次の記事で解説されています。

https://qiita.com/caribou_hy/items/3c1e2ff1171ffb0a7db9

Recovery Modeで起動すると起動できるのですが、通常通り(=grub画面で何も押さずに)起動しようとすると上の画面のまま進みません。つまり、CML VMを起動するたびRecovery Modeで起動せねばなりません。

# 前提
上記の@caribou_hyさんの次の記事で初期設定を終えていることが前提です。

# 原因を探る
VMを再起動すると起動しません。Linux起動時のSplash設定(ロゴを表示する設定)が原因のようです。

確かめてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/5a8d83ca-c93f-f49a-55e4-d9244d7741bd.png)
この状態でeを押すとgrubの設定が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/3ebae27d-9a36-e075-e13b-64373fd431dd.png)
"splash"を消します。`Ctl-x`を押してsplashのない状態で起動を試みると無事に起動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/bb2e1df2-a0e3-0291-1c8d-2471904f81e4.png)

# 変更を永続化する
上記の画面の通りHyper-Vのコンソール上で、user:`sysadmin`, pass:インストール時の設定したものでLinuxにログインします。

```bash
sudo vi /etc/default/grub
 -> GRUB_CMDLINE_LINUXからsplashを削除
sudo update-grub
```

編集後は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/a39ff8ae-8ef9-1741-2f07-083c4433b631.png)

これでrebootするとgrub画面で止まらずに起動できるはずです！
サイレントブラスを使用したエフェクターの検討

## はじめに
二年目の竹村です。
業務の内容とは異なるのですが、サウンドプログラミングネタを書いてみました。

私はValve TromboneでJazzをやっているのですが、練習の時に問題になるのが音漏れ。
家での練習は大丈夫なのですが、宿泊時の練習がこれまで課題でした。
そこで、最近、消音しつつヘッドフォンで音をモニタリングしてくれる、YAMAHAのサイレントブラスを購入しました。
![DSC_1464.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946784/07ec1c3e-af51-d911-ea64-1a7bc3d7662a.jpeg)
![DSC_1462.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946784/b1d95e46-b937-eeda-82c8-5a07011c1941.jpeg)

サウンドハウスの購入ページ
https://www.soundhouse.co.jp/products/detail/item/326702/

なんとこのサイレントブラス、オーディオインターフェイス機能がありまして、PCに接続して、ミーティングアプリなどに繋げることができます。
今回は、学生の時から使用しているpuredataというプログラミング言語を使用して、エフェクターを作ってみたいと思います。

## puredataについて
puredataは音信号に特化したビジュアルプログラミング言語です。
オブジェクトと呼ばれる箱を線で繋いでいくことで実装できます。
シンセサイザーやエフェクターが作れたり、メディアアート作品なんかにも使用されています。

日本の公式サイト
https://puredatajapan.info/

こちらのサイトがかなり初歩的な内容から書かれていて、わかりやすいかと思います。
こじ研（小嶋研究室）
https://www.ei.tohoku.ac.jp/xkozima/lab/avmed-pd1.html


## 今回の検証
今回はライブラリが用意されていてかなりリアルなサウンドになる、リバーブを用いて検証してみたいと思います。
[freeverb~]というオブジェクトを使用してみます。
このオブジェクトは、dry-wetでエフェクトの効き具合を、roomsizeで空間の大きさ、dampingで壁の反射度合い（音が反射しやすいのか、吸収されやすいのか）を操作します。
これらのパラメータのみでリバーブを実現できてしまいます。
![Screenshot_20241202_195737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946784/5c4790a3-7e7a-24c2-ae10-e02634d15667.png)


↓こちらが試してみた際の動画になります。
ピッチが安定していないのはご了承ください。
ミュート類をつけるとピッチが変わってしまうんですよね。
https://www.youtube.com/watch?v=BUtGcmNMmqs


## 結論
演奏している側からすると若干の遅延を感じますが、問題にならないレベルでしょうか。
今回はUbuntu StudioというLinuxディストリビューションを使用しましたが、Windowsだと遅延が発生してしまうので注意です。
raspberry piでも問題なく動作するので、自作エフェクターとかに応用しても面白そうですね。
サイレントブラスだと、生音がほとんど出ないから、ギターのエフェクターのように、エフェクトかけた音だけを外に出すことができるのがメリット。
これから徐々に他のエフェクトも試したいと考えております。



## 使用環境
OS：Ubuntu Studio 22.04 LTS
puredata：version 0.52-2
DBスペシャリストPM 概念データモデルの頻出問題



# はじめに

本記事では私が「苦手」だった概念データモデルの既出問題について記載したいと思います。

概要編→https://qiita.com/jun2/items/f80cc65f54fdf0521d3b

全体的な勉強方法→https://qiita.com/jun2/items/4e72688d2fbb356e9d9e

# 同じエンティティ間で複数の線

本記事の中で一番重要だと思います。

エンティティ
　↓　↓
エンティティ

こういった関係ですね。
初見ではそんなんありなの！？と驚いたものですが、見慣れると「あれね」と思えます。

スキーマで表すとこんな感じでしょうか?

エンティティA (伝票)
伝票ID(PK)

エンティティB (明細)
伝票ID(PK)、明細番号(PK)、商品、まとめ先伝票ID(FK)

ちょっと無理やり感がありますが、伝票ID同士のリレーションは多くの人はクリアできると思います。 商品ごとに他の伝票にまとめることができる。といった関係がある場合、エンティティAの伝票IDと エンティティBのまとめ先伝票IDにもリレーションがあることになります。

こういった同じエンティティ間で複数のリレーションがある関係というのは、少しいびつにも見えますが よくある問題ですので覚えておいた方がよいです。

# 明らかに線を結ばせたい配置

エンティティ　　　　エンティティ

　　　　　エンティティ

こういった配置ですね。

何度も問題を解いているとたいていの場合

エンティティ　　エンティティ
　　　　↓　　　　↓
　　　　エンティティ

こうですね。

この場合は、エンティティ間の多対多を解消するためのエンティティであるか?も併せて確認すると正答率があがるでしょう。

綺麗に線が引けるようにある程度配慮されているということをここではお伝えしたいというところです。

# 文章の常套句

* 〜のうち〜を〜と呼ぶ、〜と〜を併せて〜と呼ぶ
サブタイプを表現するための言葉である
サブタイプが排他的である場合は、フラグや区分を持つことが多い。
* 〜と〜は競合しうる、共存する、どちらの属性も持つ可能性がある、〜かつ〜を禁じていない
サブタイプが排他的ではないことを表現しようとしている。
* 定量発注する
発注伝票などに個数などは入らない
* ~が終わったら、~に〜を記録する
スキーマに記録対象の属性が入ることとなる
* 〜で識別し
おおむね主キーを表現している

# 終わりに

そもそも苦手であるためこの程度しかお伝え出来ず・・・

ただこれだけでも知ってると知らないでは、時間効率も含め10点分くらいは価値があると信じております。

次でDBスペシャリストの記事は最後です。

DBスペシャリスト 前日~当日の過ごし方のススメ→https://qiita.com/jun2/items/cbdbf5ab53a81bf77f51
DBスペシャリスト前日~当日の過ごし方のススメ

# はじめに

DBスペシャリスト試験の記事の最後になります。

概要編→https://qiita.com/jun2/items/f80cc65f54fdf0521d3b

勉強方法→https://qiita.com/jun2/items/4e72688d2fbb356e9d9e

概念データモデルのテクニック→https://qiita.com/jun2/items/a0d265440746265e9846

# 前日

ここまで根詰めてきた分、軽めに切り上げた方がよろしいと思います。

午後問題など最後に一回・・・とやりたくなりますが、やるのであれば午前中の内に済ませてしまいましょう。
午後についてはやるとしてもAM問題の暗記に留めましょう。
食事についても注意が必要です。
気合を入れるためにカツを・・・・体質と年齢次第ですが食べ過ぎないようにしましょう。
油物の過剰摂取はおなかの調子が悪くなるかもしれません。

お酒を・・・・今日だけ我慢しましょう。
毎日飲んでいる人ほど、飲んでいない次の日の体調の良さには驚くと思います。

幸い試験は日曜日です。

職場にもよりますが、この手の職種の方は業務内容にもよりますが前日は休みの方も多いでしょう。
ストレス・疲労を抜きにかかることも立派な試験対策だと思います。

# 当日

ここでも食べ過ぎ、尿意を催すような飲み物には注意しましょう。
野菜ジュースなども実は尿意を催すため注意しましょう。
会場に着いたらトイレに行くなり、ストレッチをするなりリラックスしておき、
試験の説明が始まるころから心の準備を始めてください。
可能な限り頭は休めておきましょう。

お昼は残念ながらAPのように時間がたくさんありません。
APの時は途中退室が可能で、人によっては相当空き時間があると思います。
DBスペシャリスト試験ではAM2の試験の途中退室が認められていない為、1時間程度しか時間がありません。
試験の説明のための集合時間もありますので、実質40分程度しかないこととなります。
近くにコンビニなどあればよいですが、ない場合はお弁当が必要です。
試験会場付近については事前にリサーチしておきましょう。
お弁当を持って行ってなるべく多くの休憩時間を過ごすことをお勧めしますが、AM2から参加の方はこの時点ではそこまで疲労はたまっていないかもしれません。

尚、この段階である程度午前問題は回答が出てきます(アンケートサイトで)。
AMに自信がある人はここで答え合わせをしてしまってもいいかもしれません。気分が少し良くなります。
逆にあまり自身がない方はここで絶対に答え合わせをしないでください。帰りたくなります。

実際、免除がなければAMだけの突破を目指してもいいですが、PMは必ず受けた方がいいと思います。
初見で突破できるかもしれませんので。

PM1が終わってPM2が開始するまで30分あります。
PM1が早めに終わればたくさん休憩が取れますが、残念ながらPM1は時間いっぱい使うことになるでしょう。
実質集合時間は10分後となりますので、10分の間にPM1で疲れた体・頭を可能な限り回復させる必要があります。
トイレはここぞとばかりに込み合うので、早めに出た方がよいでしょう。
一度外に出て深呼吸、ストレッチをしておきましょう。
PM2が終わったらお疲れ様でした。

数日たつと、TAC様、itec様から解答予想が出てきますので自己採点をしてみてください。

# 終わりに

もう二度と受けたくない・・・とAPの時に思っていましたが、もっときつい試験を受けてしまいました。
受験生や在学中の学生の試験はもっと長丁場なんだな〜と思うと、頭が上がらないですね! 高度試験の導入編としては取り組みやすい試験だと思いますので、高度技術者になりたいという方にはおすすめ したい資格です。

結果はどうあれ、試験を通して随分レベルアップできたなと思います。
ブラウザ事情@2024

この記事は、「K47deのひとりぼっち Advent Calendar 2024」の Day 5 です。

## TL;DR

昨今の私のブラウザの移り変わりと今後の思いについて

## はじめに

この記事は私が感じたブラウザそれぞれに関する偏見や個人的な感想を含みます。
ブラウザ選びの参考になるかはわかりません。

## 1. Edge

Win11最初期に使っていたブラウザ
それなりに軽くてそれなりに使えるイメージ
Chromium系になったし垂直タブもできるし万能型といったところ
Copilotがサイドバーにいるのはありがたい

## 2. Firefox

なんだかんだ１番使用時間が長いブラウザ
たまーに互換問題があるがほんとに少しであり普通に直せるレベル
Sideberryを使って垂直タブ化して、UserChrome.cssで上のタブを非表示にしていた
それなりに使える
拡張機能が少ないのは難点かもしれない

## 3. Chrome 

だいぶ昔に使っていたが最近は使う気が起きない
Edgeと同じく万能型Chromiumだがもっとシンプルなイメージ
特に言うことはない

## 4. Vivaldi

一時期ハマって使っていた
が、なにせこのコめちゃくちゃ重たい
起動に１０秒かかる
なのでやめました

## 5. Floorp

Firefox版Vivaldiといった印象
シンプルだが荒削り感が否めない
使い勝手はそれなりだがVivaldi同様ゴチャゴチャした印象を受ける

## 6. Arc

期待の新星(Chromium製)
きらいじゃないが、日本語入力と相性が悪い
かっこいい！！！！

## 7. Zen

現在利用中のブラウザー
Firefoxベースでサイドバー内蔵
シンプルですっきりFirefox版Arc

## 移ろい

Edge
↓ 拡張が微妙だったので乗り換え(当時はNot Chromium)
Chrome
↓ さらなる拡張性を求めて乗り換え
Vivaldi
↓ 重たすぎて乗り換え
Firefox
↓ 新作ブラウザが出たのでお試ししたらハマったので乗り換え
Zen

といった感じで移ろい、現在はZen Browserを使っています。

## まとめ

以上が私の感想と移ろいです
皆さんのおすすめのブラウザがあれば教えて下さい！
2024年に修了した勉強会について

# この記事について
- この記事は[datatech-jp Advent Calendar 2024](https://qiita.com/advent-calendar/2024/datatech-jp)の12月16日分として記載しています。

今年、2024年は、2023年から継続して参加していたデータ関連の勉強会が2つ完了したので、その勉強会について記載しようと思います。

なお、以下勉強会はどちらも、[さの ちひろ](https://qiita.com/IQ_Bocchi)さんが発起人となって開催されました。

# 2024年に終了した勉強会その1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/5fefe069-a174-77b3-c461-b0d1d154852b.png)

- 当該勉強会のまとめ資料は以下です。
    - [英語で技術書を読もう：Fundamentals of Data Engineering 輪読会資料 まとめ](https://qiita.com/Shumpei_Kubo/items/e24c830ecde50515905a)

- こちらの本[Fundamentals of Data Engineering (O'Reilly, 2022/07)](https://www.amazon.co.jp/dp/1098108302/)の、興味ある章を読んで内容をまとめて発表する、という趣旨の勉強会でした。
- 興味のある箇所から読むため、発表の順番はランダムであり、章立てに沿っていません。
- 一番最初の回は、[2023年4月](https://gaisaba.connpass.com/event/279517/)でした
- [その時の発表資料](https://qiita.com/Shumpei_Kubo/items/9cb9145b4b695b3b5346)は、私が作成していました


毎週月曜日、19時から1時間かけて、以下の内容で運営していました。

1. 発表者によるまとめ内容の発表
1. 各参加者による、以下トピックについてのコメント
    - 「わからない単語」
    - 「興味のある技術トピック」
- これは、個別に準備したスプレッドシートにそれぞれ参加者ごとに記載していくスタイルでした


# 2024年に終了した勉強会その2

![visu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/807f7b09-5298-dc7e-d3d3-c9c47c272e8f.png)


[英語で技術書を読もう：Fundamentals of Data Visualization 輪読会資料 まとめ](https://qiita.com/Shumpei_Kubo/items/d3c3ff7e8eb18ccdd152)

Data Engineering の勉強会を実施している途中で、Data Visualization についての勉強会の案が挙がり、EngineeringとVisualizationで毎週交互に勉強会を行う事になりました

- こちらの記事[Fundamentals of Data Visualization](https://clauswilke.com/dataviz/)の、興味ある章を読んで内容をまとめて発表する、という趣旨の勉強会でした。
- 興味のある箇所から読むため、発表の順番はランダムであり、章立てに沿っていません。
- 一番最初の回は、[2023年8月](https://gaisaba.connpass.com/event/291969/)でした
- [その時の発表資料](https://qiita.com/kota9/items/c694d9fb46b26da84400)は、[kota9さん](https://qiita.com/kota9)が作成していました
100時間でできる！DBスペシャリスト AM・PM 全体的な勉強方法

# はじめに

今回の試験対策は3本立てにしたいと思います。

本記事では全体的な学習の進め方について記事を残したいと思います。

他の方と多数重複する部分もあるかもしれませんが、せっかくたまたま目に留まったものと思いますので参考にしていただければ幸いです。
※ちなみに現在時点で合否不明です。
→合格しました

概要編→https://qiita.com/jun2/items/f80cc65f54fdf0521d3b

概念設計の頻出→
https://qiita.com/jun2/items/a0d265440746265e9846

# 勉強の期間

勉強開始は7月から開始しました。
ただし、本格的に勉強開始したのは9月からでそれまでは空き時間にテキストを読んでいた程度となります。

テキスト 15 時間
AM2 9時間
PM1 22 時間
PM2 42 時間

合計 89 時間

合計時間にそもそも反省しなければいけない点がありそうですが、ここでは割合を見てほしいです。
多数の記事でまずPM2からやりなさい。と書かれていますが、まさにその通りとなります。
合格が判明したため強気な書き方をしますが、100時間でも取り組み方で取得できるものです。

# 勉強方法・対策

1)テキスト読み

APの試験の時と比べて圧倒的に少ないのはページ数が少ないの?
と思われるかもしれませんが、テキストにはふんだんに過去問があるためそこは全て過去問に計上しています。

また、おおむねわかっているようなところは読み飛ばしていました。
気を付けていたところは、特に理解が及んでいないところについてアウトプットすること。
わたしは勉強が苦手なので、よく丸写しみたいな形になるのですが、なるべく書くことを少なくするためにまとめて・かみ砕いて・絵にしてアウトプットすることを心がけました。
あえてノートに書いています。
手で書くというのも実は重要なファクターであるのでは?と思うところがあり、ここはアナログにしました。

2)AM対策

今回もご存じ過去問道場を使います。 
が、高度試験において過去問道場から解説を読むためには有料プランが必要です。
一方、通常の解説ページは閲覧できますのでPCの方などはタブを2つ開いて必要に応じて解説を見るなどすると 特に有料プランまではいらないのかなとも思います。

AM2だけの対策であれば最終1週間ですべての年度を90点以上に持っていくことは可能だと思いますので、 試験対策としては優先度が低いです。

3)PM対策

すっごく腰が重くなるのはわかるのですがとにかく勉強の序盤から午後2の問題を解き続けてください。 
進めていくうちに、自分は問1だなとか問2だなとかとなると思いますが、それでもどちらも解いてください。と言いますのも、午後1は午後2の縮小版となります。

問1は概念系、問2は物理系となります。
試験対策としては毎日一問ずつ解いていってください。
問2だけに絞ってトレーニングしていくと概念系の問題の解き方がわからず、午後1で躓いてしまいます。

私の場合ですが、問2を選択しました。
問1の概念系の問題がとにかく苦手であり、初見で60%越えをしたことがなかったためです。
ですが、午後1のスケールであればそこそこ戦えたため、問1のトレーニングも欠かさないという方針としました。

また、毎日1問というのもポイントとなります。
午後2問題は長丁場です。時間配分のこともさることながら長丁場に慣れていく必要があります。
毎日解き続けていくことでひとまず、2時間問題に向き合える力は身につくと思います。
そのためこの記事では「トレーニング」と表現させていただきました。

過去問を解きこむにあたっては、問題・解答用紙を紙で用意することをお勧めいたします。 特に解答用紙については概念モデルの問題を解くときに有効となります。 itec様が用意している解答用紙を利用するとよいと思います。(A3印刷がおすすめです。) 
https://www.itec.co.jp/learning_download

たくさん過去問を解きこむとすごくお金がかかりますので、企業や学校などで受験される際 助成などがある場合はこういったものの印刷も助成対象としてもらえないか聞いて見るとよいと思います。

ちなみに私は3000円ほどかかりました。

# 終わりに

この記事では全体的な勉強方法を記載しました。

次の記事では「苦手」であった概念スキーマ問題について、このパターンね!というものを数点共有 できればと思います。

こちら→https://qiita.com/jun2/items/a0d265440746265e9846
「sympyで、変数に数値が、はいっているか、はいっていないかの判定方法を教えて下さい。」AI先生へ

# Chatgp先生へ
回答省略

・私のコード
Chatgp先生へ
```Python
from sympy import *
AC,CD,AD=symbols("AC,CD,AD",positive=True)
print(f"expr1 は数値か: {not AC.free_symbols}")  # False
print(f"expr3 は数値か: {not AC.free_symbols}")  # True
```
修正版コード
```Python
from sympy import symbols

# SymPyの記号を定義
AC, CD, AD = symbols("AC CD AD", positive=True)

# expr1 の数値チェック
print(f"expr1 は数値か: {not AC.free_symbols}")  # 結果: False

# expr3 を新たに数値に設定して数値チェック
expr3 = AC.subs(AC, 5)  # AC に数値 5 を代入
print(f"expr3 は数値か: {not expr3.free_symbols}")  # 結果: True
```
#### 私のvscodeでテスト
??? 難しい。
```Python
from sympy import symbols
AC, CD, AD = symbols("AC CD AD", positive=True)
print(f"expr1 は数値か: {not AC.free_symbols}")     # 結果: False
# AC = 5
# print(f"expr1 は数値か: {not AC.free_symbols}")     # 結果: False
# AttributeError: 'int' object has no attribute 'free_symbols'
```

# Gemini先生へ

# copilot先生へ
LINE WORKS API メッセージ送信 トークルーム指定 テキスト

# LINE WORKS API を使用してトークルームにメッセージを送信する

この記事では、LINE WORKS API を使用して、指定されたトークルームにテキストメッセージを送信する方法を解説します。

以下の URL で Google colab で簡単に試せます。
https://colab.research.google.com/drive/1upbNsY0RmgAQcUlJxTE3Zb1Y_U2SmDrN?usp=sharing

## 必要な準備

1. **LINE WORKS Developer Console での設定**
   - Bot を作成し、`Bot ID` を取得します。
   - Bot を対象のトークルームに参加させます。

2. **トークルーム ID の取得**
   - LINE WORKS トークルームの `CHANNEL_ID` を確認します。

3. **Access Token の発行**
   - LINE WORKS API を使用するためのアクセストークンを取得します。

## スクリプト

以下のスクリプトを使用して、トークルームにテキストメッセージを送信します。

```python
import requests
import json

# 必要な変数を入力
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"  # @param {type:"string"}
BOT_ID = 3725434  # @param {type:"integer"}
CHANNEL_ID = "753449a5-7716-39e4-3de9-770a97f1a5f5"  # @param {type:"string"}

# API エンドポイント
API_URL = f"https://www.worksapis.com/v1.0/bots/{BOT_ID}/channels/{CHANNEL_ID}/messages"

# メッセージの内容
message_content = {
    "content": {
        "type": "text",
        "text": "こんにちは、これはテストメッセージです！"
    }
}

# HTTP ヘッダー
headers = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json"
}

# POST リクエストの送信
response = requests.post(API_URL, headers=headers, data=json.dumps(message_content))

# レスポンスの確認
if response.status_code == 201:
    print("メッセージが正常に送信されました！")
else:
    print(f"エラーが発生しました: {response.status_code}")
    print(response.text)

```

### スクリプトのポイント

#### 必要なパラメータ

1. **`ACCESS_TOKEN`**
   - LINE WORKS API の認証に使用されるアクセストークンです。

2. **`BOT_ID`**
   - 使用する Bot の ID です。
   - LINE WORKS Developer Console から取得できます。

3. **`CHANNEL_ID`**
   - メッセージを送信する対象のトークルーム（チャンネル）の ID です。

### メッセージの構造

送信するメッセージは以下の形式を取ります。

- **`type`**
  - メッセージのタイプを指定します（例: `text`）。
- **`text`**
  - 実際に送信するテキストメッセージを指定します。

#### 例:
```json
{
  "content": {
    "type": "text",
    "text": "こんにちは、これはテストメッセージです！"
  }
}
```
### レスポンス例

成功時:
```plaintext
メッセージが正常に送信されました！
```

失敗時:
アクセストークンが無効な場合:
```plaintext
エラーが発生しました: 401 {"error":"Unauthorized","error_description":"Invalid access token"}
```

## 応用

- **多言語対応**
  - `i18nTexts` プロパティを追加することで、メンバーの言語設定に応じたメッセージを送信できます。
  
- **他のメッセージタイプ**
  - テキスト以外のメッセージ（スタンプ、テンプレートなど）にも対応可能です。

## まとめ

このスクリプトを使用すれば、LINE WORKS API を使ったトークルームへのメッセージ送信を簡単に行えます。ぜひ試してみてください！
DBスペシャリストを受験しました

# はじめに

前回の[AP試験の結果](https://qiita.com/jun2/items/17cf76f2038b8f938064)を受けてDBスペシャリスト試験を受けてきました。
結果はまだわかりません (12/26発表)→無事合格しました。
APの記事と同じく本記事は概要編となりますので、対策編の記事は最後にリンクをつけておりますので、そちらをご参照ください。

# 所感、難易度

思ったよりも戦えたと思います。
まずAM2 (AM1免除)、PM1はパスしたと思いますし、PM2は自己採点的には合格ラインをふらふらしている感じであったので、全然ダメダメではなかったかなと。
何せ高度試験であるため、今度こそだめならもう一回・・・と思っていましたが想像以上にやれるもんだなと。
一方、難易度としては対策をちゃんとしていればいずれ通るなという難易度と考えます。
DBを普段から触る方が大多数でしょうから、業務で不足している知識・経験値を補うだけでも十分戦えます。
また、普段からシビアな容量見積・パフォーマンス改善を求められるような方であればより有利だと思います。

一方、多くの人が好きな概念設計問題は出題のクセをつかむ必要があり対策、練習が必須と考えます。

# 当日気を付けたいところ

APの時と一緒なのですが、とにかく首肩をやられないように少しの休憩時間でもストレッチしまくりました。
また、個人差はありますが直前の追い込みはおすすめできません。
高度試験はAM2〜で考えても4時間超の長丁場です。
PM2が始まるころなど既に疲労がたまっており、頭はまだ動くか・・・？と自問自答をする始末です。
そんな中これ以上頭を疲れさせると後になって響いてくると思います。

これは私が逃避しているだけかもしれませんが、PM試験は特に時間との戦いでもあるため、少しだけ頭を休ませるような時間をとることができません。その為、休めるときは休むことをお勧めします。

# 終わりに

次回は試験対策編です。

そもそも合格したかわからない人の対策・・・?と思うかもしれませんが、ある程度の勝算あって臨んだものとなりますので多少は力になれると思います。 こちらからどうぞ→https://qiita.com/jun2/items/4e72688d2fbb356e9d9e
イノベーションを生む組織作りへの挑戦    ～異なる文化とつながりを活かして未来を創る～  

# イノベーションを育む組織作りへの挑戦  

こんにちは、TRAILBLAZERの植野です。私は半年ほど前に入社し、現在はエンジニア、UXデザイナー、プロダクトマネージャー（PdM）などが所属するソリューション事業部でマネージャーを務めています。

インターネット業界から鉄道関連企業へと転職した私が強く感じたのは、「組織のあり方」の違い。文化や構造の違いは、働き方だけでなく、イノベーションの生まれ方にも大きな影響を及ぼします。

本記事では、クリエイティブ人材が集うTRAILBLAZERでの経験を通じて、「イノベーションを育む組織作り」のヒントをお届けします。

---

## 雇用形態が生む組織文化の違い  

まず注目したいのは、インターネット企業と鉄道関連企業で異なる「雇用形態」の特徴です。この違いが組織文化や働き方に大きな影響を与えています。

### メンバーシップ型雇用：安定性を重視  
- **特徴**: 長期的な人材育成を目的に、多様な役割を担える仕組み。安定した品質のサービス提供が可能

### ジョブ型雇用：専門性に特化  
- **特徴**: 特定の職務にフォーカスし、効率的に成果を出すことを重視。高い専門性と生産性。  

---

## コミュニケーションの在り方が生む効果  

雇用形態の違いは、社内コミュニケーションにも表れます。

### メンバーシップ型組織のコミュニケーション  
縦方向の情報伝達が中心で、指示や報告の正確性を重視します。この仕組みは、サービスの安定供給に向いています。

### ジョブ型組織のコミュニケーション  
部署を超えた情報共有が活発で、SlackやNotionといったデジタルツールを積極的に活用します。横断的な連携がイノベーションを促進します。

---

## 多様な人材がイノベーションを生む理由  

異なる背景や専門性を持つ人材が集まることで、イノベーションの土壌が育まれます。

### 異なる視点が生む新しい発想  
UXデザイナーとエンジニア、リサーチャーとデータアナリストなど、多様な職種が連携することで、これまでにないアイデアや価値が生まれます。

### 心理的安全性が創造性を加速  
多様性を活かすには、心理的安全性が不可欠です。「意見が自由に言える」環境が、斬新な発想を支えます。

---

## イノベーションを促すネットワークの密度  

TRAILBLAZERでは、組織内のネットワーク密度を高めるため、以下の施策を実施しています：  

1. **横断的な1on1ミーティング**: 部署や職位を超えた対話の場を積極的に設定。  
2. **情報共有の透明性**: Slackの自己発信チャンネルやmiroの雑談ボードを活用し、情報発信を促進。  
3. **ハイブリッドな職場環境**: リモートとオフィス勤務を柔軟に組み合わせ、働きやすい環境を整備。  

---

## ハイブリッド型組織への挑戦  

メンバーシップ型雇用が提供する「安定性」と、ジョブ型雇用が持つ「柔軟性」を組み合わせることで、安定した運営と変革を両立する組織作りに挑んでいます。これにより、TRAILBLAZERでは、グループ全体で新しい価値を生み出す基盤を整えています。

---

## まとめ：未来を創る仲間を求めて  

イノベーティブな組織作りは、異なる文化や仕組みを理解し、それらを統合することから始まります。私たちTRAILBLAZERは、多様な人材の力を引き出し、ネットワーク密度を高め、広めることで、持続可能なイノベーションを実現しようとしています。

私たちと一緒に、未来を切り拓きませんか？新たな挑戦を共に進める仲間をお待ちしています。
Rを学びたい Step16 ポアソン分布

## はじめに
Rを学びたいStep16です。今回はポアソン分を学んでいきます！

## ポアソン分布とは
ポアソン分布は、一定の時間や空間内で発生する稀なイベントの回数を記述する確率分布。
	•	1時間に電話がかかってくる回数
	•	1kmの道路で発生する交通事故の回数
	•	サーバーに1秒間で届くアクセスリクエスト数

ポアソン分布は「平均的な発生率」がわかっているときに、具体的な回数を予測するのに役立ちます。

## ポアソン分布の公式

```math
P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!} 
```

```math

\begin{align*}
    &\bullet \ P(X = k): \text{単位時間・空間内に } k \text{ 回イベントが発生する確率} \\
    &\bullet \ \lambda: \text{平均発生率（単位時間・空間内の平均発生回数）} \\
    &\bullet \ k: \text{発生回数（} 0, 1, 2, \dots \text{）} \\
    &\bullet \ e: \text{自然対数の底（約 } 2.718 \text{）}
\end{align*}
```

## 問題

ある病院では、1時間に平均 3 人の救急患者が来院するとします。1時間にちょうど 5 人の救急患者が来る確率を求めなさい。


```math

P(X = 5) = \frac{3^5 \cdot e^{-3}}{5!}

```

```math
P(X = 5) = \frac{12.105}{120} \approx 0.100875
```

```R
# 平均発生率 λ = 3, 発生回数 k = 5
lambda <- 3
k <- 5
result <- dpois(k, lambda)
cat("P(X = 5):", result, "\n")
```

実行結果
```shell
P(X = 5): 0.1008188 
```
ミックスインするときのメソッド

# ミックスインできる　include
>include(*mod) -> self[permalink][rdoc][edit]
モジュール mod をインクルードします。
>
>[PARAM] mod:
Module のインスタンス( Enumerable など)を指定します。
...
>インクルードとは、指定されたモジュールの定義 (メソッド、定数) を引き継ぐことです。インクルードは多重継承の代わりに用いられており、 mix-in とも呼びます。

https://docs.ruby-lang.org/ja/latest/method/Module/i/include.html

# ミックスインして特異メソッドにする　extend
>extend(*modules) -> self[permalink][rdoc][edit]
引数で指定したモジュールのインスタンスメソッドを self の特異メソッドとして追加します。
>
>Module#include は、クラス(のインスタンス)に機能を追加しますが、extend は、ある特定のオブジェクトだけにモジュールの機能を追加したいときに使用します。
>
>引数に複数のモジュールを指定した場合、最後の引数から逆順に extend を行います。
>
>[PARAM] modules:
モジュールを任意個指定します（クラスは不可）。

https://docs.ruby-lang.org/ja/latest/method/Object/i/extend.html

### 特異メソッドとは
>特定のオブジェクトにだけ紐付くメソッドのことを特異メソッドと呼びます

https://gihyo.jp/book/2017/978-4-7741-9397-7

# ミックスインしてオーバーライドする　prepend
>prepend(*modules) -> self[permalink][rdoc][edit]
指定したモジュールを self の継承チェインの先頭に「追加する」ことで self の定数、メソッド、モジュール変数を「上書き」します。
>
>継承チェイン上で、self のモジュール/クラスよりも「手前」に追加されるため、結果として self で定義されたメソッドは override されます。
>
>modules で指定したモジュールは後ろから順に処理されるため、 modules の先頭が最も優先されます。
>
>また、継承によってこの「上書き」を処理するため、prependの引数として渡したモジュールのインスタンスメソッドでsuperを呼ぶことで self のモジュール/クラスのメソッドを呼び出すことができます。
>
>実際の処理は modules の各要素の prepend_features を後ろから順に呼びだすだけです。 Module#prepend_features が継承チェインの改変を実行し、結果として上のような処理が実現されます。そのため、prepend_features を override することで prepend の処理を追加/変更できます。
>
>[PARAM] modules:
prepend する Module を指定します

https://docs.ruby-lang.org/ja/latest/method/Module/i/prepend.html#:~:text=prepend(*modules)%20%2D%3E%20self,%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99

# スコープを決めたミックスイン　refine, using
>refine(klass) { ... } -> Module
引数 klass で指定したクラスまたはモジュールだけに対して、ブロックで指定した機能を提供できるモジュールを定義します。定義した機能は Module#refine を使用せずに直接 klass に対して変更を行う場合と異なり、限られた範囲のみ有効にできます。そのため、既存の機能を局所的に修正したい場合などに用いる事ができます。

https://docs.ruby-lang.org/ja/latest/method/Module/i/refine.html#:~:text=refine(klass)%20%7B%20...%20%7D%20%2D%3E%20Module,%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

>sing(module) -> self
引数で指定したモジュールで定義された拡張を現在のクラス、モジュールで有効にします。

https://docs.ruby-lang.org/ja/latest/method/Module/i/using.html#:~:text=using(module)%20%2D%3E%20self,%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
dockerのload metadataエラーを蹴散らす

## 問題
dockerでイメージを起動しようとするとload metadataエラーが発生する。
## 状況
使用パソコン：Macbook Pro（M3チップ）
事象：DockerFileとdocker-compose.yamlを記述し、docker compose upするとload metadataエラーが出る。
```
sudo docker compose up
[+] Building x.xs (x/x) FINISHED                                                                            docker:desktop-linux
 => [directory-name internal] load build definition from Dockerfile                                                        0.0s
 => => transferring dockerfile: 722B         
 => ERROR [directory-name internal] load metadata for docker.io/library/image-name
```
## 解決方法
以下のように最初にdocker pullでイメージを入手する。
```
docker pull docker.io/library/image-name
```
イメージを入手後、docker compose upすれば無事に立ち上がる。
## 終わりに
どうやらdocker imageがない状態から一気にやるとエラーが発生してしまうことが多いみたい。
dockerを久しぶりに使うたび色んなエラーが出てきてひたすらググってる気がする。
viteでhttp://**でサーバ起動する方法


package.jsonに下記を追加
  
  "scripts": {
    "dev": "vite --host",
    ...
  }

  npm run devで
  ➜  Network: http://***.***.*.**:5173/

http://***で起動しました
スマホのブラウで上記アドレスで表示もできます
ChatGPTにQiitaの記事執筆を手伝ってもらっている話

## はじめに

私はスマホアプリ開発が好きで、プライベートでいくつかのアプリをリリースしています。しかし、仕事ではスマホアプリ開発を行う機会がないため、仕事が終わった後のプライベートな時間を使ってアプリ開発に取り組んでいます。

また、私は学んだ内容を整理してQiitaの記事にしないと気が済まない性格をしており、アプリ開発を通じて得た知識や経験を記事としてまとめることも楽しみのひとつです。

しかし、プライベートの時間には限りがあり、すべての時間をアプリ開発や記事執筆に使うことはできません。このため、時間を効率的に使う方法を模索していました。

## 悩み事

プライベートな時間を使ってアプリ開発をしてみると、いくつかの悩みが浮かび上がってきました。主に以下のような悩みです。

- **アプリ開発はできるが、それを整理してQiitaの記事にする時間がない**  
  アプリ開発を進めていく中で、新しい技術や知識を学ぶことができます。しかし、その内容を後で整理してQiitaの記事にまとめる時間がなかなか取れません。記事を書くことが後回しになり、学びが消化不良になってしまうことがありました。

- **仕事の疲れを癒す時間が取れない**  
  仕事が終わってからアプリ開発を進めるため、どうしても疲れが取れず、休息の時間が足りません。さらに、Qiita記事の執筆に追われると、リフレッシュする時間がほとんど取れません。

- **Qiitaの記事書くので運動する時間が取れない**  
  記事を執筆する時間が長くなると、運動する時間が取れなくなり、健康に良くないと感じていました。アプリ開発や記事執筆に集中しすぎて、体調管理がおろそかになってしまうことも悩みでした。

## 解決策

これらの悩みを解決するために、私は**ChatGPT**を活用して作業効率化を目指し、時間を作ることにしました。具体的には、私はプログラミングを行う際に、**ChatGPTに質問をしながら実装を進め**、最後に得た知識や実装内容を**Qiitaの記事としてまとめてほしいとChatGPTに依頼する**という方法を試しました。

### 手順

以下の手順で進めることで、記事作成にかかる時間を大幅に短縮することができました。

1. **ChatGPTに聞きながら実装を進める**  
   アプリ開発を進めていく中で、疑問点や問題が生じたら、その都度ChatGPTに質問をして解決します。例えば、「PythonでXXを実装するにはどうすればいいか？」や「このコードを効率的に書く方法を教えて」といった具合です。

2. **上記の内容をQiitaの記事にしてほしいと依頼する**  
   実装を終えた後、「この内容をQiitaの記事としてまとめてほしい」とChatGPTに依頼します。具体的な目次や構成を伝えると、ChatGPTがマークダウン形式で記事を作成してくれます。

3. **ChatGPTが作成した記事を見ながら動作確認・文言の修正**  
   ChatGPTが生成した記事を確認し、動作確認や必要な修正を行います。例えば、コードが実際に動くかのテストをし、正しい動作をしているか確認します。また、文章が自分の意図に合っているかを修正します。

4. **Qiitaに投稿する**  
   修正が完了したら、完成した記事をQiitaに投稿します。これで、アプリ開発の学びを整理し、効率よく記事として公開できるようになりました。

このプロセスにより、従来の倍近くのスピードで記事を執筆することができ、時間を効率的に使えるようになりました。

## 具体例

実際に、私はあるアプリでPythonを使った機能を実装していた際、以下の流れでChatGPTを活用しました。

1. **ChatGPTに質問**  
   「PythonでXXのライブラリを使って、機械学習する方法を教えて」とChatGPTに依頼。質疑応答を繰り返し、実装を完了しました。

2. **ChatGPTに記事作成を依頼**  
   「上記の内容を、以下の構成でQiitaの記事としてまとめてほしい」と依頼。
   - はじめに（背景と目的）
   - 動作環境（必要なライブラリやインストール手順）
   - 実装の準備（データの準備方法）
   - 実装（コードとその解説）
   - おわりに（まとめと今後の展望）

   ChatGPTは、依頼内容を元に、Qiitaに投稿する文面を提案してくれました。

3. **動作確認・修正**  
   提案された文面に基づいて、実際に動作するコードを確認し、少し手を加えて文章を修正しました。

4. **Qiitaに投稿**  
   最後に、修正を加えた内容をQiitaに投稿。わずか1〜2時間で、クオリティの高い記事が完成しました。

## おわりに

ChatGPTを使ったQiita記事執筆の効率化により、プライベートの時間でアプリ開発を行いながら、同時にその内容をQiitaに整理することができ、知識の定着と記事執筆にかかる時間を大幅に短縮できました。

もし、同じ問題に直面していたら（いなくても）、今よりもっと多くのQiita記事を書きたいと考えているなら、ChatGPTを活用してみることを強くお勧めします。

プライベートの時間を有意義に使い、人生を豊かにしましょう！
それではまた！
HT82K629Bを使ってプログラマブルキーボードを作る

## はじめに
プログラミング不要でキーボードを作ることができると話題のHT82K629Bを使って，プログラマブルキーボードのように好きなキーを入力できるデバイスを作ってみました。

:::note info
RaspberryPiでGPIOを制御する方法については本記事では割愛します。RaspberryPiのGPIOはPythonやNode-REDなど様々な方法を使って制御することが可能です。
:::

## HT82K629Bとスイッチのみでキーを入力する
HT82K629BはUSBケーブルでPCと接続し，入力の端子の組み合わせをショートするだけで対応するキーを入力することができるICです。HT82K629Bを基板に実装して販売されているモジュールもあります。
今回は基盤として販売されている「[キーボード実験基板(表面実装版・完成品)【MR-KEYBOARDV2】](https://www.marutsu.co.jp/pc/i/2712063/?srsltid=AfmBOor2BkDIHAacibl_0TxRk-uvWJD0u7MRMxw7rVtwZxjkmMNYVbYk)」を使用しました。使い方は非常に簡単でUSB端子をケーブルでPCにつないだうえでC列とR列の端子をショートさせるだけで対応するキーが入力されます。
端子とキーの組み合わせは[マニュアル](https://www.holtek.com/webapi/116711/HT82K629Bv110.pdf)に記載があります。

![pict01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934590/4cb775ef-3454-b24d-bd6a-1ec80ef96726.png)

## HT82K629BをRaspberryPiで制御する
RaspberryPiのHigh/Lowの信号を使ってHT82K629BのC列とR列の端子をオープン/ショートを制御することで，RaspberryPiを使ってキー入力の操作ができます。
High/Lowの信号をオープン/ショートに変換するためにはアナログスイッチを使用します。

![pict02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934590/ad8129a5-75a7-e529-a33c-3c5c155a977d.png)

## 複数のキーを同時に入力する
HT82K629BはC列とR列の複数の端子の組み合わせをショートさせることで複数のキーを同時に入力することが可能です。例えば「Ctrl + C」はC0-R6とC3-R4，「Ctrl + P」はC0-R6とC11-R0をショートさせます。ショートさせるタイミングはキーボードを抑えるときと同様に①C0-R6をショート(Ctrlキー押下)②C3-R4をショート(Cキー押下)の順番で制御します。

![pict03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934590/4a262e11-606b-a1ab-2944-79f8a41adfd7.png)

## RaspberryPiを使って全てのキーを入力するには
このモジュールはC列が20端子，R列が8端子あるので入力可能なキーの組み合わせはトータル160個になります。一方でRaspberryPiで使用できるGPIOの数は26個なので各GPIO1つでそれぞれの1つのキー入力を制御しようとすると，最大26個のキーしか同時に制御できません。
そこで，ラッチ回路とデコーダを使用することで少ないGPIOで多くのキーの組み合わせを制御することができるようになります。
以下は回路構成例になります。

![pict04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934590/bf213e16-cbf1-12fc-e0a2-7859be5be23a.png)

他にもシフトレジスタを使う方式で制御が可能です。
あとはスイッチの入力をRaspberryPiのGPIOに接続することで，スイッチを押すと特定のキーを押すプログラマブルキーボードを作ることができます。

## 作ってみた
今回はHT82K629BとRaspberryPi，ロジックICを使ったプログラマブルキーボードの作り方を紹介しました。このプログラマブルキーボードのメリットは，接続したPCには専用のプログラムなどをインストールする必要なく，HT82K629Bがキーボードとして認識されれば使用できる点です。
この回路ではキーの同時押しだけでなく，
①「Win」キーを押下
②文字列を入力してアプリケーションを検索
③実行(「Enter」キー押下)
のような連続したキー操作も可能です。
また，上記構成で実際には組み上げた回路が以下写真になります。(これは「A」キーと「Shift」キーのみを制御する回路です。160個のキーを同様に制御すると回路はもっと巨大になります。)動画は小文字の「a」と大文字の「A」を交互に打ち続けるように設定したときのものです。

![pict05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934590/85914e86-d491-be3c-03e8-4febc8ed3b6b.jpeg)

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934590/02e4a676-038c-115f-8ba3-2cff92579e9d.gif)
【JavaScript】なんで、var や let じゃなくて const を使用した方が良いの? 

## はじめに

よく、const を使え、var は論外みたいな話を聞きますが
具体的に各宣言の特性を明確に説明できる人は意外と少ないのではないでしょうか。

というわけで、今回復習を兼ねてまとめて行きます。

## 各宣言の特性

以下の図を見れば、概要がわかると思います。

| 宣言         | var          | let              | const            |
| ------------ | ------------ | ---------------- | ---------------- |
| 再代入       | 可能         | 可能             | 不可             |
| 再宣言       | 可能         | 不可             | 不可             |
| スコープ     | 関数スコープ | ブロックスコープ | ブロックスコープ |
| 繰り返し構文 | 可能         | 可能             | 不可             |

詳細については以下で説明します。

### var

ES 2015 で let と const が導入されるまでは、変数宣言の手段は var のみでした。
そのため、一昔前のコードを見ると、var が使われていることが多いです。

ですが現在ではほとんど使用されません。
var は古い構文のため、let や const で宣言された変数とは少し異なる特徴があります。

ブロックスコープに属さないという点です。

```javascript
if (true) {
  var hoge = "fuga";
}

console.log(hoge);
```

上記を実行すると...

```console
fuga
```

ブロックスコープ外から呼ばれてしまいますね...

### let

let はブロックスコープを持ち、再宣言ができません。

```javascript
// 再宣言不可のため、エラーが発生します。
let hoge = "fuga";
let hoge = "piyo";

// 以下のような再代入は可能です。
let fuga = "fuga";
fuag = "piyo";

// ブロックスコープ
// 以下のコードはエラーが発生します。
if (true) {
  let hoge = "fuga";
}
console.log(hoge);
```

### const

再代入も再宣言でもできない、定数を宣言するものです。

```javascript
// 再代入も不可能のため、エラーが発生します。
const hoge = "fuga";
hoge = "piyo";
```

ただ、オブジェクトの中身を変更することは可能です。

```javascript
const author = {
  name: "芥見下々",
  age: 32,
};

author.name = "尾田 栄一郎";
author.age = 49;

console.log(author); //{ name: '尾田 栄一郎', age: 49 } が出力される
```

## 結論
- `var` は使わないで!
- 再代入が必要な場合は `let` を使用しても OK 
- 再代入が不要な場合は、`const` を使用しましょう！



## 参照

https://gihyo.jp/book/2022/978-4-297-12747-3

https://qiita.com/cheez921/items/7b57835cb76e70dd0fc4

https://techplay.jp/column/1619
NetflixのSystem Designを眺めてみた

ジョブカン事業部のアドベントカレンダー11日目です。

ジョブカン経費精算/ジョブカンワークフローの開発を担当している@imadon2024 です。
アドベントカレンダー投稿は初になりますので、暖かい目で見て頂ければ幸いです。

# はじめに

時間を無限に奪っていくNetflixの有料会員数は、2024年第2四半期時点で約2億7765万人だそうです。

こんな膨大なユーザを楽しませるプラットフォームはどんな構成で動いているのか気になりまして、ちょっとだけ眺めてみました。

# System Design

System Designから眺めてみました。

![Netflix_system_design.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918156/8e592590-883d-0ed9-44c0-2487f0d69919.png)

元記事
https://medium.com/javarevisited/10-system-design-lessons-from-netflixs-architecture-19ece2191a03

システムを眺めている中で、個人的に見たことのないソフトウェアを利用してましたので、少し調査。

---

[Chaos Monkey](https://netflix.github.io/chaosmonkey/)

https://www.publickey1.jp/blog/12/chaos_monkeynetflix.html

> Amazonクラウド上のインスタンスをランダムに落としまくることで、サービスに対して仮想的な障害を引き起こしてくれます。

すごいなこれ。初めから障害に強いシステムを構築できそう。SLOとかの指標調査にも使える。

---

[Titus](https://netflix.github.io/titus/)

https://www.publickey1.jp/blog/18/netflixtitus.html

> Titusはサービスとバッチのいずれの処理にも対応します。サービス処理では、異常終了したインスタンスに対してフェイルオーバー処理が行われ、また負荷に応じてオートスケールが働きます。バッチ処理ではポリシーに応じて処理の失敗に対してリスタートが行われ、処理完了まで管理されます。

1週間で300万（2018年実績）もコンテナ起動してたら、どうにか自動化したくなりますよねぇ。

[Hystrix](https://github.com/Netflix/Hystrix)

https://takezoe.hatenablog.com/entry/2016/06/17/082235

> 例えば外部サービスに障害があり呼び出しがエラーになる場合や、処理に時間がかかった場合にフォールバック値を返すことで呼び出し元の処理を継続できたり、外部サービスの呼び出しでエラーが多発する場合は一時的に呼び出しをショートカットして呼び出し先の回復を待ったりといった制御を行うことができます。

一時縮退させてサービスを継続させる感じですかね。となると、レジリエンスの向上に使っているんでしょうか。

何れもNetflixのソフトウェアで、オープンソースのようです。

# Tech Stack

これ本物かな、と思うほど詳らかに技術スタックが公開されていたのでついでに。
この方、ByteByteGoの共同創業者だそうで。

![Netflix_tech_stack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918156/cfda4f0d-3205-4333-45ea-cbd079eaeeba.png)

元記事（X投稿）
https://x.com/alexxubyte/status/1824472446654878007

BackendでJava（spring boot）を利用しているのが興味深いですね。
皆さんご存知の通り実績のある言語ですが、固いサービス（金融とか）での利用が多いイメージで、Netflixで利用しているのは意外、という所感でした。

動画配信サービスではありませんが[ZOZOもJava採用してるし](https://techblog.zozo.com/entry/20230323-tech-meetup-java)、Javaは根強いですね。

とはいえ、[NETFLIX ZUUL](https://github.com/Netflix/zuul)とか、[NETFLIX EUREKA](https://github.com/Netflix/eureka)とか、より良い形での最適化を行なっている姿勢が見受けられます。

---

[NETFLIX ZUUL](https://github.com/Netflix/zuul)

https://netflixtechblog.com/announcing-zuul-edge-service-in-the-cloud-ab3af5be08ee

---

[NETFLIX EUREKA](https://github.com/Netflix/eureka)

https://atmarkit.itmedia.co.jp/news/201209/10/eureka.html

---

これに加えて、安定稼働にはキャパシティ管理だったりセキュリティ対策だったりが肝になってきますが、どこかに情報がないかなぁ。

# 最後に

Netflixだけではなく、気になるシステムがあれば眺めてみて、気になるところがあれば色々調べてみることで後々のキャリアに活かせると思いますので、皆さんもお時間があれば眺めてみるのも一興です。

## 余談

Netflixがレンタルビデオ屋から世界有数の動画配信プラットフォームにDX化したストーリーは[DX経営図鑑](https://www.amazon.co.jp/DX%E7%B5%8C%E5%96%B6%E5%9B%B3%E9%91%91-%E9%87%91%E6%BE%A4-%E4%B8%80%E5%A4%AE/dp/4757436785)に載ってたりしますので、気になる方はご覧になってみてくださいまし。

# お知らせ

DONUTSでは、新卒中途を問わず積極的に採用活動を行っています。
我々ジョブカン事業部も、一緒に働くエンジニアを募集しています。気になる方はお気軽に応募してみてください。

https://www.donuts.ne.jp/recruit/

https://recruit.jobcan.jp/donuts/show/B001/1396297