OmniAICreator/Qiita-1.07M huggingface dataset:
Powershell起動時にログ取得自動開始しプロンプトに時間を表示する

この記事は[PowerShell Advent Calendar 2017]("https://qiita.com/advent-calendar/2017/powershell")の15日目です。

---
## はじめに
サーバを触る時、ログやエビデンスを取得して欲しい。
プロマネとしてお仕事させて頂く際、作業を担当してくださる方々にいつもお願いをしていました。
手順は事前に十分な確認を取り、トラブルにならないように備えるのが当然と考えますが、手を動かすのは人。
何も起こらなければ取り敢えずOKだとしても、作業がトラブルにつながる事も十分にありえます。

それを少しでも低減しトラブル時はログを置いやすくするべく、Powershellによる作業時にログ取得自動化を目指しました。
似たお悩みを持つ情シスさん、エンジニアさんの参考になれば幸いです。

## 実装した機能
* Powershell及びPowershell ISE起動時にログを自動取得開始
    * ユーザ単位ではなく、どのユーザでも取得することを目標としました。
* プロンプトに時刻表示させることで、ログにコマンド実行時刻を記録
    * 注意点としては、プロンプトが表示されてからコマンドレット実行が直ぐに行われていないと現実との乖離が発生することです。無いよりマシという考えで実装しました。

## 動作確認した環境
| OS | $PSVersionTableのPSVersion |
|---|---|
| 2012R2 | 4.0 |
| 10 | 5.1.16299.64 |
何れもWORKGROUP環境です。

## Powershell Scriptの実行環境
Scriptにもコメントで入れましたが、配置先等の情報です。

|情報|詳細|
|---|---|
| 配置先 | C:\Windows\System32\WindowsPowerShell\v1.0\ |
| ファイル名 | profile.ps1 |
| Powershellの実行ポリシー | Remotesigned |

# Powershell Script

```profile.ps1
<#
 Powershell起動時の自動実行Script
   FileName        : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
   Script Version  : 1.0 
   ExecutionPolicy : Remotesigned
   LastUpdate      : 2017/12/10

   History:
    2017/12/10 新規作成(自動ログ取得,プロンプト時刻表示実装)
#>

# 自動ログ取得開始
$LogFolder   = 'C:\_work\_Logs'
$TimeStamp   = (Get-Date -Format 'yyyyMMdd-HHmmss')
$UserInfo    = $Env:COMPUTERNAME + '-' + $Env:USERNAME
$LogFilePath = $LogFolder + '\PS_' + $TimeStamp + '_' + $UserInfo + '.log'

Start-Transcript -Path $LogFilePath -Append

# プロンプトに時刻表示
function global:prompt {
  (Get-Date -format "[yyyy/MM/dd HH:mm:ss]") + " PS " + $(get-location) + "> "
}

```
Qtでオーディオクラスを使う

Qtを使ってIP電話アプリを作っていて、音声を入出力する必要がありました。

Qtに限らず一般的に、オーディオデバイスを使うのって難しいよね、という固定観念がありました。WindowsのマルチメディアAPIが複雑怪奇なので、オーディオ制御するの面倒だなぁ、と思い込んでいました。LinuxやMacに至っては、APIの呼び出し方さえ知りません。それを試しにQtを使ってやってみたら、アホみたいに簡単だったというお話です。

Qtがサポートするマルチメディア機能は豊富（だと思う）のですが、初歩中の初歩、音を鳴らして、同時に入力するだけ、という、最も基本の機能を使ってみます。

とりあえず、Qtウィジェットアプリケーションを新規作成して、プログレスバーを配置します。

![progressbar.png](https://qiita-image-store.s3.amazonaws.com/0/61222/35a1f88d-94b4-3e33-3049-b3160571d48a.png)

プロジェクトファイルに、

```
QT += multimedia
```

を追加しておきます。

メインウィンドウのヘッダです。

``` MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QAudioInput>
#include <QAudioOutput>
#include <QMainWindow>
#include <memory>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
	Q_OBJECT
private:
	std::shared_ptr<QAudioInput> audio_input;
	std::shared_ptr<QAudioOutput> audio_output;
	QIODevice *audio_input_device;
	QIODevice *audio_output_device;
	int count = 0;
protected:
	void timerEvent(QTimerEvent *event);
public:
	explicit MainWindow(QWidget *parent = 0);
	~MainWindow();
private slots:
	void onReadyRead();
private:
	Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
```

メインウィンドウのソースです。

``` MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QAudioFormat>

MainWindow::MainWindow(QWidget *parent) :
	QMainWindow(parent),
	ui(new Ui::MainWindow)
{
	ui->setupUi(this);

	QAudioFormat format;
	format.setByteOrder(QAudioFormat::LittleEndian);
	format.setChannelCount(1);
	format.setCodec("audio/pcm");
	format.setSampleRate(8000);
	format.setSampleSize(16);
	format.setSampleType(QAudioFormat::SignedInt);
	audio_input = std::shared_ptr<QAudioInput>(new QAudioInput(format));
	audio_output = std::shared_ptr<QAudioOutput>(new QAudioOutput(format));
	audio_input_device = audio_input->start();
	audio_output_device = audio_output->start();
	connect(audio_input_device, SIGNAL(readyRead()), this, SLOT(onReadyRead()));

	ui->progressBar->setRange(0, 100);
	ui->progressBar->setValue(0);

	startTimer(10);
}

MainWindow::~MainWindow()
{
	delete ui;
}

void MainWindow::onReadyRead()
{
	QByteArray ba = audio_input_device->readAll();
	int n = ba.size() / 2;
	int16_t *p = (int16_t *)ba.data();
	int max = 0;
	for (int i = 0; i < n; i++) {
		int v = p[i];
		if (v < 0) v = -v;
		if (max < v) {
			max = v;
		}
	}
	int pos = max * 100 / 32768;
	ui->progressBar->setValue(pos);
}

void MainWindow::timerEvent(QTimerEvent *event)
{
	int len = audio_output->bytesFree();
	int n = len / 2;
	if (n > 0) {
		std::vector<int16_t> buf(n);
		for (int i = 0; i < n; i++) {
			buf[i] = (count & 8) ? 10000 : -10000;
			count++;
			if (count >= 8000) {
				count = 0;
			}
		}
		audio_output_device->write((char const *)&buf[0], buf.size() * 2);
	}
}
```

とりあえず定数は決め打ちにしています。8kHz、16ビット、モノラルです。

オーディオ入力からのデータがある程度貯まったら、readyReadシグナルが発行されますので、データを受け取ります。このプログラムでは、最大値を求めてプログレスバーを更新しています。

10msごとのタイマイベントを発生させて、出力に空きがあれば、音声データを書き込みます。単純に500Hzの矩形波を生成しています。

ところで、QAudioInputやQAudioOutputというクラスですが、プラットフォームによって挙動が少し異なります。マルチスレッドの中で使うと、うまく動作しないことがあります。Qtのイベントループが廻るスレッド（メインのGUIスレッド）でQAudioInputやQAudioOutputを使うのが推奨のようです。
16個のワンライナーdef文で構成された縛りFizzBuzz。if, 剰余禁止

何日めか忘れたけどFizzBuzzアドベントカレンダーです。

## 今回のコンセプト

* if文を使わない
* 剰余を使わない
* 実行文とモジュール定義文以外全部ワンライナーのdef文
* その他無駄なこだわり

## ソースコード

```fizz_buzz.ex
defmodule FizzBuzz do

  def fizzBuzz(num), do: _notFB(_fizz(oneDigit(Integer.to_charlist(num))) <> _buzz(_getLastDigit(Integer.to_charlist(num))) , num)

  def sumDigit([head | []]), do: head - 48
  def sumDigit([head | tail]), do: head - 48 + sumDigit(tail)

  def oneDigit([head | []]), do: head - 48
  def oneDigit(list), do: oneDigit(Integer.to_charlist(sumDigit(list)))

  def _fizz(3), do: "Fizz"
  def _fizz(6), do: "Fizz"
  def _fizz(9), do: "Fizz"
  def _fizz(_), do: ""

  def _getLastDigit([head | []]), do: head - 48
  def _getLastDigit([_ | tail]), do: _getLastDigit(tail)

  def _buzz(5), do: "Buzz"
  def _buzz(0), do: "Buzz"
  def _buzz(_), do: ""

  def _notFB("", num), do: Integer.to_charlist(num)
  def _notFB(some, _), do: some

end

Enum.map(1..100, fn(x) -> IO.puts FizzBuzz.fizzBuzz(x) end)
```

## 解説


Elixirで書きました。If文を使わない、の部分はパターンマッチで対処しています。

上から読んでいきます。

### FizzBuzz本体

```
   def fizzBuzz(num), do: _notFB(_fizz(oneDigit(Integer.to_charlist(num))) <> _buzz(_getLastDigit(Integer.to_charlist(num))) , num)
```

他で定義した関数をつなげて実行するだけです。

### Fizz

```
  def sumDigit([head | []]), do: head - 48
  def sumDigit([head | tail]), do: head - 48 + sumDigit(tail)

  def oneDigit([head | []]), do: head - 48
  def oneDigit(list), do: oneDigit(Integer.to_charlist(sumDigit(list)))

  def _fizz(3), do: "Fizz"
  def _fizz(6), do: "Fizz"
  def _fizz(9), do: "Fizz"
  def _fizz(_), do: ""
```

今回は剰余を使わない、という条件があるため、各桁の和が３の倍数であれば３の倍数という性質を利用しています。Elixirには、Charlistは、int型のｌistと同じ型という性質があるため、一文字ずつ４８を引いて（ASCII -> int）再帰的に処理しています。

### Buzz

```
  def _buzz(5), do: "Buzz"
  def _buzz(0), do: "Buzz"
  def _buzz(_), do: ""

  def _notFB("", num), do: Integer.to_charlist(num)
  def _notFB(some, _), do: some
```

こちらは単純に最後が5か0かで判断しています。

## 文字列の結合

```
  def _notFB("", num), do: Integer.to_charlist(num)
  def _notFB(some, _), do: some
```

今までの関数は、該当する場合、Fizzを該当しない場合Buzzを返していました。この関数で、から文字列でない場合はその文字列を、から文字列sの場合は数字を返却しています。

### 実行文

```
Enum.map(1..100, fn(x) -> IO.puts FizzBuzz.fizzBuzz(x) end)
```

なんのひねりもない繰り返しです。

## まとめ

FizzBuzは楽しい
XCode9のBotを使ってみる

# はじめに
XCode9よりXCode Serverを利用したBotを利用できるということで、
試してみました。

## Botができること
* 静的解析
* テスト
* アーカイブ

## 前提
対象のソースコードは、リモート上に置いておくこと。
今回は、github上に配置しました。

# セットアップ
①「Preferences」 -> 「Server & Bots」を開く
<img width="350" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/14ce996c-a8ee-9231-3199-c37ca18dc66c.png">

②右上のスイッチをONにする
<img width="350" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d8f2a437-5e88-add6-c5bb-77167ae6d5c7.png">

# Botの作成
①「Product」 -> 「Create Bot」を選択する
<img width="350" alt="スクリーンショット 2017-12-10 18.59.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/0c71a165-5e71-0bd0-2410-7574edea92e8.png">

②「Add New Server」でサーバーを選択する
今回は自分のPCを選択しました。
<img width="350" alt="スクリーンショット 2017-12-10 19.02.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/446bb6c9-cdad-4ad0-cd86-ba52b99bc100.png">


③ソースコードの認証方法を設定する
<img width="350" alt="スクリーンショット 2017-12-10 19.07.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d2b5152d-0edd-6314-9781-06ded22b467a.png">

④Botのアクションを設定する
今回はテストのみを設定します。

<img width="350" alt="スクリーンショット 2017-12-10 19.11.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/7e43fb5a-0b47-31ed-d01b-d9cf562fdbe9.png">

⑤Botの実行間隔を設定する
下記の3パターンを選択できます。
今回は、1時間に1回実行してみます。

|設定|説明|
|---|---|
| Periodically| 実行間隔を指定して実行 |
| On Commit | コミット時に実行 |
| Manualy | 手動で実行 |

<img width="350" alt="スクリーンショット 2017-12-10 19.18.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/01f8cffa-a78c-2b56-0c5a-147bd8a4e3ce.png">

⑥テストを実行するデバイスを設定する
今回は、「Specific iOS Device and Simulators」を選択し、
iPhone8とiPhone8 Plusを選択します。

<img width="350" alt="スクリーンショット 2017-12-10 19.20.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/edaa8ff2-c8a8-82c6-fa8b-2121f943bf3f.png">

⑦あとは、Successになるまで進める

# 実行結果
<img width="500" alt="スクリーンショット 2017-12-10 19.25.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d9f84b89-5666-f2b9-1923-e64f85812470.png">

#### ビルド履歴
<img width="500" alt="スクリーンショット 2017-12-10 19.25.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/a1fb4cbb-0122-4967-5a4e-10008b640e6a.png">

#### テスト履歴
今回はテストケース2件が成功しました。
<img width="500" alt="スクリーンショット 2017-12-10 19.26.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/00043283-4ace-3c94-5ef8-16f28da878f4.png">

#### カバレッジ履歴
今回はカバレッジが68%でした。
<img width="500" alt="スクリーンショット 2017-12-10 19.26.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/34334483-a78c-121d-3c84-41bcfed8aceb.png">

View Code Coverrageを辿っていくと、
詳細が確認できます。

<img width="500" alt="スクリーンショット 2017-12-10 19.32.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/cdc51809-9bfc-f944-3238-da5c16ada469.png">

# まとめ
今回はテストのみ試してみましたが、静的解析やアーカイブも出来るようなので、
今度試してみたいと思います。
エンジニアリングと写真

僕はLIGのフロントエンドエンジニアという肩書なのだけれど、同時に自社の事業の一つである[旅と音楽](https://liginc.co.jp/series/travelandmusic)で彼らのライブ写真を撮らせてもらっている。
ライブの写真を撮ることだけについて言えば、彼らに限らず色んな方を撮ってきた。
ライブフォトグラファーと名乗るにはおこがましいが、現時点で思っていることをほんの3つに分けて、少しだけれどここに書き留めようと思う。  

## 瞬間
まず、僕の機材はsony α7sに55mmの単焦点だ。他は持ち込まない。
これはこれ以上望遠のレンズを持ち合わせていないからという理由以外に、もう一つ大きな理由がある。  
それは、一番演者といい距離にいられるからだ。
フロアの一番エネルギーのあふれるエリア。そこから見え、感じられる景色を切り取ることは僕にとって一番高揚する瞬間だ。
僕はその瞬間、特に演者の表情を撮る。

これは批判ではないとこを最初に言っておきたいのだけれど、後ろから撮るより、熱を感じながら撮るほうがきっと楽しいのだ。
もしかして望遠レンズを持っていたら、また違うかもしれないが、今はそうだと言っておきたい。
だから他の客と同じように、体を揺らしながらその瞬間を見ている。


## 愛
しかし、初見や好きになる前の状態ではほとんど失敗する。
ブレるから？ピントが合わないから？
いや、写真がどうとかではなく、本質がだ。
なぜかというと、そこに愛がないからだ。
演者の想いやフロアの熱を理解しないまま撮るものはなんだかうまく切り取れない。

でも愛があれば現像の瞬間まで向き合うことができる。
だから愛することができるよう、考える。

旅と音楽も愛している。
[野田クラクションべべー](https://twitter.com/nodaklaxonbebe)のステージは愛しているからもっとこうしなよって毎回思う。
嘘、本当は[観音クリエイション](https://twitter.com/kannnonn)さんのトラックが好きだ。

## 影響
写真は制作のインスピレーションに大きな影響を与える。
制作でも愛がないとだめだと思う。

サイトの目的や本質を理解し、想いを感じることができれば、アニメーションなどの演出も愛を持って制作できると思っている。
そんなクライアントと出会いたいという一方通行、上から目線は置いておこう。

でも愛があれば納品のその瞬間まで向き合うことができる。
だから愛することができるよう、考える。


## 最後

これが僕の広義に捉える制作への持論である。
もし撮らせてみたいと思う方が出てきてくれたら幸いに思う。
もういい歳だけどITエンジニアにでもなろうかなと考えている同志へ

##概要

高卒、26歳迄バンド活動をしながらフリーターとして生きてきた人間が
ITエンジニアになって2年半が経過して思う戯言。

　
##きっかけ

~~音楽性の違いという極めてロックな理由で~~バンドの解散を迫られる事になり、
将来について大きな不安を抱えていた訳では無いが、気づけば20代後半。
（本当は求人サイトを見て結構焦りましたw）
　

特にやりたいことも無く、社会人として生きてみようかなくらいの動機、
ぼんやりと自分に合いそうな求人を眺めていた。
時事ネタにも関心の無い自分がどうしてあの[動画](https://www.youtube.com/watch?v=6XvmhE1J9PY)と出会ったかは覚えていない。

アメリカ前大統領、オバマ氏の・・・なんだっけ？ww
とにかくこのセリフだけは耳に残った。
　

**「若者よ、プログラミングを学んでくれ！！」**
　

おぉ、なんかよくわかんないけどそういう時代なのかな？
昔からゲームとか好きだし、いいかも！！！

そんな感じで、IT関連の求人を探す事に

~~そういや、ITってインターネットって意味だよな・・・・・・~~

　

##採用まで

お察しの通りIT知識は皆無、PCについてもネトサくらいの経験しかなかった。
しかしどうやらこの業界、未経験、20代後半でも採用の希望はあるようだ。
（さすがに大手は無謀！！~~応募用途ガン無視で履歴書出してみたけど・・・~~）

結果として、いわゆるベンチャー企業の面談にありつけることができた。

「ここが〇〇会社・・・・か？」

ビルの表札に会社名すらないボロビルの一室、扉にはA4コピー用紙にプリントアウトされた会社名が確認できた。
おいおい、この業界ブラックとの噂は名高いが、それ以前の問題じゃ？俺、帰らぬ人になるんじゃ。

恐る恐るインターフォンに手を伸ばす・・・・
　　
　　　
　　
　　
　




先に話しておくが、面談は問題なく終了した。（小規模ベンチャーではよくある事務所です、疑ってすみません。）
むしろ暖かい人格の方と出会えた。

本来はゲーム関係を志望　していたが、Webエンジニアとしての採用となった。
それでも有難いという気持ちが大きく、是非お願いしますと返答した。

自分で言うのもあれだが、人柄採用というものだろう。
もちろん技術力の高さは最たるアドバンテージとなるが、実際に人間性を重視するという人にもたくさん出会っている。
スキル不足に臆して、立ち止まる必要はないんだなぁ・・・。

##仕事をはじめて

フロントエンド、HTMLやcssがとっつきやすいということで、そちらの学習からスタートする事になった。
勉強してるだけで給料が貰えるなんて最高だなあ、なんて思うこともあったり・・・。
　
ほぼ独学状態であったが、調査した上での不明点は先輩に質問をする。

ここで厄介なのが何もかもわからなすぎて質問する内容が不明確になったり、
ググったら未知の用語が羅列され、それをググったらまた未知の・・・・・

きっと誰もが通る道なのだろう、そういう時はあまり気にせず理解できるものから消化していく。
後々になって、なるほどと気づかされることは多いこともある。

教育制度は整っていない会社は数多存在するが、フランクな関係を築ける師匠的な存在が
いるといないで、新人の成長スピードに10倍くらい差が出るのではないだろうか。
なので尊敬できる師匠を見つけて欲しい。

また、未経験の人はまず何を学べばいいか、どの言語が良いかという疑問を持つが、
個人的にはあまり気にする必要はないと思う。

作りたいものが明確であれば、ベストパフォーマンスを発揮できる言語や環境を見出すことは可能かもしれないが、
そこまで目的がはっきりしている人は稀だろうし、実際に学習した言語の業務に就けないこともある。

IT分野に限らず、学習する癖をつける、これが何より大切なんだろうなぁ・・・頑張らなきゃ。

サクッと頭使ってソース書くなら、個人的には入門動画や練習問題も豊富な[paiza](https://paiza.jp/)がお勧めです。



## 業界の闇は深い

IT業界と聞くと最も気になるところですね、実はこんな僕もデスマを経験しています。
はっきり言って本当辛いです・・・。

デスマの根本原因の大半は、プロジェクトチームの力不足かと思います。
新人にはどうすることもできないので、それを経験するか否かは運に寄るものが大きいですが、
技術者としての経験を積めば回避策を講じられるかと。~~最悪逃げ・・・・・~~

##これから

一般的に、活きの良いエンジニアの年齢は35歳までとは言われているが、
それに囚われず挑戦していきたい。
qiita初投稿ですが、今後は技術的な内容もアウトプットできるよう精進します。

## まとめ
・年齢や学歴、経験はあまり気にせず挑戦できる業界
・人との関わりは多い為コミュ力は重要
・勉強する癖が大切
・師匠を見つける
・闇に触れたらその時考える

がんばろ。
空のスライスを json.Marshal すると、"[]" じゃなく "null" になる

golang で JSON 返す API つくった時にハマったのでメモ。

## 現象
スライス変数の作成方法によって内容が変わる

null になる

```go
type (
	Test struct {
		Tests []string `json:"tests"`
	}
)

func main() {
	var t Test
	var tests []string
	t.Tests = tests
	res, _ := json.Marshal(t)
	println(string(res))
}
// {"tests":null}
```

[] になる

```go
type (
	Test struct {
		Tests []string `json:"tests"`
	}
)

func main() {
	var t Test
	tests := make([]string, 0) // []string{} でも同じ
	t.Tests = tests
	res, _ := json.Marshal(t)
	println(string(res))
}
// {"tests":[]}
```

null で返すと Swift などで使う場合 optional で受け取らないといけないので注意しましょう（自戒）
いまさらfishを触ってみた

SENSY株式会社のnamcoです。
業務ではiOS APPの開発をしています。

Adventカレンダーということで、前から少し気になっていた[fish](https://fishshell.com/docs/current/index.html#introduction)を触ってみました。

[全訳！fishシェル普及計画](http://fish.rubikitch.com/tutorial/)
>fishはフル装備のコマンドラインシェル(bashやzsh同様)で、賢くユーザフレンドリーです。
fishは シンタックスハイライト 、 オートサジェスチョン 、知識ゼロ・設定ゼロでそのまま動作する TAB補完 をサポートしています。
もし、コマンドラインをもっと生産的に、便利に、楽しい(難解な文法や設定オプションを学ぶことなく)環境にしたいならば、fishはあなたの求めていたシェルかもしれません!

今まではzshを使っていました。zshの頑張って肥やしていく感じが好き(こういうとすごく肥やしてる感があるが、全然肥えていない)だったのですが、これを機会に、どちらを使っていくのがいいのか考えていければと思います。

今回の内容としては、下記のような流れで書ければと思います。
1. fishの構築。
2. zshでの設定項目を再現。

# fishの構築

## fishのインストール
```
$ brew install fish
$ fish -v
fish, version 2.7.0
```

## shellをfishに変更
```
$ chsh -s /usr/local/bin/fish    
```
下記のようなログが出た方は、/etc/shellsに /usr/local/bin/fishも追加すると良い。

```
chsh: /usr/local/bin/fish: non-standard shell
```
あとはターミナルを再起動する。

下記を実行することで、ブラウザでのconfig確認ができる。

```
$ fish_config
```

<img width="1054" alt="スクリーンショット 2017-12-10 14.39.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/57963/d04c670a-b2af-e2a0-7b9f-f29966bd786a.png">




## プラグインマネージャを入れる。

```
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
```

# zshでの設定項目を再現。
なお、前述のように以下のような項目は、デフォルトで設定されているので、割愛。
とりあえずタブ押せばいろいろ出ます。
- シンタックスハイライト
- オートサジェスチョン
- TAB補完

## プロンプトにgit情報を表示
これは、$fish_configで確認できるブラウザから変更できました。　

<img width="1174" alt="スクリーンショット 2017-12-10 14.53.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/57963/c153d12f-632e-c87e-1680-7148eed76ad1.png">

## historyのincrement search
追記します
https://github.com/fish-shell/fish-shell/issues/602

## alias
下記のようにすればaliasを設定できます。

```
$ alias branch_old='git branch --sort=authordate'
```
なお、alias は function のラッパーでしかないので、
他のfishセッションで永続化できません。
永続化させたいなら、funcsaveする必要があります。

```
$ funcsave branch_old
```

またzshでは使えるグローバルエイリアスを使う方法は、見つけられませんでした。
下記のように自作で作られている方がいらっしゃったので、参考にさせていただきました。
[zshからfishに乗り換えてみた](https://qiita.com/masa0x80/items/346b4b9c0ff08205995e)

##



# まとめ

まだ本当にさわりの部分だけなので、今後ドキュメントなどを読み進めて、理解を深めていきたいと思います。

下記参考にさせていただきました。ありがとうございます。

- [全訳！fishシェル普及計画](http://fish.rubikitch.com/tutorial/)
- [zshからfishに乗り換えてみた](https://qiita.com/masa0x80/items/346b4b9c0ff08205995e)

以上です。
Vueのインスタンス作成がESLintのno-newに抵触するのを避ける方法

ESLintの[Disallow new For Side Effects (no-new)](https://eslint.org/docs/rules/no-new)ルールが`"error"`に設定されている場合、次の書き方だとエラーになる。

```js
new Vue({
  el: '#app',
  ...
})
```

次のように[`$mount`](https://vuejs.org/v2/api/#vm-mount)を使ってマウントすれば、その問題を回避できる。

```js
const app = new Vue({
  ...
})

app.$mount('#app')
```
zshのプロンプトカスタマイズにおいてエスケープシークエンスに戸惑ったのでまとめておく

zshプロンプトのカスタマイズ中にハマったのでメモ

## やりたかったこと

![Screenshot from 2017-12-10 19-15-00.png](https://qiita-image-store.s3.amazonaws.com/0/140543/752fff47-275e-2de2-1798-99af345484c5.png)

コマンドに成功したら青いシャキーンが、失敗したら赤いショボーンが出てくるプロンプトです

確実に失敗するコマンドがパッと思いつかなかったのでnot foundになりそうなのを打ってます。

## 失敗例

```
SHOBON='(´･ω･`)'
SHAKIN='(`･ω･´)'

PROMPT='%(?.%F{cyan}$SHAKIN.%F{red}$SHOBON%)%f %B%F{green}%n@%M%f%b: (%F{blue}%D %*%f) [${vcs_info_msg_0_}]
%B%F{blue}%~%f%b $ '
```

こちらが失敗例のコード

スクショ撮り忘れましたが、コマンド成功時に
```
(`･ω･´))
```
このようにカッコが二重になります。

## 成功例

```
SHOBON=$'\(´･ω･\`%)'
SHAKIN=$'\(\`･ω･´%)'

PROMPT='%(?.%F{cyan}$SHAKIN.%F{red}$SHOBON) %f %B%F{green}%n@%M%f%b: (%F{blue}%D %*%f) [${vcs_info_msg_0_}]
%B%F{blue}%~%f%b $ '
```

こちらなら上記写真のようになります。

## 今回の学び

２つを比べてどう違うかといえば、成功例では閉じカッコが%でエスケープされている点です。

今回の失敗は、shellのエスケープシークエンスと、zshpromptのエスケープシークエンスを混同したことからおこったものでした。
cri-oの今

この記事は[Kubernetes Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kubernetes)の10日目の記事です。

この記事では、`cri-o`の今について書いていきたいと思います。

# cri-oとは
まず初めに`cri-o`の概要を。

`cri-o`は`Kubernetes`専用に開発が進められているコンテナランタイムです。

サービスとしてシステム上に常駐し、`kubelet`が`cri-o`を操作、`cri-o`がコンテナランタイムを操作するという橋渡し的な役割を果たします。
間に立っていい感じに動いてくれます。

その`cri-o`は2つの標準に準拠しています。
1つはコンテナランタイムとコンテナイメージの標準仕様を規定しているOCI（Open Container Initiative）

もう1つはKubernetesとコンテナランタイムの間でのAPI仕様であるCRI（Kubernetes Container Runtime Interface）です。

OCIに準拠していることにより、Dockerイメージ等のOCI準拠のイメージをそのまま利用でき、また、CRIに準拠していることにより`Kubernetes`から操作ができるようになっています。


# Kubernetesとcri-oのバージョンの対応関係
[Kubernets-incubator/cri-o](https://github.com/kubernetes-incubator/cri-o)にも記載がありますが、Kubernetesとcri-oのバージョンの関係は下記のようになります。

|Version - Branch         |Kubernetes branch/version    |Maintenance status                                |
|:------------------------|:----------------------------|:-------------------------------------------------|
|CRI-O 1.0.x - release-1.0|Kubernetes 1.7 branch, v1.7.x|Maintenance is manual, only bugs will be patched  |
|CRI-O 1.8.x - release-1.8|Kubernetes 1.8 branch, v1.8.x|Maintenance is manual, only bugs will be patched  |
|CRI-O HEAD - master      |Kubernetes master branch     |Changes in main Kubernetes repo about CRI are actively implemented in CRI-O |

`cri-o`のv1.0がリリースされた時のみ`Kubernetes`とのバージョンが異なっていますが、それ以外は基本的に`Kubernetes`のバージョンと同じバージョンが作成されるようになっています。

各バージョンのメンテナンスに関しては、過去のバージョンに関してはバグの修正があればパッチが当てられ、最新のバージョン（master）は`Kubernetes`のCRIに変更があれば随時対応されます。

# Current Roadmap
`cri-o`のCurrent Roadmapは下記のようになっています。

1. 基本的なPod/Containerのライフサイクル、基本的なイメージのpull（完了）
2. ttyハンドリングと状態管理のサポート（完了）
3. kubeletとの基本的な統合（完了）
4. ログ管理、CNIによるネットワーク統合、プラガブルなイメージ/ストレージ管理のサポート（完了）
5. exec/attachのサポート（完了）
6. 完全に自動化された`kubernetes`のe2eテストを失敗なしで実行する
7. `Kubernetes`のリリースを追跡する

1～5は既に対応が完了しており、現在は6の`Kubernetes`のe2eテストをすべて通す対応を行っているようです。issueを見るとe2eテストの結果は149/151と、あと2件テストが通っていない状況のようなので、もう少ししたら6の対応も終わるのかなと思います。

# Tutorialに関して
`cri-o`のプロジェクトにも他の多くのプロジェクトと同様に[Tutorial](https://github.com/kubernetes-incubator/cri-o/blob/master/tutorial.md)が用意されており、`cri-o`を試す方法が提供されています。

ただ、現在（2017/12/10）Tutorialに記載されている通りに動かしても上手くいきません。
私が試した環境に問題があるのかもしれませんが、少なくとも私は

1. GCPにUbuntu16.10のイメージが見つからない
2. コマンドに`sudo`が必要なものがある
3. イメージのpullに失敗する

といった現象を確認し、3が失敗することにより先に進めることができなくなってしまいました。
回避方法はあるのかもしれませんが、現状Tutorialを利用して手軽に動作確認はできないかと思います。

`minikube`で作成した環境には`cri-o`がインストールされているので、もしかしたら手軽に`cri-o`を試すことができるかもしれません。（試したわけではないですが...）

何かわかれば、また記事に書きたいと思います。

# まとめ
簡単ではありますが、`cri-o`の今の状況を書きました。
コンテナランタイムとして基本的な機能は実装されており、現在は`Kubernetes`とより上手く連携させることに力を入れているのかと感じました。

そのあたりの対応が終わった後に`cri-o`がどうなっていくのか、引き続きWatchしていきたいと思います。

# 参考
[cri-o.io](http://cri-o.io/)
[kubernetes-incubator/cri-o](https://github.com/kubernetes-incubator/cri-o)
(2017年12月) PythonとOpenCVをこれからやってみる - 7 - 信頼度

#はじめに
PythonもOpenCVもこれまでまったく触れてこなかったけど、ちょっとやってみたいと思ってはじめたので、色々と試しているという状況です。
前回『[(2017年12月) PythonとOpenCVをこれからやってみる - 6 - コンフィグ(1) - Qiita](https://qiita.com/rrryutaro/items/cb2a8682f1150e33ea81)』はコンフィグ設定を行い、認識率を上げるようにしてみました。

今回は、信頼度について表示してみることにします。

#コマンド実行で出力させる場合
次のように、最後に `tsv` とつける事で、出力指定したファイルに詳しい情報が出力されるようです。

```:コマンドライン
>tesseract hoge.png out -l jp2.qiita tsv
```
<details><summary>結果イメージ</summary>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156225/058cadc6-78f8-8bcd-4a5a-91bdc61b4793.png)
</details>

#pyocrで出来るのか
次のようなやりとりがありました。どうやらつい最近(2017/12/01)実装された模様です。
https://github.com/openpaperwork/pyocr/issues/58
https://github.com/openpaperwork/pyocr/issues/74

前回の繰返し部分に次を追加して試してみます。

```py3:ocr7.py
	try:
		orientation = tool.detect_orientation(Image.fromarray(img2), lang=box["Language"])
		print(orientation)
	except pyocr.PyocrException as exc:
		print("")
```

```:実行結果
>ocr7.py ocr.png ocr.json
(20年7年年2月) PythonとOpenCVをこれから
やつてみる - 2t - はじめの一歩
{'angle': 0, 'confidence': 8.6}
Python

openCy

は じめに

Pyth。n(nイソン)を中々使う機会が無(、 openCVPt-プンシ-プイ)も気にはなりっっ使う
機会が無く月
そんな折、 ちょっとやってみょうと思ったので、 今からやるにあたっての導入やはじめ
のブ歩なとこ7
境境はwind。ws7 64bitでやります。
{'angle': 0, 'confidence': 21.46}
```

う～ん。よくわかりません。途中のいくつかはエラーとなってしまいますし・・・

今後調査を進めて行きます。

#参考にした記事など
- [opencvで文字認識その１　Tesseractラッパ - whoopsidaisies's diary](http://whoopsidaisies.hatenablog.com/entry/2014/11/12/003100)

#これまでの記事
|前回|一覧|次回|
|:--|:--:|--:|
|[6 - コンフィグ(1)](https://qiita.com/rrryutaro/items/cb2a8682f1150e33ea81)|[一覧](https://qiita.com/rrryutaro/items/933ec2ed754a9f3a2d3e)||
【TouchDesigner】プロジェクターで投影しながらpcで値をいじれるようにすんで

#はじめに
ども。TouchDesigner初心者や。初めてたぶんまだ１週間くらいやで。

<作品>
https://youtu.be/0jT6bjQaDWQ
↑みてな！！！

今日はTouchDesignerを使ってVJしたかったんやけどプロジェクターへの投影方法がわからんし、しかもいざ投影したら全画面表示にされて値いじられへんし大変やったわ。

だからこの記事ではまずTouchDesignerでつくったやつを投影する方法、そんでから投影しながらいろいろいじれるようにすんで！

あ、あとわいは関西人やから関西弁でてまうけど堪忍な。

#準備すんで！
ほな早速投影していこか。
まずはComp欄にあるWindowってやつを追加するんや。

ほんでからWindowのWindow欄にあるoperatorってやつで出力したいやつの名前を打ち込むんや。

<img width="1118" alt="スクリーンショット 2017-12-10 18.25.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/173252/a153faa8-6492-eceb-c810-a0379ab4038b.png">

こんな感じやな！(ほんまはいっぱい画像使いたいんやけどQiitaさんが許してくれへんねん。すまんな)
ちなみにみるのはOperatorのとこだけでええで！他はもうすでに変えてもうてんねん...!

##いろいろいじるで！
Locationってやつをsingle monitorにして、

Opening sizeってやつはFull Location。

BordersをOFF。
<-OSのメニューバーの表示と非表示

Cursor VisibleをNeverにすんで
<-カーソルの表示と非表示

##投影や！
Open as perform windowっていうのおしてみい！
投影されたやろ👏！?
ちなみにescキーで閉じれるから焦らんでええで！

まあできて多分嬉しいんやと思うけどな。
みてみ？

なんもいじられへんやん？
こんなんVJする時ただ突っ立ってるだけになるやないか😡！！

ワイはプロジェクターで映像を投影しつつ、pcで値とかいろいろいじりたいんや！！！！

##いじれるようにしていくで！！！！
まあいうて簡単や。

<img width="333" alt="スクリーンショット 2017-12-10 18.36.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/173252/dded734e-b02c-758c-38de-460cc49d49d2.png">

ここのMonitorってやつを画像みたいに"1"にしてみ。
ほんで、Open as perform windowっていうのおしてみ?

できたな！？！？！？？！？！
よかったなああ泣！！もらい泣きしてもうたわ！！

これでもうなにもワイから教えることはなにもない！！！！

##あったわ
Monitorってやつを"1"にしたまんま、普通にpcで全画面でみようとするとみれないねん。
そういうときは、Monitorを"0"にすんねん。
ほんならいけるようになるで。


##最後に
いやあはやかったな。
もう完全にVJを一人ワイはだしてもうたんか？
びっくりやでほんま。

何回も言うけどワイはTouchDesigner初心者なんや。
だからTDとかイキって言われへんねん。でも今週だけで結構好きになったわ。

お仕事とかはまだできへんけど交流会とか勉強会あったら読んでくれたら泣いて行くで。
よろしゅうな。

ほな
AWS Cloud9とGCP App Engineを使った使用感をまとめてみた

# まえおき
- Goアドカレに投稿する予定でしたが、遅れてしまいましたすみません・・・
- 技術ネタじゃないです:bow:
- 異なる端末、NW環境でも、同じ開発環境を使いたかったので、いい方法を探ってみました
- テストコードはGo言語のGinフレームワークのものを使用させていただきました

## AWS(Amazon Web Service)の場合

### Cloud9
AWS Cloud9が出来ていたので、そちらを使ってみました！
Cloud9自体は１日くらいしか使ったことは無いので詳しくないですが、
機能的には殆ど変わらない気がします！

#### 1. プロジェクト名や開発環境の設定を行う
Cloud9のページから各設定を行います。
「Environment type」は初回は「EC2」でいいと思いますが、説明通り
EC2インスタンスがプロジェクトごとに建てられる（ハズな）ので
毎回選択することは避けて、専用インスタンスを立てて「SSH」を選択するほうが良いと思います。

#### 2. プロジェクトを作成する
ここから先はIDE上での操作です。

1が終わるとCloud9のIDEが開かれていると思います。
（Cloud9 > Your environments > 対象プロジェクトの[Open IDE]でもOK）

##### 2-1. 新規ファイルを作成

File > New Fileで**main.go**という名前のファイルを作成します。

```go:main.go
package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}
```

##### 2-3. 新規ファイルを保存

File > Save で保存します。
※ Ctrl+n, Ctrl+sといったショートカットも使えます

##### 2-4. 必要なパッケージの取得

IDEの下部にbashがあるので、go getを実行します

```bash:bash
$ go get github.com/gin-gonic/gin
```

#### 3 動作確認

##### 3-1. プログラムの実行

右上のツールバーにRunボタンがあるのでクリックするとプログラムが実行されます。

##### 3-2. Webアプリケーションのプレビュー

右上のツールバーの[Preview > Preview Running Application]をクリックすると
プレビュー画面が表示されます。別タブで表示させることも可能です。

## GCP(Google Cloud Platform)の場合
### クイックスタートを始める

#### 1. コンソール画面から**App Engine**を開く

[コンソール画面](https://console.cloud.google.com/home/dashboard?project=shining-landing-188502&hl=ja)の左ツールバーから**App Engine > ダッシュボード**をクリック

#### 2. GAE(Google App Engine)からgoのサンプルを動かしてみる

GAEのダッシュボード上に「初めてのアプリへようこそ」というカードが表示されていると思います。
カード上の「言語を選択」からgoを選び、クイックスタートを触ってみましょう。

### GAE上でgoプロジェクトを新規作成する

#### 1. GAEのダッシュボードからCloud Shellを開く

#### 2. プロジェクトを作成する

```shell:cloud-shell
$ cd ~/src
$ mkdir testProject; cd $_
```

```shell:cloud-shell
$ go get github.com/gin-gonic/gin
$ vim main.go
```

```go:main.go
package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}
```

```shell:cloud-shell
$ go run main.go
```

「ポート上でプレビュー」でブラウザからアクセスすると、生成したコードの動作が確認できます。
※ ただし、このままだとデプロイ出来ないので、他に必要な操作があるみたいです。(app.yaml置くだけではダメでした・・・)追記するか、別記事で書きます:bow:

# 今のところのメリット・デメリット

## AWS Cloud9
### 対応言語
C++/C#/CoffeeScript/CSS/Dart/Go/Haskell/HTML/Java/JavaScript
Node.js/PHP/Python/Ruby/Shell Script

### メリット
- 即時公開もできる（おそらく）
- プロジェクト作成が簡単
- IDE付き
- 対応言語が多い

### デメリット
- 東京リージョンは無い
- 管理に気をつけたほうが良い
簡単にEC2が立ち上がってしまうので、
管理はきっちりしないと（請求が）怖いなというところです。

## GCP App Engine
### 対応言語
Go/PHP/Java/Python/Node.js/.NET/Ruby

### メリット
- .NETが対応している
- クイックスタート付き
- Cloud9+EC2よりは課金額は下がる
(確か、自動で実行を停止させる機能があったハズ)

### デメリット
- あくまで開発用。本番公開は出来ない（おそらく）
- デプロイするにはコマンド覚える必要がある
- 本番環境への適応にはDockerの知識が必要（？）

# まとめ
個人的には、必要な知識は少ないので**AWS Cloud9**を推したいです。
（AWS歴が長いからかもしれませんが・・・。）
ですが、GCPの親切さはAWSを上回ってると思いました。
正規表現ってなんぞや


##正規表現とは
文字列のパターンを表現する表記法。
文字列の検索・置換を行う時に利用される。

##正規表現の書き方
正規表現は **文字列**と **メタ文字**で書く。

![seikihyogen.png](https://qiita-image-store.s3.amazonaws.com/0/146670/e92a64a3-aa34-99f0-1746-6f0553c887a1.png "seikihyogen.png")


- 文字列
 - マッチする文字列そのものを直接指定
_ メタ文字
 -　特別な意味を持った記号で、文字列を表現するために利用する

##[]を使って文字表現
|正規表現|パターンマッチする文字|
|:-:|:-:|
|[abc]|[]内の一文字|
|[a-z]|アルファベットの一文字|
|[a-z0-9]|アルファベット、数字のいずれか一文字|
|[^abc]|[]内に含まれない一文字|

##その他の文字表現
|正規表現|パターンマッチする文字|
|:-:|:-:|
|.|任意の一文字|
|\n|改行|
|\t|タブ|
|\d|数値。([0-9]と同じ。)|
|\w|英数字。([A-Za-z0-9]と同じ。)|
|\s|スペース、タブ|

##行末・行頭の表現
###特別な意味も持った文字
|正規表現|パターンマッチする文字|
|:-:|:-:|
|^|行頭|
|$|行末|

##{}を使った繰り返し表現
###{数字}で、直前の文字表現にマッチする文字の繰り返し回数を指定できる
|正規表現|パターンマッチする文字|
|:-:|:-:|
|5|(直前の文字表現にマッチする文字)5回|
|5,|5回以上|
|5,10|5−10回|

##その他の繰り返し表現
|正規表現|パターンマッチする文字|
|:-:|:-:|
|?|0又は1回の繰り返し|
|*|0回以上の繰り返し|
|+|1回以上の繰り返し|

##最長マッチ・最短マッチ
|正規表現|パターンマッチする文字|
|:-:|:-:|
|*?|0回以上の繰り返し。但し"?"直後で指定された表現を含まない。|
|+?|1回以上の繰り返し。但し"?"直後で指定された表現を含まない。|
Jira ServiceDeskとOTRSの違いを考えてみた

皆さん、こんにちは
今回、はじめてQiitaに投稿しました。
私は仕事上は、Jira ServiceDesk（JSD)含めたアトラシアン製品及びAlfresco、Tableauの営業＆マーケティングを行っていますが、プライベートでオープンソース業界に関わっており、縁あってOTRSというオープンソースのヘルプデスクツール、ITサービスマネージメント（ITSM)ツールのユーザー会の運営も手伝っています。
ですが、ここ2年以上も手伝いができておらず本当にすみません。とても反省しております。
今回は、どちらの立場に偏ることなく公平な目線でJira ServiceDesk（JSD)とOTRSを比較してみるという無謀なブログを書いてみたいと思います。
まず
　・開発元
　・調査会社の総合評価
　・プロダクトの価格
を簡単に比較してみます。


#市場評価の比較
-----
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54906/88c77016-7540-c0a4-2148-008dd64d789f.png)

Jira ServiceDesk
※https://www.gartner.com/reviews/market/itssm-tools/vendor/atlassian?pid=632
※https://www.capterra.com/p/138769/JIRA-Service-Desk/

OTRS
※https://www.gartner.com/reviews/market/itssm-tools/vendor/otrs/?pid=370
※https://www.capterra.com/p/127284/OTRS/

-----
#機能の違い
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54906/66a2dac9-7f18-607c-b58e-b10d596f6608.png)
-----
>個人的は意見として、

### <b> JIRA ServiceDeskについて</b>
- <b>DevOps対応、わかりやすい画面インターフェースが特徴</b><br />
Jira ServiceDeskは、世界中に開発ツールとして利用されるJiraがベースなのでDevOpsへの対応は完璧です。さらに「インシデント管理」としての入り口となるカスタマーインターフェースが優れており、問合せフォームに内容を入力すると自動的にFAQを参照して、答えもしくはヒントとなる情報を表示する機能は他のITSMツールには無い機能です。
この「インシデント管理」機能分野ではOTRSよりもJira ServiceDeskが優れていると感じます。
- <b>運用しやすい</b><br />
それにパートナー数も多く、ドキュメントも豊富なことから運用しやすい。サポートできる企業も多いことから困った時にはお願いできる企業が多いというのがメリットです。
- <b>アドオンによる拡張性</b><br />
アドオンも豊富なことから、拡張性にも優れています。

### <b>OTRSについて</b>
- <b>オープンソースによるメリットが特徴</b><br />
OTRSは、OTRS AG社の開発体制に加え、オープンソースコミュニティによる開発が盛んに行われていることから、機能拡張やカスタマイズが柔軟にできるオープン性が最大のメリットです。<br />
OTRSをベースに独自業務システムとして開発も可能なので、厳しい個別カスタマイズ要件にも対応することができます。<br />
- <b> ITIL®︎の要求事項を幅広く対応</b><br />
もともとがITIL®︎を意識したツールなので「インシデント管理」「変更管理」「構成管理」「資産管理」など幅広いITIL®︎の要求事項に対応することができます。

結論として、
どのツール導入もそうですが、強みと弱みがありますので目的を明確にし、機能だけでなく導入後の運用を考慮した最適なツール選択が必要だと思います。
Chart.jsを用いたバブルチャートの表示

Chart.jsを用いてバブルチャートを表示する際の、サンプルソースです。

```test_chart_bubble.html
<html>
<head>
<title>Chart.jsバブルチャートテスト</title>
<meta name="description" content="Chart.js">
<meta name="keywords" content="Chart.js">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<script type="text/javascript" src="js/jquery-2.2.3.min.js"></script>
<script type="text/javascript" src="js_bubble/Chart.min.js"></script>
<script type="text/javascript" src="js_bubble/Chart.bundle.min.js"></script>
<script type="text/javascript" src="js_bubble/chart_bubble_test.js"></script>

</head>

<body bgcolor="lightcyan" >
<!--バブルチャートの箇所 -->
<canvas id="bubblechart" height="450" width="600"></canvas>

</body>
</html>
```

```chart_bubble_test.js
$(function(){
	// バブルチャートのデータ
	var bubleChartData = {
		datasets: [
		    {
			   // データ(1個目)
			   data: [{"x":10 ,"y":10, "r":30} ,],
			   // 色（1個目）
			   backgroundColor:[ "rgb(141,63,223)" ],
			   // ラベル
		       label: ["test1"] 
		    },
		    {
				// データ(2個目)
				data: [{"x":20 ,"y":20, "r":50} ,],
				// 色（2個目）
			    backgroundColor:[ "rgb(141,29,73)"],
				// ラベル（2個目）
			    label: ["test2"]  
			},
			{
				// データ(3個目)
				data: [{"x":30 ,"y":30, "r":70} ,],
				// 色（3個目）
			    backgroundColor:["rgb(16,230,73)"],
				// ラベル（3個目）
			    label: ["test3"]  
			}
		]};

	// オプション
	var options = {
		  // タイトル
          title: {
            display: true,
            text: 'バブルチャートテスト'
          },
          // スケール
          scales: {
        	  // x軸
              xAxes: [{
                  ticks: {max: 50, min: 0,stepSize: 10}
              }],
         	  // x軸
              yAxes: [{
                  ticks: {max: 50,min: 0,stepSize: 10}
              }]
          },
          // tooltip
          tooltips: {
              callbacks: {
                 label: function(t, d) {
                	var rLabel = d.datasets[t.datasetIndex].data[t.index].r;
                    return d.datasets[t.datasetIndex].label + 
                           ': (x軸:' + t.xLabel + ', y軸:' + t.yLabel + ', 円の大きさ:' + rLabel + ')';
                 }
              }
           }
	};
	
    // コンテキストのオブジェクト
	var ctx = $("#bubblechart")[0].getContext("2d");
	// バブルチャートの描画
	var bubbleChart = new Chart(ctx, 
	        {
			   type: 'bubble',
		       data: bubleChartData,
		       options: options
		    });
  
});
```
上記ソースだとこんな風に表示されます。
<img width="470" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/32098/92b3247f-3b99-84ab-bbab-f6b7479dd3d2.png">

### 参考サイト
　・[chart.js入門](https://qiita.com/kazu56/items/17acf7ad2d87d6b28173)
　・[バブルチャート · Chart.js 日本語ドキュメント](https://misc.0o0o.org/chartjs-doc-ja/charts/bubble.html)
Rails Girlsのコーチを初めてやってみての感想

# 概要

Rails　Girlsのコーチを初めてやってみて感じたことを、Girls向け・コーチ向けに書いてみたいと思います。

# 自己紹介

- Railsアプリ開発歴約5年
- コーチとしての参加は7thが初
- 8thにもコーチとして参加

# Girls向け

## 重要なのはモチベーションと機材

参加されているGirlsを観察していて思ったのは、やはり重要なのは現時点のスキルではなくモチベーションだということでした。
ただ、せっかくモチベーションがあっても機材が使いづらかったりすると限られた時間で成果を得るのが難しくなってしまうので、可能なら新しいPC（できればMacBook）を持ってきていただけるといいのかなと思います。
その点、Cloud9が非常に使いやすいことが発見できたのは個人的な収獲でした（後述）。

## フォローアップの重要性

Girlsの方のフォローアップのためにMoreというイベントが開催されているのですが、そこに継続的に参加される方はまだ少ないのが現状です。
プログラミングに限ったことではないのですが、一度きりのイベントだと色々なことを忘れてしまうので、是非Moreの方にも来てもらいたいなと思います。

# コーチ向け

## コーチ同士の会話から得るものがある

Rails Girlsのコーチになることのメリットの一つは他のコーチの方々とのコミュニケーションだと思います。
界隈で有名な方や十年近いRailsのキャリアを持っているような方もコーチとしていらっしゃるので、特に中堅の開発者の方々はそういった方々との会話から得るものが大きいのではないでしょうか（もちろん、打ち上げでお酒を飲むだけでも楽しいのですが）。
特にGirls向けの課題に対する意見やコメントも人によって随分違うなというのは実際にコーチをやってみるまでわかりませんでした。その違いから発見することも多かったです。

## 教えるということ

何かを理解することとそれを教えることはやはり別の事柄で、教えることで理解が深まるということがままあります。
Railsアプリ開発者としてのキャリアが短いような方でも、コーチとして参加することでRailsに関する洞察がさらに深まることと思います。

## 新しい発見

私は8thではWindowsとMacが混じったチームのコーチだったのですが、そこでCloud9を開発環境として使ったところ、思いの外使いやすくて驚いたということがあります。
Rails Girlsのようなイベントでないと使う機会がなかったと思うので、この機会に触れてよかったです。

## 雑談が楽しい

全く異業種の方や、テクノロジー企業の人事やバックオフィスの方とお話できるのは個人的にとても楽しかったです。ある種の異業種交流会ではあるのですが、みんな共通の目的（Railsアプリの作成）があるのでコミュニケーションしやすいというのも良い点かなと思います。

# 最後に

コーチ楽しいですよ！
アラフィフでも情報系を勉強する女子大生 

いきなり参加者の平均年齢を上げてしまいました．:-)
# 二回目の女子大生生活
一回目の女子大生生活は，三十年以上前に，理系に進学すればプログラマになれそうという理由で，理学部化学科の学生として過ごしていました．卒業後は希望通り，プログラマとして約三十年働いています．結婚後は核家族ですが，産休・育休を取りながら子どもを三人育てました．現在，上二人は大学生，末っ子は高校生です．

二回目の女子大生生活は，三年前に放送大学に入学して始まりました．
入学当時に勉強したいことはいくつかありました．
・統計学や数学が近年注目されているので勉強したかったけど，一回目の大学時代にはどちらもろくにやっていなかった．
・コンピュータサイエンスの基本を復習したかった．一回目の大学時代，数学科の当該講義はひととおり受けましたが，また復習したくなった．
・UXに関心があったので，その基礎となる心理学やデザインについて勉強したかった．

放送大学で勉強できる範囲では，だいたいこの目標はクリアできました．
今興味があるのは，大学を巡るさまざまな問題で，学問の分野としては教育学になります．
この問題に取り組むために自然言語処理を使うことを考えているので，引き続き情報系の勉強を続ける予定です．最近ではwebスクレイピングやMeCab, gensimを使い始めました．
# 社会人になってからの勉強
この仕事をしていると，使う技術は良く変わるし，目先の仕事も良く変わるので，仕事で覚えてもあっという間に役に立たなくなるのはよくあることです．とはいえ先回りして勉強しても，役に立つとは限りません．確実に役に立つのは英語くらいでしょうか．首都圏にいれば，勉強会やハッカソンの機会も多くありますが，子どもがいれば休みの日に家事を放り出すのも難しいですし，そもそも地方在住だとあまり機会もありません．

ただ最近では，インターネットを活用した通信制大学・通信制大学院や，Udemyのようにwebで勉強できる講座も増えてきました．一人だとモチベーションも続きにくいですが，twitterやブログを書いて仲間を探すこともできます．勉強したことをアウトプットしておくと，興味を持ったことや調べたことを整理できます．また体系的に学んだり，勉強する方法を学ぶには，大学や大学院入学は良い選択です．

情報系を勉強するのもいいですが，経営やマネジメントを勉強するのもいいですね．最近では社会人のリカレント教育も話題になっているので，今後公的補助の対象も増えてくることが予想されます．

あと親が勉強していれば子供も勉強しそうとよく言われますが，これは期待できません(苦笑い)．
# 最後に女性IT技術者として働き続けることについて
わたしが高校生だった頃は，雇用機会均等法もまだなく結婚退職が当たり前で，出産後も働き続けられるのは学校教員と薬剤師くらいしかなかった時代です．ただどちらにも興味がなく，電器屋にパソコンを触りに日々通う女子高生だったわたしは，IT技術者への道を進みました．周囲の女性技術者は，出産を機に品質部門に異動したり，退職したりしました．出産退職しなくても，いわゆる小１の壁で退職した人もいます．ずっと現場にいるような女性は少数派です．

ただ気が付くと，子どもの保育園や習い事の迎えに行く男性社員もじわじわ増えてきています．保育園についても，その不足がようやく社会問題化しました．このカレンダを書いている他の皆様が結婚や出産をする頃には，今よりも少しはやりやすくなっているのではないでしょうか．皆様の末永い活躍を期待しています．わたしももう2,30年がんばるつもりです。
SVMで世界経済を回帰分析

# はじめに
SVMを使って、経過年度から、世界合計のGDPを年度から予想します。
今回の予想は2つのことを仮定をしています。

* 世界経済は成長し続けるものとする。

* 今後予想できないような、急激な経済成長は考えないものとする

# データをゲットする
IMFが世界経済の推移をcsvで配布していますのでそれをダウンロードします。
[データ](http://www.imf.org/external/ns/cs.aspx?id=28)

1. 最新年度を選んで、By Country Groups (aggregated data) and commodity pricesをクリック。

2. worldのみチェックを入れる

3. 「Gross domestic product, current prices U.S. dollars」にチェックを入れる

4. 下のほうの所からエクセルファイルをダウンロード。

5. データを加工する。(そこそこ、大変でした)

出来れば、加工後を載せたいのですが、再配布していいのかちょっと微妙なのでIMFのサイトからダウンロードしてください。

## 注意
上記のファイルのGDPの単位は10億米ドルです。
よって、上記のファイルをそのまま使うとGDPの単位が10億米ドルとなります。

# ソースコードを書く

```python3:main.py
import sys
from sklearn.svm import LinearSVC
from sklearn import svm
import numpy as np
import copy
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
from sklearn.kernel_ridge import KernelRidge
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.linear_model import Ridge


args = sys.argv

def regression_main():
     # model = svm.SVR(kernel='rbf', C=1e3, gamma=0.1)
      data=[]
      with open(args[1],"r",encoding="utf-8") as f:
           data=[e.replace("\n", "") for e in f.readlines()]
           data=[[float(e) for e in e.split(",")] for e in copy.deepcopy(data) ]
      
      in_data=[e[:-1] for e in data]
      label_data=[e[-1] for e in data]
      
      print(in_data,label_data)
      
      tuned_parameters = [
        {'kernel': ['rbf'], 'gamma': [10**i for i in range(-4,5)], 'C': [10**i for i in range(-3, 8)]}#,
     #   {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}
      ]

      model = GridSearchCV(svm.SVR(), tuned_parameters, cv=5, scoring="mean_squared_error")

      model.fit(in_data,label_data)

      
      plt.scatter([e[0] for e in in_data], [e for e in label_data])
      plt.plot([e[0] for e in in_data], model.predict(in_data))
      plt.show()
      
      while True:
          user_input=input("end?>")
          if user_input=="end":break
          user_in_data=[]
          for i in range(len(in_data[0])):
               t=float(input(">"))
               user_in_data.append(t)
          
          print(model.predict([user_in_data])[0])
      


def main():
     print("1:label\n2:回帰")
     n=int(input(">"))     
     if n==1:
         #label_main()
     if n==2:
         regression_main()

main()

```

パラメーターはGridSearchCVで自動的に最適化しています。

実行する時は

```shell
python main.py 学習ファイル
```

です

# 実行


![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/206651/f5f12c91-da8a-c80a-7be5-d2bf7f9a6ec6.png)

青い丸が実際の世界のGDPで青い線がSVMの予想値です。
ほぼ、一次関数ですね。
わざわざ、SVMを使った意味がない気もします。
とにかく、このモデルを使って、予想してみたいと思います。

# 予想

では早速、2022と入力して2022年を予想してみたいと思います。

出力は929482.95366億米国ドルでした。
IMFの予想は1032009.94億米国ドルでしたので、一応予想が出来ました。

# まとめ

今回のデータは一次関数が当てはまったので余りSVMの恩恵が得られませんでした。
Solidity 言語仕様　コントラクト篇

Solidityのコントラクト周りまとめてみます。

## コントラクトの基本
- `pragma solidity ^0.4.0;`のようにバージョンを定義する
- コントラクトは、オブジェクト指向のプログラミング言語のクラスと似ている
- コントラクトは、多重継承できる
- コントラクト名と同名の関数は、初期化関数であり、コントラクトがデプロイされた時実行される
- ステート変数(State Variables)
    - オブジェクト指向のプログラミング言語のインスタンス変数と似ている
    - ステート変数は、ブロックチェーンに書き込まれ、保持される
- 関数以外は、`イベント(event)`も定義できる
    - イベントは、イーサリアム上のログの基礎であり、イベントを発生させると、関連情報をログに記録され、後で参照・検索できる
    - **イベントとログは、コントラクトからアクセスできない、コントラクトのオーナーでもアクセスできない！！！**

## 関数修飾子(Function Modifiers)
- 関数修飾子とは、関数に付けられ、関数の動作を変更できる仕組み
    - たとえば、オーナーしか実行できない関数なら、`onlyOnwer`修飾子を使う。下記サンプルの場合は、オーナーだけ変更関数`set`を呼び出せる、オーナー以外の場合は、異常になる

```javascript
pragma solidity ^0.4.0;

contract SingleNumRegister {
    uint storedData;
    address owner;

    function SingleNumRegister() {
        // デプロイするアカウントのアドレスをオーナーとして保持する
        owner = msg.sender;
    }

    modifier onlyOwner {
        // 呼び出す元のアドレスがオーナー以外の場合、revert()処理走って状態変更を巻き戻して実行を止める
        require(msg.sender == owner)

        // _ は、関数修飾子が付けられている関数本体を実行する意味
        _;
    }

    function set(uint x) onlyOwner {
        storedData = x;
    }

    function get() constant returns (uint retVal) {
        return storedData;
    }
}
```

- 修飾子にもパラメータを持てる

```javascript
contract Register{
    modifier costs(uint price) {
        if (msg.value >= price) {
            _;
        }
    }

    function register() costs(price) {
        // 実際の処理
    }
}
```

## 定数（Constant State Variables）
- ステート変数と関数に対して、`constant`の定義を付けられている
- ステート変数の場合
    - そのステート変数はストレージを使わずに、コンパイル終わった時点で、固定値になる
    - 変数のデータ型は、基本型と文字列しかできない
- 関数の場合
    - `この関数はブロックチェーンのデータを変更しない`ことを表明するだけ
    - 言語仕様上は特に制限・チェックしていない

```javascript
pragma solidity ^0.4.0;

contract C {
    uint constant x = 32**22 + 8;
    string constant text = "abc";

    function f(uint a, uint b) constant returns (uint) {
        return a * (b + 42);
    }
}
```

## 後退関数(fallback function)
- コントラクトに、１つだけ定義できる、名前なし、パラメータなし、戻り値なしの関数
- 呼び出されるタイミングは下記２つ
    - コントラクトが呼び出された時、どの関数にもマッチできなかった場合
    - コントラクト宛にイーサ（Ether）が送金された場合
- 注意点
    - コントラクトがイーサを受け取る必要があるなら、必ず定義する
    - 定義してない場合、送金されると異常になり、イーサが送金者に返される

## 特別のオペレーター delete
- 基本型に対して、変数に初期値を設定する
- 整数値の場合 `0` にする
- 固定サイズ配列の場合、各要素に初期値を設定する
- 可変サイズ配列の場合、配列のサイズを `0` にする
- ストラクトの場合、各要素に初期値を設定する

## 参考
- [Contracts — Solidity 0.4.20 documentation](http://solidity.readthedocs.io/en/latest/contracts.html#function-modifiers)
- [智能合约源文件的基本要素概览（Structure of a Contract） - 区块链技术-智能合约Solidity编程语言](http://www.tryblockchain.org/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6%E6%BA%90%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%BB%E8%A6%81%E8%A6%81%E7%B4%A0.html)
- [solidity勉強 — 続・無能日記](http://blog.potix.jp/2017/08/04/solidity.html)
Intel x86 Emulator Accelerator (HAXM installer)のインストールに失敗する

古いバージョンのIntel Hardware Accelerated Exection Managerがインストールされていると、Android Studio 3.0付属のSDK ManagerからインストールできるIntel x86 Emulator Accelerator (v6.2.1)のインストールが失敗するようです。

私の場合は、おそらく過去に、古いAndroid開発環境のSDK ManagerなどからHAXMをインストールしていたのだと思います。

ダウンロードとインストールの途中まではうまくいっていたようなのですが、

```
"Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 6.2.1)" complete.
Failed to update status to COMPLETE
```

と表示されていて、最終的にはインストール失敗になっていました。

###### 対処
Windowsのコントロールパネルからプログラムのアンインストールを開き、
「Intel® Hardware Accelerated Execution Manager」を探し、もしバージョンが6.2.1でなかったり、かなり古い日付であった場合にはアンインストールします。

これで再び、Intel x86 Emulator Accelerator (HAXM installer)のインストールを行ってみたところ、上記のエラーメッセージが出なくなり、インストールが成功ステータスで終わりました。
Windows Python環境うろ覚え with Anaconda

windowsにおけるpython環境うろ覚え．
docker上の環境だとどうしても遅いので，localにインストールしたAnacondaでプロジェクトごとに環境を切り替えながら利用．

# activate/deactivate (PowerShell)
- [Liquidmantis/PSCondaEnvs](https://github.com/Liquidmantis/PSCondaEnvs)
のactivate.ps1, deativate.ps1をactivate.bat, deactivate.batが存在するディレクトリに配置．
- 競合怖いので名前かえとく．iactivate.ps1, ideactivate.ps1 .
- 自分の環境では以下のディレクトリ．  
  ```
  C:\Users\foo\Anaconda3\Scripts
  ```

# 仮想環境構築
- 以下のコマンドでパッケージ全部入り．パッケージが不要なら末尾のanacondaを外す．  
  ```
  conda create -n python36 python=3.6 anaconda
  ```
- -n の後ろが環境名．  

```
PS C:\Users\foo> iactivate python36
Activating environment "python36..."  
[python36] PS C:\Users\foo> ideactivate  
Deactivating environment "python36..."  
PS C:\Users\foo>  
```
【随時更新】Python・OpenCV・Tesseractで参考にした記事などの一覧

#自分が投稿したもの
- [(2017年12月) PythonとOpenCVをこれからやってみる - 1 - はじめの一歩 - Qiita](https://qiita.com/rrryutaro/items/4c40873d6b06096cfe93)
- [(2017年12月) PythonとOpenCVをこれからやってみる - 2 - マークを読取る - Qiita](https://qiita.com/rrryutaro/items/10142d3c3397406e5e2b)
- [(2017年12月) PythonとOpenCVをこれからやってみる - 3 - 文字認識(1) - Qiita](https://qiita.com/rrryutaro/items/0c0a7382560e1f67123b)
- [(2017年12月) PythonとOpenCVをこれからやってみる - 4 - 座標設定 - Qiita](https://qiita.com/rrryutaro/items/7f75470586cf210af6d5)
- [(2017年12月) PythonとOpenCVをこれからやってみる - 5 - 学習(1) - Qiita](https://qiita.com/rrryutaro/items/ad3107c2afd50b791db3)
- [(2017年12月) PythonとOpenCVをこれからやってみる - 6 - コンフィグ(1) - Qiita](https://qiita.com/rrryutaro/items/cb2a8682f1150e33ea81)
- [(2017年12月) PythonとOpenCVをこれからやってみる - 7 - 信頼度 - Qiita](https://qiita.com/rrryutaro/items/598fd2f9b8dbfb23ec3a)

#参考にしたもの - 全般
- [OpenCV 3（core + contrib）をWindows & Python 3の環境にインストール＆OpenCV 2とOpenCV 3の違い＆簡単な動作チェック - Qiita](https://qiita.com/hitomatagi/items/d5d475a446ec9c73261e)
- [Pythonで日本語OCRを行うときのメモ - Qiita](https://qiita.com/bohemian916/items/67f22ee7aeac103dd205)

#参考にしたもの - Python関連
- [Pythonの数値計算ライブラリ NumPy入門 « Rest Term](http://rest-term.com/archives/2999/)
- [PythonにおいてのJSONファイルの取扱いあれこれ - Qiita](https://qiita.com/wakaba130/items/5f54aed913156dc4438f)
- [WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話 - Qiita](https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e)
- [コマンドライン引数 - Python入門から応用までの学習サイト](http://www.python-izm.com/contents/basis/command_line_arguments.shtml)

#参考にしたもの - OpenCV関連
- [Python版OpenCV入門 サンプル集 | アルゴリズム雑記](https://algorithm.joho.info/programming/python/opencv-sample-code-py/)
- [OpenCVとPIL（python Image library）のデータ変換 - tata色々な備忘録](http://tatabox.hatenablog.com/entry/2013/07/21/231751)

#参考にしたもの - Tesseract関連
- [文字認識エンジンTesseract OCRで学習 - danglingfarpointer's memoization](http://danglingfarpointer.hatenablog.com/entry/2015/01/28/215629)
- [Tesseract-OCR 3.04 を試してみる - ながいものには、まかれたくない](http://a244.hateblo.jp/entry/2015/07/28/060803)
- [opencvで文字認識その１　Tesseractラッパ - whoopsidaisies's diary](http://whoopsidaisies.hatenablog.com/entry/2014/11/12/003100)

#参考にしたもの - その他
- [Office TANAKA - Excel VBA講座：ファイルの操作[UTF-8形式のテキストファイルに書き込む]](http://officetanaka.net/excel/vba/file/file11.htm)
境界ネットワークでのウイルススキャン

#境界ネットワークでのウイルススキャン
職場は大学なんで、各学科や組織が<DEL>好き勝手</DEL>独自にメールサーバを立ててます。

それなんで、個々のサーバの設定は様々です。

大学のネットワーク管理部門から対外接続のFirewallにメールのアンチウイルス機能入れましたという通知がありました。

個々のサーバの設定変更は必要ないとの事です。

#この対策は暗号化されてたら意味ないんでは。。

SSL/TLSという暗号化はネットワークの途中で盗聴ができないような実装になっています。

メールのウイルススキャンをするにはメールの中身を見る必要があります。Firewallにアンチウイルスを入れても暗号化されていたら見る事ができません。つまりウイルススキャンはできません。

試しに自分が契約している学外サーバから大学のメールサーバにサンプルウイルス(eicar.com)付きメールを送信してみました。

暗号化無しの場合はウイルスが駆除されましたが、暗号化有りの場合は駆除されませんでした。

つまり暗号化されてたら境界ネットワークでのウイルススキャンは無力なんですね。

#メールの暗号化比率を調べてみました。

補足：以下で挙げるメールのログは以下で説明しているSSL/TLSのログを詳細に記録する設定をすでに行っていることを前提としています。

> https://qiita.com/qiitamatumoto/items/608b56e63eec26702caf
> CentOS6.6でメール関連のSSLログの取得および調査

メールを受信するpostfixのdaemonはsmtpdです。なのでsmtpdのログを追いかければよいです。（受信時のログであり、送信時のログではありません。）

非暗号化通信時のログ

```
Dec 10 08:27:52 mail postfix/smtpd[27899]: connect from host-name.example.com[ip-address]
Dec 10 08:27:52 mail postfix/smtpd[27899]: QUEUE-ID: client=host-name.example.com[ip-address]
Dec 10 08:27:53 mail postfix/smtpd[27899]: disconnect from host-name.example.com[ip-address]
```

暗号化通信時のログ

```
Dec 10 04:29:03 mail postfix/smtpd[24209]: connect from host-name.example.com[ip-address]
Dec 10 04:29:03 mail postfix/smtpd[24209]: setting up TLS connection from host-name.example.com[ip-address]
Dec 10 04:29:03 mail postfix/smtpd[24209]: Anonymous TLS connection established from host-name.example.com[ip-address]: TLSv1.2 with cipher ADH-AES256-
GCM-SHA384 (256/256 bits)
Dec 10 04:29:03 mail postfix/smtpd[24209]: QUEUE-ID: client=host-name.example.com[ip-address]
Dec 10 04:29:04 mail postfix/smtpd[24209]: disconnect from host-name.example.com[ip-address]
```

となります。 なので ": disconnect from" の数と ": setting up TLS"の数を数えればおおよそわかるかと思います。 (以下はCentOS6.xのみ.CentOS7ではダメ)

```
$ fgrep "postfix/smtpd[" /var/log/maillog*|grep ": disconnect from"|wc

$ fgrep "postfix/smtpd[" /var/log/maillog*|grep ": setting up TLS"|wc
```
管理しているサーバをいくつか調べてみました。

サーバA: 2017/10/29-2017/12/10
全受信数: 76,032通、暗号化: 18,496通、暗号化率: 24%
学外から全受信数:49,016通、暗号化: 1,491通、暗号化率: 3%

サーバB: 2016/4/20-2017/12/10 
全受信数: 2,210,894通、暗号化: 274,071通、暗号化率: 12% 
学外からの全受信数: 2,114,847通、暗号化: 196,812通、暗号化率: 9%

サーバC: 2017/6/10-2017/12/10
全受信数: 957,621通、暗号化: 100,754通、暗号化率: 11%
学外からの全受信数: 840,284通、暗号化: 80,922通、暗号化率: 10%

というような感じでした。思ったより低かったです(^_^; ですがログを軽く見た感じでは、非暗号化通信のメールはSPAMっぽいのが多いようです。unknown userで弾いているのも多数ありました。

#境界ネットワークでウイルスチェックが入ってないメールの対策

思ったより暗号化率は低かったのですが、暗号化されているメールは境界ネットワークのFirewallのアンチウイルスが適用されていません。それらについてアンチウイルスを適用する必要があります。

多くの場合は個々のクライアントPCにアンチウイルスが導入されています。それで駆除できるかと思いますが、念のため、メールサーバ自身にもアンチウイルスを導入する事にしました。

翌日の記事に続きます。
Pythonで地理情報のマッピング！cartopy使ってみた

Pythonで地図にデータをマッピングできるライブラリの[cartopy](http://scitools.org.uk/cartopy/docs/v0.15/index.html)を使おうとしたらハマったのでやり方を残しておきます。
Anacondaを使うと簡単にインストールできるらしいのですが、この記事は素のPythonでやる人向けです。

# セットアップ
cartopy自体はpipでインストールできるのですが、別言語で書かれたライブラリを使ったりして依存関係が複雑なのでメモ🖋  
大まかな流れは...
0. Xcode’s command-line の確認
1. PROJ.4のインストール
2. GEOSのインストール
3. shapelyおよびcartopyのインストール（但しバイナリファイルを除く）

まずは[公式インストールガイド](http://scitools.org.uk/cartopy/docs/latest/installing.html#installing)をみてね。

## 0. Xcode’s command-line の確認
ガイドには記載がないけどハマったのでメモ。
macOSをアップデートした際にコマンドラインツールが正常にインストールされていないことがあるらしい。
[stdio.h file not found error on macOS Sierra - GitHub](https://github.com/frida/frida/issues/338)

解決するには、
```
$ xcode-select --install
```
でOK。

## 1.PROJ.4のインストール
[PRO4.J](http://proj4.org/)は緯度経度を扱うためのライブラリ。
UNIXのプログラムのビルドに詳しい人ならなんてことないのかもしれないけど、自分はAutoToolの使い方をしらなかったので困りました。

まずは[PRO4.Jのガイド](https://github.com/OSGeo/proj.4)を読んで、GitHubからソースを取得。
その場合自分でコンパイル→インストールする必要があるので...

1. pro4.j のディレクトリ内で autogen.sh を実行。
2. ./configure コマンドでmakeコマンドのための設定ファイルを作成
3. make → make install でコンパイルしてインストール。

## 2. GEOSのインストール
[GEOS](https://trac.osgeo.org/geos/)は（多分）3Dの描画をするライブラリ。

こちらは初めからconfigureが用意されているので、
./configure → make → make install でOK。

## 3.　shapelyおよびcartopyのインストール（但しバイナリファイルを除く）
cartopyの依存ライブラリがDLL地獄（依存ライブラリのバージョンが違うことによる問題）に陥っているらしく、pipでインストールする際にはバイナリファイルを除く必要がある。以下も参照。
[cartopy possibly kills the kernel when using ipython/jupyter notebook - GitHub](https://github.com/SciTools/cartopy/issues/738)

1. すでにshapely, cartopyがインストールされている場合は削除。  
```
pip uninstall shapely
pip uninstall cartopy
```
2. バイナリファイルを除くオプションを付けてインストール  
```
pip install shapely cartopy --no-binary shapely --no-binary cartopy  
```
セットアップ手順は以上です。

# 使ってみる
[公式サイト](http://scitools.org.uk/cartopy/docs/v0.15/matplotlib/intro.html)のソースコードを引用。

```
import cartopy.crs as ccrs
import matplotlib.pyplot as plt

ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()

plt.show()
```
結果  
![Screen Shot 2017-12-10 at 16.15.32.png](https://qiita-image-store.s3.amazonaws.com/0/96286/76fd287c-5f7d-1839-f38c-457ab922dcdd.png)

これは一番シンプルなやつだけど、色も形も幅広く変えられそうなので楽しみ！