OmniAICreator/Qiita-1.07M huggingface dataset:
確率微分方程式の読書会#3の宿題

# はじめに

今回は不参加です.

# 問題 2.13 

$ (B_{t}, \mathbf{P}_{x}) $ を2次元ブラウン運動とし   

```math
D_{\rho } := \{ x\in \mathbb{R}^{2} \mid \|x \| < \rho \}, \quad \rho >0   
```

とおく.

```math
\mathbf{P}_{0}(B_{t}\in D_{\rho })
```

を求めよ.

---

## 証明

ガウス積分の計算するだけです. ブラウン運動の確率密度関数を $p_{t}(x,y)$ とすると

```math
\begin{aligned}
\mathbf{P}_{0}(B_{t}\in D_{\rho })
&= \int_{D_{\rho }}p_{t}(0,z)\, \mathrm{d}z \\
&= \int_{D_{\rho }}\frac{1}{2\pi t} \exp\left(-\frac{z^{2}}{2t}\right)\, \mathrm{d}z \\
&= \int_{0}^{2\pi } \int_{0}^{\rho }\frac{r}{2\pi t} \exp\left(-\frac{r^{2}}{2t}\right)\, \mathrm{d}r\mathrm{d}\theta \quad \mathrm{(極座標変換)} \\
&= 1 - \exp\left(-\frac{\rho ^{2}}{2t}\right) .
\end{aligned}
```

## 補足

下記間違ってるので修正します

~~上記から, 任意の $\rho >0$ に対して~~

```math
\lim_{t \to \infty}\mathbf{P}_{0}(B_{t}\in D_{\rho})=0
```

~~が従います. この性質を**過渡性**（transience）といいます. 確率1で時刻無限大において無限遠点へ発散することを表します. 逆に,~~

```math
\lim_{t \to \infty}\mathbf{P}_{0}(B_{t}\in D_{\rho})=1
```

~~となる性質のことを**再帰性**（recurrence）といいます. 確率1で時刻無限大において有限領域に何回も戻り続けることを表します.~~

~~$d$次元ブラウン運動に対して, $d<3$のとき過渡的, $d\geq 3$のとき再帰的であることが知られています.~~
デジタル変調 (ASK, FSK, PSK)

# デジタル変調

ASK, FSK, PSKはデジタル変調の一種．デジタル変調は搬送波を不連続に変調する変調方式であり，ディジタル情報通信などに使われる．

# ASK　振幅偏移変調

ASK : Amplitude Shift Keying

デジタル信号(2値信号)の"0"と"1"の振幅を変化させる．
振幅ノイズやフェーディングなどの振幅変化に弱い．

![ASK](http://www.gxk.jp/elec/musen/1ama/Htb/figure/HE0604_bS.png)

# FSK　周波数偏移変調

FSK : Frequency Shift Keying

デジタル信号(2値信号)の"0","1"に応じて搬送波の周波数を変化させる．
（例えば、データが"0"のとき低周波数、"1"のとき高周波数に変化させる）
振幅が一定であるため、振幅変動の影響を受けにくい．

![FSK](http://www.gxk.jp/elec/musen/1ama/Htb/figure/HE0604_dS.png)

# PSK　位相偏移変調

PSK : Phase Shift Keying

デジタル信号(2値信号)が"0"から"1"へ，"1"から"0"へ変化するときに搬送波の位相が変化する．
変化した位相の種類を増やすことにより，変調1回あたりの送信ビット数を増やすことができる．
2値でしか位相が変わらないPSKを特にBPSK (Binary PSK)と呼ぶ．

![PSK](http://www.gxk.jp/elec/musen/1ama/Htb/figure/HE0604_cS.png)

# 参考

http://www.gxk.jp/elec/musen/1ama/H27/html/H2708A12_.html
k8sのロードバランサでIP制限

AWS EKSでk8s環境を構築してて、まだ社内にしか公開しちゃダメ！とか言う時の設定

Service type LoadBalancer の設定で、` loadBalancerSourceRanges ` でアクセス許可するIPを指定してやる
  
```
spec:
  loadBalancerSourceRanges:
  - "143.231.0.0/16"
```

NLBって書いてるけど、CLBでもいける
https://kubernetes.io/docs/concepts/services-networking/service/#network-load-balancer-support-on-aws-alpha
Qtでグローバルホットキーを利用する

これは私が全部作ったものではなく、他人様の作られた成果をすこし手直しして、私がアプリケーションの形に仕上げたものです。

通常、キーボードを操作すると、アクティブ（最前面）にあるウィンドウにキー押下イベントが送られます。別のアプリがアクティブになっているときで、あらかじめ決めておいたキーが押されたときに自分のアプリでそのキー操作を横取りして、特別な処理を実行したいことがあります。通常は非アクティブ状態で待機しておき、Ctrl+Alt+◯を押すとスクリーンショットを撮るみたいなやつです。Windows Vista以降ならRegisterHotKeyというAPIがあって、そういったことを実現できます。もっと古いWindowsならSetWindowsHookExというAPIを使ってキーボードイベントをフックするという方法もありますが、今は昔のテクニックとなっています。Windowsはそのどちらかで良いとして、やはりマルチプラットフォーム対応にしたいです。macOSとLinuxでも同じようなことを実現したいと思ったら、ありました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">C++/Qt Global Hotkeys <a href="https://twitter.com/hashtag/qtjp?src=hash&amp;ref_src=twsrc%5Etfw">#qtjp</a> <a href="https://t.co/oGAKx4Jaiz">https://t.co/oGAKx4Jaiz</a><br><br>Qtでシステム全体に対するショートカットキーの登録を行う方法。<br>4年前のStackOverflowだけどその答えは... 外部のライブラリを使う</p>&mdash; さめたすたす (@sharkpp) <a href="https://twitter.com/sharkpp/status/1086523602378182656?ref_src=twsrc%5Etfw">2019年1月19日</a></blockquote>

リンク先がこれです。
https://stackoverflow.com/questions/35564502/c-qt-global-hotkeys

UGlobalHotkeyというライブラリを使うと実現できそうです。ライセンスはパブリックドメインとのことです。
https://github.com/falceeffect/UGlobalHotkey

では早速このリポジトリをフォークして改造してみます。
https://github.com/soramimi/UGlobalHotkey

Qt Creatorからプロジェクトファイルを開きます。`uglobalhotkey.pro`というのがライブラリで、こちらを先にビルドします。`ExampleApp.pro`はサンプルアプリケーションです。

ExampleAppを実行すると下図の様なウィンドウが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61222/db2f63d9-9f0a-78ae-3a60-ce35f43aa61b.png)

このアプリケーションがアクティブかどうかにかかわらず、Ctrl+Shift+F12を押すと、ラベルの数字が増加するようになっています。

ライブラリの使い方はとても簡単で、`MainWindow.cpp`のコンストラクタなどで、下記のようなコードを記述するだけです。

``` .cpp
	QString hotkey = "Ctrl+Shift+F12";
	ui->label->setText(QString("Press %1 key.").arg(hotkey));

	UGlobalHotkeys *hotkeyManager = new UGlobalHotkeys(this);
	hotkeyManager->registerHotkey(hotkey);

	connect(hotkeyManager, &UGlobalHotkeys::activated, [&](size_t id){
		value_++;
		QString text = QString::number(value_);
		ui->label_2->setText(text);
	});
```

`new UGlobalHotkeys(this);`として、オブジェクトを確保していますが、`this`（MainWindow）と紐付いているので、メインウインドウが終了するときに、一緒に削除されます。
k8sでEvictedされたpodを一括削除する

EKS等を使用していて、EC2のインスタンスtypeをケチってしまった場合に、nodeのリソースが足りず、podがガンガンEvictedされてはpodが再起動されるという。

で、Evitedされたpodが大量でちまちま消してらんないのでワンライナー探しててあった
https://gist.github.com/ipedrazas/9c622404fb41f2343a0db85b3821275d

いっぱいありますが、コレ使いました

```
kubectl get pods | awk '{if ($3 ~ /Evicted/) system ("kubectl delete pods " $1)}'
```

まずは、ちゃんとnodeのリソースとそれに見合ったインスタンスtypeを選びましょう
Windowsの付箋アプリの書式変更

# はじめに
Windowsには付箋アプリが標準？で入っている。
ちょっとしたメモとかで使っているけどフォントサイズの変更とかのメニューが無い。
いつも忘れるのでメモ。

# 書式変

| 変更内容       |ショートカットキー |
|:-----------------:|:------------------:|
|フォントサイズを小さくする|『Ctrl』＋『Shift』＋『<』|
|フォントサイズを大きくする|『Ctrl』＋『Shift』＋『>』|
|太字　　　　　　　　　　　|『Ctrl』＋『B』|
|下線　　　　　　　　　　　|『Ctrl』＋『U』|
|取り消し線　　　　　　　　|『Ctrl』＋『T』|
|箇条書き・段落番号など　　|『Ctrl』＋『Shift』＋『L』|
catapultのためにnginxでhttpsプロキシを構成する

# はじめに

catapultのAPIは、ポート3000で動作するようになりました。

ですが、httpsには対応していません。既に、多くのhttpsプロキシが世には存在しているので、おそらく対応されないと思います。

今回は、3001番ポートで受け付け、3000番ポートへプロキシするように設定してみます。

ソフトはnginx、証明書は、Let's Encryptを使います。

# 環境

OS

- Amazon Linux

開放しておくport

- 80 (証明書更新用）
- 3000 (http用)
- 3001 (https用)

proxyソフト

- nginx

ssl 証明書取得

- certbot (webroot方式)

# 手順

まずは、ドメインを取得して、ドメイン名とIPアドレスを関連付けましょう。

次に、サーバーにログインします。

rootになります。

```
sudo su
```

nginxをインストールして立ち上げて、自動起動をオンにします。

```
yum install nginx
service nginx restart
chkconfig nginx on
```

certbotをダウンロードして、証明書を取得します。`<your ...>`のところは適宜かえてください。

```
cd <your favorit path>
git clone https://github.com/certbot/certbot
cd certbot/
./certbot-auto --help
./certbot-auto certonly --webroot -w /usr/share/nginx/html -d <your domain> -m <your mail address> --agree-tos -n --no-bootstrap
```

成功すると、なんかこんな感じのメッセージが出ると思います。

```
Congratulations! Your certificate and chain have been saved at:
  /etc/letsencrypt/live/<your domain>/fullchain.pem
Your key file has been saved at:  
  /etc/letsencrypt/live/<your domain>/privkey.pem
```

`fullchain.pem`と`privkey.pem`をnginxに設定していきます。

```
vi /etc/nginx/nginx.conf
```

最後の箇所にこれ追加します。`<your ...>`のところは適宜かえてください。

```
server {

    listen 3001 ssl http2 default_server;
    server_name _;

    ssl_certificate /etc/letsencrypt/live/<your domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<your domain>/privkey.pem;
    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES25
6-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 10m;

    location /ws {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://127.0.0.1:3000/ws;
    }

    location / {
        proxy_pass http://127.0.0.1:3000/;
    }
}
```

設定の構文チェックをします。

```
nginx -t
```

問題なければOKと言われます。

```
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

設定を読み込みます。

```
nginx -s reload
```

これで、3001番ポートでアクセスできるようになりました。

最後に、証明書の有効期間は30日なので、自動更新するように設定します。

まずは、自動更新コマンドのテストをします。

```
<your path>/certbot-auto renew --dry-run
```

こんな感じのが出たら、成功です。

```
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/<your domain>/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
```

このコマンドをcronなどに登録します。

```
crontab -e
```

```
0 0,12 * * * sleep `expr $RANDOM \% 3600` && <your path>/certbot-auto renew && nginx -s reload
```

# おわりに

nginxの設定ファイルは、ディストリビューションやバージョンで名前や場所が変わったりしているので、いろんな人の記事を参考にしてみるとよいと思います。

NIS1でも同じような手順でできます。

NISでstunnel4での手順 https://blog.nem.io/https-nis-node/
macのプロンプトにブランチを表示させる

## 背景
gitの操作をターミナルで行なっているのに、作業しているブランチが見えないのは不便ですよね。
ということで今回はプロンプトにブランチをいい感じに表示させる方法を紹介します。

## 対象者
* UNIX系のコマンドに慣れている、もしくは調べれば分かる人
* Gitの基礎ワードが分かる、もしくは調べれば分かる人

## 作業環境
MacOS Sierra Ver 10.12.6
git version 2.19.0

## 事前準備
ブランチを表示させるには**`git-prompt.sh`**(プロンプトに各種追加情報を表示可能にするスクリプト)が必要です。


まずは`mdfind`コマンドで上記ファイルが存在することを確認しましょう。
既にインストールされていれば、以下のようにファイルパスが表示されます。

```bash
$ mdfind git-prompt.sh
/usr/local/git/contrib/completion/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
```

インストールされていなければ、[リンク](https://kosukeblog.com/2017/04/completion/)を参考にするとインストールできると思います。

## 設定方法
#### ブランチ名を表示させるために`.bashrc`を編集します。
* `.bashrc`は通常ログインシェルがbashを起動したときに読み込むファイルでホームディレクトリに配置されています。`.bashrc`が存在しない場合は[リンク](https://qiita.com/takutoki/items/021b804b9957fe65e093)を参考にしてファイルを作成してください。

#### それではここから設定していきましょう。
1. **`.bashrc`にプロンプト表示設定を入れる。**
    ターミナルで以下のコマンドを実行して`.bashrc`に設定を追記します。

    ```bash
    $ cat << EOF >> .bashrc
    source /usr/local/git/contrib/completion/git-prompt.sh   #git-prompt.sを読み込む
    export PS1='\[\[\033[32m\]\u:\[\033[34m\]\W\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
    ```
    
    ※ なお`PS1`はプロンプトの表示フォーマットを指定する環境変数ですので、上記のコマンドを実行後プロンプトが以下の形式に変わります。
    
     `[ログインユーザ]:[カレントディレクトリのベース名] [ブランチ名]`
    
    もし現在の設定を引き継ぎたい場合は`$(__git_ps1)\[\033[00m\]\$`のみを`export PS1=~`に追記してください。

1. **`.bashrc`の設定を反映させる**
    ターミナルで以下のコマンドを実行し手順1で設定した内容をプロンプトに反映させます。
    
    ```bash
    $ source .bashrc
    ```
    
    コマンドを実行したら、ローカルリポジトリへ移動してみてください。
    プロンプトにブランチ名が表示されていると思います。

```bash\

User_Name:current_dir $ cd [ローカルリポジトリ名]
User_Name:current_dir (branch_name #) $ 
```

## さいごに
設定作業おつかれさまでした。
今回はブランチ名をプロンプトに表示できるよう設定方法を書きましたが、人によってはブランチ名以外にも表示させたいことがあると思います。
環境変数`PS1`の設定次第で表示内容だけでなく、色なども自由にカスタマイズできるので興味のある方は調べてみてください。

* 表示フォーマット参考リンク  
https://qiita.com/katsukii/items/da37d1fdf974bd0e4c2f  
https://qiita.com/zaburo/items/9194cd9eb841dea897a0
テキストファイルの内容を本文にしてメール送信する

# はじめに
- アプリが生成するファイルをメールで送信したい
- 生成されるファイルはいくつかあって、アプリの処理結果によって違う

こんな要件を満たす Powershell Script を作成しました。
生成されるファイルを配列で指定することで、ファイル数が増えても Script の処理を変更する必要がないのがポイントです。
Script は、タスクスケジューラ等で定期実行してください。

# 前提条件
- ExecutionPolicy が RemoteSigned になっている
- 送信元となる Script 実行ホストから Port587 で Office365 の SMTP サーバに接続可能な状態
- Exchange Online 側で SMTP が有効になっている
※Office365 ではなく Gmail でも SMTP Server の設定を変更すれば同様の処理が可能です。

# 動作確認済み環境
| OS | $PSVersionTable の PSVersion |
|---|---|
| Windows Server 2012R2 | 4.0 |

# 処理内容
- 生成されるファイルの有無を確認し、存在するファイル毎の内容を本文として改行付きで送信する
- メール送信されたファイルは、削除する
    - ファイル毎にメール通知するため、都度ファイルを削除していきます

# Script
コメントアウトの入力例を参考に設定してください。

``` MailNortifyPS.ps1
# メール通知用テキスト設定
## $data_path = "C:\Script\Mailnotify\"
## $nortifytext_ary = @("処理1結果.txt","処理2結果.txt","処理3結果.txt","処理4結果.txt","処理5結果.txt")
$data_path = "メール通知したいテキストの格納先パスをフルパスで入力(最後に￥を忘れずに)"
$nortifytext_ary = @("メール通知したいテキストのファイル名をコンマ区切りで指定(ファイル名の前後にダブルクォーテーションを忘れずに)")

# Script ログ設定
## $ps_log = "C:\Script\Mailnotify\log\ExecutionResult.log"
$ps_log = "本スクリプトのログファイルをフルパスで指定"

# メール送信設定
## $smtp_server = "smtp.office365.com"
## $auth_userid = "user01@hogehoge.com"
## $auth_userpwd = "user01$Pass"
## $from_addr = "user01@hogehoge.com"
## $dest_addr = "user01@hogehoge.com,user02@hogehoge.com"
$smtp_server = "smtp.office365.com"
$auth_userid = "認証ユーザ名"
$auth_userpwd = "認証ユーザのパスワードもしくはアプリパスワード"
$from_addr = "送信元アドレス(通常は認証ユーザのメールアドレス、共有メールボックス)"
$dest_addr = "メール通知先メールアドレス(複数ならコンマで区切る)"

# ログ出力関数
function write_log($log_msg)
{
  $timestamp = Get-Date;
  Add-Content $ps_log ($timestamp.ToString("yyyy/MM/dd HH:mm:ss.fff") + " " + $log_msg)
}

# メール通知関数
function send_mail($nortifytext_name)
{
    try{
        $mail_body = (Get-Content -Path ($data_path + $nortifytext_name) -Raw)
        $mail_title = ($nortifytext_name + " Mail notification")
        $smtp_client = New-Object Net.Mail.smtpclient($smtp_server, 587)
        $smtp_client.EnableSsl = $true
        $smtp_client.Credentials = New-Object System.Net.NetworkCredential($auth_userid, $auth_userpwd);
        $smtp_client.Send($from_addr, $dest_addr, $mail_title, $mail_body)
        write_log($nortifytext_name + " Mail notification completed")
        # メール通知用テキスト自動削除
        Get-ChildItem ($data_path + $nortifytext_name) | ForEach-Object { $_.Delete() }
    }
    catch{
        write_log($nortifytext_name + " Email notification failed")
    }
}

# メール通知処理呼び出し
if ($nortifytext_ary.Count -eq 0 ) {
    write_log("notification text unspecified")
} else {
    ForEach ($nortifytext_element in $nortifytext_ary) {
        if (Test-Path ($data_path + $nortifytext_element)) {
            write_log($nortifytext_element + " E-mail notification start")
            send_mail $nortifytext_element
        } else {
            write_log($nortifytext_element + " not found")
        }
    }
}
```
最長AB列

- [No.672 最長AB列](https://yukicoder.me/problems/no/672)

## 解いてる時の考察

- いい方法が何も思いつかないのでとりあえず愚直解を書いてみる
- ただ、愚直解は$O(N^2)$なので間に合わない。どうしよー
- DPかな？`dp[左端のインデックス][右端のインデックス]`みたいな。いや、普通に遷移とか無理そう。そもそも配列作るときに`dp[200001][200001]`になってメモリが死ぬ。
- 配列を2つ用意して、AとBが出てきた場所を1にして累積和を取ると嬉しいことがありそう。ある区間にあるAの数が$O(1)$で求められるし。
- 以下のような配列を使っていい感じに処理すれば解けそう

```
A A A B B A  // 文字列
1 2 3 3 3 4  // Aが出てきた回数
0 0 0 1 2 2  // Bが出てきた回数
```

- そんな感じの方針で提出したコード[その１](https://yukicoder.me/submissions/312986)、[その２](https://yukicoder.me/submissions/312992)。どっちも間違えてた。なんで間違えてるかはわかったけど、他にいい方法が思いつかない
- しゃくとり法も考えた。連続する数列といえばしゃくとり法なので。さらに、累積和をとった配列は単調増加なのでしゃくとり法で解いてくださいっていってるようなもんじゃん！！やったぜ！！
- と思ったけど、全然わからない。色々考えるけど穴がたくさん見つかるしもうダメ
- もうなにもわからない。
- 終了



## 理想の考察

- 愚直に計算すると$O(N^2)$で間に合わない。
- テストケース1の文字列で実験してみる。`AAABA`中の`AABB` について考える。文字列中にAが出てきたら+1、Bが出てきたら-1して累積和を取ると、以下の図のようになる。ある区間でAとBの数が同じなら、その区間の累積和は0になるということ。これが解くのに使えそう。

![最長AB列_1.png](https://qiita-image-store.s3.amazonaws.com/0/218584/4dffaf3a-9fc0-0fad-9ca5-7f99f5769d36.png)


------

- サンプル1の累積和をとった図を描くと以下のようになる。数字が同じになる部分に注目する。数字が同じ部分はグラフの高さが同じになっている。これは、同じ数字で囲まれた区間ではAとBが出てきた回数が同じということを表す。区間の開始地点をX、終了地点をYとすると、AとBの数が同じになる区間は$(X, Y]$の半開区間となる。求める区間は長いほうがいいので数字が出てくる最初の地点を連想配列に突っ込めば解けそう。考察終了！

<img width="505" alt="最長AB列_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/218584/330448d0-c38f-1101-97a4-787f911a67c6.png">

## 解法

1. 累積和を取る用の配列を用意する。文字列中にAが出てきたら+1、Bが出てきたら-1しする。そのあと、配列の累積和を取る。
2. ループを回し、右側を固定する。左側に今まで出てきた数があれば答えを更新する。なければ連想配列に値とインデックスを記録する。

（解法、言葉で説明するの難しいからコード読んだほうが早そう）



## [コード](https://yukicoder.me/submissions/313067)

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

#define int long long

string s;
vector<int> rui;
map<int, int> mp;

signed main() {
  cin >> s;
  int n = s.size();
  rui.resize(n+1);

  // 文字列中にAがあったら+1, Bがあったら-1する
  for (int i = 0; i < n; i++) {
    if (s[i] == 'A') {
      rui[i+1] = 1;
    } else {
      rui[i+1] = -1;
    }
  }
  // 累積和を取る
  for (int i = 1; i <= n; i++) {
    rui[i] += rui[i-1];
  }

  int ans = 0;
  for (int i = 0; i <= n; i++) {
    // 前にrui[i]がmapに登録されてたら、答えを更新する
    if (mp.count(rui[i]) != 0) {
      ans = max(ans, i - mp[rui[i]]);
    }

    // 初めて出てきた数字ならmapに記録する
    if (mp.count(rui[i]) == 0) {
      mp[rui[i]] = i;
    }
  }

  cout << ans << endl;

  return 0;
}
```



## 要点

- ある区間に出てくるもののバランスを保つ問題では、ジグザグの図を考えると良い
  - 今回の場合、Aなら+1、Bなら-1して累積和を取ることでジグザグの図ができた。



## メモ

- 自力ACできなかった。
- Aが出てきたら+1、Bが出てきたら-1すると法則性が見えてくる。
- 記録する配列を1-indexedにしてなかったからちょっと詰まった。
- Aが出てきたら＋１、Bが出てきたら−１、そんで累積和をとるっていう発想が必要だった。累積和、やっぱ1-idxのほうがいい。
- ジグザグは典型らしい
- satanicさんに教えてもらった問題で使った気がする
- かっこを対応させる問題と似た感じの考え方（以下は見てないので類題かは知らない）

### かっこ問題

- https://www.hamayanhamayan.com/entry/2017/06/10/224823
- https://yukicoder.me/problems/no/22
AppleとUnixのお話

MicrosoftとUnix (https://qiita.com/sutton/items/5b2b7e2e57b674abe4f5) のお話を書いたら、いいねしてもらったのでそのままAppleとUnixのお話も書いてみようと思います。Macは数台持ってます(G3のibook クラムシェルが一番古い)があまり詳しくないので表面だけさらっと。

OSXも今でこそBSDベースのUNIX OSですが、WindowsとLinuxが水と油で相いれない存在だった過去よりもさらにAppleとUnixはその存在が対極上に存在した会社だったため、ちょっと意外なお話もでてくるかと思います。

(独り言)例によって、口調の統一や誤字脱字のチェック等の推敲は気が向いたらやるんで、適当にスルーしてください


#### AU/X 

90年代、CPUもIntel/AMD系ではなく、その前のIBM PowerPCの時代を飛び越えて、もう一つ昔の世代、モトローラ社の68kを使用していた時代にApple (Apple Computer/アップルコンピュータ社)により開発、販売されていたUNIX OS。最初のリリースは1988年。

SystemV系のUNIXベースで、X-Windowの他に旧MacOSのFinderやAPIが搭載されており、旧MacOSのソフトウェアも動作しました。この時代にMacOSのアプリケーションが動作するUnixベースの美しいOSがあったなんてすばらしいですね。

この時代のパソコンは今の写真のような絵を表示できる能力はなく8色とか16色とか256色みたいな時代でしたが、この時代でも少ない色数でセンスの良い美しいGUIを搭載しているのがいかにもAppleらしいです。PowerPC移行時の1995年に最終版がリリースされて開発は終了しました。


#### AIX for Apple Network Server

1996年にAppleからリリースされたAppleのサーバに搭載されていたOS。IBMのAIXベース。旧MacOSとAIXを統合する計画もあったようですが、計画は白紙に。


#### mkLinux
アップルとLinuxコミュニティーで開発されていたMacintosh用のLinux。mkLinuxと命名されているもののLinuxカーネルは使用されておらず、カーネルにMacOSと同じMachが採用され、その上にLinux環境が移植されていきました。

NTカーネル上でLinuxが動作するWSLやFreeBSDのカーネルでLinux環境が構築されたDebian GNU/kFreeBSDと同じようなOSで興味深いのですが、プロジェクトはかなり前(2002年頃)に実質的に停止しています。


#### Mac OS X Server 1.0系

スティーブジョブズ復帰後、間もなくリリースされたBSDベースのOS。コードネームはRhapsody。旧MacOSのようなGUIが搭載されていた。BSD Unixとして一般的なツールやデーモンの他に、NeXT由来のOPENSTEP APIや旧MacOSエミュレータ、OmniWeb、WebObjects、Quick Time Streaming Serverなどが搭載されていた。対応するアーキテクチャとしてPowerPCの他、Intel x86版も発表された。今のOSXとはまだ別のOSと考えて良い程度にはいろいろ異なり、OSXのアプリも動作しない。


#### Darwin

MacOSXの中からXNUカーネルとUnixのベース部分だけを切り出してオープンソースで開発されているMacOS(iOS/watchOS含む)のベースとなるオープンソースのOS。ISOをダウンロードしてインストールすれば、普通のUnixとして使えるが、最近は新しいバージョンのISOファイルは公開されていない。PureDarwinなどの派生プロジェクトは生きてるのかな。


#### MacOS X (MacOS / OSX) / Mac OS Server

GUIデザインが美しく、文字がキレイで、しかも開発ツールもたっぷり付いてくるみんな大好きなOSX。説明不要ですね。

説明不要とかなんとかいいつつも、思い出したのが旧MacOSに代わる次世代OSの開発計画が立ち上がった際には、Apple社内でベースとなるOSで挙げられていたのはなんとWindows NT、そしてSolarisとBeOS。そこにアップルを追い出された故スティーブジョブズ氏が売り込みNeXTが正式に採用。今のアップルの大躍進のきっかけとなったOSなんですね。対応アーキテクチャはPowerPCでスタートし、Intel x86に移行、現在はAMD64アーキテクチャで動作。 


#### iOS / WatchOS / tvOS

MacOSベースの組み込み用OSで iPhone iPad iPod touch apple watch AppleTVなどに搭載。対応アーキテクチャはARM系。


#### 小話(UNIXを身に着けて歩く時代が来た)

UNIXが非常に高価で科学者、理系の教員・学生、エンジニア、CGデザイナーと極一部の人にしか使われていなかった時代を思い出すと、今の時代は若い女性から年配の方も含めてたくさんの人がBSD Unixベースの小さなコンピュータを持ち歩いたり、時計として身に着けて町を歩いているなんて信じられない時代が来たんだなーと思います。
 
以上、MicrosoftとUnixのお話に続いて、AppleとUnixの歴史でした。
mysqlの操作方法についての基本まとめ

##mysqlに入る

rootユーザーで入る

```
mysql -u root
```

rootユーザー以外で入る

```
mysql -u ユーザー名 -p データベース名
```



##データベースの中身をを表示したりするやつ
|操作内容|コマンド|
|:-----------------:|:------------------:|
|データベース一覧を表示|show databases;|
|ユーザーの一覧を表示|select Host, User, Password from mysql.user;|
|操作するデータベースを変更|use データベース名;|
|現在操作しているデータベースを確認|select database();|
|データベースのテーブル一覧を表示|show tables;|
|あるテーブルのテーブル構造を表示|desc テーブル名|
|あるテーブルのレコード一覧を表示|select * from テーブル名;|

ひらがなで書かれてる所は都度都度で変えてください。


##データベース作成とかカラム追加とか

```sql
--データベースの作成
create database `データベース名`;

--データベースの削除
drop database データベース名;

--テーブルを作成する
create table テーブル名 (
  カラム名 データ型 オプション,
  カラム名 データ型 オプション,
  カラム名 データ型 オプション
);

--テーブルの削除
drop table テーブル名;

--テーブル名の変更
alter table 変更前のテーブル名 rename 変更後のテーブル名;

--カラムの追加
alter table テーブル名 add column カラム名 データ型　オプション;

--カラムの削除
alter table テーブル名 drop column カラム名;

--データ型変更
alter table テーブル名 change カラム名 新しいカラム名 新しいデータ型;

--インデックスの追加
alter table テーブル名 add index インデックス名([カラム名1, カラム名2, ...]);

```
###カラム追加のオプション
|オプション|コマンド|
|:-----------------:|:------------------:|
|主キー|primary key auto_increment|
|null不可|not null|
|デフォルト値設定| default デフォルトの値|
|ユニーク設定|unique|
Dart x Flutter で RenderBox/Canvas 関連のAPI を 試してみた。 2019年

Flutter で、 Render関連の情報が少ないので、[昨年に書いたもの](https://qiita.com/kyorohiro/items/0ad2094d6008038eb375)を更新をしてみました。

![1515374139.gif](https://qiita-image-store.s3.amazonaws.com/0/54192/27306631-e27d-8074-5f37-1445353acfd1.gif)

みたいなのが、簡単に作れます。
初期段階　flutter でも、https://kyorohiro.github.io/umiuni2d/web/index.html のデモページにあるような、2dゲームなどが簡単に作れました。ので、今だと、より容易に作成できるのではないでしょうか


## Hello World
![スクリーンショット 2018-01-08 18.28.57.png](https://qiita-image-store.s3.amazonaws.com/0/54192/14916f0f-27b0-045c-5b72-bf6b49fe25b3.png)

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/hello.dart

## 四角形を描画
![スクリーンショット 2018-01-08 18.28.16.png](https://qiita-image-store.s3.amazonaws.com/0/54192/fa794a93-eeaa-c434-0ebb-57c3fe596632.png)

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_rect.dart

## Animation
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/anime_rect_scheduller.dart

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/anime_rect.dart

## 画像を表示
![スクリーンショット 2018-01-08 18.30.48.png](https://qiita-image-store.s3.amazonaws.com/0/54192/e772a001-4677-bef3-4376-59717ca80468.png)
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_image_assets.dart

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_image_dartio.dart

## 画像の変形

![スクリーンショット 2018-01-08 18.32.13.png](https://qiita-image-store.s3.amazonaws.com/0/54192/6b646c41-4181-3ca3-41c0-2abe86a0ee42.png)

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/rotate_image.dart


## タッチイベント
![スクリーンショット 2018-01-08 18.33.33.png](https://qiita-image-store.s3.amazonaws.com/0/54192/9893cac8-808a-c1cb-de72-9a05f648271d.png)
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/touch_test.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/multitouch_test.dart

## TTF フォントでテキスト表示
![スクリーンショット 2018-01-08 18.32.54.png](https://qiita-image-store.s3.amazonaws.com/0/54192/2186a18b-343e-40ee-4540-6eddf0a27e1f.png)

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_text.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_text_ttf.dart

## Vertexs 関連
![スクリーンショット 2018-01-08 18.34.32.png](https://qiita-image-store.s3.amazonaws.com/0/54192/3a61b7f8-a700-6dea-3e62-1c9dd55428d1.png)

https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_path.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_vertexs.dart
https://github.com/kyorohiro/memo_flutter_2019/blob/master/lib/renderobject/draw_vertexs_image.dart




# PS
こんな感じで、大体の機能は揃っていますね。

[Memo : Flutter x Dart [2015-2016]](https://www.gitbook.com/book/kyorohiro/hello_skyengine/details)

[Memo : Dart x Flutter [2018]](https://medium.com/@kyorohiro/dart-x-flutter-memo-0-7ab0f2e8877a)


[Memo : Dart x Flutter [2019]](https://github.com/kyorohiro/memo_flutter_2019)
gitで僕がよく使うコマンド

3歩歩くと忘れてしまうのでまとめた。
sourcetreeを使っているけど、強いエンジニアになるためコマンドでもたたきたいと思ったので触っています。

```bash

// init
git init

// pull
git pull origin master

// 変更点をステージにあげる
git add .

// commit
git commit -m 'commit message'

// 現在の状況をみる
git status

// 現在いるブランチを確認する
git branch

// logを見る
git log

// logをonelineで見る
git log --oneline

// push
// -u(--set-upstream)
git push -u origin branch_name

// 二回目からこれでいい
git push

// 新しくブランチを作成して、そのブランチに移動する
git checkout -b new_branch

// 未プッシュのものを確認する
git log origin/master..master

```

参考
git
Reference
https://git-scm.com/docs

さるまりんのガレージ
gitでまだpushしていないcommitを確認する方法
https://salumarine.com/how-to-see-commits-not-pushed-to-the-origin-yet/

Git で新規ブランチを切って Push する時に何やら怒られるヤツの回避方法
http://neos21.hatenablog.com/entry/2017/05/10/080000
GoogleCTF #beginners/re-gatekeeper

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b5103f08-b964-c9dc-2aed-3a8d4e636fff.png)

#問題

https://capturetheflag.withgoogle.com/#beginners/re-gatekeeper

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/93f3a10c-e8c6-f717-c68e-605d3e1f2c2b.png)

#解いてみた

添付ファイルをダウンロードして、解凍します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3f81718a-262c-426e-d801-1b7778273a8a.png)

何のファイルかわからないのでBZで見たところ、ELFファイルでした。
Linuxの実行ファイルです。Windowsでいうexeみたいなイメージ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d60f9065-10ea-047c-dc71-cc88dffbfe90.png)

bintextでフラグがないか見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/143c8481-80e5-8ee0-6268-003bde306744.png)

flagの中は変数が入るっぽくて答えは分かりませんでした。
直前に怪し目な文字列があったので勘でやってみましたが、どちらも違いました。

- CTF{0n3_W4rM}
- CTF{zLl1ks_d4m_T0g_I}

IDAを使ってフローを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/64f4ac80-499e-aa69-485c-f536eb61c5fb.png)

なんか正解するとflagが出てきそうです。
アセンブリを読むのは骨が折れるのでUbuntuで動かしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a6c7ba3d-cb50-41d7-1a94-b89bfd6afa5f.png)

引数にユーザ名とパスワードを入力してくれというエラーで何もすることなく終了しました。
ユーザ名とパスワードわかりませんが、さっきの文字列が怪しげなのでやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/528da189-3cd9-1aaf-4891-9ec32c2f7b16.png)

ダメでした。ユーザ名とパスワードを逆にしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/669c1aaf-de6e-1fa1-12e1-148612194237.png)

ダメでした。
が、よく読んでなかったのでさっき気づきませんでしたが

```
Incorrect username
```

という文字があることに気づきました。
最初のときはパスワードが違うというエラーで今回はユーザ名が違うというエラー。
ということは1回目はユーザ名はあっていたということになりそうです。

もう一度IDAを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c49e3e8d-17f8-9706-adf7-e813971f94ca.png)

単純に文字列を比較しているだけっぽいので、あってると思うのですが。。。
と思ったらその前の右に行く処理がちょっと気になります。
右に行くとまた上に戻るようです。
もしかしたら入力した文字列を編集しているのかもしれません。
が、アセンブラが読めません。

調べたところ
Linuxのltraceコマンドを使うと関数呼び出しを見ることができるようです。
これでstrcmpを見ればいいのではないでしょうか。

やってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/25d52ac5-8325-2131-7c4d-a4543982cc34.png)

大量のデータがあふれてきてこれは厳しい。
ファイルに出力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7df24ab4-9fb1-c620-9f84-18173382961b.png)

そしてtest.txtの中からstrcmpを見ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/59370a73-0b0d-4b9f-d0af-56ad9d4bbdfa.png)

パスワードの1つ目の引数の文字がひっくり返ってる。
さっきのIDAを見る限り1つ目の引数はたぶん入力の文字列の方だと思いますが、一応確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9787ffd5-b91f-3a54-de6f-dff605fd9a04.png)

これを実行して再度test.txtのstrcmpを見ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ed2c981b-0363-a6e4-cdff-9dff5d7f3bf6.png)

はやり入力した文字列がひっくり返るようです。
さっきの謎の処理のところでひっくり返しているんでしょう。
なのでひっくり返した文字列を引数にして再度実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/30a17e90-7ddd-a6de-45c9-1776e11aa216.png)

やりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7cf9413b-c541-7ac6-b192-39ae7e81e0f5.png)
MultiPeerConnectivityのライブラリBeerKitを作りました。

ARKitを使った空間共有アプリを作るに当たってデバイス間通信の実装についてよく考えています。

iPhoneどうしで通信するに当たって一番便利なのが[MultiPeerConnectivity](https://developer.apple.com/documentation/multipeerconnectivity)です。**MultiPeerConnectivityはWifiやbluetooth、そしてiPhoneの持っているp2p通信のシステムを使ってローカルのデバイス間通信をするためのフレームワーク**。

そしてこのMultiPeerConnectivityを上からラップして使いやすくしているライブラリに[PeerKit](https://github.com/jpsim/PeerKit)があります。

日本語記事だと以下で紹介されています。

[[iOS][Swift] イベント駆動型で P2P 通信をするPeerKit](https://dev.classmethod.jp/smartphone/iphone/swift_peer_kit/)

# PeerKitに問題があったのでフォークした

しかし、このPeerKit、

- **繋がりにくい**
- **一度外れると復活できない**

などなどのバグが少しあり、そのまま使うとハマってしまいます。メンテされていると良いのですが、このライブラリは現在メンテされていないようです。

ということで僕がフォークしていくつか修正したのが[kboy-silvergym/PeerKit](https://github.com/kboy-silvergym/PeerKit)です。

しかしまだ問題があって、うまく繋がらないことがありました。

もう上から編集していくのはきつい。。！ってことで、真似して新しいライブラリをつくってみました。

# BeerKit

<img width="634" alt="スクリーンショット 2019-01-26 20.52.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/111366/f15de705-5668-512c-c1c3-729cc9e88856.png">

PeerKitを真似てBeerKitという名前で作ってみました。ビールで乾杯するというローカルコミュニケーションはまさにP2P通信と言っても過言ではありません。

PeerKitとの大きな違いはData型を渡す前提で作っているところです。

## データ送るとき

```swift
let data: Data = try! JSONEncoder().encode(message)
BeerKit.sendEvent("message", data: data)
```

PeerKitはAny型を渡すように作られているのですが、これが少し罠で、中で[NSKeyedArchiver](https://developer.apple.com/documentation/foundation/nskeyedarchiver)でアーカイブされてDataになるので、NSCodingに準拠している型じゃないとダメで、準拠してない型を渡すとクラッシュします。

だったら最初からData型を渡すようにしようということで、作り直しました。

## データ受け取るとき

```swift
BeerKit.onEvent { (peerId, event, data) in
    guard let data = data,
        let message = try? JSONDecoder().decode(MessageEntity.self, from: data) else {
            return
    }
    self.messages.append(message)
    
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}
```

JSONにして送受信することを想定してデモアプリはつくられています。

# まとめ

ということで、もし良ければBeerKit使ってみてくださいー！何かあればPRもお待ちしています。

あと、⭐️もお待ちしてます。

https://github.com/kboy-silvergym/BeerKit
Bootstrap4 hoverした時のリンクの背景色を変えたい

##はじめに

RailsでBootstrap4.1.1を使用中に遭遇

##追記
scaffoldingで作成した際に自動生成されるcssファイルが原因でした。。
cssファイルを削除すれば直りました。



<img width="376" alt="スクリーンショット 2019-01-26 20.15.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/335670/e4b73075-a838-c153-4dd5-23b12d1f86eb.png">

リンクにカーソルを合わせると(hoverすると)背景色が黒くなっててジーザスクライス

<br />

```app/assets/stylesheets/application.scss
a:hover {
  background-color: transparent;
}
```

aタグにhoverさせると背景色が透明になるように上書き
(Railsだとlink_toメソッドはaタグに変換される)

<img width="300" alt="スクリーンショット 2019-01-26 20.35.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/335670/5028c8d2-1796-8a4f-f714-0fda48de8672.png">


これで解決！
ポインタの話　その２（引数のポインタ渡し）

#ポインタ渡しって何？
##値渡し
関数に引数を渡すときに

```c
int hoge(int fuga){
    //fugaに関する何らかの処理
    return fuga;
}

int main(){
    int piyo;
    piyo=hoge(piyo);
    return 0;
}
```
と、することがよくあると思います。
これを**値渡し**といいます。

##ポインタ渡しって？？
ポインタ渡しは引数を渡すときに変数ではなくポインタ変数をつかいます。

```c
void hoge(int *fuga){//return文を書かなくていいのでvoid型にもできます
//何らかの処理
}

int main(){
    int piyo;
    hoge(&piyo);//引数にアドレスを渡している
    return 0;
}
```

#何が違うの？？
```c
//値渡し
int piyo;
piyo=hoge(piyo);

//ポインタ渡し
int piyo;
hoge(&piyo);
```
値渡しでは変数piyoに関数hogeにpiyoを引数とした値を代入しています。
ポインタ渡しではメモリのアドレスを渡して変数に変更を加えます。

値渡しとアドレス渡し、状況でうまく使い分けましょう。
Railsチュートリアル躓き→解決箇所:herokuコマンドが使えない

##問題: 同ディレクトリ内で以前使えたherokuコマンド使えない

- 環境: AWSCloud9
バージョン設定はRailsチュートリアル内容に準じる。

- エラー表示： 

```
$ heroku: command not found
```

- 解決法:
1.Node.jsバージョンを新しくする。
2.heroku-cliインストール
3.Node.jsバージョン固定

- 手順
https://teratail.com/questions/121247
上記ページ記載の手順を実行。

しかしこのままだとログインの度にバージョンが戻ってしまうため、Node.jsバージョン固定をする。
以下コマンドを実行。

```
$ nvm alias default 8.11.1
```
以上です！
2019年になってAWSのSLA設定が急増している

AWSが2019年になってSLAを次々と発表してきているので、ちょっと絵にしてみました。
　*https://aws.amazon.com/legal/service-level-agreements/?nc1=h_ls*

<img width="1062" alt="sla_aws.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/665bf350-5eb7-bc59-4f7b-a1ce299fb175.png">


# 雑感
- 昔は可用性が高いと言いつつSLAが設定されていないサービスが多く「なんだかなー」って感じでしたが、今は全サービスでSLAを設定しそうな勢いを感じます
- 他社もこの流れに追従するのかなー。いずれにしても利用者にとってはとても良い事です
[Microsoft] Azure Pipelines 利用されるディレクトリと参照する変数

Azure Pipelinesの中で、ファイルが展開される先のディレクトリと、それを参照する変数をまとめてみました。

| 名前 | 変数 | 実ディレクトリの例 | 使用しているタスク |
|:--|:--|:--|:--|
| ソース置き場  | Build.SourcesDirectory 等  | `/home/vsts/work/1/s`  | Azure App Service Deploy 等 |
| バイナリ置き場  | Build.BinariesDirectory 等 | `/home/vsts/work/1/b`  | Archive File 等 |
| 生成物置き場  |  Build.ArtifactStagingDirectory 等 | `/home/vsts/work/1/a`  | Net Core CLI 等 |

リファレンスはこちら → https://docs.microsoft.com/ja-jp/azure/devops/pipelines/build/variables?view=azdevops

以下、詳細です。


# ソース置き場

ソースファイル全体がここに展開されます。

ソース中のファイル名を指定する例はこのようになります。

```
${Build.SourcesDirectory}/project-a/package.json
```

## 変数

- Build.SourcesDirectory

下記も同じ内容を指しています(異なる場合もある?)

- Build.Repository.LocalPath
- System.DefaultWorkingDirectory


## 使用しているタスクの例

- [Azure App Service Deploy](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/deploy/azure-rm-web-app-deployment?view=azdevops)



# バイナリ置き場

コンパイル結果が格納されます。

## 変数

- Build.BinariesDirectory



## 使用しているタスクの例

- [Archive File](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/utility/archive-files?view=azdevops)



# 生成物置き場

パイプラインエージェントが生成したファイルが置かれます。

## 変数

- Build.ArtifactStagingDirectory
- Build.StagingDirectory

これらは同一の内容を指します。

## 使用しているタスクの例

- [Net Core CLI](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/build/dotnet-core-cli?view=azdevops)
- [Archive File](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/utility/archive-files?view=azdevops)
- [Publish Build Artifacts](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/utility/publish-build-artifacts?view=azdevops)
ポインタの話　その１（ポインタ変数の使い方）

#ポインタのおはなし
C言語を勉強する中でポインタで挫折するとよく言われています。
でも意外と簡単です。

#ポインタとは
ポインタは、メモリのアドレスを格納する変数のことです。
アドレスは大抵の場合16進数で表示されるはずです。（16進数じゃないケースもあります）
アドレスしかいれることはできません。

#ポインタ変数の宣言と初期化
##宣言方法
ポインタ変数は次のように宣言します。

```c
int *pHoge;
```
アスタリスクをつけるだけで簡単にポインタ変数を宣言できちゃいます。
`pHoge`の部分には自分の好きな人の名前を入れてもOKです。

##ポインタ変数の初期化
ポインタ変数の初期化では変数のアドレスを代入します。
初期化の仕方はscanfの使い方と少し似ているので親しみが持ちやすいとおもいます。

```c
int hoge;
int *fuga=&hoge;
```

`&hoge`というふうに **&+変数名**の形式で入力すると変数のアドレスを代入することができます。

#参照の方法
ポインタ変数の中に入っているアドレスの変数を知りたいときはアスタリスクをつけます。
「○○区　○○○○　○○マンション102」が入っているポインタ変数に*をつけると住んでいる人の名前が出てくるといったような感じです。

```c
int hoge;
int *fuga=&hoge;

printf("%d",*fuga);
//同じ意味↑↓
printf("%d",hoge);
```
printf関数で表示している部分は同じです。
*をつけるとポインタ変数の実体が帰ってきます。

#配列とポインタの話
例えば

```c
int hoge[5];
int *p_hoge=&hoge[0];

for(int i=0;i<5;i++){ //配列hogeの初期化のループ
    *p_hoge=0; //アドレスの実体(hoge[0])の値に０を代入
    p_hoge++; //"アドレス"をインクリメント
}
```
**２行目**: `int p_hoge=&hoge[0]`では配列hogeの先頭`hoge[0]`のアドレスが代入されます。
**５行目**:`*p_hoge=0;`でアドレスの実体（`hoge[0]`）に代入しています。
**6行目**:配列のアドレスは続いてるため、アドレスをインクリメントすると`hoge[1]`のアドレスになります。

#むすび
実行結果は今度貼っておきます。
今度は、ポインタ変数を使った、引数のアドレス渡しについて書きたいと思います。
[Elm]API叩いた結果のエラー表示とかローディングのスピナーの表示ってどうすればいいの？

## 要約

[これ](https://package.elm-lang.org/packages/krisajenkins/remotedata/latest/)を参考にして自分で考えてください。分かってるでしょ？

# 本編

## 解決したい問題

最近トレンドとかにも入ってる[素振りのために Rust と Elm でRSSビューア作った](https://qiita.com/zaneli@github/items/d204bf6008cd737d8a35)のElm部分のコードを見にいきましょう

Modelはこれ

```elm
type alias Model =
    { inputUrl : String
    , submittedUrl : Maybe String
    , items : List Item
    , previewing : Maybe Item
    , message : Maybe String
    , flags : Flags
    }
```

itemsがAPIから取ってきた値で、messageがAPIたたいて何か問題が起きたときにエラー内容を格納するところ


### 何が問題か

このRSSアプリでは叩くAPIは一個でエラーもグローバルで一個の関係なので問題ないかもしれません。では叩くAPIが増えてしまったら、どうしましょうか？
実のところ大した問題ではありません。問題がないと思えば今のままでもいいですし、どこ由来のエラーか区別したいならカスタム型を作るなりなんなりして何とかすればいい話です

## よくある解決策

多分一般的な解決策はあります（多分は一般的にかかってます）

[ここの一番下の見出しの部分](https://guide.elm-lang.jp/types/custom_types.html#Modeling)を見てください。あ、型だけでいいですよ

```elm
type Profile
  = Failure
  | Loading
  | Success { name : String, description : String }
```

上のModelもそうですが大体型だけ見てればいいですよ。
このカスタム型にはとってきたいProfileが、失敗、ロード中、成功に分けて表現されています

あなたが推測できる通り、もちろんこれはAPI経由で取ってくる値です

なんだか型を書いたらあとはわかるっしょて気分になってきました
見たらわかる通り、この型はAPIで値を取ってくるという状況をデータとして表現しています。このように型を設計できたら、あとあなたがやることはviewでいい感じに表示することだけです

あなたのviewでLoadingがきたらスピナーをくるくるまわして、Failureなら赤色でエラーメッセージだして、Successなら望むようにデータを表示してください

エラーの情報がなくなってるって？好きに足せよ

```elm
type Profile
  = Failure String
  | Loading
  | Success { name : String, description : String }
```

はい、これで文字列でエラーの原因を表現できるようになりましたね
カスタム型でもっと厳密に詳細にエラー情報をトラッキングしたいならがんばってくれ

ざねりさんのコードでもHttp.ErrorをStringに潰してるところがありますね。そこらへんでどれだけ詳細にトラッキングするかって話です

`Result Http.Error a`をうまいこと変換してください

### RemoteData

上記カスタム型は自分がいいように都度作ったほうがいいとは思いますがpackageはもちろんあります

[RemoteData](https://package.elm-lang.org/packages/krisajenkins/remotedata/latest/)と呼ばれてます

```elm
type RemoteData e a
    = NotAsked
    | Loading
    | Failure e
    | Success a
```

Resultの拡張みたいな型ですね！
[エラーハンドリング](https://guide.elm-lang.jp/error_handling/)のページに書いてあるんですが、あくまでResultやMaybeは汎用的な型なんですよね
Evan（Elm作者）としては自分の表現したいシチュエーションに合わせてカスタム型を作るほうがいいといってます。同意見です（ただこの意見は書き捨てのコードをささっと書くとか抽象化の力を借りてスタイリッシュに書こうというのには合いません。ボイラープレートコード上等です。書け。他人の抽象化に乗ってる暇はない）

## 終わり

書かなきゃいけないことは書いたと思うので終わります。大体型見たら終わりますからね、しょうがないね

[elm-jp](https://elm-lang.jp/)ってコミュニティがあります。まだどんな質問にも答えてくれるし、質問に答える前にお前それどういうことってわざわざ聞いてくれる感じなので何かあったらどうぞ
GoogleCTF #beginners/re-firmware

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/4bb42c13-a40d-913b-69d1-06284224b9f6.png)


#問題

https://capturetheflag.withgoogle.com/#beginners/re-firmware

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c313941b-515f-bb2b-c9db-4bfe470ce1fa.png)


#解いてみた

添付ファイルをダウンロードします。

ZIPファイルを解凍するとEXT4のイメージファイルがありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5657209f-67e5-0de0-ff12-8144484d3c97.png)

FTK imagerを使って読み込みます。
そして「CTF{」でgrepしてみましたが、0件。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/93dbefda-330f-e396-77f7-648a070d2cce.png)

イメージ内部を見てみます。
とても怪しいgzファイルを見つけました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ddad757f-7c63-26d4-9467-4ee85a0dd9a2.png)

これをダウンロードして解凍します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/04a9b5d9-46b0-3905-b107-c4dd5d0d7680.png)

破損しています。
FTKのデータを見るとシンボリックリンクって書いてあるし、バイナリ見ても「../../America/Cordoba」って書いてあるだけだから、これは実態ではないのか。
ただ、フォルダ二つ上っていうのはないんだけれども。。。
もうすでに/にいるし。。。
Cordobaフォルダorファイルを探してみたものの存在せず。

他に怪しそうなファイルなどを探してみましたが、全く見つからず。

Ubuntuでマウントしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0ba23332-d213-0f38-8117-fd1c4b97380d.png)

そして解凍＆cat。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0ba3c60e-8aea-026c-642b-70b9fdedc72f.png)

できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fa640a6f-a308-745c-5932-5a91971d267a.png)

結局Windowsだと何でできなかったんでしょう:thinking::thinking::thinking:
C言語入門~文字列とポインタ~

#ポインタによる文字列#
ポインタによる文字列は以下のように宣言･初期化する.
`char *p = "String";`

ポインタpと文字列リテラル"String"のそれぞれが記憶域を占有する.
ポインタpは文字列の先頭文字を指すポイント.
ちなみに,配列名も先頭文字を指します.

#文字列の配列#
`char *p[] = {"C","JavaScript","swift"};`

#文字列を扱うライブラリ#

| 関数                 |       機能 | 
|:------------------------|:-----------------|
| strlen(s);         |   文字列の長さを求める | 
| strcpy(s1,s2);     | s2の文字列をs1にコピーする|    
| strncpy(s1,s2,n);    | strcpyにコピーする文字数に制限を設ける| 
| strcat(s1,s2);     | 文字列を連結する |
| strncat(s1,s2,n);   | strcatに連結する文字数に制限を設けることが可能 |  
| strcmp(s1,s2);       |文字列の大小関係を求める.s1がs2より大きければ正の整数値,等しければ0,s1よりs2小さければ負の整数| 
|atoi(nptr)|nptrが指す文字列を,int型の表現に変換する.|
|atol(nptr)|nptrが指す文字列を,long型の表現に変換する.|
|atof(nptr)|nptrが指す文字列を,double型の表現に変換する.|
論文まとめ：Shake-Shake regularization

# はじめに 
ICLR2017から正則化関連の以下の論文
[1] X. Gastaldi, "Shake-Shake regularization" 
のまとめ。

arXiv：
https://arxiv.org/abs/1705.07485

著者のGithubコード：
https://github.com/xgastaldi/shake-shake 
torchを使ってる。

# 概要 
- 正則化の１つ
- ResNetのredisual block における 2 つの経路に対して順伝播時はランダムな掛け率 $\alpha$と$1 - \alpha$ で足し合わせる。  
- 逆伝播時は $\alpha$ とは異なる $\beta$ を用いて計算する

# しくみ 

以下の[1]Figure 1 で説明する。

<img width="714" alt="shake_shake_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/b4788688-1a6d-7f5d-d23b-17cc78a9ab73.png">
 
図のような residualなstreamが２つある場合を考える。単純なresidual blockだと

```math
x_{i + 1} = x_i + \mathcal{F}(x_i, \mathcal{W}_i^{(1)}) + \mathcal{F}(x_i, \mathcal{W}_i^{(2)})
```

と３つを足す。

shake-shakeでは乱数 $\alpha_i \in [0,1]$ を発生させて

```math
x_{i + 1} = x_i + \alpha_i \mathcal{F}(x_i, \mathcal{W}_i^{(1)}) + (1-\alpha_i)\mathcal{F}(x_i, \mathcal{W}_i^{(2)})
```

とする。（Figure 1 の左）

通常の勾配降下法で誤差逆伝播させると勾配はそれぞれ $\alpha$ 、 $1-\alpha$ で伝わるが、ここは別の乱数 $\beta  \in [0,1]$ を発生させて、それぞれ $\beta_i$ 、　$1 - \beta_i$ とする。（Figure 1 の中央）

推論時はそれぞれ $0.5$ の掛け率で足し合わせる。（Figure 1 の右）

# 実験と結果　
<font color='red'>書きかけ</font>

### shake, even, keep の比較

- shake：shake-shakeをする
- keep：forwardでshakeした掛け率をbackwardでも使う
- even：0.5、0.5の掛け率を使用

としてそれをmini-batchレベルとimageレベルで行い、性能を比較した。使用したモデルはresnet系。用いたデータはCifar-10

<img width="696" alt="shake_shake_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/c98bf6d4-09c4-ac7a-e7f7-606d16ffb429.png">

imageレベルでforwardもbackwardもshake-shakeしたものが一番性能がいい。

### 他の有名モデルとの比較 
Cifar-10で他の有名モデルとtest errorを比較したものが以下。

<img width="668" alt="shake_shake_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/106f9241-0947-d75b-520d-ccb417fa133f.png">

DenseNetやResNeXtに勝ってる。

### backwardの掛け率を変化させた時の性能の変化 

<img width="722" alt="shake_shake_16.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/f170a9bc-d906-33cd-8e9b-456fb8b942bf.png">

<img width="733" alt="shake_shake_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/53cd4164-4bd2-0723-2b78-b1e540fd974f.png">
Azure VMでOpen3Dやーる（Data Science Virtual Machine - Windows Server 2016、NV6）

AzureのWindowsマシンでOpen3Dを実行するまでのメモです。
NVシリーズ以外はOpenGLのバージョンが1.1と古いため、表示ができません。

# NVシリーズのVMを作成

Azure Portalを開きます。
リソースの作成から、`Data Science Virtual Machine - Windows Server 2016`を検索し、新規作成します。

<img width="847" alt="azure-gpu.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/5a4c0073-e3f8-7a63-deaf-eb02edc50bee.png">

インスタンスの詳細の地域を`米国中南部`、サイズを`NV6`とします。
作成できたら、RDPで接続します。

# NVIDIA GPU ドライバーの設定

「[Windows を実行している N シリーズ VM に NVIDIA GPU ドライバーをインストールする](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/n-series-driver-setup)」を参考に、下記ドライバーをインストールします。

- [NVIDIA Tesla (CUDA) ドライバー](http://us.download.nvidia.com/Windows/Quadro_Certified/398.75/398.75-tesla-desktop-winserver2016-international.exe)
- [NVIDIA GRID ドライバー](https://go.microsoft.com/fwlink/?linkid=874181)

インストールしたら、再起動します。

デバイスマネージャーからDisplay adaptersに`NVIDIA Tesla M60`があることを確認します。
![51100955_2289226721338366_7012578620996583424_n.png](https://qiita-image-store.s3.amazonaws.com/0/63863/5b4f85d4-3c51-6674-c1e2-47e49453cd2c.png)

nvidia-smiを実行し、GPUが動作していることを確認します。
![50625344_2088903501194931_5255427364703174656_n.png](https://qiita-image-store.s3.amazonaws.com/0/63863/33c8a62e-0b1f-39e3-c458-221faf5cd793.png)

[OpenGL Extensions Viewer](http://realtech-vr.com/admin/glview)を[ここ](http://www.realtech-vr.com/support/deeplink.php?SKU=15&target=UrlWin32)からインストールします。

OpenGL Extensions Viewerを起動しOpenGLのバージョンが`4.6`になっていればOKです。
![Dx07xBEUwAAXgVA.jpg](https://qiita-image-store.s3.amazonaws.com/0/63863/60bbca25-6159-4484-1753-e1dc90abb8c3.jpeg)

# Open3Dやーる

Anaconda Promptを開き、Python3.6環境を作成します。

~~~
conda create -n py36 python=3.6
~~~

py36環境に入ります。

~~~
activate py36
~~~

必要なライブラリをインストールします。

~~~
pip install opencv-python
pip install opencv-contrib-python
pip install open3d-python
pip install matplotlib
pip install pillow
~~~

[Open3D v0.5.0](https://github.com/IntelVCL/Open3D/releases)をダウンロードします。rgbd_nyu.pyを実行してみましょう。

~~~
cd Downloads\Open3D-0.5.0\examples\Python\Basic
python rgbd_nyu.py
~~~

![50933604_346891816151244_4541766656677904384_n.png](https://qiita-image-store.s3.amazonaws.com/0/63863/d7dd2836-4701-7fa8-9fc9-98ce47971b05.png)
![51036544_1062287180633754_1199348885600862208_n.png](https://qiita-image-store.s3.amazonaws.com/0/63863/ec280008-9664-d925-959b-d2f755af97a1.png)

このように表示されればOKです。OpenGLのバージョンが1.1だと失敗します。
Reatに入門して1日目の私が調べたこと

## DOM
Document Object Modelの略
HTMLやXMLの各要素にアクセスする仕組みのこと。

## JSX
JavaScriptを拡張した言語
Reactを用いて、HTMLを出力するもの。
見た目は、HTMLと似ている。
JSXはアプリケーション内部では、トランスパイルされJavaScriptのコードに変更される。
JSXをJavaScriptにトランスパイルしているのは<strong>Babel</strong>

### トランスパイルとは
ある言語で書かれたコードをもとに、別の言語のコードに書き換えること。

### なぜJSXを使うのか？
JavaScriptを書くよりも、可読性が高く書きやすい為。

#### JSXとJavaScriptでHello, World
```sample.js
// JSXの場合
render() {
  return <div>Hello, World</div>;
}

//JavaScriptの場合
render() {
  return React.returnElement(
    "div",
    nul,
    "Hello, World"
  );
}
```
JSXの方が書きやすいのは明白。

## Webpack
複数のファイルを1つにまとめて、Webに読み込みやすくするもの。

## Component
Webサイトを構成する部品のこと。
Reactには2つにComponentがある。
componentは再利用することができる。

### functional component
関数の定義によって作成するコンポーネント

### class component
クラスの定義によって作成するコンポーネント
renderメソッドが必須

**今後はclass componentは無くなり、function componentが使われていくらしい**

## props
componentの属性
親コンポーネントから子コンポーネントを呼び出す時に、propsという形で情報を伝達する。
stateと違って不変

```sample.js
//App.js(親コンポーネント)
import React, { Component } from 'react';
import Greeting from './Greeting';

class App extends Component {
  render() {
    return(
      <Greeting name='Tom' />
    );
  }
}

export default App;
//=> Hi Tom



//Greeting.js（子コンポーネント）
import React from 'react';

function Greeting(props) {
  return(
    <div>Hi {props.name}</div>
  );
}

export default Greeting;
```

子コンポーネントを状態の持たないステートレスなコンポーネントにすることができ、子コンポーネントを触らずに親から渡す情報を変えることだけで使えるようにすので、再利用ができる。
フォークしたリポジトリを更新する

# はじめに
プログラミングスクールでチーム開発が始まり、
何度も使う機会が増えると思い、まとめました。

# フォーク元のリポジトリを登録する

元のリポジトリをフォークした自分のリポジトリに登録します。
(カレントディレクトリが自分のローカルリポジトリであること)
登録は一度のみなので、登録名を覚えておくこと。

```ターミナル.
git remote add (登録名、何でも良い) git://github.com/(フォーク元のユーザー名)/(リポジトリ名).git
```
# フォーク元の内容を取得する

既に登録している方はこちらの手順から始める。

```ターミナル.
git fetch (登録名)
```

# 自分のローカルのブランチにマージする

```ターミナル.
git merge (登録名)/master
```
# ローカルの変更をリモートに反映させる

```ターミナル.
git push origin master
```
smart custom feildを使い、数字を入力したら税込で表示され、かつ数字をカンマで区切る方法

# 「smart custom feild」が入っている前提。

## 税込計算をするためfunction.phpに以下を入力

#### 消費税が8％の場合
```
function including_tax($attr) {
	$price = floor($attr[0]*1.08);
	return $price;
}
add_shortcode('price', 'including_tax');
```
消費税8％びの場合は、「*1.08」と記述。

#### 消費税が8％から10％へ変更された場合
```
function including_tax($attr) {
    $price = floor($attr[0]*1.1);
    return $price;
}
add_shortcode('price', 'including_tax');
```
「*1.08」を「*1.10」と記述するだけ。

税抜き金額が「1000円」の場合、
税込み金額を挿入したい箇所に下記のショートコードを記述。

```
[price 1000]
```
すると8％の場合は、1080と表示され、10%の場合じゃ、1100と表示れる
[price 1000]に「円」を入れれば「円」つきで表示されます。


## カスタムフィールドで表示させる方法
固定ページの場合は、[price 1000]などど記述すればすぐ表示されるが、
カスタムフィールドはちょっと違う。

普通に

```
<?php echo post_custom('カスタムフィールド名');?>
```
記述した場合、ショートコードがそのままでてきてしまう。
なので、

```
<?php echo apply_filters('the_content', get_post_meta($post->ID, 'カスタムフィールド名', true));?>
```
と記述しなければならない。
そうすることで、数字だけが出てくる。

## カンマで区切りる方法
カンマで区切るには、number_formatを使えば良いのだが、
smart custom feildを使っているせいかエラーが吐き出されてしまう。

```
<?php
if(get_post_meta($post->ID , 'カスタムフィールド名' ,true)):
$num = get_post_meta($post->ID , 'カスタムフィールド名' ,true); 
echo number_format( $num ) ;
endif; ?>
```
上記を入れると、カンマ区切りで表示されるらしいが、何も表示されなくなってしまったため、


```
<?php echo apply_filters('the_content', get_post_meta($post->ID, 'カスタムフィールド名', true));?>
```
上記と合体させて

```
<?php
if(apply_filters('the_content', get_post_meta($post->ID, 'price', true))):
$num = (apply_filters('the_content', get_post_meta($post->ID, 'price', true)));
echo number_format((int)$num);
endif; ?>
```
と記述したら見事カンマ区切りで表示された。
AWS認定ソリューションアーキテクト アソシエイトに合格したときの勉強方法

- 本「Amazon Web Service エンタープライズ 基盤設計の基本」で勉強した。
  - この試験にかなりフィットした内容になっていて、この１冊を勉強すれば合格できると思う。
- この本以外で試験に役立つような勉強をしていたかというとそんなにしてないと思う。
  - ブラックペーパーはさらさらと読んだりはしたけど、そんなに記憶に定着してないと思うし。
- ホワイトペーパーはこの試験には役立つとは思ったけど、分量も多いし英語だらけだったので手は出さなかった。（英語苦手です。）
[Microsoft] Azure DevOps Pipelines 設定ファイルの書き方

Azure Pipelinesの動作を設定するYAMLファイルの書き方を完全に理解したので、忘れないうちにまとめておきます。

リファレンスマニュアルはこちら → https://docs.microsoft.com/ja-jp/azure/devops/pipelines/yaml-schema?view=azdevops&tabs=schema


# 全体の構成

まず全体の構成です。
ジョブ（後述）を書かない場合と、書く場合に分かれます。

コピペしてテンプレにしてください。

## ジョブを書かない場合

```yaml:azure-pipelines.yml
pool:
  vmImage: ubuntu-16.04

steps:
- 手順
- ……
```

## ジョブを書く場合

```yaml:azure-pipelines.yml
jobs:
- job: myjobname
  pool:
    vmImage: ubuntu-16.04
  steps:
  - 手順
  - ……
```




# 手順の書き方

Pipelinesで実行する手順は、`steps`以下に書いていきます。

```yaml:azure-pipelines.yml
steps:
- 手順1
- 手順2
- 手順3
- ……
```

# 『手順』として書けるもの

## `task`

[あらかじめ用意されている処理](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/index?view=azdevops)を実行します。

タスクの一覧はこちら → https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/index?view=azdevops

例えば`npm install`を実行する場合はこうなります。

```yaml:
steps:
- task: Npm@1
```



## `template`

外部ファイルを読み込みます。パラメータを渡すこともできます。

例えば、`ci/build.steps.yml`という外部ファイルを読み込み、`target`というパラメータを渡す場合はこうなります。

```yaml:
steps:
- template: ci/build.steps.yml
  parameters:
    target: myproject
```

読み込まれる側のファイルはこうなります。

```yaml:ci/build.steps.yml
parameters:
  target: デフォルト値

steps:
- script: npm run build ${{ parameters.target }}
```


## タスクのショートカット

いくつかのタスクにはショートカットというか、エイリアスが用意されています。

- [script](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/utility/command-line?view=azdevops&tabs=yaml) CmdLine@2のエイリアス
- [bash](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/utility/shell-script?view=azdevops) ShellScript@2のエイリアス
- [pwsh](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/utility/powershell?view=azdevops) PowerShell@2のエイリアス
- [PowerShell](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/utility/powershell?view=azdevops) PowerShell@2のエイリアス

これらは、`task: タスク名`と書かずに、直接書けます。

```yaml:
steps:
- script: …
- bash: …
- pwsh: …
- PowerShell: …
```

よく使うのは`script`です。コマンドラインスクリプトを書けます。

vmImageとしてWindowsを選んだ場合はcmd.exe、Linux/macOSであればbashです。

```yaml:
steps:
- script: echo %foo% # Windowsの場合
- script: echo $foo # Linux/macOSの場合
```

# ジョブの書き方

『手順』をまとめると『ジョブ』になります。
『ジョブ』は、並列に実行したり、前段階の『ジョブ』の状態に応じて実行可否を決めたりできます。


```yaml:
jobs:
- ジョブ1
- ジョブ2
- ジョブ3
- ……
```

# 『ジョブ』として書けるもの

## `job`

まとめた手順`steps`を書けます。

```yaml
jobs:
- job: ジョブ名
  steps:
  - 手順1
  - 手順2
  - ……
```

## `template`

外部ファイルを読み込みます。パラメータを渡すこともできます。

例えば、`ci/env.jobs.yml`という外部ファイルを読み込み、`machine`というパラメータを渡す場合はこうなります。

```yaml:
jobs:
- template: ci/env.jobs.yml
  parameters:
    machine: ubuntu-16.04
```

読み込まれる側のファイルはこうなります。

```yaml:ci/env.jobs.yml
parameters:
  machine: デフォルト値

jobs:
- job: EachEnvironment
  pool:
    vmImage: ${{ parameters.machine }}
```