OmniAICreator/Qiita-1.07M huggingface dataset:
リンク等まとめ｜Google Driveをコマンドラインで扱う

### 背景

Google Driveのファイルを、コマンドラインで扱うことに関して、すばらしい記事がたくさんあったので、まとめました。

- 共通事項（認証）
- `skicka`のリンク
- `gdrive`のリンク

のカテゴリにしてます。


![スクリーンショット 2020-12-16 11.29.49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/af0975ec-c43d-c2e3-0be3-7155f6bfaef8.jpeg)


#### どうしてコマンドライン？

- Google Driveのダウンロードは時間がかかる。

とくに複数ファイルのダウンロードや、フォルダごとダウンロードしたいときに。おそらく、ウィルスチェックして、圧縮して……をやっているからだとおもう（それにしてももうちょっと反応速くならないかな、と正直おもう）。

`skicka`の場合（環境にもよるとおもうけれど）だいたい1.0GBあたり5分程度（最初から最後まで）。

- 作業ログを残せる

どういうコマンドで（どのフォルダを対象にして）、どういう結果だったか（どれくらい時間がかかったかなど）、残しておける。

- 同期的な動きをしてくれる

ローカルにすでに同じファイル（名）があればスキップしてくれる。疑似差分につかえる。


#### コマンドラインのデメリット

下記のファイルはダウンロードできない（`skica`の場合）

- ファイル名が重複しているもの
- ファイル名に`/`が’入っているもの（他にもダメなキャラクタがあるかも）
- Google App形式のファイル


### 選択肢

`gdrive`と`skicka`がある。
[prasmussen/gdrive](https://github.com/prasmussen/gdrive)　←　GitHub
[google/skicka](https://github.com/google/skicka)　←　GitHub


- `gdrive`はメンテナンス終了

使えるのかもしれないが、アプリの認証を（わたしは）通すことができなかった。

- `skicka`はメンテ終了にはなっていない

いちおうGoogle製（公式ではない）



### 共通の記事（認証について）

[一番分かりやすい OAuth の説明](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)
at 2020-03-20、技術者ではない方々向けの OAuth（オーオース）の説明のまとめ。すごくわかりやすくて感激！

[【Google API入門（1）】Google OAuthでAccess Tokenを取得してみる](https://poppingcarp.com/google-api_get_access_token/)
at 2017-07-23、OAuthの概説から、具体的手順まで。画面は少し古いけど、基本的には同じなのでとてもイメージが湧いた！

[「Google Drive REST API v3」に「アクセストークン」を付与してファイルを検索／ダウンロードする](https://qiita.com/CUTBOSS/items/2ccb543f68f1a6c1aa7d)
at 2018-05-11、アクセストークンについて詳しい。けっきょくつかわなかったが……`gdrive`でうまくつかえるのかな？


### skickaに関する記事

[google/skicka](https://github.com/google/skicka)
GitHub本家

[【メモ】Skickaを使ってGoogleDriveに簡単アップロード](https://qiita.com/kotarouetake/items/e10585826b5ac15cd03a)
at 2020-12-15、`Go`/`Skicka`のインストール、認証、コマンド例までひと通り（Ubuntu）

[GDriveをCLIで使う　- skicka -](https://qiita.com/sesame_apps/items/054fbc49d5a7da9679b7)
at 2020-10-25、`Go`/`Skicka`のインストール、認証、コマンド例までひと通り

[Google Drive用コマンド skicka でWindows/Macのファイルをバックアップ] (https://dev.classmethod.jp/articles/skicka-google-drive-cli/)
at 2019-02-19、`Go`/`Skicka`のインストール、認証、コマンド例までひと通り（Windows）

[skickaの『「Google でログイン」機能が一時的に無効』を一時的に解決する] (https://qiita.com/satackey/items/34c7fc5bf77bd2f5c633)
at 2020-05-16、'skicka`のために認証を通す手順をひと通り。画面は少し古いし英語だけれど、これを参考にすればなんとかなる！（なんとかなった！）

[Google Driveをコマンドラインで扱う-skicka編](https://qiita.com/hann-solo/items/b9e06fbf7494df76b88f)
at 2020-12-15、自分のインストールメモ


### gdriveに関する記事

[prasmussen/gdrive](https://github.com/prasmussen/gdrive)
GitHub本家

[Googleドライブへのアップロード・ダウンロードに「Google Drive CLI Client」] (https://rimever.hatenablog.com/entry/2019/10/18/060000_1)
at 2019-10-18、インストールから使用例（コマンド例）まで


### おわりに

コマンドラインでハッピーなGoogle Driveライフを！😆
配列内のクラスのプロパティのBindingのサンプル


@Stateした配列のクラス変数のプロパティをBindingしたときのサンプルです

```swift
import SwiftUI

struct ContentView: View {
	@State var items: [Item] = [Item(), Item()]
	
    var body: some View {
		VStack{
			ForEach(items.indices, id: \.self) { i in
				if let comment = items[i].comment {
					Text(comment)
						.padding()
				}
				TextField("comment: ", text: Binding<String>(
					get: {
						items[i].comment!
					}, set: {
						items[i].comment = $0
					}))
					.padding()
			}
			
			Button(action: {
				items[0].comment = "test"
			}, label: {
				Text("Change Comment")
			})
			

			
		}
    }
}

struct Item{
	var comment: String? = ""
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

```
アナログ回路 その3

# 概要

circuit sandboxをplunkerでホスティングした。
アナログ回路をシュミレーションで、説明してみる。

# R並列回路

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/044dad24-9b5a-5229-5889-d78bae413781.jpeg)


# 説明

一本の抵抗に流れる電流は、5mA、2本なので、10mA流れる。
電源から見ると、抵抗は半分になった。


# 成果物

https://embed.plnkr.co/plunk/hIbz5hZzYP85Mvg9


以上。
メモ：配列の数学的表現(?)

何年か前に、ある本を読んでいて暫く悩んだ表現（勉強不足なのが明白です）

```math
\begin{eqnarray}
f \left( n \right) & = & \sum_{j=0}^{2^N-1}{ a_j \delta_j^n } \\
\delta_{j}^{n} & = & \begin{cases}
1 \cdots j = n \\
0 \cdots j \ne n
\end{cases}
\end{eqnarray}
```

こんな感じ。数列 $a_j$ を連続座標上に配置するらしい。

$f(n)$ を C 言語で表現すると

```c:C
double a[1<<N] = { a0, a1, a2, /* ..., a{(1<<N)-1} */ };
double f(double n) { return (n == (int)n) ? a[(int)n] : 0; }
```

のようになる。暫く目にしないと忘れるのでメモ。
C#でフロントエンド開発ができる「Blazor WebAssembly」を試してみた

# はじめに
本記事はBlazor WebAssembly使ってみて得た知見をまとめることを目的としています。
​
# Blazor WebAssemblyとは
BlazorとはC＃、Razor(後ほど説明します)、およびHTMLをベースにしたWeb UIフレームワークのことを指します。
Blazor WebAssemblyとは今年の5月にマイクロソフトから正式リリースされたC#と.NET Coreを用いてWebアプリケーションの開発を可能にするフレームワークです。
私のようなフロントエンド言語は苦手だけどC#ならわかる人におすすめです。
​
# 開発してみる
Visual StudioでBlazorアプリを選択し、新規プロジェクトを立ち上げます。Blazor WebAssembly Appを選択して作成ボタンを押します。
プロジェクトをビルドして実行すると、ブラウザが勝手に立ち上がり以下のような画面が表示されます。今回は画面の赤枠部分について解説します。
![clip-20200716200702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/5c96c9e5-4dde-0a6f-c79d-b65b431fc142.png)
# Razor構文
上記図の部分はRazorファイルというもので作られています。RazorファイルではHTMLページ内にRazor構文でC#のコードを埋め込んで開発することができます。変数をHTMLコードとして動的に出力したい場合には、変数名の先頭に”@”を付け、@code内でC#でメソッドやプロパティ、フィールド変数を定義することができます。
```currentCount```という変数と```currentCount```をインクリメントするメソッド```IncrementCount()```が@Code内で定義されています。HTMLページ内にそれらが埋め込まれており、```Click me```ボタンを押すと、メソッドが実行され、```currentCount```の値が更新されます。

```c#
@page "/counter"
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
    private int currentCount = 0;
    private void IncrementCount()
    {
        currentCount++;
    }
}

```
​
# さいごに
Javascriptが分からなくてもRazor構文というものを使えばC#でロジックを書くことができるのはとてもお手軽だと思いました。まだ新しいので日本語の情報が少なく開発し辛い場面もありますが、Webでちょっと遊んでみたいという人にはとても良いと思いました。
最後までお読みいただきありがとうございました。
kintone ルックアップフィールドのクリア

# kintone ルックアップフィールドの自動クリア
## 解決法

```lookup_clear.js
 record['fieldcode'].lookup = 'CLEAR';
```

`kintone ルックアップ クリア 自動`などで検索すると、

**自動でクリアできない**、**不便**など、
まだ古い記事が出てきます。

[2019/7/14の定期メンテナンス](https://developer.cybozu.io/hc/ja/articles/360028388291?_ga=2.226415839.475069264.1607999133-689674757.1580087884&_gac=1.149829188.1606964362.Cj0KCQiAk53-BRD0ARIsAJuNhpv8TPzyxieQu-VHquFLqrqfUENgmhXCgFXWC4XZOg4GjjUfBq3hiTgaAgVFEALw_wcB)において改善されました。

cybozu developer networkがトップヒットしてしまうので、
アップデート前でのハックなどが提示されていて、
アップデート後も注釈が入っていないなど、
新規で検索をかけている人に存在を知らせるために記事に残します。

# 対応イベント

|対応イベント|
|:--|
|レコード追加画面表示イベント|
|レコード編集画面表示イベント|
|レコード追加画面のフィールド値変更時イベント|
|レコード編集画面のフィールド値変更時イベント|
|レコードに値をセットする|
【Ruby】next ifとは？ループ処理で特定の条件の場合は処理をスキップする

個人メモです。

ループ処理の中の`next if`は指定した条件の場合、処理をスキップする。

**▼実例１**
forループを使った処理で`next if`を使った例。

`even?`メソッドで、iが偶数の場合のみtrueになり、表示処理`P i`をスキップする。

```ruby:
for x in 1...11
   next if x.even?
   p x
end

##出力結果
1
3
5
7
9
```


<br>
**▼実例２**

配列に対しmapメソッドを使った場合。
`next if x.odd?`によりxが奇数の場合はスキップとなる。

```ruby:
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr2 = arr.map{|x|
  next if x.odd?
  x
}

##出力結果
[nil, 2, nil, 4, nil, 6, nil, 8, nil]
```
開発手法と管理ツール

# 目的
 開発手法と管理ツールの概要を把握する事
 代表的な開発を言語化し定着させる事

#アジャイル開発
一度にまとめてではなく少しづつ確認しながら開発を進めていく事が特徴。利用者の反応や関係者からのレビューを得ながら計画を調整しつつ進めていく。
```メリット```
　手直しが容易で修正が仕様変更に対応可能
```デメリット```
 　進捗が分かりにくい

　進捗が分かりにくいという特徴があるので「スクラム」を導入する事がある。
```スクラム```
　「開発を進めるチームの単位」リーダー、マネージャー主体ではなくテーム全体が主体性を持ち責任を持つ事が特徴。
・プロダクトオーナー
　リリースするプロダクトの責任を持つ。開発の順序やスケジュールを考えプロダクトの価値が最大化するように様々な決断をする役割。
・スクラムマスター
　人間関係に起因する妨害を排除し、スクラムを円滑に回すための世話役を務める。
・開発チームメンバー
　開発チームメンバーに上下関係はなく開発の進め方はメンバー間で開発します。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
```アジャイル型開発で最終的な用件がはっきりしていないプロジェクト```
 まずは最小限でリリースし、プロダクトの使い勝手を見ながら残りの詳細を詰めていくようなプロジェクトにはアジャイル型開発が向いている。「この機能だけは絶対欲しい、一方でそれ以外の機能は実際に使ってみながらじゃないと必要かどうか分からない。」といった開発プロジェクトに置いて用いる事ができる。
```顧客ビジネスの状況によって開発の優先度が変わる可能性のあるプロジェクト```
アジャイルでは1~4週間が一つのサイクルです。そのサイクル内で完成したものを顧客やユーザーに届ける事ができます。詳細まで時間をかけて作り込まず、実際に作ってみてから改善点を探していくことで、スピーディーに開発を続ける事ができる。

#ウォーターフォール型開発
初めに決めた用件をある期限までに完了する手法。
契約→開発→納品というフローに則ったシンプルなもの。
```メリット```
開発計画がシンプルで進捗管理がしやすい。
```デメリット```
仕様変更に対応しにくい
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
```大規模システム開発プロジェクト```
大型システムの開発のように多くのエンジニアが関わるプロジェクトにおいて明確に役割分担を行う必要がある際にウォーターフォール型開発が有効です。携わる人々の役割と期間を明確に決める事で、大規模でもスケジュール管理がしやすい。ただし、開発途中で仕様変更などが発生しない事を前提とするので綿密な計画が必要。
```ユーザーの用件が明確に決まっているプロジェクト```
明確に欲しい用件が決まっている際には、仕様通りに開発を進められるのでウォーターフォール型開発が有効です。役割を明確に決めることで、最短効率で開発を行う事ができる。

#プログラムの管理
サービスの開発を進める場合様々な管理が必要です。例えばコードレビューやテストの実行そして開発した機能をデプロイ。少人数で開発すれば、これらを人が手動で管理することは容易です。しかしながら、開発に携わる人数が増えるとそれらの管理を綿密に行うことは難しくなります。管理する労力がかかり、見落としや作業忘れが発生するからです。
それらを避けるためになるべく人が介在する余地を減らし、自動化する必要がある。
```Sider```
コードレビューを自動で行ってくれる。特にインデントなどのコードの体裁や開発者自身が設定した、ルールに反していないかを自動で判断してくれる。
```CicleCI```
追加、変更されたアプリケーションのテスト、テストが完了して問題が無かったコードのデプロイを、自動で実行するクラウドサービスです。
```CI/CD```
CIは「Continuous Integration」の略で継続的インテグレーションという意味です。開発したコードのテストを定期的に自動で実行することです。
CDは「Continuous Delivery」の略で継続的デリバリーという意味です。書いたコードを自動で本番環境にデプロイできる状態に整えることです。
CI/CDを導入することで、「変更したコードは自動でチェック、問題がなければ自動でデプロイ」が実現し、人的負担を少なくすることができます。
Cloud Pak for Data ver.3.5で、外部のデータベース（今回はDb2）への接続を作成する。

Cloud Pak for data （CP4D） v3.5が2020年11月20日に一般公開（Generally Available、通称GA）となりました。

そこで今回は、Openshift v4.5 managed by IBM Cloud 上に構築したCP4D3.5にて、いろいろと触っていきたいと思い、

まず今回は、外部のデータベースへ接続してみようと思います。

#プラットフォーム接続へ
- 画面左上のハンバーガーメニューから、「データ」　→　「プラットフォーム接続」をクリック。
![スクリーンショット 2020-12-16 10.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/b3c3ebc6-a015-7825-fc92-c468d2d9ba99.png)

#新規接続作成
- 「新規接続」をクリック。
![スクリーンショット 2020-12-16 10.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/a3435e91-d12f-a1f1-887a-0c5afbb5a81c.png)

-  新規接続に使用可能な接続定義は以下の通り。
![スクリーンショット 2020-12-16 10.40.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/5b7e2299-71be-7de9-3c27-152835d40de1.png)

##Db2を選択
- 今回はDb2を使います。Db2はここで準備したものです。
- https://qiita.com/Shumpei_Kubo/items/b6fd9153262cac4773e3
![スクリーンショット 2020-12-16 10.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/b3c84e31-cf75-974e-8685-1ebe755bd36a.png)

- 必要な情報を入力し、右下の「テスト」をクリックします。
    - 接続名
    - ホスト名
    - ポート番号
    - ユーザ名
    - パスワード
![スクリーンショット 2020-12-16 10.44.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/b9d2a788-9e56-846b-a707-25c1040a499a.png)

- 接続テストが成功しました。今度は画面右下の「作成」をクリックします。
![スクリーンショット 2020-12-16 10.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/c143adeb-d482-2603-caa2-c870d69f7a81.png)

- 作成中です。
![スクリーンショット 2020-12-16 10.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/e2f3a114-4430-ea70-521f-b46b88382936.png)

- 作成されました。
![スクリーンショット 2020-12-16 10.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/1096bf83-9c29-b8e9-28b0-9ada9d634f80.png)

- 作成された後、元の管理画面に戻りました。今作成した接続の定義が表示されていることがわかります。
![スクリーンショット 2020-12-16 10.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/2a6a563b-5e54-41f0-5896-4e5ae559e1c3.png)
Explicit Interface

自分が見ているレポのコードリーディングで次のような構文が出てきて何だろう？と思ったので調べてみた。同じメソッド名でこんな定義が出来るのが知らなかった。調べてみると、[Explicit Interface](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation) という構文っぽい。

```csharp
        async Task<ScaleMetrics> IScaleMonitor.GetMetricsAsync()
        {
            return await GetMetricsAsync();
        }

        public Task<KafkaTriggerMetrics> GetMetricsAsync()
                             :
```

Explicit Interface の構文を使うと、複数のインターフェイスで同じ名前のメソッドがあっても、インターフェイスを明示した方が使われる。つまりこのケースだと、次のサンプルがわかりやすいかもしれない。同じ `GetSome()` のメソッド。１つは、戻り値が `int` もう一つの Explicit Interface がついている方の戻りは、`string` インターフェイスを介してアクセスすると、該当の Interface の メソッドが呼ばれる。

```csharp
    class Program : IInterface
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var p = new Program();
            // int GetSome() is for common usage.
            int a = p.GetSome();
            IInterface i = new Program();
            // If you use interface, it will explicit interface. 
            string b = i.GetSome();
        }

        public int GetSome()
        {
            return 1;
        }

        string IInterface.GetSome()
        {
            return "hello";
        }
    }

    interface IInterface
    {
        string GetSome();
    }
```

一つ実験してみる。インターフェイスに、`Hello` メソッドを足す。

```csharp
    interface IInterface
    {
        string GetSome();
        void Hello();
    }
```

`Program` に、`Hello` メソッドを別途定義する

```csharp
        void Hello()
        {
            Console.WriteLine("Hello from the class.");
        }

        void IInterface.Hello()
        {
            Console.WriteLine("Hello from the interface.");
        }
```

メインメソッドを 変更して、それぞれ `Hello()` が呼ばれるようにする。

```csharp
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var p = new Program();
            // int GetSome() is for common usage.
            int a = p.GetSome();
            p.Hello();
            IInterface i = new Program();
            // If you use interface, it will explicit interface. 
            string b = i.GetSome();
            i.Hello();
        }
```

## Result

予想通り！

```
Hello World!
Hello from the class.
Hello from the interface.
```

# リソース

* [Explicit Interface](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation)
Powershellで直前の処理の成否をわかりやすくしよう＋α

###はじめに

&emsp;こんにちは、麻菜結と申します。Windowsで開発を始めた方はそろそろコマンドプロンプトを見放し始めているころだと思いますが、Powershellはプロンプトの文字列を簡単に操作できるのはご存じですか？今回は、普段自分が使用しているPowershellのPromptの設定をお見せしようと思います。
###環境

&emsp;環境はPS7です。

```Powershell
> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.0.0
PSEdition                      Core
GitCommitId                    7.0.0
OS                             Microsoft Windows 10.0.18363
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
```

&emsp;文字の表示の色をいじるので`Write-Host`が機能するターミナルでやりましょう。
![Colore_Check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/b7474922-9198-7051-76da-697822bcf361.png)


###こんなかんじです
&emsp;以下のPrompt関数を`$Profile`に追記すると

```Powershell
function Prompt {
    $result = $?
    $here = Convert-Path .
    $rand = Get-Random 4
    $good_words = @("..", "ok", "sure", "well")
    $bad_words = @("..", "bad", "what?", "idk")
    Write-Host "[${env:username}]${here}" -NoNewLine
    if ($result) {
        Write-Host " (PS'-')$($good_words[$rand])" -NoNewLine -ForegroundColor "Green"
    } else {
        Write-Host " (PS'-')$($bad_words[$rand])" -NoNewLine -ForegroundColor "Red"
    }
    return "`n> "
}
```

&emsp;こんなかんじになります。  
![good.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/0f73dfd9-fd08-a93d-cc85-3fa45ee1a453.png)
![bad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/254f6634-459d-81a8-4a76-6555e4aeb631.png)



&emsp;右の不愛想なキャラが前の処理の成否を教えてくれるわけですね。ここからはそれぞれの部分の解説です。

###前の処理の結果を取得する

&emsp;以下の変数から取得できます。Prompt関数内で一度変数に入れているのは、Prompt内の処理で`$?`の値が書き換わってしまうからです。

```Powershell
> $?
True
```

###カレントディレクトリのパスを取得する
&emsp;おそらくこの、`Convert-Path`から相対パス`.`をフルパスに変換してしまうのが一番簡単だと思います。

```Powershell
> Convert-Path .
C:\
```

###キャラに喋らせたい
&emsp;これは別になくてもいいのですが、かわいいのでやります。成功したときの言葉と失敗したときの言葉それぞれを用意して、キャラの後ろにくっつけます。

```
$rand = Get-Random 4
$good_words = @("..", "ok", "sure", "well")
$bad_words = @("..", "bad", "what?", "idk")
```

###ユーザーネームを取得する
&emsp;完全にBashの影響な気がしますが、なんとなく落ち着くのでつけておきます。

```
> $env:username
```

###What is return "\`n> "?
&emsp;Prompt関数は返り値として文字列を期待されているのでつけます。Powershellでは改行文字は`\n`ではなく`` `n ``なので、~~マークダウンで入力しづらいな~~これも好みですが、入力プロンプトは改行されてた方が読みやすくて良くないですか？さっきまでの`-NoNewLine`で出力されていた文字列から改行をかけて`> `を表示している感じですね。

```
return "`n> "
```

###結局どこに書き込めばいいんだっけ？
&emsp;さらっと流してしまったので念のため。`$Profile`変数には今使っているPowershellのプロファイルのパスが入っています。Bashの`.bashrc`みたいなものですね。ここに書き込まれた関数、エイリアス、コマンドレット、変数はあらかじめ実行・定義された状態で始まります。

```Powershell
> $Profile
#C:\Usersからはじまり.ps1で終わる何らかのファイルのパス
```

###おわりに
&emsp;お疲れさまでした。上手く実行できましたか？`Write-Host`が非推奨になっているっぽいし、色々な環境でテストしていないので若干不安です。それでも、何らかのお役に立てたら幸いです。ここまで読んでくださってありがとうございます。
&emsp;次何書こうかな、長編というかいくつかに分けて書きたいネタがあるのでそれ書くかも。
プリザンターを用いてYoutube動画分析ツールを作ってみた！

本記事は[Pleasanter(プリザンター) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/pleasanter) 15日目の記事です。

# はじめに

国産オープンソースのローコード開発プラットフォームであるPleasanter(プリザンター)を用いてYoutubeの動画分析アプリを作ってみました。本来、プリザンターは業務用途で使用されることが多いですが、まあこんなものもやろうと思えば作れるよ～！というかプリザンターを使えば大体何でも作れちゃうよ～というアピールも込めて作った次第です。

# プリザンターとは

プリザンターは国産オープンソースのローコード開発プラットフォームであり、パッケージよりも高機能かつフルスクラッチよりも低コストに業務アプリを作ることが出来ます。

プリザンターは以下からダウンロードが可能です。（無料で）
https://pleasanter.org/dlcenter

# 本アプリを動かす前提条件

* プリザンターが利用可能であること
* YoutubeAPIを操作するにあたってApiKeyを取得済みであること
(以下が参考になるかと思います。)
http://piyohiko.webcrow.jp/kids_tube/help/index.html

* (Visual Studio Codeが利用できること)←任意

# 環境構築手順

本手順はVisual Studio Codeを使用します。

1. 下記よりソースコードをクローンします。  
https://github.com/Oooooomin2/YoutubeMovie-Analytics-featuring-Pleasanter
1. src\data.jsonを開き、ApiKeyを入力します。
1. YoutubeMovie-Analytics-featuring-Pleasanterフォルダに移り、Visual Studio Codeのターミナルにて「npm run release」と打ち、コンパイルを行います。
1. Pleasanterのトップ画面を開きます。
1. サイトパッケージのインポート機能を用い、本アプリのsitepackage\Youtube分析アプリ.jsonをインポートします。  
![フォルダ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/561e90e1-45eb-b2f1-c714-25d754282104.png)
1. フォルダの中身へ移り、以下のようになっていることを確認します。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/c8a951b6-02a7-c3c1-b875-ad65348d38fc.png)
1. 投稿者マスタテーブルにてレコードを新規作成します。下記の赤枠の2項目「投稿者名」「チャンネルId」をそれぞれ入力してください。
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/efebba5c-4af9-5f21-b29b-cae098519bd3.png)
チャンネルIdは各YoutubeチャンネルのURL (https://www.youtube.com/channel/xxxxxxx) のxxxxxxx部分です。

1. 動画分析テーブルを開き「管理」>「テーブルの管理」を開き、スクリプトタブを開きます。 そこで「新規作成」ボタンをクリックし、任意のタイトルを入力後に3にて作成されたdistフォルダ内のindex.bundle.jsの中身をスクリプト項目に入れて「変更」ボタンをクリックします。
1. 画面下の「更新」ボタンをクリックします。
1. 投稿者マスタテーブルにてレコードを作成後に動画分析テーブルにてレコードを作成します。
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/faabffee-4a25-3e40-9186-111eec0721d6.png)
1. レコード作成後、以下のような画面に切り替わります。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/ded08101-bfb4-9624-1588-5a2b79ad3602.png)

(さらば青春の光さん、高評価率高いですね～！さすがです！)

## 制約

* 動画は5つ固定表示となっております。
* カテゴリは「再生回数順」「Good順」「投稿日時順」の3パターンのみです。

# さいごに
今回はお試しとして作ってみましたのでもしかすると環境構築手順自体が難しいかもしれません...。
今後時間があればより使いやすくしていけたらな～と思っています。

プリザンターはこんな風にも使えるよ！という一例になれば幸いです。
データ型が日付の項目をPardotにフォームハンドラー経由で放り込む方法

## はじめに
Pardotのプロスペクト項目にフォームハンドラー経由で
データ型が日付の値として入れたい項目があったので対応しました。

## 基本情報など
### 構成等
Pardotフォームを利用せず、フォームハンドラーを利用します。
サイト内フォーム → フォームハンドラー → Pardot → Salesforce(CRM) 
の流れで情報を渡していく想定です。

<参考図>
![qiita用図_20201216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700537/aae836ee-ec62-cc56-69dc-9e813d19b159.png)



### 日付の渡し方
- `yyyy-mm-dd`の形でvalueをフォームハンドラーに渡します。
    - 月日部分は0埋めが必要です
- 各項目での対応を表にするとこんな感じです。

|種類|データ型|フォーマット|
|---|---|---|
|フォームのvalue|なし(プレーンテキスト)|yyyy-mm-dd|
|Pardotプロスペクト項目|日付|yyyy-mm-dd|
|Salesforceの項目|日付|yyyy-mm-dd|

## 備考
同じ要領でドロップダウン項目の値なども
渡すvalueがドロップダウンの項目と合っていれば連携できます。

## おわりに
Pardotでフォームハンドラーを使う方の参考になれば幸いです。

### 参考
フォームハンドラー
https://help.salesforce.com/articleView?id=pardot_form_handlers.htm&type=5

プロスペクト項目のデータ型
https://help.salesforce.com/articleView?id=pardot_field_types.htm&type=5
UXを導入する活動

この記事は[「株式会社エイチームフィナジーのAdvent Calendar 2020」](https://qiita.com/advent-calendar/2020/ateam-finergy)23日目の記事です。
@ito_yuri が担当いたします。

今回はデザイン関係のお話になりますので、noteの記事をシェアさせていただきます。

記事はこちら↓
[「UXを導入する活動」](https://note.com/leo_ito/n/ncb7241ee3810)
10秒で解決！VueRouterで遷移するときにスクロール位置が固定されてしまった時の話

今回は、VueRouterで別のページに遷移するときに、遷移する前のスクロール位置によって遷移先のページでトップの位置にならないという謎の事象が発生したので、その解決方法をご紹介します。

以下のコードをrouter/index.jsに追加するだけ。

```
const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes,
  //以下のコードを追加
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition;
    } else {
      return { x: 0, y: 0 };
    }
  },
});
```

これを解決するのに、めちゃめちゃ時間がかかったので皆さんの助けになればなと思います。
HomebrewでインストールしたPHPのバージョンを切り替える方法

# 目的

- HomebrewでインストールしたPHPのバージョンを切り替える方法をまとめる

# 実施環境

- ハードウエア情報

    | 項目 | 情報 |
    | --- | --- |
    | OS | macOS Catalina(10.15.3) |
    | ハードウェア | MacBook  Air (11-inch ,2012) |
    | プロセッサ | 1.7 GHz デュアルコアIntel Core i5 |
    | メモリ | 8 GB 1600 MHz DDR3 |
    | グラフィックス | Intel HD Graphics 4000 1536 MB |

# ことの発端

- PHP7.4を入れたかったけどPHP8.0を入れてしまった。
- `$ php -v`を実行すると下記のように表示されてしまい7.4になってない。

    ```
    PHP 8.0.0 (cli) (built: Nov 30 2020 13:47:29) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
        with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
    ```

# 詳細

1. 下記コマンドを実行してPHP7.4をHomebrewでインストールする。

    ```terminal
    $ brew install php@7.4
    ```
1. 下記コマンドを実行してPHP8.0からPHP7.4に切り替える。

    ```terminal
    $ brew unlink php@8.0
    $ brew link php@7.4
    ```
1. 下記コマンドを実行してPHPのバージョンが切り替わったことを確認する。

    ```terminal
    $ php -v
    ```
1. 筆者の環境だと正常に切り替わってた。

    ```terminal
    PHP 7.4.13 (cli) (built: Nov 30 2020 14:46:04) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
        with Zend OPcache v7.4.13, Copyright (c), by Zend Technologies
    ```
kubectlがWSL上で実行できない


WSLの環境に [公式リファレンス](https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/) を見ながらkubectlをインストールしてウキウキしながらコマンドを実行したのですが、下記のようなエラーが発生してしょんぼりしてしまいました。

```
$ kubectl get pod
The connection to the server localhost:8080 was refused - did you specify the right host or port?
```

そのため、kubectlが実行できず悩んでいたのですが、解決策が見つかったので備忘録として残しておきます。

## 実行環境

- WSL
  - Ubutu 20.04 LTS
- Azure Kubernetes Service
  - Kubernetesのバージョン 1.15.10
  - ~~サポート対象外だからバージョン上げろ~~

## TL;DR

環境変数で `KUBECONFIG` がちゃんと設定されていないことが原因でした。

## 解決策

なんか色々探しているうちに「kubectlの接続設定を見ろ」っていう記事が多かったので、コマンドで確認しました。

```
$ kubectl config view
apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null
```

空じゃん。。。

「 `az aks get-credentials` で接続情報を取得してファイルに格納しているのになんでだ？」と思ったので、そのコマンドの実行結果を見てみました。

```
$ az aks get-credentials --subscription {{サブスクリプションID}} --resource-group {{リソースグループ}} --name {{リソース名}}
Merged "{{リソース名}}" as current context in C:\Users\{{ユーザー名}}\.kube\config
```

WSLからWindowsのCドライブにアクセスするときは `/mnt/c` でアクセスしなきゃいけないはずが、 `C:\` でアクセスしていて、ファイルに設定を書き込めていなかったことが原因っぽいです。（これWindowsのパス表記じゃん？）

試しに `kubectl config view --kubeconfig /mnt/c/Users/{{ユーザー名}}/.kube/config` で接続設定がちゃんと格納されているか見たら、それらしい接続方法が書いてありました。

```
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
...
```

そのため、接続設定のファイルがどこにあるかをちゃんと環境変数を設定してあげました。

```
$ echo 'export KUBECONFIG="/mnt/c/Users/{{ユーザー名}}/.kube/config"' >> ~/.bashrc
$ source ~/.bashrc
$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
...
```

できたーーー！
ServiceNow - CSVインポートとエクスポートの文字化けを直す

#概要
ServiceNowのリストをcsv形式でエクスポートすると文字化けする。また、CSVファイルをServiceNowにインポートすると文字化けする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/ce41efda-8d51-fae6-9f3a-e84fce12d1f7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/4987c910-cc54-55d2-3364-57d056f6d378.png)

#原因
問題はServiceNowはデフォルトではwindows-1252エンコーディングでインポートとエクスポートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d4b5e744-cb6b-5f6a-2e77-4c46df55e473.png)

ServiceNowドキュメントにも注意として書かれています。

**Note: By default, ServiceNow exports all CSV files in Windows-1252 encoding. If you need to export translated data, set the glide.export.csv.charset system property to UTF-8.***

https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/exporting-data/concept/c_ExportData.html

#解決
インポートエクスポートでエクスポートのエンコーディングをUTF-8に指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/eebd11b3-837b-49b2-f4ad-5afb0bd31483.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/5873d7b3-a3e0-fbfc-4813-9ac30fd36c66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/157a1fca-7d5b-ef1e-2e99-90e44bb94d41.png)

以上
kubernetesの設定を手探りで改善した記録

## はじめに
ちょっと特殊な社内環境でkubernetesを運用しています。
初心者なりに多少なりともチューニングを施したので、備忘録がてら記事にしておきます。

## コスト削減
開発環境のコストがオンプレ環境に比べて割高という相談を受け、設定の見直しを実施。
### レプリカ数削減
#### 修正内容
レプリカ数を2から1に減らして、代わりにmaxSurgeの設定を追加。

#### 原因
・maxSurgeのことを知らなかったため、未設定だった。
・開発環境とはいえ、デプロイの瞬間に数分落ちるのは不便なのでレプリカ数を2にしていた。

#### 再発防止
・特になし。コピペされても大丈夫。

#### 成果
・未確認（開発環境のランニングコストがおよそ半減のはず）。

```
spec:
-  replicas: 2
+  replicas: 1
  strategy:
+    rollingUpdate:
+      maxSurge: 1
```

### リソース削減
#### 修正内容
リソースの割当にかなりの無駄があったのを修正。
また、requestsとlimitsで同じ値が設定されていたのを見直し。
日和ってlimitsはそのまま、requestsのみ（この環境の）初期値にリセット。

#### 原因
・新しいアプリを構築する際、deployment.yamlの設定がコピペされていた。
・requestsとlimitsの違いが認識されておらず、初期値が同じ値だったため、割当を増やす際にとりあえず両方増やされていた。
・一部のアプリでOutOfMemoryの対応のためメモリを増やした結果、それが新しい基準値になってしまった。

#### 再発防止
・この設定値は新アプリ作成の際に初期値を使うことを関係者に周知。

#### 成果
・未確認（コストを何割か削減できたはず）。

```
spec:
  template:
    spec:
      containers:
      - name: {{APP_NAME}}
        resources:
          limits:
            cpu: 2
            memory: 4Gi
          requests:
-            cpu: 2
+            cpu: 0.5
-            memory: 4Gi
+            memory: 500Mi
```

## 生産性向上
Deployが遅い、安定しない、という相談を受けて調査。

### Dockerize高速化
#### 修正内容
Dockerizeで時間がかかっていたので見直し。
Dockerfileのコマンドが分割されており、snapshot取得回数が多かったので不要な取得を避けるべくコマンド連結。

#### 原因
・Dockerfileのコマンドごとにsnapshotが取得されるのを知らなかった。

#### 見送り
・npm installまでを別ジョブに切り出してのマルチステージビルド化。
　現在のところnpm installでの所要時間は1分半ほどで、
　dependencyに変更が変更があった場合のみビルド手順が切り替わるデメリットのほうが大きいと思ったため。
　（かしこく自動化すれば基本的には回避できる問題だと思いますが、後述するビルドの安定性の問題もあり断念）

### 成果
・Dockerizeを30~70分から10~30分に短縮。

```
-RUN foo
-RUN bar
-RUN baz
+RUN foo \
+  bar \
+  baz
```

### Rollout高速化
#### 修正内容
Rolloutで時間がかかっていたので見直し。
livenessProveとReadinessProveのinitialDelaySecondsを適切な長さに短縮。

#### 原因
・一部DockerfileのCMDで重い処理をしているアプリがあり、initialDelaySecondsが伸ばされていたのが
そのままコピペされて他のアプリでも使用されていたため。

#### 再発防止
・関係者に関連パラメータについて説明。

#### 成果
・Rolloutを平均4分台から1分台に短縮。

```
Health checkのタイムアウト時間
spec:
  template:
    spec:
      containers:
      - name: {{APP_NAME}}
        livenessProbe:
-          initialDelaySeconds: 200
+          initialDelaySeconds: 45
        readinessProbe:
-          initialDelaySeconds: 200
+          initialDelaySeconds: 45
```

### デプロイ安定化
#### 修正内容
開発環境でRolloutが度々失敗するため、調査と対策を実施。
主なエラーとしてはtimeout、及びコンテナイメージのダウンロード失敗。
タイムアウト時間の延長、リトライ回数やインターバルの調整を実施。

#### 成果
なんの成果も得られませんでした！！

#### 原因
・そもそも開発環境のnodeが不安定。
・開発環境のnodeは死活監視がされていないorアラートが飛ばない（！？）。
・nodeが死んでいても権限不足で自分たちでは再起動ができず、担当部署への依頼が必要。
　（ただし24時間対応してくれるとは限らない）

#### バッドノウハウ
・デプロイが失敗したらとりあえず再実行しておく。
・エラーログを確認して、コンテナイメージの失敗だった場合はnodeのステータスを確認。死んでいたら担当部署に連絡。
・連続して失敗するようなら、数時間後に試してみたらいけることがあるので一旦寝る。

#### 再発防止
・AWS、GCP、Azureなどへの移行を検討。

## まとめ
・コンテナ化は別に銀の弾丸ではない。
・生半可な知識でインフラ構築をすると、動くものはできても全体の生産性が低下する。
・多少高くても信頼できるサービスを使う。
　トラブルの調査、対応にも人件費はかかる上、クソ環境を使わされるのは開発者体験的にもマイナス。
・環境を改善できる時間を確保する。
　表向き品質を犠牲にするとは公言できないことが多いけれど、速度を優先すると大抵犠牲にされる。
・この記事は事実を基にしたフィクションです。実在の人物、団体とは関係ありません。
WordPressでカスタムフィールドの値で一覧表示を絞り込む

ワードプレスのテーマtwentytwentyを基盤に、カスタムフィールドの真偽値を使って一覧表示したい投稿を絞り込む実装をしたので、備忘録的にこの記事を残す。

# 環境情報

PHP：version 7.3.12
WordPress：version 5.5.3
WPテーマ：twentytwenty

# 作業

```php
<div class="section_inner">
  <h2>カスタム投稿　真/偽での振り分け</h2>
  <div class="contents">
    <?php $args = array(
      'post_type' => array('sample_01', 'sample_02'),/*カスタム投稿タイプの名前*/
      'showposts' => 4,
      'meta_key' => 'new',/*カスタムフィールドのフィールド名*/
      'meta_value' => true,/*カスタムフィールドの値*/
    );
    $customPosts = get_posts($args);
    if ($customPosts) : foreach ($customPosts as $post) : setup_postdata($post); ?>
        <a href="<?php the_permalink(); ?>">
          <?php the_title(); ?>
          <div class="title"><?php the_field('title'); ?></div>
          <div class="thumbnail"><?php echo wp_get_attachment_image(get_post_meta($post->ID, 'thumbnail', true), 'thumbnailSmall'); ?></div>
        </a>
      <?php endforeach; ?>
    <?php else : ?>
      <p>記事はありません。</p>
    <?php endif;
    wp_reset_postdata(); ?>
  </div>
</div>
```
UITextDocumentProxyのselectedText, documentContextBeforeInput, documentContextAfterInputの仕様について

先日、この記事で改行をトリガーにしてselectedTextがおかしくなる現象について紹介しました。

https://qiita.com/En3_HCl/items/476ffb665cd37cb312da

しかし続けて調べたところ、selectedTextのみならずdocumentContextBeforeInputとdocumentContextAfterInputにも類似の仕様があり、さらにトリガーになっているのは改行というよりむしろ「文」であり、また文字数ではなくバイト(`utf16.count`)であることが分かりました。

# 結果
## documentContextBeforeInputとdocumentContextAfterInput
* documentContextBeforeInputは「前の一文」を返します。これはバイト数に依りません。
* documentContextAfterInputは「後の一文」を返します。これはバイト数に依りません。

### 前後の一文
ここでいう「文」の定義ですが、確認できている限り以下の文字によって区切られているものを指します。

* 英語のピリオド`.`
* 日本語の句点`。`
* 改行`\n`
* 全角・半角の感嘆符`!`
* 全角・半角の疑問符`?`

なお、例外的に「英文(英字と空白とピリオドによる構成)」ではこの動作が確認できませんでした。英字+句点や英字+半角感嘆符では動作が確認できたので、**何かが違います**。

末尾にこれらの記号が付く、または終端に達するまでを「１文」として扱います。ただしこれらの記号が複合した形、例えば「。。。」や「！？」などは1つの区切りとして扱われているようです。

## selectedText
* selectedTextは「3文」以上かつ「65バイト」以上選択していると、最初と最後の2文を連結したものを返してきます。

### 3文
ここでいう「文」の定義ですが、確認できている限り以下の文字によって区切られているものを指します。

* 英語のピリオド`.`
* 日本語の句点`。`
* 改行`\n`
* 全角・半角の感嘆符`!`
* 全角・半角の疑問符`?`

documentContextシリーズと同様、末尾にこれらの記号が付く、または終端に達するまでを「１文」として扱います。

### 65バイト

前回の記事では65文字と書きましたが、試してみると例えば2バイトである「💪」を使ってみると切れ目が変わります。「💪？💪？……」を21個連ねる部分までは全体が選択されますが、「`💪？`×21+`💪`」に至ったタイミングで正しく選択できなくなります。また3バイトの「飴󠄀(飴に異体字セレクタがついたもの)」を用いてみると「`飴󠄀！`×16+`飴󠄀`」で正しく選択できなくなります。これらのことから、おそらく書記素クラスタでの文字数ではなくutf16としての文字数で判断されているようです。

## 不具合ではない
前回の記事にも追記しましたが、Appleからは「クラッシュさせないためのexpected behavior」だよ、との趣旨の回答をもらいました。これがunexpectedな振る舞いだったら怖いのでよかったです。
この制限自体はおそらくkeyboard extensionに想定外に大量のデータを与えてしまわないようにするためのものでしょう。リミットが適切かは別として、存在自体は納得できました。


## 影響
自作しているキーボードにつけていた「文字数カウント」はselectedTextを利用していたのですが、この仕様上まともに動作させるほうが困難なので削除しました。現状、受け取った文字列が確実に全体を反映しているとわかる状況は「内部に区切り文字を含んでいない状況」のみです。区切り文字のリストが公開されていない以上、私が発見した以外にも区切り文字があるかもしれないので、この判定方法も潜在的に不具合の可能性を孕みます。

受け取っているテキストが正しいものなのか正しくないものなのかを判断することが出来ない点がかなり苦しいです。どうにかならないでしょうか。

また、この辺りの振る舞いはほとんどドキュメントが見つからず、気づいていない仕様がまだまだある可能性が高いです。今後何かわかったら追記します。
Visual Studio Code 1.52 で、ブレークポイントが使えなくなる問題の解決方法

2020年12月16日(水)記載

すぐに解決すると思いますが、Visual Studio Code が自動更新されて、PHP debug ができなくなった場合の解決方法。既に、解決のために拡張機能を開発している人が動いています。

今この瞬間に困っていたらどうぞ。

## 環境

- Visual Studio Code 1.52
- PHP Debug 1.13.0

## 解決方法

一次情報はこちら
https://github.com/felixfbecker/vscode-php-debug/issues/427

ギアアイコン > 設定メニュー > デバッグセクション > Allow Breakpoints Everywhere にチェックを入れる

![スクリーンショット 2020-12-16 9.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193970/5779a65d-6336-42f4-63b6-7eeee199d33c.png)
GitHub CLIの導入手順

##そもそもGitHub CLIとは

前提としてCLIとは、コマンドラインインターフェイス(Command line interface)の略です。

つまりGitHub CLIとは、これまでブラウザ上で行っていたGitHubの操作(プルリクエストの作成やリポジトリの作成など)をMacならターミナル上で可能にするツールのことを指します。

※GitHubが公式で公開してます
　https://github.com/cli/cli

##インストール方法

Macなら以下で一発です

```
brew install gh
```

※Windowsの方はこちらを参照
　https://github.com/cli/cli

##次に自分のGithubと紐付けしましょう

```
gh auth login
```

これで自分のGitHubにログインします。すると、

```
? What account do you want to log into?  [Use arrows to move, type to filter]
> GitHub.com
  GitHub Enterprise Server
```
と聞かれますので、`GitHub.com`を選択し、思いっきりEnterを押すと、

```
? How would you like to authenticate?  [Use arrows to move, type to filter]
> Login with a web browser
  Paste an authentication token
```
と聞かれます。
要は`どの様にして認証しますか？`と聞かれているだけなので、今回は`Login with a web browser`を選択し、再度思いっきりEnterを押します。すると、

```
First copy your one-time code: ●●●●-●●●●
- Press Enter to open github.com in your browser... 
```
と表示されると思います。

※●にはそれぞれ英数字が入る。

Enterを押して頂くと、
![スクリーンショット 2020-12-16 9.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696947/ee0fca2b-2b9a-9896-cc2f-579411da04ea.png)

こんな画面がデスクトップ上に出ると思いますので、先程の`●●●●-●●●●`をコピーして貼っ付けて下さい。

後は`Continue`→`Authorize github`の順に進んだらほとんど完了です。

ターミナルに戻りますと、

```
✓ Authentication complete. Press Enter to continue...
```
とあり、要は`認証は完了したよ。Enterさっさと押して次へいってね`とあるのでEnterを押します。すると、

```
? Choose default git protocol  [Use arrows to move, type to filter]
> HTTPS
  SSH
```
と出てきます。
`デフォルトのプロトコルを選択してね`とありますので、今回は`HTTPS`を選択します。

```
✓ Configured git protocol
✓ Logged in as [ここにGitHubのユーザーネーム]
```
と表示されれば完了です！！！

これで`ghコマンド`が使える様になっていると思います！！！
***

`ghコマンド`については丁寧にまとめられていた記事を見つけたのでそちらをどうぞ(^^)
**GitHub CLIで始める快適GitHub生活**
https://qiita.com/ryo2132/items/2a29dd7b1627af064d7b

***

お疲れ様でした！！！
rails_admin で alias_attribute な enum を扱えるようにする

## 前段

```ruby
enum layout: { list: 0, grid: 1 }
```

上記のような `top_layout` が `integer` のような enum があったとして、それを `top_layout` という名前に変えたいとします。（カラムのリネームが一番良いというのは置いておいて）

アプリケーションで扱う上では、以下のように　`alias_attribute` と `enum` の変更で事足りました。

```ruby
alias_attribute :top_layout, :layout

enum top_layout: { list: 0, grid: 1 }
```

一方で、 `rails_admin` が生成する UI の方は依然として `layout` が表示され、 `top_layout` が現れません。

## rails_admin が ActiveRecord の属性をどう取得しているか

https://github.com/sferik/rails_admin/blob/f0c46f1e128b5d31d812ff3a80d15db8692c848b/lib/rails_admin/adapters/active_record.rb#L56-L65

```ruby:adapters/active_recored.rb
module RailsAdmin
  module Adapters
    module ActiveRecord
      def properties
        columns = model.columns.reject do |c|
          c.type.blank? ||
            DISABLED_COLUMN_TYPES.include?(c.type.to_sym) ||
            c.try(:array)
        end
        columns.collect do |property|
          Property.new(property, model)
        end
      end
```

ざっと見ただけなので、他にも関連する要素はあるかもしれませんが、この properties で生成されたものをベースに扱っているように見えます。

これを確認したい場合には、console を開いて以下で確認できます。

```
> c = RailsAdmin.config(SampleModel.first)
> c.abstract_model.properties
```

当然 columns を取得されると、 `alias_attribute` したところでどうしようもないです。

## カスタマイズする

- [Enumeration - sferik/rails_admin](https://github.com/sferik/rails_admin/wiki/Enumeration)
- [Fields - sferik/rails_admin](https://github.com/sferik/rails_admin/wiki/Fields)


```ruby:config/initializer/rails_admin.rb
RailsAdmin.config do |config|
  config.model SampleModel do
    include_all_fields
    exclude_fields :layout

    field :top_layout, :active_record_enum
  end
```

Wiki に従い、無効にしたい `layout` を `exlude_fields` に入れ、新たに入れたい `top_layout` を追加し、 `active_record_enum` として登録しました。

これで、通常の enum カラムと同じように表示されるようになります。

## 更新時に失敗する

このままだと、更新時になぜか `0`, `1` といった値が、 enum の値として認識されず、「`'0'` のような値は enum には存在しない」といったエラーが出てしまいます。

ここに関しては以下が関わっています。

https://github.com/sferik/rails_admin/blob/f0c46f1e128b5d31d812ff3a80d15db8692c848b/lib/rails_admin/config/fields/types/active_record_enum.rb#L48

```ruby:config/fields/types/active_record_enum.rb
module RailsAdmin
  module Config
    module Fields
      module Types
        class ActiveRecordEnum < Enum
          def parse_input_value(value)
            abstract_model.model.attribute_types[name.to_s].deserialize(value)
          end
```

この `abstract_model.model` でアプリケーション側のモデル（例えば `SampleModel`)を参照しているので、 `attribute_types` は `SampleModel.attribute_types` などすれば確認できます。

確認するとわかりますが、`alias_attribute` するだけでは、この一覧に `top_layout` は入ってきません。よって、ここでの deserialize は何も変化がなく、リクエストパラメーターとして送信された `'0'`という文字列がそのまま `assign_attributes` に渡されてしまい、上述のエラーになってしまいます。

## attribute を定義する

```ruby
attribute :top_layout, :integer
```

このような形で `top_layout` も attribute として定義を追加します。ここは `ActiveRecord::Enum::EnumType` を直接指定できるような type を与えたいところですが、それはできないので `integer` にします。これは、もともとの `layout` の型と同じです。

> ここで attribute_types を実行するとわかりますが、alias_attribute 後も layout は ActiveRecord::Enum::EnumType として存在し続け、 top_layout は integer として定義されたような形になります。top_layout の enum 定義が、そのまま alias のオリジナルの layout の方にかかる形になるようです。

これで、更新時にも値の型変換が行われるようになったため、更新も問題なくできるようになりました。
ESP32がValueError: dlsymとNomodule named serialと出てコンパイルできない

# 環境
- Mac
    - macOS Big Sur 11.0.1
    - Macbook 2017 1.2 GHz デュアルコアIntel Core m3 8GBメモリ
    - Arduino 1.8.13
- Ubuntu
    - Ubuntu 20.04
    - 16GBメモリ
    - Ryzen5 2600
    - Arduino 1.8.13

# 問題
## esp_tool
```
ValueError: dlsym(RTLD_DEFAULT, kIOMasterPortDefault): symbol not found
Failed to execute script esptool
exit status 255
/Applications/Arduino.app/Contents/Java/arduino-builderが255を返しました。
```
というエラーがMacで出ました。Ubuntuでは出ませんでした。
この問題は[こちらのサイト](https://www.chihayafuru.jp/tech/index.php/archives/3820)に書いてある通り、以下のように実行することで解決しました。(一部改変)

```bash
cp ~/Library/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/esptool.py ~/Library/Arduino15/packages/esp32/tools/esptool_py/2.6.1/esptool.py
chmod +x ~/Library/Arduino15/packages/esp32/hardware/esp32/1.0.4/tools/esptool.py ~/Library/Arduino15/packages/esp32/tools/esptool_py/2.6.1/esptool.py
```
次に`~/Library/Arduino15/packages/esp32/hardware/esp32/1.0.4/platform.txt`を次のように変更します。

```diff
- tools.esptool_py.cmd=esptool
+ tools.esptool_py.cmd=esptool.py
```

## No module named serial
Arduino IDEで「検証」を押すと以下のようなエラーが出ました。

```
ImportError: No module named serial
```
これは[こちらのサイト](https://appex.blog.fc2.com/blog-entry-83.html)の通りにすることで解決しました。  

```bash
sudo pip2 install pyserial
```
別のサイトでは、`pip install pyserial`を実行することが紹介されていましたが、`sudo pip2`でないと解決しませんでした。

Ubuntu 20.04の中にはpip2が入っていなかったので、以下のようにしてpip2をインストールしました。

```bash

curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
sudo python2 get-pip.py
```

# 参考にしたサイト
こちらの2つのサイトには本当に助けれました。この二つのサイトでどちらの問題も解決しました。  
https://www.chihayafuru.jp/tech/index.php/archives/3820
https://appex.blog.fc2.com/blog-entry-83.html
【初心者でもわかる】CSSで縦書きを実装する

# どうも7noteです。縦書き対応する方法について。

日本語には横書きだけでなく縦書きもあるのでCSSで対応していきます。

## 縦書きにするCSS


```index.html
<p class="tategaki">徒然なるままにうんたら<br>かんたら</p>
```

```style.css
.tategaki {
    -webkit-writing-mode: vertical-rl;  /* Safari用 */
    -ms-writing-mode: tb-rl;            /* IE用 */
    writing-mode: vertical-rl;
}
```

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/366e3bdd-871f-77cb-5599-fb2f6597954e.png)


## 解説

ベンダープレフィクス（webkitやms）を付けなければ各種ブラウザに対応できないので注意が必要です！
writing-modeには様々な指定ができるのですが、おそらく一番使われるのが`vertical-rl`かなと思います。
縦書きにしたのち、右から左に行が進む書き方ですね。

その他の書き方についてはMDNのサイトで確認できます！
https://developer.mozilla.org/ja/docs/Web/CSS/writing-mode

## 変わった縦書きの方法

無理やりですが、こんな書き方で縦書きもできます。あまりするメリットはないですが。

```index.html
<p class="tategaki">
<span>徒</span>
<span>然</span>
<span>な</span>
<span>る</span>
<span>ま</span>
<span>ま</span>
</p>
```

```style.css
.tategaki {
  display: flex;
  flex-direction: column;
}
```

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/8b00f188-80e2-5105-f194-21cc89e29e05.png)


※ 1行のみ対応。

## まとめ

WEBでは縦書きのシーンはあまりないですが、CSSが用意されているあたり需要は意外とあるんじゃないかなと思います。
アジアの一部地域、特に日本では一般的に縦書きが利用されている事を思うと、日本人のためのCSSなのかなとも思えてきますね。

ちょっと親近感がわきました。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
[ESLint]warning  Unexpected console statement  no-console の無効化

##はじめに

Javascriptでconsole.logを使用してデバッグをすると、eslintに引っかかりwarningエラーが出ることがある。その際の無効化の方法を備忘録をして残します。

##エラー
```
warning  Unexpected console statement  no-console
```

##対処方法
// eslint-disable-next-line no-console　を追加する

```test.js
test() {
  // eslint-disable-next-line no-console
  console.log('test')
}
```

##参考
https://eslint.org/docs/rules/no-console
Josh Skeen, David Greenhalgh著　『Kotlinプログラミング』　章末問題に挑戦(第１０章)

　[Josh Skeen, David Greenhalgh著『Kotlinプログラミング』](https://www.shoeisha.co.jp/book/detail/9784798160191)には章末問題がある。残念なことに解答がないので、[第８章](https://qiita.com/guijiu/items/9a7871b1e41bdabd85e7)に引き続き本を読み進めながら答案を記述する。
　もし回答に間違いや意見があれば、ぜひご指摘いただきたい。

#第１０章　章末問題 回答案

##10.11　チャレンジ！　タバーンメニューのフォーマット
##10.12　チャレンジ！　より高度なタバーンメニューのフォーマット
　10.11と10.12の課題をまとめて回答する。
　難しかったのは、商品名(name)と価格(price)の間に入れる(.)のパッティングをどのように入れるかであった。パティングの入れ方は本書にはないようなので[ネットに掲載されているもの](https://pouhon.net/kotlin-format/1487/)を参考にした。もっといい（簡単な）既存の関数で処理する方法があればご教示いただきたい。

```kotlin#Tavern.kt
import java.io.File

val menuList = File("data/tavern-menu-items.txt")
    .readText()
    .split("\n")

fun main() {
    println()
    println("10.11 チャレンジ！　タバーンメニューのフォーマット")

    println()
    println("失敗例：商品名nameに含まれているスペースも＊に置換されてしまっている。")
    println("*** Welcome to Taernyl's Folly ***")
    menuList.forEach { data ->
        val (_, name, price) = data.split(',')
        print("%-22s".format(name).replace(" ", "*"))       // 分かりやすくするため＊を使用。最終的には．に変える
        println("%10s".format(price).replace(" ", "+"))     // 最終的には．に変える
    }

    println()
    println("成功例：")
    println("*** Welcome to Taernyl's Folly ***")
    menuList.forEach { data ->
        val (_, name, price) = data.split(',')
        print(name)
        for (i in name.length..21) {
            print("*")
        }
        println("%10s".format(price).replace(" ", "+"))
    }

    println()
    println("10.12 チャレンジ！　より高度なタバーンメニューのフォーマット")
    println()
    println("*** Welcome to Taernyl's Folly ***")
    menuList.forEach { data ->
        val (type, name, price) = data.split(',')
        // タイプを表示（商品名の右端と価格の左端を基準にセンターリングできるように工夫）
        var tab = ((31 - 6 - type.length) / 2).toInt()
        var spaceBlock =""
        for(i in 0.. tab){
            spaceBlock = spaceBlock + " "
        }
        println(spaceBlock + "～[" + type + "]～")    
        // 商品名と価格を表示
        print(name)
        for (i in name.length..21) {
            print(".")
        }
        println("%10s".format(price).replace(" ", "."))
    }
}
```


[第２章チャレンジ！答案](https://qiita.com/guijiu/items/dd3313f2a73401e29bc4)
[第３章チャレンジ！答案](https://qiita.com/guijiu/items/672b8daf014d4e6bb346)
[第４章チャレンジ！答案](https://qiita.com/guijiu/items/08dfa397b989b7ecdb3a)
[第７章チャレンジ！答案](https://qiita.com/guijiu/items/452cfa51bee6c4a4af9d)
[第８章チャレンジ！答案](https://qiita.com/guijiu/items/9a7871b1e41bdabd85e7)
[第１０章チャレンジ！答案](https://qiita.com/guijiu/items/9619abd4d5bf3488e58f)
[第１３章チャレンジ！答案](https://qiita.com/guijiu/items/5eda8682b1c05fa48c7d)
[Rails]enumを使ったデータの扱い方

今回、enumを使用してステータスの更新を行う機会があり、色々と調べて格闘しながら実装したので、
enumについて書いていこうと思います。

##環境##
Ruby : 2.6.3
Ruby on Rails : 5.2.4

##流れ##
１. enumとは
２. enumの書き方
３. 実装する上で困った事


##１. enumとは##
enumは配列を組んでカラム内に予めデータを格納し、取得や更新などの管理を行うことができます。
今回のようにデータの数、選択肢が決まっている場合に活用します。

実装した際はこちらの記事を参考にさせていただきました。
-【Rails】 enumとは? enumを用いてselectボックスを作ってみた
https://qiita.com/clbcl226/items/3e832603060282ddb4fd

##２. enumの書き方

今回は注文モデル（order）とそれに関連づいた注文商品モデル(order_product)に下記のようにステータスを持たせました。それぞれが連動するように実装するのですが、今回は省略します。
書き方はシンプルでkeyにvalueを持たせる形になります。

```order.rb
  belongs_to :customer
  has_many :order_products, dependent: :destroy

  enum status: {
    入金待ち: 0,
    入金確認: 1,
    製作中: 2,
    発送準備中: 3,
    発送済み: 4
  }

```
```order_product.rb

  belongs_to :order
  belongs_to :product

  enum making_status: {
    製作不可: 0,
    製作待ち: 1,
    製作中: 2,
    製作完了: 3
  }
```


##３. 数値で更新する

ステータスを更新する際、form_withを使って下記のような書き方をしていました。

```orders/show.html.erb

 <%= form_with model: order, url: admin_order_path(order), class:"update_status" do |f| %>
    <%= f.select :status, Order.statuses.keys %>
    <%= f.submit "更新", class:'btn btn-info' %>
  <% end %>

```

```orders_controller.rb
class Admin::OrdersController < ApplicationController

  def update
    order = Order.find(params[:id])
    order.update(status: order.status)
    redirect_to admin_order_path(order)
  end

end

```

この場合、例えばビューで「入金確認」を選択して更新すると、パラメータにはそのまま「入金確認」という文字列が渡されてしまいます。
問題なく動作はするのですが、
せっかくenumで管理してるのに数値でデータの受け渡しをしないのはどうなのか、、、と思っていました。

```orders/show.html.erb
  <%= form_with model: order, url: admin_order_path(order), class:"update_status" do |f| %>
    <%= f.select :status, options_for_select(Order.statuses.to_a, selected: order.status_before_type_cast) %>
    <%= f.submit "更新", class:'btn btn-info' %>
  <% end %>
```

そこで、このように渡す値を数値にするような書き方をしてみましたが、
これではString型で渡ってしまい、データの更新ができませんでした。

色々と調べていた結果、どうやらString型で渡したものをコントローラでInteger型に変換してあげる必要があるみたいです。

```orders_controller.rb
    order = Order.find(params[:id])
    status = params[:order][:status].to_i
    order.update(status: status)
    redirect_to admin_order_path(order)
```

これで無事数値でデータを更新することができました！
もう少し簡潔にできればいいのですが（できるのかもしれない）


今後も色々と使う機会が出てくるかもしれないので、しっかりと身に付けていきたい。
内容に不備、間違いがあればコメントいただけますと幸いです。
【Linux】NFSを利用してファイアウォール越しのNASをマウントする話

Linuxで勉強になったので残しておきます。
「これやっといてや。来週作業なんでよろしく」の一言から始まった作業です．．．
FW越しにあるNASをマウントしたいという要望に応えるために、業務で久しぶりにLinuxを触りました。
#環境
OS：Ubuntu 18.04
NFS v4
FWにはNFSでマウントするためにTCP 2049の穴を開けておく
NASはNFSに対応しているか確認しておく
#作業
最初にNFSクライアントをインストールする

```text:Ubuntu18.04
$ sudo apt upgrade \\\パッケージの更新
$ sudo apt install nfs-common　\\\NFSクライアントのインストール
$ rpcinfo -p \\\versの欄に4があれば問題ない
```

マウントの設定

```text:Ubuntu18.04
$ mkdir /mnt/nfs/test \\\マウントポイントの作成
$ vi /etc/fstab \\\マウント設定ファイルを編集するためにviコマンドで開く

viコマンドで開いたら以下の行を追加してください
NASのIPアドレス:/NASの共有ディレクトリ/ /mnt/nfs/test nfs rw,user,auto 0 0
```

NASのIPアドレス:/NASの共有ディレクトリ/ /mnt/nfs/test nfs rw,user,auto 0 0
この行はマウントオプションやファイルシステムを指定しています。
nfs：ファイルシステムの指定
rw：読み書き可能
user：一般ユーザでマウント可能
auto：mount -aでマウントできるようにする
0 0：ファイルシステムをバックアップせず、fsckコマンドでファイルシステムをチェックしない

ここまで実行出来たらマウントを行っていく

```text:Ubuntu18.04
$ sudo mount -a \\\マウントコマンドの実行
$ mount \\\オプションをつけないで実行すると現在マウントされているものが出力される
/etc/fstabに記載した行が出力されていれば成功している
```

実際にマウントポイント配下に空のファイルを作成してみる

```text:Ubuntu18.04
$ touch test \\\空のテキストファイルを作成している
```

ここまで実行したらNASの共有ディレクトリを確認して、testファイルが作成されていれば成功
#感想
LPIC level 1を取得してからLinuxは触る機会がなかったので良い刺激になった。
資格取得によってそこそこ知識を活かす事が出来た気がする。
【Unity×VSCode】UnityEngine, MonoBehaviour 等、もろもろが認識されてないんだけど？

本記事は、こんなエラーが出た人の役に立つかもしれません：

```Console
The type or namespace name 'UnityEngine' could not found.
The type or namespace name 'MonoBehaviour' could not found.
```

# ◤ 環境（2020-12-16時点）

- Windows 10 Home だいたい最新
- Unity 2019.4系～2020.1系
- VS Code だいたい最新（Unity に連携済み）

# ◤ まえおき

「テキストエディタ VS Code でスクリプトを編集しようと思ったら、エラーが千件単位で出てるんだけど？何なら万単位で出てるんだけど？」となった場合、VS Code で `Ctrl + Shift + M` を押し、`PROBLEMS` を確認しましょう。おそらく、冒頭のようなエラーコードが混じっているのではないでしょうか？（違ったらごめんなさい。）

調べてみると、Unityを再インストールしなくてはならないと言う記事がヒットすることもありますが、忙しいときにはやりたくないものです。今回はそんなときの対処法について書きます。

（根本解決ではないですが、そもそも本事例は特定のバージョンに依存したバグではないので、とりあえず「ふーん、そういう解決方法もあるんだー」程度に読むと良いです。）


# ◤ 参考リンク

- VSCodeでUnityの補完が効かなくなったときの解決方法（OmniSharpの問題） – ゆーじのUnity開発日記  
https://unity-yuji.xyz/vscode-unity-omnisharp-netframework-mono/

ほとんどのワークアラウンドがこの記事に載っているので、まずはこちらを読むと良いです。
当記事で紹介していない対処法についても、まとめてあります。


# ◤ 対処法

普段、自分が行っている手順を示します。
そのときによって原因が違うのですが、自分の環境では次の手順のどこかで解決します。

## ⫸ Phase 1
1. まず、プロジェクトフォルダをエクスプローラーで開き、ルートにある `.csproj` と `.sln` を全て削除します。（cf. [複数選択の記事](https://qiita.com/liveasnotes/items/0ad8c72a4e10bce41765)）
2. VS Codeを終了し、Unityエディタでスクリプトファイルをダブルクリックして、再度 VS Codeを立ち上げます。
3. （しばらく待ち、正常に稼動すればOKです。エラーが直らない場合は次へ進みます。）

## ⫸ Phase 2
1.  VS Code の設定を開き（ `Ctrl + ,` する）、`omnisharp use global mono` 等で検索をかけます。
2.  `Omnisharp: Use Global Mono` の項目で、ドロップダウンリストを操作します。どの項目に設定するかは任意ですが、この操作を行った際に、`OmniSharp Server` の再起動ボタンが表示されます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253921/5ebbbeae-aa7f-70e8-9672-2d3fbef40d2f.png)  
 これをクリックして、サーバーを再起動します。
3. `Ctrl + Shift + U` で `OmniSharp Log` を選択し、`OUTPUT `を眺めておきます。しばらく待つと、処理が終了します。
4. （この時点で VS Code 側において `MonoBehaviour` 等のエラーが消えていれば問題ありません。解決しない場合は、次へ進みます。）

## ⫸ Phase 3
 1. プロジェクトフォルダを確認し、`.csproj`と`.sln`が再生成されていないことを確認します。されている場合は、念のため削除します。
 2. 必要に応じて、`Ctrl + S` 等したうえで、Unityエディタと VS Code を終了します。その後、再度 Unity Hub からプロジェクトを開きます。
 3. Unityエディタの再起動後、Projectウィンドウから任意のスクリプトを選択し、VS Code を開きます。
 4. VS Code 側が正常に稼動していることを確認します。

# ◤ さいごに

以上の手順を踏めば、自分の環境ではエディタがきちんと動作するようになります。
ほかのより良い方法や、根本解決／未然防止の方法を知っている方がいれば、ぜひコメント等で共有していただければと思います。

# ◤ 追記

「ちゃんと VS Code に拡張入れて、Unity にも Package Manager から Visual Studio Code Editor 入れて、Preferences > External Tools で Generate .csproj for に全部✅入れて、プロジェクトをいったん閉じて Library フォルダ消したあと再起動して、VS Code も再起動かけてるのに、名前空間が怒られるよ～(´;ω;｀)」という方は、Visual Code Editor のバージョンが Unity エディタに合っているか確認してください。例えば Unity 2019 では、2020年内リリースのバージョンでないとエラーが出る（最新のパッケージならOKというわけではない）ことを確認しています。
matplotlib でX軸にラベルに時間（分）を使うときのサンプル



#テストデータ

```python
import pandas as pd 

tm=pd.date_range("2020/2/3 9:00" ,"2020/2/3 11:00" , freq="60min")

dt1=range(len(tm))
dt2=range(0,-len(tm),-1)

df=pd.DataFrame({"tm":tm , "dt1":dt1 , "dt2":dt2})

print(df.to_markdown()) 

```

|    | tm                  |   dt1 |   dt2 |
|---:|:--------------------|------:|------:|
|  0 | 2020-02-03 09:00:00 |     0 |     0 |
|  1 | 2020-02-03 10:00:00 |     1 |    -1 |
|  2 | 2020-02-03 11:00:00 |     2 |    -2 |

#X軸を共有にして2つのグラフを書く。その時、横軸は1分おきに軸線を書き、5分おきにラベルを書く
```python
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

#sharex="col"でX軸を共通にする
fig ,ax = plt.subplots(2 , 1, sharex="col", figsize=(10 , 20))

ax[0].plot("tm" , "dt1" ,data=df)
ax[0].grid(True)

ax[1].plot("tm" , "dt2" ,data=df)
ax[1].grid(True)


#x軸の描画の範囲を指定。これを入れないと、時刻がうまくそろわない
ax[1].set_xlim(tm[0] , tm[-1])   


#5分おきにラベル
Minute1=mdates.MinuteLocator(range(60),5)   
ax[1].xaxis.set_major_locator(Minute1)

#1分おきに軸線
Minute2=mdates.MinuteLocator(range(60),1)   
ax[1].xaxis.set_minor_locator(Minute2)

#H:M のフォーマットでラベルを書く
Minute_fmt = mdates.DateFormatter('%H:%M')  
ax[1].xaxis.set_major_formatter(Minute_fmt)


#縦書きの指定
plt.setp(ax[1].get_xticklabels(), rotation=90, ha="right")

#表示
plt.show()
```
#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468328/f8796944-dfe5-4855-e87d-fe6c8f4e633c.png)


#参考
[matplotlibでx軸の時刻情報をフォーマットする](https://hack-le.com/matplotlib-x-date-format/)
[dates.MinuteLocator](https://matplotlib.org/api/dates_api.html?highlight=minutelocator#matplotlib.dates.MinuteLocator)