OmniAICreator/Qiita-1.07M huggingface dataset:
さくっと分析環境構築

# 欲しい分析環境
AzureVM上にdockerでpostgre日本語環境を立ち上げる。
だいぶ簡単になったが、半年やらなかったら忘れそうなので備忘録に。
GPU使うDeepLearningとか以外はだいたいこの環境でなんとかなる。

### [Azure data science vm for Linux](https://azuremarketplace.microsoft.com/ja-jp/marketplace/apps/microsoft-ads.linux-data-science-vm-ubuntu?tab=Overview)

+ Microsoft R Server Developer エディションと Microsoft R Open
+ Anaconda Python ディストリビューション (バージョン 2.7 および 3.5)
+ JuliaPro
+ スタンドアロン Spark インスタンスと単一ノードの Hadoop (HDFS、Yarn)
+ JupyterHub - R、Python、PySpark、Julia カーネルをサポート
+ Vowpal Wabbit
+ XGBoost, LightGBM
+ 開発ツールとエディター (RStudio、PyCharm、IntelliJ、Emacs、vim)

### [postgres日本語環境]((https://www.slideshare.net/kkida85/postgresql-64878131))
分析用にSQL環境が欲しかった。ただし、日本語が混じったデータだったのが少し面倒。


# HOW TO
### VMの立ち上げ
MacketPlaceのDatascience用Imageからさくっとデプロイ
細かい構成は省略。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206421/9c6a8a0d-ff8f-dcfe-af0f-3d284b498928.png)


### Ubuntuのlocaleを日本語へ
```sh

sudo locale-gen ja_JP.UTF-8
sudo /usr/sbin/update-locale LANG=ja_JP.UTF-8
```
そして再度ログインでlocaleがja_JP.UTF-8になっています。

### docker-composeのインストール

```sh
curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# バイナリに対して実行権限を追加
chmod +x /usr/local/bin/docker-compose
```

### Dockerfile作成
適当なディレクトリにDockerfileとcomposeファイルを作成する。

```dockerfile:Dockerfile

FROM postgres:latest
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
```

```yaml:docker-compose.yaml
version: '2'
services:
  db:
    image: db
    volumes:
      - ./postgresql:/var/lib/postgresql
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: password
      POSTGRES_DB: testdb
      LANG: ja_JP.UTF-8
```

### DockerImageを作成、コンテナ起動

```sh

sudo docker build -t db
sudo docker-compose up -d
```


# 雑記
会社でVisualStudioサブスクリプションが購入していて、Azureが月6000円使えるのでAzureを使っています。
Standard DS3 v2 (4 vcpu 数、14 GB メモリ)：1時間25.65円

SQL叩ける環境ほしいな〜。おっ、やっぱクラウドサービスでてるじゃ〜〜ん。
…………………たけぇよ。

というわけで、[無料のOSSでデータ分析に向いてるというpostgresql](https://www.slideshare.net/kkida85/postgresql-64878131)を利用することに。

またデータが日本語混じりのきったねぇデータなので、ロケール変更しました。

一度頑張って普通にpostgresインストールして同環境を作ったんだけど、環境ぶっ壊して再構築する時にキレそうになり(笑)、ついにdockerを覚える機会になった。遅いよ。

いい勉強になった。dockerさまさまですわ。

# 参考
[Docker for Mac で 日本語locale設定を含む PostgreSQL を構築](https://qiita.com/kisk_tech/items/eb142b2287779e0751ee)
全ての要素が条件を満たしているか？というLINQ

俺の拙い脳みそから記憶が揮発しないように、あえて書いています。
ブログにでも書け！というご意見は謹んでスルーします。

#すぐにLINQでハマるのが、僕の悪いクセ

List&lt;string&gt; strings の中から、"a"で始まる要素があるかを判断する場合。

```c#
strings.Any(str => str.StartWith("a"));
```
これは知ってたから、すんなり解決できた。

でも、違う壁にぶちあったんだ。

#Anyでできないことってあるの？
こういう存在の有無を確認する系は、Anyさえ使えればanything OK!だと思ってた。

###次はすべて"a"で始まるか？の判断
あの時（といっても数日前）の俺は若かった。

```c#
strings.Any(str => !str.StartWith("a"));
```
「いやいや！これじゃ"a"で始まらない要素がある証明だろ！」
というのはチェッカーの言葉。かなり声は荒めで。

いやープッシュする前に自分でテストしてないんかい！って話なんですけど（笑

###答えは教えてくれないんだ
仕方なく自分の席に戻り考えること数秒。
なんだ簡単じゃん！で提出したのがこれ。

```c#
!strings.Any(str => str.StartWith("a"));
```

無言で突き返された。
そして、マネージャーに呼び出された。理由は説明するまでもないよね。また、テストせずにプッシュしたんだ。
ちなみにこれだと"a"で始まる要素がないことの証明だね。そうだね、プロテインだね。

##あれ？Anyじゃできないの？
なんとか俺のしょうもない脳みそで絞り出した結果。

```c#
!strings.Any(str => !str.StartWith("a"));
```

あれ、できたんじゃないか？？
"a"で始まらない要素が無い == 全ての要素が"a"で始まっているということ。
狂喜乱舞してプルリク！

#ただの不勉強だったという結論
こう書くんだって。

```c#
strings.All(str => str.StartWith("a"));
```

わかりやすい。。。圧倒的ッ！
[Laravel初心者向け]　いきなり技術書での勉強は辛い。。。Laravelの勉強する前にこれ見て拒否反応をなくす。

技術書で勉強できない初心者プログラマーです。
わからん単語をたくさん浴びると寝てしまうので、動画見て、もっかい動画みて、もっかい見て、ちょっと手を動かしてみて、ってしてるとだいぶ拒否反応なくなって技術書読むのが楽になります。

ってことで現在勉強中のLaravelの参考動画とチュートリアル形式の記事を載せておきます。参考にして下さい。

##まず動画
・【最短30分でできる!】Laravel5.7入門: 初心者でも簡単! ブラウザだけでLaravelを使ったWeb開発！

paizaが提供しているLaravelの動画。CRUDを超簡単に
最初の10分はpaizaクラウドの説明なので自分の環境でできる方は~~飛ばしてしまってもよいです。~~
電車移動中に1.5倍速で見るのがおすすめ。
https://www.youtube.com/watch?v=6fqE6B5NJZQ

・Learn How To Create Basic Laravel Website | Laravel 5 Tutorial | Projects In Laravel | Eduonix

1時間くらい
上の動画よりほんの少し進んだ感じの動画。sassのコンパイルとかも出てきたような。
英語なので勉強してる自分がかっこよく思えます。
何言ってるかよくわからないですが、動きを見るだけないら問題ないと思う。(多分)
https://www.youtube.com/watch?v=jnvu1GpylP0&t=230s

##チュートリアルっぽいやつ
上の動画2,3回見た後にやりました。

・Laravel 5.7で基本的なCRUDを作る

感謝しかない。このボリュームまとめてくださってありがとうございます。
外国語対応のとことかは一旦飛ばしてやりました。
https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea


##まとめ
コンテンツ作ってくださる方に感謝ですね。
これで技術書読んでも寝ずに済みます。
pythonのmatplotlibで目盛り幅自由の数直線を描く

# はじめに
pythonで目盛り幅が一定でない(対数目盛りなど)数直線を描きたかったが、

- plt.xscale('log')じゃ色々自由が効かない
- 等間隔目盛りの方法はあっても目盛り幅を変えられる方法は見つからなかった  

ということで色々こねくり回して作ってみた。

# 環境
- matplotlib         2.2.2
- python 3.7.0

# 数直線表示
実際のコードがこちら。

```python:num_line.py
import matplotlib.pyplot as plt
import numpy as np

def memori(x): # 目盛りにしたい関数
    return  round(np.exp(np.log(255)-(1-x/18)*np.log(255))/255,4)

x = [memori(_) for _ in range(19)] #目盛りの値のリスト

#画像サイズ
fig = plt.figure(figsize=(8,3),dpi=100)

#目盛りに値を表示
plt.text(x[18],0.995 , '1.8', ha = 'center', va = 'top')
plt.text(x[0],0.995 , '0', ha = 'center', va = 'top')
plt.text(x[17],0.995 , '1.7', ha = 'center', va = 'top')
plt.text(x[10],0.995 , '1', ha = 'center', va = 'top')
plt.text(x[15],0.995 , '1.5', ha = 'center', va = 'top')
plt.text(x[16],0.995 , '1.6', ha = 'center', va = 'top')

#元の軸と目盛り消し
plt.xticks(color="None")
plt.yticks(color="None")
plt.tick_params(length=0)

# プロット
plt.plot(x,np.ones(19)*max(x),marker='|',color='k')
```
↓こんな感じの数直線ができる。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/349546/e87db10b-974c-e60f-50ea-a2ea66d89825.png)

# おわりに
今後使う場面あるのか...？と思ったけど備忘録として投稿します。
hosts設定したurlをブラウザ で叩いたらhttpsにリダイレクトされてアカン

ローカル環境です。

##経験1
.devにしたらhttpsにリダイレクトされて、なんでー？ってなった。
理由は、chromeの仕様で、.dev .app はhttpsにリダイレクトされるらしい。
.localに直して解決しました。

この方が詳しいです。
https://qiita.com/lara_bell/items/f7f3c5189530090229ed

##経験2
上の経験を生かし.localで設定したのに、リダレクトくらう
原因は、gitでクローンしたシステムの.htaccessでリダイレクト設定されました。
まだ初心者なのでそこまで気が回りません。。。



##疎通確認
hostsの設定がちゃんとできてるか確認するにはpingコマンドを使うといいのかな？
ACMとELBとEC2でHTTPS

## 概要

ACM（AmazonCertificateManager） と ELB（ElasticLoadBalancer）をつかってHTTPS

## Route53の設定

ACMの認証にはDNS検証を使うのが楽そうなので、Route53経由でドメインをひけるようにする。
たとえば、ドメインをお名前.comなどで取得した場合は、以下のような設定が必要になる。
https://qiita.com/sadayuki-matsuno/items/4c371ba984d9b22b3737

## ACM設定

ACMの画面にいき、手順にそって入力していく。
途中DNS認証を選択すると、ACMが自動的にRoute53に認証に使用するCNAMEドメインをはってくれる。

サブドメインも設定可能
`hogehoge.com` と `*.hogehoge.com` の２つの証明証を発行することなどが可能。

待っていれば認証完了になる。
この時点でOKにならないときはRoute53で対象のドメインが正しく引けないなどの問題がある。

## EC2立ち上げ

ELBが参照するVMを先に作っておく。
ELBをHTTPSの終端としたかったので、VMでのHTTPは80のみ受け付ければOK

ACMを作成したリージョンと同じリージョンになるよう注意する。

セキュリティグループを一旦開放し、HTTPでインターネットからアクセスできることを確認しておく。
アクセスできなければ、HTTPサーバの設定などを確認する。

## ELB設定

立ち上げたEC2のVPCと合わせること。
リスナー設定は以下の２つを設定

- HTTP:80は同じドメインの **HTTPS** へリダイレクト
- HTTPS:443はターゲットホストの **HTTP** へ転送

ターゲットホストに先程立ち上げたEC2インスタンスを登録
ヘルスチェックはHTTP。


## Route53でAliasを設定

対象のドメインを発行
AレコードでELBにAliasをはる。
（Aliasを選択するとプルダウンとなり、ELBが選択可能になっている）

## 確認

設定したドメインから接続して問題なければOK

残処理として、セキュリティグループを堅牢にするなど。
EC2のインバウンドは、ロードバランサーのみ（またはVPC内のみ）にするなど。
雰囲気で使わない @types/react

@types/react の型定義を雰囲気で使っている皆さん、こんにちは。React コンポーネントを書くときはどの型を使い、どう書くべきか？という疑問を Twitter でお見かけし、雰囲気で使っていた私も気になったので @types/react の中身を覗いてみました。

master に入り、いよいよリリース間近な Hooks。本稿は FC(旧SFC) の話が前提です。VScode で型付けをしようとすると、似たような型が山ほど出てきて、どれを使うのが適切なのか・違いが何なのか…パッと見分かりませんね。

- ReactNode
- ReactChild
- ReactElement
- StatelessComponent
- FunctionComponent
- JSX.Element
- SFC
- FC

という訳で、こんな Props を持っているコンポーネントの各種書き方を比較、白黒ハッキリさせていきたいと思います。

```tsx
type Props = { test: 'test' }
```

# 🏆 Winners

結論からいうと、以下二つのどちらかの書き方が良さそうです。

```tsx
const MyComponentA: React.FunctionComponent<Props> = props => (<></>)
const MyComponentB: React.FC<Props> = props => (<></>)
```

引数の props に型注釈を入れていませんが、これだけで推論はちゃんと動いてくれます。定義元の `React.FunctionComponent` に`props: P & { children?: ReactNode }`が既に入っているので、プログラマー定義のP型 `type Props = { test: 'test' }` とマージしてくれます。これが勝者たる所以です。React.FC は React.FunctionComponent の定義を参照しているため、全く同じものと言えます。

```tsx
type FC<P = {}> = FunctionComponent<P>;
```

React.FunctionComponent が本流ですが、長ったらしいので、React.FC のほうが自分は好みです。つぎに、残念ながら良くなさそうな書き方を紹介します。


# 🙅‍♀️ children? を自前で入れる必要アリ

基本的に推論に頼りたい派なので、今まで自分はこの書き方をしていました。render children が必要な度、`type Props`に`children?: ReactNode` を自前で注入しなければならず、やや冗長です。

```tsx
const MyComponentC = (props: Props) => (<></>)
const MyComponentD = (props: Props): JSX.Element => (<></>)
const MyComponentE = (props: Props): React.ReactElement<any> => (<></>)
```

`MyComponentC`の戻り型推論は`JSX.Element`で、`JSX` は @types/react の中で切られている namespace です。`JSX.Element` は、`React.ReactElement` を空継承しています。つまり、この3つの書き方は全く同じであり、後者二つは戻り型注釈付与の意味がない事になります。

```tsx
interface Element extends React.ReactElement<any> { }
```

# 🙅‍♂️ 型が緩い

特に困ることはないですが、`React.ReactElement` を含んだ UnionTypes なので次の書き方でもコンパイルは通ります。ReactNode や ReactChild には、FunctionComponent 以外にも色んな型が UnionTypes で入っており、コンポーネント以外の型へも、制限を緩めてしまっています。`ReactText` の実体は `string | number` です。

```tsx
// type ReactChild = ReactElement<any> | ReactText;
const MyComponentF = (props: Props): React.ReactChild => (<></>)

// type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;
const MyComponentG = (props: Props): React.ReactNode => (<></>)
```

こんなコンポーネントを作る人はいないでしょうが、コンパイルエラーを得られていないことから、間違っていることは明らかです。

```tsx
const MyComponentF = (props: Props): React.ReactChild => (0)
const MyComponentG = (props: Props): React.ReactNode => (null)
```

# 😭 そもそも deprecated

> @deprecated as of recent React versions, function components can no longer be considered 'stateless'. Please use `FunctionComponent` instead. @see [React Hooks](https://reactjs.org/docs/hooks-intro.html)


だそうです。Hooks の影響をもろに受けている…。この書き方をしていたら、気分が向いた時に書き換えましょう。

```tsx
const MyComponentH: React.StatelessComponent<Props> = props => (<></>)
const MyComponentI: React.SFC<Props> = props => (<></>)
```

ちなみに、この二つどちらも`React.FC`と同様に、`React.FunctionComponent`のエイリアスでしかないので、定義内容は一緒です。似たような定義山ほどあった理由は、前方互換を担保したりショートハンドを提供するためだった、というお話でした。
高須院長のAAを出すコマンドを作って遊んだらyesコマンドが組み込みコマンドだった話

# 組み込みコマンドを上書きしてしまった

夜中に見た高須クリニックのCMが頭から離れなかったので、```yes```と打つと高須院長のアスキーアートが出るコマンドを作りました。

![takasu_qiita.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/264906/f0be6a69-6f0e-cd38-a982-6c6ed68e0f07.gif)



そのあと先輩から「え、yesコマンド上書きしたの？」と言われて初めて```yes```コマンドの存在を知りました。
しかも業務の外部コマンドでyesを使う可能性があるとこのと。
高須院長出して遊んでる場合じゃないと気がつきました。

zshrcからaliasのyesコマンドを消せば良いのですが、せっかくなのでaliasを残した状態で元のビルトインコマンドを実行する方法を調べてみました。

# コマンドの優先度はaliasが先

aliasを組んだことによって、僕のシェル環境にはビルトインコマンドとしての```yes```とaliasで作った```yes```が共存しており、優先度を調べてみると、aliasが先であることが分かります。

```
$ type -a yes
yes is a shell function from /Users/UserName/.zshrc
yes is /usr/bin/yes
```

shell functionが作ったyesコマンドです。

# Commandでalias回避

commandというビルトインコマンドに引数として渡して実行することで、aliasの実行を回避することができます。

```
$ command yes
y
y
y
y
y
y
y
y
y
...
```
Ubuntu 16.04 x64 に n を使用して Nodejs をインストールする

#目的
nodejs の管理を n を使って行う
※参考サイトの内容を、自分に必要な部分のみメモとして抜粋
##nodejs とnpm のデフォルトパッケージのインストール
※apt-getでインストールしたNode.jsとnpmは、nをインストールするためだけに使用する
$ sudo apt-get install -y nodejs npm
##npmでnをインストール
※念のためnpmのキャッシュを削除してからnをインストールする
$ sudo npm cache clean
$ sudo npm install -g n
##nで任意のバージョンのNode.jsをインストール。
$ sudo n stable
$ sudo n lts
等詳細はnのREADME.mdを参照
## apt-getでインストールしたnodejsとnpmをアンインストール
$ sudo apt-get purge -y nodejs npm
※この古いnpmをアンインストールしても、npmコマンドは継続して使える
$ ls /usr/local/bin
n  node  npm  npx
その他の使い方は[tj/n: Node version management](https://github.com/tj/n)のREADME.mdを参照
##参考にしたのは以下のサイト
[結局のところ node.js をサーバーにインストールするにはどうやればいいのか？](http://moro-archive.hatenablog.com/entry/2015/07/27/225747)
[UbuntuにNode.jsをインストールするベストプラクティス](http://kamatte.me/2017/08/17/ubuntu%E3%81%ABnode-js%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/)
MySQLにダンプデータをインポート

```
mysql -u [user_name] -p [database_name] < ~path/[import_data].sql 
パスワード聞かれるので、入力してEnter
```

ログインしてない状態でやること
mysqlコマンドはパスを通して置くと便利
パスを通すって何って思ったら検索
↓
参考サイト：[Mac] MAMP環境のMySQLにパスを通す方法
https://qiita.com/pappikko/items/3063211344e5add6b20b
herokuインストールからgit pushでデプロイまで

######RailsTutorialのメモ

環境はこちら
 *ruby 2.5.1
 *rails 5.2.2
 *vagrant-CentOS/7
 *Windows10

2019/1/26追記:
tutorialの操作通りにやったら再起動後herokuコマンドがなくなってたから、[他の方法を見つけました](https://hombre-nuevo.com/webservice/webapp0002/)
こちらでやってることをメモしておきます
事前にwgetをインストールしてない場合は`$ sudo yum install wget`しておく


##herokuインストール

ディレクトリの作成

```
$ sudo mkdir -p /usr/local/lib /usr/local/bin
```

herokuのダウンロード

```
$ sudo wget https://cli-assets.heroku.com/branches/stable/heroku-linux-amd64.tar.gz
```

解凍して展開

```
$ sudo tar -xvzf heroku-linux-amd64.tar.gz -C /usr/local/lib
```

シンボリックリンクを貼る

```
$ sudo ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku
```

herokuがインストールできたか確認

```
$ heroku --version
```

herokuコマンドでログインしてSSHキーを追加
loginではアドレスが出てくるからそれをコピーしてブラウザに貼り付けてログイン

```
$ heroku login
$ heroku keys:add
```

heroku関連は大体ここまで



## ここからgit関連の操作

事前に本番以外のjemをインストールする

```
$ bundle install --without production
```

heroku createでHerokuサーバーにアプリケーションの実行環境を作成。コマンド実行後に出てきたURLにブラウザでアクセスすればアプリケーションが見れる `git heroku [name]`で名前もつけられる

```
$ heroku create example-app
Creating app... done, hoge-xxx-1234
https://hoge-xxx-1234.herokuapp.com/ |
https://git.heroku.com/hoge-xxx-1234.git
```

ビルドパッケージを追加(これをせずにgit pushをするとエラーが出るかも・・・[この記事見てね](https://qiita.com/iwato/items/ddb93faa7eaa25daff59))

```
$ heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
```

コミットする

```
$ git init
$ git commit -am "message"
```

git pushでherokuにリポジトリをプッシュしてついにデプロイ完了！

```
$ git push heroku master
```

データベースのマイグレーションを行う

```
$ heroku run rails db:migrate
```

heroku openコマンドでブラウザ表示、またはURL表示ができる

```
$ heroku open
 ▸    Error opening web browser.
 ▸    Error: Exited with code 3
 ▸
 ▸    Manually visit https://sasa-rails-tutorial.herokuapp.com/ in your browser.
```

これで一通り完了！

---

###データベースのマイグレーション

すでに開発でmigrateをしている場合、heroku上でもmigrateしてあげる必要がある(seedもしている場合、それもやる事！)

```
$ heroku run rails db:migrate
$ heroku run rails db:seed
```

データベースのリセット

```
$ heroku pg:reset DATABASE
```

###アプリケーションの名前を変えてみる

すでに使われているアプリケーションの名前は使えないよ

```
$ heroku rename rails-tutorial-hello
```

他にもいろいろなherokuコマンドがあるからいろいろ見てみよう！`$ heroku help`


---
参考サイト
herokuについて:
https://webbibouroku.com/Blog/Article/heroku-getting-started
herokuインストールの方法:
https://hombre-nuevo.com/webservice/webapp0002/
XGBoostのインストール時の備忘録 

> 初めて記事を執筆するため、至らない箇所が多々見受けられるかと思います。
是非、コメント欄にてご指摘ください。有り難く頂戴いたします。

#はじめに
xgboostのインストールに手こずったので備忘録を．
はじめに言っておくと, インストールはできたが、原因の解決はできていない.
最終的には思いつきでインストールできました.
#環境
macOS 10.14.2
#ダメだったこと
色々な記事を読んでダメだったこと.
## その1
```terminal:terminal
$ brew tap homebrew/boneyard
$ brew install clang-omp
```
`Error: No formulae found in taps.`ということで, **clang-omp**が無い（？）でダメだった.
<details><summary>エラー詳細</summary><div>

```python:#その1

Error: No available formula with the name "clang-omp" 
==> Searching for a previously deleted formula (in the last month)...
Warning: homebrew/core is shallow clone. To get complete history run:
  git -C "$(brew --repo homebrew/core)" fetch --unshallow

Error: No previously deleted formula found.
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
==> Searching taps on GitHub...
Error: No formulae found in taps.
```
</div></details>
## その2　(1の打開策らしい)
```terminal:terminal
$ brew install gcc@5
$ pip install xgboost
```
しかし、以下のエラー
`did you install compilers and run build.sh in root path?`
よくわからないが, コンパイラはインストールしているつもり.
<details><summary>エラー詳細</summary><div>

```python3:#その2

Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/vh/glbc0h9s6j9g5jmy4_y21zm80000gn/T/pip-install-w4ypns7e/xgboost/setup.py", line 42, in <module>
        LIB_PATH = libpath['find_lib_path']()
      File "/private/var/folders/vh/glbc0h9s6j9g5jmy4_y21zm80000gn/T/pip-install-w4ypns7e/xgboost/xgboost/libpath.py", line 49, in find_lib_path
        'List of candidates:\n' + ('\n'.join(dll_path)))
    XGBoostLibraryNotFound: Cannot find XGBoost Library in the candidate path, did you install compilers and run build.sh in root path?
    List of candidates:
    /private/var/folders/vh/glbc0h9s6j9g5jmy4_y21zm80000gn/T/pip-install-w4ypns7e/xgboost/xgboost/libxgboost.dylib
    /private/var/folders/vh/glbc0h9s6j9g5jmy4_y21zm80000gn/T/pip-install-w4ypns7e/xgboost/xgboost/../../lib/libxgboost.dylib
    /private/var/folders/vh/glbc0h9s6j9g5jmy4_y21zm80000gn/T/pip-install-w4ypns7e/xgboost/xgboost/./lib/libxgboost.dylib
    /Users/hiro./.pyenv/versions/3.6.5/xgboost/libxgboost.dylib
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/vh/glbc0h9s6j9g5jmy4_y21zm80000gn/T/pip-install-w4ypns7e/xgboost/
```
</div></details>
## その3
```terminal:terminal
$ pip install --upgrade pip setuptools
```
pip/setuptoolを更新すれば治るみたいなの.
よく見たら自分のエラーとは関係がなかった.
エラーでsetuptoolsが無いよ〜系, て言われてたらこれが効くらしい.
#こうやったらできた
```terminal:terminal
$ brew uninstall gcc@5
$ pip install xgboost
```
コンパイラをアンインストールしたら, 無事にインストールできました **(なんで？)**.
xgboostって確か, c++で書かれててそのためのコンパイラが必要なんですよね?
まぁ, そこらへんはおいおい…
このpcではまだコーディングしてないので, やっぱり使えなかったら追記する予定.

以上です.
ファイルの中身を変数に代入する(Linux)

#やりたいこと
タイトル通りにファイルの中身を変数に代入したい。 ` echo $var ` で出力できるようにしたい。

#環境情報

OS: Amazon Linux2 (CentOS7に相当する)
Shell: /bin/bash

#準備

まずはファイルを作成しましょう。


```ruby:cmd
sh-4.2$ echo abcabc > fileA
sh-4.2$ cat fileA
abcabc
```
はい。 ` abcabc ` と書かれたファイルを作成しました。
ではここから変数( ` val ` ) に代入していきます。


#失敗例

```ruby:cmd
sh-4.2$ val=${cat fileA}
sh: ${cat fileA}: bad substitution

sh-4.2$ val=`${cat fileA}`
sh: ${cat fileA}: bad substitution
```


#成功編

```ruby:cmd
sh-4.2$ val=$(cat fileA )
sh-4.2$ echo $val
abcabc
```

簡単でしたね。
postgres 公式参照 like


```
SELECT
 first_name,
 last_name
FROM
 customer
WHERE
 first_name LIKE 'Jen%'
```
|first_name|last_name|
|---|---|
|Jennifer|Davis|
|Jennie|Terry|
|Jenny|Castro|

```
SELECT
 'foo' LIKE 'foo', -- true
 'foo' LIKE 'f%', -- true
 'foo' LIKE '_o_', -- true
 'bar' LIKE 'b_'; -- false
```
こういう使い方もできるそうです

true|true|true|false|
---|---|---|---|

not likeもあり、結果が逆になります。

>\~~はと同等です LIKE
\~~ *はと同等です ILIKE
！\~~はと同等です NOT LIKE
！\~~ *はと同等です NOT ILIKE

```
SELECT
 'foo' ~~ 'foo', -- true
 'foo' ~~ 'f%', -- true
 'foo' ~~ '_o_', -- true
 'bar' ~~ 'b_'; -- false
```

true|true|true|false|
---|---|---|---|

ILIKEを使うと、大文字、小文字を区別しないそうです。
>PostgreSQLはILIKE演算子のように振舞う演算子を提供しますLIKE。さらに、ILIKE演算子は値を大文字と小文字を区別せずに照合します。次の例を見てください。
[PHP] 可変引数を使う場合

# 背景
可変引数を利用したくなりました。
具体的には、インスタンス変数 arrが多次元配列で arr['key1']['key2']['key3']['key4'] ... となっており、
状況によって、$arr['key1']を取り出したり、$arr['key1']['key2']['key3']を取り出すような関数がほしくなりました。
そこで、第１引数に'key1'を指定した場合には、$arr['key1']を返し、第１引数〜第３引数にそれぞれ 'key1', 'key2', 'key3'を指定したら$arr['key1']['key2']['key3']を返すような関数を可変引数によって実現したいと考えました。

# 可変引数を実現するためには

以下のように　func_get_args()で引数の配列を取得できる。

```php

function getArguments(){
  $args = func_get_args();

  foreach($args as $arg){
    echo $arg;
  }
}
```

# 可変引数を利用して、多次元配列のｎ次元目の要素を取り出す関数

```php

class Sample{
  $private $arr = [
   'a' => ['aa' => ['aaa' => ['aaaa' => 'aaaaa']]]
   'b' => ['bb' => ['bbb' => ['bbbb' => 'bbbbb']]]
   'c' => ['cc' => ['ccc' => ['cccc' => 'ccccc']]]
   'd' => ['dd' => ['ddd' => ['dddd' => 'ddddd']]]
  ];

  public function getArrElement(){
    
    $args = func_get_args();
    $tmp  = $this->arr;

    foreach($args as $arg) $tmp = $tmp[$arg];

    return $tmp;
  }
}

$obj = new Sample();
var_dump($obj->getArrElement('a'))           # ['aa' => ['aaa' => ['aaaa' => 'aaaaa']]]
var_dump($obj->getArrElement('b','bb')       # ['bbb' => ['bbbb' => 'bbbbb']]
var_dump($obj->getArrElement('c','cc','ccc') # ['cccc'=> 'ccccc']
var_dump($obj->getArrElement('d','dd','ddd','dddd') # ddddd 
```
node_modules の package を削除したらインストールできなくなった

なぜかnode_modules の package（karma-cli） を削除してしまった。
再度 `npm i -g karma-cli` するとこんなエラーが。。

```
npm ERR! path /Users/kawa/.anyenv/envs/nodenv/versions/8.12.0/bin/karma
npm ERR! code EEXIST
npm ERR! Refusing to delete /Users/kawa/.anyenv/envs/nodenv/versions/8.12.0/bin/karma: ../lib/node_modules/karma-cli/bin/karma symlink target is not controlled by npm /Users/kawa/.anyenv/envs/nodenv/versions/8.12.0/lib/node_modules/karma-cli
npm ERR! File exists: /Users/kawa/.anyenv/envs/nodenv/versions/8.12.0/bin/karma
npm ERR! Move it away, and try again.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/kawa/.npm/_logs/2019-01-25T14_14_07_277Z-debug.log
```

## 対処法

見るべきは **Move it away**。直訳で遠ざけてくださいとある・・。
`File exists:`  以下のパスを削除して、再度インストールしてみる。

```
$ sudo rm /Users/kawa/.anyenv/envs/nodenv/versions/8.12.0/bin/karma
$ npm i -g karma-cli
```
インストールできた！

邪魔なファイルがあったせいでインストールできなかったみたい。

## おまけ

フロントエンドテストを書いたことがなくてこちらを参考にしてkarmaをつかってみました。
3年前の記事ですが、わかりやすかったです。
[フロントエンドにテストを導入](https://qiita.com/howdy39/items/cdd5b252096f5a2fa438)
モンティ・ホール問題が納得いかなかったので、モンテカルロシミュレーションしてみた

#モンティ・ホール問題の解説が納得いかなかったので、モンテカルロシミュレーションしてみた

[モンティ・ホール問題](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C)

何回読んでも納得がいかない。
そこでpythonでシミュレーションしてみました。

## 使い方

引数として、試行回数を指定。

```
python monty.py 1000
```

## code

```python
import random
import sys

#引数
n = int(sys.argv[1])

#賞を得るのに、成功すると1、失敗すると0を返す
#change ドアを変更するか
#True:変更する
#False:変更しない
def monty(change):
    #3枚のドア
    doors = [0,0,0]
    #乱数でどのドアに賞品があるかを決める
    prize = random.randint(0,2)
    doors[prize] = 1
    #参加者がドアを選ぶ
    select = random.randint(0,2)

    #続いてmontyがドアを選ぶ
    while True:
        monty_select = random.randint(0,2)
        if monty_select != select and doors[monty_select] == 0:#賞品が無く、参加者が選ばなかったドアを選ぶ
            break            

    if change:#ドアを変更する場合
        while True:
            select_change = random.randint(0,2)
            if monty_select != select_change and select != select_change:#montyも参加者も選ばないドア
                select = select_change
                break
    if doors[select] == 1:#賞を得られたら1を返す
        return 1
    return 0#賞が得られなければ0を返す

change = 0
nochange = 0
for i in range(n):#指定回数を繰り返す
    change += monty(True)
    nochange += monty(False)

#結果の表示
print("turn",n, "change",change,"nochange", nochange)
```

# 実行結果

何回やってみても、ドアを変えるほうが賞品をもらえる回数がほぼ２倍になりました。

```
turn 1000 change 700 nochange 320
turn 1000 change 678 nochange 356
turn 1000 change 658 nochange 333
turn 1000 change 649 nochange 310
```

# 実行環境

MacBook-Pro-2016
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)

づつく
[モンティ・ホール問題が納得いかなかったので、モンテカルロシミュレーションしてみた（２）](https://qiita.com/g667408/items/69d4638d395e953af606#_reference-b5674ec7bfc930c3ffca)
PostgreSQL 公式の DockerFile をビルドしたら gpg: keyserver receive failed: Address not available で落ちる

# 概要
PostgreSQL の公式の DockerFile を [GitHub](https://github.com/docker-library/postgres) から取得して、ビルドしたところエラーが出てビルドできませんでした。

```
+ gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4
gpg: keybox '/tmp/tmp.TJGmsE5I4v/pubring.kbx' created
gpg: keyserver receive failed: Cannot assign requested address postgresql
keyserver receive failed: Cannot assign requested address postgresql
```

なにをやってもほぼ間違いなく上記のエラーが出るのですが、ごくまれに docker のビルドに成功するのです。
どういうことなのか、とはまってしまいました。

# 正解
[GitHubのイシュー](https://github.com/nodejs/docker-node/issues/380) の　F30 さんの方法で現象を回避できました。

>(Came here through Google after having the same error in a different container.)

>In my case, the error with [ha.]pool.sks-keyservers.net was related to IPv4 vs. IPv6: GPG's dirmngr might select a v6 server from the pool and try to connect to it, even though it doesn't have v6 connectivity inside the container.
I'm not sure whether this is a bug in Docker or dirmngr, but there is at least this bug related to dirmngr and IPv6.

>If one wants stay with sks-keyservers, ipv4.pool.sks-keyservers.net can be used.

彼の説明によると、dirmngr が ipv6 のサーバーをプールから選択しているが、そのようなサーバーは存在しない、ということでした。
そのため、DockerFile 内のサーバー名を ipv4 のサーバーを明示したら確実に成功するようになりました。

```DockerFile_変更前(postgre9.6)
# 31 行目
	&& gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \

# 67 行目
	gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
```

```DockerFile_変更後(postgre9.6)
# 31 行目
	&& gpg --batch --keyserver ipv4.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \

# 67 行目
	gpg --batch --keyserver ipv4.pool.sks-keyservers.net --recv-keys "$key"; \
```
MySQLで文字を置換したい

置換したいときはこう

```
UPDATE table_name SET column_name=REPLACE(column_name, "換わる文字", "置く文字");

UPDATA mito_komon SET sokkin=REPLACE(sokkin, "助", "角")　WEHER id="1";

結果: 助さん　→　角さん
```

いきなり全件更新は怖いのでテストしてからやる。
MkDocs Material Boilerplate でサクッとドキュメントを公開する

![mkdocs.png](https://qiita-image-store.s3.amazonaws.com/0/285675/0b5958cc-4e14-0e3a-5bdd-5675e1609229.png)

Material for MkDocs の Boilerplate (Starter Kit) を公開しました。

Netlify, GitHub Pages, GitLab Pages, AWS Amplify Console などにすぐデプロイできるよう、設定ファイル等が含まれています。

Issue, Pull Request, GitHub Star ⭐️お待ちしてます。

👉 [peaceiris/mkdocs-material-boilerplate - GitHub](https://github.com/peaceiris/mkdocs-material-boilerplate)

> MkDocs Material Boilerplate (Starter Kit) - Deploy documentation to platforms (Netlify, GitHub Pages, GitLab Pages, and AWS Amplify Console) with CircleCI, Docker, pipenv, GitHub Actions.



## ボイラープレートの特徴

静的サイトジェネレーター [MkDocs] のマテリアルデザインテーマ [Material for MkDocs] をすぐに利用・デプロイするためのテンプレートです。

Markdown で記事を書いて、記事一覧・目次・様々な修飾が用意されているドキュメントサイトを生成できます。

- Docker で簡単に MkDocs Material を実行
- pipenv, pip (conda) での導入にも対応
- 自動ビルド・デプロイを設定済み
    - [Netlify] へ1クリックでデプロイ可能
    - [GitHub Pages] + [CircleCI] or GitHub Actions
    - [GitLab Pages] + [GitLab CI/CD]
    - [AWS Amplify Console]

以下はこのボイラープレートで設定済みの [Material for MkDocs] の機能です。

- MathJax 導入済み
- クライエントサイドでの日本語による全文検索


## 公開方法の組み合わせ

以下のようなサービスの組み合わせに対応しています。

- [GitHub Pages] + GitHub +
  - `mkdocs gh-deploy` command
  - [CircleCI]
  - GitHub Actions
- [GitLab Pages] + [GitLab] + [GitLab CI/CD]
- [Netlify] +
  - GitHub
  - GitLab
  - [BitBucket]
- [AWS Amplify Console] +
  - GitHub
  - GitLab
  - BitBucket
  - [AWS CodeCommit]

一番楽なのは1クリックで連携・デプロイできる Netlify だと思います。GitLab 使いの人には GitLab Pages が楽でしょう。

ID, Password による認証をかけたい場合には AWS Amplify Console がオススメです。



## デモサイト

- [MkDocs Material Boilerplate](https://mkdocs.peaceiris.com/)



[MkDocs]: https://www.mkdocs.org/
[Material for MkDocs]: https://squidfunk.github.io/mkdocs-material/
[GitHub Pages]: https://pages.github.com/
[CircleCI]: https://circleci.com/
[GitLab]: https://about.gitlab.com/
[GitLab Pages]: https://about.gitlab.com/product/pages/
[GitLab CI/CD]: https://about.gitlab.com/product/continuous-integration/
[Netlify]: https://www.netlify.com/
[BitBucket]: https://bitbucket.org/
[AWS Amplify Console]: https://aws.amazon.com/jp/amplify/console/
[AWS CodeCommit]: https://aws.amazon.com/codecommit/
SVNバックアップ関連コマンド備忘

SVNのバックアップ周りのコマンドは使用する機会は滅多にないけどたまにあるくらいで記憶する程でもなく毎回調べている状況なのでメモとして残しておこうかと思います。


## リポジトリのコピー

リポジトリのバージョンを維持したい場合はhotcopyで取得します。
後述のdump/loadではdump元のリポジトリバージョンはdump先リポジトリ作成時コマンドのバージョンに依存します。

```:command
svnadmin hotcopy 【リポジトリパス】【出力ディレクトリパス】
```


## リポジトリのダンプ取得

### リポジトリパスがローカルの場合

```:command
svnadmin dump 【リポジトリパス】 > 【出力先ファイルパス】
```

- 差分dump（例：リビジョン100から最新まで。）

```:command
svnadmin dump -r 100:HEAD --incremental 【リポジトリパス】 > 【出力先ファイルパス】
```

### リポジトリパスがリモートの場合

```:command
svnrdump dump 【リポジトリパス】 > 【出力先ファイルパス】
```


## リポジトリのロード（リストア）

事前にロード先のリポジトリを作成しておく必要があります。
ロード先リポジトリのバージョンはダンプ元のリポジトリには関係なく、ロード先リポジトリを作成する際のコマンドのSVNバージョンに依存します。
ダンプ元リポジトリのSVNバージョンにはなりません。

```:command
svnadmin load 【ロード先リポジトリ】 < 【ダンプファイル】
```


## リポジトリの整合性チェック

```:command
svnadmin -q verify 【リポジトリパス】
```

オプションを何もつけないと正常メッセージが大量に出力されます。
正常メッセージを抑止して異常メッセージのみ出力したい場合に [-q ]オプションを付与します。


## リポジトリの最新リビジョン確認

### リポジトリパスがローカルの場合

```:command
svnlook youngest 【リポジトリパス】
```

### リポジトリパスがリモートでも確認可能

```:command
svn info 【リポジトリパス】
```
CircleCIでAlpine LinuxベースのDockerイメージを使う時にGit LFSに対応する

CircleCIでGit LFS管理下のファイルを使おうとする場合、CIの環境でもGit LFSが利用可能でなければいけません。
CircleCI提供のイメージでGit LFSをインストールする方法は「[CircleCIでgit-lfsをインストールしてからテストする](https://qiita.com/obi_yuta/items/58366fdeb25ad7592201)」で紹介されています。

しかし、独自のDockerイメージとして、軽量な[Alpine Linux](https://alpinelinux.org/)ベースのものを採用する場合があります（例えば[paperist/alpine-texlive-ja](https://hub.docker.com/r/paperist/alpine-texlive-ja/)）。
Alpineは最小構成のLinuxであり、例えば`curl`が存在しないため、上記記事の方法をそのまま使うことはできません。
そのため、Alpine用の設定方法を調べました。

## 環境
- [CircleCI 2.0](https://circleci.com)
- [Alpine Linux](https://alpinelinux.org/) `3.8.2`

## 設定
テストなどを実行する前にGit LFSをインストールし、LFS管理下のファイルを取得します。

### 公開リポジトリ用
```yaml:.circleci/config.yml
    steps:
      - checkout
      - run:
          name: Install Git LFS
          command: |
            apk add git git-lfs
            git lfs pull
```

### 非公開リポジトリ用
```yaml:.circleci/config.yml
    steps:
      - checkout
      - run:
          name: Install Git LFS
          command: |
            apk add openssh git git-lfs
            mkdir ~/.ssh
            ssh-keyscan github.com >> ~/.ssh/known_hosts
            git lfs pull
```

## 解説
### `apk add (openssh) git git-lfs`

Alpineでは`apk add`でGit LFSをインストールすることができます。素の状態のAlpineにはGitもないので、一緒に入れています。

リポジトリが非公開の場合は、OpenSSHも必要です。

### `mkdir ~/.ssh` / `ssh-keyscan github.com >> ~/.ssh/known_hosts`
非公開リポジトリに対してSSHを使ってpullを行います。しかし、CIの場合大抵は初めての接続なので、以下の警告が出てCIが止まってしまいます。

```
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? 
```

回避方法は様々ありますが、本記事では「[初回SSH接続時の対話的Fingerprint確認フローをssh-keyscanでスキップする](https://qiita.com/pinkumohikan/items/b6fa4233068e7e98e22d)」を参考に`ssh-keyscan`で警告を回避しています。ただ、そもそも`~/.ssh`がないとエラーでCIが落ちてしまうので、作成しておきましょう。

### `git lfs pull`
Git LFSで管理しているファイルの実体を入手します。
C言語入門~配列と文字列~

#配列#

##宣言と初期化##
まず配列の宣言は下の通りです

```c
int array[666];

//二次元配列
int array2[2][3];
```

`要素型　変数名[要素数];`このように宣言します.

これだと不確定要素が代入されてるので怖いです.初期化しましょう.

```c
//全部0で初期化
int array[666] = {0};

//{1,2,3,0,0}と初期化
int array2[5] = {1,2,3,0,0};

//二次元配列
int array3[2][3] = {
    {11,22,33,},
    {44,55,66,}
};

//文字配列の初期化はこうなの
//初期化子の個数から配列の要素数が決まるから、要素数は省略してもいいんだって
char string[] = {'s','t','r','\0'};
char str[] = "str";
```

##配列の操作##

###1.コピー###

for文で要素１つずつ回して行きます.
`#define NUMBER N`で要素数を定義している仮定です.
ちなみにこれは**オブジェクト形式マクロ**といって,NUMBERのことを**マクロ名**というらしいす.

```c
for (i = 0; i < NUMBER; i++){
    ary2[i] = ary1[i];
}
```

`ary2 = ary1`みたいに代入するのはムリです.
for文とかで回しましょう.

###2.配列の要素に値を読み込む###
下の通りです.

```c
for (i = 0; i < NUMBER; I++){
   scanf("%d", &x[i])
}

//文字配列
char str[48];
// &strって書かないことに注意
scanf("%s", str);
```

###3.配列の大きさ###
sizeof演算子で求めます

```c
sizeof(array)/sizeof(array[0])
```


###関数に引き渡し###

```c
#include <stdio.h>

// constは受け取る配列の要素の値を変更しないことを宣言する
//配列を受け取る仮引数に要素数は不要

int str_count(const char s[])
{
	int count = 0;
        // while文でs[count]がNULLになるまで回します
	while(s[count])
		count++;

	return count;
}

int main()
{
	char str[128];

	printf("文字列を入力:");
	scanf("%s", str);

	printf("文字列\"%s\"の長さは%dです\n", str, str_count(str));

	return 0;
}
```
Perlにもunittest.mockが欲しい

## これはなに？

* 2019-01-25 の YAPC::Tokyo 前夜祭のLTで使ったスライド
* ネタ画像などを抜いたもの
* 旧題「行動してから主張せよ」

---

## Python の unittest.mock

* 2008年に誕生
* Python 3.3 でビルトインに
* record -> replay より action -> assertion

---

## record -> replay

```python
# record
mocker = Mocker()
mock = mocker.mock()
mock.get("https://haskell.jp")
mocker.result(Response())

client = Client()
client.agent = mock

# replay
mocker.replay()
res = client.call_api("https://haskell.jp")

mocker.restore()
mocker.verify()
```

---

## record -> replay

* テスト結果を先に記述する必要がある
* 動作後にも検証が必要なので、検証コードが分かれる

---

## action -> assertion

```python
client = Client()
client.agent = mock.Mock()

# action
res = client.call_api("https://haskell.jp")

# assertion
client.agent.get.assert_called_with("https://haskell.jp")
```

---

## action -> assertion

* 動作させ、その結果を検証するという流れ
* 通常の単体テストの流れと合致する

---

## Perlで実装したい

* unittest.mock の使い勝手が良かった
* CPANに類似モジュールがなさそう
* ~~LTのネタになりそう~~
* 職場の "20%ルール" 的な制度を利用
* https://github.com/hiratara/p5-Test-LazyMock

---

## テストしたいコード

```perl
sub test_code {
    my $dbh = DBI->connect(
        "DBI:mysql:yapc:localhost", "tokyo", "oykot");
    my $sth = $dbh->prepare("SELECT name, age FROM atendee");
    $sth->execute;

    my $atendee = $sth->fetchrow_hashref;
    printf "%s (%d)\n", $atendee->{name}, $atendee->{age};
}
```

---

## テストコード

```perl
patch_sub {
    my $mock = shift;
    # action
    test_code;

    # assertion
    $mock->lazymock_called_with_ok(
        prepare => ["SELECT name, age FROM atendee"]);
} 'DBI::connect';
```

`test_code` より以下が出力される。

```
Test::LazyMock=REF(0x7fea9f0f25b0) (1)
```

---

## 呼出履歴の表示

```perl
print "$_->[0]\n" for $mock->lazymock_calls;
```

```
prepare
prepare->execute
prepare->fetchrow_hashref
prepare->fetchrow_hashref->{name}
prepare->fetchrow_hashref->{name}->`""`
prepare->fetchrow_hashref->{age}
prepare->fetchrow_hashref->{age}->`0+`
```

---

## 参考

* [Mocking, Patching, Stubbing: all that Stuff](http://www.voidspace.org.uk/python/articles/mocking.shtml)
* [Mocks Aren't Stubs](https://martinfowler.com/articles/mocksArentStubs.html)
* [unittest.mock — mock object library](https://docs.python.org/3/library/unittest.mock.html)
* [Test::MockObject](https://metacpan.org/pod/Test::MockObject)
* [Test::Double](https://metacpan.org/pod/Test::Double)
次git pullしたら npm iお願いします。

エンジニアさん　「次git pullしたら npm iお願いします。」

slackでよく見る発言。
実際面倒というより、気づいたら流れてて結局忘れてしまい。

非エンジニアさん　「pullしたらローカル見れなくなりました。」

みたいなやりとり。複数のreleaseブランチが動いてたりしてるともう必要なのかそうじゃないのか。。。

# [husky](https://github.com/typicode/husky)とスクリプト
とりあえず
husky入れてpost-mergeのタイミングでチェックしてくれるスクリプトの組み合わせで自動で教えてくれるものを作成した。

# 他プロジェクトでもそれするの？
- `npm i -D husky`
- package.jsonのscriptにコマンド登録
- .huskyrc.jsonにhook登録して先ほど登録したコマンドの記述
- スクリプトの作成（コピペ） <-- ファイル増えるし、これが面倒だなぁと

# [自作パッケージ](https://github.com/cilly-yllic/rot-pkg)
作ってみました。

- `npm i -D husky rot-pkg`
- package.jsonのscriptに`rot-pkg`コマンド登録もしくは.huskyrc.jsonにhookに`rot-pkg`の登録

### `npm run` をする場合

```json:package.json
  "scripts": {
    "rot-pkg": "rot-pkg"
  },
```

### huskyを利用する場合

```json:.huskyrc.json
{
  "hooks": {
    "post-merge": "rot-pkg"
  }
}
```

差分がなし
![スクリーンショット 2019-01-26 19.06.16.png](https://qiita-image-store.s3.amazonaws.com/0/117677/b02101a9-602a-b809-b680-abab66948a76.png)

差分あり
![スクリーンショット 2019-01-26 19.11.56.png](https://qiita-image-store.s3.amazonaws.com/0/117677/ff79a197-8158-6ebd-80db-8c8b8b3be491.png)



# 今後

テスト書いてないし、Angularのライブラリみたいな複数のpackage.jsonを管理している場合などに対応してない、yarn使ってる人使えない等、色々雑。。。

今後その辺ちょこちょこ要修正。

# 追記　2019-01-26
- yarnに対応
- ログをもうちょっとわかりやすく

しました。

# 追記　2019-01-27
- Angular libraryの入れ子になっているpackageに対応

しました。
Unity2018.3で自作パッケージを使った話

##はじめに
Unity 2018.3からPackage Managerで自作したパッケージをインポートできるようになりました。
メモも兼ねて分かる範囲で書きまとめたので、至らない点などあればコメントください。

#動作環境
- Windows 10
- Unity 2018.3.2f1
 
#既存のImport Packageとの違い
パッケージではあるが、そもそも機能が違うらしい…。
Import PackageではUnity独自の圧縮形式をAssetsフォルダに追加するわけですが、
Package Managerではプロジェクトの外にある機能に依存関係を持たせるみたいです。
なのでプラグインやエディタ拡張などの追加でプロジェクト内が乱雑になることもなくなり、
さらには別プラットフォームへの移植の際に取り除く作業がすごく簡単になる。
これは早く使い慣れておいたほうがいいかも。

#自作パッケージをインポートする準備
###package.json
インポートしたいフォルダの直下に作成し、Package Managerに表示される詳細を書き込みます。
書き方は[公式マニュアル](https://docs.unity3d.com/Packages/com.unity.package-manager-ui@1.8/manual/index.html)に載っていますが**name**と**version**が必須項目になります。
###Assembly Definition Files
プロジェクトの外にある機能を使うのでコンパイルされず機能しません。
なので事前に**.asmdef**ファイルをインポートしたいフォルダに入れておきます。
作り方や説明は[テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2018/01/18/212834)さんを参考にしました。
###インポートする機能
ここでは「ダイアログを表示するエディタ拡張」を用意しました。
ツールバーから手動で実行できる拡張なので、インポートしてすぐ反映されたかも確認できます。

```php
using UnityEditor;

public class PackageImportTest
{
    [MenuItem("Tools/Package Import Test/Open Dialog")]
    static void OpenDialog()
    {
        EditorUtility.DisplayDialog(
            title   : "Package Import Test",
            message : "インポートに成功しました",
            ok      : "OK"
            );
    }
}
```

#自作パッケージをインポートする方法
1. Unity Editorを起動してPackage Managerを開く

![PackageManager.jpg](https://qiita-image-store.s3.amazonaws.com/0/96676/9c9d4530-4b4f-fcae-32d3-a214d70df758.jpeg)
2. 下にある＋ボタンからインポートしたい**package.json**を選択
![PackageManagerView.jpg](https://qiita-image-store.s3.amazonaws.com/0/96676/a81ebc40-7d4d-7584-b1df-2186057d20c5.jpeg)
3. Projectビューにある**Packages**にインポートしたフォルダがあればＯＫ
![ProjectView.jpg](https://qiita-image-store.s3.amazonaws.com/0/96676/ada67083-18d1-3a29-d549-58cf61d6bc93.jpeg)



#まとめ
準備に手間取ることなどありましたが、インポートする作業自体はとても簡単。
調べているとgitリポジトリからも追加できるみたいなので個別でプロジェクト内に入れずとも良くなるかも？


#参考サイト
[【Unity】自作のパッケージを追加したりパッケージを一覧から検索したり…PackageManagerがUnity 2018.3で変化したポイント](http://tsubakit1.hateblo.jp/entry/2018/09/13/214119)
【ゆる募】「アプリケーションのコードを書くチーム」のチーム名って何ですか？

## この記事の内容
- 「アプリケーションのコードを書くチーム」のチーム名を考えていきます

## ことの発端
 😦< この仕事の依頼ってどこに投げればいいですか？
 🐶<　それは、`コアチーム`にお願いしようか！
 😦<　コアチーム？？？
 🐶<　あ、`開発チーム`のことね！
 😦<　へー、そういう呼び方だったんですね。
　
 数分後・・・🐤

 😦<　`開発チーム`の人に依頼したら、これは`インフラチーム`じゃないって言われました。
 🐶<　あ、`開発チーム`の中に`インフラチーム`があるけど、`エンジニア`とはまた違うんだよ！
 😦<　へー、そういう呼び方だったんですね。（先言ってよ）

  　　数日後・・・🐓

 🐶<　うちの`クリエイター`ってやっぱり面倒見がよくて云々・・・
 😦<　（うちのクリエイター！！！！）

　　数週間後・・・🐓🥚

 🤖(CTO)< `チーム名統一`決定戦をとりおこないます！
 😦<　（ようやくきたか！）

## 現状のまとめ
- 弊社には「開発チーム」が存在する
- 開発チームの中には、「インフラチーム」`「アプリケーションのコードを書くチーム」`の2つに大別される
- 色々な歴史があり、`「アプリケーションのコードを書くチーム」`の名前がうやむやになっている
- 今回は、`「アプリケーションのコードを書くチーム」`の呼び名を決めていきたいと思います。

## ルール
- `「アプリケーションのコードを書くチーム」`に所属しているメンバーは以下
    - WEBアプリケーションエンジニア（フロントエンド・バックエンド含）
    - デザイナー（フロント部分の実装もちょこっとやる）

- このメンバー構成に合う名前をつける
- 開発チームというのは使わない（親チーム名で使っているため）
- 社外の人（少なくとも同業社の人）に伝わる名前（WEBファイヤーサンダーチームとかは🙅‍♀️）
- かっこいい名前！

## 今ある候補
- devチーム
- アプリチーム
- スクラムチーム
- コアチーム（これは歴史的に弊社では馴染みがある）

## 筆者所感
↑のチーム名は全部いや

## 理由
テンション上がらないし、カッコよくないから。

## そこで
- どうにか他の会社様で`かっこいい名前`があれば参考にしたいです🙇‍♂️（ググっても全然でてこないし）
- みなさまのお知恵をお貸しください！
- 逆に、普通はこんな感じのチーム名多いよとか、そういうのもあれば教えていただきたいです！
- コメント欄にてお待ちしております🙇‍♂️
AtCoderでじゃんけんを

- [AtCoderでじゃんけんを](https://atcoder.jp/contests/arc048/tasks/arc048_b)

## 考察

- 愚直に解いたら$O(N^2)$になってしまう。
- 勝ち負けのパターンを整理すると以下の３つになる。勝ち数とドロー数がわかれば負け数がわかるので、勝ち数とドロー数のみを考える。
  1. 相手よりレートが高かったら勝ち
  2. 相手とレートが同じで、手が勝ってたら勝ち
  3. 相手とレートが同じで、手が同じならドロー。

- とりあえず愚直に書いてみることにした。何か見えてくるかもしれないので
- 書いてみたけど、二分探索とかしゃくとり法にできそうではない。なので他の方法を考える
- 勝ち数は「レート勝ち数」＋「レートが同じで、手が勝ってる」である。「レート勝ち数」は累積和を使えば$O(1)$で求められる。「レートが同じで、手が勝ってる」のは、連想配列を使えば$O(logN)$で求められる（C++のmapの計算量）。連想配列には`map[<レート, 手>] = そのレートでその手の人数`って感じで値を管理する。こんな感じで勝ち数は求められそう。
- 引き分け数は、「同じレートで同じ手のやつ」である。これは、先ほどの連想配列を使えば求められる。
- 考察終了



## 解法

1. レートごとの人数を配列に保存。その配列累積和をとって、あるレート以下の人数を$O(1)$で求められるようにしておく
2. `map[<レート, 手>] = そのレートでその手の人数`という連想配列を作る。
3. 「勝ち数」と「引き分け数」を求めて、「人数 - (勝ち数+勝ち数)」で「負け数」を求める方針で行く。
4. ある人の勝ち数を「レート勝ち数」＋「レート同じで手が勝ってる数」で求める。レート勝ち数は、先ほど累積和をとった配列を使えば求められる。レート同じで手が勝ってる場合は、先ほど作った連想配列をつかって条件分岐頑張って書けば求められる
5. ある人の引き分け数を「レート同じで手が同じ」で求める。これは先ほど作った連想配列を使えば求めることができる。ただし、`mp[<その人のレート, その人の手>]`で取り出した人数に自分が含まれることに注意する。なので、ドロー数は-1して出力する。



## [コード](https://atcoder.jp/contests/arc048/submissions/4084651)

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

#define int long long

using pii = pair<int, int>;

int N;
int R[111111];
int H[111111];
int rui[111111]; // rui[i]: レートi以下の人数
map<pii, int> mp; // map[<rate, hand>]: そのレートでその手の人数

void solve(int n) {
  int win = 0, lose = 0, draw = 0;

  /* 自分より低レート*/
  win += rui[R[n]-1];

  /* 同レート*/
  int gu = mp[{R[n], 1}];
  int ch = mp[{R[n], 2}];
  int pa = mp[{R[n], 3}];
  // 同レートで勝利
  if (H[n] == 1) {
    win += ch;
  } else if (H[n] == 2) {
    win += pa;
  } else {
    win += gu;
  }
  // 同レートで引き分け
  if (H[n] == 1) {
    draw += gu;
  } else if (H[n] == 2) {
    draw += ch;
  } else {
    draw += pa;
  }

  // この時点でwin確定, draw確定してるので「人数 - (勝ち数 + 引き分け数)」で負け数が求められる
  lose = N - (win + draw);

  printf("%lld %lld %lld\n", win, lose, draw-1); // drawには自分も含まれているので1引いておく
}

signed main() {
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> R[i] >> H[i];
    rui[R[i]]++;
    mp[{R[i], H[i]}]++;
  }

  for (int i = 1; i < 111111; i++) {
    rui[i] += rui[i-1];
  }

  for (int i = 0; i < N; i++) {
    solve(i);
  }

  return 0;
}
```





## 感想

- AtCoderじゃんけん、散々ネタにしてたのに解いてなかったので解いた。思ったより難しかった（愚直解で解ける問題だと思ってた）
- 公式解説と解き方違う。公式解説よくわからない。
【Rails】@current_user ||= User.find_by(id: session[:user_id])という書き方について

## はじめに

Railsチュートリアル8章 8.2.2の意味がよくわからなかったので、自分なりにまとめてみる。概要としては、以下の通りだ。

`@current_user = User.find_by(id: session[:user_id])`で定義すると、`@current_user`を呼び出すたびにデータベースを検索することになる。つまり遅くなる。それを防ぐため、current_userメソッドを作成する。

```ruby
def current_user
  if session[:user_id]
    @current_user ||= User.find_by(id: session[:user_id])
  end
end
```

このような書き方はよく使うらしい。

## 実現したいこと
最初は`@current_user = User.find_by(id: session[:user_id])`でデータを取得する。
それ以降は、取得していた`@current_user = { name: "Example User", .. }`の値をそのまま流用する。

## コードの分析

### 今までの書き方を使うと

```ruby
if @current_user.nil?
  @current_user = User.find_by(id: session[:user_id])
else
  @current_user
end
```

最初（中身が何もないとき）だけ`@current_user`に`User.find_by..`を代入する。
それ以降は`@current_user`の中身があるのでそのまま`@current_user`を返す。

### 短く書くと

```ruby
@current_user = @current_user || User.find_by(id: session[:user_id])
```
直訳すると、「`@current_user`は`@current_user`または`User.find_by..`である」だが、これだけではよくわからないので、処理の流れとして捉える。
`||`は項を左から順に判定し、trueになった時点で処理が終了するので、以下のようになる。

#### 1回目

```ruby
@current_user =
  @current_user # 最初の時点ではnilなのでfalse
  ||
  User.find_by(id: session[:user_id]) # 中身があればtrueを返す
```

#### 2回目以降

```ruby
@current_user =
  @current_user # @current_userに値が代入されているので、true
  ||
  User.find_by(id: session[:user_id]) # 既にtrueの項があるので、これはスルーされる
```

### さらに短く書くと

```ruby
@current_user ||= User.find_by(id: session[:user_id])
```

`a = a + 1`を`a += 1`で表すことができるのと同じ理論（厳密には違うらしいが）。

## リンク
- [Railsチュートリアル](https://railstutorial.jp/chapters/basic_login?version=5.1#sec-current_user)
- [Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2foperator.html#selfassign)
NerdTreeではなくnetrw-oが起動されてしまうとき

いろいろ設定とかnewtrw-oの無効にする方法とか調べたのですが、
vimのバージョンが古いだけでした。(7.2だった)

vimのバージョンを 8.1にあげたら無事NerdTreeを使うことができました。

参考
http://stupiddog.jp/note/archives/1147
Debian testingのsystemdをダウングレードする

# 概要
Debian testing amd64 systemd version 240-4 がメモリリーク起こしている模様。
いったん、メモリリークしていなかった（と思う）前のバージョン 240-2 へダウングレードする手順。

240-2で今のところリークしている様子はなし。

`(2019/2/7 追記)`
buster(testing)にsystemd 240-5 がリリースされましたのでメモリリークは解消済。


# メモリリークしている様子

muninのグラフで右肩が上がりで何かリークしているな、と思ってたら systemd-journal が激しく仮想メモリ使ってる。実メモリもちょっといつもより食っている気もするが、仮想メモリに比べれば微々たるもん。

uptime 3日のsshしか動いてない1コア512MBのサーバで 14GB 以上使ってる。結構な勢い。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/7434eb6b-d079-4f63-4b91-73b9bb498015.png)


あの伝説の OOM Killer 君も Kill 候補 No.1 としてマークしています。怖。
このまま放置したらどうなるんやろ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/c2fb7b42-d9f1-d5d5-b13a-7e0c1bb7c98f.png)


# Debian package downgrade

ダウングレードする方法で比較的安全で、楽なのが preferences を使う方法。

ところが、ダウングレード先のバージョンのパッケージはアーカイブミラーにもうないので、どっかから deb パッケージを入手せなあかん。公式は https://snapshot.debian.org/ なので、ここからダウンロードできる。

今回は /var/cache/apt/archive に残ってた版を使います。
自分が使ったものはこちらに置いときます。
https://ftp.pw2.org/deb/


## 1. 現在入ってるバージョンを確認
    % sudo dpkg -i list | grep systemd
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/ff56e32b-7eab-5a74-baaf-114159c99681.png)
240-4 が入ってますね。これを、240-2 にダウングレードします。
systemd以外の4パッケージも依存関係なので、合わせてダウングレードします。

## 2. ダウングレード先のパッケージを入手する
snapshot.debian.orgや/var/cache/apt/archivesにあるdebをコピーしてきてください。
自分の使ったやつを使う手順は以下。

    % wget https://ftp.pw2.org/deb/systemd_240-2.tar
    % ls -l
    % tar tvf systemd_240-2.tar
    % tar xvf systemd_240-2.tar
    % ls -l
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/f2266443-ff00-441a-584e-ceff2f0df17a.png)

## 3. preferencesファイルを配置する
preferences設定はどのパッケージを使うか優先度を指定するもの。
通常は最新版を使う優先設定になっているので、240-2を`dpkg -i`で入れても `apt-get dist-upgrade` で 240-4 にアップグレードされてしまうので、これを防ぐため、240-2がより高い優先度になるようにする。

`/etc/apt/preferences.d/` 配下にテキストファイルを置くと、apt系コマンド実行時に毎回読み込んでくれます。

今回置くファイルの内容は以下。

    % cd systemd_240-2
    % ls
    % cat systemd
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/48b42dab-868c-0b07-2a92-77315ac238c4.png)

設置する

    % sudo mv systemd /etc/apt/preferences.d/
    % cat /etc/apt/preferences.d/systemd
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/ea02378f-a3fe-ab15-81b5-3043224fc979.png)

これで、`apt-get update`や`aptitude dist-upgrade`とかやっても240-4にならないので大丈夫。240-5か240-6がリリースされたときには、`/etc/apt/preferences.d/systemd` を削除すればＯＫ。

## 4. ダウングレード実行

ようやくダウングレード実行。急いでるならこれだけでよいね。

    % sudo dpkg -i *.deb
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/b6d0da8f-2a34-d86f-c841-3247ba630cb9.png)

## 5. 解消したか確認する

    % ps aux | grep systemd
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242137/f53fdcde-dd26-381c-ac36-f322a60423ff.png)

大丈夫そうですね。
為念、サーバ再起動しといたほうがよいでしょう。

    % sudo shutdown -r now


# おわり
mysqlのクライアントmycliが便利だった。  

### mycliとは？
[https://www.mycli.net/](https://www.mycli.net/)

mysqlクライアントです。公式サイトみてもらうとわかるんですが、
基本コマンドには補完が聞くし、テーブル名とかも補完候補に自動で入ってくるので変なtypoがなくなってすごい楽に。
あとは、カラースキーマ、個別の色設定も諸々できる感じ。

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/kyagyao/31929134657/in/dateposted/" title="スクリーンショット 2019-01-25 19.38.46"><img src="https://farm5.staticflickr.com/4900/31929134657_b273918000.jpg" width="500" height="453" alt="スクリーンショット 2019-01-25 19.38.46"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>


### インストール方法
```
$ pip install mycli
```

もしくは

```
$ brew update && brew install mycli
```


### 使い方
mysqlコマンドと一緒で例えばローカルのmysqlに繋ぐ場合

```
$ mycli -uroot -p -h127.0.0.1 -P 3306
```

みたいな感じにするとmycliのコンソールが開きます。
あとは使い方はmysqlと一緒。


### 色の設定を変更する
[https://www.mycli.net/syntax](https://www.mycli.net/syntax)

設定ファイルが ``` ~/.myclirc ```にできているので、
その中身のsyntax部分を好みのものに変更します。

```
# Syntax coloring style. Possible values (many support the "-dark" suffix):
# manni, igor, xcode, vim, autumn, vs, rrt, native, perldoc, borland, tango, emacs,
# friendly, monokai, paraiso, colorful, murphy, bw, pastie, paraiso, trac, default,
# fruity.
# Screenshots at http://mycli.net/syntax
syntax_style = monokai
```





### 結果をファイルに保存
```
> ¥o filename
> select * from table;
```

これだけでselectの結果をfileに落とすことができたりします。
この他にもいろいろとコマンドがある。

[https://www.mycli.net/commands](https://www.mycli.net/commands)

mysqlコンソールで試したやつをファイルにしたかった場合、mysqlコマンドをコピーして、別にシェルを用意、もしくは-eで実行とかやってたんですが、
mycli使うとその辺の手間がなくなる感じです。しばらく使ってみよう。
[Gulp]コンパイル前のsassファイル（*.scss）をcssCombする

コンパイル前のsassファイルを整形したかったので、コンパイル後のCSSファイルに実行するcssCombとは別のタスクで実行するようにします。

watchで処理すると案件の都合上不便な時もあるため、 `gulp scsscomb` でタスクが実行されるようにしました。

コミット前にタスクを実行する習慣をつければ、共同編集するメンバーにも迷惑がかかりませんし、順番違うじゃねーかバカヤロー！と怒られる心配も怒るストレスもなくなります。

```javascript:gulpfile.js
const gulp    = require("gulp");
const csscomb = require('gulp-csscomb');
const cached  = require('gulp-cached');

gulp.task('scsscomb:init', function () {
  return gulp.src('htdocs/_scss/**/*.scss')
  .pipe(csscomb())
  .pipe(cached('cache'))
  .pipe(gulp.dest('htdocs/_scss/'));
});

gulp.task('scsscomb', ['scsscomb:init'], () => {
  return gulp.src('htdocs/_scss/**/*.scss')
    .pipe(cached('cache'))
    .pipe(csscomb())
    .pipe(gulp.dest('htdocs/_scss/'));
});
```

##参考

- [gulpで編集中のscssファイルをwatchしてCSScombした話](url:https://www.wantedly.com/companies/maisonmarc/post_articles/138053#_=_)
casTableのサマリーで確認できる各値について

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。プログラミング言語はJava/Python/R/SASが選べます。

機械学習を用いる際に専用のテーブル（casTable）を用いますが、今回はそのテーブルのサマリーを表示した際の各値の意味を解説します。

## テーブルの作り方

テーブルはCSV、HTML、他のデータベースなどから作れます。

```py
out = sess.upload('Jupyter_Saved_Work/Data/iris.csv')
```

ファイルをアップロードした後、casTableとして取得します。

```
tbl = out.casTable
```

## サマリーを表示する

サマリーは `summary` メソッドで表示できます。

|   | Column | Min | Max | N | NMiss | Mean | Sum | Std | StdErr | Var | USS | CSS | CV | TValue | ProbT | Skewness | Kurtosis |
|---|--------|-----|-----|---|-------|------|-----|-----|--------|-----|-----|-----|----|--------|-------|----------|----------|
| 0 | DOB | -15266.00 | 7190.00 | 22223.0 | 0.0 | -5877.324574 | -1.306118e+08 | 4825.522949 | 32.370026 | 2.328567e+07 | 1.285102e+12 | 5.174542e+11 | -82.104075 | -181.566881 | 0.0 | 0.077679 | -0.849240
| 1 | EDATE | 13933.00 | 13933.00 | 22223.0 | 0.0 | 13933.000000 | 3.096331e+08 | 0.000000 | 0.000000 | 0.000000e+00 | 4.314117e+12 | 0.000000e+00 | 0.000000 | NaN | NaN | NaN | NaN
| 2 | AGE | 18.00 | 79.00 | 20715.0 | 1508.0 | 53.797152 | 1.114408e+06 | 13.206048 | 0.091755 | 1.743997e+02 | 6.356449e+07 | 3.612516e+06 | 24.547858 | 586.312118 | 0.0 | -0.079830 | -0.843893
| 3 | LCDATE | -21914.00 | 13846.00 | 21942.0 | 281.0 | 11644.613937 | 2.555061e+08 | 2317.765457 | 15.647011 | 5.372037e+06 | 3.093138e+12 | 1.178679e+11 | 19.904185 | 744.206937 | 0.0 | -7.631565 | 98.238337

## 各カラムの意味

この時、表示されている各カラムの意味は以下のようになります。これがカラムごとに表示されています。

- **Min**  
最小値
- **Max**  
最大値
- **N**  
値が入力されている行数
- **NMiss**  
値が入力されていない行数
- **Sum**  
合計
- **Std**  
標準偏差
- **StdErr**  
標準誤差
- **Var**  
値
- **USS**  
未訂正平方和（Uncorrected sum of squares）
- **CSS**  
未訂正平方和
- **CV**  
変動係数
- **TValue**  
t検定値（仮説検定用）
- **ProbT**  
t検定のp値
- **Skewness**  
歪度
- **Kurtosis**  
尖度

----

サマリーを見ることでデータの抜けを確認したり、誤った値の存在を確認できるでしょう。大量のデータでも即座に表示しますので、データを取り込んだら使ってみて下さい。