OmniAICreator/Qiita-1.07M huggingface dataset:
Ansibleについて

#1. Ansibleとは

　Ansibleはオープンソースの構成管理ツールの1つで、ITの自動化を行うことができます。
　AnsibleはLinuxで動作するツールです。

- 特徴
  - 複数の機器に対して同じ操作が行える。
  - 変数を使用して個別の設定（IPアドレスやサーバ名など）が投入できる。
  - 別の場所に持って行って何度も同じ操作が行える。(設定ファイルなどをコピー）


- 出来ること
 - アプリケーション構築
 - 構成変更（バージョンアップ、設定変更等）
 - テスト、動作確認
 - 情報確認、情報収集

- 対象
 - サーバー　　　：Windows、Linux（Unix)・・・（およびミドルウェア）
 - NW機器　　　 ：CISCO（ISO）、F5、Juniper、Arista・・・
 - 仮想サーバー　：ESXi、Hyper-V、KVM・・・
 - クラウド　　　：AWS、Azure・・・


#2. Ansibleの動作の概要

　Ansibleは、自動化の対象になるサーバー、NW機器などにリモート接続し、コマンドやファイルの転送などを行います。
　実施する内容はAnsible実行時に指定したり、playbookいう定義ファイルに実行内容を記述します。

　　ansible ---(ssh)--- Linux
　　　　　　　 |
　　　　　　　 +---- Linux

　　ansible ---(WinRM)--- Windows
　　　　　　　　|
　　　　　　　　+-------- Windows


ansibleで実施する内容は、モジュールという処理を設定するプログラムを呼び出して実行します。モジュールは追加で入手したり、自分で作成することができます。

　　　（指定した実行内容）
　　　　　　　　↓
　　　　　　　ansible ------------------------------------------→ 設定対象
　　　　　　　　↓↑　　（ansibleが呼び出し、実行）
　　　　　　モジュール


#3.Ansibleのコマンド

| コマンド名|説明|補足 |
|:------------:|:-----------------------:|:-:|
|ansible|引数に従って実行する|単発で実行|
|ansible-playbook|playbookに従って実行する|playbookに複数の処理を記述し、実行|
|ansible-vault|playbookなどを暗号化する|
|ansible-doc|モジュールのドキュメントを表示する|   |


#4.参考になるURL

Ansibleのドキュメント（英語）
　　　https://docs.ansible.com/
　　　　※英語ですが、ブラウザの翻訳機能を使えば十分読めます。

Ansibleのホーム（英語）
　　　https://www.ansible.com/

playbookのサンプル集（コミュニティ参加者が作成したplaybookがダウンロードできます)
　　　https://galaxy.ansible.com/
ソフトウェアテスト技法を読んで学んだこと

# 買った本
[ソフトウェアテスト技法](http://www.amazon.co.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E6%8A%80%E6%B3%95%E7%B7%B4%E7%BF%92%E5%B8%B3-%E7%9F%A5%E8%AD%98%E3%82%92%E7%B5%8C%E9%A8%93%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B40%E5%95%8F-%E6%A2%85%E6%B4%A5-%E6%AD%A3%E6%B4%8B/dp/429711061X/ref=cm_cr_arp_d_pdt_img_top?ie=UTF8)
Part1をやり終えたので学んだことを記録

## 同値分割法
テスト結果で同じ結果になるものをグループ分けして、その中で代表となる値のみテストをする。
例えば今月の獲得ポイントによって来月の会員ランクが決まるような処理
以下のような条件だった場合

図1 同値分割法の例

| No | 獲得ポイント | 来月の会員ランク | 代表値 |
|:-:|:-:|:-:|:-:|
| 1 | 0-100 | ノーマル | 50 |
| 2 | 101-500 | ブロンズ | 300 |
| 3 | 501-1000 | シルバー | 750 |
| 4 | 1001- | ゴールド | 2000 |

同値分割法は、同じ結果に範囲に分割して、その中で１つのみテストを実施する。
そうすることで、その範囲内の動作は正しいと判断するテスト。
ただし、ソースコードの組み方によっては、代表値だけのテストでは足りない場合もありうる。

``` java
public static String getRank(int point) {
    switch(number) {
        case 0:
            return "ノーマル";
            break;
        case 1:
            return "ノーマル";
            break;
        // caseが100まで続く
        case 32:
            return "ブロンズ";
            break;
        // caseが100まで続く
        case 100:
            return "ノーマル";
            break;
    }
}
```
こんなソースないとは思うが、もし間違って32の時に ブロンズを返すと書いていた場合、
同値分割法のテストで不具合を発見することはできない。
静的解析ツール、レビューで上記のような問題は解決されるはずなので大きな問題にはならないはず。


## 境界値分析
同値分割法で分割したクラスの境界値をテストする手法
図1を例とすると、ノーマルとブロンズの境界である、100, 101をテストする。
100はノーマル
101はブロンズとなるはず

![境界値テスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43623/e91e65fe-98cd-0901-90f3-9977bf3720b5.png)

``` Java
// こんなメソッドがあった場合に不具合に気づくことができる。
public static String getRank(int point) {
    if (0 <= point && point < 100) { // <= 100とすべきだが間違っている！！
        return "ノーマル";
    } else if(101 <= point && point <= 500) {
        return "ブロンズ";
    }
}
```

知識として持っているものを使用して、実際にテストケースを作成していく練習ができました！
HTMLとCSS

【HTMLについて】

【タグ】
➡「見出し」「リンク」の意味を持つ
⇒<h１></h１>で囲む。<ｈ１></ｈ１>が一番大きな見出し。

【段落】
⇒＜p＞＜/p＞で囲む。

【コメント】
➡ブラウザには表示さえず、メモとして使う
⇒<!-- -->で囲む。

【リンク】
⇒＜a＞＜/a＞で囲む。
⇒＜a href="URL"＞＜/a＞で囲むとURL部分にリンク先のURLを指定し、そのページへのリンクができる。

【画像の表示】
➡終了タグは必要ない。
⇒＜img src="URL"＞のURLの部分に画像のリンクを指定する。

【リスト】
⇒＜li＞＜/li＞で囲むとリストができる

囲む要素で以下のように種類が変わる！
⇒＜ul＞＜/ul＞で囲むと黒店が先頭につく
⇒＜ol＞＜/ol＞で囲むと数字が連番でつく

例）入れ子状態ではインシデント（字下げする）
　　行の最初にtabキーでできる。
＜ul＞
　＜li＞HTML＜/li＞
　＜li＞PHP＜/li＞
　＜li＞Ruby＜/li＞
＜/ul＞

【CSSについて】
➡色、大きさ、配置を指定。デザインする
➡HTMLと別のファイルに記述する。

【色の指定】
例）色は１６進数のカラーコード（#ff0000のように）で色指定する
h1{ 　　　　　　　　　　　　　 　//どこの
　color:red;　　　　　　　　　 　　//何を（色）：どうする（redにする）；
　font-size:　10px;　   　　　　　　　//文字を：10pxのサイズにする
　font-family: "Avenir Next";  　　　　 //フォントを："フォント名"にする；
　background-color:　#ffd800；　　     //背景フォントを：色にする；
　width:500px;　　　　　　　　　　 //横幅：500pxにする；
　height:80px; 　　　　　　　　　　//縦幅：80pxにする；
}

【CSSのコメント】
⇒/＊　＊/で囲む。

【クラスをつける】
HTML側
＜ul＞
　　＜li class="selected"＞HTML＜/li＞　　//class="クラス名"
　　＜li＞PHP＜/li＞
＜/ul＞

CSS側
.selected ｛　　　　//class名には.をつける
　　color:red;
　　border:5px solid red;　　　//線：太さ　種類　色；で線で囲まれる。（border-bottomで文字の
      　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　下のみに線がつく）
　　padding:20px;　　//上下左右に２０pxの余白を追加する(padding-top(上部のみ、他-bottom、
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　-left、-right):20px;)
　　　　　　　　　　　（borderの下に書くことで、枠の中に余白追加）
　　margin:20px;　　　　//borderの下に書くことで、枠の外側に余白がつく
｝
li{
 　list-style:none;　　　　//リストのマークをなくす
　float:left;　　　//要素が左に横並びになる
}



【HTMLのバージョン宣言】
<!DOCTYPE html>
＜html＞
＜head＞　　　　　　　　　　　　　//ページに関する情報。WEBページには表示されない
　＜meta charset="utf-8"＞　　　     　　//文字コード＝”文字コード”
　＜title＞Progate＜/title＞　　 　　　//ページタイトル。ブラウザのタブ上に現れる
　＜link rel="stylesheet"href="stylesheet.css"＞　　//CSSの読み込み”CSSのファイル名”
＜/head＞ 
　　　　　　
＜body＞　　　　　　　　　　//実際に表示したい内容
　＜div class="header"＞　　　//ヘッダーの＜div＞要素
　　　＜div class="header-logo"＞Progate</div>　　//ロゴの＜div＞要素
　　　＜div class="header-list"＞　//ヘッダーのリストの＜div＞要素
　　　　　＜ul＞
　　　　　＜ul＞
　　　＜/div＞
　＜/div＞

　＜div class="main"＞　　　　//メインの＜div＞要素
　＜/div＞

　＜div class="footer"＞　　　　//フッターの＜div＞要素
　　　＜div class="footer-logo"＞Progate</div>　　//ロゴの＜div＞要素
　　　＜div class="footer-list"＞　//フッターのリストの＜div＞要素
　　　　　＜ul＞
　　　　　　　＜li＞＜/li＞
　　　　　＜ul＞
　　　＜/div＞
　＜/div＞

＜/body＞　　　　　　　　　
＜/html＞
Maya で blendshape target のリネームや個数の取得を行うメモ


Renaming Blendshape Targets
http://blog.evancox.net/2016/07/27/renaming-blendshape-targets/


`renameAttr` で行けない場合は, `aliasAttr` を使う.


mel を使う場合は `blendShapeRenameTargetAlias` が楽(mel ドキュメントには無い?)

```
blendShapeRenameTargetAlias <BLENDSHAPE_NAME> <id> <NAME> ;
```

とする.

id は weight の id.

## target の個数の取得

blendshape target を追加したいとき.
addTarget 見たいのは pymel にあるかもしれないが... とりあえずは weight id 指定で追加するとする.
現在の blendshape の weight の個数がほしいとき.


maya python で,

```
cmds.blendShape(bs_name, q=True, wc=True)
```

として `wc`(weightCount) をクエリすれば現在の target の個数を取得できる.
(target の個数 == weight の個数と仮定する)

## reset delta

blendShape target を追加したら,

```
blendShape -e -rtd 0 <weight_id> "blendshape_name";
```

として, 一度リセット delta するとよいもよう.
(特に subdivision mesh の場合は, 適用しないと subdivision 前の shape との delta を計算してしまうっぽい)
AtCoderJobsで機械学習エンジニアに転職しました

##01.はじめに
私はこれまで半導体エンジニアとして働いていましたが、
4月1日より東京でAIベンチャー企業で機械学習エンジニアとして働くことになりました！！
まだ、2月後半ですが、4月から始まる新しい生活に心を躍らせています笑
本記事ではIT系未経験の私が転職するまでの道のりを書いていきます。

##02.私の経歴やスキル
転職が決まる直前の私の経歴やスキルを紹介します。
- 関西の有名私立大学理系院卒(電気電子工学専攻)
- 2019年4月より福岡で半導体エンジニアとして働く
- Pythonしか書けない、強いて言うとHTMLとCSSも少し書ける
- AtCoder緑
- TOEIC 825
- 英会話はまぁまぁできる(留学生と３ヶ月一緒に研究していた)
- 日本学生支援機構の奨学金全額免除

##03.転職活動記
昨年新卒で会社に入った私でしたが、ほぼ1年という短い期間で転職することになりました。
この節では、私が転職を考え始めてから転職先が決まるまでを時系列で紹介したいと思います。

###4月〜6月(会社の研修)
入社した会社で３ヶ月の研修がありました。
研修中は定時で帰れる＆出張手当がもらえる(勤務地が福岡で研修中は関東にいたため出張扱いになる)でものすごくモチベーションが高かったです。
この頃はまだ1年で転職するなんて全く考えていませんでした。

###7月~11月(会社の業務に配属される)
長かった会社の研修も終わり、7月からは会社の業務に配属されました。
しかし、配属された業務は、私が望んでいたものではなく(いわゆる配属ガチャ)２週間もすると業務にコレジャナイ感を感じて、少し転職することも考えはじめました。
その頃にちょうど競技プログラミングAtCoderのこと、またAtCoderのレートで転職ができることを知り、本格的にプログラミングを学び始めました。
また、9月からは機械学習についても学びたいと思って、AidemyのPremiumPlanにも登録しました。
かなりいい値段はしましたが、機械学習についての基礎は身に付いたと思います。
この頃は、平日は業務が終わってから平均3時間程度、休日は6時間程度は勉強していたと思います。

###12月~1月(転職をしようと決意する)
12月になり、会社の業務にアサインされてから半年程度が経ちました。
しかしながら、自分の中では会社で自分が行っている業務に満足できていませんでした。
また、1年上の先輩を見ていても、来年自分も先輩と同じような業務をするのは嫌だと思いました。
そのため、転職を12月の時点で転職をしようと決意しました。
世間一般では転職活動は2月頃に活発になると聞き、それに合わせて準備をしました。
また、このタイミングでAtCoderのレーティングも緑になったため、AtCoderJobsにおいても幾つかの企業にエントリーすることができました。

###2月(転職活動を始める、そして２週間程度で終わる)
2月に入り、転職活動をはじめました。
応募したのは、AtCoderJobsでは3社程度、大手転職エージェントのdodaでは20社程度です。
AtCoderJobsでは1社は書類選考？で落ち、1社は返事が帰ってこず、1社からは書類選考を通り、面接まで行けることになりました。
もちろん、といえばそうなのですが、AtCoderJobsでは応募に必要なレーティングを満たしているからと言って、面接が確約されているわけではありません。
また、AtCoderJobsでは普通の転職において必要とされている履歴書や職務経歴書に該当するものがないため、その他PRの欄にそれに類することを書いておくべきなのかもしれません。

dodaの方では転職エージェントから紹介された求人に片っ端から応募していきました。
書類選考を通ったのは4/20社くらいで、そのうち半分はSESの会社でした。

3社程度面接を受けに行き、最終的にAtCoderJobs経由で応募した会社に機械学習エンジニアとして入社することになりました。

##04.評価されたこと
この節では、内定をもらった会社から自分が評価された点を挙げていきたいと思います。

・最低限のプログラミングスキルを持っている
内定をもらった会社はAtCoderJobs経由のため、AtCoderのレートによってスクリーニングされています。
そのため、最低限のプログラミングスキルは持っていると評価され、面接の場においては、スキルチェックなどはほとんどありませんでした。
ちなみに、doda経由で面接を受けた会社ではAtCoderのことについては触れられませんでした。

・遠方からわざわざ来た
私は現在福岡に住んでいますが、IT関係の仕事をするなら東京が良い(というか一度東京に住んでみたい)という思いから、東京の会社に応募していました。
そのため、面接を受けるときも、会社の有給をとり福岡から東京まで行って面接を受けにいきました。
もちろん、Skypeで面接を受けるという選択肢もありますし、それで評価が下がるということもないと思います。
しかしながら、わざわざ手間をかけて面接を受けに行くことで、あなたの会社に入社したいという覚悟や思いが伝わると思います。(面接官の人もそのように言っていました)
ちなみに福岡の人が東京に行く場合には、ANAの旅作を利用するのがおすすめです。
１週間より前に予約することで福岡ー東京飛行機往復代＋ホテル宿泊費を3万円強(2月)に抑えることができます。

・学習意欲が高いこと
学生時代の研究に対する姿勢や、競技プログラミングへの参加、そしてそれらの成果などが評価されました。
面接官の人が全員理系だったため、奨学金全額免除についても良い評価をもらいました。

・英語のスキル
会社として、現在海外へ進出する予定らしく、自分がTOEICの点数がそれなりに高く、また英語が話せるということが評価されました。
面接の時に聞いた話では、外国企業との商談の時に通訳(理系寄り)を連れて行ったが、自社プロダクトについて理解していないため、手間取ったとのことです。
そのため、自社の製品を理解している英語が話せるエンジニアが必要だそうです。

・人柄
会社の採用ページを見ると、人柄についても見ていますと書いてあったので、自分は人柄も評価されているのだと思います。

##05.まとめ
未経験からでも機械学習エンジニアになることができました！
今回私が内定が貰った要因としては、当たり前すぎることですが、企業が求めている人材と私の持っているスキルが一致したためだと考えています。
そのため、もし業務未経験の人で行きたいと考えている企業があるのであれば、会社で使用している言語や求めている人材のところをきちんと見ましょう。
(私のようにメインの言語がC++のところにpythonができますと言って応募しても書類選考は通りません)

4月から会社の一員として働くために、入社まで残り１ヶ月ちょっとですが、勉強を頑張りたいと思います。
AtCoder AGC 024 A - Fairness

https://atcoder.jp/contests/agc024/tasks/agc024_a

# 概要
- 最初, p1, p2, p3 = (A, B, C)という数をもつ。
- 1回、入れ替えをすると、(B+C, A+C, A+B)という数になる
- k回後の入れ替えの後、p1 - p2の値を求めよ

# 結論:
競技上はパターンを見つけてsubmitになると思う。

# 考察1: 愚直に考える

```
(A, B, C) -> A - B
(B+C, A+C, A+B) -> B - A 
(2A+B+C, A+2B+C, A+B+2C) -> A - B 
(2A+3B+3C, 3A+2B+3C, 3A+3B+2C) -> B - A
```

奇数ならA-B, 偶数ならB-Aっぽいことが分かる

#  考察2: 解説の方法
最初のAを B + xとおく x = A - B

```
(B + x, B, C) -> x
(B+C, B+C+x, 2B + x) -> -x
(3B+C+2x, 3B+C+x,2B+2C+x) -> x
(5B+3C+2x, 5B+3C+3x, 6B+2C+3x) -> -x
```

あまり計算の複雑さとしては変わらないが、「求める数をxとおいて計算」という考え方は大切。

# コード
```Python
a, b,c, k = map(int, input().split())
x = b - a
if k % 2 == 0:
    print(-x)
else:
    print(+x)
```
https://atcoder.jp/contests/agc024/submissions/10295813
AIエッジコンテスト(実装コンテスト)のチュートリアル【2: Google Colab上での学習の実行】

Google Colaboratoryを使ってブラウザ上で学習を行います。学習済みモデルをUlta96V2上のPYNQ上で実行することで、測定が可能となります。なお、環境入門なのでまだハードウェアアクセラレータは使用しておりません。このチュートリアルでは、環境構築も行うので、一度実行することをお勧めします。

### 無料の学習環境 Google Colaboratory
Google Colaboratoryとはブラウザ上のJupyterNotebookからクラウドでPythonプログラミングできる環境で、無料です！GPUやTPUも無料です！ただし12時間の利用制限があって、リセットされてしまいます。まぁ、ちょっとしたテクニックで事実上使い放題なんですけどね。。今回はColaboratoryを使ってコンテストで使う物体検出用モデルを学習しましょう。

### Google Colaboratory の準備
1.1 Googleアカウントを作成してください。(Googleアカウントを持っている場合はスキップ)
1.2 以下からノートブック(AIcontest_trial_ver1.ipynb)をダウンロードしてホストPCに保存してください。
https://drive.google.com/file/d/1wNM3zhJuh1NghsZR18ZdtRsujOZnnO3F/view?usp=sharing

<font color="red">※このままブラウザで実行も可能ですが、利用数制限があるため多人数で同時に実行することはできません。必ず自分のPCにダウンロード→自身のGoogle Drive上にアップしてから実行してください！</font>

ipynbとはノードブックの拡張子で、Pythonで書かれたコードを含むノートブック一式です。Pythonスクリプト言語の利点を生かし、インタラクティブに結果を可視化しながら開発ができる工夫が盛り込まれています。Colaboratoryには機械学習用のライブラリ(TensorFlow, PyTorch, Chainer, Scikit-Learn)が予めインストールされていて、学習時間を短縮するためのハードウェアアクセラレータ(GPU, TPU)が利用可能です。

1.3 Googleをブラウザ(Google Chromeのみ対応)で開いて、Google ドライブを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589480/01623204-cfb7-4d19-e08e-1ac5421aa30e.png)

1.4 Google Colaboratory を起動
新規→その他→Google Colaboratory を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589480/9f13dd54-838a-46b8-dd97-bd39198ed5d4.png)

1.5 ノートブックの読み込み

ファイル→ノートブックをアップロード、そうするとノートブックをアップロードできるので、「ファイルを選択」をクリックして手順1.2 でホストPCに保存したノートブック(AIcontest_trial_ver1.ipynb)を読み込んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589480/ef55786f-a163-8198-6ced-95bfdf78962c.png)

1.6 GPUの指定
このまま学習を実行するととーっっても遅く、下手をすると学習だけでコンテストの〆切を過ぎてしまいます。。そこで学習を高速化するためのハードウェアアクセラレータとしてGPUランタイムを指定します。

Colabの「ランタイム」→「ランタイムのタイプを変更」で下の画像のようなメニューが出るので、使いたいアクセラレータを指定します。TPUも使えます！

<img width="566" alt="スクリーンショット 2020-02-23 2.54.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589480/c6062f98-ae2f-f401-191b-5198dab79c2f.png">

1.7 学習の実行
ノートブックにコメントと手順を書いていますので、その通りに実行すると学習が行われて学習済みモデルをダウンロードできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589480/fd2a1a61-0cc6-6ccf-e5fc-bdf09a1fb35c.png)

実行する時間や場所によって割り当てられるGPUがかわるようです。これを書いている場所は米国西海岸ですが、Teslaが割り当てられました！なお、学習時間が長いので、チュートリアルでは敢えて学習(エポック)回数を短めに設定しています。モデルも簡易に、学習データ数も減らし、サイズも小さくしております。つまり‥

チュートリアル通りに実行するとyolov2_epoch_(エポック回数).pthがGoogleドライブ上に生成されるので、自分のPCにダウンロードしておきましょう。次回以降に使います。次回はいよいよUltra96ボードを使ってCPU推論を実行してみましょう。
Linuxのmanコマンドの出力結果をファイルに出力する方法

Linuxの`man`コマンドの出力結果をファイルに出力する方法を紹介します。

# 環境

+ OS：CentOS Linux release 7.7.1908

```
[root@CENTOS7 ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@CENTOS7 ~]#
```

# manコマンドの出力結果をファイルに出力（colコマンドで制御文字を除去）

`man コマンド | col -bfx > ファイル`

```実行結果
[root@CENTOS7 ~]# man top | col -bfx > top.txt
[root@CENTOS7 ~]#
```

# CentOS7では

CentOS7では

`man top | col -bfx > top.txt`
の結果と
`man top > top2.txt`
の結果は同じとなりました。

```実行結果
[root@CENTOS7 ~]# man top | col -bfx > top.txt
[root@CENTOS7 ~]# man top > top2.txt
[root@CENTOS7 ~]# diff top.txt top2.txt
[root@CENTOS7 ~]#
```

---
以上
なりすましを回避するメールセキュリティーの種類


- SPF:

[SPFは"Envelope-From"のドメインを認証します](http://blog.smtps.jp/entry/2017/12/22/095814)

1. あらかじめ、送信側ドメインの**DNSサーバのTXTレコード**に、送信側メールサーバのIPアドレス(SPFレコード)を登録する。
2. 受信側メールサーバは、エンベロープFromドメインを管理するDNSサーバのTXTレコードからSPFレコードを取得し、それが**送信元メールサーバのIPアドレス**と一致するかどうかをチェックする。

- DKIM:

[DKIMは"Header-From"のドメインを認証します](http://blog.smtps.jp/entry/2017/12/22/095814)

1. あらかじめ、送信側ドメインの**DNSサーバのTXTレコード**に送信側メールサーバの**「公開鍵」**を登録する。
2. 送信側メールサーバが、自身の**「秘密鍵」による電子署名**を付けて、メールを送信する。
3. 受信側メールサーバが、メールヘッダから特定したドメインのDNSサーバから**「公開鍵」**を取得し、その電子署名を検証し、なりすましやメール改ざんをチェックする。
Codeforces Round #465 A. Fafa and his Company

https://codeforces.com/contest/935/problem/A

# 概要
- n 人の社員がいる
- x 個のグループにチームを分割する。しかし、各チームの人数は均等でなければならない
- ただし、チームメンバは2以上でないとならない。
    - 問題上はチームリーダ＋従業員が1名以上、と書いてあるが、つまり、2名以上でないといけない

# 方針
言い換えれば、nが割り切れる数はいくつあるか？なので素因数分解にほかならない。
ライブラリを使ってもいいが、n が 100,000と小さいので試し割っても良い。

# コード1: 試し割り
```Python
n = int(input())
res = 0
for i in range(1, n):
    res += 1 if n % i == 0 else 0
print(res)
```
https://codeforces.com/contest/935/submission/71680981

# コード2: 因数分解
```Python
"""
make_divisors(16)
# [1, 16, 2, 8, 4\]
"""
 
def make_divisors(n):
    divisors = []
    for i in range(1, int(n ** 0.5) + 1):
        if n % i == 0:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    # divisors.sort()
    return divisors
 
"""
make_divisors_without_own(16)
[2, 8, 4]
"""
 
def make_divisors_without_own(n):
    r = make_divisors(n)
    r.remove(1)
    r.remove(n)
    return r
n = int(input())
l = len(make_divisors_without_own(n)) + 1
print(l)
```
https://codeforces.com/contest/935/submission/71442380
rbenvでrubyを使う【zsh】

Catalinaはzshがデフォルトシェル。
既存の記事ではすんなりとインストールできなかったので備忘録としてzshでのrbenvのインストール方法を残しておく。

## 私の環境
- macOS Catalina 10.15.2
- zsh

全部で8ステップ
Let's go!

### 0. brewを最新にしておく

```
% brew update
```

最新になると

```
% brew update
Already up-to-date.
```
↑こうなる

brewがない人は[homebrewのHP](https://brew.sh/)からダウンロードする
うまくいくと

```
% brew -v
Homebrew 2.2.6
Homebrew/homebrew-core (git revision ae7c1; last commit 2020-02-22)
```
↑こうなる

一応これもやっとく↓

```
% brew doctor
```


### 1. brewからrbenvとruby-buildをinstallする

```
% brew install rbenv ruby-build
```
うまくいくと

```
% rbenv -v
rbenv 1.1.2
% ruby-build --version
ruby-build 20200218
```
↑こうなる

###2. rbenvにPATHを通す
zshはいろいろなfileで設定ができるらしい
それは[この記事](https://qiita.com/tkooler_lufar/items/66e8fa451185e812a33a)で勉強しておく

今回は `~/.zshenv` と `~/.zshrc` を編集する
~/.zshenvに

``` ~/.zshenv
export PATH="/usr/local/bin:$PATH"
export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH" # この一行を追加
```
↑最後の一行を追加し、~/.zshrcに

```~/.zshrc
source $HOME/.zshenv
```
を追加する

### 3. 2の設定を反映する

```
% source ~/.zshrc
```

### 4. rbenvで欲しいバージョンのrubyをインストールする
今回は2.6.4が欲しい

#### 4.1. どのバージョンがinstallできるか確認する

```
% rbenv install -l
1.8.5-p52
1.8.5-p113
1.8.5-p114
1.8.5-p115
1.8.5-p231
1.8.6
.
.
.
2.6.2
2.6.3
2.6.4 # あった！
2.6.5
2.7.0-dev
2.7.0-preview1
```

##### 欲しいバージョンがないとき
rbenvのバージョンが古い可能性があるので、rbenvとruby-buildをupdateする。

```
% brew upgrade rbenv ruby-build
```

#### 4.2. rubyをinstallする

```
% rbenv install 2.6.4
-> https://dqw8nmjcqpjn7.cloudfront.net/1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2
Installing openssl-1.1.1d...
Installed openssl-1.1.1d to /Users/you/.rbenv/versions/2.6.4

Downloading ruby-2.6.4.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.4.tar.bz2
Installing ruby-2.6.4...
ruby-build: using readline from homebrew
Installed ruby-2.6.4 to /Users/you/.rbenv/versions/2.6.4
```

### 5. installされたバージョンを確認する

```
% rbenv versions
* system (set by /Users/you/.rbenv/version)
  2.6.4
```

できた

### 6. globalのrubyのバージョンを変更する
今回はinstallした2.6.4に変更する

```
% rbenv global 2.6.4
% rbenv versions
  system
* 2.6.4 (set by /Users/you/.rbenv/version)
```

### 7. バージョンが変わったか確認する

```
% ruby -v
ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-darwin19]
```

## おまけ

```
% which ruby
/Users/you/.rbenv/shims/ruby
```
↑これでrbenv以下のrubyが使用されていることがわかる
7でバージョンが変わっていなかったらrubyのpathを確認する

## 参考
[Macのzshでrbenvを使う](https://qiita.com/seijikohara/items/79b479c9dd2e3b950301)
[rbenvでバージョンがうまく切り替わらない:Ruby on Rails導入](https://teratail.com/questions/40728)
[Getting Rails to Work with Catalina/zsh](https://medium.com/@petehanner/getting-rails-to-work-with-catalina-zsh-84146e1d2099)
[eval "$(rbenv init -)" every time I start on Mac OS X 10.11 El Capitan #815](https://github.com/rbenv/rbenv/issues/815)
BIP39ニーモニックから秘密鍵を生成する

普通、BIP39のニーモニックはHDウォレットと組み合わせて使われ、実際に利用する秘密鍵は親秘密鍵から生成された下位の秘密鍵になる。
それはそれとして、HDウォレット系のライブラリを使わず親秘密鍵を生成する方法を調べてみた。

HDウォレットと組み合わせて使う場合は `hdkey` を使うか、
Ethereumで使うなら `ethereumjs-wallet/hdkey` を使うか、
truffleと使うなら `@truffle/hdwallet-provider` を使うとよさそう。

# 方法

BIP39のニーモニックを生成
↓
ニーモニックからシードに変換
↓
HMAC-SHA512に通す
↓
左256ビットを取り出す
↓
秘密鍵

# コード

```javascript
// BIP39 Mnemonic code for generating deterministic keys
// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
const bip39 = require('bip39');
const mnemonic = bip39.generateMnemonic();
const seed = bip39.mnemonicToSeedSync(mnemonic);

// BIP32 Hierarchical Deterministic Wallets
// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
const crypto = require('crypto');
const key = Buffer.from('Bitcoin seed', 'utf8');
const hmac = crypto.createHmac('sha512', key)

const hash = hmac.update(seed).digest();
const privateKey = hash.slice(0, 32);

console.log(privateKey.toString('hex'))
```

# 注意点

ここで使ったニーモニックをHDウォレット用に再利用しないほうがいい。
マスターキーを直接使ってしまった状態なので。
パッケージ管理ツールのメモ一覧

## パッケージ管理

Redhat Linux: 
- [yum](https://uxmilk.jp/9715) (Yellowdog Updater Modified), DNF

Debian Linux: 
- apt

macOS: 
- [Homebrew](https://brew.sh/index_ja) : macOS上でソフトウェアの導入を単純化するパッケージ管理システム
- "brew -v"
- "brew update"

Node.js: 
[nodebrew](https://formulae.brew.sh/formula/nodebrew)
- "brew upgrade nodebrew"
- "nodebrew -v"
- "nodebrew ls-remote" （オンラインでAvailableなバージョン）
- "nodebrew install-binary v11.11.1"
- "nodebrew ls"
- "nodebrew use v11.11.2"

参考：「Node.jsのバージョンアップ for Mac」 https://qiita.com/Hide-Zaemon/items/cbb4497237843a729994


[npm](https://www.sejuku.net/blog/75691)（Node Package Manager）
- npm ls （依存関係ツリーの表示）
- npm -v （バージョン確認）

JavaScript: 
[Bower](https://www.atmarkit.co.jp/ait/articles/1407/02/news040_2.html)

Swift: CocoaPods

## バージョン切り替え：
Ruby: [rbenv](https://qiita.com/Kodak_tmo/items/73147ed4f0eec54d6e94)
- rbenv -v
- rbenv install --list （オンラインにAvailableなバージョンリスト）
- rbenv install 2.6.9　（バージョンのインストール）
- rbenv versions （ローカルにインストールされたバージョンリスト）
- rbenvglobal 2.6.9 （デフォルトで使うバージョンの指定）
- ruby -v （念の為、確認）
#node で version4 の uuid を生成する

```
npm install -g uuid
```

```
$ node
Welcome to Node.js v13.8.0.
Type ".help" for more information.

> const uuidv4 = require('uuid/v4');
undefined

> uuidv4();
'83f370cd-188d-4bc1-b07c-4be39ef16f50'

> uuidv4();
'81084168-d009-4e31-ba59-a52785369afc'

> uuidv4();
'9be2153b-4308-4813-a7ae-705edf97abce'
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3003








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Tableau初心者の入門メモ（グラフの種類編）

今日はTableauでよく使うグラフの種類をメモ。ほぼリンク。

##散布図
いわずもがな。

##バーチャート
いわゆる棒グラフ

##ラインチャート
いわゆる折れ線グラフ

##パイチャート
いわゆる円グラフ

##ドーナツチャート
中心に穴があいた円グラフ

参考URL：
https://newssdx.kcme.jp/tableau_beginner_donuts/

##ロリポップチャート
キャンディの形のグラフ。

参考URL：
https://www.tableau.com/ja-jp/about/blog/2017/1/viz-whiz-when-use-lollipop-chart-and-how-build-one-64267

##ダンベルチャート
ダンベルの形のグラフ。2つの値の比較の時に結構使える。

参考URL：
https://ex-ture.com/blog/2018/07/24/dumbbell-chart-tableau/

##バブルチャート
散布図+マークのサイズで3次元を表現するグラフ。いい参考サイトが見当たらない・・・。

##パネルチャート
⇒グラフをマス目のようにたくさん並べる方法

参考URL：
https://www.principle-c.com/column/tableau/panelcharts/#__1406215049.1576720504

##レーダーチャート
多角形の良くあるやつ。

参考URL：
https://qiita.com/MYS_moyashi/items/3564dd8d24832e2afaed

##バンプチャート
順位の推移を表すときに使うグラフ。

参考URL：
https://web-kaizen.co.jp/2018/12/13/tableau%EF%BC%88%E3%82%BF%E3%83%96%E3%83%AD%E3%83%BC%EF%BC%89-%E3%83%90%E3%83%B3%E3%83%97%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/

##ツリーマップ
四角を構成比に応じて四角形に区切ったもの。構成比をみるのによく使う。

##あとがき
Qiita使い始めて、見出しつけて書いた後に最後のパートをどう表現するか悩む。
PhpStormバージョン2019.3で入力が不安定なときの対処

# 現象

PhpStormのバージョン2019.3系で、キーボードからの入力が不安定になることがある。
具体的には次のような現象が頻発する。

- ペーストが二重で実行される。
    - `hoge`をペーストすると `hogehoge`になるなど。
- 素早く入力すると前の入力が後の入力にかき消される。
    - 結果 `type` と打ちたいのに `e`しか残らなかったりする。
- 入力が二重に実行される。
    - `a`が`aa`になってたり。
    - キーによるカーソル移動も同様。

この問題は2019.2でも指摘がされており、jdkのバージョン11の挙動が原因とされている。
解決としてはjdkのバージョン8を導入するというものがあり、この問題に対する[IntellJによる公式回答](https://blog.jetbrains.com/jp/2019/07/30/2025)にもなっている。
ただ2019.3系からは導入方法が異なっているようで、かつそれを解説している記事なども見当たらなかったためまとめておく。

# 対処法

[jdk8](https://download-cf.jetbrains.com/webide/PhpStorm-2019.2.2-jbr8.dmg)をインストール > 適当に展開しておく


Preferences > Plugins > Choose Runtime をinstall
IDEの再起動求められるので再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371923/dbd24de2-2869-72bd-7220-72377ddec1aa.png)

Shift*2でショートカットメニューを開き`choose runtime` > 表示されたアクションを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371923/f3f8b3b5-d34d-db1b-901a-ecabb08e4f74.png)

Choose Runtimeメニュー > 先程展開したjdkフォルダを指定してinstall 

これで治るはず。

# 参考
- https://blog.jetbrains.com/jp/2019/07/30/2025
- https://pleiades.io/help/phpstorm/switching-boot-jdk.html
- https://uiuifree.com/blog/develop/phpstorm-2019-2%E4%BB%A5%E9%99%8D%E3%81%A7%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%8C%E6%AD%A3%E5%B8%B8%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84%E4%B8%8D%E5%85%B7%E5%90%88/
初心者でも簡単！SNS認証を実装（はじめに）

初めまして。

現在、複数人でフリマアプリを作っています。

そのフリマアプリで「SNSアカウントを取得していれば、取得しているSNSの情報でログインできる」機能を実装しました。

今回は,「Facebook」と「Google」です。

上記のSNSを選択した理由は以下の2点です。




## ① 「Facebook」と「Google」は、世界中に浸透しているため、SNSアカウントを取得している人が多い。
 「LINE」をはじめとする、日本ではメジャーなSNSは、世界ではマイナーなSNSの可能性があります。「Facebook」と「Google」は世界で見てもかなりの人がアカウントを取得しており、「Facebook」に関しては世界で一番使われているそうです。


##② 「Facebook」と「Google」は他のSNSに比べてAPI側の設定が簡単
SNS認証をする際に、SNSのAPI側の設定（API側の設定については後日投稿します）をする必要があるのですが、「Facebook」と「Google」は他のSNSに比べて、簡単に設定できます。
例えば、「Twitter」だとTwitter社側に「なんで設定する必要があるのかなど」を送り、許可をもらわなければAPI設定をすることができません。
そのため、「Facebook」と「Google」は初心者におすすめです。


　
　






　

次回は、API側の設定方法について投稿します。
お楽しみに！！
macOS で，コマンドラインからゴミ箱を空にする際の備忘録

# 目的
macOS で，コマンドラインからゴミ箱を空にする際の備忘録です

# コード

macOS では、ゴミ箱は ~/.Trash にある

※ファイル削除は自己責任でお願いします。

```
(Finder --> アプリケーション --> ユーティリティ --> ターミナル起動)
$ cd ~/.Trash  # .Trashへ移動
$ du -h        # サイズ出力
$ rm -r *      # ファイル削除
$ ls           # ファイル削除されていることを確認
```

以上

# 参考
[Macのゴミ箱フォルダの場所とそれをFinderのツールバー・サイドバーに登録する方法](http://inforati.jp/apple/mac-tips-techniques/system-hints/location-of-a-macos-trash-folder-and-how-to-register-at-tool-bar.html)
pytorchで非線形関数をbackpropする

タイトルの通り、step関数などの非線形関数を噛ませた場合にもbackpropagationをするにはどうしたらいいかという記事です。

答えは結構簡単で、

```python:
import torch
class RoundNoGradient(torch.autograd.Function):
    @staticmethod
    def forward(ctx, x):
        return x.round()
    @staticmethod
    def backward(ctx, g):
        return g 
```

などと定義してあげればいいです。

具体的には、下のように使えます。この例では、非線形関数として、四捨五入するroundを用いています。

```python:2つ目の関数とロスを定義
m = torch.nn.Conv2d(2, 3, 3, stride=2)
l = torch.nn.L1Loss()
```

```python:普通にroundをした場合
input = torch.autograd.Variable(torch.randn(3, 2, 6, 6), requires_grad=True)
x = input.round()
y = m(x)
output = l(x, torch.autograd.Variable(torch.randn(3, 2, 6, 6)))
output.backward()
print(input.grad[:2,:2,:2,:2])

'''
tensor([[[[0., 0.],
          [0., 0.]],

         [[0., 0.],
          [0., 0.]]],


        [[[0., 0.],
          [0., 0.]],

         [[0., 0.],
          [0., 0.]]]])
'''
```

この場合は途中でroundが挟まっているためにbackpropが出来ていない事がわかります。
次に、RoundNoGradientを使った場合を見てみましょう。

```python:RoundNoGradientを使った場合
input = torch.autograd.Variable(torch.randn(3, 2, 6, 6), requires_grad=True)
x = RoundNoGradient.apply(input)
y = m(x)
output = l(x, torch.autograd.Variable(torch.randn(3, 2, 6, 6)))
output.backward()
print(input.grad[:2,:2,:2,:2])

'''
tensor([[[[ 0.0046, -0.0046],
          [-0.0046, -0.0046]],

         [[ 0.0046, -0.0046],
          [-0.0046, -0.0046]]],


        [[[ 0.0046,  0.0046],
          [ 0.0046,  0.0046]],

         [[ 0.0046, -0.0046],
          [-0.0046,  0.0046]]]])
'''
```

backprop出来ているのがわかります。

ちなみに、tensorflowの場合は

```python:
with graph.gradient_override_map({'Round': 'Identity'}):
```

とするだけで実現できます。

### 参考 
https://discuss.pytorch.org/t/how-to-override-the-gradients-for-parameters/3417
Elasticsearch基礎用語集

Elasticsearchとは、2010年に開発されたApache Luceneをベースとしたオープンソースの検索エンジンです。
Elasticsearchは、全文検索を目的として開発されたものでしたが、ログの収集を行う**Logstash**や、ブラウザ上でデータを解析する**kibana**を組み合わせて使用することが多く、３つを総称して「ELK (elasticsearch, logstash, kibanaa) Stack」と呼ばれることも多いです。

一般的に、ElasticsearchはRDBと比較して、検索処理が高速でパフォーマンスも高く、スコアリングや高度な検索が可能となっています。また、ノードを増やすことによって、スケーラビリティの面も担保しているため、大規模なアプリケーションにもElasticsearchは適しています。
Elasticsearchの特徴をまとめると以下のような感じとなっています。

* 自然言語処理や形態素解析が可能
* 分散配置による、処理の高速化とスケーラビリティの担保
* REST APIによってアクセスできる
* ログ収集やビジュアライズ化などの他のソフトウェアとの連携が可能

今回は、そのElasticsearchの基礎的な用語について解説したいと思います。（随時更新中です）

## Elasticsearchの用語
### Document（ドキュメント）
Elasticsearchでは、格納するデータの単位を**document**と呼んでいます。これは、RDBのrowに当たるもので、JSONフォーマットで表現します。例えば、以下のような感じです。

```json:例 
{
  "id": "1",
  "title": "Elasticsearch完全ガイド",
  "author": "Koki Nagai",
  "page": "300"
}
```
このように、{}の中に、**key**:**value**の形で１つのフィールドを表現します。上の例では、idを付与していますが、明示的にidを書かなくても、Elasticsearch側で自動でidを付与してくれます。

## Field（フィールド）
上記のデータで言うと、`"id": "1"`のような、key : valueの組を言います。このvalueのデータ型として、いくつか紹介します。

* text
    * 文字列を格納するデータ型
    * text型はAnalyzerと呼ばれる、文字列を単語分割される

```json:例
  { "title": "The perfect guide of the Elasticsearch" }
```

* keyword
    * text型と同様、文字列を格納するデータ型
    * keywordとは異なり、検索の用途は「完全一致」
    * Analyzerによって、単語分割はされない

```json:例
  { "place": "東京タワー" }
```

* float、short、integer、long
    * 数値を表す

* オブジェクト型
    * keyに対して、valueがネスト構造を持つことができる
    * このvalueをオブジェクトを表すデータ型と表せる

```json:例
 { "address": { "postalcode": "1111111", "prefecture": "愛知県", "city": "名古屋市" } }
```

## Index（インデックス)

ドキュメントを保存する場所です。ドキュメントをそのまま保存する訳ではなく、kuromojiやn-gramといった自然言語処理よって単語を分割したりして、保存しています。また、保存する際に、シャードと呼ばれるインデックスを一定の単位で分割して、分散的に配置されるようにしています。

## Mapping（マッピング）
インデックスをどのようにして保存するかを定義したもので、RDBでいう所のスキーマにあたります。

## Node（ノード）
Elasticsearchのプロセス。

### Master-eligible Node
Elasticsearchのクラスタは必ず1つのMaste-eligible Nodeを持つ必要があります。Master-eligibleノードは以下の特徴を持ちます。
* インデックスの作成と削除
* 各ノードがどこのクラスターに所属しているかの監視
* シャードの割り当てや再配置

### Dataノード
Dataノードはデータに対する操作（検索やCRUD）や、クエリの応答などの役割を担っています。

## Cluster（クラスタ）
互いに協力して動作するノードグループ。

## Shard（シャード）
上記に記載のインデックスの際に、データを異なるnodeに分散して保存することによって、処理性能を向上させたり、スケーラビリティを持たせたりします。この分散的な保存の単位をシャードと言います。
シャードの数はインデックス作成時には指定できますが、インデックス作成後は変更はできないため、事前にどの程度拡張することが予想されるかを見積もって指定する必要があります。
#node js – javascript で 日付を1ヶ月ずつ引き算する

2020-01-22 -> 2019-12-22 -> 2019-11-22

```js
var x = new Date();

date.setMonth(x.getMonth()-1)

date // 2020-01-22T08:55:29.971Z

date.setMonth(x.getMonth()-1)

date // 2019-12-22T08:55:29.971Z

date.setMonth(x.getMonth()-1)

date // 2019-11-22T08:55:29.971Z

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3002








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
LinuxのBashでディレクトリにあるファイルのフルパス（絶対パス）を表示する

# はじめに
初めての投稿なので至らぬことがあるかもしれませんが、どうかよろしくお願いいたします。おかしな点や改善点などがあれば遠慮なくコメントをください。

# 概要
この記事は一般的Linux環境（ここではdebian系を想定）のBashを使った、ディレクトリにあるファイルのフルパス（絶対パス）を表示するコマンド(スクリプト)を紹介します。

# 動機
Google Compute Engine（GCE）のコンソールでファイルをダウンロードする際にファイルのフルパスが必要になったために作りました。

# 仕様

## コマンド名
lfでは、"ls"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。
lfaでは、"ls -a"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。つまり、ドットファイルも表示されます。
lftでは、"ls -t"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。つまり、更新時刻が新しい順に表示されます。

## 入力仕様
入力としてコマンド引数に、ファイル名（ファイルパス）やディレクトリ名（ディレクトリパス）を複数指定できるようにします。相対パス、絶対パスどちらでも構いません。ディレクトリが含まれていない場合はカレントディレクトリにあると想定します。PATH変数等から検索はしません。
グロブ (glob) はコマンド側では制御しません。

## 出力仕様
入力されたファイル名やディレクトリ名の順に処理を行い、ディレクトリならばそのディレクトリにあるすべてのファイルのフルパスを標準出力に出力します。ディレクトリではない場合はファイルのフルパスを標準出力に出力します。

## エラー処理
引数に指定されたパスが存在しない場合はエラーを出力します。

# 実装

実装は ~/.bashrc の最後に記述しました。
readlinkが使えない場合はコメントにされている次の行を使用してください。
"--color=auto"は不要だと思いますので消しても良いです。

```bash:~/.bashrc

function _lsfp () 
{ 
    local dir file;
    if [[ -d $1 ]]; then
        dir=$(cd "$1";pwd);
        ls --color=auto -1 $2 "$1" | while read file; do
            echo "$dir/$file";
        done;
    elif [[ -e $1 ]]; then
         readlink -f "$1"
#         echo "$(cd $(dirname "$1");pwd)/${1##*/}";
    else
        echo "'$1' is not found." >&2;
    fi
}

function lsfp () 
{ 
    local arg;
    [[ $# -eq 0 ]] && _lsfp "$(pwd)" || for arg in "$@";
    do
        _lsfp "$arg";
    done
}

function lsfpa () 
{ 
    local arg;
    [[ $# -eq 0 ]] && _lsfp "$(pwd)" -a || for arg in "$@";
    do
        _lsfp "$arg" -a;
    done
}

function lsfpt () 
{ 
    local arg;
    [[ $# -eq 0 ]] && _lsfp "$(pwd)" -t || for arg in "$@";
    do
        _lsfp "$arg" -t;
    done
}

alias lf='lsfp'
alias lfa='lsfpa'
alias lft='lsfpt'
```
# 試験

```
$ cd ~/
$ source ./.bashrc
$ lf
$ lfa
$ lft
$ lf ~/
```

# あとがき
Bashはとても便利ですね。これから色々使っていこうと思います。最後まで読んでくれてありがとうございます。

# 追記
短くしてサイズ順（大きい順）で表示するlfsも追加してみました。関数名等が変わっています。

```bash:~/.bashrc

function __lsfp () 
{
    local dir file;
    if [[ -d $1 ]]; then
        [[ $rl ]] && dir=$(readlink -f "$1") || dir=$(cd "$1";pwd);
        ls --color=auto -1 $2 "$1" | while read ent; do
            echo "$dir/$ent";
        done;
    elif [[ -e $1 ]]; then
         [[ $rl ]] && readlink -f "$1" || echo "$(cd $(dirname "$1");pwd)/${1##*/}";
    else
        echo "'$1' is not found." >&2;
    fi
}

function _lsfp () 
{
    local opt arg rl;
    which readlink >/dev/null 2>&1 && rl=1
    [[ $1 =~ ^-[A-Za-z\-]$ ]] && { opt=$1; shift; }
    [[ $# -eq 0 ]] && __lsfp "$(pwd)" $opt || for arg in "$@";
    do
        __lsfp "$arg" $opt;
    done
}

alias lf='_lsfp --'
alias lfa='_lsfp -a'
alias lft='_lsfp -t'
alias lfs='_lsfp -S' # サイズ順
```
Laravelで独自のバリデーションを定義する

## カスタムバリデーションを登録する方法
大きくわけて3パターン

- 1回しか使わない
    - クロージャー
- 頻繁には使わないけど、ある部分で必要
    - ルールオブジェクト
- サイト全体で共通のものとして使いたい
    - Validatorを拡張する

ルールオブジェクトとValidatorを拡張するパターンの明確な使い分けがよくわかってない。
ルールオブジェクトの場合はnewで都度呼び出さないといけないので、使用する頻度で分ければ良い？
毎回必要なものでなければルールオブジェクト
頻繁に使うものはValidatorを拡張する

今回はValidatorを使った方法を記載する。


## 実装

サービスプロバイダーを作成する

```shell
php artisan make:provider ValidatorServiceProvider
```
サービスプロバイダーを登録する

```config/app.php
/*
* Application Service Providers...
*/
App\Providers\ValidatorServiceProvider::class,
```

処理を書く

```App\Providers\ValidatorServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Validator;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
    /**
     * 郵便番号 ハイフンありなしのバリデーション
     *
     * @return bool
     */
        Validator::extend(
            'zipcode',
            function ($attribute, $value, $parameters, $validator) {
                return preg_match('/^[0-9]{3}-?[0-9]{4}$/', $value);
            }
        );
    }


}

```

以上で準備完了。

後はformRequest側で呼び出してあげるだけ

```formRequest.php
public function rules(): array
    {
        return [
            'zipcode' => 'zipcode',
        ];
    }
```

バリデーションメッセージを日本語にする場合は言語ファイルに設定しよう。

```resource/lang/ja/validation.php
//エラーメッセージ
'zipcode'     => ':attributeは郵便番号の形式では入力してください'

//属性
'attributes' => [
    'zipcode' => '郵便番号'
],

```

## ルールオブジェクトを使う場合

ルールオブジェクトの作成

```shell
php artisan make:rule ZipCodeRule
```

```App/Rules/ZipCodeRule.php
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ZipCodeRule implements Rule
{
    /**
     * バリデーションの成功を判定
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
       return preg_match('/^[0-9]{3}-?[0-9]{4}$/', $value);
    }

    /**
     * バリデーションエラーメッセージの取得
     *
     * @return string
     */
    public function message()
    {
       // return 'validation.zipcode';
       //翻訳ファイルからメッセージを取得する場合
       return ':attributeは郵便番号の形式では入力してください';
      
    }
}
```

formRequest側で呼び出す時はこんな感じ。
配列にして書かないといけないので注意。

```formRequest.php
public function rules(): array
    {
        return [
            'zipcode' => ['required', new ZipCodeRule],
        ];
    }
```
AWS Lambdaのコンソールでトリガーを削除しようとすると「The Destination field is required for an OnFailure configuration.」となる

## 事象

AWS Lambdaのコンソールの[Designer]で追加済みのDynamoDBトリガーの[☓]をクリックする。
![image.png](https://image.docbase.io/uploads/1fd8c4ea-e9d3-4f1c-9442-478b94b2eaf4.png)

トリガーが[保留中の削除]となる。[保存]をクリックする。
![image.png](https://image.docbase.io/uploads/afaa8ea2-87c9-4c51-a153-31c93c91842e.png)

保存した後もトリガーが削除されずに残っている。
![image.png](https://image.docbase.io/uploads/45ce96d3-9acb-4b84-abb6-6937f4c562f2.png)

この状態でトリガーの[☓]をクリックすると、トリガーがまた[保留中の削除]となる。[保存]をクリックする。
![image.png](https://image.docbase.io/uploads/b1acc23e-7e06-4622-a3c4-43d665b00a6d.png)

すると下記のエラーが出た。

```
The Destination field is required for an OnFailure configuration. (Service: AWSLambda; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: e7122010-99b2-4166-9a24-7921f466264f)
```

![image.png](https://image.docbase.io/uploads/aeb57f4f-22d3-4781-9935-878e53cc681d.png)

## 解決

もう一度[保存]をクリックしてもエラーは表示され続ける。

ブラウザ画面を更新するとトリガーは削除された。
![image.png](https://image.docbase.io/uploads/b760609c-33a6-4971-8554-88e31316ac3e.png)

以上
publicとprivate、ゲッターとセッターについて

## カプセル化とは？
カプセル化とは、クラスのプロパティとメソッドへのアクセスを制限すること。
publicとprivateを用いて定義する。

### privateとpublic
クラスの外部からアクセスできるようにするには「public」を、アクセスできないようにするには「private」を用いて定義する。
プロパティは基本的にアクセス権をprivateにする。

```php
class Menu {
  private $name;
}

$fruits = new Menu('apple');
echo $fruits->name;  // $nameがprivateのためエラーとなる。

```

## ゲッターとは？？
上記のように、privateにするとプロパティの値をクラスの外から取り出すことができなくなる。
そのため、プロパティの値を返すだけのメソッドを定義する必要がある。
このような、プロパティの値を返すだけのメソッドを特に「ゲッター」という。
ゲッターは「getプロパティ名」のように命名するのが一般的である。

```php
class Menu {
  private $name;

  public function __construct($name) {
    $this->name = $name; // class内なのでこの書き方でアクセスができる
  }
  public function getName() {
    return $this->name; // class内なのでこの書き方でアクセスができる
  }
}

$fruits = new Menu('apple');
echo $fruits->getName();

```

## セッターとは？？
プロパティのアクセス権をprivateにするとプロパティの値をクラスの外から変更できなくなる。
そのため、プロパティの値を変更するメソッドを定義する必要がある。
このような、プロパティの値を変更するメソッドを特に「セッター」という。
セッターは「setプロパティ名」のように命名するのが一般的である。

```php
class Menu {
  private $fruitsCount;

  public function setFruitsCount($fruitsCount) {
    $this->fruitsCount= $fruitsCount; 
  }
}

$fruits = new Menu('apple','strawberry','melon', ...);
$fruits->setFruitsCount(4); // セッターを用いて値をセット。
echo $fruits->setFruitsCount(); // 結果：4

$fruits->fruitsCount= 6;  // privateなので直接アクセスはできない！

```
SwiftUIで作成したUI2つほどライブラリ化して公開してみました

# はじめに
最近作成したSwiftUIのライブラリ紹介になります。
今回紹介するライブラリを使用するとこんな感じのアプリが作れます↓↓↓

(全体的にこの記事に付けたgifもっさりしててすいません:sweat:)
<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/ddd7de96-877b-f204-4669-cbc0df160eae.gif">


# DotPager
[DotPager](https://github.com/yotsu12/DotPager)
Image用のページャーになります。
<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/1413cab5-10ff-107b-6b2d-e0511ed094cc.gif">

# TagLayoutView
[TagLayoutView](https://github.com/yotsu12/TagLayoutView)
Flutterの"Wrap"Widgetいいな〜と思って試してみました。

<img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/6b980347-a660-ce73-b1a4-8ede3cff5e68.gif">
node + javascript で今日の日付を文字列に変換する、YMD形式で出力する例  #javascript #node 

なにやら strftime 的な YMD 形式でうまく区切るメソッドはなさそう？

```
node


> new Date().toISOString().split('T')[0]
'2020-02-22'

> new Date().toDateString()
'Sat Feb 22 2020'

> new Date().toDateString()
'Sat Feb 22 2020'

> new Date().toGMTString()
'Sat, 22 Feb 2020 08:43:15 GMT'

> new Date().toISOString()
'2020-02-22T08:43:22.536Z'

> new Date().toJSON()
'2020-02-22T08:43:31.867Z'

> new Date().toLocaleDateString()
'2/22/2020'

> new Date().toLocaleTimeString()
'5:43:53 PM'

> new Date().toLocaleString()
'2/22/2020, 5:44:00 PM'

> new Date().toString()
'Sat Feb 22 2020 17:44:09 GMT+0900 (Japan Standard Time)'

> new Date().toTimeString()
'17:44:15 GMT+0900 (Japan Standard Time)'

> new Date().toUTCString()
'Sat, 22 Feb 2020 08:44:22 GMT'

```

こんな prototype の関数が見つかるが、採用されなかったのだろうか

[Date.prototype.toLocaleFormat() - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleFormat)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3001








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windowsでショートカットだとcdできないからシンボリックリンクを作った話

# はじめに
`powershell`とか`cmd`でフォルダ移動するときに、階層が深いと面倒だなと思って、
ショートカットを作ってみました。

しかし、ショートカットを引数にして`cd`しても、`cmd`も`powershell`もエラーとなってしまう。ファイルを直接実行すると、エクスプローラーでショートカット先が開く…。

# シンボリックリンクを作る
取り合えず、ショートカットではやりたいことが実現できないことがわかりました。
Linuxならシンボリックリンクでいけるのに…Windowsで作れないかなと思って
Google検索すると、発見。`powershell`と`cmd`でやり方が違う模様。

```powershell:powershellの場合
New-Item -Value 'シンボリックリンクのリンク先パス' -Path 'シンボリックリンクの作成先ディレクトリ' -Name 'シンボリックリンクのファイル名' -ItemType SymbolicLink
```

```:cmdの場合
MKLINK /D 'シンボリックリンクのファイル名' 'シンボリックリンクのリンク先パス'
```
※`MKLINK`の`/D`はディレクトリ用のオプションです。

これで、やりたいことが実現できました。

# 参考
[Windowsでシンボリックリンクを作る](https://dev.classmethod.jp/etc/make_windows_symbolic_link/)

[PowerShellで苦労して作るシンボリックリンク](https://qiita.com/tokky_se/items/128a04e861b2863e2c99)
🍰【CakePHP2】バルクインサート失敗するときは対象カラムを確認する

## 環境
PHP 7.2.21
CakePHP 2.10.18
MySQL 5.7.27

## やりたいこと
ModelのinsertMulti()関数を使い、
配列の内容から複数件インサートを行う際に次のエラーが出たので対応した


```error.log
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
```

```error.log
                            [0] => `{schema名}`.`{table名}`
                            [1] => `id`, `hoge_fuga`, `foo_bar`, `toto`, `pippo`, `xyzzy`
                            [2] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 0609045000
                                            [hoge_fuga] => 1123
                                            [new_column] => 1
                                            [foo_bar] => 202002
                                            [toto] => 2020-01-01
                                            [pippo] => 9999991
                                            [xyzzy] => Q-2
                                        )
```

## やったこと
insertMultiの第2引数が対象カラムで第3引数がインサートする値配列
この2つにあるカラムが合っていないと↑のエラーが発生するので見直して修正する

```HogeController.php
            $hogeItems[] = [
                'id'         => $id,
                'hoge_fuga'  => $hogeFuga,
                'new_column' => $newColumn, 
                'foo_bar'    => $fooBar,
                'toto'       => $toto,
                'pippo'      => $pippo,
                'xyzzy'      => $xyzzy,
            ];

            // 🔵それぞれのカラムが合致
            // バルクインサートする
            $this->HogeModel->getDataSource()->insertMulti(
                '{table名}',
                ['id' , 'hoge_fuga', 'new_column', 'foo_bar', 'toto', 'pippo', 'xyzzy'],
                $hogeItems
            );

            // ❌それぞれのカラムが揃っていない（↑のエラーの状態）
            // バルクインサートする
            $this->HogeModel->getDataSource()->insertMulti(
                '{table名}',
                ['id' , 'hoge_fuga', 'foo_bar', 'toto', 'pippo', 'xyzzy'],
                $hogeItems
            );
```
jQueryでのmapの使い方

# はじめに
今回jQueryを使っている際に、HTML要素の配列を作りたいと思ったときに、オブジェクトにしか配列を作れないと思って、調べてれるとHTMLにも「.map()」が使えるとわかったので備忘録として残します。

# 「.map()」とは？
「.map()」は、HTML要素や配列・オブジェクトなどに対して繰り返し処理を実行して新しい配列要素を返してくれます。

# HTML要素での「.map()」の使い方

```sumple.html.haml
%p docomo
%p au
%p softbank
```
上記のような`pタグ`が3つあり、この`pタグ`に対して「.map()」の繰り返し処理を使ってみます。

```sumple.js
var texts = $('p').map(function(index, element){

  return element.innerHTML;

});

console.log(texts);
console.log(texts[0]);
```

結果

```
['docomo', 'au', 'softbank']
docomo
```
上記のような結果が返ってきます。

余談で、特定の要素をクリックして、その要素にチェックボックスがあり、チェックされてるかどうかを検証する場合

```sumple.js
$(document).on('click', '.checkboxの要素', function(){
  var array = $('.checkboxの要素').map(function(index, value){
    return $(this).val();
    // $(this)は、イベントを発火させた要素の取得
  });
});
```
みたいな感じで、`$(this)`の値で新しい配列を作成することも可能です。

# 配列・オブジェクトでの「map()」の使い方

- 注意点として、引数で持たせている、indexとvalueの順番がHTMLを書く場合と逆になっています。

```sumple.js
var array = ['docomo', 'au', 'softbank'];

var array = $.map(array, function(value, index){

  return value + 'キャリア';

});

console.log(array)
```

結果

```
['docomoキャリア', 'auキャリア', 'softbankキャリア']
```

# mapを活用

上記のように配列にしまうととても便利です。
`each`で処理を回したり、条件分岐にも使えたりするので、配列を作成する場合は積極的に使うべきかと思います。


# まとめ

今回は特定の要素をクリックして、その要素のidを配列に組み替えて、dataをHTMLに返す作業をした際に、特定のイベントがクリックされるたびに

```
var array = [];
array.push(id);
```
みたいなことをしたんですが、イベントが発火するたびに[]の配列が作成されて、一つしかpushされなかったので、mapを使えることを知って助かりました。
わかりにくい点が多いかと思いますが、ご指摘等あればよろしくお願いします。
GCP を使ってトレンドを一覧できるWebアプリ作ってみた


# はじまり
ある日の朝
僕はいつも通りTwitterのトレンドを確認していた
続いて各種ITメディアのトレンドを確認、勿論Qiitaも
Githubのリポジトリトレンドも確認

。。。。ヤバイ、超めんどくさい

そうだ、トレンドを一覧できるwebサービス作れば良いんじゃね？？

始まりはそんな感じ

こんなのを作ったので、詳細を説明する記事
https://trends-hub.appspot.com/trends/

# 技術仕様
- フロントは React + Redux & GAE(スタンダード) 
- バックエンドは Django & GAE(スタンダード)
- スクレイピングサーバは Flask & CloudRun
- スケジューラは CloudScheduler
- DBは cloud SQL

とりあえず1ページ作るためだけなんだけど
拡張のしやすさを考慮して、技術選定はオーバースペックにした
普段から使用しているので、学習コストも無い

正直GCPは使いたかっただけなので、個人開発だしGAE から GCE にすると思う
redux はぶっちゃけこの規模なら絶対不要
でもユーザーログイン機能とかその他もろもろ継ぎ足して行ったら必要になるかもしれないし、一応使っておいた

# アーキテクチャ

![arch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445967/9f4a93ae-622f-33b6-58af-7c1ede229653.jpeg)

スケジューラで数十分おきにクラウドランをキックして、FlaskでスクレイピングしてDjango経由でDBに保存っていう感じ

# まとめ
所要時間は20時間（５日間）
正直スクレイピングが一番時間かかった
13メディア程度だけど、コレから拡張しようか迷う

GoogleAnalytics も一応入れておいた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445967/9672c022-0ba2-f343-9cb5-31743e7f4276.png)

UUが4日間で162人
最終日の生き残りは16人

１割生き残ってくれたなら良い方かな？
ユーザログイン機能つけて、Firestore との連携でトレンドの並び替え・取捨ができる様になったらもっと便利になることは間違いないんだけど
React Native Expo で作りたいものができてしまったので、よっぽどアクセス増えなければこのまま自然消滅かな

GAEはめちゃ便利
僕がエンジニアになったときは、サイバーダック使ってVPSサーバーにSFTPでデプロイしてたんだけど
技術覚えたらそんな手間も無くなってしまった

アクセス無い時のゼロインスタンスとかは財布に優しい
WAKATIMEを導入して時間の可視化をしてみよう。

#wakatime

**[wakatime](https://wakatime.com/)**とは
簡略的に言えばブログラム時間をし可視化してくれるサービスです。

このサービスは
各種エディタと連動して、実際にプログラミングをしている時の**作業時間を自動的に集計**し、**グラフ化**してくれます。
なお、コードの追加時だけでなくコードを編集しているときも計測し、
ファイルがあるディレクトリからリポジトリなどの情報を用いて**プロジェクトごとの時間**まで計測してくれます。

また、離席時間が一定になると、自動的に計測を停止してくれるので、タイマーを停止・再開し忘れる心配はありません。
さらに計測されたデータは、**WEBサイトから確認**、**分析**することが可能です。

##↑少し分かりやすくすると…
1.プログラム時間の可視化
2.グラフで見れる
3.ファイル事の作業時間を見れる
4.どの言語を何%使ってるかわかる
5.週、何時間コード書いてるかわかる

**こんな感じです。**
<img width="600" alt="20191211110322.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493204/1cac6597-07fe-2cde-c5d4-04efb5e238f4.png">

**対応エディタ**
<img width="929" alt="スクリーンショット 2020-02-23 18.22.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493204/1f0c53d9-3a6b-0c50-6891-9a857e254931.png">
##さいごに
今回紹介した**WAKATIME**は
自分のプログラミング**時間**を**可視化**するには非常に便利なサービスです。
作業効率の改善や分析を考えている方は是非利用してみてください。
【python】nCkを導出する方法(ABC156-D)

ABC156-D にて必要になったので備忘。

https://atcoder.jp/contests/abc156/tasks/abc156_d

# 何も考えずに実装すると

```math
nC_k = \frac{n!}{(n-k)!k!}
```

$nC_k$の定義は↑なので、これをそのままコードに書くと、

```python
import math
def comb(n,k):
    math.factorial(n) // (math.factorial(n - k) * math.factorial(k))

print(comb(4,2))
# 6
```

こんな感じになる。
しかし$n!$は$O(n)$なので、今回のABC156-Dのような$n\leqq10^9$の場合では計算時間が長くなり間に合わない。なんとかして計算時間を短くしなければならない。

#前提知識
繰り返し二乗法とフェルマーの小定理をまずは知っている必要がある。

### 繰り返し二乗法
べき乗を高速に求める方法。
pythonでは`pow(x, n, mod)`とすることで $x^n$ を $mod$ で割ったあまりを計算できる。

### フェルマーの小定理
$p$ を素数とし、$a$ を $p$ の倍数でない整数（$a$ と $p$ は互いに素）とするときに、以下が成り立つ。

```math
a^{p-1} \equiv 1 (mod\, p)
```

要は $a^{p-1}$を$p$で割ったらあまりは1だよと言っている。

#nCkを式変形する
$nC_k$は以下のように変形できる。

```math
nC_k = \frac{n!}{(n-k)!k!}=\frac{n(n-1)(n-2)\cdots(n-k+1)}{k!}
```

ここで$\frac{1}{k!}$に注目する。

フェルマーの小定理から、

```math
a^{p-1} mod\, p = 1 \\ \\
a^{p-2} mod\, p = \frac{1}{a} \\
```

$a^{p-2} mod\, p = \frac{1}{a}$が得られる。
よって $\frac{1}{k!} = k!^{p-2} mod\, p$が成り立ち、$k!^{p-2}$は繰返し二乗法で高速に求めることができるので、$\frac{1}{k!}$を高速に求めることが可能になる。

以上から$nC_k$は以下で表すことができる。

```math
nC_k = n(n-1)\cdots(n-k+1) \times(k!^{p-2}\,mod\,p)
```

計算量は$O(k)$である。（$k!$が一番時間がかかる）

#実装
```py
# O(k)
def comb(n,k):
    nCk = 1
    MOD = 10**9+7

    for i in range(n-k+1, n+1):
        nCk *= i
        nCk %= MOD

    for i in range(1,k+1):
        nCk *= pow(i,MOD-2,MOD)
        nCk %= MOD
    return nCk

print(comb(4,2))
# 6
```

# 参考
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%83%AB%E3%83%9E%E3%83%BC%E3%81%AE%E5%B0%8F%E5%AE%9A%E7%90%86
https://note.com/tanon_cp/n/ncff944647054
Vue.jsのフィルターについて

####フィルター
- テキストをフォーマットするようなもの
- 表示したいものを大文字にする、とか小文字にする、とか


##### 例
全て大文字で表示したい時の例

templateタグの中の`title`だけでなく
`subtitle`まで表示させたい時、
scriptタグの中の`computed`を2回書かないと表示できないが...



```Home.vue
<template>
    <div>
        <p v-border:solid.round.shadow="{width:'3px',color:'brown'}"></p>
        <h2>{{upperCaseTitle}}</h2>
        <p>{{subtitle}}</p>
    </div>
</template>

<script>
export default {
    data(){
            return{
                tmpData:"Hello",
                title:"Welcome to Tokyo",
                subtitle:"Tokyo is a great city"
            };
    },
    // 全て大文字にして表示させる
    computed:{
        uepperCaseTitle(){
            return this.title.toUpperCaseTitle();
        }
    },
    computed:{
        subTitle(){
            return this.title.subTitle();
        }
    }
</script>
```

#### フィルターを使うと

```main.js
Vue.filter("upperCase",function(value){
return value,toUpperCase();
});
```

```Home.vue
<template>
 <div>
  <h2>{{title | upperCase }}</h2>
  <p>{{subtitle | upperCase}}</p>
 </div>
</template>

<script>
 export default {
   data(){
    return{
      title:"タイトル",
      subtitle:"サブタイトル"
     };
   },
   computed:{
    upperCaseTitle(){
     return this.title.toUpperCaseTitle();
    }
  }
 };
</script>
```



templateタグのの
{{ }}のなかに、
|(パイプ記号)と、upperCaseと書くと、
computedは一回の記述でOK！


####ローカルに登録する場合
```Home.vue
//ローカルに登録する場合
<script>
export default {
    filters:{
        lowerCase(value){
            return value.toLowerCase();
        }
    }
};
</script>
```
**※フィルターではthisは使えない！**
もしthisでアクセスしたい場合は、computedやmethodを使う！

####フィルターは連結できる
どうやってやるかというと・・・

```Home.vue
<template>
 <h2>{{title | lowerCase | upperCase}}</h2>
</template>
```
という風に、先に書いた|(パイプ記号)の後に、さらに|を追加して、その後追加したいプロパティを追記します！

この結果は、全て**大文字**になります。

なぜかというと、
先に`title | lowerCase`が実行され、
その後に`upperCase`が実行されるからです

### computed とfilterの違いは？？
動的なデータを表現する時に使う`coomputed`オプションと`filter`とでは何が違うのか??





#### その前にcomputedオプションとmethodオプションとでは何が違うのか??
#####computed
- 依存関係に基づいてキャッシュされる
- いつその関数が実行されるかに注目する必要がある
- 参照先の値が変わった時のみ、実行される
- リアクティブな依存関係に基づきキャッシュされる


#####method
- clickイベントの中にmethodを書いたら、クリックした時に、イベントが発生する
- {{ }} のなかにmethodを書くと、いつ実行したら良いかわからない
- methodsの中身が新しく変わったら{{ }} の中身を書き換える必要があるが、templateの中身が少しでも変わって再描画された時、{{ method名 }}は、毎回実行されてしまう

####filter
- 実行されるたびに再描画されてしまう
- なので、再描画が頻繁に行われる場所では使わない方がいい
- 何度も同じような処理を書きたいけど、computedだと冗長なコードになってしまう場合はfilterを使う