OmniAICreator/Qiita-1.07M huggingface dataset:
php-master-changes 2019-08-09

この日はテストの修正、循環参照 GC の実装修正、組み込み関数の arginfo を PHP コードのスタブファイルから生成するようにする修正、初期化されていない DateTime をエラー扱いとする修正、openssl_random_pseudo_bytes() の引数チェックバグの修正、mbstring で無効な文字がカウントされるようにする修正があった！

# 2019-08-09
## mbeccati: Fix test when default TZ is not UTC
- https://github.com/php/php-src/commit/00dd786ba45d5c785ff6489cbfc3ea00fcf915fc
- [7.4]
- ext/date で、デフォルトタイムゾーンが UTC でなかった場合のテストこけを修正

## mbeccati: Skip test when SIGKILL is not defined
- https://github.com/php/php-src/commit/796efd849e18e52659304a7e7836f3197a4fe177
- [7.2]
- ext/posix で、テストのスキップ条件の足りない箇所があったのを修正

## dstogov: Added asserts to catch GC errors when refcount goes below zero.
- https://github.com/php/php-src/commit/2e2cd65d7317d8a196d8e260a1a80dd06a226571
- [7.2]
- 循環参照 GC の実装で、参照カウンタが 0 以下になった際のエラーを検知できるよう assert の追加

## dstogov: Fixed second part of the bug [#78379](https://bugs.php.net/bug.php?id=78379) (Cast to object confuses GC, causes crash)
- https://github.com/php/php-src/commit/6b1cc1252e73e51e53194c8c65e3d2302bc83dca
- 循環参照 GC の実装で、[前日の修正](https://qiita.com/sj-i/items/2a8ee56f8073b0ec91f3#dstogov-fixed-bug-78379-cast-to-object-confuses-gc-causes-crash)でクラッシュはしなくなったがメモリリークが出るようになっていたのを修正

## nikic: Generate arginfo from PHP stub files
- https://github.com/php/php-src/commit/33886f710cd45fd883d85558197e2df4eaba9ea1
- 組み込み関数の arginfo を PHP コードのスタブファイルから生成するよう修正
- [internals でスタブファイル作成の協力者を募集](https://externals.io/message/106522)しているところ
- なおスタブファイルをパースするのに PHP-Parser （自作）持ち出す好き放題っぷり、わりとほんとに PHP 界のラスボス感ある

## nikic: Make uninitialized DateTime an Error
- https://github.com/php/php-src/commit/3b2f2ce4748328fc696cd3d27887bf61e22ca023
- [7.2]
- ext/date で、DateTime が正常に初期化できなかった場合は警告ではなくエラーとするよう修正

## nikic: Fixed bug [#78391](https://bugs.php.net/bug.php?id=78391)
- https://github.com/php/php-src/commit/69a771346a649d993cc19362f3966a8f59e95d75
- [7.4]
- ext/openssl で、[openssl_random_pseudo_bytes()](https://www.php.net/manual/ja/function.openssl-random-pseudo-bytes.php) の引数チェックが誤っていた問題の修正

## nikic: Don't short-circuit MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE
- https://github.com/php/php-src/commit/7b152990b6c420df785ce9d5d1fd46571802152f
- [7.4]
- ext/mbstring で、MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE の分岐を外して無効な文字がカウントされるよう修正

## dstogov: Fixed handling of references in nested data of objects with destructor
- https://github.com/php/php-src/commit/9b43e29d9b55eafb4e063a0b2d817356f5b908b5
- [7.2]
- 循環参照 GC の実装で、オブジェクト内の入れ子のデータへの参照の、デストラクタでの扱いを修正
HackU2019TOKYOに出場してロボットメイドを作った

#作ったもの
LINE BOTに自分の好きな画像を送信し、その画像の輪郭を抽出しロボットアームがケチャップでオムライスに絵を描いてくれるアプリを作りました。さらに、ケチャップで描いている最中「萌え萌えキュン♡」と音声が流れます。

#開発した経緯
癒しが欲しい
↓
癒しと言えばメイド喫茶
↓
暑い中メイド喫茶に行く気力も金も努力もねえ
↓
じゃあ家でもメイド喫茶気分が味わえるロボットメイド作ろうぜ

#プレゼン動画
https://youtu.be/Oft-5r43k7o?t=3567
[![動画が開けられないようです。もう１度試してみて下さい](http://img.youtube.com/vi/Oft-5r43k7o/0.jpg)](https://youtu.be/Oft-5r43k7o?t=3567)

#実際に動いている様子
YouTubeの動画です。
[![動画が開けられないようです。もう１度試してみて下さい](http://img.youtube.com/vi/MuwifOlhjzM/0.jpg)](http://www.youtube.com/watch?v=MuwifOlhjzM)

#システム構成
![iOS の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453437/83c561ac-29aa-e5c6-9c26-55a3d4756bf9.png)

###LINEBOT, 画像処理
LINE BOTと画像処理は同じサーバでやっています。
画像が送信されると、その画像の頂点をまず抽出し、その頂点の座標データをMQTTbrokerにpublishしています。
LINE BOTはLINE Messageing APIを使用、画像処理はOpenCVを使用しています。

###MQTTbroker
MQTTとはIoT分野でよく使われる通信プロトコルです。MQTTbrokerは送信者と受信者の間の中継サーバみたいな感じらしいです（間違ってたらごめんなさい）。

ここではLINE BOT, 画像処理サーバから送信された座標データを、いい感じにESPに送信する役目を果たしています。

###ESP, Arduino
MQTTbrokerからいい感じに送信されてきた座標データはまずESPで受信され、いい感じに計算（ここ担当じゃないので何やってるかよく分からんけど結構すごいことやってるらしい）した後、いい感じにそのデータをArduinoでロボットアームに流し込みます。

###ロボットアーム
流し込まれた座標データをもとにアームが移動し、アーム先端につけられたケチャップが放出されます。ケチャップはモーターを利用した空気圧で出します。

#開発メンバー, 開発言語等
言語：Python, Ruby, Arduino言語
主な使用ライブラリ等：Flask, OpenCV, LINE Messageing API
クラウド：HEROKU, CloudMQTT
ロボットアーム：Dobot Magician

LINE BOT担当：ぼく
画像処理担当：[かんたろう](https://twitter.com/kantarow_)、[某](https://twitter.com/nanigasi_robo)
MQTTbroker担当：[かんたろう](https://twitter.com/kantarow_)
ロボットアーム制御担当：[1030](https://twitter.com/Hizuki10301030)、[てぃけ](https://twitter.com/tky_sleep)

#最後に
賞取れなかったのクソ悔しいですが、まあ色々反省点も出てきたのでHackDayでは最優秀賞とります。
LeetCode / Pascal's Triangle II

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/11/001251)からの転載）

AtCoderのBeginner Contentに初参戦してみました。

結果は緑([こちらのページ](https://qiita.com/drken/items/8a6f139158cde8a61dce)によれば "ソフトウェアエンジニアとして申し分ない実力です" のレベル)相当には後一歩及ばずというところ。まだまだ精進です。

さて、今日の問題。

[https://leetcode.com/problems/pascals-triangle-ii/]

Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle.

Note that the row index starts from 0.
<img width="271" alt="スクリーンショット 2019-08-09 13.52.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/181407d1-6773-b736-c7b3-2ebb58fdf8d3.png">
In Pascal's triangle, each number is the sum of the two numbers directly above it.

Example:

Input: 3
Output: [1,3,3,1]

Follow up:

Could you optimize your algorithm to use only O(k) extra space?

今度はパスカルの三角形のk行目の数列を返すことが求められています。
前回記事の問題を解けたのであれば解くこと自体は造作もないですが、$O(k)$の省メモリな解法を考えるところで深みがあります。

#### 解答・解説

##### 解法1
[前回記事](https://mhiro216.hatenablog.com/entry/2019/08/09/222336)にて以下のコードを示しましたが、

```python
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        ans = []
        if numRows > 0:
            ans.append([1])
            for _ in range(numRows-1):
                l_pre = [0]+ans[-1]+[0]
                l_nxt = [l_pre[i]+l_pre[i+1] for i in range(len(l_pre)-1)]
                ans.append(l_nxt)
        return ans
```

これを少し改変することでも解くことができました。

```python
class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        l_pre = [1]
        if rowIndex > 0:
            for _ in range(rowIndex):
                l_pre = [0]+l_pre+[0]
                l_nxt = [l_pre[i]+l_pre[i+1] for i in range(len(l_pre)-1)]
                l_pre = l_nxt
        return l_pre
```

##### 解法2
パスカルの三角形の各数列の計算は、以下のように上段の数列の片端に[0]を付けた二つの数列を足し合わせることでも計算できます。
<img width="103" alt="スクリーンショット 2019-08-10 23.44.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/aa1b0f52-bc3b-c110-152a-73354a4bef75.png">
こちらの方が解法1よりすっきりしていますね。

これを利用した解法が以下。

```python
class Solution(object):
    def getRow(self, rowIndex):
        """
        :type rowIndex: int
        :rtype: List[int]
        """
        row = [1]
        for _ in range(rowIndex):
            row = [x + y for x, y in zip([0]+row, row+[0])]
        return row
```

##### 解法3
最も空間計算量を抑えた解法はこちらかと思います。
解に必要な要素数のリストを用意し、その中でIterativeに数列を計算していく省メモリな解法です。

```python
class Solution(object):
    def getRow(self, rowIndex):
        """
        :type rowIndex: int
        :rtype: List[int]
        """
        ans = [0]*(rowIndex+1)
        ans[0] = 1
        for i in range(1,rowIndex+1):
            for j in range(i,0,-1):
                ans[j] += ans[j-1]
        return ans
```

具体的に出力変数ansの変化を見てみると、イメージが湧くと思います。(rowIndex=5)

```
[1, 1, 0, 0, 0, 0]
[1, 2, 1, 0, 0, 0]
[1, 3, 3, 1, 0, 0]
[1, 4, 6, 4, 1, 0]
[1, 5, 10, 10, 5, 1]
```
javascript A-Frameとは

#A-Frame
VR体験を構築することができるウェブフレームワークである。HTMLで簡単に作ることができる。

```html
<html>
  <head>
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
      <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
      <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
      <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
      <a-sky color="#ECECEC"></a-sky>
    </a-scene>
  </body>
</html>
```
Atcoderで使える! pythonで優先付きキュー 【ABC137 D問題】

#はじめに
8月10日21時開催の **AtCoder Beginner Contest 137**のD問題が良問で、勉強になったので、解法も含め記事にまとめます。

#問題
問題は以下の通りでした。
![スクリーンショット 2019-08-10 23.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330036/e0ff73cb-2be7-3e35-5c7b-b6b6138a2ce3.png)
(https://atcoder.jp/contests/abc137/tasks/abc137_d)

一見、**ナップサック問題**のような印象を受け、最適解求めることできるのかよ。。。と思いましたが少し考えたのち、以下のような方針で最適解が導出可能であることがわかりました。

#方針
公式の解説がまんまだったので、引用させて頂きます。
![スクリーンショット 2019-08-10 23.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330036/9f98b3f4-ced8-fb9e-c1a3-60e3d41d0c40.png)
(https://img.atcoder.jp/abc137/editorial.pdf)

- 候補の追加
- 候補の中から最大値を取り出す
- 以下、条件を満たすまで繰り返し

Atcoderでは上記を実装したい場面が度々訪れますよね、、今回、私ははじめ、単純に以下のようなコードを書いて実装しました。
とりあえずリストに追加して、毎回max関数を呼び出しているため、計算量がえげつない事になり、**TLE(実行時間超過)**でした。

今回の問題のような場合では、**優先付きキュー**を使うと高速に計算が可能です。

```python3
#標準入力受け取り
N, M = list(map(int, input().split()))
jobs = [[] for _ in range(M)]

for i in range(N):
    d, r = list(map(int, input().split()))
    if d-1 < M:
        jobs[d-1].append(r)

#解法
rewards = 0
li = []
for i in range(M):
    #候補をリストに追加(給料が間に合うもの仕事が一日ごとに増える)
    li.extend(jobs[i])
    if len(li) >0:
        #最大値を求める(給料が高いバイトをしたい)
        reward = max(li)
        rewards += reward
        #使った値は取り除く(同じバイトはNGのため)
        li.remove(reward)
    
print(rewards)
```
#優先付きキュー
https://ufcpp.net/study/algorithm/col_heap.html  を見ると完全に理解できます。
簡単にまとめると**ヒープ(heap)**という2分木を利用する事で、追加、取り出し操作を最大でも木の深さ回で実行可能な手法です。

pythonで実装する際には**heapq**というモジュールがあるので利用し、コードを改良しました。
(*ただし、heapqはMin heapのみ対応しているため全ての値にマイナスを付け反転させて利用しました*)
この実装により無事に**AC(正答)**をゲットしました。

```python3
import heapq
#標準入力受け取り
N, M = list(map(int, input().split()))
jobs = [[] for _ in range(M)]

for i in range(N):
    d, r = list(map(int, input().split()))
    if d-1 < M:
        jobs[d-1].append(-r) #マイナスにしている

rewords = 0
heap = []

#解法
for i in range(M):
    print(jobs[:i])
    #要素を一つづつヒープに追加
    for reword in jobs[i]:
        heapq.heappush(heap, reward)
    if len(heap) >0:
        #最大値(最小値)をヒープから取り出し
        reword = heapq.heappop(heap)
        print(r)
        rewards += -reword#マイナスにしている

print(rewards)
```

#まとめ
- Atcoderにおいて、データ数が多い場合には、とりあえずリストに追加はTLEの餌食
- リストで何をしたいか考えてそれにあったデータ構造にすべし
- 追加、最大(小)値取り出しの繰り返しにはヒープを用いた優先付きキュー
アコーディオンメニューをやってみた

メニューをクリックしたときに、リストが広がって表示されて、もう一度押すとリストがなくなるメニューについて調べた。
それが、アコーディオンメニューと呼ばれるものだと初めて知った。
今回はそれを実装してみた。

#ソース
アコーディオンメニューの実装方法は、`jQuery`か`CSS`の２つ。
`CSS`で実装してみた。

```accordion_practice.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>アコーディオンメニュー　練習</title>
	<link rel="stylesheet" href="base.css">
</head>
<body>
	<div id="accordion">
		<input type="checkbox" id="menu" />
		<label for="menu">メニュー</label>
		<ul>
			<li><a href="#">サブメニュー1</a></li>
			<li><a href="#">サブメニュー2</a></li>
			<li><a href="#">サブメニュー3</a></li>
		</ul>
	</div>
</body>
</html>
```

```base.css
#accordion {
  max-width: 300px;
}

#accordion #menu {
  display: none;
}

#accordion label {
  display: block;
  background: #f00;
}

#accordion ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

#accordion li {
  margin: 0;
  padding: 0;
  background: #0f0;
  height: 0;
  overflow: hidden;
  transition: 0.5s;
}

#accordion a {
  margin: 0;
  padding: 0;
  text-decoration: none;
}

#menu:checked ~ ul li {
  height: 20px;
  opacity: 1;
}
```

#解説1
`label`要素、チェックボックス、`ul`要素を使ってアコーディオンメニューを実装している。
まずは、メニューがリストではなく一つだけで表示されている状態にするのは、以下のコードで実現している。

```
#accordion li {
  margin: 0;
  padding: 0;
  background: #0f0;
  height: 0;
  overflow: hidden;
  transition: 0.5s;
}
```
重要なポイントは２つあります。

1つ目のポイントは、`overflow`プロパティを使い、値を`hidden`にすることで、リストを非表示している。
ただし、これだけでは不十分だと知った。
`height`プロパティでリストの高さを0にしないといけない。
`overflow`は表示領域からはみ出た部分を非表示にする。
リストの高さを0にすることで、文字は表示領域からはみ出る。
その結果、`overflow`プロパティの`hidden`によってはみ出た部分が非表示になり、クリックしない限り、リストが表示されない。

2つ目のポイントは、`transition`。
これのおかげで、クリック後のリストが表示されるまでの動作を実現している。
値は、リストが表示されるまでの時間を設定する。

#解説2
次に、メニューをクリックしたときの動作についてです。
以下のコードで実現している。

```
#menu:checked ~ ul li {
  height: 20px;
}
```

擬似クラス`checked`を使っている。
クリック時、チェックボックスにチェックが入った状態になります。
チェック状態の`ul`の`li`に対して、高さを設定しています。
こうすることで、リストが表示されるようになります。

#おわりに
ここまで、読んでくれてありがとうございます。
自分なりに考え、理解して、解説してみました。
ここまで、読んだ上で、自分の解説が間違えているなら、是非指摘してくれると嬉しいです。
次回は`jQuery`で実装してみようと思います。

#参考資料
[CSSでアコーディオンメニューを作成する方法【初心者向け】](https://techacademy.jp/magazine/19737)
[CSSだけでアコーディオンを作る方法（レスポンシブ＆矢印付）](https://saruwakakun.com/html-css/reference/accordion)
djagnoでログイン・ログアウト機能を作る

# はじめに
djangoでの簡単なログイン・ログアウト機能の作り方を書いてみました。

# ログイン・ログアウト機能
urls.pyに

```py
from django.contrib.auth import views as auth_views
```
を追加し、urlpatternsに

```py
urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='app/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]    
```
を追加します。
settings.pyに

```py
LOGIN_URL = 'app:login'
LOGIN_REDIRECT_URL = 'app:index'
LOGOUT_REDIRECT_URL = 'app:index'
```
を追加します。ここでは、ログイン後、ログアウト後にindexのページに移るようにしています。

ログインフォームを用意します。簡単に書くと、例えば以下のように書けます。

```html
<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="ログイン">
</form>
```

あとは、ログインページへのボタンと、ログアウトのためのボタンを作れば完成です。
Linux 版の Visual Studio Code に "open with code" 的なものを実装する

# 概要
Linux 版の VSCode には，Windows 版のコンテキストメニューから選べる`open with code`にあたるものがなく，不便です．そこで簡単なシェルスクリプトを作成して，`open with code`のような動作を可能にしました．

# 環境
 - Ubuntu 18.04.2
 - Visual Studio Code 1.37.0

# 1. VSCode の PATH が通っていることを確認する
ターミナルで以下のコマンドを実行して，VSCode が起動することを確認してください．

```
$ code
```

# 2. シェルスクリプトの作成
## 2.1 フォルダを開く

```
$ code ~/
```

のように，`code`の後ろにディレクトリを指定すると，指定したディレクトリが VSCode のエクスプローラーで開かれます．これを利用します．

## 2.2 カレントディレクトリを取得する（pwd コマンド）
実行するとカレントディレクトリで VSCode を開いてくれるシェルスクリプトを作成したいので，`code`の後ろにカレントディレクトリを自動的に指定してくれるようにすれば良さそうです．

カレントディレクトリは`pwd`コマンドで取得することができます．

```
$ pwd
/home/ユーザー名
```

ホームディレクトリで`pwd`コマンドを実行すると，コマンドを実行したディレクトリの絶対パスが返ってきます．

## 2.3 作成する
以上の２つを組み合わせて，以下のようなシェルスクリプトを作成しました．

```
$ sudo nano opencode
```

```bash:opencode
#!/bin/sh
code `pwd`
```

正直使うたびに手打ちしてもいいぐらい短いです．
実行権限を与え，実行してみます．

```
$ sudo chmod a+x opencode
$ opencode
```

`opencode`を実行したディレクトリで VSCode が開かれれば成功です．

# 3. PATH を通す
あとは作成した`opencode`の PATH を通して，どこからでも`opencode`を実行できるようにすれば便利です．
私はホームディレクトリに作成した`Scripts/`に`opencode`を移動して，`Scripts/`の PATH を通します．

```
$ mkdir Scripts
$ mv opencode Scripts
$ sudo nano /etc/profile
```

```:profile
# 追加
export PATH="$PATH:/home/ユーザー名/Scripts"
```
PATH に反映させるために再起動します．

```
$ reboot
```

PATH に反映されているか確認します．

```
$ printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/ユーザー名/Scripts
```

先程 /etc/profile に追加したパスが表示されていれば成功です．

```
$ opencode
```

このコマンドを実行すれば，コマンドを実行したディレクトリで VSCode が開かれるはずです．
なぜかPytubeが使えない...って方へ

# Pytubeが使えない！
Pytubeを使ったダウンローダーを制作しました。
[Youtubeからmp3やmp4をダウンロードする。(コード提供)](https://qiita.com/Cyber_Hacnosuke/items/d722eae05d6f7c41a9b7)

2019年5月ごろからPytubeが謎のエラーを吐き出して動かないということがあるようです。

```
    ...
    signature = cipher.get_signature(js, stream['s'])
KeyError 's'
```
これは...俺らの問題じゃないやん..と思ってGithubとかStackOverFlowをしらべまくったり、中身を読んだりしました。(6月に)

# 結果
結果を言うと...
`mixins.py`ってファイルの設計が間違ってました。中身を変えればいいようです。

```python:古いほうの40行目
if 'signature=' in url:
```

```python:新しいやつの40行目
if ('signature=' in url) or ('&sig=' in url) or ('&lsig=' in url):
```

めんどいかたは修正済み``mixins.py``を作ってやったから上書きしてくれ...
https://github.com/CyberHacnoshuke/mixins.py

備考
https://www.erestage.com/etc/pytube-signature-error/
同じことやってる方がいました。パクってない。ほんと！僕が先だから！(記事は遅かった)
# 実は対応している！？
この記事を書くためにGithubをあさっていたところなにやら新しい`Commit`が...

```python:公式さんの新しいやつの41行目
if any([x in url for x in ['signature=', 'sig=']]):
```
これは大丈夫なのかな...？無駄な努力でしたw
Web Share APIの利用はまだPC対応していないので注意

## Web Share APIの利用はまだPC対応していないので注意
こちらのcaniuseの結果をみてもわかる通り、Mac,iOSのSafariとAndoirdのChromeにしか対応していません。
https://caniuse.com/#search=web%20share%20api

使う場合は注意してください。
この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
EDA (Exploratory Data Analysis)ってなんだろう？

# はじめに
Kaggleの入門サイトとかをあさっていると、頻繁に「KernelでEDAの記事を見てみましょうか」とか
何かにつけてEDAという単語に触れる機会があり、「これは一般名詞なの？Kaggleのローカル用語なの？」ってところがモヤモヤしており、せっかくの機会なので調べることにしました。

# 参考サイト
とても丁寧に時間をかけてその重要性を説明していただけた
https://www.codexa.net/basic-exploratory-data-analysis-with-python/

# 結論から…
・EDAは"Exploratory Data Analysis"の略称
・日本語訳で「探索的データ解析」となる
・データの特徴を探求し、構造を理解することを目的とした初動調査

# EDAの目的
>まずはデータに触れてみて、データを視覚化したり、データのパターンを探したり特徴量やターゲットの関係性/相関性を感じるとるのが目的です。

>問題を解決する前に、どのようなデータセットを扱っているのか、どのような状況にあるのかをしっかりと理解するのが重要であり、「探索的データ解析（EDA）」はまさしくそれを目的とした作業となります。

# 手法
手法自体はいろいろあるのでそれこそいろんなサイトで調べたらわんさか出てくると思った。
ここでは大雑把な枠組みだけメモする
・データの外観確認
　最初の5行、最後の５行
　各カラムの数量、平均、分散などなど
　データ自体の情報（カラム数、行数、データ量など）
　カラムの各値の分析（数量、平均、分散などなど）
・データの加工
　不要列の削除
　フィルタリング（特定期間のみの抽出、特定値のみ除外など）
　並べ替え、重複除外
　外れ値（＝null値）の除外、null値の変換（特定文字への置換（null→N/A)、
・データの可視化
　ヒストグラム
　散布図

# EDAをすると得られるメリット
データを理解することでより適切なモデルの選択を行うことができたり
データをより理解することで特徴量エンジニアリングにおいて重要になってきたり
とあるそうだ。
そもそも問題を理解するためにデータを深く理解することは当然のアプローチなので
気づかないうちに仕事でもやってることだったので、意味が分かれば「なるほどね！」と
言えることが多かった。

## メモ…
全然関係ないけどあとで読み返そう・・・
[Kaggleにおける「特徴量エンジニアリング」の位置づけ　〜『機械学習のための特徴量エンジニアリング』に寄せて〜](https://upura.hatenablog.com/entry/2019/02/22/221125)
hello, world

### C
```c:main.c

#include <stdio.h>

int main(int argc, char* argv[]){
 printf("hello, world¥n");
 return 0;
}
```
```makefile:Makefile
a.out:main.c
	gcc -g main.c
	./a.out
```
### GNU as
#### x86_64
```:main.s
.globl  main
main:
    pushq   %rbp
    movq    %rsp, %rbp
    leaq    msg(%rip), %rdi
    call    puts@PLT
    movl    $0, %eax
    popq    %rbp
    ret
msg:
    .asciz "hello,world"
```
```makefile:Makefile
a.out:main.s
	gcc -g main.s
	./a.out
```
#### arm32
```:main.s
.global main
main:
        mov r0, $0x01
        adr r1, msg
        mov r2, $0x0d
        mov r7, $0x04
        svc $0x00
        mov r0, $0x00
        mov r7, $0x01
        svc $0x00
msg:
        .asciz "hello,world\n"
```
```makefile:Makefile
a.out:main.s
	gcc -g main.s
	./a.out
```

### C++
```c++:main.cpp
#include <iostream>
using namespcae std;

int main(int argc, char* argv[]){
	cout << "hello, world" << endl;
	return 0;
}
```
```makefile:Makefile
a.out:main.cpp
	g++ -g main.cpp
	./a.out
```
### Java
```java:Main.java
public class Main{
	public static void main(String[] args){
	System.out.println("hello, world");
	}
}
```
```makefile:Makefile
Main.class:Main.java
	javac -g Main.java
	java Main
```

### JavaScript
```javascript:main.js
console.log("hello, world\n");
```
```makefile:Makefile
all:
	node main.js
```
###scheme
```scheme:main.scm
(display "hello, world\n")
```
```makefile:Makefile
all:
	guile -s main.scm
```
### Common Lisp(executable binary)
```common-lisp:main.cl
(defun main()
 (print "hello, world")
 (ext:exit 0))
(ext:saveinitmem "a.out"
 :quiet t
 :init-function #'main
 :executable t)
```
```makefile:Makefile
a.out:main.cl
	clisp main.cl
	./a.out
```
### FORTRAN
```fortran:main.f90
program main
 print *,'hello, world'
end program main
```
```makefile:Makefile
a.out:main.f90
	gfortran main.f90
	./a.out
```
### Perl etc.
```perl:main.script
print "hello, world¥n";
```
```makefile:Makefile
all:
	perl main.script
	python main.script
	ruby main.script
```
### PHP
```php:main.php
<?php
print "hello, world\n";
```
```makefile:Makefile
all:
	php main.php
```
オリジナルアプリのまとめ（自分用）

1.　アプリについて
-
　Footan => https://footan.herokuapp.com/

　アプリの名前は『 Footan 』です。food × 探索( ≒検索 )で組み合わせて付けました。
　アプリの概要は自分の好きな店の料理をほかの人と共有できるアプリです。
　制作目的は人にとって食事は幸福の時間だと思い、その喜びを他人と共有できたり紹介出来たりすると、嬉しくなると思ったからです。
　機能について下記に述べます。
　- 投稿一覧機能
　- 投稿詳細表示機能
　- 投稿/編集/削除機能
　- ログイン機能
　- 画像添付機能
　- ぐるなびAPIを用いた店舗検索機能

2.　開発環境について
-
　AWSのcloud9上でコードを書きました。
　今回用いた言語はRuby 2.5.3とrails 5.2.2です。
　データの管理はgithub、設計はcacoo、デプロイはherokuを用いました。

3.　制作手順について
-
企画=>設計=>プログラミング=>デプロイという流れでやりました。

　まず初めに企画をしました。1.で述べたようなアプリを作りたいと考えました。
　次にcacooを用いた設計をしました。サイトマップ、ワイヤーフレーム、データベース図を描きました。
　サイトマップはWebサイトにあるページの一覧を書き出した設計図です。
　ワイヤーフレームは実際のWebサイトのレイアウトを描きだしたものです。
　データベース図はテーブルの構成を書き出したものです。別名ER図とも呼ばれます。
　次にプログラミングですが、今回の記事の大部分となるため、次の章で述べます。
　最後にherokuでデプロイしました。開発環境と本番環境でエラーが出る違いがありました。

4.　プログラミングについて（分かりにくかったこと)
-
　流れとしてトップページ=>ユーザー関連=>ログイン機能=>店舗検索=>投稿機能=>いいね機能の順で作りました。
　タイトルのようにいろいろと書いていると量が膨大になってしまうので、わかりにくかった部分を書いてアウトプットしたいと思います。

 passqord_digest, has_secure_password: パスワードを平文で表示するのは危険なため暗号化する。またpassword, password_confirmationのカラムを作成する。

require_user_logged_in : 事前にユーザーのログインが必要という意味

correct_user : ユーザーがcurrent_userか見極め、違った場合ページに入らせない

Shop.find(params[:id]) : Shopクラスの該当するidをもつデータを探し出す

**API部分**
require 'net/http'
require 'json'
require 'uri'　を最初の部分に書いておく

 base_url='https://api.gnavi.co.jp/RestSearchAPI/v3' : 親元のURL。この下にパスが加わることでいろいろなページに飛ぶ。

freeword = params[:search] : toppageで入力されたものが受け渡しされ、それをfreewordに代入

parameters = {
      'freeword' => freeword,
      'format' => 'json',
      'keyid' => ENV['GURUNAVI_API_KEY']
      }
それぞれのパラメータに指定が入り、それをparametersとする。keyidは人によって変わる。ENVで隠ぺいを行っている。

uri = URI(base_url + '?' + parameters.to_param) : ここである程度のurlを絞りこむbase_urlにparametersを組み合わせる。

response_json = Net::HTTP.get(uri) : 結果をJSON形式で受け取る

response_data = JSON.parse(response_json) : JSON形式のデータを可読化

rests = response_data['rest'] : その結果のrest部分だけをrestsに代入する

@rests = []
rests.each do |rest|
　Shop.find_or_initialize_by(shop_code: params[:shop_code])
  　shop.shop_code = rest['id'] 
    shop.name = rest['name']
　end
 @rests << shop
end
　@restsを配列に設定する。restsを繰り返し処理を行って分ける。その時にもし新しくshop_codeが見つかったらshop_codeを作成する。rest['']というかたちで特定のデータを取り出して、代入する。@restsに得たshopのデータを受け渡す。

**画像添付機能**
gemfileにgem 'carrierwave'を追加したbundle install
rails g uploader imageで画像アップロード用のクラスを作る
データベースに画像アップロード用のカラムを追加する。
mount_uploader :image, ImageUploader
を実装したいクラスに追加
ストロングパラメータにimageカラムを追加
viewファイルに
<%= form_for(@user) do |f| %>
    <%= f.file_field :image %>
　　<%= f.submit '更新する', class: 'btn btn-primary' %>
<% end %>
という風に書く。

5. 大変だったこと
-
　やはり4.で書いたAPI機能です。ものすごい数のエラーにやられて、１週間ぐらい悩みました。API機能については実際に用いてプロジェクトを作っているという記事を見つけられなかったです。本当にわからなかったため、メンターの方に質問して教えてもらいながら作りました。そのおかげである程度どういう風にデータを取り出せばよいかわかりました。難しくて扱えなかった機能がちゃんと動作したときはすごいうれしかったです。

6. 改良点
-
　現在はフリーワード検索のみしかないがこだわり検索みたいに条件を絞り込んで検索する機能を追加してもいいと思った。そうすれば自分にマッチしたお店が見つけやすくなると考えたからです。
　画像の大きさがバラバラなのも見栄えが悪いのでそろえればもっといいアプリになると考えている。
　スマホなどで開くとレイアウトが崩れてしまうのでレスポンシブデザインをこだわる
SQLでランダムな行を取得する

# はじめに
とあるテーブルからランダムな一行を取得したいときがたまにあります。テストデータとしてランダムなサンプルが欲しいときなどが良い例でしょう。
ランダムな結果を返すSQLについて「SQLアンチパターン」第15章に載っていたので自分なりにまとめます。

## 案1: データをランダムにソートする
```SQL
SELECT * FROM Users ORDER BY RAND() LIMIT 1;
```

### メリット
わかりやすく、実装が簡単。

### デメリット
インデックスのメリットを得られず、テーブル全体をソートするため、行数が多くなるとパフォーマンスが下がる。

### 使いどころ
行数が少なく、今後大きく増えることもないであろう場合 ( 例えば47都道府県など ) 。

## 案2: 1と最大値の間のランダムなキーを選択する
```sql
SELECT u1.* 
  FROM Users AS u1
 INNER JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM Users)) AS rand_id) AS u2
    ON u1.id = u2.rand_id;
```

### メリット
テーブル全体のソートを避けられる。

### デメリット
主キーが連続していない ( 欠番が存在する ) 場合、ランダム値が欠番だった場合結果がなくなる。

### 使いどころ
1から主キーの最大値までのすべての値が使用されていることが確実な場合。

## 案3: 欠番の後にあるキーを選択する
```sql
SELECT u1.*
  FROM Users AS u1
 INNER JOIN (SELECT CEIL(RAND() * (SELECT MAX(id) FROM Users)) AS id) AS u2
    ON u1.id >= u2.id
 ORDER BY u1.id
 LIMIT 1;
```

### メリット
テーブル全体のソートを避けられ、欠番があっても結果がなくなることがない。

### デメリット
欠番の一つ後ろのキー値が採用される確率が高くなる。

### 使いどころ
欠番がめったにない場合や、均等に選ばれることがそれほど重要ではない場合

## 案4: すべてのキーのリストを受け取り、ランダムに一つ選択する
```sql
SELECT id FROM Users; 
-- 上の結果をリストに格納し、ランダムに一つ選択する
SELECT * FROM Users WHERE id = ?;
-- バインドパラメータには、選択したランダムな値を指定する
```

### メリット
テーブル全体のソートを回避でき、キー値もほぼ平等に選択される。

### デメリット
テーブルからすべての id を取得する際、リストが非常に大きくなり、メモリのリソースを超える可能性がある。
また、クエリを二回発行する必要がある。

### 使いどころ
ほどほどのサイズのテーブルからランダムな行を選択する場合。特に主キーが非連続なテーブルに対して便利。

## 案5: オフセットを用いてランダムに行を選択する
データセットの行数をカウントし、0と行数までの間の乱数を返す技法です。

```sql
SELECT ROUND(
  RAND() * (SELECT COUNT(*) FROM Users)
) AS id_offset;
-- アプリケーションコードで id_offset 取得
SELECT * FROM Users LIMIT 1 OFFSET :offset;
-- :offset に id_offset を使用する
```

### メリット
テーブル全体のソートを回避でき、キー値もほぼ平等に選択される。

### デメリット
クエリを二回発行する必要がある。

### 使いどころ
キー値が連続しておらず、各行が平等に選択される必要がある場合。

## 備考: ベンダー依存の解決策
多くのデータベース製品で、ランダムな値を返すための独自の解決策が実装されているそうです。
お使いのデータベース製品にもより便利な方法が存在するかもしれませんので、調べてみてください。
Facadeって何？？

Facadeって言うのはデザインパターンの一つです笑

デザインパターンっていうのは、
オブジェクト指向においてよく使われる設計をパターン化したもの。
パターンの一つ一つの内容を明確にして、例えば「データのアクセスするもの」みたいに決まった役割を持たせたものです！
使われ方としては「〜Facade.java」みたいな感じでクラスとして（メソッドの場合もあり）使われます。

じゃあ本題のFacadeについて。


・Facade

別々の役割を持つクラスたちを、この順で処理を行うよっ！って一連の手順をセットにして実行してくれるデザインパターンです笑

例えば「マスタのデータを更新処理を行う」っていうFacadeがあったとするなら、
1.入力情報の設定をさせる。（VO）
2.VOに設定されたものをBeanに詰め替える。
3.Beanの値を引数にして登録、更新する、controllerを実行する。

みたいな感じでどれか一つ処理がかけたらまずいものをFacadeのクラスorメソッドでセットでやっちゃうよーってものです。

まあMVCでいうところのCの入り口ってイメージでいいかなーと思います笑

パッと見これっているのかな？って思うかもしれないですけど、これがあれば処理の途中が抜けてないかチェックしやすいので、システム改修の時とか便利だと思います笑

是非使ってみてください笑笑
[CentOS7.6]スタンドアロンでVulsとVulsrepo試してみた。

#はじめに
面談の時に
俺「俺自宅サーバ作ってるんすよｗｗｗCLIでコマンド叩いたりも余裕ｗｗ」
相手「セキュリティ対策はどんなことをしてるの？」
俺「」
なんてことがあったのと、
最近ウィルス検知でアクセス元の把握だったり、脆弱性対応で環境的に対策が必要かどうか。ともかくセキュリティに関わる機会が増えました。セキュリティ専門の部署でもなんでもないんですけど。

そんなわけで、セキュリティ関連の情報でぐぐる機会も増えたわけですけど、やっぱり「セキュリティ意識に欠ける人間が多い。」というような愚痴も多く目にするようになりまして。

そんなわけでちょっとVulsを試してみました。

#Vulsインストール
https://vuls.io/docs/ja/tutorial-local-scan.html
基本的には公式の通りにコマンド叩けば大丈夫なのですが、いくつか注意事項があります。
###普通のユーザでインストールする
sudoコマンド打つから当たり前と言えば当たり前ですが、rootユーザではなく普通のユーザでインストール手順は実行します。
###Vuls動作用のユーザを用意する。
公式の通りにコマンドを叩くとユーザホーム配下にディレクトリが作成されます。それが困る人はVulsユーザを用意すると良いと思います。
###作成したユーザに対してsudoを有効にしておく。
https://qiita.com/Esfahan/items/a159753d156d23baf180
コマンドで何度かsudoが出てきます。有効にしないと弾かれます。

###chownは全て読み替える
```
chown centos /var/log/vuls
```
このままでは実行できませんので「centos」自身のユーザに置き換えてください。
（普通だったらそんなユーザ居ないよ。とエラーが出るのでそこで気付けるけど。）


これで問題なくインストールできると思います！
なお、「Deploy go-exploitdb」のところなのですが、エラーが出ました。エラーについてはよくわかってないですが、スキップしても良いとか書いてあるし気にせず進みました（

#Vulsrepoインストール
https://qiita.com/takahashi-kazuki/items/7c75ba779b3af1e32bc0
基本的には上記のインストール手順を参考にしました。
ただし、パスの指定については公式通りにインストールしたとしたら以下の通りになってる筈なので、読み替えが必要です。

```
rootPath = "/home/ユーザ名/vuls/vulsrepo"
resultsPath  = "/home/ユーザ名/vuls/results"
```

#実行
https://vuls.io/docs/ja/tutorial-local-scan.html
これも公式サイトの記載に従います。AWSではないので、Step3からやります。

準備が整ったらvuls scan実行。
次にvuls report実行。
とりあえず、どれだけの脆弱性があるか、さらっと確認したい時は「vuls report -format-one-line-text」で実行。

```
$ vuls report -format-one-line-text
.
.
[Reboot Required] localhost     Total: 222 (High:48 Medium:139 Low:35 ?:0)      0/222 Fixed     491 installed, 0 updatable      0 exploits      en: 10, ja: 2 alerts
```

うそ…私のサーバ、脆弱性多すぎ…？
yum updateは普段からやってるのに。

#Vulsrepoで見る
VulsrepoはVulsの結果をWebで見れるらしい。早速見てみる。
![2019-08-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374426/d8b30c55-9be7-4cc7-e2a9-f8307d528df0.png)

とりあえず、どんな影響度の脆弱性がどれだけあるかはわかるんですけど、肝心の脆弱性の内容がわかりません。どこかで確認できるかもしれないですけど、英語はわからないのでわからないです。

#TUIで結果を見る
そんなわけでCLIから確認します。
vuls tui
![2019-08-10 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374426/2c0126ec-35f8-f3b6-b4ce-b9365f4abf32.png)

すごいわかりやすいですね！

#脆弱性対応をしてみる。
上記の結果からとりあえずbashのアップデートをしたいと思います。
yum updateは普段からやってるのでおそらくリポジトリには無いのだと思います。
https://qiita.com/takahirono7/items/5dd99bcc4202d289103b
というわけで、上記サイトを参考にbash 4.4を入れました！

```
# bash --version
GNU bash, バージョン 4.4.12(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```
※patchが入ってない際はインストールが必要な場合もあります。その時はyum install patchでインストールしましょう。

結果を見てみましたが、脆弱性通知は消えません…。
bash 4.4をインストールしたからと言ってbash 4.2が消えるわけではないということでしょうか？
rpmでの確認結果は以下の通り。

```
# rpm -q bash
bash-4.2.46-31.el7.x86_64
```
どういうこっちゃ

とりあえず、Vulsを試すというタイトルの目的はすでに達成できてるのでここまでにしますか。
Hyper-Vが有効な状態でVirtualBox6.0でUbuntu(64bit)が起動できたが・・・

#今まで
Core i5-4300U のSurface Pro 3 くらいしか設定変更なしに
Hyper-VとVirtualBox6が共存できたという報告を見なかった

#VirtualBoxの掲示板
VirtualBox 6.0 and Hyper-Vのスレッドで
最近新たな設定方法が投稿されていた。
```ExtraData section of the %userprofile%\.VirtualBox\VirtualBox.xml config file.
<ExtraDataItem name="VBoxInternal/NEM/UseRing0Runloop" value="0"/>
```
https://forums.virtualbox.org/viewtopic.php?f=6&t=90853&start=120#p454358

#追試
Core i5-6500のＰＣで 
VirtualBox6.0.10 と　Windows10 Insider Preview Build 18956
でHyper-Vを有効にした状態で
VirtualBox.xmlの設定変更なしでは起動しないが
VirtualBox.xmlを上記のように変更した後では
Ubuntu(64bit)が起動してデスクトップ画面まで表示された。

ただし、最初の起動時にエラーが出て止まってしまったのでＶＭのリセットをかけた。起動してしばらくすると　Ubuntuの”システムプログラムの問題が発生しました”ダイアログ表示される（継続動作できるが）。

より詳しい方の追試をお願いしたい。
WebStorm + React + eslint （静的解析ツール）のセットアップ


#### eslint のパッケージをインストール

```
yarn add -D eslint
yarn add -D eslint-plugin-react
yarn add -D babel-eslint
yarn add -D eslint-config-airbnb
yarn add -D eslint-plugin-jsx-a11y
yarn add -D eslint-plugin-import
```

#### `.eslintrc` を追加

```json
{
  "parser": "babel-eslint",
  "extends": [
    "airbnb"
  ],
  "globals": {
    "window": true
  },
  "rules": {
    "no-shadow": "off"
  }
}
```

#### その他参考情報

- ESLintからのコードスタイルの適用
    - https://pleiades.io/help/webstorm/eslint.html#ws_js_linters_eslint_import_code_style_from_eslint
- 他例外の対応
    - `ESLint: A space is required before closing bracket (react/jsx-tag-spacing) `
        - https://intellij-support.jetbrains.com/hc/en-us/community/posts/360001870260-ESLint-A-space-is-required-before-closing-bracket-react-jsx-tag-spacing-
    - `[ESLint] "window" is not defined`
        - https://qiita.com/uggds/items/301c1c43f8b9ffbc52d7

- ESLintでTypeScriptコードをチェックしたくない場合は、.eslintignore ファイルに .ts または .tsx を追加する
【matplotlib基礎】複数のグラフを重ねて表示する

#概要
複数のグラフを比較をしたいときなどに，重ねて描画する方法をまとめていきます．
グラフの描画には、

- MATLAB的な書き方
- オブジェクト指向な書き方

の2種類があります．よくわからなかったらオブジェクト指向の方を使えばいいのかなと思います．
この記事もオブジェクト指向でいきます．

#動作環境
- Windows10(64bit)
- Python 3.7.2

#コード

```py:graph_overlap.py
"""複数のグラフを重ねて描画するプログラム"""
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

t = np.linspace(0, 10, 1000)
y1 = np.sin(t)
y2 = np.cos(t) 
y3 = np.abs(np.sin(t))
y4 = np.sin(t)**2

c1,c2,c3,c4 = "blue","green","red","black"      # 各プロットの色
l1,l2,l3,l4 = "sin","cos","abs(sin)","sin**2"   # 各ラベル

ax.set_xlabel('t')  # x軸ラベル
ax.set_ylabel('y')  # y軸ラベル
ax.set_title(r'$\sin(x)$ and $\cos(x)$') # グラフタイトル
# ax.set_aspect('equal') # スケールを揃える
ax.grid()            # 罫線
#ax.set_xlim([-10, 10]) # x方向の描画範囲を指定
#ax.set_ylim([0, 1])    # y方向の描画範囲を指定
ax.plot(t, y1, color=c1, label=l1)
ax.plot(t, y2, color=c2, label=l2)
ax.plot(t, y3, color=c3, label=l3)
ax.plot(t, y4, color=c4, label=l4)
ax.legend(loc=0)    # 凡例
fig.tight_layout()  # レイアウトの設定
# plt.savefig('hoge.png') # 画像の保存
plt.show()
```

実行結果は以下のようになります．

![graph_overlap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433790/fc2a3667-5b1d-688e-e768-5e2bd42acef4.png)

#解説

- fig, axオブジェクトの作成

```py
fig, ax = plt.subplots()
```

- x軸のベクトル作成

np.linspace(strat, end, num)はstartからstopまでnum個の等間隔の一次元ベクトルを返します．

```py
t = np.linspace(0, 10, 11)
```

これとに似たものに，np.arange(start, end, step)があります，これはstartからend-1までstep間隔の一次元ベクトルを返します．

```py
t = np.arange(0, 11, 1) 
# t = np.arange(11) これでも全く同じ．
```

- ラベル名の設定

```py
ax.set_xlabel('t')
ax.set_ylabel('y')
```

- グラフタイトルの設定

```py
ax.set_title(r'$\sin(x)$ and $\cos(x)$') # グラフタイトル
```

- 罫線の挿入

```py
ax.grid()
```

- 描画範囲の設定

```py
ax.set_xlim([-10, 10])
ax.set_ylim([0, 1])
```

- 凡例の表示

locは以下のように指定する．(matplotpib公式ドキュメントより)
文字列で指定しても、数値で指定してもよい。

|場所|文字列|数値|
|:-:|:-:|:-:|
|ベスト|'best'|0|
|右上|'upper right'|1|
|左上|'upper left'|2|
|左下|'lower left'|3|
|右下|'lower right'|4|
|右|'right'|5|
|左中央|'center left'|6|
|右中央|'center right'|7|
|中央下|'lower center'|8|
|中央上|'upper center'|9|
|中央|'center'|10|


```py
ax.legend(loc=0) 
```

- レイアウトの設定

```py
fig.tight_layout()
```

- 画像の保存

```py
plt.savefig('hoge.png')
```

- グラフの表示

```py
plt.show()
```

#まとめ
いかがだったでしょうか？
グラフを重ねて描画して比較したいときはよくあると思うのでそのようなときに便利だと思います．
コードに関して建設的な意見があればコメントいただけると助かります．
Docker for mac のコンテナ内の処理で出た音をmacで聞く

音関連の実験・開発・機械学習なんかをしたい時、音関連のモジュールは依存関係のインストールをするのがややこしく、Dockerを使うと「Linux」という統一的な環境下で自由にセットアップできるのでやりやすい事が多々あります。

ただ、「処理に関して」はそうなんですが、実際に生成された音を聞きたい時、Dockerで作られた仮想環境にはもちろんスピーカーが存在しませんので音は鳴りません。

wav等のファイル化をすればホストPCで簡単に聞くことはできますが、場合によっては多少面倒なのと、システムが直接音を生成しながら実行させたい場合、聞きながら実行することができません。

ではどうしたら良いかと言うと、pulseaudioというものを使います。

# pulseaudioとは

本来は「サウンドサーバー」と呼ばれるもので、音に関するデータを受け取ったり配信したりと、音をコントロールしてくれるもののようです。（正直詳しい事は結構複雑なのでまだわからない…）

丸投げ） https://ja.wikipedia.org/wiki/PulseAudio

# Dockerとmacを繋ぐには

結果的に音が出るまでの流れ

① ホストのMacにpulseaudioをインストール

```
$ brew install pulseaudio
```

② ホスト側でpulseaudioのデーモンを起動する

```
$ pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon
```

確認

```
$ pulseaudio --check -v
W: [] caps.c: Normally all extra capabilities would be dropped now, but that's impossible because PulseAudio was built without capabilities support.
I: [] main.c: Daemon running as PID 1747
```

③ Dockerfileに以下を記載する

```
apt-get install -y pulseaudio
```

④ 環境変数`PULSE_SERVER`に`docker.for.mac.localhost`を設定し、
ホストMacの`~/.config/pulse`をDocker内のユーザーディレクトリ`/root/.config/pulse`(rootユーザーの場合)にバインドする

docker-compose.ymlの場合

```
version: "3.3"
services:
  service_name:
    build: .
    environment:
      - PULSE_SERVER=docker.for.mac.localhost
    volumes:
      - type: bind
        source: ~/.config/pulse
        target: /root/.config/pulse
```

dockerコマンドで立ち上げる場合

```
$ docker run -it -e PULSE_SERVER=docker.for.mac.localhost -v ~/.config/pulse:/root/.config/pulse [imagename] [cmd]
```

⑤ 後はお好きにプログラムから音を出してみよう

この手順で一応デフォルトの出力デバイスがMac側のスピーカーへとつながっている状態になり音が出るはずです。
ただし、どうしてもこういうハードウェアに直に絡んでくる系は、OS・ライブラリ・モジュールのバージョンが少し変わることで動作が変わることもあるので本当は音声データの流れを正しく理解した上で使いたいのが本音。。

# 留意点
上記の手順でMacの本体スピーカーと「有線」イヤホンであれば音が聞こえましたが、BluetoothイヤホンをMacに繋いだ状態だと音が出ませんでした。

おそらくMacが音を出力する先が、本体スピーカーはもちろんデフォルトのオーディオデバイスだと思うのですが有線のイヤホンの場合はネイティブに切り替えてくれるのだと思います。
Bluetoothの場合はそれが仕組み上違うのかな、、と想像していますが、厳密な所はもう少し詳しく理解する必要がありそうです。
React + webpack の開発環境構築

#### プロジェクト作成

```bash
yarn init
yarn install
```

#### react / reducx開発に必要なパッケージのインストール

```bash
yarn add prop-types react react-dom react-router-dom redux react-redux redux-thunk redux-form
yarn add -D redux-devtools-extension
```

#### css/sass & webpack 関連のパッケージのインストール
 
```bash
yarn add extract-text-webpack-plugin@next node-sass style-loader css-loader sass-loader 
yarn add webpack webpack-dev-server webpack-cli
```

#### ESコンパイラ関連のインストール

```bash
yarn add babel-core babel-loader babel-preset-es2015 babel-preset-react babel-preset-stage-2 
yarn add @babel/core @babel/preset-env @babel/preset-react
```

#### 独自環境変数ファイルの作成 （ `.env.js` を作成。内部の変数は必要に応じて変更する。 ）

```javascript
export default {
  apiUrl: 'http://localhost',
};
```

#### `webpack.config.js` の以下の構成にする。
    - publicフォルダの位置は、環境に応じて変更する

```js
const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');

const publicDir = path.join(__dirname, 'public');
module.exports = [
  {
    mode: 'development',
    entry: {
      index: './src/index.jsx',
    },
    output: {
      path: publicDir,
      publicPath: '/',
      filename: 'bundle.js',
    },
    module: {
      rules: [
        {
          exclude: /node_modules/,
          loader: 'babel-loader',
          query: {
            presets: ['@babel/preset-env', '@babel/preset-react'],
          },
        },
      ],
    },
    resolve: {
      extensions: ['.js', '.jsx'],
      alias: {
        userEnv$: path.resolve(__dirname, '.env.js'),
      },
    },
    devServer: {
      historyApiFallback: true,
      contentBase: publicDir,
    },
  },
  {
    mode: 'development',
    entry: {
      style: './src/stylesheets/index.scss',
    },
    output: {
      path: publicDir,
      publicPath: '/',
      filename: 'bundle.css',
    },
    module: {
      rules: [
        {
          test: /\.scss$/,
          loader: ExtractTextPlugin.extract({
            fallback: 'style-loader',
            use: ['css-loader', 'sass-loader'],
          }),
        },
      ],
    },
    plugins: [
      new ExtractTextPlugin('bundle.css'),
    ],
  },
];
```

#### 参考: 独自環境変数の利用方法

```javascript
import userEnv from 'userEnv';
console.log(userEnv.apiUrl);
```
git で issueベースのタスク管理をしている時、ブランチを切るのを簡略化(fish)

# git で issueベースのタスク管理をしている時、ブランチを切るのを簡略化(fish)
develop　ブランチに戻ってpullすることが非常に多いので、
``git checkout develop && git pull`` と打つのが最近面倒です。
``git push`` した後に違うissue（タスク）に移ろうとすると ``git checkout develop && git pull && git checkout -b issue/#30`` とか打たなくてはならず面倒です。
*alias*を登録しました


```
alias develop='git checkout develop && git pull'
function issue
git checkout develop
git pull
git checkout -b issue/#$argv[1]
git commit -m "fix #$argv[1]" --allow-empty
git push --set-upstream origin issue/#$argv[1]
end
```   
## 永続化させるために

```
funcsave develop
funcsave issue
```

## 参考文献
- [いまさらfishを触ってみた](https://qiita.com/stnamco/items/51663e85f4f7c35c0774)
Mac OSX上に立てたVM環境にOracle Grid Infrastructure 12cR1をインストールする際のトラブル

## 環境

* Oracle Grid Infrastructure 12.1.0.2
* Oracle Linux 6.5
* VirtualBox 6.0 (5.0以降も同様のはず) または Parallels Desktop 14
* Mac OSX Mojave

## 現象

Grid Infrastructureインストール時に、Linking RMAN Utilityの過程で、

`Error in invoking target 'irman ioracle' of makefile '/u01/app/gi/12.1.0/grid/rdbms/lib/ins_rdbms.mk'.`

というメッセージダイアログが出ます。

![error1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10290/774f974e-ac02-46bf-6793-e2b37a8d7daf.png)

それ自体は、`libjavavm12.a`を`$GRID_HOME/lib/`にコピーして再実行すると回避できるのですが、その後、以下のようなメッセージで、rootスクリプトの実行で詰まることとなります。

```
/u01/app/12.1.0/grid/crs/config/rootconfig.sh: line 131: 16191 Segmentation fault      (core dumped) $ROOTSCRIPT $ROOTSCRIPT_ARGS
The command '/u01/app/12.1.0/grid/perl/bin/perl -I/u01/app/12.1.0/grid/perl/lib -I/u01/app/12.1.0/grid/crs/install /u01/app/12.1.0/grid/crs/install/rootcrs.pl  -auto -lang=en_US.UTF-8' execution failed


 Execution status of node1 is:true
 Execution exit code of node1 is:139
```

## 対処

インストールする前の状態に巻き戻した後、VMを停止し、各仮想化製品の機能でCPUIDフラグを編集します。

例えばVirtualBoxの場合、以下をホスト(操作端末)で実行します。

```
VBoxManage setextradata VM_NAME "VBoxInternal/CPUM/HostCPUID/Cache/Leaf"        "0x4"
VBoxManage setextradata VM_NAME "VBoxInternal/CPUM/HostCPUID/Cache/SubLeaf"     "0x4"
VBoxManage setextradata VM_NAME "VBoxInternal/CPUM/HostCPUID/Cache/eax"         "0"
VBoxManage setextradata VM_NAME "VBoxInternal/CPUM/HostCPUID/Cache/ebx"         "0"
VBoxManage setextradata VM_NAME "VBoxInternal/CPUM/HostCPUID/Cache/ecx"         "0"
VBoxManage setextradata VM_NAME "VBoxInternal/CPUM/HostCPUID/Cache/edx"         "0"
VBoxManage setextradata VM_NAME "VBoxInternal/CPUM/HostCPUID/Cache/SubLeafMask" "0xffffffff"
```

[Oracle VM VirtualBox を用いた Oracle Real Application Clusters (RAC) 12c Release 1 環境の構築](https://www.oracle.com/technetwork/jp/database/enterprise-edition/documentation/raconvbox-db12101onol6u4-2080481-ja.pdf)に従ってやっている場合は、VM_NAMEの部分を`node1`と`node2`に置き換えて実行する感じです。

> 現時点での最新(VirtualBox 6.0.10)にて、上記の方法でGrid Infrastructureのインストールに成功するところまで確認しました。

## 原因

Oracleに同梱しているPerlには、L4キャッシュが存在するCPUを搭載するマシンでの動作にバグがあるようです。そのバグの影響が回り回って、libjavavm12.aが作成されないまま次に進もうとした、という感じでしょうか。なお、4.3などの古いVirtualBoxでは、バグを引き起こす情報をVMに渡していないため、回避できている様子。


参考:
[VBox 5.0.10/12 issues with PERL and Seg Faults – UPDATE](https://mikedietrichde.com/2016/01/14/vbox-5-0-1012-issues-with-perl-and-seg-faults-update/)
[Oracle 12c, VMWare Fusion and the perl binary’s segmentation fault](https://laurent-leturgez.com/2015/05/26/oracle-12c-vmware-fusion-and-the-perl-binarys-segmentation-fault/)
RSSから情報を取得してラズベリーパイに自動ツイートさせた話

<h3>TwitterAPI取得して誰得情報を呟くBOTを作った話</h3>
##前提条件
Raspberry Pi 3 Model B+を使用。2でも4でもZeroでもできると思います。
TwitterAPI Keyの発行は以下記事かなんかを参考にして済ませておいてください。
https://qiita.com/kazupen2018/items/ff9828cc853ab9c3357e

##必要ライブラリのインストール
####お約束コマンドを実行

```
sudo apt-get update
sudo apt-get upgrade
```
####Twythonのインストール
```
sudo pip install twython
```

##サンプルファイルの作成

```
nano tweet.py
```

```python:tweet.py
# coding: utf-8
from twython import Twython, TwythonError
 
# API Keyなどの必要情報を入力。
APP_KEY = "Consumer Key (API Key)"
APP_SECRET = "Consumer Secret (API Secret)"
OAUTH_TOKEN = "Access Token"
OAUTH_TOKEN_SECRET = "Access Token Secret"
 
# 変更するのは上の4つのみで大丈夫です
twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
 
try:
    twitter.update_status(status='Qiita uses @ kazupen2018 posted article script.')
except TwythonError as e:
    print e
```
API Key・APISecret・Access Token・Access Token Secret
を[この](https://qiita.com/kazupen2018/items/ff9828cc853ab9c3357e)記事を参考にして取得し、上記プログラムに入力してください。

####テストツイートの実行

```
python tweet.py
```

Twitterを確認してみてください。無事にツイートされていましたか？
されていない場合はライブラリやAPIを再確認してください。

##RSSを取得しツイート
####feedparserをインストール

```
sudo pip install feedparser
```

###RSSを取得
例として、Yahoo!天気から今日の東京の予報を取得します。
https://weather.yahoo.co.jp/weather/rss/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471662/7a5f7232-5479-434a-403a-1307ed0f741d.png)
取得したいところをクリックします。例として東京都都庁所在地。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471662/b5e900e1-6e1b-1a81-166b-03de9d848805.png)
すると、このように表示されます（ブラウザによって表示が異なります）
そのページのURL欄のURLをコピーします。
ここでは
https://rss-weather.yahoo.co.jp/rss/days/4410.xml
でした。
###RSSを取得してツイート

```
nano rss.py
```

```python:rss.py
# coding: utf-8
from twython import Twython, TwythonError

import feedparser
 
APP_KEY = "Consumer Key (API Key)"
APP_SECRET = "Consumer Secret (API Secret)"
OAUTH_TOKEN = "Access Token"
OAUTH_TOKEN_SECRET = "Access Token Secret"
 
# 先ほど取得したRSSのURLを下に貼り付けます
RSS_URL = "RSS_URL（ここをRSSのURLと置き換えてください）"
news_dic = feedparser.parse(RSS_URL)
latest_entry = news_dic['entries'][0]
message = latest_entry.title + latest_entry.link
 
twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
 
try:
    twitter.update_status(status=message)
except TwythonError as e:
    print e
```
APIキー、RSS URLは各自で置き換えてください。

```
python rss.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471662/27b46238-7d7d-e5b3-b5ca-f1dd4415aa9d.png)

はい。ツイートされていました。
##注意事項
Twitterの使用により重複したツイートはできません。たとえば「rss.py」を連続実行するとこのようなエラーがでます。

```
Twitter API returned a 403 (Forbidden), Status is a duplicate.
```
同じ内容を繰り返し投稿することができないことに留意して、cronなどに登録して遊んでみてください。
Laravel5.5 Mac開発環境構築

## php 7系の設定

```
phpenv local 7.1.1
```

## laravel 5.5系 のプロジェクト作成 

- プロジェクト名 `sample-app` の場合

```
composer create-project laravel/laravel sample-app --prefer-dist "5.5"
```

- 認証機能のセットアップ

```
php artisan make:auth
```

- log設定を変更（ *single* → *daily* ）
    - （必要な人だけ）

```
vi config/app.php
```
 
```diff
-    'log' => env('APP_LOG', 'single'),
+    'log' => env('APP_LOG', 'daily'),
```

- timezoneを変更（ *UTC* → *JST* ）

```
vi config/app.php
``` 

```diff
-    'timezone' => 'UTC',
+    'timezone' => 'Asia/Tokyo',
```
KaggleコンペにKernel経由せずにデータ提出する

# はじめに
https://qiita.com/drafts/01397d56b08eef86cb67/edit
のオマケ版なので背景のあたりはもろもろ割愛

自分なりにKaggleのコンペにデータを提出する方法はいくらかあることまではわかった。
　１．Kaggleが提供するKernelでデータを作って提出する
　２．MyPCでデータを作って、提出する
　３．VPC(AWSやGCPなど)でデータを作って提出する。

ここでは２．３．でデータ作ったときのコンペでのデータ提出の方法をメモ。

# 手順
1. コンペに参加する※割愛※
2. MyPC or VPCでデータを作る　※割愛※
3. 提出データをコンペに提出する

今回も、House Prices: Advanced Regression Techniques(https://www.kaggle.com/c/house-prices-advanced-regression-techniques)
を題材に説明。

手順1. は前の記事で言及しているので割愛
手順2. はそれこそただのプログラミングなので割愛

手順3.のところだけをピックアップ

## 3. 提出データをコンペに提出する
[Submit Prediction]クリック
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/06a45684-1ed5-c982-1833-6e072133cca9.png)

移動後の画面の下のほうへ進むと、↓↓のような提出画面が出てくる。
ここで提出データをドラッグ＆ドロップするとファイルのアップロードができる。
![キャプチャ15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/9ee088ce-586d-461d-2793-406d6e245be0.png)

アップロードに成功すると、真ん中あたりにファイル名（submission.csv）が現れる。
このときに[Make Submission]をクリック。
![キャプチャ16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/2e5232e3-0a16-c36d-cee3-7b7757066788.png)

これで提出完了。
Leetcode #665: Non-decreasing Array

```swift
func checkPossibility(_ nums: [Int]) -> Bool {
    var count = 0
    for i in stride(from: 1, to: nums.count, by: 1) {
        if nums[i-1] > nums[i] {
            count += 1
            if count >= 2 {
                return false
            }
            if i == nums.count-1 || i < 2 || nums[i+1] >= nums[i-1] || nums[i] >= nums[i-2] {
                continue
            } else {
                return false
            }
        }
    }
    return true
}
```
Leetcode #414: Third Maximum Number

```swift
func thirdMax(_ nums: [Int]) -> Int {
    var stack = [Int]()
    for i in stride(from: 0, to: nums.count, by: 1) {
        if !stack.contains(nums[i]) {
            if stack.count < 3 {
                stack.append(nums[i])
                stack = stack.sorted()
            } else if stack[0] < nums[i] {
                stack.removeFirst()
                stack.append(nums[i])
                stack = stack.sorted()
            }
        }
    }
    return stack.count == 3 ? stack[0] : stack.last!
}
```
python3でさくっとシェルコマンドを呼び出したい時

ポイントは「さくっと」である。難しいことをしたいわけではない、pythonからちょいとシェルコマンドを呼び出して結果を受け取りたいだけ。なのにネットで検索するといろいろ~~ややこしい~~高度な使い方が出てきたのでメモ代わりに（２０１９年７月時点）

とりあえず呼び出したいなら公式おすすめされている[subprocess.run()](https://docs.python.org/ja/3.6/library/subprocess.html)を使いましょう。

```
cmd = ['ls', '-l', 'dir']
subprocess.run(cmd)
```

のようにコマンドをリストで渡す。ただ、これだけ渡すと実行できたかできなかったか、実行した結果（標準出力）がなんだったのかなど結果しか帰ってこないので、標準出力などがほしい場合は

`output = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)`

で取れます。ちなみにpython3.7からは`capture_output`という便利な変数を渡せるようになりましたが、うちはまだpython3.6なので残念です。

追記（2022.12.2）

- `subprocess.run`はプロセスの終了を待って戻り値をもらう
- 標準出力の内容は`output`の`stdout`属性でアクセスできる
    - byte型になっているので、`str(output.stdout, 'utf-8')`のようにへんかんしよう
【Python】 例外処理を簡単に整理

例外処理たまに忘れるので、自分用に整理

# 使うのは４つだけ

Try: 実行したい処理をぶちこむ。
Except: Try節で例外が発生時点で実行される。
Else: Try節で例外が発生しなかった場合にのみ実行される。
Finally: 例外が発生した場合も、しなかった場合も実行される。

# 実験してみる。
簡単に除算をやってみる。
コードはこちら。

```python
a, b = map(int, input("Please input 2 valuables:").split())
try:
    print(a/b)
except ZeroDivisionError:
    print("ゼロで割っちゃあかんで")
else:
    print("計算成功やで。おめでとう")
finally:
    print("プログラム落とすで。ほなまた。")
```

## 例外が発生しない場合

2で割ってみる。

```
Please input 2 valuables:1 2
0.5
計算成功やで。おめでとう
プログラム落とすで。ほなまた。
```

**try => else => finally**の流れとなっている。
例外が発生していないので、try節は無事実行され、else節に入る。
例外の有無に関係なくfinally節は実行され、プログラムは終了する。

# 例外が発生する場合
0で割ってみる。

```
Please input 2 valuables:1 0
ゼロで割っちゃあかんで
プログラム落とすで。ほなまた。
```
**try(失敗) => except => finally**の流れになっている。
try節の実行途中で例外が発生し、その例外をExcept節でキャッチし、
例外の有無に関係なくfinally節は実行され、プログラムは終了する。
ユーザーのパスワードの有効期限を一覧表示する

# はじめに

最近は[パスワードの定期変更は不要](http://www.soumu.go.jp/main_sosiki/joho_tsusin/security/basic/privacy/01-2.html)という流れになっていますが、未だにパスワードの定期的な変更を求められるケースも多々あります。

特にサーバーだと、基本的に複数のユーザーが存在するため、パスワードの定期的な変更を管理するのが面倒になります。
そこで、ログイン可能なユーザーのパスワードの有効期限を一覧表示するスクリプトを作ってみました。

# スクリプト

## ユーザー名の抽出

* /etc/passwdの中身を取得した後、ログインシェル（`/bin/bash`）が指定されている行に絞り込みます。
  * ログインシェルとして`/sbin/nologin`が指定されている行は、ログインできないユーザーとなります。
* 「:」より後ろを削除して、ユーザー名だけを抽出します。

## パスワードの有効期限の取得

* `chage`コマンドを使って、各ユーザーのパスワードの有効期限を取得します。
* この時、`chage`コマンドの結果の2行目にパスワードの有効期限が書かれているため、2行目から日付部分だけを抽出します。
  * 地域情報（Locale）を変更した場合、`sed`コマンドの引数を少し修正する必要があるかもしれません。

```bash:pw_expiration.sh
#!/bin/bash
​
# ログイン可能なユーザーを全て取得して、
# 各ユーザーのパスワード有効期限を一覧表示する。
users=$(cat /etc/passwd | grep ':/bin/bash$' | sed s/:.*//)
​
for user in ${users[@]}; do
​
    expiration=$(chage -l $user | sed -n 2p | sed s/.*://)
    echo $user,$expiration
​
done
```

# 実行結果

* 以下のように、｛ユーザー名, パスワード有効期限｝の形で一覧表示されます。
* 「なし」となっているユーザーは、パスワードの有効期限が設定されていません。

```
[root@akagi scripts]# ./pw_expiration.sh 
root, なし
nkojima, 2月 03, 2020
```
初心者によるTwitter Developer登録以降について(自学用)

Twitter APIが使いたいのです。

Twitter APIの規制が激しくなっている昨今ですが、それでも使ってみたいのです。

勉強を始めました。
進展があれば、編集する形で追記していこうと思います。

#### 0. Twitter Developer登録について
googleさんを検索して、なるべく記事の更新日程の近いものを参考にして、
google翻訳とにらめっこしながら文章を作成します。
一発では通らず、詳細説明についてのメールが来ましたが、
図解した画像を添付してなんとかしました。
カタコトの翻訳文より伝わったんじゃないかな…？

#### 1. Pythonのインストール
どうしてPythonなのか？というと、一番資料サンプル等多そうな気がするから。
ver2と3とで互換性云々がどうのこうの、みたいな知識しかありませんが。
なんならパイソンじゃなくてフォトンって読んでたし！

記事更新時（インストール時）のLastUpdateは3.7.4。
3.6.3のインストール記事を参考に読みながら、インストールを進めていきます。