OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPT APIの返答をJSONではなくYAMLで受け取るメリット

## 最初に結論から
ChatGPT APIの返答をYAML形式で出力した場合、StreamAPIと組み合わせるとリアルタイムにユーザーへ返答を出力しつつ、複数の情報を持つ複雑なデータ構造を受け取ることができる

## デモ動画
サンプルの動作を見てもらうのが一番やりたいことが伝わると思う
![](https://gyazo.com/708017b7e8d45831cef99559184d268e.gif)
上半分がChatGPT APIからのレスポンスの内容で、
下半分に、それをリアルタイムに整形して表示している

## 背景から
ChatGPT APIを利用して対話形式のサービスを作成する場合に、ユーザーに見せるテキスト以外にも、同時に複数の情報を受取りたい場合があると思う。
そのような場合、JSON形式での出力する例をよく見る気がするが、JSONだと出力が全て終わってからでないとパースができない。そのため生成結果を逐次受け取れるstreamモードは活用できず、生成処理が全て終わるまでユーザーを待たせることになる。
JSONではなくYAML形式で出力する場合は、生成途中でも正常なYAMLとして解釈できる部分があるので、全ての出力を待たなくても良い。

## デモ動画のソースコード
gistにソースコードを貼った
https://gist.github.com/koyopro/2337bc51fdff3a6c74b7e49f3da37618
空白になっている27行目の`API_KEY`だけ埋めてhtmlとして保存し、ブラウザで開けば動作が見られるはず

## デモ動画内の入力と出力
「こんにちは。あなたについて教えて。」という入力をAPIに投げて、最終的に以下の出力を得た。
```yaml
face: 😊
text: こんにちは！私はAIチャットボットです。自然言語処理技術を使って、ユーザーとの会話をしています。どんなことでもおっしゃってください！
next:
- どのようなことができるの？
- 性格はどういうもの？
```
このYAMLを以下のように整形して表示している。
[![Image](https://gyazo.com/b5c586d7932d6ceaba08b6938c378d97/max_size/1000)](https://gyazo.com/b5c586d7932d6ceaba08b6938c378d97)
systemのプロンプトは以下
```
Userからの質問に、YAML形式で回答してください。
 
faceの項目には発言時の表情を絵文字で記載してください。
textの項目にはUserへの回答を記載してください。
nextの項目にはその後にUserが入力しそうな言葉を複数記載してください。
```
また、出力結果を安定的にYAMLで受け取るために、対話履歴としてサンプルを送信している。
```json
{"role": "user", "content": "こんにちは"},
{"role": "assistant", "content": "face: 😊\ntext: こんにちは！\nnext:\n- あなたは誰？\n- 今日はいい天気ですね"},
{"role": "user", "content": "私はあなたの敵です。"},
{"role": "assistant", "content": "face: 😮\ntext: え！本当？\nnext:\n- あなたを倒しに来ました。\n- 嘘ですよ"},
{"role": "user", "content": "嘘です。私はあなたの味方です。"},
{"role": "assistant", "content": "face: 😌\ntext: よかったー。安心しました。\nnext:\n- 驚かせてごめんなさい\n- ふふふ"},
```

## 生成途中の挙動について
今回の形式では、生成途中の以下のような状態でも正常なYAMLとして解釈できるので、ユーザーにテキストを表示してあげることができる
```yaml
face: 😊
text: こんにちは！私は
```
[![Image](https://gyazo.com/a51739fb1e9e8f81bc84e6640f809aeb/max_size/1000)](https://gyazo.com/a51739fb1e9e8f81bc84e6640f809aeb)
JSONで出力を受け取る場合は以下のような状態であり、正常なJSONとして解釈することはできない

```json
{"face":"😊","text":"こんにちは！私は
```
最後まで結果を受け取っていない途中の状態でもユーザーに出力を見せ始められるのはYAMLならではということがわかる。

## その他
先頭から読んで(最後まで見なくても)成立するデータ構造ならYAML以外でも成り立つとは思う。
YAMLはいろんな言語にパーサーが存在しているので扱うのも簡単だし、人から見ても読みやすいし、出力文字数も少なめなのでそこそこ良いのではと思った。

## 参考URL
- Chat GPT APIの出力形式を安定化する方法
  - [ChatGPTを使ったLINEbot開発で、安定してJSON形式で出力する方法 - Qiita](https://qiita.com/tregu148/items/a2acef272f9c5d04cb11)
  - [LLMをfine tuningなしでLUMにする方法。必要なものはキャラクターへの愛と解像度と解釈 - Qiita](https://qiita.com/naosugi1987/items/059fb69a15a3dc06f33d)
- Streams API関連
  - [JavaScriptのStreams APIで細切れのデータを読み書きする](https://sbfl.net/blog/2018/05/26/javascript-streams-api/)
  - [ChatGPTのストリーミング(SSE)APIを試してみた(Go実装) | DevelopersIO](https://dev.classmethod.jp/articles/shuntaka-open-ai-api-sse/)
CURLで送信したJSONデータをlambdaで取得できなかった

### 現象
lambda function URLを生成し、生成したURLにCURLコマンドでJSONデータをPOST送信したが、lambda側でJSONを取得できないケースがあった。JSONで送信したのは、base64にエンコードした画像データ。

```bash
curl -X POST -H "Content-Type: application/json" -d '{"base64String" : "data:image/jpeg;base64,/9j/4AAQSkZJ....."}' https://<xxxxx>lambda-url.ap-northeast-1.on.aws/
```

### 環境
* nodejs 18(AWS公式Docker用labmdaイメージ)
* curl 7.58].0
* Ubuntu 18.04.4 LTS(WSL2)

### 原因
lambdaに送信されてくるJSONデータがJSONまるごとbase64エンコーディングされていた。

lambdaに送られてくるデータは、JSONのbodyに設定されてくる。
```json
{
  version: '2.0',
  routeKey: '$default',
  rawPath: '/',
  rawQueryString: '',
  headers: {
    'content-length': '25',
    'x-amzn-tls-cipher-suite': 'ECDHE-RSA-AES128-GCM-SHA256',
    'x-amzn-tls-version': 'TLSv1.2',
    'x-amzn-trace-id': 'Root=1-64978c3d-1e7c165d60a237853cc90187',
    'x-forwarded-proto': 'https',
    host: 'xxxxxxxxxxxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws',
    'x-forwarded-port': '443',
    'content-type': 'application/x-www-form-urlencoded',
    'x-forwarded-for': 'xxx.xxx.xxx.24',
    accept: '*/*',
    'user-agent': 'curl/7.58.0'
  },
  requestContext: {
    accountId: 'anonymous',
    apiId: 'xxxxxxxxxxxxxxxxxxxxx,
    domainName: 'xxxxxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws',
    domainPrefix: 'xxxxxxxxxxxxxxxxxxx',
    http: {
      method: 'POST',
      path: '/',
      protocol: 'HTTP/1.1',
      sourceIp: 'xxx.xxx.xxx.24',
      userAgent: 'curl/7.58.0'
    },
    requestId: '90efa7c0-5ac6-4809-8cd4-4fe50cdfe713',
    routeKey: '$default',
    stage: '$default',
    time: '25/Jun/2023:00:37:17 +0000',
    timeEpoch: 1687653437125
  },
  body: 'eyJiYXNlNjRTdHJpbmciIDogInRlc3QifQ.........',
  isBase64Encoded: true
}
```
なので、event.bodyを取得してパースしようとしたが、bodyにセットされているデータがbase64エンコーディングされているためパース時にエラーになる。
```javascript
export const handler = async (event) => {
  try {
    const jsonData = JSON.parse(event.body);
```

### 対応
base64エンコードしている場合、送られてくるJSONに含まれているisBase64Encodedがtrueになる。そのため、isBase64Encodedを見てtrueの場合デコードするようにした。

【変更後】
```javascript
    let jsonMsg = event.body
    if (event.isBase64Encoded){
      jsonMsg = Buffer.from(event.body, 'base64').toString();      
    }
    const jsonData = JSON.parse(jsonMsg);
```
IDEACTIVE JAPAN PROJECT Season.1 最終コンテストに参加してきた

# IDEACTIVE JAPAN PROJECT とは？

https://www.ideactive.jp/

「アイデアを出す」「タカチにする」というそれぞれのフェーズで審査が開催されるそうです。
今回参加したのは、アイデアで審査される「ひらめき！アイデアコンテスト」になります。


# アイデア
今回のコンテストは、初回エントリーの際はいくつものアイデアが応募可能だったので、複数アイデアを応募しました。それぞれでリーンキャンバスを書く必要があり、それはそれでとても勉強になりました。
その中で、最終審査まで通過したアイデアが「山林の相続」をテーマにしたものです。コンテストというか、半分ぐらいは自分の悩みでもあるやつですね。自分の悩みをみんなの前でプレゼンしたみたいな(笑)
その課題に、少し面白いなと思っている衛星データ関連の技術をちょっと組み合わせてプランを検討してみました。


# プレゼン動画

https://www.youtube.com/live/q0IzrUh-pLo?feature=share&t=2670

ちょっと恥ずかしいですが、プレゼンはこちらになります。

# プレゼン資料

https://speakerdeck.com/yukima77/ideactivejapanproject1st-space-forest-inheritance


# 結果
最終選考の結果は、残念ながら表彰とはなりませんでした！
ただ、854アイデアのエントリーがあった中で、動画による2次選考も通過して、ファイナリストの19チームに選出されたこと自体が光栄です！

# 反省点
アイデアの深掘りとか、資料作成とか、プレゼンとか、そこに割く時間とか、よくありそうな反省はいっぱいありますが(笑) やれる範囲でやれることは精一杯できたと思います！
その上で、そもそもが「衛星データってちょっと面白そうじゃん！」みたいなところもあって、ちゃんと技術周りの勉強をしたかったのですが、今回はそこがほぼ出来ていなかったので、そこはちょっと勉強していきたいなと思っています。
あとは、山林の相続とかもすごく詳しくなりましたｗ

# 最後に
コンテスト全体を通じて、いろんな人とも出会い、会話させてもらって、最終プレゼン当日も更にいろいろ刺激を受けました。参加者も含めて、コンテストに関わってくれている全ての方に感謝です！楽しかったです！
さて、次はまた何かを考えて形にします！


（追伸）
SPACEカテゴリーのファイナリストには、Azure Spaceのノベルティグッズを頂きました！めちゃくちゃ嬉しいです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/a5640dab-3146-274d-0aee-58c65b94ac55.png)
ABC307回答メモ

0.はじめに
　C問題が一目見ただけで時間かかりそうだったので、Dを見ると
　行けそうだったので先に回答。その後Cに取り掛かるも40分では
　解ききれませんでした。
　それでもABDクリアでレートが14upしました。

1.A - Weekly Records
　最初、平均を求める問題かと思いましたが単純に
　合計を求める問題だったんで
　回答用のリストを作って、7個分足したらリストに
　追加していって最後に出力でACでした。

　https://atcoder.jp/contests/abc307/submissions/42895027

2.B - racecar
　まず文字列の逆を求める方法をググる。
　Sを逆からにするには、S[::-1]でよいと分かったので
　S==S[::-1]が成り立てば、回文であると判断できます。
　
　あとは、リストをすべて順につなげていって
　回文が成り立てば、Yesを出力して終了
　すべてチェックして成り立たなければNoを出力して終了

　注意点は、すべての組み合わせをチェックするときに
　リスト内でおなじ（位置の）文字列の組み合わせ時はチェック対象から外す
　点くらいでした。

　https://atcoder.jp/contests/abc307/submissions/42902461

3.C - Ideal Sheet
　考え方としては、
　　１）Cシートを表す2重リストを作成し、Xの黒マスに1を、それ以外に0をセット
　　２-１）Aシートの左上の黒マスとXシートの左上の黒マス合わせて、
　　　　Aシートのほかの黒マスがXシートの黒マスと一致するかチェック
　　　　一致したら、Cシートリストの一致した座標を2に書き換え
　　　　一致しなかったら３）へ
　　２-２）Bシートの左上をCシートリストの１or２マスに重ねて
　　　　　 他の黒マスをCシートリストの1or2と一致するかを順にチェック
　　　　　　一致したら、リストのマスを2に変更
　　　　　　一致しない時(0の時)３）へ
　　　２-２-１）Cシートリストに1が残ってたら
　　　　　　　　　Bシートの左上を次のCシートリストの１or２マスに重ねてチェック
　　　　　　　　残ってなかったらYesを出力して終了
　　３）２のチェックで終了しなかったら、BとAを逆にしてチェック
　　４）３）のチェックでも終了しなかったらNoを出力して終了

　と、イメージはできてましたが、ちょっと実装しきれませんでした。

4.D - Mismatched Parentheses
　なんとなく、似た問題を見た気がしつつ取り組む。

　考え方
　　１）デキューに、左カッコ毎の文字列を格納していく
　　２）右かっこが出てきたらデキューをpopしてかっこの組み合わせを削除
　　３）最後にデキューに残った文字列を先頭からつなげて出力
　ポイント
　　・1個目の文字列は（以外が先頭の事もあり
　　・右かっこの数を覚えて置き、対応する右かっこがないのに
　　　dequeをpopすることが無いようにする。

　dequeさえ使えれば、簡単になる問題だなと思いました。

　https://atcoder.jp/contests/abc307/submissions/42917633

以上
今後の学び

# 学ぶこと
・要件定義
・CSS
・React ・JavaScript
・SQL・データベース設計
・GIT → 今までのnoteとか　YOUTOUBEで済ませたいと思っています。
・Python Java
・AWS　Docker Kubernetes CircleCI
・Lpic
・ログイン機能
・英語
# 学びかた
## ライフスタイル
スペイン巡礼　旅行など
## ビジネス
投資とか
YOUTOUBEとか・・・
## 生活
食生活
週1 ジャズダンス ネット　金曜日　
家ジョグ　毎日　２４分　→ 外でできるなら外で・・・・
注：これができなくてもITの学びはやめないようにする。
## 英語を学ぶ　
7月文法をさらっと学ぶ
音読で英文法をモノにする本
www.amazon.co.jp/dp/475743670X
・３回パラっと見る。
・用語を気にしながら読む
・STEP２を読む
・細かく読む
・問題を作りながら読む。覚えるところは覚える。
8月　単語帳で学ぶ　１ヶ月で一冊
## 下記の本をベースにして　ログイン機能を作りつつ全般的に学ぶ

Pythonでチャレンジするプログラミング入門 ――もう挫折しない！10の壁を越えてプログラマーになろう
www.amazon.co.jp/dp/4297132923
8月以降
## 覚え書き的なものを7月中に作る。

https://futureys.tokyo/lets-resolve-conflict-on-git-by-vs-code/
https://qiita.com/Esfahan/items/5e0eeafa6a01fa723435
git push --force origin master
masterのところはブランチ名で
# 用語
current change  自分の変更
incoming change 相手の変更

# 書籍
１０年戦えるデータ分析入門
Thread 1: signal SIGTERMって何？

# はじめに
Xcodeを閉じて次に開くと以下のようなエラーメッセージのようなものが出てくるようになりました。よく見るとエラーの「❌」は表示される訳でもなく、simulatorも動きます。気になって調べてみました。
"Thread 1: signal SIGTERM“ 
![スクリーンショット 2023-06-25 8.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485517/9007e6a7-b733-6cc7-7047-40b8c07d6392.png)

# 原因
コードをsimulatorで動かして、そのままwindowのcloseアイコンを押すと発生するようです。これは、Xcodeがついているのにsimulatorを無理矢理閉じようとしているからのようです。

# 対策
Windowをいきなりブチっと消すのではなく、Xcode上でストップボタンを押してアプリを停止させてからまた起動すると、メッセージが消えました。
![スクリーンショット 2023-06-25 9.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485517/f151471a-9fc5-723c-6e5f-d2ce1aa2d15e.png)
ソフトウェアアーキテクチャの基礎本を読んでみて2

## アーキテクチャの思考

#### 2-1 アーキテクチャと設計


アーキテクチャ
・アーキテクチャ特性
・スタイル
・コンポーネント構造

開発者
・クラス設計
・ユーザインターフェイス
・ソースコード

従来、アーキテクトがアーキテクチャを開発者に伝える。しかしうまく伝わらない場合、開発者はアーキテクトが伝えたアーキテクチャを守らないこと、よく理解していなことがある。そーなっても開発者はアーキテクトにそのことを伝えない。それでは良くないのでしっかり、双方でコミュニケーションを取って連携をしたほうがいいということ


#### 2-2アーキテクトの技術的な幅

アーキテクトは技術の幅を広くしてわかっていないことを減らしていくが大事
よーするに浅く広くを意識する。


トレードオフを分析する

#### 2-3トレードオフとは利点と欠点のバランスのこと

アーキテクチャには正解がなく、必ずしも正しいというわけではない。なぜなら、それぞれの形や仕組みにメリットデメリットがあるから。
だからアーキテクチャの選択は常にトレードオフを考える必要がある。どのメリットを
重視するか。どのデメリットを受けいれるか。

#### 2-4ビジネスドライバーを理解する

ビジネスドライバーとは仕事や事業を成功させるために必要な要素

アーキテクトに必要なことは美辞ネルドライバーを理解してそれをアーキテクチャの特性に変換して関係者と協力してシステム設計すること。


#### 2-5 アーキテクティングとコーディングのバランスをとる

##### 一番注意しなければいけないことはチームのボトルネックになってしまうこと

###### 結論
###### 実現できそうな機能（サービスや画面）の開発に集中する

##### メリット

・開発の実務経験がつめる。
・チームの開発者にアーキテクチャの難しい部分を理解してもらえる。
・開発の問題や難しい部分を知ることができる

以上です！　ありがとうございました。
Ubuntu 22.04.2 LTSでのUSB-シリアル 接続について

こんにちは。38歳からWebエンジニアに転職し、つよつよになって無双できる日を夢見て日々エンジニアリングしているさわらと申します。

そんなエンジニア活動の一貫として、先日、ネットワークの勉強のためにRTX1100を購入しました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">1250円で買ったRTX1100が今日届いた。よくよく考えるとコンソールケーブルはおろかLANケーブルすら持ってないので眺めることしか出来ないという… <a href="https://t.co/hYsi16Tv5e">pic.twitter.com/hYsi16Tv5e</a></p>&mdash; さわら@エンジニア転職14ヶ月目 (@pvspqksRss1Na8n) <a href="https://twitter.com/pvspqksRss1Na8n/status/1671134347297165313?ref_src=twsrc%5Etfw">June 20, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
なんと1250円で送料をあわせても1500円…安い！！

で、さっそく設定してみようと思いコンソールケーブルを購入し接続してみたのですが、なかなかうまくいかなかったので需要があるかわからないですが備忘録として記事に残しておくことにしました。

## コンソールケーブルが届いたので繋いでみるも認識せず
RTX1100のコンソールに入るためにはじめてUSBシリアルケーブルなるものを購入してみました。なんでも規格を間違えると残念なことになるようなので事前に調べて、しっかりUSB-RS232Cのクロスケーブルを購入。そんなイージーなミスはしませんよ、なんて思いながら接続。

ターミナルから以下を実行し確認したところ

```
ls /dev/ttyUSB*
```

「そのようなファイルやディレクトリはありません」

認識していない…？まさか購入するケーブルを間違えたのか、と思い手持ちのWindows10からTeratermでシリアル接続を試してみたところ問題なし。

原因について調べてみたところ、Ubuntu 22.04.2に標準でインストールされているbrlttyってソフトが原因らしいということがわかりました。

## brltty消してみる
点字ディスプレイドライバ「brltty」との競合でUSB-シリアル (/dev/ttyUSB0) が認識されないらしいので消してみました。

apt removeで消す
~~~
sudo apt remove brltty
~~~

udevのルールをリロード
~~~
sudo udevadm control --reload
~~~

minicomで接続しようとすると、

~~~
sudo minicom -D /dev/ttyUSB0
~~~

「minicom: /dev/ttyUSB0 をオープンできません : 許可がありません」

とのことだったのでパーミッションの権限を設定
~~~
sudo chmod o+rw /dev/ttyUSB0
~~~

で、再度接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/6f177310-f9a9-9f2c-a2da-48dab57c91a0.png)

おお！！RTX1100とCopyrightが…、感動。

あとはRTX1100のLANポートにIPをアサインして無事に（なんだか趣のある）管理画面にも入ることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/b4fd74de-79e8-bc48-c492-c921f3c86276.png)

# まとめ
Ubuntu 22.04.2 LTSを使っている人はbrlttyを消さないとUSB-シリアル接続ができない。

最後まで読んで頂きありがとうございました。
Web初心者から始める学習ロードマップ

# はじめに

2023年4月～6月までに学習した内容のまとめ
学習した内容の振り返りと今後どう進めていくかについて考えたいと思います。

どうやって勉強を進めていけば良いか？
→とりあえずProgateで浅く広く勉強して、次にやりたいことを深堀していく

（例）
Web：HTML＆CSS→JavaScript→React(Next.js+TypeScript)
AI,機械学習:Python
バックエンド：Ruby,Ruby on Rails,SQL,Linuxなど

# Progate

https://prog-8.com/

学習時間：約50時間

月額1000円程度で色々なコースを学ぶことができて、圧倒的にコスパが良いです。
一部無料で体験できるので、少し進めてみて問題なさそうと思ったところで課金しました。
毎日、長い時で3時間程度ですが、少しずつ進めることができたのが良かったです。
課題をクリアすると経験値が溜まり、レベルアップするしかけがゲームっぽくて面白く、モチベーションを保つことができました。

学習したコースは以下の通りです。
・Git
・HTML ＆ CSS
・JavaScript
・Node.js
・React
・Command Line
・SQL
・Ruby
・Ruby on Rails(一番難しい）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/4aaecf97-6f77-e816-3db3-19b8b2b32230.png)

Progate Pathという「本気でエンジニアを目指す人向けのコース」もありましたが、学生向けっぽいので利用していません。
とりあえず入門できましたが浅く広くなので、もっと深堀りしていきたくなりました。

# Git,GitHub

【Git入門講座 合併版】この動画1本でGitとGitHubの基礎をゼロからマスター！【初心者向け】

https://www.youtube.com/watch?v=WHwuNP4kalU

ProgateなどでざっくりとGit、GitHubについてはわかったものの、開発現場ではどうやってGitHubを使うのか？
・Pull Requestはどうする？
・Issue？
・GitHub Flowとは？
などの疑問がありましたが、気になったところは調べていきました。

今ではOpenAI-CookBookにあるexampleをローカルにクローンしてきて動かしてみるとか色々できるようになりました。
他の人が書いたコードを見るとすごく勉強になります。

# Docker

Dockerを使用することで開発環境を簡単に構築できます。
この書籍はイラスト付きで初心者にもわかりやすく、イメージがつきやすかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/928f1c46-04f7-80d8-a3cf-0d2ab5bba133.png)

https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker-Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E5%B0%8F%E7%AC%A0%E5%8E%9F%E7%A8%AE%E9%AB%98/dp/4839972745

# HTML & CSS、JavaScript

Googleで調べれば幾らでも情報が出てくると思いますが、まずは一通り学んでおいたほうがいいと思いました。
イラスト付きで初心者にもわかりやすくて良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e8eb5b0b-93e9-2774-22e5-2ea1f91beee1.png)

https://www.sbcr.jp/product/4797398892/

https://www.sbcr.jp/product/4815606145/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e9456f2b-9707-0144-3743-f408f52080e1.png)

https://www.sbcr.jp/product/4815615758/

# Ruby



> Railsをやる前に、Rubyを知ろう。みなさんが「Rubyをちゃんと理解しているRailsプログラマ」になれるように、Rubyの基礎知識から実践的な開発テクニックまで、丁寧に解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/ebf84a53-8d3f-9299-1a8f-0d9928c6e30c.png)


https://gihyo.jp/book/2021/978-4-297-12437-3

# React

YoutubeやUdemyなどの動画をメインに勉強しました。公式チュートリアルもわかりやすくて良いです。

Youtube：Shin@Udemyプログラミング講師
・初心者向けに説明してくれるのでわかりやすい
・ツールのインストールから操作方法まで画面を見せながら進めてくれるので初心者でも安心

https://www.youtube.com/@user-hl9uv6cv7k

React Hooks

https://qiita.com/seira/items/f063e262b1d57d7e78b4


# Next.js

Reactを
こちらもYoutubeやUdemyなどの動画をメインに勉強しました。
公式チュートリアルがわかりやすくておすすめです。

https://nextjs.org/learn/basics/create-nextjs-app

https://dev.classmethod.jp/articles/complete-nextjs-tutorial/


# 今後について

実用的なアプリを作ってみる（Twitterクローンなど）

フロントエンドについて勉強してみて、やっぱり自分にはバックエンドのほうがいいなと思ったので
以下について勉強中です。
・TypeScript
・Ruby on Rails
・AWS

最後までお読みいただきありがとうございました。

これから学習を始める方は
→とりあえずProgateで浅く広く勉強して、次にやりたいことを深堀していく
のが個人的には良いと思いました。

参考になれば嬉しいです。
kustomize listに項目を追加

kustomizeでlistに要素を追加する方法
```deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - name: app
          env:
            - name: ENV1
              value: env1
          resources:
            requests:
              cpu: 250m
              memory: 512Mi
```

```deployment-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - name: app
          image: my-image
          env:
            - name: ENV2
              value: env2
```

```kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../../../base/app
patches:
  - path: deployment-patch.yaml
    target:
      kind: Deployment
```
kustomize build
```build.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
      - env:
        - name: ENV2
          value: env2
        - name: ENV1
          value: env1
        image: my-image
        name: app
        resources:
          requests:
            cpu: 250m
            memory: 512Mi
```
Deploymentにimage,envなどを追加するときはdeployment-patch.yamlでcontainersのnameを指定しないといけない。（nameが識別子となる）

しかし、Ingressでrulesのhostを置換する場合はこの方法は使えないみたい。（rulesにnameがないため？）
現状[Path JSON6902](https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/patches/#patch-using-path-json6902)を使用するのがよさそうだが別の手段が欲しい。

https://github.com/kubernetes-sigs/kustomize/issues/581
https://github.com/kubernetes-sigs/kustomize/issues/347
【Power BI】私の散髪事情を視える化する

## はじめに
**髪を切る頻度が少なくなったと感じたので、Power PlatformのPower BIで視える化**してみました。

Power Apps・Power Automateに比べると、**あまり人気がなさそうなPower BIにスポットを当てたい意図**もありまして。母数が少ないですが、下記の投票では意外と健闘してますね。
Virtual Agents？該当するトピックが見当たりません。


https://twitter.com/MSPowerPlat/status/1672303571675521036

## 前提
**データは、お金の家計簿から抽出**。記録があったのが2016年からなので、およそ7年半分です。散髪日と利用料金が記録されています。

**散髪頻度は、前回の散髪日からの間隔で把握**できます。髪型へのこだわりは皆無。「伸びた分を切る」ようにしてもらうために、前回の散髪日からの経過日数を1か月＝1センチメートルで計算して、「全体を○センチ切ってください」とオーダーしています。なお、髪が伸びるスピードは一定であると仮定しています。

料金について、私はいわゆる **「1,000円カット」** を利用しています。昔は文字通り1,000円でしたが、2016年時点ではすでに1,080円。増税やインフレの影響で、現時点では1,200円に値上がりしています。1,000円と1,200円ではだいぶ見え方が異なるので、費用合計(＝料金×回数)も視える化してみましょう。

## グラフ：年ごと
費用合計を棒グラフ、散髪間隔の平均を折れ線グラフにして、複合グラフにしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/eebad74a-7dfe-12e1-7bfa-84c047af64b3.png)

**年ごとでの集計してみると、2020年に散髪間隔が増加＝散髪頻度が減少が**していることがわかります。原因は、言うまでもなくコロナ禍でしょう。散髪のための外出をなるべく少なくしたかったためと考えられます。また、出社が減って在宅勤務が増えたことで、多少髪が伸びても人目が気にならなくなったこともあるかもしれません。

**2021年から2022年にかけて、散髪頻度が減っているのに費用合計が増えている**こともわかります。理由は、ここが1,100円から1,200円への値上がりポイントだったため。どちらの年も3回ずつ散髪していますが、値上がりによって100円×3回＝300円の差がついています。

## グラフ：四半期ごと
**粒度を細かくして、四半期ごとのグラフも作成**してみました。ちなみに、Power BIの画面上では、階層内の次のレベルに移動します[↓↓]のボタンを押すだけで、年ごとから四半期ごとに細分化できます。めっちゃ便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/6e5de2a2-e748-34be-0974-44a87a94d2bc.png)
ドリルダウンッ！
↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/1311cb63-2174-7300-53c0-5e5631ea02bb.png)

**四半期のうちに一度も髪を切っていないことが2回**ありました。どんだけ外見に気を遣ってないんだ… 2023年に至っては、散髪間隔が5か月近くまで長くなっています。タイミングによっては年に2回しか髪を切らない計算になりますね。

なお、人に見せるなら、**四半期ごとよりも年ごとのグラフの方が適切**だと感じました。データがひとつもない期間があると、グラフが不連続になって直感的でないため。季節ごとの特徴(夏は切る頻度が多いとか)に着目する場合は、四半期ごとのグラフが有効かもしれませんね。

## おわりに
**Power BIは、データさえちゃんと用意できれば、色々な表現・分析ができるツール**です。ドリルダウンや期間の指定が手軽にできるのが強みですね。次に私が髪を切りに行きそうなタイミングなんかも、AIで分析できるんじゃないかと思います。

**Power BIが活用できない理由は、Power BIの機能の問題というよりも、データがまともに用意できないから**、というケースが多いのではと思います。データを個別のExcelなどでバラバラに持つような業務環境だと、データ収集や整形にひと手間かかってしまいます。

私が行っている1,000円カットのチェーン店は、**顧客の利用データをちゃんと収集できているか怪しい**です。チケット購入時に性別・来店実績回数を選択するようになっていますが、それだけでは個人の利用頻度が把握できません。この問題を解消するには、スマホアプリでスタンプカードのようなものを作るなどが考えられそうです。

**1,000円カット最大手のQBハウスは、自社アプリを提供**していますね。ユーザー側はアプリで利用予約ができる、企業側はユーザーの利用データが収集できる、とWin-Winなわけです。さあ、作りましょう、Power Appsで！

https://play.google.com/store/apps/details?id=jp.co.qbhouse.qbp_passport&hl=ja&gl=US

---

https://note.com/anpanda_44075/n/nb9f3a85946b7
msw-storybook-addonでグローバルなAPIモックを作成する方法

# 環境
```
"next": "13.1.1",
"react": "18.2.0",
"msw": "^1.2.2",
"msw-storybook-addon": "^1.8.0",
"storybook": "^7.0.12",
"typescript": "4.9.4"
```

# 手順
### １. 以下のコマンドを実行して、msw-storybook-addonをプロジェクトに追加する。

```bash:bash
npm install --save-dev msw msw-storybook-addon
#または
yarn add --dev msw msw-storybook-addon
```

### ２. プロジェクトのpublicフォルダでサービスワーカーファイルを生成する。

```bash:bash
npx msw init public/
```

### ３．./storybook/preview.tsx に下記のように作成したいAPIモックを追記する。

```tsx:preview.tsx
// 省略...

// Initialize MSW
initialize();

const preview = {
  parameters: {
    // 省略...
    },
    msw: {
      handlers: [
        rest.get("/api/current", async (_, res, ctx) => {
          return res(
            ctx.status(200),
            ctx.json({
              id: 1,
              bio: "フロントエンドエンジニア。TypeScriptとNextに興味があります。",
              location: "Tokyo, Japan",
              name: "TaroYamada",
              profileImageUrl: "/__mocks__/images/img01.png",
              username: "@taro_yamada",
              website: "https://taro_yamada.com",
            })
          );
        }),
      ],
    },
  },
  decorators: [
    // 省略...
  ],
  loaders: [mswLoader],
};

export default preview;
```

### ４．APIモックを使用したいコンポーネントで下記のようなコードを追記

```tsx:Profile.tsx
useEffect(() => {
  fetch("/api/current")
    .then((response) => {
      return response.json();
    })
    .then((data) => {
      return setCurrentUser(data);
    });
}, []);
```

ちなみにStoryファイル自体はこんな感じ。

```tsx:Profile.stories.tsx
// 省略...

const meta: Meta<typeof Profile> = {
  component: Profile,
  tags: ["autodocs"],
  title: "Profile",
};

export default meta;
type Story = StoryObj<typeof Profile>;

export const Default: Story = {};
HTML&CSS Day4:レスポンシブデザインの基本と書き方

# １.概要
参考書のChapter５にてレスポンシブデザインについて学習。
サイトのヘッダーとフッターのCSSにモバイルサイト用の記述を追加した。

# 2.目次
- レスポンシブデザインとは
- プレビュー用のブラウザをレスポンシブモードにする
- モバイル用のヘッダーとフッターの調整
- ハンバーガーメニュー
- 感想

# 3.レスポンシブデザインとは
端末によってフレキシブルに表示を切り替えられるWebサイトの作り方をレスポンシブデザインと言う。スマホの普及や多様なサイズのタブレットの登場で、さまざまな端末での閲覧を前提としたWebサイト設計やデザイン、コーディングが求められる。ユーザーが使用するシチュエーションや行動をイメージして、サイトの使いやすさを考えることが大切。

**●デザインする際に意識したい３つのポイント**
- 画面の大きさの違い
スマホとPCの画面では表示される情報の「量」が異なる。

- 操作性の違い
スマホはタップやタッチなど指先で操作するためマウスに比べて細かい操作が難しい。
ボタンを押しやすい大きさにする、タップする要素が隣接しすぎないようにするなど、指先での操作にストレスを感じさせないデザインを心がける必要がある。
また、スマホだと画面のスクロール量も多くなるため、ユーザーが頻繁に触れる要素は、固定表示するなどして、スクロールで戻らなくてもタップできる位置に配置すると良い。

- 体験の違い
スマホは移動中に使用することが多いので、地図をタップ→地図アプリを起動する、といった他アプリとの連携を意識する必要がある。


**●レスポンシブデザインの制作方法**
- CSSで切り替え
1つのHTMLコードを使用し、ブラウザ幅によって適用するCSSを切り替える方法が主流。
PCでもモバイルでも同じURLで表示が可能。

- ブレイクポイント
レイアウトが切り替わる分岐点のこと。
任意の値を設定でき、制作するサイトのデザインやターゲットによって検討する。
参考書で作成しているサイトは800pxをブレイクポイントに設定。

- メディアクエリ
「ここから先の記述はブラウザの表示幅が○○px以下（または以上）の時に適用」という目印のこと。
```css:   
@media (max-width: 800px) {}
```


# 4.プレビュー用のブラウザをレスポンシブモードにする
Chromeのデベロッパーツール（プレビュー表示から右クリック→検証を選択）を使用。
スマホとスクリーンが描かれたアイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846292/d9feb039-1f06-a120-b49d-91d6ed91e41e.png)

モバイル表示に切り替わる。サイズは「iPhone SE」を使用。

→参考書では、ここでメディアクエリで指定(max-width: 800px)すれば、画面表示が切り替わると記載があるが、実際は切り替わらず。。。理由は不明。
そのため、レスポンシブモードではなく、通常のサイトを表示し、画面サイズを変更することで、レスポンシブデザインを確認していった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846292/9da852e2-155c-f58a-b63d-855d13a7646d.png)



# 5.モバイル用のヘッダーとフッターの調整

- ナビゲーションメニュー
PC版のレイアウトのままだと横にはみ出すため、縦並びに変更する。
ほか、中央揃え、余白設定もする。

- ヘッダー領域を上部に固定
モバイルではヘッダーを上部に固定し、常時表示されるようにする。
```css:
.header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
}
```
ほか、背景色の指定、ヘッダー領域の高さ指定、手前表示、影をつける、内部のサイズ調整、ロゴサイズの調整をする。

:::note info
positionプロパティは要素を自由に配置できる。
・static   ・relative  ・absolute 
 ・fixed   ・sticky
:::

- フッターの調整
ヘッダーを上部固定することにより、フッターの上部と重なって見えなくなっている部分ができてしまう。
それを解消するため、main要素にヘッダーと重なっている高さ分の余白を確保する。
```css:
.main {
    padding-top: 50px;
  }
```
ほか、色々とレイアウトを整える。

# 6.ハンバーガーメニュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846292/79556735-7c0b-3f5b-664c-095a5aa07ebe.png)
モバイル用のナビゲーションメニュー。横棒が３つ並んだアイコンが使われ、ハンバーガーに見えることから「ハンバーガーメニュー」と呼ばれている。

- 4章で非表示にしたボタンtoggle-menu-buttonを表示する
一緒に、ボタンのサイズ及びアイコン画像を指定する。
``` css:
.toggle-menu-button {
    display: block;
    width: 44px;
    height: 33px;
    background-image: url(../images/common/icon-menu.png);
    background-size: 50%;
    background-position: center;
    background-repeat: no-repeat;
    background-color: transparent;
    border: none;
    border-radius: 0;
    outline: none;
  }
```
- メニューの表示／非表示を設定する
HTML作成の際に「toggle-menu.js」というJavaScriptファイルへリンクを追加している。
このjsファイルは「ボタンをクリックしたときにheader-site-menuのclass属性に『is-show』と言う値を追加する」と言う処理が書かれている。
つまり、「クリックしたときにメニューにクラス名が追加される」と言う挙動を利用し、メニューを「最初は非表示にしておき」「is-showと言うクラス名が付いたら表示する」と言う指定をする。
```css:
.header-site-menu {
/*   ・・・（略・・・ */
    display: none;
  }

  .header-site-menu.is-show {
    display: block;
  }
```


# 7.感想
レスポンシブモードの切り替えがうまくいかなかったのは残念。
モバイルはモバイルでさまざまな調整が必要なので、作成する際はその分の日数が必要だと理解した。
RubyでAtCoder ABC239(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC239のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Horizon
https://atcoder.jp/contests/abc239/tasks/abc239_a
```ruby:a-239.rb
h = gets.to_i
puts Math.sqrt(h * (12800000 + h))
```

# B - Integer Division
https://atcoder.jp/contests/abc239/tasks/abc239_b
```ruby:b-239.rb
puts gets.to_i / 10
```

# C - Knight Fork
https://atcoder.jp/contests/abc239/tasks/abc239_c
```ruby:c-239.rb
x1, y1, x2, y2 = gets.split.map(&:to_i)
(x1 - 2).upto(x1 + 2) do |i|
  (y1 - 2).upto(y1 + 2) do |j|
    if (Math.hypot(i - x1, j - y1) ** 2).to_i == 5 && (Math.hypot(i - x2, j - y2) ** 2).to_i == 5
      puts "Yes"
      exit
    end
  end
end
puts "No"
```
## 解説
x1およびy1から距離が3以上となる部分は考える必要がないため、それ以外の範囲で(x1, y1), (x2, y2)からともに距離が√5となるような点が存在すればYesを出力して終了し、最後までなければNoを出力します。

# D - Prime Sum Game
https://atcoder.jp/contests/abc239/tasks/abc239_d
```ruby:d-239.rb
require "prime"

a, b, c, d = gets.split.map(&:to_i)
puts [*a..b].all?{ |n| [*c..d].any?{ (n + _1).prime? } } ? "Aoki" : "Takahashi"
```
## 解説
A〜Bの整数に対して、C〜Dの整数のいずれかとの和が素数となれば青木くんの勝ちなので`prime?`メソッドを使って判定することで勝者を求めることができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
openSUSEから認証Proxy(http)経由でSSH

## TL;DR

sshコマンドで認証プロキシを突破して外部のhostにログインするときはnmapのncatを使って`ProxyCommand ncat --proxy-type http --proxy-auth <pxy-user>:<pxy-pass> --proxy proxy.example.com:8080 %h %p`とすると手っ取り早い。

## ことのはじまり

内部から直接アクセスできるホストと認証プロキシ経由でしかアクセスできないホストがあり、後者の接続にrloginとかつかっていたのだけど、WSLにopenSUSE Leap 15.5が追加されていたのでこいつから接続できるようにしようと試み始めたのがことの発端。

`nc`では認証プロキシを通す設定が見つからなかったのと、ググったところよく出てくる`connect-proxy`をopenSUSEに入れるのが面倒だったので、標準パッケージでできるやつないかなーと探していたところ、[nmapのncatでできると見つけた](https://nmap.org/ncat/guide/ncat-proxy.html)。なので、これを試すことに。


## インストール＆設定


### ncatのインストール

```bash
sudo zypper --no-refresh in ncat
```

これ↓が入った。

```text
Information for package ncat:
-----------------------------
Repository     : Main Repository
Name           : ncat
Version        : 7.92-150400.1.8
Arch           : x86_64
Vendor         : SUSE LLC <https://www.suse.com/>
Installed Size : 429.1 KiB
Installed      : Yes
Status         : up-to-date
Source package : nmap-7.92-150400.1.8.src
Upstream URL   : https://nmap.org/
Summary        : Network tool to concatenate and redirect sockets
Description    :
    Ncat is a networking utility which will read and write data across a
    network from the command line. It uses both TCP and UDP for
    communication and provides network connectivity to other applications
    and users.
```

### sshする

`~/.ssh/config`に以下のように記述してアクセスを試みたらうまく接続できた。

```text
Host __hoge02-ext
  HostName hoge02.ext.example.com
  User bounoki
  ProxyCommand ncat --proxy-type http --proxy-auth <pxy-user>:<pxy-pass> --proxy proxy.example.com:8080 %h %p
  IdentityFile ~/.ssh/id_rsa
```

## Links

https://nmap.org/ncat/guide/ncat-proxy.html
https://qiita.com/u-koji/items/c23c06ef594e34655666
CORSの検証で困った話

Rails(api)×Next.jsの構成でアプリケーションを作っていたら、CORSエラーが**出なくて**時間がかかってしまったのでその記録です。

### 状況
- rack-corsを導入してフロントの`localhost:5001`を許可することに成功していた
- ふとCORSの設定がちゃんとできているのか不安になり、Rails側で許可するoriginから`localhost:5001`を外した
- しかしCORSエラーが起きない

というものでした。
まだ不慣れなところなのもあり、rack-corsの設定の問題なのかと色々設定を変えてみたりしましたが、解決に至るまでに結構かかってしまいました。

### 結論
おそらく経路上のどこかで、`Access-Control-Allow-Origin`をキャッシュかなにかしているっぽいです。localだけかもしれませんが。

### 結論までの道のり
- フロントのポートを`localhost:5002`に変更してみたところCORSエラーが発生した
- Rails側の許可するoriginを`localhost:5002`に変更してリクエストしたところCORSエラーが解消された(`localhost:5001`は外して)
- その後フロントのURLを`localhost:5001`に戻してリクエストしてみたところ、ちゃんとCORSエラーが起きた

一度CORSに成功すると、そのフロントとバックの組み合わせで`Access-Control-Allow-Origin`が残ることで、バックで設定を変えても検証しない、のかな？(DevToolsからレスポンスヘッダーを見ると更新されていませんでした)
なので、フロントの別originから、その別originが許可されるようにリクエストを送ると、そこで更新される、らしい、ですね。多分。

事象から予想したことなので詳しくはよく分かっていないですが、調べても出てきていなかったので、同じことに詰まってしまった方と、なにより自分のための備忘録として書いておきました。
要するに、「ちゃんとCORS効いてんの？」と気になったときはバックの設定を変えて検証するのではなく、フロントの起動portを変えればよかったってことですね。

詳しい方いらしたら、コメントで教えてもらえるとありがたいです。
【ExcelVBA】実行者のデスクトップパスおよびダウンロードパスの取得（Basic > GetPath）

Basic > GetPath

```
'参照設定：Windows Script Host Object Model

Option Explicit

Private Basic As Basic
Private Wsh As WshShell

Public Property Set SetBasic(ByRef obj As Basic)

    Set Basic = obj

End Property
Public Property Set SetWsh(ByRef obj As WshShell)

    Set Wsh = obj

End Property

Public Function DeskTop() As String
    
    DeskTop = Wsh.SpecialFolders("DeskTop")

End Function
Public Function Startup() As String

    Startup = Wsh.SpecialFolders("Startup")

End Function
Public Function Downloads() As String

    Downloads = Replace(DeskTop, "Desktop", "Downloads")

End Function
```

このままでは、動きませんので、ご注意。
【Chat GPT】GiNZAで作るちいがわAI ~ はぢわれ構文ジェネレーター 💙🤍

# プロローグ

唐突ですが、わたくし**かえで**は、あの人気キャラクター **ちいかわ** が大好きです。

特に、ちいかわの漫画でよく使われるユニークな言葉や文句、通称**ハチワレ語録**と呼ばれる文章が大好きで、よくSNSで使っております。
そこで、普通の文章をハチワレ語録に変換するモバイルアプリを作ることにしました。（ワ...ァ....！）

![share.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/d2e749fc-fc3a-a2f2-ddf6-54e252faa356.png)


# アプリ紹介 （動画と画像）
Youtubeに参考動画を載せました。こんな感じです。


<iframe width="560" height="315" src="https://www.youtube.com/embed/QEhgprNWXEE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


イメージ画像はこんな感じ


<img width="180" alt="authorise" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/2d800ce0-2b89-1b68-7937-30657248f4a2.png">
<img width="180" alt="authorise" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/251b2afe-b1a5-1c82-6ef4-c2e755dc96e9.png">
<img width="180" alt="authorise" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/c747c4cc-5aa8-c7ca-f9c9-e81712c4298c.png">
<img width="180" alt="authorise" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/37ba9f79-42cb-1a89-75b7-32223e089bf4.png">


公式サイトはこちら（寝ずに作りました。よかったらみてください🥰）


https://games.kaedeee.com/ja/chigawa-chat/



# アプリ紹介 （リンク）
アプリの名前は**ちいがわチャット AI - はぢわれ構文ジェネレーター**です。テキストを入力すると**はぢわれ語録**が返ってきます。


インストールはここから↓

🍎 AppStore

https://apps.apple.com/jp/app/id1663624111


🍏 GooglePlay

https://play.google.com/store/apps/details?id=com.kaede.chigawaChat

# 技術的な仕組み

構文の変換には、今流行りのChatGPT 


...ではなく、、Python用の日本語NLPライブラリであるGiNZA を使いました。

https://megagonlabs.github.io/ginza/

GiNZAを使用して、文章を分割し、ちいがわの語録に適切に置換や追加することで、はぢわれ語録を生成できるようになりました。

ちなみにこの変換方程式、通称**ハチワレ方程式**は、自分で発明しました。（草むしり検定３級程度の知識があれば大丈夫）


アプリでの変換の流れは以下の通りです。

1. ユーザーが任意の文章を入力する
1. バックエンドにて、GiNZA を利用して入力された文章を分割する。
1. **ハチワレ方程式**により、語録に変換する
1. 晴れて、ハヂワレ語録になって返信される



# 最後に
よかったらインストールしてTwitterなどSNSでコラ画像作ってください。 #ちいがわチャット つけていただければ反応させていただきます！

🍎 AppStore

https://apps.apple.com/jp/app/id1663624111


🍏 GooglePlay

https://play.google.com/store/apps/details?id=com.kaede.chigawaChat

![thumbnail2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/b0eb8a07-61a9-751e-e32a-24ad850be55b.png)
パソコンの電源を切るとキーボードが反応しなくなる方へ

# はじめに
OSはWindows11を対象としています。

:::note warn
BIOSやレジストリ等を操作したけど解決しなかった...。
GoogleやChatGPTに聞いたけどわからなかった...。
:::
<strong>上記の悩める子羊の方々に届いてほしい内容です！</strong>
(ここにたどり着いたご自身に、盛大な拍手を！)
# まずは結論。
<strong>USBのセレクティブサスペンドの設定</strong>を「<strong>無効</strong>」にすると解決します！

# 解決方法
スタートボタンを押下、「<strong>電源プランの編集</strong>」と検索し押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/dfb9b85e-8749-97e1-1c10-dcefb0ecf75f.png)

次に、「<strong>詳細な電源の変更</strong>」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/9d5432fc-b87e-a50d-f02c-f289c28ff036.png)

そして、「<strong>USB設定</strong>」の下部にある「<strong>USBのセレクティブサスペンドの設定</strong>」にて「<strong>無効</strong>」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/c9c57ef7-1dcb-e1eb-4e73-364a96ad45e6.png)

下記の様に「<strong>無効</strong>」が選択されていればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/4fde991c-271c-bc6c-b363-4ab7ac16461f.png)
お疲れさまでした！
以下は、お時間がある際にお読みくださいませ！
* * *

# 解決した経緯
BIOSが起動した直後？にキーボードの電源が一瞬入るけど、Windowsが立ち上がってなさそうだし、Windows側から設定しても意味ないと勝手に思い込んでいました...。

そして調べた結果、マウスコンピュータ様のページにて、下記の文章を拝見しました。
<strong> Windows の初期設定時、電力の消耗を抑えるため、一定時間使用していない USBポートは自動的に電源が切れるように設定されています。
「 USB のセレクティブサスペンドの設定 」 を無効にすることで、一定時間経過後も USB機器の電源が切れないように設定することができます。</strong>
[引用元 - マウスコンピュータ](https://www2.mouse-jp.co.jp/ssl/user_support2/sc_faq_documents.asp?FaqID=23233#:~:text=Windows%20%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E6%99%82,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82 "マウスコンピュータ様のページが表示されます")

まさか、関係ないだろうと思って、騙されたつもりで言う通りにすると、解決したのが経緯になります！
(マウスコンピュータ様、有益な情報をありがとうございます！)
* * *
* * *
* * *
# キーボードについての豆知識
パソコンの電源を切る動作（シャットダウン、再起動）をすると、Numlockがオフになり、<strong>立ち上げた際に毎回Numlockキーを押す煩わしさを感じている</strong>、そこのあなた！！！

<strong> 「高速スタートアップ」を「オフ」にすると解決するかも！</strong>
以下の設定を一緒に行いましょう！

スタートボタンを押下、「<strong>電源プランの選択</strong>」を検索し押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/412092f7-a0e8-953b-56a2-d2fb22ff1c7d.png)

「<strong>電源ボタンの動作を選択する</strong>」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/dfdcb968-a7dc-d53c-d8fc-6c6b7a44770a.png)

「<strong>現在利用可能ではない設定を変更します</strong>」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/3b23ab5f-f9c5-8320-835a-8bb665bfeca6.png)

すると、下記のチェックボックスが変更可能になるので、「<strong>高速スタートアップを有効にする(推奨)</strong>」を押下し、<strong>チェックを外す</strong>。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/19591dd3-e80c-a21d-ba7e-bb5dc5caa26e.png)

下記の様に<strong>チェックボックスが外れて</strong>いることを確認し、「<strong>変更の保存</strong>」を押下すればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490079/91ac49cb-534e-f5f8-ae08-db35e158ec2e.png)

とても、お疲れさまでした！
* * *

:::note info
最後まで御覧いただきまして、ありがとうございました。
皆様のお役に立てれば、大変光栄です！
:::
<lightsail>cloudfrontからのみアクセスを許容したい

lightsailはサクッとサーバーを立てれて良いですよね。
今回は、lightsailに乗っけたwordpressのアクセスをcloudfrontのみにしたいなという時のまとめです。

つまり、ipとかlightsail自体のドメインへのアクセスを拒否したいということですね。


# 方法
cloudfrontからのアクセスを証明するヘッダーを持たせて、それ以外の場合に拒否しようと思います。

## cloudfront側
オリジンを編集から
適当なヘッダーを持たせてください。
今回はX-Custom-Headerにhogefugapiyoを持たせています。

![スクリーンショット 2023-06-25 1.55.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/83ba5a61-ece4-c9b8-a5d0-33dce2585faa.png)



## lightsail側
Apache サーバーの処理を変えていく
bitnami使っている場合はこちらのパスにある
/opt/bitnami/apache2/conf/vhosts/wordpress-vhost.conf
```bash
<Directory "/opt/bitnami/wordpress">
# 追加！
SetEnvIf X-Custom-Header "hogefugapiyo" allow_custom
    Require env allow_custom
</Directory>
```

これでX-Custom-Header: hogefugapiyoを持たないアクセスはforbiddenになります！
CoreServerでPython Flaskを利用する

かきかけです。

# CoreServerでのサブドメイン作成
サブドメインの作成方法は2種（WebUIからの操作）
- ドメイン>ドメイン管理>新しく追加  
- ウェブ>サブドメイン管理>サブドメインを追加  
今回は1つ目の方法を採用。CGIの有効化範囲を狭めるため。  

1. ドメインページのドメイン管理タブから新しくドメインを追加をクリック
1. 適当なドメイン名を入力し、作成する。  
このとき、CGIを有効化にチェック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873167/901425e5-8218-ff38-ea36-37433170acfa.png)

# sshでCoreServerに接続できるようにする。
sshできるようにするにはCoreServerの公式ドキュメントを読むと良い。  
鍵の「承認」を行わないと、鍵は有効化されない。  

https://help.coreserver.jp/manual/v2/ssh-use/?_gl=1*vtlwv9*_ga*MTk0MzcyNTkzMy4xNjc1MDgxNjU3*_ga_J8YE7Q8ZQD*MTY4NzYyMDM1NS45LjEuMTY4NzYyMTUzNC4wLjAuMA..


その上で、CoreServer内のファイルをいじっていく。viで編集するのも良いが流石に不便。VSCodeのMicrosoft製リモート接続できる拡張機能を利用するのが便利。（使い方は触れない）
~~~
ssh <CoreServerアカウント名>@<CoreServer割当サーバドメイン> -i <自マシンの秘密鍵へのパス>
~~~


# ファイル作成
今回作成するのは
- index.cgi
- .htaccess
- test.py
の3つです。  
すべてのファイル作成を以下のディレクトリで行います。
~~~
~/domain/<作成したサブドメイン>/public_html
~~~
cgi-binディレクトリは今回は利用しません。
## .htaccess
- "AddHandler cgi-script .cgi .pl"でcgiファイルの実行を許可しています。
- ”DirectoryIndex index.cgi”で ディレクトリのインデックスをindex.cgiにしました。これを記述しないと、ファイル名を指定しないディレクトリへのアクセスがindex.htmlへと飛びます。  
~~~.htaccess
Options -Indexes +ExecCGI
AddHandler cgi-script .cgi

DirectoryIndex index.cgi
~~~
## index.cgi
~~~index.cgi
#!/usr/bin/python3
import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from test import app
CGIHandler().run(app)
~~~
### 1行目 シェバン（メチャ大事）
- 1行目、"#"で始まるからと言ってコメントではない。  
- Pythonのインタプリタの絶対パスを指定する。（ホームディレクトリを示す~は利用できない）  
適宜、pipでモジュールを追加するなり、pyenvでPython仮想環境を変更するなどして、お好みでどうぞ。  
- 筆者は/home/<ユーザ名>/.pyenv/versions/anaconda3-2023.03/bin/python3.10を利用しています。 
- pythonコマンドを叩いて使用しているインタプリタを利用したいなら”which python”とコマンドを叩いて、コマンドのパスを確認してください。
- サービスが用意しているPythonのパスはCoreServerの場合"/usr/bin/python3"ですが、他のサービスの場合、異なるかも。whichコマンド叩きましょう（pyenv使うのがおすすめ）
## test.py(Flask利用 本体) 
今回はアクセス元IPアドレスを返すようにしてみました。  
~~~test.py
from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')
def index():
    # IPアドレスを取得する
    ip = request.remote_addr
    path = request.path
    return "Your IP address is " + ip + "."

if __name__ == '__main__':
    app.run()
~~~





# はじめに
「はじめに」なーんて書いてる記事、わんさかありますが、筆者の事情、背景なんてどうでも良いよ。とっとと本題入れという方が多いと思い、最後に「はじめに」を書いてみました。

レンタルサーバ（not VPS）仕様で多くのサービスがPython使えるって書いてるけど、使い勝手の良いものではありません。  
でも、VPS借りたり、Herokuみたいなの契約したりとするとなると お金が、、、、という方は多いのではないでしょうか  
（「はじめに」あるある：とりあえず共感を求めてみる）
今回は、そんな私がレンタルサーバでPythonを動かし、Flaskを動かすぞぉという話です。

# さいごに
いかがでしたか？  
今回はアクセスパスによる関数の振り分けはできませんでしたが、また追記したいと思います
chatGPTで、無線通信機能のない計測器とRaspberryPiを繋げる方法を探してみる。(1/n)

出てきた回答はいかのもの
------------------------------------------------------------
Raspberry Piには無線通信機能のないセンサーを接続するためのいくつかの方法があります。以下にいくつかの例を挙げます：

GPIOピンを使用する: Raspberry Piには一般的に40ピンのGPIOヘッダが付属しています。これらのピンはデジタル入出力（GPIO）、電源（5V, 3.3V, GND）、および特殊なインターフェース（I2C, SPI, UART）用に利用できます。特定のセンサーはGPIOピンを介して直接接続できます。

I2C, SPI, UARTなどの通信プロトコルを使用する: 多くのセンサーはI2C, SPI, UARTなどの通信プロトコルを使用します。これらのプロトコルは、Raspberry PiのGPIOピンを介して利用できます。

USB接続を使用する: 無線機能がないセンサーの中には、USB接続でデータを転送するものもあります。これらは、Raspberry PiのUSBポートに直接接続できます。

センサーを接続した後は、それに対応するライブラリやドライバが必要になる場合があります。PythonはRaspberry Piでよく使われるプログラミング言語で、多くのセンサー用のPythonライブラリが存在します。

特定のセンサーの接続方法を詳しく知りたい場合は、そのセンサーの名前とモデルを提供してください。

chatGPTは割と嘘をつくが、とっかかりはできた
------------------------------------------------------------
ここからメーカーに問い合わせたりして、出来る事をやりまくろう。
【自分用メモ】「外資系マネージャーが教える端的に伝える技術」を読んで

## 前提
- "相手に伝える" ための技術について記載

## 今後意識していきたいこと
- そもそも話が伝わってないと感じることができているか
- 「伝えすぎ」はやりがちなので注意
    - 削ぎ落とすを意識したい
- ロジカルシンキングを意識しすぎて答えが遅くなりがち
    - 問いを明確にしてから、ロジカルシンキングを行う
- 答え → 根拠の順に話すは意識できているが、グルーピングして話すは意識できてない
- 伝え方は以下を意識
    - 問いを明確にする
    - 答えを述べる
    - 答えを述べるときは全体像を伝えつつ、根拠をグルーピングして伝える

## ネクストアクション
**1. 伝える時は "全体像" を最初に伝えることを意識**
    - 「この事象の...」 ピンポイントではなく、相手の認知状況を意識し、かつ「知ってるでしょ？」 は一度捨てる

**2. ロジカルシンキングは "問い(課題)" を明確にした後**

**3. 流れとしては以下を徹底する**
```
1. 問いを明確にする
2. 課題 (イシュー)　を明確にする
3. 全体像が伝わっているか意識して答えを述べる
4. 根拠をグルーピングして伝える
    a. "伝えすぎ" を意識する
```

## 参考になったところのメモ
```
- 話が伝わらない理由
    - 相手の質問に答えていない
    - 伝えすぎ
    - 相手に全体像が見えていない話し方
- ロジカルシンキングの罠
    - ロジカルシンキングを用いて答えるのはいいが、そもそも何の問いに対して答えるかの視点が抜けがち
    - 端的に伝えるには自分の説明をロジカルにすることではなく、相手の聞きたいことを起点に話す
    - ロジカルシンキング → 問いに答えるだと、問いが間違っていたときブレる
    - 問いを明確にしてから、ロジカルシンキングを行う
- 一つの視点と3つのルール
    - 視点
    - 視点を自分でなく、相手にシフトする
    - そして相手が何を聞きたいのかを具体化する
    - ルール
- 答え → 根拠の順に話す
    - グルーピングして話す
    - 削ぎ落とす
        - グルーピングして話す
            - いつくか話すことがあったとして、定量的な効果と定性的な効果があります。などグルーピングすると全体像が捉えやすい
        - 削ぎ落とす
            - 情報が多いと認知負荷ぎが増える
            - 伝えなくていいことは伝えない
            - 何を問われているかに立ち返って考える
- まずは問いを明確にする
- 次に答えを述べる
- 答えを述べるときは根拠をグルーピングして伝える
```
スパルタコーディングクラブ　プログラミング入門コース　３週目

### 未経験４０代おっさん頑張っています
皆さんお久しぶりです。未経験おっさん頑張っています( ´∀｀ )
さて早いものでもう入校してから三週間です
そんな今週の学習内容は！！

## python
待っていました**python**
好きで好きでたまらない**python**
さてまずは簡単に**python**のメリットとデメリットを

### メリット
- 分かり易い
- 汎用性がある
- 豊富なライブラリー

### デメリット
- 処理速度が**遅い**
- 定数がない

ですかね？？
定数っていうのは「変数を宣言した場所以外では中身を変えれないもの」って考え方が分かり易い
ですかね？？
処理速度も遅いです。ま～あくまで**java**とかと比べてですが

## 今週学習したこと
### ウェブスクレイピング(クローリング)
簡単にいうと**webサイトからデータを抽出する**って行為ですね。
私は独学の時に某流行り病の増加率と予防接種率を自分の
PCのエクセルなどに落としていましたね
余談ですがpythonからexcelを操作するライブラリーを**openpyxl**といいます。

ここで少し注意です。このウェブスクレイピング(クローリング)
サイトによっては**禁止**にしている場所もあります。
なぜなら、このウェブスクレイピング(クローリング)と言う行為は
リアルで例えるなら自分の家の玄関を一秒間に**１００回以上**開けたり閉めたり
する行為と同じ事を抽出先のサーバーにもしている場合もあるからです。
なのでサーバーに**もの凄い負担かけているかも**という認識をお忘れなく。

## mongoDB
mongoDBは「**NOSQL**」型のデータベースといいますか
「**非リレーショナル**」型のデータベースと言いますかー？？
うん、手っ取りばやく言うと「**データも形を特に指定しないで放り込める倉庫**」
ってイメージが一番分かり易いですね( ´∀｀ )
またまた余談ですが。
リレーショナルデータベースとは**特定の値をキーにし色々なテーブルから情報を繋げる事が出来る**
データベースですかね？。
一番分かり易い例えが**お客様番号**をキーにして「**名前**」や「**住所**」
を様々なテーブルから情報を繋げるですかね。


### 今回の課題のコード
最後に課題のコードを貼って終わりにします。
と言っても最後の方はカンニングしたのですがwwww
どうしても**None**の処理が分からなくて💦

```
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.billboard-japan.com/charts/detail?a=hot100', headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')
songs = soup.select('#content2 > div > div.leftBox > table > tbody > tr')

for song in songs
    #ここで変数「rank」にまずはデータを格納
    rank = song.select_one('td > span')
    #条件分岐を使い「rank」の中身が「None」でなければそれぞれの変数にデータを格納し出力
    if rank is not None:
        rank = rank.text
        title = song.select_one('p.musuc_title').text.strip()
        artist = song.select_one('p.artist_name').text.strip()
        print(rank, title, artist)
```
pyenvでPythonのバージョンを切り替える方法

# はじめに
pyenvを手っ取り早く使いたい人・毎回pyenvの使い方を忘れるダメダメな筆者のためにこの記事を捧げます。

# pyenvとは
**pythonのバージョンを切り替えたい場合に便利なツール**

このサービスPython3.6~3.8しか対応してないんだよなー、でもインストールしたpythonのバージョン3.5なんやけど的な場面で有効。ちなみにめっちゃ便利です。

https://github.com/pyenv/pyenv

# 使い方
## pyenvをインストール

```zsh
# homebrewをアップデートしとく
$ brew update
# pyenvをインストール
$ brew install pyenv
```

## 環境変数とPATHの設定
```zsh
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
# shellを再起動して設定を反映
exec "$SHELL"
```

## インストールするバージョンを確認
以下コマンドでインストール可能なバージョンの一覧を取得できる。
```zsh
$ pyenv install -l
# Available versions:
#   2.1.3
#   2.2.3
#   2.3.7
#   ~
```

## インストール
```zsh
$ pyenv install 3.9.16
```

## バージョンを切り替える
```zsh
# 現在のバージョンを確認
$ python -V
Python 3.10.11

# 3.9.16に設定
$ pyenv global 3.9.16

# バージョンを再度確認
$ python -V
Python 3.9.16
```
しっかりバージョンを切り替えられています。
また、上記はグローバル設定なので、特定のディレクトリでpythonのバージョンを切り替えたい場合は以下を実行する。

```zsh
$ pyenv local 3.9.16
```

# 最後に
最小限のことしか書いてないので、気になったら公式ドキュメント読もう
【Git】Gitで使用するエディタの設定方法

## 設定方法

### `GIT_EDITOR`環境変数 
`GIT_EDITOR`でエディタを指定することができます。

次のようにコマンドを実行するとエディタは`nano`が使用されます。

```terminal
GIT_EDITOR=nano git commit
```

### `core.editor`設定を記述する

次のいずれかに`core.editor`を記述することでエディタを指定できます。
- `.git/config`
- `~/.gitconfig`または`~/.config/git/config`
- `/etc/gitconfig` 

次のように指定すると`vim`を使用するようになります。
```
[core]
    editor = vim
```
コマンドで設定することもできます。

```terminal
git config --global core.editor vim
```

https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup

### `VISUAL`環境変数
`VISUAL`でエディタを指定することができます。

次のようにコマンドを実行するとエディタは`nano`が使用されます。

```terminal
VISUAL=nano git commit
```

### `EDITOR`環境変数 
`EDITOR`でエディタを指定することができます。

次のようにコマンドを実行するとエディタは`nano`が使用されます。

```terminal
EDITOR=nano git commit
```

## 優先順位

Gitのエディタ設定の優先順位は次のとおりです。

1. `GIT_EDITOR`環境変数 
2. `core.editor`設定を記述する
    - `.git/config`
    - `~/.gitconfig`または`~/.config/git/config`
    - `/etc/gitconfig` 
3. `VISUAL`環境変数
4. `EDITOR`環境変数 
5. vi（Debian、Ubuntu の場合は editor）
SAPのMM（Materials Management）モジュールとSD（Sales and Distribution）モジュールの違い

### MM（Materials Management）モジュールとは
MMモジュールは、SAPシステム内の資材管理と調達プロセスを管理します。これは、企業が必要な材料を適切な時間とコストで入手できるようにするためのものです。MMモジュールの主な機能は以下の通りです：
・購買管理：企業が必要な材料を適切な供給元から購入するプロセスを管理します。これには、注文の作成、注文の承認、および注文の追跡が含まれます。
・在庫管理：企業が保有する材料の在庫レベルを管理します。これには、在庫の追跡、在庫の調整、および在庫の再注文が含まれます。
・資材計画：企業が必要な材料を適切な時間に入手できるようにするための計画を作成します。これには、需要予測、供給計画、および生産スケジュールの作成が含まれます。

### SD（Sales and Distribution）モジュールとは
SDモジュールは、SAPシステム内の販売と流通プロセスを管理します。これは、企業が製品を顧客に効率的に販売し、配送するためのものです。SDモジュールの主な機能は以下の通りです：
・販売管理：企業が製品を顧客に販売するプロセスを管理します。これには、注文の受け取り、注文の処理、および注文の追跡が含まれます。
・配送管理：企業が製品を顧客に配送するプロセスを管理します。これには、配送スケジュールの作成、配送の追跡、および配送の完了が含まれます。
・請求管理：企業が顧客からの支払いを管理するプロセスです。これには、請求書の作成、請求書の送付、および支払いの受け取りが含まれます。

これらのモジュールは、企業が効率的に運営するために重要な役割を果たします。MMモジュールは資材の調達と管理に重点を置き、一方、SDモジュールは製品の販売と配送に重点を置いています。これらのモジュールはそれぞれ独立して機能しますが、一緒に使用することで企業の全体的な運営を改善することができます。
iOS9で脱獄をした人ができる小技？

# まず
>僕はすごい詳しいわけじゃないので、間違えてるところはおおいかも...?
# バッテリー残量を表示する
>/var/mobile/Library/Prefences/com.apple.springboard.plist
>
>"SBShowBatteryLevel" & "SBShowBatteryPercentage"
をBooleanで追加。

その後、この二つのスイッチをオンにしてから
何の操作もせずに再起動(Respring??)する。
##解除方法##
上記二つのスイッチをオフにするだけ

# バージョンの偽装
>/System/Library/Coreservices/Systemversion.plist
>
>"ProductBuildVersion"と"ProductVersion"の数値を好きな値にする。
>ios9.3.6にしたいならProductBuildVersionを13G37に、
ProductVersionを9.3.6にする。
カスタムしたいときは「ios(好きなバージョン) wiki」で検索してみよう！


変更後、何もせずに再起動。(Respringではない)
すると...バージョンが変わってる！！(新機能の追加はされない)
僕のiphoneはios9.3.5だったので脱獄アプリはphoenixを使ってます。
再度脱獄状態に入ろうとしても、phoenixは9.3.5-9.3.6しか対応していないので、
12.5.7なんかにしてると脱獄できない...

でも!!カスタムオフセットを入力する？みたいなことが書かれてるので押してみると
テキストボックスが表示される。
オフセットはここ
```text:A5(iPad 2/3, iPad mini, iPhone 4s, iPod 5g)
0x8041200c
0x80456664
0x3f6454
0x45717c
0xa4
```
```text:A6(iPad 4, iPhone 5/5c)
0x8041a00c
0x8045e798
0x3fe454
0x45f2c8
0xa4
```
これを使えば脱獄できる...ことがある!!
# 最後に
脱獄は自己責任です！
これを見て「おぉ～すげぇ...俺もやってみよ」ってなって何か起きても
**一切責任はとれません!!!!!!!!!!!**
【第0回】基本情報試験技術者試験勉強の共有~自己紹介編~

# __自己紹介/勉強法__
こんにちは！栃木の某自動車会社で働く新卒3年目エンジニアの「えの」と申します。
バックグラウンドは機械系です。情報知識に非常に疎いので、最近「基本情報技術者」の勉強を始めました。
勉強目的はズバリ情報系の基礎知識の習得です。
これから少しずつ勉強した内容を備忘録としてまとめていこうと思います。

早速ですが使用している参考書はこちらです(私のは令和4年ver.)。
直観的にわかりやすそうだったのでこちらを選びました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490015/bcd5e495-b5ac-eb14-aa45-8ae48038f2a9.jpeg" width=40%>
前から少しずつ進めています。

[使用参考書](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C05%E5%B9%B4-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%86%E3%82%AF%E3%83%AC%E3%83%90%E3%83%BC%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E6%A0%A2%E6%9C%A8%E5%85%88%E7%94%9F%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E6%95%99%E5%AE%A4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E6%A0%A2%E6%9C%A8/dp/4297131307/ref=sr_1_10?adgrpid=139019830961&hvadid=658808798328&hvdev=c&hvqmt=e&hvtargid=kwd-1931937063793&hydadcr=26612_11754438&jp-ad-ap=0&keywords=%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93+%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88+2023&qid=1687613276&sr=8-10)

情報知識豊富な友人曰く、「基本情報過去問道場」で勉強するのがいいとのこと。
私は基礎固めてから解こうと思ってます。あしからず...

[基本情報過去問道場](https://www.fe-siken.com/fekakomon.php)
***
# __基本情報技術者試験って？__
基本情報技術者試験は「情報技術全般に関する基本的な知識/技術を持つもの」が試験対象者です。
プログラマやシステムエンジニアの基礎知識について広く学ぶことができる入門資格となっています。
資格を持っておくメリットとしては資格手当などの報奨金が支給されたり、就職の際の前提条件だったりすることでしょうか。
私の会社に資格手当とかはあるかは調べておこうっと(多分ない)

試験自体は午前、午後それぞれ150分で午前80問、午後11題中5問選択式となっています。
合格基準は各時間の問題区分全部で60%以上です。

| 時間割 | 試験時間 | 回答数/出題数 | 出題形式 |
|:-:|:-:|:-:|:-:|
|午前|150分|80/80問|四股択一|
|午後|150|5/11問|多股選択|
***
# __勉強共有内容__
記事としては上記の本を参考に自分の理解をまとめていきます。

1.コンピュータ構成要素
2.ソフトウェアとマルチメディア
3.基礎理論
4.アルゴリズムとプログラミング
5.システム構成要素
6.データベース技術
7.ネットワーク技術
8.情報セキュリティ
9.システム開発技術
10.マネジメント系
11.ストラテジ系
***
# __尺あまり__

自己紹介の続きということで...

__趣味__
- 車
運転するより横乗りのほうが好きですw
インテグラtype R(96spec)に乗ってます。4Drセダンのちょっと珍しい(と思ってます)方です。
ほぼノーマルですが、エキマニだけ社外品に変わってます。
走行距離もうすぐ20万kmですが、エンジンはとっても元気です。
今年夏にTC2000を走る予定です！サーキットデビューです！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490015/d67c1a8b-72e6-b00f-9bc5-063d8227544f.jpeg" width=45%>

- 自作PC
最近PCを自作しました。合計30万強でした(;^ω^)
 - CPU：Core i7 13700K
 - GPU：RTX4070Ti
 - OS：Windows11pro(←pro?)
 - マザボ：Z790PRORS/D4
 - 電源：1000W
 - メモリ：32GB
 - ストレージ：1TB
 - クーラ：簡易水冷(冷却水温度が分かる。冷却屋なのでこだわりポイント)

現在たくさんやりたいことがあります！
直近だとフライトシミュレータをやってみたいのでこんなもの買っちゃいました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490015/9e809aed-6d33-e8fe-bd79-1f2e2c85ab53.jpeg" width=50%>

-　新しいことを勉強すること
新しいことを勉強することも好きです。
基本情報の他に弁理士の勉強もしています。

ここまで読んでいただきありがとうございます。
次回から具体的な内容について記載していきます。
どうぞよろしくお願いいたします。