OmniAICreator/Qiita-1.07M huggingface dataset:
npm auditでエラーが報告された時


npm auditで以下のコマンドを打ってくださいと言われたので入力すると直りました。

```terminal:terminal
npm audit fix
```
いろいろパッケージを入れていたので寄付してくださいとあったので以下のコマンドで寄付一覧を表示

```terminal:terminal
npm fund
```
寄付一覧が出たので、npm uninstallで削除する

例

```terminal:terminal
npm uninstall　bootstrap popper.js 
```

https://blog-and-destroy.com/8369

https://techacademy.jp/magazine/16146

https://qiita.com/riversun/items/7f1679509f38b1ae8adb

https://qiita.com/mamosan/items/6f1cf71ccd82216fe25b

https://zenn.dev/feb19/articles/907990aaf95b81

https://www.webprofessional.jp/beginners-guide-node-package-manager/
3級テクニカルライティング試験を受けてみて合格した記録

[テクニカルコミュニケーター協会　> TC技術検定](https://www.jtca.org/certificate_exam/exam_writing_b.html)
3級 テクニカルライティング試験。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/50e00396-1e9f-55e3-b452-1b70bcb53f5b.png)
受かった。ので、その記録です。



## 勉強の記録

[「日本語スタイルガイド 第3版」を読んでいるので、その技術要点と基礎 - Qiita](https://qiita.com/e99h2121/items/6ebbcd42f2ac713daeb3)
[日本語スタイルガイド集中読破](https://zenn.dev/e99h2121/articles/japanese-styleguide)

セミナーにおいて、この「日本語スタイルガイド」がすべてとの理解。


## 3級 テクニカルライティング試験 とは

> 使用情報の作成に携わる人々だけでなく、実用文の作成に役立つ日本語の文章表現技術を高めたいすべての方々を対象とする試験です。
> 営業やエンジニアなど文書を仕事の対象としてなくても、文書は作成します。仕事で扱うすべての文書は、必ず誰かに向けて発信されるものです。しかし、文法や文の知識だけでは文書は作成できません。何のために、何を、どう説明するか、もう一度日本語を見直し、伝わる文書力を磨きましょう。


## 学習手順

伝わる文書力を磨きましょう。
端的に2つです。

1. 「日本語スタイルガイド」を手に入れて読む。
2. セミナーに参加してみる。


- 日本語スタイルガイド
    - [日本語スタイルガイド(第3版) | 一般財団法人テクニカルコミュニケーター協会, 一般財団法人テクニカルコミュニケーター協会 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89-%E7%AC%AC3%E7%89%88-%E4%B8%80%E8%88%AC%E8%B2%A1%E5%9B%A3%E6%B3%95%E4%BA%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%82%AB%E3%83%AB%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%BF%E3%83%BC%E5%8D%94%E4%BC%9A/dp/4902820102)
- セミナー
    - [テクニカルコミュニケーター協会　> TC技術検定](https://www.jtca.org/certificate_exam/exam_seminar_01.html)

![](https://images-na.ssl-images-amazon.com/images/I/51uw2N2jwML._SX339_BO1,204,203,200_.jpg)

出題内容やポイントなど、上記がすべてだったな...、という感想です。
助詞「へ」と「に」の違いや、算用数字・漢数字の使い分けなど引っかかりやすい問題、
あるいは製造物責任法など、暗記力勝負の項目もあります。


## 受験当日の記録とちょっとしたメモ

- 受験者層は下は大学生から上はベテラン技術者に見える方まで、男女も半々くらい。
- 選択式半分記述式半分、というテストです。
- 鉛筆で丸付けするテストで、昔ながらの実地テスト方式。試験監督各位と、貸し会議室的な会場。少々懐かしい気持ちに...。
- 当日の感触的には7割は自信持って埋められたので、「まー受かってんじゃないすかね〜？」と考えていた。結果合格。ありがたや。
- 我々のようなシステム屋さんの受験も増えているだろう。もう少し試験自体をシステム化してほしいなみたいな、昔の工業製品のマニュアル作成検定から引き継がれているのかな、等、感じる検定試験でした。
- ちなみに自分の会社では資格試験補助制度があるのですが、申請のために受験料の領収書をいただく必要があり、協会にメールで問い合わせて発行をお願いしました。昔ながらの感覚です。

## ポイント

- ちょっとした引っ掛け出題ポイントなどを、セミナーで確認できて非常にわかりやすかった。
- 例えば
    - 漢数字と算用数字の使い分け
        - その数字をほかの数に置き換えることができるかどうか考えてみて、ほかの数に置き換えられない場合は漢数字を使う。
    - ですます調、である調
        - ですます: 操作手順
        - である: 見出し、図表内の説明、図表のキャプション
    - 能動態、受動態
        - 人間が主語。「マウスポインターを合わせ、クリックします」
        - クリックすると、「確認メッセージが表示されます」
    - 主語述語
    - ねじれ文
        - 「は」と「が」を区別する
    - 格助詞、主体・主格・対象の「が」: 「利用者が変更を行う」
    - 副助詞、主題・対象: 「このシステムは」
        - 「に」と「へ」を区別する
- 等など : [日本語スタイルガイド集中読破](https://zenn.dev/e99h2121/articles/japanese-styleguide)

## 参考記事

[TC技術検定３級を受けてみた｜Chino｜note](https://note.com/tech_write/n/nb32c212d250b)
[3級テクニカルライティング試験[TW]を受験してみた | をにが部屋からノと出より](https://so2akt.wordpress.com/2022/02/27/3%e7%b4%9a%e3%83%86%e3%82%af%e3%83%8b%e3%82%ab%e3%83%ab%e3%83%a9%e3%82%a4%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0%e8%a9%a6%e9%a8%93tw%e3%82%92%e5%8f%97%e9%a8%93%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f/)
[テクニカルライティング3級を受けてみた - アフロ de 派遣](https://miss-haken.hatenablog.com/entry/2022/02/28/213000)
[なぜ、11日間のお勉強でテクニカルライティング3級が合格できたのか？ - アフロ de 派遣](https://miss-haken.hatenablog.com/entry/2022/04/02/223505)

以上です～
matplotlibで派手な円形の図を作るライブラリを開発してみた。

# Pycircosをの紹介
この記事は自分が開発している、pyCircosについての紹介記事である。
- https://github.com/ponnhide/pyCircos

## 開発の背景
### 派手な円形の図って?
有名なcircos plotだろうか。chord diagramを使って作られる派手なネットワーク図である。

http://circos.ca/
![circos-sample-panel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167957/fac850b3-42eb-00cd-421a-1df33f40ec63.png)

あと、bioinfoの領域だと、こんな感じの系統樹もよく論文とかにはでてくる。
https://yulab-smu.top/treedata-book/chapter10.html
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167957/da964868-efd7-eb92-b524-e06942bf41f3.png" width="500x500">

どちらのplotもmatplotlibではない別のライブラリを用いる必要があり、このような図は、matplotlibで作れるわけがないと信じられているようである。事実、stackoverflowでは、この手の質問は明確な答えがないのにcloseされてしまっている。
https://stackoverflow.com/questions/9472070/circos-style-plots-with-matplotlib

### matplotlibでpolar plot
ただ、あんまり知られていないかもしれないが、matplotlibにもpolar plot(極座標plot)の機能は存在する。が、これについてはの情報は非常に少ない。「え、公式のドキュメントにはそれなりに書いてあるんじゃないの？」って思うかもしれない。確かに、matplotlib ver3.5.0 になってから、ドキュメントは非常に洗練されたものとなり、polar plotについても必要な情報に簡単にアクセスできるようになった。例えば以下のページである。

- [matplotlib.projections.polar.PolarAxes](https://matplotlib.org/3.5.0/api/projections_api.html#matplotlib.projections.polar.PolarAxes)
　

うん。無理です。どう頑張っても無理です。こんな各methodとかの細かい仕様だけ書かれて使えるわけがない。example codeとかないのかな、と思って探してみつかるのは以下のような、非常に簡素な例だけである。

- [polar plot](https://matplotlib.org/3.5.0/gallery/pie_and_polar_charts/polar_demo.html)
- [Bar chart on polar axis](https://matplotlib.org/3.5.0/gallery/pie_and_polar_charts/polar_bar.html)

こんな例だけで、polar plotを使えるわけないだろ！。
まぁ、そもそも「極座標系は正直見ずらいし、別に直交座標系で表示すればいいじゃん」というツッコミはただしい。でもときには、大した意味はなくてもcircos plotみたいな派手な図を置いといて、なんかかっこいい論文とか申請書とか作りたい時があるわけですな。ということで、気合でライブラリを作ってみた。

## 使い方

- README (https://github.com/ponnhide/pyCircos)
- tutorial code (https://colab.research.google.com/drive/1xmAnv7AHWUTA2HWfjqV1lFWkFMSLJHG0?usp=sharing)


## 結果:(きれいなpolar plotだろ。ウソみたいだろ。matplotlibなんだぜ。)

### circos plotの例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167957/97c9ade3-d729-870c-40a8-f2361e0d6a56.png" width="800x800">

### circular phylogenetic treeの例
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167957/8010cef9-4797-4820-570b-b9242c05fac8.png" width="500x500">



## おまけ
ライブラリは違うが、pyCircosで培った技術を使ってplasmid mapを円形表示するという、多分一握りの人にしか使い道がないツールも開発している。
https://github.com/ponnhide/plasmidviewer

これを使うと、こんな感じの図が作れる。apeとかで手作業でプラスミドマップの図を作ってる人がいたら使ってみてほしい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167957/9ebb6c44-8687-4332-93df-f66e4adf5810.png" width="500x500">
2022/4/11主にITとかセキュリティの記事

詐欺の技術、SNSで売買　中国から日本を標的か(4/8)
https://www.nikkei.com/article/DGXZQOUE051KV0V01C21A2000000/

シーエックスアールの業務サーバに不正アクセス、データ暗号化するも1週間で全面復旧(4/8)
https://s.netsecurity.ne.jp/article/2022/04/08/47433.html

アンチウイルスアプリを偽装したAndroidマルウェア見つかる、確認と対処を(4/8)
https://news.infoseek.co.jp/article/mynavi_2396945/?tpgnr=it

AWS WAF Bot Control のチューニングと最適化(4/8)
https://aws.amazon.com/jp/blogs/news/fine-tune-and-optimize-aws-waf-bot-control-mitigation-capability/

NFTから考えるWeb3.0の本質(4/8)
https://hedge.guide/feature/web3-essence-bc202204.html

Apple AirTag を用いたストーカー事件が米国で大量発生中(4/8)
https://hypebeast.com/jp/2022/4/apple-airtag-causing-women-to-be-stalked-police-records

NTTグループ 「カスペルスキー」使用中止を検討　米政府のリスト受け(4/8)
https://www.fnn.jp/articles/-/344237

DAO（分散型自律組織）とは？ トークンが描く新たなエコシステムの可能性(4/9)
https://wired.jp/membership/2022/04/09/the-promise-of-daos-the-latest-craze-in-crypto/
Nuxt.js × Vuetify × FirebaseでWEBアプリ作成①

# はじめに
この記事は、Nuxt.js, Vuetify, Firebaseを使用し、勤怠管理・出勤集約を行うWEBアプリを作成した過程を記録したものです。今回は、アプリケーションの概要と開発経緯について紹介いたします。

記事投稿は数回目でまだ慣れておりません。下記にも記述しましたが、Nuxt.jsなどを使用するのも今回が初めてなので曖昧な箇所も散見すると思われます。

ご意見やアドバイス等あればぜひよろしくお願いいたします。

# アプリケーション概要
当アプリケーションは主にアルバイト先での勤怠管理・出勤集約を行うWEBアプリケーションです。

アルバイトの方にはスマートフォンでの使用を想定しているので、PWAを導入し、スマートフォンのアプリライクに使ってもらえるようにしています。

Nuxt.jsはSSRやSPAなどを簡単に作成できますが、下記事情により、SPAで作成しています。
アルバイトの延長線上で作業しているものの、基本業務から逸脱しているものなので個人の趣味に近い開発です。そのため従量課金制のプランには移行できず、FirebaseやNuxt.jsの機能を最大限生かし切れていないです(非常に残念)。

どの機能も、私が勤めているアルバイト先に特化した仕様となっているため、ほかの方はほとんど活用できないと思います。（特化している分アルバイト先の方からは使いやすいと好評をいただいています）

コードはGithubに挙げて後日改めて公開します。

## ホーム
### お知らせ機能
管理者や職員アカウントからアルバイト全員に伝えたいお知らせを作成することができます。
ホーム画面のトップに表示されるので、使用者全員に見てもらえます。

### 出勤集約フォーム
出勤日の調整をはじめ、会議の参加集約なども当フォームから行えます。
使用感としては、LINEの投票に近い形です。

* フォーム一覧
* フォーム新規作成
* フォーム回答
* 回答の簡易表示
* 回答の詳細表示
* フォーム修正
* 編集権限の付与
* フォームの終了/再開
* フォームの削除

## 勤怠記録(アルバイト側)
カレンダー表示になっているので、Google Calendarのように使えます。
勤怠を記録したい日を押してもらうと、勤怠情報を入力するダイアログが表示されるので、詳細を入力し、保存することができます。
記録した情報は、本人のアカウントと店舗側のアカウントから見ることができます。

## 勤怠管理(店舗側)
表形式に一覧が表示されます。実務では、指定の別ソフトウェアに勤怠情報を入力するという工程があるみたいなので、本アプリ上では、簡易表示にとどめ、詳細をExcel出力できるようにしています。

* 一覧表示
* 検索機能
* Excel出力

## アカウント管理(店舗側)
表形式にアカウント一覧が表示されます。

アカウントを選択すると、そのアカウントの詳細情報がダイアログとして表示され、ログインID/Passwordを除く情報の変更およびアカウントの削除が行えます。出力を押すと、ログインID/Passwordが記載されたPDFが発行されます。

新規作成ボタンからアカウントの作成が行えます。ログインID/Passwordはこの時自動生成されます。

まとめて出力を選択すると、ログインID/Passwordが記載されたPDFが全アカウント分発行され、zipファイルとしてダウンロードできます。

* 一覧表示
* 検索機能
* PDF出力
* zip出力
* アカウント情報の変更
* アカウントの削除
* アカウントの作成

## グローバルな設定(店舗側)
アカウント情報に使用する項目の設定や、時給などの設定を行えます。

* 学部/学科/ｺｰｽの設定
* 役職の設定
* 担当の設定
* 給与の設定

## メニュー

* 当月の給与概算/合計労働時間の表示
* ユーザー情報の変更
* パスワードの変更
* FAQ(よくある質問)
* お問い合わせ
* アカウントの削除
* ログアウト

# 開発経緯
以前まで、私が勤めていたアルバイト先での勤怠管理は、ICリーダーを用いたものと用紙記入の併用でした。
しかし、コロナ禍で当バイト先も在宅勤務が採用され、勤怠管理の方法の見直しが必要となりました。

## はじめはSpreadsheetで
最初は導入のしやすさから、Google Spreadsheetを使用して月ごとにシートがあり、該当欄に必要項目を記述していく方式でした。

このSpreadsheetはGASを使って様々な機能を入れたりしたのですが、使用者全員がSpreadsheetに強いわけではなく、こちらの想定外の操作を行うこともあり、ルールを設定していてもルールをかいくぐったエラーが頻発するといったケースがよく起きていました。

また、使用者が学生アルバイトということもあり、スマートフォンからの利用がほとんどでした。スマートフォンからの利用だと、見づらい使いづらいという声も多く上がっていました。

頻発するエラー対応や使用者からの不満の声にしびれを切らし、専用のWEBアプリを作る決意をしました。

## WEBアプリ
いざWEBアプリを作ろうと決意したものの、実はWEB系開発に使用する言語はほとんど経験がありませんでした。

それでも、「短い開発期間で、スマートフォンでも使いやすいアプリをつくる」ことを目標に、[paiza]( https://paiza.jp)などで学習を進めるのと並行しながら、公式ドキュメントを読み漁り、ひたすらトライ＆エラーを繰り返し開発を進めました。

# 次回記事について
次回は、プロジェクトの作成についてまとめたいと思います。
BeautifulSoupでタグ無しで要素取得する方法

#### 変数 = [n.get_text() for n in soup.select('cssセレクター')]

参考URL

https://qiita.com/Chanmoro/items/db51658b073acddea4ac

BS
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

文字だけ抜き出し
https://qiita.com/poorko/items/9140c75415d748633a10

list型では使えないけど・・・
https://techacademy.jp/magazine/37561
PHPでYoutubeからタイトルとサムネイルを取得

YoutubeAPIを使ってYoutubeのURLからタイトルとサムネイルを取得する機能を実装したので備忘録として残しておく。
基本的には以下のYoutube動画を参考にした。

https://www.youtube.com/watch?v=Kcm6LvSBfpg&t=444s




⇩作成したサービス

https://qiita.com/cookiesand1023/items/4aa52d9c4c5934c067c8

# YoutubeAPIキー取得
Google Cloud PlatformからYoutubeのAPIキーを取得する。
ここでは説明を省く。

今回はAPIキーを実際の処理の中で変数として持たせてしまっているが、Laravelを使用する場合.envに記載する。

# 実装
App\LibにYoutube.phpを作成し、ここでAPIと連携する。
今回は作成したサービスの都合上、json形式で値を返す。

```App\Lib\Youtube.php
namespace App\Lib;

class Youtube {
    
    // YoutubeのURLから動画IDを抽出
    public static function getVideoID($url) {

        preg_match('/\?v=([^&]+)/', $url , $match);
        $id = $match[1];

        return $id;
    }
    
    // 動画情報をAPIから取得し、json形式で返す
    public static function getYoutubeData($url) {
        
        $API_KEY = '取得したAPIキー';

        $id = Youtube::getVideoID($url);
        $base_url = "https://www.googleapis.com/youtube/v3/";

        $API_URL = $base_url . "videos?id=" . $id . "&part=snippet&key=" . $API_KEY;

        $video = json_decode(file_get_contents($API_URL));

        $title = $video->items[0]->snippet->title;
        $thumbnail = $video->items[0]->snippet->thumbnails->medium->url;
        $detail = $video->items[0]->snippet->description;

        $dataArr = [
            'title' => $title,
            'thumbnail' => $thumbnail,
            'detail' => nl2br($detail)
        ];
    
        $jsonData = json_encode($dataArr, JSON_UNESCAPED_UNICODE);
        
        return $jsonData;
    }
}
```

## コードの説明

#### getVideoID()

```php
    // YoutubeのURLから動画IDを抽出
    public static function getVideoID($url) {

        preg_match('/\?v=([^&]+)/', $url , $match);
        $id = $match[1];

        return $id;
    }
```
関数getVideoIdは引数にYoutube動画のURLをとり、動画固有のIDを正規表現で取得している。
例) URL : https://www.youtube.com/watch?v=Kcm6LvSBfpg&t=444s
　　→動画ID Kcm6LvSBfpg&t=444s



#### getYoutubeData()
```php
$base_url = "https://www.googleapis.com/youtube/v3/";
```
YoutubeAPIを使用する場合、このURLに様々なパラメータを指定して情報を取得する。


```php
$API_URL = $base_url . "videos?id=" . $id . "&part=snippet&key=" . $API_KEY;
```
part=snippetを指定することで、idで指定した動画のタイトル、説明、カテゴリなどの基本的な情報が得られる。

```php
$video = json_decode(file_get_contents($API_URL));

$title = $video->items[0]->snippet->title;
$thumbnail = $video->items[0]->snippet->thumbnails->medium->url;
$detail = $video->items[0]->snippet->description;
```
APIからはjson形式で値が返ってくるので、PHPのオブジェクトに置換して、必要な情報を取り出す。
どのようなデータが取得可能かは以下を参照する。
https://developers.google.com/youtube/v3/docs/videos?hl=ja

```php
$dataArr = [
        'title' => $title,
        'thumbnail' => $thumbnail,
        'detail' => nl2br($detail)
];

$jsonData = json_encode($dataArr, JSON_UNESCAPED_UNICODE);
```
取り出したデータを連想配列の形式で代入し、json形式に置換する。

以上でYoutubeAPIから動画の情報を取得できた。
【Marp】Web上で公開されているthemeを読み込む【VSCode】

# やること
`Marp for VS Code`環境で、公開されている`theme`を読み込む例として、`Marp`向けの`Dracula`テーマを読み込んでみます。

https://github.com/dracula/marp

# やり方
`Marp for VS Code`に設定する方法をメインに書きます。

## Marp for VS Codeにthemeを加える
まず、`Show Quick Pick Of Marp Commands...`（二重になっている&lrtri;マーク）から、`Open Extension Settings`を選びます。
![スクリーンショット 2022-04-11 2.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/fcf5a325-02f5-96dc-c9e4-a8eceb235431.png)

スクロールすると`Markdown › Marp: Themes`という項目があるので、追加ボタンを押します。
![スクリーンショット 2022-04-11 2.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/03a0b24d-5ac4-1d9e-2660-b2c3a8125105.png)

すると、入力欄が開くため、そこに値を入力し、OKを押します。
![スクリーンショット 2022-04-11 2.20.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/d3139505-6089-95a2-d166-8696f701cdb5.png)

ここには`URL`を入力できるため、例では[`dracula.css`の生ファイルの`URL`](https://raw.githubusercontent.com/dracula/marp/master/dracula/dracula.css)を設定しています。

もちろん、相対パスや絶対パスで指定することもできます。

### 確認方法
`theme`を設定した際に警告が出ていなければOKです。
![スクリーンショット 2022-04-11 2.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/ba43069a-43ad-8d12-9482-cd9a3a4fa2ae.png)

設定が上手くできていない場合、`The specified theme "..." is not recognized...`というような警告が出ます。
![スクリーンショット 2022-04-11 2.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/2a2eb31a-a23b-9bce-9750-a559ca7154d2.png)

## 公式で紹介されている方法
個人的には上記の方法が最も楽に感じたため説明を省きますが、公式でのインストール方法は以下の`URL`に公開されています。

https://draculatheme.com/marp

# 補足
`Marp`には公式で3つのテーマが用意されているので、まずはそちらを確認するのが良いと思います。  
ダークテーマも充実してい~~るため、設定が面倒ならこれを使うだけでもいいんじゃないかと思い~~ます。

https://github.com/marp-team/marp-core/tree/main/themes
AtCoder初心者、ARCに参加してみたけど一問も解けなくて萎えたので復習します

# はじめに

2022/4/9に開催された「大和証券プログラミングコンテスト2022 Spring(AtCoder Regular Contest 138)」に参加したのですが、A問題のTLEを解決できず終わったので、復習します。
問題リンク：https://atcoder.jp/contests/arc138/tasks/arc138_a

# 問題

長さ N の整数列 $A=(A_1, A_2, \cdot\cdot\cdot, A_N)$ があります．以降この問題では，$A$ の先頭 $K$ 項の和をスコアと呼ぶことにします． また，入力で与えられた $A$ のスコアを $s$ と置くことにします．

あなたは，以下の操作を好きな回数繰り返すことができます．

- $A$ のある隣接する2要素を選び，それらの値を入れ替える．

あなたの目標は，スコアを $s+1$ 以上にすることです． 目標が達成可能であるかどうか判定し，また可能であるなら必要な最小の操作回数を求めてください．

＜制約＞
- $2≤N≤4×10^5$
- $1≤K≤N−1$
- $1≤A_i≤10^9$
- 入力される値はすべて整数

# 解法

値の入れ替えの最小操作回数について、インデックス $i$ と $j$ の2つの数を入れ替える場合、以下のように操作して $j-i$ 回で入れ替えが可能。
- インデックス $i$ の数をインデックス $K-1$ まで後ろに持ってくる
- インデックス $j$ の数をインデックス $K$ まで前に持ってくる
- インデックス $K-1$ と $K$ を交換

交換の対象とする数は、 $A_i<A_j$ となりかつ $j-i$ が最小のもの。
これを探すのに、標準入力で受け取った配列の順序を変えずにそのまま総当たりで条件に合うものを探してリストに $j-i$ をappend、最後に出来上がったリストの中で最小の値を出力していた…。これは非常に効率が悪い。

元のindexとsortを使って効率よく答えを求める。
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/0c118393-62be-0191-b5aa-c47384a41237.png)
図で黄色になっているのが先頭 $K$ 項。
上が標準入力で得られたリストのイメージで、sortすると下のようになる。
ソート後に頭からインデックスを見ていき、先頭二つの先頭 $K$ 項に入っていない数は、絶対に $A_i<A_j$ が満たせないので関係ない。
先頭 $K$ 項の数に対して、それ以降の（sort済みなのでより大きい）先頭 $K$ 項に入っていない数とでindexの差 $j-i$ を計算して、それが最小のものを保存すればいい。
なお、図には各先頭 $K$ 項に入っていない数から先頭 $K$ 項の数まで矢印を付したが、実際は全てのインデックスとの差分を取る必要はなく、インデックスが最大（リストの後ろ側）の数のインデックスのみ保存しておけば十分。
注意しなければならないのは、sortの際にただ単純にsortすると、値が同じでインデックスが異なる場合に、インデックスが大きいものが後ろに来てしまう。
これだと後ろにあるにも関わらず $A_i<A_j$ が満たせなくなる。
また、これをif文で回避することも可能だが、そうするとインデックスの最大値として更新した値と同じ値を持つ先頭 $K$ 項に入っていない数が順序決めに加わらなくなり、考慮漏れが発生する。
従って、valueに対して昇順、indexに対して降順にsortすればよい。
以下のようなコードを書けばOK。

```python
n, k = map(int, input().split())
a = list(map(int, input().split()))
a_idx = [[a[i], i] for i in range(n)]
a_idx = sorted(a_idx, key=lambda x: (x[0], -x[1]))

max_k_idx = -1
ans = 10**6

for val, j in a_idx:
    if j < k:
        max_k_idx = max(max_k_idx, j)
    elif max_k_idx != -1:
        ans = min(ans, j - max_k_idx)

if ans == 10**6:
    print(-1)
else:
    print(ans)
```
WSL(Ubuntu)上でDockerをWindowsで動かす方法と注意点

WSL2のUbuntuをWIndows10に導入する時に躓いたので, 備忘録として対処法などを書き残しておきます.
DockerをWSL上で動かそうとしたらめちゃめちゃ苦戦したので.

# WSLの有効化

「windowsの機能の有効化または無効化」から, 「Linux用Windowsサブシステム」「仮想マシン プラットフォーム」にチェックを入れてOK.

# デフォルトWSL1が入ってしまう問題の回避

罠だと思います. 2022年4月現在のWSLでは, デフォルトでWSL1が動作するようになっているようです. Dockerを動かすためにはどうやら仮想化のナントカが影響しており, WSL2でないと動作しないようです.
まずはWSL2を使うためのカーネル更新パッケージを[こちら](https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package)からインストールします.

最後にコマンドプロンプトでwsl2を使うように設定をします.
```powershell
$ wsl --set-default-version 2
```


# Ubuntuのインストール

以下のコマンドで利用可能なLinuxの一覧を確認します.
```powershell
$ wsl --list --online
```

次に, 欲しいディストーションをインストールします.
```powershell
$ wsl --install -d <ディストリビューション名>
```

私はUbuntuを導入したかったので, `$ wsl --install -d Ubuntu`を実行しました.


# 確認

念の為, WSL2でUbuntuが使えるようになったか確認しましょう.

```powershell
$ wsl -l -v
```

ここで`VERSION`が2になっていたら成功です.
もし1になっていたら, 次のコマンドで2に変換できるようです. <ディストリビューション名>の部分は, 上のコマンドの出力に合わせます.
```powershell
$ wsl --set-version <ディストリビューション名> 2
```

# WSL2のUbuntuの起動
左下の検索窓でUbuntu等, 先程インストールしたディストリビューションを検索すると出てきます.
初回起動時は, Linuxで使うローカルアカウントの作成があります. 適当にユーザー名とパスワードを設定しましょう.
ちなみにWSLでは, Ubuntuの画面を閉じるだけでは再起動せず, かつ, `$ sudo reboot`等も使えないようです. 設定の反映等でUbuntuの再起動が必要な時はコマンドプロンプト等で`$ wsl -t <ディストリビューション名>`で終了する必要があります.

# Dockerの導入

こちらの手順に従って導入しました.

https://qiita.com/ohhara_shiojiri/items/486a54ad895d6bb3144e

dockerのdaemonの起動が必要なので, ディストリビューションのターミナル内で`$ sudo service docker start`を実行します.


# 参考
https://codezine.jp/article/detail/14646
http://docs.docker.jp/engine/articles/systemd.html
【メモ】PHPフレームワークLaravelの概要を学ぶ

web系のサーバーサイドエンジニアを目指す奴のメモ書きです。

# Laravelとは
PHP界隈で世界一使われているフレームワーク。比較的新しいのにすでに人気一位なので今から学ぶのであればLaravelが無難そう。
cakePHPもかなり人気ではあるけど追い越された立場なので今回は調べない。それぞれ特徴があるけどとにかく今は無難さ重視でLaravelのみ調査。

### Laravelの誕生（激薄小話）
Laravelを考えた人が.NETの開発者の一人らしい。.NetはC#のフレームワーク。唯一経験のあるC#に関連付けできるところがちょこちょこあったのでLarvelできるようになれば似たような感じで.Netでwebページ作ったりAPIを作ったりできるかも

# Laravelの特徴（メリット）

### 学習難易度が低い
すごく主観的だと思うけどLaravelは比較的わかりやすいという発言が多い。
また世界一のフレームワークだからネットにたくさん情報があるようです。

### MVCアーキテクチャ
LaravelはMVCモデルを採用しているフレームワーク。明確に各層を分けることで各層の作業をチームで分担できる。
Mはモデル層でDBとの通信ロジックを記載する層
Vはビュー層で表示内容を記述する層
Cはコントローラー層でリクエストを適切にモデル層、ビュー層に割り振るロジックを記述する
作成したWebページが見たいとリクエストを受けるときはルーティングを設定する必要がある。もう少しいうとどういうURLのリクエストが来たらコントローラー内のどの関数を実行するかということだと思う。
けどルーティングについてはもっと実装寄りの話のときに触れることにする。

### 自由度が高い
Laravelは世にある様々なフレームワークの中でもコードの融通が効く部類のよう。
そう言われてもあまりイメージは湧わかないがフレームワークによって自動生成できるコードを変更する際に割と許容範囲が広いらしく自由度が高いみたい

### Artisan(アーティザン)とかいうCLI
Laravelで使われているCLI。
コマンド一つでコードを自動生成したりDB構造を編集したりできる。
C#にもdotnetコマンドでいろいろできたけどそれときっと同じ。
Artisanコマンドでコントローラーやモデル、マイグレーションファイルのコードのベースを自動生成してくれる。あくまでベースなので作成してくれた奴にコードを追加していく。
マイグレーションファイルはDB構造を定義するファイル。また実装的な話になったときに具体的に見ていく。Artisanコマンドで作成したマイグレーションファイルに基づいてDBの構造の変更もできる。
色々自動生成できるのにビューはArtisanコマンドでは自動生成出来ない。
ビュー層のテンプレートとしてBladeテンプレートとかいう比較的軽量なテンプレートをLaravelでは使用されているらしいけどさっぱりイメージが湧かないので調査が必要。
もしかしたらこれがある故自動生成がないのかもしれない。
しかもちょっと調べてみたらBladeはHTMLとはまた別物らしいのでこれもまた別の機会に掘り下げることにする。
ArtisanコマンドはWindows 上で実行するならコマンドプロンプトで操作するみたい。
ただ分かっていないけどVS Codeを使ってもできるのではないかと思う。
もっとできることがありそうなのでまた別の機会に掘り下げる。

### バリデーションチェックができる
Laravelでも入力値の値の確認(バリデーションチェック)ができるみたい。やり方は完全に予想だけどC#ではアノテーションでバリデーションチェックができるようにしていたからきっとPHPもそんな感じだろう。
また実装関連の話のときにちゃんと調べる。

### Eloquent ORM（エロクアントORM)とかいうORマッパー
DBテーブルのカラムに対応するプロパティを持つクラスをモデルクラスとかエンティティクラスとかいう。
モデルクラスとかエンティティクラスとかとDBデータと対応させることがORマッピング。
SQLなしでCRUDができる点で楽というのが特徴で便利だし簡単。だけど理解してなくても使えてしまいそう。
仕組み的なところはなかなか納得できる答えを見つけられなかったしこれもまた実装関連の話のときに持ち越し。

# Laravelの特徴（デメリット）

### 自由度が高いが故・・・
自由度が高いのはよさでもあるけど人によってコードがバラつきがちだから統一感を出しづらい。
そうならないためにもベストプラクティスを意識して記述すると良いかも。

### 若干重い
Laravelは豊富な機能と引き換えに若干重いらしい。でも「Laravelは重いよね」って今の自分の技術的に測定するのは難しい。なのでとりあえずそうなんだって感じでOKとする。
とりあえず速度重視のプロジェクトではLaravelは避けたほうが良いらしいです。

### とはいえ・・・
Laravel自体のアップデートもあるし、様々なプラグインも作成され続けている。
プラグインは簡単に言うとより強化するためのパーツというイメージ。
だから今後に期待しよう的な感じで。本当に知らんけど・・

# 補足
Composerとかいうパッケージ管理ツールで管理できるから依存関係のあるライブラリとかをまとめてダウンロードできたりするので便利っぽい。
パッケージ管理ツールが無いと必要なライブラリを全部自分で集めなきゃいけないからどれだけ助かるか。
Composerは環境構築のときにさらっと使うことになりそうなので別で調べた！
https://qiita.com/4U5zo/items/b74cff8114fb7b4ca3ba#composer%E3%81%A8%E3%81%AF


# 個人的なLaravel関連の未解決課題
・BladeとかいうViewのテンプレートについて
・Artisanでできること深堀
・バリデーションチェックのやり方
・Eloquent ORMの仕組み(納得できればよし)



参考資料
https://www.acrovision.jp/career/?p=2776
https://webukatu.com/wordpress/blog/11938/
https://hnavi.co.jp/knowledge/blog/laravel/
https://vitalify.jp/app-lab/vietnam-offshore/20200609_laravel/
https://knowledge.cpi.ad.jp/howto-cpi/laravel-artisan/
https://www.ritolab.com/entry/120#:~:text=Eloquent%20ORM%EF%BC%88Eloquent%20Object%20Relational,%E3%81%AE%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
vscode sanmple

```
{
  // Atomエディタの色合い
  "workbench.colorTheme": "Atom One Dark",
  // ファイルのパンくず表示するかどうか
  "breadcrumbs.enabled": true,
  // ファイルタブサイズ
  "editor.tabSize": 2,
  // ファイルセーブ時にコード整形するかどうか
  "editor.formatOnSave": true,
  // ファイルアイコン
  "workbench.iconTheme": "vscode-icons",
  // テキスト折り返し
  "editor.wordWrap": "on",
  // ミニマップを表示するかどうか
  "editor.minimap.enabled": false,
  // 自動フォーマットを効かせるかどうか
  "editor.codeActionsOnSave": {
    "source.fixAll": true
  },
  "editor.suggestSelection": "first",
  "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
  "atomKeymap.promptV3Features": true,
  "editor.multiCursorModifier": "ctrlCmd",
  "files.exclude": {
    "**/.classpath": true,
    "**/.project": true,
    "**/.settings": true,
    "**/.factorypath": true
  },
  "redhat.telemetry.enabled": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "bracketPairColorizer.depreciation-notice": false
}

```
ROSの自作パッケージからPythonコードをimportする

# 概要

ROSで自作のパッケージ内に作成したPythonプログラムを、ほかのプログラムで継承して少し改変して使いたい場合や、頻繁につかう関数などをまとめた自作モジュールをimportしたいときの解決策です。

sys.path.appendなどの方法もありますが、まるでROSのデフォルトのパッケージからimportしているような書き心地にできる設定に成功したので共有します。

# 環境

OS : Ubuntu 18.04（WSL）
ROS dist : melodic

# 状況

「test_module」と「test_user」という2つの自作パッケージで考えます。

test_moduleがimportされるPythonコードを有するパッケージで、test_userがtest_moduleからPythonコードをimportして、ROSノードを立ち上げるプログラムを有します。

# test_module

test_module内のmodule.pyが今回importしたいプログラムとします。module.pyは以下のようなプログラムとします。

```python
#!/usr/bin/env python2
# coding: utf-8

class Module():
  def __init__(self):
    print("Module imported")

  def call(self):
    print("module used")

if __name__ == '__main__':
  app = Module()
  app.call()
```

以下、手順を説明します。

1. まずtest_module内にscriptsフォルダを作成します。
2. 次にtest_module/scripts内にtest_moduleというパッケージと同じ名前のフォルダを作成します。
3. test_module/scripts/test_module/ の中にmodule.pyと__init__.pyを作成します。
    ・ \_\_init\_\_.pyには何も記入しません。
4. 次に、パッケージのtest_module直下にsetup.pyを作成し、以下のように書きます。

```python
from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup

## DO NOT run this code manually !!!

setup_args = generate_distutils_setup(
  packages=['test_module'],
  package_dir={'': 'scripts'},
)

setup(**setup_args)
```

5. CMakeLists.txtのcatkin_python_setup()のコメントアウトを外します。

最終的なディレクトリ構成は以下のようになります。
>test_module/
>　├ setup.py
>　├ scripts/test_module
>　　　├ \_\_init\_\_.py
>　　　├ module.py

# test_user

続いてユーザ側のパッケージについてですが、こちらは特に設定をする必要がありません。

このパッケージ内でmodule.pyをimportするプログラム（user.py）を以下のように書きます。

```python
#!/usr/bin/env python2
# coding: utf-8

import rospy
from test_module.module import Module

if __name__ == '__main__':
  app = Module()
  app.call()
```

# 実行してみる

catkin buildをします。すると、~/catkin_ws/devel/lib/python2.7/dist_packages/以下にtest_moduleというフォルダが作られています。C++のコードを含むパッケージをビルドした場合も作成されますが、通常C++コードを含まずPythonコードのみで構成されたパッケージをビルドしてもここにはそのパッケージ名のフォルダは作成されません。

次にroscoreを立てて、通常通りuser.pyをrosrunします。

すると、importエラーが出ずに実行に成功します。

```bash
$ rosrun test_user user.py 
Module imported
module used
```

# メリット

user.py内で、`from test_module.module import Module` でimportできるのは、`from geometry_msgs.msg import Twist`と表記するのと同じようにかけるので、コードに一貫性が出てとても気持ち良いです。

sys.path.appendなどよりもPythonコード自体に書くべきものを減らせるので、ミスも少なくなると思います。

# 参考

[[ROS Q&A] How to import python modules from different ROS packages - The Construct](https://www.theconstructsim.com/ros-qa-import-python-modules-different-ros-packages/)

[[ROS] How To Import a Python Module From Another Package - The Robotics Back-End](https://roboticsbackend.com/ros-import-python-module-from-another-package/)
『Excelでリバーシを作ろう!!　マクロ、VBAを1から学ぶ』サンプル(6)　【三目並べ：5. コードにコメントを入れる】

この記事は **『Excelでリバーシを作ろう!!　マクロ、VBAを1から学ぶ』** のサンプルです。

前：【三目並べ：4. 手番を変える】
https://qiita.com/sano192/items/d1c08ff7a1221bcc6dcb

次：【三目並べ：6. 勝敗を判定する】
https://qiita.com/sano192/items/af4de0401046f18ce50e

Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です！
プログラミングが全くわからない人でも大丈夫！　丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます！
**値段：300円(Kindle Unlimited対象)**

**【kindle】**

https://www.amazon.co.jp/dp/B09XLM42MW

**【booth(pdf】**

https://sano192.booth.pm/items/3785312

コードが長くなり、なんだかごちゃごちゃしてきて見づらくなってきましたね。
そこで「コメント」の出番です。プログラミングではどの箇所がどの処理をしているのか、どういう目的で書かれたコードなのかを日本語で「コメント」として記載することができます。
　
まずコード記載画面の上部から「表示」→「ツールバー」→「編集」にチェックを入れます。
![27.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/a2e9b917-ce1d-1f0d-ca5f-10127308c5e6.png)
そうすると以下図のように「編集」ウインドウが表示されます。
コメントしたい内容を書き、その行を選んだ状態で「コメントマーク」をクリックすると緑色でコメントになります。
試しに一番上の行に「ゲーム開始」と書いて、その行にカーソルが合った状態で「コメントマーク」を押してみてください。以下図のように先頭に「'」が入り、緑色で表示されるはずです。
![28.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/29091404-6323-dbb4-ac8e-6bf85b091e67.png)
コメントはただのメモなのでコードの実行時には無視されます。
どれくらい細かくコメントを入れていくかは個人の自由です。本書でもいくつかコメントは入れていきますが、自分で分かりづらい、後でコードを見返した時混乱しそうと思ったところがあれば、独自にコメントを入れていってください。逆に面倒であれば一切コメントを入れなくても問題ありません。

【ここまでのコード】

```vb:
'ゲーム開始の処理
Sub GameStart()

    Range("B2", "D4").ClearContents
    Cells(2, 6) = "黒番"

End Sub

'セルをクリックしたときの処理
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'    変数の宣言
    Dim Gyou, Retu

'    クリックしたセルの行番号 , 列番号
    Gyou = Target.Row
    Retu = Target.Column

'    クリックしたセルが盤面の範囲内なら
    If 2 <= Gyou And Gyou <= 4 And 2 <= Retu And Retu <= 4 Then

'        セルが空白なら
        If Cells(Gyou, Retu) <> "" Then
'            処理を途中終了
            Exit Sub

        End If

'        黒番なら
        If Cells(2, 6) = "黒番" Then
            Cells(Gyou, Retu) = "●"
            Cells(2, 6) = "白番"

'        白番なら
        ElseIf Cells(2, 6) = "白番" Then
            Cells(Gyou, Retu) = "○"
            Cells(2, 6) = "黒番"

        End If

    End If

End Sub
```

前：【三目並べ：4. 手番を変える】
https://qiita.com/sano192/items/d1c08ff7a1221bcc6dcb

次：【三目並べ：6. 勝敗を判定する】
https://qiita.com/sano192/items/af4de0401046f18ce50e
【swift】delegateとはなんぞや

最近実務でlaravel以外にswiftをちょくちょく使うようになってdelegateの理解に苦しんでいます。
そのためdelegateとはなんぞやということをネットから情報を集めてただひたすらまとめました。

# delegateとは

デザインパターンの一つ
デザインパターンとはオブジェクト言語で使われる設計パターンのこと
過去のエンジニアが解決してきた方法がデザインパターンとしてまとめられている
https://techacademy.jp/magazine/9195

デザインパターンのオジジェクトの生成に関するパターン
・AbstractFactory 
・Singleton

delegateとは「人に任せる」という意味を持っており、「あるクラスから他のクラスに処理を任せる」というデザインパターンです。

# delegateを実装する上で関係すること
・処理を依頼する人
→デリゲートメソッドを使用して、処理の流れを記述する
・依頼される人(代理人）
→プロトコルで定義されたデリゲートメソッドを実装します。
・プロトコル
→任せる処理をメソッドとして定義すること（デリゲートメソッド）

# delegateの実装方法

プロトコル
```
protocol ButtonDelegate {
 func audio()
 func background()
}
```
処理を依頼するクラスの実装
```
class Button {
 weak var delegate:ButttonDelegate? =nil
 func click() {
  print("ボタンをおされました")
  if let dg = self.delegate {
   dg.audio()
   dg.background()
  } else {
   print('何もしません')
  }
 }
}
```
変数delegateには実行する問いにプロトコルを実装したクラスのインスタンスを設定します。


処理を任される側の実装
デリゲートメソッドを実装します。 
処理を任されるクラスに使用するプロトコルを宣言することで必要なメソッドを教えてあげる
```
class Button1:ButtonDelegate {
 func audio() {
  print('音1を鳴らします')
 }
 func background() {
  print('背景1を表示します')
 }
}
```

実行する方法
```
let button = Button()

let button1 = Button1()
button.delegate = button1
button.click()
```

# delegateのメリット

どのクラスなのか、どんな処理をするのか、ということを意識しなくていい点
ボタンを押した時に違う処理をしたい場合であれば、処理を任されるクラスだけを新しく作ればよい


# めっちゃ分かりやすかった記事

https://qiita.com/jumpyoshim/items/7667e0cc81ad91016f03

https://qiita.com/ika_tarou/items/8208153f30fdb4144c18
『Excelでリバーシを作ろう!!　マクロ、VBAを1から学ぶ』サンプル(2)　【三目並べ：1. 仕様を考える/画面をつくる】

この記事は **『Excelでリバーシを作ろう!!　マクロ、VBAを1から学ぶ』** のサンプルです。

Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です！
プログラミングが全くわからない人でも大丈夫！　丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます！
**値段：300円(Kindle Unlimited対象)**

**【kindle】**

https://www.amazon.co.jp/dp/B09XLM42MW

**【booth(pdf】**

https://sano192.booth.pm/items/3785312

前：準備
https://qiita.com/sano192/items/9a47e6d73373d01e31fb

次：【三目並べ：2. ゲームスタートの処理】
https://qiita.com/sano192/items/af1b85dc68307320be7c

三目並べは○×ゲームと同じルールで、3×3マスのなかに黒、白の石を置いて縦、横、斜めに3つ並べた方の勝ちです。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/7c1dada0-7302-f0a5-b47c-68b997fac469.png)
このゲームをExcel上でできるようにコードを書いていきましょう。
　
コードを書き始める前にまずどんな手順にすればよいか？　どんな画面にするか？　というプログラムの「仕様」を考えます。これを先に考えておかないと途中で上手くいかないことに気づいてコードを書き直したりする手間が発生します。
　
まずゲームのスタートから終わりまでの手順を考えます。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/3e1025da-0084-c133-7031-339bc83e2f68.png)
上記のような図を「フローチャート」と言います。
このフローチャートはものすごく簡単に描いたもので、標準的なフローチャートの書き方ではないです。
が、きちんと描くと複雑になりますし、どうせこのゲームはあなた一人が作って遊ぶものなのでそこまで厳密性は必要ありません。
　
次に画面を作ります。
以下のような条件を満たす画面を作りたいです。
・「スタートボタン」を押すことでゲームがスタートする
・3×3マスの中をクリックすることで石が置ける
・今黒番か、白番か表示されている
・ゲーム終了時に「勝ち」「負け」「引き分け」が表示される。
　
まず「3×3マス」の部分と、「黒番か、白番か表示される場所」、「勝敗が表示される場所」を作りましょう。
　
下のような画面を作ります。
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/6f2b5b62-2d92-6009-c360-fe8db4ac43de.png)
セル(B2)~セル(D4)を石を置く場所、セル(F2)~セル(H2)を結合して手番の表示場所かつ勝敗が表示される場所にしています。
それぞれのセル番地は必ず上記の位置にしてください。ここがずれていると今後書いていくプログラムがうまく動作しません
フォントサイズ、行の高さ、列の幅はなんでもいいですが、参考までに上記の図では以下のように設定しています。
行の高さ=52
列の幅=8
フォントサイズ=36
　
では次に「スタートボタン」を作りましょう。
　
「開発」のタブから「挿入」→左上のボタンマークをクリックします。
![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/dfaa2df6-b845-69ee-f374-0ea9c5236562.png)
適当なところでドラッグして離すと、ボタンを好きな大きさで配置することが出来ます。
図のように「マクロの登録」という画面が出てくると思いますがまだマクロを作っていないのでそのまま「OK」をクリックしましょう。
![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/3fcd552f-5e66-a238-e50d-1b4d23da8423.png)
こんな感じでボタンが配置されたと思います。
![17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/1a85e2d0-f51a-6f93-0782-5560ef1d1be2.png)
ボタンを右クリックし、「テキストの編集」からボタンの名前、文字の大きさ、フォントを変えられます。
名前はなんでもいいですが、とりあえず「Start」にしておきましょう。
「Ctrl」を押しながらボタンをクリックすると選択状態になり、ボタンの大きさを変えられます。
![18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/67f4374b-6471-b6d0-729e-dc95f5067eb8.png)
これで画面の構成は完了です。

前：準備
https://qiita.com/sano192/items/9a47e6d73373d01e31fb

次：【三目並べ：2. ゲームスタートの処理】
https://qiita.com/sano192/items/af1b85dc68307320be7c
[ABC247 E] Max Min　ざっくり解説

# はじめに

公式ともちょっと違う上、シンプルそうなので書く。例によって数学的な証明とか言われてもわからない。

## コード

https://atcoder.jp/contests/abc247/submissions/30887519


## 当時の考察

N<10**5なので、O(N)かO(NlogN)の解法になりそう。

該当の範囲は下記4つの条件を満たしているはず。

1. Xを含む範囲
1. Yを含む範囲
1. Xより大きい数を含まない範囲
1. Yより小さい数を含まない範囲

ちょっと条件が多くてややこしい。Xより大きい数またはYより小さい数を跨ぐような範囲はあり得ないので、そういう数字は数列の区切り文字みたいな感覚で飛ばし、分割された各々の数列に対しての範囲を考えていく。こうすれば1,2のみの条件を考えればよい。

さて、対象の数列を走査して、条件を満たす範囲の数を考えてみる。

条件から、該当範囲にはXとYが含まれている。としたとき、左から4番目にXがでたあと、8番目にYの両方がでてきたとき、

```
???X???Y
 ??X???Y
  ?X???Y
   X???Y
```

という感じになる。ということは、この時点で4つのパターンが満たしていることが言える。すなわち、左端からXが出てくる番号までの個数分パターンが増える、ということになる。

さて、次に来る数字について、場合分けして考えてみよう。

### Xではない場合

```
???X???Y?
 ??X???Y?
  ?X???Y?
   X???Y?
```

この場合でも引き続き4番目にあるXまでは左の数字を削れるので、4つのパターンを数え上げればよい。

### Xの場合

```
???X???YX
 ??X???YX
  ?X???YX
   X???YX
    ???YX
     ??YX
      ?YX
       YX
```
先ほどと比べてYのある8番目まで削れるので、8つのパターンを数え上げればいい。

従い、走査している添え字までの間で最も右に来るXとYの位置を保存しておいて、どちらか小さいほうのパターン数を数え上げることができる。
あとは、冒頭に書いたX以上or以下の数字が来た時だけリセットすればよい。

計算量は線形走査するだけなのでO(N)になる。
基本情報技術者試験対策　28日目

基本情報技術者試験勉強　28日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

今日の目標
-
午前問題を60問取り組んで、間違えを10問以内に抑える

間違った箇所
-
1、COCOMO
開発規模がわかっていることを前提として、工数と工期を見積もる

2、XBRL
文書情報やデータの構造を記述するためのマークアップ言語であるXMLを，財務情報の交換に応用したデータ記述言語

3、ボリュームライセンス
特定のユーザ又は一定数のユーザに使用を認める

4、サイトライセンス
特定の企業や団体などにある複数のコンピュータでの使用を一括して認める

5、サーバライセンス
特定のサーバにインストールし、そのクライアントでの使用を認める

6、LDAP(Lightweight Directory Access Protocol)
ディレクトリサービスにアクセスするためのプロトコル

7、EVM(Earned Value Management)やトレンドチャート
開発の所要日数と費用がトレードオフの関係にある場合に，総費用の最適化を図る

8、磁気ディスク装置の記憶容量
トラック当たりの記憶容量×1シリンダ当たりのトラック数×シリンダ数

9、フレームリレー交換機
フレームという単位で区切られたデータを交換する交換機
ネットワーク内の処理を高速化

10、パケット交換器
データをブロック化した単位に区切って転送する蓄積型の交換機

振り返り
-
60問取り組んだが、15問間違えた。特に、基礎理論とシステム戦略の箇所の正答率が低かった。
次回は、基礎理論、アルゴリズムとプログラミング、コンピュータ構成要素をメインに取り組む。

>引用
基本情報技術者試験ドットコム
https://www.fe-siken.com
Python v2.7でバイナリデータ解析

# バイナリデータを解析したい
アプリケーションの管理データはバイナリファイルになっていることが多々あります。
そんなデータの中身をテキスト表示して確認したいと思ったのが始まりです。

# 実行環境
アプリケーションの実行環境がLinuxでPython2.7がインストールされていて、バージョンアップが難しいので、今回はPython 2.7を実行環境とします。

~~~bash:
$ python --version
Python 2.7.5
~~~

# バイナリデータ解析のクラス作成
まずはサンプルコード。

~~~python: test.py
 class MyData:
     column1 = ""  # カラム１
     column2 = ""  # カラム２
     column3 = ""  # カラム３

     def __init__(self, data):
         with io.BytesIO(data) as buffer:
             self.column1 = struct.unpack('<H', buffer.read(2))[0]
             self.column2 = struct.unpack('<L', buffer.read(4))[0]
             self.column3 = struct.unpack('<Q', buffer.read(8))[0]
~~~

unpackの型指定の意味は下記。他の指定方法はdocsにあります。
~~~
　"<" : リトルエンディアン
  "H" : unsigned short /2byte
  "L" : unsigned long  /4byte
  "Q" : unsigned long long  /8byte
　tuple型となり、[0]で1つ目の要素を参照
~~~

インスタンスにデータを取り込んで、メンバ変数を参照することで表示できます。
~~~python: test.py
my_data = MYData(data)
print("column1: " + str(my_data.column1))
print("column2: " + str(my_data.column2))
print("column3: " + str(my_data.column3))
~~~

# 参照
7.3. struct — Interpret strings as packed binary data
https://docs.python.org/2.7/library/struct.html#format-strings
【データサイエンス100本ノック】a5m2ツールを使ってSQLに慣れる【準備編】

# はじめに
データベースを扱ううえで「A5M2ツール」というのが個人的におすすめ。
いきなりデータベースを作ってという風にもいかないので「データサイエンス100本ノック」という素晴らしい教材があるのでそれをもとに学んでいくきっかけになるような記事を書いてみます。

# データサイエンス100本ノックとは？
SQL基礎を学習することが可能な教材です。加えてDockerなどの技術にも触れることができとてもおすすめ。
https://digitalpr.jp/r/39499
https://github.com/The-Japan-DataScientist-Society

# 環境構築
いろいろな人の解説記事や動画がたくさんあるので安心。
私は下記の動画でさくっと。
https://www.youtube.com/watch?v=mh8Z5d0-0PU

# A5M2ツールの準備
下記ページを参考にツールをダウンロードする。
https://qiita.com/chenglin/items/fa02ed512efacd1f4609

# A5M2ツールの設定
Dockerを起動し、データベースの作成ができたらA5M2ツールで接続します。
pgconfigというのが大事。
![db_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/7eb9bc7f-4a90-64ad-08f3-b1e4a03b23e9.png)


A5M2ツールの「データベースの追加と削除」から下記の設定を行います。
- サーバ名：localhost
- データベース名：dsdojo_db
- ユーザーID：padawan
- パスワード：padawan12345
![a5m2_db_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/06eb6832-9352-bb82-e309-6e107921002f.png)

# 接続して実行
問1を実行すると下記のようになります。
```
S-001: レシート明細テーブル（receipt）から全項目を10件抽出し、どのようなデータを保有しているか目視で確認せよ。
```

![connect_and_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628462/7c2a8618-b17c-0af1-4b7e-73cfae706865.png)

# おわりに
A5M2ツールはとても便利なのでいろいろ使いこなせるようになると楽しいです。
PythonでPDFファイルを結合・分割・並び替えアプリ作成

# はじめに
Pythonプログラムで即業務に役立つサンプルプログラムとして、PDFファイルを分割、結合、並び替えできるアプリを作成してみましたので、備忘録も兼ねて掲載します。
プログラムは、PDFファイルをドラッグ&ドロップしたり、並び替えが出来るなど、GUI画面で操作しやすくしてみました。

# 動作環境
Visual Studio Code
Python3.8.8
# 各種インストールライブラリー
PyPDF2 1.26.0
tkinterdnd2 0.3.0
# 画面イメージ:
PDFファイルをドラッグ&ドロップしたり並び替えたり、結合、分割するためのアプリ本体の画面イメージは以下のようになっています。
LISTBOXやボタンを使って、出来るだけ操作しやすいようにしています。
![完成イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1361368/a8fa53c0-cd5d-ff0c-8edf-a644189afef1.png)

# YouTubeでの解説：
プログラムの作り方や操作の概要をYoutubeで詳しく解説していますので、ぜひご覧ください！
<iframe width="560" height="400" src="https://www.youtube.com/embed/2-fSrPWxSIQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# サンプルソース（途中版）：
プログラムソースは、上記YouTubeの動画
https://youtu.be/2-fSrPWxSIQ
の概要欄に、限定公開用のURLを掲載させて頂いています。
恐れ入りますが、YouTube動画経由でアクセスしてご覧ください。

```Python:pdf_cut_add.py
from tkinterdnd2 import *
from tkinter import *
import tkinter as tk
from tkinter import filedialog
import PyPDF2
from PyPDF2 import PdfFileReader
import os

def add_listbox(event):
    if event.data.endswith(".pdf"):
        listbox.insert("end", event.data)

def pdf_add():  # pdfファイルを結合
    # アウトプットPDFファイル名を指定するポップアップ表示
    filename = filedialog.asksaveasfilename(
        title = "結合するPDFファイル名を指定してください",
        filetypes = [("pdf", ".pdf") ], # ファイルフィルタ
        initialdir = "./", # 自分自身のディレクトリ
        defaultextension = "pdf")
    if filename == '':
        return
    merger = PyPDF2.PdfFileMerger(strict=False)
    for i in range(listbox.size()):
        merger.append(listbox.get(i))
    merger.write(filename)
    merger.close()

def pdf_cut():  # pdfファイルを分割
    cut_dir = filedialog.askdirectory(title = "分割したファイルを保存するフォルダを選択してください",
        initialdir = './') 
    if cut_dir == '':
        return
    for i in range(listbox.size()):
        reader = PdfFileReader(listbox.get(i)) 
        for j in range(reader.getNumPages()):
            merger = PyPDF2.PdfFileMerger(strict=False)
            merger.append(listbox.get(i), pages=(j,j+1))
            cut_file = cut_dir + '/' + os.path.splitext(os.path.basename(listbox.get(i)))[0]
            merger.write(cut_file + '_' + str(j) + '.pdf')
            merger.close()

def del_listbox():  # 選択したファイルをLISTBOXからクリア
    indices = listbox.curselection()
    if len(indices) == 1:
        listbox.delete(indices)

def all_del_list(): # LISTBOXをクリア
    listbox.delete(0,listbox.size())

'''
続きはYouTube動画の概要欄の限定共有URLに掲載していますので、そちらをご覧ください
'''

```


# 最後に：
今後も、業務に役立ちそうなプログラムを作成して掲載していきたいと思います。
Julia: 『アイの歌声を聴かせて』が21世紀だとしたら何年なのか、プログラミングで挙げてみる

https://qiita.com/ftnext/items/b0b3485ee2ed9ee1de70

Julia でやってみた。2021 年以降なのかどうかわからなかったので 2001 年〜 2100 年まで探索。

```Julia
using Dates
dr = Date(2001):Day(1):Date(2100, 12, 31);
result = filter(dr) do x
   dayofweek(x) == Mon && month(x) == 6 && day(x) == 9
end
```

15-element Vector{Date}:
 2003-06-09
 2008-06-09
 2014-06-09
 2025-06-09
 2031-06-09
 2036-06-09
 2042-06-09
 2053-06-09
 2059-06-09
 2064-06-09
 2070-06-09
 2081-06-09
 2087-06-09
 2092-06-09
 2098-06-09

それぞれの日にちにおける月齢については，計算できたら付記するかもしれない。

追記：

以下に基づき計算。数日の誤差はあるそうだ。

https://ja.wikipedia.org/wiki/%E6%9C%88%E9%BD%A2

```Julia
moonage(y, m, d) = (11((y - 11) % 19) +
   [0, 2, 0, 2, 2, 4, 5, 6, 7, 8, 9, 10][m] + d) % 30

for t in result
   y, m, d = year(t), month(t), day(t)
   println("$t 月齢 $(moonage(y, m, d))")
end
```
2003-06-09 月齢 9
2008-06-09 月齢 5
2014-06-09 月齢 11
2025-06-09 月齢 13
2031-06-09 月齢 19
2036-06-09 月齢 14
2042-06-09 月齢 20
2053-06-09 月齢 22
2059-06-09 月齢 28
2064-06-09 月齢 24
2070-06-09 月齢 0
2081-06-09 月齢 1
2087-06-09 月齢 8
2092-06-09 月齢 3
2098-06-09 月齢 9

正確な月齢の計算は下記へ

https://keisan.casio.jp/exec/system/1184729668
化石エンジニアの野良リカレント教育・Kaggle～あのエラーとの戦い～

# 前提
数学力・統計力・技術力がほぼすべて「ゼロより低い、マイナス」の化石エンジニア・アンモナイトがエンジニアとしての生き残りを目指して~~賞金が欲しくて~~ 、Kaggleに挑戦する。
たぶん、Kaggleに挑戦する記事の中で、もっともレベルが低いと思う。
そもそも、なんでKaggleに挑戦するのかとゆーと、下記のよーなリカレント教育（大人の再教育）プランを考えているからです。

アンモナイトが考えた化石エンジニアの進化論：

ふりだし：「アンモナイト＝太古の海中でたゆたってる化石エンジニア・Lv3」
　→アジャイル開始：Done!
　　→社外コミュニティ参加：Done!
　　　→スクラム経験：Done!
　　　　→CSM取得：Done!
　　　　　→常識（他社研修視聴）：Done!
　　　　　　→知識の深堀り＝Kaggle：in progress
　　　　　　　→知識の深堀り＝アプリ作成：To do
　　　　　　　　→あがり：陸上（肺呼吸）：人権を得る

# 1：現在の状況
前回の記事から、『タイタニック号』のコードの詳細を本格的に検討し、理解を試みる。
ナビゲーターとなってくださる御本は下記。いつもありがとうございます。

『PythonではじめるKaggleスタートブック』
https://www.amazon.co.jp/dp/4065190061
![PythonではじめるKaggleスタートブック_書影.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1668633/528648b1-bec3-55ce-b6ab-4792183c9090.jpeg)
（書影は版元ドットコム様）

で、検討＆理解中の現在、どうなっているかというと……SyntaxErrorが出まくりである。

# 2：SyntaxError

開発の最前線離れてから●年だが、SyntaxErrorという表示はいつ見ても、精神に刺さる。夢に出そう。
いやわかってんのよ、アンモナイトが悪いってわかってんのよ。
きっと知見のある方が見たら、「アホか！」みたいなことをやらかしてるんだろうなって、わかってるんよ。
アンモナイトだって経験ある言語なら、「あー……（ここで引っかかってるのか、残念だな……あとちょっとだよ、あきらめるなって言いたい）」ってなる。

でもさ、新しい言語（今回はPython）で最初にぶつかる壁は「Hello,World」と「SyntaxError」ってお決まりじゃない？
前者は比較的突破しやすいけど、後者はさ、もう……「見本通りに打ち込んでるのに、なんでSyntaxErrorなの？」となったら最後、徹夜でデバッグじゃない？（仕事であれば）（納期があれば）
原因がわかれば本当に「あ、","が余計だわ」とか「"("が多かった」とか「大文字小文字が混ざってた」とか、ぜんっぜん大したことじゃない。
ドラ●エでいったら、スライムレベルだよ。
……しかしLv3・with ヒノキの棒だと、スライムにもやられるのよ……。
で、やられてるんよ……。

# 3：デバッグ

とりあえず、レガシーエンジニアとしていにしえの記憶をたどり、試せることは全部試した。（1時間経過）
　1：全角・半角チェック
　2：大文字・小文字チェック（Pythonだから特に）
　3：見本コードと自分のコードを指さし確認＆音読（目検だけだと間違いに気づかないことがあるので、ブツブツ読み上げる）
　4：エラメで赤く光る部分をコメントアウト、その他が動くかどうか確認（エラースコープの確認。最低限で動いた場合は徐々にコードを足していく）
　5：……あとなんかある？（涙目）

4を試した時、ちょっと動いたんで、「おおお！（歓喜）」となったが、次の瞬間、「NameError: name 'data' is not defined」が現れた！
違うモンスター出たよ。ドラ●キー的な。もちろん、Lv3は負ける。
今回は写経したコードだから、「え、宣言されてねーの？　あれ？」となる。宣言してもいいけど、型がわからねえ……。
いや、たぶんコードの後ろを読んで変数に入る内容がわかれば、型もわかるんだろうけど、VB系の「オブジェクト」みたいな内容だったら、どう宣言したらいいのかわからん……。
そうこうしているうちに、2時間が経過。仕事だったら確実に定時過ぎてる進捗率。仕事じゃねーのが唯一の救い。

# 4：結論
アンモナイトはもっとPythonの勉強をしたほうがいい。
というか、この壁を突破しないと、機械学習が先に進まないので、SyntaxErrorとnot definedとの戦いは来週も続く。
「覚えてろよぉ！」という、前回同様、100％負け犬のセリフを吐いて、今週は終了です。

本日は以上で終わりです。お付き合いいただき、ありがとうございました！
【AWS】ALBに同じAZから複数のサブネットをアタッチできないのか？

## 結論
「アタッチ」はできないが、「ルーティング先に指定」はできる。
## 背景
以下の構成でWebアプリケーションを運用していた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566051/56a4fe64-a2f7-1099-fa91-cb24b88a5d60.png)


サービスが軌道に乗り、アクセス数も増えてきたため、EC2をスケールアウトすることにした。

しばらくすると、サブネットに配置できるEC2が限界を迎えてしまったため、
サブネットを追加することにした。[^1]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566051/0d17871d-f1ee-67b3-9db6-9e853aaa5ee3.png)

## サブネットを追加する

ymlテンプレートを更新し、CloudFormationにアップロードすると…

>A load balancer cannot be attached to multiple subnets in the same Availability Zone: 'ap-northeast-1a' (Service: AmazonElasticLoadBalancing; Status Code: 400; Error Code: InvalidConfigurationRequest; Request ID: 7fbf2ff1-dbf4-4e8c-8403-0a9f2021426d; Proxy: null)

**ALBに同じAZから複数のサブネットをアタッチできない**とエラーが出て失敗する。

ブラウザから操作を試みても同様である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566051/431a93bc-a257-88d7-6747-7faa0f650cb7.png)


> アベイラビリティーゾーンごとに **1 つだけ**サブネットを指定できます。

## 新しいサブネットはALB側ではなくオートスケーリンググループ側の設定で追加する
ALB側のサブネット設定画面ではなく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566051/9251ad53-1ccf-a71e-fa74-daf174a6059d.png)


オートスケーリンググループ側のサブネット設定画面で、同じAZから複数のサブネットを追加できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566051/39b6029a-ea2f-be34-9b03-fa91c29a57b8.png)


## ELBのロードバランス先を決めているのはターゲットグループ

仕組みを述べると以下のような整理となる。
* オートスケーリングによって作成されたEC2は、オートスケーリンググループ側に設定されたいずれかのサブネットに配置される（ここは、同じAZから複数のサブネットを設定できる）。
* オートスケーリングによって作成されたEC2は、オートスケーリンググループ側に設定されたターゲットグループに所属させられる。
* ALBとターゲットグループは、リスナーによって対応付けが定義される。
* ALBへのリクエストは、対応付けられたターゲットグループに所属するいずれかのEC2に負荷分散される。

ALBの負荷分散先はターゲットグループに所属するEC2であり、ロードバランス先のサブネットを追加したいのであれば、ターゲットグループに、追加したいサブネットに所属するEC2を追加してやれば良い。

なお、ターゲットグループ側にサブネットを設定する箇所は無く、任意のサブネットのEC2を追加できる。サブネットを特定したい場合は、オートスケーリング側に設定する。オートスケーリングを利用しない場合は、ターゲットグループに直接、追加したいサブネットに配置している個々のEC2を追加してやれば良い。

なお、VPCはターゲットグループ側にも設定するため、VPC外のEC2をターゲットグループに追加することはできない。

## それではALBに設定するサブネットとは何か？

「ALBに設定するサブネット」と「ターゲットグループ内のインスタンスが所属するサブネット」が別概念であるということが分かった。前者は1つのAZから1つのサブネットしかアタッチできない。

前者については、ALBの実体というか、エンドポイントのようなもの（ENIか？）を各AZにつき1つずつ設定しなければならないと理解している。

[こちらのサイトの図](https://dev.classmethod.jp/articles/purge-resources-specific-az/#toc-1)がイメージしやすいと思う。

## まとめ
* ALB側に設定する「サブネット」は1AZにつき1つしか設定できないが、ALB側に設定していないサブネットにもリクエストを分散させることは可能である。
* リクエストを分散させたいEC2はターゲットグループに設定する。オートスケーリングを使用しているのであれば、オートスケーリンググループに複数のサブネットを設定し、ターゲットグループに紐づける。

[^1]: サブネットを増やすのではなく、既存のサブネットのIPアドレスのセグメントを拡張するほうが望ましいが、すでに他のサブシステム等が利用しているサブネットでIPアドレスを確保しているなどの制約があり採用できなかった。
MUIのコンポーネントでStorybookのDocエラー除去

MUIのコンポーネントのStorybookを作成していると
Canvasは表示されるのに、Docでエラー

```
TypeError
theme.typography.pxToRem is not a function
```
みたいのが出る

世の中には天才がいて(Storybookを知っていたら当たり前なのか？）

https://github.com/mui/material-ui/issues/24282#issuecomment-1065413808

で解決した。
でも、意味がよくわからない。
この域に達したぃ。
git で一番危険なコマンドは init ?

# 言いたいこと

```
⭕
$ git init hoge
$ cd hoge
```

```
❌
$ mkdir hoge
$ cd hoge
$ git init 
```

# どんな方に見て欲しいか

- 初心者に git を教えている方。
- `git status` を実行したときに何十行も赤い文字が出た方。
![スクリーンショット 2022-04-06 11.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488916/7ec7900c-3e0e-8d28-5e97-23356513a06a.png)
- `ls -a ~ | grep .git` を実行したときに `.git` が出力された方。
```
$ ls -a ~ | grep .git
.git  <- これ
.gitconfig
.gitignore-boilerplates
```
- （ターミナル操作と git の初心者の方。）

# 背景

後輩に「この git 教材を最初から最後までやってみて💪」と伝えたら、多くの後輩がホームディレクトリで `git init` を実行していたということが後々発覚しました。これは危険な状態です。また、それを引き起こし得る `git` の慣習にも多少の原因があるのではないかと思い記事化することにしました。

# `.git` の位置の重要性

（誤解を恐れずに言うと、）git は commit されていない変更やファイルをいらないモノだと思っています。（具体的には `git status` で赤い文字で表示される Untracked files などのこと。）なので、git はお掃除や巻き戻しのために Untracked files を全削除するコマンドがいくつか用意されています。

https://twitter.com/llminatoll/status/1211191138280886273?s=20&t=4FyZgrMchmhzdR7FRuxZnQ

ホームディレクトリには卒論や思い出の写真などがあるかもしれません。しかし、git はいつでもそれらを不可逆に削除することができてしまいます。

正直、危険性があまり伝わってないかもしれないので、以下のような例を載せておきます。
1. 間違えてホームディレクトリで `git init` してしまった。
1. 適切なディレクトリ（以後 `hoge` ）に移動して `git init` し直した。
1. `hoge` で作業をする。（この状況が数ヶ月くらい続く。）
1. `hoge` にいると思って、間違えてホームディレクトリで git の履歴を巻き戻すコマンドを実行する。
1. PC の全データが不可逆に削除される。

# 修正手順

ネットで検索すると `r m -rf .git`（コピペ防止）すれば直るというコメントをよく見ますが、
- やり直せない。
- 残るのは作業ディレクトリのみなので、事前に別ブランチのファイルを復旧する必要があるかもしれない。
- ターミナルの実行履歴に残したくない。

などの理由から私は以下の手順が良いと思っています。

1. この記事を含め、ネットの情報の正確性を判断できる人を呼び出す。
1. `git branch` でブランチが複数あるかを確認する。
1. ブランチが複数ある場合:
    1. 作業ディレクトリに含まれていない差分が他のブランチに存在しないかを `log, diff` などで確認する。
    1. 無ければ次へ進む。存在していて、もし必要なものだったら `merge` や `checkout` などで作業ディレクトリに取り込む。
1. `.git` を `.git-username` など分かりやすい名前に変更する。（後でゴミ箱を漁るかもしれないため。）
1. `.git-username` をゴミ箱に入れる。（`rm`は使わない。）

# より良い `git init` の使い方

カレントディレクトリという概念を理解していないことが全ての原因であることが多いです。よく見られる以下の手順は、
```
$ mkdir hoge
$ cd hoge  # <- 超重要
$ git init 
```
**カレントディレクトリの移動**というとても重要なことをした上でリポジトリを作成します。ただ、ここで偶然見逃したりタイポしたりしてそのまま続けてしまうと、誤って上位ディレクトリをリポジトリ化させてしまうのです。

ここで私が提案したいのはこれです。
```
$ git init hoge
$ cd hoge
```
`git init` は引数を持つことができます。（正直、git を使い始めてから3年間このことを知りませんでした。）この引数に指定するディレクトリはまだ存在してなくてもいいし `hoge/fuga` のようにネストされたディレクトリでも OK です。これなら、必要な場所だけを安全にリポジトリ化できます。

何なら VSCode などのソフトを使って、ボタンをクリックしてリポジトリを作成するのもアリだと思います。

# 余談

## git をやる前に

PC のデータは階層構造に配置されていて、Finder やエクスプローラなどのソフトと同じくターミナル操作する際も「今開いているフォルダ」に相当する**カレントディレクトリ**という位置がある。といったような一定の座学を実際に手を動かす前にした方が良いと思います。これは10分で修了する人もいれば理解するまでに数日かかる人もいるかもしれません。

## git は良いやつ

git はリポジトリ内しか管理できないので、適切なディレクトリをリポジトリ化することさえできれば、git がリポジトリの外にある無関係なファイルに影響を与えることはありません。なので、最初の壁さえ乗り越えられれば安心して git life を楽しめます。

プログラミングで一番大変なことは**プログラミングを始めること**ですが、それ以降は「こんなモノ作ってみたい→できた」という楽しい世界があります。始める人は頑張って最初の壁を乗り越えてほしいし周りの経験者は壁の上から引っ張り上げてほしいな〜と思います。〜完〜
Ruby から classify text API を叩く

# ゴール
以下を Ruby から叩く。

https://cloud.google.com/natural-language/docs/classifying-text?hl=ja:embed:cite

# 事前準備
上記 API は Natural Language API の一つなので、https://qiita.com/tommy-012/items/e0ad2a7c985fad5e59dd の準備ができてれば OK

# API 仕様
https://cloud.google.com/natural-language/docs/reference/rest/v1/documents/classifyText?hl=ja:title

↑には明記されていないが、Gme を使った際に分かったこととして、対象の英語文に最低限 20 個の単語が含まれている必要がある

カテゴリ一覧は、https://cloud.google.com/natural-language/docs/categories  
現状は、最上位カテゴリは 27 個（結構多い）  
また、より詳しいカテゴリがわかる場合は、それより上位のカテゴリは省略される

```
"/Adult"
"/Arts & Entertainment"
"/Autos & Vehicles"
"/Beauty & Fitness"
"/Books & Literature"
"/Business & Industrial"
"/Computers & Electronics"
"/Finance"
"/Food & Drink"
"/Games"
"/Health"
"/Hobbies & Leisure"
"/Home & Garden"
"/Internet & Telecom"
"/Jobs & Education"
"/Law & Government"
"/News"
"/Online Communities"
"/People & Society"
"/Pets & Animals"
"/Real Estate"
"/Reference"
"/Science"
"/Sensitive Subjects"
"/Shopping"
"/Sports"
"/Travel"
```

# Gem から API を叩く
https://github.com/googleapis/google-api-ruby-client

```ruby
require 'google/apis/language_v1'

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/CloudNaturalLanguageService.html#classify_document_text-instance_method
service = Google::Apis::LanguageV1::CloudNaturalLanguageService.new
service.key = 'APIキー'

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/ClassifyTextRequest.html
request = Google::Apis::LanguageV1::ClassifyTextRequest.new({
  document: {
    type: 'PLAIN_TEXT',
    language: 'en',
    content: 'Nintendo&#39;s home video game console &quot;Nintendo Switch&quot; will be released simultaneously in Japan, North America, Europe, Australia, Hong Kong, etc.',
  }
})

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/ClassifyTextResponse.html
response = service.classify_document_text(request)

# Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/ClassificationCategory.html
response.categories
=> [#<Google::Apis::LanguageV1::ClassificationCategory:0x00007fbdf9214ee0 @confidence=0.77, @name="/Games/Computer & Video Games">, #<Google::Apis::LanguageV1::ClassificationCategory:0x00007fbdf4b038d0 @confidence=0.66, @name="/Computers & Electronics/Consumer Electronics">]

response.categories.first.name
=> "/Games/Computer & Video Games"

response.categories.second.name
=> "/Computers & Electronics/Consumer Electronics"
```