OmniAICreator/Qiita-1.07M huggingface dataset:
SPLを利用せずに分析したい! Splunk ピボット機能使ってみた


# はじめに

Splunk 初心者にとってネックになるのが SPL言語になります。比較的簡単な言語なので慣れると非常に便利なのですが、普段使わないユーザーにとっては、分析する際の壁になってしまいます。

コマンド打ちたいわけじゃない！分析がしたいんだ！

そんな時はピボット機能を使ってみましょう！

# Step1 : ピボットで利用するためにテーブルビューを作成

これは、ピボットで利用するためのデータを指定する作業になります。Excelでもピボットを利用する前にデータ範囲を指定しますよね。これと同じです。

**(補足)ちなみに Splunkに詳しい方であればデータモデルでも同じようにピボット機能を利用できます。**

「データセット」タブを選択して、「テーブルビューの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/45b5f630-fb16-3358-32ca-bbdc74756922.png)

次に、対象のデータが入っているインデックスとソースタイプ（複数指定可）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/b19e1f51-8f2d-0e9b-7f71-7691276aa94b.png)

次に、分析したいフィールドを選択します。（複数指定可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/5f1645d9-ea6d-a522-53e0-3fc6a4eb7ed0.png)

指定したデータが表示されます。ここで最後にデータの加工ができます。
例えば、null値を変換したり、一定の値以上だけにフィルターしたりなどです。（ほとんどの操作がGUIで可能です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/1078f64b-ed51-f6a4-1fb5-34a942702ca6.png)

テーブルビューができたら、「保存」ボタン！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/27602cf9-469c-d515-6a3b-1d81c29e769e.png)


これで準備は完了です。

# ステップ２ ： ピボット作成

作成したテーブルビューは、「データセット」タブから選択できます。対象のデータセットの「アクション」に「ピボットで可視化」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/d0ae9012-a572-2377-1c3f-46d8baa19a44.png)

ピボットの編集画面になりますので、列に action, 行に clientipを選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/e21dbe29-b362-33e0-134c-8ba889990f82.png)

列値に productIdを選択すると、対象の productId リストが表示することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/48f26734-bd93-b8b3-bd37-ebb9448ee8c1.png)

もう一度、count数に戻して、ヒートマップで表示もできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/9ced4533-9705-594c-575c-3393808301c5.png)

フィルター条件を追加することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/2f78306c-4ae6-21b0-55cf-e29ef0385441.png)


左側のペインから、グラフを選択すると、様々な可視化が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/1957f5f5-a4bc-5e67-0a72-79bae3c72f66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/30f1812e-4f89-57f3-84ad-fd6dabf230f2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/bb847646-c68f-82a2-a976-669c60797dd4.png)


# 保存

分析した結果はレポートやダッシュボードに保存可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/de586a25-3811-8f5c-927d-6a8004cafd83.png)



一度保存したレポートをピボットで再編集することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/d1f78fe0-d8cc-4b3f-5a6f-9676cdd4765f.png)

# 最後に

如何だったでしょうか？ SPLを知らなくてもかなりの分析はできるようになります。
もちろんSPLを知っていた方が、できることは多いですが。 Splunkのライトユーザーはこちらから初めてみては如何でしょうか？
囚人のジレンマ、男女の争い、チキンゲームの関係


2人のプレイヤーが対等な場合について、囚人のジレンマ、男女の争い、チキンゲームの関係について考えた。
2人のプレイヤーは対等であるとして、次のような対称な利得行列を持つゲームを考える。

![ProfitMatrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942109/a2c4d37d-d382-5f90-5623-7261e5fb6558.png)

$c, d, e, f$ の大小関係により、どんなゲームであるかが決まる。$c, d, e, f$ の大小関係がはっきりと定まる（狭義全順序関係がある）とき、$4!=24$ 通りのゲームが考えられるが、それらについてゲームの分類を行うと次のようになる。

![GamePatternFigure (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942109/f4659f9a-8b5e-163f-c1a4-33c723a56a31.png)

順序関係をノードとして、例えば、$c>d>e>f$ の場合を$cdef$と表記している。隣り合う順序を入れ替えて変化する順序関係間にリンクを張った。$c$と$d$の順序を入れ替えてもゲームの分類は変わらないので、$c>d$の場合のみを表記した。上図のネットワークの下に、破線で結ばれて、$c,d$ の順序を入れ替えたネットワークがあると考えればよい。

結局、$c>d$の場合、$c$と$f$、$e$と$d$の大小関係に注目すればよく、

「$c>f$ かつ $e>d$」⇒ 強支配ゲーム（戦略$s_1$を選ぶ方が利得が大きい）
「$c>f$ かつ $e< d$」⇒ 男女ゲーム（相手と同じ戦略を選ぶ方が利得が大きい）
「$c< f$ かつ $e>d$」⇒ チキンゲーム（相手と異なる戦略を選ぶ方が利得が大きい）
「$c< f$ かつ $e< d$」⇒ 囚人ゲーム（戦略$s_2$を選ぶ方が利得が大きい）


と分類されることになる。

強支配ゲーム：
どちらのプレイヤーにも強支配戦略があるゲーム。ナッシュ均衡が1つ。
男女ゲーム：
「男女の争い」として知られるゲーム。両プレイヤーが同じ戦略を選ぶ状態がナッシュ均衡。
チキンゲーム：
「チキンゲーム」として知られるゲーム。両プレイヤーが異なる戦略を選ぶ状態がナッシュ均衡。
囚人ゲーム：
「囚人のジレンマ」として知られるゲーム。ナッシュ均衡が1つ。
私が技術解説を書くときに気をつけていること

プログラミングスクールの生徒さん向けに、教科書や補助教材を作成しているのですが、その中で気をつけていることや、過去の失敗から学んだことをなどを書いていきます。

Qiitaでトレンド入りされている方の記事は、さすが、ここに書いてあるようなことはほとんどカバーされていますね。


# 難しい漢字を使わない

パソコンで打つと簡単に漢字に変換できてしまうのですが、それが仇となって難しい漢字を使いがちです。
よく見るものだと「所謂」があります。いわゆると読みます。私は最初読めませんでした。

技術解説は特に、細かいところに思わぬ注意点があったりして、一字一句ちゃんと読まないといけないのですが、所々に読めない漢字が含まれていると読む気を失ってしまいます。

**自分が読めない・書けない・書いたことがないような感じは平仮名にする**

# 無駄なコードを書かない

私もうっかりしているとよくやってしまうのですが、本当に伝えたいコード以外のコードが多くて、何が言いたいのか分からないパターンです。

「〜の使い方」系の解説でよく見かけます。

例えばRubyのreverseメソッド(文字列を反転させる)の使い方を解説するような以下のコード

```ruby
firstname, lastname = gets.split(" ")
fullname = firstname + lastname
if fullname.size > 20
  puts fullname.reverse
else
  puts fullname
end
```

reverseの使い方だけなら

```ruby
"abcdef".reverse
```
だけでいいのに、標準入力を受け取るgetsや文字列を分割するsplitなど、余計なコードが多いです。
これは大袈裟な例かと思いきや、そんなことはなくて、これに近い解説は結構あります。

**余計なものは省いて、シンプルな例にする**

# こまめに実行

比較的短いコードだと問題ないのですが、RailsやLaravelのように、複数のファイルを触るような解説では、できるだけこまめに実行していった方がいいです。

実際にあった教材なのですが、Rails・Laravelでindexからnew,create,edit,update,destroyの処理をコントローラ・ビュー合わせて全部書かせてから、初めて実行させるというものがありました。


これだと、もしエラーが出た場合に、初心者にはどこが問題なのか見当もつきませんし、どのコードがどのように作用しているのかも分かりにくいです。

indexのアクション、ビューを書いたら実行・動作確認、次のアクションを書いたら実行・動作確認というように、こまめに実行させ、結果を確認してもらうことで、間違った場所やコードの意味が分かりやすくなります。

２０行ぐらいのコードであっても、少しずつそのプログラムが出来上がっていく工程を書くことで、どのようにプログラムが出来上がっていくのか伝わりやすくなります。

**できるだけ小さくまとまった単位で実行する**

# 動くサンプルコード

ちゃんと動くサンプルコードを書きましょう。

手元で動作確認しても、コードエディターから文書へ写すタイミングでタイプミスなどは起こりえます。
私がいつもやっているのは、**文書のコード**をコピーしてきて、エディターへペーストし、実行できるかチェックします。

このようにチェックしても、文書中のコードを少し修正するときは、少しの修正だからと油断しがちです。
あるいは、コード中にコメントアウトを残す場合も注意が必要です。

技術解説を書くような人の多くは、複数の言語を触っていると思うのですが、言語ごとにコメントアウトの書き方が異なるため、間違ってRubyのコードにcssのコメント書いてしまう場合もあります。
コードエディタだとちゃんと教えてくれるのですが、文書用のエディタとなると、気づかないまま公開してしまいます。

**コードは毎回動作確認する**

# hoge,fugaを使わない
何の躊躇もなくhogeやfugaを使ってしまいますが、初めてhogeやfugaを見る人は特別な命令か何かだと勘違いしてしまいます。
「hogeとはなんですか？」これ結構プログラミング初心者の方から質問されます。

hogeやfugaを使うタイミングとしては、具体例を書くときだと思うのですが、具体例なのですから、実際に実務などで使ったモデルや変数名を使った方がリアルで、コードの「使い所」が分かりやすくなります。

**名前大事**

# 動機を書く

ラスト２つに最も言いたかったことを持ってきてしまいました。
技術書において最も大切なのは、「動機」です。
「〜使い方」系は読む側も動機がはっきりしている(使いたい)と思うので、別に書かなくてもいいですが、フレームワークやツールの概要を解説するときは、必ず書いた方がいいです。

特に解説が長くなってしまうものほど、動機が書かれていないと、「長いからいいや」と思われてしまいます。
私はdockerというものに度々興味を持ち、その度に調べてみるのですが、「dockerはコンテナがどうのこうの」「素早く立ち上がる〜なんとか〜」みたいに書かれていても、「Macで開発できてるからいいや」と思ってしまいます。

解説を書くぐらいの人であれば、そのツールやフレームワークを使う理由が必ずあるはずです。これを使うとこんなにいいことがある、xxで困っていたけど、これを使ったら解決した。みたいに、なぜ自分たちが使っているのかを語ってもらえると、「じゃあ長いけど必要そうだからちゃんと読んでみよう！」と思ってもらえるはずです。

**信者を増やす**

# 推論可能な例えを書く

「オブジェクト指向のクラスは車に例えられて、車輪がなんとかで〜」

みたいな例え、全く無意味です。車に詳しくなるだけです。こういう例えで「理解できた！」って言ってる人で、実際にコードが書けるようになった人みたことないです。

「例え」について正しく理解して欲しいのですが、例えって、静的なものではなく動的なものです。
つまり、例えて終わりじゃなくて、「例え->推論->戻ってくる」ができないとダメです。
クラスを何かに例えたのであれば、最終的な目的はクラスを理解することです。例えを理解することではありません。
例えを通して、難しい概念を理解することが真の目的です。

![スクリーンショット 2020-12-09 17.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82541/4a343854-aa46-8a6a-b17d-2cf11359c869.png)

**真の目的を忘れない**
ポインタにmemcpyする

備忘録
※2021/2/3 追記

# ダメなほう
<!-- 発端や概要を記載 -->

```c

char *hoge;
char str[5] = "test";

memcpy(hoge, &str[0], sizeof(str));

// hogeからtestを読み出したいが
// 読み出すと変な値
```
<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 正しいほう
```c
char Secure_str[5] = {"\0"};
// この初期化で書き込める領域を確保
char *hoge = &Secure_str;
char str[5] = "test";

memcpy(hoge, &str[0], sizeof(str));

// hogeからはtestが読み出せる

```

アドレス入れられる領域を確保をしないとだめ

# 追記
（コメントでご指摘いただいた内容をそのまま記載しています）

>
アドレス入れられる領域を確保をしないとだめ

データを入れる領域を確保しないとだめです。
>
```c
char *hoge;
```

ポインタ変数を宣言することでアドレスを入れる領域を確保しています。
アドレスを代入していないので、どこをアドレス（ポイント）しているか不明な状態です。

>
```c
char Secure_str[5] = {"\0"};
```

これでデータ領域を確保しています。

>
```c
char *hoge = &Secure_str;
```

これで、データ領域のアドレスをポインタ変数に代入しています。
ポインタ変数hogeはデータ領域Secure_strをポイントしています。

>
```c
memcpy(hoge, &str[0], sizeof(str));
```

これは、「hoge変数に代入されている値（どこかのアドレス）」と「str[0] のアドレス」と 「str領域のサイズ」を引数にして「memcpy関数」を呼び出しています。
最初のコードは、hoge変数に値が代入されていないため不定値を渡してしまい、memcpy関数はおかしな動作をします。
FileMaker初心者向け よくある実装まとめ

# 概要
無いよりはあったほうが良い実装まとめ

# GetValue
改行区切り文字列の指定した行目の値を取得する。
FileMakerのスクリプト引数は1つしか渡せないので、改行区切り文字列やJSONを使用して複数渡す実装が多い。
※空が発生する場合があるならJSONのがいいと思います。

![スクリーンショット 2020-12-09 16.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/e490dc17-6d73-a9f0-8b27-f3b3f60e9249.png)


# UniqueValues
改行区切り文字列の重複をいい感じに無くす。
![スクリーンショット 2020-12-09 16.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/8f7778ca-8a5a-124a-b686-e9a1f5bcc773.png)


# ValueCount
改行区切り文字列の行数(要素数)をカウントする。
GetValueと組み合わせて、ループ処理の`Exit Loop If`と組み合わせて使われることが多い。
![スクリーンショット 2020-12-09 16.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/aab3439f-8913-9328-a042-4cff2471c6a2.png)

# Substitute
文字の置き換えをする。
![スクリーンショット 2020-12-11 9.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/6b686d04-c1ca-fe8d-d46d-0bfe70474e39.png)


# 全件処理
全件処理なので`全レコードを表示`を使用しているが、検索後の対象レコードでも問題なく動作する。
![スクリーンショット 2020-12-09 16.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/e577d585-d64f-29f3-824a-e4e76a8ca6a8.png)

# Confirm
ダイアログをだしてOK, CANCELの分岐を行いたい。
`Get(最終メッセージ選択)`で戻ってくる番号は設定画面の項目順なので
1ならOKか〜みたいな決めつけはよく無い。

![スクリーンショット 2020-12-09 16.45.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/ac6225be-ed68-37e6-56d7-6f7d4f35cc26.png)


# 前の月の最終日
`Date`で今月1日の日付を作って1日引く
![スクリーンショット 2020-12-09 16.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/e38faff0-65dc-01ca-cf26-7959c0321b67.png)

# エスケープが必要な文字を難しいこと考えずに変数に入れたい
`テキストを挿入`はその辺を良い感じにしてくれる
![スクリーンショット 2020-12-09 17.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94403/01dcfa84-2c5d-4ad6-9638-20cfb0665c07.png)


# 最後に
こう言う関数の使い方とかはFileMakerのヘルプが一番詳しいのでちゃんとヘルプを読むこと。
Cannot start under Java 1.8.0_202-release-1483-b58: Java 11 or later is required.

# これなに？
`RubyMine 2020.3`からは `Java 11 or later is required`っぽい。（情報を見つけられなかったけど2020.2はJava8でも立ち上がったのであくまで"ぽい")

JetBrainsはローカルのjdkを見ないのでこのアラートが出たからといって、Javaをupdateしても解決できません。

かつ、エディタの起動時にアラートが出て起動できないので設定からも変えられません。

# こうする
参考
https://intellij-support.jetbrains.com/hc/en-us/articles/206544879
https://www.jetbrains.com/help/idea/tuning-the-ide.html?_ga=2.249579142.1401183710.1607499301-1614954947.1607499301&_gac=1.87053418.1607499366.Cj0KCQiA5bz-BRD-ARIsABjT4ngX9IeTo7zPJlCSK9-aQKTFmpOixlljsumEyICBgQVyEY_AYGcH3SYaAoKmEALw_wcB#default-dirs

- `RubyMine 2020.2`(立ち上げられるJetBrains)をインストール->起動してPlugin`Choose Runtime`をインストールする
- `Choose Runtime`で要求バージョンのjdkをインストールしてセットする
- ターミナルでそのjdkを所定の場所にコピーする

```
cd "~/Library/Application Support/JetBrains"
cp ./RubyMine2020.2/rubymine.jdk ./RubyMine2020.3/rubymine.jdk
```

*この`rubymine.jdk`はJava公式からDLしても良いと思う。*
*多分２０２０.3をインストールする前にRuntime更新しておけば引き継ぐのかなあ？*

以上
li(リスト)タグ内の画像を中央表示(センタリング)するには

#li(リスト)タグ内の画像を中央表示(センタリング)するには


##背景
liタグ内の画像を中央表示したくて```text-align:center;```や```vertical-align:middle;```を試すもうまくいかない！

##試したこと
```text-align: center;```や```vertical-align: middle;```を設定してみる。```text-align: center;```は効いて左右中心になるも上下は中央配置にならない。
それもそのはず、```vertical-align: middle;```が使えるのは**インライン要素**と**テーブルセル(display:table-cell;)**のみ！


```html

<ul>
  <li><img src="" .....></li>
  <li><img src="" .....></li>
  <li><img src="" .....></li>
</ul>
```

```css
ul>li{
  text-align: center;
  vertical-align: middle;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615830/9ef980d9-2458-579a-5ec8-922f75ac8fb5.png)



##解決法
display:****が効くのは基本的に指定した要素の子要素まで。
そこで、中央配置にしたいimgタグの親要素であるliタグに```display:flex;```、```align-items: center;```、```justify-content:center;```を設定。
そうすると、liタグ内の画像の中央配置ができる。

```css
ul{
  display: flex;
  list-style: none;
}

ul>li{
  border: 1px solid black;
  display:flex;
  align-items: center;
  justify-content: center;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615830/1164f9fb-cdfb-c5b9-c518-afc2114194bd.png)
error An unexpected error occurred: "EPERM: operation not permitted, copyfileとでてCircleCIがビルドできなくなった

ローカルでもビルドできるし、Dockerでもビルドできるのに、CircleCI上で突然ビルドできなくなった。
どうやら、うまくファイルがコピーできないようだ。

```
error An unexpected error occurred: "EPERM: operation not permitted, copyfile '/usr/local/share/.cache/yarn/v6/npm-@babel-cli-7.12.8-3b24ed2fd5da353ee6f19e8935ff8c93b5fe8430-integrity/node_modules/@babel/cli/LICENSE' -> '/usr/src/app/node_modules/@babel/cli/LICENSE'".
```

## 原因

下記の記事を読む限りだと、node14.9.0以降のバージョンが、CircleCI上のDockerに対応していないようだ。

# 対応

下記のようにバージョンを指定してあげるとうまくビルドできた。

```yaml:.circleci/config.yml
version: 2.0
 jobs:
   build:
     docker:
       - image: circleci/node:14
     steps:
       - checkout
       - setup_remote_docker:
+          version: 19.03.13
```


## 参考
Docker build fails with `EPERM: operation not permitted, copyfile.....` when using node 14.9.0 or later – CircleCI Support Center - https://support.circleci.com/hc/en-us/articles/360050934711-Docker-build-fails-with-EPERM-operation-not-permitted-copyfile-when-using-node-14-9-0-or-later-
KotlinでUInt, UShortをByteArrayに変換する

リトルエンディアンで、UInt(32bit), UShort(16bit)をByteArrayに変換するコードです。

```UInt+.kt
fun UInt.toByteArray(): ByteArray {
    val value = this.toInt()
    val bytes = ByteArray(4)
    bytes[0] = (value and 0xFF).toByte()
    bytes[1] = ((value ushr 8) and 0xFF).toByte()
    bytes[2] = ((value ushr 16) and 0xFF).toByte()
    bytes[3] = ((value ushr 24) and 0xFF).toByte()
    return bytes
}
```

```UShort+.kt
fun UShort.toByteArray(): ByteArray {
    val value = this.toInt()
    val bytes = ByteArray(2)
    bytes[0] = (value and 0xFF).toByte()
    bytes[1] = ((value ushr 8) and 0xFF).toByte()
    return bytes
}

```
Sequel Aceで踏み台経由で接続する

## 最初に
[Sequel Ace](https://sequel-ace.com/)はSequel Proの後継ということで、
SSHを利用しての接続機能を持っており、つまり踏み台経由での接続も可能です
しかし、仕様によりProと同じように設定しても接続できなかったので注意が必要です

## やるべきこと
Preferences - Filesに、以下の二つのファイルへのアクセスを追加する
`~/.ssh/config`
`~/.ssh/known_hosts`
![スクリーンショット 2020-12-09 15.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8770/fceb24ab-3153-d569-c077-aa8ae758c0fa.png)

### うまくいかない場合
networkタブのSSH Config, Known Hostsを選ぶとうまくいく場合があるようです

### なぜ？
`Sequel AceはSandbox Modeで実行され、デフォルトではSSH構成ファイルにアクセスできません。`だからだそうです

`Sequel Ace doesn’t read my ~/.ssh/config parameters`
https://sequel-ace.com/get-started/

## 元ネタ・参考
[踏み台サーバ越しにあるMySQLにSequel Proでつなぎにいく](https://qiita.com/wapa5pow/items/bd047181728c5cb6b774)
第７回



# if-elsif-else-end　


# お題

うるう年かどうかを判定するcodeを書け．

    1. うるう年は4で割り切れる数の年．ただし，100で割り切れる年はうるう年でなく，400で割り切れる年はうるう年．
    2. 2004, 1999, 1900, 2000で試せ．それぞれtrue, false, false, trueとなる．


# 簡単な解説

[Rubyリファレンスマニュアル](https://docs.ruby-lang.org/ja/index.html)の「使用version」/「「Rubyの文法:制御構造」/「条件分岐if」/「文法」に次のような記述がある．

```ruby
if 式 [then]
  式 ...
[elsif 式 [then]
  式 ... ]
...
[else
  式 ... ]
end
```

ここで，thenは省略可能で，ifをつなげるのはelsifである．


# caseで綺麗に書く．

先程の[Rubyリファレンスマニュアル](https://docs.ruby-lang.org/ja/index.html)の「条件分岐if」の下側にcaseの説明がある．

    case [式]
    [when 式 [, 式] ...[, `*' 式] [then]
      式..]..
    [when `*' 式 [then]
      式..]..
    [else
      式..]
    end


# 解説(case)

```ruby
def leap?(year)
  return case
     when year % 400 ==0 ; true
     when year % 100 ==0 ; false
     when year % 4 ==0   ; true
     else                ; false
     end
end
[2004, 1999, 1900, 2000].each do |year|
  p year
  p leap?(year)
end
```

実行結果

    $ ruby leap_year.rb
    2004
    true
    1999
    false
    1900
    false
    2000
    true



------
 - **source** ~/grad_members_20f/members/Kazufumi0823/a4.org
M1 Mac (ARM) で Homebrew を導入する

M1 Mac では今までの方法では、Homebrewをインストールすることができません。
基本的には下記手順を踏襲しますが、手順を細かく補足していきます。
https://docs.brew.sh/Installation

# Xcode Command Line Toolsを導入する
ターミナルで下記コマンドを実行します。この手順は過去のMacと共通です。

```
$ xcode-select --install
```

# 仮置きで~/homebrewにインストールする
最終的には、/opt/homebrewに置きますが、いきなりおくと権限でエラーになるようなので、~/homebrewを経由します。

```
$ cd ~
$ mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

# /opt/homebrewにコピーする
先ほどインストールしたファイルをコピーします。

```
$ cd /opt
$ mkdir homebrew
$ cd ~/homebrew
$ sudo cp -r . /opt/homebrew
```

# パスを通して再読み込みする
bashではなく、zshを使うため、~/.zshenvに追記します。

```
$ echo export PATH="$PATH:/opt/homebrew/bin" >> ~/.zshenv
$ source ~/.zshenv
``` 
# Homebrewが実行できるかを試す
下記のように表示されればHomebrewがインストールできています。

```
$ brew
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA

Contributing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh
```

# 追記
VirtualBoxのインストールの際に権限のエラーが出ました。
下記手順もやっておいた方が良いようです。

```
sudo chown -R $(whoami) /opt/homebrew
```
刷れる入稿データを作るときのポイント

# はじめに
この記事は自分の覚書の意味合いが強いです。正直この記事だけで「きれいなデザインを作って、印刷する」というのは厳しいかもしれません。記事の最後のほうに参考書籍を挙げておいたのでそちらもご覧ください。

筆者はフリーランスでデザイナーの仕事をしていたこともあり、こういう知識が必要だったのですが、最近はPDF入稿などが当たり前となって一般の人でも入稿作業をするようになりました。そういったときにもきっと役立つフローだと思っています。

なおPDF入稿の場合には透明効果を保持できる**PDF/X-4**と、保持できない**PDF/X-1a**が存在します。必ずデータを書き出す前に印刷会社に指定のフォーマットを確認してください。印刷会社側では誤ったPDFを入稿されてもオペレータの方が編集できず突き返されてしまいます。

## データフォーマットの調整

### 仕上がり色を決める
4Cで行くのか、1Cで行くのか、特色を使うのか決めましょう。いずれにせよカラーモードは**CMYK**を設定します。

多くの人はAdobe製品を使っていると思いますが、その場合にはBridgeなどを使用して「カラー設定」を共通化します。このあたりの設定がPhotoshopやIllustratorの間でちぐはぐだとCMYK分解など結果に影響します。

#### 黒の設定
この辺りがWordやPowerpointなどのオフィス製品にはまったくない概念なので最初つまづきますが、商用印刷にはリッチブラック・オーバープリントとよばれる**「赤の上に重ねた黒」とか「写真の上に重ねた黒タイトル」**といった表現が存在します。その設定をするのがIndesignであれば「環境設定」→「黒の表示方法」です。スクリーンでの見た目とテスト印刷の見た目両方設定しておきましょう。

### 仕上がりサイズを決める
ページのサイズを決めましょう。A4の出版物で210mm×297mmだと安易に決めつけず、きちんと確認します。だいたい変形のことが多いので数十ミリずれてます。Aiを使っている場合には**裁ち落とし（ドブ）の分は見込まず**アートボードサイズを作ります。またタトウなどにする場合には必ず印刷会社の指定のフォーマットを先にもらってそれにあわせるようにします。

### アウトラインの作成
入稿前にはアウトラインを取るというのは常識だと思いますが、実はPDF入稿の場合にはフォントがエンベッドされているのでアウトラインを取る必要がありません。ただし埋め込み禁止になっているフォントもあることにはあるので注意しましょう。


## データの作成
### ヘアラインの禁止
インク濃度が100%を切る場合に0.1mm以下の線を描こうとするとかすれます。この現象はプリンタで最小線幅に変換されてしまうため校正紙で確認が取れないことが多いです。注意しましょう。

### インク総量の注意
インクの総量の目安は320から350%程度が上限値となります。それ以上は印刷トラブルとなりやすいので注意します。

### 特色の扱い
特色はスウォッチを作成する際に決まります。スポットカラーを利用する場合は新規スウォッチの設定でカラータイプ「特色」を選ぶようにしましょう。PANTONEやDICなどのインキメーカーの特色はカラーブックがAiの中に入っているのでそれを使うと確実です。ただし当然ですが仕上がりの色は自分の目で確認すること。特色は特に画面上で似ている色味でも異なる仕上がりになりやすいので注意が必要です。

### オーバープリント
なかなか無い or 近年はオペレータの方がきちんと修正してくれるのであまり気にしなくても想像通りの仕上がりになっているかもしれませんがオーバープリントの設定には注意が必要です。例えば配置した写真の不要な部分に対して黒いオブジェクトを配置してトリミングしたつもりでも実際にはオーバープリントでリッチブラックとなってしまい間抜けなレイアウトになってしまうこともあります。そのためヌキする必要がある部分にはよく注意しましょう。

### ブレンドモードのエラー
ブレンドのモードは乗算以外使わないほうがいいです。必要なものはPs側で処理をFixしてからレイアウトに載せたほうが事故が少なくてすみます。

## データ入稿するときのマナーとして。。
運が良ければこのようなことをしなくてもきれいに刷ってくれるかもしれませんが、これくらいはちゃんとしておいたほうがゲラのやり取りも少なくて済みます。

### 必ず出力見本を添付する
必ず自分の想定している見栄えが相手と正しく共有できるように**出力見本**を添付して入稿するようにします。ただし一般のプリンタでは色の指定はもちろんできないのであくま図柄の確認にしか使えません。

### 不要なオブジェクトはすべて消す
いらないスウォッチや、オブジェクト・レイヤなどは極力削除したプレーンなファイルを入稿します。

### 画像は埋め込まず、パッケージ機能を使って確実に入稿
ひと昔前であればファイルに外部ファイルは埋め込んで入稿、すると1つのファイルが何ギガにもなるので業者さんに御社でどれくらいのファイルまで触ったことあります？？なんて聞いてましたが最近のRIPはリンクファイルでも刷れるので埋め込みの必要がありません。
パッケージ機能でリンクファイルを自動収集して確実に入稿してください。

### IllustratorのオブジェクトをコピペでIndesignに持ってこない
これが一番ずっこけ率が高い気がします。この2つのソフトの間で画面上ではオブジェクトをシームレスに移動できたように見えますが、内部的にはオブジェクトパスの形式が異なるため、再編集が制限されます。そのためIllustratorのファイルは**「配置」**を使ってデザイニングするように配慮します。

### プリフライトで最終確認を。
どれだけ慎重にデータを作っても失敗はつきもの。プリフライト機能で確認しましょう。


## 参考書籍
エディトリアルデザインする上で役に立ちそうなものを少しだけ。。
（随時更新の予定です）

* **『日本語組版入門: その構造とアルゴリズム』**向井 裕一著：比較的中級者向け。組版について学問として体系だって展開されます。特にどんな字詰めや禁則処理がどのような印象を与えるのか例を示しながら紹介している部分は組版の重要性を改めて考えさせられます。巻末にはIndesignの設定もついているので例で学んだことを実際に自分でも再現できるところがいいですね。
* **『Typographic Systems―美しい文字レイアウト、8つのシステム 』**Kimberly Elam著：学生たちの作品を通してドラフトとなるサムネイルからタイポグラフィとその配置をどう構成していくかを学ぶことができます。デザイン初心者向け。グリッドが印刷されたトレーシングペーパーを重ねることでどういうレイアウトを構成しているのかを論理立てて学ぶことができます。
【Laravel】Laravelでlaravel Mixを用いてJavaScriptを使用する方法

Laravel Mixは、PHPフレームワーク「Laravel」に同梱されているビルドツールです。
Webpackがベースになっています。

Laravel Mixを使用するにはnpmが必要になるのでまずはnodeをインストールします。

node.jsのインストール手順については、こちらの記事を参照してください。
https://www.sejuku.net/blog/72545

Laravel-Mixとwebpackをインストールする。

```
npm install laravel-mix
npm install webpack
```

「webpack.mix.js」というファイル(Laravel Mixの設定ファイル)をプロジェクトルートへ直下へ配置。

```webpack.mix.js
const mix = require('laravel-mix');
//Laravel Mixを読み込む。
mix.js('resources/js/app.js', 'public/js');
//この場合は、resources/js/app.jsをpublic/jsディレクトリ内にビルドする。
```

resources\js\app.jsにコンパイルしたいファイルを記述する。

```resources\js\app.js
require('./sample');
//app.jsと同じディレクトリのsample.jsを読み込む場合。（拡張子はつけない）
```

コンパイルの実施

```
npm run dev
```
ファイル修正を監視して、自動でコンパイル

```
npm run watch
```
bladeファイルで読み込む。（\<body>閉じタグの直上。)

```base.blade.php
    <script type="text/javascript" src="{{ asset('js/app.js') }}"></script>
  </body>
```
cloud pak for data v 3.5 のUIご紹介

2020年11月20日にGAとなった、IBM Cloud Pak for Data のログイン画面をご紹介します。

- ログイン画面
![スクリーンショット 2020-12-09 16.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/6aab3028-73fa-8554-b543-d160d33f2b55.png)


- 初回ログイン直後の画面ツアー
![スクリーンショット 2020-12-02 16.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/063ff699-2ca3-a4ca-1d61-d67fc85df687.png)

![スクリーンショット 2020-12-02 16.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/757c16e5-c1cf-40e7-e682-4dc84b2c1b86.png)

![スクリーンショット 2020-12-02 16.05.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/8e2cb1d4-aeec-b0e8-9af7-8cd9bfa3dd57.png)

![スクリーンショット 2020-12-02 16.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/dd5fab4a-ca37-e9d8-de9a-5fe2721cef52.png)

![スクリーンショット 2020-12-02 16.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/a5cc822b-0ddd-190c-52e6-759734d17f93.png)



- 画面全景
![スクリーンショット 2020-12-02 16.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/f3ad4cc5-5e17-74a1-7c1c-af6e2f80dede.png)
![スクリーンショット 2020-12-02 16.14.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/89938921-0d9a-88a9-6491-67c3435e77f4.png)
![スクリーンショット 2020-12-02 16.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/5d69f936-a072-e629-373b-ead7413d4bb7.png)
【ポートフォリオ】概要編_その1

# 1. はじめに
転職活動をするにあたり、ポートフォリオの必要性を感じたので作ることにしました。

# 2. 目的
* 自分のスキルを知ってもらうこと

# 3. 成果物について
* 時間が無いので、まずは最低限度のものを作ります。
* 余裕があったら後から機能追加とかしたいです。

### 3.1 成果物として必要な要素
まずは作る前にポートフォリオとして必要な要素を並べてみます。

* アプリケーションとして（十分な）機能があること
* インフラとしてAWSを使用していること（GCPでも可？）
* Dockerを活用していること
* チームの開発を意識していること（GituHubの利用）
* UI / UX が考えられていること
* コードの可読性が高いこと（静的解析ツールの利用もする）
* テストコードが書いてあること
* CIツールをツールを活用していること（CircleCI等）
* READMEをきちんと書く（使用技術やインフラ構成について）

### 3.2 技術選択について
どんな技術を使うかも重要らしいです。
とりあえず、あんまり古い技術だとよくないようなので流行りの技術を使ってみます。

### 3.3 やりたいこと
個人的に下記は使いたいです

* python
* SQL
* AWS か GCP

# 4. 実際に何を作るか
で、実際に何を作るか考えます。
よくあるものとしては下記ですよね。

* ブログ
* ECサイト
* 掲示板

とりあえず、ブログが一番無難でしょうか？
（ECサイトも掲示板も途中で路線変更して作れそうな気がします）


# まとめ
* エンジニアの転職活動ではポートフォリオが必要
* ポートフォリオとして必要な要素から、どんなものを作るか考えた
* まずはブログを作ってみる
[link-1]:https://qiita.com/HIDE03/items/2ce3971fe0b5e21a915a
[次回][link-1]は実際にどんなブログを作るのか考えます。


# 参考
Web系自社開発企業さんへの転職に必要なポートフォリオのレベルとは
https://www.youtube.com/watch?v=N0yetny4Zco&feature=youtu.be
採用されやすいエンジニアのポートフォリオの作り方
https://www.youtube.com/watch?v=1PczgGb6SV8&feature=youtu.be
PHP製デプロイツール Deployer v7beta を試す 接続編

## はじめに

[PHP製デプロイツール Deployer v7beta を試す init編](https://qiita.com/HRS_O/items/5b9e9125fb6a0814a070)の続き


## 接続先の設定

- hostnameや鍵は便宜上example.comにしているので適宜読み替え
  - 実際はEC2につないでます

### ファイルツリー

```
/path/to/project
├─deployer
│  ├─hosts.php
│  └─hosts.yaml
└─deploy.php
```

```php:deploy.php
<?php

namespace Deployer;

import('deployer/hosts.php');
import('deployer/hosts.yaml');

task('dep:pwd', function () {
    cd(get('deploy_path'));
    writeln(run('pwd'));
});
```

```php:deployer/hosts.php
<?php

namespace Deployer;

host('dev1')
    ->setHostname('example.com')
    ->setRemoteUser("ec2-user")
    ->setIdentityFile("~/.ssh/example.com.pem")
    ->setDeployPath('/tmp/deployer/dev1');
```

```yaml:deployer/hosts.yaml
hosts:
  dev_base: &dev_base
    hostname: example.com
    remote_user: ec2-user
    identity_file: ~/.ssh/example.com.pem
  dev2:
    <<: *dev_base
    deploy_path: '/tmp/deployer/dev2'
  dev3:
    <<: *dev_base
    deploy_path: '/tmp/deployer/dev3'
```

## タスクの実行

- 事前に接続先で対象のディレクトリは作成済み

### dev1向けを実行（hostはphpに定義）

```sh
$ dep dep:pwd dev1
task dep:pwd
[dev1] /tmp/deployer/dev1
```

### dev2向けを実行（hostはyamlに定義）

```
$ dep dep:pwd dev2
task dep:pwd
[dev2] /tmp/deployer/dev2
```

### dev3向けを実行（hostはyamlに定義）

```
$ dep dep:pwd dev3
task dep:pwd
[dev3] /tmp/deployer/dev3
```

## まとめ

- ちゃんと対応していけばsshでの接続まではいけた
- 思ったほどバージョンアップは怖くない

### ぱっと思う主に変わった点

- initでyamlとphpを選べるようになった
- hosts周り(旧inventory)の定義をyamlで行う場合の記述方法
NimでWindowsのHDD（SSD）の容量とかを取得してみる

## はじめに
Windows人気無いですね。
WSL2が導入されて、Windows1台でWindowsOSとLinuxOSを同時に動かせるので、私は好きです。
開発OSはやはりLinuxだけど、普段遣いはWindowsが一番幅が広く使えるので個人的には推してます。

なので、今回はWindowsのHDDの情報を情報を取得するコードをNimで書いていきます（ゴリ押し

## コード
https://github.com/nnahito/nim-windows-disks/blob/main/main.nim


## 所管とか
Win32API。
古より蓄積されたWindowsでプログラムを動かすためのWindows用の関数群ですね。
これらを駆使してHDDの情報を取得します。

---

Windowsのドライブの種類。
これ、今はどうなってんだろ？
もっと増えてそう。

```nim
# ドライブの種類情報
const DRIVE_TYPE = [
    "不明なディスク", "無効なパス", "リムーバブル", "固定ドライブ",
    "リモートドライブ", "CD/DVDドライブ", "RAMディスク"
]
```
ぱく…参考にさせていただきました：https://ameblo.jp/sgl00044/entry-12539137844.html


---

```nim
for nDrive in 0..25:        # ドライブは26個まで（A～Z）
```

これ、自信ないです。
まーでも、そういうことなんだろうなーと思って、こう認識しました。
ぱくっ…参考にさせていただきました：https://blog.goo.ne.jp/masaki_goo_2006/e/243664c01d35f678cffbc74345c530bc

---

```nim
var lpRootPathName = char(driveIdentifier) & ":\\\\"
# バックスラッシュ2つで1つのバックスラッシュになる（エスケープが必要だから）
```

これ、めんどいですよね。
Windowsで嫌いな部分です。

な～んでバックスラッシュにしたのかね。


---

```nim
# ドライブ識別名（ドライブタイプ）: 利用可能容量 / 全体の容量
echo char(driveIdentifier) & "ドライブ（" & DRIVE_TYPE[driveTypeId] & "）: " & $lpFreeBytesAvailableToCaller.QuadPart & " / " & $lpTotalNumberOfBytes.QuadPart
```

このへんは、
https://blog.goo.ne.jp/masaki_goo_2006/e/cc2488afb0b9cc958e755d50c60142a7
を参考にさせていただくといい感じになりそう（やってない）

---

こんな感じでしょうか。
Windowsの情報を取得するのって結構面倒ですね。

NimでWindowsのCPU使用率を求めたこともあるので、興味があればどうぞ
https://qiita.com/nnahito/items/adc9642c9b76347aa267
二分法をC言語とPythonで実現

#修正ログ
##2020/12/09 21:00
初期値-100,100(x_start1,x_start2)が不適なので
初期値-55,36(x_start1,x_start2)に変更
漢数字の二分法が正しそう。
@fujitanozomu さん、ご教授ありがとうございます。

##2020/12/10 21:00
計算時間と試行回数を表示するように変更
なんか初期値-55,36だと無限ループ入ってしまいますね。
-100,100に戻す。
#はじめに
```math
f(x) = x^{2} - b \ \ \ \  (b>0)\\
f(x) = 0 \ \ を求めましょう
```

##メモ
abs->int
labs->long
fabs->float,double

##作成経緯
学校の課題で課されました。

~~2分法？二分法？正しいのはどっちですか。~~

とりあえず、動くプログラムが完成。
C言語もPython3系も動く。

##C言語で2分法を実装
gcc -o xxx xxx.c -lmでコンパイル
./xxxで実行

```C:bisection_method.c

#include <stdio.h>
#include <math.h>
#define eps 1.0e-9

double fx(double x,double b);

int main(void)
{
  double x_start1 = -100.0;
  double x_start2 = 100.0;
  double center = 0.0;
  double start = x_start1;
  double end = x_start2;
  double err=100;
  double b=64,c,cc=0.0,tmp,gosa;
  int count = 1;
  //printf("bの値を入力(b>0)--->");
  //scanf("%lf",&b);
  while(err > eps)
  {
    c = (start+end)/2;
    tmp = fx(c,b);
    gosa = fabs(cc-c);
    cc = c;
    err = tmp*tmp;
    if (tmp > 0)
    {
      end = c;
    }
    else
    {
      start = c;
    }
    printf("%d %17.15f %17.15f\n",count,c,gosa);
    count++;
  }
  printf("result:%22.15f\n",c);
}
double fx(double x , double b)
{
  return pow(x,2) - b;
}

```

##Pythonで実装
Python 3.8.5
math.powって書きたくないので、pow関数は自作です。
0エラーの処理はなくても動きます。
普通に書けばいいんですけどね...
誤差計算はC言語のみ。

```Python3:bisection_method.py
# -*- coding: utf-8 -*-
import math
import time

EPS = 1.0e-20

def pow(a,b):
    if a == 0:
        return 0
    else:
        return math.pow(a,b)

def fx(x,b):
    return pow(x,2) - b

x_start1 = -55
x_start2 = 36
start = x_start1
end = x_start2
err = 100
count = 1
b = float(input("bの値を入力--->"))
bm_start = time.time()
while err > EPS:
    c = (start+end)/2
    tmp = fx(c,b)
    err = pow(tmp,2)
    if tmp > 0:
        end = c
    else:
        start = c
    print(count," ",c)
    count = count + 1
bm_end = time.time()
print("result--->",c)
print("試行回数--->",count)
print("計算時間--->",bm_end-bm_start)
```

#結果
有効桁整形は後で。

```
Python3-二分法
試行回数---> 45 [回]
計算時間---> 0.002999544143676758 [sec]
Python3-ニュートン法
試行回数---> 9 [回]
計算時間---> 0.0009992122650146484 [sec]
```
【GCP】環境変数「GOOGLE_APPLICATION_CREDENTIALS」の設定でエラーが発生する



# GCPを使うにあたって環境変数設定でエラーが発生

GCPを使うにあたって設定する環境変数「`GOOGLE_APPLICATION_CREDENTIALS`」の設定でエラーが発生した
その際に行った解決方法の走り書き程度のメモ

※実行環境はWindows10です

# 環境変数「GOOGLE_APPLICATION_CREDENTIALS」の設定

Windows10なのでコマンドプロンプト

```cmd
set GOOGLE_APPLICATION_CREDENTIALS=C:\tools\gcp\my-key.json
```

or

Powershell から実行

```powershell
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\tools\gcp\my-key.json"
```

環境変数の設定後にGCPに接続する処理の実行すると

```
例外がスローされました: 'System.InvalidOperationException' (mscorlib.dll の中)
Error cannot dispatch message:System.InvalidOperationException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
   場所 Google.Apis.Auth.OAuth2.DefaultCredentialProvider.<CreateDefaultCredentialAsync>d__11.MoveNext() 場所 C:\Apiary\2020-11-11.14-48-36\Src\Support\Google.Apis.Auth\OAuth2\DefaultCredentialProvider.cs:行 142
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
```

というエラーが発生

# 解決時の方法

PowerShellから`gcloud auth application-default login`コマンドを実行するとブラウザでログイン認証しろと要求されるので従う

```
PS C:\Users\sola> gcloud auth application-default login

The environment variable [GOOGLE_APPLICATION_CREDENTIALS] is set to:
  [C:\tools\gcp\my-key.json]
Credentials will still be generated to the default location:
  [C:\Users\sola\AppData\Roaming\gcloud\application_default_credentials.json]
To use these credentials, unset this environment variable before
running your application.

Do you want to continue (Y/n)?  Y

Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?client_id=******************************************



Credentials saved to file: [C:\Users\sola\AppData\Roaming\gcloud\application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).
C:\Users\sola\AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\..\lib\third_party\google\auth\_default.py:69: UserWarning: Your application has authenticated using end user credentials from Google Cloud SDK without a quota project. You might receive a "quota exceeded" or "API not enabled" error. We recommend you rerun `gcloud auth application-default login` and make sure a quota project is added. Or you can use service accounts instead. For more information about service accounts, see https://cloud.google.com/docs/authentication/
  warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)

Quota project "test-pj" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.


Updates are available for some Cloud SDK components.  To install them,
please run:
  $ gcloud components update
```

これで上記のエラーが発生しなくなった
【Rust】serdeでXMLへserializeする話

## はじめに
[ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 10日目を担当します[@ryosukeeeee](https://qiita.com/ryosukeeeee)です。

RustでJSONのserialize/deserializeするときは[serde](https://crates.io/crates/serde)と[serde_json](https://crates.io/crates/serde_json)を使うのが一般的です。少なくとも私の観測範囲では。
ある日、モックサーバをRust書いていたのですがXMLをserializeする必要に迫られました。
[serde-xml-rs](https://crates.io/crates/serde-xml-rs)というcrateが見つかったのですが、ハマったところがあったので記事にしました。

## サンプル1
[Using derive · Serde](https://serde.rs/derive.html)のコードをXML版に置き換えたコードを載せます。

### コード

```rust
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename = "root")]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let point = Point { x: 1, y: 2 };

    let serialized = serde_xml_rs::to_string(&point).unwrap();
    println!("serialized = {}", serialized);

    let deserialized: Point = serde_xml_rs::from_str("<root><x>3</x><y>4</y></root>").unwrap();
    println!("deserialized = {:?}", deserialized);
}
```

### 実行結果

```sh 
$ cargo run
serialized = <root><x>1</x><y>2</y></root>
deserialized = Point { x: 3, y: 4 }
```

## ハマったところ
執筆時点での最新バージョン（0.4.0）ではVec型のserializeには対応していません。
試しに、サンプル2のようにVec型をもつ構造体Teamのserializeを実行してみました。

## サンプル2

### コード

```Rust
use serde::Serialize;

#[derive(Serialize)]
#[serde(rename = "team")]
struct Team {
    people: Vec<Person>,
}

#[derive(Serialize)]
#[serde(rename = "person")]
struct Person {
    name: String,
}

impl Person {
    fn new(name: &str) -> Person {
        Person {
            name: name.to_string(),
        }
    }
}

fn main() {
    let team = Team {
        people: vec![Person::new("Joe"), Person::new("Jane")],
    };

    let serialized = serde_xml_rs::to_string(&team).unwrap();
    println!("serialized = {}", serialized);
}
```

### 実行結果

```sh
$ cargo run
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: UnsupportedOperation { operation: "serialize_seq" }', src/main.rs:28:53
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
```

`unwrap()`の処理でpanicしています。

[serde-xml-rs](https://github.com/RReverser/serde-xml-rs)のリポジトリをみてみると、Vec型へ対応したPRが複数提案されています。
ここでは[Support seq and maps (refactor of #129) by adrianbenavides · Pull Request #142](https://github.com/RReverser/serde-xml-rs/pull/142)を使ってみましょう。

Cargo.tomlのdependenciesで↓のように指定します。

```toml
[dependencies]
serde-xml-rs =  { git = "https://github.com/adrianbenavides/serde-xml-rs.git", rev = "fc2d35e5e2d08c4e8c8dee13449ff3ce98de46c1" }
```

なお、deserializeには対応していないようです。

### 実行結果

```sh
$ cargo run
serialized = <team><people><person><name>Joe</name></person><person><name>Jane</name></person></people></team>
```

めでたくserialize出来ました🚀

## 最後に



[ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 明日の11日目は、 [@fasahina](https://qiita.com/fasahina) さんです！お楽しみに🎉
今更だけどObjective-Cでもvarとか使いたいぜ

##はじめに
いまだにObjective-Cを使ってます。
なぜって１１年前にリリースしたアプリをまだメンテナンスしてるから。
[iOSソリティアV](http://itunes.apple.com/jp/app/soritiav/id341532096?mt=8)


悲しいです。:sob:

しかし結構稼いでくれるので、我慢。
##やり方

Objective-Cでも最近は__auto_typeという型推論の機能があり、それを使う。
GCCの文法拡張なのかな。気にしないけど。

```obj-c
#define var __auto_type
```

なのをどこかに定義しておいて、

```obj-c
    var bounds = xxController.backView.bounds;
    if (bounds.size.width<bounds.size.height){
        ...
    }
```
ちゃんと使えます。素敵すぎる。:grin:

```obj-c
    NSArray*list = ...;
    var item = (NSNumber*)list[1];
```
NSArrayとかの時はキャストして使う。

```obj-c
    NSArray<NSNumber*>*list = ...;
    var item = list[1];
    if (item.boolValue){        
        //...
    }
```
xcode12だと以前はできなかった、これもOK！
今試してよかった。
しかしブロック構文変数の定義とかには使えない・・・と思ったらxcode12ではできる。やった:v:

```objc
    var r = ^(){
        ...
    };
    r();
```


##最後に
Objective-CのNS標準クラス名、長ったらしいのが多いので、これ使うと結構幸せ:blush:
ソースの文字数も減るので、見やすくなる。

今回も手抜き記事。

以上！！！
【Android】アプリ内課金のテストはデバッグビルドでもできた

###はじめに
Androidアプリに課金機能のテストってベータとか内部テストにアップロードしなきゃできないと思っていたんですが、GooglePlayBillingLibraryのバージョン3.0.0以降(?)ではデバッグ署名でもできるみたいです(常識なんですかね？)。
普通に調べても最新の情報が少なくて、みんな変更の度にいちいちアップロードしてるもんだと思っていました。
ただ、課金アイテム自体は一度でもGooglePlayにアップしていないと作成できないので、Googleが用意しているテスト用の課金アイテム(android.test.purchasedなど)を使う(定期購入テストでは使えない)か、ライブラリを追加したAPKを適当にアップロードしとく必要はあります。

###やり方
[公式ドキュメント](https://developer.android.com/google/play/billing/test?hl=ja)にちゃんと書いてあるので見てみます。
![コメント 2020-12-07 172417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637123/adb4ce91-13d5-9618-d973-73b416dcab2a.png)

>通常、GooglePlayBillingLibraryは、未署名でGoogle Playにアップロードされていないアプリに対してはブロックされます。ライセンステスターはこのチェックを回避できます。**つまり、デバッグ署名を持つデバッグビルドを使用しているアプリであっても、新しいバージョンのアプリをアップロードすることなく、テスト用にアプリをサイドローディングできます。**ただし、パッケージ名は、GooglePlay用に構成されたアプリのパッケージ名と一致する必要があります。また、Googleアカウントは、GooglePlayConsoleアカウントのライセンス テスターでなければなりません。

これによるとPlayConsoleでライセンステスターに登録したGoogleアカウントでデバッグすると課金テストができるようです。

#####ライセンステスターに登録
これはPlayConsoleでやります。PlayConsoleの仕様もコロコロ変わるので2020年12月時点のやり方を書いておきます。
![コメント 2020-12-07 180550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637123/0f336034-f4ed-17d8-69ab-3eb657d12822.png)

ライセンステスターはアプリごとではなくアカウント単位で設定します。
「設定」→「ライセンステスト」でテストアカウントのGmailアドレスを追加するだけです。
ここも微妙に分かりづらいのですが「ライセンステスターを追加」にメールアドレスを入力したら、エンターを押す必要があります。すると「ライセンステスター」の欄に追加されます。

これだけで運が良ければデバッグビルドでも課金テストができます。くれぐれも**「テスト用の支払い」であることを確認**した上で購入してください。
運が悪ければエラーで購入できません。
運悪くエラーが出てしまった場合は、以下を確認します。
![コメント 2020-12-07 182417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637123/d001754c-ade7-b2f5-4d4c-015523708b4b.png)

>購入を行っているアカウントは、購入のダイアログを展開することで確認できます。次の点にご注意ください。
・テストアカウントは、テスターのAndroidデバイス上に存在する必要があります。
・デバイスに複数のアカウントがある場合、アプリをダウンロードしたアカウントで購入が行われます。
・いずれのアカウントでもアプリをダウンロードしていない場合は、最初のアカウントで購入が行われます。

日本語がなんかよく伝わってこない箇条書き３つは恐らくこういう意味です。

+ ライセンステスターに登録したGoogleアカウントをデバッグ端末に追加しておけ(当たり前)
+ デバッグビルドではアプリのダウンロードはできないので該当しないはず(多分)
+ デバッグビルドで端末に複数アカウントがある場合、**端末に最初に登録した**アカウントで購入が行われる(は？)

問題は恐らく３つ目で、デバッグ用端末にアカウントを複数登録していて、先のライセンステスターにその内の一つ(開発用アカウントなど)しか登録しなかった方は、引っ掛かってしまう可能性大です。
私はこの「最初のアカウントで購入が行われます」の意味が分からず混乱してました。

端末に一番最初に登録したアカウントが分かっていれば、それをライセンステスターに登録する必要があります。
どうしても別のアカウントでテストしたい場合は他のアカウントを端末から削除するか、ベータテストなどを利用するほかありません。
一番手っ取り早いのはデバッグ端末にあるアカウントを全てライセンステスターに登録してしまうことです。

###おわり
条件を満たせばデバッグビルドでも課金テストができることがわかりました。
PRML　演習問題 8.23（標準）　解答

## はじめに
本記事は, 機械学習の教科書の決定版ともいえる, **Christopher Bishop先生**による[**『Pattern Recognition and Machine Learning （パターン認識と機械学習）』**]  (https://www.microsoft.com/en-us/research/people/cmbishop/prml-book/) , 通称**PRML**の演習問題のうち, 私が解いた問題の解答を記したものです. これは, 私の所属する[生物測定学研究室] (https://www.ut-biomet.org/) の輪読会で**PRML**を取り扱っており, その勉強の一環として演習問題を解いたときのものです. なお, 他の演習問題の解答例に関する記事については, [PRML　演習問題　解答集　まとめ]  (https://qiita.com/Lab_of_Biomet/items/15e38ca34fafa8176d89) をご覧ください.
 

## 問題
8.4.4節において, 因子グラフの変数ノード $x _ { i }$ 上の周辺分布 $p \left ( x _ { i } \right )$ が, 隣接因子ノードからこのノードに伝わるメッセージの積として 

``` math
\begin{align*}
p(x) &=\prod_{s \in \operatorname{ne}(x)}\left[\sum_{X_{s}} F_{s}\left(x, X_{s}\right)\right] \\
&=\prod_{s \in \operatorname{ne}(x)} \mu_{f_{s} \rightarrow x}(x)
\tag{8.63}
\end{align*}
```

の形で与えられることを示した. $x _ { i }$ に接続するリンクを $1$ つ選んだとする. 周辺分布 $p \left ( x _ { i } \right )$ はこの $1$ つのリンクに沿って入ってくるメッセージと同じリンクに沿って出ていくメッセージの積として書くこともできることを示せ.

## 解答
この問題の方針としては, 周辺分布 $p \left ( x _ { i } \right )$ がどのように分解できているかを考えていきましょう. すなわち, その分解が入ってくるメッセージと出ていくメッセージになるような分解を考えればいい, ということになりますね.
したがって, まず $\left ( 8.63 \right )$ 式を分解し, その後変数ノードから因子ノードへの出力についての

``` math
\begin{align*}
\mu_{x_{m} \rightarrow f_{s}}\left(x_{m}\right) &=\prod_{l \in \operatorname{ne}\left(x_{m}\right) \backslash f_{s}}\left[\sum_{X_{l m}} F_{l}\left(x_{m}, X_{l m}\right)\right] \\
&=\prod_{l \in \operatorname{ne}\left(x_{m}\right) \backslash f_{s}} \mu_{f_{l} \rightarrow x_{m}}\left(x_{m}\right)
\tag{8.69}
\end{align*}
```
の適用を考えればよい, ということになります.
すなわち, $x _ { i }$ に接続するリンクを $f_{s}$ とすると, 

``` math
\begin{align*}
p\left(x_{i}\right) &=\prod_{s \in \operatorname{ne}\left(x_{i}\right)} \mu_{f_{s} \rightarrow x_{i}}\left(x_{i}\right) \\
&=\mu_{f_{s} \rightarrow x_{i}}\left(x_{i}\right) \prod_{t \in \operatorname{ne}\left(x_{i}\right) \backslash f_{s}} \mu_{f_{t} \rightarrow x_{i}}\left(x_{i}\right) \\
&=\mu_{f_{s} \rightarrow x_{i}}\left(x_{i}\right) \mu_{x_{i} \rightarrow f_{s}}\left(x_{i}\right)
\tag{8.23.1}
\end{align*}
```

のように分解できるため, 「周辺分布 $p \left ( x _ { i } \right )$ はこの $1$ つのリンクに沿って入ってくるメッセージと同じリンクに沿って出ていくメッセージの積として書くこともできる」ことを示すことができました.
dockerのredmineインストールとプラグインの導入

**redmineインストール：**

イメージ取得：

```
$ docker pull redmine 
```
イメージ実行：
ローカルの80ポートに投げる場合：

```
$ docker run -d -p 80:3000
```
ブラウザで(http://0.0.0.0:80) redmineを開くる

**docker ps**で実行状況を確認できる。

redmineの中に入る：

```
$ docker exec -it [CONTAINER ID ] bash 
```

**プラグインの導入(redmine_slack):**

まず、redmineの中に入る

```
$ docker exec -it [CONTAINER ID ] bash 
```

slackをダウンロードする

```
# cd /usr/src/redmine/plugins
# git clone https://github.com/sciyoshi/redmine-slack.git plugins/redmine_slack
```

bundleについての設定：

```
# bundle update
# bundle install
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
# exit
```

redmineコンテナーを再起動する：

```
$ docker restart [CONTAINER ID ]
```

redmineのプラグインの画面を開く
[管理]→[プラグイン]

(以下のリンクで開く可能)

```
http://0.0.0.0/admin/plugins
```
ZOZOTOWNの画像から、コーデの参考になる全身画像を機械学習で抽出する試み。

# 概要
ZOZOTOWNの商品画像には、**商品のみの画像**と**コーデの画像**があります。
これらの画像から全身が写ったコーデ画像のみを抽出したくなったため、MLを利用して試してみました。

| 商品のみの画像　| コーデ画像 |
|:-:|:-:|
| ![54033586b_8_d_500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146971/3cc1647a-994f-cfcf-b404-4c635c19f57a.jpeg)  |  ![54033586b_b_06_500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146971/d442798f-b002-6451-33d9-0129117fd29d.jpeg) |


# 必要要件
**コーデ画像として使える全身画像　＝　首と足が含まれている画像**
と考えました。

# 検討した手法
### 1.オブジェクト検出
オブジェクト検出は、画像の中に何があるのかを検出する手法です。（例：人間、車、犬、洋服など）
この手法を最初に検討しました。しかし人間や犬などのレベルでの検出はできるのですが、首や足などのレベルでの検出はできませんでした。そのため、別の手法を検討しました。（転移学習という方法を使って、このモデルを首や足などを検出できるように学習し直すことでも可能かと思われますが、それよりも効率的に使える手法を検討しました。）

ちなみにこの手法は、AWS Rekognitionで簡単に利用することができます。

#### [AWS Rekognition](https://aws.amazon.com/jp/rekognition/)
APIでMLを使った様々な画像処理を行えるサービスです。
1000枚/1$なので、まず試してみるという時に便利です。
![画面収録 2020-12-09 15.05.48.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146971/d1979dee-bd3e-c6d9-6164-2151083a5b87.gif)

### 2.姿勢推定
各関節を検出することで、画像や動画に写った人の姿勢を推定することができる機能です。
簡単に人の動きをモデル化できるので、ダンス動画の解析などに使われます。
首と足の関節が写っている場合に、コーデ画像であると判定するようにすれば使えそうです。

#### [OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
ボトムダウン型で姿勢推定ができるライブラリです。（[トップダウンとボトムダウンの説明はこちら](https://www.macnica.co.jp/business/ai_iot/columns/134298/)）
![openpose-sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146971/f74b895c-1c1f-3e67-4e64-e84e67542eab.gif)

# （追記）記事にいただいたご意見から調べたこと
### オブジェクト検出の転移学習によって体の部位を検出できないか？
調べてみましたが、基本的には人間の体の部位は動画や深度情報を活用していました。
[Fast Detection and Modeling of Human-Body Parts from Monocular Video](https://link.springer.com/chapter/10.1007/978-3-540-70517-8_37)
[Real-time Identification and Localization of Body Parts from Depth Images](http://ai.stanford.edu/~varung/plagemann10icra.pdf)

実際に物体検出から、顔を認識する転移学習を行なっているものはありました。
[Keras-SSDで転移学習－顔検出－](https://qiita.com/chicken_data_analyst/items/f05c345e6a090bd3ee7f)
ただその他の体の部位の情報は多くないので、あまり有効な方法ではないかもしれません。（AWS Rekognitionで今度試してみたいと思います。）（そもそも姿勢検出でできるので、頑張る必要はないですが。）


### 姿勢推定の弱い部分
やはり向きや画像の範囲によっては、姿勢を検出できない場所があるようです
https://qiita.com/baba5246/items/7ed50689c67c0ad3882d






# 展望
実際にサーバーを動かす際の要求仕様を考えてみました
1. 複数の画像のURL（もしくは画像？）をサービスに送る
2. その中からコーデ画像のみを返す

[参考になりそうなAWSのページ](https://aws.amazon.com/jp/blogs/machine-learning/deploying-tensorflow-openpose-on-aws-inferentia-based-inf1-instances-for-significant-price-performance-improvements/)
【MSSQL】MSSqlでのツリー検索

OracleのユーザーさんはStart With Connect byというQueryを使用し、簡単にツリー検索をすることが可能です。
このような機能をMSSqlで実装するためには再帰検索を利用する必要があります。
再帰検索はWith CTE_TABLEとUnion AllというQueryを使用します。
再帰検索はRootNodeを検索した結果にRootNodeをParentとして持っているNodeの検索結果をUnion Allします。
次は検索されたNodeがParentとなり検索した結果をUnion Allし、このような作業を繰り返すことでツリー検索を実現可能にします。
例は下のQueryを参照してください。

```

WITH CTE_TABLE(assy_key, assy_name, assy_parent, assy_level, assy_group) AS (
 SELECT 
     A.assy_key
   , A.assy_name
   , A.assy_parent
   , A.assy_level
   , 1 assy_group
 FROM massembly A
 WHERE A.assy_level = 1
 UNION ALL
 SELECT 
     B.assy_key
   , B.assy_name
   , B.assy_parent
   , B.assy_level
   , C.assy_group + 1
 FROM massembly B
 INNER JOIN CTE_TABLE C ON C.assy_name = B.assy_parent
 WHERE B.assy_name IS NOT NULL
)
SELECT * FROM CTE_TABLE CTE ORDER BY assy_group

```
この例はassy_nameをNodeとして再帰検索を行いました。
assy_group検索結果より、RootNodeから現NodeまでのDepthを知ることができます。
jqueryでスライダーを作る(メモ)

#メモ
jqueryを使って対象の要素の位置の数値を変更します。スライダーを閉じる時と開く時にクラス名を追加・削除するようにします。

```slider.html
<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <style type="text/css">
      body{
        margin: 0px;
      }
      #container{
        position: relative;
      }
      .slider{
        position: absolute;
        left: -250px;
        width: 300px;
        height: 500px;
        background-color: brown;
        border: 5px solid;
        border-color: red purple;
      }
    </style>
  </head>
  <body>
    <div id="container"></div>
    <script>
      //declare slider template
      var elem = {
        template: '<div class = "slider slider-close"></div>'
      };
      
      //set slider to container
      $('#container').html(elem.template);
      
      //set element to be manipulate
      var target = '.slider';
      
      //declare function to open and close slider by adding and removing class name
      var slider = function (){
        //open slider
        if($(target).hasClass('slider-close')){
          $(target).addClass('slider-open');
          $(target).animate({left: 0});
          $(target).removeClass('slider-close');
        }
        //close slider
        else if($(target).hasClass('slider-open')){
          $(target).addClass('slider-close');
          $(target).animate({left: -250});
          $(target).removeClass('slider-open');
        }
      }
      
      //change position of slider when click event is detected
      $(target).click(slider);
      
    </script>
  </body>
</html>

```
任意のブランチとの差分をチェックアウトする

## チェックアウトしたいファイル名を特定

`--name-only` オプションをつけるとファイル名だけを出力してくれる。

```
git diff upstream/develop --name-only
```

### 任意のブランチのファイルをチェックアウト

```
git checkout upstream/feature-branch-name -- app/src/file.ts
```
awkを日常使いするとちょっと便利

# はじめに
仕事柄とてつもなく大きなCSVファイルを触ることがあります。たとえば毎時刻の状態値をCSVに格納したデータが10年分あって、それを変化のわかりやすいグラフに書き直すためにデータを間引くような作業がしょっちゅうあります。

とはいっても作業環境が標準的なWindowsパソコンで新しいソフトのインストールが出来ないようなシーンでは手作業でやらなければならないという非効率な業務フローだったため、awkを利用した短縮テクの記事をまとめることにしました。

## インストール
もちろん生のWindowsのシステムではawkを利用することはできません。そこで[gawk](http://gnuwin32.sourceforge.net/packages/gawk.htm)からダウンロードします。または最近は[BusyBox](https://busybox.net/about.html)などがあるのでこちらでコマンド群を一括インストールしてもいいかもしれません。そのあたりはお好みで。


もちろん環境パスが通っているWindowsフォルダにおいてもいいのですが、あまりシステムを汚したくないのでProgram Fileに他のアプリケーション同様おいておき、そこに対してパスを通しておくのがいいのではないでしょうか。

## awkって何よ
awkはsedやgrepと並んでLinuxなどのUNIX系システムでは頻繁に用いられるコマンドの一つです。sedが文字列の置換、grepが文字列の検索などに使われるのに対して、awkはもっと突っ込んだテキストパターンマッチングで用いられます。

### 行を抜き出そう
手始めによくありそうなシチュエーションの、CSVファイルから必要な行だけ取り出すのをやってみます。[^1]ただしawkはテキストファイルしか扱うことができませんので、Excelファイルなどは扱うことができません。その場合はPythonなどを持ち出したほうが手っ取り早いでしょう。

``` bat
gawk /01:00/'{print $0}' test.csv
```
このコマンドを実行することで1:00のデータのみを取り出すことができます。しかも爆速。
それでは次です。

### 列の抜き出し
行を取り出すことができたら次は行ですよね。

``` bat
gawk '{print $1}' test.csv
```

おそらくこの記事を読まれるような方であれば常識かもしれませんが、シングルクォーテーションで途中囲んでいるのはオプションに半角スペースを含んでいるからです。念の為。
さて、この行の抜き出しですが、抜き出すだけではなく四則演算もすることができます。

``` bat
gawk '{print $1+$2}' test.csv
```

### 偶数列のみの抜き出し
このあたりまでが基本動作です。思ったより全然難しくないですよね？それではもうちょっと複雑なことやってみます。

``` bat
gawk 'NR % 2 == 0 {print $0}' test.csv
```
これは最初に出てきた行の抜き出しの応用です。先程は行、つまりレコードを１つずつ調べていってデータを抜き出したわけですが、今度はNRという組み込み変数に四則演算を駆使して抜き出しました。とはいってもExcelの表でRow関数とMod関数を使いながらフィルタリングしたのと大差はないわけですが、どちらが見た目や考え方がスッキリしているかというとその差は歴然です。

組み込み変数については[こちら](http://itref.fc2web.com/unix/awk.html)の記事が詳しいです。

## 最後に
大きな帳票データの整理の作業は多かれ少なかれどの職種でもしている作業だと思いますが、このあたりをスムーズかつスマートにしようとするとPandasやその他のデータベース管理ソフトを使いたくなります。確かにawkではExcel同様欠損値の補間やクレンジングといった作業は自動でしてくれないわけですが、データの整理の作業をコマンドラインで「誰がやっても、同じ結果を、高速で得られる」というメリットはかなり魅力的なのではないでしょうか。

それでは良いawkライフを。




[^1]: 日常的にデータベースに慣れている方だと列と行について選択と射影と表現したほうがわかりがいいのかもしれませんが、今回は列と行というExcel的表現で進めます。