OmniAICreator/Qiita-1.07M huggingface dataset:
間違えてgitのmaster(main)ブランチに変更を加えてしまった時の対処法

# 前提
うっかり、masterブランチにいるときに変更を加えてしまった。。。ということありますよね。
そんな時、変更ファイルが少ない時はいいのですが、ノリノリで結構変更してしまった。。。という時、その変更したファイル、変更点をそっくり別ブランチへ移動したい！という時の対処法です。

master上書きしたら、怒られちゃうもんね。

# まずは気にせずステージングへあげる
まずは変更したファイルをステージングエリアへ追加します。
いつも通りgit addしましょう。ドキドキしてしまいますね。

```
$ git add ファイル名
```
または、全部なら以下

```
$ git add .
```

# いつも通りコミット
またしても、いつも通りコミットします。わかりやすいメッセージをつけるといいかもしれません。

```
$ git commit -m '別ブランチへ退避'
```

# 移動させたいブランチへcheckout
先に、変更ファイルを移動させたいブランチへcheckout(切り替え)しておきましょう。

```
$ git checkout 切り替え先のブランチ名
```

ブランチを新しく作って、さらにそこへ切り返したい場合は

```
$ git checkout -b '作りたいブランチ名'
```

# [重要]いよいよ、masterブランチから移動させる

git logでさっきコミットしたIDを調べる。

```
$ git log
```

出たコミットIDを以下に入れる。

```
$ git cherry-pick <コミットID>
```

すると、さっきmasterブランチで行った編集ファイルは任意のブランチへ移動する。


# masterブランチの変更点を消す
さっきのコマンドをしてもmasterブランチの変更内容は残っているので、消します。

```
$ git reset --hard <コミットID>
```
ステータスラインにアクティブな言語サーバーを表示する方法(Neovim)

vim-jpで教えていただいた内容がとてもよかったので記事にしました。

## はじめに

Neovimのステータスラインに、アクティブな言語サーバーを表示する方法を紹介します。

私は [lualine](https://github.com/nvim-lualine/lualine.nvim) を使っていますが、 [Heirline](https://github.com/rebelot/heirline.nvim) などでも同じ方法で表示できます。

## 環境

- OS：macOS Ventura 13.3.1 (a)
- Neovim：v0.10.0-dev-416+g70da793c5
- lualine：commit 05d78e9
- null-ls：commit 4b055d8

## 設定ファイル

設定ファイルを紹介します。

アクティブな言語サーバーの一覧を取得し、サーバー名をカンマ区切りで文字列にし、 `lsp_names` という変数に格納しています。
null-lsの場合はソース（リンターやフォーマッター）の一覧を取得し、括弧内にカンマ区切りの文字列で格納しています。

あとは `lsp_names` をlualineの表示したい箇所に含めるだけです。

```diff_lua:lualine.lua
+ local lsp_names = function()
+   local clients = {}
+   for _, client in ipairs(vim.lsp.get_active_clients { bufnr = 0 }) do
+     if client.name == 'null-ls' then
+       local sources = {}
+       for _, source in ipairs(require('null-ls.sources').get_available(vim.bo.filetype)) do
+         table.insert(sources, source.name)
+       end
+       table.insert(clients, 'null-ls(' .. table.concat(sources, ', ') .. ')')
+     else
+       table.insert(clients, client.name)
+     end
+   end
+   return ' ' .. table.concat(clients, ', ')
+ end
+ 
require('lualine').setup {
  -- ...
  sections = {
    lualine_a = { 'mode' },
    lualine_b = { 'branch', 'diff', 'diagnostics' },
    lualine_c = {},
-     lualine_x = {},
+     lualine_x = { lsp_names },
    lualine_y = { 'encoding', 'fileformat', 'filetype' },
    lualine_z = { 'progress', 'location' },
  },
  -- ...
}
```

これでステータスラインにアクティブな言語サーバーの一覧が表示されました。
![スクリーンショット 2023-05-31 0.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/dadf6099-027c-03cc-6f8d-89daf66029a8.png)

`null-ls(stylua)` と `lua_ls` 、 `copilot` がアクティブなことがわかります。

## おまけ: vim.iter()を使う

まだリリースされていませんが、 `vim.iter()` を使うとスマートに書けます。

```diff_lua:lualine.lua
+ local lsp_names = function()
+   local clients = vim
+     .iter(vim.lsp.get_active_clients { bufnr = 0 })
+     :map(function(client)
+       if client.name == 'null-ls' then
+         return ('null-ls(%s)'):format(table.concat(
+           vim
+             .iter(require('null-ls.sources').get_available(vim.bo.filetype))
+             :map(function(source)
+               return source.name
+             end)
+             :totable(),
+           ', '
+         ))
+       else
+         return client.name
+       end
+     end)
+     :totable()
+   return ' ' .. table.concat(clients, ', ')
+ end
+ 
require('lualine').setup {
  -- ...
}
```

## おわりに

ステータスラインからアクティブな言語サーバーがわかるようになり、 `:LspInfo` を実行しなくても確認できるようになりました。

## 参考リンク

- [Show LSPInfo · Issue #8 · uhooi/dotfiles](https://github.com/uhooi/dotfiles/issues/8)
- [Refactor lsp_names with vim.iter · uhooi/dotfiles@21b93b1](https://github.com/uhooi/dotfiles/commit/21b93b1a24f13926f1efbe25bd56fc23b8fe0453)
l5-swaggerでOASをJSONではなくYAMLで生成する方法（おまけ：l5-swaggerのコンフィグ一覧）

[l5-swagger](https://github.com/DarkaOnLine/L5-Swagger)はインストール直後だと、OpenAPI Specification(OAS)がYAMLではなくJSONで出力されます。一般的にはYAMLで使用する機会が多いかと思いますので、今回その方法について調べました。

# 結論
Laravelの.envファイルに以下を記述しておけば`/storage/api-docs/api-docs.yaml`が生成されます。

```.env
L5_SWAGGER_GENERATE_YAML_COPY=ture
```

ただし、あくまでJSONファイルをもとにYAMLファイルをコピーして生成する機能です。そのため**JSONファイルとYAMLファイルの両方が出力されます**。現状YAMLファイルだけを生成する方法はないようです。

また、YAMLからSwagger UIを表示させたい場合は、さらに追加で以下の環境変数を.envに記述します

```.env
L5_FORMAT_TO_USE_FOR_DOCS=yaml
```

これで、Swagger UIはJSONではなくYAMLを参照してページを生成してくれるようになります。


# おまけ l5-swaggerの主要なコンフィグ一覧
このあたり公式ドキュメントにもまとまっていなかったので掲載します。
`app/config/l5-swagger.php`から主要なものをピックアップしましたのでご活用ください。

| 設定項目名 | 設定内容 | デフォルト値 |
|---|---|---|
| api.title | Swagger UIのブラウザタイトルを設定 | 'L5 Swagger UI' |
| routes.api | Swagger UIへのアクセスパスを設定 | 'api/documentation' |
| paths.use_absolute_path | UIのアセットに対してフルURLを使用するかどうかを設定 | true |
| paths.docs_json | 生成されるJSONドキュメンテーションファイルの名前を設定 | 'api-docs.json' |
| paths.docs_yaml | 生成されるYAMLドキュメンテーションファイルの名前を設定 | 'api-docs.yaml' |
| paths.format_to_use_for_docs | UIで使用するドキュメンテーションファイルの形式を設定 | 'json' |
| paths.annotations | Swagger注釈が格納されているディレクトリへの絶対パスを設定 | 'app' |
| securityDefinitions.securitySchemes | ドキュメントファイルに生成されるAPIセキュリティ定義の設定 | - |
| generate_always | 各リクエストでドキュメンテーションを再生成するかどうかを設定。デフォルトのfalseだとPHPDocではなくYAMLやJSONで直接記述できます | false |
| generate_yaml_copy | ドキュメンテーションをYAML形式でも生成するかどうかを設定 | false |
| proxy | プロキシのIPアドレスを信頼するかどうかを設定(AWS Load Balancer 使用時に必要) | false |
| additional_config_url | SwaggerUIBundleに渡す代わりに外部設定をフェッチするプラグインを設定 | null |
| operations_sort | 各APIの操作リストにソートを適用するかどうかを設定。 'alpha': 英数字順にパスで並​​べ替え。 'method': HTTP メソッドで並べ替え。 null: サーバーから変更されずに返された順序 | null |
| validator_url | JS側のSwaggerUi initにvalidatorUrlパラメータを渡すかどうかを設定 | null |

※上記表のベースはChatGPT-4に出力してもらいました。


### 余談
- l5-swaggerはドキュメントがあまり多くない印象です（[Githubのwiki](https://github.com/DarkaOnLine/L5-Swagger/wiki)のみ？）。これ以外にもどこかにまとまっているんですかね？知っている方いれば教えて頂きたいです！

- OpenAPI初心者の僕は結局アノテーションでOASを書くことにすらハードルを感じてしまい、GUIでYAML定義できる[Stoplight](https://stoplight.io/)に引っ越しました（SwaggerUIのためにl5-Swaggerは今も使用しています）
MetoreeはVue.jsのゴールドスポンサーになりました

Metoreeは、JavaScriptの優れたフレームワークであるVue.jsの開発と維持をサポートするために、ゴールドスポンサーとして正式に参加することを発表しました。

![vue-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457064/15646ec9-b64c-762f-dfdb-a1dc37689ee0.png)

https://vuejs.org/

Vue.jsは、その拡張性、効率性、使いやすさなどから、ウェブ開発コミュニティで非常に重要な存在となっています。Metoreeは、Vue.jsの成長と普及を支援し、さらなる発展を促進するために、ゴールドスポンサーとして活動します。

Metoreeは、技術革新とソフトウェア開発の最前線に立つことを目指しており、Vue.jsとそのコミュニティの成長に対して継続的に貢献していく意向です。

https://metoree.com/company/news/148835/


メトリーについて

メトリーはエンジニア・研究者や購買担当者のための産業用製品メーカー比較サイトです。測定器・センサ・プリンティング機械・工具など6,031カテゴリー、産業用製品メーカー・代理店など73,937社、各社カタログを掲載しています。

MetoreeJapan: https://metoree.com/
MetoreeUSA: https://us.metoree.com/
MetoreeEspaña: https://es.metoree.com/
MetoreeFrance: https://fr.metoree.com/
MetoreeDeutschland: https://de.metoree.com/
[Django] マイグレーション時にNo changes detectedと言われる

## 前提
- Djangoの環境を構築済であること


## 環境

- macOS
- Docker
    - Django
    - MySQL

## 経緯

1. アプリケーションを新規作成
1. model.pyを編集してモデルを作成
1. docker内のアプリケーションコンテナに`docker exec -it app bash`で入る
1. **`python manage.py makemigrations`を実行したら 「No changes detected」 と言われた。**

※`python manage.py makemigrations <アプリ名>`としても同様


## 結論

`setting.py`の`INSTALLED_APPS`に新規作成したアプリを追加していなかったことが原因。

```python:setting.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "analysis.apps.AnalysisConfig",  # ここに追加
]
```

↓↓これで解決。

```terminal:実行結果
Migrations for 'analysis':
  analysis/migrations/0001_initial.py
    - Create model Area
    - Create model Division
    - Create model Shop
    - Create model ShopSales
    - Create model Product
```

以上
dbt-coreにおけるOSS活動ことはじめその2 ~ 環境構築の話 ~

# 本記事が目指すこと
- dbt-coreにおけるOSS活動を始めるにあたってやるべきこと、学びになったことを紹介する
  - 複数回に渡り連載する予定
# 注意
- 投稿時点(2023/5/25)での情報に基づくため、本記事で紹介した手順が今後も利用できる保証はありません。また、本記事の内容を継続的にメンテナンスする予定も今のところは無いです
- なお、本記事は筆者が所属する会社と関係なく、個人の記事であることをご了承ください
# 背景
- 筆者は、ちゅらデータ株式会社に務める会社員であるが、就業時間中に職務としてのdbt-coreのOSS活動を始めた（OSS活動自体が初めての経験）
- CONTRIBUTING.mdを読めば環境構築ができるが、最低限何を実行すれば良いかについてはまとまっていないため、備忘録としてまとめる
# 本編
## 前提
- 自分のGitHubアカウントは既に存在していること
    - 作成してない場合は以下を参考に個人用GitHubアカウントを作成
        - 参考資料
            - [GitHub Docs：新しい GitHub アカウントへのサインアップ](https://docs.github.com/ja/get-started/signing-up-for-github/signing-up-for-a-new-github-account)
- Dockerサーバ/クライアントが利用できること
    - 以下を参考にDockerを入手
        - 参考資料
            - [docker docs：Docker の入手](https://matsuand.github.io/docs.docker.jp.onthefly/get-docker/)
- ターミナルまたはコマンドプロンプトにて実行するコマンドは`コードスパン`を用いて表現する

## 手順
1. [dbt-labs/dbt-core](https://github.com/dbt-labs/dbt-core)のリポジトリをフォークする
    1. 画面右上の[Fork]をクリックし、自分のリポジトリにフォーク
        - 参考資料
            - [GitHub Docs：リポジトリをフォークする](https://docs.github.com/ja/get-started/quickstart/fork-a-repo)
        - 期待される結果
            - [GitHubUserName/dbt-core]のリポジトリが作成される 
    2. `git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY`でフォークしたリモートリポジトリをローカルリポジトリとしてクローンする
        - 参考資料
            - [GitHub Docs：リポジトリをクローンする](https://docs.github.com/ja/repositories/creating-and-managing-repositories/cloning-a-repository)
        - 期待される結果
            -  カレントディレクトリに[dbt-core]が作成される

2. 環境準備（上記手順の1.2.にてクローンしたリポジトリ[dbt-core]で以下の操作を実施する）
    1. venv環境を作成
        - `python3 -m venv env`
            - 期待される結果
                - カレントディレクトリに[env]が作成される
    2. venv環境をアクティベート
        - macの場合
            - `source env/bin/activate`
        - Windowsの場合
            - `env\Scripts\activate `
        - 期待される結果
            - コマンドラインの先頭に(env)と表示される
    3. pipモジュールを最新版にする
        - `pip install --upgrade pip`
        - 期待される結果
           - [Successfully installed pip-xx.x.x] と表示される(xxはpipのバージョン)
    4. dbt環境をインストール(クローンしたdbt-coreディレクトリで)
        - `make dev`
        - 正常終了後、以下のコマンドを実行
            - dbt環境がvenv環境に作成されていることを確認
                - `which dbt`
            - 期待される結果(venv環境のパスを示していればOK)
                - [env/bin/dbt]と表示される
    5. Dockerを用いてローカルにDB環境(Postgres)をセットアップ
        - `make setup-db`
        - 正常終了後、以下のコマンドを実行
            - dockerコンテナが起動していることを確認
                - `docker ps`
            - 期待される出力
                - DB(Postgres)コンテナ[dbt-core_database_1]が確認できる
    6. ~/.dbt/profiles.ymlに以下のプロファイルを記載(5.で作成したDBとの接続情報（docker-compose.ymlに記述したdatabaseの設定値）を記述すればよい)
```
default:
  target: dev
  outputs:
    dev:
      type: postgres
      host: localhost
      user: root
      password: password
      port: 5432
      dbname: postgres
      schema: public
      threads: 4
``` 

以上。テストについては続編で執筆予定

# 終わりに
ちゅらデータでは、クレイジーな仲間を募集しているでござる
データエンジニア、もしくはSE系からデータエンジニアになりたい方がいればぜひ、御仁の力量に応じたグレード（ジュニア/ミドル/シニア）にて、応募するでござる

https://herp.careers/v1/churadata/T6Oag1FxE34V
おしゃれなプログラミング言語ランキング 💎


こんにちは

全く実用性がない知識ですが、ふと一番おしゃなプログラミング言語は何か気になったので、ChatGPTに聞いてみたので回答結果を共有したいと思います。


## 本編（ChatGPTの回答）

1. **Swift（スウィフト）: ★★★★★**
   - エレガントで美しい構文を持ち、読みやすく書きやすいコードを作成できる。
   - Appleのエコシステムとの親和性が高く、モダンなアプリケーション開発が可能。
   - 高いパフォーマンスと安全性を備えており、信頼性の高いアプリケーションを開発できる。

2. **JavaScript（ジャバスクリプト）: ★★★★☆**
   - ウェブ開発において幅広く使われ、動的な要素の追加やユーザーとの対話を実現できる。
   - フロントエンドからバックエンドまで利用範囲が広く、汎用性が高い。
   - 様々なフレームワークやライブラリが存在し、開発者コミュニティが活発。

3. **Python（パイソン）: ★★★★☆**
   - シンプルで読みやすい構文を持ち、初学者にも優しい言語。
   - 豊富なライブラリやフレームワークがあり、幅広い用途で利用可能。
   - データサイエンスや機械学習など、多岐にわたる領域で人気。

4. **Ruby（ルビー）: ★★★★☆**
   - 可読性の高い構文とエレガントなデザインが特徴。
   - 独自の哲学に基づいており、開発の楽しさを追求。
   - Ruby on Railsとの組み合わせで、迅速かつ効率的なウェブアプリケーション開発が可能。

5. **Kotlin（コトリン）: ★★★☆☆**
   - Javaとの互換性があり、既存のJavaコードとの連携が容易。
   - コードの記述量を減らし、安全性と表現力を向上させることができる。
   - Androidアプリケーション開発において注目を集めている。


7. **Rust（ラスト）: ★★★★☆**
   - メモリ安全性と並行性を強調したシステムプログラミング言語。
   - 堅牢性と高速性を両立し、低レベルの制御が必要なプログラムにおいて信頼性の高いソリューションを提供。
   - パフォーマンス志向の開発者に人気であり、Webアセンブリや組み込みシステムなど幅広い領域で活躍。

7. **Go（ゴー）: ★★★☆☆**
   - シンプルな構文と効率的な並行処理を特徴とする言語。
   - バイナリサイズが小さく、高速な実行が可能。
   - ネットワークプログラミングや分散システムの開発に適している。

8. **TypeScript（タイプスクリプト）: ★★★★☆**
   - JavaScriptの拡張で、静的型付けをサポートする言語。
   - エラーの早期検出や大規模なアプリケーションの保守性を向上させる。
   - Angularフレームワークなどのプロジェクトでよく使用される。

9. **Dart（ダート）: ★★★☆☆**
   - Googleが開発したクライアントサイドアプリケーションの開発に特化した言語。
   - シンプルな構文と高速な実行性能を持ち、モバイルアプリやウェブアプリの開発に適している。
   - Flutterフレームワークとの組み合わせが強力。

10. **Scala（スカラ）: ★★★☆☆**
    - 関数型プログラミングとオブジェクト指向プログラミングを組み合わせた言語。
    - 表現力が高く、堅牢で拡張性のあるアプリケーションを構築できる。
    - ビッグデータ処理フレームワークであるApache Sparkなどで広く使用されている。

11. **Elixir（エリクサー）: ★★★☆☆**
    - Erlang VM上で動作する関数型プログラミング言語。
    - 可読性が高く、スケーラブルな分散システムやリアルタイムアプリケーションの開発に向いている。
    - フェニックスというウェブフレームワークが人気。

12. **Julia（ジュリア）: ★★★☆☆**
    - 科学計算や数値解析に特化した高水準プログラミング言語。
    - 高速な実行性能とPythonやRとの統合性が魅力。
    - 機械学習やデータサイエンスの分野で注目を浴びている。

13. **R（アール）: ★★★☆☆**
    - 統計解析やデータ処理に特化したプログラミング言語。
    - 豊富なデータ操作・可視化のライブラリが存在し、データサイエンスや統計モデリングにおいて強力なツールとなる。
    - RStudioなどの統合開発環境が充実しており、使いやすさも魅力の一つ。

14. **Lua（ルア）: ★★★☆☆**
    - 組み込みシステムやゲーム開発に広く使われるスクリプト言語。
    - 軽量かつ高速な実行性能を持ち、拡張性にも優れている。
    - C言語との連携が容易であり、組み込みシステムにおける柔軟性が評価されている。

15. **C#（シーシャープ）: ★★★☆☆**
    - マイクロソフトが開発したマルチパラダイムのプログラミング言語。
    - オブジェクト指向プログラミングの特徴を持ち、.NETフレームワークとの統合が強力。
    - Windowsアプリケーションやゲーム開発など、マイクロソフトエコシステムでの利用が主要。

16. **Haskell（ハスケル）: ★★★☆☆**
    - 純粋な関数型プログラミング言語であり、数学的な厳密性を重視している。
    - 強力な型システムによりエラーを早期に検出し、安全性と信頼性を高める。
    - アカデミックな研究や形式検証など、厳密なプログラミング領域での使用が一般的。

これらの言語はそれぞれに個別の特徴と魅力を持っており、多様な用途で利用されています。

おしゃれ度の評価は主観的な要素が強いため、個々の開発者やプロジェクトのニーズに合わせて最適な言語を選択することが重要です。
ローカル変数とインスタンス変数の違い

1.変数とはなにか
---
何かのオブジェクトを指し示すことができる存在です。
~~~console
name = "Jojo"
~~~
変数を通じてオブジェクトを参照できるようにすることを **代入する** と言います
変数には　**ローカル変数** と **インスタンス変数** などの種類があります。

2.インスタンス変数とはなにか
---
インスタンス変数は、インスタンス（オブジェクト）が持つ変数です。同じオブジェクトであれば、複数のメソッドをまたいで使うことができます。インスタンス変数は、変数名の先頭に＠をつけて使います。
~~~ruby
class User
 def name=(name)
  @name = name       #インスタンス変数@nameに”Jojo”を代入-----③
 end
 def name
  @name
 end
end

user = User.new     #Userクラスのオブジェクトを作る-----①
user.name = "Jojo"  #nameメソッドを呼び出す-----②
=> "Jojo"
~~~
ここでは、①「name」という名前を設定するメソッドを定義しました。②で`name`=メソッドを呼び出し、引数として"Jojo"を渡しています。③で引数で渡された"Jojo"をインスタンス変数@nameに渡しています。

複数のオブジェクトにそれぞれ違う名前を設定してみます。
~~~console
> user1 = User.new
> user.name = "Dio"
=> "Doi"

> user2 = User.new
> user.name = "Kira"
=> "Kira"
~~~
無事、オブジェクトごとに別々の名前を入れて扱うことができるようになりました。

3.ローカル変数とインスタンス変数の違い
---
<table>
  <thead>
    <tr>
      <th>種類</th> <th>特徴</th>
    </tr>
  </thead>
  <tr>
    <td> ローカル変数 </td> <td>その場限りの一時的な変数。定義したメソッドの中でしか使えない。</td>
  </tr>
  <tr>
    <td> インスタンス変数 </td> <td>オブジェクトの保持する変数。同じオブジェクトであればどのメソッド内からでも利用できる。</td>
  </tr>
</table>

4.まとめ
--
<ul>
 <li>ローカル変数は、定義したメソッドの中でしか使えない
　<li>名前が＠で始まる変数はインスタンス変数
　<li>インスタンス変数は同じオブジェクトであればメソッドをまたいで使うことができる
　<li>インスタンス変数は代入が実行された時に生まれる。
</ul>

参考文献
--
[ゼロからわかるRuby超入門]
【データサイエンス】自然言語処理

# ０．はじめに																					
大学でデータサイエンスの講義を受講している者です。
あまりにも広範囲な分野であるため"広く浅く"情報整理したいため投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。
（齟齬がある場合はご指摘いただけると助かります。）	

#### データサイエンス学習全体像
[【データサイエンス】概要](https://qiita.com/AkihideKato/items/9dbce22bd87a9c8a3989)
[【データサイエンス】人工知能](https://qiita.com/AkihideKato/items/6381dd320ead9f893577)
[【データサイエンス】機械学習](https://qiita.com/AkihideKato/items/1db3312e8038bd75e89b)
[【データサイエンス】ディープラーニング](https://qiita.com/AkihideKato/items/92b0fb83b35ec08c4e02)
[【データサイエンス】分析の分類・確率分布](https://qiita.com/AkihideKato/items/6fdca6e22f03f0b9f17c)
[【データサイエンス】探索的データ分析](https://qiita.com/AkihideKato/items/9485e3f9803b1e8fe785)
[【データサイエンス】統計的検定](https://qiita.com/AkihideKato/items/8ff1b9bada50491b017c)
[【データサイエンス】予測モデリング](https://qiita.com/AkihideKato/items/ce8e697546d0424bea46)
[【データサイエンス】自然言語処理](https://qiita.com/AkihideKato/items/e545f36e268605fce9a6)
[【アルゴリズム】パーセプトロン](https://qiita.com/AkihideKato/items/fc9a8205154fe9b3090f)
[【データサイエンス】機械学習における関数](https://qiita.com/AkihideKato/items/6ec3b59ff581e7e3c4ad)
[【データサイエンス】確率](https://qiita.com/AkihideKato/items/c099772dfca7546a6802)

# １．自然言語処理
言語処理においても学習したため一部抜粋
個人的にはテキストがどのようにコンピュータ側に理解されているのかの概念が面白かった

# ２．特徴
### 2-1.なぜ自然言語処理が必要とされているのか

ビッグデータ時代ともあり様々なデータを併用するにあたりテキストデータの重要性が上がってきているため	
具体的な例だとSNSの情報や音声での会話記録などの生データがそれにあたる	
- ``顧客の評価データを収集しマーケティングに用いる``
- ``音声・テキストの記録データから市場の動向を探る``
といった分析面においても重要なデータとなる	

### 2-2.形態素解析とは
英文は単語ごとにスペースとスペースで区切られそれぞれ独立しているが日本文は区切られてはいない	
そのため形態素のレベルまで落とし込み分析をする必要がある	

- #### 形態素とは
意味における最小単位のこと

### 2-3.コンピュータはなぜ自然言語を扱えるのか
様々な考え方により精度が向上し扱えるようになった

- #### 統語論
文章を理解するために英語の授業でやったような S(主語) V(述語)と 関係性を見出す必要がある
動詞形容詞の分類をタグ付けすることにより文法定義が可能

- #### 核文法
- **``格文法の原理 byチャールズフィルモア``**
		表面的な文章のゆれに捕らわれないで文の意味を捕らえるべきという考え方
		言語を動詞を中心とした目的格・主格・道具格の関係によって捉えようとしている
- **``FrameNet``**
		「誰が料理するのか何を料理するのか」という関係を記述した部分から
		語彙を出すことにより``Cooking Frame``が起動、枠組みを表すことができるモデル
		コンピュータが世界についての常識・知識を蓄えることを目的としている側面がある

### 2-4.ネットワークの構成で表現
トポロジー図みたいにある単語から構成し関係性を見出す考え方もある
発話は「何のためにするのか」といった意図が必要になる
そのためにプランニングという概念が必要


### 2-5.言語理解が難関な理由
日本語例だと「ハシ」は橋にも箸にも取れる
談話レベルで「あれ」「それ」が何を指すのか理解が難しい
日本語はゼロ代名詞と呼ばれる主語・目的語が省略される特性がある
全て統語論で理解できるわけではないため様々な分野の研究が現在においても行われている
コンピュータが世界についての知識を蓄えることも課題として挙げられる

### 2-6.機械翻訳が向上する
以前はパーザが統合解析を行い、適切な文字を取り出して文章化されていた
ただこれはあまり精度がよくなかった
原因例だと``「Bank」``という言語は金融や道路など複数の意味として略されてしまう
ニューラルネットが進出し``encoder-decoderモデル``が提唱
精度が急激に向上した

- ##### encoder-decoderモデル
``encoder``と``decoder``の2構成で成り立つモデル	
``encoder``で一度文字をベクトル変換し``discoder``へ渡す	
ベクトル変換することでざっくりと文脈を捉えやすいようにされている	
処理しやすい状態で``decoder``に渡すため理解が促進される	

# ３．応用例
言語をカテゴリー分けすることができるためA書籍に
- ``何の単語が多く使われているか	``
- ``aの単語の後に続く単語は何がよく使われるのか	``
- ``aの単語と似たようなカテゴリーの単語はよく使われるのか``	
といった分析が可能	
代表的にはN-gramモデルがある
【Vuetify】定数ファイルの設定値を利用して画面表示する

## やりたいこと
定数ファイルに定義した内容を画面上のプルダウンに設定する

## 動作環境
- Vuetify　2.6.14
- Node　16.13.0
- vue　2.7.14


## 方法
#### 実装
```constants.js
export const fruits = {
  fruit: [
    {
      name: 'りんご',
      value: 'apple',
    },
    {
      name: 'いちご',
      value: 'strawberry',
    },
    {
      name: 'みかん',
      value: 'orange',
    },
  ],
}
export default (context, inject) => {
  inject('fruits', fruits)
}
```

```form.vue
<template>
  <v-app>
    <v-container>
      <v-select
        v-model="selectFruit"
        item-text="name"
        item-value="value"
        :items="dispFruits"
        label="好きなくだもの"
      >
      </v-select>
    </v-container>
  </v-app>
</template>
<script>
// 定数ファイルのインポート
import { fruits } from '~/plugins/constants'
export default {
  data() {
    return {
      // プルダウンで選択した要素の受け取り用オブジェクト
      selectFruit: { name: '', value: '' },
      // プルダウン表示用オブジェクト
      dispFruits: null,
    }
  },
  created() {
    // プルダウン表示用オブジェクトに定数ファイルから取得したオブジェクトを追加
    this.dispFruits = fruits.fruit
  },
}
</script>
```

#### 画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456825/1822b4be-56c9-c44e-7126-31b7573d8008.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456825/314153f0-494b-7127-b7b7-badb1c1ca454.png)


### 参考サイト
- [Select component - Vuetify](https://vuetifyjs.com/en/components/selects/)
- [Vue.jsで都道府県の定数を定義して、プルダウンのセレクトボックスを作る](https://saunabouya.com/2022/02/08/vue-js%E3%81%A7%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C%E3%81%AE%E5%AE%9A%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%A6%E3%80%81%E3%83%97%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%81%AE%E3%82%BB/)
- [Vue.jsでのグローバル定数管理を工夫してみた話](https://developers.microad.co.jp/entry/2021/02/08/063000)
【完全ガイド】mainブランチの最新変更をfeatureブランチにマージする方法：Github Desktop, Github Web, VSCode

## この記事の分類
この記事は個人的な学習ノートです。

## 何がしたいのか
AとBのプルリクエストを作っている時、「あ〜Aはマージできたけど、BのブランチでAの変更内容も合わせた状態で動作検証したいな」となるときはよくあると思います()

望む操作は以下の通りです。
1. feature/Aブランチをmainブランチにマージ
2. mainブランチの変更をfeature/Bブランチに同期(同期と呼ぶのでしょうか?)
3. feature/Bブランチで動作検証

CLIの方法は検索すると(おそらく？)見つけられました。
参考: https://zenn.dev/koushikagawa/articles/329b7405ac672d

私はGitをGUIでぽちぽちしたい派閥なので、GUIの方法をまとめてみました。


## 目次
1. Github Desktopを使用した方法
2. Github Webを使用した方法
3. VSCodeを使用した方法


## 1. Github Desktop
1. Github Desktopを開き、対象のリポジトリを選択します。
2. 左上の「Current Branch」ドロップダウンをクリックし、mainブランチを選択します。
3. 最新の変更をPullしてください。(Fetch origin をクリック)
4. 再度「Current Branch」ドロップダウンをクリックし、featureブランチを選択します。
5. メニューバーの Branch -> Merge into Current Branch をクリックします。
6. 表示されるポップアップで、mainブランチを選択し、Merge main into feature ボタンをクリックします。 


これで、mainブランチの最新の変更がfeatureブランチにマージされます。

## 2. Github Web
1. Githubのリポジトリページを開きます。
2. "Branch" ドロップダウンから mainブランチを選択します。
3. "Code" ボタンの隣の "Pull request" ボタンをクリックします。
4. 画面上部の "base" ドロップダウンを "feature" に、"compare" ドロップダウンを "main" に変更します。
5. "Create pull request" ボタンをクリックし、詳細を入力した後、再度 "Create pull request" ボタンをクリックします。
6. "Merge pull request" ボタンをクリックし、確認ダイアログが表示されたら 7. "Confirm merge" ボタンをクリックします。

これで、mainブランチの最新の変更がfeatureブランチにマージされます。

## 3. Visual Studio Code
1. Visual Studio Codeを開きます。
2. 左側のソースコントロールアイコン（3つの円と2本の線が描かれたアイコン）をクリックします。
3. ブランチの名前（デフォルトではmainまたはmaster）をクリックし、入力フィールドに"feature"と入力し、Enterを押します。これでfeatureブランチに切り替わります。
4. 同じパネルの上部にある "..." アイコンをクリックし、"Pull, Push" オプションを選択します。そして、"Pull from..." を選択します。
5. "origin/main" を選択し、Enterを押します。


これで、mainブランチの最新の変更がfeatureブランチにマージされます。

## まとめ・注意
以上、Github Desktop, Github Web, VSCodeを用いたmainブランチの最新の変更をfeatureブランチにマージする方法について解説しました。どのツールを使用するかは、プロジェクトの状況やチームの好みによりますが、ここで説明した手順に沿って操作すれば、問題なくマージを行うことができるでしょう。これからも効率的な開発のための最適な方法を探求していきましょう！
Box CLIで定期的にフォルダをアップロードする

# Box CLIで定期的にフォルダ（ファイル）をアップする
タイトルの通りですが、通常のuploadコマンドを使うと、同名ファイルやフォルダがあるとエラーが出てアップロードできません。

力技ですが、アップしたいフォルダ内のIDを取得して、削除してから再アップロードする手順で解決したのでメモしておきます。
※下記Sampleでは1フォルダしか処理してません。複数ファイルとかフォルダを処理する時はfor回すなりの改変をお願いします

```test.bat
rem Boxフォルダのデータを一度削除する

box folders:items folderID --csv >> test.csv


rem 取得したcsvからIDを抜き出す

set "csv_file=test.csv"
set "data="

for /f "skip=1 tokens=2 delims=," %%G in (%csv_file%) do (
    set "data=%%G"
    goto :next
)

:next
echo %data%

rem 不要なファイルは削除しておく
del test.csv

rem 指定したフォルダを削除（-rで中身が残っていても強制削除）
box folders:delete %data% -r
```

あとは通常のアップロードを行うだけです。

```Box_upload.bat
rem Boxへフォルダごとアップロード
box folders:upload ./upload_folder --parent-folder=floderID
```

もう少しBox CLIの情報増えてくれないかな……。
Amazon SageMaker Data Wrangler に画像の前処理が追加

# はじめに
AWS UpdateでAmazon SageMaker Data Wranglerに画像の前処理機能が追加されました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/05/amazon-sagemaker-data-wrangler-image-data-preparation/

Data WranglerはAmazon SageMaker Studioの機能の一つで、データの前処理が行えるサービスです。
従来はファイルタイプとしてcsv, parquet, json, jsonl, orcに対応していたようですが、「image」が追加されました。

利用イメージは以下のようになります。

![DataWrangler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/954d8301-97cd-4bdc-696e-4435061ba3e9.png)

https://aws.amazon.com/jp/sagemaker/data-wrangler/?sagemaker-data-wrangler-whats-new.sort-by=item.additionalFields.postDateTime&sagemaker-data-wrangler-whats-new.sort-order=desc

# やってみる
「S3からインポート → 重複削除 → ノイズ付与 → S3にエクスポート」という流れを試してみます。
インポートするS3バケット内に同じ画像データを2枚用意しました。
この画像に処理を行い、エクスポートするまでを試してみます。
## データインポート
データソースをS3としてインポートします。File typeは「image」を選択しました。
![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/309f911d-f930-21d8-cf53-4550e8e54865.png)

インポートが完了するとプレビューが表示されます。
右側のALL STEPS内の「Add step」から処理を追加することで、前処理のステップを定義することができます。
![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/1536788f-fdfb-171a-d509-d56ddc0ffb9a.png)

カスタムで作成したスクリプトをステップに追加することもできるのですが、以下の組み込みの変換も用意されています。
- Blur image(画像のぼかし)
- Brightness(明るさ)
- Color channels(カラーチャンネル)
- Corrupt image(ノイズ付与)
- Drop corrupted images(ノイズ画像の除去)
- Drop duplicates(重複画像の削除)
- Enhance image contrast(コントラスト)
- Grayscale(グレースケース化)
- Resize image(リサイズ)
- Rotate(回転)
- Split data(データ分割)

今回は重複削除とノイズ付与を実施するので「Drop image duplicates,Corrupt image」を追加しました。
適用されると猫が一匹になり、ノイズが付与されます。
![image_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/96d41dd7-c1d0-d8f1-90ff-68520bf060f9.png)

## データエクスポート
データをS3バケットの対象フォルダにエクスポートします。
左上の「Data flow」からデータフローの一覧に戻り、「Corrupt image」右の＋を押下します。
「Add Destination」→ 「Amazon S3」を選択し、エクスポートするフォルダを選択します。
![image_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/e9f27afc-d9ab-0441-14b9-f766c81cfac2.png)

## ジョブの作成・実行,結果の確認
最後にワークフローを実行します。ワークフロー画面右上の「Create job」から環境の設定を行い、ジョブの実行を行います。
![image_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/46a18cc8-c4f8-f488-dc90-961e769347eb.png)

ジョブの実行状況はAmazon SageMakerコンソールの「Processing/処理ジョブ」から確認できました。
![image_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/345e83bf-2897-de6a-9244-406c481f3252.png)



S3バケットに加工済みの画像ファイルがアップロードされていることを確認できました。
![image_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/ac860f60-030f-7645-8806-f14c24b812d5.png)

# まとめ
Amazon SageMaker Data Wranglerの新機能、画像の前処理を試してみました。このアップデートにより、よりData Wranglerのユースケースの幅が広がったと思います。
# 参考
https://aws.amazon.com/jp/about-aws/whats-new/2023/05/amazon-sagemaker-data-wrangler-image-data-preparation/

https://aws.amazon.com/jp/blogs/machine-learning/prepare-image-data-with-amazon-sagemaker-data-wrangler/
"i.e."や"e.g."などのラテン語略語の読み方一覧　～英語の場合、日本語の場合～

学術論文や専門的な文書を読む際に、ラテン語略語をよく見かけることがあります。なんとなく意味は分かるけど、読み方知ってますか？私は知りませんでした！笑

論文を声に出して読むことも少ないかもしれませんが、知っておくといざという時に役に立ちそうなので、備忘録として置いておきます。


| 略語   | 意味           | 日本語読み方         | 英語読み方               |
|--------|----------------|----------------------|--------------------------|
| i.e.   | すなわち、つまり | 「すなわち」または「つまり」 | "that is" or "in other words" |
| e.g.   | 例えば         | 「例えば」             | "for example"             |
| etc.   | その他、他のもの  | 「その他」または「他のもの」 | "et cetera" or "and so forth" |
| vs.    | 対             | 「対」                 | "versus"                  |
| et al. | および他の人々   | 「および他の人々」      | "et alia" or "and others"  |
| ibid.  | 同前            | 「どうぜん」           | "ibidem" or "in the same place" |


もとがラテン語なので、英語ネイティブの方でも知らなかったりします。
"i.e."を"アイ・イー"ではなく、"that is"とか読めたらかっこいいですよね。
CP4DaaSのWatsonStudioでメモリやCPUを増やしてJupyterNotebookを起動する

CP4DaaSのWatson StudioでJupyter Notebookではデフォルトは2VCPU,8GB メモリで起動します（2023/5/25に確認）。大きなデータを扱う場合にメモリやCPUを増やしたいという場合には環境定義を行うことで可能です。

* テスト環境
    * CP4DaaS

# 1. 新規環境定義

「プロジェクト」を開き、「管理」＿環境」タブを開きます。

「ツールラインタイム」として以下のテンプレートが用意されています。素のPython3.10のランタイムとして以下はあらかじめ用意されていました。
• 1 vCPU + 4 GB RAM 
• 2 vCPU + 8 GB RAM
• 4 vCPU + 16 GB RAM

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7c04b8f1-e18a-b745-d17f-900123fbe12b.png)

ここにないスペックのランタイムが欲しい場合にはテンプレートを作る必要があります。
「テンプレート」「新規テンプレート」をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e51687b7-a7aa-40d1-6f19-9f4f89d277e9.png)


名前を付け、VCPUとRAMを指定し、「作成」します。ここでは8VCPU,32GBのメモリーを指定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/112c9c9d-bbf5-b199-d683-d234503ff141.png)




テンプレートの一覧にも追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0613b081-5ed8-b930-008f-afd7f49d670a.png)


# 2. Jupyter Notebookの起動
Jupyter Notebookを作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1367d058-7894-99d9-b2d4-594619470e62.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/81693bfb-9f4f-2064-b787-356dc0329a48.png)



「ランタイムの選択」として先ほど作成した8VCPU,32GBの環境を選択してNotebookを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b90f37ae-0987-1ae1-5923-3a71f7c382bd.png)


8VCPU,32GBで起動していることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f5ae1953-db0b-2340-5371-0bf0cc1556df.png)


既存のNotebookを先ほどの8VCPU,32GBの環境で起動する場合は、まずロックを解除します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0f14374a-1d96-d30f-1e30-7b55a0e56191.png)


次に、環境の変更を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/77da4cdb-b8e1-87fb-832a-3cf97209b17d.png)


そして、テンプレートとして8VCPU,32GBの環境を関連付けします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2a1cc803-6d1c-5217-2e39-ab882a0ee50e.png)

# 3. その他のランタイムのバリエーション

ランタイムのテンプレートにはバリエーションが選べます。

Decion Optimization（DO）やRの環境のテンプレートを作成することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/03a51c9e-45d6-dbe6-a9b2-f0736c89dc2b.png)

また、Spark環境ですとDriverやWorkerのランタイムやWorkerの数などを指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3978c641-6d9d-62df-2885-0f24750f6443.png)

GPUの提供されているリージョン（2023/5/25時点ではダラスのみ）ではGPU付きのテンプレートを選ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ac016c18-1e1f-91da-3538-75444e05399b.png)

ランタイムのパターンと課金単位のCUHについては以下で公開されています。
https://cloud.ibm.com/catalog/services/watson-studio

2023/5/25時点の情報は以下です。ライト版では4VCPU+4GB RAMが最大です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7db4dd09-df09-b7c0-a2b9-e5ce9dd8a3fe.png)
【データサイエンス】統計的検定

# ０．はじめに																					
大学でデータサイエンスの講義を受講している者です。
あまりにも広範囲な分野であるため"広く浅く"情報整理したいため投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。
（齟齬がある場合はご指摘いただけると助かります。）

#### データサイエンス学習全体像
[【データサイエンス】概要](https://qiita.com/AkihideKato/items/9dbce22bd87a9c8a3989)
[【データサイエンス】人工知能](https://qiita.com/AkihideKato/items/6381dd320ead9f893577)
[【データサイエンス】機械学習](https://qiita.com/AkihideKato/items/1db3312e8038bd75e89b)
[【データサイエンス】ディープラーニング](https://qiita.com/AkihideKato/items/92b0fb83b35ec08c4e02)
[【データサイエンス】分析の分類・確率分布](https://qiita.com/AkihideKato/items/6fdca6e22f03f0b9f17c)
[【データサイエンス】探索的データ分析](https://qiita.com/AkihideKato/items/9485e3f9803b1e8fe785)
[【データサイエンス】統計的検定](https://qiita.com/AkihideKato/items/8ff1b9bada50491b017c)
[【データサイエンス】予測モデリング](https://qiita.com/AkihideKato/items/ce8e697546d0424bea46)
[【データサイエンス】自然言語処理](https://qiita.com/AkihideKato/items/e545f36e268605fce9a6)
[【アルゴリズム】パーセプトロン](https://qiita.com/AkihideKato/items/fc9a8205154fe9b3090f)
[【データサイエンス】機械学習における関数](https://qiita.com/AkihideKato/items/6ec3b59ff581e7e3c4ad)
[【データサイエンス】確率](https://qiita.com/AkihideKato/items/c099772dfca7546a6802)

# １．統計的検定
主に仮説を扱う
仮説に対して統計的に差異があるかどうかをポイントとしている
ここでは以下を扱う
- ``t検定``
- ``分散分析（ANOVA）``
- ``仮説検定``
- ``適合度検定``
- ``カイ二乗検定``

# ２．t検定
2つのグループの差を求める検定
独立変数の平均に差があるかどうかの検定を行う
- ``独立変数とは``
説明変数、要因となるか否かの変数
- ``ざっくりと計算方法``
mA-mB（m：mean平均）

# ３．分散分析（ANOVA）
３つ以上のグループの際に使用する分析
注意点としては「3つの群の間に差があるという点しか判断ができない」
よってペアずつの差を確かめる為には事後分析が必要

### 3-1.ざっくりと計算方法
グループ間の分散/グループ内全体の分散

### 3-2.仮説検定
仮説が真であるかどうかを検証する検定
帰無仮説と対立仮説の二つを立てる必要がある

- #### a.帰無仮説(H0)
言葉通り「無に帰す」、まず先に立てられる仮説
否定されるかされないかで仮説を立てる基準のようなもの
帰無仮説が成立する``確率``が一定以上あれば成り立つ

- #### b.対立仮設(H1)
帰無仮説ではないもの
有意義な差が認められる仮説

### 3-3.確率とは
有意水準、alpha（0.05,0.01,0,001）
帰無仮説が5%以下ならば帰無仮説は「棄却される」、対して5%以上ある場合は採用のため「棄却できない」となる

### 3-4.採用か棄却か
例題：カイ二乗検定の結果は0.5、有意水準が0.05（5％）とする
**``この場合結果は50％と有意水準の5％以上ある。よって帰無仮説（5%以上あれば採用）は採用される``**

# ４．適合度検定
文字通り適合されているかどうか検定する
データが論理値と適合してるのか異なっているのか確かめたい検定
事前に決めた値を元に比較を行う

# ５．カイ二乗検定
「帰無仮説が正しければ」を前提とした検定
2つの選択肢を使用し仮説を立てる
適合検定は事前に定められた値、カイ二乗検定は帰無仮説を元に定められた値（差がないと仮定した時の値）
Rook Cephを用いて、オンプレK8sでダイナミックプロヴィジョニングを実装


https://rook.io/docs/rook/latest/Getting-Started/quickstart/
これでcephrookの構築は出来る

storageclass周りはこれ（ファイルストレージ）
https://rook.io/docs/rook/latest/Storage-Configuration/Shared-Filesystem-CephFS/filesystem-storage/#consume-the-shared-filesystem-across-namespaces


## 構築
```
git clone --single-branch --branch master https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl create -f cluster.yaml
```

```
kubectl -n rook-ceph get pod
```

## Filesystem作成
```
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: myfs
  namespace: rook-ceph
spec:
  metadataPool:
    replicated:
      size: 3
  dataPools:
    - name: replicated
      replicated:
        size: 3
  preserveFilesystemOnDelete: true
  metadataServer:
    activeCount: 1
    activeStandby: true
```
## Storageclassの作成
```
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-cephfs
# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
  # clusterID is the namespace where the rook cluster is running
  # If you change this namespace, also change the namespace below where the secret namespaces are defined
  clusterID: rook-ceph

  # CephFS filesystem name into which the volume shall be created
  fsName: myfs

  # Ceph pool into which the volume shall be created
  # Required for provisionVolume: "true"
  pool: myfs-replicated

  # The secrets contain Ceph admin credentials. These are generated automatically by the operator
  # in the same namespace as the cluster.
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph

reclaimPolicy: Delete
```
## PVCの作成
```
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cephfs-pvc
  namespace: kube-system
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-cephfs
```
会員登録・ファン化のための特典施策メモ

一般的なやつをまとめただけ

# 新規会員登録
ユーザーのアクションの流れで何らかの価値を提示した導線を設置することが望ましい。
今やっている・これからやろうとしている体験に対する付加価値。

- 今やろうとしているアクションがオトクになる
    - 例）この買い物ですぐに使えるポイントをプレゼント！
- 今やろうとしているアクションへの障壁になる
    - 例）今読んだ記事コンテンツの続きをもっと読める

## 金銭的価値  
- 会員限定セール
- 会員限定クーポン
- 会員になるとポイントがたまる
- 会員登録でプレゼント
 - 抽選
 - 今すぐ使えるポイント・クーポン
 - おまけ・お土産がもらえる

## 利便性価値
- 会員限定情報
- 会員限定機能
- マイページ・お気に入り機能
- 必要な最新情報のお届け
- 次回以降情報入力の手間なし

# 会員向け顧客ロイヤルティ向上
- 会員ランク制度（条件クリアでステージUP。）
    - ポイント還元率のUP
    - 販売・予約での優先（より早く買える・抽選に当たりやすくなる）
- 特別なプレゼント
自分でクラスを作る

クラスを作る
---
Rubyではオブジェクトを作ったり使ったりすることで処理を実現していきます。「既存のクラスのオブジェクトを作って使う」のではなく、「自分でクラスを作り、そのクラスのオブジェクトを作る」方法を説明していきます。

Userクラスを作る
---
Rubyのようなオブジェクト指向のプログラミング言語では、意味的な共通性のあるデータを１つのオブジェクトに集約して扱えるようにクラスを作ります。ここでは、ユーザーの名前、住んでいる場所、メールアドレスはすべて、あるユーザー個人に属する詳細情報という共通性があるので、「ユーザー個人」がオブジェクトとなるように、「ユーザー」クラスを作れば良いということになります。
~~~user.rb
class User
end
~~~
これで`User`というクラスが作れました。さっそく`User`クラスを使います。

Userクラスにメソッドを定義する
---
私たちのイメージするユーザーオブジェクトは、名前、住んでいる場所、メールアドレスというデータを持ち、問い合わせれば答えてくれるものです。例えばこんな感じです。
~~~user.rb
> user.name
=> "吉良吉影"
~~~
しかし、現時点では`User`クラスには`name`というメゾットはないので、実際にはエラーが返ってきます。
~~~terminal
> user = User.new
> user.name

 Traceback (most recent call last):            
 ...
 NoMethodError (undefinef method 'name' for ~ )
~~~
そこでエラーが出ないように`name`というメソッドを作ってみましょう。メソッドを定義するには、　def <メソッド名> end という構文を使います。
 ~~~user.rb
class User
    def name
    end
end
~~~
これで`User`クラスのオブジェクトに　`name`というメソッドをつくることができました。`user.rb`に加えた変更を読み込んで`user.name`を読み込んでみます。
~~~console
>require `./user,rb`  #ファイル読み込む
>user = User.new
> user.name
=> nil   #nameメソッドが空（何も評価されていない）のでnilが返ってくる。
~~~
メソッドが呼ばれた時に返ってくる値のことを　**「返り値**（または**戻り値**)」と呼びます。Rubyでは、`return`を使って明示的に指定された値や、メソッド内で最後に評価された値がメソッドの返り値となります。

※一般的に、メソッドの途中でメソッドを抜けたい場合にはreturnを使い、メソッドの最後で返り値を指定する場合はreturn使わないことが多い。

例えば、どんなユーザーのnameも”匿名さん”で返したい場合は、returnメソッドの実装は次のようになる。
~~~returnを使う場合.rb
class User
 def name
    return "匿名さん"
 end
end
~~~
~~~returnを使わない場合.rb
class User
 def name
   "匿名さん"
 end
end
~~~
どちらの書き方でもnameメソッドの戻り値として「匿名さん」という文字列を得ることができます。
~~~console
> user = User.new
> user.name
=> "匿名さん"
~~~
ただし、実際には全てのUserオブジェクトが同じ名前を持つように実装することはほとんどないでしょう。ログインしてきたユーザーをそれぞれの名前を保持するようにしたいはずです。オブジェクトごとに異なるデータを保持できるようにするためには、**「インスタンス変数」**　を使います。

参考
---
[現場で使えるRuby on Rails 5 速習実践ガイド]
強制トンネリング下のKMS認証について

こんにちは、Clefable-Tです。

今日は強制トンネリング下環境でのKMS認証とその対処策についてお話したいと思います。

<h1>本記事の全体構成図

本記事の構成は以下の通りです。

* 強制トンネリングを実装しているExpress Routeと接続しているHUB VNETとSPOKE VNETをゲートウェイ転送で、ピアリングしている。
* 強制トンネリングの影響ですべての通信はオンプレミスを経由する
* HUB VNETではKMS認証用の通信用にユーザー定義ルートにて、直接外部環境（MSのKMS認証サーバーに出れるようにしている。）

↓が構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991032/24d4075f-2ad9-f266-362b-69c9282e5d82.png)


<h1>確認したいこと

SPOKE VNETがHUB VNET（ピアリング先のVNET）のUDRを使用して、SPOKE VNET側で発生したKMS認証に係る通信がなされうかどうかです。
図解するとこういう感じになります。

↓図解で説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991032/b747fde4-eebd-3a6e-18dd-c7b72b8475fc.png)


因みに・・・

強制トンネリング下でKMS認証の通信が、オンプレミスを経由するとKMS認証が失敗します。
※公式Docs有

リンク↓

https://learn.microsoft.com/ja-jp/troubleshoot/azure/virtual-machines/custom-routes-enable-kms-activation



<h1> 結果どうだった？

SUB_Bでも別個UDRを作成して、定義しないとダメでした。

強制トンネリングが有効になっているHUB VNETとゲートウェイ転送が有効となっていたとしても、ピアリング先のSPOKE VNET側のKMS認証の通信はオンプレミスを経由するとのことです。

先述のオンプレミスを経由するとKMS認証が失敗するので、それを回避するためには、SPOKE VNET側でもUDRを設定しないとならない。というのが結論です。

↓図解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991032/e59c6deb-5c50-2901-b13d-3af0478f5ef6.png)


<h1>最後に

最後までお読みいただき、ありがとうございました。
今日は強制トンネリング下でのKMSの通信、通信経路、それに係る対処策について記載しました。
情報発信というよりかは、自分が忘れないためのアウトプット要素が強いですね。

以上です。
Git使い方

# まずはGitの流れを知る!!
1.ファイルを選択する
```:例
git add index.html
```
2.ファイルのコミットをする
```:例
git commit -m "メッセージ"
```
3.リモートリポジトリにアップロードする前に…
　そのリポジトリのURLを登録しておく
```:例
git remote add origin URL
```
:::note info
登録する際、名前を付ける必要があり、「origin」が一般的
:::
4.リモートリポジトリにアップロードする(プッシュ)
```:書式
git push origin master
```
5.リモートリポジトリのファイルをダウンロードする(プル)
```:書式
git pull origin master
```
基本はこの繰り返し
| 名前 | すること |
|:-:|:-:|
|add|ファイルの選択|
| commit  |  ファイルの保存 |
|  push | ファイルのアップロード  |
|  pull | ファイルのダウンロード |

# 発展して考える!!
<details> 
<summary>一部のコードだけを送りたい場合はどうするの？</summary>

１．どのファイルを変更したのか確認する

```:例
git status
```
>変更したファイルの名前が赤文字で出てくる

２.ファイルのどこの内容を変更したのか確認する
```:例
git diff
```
>変更前の内容が赤文字で、変更後の内容が緑文字で出てくる
><font color=RED>ー　変更前
><font color=GREAN>＋　変更後

３.あとはプッシュしたいファイルだけ`git add`で選択するだけ!!
</details>

<details>
<summary>ブランチを別に作って作業したい！</summary>
１．ブランチを作成する(例 developブランチ)

```:書式
git branch develop
```

２．ブランチを切り替える(例 developブランチ)
```:書式
git checkout develop
```

３．プッシュしようとしたらこんなエラーが出てくるので、真ん中にある
`git push --set-upstream origin develop`をコピペしてEnter
```
fatal: The current branch develop has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin develop

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.
```
</details>

<details>
<summary>間違えたプッシュを取り消したい</summary>

### 方法１ git resetコマンド

```:Github上&ローカル上の変更も取り消す
git reset --hard HEAD^
```

```:Github上の変更だけを取り消す
git reset --soft HEAD^
```
:::note info
次にpushするときは、コンフリクトを起こさない為に「-f」のオプションをつけて、強制的にpushする
:::
注意する点として、`git reset`コマンドは履歴も消去してしまうので、チーム開発で使うとコンフリクトを起こす可能性があります。

### 方法２ git revertコマンド
上の`git reset`コマンドは履歴も残さず消去するのでコンフリクトを起こす可能性は高くなります。
逆に`git revert`コマンドは履歴は残して、プッシュだけを取り消すので、コンフリクトを起こす可能性は低くなります。

```:pushを取り消す
git revert HEAD
```

```:自動的に新しいコミットができてるので、それをプッシュ
git push origin HEAD
```

:::note info
取り消したプッシュの履歴も残ってるので、こんがらがる
:::
</details>
エラーをちゃんと分類しましょうという話

エラー処理はいろんなパターンがあって、ケースバイケースとぶん投げられることも多いんですが、これ実は3種類に分類して考えるとかなりすっきりします。

その3種類とは

1. システムの想定内のエラー
2. システムの想定外のエラー
3. バグ

です。

## 1. システムの想定内のエラー
システムの想定内のエラーとは例えば

- 指定のIDのユーザーが見つからない
- 必須の入力パラメータがない

などの事象です。

これらはプログラムコード内ではエラークラスとして返されたり例外としてthrowされることもありますが、**実際にはエラーではありません**。

なので、これらはアプリケーションとしてその場合どうするか？をちゃんと規定してその通りに実装することが大切です。

Webアプリケーションでは多くの場合40xのレスポンスを返すことになります。

## 2. システムの想定外のエラー
システムの想定外のエラーとは例えば

- DBが落ちている
- 外部のWebサービスとの通信エラー

などです。

これらはアプリケーション開発者にはどうしようもできないことが多く、できることといえば**運用者にすみやかに通知する**仕組みを作るぐらいです。

Webアプリケーションでは503を返すことが多いです。

システムをもっと大きな視点から捉えた場合にはDBのダウンまで想定することもありますが、それはアプリケーションの外側の話なのでアプリケーション自体が意識する必要はほとんどありません。


## 3. バグ
バグは文字通りアプリケーション開発者が仕込んでしまったバグです。

どんなに優れたシステムであっても**絶対にバグはありえるものと想定しておく**ことが大切です。

バグはできるだけ早期に検知できることが大切です。

例えばif〜elseの分岐で最後のelseには絶対に来ることがないとわかっている場合はそこで例外を投げちゃいましょう。
来るはずのないところに来たということはその前段階のどこかにバグがあります。

そこを通してしまうとそれだけバグの検知が遅れることになります。
assertやrequireを使うのも同様にバグの検知をできるだけ早くするためです。

Webアプリケーションの場合は通常500エラーになります。
(ほとんどのWebアプリケーションフレームワークは開発者の書くコードにバグがあることを想定しているので例外をキャッチした場合は500エラーになります。)

## 同じエラーでも分類が違うことがある
ここでは「ユーザー登録時にメールアドレスの登録をチェックする」という処理を考えてみます。

色々な実装方法がありますが、ここではDBのUnique制約にひっかけてエラーをキャッチするという方法を取ったとします。

この時に発生するUnique制約エラーはエラーではありません。システム内で想定されている挙動だからです。

しかし、ここ以外の想定外の処理でUnique制約エラーが発生した場合はおそらくはバグ(もしくは仕様バグ)です。

このように**同じエラーであっても、その意味するところが全く別のものであることがあり得ます**。

ここで分類を考えずに目の前のエラーだけを見て「DBのUnique制約エラーはどう処理すれば良いだろう？」とか考えてしまうと迷路にハマることになります。

## まとめ
エラー処理でお悩みの人はわりとこの3つをごっちゃにして考えている人が多いです。

- システムの想定内、想定外のエラーを区別していない
- バグがありえることを想定していない
- または、その両方

ここをちゃんと区別すると、かなりスッキリすることが多いです。
まずは目の前のエラーがどこに分類されるものであるかを考えてみましょう。

ここをクリアにしてもそれでもなお悩ましいという人は多分本当に難しいんだと思うので**頑張って悩んでください**。

おしまい
個人開発｜Vue.js3とFirebaseでサクッと簡単アンケート作成アプリ

現在Webエンジニアでフリーランスのマー坊です。

本記事は、Vue.js3とFirebaseで作れる簡単アンケートアプリのご紹介です。

http://anchete.marbou-work.com/

## 1.使用技術

* HTML
* css／bootstrap
* Vue.js3
* Firebase（Firestore Databaseなど）

使用スキルは上記のとおり。
PHPやRubyなどバックエンドスキルは使っていません。
データはFirebase（Firestore Database）で保存。

## 2.作ったアンケート作成アプリ

### 1.アンケート作成画面
これがアンケート登録画面。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/fb1e51f1-0170-9877-7728-7348d25a6974.png">

タイトルと回答項目、アンケート実施期限を入れるだけ。

実際に入れた画面がコチラ
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/5a4d5f29-d867-01b6-f43e-f8218c05e636.png">

アンケート実施期間は最大7日まで指定可能です。

上記項目を入れて、登録を押すと下記画面が表示されます。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/d9e7960e-cf26-f7da-bdf6-d46fa324e5c1.png">

投票するフォームは、「アンケートに回答する」ボタンを押せば投票できます。

また、みんなに投票してもらうには、投票フォームのURLコピーができますので、メールなどで貼り付け可能です。
「Twitter」「LINE」でもお知らせできます。

### 2.アンケート投票画面

アンケート投票期間中に1回だけ投票できます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/c74e2608-258e-f55b-b91e-60ef6f28c1a5.png">

投票画面の「投票する」ボタンを押すことでアンケートに投票できます。

投票が終わると下記の途中結果が表示されます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/85433ad4-bee7-40c4-24b0-002b3c76ad5b.png">

当画面では、他の人が投票すると、リアルタイムで結果が変化するのが見えます。


### 3.アンケート結果画面

アンケート実施期間を終えて投票URLにアクセスすると、下記画面が表示されます。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/a1b173fd-7e27-c726-eace-66a9a0cf7583.png">


## 3.きっかけ

そもそもこれ作ろうと思ったきっかけは、ちょっとした個人的なアンケートを取りたいと思ったのがきっかけ。

個人的に使うものなので「問い」なんて一つでも十分。
twitterやインスタにあるアンケート機能みたいな感じです。

アカウント登録の必要もありません。

旅行先や飲み会の場所などアンケートをとるのに、サッと作れてすぐに投票も可能です。

## まとめと今後の課題

今回は、日頃からバックエンドばかりたずさわっている僕が、フロントエンドスキルも磨いていこうということで作ってみました。

たまに触っていかないと忘れてしまうので。

今後の課題は、複数の問いや、結果をダウンロードさせるしくみのアプリにも挑戦。
企業がよくやる商品アンケートなどは、問い数がおおいですからね。
需要はこっちの方がよくあるかも。

http://anchete.marbou-work.com/
【データサイエンス】分析の分類・確率分布

# ０．はじめに																					
大学でデータサイエンスの講義を受講している者です。
あまりにも広範囲な分野であるため"広く浅く"情報整理したいため投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。
（齟齬がある場合はご指摘いただけると助かります。）	

#### データサイエンス学習全体像
[【データサイエンス】概要](https://qiita.com/AkihideKato/items/9dbce22bd87a9c8a3989)
[【データサイエンス】人工知能](https://qiita.com/AkihideKato/items/6381dd320ead9f893577)
[【データサイエンス】機械学習](https://qiita.com/AkihideKato/items/1db3312e8038bd75e89b)
[【データサイエンス】ディープラーニング](https://qiita.com/AkihideKato/items/92b0fb83b35ec08c4e02)
[【データサイエンス】分析の分類・確率分布](https://qiita.com/AkihideKato/items/6fdca6e22f03f0b9f17c)
[【データサイエンス】探索的データ分析](https://qiita.com/AkihideKato/items/9485e3f9803b1e8fe785)
[【データサイエンス】統計的検定](https://qiita.com/AkihideKato/items/8ff1b9bada50491b017c)
[【データサイエンス】予測モデリング](https://qiita.com/AkihideKato/items/ce8e697546d0424bea46)
[【データサイエンス】自然言語処理](https://qiita.com/AkihideKato/items/e545f36e268605fce9a6)
[【アルゴリズム】パーセプトロン](https://qiita.com/AkihideKato/items/fc9a8205154fe9b3090f)
[【データサイエンス】機械学習における関数](https://qiita.com/AkihideKato/items/6ec3b59ff581e7e3c4ad)
[【データサイエンス】確率](https://qiita.com/AkihideKato/items/c099772dfca7546a6802)

# １．統計・分析・検定
それぞれの意味についてなんとなく理解しておく
|名称|意味|
|---|---|
|統計|データから規則性や不規則性など**性質や傾向を読み解く**|
|分析|データから要因を読み解き**原因を明確にする**、解析と似てる気がする|
|検定|データから基準を元に**判定をする**、事前に理論値がある|

# ２．分類
ここでは以下のように分類する
名称|意味|
|---|---|
探索的データ分析|データを解析し主な特徴を要約する
統計的検定|仮説を情報に基づいて検証する
予測モデリング|統計を使用し未知のデータの予測や予測を行う
確率分布|確率変数に対して、各々の値をとる確率全体を表したもの

#### 探索的データ分析
- ``散布図``
- ``クラスター分析``
- ``主成分分析``
- ``因子分析``
- ``アソシエーション分析``
- ``探索木``
#### 統計的検定
- ``t検定``
- ``分散分析（ANOVA）``
- ``仮説検定``
- ``適合度検定``
- ``カイ二乗検定``
#### 予測モデリング
- ``回帰分析``
- ``線形判別``
- ``非線形判別``
- ``ロジスティック回帰``
- ``決定木``
#### 予測モデリング
- ``正規分布``


# ３．確率分布
確率の関係性を追求するジャンル

### 3-1.正規分布
予測モデリングのひとつ
平均を0、ばらつきを1とした図
ばらつきが少ないと「尖り」ばらつきが大きいとふわっとしてる図になる


### 3-2.正規分布は標準偏差によって性質がある
名称|意味
---|---
平均値±1σ|全体の68%の濃度がある
平均値±2|σ全体の95%の濃度がある
平均値±3σ|全体の99.7%の濃度がある

**例：日本人の平均が170cm、標準偏差が10cmの正規分布**
平均値を0とする図のため真ん中が170cmと想像すればいい
標準偏差10cmなので160~180cmは全体の約68%以上が含まれると分かる
身長150cm以下は全体の5%以下の密度であると理解できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581998/eb8fbdcc-4add-0e21-d13f-1c0c0a53e36a.png)

### 3-3.正規化とは
正規分布側のメモリの幅に合わせるようにデータを変形・調節すること
データ上単位がバラバラの場合に用いるときがある（クラスタリング_データポイント間の距離計算時に使用）
データの平均を全てのデータポイントから引きそのデータを標準偏差で割る
正規化した値は平均が0になる
【COBS】：感動のデータエンコーディング革命！奇跡の効率アップ＆サイズ削減で心揺さぶられる未来への扉を開く

# 最初に
わけわからんタイトルですが文句はChatGPT君に。
(COBS自体は1999年のInternet Draftで提案されているので革命でもなんでもないです。昔からあります。)

研究を進める中で出てきたことをまとめました。

# 概要
シンプルなデータのエンコード方式としては**SLIP**(Serial Line Internet Protocol)というものがあります。
しかし、SLIPは最悪の場合、元データの二倍の大きさになるという問題があります。

そこで、**COBS**(Consistent Overhead Byte Stuffing)という手法を頭のいい人が考案。
最大パケットが255byteの条件下では、最悪でも元データ+5に収めることを可能にしました。

# 本題

## SLIP

では、もう少し細かい話をしていきます。

データが連続して送られてくる状況では、どこからどこまでがパケットか分からなくなります。
(0101011011101から必要なデータはこれとこれ、なんてわからないですよね）

そこで、特定の文字(デリミタ)を目印にする「SLIP」というシンプルな方法が考案されました。
データ中にデリミタ0xFFで挟まれた部分をパケットとして認識するという感じです。

SLIPはデータ中にデリミタが出現した場合、ほかの文字に置換します。(例 0xFF -> 0x01FD)
1byteのデリミタを2byteで置き換えるので、全てがデリミタと同じ値のデータではサイズが**2倍**になってしまいます。

## COBS

### エンコード
COBSはこの課題をクリアしたエンコード方式です。
ざっくりと言うと、デリミタの出現を置換で表現したSLIPに対し、ブロックの長さで表現したのがCOBSです。

COBSでは1パケットを複数のブロックに分けます。
また、**MBS**(Max Block Size)を定義しておきます。

具体的なエンコード方式は以下のようになります。

1. 元データに末尾にデリミタを追加
2. 元データを先頭からサーチします。
    ・デリミタが出現した
    ・連続してMBS分、読み込んだ
上の2パターンの内、どちらかを満たした場合ブロックを確定
3.  ・デリミタが出現したブロックはデリミタを削除。
   ・MBS読み込んだブロックはなにもしない
3. 各ブロックの長さを表すデータをブロックの先頭に挿入。これを**OHB**(OverHead Byte)といいます
5. 以下2~4を元データ末尾まで繰り返す
![スクリーンショット 2023-05-25 125208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134351/065d25f5-286c-0891-87da-795f7ba6c206.png)



### デコード

デコードの場合はOHBを読み込み、各OHB分のブロックを切り取ります。

ここでOHBがMBS未満ならば、デリミタが出現したデータとみなしてブロックの末尾にデリミタを追加します。
もし、MBSの場合はデリミタ未出現として操作はしません。
この操作をOHB後のデータがデリミタを指すまで繰り返します。

##Pythonによる実装

``` python: 

def blockize_data(data, delimiter, mbs):
    blocks = []
    block = ''
    delimiter_found = False

    # Step 1: Append delimiter to the end of the data
    data += delimiter

    # Step 2 and 3: Search for delimiter or consecutive non-delimiter characters
    for char in data:
        if char == delimiter:
            if block:
                blocks.append(block)
                block = ''
            delimiter_found = True
        elif delimiter_found or len(block) == mbs:
            blocks.append(block)
            block = char
            delimiter_found = False
        else:
            block += char

    # Step 4: Output blocks
    for block in blocks:
        if block.endswith(delimiter):
            block_size = len(block) - 1
            block = block[:-1]
        else:
            block_size = len(block)
        print(f"OH: {block_size}")
        print(block)

    # Step 5: Append delimiter to the end
    print(f"OH: 0")
    print(delimiter)

```



# 参考文献


[Consistent Overhead Byte Stuffing](https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing)

# 最後に
記事の誤り等がありましたら、教えていただけたら幸いです。

大学では衛星の開発と衛星データの処理をやってます。
中々大変です
## 学生じゃないみたいだなぁ
学生証で行う入退室管理システム【アスキーアート】

# はじめに
近畿大学ロボット研究会の部室にFelica(学生証)を用いた入退室管理システムを作成しました。
今回はアスキーアートの部分を紹介します。

# 入退室管理システムについて
入退室管理システムの全体像や動作のようすは以下のブログにまとまっています。

https://qiita.com/keigo1110/items/f7273980e7b0bb2dd39c

また、入退室管理システムの全体のプログラムは以下のブログにまとまっています。

https://qiita.com/keigo1110/items/1ab595b48bd03734069b


プログラムの関数の詳細は以下のブログにまとまっています。参考にしてください。

https://qiita.com/keigo1110/items/ada6c7fd08c11d260e82

# 実装
## アスキーアートの収集
アスキーアートはあまり詳しくないので後輩に頼みました。

https://aahub.org/

今回のシステムでは上記のサイトから好みのものを拾いました。

## 注意点
フォントは以下のサイトのSaitamaarってフォントを使います。アスキーアートは特定のフォントじゃないと正しく表示されないので設定をしておかなくてはなりません。

https://fonts.aahub.org/font/6

## アスキーアート前処理
そのままコピペしてもってきてもpythonプログラムではうまく使えません。
そこで以下のプログラムを用いて少し加工します。

```py
text = input()

text = text.replace('"', '\\"')
text = text.replace("'", "\\'")

print(text)
```
テキスト（アスキーアート）を入力し、pythonで狙った通りに表示されるように加工します。これでpythonでもアスキーアートが綺麗に表示されるはずです。


## プログラム
入室の時のものを例にあげます。
```py
import random
inAA_list =["アスキーアート1", "アスキーアート2", ・・・, "アスキーアートn"]

#inAA関数の定義
def inAA():
    x  = random.randint(1,len(inAA_list)) #ランダムにアスキーアートを選択
    print(inAA_list[x]) #アスキーアートの表示
    print("￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣") #区切りを見やすくする線
```
inAA_listはものすごく煩雑になるので、メインの処理を行うプログラムと分けています。


# おわりに
アスキーアートをターミナルで表示させるだけですが、色々と小技が必要です。このブログを参考に遊び心あるシステム開発に役立ててください。