OmniAICreator/Qiita-1.07M huggingface dataset:
TCP/IPプロトコルについて

#そもそもプロトコルってなに？
・コンピューター同士がネットワークを利用して通信するために決められた約束ごとのこと！

#なぜプロトコルは必要なの？
・メーカーやOSが違うコンピューター同士が通信するためには、同じ仕様でやり取りする必要がある。
・そのためにプロトコルがあり、同じプロトコルを使用するという同意があるからこそ、様々なコンピューター同士が通信出来ている。

#TCP/IPって？
・下記の二通りの意味で使われているよ。
**①TCP・IP というプロトコルを指す意味**
**②TCP・IP を中心としたインターネットを構築する上で必要なプロトコル郡の総称を指す意味**
※おおくは②の意味で使われることが多いよ。

#TCP/IPの階層モデルについて
・インターネットでコンピューター同士が通信する一連の処理を4階層で大まかに表現したもの！通信に必要な機能全体を整理しているよ。

| 各層の名称|各層の役割 |各層のプロトコル例|
|:-----------------------------------|:------------------|:-------------------|
|アプリケーション層|アプリケーション同士が会話する役割 |HTTP、DNS、SSH、SMTP|
|トランスポート層|データの転送を制御する役割|TCP、UDP|
|ネットワーク層|IPアドレスを管理し、経路を選択する役割|IP、ICMP、ARP|
|ネットワークインターフェース層|直接接続された機器同士で通信する役割|Ethernet、PPP|

#各層の詳細な役割について

**↓メール送信を例に各層の役割について見ていくよ。**

**＜アプリケーション層＞**
・文章を入力してデータを送信する。
・相手先のコンピューターの容量が足りなくてメール送信が出来なった場合のエラー対応。
・文字コード処理
**＜トランスポート層＞**
・通信路の確保（コネクションの確率）
・通信終了後のコネクションの切断
**＜ネットワーク層＞**
・相手先のコンピューターのアドレス宛にデータを配達する（パケットを届ける）
**＜ネットワークインターフェース層＞**
・NIC（LANを使用するための部品）を利用してデータをLANへと送信する

**主なデータの流れは・・・？**
・データは上の層から下の層へ順番にデータが伝えられるよ。
・その際に上位層から渡されたデータに自分の階層のプロトコル処理に必要な情報をヘッダーとして付与するよ。
・送信側で作成されたデータはルーターを通して相手側に届けられるよ。
・受信側では受け取ったデータを処理して該当する層のヘッダーとデータを分離してデータを上位層に渡していくよ。
・このようにして送信データが元のデータに戻って最終的に受信側に届くようになっているよ。
マネーフォワードからの出金お知らせをラインに通知する

# やったこと
Google APP Scriptでマネーフォワードからのメールを定期取得
LINE Notify APIを使用してメール本文をLINEに通知
<img width="375" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/77fc80ca-2174-43dd-f174-9edffca353a2.png">
# なぜやるのか
- 不正利用やサービスの解約し忘れで意図せず引き落とされてないか怖い
- できるだけリアルタイムに通知を受け取りたい
- 複数のクレジットカードを使用しているので、それぞれの明細を把握するのは手間
- Gmail見る頻度低いので日常的に目に触れるLINEに通知したい

# なぜGoogle APP Scriptか
- マネーフォワードにLINE通知機能はない
- IFTTTはLINE通知できるが、Gmailをアクション元に設定できない
- ZapierはGmailをアクション元に設定できるが、LINE通知できない

--> 仕方ないのでGoogle APP Scriptで書く

# 本題
## Gmail側の設定で送信元メールアドレスがマネーフォワードのメールにラベルを付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/e10dfb1d-e764-7838-b266-e5a72cafb04f.png)
ラベルを付けるとlabel:"ラベル名"で検索できるようになります。

## LINE通知に必要なトークンを取得する
LINEに通知はLINE Notify APIを使用します。

以下の記事が分かりやすく説明されていました。
[[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)

## Google APP Scriptで直近30分間に受信したラベルのついたメールを取得してLINEに通知

以下のコードを書く。

```javascript
var lineToken = "ラインのトークン"
var interval = 30
var label = "ラベル名(今回はmoney_forward)"

function fetchMoneyForwardMail() {
  //取得間隔
  var now = Math.floor(new Date().getTime() / 1000);
  var time = now - (60 * interval);
  var searchCond = '(label:' + label + ' after:' + time + ')';

  var thread = GmailApp.search(searchCond);
  var messages = GmailApp.getMessagesForThreads(thread);
  var formattedMsgs = [];
  for (var i = 0; i < messages.length; i++) {
    formattedMsgs[i] = "\n【date】: " + messages[i].slice(-1)[0].getDate() +
      "\n【Subject】: " + messages[i].slice(-1)[0].getSubject() +
      "\n【Body】: \n" + messages[i].slice(-1)[0].getPlainBody().slice(0, 200);
    return formattedMsgs;
  }
}

function send_line(message) {
  var payload = {
    'message': message
  };
  var options = {
    "method": "post",
    "payload": payload,
    "headers": {
      "Authorization": "Bearer " + lineToken
    }
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

function main() {
  newMessages = fetchMoneyForwardMail()
  if (newMessages && newMessages.length > 0 && newMessages.length < 50) {
    for (var i = newMessages.length - 1; i >= 0; i--) {
      Logger.log(newMessages[i])
      send_line(newMessages[i])
    }
  }
}
```

## Google APP Scriptの時間ベースイベントで上記処理を30分に一度実行する

以下のように設定します。
[GASのスクリプトを指定した時間に自動で実行する方法](https://www.pnkts.net/2019/12/06/gas-trigger)

以上です！
C++でchar型をstring型に入れる方法

#概要
- char型をstring型に入れることができない
- **ostringstream**を使うと解決できる

#直接代入しちゃダメ
AtCoderで問題解いてるときにchar型をstring型に入れようとしたのですが、エラーが出てしまったので解決法を記します（他にいい方法は沢山ありそうですが）

```c++

#include <bits/stdc++.h>
using namespace std;

int main(){
    char c = 'a';
    string s = c;
    cout << s <<endl;
}
```
このコードだと以下のようなエラーが出てしまいます

```
hoge.cpp: In function 'int main()':
hoge.cpp:15:16: error: conversion from 'char' to non-scalar type 'std::string' {aka 'std::__cxx11::basic_string<char>'} requested
   15 |     string s = c;
      |                ^
```

#ostringstreamを使おう
ostringstreamを使うとこのような場合でも代入することができます

```c++

#include <bits/stdc++.h>
using namespace std;

int main(){
    char c = 'a';
    ostringstream oss;
    oss << c;
    string  s = oss.str();
    cout << s <<endl; 
}
```
パソコンとかのコマンドをまじめに理解する（cdコマンド）

#目的
仮にwindows10の話とする。
**cdコマンド**というのがある。
help cdとすると、以下のヘルプが出る。（前半部分のみ表示）

```
現在のディレクトリを変更したり、ディレクトリ名を変更したりします。

CHDIR [/D] [ドライブ:][パス]
CHDIR [..]
CD [/D] [ドライブ:][パス]
CD [..]

  ..   親ディレクトリに変更するときに指定します。

```
もう少し、説明して欲しい。

#説明して欲しい内容

以下のサイト
Linuxゲリラ戦記
cdコマンドの使い方
(https://www.garunimo.com/program/linux/cd.php)
では、(linuxになるが、)
以下のような具体的な説明がある。

<img width="462" alt="cdコマンド.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481161/b075f8c7-c914-224d-df02-8afb4af5c85c.png">

しかし、もっと、例えば、
**cd .**
とかについてとか、仕組みを説明して欲しい。

# 動作させた結果


```
C:\_qiita\cd\cd1\cd2\cd3\cd4>cd .

C:\_qiita\cd\cd1\cd2\cd3\cd4>cd ..

C:\_qiita\cd\cd1\cd2\cd3>cd ../../

C:\_qiita\cd\cd1>cd C:\_qiita\cd\cd1\cd2\cd3\cd4

C:\_qiita\cd\cd1\cd2\cd3\cd4>cd ../

C:\_qiita\cd\cd1\cd2\cd3>cd ../././././../

C:\_qiita\cd\cd1>cd C:\_qiita\cd\cd1\cd2\cd3\cd4

C:\_qiita\cd\cd1\cd2\cd3\cd4>cd ../

C:\_qiita\cd\cd1\cd2\cd3>cd ./cd4/../..

C:\_qiita\cd\cd1\cd2>
```

要するに、
**「/」は、区切りで、「.」は、変化なしで、「..」だけ意味があり、一つ上にいく**
ということか。
**「/」の区切りは、コマンドの最後ならば、最後なので区切られているから不要**

#今後

納得していないコマンドの動作が、いろんなところで、綻びを生じさせている気がしたので、
模索しただけなので、
これについては、特にありません。
check_boxとradio_button

##チェックボックスとラジオボタンを作ろう
今回はラジオボタンはスムーズに出来たのですが、チェックボックスで少し苦戦したのでメモをしたいと思います。

##説明
小説サイトを練習として真似して作成中です。

まず最初に、タイトルやキーワード、小説のジャンルなどを纏めるテーブル
novel_listsテーブルを作りました。

続いて、今回のチェックボックスとラジオボタン部分です。
**・　novel_keyword** キーワード
**・　genre**　ジャンル

二つのカラムを作りました。

##novel_list.rb

こちらにenumを使って配列を作りたいと思います。

```
ジャンルの配列
enum genre:{
    different_world: 1, #異世界
    real_world: 2, #現実世界
    high_fantasy: 3, #ハイファンタジー
    low_fantasy: 4, #ローファンタジー
}
キーワードの配列
enum novel_keyword:{
    status_difference: 1, #身分差
    year_difference: 2, #年の差
    non_love: 3, #非恋
    villain_daughter: 4, #悪役令嬢
```

###配列が出来た所で、フォームです。novel_listsのnew.html.erbに今回は作成します。

```
<%= form_with(model: @novel_list, local: true) do |f| %>
form_withの中に今回は作っていきたいと思います。

        <%= f.radio_button :genre, :different_world, checked: "checked" %>
        <%= f.label :genre, "異世界", class: "different_world" %>
        <%= f.radio_button :genre, :real_world %>
        <%= f.label :genre, "現実世界", class: "real_world" %>
        <%= f.radio_button :genre, :high_fantasy %>
        <%= f.label :genre, "ハイファンタジー", class: "high_fantasy" %>
        <%= f.radio_button :genre, :low_fantasy %>
        <%= f.label :genre, "ローファンタジー", class: "low_fantasy" %>

まずはラジオボタンですね。
第一引数部分にカラム名としてgenre　　第2引数部分にプロパティ名　
最後にオプションとして、checked:"checked"　これを入れる事で最初に異世界のラジオボタンにチェックが入った状態となります。
ちなみにradio_buttonは一つしか選択が出来ません。


続いて・・・チェックボックスです。こちら苦戦して、teratailで質問しました。後半URL置いておきます。

<%= f.check_box :novel_keyword, {}, :status_difference, nil %>
        <%= f.label :novel_keyword, "身分差", class: "status_difference" %>
        <%= f.check_box :novel_keyword, {}, :year_difference, nil %>
        <%= f.label :novel_keyword, "年の差", class: "year_difference" %>
        <%= f.check_box :novel_keyword, {}, :non_love, nil %>
        <%= f.label :novel_keyword, "非恋", class: "non_love" %>
        <%= f.check_box :novel_keyword, {}, :villain_daughter, nil %>
        <%= f.label :novel_keyword, "悪役令嬢", class: "villain_daughter" %>

<%= f.check_box :novel_keyword, {}, :status_difference, nil %>
# 第1引数：カラム名
# 第2引数：オプション
# 第3引数：チェックされたときのvalue
# 第4引数：チェックされてないときのvalue
とわかりやすく教えて頂きました。後は、radio_buttonと同じくlabelを付けて出来上がりです。
```

##今後の試行錯誤・・・

今回このようにチェックボックスや、ラジオボタンを作りましたが。
collectionなどを使って、モデルデータから.allで作成などしてる記事があったので
カラムのデータだけをチェックボックスとして取得。などそういった事が出来るのではないかと思われます。
検索しつつ、自分でも試行錯誤してみようと思います。

現在の状態だと、多くなるほどコードが見にくいです。これが２行で収まればとても良いと思います。
またわかり次第載せたいと思います。

https://teratail.com/questions/243125

今回質問した際のURLです。

参考にした記事も載せて頂きました。大変わかりやすかったです。
さらに、
```システムのDBとしてpostgresqlを使っているのであれば、1カラムに対して配列をinsertすることができたと思います。
との情報も頂いたので検索して見たいと思っています。```

以上今回のメモでした。
基本情報技術者　ストラテジ系　第2章 経営戦略②


# オペレーションズリサーチ
問題の最適化に関する内容です。

## 線形計画法の例
基本提示された条件から
下記のような内容を設定していき最適解を出します。

### 前提条件

### 定式化

### 目的関数

## 意思決定の例

### マクシマックス原理
最大利益に注目して、利益が最も大きくなる選択肢を選びます。

### マクシミン原理
最小利益に注目して、利益が最も大きくなる選択肢を選びます。

## 在庫管理

### 定期発注方式
厳密な管理が可能

### 定量発注方式
管理コストが低く抑えられる

### 2ビン方式
2つの棚を用意し片方の棚を使い追えたら発注

## 在庫管理の用語

### 安全在庫
予備にとっておく在庫

### 経済的発注量
保管費用と発注費用のバランスがとれている発注量
Django on Herokuでmigrateをデプロイ時に自動実行する

## 結論

`release: python manage.py migrate`

をProcfileに書いておく

## 参考
- [公式doc](https://devcenter.heroku.com/articles/release-phase#specifying-release-phase-tasks)
- [Herokuでデプロイと同時にrake db:migrateを実行する](https://qiita.com/m_nakamura145/items/2eafb2dc9f8a459670b6)
なんとなくPHPStanを導入したときのメモ（まだ未解決

いれる。

```
composer require --dev phpstan/phpstan
```

```
$ vendor/bin/phpstan analyse app
 226/486 [▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░]  46%PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 135168 bytes)
```

メモリ不足で落ちてしまう。

これで実行してみる

```
php vendor/bin/phpstan analyse app --memory-limit=1G
```

なんか色々無いぜってエラー言われた。

```
Class NAMESPACE\Class was not found while trying to analyse it - autoloading is probably not configured properly.
```

のように出たときはautoload周りがうまく行ってない。
laravelみたいにcomposerでやるだけなら自動的にvendor/autoload.phpを読んでそれで良いのだがphalconとかだとディレクトリを読ませないといけない

```phpstan.neon
parameters:
  level: 0
  paths:
    - app
  autoload_directories:
    - app/controllers
```

こういうの。

こういうのを解決していったら2800エラーが78エラーくらいになったのだが、修正をしたもののDIならではの問題を対処することが出来ず、一旦放置する。
【SwiftUI】Listで削除Alertをだす

SwiftUIでリストの削除時にアラートを出す方法です。

こうして

<img width="200" alt="iPhone_11_—_13_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195882/13bb139c-7583-1284-d60b-6cc03205ffa1.png">

こうするやつです

<img width="200" alt="iPhone_11_—_13_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195882/83db57f4-4a28-890a-10c4-e772723adec9.png">


### ポイント

1. `onDelete`メソッドを使いますが、`List`ではなく`ForEach`のメソッドなので`ForEach`を使います。
2. `alert`モディファイアを使いますが、`isPresented`ではなく、`item`を使います。（何こ目の要素かを取得するため）
3. `item`は`Identifiable`です。

```swift
import SwiftUI

struct ContentView: View {
    @State var deleteAlert:Bool = false
    @State var item: Item?
    
    func showDeleteAlert(offsets: IndexSet) {
        self.item = Item(id: String(offsets.first!))
    }
    
    struct Item: Identifiable {
        var id:String
    }
    
    var body: some View {
        List {
            ForEach(0..<5, id: \.self) { id in
                Text(String(id))
            }
            .onDelete(perform: showDeleteAlert)
            .alert(item: self.$item) { i in
                Alert(title: Text(i.id + "を削除しますか？"),
                      primaryButton: .destructive(Text("Delete")) {
                        // deleteの処理
                    },
                      secondaryButton: .cancel() {
                    }
                )
            }
        }
    }
}
```

## 参考

https://qiita.com/1amageek/items/e90e1cfb0ad497e8b27a
https://fuckingswiftui.com/#alert
https://www.hackingwithswift.com/books/ios-swiftui/using-alert-and-sheet-with-optionals
GlideApps Relationまとめ

# はじめに

この記事はGlideAppsのRelationについてまとめたものです。

今回使用したデータは次の通りです。

**会社データ**
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/58b904af-0584-b68e-e87e-828c31164ec3.png)

**社員データ**
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/884eb266-9574-f730-97e4-918f1a23b485.png)

# Relationとは

Relationとは指定した値をキーにしてデータとデータを結びつける機能です。マスターデータの取得や親子関係のデータを作成するのに役立ちます。

本記事では会社に所属している社員のデータを作成します。少し具体的に書くと、会社データの名前をキーにして、社員データの勤め先にマッチするデータが存在した場合に社員データの名前を取得します。

Relationのイメージが湧きにくい方のために、先に完成したデータをお見せしておきます。右側の「社員」項目のデータが社員データから取得したデータです。（「社員」項目のデータは一部しか表示されていません）
![04b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/a131962d-209e-e5e4-f4ce-58d1d0673a77.png)

# 操作方法
画面左の［Data］（楕円が3枚重なったボタン）をクリックし、［Add Column］をクリック。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/3d9bd0a0-80a1-c0eb-665a-d1d91f153b33.png)

次の画面が出現するので、次の通りに入力して［Done］をクリックします。


- Label: 社員（Relationで追加される項目の任意の名前）
- COLUMN TYPE: Relation
- CONFIGURATION
    - Relate to items where the value in: 会社データの名前（データ取得元のキーとなる値）
    - Matches the value in: 社員データの勤め先（データ取得先のキーとなる値）
- Match multiple: チェック（取得するデータが複数存在する場合にチェックをつける）

![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/6de6c3fa-4cac-17e7-0d7a-30f23cb8062d.png)

以上でRelationデータの完成です！（この画面では全ての社員データは表示されていません）
![04b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/8908cb2c-3fad-6c9f-f449-bb0070cba937.png)

Relationデータを活用すると次のような親子データの表示も可能です。
![04c.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/cbcd307f-d52f-4839-8476-02e097cae038.png)

# 同じデータ内のRelationも可能
ちなみにRelationは１つのデータ内でも作成する事が可能です。操作方法も一緒です。

今回は社員データの名前と上司を使って、部下データを作成してみましょう。

先ほどと同様に、画面左の［Data］（楕円が3枚重なったボタン）をクリックし、［Add Column］をクリック。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/d0a00924-4b5b-b104-3328-4a2f7deb6735.png)

次の画面が出現するので、次の通りに入力して［Done］をクリックします。


- Label: 部下（Relationで追加される項目の任意の名前）
- COLUMN TYPE: Relation
- CONFIGURATION
    - Relate to items where the value in: 社員データの名前（データ取得元のキーとなる値）
    - Matches the value in: 社員データの上司（データ取得先のキーとなる値）
- Match multiple: チェック（取得するデータが複数存在する場合にチェックをつける）
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/a2dda82e-bc06-302f-13f4-0fe58fee5cf4.png)

次の通り、部下データが作成されました。部長Zの部下に（「上司」項目に部長Zが設定されている）課長Zが登録されているのが分かります。
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128060/b33d6957-342d-cb53-cd3e-3826c898f22f.png)

# 最後に
Relationは親子データの作成の為に学びました。１画面で両方のデータを見たいケースは多々ありますので良い機能を知る事ができました。

しかし、キーが１つしか指定できないので、マスターデータの取得に対しては役不足と感じる事もあると思います。（キーにしたい複数の項目の値を連結させた値をRelationのキーにすれば、実質複数のキーを使ったRelationになるとは思いますが...）

Glideのようなサービスを使用する場合は、機能や制限を良く理解して、目的にマッチしているかどうかを判断する必要があると改めて思いました。
PycharmでDjangoアプリケーションの作成まで（めちゃめちゃハマった。）

#■環境
　Pycharm　2019.3.2（community　Edision）
　Python3

#■手順
##　①プロジェクトの作成
　　Pycharm　　File－NewProject
　　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/596dd446-650f-a4f2-472f-c5217d11ad50.png)


##　②Baseinterprerの設定確認
　　Python.exe　を指定していることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/e96004ba-aad5-af13-88bf-0ae06060b245.png)


##　③Djangoのpip（Terminalでも可能）
　　File－settingsープロジェクト名ーProject Interpreter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/a6aa8591-db07-4ab9-1e0c-acd8e23e6234.png)


## ④右上＋の後、以下でdjango検索し、InstallPackge
　successfuly　でOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/e93be889-89fd-0a88-ba08-ac1639f0b5a0.png)


## ③Djangoバージョン確認（ターミナル）
　(venv) C:\User\XXXXXX（プロジェクト）>python -m django --version

　3.0.3　←　バージョン表示されたらOK

## ⑤プロジェクトへのDjangoプロジェクト作成
　ターミナルにて

　python　C:\xxxxx\プロジェクト名\venv\Scripts\django-admin.py　startproject　DJANGOプロジェクト名

以下のようにフォルダ出来上がればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547159/29c2d5b3-d5f5-05c2-1ef9-2200bebee82f.png)



## ⑥プロジェクトへのDjangoアプリケーション作成
　ターミナルにて

　python　C:\xxxxx\プロジェクト名\XXXXXX\manage.py　startapp　アプリケーション名

以上

＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
ハマったことは以下です。1日かかりました。情けない。。

１．当初Anaconda+Pycharmでやってたのですが、pipコマンドがきかず。。anaconda無しにしたら、大丈夫になりました。

２．Python django-admin.py　startproject　プロジェクト名が
　できず、ハマりました。
　・プロジェクトのカレントディレクトリにして、
　・Pythonのインストール先をPycharmと同じ場所にしました。
　なんとか、コマンドが通りました。

３．結局、コマンドライン、ターミナルで作成する方が良いです。Pycharmは使わない方がわかりやすいです。
　　↓コマンドライン、ターミナルで作成する方法はこちら
　　![ターミナルによるDjangoアプリケーション作成まで（開発環境）](https://qiita.com/oporimaster/items/4ec4809284cddd8b4ba0)


以上
Tecpitの教材「楽曲をリアルタイム検索してみよう！【React】」を試してみました / TechCommit企画

[テックコミット](https://www.tech-commit.jp/)さんのお年玉企画でTecpitさんの「楽曲をリアルタイム検索してみよう！【React】」を試させていただきましたので、情報をまとめて見ました！

###教材の概要
検索したキーワードに応じて、リアルタイムでitunsAPIから情報を引用し、
キーワードにhitしたアルバムや曲情報を50件まで画面に表示させます。
実際の概要[ https://www.techpit.jp/courses/530899/lectures/9701851 ]
progateのjs ES6を一度やっておくことを推奨されています。

Reactを使い、ハンズオン形式（テキストベース）で作る教材でした。
一般公開しているAPIデータを引っ張ってくるので、データベースとかは使いません。
フロント側だけの技術で作ることができるコンテンツになります。

###自分の前提知識
JavaScriptのFWはVue.js、react、redux、backboneもオンラインスクール/ネット情報でざっと基礎的な動作を学んだことがあります/
が、Vue以外は触った時間も短く、ほぼ忘れている状態ですw


###この教材で学べる知識
・yarnを使ったreact関連データのインストール方法
・Reactの基本的な書き方（renderやメソッド、ライフサイクルなんか）
・Componentの作成と相互データの受け渡し
・Parcelを使ったバンドル
・axiosによる非同期でのデータの引用方法
・RsJSの概要

progateでjsを学んだだけであれば、全てが新しい知識になるので少し敷居は高いかもしれません。
ただ、それぞれの項目に基本的な概念などはきちんと書いているので「これはこういうものなんだ」という概要理解までは問題なくできると思います。

yarnは何度か使ったことがありますが、バンドルは今まではvue.jsやreactを使うときにはwebpackとかで構築してたのでparcelという簡易的なものがあるんだーということを知れて良かったです。
あとは検索ボタンで検索ではなく、文字入力で非同期検索を少し時間差で行う処理をRsJSというものでやっています。
これも初めて知りました。うっすらと覚えときたい！


###少しカスタマイズしたところ/実際の動き
itunesの検索結果は50件までしか取得できないのですが、
せっかくなので11件以上の検索結果があれば「次へ」「前へ」を出すようなページネーションの動作を行いました。APIのhit件数に応じて、ページネーションコンポーネントを出すかどうかをif判定しているような感じです。
参考：　http://bashalog.c-brains.jp/19/10/04-164802.php 

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/8348379a-b5eb-3242-016a-54bab8de359d.gif)
フロントの表示は、背景画像や2列並び、ページネーション出すようにしたくらいのカスタマイズになります。

##全体の感想

環境構築について、parcelなんかでのバンドル方法は見たことがなかったのですが
シンプルな反面、キャッシュファイルを大量に作るなど癖もあるような印象もあったので、
初めてやる人でも、参考情報が多いイメージのあるwebpackでの構築でも良いのかなーと思いました。

良かったところとして、前述したように、それぞれの説明が概要理解まではできるようになっており、また説明もわかりやすかったです。
特にコンポーネント間の関連性の説明がわかりやすく、より理解を深められたと思います。

ただ、もちろん概要までなので、きちんと自分の中に落とし込むにはドキュメントなどの情報も読んだり、自分でも何度か作って見る必要はあると思います。

また、記述ミスや、公開後の処理についてうまくいかないところがあり質問なども結構たくさん投げているのですが、きちんと丁寧に答えていただき、とてもありがたいなと思いました！


お読みいただき、ありがとうございました！
Arch Linux における OpenSSH の設定

# インストール

[openssh](https://www.archlinux.org/packages/?name=openssh) パッケージをインストールします。

```console
# pacman -Syu openssh
```

以下のコマンドを実行することで、コンピュータの起動時に自動的に SSH サーバーが起動するようになります。

```console
# systemctl enable sshd
```

# クライアントの設定

`~/.ssh` ディレクトリを作成し、秘密鍵と公開鍵のペアを生成します。

```console
# mkdir .ssh
# chmod 700 .ssh
# cd .ssh
# ssh-keygen -t rsa -b 4096 -C "{email}"
```

何らかの方法でサーバーに公開鍵を転送します。

```console
scp ~/.ssh/id_rsa.pub {user}@{host}:/home/{user}/id_rsa.pub
```

サーバーへの接続時にユーザー名・ポート番号・秘密鍵の指定を省略するため、以下の内容で `~/.ssh/config` ファイルを作成します。

```config:~/.ssh/config
Host {host}
  HostName {host}
  IdentitiesOnly yes
  IdentityFile ~/.ssh/id_rsa
  Port {port}
  User {user}
```



# サーバーの設定

クライアントが作成した公開鍵を `~/.ssh/authorized_keys` に追加し、パーミッションを設定します。

```console
% mkdir ~/.ssh
% cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
% rm -f ~/id_rsa.pub
% chmod 700 ~/.ssh
% chmod 600 ~/.ssh/authorized_keys
```

セキュリティ強化のため、下記の設定を行います。

```config:/etc/ssh/sshd_config
# 不正アクセス防止のため、ポート番号をデフォルトの 22 から変更する。
# 衝突の可能性が高い Well Known Ports と Ephemeral Port の使用は避ける。
# 具体的には 1024-32767 の範囲で選択することを推奨。
Port {port}

# root ユーザでのログインは完全に禁止する。
# 管理者権限が必要な場合は一般ユーザでログインして sudo を使用する。
PermitRootLogin no

# 安全性の低いパスワードに認証は禁止し、常に秘密鍵を使用する。
PasswordAuthentication no
```

設定を反映するため、sshd を再起動します。

```console
# systemctl restart sshd
```

# 使い方

`ssh` コマンドでサーバーにログインします。

```console
% ssh {host}
```

ファイルを転送するには `scp` コマンドを使用します。

```console
% scp {localPath} {host}:{remotePath}
```
Webサイト 固定幅の解除


#はじめに
最近ではフルHDやそれ以上の解像度のディスプレイが当たり前のようになってきましたが、ネットのサイトでは意外とそれを活用できていないと思ったことはありませんか？
と言っても、何のことか分からない方は、以下のImpressのPC Watchの例をご覧下さい。
左右に大きな余白があるのが分かると思います。
![pcwatch_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577966/82d0e912-6491-0f58-5186-25662b576aa5.png)
(https://pc.watch.impress.co.jp/)
これは、記事の表示幅を必要以上にせまくしているからなのです。
そこで、ちょっとだけ設定を変えてあげることで、余白のところもキチンと活用できるようにする方法をご紹介します。

#Stylusのインストール
ブラウザがChromeやFirefoxであれば、Stylusをインストールするのが簡単です。
https://addons.mozilla.org/ja/firefox/addon/styl-us/ (Firefox)
https://chrome.google.com/webstore/detail/stylus-beta/apmmpaebfobifelkijhaljbmpcgbjbdo/ (Chrome用ベータ版)
https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne/ (Chrome用安定版:なぜかリンク切れ)

#スタイルのインストール
アドオンをインストールしたら、スタイルをダウンロードします。
ここでいうスタイルとはCSSを変更するものになっています。
様々なスタイルがダウンロードできるのが[[userstyles.org]](https://userstyles.org/)です。
ここで、Impressのサイトの余白を活用できるようにCSSを改変する[[拙作のスタイル]](https://userstyles.org/styles/134703/impress-co-jp-article-width-adjuster)をご紹介します。
https://userstyles.org/styles/134703/impress-co-jp-article-width-adjuster
サイトを開いたら"Install style"でスタイルをインストールします。
あとは、アドオンの設定画面からスタイルを有効(スタイル名の前のチェックボックスをチェック)すれば準備OKです。

#スタイル適用後のサイト
さっそく適用後のサイトを見てみましょう。トップページではあまり御利益もありませんが(笑)
![pcwatch_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577966/de63ef6b-a066-62a4-5ced-6c59bbb73ff5.png)
(https://pc.watch.impress.co.jp/)
記事のページでは効果が大きく見えてきます。余白がなくなって、記事がウィンドウ一杯に広がって見えるのが分かりますでしょうか。大きなディスプレイで画面一杯に広がりすぎる場合は、ウィンドウを小さくすれば、それに合わせて記事も調整されます。
![pcwatch_after2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577966/824be6c9-f2df-b54a-5c7a-245184d6e5e4.png)
(https://pc.watch.impress.co.jp/docs/news/1236827.html)

#最後に
同じようなスタイルをいくつかアップしておりますので、よろしければ使ってみて下さい。（ソースがかなり汚いですが、そこはご容赦を)
https://userstyles.org/users/369218

例としてPC Watchを挙げておりますが、毎日のように拝見しておりますので関係者の方々どうかご容赦下さい。
【Rails 6.0】Active Storageを導入する前に知っておきたかったこと(ACLディレクトリ設定)

## 概要
ファイルアップロード機能を実装する際に、Rails5.2で導入されたActive Storageを使ってみました。
実際に使ってみて困ったことがいくつかあったので、誰かのために役立てばと思いまとめておきます。

## 環境
- Rails 6.0.2.1
- Ruby 2.6.5

## 結論: 困った点と解決方法
### 困った点
Active Storage のサービスとして、Amazon S3を利用して、以下の点で困りました。

1. アップロード時にアクセス権限(S3のACL)を`public-read`に設定できない
1. ファイルを保存するディレクトリが設定できない  
(正確には、S3にはフォルダという概念は存在しないので、ファイルのキー名につけるprefixがつけられない)

### 解決方法
以下のパッチで対応しました。
この書き方だと、ファイルごとにアクセス権限を変更したり、ディレクトリを変更したりといった細かい設定はできません。

```rb
# lib/active_storage/service/better_s3_service.rb

require 'aws-sdk-s3'
require 'active_storage/service/s3_service'
require 'active_support/core_ext/numeric/bytes'

module ActiveStorage
  class Service::BetterS3Service < Service::S3Service
    attr_reader :root

    def initialize(bucket:, upload: {}, root:, **options)
      @root = root
      super(bucket: bucket, upload: upload, **options)
    end

    def upload(key, io, checksum: nil, content_type: nil, **)
      instrument :upload, key: key, checksum: checksum do
        object_for(key).put(upload_options.merge(body: io, content_md5: checksum, content_type: content_type, acl: 'public-read'))
      rescue Aws::S3::Errors::BadDigest
        raise ActiveStorage::IntegrityError
      end
    end

    private
      def object_for(key)
        path = root.present? ? File.join(root, key) : key
        bucket.object(path)
      end
  end
end
```

以下のように`root`を設定する。

```yml
# config/storage.yml
amazon:
  service: BetterS3
  root: root-directory
```



## 1. アップロード時にアクセス権限(S3のACL)
アップロードしたファイルにパブリック読み取りアクセス許可をつけようとしましたが、`v6.0.2.1`ではアップロード時に権限を設定することはできません。

ただ2019年7月のPR[^1]で、`public`というオプションを`storage.yml`で設定できる変更がマージされたので、将来的にはサポートされそうです。
[^1]: [Permanent URLs for Active Storage blobs by peterzhu2118 · Pull Request #36729 · rails/rails · GitHub](https://github.com/rails/rails/pull/36729)

いくつかの記事[^2]やissueへのコメント[^3]を参考にしてパッチをあてる形で対応しました。

[^2]: [Rails の ActiveStorage を S3 で使ったらPublicなURLが取れなかった - Qiita](https://qiita.com/chchu/items/35249b00e5c4cea178e4#%E6%96%B0s3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90)
[^3]: [ActiveStorage: Allow access to backing file from Service API · Issue #31419 · rails/rails · GitHub](https://github.com/rails/rails/issues/31419#issuecomment-370900013)

## 2. ファイルを保存するディレクトリが設定できない
S3にアップロードするファイルにprefixをつけて、フォルダを作成したいことは多々あると思いますが、現時点(v6.0.2.1)のActive Storageではサポートされていません。
「Active Storageでフォルダーを使う」といった旨のissue[^4] で議論されていますが、あまり議論が進んでいないので、まだまだサポートされなそうですね…。

[^4]: [Folder with active storage · Issue #32790 · rails/rails · GitHub](https://github.com/rails/rails/issues/32790)

こちらも先述のissue[^4]にあったパッチ[^5]を利用して、`config/storage.yml`から特定のディレクトリ名を設定できるようにしました。
[^5]: ([Folder with active storage · Issue #32790 · rails/rails · GitHub](https://github.com/rails/rails/issues/32790#issuecomment-487523740))

## まとめ
Active Storageを使ってみましたが、意外とサポートされていない機能が多く、少し驚きました。
[Delyさんの記事](https://tech.dely.jp/entry/2019/12/22/145733)にもありましたが、Rails本体に入っていても過信せず、使う前にユースケースを満たしているか利用すべきだと勉強になりました。


読んでいただきありがとうございました！
SwiftUI チュートリアルを噛み砕いていく

筆者はSwift未経験かつ、SwiftUIから入る変わり者です。
始めて自学自習で未経験の言語を習得していく人と、将来の自分にむけて記事を残していきます。(以前途中までやったけど完全に忘れた)

・SwiftUIが始めて
・Xcodeも始めて
・他の言語の学習経験あり(ある程度高級)

という前提で始めますので、そもそもプログラミングが何もわからない人はチュートリアルをやる前に、他の言語を勉強したほうが無難です。


以下のページと同じ手順を踏みますが、英語が得意な人は自分で学習してもいいと思います

[Apple公式チュートリアル](https://developer.apple.com/tutorials/swiftui/tutorials)

チュートリアル自体は
 ・SwiftUI Essentials (3)
 ・Drawing and Animation(2)
 ・App Design and Layout(2)
 ・Framework Integration(3)


の4つのセクションかつ(n)個の編があります。
さらに編の中にも演習が入っており、結果としてそこそこ多い分量となってます。
編の最後には必ず理解度を試す簡単な問題がありますが、ぶっちゃけ役に立たない。

やっていきましょう。

バージョンとか環境はその都度書いていきます。

[SwiftUI Essentials (1/3)](https://qiita.com/Rua/items/40f2ba9e8253cda33156)
[Flutter]AnimatedSwitcherを使ってウィジェットの表示切り替えをいい感じにする

# AnimatedSwitcherとは

FlutterにはAnimatedSwitcherというウィジェットがあり、これを使うとウィジェットの切り替え時のアニメーションを楽に実装することができ、便利なウィジェットだと思ったため、今回紹介したいと思います。

公式リファレンスはこちら
https://api.flutter.dev/flutter/widgets/AnimatedSwitcher-class.html

# サンプルで作るもの

今回はわかりやすいように、以下のようなボトムナビゲーションのitemをクリックすると文字がアニメーションされながら切り替わるという超絶シンプルなものを作ってみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/d67ff9a0-b2c5-a812-b853-8a45d9f7667d.gif" width=50%>

# 実装

## 検証環境

![スクリーンショット 2020-02-24 22.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/7aa87603-9927-4375-22c3-eeee1871c619.png)

## コード

全体のコードは以下になります。

```my_home_page.dart
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String text = 'home';
  int index = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        alignment: Alignment.center,
        child: AnimatedSwitcher(
          duration: Duration(milliseconds: 500),
          transitionBuilder: (child, animation) {
            return ScaleTransition(child: child, scale: animation);
          },
          child: Text(
            text,
            key: ValueKey<String>(text),
            style: Theme.of(context).textTheme.title.copyWith(
                  fontSize: 30.0,
                ),
          ),
        ),
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: index,
        onTap: (i) {
          setState(() {
            index = i;
            if (i == 0) {
              text = 'home';
            } else if (i == 1) {
              text = 'list';
            } else {
              text = 'notification';
            }
          });
        },
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            title: Text('home'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.format_list_bulleted),
            title: Text('list'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.notifications),
            title: Text('notification'),
          ),
        ],
      ),
    );
  }
}

```

重要なのはこちら。アニメーションしたいウィジェットをAnimatedSwitcherでラップし、必要に応じて、transitionやduration, curveを設定します。

また、アニメーションさせるウィジェットにはKeyを渡されている必要があるそうです。

```my_home_page.dart

...

AnimatedSwitcher(  // animationさせたいウィジェットをラップする
  duration: Duration(milliseconds: 500),   // 必要に応じて、Durationを指定
  transitionBuilder: (child, animation) {  // 必要に応じて、Transitionを指定
    return ScaleTransition(child: child, scale: animation);
  },
  child: Text(
    text,
    key: ValueKey<String>(text),  // Keyを付与
    style: Theme.of(context).textTheme.title.copyWith(
        fontSize: 30.0,
    ),
  ),
),

...
```

コードはこちらにあがっています。
https://github.com/youmitsu/animated_switcher_test_app

最後までご覧いただきありがとうございました。
Python練習_仮想環境のセットアップ~Djangoインストール

Python練習中。チュートリアルで仮想環境の構築を行ったので備忘録に。

プロジェクト単位で仮想環境を構築しておくことで限られた範囲内でPythonを実行することができ、フレームワークやライブラリ同士の不要な干渉を避けることができるとのこと。

Django学習サイトをいくつか参照している感じ仮想環境の構築は必須な様子なのでやっておく。

###仮想環境を作成
まずデスクトップにフォルダ（今回は[django_girls]と命名）を作成。

```$ cd djangogirls```
でフォルダに移動し、
```$ python3 -m venv myvenv```
で仮想環境を作成。

※チュートリアルの指示通りに実行した感じだけど、このコマンドで仮想環境が作成されるっぽい。[（詳細）](https://docs.python.org/ja/3/library/venv.html)

とりあえずこれで、仮想環境（一連のデフォルダとファイル）を含む[myvenv]という名前のフォルダが生成される。

###仮想環境を起動
コンソールで
```$ source myvenv/bin/activate```
を実行して仮想環境を起動。
問題なく起動が完了すると、コンソールでプロンプトの先頭に```(myvenv)```と表示される。


###Djangoをインストール
※pipがインストールされていない場合は先にインストールしておく必要あり。ただし、
>pipは、Python3.4以上（Python2の場合は2.7.9以上）であれば、プレインストールされていますので、すぐ利用できます。[（参照）](https://gammasoft.jp/python/python-library-install/)

とのことなので、今回（3系を使用）はパス。
その後チュートリアルの指示通りに[requirements.txt]というファイルの作成→テキスト（`Django~=2.2.4
`）の記入→```pip install -r requirements.txt```の実行
を行い、Djangoをインストール。

チュートリアルの指示通りだとバージョンが「2.2.4」で最新ではなかったので、記入するテキストを`Django~=3.0.3`に変更して実行すると最新版がインストールできた。

使用中のdjangoのバージョンは
```$ python -m django --version```
で確認可能。[(参考)](https://codor.co.jp/django/check-install)

続きはGitのインストールから。

以下、今回のチュートリアルで参照しているサイトはこちらから→[（DjangoGirls）](https://tutorial.djangogirls.org/ja/installation/#pythonanywhere)
読書ログ『メタプログラミング Ruby 第2版』2章

## 2章 月曜日: オブジェクトモデル

### オブジェクトモデル

 全ての **言語要素**(クラス、モジュール、インスタンス変数 etc...)が共存しているシステムのこと。

以下の2つの質問に答える場所

- このメソッドはどのクラスに所属するものなのか
- このモジュールをincludeしたら何が起きるのか

## 2.1 オープンクラス

### オープンクラス

- いつでも既存のクラスを再オープンして、そのばで修正できる技法のこと
  - (既存クラスには、String,Arrayなど標準クラスも含む)

### classキーワード

- ~~クラス宣言~~。主な仕事はクラスのコンテキストに連れて行くこと。

- Rubyではクラスを定義するコードと、その他のコードに違いはない。

### モンキーパッチ

- オープンクラスを否定的に言う、蔑称。

- 何も考えずにクラスにコードを追加することで、既存のメソッドを上書きし、意図しない挙動を生み出すこと。
- Refinementsを使うことで、安全にモンキーパッチを利用できるようになる。

## 2.2 オブジェクトモデルの内部

### インスタンス変数

- **オブジェクトに存在する**

- 値が代入されたときに初めて出現する
  - Rubyのオブジェクトのクラスと、インスタンス変数には何のつながりもない！
- メソッドを呼び出さなければ、インスタンス変数は存在しない。

```ruby
class MyClass
	def my_method
		@v = 1
	end
end

obj = MyClass.new
obj.instance_variables => []
obj.my_method => 1
obj.instance_variables => [:@v]
```

### メソッド

- **メソッドはオブジェクトではなく、クラスに存在する**
  - オブジェクトにはメソッドはなく、**インスタンス変数とクラスへの参照**があるだけ

### クラスとは

- **クラスはClassクラスのオブジェクト**
  - オブジェクトのメソッド → そのクラスのインスタンスメソッド
  - クラスのメソッド → Classクラスのインスタンスメソッド
- **全てのクラスは、モジュールである**
  - クラスとは、インスタンスの生成と継承のための3つのメソッドをもつモジュール
- クラス名は、**定数**

### 定数

- 大文字で始まる参照は、クラス名やモジュール名を含めて、全て定数
- プログラムにある全ての定数は、ファイルシステムのようにツリー状に配置
  - モジュール: ディレクトリ  / 定数: ファイル
- 定数ツリーの奥にいるときは、ルートを示すコロン2つで書き始めれば、外部の定数を絶対パスで指定できる

```ruby
Y = 'ルートレベルの定数'

module M
	Y = 'Mにある定数'
	Y #=> "Mにある定数"
	::Y #=> "ルートレベルの定数"
end
```

## オブジェクトとクラスのまとめ

### オブジェクト

- インスタンス変数の集まりにクラスへのリンクがついたもの

### インスタンスメソッド

- オブジェクトではなく、オブジェクトのクラスに住む

### クラス

- オブジェクトにインスタンスメソッドの一覧とスーパークラスのリンクがついたもの

### クラス名

クラスへのアクセスを行うための参照

## 2.4 メソッドを呼び出すときに何が起きているの？

1. **メソッドを探す**。メソッド探索
2. **メソッドを実行する**。selfが必要

### メソッド探索

- Rubyがレシーバのクラスに入り、メソッドを見つけるまで、継承チェーンを上ること。

#### 「右へ一歩、それから上へ」

- レシーバのクラスに向かって右へ一歩進み、メソッドが見つかるまで継承チェーンを上へ進む。

#### レシーバ

- 呼び出すメソッドが属するオブジェクト

#### 継承チェーン

- スーパークラスを、BasicObjectまで続けたとき、通ったクラスの道筋のこと

#### モジュールとメソッド探索

- モジュールをクラスにインクルードすると、Rubyはモジュールを継承チェーンに挿入する
  - include: インクルードしたクラスの上にモジュールが挿入される
  - Prepende: 下にモジュールが挿入される

#### Kernal

- Objectクラスが、Kernelモジュールをincludeしているので、全てのオブジェクトの継承チェーンに、Kernelモジュールが挿入される

### メソッドの実行

#### selfキーワード

- メソッドを呼び出すとき、メソッドのレシーバがselfになる
  - レシーバを明示しないメソッド呼び出しは、全てselfに対する呼び出しになる。
  - 他のオブジェクトを明示してメソッドを呼び出すと、今度はそのオブジェクトがselfになる
- 最後にメソッドのレシーバとなったオブジェクトが、selfとなる

#### トップレベル

- メソッドを呼び出さないときselfになるのは、Objectクラスのインスタンスの`main`

```
self #=> main
self.class #=> Object
```

#### クラス定義とself

- クラスやモジュールの定義の内側(メソッドの外側)では、selfの役割はクラスやモジュールそのもの

```ruby
class MyClass
	self #=> MyClass
end
```

### Refinements

- Refinementsが有効になる場所
  - refineブロック
  - usingを呼び出した場所からモジュールの終わりまで(モジュール定義にいる場所 / ファイルの終わりまで(トップレベルにいる場合)
- クラスをリファインすると言うのは、元のコードにパッチを貼り付けるようなもの
  - リファインされた側のクラスよりも優先される
  - インクルードやプリペンドしたものより優先される

### 感想
これまで、オブジェクトがメソッド・変数を持つと、漠然とまとめて理解していたので、`インスタンス変数は、オブジェクトに存在する` / `メソッドはオブジェクトではなく、クラスに存在する`と整理できたのがかなり、すっきりきたーーーー(ような気がする。)
為替の時系列データをクラスタリングしてみた話

#### 本記事内容サマリー
* 為替のデータをクラスタリングしてみました。 
    * k-means, ユークリッド距離 を用いました。
* 上位足(より長い時間軸の)データを組み合わせると有用そう。
    * 上位足を用いると、ラベル(利食い:１、損切り:−１、保有時間による決済:0)の割合の偏りが良化した。

#### 開発環境
* Colaboratory
    * scikit-learn 

#### データ準備
2018.01 ～ 2019.04 の USD/JPY を使用し、
5分足での移動平均線のゴールデンクロスのエントリーポイントをサンプルデータとしました。(2482 データ)
* 特徴量：
    * エントリーポイント前の約3時間分のデータ(ohlc)
    * RSI
#### ラベリング
ラベル付けは、以下のルールで行いました。

|  Result  |  Label  |
| ---- | ---- |
|  Profit  |  1  |
|  Loss  |  -1  |
| 保有時間による決済 | 0 |
今回は、大体3等分されるように損切りと利食いのラインを設定しました。

#### クラスタリング
##### 期待した結果
以下のグラフの様に、クラスタ毎に”利食い”/”損切り”/”保有時間による決済”がそれぞれキレイに分かれることを期待しました。

![2002_1_hoped.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131167/cb9681f9-32c8-6874-0bf5-8820a59712e4.png)

 
 これだと、クラスタ2の場合はダマシと判断して、トレードを見送ることができますね。 

##### 結果
scikit-learn の TimeSeriesKMeans を用いてクラスタリングし、各クラスタのラベルの割合を図示し、勝率順にソートしました。

![2002_2_OHLC_and_RSI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131167/9f68fdd9-2dbd-42a0-4e17-8df2ef6edb6b.png)

いまいち。。
勝率最大のクラスタで、45%、最小のクラスタで、22% でした。
元がほぼ3等分(33%)なので、少しは分けれてはいそうですが、もう少しキレイに分かれて欲しいところです。

##### 上位足を追加
改善を目指し、以下のより長い時間足の情報を特徴量に加えることにしました。
* 30分足でオシレーター系のインジケーター
* 2時間足でトレンドフォロー型のインジケーター

その結果が以下です。
![2002_3_with_long_term_indicator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131167/4dfc1374-7077-ebe5-12c3-1e08c568bccd.png)


勝率最大のクラスタで、63%、最小のクラスタで、14% でした。
上位足の情報を加えることで、大分良化しました。
上位足の情報が有用であることが改めて確認できたので良かったのではないでしょうか。
これくらいの結果であれば、ダマシを回避するのは難しそうですが、ポジションの数量の調整には使えそうだと個人的には思いました。

記事を読んでいただきありがとうございました。

#### 参考
* [Pythonで、時系列データをクラスタリングしてみよう](https://techblog.nhn-techorus.com/archives/6452)
* [ファイナンス機械学習](https://www.kinzai.jp/item/b1346)
コードヘルス - ネストを減らし、複雜さを減らす

*この文書は[Code Health: Reduce Nesting, Reduce Complexity](https://testing.googleblog.com/2017/06/code-health-reduce-nesting-reduce.html)の翻訳です。*

深くネストしたコードは可読性を損ないエラーの温床になる。次の2つのコードを比較し、バグを指摘せよ:

深くネストしたコード

```python
response = server.Call(request)
 
if response.GetStatus() == RPC.OK:
  if response.GetAuthorizedUser():
    if response.GetEnc() == 'utf-8':
      if response.GetRows():
        vals = [ParseRow(r) for r in response.GetRows()]
        avg = sum(vals) / len(vals)
        return avg, vals
      else:
        raise EmptyError()
    else:
      raise AuthError('unauthorized')
  else:
    raise ValueError('wrong encoding')
else:
  raise RpcError(response.GetStatus())
```

ネストの少ないコード

```python
response = server.Call(request)
 
if response.GetStatus() != RPC.OK:
  raise RpcError(response.GetStatus())

if not response.GetAuthorizedUser():
  raise ValueError('wrong encoding')

if response.GetEnc() != 'utf-8':
  raise AuthError('unauthorized')
 
if not response.GetRows():
  raise EmptyError()

vals = [ParseRow(r) for r in response.GetRows()]
avg = sum(vals) / len(vals)
return avg, vals
```

解答："wrong encoding"と"unauthorized"エラーが入れ替わっている。 **リファクタリングされたネストの少ないコードでは、チェックはエラー処理のすぐそばで行われているため、このバグは容易に見つかる。**

上記のリファクタリングテクニックは **ガード節（guard clause)** という名前で知られている。ガード節は条件をチェックし、もし条件が満たされないときはすぐに失敗するというものであり、計算のロジックとエラーのロジックを分離する。エラーチェックとエラーハンドリングの間の認知的なギャップを取り除き、心理的な処理能力を開放する。結果として、 **リファクタリングされたバージョンは読みやすく、メンテナンスしやすい。**

コードのネストを減らすことに関するルールをいくつか挙げる:

- 条件分岐のブロックを小さく、局所性を保つことで、リーダビリティを向上する。

- ループや分岐が2レベルよりも深くなるならリファクタリングを検討しよう。

- ネストされたロジックを関数に分離することを考えよう。例えば、各オブジェクトがそれぞれリストであるようなオブジェクトのリスト（repeatedフィールドを持つprotocol bufferなど[^1]）に対して繰り返し処理を行う必要があるとき、二重にネストされたループの代わりに各オブジェクトを処理する関数を定義することができる。

ネストを減らすことによって可読性の高いコードとなった。その結果、バグは見つかり、開発のサイクルは速くなり、安定性が増す。できるときには、シンプルにしよう！


[^1]: Google社内っぽい例えですね。https://images.app.goo.gl/Y87wjVcit5ZpekUm8
マークアップエンジニアがチェックしたいCSSリファレンスまとめ6つ


基本を既に知っているベテランこそチェックしておきたいCSSリファレンス。
おすすめのCSSリファレンスサイトを6つご紹介します。

#CSSリファレンス 日本語版

読みやすく安心な日本語のCSSリファレンスの
おすすめ3サイトをご紹介します。

## TAG INDEX

<img width="640" alt="TAG INDEXスクリーンショット 2020-02-24 20.53.06.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/5b4bb46f-62f8-204f-3b30-eab472fed3e4.jpeg">

初心者におすすめしたいCSSリファレンスサイト。
<a href="https://www.tagindex.com/stylesheet/basic/">CSSの基本</a>は、CSSの使い方の元になる「なぜそうなるのか」基本概念がまとめられていますので理解が深まります。
わかりやすい説明をしたい教える側のエンジニアさんにもおすすめです。

https://www.tagindex.com/stylesheet/

## HTMLクイックリファレンス

<img width="599" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/bcf3a925-d34c-bdef-4440-9e937d968844.png">

初心者にもわかりやすい平易な言葉使いと丁寧な説明。
プロパティの違いごとに、デモが用意されていて親切なサイトです。
使い方を早く知りたい場合におすすめです。

http://www.htmq.com/style/indexa.shtml

## MdN CSSリファレンス

<img width="599" alt="MdN CSSリファレンス" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/4a362977-4014-b95f-45af-ee81d53bf06e.jpeg">

中〜上級者が参考にしたいCSSリファレンス。
上級者向けの詳細な解説が特長です。

https://developer.mozilla.org/ja/docs/Web/CSS/Reference

#CSSリファレンス 英語版

英語のオススメサイト4つをご紹介します。
英語圏はプログラマ人工が多く、良い情報が豊富にあります。
Google翻訳で英語リファレンスを読む癖をつけると良い情報に出会う確率が高くなりますのでオススメです〜:relaxed:

## caniuse
<img width="640" alt="スクリーンショット 2020-02-24 21.04.25.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/be3c5a61-98ea-78fb-54eb-44047ec4e5bc.jpeg">

CSSプロパティの解説が付いてないですが、
ブラウザ未対応の使ったことがないようなプロパティを知るのに便利です。

https://caniuse.com/#index


## CSS TRICKS

<img width="640" alt="スクリーンショット 2020-02-24 21.19.01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/a4929c75-712d-4ea5-0d4e-1ade1905b8a8.jpeg">

こちらのCSSプロパティ一覧は2つのカテゴリーに分類されています。
- CSSセレクター（Selectors）
- CSSプロパティ（Properties）

サンプルデモがすべてCodepenで用意されていて、手元でコードを触りながら覚えることができます。
インプットしながらアウトプットできて便利です…！:writing_hand_tone1:

https://css-tricks.com/almanac/

## codrops
<img width="640" alt="スクリーンショット 2020-02-24 21.27.40.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/900d14f4-9cfd-8cf7-96df-5c9682c274e1.jpeg">

こちらのCSSプロパティ一覧は6つのカテゴリーに分類されています。
- セレクタ（Pseudo-class）
- プロパティ（Property）
- ファンクション（Function）
- データタイプ（Data Type）
- コンセプト（Concept）
- @rule（@ルール）

コード書き換えが可能なライブデモがついています。
おすすめサイトの中で1番英語の説明が長文なので、英語の勉強になるかも…！

https://tympanus.net/codrops/css_reference/

## cssreference
<img width="640" alt="スクリーンショット 2020-02-24 21.35.32.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29272/ba3dd4ac-aa81-0aa1-93cd-2408f9c65f02.jpeg">

こちらのCSSプロパティ一覧は8つのカテゴリーに分類されています。
- アニメーション（animations）
- 背景（Backgrounds）
- ボックスモデル（Box model）
- フレックスボックス（Flexbox）
- CSSグリッド（CSS Grid）
- ポジション（Positioning）
- トランジション（Transitions）
- タイポグラフィ（Typography）

cssreferenceというサイト名の通り、コンテンツのメインがCSSリファレンスです。
姉妹サイト「<a href="https://htmlreference.io/">htmlreference</a>」もありますのであわせて読みたい:keyboard:

https://cssreference.io/

#まとめ

CSSのブラウザ対応が進んだり、CSSの仕様が追加されるので
リファレンスサイトで最新情報をチェックしておきたいです:open_hands:

言語の壁はありますが英語サイトは質が高い情報が豊富なので
チェックしていきたいです:thumbsup:
Ansibleのインストール方法

#1.	はじめに

　インターネットに接続できる環境では、rpm,pipなどで比較的簡単にインストールができますが、
企業ではインターネットに接続できない環境でAnsibleを使いたいときがあります。
　ここでは、インターネットに接続できないCentOS7環境でAnsibleのRPM版を導入するための手順を紹介します。

　なお、動作環境で書いているCentOSやAnsibleとバージョンが違う場合は、必要になるRPMが増えたり、手順が変わってくる場合があります。

#2.	動作環境

CentOS7
　ベース環境　　　　　　　：サーバー（GUI使用）
　選択した環境のアドオン　：互換性ライブラリ
　　　　　　　　　　　　　　開発ツール

Ansile　　　　　　　　　　 ：2.7


#3.Ansibleの入手
　
①インターネットに接続でいるPCで以下のサイトにブラウザでアクセスする。
　　https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/

②最新版のRPMをダウンロードする。
　①の画面の一番下にある以下のファイルが最新になります。
　ansible-(バージョン).el7.ans.noarch.rpm
 
#4.Ansibleに必要な追加ファイルの入手
　
Ansibleインストール時に以下のファイル（RPM）を必要とします。対象は以下の通り。
　　python-jinja2
　　python-paramiko
　　python2-cryptography
　　sshpass
　　python2-pyasn1
　　python-idna
　　python-cffi
　　python-ply

①インターネットに接続できる別のCentOSが用意できる場合
　インターネットに接続可能な CentOS7で以下のコマンドを実行
　#  yumdownloader  --destdir  .  （モジュール）
  
※インターネットに接続できるCentOS7が用意できない場合、RPMがダウンロードできるサイトから上記ファイルを入手してください。
　例）https://pkgs.org/

 
#5.YUMリポジトリの設定
①root ログインする。

②すべてのYUMリポジトリを無効化。(インターネットに接続してしまうリポジトリを無効にする）
　#  yum-config-manager  --disable  \*

③DVDリポジトリを作成

※この方法はお手軽に、GUI環境でrootでログインしたときにマウントされる場所を使用しています。
　CUIで使用している場合や、別のユーザーでログイン後にrootユーザーになる場合は
　DVDのマウント場所が変わりますので、必要に応じてDVDのマウントの設定をしてください。

１）以下のファイルを作成する。

```text:/etc/yum.repos.d/dvd.repo
[CentOS DVD]
name=CentOS-$releasever - Media
baseurl=file:///dvd
gpgcheck=0
enabled=1
```

２）シンボリックリンクを作成する。
　　#  ls  -l  /run/media/root/CentOS\ 7\ x86_64/  /dvd

※ここが本当のマウントポイント

 
#6.Ansibleインストール

①Ansibleと必要モジュールを同じディレクトリに保存する。

②CentOSインストーラーDVDを挿入

③以下のコマンドを実行し、ansibleと必要モジュールをインストールする。
　#  yum  localinstall  ansible-2.7.7-1.el7.ans.noarch.rpm  \
　　　　python-cffi-1.6.0-5.el7.x86_64.rpm  \
　　　　python-ply-3.4-11.el7.noarch.rpm  \
　　　　python-idna-2.4-1.el7.noarch.rpm  \
　　　　python2-cryptography-1.7.2-2.el7.x86_64.rpm  \
　　　　python-jinja2-2.7.2-2.el7.noarch.rpm  \
　　　　python2-pyasn1-0.1.9-7.el7.noarch.rpm  \
　　　　python-paramiko-2.1.1-9.el7.noarch.rpm  \
　　　　sshpass-1.06-2.el7.x86_64.rpm

④以下のコマンドを入力し、ansibleのコマンドが動作することを確認する。
　#  ansible --version
Xcodeプロジェクトで Swift Package Manager を使っているとBitriseでfastlaneのテスト実行が失敗する問題に対処

記事の内容はこちらを参照してください。
https://mishimay.github.io/d4398a35017a83a6332c/
<!--

## 事象
Xcodeプロジェクトを Swift Package Manager を使ってライブラリ管理するように変更したところ、Bitriseで以下のようなエラーが出るようになりました。

> xcodebuild: error: Could not resolve package dependencies:
  An unknown error occurred. '/Users/vagrant/Library/Developer/Xcode/DerivedData/Timetodo-cdnlkhtafdnmclauocshwxxtmoag/SourcePackages/repositories/XCGLogger-9081359c' exists and is not an empty directory (-4)
timeout after 600 seconds

## 解決方法
Fastfileに以下を追加してライブラリの依存解決すると成功するようになりました。

```ruby
    Dir.chdir("../") do
      sh("xcodebuild", "-resolvePackageDependencies")
    end
```

## 参考
https://errors.wtf/xcodebuild-error-could-not-resolve-package-dependencies/

## 環境
Xcode 11.3.1
Swift 5.1.3


-->
Instance method 'request(:didFailWithError:)' nearly matches optional requirement 'request(:didFailWithError:)' of protocol 'SKRequestDelegate' に対処する

記事の内容はこちらを参照してください。
https://mishimay.github.io/5b4934676e9796a5dd82/
<!--

## 事象

`SKProductsRequestDelegate` の継承元である `SKRequestDelegate` に定義されている以下のメソッドをSwiftで実装してエラーハンドリングしようとしたところ、warningが出てメソッドが呼ばれない事象に遭遇しました。

```swift
func request(_ request: SKRequest, didFailWithError error: Error) {
}
```

> Instance method 'request(_:didFailWithError:)' nearly matches optional requirement 'request(_:didFailWithError:)' of protocol 'SKRequestDelegate'


## 解決方法
以下のように `@objc` でメソッド名を指定し、errorの型を `NSError` に変更することでメソッドが呼ばれるようになりました。

```swift
@objc(request:didFailWithError:)
func request(_ request: SKRequest, didFailWithError error: NSError) {
}
```

## 未解決
上記のように変更してもwarningは消えませんでした...

## 参考
https://stackoverflow.com/questions/39416385/swift-3-objc-optional-protocol-method-not-called-in-subclass

## 環境

Xcode 11.3.1
Swift 5.1.3


-->
Powershell起動用Powershell

# Powershell起動用Powershell
ターミナル内変数を自動定義してPSコンソールを起動するPSスクリプト。

```powershell:wakeup.ps1
# WAKEUP Terminal

# 環境変数設定
Set-Item Env:Path "$Env:Path;＜追加パス＞"

# ホームディレクトリに移動
cd $HOME

# powershell起動（ロゴなし）
powershell -NoLogo
```

# ダブルクリック用ショートカット
ダブルクリック起動する際にはショートカットを作成後、「プロパティ-リンク先」を編集。


```powershell:ショートカット（プロパティ-リンク先）
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File ＜wakeup.ps1の格納パス（絶対パス）＞
```
AWSで証明書を発行してみた

# はじめに
個人開発で証明書が必要になったのでACM（AWS Certificate Manager）で証明書を作成してみた

# 手順
## ①ドメインの取得
Route53コンソールのナビゲーションペインからドメイン > 登録済みドメインを開く。
「ドメインの登録」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/5a7e805d-a04c-d64d-7c78-90dd6042e815.png)

使用したいドメインを選択し「続行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/85853e19-76d0-c3e5-b8da-b3dcd4e3f5c7.png)

Who-is情報を入力し「続行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/78965818-c12e-5c56-e48b-bf6415a2d983.png)

入力内容を確認し、ページ下部の「AWS ドメイン名の登録契約を読んで同意します」にチェックをつけて「注文を完了」をクリック

しばらくすると、登録したメールアドレスにメールが届くので開いてリンクをクリックする
自分の場合は2通メールが届きましたが、2通目の英語のメールの方が本命でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/f083a51a-060c-1732-b152-49f443ef6b3a.png)

メールを開き、真ん中の長いリンクをクリックしてverificationを完了させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/1ffdc052-4349-b4d3-ce3c-5abade1fead9.png)

awsっぽくない完了画面が表示されて一瞬ドキッとするが、これでドメイン取得の手続きが完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/550ae9a3-4969-d5e9-2375-94c214859890.png)


念の為ナビゲーションペインの「登録済みドメイン」を確認し、ドメインが利用可能になっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/913f6a93-cb4e-7595-64ff-af40e7ce146b.png)



## ②証明書の登録
Certificate Managerコンソールを開く
左の「証明書のプロビジョニング」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/b63ad23d-feaa-8d61-7436-b9cf70f08c6c.png)

「パブリック証明書のリクエスト」を選択し、「証明書のリクエスト」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/ccbbed8d-d141-4ce7-b764-97c3f64598d2.png)

取得したドメインを入力し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/347a0343-a36e-7e43-8a21-e88c2d4421d3.png)

DNSの検証を選択し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/b04fa6ee-178d-c760-0d24-90f6a0ddbfd7.png)

必要に応じてタグを指定し、「確認」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/4b5c6974-9e6e-beab-1691-5a9a4a826e2e.png)

入力内容を確認し、「確定とリクエスト」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/39ec143f-d5e0-40e7-e5e8-3435c274c355.png)

DNSレコードの登録が求められるので「Route53でのレコードの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/89286a16-0a83-cf4c-69ff-d299a7addb9d.png)

「作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/c7552f66-d9a4-17a9-b617-2ddc668dbdc6.png)

成功が表示されたことを確認し、「続行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/2654cb55-2353-2bba-7b52-e7420c98f523.png)

Certificate Managerコンソール内ナビゲーションペインの証明書 > Certificate Managerでステータスが「検証保留中」から「発行済み」になるまでしばらく待つ（10分くらい？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/e1429465-c52f-e8f7-6c2b-ab51a6c0eb0f.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77606/636ad580-9608-d1e3-604b-48818b8af961.png)


これで証明書が使える
SpacemacsにてCtrl-iのカーソル移動

vimでは次のようなカーソルジャンプがあり、関数の宣言箇所へジャンプなどと組み合わせてよく使う。

- `<Ctrl-o>`：元いた場所に戻る: 
- `<Ctrl-i>`：元いた場所に進む

ただし、spacemacsではデフォルトで`<Ctrl-i>`が`TAB`に割り当てられているので、
設定ファイルを一部変える必要がある。

1. `SPC` `f` `e` `d` : 設定ファイルを開く
1. `dotspacemacs-distinguish-gui-tab t ;; nilからtへ変更`
2. `SPC` `f` `e` `R` : 設定のリロード


カーソルジャンプについては次の動画がとても参考になります。
[Spacemacs Jumps: jumping around your code (tutorial) - YouTube](https://www.youtube.com/watch?v=FSKbNQ1EBxo&list=PLhqJJNjsQ7KFkMVBunWWzFD8SlH714qm4&index=6)
【Linuxコマンド】 man コマンド オプション 一覧 【初学者必見】

# 【Linuxコマンド】 man コマンド オプション 一覧 【初学者必見】

まとめ
[Linuxコマンド一覧](https://qiita.com//web-hackers/items/55329223ca39643d950e)

## man コマンドとは
各コマンドのマニュアルを確認する為のLinuxコマンドです。 
"man" は "manual"の略です。

###  コマンドの使い方
```zsh
$ man '確認したいコマンド'

# cd コマンドを確認する例
$ man cd
```



## man コマンドのオプション一覧
| オプション      |説明                      |
|:-------------|:------------------------|
| -a             |対象のすべてのマニュアルの表示|
| -d             |デバッグモードで表示         |
| -k          |マニュアルの検索           |
| -K    |マニュアルの本文で検索|
| -P             |pagerの指定|
| -c       |コンフィグファイルを指定|
  




### -P オプション


```zsh
# cd コマンドのマニュアルをcatを使い表示する
$ man -P cat cd
```

## その他のLinuxコマンドのオプション一覧
[cp]()




## その他のLinuxコマンドのオプション一覧
[pwd](https://qiita.com//web-hackers/items/705a296743322ea9561b), [mkdir](https://qiita.com//web-hackers/items/e6cf2b222fc035ee6766), [cd](88514031ed45a3ec1fd4), [cat](https://qiita.com//web-hackers/items/28bd20992b5fdc57b6a7), [cp](https://qiita.com//web-hackers/items/08420eb57b1765fdc65d), [ls](0a7c46c2930a831ee759), [touch](https://qiita.com//web-hackers/items/0e44fe3fc5c894790975), [less](https://qiita.com//web-hackers/items/1048bf3f10086f1f1241), [mv](https://qiita.com//web-hackers/items/8ecca14a948d7865ae0f), [rm](https://qiita.com//web-hackers/items/7bb34a0a6228a5c10da2), [ssh](b4dd0e0da54dbb0ab043), [man](https://qiita.com//web-hackers/items/a0985c6d2a6996089d46), **随時追加中**

### 広告欄
各種開発や構築の請負や初学者向けのメンター業務してます。
ご興味お持ちいただけた方は**[こちら](https://web-hackers.com/)**へどうぞ