OmniAICreator/Qiita-1.07M huggingface dataset:
実践Python3でやってた簡単なシングルトン

# コード

**スイッチモジュール**

```python:switch.py
def push():
    push.state = not push.state
    return push.state


push.state = False
```

**使う側**

```python
In [1]: import switch

In [2]: switch.push()
Out[2]: True

In [3]: switch.push()
Out[3]: False

In [4]: switch.push()
Out[4]: True
```

# やったこと
- グローバルな状態を持つモジュール`switch.py`を作成する
- そのモジュールにプライベートな変数を保持させ，変数へのアクセスはパブリックな関数`push()`で行わせる

これによりプログラムでただ１つの状態を持つグローバルなスイッチができる．実践Python3ではネットから通貨レートの情報をとってきて保持するために使っている．通貨レートを取得する関数は数回呼ばれるが，ネットから取得するのは一回で良いのでこの実装を用いている．
声援駆動開発支援[可愛い声でタスク効率UP(electronデスクトップ声援キャラ)]

# 声援駆動開発支援(electronデスクトップ声援キャラ)
 可愛い声からの声援でタスク効率アップ！！

## 事前準備
- pc
- electronの開発環境

## 目的
人はどうやったらタスク効率あがるの？
人は褒められたり、応援されるとやる気でますよね。
そこで、褒められるために、応援されるためにタスクを消化し、タスク完了すると褒められる。
褒められるために開発を早く終わらそうとします。よって、タスク効率があがる。
声援駆動開発です。
好きな人(キャラクター)に褒められるのが一番です！！
ここで、今回はデスクトップ声援キャラクターです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">さすおに駆動開発<br>一つタスクを終わるごとに褒められる。<br>褒められるためにタスク処理効率があがる。<br>それがさすおに駆動開発 <a href="https://t.co/rwiYu1yrFj">pic.twitter.com/rwiYu1yrFj</a></p>&mdash; fishkiller (@R_BAGGIO1017) <a href="https://twitter.com/R_BAGGIO1017/status/972493331635757057?ref_src=twsrc%5Etfw">2018年3月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 簡単ディレクトリ構成
```
voice-drive
|---src
|    |-image - 画像ファイル
|    |-js - index.js
|    |-index.html
|    |-main.js
|---xxx.icon/icons/png(パッケージ化する際のアイコン)


```

### index.html
```html
<!DOCTYPE html>
<html lang="ja" >
<head>
  <meta charset="UTF-8">
  <title>声援駆動開発</title>
      <script  src="js/index.js"></script>
</head>
<body>
  <marquee behavior="alternate" direction="up" height="350"><marquee direction="right">
  <input type="image" width="150" height="300" src="images/fran.jpg" value="Check" onclick="praise()">
</marquee>
</marquee>
</body>
</html>

```
### main.js
```js
'use strict';

var electron = require('electron');
var app = electron.app;
var BrowserWindow = electron.BrowserWindow;

var mainWindow = null;

app.on('window-all-closed', function() {
  if (process.platform != 'darwin')
    app.quit();
});

app.on('ready', function() {

mainWindow = new BrowserWindow({
 width: 800,
 height: 600,
 transparent: true,
 frame: false});

  mainWindow.loadURL('file://' + __dirname + '/index.html');

  mainWindow.on('closed', function() {
    mainWindow = null;
  });
});

```
### index.js
```js
//音声ファイルを読み込む
// var voice = new Audio("再生する音声ファイルのURL")
var voice = new Audio("http://fishkiller.han-be.com/voice/thx.mp3");

function praise() {
  voice.play()
};

```
## パッケージ化
```
# Windows
electron-packager . ディレクトリ名 --platform=win32 --electron-version=1.4.5 --icon=./--------.ico
# OSX
electron-packager . ディレクトリ名 --platform=darwin --electron-version=1.4.5 --icon=./--------.icns
# Linux
electron-packager . ディレクトリ名 --platform=linux --electron-version=1.4.5 --icon=./----------.png
```

## 終わり
今回は超簡単に、クリックすると音性ファイルを再生するだけですが、クリックと共にタスク終了情報をpostし、タスク管理を行う用にすると面白いかもしれません。そのうちやりたいと思います。
画像はきっちり切り抜いたpngファイルにするともっといい感じになります。
また、ここではデスクトップに表示していますが、メニューバーのほうが良いという人もいるかもしれません。
そういった方は、[このQiita記事](https://qiita.com/fukajun/items/ead54dc906ad059be167)
[ここ](https://github.com/maxogden/menubar)を参照してください。

では、皆さんも好きなキャラや彼女の声で、タスク効率を上げちゃいましょう！！

twitterのやつのままだといろいろと問題があるので、githubには別のキャラでやっています。
北海道のご当地マスコット 歌って踊れるアンデッド系アイドル
フランチェスカちゃんです。
![fran.jpg](https://qiita-image-store.s3.amazonaws.com/0/209263/cab65c2c-3547-29bb-029d-6c18f52f907e.jpeg)



Github:https://github.com/fishkiller252/voice-drive
Download:https://github.com/fishkiller252/voice-drive/releases
twitter:[@R_BAGGIO1017](https://twitter.com/R_BAGGIO1017)
期末なのでETSS関連情報のページと目標管理まとめる。

期末で、実績まとめや来期の目標を考える時期になってきました。
なので、ETSS（組込みスキル標準）について参考になりそうなページをまとめるよ。

#ETSS
□IPA
[組込みスキル標準（ETSS Series)](https://www.ipa.go.jp/sec/softwareengineering/std/etss.html)
ETSS全般について


□スキルマネージメント協会
[スキル診断項目及び測定・集計ツール](http://www.skill.or.jp/ETSS-tool.php)
スキル診断するフォーマット。転職考えてる等で会社とは別に自分のスキル管理したい人も使えるかも。

□スキル標準ユーザ協会
[ETSSのキャリアフレームワークと認定試験・資格とのマップ](http://www.ssug.jp/docs/isv/ISVMapVer11r2.pdf)
自己啓発で資格の取得計画書けといわれる会社が多いと思うが、どんな資格とっていいかわからない。
自分の職種で、自分のスキルレベルで何の資格取得を目指せばいいかの参考資料。

#目標管理書くときに考えること
やるべきこと、やりたいこと、やれることの重なりを最大化することを考えて書こう。

##目標の記載はSMARTに

>◆要素1：Specific（具体的に）
>誰が読んでもわかる、明確で具体的な表現や言葉で書き表す
>
>◆要素2：Measurable（測定可能な）
>目標の達成度合いが本人にも上司にも判断できるよう、その内容を定量化して表す
>
>◆要素3：Achievable（達成可能な）
>希望や願望ではなく、その目標が達成可能な現実的内容かどうかを確認する
>
>◆要素4：Related（経営目標に関連した）
>設定した目標が職務記述書に基づくものであるかどうか。と同時に自分が属する部署の目標、さらには会社の目標に関連する内容になっているかどうかを確認する
>
>◆要素5：Time-bound（時間制約がある）
>いつまでに目標を達成するか、その期限を設定する

引用：[目標設定はSMARTに](https://globis.jp/article/659)

##数値目標書けはいいけど、どんな数値かきゃいいの？
IPAのデータ白書やプロジェクト見える化関連の資料読んで、自分の工程にあった品質指標を選んで記載する
[組込みソフトウェア開発データ白書](https://www.ipa.go.jp/sec/publish/index.html#emb)
[ITプロジェクトの「見える化」](https://www.ipa.go.jp/sec/publish/index.html#ent)

##目標管理には行動目標ではなく、結果目標をかこう
行動目標：「毎月５件改善提案を行う」など自分で直接的にコントロール可能な目標設定
結果目標：「売上を５％上げる」など自分で（間接的にはコントロールできるかもしれないが）直接的にコントロール不可能な目標設定
##結果目標とはべつに行動目標を立てよう
行動目標は目標管理に記載しなくてもいいけど、期末に「あれ？結果目標にたいして何もやってなかった。今期なにもかくことないや」
とならないように行動目標も立てよう。
ffmpegのstatic buildを作るときのconfigureコマンド

# ffmpegのstatic buildを作るときのconfigureコマンド

```
./configure  \
    --disable-shared \
    --enable-static \
    --pkg-config-flags=--static \
    --extra-libs=-static \
    --extra-cflags=--static
```

# 解説
`configure`のhelpをみると`--disable-shared`, `--enable-static`でstaticなビルドができそうに見えるが、これはffmpeg系のDLLのみのオプション。なので、libcとかは依然dynamicなまま。なので、libcとかもstaticにするために後ろ3つが必要、なはず。

あと、全部入りのバイナリを作ると大きくなりがちだし、こういうの作る時ってだいたいプロダクション環境とかで必要なので、以下のオプションもおすすめかも。

```
--disable-doc 
--disable-debug 
--enable-small
```

ドキュメント作らないオプションと、デバッグ情報を外す(その分サイズが小さくなる)オプションと、サイズを小さくする(その代わりビルド時間は大きくなる)オプション

ビルドする前に依存するやつをインストールしとく話とかは[公式のドキュメントとか](https://trac.ffmpeg.org/wiki/CompilationGuide)すでに詳しく書かれてるところがいっぱいあるのでそちらを参照すると良いです。

参考: http://www.ffmpeg-archive.org/Build-with-enable-static-td1583036.html
UnityEventのリスナー数の取得が出来ない

# 概要
UnityEventにはUnityAction型のリスナーを登録して使用します。
これらのリスナーは登録方法によって挙動が若干違います。
今回は、登録したリスナー数の取得が出来なかったこと、その原因、対策をまとめてみます。

# UnityEventのリスナーの種類
UnityEventには
* 永続的リスナー
* 非永続的リスナー
の2種類が存在します。

## 永続的リスナー
永続的リスナーはインスペクタ上から登録します。
uGUIのButtonのOnClickとかで、登録したことがあるかと思います。
<img width="350" alt="スクリーンショット 2018-03-11 0.55.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/46278/c0d6d679-da0b-b6c4-042a-5f16ff7d9388.png">
自分で作成したクラスでも、シリアライズされるUnityEventであればインスペクタ上から登録可能です。
引数付きUnityEvent(UnityEvent\<T0>とか)を継承したクラスは、SerializableAttributeを付けるとOKです。
この永続的リスナーは実行中に登録・削除は出来ませんが、Stateが存在していて、それによってON/OFFしたりすることが出来ます。
https://docs.unity3d.com/jp/current/ScriptReference/Events.UnityEventCallState.html


## 非永続的リスナー
非永続的リスナーはスクリプトから登録します。
`event.AddListener(action);`
という形で登録します。
逆に
`event.RemoveListener(action)`
でリスナーを削除できます。

# リスナー数の取得ができない
スクリプトから登録されているリスナー数を取得し、リスナーが存在する時はリスナーの処理を、存在しない時は別の処理を行いたいと考えたのですが、常に0となり、リスナー数が取得できませんでした。。

## 原因
GetPersistentEventCountメソッドを使用することで、リスナー数を取得できますが、これは永続的リスナーの数を取得し、非永続的リスナーの数を取得することは出来ません。出来ません。無理です。

## 対処
どうしても取得したい場合は、UnityEventに登録する際に登録数をカウントするようなラップ関数やクラスを作成するのが良いかなと。
ただ、非永続的リスナーは登録する際は重複をチェックせず、削除する際は重複分全てを削除し、追加、削除の成功、失敗などを取得することも出来ないので、HashSet的に別途Actionを管理するような仕組みも必要になりそうです。

# まとめ
* UnityEventのリスナーにはインスペクタ上から登録する永続的リスナー、スクリプトから登録する非永続的リスナーが存在する。
* 永続的リスナーの数はスクリプトから取得できるが、非永続的リスナーの数は取得できない。
* 非永続的リスナーの登録数はラップクラスなどを作成し、自前でカウントしていく必要がありそう。

# 追記(3/11 22:43) リフレクションによる取得
無理やりリフレクションで取得してみました。
パフォーマンス的に自分のやりたかったことにはマッチしていませんが、Editor上で使うとかケースを絞れば使えなくも無い気もします。

```C#
public static int GetRuntimeEventCount(this UnityEventBase unityEvent) 
{
	Type unityEventType = typeof(UnityEventBase);

	Assembly libAssembly = Assembly.GetAssembly(unityEventType);

	Type invokableCallListType = libAssembly.GetType("UnityEngine.Events.InvokableCallList");
	Type baseInvokableCallType = libAssembly.GetType("UnityEngine.Events.BaseInvokableCall");
	Type listType = typeof(List<>);
	Type baseInvokableCallListType = listType.MakeGenericType(baseInvokableCallType);

	FieldInfo callsField = unityEventType.GetField("m_Calls", BindingFlags.Instance | BindingFlags.NonPublic);
	FieldInfo runtimeCallsField = invokableCallListType.GetField("m_RuntimeCalls", BindingFlags.Instance | BindingFlags.NonPublic);

	var calls = callsField.GetValue(unityEvent);
	var runtimeCalls = runtimeCallsField.GetValue(calls);
	PropertyInfo countProperty = baseInvokableCallListType.GetProperty("Count");

	return (int)countProperty.GetValue(runtimeCalls, null);
}
```
ES2015で簡単なポップアップを作成

今回はJavaScriptで簡単なポップアップのテンプレートを作ってみたのでサンプルコードを載せておきます。


```html:index.html
<!DOCTYPE html>
<html lang='ja'>
<head>
	<meta charset='UTF-8'>
	<meta name='viewport' content='width=device-width, initial-scale=1.0'>
	<meta http-equiv='X-UA-Compatible' content='ie=edge'>
	<title>ポップアップのサンプル</title>
	<link rel='stylesheet' href='css/style.css'>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
</head>
<body>
	<button class="popupButton" id="js-clickEl">クリックする要素</button>
	<div class='popup' id="js-popup">
		<div class='popup_content'>
			<p class='popup_content_closeButton' id="js-popupCloseButton">X</p>
			<div class='popup_content_description'>何か文言が入ります</div>
		<div>
	</div>
	<script src="js/Popup.js"></script>
</body>
</html>
```

```css:style.css
.popupButton {
	border: none;
	background: #323232;
	color: #fff;
	padding: 20px;
	border-radius: 33px;
	cursor: pointer;
}
.popup {
	width: 100%;
	height: 100%;
	position: fixed;
	top: 0;
	left: 0;
	background: rgba(5,5,5,0.8);
	opacity: 0;
	transition:all .3s;
	transform: scale(0);
}

.popup.is-active {
	transform: scale(1);
	opacity: 1;
}

.popup_content {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	background: #fff;
	width: 400px;
	height: 360px;
	padding: 30px;
}

.popup_content_closeButton {
	cursor: pointer;
	text-align: right;
}

.popup_content_description {
	margin-top: 30px;
}
```

```javascript:Popup.js
class PopUp {
    constructor(clickEl, popupEl, closeEl){
		this.clickEl = document.getElementById(clickEl)
		this.popupEl = document.getElementById(popupEl)
		this.closeEl = document.getElementById(closeEl)
	}
	setEventListener(){
		this.clickEl.addEventListener("click", this.displayPopup.bind(this));
		this.closeEl.addEventListener("click", this.closePopup.bind(this));
	}
	displayPopup(){
    this.popupEl.classList.add("is-active")
	}
	closePopup(){
		this.popupEl.classList.remove("is-active")
	}
}
const simplePopup = new PopUp('js-clickEl', "js-popup", "js-popupCloseButton");
simplePopup.setEventListener();


```

この``Popupクラス``を使って初期化した後の引数に対象となる要素のIDを入れればデザインの違うポップアップにも対応できます！

是非使ってみてください！
プロジェクトをGitで管理するときの準備

#プロジェクトをGitで管理するときの準備
新規でプロジェクトを作成したときにGitの設定をよく忘れるので備忘録として書いておきます。
※Gitはインストールされていることを前提とします。

##Gitの初期化
まず初めに新規で作成したプロジェクトをGitで管理できるよう、Gitの初期化を行います。

```
cd /var/www/html/project
git init
```
移動先のフォルダは例ですので自分の環境に合わせてください。
##プロジェクトをコミットする
Gitの初期化が終わったら、プロジェクトをコミットします。

```
git add *
git commit -m コメント
```
(ファイル・フォルダを指定する場合は`git add ファイル・フォルダ名`)
htmlファイルだけコミットしたいときはこんな感じ
`git commit *.html`

##bareリポジトリを作る
ローカルにクローンし、開発を行うことが主なのでローカルからpushできるbareリポジトリを作ります。
プロジェクトを公開用リポジトリとすると、bareリポジトリは管理用リポジトリって考えで合ってるかな？

```
mkdir /var/www/repository
cd /var/www/repository
git clone --bare /var/www/html/project repository.git
```
※プロジェクト先のパスとrepository.gitの間のスペースは忘れないでください。

##公開用リポジトリと管理用リポジトリを紐付ける
公開用リポジトリで管理用リポジトリからpullできるように紐付けを行います。

```
cd /var/www/html/project
git remote add origin /var/www/repository/repository.git
```

##リポジトリをローカルにクローン
作成したリポジトリをローカルにクローンします。
※GitクライアントなどをGUIで操作できるもの(SourceTreeなど)があれば便利。

```zsh:クローン先のURL
ssh://<ユーザ名>@<サイトのホスト名>/var/www/repository/repository.git
```

##準備完了
無事ローカルにクローンできたら最低限の準備が完了です。開発を始めていきましょう。
Excel仕様書のデメリットとWordで仕様書書くコツ

新たな職場に来たらExcel方眼紙の１シート１ページが、開発標準の仕様書テンプレになっていました。

これだけネ申ExcelとかいわれてExcel方眼紙は生産性悪いとDISられているのに、なぜExcel方眼紙で仕様書を書く？

職場の先輩の話だと、「発注元指定テンプレがExcel方眼紙になっていて、政治的な問題もあり、変更するのが難しい」だそうです。

Excel止めて、Wordでドキュメント書こうよ（出来れば、ÁsciiDocやMarkdownで書きたいけど）。
そんな愚痴とポエム的な投稿です。

とりあえず概要。あとで更新します。

# Excel方眼紙で仕様書をかくデメリット
+ 方眼紙のように細かいセルをつくっているので、セルの連結しがち。
    + セル連結が邪魔になってコピペができないことがある。
    + セル連結が邪魔でソートできないことがある。
    + 参考:[全人類に告ぐ。セル結合をやめろ](https://deux-hibi.hatenablog.com/entry/2018/12/09/020957)
+ 内容の挿入/削除が発生したとき、面倒なルーティンワークが発生する。
    + 途中に半ページ内容を挿入/削除したから、１シート１ページのフォーマットに合わせて以降のシートを全部半ページずつズラす修正が必要がある。
    + 章番号、ページ番号を手動で変えなくてはならない。
+ 印刷プレビューと実際に印刷されたもので、レイアウトがずれる場合がある。
    + 画面上ではセル内に収まっていたのに、印刷すると文字がセル内におさまってない。
    + 印刷がやり直しで無駄なお金が発生する
    + 印刷プレビューで表示したレイアウトでとも印刷されたレイアウトが微妙に異なる。
    + 印刷時のレイアウトを事前確認する場合、Excel⇢PDFして、PDFで印刷後のレイアウト確認する必要がある
+ ドキュメント差分が見にくい。
    + 変更箇所を探そうとドキュメント比較するときに、良いツールがない。
    + オープンソースのWinMergeでファイル比較ができるが、差分箇所がわかりにくい上、たまにバグ（？）で余計な差分がでたり必要な差分が出なかったりする。
    +  Office Professional Plusならアドイン「Inquire」等、有償ツールで比較的見やすい形で差分を取れるが、高くて会社では使えない
   
 
**そのデメリットWordで解決出来るかもよ？**


# Wordで書くメリット
+ Excel方眼紙ほどはセル連結しない。コピペして再編集しやすい。
+ 内容の挿入/削除が発生したら、自動で章番号、ページ番号を編集してくれる。
+ 画面に表示されている内容で印刷される。
+ Word標準のドキュメント比較機能で、ドキュメント差分が取れる（ただし図の差分はとれない）。
+ ナビゲーションウィンドで文書のアウトライン（章立て）がわかりやすい。

# Wordで編集するときのコツ
+ フォントを変更するときは、フォントを直接指定しない。スタイルを使用しよう。
    + フォントを直接していするとスタイルどんどん増えて管理できなくなるので止めてください。見た目が統一できなくなります。
    + ”ホーム”タブの”スタイル”メニューで、”見出し１”、”標準”などを使って変更してくよう。
+ インデントをスペースやタブで調整しない。”ホーム”タブ”段落”メニューの"インデント”使って修正しよう。
+ アウトライン（段落構成）決めてから、書き始めよう
    + 章番号の設定は”ホーム”タブ＞”段落”メニューの”アウトライン”からできます。好みの番号設定しましょう。
    + ”表示”タブの”ナビゲーション　ウィンドウ”にチェックいれよう
    + 段落構成を決めましょう。
        + ”見出し１”設定のショートカットキー[Ctrl]+[Alt]+[1]、”見出し２”設定のショートカットキー[Ctrl]+[Alt]+[2]、”見出し3”設定のショートカットキー[Ctrl]+[Alt]+[3]
 
+ 図表や他の章参照する記載は相互参照で挿入。
    + たとえば「図 xxx参照」「xxx章参照」のような記載は”相互参照”機能で記入する

参考：[研究者のための Word 利用法](http://www.gges.xyz/ueyama/works/word/index.shtml )
Laravelで入力された値を都度validateする対話型処理を作りたい

# はじめに
Laravelはartisanコマンドを自作することができます。
https://readouble.com/laravel/5.1/ja/artisan.html

```
$ php artisan make:command SampleCommand
```

詳しくは上記ドキュメントや、以下の記事が参考になるかと思います。
https://qiita.com/nenokido2000/items/abbf70c87c9ad86a2b89


# 何が問題か

コマンドを実行する際、`ask()`でユーザーに入力を尋ねる事ができるのですが、このままだとどんな入力も受け付けてしまいます。

```php
public function handle()
{
    $zipcode = $this->ask('郵便番号を入力してください');

    // ask()の後で入力チェックするのもアリだけど...
}
```

質問事項が多くなればなるほど、下にずらーっとvalidateの処理が連なってしまい、見通しが悪くなります。


# Traitを作ってみた

「validateのルールを指定できる`ask()`があればいいよね」と思ったので、作ってみました。

```php

<?php

namespace App\Console\Commands\Traits;

trait ValidateAsk {

    /**
     * ユーザーに入力を求める
     * 入力されたら、指定されたルールでvalidateする
     * validateに失敗した場合、同じ内容で再度質問して入力を待つ
     *
     * @param  string $question 質問文
     * @param  array  $rules Validatorに与えるルール
     * @param  string $default デフォルト値（falseを指定すると、入力が空の場合null扱いにする）
     * @return string validateが通った入力値
     */
    public function validateAsk($question, $rules, $default = null)
    {
        $method = function() use ($question, $default) {
            return $this->ask($question, $default);
        };

        $input_value = $method();

        if ($input_value === false) {
            $input_value = null;
        }

        $validator = \Validator::make([$rules[0] => $input_value], [$rules[0] => $rules[1]]);

        if ($validator->fails()) {
            $error = $validator->errors();
            $result = $error->first($rules[0]);
        } else {
            $result = true;
        }

        if ($result !== true) {
            $this->warn($result);
            $input_value = $this->validateAsk($question, $rules, $default);
        }

        return $input_value;
    }

}

?>
```


# 使用例

このような感じで使うことができます。

```php
<?php

namespace App\Console\Commands\Sample;

use Illuminate\Console\Command;

use App\Console\Commands\Traits\ValidateAsk;

class AskTest extends Command
{
    use ValidateAsk;

    // ...(いろいろ省略)...

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $zipcode = $this->validateAsk('郵便番号を入力してください', ['zipcode','regex:/^[0-9]{3}-[0-9]{4}$/']);
        $this->info("Input value : " . $zipcode);
    }
}
```

スッキリ書く事ができました。

# 実行してみる

実行すると、このような形になります。
与えられたルールに沿ってない入力の場合、エラーメッセージを出して、再度質問できています。

<img width="842" alt="スクリーンショット 2018-03-09 17.45.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/116677/f99dc879-3fe2-b1df-a973-fa1b36eace64.png">


# おわりに
対話型のartisanコマンドを自作する機会はほとんどないかと思いますが、どなたかの参考になれば幸いです。
PyMC3 の Windows へのインストール

# 概要

Windows 上で PyMC3 が動作しないことがあります。
動作させるにはいくつかの方法がありますが、少なくとも以下の手順で正常にインストールすることに成功しました。

# 仮想環境の作成
`PyMC3` の依存するパッケージ `Theano` は、Python 3.4 以上 3.6 未満で動作します。
ここでは、 Python 3.5 の仮想環境を作成します。
コマンド プロンプトを起動します。

```console:
conda create --name py35 python=3.5
```

# Theano のインストール

```console:
activate py35
```

```console:
conda install numpy scipy mkl-service libpython m2w64-toolchain nose sphinx git matplotlib jupyter
```

```console:
pip install --user git+https://github.com/Theano/Theano.git#egg=Theano
```

# PyMC3 のインストール

```console:
pip install pymc3
```

# PyMC3 の起動

Jupyter Notebook で試します。
Jupyter Notebook の起動前に環境変数を設定します。

```console:
set MKL_THREADING_LAYER=GNU
jupyter notebook
```

# 動作確認

Jupyter Notebook や Jupyter Lab を使用できる場合、
以下のコードを実行し正常にインストールができたかどうかを確認できます。

```python
%matplotlib inline
import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt

# モデル定義とサンプリングを行います。
# インストールがうまくいっていない場合、
# サンプリング時にエラーが表示されます。
with pm.Model():    
    x = pm.Normal("x", mu=0, sd=1)
    trace = pm.sample(1000)

# トレース プロットにグラフが表示されれば完了です。
plt.plot(trace['x'])
```

# 参考資料
1. "ベイズ推論とMCMCのフリーソフト のサポートページ", 岩波データサイエンス ウェブサイト,　https://sites.google.com/site/iwanamidatascience/vol1/support_tokushu
2. "Unofficial Windows Binaries for Python Extension Packages", Christoph Gohlke, Laboratory for Fluorescence Dynamics, University of California, Irvine., https://www.lfd.uci.edu/~gohlke/pythonlibs/
3. "Installing pymc3 on Windows machines", 
Hans Olav Melberg, http://datahans.blogspot.jp/2016/04/installing-pymc3.html
4. "Installing Theano - Windows Installation Instructions", http://deeplearning.net/software/theano/install_windows.html
blank関数の早見表 laravel5.5〜 

laravel5.5からヘルパ関数にblankが新しく追加されました。
直感的に使用できて良い！

| 式 | empty() | is_null() | isset() | ![medium.jpg](https://qiita-image-store.s3.amazonaws.com/0/228538/a1924f73-9657-b399-4c73-6401a391a74d.jpeg)blank() |
|:----|:----:|:----:|:----:|:----:| 
| $x = ""; | **TRUE** | FALSE | **TRUE** | **TRUE** | 
| $x = "     "; | FALSE | FALSE | **TRUE** | **TRUE** | 
| $x = null; | **TRUE** | **TRUE** | FALSE | **TRUE** | 
| $x = array() / collect(); | **TRUE** | FALSE | **TRUE** | **TRUE** | 
| $x = array('a', 'b') / collect('a', 'b'); | FALSE | FALSE | **TRUE** | FALSE | 
| $x = false; | **TRUE** | FALSE | **TRUE** | FALSE | 
| $x = true; | FALSE | FALSE | **TRUE** | FALSE | 
| $x = 1; | FALSE | FALSE | **TRUE** | FALSE | 
| $x = 0; | **TRUE** | FALSE | **TRUE** | FALSE | 
| $x = -1; | FALSE | FALSE | **TRUE** | FALSE | 
| $x = "1"; | FALSE | FALSE | **TRUE** | FALSE | 
| $x = "0"; | **TRUE** | FALSE | **TRUE** | FALSE | 
| $x = "true"; | FALSE | FALSE | **TRUE** | FALSE | 
| $x = "false"; | FALSE | FALSE | **TRUE** | FALSE | 

>blankの逆の動作は、filledメソッドです。


```php:
 //使用例
 if(isset($value) && trim($value) != ""){} //使わない場合
 if(isset($value) && !(trim($value) == "")){} //使わない場合

 if(filled($value)){} //使った場合
```

###参考サイト
[PHP Document:PHP 型の比較表](http://php.net/manual/ja/types.comparisons.php)
[laralve5.5 Document公式:Helpers](https://laravel.com/docs/5.5/helpers#method-blank)
[laralve5.5 Document日本語:Helpers](https://readouble.com/laravel/5.5/ja/helpers.html#method-blank)
【Golang】goroutine・channelの並列処理で個人的によく使う処理

# はじめに
Goで並列処理を書く時に、例えばgoroutineの数は上限10個で処理が終わったらまたgoroutineを立ち上げて処理をするみたいなものだったりとか個人的によく使う物を紹介します。
※最適な書き方とかではなくて、こう書けばこう動くよ集です。
※sleepはコピペした時にわかりやすいようにと処理を止めを簡略化するために使ってます

## goroutineの処理が終わるまで処理を止める


```bad.go
func main() {
	go func(s string) {
		log.Println("Hello",s)
	}("World")
}
```
これだとgoroutineが処理される前にメインが終わり、Hello Worldが表示されない。

### WaitGroupを使った処理止め

```good.go
func main() {
	wg := sync.WaitGroup{}
	wg.Add(1)
	go func(s string) {
		log.Println("Hello",s)
		wg.Done()
	}("World")
	wg.Wait()
}
```
これで表示される。
関数名を見たらそれっぽい動きをイメージができると思います。

### channelを使った処理止め

```good.go
func main() {
	ch := make(chan string)
	go func(s string) {
		log.Println("Hello",s)
		ch <- "End function"
	}("World")
	<- ch // log.Println(<- ch)
}
```
処理を止めるという意味では同じように処理できます。
```ch <- "End function"```でchというチャンネルにEnd functionという文字列を流し込み
```<- ch```ではチャンネルに値が入ってくるまで処理を止めます。
```log.Println(<- ch)```と書いても同じく処理を止めて、チャンネルに値が流れるとその値を取り出して関数の引数に入れます


## goroutineの数を制限する

これは本当によく使います。
goroutine上限を2つとし、Hello Worldと10回出力するプログラムです。
何を言っているか分からない場合はコピペして実行してください。

```good.go
func main() {
	ch := make(chan int, 2)
	wg := sync.WaitGroup{}

	for i := 0; i < 10; i++ {
		ch <- 1
		wg.Add(1)
		go func(s string) {
			log.Println("Hello", s)
			//time.Sleep(time.Second) //コピペして実行する時はスリープ入れると理解しやすい
			<- ch
			wg.Done()
		}("World" + strconv.Itoa(i))
	}
	wg.Wait()
}
```
WaitGroup・channelを組み合わせて使います。
WaitGroupでメイン処理を止めて、チャンネルで上限を制御しています。
WaitGroupはメイン処理を止めているだけなのであまり気にしないでください。チャンネルが重要です。
```ch := make(chan int, 2)```第二引数に```2```とあり、これが結果的にgoroutineの上限になります。

第二引数の値がチャンネルに流せる上限の値で、それ以上の数をチャンネルに流しても上限が決まっているのでチャンネルが受け取ることができずに、チャンネルに空きができるまで流す段階で処理が止まります。

ロジックとしては、並列処理を始める前に```ch <- 1```と書きチャンネルに適当な値を流し込みます
上限が2つなので、最初の2回のgoroutineは普通に起動しますが、3回目から```ch <- 1```の部分で既に二つの値が入っているのでチャンネルが空くのを待ちます。

go funcの並列処理の最後に```<- ch```と書きチャンネルから値を取り出すと3回目のチャンネルが空くのを待っているところが実行され、4回目が次に空くのを待ちます。結果的に上限二つとして並列処理を実現します。

## チャンネルに値が入るのをずっと待つgoroutine

順番に処理しないといけない場合や処理を貯めてgoroutineが増えすぎないように制御できます。
処理を貯められるので直ぐさま処理しなくて良いような内容だと安定的に処理できたりするかもしれませんね。
注意点として```ch := make(chan string,5)```の第二引数を指定しないとメインが処理しちゃいます。。。（どうなってんだこれ・・・）

```good.go
func main() {
	ch := make(chan string,5)
	go goroutine(ch)

	ch <- "World0"
	ch <- "World1"
	ch <- "World2"
	ch <- "World3"
	ch <- "World4"
	log.Println("Hello World5")
	time.Sleep(time.Second*5)
}

func goroutine(ch chan string) {
	for s := range ch {
		log.Println("Hello",s)
		time.Sleep(time.Second)
	}
}
```

### 上限あり

```good.go
func main() {
	ch := make(chan string,5)
	go goroutine(ch)

	ch <- "World0"
	ch <- "World1"
	ch <- "World2"
	ch <- "World3"
	ch <- "World4"
	log.Println("Hello World5")
	time.Sleep(time.Second*5)
}

func goroutine(ch chan string) {
	blockCh := make(chan int,2)
	for out := range ch {
		blockCh <- 1
		go func(s string) {
			log.Println("Hello",s)
			time.Sleep(time.Second)
			<-blockCh
		}(out)
	}
}
```

個人的には大体これくらいで事足りてる感じですね。
他にもよく使うものがあれば教えてください＞＜
PivotGauss消去法とGauss消去法の精度比較

条件は,前回の記事を参照.
Gauss消去では誤差の程度がPivotを選択するときに比べ,大きいときがある.


![pivotgauss.png](https://qiita-image-store.s3.amazonaws.com/0/206597/20c9c5f9-778f-0edc-496e-04cfee1ce61a.png)
Nokogiriでぎこぎこスクレイピングしてつまずいたときにみるメモ

しょしんしゃえんじにあです。
サイトを数件スクレイピングしたときにつまずいた点と、その対処方法の個人的メモです。

# はじめに
[Webスクレイピングの注意事項一覧](https://qiita.com/nezuq/items/c5e827e1827e7cb29011)

# 大切だなとおもったこと
**「あなたの内面がどんなに汚くても、私は絶対にあなたを受け止める」**
スクレイピングするサイトへの愛かなと思いました。

# つかったもの
1. ruby
1. nokogiri
1. Chromeデベロッパーツール

# クローリングしたパターン
トップページのカテゴリ一覧 => カテゴリ一覧ページ => 詳細ページ

# つまずいた点&対処方法
## そもそも要素をどう取得するか
NokogiriではXPathやCSSセレクタで要素を取得できる。
WEBエンジニア的に馴染みがあるCSSセレクタを選んだ。

```rb
# CSSセレクタはこんなかんじ
doc.css('#main > article> h1')
# XPathはこんなかんじ
doc.xpath('//*[@id="main"]/article/h1')
```

## HTML構造が複雑で要素を指定できない
実際にサイトの要素を取得しようとすると結構長くなる。

```
#main > article > div.p-items_wrapper > div > div.p-items_main > div.p-items_article > div.it-Header > h1
```

目視では到底追えないので、「Chromeデベロッパーツール」にCSSセレクタを自動生成してもらった。

こちらの記事がとてもわかりやすい！ 
[Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり2/28](https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a)

### ChromeデペロッパーツールのCSSセレクタの注意点
#### tbodyには気をつける
例えば``table > tbody > tr > td ``と自動生成された場合、そのまま素直に利用すると、サイトによって取得が失敗したりする。
原因としては単純で、実サイトでは``table > tr > td ``とコーディングをしているから取得できない、というケース。ページのソースを表示すればすぐわかる。
Chromeさんがなんか勝手にtbodyを自動補完してくれるみたい。きちょうめんだ。
#### とりあえずなぜかとれないときは
* 「>」(直下セレクタ)を取っ払ったら、いいことあった。
* 自動生成のCSSセレクタを無視してサイトへの愛によるCSSセレクタをひねりだす  
    * :nth-child
    * +　(隣接セレクタ)
    * \[foo=bar\](属性セレクタ)

このあたりを結構活用した。

## 同サイト内で詳細ページのHTML構造が微妙にばらばら
ページによってあったりなかったりする要素もあるのでぼっち演算子とかで、

```rb
doc.css('img')&.attribute("src")
```
などとやりそうになるが、``undefined method `attribute' for nil:NilClass``でコケる。
css、xpathメソッドは、該当する要素がない場合、nilではなく空の配列(NodeSet)が返ってきているから。

## HTMLが文字化けする
kconvつかう。toutf8つける。

```rb
require 'open-uri'
require 'nokogiri'
require 'kconv'

url = "http://example.com"
html = URI.parse(url).read
doc = Nokogiri::HTML(html.toutf8, nil, 'utf-8')
```

## URLに日本語が含まれている
URI.encodeつかう。

```rb
html = URI.parse(URI.encode(url)).read
```

###なんかこういうケースもあった

```rb
url = doc.css('a#hoge').attribute('href')
next_html = URI.parse(URI.encode(url)).read
```

``undefined method `gsub' for #<Nokogiri::XML::Attr:...``が出た。
to_sしたらうまくいった。

```rb
url = doc.css('a#hoge').attribute('href').to_s
next_html = URI.parse(URI.encode(url)).read
```


## ページネーションをどうくぐりぬけるか
こうした

```
カテゴリ一覧ページのリンク達.each do |カテゴリ|
  カテゴリAの一覧ページをノコギる
  begin
    カテゴリAの詳細ページのリンク達.each do |s|
      詳細ページをノコギる
    end
    # ↓↓次のページがあるかどうか判定↓↓
    next_link = document.css('#pager > ul > li > a.next')
    unless next_link.empty?
      カテゴリAの一覧の次のページをノコギる
    end
  end until next_link.empty?
end
```

## "【タイトル】\</br\>内容…"みたいな構成のときに「タイトル」と「内容」を取りたい
正規表現でごにょごにょしてなんとかした。下記のさらにもっと汚い版

```irb
irb(main):081:0> "【あああ】<br>いいい".split(/【((?!【).*?)】/)
=> ["", "あああ", "<br>いいい"]
```

## 要素を取得したときに値にブランクやタブやbrタグがはいる
ひたすらえすけーぷえすけーぷえすけーぷえすけーぷ

## どこまで進行したかわからない
ログなりなんなり出そう（結構大事）

# さいごに
スクレイピングして、うまくいったとおもったら、つまずいて、サイトのソース読んでを繰り返すとサイト愛が芽生えてきてしまいました。何言ってるんだろう私。
かなり作業の泥臭さを感じたので、もう少しスマートにできる方法を模索したいです。次の機会があれば…。
Laravel基本コマンド

# 補足
Laravelのバージョンは5.6

# Laravelのプロジェクト作成
`laravel new <project_name>`
`<project_name>`が作成したいプロジェクトの名前になる。
`composer create-project ...`の書式でも作成できるけど省略。

# サーバー起動
`php artisan serve`

# マイグレーションファイル作成
`php artisan make:migration <file_name> --create=<table_name>`
`<file_name>`は作成されるマイグレーションファイルの名前。
`<table_name>`は作成されるDBテーブルの名前。
これにより、database/migrationsディレクトリの下にマイグレーションファイルが作成される。

# マイグレーションの実行
`php artisan migrate`
テーブルを初期化したい場合は以下。
`php artisan migrate:refresh`

# モデルの作成
`php artisan make:model <model_name>`
`<model_name>`が作成したいモデルの名前。
これにより、appディレクトリの下にモデルが作成される。

# コントローラーの作成
`php artisan make:controller <controller_name>`
`<controller_name>`が作成したいモデルの名前。
これにより、app/Http/Controllersディレクトリの下にコントローラーが作成される。

# 色々まとめて作成
`php artisan make:model <model_name> -m -c -r`
`<model_name>`が作成したいモデルの名前。
`-m`がマイグレーションファイル、`-c`がコントローラーをあわせて作成するためのオプションで、`-r`を付けることでcreateやらindexやらリソース操作を行うためのメソッドをコントローラー内にあらかじめ作成してくれる。
Cumulus Linuxを使ったネットワーク構築(L2セットアップ編)

# はじめに

この記事は、[Cumulus Linuxを使ったネットワーク構築(導入編)](https://qiita.com/kthada/private/3f03cb1e709c50f7e25d)の続きです。

今回は初期セットアップが終わってswitchdが起動している状態から、
フロントポートの設定を行いL2で通信できるようにします。

# 完成予定図
![spine-leaf.jpg](https://qiita-image-store.s3.amazonaws.com/0/20794/8e847845-d976-4130-d010-1a70b3442c7d.jpeg)

- Spine-Leaf間は、10Gを4本束ねて40Gbpsで接続
- Spine-Leaf間は、eBGP(unnumberd)で設定
- メンテナンス性を考慮しLeaf01,02とLeaf03,04でセットとし、サーバのNICをbondingする

# フロントポートの設定
- Cumulus Linuxをインストールすると、フロントのポートはswpXXというポート名で認識されます
- インストール直後は/etc/network/interfacesには、
フロントのswpポートの設定は記述されていません
このファイルを設定することで、フロントポートの設定を行うことができます

## /etc/network/interfacesの書き方
このファイルの書き方は、debian系の書き方と基本的に同じです。

### 設定ファイル記述例
下記のように設定ファイルを書きます。

```text:/etc/network/interfacesの記述例
# Management interface
auto eth0
iface eth0
  address 10.0.0.10/24
  gateway 10.0.0.1

# Front Port(swpXX)
auto swp1
iface swp1

auto swp2
iface swp2

```

インストール直後は、Front Portはファイルに記述されていません。
使用するポートについて都度記述する必要があります。
この設定などは、ansibleなどの構成管理ツールで管理すると便利です。

### ブリッジインタフェースの作成

上記の例では、起動時にポートがUpします。
ただし、この状態では2つのポート間はL2で通信できません。
ポート間の通信を可能にするには、スイッチ上にブリッジを作成して
通信させるポートを指定する必要があります。

```text:/etc/network/interfacesブリッジ例
〜上記例に追記〜
# bridgeインタフェースの作成
auto bridge
iface bridge
    bridge-ports swp1 swp2
    bridge-pvid 1
    bridge-vids 1-100
    bridge-vlan-aware yes
    bridge-stp on
```

![bridge.jpg](https://qiita-image-store.s3.amazonaws.com/0/20794/2d2cda36-52dd-5cbb-2b29-fb8c7a95c0d8.jpeg)

このように設定することで、swp1とswp2はbridgeインタフェースを介して
通信できるようになります。

###　ブリッジ設定の詳細

設定しているブリッジインターフェースについて掘り下げてみたいと思います。

- bridge-ports

```
bridge-ports swp1 swp2
```
このブリッジに接続するポートを指定しています。

- bridge-pvid

```
bridge-pvid 1
```
ブリッジのデフォルトVLAN IDを指定します。

- bridge-vids

```
bridge-vids 1-100
```

ブリッジで通信を許可するVLAN IDを指定します。
ここで指定しているVLAN ID以外のvlanの通信は行なえません。

- bridge-vlan-aware

```
bridge-vlan-aware yes
```
この設定で、ブリッジインタフェースが”Trunk”として動作するようにしています。

- bridge-stp

```
bridge-stp on
```
ブリッジでSTPを動作させます。

これ以外にも、bridgeに関する設定項目がありますがここでは割愛します。

# VLANの設定
## untagged portの設定
portをuntagged で設定するには、以下のように記述します

```
auto swp1
iface swp1
    bridge-access 10    
```
bridge-accessでVLAN IDを指定することにより、
swp1のポートはVLAN ID 10のuntagged portとして設定されます。

## tagged port の設定
tagged portとして、ポートにVLAN IDを割り当てる場合は、
以下のように設定します。

```
auto swp1
iface swp1
    bridge-vids 10
```
bridge-vidsでVLAN IDを指定することにより、
swp1のポートはVLAN ID 10のtagged portとして設定されます。
これによりこのポートはVLAN ID 10の設定をしている機器としか通信できません。

### Trunk portについて
bridgeインタフェースを設定する際に、
bridge-vlan-awareで”yes”と設定し、
bridge-portsで指定した物理ポート(swpXX)は、
インタフェースの設定時にbrige-accessの設定を行わない限り
Trunk Portとして動作します。

# 今回のまとめ
今回は、/etc/network/interfacesファイルの記述方法を通して、
L2の設定方法について書いてみました。
通常のスイッチの場合、VLAN IDを共通にしたポート間はそのままで通信できます。
しかしCumulus Linuxの場合ブリッジインタフェースを作成し、
ポートを指定する必要があるなど、
設定の考え方が若干異なるので、注意が必要でした。

ちなみに、interfacesファイルの記述については、
ansibleなどの構成管理ツールで一元管理すると便利です。
mako scriptなどで記述を省略することも可能なので、
その点については次回書いていきたいと思います。
Vue.js + webpack で環境ごとに設定ファイルを分ける

Vue.js と webpack の構成で、development や production などの環境ごとに設定ファイルを分ける方法のメモです。

### 設定ファイルの設置

`src/config/` に `development.js` や `production.js` の設定ファイルを設置します。

```javascript
export default {
  api_key: 'api_key_string'
}
```

### config ディレクトリのエイリアス指定

環境ごとに読み込めるように webpack のエイリアスを指定します。

```javascript
{
  resolve: {
    alias: {
      config: resolve(`src/config/${process.env.NODE_ENV}.js`)
    }
  }
}
```

### 設定ファイルの読み込み

```javascript
import config from 'config'

const configMixin = Vue.mixin({
  created: function () {
    this.$config = config
  }
})

store.dispatch('init').then(() => {
  new Vue({
    el: '#app',
    configMixin,
    components: { App },
    template: '<App/>'
  })
})
```

これで `this.$config.api_key` で呼び出せます。

### 環境の指定

`package.json` で NODE_ENV を明示的に環境を指定します。

```javascript
{
  "scripts": {
    "dev": "NODE_ENV=development webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "lint": "eslint --ext .js,.vue src",
    "build": "NODE_ENV=production node build/build.js"
  }
}
```
部下から見たダメな上司とは？

#はじめに
この記事を書いている日は2018年3月10日です。
来月、2018年4月ということで新卒の新入社員が多く入社する時期に当たります。初めて社会に出て不安や期待を持って入社してくる新人を大切にしてほしいと思っております。

私自身は2017年9月に現在勤めている会社に新卒として入社しました。
入社までは良かったのですが、入社から9日程度で客先常駐となりました。
もちろん研修はありませんでした。
そのため、この半年間仕事が上手くできず、自社の上司がイライラして暴言を浴びせるようにな状況です。（日本語分かる？、君の出た学校はおかしい等々・・・）
こんな状態になると、部下からの『報告・連絡・相談』は無くなると思っておいてください。

入社前からこのままではだめだと思い、自分で参考書を買うなどして基本的な勉強はしていますが、実務レベルに追い付くまではかなり時間がかかりそうです。

このような内容を投稿していいのか悩みましたが、
他人が自分と同じ苦しみを味わってほしくないため、今回の投稿をしました。

#ダメな上司

まず、部下から見たダメな上司を挙げていきます。

１．自分の常識が一般常識だと勘違いしている
２．教えることが甘えだと思っている
３．報連相をちゃんとしろと言う上司

**１．自分の常識が一般常識だと勘違いしている**
この上司にあたるとかなり大変です。新卒で入社してくる新人は大学での専攻が全く違う場合が多々あると思います。言葉一つとっても同じ言葉ではありますが、専攻が違うと全く違う意味になってしまうこともあるため、自分の常識が相手の常識にならないことが多々あります。

では、上司が部下に指導したり、上司と部下がアウトプットを共有したい場合はどのようにすればいいのか。
その場合は、指示やアウトプットを明確に伝えることが重要です。
部下が右も左も分からない時期は、特にこの点が重要になります。
上司がここまで言わなくても大丈夫だと思っていても大丈夫ではありません。
部下は理解できていると思い込んでいて、「分かりました。」と言ってしまいます。
１～１０まで教えるくらいのつもりで伝えてください。
**人は一定の基準まで理解できて、初めて考えることができるのです。**

**２．教えることが甘えだと思っている**
今の自分の上司がこれに当たります。
私が右も左も分からない時期に基本設計書を書く依頼があり、過去の基本設計書を見て分からなかったら質問しろと言われました。
ただ、右も左も分からないということは質問すらできないという状態です。
質問するにもある程度の知識が重要になってきます。
質問できるレベルまでに到達していない場合は、Off-JTを行うなど対策は出来るはずです。
それもせずに部下が質問してこないから悪い、質問しないやつは消極的だ、などという一般論だけで相手を見るのは相手を見ていないことと同等かそれ以下です。
それに加えて、教えることが甘えなんて言う上司は会社を潰すために働いてるとしか思えません。

**教えることが甘え、教えると自分で考えなくなるという無意味な幻想**は捨ててください。

**３．報連相をちゃんとしろと言う上司**
みなさんは報連相が大事と言いますが、報連相という言葉がどんな中で生まれたかご存知でしょうか？　知らない場合は下記のサイトで確認するのも良いかもしれません。

[報連相が持つ本来の意味を知る。意味がないかどうかは重要ではない。](https://fm0817.com/hourensou-mean)

報連相は部下側に大事だと一方的に指導していますが、一番大事にするべきは上司だと思います。
部下から報連相をしてほしいと思うのであれば、職場の雰囲気、風通しを良くするだけで解決できてしまいます。それでも報連相をしない人がいるのも重々承知していますが・・・。
私も高専時代に、後輩に対して報連相を徹底させようと間違った指導をしてしまったことがあります。この間違えた指導をしているときは全く報連相は機能しませんでした。
自分の失敗を認め、指導方法を変えました。
普通の会話や分からない部分をこちらから聴いて、一緒に考えました。
これだけで報連相が機能しはじめました。これをやれば良いだけなのにできていない上司がたくさんいます。

部下に報連相が大事だと言って、部下の仕事に対してフィードバックをしない上司も存在します。これは上司として信用されず、部下からの報連相なんてしてもらえるはずがありません。

#最後に
書き殴っただけの記事になってしまっています。もう少しまとめて書けばよかったです。
もし、部下を指導することになって困っている人は、自分が新卒の時にどのようなことで困っていたのか、不安だったのか、わくわくしていたのかを思い出すのが良いかもしれません。そこに新人を指導する際の一番のヒントや答えがあると思います。

そして、最後の最後に書きます。
一番ダメな上司は部下を委縮させて追い込むだけの上司です。
以上。
〜変数に入っている要素を確認〜　pメソッドでデバッグする（初心者の方向け）

#pメソッドとは？
pメソッドは変数の中身が、自分が思っている通りの物であるかを確認するときに使うメソッドです。
rubyに標準で搭載されています。

#pメソッド使い方

例えば、このようなメソッドを自作したとします。

```example.rb
#モデルの中に定義してます
def user_find(required_name)
 user_found = User.where(username: required_name)
end
```

```example_controller.rb
user = current_user.name
user_find(user)
```

example_controllerを行った結果、undefined method 'user_find' for nil:NilClass
というエラーメッセージが出てきたとします。
この場合、まずuserがnilということがわかり、またcurrent_user.nameもnilだということがわかります。

じゃあそもそもcurrent_userもnilなのではないかと考えられます。
そういうときに、pメソッドにを使います。

```example_controller.rb
p "############"
p current_user
p "#############"
user = current_user.name
user_find(user)
```
と書きます。
上のpメソッドを埋め込み、もう一度example_controllerを動かします。
ここ結構重要です。pメソッドを書き込んだcontrollerを動かさないと、pメソッドは発動しません。
また、p "#############"で挟んでいるのは、サーバーログのどこからどこまでが、pメソッドの結果になるのかをわかりやすくするためです。
その後、ターミナルでサーバーを見ます。

![スクリーンショット 2018-03-10 22.38.31.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/77424cf2-1366-a1fc-b701-7e83e85617bf.gif)

そうするとこんな感じで、nilだということがわかります。
じゃあここはなぜnilなのかという形で逆算していきます。

コーディングしていると、上のようなエラーは日常茶飯事かと思います。
ただ常に、自分が思い描いている条件が揃っているかを確認する際にはpメソッドはめちゃくちゃ使えます。
思わぬところでのエラーを発見できます。
ぜひ使って見てください！
DB2DBA: 統計プロファイルを用いたRUNSTAS

# 統計プロファイルとは
DB2のRUNSTATSには様々なオプションが用意されていますが、テーブル毎に異なる最適なオプションをRUNSTATSの都度指定したり、外部のファイル等で管理するのは煩雑な作業になりがちです。

DB2の統計プロファイル機能を用いると、テーブル毎のRUNSTASオプションをDB2側に記憶しておき、それらを参照してRUNSTASを実行できるようになります。統計プロファイルは自動保守のRUNSTATSでも利用されます。

なお、REORGにも同様の機能があって良さそうですが、今のところ (DB2 11.1) 提供されていません。

# 試してみた
## 統計プロファイルの作成
RUNSTATSにオプション```SET PROFILE```を指定すると、RUNSTATSの実行と共に指定されたオプションで統計プロファイルが作成されます。統計プロファイルの作成のみ行いたい場合は```SET PROFILE ONLY```を指定します。作成された統計プロファイルはSYSCAT.TABLESの```STATISTICS_PROFILE```列から確認できます。

```
db2 => runstats on table employee and indexes all set profile
DB20000I  RUNSTATS コマンドが正常に完了しました。
db2 => select substr(statistics_profile, 1, 80) from syscat.tables where tabname='EMPLOYEE'

1
--------------------------------------------------------------------------------
RUNSTATS ON TABLE "SVC34"."EMPLOYEE" ON ALL COLUMNS AND INDEXES ALL
```


## 統計プロファイルの利用
```USE PROFILE```オプションを指定することで、作成された統計プロファイルを利用してRUNSTATSを実行できます。

```
db2 => select substr(indname, 1, 30), stats_time from syscat.indexes where tabname = 'EMPLOYEE'

1                              STATS_TIME
------------------------------ --------------------------
PK_EMPLOYEE                    2018-03-10-21.05.31.879000
XEMP2                          2018-03-10-21.05.31.879000

  2 レコードが選択されました。

db2 => runstats on table employee use profile
DB20000I  RUNSTATS コマンドが正常に完了しました。
db2 => select substr(indname, 1, 30), stats_time from syscat.indexes where tabname = 'EMPLOYEE'

1                              STATS_TIME
------------------------------ --------------------------
PK_EMPLOYEE                    2018-03-10-21.07.13.021000
XEMP2                          2018-03-10-21.07.13.021000

  2 レコードが選択されました。
```

統計プロファイルのAND INDEXES ALLオプションにより、索引の統計情報も更新されました。




## 統計プロファイルの再作成と更新
統計プロファイルは```SET POFILE```つきRUNSTATSの再実行により再作成されます。一方```UPDATE PROFILE```というオプションも用意されていますが、これは既存の統計プロファイルの一部のみ変更するものです。

```
db2 => runstats on table employee with distribution update profile only
DB20000I  RUNSTATS コマンドが正常に完了しました。
db2 => select substr(statistics_profile, 1, 100) from syscat.tables where tabname='EMPLOYEE'

1
----------------------------------------------------------------------------------------------------
RUNSTATS ON TABLE "SVC34"."EMPLOYEE" ON ALL COLUMNS WITH DISTRIBUTION ON ALL COLUMNS AND INDEXES ALL

  1 レコードが選択されました。
```

先ほどの統計プロファイルに```WITH DISTRIBUTION```オプションが追加されました。


## 統計プロファイルの削除
統計プロファイルの削除は```UNSET PROFILE```オプションにより行います。

```
db2 => runstats on table employee unset profile
DB20000I  RUNSTATS コマンドが正常に完了しました。
db2 => select substr(statistics_profile, 1, 80) from syscat.tables where tabname='EMPLOYEE'

1
--------------------------------------------------------------------------------
-

  1 レコードが選択されました。
```

# 参考資料
- IBM Knowledge Center
    - DB2 for Linux UNIX and Windows 11.1.0
        - [統計プロファイルを使用した統計の収集](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0011392.html)
同じ値を持つ配列を比較しても等価にならない

同じ値を持つ配列二つを比較しても、等しくない。

```
var array1 = new int[] { 4 };
var array2 = new int[] { 4 };

// Trueが出力される（二つの配列が持つ値は等価である）
Console.WriteLine(array1[0].Equals(array2[0]));

// Falseが出力される（二つの配列は等しくない）
Console.WriteLine(array1.Equals(array2));
```

配列ではなく、数値型の変数で比較したら、等価である。

```
var int1 = 4;
var int2 = 4;

// Trueが出力される（二つの数値は等価である）
Console.WriteLine(int1.Equals(int2));
```

つまりクラスのようにnewしたオブジェクトは、たとえ一時的に同じ値を持っているとしても、比較したら等しくない。

```
var class1 = new Hoge();
var class2 = new Hoge();

// Falseが出力される（二つのクラスは等しくない）
Console.WriteLine(class1.Equals(class2));
```

先ほど等しくないと認定された配列やクラスも、比較先の変数をまるっと代入すれば等価になる。

```
array1 = array2;

// Trueが出力される（二つの配列は等価である）
Console.WriteLine(array1.Equals(array2));

class1 = class2;

// Trueが出力される（二つのクラスは等価である）
Console.WriteLine(class1.Equals(class2));
```

これは、array1やclass1に代入されていた値はもう見なくなり、array2やclass2の中身（参照先）を見るようになるから。

なお、文字列は、同じ値を持っていたら同一である。
文字列は参照型。したがって、「参照型は同じ値でも等しくない」とは言えず、今回の話題とはまた別の話。

```
var string1 = "hoge";
var string2 = "hoge";

// Trueが出力される（二つの文字列は等価である）
Console.WriteLine(string1.Equals(string2));
```

（以下コメントいただいた内容について、追記しました。）

Linqでシーケンスを扱うためのSequenceEqualメソッドを使用すると、配列の要素が全部同じかどうかを判定してくれる。

```

using System.Linq;

var array1 = new int[] { 4 };
var array2 = new int[] { 4 };

// Trueが出力される（二つの配列が持つ値は等価である）
Console.WriteLine(array1.SequenceEqual(array2));
```
よく忘れるRubyの配列の状態を変更するメソッド

# まえがき
・よく忘れるので独自の切り口でまとめてみた。

## 配列の「状態を変更」とは？


Rubyの配列オブジェクトには、CRUD操作を行う便利なメソッドが用意されている。
ちなみにCRUDとは、下記の単語の頭文字をとったもの。

>Create
>Read
>Update
>Delete

この配列のCRUD操作のメソッドの中で、UpdateとDeleteを行うメソッドが、「状態を変更」するメソッド。
なので、「配列の状態を変更するメソッド」は下記の2種類に大別できる。

>（1）UPDATE系
>（2）DELETE系

そして「UPDATE系」「DELETE系」には大まかに3種類の位置を指定するメソッドが存在する。

>（1）先頭
>（2）末尾
>（3）直接指定

ここでメソッドの全体像を整理すると下記のような図を描ける。


```
　
- Update - unshift(先頭)
|        - push(末尾)
|        - insert（直接指定）
|
|
- Delete - shift(先頭)
         - pop(末尾)
         - delete, delete_at(直接指定)
　
```

では、それぞれのメソッドの挙動を詳しく見ていく。（ちなみに配列の中身は、すべてラーメン）

# UPDATE系のメソッド

## unshift 

・配列の先頭に要素を追加する
 
```rb
ramens = ["miso", "tonkotsu", "shoyu"]
p ramens.unshift("shio")

=> ["shio", "miso", "tonkotsu", "shoyu"] # shioが先頭に追加された
```
## push
・配列の末尾に要素を追加する。
・`<<`も同じ意味。

```rb
ramens = ["miso", "tonkotsu", "shoyu"]
p ramens.push("shio") # pushで追加

=>["miso", "tonkotsu", "shoyu", "shio"]  # shioが末尾に追加された

p ramens << "tsukemen" ## << で追加

=> ["miso", "tonkotsu", "shoyu", "shio", "tsukemen"] # tsukemenが末尾に追加された

```

## insert 
・配列の位置を指定して、要素を追加する。
・第一引数に「挿入位置」、第二引数に「挿入要素」。

```rb
ramens = ["miso", "tonkotsu", "shoyu"]
p ramens.insert(0,"shio")

=> ["shio", "miso", "tonkotsu", "shoyu"] # 配列の0番目にshioが追加された
```

## UPDATE系メソッドの共通点

・いずれのメソッドもオブジェクトの状態を変更する破壊的メソッド。
・要素を追加した配列オブジェクト（=レシーバ）が、返り値として返ってくる。

# DELETE系のメソッド

## shift

・配列の先頭の要素を削除する。  


```rb
ramens = ["miso", "tonkotsu", "shoyu"]

ramens.shift

=> "miso" # shiftによって、削除された要素が返り値になる

p ramens 

=> ["tonkotsu", "shoyu"]  # misoが先頭から削除された
```

## pop
・配列の末尾の要素を削除する。

```rb
ramens = ["miso", "tonkotsu", "shoyu"]
ramens.pop  # popによって、削除された要素が返り値

=> "syoyu"

p ramens 

=>  ["miso", "tonkotsu"] # shoyuが末尾から削除された
```

## delete
・配列の「要素」を指定して削除する。

```rb
ramens = ["miso", "tonkotsu", "shoyu"]
ramens.delete("tonkotsu")

=> "tonkotsu"

p ramens

=> ["miso", "shoyu"]
```
## delete_at
・配列のインデックスを指定して削除する。


```rb
ramens = ["miso", "tonkotsu", "shoyu"]
ramens.delete_at(0)

=> "miso"

p ramens

=> ["tonkotsu", "shoyu"]
```

## DELETE系メソッドの共通点

・いずれのメソッドもオブジェクトの状態を変更する破壊的メソッド。
・いずれのメソッドも削除した要素が返り値として返ってくる。
プログラミング言語Goを読みながらメモ(第二章)

[プログラミング言語 Go]( https://www.amazon.co.jp/dp/4621300253 ) を読みながらメモ。

前回の第一章は
https://qiita.com/Nabetani/items/077c6b4d3d1ce0a2c3fd
にある。

で。

#省略変数宣言

`names:=expressions` 型の変数宣言で、 `names` に、宣言済みの変数が合っても良いというのは意外だった。

```go:go
package main

import (
	"fmt"
	"os"
)

func main() {
	hoge, err := os.Open("hoge")
	fmt.Println("hoge: ", hoge, ", err:", err)
	fuga, err := os.Open("fuga") // okay, fuga is new variable
	fmt.Println("fuga: ", fuga, ", err:", err)
	fuga, err := os.Open("fuga") // error! no new variables on left side of :=
}
```

まあエラー変数をたくさん作りたくないからということだと思うんだけど、ちょっと気持ち悪い。

あと。省略変数宣言は、グローバル変数の宣言には使えない。なんでそうしたんだろう。

# ポインタ

`flag` パッケージの選択が乱暴で面白い。
何も指定しなくても `-h` と `-help` で　usage が出る。`flag.Parse()` で出力して exit している感じ。

# new 関数

構造体や配列のサイズがゼロの場合にアドレスが重複することがあるというのに驚いた。
C++ とは異なる。

```go:go
package main

import (
	"fmt"
)

func main() {
	a := new([0]int)
	b := new([0]int)
	fmt.Printf("%v %v %t\n", a, b, a == b) //=> &[] &[] true
	c := new([1]int)
	d := new([1]int)
	fmt.Printf("%v %v %t\n", c, d, c == d) //=> &[0] &[0] false
}
```

手元の処理系では、同一アドレスが割り当てられているらしいことがわかる。

一方 C++ では

```c++:C++11
#include <iostream>

struct empty{};

int main()
{
  auto * a = new empty;
  auto * b = new empty;
  std::cout << a <<", " << b << ", " << (a==b) << std::endl;
  //=> 0x7fc239400300, 0x7fc239400360, 0
}
```

という具合で、必ず別のアドレスが割り当てられる。

# 型宣言

p43 に

> 全ての型 T に対して値 x を T型に変換するような対応する変換演算 T(x) があります。

とあるので、なんでも変換できるような気がしてしまったが、もちろんそんなことはない。
コンパイルエラーにならないという意味ですらない。

```go:go
package main

import "fmt"

func main() {
	str := "string"
	a := int(str) // cannot convert str (type string) to type int
	b := [3]int(str) // cannot convert str (type string) to type [3]int
	fmt.Println(a, b)
}
```

無茶な変換は、ちゃんとコンパイルエラーになる。

# パッケージ初期化

依存関係が循環していると、ちゃんとエラーになる。

```go:go
package main

import "fmt"

var a = b + c // typechecking loop involving a = b + c
var b = c + a
var c = a + b

func main() {
	fmt.Println(a, b, c)
}
```

実際には、
>./2.6.2.go:5:5: typechecking loop involving a = b + c
	/Users/nabetani/gobook/2/2.6.2.go:5:5 a
	/Users/nabetani/gobook/2/2.6.2.go:7:11 a + b
	/Users/nabetani/gobook/2/2.6.2.go:7:5 c = a + b
	/Users/nabetani/gobook/2/2.6.2.go:7:5 c
	/Users/nabetani/gobook/2/2.6.2.go:6:11 c + a
	/Users/nabetani/gobook/2/2.6.2.go:6:5 b = c + a
	/Users/nabetani/gobook/2/2.6.2.go:6:5 b
	/Users/nabetani/gobook/2/2.6.2.go:5:11 b + c
	/Users/nabetani/gobook/2/2.6.2.go:5:5 a = b + c

という、ちょっと膨大なエラーが出ていて、何がどう循環しているのかわかるようになっている。親切。

# スコープ

省略変数宣言 で、前述のような驚きがあったので、下記のような省略時宣言がどうなるのかちょっと気になった。

```go:go
package main

import "fmt"

func main() {
	x, y := 1, 2
	{
		x, y := "foo", "bar"
		fmt.Println(x, y) //=> foo, bar
	}
	fmt.Println(x, y) //=> 1, 2
}
```

当然、上記のようになる。そうじゃないと困るよね。

あと。

>Go の普通の慣習では if ブロック内でエラーを処理してリターンします

と書いてあって、ちょっと驚いた。私もその方が好きだけど、古い「関数内に return は1個だけ！」という慣習にとらわれている人は考えを改める必要があるだろう。

第三章は
https://qiita.com/Nabetani/items/2fd9c372fcd8383955a5
にある。
[Python/pandas] カテゴリカル変数をいい感じに前処理する

カテゴリカル変数のOneHotEncodingをしようと四苦八苦しました。scikit-learnの[preprocessing](http://scikit-learn.org/stable/modules/preprocessing.html)でなんとか、と思っていたんですが、結局pandasの関数で一瞬で解決することがわかったのでそれをメモしておきます。

数時間試行錯誤していたのがアホらしくなるほどあっさり解決してしまったので、きっといるであろう同じつまづきをしている世の技術者の助けになればと思います

# 参考
[pandas - pandas.get_dummies](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html)

# やりかた
Kaggleでも有名な[titanic](https://www.kaggle.com/c/titanic)のデータセットを使います。DataFrameとして取り込んだ状態から始めます

jupyter notebookの出力をそのまま使いたいところですが、Qiita上にうまいこと貼り付ける手段を知らないので、tableは別途[csvtomd](https://github.com/mplewis/csvtomd)を使って生成したやつをコピペしてます。ご了承ください。


## DataFrame読み込み

```python
df_train = pd.read_csv("train.csv")

df_train.head()
```

PassengerId  |  Survived  |  Pclass  |  Name                                                 |  Sex     |  Age  |  SibSp  |  Parch  |  Ticket            |  Fare     |  Cabin  |  Embarked
-------------|------------|----------|-------------------------------------------------------|----------|-------|---------|---------|--------------------|-----------|---------|----------
1            |  0         |  3       |  Braund, Mr. Owen Harris                              |  male    |  22   |  1      |  0      |  A/5 21171         |  7.25     |         |  S
2            |  1         |  1       |  Cumings, Mrs. John Bradley (Florence Briggs Thayer)  |  female  |  38   |  1      |  0      |  PC 17599          |  71.2833  |  C85    |  C
3            |  1         |  3       |  Heikkinen, Miss. Laina                               |  female  |  26   |  0      |  0      |  STON/O2. 3101282  |  7.925    |         |  S
4            |  1         |  1       |  Futrelle, Mrs. Jacques Heath (Lily May Peel)         |  female  |  35   |  1      |  0      |  113803            |  53.1     |  C123   |  S
5            |  0         |  3       |  Allen, Mr. William Henry                             |  male    |  35   |  0      |  0      |  373450            |  8.05     |         |  S


## ダミー変数への変換

```python
# カテゴリカル変数の1つである "Pclass" をエンコード
# プリフィックス "Pclass" をつけてカラムの判別がつくようにする
encoded = pd.get_dummies(df_train.Pclass, prefix=df_train.Pclass.name ,prefix_sep="_")

encoded.head()
```

   |  Pclass_1  |  Pclass_2  |  Pclass_3
---|------------|------------|----------
0  |  0         |  0         |  1
1  |  1         |  0         |  0
2  |  0         |  0         |  1
3  |  1         |  0         |  0
4  |  0         |  0         |  1


以上です。あとは `DataFrame.drop` で元のPclass列を落として、代わりにこれらの列をjoinしてあげるだけです。関数を知ってしまえば一瞬なんですが、知らないことで無駄な時間を遣ってしまいました。
Sublime Text3で.jsファイルをjsxでsyntax highlightしたい

おそらく何もしないとReactのjsxが書いてある.js拡張子のファイルはシンタックスハイライトがうまくいかないと思いますが以下でいい感じになります。

1. Package Control: Install Package で Babel をインストール
2. なんでもいいので.jsファイルを開く
3. View > Syntax > Open all with current extension as... で Babel > JavaScript (Babel) を選択

ポイントとしてはJSX〜と付くようなパッケージは不要というのと、3番目の現在の拡張子に全て適用する〜の操作ですかね。
echoの出力には改行が含まれ、当然、ハッシュ値も変わる

#'a'のSHA256は？

シェルからコマンドを使って...

```bash
$ echo a | sha256sum 
87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7  -
```
一旦、ファイルに保存して

```bash
$ echo a > a.txt
$ sha256sum a.txt
87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7  a.txt 
```
結果は同じ。

次は、最近始めたPythonで...

```python
>>> import hashlib
>>> hashlib.sha256(b"a").hexdigest()
'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb'
```

結果が異なる。
なぜだ...それはシェルで試した例では`sha256sum`の入力(= `echo`の出力)に改行コード(LF)が付いていたからでした。
ちょっと調べてみると、`echo`の出力に改行コードをつけないためには`-n`オプション指定するようなので...

```bash
$ echo -n a | sha256sum 
ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb  -
```

Pythonで求めた結果と一致した。
というわけで、'a'のSHA256は`ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb`が正解。

#'a'+LFのSHA256

`echo`の出力に改行コード(LF)が付いているのに気づいたのは、何気なくファイルをダンプしたとき。

```bash
$ xxd a.txt 
00000000: 610a                                     a.
```

'a'(=0x61)の後ろにLF(=0x0a)がくっついてる。
﻿PythonでLFを含めたバイト列のハッシュ値を取得すると...

```python
>>> hashlib.sha256(b"\x61\x0a").hexdigest()
'87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7'
```
シェルからコマンドを使って取得した値と一致した。
ということで、'a'+LFのSHA256が`87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7`。

#まとめ

シェルで文字列のハッシュ値を求める時に`echo`を使うのであれば改行コードを付けないように`-n`オプションを指定する必要がある。改行コードを付けてしまうと、当然、（本来求めたいはずの）改行コードを付けない文字列のハッシュ値とは全く異なる値になってしまう。