OmniAICreator/Qiita-1.07M huggingface dataset:
短縮URLを静的に実装する話

# 但し書き

本件、小ネタです。目からウロコというか、世の中にはいろんなこと考える人いるなぁというか、そんな話。

# まずは評価

タグにつけておりまして、本記事は #製品評価 です。

オンプレミス環境で、短縮URLを実装できないかと探索、[suri](https://github.com/jstayton/suri) というプロダクトを試してみました。
どこの紹介サイトか、どこのaltサイトで見たかも忘れましたが。。
先に結論を申し上げると、そこあまり重要じゃないので割愛。

## 試用

githubのREADME.mdのとおりですので、まずはためしてみます。

```
git clone https://github.com/jstayton/suri
cd suri
npm install
```

なにやら本日時点でこんなん出てます。

```
found 23 vulnerabilities (11 moderate, 6 high, 6 critical)
  run `npm audit fix` to fix them, or `npm audit` for details
```

わざわざ警告いただいたので、とりあえず `npm audit fix` を実施。
（結論を考えると、これはあまり意味ない）

```
fixed 15 of 23 vulnerabilities in 665 scanned packages
  7 vulnerabilities required manual review and could not be updated
  1 package update for 1 vulnerability involved breaking changes
  (use `npm audit fix --force` to install breaking changes; or refer to `npm audit` for steps to fix these manually)
```

残り7+1があるとのことだけど、とりあえず放置して先にすすむ。

```
npm run build
```

なにも考えずに実行しましたが、Windows環境だとここでコケます。
こんなんエラー出る。

```
npm ERR! suri@0.5.1 build: `npm run clean && NODE_ENV=production eleventy`
```

[eleventy](https://developer.mamezou-tech.com/11ty/11ty-intro/) ってなんぞ？？
はい、 `node.js` ベースの静的コンテンツ生成ツールのようです。。。

詳細確認する余裕ないので、ヨウ分からんけど、とりあえず `npx` 経由で先にすすめるかな。。
できました。

```
>set NODE_ENV=production

>npx eleventy
[11ty] Writing _site/1/index.html from ./src/links.njk
[11ty] Writing _site/index.html from ./src/links.njk
[11ty] Writing _site/tw/index.html from ./src/links.njk
[11ty] Copied 2 files / Wrote 3 files in 0.12 seconds (v1.0.2)
```

なんか生成されとる。。
たとえばこんなの。

```_site\tw\intex.html

<!DOCTYPE html>
<meta http-equiv=refresh content="0; url=https://twitter.com/kidjustino">

```

URLは、元のREADMEやサンプルに記述されているとおり。

```src\links.json
{
  "/": "https://github.com/jstayton",
  "1": "https://fee.org/articles/the-use-of-knowledge-in-society/",
  "tw": "https://twitter.com/kidjustino"
}
```

よく分かってなかったけど、これで分かった。。
短縮URLに相当する場所に、静的ファイル置くので、対応ファイルを生成するためのツールなんやね。

# 応用（結局手で書く話）

逆に、そもそもこの生成ツールに依存する必要はないのだと理解できたので、任意の場所に任意のURL置くことに。
たとえば、こんなのにします。

```r\abc12\index.html
<!DOCTYPE html>
<meta http-equiv=refresh content="0; url=onenote:///\\server\example\path\リンク先文書.one#section-id={UUID}&end">
<html>
リンク用のダミーページです
</html>
```

たとえばteamsの会議URLとかの伝達で困るようなときに有効かなと。。
但し、他アプリの起動リダイレクトとしての利用の場合（上記もそうですが）、本ページ自身は居残り（ブラウザに表示されつづける）なので、賢いとはいえない。
あくまで副作用を理解した上での、応急処置用ですね。。

仕組みを理解した上で、活用してみてください:-)
JupyterLabの完全アンインストール

# 何が起きたか
新しいmacにJupyterLabをインストールしたのだが、思った通りのインストールができなかった。
Jupyterプロジェクトのサイトの通りHomebrewでインストールしたものの、
pythonとRを両方動作させるための環境がうまくできずに断念。
JupyterLabをアンインストールしてPythonからインストールすることに。


# 何をアンインストールするか
まず、インストールした時の流れから。

``` インストールコマンド
% brew install jupyterlab
==> Downloading https://formulae.brew.sh/api/formula.jws.json

==> Downloading https://formulae.brew.sh/api/cask.jws.json

Warning: Treating jupyterlab as a formula. For the cask, use homebrew/cask/jupyterlab
==> Downloading https://ghcr.io/v2/homebrew/core/jupyterlab/manifests/4.0.5_1-2
############################################################################################################################# 100.0%
==> Fetching dependencies for jupyterlab: mpdecimal, ca-certificates, openssl@3, readline, sqlite, xz, python@3.11, pycparser, cffi, pygments, six, ipython, brotli, c-ares, icu4c, libnghttp2, libuv, node, pandoc, python-certifi, python-packaging, black, mypy, pydocstyle, ruff, python-lsp-server, libyaml, pyyaml, libsodium and zeromq
```
依存関係のパッケージがいろいろ。

# どうやってアンインストールするか
いろいろなサイトでアンインストール手順を探したが、インストール時のログを見れば良いことに気がいた。
びっくりしたのがsqliteまで入ってしまっていること。

こちらのログ（表示）よりHomebrewでアンインストールを実施。
```
% brew uninstall jupyterlab mpdecimal ca-certificates openssl@3 readline sqlite xz python@3.11 pycparser cffi pygments six ipython brotli c-ares icu4c libnghttp2 libuv node pandoc python-certifi python-packaging black mypy pydocstyle ruff python-lsp-server libyaml pyyaml libsodium zeromq
```

これできれいな状態に。
【GOT】ワードデバイスのデータ形式と設定できる値の範囲【三菱PLC】

#### データ長 8ビット（8ビットデバイス）
符号付きBIN8:-128～127
符号なしBIN8:0～255

#### データ長 16ビット（ワードデバイス）
符号付きBIN16:-32768～32767
符号なしBIN16:0～65535
BCD16:0～9999

#### データ長 32ビット（ダブルワードデバイス）
符号付きBIN32:-2147483648～2147483647
符号なしBIN32:0～4294967295
BCD32:0～99999999
実数(32ビット):-999999000000.0～999999000000.0

#### データ長 64ビット（クワッドワードデバイス）
符号付きBIN64:-9223372036854775808～9223372036854775807
符号なしBIN64:0～18446744073709551615
BCD64:0～9999999999999999
実数(64ビット):-999999999999990000000.0～999999999999990000000.0
Laravelでのループ処理5選

備忘録として残します。

## 前提
例として、
ユーザーモデルからデータを全取得したものをループ処理していく。
```php
$users = App\Models\User::all();
```


### ①foreachメソッドでループ処理
```php
foreach ($users as $user) {
    echo $user->name . "\n";
}
```
なんだかんだこればっかり使ってるコードになってる。
https://readouble.com/laravel/8.x/ja/collections.html
コレクションクラスでも配列と同様に扱える。


### ②Collectionのeachメソッド
```php
$users->each(function ($user) {
    echo $user->name . "\n";
});
```
https://readouble.com/laravel/8.x/ja/collections.html#method-each
Colectionインスタンスを直感的にループできる。
途中で処理を終わらせる場合は、`return false`です。breakじゃない。

### ③Collectionのmapメソッド
```php
$names = $users->map(function ($user) {
    return $user->name;
});
foreach ($names as $name) {
    echo $name . "\n";
}
```
https://readouble.com/laravel/8.x/ja/collections.html#method-map
内部処理的で、`array_map()`している。
返り値は、Collectionで返してくれる。

チェーンしてメソッドを繋げられるのが楽。map()->filter()等;


### ④Collectionのfilterメソッド
```php
$activeUsers = $users->filter(function ($user) {
    return $user->active;
});
foreach ($activeUsers as $user) {
    echo $user->name . "\n";
}
```
https://readouble.com/laravel/8.x/ja/collections.html#method-filter
内部処理的で、`array_filter()`している。
返り値は、Collectionで返してくれる。

チェーンしてメソッドを繋げられるのが楽。filter()->map()等;


### ⑤Eloquentのcursorメソッド
```php
foreach (App\Models\User::cursor() as $user) {
    echo $user->name . "\n";
}
```
tiknerを使う際に、
get()やall()でcollectionで返そうとすると最後まで処理が完了しないので使う。
1行ずつレコードをフェッチしている。

## さいごに
そんなこといっても。`$users->toArray()`してから`array_map()`,`array_filter()`使ってしまう・・・
Code Deploy agent for Windows Serverのインストールと確認方法

１．下記サイトにアクセスし、Use a direct link内にあるEC2が所属しているRegionのリンクからインストーラーをダウンロードする
（コマンドでもできるけどこれが１番楽）
https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install-windows.html#codedeploy-agent-operations-install-windows-powershell

２．インストールされているかの確認
```
powershell.exe -Command Get-Service -Name codedeployagent
```

下記のようなログが出れば成功
```
Status   Name               DisplayName
------   ----               -----------
Running codedeployagent    CodeDeploy Host Agent Service
```

エラーが出る場合インストールできていない

確認方法の参考サイト
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-verify.html
PlanetScale 最高 無料枠 ちょっとつらい

:::note warn
PlanetScaleのHobbyプラン（無料）がなくなりました。詳しくはこちらの記事をご覧ください
:::

https://qiita.com/ikuosaito1989/items/1bacbaa3e1c3d2b804fe

### PlanetScaleの無料枠は使い物になりません！

はい、PlanetScale最高です。PlanetScaleのせいで好きなRDBはMySQL一択になりました。しかし、個人で運用しているサービスに導入したところ、無料枠の制限を余裕で超えてしまいました。無料枠がいまいちわかりにくいので実例と使ってみてよかった点とわるい点を書こうと思います。他の人の記事とはちょっと観点が違うかもしれないので参考になれば。あと雰囲気で使っているのでちゃんと嘘をつくかも

# PlanetScaleとは

> PlanetScale は、世界で最も先進的なサーバーレス MySQL プラットフォームです

サーバーレスですがコールドスタートは起きないので不安にならなくても大丈夫です（僕は無駄に心配してました

詳しい内容はこちらの記事を見ればわかります

https://qiita.com/tak001/items/cfbaa9dcb542929ff235

# PlanetScaleの良いところ

以前はCloud SQLを使っていたのでCloud SQLより良いところが中心になるかもしれません。あと完全に個人の主観が入ってます。

## 一瞬でブランチ切れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/2d8fc03a-496f-de18-6785-b4ce604c9c14.png)

[Create branch]押下するとものの数分でブランチが切れます。ベースブランチのデータは引き継げませんが、Cloud SQLみたいにDB作るたびにお金掛からないので最高です

## バックアップを別ブランチで切れる

上記でベースブランチのデータは引き継げませんと言ったばかりですが、バックアップからブランチが切れるのでデータを利用したい場合は簡単に引継げます。強すぎる...

## マイグレーションテーブル残せる

ブランチ切る際にデータは引き継げませんが、マイグレーションに利用するテーブルのデータは引き継げます。さらにマイグレーションテーブル名は任意の名前でも問題ないのであらゆるマイグレーションライブラリに対応可。以下Railsの例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/e915a9ef-43bd-7103-05b0-4ac25947c912.png)

## Deploy request最高

スキーマ変更した際に差分を確認してマージ出来るDeploy requestという機能があります。GithubのPullRequestをRDBに特化したみたいなやつです。mainにはプロテクトが掛けられていて直接変更出来ないのでスキーマ変更の際は必ずDeploy requestが必要となります。↓こんな感じで差分見れます。いや、最高でしょこれ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/65216cd0-feb7-a85f-6b1b-c7cfde2e064a.png)

## 必要な機能は揃ってる

ノンブロッキングスキーマ変更、バックアップ、insights、チュートリアル、CLIなど必要な機能は揃ってます。しいて言うならinsightsの期間が有料でも７日間なので短いかも

# PlanetScaleの悪いところ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496802/8d9f7111-f87c-b2bb-33f4-3102c633fbf8.png)

なぜここはローテクなん？

# 無料枠 ちょっとつらい

プランを見ると無料枠はかなり太っ腹のように見えます。

- 5GBまでのストレージ
- 10億行のread
- 1000万行のwrite
- 1,000までのコネクション

10億回のread、1000万回のwriteということで、とてつもないアクセスのあるサービス以外は捌けるのでは？と思ってましたが実際のところ全然捌けません。私の運用しているサービスでは月に1万ユーザー、5~10万PV、100万ほどのレコード数とアクセスが多いわけではありませんが、1ヶ月に50億read、1000万回のwriteになってしまうため無料枠では運用出来ませんでした。PlanetScaleの行は単純な行数ではないため見積もることは難しくなっています。以下のページに詳しく記載されています。

https://planetscale.com/docs/concepts/billing#understanding-rows-read

時間ない人向け和訳
> 何が読み取り行としてカウントされるかを解読するのは難しい場合があります。

100億行のreadを超えるサービスの場合はread、write無制限のScaler proがあります。一番低いグレードで39ドルからあるので行数を減らすために頑張ってチューニングするよりは課金した方が早いかもしれません。Cloud SQLやAuroraに比べると安いので断然PlanetScaleが良いと思います。ちなみに私は29ドルのScalerを利用しています。

# まとめ

- ブランチ機能マジ神
- Cloud SQLやAurora使うぐらいだったらPlanetScaleが良い
- MySQLしか使えないのは諦めて
- 無料枠は太っ腹に見えて全然使えない。開発で利用する分には足りる(たぶん) 
- 5〜10万PVのサービスならScalerプランでいける（たぶん）
- 有料でもそこそこリーズナブルなので個人でも手を出しやすい
- ダウングレードはめんどくさそうなので課金するにはちょっと勇気がいる
【GAS】グーグルフォームとリンクしたスプレッドシートの名前を変更する

# Google App ScriptでGoogle Formにリンクしたスプレッドシートを作る
Google App ScriptでGoogle Formとリンクしたスプレッドシートを作成するのは簡単にできる。
```
function main(){
    var ss = SpreadsheetApp.getActive();//スプレッドシートを取得
    var form = FormApp.create("テストフォーム");//フォームを作成
    form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());//フォームの保存先をスプレッドシートに指定
}
```
しかし、シートの名前がフォームの回答1となっており、センスがない。これを変えるために、現在スプレッドシートに存在しているシートをすべて取得し、その中で、フォームと関連づけられているシートを返す関数を作成する。
```
function getFormSheet(){//google formとリンクしたシートを返す
  var ss = SpreadsheetApp.getActive();
  for (sheet of ss.getSheets()){
    if (sheet.getFormUrl()){
      return sheet;
    }
  }
  return null;
}
```
sheet.getFormUrl()で、シートに関連付けられたフォームのURLを取得している。関連づけられていない場合はnullが返ってくる。これを利用して、グーグルフォームとリンクしたシートを取得できる。
よって、以下のようなプログラムを作成して、シート名の変更を試みる。
```
function main(){
    var ss = SpreadsheetApp.getActive();//スプレッドシートを取得
    var form = FormApp.create("テストフォーム");//フォームを作成
    form.setDestination(FormApp.DestinationType.SPREADSHEET,ss.getId());//フォームの保存先をスプレッドシートに指定
    var form_sheet = getFormSheet();
    form_sheet.setName("フォーム用シート");
}
```
これで、いけるかと思いきや正しく取得できない！！。
1回目の実行では```form_sheet```がnullが返ってくることで、```form_sheet.setName("フォーム用シート")```でエラーが発生する。
#### なんで？？
っていろいろ調べると、```getFormSheet```関数内で取得しているスプレッドシート一覧に```フォームの回答1```という名前が含まれていないということが判明した。
#### はっ？？
と思って、```getFormSheet()```のみをもう一度実行してみると、なんと、フォームと対応したシートが正しく返ってくる。
#### ワケガワカラナイ...
と思いながらも、フォームのような外部クラスのプログラムからスプレッドシートを操作すると更新が遅れるタイプかな？と思ったので、```Utility.sleep(30000)```とか遅らせてみたがダメ。
そこで、更新系のメソッドないかなぁ～とドキュメントを眺めてると、なんとそれらしい```SpreadsheetApp.flush()```を発見！！
```
function getFormSheet(){//google formとリンクしたシートを返す
  var ss = SpreadsheetApp.getActive();
  SpreadsheetApp.flush();
  for (sheet of ss.getSheets()){
    Logger.log(sheet.getName());
    if (sheet.getFormUrl()){
      return sheet;
    }
  }
  return null;
}
```
```getFormSheet()```に```SpreadsheetApp.flush()```を追加することで、1回目の実行でもgetFormSheet()が正しく返ってくることが確認できた。
【Rails】Devise Token Authでユーザーのavatarを設定できるようにする方法

## Active Storageを使用可能にする
以下のコマンドを実行します。

```terminal
$ rails active_storage:install
$ rails db:migrate
```

実行するとデータベースに`active_storage_attachments`, `active_storage_blobs`, `active_storage_variant_records`が追加されます。

## Userモデルと関連付ける

`user.rb`に以下の記述を追記します。

```app/models/user.rb
 has_one_attached :avatar
```

## コントローラーに追記する

`avatar`をアップロードできるようにするために以下の記述を`registrations_controller.rb`に追記します。

```registrations_controller.rb
class RegistrationsController < DeviseTokenAuth::RegistrationsController
    before_action :configure_permitted_parameters

    def update
        super do
          @resource.avatar.attach(account_update_params[:avatar]) if account_update_params[:avatar].present?
        end
    end

    protected
    def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:account_update, keys: %i[avatar])
    end
end
```

`config/routes.rb`にも記述を追加します。

```config/routes.rb
  mount_devise_token_auth_for "User", at: "auth", controllers: {
    registrations: "api/v1/auth/registrations"
  }
```
Llama2の15倍速いDeciLMが登場！


## はじめに
深層学習コミュニティは、大規模言語モデル（LLM）の限界を押し広げ続ける一方で、これらのモデルの計算要件はトレーニングと推論の両方で指数関数的に増加しています。

今回は、オープンソースのLLMであるDeciLM 6Bを紹介します。DeciLM 6Bは57億のパラメータを持ち、Llama 2 7Bと比較可能な品質を維持しつつ、スループットが15倍高速です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/1423f8ab-bf4e-fa7b-7946-ca86504ae762.png)

## DeciLMの概要

開発元：Deci
モデルタイプ：DeciLMは、最適化されたトランスフォーマーデコーダーアーキテクチャを使用した自己回帰型言語モデルで、可変のGrouped-Query Attentionを含んでいます。
言語（自然言語処理）：英語
ライセンス：ホスティングサービスプロバイダーに関するDeciの拡張を含むLlama 2コミュニティライセンス契約。

モデルのバージョン：
1. DeciLM 6B（ベース）

https://huggingface.co/Deci/DeciLM-6b

2. DeciLM 6B-Instruct
「DeciLM 6B」から指示に従うためにFine-tuned（微調整）されたものです

https://huggingface.co/Deci/DeciLM-6b-instruct


## 特徴

DeciLM 6Bの特徴は、効率的なフロンティアを拡張するためにDeciの最先端のニューラルアーキテクチャサーチエンジンであるAutoNACを使用して生成された独自のアーキテクチャにあります。さらに、DeciLM 6BをDeciの推論SDKと組み合わせることで、大幅なスループット向上が実現します。


### Grouped-Query Attention（GQA）

MQAはモデルの計算およびメモリ効率を向上させますが、モデル品質の劣化をもたらすことがあります。GQAは、MQAの向上版として導入され、メモリと計算効率、モデル品質の優れたバランスを提供するように設計されました。

- クエリのグルーピング：GQAでは、クエリはグループに分割され、各グループが単一のK（キー）とV（値）の計算を共有します。これにより、一定のパラメータの共有が提供されますが、MQAほどではありません。
- 特殊なアテンションパターン：各クエリグループに異なるキーと値を与えることで、モデルは入力内のより広範な関係を識別でき、MQAよりも洗練されたアテンションパターンが生まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/9320cf61-f450-56e1-6775-1ba023235b85.png)

### DeciLMにおける可変なGrouped-Query Attention

DeciLMでは、効率とモデル品質のトレードオフをさらに最適化するために、可変なGQA（Grouped-Query Attention）を導入します。他のモデル（例：Llama 2 70B）がすべてのレイヤーで一貫して同じ数のグループを適用するのとは異なり、DeciLMはそのアプローチに変動性を導入します。具体的には、各レイヤーで32のクエリ/ヘッドを維持しながら、DeciLMのレイヤーはGQAグループのパラメータにバラエティを持たせます：

- 一部のレイヤーでは、4つのグループを使用し、グループごとに8つのクエリとレイヤーごとに4つのK（キー）と4つのV（値）ヘッドがあります。
- 他のレイヤーでは、2つのグループを適用し、グループごとに16のクエリとレイヤーごとに2つのKと2つのVパラメータがあります。
- 特定のレイヤーでは、1つのグループを持ち（MQAと同様）、そのグループ内に32のすべてのクエリと1つのキーと値ヘッドがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/5c2c666a-e7a1-bf2c-271c-412c7db382ac.png)

## モデル評価

DeciLMが同僚モデルの中で際立つ指標

DeciLM 6BおよびDeciLM 6B-Instructを、Llama 2 7B、Llama 2 7B-Chat、Falcon 7B、およびMPT-Instructなど、7億のパラメータクラスの主要なオープンソースモデルと比較しました。パラメータ数がはるかに少ないにも関わらず、DeciLM 6B-Instructは、Llama 2 7Bにほんの1%未満の差で追随し、3番目の位置を獲得しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/91366072-dc1d-6ad8-1ac3-660422e0ef11.png)

## まとめ

DeciLM 6Bは57億のパラメータを持つオープンソースの言語モデルで、Llama 2 7Bと比較してスループットが15倍向上し、品質を維持しています。AutoNACを使用して生成された独自の可変Grouped-Query Attention（GQA）アーキテクチャは、他のモデルと一線を画しています。7億のパラメータクラスの同僚モデルとのベンチマークでは、DeciLM 6B-Instructが3番目の位置を確保し、その優れた性能を示しました。

-----

参照：
- 資料：https://deci.ai/
- 論文：https://arxiv.org/pdf/2305.13245v1.pdf
暗号方式

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/1619fdc0-20ff-1655-2467-ab7d52ef3674.png)
１：共通鍵暗号方式は、暗号化に使う鍵と復号に使う鍵が同一である方式です。対象鍵暗号方式、秘密鍵暗号方式と呼ばれることもあります。この方式は、暗号化/復号の処理が速いという利点があります。一方で、扱う鍵数が多くなって管理が大変になったり、事前に相手と鍵を取り決めておkなくてはならないと言う欠点があります。
　
２：公開鍵暗号方式は、暗号化の鍵と復号の異なる方式です。非対称鍵暗号方式と呼ばれることもあります。子にお方式は、暗号化/復号の処理は遅いですが、事前に相手と鍵を取り決める必要がなく、鍵の管理が容易です。

　公開鍵暗号方式では、公開鍵と秘密鍵という２種類の鍵を使います。コラは、鍵の素とも言える数から、一定の計算をして出てきた２つの数値です。

　２つの数値は、一定の計算によって出てきたのですから、それなりの関係があります。関係があるのですから、公開鍵から秘密鍵を推測できそうなものですが、実際には、公開鍵を見ても秘密鍵がなんであるのかはわからないように工夫されています。そこで、２つのうちの片方を、他人に使ってもらうために公開して、公開鍵（パブリックキー）とします。。残った方は自分だけの秘密にして、秘密鍵（プライベートキー）とします。
Upcoming Feature Flagsの一覧を確認する方法(Swift)

## はじめに

Swift 5.8から「Upcoming Feature Flags」というフラグが追加されました。

Swiftの言語仕様において、まれにソースの互換性を壊す変更が採用されることがあります。
そのような破壊的変更はメジャーバージョンアップまで導入されませんが、Upcoming Feature FlagsをONにすることで早めに有効にできます。

今後の機能を予め有効にすることで、メジャーバージョンアップ時の移行が容易になるなどのメリットがあります。

詳細は以下の記事をご参照ください。

https://www.swift.org/blog/using-upcoming-feature-flags/

ただどのようなUpcoming Feature Flagがあるかがわかりづらいので、一覧で確認する方法を紹介します。

## 環境

- OS: macOS Ventura 13.5.2
- Swift: 5.9
- Xcode: 15.0 (15A240d)
- swift-tools-version: 5.9

## Upcoming Feature Flagsの一覧

Upcoming Feature Flagsの一覧を確認する方法を紹介します。

### Swift Evolution

わかりづらいのですが、実はSwift Evolutionのページから確認できます。

https://www.swift.org/swift-evolution/#?upcoming=true

画面右にある旗のアイコンをクリックすることで、Upcoming Feature Flagがあるプロポーザルを絞り込むことができます。

![貼り付けた画像_15_9_2023_22_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/f4b6c83d-539e-03bd-ade4-8d414674b86b.png)

2023/09/15現在は、6つのUpcoming Feature Flagがあることがわかります。

- `DisableOutwardActorInference`
- `ImportObjcForwardDeclarations`
- `BareSlashRegexLiterals`
- `ExistentialAny`
- `ForwardTrailingClosures`
- `ConciseMagicFile`

### ソース

Swift Evolutionのページは、Swiftのどのバージョンと紐付いているかわかりづらいなどの問題があります。

そこでSwiftのソースを直接読みます。

しっかりとは追えていませんが、 `swift/include/swift/Basic/Features.def` に `UPCOMING_FEATURE` で定義されている値がUpcoming Feature Flagsだとわかります。

```cpp:Features.def
UPCOMING_FEATURE(ConciseMagicFile, 274, 6)
UPCOMING_FEATURE(ForwardTrailingClosures, 286, 6)
UPCOMING_FEATURE(BareSlashRegexLiterals, 354, 6)
UPCOMING_FEATURE(ExistentialAny, 335, 6)
UPCOMING_FEATURE(ImportObjcForwardDeclarations, 384, 6)
UPCOMING_FEATURE(DisableOutwardActorInference, 401, 6)
```

https://github.com/apple/swift/blob/33be23ef40172aabd7756f090e10dfa0d28963a4/include/swift/Basic/Features.def#L114-L119

引数は3つあり、前から順に機能名（ `FeatureName` ）、プロポーザル番号（ `SENumber` ）、バージョン（ `Version` ）です。

```cpp:Features.def
#  define UPCOMING_FEATURE(FeatureName, SENumber, Version)   \
```

https://github.com/apple/swift/blob/33be23ef40172aabd7756f090e10dfa0d28963a4/include/swift/Basic/Features.def#L52

バージョンは固定で `6` が入っており、おそらくSwift 6で完全に有効になることを意味しています。

## おわりに

Upcoming Feature Flagsの一覧を確認することができました。
これで早めに今後の機能を有効にし、Swiftの最新仕様を使って実装できます :relaxed:
SwiftUIレイアウトでImageを作成する

所謂スクリーンショット

前回の「[SwiftUIレイアウトで複数ページのPDFを作成する](https://qiita.com/mbotsu/items/eea0f350bc1b041e3b3b)」応用でSwiftUIのViewをイメージにして保存。
例の[ImageRenderer](https://developer.apple.com/documentation/swiftui/imagerenderer)で表示できないGridやListもちゃんと表示できています。

ついでにiOS16の[Charts](https://developer.apple.com/documentation/charts)を少し弄ってみた。

- chartXScaleでグラフの表示範囲を指定、ここでは20〜30の範囲だけ表示
- PointMarkの表示をoverlayして画像を表示
- BarMark同士を重ねて帯の表示

ユースケースとしては、健康診断なんかで使うグラフのような使い方ができるわけです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/ed272728-9d37-ee60-f7a3-73f39bc72c3e.png" width=200>

https://gist.github.com/otmb/d6d22895a3c0f925dc2fed1da689f326
【GOT】LANケーブルでのGOTとPLCユニットの接続設定方法（Ethernet）【三菱PLC】

GT Designer3（GT Works3）で行ってください。

# GOT側の設定

#### GOTにIPアドレスを設定する
「共通の設定」タブから「GOT Ethernet設定」を選択すると、GOTのIPアドレス設定画面に移行します。
GOTに用意されているLANケーブルの接続ポートごとにIPアドレスを設定できます。
ここでGOTのIPアドレス(例:**192.168.3.18**)を設定します。サブネットマスクは、GOTに接続されているPLCユニットやその他の機器に合わせます。分からなければ、デフォルトの**255.255.255.0**に合わせましょう。（この場合、他の接続予定の機器のIPアドレスはGOTと同じ192.168.3.～に揃えます）
接続経路でルータを使用しているなら、別途ルーチング情報の設定が必要な場合があります。

#### GOTに接続される相手機器の設定をする
「共通の設定」タブから「接続機器の設定」を選択すると、接続先のPLCユニット指定画面に入ります。
メーカ：三菱
機種：LANポートを差している機器のタイプ
I/F:Ethernet:マルチ接続対応
など、LANケーブルでつながっている相手機器に合わせて選択します。


「詳細設定」では、GOT局番はPLCの局番と被らないように(例:**18**)、GOT機器通信用ポートNoはPLCの交信相手用ポートNoと合わせるように(例:**5001**)設定します。GOT Net No.はPLCのネットワークNo.と同じ値(例:**1**)を設定します。

「接続先Ethernet機器の設定」では、Net No.は接続先のPLCのネットワークNo.と同じ値(例:**1**)、局番は接続先Ethernetユニット機器に設定した局番(例:**1**)を設定します。機器では、LANポートを差しているPLCユニットを選択します。IPアドレス、ポートNo.はPLCのIPアドレス(例:**192.168.3.1**)、ポートNo.(例:**5006**)を設定します。通信方式も、PLCに合わせて選択します(例:**UDP**)。


# 接続確認
GOTの設定が終わり、GOTへの書き込みが完了したら、PLCのLANポートとGOTのLANポートをLANケーブルで接続し、GT Designer3からGOT診断を行います。（GOTとPCをUSBケーブルで接続しデバッグできるようにしましょう）

GOT診断は、「診断」タブからGOT診断を選択し、「モニタ開始」をクリックすると実行できます。接続が上手くいっていないなどのエラーメッセージがあれば、ここに表示されます。


![gt27_main.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535456/b8d48c7a-7065-d90d-fc55-9749ef1f29ab.jpeg)


# その他

#### 局番の設定方法
同じネットワークに接続している機器に、それぞれ違う値を重複しないように割り当てます。違う機器同士で値が重複していると通信や画面切り換えが遅い原因になります。

https://fa-faq.mitsubishielectric.co.jp/faq/show/25031

#### ネットワークNo.（Net No.）の設定方法
同じネットワークに接続している機器には、同じネットワークNo.を設定します。

https://fa-faq.mitsubishielectric.co.jp/faq/show/25099

#### IPアドレスの設定方法
接続されているほかの機器と被りがないように設定してください。異なるネットワークに属する機器と通信する場合に必要です。

https://fa-faq.mitsubishielectric.co.jp/faq/show/25032


### GOTとタブレット（モバイル端末）の接続設定方法

https://qiita.com/PockTTY/items/b90882b428a3e3e8ee69
【初心者向け】【画像付き】Nuxt.jsにsrcフォルダを作成するには

## 1. Nuxt.jsプロジェクトの作成
```
npx nuxi@latest init hogehoge
```
(npmの場合)

## 2. プロジェクトに移動してnpmインストール
```
cd hogehoge
npm run dev
```
![oIdLxRSuh8CPJNR1693402831_1693403002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236597/8adcb552-2d7e-5bb0-ff4e-83a3cc634842.jpeg)!

## 3. ローカルサーバーを立ち上げる
```
http://localhost:3000/
```
URL上にマウスカーソルをあてて、commandを押しながらクリックで立ち上げる
下記の表示になればOK!!
![YudGIuVCDGCZzAc1693402386_1693402409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236597/a228ee59-459c-a3c8-3437-8e57f0ec7171.jpeg)


## 4. VSCodeでプロジェクトを開く
この時点のディレクトリ構成はこんな感じ
![zp4ZR2qcSONhmyi1693403546_1693403573.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236597/da899b10-cd6c-c7fa-ccfa-726e3a1c5cec.jpeg)


## 5. srcディレクトリを作成
publicディレクトリ,serverディレクトリ,app.vueをsrcディレクトリ配下に移動
![WKJhC12mFz0H4az1693403608_1693403631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236597/c7a5258d-be78-5052-a708-bc0fd57d6b61.jpeg)

## 6. 以下をnuxt.config.jsに記述
```
export default defineNuxtConfig({
  devtools: { enabled: true },
  srcDir: 'src/' // 追記したところ
})
```

npm run devでローカルサーバーを立ち上げた際に、
エラーを吐かずにwelcomeページが出ればOK!!

## 参考
https://nuxt.com/docs/api/configuration/nuxt-config
【メモ】【初心者向け】Piniaインストール

## Piniaインストール方法

` yarn add pinia @pinia/nuxt `
もしくは
` npm install pinia @pinia/nuxt `

npmを使用した場合にエラーが出た！

## 解決法

npmを使用していてエラーが出た際は以下を先にpackage.jsonに記述
```
"overrides": {
  "vue": "latest"
}
```

もう一度
`npm install pinia @pinia/nuxt`

エラーが出なくなった

あとは nuxt.config.jsに追記するだけ
```
export default defineNuxtConfig({
  // ... other options
  modules: [
    // ...
    '@pinia/nuxt',
  ],
})
```

## 参考
https://pinia.vuejs.org/ssr/nuxt.html
黒本無しでのE資格合格体験記(JDLA E資格 2023#2)

E資格に合格したので、勉強内容を纏めます。

## 伝えたいこと
- TensorFlow Developer Certificateを取得してからE資格がお勧め
- 公式例題が大事
- 計画通り行かなくても最後まで諦めない

## 学習前のレベル
- Pythonは学習済み ([Leetcode](https://leetcode.com/) (AtCoderの海外版)のMiddle(中級)レベルを解けたり解けなかったりするレベル)
- 機械学習の前提知識なし
- 個人開発が趣味な非エンジニアです

## 学習内容

|① |22年11月-23年2月 |[DataCampのMachine Learning Scientist with Python](https://www.datacamp.com/tracks/machine-learning-scientist-with-python)を受講 |
|---|---|---|
|② |23年3-4月 | [TensorFlow Developer Certificate in 2023: Zero to Mastery](https://www.udemy.com/course/tensorflow-developer-certificate-machine-learning-zero-to-mastery/)を受講|
|③|5月 | [DeepLearning.AI テンソルフロー開発者 プロフェッショナル認定 - Coursera](https://www.coursera.org/professional-certificates/tensorflow-in-practice)を受講
|④|6月前半 | [TensorFlow Developer Certificate](https://www.tensorflow.org/certificate?hl=ja)　を2回目の受験で合格 
|⑤|6月後半|[zero to oneのE資格認定プログラムスピードパッケージ](https://zero2one.jp/product/jdla-e-shikaku-speedpack/)を受講し、完了|
|⑥|7月 |[オンラインハッカソン](https://qiita.com/tanosugi/items/9446015df4b7c385be2d)参加の為、勉強お休み|
|⑦|8月前半 |業務等で勉強時間取れず。。|
|⑧|2023年8月後半 | [E資格認定プログラムスピードパッケージ](https://zero2one.jp/product/jdla-e-shikaku-speedpack/)の演習問題を2周（5-20問1セットを全問正解するまで繰り返し、全問正解したら次のセットに行く）|
|⑨|8月27日 |E資格受験|
|⑩|9月 |E資格合格発表受領|

お勧めされている書籍数冊は購入しましたが、写経等までには手が回らず、パラパラ読んだだけです。

①は機会学習を広くカバーしたコースで、コーディングの穴埋め問題が面白く、勉強になりました。
②③④でTensorFlow Developer Certificate を取ってからE資格の勉強をするというのは、コーディングの演習や問題が可也楽になるのでお勧めです。
⑤の講座は錚々たる監修者で信頼出来る内容、価格も7万円とラピッドチャレンジに次ぐ安さ、講座も演習も必要なものはカバーしながら分量は適度なので非常にお勧めです。

本当は認定講座の演習問題を5周してから黒本を5周するくらいの心つもりでした。ところが、認定講座の演習問題を2周したところで時間切れになってしまい、9割方落ちたと思っていましたが運よく合格出来ました。

認定講座に含まれる公式例題は2周とはいえ「5-20問1セットを全問正解するまで繰り返し、全問正解したら次のセットに行く」方法だったことも功を奏したようです。

もし身の回りで受験する人がいたら
- TensorFlow Developer Certificateを取得してからE資格がお勧め
- 公式例題が大事
- 計画通り行かなくても最後まで諦めない

ということを伝えたいです。

## 合格メール

この度は2023年8月25日（金）～ 27日（日）開催のJDLA Deep Learning for ENGINEER 2023#2を受験いただき、ありがとうございました。
下記の通り受験結果をお知らせ致します。

■合否結果
\=================
【　合　格　】
\=================
総受験者数　 1,065名
合格者数　　　 729名

■分野別の得点率
応用数学：75 ％
機械学習：67 ％
深層学習：64 ％
開発環境：89 ％

## 今後
次はKaggleに挑戦したいと思い勉強中です。AIを取り入れた個人開発もしたいです。
3D Gaussian Splatting 環境構築 (Windows10,Anacondaなし)

3D Gaussian SplattingのAnacondaを使わない環境構築の備忘録

<h2>環境</h2>

Windows10
Python 3.10.8
RTX 3090
CUDA 11.8

~~~ requirements.txt
torch==2.0.1+cu118
torchaudio==2.0.2+cu118
torchvision==0.15.2+cu118
tqdm==4.66.1
plyfile==1.0.1
~~~

~~~ submodules.
diff-gaussian-rasterization==0.0.0
simple-knn==0.0.0
~~~


<h2>追加した環境変数</h2>

+ ~\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64
+ ~\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include


<h2>なぜだか失敗するpip install</h2>

~~~ input.log
pip install diff-gaussian-rasterization
~~~

~~~ output.log
前略
中略
No module named "torch"
~~~

シェルと適当に作成したコードからは問題なく利用できる

<dl>
  <dt>原因</dt>
  <dd>不明</dd>
  <dt>解決策</dt>
  <dd>python setup.py install</dd>
</dl>



<h2>最後に</h2>

これは備忘録です
個人的に適当に書いたものです
体裁とか知りません
書きなれてないのもあり、途中で面倒になって最低限以下しか書いてません
悪しからず
Amazon RDSのメジャーバージョン サポート延長サービスの提供開始

Amazon RDSでメジャーバージョンのサポート終了日を過ぎた場合にサポートを延長するというサービスが、AWSより発表されました。
Mysqlのサポート期限が近づいていた中で、まさに渡りに船の発表です。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/extended-support.html

## ポイント
今まではサポート終了日を過ぎたDBは自動でメジャーエンジンバージョンにアップデートされてしましましたが、このサポート延長サービスを利用すると、標準サポート終了日を過ぎても現在利用中のメジャーバージョンでデータベースを実行し続けられます。

### 対象
Amazon RDS for MySQL 5.7 および 8.0、および RDS for PostgreSQL 11 以降で利用できます

### サポート期限(おおよその日付)
|DB|バージョン|コミュニティサポート終了期間|RDS標準サポート終了期間|
| :---: | :---: | :---: | :---: |
|MySQL|5.7|2023 年 10 月 21 日|2024 年 2 月 29 日|
|MySQL|8.0|2026 年 4 月|2026 年 4 月|
|PostgreSQL|11|2023 年 11 月 9 日|2023 年 11 月|

公式情報はこちら
▼Mysql
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Concepts.VersionMgmt.html#MySQL.Concepts.VersionMgmt.ReleaseCalendar

▼postgres
https://docs.aws.amazon.com/AmazonRDS/latest/PostgreSQLReleaseNotes/postgresql-release-calendar.html

### 延長サポートを利用しない場合(MySQLの場合)
RDS for MySQL バージョン 5.7の標準サポート終了日は2024年2月29日。
上記のRDS標準サポート終了日に達すると自動でメジャーバージョンのアップデートを実施する。
※ユーザー側で制御不可能

### 延長サポートを利用する場合(MySQLの場合)
2024年2月29日より前にDBインスタンスの延長サポートを有効にすることで、RDS for MySQL バージョン 5.7 を引き続き実行可能。
延長サポート中はNational Vulnerability Database (NVD) CVSS 重大度評価で定義されている重大および高 CVE にパッチを適用し続ける
延長サポートは最大3年間利用可能となりそうです。
2023年12月以降、ポータルから選択になるようですが、詳細な手順はまだ不明です。

### 料金
この記事を作成している時点で日本語サイトに情報はありませんが、英語版に情報がありました。

|リージョン|1年目と2年目の月額料金|3年目の月額料金|
| :---: | :---: | :---: |
|US East (N. Virginia)|$0.100|$0.200|
|東京|$0.120|$0.240|
|大阪|$0.120|$0.240|

公式情報はこちら
▼Mysql
https://aws.amazon.com/rds/mysql/pricing/?nc1=h_ls#Amazon_RDS_Extended_Support_costs

▼postgres
https://aws.amazon.com/rds/postgresql/pricing/#Amazon_RDS_Extended_Support_costs

以下目安ですが、、、

|インスタンス|月額インスタンス費用(シングルAZ・)|1年目と2年目の月額料金|3年目の月額料金|
| :---: | :---: | :---: | :---: |
|db.t3.medium|$75.92|2vCPU * 0.120 * 730 = $175.2|4vCPU * 0.240 * 730 = $350.4|
|db.t3.xlarge|$303.68|4vCPU * 0.120 * 730 = $350.4|4vCPU * 0.240 * 730 = $700.8|

※インスタンス費用はシングルAZで1ヶ月オンデマンドの想定です(バックアップやストレージは含みませｎ)
※延長サポートの課金の発生は2024年3月1日以降発生する
※メジャーバージョンのアップデート完了後は自動で延長サポート料金が請求されなくなるようです

## まとめ
便利な機能ですが、サーバー代金と同じ～2倍近い値段となってしまうので、コストには影響大です。
いくら延長サポートが提供されたからとはいえ、早めにアップデートをしないといけませんね。
AttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK'

## 目的
pythonプログラム実行時に`AttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK'`エラーが出た。

## エラー解決方法
以下を実行するだけ
```bash
pip3 install pyOpenSSL --upgrade
```
うるう年の計算

# 考え方

年齢は、生まれた日を初日として計算します。例えば、4月1日が誕生日の人の場合、4月1日が初日となり、翌年の3月31日の24時になった瞬間に年齢が加算されます。そうすると、2月29日生まれの人は理論上、2月29日は2月28日の24時に加算されます。つまりうるう年以外は3月1日に思えますが、、、

免許証の有効期限で定義されていました。

うるう年の誕生日では2月29日となりますが、それ以外の誕生日は2月28日となります。うるう年の場合は2月29日まで有効であり、それ以外は2月28日まで有効となります。

この理論に基づいて、Tableau Prepではどう計算されるのか検証してみました。

## 準備したデータ

1992年2月29日の誕生日の人が、基準日において、年齢が何歳になるか計算してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/f4a4baff-fac6-e253-a22d-709c799004d6.png)


## 計算式

基準日の年の誕生日を計算して、基準日前ならば「西暦年の差」、基準日後ならば西暦年の差マイナス1」で年齢を求めます。

~~~
IF DATEADD('year', DATEDIFF('year', [誕生日], [基準日]), [誕生日]) > [基準日] 
	THEN DATEDIFF('year', [誕生日], [基準日]) -1
ELSE
	DATEDIFF('year', [誕生日], [基準日])
 END
~~~
                          

## 結論

うるう年以外の基準日では2月28日を誕生日、うるう年は基準日が2月29日を誕生日となっており、免許証の有効期限とあっていることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531257/e5b12e45-0b0f-d7d8-d351-6831bcaa6f7b.png)
MacのVSCodeで「候補をトリガー」機能を使いたい！

## はじめに
WindowsでVSCodeを使用する際に使える「Ctrl+Space」の候補トリガーをMacでも採用したい！！という内容です。
## 方法
今回は「⌘+Space」を候補トリガーに設定したいと思います。
1. まず初めに、この「⌘+Space」は入力するとわかりますが、Macの「Spotlight検索を表示」のコマンドと被っているので、これを解除します。 
「システム環境設定 → キーボード → キーボードショートカット... → Spotlight → Spotlight検索を表示のチェックをチェックを外す」

2. 次にVSCodeを再起動し、キーボードショートカットを開きます。
![スクリーンショット 2023-09-15 21.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239673/c6f56528-5713-0f21-1c62-5528d4575248.png)
3. 検索ボックスに「**trigger**」と入力します。
そしたら「候補をトリガー(editor.action.triggerSuggest)」が出てくると思うので、そこにカーソルを合わせ、ペンアイコンをクリックします。
![スクリーンショット 2023-09-15 21.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239673/b4a808b8-a73a-a54b-823e-9291c5835965.png)
4. キーの入力画面が出てきたら、「⌘+Space」を押し、Enterを押します。　

## 最後に
以上がMacで候補トリガーを設定する方法でした！
aiファイルをsvgに変換するメモ


## AIファイルの変換について

UI定義書を作る時に見た目の良いUIのワイヤーフレームとか探しているとAIファイルで提供されていたりします。
その時に、イラストレータとか入ってなくて困った事ありませんか？
という事で、windows環境でAIファイルを金銭的に優しいSVGしたいと思います。

今回は、品質はさておきコマンドで画像を扱う便利ツール「ImageMagick」を使用します。
また、今回はAIファイルを扱うのでImageMagickとは別に「GhostScript」が必要となります。

## インストールについて
インストール方法は、好きな方法で良いと思います。
ここでは、説明の簡単なwingetで入れる方法を書いておきます。
当然ですが、既にインストールされている人は、以下の手順は不要です。

ImageMagickのインストール
```cmd
winget install -e --id ImageMagick.ImageMagick
```

GhostScriptのインストール
```cmd
winget install -e --id ArtifexSoftware.GhostScript
```

## 変換方法について

```cmd
magick AIファイル名 SVGファイル名
```
※ImageMagickのバージョンによっては、magickではなくconvertで行わないといけないかもしれません。
【プラクティス紹介】1分でさらっと分かる「＋/△」

![plus_delta.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526800/91545c62-a662-5bef-80af-d8e37ab45929.jpeg)

## プラクティス名（別名）
＋/△　（プラスデルタ、Good/Motto）

## プラクティスの目的・狙い
* ふりかえりをカイゼンする
* アイデアを出し合う

## どんな時に使うか
* ふりかえりがまだこなれていない、と感じる時
* ふりかえりに慣れすぎて、マンネリ感を感じる時

## 実施手順
1. レトロスペクティブの最後の5分間などで実施する
1. ホワイトボードを左右２つのエリアに区切る
1. 左側の「＋（プラス）」には良かったことや上手くいったことを挙げる
1. 右側の「△（デルタ）」にはカイゼンしたいこと、上手くいかなかったことを挙げる
1. どちらからでも思いつくものを発言してもらいファシリテーターが書きとめていく
1. どちらかのエリアが埋まる、または制限時間が過ぎるかアイデアが尽きたら終了する

レトロスペクティブの最後で、ふりかえり自体をふりかえるため使うことが多いが、その他の様々な場面でも使える軽量でシンプルなツール。左右のエリアが並んでいることがポイントで、どちらかだけに意見が偏ると自然と反対側も埋めようとする力学が働く。一目でやることが分かるので、簡単な説明だけですぐに始めることができ、短時間で終わる手軽さが最大の利点。

## アレンジ例
* 各自で付箋に書き出し、順次貼っていき、目標枚数に到達したら終了する
* 「△」に挙がったアイデアの中から次回改善に取り組むものを選んで丸をつける

## アンチパターン
* 「＋」と「△」の意味するところを長々と説明した結果、かえって意見が挙がらなくなる
（→厳密に定義するより、フィーリングで思いついたをどんどん挙げてもらった方がよい）
* 時間制限を設けずにダラダラと続けてしまう（終わるタイミングを見失う）

## 参考情報

https://www.shoeisha.co.jp/book/detail/9784798168791

https://www.ohmsha.co.jp/book/9784274066986/

## こぼれ話（私的コメント）
「△（デルタ）」は変化を表すギリシャ文字だそうです。日本だと△＝イマイチ、というイメージですが、まぁそれでも通じるので、ことさら訂正しなくてもいいかなと思います。僕がこのプラクティスを気に入っている理由はとにかく軽量なこと。中央ラインと＋と△の最短6画でフォーマットが作れてしまう手軽さ。人って「何でも思いついたことを挙げてみて」と言われても出てこないのですが、「＋と△に分けて挙げてみて」と言われると急に頭が回り始めます。「＋/△」の代わりに「Good/Motto」と呼んであげると、△方面もポジティブな印象に変えられるのでオススメです。
なおこのプラクティスの注意点としては、「＋/△」はあくまでもネタ出しだけなので、改善アクションとして具体化するにはもう一工夫要ります。「SMARTな目標」とかでやることを明確にするとよいかもしれません。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
みゃー姉への愛で動くbrainmyaaneeを作った

## brainmyaaneeとは?  
~~New Generation Japanase Programing Langage~~ brainfxxk派生  
brainfxxk + みゃー姉 = brainmyaanee

## そもそもみゃー姉とは?  
テレビアニメそして漫画における「私に天使が舞い降りた」の主人公 彼女にはひなたという妹がいる 
 この言語はそのひなたのセリフの一部を元に命令を書ける言語になっている  

https://youtu.be/o_KDbDQeofY?si=lq5LVXxD37zG9Azs

## 言語の仕様  
brainmyaaneeは6個の命令で構成されている

みゃー姉!: pointerの値をインクリメントする
みゃー姉に友達はいないぞ: pointerの値をデクリメントする 
みゃー姉一緒に寝よう!: ポインターの位置を1つ進める
みゃー姉一緒にお風呂入ろう! ポインターの位置を1つ下げる
みゃーーーーー姉! メモリ位置を0に設定
起きたかー? ポインタを0に設定 
    

helloの例 非常に長いので私のブログでどうぞご覧ください asciiコードでhelloを表現している

https://pwn.moe/erina/article/28620  
## インタープリターのソースコード  
pythonで書かれている でもあまり複雑な事はしていない  

```python
import sys

# Brainfuckファイルの名前をコマンドライン引数から取得
bf_file_name = sys.argv[1]

# ポインタの初期位置とメモリの初期設定
pointer = 0
memory_place = 0
memory = [0 for n in range(16)]

# Brainfuckの命令一覧
instructions = [
    "みゃー姉!",             # ポインタをインクリメント
    "みゃー姉に友達はいないぞ",  # ポインタをデクリメント
    "みゃー姉一緒に寝よう!",    # メモリ位置をインクリメント
    "みゃー姉一緒にお風呂入ろう!",  # メモリ位置をデクリメント
    "みゃーーーーー姉!",         # メモリ位置を0に設定
    "起きたかー?",             # ポインタを0に設定
    ""                        # 空行(その内命令を追加したい)
]

# Brainfuckファイルを開く
with open(bf_file_name, "r") as bfn:
    try:
        # ファイルの内容を読み込んで、命令ごとに処理
        for instruction in bfn.read().replace("+", " ").split(" "):
            if instruction == instructions[0]:  # "みゃー姉!"の場合
                pointer += 1                   # ポインタをインクリメント
                memory[memory_place] = pointer  # メモリにポインタの値を格納
            elif instruction == instructions[1]:  # "みゃー姉に友達はいないぞ"の場合
                pointer -= 1                   # ポインタをデクリメント
                memory[memory_place] = pointer  # メモリにポインタの値を格納
            elif instruction == instructions[2]:  # "みゃー姉一緒に寝よう!"の場合
                memory_place += 1              # メモリ位置をインクリメント
            elif instruction == instructions[3]:  # "みゃー姉一緒にお風呂入ろう!"の場合
                memory_place -= 1              # メモリ位置をデクリメント
            elif instruction == instructions[4]:  # "みゃーーーーー姉!"の場合
                memory_place = 0               # メモリ位置を0に設定
            elif instruction == instructions[5]:  # "起きたかー?"の場合
                pointer = 0                    # ポインタを0に設定
                memory[memory_place] = pointer  # メモリにポインタの値を格納
            assert instruction in instructions  # 未知の命令を検出した場合、AssertionErrorを発生
    except AssertionError:
        print("Invalid Instruction", instruction)  # 未知の命令を検出した場合にエラーメッセージを表示

# メモリの内容を表示
print("memory ")
for x in memory:
    print(x, end=" ")
print()
```

## 参考文献  
https://qiita.com/TomoShiozawa/items/25dcce1540085df71053
【Docker】「E: Package 'mysql-client' has no installation candidate」のエラー解決方法

# 概要
最小限のDockerイメージを作成していたら`E: Package 'mysql-client' has no installation candidate`というエラーになりました。

# エラー原因
利用したDockerfileは以下。簡単なRDSクエリを実行するだけのDockerイメージです。

```Dockerfile
# 使用するベースイメージを選択
FROM python:3.6

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    mysql-client \
    && rm -rf /var/lib/apt/lists/*

# イメージを起動したときに実行されるコマンド
CMD ["/bin/bash"]
```

これで生じたエラー全文が以下です。

```
[+] Building 5.7s (5/5) FINISHED
 => [internal] load build definition from Dockerfile                                                          0.0s
 => => transferring dockerfile: 336B                                                                          0.0s
 => [internal] load .dockerignore                                                                             0.0s
 => => transferring context: 2B                                                                               0.0s
 => [internal] load metadata for docker.io/library/python:3.6                                                 0.0s
 => CACHED [1/2] FROM docker.io/library/python:3.6                                                            0.0s
 => ERROR [2/2] RUN apt-get update && apt-get install -y     mysql-client     && rm -rf /var/lib/apt/lists/*  5.6s
------
 > [2/2] RUN apt-get update && apt-get install -y     mysql-client     && rm -rf /var/lib/apt/lists/*:
#5 0.468 Get:1 http://security.debian.org/debian-security bullseye-security InRelease [48.4 kB]
#5 0.508 Get:2 http://deb.debian.org/debian bullseye InRelease [116 kB]
#5 0.650 Get:3 http://security.debian.org/debian-security bullseye-security/main arm64 Packages [242 kB]
#5 0.827 Get:4 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
#5 0.848 Get:5 http://deb.debian.org/debian bullseye/main arm64 Packages [8071 kB]
#5 4.217 Get:6 http://deb.debian.org/debian bullseye-updates/main arm64 Packages [14.9 kB]
#5 4.841 Fetched 8536 kB in 4s (1898 kB/s)
#5 4.841 Reading package lists...
#5 5.154 Reading package lists...
#5 5.421 Building dependency tree...
#5 5.488 Reading state information...
#5 5.499 Package mysql-client is not available, but is referred to by another package.
#5 5.499 This may mean that the package is missing, has been obsoleted, or
#5 5.499 is only available from another source
#5 5.499
#5 5.539 E: Package 'mysql-client' has no installation candidate
------
executor failed running [/bin/sh -c apt-get update && apt-get install -y     mysql-client     && rm -rf /var/lib/apt/lists/*]: exit code: 100
```

このエラーメッセージは、DockerイメージのビルドプロセスでMySQLクライアントのパッケージをインストールしようとしたときに、`mysql-client`パッケージが見つからなかった、と言っていますね。

# 解決方法
DebianベースのDockerイメージを使用している場合、`mysql-client`パッケージの名前が異なることがあるとのこと。

Debian系のLinuxディストリビューションでは、MySQLクライアントは`mysql-client`ではなく`default-mysql-client`などの名前で提供されるよう。

以下のように修正したら、無事にイメージが作成できました。

```Dockerfile
Copy code
# 使用するベースイメージを選択
FROM python:3.6

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y default-mysql-client && rm -rf /var/lib/apt/lists/*

# イメージを起動したときに実行されるコマンド
CMD ["/bin/bash"]
```
Open InterpreterをDev Container（Docker）でサクッと使う！

# Open interpreterをDev Containerで動かす

Open Interpreter　超話題ですね！
「試してみたいけれど、ローカル環境で実行するのは何だか不安だし、Dockerで動かすのも何だか難しそうだし…」となっていたのですが、Dev Containerならサクッとコンテナ立ち上げられてできそう！と思って試してみました。

# 作った環境
作った環境はこちらです↓
https://github.com/5eiya/open-interpreter-devcontainer

- コンテナ諸々の設定は[こちらの](https://github.com/Standard-IO/devcontainers-templates) python3-poetry-pyenv のdevcontainerテンプレをそのまま利用しました。
- APIの種類ごとのフォルダを作成しました。
- pyproject.tomlに必要なライブラリ情報が記載してあります。（と言っても、open-interpreterとpython-dotenvだけですが！）
- .envファイルにAPIキーなどを記載して読み込むようにしました。

## Setup
### Clone or Download
適当な場所にCloneするかZipでダウンロード＆解答してください。

### .envファイルへAPIキー等を記入
`.env_sample`のファイル名を`.env`に変更し、 ファイルを開き、必要な情報を記入します。


## Dev Containersで開く
### VScodeにDev Containersをインストール
VScodeを立ち上げ、拡張機能から  `Dev Containers` をインストールします。
※Dockerをインストールしていない場合には、事前にインストールしてください。
![devcontainer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2930990/dfc68696-e3d5-7860-8caa-bd336e527515.png)



### フォルダを開く＆コンテナ立ち上げ
CloneしたこのリポジトリをVScodeで開きます。
右下のポップアップの「コンテナーで再度開く」をクリックするか、画面左下のDev Containersのアイコンをクリックして「コンテナーで再度開く」をクリックします。
![コンテナで開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2930990/2b2c7cdc-c976-ddbe-0eee-680cf264cfca.png)

VScodeの左下の表示が変わり、コンテナが立ち上がったことが確認できます。
![コンテナ起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2930990/d8fda301-5d49-4f56-b404-b4aefb4f8e94.png)


## ライブラリのインストール
### 利用したいAPIのディレクトリに移動
GPT-4, GPT-3.5, AzureのAPIごとにディレクトリを分けています。
ターミナルを起動し、利用したいAPIのディレクトリに移動してください。
例えば、GPT-3.5のAPIを利用する場合には、ターミナルで
`cd open_interpreter_gpt3`で移動します。

### ライブラリのインストール
ターミナルで移動したら、 `poetry install` コマンドを実行し、ライブラリをインストールします。
![ライブラリインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2930990/db50c194-c282-649f-c26c-5c18353fddcb.png)

## Open Interpreterの起動
上記のディレクトリ内で、 `poetry run python open_interpreter.py` コマンドを実行します。
ターミナルでOpen Interpreterが起動し、対話モードが開始されます。
`.env`に記載したAPIキー等を読み込んだ状態で対話モードが起動するので、APIキー等の入力は求められません。
※上記コマンドで自動的に仮想環境が立ち上がります。

## Open Interpreterの終了
Open Interpreterを終了するには、 `CTRL + C` で終了できます。
※仮想環境は自動で終了します。

## Dev Containersの終了
VScodeの左下のDev Containersのアイコンをクリックし、 `リモート接続を終了する` を選択すると、コンテナが終了します。

## 備考
- 利用するAPIごとに環境を分けていますが、 `open_interpreter.py` の内容が異なるだけで、インストールしているパッケージは同様です。
- 別の仮想環境を用意したい場合には、 別フォルダを用意し（好きな名前でOK）、`.venv` 以外のファイルをコピペ（利用するAPIのもの）し、上記の `ライブラリのインストール` を実行すればOKです。
gitで変更に特定の文字列を含んでいた場合はコミットできないようにする

自分のデバッグ用に一時的に変更した箇所等を誤ってコミットしてしまわないように、変更に特定の文字列を含んでいたらエラーにする。

.git/hooks/pre-commitを以下の内容で作成。

```shell
#!/bin/bash

marker_message="DO_NOT_COMMIT"
echo "check marker message '$marker_message'"
git diff --cached|grep '^+.*'"$marker_message"
if [ ${PIPESTATUS[1]} -eq 0 ]; then
    echo "error. changes contain marker message '$marker_message'"
    exit 1
fi
echo "OK. changes does not contain marker message"
```

実行権限を付与
```shell
chmod a+x .git/hooks/pre-commit
```

これで以下のような変更を加えた場合にはコミットでエラーになる。
```python
flag=xxx_hantei()
flag=True #DO_NOT_COMMIT 無理やりフラグを変える ←この行を追加した場合はコミットでエラーになる
if flag==True:
    略
```
select_relatedについてまとめる

djangoを使う案件に参画したので、備忘録として学んだことをまとめていきます。（初めての投稿なので慣れない点ご了承ください）

以前の僕と同じようにselect_relatedってなに！？ってなる方は読んでみてください

### select_related とは
djangok公式ドキュメントによると、
>Returns a QuerySet that will “follow” foreign-key relationships, selecting additional related-object data when it executes its query. This is a performance booster which results in a single more complex query but means later use of foreign-key relationships won’t require database queries.

だそうです、、？日本語訳すると↓
>クエリを実行する際に関連オブジェクトのデータを追加で選択し、外部キーのリレーションシップを "たどる "クエリセットを返します。これは、より複雑なクエリになりますが、後に外部キーリレーションシップを使用する際にデータベースクエリが不要になることを意味します。

んんー実際に見たほうが早いきがするので、コード見ていきましょう。

##### モデル定義

```django:models.py
class Parent(models.Model):
    father_name = models.CharField(max_length=20)
    mother_name = models.CharField(max_length=20)

class Child(models.Model):
    parent = models.ForeignKey('Parent', on_delete=models.CASCADE,)
    name = models.CharField(max_length=20)
    age = models.PositiveSmallIntegerField()
```

上記のようなモデル定義をしたとします（最低限）

このとき、特定の子供の親の名前と年齢を取得したいとしたらどうしますか？

##### select_relatedを使わないと
```
child = Child.objects.get(name="jon")
parent = child.parent
```

上記では、クエリが2回発行されてしまいます。

##### select_relatedを使うと

```
child = Child.objects.select_related("parent").get(name="jon")
parent = child.parent
```

上記では、クエリ１回でjonの親を取得することができます。

##### まとめ

上記の例のように、select_relatedを使うことで、外部キーでリレーションを持つテーブル同士であれば、クエリ発行回数を増やすことなく（1回で）データをとってくることができる
せんせー、スピンウェーブロジックってなに？

![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)

## ゲノムスケールモデリングって何？

みんな、「ゲノムスケールモデリング」はとっても大きなパズルゲームのようなものだよ。体の中にはたくさんの小さな部品があって、それらがどのように動いて、どのように組み合わさっているかを考えてみるゲームなんだ。

## どういうこと？

このゲームでは、人々はコンピュータを使って、体の中にあるすべての小さな部品を見て、それらがどのように動いているかを調べるんだ。これによって、私たちの体がどのように動いているかを理解することができるよ。

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

これがすごいのは、このゲームを使うことで、科学者さんたちは新しい薬や治療法を見つける手助けをすることができるからだよ。体の小さな部品がどのように動くかを理解することで、人々が健康でいられるようにする方法を見つけることができるんだ。

## だから、ゲノムスケールモデリングってなに？

ゲノムスケールモデリングは、体の小さな部品がどのように動いているかを調べる大きなパズルゲームのことなんだよ。

# まとめ

ゲノムスケールモデリングは、体の中の小さな部品を調べることで、人々が健康でいられる方法を見つける手助けをするとても重要なゲームなんだよ。これで、未来にはもっとたくさんの人が元気でいられるようになるかもしれないね！
Linuxコマンド集

※予測変換　tabキー
※入力履歴　↑キー

# (1) zipやtarの圧縮/解凍
- 圧縮 及び アーカイブ
```
$ zip -r 圧縮ファイル名.zip 圧縮対象ディレクトリ
$ tar -zcvf 圧縮ファイル名.tar.gz 圧縮対象ディレクトリ
```


- 解凍 及び 展開
```
$ unzip 圧縮ファイル名.zip -d 解凍先ディレクトリ
$ tar -xvzf 圧縮ファイル名.tar.gz -C 解凍先ディレクトリ
```
※解凍先のディレクトリを指定する場合は、「-d 解凍先ディレクトリ／-C 解凍先ディレクトリ」を記述する。

# (2) 現在の日付と時刻を取得
```
$ date
```

# (3) ファイル/ディレクトリの削除
※復元は出来ないので先にバクアップをとるのがベター。
```
$ rm ファイル名
ファイルの削除

$ rm ファイル名A ファイル名B
複数ファイルの削除

$ rm -r ディレクトリ名
指定したディレクトリとその下のすべてのファイルとディレクトリを削除

$ rmdir ディレクトリ名
ディレクトリ削除
```
removeの略。

# (4) ファイル編集
#### (1)
```
$ tee ファイル名 <<EOF > /dev/null
```
・「tee」の意味：標準入力からのデータをファイルに書き込みつつ、同時に標準出力にも出力するコマンド。

・「<<EOF」の意味：ヒアドキュメントと呼ばれる機能。EOFが再度現れるまでの間に入力されたテキストを、そのまま標準入力として扱う。なので上記コマンドを打ってからファイルを編集する際は、**最後に「EOF」をつける**こと。（End of Fileの略）

・「> /dev/null」の意味：teeコマンドによる標準出力を捨てるためのもの。

※このコマンドを実行するには、通常、スーパーユーザー（root）の権限が必要。

#### (2)
```
$ vi ファイル名
①編集可の状態でファイルを開く

「i」キー
②挿入（インサート）モードになり編集可の状態になる。

「Esc」（エスケープ）キー
③挿入（インサート）モード解除

$ :wq
④内容を保存して閉じる

$ :q!
④’内容を保存せずに閉じる
```

# (5)　sudo「スーパーユーザー（root）権限」
```
$ sudo 実施したいコマンド
```
sudoは「superuser do」の略で、スーパーユーザー（root）の権限でコマンドを実行するためのコマンド。
実施したいコマンドの頭に「sudo」をつける。


# (6)　環境変数の追加／削除／確認
```
$ export 変数代入式
追加　(例: $ export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/bin")

$ PATH=$PATH:追加するパス
システム環境変数Pathに新しいパスを追加　（例: $ PATH=$PATH:/etc/temp）

$ export -n 環境変数
削除　(例: $ export -n JAVA_HOME)

$ printenv
現在設定されている環境変数を全て確認

$ echo $環境変数
指定した環境変数を確認　（例: $ echo $JAVA_HOME）
```

# (7)　現在のディレクトリの場所確認
```
$ pwd
```
print working directoryの略。

# (8)　ディレクトリ移動
```
$ cd 移動先のディレクトリ名（又はそのディレクトリまでのパス）
ディレクトリ移動　（例: $ cd /etc/jboss）

$ cd ../
１つ上の階層のディレクトリへ移動
```
change directoryの略。

# (9)　ファイル作成
```
$ touch 作成ファイル名（又は作成ファイルを含めたパス）
（例: $ touch /etc/test1.txt）
```

# (10)　フォルダ作成
```
$ mkdir 作成ディレクトリ名（又は作成ディレクトリを含めたパス）
（例: $ mkdir /etc/work）
```
make directoryの略。

# (11) 　ディレクトリの中身を調べる
```
$ ls ディレクトリ名
指定したディレクトリの中身を調べる。

$ ls
現在いる場所のディレクトリの中身を調べる。

$ ls -l ディレクトリ名
オプション「-l」をつけると横並び表示で中身を調べられる。

$ ls -a ディレクトリ名
オプション「-a」をつけると隠しファイルも含めてディレクトリの中身を調べられる。
```
listの略。

# (12) ファイルの移動
```
$ mv 移動させるファイル名 移動先フォルダ名
（例: mv test1.txt /etc/jboss）
```

# (13) ファイルのコピー
```
$ cp コピー元のファイル名　コピーしたいファイル名
他のファイルへ内容をコピーする　（例: cp test1.txt test2.txt）
```

# (14) コマンド操作終了
```
$ exit
```

# サーバー編
- ルート権限変更
```
$ sudo -s
```

- ソフトウェアのインストール
```
$ yum （オプション） install ソフトウェア名
（Apacheのインストール例: yum install httpd）
```

- ソフトウェアの稼働状態の確認
```
$ systemctl status ソフトウェア名
```
・Active(running)：稼働中
・Active inactive(dead):停止中

- ソフトウェアを稼働
```
$ systemctl start ソフトウェア名
```

- ソフトウェアの稼働を停止
```
$ systemctl stop ソフトウェア名
```
せんせー、人工光合成ってなに？

![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)

## 人工光合成って何？
みんな、太陽が大好きな植物を知ってるね？植物は太陽の光を使って食べ物を作ることができるんだよ。それを「光合成」というんだ。でも、今科学者さんたちが植物みたいなことをできる特別な方法を考えているんだよ。それを「人工光合成」と呼んでいるんだ。

## どういうこと？

人工光合成は、人々が植物のやり方を学んで、太陽の光を使って新しいエネルギーを作る方法なんだ。エネルギーは電気や車を動かす力のことだよ。

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

それは、太陽の光はとてもたくさんあって、それを利用することで、いろんなものを動かす力を作ることができるからすごいんだよ。それに、この方法は自然にやさしい方法だから、地球にも優しいんだ。

## だから、人工光合成ってなに？

人工光合成は、科学者さんたちが太陽の光を使って、新しいエネルギーを作る特別な方法のことなんだよ。

# まとめ

人工光合成は、太陽の力を使って新しいエネルギーを作るすごい方法なんだ。これからは、この人工光合成でたくさんのエネルギーを作って、いろんなものを動かすことができるようになるかもしれないね！