OmniAICreator/Qiita-1.07M huggingface dataset:
Redmineチケットのツリー表示

#1.この記事の内容

RaspberryPiに構築したRedmineのチケット表示について，親子関係のチケットをツリー表示できるようにします．
ツリー表示にはプラグイン[Redmine Issues Tree](https://www.redmine.org/plugins/redmine_issues_tree)を導入します．
参考にした記事は，ページ下部の関連リンクに記載しています．

##1-1.使用環境

* Raspberry Pi 1 Model B+
* Redmine Ver.4.1.1

#2.背景

Redmineではチケットに対して親子関係の紐づけができますが，標準のチケット一覧では親子関係を考慮した表示ができません．
チケットが増えると見づらくなるので，可読性を高めるために，ツリー表示できるようにします．

#3.ツリー表示プラグインの導入

#3-1.ツリー表示プラグインのソースコードをダウンロード

masterブランチではなく，Redmineのバージョンに合わせたブランチを使用します．

<pre>
pi@raspberrypi:~ $ cd ~/redmine-4.1.1/plugins
pi@raspberrypi:~/redmine-4.1.1/plugins $ git clone https://github.com/Loriowar/redmine_issues_tree.git
remote: Enumerating objects: 1230, done.
remote: Total 1230 (delta 0), reused 0 (delta 0), pack-reused 1230
Receiving objects: 100% (1230/1230), 159.42 KiB | 437.00 KiB/s, done.
Resolving deltas: 100% (677/677), done.
pi@raspberrypi:~/redmine-4.1.1/plugins $ cd redmine_issues_tree/
pi@raspberrypi:~/redmine-4.1.1/plugins/redmine_issues_tree $ git checkout 4.1.x
Branch '4.1.x' set up to track remote branch '4.1.x' from 'origin'.
Switched to a new branch '4.1.x'
</pre>

##3-2.プラグインのインストール

<pre>
pi@raspberrypi:~/redmine-4.1.1/plugins/redmine_issues_tree $ cd ~/redmine-4.1.1
pi@raspberrypi:~/redmine-4.1.1 $ bundle install
Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies......
Using rake 13.0.3
Using concurrent-ruby 1.1.7
Using erubi 1.10.0
Using mini_portile2 2.4.0
Using crass 1.0.6

・・・（中略）

Fetching haml-rails 2.0.1
Installing haml-rails 2.0.1
Bundle complete! 32 Gemfile dependencies, 67 gems now installed.
Gems in the groups development and test were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
pi@raspberrypi:~/redmine-4.1.1 $ bundle exec rake redmine:plugins:migrate RAILS_ENV=production
</pre>

##3-3.動作確認

通常表示はこちら．親子関係は考慮されずに表示されます．

![3-default_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983907/7fc57ed5-054d-2673-e60e-fd3967f60898.png)

プラグイン[Redmine Issues Tree](https://www.redmine.org/plugins/redmine_issues_tree)を導入することによって，ページ右上の「ツリー表示」ボタンが現れます．これをクリックすると下記のように表示が変わります．

![3-tree_view_close.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983907/e503af7f-05f4-fade-4695-92c9cb8f49a4.png)

標準では閉じた状態ですが，題名左の三角ボタンをクリックすると，下記のように展開されます．下記の画像はすべての子チケットに対して展開した状態です．

![3-tree_view_open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/983907/68041255-f9a0-8663-f894-a05cd1f6d891.png)

#4.さいごに

チケットのツリー表示プラグイン[Redmine Issues Tree](https://www.redmine.org/plugins/redmine_issues_tree)の導入方法と表示例を紹介しました．概ね関連リンク記載の手順で導入することができました．
親子関係がツリー表示されることでチケット一覧が見やすくなったかと思います．

#5.関連リンク

* [Redmine Issues Tree](https://www.redmine.org/plugins/redmine_issues_tree)
* [Plugins - Redmine](https://www.redmine.org/projects/redmine/wiki/Plugins)
AWS構成単位

#AWS構成単位
##リージョン
　世界中にある複数のデータセンターを物理的に設置している場所
　日本でアプリを発信するなら、東京リージョンで構築する
 
##アベイラビリティーゾーン  　
　リージョンの中に存在するデータセンターの集まり
　東京リージョンにある3つのアベイラビリティーゾーン（1a,1c,1dはZoneIdと呼ばれる）
　①ap-northease-1a
　②ap-northease-1c
　③ap-northease-1d

###VPC（バーチャル・プライベート・クラウド）
　AWSでの仮想ネットワーク空間

###インターネットゲートウェイ
　個々人のVPCとインターネットゲートウェイを紐づけて、インターネットにアクセスできる
　VPCとゲートウェイを紐付けるためにルートテーブルが必要になる
###ルートテーブル
　ゲートウェイとアプリ間を繋げるために必要
　このままだと外部からEC2にダイレクトに影響してしまうので、ルートテーブルを2つに分ける
　　・パブリックサブネット（VPC←ルートテーブル{（パブリック）←（プライベート）}EC2等））
　　・プライベートサブネット（ここにWebアプリを配置）
 
###NATゲートウェイ
　パブリックサブネットの中に設置して、プライベートと通信する
 
※IGW　←　パブリックサブネット（NATGW）←プライベートサブネット（EC2）　←　プライベートサブネット（DB）
Git基本コマンド(ローカルレポジトリ編)

ステージにあげる

```
git add 'ファイル名'
git add 'ディレクトリ名'
git add .
```
ワークツリーからステージへあげる（コミットする変更を準備する）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/f0c07d70-02e7-4e03-541b-bfc9f60fb5fe.png)

addすると、インデックスというファイルが生成される


リポジトリ―に上げる

```
git commit
git commit -m 'メッセージ'
git commit -v 
```
メッセージ付きで記録する
*****
😢git commit　してエディタが開かない問題発生
どうやらPATH設定がうまく行っていないようだ。
codeコマンドを設定できない
つまり(Shell Command: Install code command in PATH)を
パネルで入力していも検索してもヒットしない問題。
↓
portable版ではなくinstall版に切り替えることで
PATHが通るようになった。
*****
ようやく
git commitして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/71a83ef8-c24c-d8ac-edd3-ecc509c9acad.png)
と表示が出る
1ファイルがチェンジされ1ファイルが追加された
*****
**現在の変更状況を確認する**

```
git status
```
ワークツリーとステージの間の変更を表示(ワークツリーとインデックスの比較）
ステージとリポジトリの間の変更を表示（インデックスとコミットの比較）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/cfad39d1-caba-38eb-500f-054e1fad910f.png)
コミットすべきファイルの変更は無い、という意味

次にファイルを変更して、再度git status
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/0f863f1e-975b-c1aa-8940-c5c3e65d6d5a.png)
変更されたファイルがindex.htmlです、
ステージに乗っていません、という意味

git add index.htmlして再度git status
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/b00b4c94-f3da-74b3-a339-981c82bc529a.png)

変更されたファイルはindex.htmlです、
ステージに乗っています、という意味
******
**変更内容の確認**

```
//ステージに上げる前
git diff
git diff 'ファイル名'
//ステージに上げた後
git diff --staged
```

**変更履歴の確認**

```
git log
//一行表示
git log --oneline
//変更差分表示
git log -p 'ファイル名'
//表示するコミット数を制限
git log -n 'コミット数'
```
******
**ファイル削除の記録**
ファイル削除をステージに上げるには

```
//ファイルごと削除(リポジトリからもワークツリーからも削除)
git rm 'ファイル名'
git rm 'ディレクトリ名'
//ファイルを残したいとき(gitの記録からファイルを削除するとき)
git rm --cached 'ファイル名'
```
元に戻すには

```
git reset HEAD 'ファイル名'
git chechout 'ファイル名'
```

*****
**ファイルの移動**

```
git mv '旧ファイル'　'新ファイル'
//名前も変更されてなおかつステージに上がった状態になる
```
Docker上のRailsでコントローラーの変更がブラウザに反映されない時の対処法

## 問題
`controller.rb`の変更がブラウザに反映されない。
コンテナを再起動すれば反映されるが、毎回再起動するのは手間がかかる。

## 環境
`Windows 10 home`
`Docker for Windows`
`Rails 6.1`
`Ruby 2.7`

## 解決策
`config\environments\development.rb`内の
`config.file_watcher = ActiveSupport::EventedFileUpdateChecker`を下記コードに修正する。

```Ruby
config.file_watcher = ActiveSupport::FileUpdateChecker
```

## わからないこと
下記コードを記載しても解決できる。
Railsガイドを見ても上記コードとの違いがわからなかったので、違いが分かる人がいましたら、ご教授いただければ幸いです。

```Ruby
config.reload_classes_only_on_change = false
```
参照：[『Railsガイド』- Rails アプリケーションを設定する](https://railsguides.jp/configuring.html)

## 参考
1. [Rails5でmodelやcontrollerの修正が反映されないやつ](https://qiita.com/uenoryo/items/5dd69436e9f5af6a752e)
2. [Vagrant + Rails 6.0.2.1 のdevelopmentでコード変更が反映されない現象を解決](https://k-koh.hatenablog.com/entry/2020/02/12/105351)
3. [【Rails6】Dockerコンテナを再起動しないとソースコードが反映されない](https://qiita.com/Kiyo_Karl2/items/147d604e625b8a55e12e)
あるワークフローから他のワークフローを実行する方法

## はじめに
GITHUB のエンドポイントに POST するやり方もあるかと actions 使った方が見通しがいいので actions を使った説明をします。（備忘録がメイン）

今回、[こちら](https://github.com/marketplace/actions/workflow-dispatch)の actions を使います。

## やりたいこと
`dispatcher.yml` を実行したら `dispatched.yml` を実行すること。

## コード
```
.github/workflows
├── dispatched.yml
└── dispatcher.yml
```

```dispatcher.yml
name: Dispatcher
on: [workflow_dispatch]


jobs:
  deploy:
    runs-on: ubuntu-18.04
    steps:
    - name: Invoke workflow
      uses: benc-uk/workflow-dispatch@v1
      with:
        workflow: Dispatched
        token: ${{ secrets.TOKEN }}
        inputs: '{ "message": "blah blah", "debug": "true" }'
```


```dispatched.yml
name: Dispatched
on:
  workflow_dispatch:
    inputs:
      message:
        default: 'test'
      debug:
        default: 'false'

jobs:
  deploy:
    runs-on: ubuntu-18.04
    steps:
    - name: Tests
      run:
        echo ${{ github.event.inputs.message }}
        echo ${{ github.event.inputs.debug }}
```

## 実装の解説
書く必要ないかもしれないが・・・・

- `dispatched.yml` のワークフローに `name` という蘭に名前を設定
- キャッチしたいパラメータも記述
- `dispatcher.yml` の　`Invoke workflow` で実行したいワークフローの名前を指定
- 入力したいパラメータを入力


## まとめ
今回、同一レポジトリにおいて他のワークフローを実行する方法を紹介しました。
他のレポジトリのワークフローも実行することが可能です。
必要であればぜひ使ってください。
Vue.jsでちょっとハマったtips

## 下記構成でハマったこと。

- vue-cliで初期化
- vue-router導入
- axios導入

vue.jsはvue3

## ハマったこと

- 別コンポーネントの`methods`を呼び出す方法

```
# BlogContents.vue
<script>
import MicroCms from '@/components/MicroCms.vue'

export default {
  name: 'Blog',
  mounted () {
    MicroCms.methods.getBlog() # この記法じゃないと呼び出せない
  }
}
</script>

# MicroCms.vue
<script>
import axios from 'axios'

export default {
  name: 'MicroCms',
  methods: {
    getBlog: function () {
      axios.get(
        // 処理
      )
    }
  }
}
```

`BlogContents.vue`から`MicroCms.vue`の`getBlog()`を呼ぶ際に下記の記法だと取得できなかった。

```
MicroCms.getBlog()
```

この記法だと`getBlog()`はfunctionじゃないから見つからない的なエラーが出力される。
2020年から始めた個人開発で作ったWEBアプリとスマホアプリを振り返る

# 前置き

いつかやるぞーと思って先延ばしにしまくっていた個人開発を2020年の初めごろにえいやでやり始めました。
1,2本のWEBアプリが作れたらいいなと思っていましたが、勢い余って2本のWEBアプリと1本のスマホアプリを作りました。
宣伝もかねて投稿します。何かしら深堀りしたい内容がありましたらコメントよろしくお願いいたします。

# Band Summary(β)
[https://bandsummary.com/](https://bandsummary.com/)

![bandsummary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/e6a8fee7-b20e-50fe-05d4-87b0ec93c71e.png)


## どういうものか

ライブ情報を投稿管理でき、リンクを追加したらいい感じにまとめてくれるサービス
リンクツリー＋バンドのライブ情報を投稿、管理なイメージ

## 開発経緯

（周りの）インディーズバンドでホームページがないバンドが多くて、どこを調べたらライブ情報が一覧で把握できるかわかりづらかった。
ツイッター見ても、他の投稿で流れていて追っかけるのに時間がかかってる。
ホームページを作るのは大変なので、簡単にpostできるサービスがあれば使ったもらえるかなと思い作成。
また、2020年の目標をWEBアプリ開発（初めての個人開発）に置いていたため、身近な題材（自分自身バンドを組んでいるので）で取り組んでみました。

## 主な使用言語とか

Go,Beego(Goのwebフレームワークの一つ)
Oracle always free, ATP

## 反省点

- どうせだからとoracle always freeでの完全無料稼働を目指して、OracleのATPに苦しんだこと。
- なんならアクセスがあるのに自動停止措置が取られる謎仕様のため、現在も苦しんでるところ。
- フレームワークがoracleに完全対応していなくて、結局フレームワーク側のソースを修正するに至ったこと。

## 学んだこと

### チャレンジしたいことはせめて三つ以内にすること

初めての個人開発、初めてのGolang、初めてのOracle SQL（＋ATP）、初めてのクラウド開発環境、自前のSNS連携にアカウント管理

特にクラウド開発環境は、どんなよわよわPCからでも開発し続けたいと思い、Oracleのクラウド上に開発環境を構築してcode-serverなりなんなりで達成したけれども、そもそも手持ちのノートPCのスペックは上々なため本当に必要ありませんでした。


# Blog Book Rank
[https://bookrank.ihmdevs.com/](https://bookrank.ihmdevs.com/)

![blogbookrank.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/825bc1bc-fde3-ad4c-a499-cc57f7c0cabd.png)


## どういうものか

note記事を解析し、おすすめ本の中でAmazonのリンクが貼られているものを集計、ランキング化。

## 開発経緯

身近な人が本に関わる仕事をしているため、近しい何か作れないかなと思ったこと。
個人開発のマネタイズを意識した際に[テック・ブック・ランク](https://www.techbookrank.com/)のようにアフィリエイトでチャリンチャリンできないかなと思ったため。
AWSの[勉強中](https://qiita.com/mikiotec/items/8f57a0417cb1d8d6212c)だったためLamdaの無料枠で何かできないかなと思ったため。

## 主な使用言語とか

Go(速度が良いとのことで前作から引き続き)
AWS Lambda, dynamodb

## 反省点

- 多様なランキングを出す際にはDynamodbは不向き。
- 前処理、後処理のためにLambdaを回すはめに。
- 集計、ランキング化をしたはいいが宣伝が不足しまくっている。

## 学んだこと

ドメインはサービスごとに作らない、サブドメインで対応する。

Amazonの情報を正規表現で取得しているけれど、ゴミが多すぎて時々正規表現をメンテナンスしています。
noteのAPI情報で引っこ抜けるっぽいところを、自前でやった方がカッケーじゃんって思ってしまったのが不運の始まりでした。
本当にゴミが多い。URLのルールも探してもなさげでした。

ランキングに載った投稿に自動で「いいね」つけるくらいはしたいなと思ってます。
電子書籍版と実物版が合算されていないのをどうにかしたい（収益が見込めたらやりたい、今のところとても面倒そう）

# Tickets Band
[https://imikio.github.io/TicketsBand/](https://imikio.github.io/TicketsBand/)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/6b203bf2-2021-6a60-fb28-38e60f4e2fa8.jpeg" alt="" width="300"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/81d97516-7b4c-a499-976c-cd92aa72d294.jpeg" alt="" width="300">

## どういうものか

スマホアプリ  
イベントの予約状況などを複数人（グループ）で管理、把握。秒で反映。

## 開発経緯

flutterに出会ってしまった。

スマホアプリが作りたかった。
glideで所属バンド用に、イベントごとの予約を登録、把握できる同等のアプリを作成していたが、glideが無料枠で同時ログインできない仕様になったため頑張ってみました。
（身近な）他のバンドも予約状況の共有と把握で結構困っているっぽかったため。

## 主な使用言語とか

Flutter,Dart
Firebase


## 反省点

- 逃げてきたUI/UXとの闘いになった。（現在もそのさなか）

2020/12/31 今まだバージョンアップをしつつなので、反省しては開発って感じでいます。

## 学んだこと

Githubでのコード管理とBitrizeでのCIで、管理系にも本腰を入れてみて、新たな世界が開けた気がします。
Flutter,Firebaseで世界が開けた気がします、BandSummaryで自前で実装、管理していたものがこんなにも簡単に…。

あと、Macを持っていないため、どこまでMacなしでできるかを試してみてたらついにはリリースまで行けました。(これはまた別で投稿出来たらいいなって思ってます。)
flutterとbitrizeに感謝です。
久しぶりなLisp　フォーマッタ本編

#気を入れて
前編でテキトーな記事を書いてしまいました。本編のフォーマッタのことはさっぱり書かずに余談が多すぎました。フォーマッタのことについて書き加えます。

#お手本
竹内郁雄先生の書法、流儀をお手本にしています。初めての人のためのLISPに例題として簡単なプリティープリンタが紹介されています。ここではシンプルに次のルールが採用されています。

ppの原則（２５１ページ）
（１）１行にS式が打てるなら、その行に打つ。
（２）同一行に対応する開きガッコがない閉じガッコ（「お供」と呼ぼう）が並ぶときは
それの左端に空白を１個はさむ
（３）カッコのレベルが１つ深まると、段が２文字分深まる。


#お供
お供のことをすっかり忘れていました。LISPを学び始めたときにはこのお供を入れて書いていたように思うのですが、いつの間に閉じカッコはべったり詰めて書くようになってました。お供は最内部のS式についてのみ適用されるようです。その外側ではお供があってもスペースは入りません。自作フォーマッタはこれを当初、静的に解析しようとしていました。そうすると複雑なコードになってしまいました。そこで関数プログラミングからは逸脱しますが、大域変数でお供が発生していたかどうかを記憶することとしました。

#追加ルール
cond節やifなど慣習により書法が決まっているものについても清書してほしいので次のルールを追加することにしました。

追加ルール
（４）コンスにつき、先頭要素以外の要素につきいずれも文字数が１５を超えるならば
それらについてインデントする。
（５）コンスをインデントするときにおいて、組み込み関数であるときは残りの要素のインデントは
第一要素の位置に合わせる。
（６）cond節の条件帰結が１行で書けるとしても、総文字数が一定数を超える場合には条件式と帰結式を分けて書く。
（７）クオート、バッククオートのときで１行で書けないときは１文字下げて改行する。
（８）cond節など書法の慣習が定着しているシンタックスはそれに従う。

(+ なんたらかんたらあれこれああする関数　さらにあれしてこれしてさらにあれする関数)
は長くて見辛いので（４）でインデントすることとしました。

#コメント
コメントのフォーマットについては竹内先生の本では触れられていません。セミコロンを使うコメントはセミコロンが１つのもの、２つのもの、３つのものに区別されるのが慣習のようです。１つのものは改行せず、同一行の同じ列に置くのが慣習のようです。

#文字列を活用
竹内先生の本にあるように一般的なプリティープリンタは数なのか？シンボルなのか？とその型を調べてそれに応じた出力をしています。しかし、それだと同じ自然数でも　123 #Xface #O0706 #B01010101 のように多様な表現があります。オリジナルのコードの情報を失わないためにそれらはコンスを除きすべて文字列として取り込むこととしました。

#オリジナルコードの保存
foo.lspというファイルであれば、オリジナルのコードはfoo.orgに保存することとしています。開発初期段階でありformatterがこける可能性もあります。こけてもオリジナルのファイルはそのまま残るようにしています。

#利用方法
libraryフォルダのformatter.lspとしてあります。これをloadすればいいのですが、めんどくさいので起動時に-fオプションでもloadするようにしてあります。そして　(formatter "foo.lsp")のようにすればOKです。

清書例

```lisp

#|
初めての人のためのLISP
竹内郁雄　著　より
|#


;;;１４７ページ
(defun delete-1 (x y)
    (setq y (cons 'dummy))       ;dummy set
    (del2 x y)                   ;call del2
    (cdr y) )

;;;８９ページ
(defun atom-count (x)
    (cond ((nullx) 0)                        ;null
          ((atom x) 1)                       ;atom
          ;;else
          (t (+ (atom-count (car x))
                (atom-count (cdr x))))))

;;;７９ページ
(defun last-elm (x)
    (cond ((null x) nil)
          (t (last-elm2 x)) ))

;;９６ページ
(defun my-reverse (x)
    (cond ((null x) x)
          (t (append (my-reverse (cdr x)) (list (car x)))) ))



```


コードはgithubにおいてあります。

https://github.com/sasagawa888/eisl
シンボリックリンクでsublコマンドエラー対処

テキストエディタとして、**Sublime Text**を使おう。
macでコマンドラインから起動する**sublコマンド**が「command not found」でエラー。
下記を参考に、エラー解消し、シンボリックリンクについて簡単に調べてみました。

[【完全解説】Macで「PATHを通す」をちゃんと理解する【初学者必読】](https://datawokagaku.com/what_is_path/)

# sublコマンドエラー対処

- **原因**：環境変数の$PATH に指定しているパス配下にsublコマンドはない
- **対処**：すでにPATHが通っているところにシンボリックリンクを貼る

対処コマンド（シンボリックリンクを貼る）は以下のとおり。

```bash
ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/.
```

上記コマンドでPermissionエラーが出たので、参考記事通りに以下コマンドも実行。

```bash
$sudo chown -R $(whoami) /usr/local/bin
```

以下で、シンボリックリンク`ln`と所有権変更コマンド`chown`について説明。

# シンボリックリンク
リンクには**シンボリックリンク**と**ハードリンク**の２種類がある。シンボリックリンクは**Windowsのショートカット**に該当するリンク。

![シンボリックリンクとハードリンク](https://www.infraeye.com/study/gif/lpic33.gif)

>画像引用：LinuCイージス「シンボリックリンクとハードリンク」

以下、コマンドでシンボリックリンクを作成。-sオプションがない場合はハードリンクを作成。

```bash
ln -s ファイル名 リンク名
```

`ls -l`でファイルのパーミッションを確認したとき（drwxr-xr-x、lrwxr-xr-x）の最初の１文字目がファイルの種別を表しており、シンボリックリンクは「l」となる。

| 最初の1文字 | ファイル種別 |
|:-:|:-:|
| -  | ファイル  |
| d  | ディレクトリ  |
| l  | シンボリックリンク  |

# chownコマンド
chownコマンドは、ファイルやフォルダの所有者やグループを変更するコマンド。

```
chown [オプション] ユーザー[:グループ] ファイル（フォルダ）
```

`-R`オプションは、指定したディレクトリとそのディレクトリ以下のファイルやディレクトリの所有権を再帰的に変更する。
[SAP]出荷伝票の一括処理ログについて調べてみた

こんにちは。
今回は、出荷伝票の一括処理ログについて調べた内容をまとめました。
ニッチな内容ではありますが、どなたかの役に立てば何よりです。

#### 出荷伝票の一括処理ログって？
受注伝票や在庫転送オーダー（STO）の後続伝票となる出荷伝票を、出荷伝票一括登録系バッチ処理（トランザクション：VL10*系）で
一括登録した際のログデータとなります。処理対象となった伝票、登録された出荷伝票番号、メッセージ情報などが記録されています。

#### ツリー
**`ロジスティクス＞物流管理＞出荷管理＞出荷伝票に関する出庫＞一覧/ログ＞一括処理ログ（V_SA）`**
**`Logistics>Outbound Process>Outbound Delivery>Lists and Logs>V_SA - Collective Processing Log (英語でログインした場合)`**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/f49eeacf-ef53-3833-177c-1ca8f480cb66.png)

#### 使用テーブル

* **VBSK（販売伝票ヘッダに対するグループ処理）**<br/>
一括処理ログのサマリヘッダ部分の部分になります<br/>
* **VBSS（一括処理：販売伝票）**<br/>
一括処理にて登録された伝票が存在する場合に伝票番号ごとにエントリが作成されます<br/>
* **VBFS（一括処理用エラーログ）**<br/>
一括処理にて発生したメッセージ（エラーとは限らない）の情報を格納します<br/>

すべて、グループ（番号）という項目でリレーションが作成されています。
「ヘッダデータ」に該当するVBSKのデータ1件に、「正常結果データ」に該当するVBSSのデータが0件以上、
「エラー結果データ」に該当するVBFSのデータが0件以上設定されます。
なお、このER図では表現できませんが、VBSKのデータ1件に対して、VBSSまたはVBFSのデータのうち最低でも1件のデータが作成されます。
##### ER図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/fcb99df2-94ae-089d-89d2-836b697c0141.png)

ER図って書く機会がものすごく減っているので、久しぶりに書くとなると思い出すのが大変です（笑）

#### 処理画面

##### 第一画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/f061ffb7-b7fb-e2fc-128b-68f0d47d2e48.png)
##### 一覧画面
下記オレンジ枠内の「数」（登録された出荷伝票の件数）、「Err.」（処理時に発生したエラーに限らないメッセージ件数 ）がともに複数存在する、グループ：261のデータを見ていきます。<br/>
赤枠内「注釈」：処理時のメッセージを確認する（VBFSの内容を表示）。一覧の項目では「Err.」に件数が表示される。
緑枠内「伝票」：登録された出荷伝票番号を確認する（VBSSの内容を表示）。一覧の項目では「伝票」に件数が表示される。
**`※この記事を書いていて気づきましたが、ボタンの「注釈」「伝票」、一覧内の「数」「Err.」、位置関係が逆になっていますね…`**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/23782ad9-417b-07c0-f562-194fdf298afb.png)


VBFKの内容と合致しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/dbb6e95c-60fa-d5ac-c21c-2bb10e03e29f.png)


#####注釈ボタンを押下した場合

ちょっとスクショに失敗してしまいましたが、下記のようにツリー状態でエラーメッセージ内容が表示されます。各メッセージ行を展開するとメッセージタイプなどの「テクニカルデータ」値を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/9496d507-5ef8-abb6-f481-7785a5ccb090.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/484d1f6b-ea90-bb12-0e22-9423b9e438a6.png)

VBFSの内容と合致しています。「販売伝票」の箇所には今は受注伝票番号が設定されていますが、処理伝票がSTOの場合はSTOの発注伝票番号が設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/cf25f592-1a0e-eb57-5532-f72d385ce747.png)

#####伝票ボタンを押下した場合

下記のように、登録された出荷伝票番号が表示されます。画面上部の伝票照会や伝票フローボタンを使用することで、伝票照会画面や伝票フロー画面に遷移することができます（スクショ省略）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/08a22673-0a70-18c0-3434-df03ff78ab13.png)

VBSSの内容と合致しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/73deb72b-8b92-0cf5-4678-178cbe568e3c.png)


#### まとめ
・トランザクション：VL10*系で登録した出荷伝票の一括処理ログは、トランザクション：V_SAで確認できる
・元の受注伝票・在庫転送オーダーの伝票番号、登録された出荷伝票、メッセージ内容が確認でき、各内容はテーブルに分かれて登録されている

今回の内容は以上となります。ありがとうございました。
【超簡単】PythonとOpenCVでリアルタイムに顔認識と表情認識を同時に実行！


<h2>
準備
</h2>
参照:[Perception for Autonomous Systems(github)](https://github.com/oarriaga/paz "paz")
環境:
ubuntu 20.04 lts
corei3 7th
ram 16gb
<h4>
pip3を使ってTensorflow、OpenCV、NumPy、pypazをインストール
</h4>

```
sudo pip3 install tensorflow
```
```
sudo pip3 install opencv-python
```
```
sudo pip3 install numpy
```

```
sudo pip3 install pypaz
```

<h4>
ソースコードのダウンロード
</h4>

```
git clone https://github.com/oarriaga/paz.git
```

<h2>
実行
</h2>
WEBカメラを接続しておいてください。

```
cd paz
```

```
cd examples
```

```
cd face_classification
```

```
python3 demo.py
```

これで実行できました！お疲れ様でした！
<h2>
おまけ
</h2>
<h4>
ウィンドウサイズを大きくする
</h4>

```
sudo nano demo.py
```

この行を


```
player = VideoPlayer((640, 480), pipeline, camera)
```

以下のように変更

```
player = VideoPlayer((1152, 864), pipeline, camera)
```

これでウィンドウサイズが大きくなり見やすくなりました！
<h2>
最後に
</h2>
最後まで読んでいただきありがとうございました！
他にもプログラムがexamplesファイルの中にあるので試してみてください！
WordpressのSearch Regexでリンクタグを全部消す正規表現

変更を加える前に、データをバックアップすることを強くおすすめします。

検索フラグ：正規表現
検索：`<a(.*)</a>`
置換：削除

これでOK。

<a hrefで指定すると、a classなどから始まるタグが置換されずにつまづいたのでメモ。
エンベデッドシステムスペシャリストに合格しました

#はじめに
この記事は、エンベデッドシステムスペシャリストの合格体験記です。
せっかく高度試験に受かったので~~褒められたいので~~これから試験を受ける人の助けになればと思って記事にしました。
個人的には結構穴場だと思っているので、履歴書になにか箔をつけたいという人にはおすすめです。

# 概要
令和2年度秋期のエンベデッドシステムスペシャリスト試験に合格しました。
午後問題は全部埋めたのですが思ったより点取れてなかったです。
えいや！でうめたのも多かったのでこんなもんですかね。
![goukaku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376819/962dc771-343c-17aa-6eb3-f7f83ba481d6.png)

#試験を受けたきっかけ
去年まではエンベデッドシステム試験は春期開催でしたが、コロナ禍の影響で春期情報処理技術者試験が軒並み中止になったことで、秋期開催にずれ込んでいました。（当日に時計忘れて時間わからなくて焦ったり…）
春期の申しこみを忘れていたんですが、秋にずれたのなら申し込み間に合うなーということで今回受験しました。

# 受かった人のスペック
大体こんな感じです。

| 項目 | 情報 |
|:-:|:-:|
| エンジニア経験  | 6年目  |
| 大学 | 非情報系（理系）  |
| 他の情報処理資格  | 基本情報、応用情報  |

基本と応用は会社に入った年にとりました。
エンベデッド試験は二年目の春にも受けているのですが、模試で合格圏内だったのでナメてたら落ちました。
今回はちゃんと前日までしっかり勉強して望みました。

# どんな試験？
これはもうIPAの説明をそのまま乗っけてしまいます。
>スマート家電、自動運転などあらゆるモノがつながるIoTが進展する中で、ハードウェアとソフトウェアを適切に組み合わせて組込みシステムを構築し、求められる機能・性能・品質・セキュリティなどを実現する組込みエンジニアやIoT系エンジニアを目指す方に最適です。
>https://www.jitec.ipa.go.jp/1_11seido/es.html

今流行のスマート家電や自動運転など、最近ホットになってきたIoT系エンジニアを目指す人におすすめって感じですね。
自分がエンジニア業界に入ったときは、ここまでスマート家電やら、自動運転やらが普及してなかった気がします（その頃はアンテナがにぶすぎただけな気もしますが…）ので、これからどんどん注目されていく資格じゃないかなと思います。

# 勉強方法とか期間とか
午前の過去問をたまに思い出したときに解いたりしてました。
本格的に勉強を始めたのは9月中旬でした。

勉強は基本的にアプリの過去問をひたすら解いていて、わからない単語が出てきたらネットで調べたりしていました。
午後問題は2週間前くらいから時初めて、3年分を1回だけ解きました。
平日は解いても大門1個、休日に解いた日は2問くらいで、あとは過去問をちょこちょこやっていました。

# 試験を受けた感想とか攻略ポイント
## 午前問題
情報処理系の午前問題は4択問題（のはず）です。
エンベデッドも4択でした。午前Ⅰ、Ⅱともに過去問の再利用もかなりあって解き易かったです。
毎日通勤電車で解いてた過去問演習は裏切りませんでした。
解説付きで過去問を出してくれるスマホアプリが結構あるので、**空き時間に解きまくるといいです。**
自分はiPhoneなのですが、エンベデッドで検索して出てくるピンクのアプリを好んで使っていました。

## 午後問題
### 心構え的な
ボリュームが多いのと、問題の前提説明がむちゃくちゃ長いので、読んでる間に時間が減っていって焦ると思います。
ので、演習の段階で試験形式でやっとくといいです。意外と時間がある、ってことを体感しておくと安心して問題文を読み込めます。

### 問題文を読むポイント
タスク表にはメッセージ通知の話が出てくるので、**どのタスクにどんなメッセージを通知しているか？**はマストで印をつけとくといいです。これを意識するだけでだいぶ見通しがよくなった気がします。

タスク構成図がある場合は、**どのタスクとどのタスクがつながっているか？（やり取りをしているか？）**を見ておきましょう。ここでつながっていないタスク同士は情報のやり取りをしていないので。
たとえば、タスク表の穴埋めで「○○タスクに通知する。」の〇〇を埋めるときに使えますし、前述のタスクのメッセージ通知を探るときに参考になります。

例年ハードウェア寄りの問題とソフトウェアよりの問題が半々で出る印象ですが、今年はあまりハードウェアっぽくなかった気がします。物理ちっくな計算問題が少なかった？
情報を送信するのにかかる時間の計算はよく出た印象なので、計算に慣れておくといいです。
**ビットとバイトが揃ってないことが多い**ので、計算しやすい方に寄せちゃいましょう。

午後問題ではあまり知識が必要になることはない印象です。システム構成をちゃんと理解して、設計を紐解いていけば解ける問題だと思います。国語の問題が解ける人は強いかも？

#おわりに
勉強から試験終わりまで、多くの知識を要求されず、思考の深さを中心に問われると思うので、短期間の勉強で取りやすい試験だと思っています。唯一エンベデッド特有の知識がいるのは午前Ⅱ問題じゃないですかね？　でもこれも、過去問を重点的に解いていればいいですし、基本や応用をとっている人なら馴染みやすいです。

情報処理は令和2年度春期試験が中止になったことで、次回のエンベデッドの試験は次の秋になりますが、興味がある人は是非チャレンジしてみてください！
Gitリポジトリの作成/コピー



```
git init
```
.gitフォルダ内に以下のファイルが作成される
　・リポジトリの中の
　　・圧縮ファイル
　　・ツリーファイル
　　・コミットファイル
　・インデックスファイル
　・設定ファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709175/fa190150-7d5b-acc1-f0cf-3431e5269d24.png)

objectsフォルダがリポジトリの本体
configファイルが設定ファイル
git add するとインデックスファイルが生成される

---------------------------------------

```
git　clone 'レポジトリ名'
```
リモートレポジトリのファイルがワークツリーにコピーされる
.gitフォルダがコピーされる

---------------------------------------
gituhub最初のコマンド

最初に行う設定コマンド

```github:qii-command
git --version 　　//バージョンを知る
git config user.name 'my name' //名前を設定
git config user.email 'myaddres@example.com' //メールアドレスを設定
git config --global core.editor "code --wait"  //エディタの設定
git config --global alias.st status  //aliasの設定

ブランチをmasterにマージする際、必ずコミットメッセージを記入することになる
git config --global merge.ff false  //
```
確認コマンド

```github:qii-command
git config user.name
git config user.email
git config --list
```

保存されるのは
‪C:\Users\username\\.gitconfig
Search Regexで画像タグを一括削除する正規表現

##概要
意外と忘れがち・便利な正規表現を記録する

##注意点
間違えるととんでもないことになるので
バックアップを取ること。

##Search Regexの設定

検索フラグ：正規表現にチェック
検索：`<img(.*)/>`
置き換え：削除

これでOKです。
Gitの仕組み

gitは**スナップショット**を記録している。
差分を保存しているわけではない。
「branchをきる」「margeする」を高速にできる。
gitの利点は以前のバージョンに戻せる。

**ローカルリポジトリ**…PC内にある履歴データの置き場
**リモートリポジトリ**…クラウド上の履歴データの置き場

**ローカル**には３つのエリアに分かれている。

<ul>
<li>リポジトリ…スナップショットの記録</li>
<li>ステージ…変更されたファイルの指定</li>
<li>ワークツリー…手元の作業場</li>
</ul>

**add**...変更されたファイルのみワークツリーからステージにあげる
**commit(コミット)**...スナップショットを記録する

*****

gitの中で起きていること
**git add**...
ワークツリーに作成されたファイル→
リポジトリに圧縮ファイルを作成→
ステージに2つのファイルの紐づけを保存(インデックス)
**git commit...**
ステージのインデックスをツリーという構造でレポジトリに保存→
ツリーに変更内容を紐づける（コミット：ツリー名、作成者、日付、コミットメッセージ）
[Unity] Sceneの切り替え方法

__Sceneの切り替えをざっくりですがまとめました。__
__自分用メモです。__

①まず、SampleSceneとNextSceneを作る。

②sampleSceneに移動し、UIからButtonを作る。
（positionX 0; Y 0;　で真ん中にくる）

③project部分で右クリックしcreate→C＃ScriptでScriptの作成。

④下記のコードを追加する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

↓ここから下の部分を追記
using UnityEngine.SceneManagement;

public class Test : MonoBehaviour
{
    public void MoveScene()
    {
        SceneManager.LoadScene("NextScene");
    }
}


⑤ヒエラルキーにCreateEmptyでからのオブジェクトを作成。

⑥作成済のC#Scriptをドラッグ。

⑦ButtonのインスペクタのOnClick部分の＋を押し、
GameObjectをドラッグ。
右の選択部分からTest→Test.MoveSceneを選択する。

⑧ビルドセッティングを開き、NewSceneを追加する。

動作確認する。
CentOS8を毎日定時に再起動させたいんだよなあ

#何か調子悪いからとりあえず再起動
最近CentOSで実行してる日次のrsync（ファイルサーバーのバックアップ）が時々失敗してる…(´・ω・`)

原因はまだよく分かってないけど、ひとまず毎日再起動していみることにしました。

#再起動のシェルスクリプト
これ。

```sh:
shutdown -r now
```

```-r``` が『再起動』のオプション。
```-h``` は『電源切る』のオプションだから注意。
（電源切っちゃったらマシンの前まで行って、電源ボタンぽちってしないといけないよ）

#定期実行をcronに登録
まずは下記コマンドでcron設定ファイルをviで編集。

```sh:
crontab -e
```

下記内容を追記。

```sh:
0 3 * * * /usr/sbin/shutdown -r now
```

分　時　日　月　曜日　コマンド

上記の場合は毎日3:00に『/usr/sbin/shutdown』を実行しなさいよ！オプションは『-r now』よ！な意味。

#shutdownの前に/usr/sbin/を付けてるのは何で？

cronで『コマンドが見つかりません』の例外回避の為です。

コマンドによっては **端末では実行できるのにcronだとできない** ことがあります。
（cronで実行する時にパスが通っていないのが理由）

なので、ただのコマンドではなく **絶対パスで指定したコマンド** にする目的で ```/usr/sbin/```を付けています 。

shutdownの絶対パスを知りたい時は下記コマンド。

```sh:
which shutdown
```

#ホントか～？ホントにお前再起動したんか～？
下記コマンドで簡易的に確認できるん。

```sh:
last reboot
```

結果はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3d6f8ff7-6346-e258-2bd2-d67c9020c60e.png)
金曜日、1月1日、4時51分に再起動、そこから現在まで動いてるよって意味。

3:00とか夜中に再起動することになるから、後から確認できる方法知っておこう。

#必要なサービスは起動と同時に立ち上がるようにしておこう
例えば下記はSamba（ファイルサーバーのサービス）を起動と同時に立ち上げるコマンド。

```sh:
systemctl enable smb
```

#systemdで再起動の定期実行はダメ！
最初はコレ↓で定期実行しようとした。
~~[CentOSで日付・曜日・時間を指定して定期実行したいんだよなあ](https://qiita.com/waokitsune/items/146da8a11a77b9d4cf27)~~

```systemctl enable 再起動のサービス``` なんてことやっちゃったもんだから、

定時再起動 ⇒ **CentOS起動と同時に再起動のサービス開始** ⇒ 再起動 ⇒ **CentOS起動と同時に再起動のサービス開始** ⇒ 再起動 ⇒ ………

無限ルーーーーープになっちゃったよ☆(・ω<)

#「諸君、〇分後に再起動を開始する」

shutdownのオプションで ```-k``` にすれば、**接続してる端末** に **再起動するぞいって通知** できる。
これ使用頻度低いけど便利。

ふーん、そういうこともできるのね、って感じで覚えておこうと思った。

#蛇足
起動と同時にLineに通知するなり、メール飛ばすなりする仕組み作りたいなと思った！

再起動するとMac mini上のネットワークドライブがアンマウントされちゃう…(´・ω・`)
（tico = CentOS上にSambaで構築したファイルサーバー）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/75ce0e2d-b82e-32e5-a011-b43fa2e333f5.png)
Mac側に定期実行のスクリプト設定するなり、アンマウントされないように設定するなり必要ありそう…。
うーん、これは残課題です。

#参考サイトさん
https://eng-entrance.com/linux-command-shutdown
https://rainbow-engine.com/linux-scheduled-reboot-script/
https://teratail.com/questions/75302
https://gist.github.com/koudaiii/49ac3f8b7c207f0da31f
https://netacore.jp/restart-automatically-centos-server/

#バージョン
CentOS Linux release 8.3.2011
ArduinoやESP32でUSBのシリアルポートがMacで認識されない場合(初歩)

### ArduinoやESP32でUSBのシリアルポートがMacで認識されないという場合に試したこと


結論から言うと、充電専用のマイクロUSBはMacに挿して通電しますが、IDEとの接続のためのUSBシリアルポートが認識されないです。多分とても素人の初歩的ミス..

USBシリアルポートが認識されていない状態


````
*****-MacBook-Pro:~ *****$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   18,   0 12 31 22:59 /dev/tty.Bluetooth-Incoming-Port
````

いろいろ試してみたのですが、どうしてもダメでした。
・ケーブルを変えてみる
・マシンを変えてみる
・ドライバをインストールし直してみる
・ほかにもいろいろ

で、データ転送用ケーブル(ここではUsb to micro usb connector cable (E210567))に変えてみたら、認識しました。

````
*****-MacBook-Pro:~ *****$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   18,   0 12 31 22:59 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   18,   2  1  1 05:20 /dev/tty.usbmodem14101
````

Arduino IDEから ボード(以下はLilyPad)に書き込めました。
![USBTB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/1fd38443-7388-b0f7-de8d-f7b307393ee2.png)

あとでESP32も動作確認してみます。
エラー「Calling brew cask install is disabled!」が出たよ

homebrewでGUIをもつアプリをインストールしたい時はcaskを使いましたが、エラーが出る様になりました。

`brew cask` コマンドは
 - **2.6** から非推奨になり
 - **2.7** から無効化されたようです。
 - **2.8** からはエラーメッセージも表示されなくなるそうです。

自分の環境は2.7.1でした。

```
brew --version
Homebrew 2.7.1
Homebrew/homebrew-core (git revision 30e7e; last commit 2020-12-31)
Homebrew/homebrew-cask (git revision 88964b; last commit 2020-12-31)
``` 

#解決方法
`brew cask install ~` を `brew install --cask ~` を替えれば実行出来ます。

エラーをちゃんと確認してみると、、、、、、
`Error: Calling brew cask install is disabled! Use brew install [--cask] instead.`

エラーの内容の後に、ちゃんと書いてあった。
`brew cask install` は無効だよ。 `--cask` を使うようにと。
githubでpushするまでの手順

今回は、githubでpushするまでの手順を紹介します。

# githubでのpushとは？？


平たくいうと、
「ローカルリポジトリ→リモートリポジトリにコミットを送ることです。、、」

と言っても、
なんのことかさっぱりわからない人がいるかと思うので、
動作一つ一つに細かく解説を入れていきたいと思います。


#手順
①githubのサイトで新しくリポジトリを作成する
②ローカル上でpushしたいファイルに移動する
③「git init」でgitを初期化する(初回のみ)
④「git add」でcommitする前に変更内容を一時的に保存する
⑤「git commit」 でディレクトリの変更をローカルリポジトリに登録
⑥「git remote add origin[url]」でローカルリポジトリとリモートリポジトリを繋ぐ（初回のみ）
⑦「git push origin master」でローカルリポジトリのデータをリモートリポジトリに反映する


#①githubのサイトで新しくリポジトリを作成する
まず、githubをWeb上でインストールします。以下からインストール↓
https://github.com/

一通り操作を追えたら、下記のような画面に移動しましょう。
右上の「new」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965248/98e8e931-e770-d0c6-3f26-88dab35ceebe.png)

Repository nameに任意のリポジトリ名を記入し、
Create repositoryをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965248/3e7eacfd-56a9-bcef-5618-d73c92e1252a.png)

※下の方に書かれている
「Public」はWeb上全体にリポジトリが見られます。
「Private」は見れる人を制限することができます。


下記の画面になったら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965248/361e6aa8-e88f-f227-a89c-84114c5a9d30.png)



#②ローカル上でpushしたいファイルに移動する
cdで対象ディレクトリに移動します。

```
cd /Users/sakatsumemasato/react-complete-guide 
```

#③「git init」でgitを初期化する(初回のみ)

gitを初期化します。

```
react-complete-guide sakatsumemasato$ git init
```
こういうのが出てきます↓（既存のGitリポジトリを再初期化という意味）

```
Reinitialized existing Git repository in /Users/sakatsumemasato/react-complete-guide/.git/
```

#④「git add」でcommitする前に変更内容を一時的に保存する

```
git add .
```

#⑤「git commit」 でディレクトリの変更をローカルリポジトリに登録

-mをつけることでコメントを定義することができます。（今回の場合は初コミットということで'new' なんでも良い）

```
git commit -m'new'
```

#⑥「git remote add origin[url]」でローカルリポジトリとリモートリポジトリを繋ぐ
git remote add origin [url]
urlには下記の写真の「Quicksetupの部分のSSHの横にあるUrlをコピーして貼り付ける」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965248/6fa17d4c-fac9-eaaf-b832-0c18568bd3ec.png)

一回この作業を行うと、ローカルリポジトリとリモートリポジトリがつながっていることになるので、
今後ディレクトリの内容を変更してpushする場合はこの作業は飛ばしても良い。

```
git remote add origin https://github.com/masato5579/react-complete-guide.git
```

#⑦「git push origin master」でローカルリポジトリのデータをリモートリポジトリに反映する
「git push origin master」は
コミットしたローカルリポジトリのデータをリモートリポジトリに反映します。

```
git push origin master
```


ここまでがgithubにpushするまでの手順です。
WSL2でKali Linux Guiを使う




#wsl2

MS Storeでkaliをgetして，
PoweShellで現バージョンを確認

```
PoweShell> wsl -l -v
```

バージョンを１から２へ変更する


ディストリビューション個別に

```
PoweShell> wsl --set-version kali-linux 2
```
もしくは一気に（うまくいかない？）

```
PoweShell> wsl --set-default-version2 
```

カーネルコンポーネントの更新が必要なら単に指示に従えばよい．
でてきたリンク先でカーネル更新用プログラムパッケージをインストールして実行するだけ．

#Kali LInuxを起動
（VcXservがすでに設定されていることが望ましい？）

Xサーバであるkexをinstallする

```

Kali Linux> sudo apt update
Kali Linux> sudo apt upgrade
Kali Linux> sudo apt install kali-win-kex
Kali Linux> sudo apt install dbus-x11
```

guiを起動する

```
Kali Linux> kex　-m
```
F8で抜ける
重要オプション
-m 　全画面表示しない
--win　windowsモード
--sl シームレス

ツールのインストール（１５分くらい）

```
K L> sudo apt install -y kali-linux-default
```
あるいは強く，

```

K L> sudo apt install -y kali-linux-large
```


#windowsの機能の有効化
以下を確認

* WSL
* windowsハイパーバイザープラットホーム (WSL2固有)
* 仮想マシンプラットホーム　（GUI）
Powershellのダイアログでスクリプト一覧から別スクリプトを実行する

# 反省
アドイベントカレンダーに間に合わなかった。

# 本題
powershellを使って実行するスクリプトをコントロールしたいということを目的に作成しました。

# ソースコード

``` powershell:Menu.ps1
 # Add WindowsForm
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# Menu
$MenuForm = New-Object System.Windows.Forms.Form
$MenuForm.Text = 'Select Scripts'
$MenuForm.Size = New-Object System.Drawing.Size(300,200)
$MenuForm.StartPosition = 'CenterScreen'

# Start Button
$StartBtn = New-Object System.Windows.Forms.Button
$StartBtn.Location = New-Object System.Drawing.Point(75,120)
$StartBtn.Size = New-Object System.Drawing.Size(75,23)
$StartBtn.Text = 'Start'
$StartBtn.DialogResult = [System.Windows.Forms.DialogResult]::OK

# End Button
$EndBtn = New-Object System.Windows.Forms.Button
$EndBtn.Location = New-Object System.Drawing.Point(150,120)
$EndBtn.Size = New-Object System.Drawing.Size(75,23)
$EndBtn.Text = 'End'
$EndBtn.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

# Script List
$ScriptList = New-Object System.Windows.Forms.Label
$ScriptList.Location = New-Object System.Drawing.Point(10,20)
$ScriptList.Size = New-Object System.Drawing.Size(280,20)
$ScriptList.Text = 'Please select a Scripts:'
$SlectScriptBox = New-Object System.Windows.Forms.ListBox
$SlectScriptBox.Location = New-Object System.Drawing.Point(10,40)
$SlectScriptBox.Size = New-Object System.Drawing.Size(260,20)
$SlectScriptBox.Height = 80

# Add Button
$MenuForm.AcceptButton = $StartBtn
$MenuForm.Controls.Add($StartBtn)
$MenuForm.CancelButton = $EndBtn
$MenuForm.Controls.Add($EndBtn)
$MenuForm.Controls.Add($ScriptList)
$MenuForm.Topmost = $true

# Config Setting
$ResultDoScript = ""
$MenuLists = Import-Csv -Encoding UTF8 "./Config/Menu.csv" | Where-Object {$_.ActiveFlg -eq "true"}
foreach($MenuList in $MenuLists){
    [void] $SlectScriptBox.Items.Add($MenuList.MenuList)    
}


for($i = 0;$i -lt 1;$i){
    $MenuForm.Controls.Add($SlectScriptBox)
    $SelectResult = $MenuForm.ShowDialog()


    if ($SelectResult -eq [System.Windows.Forms.DialogResult]::OK){
        $ResultDoScript = $SlectScriptBox.SelectedItem
        if($ResultDoScript -eq $null){
            Write-Host "This is null."
        }
    } elseif(($SelectResult -eq [System.Windows.Forms.DialogResult]::Cancel)) {
        Exit
    }

    # select call script
    $Powershell = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
    $ScriptPath = Import-Csv -Encoding UTF8 "./Config/Menu.csv" | Where-Object {$_.MenuList -eq $ResultDoScript}
    $ScriptFile = $ScriptPath.Path
    $Argument   = "-Command $ScriptFile"

    # call script
    Start-Process -FilePath $Powershell -ArgumentList $Argument -Wait
}
```

``` csv:./config/Menu.csv
"MenuList","Path","ActiveFlg"
"sample1",".\sample1\index.ps1","true"
"sample2",".\sample2\index.ps1","false"
```

# 参考
[リスト ボックスから項目を選択する](https://docs.microsoft.com/ja-jp/powershell/scripting/samples/selecting-items-from-a-list-box?view=powershell-7.1)
C#/DxLIbでNLuaを動かす

みなさんあけましてお願いします。今年もよろしくお願いします。
さて、今回はC#/DXライブラリでLuaを呼び出して使おうと思います。

# 準備編
今回はLuaのライブラリとして、`NLua`を使います。あとVS2019をつかっています。
導入方法は、NuGetで、`NLua`と検索していただくと出てくるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286973/fea8d87a-0b71-7d17-c284-aa01e651e593.png)
一番上の奴ですね。

# 実装編
## C#からluaを呼び出す
NLuaを使用するには、`using NLua`を先頭に記述してください。
C#/NLuaでのLuaの使用は以下の通りです。
今回はオブジェクト指向らしく(?)main関数から始めます。

```C#:Lua.cs
class luaTest
	{
		Lua lua = new Lua();
		LuaFunction main;

		public void Init()
		{
				lua.DoFile("script.lua");//実行するluaファイル
				main = lua.GetFunction("main");//実行する関数名
		}

		public void Main()
		{
			main.Call();
		}

		public void Finalize()
		{
			lua.Close();
		}
	}
```

```C#:Main.cs
using DxLibDLL;
namespace Program{
	class Program
	{
		static void Main()
		{
			DX.ChangeWindowMode(1);
			DX.DxLib_Init();

			DX.SetDrawScreen(DX.DX_SCREEN_BACK);

			luaTest LuaTest = new luaTest();
			LuaTest.Init();
			while (true)
			{
				DX.ClearDrawScreen();

				LuaTest.Main();

				DX.ScreenFlip();
				if (DX.ProcessMessage() < 0) break;
			}
			LuaTest.Finalize();
			DX.DxLib_End();
		}
	}
}
```

これで、C#側からの準備はできました。
次に、Lua側を準備しましょう。といっても普通に書くだけです。

```Lua:Script.lua
function main()
	--ここに処理をかく
end
```
ですが、これではDxLibの関数をなにも使えません。なので、Luaに追加しましょう。

## LuaからDxLibを使えるようにする
まぁこいつがなかなか面倒くさくて、C#側で関数を一つずつ登録しなきゃならんのです。いい方法があったら教えてほしいです。

```C#:Function.cs
using DxLibDLL;

class Func
{
	public bool KeyLeftPress()
	{
		if(DX.CheckHitKey(DX.KEY_INPUT_LEFT) != 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	public bool KeyRightPress()
	{
		if (DX.CheckHitKey(DX.KEY_INPUT_RIGHT) != 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	public bool KeyDownPress()
	{
		if (DX.CheckHitKey(DX.KEY_INPUT_DOWN) != 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	public bool KeyUpPress()
	{
		if (DX.CheckHitKey(DX.KEY_INPUT_UP) != 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	public void DrawCircle(int x, int y, int r, uint color)
	{
		DX.DrawCircle(x, y, r, color);
	}

	// 以下省略　必要に応じて追加
}
```
と、こんな感じでいちいち書かんといかんのです・・・。めんどくさいこと極まりない。我慢してください。
これをまとめてLuaに追加しましょう。
`Lua.cs`を次のように変更して下さい。

```C#:Lua.cs
public void Init()
	{
			lua["Func"] = new Func(); //関数を追加
			lua.DoFile("script.lua");//実行するluaファイル
			main = lua.GetFunction("main");//実行する関数名
	}
```
これで、LuaからDxLibの関数を使えるようになりました。

```Lua:Script.lua
x = 255
y = 255

function main()
	if Func:KeyLeftPress() == true then
		x = x - 4;
	elseif Func:KeyRightPress() == true then
		x = x + 4;
	end

	if Func:KeyUpPress() == true then
		y = y - 4;
	elseif Func:KeyDownPress() == true then
		y = y + 4;
	end

	Func:DrawCircle(x, y, 16, 0x00ff00);
end
```

では実行してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286973/9ac03d3e-0c7a-8823-4442-a3d46edaf2f0.png)
十字キーを押すと円が移動するのが確認できたかと思います。
あとは関数を追加したりして頑張ってください。

# 最後に
調べてもあまり出てこなかったので、困ってる人がいたら何かの助けになれば幸いです。指摘、改善点などコメント待ってます。
Gitでdebパッケージ開発：（その１）最小構成による野良パッケージ作成

自作ユーティリティをaptで管理したいという動機で、debパッケージの作り方を調べました。
真面目にやろうとすると色々情報を揃えてやらないといけないのですが、いきなり全部整備するのではなく、ステップバイステップで書いていこうと思います。なお、筆者の環境はUbuntu 18.04LTSです。

#debパッケージを作成する最小構成

最初のサンプルとして、次のシェルスクリプトをパッケージ化することを考えます。

```sh
#!/bin/sh

echo " ^ ^"
echo "=o.o="
echo " m m_|~"

exit 0
```
これを/usr/bin/mycatというファイル名で管理すれば、シェル上でmycatと入力すればいつでも可愛らしい猫を呼び出せるようになります。素晴らしい。

＃念のため、mycatという名の実行ファイルが他に存在しないことを確認しておきましょう。

```sh
% which mycat
mycat not found
```

さて、debパッケージを作るための最小構成条件は次の通りです。

 - パッケージ管理ディレクトリ（任意の名前で構いません）の下にフェイクのルートディレクトリがあること
 - さらにその下に
   - インストールイメージがあること
   - DEBIANディレクトリ（許可属性755または775）があること
     - さらにその下にcontrolファイルがあること

ここでは次のようなディレクトリ構成にしましょう。

```
mycat
└── Debian
    ├── DEBIAN
    │   └── control
    └── usr
        └── bin
            └── mycat
```
最初の"mycat"がパッケージ管理ディレクトリ、その下にある"Debian"がフェイクのルートディレクトリです。さらにその下にあるusr/bin/mycatが、aptインストール後には/usr/bin/mycatとなるイメージです。mycatの許可属性は755としておいて下さい。

```sh
% mkdir -p mycat/Debian
% cd Debian
% mkdir -m 755 DEBIAN
% mkdir -p usr/bin
% cd usr/bin
（〜mycatを上の中身に編集〜）
% chmod 755 mycat
% cd ../../DEBIAN
（controlを以下の要領で作成）
```

controlの中身は、少なくとも次の5項目を含んでいなければなりません。

 - Package - パッケージ名
 - Version - パッケージバージョン番号
 - Description - パッケージの説明
 - Maintainer - メンテナの名前と連絡先
 - Architecture - 実行可能アーキテクチャ

各項目は':'（コロン）で区切られた後に書かれます。例えば次のような具合です。

```
Package: mycat
Version: 1.0
Description: Call your lovely cat!
Maintainer: （あなたの名前） <（あなたのe-mailアドレス）>
Architecture: all
```

＃バージョン番号の付け方や実行アーキテクチャについてはここでは説明しませんが、お調べになることを強くお勧めします。
この上でパッケージ管理ディレクトリmycatまで戻り、dpkg-debコマンドでdebファイルを作成します。

```sh
% cd ../..
%  fakeroot dpkg-deb --build Debian .
```

fakerootコマンドはfakerootパッケージに、dpkg-debコマンドはdpkg-devパッケージにそれぞれ入っています。コマンドが無いという人はそれぞれ上記をインストールしましょう。

```sh
% apt install fakeroot dpkg-dev
```

dpkg-debが成功したら、debパッケージファイルmycat_1.0_all.debが出来ているはずです。dpkgコマンドを使ってインストールしてみましょう。

```sh
% sudo dpkg -i mycat_1.0_all.deb
```

途中、パスワード入力を求められます。成功したら、早速mycatコマンドを試してみましょう。

```sh
% which mycat
/usr/bin/mycat
% mycat
 ^ ^
=o.o=
 m m_|~
```

やったー可愛い猫ちゃんが表示されました！アンインストールも試してみましょう。

```sh
% sudo dpkg -r mycat
% which mycat
mycat not found
```

パッケージを誰にも公開するつもりが無く、単にインストール＆アンインストールを簡単にすることだけが目的ならば、ここで示したように野良パッケージを作れば十分だと思います。ただし、誰にも公開しないとしてもパッケージをきちんと管理したいならば、やはり情報を整備すべきです。次回以降、少しずつ説明して参ります。
batch版簡易ARGPARSE

# コマンドラインの引数解析
使う機会ほとんどないだろうけど、batch で引数の解析をやってみたら意外にできたので、作ってみた。
引数に`--name value` や`--name=value`があると、`set name=value`をしてくれる。
使い方は`call tools\parse_options.cmd %*`とするだけ。

## 解析用バッチ(ライブラリ？)
```batch:tools\parse_options.cmd
@echo off

:: Parse arguments

:ARGPARSE
  set _=%~1
  if /i "%_%" == "-h" goto HELP
  if /i "%_%" == "--help" goto HELP
  if not "%_:~,2%" == "--" exit /b 0
  
  set __=%_:-=_%
  set ___=%__:~2%
  if "%~2" == "" goto NO_OPTARG
  
  call set %%___%%=%2
  
  set _=
  set __=
  set ___=
  shift
  shift
  if not "%~1" == "" goto ARGPARSE

exit /b 0

:NO_OPTARG
echo No optarg of %___% 1>&2
exit /b 1

:HELP
if defined help_message (
  echo %help_message% 1>&2
) else (
  echo No help found. 1>&2
)
exit /b 1
```

## ドライバコード
```batch:driver_for_parse_options.cmd
@echo off
call tools\parse_options.cmd %*
```


## テストコード
```batch:test_for_parse_options.cmd
@echo off
setlocal

echo === clear vars ===
set a=
set b_c=
set d_e=
set f=
set g=
set h=
set i=
set j=
set k=

echo === set vars ===
call driver_for_parse_options.cmd --a 1 --b_c 2 --d-e "3 4" --i=10 --j="a=b"
echo ERRORLEVEL:%ERRORLEVEL%
if errorlevel 0 (
  echo a:%a%
  echo b_c:%b_c%
  echo d_e:%d_e%
  echo i:%i%
  echo j:%j%
)

echo === invalid arguments 1 ==
call driver_for_parse_options.cmd --f --g --h
echo ERRORLEVEL:%ERRORLEVEL%
echo f:%f%
echo g:%g%
echo h:%h%

echo === invalid arguments 2 ==
call driver_for_parse_options.cmd --k=c=--def
echo ERRORLEVEL:%ERRORLEVEL%
echo k:%k%


echo === show help ===
call driver_for_parse_options.cmd -h
echo ERRORLEVEL:%ERRORLEVEL%

set "help_message=Usage driver_for_parse_options.cmd [--a a] [--b_c b_c] [--d-e d_e]"
call driver_for_parse_options.cmd --help
echo ERRORLEVEL:%ERRORLEVEL%

endlocal
pause

```
## 実行結果
```
Q:\>test_for_parse_options.cmd
=== clear vars ===
=== set vars ===
ERRORLEVEL:0
a:1
b_c:2
d_e:"3 4"
i:10
j:"a=b"
=== invalid arguments 1 ==
No optarg of h
ERRORLEVEL:1
f:--g
g:
h:
=== invalid arguments 2 ==
No optarg of def
ERRORLEVEL:1
k:c
=== show help ===
No help found.
ERRORLEVEL:1
Usage driver_for_parse_options.cmd [--a a] [--b_c b_c] [--d-e d_e]
ERRORLEVEL:1
続行するには何かキーを押してください . . .
```
Ubuntu 20.04でMX Master3を認識することができるように設定した

## Solaar のインストール

```
$ sudo add-apt-repository ppa:daniel.pavel/solaar
$ sudo apt-get update
$ sudo apt-get install solaar
$ sudo apt-get install solaar-gnome3
```


## 下記ファイルを作成する。

```
sudo vi /etc/udev/rules.d/42-logitech-unifying-receiver.rules
```

```/etc/udev/rules.d/42-logitech-unifying-receiver.rules
# This rule was added by Solaar.
#
# Allows non-root users to have raw access to Logitech devices.
# Allowing users to write to the device is potentially dangerous
# because they could perform firmware updates.

ACTION != "add", GOTO="solaar_end"
SUBSYSTEM != "hidraw", GOTO="solaar_end"

# USB-connected Logitech receivers and devices
ATTRS{idVendor}=="046d", GOTO="solaar_apply"

# Lenovo nano receiver
ATTRS{idVendor}=="17ef", ATTRS{idProduct}=="6042", GOTO="solaar_apply"

# Bluetooth-connected Logitech devices
KERNELS == "0005:046D:*", GOTO="solaar_apply"

GOTO="solaar_end"

LABEL="solaar_apply"

# Allow any seated user to access the receiver.
# uaccess: modern ACL-enabled udev
# udev-acl: for Ubuntu 12.10 and older
TAG+="uaccess", TAG+="udev-acl"

# Grant members of the "plugdev" group access to receiver (useful for SSH users)
#MODE="0660", GROUP="plugdev"

LABEL="solaar_end"
# vim: ft=udevrules

```

このファイルの内容：
https://raw.githubusercontent.com/pwr/Solaar/master/rules.d/42-logitech-unify-permissions.rules


USB receiverをさし直します。

参考：
https://askubuntu.com/questions/588197/solaar-loses-permissions-after-reboot-need-to-unplug-unifying-receiver-each-ti
【初学者必見】HHKB✖️カーソル移動ショートカットキー(for Mac)

# HHKBを更に最高に！！

こんにちは！


先日、念願のHHTB hybrid type-sを購入したのですが、控えめにいって最高です！
HHKBは、プロダクトとしても秀逸で打鍵感やコンパクトな設計など巷のレビュー通り最高のキーボードと実感しているので、買ってかなり満足しています。

しかし・・・

個人的には最高のキーボードに満足しているのですが、
巷の声をよく聞くと少なからず賛否の「否」があるようでとても驚きました。
　　
気になったので個人的に調べたところ否定的な意見として、

 - 矢印入力がFnキーを伴う操作になる為、矢印キーを多様するユーザーには不便と感じる。
 - Fnキーがキーボードの右端にあるので、ホームポジションが崩れる。
 - 単純に不便である。


といった原因が主に挙げられていて、結果として独特のキー設計になれず最終的に手放す人も続出しているようですね。

## ショートカットキーを紹介する理由
HHKBの独自性を利用するためというのが最大の理由ですが、それを除けば理由は3つあります。

その①：
Controlキーを駆使したカーソル移動を進める理由としては、HHKBのキー配列は本来ならCapsLockキーがある所（Aキーの左隣）が、デフォルトでControlキーになっているのでホームポジションを崩さず非常に押しやすいので、無理なく徐々にキー操作を取り入れることができること。
　　
その②：
インストールの必要がなく、覚える内容が少ないので無理なく初められること。

その③：
覚えてしまえば、MacOS上のブラウザやメモなど色々な所で使用可能だから。
##フリマアプリに出品するなんてもったいない！！


今、この記事を読んでいるあなたが世界最高峰のキーボードHHKBを手放そうと悩んでるならこの記事を読んで実践してからでも遅くないと思いますので、騙されたと思って一度実践してみて下さい。

これから紹介する方法は、既に普遍的な方法でAppleサポートでも掲載されていますが
僕も色々実践した結果、ストレスが減り作業効率が向上したこともあるのでシェアできればと思っています。

非常に便利なのでとにかく試しに一週間ほど実践して下さい。

この方法は意識すれば3日ほどで慣れるような簡単なショートカットキーなので、やらない損はあってもやってみて損はないはずです。


僕が実際に使ってみたのは

 ① Controlキーを駆使したカーソル移動
 ② karabiner-elementsを導入してviのようなカーソル移動（hjkl）

という２つの方法なのですが、
②は非常に便利でMacのキー設計を自由にカスタムできるのですが、今回はインストールの必要のない①の解説のみに留めさせていただきます。

##マスターすべきショートカットキー一覧

|  ショートカットキー　  |  移動系  |
| :----: | :----: |
|  Ctrl＋f  |  カーソルを右へ  |
|  Ctrl＋b  |  カーソルを左へ  |
|  Ctrl＋p  |  カーソルを上へ  |
|  Ctrl＋n  |  カーソルを下へ  |
|  Ctrl＋a  |  カーソルを行頭へ  |
|  Ctrl＋e  |  カーソルを行末へ  |
|  Ctrl＋t  |  カーソルの<br>左右1文字ずつを入替  |
|  ー　  |  **削除・貼付系**  |
|  Ctrl＋d  |  カーソル右側の1文字削除  |
|  Ctrl＋h  |  カーソル左側の1文字削除  |
|  Ctrl＋k  |  カーソル右側の文字から<br>行末／段落末まで削除  |
|  Ctrl＋y  |  Ctrl＋kで削除した<br>文字列を貼り付け  |
|  Ctrl＋o  |  カーソル下段に空行挿入  |

## 動画解説
このショートカットを実践し始めたときに動画解説（約9分ほど）を作ったので
上記のリストで「イメージしにくい！」という場合は下記にURLを添付しておりますので、動画をご覧になって下さい。
（※動画ではMagic Keyboard日本語仕様で解説していますが、キー配列は同じなので参考になると思います）

![maxresdefault.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592652/97df54bb-ff5d-a81b-689f-34ba33ae104a.jpeg)

https://youtu.be/Jx6e2xEBCos

数ある中のショートカットキーのほんの一部のみの掲載ですが、非常に有効なのでこれさえ押さえておけば今後役立つこと間違いない厳選ショートカットキーです。
  
ご覧の通り、取っ付きやすく簡単なので是非お試しください！

最後までお読みいただきありがとうございました！！
ディスプレイマネージャの変更[ubuntu]

もともとのディスプレイマネージャはgdm3。ディスプレイマネージャをlightdmに変更するには次を実行するだけ（lightdmインストール済が前提）

```
$ sudo dpkg-reconfigure lightdm
```

これで`/etc/X11/default-display-manager`が書き変わるし、`/etc/systemd/system/dislpay-manager.service`も張り変わる。リブートすれば`/lib/systemd/system/lightdm.service`が自動起動される。

もとの`gdm3`に戻すなら

```
$ sudo dpkg-reconfigure gdm3
```

を実行する。
AWS Snowballについて

## 勉強前イメージ

AWSに大容量(数TBくらい)のデータ打ち上げるときに使われるものって感じ。
大きいパソコンみたいなの届いて、それにデータ入れてAWSに送ったらs3？にデータが打ち上がる

## 調査

### AWS Snowballとは

AWS Snow Family の中の選択肢の一つで、
物理ストレージデバイスを使用してS3に大量のデータを打ち上げるためのデバイスです。
郵送でSnowballデバイスが送られ、そこにデータを格納して送り返すことで大容量のデータを早く、セキュアに打ち上げることができます。

### Snowballの種類

#### Snowball

- 容量を50TB,80TBを選べる

![AWS Snowball project - backup services and costs](https://d1.awsstatic.com/Projects/data-storage-snowball/snowball1.8f5225471dd4e971aa5d48e0470686d44a97ef0f.png)

#### Snowball Edge

- 100TB転送することができる
- 複数ディスクでクラスタリングを組むことができる
- Snowballよりエンドポイントの選択肢が多い

![AWS Snowball Edge ãƒ‡ãƒã‚¤ã‚¹ã®ä½¿ç”¨ - AWS Snowball Edge é–‹ç™ºè€…ã‚¬ã‚¤ãƒ‰](https://docs.aws.amazon.com/ja_jp/snowball/latest/developer-guide/images/Snowball-Edge-Image.png)

### マネジメントコンソールから見てみた

Snowball Edgeしかないけど、Snowballは東京リージョンでは頼めないのかな・・・？

![AWS Snow Family Management Console 2020-12-29 14-13-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5d1ee938-edaf-2f82-31cf-118e3b3d4073.png)


## 勉強後イメージ

実際には個人ではあまり見ることはないんじゃないかというSnowball。
1回だけ見たことはありましたが、そのときはよくわからず・・・
ただ数TBくらいだったら別のサービスで打ち上げたほうが効率がいいらしい。

## 参考

- [AWS Snowball / Snowball Edgeとは｜検証レポート](https://www.business-on-it.com/2003-snowball/)
- [AWS Snowballことはじめ パート1【Snowballがベルリンオフィスにやってきた】](https://dev.classmethod.jp/articles/aws-snowball-first-look-01/)
- [Snowball Edgeを利用したAWSへのデータ移行 -2019夏-](https://blog.serverworks.co.jp/tech/2019/09/12/snowballedge-2019summer/)
- [SnowBall](https://qiita.com/fjisdahgaiuerua/items/22c6a4b4f5082651bd16)
- [（第1回）AWS Snowballを使ってみた](https://business.ntt-east.co.jp/content/cloudsolution/column-try-12.html)
- [AWS Snowball デバイスとは](https://docs.aws.amazon.com/ja_jp/snowball/latest/ug/whatissnowball.html)