OmniAICreator/Qiita-1.07M huggingface dataset:
Markdownをubuntu24.04で簡単プレビュー！mdviewのインストールと使い方

# 経緯説明
しゅんです。今回もよろしくお願いします。

普段からGPTが生成した内容や、自分で書いていたMarkdownファイルをもう少し見やすく確認したいなと思い、手軽にプレビューできる方法を調べていたところ、**`mdview`** というツールを見つけました。  
Markdownファイルをコマンド一つ、もしくはダブルクリックでブラウザ表示できるので、実際に試してみました。

# 手順説明

以下に、`mdview`のインストールから基本的な使い方までを説明します。

## 1. 環境構築

`mdview`はUbuntuで簡単にインストールできます。以下のコマンドを実行してください：

```bash
sudo apt update
sudo apt install snapd
sudo snap install mdview
```

これで`mdview`の準備は完了です！

---

## 2. 基本的な使い方

### 2.1 コマンドでMarkdownをブラウザでプレビュー

Markdownファイルをブラウザでプレビューするには、以下のコマンドを使用します：

```bash
mdview <filename>
```

例：
```bash
mdview my_file.md
```

このコマンドを実行すると、`my_file.md`がHTMLに変換され、デフォルトのブラウザで表示されます。

---

### 2.2 Ubuntuのファイルマネージャーからダブルクリックでプレビュー

`mdview`をインストールした状態では、**ファイルマネージャー（Ubuntuの「ファイル」アプリ）で`.md`ファイルをダブルクリックするだけで、ブラウザにMarkdownが表示される**ようになります。

#### 手順：
1. `.md`ファイルをUbuntuのファイルマネージャーで開きます。
2. 対象の`.md`ファイルをダブルクリックします。
3. 自動的にブラウザが起動し、MarkdownファイルがHTMLとして表示されます。

これにより、コマンドを入力せず、手軽にMarkdownファイルを確認できます。

---

### 2.3 スタイルなしのHTMLを表示

デザインを適用せず、素のHTMLを生成したい場合は、以下を使用します：

```bash
mdview -b <filename>
```

または：
```bash
mdview -bare <filename>
```

---

## 3. デモ動画

以下の埋め込み動画で、`mdview`の使い方を実際にご覧いただけます：

<iframe width="560" height="315" src="https://www.youtube.com/embed/Y4JRSBnVUVE?si=f5DVyMhO9XsFqcOC" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

---

# アンインストール方法

`mdview`を削除したい場合は、以下を実行してください：

```bash
sudo snap remove mdview
```

さらに、`snapd`そのものを削除する場合は以下を参考にしてください：

```bash
sudo apt purge snapd
rm -rf ~/snap /var/snap /var/lib/snapd /var/cache/snapd /usr/lib/snapd
```

---

# まとめ

今回紹介した`mdview`は、以下のような特徴があります：

- コマンド一つでMarkdownをブラウザでプレビュー
- ファイルマネージャーでのダブルクリック操作に対応
- スタイルの適用有無を選べる柔軟性

Markdownを普段から使う方や、ブラウザで確認したい方にはおすすめのツールです。ぜひ試してみてください！

---

# 最後に

今回も読んでいただきありがとうございました！記事に関する質問や改善案があれば、気軽にコメントしてください！
paiza.ioでelixir その333

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/84a7249a86a51fb8ac80


# サンプルコード
abc171_c
```
 
defmodule Abc171C do
  @table ?a..?z
        |> Enum.with_index()
        |> Enum.map(fn {a, b} -> 
            {b, [a] |> List.to_string()} 
        end)
        |> Map.new()
  def main do
    IO.read(:line)
    |> String.trim()
    |> String.to_integer()
    |> solve()
    |> IO.puts()
  end
  def solve(n) when n - 1 < 26 do
    Map.get(@table, n - 1)
  end
  def solve(n) do
    do_solve(n, [])
  end
  defp do_solve(n, acc) when n - 1 < 26 do
    [Map.get(@table, n - 1) | acc]
    |> Enum.join()
  end
  defp do_solve(n, acc) do
    list = Integer.to_charlist(n - 1, 26)
    last = Map.get(@table, [List.last(list)] |> List.to_string() |> String.to_integer(26))
    list
    |> List.delete_at(-1)
    |> List.to_string()
    |> String.to_integer(26)
    |> do_solve([last | acc])
  end
end

Abc171C.main()


```

# 実行結果

```
b
```

# 成果物

https://paiza.io/projects/K7fhiTw3o9p2yk57RPyTGQ

以上。
paiza.ioでelixir その332

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/48c4d813ab8e2e48e517


# サンプルコード
abc180_c
```

defmodule Abc180C do
  def main do
    IO.read(:line)
    |> String.trim()
    |> String.to_integer()
    |> solve()
    |> Enum.join("\n")
    |> IO.puts()
  end
  def solve(n) do
    for(i <- 1..round(:math.sqrt(n)), rem(n, i) == 0, do: i)
    |> Enum.reduce(MapSet.new(), fn i, acc ->
      MapSet.put(acc, i)
      |> MapSet.put(div(n, i))
    end)
    |> Enum.to_list()
    |> Enum.sort()
  end
end

Abc180C.main()



```

# 実行結果

```
1
2
3
6

```

# 成果物

https://paiza.io/projects/xs8J1S8TpCAOrG9Lpw__Ug


以上。
atcoder練習(2024.11.19)

# キーワード

# 問題
https://atcoder.jp/contests/abc379/tasks/abc379_b

高橋君は歯が左右一列に 
N 本生えています。現在の高橋君の歯の状態はある文字列 
S によって表されます。

S の 
i 文字目が O のとき、左から 
i 番目の歯が丈夫であることを表します。
S の 
i 文字目が X のとき、左から 
i 番目の歯が虫歯にかかっていることを表します。丈夫である歯は虫歯にかかっていません。

高橋君はある連続する 
K 本の歯が丈夫であるとき、その 
K 本の歯を使ってイチゴを 
1 個食べることができます。イチゴを食べると、その 
K 本の歯が虫歯にかかり丈夫でなくなります。

このとき、高橋君は最大で何個のイチゴを食べることができるか求めてください。

制約
1≤K≤N≤100
N,K は整数
S は O と X からなる長さ 
N の文字列
入力
入力は以下の形式で標準入力から与えられる。

N 
K
S
出力
答えを出力せよ。

入力例 1
Copy
7 3
OOXOOOO
出力例 1
Copy
1
左から 
4 本目の歯から左から 
6 本目の歯までの連続する 
3 本の丈夫な歯を使ってイチゴを 
1 個食べることができます。これ以降、イチゴを食べることができません。また、他にどのような方法でイチゴを食べても 
1 個以下しか食べることができません。よって、
1 を出力します。

入力例 2
Copy
12 2
OXXOOOXOOOOX
出力例 2
Copy
3
入力例 3
Copy
22 5
XXOOOOOOOOXXOOOOOXXXXX
出力例 3
Copy
2
# 回答
```Python
N , K = map(int, input().split())
S = input()

ans = 0
key = 0

for i in range(N):
  if S[i] == "O":
    key += 1
    if key == K:
      ans += 1
      key = 0
  else:
    key =0

print(ans)
```

# 参考

# 備考
- 比較的アルゴリズムが整理することができた。最初の段階では余計な部分があったけど、コードを書いたり、紙に書いたりする過程で整理することができた。やっぱりアルゴリズムを考えるのが大事。
- コードを書く力が不足しているのはもちろんだけど、それ以上にアルゴリズム力の方を鍛えたほうが良さそう。一方で鍛え方ってどうするの？
- 他の人のコードを見る限り同じようなことをしているのが大半。
paiza.ioでelixir その331

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/1e85b34719356e589805


# サンプルコード
abc190_c
```

defmodule Abc190.C.Main do
  def main() do
    [_n, m] = IO.read(:line) 
        |> String.trim() 
        |> String.split(" ") 
        |> Enum.map(&String.to_integer/1)
    ab_of_lists = 1..m
      |> Enum.reduce([], fn _, acc ->
        list = IO.read(:line) 
            |> String.trim() 
            |> String.split(" ") 
            |> Enum.map(&String.to_integer/1)
        [list | acc]
      end)
    k = IO.read(:line) 
        |> String.trim() 
        |> String.to_integer()
    cd_of_lists = 1..k
      |> Enum.reduce([], fn _, acc ->
        list = IO.read(:line) 
            |> String.trim() 
            |> String.split(" ") 
            |> Enum.map(&String.to_integer/1)
        [list | acc]
      end)
    apply(__MODULE__, :product, cd_of_lists)
    |> Enum.map(fn list ->
      Enum.count(ab_of_lists, fn [a, b] ->
        a in list and b in list
      end)
    end)
    |> Enum.max()
    |> IO.puts()
  end
  def product(l1, l2 \\ [nil, nil], l3 \\ [nil, nil], l4 \\ [nil, nil], l5 \\ [nil, nil], l6 \\ [nil, nil], l7 \\ [nil, nil], l8 \\ [nil, nil],
        l9 \\ [nil, nil], l10 \\ [nil, nil], l11 \\ [nil, nil], l12 \\ [nil, nil], l13 \\ [nil, nil], l14 \\ [nil, nil], l15 \\ [nil, nil], l16 \\ [nil, nil]) do
    for(a <- l1, b <- l2, c <- l3, d <- l4, e <- l5, f <- l6, g <- l7, h <- l8,
      i <- l9, j <- l10, k <- l11, l <- l12, m <- l13, n <- l14, o <- l15, p <- l16,
      uniq: true, do: [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] |> Enum.reject(&is_nil/1))
  end
end

Abc190.C.Main.main()

```

# 実行結果

```
2
```

# 成果物

https://paiza.io/projects/SUGo0yAr0NLB4WNyG0j2pA

以上。
【プログラミング言語】命令型言語・手続き型言語を理解する Part2

# 手続き
命令型言語では、複雑なシステムを部品化（モジュール化）し、その部品化されたプログラム単位を`手続き`と呼ぶ。（アセンブリ言語でいう`サブルーチン`）

#### 手続き定義のEBNF
```
＜手続き定義＞ ::= ＜返り値の型名＞＜手続き名＞（＜仮引数＞）＜手続き本体＞ 
```
```sample.c
int square(int x) {  // xが仮引数
  return x * x;
}
```

## 値渡しとポインタ渡し（値共有）と参照渡し（変数共有）

変数は、大きく分類して「値型」「ポインタ型・参照型」がある。
- 値型変数 : 変数は値（データ）そのものを保持する
- ポインタ型・参照型 : 値（データやオブジェクト）のアドレス値・参照値を保持して、値をポイント・参照する

変数の渡し方には「値渡し」「ポインタ渡し」「参照渡し」がある。

・値渡しの特徴
変数が保持している値をコピーして渡す。値型変数であれば値のコピー、アドレス型・参照型変数であればアドレス値・参照値のコピーを渡す。
実引数と仮引数は別々の変数。仮引数に再代入しても実引数に影響しない。
→関数に引数の`コピー`を渡す方法であり、関数内で引数の変更をしても、呼び出し元のデータに影響を与えたくない場合に使用する。
```sample.py
def increment(value):
    value = value + 1

x = 15
increment(x)
print(x)  # 15（変更されていない）

a = increment(x)
print(a)  # 16
```
・ポインタ渡しの特徴
ポインタ型・参照型変数が保持しているアドレス値・参照値を渡す。変数が保持している値（アドレス値・参照値）を渡すので値渡しの一種である。「[参照の値渡し](https://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0#%E5%8F%82%E7%85%A7%E3%81%AE%E5%80%A4%E6%B8%A1%E3%81%97)」である。
実引数と仮引数は別々の変数。仮引数に再代入しても実引数に影響しない。
ポイント・参照先の値（データやオブジェクト）はコピーせずに共有する。
ポイント・参照先の値の内容を変更すると呼び出し元の値に影響する。
→関数内でポイント・参照先の値を変更し、その変更が呼び出し元のデータに反映されることを望む場合に使用する。また大きなデータを渡す場合にも必要となる。
C言語の配列は自動的にポインタ渡しとなる。PHPの配列は値渡しで配列のコピーが渡る。
C言語の構造体は値型で構造体のコピーが渡る。
```sample.py
def increment_array(arr, index):
    arr[index] = arr[index] + 1

numbers = [1, 2, 3]
increment_array(numbers, 1)
print(numbers)  # 出力: [1, 3, 3]（更新されている）
```

・参照渡しの特徴
変数への参照を渡す。
実引数と仮引数は同一の変数。仮引数に再代入すると実引数に代入される。
→値型変数の値のコピーせずに共有したい場合に使用する。戻り値が複数ある場合に引数に値を返したいときに使用する。

値渡しは値（データ）のコピーを渡し、ポインタ渡しや参照渡しは値（データやオブジェクト）を共有し、参照渡しは変数を共有する。

```sample.c
void increment(int a, int *b) {  // アドレスを仮引数bで受ける
    a = 10;
    *b = 10;                     // ポインタbの参照先を10に変更
}
int main() {
    int x = 5;
    int y = 5;
    increment(x, &y);            // アドレス自体(&y)を値渡しする
    printf("%d %d\n", x, y) ;    // 5 10
}
```

ここで一つ思い出したいのが、`scanf("%d", &x);`である。ユーザーからの入力を受け取る際に書いていたものだが、これはアドレス渡しに依るものである。ここで意味していることは、`x`のアドレスを`scanf()`の仮引数に渡し、`x`の右辺値をポインタ経由で書き換えることである。

## スコープと存続範囲
変数の存続範囲とは、変数に対してメモリ領域を割り当てている期間のこと。
`スコープ`=`存続範囲`ではない。以下に、その例を与える。
```sample.c
void main() {
    int *p;
    {
        int x = 6;
        p = &x;
    }                    // xのスコープはここまでだが存続範囲は続く
  //printf("%d\n", x);   // スコープ外なのでエラー
    printf("%d\n", *p);  // 6
    *p = 15;             // 値の書き換えも可能
    printf("%d\n", *p);  // 15
}
```
ここで`x`のスコープは複文（{}で囲まれた文）の期間に等しいが、`x`のメモリ領域は`printf("%d\n", *p);  // 6`より、まだ存続していることがわかる。したがって、`スコープ`=`存続範囲`ではないといえる。

# メモリ
## 実行時スタック
スタックの振る舞いの例として以下に図を掲載する。スタックには`push`でレコード（関数の呼び出しごとに必要な情報を格納するメモリ領域）を収納し、`pop`で上から順にレコードを取り出し、実行する。


![計算機言語 jpeg](https://github.com/user-attachments/assets/4d9d1529-5a08-4e6d-890d-d426cdc1054d)


## メモリ領域の構成
以下に、C言語におけるメモリ領域を図で示す。

![計算機言語2 jpeg](https://github.com/user-attachments/assets/b395aee7-d99b-4661-b789-f7ec81effa1e)

ヒープは動的にメモリを確保するための領域であり、`malloc()`や`free()`を通じて自由に操作可能である。ここで`malloc()`について注意点を述べる。
#### mallocによる動的メモリ確保
例えば、`array[8]`のint型をメモリで確保するとき、`（4バイト）*8`の`32`バイトが必要となる。しかし、`malloc(8)`では`8`バイトの領域しか確保されていない。したがって、`malloc(sizeof(int) * 8)`とするのである。
`sizeof(int)`は`4`バイトを示す。
【CSS】中央寄せ（水平方向）

## インライン要素(display: inline)の中央寄せ
` <a> ` ` <span> ` ` <strong> ` ` <label> ` など (※初期値がdisplay: inline)

![インライン要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816632/7c74b300-0eab-0960-9a39-f4bc27871269.png)
①設定なし
②親要素に` text-align:center `
③親要素に` text-align:center `　
④親要素に` display:flex `　※flex-direction: rowの場合(※初期値)
　　　　　` justify-content:center `



## ブロック要素(display: block)の中央寄せ
` <div> ` ` <p> ` ` <h1～h6> ` ` <ul> ` ` <ol> ` ` <li> ` ` <table> ` ` <form> ` ` <section> ` ` <article> ` ` <nav> ` など
(※初期値がdisplay: block)

![ブロック要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816632/8fd42b7b-ec64-716e-41c6-4f49e1882a5c.png)
①設定なし
②自分自身に` margin: 0 auto `
③自分自身に` margin: 0 auto `　
④親要素に` display:flex `　※flex-direction: rowの場合(※初期値)
　　　　　` justify-content:center `

## インラインブロック要素(display: inline-block)の中央寄せ
` <button> ` ` <input> ` ` <textarea> ` ` <img> `   など(※初期値がdisplay: inline-block)

![インラインブロック要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816632/389949f4-1567-dc38-b00c-22dde5796fab.png)
①設定なし
②親要素に` text-align:center `
③親要素に` text-align:center `　
④親要素に` display:flex `　※flex-direction: rowの場合(※初期値)
　　　　　` justify-content:center `
EdgeがWEBページを表示しないを解決中

現在起こっているエラー
![スクリーンショット 2024-11-18 165421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/663e19d0-0732-745d-cb9e-fd20db64a44b.png)

[このページを開くことができません][エラーコード:RESULT_CODE_KILLED_BAD_MASSAGE]
で検索

以下のような状況である場合、Edgeブラウザが原因となっている可能性が高いです。

複数のサイトで同じエラーが発生する
他のブラウザではエラーとならない
>https://1-notes.com/microsoft-edge-there-is-a-problem-with-this-page/

| 施策 | 未済 |
|:-:|:-:|
|Edgeブラウザの再起動|実行済|
|最新バージョンにアップデート|実行済|
|該当ページのみを開く（メモリ不足の可能性を確認）|実行済|
|該当ページのキャッシュクリア|実行済|
|拡張機能を全停止して確認する|実行済|
|OSの再起動、アップデート|未（アップデートのバッチがないので）|
|ブラウザの実行ファイル名を変更する|未|
|Edgeの修復・リセット|実施済|
|他のブラウザを使いながら更新を待つ|実行済|

## Edgeのロールバックを行って改善するかを調査中

### ■ロールバックの前提条件
ロールバックは端末がドメイン管理下にあることを前提条件としています。
※ ここにおいてのドメイン管理下とは、Intune や Active Directory, Azure Active Directory の制御下であることを指します。

<font color="red">**ドメイン管理下ではない端末については、グループ ポリシーによるロールバックは行えません。**</font>

※ ただし、ドメイン管理下ではない端末でも「Edge のオフライン インストーラーの .msi ファイルを利用する方法」についてはロールバックを行うことは可能です。

>Japan Developer Support Internet Team Blog
>Microsoft Edge のロールバック方法について
>https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/how-to-rollback-edge/

現在自分のPCはAD下にないので上記方法しかない。

Active　Directory下にないので「このPC]を更新しない状況をつくってあげないといけない。
※ActiveDirectory下では更新は管理されて一斉配信されるので。

https://papamamameyou.com/%E3%80%90edge%E3%80%91%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%82%92%E6%89%8B%E5%8B%95%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%90%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/bfa71531-19e6-05fc-fee5-89495820c692.png)

↓↓↓↓

```.bat
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\EdgeUpdate" /v UpdateDefault /t "REG_DWORD" /d 0 /f
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/246ce6b0-d66a-096a-520e-ecf8d10de528.png)

これで何とかいけそうな気がします。

上のコマンドを動かすと

![スクリーンショット 2024-11-19 145555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/aa96f0fe-9b64-ebd3-00bb-e2c090b213f5.png)
ができます。

今から検証します。

現在のバージョンが![スクリーンショット 2024-11-19 151849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/3eaf6c8e-3c78-3f09-b811-4145e664812f.png)

ロールアップするバージョン
![スクリーンショット 2024-11-19 151645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/cdf6536b-587a-3a02-9986-b794270b538e.png)


https://www.microsoft.com/ja-jp/edge/business/download?form=MA13FJ
からロールバックファイルをダウンロード中
![スクリーンショット 2024-11-19 151645.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/4b1caf3b-a0fc-ad92-9d7a-7404917ffc3d.png)
ダウンロードしたファイルはこれ↑↑↑
paiza.ioでelixir その330

# 概要
paiza.ioでelixirやってみた。
AtCoder、やってみた。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/238771e40c001ec9a973


# サンプルコード
abc193_c
```
defmodule Abc193.C.Main do
  def main() do
    n = IO.read(:line) 
        |> String.trim() 
        |> String.to_integer()
    do_solve(n)
    |> IO.puts()
  end
  defp do_solve(n) when n in [1, 2], do: n
  defp do_solve(n) do
    2..(:math.sqrt(n) |> round())
    |> Enum.reduce(%{}, fn a, acc ->
      Enum.reduce_while(2..34, acc, fn b, acc ->
        z = pow(a, b)
        if z <= n, do: 
            {:cont, Map.update(acc, z, true, & &1)}, 
        else: 
            {:halt, acc}
      end)
    end)
    |> Enum.count()
    |> Kernel.-(n)
    |> Kernel.*(-1)
  end
  def pow(a, b), do: do_pow(a, b, 1)
  defp do_pow(_, 0, acc), do: acc
  defp do_pow(a, b, acc), do: do_pow(a, b - 1, a * acc)
end

Abc193.C.Main.main()



```

# 実行結果

```
6
```


# 成果物

https://paiza.io/projects/f4YB6IjXzRzWN_8uzG5DBg

以上。
営業の未来を創造する、あなたの最強パートナー

株式会社アレグリアは、元キーエンスのトップセールスである代表の経験とノウハウを活かし、企業の営業力強化を支援するサービスを提供しています。

https://alegria-sales.co.jp/

サービスの特徴と魅力
実績に基づく信頼性：キーエンスで全国1位の営業成績を複数回達成した実績を持つ代表が、直接指導を行います。 


カスタマイズ対応：各企業のニーズや課題に合わせた柔軟なサービス提供を行い、きめ細やかな支援体制を特徴としています。 

結果へのコミットメント：成果に対する強い責任感とコミットメントを持ち、営業課題を短期間で解決し、顧客企業のビジネス成長を加速させる実績があります。 

これらの特徴により、アレグリアは企業の営業力強化と成長を強力にサポートします。
FIFOスケジューリング

# ルーターのリソースを先着順で割り当てる
>パケット・スケジューリング・アルゴリズムは、`バッファ内のどのパケットを送信回線に乗せるかを決定し、帯域とルーターのリソースを割り当てるアルゴリズム`である。最も単純なスケジューリング方式については、ルーターは、パケットが送信できる状態になるまで各出力リンクのキューにバッファリングし、`ルーターに到着した順番にバッファ内のパケットを送信`する。このアルゴリズムはFIFO（先入先出し）、あるいはFCFS(First-Come First-Serve:先着順受付)と呼ばれる。

# キューがいっぱいだと新しいものが捨てられる
>FIFOを採用したルーターは、`キューが一杯の状態の時、新しく到着したパケットを破棄`する。新しいパケットがキューの最後に追加されるので、新しく到着したパケットを破棄することを`テール・ドロップ（tail drop)`と呼ぶ。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
ルーターがアルゴリズムを使ってパケットを捨てたりしていることを知らなかった。
Python 3 エンジニア認定基礎試験 合格体験記

# 目次
[1.試験概要](#試験概要)
[2.受験理由](#受験理由)
[3.勉強方法](#勉強方法)
[4.所感](#所感)

## 試験概要
問題数：40問（選択式）
試験方式：コンピューター上で実施するCBT（Computer Based Testing）方式
試験時間：60分
合格基準：7割以上正解

私は8割で合格しました。
![GcmbOKHaoAAwmhT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888319/26423cbe-473a-40a7-184f-421e4365d875.jpeg)


https://cbt.odyssey-com.co.jp/pythonic-exam/python3basic.html

## 受験理由
Pythonを用いてAtcoderの過去問に取り組んでおり、ある程度仕様を理解したことからせっかくなので資格を取ろうと思った次第で受験しました。
過去問を見る限りアルゴリズム的な問題が多く、そこまで勉強時間が取られないと感じたのも1つの理由です。

## 勉強方法
ExamAppで過去問を回しました
初級・中級を3周、上級を4周で完了しました。
解答→説明を読むの繰り返しで学んでいきました。
時間で見ると1週間、大体10時間強で試験に望みました。

https://python-basic.com/

## 所感
私のような他言語での開発経験者だと本記事の勉強で合格出来るレベルだと思います。
この資格はPythonについて最低限の知識を持っていることを証明するものになると思ったので、アピールしたいのであれば上位資格（実践試験やデータ分析実践試験など）をとる必要がありそうです。
私は時間ができれば実践試験にチャレンジする予定です。（来年になりそうですが。。。）
Magic TrackpadをWindows11で使いたい

# はじめに
マウスでもいいけど、もっと多機能なデバイスが良いなぁ。
と思ったので、Magic Trackpadを買ってきました。
Windowsユーザーですけどね。
YoutubeやWebサイトで予習をして、ドライバを入れれば使えるとのこと。
余裕ですね、うんうん。

# いろいろやってみた結果
![MagicTrackpadDeviceError.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164944/577f3892-6589-3ed8-92f0-2f1cd4983167.jpeg)
ほほう。。。。

# 対応
ちょっと追いかけてる時間が無いので、対応は後日記事にまとめます。
それまでに誰かが助けて下さるかもしれん。。。
Advent of code 2015 Day 2 Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 2 の Part 2 を解きます

問題文はこちら

https://adventofcode.com/2015/day/2

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day2_part1.livemd

Part 1 はこちら

https://qiita.com/RyoWakabayashi/private/f0219e851d6ce5466bf2

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 2 の入力を取得します

![スクリーンショット 2024-11-19 13.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/97b10e34-0c5a-fe15-243a-5dbbd0f267fb.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

最小の外周を求め、蝶々結びに必要な長さ（体積と等しい）と合算します

```elixir
puzzle_input
|> String.split("\n")
|> Enum.map(fn row ->
  [l, w, h] =
    row
    |> String.split("x")
    |> Enum.map(&String.to_integer(&1))

  min_length = Enum.min([l + w, w + h, h + l])

  2 * min_length + l * w * h
end)
|> Enum.sum()
```

</details>

## まとめ

体積と同じだけの長さが必要な蝶々結びは凄そうです

こちらは問題文を元にChat GPT で生成した画像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/bad022a7-22e8-4b59-7a84-3e8c2a614ea9.png)

クリスマスらしくて良いですね
Advent of code 2015 Day 2 Part 1 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 2 の Part 1 を解きます

問題文はこちら

https://adventofcode.com/2015/day/2

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day2_part1.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 1 の入力を取得します

![スクリーンショット 2024-11-19 13.56.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/97b10e34-0c5a-fe15-243a-5dbbd0f267fb.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

各面の面積を求め、最小のものを余剰分の面積とします

余剰分含む表面積を求め、全て合計します

```elixir
puzzle_input
|> String.split("\n")
|> Enum.map(fn row ->
  [l, w, h] =
    row
    |> String.split("x")
    |> Enum.map(&String.to_integer(&1))

  {lw, wh, hl} = {l * w, w * h, h * l}

  slack = Enum.min([lw, wh, hl])

  2 * lw + 2 * wh + 2 * hl + slack
end)
|> Enum.sum()
```

</details>

## まとめ

まだ特に捻りのない問題ですね

Part 2 はこちら

https://qiita.com/RyoWakabayashi/private/af0f539f04a15b6a4573
Spreadsheet &GAS のUrlFetchApp.fetch ではまった話

Google Spreadsheet&GASで勤怠管理のシートを作成していた際に、
祝日カレンダーの取得処理実装で30分ほどはまったのでメモ。

## 現象
gasのonEdit()から祝日取得の関数を呼び出す際に、以下のエラーで怒られる。
>Exception: UrlFetchApp.fetch を呼び出す権限がありません。必要な権限: https://www.googleapis.com/auth/script.external_request

<br/>
祝日取得の関数は以下がメインの処理。

```js
var response = UrlFetchApp.fetch("https://holidays-jp.github.io/api/v1/" + year + "/date.json");
```

## やったこと その1
appscript.json に、oauthScopes を追加。
```json
  "oauthScopes" : [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/script.external_request"
  ]
```

#### 少しはまったところ
appscript.json が保存できない。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/60d7dbad-d540-9530-2fd7-fb262ac24bc9.png)

→原因はカンマ追加漏れ(oauthScopesを一番最後に追加したので)。
　嘘と思うかもしれないが、日頃から使っていないとこんなところでハマる

## やったこと その2
権限追加したし、うまくいくやろーと思ってSpreadsheetのセル編集(onEdit関数キック)したが、動かない。
ログを見ると、先ほどと同じエラーが吐かれている。
ちなみに、デバッグで祝日取得の関数を実行すると、問題なく動く。

ダメ元でGeminiさんに聞いてみると、以下の回答。
>Google Apps Script (GAS) の onEdit トリガーで UrlFetchApp.fetch を使用する場合に権限エラーが発生する問題は、GASの Simple Trigger と Installable Trigger の違いに起因しています。

なるほど、、わからん。

>Simple Trigger
>
>スプレッドシートの編集など、特定のイベントが発生したときに自動的に実行されるトリガーです。
onEdit はSimple Triggerの一種です。
Simple Triggerで実行される関数は、実行ユーザーの権限で動作します。
スクリプトが UrlFetchApp.fetch のような外部サービスにアクセスする権限を必要とする場合、**実行ユーザーが事前にその権限を承認している必要があります**。

>Installable Trigger
>
>スクリプトエディタから手動で設定するトリガーです。
Installable Triggerで実行される関数は、スクリプトのオーナーの権限で動作します。
**スクリプトのオーナーが外部サービスへのアクセスを承認していれば、実行ユーザーが承認していなくても UrlFetchApp.fetch を使用できます**。

ふむふむ、Installable Triggerでトリガーイベントを作っておけば、よさげと。

ちなみに、追加の仕方は以下のとおり。
1. スクリプトエディタで、[トリガー] > [トリガーを追加] を選択
2. イベントソースを「スプレッドシート」、イベントの種類を「編集時」、関数を選択して保存

サクッとトリガ追加してSpreadsheetの編集したら、無事に祝日取得処理が動作した！
退屈なことはAppleScriptにやらせよう

ネットワークの詰まりが酷くNATテーブルのクリアを何度もするのがひどく面倒だったのでショートカットを作成した。我が家のHome5Gとかいう:wastebasket:がターゲットだ。

ショートカットから＋ボタンを押して、AppleScriptを実行。

```AppleScript
tell application "Safari"
	activate
	open location "http://192.168.128.1"
	delay 3.5

	do JavaScript "document.querySelector('.login-button').click();" in current tab
	delay 1

	do JavaScript "document.getElementById('password').value='パスワード';" in current tab

	do JavaScript "document.getElementById('submit').click();" in current tab
	delay 3

	open location "http://192.168.128.1/mifi-router_settings_nat_settings.html"
	delay 2

	do JavaScript "document.getElementById('upnp_lock').click();" in current tab
end tell
```

![スクリーンショット 2024-11-19 13.37.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713775/394e4c5a-e417-71a7-4104-567e015fc690.png)

出来た。
これで実行すれば、Safariが立ち上がりルーターのコンソール開いてログインしてNATの設定再適用をササッとやっててくれるゾ。

こんなことしない生活が送りたい。
冊子の入稿データを単ページごとにIllustratorでレイアウトしたものを裁ち落とし後のPDFにまとめる方法

Illustratorはペライチのデザインをするときに使うものなので、複数ページにまたがる冊子を作る場合にはInDesignというAdobeのソフトを使ったほうがいいのですが、専門の会社でなければ使える環境がないことが多いですね。

今回、各ページが別々のIllustrator形式（aiファイル）で保存された入稿データをPDFで一つにまとめた際の手順を紹介します。

入稿データは、実際の用紙サイズよりもはみ出した形でレイアウトして、印刷後に周りを切り取ります。

なので、そのまま入稿データをPDFにすると必要のない部分も表示されてしまい、仕上がり後の見た目とは異なります。

そこで、Illustrator上でトリミングをするのではなく、いったんPSD形式で書き出しをしてPhotoshop上でトリミングしPDFに書き出し、Acrobatで1つのファイルにまとめるという手順をとりました。

### 手順

- IllustratorでPSD書き出しのアクションを作成したあと、複数のファイルにバッチ処理。

https://note.com/dtp_tranist/n/n942329bb4197


- Photoshop側では裁ち落とし線に沿ってトリミング後にPDF書き出しのアクションを作成し、Adobe Bridgeから複数のファイルに対してバッチ処理を実行

https://tcd-theme.com/2020/09/photoshop-action.html


- 書き出された単一ページのPDFファイルをAcrobatで結合する。

https://acrobat.adobe.com/link/home/
  
結合後にダウンロードする際に圧縮率を選べるのが便利でした。
atcoder練習(2024.11.19)

# キーワード

# 問題
https://atcoder.jp/contests/abc379/tasks/abc379_a

各桁が 
1 以上 
9 以下の整数である 
3 桁の整数 
N が与えられます。

N の 
100 の位を 
a、
10 の位を 
b、
1 の位を 
c としたとき、
b,c,a をこの順に並べた整数と 
c,a,b をこの順に並べた整数をそれぞれ出力してください。

制約
N は各桁が 
1 以上 
9 以下の整数である 
3 桁の整数
入力
入力は以下の形式で標準入力から与えられる。

N
出力
b,c,a をこの順に並べた整数と 
c,a,b をこの順に並べた整数をこの順で空白区切りで出力せよ。

入力例 1
Copy
379
出力例 1
Copy
793 937
379 の 
100 の位は 
3、
10 の位は 
7、
1 の位は 
9 です。よって、
793 と 
937 をそれぞれ出力します。

入力例 2
Copy
919
出力例 2
Copy
199 991
919 の 
100 の位は 
9、
10 の位は 
1、
1 の位は 
9 です。よって、
199 と 
991 をそれぞれ出力します。
# 回答
```Python
N = int(input())
l = [int(x) for x in list(str(N))]
a, b, c = l[0], l[1], l[2]

A = 100*b + 10*c + a
B = 100*c + 10*a + b

print(A, B)
```

# 参考
https://dibtp.hateblo.jp/entry/2013/06/21/000629
# 備考
- 桁ごとに分割するやつ、結構頻出。
- 3桁というのがわかっている以上、/100とか/10でも分割できることにあとで気づいた。
- 他の人の回答を見る限り、アルゴリズム自体は変わらない。文字列として受け取って、何文字目をそれぞれintにして結合している人もいた。
- printにまとめれば極限までコードを短くできる。ただどっちがいいのかは知らない。多分適材適所の話
Advent of code 2015 Day 1 Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 1 の Part 2 を解きます

問題文はこちら

https://adventofcode.com/2015/day/1

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day1_part2.livemd

Part 1 はこちら

https://qiita.com/RyoWakabayashi/private/2c8206e31560f1e3eae7

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 1 の入力を取得します

![スクリーンショット 2024-11-19 12.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/59924b76-0f5c-72e7-1124-b2ef07e04121.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

`Enum.reduce_while` で `(` や `)` による上昇下降を順次実行していき、 0 より小さくなったときのインデックスを取得します

`Enum.with_index` で初期値 1 を指定することで、インデックス番号を 1 開始にすることができます

```elixir
puzzle_input
|> String.codepoints()
|> Enum.with_index(1)
|> Enum.reduce_while(0, fn {direction, index}, current ->
  current =
    case direction do
      "(" -> current + 1
      _ -> current - 1
    end

  if current < 0 do
    {:halt, index}
  else
    {:cont, current}
  end
end)
```

</details>

## まとめ

最初の方は素直に組めばいいだけなので楽ですね
elixirのバイナリとちょっとだけ仲良くなる

想定読者
バイナリについて知らない方
elixirでバイナリってどう扱うのか知りたい方

# 知識編
バイナリとは？
> コンピュータはすべての情報を2進数の「0」と「1」が並んだビット列として表現する。このうち、何らかの文字コード規格に基づいて文字を表すデータを「テキストデータ」（テキスト形式）、そうでないものを「バイナリデータ」（バイナリ形式）と分類

> バイナリ形式のデータの例としては画像や音声、動画などを記録したメディアデータ、実行可能形式のコンピュータプログラム（オブジェクトコード/バイナリコード）、圧縮データ、暗号データなど

バイナリを扱う経験が乏しいので想像になるが暗号データや圧縮データの取り扱いの際に重要視される？
(詳しい方がいたらコメントででも教えていただけるととても助かります。)

https://e-words.jp/w/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA.html

# 実践編
バイナリをelixirで操ってみます
elixirはインストール済みと想定し、iexを実行しシェルを立ち上げます
```elixir
iex
```

## is_binary

バイナリかどうかを調べてくれる関数

https://hexdocs.pm/elixir/Kernel.html#is_binary/1

```elixir
iex>is_binary("hello")
true

iex>is_binary(2)
false
```

"hello"は文字列だがバイナリとして処理されるが、2はバイナリとして処理されないのが確認できる

## byte_size

バイトサイズを調べてくれる関数

https://hexdocs.pm/elixir/1.12.3/Kernel.html

```elixir
iex> byte_size("ほげほげ")
12
iex> byte_size("hogehoge")
8
```

日本語の"ほげほげ"は4文字だがバイトサイズだと12文字換算となる
これはひらがなのコードポイントが大きいため1バイトで処理されていないためと考えられる
対して"hogehoge"は8文字だがバイトサイズ換算だと8文字換算となる
コードポイントが1バイト(0から255)でおさまるためだと考えられる

## ?
?と文字を入れることでコードポイントの特定ができる
一文字ずつしか使えないことに注意する

```elixir
iex(5)> ?ほげほげ
** (SyntaxError) invalid syntax found on iex:5:3:
    error: syntax error before: 'げほげ'
    │
  5 │ ?ほげほげ
    │   ^
    │
    └─ iex:5:3
    (iex 1.17.3) lib/iex/evaluator.ex:295: IEx.Evaluator.parse_eval_inspect/4
    (iex 1.17.3) lib/iex/evaluator.ex:187: IEx.Evaluator.loop/1
    (iex 1.17.3) lib/iex/evaluator.ex:32: IEx.Evaluator.init/5
    (stdlib 6.1.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
iex(5)> ?ほ
12411
iex(6)> ?げ
12370
iex(7)> ?h
104
iex(8)> ?o
111
iex(9)> ?g
103
iex(10)> ?e
101
```

先ほどのバイトサイズでの予想が合致しているのがわかる

疑問点
文字列は知識編で調べたテキストデータではないのか？
テキストデータとバイナリデータの切り分けがうまくできていない
後日判明し次第追記を行う

参考サイト

https://dev.to/gumi/elixir-06--35na
KinoAOC を修正する

## はじめに

昨年楽しんだ Advent of code

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

Advent of code 2024 が始まる前に過去回をやってみようと思ったら落とし穴があったので塞ぎました

修正の Pull Request はこちら

https://github.com/ljgago/kino_aoc/pull/8

## KinoAOC

KinoAOC は Livebook から簡単に Advent of code の入力を取得できるモジュールです

https://github.com/ljgago/kino_aoc

Livebook でインストールすると、以下のようなスマートセルが使えるようになります

![スクリーンショット 2024-11-19 12.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/59924b76-0f5c-72e7-1124-b2ef07e04121.png)

年、日と認証用の SESSION 、パズルの入力値を格納する変数名を指定します

:::note info
SESSION の値は Cookies から取得可能です

![スクリーンショット 2024-11-19 12.23.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/af32a823-7210-3cee-1fe6-7be1df3be30a.png)
:::

上記画像の例だと、 `pazzle_input` の中に以下の Web ページで取得できる値が格納されます

https://adventofcode.com/2015/day/1/input

## 発生した問題

Advent of code 2015 の Day 1 を解いたところ、どう考えてもロジックは合っているはずなのに、不正解になってしまいます

そこで入力値を見直したところ、なぜか入力値の末尾が1文字欠けていました

実際には 7,000 文字のはずが、 6,999 文字しか取得できていません

## 問題の原因

KinoAOC のソースコードを確認すると、　入力値の取得処理が以下のようになっていました

```elixir
...
    case res.status do
      200 -> {:ok, String.slice(res.body, 0..-2//1)}
      _ -> raise "\nStatus: #{inspect(res.status)}\nError: #{inspect(String.trim(res.body))}"
    end
...
```

`String.slice` は文字列から指定範囲の部分を取得する関数です

この場合、最後から2文字目までを取得しているため、最後の1文字が欠けることになります

なぜ、このような実装になっているかというと、入力が複数行になっている場合、最後にある `\n` （改行コード）を取り除くためにわざと1文字欠けさせているのです

ただし、この実装だと 2015 Day 1 や 2015 Day 3 のような、末尾に改行コードがないケースで必要な文字まで削ってしまいます

## 解決方法

当該処理を以下のように修正しました

```elixir
...
    case res.status do
      200 -> {:ok, String.trim_trailing(res.body, "\n")}
      _ -> raise "\nStatus: #{inspect(res.status)}\nError: #{inspect(String.trim(res.body))}"
    end
...
```

`String.trim_trailing` は末尾に指定文字があれば取り除きます

これで末尾が `\n` でない場合は文字が欠けなくなりました

## Pull Prequest

この修正について Pull Prequest を送ったところ、迅速に（2時間以内で）マージしてもらえました

https://github.com/ljgago/kino_aoc/pull/8

## まとめ

KinoAOC の Contributors に入ることができました

モジュールがしっかりメンテナンスされていて素晴らしいですね
[IBMCloud] IKS/ROKSクラスタ作成時に必要なオプション権限について

## 目的
IBMCloudのVPC環境にてIKS/ROKSクラスタ作成時に必要な権限について整理する

## 最低限のアクセス権限
クラスタ作成時に必要な権限については、以下のドキュメントにまとめられている
しかし、実際にはログ機能なども利用することが多いため十分ではない
[クラスターを作成するための許可](https://cloud.ibm.com/docs/containers?topic=containers-iam-platform-access-roles#cluster-create-permissions)

以下はドキュメント通りに設定した状態のアクセス権
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/4f68c245-4341-09c0-dffe-6b2852fbaca6.png)

この状態の場合、以下の4つの機能はOFFにしなければクラスタの作成はできない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b36e679a-e71a-c0a4-5db8-2c32b027eca0.png)

## 権限の追加(Activity tracking)
アクセスポリシーに以下の二つの権限が必要
・[IBM Cloud Activity Tracker with LogDNA](https://cloud.ibm.com/docs/log-analysis?topic=log-analysis-iam#platform)
・[Activity Tracker Event Routing](https://cloud.ibm.com/docs/atracker?topic=atracker-iam#platform)

サンプル（適用が必要な権限については、ドキュメントで確認して適用する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/f4624fea-87b6-ccd5-6848-cd2c8789f692.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/6c100ad1-50bc-bc41-8f02-43bf3e542ff9.png)


また、今後はActivity Trackerがサービス終了するため、Cloud Logに移行される。
従って、Cloud Logのインスタンスでも良い。その場合、以下の権限が必要となる

サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/1a7d492b-7a00-c0c3-f9ed-9e46ca872b09.png)



## 権限の追加(Logging)
アクセスポリシーに以下の権限が必要
・[Log Analysisログを管理してアラートを構成するための許可を付与する](https://cloud.ibm.com/docs/log-analysis?topic=log-analysis-work_iam#admin_user_logdna)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e9a1ce2b-28b3-61c2-6ec8-a30bcf455ae2.png)

## 権限の追加(IBM Cloud Monitoring)
アクセスポリシーに以下の権限が必要
・[Monitoring IAM によるアクセス権限の制御](https://cloud.ibm.com/docs/monitoring?topic=monitoring-iam#iam_platform)

サンプル（適用が必要な権限については、ドキュメントで確認して適用する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c7129ecb-2115-5e0c-1fcd-ad56dfa29d16.png)

## 権限の追加(Workload Protection)
アクセスポリシーに以下の権限が必要
・[Security and Compliance Center ワークロード保護 IAM によるアクセス権限の制御](https://cloud.ibm.com/docs/workload-protection?topic=workload-protection-iam#iam_platform)

サンプル（適用が必要な権限については、ドキュメントで確認して適用する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/41840ae2-a861-5a0c-9a07-b0629ff4d659.png)

## 権限の追加(Internal registry/Cloud Object Storage instance) <font color="red">ROKSのみ</font>
アクセスポリシーに以下の権限が必要
・[Object Storage IAMの概要](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-iam#iam-roles)

サンプル（適用が必要な権限については、ドキュメントで確認して適用する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/d839a36b-d84d-2701-fda0-1c0b64e45ae6.png)


## 必要な権限サマリ
クラスタ作成時にオプションを含めて必要な権限は以下の通り
ユーザに付与する権限レベルに応じて、役割は見直してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e285373c-85ee-ed27-620c-c3e7efb287e3.png)
パケット・スケジューリング

# ルーターのリソースを割り当てるアルゴリズム
>あるフローのパケット間、あるいは競合するフロー間でルーターのリソースを割り当てるアルゴリズムを`パケット・スケジューリング・アルゴリズム`と呼ぶ。

# ルータのリソースをどのように予約するのか？
>異なるフローに対して、３種類のリソースを予約できる可能性がある。
> * 帯域
> * バッファ・スペース
> * CPUサイクル

### 帯域
>一つ目の待機は最もわかりやすいリソースである。例えば、フローが１Mbpsを要求しており、出力の回線の要求が２Mbpsである時に、３つのフローを通そうとしてもそれはかなわない。つまり`帯域の予約とは、出力回線の容量オーバーを発生させない`ことを意味している。

* フローが出力回線の要求を上回ると輻輳や遅延が起きそうだ

### バッファスペース
>不足しがちなリソースであるバッファ・スペースである。パケットがルーターに届いた時、出力先のリンクへパケットを送信できる状態にあるまで、その`パケットはルーター内にバッファリング`される。バッファは`フローの競合によって発生する小規模なバーストを和らげる`目的で用意されている。

### CPUサイクル
>希少なリソースとなりうる。`ルーターがパケットを処理するためにはCPUの時間を消費`する。つまり、`ルーターの1秒あたりに処理できるパケットの数には限界がある`ということである。
...
処理時間を要求するパケットをタイムリーに処理するためには、PCPUが過負荷にならないように注意`する必要がある。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
* ルーターの帯域,バッファスペース,CPUサイクルのリソースを基にパケット・スケジューリング・アルゴリズムを使って制御してくれる
【ChatGPT＋DALL-E3】のセッションはじめで、Promptが効かないことがある。原因と対処法。


　どうも、カーブミラーです。

　今回は、セッションはじめで、Promptが効かないことがあります。その原因と対処法を書きます。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　まずは、ニュース。

　OpenAIのグレッグが
　　医療記事にコメントしました。
　　　[Greg Brockmanさんポスト](https://x.com/gdb/status/1858337346514485362?t=HVRVmv5vYyfAtDBMgn84zA&s=19)
　DeepL翻訳
>病気の診断精度に関する興味深い小規模研究：
>
>- 人間の医師 74%
>- ChatGPTを使う人間の医師：76
>- ChatGPT単独：90
>
>AIが診断に役立つ可能性は大きいが、人間<>AIのチームワークが必要である：

　引用された記事
　　[A.I. Chatbots Defeated Doctors at Diagnosing Illness](https://www.nytimes.com/2024/11/17/health/chatgpt-ai-doctors-diagnosis.html)
　　　を読むと、
　　　　医師がChatGPTの出力を
　　　　　信用せずに、診断する場面も
　　　　　　あったそうです。

　やはり、
　　医師は学んだことや経験したことを
　　　重視しがちで、それに誇りを
　　　　持って、患者の診断を
　　　　　行なっているのでしょう。

　しかし、
　　医師とて、人間です。
　　　時と場合によって、
　　　　その思考力には
　　　　　ばらつきが出るものです。

　それに
　　人間の能力には
　　　限界もあります。

　どんな医師でも
　　人間であることに
　　　変わりはありません。

　医師の能力を補完するためにも
　　AIの活用は必要だと思います。

　もちろん、
　　ハルシネーション問題は
　　　残っていますから、
　　　　“今すぐ取り入れた方がいい”
　　　　　とは言いませんが。
***
　次は、

　Perplexityです。

　「Buy with Pro」というサービスを
　　発表しました。

　ユーザーの欲しいものを
　　AIが最適な商品を提案してくれます。

　利用開始は
　　米国Proユーザーからになります。

　[木村翔大さんポスト](https://x.com/shota7180/status/1858635296990179570?t=3xU4YOKgYuaicm-SbMKOsQ&s=19)

　[Perplexity公式ポスト](https://x.com/perplexity_ai/status/1858556244891758991?t=s0EnbS2Sb0gOGksAIzCbyQ&s=19)
***
　さて、本題です。

　今回は、
　　DALL-E3のセッションはじめで、
　　　Promptが効かないことがあり、
　　　　その原因と対処法を示します。

　ここ一週間ほどでしょうか。
　　画像生成すると、
　　　Promptとは関係ないような
　　　　画像が生成されるように
　　　　　なりました。

　しかし、
　　うまくいくケースもあります。

　Promptを書き出させると
　　すべて指示どおりの内容でした。

　いろいろと
　　調べていくと、
　　　ひとつのことに
　　　　気付きました。

　アプリ版で
　　描画した画像の
　　　Promptを確認すると、
　　　　うまくいくのは英語
　　　　ダメなのは日本語
　　　　　だったということです。

　今まで
　　ユーザーとDALL-E3の
　　　仲介役であるChatGPTは、
　　　　Promptの盛り付けをしたあと、
　　　　　英訳して、DALL-E3に
　　　　　　渡していました。

　それが
　　盛り付けたあと、
　　　そのままDALL-E3に
　　　　渡されていたのです。

　実は、
　　DALL-E3も多少の日本語を
　　　知っており、描画してくれます。
　　　　犬猫などはその代表格。

　しかし、
　　本当にわずかです。

　試しただけでも
　　次のものは、変な画像が
　　　生成されました。

　・タンクローリー
　・ドラッグレース
　・迷路
　・カンガルー
***
　では、
　　どうしたら
　　　回避できるでしょうか？

　三つあります。
　・描画前ならば
　　　Promptに下記追加して送信。
　　　　“DALL-E3には英訳して渡す。”
　・描画後ならば
　　　“英文Promptで描画”で送信。
　・常に英文を渡すならば
　　　Custom instructionsを使う。

　最後の
　　Custom instructionsの使用が
　　　一番手間が掛かりませんので
　　　　説明しましょう。

　Custom instructionsは、
　　ChatGPTの比較的初期に
　　　追加された機能です。
　　　　2023年7月20日に
　　　　　提供開始でした。

　Custom instructionsとは
　　そこに情報や指示を
　　　書き込むことで、
　　　　セッション最初に読み込まれ、
　　　　　ChatGPTの回答に
　　　　　　影響を与えます。

　　このため、
　　　セッション途中で
　　　　Custom instructionsを
　　　　　変更しても
　　　　　　そのセッションには
　　　　　　　影響しません。
　　　　　　　　ご注意を。
***
　操作方法です。

　アプリ版は
　　❶アカウント
　　　　→カスタマイズ
　　　　　→カスタム指示

　　❷トグルスイッチをオン

　　❸“どのようにChatGPTに〜”の
　　　　ボックスをタップ。

　　❹下記文章を追加。

　　❺右上の“保存する”をタップ。


　Web版は
　　❶アカウント
　　　　→ChatGPTをカスタマイズする

　　❷“どのようにChatGPTに〜”の
　　　　ボックスをタップ。

　　❸下記文章を追加。

　　❹下端にある
　　　　トグルスイッチをオン。

　　❺保存するをタップ。


　下記文章は、こちら。
```Text:Custom instructions下段追加
DALL-E3へ渡すPromptは英語のみ。
```

　何度か試してみましたが、
　　すべてうまく描画するように
　　　なりました。

　もちろん、その都度、
　　セッションを開いて、です。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
`pandas.Series`: 存在しないインデックスに対して値を設定する場合は、アップキャストが発生しても警告メッセージは表示されない

# 環境
* Python 3.12.4
* pandas 2.2.3
* numpy 1.26.4


# 内容
以下のドキュメントに書いてある通り、`pandas.Series`に対して値を設定する操作でアップキャストが発生すると、警告メッセージが表示されます。

https://pandas.pydata.org/docs/whatsnew/v2.1.0.html#deprecated-silent-upcasting-in-setitem-like-series-operations


```
In [220]: ser = pd.Series([1, 2, 3])

In [223]: ser
Out[223]:
0    1
1    2
2    3
dtype: int64

In [225]: ser[0] = 'not an int64'
<ipython-input-221-54fde2c4392f>:1: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise an error in a future version of pandas. Value 'not an int64' has dtype incompatible with int64, please explicitly cast to a compatible dtype first.
  ser[0] = 'not an int64'

In [229]: ser
Out[229]:
0    not an int64
1               2
2               3
dtype: object  
```

しかし、存在しないindexに対して値を設定する場合は、警告メッセージは表示されません。

```
In [222]: ser = pd.Series([1, 2, 3])

In [224]: ser[3] = 'not an int64'

In [225]: ser
Out[225]:
0               1
1               2
2               3
3    not an int64
dtype: object
```

`pandas.Series`に対して値を設定する場合は、そのインデックスが存在するかどうかを意識する必要がありそうです。
flaskアプリをEC2でデプロイした話

こんにちは、人工知能学科3年の川上です。
授業でデプロイとかあんまりしないですよね。自分でやらないと。
最近はreplitみたいなのも出て、このままいくと全部自動化されるんじゃないかと思ってますが、今日は手動でflaskアプリをEC2でデプロイした話について話します。
引っ掛かった部分と簡単な流れだけ伝えるので、わからないことはchatGPTに聞いてください。

流れ
１，flaskでpythonファイルを作る。
２，ローカルで動作確認。
３，EC2開ける。ポート開ける設定する。
４，EC2インスタンスに接続してpythonファイルを移す。
５，pythonファイルを実行。

ひっかかかった部分
５，のflaskアプリを実行するとこで、サーバーが立てられたものの、時間がたつと機能しなくなる問題がおきました。flaskアプリをpython ファイル名だけで実行するのではやはり無理があったようで、flask専用の安定したサーバーを立てる機能、Gunicorn + nginx（ローカルサーバーでのデプロイ）を使った。やり方はAIに聞けばできると思います。

後は、EC2の設定の時にポート開くの忘れてたり、したけど、基本はこの流れで行けました。
EC2インスタンスに接続するってのは
![{38B3022C-8625-402D-B83E-FFA9556CCC7C}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111805/112618ab-3942-84a1-b3af-55f24a66ce8c.png)
この接続のところを押すってことです。
Advent of code 2015 Day 1 Part 1 を Livebook で楽しむ

## はじめに

昨年、 Advent of code 2023 を Livebook で楽しみました

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

今年も 12 月に開始されるので、その前に過去回の 2015 を解いて行きます

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day1_part1.livemd

問題はこちら

https://adventofcode.com/2015/day/1

## セットアップ

Livebook のセットアップセルで KinoAOC をインストールします

https://github.com/ljgago/kino_aoc

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

:::note info
実は KinoAOC に問題があったため、 PR を出して修正しました

https://qiita.com/RyoWakabayashi/private/9a92d118ce7eba9f1cc3
:::

## 入力の取得

KinoAOC をインストールすると、 "Advent of Code Helper" というスマートセルが
使えるようになります

![スクリーンショット 2024-11-19 12.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7e9a9afc-1dd1-e183-ddcc-d79222149296.png)

"Advent of Code Helper" のセルを追加し、年、日、認証用のSESSION、入力を格納する変数名を指定します

![スクリーンショット 2024-11-19 12.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/59924b76-0f5c-72e7-1124-b2ef07e04121.png)

:::note info
SESSION の値は Cookies から取得可能です

![スクリーンショット 2024-11-19 12.23.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/af32a823-7210-3cee-1fe6-7be1df3be30a.png)
:::

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

<details><summary>回答</summary>

`(` のときに上昇、 `)` のときに下降し、最終的に何階にいるのか、という問題です

最終的な階数は「`(` の数 - `)` の数」です

「`)` の数」は「全文字数 - `(` の数」なので、最終的な階数は「`(` の数 - (全文字数 - `(` の数) = 2 * `(` の数 - 全文字数」となります

```elixir
puzzle_input
|> String.codepoints()
|> then(fn directions ->
  2 * Enum.count(directions, fn d -> d == "(" end) - length(directions)
end)
```

</details>

## まとめ

Day 1 Part 1 なので単純ですね

Part 2 はこちら

https://qiita.com/RyoWakabayashi/private/393bfaa09fbde0b98627
オーバープロビジョニング

# どんなトラフィックでも収容できるようにする
> どんなトラフィックでも収容できる十分な容量のネットワークを構成することである。この方法は、`オーバープロビジョニング(overprovisioning: 過剰投資)`と呼ばれる。

# 利点
>`性能で言えばこれに勝るものはない`。
...
これは単純に`利用可能な容量が多いので常に需要を満たすことができる`ためである

# 欠点
>`コストが高い`ことである。基本的には、お金を注ぎ込んで問題を解決するような方法となっている。QoS機能は、容量の小さいネットワークで、アプリケーションの要求を低コストに満たすための仕組みである。また、オーバープロビジョニングのためには、`トラフィックを事前に見積もっておく`必要があるが、トラフィックのパターンが後から大きく変化した場合には対応できない。

# ネットワーク構成がQoSを保証するためには
>QoSの仕組みを用いることで、トラフィックが一時的に急激に増加するような場合にも、他のいくつかの要求を断ることが性能を保証することができる

>* アプリケーションがネットワークに`何を求めている`のか
>* ネットワークに流入するトラフィックを`どうのように制限`するのか
>* 性能保証のために、ルーターのリソースを`どのように予約`されるのか
>* ネットワークが追加のトラフィックを`安全に受け入れる`ことができるのか


https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
wslからwindowsフォルダを開く

# 概要
**自分用メモ**
WSLから以下のコマンドを実行すれば、
対応するWindowsのフォルダをさらに確認できます。


# コマンド
下記コマンドで、該当のフォルダをWindowsのエクスプローラーで開けます。
```shell
explorer.exe .
```
posit CloudでSeuratを使う準備

Seuratを使った解析を、どこでもサッと試したい。ので、posit Cloudの環境にSeuratをインストールする際に行ったことを以下にメモして共有します。

### 1. SeuratObjectが依存するMatrixをバージョン指定でインストール
2024年11月19日の時点で、posit CloudのデフォルトのMatrixのバージョンが1.5-3です。一方、同日SeuratObjectが依存しているMatrixのバージョンは1.6-4です。
そこで、バージョンを指定してMatrixをインストールします。
今回、remotesを利用しますが、これもデフォルトではposit Cloudに準備されていないので、入れていきます。

```php:remotesのインストール -> Matrix1.6-4のインストール
install.packages("remotes")
remotes::install_version(package = "Matrix", version = "1.6.4", dependencies = FALSE,repos = "http://cran.us.r-project.org")
```

インストールが終わったら、メニューのSessionから"Restart R"を選び、Rをリスタートします。
すると、Packagesリストの中に、先ほどインストールしたバージョンのMatrixが現れるので、こちらを選択しておきます。

### 2. SeuratObject & Seuratをインストール

次に、SeuratObjectをインストール、Seuratをインストールの順でインストールしていきます。

```php:SeuratObjectのインストール -> Seuratのインストール
install.packages("SeuratObject")
install.packages("Seurat")
```

これで無事Seuratが使えるようになりました。

参考記事
Science and Engineering Cafe on the Net, R, [Install a specific version of a package](https://www.saecanet.com/2024/05/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/).
"nextjs-auth0 is attempting to set cookies from a server component". ワーニングへの対処法



.envに下記設定を追記する。

```.env
# server compornentでgetsessionした際のエラー回避
AUTH0_SESSION_AUTO_SAVE=false
```

参考 
- [How to avoid warning message when getting user information on Next.js 13 server components with Auth0](https://stackoverflow.com/questions/76813923/how-to-avoid-warning-message-when-getting-user-information-on-next-js-13-server)
VPCで見知らぬ料金がかかっていて犯人捜し

## ディメンションを使用タイプにする

よく見える。
![chrome_g2AL3aUZDR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/85ca4b7e-446b-5b0d-f4bd-f6b977b087d2.png)

さらに下記設定をONにすると14日間に制限されるがリソース毎の料金も確認できる。便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/a75ae123-2df2-ed3c-0b34-dd0773fc4d94.png)
![chrome_7xeXqaq1SY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/c4e030ca-0d4d-c6d8-5fa2-cc147671368c.png)

## 対処
エンドポイント削除。
とは言えプライベートサブネットからは必要なものもあるので、コマンド用意しておいて都度作成する運用に。
```
aws ec2 create-vpc-endpoint \
    --vpc-endpoint-type Interface \
    --vpc-id vpc-xxxx  \
    --subnet-ids subnet-xxxx \
    --security-group-ids sg-xxxx \
    --service-name com.amazonaws.ap-northeast-1.ssm 
```
  
## まとめ
S3エンドポイントが無料なのでその他も無料だと勘違いしていて、interfaceのエンドポイントは課金されることを知らなかった！
#というか、盲目的に作成していたので、interface型と認識さえしていなかった。。。反省
UTF-8がいまだに何なのかわかっていなかったので整理

駆け出しエンジニアとして本を読む日々を過ごしているものなのですが、最近本にやたら出てくるこいつ↓について簡単に調べてまとめました！

# UTF-8ってよく聞くけど何なの？
日常的にプログラミングされる方であったら毎日のように見るかもしれません、UTF-8。
そもそもUTF-8について理解を深めるうえでこの世の**エンコード**の仕組みを理解せねばならないのです。

さあ、難しい言葉が早速出てきたのでそこから理解しましょう。

## エンコード
そもそも、**コンピューターが扱う言葉と人間が扱う言葉はそもそも異なります**。エンコードによくお世話になる以下の2つのケースについて説明します。

### URLエンコード
`URLに日本語を含めた時`

URLには基本的に日本語を埋め込むことはできません。
なので、日本語をエンコードすることで記号、英語、数字の組み合わせに変換してURLを発行します。

ほら、友人からLINEで送られてきたリンクがめっちゃ長文でキモいやつです！

話を戻しますが、例えば「東京,日本」をエンコードすると「%E6%9D%B1%E4%BA%AC%2C%E6%97%A5%E6%9C%AC」となります。
このように記号、英語、数字の組として表現され、正常にリクエストがサーバーに送信されることとなります。

### 文字エンコード
`Python等でファイルを保存したり開いたりするとき`

ご存じだと思いますが、コンピューターは数字でコミュニケーションを取ります。例えば、00101101などの二進数が基本となっています。

一方、人間が（コンピューターとの）会話で使うのは「こんにちは」「さようなら」などの文字ですよね。
なので、人間の意図を文字にしてそのままコンピューターに伝えたって伝わるわけがないのですよ、、泣

そこで、エンコード方式ごとに異なる文字（例：こんにちは）と数字（例：00101101）の対応表を正しいものに切り替えることを文字エンコードと呼びます。


以上2つの例を通してエンコーディングのイメージがつかめたかと思います。
上記で説明した、**対応表**について深堀りしていきます。

## 【重要】対応表は厳密には2つ存在する！
これは、URLエンコードと文字エンコードの2つというわけではなく、それぞれエンコードのプロセス内で2つの対応表を使うといったことです。（わかりずらいですね、、）
理由については[こちら](https://blog.shibayu36.org/entry/2015/09/14/102100)の記事が参考になるので興味ある方はぜひチェックしてみてください！

2つの表が、
- 符号化文字集合
- 文字符号化方式

と呼ばれるものです。「安心してください、説明しますよ！」（〇村）

### 符号化文字集合
`人間が使う文字とその文字に対応するコンピューターが認識可能な番号（ゼロ以上の整数値）の対応表`

Unicode, ISO-2020-JP, EUC-JP, Shift_JISなどがこれに該当します。
（Unicodeの例：「こんにちは」⇒（Unicodeを参照）⇒「\u3053\u3093\u306b\u3061\u306f」）

なので、省略して語られることの多いUnicodeは「Unicode文字集合」と呼ばれることもあります。

### 文字符号化方式
`文字に対応するコンピューターが認識可能な番号（ゼロ以上の整数値）と実際にコンピューターが扱う数字（データ列）の対応表`

この処理の対象は先ほどの文字に対応するコンピューターが認識可能な番号になります。それを実際に使うための具体的な数字（データ列）に落とし込みます。

UTF-8, UTF-16, UTF-32などがこれに該当します。


**そう、この文字符号化方式の一種であるのが、あのUTF-8なんですよ！！！**

最終的にこの2つのプロセスを踏んで、人間の使う文字⇒コンピューターが扱う数字への変換を行っているわけなんですね。

# まとめ
1. エンコードとは符号化文字集合と文字符号化方式の2つの対応表を用いた処理をまとめたもの。
2. 符号化文字集合とはエンコードの前半の人間が使う文字とその文字に対応するコンピューターが認識可能な番号（ゼロ以上の整数値）の対応表。Unicode, ISO-2020-JP, EUC-JP, Shift_JISなど。
3. 文字符号化方式とはエンコード後半の文字に対応するコンピューターが認識可能な番号（ゼロ以上の整数値）と実際にコンピューターが扱う数字（データ列）の対応表。UTF-8, UTF-16, UTF-32など。
4. UTF-8はただの対応表のことだよ！！！

# おまけ
### パーセントエンコード
URLエンコードでも説明させていただきましたが、「%E6%9D%B1%E4%BA%AC%2C%E6%97%A5%E6%9C%AC」のようなキモいやつについて少し説明します。

このパーセントがアホみたいについたものをパーセントエンコードされた文字と呼びます。パーセントエンコード自体は全く難しくなく、何かしらの文字符号化方式を指定して、変換したデータ列に対して%を間につけていくだけです。

例えば、UTF-8で「東京,日本」をエンコードすると「E6 9D B1 E4 BA AC 2C E6 97 A5 E6 9C AC」となります。
このスペースに対して「%」を挿入すると「%E6%9D%B1%E4%BA%AC%2C%E6%97%A5%E6%9C%AC」となるわけです。

こちらのサイトが文字コードの変換を試せるサイトなのでぜひチェックしてみてください！
[https://www.ahref.org/mojicode.php](https://www.ahref.org/mojicode.php)
[https://tech-unlimited.com/urlencode.html](https://tech-unlimited.com/urlencode.html)

最後まで見ていただいてありがとうございました！間違っていることなどがございましたらご指摘いただけると幸いです！
ぜひ他の記事もチェックしてみてください～ではまた！
最近の新卒エンジニア就活について（２５卒、実体験談）

どうもこんにちは。人工知能学科3年　川上です。
人工知能学科の2年生はもう就活中でしょうか、今日は僕が大阪ハイテクノロジー専門学校、人工知能学科で就活をするとき役に立ったこと、苦労したことを書こうと思います。1年生も就活の参考になると思いますので是非読んでください。

**もくじ**
１，最近のIT業界就活の流れ
２，大阪ハイテクノロジー専門学校人工知能学科の特色
３，最適解

## １，最近のIT業界就活の流れ 
まず、最近のIT業界就活はめっちゃはやいです。年内に内定をもらっているなんて話は普通で、2年生のうちから内定をもらっているなんて話もあります。別に早くもらう必要はないのですが、伝えたいのはスタートが12月を過ぎると待遇が良い人気の就職先はすでに募集を締め切っている場合があるということです。年を越してからだと、多少出遅れ感がありました。

## ２，大阪ハイテクノロジー専門学校人工知能学科の特色
大阪ハイテクノロジーの人工知能学科はもともとロボット学科であり、紹介できる就職先がソフトウェアの会社というよりは、ハードによっています。人工知能学科は僕たち3年が入学した年にできました。2022年ですかね。僕たち3年生が最初の人工知能学科としての卒業生です、つまり今の1年生、2年生が就職先の相談に行ってもロボット学科のときの就職先のデータはありますが、人工知能学科としてのデータは薄いので自分で探すことも大事になります。

もう一つ大きな特色として滋慶学園という大きいグループの中にある専門学校と言うことです。人工知能学科はその中でも特に人工知能学科は立場が弱い、小さい学科だということです。何が言いたいかというと、手続きが面倒で、動きが遅い、遅くなる。ということです。これは学生に限ったことではなくて、先生からの就活に関する伝達にも遅れが生じているということです。特に先生から学生への連絡は、最近のIT業界就活の流れより、他の大きい学科、スポーツ学科や臨床工学技士学科の都合に合わせた連絡になるので、もし先生からそろそろ就活始めようと言われてまだ始めていなかったらヤバいです。IT業界では、もう募集を終了している企業がたくさんあると思ってください。選択肢は急速に縮まっていきます。（といってもたくさんの選択肢があるのですが、人気のところが埋まっていってしまうということです。）

## ３，最適解
とはいっても、星の数ほどある企業の中で、自分の興味のある業界のホームページいくつも探して申し込むのはなかなか大変な作業です。学校の先生も就職先を探すときは頼りになりません。
自分でやるしかない、じゃあどうするか。楽になるツールを使おう！
ということで、僕が就活で使った数あるツールのなかで特に役立ったものをいくつかピックアップします。

まずはpaizaです。僕は就活を[paiza](https://paiza.jp/works/mypage "paiza")でほとんど行いました。paizaのランクをBぐらいに上げておくと、スカウトが来るので乗り遅れることはありません。（Bランクまではpythonの基礎だけ分かってたら考えれば解ける問題がある。）そこから興味のある企業に申し込んだりします。
申し込んでも何も減るわけではないし、とても簡単なのでまずは申し込んで説明会を聞きます。そこで次に進むかを考えればいいのです。まずは少しでも気になった企業に申し込む、説明会を聞くというのを繰り返してください。僕は興味のあるところが多かったので1週間に4,5回ぐらい聞いてました。後、授業本番は卒研なんで、自分の興味ない授業のときに公欠入れて説明会に行きまくるのがステップ１です。
paizaの何が良いかってBランクぐらい取っとけば、大体の企業は書類選考を飛ばせて、すぐ説明会、面接に行けるってことです。まずは数受けないと面接慣れもしないし、求められていることもわかんないので、数をこなすという意味でとても優秀なツールだと思います。（好待遇の有名企業も申し込めるようになってる！）

ツール２が[NewsPicks](https://newspicks.com/ "NewsPicks")です。これの学割プランに入っとけば間違いないです。特におすすめなのが[デューデリだん！](https://newspicks.com/movie-series/72/ "NewsPicks")という連載番組で、最近の話題、注目の企業を教えてくれる最高の番組があって、これみとけばここ行きたいって企業もあると思うんで、そういうとこに面接慣れして自分の強みもわかってきたタイミングでホームページから申し込むのが良いと思います。もちろんpaizaだけでもいいのですが、掲載されていない企業もあるので、paizaで数打ちながら、質も狙いつつ、別で興味のある企業も申し込んどく、これが最適解、とりあえずはこれでしのげます。
後、学校の手続きとかは後回しでいいです。説明会、週5回いってるのに毎日紙書いてたら非効率極まりないです。いっぱい受けてちょっと面接進んできたら紙書いて出しとけば大丈夫！自分のほんまに行きたいってやつだけ企業分析ついでに紙書いて書類だせばいいと思います。しばられすぎないで。

で、ツール３が[Notinon](https://www.notion.com/ja/explore "Notinon")です。多分もう使ってると思うので簡単に、めっちゃメモ取りやすいです。就活の企業分析とか間違いなくnotionにメモするべき、ほんでどんなことを強みとして話すか、自己紹介のテンプレなどを申し込んだ企業ごとにメモっておいて、面接中のカンペ、メモにする。これで後で見返して自分の良かったところ悪かったところ調整できます。

最後に就活疲れについてですが、３０社ぐらい受けてたら就活疲れてくると思います。行きたいとこ全然受からんし、メンブレ、でもそのとき、休んだらダメです、もちろん1日ぐらい休憩とかは大丈夫ですが、月単位で休むとおいていかれて就職先限られたとこだけになっちゃいます。落ちるたびになんで落ちたか、自分の中で答えを見つけて解決して次に挑んでください。自分の納得できる就職先、運命の相手を見つけるまで走り続けましょう。最初の一歩、キャリアの考え方を甘く見ると今後簡単に転職もできなくなるので、最初の一歩が大切です。僕もめっちゃ受けてめっちゃ落ちて時には親連れて東京まで行って最終面接受けたのに落ちたこともありました。でもなんであかんかったか、考えて、直して、また受けてを繰り返してめっちゃ成長できる時間だったので、そういう意味のある時間に就活を成長の場ととらえて挑戦しましょう。がんばれ就活生!