OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアの市場価値を高めるためのキャリアビジョンと自己研鑽

タイトル: エンジニアの市場価値を高めるためのキャリアビジョンと自己研鑽

エンジニアの職種は常に進化し続け、新たな技術が次々と現れます。「キャリアビジョンを明確にし、エンジニアの市場価値を高めるためには自己研鑽が必要」とよく言われます。しかし、「給料増えなくても、今困っていないし、仕事は楽だから別に興味がない」と考える人もいます。そこで、私たちはエンジニアの年収と実質賃金の現状を見て、自己研鑽の必要性について考えてみましょう。

### エンジニアの年収の現状

エンジニアの年収の格差を見てみましょう。[リクナビNEXTの調査](https://next.rikunabi.com/tech/docs/ct_s03600.jsp?p=002284)によれば、20代から自己研鑽を続けてきたエンジニアの年収は上がる傾向にあります。一方、自己研鑽をしてこなかったエンジニアの年収は下がる傾向にあります。

### 実質賃金の現状

次に消費者物価と賃金の現状を見てみましょう。[東洋経済の調査](https://toyokeizai.net/articles/-/199373?page=2)によれば、名目賃金は上がっていますが、実質賃金は下がっている傾向にあります。これは、給与の上がり方よりも物価の上がり方が大きいということを意味します。

### 自己研鑽の重要性

これらの情報を踏まえると、自己研鑽をせずに現状維持を目指すと、事実上の給料が下がってしまい、現在の生活水準を満たすことが困難になる可能性があります。

では、何をすればよいのでしょうか？

1. **キャリアビジョンを明確にしましょう。** あなたのやりたいこと、なりたいエンジニアのイメージを持つことが大切です。そのためにも、一年後、三年後、五年後の自分をイメージしましょう。自分のやりたいことが見

専門家がいたそうです。しかし、今ではPowerPointでグラフを簡単に作成でき、そのスキルがなくても困ることはありません。同じように、現在のエンジニアのスキルも時代と共に変化し、昔必要だったスキルが不要になる可能性があります。その変化に対応できるように自己研鑽は欠かせません。

**③　自己研鑽の目標設定をしましょう。**

キャリアビジョンを明確にしたら、次に必要なスキルや知識を得るための目標を設定しましょう。これは長期的なものでも良いですし、短期的なものでも良いです。大事なのはその目標に向かって行動を始めることです。

例えば、「データサイエンティストになる」という長期目標があるなら、まずは「Pythonの基本的なコーディングができるようになる」や「統計学の基本を理解する」などの短期目標を設定すると良いでしょう。

また、自己研鑽のために使える時間やリソースも考えてみましょう。自分一人で学ぶだけでなく、セミナーや研修に参加することで新たな視点を得ることも可能です。

## 自分自身の成長のために行動しましょう

自己研鑽は自分自身の成長のために重要な行動です。常に新しいスキルを習得し、知識を深めることで、エンジニアとしての市場価値を高め、より良いキャリアを歩むことができます。

私たちは自分の成長に時間を投資し、努力を重ねることで自分自身の価値を上げていくことができます。そのためには、自分自身のキャリアビジョンを明確にし、そのための自己研鑽を積極的に行うことが重要です。

最後に、皆さんがこれを読んで何か一つでも新たな視点や思考のきっかけを得られれば幸いです。どの道を選んでも、その先には必ず新たなチャンスと経験が待っています。

**あなたのキャリアビジョンを考え、そしてそれに向けての自己研鑽を始めましょう。**

**④　ネットワーキングを活用しましょう。**

ネットワーキングは新たな情報を得たり、異なる視点を知ったり、自分が興味を持っている分野の専門家から直接学ぶための重要な手段です。ネットワーキングによって得られる情報や知識は、自己研鑽の一部となり、更なる成長を助けます。

また、強力なネットワークは将来的に新しい機会をもたらす可能性もあります。例えば、仕事の紹介や新たなプロジェクトへの参加などです。

**⑤　失敗を恐れずに挑戦しましょう。**

新しいことを学ぶとき、失敗を恐れて挑戦しないでいると、自己研鑽の機会を逃すことになります。失敗は学習の一部であり、それを通じて得られる経験と知識は貴重です。

失敗を恐れずに挑戦することで、自分がどの程度理解しているのか、どの部分を改善すべきかが明確になります。その経験は自己研鑽を深め、更なるスキルの向上につながります。

**終わりに**

エンジニアのキャリアを積み重ねていく上で、自己研鑽は欠かせない要素です。技術の進化は日進月歩であり、時代の変化に適応し続けるためには、常に新しい知識とスキルを追求する必要があります。

自分自身のキャリアビジョンを明確にし、それに向けての自己研鑽を始めること。ネットワーキングを活用し、多様な視点と情報を吸収すること。そして、新たな挑戦を恐れず、学び続けること。

これらはすべて、自分自身のエンジニアとしての価値を高め、自分のキャリアを充実させるための重要な要素です。この機会に、自己研鑽の重要性を再確認し、新たな一歩を踏み出してみてください。
robloxでassistant その154

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

# 練習問題
PhysicsServiceを使え。

# サンプルコード

```

local ball = Instance.new("Part", workspace)
ball.CFrame = CFrame.new(0, 10, -3)
local door = Instance.new("Part", workspace)
door.CFrame = CFrame.new(0, 10, 0)

local PhysicsService = game:GetService("PhysicsService")
local collisionGroupBall = "CollisionGroupBall"
local collisionGroupDoor = "CollisionGroupDoor"
PhysicsService:RegisterCollisionGroup(collisionGroupBall)
PhysicsService:RegisterCollisionGroup(collisionGroupDoor)
ball.CollisionGroup = collisionGroupBall
door.CollisionGroup = collisionGroupDoor
PhysicsService:CollisionGroupSetCollidable(collisionGroupBall, collisionGroupDoor, false)
print(PhysicsService:CollisionGroupsAreCollidable(collisionGroupBall, collisionGroupDoor)) 

```

以上。
PythonとFlaskで作る姓名判断アプリ: 名前で運勢を占うシンプルなウェブアプリ


## はじめに

名前で運勢を占う姓名判断は、古くから親しまれている占いの一つです。今回は、Pythonの軽量ウェブフレームワークFlaskを使って、簡単な姓名判断アプリを作成する方法を紹介します。HTMLフォームから入力された名前を基に、運勢を計算し、結果を表示するシンプルなアプリです。

## 準備

このアプリを作成するには、PythonとFlaskライブラリが必要です。以下のコマンドでFlaskをインストールしましょう。

```bash
pip install Flask
```

## プログラムの構成

このアプリは、3つのファイルから構成されています。

1. **`app.py`** - PythonのFlaskアプリケーション
2. **`index.html`** - 名前を入力するためのHTMLフォーム
3. **`result.html`** - 占い結果を表示するHTMLテンプレート

### 1. Pythonスクリプト (`app.py`)

以下がアプリケーションの主要な部分です。Flaskを使ってサーバーを立ち上げ、名前の入力と運勢の計算を行います。

```python
from flask import Flask, render_template, request

app = Flask(__name__)

# 名前の運勢を簡易的に計算する関数
def calculate_fortune(name):
    name_value = sum(ord(char) for char in name)
    fortune_score = name_value % 5
    fortunes = ["大吉", "中吉", "小吉", "末吉", "凶"]
    return fortunes[fortune_score]

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/result', methods=['POST'])
def result():
    first_name = request.form['first_name']
    last_name = request.form['last_name']
    full_name = last_name + first_name
    fortune = calculate_fortune(full_name)
    return render_template('result.html', full_name=full_name, fortune=fortune)

if __name__ == '__main__':
    app.run(debug=True)
```

#### コードの説明

- **`calculate_fortune`関数**:
  - 入力された名前の各文字をUnicodeコードポイントに変換し、その合計値を計算します。
  - 合計値を5で割った余りを使って運勢を決定します。運勢は「大吉」「中吉」「小吉」「末吉」「凶」の5段階です。

- **`index`関数**:
  - 名前を入力するためのHTMLフォームを表示します。

- **`result`関数**:
  - フォームから送信された名前を受け取り、運勢を計算して結果を表示します。

### 2. HTMLテンプレート (`index.html`)

ユーザーが名前を入力するためのフォームを提供します。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>姓名判断アプリ</title>
</head>
<body>
    <h1>姓名判断アプリ</h1>
    <form action="/result" method="POST">
        <label for="last_name">姓:</label>
        <input type="text" id="last_name" name="last_name" required><br><br>
        <label for="first_name">名:</label>
        <input type="text" id="first_name" name="first_name" required><br><br>
        <input type="submit" value="占う">
    </form>
</body>
</html>
```

### 3. 結果表示用HTMLテンプレート (`result.html`)

計算結果を表示するためのテンプレートです。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>姓名判断結果</title>
</head>
<body>
    <h1>姓名判断結果</h1>
    <p>{{ full_name }}さんの運勢は <strong>{{ fortune }}</strong> です。</p>
    <a href="/">戻る</a>
</body>
</html>
```

## 実行方法

1. 上記のコードをそれぞれ `app.py`、`index.html`、`result.html` という名前で保存します。
2. ターミナルで以下のコマンドを実行して、Flaskアプリケーションを起動します。

    ```bash
    python app.py
    ```

3. ブラウザで `http://127.0.0.1:5000/` にアクセスすると、姓名判断アプリが表示されます。


## 画面表示
![スクリーンショット 2024-08-02 18.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75802/0f0681e9-c711-5259-211b-37e620d16b96.png)
![スクリーンショット 2024-08-02 18.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75802/9f6d63d9-3a0a-133b-b836-fe0f7f529c01.png)
凶かい笑


## まとめ

このシンプルな姓名判断アプリは、PythonとFlaskの基本的な使い方を学ぶ良い練習になります。運勢の計算ロジックは非常に簡単ですが、これをベースにさらに複雑なロジックや機能を追加することで、自分だけの占いアプリを作成することもできます。興味がある方は、ぜひ試してみてください！

---

この記事が役に立ったと思ったら、ぜひ「いいね」や「シェア」をお願いします。質問やコメントがあれば、お気軽にどうぞ！
無料AIサイトいろいろ紹介

りょうです。
今回は無料AIサイトの紹介です。
ではれっつごー

## AI系サイトまとめ
**ChatGPT** [gpt-3.5、gpt-4o] 
https://chatgpt.com
`4-oは会話数制限有り`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/d062fdc4-e3cb-0340-aba2-7e70edac1f7e.png)

**Gemini** 
https://geminiai.com
`制限なし`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/4e6873c1-289c-6d9c-5747-1bb9b4438773.png)

**Aitianhu** [gpt-3.5 turbo]
https://8531w8.aitianhu1.top
https://16oehs.aitianhu.com
https://3q5y0z.aitianhu.com
https://cu8yrb.aitianhu.com
https://8iaysj.aitianhu.com
https://dc0hbm.aitianhu1.top
https://69dikd.aitianhu.com
https://9rtggt.aitianhu.com
https://q2ifoz.aitianhu.com
https://1d5ij0.aitianhu.com
https://rxyulr.aitianhu.com
https://ggt620.aitianhu.com
https://s3b0bl.aitianhu.com
https://zz9uud.aitianhu.com
https://8x0mso.aitianhu.com
https://x462o2.aitianhu.com
https://x0ajza.aitianhu.com
https://bcqd7g.aitianhu.com
https://2jg8fe.aitianhu.com
https://pbpndw.aitianhu.com
https://ai.minihuo.com
`会話制限なし`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/ec2dba61-285e-6606-7f38-cca16a6cd51a.png)

**GPT JP** [GPT-4]
https://chatgptjapan.org
https://chatgpt.org
`会話数制限有り`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/970c65bf-a060-462f-5212-f1d179f4b35a.png)

**PentestGPT** [GPT-3.5, GPT-4]
https://chat.hackerai.co/ja
`会話数制限有り。2時間でリセット`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/d3aaf57a-82e7-a7e5-0aef-06b3e79510a2.png)

**Coze** [GPT-4, GPT-4o]
https://coze.xyz
`会話数制限有り。有料版で簡単にbotへのAI実装が可能`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/3e7e78ba-2c4d-0a34-2d60-1ff6d4b1f0b2.png)

## その他
**FREEGPT** [GPT-3.5]
https://zb.aifree.site
https://chat9.free2gpt.xyz

**EndlessChat**
https://she1.frechat.xyz

**その他**
https://lite.icoding.ink 
https://chat.ai365vip.com
https://myai.asia 
https://ai.myym.fun
https://share.wendabao.net
https://free.netfly.top
https://origin.eqing.tech
https://www.yeschat.ai/zh-CN/gpt-4o
https://aitopk.com
https://chat.icoding.ink/pc-chat/#/questions
https://chat.tinycms.xyz:3002
https://chatnio.liujiarong.top
https://www.promptboom.com
https://chatgptfree.ai
https://tudouai.chat/chat
https://robot.liujiarong.me
https://robot.liujiarong.top
https://free.icoding.ink/index2.html

## まとめ
AI系サイトの紹介でした。もっとあるんですけど多いので一部だけです。
基本的にすべてGPT3.5や4ですが、たまにGPT-4oが使えるものがあります。
AIの出力したものをすべて信用はせず、適切に扱っていけるといいですね

**Discordに湧く荒らしの情報や対策方法の共有をしている自鯖↓**
https://discord.gg/ESRGwGQhxc
ChatGPTを使って逆ポーランド記法のFORTH処理系をC#で作ってみた

　芝村裕吏さんの[『関数電卓がすごい』](https://amzn.asia/d/0i4L1IeU)を読んでいたら、FORTHを無性に触りたくなってしまった。
　その昔、マイコン（現パソコン）で遊んでいた私はBASICに飽きてきて、もっと別の言語が触りたくなっていました。1981年にソフトバンク社が「ソフトウェアの流通革命」を起こすまでは、ソフトといえば、当時の数少ないマイコンショップにカセットテープに入れられたプログラムが数種類置いてあるだけでした。
　当時の月刊ASCIIに、Tiny Pascal などの小規模の言語が発表されていました。その中で特に注目したのが、FORTHでした。非常にコンパクトな言語で、カセットテープで購入することもできたと思いますが、雑誌からマイコンへの入力した気がします。
　手に入る情報は少ない時代でしたが、FORTH処理系を自分でいろいろ触って楽しみました。

　現代はネットで様々な情報をすぐに手に入れることができるようになりましたが、FORTHに関する情報は非常に少ないです。ですから、これから作るものは、わずかな資料と記憶を頼りに作っていきます。確か、実家にFORTHの入門書が1冊あったと思うので、そのうち取りに行きたいと思っています。

# 自作FORTHは何がうれしいのか
　今回、最初にやりたかったのは、三角関数や指数関数を使った電卓的な計算です。逆ポーランドという、ちょっと変わった計算方法ですが、慣れれば電卓のボタンポチポチするより、キーボードでササッと書いてポンと計算できたりします。
　その他に、コマンドをC#レベルで書いて拡張していけば、コマンドを打ち込むだけでちょいと複雑な処理ができます。FORTH上でコマンドを組み合わせて処理することもできるので、ちょっとしたRPAができちゃうわけです。

# 基本形の作成
　１からアプリ作るのはとても大変です。処理の分け方とか、変数の使い方とか、とりあえず動くまでが苦行になります。なので、そこはサクッとChatGPTに丸投げしてみます。

 >c#でforth処理系を作成

　と送信してやれば、以下のような構成でコードを作成してくれました。

### プロジェクト構成
- Stack: 数字以外の型も保存可能なスタック
- Interpreter: Forthのコマンドを解釈して実行する
- Compiler: Forthのソースコードをコンパイルする
- Basic Words: Forthの基本的なワード（コマンド）
 
 それをコピペすると、たぶん一応動くものが出来上がります。

 エラーが表示される場合は、その内容をChatGPTに伝えると、修正してくれることもあります。

# バージョンアップ
　ChatGPTが作ったコードに入っているワード（FORTHのコマンド）では不十分なので、自分で追加していきます。
　しかし、if/else/then や、do/loop, begin/until, while/repeat のような制御に関するものは、ChatGPTにお願いして組み込んでもらったほうが早いです。

# エラー対応
　どうしても、エラーが発生します。
　また、処理の中身を抜かしてくることもあります。
　まるで、こちらが動作確認をサボっていないか抜き打ちテストするように。
　ChatGPTに修正してもらうには、丁寧に問題点と修正方法を説明してあげないと、修正しましたと言いながら、治ってなかったりします。
　どうしても直してもらえない場合は、自分でデバッグしてみましょう。

# まとめ
　非常に簡単なプログラムや、ありふれたプログラムでない限り、コードを一切読まないで完成させることは難しいようです。追加注文を繰り返していくうちに、問題点が解決できなくなってしまいます。

　また、自分で書き込んだコードが増えてくると、注文のたびにすべてのコードが表示されていては修正箇所を探すのは大変です。途中からは修正した関数のみ表示させ、部分修正を行う方法がいいと思います。

　この方法で、まだバグや仕様の不足ありますが、動作する forth_mini アプリを作りました。

　登録されているワードは、`words` コマンドで表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/6331a2ac-3982-0090-5632-e5871e337bad.png)

[GitHub](https://github.com/fukuyori/forth_mini)

[Download](https://github.com/fukuyori/forth_mini/blob/main/forth_mini/bin/Release/net8.0/win-x64/publish/win-x64/forth_mini.exe)
Karabiner-Elements (Mac)でキーボードが突然何も入力できなくなる不具合が起きた時は、grabberをCLIから再起動すると直った

macでKarabiner-Elementsを使っている人で、突然キーボード入力がまったく効かなくなり、USBキーボードの抜き差し、Karabinerの再起動をしても直らず、macの再起動をしないと直らない人に朗報。

## 当方の環境

* MacBookPro M1 2021
* macOS Sonoma 14.6
* karabiner-elements 14.99.11
    * バージョン上げたら直るのを期待してBetaに上げたけど、直らなかった


## 症状
突然、まったく入力できない → USBキーボード抜き差し → 打てるようになったけど、Karabinerのリマップが無効に → 何しても直らない → Mac再起動 → 直った → 再発 → ムッキー！

## 解決法
```
$ sudo killall karabiner_grabber
```
で直りました。理由は不明。
Karabinerのログを見ると以下が問題の時間帯に多数記録されていたので、このメッセージを頼りにWeb検索し、公式Issueに辿りついた。
```
grabber_client connect_failed: Connection refused
```
https://github.com/pqrs-org/Karabiner-Elements/issues/3605#issuecomment-2209672410

理由はまったく分からないが、Mac再起動で直るという点から、karabinerのプロセスが再起動指示してもしきれなかったんだろうなと推測します。

## 2024-09-01 現時点で直らず karabiner-elements 15.0.0

この現象は一日複数回、MacBookProでだけ起きます。(自分の場合)
そのたびにkillallコマンドをsudoでパスワードをスクリーンキーボードでポチポチやるのは苦痛なので、LaunchPadからマウスだけでkillallできるようにしました。

### ワンクリックでkarabiner_grabberをsudo killallする方法

1. `sudo killall karabiner_grabber` を実行するshellscriptを作成する
1. Automaterを使ってshellscriptをapp化する
1. `visudo` コマンドで `{自分のアカウント名} ALL = (ALL) NOPASSWD: /usr/bin/killall` を /etc/sudoers に追記する
1. 結果、LaunchPadから1クリックするだけで即座にこの問題を解消できる
【自戒】新規参画したエンジニアへのオンボーディングでやらかした件

# はじめに
会社やプロジェクトに新規参画したエンジニアをオンボーディングする機会ってありますよね？
丁寧にオンボーディングして、既存実装や仕様について伝えられるのがベストだとは思うんですが、とはいえ丁寧にすればするほど工数が・・・
最低限必要な情報を伝えて、あとはいい感じに進めて欲しい・・・
じゃあその**最低限必要な情報**ってなんだろう？というのを、最近弊社に参画してもらった開発会社さんとの失敗から考えたいと思います！

# あったこと
参画した開発会社さん、各種アカウントの発行後開発に入った

↓

基本的なデータフローと仕様を共有

↓

開発環境でアプリケーションを触ってもらい、コードリーディングで仕様を把握してもらう
（できるだけ工数を使わないで良いように自走してくれていた）

↓

開発したい機能の要件を伝えて、設計・実装に着手

↓

**レビュー時になって、そもそも修正するAPIを誤解していたことが発覚…！**

# どうすればよかった？
今回は弊社の配送プラットフォーム「ピックゴー」で依頼される案件の中で、配送の距離や性質の違う案件があり、それぞれの案件に対する仕様をうまく伝えられていなかったことが原因でした。

今回の件で足りていなかったのは

- **複数の種別や性質が存在するドメインが、それぞれどう違うのかを伝えること**
- **相手がどのように仕様を理解しているのかを把握すること**

の2点だなと感じました。
同じアプリケーションを開発している期間が長くなると、仕様の理解が進み、「はじめは何がわからなかったのか」わからなくなりがちですよね・・・

# まとめ
新規参画したエンジニアがスムーズに開発に入り、いい感じに進めるためには、仕様書やソースコードの共有・説明は前提として、それに加えて

- **複数の性質があるドメインはどう違うのかを伝える**
- **共有した情報に対して、相手がどのように理解したのかを把握してフィードバックする**

ここまでして**最低限必要な情報**と言えるのかな、と自戒しました。
今回の反省を活かして、これから参画される皆さまの弊社オンボーディングは成長していきます！！

# さいごに
弊社CBcloudではエンジニアを募集しています！！
この記事を読んで弊社に興味を持ってもらえた方、また物流業界にjoinしたいと考えている方はご応募いただけるとエンジニア一同大変うれしく思います！！
成長したオンボーディングでお迎えします！！

https://recruit.cb-cloud.com/
Pythonで表をPowerPointプレゼンテーションに挿入する方法

効果的な情報伝達はプレゼンテーションの要点であり、PowerPointは最も広く使用されているプレゼンテーションツールの一つとして、発表者がこの目標を達成するための豊富な機能を提供します。その中でも、プレゼンテーションに表を挿入することで、データの理解や情報の比較がより直感的に行えます。Pythonのような強力なプログラミング言語を使用することで、表の作成を自動化し、PowerPointに挿入することができ、データの正確性を確保し、作業フローを簡素化できます。この記事では、**Pythonを使用してPowerPointプレゼンテーションに表を追加する方法**を紹介します。

この記事で使用する方法には、[Spire.Presentation for Python](https://jp.e-iceblue.com/download/spire-presentation-python.html)が必要です。PyPIからインストールします：`pip install Spire.Presentation`。

## PythonでPowerPointプレゼンテーションに表を作成する
`ISlide.Shapes.AppendTable(x: float, y: float, widths: list[float], heights: list[float])`メソッドを使用すると、指定したスライドに直接表を作成できます。このメソッドを使用する際には、まず表の開始座標を決定し、データに基づいて各行の高さと列の幅を計算します。
次の手順で、CSVデータを読み込み、データに基づいてプレゼンテーションに表を作成し、簡単な表のフォーマット設定を行います：
1. 必要なモジュールをインポートします。
2. `Presentation`オブジェクトを作成します。
3. CSVファイルデータを2次元の文字列リストとして読み込みます。
4. `Presentation.SlideSize.Type`メソッドを使用してスライドサイズを設定します。
5. `Presentation.Slides.get_Item()`メソッドを使用してスライドを取得します。
6. 表の座標と幅・高さを計算します。
7. `ISlide.Shapes.AppendTable()`メソッドを使用して、指定したサイズと位置に表を作成します。
8. セルのフォーマット設定を行います。
9. `ITable.StylePreset`を使用して表のスタイルを設定します。
10. `Presentation.SaveToFile()`メソッドを使用してプレゼンテーションを保存します。
11. リソースを解放します。

**コード例**
```python
from spire.presentation import Presentation, TextAlignmentType, TableStylePreset, FileFormat, TextFont, SlideSizeType
import csv

# Presentationオブジェクトを作成
presentation = Presentation()

# スライドサイズを設定
presentation.SlideSize.Type = SlideSizeType.Screen16x9

# デフォルトのスライドを取得
slide = presentation.Slides.get_Item(0)

# CSVファイルデータを2次元の文字列リストとして読み込む
with open("Sample.csv", "r", encoding="utf-8") as f:
    csv_reader = csv.reader(f)
    data = list(csv_reader)

# 表の座標と幅・高さを計算
rows = len(data)
columns = len(data[0])
width = float((presentation.SlideSize.Size.Width - 100) / columns)
height = float((presentation.SlideSize.Size.Height - 300) / rows)
widths = [width for _ in range(columns)]
heights = [height for _ in range(rows)]

# 表を追加
table = slide.Shapes.AppendTable(50, 200, widths, heights)
for i in range(rows):
    for j in range(columns):
        table.get_Item(j, i).TextFrame.Text = data[i][j]
        table.get_Item(j, i).TextFrame.Paragraphs.get_Item(0).FirstTextRange.LatinFont = TextFont("Yu Gothic UI")
        table.get_Item(j, i).TextFrame.TextRange.FontHeight = 24

# 表ヘッダをセンタリング
for i in range(columns):
    table.get_Item(i, 0).TextFrame.Paragraphs.get_Item(0).Alignment = TextAlignmentType.Center

# 表のスタイルを設定
table.StylePreset = TableStylePreset.ThemedStyle1Accent1

# プレゼンテーションを保存
presentation.SaveToFile("output/PowerPointプレゼンテーションにCSVテーブルを挿入.pptx", FileFormat.Pptx2013)
presentation.Dispose()
```

**挿入された表**
![PowerPointプレゼンテーションにCSVテーブルを挿入](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/35d25bbd-0599-5210-ee0a-322f8a660f7c.png)

この記事では、PowerPointプレゼンテーションに特定のデータを含む表を追加する方法を紹介しました。

さらにPowerPointプレゼンテーションの処理に関するヒントについては、[Spire.Presentation for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.Presentation-for-Python/Program-Guide/Spire.Presentation-for-Python-Program-Guide-Content.html)をご覧ください。

[無料ライセンス申請](https://www.e-iceblue.com/TemLicense.html)
【jQuery】【JavaScript】switch文のメリット※フォールスルーを活用

フォールスルーを活用方法を理解する必要がある

# コード 19行
```javascript
switch (Number(lamp)) {
    case 1: return;
    case 6:
        derby_king       = "-";
        doguti_sp        = "-";
        aiti_giant       = "-";
    case 5:
        tukemai_kosya    = "-";
        koiten           = "-";
        ipan_oni         = "-";
    case 4:
        kanto_gamashi    = "-";
        teikai_hiroin    = "-";
    default:
        kakedasi         = "-";     
        atozaki          = "-";     
        saikyo_b2        = "-";
}
```

# 元のコード 20行
```javascript
if(Number(lamp) === 1) return;
if((Number(lamp) < 4)){ 
    kakedasi         = "-";     
    atozaki          = "-";     
    saikyo_b2        = "-";
}
if((Number(lamp) < 5)){ 
    kanto_gamashi    = "-";
    teikai_hiroin    = "-";
}
if((Number(lamp) < 6)){ 
    tukemai_kosya    = "-";
    koiten           = "-";
    ipan_oni         = "-";
}
if((Number(lamp) === 6)){
    derby_king       = "-";
    doguti_sp        = "-";
    aiti_giant       = "-";
}
```
自宅にコワーキングスペースが欲しい話

**[前回の問題解決しました。](https://qiita.com/suzukidog/items/1430eca34898146359e1#%E8%A7%A3%E6%B1%BA20240802)**

---
最近、昼にも関わらずコワーキングスペースに学生が溢れかえっていることが増えました。
もしかして夏休みが始まったんでしょうか。

人が多いと座るところがなくなってしまうため勉強ができなくなります。
こういう時のために自宅にひと部屋、狭くて誘惑が目につかないコワーキングスペースが欲しくなりますね。
…って前にも言っていましたが、本当に欲しいので今後も何度でも言います。

家でもバリバリ勉強に集中できる人間になりてーーーーーーーー！！！
メモ9

要在按下按钮后在新窗口中打开一个URL，可以结合JavaScript和JSF来实现。以下是一个示例，展示如何使用`jsfc`属性和JavaScript来完成这个任务。

### 1. HTML和JSF代码

首先，在你的页面中使用HTML标签和`jsfc`属性，并添加一个`onclick`事件来调用JavaScript函数：

```html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
    <title>Open New Window Example</title>
    <h:outputScript name="jsf.js" library="javax.faces" target="head" />
</h:head>
<h:body>
    <h:form id="form">
        <input type="submit" jsfc="h:commandButton" value="Submit" onclick="openNewWindow(event)" />
        <h:commandButton value="Hidden Button" id="hiddenButton" action="#{bean.callApi}" style="display:none;" />
    </h:form>
    
    <script type="text/javascript">
        function openNewWindow(event) {
            event.preventDefault();
            
            // 调用后端API
            var hiddenButton = document.getElementById('form:hiddenButton');
            hiddenButton.click();
        }

        function handleResponse(url) {
            // 在新窗口中打开URL
            window.open(url, '_blank');
        }
    </script>
</h:body>
</html>
```

### 2. Java后端代码

在你的Managed Bean中，定义一个方法来处理API调用，并通过JavaScript在新窗口中打开返回的URL。

```java
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import java.io.IOException;

@ManagedBean
public class MyBean {

    public void callApi() {
        // 模拟调用API并获取URL
        String url = "https://example.com"; // 假设这是从API返回的URL
        
        // 将URL发送回客户端
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            context.getExternalContext().getResponse().getWriter().write("<script>handleResponse('" + url + "');</script>");
            context.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

### 流程解释

1. 用户按下按钮时，`onclick`事件触发`openNewWindow`函数。
2. `openNewWindow`函数阻止表单的默认提交行为，并模拟点击一个隐藏的JSF按钮。
3. 隐藏的JSF按钮触发后台的`callApi`方法。
4. `callApi`方法调用API并获取URL，然后通过JavaScript函数`handleResponse`将URL发送回客户端。
5. `handleResponse`函数在新窗口中打开返回的URL。

这种方法结合了JSF和JavaScript的优势，实现了你描述的功能。希望这对你有所帮助！如果你有其他问题，请随时告诉我。
デフォルト値付きのHashを宣言する

## やりたかったこと

`{ x:1, y:2 }` みたいなハッシュを宣言しつつデフォルト値も与えるっていうのを1行でやりたかった。

## パターン1 : Hash.new + merge

ハッシュを定義しつつデフォルト値も、っていう魔法のメソッドは無くて、2つのメソッドをチェーンするしかないっぽい。
悪くはないけど `Hash.new` ってあんまり馴染みが無いから若干意図が伝わりづらい気もする。

```rb
hash = Hash.new(5).merge(x: 1, y: 2)

hash[:x] #=> 1
hash[:y] #=> 2
hash[:z] #=> 5
```

## パターン2 : ハッシュリテラル + tap

さっきより長くなっちゃったけど、こっちの方が意図が明確で好きかな。

```rb
hash = { x: 1, y: 2 }.tap { |h| h.default = 5 }

hash[:x] #=> 1
hash[:y] #=> 2
hash[:z] #=> 5
```
VSCodeでRaspberry pi内ファイルを編集

　今までRaspberry piでpythonファイルをデバッグするときは、nanoエディタで直接編集するか、Windowsに送ってVSCodeで編集してRaspberry Piに送っていました。
　VSCodeでRaspberry Pi内のファイルを直接編集することができたので、ここに記しておきます。

# SSHの接続設定
### SSHキーの作成(Windows側)
WindowsでPowerShellを起動し、
```ruby: PowerShel
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
と実行してください。
　すると、
```ruby: PowerShell
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/your_username/.ssh/id_rsa):
```
という風にデフォルトのパスで良いか聞いてきます。
　今回はデフォルトのパスで良いので、そのままEnterを押下します。
　次に、パスフレーズの入力を2回求められるので2回打ち込んでください。

### Raspberry Pi側に公開鍵を渡す
Windows側で公開鍵をコピーします。
公開鍵は、
```ruby: PowerShell
type ~/.ssh/id_rsa.pub
```
で見ることができます。

Raspberry PiにSSHで接続します（このときはパスワード認証を使用します）。
```ruby: PowerShell
ssh PiUserName@<Raspberry PiのIPアドレス>
```

Raspberry Piのホームディレクトリに~/.sshディレクトリがない場合は作成します。
```ruby: terminal
mkdir -p ~/.ssh
```
公開鍵をauthorized_keysファイルに追加します。
```ruby: terminal
echo "<コピーした公開鍵>" >> ~/.ssh/authorized_keys
```
ファイルのパーミッションを設定します。
```ruby: terminal
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```

### Raspberry Piでパスワード認証を無効にする
Raspberry PiでSSH設定ファイルを編集します。
```ruby: terminal
sudo nano /etc/ssh/sshd_config
```
次の行を追加します（コメントアウトされている箇所を編集で直しても良い）。
```
PasswordAuthentication no
PubkeyAuthentication yes
```
設定ファイルを保存して閉じます。

SSHサービスを再起動します。
```ruby: terminal
sudo systemctl restart ssh
```

### SSH接続の確認
一度SSH接続を切ります。
```ruby: terminal(PowerShell内)
exit
```
クライアントから再度SSH接続を試みます。
```ruby: PowerShell
ssh PiUserName@<Raspberry PiのIPアドレス>
```

# VSCodeでの接続
　VSCodeを立ち上げ、左上のExtensionsをクリック。
　検索ボックスにRemote SSHと入力し、Remote -SSHをinstallします。
　左下の><のようなボタンをクリック。
　上の検索バーの検索候補に出てくる
Connect to Host...    Remote-SSH
をクリック。
　検索バーに
```
Raspberry Piのユーザ名@<Raspberry PiのIPアドレス>
```
を打ち込むと、新しくウインドウが立ち上がります。
　そのまま先ほど設定したSSH用のパスフレーズを入力すると接続できます。
　あとはWindowsで使っているのと変わらずに作業できます。
アプリの年齢制限指定情報の更新について

## アプリの年齢制限指定情報の更新
最近AppStoreConnectの方でログインすると表示される警告の解決法についてです。

なぜこれが必要なのかの公式サイトを日本語にしてClaude 3.5 Sonnetに要約してもらった内容です。
>・要約
アプリの年齢制限設定は、App Store Connectで必須の情報です。これはユーザーがアプリの内容をよりよく理解するのに役立ちます。開発者はアプリに含まれるコンテンツの種類とその頻度を選択し、それに基づいてAppleのグローバル年齢制限と地域ごとの制限が設定されます。
・重要な点
1.年齢制限の設定プロセス：
・App Store Connectでアプリを選択し、「App Information」を開きます。
・「Age Rating」の下の「Set Age Rating」をクリックします。
・各コンテンツの頻度を選択し、ウェブアクセス、ギャンブル、ルートボックスの有無を指定します。
・結果を確認して完了します。
2.特別なケース：
・4+または9+の場合：Kids categoryでの表示を選択できます。
・12+以下の場合：17+への引き上げやUnratedの選択が可能です。
3.地域別の制限：
・一部の地域では、より具体的な制限ガイドラインがあります。
・韓国など、特定の地域で異なる制限が適用される場合があります。
4.visionOSの特殊性：
・visionOSアプリではKids categoryを選択できません。
5.権限：
・この設定には特定の役割（Account Holder, Admin, App Manager, Marketing）が必要です。
6.API：
・App Store Connect APIを使用して年齢制限を管理することも可能です。
これらの点は、アプリの配信と市場へのアクセスに直接影響するため、開発者にとって非常に重要です。適切な年齢制限を設定することで、適切なユーザー層にアプリを届けることができます。

<br>


## 更新方法
ログインすると
『アプリの年齢制限指定情報の更新』
「購入可能なルートボックスが含まれるアプリのための新しい要件があります。アプリのコンテンツをより正確に説明し、現地の法律に準拠するには、アプリ情報のコンテンツの説明を更新してください。」と表示されています


![スクリーンショット 2024-08-01 10.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/0e91a53b-dd59-08dd-33b3-786f307df5d2.png)

この画面表示で書いてあります。
特に難しいことはありません。

<br>

## AppStoreConnectでリリースしているアプリを選択する

![AppInfoP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/5cbc883b-a2e8-a7a6-7729-ef4a75e8fba9.png)
アプリの左メニューから一般→『アプリ情報』をクリックします。


<br>

![displayP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/7cc7ea77-f679-b913-8e27-ca23f47b6220.png)
画面から年齢制限指定の『表示』をクリックします。
この画面に「地域固有年齢制限指定」が表示されているので対象国で年齢も当たるとなんらかの対応が必要だと思われます。

<br>


![スクリーンショット 2024-08-02 0.33.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/4e17d2bf-d887-916e-810d-5f4e124c95c3.png)
年齢制限指定という項目のチェックが表示されるのでチェックをしていきます。


<br>


![AgeLimitDesignationP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/f3f8b319-3d16-57af-d029-66ab4530a922.png)
この項目にくると最後のチェックが外れています。
なのでこのチェックを完了させてアップデートが承認されれば解決する問題だと思います。

<br>

この対処方法は自分がリリースした全てのアプリが対象となっています。
なので全てこのチェックを入れたものをアップデート申請して承認されないと消えない警告だと思います。

<br>

Set an app age ratingに関するAppleの公式サイト

https://developer.apple.com/help/app-store-connect/manage-app-information/set-an-app-age-rating
【クソ問題】みなさんはこんな問題が出たらどうしますか？

## この記事で紹介するオリジナル問題

### 問題文
0以上100000以下の**有理数**、`a`、`b`、`c`が与えられます。`a+b=c`になる場合は`Yes`を、そうでなかったら`No`を出力しなさい。

### 入力
```
a b c
```

## WAのコード

```python
a, b, c = map(float, input().split()) # a,b,cという変数に半角区切りで入力をfloat型で受け取る
if a + b == c:
    print("Yes") # もしa+b=cだったらYesと出力
else:
    print("No")  # もしそうでなかったらNoと出力
```

一見あってそうに見えますよね。何が違うのでしょうか？

## 解説と理由

### WAになるサンプルケース

次のような入力を考えてみましょう。

```
0.1 0.2 0.3
```

この入力で先ほどのコードを実行してみてください。すると、不思議なことに、

```
No
```

と返ってきますよね？

ここで「まさか」と思う人も多いはずです。**だって`0.1+0.2=0.3`ですよ。**

### コンピューターの弱点

コンピューターは**2進数**で計算します。すると、ほとんどの小数は2進数で正確に表せないのです。そのため、**誤差**が生じてしまいこうなります。そのため、Pythonの`decimal`とか使うといいでしょう。

### みんな大好きエクセルでも...

みんな大好きエクセルでもこのような現象は起きてしまう...2進数はこれが難しいです。

## ACコードは？

これです！

```python
from decimal import *

a, b, c = map(float, input().split())
if Decimal(str(a)) + Decimal(str(b)) == Decimal(str(c)):
    print("Yes")
else:
    print("No")
```

このDecimalを入れることで、10進数で計算してくれます。すると、誤差はなくなるので、

```
Yes
```

このように出力されます。

---

ここまで読んでくれてありがとうございます！

ぜひ、「いいね」と「フォロー」をお願いします。
[coc.nvim] jedi-language-server client: couldn't create connection to server. の対処法

# こんなエラー
vimにて開発環境を構築していた際、このようなエラーが出てどうしてもjediを起動することができなかった。

```
[coc.nvim] jedi-language-server client: couldn't create connection to server.
```

誰かの役に建てるよう、ここに書き残しておこうと思う。

# 環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/252401e3-4e0a-966e-4d3a-0fbd09d097b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/fb057b45-4926-09fc-952a-8df5160b21cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/0a47671b-3bd9-d81e-7853-543eb938785b.png)


# 解決法
どうしてかどうしてかと探し回っていたところ、jediではvirtualenvを使用して環境を作成するらしい・・・
そして、Ubuntuではvenv系のコマンドを触るにはPythonのバージョンに対応したパッケージをaptからインストールしなければならない。
当環境では3.10系だったので
```
sudo apt install python3.10-venv
```

インストール後起動すると何事もなかったかのように動き始めた。
私の２時間はなんだったんだ・・・（絶望）

# 参考サイト
https://qiita.com/YuukiMiyoshi/items/28e26baa3fe534b32009

Super Thanks!
[minecraft統合版]サーバーのアップデート方法

※この記事は生成AIに書いてもらった自分用の備忘録です。
一部間違ってる可能性あるので、次自分がやる時に確認して修正します
しばしお待ちを

# Minecraft Bedrock サーバーのアップデート手順

このガイドでは、Minecraft Bedrock Editionサーバーのアップデート手順について説明します。サーバーをアップデートする際には、必ずバックアップを取得するようにしてください。

## 手順概要

1. **サーバーの停止**
2. **バックアップの作成**
3. **新しいサーバーソフトウェアのダウンロード**
4. **設定ファイルとワールドデータの移行**
5. **新しいサーバーの起動**
6. **古いサーバーディレクトリの整理**

## ステップ 1: サーバーの停止

まず、現在実行中のサーバーを安全に停止します。

1. **`screen`セッションに再接続する**:
   ```bash
   screen -r minecraft
   ```

2. **サーバーを停止する**:
   サーバーのコンソールで以下のコマンドを実行します。
   ```bash
   stop
   ```

3. **`screen`セッションから切断する**:
   - `Ctrl + A`を押し、その後に`D`を押してセッションから切断します。

## ステップ 2: バックアップの作成

`minecraft/bedrock-server`ディレクトリの完全なバックアップを作成します。

1. **バックアップ先のディレクトリを作成**:
   ```bash
   mkdir -p /home/ubuntu/backup
   ```

2. **ディレクトリをバックアップ**:
   ```bash
   tar -czvf /home/ubuntu/backup/bedrock-server-backup-$(date +%Y%m%d).tar.gz -C /home/ubuntu/minecraft bedrock-server
   ```

## ステップ 3: 新しいサーバーソフトウェアのダウンロード

最新のMinecraft Bedrockサーバーソフトウェアをダウンロードし、解凍します。

1. **最新のサーバーソフトウェアをダウンロード**:
   ```bash
   wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.21.2.02.zip -O /home/ubuntu/minecraft/bedrock-server-new.zip
   ```

2. **新しいサーバーソフトウェアを解凍**:
   ```bash
   unzip /home/ubuntu/minecraft/bedrock-server-new.zip -d /home/ubuntu/minecraft/bedrock-server-new
   ```

## ステップ 4: 設定ファイルとワールドデータの移行

既存の設定ファイルとワールドデータを新しいサーバーディレクトリに移行します。

1. **設定ファイルとワールドデータをコピー**:
   ```bash
   cp /home/ubuntu/minecraft/bedrock-server/allowlist.json /home/ubuntu/minecraft/bedrock-server-new/
   cp /home/ubuntu/minecraft/bedrock-server/permissions.json /home/ubuntu/minecraft/bedrock-server-new/
   cp /home/ubuntu/minecraft/bedrock-server/server.properties /home/ubuntu/minecraft/bedrock-server-new/
   cp -r /home/ubuntu/minecraft/bedrock-server/worlds /home/ubuntu/minecraft/bedrock-server-new/
   ```

## ステップ 5: 新しいサーバーの起動

新しいサーバーを`screen`でバックグラウンドで起動します。

1. **新しいサーバー用の`screen`セッションを開始**:
   ```bash
   screen -S minecraft
   ```

2. **新しいサーバーディレクトリに移動し、サーバーを起動**:
   ```bash
   cd /home/ubuntu/minecraft/bedrock-server-new
   LD_LIBRARY_PATH=. ./bedrock_server
   ```

3. **`screen`セッションから切断**:
   - `Ctrl + A`を押し、その後に`D`を押してセッションから切断します。

## ステップ 6: 古いサーバーディレクトリの整理

新しいサーバーが正常に起動し、動作していることを確認したら、古いサーバーディレクトリを削除して整理します。

1. **古いサーバーディレクトリを削除**:
   ```bash
   rm -rf /home/ubuntu/minecraft/bedrock-server
   mv /home/ubuntu/minecraft/bedrock-server-new /home/ubuntu/minecraft/bedrock-server
   ```

## 注意点

- **バックアップの重要性**: アップデート前には必ずバックアップを取得してください。
- **設定ファイルの確認**: 新しいバージョンのサーバーで設定ファイルが正しく動作するか確認してください。
- **サーバーのログ確認**: 新しいサーバー起動後に問題がないか、ログを確認してください。

この手順を踏むことで、Minecraft Bedrockサーバーを安全にアップデートすることができます。
[minecraft統合版]EC2起動時にマイクラサーバーを起動させる方法


# EC2インスタンスでMinecraftサーバーを自動起動する設定

このガイドでは、Ubuntu環境でEC2インスタンスの起動時にMinecraftサーバーを自動的に起動するように設定する手順を説明します。`systemd`を使用して、このプロセスを実現します。

## 手順概要

1. **Minecraftサーバー起動スクリプトの作成**
2. **スクリプトの実行権限を設定**
3. **`systemd`サービスユニットファイルの作成**
4. **`systemd`サービスの有効化と起動**
5. **サービスの確認**

## ステップ 1: Minecraftサーバー起動スクリプトの作成

まず、Minecraftサーバーを起動するためのシェルスクリプトを作成します。

```bash
sudo vim /home/ubuntu/start_minecraft_server.sh
```

以下の内容をスクリプトに書き込みます。

```bash
#!/bin/bash
cd /home/ubuntu/minecraft/bedrock-server
LD_LIBRARY_PATH=. ./bedrock_server
```

ファイルを保存して終了します。`vim`では、`Esc`キーを押してコマンドモードに入り、`:wq`と入力して保存します。

## ステップ 2: スクリプトの実行権限を設定

スクリプトに実行権限を付与します。

```bash
sudo chmod +x /home/ubuntu/start_minecraft_server.sh
```

## ステップ 3: `systemd`サービスユニットファイルの作成

`systemd`サービスを定義するユニットファイルを作成します。

```bash
sudo vim /etc/systemd/system/minecraft.service
```

以下の内容をユニットファイルに書き込みます。

```ini
[Unit]
Description=Minecraft Bedrock Server
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/minecraft/bedrock-server
ExecStart=/home/ubuntu/start_minecraft_server.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
```

ファイルを保存して終了します。`vim`では、`Esc`キーを押してコマンドモードに入り、`:wq`と入力して保存します。

## ステップ 4: `systemd`サービスの有効化と起動

作成したサービスをシステム起動時に自動的に実行されるように設定します。

### デーモンをリロード

ユニットファイルの変更を反映するために、`systemd`デーモンをリロードします。

```bash
sudo systemctl daemon-reload
```

### サービスを有効化

インスタンス起動時にサービスが自動的に起動するようにします。

```bash
sudo systemctl enable minecraft.service
```

### サービスを起動

サービスを手動で起動します。

```bash
sudo systemctl start minecraft.service
```

## ステップ 5: サービスの確認

サービスが正しく起動しているか確認します。

```bash
sudo systemctl status minecraft.service
```

- `Active: active (running)`と表示されていれば、サービスは正常に起動しています。

### ログの確認

サービスに関する詳細なログを確認します。

```bash
journalctl -u minecraft.service -b
```

## 注意点

- **パスと権限の確認**: スクリプトのパスやファイルの権限が正しいかどうかを確認してください。
- **ユーザーの確認**: ユニットファイルの`User=ubuntu`の部分は、サーバーを実行するユーザー名に合わせて調整してください。

これでEC2インスタンスが起動するたびにMinecraftサーバーが自動的に起動するようになります。
10 Questions to Ask Your Boyfriend About Your Relationship

![boyfriend-questions (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813765/c194549e-4429-83da-b9bd-7ef1ac4175e6.jpeg)

Communication is key in any relationship, and asking the right questions can help you both understand each other better and strengthen your bond. Whether you're in a new relationship or have been together for a while, here are 10 questions to ask your boyfriend about your relationship.

1. What are your short-term and long-term goals in this relationship?
Understanding each other's expectations for the future can help both partners align their goals and work towards a common vision.

2. What do you appreciate most about our relationship?
Learning what your boyfriend values in the relationship can help you both nurture those aspects and create a deeper connection.

3. How do you think we can improve our communication?
Open and honest communication is vital in any relationship. Asking about ways to improve communication shows that you're committed to fostering a healthy dynamic.

4. Are there any unresolved issues or concerns that you would like to address?
It's important to create a safe space for your boyfriend to express any concerns he might have, and addressing them together can strengthen your bond.

5. What are your thoughts on commitment and where do you see our relationship going?
Understanding your boyfriend's views on commitment can help both of you determine if you're on the same page regarding the seriousness of your relationship.

6. How do you handle conflicts and what do you need from me during those times?
Knowing how your boyfriend deals with conflicts and what support he needs can help you navigate disagreements in a healthier way.

7. What are the most important qualities you look for in a partner, and do you find those in me?
This question can help you understand your boyfriend's expectations and whether you're meeting them, providing an opportunity for growth and self-improvement if needed.

8. What are your thoughts on personal space and independence in a relationship?
Respecting each other's need for personal space is crucial. Understanding your boyfriend's perspective can help you both maintain a healthy balance between togetherness and independence.

9. How do you envision us supporting each other's individual aspirations and dreams?
Discussing how you can support each other's individual goals can strengthen your bond and create a sense of teamwork within the relationship.

10. What makes you feel loved and appreciated, and how can I show you more love in our relationship?
Understanding your boyfriend's love language can help you express your love and appreciation in ways that resonate with him, strengthening your emotional connection.

In conclusion, asking these questions can lead to valuable insights that can help you both navigate your relationship more effectively. Keep in mind that open and honest communication is essential for a healthy and fulfilling relationship.
Want to know more questions please askquiry.com

Source: https://www.askquiry.com/30-trick-questions-to-ask-your-boyfriend/
Pythonを使ってMySQLを操作する

## MySQLを操作するPythonドライバをインストールする。
```
py -m pip install mysql-connector-python
```
※Windowsではpyで動作する。

## データベースの作成
```python
import mysql.connector

print('Hello, World')

mydb = mysql.connector.connect(
  host="localhost",
  user="username",
  password="password"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE DATABASE test_db")

print('Bye')
```
`mycursor.execute`でSQLコマンドを実行している。

<details>
<summary>実行結果後のデータベース</summary>

```
mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+
5 rows in set (0.00 sec)
```
</details>


## テーブルの作成
```python
import mysql.connector

print('Hello, World')

mydb = mysql.connector.connect(
  host="localhost",
  user="username",
  password="password",
  database="test_db"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))")

print('Bye')
```

<details>
<summary>実行結果後のテーブル</summary>

```
mysql> SHOW tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| customers         |
+-------------------+
1 row in set (0.00 sec)

mysql> DESCRIBE customers;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(255) | YES  |     | NULL    |       |
| address | varchar(255) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```
</details>

## レコード挿入
```python
import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="test_db"
)

mycursor = mydb.cursor()

sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "Record Inserted.")
```

<details>
<summary>実行結果後のテーブル</summary>

```
mysql> SELECT * FROM customers;
+------+------------+
| name | address    |
+------+------------+
| John | Highway 21 |
+------+------------+
1 row in set (0.00 sec)
```
</details>

## テーブル表示
```python
import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="test_db"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM customers")

myresult = mycursor.fetchall()

for x in myresult:
  print(x)
```

SELECT文の実行後、以下のエラーが発生し、MySQL文の実行ができなくなった。
```
AttributeError: cannot access submodule 'connector' of module 'mysql' (most likely due to a circular import)
```
※※2024/8/2追記
mysql.connector内とファイル名が重複するような名前だったためと考えられる。
(select.pyにしていた)
修正したが以下のエラーが発生したため引き続き調査中。
```
mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported
```

※※2024/8/6追記
以下のページにて、エラーを解決。

https://qiita.com/H_T_6221/items/d2bdcfbd345c69a7a035

## 引用
https://www.w3schools.com/python/python_mysql_getstarted.asp
Ruby2.7から3.2にアップデートした時につまづいたところ一覧

## 重い腰を上げた
プラットフォームの期限切れも近づいており、そろそろRuby2.7→3.2にあげないといけないタイミングになった。
コケたところを備忘録として残す。

### アップデート内容
```
ruby '2.7.6' → '3.2.2'
rails '6.0.3' → '~> 6.1'
```

# 起きた問題一覧

## Macで Ruby 3.2.2 のダウンロードができない
```terminal
$ bundle install
rbenv: version `3.2.2' is not installed
$ rbenv install 3.2.2
BUILD FAILED (macOS 14.4.1 on x86_64 using ruby-build 20240727)
```

下記の記事を元に3.2.2のインストール完了(感謝)

https://qiita.com/orangeQ/items/117826cdf55806f4209c

## bundle update 時の依存関係エラー
### nio4rエラー
```terminal
$ bundle update
nio4r
An error occurred while installing nio4r (2.5.8), and Bundler cannot continue.
Make sure that `gem install nio4r -v '2.5.8' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  impressionist was resolved to 2.0.0, which depends on
    rails was resolved to 6.0.6, which depends on
      actioncable was resolved to 6.0.6, which depends on
        nio4r
```
nio4rで失敗
nio4r はaction cableでwebsoketのリアルタイム通信を行うためのもの
現在のプロダクトでは使用しないので削除してよさそう
→削除

### json gemでエラー
json gemと依存関係のsdocのgemをアップデート
```Gemfile
gem 'json', '~> 2.2'
gem 'sdoc', '~> 1.0', group: :doc
```

### Psychのエラー
```terminal
Alias parsing was not enabled. To enable it, pass `aliases: true` to `Psych::load` or `Psych::safe_load`. (Psych::AliasesNotEnabled)
https://github.com/sidekiq/sidekiq/issues/5140
```
```Gemfile
gem 'psych', '<4'
```
4未満にして対処療法

## yarn しようとすると node-sass でエラーになる
package.jsonの"@rails/webpacker"をアップデート
```package.json
"@rails/webpacker": "5.4.3"
```

## session_store の書き方が変更になっている
```terminal
session_store': wrong number of arguments (given 2, expected 0..1) (ArgumentError)
```

https://github.com/roidrage/redis-session-store/issues/124

上記で解消（感謝）


## SQLを直記入している箇所で多々UnknownAttributeReferenceが起きる
ユーザーからの入力値を直接SQLに設定しない場合は、Arel.sql()でラップすることで避けることが可能

 https://api.rubyonrails.org/v6.0/classes/ActiveRecord/UnknownAttributeReference.html

影響範囲が大きいので以下でこの設定を無効にしようとしたが、なぜか設定が効いてくれないので 一つ一つ確認して Arel.sql() でラップ...
```ruby
# Rails 6.1 以降、安全性向上のために安全でない生のSQLクエリの実行箇所でエラーが起きるようになった
# allowしてあげることで今までと同じクエリで動作させる(本当はよくないが影響箇所が大きすぎるのでやむなし...)
Rails.application.config.active_record.allow_unsafe_raw_sql = true
```

該当箇所を全てチェックしラップ
影響範囲が大きいのでここは慎重に。大変だった。

## letter_opnerでメールが開けなくなっている
gemバージョンをアップデート それでも開けない
```Gemfile
  gem 'letter_opener', '~> 1.10'
  gem 'letter_opener_web', '~> 2.0'
```
add_template_helper が rails 6.1 で廃止になって送信できなくなっていた

https://zenn.dev/yuji_developer/articles/85fc172503e79d

下記にて解消
```ruby
  # old
  add_template_helper(ApplicationHelper)
  add_template_helper(FormHelper)

  # new
  helper(ApplicationHelper)
  helper(FormHelper)
```

## ブロックスコープの問題
```ruby
Magick::Image.new(width, height){self.background_color = color}
```
こういう書き方はダメ
```terminal
NoMethodError: undefined method `background_color=' for Magick::Image:Class
```
ブロック外でオブジェクトのプロパティを設定する方法に変更
```ruby
image = Magick::Image.new(width, height) 
image.background_color = color
```
該当箇所を全てチェックし対応
影響範囲が大きいのでここは慎重に。大変だった。

## キーワード引数にハッシュを渡している部分が動かなくなる
```
wrong number of arguments
```

https://m-cf.sh/4foodmk 

(感謝)
ハッシュを展開して渡すように修正

該当箇所を全てチェックし対応
影響範囲が大きいのでここは慎重に。大変だった。
mysqlのdumpファイルが重くて手元の開発環境がimport中に固まってしまったときの対応


表題の通り手元の開発環境のdockerのdbにmysqlのdumpファイルをimportしようとしたところ、途中で固まってしまったので対応したときの備忘録です。

## 方法1. Dockerコンテナのリソースを増やす:

Docker Desktopの設定で、コンテナに割り当てるメモリとCPUの量を増やすことができます。これにより、大きなファイルのインポートがスムーズに行える可能性が高くなります。

とはいえこれには限界があります。
今回は次の方法で解決できました。

## 方法2. ファイルを分割する:

splitコマンドでダンプファイルを小さな部分に分割し、それぞれを個別にインポートします。

### 手順1. ダンプファイルを分割:

例えばsplitコマンドを使用してダンプファイルを100MBごとに分割する場合、コマンドラインで次のように打ちます：

```
$ split -b 100M dump-file.sql part_
```

このコマンドは、your-dump-file.sqlを100MBごとに分割し、part_aa, part_ab, part_acなどの名前でファイルを生成します。

### 手順2. 分割ファイルをインポート:

分割された各ファイルを順番にインポートするには、以下のようなスクリプトを使用します：
```
for file in part_*; do
    cat $file | docker-compose exec -T your-container-name-for-data-base bash -c "mysql -u root -p'yourpassword' name-of-database"
done
```

このスクリプトは、part_で始まるすべてのファイルを順番に読み込み、MySQLコンテナにインポートします。

これで自分の場合は大きなdumpファイルをimportできました。

*なお、大きなdumpファイルの取り扱い時には細心の注意を払い、必ず最初にバックアップを行うことをおすすめします
*今回紹介したスクリプトではdbのパスワードを直接記述しているので手元の開発環境のみで使える手法になります
SSHトンネルのタイムアウト切断防止（案）

# やりたいこと
SSHトンネルをずーっとつなぎっぱなしにしたい

# 背景
SSHトンネルで、一定時間通信がない状態だと切断されてしまいます。
お昼休みなどによりPCを操作しない時間があると容赦なく切断されてしまい、多少ならずともショックを受けてしまうことが多々発生したので何とかならんものかと調べてみました。

# 前提

|役割|OS|
|:----|:----|
|Client|Windows11|
|Bastion Server|Linux|
|Target Server|Linux|

OSはあんまり関係ないですよね・・・

Windows11 の %HOMEPATH%\\.ssh\config に、以下のとおり定義してあるとします。
```
Host ssh-bastion
  User ・・・
  Hostname 12.34.56.78
  IdentityFile ~/.ssh/xxxx.pem

Host tunnel-target
  User ・・・
  Hostname 12.34.56.78
  LocalForward 99999 target:9999
```

# 切断防止（案）
「一定時間、通信がない」という状態を作り出さない
```
ssh tunnel-target ping -i 120 127.0.0.1
```

# おわりに

この方法が全てではないと思いますが、これでお昼休み明けでも接続が維持されているようになりました。
Petalinux 2021.2 & ZedBoard (1) 開発環境の構築 

# はじめに
本稿はZedBoard上でLinuxやカスタムIPを動作させるための手順をまとめたものである。

# 目次
(1) 開発環境の構築 (今回の内容)
(2) [Linuxを動作させてみる](https://qiita.com/daisuke-0213/items/939cb3493b9802e0527b)

# 環境
## Windows PC (ハードウェア/ソフトウェア設計)
* Windows 10
* Vivado 2021.2
* Vitis 2021.2
* Tera Term Pro
::: note info
* AMD/Xilinxのページで公開されているZedboardの最新のBSPファイルがPetalinux 2021.2までになっているので、ここではVivado/Vitisもver2021.2を使用している。BSPファイルを自作できるのであれば、最新のVivadoなども使えるはず。
* 自分はVivado/VitisをWindows PCで動かしているが、Linux PCで動かしてもいいと思う。
:::

### Linux PC (Petalinuxのビルド)
* Ubuntu 18.04
* Petalinux 2021.2

### FPGA Board
* ZedBoard

# 環境構築
## Vivado/Vitis 2021.2 (Windows PC)
[AMDのページ](https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools.html)からVivadoのインストーラー(petalinux-v2021.2-final-installer.run)をダウンロードし、インストールする(デフォルトだとVitisも一緒にインストールされる)。バージョン2021.2は画面左のArchiveのリンクをクリックすると表示される。基本的にはデフォルトのままでいいが、インストールするデバイスは必要最低限にしたほうがディスク容量を節約できる。

## Petalinux 2021.2
次に[AMDのページ](https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html)からPetalinuxのインストーラーを入手する。Vivadoの時と同様、バージョン2021.2は画面左のArchiveのリンクをクリックすると表示される。インストーラーに加えて以下のファイルもダウンロードする。ダウンロード先は~/Downloadsとしておく。
* ZED BSP (avnet-digilent-zedboard-v2021.2-final.bsp)
* aarch64 sstate-cache (*オプション)
* Downloads (*オプション)

(*) これらのファイルはビルドの高速化のために必要なファイル。通常Petalinuxはビルド時に必要なファイルをインターネット経由で入手するが、これらを予めダウンロードしておくことでビルド時間が短縮できる。上記3つのファイルは適当なディレクトリに移動し、展開しておく。ここでは以下のディレクトリに3つのファイルを配置する。
```
/cad/share
```
:::note warn
sstate-cacheとDownloadsは展開するとかなりの容量(90GBくらい)になるのでディスクの空き容量に注意。
:::

次に必要なパッケージのインストールを行う。
```
sudo apt install -y xterm libtool zlib1g-dev gcc-multilib build-essential
sudo apt install -y rsync
sudo apt install -y net-tools
sudo apt install -y ncurses-dev
sudo apt install -y tofrodos
sudo apt install -y iproute2
sudo apt install -y gawk
sudo apt-get -y install autoconf
sudo apt-get -y install texinfo
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install zlib1g:i386

#インストールディレクトリの作成 
sudo mkdir /opt/pkg
sudo mkdir /opt/pkg/petalinux
sudo mkdir /opt/pkg/petalinux/2021.2

#ユーザー (ここではhoge)に対して上記ディレクトリへのアクセス権限を付与する。
sudo chown hoge /opt/pkg/petalinux/2021.2/

#ユーザーにインストーラーの実行権限を付与
chmod u+x petalinux-v2021.2-final-installer.run
```
以上でインストールの準備は完了。以下のコマンドでインストールを実行する。インストーラーを実行すると利用規約が表示される。そのときは「q」を入力し、次に質問が来るのでその時は「y」を入力する。これを2回繰り返すとインストールが進行する。

```
./petalinux-v2021.2-final-installer.run  -d /opt/pkg/petalinux/2021.2
```
「Successful」いった表示がされればインストール成功である。

インストールが完了したら.bashrcに以下の記述を追加する。追加したらsource ~/.bashrcで変更を反映させる。

```
alias petalinux-setup='source /opt/pkg/petalinux/2021.2/settings.sh'
alias petalinux-boot='LANG=C petalinux-boot'
alias petalinux-build='LANG=C petalinux-build'
alias petalinux-config='LANG=C petalinux-config'
alias petalinux-create='LANG=C petalinux-create'
alias petalinux-package='LANG=C petalinux-package'
alias petalinux-util='LANG=C petalinux-util'

petalinux-setup
```
メモ8

还有一种方法，可以使用 JavaScript 的 `submit` 方法与 `target` 属性结合，来实现不通过 AJAX 在新窗口打开 URL。

### JSF 页面

```html
<h:form id="mainForm" target="_blank">
    <h:commandButton id="forwardButton" value="Forward" action="#{bean.forwardToPage}" 
                     onclick="submitFormInNewWindow(); return false;"/>

    <h:outputText id="newUrlOutput" value="#{bean.newUrl}" style="display:none;" />

    <h:outputScript>
        function submitFormInNewWindow() {
            var form = document.getElementById('mainForm');
            form.target = '_blank';
            form.submit();
            form.target = ''; // Reset target to default after submission
        }
    </h:outputScript>
</h:form>
```

### 后端 Bean

```java
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class Bean {
    private String newUrl;

    public void forwardToPage() {
        // 调用外部 API 获取 URL
        newUrl = callExternalApiAndGetUrl();
    }

    public String getNewUrl() {
        return newUrl;
    }

    public void setNewUrl(String newUrl) {
        this.newUrl = newUrl;
    }

    private String callExternalApiAndGetUrl() {
        // 模拟调用外部 API 并返回 URL
        return "https://example.com";
    }
}
```

### 解释

1. **JSF 页面**:
   - `<h:form>` 的 `target` 属性设置为 `_blank`，表示表单提交时将在新窗口打开。
   - `<h:commandButton>` 的 `onclick` 事件触发 `submitFormInNewWindow` 函数。
   - `submitFormInNewWindow` 函数中，通过设置表单的 `target` 属性为 `_blank` 并调用 `form.submit()` 方法，在新窗口中提交表单。提交完成后，重置 `target` 属性为空字符串以恢复默认行为。

2. **后端 Bean**:
   - `forwardToPage` 方法调用外部 API 并设置 `newUrl` 属性。

这种方法利用了 HTML 表单的 `target` 属性，可以在新窗口中打开页面，而不需要使用 AJAX。
[paiza]売れ残りにはなりたくねぇなぁ。。。

# 市場から売れ残らないように生きたい
実力社会って厳しい世の中。。。無能は淘汰されていくのね。。。

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/leftover

# 面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所は[こっちの記事](https://qiita.com/AsilHatake/items/842548e48ae4a0eae119)に書いてあるYO!!
```javascript:leftover.js
// [問題文（原文）]
// あなたはスーパーマーケットを経営しています。
// 今、ある生鮮食品を m[kg] 仕入れました。とても新鮮だったため、生のまま販売したところ、 m[kg] のうち p[%] を売ることができました。次にその売れ残りをすべてお惣菜にして販売したところ、売れ残った量のうち q[%] が売れました
// さて、m[kg] 仕入れたこの食品は最終的に何kg 売れ残ったでしょうか。ただし、生鮮食品をお総菜にする際は、量を変えることなく調理できるものとします。

function leftover(lines) {
  // 入力は以下のフォーマットで与えられます。
  // m p q
  // ここで、m, p, q はすべて整数です。
  if (!Array.isArray(lines) || lines.length !== 1) {
    console.log("1行入れろや！");
    return;
  }
  // すべてのテストケースにおいて、以下の条件をみたします。
  // 
  // ・ 1 ≦ m ≦ 1000
  // ・ 0 ≦ p, q ≦ 100
  // ・ p = 100 のとき、q = 0
  const params = lines[0].split(" ").map(num => Number(num));
  if (params.length !== 3 && !params.every(p => Number.isInteger(p))) {
    console.log("3つの整数を空白区切りで入れろや！");
    return;
  } else if (params[0] < 1 || params[0] > 1000) {
    console.log("1つ目の数字は1～1000の整数入れろや！");
    return;
  } else if (params[1] === 100 && params[2] !== 0) {
    console.log("1つ目の数字が100の時は、2つ目の数字は0を入れろや！");
    return;
  } else if (params[1] < 0 || params[1] > 100 || params[2] < 0 || params[2] > 100) {
    console.log("2つ目以降の数字は0～100の整数入れろや！");
    return;
  }

  // 売れ残った量 [kg] を一行に出力してください。ただし、真値との誤差が0.0001 未満である場合にのみ、正答とみなされます。
  // 全部売れた場合（加工したのが100%の時も含む）
  if (params[1] === 100 || params[2] === 100) {
    console.log(0);
    return;
  }
  // 売れ残り計算
  console.log(params[0] * (100 - params[1]) * (100 - params[2]) / 10000);
}

module.exports = {
  leftover
};
```
極力無駄な処理はしたくなかったので、
どっちかが100%だったら0を出力して終わらせたのと、
`(100 - params[x]) / 100`　の割る100を後ろで一気にやったぐらいで、
後は特に短く出来る要素はなかったかなという感じ。。。

どうでしょう？市場で淘汰されないですかね？