OmniAICreator/Qiita-1.07M huggingface dataset:
【競馬】競走馬の強さを数値化してみた

こんにちは、アオキ([@aoki_eng](https://twitter.com/aoki_eng))です。
今回、競馬における競走馬の強さを数値化してみたので、この記事にまとめます。

githubはこちらです(https://github.com/katsuomi/keiba-BTmodel)

# はじめに
僕は競馬が大好きです。
毎週末、重賞レースと呼ばれる大きなレースは全てテレビで観ていて、少額ですがお金も賭けています。

そこで、よく競争馬の過去のレース結果を見るのですが、その馬がどれくらい強いのか具体的に分からないなと感じていました。
例えば、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/a0d3450b-08eb-91de-5bba-9149e25764f4.png)
この馬はどれくらい強いでしょうか？
1着になっているレースがまぁまぁ多く、そこそこ強そうですね！

この馬はどうでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/d272b6f0-aa91-d383-f7a3-dbcec0d7a043.png)
1着になっているレースがまぁまぁ多く、そこそこ強そうですね！

と、まぁだいたい強い馬なのか弱い馬なのかは、直感的にわかるのですが、
具体的にどれくらい強いのか分かりません。

馬の強さを具体的に表してみたい！！という好奇心によって今回、数値化してみることにしました。

# Bradley-Terryモデルの利用
### Bradley-Terryモデルとは
> n 個の要素 (チームや個人) があり，何らかの対戦を行うものとする．
対戦は1要素対1要素のマッチで行われ，その結果は片方の要素の対して勝利，または敗北しか生じないとする．
何回か対戦した結果から各要素の「強さ」をはかるとする．ここで要素iが要素jに勝利する確率をPijとしたとき，すべての組み合わせに対して，
<img width="461" alt="スクリーンショット 2020-05-12 17.54.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/158e0933-60b3-a52d-cbfb-5732ff3b377f.png">
となるπiを導入する．式(1)の関係式を Bradley-Terry（BT）モデルという 
BTモデルにおいてπiは，要素iの強さを表すと考えることができる．
BTモデルは，直接の対決が無い場合にも，第三者との対戦を媒介として勝敗を決することが可能であるとされている
([こちら](http://www-mcs.c.oka-pu.ac.jp/pdf/abstract/2006_SatoshiNishimoto_MasterAbstract.pdf)より引用)

この記事では、BTモデルに関して詳しく解説はしません。
簡単に言うと、

**1対1で対戦していくようなものに対して、合理的にそれぞれの要素の強さを出せるモデルです！**

(じゃんけんなどの得意不得意があるものは表現できません)

よくある例で、
・セリーグ・パリーグの球団の強さを出してみる！
・Jリーグのチームの強さを出してみる！
みたいなのがあります。

では、競馬のレースについて考えます。
例えば、あるレースの結果が以下のような場合
<img width="191" alt="スクリーンショット 2020-05-12 18.11.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/4f922af7-a130-1f88-bb20-9f6c1cf10bf2.png">
2番の馬に着目すると、
<img width="343" alt="スクリーンショット 2020-05-12 18.08.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/05f148f7-1e01-6035-281a-c79eb0e927aa.png">
・1番の馬に対して、負けた
・3~18番の馬に対して、勝った

ということが言えます。

このようにして、競馬のレースにおいて
"競争馬vs競走馬の試合が行われている"
とみなすことで、BTモデルを適用しようと考えました。

# 実装
・JRAの公式HPから、2014~2018年のレース結果をスクレイピングし集計
・その結果にBTモデルを適用させる

具体的な実装方法は、こちらに載せてあります(https://github.com/katsuomi/keiba-BTmodel/blob/master/pointToHorseStrength.py)

# 結果
<img width="882" alt="スクリーンショット 2020-05-12 18.18.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/625b1f9b-120e-bcd3-7ade-76b37a282983.png">

現役馬で、もっとも強い競争馬は、**アーモンドアイ様**ということになりました！

# おわりに
今回、BTモデルを使って、競争馬の強さを出してみました。
やはり、今も活躍している馬や過去に活躍していた馬の数値は高く、特にこれといって得られたものはありません。(笑)

おっと
今週末、現役馬で、もっとも強い競争馬であるアーモンドアイ様が出走予定のヴィクトリアマイルというレースが行われます。
例年荒れているレースですが、はたして...!!!!

[参考]
Bradley-Terryモデルについて　https://www.gavo.t.u-tokyo.ac.jp/~mine/japanese/IT/2017/toukei171211.pdf
馬の成績に関して　https://www.netkeiba.com/
過去のレース情報に関して　http://www.jra.go.jp/
政府統一基準とは

# 1. 要約（3行まとめ）
- 政府統一基準は中央省庁や独立行政法人のセキュリティ対策の基準だよ。
- NISCが作って、サイバーセキュリティ戦略本部が決めているよ。
- 中央省庁や独法だけでなく、他の業種でも参考にされることがあるよ。

# 2. 政府統一基準とは
- 正式名称：政府機関等の情報セキュリティ対策のための統一基準群（平成30年度版）
- 説明：国の行政機関、独立行政法人、指定法人（例：地方公共団体情報システム機構な等）のサイバーセキュリティに関する対策の基準。
- 根拠法：サイバーセキュリティ基本法（平成26年法律第104号）
- 決定：サイバーセキュリティ戦略本部
- 実務（基準案作成等）：内閣サイバーセキュリティセンター（NISC）
- 初版：[平成17年に決定（2005年）](https://www.nisc.go.jp/active/general/kijun01.html)
- 構成文書：
  - 統一基準群
  - 政府機関統一基準適用個別マニュアル群
  - 統一基準群（平成30年度版）の教材
- その他：[NISCのWebサイト参照](https://www.nisc.go.jp/active/general/kijun30.html)
- 補足：構成文書間の関係性は、「政府機関統一基準適用個別マニュアル群」⇒「情報セキュリティ監査実施手順の策定手引書」⇒「図 1.1-1 策定手引書と統一基準群との関係 」が分かり易い。

# 3. 関連組織
- 内閣
  - [サイバーセキュリティ戦略本部](https://www.nisc.go.jp/conference/cs/)
- 内閣官房
  - [内閣サイバーセキュリティセンター（NISC）](https://www.nisc.go.jp/about/index.html)
     - [政府機関総合対策グループ](https://www.nisc.go.jp/active/general/outline.html)

# 4. 雑記
- NISCの正式名称は「National center of Incident readiness and Strategy for Cybersecurity」
- 「政府統一基準」が正式な略称という出典は見つけられなかったが、[NISCの文書でも「政府統一基準群」という表記はされており](https://www.nisc.go.jp/active/general/pdf/K304-305gaiyou.pdf)、ある程度は一般的な呼称と考えられる。
- 指定法人の一覧は「[サイバーセキュリティ基本法第13条の規定に基づきサイバーセキュリティ戦略本部が指定する法人について](https://www.nisc.go.jp/conference/cs/index.html)」で公開されている。

# 5. 更新履歴
- 2020/05/12：初版投稿
DataLiner用前処理パイプラインテンプレート

# はじめに
いちいちReference見ながら処理足すのメンドクサイ！という人向けの全部入りテンプレートです。
用途に合わせてコメントアウトや入れ替え等どうぞ。

# インストール
```
! pip install -U dataliner
```

# テンプレ

```python
import dataliner as dl
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline

X, X_test, y = dl.load_titanic()

process = make_pipeline(
    dl.DropColumns(drop_columns=['PassengerId']),
    dl.DropNoVariance(),
    dl.GroupRareCategory(threshold=0.01),
    dl.DropHighCardinality(max_categories=50),
    dl.DropLowAUC(threshold=0.51),
    dl.ClipData(threshold=0.99),
    dl.BinarizeNaN(),
    dl.CountRowNaN(),
    dl.ImputeNaN(cat_strategy='mode', num_strategy='mean'),
    dl.AppendEncoder(dl.TargetMeanEncoding(k=0, f=1, smoothing=True)),
    dl.OneHotEncoding(drop_first=True),
#     dl.TargetMeanEncoding(k=0, f=1, smoothing=True),
#     dl.CountEncoding(),
#     dl.RankedCountEncoding(),
#     dl.FrequencyEncoding(),
#     dl.RankedTargetMeanEncoding(k=0, f=1, smoothing=True),
#     dl.RankedEvaluationMetricEncoding(metric='roc_auc'),
    dl.StandardScaling(),
#     dl.MinMaxScaling(),
    dl.UnionAppend([
        dl.AppendCluster(n_clusters=8, random_state=1234),
        dl.AppendAnomalyScore(n_estimators=100, random_state=1234),
        dl.AppendPrincipalComponent(n_components=5, random_state=1234),
        dl.AppendClusterTargetMean(n_clusters=8, random_state=1234),
        dl.AppendClusterDistance(n_clusters=8, random_state=1234),
        dl.AppendArithmeticFeatures(max_features=50, metric='roc_auc', operation='add', replace_zero=0.001),
        dl.AppendArithmeticFeatures(max_features=50, metric='roc_auc', operation='subtract', replace_zero=0.001),
        dl.AppendArithmeticFeatures(max_features=50, metric='roc_auc', operation='multiply', replace_zero=0.001),
        dl.AppendArithmeticFeatures(max_features=50, metric='roc_auc', operation='divide', replace_zero=0.001),
#        dl.AppendClassificationModel(model=RandomForestClassifier(), probability=False)
    ]),
#     dl.DropLowAUC(),
    dl.PermutationImportanceTest(threshold=0.0001),
    dl.DropHighCorrelation(threshold=0.95),
)

Xt = process.fit_transform(X, y)
Xt_test = process.transform(X)
```
CentOS7 logwatch メール配信まで

CentOS 7 にlogwatchをインストールして、メールへ自動配信するまでの記録を記します。

```ruby:logwatchをインストール
#インストール
yum install logwatch

```

記述済みの初期ファイル logwatch.conf が、/usr/share/logwatch/default.conf/
に格納されています。
また、/etc/logwatch/conf/にもlogwatch.confという同名の空ファイルがあります。
空の/etc/logwatch/conf/logwatch.confを削除し、
初期設定ファイル　/usr/share/logwatch/default.conf/logwatch.confを
/etc/logwatch/conf/　に格納（コピー）しました。

```ruby:ファイルを整理
#空っぽファイルの削除
rm /etc/logwatch/conf/logwatch.conf
#設定ファイルをコピー
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
```

```ruby:設定ファイルを編集
vi /etc/logwatch/conf/logwatch.conf
```

```ruby:logwatch.conf　編集箇所
#44行目　メールの宛先を希望のメールアドレスに書き換えます。
MailTo = kashiwagi@takeshi.com
#76行目　情報のレベルをより詳細にみる場合はHigh
Detail = High
```

最後に出力のテストを行います。

```ruby:出力テスト
#画面上に標準出力する場合
 logwatch -output stdout
#メール出力する場合
 logwatch -output mail
```

これで表示されたらOKです。
【MS ACCESS】UPDATEの際に他のテーブルをjoinして更新をする。

メモとして残します。


#■やり方

```sql

update A left join B on A.hogeid=B.hogeid set A.value = B.value;
```

以上。

#■さいごに
他のRDBMSのSQLでは記法が違うため悪しからず。。。
【Javascript】配列の操作いろいろ①

##`配列とﾙｰﾌﾟ処理を組み合わせる`##
- for()を使う

```javascript

  const scores = [10,20,50];

  for(let i = 0; i < scores.length; i++){
    //テンプレートリテラルを使う
  console.log(`Score: ${i}: ${scores[i]}`);
    //実行結果
    //Score:0:10
    //Score:1:20
    //Score:2:50
  
```

##`配列の要素を変更する`##
- push( )　pop( )　shift( )　unshift( )を使う

```javascript
{
  const scores = [10,20,30];
    //配列の末尾に要素を追加
  scores.push(40,50);
  console.log(scores);
    //実行結果
    //10,20,30,40,50
}

{
  const scores = [10,20,30];
    //配列の先頭から要素を削除(１つずつしか要素を削除できないので引数は必要ない)
  scores.shift();
  console.log(scores);
    //実行結果
    //20,30,
}

//先頭に要素を追加　unshift();
//末尾から要素を削除　pop();
```

##`配列の途中の要素を操作する`##
- .splice( )を使う

```javascript
{
  const scores = [10,20,50,80];

    //変数.splice(変化が開始する位置,削除数);
    //この場合20と50が削除される
  scores.splice(1,2);
  console.log(scores); 
    //実行結果 
    //10,80
}
  
{
  const scores = [10,20,50];

    //変数.splice(変化が開始する位置,削除数,追加したい要素);
    //この場合、削除は無く50の前に30と40が追加される
  scores.splice(2,0,30,40);
  console.log(scores); 
    //実行結果
    //10,20,30,40,50
}
```

##`配列に配列を埋め込む`##
- スプレット構文を使う

```javascript

  const scores1 = [10,20,30,40];
  const scores2 = [50,60];

    //このscores2をscores1に入れたい場合はスプレット構文を使う。（ドット３つ）
  const scores1 = [10,20,30,40, ...scores2];
  console.log(scores1);
    //実行結果
    //10,20,30,40,50,60
```

##`配列の要素を個々の定数にする`##
- 分割代入を使う

```javascript

{
  const scores = [10,20,30,40];
  //個々の要素をa,b,c,dに代入するには分割代入を使う
  const [a,b,c,d] = scores;
  console.log(a);  //10
  console.log(b);  //20
  console.log(c);  //30
  console.log(d);  //40
}

{
  const scores = [10,20,30,40];

  //定数と新たな配列を指定したい場合は分割代入とレスト構文（ドット３つ）を組み合わせて使う
  const [a,b,...other] = scores;
  console.log(a);  //10
  console.log(b);  //20
  console.log(other);  //30,40
}
```

##`分割代入の応用`##

```javascript

  let x = "アイス";
  let y = "チョコ";
  [x, y] = [y, x];
  console.log(x);  //チョコ
  console.log(y);  //アイス
```
ゼロから始めるLeetCode Day23「226. Invert Binary Tree」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day22「141. Linked List Cycle」](https://qiita.com/KueharX/items/20f411ebf1c53cff2208)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

[Twitter](https://twitter.com/kueharx)やってます。


# 問題
[226. Invert Binary Tree](https://leetcode.com/problems/invert-binary-tree/)
難易度はeasy。
Top 100 Liked Questionsからの抜粋です。
Top 100 Liked Questionsのeasyも残り10問となりました、もっと勉強進めてMediumくらいはさくっと解けるようになりたいですね。


問題としては与えられた二分木の構造をそっくりそのまま反転させるというものです。

```
Example:

Input:

     4
   /   \
  2     7
 / \   / \
1   3 6   9
Output:

     4
   /   \
  7     2
 / \   / \
9   6 3   1
```

見ればわかると思うので特に解説はないです。


# 解法


それぞれの子以下を反転させて最後に右と左の子を入れ替えれば良いので、この問題は右側と左側を分けて考えるとわかりやすいです。

よくある再帰で書きました。

```Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return None
        right = self.invertTree(root.right)
        left = self.invertTree(root.left)
        root.left = right
        root.right = left
        return root
# Runtime: 28 ms, faster than 74.30% of Python3 online submissions for Invert Binary Tree.
# Memory Usage: 13.8 MB, less than 5.41% of Python3 online submissions for Invert Binary Tree.
```

たまにはこんな感じでさくっと終わってもいいでしょう。
木の練習にはいいと思うのでぜひ解いてみてください。
Windows10でmakeしたい

# ゴール
Windows10でmakeコマンドを使えるようにする

# How to?
## 1. インストーラのダウンロード
公式サイトからインストーラをダウンロード
[Make for Windows](http://gnuwin32.sourceforge.net/packages/make.htm)
<img alt="make_in_windows1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616261/9e8042c2-2ea9-83b0-86b6-4a34054427de.png" width="800px">

デザインが無機質すぎてちょっと怖い（失礼）

<br>

ページ中ほどの「Downloads」の一番上にある
・Complete package, except sources
の「Setup」をクリックするとインストーラのダウンロードが始まる
<img alt="make_in_windows2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616261/9dc2537f-36a1-7848-c1e5-2ef844b1996e.png" width="800px">
最終更新が2006年なんだけど大丈夫なのかな．．．

## 2. インストール
今しがたダウンロードしたインストーラを起動
インストール先のパスを指定したり，スタートメニューにショートカットを作るかどうか決めたりして，基本的に道なりに進めばインストール完了
（32bit向け感が否めないんだけど本当に大丈夫かな）

## 3. PATHの設定
makeコマンドをどこからでも呼び出せるように環境変数のPATHを設定する

そもそもmakeはどこにあるのかというと

```
C:\Program Files (x86)\GnuWin32\bin
```
デフォルトならここに「make.exe」ってファイルがあるはず

<br>

そして環境変数を設定するには

```
コントロールパネル＞システムとセキュリティ＞システム
```
内にある「システムの詳細設定」をクリック
開いたウィンドウ内の「環境変数」をクリックして，

```
「Path」を選択して「編集」をクリック＞「新規」
```
でさっきの「～/bin」のパスをコピペ
すでにコマンドプロンプトを開いていたら一旦閉じて開きなおす

## 4. makeしてみる
makeしたいファイルがあるディレクトリに移動

```console:コマンドプロンプト
$ cd path/to/directory
```
```make -f ファイル名```ってコマンドでmakeできる
もしくは```-f```オプションをつけない場合は```Makefile```をデフォルトで読み込むらしい

<br>

以上．

# 参考
[Windows環境でmakeコマンドを利用する - MRが楽しい](https://bluebirdofoz.hatenablog.com/entry/2019/10/24/221517)
WebStorm/PHPStorm で TypeScript の null合体演算子（??）など新しい記法でエラー表示になる問題

解釈に利用するTypeScriptのバージョンが古いとエディタが新しい記法を認識してくれません。
表示上エラーになるけど実行に問題ないケース。
（問題があったケースのスクショを貼りたかったのですが、設定を戻してももう同じエラーを出してくれないので断念。すみません。）

私の環境だとデフォルト設定だと`Bundled`になっており、バージョンだと 3.5.4 でした。

以下の設定の場所で自分が実際に使っているTypeScriptのバージョンと合わせてあげると良さそうでした。

![貼り付けた画像_2020_05_12_18_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/1bde650c-7d7f-077d-e3dd-63a2d2efd019.png)
CentOS 再起動後　インストール画面に戻る

初投稿です。

CentOSをインストール後、再起動するも上手くいかない場合


1 Virtualboxの容量拡張を行い、64Gibに変更する。

未解決の場合
2 VirtualBoxで起動順序を変える設定を行う。


https://www.dot-plus.com/server/linux/centos/1582/
MySQLバージョン8で権限付与する方法

忘れっぽいのでメモとして残しておく。

権限を付与する際に以前は

```grant all privileges on DB名.* to 'user'@'localhost' identified by 'password';```

こう書いていたが、エラーが出るようになった。（バージョン8で構文が変わったらしい）

下記構文で実行したら成功した。

```grant all privileges on DB名.* to 'user'@'localhost';```
サーバーレスでヤフオクの在庫自動管理

#はじめに
ヤフオクでの出品物の在庫管理を任されたのでサーバーレスで自動化しました。
流れとしては、出品→在庫へ登録→csvに出力というものです。
最終的に印刷して保存するためにエクセルで開けるようにcsvに出力します。
AWS Lambdaで自動でこの流れを実行できるようにします。

#TL;DR
1. pythonでスクレイピング。DynamoDBに登録
1. DynamoDBのデータを元にcsv生成、AWS S3にアップロード
1. URLにアクセスすると最新版のデータが取得できる　　

この流れで実行されます。

今回のリポジトリ
[ramo798/Inventory_control](https://github.com/ramo798/Inventory_control)

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285408/0461f360-624d-d64e-b5d1-4c4bae866688.png)

#ポイント
##boto3でのupdate_itemメソッドの予約語に引っかかる
```
response = table.update_item(
    Key={
        'model_number': model_number
    },
    UpdateExpression="set url = :url",
    ExpressionAttributeValues={
        ':url':"https://test.com/"
    },
    ReturnValues="UPDATED_NEW"
    )
```
```
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: url
```

`UpdateExpression="set url = :url"`とすると上記のエラーとなるので、`UpdateExpression="set item_url = :url"`と書き換えることでことなきを得た。

##LambdaのAMIロールの設定
* AmazonDynamoDBFullAccess
* AWSLambdaDynamoDBExecutionRole  
の二つの指定を指定しないとdynamoに書き込みができない

##Lambdaでcsvをs3にアップロードするのに手間取った
```
with open('csv/tomokimi_777.csv', 'w', newline="") as f:
```
と記述すると

```
"errorMessage": "[Errno 30] Read-only file system: 'csv/tomokimi_777.csv'",
```
`Read-only`だと怒られてしまうので、`with open`を使わずにCSVを生成しないといけなかった。

```
row = ""
fieldnames = 'タイトル,価格' + "/n"
row += "タイトル," + "2000," + "/n"
```

のように地道に一つのstrとして生成した。
ちなみに価格を`2,000`と記述すると`,`がcsvの区切りと認識されて面白いことになった。

##S3へのアップロード周り
```
import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket_name')

def upload_csv(items):
    srt_csv = "タイトル,価格/n タイトル,2000/n"
    objkey = 'file.csv'
    putobj = bucket.Object(objkey)
    putobj.put(Body=str_csv)
```
これでしっかりと上書き更新されていた。

#今後
* スクレイピングに時間がかかっているので何らかの方法で高速化を検討しないといけない。(現在ローカルでは5分、Lambda上では15分近くかかっているので2つの関数に分けて上限に達しないようにしている)
* デプロイまで全てコマンドラインで行いたかったが、今回は手動でzipで固めてデプロイする手法を取っていたので、次にLambdaで開発を行うときはテストを含めてローカルで行い、コマンドでデプロイまで行いたい。
Shell Script でタイムスタンプでバックアップ

#はじめに
こちらではshellscriptをつかってのディレクトリのバックアップについての説明をしていきたいと思います。

といっても特定のディレクトリを別のディレクトリにタイムスタンプで保存し、間隔をあけループさせるといシンプルなものになります。

#環境
vagrant 
Debian10

#内容

上記したとうりになるので具体的にコードを書いていきます

設定ファイルを読み込む
※設定ファイルは同階層であることを前提とします
↓
間隔が設定されていることを確認
↓
設定したディレクトリがあることを確認
↓
設定した保存先のディレクトリがあることを確認
↓
それぞれ確認してOKならループする


```shell:backup.sh

#!/bin/sh

#cnfの読み込み
. ./backup.cnf

#時間が設定されているかの確認。設定されていなければ勝手に設定
if [ "$LOOPTIME" = "" ]; then
 LOOPTIME=3500
fi

#空文字検査
if [ "$SAUCE" = "" ]; then
 echo "Not Setting Directry Sauce"
fi

#空文字検査
if [ "$AFTER" = "" ]; then
 echo "Not Setting Directry After"
fi

#バックアップしたいディレクトリがあるかの確認
if [ ! -e $BEFOR ]; then 
 echo "Not Directry Sauce"
 exit 
fi	

#バックアップ先のディレクトリがあるかの確認
if [ ! -d $AFTER ]; then
 echo "Not Directry After"
 exit
fi

#ループ
while :
 do
#設定した時間分だけ待機
 sleep $LOOPTIME

#タイムスタンプ取得
 TIME=`date '+%y%m%d_%H%M%S'`

#コピーコマンド
 cp -r $SAUCE $AFTER/$TIME

done

```

cnfファイル内容

```cnf:backup.cnf
LOOPTIME= [時間の設定]
SAUCE= [元フォルダ]
AFTER= [保存先フォルダ]
```

#実行結果

```cnf:backup.cnf
LOOPTIME=3
BEFOR=/home/vagrant/test1
AFTER=/home/vagrant/test2
```

```
$ ./bakcup.sh
```

```
test2$ ls
200512_080142  200512_082406  200512_082407  200512_082408  200512_082409
```

#まとめ
いかがだったでしょうか
足りない部分があればまた足していきます。
自分用gitコマンドメモ

自分用です。

#設定関係
設定には3つあり、system,global,localの順に読み込まれる

- system
    - システム全体の設定
- global
    - 概要ユーザーの全リポジトリ
- local
    - 該当リポジトリ

##現在有効な設定の確認
```
git config -l
```

##個別に設定を確認
```
git config --local -l
git config --global -l
git config --system -l
```

##設定の編集
```
git config user.name example
git config user.email example@example.com
```

#GitHub
githubへつなぐ手順はgitでrepositoryを作成すると出てくるので省略。
ファーストコミットが終了した後の処理

##GitHubに変更を上げる
```
git pull origin master
git push origin master
```
pullでマージしてから、pushで上げる


#ローカルの変更取り消し

```
git checkout .
```

前回のコミットからファイルの変更をリセットしてくれる。
新規追加したファイルは削除されない。
完全に元に戻したいのであれば別途消去コマンドを打つ。

```
git clean -df .
```

※オプションの意味
　-d: ディレクトリを削除対象に含める。
　-f(--force): ファイル削除を強制的に実行する。

#ステージへのaddの取り消し
ステージにaddした変更もリセットする場合は下記。

```
git reset HEAD .
```

<img width="801" alt="Screen Shot 2020-05-12 at 17.58.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/9ed18224-cb5b-20d0-9e00-376669e6348c.png">
※図解gitより


##参考
- [gitでいろいろ取り消したい - Qiita](https://qiita.com/tani-shi/items/3419600447292abf6c79)
- [git clean のオプションについてのまとめ | gotohayato.com](https://gotohayato.com/content/104/)
- [図解 Git](https://marklodato.github.io/visual-git-guide/index-ja.html)
- [Gitの設定をgit configで確認・変更 | note.nkmk.me](https://note.nkmk.me/git-config-setting/)
簡単: RaspberryPi4で aeroTAP 3D USBカメラ aeroTAP SDKビルド方法

# はじめに
aeroTAP 3D USBカメラをRaspberryPi4で動かすために、SDKを作成しました。

超簡単な手順でのサンプルコードのビルド方法と実行について記載しておきます。

# 実行結果
-f　オプションでサンプルプログラム aerotap_RGBDを起動すると、このように距離データを色で表したDepth Map画像が表示できます。VGA ( 640x480 )で表示しています。少し、タイムタグがありますがまあまあかな?

![2020-05-12-174307_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/e78ce2ba-ae68-b52d-e7ad-e7588c5b6390.png)


#準備
aeroTAP 3D USBカメラ
Raspberry Pi4


##RaspberryPi4イメージの作成
イメージは、下記のバージョンを使いました。
2019-09-26-raspbian-buster.zip

[ダウンロード] https://www.raspberrypi.org/downloads/raspbian/

#RaspberryPi4初期設定
Micro-SDカードにイメージを書き込んで、Pi4を起動。起動時にパスワード設定とWi-Fi設定を行う。

###その他の設定、ターミナルで下記を実行
sudo apt-get clean
sudo apt-get update
sudo apt-get upgrade	

###SSHを設定
sudo raspi-config
メニューから Interfacing Options->P2 SSH ->Yes

###ファイルシステム拡張
7 Advanced Options ->A1 Expand Filesystem and hit Enter
7 Advanced Options ->A3 Memory Split and hit Enter
64 で<OK>を選択

###再起動
shutdown -r now

##最低必要なリソースのインストール
sudo apt-get install libusb-1-0
sudo apt-get install libudev-dev
sudo apt-get install freeglut3-dev
sudo apt-get install libv4l-dev
sudo apt-get install libjpeg-dev
sudo apt-get install cmake

#aeroTAP SDK for Linuxのダウンロード
[aeroTAPSDK0511.zip] http://www.aerotap.com/Help.SDK/sample/aeroTAPSDK0511.zip

wget http://www.aerotap.com/Help.SDK/sample/aeroTAPSDK0511.zip

#SDKの展開
unzip aeroTAPSDK0511.zip

#SDKサンプルのビルド
cd aeroTAPSDK/sample/RGBD
mkdir build
cd build
cmake ..
make

## サンプルの実行
./aerortao_RGBD

![2020-05-12-174513_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/97946064-1c69-d94f-b851-ba6ed4ffabbe.png)

escキーで終了します。画面をクリックすると、Depth Map表示、カラー表示、グレースケール表示が切り替わります。
![2020-05-12-174233_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/9522ab3f-6793-2d0d-3367-364d3108ef8d.png)

＃##起動オプション
-f フィルター有効化(簡単なPost処理をしています)
-r0 解像度320x240　QVGAで取得します。かなりリアルタイムに近くなります。

ソースコードも提供しているので、Depth Mapのみ取得することでより高速化が可能です。

挑戦してみてください。

注意: aeroTAP 3D USBカメラは、USB3.0にも対応していますが、USB2.0ポートに接続してください。

aeroTAP 3D カメラに関する情報は、こちら [ www.aeroTAP.com ] http://www.aeroTAP.com

さらに、3Dカメラをネットワークサーバー化するには、こちらを参照してください。

https://qiita.com/nextEDGE-aeroTAP/items/6b81447aff41e9956787
Eclipseで変更をコミットしたコラボレーターのメンバーがGithubでプルリクエストを出し承認されるまで

## この記事は以下を前提としています。
- Githubのアカウントを持っている
- Githubでプロジェクトのコラボレーターとしての権限を与えてもらっている
- Eclipseでブランチをきって開発している。
- EcllipseでGitのリポジトリにコミットするやり方などを理解している

## プルリクエストとは
[株式会社ICS様の記事](https://ics.media/entry/14449/)より
>プルリクエストとは、コードの変更をレビュワーに通知し、マージを依頼する機能です。 コードのレビューを受けることで、1人で作ると気がつかないコードの指摘やバグや記述ミスの発見ができ、コードの品質を高めます。


## Eclipseで変更をコミットしたコラボレーターのメンバーがGithubでプルリクエストを出し承認されるまで

### 新しいリソースを自身のブランチにプッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/5d603583-2885-9133-1c42-039c169c1c78.png)

### Githubにログインし、自身がコラボレーターとして参加しているリポジトリを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/be8efd7d-79c4-52fb-b48c-f0d229f3d14f.png)

### Compare & pull requestボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/43c7c4b8-0635-6fff-694a-b0912b5a3663.png)

### Open a pull request画面でコメントなどを入力しCreate pull requestボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/f462b09b-fd46-53dc-2015-1bec4a66b8ba.png)

### 以下のようなメッセージが表示された場合は自身でmergeしても問題ないが、リポジトリ管理者に開発者がmasterブランチにpullリクエストをマージしてよいかあらかじめポリシーを決めておく必要がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/35a0f1f0-1a62-6a58-0c94-1204afba8099.png)

### Merge pull requestボタンを押下しConfirm mergeボタンを押下し、masterへのマージを完了させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/055e4e37-1b54-6199-5a22-ebaa06c47f80.png)

## 改訂履歴
- 2020/5/12 新規作成
ffmpegでPNG連番画像をMP4動画に変換

ffmpegで以下のようなPNG連番画像をMP4動画に変換する方法を説明します。
![thumbnails-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263312/4246faf3-ea4d-c5fa-0df7-8c7e77026e6c.png)

# PNG連番画像の確認
```sh
$ ls *.png
0010.png  0013.png  0016.png  0019.png  0022.png  0025.png  0028.png  0031.png  0034.png  0037.png  0040.png  0043.png  0046.png  0049.png  0052.png  0055.png  0058.png
0011.png  0014.png  0017.png  0020.png  0023.png  0026.png  0029.png  0032.png  0035.png  0038.png  0041.png  0044.png  0047.png  0050.png  0053.png  0056.png  0059.png
0012.png  0015.png  0018.png  0021.png  0024.png  0027.png  0030.png  0033.png  0036.png  0039.png  0042.png  0045.png  0048.png  0051.png  0054.png  0057.png  0060.png
```

# ffmpegでPNG連番画像をMP4動画に変換するコマンド
```sh
$ ffmpeg -r 2 -pattern_type glob -i '*.png' -vcodec libx264 -acodec copy -pix_fmt yuv420p -r 2 fluid_simulation_in_blender.mp4
```

# youtubeにアップロードの結果
[![Fluid simulation in Blender 2.82](http://img.youtube.com/vi/Jhv_10QcbNE/0.jpg)](https://www.youtube.com/embed/Jhv_10QcbNE)


# PNG連番画像を縮小
```sh
$ mogrify -resize 10% *.png
```

# PNG連番画像をモンタージュ
```sh
$ montage *.png -tile 10x5 thumbnails.png
```

# Ubuntu18.04にffmpegをインストール
```
$ sudo apt install ffmpeg
```

# ffmpegのバージョンの確認
```sh
$ ffmpeg -version
ffmpeg version n4.1.4 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
configuration: --prefix= --prefix=/usr --disable-debug --disable-doc --disable-static --enable-avisynth --enable-cuda --enable-cuvid --enable-libdrm --enable-ffplay --enable-gnutls --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopus --enable-libpulse --enable-sdl2 --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxvid --enable-nonfree --enable-nvenc --enable-omx --enable-openal --enable-opencl --enable-runtime-cpudetect --enable-shared --enable-vaapi --enable-vdpau --enable-version3 --enable-xlib
libavutil      56. 22.100 / 56. 22.100
libavcodec     58. 35.100 / 58. 35.100
libavformat    58. 20.100 / 58. 20.100
libavdevice    58.  5.100 / 58.  5.100
libavfilter     7. 40.101 /  7. 40.101
libswscale      5.  3.100 /  5.  3.100
libswresample   3.  3.100 /  3.  3.100
libpostproc    55.  3.100 / 55.  3.100
```

# Ubuntuのバージョンの確認
```sh
$ uname -a
Linux meme_test 4.15.0-88-generic #88-Ubuntu SMP Tue Feb 11 20:11:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic
```
Ajaxを使った非同期通信の流れ

Ajaxを使った非同期通信の流れ

#非同期通信(Ajax)とは？
ブラウザが再読み込みされることなく通信が行われる通信方式
画面をリロードしなくても、情報が反映されるWepアプリケーションの機能！

AsynchronousJavaScriptXML
の略！エイジャックスと読む。
レスポンスのデータに　JSONというデータ形式を使う。

#JSONとは？
JavaScriptObjectNotationの略で、データ交換を行うための一種
Rubyのハッシュと同様、キーとバリューの組み合わせ。
例）{ name: “yamada”}みたいな

#turbolinksを消す
gemfilre
application.html.haml
application.js

#RailsのjQuery導入
#
```
gem 'jquery-rails'
```
#application.js							
```
//= require jquery
//= require jquery_ujs
```

#非同期通信の実装の全体の流れ
1，JavaScriptを利用してリクエストを行う
2，コントローラでJSON形式のデータを用意するよう準備
3，レスポンスのためのJSON形式のデータを準備（~~.json.jbuilderファイル）
4，JavaScriptでレスポンスを受け取り、HTMLを構築構築構築〜
5，4番で構築したHTMLをViewにぶち込む。終わり。あら簡単

#respond_toとは？
リクエストがHTMLかJSONのレスポンスを求めているのかを条件分岐してくれる。便利必須

コントローラーでJSON形式を受け取れるようにします
#
```
def create
  @todo = Todo.create(todo_params)
  respond_to do |format|
    format.html { redirect_to :root }
    format.json 
  end
end
```

jQueryのデータ取得からajaxに変換まで
#
```
$(function () {
  function buildHTML(post) {
    var html = `
    <div class='content'>${post.text}<div>
    `;
    return html;
  }
  $("form").on("submit", function (e) {
    e.preventDefault();
    var formData = new FormData(this);
    var url = $(this).attr("action");
    $.ajax({
      url: url,
      type: "POST",
      data: formData,
      dataType: "json",
      processData: false,
      contentType: false,
    })
      .done(function (post) {
        var html = buildHTML(post);
        $(".contents").append(html);
        $("#post_text").val("");
        $("form").prop("disabled", false);
      })
      .fail(function () {
        console.log("no");
      });
  });
});
```
オプション	説明
type	HTTP通信の種類を記述する。通信方法は、GETとPOSTの2種類がある。
url	リクエストを送信する先のURLを記述する。
data	サーバに送信する値を記述する。
dataType	サーバから返されるデータの型を指定する。

formからsubmitが起きると、thisでformDataを取得する。
urlはthisのactionを参照する。
formDataを使うなら一緒！仲良しの二人
      processData: false,
      contentType: false,
appendで生成したhtmlをぶち込む。
valで中身を消す
propでボタンを何回でも蘇らせられる（押せるようにできる）
PHPで学ぶクラスとオブジェクトの理解

##はじめに
オブジェクト指向プログラミングとして、PHPやJava,Ruby,Swiftなどプログラミングを学ぶ上で必要な「クラス」と「インスタンス」の理解をするために自分用に記録します。

##オブジェクトとは

関数や関連している変数をまとめてセットにしたもの。
変数と関数など別々に宣言せずに関連したものをまとめて
管理しやすくしたものがオブジェクト指向です。
（例：スライムAのセットの中にHPやMPを作るイメージ）

オブジェクト指向には「クラス」と「インスタンス」の側面があります。

##クラスとは


「クラス」は、オブジェクトの設計図と言われ、
宣言することで、どんな関数や変数を置くのかを決めて
クラスの内部で宣言をします。
全ての関連する変数や関数は、クラスの宣言のタイミングで決定します。
先ほどのスライムで例えると、クラス内部に$hp;や関数でfunction attack(){...}を宣言します。

宣言方法は、最初に　class クラス名 {...}と書き
クラス宣言は、上方に変数、下方に関数を宣言します。

```test.php

class slime {
  //　オブジェクトの変数
  public $type = "スライム";
  public $hp = 20;
  public $power = 12;

  //オブジェクトの関数
  function attack($character_name) {
    print $this->type . "が" . $character_name . "を攻撃して" . $this->power . "ポイントのダメージを与えた!!" . PHP_EOL;
  }
}

```

##インスタンスとは

インスタンスはオブジェクト（つまりスライム）の中身です。
クラスを宣言（$hp;)したところにインスタンスを
new クラス名()という命令で生成します。

```test.php

//インスタンスの生成と変数への代入
$slime_a = new Slim();
$slime_b = new Slim();
$slime_c = new Slim();

//インスタンスの使用
$slime_a->attack("主人公");
$slime_b->attack("主人公");
$slime_c->attack("主人公");

```

クラスという設計図があれば、上記のような
スライムabcのように何個でもインスタンス生成することが可能です。

##試してみよう

```test.php

class Slime {
  public $type = "スライム";
  public $hp = "25 ";
  public $power = 15;

  function attack($charanter_name) {
    print $this->type . "が" . $character_name . 'を攻撃して' . $this->power . 'ポイントのダメージを与えた！' . PHP_EOL;
  }
}

$slime_a = new Slime();
$slime_a->attack("主人公");
print_r($slime_A);

```

$php memo.php

▼実行結果

```

スライムが主人公を攻撃して3ポイントのダメージを与えた！
Slime Object
(
    [type] => スライム
    [hp] => 10
    [power] => 3
)

```
メール本文にハイパーリンク（フォルダ・ファイル）

#メール本文にハイパーリンクを貼る方法

ファイル、フォルダのパスの前後に < と >を追加し、Enterを押すとハイパーリンク化される。
例）
<\\\AAAAA\・・・\folda>
完全に理解した人達の「Web技術」Talk #4 勉強会レポート

# 完全に理解した人達の「Web技術」Talk #4

先日主催した勉強会のスライド資料と概要をまとめてみました。

> みんなが知っている「筈」のWebの技術に関することのLT大会です！
> 
> ・HTTP
> ・REST
> ・URI
> ・HTML
> ・サーバー
> ・設計
> ・API
> などなど、「Webに関連する技術」ことならなんでもOKです！
> あなたの知ってるWebの技術についての話を存分に語りましょう！
> [【オンライン】完全に理解した人達の「Web技術」Talk　#4 - connpass](https://easy2.connpass.com/event/173015/)

日時：2020年4月30日（木）19:00～21:00
会場：オンライン（[Youtube Live](https://www.youtube.com/watch?v=pznTcxA6T3U)）

# LT1: Index完全に理解した（@k-tky）
[![thumbnail](https://speakerd.s3.amazonaws.com/presentations/8aefa723fe4845a49fb15de79e5a0d20/slide_0.jpg)](https://speakerdeck.com/ktky/indexwan-quan-nili-jie-sita)
[Index完全に理解した - Speaker Deck](https://speakerdeck.com/ktky/indexwan-quan-nili-jie-sita)


- アプリ開発中に性能劣化が発生することがある
- アプリの遅い原因はいくつかあるが、今回はDBが悪いパターンについての話
- 大小様々なSQLが投げられることによりDBが負荷に耐えられなくなる
- Full Scanしてるところにindexを貼るなどするが…
- そのindexが効率的かどうか見直す
- indexのメリット、デメリットを理解することが大事


# LT2: あなたの書いたJavaScriptコードはどのように動いているのか（@kfurumiya）
[![thumbnail](https://s3.amazonaws.com/media-p.slid.es/thumbnails/42f34aa3c86bdd1995eb694b1d4aaf8d/thumb.jpg?1588224785)](https://slides.com/kotofurumiya/how-your-javascript-code-works#/)
[あなたの書いたJavaScriptコードはどのように動いているのか](https://slides.com/kotofurumiya/how-your-javascript-code-works#/)


- プログラムは命令の列挙
- 「式」と「文」と「評価」という概念
- コード解釈のフェーズ: 字句解析→構文解析→意味解析→バイトコードや機械語
- JavaScriptの構文について解説
- 評価の例をいくつか紹介
- 式レベルでコードを読めると理解が深まる

# LT3: GAS+Spreadsheet+Slack APIでレビュアーガチャを作ってみた（@unsoluble_sugar）
[![thumbnail](https://lh3.googleusercontent.com/JsmXTkojII7rqrvKk2Nc1UR5rV10IcMHmjUmSAMaLOXHWk93v0x4uRebwTl3q23OhXfhSrdGWw=w1200-h630-p)](https://docs.google.com/presentation/d/1UsRCYm78h1lfmE1vK-XCs1TYAjCE0_PLrsxY3Cc3tj0/edit)
[GAS + Spreadsheet + Slack API で レビュアーガチャを作ってみた - Google スライド](https://docs.google.com/presentation/d/1UsRCYm78h1lfmE1vK-XCs1TYAjCE0_PLrsxY3Cc3tj0/edit)

- チームの課題解決のためレビュアーをランダム選出する仕組みを作った話
- 理想はペアプロ・モブプロなどだが、今回はガチャで解決
- 利便性と楽しさを主体として開発
- 開発はWeb上で完結
- SpreadsheetをDBライクに使用
- シンプルな社内ツールであればGASでサクッと書ける


# LT4: DartPad＋CodePenで、Flutterを体験してみよう（[@cch-robo](https://twitter.com/cch_robo)）
[![thumbnail](https://lh5.googleusercontent.com/YgBkErYKmq-A7FTdrjXZzrQomB_FLkE2mqvzXAYo5n6jy9aUNcGCupe4RXdW3ITCVUyFzNz3vQ=w1200-h630-p)](https://docs.google.com/presentation/d/1wg1s4zx89tAfxF3H2JFXIHBa4i8gkyuekCZRLJ9gqyk/edit#slide=id.g40cec0799f_2_35)
[DartPad＋CodePenで、Flutterを体験してみよう - Google スライド](https://docs.google.com/presentation/d/1wg1s4zx89tAfxF3H2JFXIHBa4i8gkyuekCZRLJ9gqyk/edit#slide=id.g40cec0799f_2_35)

- FlutterでWebアプリも作れる
- Webアプリ統合開発環境CodePenの紹介
- CodePen FlutetrはDartPadの兄弟
- DartPadはWeb上で簡単なFlutterアプリが作れる
- DartPadコードのGist保管手順を解説
- flutter体験シェルスクリプト作ったので使ってね！

# 当日のアーカイブ動画
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/pznTcxA6T3U/0.jpg)](https://youtu.be/pznTcxA6T3U)
[完全に理解した人達の「Web技術」Talk　#4 - YouTube](https://youtu.be/pznTcxA6T3U)

LT発表後に質疑応答コーナーもございますので、資料と合わせてぜひご覧ください。
[Easy Easy - connpass](https://easy2.connpass.com)
VBA

##変数宣言

```
Dim 変数名 As データ型
```
| データ型         |       名称          |    格納できる範囲                                       |
|:-----------------|--------------------:|:-------------------------------------------------------:|
| Integer          |            整数型   | -32,768 ～ 32,767                                       |
| Long             |          長整数型   | -2,147,483,648 ～ 2,147,483,647                         |
| Single           | 単精度浮動小数点数型| -3.402823E38 ～ -1.401298E-45(負の値) <br> 1.401298E-45 ～ 3.402823E38(正の値)                  |
| Double           | 倍精度浮動小数点数型| -1.79769313486232E308 ～ -4.94065645841247E-324(負の値) <br> 4.94065645841247E-324 ～ 1.79769313486232E308(正の値) |
| Currency         |             通貨型  | -922,337,203,685,477.5808 ～ 922,337,203,685,477.00     |
| String           |           文字列型  | 最大約20億文字まで                                      |
| Data             |           日付型    | 西暦100 年1月1日～西暦9999年12月31日までの日付と時刻    |
| Byte             |           バイト型  | 0～255の範囲の単精度の正の数値。8 ビット(1 バイト)      |
| Boolean          |           ブール型  | 真(True)または偽(False)                                 |
| Object           |    オブジェクト型   | オブジェクト                                            |
| Variant          |      バリアント型   | 全てのデータ                                            |

※データ型を指定しない場合は自動的にVeriantになる

##IF～Then～Else

```
If 条件式 Then
　条件式が成立した場合に実行する処理
Else
　条件式が成立しなかった場合に実行する処理
End If
```
※条件式は比較演算子を用いて表現する
EclipseでGithubのプロジェクトをインポートする方法

## この記事では以下を前提としています。
- Eclipseでリポジトリをすでに追加している
- リポジトリの作成者もしくはコラボレーターとなっている
- Java EEパースペクティブを使用

## 用語解説①ブランチとは
[サル先生のGit入門](https://backlog.com/ja/git-tutorial/stepup/01/)より
>ブランチとは、履歴の流れを分岐して記録していくためのものです。 分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。 また、分岐したブランチは他のブランチと合流(マージ)することで、一つのブランチにまとめ直すことが出来ます。

## 手順

### Gitリポジトリペーンから対象のリポジトリのBranchesを右クリック、切り替え→New Branchを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/bd97a82e-23ed-e455-67c0-6545ec198e6e.png)

### ブランチ名を入力し完了をクリックする。ブランチが作成されたと同時にチェックアウトもなされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/2e12851a-f887-f9ae-a383-e5725b28088e.png)

### ブランチを右クリック、「マージ」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/3b7a1c0f-fee9-b642-5bce-6604b0946cf2.png)

### Remote Tracking下の「origin/master」を選択しマージボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/de841ad1-b6c3-b804-c2ad-c5f9a8845dca.png)


### プロジェクトの最新をインポートする、プロジェクトエクスプローラーのペーンで右クリック、インポートを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/062eef8f-859b-a5c2-5ec4-982dd5d78919.png)

### 選択ウィンドウでGit→Gitからプロジェクトを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/8e12b6b5-f262-7836-eb11-4ccb716207d4.png)



### リポジトリソースの選択で「Existing local repository」(GirリポジトリをすでにGitパースペクティブから追加している場合)または「Clone URI」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/7d24cb3a-4783-c381-8e64-a64f40685428.png)


### 次のような画面が出たら「既存プロジェクトのインポート」を押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/a3ea9f9b-41c6-eb94-fafd-902327137c57.png)

### もしEclipseのプロジェクトがある場合は以下のように表示される、表示されていないようなら.projectファイルなどが.gitignoreに含まれていないか確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/acb9c9f0-43b2-7ef5-2c18-8d69bd66bc9e.png)


### プロジェクトエクスプローラーにプロジェクトがインポートされていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/492b6d86-717d-d2c3-906f-a67ccb268ad2.png)

### 別のリポジトリにプッシュしたい場合は、プロジェクトを右クリック、チーム→切断を選択し、そのあとまたプロジェクトを右クロック、チーム→プロジェクトの供用をクリック、Gitリポジトリの構成ウィンドウで作成を押下し新しいGitリポジトリのディレクトリを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/9f1f73b7-466c-ec79-d8fc-4993714cbfad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/a93f0628-99c5-b2ca-88a5-99d0ebb69a50.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/b9089b7e-4c1e-a955-d189-64e9c40e4744.png)


### 改訂履歴

- 2020/5/12 新規作成
- 2020/5/15 リポジトリを切断して別のリポジトリにプッシュする方法を追記
古いRでBioconductorのパッケージをインストールする

現在、RのBioconductorのパッケージは下記のようにBiocmanagerでインストール可能であるが、古いバージョンのRだと動かないことがある（動かなくても特にエラーメッセージは出ない）。


```r
#環境
sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS  10.14.1
```

```r
#通常のインストール方法
if (!requireNamespace("BiocManager", quietly = TRUE))
+         install.packages("BiocManager")
BiocManager::install("インストールしたいパッケージ名")
```   

その場合、biocLiteでインストールすることができる。
 
```r
source("https://bioconductor.org/biocLite.R")
BiocInstaller::biocLite("インストールしたいパッケージ名")
```

解決方法を探すのに時間かかったが、[公式ドキュメント](https://www.bioconductor.org/install/)の下部に記載してあった。きちんとドキュメントを読むのが大事。


そもそもRをバージョンアップすれば良いだけの話だが、動かなくなるパッケージがあると思うと二の足を踏んでしまう。
【Rails】前までEC2の本番環境が動いていたのにcapistranoでの自動デプロイを実装した後に改めて本番環境で動かすと111: Connection refusedになる際の対処法


capistranoを実装した後、改めてec2で本番環境を起動すると次のエラーが表示される。

```
15.179.212, request: "GET / HTTP/1.1", upstream: "http://unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock:/", host: "13.115.179.212:80"
2020/05/10 13:10:51 [error] 3847#0: *17 connect() to unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock failed (111: Connection refused) while connecting to upstream, client: 121.3.47.42, server: 13.115.179.212, request: "GET / HTTP/1.1", upstream: "http://unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock:/", host: "13.115.179.212"
2020/05/10 13:10:52 [error] 3847#0: *17 connect() to unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock failed (111: Connection refused) while connecting to upstream, client: 121.3.47.42, server: 13.115.179.212, request: "GET / HTTP/1.1", upstream: "http://unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock:/", host: "13.115.179.212"
2020/05/10 13:10:53 [error] 3847#0: *17 connect() to unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock failed (111: Connection refused) while connecting to upstream, client: 121.3.47.42, server: 13.115.179.212, request: "GET / HTTP/1.1", upstream: "http://unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock:/", host: "13.115.179.212"
```

##原因

capistranoを入れると、ec2内にあるdatabase.ymlファイルの参照先が変わります。

capistranoを実装する前はEc2内のアプリ名/config.database.ymlでしたが、capistranoを入れた後はEC2内がアプリ名/shared/config/database.ymlになります。

したがって上記のエラーが出る際はローカルのconfig/database.ymlとec2内のshared/config/database.ymlの内容（特に本番環境）を合わせてあげてください。

怖すぎ、、、
[git]地味に便利に特定ブランチの特定ファイルを持ってくる

なんか微妙にミスってて一部ファイルをdevelopブランチとかから持ってきて、ごにょっとごまかしたい時ありますよね。そんな時の

## checkout編

```shell-session
$ git checkout develop tests/API/*
```

developブランチの `tests/API/*` ディレクトリ全部持ってくる。


--- 

以下蛇足編


## リバート編

コミットが一つなら単純に

```shell-session
$ git log 

commit bdf589c8bdca598eae59c8fd3559f5129e5489
Author: Yuki Hirao <>
Date:   Tue May 12 14:39:35 2020 +0900

    テスト修正: AAAAAAAA
```

```shell-session
$ git revert bdf589c8bdca598eae59c8fd3559f5129e5489
```

とかでいい気がする
ローカルフォルダのファイルをGithubに登録する方法

ローカルフォルダに作成済みのファイルをGithubに登録する方法のメモ。地味にはまったので記録を残す。  

#手順
1 リモートリポジトリを作成する  
　Githubにログインし、Repositoriesタブ＞New＞Create a new repositoryと遷移して作成する。「Initialize this repository with a README」にチェックを付けた場合、後述する「7 リモートリポジトリにpushする」のタイミングでひと手間必要になるので注意。  

2 ローカルフォルダに移動する  

```  
$ cd hoge
```  
3 ローカルリポジトリを作成する

``` 
$ git init
```

4 ローカルフォルダのファイルをインデックスに登録する

```  
$ git add .  
```

5 コミットする

```
$ git commit -m "Initial commit"
```
6 リモートリポジトリのアクセス先を設定する

```
$ git remote add origin <1で作成したレポジトリのURL>
```
7 リモートリポジトリにpushする

```
$ git push -u origin master
```
※「Initialize this repository with a README」にチェックを付けた場合

pushしたタイミングで以下のエラーが出る。おそらくリモートレポジトリ追加時に`README.md`を追加していることが原因らしい。

```
To <1で作成したレポジトリのURL>
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to '<1で作成したレポジトリのURL>'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

エラーにしたがい`git pull`をしてみる。　　

```
git pull
warning: no common commits
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From <1で作成したレポジトリのURL>
 * [new branch]      master     -> origin/master
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> master
```
`Please specify which branch you want to merge with.`と出ているので、試しに`git pull <1で作成したレポジトリのURL> master`と打ってみる。  

```
git pull <1で作成したレポジトリのURL> master
From <1で作成したレポジトリのURL>
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories
```
`fatal: refusing to merge unrelated histories`となっているので、`--allow-unrelated-histories`オプションをつけて再度実行してみる。  

```
git pull <1で作成したレポジトリのURL> master --allow-unrelated-histories
From <1で作成したレポジトリのURL>
 * branch            master     -> FETCH_HEAD
Merge made by the 'recursive' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
```
これでやっとリモートレポジトリがpullできた状態になるので、「7 リモートリポジトリにpushする」が実行可能になる。

#あとがき
新規でレポジトリを作成する際に`README.md`を作成する癖があるので、はまってしまった。
ちなみに、いくつかのサイトで「git remote addコマンドでリモートリモジトリを追加する」と書かれていたが、この表現だとgit remote addコマンドでGithub上に新たなレポジトリが作成できるように読み取れてしまい、混乱した。同コマンドはローカルレポジトリをどのリモートレポジトリに紐付けるか設定するためのものなのかと理解している。
GitのSubmoduleを構成するファイルについて

# はじめに
リポジトリが分かれている場合、それをまとめるリポジトリがあると便利です。


# 事前に
追加したいサブモジュールが空の場合にはエラーとなるので、対象のリポジトリをクローンして何かコミットしておくと良いです。

```console
$ touch README.md
$ git add README.md; git commit -m 'first commit'; git push origin HEAD
```

# Submodule add
サブモジュールの追加は `git submodule add` で行ないます。

```console
$ git submodule add git@github.com:yousan/example.git example
```

うまく行かない場合がありますが、その場合には手動で確認を行ないます。

サブモジュールは３つのファイルによって構成されているようです。


| ファイル名 |
| ----- |
| /.gitmodules |
| .git/config |
| (サブモジュールを置くディレクトリ)/.git |


# .gitmodule
サブモジュールに関する記述があります。

```conf:.gitmodule
[submodule "example"]
        path = example
        url = git@github.com:yousan/example.git
```

# .git/config

```conf:.git/config
[submodule "example"]
        url = git@github.com:yousan/example.git
        active = true
```

# example/.git
サブモジュールのディレクトリには `.git` ディレクトリではなくファイルが置いてあります。

```conf:example/.git
gitdir: example
```

# エラーが出た場合には
上記の3ファイルが揃っていればSourceTreeなどでSubmoduleとして認識されます。うまく認識されない場合には上記のファイルを確認することとなります。
【超簡単！】【Rails】ancestry　親子孫を一括管理


# ancestryとは
Ruby on Rails ActiveRecordモデルのレコードをツリー構造（または階層）として編成できるようにするGemです。
親、子、孫のような関係を一括で管理する。

# 使い方

１、Gemfileに記述

```
gem 'ancestry'
```

２、下記コマンドを忘れないように。サーバーの再起動も合わせて。


```
$ bundle install
```

３、categoryモデルを作る。

```
$ rails g model category name:string
```

４、マイグレーションファイルの記述を反映

```
$ rails db:migrate
```

５、先ほど作ったcategoriesテーブルにancestryのカラムを作成する

```
$ rails g migration add_ancestry_to_category ancestry:string:index
```

６、追記した内容もDBに反映させる

```
$ rails db:migrate
```

７、モデルにancestryとアソシエーション を組む

```category.rb
class Category < ApplicationRecord
   ~省略~
   has_ancestry
end
```
# データ作成例
```seeds.rb
#一階層目
lady = Category.create(name: "レディース")

#二階層目
lady_1 = lady.children.create(name: "トップス")

#三階層目
lady_1.children.create([{:name=>"すべて"}, {:name=>"Tシャツ/カットソー（半袖/袖なし）"},{:name=>"Tシャツ/カットソー（七分/長袖）"}])

```

データを入れ終わったら、、、

```
$ rails db:seed
```
この表のようなデータが作成される。


|  id  |         name           |　    ancestry    |
|:-----|------------------------:|:------------------:|
| 1    |          レディース          |        nil       |
| 2    |          トップス         |       1       |
| 3    |           すべて           |        1/2        |
| 4    | Tシャツ/カットソー（半袖/袖なし）  |         1/2        |
| 5    | Tシャツ/カットソー（七分/長袖）   |       1/2       |


# 参考文献
https://qiita.com/enjoy_omame/items/eb03ffa1f2a88a297a7e
https://qiita.com/ren0826jam/items/b8819181d56be7b4c403
Xcodeのコンソール出力が使えないときのデバッグ法

# 対象
- macOSやiOSでのネイティブアプリ開発
- SwiftやObjective-Cでの開発
- React Nativeなどクロスプラットフォーム環境でも対応している場合があります
- Xcodeのデバッグコンソールが使えない

### Xcodeのデバッグコンソールが使えない状況とは
- Push通知等によるバックグランドからの起動時の挙動を見たい（iOS）
- IME，webcamプラグイン，その他プラグインでXcodeからの起動ではなく指定場所に配置してシステムによって起動されたときの挙動をしらべたい(mac)

このように，Xcodeからの起動では上手く動作するが，実際に使ってみると上手く動かない，その理由を調べたいというシーンがあります．こういう場合に紹介する方法を使うと簡単に値の出力ができます．

#使用方法

macOS，iOSのライブラリのFoundationに含まれるNSLogを使用します．

```:Swift
NSLog("Debug Message")
```

```:Objective-C
[NSLog @"DebugMessage"];
```

NSLogはXcodeから実行するとXcodeのデバッグコンソールに出力しますが，shellから起動されたり，プラグインとして起動したり，その他の起動方法で起動した場合にはmacOSなら`/var/log/system.log`に出力されます．ここに出力されたログはConsole.appで見ることができます．

<img width="791" alt="Screenshot 2020-05-12 at 15.54.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327967/20285e35-3b20-3fe6-b19e-d3a2ffa89d5e.png">

### Console.appでログを見る

macOSに標準でインストールされているConsole.appを開くと次のような画面が表示され，様々なアプリからのログが出力されているのをリアルタイムに見ることができます．

Consoleでは接続されているiOSのデバイスも見ることができ，左のペインから選択できます．大量のログが出力され続けるので自分のアプリの名前で検索するとよいでしょう．

<img width="1099" alt="Screenshot 2020-05-12 at 15.51.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327967/e4a9c8ad-1a46-d5f8-eea4-0b251d5efe85.png">

#注意事項

Objective-CではもともとNSLogで出力するのが一般的かも知れませんが，Swiftではprintを使う方が多いと思います．NSLogはXcodeのコンソールに出力しても詳細に出るので便利ですが，一方でprintに比べて負荷が高いそうです．場合によって，普段はprintを使ったり，リリース時はNSLogを含めないようにするなどしたほうが良いかも知れません．

#関連資料

- [NSLogをちょっと便利にするTips](https://qiita.com/kitanoow/items/e18bc3e3b50c304e12c0)
- [[Objective-C] NSLogフォーマット指定子一覧](https://qiita.com/edo_m18/items/23f2f078887d85c0fcc6)
VMインスタンスのSSHポート設定

VMインスタンスを作成した際に、ファイアウォール設定を行ったのでメモ
## 環境
インスタンス：Ubuntu 18.04

## ファイアウォールの設定
VPCネットワークのファイアウォール ルールでファイアウォール ルールの作成を行う
設定項目は以下

* ルール名
* ターゲット
（任意のターゲットタグを指定）
* ソースIPの範囲（0.0.0.0/0）
* プロトコルとポートでtcpを選択し任意のポート番号を指定

デフォルトでdefault-allow-sshがtcp:22で設定されているので何もしないとsshはポート番号22


## ポート番号の変更
ターゲットタグを指定する前にインスタンスのポート番号の変更を行う
sshでインスタンスに入り`/etc/ssh/sshd_conf`を編集してポート番号を変更する

```
$ vi /etc/ssh/sshd_config  # 一応、元ファイルをバックアップしておくと良い
```

`Port XXXX`といった箇所があるので任意の番号に変更して保存

sshdを再起動する

```
$ systemctl restart sshd
```

## ターゲットタグの指定
先ほど指定したファイアウォールのターゲットタグをインスタンスに割り当てる
Compute EngineのVMインスタンスにて任意のインスタンスの詳細→編集へ移動
ネットワークタグの欄にターゲットタグを設定し保存


## 確認
Compute EngineのVMインスタンスから設定がちゃんとされているか確認する
![スクリーンショット 2020-05-12 15.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319205/a054685c-8922-9fb6-38a8-1fe386c00612.png)
上の画像の赤い下線より、先ほど設定したポート番号でアクセスできればOK
（カスタムポート以外ではアクセスできない）
PRML 演習問題1.2 解答

##問題
>正則化された二乗和誤差方程式(1.4)を最小にする係数$\mathbf{ w_i }$が満たす(1.122)に類似した線形方程式を書き下せ

$$
\begin{align*}
\mathrm{ \sum^M_{j = 0}A_{ij}w_i} = \mathrm{T_i}\tag{1.122}  
\end{align*}
$$

###方針
最小値をとりうる$\mathbf{ w_i }$に関する問題なので、まずは与えられる式を$\mathbf{ w_i }$で偏微分し、導関数=0となることをもちいて式を整理する.その後(1.123)で与えられた条件式で表現し直す.
###演習1.1
演習1.1の類題であるのでまずは演習1.1をといてみる
演習1.1　問題
関数$\mathbf{y}$($\mathbf{x}$,$\mathbf{w}$)が多項式(1.1)で与えられた時の(1.2)の二乗和誤差関数を考える.
この誤差関数を最小にする係数$\mathbf{ w }$ = {$\mathbf{ w_i }$}は以下の線形方程式の解として与えられることを示せ.

```math
\begin{align*}
\mathrm{y(x,w)} = \mathrm{{\sum^M_j}{w_j}{x^j}}\tag{1.1}
\end{align*}
```

```math
\begin{align*}
\mathrm{E(w)} = \mathrm{\frac{1}{2}\sum^N_{n = 1}} \bigl\{\mathrm{y(x_n,w) - t_n}\bigr\}^2 \tag{1.2}  
\end{align*}
```

与えられた線形方程式は(1.122)と(1.123)

```math
\begin{align*}
\mathrm{ \sum^M_{j = 0}A_{ij}w_i} = \mathrm{T_i}\tag{1.122}  
\end{align*}
```

```math
\begin{align*}
\mathrm{A_{ij} = \sum^N_{n = 1}(x_n)^{i+j}} 
\tag{1.123}
\end{align*}
```

```math
\begin{align*}
\mathrm{T_i} = \sum^N_{n = 1}(x_n)^{i}t_n
\tag{1.123}
\end{align*}
```

与えられた二乗和誤差関数の式にまず(1.1)を代入して$\mathbf{w_i}$で偏微分し導関数=$\mathrm{0}$とおく

```math
\begin{align}
\mathrm{E(w)} &= \mathrm{\frac{1}{2}\sum^N_{n = 1}} \bigl\{\mathrm{y(x_n,w) - t_n}\bigr\}^2 \\ 
&= \mathrm{\frac{1}{2}\sum^N_{n = 1}}\bigl\{\mathrm{\sum^M_{j = 0}x_n^jw_j^n-t_n\bigr\}^2} \\
\mathrm{\frac{\partial E(w)}{\partial w_i}}&=\mathrm{\sum^N_{n-1}\Bigl\{\sum^M_{j=0}w_ix^j_n-t_n\Bigr\}x^i_n}\\
0&=\mathrm{\sum^N_{n = 1}\sum^M_{j = 0}w_jx_n^{i+j}-\sum^N_{n=1}t_nx_n^i}
\end{align}
```
したがって

```math
\begin{align}
\mathrm{\sum^N_{n = 1}\sum^M_{j = 0}w_jx_n^{i+j}=\sum^N_{n=1}t_nx_n^i} 
\end{align}
```
よってあたえられた線形方程式が示された。
###演習1.2
次に演習1.2を考える
与えられた二乗和誤差関数(1.4)は以下

```math
\begin{align*}
\mathrm{\tilde{E}(w)}=\mathrm{\frac{1}{2}\Bigl\{y(x_n,w)-t_n\bigr\}^2+\frac{\lambda}{2}\parallel{w}\parallel^2}\tag{1.4}
\end{align*}
```
ただし$\mathrm{\parallel{w}\parallel^2\equiv}$ $\mathbf{ww^T}$=$\mathrm{w_0^2+w_1^2+w_2^2・・・w_M^2}$である
演習(1.1)と同様に二乗和誤差関数に(1.1)を代入して$\mathbf{w_i}$で偏微分し導関数=$\mathrm{0}$とおく

```math
\begin{align}
\mathrm{\tilde{E}(w)}=\mathrm{\frac{1}{2}\Bigl\{\sum^M_{j=0}w^jx_n^j-t_n\bigr\}^2+\frac{\lambda}{2}\parallel{w}\parallel^2}
\end{align}
```
よって

```math
\begin{align}
\mathrm{\frac{\partial{\tilde{E}(w)}}{\partial w_i}}&=\mathrm{\sum^N_{n-1}\Bigl\{\sum^M_{j=0}w^jx_n^j-t_n\Bigr\}^2+\lambda{w_i}}\\
0&=\sum^N_{n=1}\sum^M_{j=0}w_jx_n^j・x_n^i-\sum^N_{n=1}t_nx_n^i+\lambda w_i
\end{align}
```
したがって

```math
\begin{align}
\mathrm{\sum^N_{n=1}t_nx_n^i}=\sum^N_{n=1}\sum^M_{j=0}w_jx_n^{i+j}+\lambda w_i
\end{align}
```
左辺$\mathrm{=T_i}$、右辺第1項$\mathrm{=\sum^M_{j=0}A_{ij}}$より以下の線形方程式が得られる

```math
\begin{align}
\mathrm{\sum^M_{j=0}A_{ij}+\lambda w_i = T_i}
\end{align}
```