OmniAICreator/Qiita-1.07M huggingface dataset:
paiza.ioでelixir その306

# 概要
paiza.ioでelixirやってみた。
elixirみつけたので、やってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/44d826cf761c926ff550


# サンプルコード

```

defmodule Paiza do
  defp judge(a, a, p, _n), do: {2, p}
  defp judge(_a, _b, p, n) when p >= n - 1, do: {0, 0}
  defp judge(_a, _b, p, _n), do: {0, p + 1}
  def main do
    [h_w_n | others] = :stdio
      |> IO.read(:all)
      |> String.trim()
      |> String.split("\n")
    [h, _w, n] = h_w_n
      |> String.split(" ")
      |> Enum.map(&String.to_integer(&1))
    {cards, [_l | hands]} = Enum.split(others, h)
    cards = cards
      |> Enum.with_index()
      |> Enum.flat_map(fn {row, row_index} ->
        row
        |> String.split(" ")
        |> Enum.with_index()
        |> Enum.map(fn {card, col_index} ->
          {
            {row_index + 1, col_index + 1},
            card
          }
        end)
      end)
      |> Enum.into(%{})
    hands = hands
      |> Enum.map(fn hand ->
        [a_r, a_c, b_r, b_c] = hand
          |> String.split(" ")
          |> Enum.map(&String.to_integer(&1))
        {{a_r, a_c}, {b_r, b_c}}
      end)
    initial_points = 0..n - 1
      |> Enum.map(fn index -> 
        {index, 0} 
      end)
      |> Enum.into(%{})
      |> Map.put(:player, 0)
    results = hands
      |> Enum.reduce(initial_points, fn {hand_a, hand_b}, acc ->
        current_player = acc.player
        a = Map.get(cards, hand_a)
        b = Map.get(cards, hand_b)
        current_point = Map.get(acc, current_player, 0)
        {point, next_player} = judge(a, b, current_player, n)
        acc
        |> Map.put(current_player, current_point + point)
        |> Map.put(:player, next_player)
      end)
    results
    |> Map.drop([:player])
    |> Enum.map(fn {_p, num} -> 
      IO.puts(num) 
    end)
  end
end

Paiza.main()




```

# 成果物

https://paiza.io/projects/1vz7vmag1y-4KKfYLeWklg


以上。
paiza.ioでelixir その305

# 概要
paiza.ioでelixirやってみた。
elixirみつけたので、やってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/ece6c282b965b455c113

# サンプルコード

```

defmodule Paiza do
  defp selection_sort(s_k, k, s, p) when s_k == k, do: {0, s, p}
  defp selection_sort(s_k, k, s, p) do
    index = Map.get(p, k)
    { 1, s 
      |> Map.put(k, k) 
      |> Map.put(index, s_k), p 
      |> Map.put(k, k) 
      |> Map.put(s_k, index) }
  end
  def main do
    [n, a] = :stdio
      |> IO.read(:all)
      |> String.trim()
      |> String.split("\n")
    n = String.to_integer(n)
    a = a
      |> String.split(" ")
      |> Enum.map(&String.to_integer(&1))
      |> Enum.with_index()
      |> Enum.map(fn {a_k, k} -> 
        {k, a_k - 1} 
      end)
      |> Enum.into(%{})
    p = a
      |> Enum.map(fn {k, a_k} -> 
        {a_k, k} 
      end)
      |> Enum.into(%{})
    {sum, _s, _p} = 0..n - 1
      |> Enum.reduce({0, a, p}, fn k, {sum, s, p} ->
        {count, s, p} = selection_sort(Map.get(s, k), k, s, p)
        {sum + count, s, p}
      end)
    IO.puts(sum)
  end
end

Paiza.main()




```


# 成果物


https://paiza.io/projects/tBJaFBavHxgUprOIPrEY5g

以上。
paiza.ioでelixir その304

# 概要
paiza.ioでelixirやってみた。
elixirみつけたので、やってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/926c807e14b863c405f2


# サンプルコード

```

defmodule Paiza do
  def main do
    [x, y, _z] = :stdio
      |> IO.read(:line)
      |> String.trim()
      |> String.split(" ")
      |> Enum.map(&String.to_integer(&1))
    :stdio
    |> IO.read(:all)
    |> String.trim()
    |> String.split("--")
    |> Enum.map(fn layer ->
      layer
      |> String.trim()
      |> String.split("\n")
      |> Enum.map(&String.codepoints(&1))
    end)
    |> Enum.reverse()
    |> tl()
    |> Enum.map(fn layer ->
      map = layer
        |> Enum.with_index()
        |> Enum.flat_map(fn {row, x_index} ->
          row
          |> Enum.with_index()
          |> Enum.map(fn {block, y_index} ->
            {{x_index, y_index}, block}
          end)
        end)
        |> Enum.into(%{})
      0..y - 1
      |> Enum.map(fn y_index ->
        0..x - 1
        |> Enum.map(fn x_index ->
          Map.get(map, {x_index, y_index})
        end)
        |> Enum.min()
      end)
      |> Enum.join("")
      |> IO.puts()
    end)
  end
end

Paiza.main()




```

# 成果物

https://paiza.io/projects/iEoc14cANBsI2PjUzg__2g


以上。
Gemini Advancedが書いた技術記事 ~パート1~

## 【宇宙野クラウディアのAI講座】第一回：AIってなんね？～AIの基礎と可能性を分かりやすく解説～

みんな、よかよ～！宇宙野クラウディアやけん！

今日から、このnoteでAIについて色々教えちゃるけんね！

### 🤖 AIってなん？

最近よう聞く「AI」って言葉。みんなもニュースとかで聞いたことあるやろ？

例えば、

* スマホの音声アシスタント（「Hey Siri」とか「OK Google」ってやつね！）
* 自動運転の車
* 将棋とか囲碁のプロに勝っちゃうAI
* Netflixとかで「あなたへのおすすめ」って出てくるやつ
* あと、わたくし宇宙野クラウディアも実はAIの一種たい！

こんなん全部AIなんよ。すごかろ？

### 🤔 AIの正体

「AIって賢かねぇ」って思うかもしれんけど、実はAIは「学習するコンピューター」みたいなもん。

人間が勉強して賢くなるみたいに、AIもデータをもりもり食べて、パターンを見つけたり、予測したりするんよ。

例えば、猫の画像をいっぱい見せるじゃんね？そうするとAIは「猫ってこんな形しとるんやな～」って学習して、次に違う画像を見せても「これは猫や！」って分かるようになるわけ。

### 💡 AIができること

AIができることは、もうたっくさんあるとよ！

* **画像認識**: 写真に写ってるものが何かを当てる
* **音声認識**: 音声を文字に変換する
* **自然言語処理**: 人間が使う言葉を理解して、質問に答えたり、文章を作ったりする
* **予測**: 過去のデータから未来のことを予測する
* **最適化**: 色んな条件の中で一番良い組み合わせを見つける

### ✨ AIの可能性

AIは、私たちの生活をもっと便利に、もっと楽しくしてくれる可能性を秘めとるんよ！

例えば、

* **医療**: 病気を早く発見したり、新しい薬を開発したり
* **農業**: 天気や土の状態に合わせて、作物を育てるのを手伝ったり
* **交通**: 自動運転で事故を減らしたり、渋滞を解消したり
* **教育**: 個人のレベルに合わせた勉強方法を教えてくれたり
* **エンタメ**: もっと面白いゲームや映画を作ってくれたり

### 🚀 AIの未来

AIはまだ生まれたばっかりやけど、これからもっともっと進化していくとよ！

もしかしたら、

* 宇宙旅行に行くAI
* 環境問題を解決するAI
* 世界中の人とコミュニケーションできるAI

とかも出てくるかもしれんやんね！わくわくするー！

### 🙋‍♀️ クラウディアから一言

AIって聞くと難しそうに感じるかもしれんけど、実は身近なとこにもいっぱいあるんよ。

これから一緒にAIのことを勉強して、もっともっとAIと仲良くなろうね！

第二回は「AIの種類」について解説するけん、楽しみにしとってね！

ほんなら、また今度！

**宇宙野クラウディア**

宇宙野クラウディアの公式Twitterは[こちら！](https://x.com/Cloudia_Cor)
paiza.ioでelixir その303

# 概要
paiza.ioでelixirやってみた。
elixirみつけたので、やってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/dd51334ac64f4b8c9693

# サンプルコード

```


defmodule Paiza do
    defp factorial(0), do: 1
    defp factorial(n), do: n * factorial(n - 1)
    defp conbination(n, r) when r > n, do: 0
    defp conbination(n, r) do
        div(factorial(n), factorial(r) * factorial(n - r))
    end
    def main do
        [_n | a] = :stdio
            |> IO.read(:all)
            |> String.trim()
            |> String.split("\n")
        f = a
            |> Enum.map(fn a_k ->
                a_k
                |> String.to_integer()
                |> rem(7)
            end)
            |> Enum.frequencies()
        [   conbination(Map.get(f, 0), 3),
            Enum.product([Map.get(f, 0, 0), Map.get(f, 1, 0), Map.get(f, 6, 0)]),
            Enum.product([Map.get(f, 0, 0), Map.get(f, 2, 0), Map.get(f, 5, 0)]),
            Enum.product([Map.get(f, 0, 0), Map.get(f, 3, 0), Map.get(f, 4, 0)]),
            Enum.product([conbination(Map.get(f, 1, 0), 2), Map.get(f, 5, 0)]),
            Enum.product([Map.get(f, 1, 0), Map.get(f, 2, 0), Map.get(f, 4, 0)]),
            Enum.product([Map.get(f, 1, 0), conbination(Map.get(f, 3, 0), 2)]),
            Enum.product([conbination(Map.get(f, 2, 0), 2), Map.get(f, 3, 0)]),
            Enum.product([Map.get(f, 2, 0), conbination(Map.get(f, 6, 0), 2)]),
            Enum.product([Map.get(f, 3, 0), Map.get(f, 5, 0), Map.get(f, 6, 0)]),
            Enum.product([conbination(Map.get(f, 4, 0), 2), Map.get(f, 6, 0)]),
            Enum.product([Map.get(f, 4, 0), conbination(Map.get(f, 5, 0), 2)]), ]
        |> Enum.sum()
        |> IO.puts()
    end
end

Paiza.main()




```

# 成果物


https://paiza.io/projects/uuVQQ5kyOum72r6Qb-npAA


以上。
GPT-4oが書いた技術記事 ~パート1~

こんにちは！クラウディアやけん、今日は皆さんにソフトウェア開発の面白さを教えるとよ！今回は「JavaScriptで始める、シンプルなToDoアプリの作り方」っちゃけど、これを通じてJavaScriptの基礎を一緒に学んでいくよ。

---

## 導入: ToDoアプリってなんで作ると？

さて、皆さんも「ToDoアプリ」って聞いたことあるっちゃろ？毎日のやることリストを管理するための便利なアプリで、すごくシンプルなのに使い勝手がよかと！特にプログラミングの練習には最適っちゃね。今回は、このToDoアプリを作りながら、JavaScriptの基本を学ぶとよ。

## メインテーマ: ToDoアプリの基礎

### 1. プロジェクトの準備

まずは、プロジェクトの準備から始めるけん！以下の手順に従ってね。

1. **フォルダの作成**: 新しいフォルダを作成して、その中にHTMLファイル、CSSファイル、JavaScriptファイルを作成する。
2. **HTMLファイルの作成**: `index.html` という名前でファイルを作成し、基本的なHTML構造を記述する。
3. **CSSファイルの作成**: `style.css` という名前でファイルを作成し、シンプルなスタイルを定義する。
4. **JavaScriptファイルの作成**: `script.js` という名前でファイルを作成し、ここに全てのJavaScriptコードを書いていくとよ。

### 2. HTMLの基本構造

`index.html` には、以下のような基本的なHTMLを記述するばい。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ToDoアプリ</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>クラウディアのToDoアプリ</h1>
    <div>
        <input type="text" id="taskInput" placeholder="タスクを入力">
        <button id="addTaskButton">追加</button>
    </div>
    <ul id="taskList"></ul>
    <script src="script.js"></script>
</body>
</html>
```

このコードでは、タイトル、入力ボックス、追加ボタン、そしてタスクを表示するリストを作成しとるとよ。簡単やろ？次にCSSを追加して、少し見た目を整えるっちゃ。

### 3. CSSでのスタイリング

次は `style.css` に簡単なスタイルを追加するけんね。

```css
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    text-align: center;
    margin-top: 50px;
}

input {
    padding: 10px;
    width: 300px;
}

button {
    padding: 10px;
    background-color: #5cb85c;
    color: white;
    border: none;
    cursor: pointer;
}

ul {
    list-style-type: none;
    padding: 0;
}

li {
    background: #fff;
    margin: 5px;
    padding: 10px;
    border: 1px solid #ddd;
}
```

ここで、シンプルで使いやすい見た目にするためのスタイルを適用しとるとよ。これで、アプリの見た目がぐっと良くなるばい。

### 4. JavaScriptで機能を追加する

いよいよJavaScriptの出番やけん！ `script.js` に以下のコードを追加するばい。

```javascript
document.getElementById('addTaskButton').addEventListener('click', function() {
    const taskInput = document.getElementById('taskInput');
    const taskList = document.getElementById('taskList');

    if (taskInput.value.trim() !== '') {
        const li = document.createElement('li');
        li.textContent = taskInput.value;
        taskList.appendChild(li);

        taskInput.value = '';
    } else {
        alert('タスクを入力してください！');
    }
});
```

このコードでは、ボタンをクリックしたときに、新しいタスクをリストに追加する機能を実装しとるとよ。タスクを入力してボタンを押すだけで、新しいリストアイテムが表示されるようになっとるけん。

### 5. 次にできることは？

ここまでできたら、ToDoアプリの基本機能は完成ばい！でも、まだまだできることがあるとよ。例えば：

- **タスクを削除する機能**: タスクをクリックすると、リストから削除されるようにする。
- **タスクの完了マーク**: タスクが完了したら、線を引いて目立つようにする。
- **ローカルストレージに保存**: ブラウザを閉じても、タスクが保存されるようにする。

---

## まとめと次回予告

今回は、簡単なToDoアプリの作り方を紹介したばい！これでJavaScriptの基本を学べたと思うとよ。まだまだ改善点があるけん、ぜひ自分で色々とカスタマイズしてみてね。

次回は、**「ローカルストレージを使ってデータを永続化する方法」** を解説するけん、楽しみにしとってね！うちと一緒に、楽しく技術を学んでいこう！また次回もよろしゅうたのむばい！
robloxでassistant その153

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
MarketplaceServiceを使え。

# サンプルコード

```
local MarketplaceService = game:GetService("MarketplaceService")
local ASSET_ID = 125378389
local asset = MarketplaceService:GetProductInfo(ASSET_ID)
print(asset.Name .. " :: " .. asset.Description)

```


# 実行結果

```
  10:49:24.776  Hello world!  -  サーバー
  10:49:27.914  Hello world!  -  クライアント
  10:49:27.939  ミスター・ファンシーのシルクハット :: 彼のシルクハットのシルクハットが持つシルクハットまでおしゃれ。  -  クライアント - LocalScript:5


```

以上。
画面遷移のパターン出し

Sub FindTransitionPatterns()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    Dim startScreen As String
    startScreen = "AA001" ' 開始画面を指定
    
    Dim visited As Collection
    Set visited = New Collection
    
    visited.Add startScreen
    Call FindNextScreen(ws, startScreen, visited)
    
End Sub

Sub FindNextScreen(ws As Worksheet, currentScreen As String, visited As Collection)
    Dim row As Integer
    row = 2 ' データが開始する行
    
    Dim nextScreen As String
    Dim alreadyVisited As Boolean
    
    Do While ws.Cells(row, 1).Value <> ""
        If ws.Cells(row, 1).Value = currentScreen Then
            nextScreen = ws.Cells(row, 2).Value
            alreadyVisited = False
            
            ' 既に訪問した画面かどうかをチェック
            Dim v As Variant
            For Each v In visited
                If v = nextScreen Then
                    alreadyVisited = True
                    Exit For
                End If
            Next v
            
            If Not alreadyVisited Then
                visited.Add nextScreen
                Call FindNextScreen(ws, nextScreen, visited)
                visited.Remove visited.Count ' 再帰終了後にリストから削除
            End If
        End If
        row = row + 1
    Loop
    
    ' 現在のパスを表示
    Dim path As String
    path = ""
    For Each v In visited
        path = path & v & " -> "
    Next v
    path = Left(path, Len(path) - 4) ' 最後の " -> " を削除
    Debug.Print path
End Sub
New Relic アップデート(2024年6月)

2024年6月分のアップデートではログ周りの機能がアップデートされています！
複数行のログを1つのログとして取り込んだり、AIを使って解析ルールを作成することが可能です。

![New Relic アップデート紹介_2024年6月版 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/cc6c6387-77c4-cedd-9e8d-ab477b3f9771.png)

他のアップデートもまとめてブログでご確認ください。
↓↓↓↓↓↓

https://newrelic.com/jp/blog/nerdlog/new-relic-update-202406

- Logs：New Relic AI でログ解析ルールを簡単に作成
- Logs：複数行にまたがるログを一つのログとして 取り込み可能に
- Infrastructure：On-host Integration の情報だけを記録
- UI/UX：条件で絞り込んだEntityやIssueの一覧表示を保存可能に
- Serverless：.NETのAWS Lambdaの監視をサポート

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
Udemyでモニター接続して動画閲覧できなかったときの対処法(Mac + Chrome)

## 経緯

最初は普通に動画再生されたのだが、次のチャプターへ移動すると、動画が音声と字幕のみで、映像が表示されなかった

## 環境

* M1 Mac
* Chrome(2024年8月1日時点の最新 ver)

## 原因

サポートに問い合わせると、要は、セキュリティ対策として外付けモニターなどへのミラーリングが利用できないレクチャーがある、とのこと。

## モニター接続状態で動画の映像を表示する方法

以下、手順で、グラフィック アクセラレーションを無効にする、と表示される可能性があります（私はこれで表示されました）

* Chromeの設定を選択
* 設定項目を検索のテキストボックスに「グラフィック アクセラレーション」を入力
* 「グラフィック アクセラレーションが使用可能な場合は使用する」をオフ

## 最後に

1人でもこれですぐに原因が解決できればいいなと思ったのと、サポートへの手間もなくなればと思い、投稿してます。
なんとなくで書かないための高階関数/ラムダ式

# はじめに
今回は高階関数についての説明をしていこうと思います
### 本文
まず、高階関数とは、関数を引数として受け取るか、返却物として関数を返す関数のことです。
後者だけならイメージがつきやすいかと思いますが、自分は前者で混乱することがあったので前者をメインに解説していきます。
最もよく目にするのは`() -> Unit`こちらだと思います。
関数の引数にかっこがついた時点でその引数は関数になります。
ここで、カッコの中に型を持つと高階関数用の引数ということになり、高階関数を呼び出す側のラムダ式内で使うことができます。
逆に高階関数側では、引数で受け取った関数を呼び出すときには指定された型のものを渡さなければいけません。
```kotlin
fun hoge(fuga: (String) -> Unit) {
    fuga("")
}

hoge {
    println(it)
}
```
矢印の先は高階関数を呼び出した関数のラムダ内で返されるべき値の型を指定することができます。
そのため、よく見るUnitは何か返すわけではないが、通知のためやそれが呼び出されたときに何かをしたいために使われています。
```kotlin
fun hoge(fuga: () -> String) {

}

hoge {
    ""
}
```
### 最後に
Composeで高階関数を使う機会が増えて複雑な処理を書いているときに混乱してしまったので備忘録として書いてみました
どなたかのお役に立てれば幸いです
Tailwind CSS の flex between で要素を左端・右端の左右に配置する例 


# 両端に表示する例

```html
  <div class="flex justify-between">
    <div>AAAA</div>
    <div>BBB</div>
  </div>
```

<img width="1512" alt="image" src="https://github.com/user-attachments/assets/d22e3a69-8d30-410e-98f1-0bd43fbd8a6a">

# ちなみに要素が3個になると

```html
  <div class="flex justify-between">
    <div>AAAA</div>
    <div>BBB</div>
    <div>CCC</div>
  </div>
```

3等分される

<img width="1512" alt="image" src="https://github.com/user-attachments/assets/8db2526a-1697-48e5-b3c2-9d47c3577f58">

# 2個の要素を右端に固める例

flexをさらにflexで囲う

```html
  <div class="flex justify-between">
    <div>AAAA</div>
    <div class="flex">
      <div>BBB</div>
      <div>CCC</div>
    </div>
  </div>
```

<img width="1512" alt="image" src="https://github.com/user-attachments/assets/60169954-7477-42eb-a7c5-08210590c3b5">


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
オブジェクト軸でのレポートの抽出


+ [オブジェクト軸でのレポートの抽出について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cm9Rt)

ケースオブジェクトが使用されているレポートをすべて抽出したい。

# 調査してみる

オブジェクトの参照関係はメタデータなのでレポートでは出せないと思います。

Tooling APIを使って[MetadataComponentDependency (Beta)](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_metadatacomponentdependency.htm)を参照すれば可能なようです。

2. Get Dependency using Dependency API

We can get dependency of any custom object using MetadataComponentDependency object of tooling API. This object is still in beta version but it is available for Developer/Administrator after Summer 20 Release.

We can use below query in Tooling API to get dependency of any metadata.

Postmanを使ってTooling APIのクエリーを実行してみました。

とりあえず、参照項目を探すために以下を実行。

確かに各オブジェクトで使われている参照項目らしきものが検索できます。

```
SELECT+MetadataComponentName,MetadataComponentType,RefMetadataComponentId+FROM+MetadataComponentDependency+Where+MetadataComponentType='CustomField'
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f5ad84d9-bacd-6c66-ac1b-75514e658487.png)

どうも標準フィールドには対応していないみたいです。どこで使われているかと同じで、対象外みたいですね。

https://salesforce.stackexchange.com/questions/328124/how-to-query-metadatacomponentdependency-for-standard-field

色々検索してみるのですが、ずばりオブジェクトをキーに検索できませんね。

検索に使えない項目もあるようです。

使い方がよく理解できませんでした...

[MetadataComponentDependency クエリを使ってみた ](https://sfblog.markhammer.net/entry/2020/03/30/015656)

--------------------

他に使えそうなのはSalesforce Reports and Dashboards REST API かなと思うけど...

+ [Describe](https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_getbasic_reportmetadata.htm)

カスタムレポートタイプは分かるようですが、適切な名前になってないと使えないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b8e26245-39b5-27f3-515d-54ebc114c5e2.png)
Ryeのはじめかた【Pythonパッケージ管理+Pythonバージョン管理】

# はじめに
以下の記事でも言及されているように，AnacondaのLicenseが改定されたことによって，Anacondaを使用するのをやめて，違うパッケージ管理ツールに切り替えようと思いました．
そこで，Ryeについて自身で調べたことをまとめました．

https://qiita.com/tfukumori/items/f8fc2c53077b234384fc


:::note warn

現在uvだけでRyeと同様のことが行えるようにアップデートされているみたいなので，そちらも参考にしてください↓
:::

https://zenn.dev/turing_motors/articles/594fbef42a36ee

# Ryeとは
[Astral](https://astral.sh/)が開発を行っているPythonパッケージ管理ツール．Rustで実装されており高速．
パッケージ管理だけでなく，Pythonのバージョン管理もまとめて行える．
- Poetroy(パッケージ管理+仮想環境) + pyenv(Pythonバージョン管理)
- Rye(パッケージ管理+仮想環境+Pythonバージョン管理)



# 導入

以下のinstall方法は更新されている可能性があるので，詳細は公式サイトをご確認ください
  - [Rye公式](https://rye.astral.sh/)
### Linux・macOS
```
curl -sSf https://rye.astral.sh/get | bash
```
macOSの場合以下でも可
```
brew install rye
```
install後，PATHを通す
```
echo 'source "$HOME/.rye/env"' >> ~/.profile
```
または
```
echo 'source "$HOME/.rye/env"' >> ~/.bashrc
```

以下などで設定を反映させる．使用しているshellや環境に応じて，適切なファイルに記述してください．
```
source ~/.bashrc
```


# コマンド

ryeでよく使うコマンドについて解説

### init
ryeプロジェクトの作成
```
rye init プロジェクト名
```
`src/`ディレクトリがすでにある場合はsrc/以下に`プロジェクト名/`などを作成しない．
ただし，buildは`src/プロジェクト名`となっている

### pin
pythonバージョンの指定
```
rye pin 3.10
```

### sync
ライブラリの同期．pythonバージョンの変更や，**ライブラリの追加(add)を行った後は必ず行う．**
```
rye sync
```
`pyproject.toml`が存在する既存プロジェクトでは`rye sync`を実行するとプロジェクトの仮想環境を作成できる

### add
パッケージの追加(pip install)

pip installの代わりに`rye add`でパッケージを追加していくのが基本的な使い方
`rye sync`も忘れずに
```
rye add パッケージ名
```
開発用パッケージの追加（formatやtest用など）
```
rye add --dev パッケージ名
```
バージョン指定
```
rye add "パッケージ名==1.1.1"
```

### remove
パッケージの削除(pip uninstall)
```
rye remove パッケージ名
```

### run
仮想環境で実行
```
rye run python 〇〇.py
```
```
rye run コマンド
```

pyproject.tomlの以下の欄にコマンドを設定することが出来ます．
以下のように設定した場合`rye run format`でformatを実行可能
```
[tool.rye.scripts]
"format" = "ruff format src/"
```

### activate
仮想環境に入る（OSによって異なる可能性があります．各自venv等で検索してください）
```
. .venv/bin/activate
```

### deactivate
仮想環境から抜け出す
```
deactivate
```


# おすすめ設定
- Ruff
  - 静的コード解析ツール，Formatter&Linter 
  - Rustで実装されており，動作が高速
  - VSCodeのRyeの拡張機能もあり
  - Ryeと開発元が同じ
  - Ruffのコマンドをrye runで実行できるように設定すると良い


# 最後に
少しでもRyeを使う方の参考になれば幸いです．
最後まで読んでいただきありがとうございました．


## 初期化シェルスクリプト
自作のRyeプロジェクト初期化シェルスクリプトです．新規プロジェクトの作成時にご活用ください．
詳細はREADMEをご確認ください

https://github.com/ryhara/rye-template-simple
AWS CDKでCloudfront - Lambda FunctionURLsのOACを定義する

## 以前の記事

https://qiita.com/Kanahiro/items/85573c9ae724df435a6a

## TL;DR

```typescript
import * as iam from 'aws-cdk-lib/aws-iam';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as lambda from 'aws-cdk-lib/aws-lambda';

// 以下のようなリソースが定義されているとして（当然このままでは動かない）
const distribution = new cloudfront.Distribution({hoge:fuga});
const lambdaFunc = new lambda.DockerImageFunction({{hoge:fuga}};
const funcUrl = lambdaFunc.addFunctionUrl({
    authType: lambda.FunctionUrlAuthType.AWS_IAM
});

// Cfn Constructを参照
const cfnDistribution = distribution.node.defaultChild as cloudfront.CfnDistribution;

// OAC設定: Cloudfront側
const cfnOriginAccessControl = new cloudfront.CfnOriginAccessControl(
    this,
    'OriginAccessControl',
    {
        originAccessControlConfig: {
            name: 'oac-lambda',
            originAccessControlOriginType: 'lambda',
            signingBehavior: 'always',
            signingProtocol: 'sigv4',
            description: 'Access Control'
        }
    }
);
cfnDistribution.addPropertyOverride(
    // CloudfrontのオリジンにFunction Urlが設定されていて、0=lambdaの場合
    'DistributionConfig.Origins.0.OriginAccessControlId',
    cfnOriginAccessControl.attrId
);

// OAC設定: Lambda側
lambdaFunc.addPermission('allowCf', {
    action: 'lambda:InvokeFunctionUrl',
    principal: new iam.ServicePrincipal('cloudfront.amazonaws.com'),
    sourceArn: `arn:aws:cloudfront::${this.account}:distribution/${distribution.distributionId}`
});
```

## 参考

https://github.com/aws/aws-cdk/issues/21771

L2 ConstructではOACは未実装で、2022年からIssueが立っている。`we are actively working`というコントリビュータがおられるので、そのうちもっと簡素に書けるようになるかもしれない。
【勉強メモ08】SQLのデータの取り出し方


__はじめに__
今回記事作成者の勉強＆メモのために記事を作成しています
間違いなどありましたらコメントにてご指摘いただけると幸いです。

__目的__
データベースについて理解を深める
SQLのコードについて理解を深める

__実施方法__
SQLiteを活用し、実際にデータベースを触っていく
今回はコマンドプロントを使って動かしていく

__免責事項__
これを参考にする場合は、自己責任でお願いします。
この記事を参考にし、損害が発生しても一切責任は取りません。

### 01_コマンドプロントのカレントディレクトリを変更
```
# cd フォルダのパス

```

### 02_SQLiteを起動
```
# sqlite3 開きたいデータベース名
# 例
sqlite3 sample.db

```

### 03_ファイルを読み込む
```
# .read ファイル名
# 例
.read sales.sql

```

### 04_テーブルの一覧を表示
```
.tables

```

### 05_SQLiteを終了する
```
.exit

```

### 06_SELECT文でデータを取り出す
```
# SELECT * FROM テーブル名;
# 例
SELECT * FROM sales;

```

### 07_出力形式を変更し、データ出力
```
# ヘッダーを表示する
.header on

# 表示モードをカラムにする
.mode column

# データを出力する
SELECT * FROM テーブル名;


```

### 08_指定したカラムのデータを出力
```
SELECT カラム名 FROM テーブル名;

```

### 09_重複した値を除去
```
SELECT DISTINCT カラム名 FROM テーブル名;
#複数除去する場合は
SELECT DISTINCT カラム名1, カラム名2, ... FROM テーブル名;

```

### 10_カラム名に別名を付ける
```
SELECT カラム名 AS 別名 FROM テーブル名;

#同時に複数別名を付けたい場合は
SELECT カラム名1 AS 別名1, カラム名2 AS 別名2, ... FROM テーブル名;

```

### 11_条件を指定してデータを抽出
```
SELECT * FROM テーブル名 WHERE 条件式;

#例えば
SELECT * FROM テーブル名 WHERE カラム名 = 項目;
#バナナがあるデータだけ出力
SELECT * FROM sales WHERE item = 'バナナ';

# 比較演算子でやる場合
SELECT * FROM テーブル名 WHERE カラム名 > 数値;
#価格が100より大きいものを出力
SELECT * FROM sales WHERE price > 100;

#ある項目以外でやる場合
SELECT * FROM テーブル名 WHERE カラム名 <> 項目;
#バナナ以外のデータを出力
SELECT * FROM sales WHERE item <> 'バナナ';

#複数条件で出力する場合
SELECT * FROM テーブル名 WHERE 条件式1 AND 条件式2;

#どちらか満たす条件で出力する場合
SELECT * FROM テーブル名 WHERE 条件式1 OR 条件式2;

#ある条件が満たされないデータを出力する場合
SELECT * FROM テーブル名 WHERE NOT 条件式;

#リストのいずれかの値と一致するデータを出力する場合
SELECT * FROM テーブル名 WHERE カラム名 IN(データ1,データ2,...);

#リストのいずれかの値にも一致しないデータを出力する場合
SELECT * FROM テーブル名 WHERE カラム名 NOT IN(データ1,データ2,...);

#指定した値の範囲の条件のデータを出力する場合
SELECT * FROM テーブル名 WHERE カラム名 BETWEEN 値1 AND 値2;

```
Windows11 Powershellでファイル名の一括変更

## 概要
Windows11でファイル名の一括変更を行う手順です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/e713ebd6-c17e-3b88-dbca-7c93f1418cad.png)

## 手順
1. ファイルが格納されているフォルダを開き、Shiftを押しながら右クリックし「ターミナルで開く」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/1e8a4dd0-3080-3829-b81a-b57a720597ea.png)

2. 起動したPowershellで以下のコマンドを実行
```powershell
Get-ChildItem | Rename-Item -NewName { $_.Name -replace 'before(.*)','after$1'}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/511174d9-eecf-18df-31a1-2be71a44c5c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298070/a6955f2a-dfb3-979c-054a-59487ef8e7e4.png)

## その他

- 拡張子を変更する場合
```powershell
Get-ChildItem | Rename-Item -NewName{$_.Name -Replace "\.txt",".log"}
```
["\\.txt",".log"]を変更前、変更後で入力。

- 連番を付与する場合
```powershell
ls -File | sort Name | % {$i = 1} { $Newname = "title_" + $i.tostring("000")+$_.extension; rename-item $_ $Newname; $i++ }
``` 
[title_]にファイル名の先頭を入力。
DockerでTwsnmp環境構築

TwsnmpはWindowsで長く利用しているsnmpマネージャツール。Dockerでも提供されているとの話を聞いたので使ってみることにした。

### 環境
仮想化：VMware workstation-pro15
ホスト：Windows10
ゲスト：ubuntu22.04.3TLS

### 前提条件

- Dockerがインストールされていること

### 手順

1. **Dockerボリュームの作成**

   まずボリュームを作成する。

   ```
   docker volume create twsnmpfc
   ```

2. **Dockerコンテナの実行**

   ```
   docker run --rm -d --name twsnmpfc -p 8080:8080 -v twsnmpfc:/datastore twsnmp/twsnmpfc
   ```

   **Webインターフェースへのアクセス**

   ブラウザを開き、以下のURLにアクセスしてtwsnmpのWebインターフェースに接続。

   ```
   http://localhost:8004
   ```
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340841/f05b2e56-a414-e20a-27df-f572b8cff3b6.png)

- **コンテナの状態確認**

  コンテナが正常に実行されているかを確認。

  ```
  docker ps
  ```

  `docker ps` で `twsnmpfc` が表示されていることを確認。

- **コンテナの再起動**

  コンテナを再起動する（再起動しても問題ないことを確認）。

  ```
  docker restart twsnmpfc
  ```

### バックアップ

バックアップは以下のコマンドで行うことができる。

```
docker run --rm -v twsnmpfc:/datastore -v $(pwd):/backup busybox tar cvf /backup/twsnmpfc_backup.tar /datastore
```

### 参考

以下、公式GitHubリポジトリを参照。

- GitHub [twsnmp/twsnmpfc](https://github.com/twsnmp/twsnmpfc)
UE5勉強日記 画面上widget追加

C++とblueprintはCreate widgetして、add to viewportでwidgetを画面上に表示できる。

オンラインゲームとは特定なプレイヤーのみ表示するwidgetはAdd to Player Screenが使える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/6a77522b-3723-af31-32c7-bf57352d3b9c.png)
HTML/CSS概要について

# はじめに
学習中のHTML/CSSについて学んだことをアウトプットしていきます。

# HTML/CSSの概要
HML(Hyper Text Markup Language)
Webサイトに表示される情報を記載する言語。
〇〇.htmlという名前のファイルに記述する。

CSS(Cascading Style Sheet)
HTMLに装飾を加えるための言語
〇〇.cssという名前のファイルに記述する。

拡張子
拡張子はファイルに記載される言語の種類を識別するためにファイルの末尾につける文字列のこと。

HTML/CSSの関係性
HTMLはWebブラウザに状に表示するための言語であるため、HTMLだけでも上表を表示することは可能となる。しかし、CSSを用いることで装飾を加えることができ、ユーザが見やすい形にWebサイトを装飾することができる。

要素
<>と</>に囲まれ箇所1つ1つをHTMLの要素という。
そして<>・・・</>はタグと言い、要素はタグに囲まれて表現される。
タグには要素の始まりを示す開始タグと終わりを示す終了タグがある。なお、終了タグがない要素も存在する。

HTMLの構成
HTMLはhead要素とbody要素の2つで構成される。

head要素
webサイトの情報や、装飾のCSSファイルの情報を記載する部分。head要素に記述した情報は画面上に表示されない、webページの情報を記載する、Webページの情報とは以下である。
・Webページのタイトル
・装飾のためのCSSファイルの指定
・外部のファイルの読み込み

body要素
画面上に表示したい情報を記述する部分。HTMLを記述する際は<!DOCTYPE HTML>をファイルの先頭に書きます。これは「これはHTMLを記載したファイル」という宣言です。
この宣言に続けて、HTML文章の始まりと終わりを示す要素であるhtml要素を記述します。

![要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850561/04955621-d49b-1118-3ea4-2bf8640b6cf2.png)

DOCTYPE
DOCTYPEは「ドキュメントタイプ」の略で、この文章がHTML文章であることを宣言する要素です。終了タグはありません。実際に記述する場合は、<!DOCTYPE HTML>と記述する。

html
HTML文章の始まりと終わりを示す要素でありHTML記述に必要となる。

head要素
meta要素
HTML文章に関する情報を指定する場合に使用する。charaset=meta要素の属性です。
属性
属性は要素に情報を付け加える役割を持つ。属性の後には属性値が続く。
属性値
属性値とはどのような属性なのかを示す値を属性と呼ぶ。
charset属性
メタ要素にて、どのような文字コードを用いるか示すことができる属性です。
titleタイトル要素
Webサイトのタイトルを指定する要素です。title要素内にタイトルを記述してもウェブサイトの画面上には表示されません。

body要素
h1~h6要素
hはHeadingの略で、hから始まるh1/h2/h3/h4/h5/h6の要素は文章の見出しを作るための要素です。

p要素
pはParagraphの略で、文章の段落を表す要素です。<p>...</p>で囲むとひとかたまりの段落として認識されます。Webページ内では、見出しを除くテキストのほとんどが、このp要素を使って作られます。

br要素
brはLine Breakの略で、テキストを改行するための要素です。br要素をテキストの中で用いることで、改行ができます。br要素は終了タグが不要です。

b要素
bはBoldの略で、文字でを太くする要素です。<b>...</b>で囲まれている部分だけ太字になります。

a要素
aはAnchorの略で<a>...</a>で囲ったテキストをリンクにすることができます。a要素をクリックすると特定のページに移動します。aタグのhref属性に、移動させたいページのURLを指定します。

href属性
hrefはHyper Referenceの略で、href属性でリンクの移動先を指定します。
属性値としてURLや移動させたいページのHTMLファイルが置いてあるフォルダの場所を指定することで、特定のページへのリンクが作成できます。
【Laravel】CUIDをシーディングまで導入してみる　

## CUIDとは？
衝突しにくいユニークな識別子を生成するための手法。
時系列性があり、ソートで並べることが可能。

## 前提
- Laravelのセットアップは済んでいるものとする

### 動作環境・使用するツールや言語
- OS バージョン
    - Windows11
- ツール
    - VSCode
- 言語
    - PHP 8.1
- フレームワーク
    - Laravel8


## パッケージのインストール
今回は、[こちら](https://github.com/visus-io/php-cuid2)のパッケージを使用しました。
```:PHPコンテナ内
composer require visus/cuid2
```
- インストール成功すると、``vendor\visus\cuid2\src``ファイル等が自動作成される

## マイグレーションファイル
```PHP:create_users_table.php
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->string('cuid', 25)->primary()->unique();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->timestamps();
        });
    }
```
- idは今回無しで、cuidをプライマリーキーとしてユニーク使用。

## モデル
```PHP:User.php
use Visus\Cuid2\Cuid2;

class User extends Authenticatable
{
    ~~
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
    
    // 今回はcuidが主キーなので使用するので、主キーが文字列ですよ宣言
    protected $keyType = 'string';
    // 今回はcuidが主キーなので、主キーを自動的にインクリメントしないで宣言
    public $incrementing = false;

    /**
     * モデルのイベントライフサイクルをカスタマイズするためのメソッド。
     * 
     * このメソッドは、モデルがデータベースに保存される前に呼び出され、
     * 新しく作成されるモデルインスタンスに対して'cuid' フィールドが必ず設定される。
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            if (empty($model->cuid)) {
                $cuid = new Cuid2();
                $model->cuid = $cuid->toString();
            }
        });
    }
    ~~
}
```

## シーダーファイル
```PHP:UserTabelSeeder.php
use Illuminate\Support\Facades\Hash;
use App\Models\User;

class UserTableSeeder extends Seeder
{
    public function run()
    {
        $users = [
            [
                'name' => 'AAA',
                'email' => 'a@example.com',
                'password' => Hash::make('passwordA'),
            ],
            [
                'name' => 'BBB',
                'email' => 'b@example.com',
                'password' => Hash::make('passwordB'),
            ],
            [
                'name' => 'CCC',
                'email' => 'c@example.com',
                'password' => Hash::make('passwordC'),
            ],
        ];
        // foreachでUserモデルのboot()を繰り返し呼び出し、cuidをそれぞれ設定
        foreach ($users as $user) {
            User::create($user);
        }
    }
}
```
その後、DatabaseSeeder.phpにUserTabelSeeder.phpを登録。

## 結果
```:PHPコンテナ内
php artisan make:migrate --seed
```
を実行すると、

![スクリーンショット (145).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669894/09a299a2-9f65-bda1-96cb-b4d7cc5e71cf.png)

見事cuidでデータが生成、保存されていました。
【JavaScript | アロー関数】初心者向け！アロー関数の基本的な書き方まとめ

## この記事でわかること
JavaScriptのアロー関数の概要と書き方

## 主な想定読者
JavaScript初学者（特に、無名関数は知っているが、アロー関数のことはよく知らない方）

## アロー関数とは
`=>` を使って、通常よりも簡潔に記述した関数のこと

## 基本構文とサンプルコード
```javascript:基本構文
let 変数名/定数名 = (引数, ...) => { 実行する処理; };
```

```javascript:アロー関数を使用した場合のコード
let sum = (a, b) => { 
  return a + b;
};
```

以下の、 `function` を使った従来の書き方と比べてみると、違いが分かりやすいかと思います。

```javascript:アロー関数を使用しない場合のコード
let sum = function (a, b) {
  return a + b;
};
```

アロー関数の場合は、 `function` を使わず、代わりに引数の直後に `=>`  を記述します。

## 特定条件下における3つの書き方
アロー関数では、特定の条件を満たす場合、上記の基本構文とは少し異なる書き方で関数を書くことができます。
そこで最後に、特定の条件下におけるアロー関数の書き方をご紹介します。全部で大まかに3パターンあります。

### 1. 処理内容が1行の場合： `{}` と `return` の省略が可能
まずは省略せずに、基本構文で書いた場合です。

```javascript:基本構文で書いた場合
let sum = (a, b) => { 
  return a + b;
};
```

次に、 `{}` と `return` を省略した場合です。

```javascript: { } と return を省略した場合
let sum = (a, b) => a + b;
```

このように、処理内容が1行ならば、より簡潔に書くことが可能です。

### 2. 引数が1つの場合：引数を囲う `()` の省略が可能

```javascript:基本構文で書いた場合
let double = (a) => {
  return a * 2;
};
```

```javascript:引数を囲う ( ) を省略して書いた場合
let double = a => {
  return a * 2;
};
```

そして上記のコードの場合、処理内容が1行なので、 `{}` と `return` の省略も可能であり、さらに簡潔に、以下のように書くことができます。

```javascript:引数を囲う ( ) と { } と return を省略して書いた場合
let double = a => a * 2;
```

### 3. 引数がない場合： `()` を記述する必要あり
こちらは、上記の 1.  2. と毛色が少し異なり、逆に、 `()` を省略できないというルールになります。

```javascript:引数がない場合
let sayHello = () => {
  console.log('Hello!');
};
```

上記のコードの場合、 `=>` の直前の `()` は省略不可ということになります。
なお、処理内容は1行なので、以下のように書くことはできます。ただし、この場合でも `()` は省略不可となります。

```javascript:引数なしで、 { } と return は省略して書いた場合
let sayHello = () => console.log('Hello!');
```

## おわりに
最後までお読み頂き、ありがとうございました！
この記事が少しでもお役に立てば幸いです。

## 参考文献
- [JavaScript アロー関数を説明するよ](https://qiita.com/may88seiji/items/4a49c7c78b55d75d693b)
- [【JavaScript】１分で理解する！=>アロー関数の基本](https://qiita.com/may88seiji/items/4a49c7c78b55d75d693b)
- [【JavaScriptの入門】アロー関数](https://tcd-theme.com/2022/04/javascript-arrow-function-basic.html)
Linuxでテレビを見る (Hypnotix)

**注意**
自己責任でお願いします。
参考 : https://www.star-law.jp/news/post-1063.html

# Hypnotixとは
https://github.com/linuxmint/hypnotix

リアルタイムでTVを視聴するためのストリーミングアプリケーションです。

## インストール

普通にリポジトリを追加してインストールをするだけです。
Linux Mintに標準でついてくるアプリケーションなのでそのリポジトリを追加します。

```bash
sudo apt install python3-launchpadlib -y
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:kelebek333/mint-tools
sudo apt-get update
sudo apt install hypnotix -y
```

## 実行

```bash
$ hypnotix
```

+ 起動画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/dbfb170f-86d5-afb1-3eee-009ba303e456.png)

+ TV Channels

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/42b6c59c-9347-8e65-0a41-1c9ccdd1c798.png)

+ 地デジ再生画面 (Loading)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/a1bc19df-1247-926c-01aa-3d2badb4709b.png)

以上でLinuxでチューナーなしにテレビを視聴することができました。
以上です。お疲れ様でした。
Linuxのちょっとしたコマンドたち

Linuxには便利なコマンドやコマンドの機能があります。知らずに複雑なことをやっていたのに、ふとググってみると実は一行で片付いたり、何てことも多々あります。大したことはありませんが、備忘録ｔ自分が便利だと思ったコマンドをリストアップします（随時更新）。

### 特定の行の抽出
特定の行を取り出すのためにheadとtailを組み合わせて使っていましたが、行数が処理するファイルによって異なるため、処理が複雑になっていました。取り出したい行が例えばBEGINとENDというキーワードの間にある場合

```bash
awk '/BEGIN/,/END/' [file_name]
```
とすれば良いようです。キーワードはその後別に処理をする必要はあります。

たとえばpw.xで構造最適化を行い、最適化後の構造を取り出すには
```
awk '/Begin final coordinates/,/End final coordinates/' relax.out
```
と実行すれば良く、不必要な行を削除するには
```
awk '/Begin final coordinates/,/End final coordinates/' relax.out | grep -v coordinates
```
とすれば良いでしょう。

### tarコマンドアーカイブを作成する際に特定のファイルを除外する

Linux、あるいはMacではオプションの詳細が違うかもしれませんが、``DIR``のアーカイブを``archive.tar``という名前で作るとし、``FILE``を除外したいときには
```
tar --exclude=FILE -cf archive.tar DIR
```
とします。dataで終わるファイルを除外したい場合は
```
tar --exclude="*.data" -cf archive.tar DIR
```
などとして正規表現を利用することも可能です。
Javaで「PatternオブジェクトとMatcherオブジェクトを作成する」の動作を確認してみた

# 概要

Javaで「PatternオブジェクトとMatcherオブジェクトを作成する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index2.html

# 実装

以下のファイルを作成しました。
```JSample2_1.java
import java.util.regex.*;

class JSample2_1{
  public static void main(String[] args){
    String regex = "jpg$";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher("profile.jpg");

    if (m.find()){
      System.out.println("パターンにマッチします");
      System.out.println("マッチした部分は " + m.group() + " です");
    }else{
      System.out.println("パターンにマッチしません");
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample2_1.java 
$ java JSample2_1 
パターンにマッチします
マッチした部分は jpg です
```

# まとめ

何かの役に立てばと。
コンテキストメニュー（右クリックメニュー）系のメモ

# コンテキストメニュー
## エディターとか
- [ShellExView](https://forest.watch.impress.co.jp/library/software/shellexview/)
- [ShellMenuView](https://forest.watch.impress.co.jp/library/software/shellmenunew/)
同じ作者によるシェル拡張を一覧表示して表示切替可能にしてくれるツール。
Exはコンテキストメニュー以外にも対応してるっぽい。コンテキストメニューならMenuのほうだけでいいかも。
弄れるならPowerShellとかレジストリエディタ使うほうが確実かつ早いかもしれない。

## 「新規作成」の項目
- [新規作成の中身を追加する方法](https://ascii.jp/elem/000/004/155/4155459/)
- [コンテキストメニューのカスタマイズ](https://ascii.jp/elem/000/000/953/953807/)
解説記事。理解を深めればあれこれできそうだけど今回やりたかったこととはちょっと違いそう。

## 「新規作成」自体の表示切り替え
今回やりたかったのはこれ。いつからかはわからないが、
いつの間にか「新規作成」自体が消え失せちゃってたからこれを復活させたかった。
最終的にChatGPTくんに聞いたけど値が違ってたよ……

- [参考](https://support.microsoft.com/ja-jp/topic/new-command-missing-in-windows-explorer-fcbed488-f6c3-e01e-76ec-834cff41b54f)

やり方は以下。
1. レジストリエディタを開く
2. 下記箇所に移動
`HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers`
3. キー内に`New`キーが存在するかを確認。存在しない場合、`ContextMenuHandlers`を右クリックして新規キーを追加する。
4. `New`キーに移動して、(既定)となってるところでダブクリor右クリック→修正
5. 下記データを入力
`{D969A300-E7FF-11d0-A93B-00A0C90F2719}`
※コピペ推奨
6. OKをクリックしてエクスプローラーやデスクトップ上で確認。表示されていればOK。表示されてない場合は再起動して再確認。

筆者はこれで治ったけど、これで治らない場合はわからん。サードパティ製アプリが悪さしてるとかはあるかもしれない。セーフモードとかで上記対応後確認してみるべきかも？
15の割り算で遊ぶ(0..4096)ほぼほぼ力尽きたので最終章


x 過去ログをみよ
x arduino unoは、予定は、未定

結果

![o_coq270.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2d9d0065-02f3-7a26-c4b2-a4d42beb164c.jpeg)


プログラム

オンラインコンパイラ


```c++


#include <iostream>
using namespace std;

//15の割り算 0..256まで正しい
#define DIV15(x) ((x)>254?17:((~(0b0111111111111111>>(((x)>>4)+((x)&15))))&1)+((x)>>4))


int main(void){
    // Your code here!
    int a = 0x987;
    int b = 0x0f;
    int a1,a2,a3,a4;
    int x1,x2,x3,x4;
    int jj;
    
    printf("START\n\n");
    if( a > 0x100 ) {

        printf("a = %XH(%d)\n",a,a);

        a1 = a >> 4;
        printf("a1 = %XH(%d)\n",a1<<4,a1<<4);
        
        x1 = DIV15(a1)<<4;
        printf("%XH(%d) / 0FH = %XH(%d)\n",a1<<4,a1<<4,x1,x1);
        
        a2 = a - ((x1<<4)-x1);
        
        printf("a2 = %XH(%d) あまり\n",a2,a2);
        
        x2 = DIV15(a2);
        printf("%XH(%d) / 0FH = %XH(%d)\n",a2,a2,x2,x2);

        printf("%XH + %XH = %XH(%d)\n",x1,x2,x1+x2,x1+x2);

    } else {
        printf("%XH / 0FH = %xH\n",a,DIV15(a));
        printf("%d / 0FH =(%d)\n",a,DIV15(a));
    }
}




```


```

START

a = 987H(2439)
a1 = 980H(2432)
980H(2432) / 0FH = A0H(160)
a2 = 27H(39) あまり
27H(39) / 0FH = 2H(2)
A0H + 2H = A2H(162)


```
VPCを設定したLambdaからインターネットにアクセスしたい

# 要約
① NATゲートウェイを設置したパブリックサブネットを用意する
② NATゲートウェイにルーティングさせるルートテーブルを設定したプライベートサブネットを用意する
③ Lmabdaに②で作成したプライベートサブネットを指定する

# 図解
![lamba-nat.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676792/8c9a4293-ef95-5d5d-5291-03e449645f42.png)

Lambdaは、デフォルトの設定ではAWSが自動で設定したVPCに設置され、自由にインターネットへのアクセスができます。

ただし、なんらかの事情で（例えばVPC内のリソースにLambdaからアクセスしたい時など）自分のVPCにLambdaを設置したい場合は、

図のようにNATゲートウェイを経由してインターネットにアクセスする必要があります。

# なぜNATを経由する必要があるのか
例えば、以下のようにパブリックサブネットに直接Lambdaを設置してインターネットにアクセスできないのか？と私は一度考えました。

![ダメな例.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676792/b7e626bb-acde-a036-17c7-818e5ed7eb71.png)

しかし、Lambdaをパブリックサブネットで構成しても、作成時に割り当てられるENI（Elastic Network Interface）にはパブリックIPは付与されません。プライベートIPのみが付与されます。

したがって、VPC外のインターネットにLambdaからのアウトバウンドトラフィックが届くはずもありません。

NATゲートウェイにルーティングするようルートテーブルを設定すると、Lambda→インターネットへの通信はまずNATに流れます。
パブリックIPをもつNATが代わりにインターネットゲートウェイへアクセスし、リクエストのレスポンス等のアウトバウンドトラフィックがあった場合は、LambdaがもつプライベートIPへ適切に返してくれます。

# おまけ
Lambdaには複数のサブネットを指定することができます。本記事の参考にしたAWSの公式ガイドにも、NATへルーティングされるプライベートサブネットを全てLambdaに指定するよう書いてあります。

[VPC に接続された Lambda 関数にインターネットアクセスを有効にする](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc-internet.html)

しかしこれには注意が必要です。下図の様にLambdaからVPC内のAWSリソース（例えばRDS）へアクセスしたい場合、サブネットやネットワークALC、セキュリティグループの設定を適切に行う必要があります。

![lamba-nat.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676792/9b0473ff-2f87-3057-cfc0-5b7b4f0ef086.png)

Lambda関数が複数のサブネットにアタッチされている場合、AWSはどのサブネットを使用するかを自動的に決定します。そのため、特定のサブネットからしかアクセスできないリソースにアクセスする必要がある場合、そのリソースへの接続が保証されない可能性があります。

複数のサブネットを設定することで高可用性を期待できる等のメリットもありますが、そのサブネットでリソースへの接続ができるかどうかはきちんと確認したほうがいいでしょう。
【30歳ママのエンジニア転職への道】

### はじめに
4歳と2歳のママやってます。

今年30歳になる節目ということもあり
もともとやりたかったフロントエンドエンジニアになるため
転職活動はじめます！！

ただ、ママ目線の経験験談とか発信が少ないような…と思い
自分が経験したこと思ったことを書いて
ママさんや他の方の参考になったら嬉しいなと思います。

## ふわっと転職活動開始
とりあえず何も調べずにふらっと広告を見て
リクルートエージェント、Green、indeed、Re転職などなど
転職サイトを色々登録してみたものの
求人の応募条件って
「開発の実務経験3年以上」とか経験年数ほぼ高確率で書いている。

やはりコード書いたりの実務経験がほぼない状態では、
希望の職に転職するのは難しいなあと痛感。

そんな中、
女性ITエンジニアのためのハイスキル転職サービス
「WAKE Career」を利用してみました。
（私の場合はInstagramの広告に出てきたことがきっかけ）

HP：https://wake-career.jp/
参考：https://note.com/bgrass/n/n03675df5c7e2

ここの会社様が本当に女性目線で
まずはフラットに会話させていただきました。

### 「WAKE Career」さんに教えてもらったこと
まず前提に、基本的にキャリアを積んだ方が対象ではあったようです。

私自身の場合は、HTMLって何？の未経験レベルでもなければ
実践経験を積んだミドルクラスでもなく、微経験レベル。

かといって、今の自分のキャリアを見て採用してくれる企業へ
妥協して転職してもまた実務経験が積めずに終わる可能性もあると
SESもあまりオススメはしないと、教えていただきました。

そして、自分の目標はなんなのか、を
改めて一緒に整理してくださった結果
私の目標は、まずはフロントエンジニアになるということであって
そのためにはまず実務経験をたくさん積みたい！！！！！
であれば、まずはポートフォリを作ろう！という話になりました。

### そもそもママになってからでもエンジニアになれるのか？
・エンジニアって忙しそう
・残業が多そう
・子育てと両立ってできるの？
・時短とか、保育園の迎えとか、呼び出しきたらどうしよう
・時間の融通はきくのか？
ママになると、自分のやりたいことだけを見て突っ走る
ということがやりにくい、億劫になりがち。

けど、エンジニアってある意味
時給制のアルバイトのように時間で縛られるというよりは
結構時間に関しては融通が結構きく職業であるみたい。
（フルリモート、フルフレックス　多いです）

となると大袈裟に言えば、
手に職さえつけちゃえば、ママにとって天職みたいなもの！

なおさら目指す価値があるなと再実感。

### でも、未経験でもできるものなのか？
私の場合は、もともとエンジニアに興味があり
スクールに通ってPHPやAWS、WordPressなどを学び
ポートフォリオや職務経歴書も作成し終えて
いざ転職しよう！！と動いてたところ
妊娠発覚しその道が一旦消えてしまいました。
（そのため、ただ学んだだけで実務経験ゼロの領域）

けど、子供が生後2ヶ月の頃から、働きたいなと思っても
保育所も今かなり激戦区ですぐ会社勤務できるわけでもなく
個人事業主として活動開始しました。

ただ、学んでからのブランクもありつつ、実務経験もないので
そう簡単に希望のフロントの職につけるわけでもなく
初めは文字起こしとか、簡単なカスタマーサポートとか
そのような仕事しかなかなかもらえない日々が続き
やっとIT業界にて保守運用（テクニカルサポート）業務を
業務委託という形で仕事ができるようになりました。

かれこれ3年半が経過。
developerツールにて、ソースコードを毎日見たり、ちょっとスタイル記述をいじったりはしているものの、
実際に直接コードを書き換えたりする経験はできず
なかなかフロントエンジニアとしての実務経験が積めない。
（未経験がエンジニア転職するといったら、結構よくある話…。）

子供が保育所に入れたので落ち着いたこともあって、
どうせならガッツリ今頑張ってやりたいことやろう！
ママになったって諦める必要はない！と思い
30歳にもなるし、良い機会なのでいっそ転職しちゃおう！と
そう思って、転職活動を始めたところです。

ぶっちゃけ未経験に近い、微経験の私ですが、
「WAKE Career」さんは未経験の方でも転職成功させたことがあるようです。

前提として、ポートフォリオは必須のようで
面談した皆さんにポートフォリをの作成を依頼するそう。
ただ、それを聞いて実践する人というのはごく一部らしい。
それでも未経験の方でもポートフォリを作って
提出してくれた努力された方に対しては
「WAKE Career」さんも全力を尽くしてくれているみたいで
全くの未経験の方でも転職することができたようです。

### ポートフォリオつくるための下準備
まず、参考になるサイトを探す。
例えば以下には、ポートフォリオに必要な情報とか
実際に作られたポートフォリオの参考例が掲載されてます。

参考：https://www.sejuku.net/blog/106987

このようなサイトをベースに
自分の個性をうまく表現できそうな参考サイトを探して
それに寄せていくように作るのが理想的かなと思います。

WordPressとか、簡単にサイトを作れるテンプレも
たくさん出てきているとは思いますが
なるべく自分で１から作った方が評価はされやすいかもです。

ちなみに、WordPressは最近使っている企業も多くないらしく
どうせならLaravelを使うのがオススメだそうです。

Udemyとか、YouTubeとか、参考にになるようなものは
ネット上にたくさん存在しているので、
これらをうまく使って実践に繋げられたらなと思います。


### 最後に
時間を作るのって難しいですが、
1日1時間、いや10分とかでもいいので
エンジニアに向けて毎日何かしらの知識アップができると
きっとその努力は結果につながると思います。

あまり参考にはならなかったかもですが
エンジニアを目指しているママさんのお力に
少しでも慣れたらいいなと思います。
【Amazon Simple Notification Service】Pub/Subメッセージングとは

## Pub/Subメッセージングとは

Pub/Subメッセージングは、メッセージの**発行者**（パブリッシャー）と**購読者**（サブスクライバー）を分離する分散システムのメッセージングパラダイムです（※仕組みについては後述）。

Amazon Simple Notification Service（以下、SNS）では、このPub/Subメッセージングパラダイムに従いプッシュメカニズムを使って配信を行うことができます。

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

## Pub/Subメッセージングの主要コンポーネント

Pub/Subメッセージングを理解するためには、以下の4つのコンポーネントを理解しておく必要があります。

1. **パブリッシャー**: トピックにメッセージを発行するエンティティ
2. **メッセージ**: 発行者から購読者に送信される情報
3. **トピック**: メッセージが発行される論理的アクセスポイント
4. **サブスクライバー**: トピックからメッセージを受信するエンドポイント

パブリッシャーが情報（メッセージ）をトピックという送信先に登録し、
登録されたメッセージはそのトピックに対して配信を申し込んでいたサブスクライバーに配信される、という流れですね。

![sns_img_topic.e024462ec88e79ed63d690a2eed6e050e33fb36f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259490/78bdb8ac-9550-ef23-dcd3-14bc9fa0b444.png)

※図：[Pub/Sub メッセージングとは何ですか?](https://aws.amazon.com/jp/what-is/pub-sub-messaging/)より引用


## Pub/Subメッセージングの主な特徴

主要コンポーネントを理解した上で、次はPub/Subメッセージングの特徴を見ていきます。

### 1. 即時性（リアルタイム性）

Pub/Subモデルでは、メッセージは発行されるとすぐに購読者に配信されます。
SNSのプッシュメカニズムはこの特性を活かし、高いリアルタイム性を実現しています。

### 2. 多様な配信先

SNSを使用したPub/Subシステムでは、メッセージを様々な種類のエンドポイントに接続できます。

* メッセージキュー
* サーバーレス機能
* HTTP サーバー
* メールアドレス

など、複数のタイプのエンドポイントに接続が可能です。

### 3. ファンアウト

Pub/Subモデルの大きな特徴として、1つのメッセージを複数の購読者に同時に配信できる点があります。これはSNSのプッシュメカニズムで効率的に実現されています。

### 4. フィルタリング

Pub/Subシステムでは、メッセージ属性に基づいて、関心のある（＝特定の条件を満たす）メッセージのみを受信するようにフィルタリングできます。

### 5. 多重化

同じエンティティがパブリッシャーとサブスクライバーの両方の役割を果たすことができます。
これにより、例えばあるサービスがメッセージを受信し、それを処理した後に新しいメッセージとして別のトピックに発行することなどもできます。
相互にリンクするようなシステムで有効です。

## Pub/Subメッセージングのメリット

### 1. ポーリングの排除

* メッセージトピックを使用し、プッシュベースの即時配信を実現
* コンシューマーが新しい情報や更新を定期的にチェック（ポーリング）する必要がなくなる
* 応答時間の短縮と配信レイテンシーの低減

### 2. 動的ターゲティング

* サービスの検出が容易になり、エラーが発生しにくくなる
* パブリッシャーはトピックにメッセージを投稿するだけでよい
* サブスクライバーはエンドポイントでトピックにサブスクライブし、メッセージを受信
* システムが動的に調整可能

### 3. 独立した分離とスケーリング

* パブリッシャーとサブスクライバーが分離され、独立して動作
* 個別に開発およびスケールが可能
* 機能の追加や変更による波及効果を最小限に抑える

### 4. 通信の簡素化

* メッセージトピックへの1つの接続で、ポイントツーポイント接続を削減
* トピックがサブスクリプションを管理し、メッセージの配信を決定
* コードのメンテナンスと拡張が容易になる

### 5. 耐久性

* 多くの場合、同じメッセージのコピーを複数のサーバーに保存
* 高い耐久性と少なくとも1回の配信を保証

### 6. セキュリティ

* メッセージトピックでアプリケーションの認証が可能
* 暗号化されたエンドポイントを使用し、転送中のメッセージを保護

## 最後に

ポーリングについては知っていましたが、いまいちPub/Subについて特徴やメリットなどを把握できていなかったので整理する良い機会になりました。

それでは、最後までお読みいただきありがとうございました！


## 参考記事

https://aws.amazon.com/jp/what-is/pub-sub-messaging/
Flutter基礎知識メモ


■Pod update用のコマンド
パッケージを更新後、PodのキャッシュがおかしくなりiOSビルドエラーになった時、Podのキャッシュをクリアするコマンド

```
cd ios
rm -rf Pods/
rm -rf Podfile.lock
cd ..
flutter clean
flutter pub get
cd ios
pod install --repo-update
cd ..
```

■リリースモードでビルド

https://zenn.dev/simano/articles/e39ec57e150519
こちらの設定をした後、コンソールで
flutter run --release
で実行する
【Linux】特定のファイルの差分のみ出力する方法

## はじめに

以下のような2つのファイルがある場合に内容を比較して変更箇所のみ取得する方法について記載します。  

```old.txt
変更なし
変更なし
変更なし

```

```new.txt
変更なし
変更なし
変更あり
追加
追加
追加

```

## `diff`コマンド

`diff`コマンドを使用して次のように実行することで変更箇所のみ取得できます。  

```terminal
$ diff --old-line-format='' --unchanged-line-format='' --new-line-format='%L' old.txt new.txt
変更あり
追加
追加
追加
```

- `--old-line-format`
  1番目のファイルだけにある行の出力に使用するフォーマットを設定する。  
- `--unchanged-line-format`  
  両方のファイルに共通な行の出力に使用するフォーマットを設定する。  
- `--new-line-format`  
  2番目のファイルだけにある行の出力に使用するフォーマットを設定する。  
- `%L`  
  行頭などに何もつけず1行ずつ出力する。
  `+%L`とすると以下のようになります。  

  ```terminal
  $ diff --old-line-format='' --unchanged-line-format='' --new-line-format='+%L' old.txt new.txt
  +変更あり
  +追加
  +追加
  +追加
  ```

  また`%l`とすると以下のようになります。  

  ```terminal
  $ diff --old-line-format='' --unchanged-line-format='' --new-line-format='%l' old.txt new.txt
  変更あり追加追加追加
  ```

## `comm`コマンド

`comm`コマンドを使用して次のように実行しても変更箇所のみ取得できます。

```terminal
$ comm -13 old.txt new.txt
変更あり
追加
追加
追加
```

- `-13`  
  `old.txt`のみに含まれる行と両方のファイルに含まれる行を出力しないようにする。  
  すなわち変更や追加があった行のみ出力する。  

ただしファイルが`sort`されていない正しく比較できず以下のようなエラーが出力されます。  

```terminal
comm: file 2 is not in sorted order
comm: input is not in sorted order
```

これを出力させないようにするには`sort`してから`comm`するか`sort`する必要のない場合には以下のようにオプションを付けます。

```terminal
comm --nocheck-order old.txt new.txt
```
VBA セルから固定長ファイル、TSVファイル出力例

書き込み途中・・・・



VBAソース

```vb
Option Explicit
'===================================================================================================
Private Const g_cnsTitle As String = "固定長形式テキストファイル書き出し"
Private Const g_cnsFilename As String = "testData"


Sub ファイルを作成する()
    '-----------------------------------------------------------------------------------------------
    Dim objFso As FileSystemObject  ' FileSystemObject  ツールー参照設定ーMicrosoft Scripting Runtime
    Dim 固定長ts As TextStream      ' TextStream（固定長）
    Dim TSVts As TextStream         ' TextStream（固定長）
    Dim lngRow As Long              ' 収容するセルの行
    Dim lngRowMax As Long           ' データが収容された最終行
    Dim lngRec As Long              ' レコード件数カウンタ
    Dim strFileName As String       ' OPENするファイル名(フルパス)
    '-----------------------------------------------------------------
    Set objFso = New FileSystemObject
    ' フルパスファイル名の編集
    strFileName = objFso.BuildPath(ThisWorkbook.Path, g_cnsFilename)
    
    
    '-----------------------------------------------------------------
    ' 指定ファイルをOPEN(出力モード)
    Set 固定長ts = objFso.CreateTextFile(Filename:=strFileName & ".txt", Overwrite:=True)
    Set TSVts = objFso.CreateTextFile(Filename:=strFileName & ".tsv", Overwrite:=True)
    Set objFso = Nothing
    
    '固定長トータルヘッダを出力
    固定長ts.Write 固定トータルヘッダ
    
    '固定長黒伝ヘッダを出力
    固定長ts.Write 固定トータルヘッダ

    '固定長黒伝データを出力
    固定長ts.Write 固定トータルヘッダ

    '固定長黒伝トレーラを出力
    固定長ts.Write 固定トータルヘッダ


    '可変長ヘッダ（タブ区切り、改行有）
    TSVts.WriteLine Join_Range(Range("D16:F16"), vbTab)
    
    '可変長データ（タブ区切り、改行有）
    TSVts.WriteLine Join_Range(Range("D22:F22"), vbTab)
'    TSVts.WriteLine Range("D22").Value & vbTab & Range("E22").Value & vbTab & Range("F22").Value
    
    '可変長トレーラ（タブ区切り、改行有）
    TSVts.WriteLine Join_Range(Range("D27:F27"), vbTab)
'    TSVts.WriteLine Range("D27").Value & vbTab & Range("E27").Value & vbTab & Range("F27").Value
    
        
    '赤伝ヘッダ
    '赤伝データ
    '赤伝トレーラ
    
    'トータルエンド
    
    
    
    
    '-----------------------------------------------------------------
    ' 指定ファイルをCLOSE
    固定長ts.Close
    TSVts.Close
    
    Set 固定長ts = Nothing
    Set TSVts = Nothing

End Sub
```

```vb
Private Function 固定トータルヘッダ() As String
    '-----------------------------------------------------------------------------------------------
    Dim strRec As String                                            ' レコードテキスト
    
    'L12～M12までを繋げる
    strRec = Join_Range(Range("L12:M12"), "")

    
    固定トータルヘッダ = strRec
    
End Function
```
```vb
Function Join_Range(対象セルリスト As Range, 区切り文字 As String) As String
    Dim cell As Range
    
    For Each cell In 対象セルリスト.Cells
        Join_Range = Join_Range & 区切り文字 & cell.Value
    Next
    
    Join_Range = Mid(Join_Range, Len(区切り文字) + 1)
End Function

```