OmniAICreator/Qiita-1.07M huggingface dataset:
【ChatGPT】野口竜司氏提示、7Rプロンプト

:::note info
本記事は、7Rプロンプトを紹介しています。あしからず。
:::

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

　先日（2023/08/19 Up）、
　　You Tubeで、
　　　AI専門家　野口竜司さんが、
　　　　登壇されました。

　ラグビー選手に
　　同姓同名の方が
　　　いらっしゃいますが、
　　　　別人ですw

　野口竜司とは何者か？
　　書籍『文系AI人材になる』
　　　（東洋経済新報社）を
　　　　出されている方です。
　　　　　（わかる？）

　詳しくは、ググってくださいw
***
　下記が、野口竜司氏が
　　登壇された
　　　You Tube動画です。
[【ChatGPTビジネス活用】 これだけであな たの仕事量は半減する? 誰でも「プロン プト達人」になれる7つのポイントとは (AI専門家・野口竜司) 【NewSchool】](https://youtube.com/watch?v=GCwEIvzxPSc&feature=share7)

　動画内では、GPT3.5だと
　　言っていますが、
　　　Web版ではなく、
　　　　内部的に使った
　　　　　チャット画面ですね。
***
　ここで、
　　ふつうのプロンプト作成の
　　　ポイントもおっしゃっている
　　　　のですが、

　注目点は、
　　「**7Rプロンプト**」と命名された
　　　７つのＲに基づく
　　　　プロンプトの書き方です。

　7Rプロンプト:

| 英単語            | 和単語           |
|------------------|-----------------|
| Request          | 依頼             |
| Role             | 役割             |
| Regulation       | 形式             |
| Rule             | ルール           |
| Review & Refine  | 評価・改善        |
| Reference        | 参照知識・例     |
| Run Scenario     | 実行シナリオ     |

　まぁ、これは
　　今までのいろんな方々が、
　　　提示してきたことを
　　　　まとめたもののようです。
　　　　　（私はそう感じました）

　この７つを絶対使え、
　　というわけではないです。

　まずは、簡易プロンプトで
　　行なうだけでも、
　　　それなりの回答が得られます。
　　↓
***
　簡易プロンプト
　　Request　依頼
　　Role　役割
　　Regulation　形式
***
　より高精度にする。
　　↓
***
　評価プロンプト
　　Request　依頼
　　Role　役割
　　Regulation　形式
　　Rule　ルール
　　Review&Refine　評価・改善
　　Reference　参照知識・例
***
　さらに、望むものが欲しい場合は
　　↓
***
　詳細プロンプト（7Rプロンプト）
　　上記に加えて
　　Run Scenario
***
　これは、GPT4の方が
　　いい回答を得られるそうです。

　これで、
　　ChatGPTを、
　　　エージェント化する。

　ChatGPTから質問してもらう。

　どういうことか、というと
　　一連の処理の終了を
　　　ユーザーに委ねる指示を
　　　　記述します。

　そうして、処理を繰り返し、
　　ユーザーが望むものを
　　　出力して、
　　　　初めて、終了できる。

# 最後に
　説明が粗くて、
　　ごめんなさい。

　詳しくは、
　　You Tube動画を
　　　確認してもらうのが
　　　　よろしいかと思います。

　野口竜司さんのことを
　　調べてみたのですが、
　　　7Rプロンプトについては
　　　　どこにも書かれておらず
　　　　　動画が初出しなのでは
　　　　　　ないかと思います。

***
　追加です。
　　野口竜司さん、
　　　新刊を出すらしいです。

　　書籍
　　　『ChatGPT時代の
　　　　　文系AI人材になる』
　　　（東洋経済新報社）です。

　書店で、
　　前の書籍を検索したら、
　　　出てきました。

　まだ、発売日前だそうです。
***
　続けて、
　　記事を書きました。
　　　参考にしてください。


『7Rプロンプトに
　　関して、書いた記事』

　最初の記事。（この記事）
[【ChatGPT】野口竜司氏提示、7Rプロンプト](https://qiita.com/kabumira/items/77bcfeac699673d99c09)

　次の記事。
[【ChatGPT無】深津式→7Rに書き直す](https://qiita.com/kabumira/items/83a6999b21e9484016ea)

　次の記事。
[【ChatGPT無】7R（簡易プロンプト）を簡単な指示と比較した](https://qiita.com/kabumira/items/a4cd4ec25a7cefbb95c7)

　次の記事。
[【ChatGPT無】7Rプロンプトで、ワードミキサーPrompt。](https://qiita.com/kabumira/items/67928a476c259de7701a)

　次の記事。
[【ChatGPT無】7R（簡易）で、長話を短くするには、と聞いてみた](https://qiita.com/kabumira/items/8d807cda0ca5ff1dea25)
***
初心者エンジニアは生成AIに聞け

～「未経験新卒エンジニアに捧ぐ」～
生成AIに家庭教師をしてもらっている、新卒エンジニアです。
今日は初心者こそ、生成AIに聞いて早く成長しようという記事です！


# はじめに
僕は４月から某IT企業に入社したエンジニアです。

とはいえ、学生時代にプログラミングの経験はなく、理系の大学に通っていたせいでとっていたC言語の授業も、友人に奢るラーメンと引き換えに単位を取得したようなものでした...　。

というわけで、必要に駆られてプログラミングを学び始めた初心者の視点で生成
AIに教えてもらっていることをつらつらと発信します。

# ググる前の下ごしらえ

生成AIを家庭教師に向かえてよかったことはググる精度を担保できることだと感じました。
例えば、大学生の時に調べてもわからないことを質問をしに教授の部屋へ行きました。「調べればわかるよ」とPCを見せる教授、確かにわかりやすいピンポイントの解説がされた論文やネット記事を見せてくれました。そこで気づいたことは
**検索ワードが違うじゃん！** でした。聞いたこともないカタカナの検索ワードで、的確にググる教授。
ここで起きた僕と教授の間にある差を埋めてくれるのが生成AIです。
僕はプログラミングで詰まったときに、ググる前にまず生成AIに聞きます。感覚的な散文でガンガン聞くと、いくつか **聞いたこともないカタカナ** を返してくれます。それをググると知りたかったことに近い、それっぽいことが調べられるのです！

# エラーの根本を知る
僕がプログラミング初心者に一番お勧めしたい活用方法です。それはエラーログの意味を生成AIに聞くこと、コードのデバッグをしてもらうことです。

生成AIを家庭教師として迎え入れる前にコマンドを打っていてエラーが出たときのことです。必要なリソースがインストールされていないという類のエラーでした。それを真に受けて、ググりまくって２時間ほど進展がないままのとき、はじめて生成AIに聞いたところ。
まさかの **全角スペースが入っていた** というミス。改めてエラーを見ると、確かに該当する部分がコマンドとして認識されてないことに気づき、かなりショックを受けました。

# 最後に
情報収集についての感覚的な話になりますが、 **情報を得て行動に移せるまでの時間** は当然「生成AI　＜　ネット　＜　本」という順番になると思いますが。 **有機的な知識を得る時間** は反対になるのではと考えています。
最近は上長との会話の中でベースとなる知識が足りないと思うことや基礎的な用語を知らないことが多くあり、会話のレベルを一段落としてもらうことも珍しくありません。ピンポイントでの対症療法としての生成AIの活用と、基礎的な知識間の因果関係を早く学ぶための本というすみわけも考えながら、今後も日々勉強していきたいなというお話でした。

最後まで読んでくれた人に幸あれ
お薬のジェネリックならぬswiftのジェネリクス

# 薬のジェネリックならぬswiftのジェネリクス
## 目次
[1.ジェネリクスとは](#1-ジェネリクスとは)
[2.メリット](#2-メリット)
[3.使い方](#3-使い方)
[4.おわりに](#4-おわりに)

# 1. ジェネリクスとは
- 一言でいうと、「<INS>**引数の型の引数**</INS>」です。
- ジェネリック関数とジェネリッククラスがあります。

# 2. メリット
関数を作成する際に型ごとにそれぞれ関数を作成する必要がない。
例)
### ジェネリクスを使用しない場合
- 同じ処理内容の関数であっても型ごとに作成Must
~~~ swift:func.swift
func printFuncInt(a: Int, b: Int) -> (Int, Int) {
    print("aの値は\(a), bの値は\(b)")
    return a, b
}

func printFuncStr(a: String, b: Sring) ->  {
    print("aの値は\(a), bの値は\(b)")
    return a, b
}
~~~
    
~~~ swift:ViewController.swift
let resultInt = printFuncInt(a: 1, b: 2)
let resultStr = printFuncStr(a: "1", b: "2")
~~~

### ジェネリクスを使用する場合
- 同じ処理で異なる型で使いまわしたい場合はひとつの関数定義でOK！
~~~ swift:func.swift
func printFunc<T>(a: T, b: T) -> (T, T) {
    print("aの値は\(a), bの値は\(b)")
    return a, b
}

~~~

~~~ swift:ViewController.swift
let resultInt = printFunc(a: 1, b: 2)
let resultStr = printFunc(a: "1", b: "2")
~~~

# 3. 使い方
- 基本形
~~~ swift
func 関数名<T>(引数名: 型) -> T {
  // 処理
}
~~~

# 4. おわりに
本記事を最後まで読んでいただきありがとうございました♪
今回はお薬のジェネリックならぬ、swiftのジェネリクスについて解説いたしました。
皆さんも是非使って、脱初心者を目指しましょ！
M5Stack で Wifi に急に繋げなくなった時に試すべきこと

Type-C ケーブルの表裏を変えて挿し直してみる。

パッと調べるだけでも色々な issue 出てきて色々と試してどうしても直らなくてふと表裏を変えて挿し直したら動いた。いやはや...
https://github.com/espressif/arduino-esp32/issues/2501
https://github.com/espressif/arduino-esp32/issues/918
M5StickCPlusをPlatformIOで書いてて困ったこと。

# 使用しているハード・ソフト
- mac studio(2022)
- VSCode
- PlatformIO
- M5StickCPlus

# 困ったこと
### ビルドに成功しない
　初歩的な部分で躓いてしまったなぁと思いましたが、以前は成功しているため原因を探ろうとターミナルログを見てみるとヘッダがないらしい。
~~~
**************************************************************
* Looking for Wire.h dependency? Check our library registry!
*
* CLI  > platformio lib search "header:Wire.h"
* Web  > https://registry.platformio.org/search?q=header:Wire.h
*
**************************************************************

 #include <Wire.h>
          ^~~~~~~~
compilation terminated.
~~~

こんな感じのがいくつか出てきた。
今回は以下のファイルが見当たらなかったらしい。
- Wire.h
- SPI.h
- Fs.h

以下のサイトを参考にして解決することができた。

https://qiita.com/n0bisuke/items/36fb836580c6c75291ad

私も同様に.iniファイルに書き込んだところ解決しました。(バージョン書くべきなんだろうなと思いながら…)
~~~ini
lib_deps = 
    m5stack/M5StickCPlus@^0.0.9
    Wire
    SPI
    Fs
    ESP32Servo
~~~

### esptool write_flash: error:
PlatfoprmIOにてコードを完成させ、実際にM5StickCPlusへと書き込もうとした際に発生しました。
~~~
esptool write_flash: error: argument <address> <filename>: 
[Errno 2] No such file or directory:
~~~
こんな感じのエラーでしたが要はディレクトリが見つからない旨を示しています。
ここで困ったことがディレクトリが実際には存在していることです。

以前macbook(2016)にて扱った際には平常運転でしたので、何が問題なのか探って色々なサイトを見ていましたがMacの例は見当たらず。
　ですがユーザディレクトリ下にて作業を行なっている際に発生する事例がいくつかあったため、platform IOにてプロジェクトを作成する際にデフォルトのディレクトリで作成をしたところ成功しました。（Macの場合はアクセス権限が取得できてないのでしょうかね？？？）
![スクリーンショット 2023-08-21 11.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3403549/9bf31da3-8533-3d20-7145-7956ff76ba8b.png)
GASでQiitaAPIを利用してみた！【Vol.1 記事情報取得編】

# 背景
弊社の受託開発チームでQiita記事でアウトプットを定期的に行おう！
という施策が始まって早2週間　※記事投稿時点

少しずつ投稿記事も増えてきて、気になってくるのが記事のLGTM等の数ですね✨
（いいね数、ストック数、閲覧数）

Qiitaさん！API提供してくれてるじゃないですか！
**そうだ！GASで自動化しちゃおう！**

:::note info
**目次**
1. 特定ユーザの記事一覧取得APIの説明
1. 閲覧数とれない
1. APIキーの取得
1. とれた？うん？
1. 注意事項ーAPIキーを使っても自分の閲覧数しかとれない
1. おわりに
:::

# 特定ユーザの記事一覧取得API
今回利用するAPIの基本情報は以下の通りです。

メソッド：`GET`
エンドポイント：`/api/v2/users/:user_id/items`
クエリパラメータ
1. `page` ページ番号
2. `per_page` 1ページあたりに含まれる要素数

※QiitaAPIのドキュメントは[こちら](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)

GASでの実装コードはこちら
```javascript:getItemsData()
//リクエストURL
var url = 'https://qiita.com/api/v2/users/{ユーザID}/items';
//APIリクエスト実行
const response = UrlFetchApp.fetch(url, options);
//取得結果の整形
const json = JSON.parse(response);
```

# 閲覧数とれない
上記のコードで実行してみて、記事情報は問題なく取得できました✨
が、閲覧数のところがnullになっていました。

```
"page_views_count": null,
```

どうやら、閲覧数についてはリクエストにアクセストークンを添えないといけないようです💦

# アクセストークンの取得
ということで、アクセストークンを取得します！
こちらの記事を参考に取得いたしました。
https://qiita.com/maiamea/items/680cca06f7825595cba0

# とれた？うん？
トークンを添えて、いざ再実行！
```
"page_views_count": 1050,
```
取れたーーーーーーー！
っと喜びも束の間、今回の記事一覧ではチームメンバー全員の記事の情報も取得してたんですが
自分以外のメンバーの閲覧数が取れてない。。。泣

:::note warn
**注意事項**
アクセストークン（個人用）を付与しても他ユーザの閲覧数は取得できない
:::

個人用という名前の時点で少し引っかかってはいましたが、やはりダメみたいですね（ ;  ; ）

# 最後に
全員の閲覧数取得は、残課題ですが一旦いいねやストック数は取れるようになった✨

GASでめんどくさいを自動化してハッピーライフ🎉

# 参考
[GASとは](https://developers.google.com/apps-script)
[個人用アクセストークン取得](https://qiita.com/maiamea/items/680cca06f7825595cba0)
[指定ユーザの記事一覧取得](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)
GoogleAppScript(GAS) でWebページのスクリーンショットをドライブに保存

GoogleAppScript を使って Webページのスクリーンショットを取得してドライブに保存してみる
スクリーンショットの取得では `s.wordpress.com/mshots` を使ってます
まだ足りない点あるので一旦は単純な取得まで．．．
- ページ全体をとったりするにはまだ考慮が不足してる．．．
- スクリーンショット生成までの待機時間が適当な感じ．．．

```javascript
function saveScreenShot() {
  // スクリーンショットを取得したいウェブページのURL
  const url = 'https://sample.com';
  // s.wordpress.com/mshots の URL, w/hでサイズ指定
  const requestUrl = 
      'https://s.wordpress.com/mshots/v1/' 
      + url
      + '?w=' + 800
      + '&h=' + 600;
  const responseData = UrlFetchApp.fetch(requestUrl);
  Utilities.sleep(1000 * 10); // 画像出来上がるまで待機
  const responseBlob = UrlFetchApp.fetch(requestUrl).getBlob();

  // 保存先GoogleドライブID 
  const folderId = 'ドライブの保存先ID(URLの最後にある英数字)'; 
  // 保存ファイル名
  const fileName = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'YYYY-MM-dd-hhmmss') + '.png';
  DriveApp.getFolderById(folderId).createFile(responseBlob).setName(fileName);
}
```
WSL の Ubuntu に Vim 9.0 を入れる

:::note warn
この記事では PPA リポジトリを利用していますが、2024/03/20 現在、リポジトリを追加しなくても Vim 9.0 がインストールできることを確認しています。次で十分である可能性があります。
```
sudo apt install vim vim-gtk
```
クリップボードなどの関係で`x11-apps`や`x11-utils`などの X11 関連のインストールが必要かもしれませんが、少なくとも、`ppa:jonathonf/vim` を利用する必要はなくなっているようです。利用しても、`sudo apt update` を実行する時に警告が出ます。
:::

個人の備忘録です。

WSL の Ubuntu で Vim の バージョンを 9.0 にします。
ついでに clipboard を Windows と連携して利用できるようにします。

# Vim 9.0 のインストール方法

まず本題です。PPA リポジトリを追加すれば良いらしいです。[^1]
WSL の Ubuntu のターミナルを起動して、次を実行します。
```
sudo add-apt-repository ppa:jonathonf/vim
```
すると、

> Press [ENTER] to continue or Ctrl-c to cancel.

と言われるので、エンターを入力します。これで追加は完了です。
あとは、アップグレードすれば Vim のバージョンが 9.0 になります。
続いて次を実行します。
```
sudo apt upgrade
```
すると、

> Do you want to continue? [Y/n]

と聞かれるので、良ければ `y` を入力します。
意外と簡単でした。

# Vim の clipboard について

ここからは、Vim 8.2 でも 9.0 でも同じなのですが、Windowsのクリップボードとの連携についてです。詳しくは、wsl vim などで調べると記事が出てきますので参照してください。[^2] 

クリップボード連携のために、WSL の Ubuntu に X11 を入れる方法があるようです。[^3]
以下で、インストールします。[^4]
```
sudo apt install x11-apps
```
例の如く yes or no を聞かれるので `y` を入力します。

あとは、次のように`vim-gtk`をインストールすれば、
`+clipboard` となってクリップボードが使えるようになります。
```
sudo apt install vim-gtk
```

# 環境情報と最終結果

最後に、元の Vim と導入後の結果について記録しておきます。

最初の Vim のバージョンは以下の通りです。
```
user@HOST:~$ vim --version | head -5
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Apr 18 2023 11:40:57)
Included patches: 1-3995, 4563, 4646, 4774, 4895, 4899, 4901, 4919
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
Huge version without GUI.  Features included (+) or not (-):
```
Vim 9.0 導入後は次のようになりました。
```
user@HOST:~$ vim --version | head -5
VIM - Vi IMproved 9.0 (2022 Jun 28, compiled May 10 2022 08:40:37)
Included patches: 1-749
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
Huge version with GTK3 GUI.  Features included (+) or not (-):
```
以上です。

# 参考サイト

[^1]: [Vim -- Ubunt の vim を 8.1 から 9.0 に上げる](https://dev.to/kaede_io/vim-ubunt-no-vim-wo-81-kara-90-nishang-geru-38o5) および [How to Install Latest Vim 9.0 on Ubuntu Based Linux Distributions](https://itsfoss.com/install-latest-vim-ubuntu/) を主に参考にしました。

[^2]: [WSL上のLinuxで動かしているVimとクリップボードを連携させる](https://qiita.com/wheat311/items/6fa5db68c3a7762b52f5) でクリップボード連携について説明されています。

[^3]: [Windows Subsystem Linux - Make VIM use the clipboard?](https://superuser.com/questions/1291425/windows-subsystem-linux-make-vim-use-the-clipboard) の **MAY 2023 SOLUTION** というのを参考にしました。

[^4]: [Run Linux GUI apps on the Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps) にてX11の導入方法を参照しました。
せんせー、マイクロLEDってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、マイクロLEDってなに？

# マイクロLEDとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## マイクロLEDって何？

みんな、テレビやスマートフォンの画面で色んな絵や映画を見るのが好きですよね。
その画面を明るくして色々な色を出すためには、小さな光る点々がたくさんあるんです。
マイクロLEDは、とても小さな光る点のことを言います。

## どういうこと？

マイクロLEDは、普通のLEDよりもとっても小さい光る点なんです。
だから、画面はとても鮮明できれいに見えるし、色もとてもきれいに出るんです。

## どうしてそれがすごいの？

マイクロLEDのおかげで、私たちが見る画面がもっと明るく、色もリアルに見えるようになるんです。
そして、電池の持ちも良くなったり、薄くて軽くなったりするから、新しいデバイスが作れます。

## だから、マイクロLEDってなに？

マイクロLEDは、テレビやスマートフォンの画面をとてもきれいに見せるための、小さな光る魔法の点なんです。

# まとめ

このように、マイクロLEDは、私たちの生活の中で色々なデバイスの画面をきれいに見せるための
とてもすごい技術の一部なんです。
(rails)ActiveRecordとは

・ActiveRecordとはRuby on Railsフレームワークに組み込まれているオブジェクトリレーショナルマッピング（ORM）ライブラリです。ActiveRecordは、データベースとのやり取りを簡単にするための機能を提供します。
またActiveRecordはRuby on Railsの中核となる機能であり、開発者がデータベースを効果的に操作するための強力なツールです。データベースアクセスの抽象化や便利な機能の提供により、効率的な開発とメンテナンスが可能になります。

・ActiveRecordは、データベーステーブルと対応するモデルクラスを定義することでデータの永続化を行います。モデルクラスは、データベーステーブルのレコードをオブジェクトとして扱い、データの操作やビジネスロジックを表現するために使用されます。

・ActiveRecordでは、データベーステーブルとの関連付けやデータのクエリ、データの作成・更新・削除などの一般的なデータベース操作を簡単に行うことができます。また、ActiveRecordはテーブルのカラムとモデルの属性（アトリビュート）の対応付けを自動的に行うため、データベーススキーマの変更に柔軟に対応することができます。

・ActiveRecordはまた、アソシエーション（関連付け）やバリデーション（入力値の検証）、コールバック（イベントハンドリング）などの高度な機能も提供します。これにより、データベースとのやり取りにおいて一貫性のあるコードを記述することができます。

・例えば以下のコードは両方とも指定したテーブルに新しい行が追加されます。
SQL:`INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...)`
例文:`INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')`
ActiveRecord:`レコード変数 = テーブル名.new(カラム1: 値1, カラム2: 値2)`
例文:`user = User.new(name: 'John Doe', email: 'john@example.com')`
`user.save`
物申す：新卒エンジニアが企業を選ぶ基準について

現代社会において、エンジニアは企業や組織の成長を支える重要な役割を果たしています。そのため、新卒としての最初の一歩は非常に重要となり、適切な企業を選ぶことが将来のキャリアに大きく影響します。以下では、企業を選ぶ際の基準について詳しく解説します。

---

#### 1. 教育・研修の体制

**大企業のメリット**：
- 大企業は、経済的な余裕から教育・研修に相応の予算を割り当てています。これにより、新人エンジニアは幅広い技術やツール、業界のノウハウを学ぶことが可能です。
- 組織が大きいため、先輩エンジニアから直接的、また間接的な指導を受けることができます。

**ベンチャー企業の特色**：
- 教育体制が固定されていない場合が多く、自走力が求められます。しかし、それが逆に柔軟な学びのスタイルを築くチャンスともなり得ます。

---

#### 2. 業務の幅と深さ

**ベンチャー企業の魅力**：
- チームが小さく、多様な業務に携わることが期待されます。これにより、短期間で多方面の技術やツールに触れることができます。
  
**大企業の特色**：
- 一つのプロジェクトや分野に特化して、より深い知識や経験を積むことができます。専門性を高めるためのリソースや環境が整っています。
- 大企業では、沢山のプロジェクトが存在したり、様々なチャレンジプロジェクトが存在します。PLに左右されない形で、エンジニアとして様々なチャレンジをする事が可能です。

---

#### 3. キャリアの形成と将来性

- 豊富な教育環境が整っている大企業でのスタートは、エンジニアとしての基盤を強固にすることが期待できます。これは、高学歴や高収入の背景から来る恩恵に似ています。
- しかし、技術の基盤が整った後は、新しいチャレンジや経験の幅を求める場合、ベンチャー企業への移動も視野に入れると良いでしょう。

---

#### 4. 実体験からの考察
私は新卒で大企業のSIerに入ったけど、本当に色々と勉強させてもらった。その後、ベンチャーでCTOやっててもとっても役立った。新卒でのそういう経験は、２度と出来ないの重要だったと思います。

私自身の経験を踏まえると、新卒で大企業のSIerに入社したことで、多くの技術や業界知識を学ぶことができました。その後のベンチャーでのCTOとしての役割においても、その経験は計り知れない価値がありました。新卒時の選択は、後々のキャリア形成に大きな影響をもたらすので、慎重な選択が求められます。

---

### まとめ

新卒エンジニアが企業を選ぶ際には、教育環境、業務の幅と深さ、そして将来のキャリアパスを視野に入れることが必要です。それぞれの環境にはメリットとデメリットが存在しますので、自分の価値観や目指すキャリアを基に適切な選択をしてください。
せんせー、プラズマ技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、プラズマ技術ってなに？

# プラズマ技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## プラズマ技術って何？

みんな、テレビの中や空の雷の中に、きらきらと光るものがあるのを知っていますか。
それを「プラズマ」といいます。プラズマ技術は、このプラズマを使った特別な技術のことです。

## プラズマってどんなもの？

空気や水のように、物質にはいろいろな状態があります。
固い、液体、ガスという状態を知ってるよね？プラズマは、ガスがとっても高温になったときの特別な状態です。

## プラズマ技術で何ができるの？

プラズマを使うと、物をきれいにすることや、新しい材料を作ることができるんです。
たとえば、お医者さんが使う道具をきれいにしたり、特別な画面や電球を作ったりするのに使うことができます。

## だから、プラズマ技術ってなに？

プラズマ技術は、きらきら光るプラズマを使って、いろいろなものを作ったり、
きれいにしたりするための魔法のような技術なんです。

# まとめ

このように、プラズマ技術は、私たちの生活の中で色々なものを作ったり、きれいにしたりするためのとてもすごい技術なんです。
オブジェクトのレコードトリガフローの実行順序の定義


+ [オブジェクトのレコードトリガフローの実行順序の定義](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_trigger_order.htm&release=236&type=5)


トリガ順序値を指定して、同じオブジェクトの保存前フローまたは保存後フローの実行順序を決定します。別のフローの前または後に実行するようにフローを宣言的に設定します。フローを並び替えることで、過度に複雑なフローを作成せずに一貫性の高い結果を得られ、チームや論理的な所有者ごとに自動化を分割できます。

理由: オブジェクトの保存前または保存後レコードトリガフローでのみトリガ順序値を定義できます。たとえば、特定の保存後フローを優先して、ケースオブジェクトの他の保存後フローの前に実行できます。ただし、特定の保存後フローを優先して、保存前フローまたは Apex トリガの前に実行することはできません。複数のフローに同じトリガ順序値を設定できます。

方法: 保存前または保存後レコードトリガフローを保存するときに、1 ～ 2,000 のトリガ順序値を指定します。すでに保存されているフローの場合、フローのバージョンのプロパティでトリガ順序値を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/65ea37b4-5d78-149a-aed6-c54cb4a6d1a9.png)
せんせー、3Dバイオプリンティングってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、3Dバイオプリンティングってなに？

# 3Dバイオプリンティングとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## 3Dバイオプリンティングって何？

みんな、おもちゃのブロックを使って色んな形を作るのが好きですよね。
3Dバイオプリンティングは、特別な機械を使って、生きているもののブロックを作る技術です。

## どういうこと？

この特別な機械は、紙に絵を描くように、生きている細胞を層になるように積み重ねることができるんです。
それで、心臓や耳のような部分を作ることができます。

## どうしてそれがすごいの？

人々が病気や事故で体の部分を失ってしまったとき、
この技術を使って新しい部分を作ることができるかもしれないんだ。それは、本当にすごいことです。

## だから、3Dバイオプリンティングってなに？

それは、特別な機械を使って、生きているもののブロックを作る魔法のような技術なんです。

# まとめ

このように、3Dバイオプリンティングは、人々の生活をもっと良くするための、
とっても特別な魔法のような技術なんです。
Gitの差分ファイルのみzipにするWindowsバッチファイル

# 内容
「変更ファイルだけ指定した場所に納品して」のように言われた場合に使えるバッチファイルを作成しました。

検索すると、bash用のコマンド（git archiveとgit diffを組み合わせたもの）は見つかるのですが、Windowsのコマンドラインで同じことをするのは難しい為、今回作成したものです。

# 仕様
ファイルパスはダブルコーテーションで囲うようにしている為、ファイスパスにスペースが含まれていも正しく動作します。

また、差分ファイルの一覧を表示してくれる為、表示結果をコピペしてドキュメントやメールに貼ったりもできます。

バッチファイルをパスの通った場所に置き、以下のように使用します。

```shell
git_archive_diff.bat HEAD~1 HEAD archive.zip
```

上記の例では、HEAD~1とHEADの差分ファイルのみをHEADからgit achiveし、archive.zipという名前でカレントフォルダに保存します。

# git_arcive_diff.bat

以下のバッチファイルをパスの通った場所に置きます。

```batch:git_archive_diff.bat
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM コマンドライン引数のチェック
IF "%~1"=="" GOTO USAGE
IF "%~2"=="" GOTO USAGE
IF "%~3"=="" GOTO USAGE

REM 引数からの情報を変数にセット
SET START_COMMIT=%~1
SET END_COMMIT=%~2
SET OUTPUT_FILE=%~3

REM git diff で差分のファイル一覧を temp.txt に出力
git diff --name-only %START_COMMIT% %END_COMMIT% --diff-filter=ACMR > temp.txt

REM 差分ファイル一覧を表示
type temp.txt

REM ファイルからパスのリストを作成
SET FILELIST=
FOR /F "delims=" %%i IN (temp.txt) DO (
    SET FILELIST=!FILELIST! "%%i"
)

REM パスのリストを git archive に渡す
git archive %END_COMMIT% --output=%OUTPUT_FILE% %FILELIST%

REM 一時ファイルを削除
del temp.txt

GOTO END

:USAGE
echo Usage: %0 [start commit] [end commit] [output file]
echo Example: %0 HEAD~1 HEAD archive.zip

:END
```
オープンワカヤマ？和歌山県の3次元点群データの公開されていました。

# 和歌山県の3次元点群データの公開されていました


界隈では、「[オープンナガサキ](https://opennagasaki.nerc.or.jp/)」や「[PLATEAU](https://www.mlit.go.jp/plateau/)」、「兵庫県の高精度3次元データ」など3次元地図データが盛り上がっておりますが、実はこっそり和歌山県が3次元点群データを公開していました。

和歌山県によると、和歌山県内の65%にあたる地域の3次元点群データが公開されているようです。

https://www.pref.wakayama.lg.jp/prefg/012100/d00213012.html

ダウンロードはこちらから


https://wakayamaken.geocloud.jp/mp/22


一方で、[和歌山県公開のシェープデータ](https://qiita.com/tohka383/items/b10cdcc4d6d299130ab8)よろしく、担当者の理解不足か、DXやオープンデータ公開が目的になっているのか、非常に使いづらいデータになっております。


※公開されたことは本当に素晴らしいと思っておりますし、ご担当様も業務多忙な中、ご準備頂きありがとうございます。せっかく公開したのだから、たくさんの人に使ってもらいたく、素人ながら意見させて頂ければと存じます。



# 課題


* ライセンスが不明瞭
なんのライセンスが適用されているのかわからない。商用利用可なのか、不可なのか不明。つまり、オープンデータとも言いにくい。クレジットは必要みたい。
CC BY 4.0など、ライセンスの明記が必要。

* 仕様が不明
テキストデータのため、どのカラムになんのデータがあるのか推測するしかない。
仕様書等があればもっと扱いやすいと思う。

* 測地系もわかりにくい
「平面直角座標系」との記載がある。界隈に詳しい人ならわかると思うが、もう少し詳しく書いてあげた方がよいのでは。

# データ仕様（推測含む）

* 測地系:日本測地系2011（JGD2011）VI系 epsg:6674

* ライセンス:
「（点群データについて）データをパソコンにダウンロードして、申請なしにご利用いただけますが、出典の記載をお願いします。」

* データの種類
地表データ（DSM)、グラウンドデータ（DEMデータ）
航空レーザー測量のデータ


* データ形式
txt形式、各カラムはID？,x座標,y座標,標高値
文字コードはUTF-8

# まとめ
これらを使ってどんどん遊んで行きたいと思いますので、公開してくださりありがとうございます。

#やっぱり、オープンデータ先進県である、静岡県はすごいなぁ

https://www.geospatial.jp/ckan/dataset/virtual-shizuoka-mw

# 参考
https://opennagasaki.nerc.or.jp/


https://web.pref.hyogo.lg.jp/kk26/hyogo-geo.html

https://www.mlit.go.jp/plateau/
ターミナルでdquote> が出てきて入力ができなくなった

# はじめに
Githubにxcodeの情報をアップロードしようと、ターミナルを操作していたところ、急に dquote> が表示され、以下のように何も入力ができない状況になりました。
![スクリーンショット 2023-08-21 9.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485517/015c3e07-3eb0-015a-7aeb-22d9c5d8e1d0.png)

# 原因
直前の入力で、「"」（ダブルクォーテーション）でしめなかったことが原因だったようです。
ちなみに、dquote は double quotation 略のこと。

# 解決策
「Ctrl + g」で直前のコマンドを破棄すると、もう一度入力ができるようになりました。
![スクリーンショット 2023-08-21 9.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485517/0f2b1e0e-025b-d050-efad-f58596376fc4.png)

次は最後に「"」をつけたら問題なくコミットできました。
certbot で作成した証明書が保存されている /etc/letsencrypt 配下について

# 背景
certbot で作成された証明書が保存されている `/etc/letsencrypt` 配下の各種ファイル・ディレクトリの内容をちゃんと理解していなかったので。

# ファイル・ディレクトリ階層
- 証明書取得対象のドメイン名を `www.example.com` とする。
- 証明書を発行して、まだ一度も更新していない場合とする。

```
/etc/letsencrypt
├── accounts
│   └── acme-v02.api.letsencrypt.org
│       └── directory
│           └── <md5 ハッシュ値>
│               ├── meta.json
│               ├── private_key.json
│               └── regr.json
├── archive
│   └── www.example.com
│       ├── cert1.pem
│       ├── chain1.pem
│       ├── fullchain1.pem
│       └── privkey1.pem
├── live
│   ├── README
│   └── <ドメイン名>
│       ├── README
│       ├── cert.pem -> ../../archive/www.example.com/cert1.pem
│       ├── chain.pem -> ../../archive/www.example.com/chain1.pem
│       ├── fullchain.pem -> ../../archive/www.example.com/fullchain1.pem
│       └── privkey.pem -> ../../archive/www.example.com/privkey1.pem
├── renewal
│   └── www.example.com.conf
└── renewal-hooks
    ├── deploy
    ├── post
    └── pre
```

# /etc/letsencrypt/accounts
Let's Encrypt のアカウントに関する情報が保存される。
- `meta.json`: アカウント作成の日時と、アカウント作成を実行したホスト名が記載されているファイル。
- `private_key.json`: certbotがACMEサーバーと通信する際に利用する JSON Web Key(JWK) 形式のキーのファイル。
- `regr.json`: アカウントのURIが記載されたファイル。

# /etc/letsencrypt/live
certbotが作成した証明書が配置されるディレクトリである。
ドメイン別のディレクトリが作成され、その中に証明書が配置される。

実際には `/etc/letsencrypt/archive` 配下の証明書へのシンボリックリンクとなっており、証明書更新の度にシンボリックリンクが更新される。

# /etc/letsencrypt/archive
これまでに作成した証明書全ての実体が配置される。
`live` ディレクトリと同様に、ドメイン別のディレクトリが作成され、その中に証明書が配置される。

証明書更新の度に、ファイル末尾の数字がインクリメントされた証明書が作成される。（例:`cert1.pem`→`cert2.pem`）
過去分の証明書はそのまま残る。


# /etc/letsencrypt/renewal
certbotが証明書更新の際に参照する更新設定ファイル `<ドメイン名>.conf` が配置される。
# /etc/letsencrypt/renewal-hooks
`pre`,`post`,`deploy` 配下のディレクトリに実行ファイルを置くことで、`renew` サブコマンドによる証明書更新時に任意の処理を実行することができる。

- `pre` に配置した場合: 証明書更新処理を始める前に実行される。
- `post` に配置した場合: 証明書更新処理が終わった後に実行される。
- `deploy` に配置した場合: 正常に証明書が更新された場合、更新された証明書毎に実行される。（2つ更新された場合、それぞれで1回、計2回実行される。）

各ディレクトリ配下のファイルは、アルファベット順に実行されるらしい。
参考：https://eff-certbot.readthedocs.io/en/stable/using.html#renewing-certificates
【AWS】 EC2インスタンスへElastic IP再紐付けの自動化

Elastic BeanstalkのAmazon EC2インスタンスで動作するアプリケーションは、一部のサードパーティのAPIや外部サービスの制約により、承認された固定IPを使用する必要がある場合があります。このような場合、Elastic IPを使用すると、EC2インスタンスに直接静的IPを割り当てることができます。

しかし、Elastic Beanstalkの更新過程でEC2インスタンスが新しいインスタンスに置き換えられると、割り当てられたElastic IPが自動的に解除されるという問題が発生します。これにより、接続が切断されたり、動作が不安定になることがあります。この問題を解決する方法の一つは、既存のElastic IPを自動的に新しいEC2インスタンスに再割り当てすることです。

本ポストでは、単一インスタンスでこのような自動化された再割り当て方法について簡単に説明します。

# プロセス
1. Elastic IPの割り当てIDの取得: 使用したいElastic IPの割り当てIDをElastic Beanstalkの環境変数から取得します。
2. 現在のEC2インスタンスIDの取得：次に、AWSの内部メタデータサービスを使用して、現在のEC2インスタンスIDを取得します。
3. リージョン設定：AWSのリージョンをap-northeast-2に設定します。
4. Elastic IPの再割り当て：Elastic IPがまだ該当のAmazon EC2インスタンスに割り当てられていない場合は、再割り当てを行います。

以下は、新しいEC2インスタンスにElastic IPを自動的に再割り当てするためのBashスクリプトです。

```sh
# platform/hooks/postdeploy/eip-to-ec2.sh
#!/bin/bash

# ELASTIC_IP_ALLOCATION_IDはElastic Beanstalkの環境変数
ALLOCATION_ID=$(/opt/elasticbeanstalk/bin/get-config environment -k ELASTIC_IP_ALLOCATION_ID)

CURRENT_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

echo "Setting region to ap-northeast-2"
aws configure set region ap-northeast-2

echo "Checking if Elastic IP with ALLOCATION_ID[$ALLOCATION_ID] is allocated to any EC2 instance"
ALLOCATED_INSTANCE_ID=$(aws ec2 describe-addresses --filters "Name=allocation-id, Values=$ALLOCATION_ID" --query Addresses[].InstanceId --output text)

if [ "$CURRENT_INSTANCE_ID" != "$ALLOCATED_INSTANCE_ID" ]; then
    echo "Running: aws ec2 associate-address --instance-id $CURRENT_INSTANCE_ID --allocation-id $ALLOCATION_ID --allow-reassociation"
    aws ec2 associate-address --instance-id $CURRENT_INSTANCE_ID --allocation-id $ALLOCATION_ID --allow-reassociation
else
    echo "CURRENT_INSTANCE_ID[$CURRENT_INSTANCE_ID] and ALLOCATED_INSTANCE_ID[$ALLOCATED_INSTANCE_ID] is the same instance. No need to reassign Elastic IP"
fi
```

このスクリプトを実装することで、アプリケーションが必要な固定IP設定を維持し、IP変更によるサービス中断の可能性を最小限に抑えることができます。

# 参考文献
- [AWS - プラットフォームスクリプトツール](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/custom-platforms-scripts.html)
- [AWS - インスタンスメタデータの取得](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)
Laravelにおけるハッシュ関数bcrypt()について

## 1. はじめに

Laravelでハッシュ関数を利用する際、`bcrypt()`を使っています。具体的にどういう処理が走っているのか、セキュリティに問題ないのかが気になり調べてみました。

## 2. 対象読者

- Laravelを使った開発者
- 暗号やセキュリティに興味がある方

## 3. 目次
- [1. はじめに](#1-はじめに)
- [2. 対象読者](#2-対象読者)
- [3. 目次](#3-目次)
- [4. バージョン](#4-バージョン)
- [5-1. `bcrypt()`について](#5-1-bcryptについて)
- [5-2. 内部処理](#5-2-内部処理)
- [6. さいごに](#6-さいごに)
- [7. 参考サイト](#7-参考サイト)

## 4. バージョン

- Laravel 9.x

## 5-1. `bcrypt()`について

`bcrypt()`はヘルパ関数の1つです。

概要と使い方は[日本語訳されたLaravelドキュメント](https://readouble.com/laravel/9.x/ja/helpers.html?header=bcrypt()%60%2520%7B.collection-method%7D#method-bcrypt)に記載があります。

>`bcrypt`関数はBcryptを使用して指定された値をハッシュします。この関数は、`Hash`ファサードの代わりに使用できます。
>`$password = bcrypt('my-secret-password');`

## 5-2. 内部処理

では実際に内部処理について見ていきます。

まず`bcrypt()`の定義は下記となります。

https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/helpers.php#L204

```php
function bcrypt($value, $options = [])
{
    return app('hash')->driver('bcrypt')->make($value, $options);
}
```

ドキュメントの記載の通りの処理であることが分かります。

実装では`make()`メソッドを呼び出しているので、`make()`メソッドは下記となります。

https://github.com/laravel/framework/blob/9.x/src/Illuminate/Hashing/BcryptHasher.php#L45

```php
public function make($value, array $options = [])
{
    $hash = password_hash($value, PASSWORD_BCRYPT, [
        'cost' => $this->cost($options),
    ]);

    if ($hash === false) {
        throw new RuntimeException('Bcrypt hashing not supported.');
    }

    return $hash;
}
```

上記の実装を確認すると、`password_hash()`を使っていることが分かります。
こちらはPHPの組み込み関数です。

https://www.php.net/manual/ja/function.password-hash.php

```php
password_hash(string $password, string|int|null $algo, array $options = []): string
```

ドキュメントの例のように`bcrypt('my-secret-password');`に使用する場合は、`password_hash()`を`$algo=PASSWORD_BCRYPT`で使うことを意味します。動作としては、PHPのドキュメントを抜粋します。

>PASSWORD_BCRYPT - CRYPT_BLOWFISH アルゴリズムを使ってハッシュを作ります。これは標準の crypt() 互換のハッシュで、識別子 `"$2y$"` を使った場合の結果を作ります。 その結果は、常に 60 文字の文字列になります。失敗した場合に false を返します。

また、`options`を省略した場合の動作は下記となります。
>省略した場合は、パスワードをハッシュするたびに password_hash() がランダムなソルトを自動生成します。これは意図したとおりの操作モードです。

これより、ランダムなソルトが自動生成されるので**レインボーテーブル攻撃**に対して有効だと考えられます。

## 6. さいごに

調べてみると`bcrypt()`は複雑な処理をしているのではなく、組み込み関数である`password_hash()`を呼び出していました。また、ハッシュされた文字列に対する攻撃の1つであるレインボーテーブル攻撃に対しても有効であることが分かりました。

ハッシュに関してLaravelでは他にもサポートしているアルゴリズムがありますので、時間があるときに調べてみたいと思います！

## 7. 参考サイト

- [ハッシュ 9.x Laravel](https://readouble.com/laravel/9.x/ja/hashing.html)
- [PHP: password_hash - Manual](https://www.php.net/manual/ja/function.password-hash.php)
スマホの乗り換えに関連して知識を習得したい

使っているスマホの機種変更と乗り換えをしようしようと思いつつ知識がないため面倒くさがってしまい、ついにiOSサポートが終了してしまったので今やっと動いています。

この際、次乗り換えするときにまた億劫にならないようにやることをメモしておきたい、そして乗り換えに乗じてインターネットに関する知識を習得したいと思い、学んだことや乗り換えの手順について書いてみます。(2023/08/21現在、まだ乗り換え完了していないので途中までしか書いていません:hushed:)
初期レベルで浅い知識で書いているので、随時修正していきたいと思います:writing_hand:

## そもそも携帯を使うときってなぜ契約が必要なの？
私たちはスマートフォンを使ってインターネットを利用したり、電話をしたりしています。これらを利用するために必要なのが、回線です。携帯電話会社は、携帯電話回線を通じてインターネットなどを利用できるように整えてくれます。なので、スマホを使いたい！となったらまず携帯電話会社と契約をする必要があります。いわゆるモバイルデータ通信のこと。


## 乗り換えと機種変更の違い
乗り換え⇒今契約している携帯電話会社との契約をやめて、別の携帯電話会社と新たに契約を結んで携帯電話を利用すること

機種変更⇒今契約している携帯電話会社と契約したまま別の携帯電話を買って利用すること

「機種変更」だけをするとなるとそれほど難しくないが、「乗り換え」もするとなったらちょっと難しい:frowning2:


## 乗り換え時に必要なこと

### MNP(Mobile Number Portability:携帯電話番号の持ち運び)手続き
MNPとは携帯の電話番号を変えることなく回線業者を乗り換えられる仕組みのこと。

**なぜ電話番号を引き継ぎたいときに必要なの？**
携帯電話の番号は、090-〇〇〇〇-〇〇〇〇などの11桁の番号で作られているが、最初の7桁までを見れば使用しているキャリア(携帯電話会社)がどこか分かるようになっている。つまり契約先によって電話番号が割り振られているので通常は契約先が変われば電話番号に書いてある情報も古いものになるので利用できなくなる。それが困る！という場合に、MNPの手続きをすることで移転元の携帯電話会社が移転先の携帯電話会社に対して電話番号情報を渡してくれてそのあとも利用できるようになる。

### SIM(Subscriber Identity Module:契約者を確認する部品)カードの入れ替え
SIMカードとは契約者の情報(電話番号やメールアドレス、固有のID番号)を記録したもので、これによって電話やインターネット、メールなどのやり取りが行えるようになる。

**インターネット利用にSIMカードが必要なの？**

>皆さんがお持ちのスマホを操作すると、利用中の携帯電話会社の電波以外に他の会社の電波も受信しているのが見えます。スマホは電源が入るとあたりに飛び交っている電波をいったん、全部受信するのです。
>電波には「PLMN」という情報が含まれているのですが、SIMはその情報を頼りに「自分がどの電波を使えば良いのか」というのを判断しています。そういうプログラムがSIMに書き込まれているんですね。
>
https://bicsim.com/column/special/180622093446.html#:~:text=%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%82%84%E9%9B%BB%E8%A9%B1,SIM%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AA%E3%82%93%E3%81%A7%E3%81%99%E3%82%88%E3%80%82



つまり、「誰が」「どの携帯電話会社の電波を使って」インターネット利用をするかを「記録」してくれているのがSIMカードで、その情報を差し込むことでスマホはインターネットを使えるように動いてくれるということ。


## ここまで
今はMNP予約番号を取得して、新たな携帯電話会社と契約を結びSIMカードを待っている状態なのでここまでです。また進んだ段階で随時更新いたします。
最終目標は、私と同じくスマホに関して疎い両親が、次回スマホの機種変更と乗り換えをするときにこの記事を読んでとりあえず何をしたらいいのか分かってくれることなので、もう少し丁寧に書いていきたいと思います！

## 参照
[インターネットと契約](https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/service/14.html)
[MNPの歴史](https://www.benefon.com/mnp-knowledge/mnp-history)
[MNPの仕組み](https://simchange.jp/mnp-mechanism-mvno/)
[SIMカードとは](https://hikkoshizamurai.jp/soldi/articles/ko-sim-card-basic-knowledge/)
[SIMカードとインターネット](https://bicsim.com/column/special/180622093446.html)
Ubuntuが起動しないときの対処法

NVIDIA GPUがある環境でUbuntu22.04をインストールしたら起動画面で固まってしまったので修復方法を共有したいと思います。

## 各パートで共通のこと
紹介するコマンドはリカバリーモード起動したroot環境で実行することを想定しています。

**リカバリーモードの入り方**
1. 電源押したらshift連打
2. networkをenterインターネットを有効にする。
3. rootをenterして選択する。
4. またenterしてshellに入る

**まず初めに**
`apt update`と`apt upgrade`はすると良いと思います
 

## mtd device must be supplied (device name is empty)

```bash
apt install --reinstall ubuntu-desktop
```
👇心配性な人へ
```bash
apt purge ubuntu-desktop
apt install ubuntu-desktop
```


## dev/sda1: clean, 1578871/3532952 files, 532523/52352525 blocks
👆ここら辺の数字は適当。環境によって違うはず。

```bash
apt purge nvidia*
ubuntu-drivers autoinstall
```

## ACPI error 

```bash
vim /etc/default/grub
```

`GRUB_CMDLINE_LINUX_DEFAULT`変数に`loglevel=3`を追加する。
```
GRUB_CMDLINE_LINUX_DEFAULT='quiet splash loglevel=3'
```

編集したら以下を実行
```
update-grub
```
Cloudflare Pages,Next.jsのApp Router Dynamic Routesで本番環境だけtxtファイルが表示されるときの対処法

# 実行環境
- Next.js 13.3.1
- Cloudflare Pagesにdeploy

# 発生したこと

## Dynamic Routesの設定
```
app
├── articles
│   └── [target_date]
│       └── page.tsx
├── favicon.ico
├── globals.css
├── layout.tsx
└── page.tsx
```

## ローカルと本番環境の挙動の違い

### ローカル
```
https://example.pages.dev/articles/2023-08-20
```
- ローカルの開発環境では問題なく見れている


### 本番（Cloudflare pagesのプレビュー環境）

- Cloudflare pagesのプレビュー環境でDynamic Routesで設定したurlにアクセスすると拡張子txtが追加されてしまい、Page not foundになる

```
https://example.pages.dev/articles/2023-08-20.txt
```

# 原因
ちゃんと調査していないので間違っているかもしれません。
- Cloudflare PagesではServer Side Renderingするときは何か特別な設定が必要？or そもそもSSRができない
    - issue見ても解決策ない？
        - https://github.com/cloudflare/next-on-pages/issues/32
    

![CleanShot 2023-08-21 at 07.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26043/1be0ede2-a36c-bfd9-9621-0f5e6b5911ae.png)
- スクショはCloudflare Pagesのビルドログ
- Dynamic RoutesはServer Side Rendering


```
22:42:42.150	▲  λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerSideProps)
22:42:42.150	▲  ○  (Static)  automatically rendered as static HTML (uses no initial props)
```
- λはSSR、○ は静的生成の意味



# 対処法
- Next.jsのGenerating Static Paramsを使ってDynamic Routesにおいても事前にパラメータがわかっている場合は静的生成をする
    - https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes#generating-static-params


```typescript:app/[target_date]/page.tsx

export async function generateStaticParams() {
    // "2023-08-20", "2023-08-19", "2023-08-18"だけ静的生成
  return ["2023-08-20", "2023-08-19", "2023-08-18"].map((d) => ({
    target_date: d,
  }));
}
export default async function Page({ params }: Props) {
  const { target_date } = params;
  return (
    <p>{targe_date}</p>
  );
}
```


![CleanShot 2023-08-21 at 07.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26043/63430439-e048-5009-aeb3-f20450a69e1f.png)
- スクショはCloudflare Pagesのビルドログ
- "2023-08-20", "2023-08-19", "2023-08-18"だけ静的生成されていることがわかる
ディスク容量がひっ迫してきたので消せるファイルがないか調べてみた

まずはどれぐらいひっ迫しているか確認。
**\# df -h**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/5698da7b-39c5-2460-f325-f256874575e2.png)

73%。。。使用率80%でアラート上がるようにしてあるので少し下げたい。
**\# du -d1 -h /**
※ケースにもよるが「find」より「du」を使う事が多い。こっちで慣れているだけの気もする。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/8a8de750-b19e-b3e1-3119-b2915a007626.png)

/varの中が少し大きい気がする。不要なログとかが多分ありそう。
**\# du -d1 -h /var**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/23410a9a-f2f8-7013-e326-99bb46da3077.png)

ログ以外にキャッシュが多い。。。
**\# du -d1 -h /var/cache**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/34af917b-1110-f2b5-bbd1-3da2ad2cd5aa.png)

なるほど。yumのキャッシュが消せそう。
ログは？
**\# du -d1 -h /var/log**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/2855793b-419e-5aa6-be93-14c468ced683.png)

journalログが大きめ。上限を100Mに設定する事にする。
なので、まずは
yumキャッシュクリア↓
**\# yum clean all**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/b31c068e-9a82-1c29-7ad9-362d4f316ab6.png)

続いてjounalログの上限設定↓
**\# vi /etc/systemd/journald.conf**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/de78bdec-1159-2f30-09a2-bb8e21834b69.png)
変更前↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/268a4242-3ca3-ce03-035d-768838948f75.png)
変更後↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/e1642fcc-6e00-7124-87b4-307f23afb5b7.png)
サービスを再起動する。
**\# systemctl restart systemd-journald**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/e4e3d727-a5b5-3828-b5e1-6fbef3e8f8e2.png)


ディスク使用量が73%→61%になった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/b663ab3b-0471-9bc8-0ed4-823bf4f911e0.png)
以上
wslでelixir その41

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
ectoで、小遣い帳アプリを作れ。

# サンプルコード

```
defmodule Kozu do
	def insert(a, b, c, d) do
		e = 0
		f = 0
		if c == "+" do
			{e, _} = Integer.parse(d)
			p = %Friends.Kozu{adate: Date.from_iso8601!(a), memo: b, inp: e, oup: f}
			Friends.Repo.insert(p)
		else
			{f, _} = Integer.parse(d)
			p = %Friends.Kozu{adate: Date.from_iso8601!(a), memo: b, inp: e, oup: f}
			Friends.Repo.insert(p)
		end
	end
	def update(n, a, b, c, d) do
		{id, _} = Integer.parse(n)
		p = Friends.Repo.get(Friends.Kozu, id)
		e = 0
		f = 0
		if c == "+" do
			{e, _} = Integer.parse(d)
			o = Ecto.Changeset.change(p, %{adate: Date.from_iso8601!(a), memo: b, inp: e, oup: f})
			Friends.Repo.update(o)
		else
			{f, _} = Integer.parse(d)
			o = Ecto.Changeset.change(p, %{adate: Date.from_iso8601!(a), memo: b, inp: e, oup: f})
			Friends.Repo.update(o)
		end
	end
	def delete(n) do
		{id, _} = Integer.parse(n)
		p = Friends.Repo.get(Friends.Kozu, id)
		Friends.Repo.delete(p)
	end
	def list() do
		import Ecto.Query, only: [order_by: 2]
		IO.puts(" id  date 内訳　貰ったお金　使ったお金　残金")
		Friends.Kozu
		|> Ecto.Query.order_by(asc: :adate)
		|> Friends.Repo.all()
		|> Enum.reduce(0, fn v, acc ->
			acc = v.inp - v.oup + acc
			IO.puts(" #{v.id}  #{v.adate}  #{v.memo}  #{v.inp}  #{v.oup}  #{acc}")
			acc
		end)
	end
	def run() do
		l = IO.gets("> ")
		l = String.replace(l, "\n", "")
		s = String.split(l, " ")
		cond do
		Enum.at(s, 0) == "in" ->
			Kozu.insert(Enum.at(s, 1), Enum.at(s, 2), Enum.at(s, 3), Enum.at(s, 4))
		Enum.at(s, 0) == "del" ->
			Kozu.delete(Enum.at(s, 1))
		Enum.at(s, 0) == "up" ->
			Kozu.update(Enum.at(s, 1), Enum.at(s, 2), Enum.at(s, 3), Enum.at(s, 4), Enum.at(s, 5))
		Enum.at(s, 0) == "disp" ->
			Kozu.list()
		true ->
			IO.inspect(l)
		end
		run()
	end
end



```

# 実行結果

```
Interactive Elixir (1.13.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Kozu.run
> disp
 id  date 内訳　貰ったお金　使ったお金　残金

07:31:59.863 [debug] QUERY OK source="kozu" db=18.8ms decode=3.2ms queue=2.4ms idle=1005.1ms
SELECT k0."id", k0."adate", k0."memo", k0."inp", k0."oup" FROM "kozu" AS k0 ORDER BY k0."adate" []
 4  2023-08-01  棚卸  1100  0  1100
 5  2023-08-04  アイス  0  100  1000
> in 2023-08-05 ジュース - 110
>
07:32:49.872 [debug] QUERY OK db=45.0ms queue=1.3ms idle=1830.4ms
INSERT INTO "kozu" ("adate","inp","memo","oup") VALUES ($1,$2,$3,$4) RETURNING "id" [~D[2023-08-05], 0, "ジュース", 110]disp
 id  date 内訳　貰ったお金　使ったお金　残金

07:32:54.011 [debug] QUERY OK source="kozu" db=10.3ms queue=0.4ms idle=977.4ms
SELECT k0."id", k0."adate", k0."memo", k0."inp", k0."oup" FROM "kozu" AS k0 ORDER BY k0."adate" []
 4  2023-08-01  棚卸  1100  0  1100
 5  2023-08-04  アイス  0  100  1000
 6  2023-08-05  ジュース  0  110  890
>

```

以上。
死んでも破壊的操作をしない

エンジニアが学ぶべきスキルやノウハウは数多くありますが、その中でもとくに重要だと感じるものとして「破壊的操作」の回避が挙げられます。

## 破壊的操作とは？

この記事における「破壊的操作」とは、コーディングにおける次のようなものを指しています。

- ある関数に渡した引数(参照渡しされた引数)の中身が変わってしまうこと
- setterメソッドにより、そのオブジェクトが持つ変数の中身が変わってしまうこと
- 配列の要素が変わってしまうこと

## 破壊的操作とは「想定していない変更」である

では、なぜ破壊的操作をしてはいけないのでしょうか。

私の言葉で説明するなら、**破壊的操作は「想定していない変更」だから**です。

たとえば次のようなコードを、作者以外が読んだとします[^1]。

**コードを読んでいる人物の心の声**を書いてみましょう。

### 実例1

:::note warn
以降の実装例は、読みやすさを考慮してコードを省略しています。
そのまま実行してもエラーになることをご容赦ください。
:::

```python
user = User(name="コボリ アキラ")
# 心の声「ここでUserインスタンスが作成されるのか。名前は半角スペースつきで入っている」

# 10行程度の処理...

user.remove_half_space() # ここで半角スペースを取り除く「破壊的操作」がある

# 10行程度の処理...

print(user.name) # -> コボリアキラ
# 心の声「あれ？　なんで半角スペースがないんだ？　コンストラクタで取り除いてる訳でもないぞ？」
```

コードを書いた人にとっては自明です。わざわざ`removeHalfSpace`とまで書いているのですから。

しかし読んでいる人が気づくかは別です。

そしてこのような破壊的があることがわかると、コードを読む側は「インスタンスの中身は最後までわからない。つまり**コードをすべて読まないかぎりは、このインスタンスの中身は確定しないのだ**」と学習します。

「想定していない変更」があることで、プロダクトを理解するための労力は一気に跳ね上がります。

### 実例2 

同じく「引数が変わった場合」も見てみましょう。

```python
def print_user(user: User):
    """ 半角スペースを取り除いてから出力する """
    user.remove_half_space()
    print(user.name)

user = User(name="コボリ アキラ")
# 心の声「ここでUserインスタンスが作成されるのか。名前は半角スペースつきで入っている」

# 数10行の処理...

print_user(user) # print_userメソッド内で、半角スペースを取り除く「破壊的操作」があり、userインスタンスにも影響する

# 数10行の処理...

print(user.name) # -> コボリアキラ
# 心の声「あれ？　なんで半角スペースがないんだ？　 print_userでuserを渡しただけなのに......」
```

こちらの例は、コードを書いた人でもいずれ思い出せないような破壊的操作になりそうです。

もちろんコードを読めば、何が起きているかはわかります。そして今後の開発においても、**まずすべてのコードを読まないとコードを書き始めるなんて怖くて仕方なくなる**でしょう。

## 死んでも破壊的操作をしないために

もちろんパフォーマンスの観点や限定的な影響だと許容して破壊的変更を使うことはあります。

しかし原則としては破壊的操作をするべきではないでしょう。名著『良いコード／悪いコードで学ぶ設計入門』でも「**デフォルトは不変に**」と述べらています。[^2]

それでは破壊的操作をしないためにどうすればよいでしょう。

### 破壊的操作ではなく「あたらしく宣言」もしくは「再代入」する

覚えておきたい解決方法は、次のような工夫です。

```python
class User:
    name: str

    def remove_half_space(self):
        """ 半角スペースを取り除いたあとのuserインスタンスを返却する """
        name = self.name.replace(" ", "")
        return User(name=name)

user = User(name="コボリ アキラ")

# 数10行の処理...

user_with_removed_half_space = user.remove_half_space()

# 数10行の処理...

print(user.name) # 当然userインスタンスの中身は変わらない
```

上記のようにすることで、破壊的操作はいかようにでも防ぐことができます。

`user_with_removed_half_space`が気に入らなければ、状況に応じては`user`として再代入することも許されるでしょうか。

### 破壊的操作ができるようなメソッドをつくらない

自身が「破壊的操作をしないようになった」としても、すべてのエンジニアがそうとは限りません。そのため破壊的操作ができるようなメソッドの用意も避けましょう。

よくあるのは「**容易にgetter/setterをつくらない**」ことでしょうか。

自身はsetterを使わないと決めているが、組織の暗黙的な文化で「すべてのクラスにgetter/setterを設ける」みたいなルールがあったとすれば、これは根深い問題になりえます。

## まとめ

ちょっと挑発的なタイトルで[^3]、個人的に重要だと感じるコーディングのルールを書いてみました。

最近では言語仕様の変化もあって「当たり前」になってきたようにも見えますが、あらためて自身の理解のために記事として残してみました。

[^1]: 現実的な例がパッと思いつかず、とりあえずこのような例にしてみました。よろしければ「こういう例があった」みたいなことを教えていただけたらとても幸いです。

[^2]: 仙場大也『良いコード／悪いコードで学ぶ設計入門―保守しやすい　成長し続けるコードの書き方』、p52。

[^3]: 『死んでも床にモノを置かない』がネタ元。
UIImageにモザイクを入れる方法

UIImageにモザイクを適用する場面があったため、備忘録として残しておきます。

# 実装
```Swift
public extension UIImage {
    func mosaic(_ scale: Float) -> UIImage {
        guard let filter = CIFilter(name: "CIPixellate"),
              let ciImage = CIImage(image: self)
        else {
            return self
        }

        filter.setValue(ciImage, forKey: kCIInputImageKey)
        filter.setValue(scale, forKey: kCIInputScaleKey)

        guard let outputImage = filter.outputImage else {
            return self
        }

        return UIImage(ciImage: outputImage)
    }
}
```
また、このような実装だと、画素数が異なるとモザイクの精度まで異なってしまいます。
そこで、画素数が変化してもモザイクの精度が変わらないように細工します。

```Swift
public extension UIImage {
    func mosaic(_ scale: Float) -> UIImage {
        guard let filter = CIFilter(name: "CIPixellate"),
              let ciImage = CIImage(image: self)
        else {
            return self
        }

        filter.setValue(ciImage, forKey: kCIInputImageKey)
        filter.setValue(Float(size.width) * scale / 1000, forKey: kCIInputScaleKey)

        guard let outputImage = filter.outputImage else {
            return self
        }

        return UIImage(ciImage: outputImage)
    }
}
```
1000で割っていますが、ここは自分で調整してください。

## 使用方法
```Swift
let image = UIImage(named: "hoge")?.mosaic(50)
```
このようにモザイクを適用できていることがわかります。
![IMG_E62B62F772B9-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627061/2eaca28e-a8b8-8a8c-94d9-07e79f007ea3.jpeg)

# 注意
CIImageはSwiftUIでは使用できません！！
SwiftUIで使用したい場合はこのようにUIImageViewをSwiftUIでWrapして使用しましょう.

```Swift
public struct UIImageViewWrap: UIViewRepresentable {
    // BindingにしないとupdateUIViewが呼ばれない
    @Binding var image: UIImage

    public init(image: Binding<UIImage>) {
        self._image = image
    }

    public func makeUIView(context: Context) -> UIView {
        let view = UIView(frame: .zero)
        let imageView = UIImageView(image: image)
        imageView.contentMode = .scaleAspectFit

        imageView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(imageView)

        NSLayoutConstraint.activate([
            imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            imageView.topAnchor.constraint(equalTo: view.topAnchor),
            imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        ])

        return view
    }

    public func updateUIView(_ uiView: UIView, context: Context) {
        if let imageView = uiView.subviews.compactMap({ $0 as? UIImageView }).first {
            imageView.image = image
        }
    }
}
```
せんせー、アートメイク衛星ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、アートメイク衛星ってなに？

# アートメイク衛星とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## アートメイク衛星って何？

みんな、空に浮かぶ星や月を知ってますよね。
衛星は、地球のまわりをぐるぐる回る小さな「宇宙のお友達」みたいなものです。
そして「アート」とは、絵や音楽のような、きれいや楽しいものを作ることを指す言葉です。

だから、アートメイク衛星とは、宇宙のお友達が空の中できれいなショーを作ったり、
特別な光を出したりするものかもしれないです。

## それはどうしてすごいの？

地球の上から宇宙を見ると、星や月だけでなく、人々が作った特別なショーも楽しめるんです。
夜空がもっときれいになるかもしれないです。

## だから、アートメイク衛星ってなに？

それは、宇宙のお友達が空で私たちに特別なショーを見せてくれるものなんです。

# まとめ

もし「アートメイク衛星」に特定の情報やコンセプトがある場合、その詳細を教えていただけると、さらに正確な説明を試みることができます。
せんせー、ニューロプロステティクスってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ニューロプロステティクスってなに？

# ニューロプロステティクスとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ニューロプロステティクスって何？

「ニューロプロステティクス」は、特別な道具のことを指す言葉です。
この道具は、人の体や脳とコンピュータをつなげることで、体の動きを助けたり、感じることを助けたりするんです。

## どんな特別な道具？

例えば、手や足を失った人が、新しい手や足をつけることができる道具です。
でも、これはただの手や足じゃないんです。脳の命令を受け取って動く、特別な手や足なんです。

## どうやって動くの？

この道具は、人の脳からの信号をキャッチして、それを使って動くんです。
だから、自分の思い通りに、新しい手や足を動かすことができます。

## それはどうしてすごいの？

この技術があると、手や足がない人でも、また動くことができるようになります。
バスケットボールをしたり、走ったり、日常生活のことをするのがもっと簡単になります。

## それはどうして大切なの？

人々が困難に直面しても、また普通の生活を送ることができるようにするために、
新しい道具や技術を作ることはとても大切なんです。

# まとめ

このように、ニューロプロステティクスは、人の脳と新しい体の部分をつなげて、
人々が普通の生活を送ることができるようにする、とってもすごい技術なんです。
せんせー、柔軟性エレクトロニクスってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、柔軟性エレクトロニクスってなに？

# 柔軟性エレクトロニクスとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## 柔軟性エレクトロニクスって何？

みんな、ゴムのように伸びるものや、布のように柔らかいものが好きですよね
「柔軟性エレクトロニクス」は、そういう柔らかいものに、電気の力を持たせた特別なものです。

## どんな特別なもの？

例えば、腕に巻くことができるテレビや、曲げることができる電話のようなものです。
普通の硬い電気のものとは違って、これは柔らかくて曲げたり、伸ばしたりできるんです。

## どうやって作るの？

科学者のおじさんやおばさんが、特別な材料を使って、電気を通すことができる柔らかいものを作っているんです。
それはちょっと、魔法のように見えるかもしれないです。

## それはどうしてすごいの？

この柔軟性エレクトロニクスがあると、もっと色んな形の電気のものを作れるから、
新しいおもちゃや便利なものをたくさん持てるようになるんです。

## それはどうして大切なの？

人々の生活をもっと楽しく、便利にするために、新しいものを作ることはとても大切なんです。
柔軟性エレクトロニクスは、未来の楽しい冒険や発明に大きな役割を果たすことができます。

# まとめ

このように、柔軟性エレクトロニクスは、柔らかくて伸びる電気のもので、
それを使って新しいおもちゃや便利なものを作ることができる、とってもすごい技術なんです。
2023/8/21主にITとかセキュリティの記事

米、外国情報機関による宇宙開発の機密窃盗に警戒呼びかけ(8/19)
https://jp.reuters.com/article/usa-space-spy-china-idJPKBN2ZT16L

大量不正アクセスで被害額「約3,860万円」…セブン＆アイ「7pay」がわずか3ヵ月でサービス終了となった本当の原因(8/19)
https://news.livedoor.com/article/detail/24826951/

日本政府により隠された「中国からのハッキング」の衝撃…米国ワシントン・ポスト「スクープ」の真の狙い(8/19)
https://gendai.media/articles/-/115014

これからの人材育成を読み解く5つのトレンド(8/19)
https://news.yahoo.co.jp/articles/05e89bd6c7a38e192239bce023a1950ba5592acd

アプリケーション開発の新潮流「プラットフォームエンジニアリング」とは？(8/18)
https://it.impress.co.jp/articles/-/25244

コロンビア中央銀行がCBDCの保有と支出制限を推奨(8/18)
https://nextmoney.jp/?p=60425

株式会社CodeFox SPARKNのリリースに向け、8/21より$15,000のセキュリティ監査コンテストを実施(8/19)
https://coinpost.jp/?post_type=pressrelease&p=477607

米SECがリップル裁判で仮抗告（上訴）申請を提出、Optimismで10億円ハッキング｜19日朝の重要速報まとめ(8/19)
https://coinpost.jp/?p=477955

Macからこのアプリを今すぐ削除して！ 理由とその方法(8/19)
https://news.yahoo.co.jp/articles/b3e54f1046f7d0de42bf83d1af5690ff91299462?source=rss

警察庁が経済安保へ「大きく舵」　北や中国の脅威に対処(8/19)
https://www.sankei.com/article/20230819-DEAFRIAW2RM6NAVIZJ5A3NM4PQ/

前大統領がハッキング依頼か　ブラジル、選挙システムに(8/18)
https://news.yahoo.co.jp/articles/7acdd5fc95744d5f63d8c64ace35968f7beb5e6a
【WordPress】覚えておくべきショートカットキー

今回はWordPressで基本的なショートカット〜意外と知らない便利なショートカットを紹介します！

## 目次
* [基本的なショートカットキー](#基本的なショートカットキー)
* [見出しのショートカットキー1](#見出しのショートカットキー1)
* [見出しのショートカットキー2](#見出しのショートカットキー2)
* [その他のショートカットキー](#その他のショートカットキー)

## 基本的なショートカットキー
お馴染みの基本的なショートカットキーです。
| 機能 |  Mac | Windows |  
|:-----------|------------:|------------:|
| コピー 　 |command + C	|Ctrl + C | 
| カット 　 | command + X|	Ctrl + X|
| 全選択|	command + A|	Ctrl + A|
| ペースト|	command + V|	Ctrl + V|
|取り消し	|command + Y|	Ctrl + Y|
|取り消しの取り消し	|command + Z|	Ctrl + Z|
| アンダーライン（下線） |command + U | Ctrl + U | 
| ボールド（太字） |command + B  | Ctrl + B | 
| リンクの挿入    |command + K  | Ctrl + K | 

## 見出しのショートカットキー1
Shift＋Alt＋数字キーでそれぞれの見出しサイズを選択できます。
| 機能 |  Mac | Windows |  
|:-----------|------------:|------------:|
| 見出し1|option + control + 1|Ctrl + Alt + 1| 
| 見出し3|option + control + 3|Ctrl + Alt + 3|
| 見出し4|option + control + 4|Ctrl + Alt + 4|
|見出し5	|option + control + 5|Ctrl + Alt + 5|
|見出し6	|option + control + 6|Ctrl + Alt + 6|

## 見出しのショートカットキー2
慣れたらかなり早く見出し追加可能です。
| 機能 |  ショートカットキー|
|:-----------|------------:|
| 見出し2 |##(半角) + スペース(半角)|
| 見出し3|###(半角) + スペース(半角)|
| 見出し4|####(半角) + スペース(半角)|
|見出し5	|#####(半角) + スペース(半角)|
|見出し6	|######(半角) + スペース(半角)|


## その他のショートカットキー
その他の便利なショートカットキーです。
| 機能 |  Mac | Windows |  
|:-----------|------------:|------------:|
| 段落 |shift + option + 7|Alt + Shift + 7| 
| 書式なし貼り付け |shift + option + V|Alt + Shift + V| 
| メディアの追加 |shift + option + M|Alt + Shift + M| 
| 箇条書き(番号なし)|shift + option + U|Alt + Shift + U| 
| 箇条書き(番号あり)|shift + option + O|SAlt + Shift + O| 
| 引用|shift + option + Q|Alt + Shift + Q| 
| 打ち消し線|shift + option ＋ D|Alt + Shift + D| 
| 中央揃え|shift + option + C|Alt + Shift + C| 
| 右寄せ|shift + option + R|Alt + Shift + R| 
| 左寄せ|option + control + L|Alt + Shift + L| 
| 両端揃え|option + control + J|Alt + Shift + J| 
| リンクの削除|option + control + S|Alt + Shift + S| 


------- 

以上WordPressのショートカットキーの紹介でした！
全部は覚えるのは大変なので、徐々に使用して行って自分の中で頻度の高いショートカットキーを見つけて時短を目指しましょう！