OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】フォルダ検索&取得

この記事は[Unreal Engine (UE) Advent Calendar 2024 シリーズ4の20日目](https://qiita.com/advent-calendar/2024/ue)の記事です。

こちらの記事は、[シリーズ2の19日目](https://qiita.com/_akoto_/items/d0d575290ed9d9518cda)の内容を、**Python**で書き直したものです。
**Python**だと、こういう書き方を出来ますという参考にしていただければと思います。


# 検証環境
UnrealEngine5.3.2

# ブループリントのサンプル

実行テストに使ったブループリントの図です。赤いノードの中身だけ書き換えてテストしています。

![実行したブループリントの図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/3725c06b-a7cc-281f-7d6d-6a754d228f22.png)


# サンプルコード①
**FindFolder** をPythonに直したサンプルコードです。

```:python
#
# FindFolder
#
def FindFolder(level_sequence, folder_name):
    rootFolders = level_sequence.get_root_folders_in_sequence() 
    
    for rootFolder in rootFolders :
        name = rootFolder.get_folder_name()
        if folder_name == name:
            return rootFolder
        
        for childFolder in rootFolder.get_child_folders():
            name = childFolder.get_folder_name()
            if folder_name == name:
                return childFolder
    return None

```


# サンプルコード②

**FindFolder_v2** をPythonに直したサンプルコードです。

```:python
#
# FindFolder_v2
#
def FindFolder_v2(level_sequence, folder_name):    
    rootFolders = level_sequence.get_root_folders_in_sequence() 
    
    for rootFolder in rootFolders :
        name = rootFolder.get_folder_name()
        if folder_name == name:
            return rootFolder
        
        for childFolder in rootFolder.get_child_folders():
            name = childFolder.get_folder_name()
            if folder_name == name:
                return childFolder
    
    # フォルダを新規作成
    return level_sequence.add_root_folder_to_sequence(folder_name)
```


# サンプルコード③

**FindFolder_v3** と **SerchChildFolder** をPythonに直したサンプルコードです。

```:python
#
# FindFolder_v3
#
def SerchChildFolder(scene_folder, folder_name):
    resultFolder = None
    
    if scene_folder != None:
        for childFolder  in scene_folder.get_child_folders():
            name = childFolder.get_folder_name()
            if folder_name == name:
                return childFolder
            else:
                resultFolder = SerchChildFolder(childFolder, folder_name)
                if resultFolder != None:
                    return resultFolder
    
    return resultFolder

def FindFolder_v3(level_sequence, folder_name):
    rootFolders = level_sequence.get_root_folders_in_sequence() 
    
    for rootFolder in rootFolders :
        name = rootFolder.get_folder_name()
        if folder_name == name:
            return rootFolder
        
        childFolder = SerchChildFolder(rootFolder, folder_name)
        if childFolder != None:
            return childFolder
    
    return None
```

# 最後に

理解度の向上も兼ねて、C++のコードをPythonに置き換えてみました。
Pythonの方を書く人も結構居るみたいなので、こちらの方が、需要があるかも知れません。
Swiftの標準入力、入力値のアンラップ

## はじめに
paizaだと、標準入力時のアンラップに```!```使いがちで、
他の方法を使わなくなってしまいそうなので、網羅しておきます。
下記で書いたけど、忘却しました。。。

https://qiita.com/peco4107/items/ff7fc7cb8ec18511d311

## 問題
https://paiza.jp/works/mondai/stdin/stdin_n_line

## 標準入力
https://developer.apple.com/documentation/swift/readline%28strippingnewline%3A%29
```swift
func readLine(strippingNewline: Bool = true) -> String?
```
パラメータ
```
strippingNewline
```
説明
```
trueの場合、結果から改行文字や改行文字の組み合わせが削除されます。
falseの場合、改行文字やその組み合わせは結果に含まれます。
デフォルト値: true
```
戻り値
```
型: String?（オプショナルの文字列）
```
説明:
```
標準入力から読み取った文字列を返します。
入力がない場合、nilを返します。
```
## アンラップ
### if let
```swift
let n = Int(readLine()!)!

var lines: [String] = []

for _ in 0..<n {
    if let line = readLine() {
        lines.append(line)
    }
}

for a in lines {
    print(a)
}
```
### guard let
```swift
let n = Int(readLine()!)!

var lines: [String] = []

for _ in 0..<n {
    guard let line = readLine() else {
      continue
    }
    lines.append(line) 
}

for a in lines {
    print(a)
}
```
### 強制アンラップ
```swift
let n = Int(readLine()!)!

var lines: [String] = []

for _ in 0..<n {
    var line = readLine()!
    lines.append(line)
}

for a in lines {
    print(a)
}
```
:::note info
メモ
```readLine()```は入力がない場合、nilを返すことを念頭に置くと、
```var lines: [String] = []```で既に```nil```を配列からはじいてるので、
```while let```使った方が楽かもしれないとわかりました。
入力が```nil```になると自動で```while```が```false```になって、繰り返しが止まってくれるため。
```swift
var lines: [String] = [] // [String?]じゃないので、nil入らない

while let line = readLine() {
    lines.append(line)
}
```
:::
サービスでなく技術で解決してほしいと感じた話

先日とあるネットバンキングにて住所・電話番号の登録変更を申し込んだ時の話。
結論のみご覧になりたい方は最後のみお読みください。

----

# 事の始まり
メインバンクでなかったこともあり、実家の情報のまま使っていました。
久しぶりに用事があり、アプリを開いたところ電話番号の認証を求められ実家に手設定をする手間が発生したため、登録を更新しようと作業を始めました。
いやいやながら作成したマイナンバーカードを使い簡単に変更できるかと思いきやこれが全くの期待外れに。
前提として私は視覚に障害があるため画面を見るということができません。

# 要求された操作
本人確認として以下3つの写真撮影を求められました。
- マイナンバーカードの表面
- マイナンバーカード表の斜め45度からの写真
- 顔写真
マイナンバーカードの撮影は自動でシャッターが切られるとのことでなんとかできるかと複数回試みましたが、全くできませんでした。
後から知ったのですが、カードはICチップがある面が裏とのこと。
私はクレジットカードやキャッシュカード同様こちらを表と思って撮影していました。
申し込みの際名前の点字での印字の選択があり、申し込みました。
この点字もICチップと同じ面であったため、こちらを表と誤認識していました。
ちなみにゆうちょ銀行のキャッシュカードはこのようになっています。

# そもそもの話
今回の変更の前に生体認証ログインのためにマイナンバーカードでの本人確認をしました。
- いくつかのマイナンバーカード登録情報の入力
- カードのタッチ
- 顔写真の撮影
で完了できました。
顔写真の撮影は自動フォーカスでこちらでシャッターを切る必要もなく数回のチャレンジで済みました。
同じアプリですが、生体認証の登録はカードのタッチで、登録情報の変更は撮影でとなぜか異なりました。
そもそも生体認証登録をしただけで本人確認ができているのでは、とも思いました。

# コールセンターに問い合わせ
事情を説明し、代替案、もしくはその場での変更を求めましたが、応じていただけませんでした。
- 家族など周囲の人間の協力
- 来店しての申し込み
のみが提案されました。
いずれもできない提案ではありませんでしたが、別案を要求。
これに応じられないケースが気になった、というのが理由です。
結果、支店に直接問い合わせを指示されました。

# 支店への問い合わせ電話
コールセンターから申し送りが住んでいると聞いていましたが、
経緯が伝わってなく1から説明。
ここでの提案もコールセンター同様でした。
いずれも難しいことを伝え、折り返しの電話を待つことに。
結果、電話の主が訪問してアプリの操作、つまり撮影を補助することとなりました。
この時点では知りませんでしたが、応対していたのは支店長でした。

 # 訪問サポート
正直訪問いただいてもすんなり完了するとは思っていませんでしたが、案の定そうなりました。
基本操作はこちらで行い、撮影の補助のみするという前提で始めました。
最初の写真は撮れましたが、
少しぼやけているということでやり直しを。
しかしそのボタンがスクリーンリーダーでフォーカスできず自力では押せませんでした。
その後も顔写真の撮影では自分で撮影ボタンを押す必要がありましたが、
こちらもフォーカスせず自力では操作できませんでした。
そして撮影後もカードの写真との照合が通らず数回撮影をやり直しました。

# 結果
変更の反映は数日後ということで訪問サポートは終了。
そしてとどいた結果は内容に不備があるとのことで完了しませんでした。
現在家族への協力依頼か支店に赴くか対応を検討中です。

# まとめ
今回の対応はアプリの改善ではなく人を派遣するサービスによる形式でした。
しかしこれが正解とは私は思いません。
なぜならこの問題は技術で解決が可能です。
途中にも書きましたが、マイナンバーカードはICチップを読み取り本人確認が可能です。
この方法であれば画面が見えなくとも本人確認が完了できます。
仮に撮影を必用とする場合でもAIを用いて撮影をガイドする機能を付加できます。
以下のアプリがその1例です。
[Seeing AI - Talking Camera for the Blind](https://www.seeingai.com/)
こういった設計をしていれば人を派遣するサービスは必ずしも必要ではなくなります。
人が行っていたことをアプリやAIが解決できる世の中になっています。
とくに大手のサービスにはこの辺を意識していただきたいものです。
大手が代わることで他社の対応にも影響が及ぶと考えています。
今一度プロダクトの見直しをしていただきたいと切に願います。
Elixirチートシートを作ろう、番外編その１　Elixir イミュータブルについて、誤解していたお話

# 1. Over View
どもども、Elixirチートシートを作ろう、番外編その１であります

Elixir イミュータブルについて、誤解していたと思うのでまとめてみました。


# 2. さて、本題

変数は、僕の知る他の言語のように変数に割り当てられたメモリが書き換わらないだけ、と考えていたのですが、大きな考え違いをしている気がしてきました。

イミュータブルなのは、変数ではなくて、値自体だと考え直しました。

なので、普通のプログラミング言語のように、a = a + 1のような処理はできますが、これは、aのバインド先が変わるだけなので、どんどんメモリ上に結果が1, 2, 3, ...と増えていきます。

例1）
|行番号|命令|
|:-----|:------------|
|1|A = 1|
|2|A = A + 1|

この場合、1行目で、Aと1という値がバインドされる。2行目で、A + 1の結果である2とバインドされる。

C言語のように、変数Aのために確保されたメモリ領域が書き換わるわけではない。

ここまでで、ずいぶんと非効率だな、と頭を悩ませていたのですが、値はすべて書き換わらないのだから、これはリストなどを処理するのには、逆に効率が良い。

例2）
[2, 3] -> この値の先頭に、1を追加する場合は、以下のように書きます。

```
iex(23)> b = [2, 3]
[2, 3]
iex(24)> b = [1] ++ b
[1, 2, 3]
```

こいつを命令単位にバラすと、以下の様になります。

|行番号|命令|
|:-----|:------------|
|1|b = [2, 3]|
|2|b = [1] ++ b|

※List.insert_at(b, 0, 1)でも一緒

1行目の処理を終えた後、2行目では、変数bに、新たに1, 2, 3というリストをコピーすると考えて、非常に効率が悪い気がしていたのですが、実際には、リスト[2, 3]の先頭に要素1を加えたリストにバインドするだけだと気づきました。

 変更前のbのリスト型の構造

|変数|中身|
|:-----|:------------|
|b |[2, 3]|
|bのhd |2にバインドされている|
|bのtl|3にバインドされている|


変更後のbのリスト型の構造

計算の右辺の結果が、以下のリストとして作られる。

|変数|中身|
|:-----|:------------|
|hd|1にバインドされる|
|tl|[2, 3]（今までのb）にバインド|

b = [1] ++ bと書いているので、このリストが、bにバインドされ直す。

|変数|中身|
|:-----|:------------|
|b| [1, 2, 3]|

要するに、LISTの中身をbindしている先を切り替えるだけで、別にlistを再作成しているわけでもない。
イミュータブルなおかげで、少ない手数でリストがコピーできるので、ガンガン、 b = [1] ++ bと書いてよいのだな開き直りました。

補足）ついでに、Elixirでは、リストの先頭に挿入する方が、コストが安い。
URLをつかってレコード情報を制御してみる

# はじめに

こんにちは。株式会社SuiteUP(スイートアップ)代表取締役の、平木 太郎と申します。
ゆっくりしていってね！！！

さて、NetSuiteは、非常に便利なERPです。
ただ、便利は便利なのですが、発想の転換をすることで、カタログスペック以上の力を発揮できます。
なので「どうにかして便利に使ってやろう」という発想が、NetSuiteを使う上で重要だと私は考えています。
（トンチを利かす、とか裏技見つけ出す、とも言う）

とはいえ、実例が無いとピンとこないかもしれませんので、今回は「URLを使ったレコード情報の制御」として、その一端をご説明させて頂きます。
正直、真っ当な使い方とは言えませんが、プログラマ以外の方には簡単で便利と言えるかもしれません。

注意）6年前から使えることは知ってますが、裏技過ぎていつまでも使えるとは思えないので、その点はご留意下さい

# 1.大前提としての”NetSuiteのURLの仕組み”

基本的には、httpsリクエストのGETで制御することが出来ます。
GETとは、URLに
　　**パラメータ名=パラメータ**
を追記すると、遷移先に対してパラメータを渡してあげる機能のことです。(複数のパラメータ名を使うときは&で繋げる)
もちろん、遷移先でこのパラメータを受け取る仕組みは必要なのですが、そこはプログラマ向けのお話なので割愛します。

具体的な例をお見せします。
下記の画像は、NetSuiteの見積書トランザクションの画面です。
ChromeのURL欄には、この見積書の内部ID129130がGETのパラメータとして、以下のように記述されています。
　　**id=129130**

![Estimate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953750/ed81a42a-ca83-3d92-fcdc-8b559d4161c2.png)

次に、この見積書の中の”受注書”ボタンをクリックして、注文書トランザクション（以下、「トラン」）を生成してみます。
すると、URLの中に、以下のGETパラメータが設定されています。
　　**transform=estimate&e=T&id=129130**

![SalesOrder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953750/33acaa43-5d6b-3788-d62a-488affe3faae.png)

これは、以下を意味します。
　transform=estimate　　：この注文書トランは見積書トランから生成されたもの
　e=T　　　　　　　　　：編集モードで開きなさい
　id=129130　　　　　　：元となったトランレコードの内部IDは129130

これがNetSuiteのURLの記述ルールなのです。
（基本的に、であって、他のレコードタイプでは、また別のルールもあります）

# 2.では、どうやってURLでレコード情報を制御するのか？

極端なことを言えば、上記のパラメータの値を変えてあげるだけで、任意の画面を(限度はあるものの)好きなように開くことが出来るのです。
あるいは、このURLを覚えて開けば、先程の見積書の”受注書”ボタンをクリックしなくても、同じ内容の注文書トランをいくらでも生成できるのです。

実際に、発注書トランから注文書トランを作る、という無茶苦茶なルールでGETパラメータを設定、そしてURLを開いてみましょう。
（関係会社間取引で出来ますが、それとは違う形）

　transform=purchord
　e=T
　id=135336

![SOfromPO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953750/125630b6-bf46-f428-e82a-0838a9be4e69.png)

...これでも出来ちゃいます。
流石に作成元フィールドの”発注書”は保存後に消滅しますが、アイテムラインを引き継ぐことは出来ます。
特注とは違うけど発注先行で受注データを作る、ようなお客様には使える技かもしれません。

余談ですが、

　https://[NetSuiteアカウントID].app.netsuite.com/app/accounting/transactions/**estimate**.nl?id=129130
 
ですが、

　https://[NetSuiteアカウントID].app.netsuite.com/app/accounting/transactions/**transation**.nl?id=129130
 
としても、NetSuiteが自動的にリダイレクトしてくれて、estimateに転送してくれます。
内部IDだけ知ってるけど、トランの種類がわからないときなんかに使える技です。
トランの内部IDがユニークだから出来る技ですね。

# 3.リンクが動的になるよう作ってみよう

例えば上記の発注書トラン、あるいは他のトランから注文書トランを作るURLは、自動生成させないと、実運用には耐えられません。
また、1発注書ごとにリンクを作ることも妥当とは言えないでしょう。
そこで、SuiteBuilderのカスタムボディフィールドを作る機能と組み合わせます。

![SuiteBuilder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953750/f267eddb-b9d6-41fb-38f3-0e4faa398cb7.png)

`'<a href="https://1981313.app.netsuite.com/app/accounting/transactions/salesord.nl?memdoc=0&transform=' || {type} || '&e=T&id=' || {id} || '&whence=" target="_new">注文書作成</a>'`

これだけで、SuiteScriptを使ってボタンで画面遷移させる、に匹敵することが実現できるのです。
（もちろん見かけは以下のようにショボいですが…）

![Vendorbill.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953750/290ac070-b3b0-c3e7-2ff8-39967537c37f.png)

# 4.最後に

いかがでしょうか。
皆様もNetSuiteの様々な裏技を見つけて、是非便利に使ってみて下さい。
ボタンをクリックしたら星が飛び散るようなアニメーションをする

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はAnime.jsを使用してクリックした時にアニメーションが走るようなボタンを作成してみようと思います。

Next.jsとTailwindCSSを使用します。

# インストール

以下コマンドでインストールします。

```
npm install animejs --save
```

# 実装

```tsx
import React, { useRef, useState, useEffect } from "react"
import anime from "animejs"

export const AnimeButton = React.memo(function AnimeButton() {
  const [stars, setStars] = useState<
    { id: number; x: number; y: number }[]
  >([])
  const containerRef = useRef<HTMLDivElement>(null)

  const handleClick = () => {
    if (!containerRef.current) return

    const containerRect = containerRef.current.getBoundingClientRect()
    const x = containerRect.width / 2
    const y = containerRect.height / 2

    // 新しい星を追加
    const newStars = Array.from({ length: 10 }, (_, i) => ({
      id: Date.now() + i,
      x,
      y,
    }))
    setStars((prevStars) => [...prevStars, ...newStars])
  }

  useEffect(() => {
    if (stars.length > 0) {
      stars.forEach((star) => {
        anime({
          targets: `#star-${star.id}`,
          translateX: {
            value: () => Math.random() * 200 - 100, // -100〜100のランダムなX方向
            duration: 1000,
          },
          translateY: {
            value: () => Math.random() * 200 - 100, // -100〜100のランダムなY方向
            duration: 1000,
          },
          opacity: {
            value: 0,
            duration: 1000,
          },
          easing: "easeOutQuad",
          complete: () => {
            setStars((prevStars) => prevStars.filter((s) => s.id !== star.id))
          },
        })
      })
    }
  }, [stars])

  return (
    <div
      ref={containerRef}
      className="relative flex h-screen items-center justify-center bg-gray-100"
    >
      <button
        onClick={handleClick}
        className="rounded-lg bg-blue-500 px-6 py-3 font-semibold text-white shadow-lg transition-all hover:shadow-xl"
      >
        Click Me!
      </button>
      {stars.map((star) => (
        <div
          key={star.id}
          id={`star-${star.id}`}
          className="absolute size-2 rounded-full bg-yellow-400 shadow-md"
          style={{
            left: star.x,
            top: star.y,
          }}
        ></div>
      ))}
    </div>
  )
})

export default AnimeButton

```

こんな感じにしました。

ボタンを押した時に黄色い玉をボタンの真ん中からランダムな方向に飛ばすようなものを作成しました。

# 動かしてみる

![starbutton.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/1cb05823-aaaf-80ed-14b9-13042696c4a6.gif)

こんな感じで面白いボタンが出来上がりました。



# おわりに

アニメーションを簡単に作成できるので、自分のサイトを豪華にしたい時に使えそうです。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://animejs.com/

https://github.com/juliangarnier/anime/
# 冷凍機械責任者２種（２冷） 受験対策

# 受験経緯
仕事のシステムで冷凍機に関わることが少なくないので。
また、会社に備わる設備とその基礎を理解しておきたかった。

そういった目的から、３冷がメジャーな資格ではあるが、学識という科目がプラスされている２冷にした。

※ただ、実際に受験すると２冷だと計算が少なくもの足りない印象は持った。
※ある程度学力があり、冷凍機の学習に関して本気度が高い人は１冷がいいと思う。


# テキスト
・【過去問】 ６年分×２（12年分）　←　傾向が徐々に変わるので直近６年でも充分かも知れない。
・【テキスト】よくわかる冷凍２種
・【参考サイト】エコランド　←　ややクセはあるが、平易な解説と重要なポイントを繰り返し出題しているのがありがたい。これだけで合格した人も多いが納得できる。

※上級冷凍テキストを購入すべきか迷ったが、使ったテキストが上級冷凍テキストの言い回しを踏襲しているとのことで、重複すると判断。



# スケジュール
かなりゆるくやってみた。１日１時間程度とはいえ、おそらく過剰な学習量。
回数の少ない資格なのと、申し込みがわりと早いので逃さないことが最大の難関かも知れない。

- 7月
    - 受験決意
    - 学識（テキスト＋過去問１周）
- 8月
    - 申し込み
    - 保安技術（テキスト＋過去問１周）
- 9月
    - 法令（テキスト＋過去問１周）
- 10月
    - 過去問２周目
- 11月
    - 受験
- 12月
    - ネット合格発表

# 勉強のポイント

- 学識
    - p-h線図計算は公式にたよらず「単位」と「効率」から都度考えれば間違えにくいし、正しい学習方向だと思う
    - 論説系の内容は保安技術と被っているので、両方やることで理解が深まるので、難しく感じても両方やるまで過度に粘らない
    - いじわる問題はところどころ出る。正直、他の資格試験に比べてクソ問題が多い印象

- 保安技術
    - 冷媒に関しては「温度」と「圧力」だけでなく「量」を考えること。圧力より量に起因する現象が多い
    - シェルアンドチューブは乾式のみ例外
    - 膨張弁など「制御する」という感覚が分かると、分かりやすいことが多い

- 法令
    - 大きな区分が「１種製造と２種製造」「不活性ガスとアンモニア」「認定設備かそれ以外」なので乙４の製造所などより区分が少ないので楽な部類と思う
    - 細かい数値は過去問を繰り返すと身につくので最初は間違えても気にしない

- 共通
    - 過去問を２周し、２周目で間違えたものをピックアップするといい。本番前の見直しにもなる



# 合格後記

〇結果
まず、結果としては1発合格。
試験内容として別に記載しているが、今回合格したのは非常に自信になる。（自分の県では非講習の合格率は１５％くらいのようだった）

〇R6年度試験内容
試験では過去問で見慣れぬ選択肢が多数あり困惑した。
勉強する中で本質的なことは理解できた自負があるだけに、本質と別の何かで合格率を調整するような感じで少し嫌な印象を持った。（協会の講習受講者を増やすための策としか思えない）

本番もほぼすべての人が最短の３０分で退室。見直しをすると４５分はかかるはずなので、多分全くお手上げだったのだろう。

※過去問１２年分やっても不安、おそらくギリ合格だったので、おそらく上級冷凍テキストの隅まで読み込むしか安定合格する手段はないと結論つけておく。

〇感想
勉強になったのと、知らないことが多くとても面白い反面、ちょっと不満点の多い資格試験ではあった。
  
・合格発表が遅い
・試験の内容が理不尽なものも見られる
・計算問題のレパートリー少ない

人にはあまり薦めないが、不合格になっても冷凍機を知りたい人にはちょうどいいものだと思う。
機械学習と深層学習の違いをわかりやすく解説！初心者でも理解できるAIの世界

近年、AI（人工知能）の話題が注目を集めています。その中でもよく耳にする「機械学習」と「深層学習」。この2つは何が違うのでしょうか？この記事では、中学生でも分かるように簡単に解説します！
※この記事は、ChatGPTの出力を基に作成しています。

---

### **1. 機械学習とは？**
まず、機械学習（きかいがくしゅう）とは何でしょう？簡単に言えば、**コンピュータが「自分で学ぶ」仕組み**のことです。

たとえば、学校でたくさんの問題を解くとコツがつかめるように、コンピュータも大量のデータを使って「学ぶ」ことで、物事を正確に判断できるようになります。

---

#### **機械学習の仕組み**
機械学習は、次の3つのステップで進みます：

1. **データを集める**  
   例: 「リンゴ」「バナナ」などの果物の写真と名前をコンピュータに見せる。
   
2. **ルールを学ぶ**  
   コンピュータは、リンゴとバナナの違いを見つけ出します。たとえば「赤いものはリンゴ」「細長いものはバナナ」というルールを作る。

3. **新しいデータを予測する**  
   新しい果物の写真を見せたとき、「これはリンゴ！」と判断します。

---

#### **機械学習の活用例**
- **スマホの顔認証**  
   あなたの顔を学んで、他の人と区別。
- **ネットのおすすめ機能**  
   好きそうな動画や音楽を予測。
- **天気予報**  
   過去の天気データから明日の天気を予測。

---

### **2. 深層学習とは？**
では、深層学習（ディープラーニング）とは何でしょう？  
これは、**機械学習の中の特別な方法**です。深層学習の最大の特徴は、人間の「脳」に似た仕組みを使っていることです。

---

#### **深層学習の特徴**
1. **特徴を自分で学ぶ**  
   機械学習では人間が特徴（例: 猫の耳が尖っているなど）を教えますが、深層学習はコンピュータが自分で特徴を見つけ出します。

2. **ニューラルネットワークを利用**  
   深層学習は、人間の脳を真似た「ニューラルネットワーク」という仕組みを使います。層（レイヤー）がたくさんある「深い」構造なので「深層」と呼ばれます。

---

#### **深層学習の活用例**
深層学習は、特に複雑な問題で力を発揮します。

- **画像認識**  
   写真の中から人や動物を見つける。例: スマホの顔認証。
- **音声認識**  
   話した言葉を文字に変換。例: SiriやGoogleアシスタント。
- **自動翻訳**  
   言葉を他の言語に翻訳。例: Google翻訳。
- **自動運転**  
   車が道路や信号を理解して安全に走行。

---

### **3. 機械学習と深層学習の違いをわかりやすく比較**
機械学習と深層学習の違いを、簡単な表でまとめてみます。

| **項目**          | **機械学習**                          | **深層学習**                        |
|--------------------|--------------------------------------|--------------------------------------|
| **学び方**         | 特徴を人が教える                     | 特徴をコンピュータが自分で学ぶ       |
| **仕組み**         | シンプルなモデル                     | 複雑なニューラルネットワーク         |
| **得意なこと**     | 簡単な問題や少ないデータの分析       | 複雑な問題や大量のデータの分析       |
| **活用例**         | 天気予報、簡単な分類問題             | 画像認識、音声認識、自動運転など     |

---

### **4. 例え話で理解しよう**
- **機械学習**:  
   学校の先生が「猫の特徴はこれだよ」と教えてくれるイメージ。  
   コンピュータはそのルールをもとに学びます。

- **深層学習**:  
   教科書は渡さず「これが猫だよ、考えてごらん」とだけ教える感じ。  
   コンピュータが特徴を自分で発見します。

---

### **5. 機械学習と深層学習、どちらを使う？**
どちらを使うかは、解決したい問題の難しさによります。

- **シンプルで速い処理が必要**: 機械学習  
- **複雑な問題を解きたい**: 深層学習

---

### **6. まとめ**
機械学習と深層学習の違いを簡単にまとめると、次のようになります。

- **機械学習**は「自分で学ぶ仕組み」の全体。
- **深層学習**はその中の特別な方法で、「複雑な問題を解くエキスパート」。

どちらも現代のAI技術を支える重要な仕組みです。これからの世界では、この2つを理解しておくことが大切になるかもしれませんね！

---

この記事を読んで、機械学習と深層学習の違いを少しでも理解できたら嬉しいです！もし興味がわいたら、ぜひさらに詳しく調べてみてくださいね。
【AtCoder】ABC 085A split関数を自作したバージョン

```c++
#include<iostream>
#include<string>
#include<vector>

using namespace std;

vector<string> split(string str, char delim) {
    int first = 0;
    // strはinput文字。delimは区切り文字。
    // 最初の区切り文字の位置を取得
    int last = str.find_first_of(delim);
    // 分割した文字列を格納するvector
    vector<string> result;

    while (first < str.size()) {
        // 入力文字strのfirstからlast-first文字を取得
        string subStr(str, first, last - first);
        // 取得した文字列を格納
        result.push_back(subStr);
        // 次の区切り文字の位置を取得
        first = last + 1;
        // 区切り文字がfirstの位置以降で現れる位置を探す
        last = str.find_first_of(delim, first);
        if (last == string::npos) {
            last = str.size();
        }
    }
    return result;
}

int main() {
    string s;
    cin >> s;

    // 分割対象の文字列
    char delim = '/';

    vector<string> parts = split(s, delim);
    if (parts[0] != "2018") {
        parts[0] = "2018";
    }

    for (int i = 0; i < parts.size(); i++) {
        cout << parts[i];
        if (i < parts.size() - 1) {
            cout << "/";
        }
    }
    cout << endl;

    return 0;
}


```

https://atcoder.jp/contests/abc085/tasks/abc085_a
fullPage.jsで画像や背景を遅延読み込みする方法

## はじめに

遅延読み込みライブラリは、[fullPage.js](https://alvarotrigo.com/fullPage/ "fullPage.js") では機能しない場合があります。

その理由は、fullPage.jsが従来の方法で `scroll` イベントをトリガーしないためです。   
代わりに、fullPage.jsはCSSトランジションまたはJavaScriptを使用してスクロールをシミュレートします。

## fullPage.jsで遅延読み込みを行う方法

### 方法1: 簡単な方法

現在の遅延読み込み技術をfullPage.jsと組み合わせる最も簡単な方法は、fullPage.jsのオプション`scrollBar:true`を使用することです。

これにより、fullPage.jsは他のページのようにスクロールバーを表示し、ライブラリが期待どおりに機能します。

### 方法2: fullPage.jsの遅延読み込みオプションを使用する

fullPage.jsはデフォルトで遅延読み込みオプションを提供しているため、ページに追加のスクリプトを追加する必要はありません。  
実際、この方法は、水平スライドの遅延読み込みや拡張機能との完全な互換性など、特定のシナリオでより効果的に動作します。

#### 背景画像や動画の遅延読み込み

この方法を選ぶ場合は、遅延読み込みオプション`lazyLoading`を有効化し（デフォルトでは有効です）、画像ファイルのソースに通常の`src`ではなく`data-src`属性を使用します。以下はその例です：

```html
<div class="section">
    <img data-src="image.png">

    <video>
	<source data-src="video.webm" type="video/webm" />
	<source data-src="video.mp4" type="video/mp4" />
    </video>
</div>
```

この場合、このセクションの画像と動画は、このセクションに到達したときにのみ読み込まれます。前のセクションを離れたタイミングで読み込みを開始するため、読み込み速度が向上します。

#### CSS背景の遅延読み込み

CSS背景を使用する場合、遅延読み込みを実現するにはCSSを修正する必要があります。

まず、新しいセクションに到達するたびに、例えば`lazy-loaded`というクラスを追加するように設定します。これにより、訪問したセクションはすべてこのクラスを持つようになります。訪問していないセクションにはクラスが追加されません。

```js
new fullpage('#fullpage', {
    onLeave: function(origin, destination, direction) {
        destination.item.classList.add('lazy-loaded');
    }
});
```
次に、このクラスがセクションに追加された場合のみ画像を表示するような「条件付きCSS」を作成します：

```css
.section1 {
   background-size: cover;
}

.section1.lazy-loaded {
    background: url(image.jpg);
}
```

もちろん、ページ読み込み時に表示される背景にはこの「条件」を適用する必要はありません。

## 遅延読み込みの最終例

背景の遅延読み込みを使用した[CodePen](https://codepen.io/alvarotrigo/pen/XWNOERJ)の例を作成しました。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="XWNOERJ" data-pen-title="lazyLoad - backgrounds - fullpage.js" data-user="alvarotrigo" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;"> <span>See the Pen <a href="https://codepen.io/alvarotrigo/pen/XWNOERJ"> lazyLoad - backgrounds - fullpage.js</a> by Álvaro (<a href="https://codepen.io/alvarotrigo">@alvarotrigo</a>) on <a href="https://codepen.io">CodePen</a>.</span> </p> <script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
`bcrypt`では、同じパスワードでも毎回異なるハッシュが生成される

# この記事で理解したいこと
`bcrypt`では、同じパスワードでも毎回異なるハッシュが生成されます。
そんなことは既に知っているという方はブラウザバックでOKです👌

概要レベルでの理解で済ませていた私はこの前提動作を理解しておらず、検証に想定外の時間を使ってしまいました。

自戒の念を込め、記事執筆に至りました。

# bcryptとは？
パスワードを安全にハッシュ化するための関数です。
ソルトを自動的かつランダムに生成し、内部的にパスワードとソルトを組み合わせてハッシュ化します。  
レインボーテーブル攻撃などに強く、安全性の高いパスワード管理を実現できます。

# 異なるハッシュが生成される理由
`bcrypt`はパスワードをハッシュ化する際にランダムなソルトを使用します。  
そのため、同じパスワードでも毎回異なるハッシュが生成されます。

Rubyのコードで動作確認してみます。
```ruby
require 'bcrypt'

password = "P@ssw0rd!"
str1 = BCrypt::Password.create(password)
str2 = BCrypt::Password.create(password)

puts str1 # $2a$12$NqF3kvqv5GwtZTR7fTk6QuxrM.GG3cFGKRHe9B2fKl/RlEZCX16X.
puts str2 # $2a$12$CX6qZmuq75J6665a.NnHCueeS8iF9UxwXb5v5slWaB1luPl.Z/hIy
```

上記`str1`と`str2`は同一の文字列ですが、異なるハッシュが作成されています。

# bcryptのハッシュ構造
bcryptで生成されるハッシュは、以下のようなフォーマットを持っています
```text
$2b$<コスト>$<ソルト><ハッシュ>
```

例）
```text
$2b$12$eImiTXuWVxfM37uY4JANjQ==8C8eXjJ3bO/5pQkQvJ0i9uE.
```

この構造には以下の情報が含まれています
- **アルゴリズム識別子** (`$2b$`)
- **コスト** (`12`)
- **ソルト** (`eImiTXuWVxfM37uY4JANjQ==`)
- **ハッシュ結果** (`8C8eXjJ3bO/5pQkQvJ0i9uE.`)

# 認証プロセス
パスワードの検証時には、以下の手順が踏まれます。

1. **保存されたハッシュからソルトとコストを抽出する**：
   ハッシュには、ソルトとコストが含まれているため、これらの情報を取得

2. **入力されたパスワードに対して同じソルトとコストを使用してハッシュを生成する**：
   抽出したソルトとコストファクターを用いて、入力されたパスワードをハッシュ化

3. **生成されたハッシュと保存されているハッシュを比較する**：
   生成されたハッシュと保存されているハッシュが一致すれば、正しいと判断

# まとめ
- ハッシュ化のタイミングでランダムなソルトが付与されるため、異なるパスワードが生成される
- ソルトがハッシュに組み込まれているため、検証時には同じソルトを使用した認証が可能になっている
Elixirチートシート番外編その２　変数宣言がないことについて、自分が納得しましたと言うポエム

# 1. Over View
どもども、番外編その２であります

今回、似てるけど、動的型付け vs 静的型付けの話じゃない、ただのポエムであります。

さて、変数のスコープと言えば、変数がアクセス可能な範囲を指します。常識ですね。

これがですね、C言語やJavaで飯を食ってると、変数宣言をして、その変数を使う、ってのが常識な訳でして。
Cでstaticで変数なんか宣言して、別のモジュールから呼び出してみなさいな、IDEだのエディタの限界みたいな
レビューをする羽目になります。

一方、こう言う書き方嫌いだったのね。
for( int i = 0; i < LOOP_MAX ; i++ ) {
    iを使った処理
}

変数宣言にコメントが無くて、わかりにくい。反面、下の行見りゃ、iがループの変数だってわかるよね？
その変数が上のforのブロック内で使い終わることわかってるのに、外に出す必要がある？
…などと、ハリネズミのジレンマ的に、自分自身にちくちく来るわけですよ。

なんで、今回は「自分が納得しました」と言う話をしたいと思います。

# 2. Elixirの変数のスコープについて

以下の三つみたいですね。

|スコープの種類|説明|
|:------------------|:--------------------------------------------------------------------------------------------|
|関数スコープ|関数内で定義された変数は、その関数内でのみアクセス可能です。関数が終了すると、変数はスコープ外となり、アクセスできなくなります|
|ブロックスコープ|ブロック（例えば、ifやcaseなど）の内部で定義された変数は、そのブロック内でのみアクセス可能です。ブロックが終了すると、変数はスコープ外となります|
|モジュールスコープ|モジュール内で定義された変数は、そのモジュール内でのみアクセス可能です。モジュール外からはアクセスできません|

## 2.1 関数スコープ

まずは、関数の中でしか、変数は使えないと言うお話

```
defmodule Example do
  def my_function do
    x = 10
    IO.puts(x)  # 出力: 10
  end # endで終わっているので、xのスコープはここでおしまい。
  def another_function do
    IO.puts(x)  # エラー: xは未定義
  end
end
```

ほら、怒られたw
```
warning: redefining module Example (current version defined in memory)
  iex:18: Example (module)

error: undefined variable "x"
  iex:24: Example.another_function/0

** (CompileError) iex: cannot compile module Example (errors have been logged)
    (elixir 1.15.4) src/elixir_module.erl:182: anonymous fn/9 in :elixir_module.compile/7
    iex:18: (file)
```


## 2.2 ブロックスコープ

これ、要注意ね。いや、例見りゃ納得出来るだろうけど。

```
defmodule Example do
  def my_function do
    if true do
      y = 20 # ここでyが初めて使用されてます。
      IO.puts(y)  # 出力: 20
    end # endで終わっているので、yのスコープはここでおしまい。
    IO.puts(y)  # エラー: yは未定義
  end
end
```

if true do ～ endの内部のブロックで、yが初めて使われております。
なので、endの後には使えませんわな。

ちゃんとエラーになるのを確認してます。

```
warning: redefining module Example (current version defined in memory)
  iex:18: Example (module)

error: undefined variable "y"
  iex:24: Example.my_function/0

** (CompileError) iex: cannot compile module Example (errors have been logged)
    (elixir 1.15.4) src/elixir_module.erl:182: anonymous fn/9 in :elixir_module.compile/7
    iex:18: (file)
```

## 2.3 モジュールスコープ

これはわかりやすいよね。

```
defmodule Example do
  @module_var 30

  def my_function do
    IO.puts(@module_var)  # 出力: 30
  end
end # ここで、 @module_varはスコープがおしまい。

IO.puts(Example.@module_var)  # エラー: @module_varは未定義
```

もちろん、エラーなります。
```
iex(20)> IO.puts(Example.@module_var)  # エラー: @module_varは未定義
error: undefined variable "module_var"
  iex:20

** (CompileError) cannot compile code (errors have been logged)
```

# 3. 本日の心の合点ボタン


Elixirで、「変数宣言がなくても、俺自身がどこで解放されてりゃいいか、分かりやすくするコードを意識すればいいんじゃないかな？」と意識を転換しました。
そう気づいた理由が、無名変数の省略記法でして。

これが普通の書き方
```
sum = fn (a, b) -> a + b end
sum.(2, 3)
5
```

省略記法
```
sum = &(&1 + &2)
sum.(2, 3)
5
```

まー、ファンクション宣言が&()になっちゃうのは驚きましたが、確かに引数、&1や&2でも困らないよね。無名関数なんてのは短く書くもんだしさ。
であれば、変数名もスコープ内で使うものは、別のスコープなら無視すりゃいいんだから、無理に変数宣言にこだわらんでもよくね？

と思った次第です。
猫ミームガチャを作ってみた

クソアプリカレンダー2024の20日目！
今回はVue.jsとGithub Actionsを使ってサクッと猫ミームアプリを作りました。


## 技術スタック
* Vue.js
* Github Actions


## どんなアプリ？
YouTubeに投稿された猫ミームGB素材をランダムで表示してくれるガチャ

YouTube動画はYadro Green Screenさんのチャンネルから引用しています。
https://www.youtube.com/channel/UCAQr7fSB8Wa4DNpo8q37P_g

## 完成品
https://hal-spidernight.github.io/Cat-Meams-Gacha/

## 10連ガチャも引けます。
![スクリーンショット 2024-12-20 20.17.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840428/cbe6a8a5-95a8-d320-2e90-ba7c5fd0018a.png)

(SR3枚という神引きしていますね...w）


## 感想
Github Actionsを初めて触りましたが、デプロイが非常に簡単にできることに感動しました。
普段はAWSでパイプラインの構築を行なっていますがこちらも諸所で使っていきたいと感じました。

ガチャの仕組みを作るにあたり、累積確率というものを知りました。
ガチャシステムはこうやってできているのかーと思いつつも確率とSR以上のヒット率が体感的に合っていない印象もありました。
この辺りはガチャ対象が増えれば解消しそうです。

世の中のソシャゲガチャはもっと様々な調整が入った上でレアが出るんだろうなー。
圏論（けんろん）、圏論（けんろん）、圏論（けんろん）、そして米田の補題（よねだのほだい）

# 数学が本格的に日常に大きな影響を与える時代がきます

![秋葉原 adventcalendar .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/f1f0b690-cb55-d220-c685-2856c3f9e2d5.png)

現時点で、数学の基礎理論である圏論は知られておらず、さらに圏論の最重要定理の米田の補題を知っている人はほとんどいません。
でも、圏論はいままで、[万物の理論](https://amzn.to/3ZLmCJH)といわれていましたが、[数理科学 11月号](https://amzn.to/4iz6NgM)では、なんと　<font color="Red">万物・万事・万人</font>のための数学理論とまでいわれるようになりました

私は、以前から、圏論をしっていましたが、本格的に学んだのは、2023年1月から5月末までの入院中の約半年のことです。いまだに数学的にはよくわかっていませんですが、それでも日常に応用できるのですごいと思っています。数学は抽象的なので、通常の普段の日常とは縁がないでしょう。それが圏論は、すごく影響があります。特に圏論の最重要定理の米田の補題がすごいです。よいものの普及活動が好きな私としては、米田の補題を普及させることに使命をかんじています。

# 米田の補題の理解の前提は、圏、関手、自然変換です。どれも数学的に正面から理解しようとすると絶望的です。
東大理学部情報学科の4年生の学力が必要です。他の大学の情報学科でも、圏論は必須でないので言葉そのものを知らない人が多いです。壊滅的に難しい理論ですが、一瞬で覚えてもらう手法を模索しています。そこで考え出したのが、川柳です

# 米田の補題　関係は内容よりも重要だ

例です。

（内容）A国、B国はかくかくしかじかの国です
（関係）A国は、友好国、B国は敵対国
**関係のほうが重要でしょう**

# ポアンカレ 違うもの同じとみなすすごいこと
圏論のご先祖様 ポアンカレは、**数学は違うものを同じとみなす技術である**といいました。

なにがすごいかの例です。

おなじなら値段がやすい方がよい。普段からそうおもっていませんか？

# 圏論は矢印　矢印で考えるのはよくあるな

普段から、矢印をつかっていませんか？　
例えば、テレビでインタビューしていると、
きっかけ　→　現在
で質問をしているパターンがありませんか？
矢印を意識すると、日常生活には矢印があふれかえっています。
そして、きっかけ　→　現在は、誰かについて知りたいと思ったら、即、質問として使えます。きっかけはなんですか？　そして現在はどうしていますか？
少し数学的な話をするときっかけ、現在は、対象といいます。矢印は射といいます。

# グロタンディーク なんでもと思えるならばすごいこと
圏論で数学を書き換えた天才 グロタンディークは**対象、射(やじるし)なんでも良い**といっています。
圏論を万物の理論に方向づけたのは、グロタンディークです。
**会議でこんな会話していませんか？**
課題が解決できればなんでもよいのだから、〇〇は違う方法だけどで同じように解決できるのでは
ポアンカレやグロタンディークの言葉を意識して、会議に臨むと生産性が桁違いにあがります。私は、いま、別世界に生きている感じがしています。

# どうですか？　圏論って面白いと思いましたか？

※この文章は、米田の補題 AdventCalendar2024(https://qiita.com/advent-calendar/2024/yonedalemma) 米田の補題からの抜粋です
git stashしたら「No local changes to save」と出て「🤔」となった話

## はじめに

git stashって便利ですよね〜

コミットやステージングまではしたくない変更差分があって、

その状態でcheckoutしたい、みたいな時ってあると思います。

そんな時、

`git stash` 

とすることで簡単に変更差分を避難させることが出来るので、重宝しています！

## 困ったこと、その原因...

ただ、このコマンドをしても

```shell
$ git stash
No local changes to save
```

となってしまったことがありました...

原因は`git stash`が対象にとることが出来る変更差分は

* ステージングしている（`git add`をしている）ファイル
* または、過去にコミットしたことがあり、追跡対象になっているファイル

こういった条件を満たしている時のようでした...

つまり、このメッセージが出ているということは、

上記の条件を満たしておらず、

追跡されていないファイルということ...

例えば、

**新しくファイルを作って、それをステージングしたりコミットしたりしていない**

こういった場合には`git stash`とするだけではダメでした...

## 解決策

ではどうするのかと言うと、

```shell
git stash -u
```

このようにします。

`-u`を付与することで、未追跡のファイル(untracked)も含めて避難させることが出来ます。

## 参照

https://git-scm.com/docs/git-stash
Data Collection

[Previous << Cadence Boilerplate](https://qiita.com/flowcadence/items/3f9a3b3f175fdd48cf91)
[Next >> Flow Emulator](https://qiita.com/flowcadence/items/cdbb322711f32a09028c)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

Flow CLI は Mixpanel を使用してFlowコマンド使用回数を追跡しています。

データ収集はデフォルトで有効になっています。ユーザーは`flow settings metrics disable`を実行することで、我々のデータ収集からオプトアウトできます。オプトインに戻すには、ユーザーは`flow settings metrics enable`を実行することでできます。

<h1>Why do we collect data about flow cli usage?</h1>

コマンドの総数を集計することで、ユーザーがflow cliをどのように使用しているかに基づき、機能および修正の優先付けが可能になります。

<h1>What data do we collect?</h1>

私たちはコマンドが実行された回数を収集するだけです。

引数の値、使用されたフラグ、フラグの値は追跡しません。また、どのコマンドも特定の使用者に関連付けることもありません。

私達が使用者から収集する唯一のプロパティは、データ収集へのオプトイン/オプトアウトの選択です。アナリティクスユーザーIDはMixpanelのためだけにあり、Flow CLIの管理者が、例えば、あなたの訪問したウェブサイトを追跡するようなことは許可されません。

収集されるデータに関する詳細は、https://help.mixpanel.com/hc/en-us/articles/115004613766-Default-Properties-Collected-by-Mixpanel の`Ingestion API` セクションにあるMixpanel のdata collection ページ に記載されています。

上記のMixpanelのページでは、デフォルトで地理位置情報プロパティが記録されると記載されていますが、我々はMixpanelへのgeolocation data reporting を無効にしています。

*Last updated on **Dec 9, 2024** by **Alex***

翻訳元

https://developers.flow.com/tools/flow-cli/data-collection

***
<b>[Previous << Cadence Boilerplate](https://qiita.com/flowcadence/items/3f9a3b3f175fdd48cf91)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Data Collection)

<b>[Next >> Flow Emulator](https://qiita.com/flowcadence/items/cdbb322711f32a09028c)</b>
LinuxでのMySQLデータベースのバックアップ＆リストア方法

この記事は、[エアークローゼットアドベントカレンダー2024の11日目](https://qiita.com/advent-calendar/2024/air-closet)の記事です。
# はじめに
この記事では、Linux環境でMySQLデータベースをバックアップおよびリストアするためのコマンドをご紹介します。

Linuxでは、バックアップにはmysqldumpコマンドを使用し、リストアにはmysqlまたはmysqlimportコマンドを使用します。この2つのコマンドはMySQL管理において欠かせない存在です。

それでは早速、バックアップ方法から見ていきましょう！

## I. MySQLデータベースをバックアップする方法
mysqldumpコマンドは、ローカルまたはリモートでデータベースをバックアップするために使用されます。このコマンドの実行結果はSQL形式の1つのファイルとして出力されます。

ただし、バックアップするには以下の条件が必要です：

+ バックアップ対象のデータベースがサーバー上に存在すること
+ 使用するユーザーアカウントがデータベースにアクセスできる権限を持っていること

バックアップの基本的なコマンド構文は以下の通りです：
```bash
# mysqldump -u [ユーザー名] -p [パスワード] [データベース名] > [バックアップファイル.sql]
```
説明:
[ユーザー名]：MySQLにアクセスするためのユーザー名
[パスワード]：そのユーザーのパスワード
[データベース名]：バックアップ対象のデータベース名
[バックアップファイル.sql]：バックアップとして保存するファイル名

### 1\. 単一のデータベースをバックアップする
以下のようにコマンドを実行します。
```bash
# mysqldump -u root -p databaseName > databaseFile.sql
```
この場合、databaseNameというデータベースがバックアップ対象で、出力されるファイルはdatabaseFile.sqlです。

### 2\. 複数のデータベースをまとめてバックアップする
複数のデータベースを1つのファイルにバックアップする場合は、--databasesオプションを使用します。
```bash
# mysqldump -u root -p --databases databaseName1 databaseName2 > databaseFile.sql
```
上記の例では、databaseName1とdatabaseName2の2つのデータベースを1つのファイルdatabaseFile.sqlにバックアップしています。

### 3\. すべてのデータベースをバックアップする
すべてのデータベースをバックアップするには、--all-databasesオプションを使用します。
```bash
# mysqldump -u root -p --all-databases > allDatabasesFile.sql
```


### 4\. テーブル構造だけをバックアップする
データは不要で、テーブル構造だけをバックアップしたい場合は、--no-dataオプションを使用します。
```bash
# mysqldump -u root -p --no-data databaseName > databaseNameStructureFile.sql
```

### 5\. データだけをバックアップする
テーブル構造は不要で、データだけをバックアップするには、--no-create-dbと--no-create-infoオプションを使用します。
```bash
# mysqldump -u root -p --no-create-db --no-create-info databaseName > databaseFile.sql
```

### 6\. 特定のテーブルをバックアップする
特定のテーブルだけをバックアップする場合は、以下のように指定します。
```bash
# mysqldump -u root -p databaseName tableName > TableFile.sql
```

### 7\. 複数のテーブルをバックアップする
複数のテーブルをバックアップするには、テーブル名をスペースで区切ります。
```bash
# mysqldump -u root -p databaseName tableName1 tableName2 > TablesFile.sql
```

### 8\. リモートサーバーのデータベースをバックアップする
リモートサーバーのデータベースをバックアップする場合は、サーバーのIPアドレスを指定します。
```bash
# mysqldump -h 192.168.1.100 -u root -p databaseName tableName > TableFile.sql
```
リモートサーバーのパスワードを入力すると、バックアップが実行されます。

## II. MySQLデータベースをリストアする方法
バックアップファイル（.sql）をリストアするには、mysqlまたはmysqlimportコマンドを使用します。
基本構文：
```bash
# mysql -u [ユーザー名] -p[パスワード] [データベース名] < [バックアップファイル.sql]
```
例：
+ データベースが空でない場合
 このコマンドで、databaseName.sqlファイルをdatabaseNameデータベースにリストアします。
```bash
# mysql -u root -p databaseName < databaseName.sql
```


+ データベースが既に存在しており、空でない場合はmysqlimportを使用します。
```bash
# mysqlimport -u root -p databaseName < databaseName.sql
```

# まとめ
この記事では、LinuxでMySQLデータベースをバックアップおよびリストアする方法を解説しました。mysqldumpやmysqlimportを使いこなせば、データベース管理がぐっと楽になります！

困った時はこの記事を参考にしてみてくださいね。😉

# おまけ
本番環境のデータをマスクしてステージング環境に自動同期する仕組みをやりたい時は、
[こちら](https://zenn.dev/chycara344/articles/7529bd5539de03)の記事を参考してみてください。
VRChatのCanvasでRay(青いビーム)が当たる範囲を制御する

# 環境
- Unity 2022.3.22f1
- VRChat SDK - Base 3.6.1
- VRChat SDK - Worlds 3.6.1

# 前提
- CanvasにはVRC UI Shapeコンポーネントをつけましょう
- CanvasのレイヤーはUIのままではなく、Pickupなどのレイヤーに変更しましょう

# 方法
下図のように、Canvasに**非アクティブ**のBox Colliderをダミーでアタッチした後に、Rayが当たってほしい大きさの本物のBox Colliderを好きな個数アタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864812/8bea060e-6d62-53b4-3fa1-df0b50abcf73.png)

----
詳しい挙動を検証したわけではありませんが、VRC UI Shapeは自身がアタッチされたCanvasにBox Colliderが無い場合、scene再生時に勝手にCanvasと同じ大きさのBox Colliderを追加します。また、Box Colliderがあったとしても、勝手に大きさをCanvasと同じ大きさに変更します。

このVRC UI Shapeによる勝手なBox Colliderの操作を回避するために、非アクティブのBox Colliderをダミーで用意しておき、これをVRC UI Shapeに操作させます。(非アクティブなので勝手に操作されても関係ない)

# サンプル
https://booth.pm/ja/items/6190273
API設計で api/v1 フォルダを作成する理由

# API設計で api/v1 フォルダを作成する理由
## 1. バージョニング（APIのバージョン管理）のため
バージョニングとは何か？ APIを公開すると、機能の追加や変更が頻繁に行われます。既存のクライアントに影響を与えず、新しい機能や仕様を提供するためには「バージョン管理」が必要です。

:::note info
例えば、v1 では在庫情報をシンプルな形式で返していたとします。
新しいクライアントが増え、データ形式を変更する必要がある場合、v2 を作成して新しい形式を提供できます。
古いクライアントは v1 を使い続けることで影響を受けません。
このバージョン管理を行うために、api/v1 というディレクトリ構造を採用します。
:::

## 2. コードの整理・可読性向上のため
目的ごとのフォルダ分け APIにはさまざまなリソース（例: ユーザー、在庫、注文）が存在します。それぞれのリソースに対応するコントローラーが増えると、1つのフォルダにまとめると非常に管理が難しくなります。

__例: フォルダが1層の場合__
```
app/controllers/
├── inventory_controller.rb
├── users_controller.rb
├── orders_controller.rb
└── other_controller.rb
```
→ コントローラーが増えると、全てが app/controllers 直下に配置され、混乱を招きます。


__フォルダを分けた場合__
```
app/controllers/api/v1/
├── inventory_controller.rb
├── users_controller.rb
└── orders_controller.rb
```
→ APIのエンドポイントを明確にグループ化でき、管理しやすくなります。

## 3. エンドポイント構造との一致性
APIクライアントから見たとき、URLが以下のようになります。
```
/inventory（フラット構造）→ バージョン管理がなく、将来の変更が困難。
```
```
/api/v1/inventory（階層構造）→ 明確にバージョン管理されており、将来の拡張に柔軟。
```
このURL構造に合わせてディレクトリを整理することで、URLとディレクトリ構造の対応がわかりやすくなります。

## 4. RESTful設計の原則に従うため
RESTful設計では、リソースごとに明確なエンドポイントを定義し、それに対応するコントローラーを設けることが推奨されます。
```
api/v1/inventory_controller.rb は、/api/v1/inventory に対応。
```
```
api/v1/users_controller.rb は、/api/v1/users に対応。
```
これにより、APIの設計が標準的で再利用しやすいものになります。

## まとめ: なぜ api/v1 フォルダを作成するのか？
将来の変更や機能追加に備えるためのバージョニング管理
コードの整理と可読性を向上させるため
エンドポイント構造との一貫性を保つため
RESTful設計に基づいた標準的なAPIを実現するため
このような理由から、api/v1 フォルダを作成して、その中にコントローラーを配置するのが良い設計とされています。エンドポイントの実装やテストを行う際にも、これが基本になります。
Pythonにおけるオーバーロードのためにmultipledispatchを使う / maccha Advent Calendar 2024

# Pythonにおけるオーバーロードのためにmultipledispatchを使う

[maccha Advent Calendar 2024](https://adventar.org/calendars/10199)の20日目の記事です．

Pythonでプログラミングをしていると，同じ名前の関数やメソッドを引数の型や個数に応じて実装したい場面があります．そうした「オーバーロード」のための手法と注意点について紹介します．

## オーバーロードとは

オーバーロードとは，同じ名前の関数やメソッドを引数の型や個数に応じて異なる実装をすることです．C++など一部のプログラミング言語では，標準機能としてサポートされています．

## Pythonでのオーバーロードの手法

Pythonでオーバーロードを実現する方法は主に以下の3つです．それぞれの特徴と注意点を見ていきます．

### 静的型チェックのみの`@overload`

Pythonの`typing`モジュールが提供する`@overload`デコレータは，型ヒントによる静的型チェックを補助しますが，実際の処理分岐は行いません．

```python
from typing import overload

@overload
def hoge(x: int) -> str: pass

@overload
def hoge(x: float) -> str: pass

def hoge(x: int | float) -> str:
  if isinstance(x, int):
    return "This is int."
  elif isinstance(x, float):
    return "This is float."
  return "What is this?"
```

上記のコードでは`hoge`関数の3つの実装のうち，実際に実行されるのは最後のものだけです．上2つは`@overload`による型チェックのための実装です．

また同じ名前の関数やメソッドを実装するとしても，引数の型や個数に応じて異なる実装をしたいことがあります．

### 第1引数の型に応じて処理を分岐する`@singledispatchmethod`

`functools`モジュールの`@singledispatchmethod`を使うと，第1引数の型に応じて処理を切り替えることができます．

```python
from functools import singledispatchmethod

class Ceiling:
  @singledispatchmethod
  def __call__(self, x):
    raise TypeError(f"Unsupported type: {type(x)}")
  
  @__call__.register
  def _(self, x: int):
    return x
    
  @__call__.register
  def _(self, x: float):
    return int(x) if x==int(x) else int(x)+1
```

この例では，ceilingメソッドが引数の型に応じた処理を提供しています．ただし`@singledispatchmethod`は**第1引数のみ**を基に動作するため，複数の引数の型に応じた処理分岐には対応していません．

### 複数の引数の型に応じて処理を分岐してくれる`@singledispatchmethod`

`multipledispatch`ライブラリを使うと，**複数の引数の型**に応じて処理を切り替えることができます．

```python
from multipledispatch import dispatch

class MyClass:
  @dispatch(int, int)
  def get_type_of_sum(self, x, y):
    return "int"

  @dispatch(float, float)
  def get_type_of_sum(self, x, y):
    return "float"

  @dispatch(int, float)
  def get_type_of_sum(self, x, y):
    return "float"

  @dispatch(float, int)
  def get_type_of_sum(self, x, y):
    return "float"
```

この方法では引数の型や個数に応じた柔軟な処理分岐が可能です．

ただし，リストやタプルなどの型に対しては中身の要素の型までチェックされません．`list[int]`や`tuple[int, float]`のような構造的な型に対するサポートはありません．

## まとめ

以上の点をまとめます．

|手法|使い道|
|:---|:---|
|`typing.overload`|引数の型チェックのみ|
|`functools.singledispatchmethod`|第1引数の型に応じて処理を分岐|
|`multipledispatch.dispatch`|複数の引数の型に応じて処理を分岐|

## 参考

- [typing.overloadのdocumentation](https://docs.python.org/ja/3/library/typing.html#typing.overload)
- [functools.singledispatchのdocumentation](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)
- [Multiple Dispatchのdocumentation](https://multiple-dispatch.readthedocs.io/en/latest/)
Manifest V3 からの host permissionsの書き方

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の19日目の記事です。

`host permmisons`の書き方でつまったので記載します。

# Manifestバージョンによる違い

結論としてv2とv3でいくつか書き方が変わっており、`host permissions`も変わりました。
以下のようにv3からは`host_permissions`という項目を追加して設定します。

```json:manifest.json(v2)
"permissions": [
  "tabs",
  "notifications",
  "https://example.com/"
],
```

```json:manifest.json(v3)
"permissions": [
  "tabs",
  "notifications"
],
"host_permissions": [
  "https://example.com/"
]
```

# 参考

[Manifest V3 migration guide](https://extensionworkshop.com/documentation/develop/manifest-v3-migration-guide/)
かんたんにRAGを試しました。watsonx.ai Chat with Document

# この記事について
- この記事は[IBMが提供する製品に関する情報やナレッジを共有する Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ibm_data_ai_automation)の12月23日分として記載しています

- IBM Cloud で使用できるSaaS版watsonx.ai にて、Chat with Document という、いわゆるRAGを簡単に実施できる機能があるので、試してみました
- RAGのドキュメントは[こちら](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-prompt-data.html?context=wx&locale=ja&audience=wdp)です



# 文書のアップロード

- テキストボックス左側の、上向き矢印のアイコンをクリックすると、文書や画像がアップロードできます

![スクリーンショット 2024-12-20 19.00.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/fd338206-bb7d-f415-7f61-a6fb75638eac.png)

今回試した文書は、[watsonx.ai を使用したこちらの運用事例](https://www.nibiohn.go.jp/pr/press/documents/d00fda28d278f44c02a045dfb30179962cb6c4b8.pdf)です。

文書をどこから取得するか、について以下選択できますが、今回はWEBからダウンロードした上記リンク先のPDFファイルを使用します。

![スクリーンショット 2024-12-20 19.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/c83c46db-7d67-94d6-4968-1454df62d052.png)


![スクリーンショット 2024-12-20 19.03.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/b8150ff8-a126-8906-247d-ce8892976123.png)

![スクリーンショット 2024-12-20 19.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/9146b8e5-829a-ebf3-3df2-d058a1ce5c48.png)



![スクリーンショット 2024-12-20 19.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/ea14bb52-6e06-5a97-561b-4d3f84c94ba5.png)


![スクリーンショット 2024-12-20 19.05.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/044fc088-1660-9e53-237d-317d4c950ceb.png)

# プロンプト（質問）と、生成AI（RAG有り）による回答

![スクリーンショット 2024-12-20 19.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/0444de0d-a490-e646-3594-51cce608d397.png)
Emacs Lisp 超初心者がコマンドを作ってみる 〜 Emacs起動時から使えるようにする 〜 

一応動くようになったので、次は Emacs 起動時にロードして動くようにしていきます。

# load-path を通す
必要に応じて load-path を通します。今回作った .el ファイルが属するフォルダが既に load-path に含まれている場合は下記 init.el で load-path の設定をする必要はありません。

現在のload-path を確認するには、 \*scratch\* バッファで load-path C-j とします。

# init.el に追記する


````elisp
(add-to-list 'load-path "/home/hideo/work/git-docs-ja/Documentation-po")
(require 'po-ediff-previous-msgid)
````

これで Emacs 起動時直後から po-ediff-previous-msgid が使えるようになりました。

使う時は M-x po-ediff-previous-msgid です。

# キーを割り当てる(キー・バインディング)

M-x po-ediff-previous-msgid を毎回打ち込むのもめんどくさいのでキーに割り当ててしまいます。 po-mode 中だけ特定の文字に割り当ててしまいましょう。空いている文字を調べます。 po-mode で describe-bindings したら c は空いているようでしたので c にしました。 Compare の c 。

````elisp
(add-to-list 'load-path "/home/hideo/work/git-docs-ja/Documentation-po")
(require 'po-ediff-previous-msgid)
(define-key po-mode-map "c" 'po-ediff-previous-msgid)
````

今日はここまで。
GitHub Wikiを更新しようとしたら「403 Forbidden」になる

GitHub Wikiでページを作成しようとしたとき、「403 Forbidden」と出て保存ができない現象が起きました。

# 症状

Wikiに書こうとしていた内容はPythonの `urllib.request.urlopen`を使ってHTTPリクエストを送るコードを含む文章です。

そしてどうやら、Wikiの本文に`urlopen()`という文字列が入っていると保存ができないようです

以下のような状態でも、「Save Page」をすると、「403 Forbidden」の画面になってしまします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/c4cd9f44-aa5f-e74e-2fab-f48098a23762.png)

Previewも見てみると「Error rendering preview」と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123353/d7ab1049-8353-b6c7-dda6-3126b36db894.png)

# 解決策

以下のように`()`にエスケープを入れることで保存することができました

`urlopen\(\)`

文字の挿入をするので根本的な解決にはなってないですがとりあえず表示できるようになるのでよしとします。

# 考察

エラー内容が「403 Forbidden」ということで、GitHub側からの何らかの拒否設定があるのかと思います。

XSSなどのセキュリティ対策ですかね。
(途中 成果なし?)材料力学「等分布荷重を受ける突出梁の最大剪断力および曲げモーメントの値を求めよ。」をAI先生に教えてもらう(/)


・タイトル変更予定です。長く(時間)なります。
・私の質問の仕方が悪かったです。正しいのかわかっていません。
　おすすめの質問の仕方があれば、アドバイスをいただけると幸いです。

:::note info
次　 [「(/)」
]()
:::

**等分布荷重を受ける突出梁(途中ローラー支点が1点あり）の最大剪断力および曲げモーメントの値を求めよ。**
必須です。(途中ローラー支点が1点あり）

#### 参考文献
- 中沢一, 宮川松男, 水野正夫著 (1967) *材料力学*.朝倉書店 
(2)スパンより長い移動等分布荷重を受ける単純支持はり
p89
https://opactmu.lib.tmu.ac.jp/iwjs0013opc/catdbl.do?pkey=BB00916593&hidden_return_link=true&locale=ja

# ChatGPT先生へ
>(回答抜粋)
>1梁の条件を整理
梁の形状: 突出梁（片持ち梁）で途中にローラー支点が1点ある。...
>...
>5.結果を具体化する ...
>必要であれば、SymPy を使った計算コードを提供できます。

(いつになく気が利いています。）
**GPT-4o. の Free プランの制限に達しました。**
SymPy を使った計算コードで結果も出力して下さい。
>明日の 14:41 以降.にもう一度お試しください。

**反省。私の無駄な質問が、途中多かったです。**

# ChatGPT先生へ(再)
＞梁の形状: 突出梁（**片持ち梁**）で...
前回、上記で気づかないといけませんでした。

**等分布荷重を受ける突出梁(単純ばり、途中ローラー支点が1点あり）の最大剪断力および曲げモーメントの値を求めよ。**
必須です。(単純ばり、途中ローラー支点が1点あり）

>(回答抜粋)
L=6m,w=10N/m,a=4mの場合について計算してみます。具体的な数値の計算が必要であれば教えてください。

具体的な数値の計算をsympyのソースコードで、結果も教えて下さい。

実行ボタンがありました。

>(回答抜粋)
必要であればさらに詳細な解析や図示も可能です。 ​​

詳細な解析や図示もお願いします。

すごすぎます。エラー発生しない？ソースコードです。

```python
from sympy import symbols, Eq, solve

# 定義域と荷重のパラメータ
L, w, a = symbols('L w a', positive=True)  # 梁の全長、等分布荷重、ローラー支点位置
x = symbols('x', positive=True)  # 区間内の位置

# 支点反力の計算
R_A, R_B = symbols('R_A R_B', positive=True)

# 力のつり合い式
force_eq = Eq(R_A + R_B, w * L)

# モーメントのつり合い式（左端を基準）
moment_eq = Eq(R_B * a, w * L * L / 2)

# 反力を解く
reactions = solve([force_eq, moment_eq], [R_A, R_B])
R_A_val = reactions[R_A]
R_B_val = reactions[R_B]

# 剪断力の分布
V_left = R_A_val - w * x  # 左区間 (0 <= x < a)
V_right = R_B_val - w * (x - a)  # 右区間 (a <= x <= L)

# 曲げモーメントの分布
M_left = R_A_val * x - w * x**2 / 2  # 左区間
M_right = R_B_val * (x - a) - w * (x - a)**2 / 2  # 右区間

# 数値代入 (L=6, w=10, a=4)
num_values = {L: 6, w: 10, a: 4}

# 最大剪断力と曲げモーメントの確認
V_left_max = V_left.subs(num_values).subs(x, 0)
V_right_max = V_right.subs(num_values).subs(x, 6)

M_left_max = M_left.subs(num_values).subs(x, 4)
M_right_max = M_right.subs(num_values).subs(x, 6)

# 結果出力
result = {
    "R_A": R_A_val.subs(num_values),
    "R_B": R_B_val.subs(num_values),
    "V_left_max": V_left_max,
    "V_right_max": V_right_max,
    "M_left_max": M_left_max,
    "M_right_max": M_right_max
}
result
```
以下、私のvscodeの実行結果
```
# {'R_A': 15, 'R_B': 45, 'V_left_max': 15, 'V_right_max': 25, 'M_left_max': -20, 'M_right_max': 70}
```


# Gemini先生へ
>(回答抜粋)

```python

```

# copilot先生へ


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
Pythonを基礎から学ぶその7　形態素解析

この記事は、[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の20日目の記事です。
# 自然言語処理とは
NLPと呼ばれています。簡単に説明するとコンピュータ側が人間の言葉をわかるようにするための処理のようです。コンピュータが人間の言葉を分析します。

## 形態素解析
文章を単語ごとにバラバラにして、バラバラになった単語一つ一つがどんな単語であるか（例えば動詞とか）を判断するものです。記述式アンケートの内容を分析したり、テキストマイニングとかいう技術にも使われているみたいです。ちなみにこの形態素解析のほかにも構文解析という、文を解析するものがあります。
# janome
pythonの豊富な外部ライブラリの一つです。今回の形態素分析に必要なものです
```
 pip install janome
```
まずはこれで導入します。
# 使い方
まずは全文を載せておきます
```analysis.py
from janome.tokenizer import Tokenizer

tokenizer = Tokenizer()

sentence = 'もうすぐクリスマスですね'

for token in tokenizer.tokenize(sentence):
    print(token)
```
簡単に出来ることがよくわかると思います。
まず１行目から
```
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
```
janomeのtokenizerを使用します。
```
sentence = 'もうすぐクリスマスですね'
```
sentenceには解析したい文字を入れます。クリスマスが近いので、こんな文にしてみました。
```
for token in tokenizer.tokenize(sentence):
    print(token)
```
この行で解析をしています。文が入ったsentenseをtokenizeして、その結果をtokenとして出力しています。
結果:
もうすぐ	副詞,一般,*,*,*,*,もうすぐ,モウスグ,モースグ
クリスマス	名詞,一般,*,*,*,*,クリスマス,クリスマス,クリスマス
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ

こんな感じで、各単語の特徴を教えてくれます。
# 応用
昨日まで学習してたデスクトップアプリに入れることもできます
こちらではテキストに文を入力することで動くようにしています。
```analysisdesktop.py
import tkinter as tk

from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
window=tk.Tk()
window.geometry("400x800")
window.title("形態素解析")
title=tk.Label(text='形態素解析',font=("",30))
title.pack(pady=25)
label=tk.Label(text='文章を入力してね')
label.pack(pady=15)
txt=tk.Entry(window)
txt.pack(pady=25)
def ClickEvent():
    inputtxt=txt.get()
    txt.destroy()
    button.destroy()
    label.destroy()
    for token in tokenizer.tokenize(inputtxt):
        result=tk.Label(text=token)
        result.pack(pady=15)
   
button=tk.Button(text='解析',command=ClickEvent)
button.pack(pady=6)
window.mainloop()
```
結果:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/747f642a-eda7-d715-1b22-92028e4de8d3.png)
これなら、Pythonを知らないけど文字の特徴を知りたい人でも使うことができます。
# まとめ
janomeを使うと文字を単語ごとに区切り、各単語ごとに特徴を出してくれる。
実際に使っているのはjanomeのtokenizerの機能。
# 参考文献

https://www.aist.go.jp/aist_j/magazine/20230621.html

https://challenge-pg.com/2024/11/09/python-janome/

https://www.mieruka-engine.com/media/morphologicalanalysis
転職活動で重要だと感じた3つのこと

私は昨年度（2023年）、社会人三年目にて半年ほどの転職活動を経て現在の会社へ入社しました。その経験で感じたことを記します。

# No.１：各軸の最低許容値を決めること

まず就活における軸とは、「収入」や「勤務地」、「仕事内容」などがあります。
それらの各軸において<font color="red">自身が気にする軸</font>は、どこまでなら許容できるかをまとめておくことが重要だと思いました。

以下のように私の場合の軸を挙げてみました。

| 年収 | 勤務地 | 仕事内容 | 働き方 |
| ---- | ---- |---- |---- |
| ○○万円以上 | 都市部 | 未来に活かせる技術<br>を身に着けられる | テレワーク可<br>強制転勤なし |

私が転職を考えるきっかけになった理由は以下二つです。
・強制的な転勤で人生計画が崩されたくないこと。
・会社に依存せず、生きていける技術を身に着けたいこと。
そのため、転勤がないことや自身の未来でいかせる技術（AIとか）を身に着けられることが必須でした。また、最低限の年収はもちろん、都会に住んでみたいと子供の頃から思っていたため盛り込みました。

そして、決めた軸に合致する会社を端からピックアップして応募していました。もし合致する会社がなければ、どこかを妥協するか転職を断念（延期）するかの選択肢が私にはありました。後悔しない転職をするためには、自身の譲れない条件を明確にしておく必要があります。

# No.２：業界・会社を知ること
私は異業種からIT業界への転職でした。高専ではITを学んでいたためIT知識が皆無ではありませんでしたが、IT業界やその会社に関しては全然知らなかったためまずはその知識を得る必要がありました。

業界や会社に関して知っておくべきだなと思う事柄は以下です。
### 年収帯
業界によって年収の水準が違います。IT業界は経験が重視され、経験次第で高い年収を目指せることが分かりました。そのため、年収に関しては高望みせずに転職に挑みました。

### 働き方（仕事内容）
IT業界で言えば、プログラマやマネージャ、営業のような仕事に大別されるかと思います。またプログラマの中でも、派遣や受注、どんな言語を扱うか等会社によって違います。どのような働き方があるのかを知らないと、自身に何ができてどんなことをしたいのか考えることもできないため、まずはそこを勉強しておくべきだと思いました。

### 将来性
業界の将来性に関していえば、IT業界は注目されており将来性があると思いました。
では、会社単位ではどうでしょうか。私は、IT分野における最新の技術を取り入れている会社だったり、独自の技術や製品があって発展させる余地のある会社でないと将来性が厳しいのかなと思いました。最近のIT分野のトレンドはAIのため、AIに力を入れている会社なら将来性も期待できるのかなと考えました。

### ブラックか？
かつてIT業界はブラック企業が多いイメージでした。ブラックと感じる基準は人によって違いますが、私がブラックだと感じるのは「残業しても残業代が支払われない」とか、「振替無しの休日出勤がある」といったものです。そのようなブラック企業に入って後悔しないためにも、できる限り事前に調べておく必要があります。求人票やホームページからだけだとなかなか見抜くのは難しいですが、snsや口コミを調べたり、面接の際にオフィスや社員から最大限感じ取ることも重要だと思います。


# No.３：アピールポイントを持っておくこと

転職においては、「前職までにどのようなことを行ってきたのか」や「自身のスキル」が重要です。通常の業務以上に努力した部分があると、アピールポイントができて転職が楽になります。

私の場合のアピールポイントは<font color="red">業務改善</font>でした。前職の仕事が工場勤務だったのですが、IT系に明るい社員はあまりおらず、DX化は進んでいませんでした。そのため、高専で学んだ基礎知識程度しか持たない私でもPC業務の自動化等を行うことができました。<font color="orange">lucky</font>:thumbsup:
私が行ったのは、Excel VBAによる「シフト作成の自動化」や、統計学を用いた「製品のエラー率見える化」等でした。これを面接でアピールできたのは、非常に強かったなと思います。

業務改善に限らず、資格を取ったり、Qiitaへの記事投稿のようなアウトプットを行うことだったりは、転職においてもアピールできるポイントとなります。もちろん、転職に限らず社内の評価upや自己研鑽にもつながるので、とにかくやっておくべきだと考えています。

# 最後に

私は面接が苦手です。そのため、数をこなしました。幸い、コロナ渦を経てリモート面接が増えたため面接を受けやすい環境が整いました。仕事をしながらの転職活動でしたが、平日５日連続で仕事終わりに面接を受けたこともありました。数をこなせば、緊張しずらくなったり等の面接スキルも上達します。
転職に苦戦しても、諦めることなく挑戦し続けることが転職活動を行う上で最も重要なことだと思っています。転職を考えている方、応援しています！！