OmniAICreator/Qiita-1.07M huggingface dataset:
Next.jsで始めるページ遷移 : Pageルーターの使い方

# Next.jsのルーティングの概要
Next.jsのルーティングには、大きく分けてpageルーターとappルーターの2種類があります。今回は、ファイルシステムベースで直感的なルーティングが可能なpageルーターについて詳しく解説していきます。


# Pageルーティングについて
pageルーターは、Next.jsの初期から存在するルーティング方式です。pagesディレクトリ内に配置されたファイルが、そのままURLに対応するページとして扱われます。つまり、ファイルシステムの構造とURLの構造がほぼ一致するため、直感的にルーティングを設定することができます。

## 通常のルーティング

### ファイル構造とルーティングの対応
`pages`ディレクトリ内に作成したファイルが、そのままURLに対応します。
- `pages/about.js`: /about にアクセスすると表示されます
- `pages/blog/post.js`: /blog/post にアクセスすると表示されます

### ネストしたルーティング
`pages`ディレクトリ内にフォルダを作成することで、ネストしたルーティングを実現できます。
- `pages/products/index.js`: /products にアクセスすると表示されます
- `pages/products/[id].js`: /products/123 のような動的なURLを実現できます

## ダイナミックルーティング
動的なURLを実現するために、Next.jsではダイナミックルーティングという機能を提供しています。
[id]、[...]、[[...id]]といった特別な記法を使用することで、動的なパスを実現することができます。

### [id]
例: `pages/products/[id]/index.jsx`は、/products/123のようなURLを実現します

### [...]
例: `pages/blog/[...slug]/index.jsx`は、以下のURLすべてにアクセスできます。
- `/blog/hello`
- `/blog/hello/world`
- `/blog/deeply/nested/path`

### [[...id]]
例: `pages/blog/[[...slug]]/index.jsx` は、以下のURLすべてにアクセスできます。
- `/blog`
- `/blog/hello`
- `/blog/hello/world`
- `/blog/deeply/nested/path`

`[...]`の場合は、`/blog`にアクセスできませんが、`[[...slug]]`の場合は、`/blog`でもアクセス可能となります。


# まとめ
pageルーターは、Next.jsのルーティングの基礎となる機能です。ファイルシステムベースの直感的な設定が可能であり、静的サイト生成との親和性も高いです。ダイナミックルーティング機能を活用することで、様々な種類のURLに対応することができます。
個人的な資格の受かり方~AWS-SAA~

# 1. はじめに
今回の記事では、自身がAWS-SAA（SAA-C03）に合格した体験から、合格に至った勉強方法や使用した参考書と問題集、試験を終えての印象などをまとめたいと思います。
「SAAを受験するけど、何から始めたら良いか分からない」、「SAAを受けたいけど、どんな感じなんだろう」、「どれくらいの期間で合格できるんだろう」のように考えている人の参考程度になれば嬉しいです！

# 2. 勉強を始める前の印象
まず初めに、自身はAWSのサービスに関しては日常的に触れることはほぼないというような立ち位置です。
そのため、1年ほど前に受験したAWS-CLFの勉強をしていた時も、なかなか勉強のモチベーションが上がらず、覚えるサービスも多くて苦戦した記憶があります。
加えて、先にSAAに合格していた同期から「CLFと比べると、とにかく問題文が長い」と聞いていたので、正直あまり良い印象はありませんでした。。。
それでも何とか資格を取得したいと思い、準備を始めました。

# 3. 使用した参考書と問題集
今回の受験にあたって使用した参考書と問題集を紹介します↓↓
参考書は書籍を、問題集に関してはUdemyの模擬試験問題集を使いました。

<table>
    <thread>
        <tr>
            <td>参考書</td>
            <td>
            徹底攻略 AWS認定 ソリューションアーキテクトアソシエイト 教科書<br>
            第3版 SAA-C03対応<br>
            出版社：インプレス（2023/3/7）
            </td>
        </tr>
        <tr>
            <td>問題集<br>(Udemy)</td>
            <td>
            【SAA-C03版】AWS認定ソリューションアーキテクトアソシエイト模擬試験問題集（6回分390問）
            </td>
        </tr>
    </thread>
</table>

選んだ理由として、全く深い意味はないです。
個人的に細かい字がたくさん書いてあるタイプの参考書は苦手なのと、AWSの勉強は図がないと理解しづらいので、本屋でパラパラ見てみて読みやすいと感じたものを選びました。
問題集に関しては、CLFを受験したときもUdemyの問題集で合格できたこと＋セールのタイミングを狙うとかなり安く買えるので、今回もUdemyのものを選びました。

# 4. 勉強方法
ここからは上で紹介した参考書と問題集を使って、どのように勉強を進めていたかを紹介します。

## 4.1 大まかな流れ
参考書と問題集の使用頻度は3:7くらいの割合だったと思います。
参考書でインプットしたものを問題集でアウトプットする流れを考えると、6:4くらいになるのが理想な気はするのですが、今回は少し時間がなかったこともあり、SAAの問題に慣れることを優先して進めました。
そのため、勉強の流れとしては
**Udemyの問題を解く⇒解説を読んでサービスの理解を深める⇒再度問題を解く**
を繰り返し、これに加えて隙間時間で参考書を読んで+αの知識をインプットするような感じでした。

## 4.2 問題集の進め方
4.1で紹介した勉強の流れをもう少し詳しく紹介したいと思います。
SAAの試験では全部で65問出題されるのですが、勉強を始めたばかりの段階で一気に65問解くと普通に疲れます。
日常的にAWSに触れる機会があるなどで何となく解けるなら良いと思うのですが、あまり知識に自信がない、出題形式に慣れていない状態で挑戦すると精神的に疲れますし、何より解説を把握しきれません。
自分も自信がない状態でのスタートだったので、今回は以下のような流れで問題集を進めました。

1. 1問目から35問目を解く
分からない問題でも適当にそれっぽい答えを選ぶ。
2. 解説を読む
自分の選んだ選択肢が不正解だった場合は、なぜ不正解だったのか？正解の選択肢との違いは何か？をしっかりと把握することが大事だと思います。
偶然正解した問題もあると思うので、よほど時間に余裕がない場合を除いてはすべての問題の解説を読むのがおススメです。
自分は初めて見るサービスや機能が出てきたら、ノートに”まとめる”のは時間の無駄なので、要点だと思う部分を抜粋して書きなぐります。
3. 1問目から65問目まで解く
1問目から65問目までを通して解くのは疲れる的なことをはじめに書きましたが、、
この2周目の目的としては、1問目から35問目までを理解できているかの確認と36問目から65問目までの問題に挑戦することです。
1問目から35問目に関しては、解説を読んでいるときにノートにメモしたものなどがあれば、それをチラチラ見ながらでも良いと思います。
ただいつまでもメモを見ながらだとダメなので、**2周目に限って**です。
4. 解説を読む
1問目から35問目までで不正解だった問題と、36問目から65問目までの解説を読みます。
解説を読むときの進め方は1問目から35問目のときと同じです。
5. 1問目から65問目まで解く
1問目から35問目まではカンニングなしで、36問目から65問目まではメモをチラチラ見ながらでも良いので解きます。
6. 解説を読む

このような流れで進めるので、1回の模擬試験を最低3周（1周目は35問目までなので2.5周？）は行うことになります。
自分は3周終わったら一旦次の模擬試験に移り、6回分すべて3周終えた後にそれぞれ4周目に取り組んでいました。

# 5. 試験を終えての印象
問題集を一通りやりましたが、試験当日はあまり自信がなかったこともあり、試験時間の130分のうち残り30秒になるあたりまで試験室にいました。。。
合格した後の感想としては、問題集を繰り返してSAAの出題形式に慣れていた効果はとても大きかった気がします。
出題されているシチュエーションで現在困っていることは何か？（音声をテキストに変換して感情分析したい、複数のAWSアカウントの管理が大変など）、その課題を解決するために優先したいことは何か？（労力を減らしたい、コストを抑えたいなど）をしっかり把握すること（把握することに慣れること）が大事だと感じました。
そうすれば試験本番でも、選択肢を絞り込みやすくなるかもしれません。
<br>
今回合格までに要した期間は3週間～1ヵ月ほどでした。
自分も初めの頃は「無理。。」って思っていましたが、着々と勉強していれば意外と合格できると思います。
また少し期間を空けて、次のAWSの資格にも挑戦できればと思います。
Laravelでneo4jを使ってみる④restfull api


neo4jの動作確認のためrestfull APIを実装してみる。


コントローラの生成

```
$ php artisan make:controller RestRaceController --resource
```

```api.php
Route::resource('race','RestRaceController');
```

とりあえずGETだけ実装

```app/Http/Controllers/RestRaceController.php
class RestRaceController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $items = Race::all();
        return $items->toArray();
    }
```

[サイトURL]/api/raceでデータが取得できます。

api_tokenのフィールドを追加

```api/Models/User.php
class User extends NeoEloquent implements
{
～    protected $fillable = [
        'name', 'email', 'password','api_token',
    ];
```

User登録時にAPIトークンを生成

```app/Http/Controllers/Auth/RegisterController.php

class RegisterController extends Controller
{
～
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'api_token' => Str::random(60),
        ]);
    }
````

認証時にトークン更新、ログアウト時にトークン削除

```app/Http/Controllers/Auth/LoginController.php
class LoginController extends Controller
{
～

    protected function authenticated(Request $request, $user)
    {
        $user->update(['api_token' => Str::random(60)]);
        return redirect()->intended($this->redirectPath());
    }
    
    public function logout(Request $request)
    {
        $user = $request->user();
        $user->update(['api_token' => null]);
     
        $this->guard()->logout();
     
        $request->session()->flush();
        $request->session()->regenerate();
        
        return redirect('/');
        
    }
```




[Laravel API認証](https://readouble.com/laravel/5.8/ja/api-authentication.html)
[Laravel+Vue.jsでトークン認証してデータを取得する](https://www.webopixel.net/php/1343.html)
Laravelでneo4jを使ってみる③モデル

※modelのフォルダを変更しています。

Userモデルに関連したRaceモデルを作ります。

(User) → (Race)



##1)モデルクラス作成
```
$ php artisan make:model Models/Race
```

```app/Models/Race.php
<?php

namespace App\Models;
use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent;

class Race extends NeoEloquent 
{
    //
    protected $label = 'Race'; 
    protected $fillable = ['name']; 
}
```

##2)HasOne(1対1)

```app/Models/User.php
class User extends NeoEloquent implements
{
～
    public function race()
    {
        return $this->hasOne('app\Models\Race','ENTRY');
    }
```

>return $this->hasOne('モデル','リレーション名');


```web.php
    $user = User::first();
    $race = new Race(['name' => 'レース']);
    $relation = $user->race()->save($race);
```

上記を実行すると下記のようにデータが追加される。
>(User) →[:ENTRY] → (Race{name:"大会"})

※hasOneでsaveを複数回行うと、新規nodeが作成され、リレーションは最新のnodoのみになる。
例）大会１、大会２、大会３を連続でsaveすると、Raceノードは３つでリレーションは１つのみ保持される。
>(User)             (Race{name:"大会1"})
>(User)             (Race{name:"大会2"})
>(User) →[:ENTRY] → (Race{name:"大会3"})


##3)HasMany(1対多)

```app/Models/User.php
class User extends NeoEloquent implements
{
～
    public function races()
    {
        return $this->hasMany('app\Models\Race','ENTRY');
    }
```

```web.php
    $user = User::first();
    $race = new Race(['name' => 'レース']);
    $relation = $user->races()->save($race);
```

※hasOneと違いリレーションはすべて維持したまま。
例）大会１、大会２、大会３を連続でsaveすると、Raceノードは３つでリレーションも３つ保持される。
>(User) →[:ENTRY] → (Race{name:"大会1"})
>(User) →[:ENTRY] → (Race{name:"大会2"})
>(User) →[:ENTRY] → (Race{name:"大会3"})
文字の一致 (paizaランク D 相当) Java解答例

# 問題文
https://paiza.jp/works/mondai/d_rank_skillcheck_sample/diff_str

# 解答例
```java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			String a = scanner.next();
			String b = scanner.next();

			if (a.equals(b)) {
				System.out.println("OK");
			} else {
				System.out.println("NG");
			}
		}
	}
}
```

# 補足
ポイントはJavaで文字列を比較する際`==`を使わないこと。
説明は（ちょっと難しめだが）以下が詳しい。
https://developer.mamezou-tech.com/blogs/2022/11/06/java-string-equals/
WSL2で利用するユーザのBashプロンプト表示について

WSL2でUbuntu 22.0へアクセスした際にデフォルトでは下記表示となります。
(WSL2のインストール時にqiitaというユーザー名で作成している)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d03e23ec-6c93-f99f-8f85-06fac5c1ea42.png)

ユーザー名のほかにコンピューター名やカレントディレクトリが表示されており。
ブログ執筆等の時に、余計な情報が出ているため今回はこちらを調整してみます。

## 環境変数PS1で調整

bashではプロンプトのカスタマイズとして環境変数が用意されており。
下記のように設定する事で表示をユーザー名のみにカスタマイズできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4d3eabe6-cb2e-e696-95ad-78a4a158f0bf.png)

```bash
PS1="\u$ "
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/07d2ad1e-7b04-a1c6-c8bd-8681457ccaf5.png)

ちなみにbashプロンプト表示の環境変数については下記ブログ記事を投稿しています。

[Bashプロンプト表示の環境変数（PS0,PS1,PS2,PS3,PS4)について](https://qiita.com/SAITO_Keita/items/bf672c5c016847d5b557)

## .bashrcに表示変更用の関数を定義してみる

環境変数を切り替える表示変更用の関数を定義する場合は下記のように.bashrcに書いておきます。

```bash
qiita() {
    PS1="\u$ "
}
```

これにより、qiitaと実行するだけで環境変数PS1を更新する関数が定義できます。

## 総評

通常利用では個人的にはそんなに気になりませんが、ブログ等に投稿する場合は余計なノイズになってしまうため、プロンプト表示は少し気になりますね。
lodash-es (lodash) のdebounce関数

# lodash-es (lodash) の debounce 関数は、特定の時間が経過するまで関数の実行を遅延させるためのもの
例えば、ユーザーが入力を停止してから一定時間後にサーバーへリクエストを送信する場合に便利。

```js
import { debounce } from 'lodash-es';

const debouncedFunction = debounce(() => {
  // 実行したい処理（サーバーへのリクエストなど）
}, 1000); // 1秒の遅延

// イベントリスナーに適用
element.addEventListener('input', debouncedFunction);
```
ユーザー入力毎にリクエストを送信するのは効率悪いですもんね。

詳しくはリファレンスを見てね。

https://lodash.com/docs/#debounce
ESP32: LED の PWM 制御

Ubuntu 24.04 上の Arduino IDE 2.3.2 を使いました。
ボードは、 ESP32 Dev Module です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/64442cd2-f493-3d63-207c-638eeaa64309.png)


## プログラム

```text:led_pwm.ino
// ---------------------------------------------------------------------
//	led_pwm.ino
//
//						Jul/28/2024
// ---------------------------------------------------------------------
#define LED1 32
#define LED2 33
#define LED3 25
#define LED4 26
#define LED5 27
#define LED6 14
#define LED7 12
#define LED8 13

int leds[8] = {LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8};
int duties[8] = {1,2,4,7,11,16,22,29};
// ---------------------------------------------------------------------
void setup() {
	Serial.begin(115200);
	for (int it=0; it<8; it++)
		{
		ledcAttach(leds[it], 1000, 8);
		}
}

// ---------------------------------------------------------------------
void loop() {
	for (int it=0; it<8; it++)
		{
		ledcWrite(leds[it], duties[it]);
		Serial.print(duties[it]);
		Serial.print(" ");
		}

	Serial.println();

	delay(3000);

	shift_duties_proc(duties);
}

// ---------------------------------------------------------------------
void shift_duties_proc(int duties[])
{
	int duties_last = duties[0];

	for (int it=0; it<7; it++)
		{
		duties[it] = duties[it + 1];
		}

	duties[7] = duties_last;
}

// ---------------------------------------------------------------------
```
【Jekyll】<details>中で箇条書きを使えないときの対処法

# 起こった現象
Githubpagesに立てたJekyllテーマ「minima」において、HTMLの詳細折りたたみ要素である\<details>の中でMarkdownの箇条書きが作れなかった。

```html:詳細折り畳み要素の例
<details open>
  <summary>買い物リスト</summary>
  
1. じゃがいも
1. にんじん
1. たまねぎ
</details>
```

【実行結果※Qiitaでは箇条書きとして表示できます】
<details open>
  <summary>買い物リスト</summary>
  
1. じゃがいも
1. にんじん
1. たまねぎ
</details>

# 解決方法
JekyllのパーサーであるKramdownではHTML内のMarkdown記法はパースされない。このときはHTMLタグにmarkdown="1"のオプションを入れるとうまくいく。

```html:詳細折り畳み要素+markdown="1"
<details open markdown="1">
  <summary>買い物リスト</summary>
  
1. じゃがいも
1. にんじん
1. たまねぎ
</details>
```
<details open markdown="1">
  <summary>買い物リスト</summary>
  
1. じゃがいも
1. にんじん
1. たまねぎ
</details>


# 試したがうまくいかなかったこと
### parse_block_html オプション
下の記事ではconfig.ymlもしくは各ページ内でparse_block_htmlのオプションを有効にすると書いてあるが、うまくいかなかった。

https://82pkdick.github.io/Febris/posts/jekyll/design/custom-css-framework-2


### CommonMarkGhPages オプション
下の記事ではconfig.yml内でMarkdownのパーサーをCommonMarkGhPagesとして設定すると書いてあるが、うまくいかなかった。

https://qiita.com/eggplants/items/673aba3637748346797c

# 参考
https://stackoverflow.com/questions/22291211/jekyll-how-to-get-markdown-parsing-inside-blocks-using-kramdown
Python3: 島探し (paizaランク S 相当)やってみた。

おもしろそうなのでやってみました。

https://paiza.jp/works/mondai/s_rank_skillcheck_sample/search-island

```py:
# 探索する方向に応じた次に探索する方向:
# 0:South, 1:East, 2:North, 3:West
DIR = ( (0, 1, 3)
        ,(1, 2, 0)
        ,(2, 3, 1)
        ,(3, 0, 2)
        )

# 探索する方向に応じたとなりへの差分
D = ( ((1, 0), (0, 1), (0, -1))
      , ((0, 1), (-1, 0), (1, 0))
      , ((-1, 0), (0, -1), (0, 1))
      , ((0, -1), (1, 0), (-1, 0))
      )

W, H = map(int, input().split())
A = [ [False] * (W + 2) if i == 0 or i == H + 1 else
      [False, *list(map(int, input().split())), False]
      for i in range(H + 2)
      ]

def erase_island(i, j):
    A[i][j] = 0
    exists = [] 
    for l in range(2):
        if A[(ii := i+D[0][l][0])][(jj := j+D[0][l][1])]:
            exists.append((l, ii, jj))
            A[ii][jj] = 0
    for l, ii, jj in exists:
            erase_to(DIR[0][l], ii, jj)
        
def erase_to(k, i, j):
    exists = []
    for l in range(3):
        if A[(ii := i+D[k][l][0])][(jj := j+D[k][l][1])]:
            exists.append((l, ii, jj))
            A[ii][jj] = 0
    for l, ii, jj in exists:
            erase_to(DIR[k][l], ii, jj)

ans = 0

for i in range(1,H+1):
    for j in range(1,W+1):
        if A[i][j] == 0:
            continue
        ans=ans+1
        erase_island(i,j)

print(ans)
```

島をみつけたらカウントして地図から消していくって感じです。
単純に四方を探索すると被りが出てくるので、とりあえず来た方向には探索しないってのと、一回の探索で正面、左、右の最大3箇所消せるようにしました。
ちょっと複雑になっちゃったけど、その分速くはなってる気がします。
【セキュリティ】スマートフォンをドリルで破壊する

# 🔥 捨てられずに溜まっていく動かないスマホ

![IMG_0870.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/c525012c-eb3a-3246-c960-58e1cc657eb0.jpeg)

捨てますわ。

ノートパソコンもあるけども。

# 🔥 新規購入アイテム

![sc 2024-07-28 at 13.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/899e1967-0f45-f39c-e777-22a7d9afb4c4.png)

到着次第、めっためたにしてやります。


# 🔥 途中経過

![GH018810.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/6d803bc8-8c1a-4866-a669-85a218722d89.gif)

![IMG_0874.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/b2b6f3fb-4e03-c65d-e9d2-ea911bcca57a.jpeg)

![IMG_0893.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/fcebe03c-ddc0-9e1d-3932-75a08219356e.jpeg)

# 🔥 もしかしてドリルって

![IMG_0899.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/d4f7472d-d863-db90-8e86-9fb19d3a1e9b.jpeg)

厳しくね? 

メモリーチップって硬え。

![IMG_0906.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/616c0299-25b5-328c-2061-01cb2b842e61.jpeg)

# 🔥 結果

こうなりました。

![IMG_0948.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/b98d2a0c-a4d6-0d2a-5761-455b3d21e027.jpeg)

最終的なスマホ破壊選抜工具たちは以下。

![IMG_0949.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/a077e5ea-3308-cf02-e43f-6c63ae701713.jpeg)

ドリルで記憶領域を狙って確実に貫通破壊などできんよ。

# 🔥 引用

詳細はこちらから

https://android.benigumo.com/20240728/destroy-smartphone/
自作PC組み立ててみた

## はじめに
自作PCには前から興味があって組み立てみたいと思い、組み立てました。特にゲーム用とかじゃなく自動運転OSSの __Autoware__ を動かす用に買いました。せっかく良いGPUを買ったので、AIイラストとかも試してみたいです。

## 参考サイト
下のサイトでAutowareが安定して起動するPCのスペックを確認しました。また、初めて組み立てるのでfpsおじさんの動画を参考に組み立てました。
[推奨環境〜自動運転AIChallenge2024](https://automotiveaichallenge.github.io/aichallenge-documentation-2024/setup/requirements.html)
> __自動運転AIチャレンジとは__
本大会は、CASE、MaaSと呼ばれる新たな技術領域において、これからの自動車業界を牽引する技術者の発掘育成のための新たな取り組みとして実施しています。
決勝大会では自動走行モビリティに開発したプログラムを搭載させる走行競技まで行います。両大会合わせて、コンピューターサイエンス、AI、ソフトウェアや情報処理に関わる技術者・研究者・学生等のチャレンジの場、また学習及機会を提供し、有機的な繋がりを実現する場を目指します。
[自動運転AIChallenge公式サイトより](https://www.jsae.or.jp/jaaic/2024ver/about/)

>[fpsおじさんの組み立て動画](https://www.youtube.com/watch?v=ky4eiHc7LCs&list=LL&index=77)
>

## スペック紹介
fpsおじさんの動画は1年前の動画なので、店員さんに相談して最新のスペックに揃えました。WindowsOSは非推奨なので、頑張ってLinuxに慣れてくださいね。
|OS|Ubuntu22.04|
|:---|:---|
|CPU|intel core i7 (14世代)|
|GPU|Palit (RTX4060Ti)|
|メモリ|32GB|
|SSD|1TB|

![IMG_2770.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/95aeaa35-dea3-2f29-6196-4de938cc8235.jpeg)

OS代がかからないのは大きいです。
総額180,000ぐらいになりました。

## 組み立て時の苦労した所
静電気とかでダメになってしまうことがあるらしいので下着とか着ないで取り付けました。CPU取り付け時にピンを折ってしまったり気をつけないといけないことが多いですが、 __メインメモリ取り付けの不具合__ で僕は詰まりました。
初期動作の不具合の8割はこのメインメモリ取り付けで起こるらしいです。
ちなみに僕は2ピンと4ピンの所を何回も差したり、抜いたりを繰り返してマザボ側に傷がついてしまいました。
なので、結局下の画像のように1ピンと3ピンで取り付けてなんとかBIOS起動にこぎつけた訳です。
![IMG_2775.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/6c728ecd-23c1-1909-4b28-3f68950b43b6.jpeg)
![IMG_2775.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/fe6162f9-0c2b-708e-a937-9eb71fcb0592.jpeg)

あと、CPUに内蔵グラフィック機能が無い場合、 __HDMI端子をグラボ側__ の方に取り付けないと当然映りませんので注意ですね。

## どうしても起動しない場合
最小構成テストをしましょう。CPU、CPUクーラー、メモリ、グラボを取り付けたマザーボードに必要最小限の電源コードを接続していきます。
>メモリは一つだけ取り付けてください！
二つ取り付けると映らないということも往々にしてあります！
>
このテストをしてメモリ側でなく、マザボ側に問題があると気づきました。
詳しく説明があるのは下のサイトです。
[最小構成テストの記事](https://shikaolog.com/pc-selfmade-04/)

## 組み立てた感想
取り付けるとき一つ一つのパーツが高額なので、かなり神経を使いました。僕は何回か起動テストをしてようやく動いたので、配線回りのチェックとか大変でした。自作PC経験者と一緒に組み立てるのが安心ですね。
![IMG_2779.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/2a6b234f-7f09-90e4-38e6-b9030cdb7d7e.jpeg)
自己紹介と今後やっていきたいこと

## 1.自己紹介
はじめまして！chemuです！
経歴はざっとこんな感じ↓
・2019年3月：大学院卒業（制御工学をやってましたが、不真面目な学生だったかも…ｗ）
・2019年4月：メーカーへ就職、社内のMBD推進チーム配属
・2024年現在：MBD推進チーム所属。役職はないけど多分サブリーダーくらい？

## 2.今後やっていきたいこと
####  Q1.今後何を投稿していく予定なの？
A1.1D-CAE関係のことを投稿していく予定です！

#### Q2.なんでそれを投稿しようと思ったの？
A2.主に2つの目的があります。
    　　①1D-CAEがめっちゃ使えることを色んな人に知ってもらいたい
    　　②自分が作ったを1Dモデルをアウトプットして、スキル向上の場を作りたい

　1個ずつ順番に詳細話しますね！
 ##### 目的①：1D-CAEがめっちゃ使えることを色んな人に知ってもらいたい
 自分の会社では、今1D-CAEが一部の人に使われ始めているんですが、中々広まっていかない…
 多分理由は2つあって、(a)そもそもどれくらい使えるの(Excelで良くね？)ってことと、(b)そんな新しいこと覚えてる時間的余裕ないよ　ってことかなーと。。

 けど1D-CAEの使いどころってめっちゃ広くて、
 ・コンセプト設計で使うと：アイディアを具体化して早めに実現可能な物理構成に落とし込める
 ・詳細設計で使うと：公差による性能影響が簡単に評価できる

いやーこれ使わない手はないんじゃない？って個人的には思うわけですが
実際に使ってみないと、こういう実感を持ってもらえない…

しかもこれ、まともに勉強しようと思って本を読んでみるとすごく言語の学術的な話ばかりで、本読み切ったところで「結局何が嬉しいの？」で止まってしまうわけです


じゃあもうちょっと気軽に知れて、実際に自分でもモデル触って試せる情報源があってもいいんじゃない？ってことで、まずはQiitaで投稿してみようかと思いました。


##### 目的②自分が作ったを1Dモデルをアウトプットして、スキル向上の場を作りたい
こっちは至ってシンプルですね
上のように偉そうなこと言ってますが、正直自分も0から1Dモデル作った経験はほとんどないです…
なので、単純なモデルから作ってこの場で投稿したいなと。
ただ、その投稿をする際には「物理アーキテクチャ」も記事の中に乗せて、この動きを再現するためにはどんな機能が必要だと考えて、具体的にどういう実装をしたのか？という考え方から掲載したいなと思ってます（無理だったらゴメン…）

#### Q3.どれくらいの頻度で投稿する予定？
A3.ものにもよるけど、少なくとも月1では投稿したいな…（結婚してから自分の時間がめっちゃ減ったので、誰か時間の捻出方法を教えてください…）

#### Q4.今後予定している投稿内容は？
A4.まずはOpenModelicaの環境構築方法から掲載して、単純なバネマスモデルからだんだんレベルアップしようかなと。つまり予定は未定！ですが、初心者の方でも読めば分かる！躓かない！を目指したいです！

## 3.最後に
Qiita初めて使ってみたんですけど、結構使いやすそうですね！
ただ初めてなので、不慣れ感はあるかもですが、Qiitaのテクニックもだんだん身に付けていきます！
iPhoneのデベロッパーモードが見当たらない

## 環境
iPhone12
## 現象
設定>プライバシーとセキュリティ>デベロッパーモード
が見つからない

## 対処法
- 何度か繋いだり外したりを繰り返す
- 「信頼する」を押下
=> デベロッパーモードが出現する

## 参考
https://qiita.com/smzn1222/items/20707df7ebce05efd77d
【ChatGPT＋Code Interpreter】で画像にテキストを書き込みます（追加情報）


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

　今回は、画像にテキストを書き込む際の追加情報です。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::

　ニュースはないので、本題です。

　昨日（2024/07/27）の記事では、
　　画像にテキストを載せました。
[【ChatGPT＋Code Interpreter】で画像にテキストを書き込みます。](https://qiita.com/kabumira/items/22d1501db9da458ae7c8)

　今回は、
　　追加情報になります。

　実は、
　　新しくセッションを開いて
　　　実行したら、画像のどこに
　　　　描かれているのか
　　　　　見えない現象が
　　　　　　発生しました。

　描かれてはいるのですが
　　小さくてわからなかったんですね😅

　そう、私はフォントのサイズを
　　指定していませんでした。
　　　ChatGPT任せだと
　　　　ガチャになります😅

　ChatGPTさんに
　　フォントサイズについて
　　　尋ねました。
***
***GPT-4o***
文字列の大きさの選択肢として、一般的なサイズをいくつか挙げます。以下のサイズからお選びください。

1. 小さい (20)
2. 中くらい (40)
3. 大きい (60)
4. 非常に大きい (80)
***

　見えなかったのは
　　おそらく“小さい”だったのでしょう。

　それぞれの大きさを見ると、
　　次の画像のとおりになります。
![modified_image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/416b1721-707d-12fe-ec74-50f58ada2fc2.jpeg)

　意外と小さく感じますね。
***
　ほかにも
　　ボールド（**太字**）とか
　　　イタリック（***斜体***）とかも
　　　　指定できます。
　　　　　指定なしなら、
　　　　　　ふつうですね。

　文字色については
***
***GPT-4o***
フォントカラーは基本的にRGB（赤、緑、青）の3つのカラーチャンネルを使って表現されます。これにより、非常に多くの色を生成することができます。具体的には、各チャンネルが0から255の256段階の明度を持つため、理論上は約1677万色（256 × 256 × 256）の色が存在します。

実際には、以下のように無限に近い多様な色を選択できます：

- **赤（Red）**
- **緑（Green）**
- **青（Blue）**
- **シアン（Cyan）**
- **マゼンタ（Magenta）**
- **黄色（Yellow）**
- **黒（Black）**
- **白（White）**
- **グレー（Gray）**
- **ピンク（Pink）**
- **オレンジ（Orange）**
- **紫（Purple）**
- **茶色（Brown）**
- **その他多くの色**

デジタルデザインやウェブデザインでは、16進数（#RRGGBB形式）やRGB関数（rgb(R, G, B)形式）を用いて具体的な色を指定します。これにより、フォントの色を自由にカスタマイズすることができます。
***
　文字の背景色も
　　同様ですね。

　では、フォントには
　　どんなオプションが
　　　あるのでしょうか。
***
***GPT-4o***
フォントのオプションには、文字の表示スタイルやレイアウトを調整するためのさまざまな設定があります。以下は主要なフォントオプションの一覧とその意味です：

### 1. **フォントファミリー（Font Family）**
   - 特定のフォントを指定します（例：Arial, Times New Roman, Courier New）。

### 2. **フォントサイズ（Font Size）**
   - 文字の大きさを指定します。通常、ポイント（pt）で指定されます（例：12pt, 16pt）。

### 3. **フォントスタイル（Font Style）**
   - 文字のスタイルを指定します。主なスタイルは以下の通りです：
     - **ノーマル（Normal）**：標準の文字スタイル。
     - **イタリック（Italic）**：斜体の文字。
     - **オブリーク（Oblique）**：イタリックに似た斜体だが、傾斜のみを追加したもの。

### 4. **フォントウェイト（Font Weight）**
   - 文字の太さを指定します。数値やキーワードで指定されます（例：400（ノーマル）, 700（ボールド））。
     - **ノーマル（Normal）**：標準の太さ。
     - **ボールド（Bold）**：太字。
     - **ライト（Light）**：細字。

### 5. **フォントバリアント（Font Variant）**
   - 特殊なスタイルを適用します。例えば、スモールキャップス（小文字を大文字のように表示）などがあります。
     - **スモールキャップス（Small Caps）**：小文字を大文字の形にして表示。

### 6. **ラインハイト（Line Height）**
   - 行間の高さを指定します。通常、単位なしの数値やパーセンテージで指定します（例：1.5, 150%）。

### 7. **レタースペーシング（Letter Spacing）**
   - 文字間のスペースを指定します。通常、ピクセル（px）で指定されます（例：2px）。

### 8. **ワードスペーシング（Word Spacing）**
   - 単語間のスペースを指定します。こちらも通常、ピクセル（px）で指定されます（例：5px）。

### 9. **テキストデコレーション（Text Decoration）**
   - 文字に装飾を追加します。主なオプションは以下の通りです：
     - **アンダーライン（Underline）**：下線を引く。
     - **オーバーライン（Overline）**：上線を引く。
     - **ラインスルー（Line-through）**：打ち消し線を引く。

### 10. **テキストトランスフォーム（Text Transform）**
   - 文字の大文字・小文字を変換します。
     - **大文字（Uppercase）**：すべての文字を大文字にする。
     - **小文字（Lowercase）**：すべての文字を小文字にする。
     - **キャピタライズ（Capitalize）**：各単語の最初の文字を大文字にする。

これらのオプションを組み合わせることで、デザインに合わせた文字のスタイルを細かく調整することができます。
***
　ここまで
　　細かく指定することは
　　　そうそうないかと思いますが、
　　　　“そういうのもあったな”と
　　　　　あとからでも
　　　　　　気付ければと思います。

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

　今回は、ここまで。
pod install するとCocoaPods could not find compatible versions for pod "cloud_firestore"となる解消法

## 環境
- Flutter
```
Flutter 3.24.0-0.1.pre • channel beta • https://github.com/flutter/flutter.git
Framework • revision b864805a68 (4 days ago) • 2024-07-23 16:06:18 -0700
Engine • revision d89dd85f25
Tools • Dart 3.5.0 (build 3.5.0-323.1.beta) • DevTools 2.37.0
```
- yml
```yaml
dependencies:
  flutter:
    sdk: flutter
  cloud_firestore: ^5.1.0 # 問題のあるversion
```
- ios(Simulator)
`ios:15`

## エラー全文
```
[!] CocoaPods could not find compatible versions for pod "cloud_firestore":
  In Podfile:
    cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)

Specs satisfying the `cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)` dependency were found, but they required a higher minimum deployment target.
```

### 解消法
```yaml
dependencies:
  flutter:
    sdk: flutter
  cloud_firestore: ^4.17.5 # 変更
```

### 参考
https://qiita.com/uhooi/items/1134b0f784028412cb83
ブラウザ上に表示されたHTMLタグをreact-markdownを利用して消去する

# はじめに
現在Next.js×TypeScriptでアプリを作成中です。
初めてreact-markdownを使用したのでメモします。
# 問題

microCMSから取得したブログのcontentをブラウザ上に表示すると、下記のように**html要素のpタグも一緒に表示されてしまいます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/fb8a00b1-5c1d-bf46-b739-2babb5342e96.png)


# 解決方法

react-markdownを使用して簡単に解決していきます。
**react-markdownとは、Reactコンポーネントの一種で、Markdown文字列を安全にReact要素にレンダリングすることができる**みたいです。

インストールします。
今回は`rehype-raw` というプラグインも併せてインストールしますが、**これがないとHTML要素を認識できないようです。**

```
npm install react-markdown rehype-raw
```

サンプルは下記になります。
```tsx:page.tsx
<div className="text-gray-600">
  <ReactMarkdown rehypePlugins={[rehypeRaw]}>{content}</ReactMarkdown>
</div>
```

pタグの表示が消えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/d56dd85e-3865-c649-0b67-e7ffb644274b.png)


# おわりに
**最初は`dangerouslySetInnerHTML`を使用して解決を試みていたのですが、"Text content does not match server-rendered HTML"（サーバー側とブラウザ側でのレンダリングにずれが発生したときに出るエラー）が出てしまいました。**
あれこれ時間をかけて試行錯誤しましたがpタグが消えることはなく、**react-markdownを使ってみたらすんなり解決**できました。
# 参考

https://chaika.hatenablog.com/entry/2022/12/02/083000

https://github.com/remarkjs/react-markdown
Javascriptでこれ知ってますか？直接idのvalue指定で表示変更？

https://developer.mozilla.org/ja/play
のサイトで偶然下記のようにjavascriptを入力したら
getElementById を使わなくても id 属性で要素を指定できる。
一般的な記述
HTML
```
<textarea name="textarea"  id="city" rows="5" cols="15">ここに何か書いてください</textarea>
```
Javascript
```
const cityx = document.getElementById("city")
cityx.value = "新たなデータ"
```
を
```
city.value = "新たなデータ"
```
だけで表示された！！

参考サイト：
https://mseeeen.msen.jp/elements-can-be-referenced-without-using-getelementbyid/
Radixの使い方　tab編

# radixの使い方　tab編

## radixについて
radix Uiは、ReactやNext.jsで利用できるUIライブラリです。スタイリングは自分で行う方式なので自由度が高く、私的にお気に入りです。
この記事では、理論や技術的な話は置いといて、ざっくり使い方だけ書きます。
※スタイリングは、tailwindを使っています。

## タブ
タブを押すと画面が切り替わる例のやつ。


![タブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611400/1be9080f-0a5e-9a1d-4520-1cd69bed7a8e.png)


コード
```
<Flex justify="center" className="w-60">
    <Tabs.Tabs>
        <Tabs.List>
            <Tabs.Trigger value="tab-A" className="bg-blue-200 mr-4">Tab A</Tabs.Trigger>
            <Tabs.Trigger value="tab-B" className="bg-red-200 mx-4">Tab B</Tabs.Trigger>
            <Tabs.Trigger value="tab-C" className="bg-yellow-200 ml-4">Tab C</Tabs.Trigger>
        </Tabs.List>
    
        <Tabs.Content value="tab-A">
            <div className="bg-blue-200">tab A</div>
        </Tabs.Content>
        <Tabs.Content value="tab-B">
            <div className="bg-red-200">tab B</div>
        </Tabs.Content>
        <Tabs.Content value="tab-C">
            <div className="bg-yellow-200">tab C</div>
        </Tabs.Content>
    </Tabs.Tabs>
</Flex>
```

ポイント
・`<Tabs.Tabs>`タブで全体を囲う
【超爆速】DockerでRails環境構築

Ruby on railsをローカル環境で構築して、学習用に手軽に実行したいときにDockerでの構築手順が面倒だと思いました。
Docked Rails CLIを使うと簡単なコマンドを打つだけで実行環境が構築できてしまうのでとても便利だと思いました。
手順を紹介します。
###  Docked Rails CLI

[docked](https://github.com/rails/docked#docked-rails-cli)

## 手順
このコードは初心者向けにRailsアプリケーションを簡単にセットアップする方法を示しています。以下に簡潔に解説します：

1. ターミナルで以下のコマンドを実行します：
    - Dockerボリュームを作成し、Rubyの依存関係を保存します。
        ```shell
			docker volume create ruby-bundle-cache
        ```
    - `docked`というエイリアス（ショートカット）を作成します。これにより、Dockerコンテナ内でRailsコマンドを簡単に実行できます。
        ```shell
			alias docked='docker run --rm -it -v ${PWD}:/rails -u $(id -u):$(id -g) -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli
        ```
2. 次に、Railsアプリケーションを作成します：
    - `docked rails new {プロジェクト名}`でアプリを作成
	    ```shell
		    docked rails new {プロジェクト名}
		```
    - `cd {プロジェクト名}`で作成したディレクトリに移動
	    ```shell
		    cd {プロジェクト名}
		```
    - `docked rails generate scaffold post title:string body:text`で投稿機能を自動生成
        ```shell
			docked rails generate scaffold post title:string body:text
        ```
    - `docked rails db:migrate`でデータベースを更新
        ```shell
		    docked rails db:migrate
        ```
    - `docked rails server`でサーバーを起動
       ```shell
			docked rails server
        ```
3. これで完了です。ブラウザで`http://localhost:3000/posts`にアクセスすると、作成したRailsアプリケーションが表示されます。

この方法を使うと、複雑な環境設定を行わずに、DockerコンテナでRailsアプリケーションを簡単に作成・実行できます。
🔰Pythonで簡単にファイルパス操作を行う方法

# はじめに
Pythonの標準ライブラリである`pathlib`モジュールを使って、ファイルシステムを効率的に操作する方法について紹介します。

# `pathlib`モジュールの概要
`pathlib`はPython 3.4で導入されたモジュールです。オブジェクト指向のアプローチを使用してファイルパスを扱うことができます。
このモジュールを使用すると、パスの結合や操作、解決が直感的かつ簡単に行えます。
従来の文字列ベースの方法やos.pathモジュールを使うよりも、`pathlib`を使う方がより読みやすく保守しやすいコードを書くことができます。

# 基本的な使い方
まず、`pathlib`モジュールをインポートします：
```python
from pathlib import Path
```
次に、現在の作業ディレクトリのパスを取得します：
```python
current_path = Path.cwd()
print(current_path)
```
これにより、現在の作業ディレクトリのパスが表示されます。

# パスの結合
`pathlib`では、`/`演算子を使ってパスを結合することができます。
```python
new_path = current_path / 'new_directory' / 'file.txt'
print(new_path)
```
これにより、new_directoryフォルダ内のfile.txtというファイルのパスが作成されます。

# ファイルやディレクトリの存在確認
ファイルやディレクトリが存在するかどうかを確認する方法も簡単です
```python
print(new_path.exists())  # True or False
print(new_path.is_file())  # True if it's a file
print(new_path.is_dir())  # True if it's a directory
```

# ファイルの読み書き
ファイルの読み書きも簡単に行えます。
例えば、テキストファイルを読み込む場合
```python
with new_path.open('r') as file:
    content = file.read()
    print(content)
```
ファイルに書き込む場合
```py
with new_path.open('w') as file:
    file.write("Hello, pathlib!")
```

# ディレクトリ内のファイル一覧取得
特定のディレクトリ内のファイルを一覧表示するには、以下のようにします
```py
for item in current_path.iterdir():
    print(item)
```
これにより、現在の作業ディレクトリ内のすべてのファイルとディレクトリが表示されます。

# まとめ
`pathlib`モジュールを使用することで、Pythonでのファイルシステム操作がより直感的かつ強力になります。是非、このモジュールを活用して、日々のファイル操作を効率化してください。
さらに詳しい情報やサンプルコードは、以下のリンクから参照できます

https://github.com/balapriyac/python-basics/blob/main/pathlib-tutorial/main.py

この記事がPythonエンジニアの皆さんのお役に立てば幸いです。
ご意見やご質問がありましたら、ぜひコメント欄でお知らせください！

# 参考文献
https://www.kdnuggets.com/how-to-navigate-the-filesystem-with-pythons-pathlib
【JavaSilver】例外処理

# 例外処理

* コンパイラによってチェックされる例外		
RuntimeExceptionクラスとそのサブクラスを除くExceptionクラスとそのサブクラス	
			
* 検査例外・・・エラーが発生することを想定すべき例外		
			
* メソッドを呼び出した先で「throws Exception」指定された場合、呼び出し元は以下対応が必要	
* 呼び出し処理自体をtryブロックで囲み、catchブロックで例外処理を定義	
・呼び出し元メソッドにthrowsキーワードを指定する	
			
* throwsキーワードを指定しているメソッドをオーバーライドする際のルールは、以下	
・サブクラスで同じthrowsキーワードを使用できる。	
・サブクラスでthrowsキーワード自体省略できる。	
・スーパークラスのthrowsキーワードで指定している例外クラスの「サブクラス例外」をサブクラスのthrowsキーワードを指定できる。
			
* 非検査例外の場合には、throws句で宣言しても、しなくても、
　どちらでも問題ない。		
			
* スーパークラスのメソッドでthrowsを指定してないのにサブクラスで検査例外を指定するとコンパイルエラーになる。	
			
* catchブロック内でreturnされていてもfinallyブロックは必ず実行される。	
* finallyが実行されてから、catchブロック内でreturnが実行される。	
			
* catchとfinallyブロックの両方がreturnで値を戻す場合、finallyブロックの値が返される。	
			
* 戻り値を格納する専用の変数が用意されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846917/99773e51-8776-2f01-193c-5e94c07c7a22.png)



* close処理が先に実行される。
```java:例題
public class Sample implements AutoCloseable {
    @Override 
    public void close() throws Exception {
        System.out.println("C");
    }
}
```
```java:例題
public class Main {			
    public static void main(String[] args) {		
        try (Sample s = new Sample()) {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("A");
        } finally {
            System.out.println("B");
        }
    }
}
```

```:実行結果
「C」「A」「B」
```

* tryブロック内で定義されたローカル変数は、tryブロック内でのみ使用可能。

```java:例題
public class Main {			
    public static void main(String[] args) {		
        String s = "123.45";
        change(s);	
        System.out.println("hello");	
    }

    public static void change (String s) {		
        try {	
                int i = Integer.parseIn(s);
                System.out.println(i);
            } catch(Exception e) {
                // コンパイルエラー
                System.out.println("caught exception : " + i); 	
            }	
    }		
}
```
```:実行結果
コンパイルエラー
```

* 呼び出し元でRuntimeExceptionの例外処理を行っていないため。

```java:例題
import.java.io.IOException;

class Test {			
    public static void main(String[] args) {		
        try {	
                Test.ex();
                System.out.print("Hello");
            } catch(IOException e) {	
                System.out.print(e.getMessage());
            }	
            System.out.print("Java");	
        }
    }
    public static void ex() throws IOException, RuntimeException {
        throw new RuntimeException("Exception");	
    }		
}
```
```:実行結果
コンパイルエラー
```
OctoAIの料金プランと機能：AI開発を加速させる革新的なプラットフォーム

## はじめに

こんにちは！今回は、AI開発の世界に革命をもたらしているOctoAIについて、詳しく解説していきます。OctoAIは、開発者がAIアプリケーションを簡単に構築できるよう設計された強力なプラットフォームです。その料金体系や機能について、わかりやすく説明していきましょう。

## OctoAIとは？

まず、OctoAIについて簡単におさらいしましょう。

OctoAIは、AIアプリケーションの開発と展開を支援する総合的なプラットフォームです。主な特徴として：

1. 効率的なサーバーレスコンピューティング
2. 豊富なオープンソースモデルの選択肢
3. カスタマイズ可能なAI機能
4. 信頼性の高いスケーラビリティ

これらの特徴により、開発者は最先端のAI技術を容易に活用できるのです。

## 無料トライアルで始める

OctoAIの素晴らしいところは、まず無料で試せるという点です。

- 新規登録で**$10の無料クレジット**が付与されます
- このクレジットに有効期限はありません
- 実際の支払いが発生するのは、このクレジットを使い切ってからです

つまり、リスクなしでOctoAIの機能を体験できるのです！

## 主要な製品ラインナップ

OctoAIは、AIアプリケーション開発のための3つの主要製品を提供しています：

1. **テキスト生成ソリューション**：
   - Llama 2、Code Llama、Mistral、Mixtralなど、多様な言語モデルを利用可能
   - 統一されたAPIエンドポイントで簡単に利用可能
   - 独自のチェックポイントも使用可能

2. **メディア生成ソリューション**：
   - Stable Diffusionモデルのカスタマイズ（ファインチューニング）が可能
   - 画像生成や動画生成の速度や品質を損なうことなく、使用量を簡単にスケール

3. **OctoStack**：
   - 任意のクラウドプラットフォーム、VPC、オンプレミスなど、自由な環境でモデルを実行可能
   - データの完全な制御を実現

これらの製品により、開発者は多様なAIアプリケーションを柔軟に構築できるのです。

## テキスト生成ソリューションの料金プラン

OctoAIのテキスト生成ソリューションには、以下の料金プランがあります：

### 1. 無料トライアル
- **$10の無料クレジット**
- プロジェクトの開始に最適

### 2. Proプラン
- 7Bおよび8Bモデルに対して**100万トークンあたり$0.15**
- 405Bモデルに対して**100万トークンあたり入力$3/出力$9**

### 3. エンタープライズプラン
- カスタマイズされた価格設定
- 追加機能あり（後述）

## エンタープライズプランの特別機能

エンタープライズプランでは、以下のような高度な機能が利用可能です：

- 独自のチェックポイントの使用
- GTE Large（大規模言語モデル）の利用
- 独自のファインチューニングモデルの使用
- さまざまなチェックポイントの選択
- 使用量に応じた割引
- パフォーマンス最適化オプション
- 契約ベースのSLA（サービスレベルアグリーメント）
- 専任のカスタマーサクセスマネージャー
- プライベートデプロイメントのオプション

これらの機能により、大規模な企業や高度なニーズを持つ開発者チームに対応しています。

## 新機能：Model Remix Credits

OctoAIは、テキスト生成ソリューションの新機能として「Model Remix Credits」を導入しました。

- 通常のクレジットに加えて、**最大150倍のボーナスクレジット**を提供
- 業界をリードする低価格のトークン単価と組み合わせて使用可能
- 一定の支出または支出のコミットメントが必要

この新機能により、開発者はより多くのテキスト生成を低コストで行えるようになります。

## OctoAIを選ぶ理由

OctoAIには、他のAIプラットフォームと比較して多くの利点があります：

1. **柔軟性**：
   - 多様なモデルから選択可能
   - 信頼性の高いスケーラブルな計算環境

2. **優れたユーザー体験**：
   - 低レイテンシーと高速処理により、アプリケーションのパフォーマンスが向上

3. **コスト削減**：
   - パフォーマンス向上による恩恵を、市場最低水準の推論コストとして還元

4. **無料で始められる**：
   - 新規登録で$10の無料使用枠を提供

これらの特徴により、OctoAIは開発者にとって魅力的な選択肢となっています。

## セキュリティと安全性

OctoAIは、顧客のデータセキュリティとプライバシーを最優先事項としています：

- SOC 2 Type II認証を取得
- 顧客データの適切な取り扱いを保証する内部システムを整備
- 推論の入力、出力、中間計算は保持されない
- すべての接続にTLS暗号化を使用
- ディスクに書き込まれるデータは暗号化

また、OctoAIは顧客データをトレーニング目的で使用することはありません。

## まとめ

OctoAIは、AIアプリケーション開発を democratize（民主化）する強力なプラットフォームです。その特徴をまとめると：

- 無料クレジットで始められる低リスクな導入
- 多様なAIモデルとソリューションの提供
- 柔軟な料金プランと機能
- 高度なセキュリティと安全性

AI開発に興味がある方、より効率的にAIアプリケーションを構築したい方は、ぜひOctoAIを試してみてください。革新的なAIの世界があなたを待っています！

## よくある質問（FAQ）

最後に、OctoAIに関するよくある質問とその回答をいくつか紹介します：

1. **Q: テキスト生成ソリューションのレート制限はありますか？**
   A: 具体的な制限については、OctoAIのサポートチームにお問い合わせください。

2. **Q: 入力トークンと出力トークンとは何ですか？**
   A: 入力トークンはAIモデルに与えるテキスト、出力トークンはモデルが生成するテキストを指します。詳細な説明が必要な場合は、OctoAIのドキュメントをご確認ください。

3. **Q: RAG（Retrieval-Augmented Generation）はどのように実装されていますか？**
   A: RAGの具体的な実装方法については、OctoAIの技術文書をご参照いただくか、サポートチームにお問い合わせください。

4. **Q: プロンプトを事前に定義することは可能ですか？**
   A: はい、可能です。具体的な方法については、OctoAIのAPIドキュメントをご確認ください。

これらの質問以外にも疑問がある場合は、OctoAIのサポートチームに気軽にお問い合わせください。彼らは丁寧にサポートしてくれるはずです。

以上で、OctoAIの料金プランと機能についての詳細な解説を終わります。AIの力を最大限に活用し、革新的なアプリケーションを開発する旅に、OctoAIが強力な味方となることを願っています。頑張ってください！
【未経験】入社して３ヶ月経過してみて入社までにしておくべきだったと感じたこと

## はじめに
4月中旬に未経験から受託開発企業に入社して3ヶ月が経過した中で、入社までにしっかりと理解しておけばよかったと感じた知識についての備忘録になります。

## 入社までの私の学習状態について
学習期間は中断している期間も含めるとだいたい2年ぐらいで、主にPythonを中心に学習していました。フレームワークはDjangoとFlaskを使用した経験があり、それぞれでログイン機能付きのTODOアプリなどのフレームワークの理解に役立つ簡易的なアプリを2~3個を作成しています。フロントに関してはHTML５＋Bootstrapをメインに扱っており、javascriptは必要最低限使用する状態にしていました。ポートフォリオはDjangoを使用して過疎地域での高齢一人暮らし世帯の見守り負担軽減を目的としたLINEのようなメッセージアプリを作成しました（＊現在使用を停止しています）。ボットで定期的にメッセージを送信し、一定期間手動の既読ボタンがクリックされなければ管理者側に通知がいくといったものです。


## 入社後の状態
ありがたいことに未経験入社ということで約２ヶ月トレーニング期間を設けていただいきました。その中で実際にの業務に必要な設計書の作成方法や業務フロー、Laravelで作成したアプリケーションへの機能追加から納品までの流れを学ぶことができました。前置きが長くなりましたが、次からちゃんと習得しておくべきだったなと思った知識について記載していきます。

## 習得しておくべきだった知識
### フロントエンド
- Javascriptの基礎
バックエンドに偏った学習をしてきたため現場レベルで使用されているコードを理解するのにとても苦労しました。
また、コードが理解できて追加機能のアルゴリズムを考えてもそれをコードにするためにいちいち関数などを調べないといけなかったため莫大な時間がかかりました。

- JavascriptからjQueryへのコードの変換方法
プロジェクトにもよると思いますが処理速度や拡張性を考えるとjQueryの方が便利なので（入社するまで気がつきませんでした）、どちらにも対応できるようにしておいて損はないかなと思います。

- HTMLやCSSフレームワークの基礎文法
これまで思い通りの配置や配色の変更などができなかった時は、ある程度力技でゴリ推し（記事の情報をそのまま引用するなど）することで解決していたのですが、それが通じるのも未経験の個人開発レベルなのでしっかり学習しておくべきだったと反省しました。

### バックエンド
- MVCフレームワーク
こちらも基本的なことなのですがプロジェクトに参画したての時はどれがどれだかわからなくなり少し混乱してしまったので使用するフレームワークでMVCとは何か、それぞれ機能のどのファイルにどのように定義されることが多いかを掴んでおくことはキャッチアップをするうえで大切だなと感じました。

- MVCフレームワークを使ったDBの操作方法
自分が最近まで混乱していた内容なのですが、DBとのやりとりをどの階層のどのファイルで実行しているのかがわからず理解に時間がかかりました。トレーニングではある程度の処理をservide.phpファイルを経由してまとめてDBとやりとりをしていたのですが、参画したプロジェクトだと機能ごとにLogic.phpファイルを作成して対応していたのでその違いがなかな理解できずに苦しみました。処理の方法はいろいろあるよというだけのことなのですが駆け出しレベルだと混乱することもあると思うので、処理方法には種類があるということとどういうパターンがあるのかということを知っておいて損はないと思いました。

- アルゴリズムの組み方
メンターさんと話をしていてpaizaのCランク程度の能力があれば、プロジェクトでアルゴリズムを作成する際に大きくつまづくことはないということだったので絶賛勉強中です。まだ正答率は30%程度なので、、、

### その他
- URLが入力されてからブラウザに表示されるまでの流れ
個人的にはこれがもっとも大切かなと思います。自分が使用するフレームワークを当てはめてURLを入力してからブラウザに表示されるまでの流れを第三者に理解してもらえるように説明できればエラーが発生した際の対応もスムーズになります。とくに環境構築段階では必須だと思うのでしっかり理解する必要があります。

　　以下の記事がとても参考になりました。
　　https://qiita.com/app_js/items/449a9cf79ed68b795643

- session管理について
セッションの概要は理解していたのですが、それを機能に組み込む際に苦労しました。例えば、入力フォームで入力した内容を確認画面で表示する際や確認画面から入力フォームに戻る際の入力した内容の保持の部分です。DBにPOSTしてない内容の扱い方については必須になってくるので勉強して実装してみると役に立ちます。

- git
リポジトリへの変更内容の反映や最新の状態にリポジトリを更新する際のコマンドや構造は理解できていると思いますが、不具合が発生した際の対処の仕方は種類があるのでいくつか押さえておくべきかと思います。具体的なコマンドでいうとgit stashやreset,あとはログの確認コマンドを知ると良いかと。

## 終わりに
まだまだ修行中の身のため日々壁にぶち当たっていますが、得に最初のほうは当たる壁が少ないほうが良いだろうという気持ちで共有させてもらいました。読んでいただいた中で自分はこういうことに気をつけているや私のような駆け出しエンジニア向けて今後こうした方が良いよというアドバイスがありましたらコメントをいただけると幸いです。
Python3: お菓子の詰め合わせ (paizaランク A 相当)やってみた

おもしろそうなのでやってみました。

https://paiza.jp/works/mondai/a_rank_skillcheck_archive/school_hiking

```py:
from itertools import combinations

length_from = (
    lambda N: lambda amount: lambda sorteds:
        next(
            length
            for length in range(N, 0, -1)
            if sum(sorteds[:length]) <= amount
            )
    )

remain_from = (
    lambda length: lambda amount: lambda sorteds:
        min(
            diff
            for c in combinations(sorteds, length)
            if (diff := amount - sum(c)) >= 0
            )
    )

N, AMOUNT = map(int, input().split())
XS = [int(input()) for _ in range(N)]

sorteds = sorted(XS)
length = length_from(N)(AMOUNT)(sorteds)
remain = remain_from(length)(AMOUNT)(sorteds)

print(remain)
```
ソートして小さい方からの部分和を考えると、いくつ買えるかがわかります。あとはその個数の組み合わせで一番残金の少ないのを探せばよい。
ソートと部分的な組み合わせの合わせ技で、特に個数の多いときの計算量はだいぶ減ってると思います。
paizaの問題をPowerShellで解いてみた 【mod7占い (paizaランク S 相当)】


この記事はpaizaのプログラミング問題をPowerShellで解いてみようという試みの記事です。

## paizaのプログラミング問題とは？
ブラウザ上でコードを書いて実行できる、無料プログラミング練習問題集です。

- 難易度別に問題を選ぶ
- 問題文を読んで、解答コードを書く
- 提出するとテストケースが実行されて結果をわかる
- 正解・不正解だけではなく、解答コード例や解説も見ることができるので、プログラミングの習得から復習まで活用できます
### こんな人におすすめ
- プログラミングスキルの腕試しをしたい方
- プログラミングのスキルアップしたい方
- 新しい言語にチャレンジをしたい方
- 通常は問題をc言語やJavaなどで解くのですがPowerShellで解いてみます。

## 問題
mod7占い (paizaランク S 相当)

https://paiza.jp/works/mondai/s_rank_skillcheck_sample/mod7


あなたは今、「mod7占い」というサービスを始めようと考えています。

mod7占いとは、整数が書かれた複数のカードの中から3枚を選び、そこに書かれた整数の和が7で割り切れるかどうかで運勢を決めようというものです。 カードは必ず異なる3枚を選ぶ必要があり、全てのカードには全て異なる数字が書かれています。

占いというからには、7で割り切れる組み合わせはそれなりに少なくする必要があります。 そこで、適当な複数のカードに対して、カードに書かれた3つの整数を足した和が7で割り切れるような組合せがいくつあるかを計算するプログラムを作成してください。

### 入力
入力は以下のフォーマットで与えられます。

N
a_1
a_2
...
a_N

N は与えられるカードの枚数を表します。
a_i (1 ≦ i ≦ N) はi 枚目のカードに書かれた整数であり、改行区切りでN 個与えられます。

## 解き方
- カードを7で割った余りで分類します
- 各要素が0 ~ 6からなる 3つ組 (a, b, c) であって、足すと和が7で割り切れるようなものを求めます
- それぞれの3つ組に対して、7で割った余りが (a, b, c) となるようにカードを3枚選ぶ方法が何通りあるかを求めます。それらを足し合わせたものが答えです

## コード


~~~

#件数の入力
$n=[int](read-host)

#カードの整数の分類
$a=@()
(0..7) | %{$a+=0}
for($i=0;$i -lt $n;$i++){
    $num = [int](read-host)
    $a[$num%7]+=1
}

#組み合わせの列挙
[int[][]]$mod7_combinations = @()
[int[]]$mod7_combination = @()
for($i =0;$i -lt 7;$i++) {
    for($j =$i;$j -lt 7;$j++) {
        for($k =$j;$k -lt 7;$k++) {
            if((($i + $j + $k) % 7) -eq 0){
                $mod7_combination=($i, $j, $k)
                $mod7_combinations+=,@($mod7_combination)
                #write-host $mod7_combination
            }
        }
    }
}

function wari($moto,$waru){
    $cnt=0
    while($moto -ge $waru){
        $moto= $moto - $waru
        $cnt+=1
    }
    return $cnt
}

$ans = 0
foreach($ijk in $mod7_combinations) {
    $i=[int]$ijk[0]
    $j=[int]$ijk[1]
    $k=[int]$ijk[2]
    if($i -eq $j -and $j -eq $k){
        $ans += $a[$i] * $($a[$i] - 1) * $(wari ($a[$i] - 2)  6)
    } elseif($i -eq $j){
        $ans += $a[$i] * $($a[$i] - 1) * $(wari $a[$k] 2)
    } elseif($j -eq $k){
        $ans += $a[$i] * $($a[$j]) * $(wari ($a[$j] - 1) 2)
    } elseif($k -eq $i){
        $ans += $($a[$k] - 1) * $a[$j] * $(wari $a[$k] 2)
    } else {
        $ans += $a[$i] * $a[$j] * $a[$k]
    } 
}

write-host $ans

~~~

Sランクの問題はムズイです。
問題の意味がちょっと、何それ？意味あるの？みたいな。
それが競技プログラミングなんでしょうけど


## 終わりに
noteにPowerShellのサンプルコードの記事を書いています。そっちも見てね
[PowerShellまとめ](https://note.com/mahalo_/m/m421b17a881c8)

https://note.com/mahalo_/m/m421b17a881c8
paizaプログラミング問題をやってみた：Dランク

## はじめに

少し前から自己研鑽のためにLeetCodeという競技プログラミングの問題を解いています。
paiza×Qiita記事投稿キャンペーンを機にpaizaの問題を解いていこうと思い、コードを公開します。

まずはDランクの問題です。
言語はJavaScript（TypeScriptがなかった...）を選択しています。

## 文字の一致

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  if(lines[0] === lines[1]){
      console.log("OK");
  } else {
      console.log("NG");
  }
});
```

## 一番小さい値

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  console.log(`${Math.min(...lines)}`);
});
```

## 足し算

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const numbers = lines[0].split(" ");
  console.log(Number(numbers[0]) + Number(numbers[1]));
});
```

## Eメールアドレス

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  console.log(`${lines[0]}@${lines[1]}`);
});
```

## N倍の文字列

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  let output = '';
  for(let i=0; i<Number(lines[0]); i++){
    output += '*';
  }
  console.log(output);
});
```

## 最後に

Dランクは基本的な問題でした。
初めてのプログラミングや言語の場合は、Dランクから始めるのが良いかなと感じました。
reduceって？

## Reduceって？
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)には、下記のような説明が記載されています。
> Arrayインターフェイスのメソッドで、配列のそれぞれの要素に対して、ユーザーが提供した「縮小」コールバック関数を呼び出します。

配列の各要素に対して、処理を実行するメソッドですかね。

使い方は、
``` js
const arr = [1, 2, 4];
const res = arr.reduce((acc, curr) => acc + curr, 0);
console.log(res); // 7
```
上記のように。

### 構文
``` js
配列.reduce(コールバック関数, 初期値)
```
- コールバック関数：配列のそれぞれの要素に対して、呼び出す関数
- 初期値（省略可）

コールバック関数内の引数
- accumlator：前回のコールバック関数の戻り値
- currentValue：現在の要素値
- currentIndex：現在の位置
- array：reduceが呼び出された配列
の4つがある。

``` js
const arr = [1, 2, 4];
const res = arr.reduce((accumlator, currentValue, currentIndex, array) => {
  console.log(
    `accumlator :${accumlator}\t
    currentValue: ${currentValue}\t
    currentIndex：${currentIndex}\t
    array：${array}`
  );
  return accumlator;
}, 0);

// accumlator :0    currentValue: 1         currentIndex：0         array：1,2,4
// accumlator :0    currentValue: 2         currentIndex：1         array：1,2,4
// accumlator :0    currentValue: 4         currentIndex：2         array：1,2,4
``` 
### その他使用例
偶数だけを足す
``` js
const arr = [1, 2, 4];
const res = arr.reduce((acc, curr) => {
  if (curr % 2 == 0) {
    return acc + curr;
  } else {
    return acc + 0;
  }
}, 0);

console.log(res); // 6
```
コールバック関数には、無名関数でなくてもよい。
``` js
const arr = [1, 2, 10, 4];
const res = arr.reduce((acc, curr) => getBigNumber(acc, curr), 0);

function getBigNumber(acc, curr) {
  if (acc > curr) {
    return acc;
  } else {
    return curr;
  }
}

console.log(res); // 10
```
戻り値は、数値でなくてもよい。
``` js
const arr = [1, 2, 10, 4];
const res = arr.reduce((acc, curr) => {
  return [...acc, curr * 2];
}, []);

console.log(res); // [ 2, 4, 20, 8 ]
```
など、使いこなせると便利になりそう。
leetcodeの解答例でも、使用しているものを時々見かける。
leetcodeの問題などでreduceを使用して、使いこなせるようになりたいですね。

とはいえ、少し読みにくいコードになってしまう。
ほかの単純な実装方法があるならば、そちらを使用し、なければreduceを使用するくらいの感覚が良いのかも。

最後のコードは、mapで実装したほうが簡潔に書ける。
ABC364回答メモ

# 0.はじめに
　レート下降に歯止めかけるべく臨みましたが
　B問題にすらてこずり、Cまでしか回答できませんでした・・・。
　レートは-17の726と去年末レベルに下がっていきました。


# 1.A - Glutton Takahashi
　食べきれば最後気持ち悪くてもOKという刹那的問題。
　味を順にみていく中で、甘いが2つ続いた判定を
　味を見る前に行う事で、甘いが2つ続いた後に
　何かを食べた場合だけをNoにすることでACとなりました。

　https://atcoder.jp/contests/abc364/submissions/56002803


# 2.B - Grid Walk
　座標のｘｙがこんがらがる問題。
　地味に、iが縦、jが横というところがこんがらがる原因でした。
　素直に言われた通りの判定をするだけでACとなりましたが
　”iが縦、jが横”の罠にはまりWA1回と
　その後直して提出した際に、確認用プリント文を消し忘れて
　WA1回と、無駄に10分ロスしてしまいました。

　https://atcoder.jp/contests/abc364/submissions/56026663


# 3.C - Minimum Glutton
　Bよりもよっぽど簡単な問題でした。
　【考え方】
　　・リストAとBを降順でソート
　　・変数sumAとsumBを定義し0で初期化
　　・リストAとBをアドレスiで順に読んでいき、それぞれの値をsumAとsumBに加算
　　・sumAがXを超える、またはsumBがYを超えた時、それ以上食べられない事となる為
　　　iに1を足した値を出力して終了。
　　・sumAがXを超えず、sumBもYを超えない時、Nを出力して終了

　https://atcoder.jp/contests/abc364/submissions/56029986


以上
yukicoder No.47 ポケットを叩くとビスケットが２倍　解説

[問題文](https://yukicoder.me/problems/no/47)
# 解説
まず、仮に$N=5$だった時を考える。
すると、答えは1→2→4→5となるだろう。
また、$N=19$だった時を考える。
すると、答えは1→2→4→8→16→19
まず、これを見て**クッキーは全部2倍にすると最適になる**とわかるだろう。
そして、No.46同様**追い越しても作り出した分に関しては考えなくて大丈夫なシステム**。よってあり得る答えをどんどん2倍してNより大きいかの判定をすればOK。
一応実行時間を計算すると$O(logN)$。当然余裕。
解説では、書きやすさのため左シフト演算というものを使っている。
$x<<y$とかくと、$x*2^y$という意味になる。
よって$x$を1にすれば$2^y$が計算できるというわけだ。
# C++での解答例

```c++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n;cin>>n;
  for(int i=0;;i++)
    if((1<<i)>=n){
      cout<<i<<endl;
      return 0;
    }
}
```
Python3:村人の友好関係 (paizaランク S 相当)やってみた。

おもしろそうなのでやってみました。

https://paiza.jp/works/mondai/s_rank_skillcheck_archive/group_popularity

```py:
N, M, Q = map(int, input().split())

relations = [tuple(map(int, input().split()))
         for _ in range(M)
         ]

relations.sort(key=lambda x: x[2], reverse=True)

states = [False] * (N + 1)
for _ in range(Q):
    state, member = (
        lambda op, m: (True if op == "+" else False, int(m))
        )( *input().split() )
    
    states[member] = state
    
    print(
        next(
            (f for a, b, f in relations
             if states[a] != states[b]
             )
            , 0
            )
        )
```

まず、ふたりの関係性を読み込んで、友好度の大きい順にソートします。
入会状態をログで更新し、片方が入会していてもう片方が入会してない関係性で最初にでてきたものを人気として出力します。
Javaで「try文」の動作を確認してみた

# 概要

Javaで「try文」の動作を確認してみました。
以下のページを参考にしました。

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

# 実装

以下のファイルを作成しました。
```JSample2_1.java
class JSample2_1{
  public static void main(String args[]){
    int n[] = {18, 29, 36};

    System.out.println("開始します");

    try{
      for (int i = 0; i < 4; i++){
        System.out.println(n[i]);
      }
    }
    catch(ArrayIndexOutOfBoundsException e){
      System.out.println("配列の範囲を超えています");
    }

    System.out.println("終了しました");
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample2_1.java 
$ java JSample2_1 
開始します
18
29
36
配列の範囲を超えています
終了しました
```

# まとめ

何かの役に立てばと。