OmniAICreator/Qiita-1.07M huggingface dataset:
いま、PowerPointでepsファイルを作らないで、いつ作りますか？

#はじめに
TeXを使い始めたころは特に、画像を挿入しようとすると上手くいかないことが多いかと思います。そこで、この記事を含め、２回にわたり画像を挿入する方法やコツについて書きます。

TeXで挿入できる画像の形式はいくつかありますが、私がTeXで画像を挿入する際はepsで出力した画像を用いています。

そこでこの記事では、PowerPoint（以後パワポ）を用いてepsファイルを作成する方法や注意点を紹介し、次回の記事で挿入する際のコツなどを紹介したいと思います。

**追記 20190825
@m4saka さんから、より楽な方法を紹介している記事をコメントにて共有していただきましたので、今からepsファイルを作成する方は⬇️の記事を参考にすると良いかと思います。
https://qiita.com/tubo28/items/1f8672fb164aafa9ab31**

#方法
パワポでepsファイルを作成するにあたって、大まかに分けると以下の3つの工程があります。

1：プリンタードライバーのインストール
2：パワポ上で出力したい画像の作成
3：画像の出力

それでは一つずつ説明していきます。

##1.ドライバーのインストール

パワポを用いてepsファイルを出力するためには、それを出力できるプリンタードライバーが必要です。そのためまずは、epsファイルが出力できるプリンターのドライバーをインストールします。ちなみに私はOKIのプリンターのドライバー(OKI C8800 PS(MS))をインストールし使用しています。

また、インストールする時でも後でも構わないので、プリンターの名前を、型番そのままではなく「EPSプリンター」とでも名付けておくと後々わかりやすくなります。

##2.出力する画像の作成
次に出力したい画像をパワポのスライドに作成します。この時、慣れていない間は、出力したい画像をスライドの左下の方に描いておくと、後で行うトリミングにあたる作業がやりやすいかと思います。

##3.画像の出力

出力したい画像が作成できたら、後は出力するだけです。出力するにはまず、普段スライドを印刷するときと同様に、「ファイル」タブから「印刷」をクリックします。

ここでまずプリンターに先程インストールした「EPSプリンター」を選択します。選択後以下の図のように、プリンターを選択したところにある「ファイルへ出力」にチェックをいれます。

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/239294/72ae9fc4-4f96-dcc6-2991-001a5b93dd4a.png)

次に、以下の図のように「プリンターのプロパティ」をクリックし、詳細設定をクリックします。新たに出てきたウインドウの「PostScriptオプション」をクリックし、さらに「PostScript出力オプション」をクリックし、「EPS(Encapsulated...)」を選びます。

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/239294/2272b165-5b1f-6d93-3445-e4d5b3de5ad2.png)


その後、「OK」をクリックし、これらのウインドウを閉じます。

最後に、出力したい画像があるスライドのみが印刷されるように選択したら、印刷ボタンをクリックします。すると以下の図のように、新規でファイルを保存する時と同様にウインドウが開きます。そこで、ファイルの種類を「プリンターファイル」から「すべてのファイル」に切り替え、「(ファイル名).eps」と拡張子をepsにして保存したいフォルダに保存します。

![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/239294/fb5e9689-1854-671d-0ac2-aeacca1f6a4d.png)

これでパワポを用いて、無事にepsファイルを出力することができました。

#まとめ
パワポを用いて、epsファイルを出力する工程は、

プリンタードライバーのインストール（初回のみ）
↓
パワポ上で出力したい画像の作成
↓
画像の出力

となります。この記事ではそれぞれの工程での注意点やコツを紹介しつつ、パワポを用いてepsファイルを出力する方法をまとめてみました。

次回は実際に出力したepsファイルをTeXに挿入する際のコツなどについてまとめてみたいと思います。
vue.jsで動画を連続再生してみるネッサンス

vue.jsで動画を連続再生してみるネッサンス。
※何も難しいことしてないです。ただのメモ。
# 作ったもの
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2545/9eb3f86b-f3f4-c7f4-5083-590cb7662ee8.png)
[弾き語りするネッサンスまとめ - 原田珠々華 - アイドルネッサンス](http://planet-ape.net/idolrenaissance/suzuka_douga/hikigatari.php)

2018年2月24日に惜しくも解散（涙）してしまう、[アイドルネッサンス](http://idolrenaissance.com/)に所属している原田珠々華さんが[twitterの公式アカウント](https://twitter.com/idolrenaissance)に投稿している[弾き語りするネッサンス](https://twitter.com/search?f=tweets&vertical=default&q=%23%E5%BC%BE%E3%81%8D%E8%AA%9E%E3%82%8A%E3%81%99%E3%82%8B%E3%83%8D%E3%83%83%E3%82%B5%E3%83%B3%E3%82%B9%20from%3Aidolrenaissance&src=typd)を連続で再生したくて作りました。
撮影カメラをオンオフする動作と動画の切り替えがシンクロしていて…良い！
えっと…公式アカウントが消えても多分見r(ry)
# サンプル
http://planet-ape.net/vuejs_video_sample/
実際に作ったものだとphpとか入っててごちゃっとしてるので簡易なやつを…。
4つの動画ファイル（mp4）を連続で再生します。

```vuejs:html
<div id="app">
    <video id="video1" v-bind:src="video" v-on:ended="onEnded" autoplay></video>
    <a href="javascript:vplay();">再生</a>
</div>
```
videoタグのsrcをv-bindして書き換えられるようにします。
また動画再生の終了イベントを拾えるようにするためにv-on:endedも仕掛けます。
autoplayを設定しておくことでsrcを書き換えた後に自動で再生が始まります。
再生用のリンクはautoplayの効かないiPhone用です。

```vuejs:javascript
<script>
    var v = new Vue({
        el: "#app",
        data: {
            items: [{"url": "v001.mp4"}, {"url": "v002.mp4"}, {"url": "v003.mp4"}, {"url": "v004.mp4"}],
            next: 0,
            video: ""
        },
        created: function () {
            this.getItems();
        },
        methods: {
            onEnded: function () {
                this.getItems();
            },
            getItems: function () {
                var url = this.items[this.next].url;
                console.log('success:' + new Date());
                this.video = url;
                this.next++;
                if (this.items.length <= this.next) {
                    this.next = 0;
                }
            }
        }
    });

    function vplay() {
        var v = document.getElementById("video1");
        v.play();
    }
</script>
```

動画の再生が終了（onEnded）するたびにgetItemsが実行されてvideoの中身を書き換えます。
相手に伝えること

# 「相手に伝えること」

元々個人的に体系化しようとまとめていたものですが、[こちらの記事](https://qiita.com/seki_uk/items/4001423b3cd3db0dada7)に感銘を受けてQiitaに公開することとしました。

まだ実証段階ではありますが、応用はしやすいと思います。より技術寄りというか、仕事での経験を踏まえた続きがあり、これはその前振りでもあります。

### おことわり（特にケーススタディに関して）

- 正確にはまだリーダーポジションは未経験ですが、現在似たようなことを経験しているので、そのまとめとしております。
- また、あくまで相手は日本語をある程度話せる人を想定しており、完全に日本語話者ではない場合については考慮に入れておりません。（相手の言語に合わせて置き換えて下さい）

## 物事に対する理解の目安

物事に対する理解は、以下のように分類できると考えています。（良し悪しではなく、あくまで基準として）

1. 知っている：聞いたことがあり、関連語が出る状態
2. 理解している：イメージが具体的で、他人の話が分かる状態（図に起こしたりなど）
3. 説明できる：自分の言葉で話せる状態
4. 伝えられる：他人を理解させることが出来る状態
5. 実践できる：実際に行動に起こせる状態[^1]

※4.～5.は分野ややることにより前後しますが、場合によっては2.から一気に5.に向かっても良いのかなとも思います

[^1]: SE的には、コーディングが出来るとか、自立して的確な作業が出来る状態でしょうか

## ケーススタディとして

- 伝える人：技術者、特に下にメンバー・後輩が付く人、リーダーポジション以上など
- 相手：外国籍技術者、経験の浅い技術者など、専門用語や慣例として使う用語に不慣れな人

### 前提として

- 相手の知識や伝えたいことに、目線を合わせる（相手の前提知識から引き寄せることを想定）
- 認識があっていなさそうな場合、「自分はこうかな、と思っている」と認識を伝え、そのズレを軌道修正していく（こちら側からある程度寄せる必要もある）

## 理解の状態の説明

### 1.知っている状態

「聞いたことはある」が「理解できていない」状態。

「聞いたことが無い」状態を含め、次の「理解している」状態まで誘導、支援する必要があります。

### 2.理解している状態

1.をクリアし、頭の中でイメージ出来ている状態。言語化まで行かなくても、図などが書けるとよい目安となります。

ここから3.～5.のいずれかに飛ぶ可能性があるので、伝える人は、まず相手をここまで支援することが最低限の目標となります。（最終的に5.に行き着くはずですが、その間の3.～4.があると説得力が増すイメージです）

### 3.説明できる状態

2.をクリアし、自分なりに言葉に出来る状態。

他人の言葉を借りる場合、それ自体は悪くは無いですが、借りた人の言っていることと伝えようとする相手との認識が合っているか確認する必要はあると思います。

#### 補足（ケーススタディに即して）

例えば相手が外国籍技術者の場合、英語も出来ることがある[^2]ので、一部を簡単な英語に置き換えつつ、簡単な日本語になるように言い換えられると、4.の「伝えられる」に通じるレベルになると思っています。

逆に、多少文法が変でも主語述語の関係が判別できれば、単語を拾いつつ補完して「～ということで良いですか？」と聞き返すと認識のズレが小さくて済むのかなと思います。日本人同士の会話にも通じそうなイメージがありますが、まだ試せていないので今後進展があれば……。

[^2]: というより、日本人技術者でもソースコードで見慣れている英語くらいなら置き換えた方が早いこともあり、自分の経験則では多少英語混じりの方が通じる印象です（相手が技術者でない場合は人に寄りけりになってしまいますが）

### 4.伝えられる状態

3.をクリアし、相手に噛み砕いて説明できる状態。

「言葉を（相手にとって）簡単に置き換える」というのが重要で、なるべく易しい日本語にすることがポイントです。

相手が2.の理解できている状態になっているか確認しながら進めるとより良いと思います。

### 5.実践する状態

2.または3.～4.をクリアし、実際の業務で伝える人（指示者）の認識通りに作業し、それを他人に見せることが出来る状態。

ただし、3.～5.は分野によって順番が前後するなど、前提条件が異なるので見極めが必要です。
go言語のcometライブラリを作りました

チャットなどのリアルタイムWebアプリケーション開発に使える、
Go言語のcometライブラリを作りました
https://github.com/intelfike/comet

# cometについて
## なにそれ
ブラウザからのAjaxの通信をサーバー側で止めて、特定のイベントが発生したらレスポンスを返すという手法です。

## 何ができるの
簡単に言うと、websocketみたいなことが出来ます。
普通サーバーが能動的に通信をすることは出来できないですが、cometを使えばあたかもサーバーから通信をしているような挙動を取れます。
### 通常のリクエスト

```
クライアント: 能動的
サーバ     : 受動的
```
### comet

```
クライアント: 受動的
サーバ     : 能動的
```

# 作ったライブラリの説明
## 作った理由(現状の問題点)
### レンタルサーバーだとポートが制限されていてwebsocketが使えないことがある
結構大きい理由です。
80番ポートしか開いていないとか。
自宅サーバーにするにしても、開放するポートが増えるとセキュリティの問題とか、ポート管理のコストの問題とかがあります。

### Goのhttpパッケージの並列処理の挙動がCGIと比べるとイメージしにくい

矢印はスレッドです。Goでは関数は並列化されているものの、同じ関数が複数同時に呼び出される場合は並列化されません。
これを同期するためには、全てのクライアントを認識する必要があります。つまりcookieによりセッション機能を実装する必要があります。
![go httpのスレッドの挙動.png](https://qiita-image-store.s3.amazonaws.com/0/96468/c83e42d5-a80a-ac75-c922-b804ea686e11.png)

### セッション間で情報を共有できない
Goの一般的なセッション管理パッケージは、ユーザー間でデータを共有することについてサポートをしていないっぽいです。(自分が試した範囲では)

### Webアプリケーションを作るたびに独自の(情報の共有が可能な)セッションを実装するのは現実的でない
毎度実装していたらミスも増えますし、コストもかかります。
セッションへの理解が浅い人なら実装すら出来ません。

## どんなパッケージ？
先ほど挙げた問題を解決するパッケージです。
cometをCGI並に簡単に実装できるようにすることを目指しました。

## 使い方
チャットのサンプルです。
https://github.com/intelfike/comet/blob/master/example/main.go
### セッションを定義

```
var cmt = comet.NewComet("realtimesession")
```
引数はセッションを保存するためのcookieのキーです。
重複を避ければ何でも良いです。

### セッションを開始

```
cmt.Start(w, r)
```
w, rはよくあるhttp.ResponseWriteと*http.Requestの組み合わせです。
Webアプリケーションのページにアクセスがあった時点で、セッションが既にある場合でもできるだけ呼び出してください。

### 待機

```
i := cmt.Wait(r)
```
待機します。Done系統の関数呼び出しで解除され、戻り値としてDone系統の引数が渡されます。

### 待機を終了

```
cmt.DoneAll(i)
```
全ての待機を終了してWaitにデータを渡します。
他にも、自身のみ待機を終了する```Done(r, i)```、自身以外の待機を終了する```DoneOther(r, i)```があります。

### セッションの終了

```
cmt.End(r)
```
セッションを終了し、Wait()を終了したり、Done系統の送信対象から外したりといった処理をします。
Webアプリケーションのページから抜けるときに呼び出してください。(呼び出さなくてもある程度は正常に動きますが...)

## 作った感想
設計した通りの理想的な出来上がりどころか、理想を超えて良い出来になりました。
ひとまずは満足です。

## 備考
一応まだ試作段階なので互換性は失われやすいです。
現在ver1.0として、互換性が消えたらver2.0に上がります。そうなれば新しいリポジトリを作りますのでver1.0は継続してご利用頂けます。
あと、バグや要望とかあればissueに投げてくださると嬉しいばかりです。
AWSのEC2でMinecraftのサーバーを構築したヾ( ﾉｼ*°ヮ。)ﾉｼ

# MinecraftのサーバーをAWSのEC2に構築
## 参考にしたサイト
[Minecraft サーバーを Amazon EC2 上に構築](https://qiita.com/EugeneAshizawa/items/d88f4d2778e738efe2eb)
[AWSでマイクラ鯖たててみた٩( 'ω' )و](http://mtdtx9.hatenablog.com/entry/2017/05/14/202820)

## AWS
### インスタンスを作成
1.AMIの選択 -> Amazon Linux AMI
2.インスタンスタイプの選択 -> microだと動かないのでsmall以上を選択
3.インスタンスの設定 -> そのまま
4.ストレージの追加 -> そのまま
5.タグの追加 -> 任意で
6.セキュリティグループの設定 -> ルールを追加

|タイプ|プロトコル|ポート範囲|ソース|
|:-:|:-:|:-:|:-:|
|カスタムTCP|TCP|25565|0.0.0.0/0|

7.確認して作成

### キーペアの作成
1.サイドメニューからキーペアを開く
2.キーペアの作成で任意の名前でキーを作成し`○○.pem`を任意の場所に大切に保存しておく

### インスタンスにIPアドレスを割り当てる
Elastic IPという仕組みがありそれで固定のIPアドレスを割り当てます
1.サイドメニューからElastic IPの項目を探し出して開く
2.新しいアドレスの割り当てを押して作成する
3.生成されたIPアドレスの項目を右クリックしアドレスの関連付けでインスタンスに紐付ける

## SSH接続〜サーバーを立ち上げるまで
### SSHでインスタンスに接続
```
$ cd (キーペアのあるディレクトリ)
$ chmod 400 ○○.pem
$ ssh -i ○○.pem ec2-user@(electric ip)
```
### 色々する
順番にyumのアップデート、gitのインストール、必要ならjavaのアップデート
(作成時のjavaバージョンが7だったので最新版のマイクラ鯖のjarが動かなかった)
[Amazon EC2でJava8を設定する](http://mabushiisign.hatenablog.jp/entry/2016/08/20/154110)

```
$ sudo yum update -y
$ sudo yum -y install git
$ sudo yum install java-1.8.0-openjdk.x86_64
```

### minecraftのサーバーを立ち上げる
1.サーバーのjarをダウンロード

`$ wget https://s3.amazonaws.com/Minecraft.Download/versions/(使いたいバージョン)/minecraft_server.(使いたいバージョン).jar`
2.GUIを表示しないで一度実行
`$ java -Xmx1024M -Xms1024M -jar minecraft_server.(使いたいバージョン).jar nogui`

3.eula.txtの利用規約に同意する viでfalseをtrueに書き換える
`$ vi eula.txt`

4.サーバーを立ち上げる
`$ java -Xmx1024M -Xms1024M -jar minecraft_server.(使いたいバージョン).jar nogui`

## 遊ぶ
マルチプレイでElasticIPを指定すれば遊べます

## メモ
インスタンスを停止したい時terminatedするとデータが消えるので注意
Excelを使っていて驚いたこと(小ネタ)

Excelで、1つめのセルに「4th」2つめのセルに「5th」と書いて、ズリーっと引っ張ると、
… 11th、12th、13th、…と続くが、その後、ちゃんと … 21st、22nd、23rd、… となっていて、
「おっ」と感心した(笑)。
YOLOを使った物体検出をするTwitterBotを作る

#1. 参考にしたサイト
[Build A Tweet Bot With Python](https://scotch.io/tutorials/build-a-tweet-bot-with-python)
とてもわかりやすくTwitterでのbotの作り方を解説しています。

#2. 改造する
ここで紹介されているbotは、リプライで送られてきた画像をぐちゃぐちゃにscrambleして返すという内容です。具体的には、
①送られてきた画像を"temp.png"という名前で保存
②scramble(filename)という関数内で、画像を編集し、"scramble.png"という名前で保存
③"scramble.png"をリプライ相手に送信

そこで今回は②のscramble(filename)の関数をobjectDetection(filename)に置き換えて物体認識をさせてみます。

#3. YOLO
![Screen_Shot_2016-11-17_at_11.14.54_AM.png](https://qiita-image-store.s3.amazonaws.com/0/234396/19aed6c5-8988-7c75-5d3a-cd2c7890a2c0.png)
YOLOのコードは[ここ](https://pjreddie.com/darknet/yolo/)から落とせます。
画像認識をしてその部分を四角で囲う処理をして"scramble.png"を保存するobjectDetection(filename)に書き換えます。ついでに出力ラベルも取り出してそれをツイート内容に反映させましょう。

#4. 結果
<img width="581" alt="スクリーンショット 2018-02-20 21.16.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/234396/d8736e80-9389-ef49-5eb7-da39c814c73b.png">

<img width="579" alt="スクリーンショット 2018-02-20 21.16.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/234396/cc78d755-6643-66f7-fab9-484462d0e02b.png">

リプライで送られてきた画像に対して物体検出をするbotができました。
気軽にディープラーニングが試せる点が良いと思います。
WKWebViewでのPOST Request

※追記：2018.05.17 詳細はソース参照
いろんなサイトの情報を片っ端から試してやっと出来たのでメモ

やりたいこと：
フォームデータ付きのPOST Requestを飛ばしWKWebViewで表示する。
その際にユーザ認証に必要なフォームデータを追加する。

環境：
-Swift 4
-Xcode 9.2
-Deployment Target 10.0
※11以上からStoryboard上でWKWebView置けるようになったのでもっと簡単になるはず

```ViewController.swift
import UIKit
import WebKit

class ViewController: UIViewController , WKNavigationDelegate, WKUIDelegate {
    var webView: WKWebView!

    override func loadView() {
        // 追記：2018.05.17 webViewをsub view化した際に親メソッドを呼ばないと実行時エラーとなったため
        super.loadView()

        let webConfiguration = WKWebViewConfiguration()
        // アプリからのアクセスとサーバ側に伝えるためuseragentのアプリケーション名を書き換え
        webConfiguration.applicationNameForUserAgent = "test-app"
        
        self.webView = WKWebView(frame: .zero, configuration: webConfiguration)
        self.webView.navigationDelegate = self
        self.webView.uiDelegate         = self

        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var request = URLRequest(url: URL(string: "https://www.google.co.jp/")!)
        request.httpMethod = "POST"

        // パラメータのように２つ目以降は&でつなぐ
        var bodyData = "terminal_id=" + UIDevice.current.identifierForVendor!.uuidString
        request.httpBody = bodyData.data(using: .utf8)!
        self.webView.load(request)
    }
}
```
出来てみたら
だから、どうした
って事もないプログラムですが
gtag.jsのイベントをユーザーエージェント毎に変える 

もしかしたら使うかもしれないので、作ったやつ。

```html:HTML
<a class="js-gtag" id="link01" href="#">リンク1</a>
<a class="js-gtag" id="link02" href="#">リンク2</a>
```

```javascript:JavaScript
const ua = navigator.userAgent.toLowerCase();
const isMobile = /i(phone|pod)/.test(ua)||/android(.+)?mobile/.test(ua);

const _importGtag = function(target, category, action) {
  const $gtagTarget = $(`.${target}`);

  $gtagTarget.each(function() {
    let $this = $(this);
    let _id = $this.attr('id');

    let _ua;
    if (isMobile) {
      _ua = 'mobile';
    } else {
      _ua = 'notMobile';
    }

    let _event = `gtag('event', '${action}', {'event_category': '${category}', 'event_label': '${_id}_${_ua}'});`;

    $this.attr('onclick', _event);
  });
};

// _importGtag('クラス名', 'カテゴリー', 'アクション');
_importGtag('js-gtag','category_name','action_name');
```

スマホで`リンク1`をタップすると、`event_label`が`link01_mobile`になる。
それ以外で`リンク2`をクリックすると、`event_label`が`link02_notMobile`になる。

以上。
RとPythonでMann–Whitney-Wilcoxon検定

始めに
===
Mann-WhitneyのU検定と呼ばれたり、Wilcoxonの順位和検定(Wilcoxon rank-sum test)とも呼ばれる。Wilcoxonの符号順位検定(Wilcoxon signed-rank test)は別物。これだけで既にややこしいのに、Rの関数名は`wilcox.test()`なのに、Python(scipy)の関数名は`mannwhitneyu()`、しかもRはデフォルトが両側検定なのにPythonは片側検定という、両方の環境を行ったり来たりする人泣かせな検定。
今後迷わないように差をまとめておきます。

とりあえず適当なデータを作る。

```py
>>> import numpy as np
>>> import pandas as pd
>>> n = 50
>>> val = np.random.randn(n)
>>> cls = np.random.choice(['A', 'B'], n)
>>> a = pd.DataFrame(dict(cls=cls, val=val))
>>> a.head()
  cls       val
0   A  0.717399
1   B  0.556095
2   B -0.644795
3   A  0.615479
4   B  0.352685
>>> a.to_csv('hoge.tsv', index=False, sep='\t')
```

R
===

```R
> a <- read.table('hoge.tsv', header=T)
> head(a)
   cls        val
1   A  0.7173995
2   B  0.5560949
3   B -0.6447947
4   A  0.6154794
5   B  0.3526846
6   B -0.1734241
> wilcox.test(a$val[a$cls == "A"], a$val[a$cls == "B"])         

        Wilcoxon rank sum test

data:  a$val[a$cls == "A"] and a$val[a$cls == "B"]
W = 267, p-value = 0.3908 # Pythonでの結果とちょっと違う。
alternative hypothesis: true location shift is not equal to 0

> wilcox.test(a$val[a$cls == "A"], a$val[a$cls == "B"], exact=F)

        Wilcoxon rank sum test with continuity correction

data:  a$val[a$cls == "A"] and a$val[a$cls == "B"]
W = 267, p-value = 0.3875
alternative hypothesis: true location shift is not equal to 0

> wilcox.test(a$val[a$cls == "A"], a$val[a$cls == "B"], exact=F, alternative='less')

        Wilcoxon rank sum test with continuity correction

data:  a$val[a$cls == "A"] and a$val[a$cls == "B"]
W = 267, p-value = 0.1938
alternative hypothesis: true location shift is less than 0
```

Python
===

```py
>>> import pandas as pd
>>> from scipy import stats
>>> a = pd.read_table('hoge.tsv')
>>> stats.mannwhitneyu(a['val'][a['cls'] == 'A'], a['val'][a['cls'] == 'B'])
MannwhitneyuResult(statistic=267.0, pvalue=0.19376142700269727)
>>> stats.mannwhitneyu(a['val'][a['cls'] == 'A'], a['val'][a['cls'] == 'B'], alternative='two-sided')
MannwhitneyuResult(statistic=267.0, pvalue=0.38752285400539455)
```
両側・片側の違いを加味しても、そのままだと少し結果が変わってしまいますが、Rの方に`exact=F`のオプションをつけると同じ結果が得られます。

```
   exact: a logical indicating whether an exact p-value should be
          computed.
```

Pythonの結果は "exact" ではなのでしょうか・・・

Rの`correct=T/F`、Pythonの`use_continuity=True/False`オプションは全く同じように機能するようです。離散分布由来の値を扱う場合は、trueにしたほうがよいようです。

```
# Python
use_continuity : bool, optional
        Whether a continuity correction (1/2.) should be taken into
        account. Default is True.
# R
 correct: a logical indicating whether to apply continuity correction
          in the normal approximation for the p-value.

   exact: a logical indicating whether an exact p-value should be
          computed.
```
Azure Functions でスケジュールに基づいて実行される関数を作成する

# はじめに
Azure Functionsでタイマーによってトリガーされる関数の作成を試してみました。
AzureポータルからGUIを操作することで、10分程度で関数を作成することができ、下記のようなポータルの関数ログ出力エリアで、タイマー起動されたログを確認できます。
![AzureFunctions101.png](https://qiita-image-store.s3.amazonaws.com/0/239292/0c3c787b-3773-89bb-cbb2-34757267a337.png)

以降のページに、Azure でタイマーによってトリガーされる関数を作成する手順を記します。
参考サイト：「Azure でタイマーによってトリガーされる関数を作成する」
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-scheduled-function

# 1. Azure Portalで関数を作成する
Azure Portal の左上隅にある 「＋」（新規） ボタンをクリックします。
[Function App] をクリックします。
![AzureFunctions103.png](https://qiita-image-store.s3.amazonaws.com/0/239292/9d9260bf-7778-73cf-b80d-edb0b5e4f08e.png)

必要事項を入力した後、[作成] をクリックします。
アプリ名：新しい Function App を識別する名前。
サブスクリプション：有効なサブスクリプションを選択する
リソース グループ：Function App を作成するための新しいリソース グループの名前。
ホスティング プラン：既定の [従量課金プラン] では、リソースは関数の必要に応じて動的に追加されます。 
ユーザーは、関数が実行された時間に対してだけ支払います。
場所：ユーザーに近い場所、または関数がアクセスする他のサービスの近くの場所を選択します。
Storage：Function App によって使用される新しいストレージの名前。
![AzureFunctions104.png](https://qiita-image-store.s3.amazonaws.com/0/239292/120cbbfb-b19d-3873-6089-a7639729bb8f.png)
通知メニューで、デプロイメントが成功したことを確認します。

# 2. タイマーによってトリガーされる関数の作成
Function App を展開します。
![AzureFunctions106.png](https://qiita-image-store.s3.amazonaws.com/0/239292/c2f1d10e-a65f-e5a2-6748-a8f9773743a9.png)
作成した関数を選択し、[関数] の横にある [+] ボタンをクリックします。
![AzureFunctions107.png](https://qiita-image-store.s3.amazonaws.com/0/239292/96d5e6ea-a643-6046-d779-58782f9c8a8e.png)
「1 シナリオを選択します」で「タイマー」を選択します。
「2 言語を選択します」で「JavaScript」を選択します。
「この関数を作成する」をクリックします。
![AzureFunctions108.png](https://qiita-image-store.s3.amazonaws.com/0/239292/707ad500-c0b9-117b-f25e-ede76783267b.png)
関数が作成されます。
![AzureFunctions109.png](https://qiita-image-store.s3.amazonaws.com/0/239292/2ecae092-f177-8a93-a82a-5ef8f6d1a952.png)
「統合」画面でスケジュールを1分(0*/1****)に変更し、[保存]をクリックします。
![AzureFunctions110.png](https://qiita-image-store.s3.amazonaws.com/0/239292/f8603b86-42ac-2c3f-4e80-e3176c8d5723.png)

ポータルの関数ログ出力エリアで、タイマー起動されたログが1分毎に出力されることを確認できます。
![AzureFunctions101.png](https://qiita-image-store.s3.amazonaws.com/0/239292/7be1b6e7-76e5-9431-fcdb-40e157ddcc34.png)

以上
Angularで操作された要素と別の要素のclickイベントを発火させる。

意外と面倒だったので、メモ

親要素(.parent)のどこでenterが押されても、「決定」ボタンのクリックイベントを発火させて、hoge関数を実行する。

```html

<div class="parent" (keyup.enter)="decide._elementRef.nativeElement.click()">
   // ****
    <button #decide (click)="hoge()">決定</button>
   // ****
</div>
```

モーダル作る時とかよくあると思います。
PyKNPをWindows10にインストールする(お土産付き)

自然言語処理の強力なツールであるKNPやjuman++用のpythonバインディングであるPyKNPですが、Windowsネイティブではそのままは使えないようでした。ググっても他に情報がなかったのですが、少しいじれば動くようになりましたので参考までに投稿しておきます。
(わざわざWindowsネイティブにPyKNPを入れようという人なんてあまりいないでしょうけど)

自分でいじるのは面倒だと思いますので[こちら](https://github.com/ono0708/pyknp-0.3_win/raw/master/pyknp-0.3_win.zip)にzipも置いておきました。(PyKNPのバージョンは0.3)ご利用については元のPyKNPの基準に即してお願いしますが、ono0708は利用に際して発生する一切の事に関して責任を持ちませんので御了承の上でお使い下さい。
(zipの公開に問題があればご連絡ください)

当然ですがjuman,KNP,juman++がWindowsにインストールされておりパスが通っている必要があります。jupyterなどでjumanとjuman++を行ったり来たりしているとエラーを吐くことがあるようなのでご注意を。

以下変更箇所。全てpyknp/juman/内のファイルです。


```python:juman.py,52行目
#変更前
self.process = subprocess.Popen('bash -c "%s"' % command, env=env,

#変更後
self.process = subprocess.Popen('%s' % command, env=env,
```

```python:juman.py,71行目～81行目
#変更前
    def query(self, sentence, pattern):
        assert(isinstance(sentence, six.text_type))
        self.process.stdin.write(sentence.encode('utf-8')+six.b('\n'))
        self.process.stdin.flush()
        result = ""
        while True:
            line = self.stdouterr.readline()[:-1].decode('utf-8')
            if re.search(pattern, line):
                break
            result = "%s%s\n" % (result, line)
        return result

#変更後
    def query(self, sentence, pattern, encoding="ms932"):
        assert(isinstance(sentence, six.text_type))
        self.process.stdin.write(sentence.encode(encoding)+six.b('\n'))
        self.process.stdin.flush()
        result = ""
        while True:
            line = self.stdouterr.readline()[:-1].decode(encoding)
            if re.search(pattern, line):
                break
            result = "%s%s\n" % (result, line)
        return result
```

```python:jumanpp.py,37行目
#変更前
return self.subprocess.query(input_str, pattern=self.pattern)

#変更後
return self.subprocess.query(input_str, pattern=self.pattern, encoding="utf8")
```

以上です。良いNLPライフを。
FacebookGraphAPIで取得したJSONをPandasでいじる際の覚書

json_nomalizeを使えばいいだけなのだけど、dataを指定するまでに行き着くまでに紆余曲折してしまったので覚書。

``` graph.py
import requests
import pandas as pd
from pandas.io.json import json_normalize
# package for flattening json in pandas df

import json


access_token = 'xxxxアクセストークンを設定xxxx'
url = 'https://graph.facebook.com/v2.12/xxxよしなにxxxx&access_token=' + access_token


r = requests.get(url)

json_dict = json.loads(r.text)

# ここでdataを指定してあげないとネスト構造が解析できなくなる
df = json_normalize(json_dict['data'])

display(df)
```
気が向いたら補足を付けます。
rust String &str の変換と、文字列 数値 の変換

# rustでの型変換
rustは`as`で型を変換出来るのですが、数値から文字列の変換が`as`では出来なかったので、上手くいった方法を紹介します。
イマイチどういう方法が良いのかが分かっていません。
まずrustは文字列型が`String` `&str`の2種類存在するので,
`String` `&str`の変換を紹介したあと文字列から数値への変換を紹介します。
追記
tatsuya6502さんから不足している部分を補足して頂いたので追記しています。
数値から文字への変換を付け足しました。

## String → &str
`&`を付けるだけで出来ます。
>``` rust
let str1: String = String::from("abc");
let str2: &str = &str1;
println!("{}", str2);  // "abc"
>```

## &str → String
`to_string()`を利用すると出来ます。
>``` rust
let str1: &str = "abc";
let str2: String = str1.to_string();
println!("{}", str2);  // "abc"
>```

追記
Rust 1.19以前の記事では`to_owned()`が推奨されている場合があるが現在では`to_string()`でも大丈夫です。

## String → num
`.parse().unwrap()`を利用すると出来ます。
ちゃんと変換後の型を指定しないと動きません。
>``` rust
let stri: String = String::from("5");
let num: i32 = stri.parse().unwrap();
println!("{}", num);  // 5
>```

## &str → num
String → numと同じです。
>``` rust
let stri = "5";
let num: i32 = stri.parse().unwrap();
println!("{}", num);  // 5
>```

## num → String
&str → Stringと同じく`to_string()`を利用すると出来ます。
>``` rust
let num: i32 = 5;
let stri: String = num.to_string();
println!("{}", stri);  // "5"
>```

追記
小数点の変換などの場合`format!()`を利用すると小数点の桁数とかを指定できるので、`format!()`のが柔軟性が高いです。
>``` rust
let num: f64 = 4.3 + 0.1;
let strf1 = num.to_string();        // "4.3999999999999995"
let strf2 = format!("{:.2}", num);  // "4.40"
println!("{} {}", strf1, strf2);
>```

## num → &str
一旦`String`に変換してから`&`を付けます。
~~もっと良いやり方がある気がする。~~
num → &strは直接作れないのでこの方法で良いみたい。
>``` rust
let num: i32 = 5;
let stri: &str = &num.to_string();
println!("{}", stri);  // "5"
>```

## char → num
`as`で数値に変換した後に`48`引きます。
ASCIIコードでいう`'0'`です。
>``` rust
let c: char = '5';
let num: i32 = c as i32 - 48;
println!("{}", num);  // 5
>```

## num → char
`from_digit`で`char`に変換します。
変換する数値は`u32`でないと行けないのでキャストします、基数は10進数なので`10`;
その後`Some<T>`の中身を取り出したいので`.unwrap()`しています。
>``` rust
let num: i32 = 5;
let c: char = std::char::from_digit(num as u32, 10).unwrap();
println!("{}", c);  // '5'
>```

# まとめ
~~rustは難しい。~~
~~やっぱりrustは難しい。~~
メモしないと分からない。
いらすとや検索サービスをAWSケチケチ構成で作ってみた

# 概要

2017/12~2018/01に[かわいいフリー素材集 いらすとや](http://www.irasutoya.com/)の専用検索サービスを作っていました。
完成後、いらすとやの中の人とコンタクトを取り許可をいただけたので[いらすとや検索\(公認ファンサイト\)](https://irasutoya-sear.ch/)として先日公開しています。

## この記事の目的

* AWSは従量課金なので使うときは料金が爆発しないか不安だけど、構成次第ではVPS 1つ借りるよりよほど安いよと伝えたい
* 既存サイトのデータを継続的にcrawlingして提供するサービスの典型例として共有
* せっかくサービス作ったのでもっとみんなに使ってほしい・・・

## システム構成図

![いらすとや検索システム構成図.png](https://qiita-image-store.s3.amazonaws.com/0/30316/c429fc15-528c-2a14-e322-ad95b7134124.png)


## 運用コスト

月約4,000円程度。実際には90%がElasticsearch Service(ES)のためのEC2インスタンスで、それ以外は400円と激安。

![0f252573c79238c85eedaec7367cc380.png](https://qiita-image-store.s3.amazonaws.com/0/30316/b08c344a-217d-7e4c-a32b-a5b9846f51c9.png)

## 技術スタック

使った技術を書き出しました。詳細は僕が説明するよりそれぞれの記事や解説を見たほうが良いと思います。
しかし、書き出していてこれ全部一人で理解・把握しないといけない現代のwebエンジニアは大変だなと思いました。

* AWS系
    * EC2
    * CloudFront
    * S3(website hosting)
    * API Gateway
    * Lambda
    * Amazon Elasticsearch
    * CloudFormation(およびSAM)
    * Route53
* 開発系
    * クライアント
        * JavaScript(ECMAScript 2015)
        * webpack
        * vue.js
        * vue-router
        * bootstrap
        * babel
    * サーバサイド
        * lambda + API gateway
        * terraform(後に不要とわかりCloudFormationへ置き換え)
        * Python 3.6
        * sam-local
    * クロウラー
        * python3.6
        * scrapy
        * requests

## 構成の理由と補足

* Client(ブラウザ)からElasticsearchへ直接クエリを投げたかったのだが、Elasticsearchは普通に公開するとWriteなREST APIもフルオープンになってしまうのでAPI gatewayとLambdaで泣く泣くsearchだけできるようにフィルタ
* Elasticsearchは2018年現在代替が存在しない、検索エンジンとしては僕が知る限りベストプロダクトなのでコストは高いが採用
* サーバサイドでスクリプティングをしていないため、vue.jsとvue-routerを使ったjavascriptコードはS3 website hostingで完結して提供できる。これでサーバサイドでEC2 Webサーバを使う必要がなくなりその部分のコストが100円以下に
* 検索データは本家サイト様をcrawlingして収集。ただし一度集めたあとは差分のみ参照するようにしているので、1日に1度 追加された素材のページ+3リクエストのみの負荷しか与えていない
* crawlingはpythonのscrapyがベストソリューションだった。本当はlambdaでやれればよかったが5分で終わらないため、1日の決まった時間帯のみインスタンスを立ち上げcronでcrawlingを実行してElasticsearchへ反映、後に自動終了するようにしている
    * この部分はFargateやAWS Batchでもっとスマートにできれば最高
* crawlingに使えるライブラリは最初Rubyで使えるものの中から選択してコードを書いていたが保守状態が良くなく機能も貧弱でバグが多かった。思い切ってcrawlerとして評判の高いpythonのscrapyにしたが思った以上によく、言語変更しただけの甲斐があった。最終的に自分の書いたコードは50行以下になった。
* apacheやnginxのようなリッチウェブサーバが使えない以上vue-routerのサーバサイドスクリプティングはできない。なのでSEO的にはちょっと減点されるらしいが、コストパフォーマンス優先ゆえ一旦妥協
yueをVisual Studio環境でビルドする

# クロスプラットフォームなネイティブGUIライブラリ yue

Electronの作者による新しいGUIライブラリ [yue](http://libyue.com)
モダンなGUIライブラリとして期待される。
[新しいクラスプラットフォームデスクトップアプリケーションライブラリ yue](https://qiita.com/akameco/items/2eac88f577a307b870b9)

各プラットフォーム向けに[プリビルドライブラリ](https://github.com/yue/yue/releases)も用意されているが、
まだ始まったばかりのプロジェクトということで、ソースに修正を加えたいことも出てきそうなので、自前でビルドしてみる。

## 環境
Windows 10
Visual Studio 2017
Git
Python 2.7.12 (3系は非対応)
node v8.9.1

## ソースの取得

githubのレポジトリからクローン
https://github.com/yue/yue

    > git clone git@github.com:yue/yue.git

## Debugging Tools for Windowsのインストール

ビルド時にDebugging Tools for Windowsに含まれるDLL (`DbgHelp.dll`など) が必要になる。これはVisual Studio 2017に含まれるWindows SDKには入っていない。

1. Windows SDKインストーラのダウンロード

    最新のWindows 10 SDK(10.0.16299.91)をダウンロード
    https://developer.microsoft.com/ja-jp/windows/downloads/sdk-archive

2. Windows SDKのインストール

    「Debugging Tools for Windows」にチェックが入っていることを確認
    ![winsdksetup.PNG](https://qiita-image-store.s3.amazonaws.com/0/83164/5adcd334-831e-5d75-52c1-e785b9646106.png)


## ビルド

yueはChromium由来のコードに依存していて、ビルドシステムも[GN](https://chromium.googlesource.com/chromium/src/tools/gn/)が使われている。
GNについてはよく分からないが・・・、依存ファイルをダウンロードしてくれるスクリプトが用意されている。

    > node scripts\bootstrap.js

ビルドを実行

    > node scripts\build.js

ビルドが成功すると `out\Component` フォルダにライブラリや実行ファイルが生成される。

sample_app.exeの実行結果
![sample_app.PNG](https://qiita-image-store.s3.amazonaws.com/0/83164/b3d922eb-6946-7bf8-30ed-e6fe267f58df.png)
CentOS6 でCUIマイニング環境を作る

# はじめに
NASサーバ(CentOS6)の普段利用していないマシンリソースをマイニングに利用することにした

結論から言うと、CentOS6 だと必要なライブラリそろえるのが面倒だったので、
ほかの方の記事を参考にDockerでUtuntuインスタンスを作ってその上でマイニングするようにした

# 前提条件
- Minergate に登録済である

# Docker のインストール
```
$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
$ sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum -y install docker-io
```
- サービス設定

```
$ sudo service docker start
$ sudo chkconfig docker on
```
# Ubuntuイメージ取得〜起動

```
$ sudo docker pull ubuntu
$ sudo docker run -i -t ubuntu /bin/bash
```

# Ubuntuでマイニング環境の準備
* ここからは、起動したUbuntuイメージ上で実行

```
# apt-get update
# apt-get install -y wget
# wget https://minergate.com/download/deb-cli
# dpkg -i deb-cli
```
# マイニングの実行
```
# nohup minergate-cli -user hoge@hoge.com -xmr &
```
- ログみたいとき

```
# tail -f nohup.out
```

# 参考
- [Dockerを導入する（CentOS版）
](https://qiita.com/zwirky/items/991f61a231f4e198a320)
- [目指せ文系からの一流エンジニア！初心者のDocker勉強会](https://qiita.com/sivertigo/items/2211fc90cf13e0173cf3)
- [仮想通貨の発掘環境を仮想環境で](http://sometimememo.php.xdomain.jp/blog/digitalocean-minergate/)
[memo] Ruby2.5.0 / Rails5.1.5 install

## **Ruby install**
### **rbenv install**
```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```
```
$ vi ~/.bash_profile
```
```bash:~/.bash_profile
export PATH=$HOME/.rbenv/bin:$PATH
export PATH

eval "$(rbenv init -)"
```
```
$ exec $SHELL -l
```

### **ruby-build install**
```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

### **Ruby install**
インストール可能バージョンの確認

```
$ rbenv install --list
```
Rubyインストール

```
$ rbenv install -v 2.5.0
```
利用するRubyバージョンの指定

```
$ rbenv global 2.5.0
```
バージョン確認

```
$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
```

## **Rails install**
### **Bundler install**
```
$ gem install bundler
```
```
$ bundler -v
Bundler version 1.16.1
```

### **Rails install**
```
$ gem install rails --no-ri --no-rdoc --version="5.1.5"
```
```
$ rails -v
Rails 5.1.5
```

以上
[memo] AWS EC2 初期設定

## **History設定**
```
$ vi ~/.bashrc
```
```bash:~/.bashrc
# history
HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '
HISTSIZE=1000000
# HISTIGNORE=history:ls:ll:df
```
```
$ source ~/.bashrc
```

## **タイムゾーン設定**
```
$ sudo rm -f /etc/localtime
$ sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
```

```yum update```でUTCに戻るのを防ぐため下記設定も行う。

```
$ sudo vi /etc/sysconfig/clock
```
```bash:/etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
```
```
$ date
2018年  2月 20日 火曜日 18:46:41 JST
```

## **日本語設定**
```
$ sudo vi /etc/sysconfig/i18n
```
```bash:/etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
```
```
$ sudo vi /etc/sysconfig/keyboard
```
```bash:/etc/sysconfig/keyboard
KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"
```
```
$ sudo vi ~/.bash_profile
```
```bash:~/.bash_profile
LANG=ja_JP.UTF-8
export LANG
```

## **その他インストール**
### **gcc-c++ install**
```
$ sudo yum -y install gcc-c++
```
```
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

### **Git install**
```
$ sudo yum -y install git
```
```
$ git --version
git version 2.13.6
```

### **OpenSSL install**
```
$ sudo yum install -y openssl-devel readline-devel zlib-devel
```
```
$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
```

以上
LibreOfficeBasicからPythonマクロを実行する

Pythonマクロを作り初めて、Clacで実行しようとした時、ツール　ー＞　マクロ　ー＞　実行　と操作しなければいけないが、非常に面倒だ。

直接、Pythonマクロが実行出来ないか検索しても見つかりませんでした。
BasicのFunc()みたいにセルに「=○○○」と入力して使いたいが、どうしても見つかりませんでした。

海外のLibreOfficeの質問コーナーでBasicからPythonマクロを実行したいという記事を見つけました。これならなんとかなりそうです。

Execute a Python Macro (Function) From Base and Return Value to Base
https://ask.libreoffice.org/en/question/52125/execute-a-python-macro-function-from-base-and-return-value-to-base/

Answers<1>と<2>の両方共、BasicからPythonマクロを実行することが出来ました。
どちらか言うと<2>の方が使い勝手が良いです。

AnawersのみGoogle翻訳で翻訳して下記のページに載せています。
https://pocketcomputer.jimdo.com/libreoffice%E3%81%A7python-2/
fzf の活用例

fzf や peco って便利だよね。
オレオレコマンド頑張って作るのも悪くないけど、楽したい人は公式の examples を見ると幸せになれると思う。
fzf を使った便利関数がたくさん乗ってるよ。

bash zsh は[こっち](https://github.com/junegunn/fzf/wiki/Examples)
fish は[こっち](https://github.com/junegunn/fzf/wiki/Examples-(fish))
CentOS 7、PHP 7.2 の環境に Zabbix 3.4 をインストールする


まっさらな CentOS 7 に Zabbix をインストールする手順です。

Zabbix 公式手順でそのままインストールすると PHP 5.4 がインストールされてしまうので、PHP 7.2 のインストールを加えています。

## 構成

- Zabbix 3.4
- Apache 2.4
- PHP 7.2
- MariaDB 5.5

SELinux、ファイアウォールは無効化してあり、VPS のネットワーク設定で通信の制御を行っている前提です。

通信に必要なポートは下記の通り。

- 22    -> SSH
- 80    -> http
- 443   -> https
- 10051 -> Zabbix Agent からの通信を受け入れる

## 手順

SSH でログイン後、root ユーザーに切り替えて作業を行なう。

### リポジトリの登録

remi リポジトリは PHP 7.2 をインストールするために、zabbix リポジトリは Zabbix 3.4 をインストールするために登録します。

```
sudo su
yum -y install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
yum update
```

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

パッケージのインストールを行ないます。

PHP 7.2 をインストールするために remi-php72 を有効化しています。

```
yum --enablerepo=remi,remi-php72 install \
zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent \
mariadb mariadb-server
```

### MariaDB を起動

MariaDB を起動し、マシンが起動するとともに MariaDB も起動するよう登録します。

```
systemctl start mariadb
systemctl enable mariadb
```

### データベースの初期設定

MariaDB にログインし、Zabbix 用のデータベースを作成します。

```
mysql -u root -p
```

password となったいるところは適宜別のものに書き換えます。

```sql
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
quit;
```

データベースの作成後、SQL コンソールから出て、Zabbix のスクリプトを MariaDB に流し込みます。

```
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
```

### Zabbix の設定ファイルを編集

zabbix_server.conf を編集します。

```
vi /etc/zabbix/zabbix_server.conf
```

先ほど作成したデータベース名、ユーザー名、パスワードを設定ファイルに書き込みます。

```zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password
```

### ウェブサーバーの設定

Zabbix をインストールするとウェブサーバーとともに設定ファイルも同時にインストールされます。

ただし、PHP のバージョンや地域に関する記述を編集する必要があります。

```
vi /etc/httpd/conf.d/zabbix.conf
```

```zabbix.conf
<Directory "/usr/share/zabbix">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
-   <IfModule mod_php5.c>
+   <IfModule mod_php7.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value always_populate_raw_post_data -1
-       # php_value date.timezone Europe/Riga
+       php_value date.timezone Asia/Tokyo
    </IfModule>
</Directory>
```

### サービスの起動

Zabbix Server、Zabbix agent、ウェブサーバーを起動し、自動起動に登録します。

```
systemctl start zabbix-server zabbix-agent httpd
systemctl enable zabbix-server zabbix-agent httpd
```
Unreal Engine 4メモ：DataTableのFTimespan型はインポート出来ない

これはバージョン4.17.2で確認したものです。
バージョンアップしたら対応されていると良いなぁ。

```c++:sample.h
USTRUCT(BlueprintType, DisplayName = "FTimespanを使ったデータ", Category = "データ")
struct FTimespanParam : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditAnywhere, DisplayName = "記録", Category = "データ")
		FTimespan BestTime;
};
```

このデータはcsvを使って「BestTime」をインポートできない。理由は下記。

```c++:Timespan.cpp
bool FTimespan::ImportTextItem(const TCHAR*& Buffer, int32 PortFlags, UObject* Parent, FOutputDevice* ErrorText)
{
	// @todo gmp: implement FTimespan::ImportTextItem
	return false;
}
```

悲しい。パッチかプルリクエストか…。
ちなみにエクスポートはできます。

#参照
[フォーラム：FTimespan can't import to DataTable](https://answers.unrealengine.com/questions/412763/ftimespan-cant-import-to-datatable.html)
【Swift4】ViewControllerでアプリがバックグラウンド／フォアグラウンドになったことを検知する方法

アプリがバックグラウンド／フォアグラウンドになった際に、UIViewControllerで何か処理したい時のやり方。
何もしないとUIViewControllerでは検知できない。

# 環境
Xcode ９.２
Swift 4.0.3
# AppDelegate（通知を投げる）
AppDelegateで検知したタイミングで、NotificationCenterを使って通知を投げる。

```swift:AppDelegate.swif

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    func applicationDidEnterBackground(_ application: UIApplication) {
        // アプリがバックグラウンドへ移行するタイミングを通知
        NotificationCenter.default.post(name: Notification.Name.UIApplicationDidEnterBackground, object: nil)
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // アプリがフォアグラウンドへ移行するタイミングを通知
        NotificationCenter.default.post(name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
    }
```
# ViewController（通知を受信）
ViewController側では、NotificationCenterを使って受信する通知を登録しておく。

selector: ViewController内で呼ぶメソッド名（任意の名前）
name: AppDelegateで設定した通知の名前
selectorのメソッド名の後ろに「:（コロン）」を忘れないこと

```swift:ViewController.swift
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 登録
        NotificationCenter.default.addObserver(self, selector: #selector(viewWillEnterForeground(
            notification:)), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(viewDidEnterBackground(
            notification:)), name: Notification.Name.UIApplicationDidEnterBackground, object: nil)
    }
```

# ViewController（受信した通知を処理）
selectorで設定したメソッドを用意して、行いたい処理を記述する。

```swift:ViewController.swift
    // AppDelegate -> applicationWillEnterForegroundの通知
    @objc func viewWillEnterForeground(notification: Notification) {
        print("フォアグラウンド")
    }

    // AppDelegate -> applicationDidEnterBackgroundの通知
    @objc func viewDidEnterBackground(notification: Notification) {
        print("バックグラウンド")
    }
```

参考URL：http://mzgkworks.hateblo.jp/entry/nsnotificationcenter-viewcontroller
enchant.jsのTips 小数点の誤差について

#この記事について
数年間enchant.jsを授業での実習用ライブラリとして利用しています。
授業内の情報共有は専用のWebページなどで行うこともなどもありましたが、学年をまたいでの情報共有なども考えこちらに一部転載していこうと思います。
授業用サイトはクロースドな環境で、質問者の個人名なども入っていることがあるため、こちらでは個人情報を外したうえで、まとめていきます。
また、学生の分かりやすさ優先で記述をしている部分もありますのでご容赦ください。
※後日サンプルプログラム含めて、修正や加筆をしていく予定です。
#JavaScriptでの小数点の扱い
JavaScriptでは、小数点をＩＥＥＥ７５４という規約に従って処理をしていますが、浮動小数点の精度の問題で、計算結果に誤差が発生する場合があります。
バグとはいえないところがかえって厄介かもしれません。

##疑問１：Spriteクラスから生成したオブジェクトの座標値を小数点として持てるのか？
###答え：持てます。（プログラムでは小数点第一位まで持つ場合でテスト）
http://code.9leap.net/codes/show/140319
※クマは右方向へ動いていますが非常にゆっくりです。

```js
//疑問１：Spriteクラスから生成したオブジェクトの座標値を小数点として持てるのか？

// Spriteオブジェクトのｘ座標として、小数点をもつ変数の値を渡すとどうなるか
// 実際に動きをみてみるプログラム 
// 変数に、0.2ずつ加算するが、実際の表示はどうなるのか。
//
// クマの動きはとてもゆっくりです。

// code.9leap.net default template
// based on enchant.js v0.7.1
enchant();

window.onload = function(){
    var game = new Core(320, 320);
    game.fps = 32;
    game.preload('chara1.png');
    
    // 変数
    var val = 0;
    
    game.onload = function(){
        // ラベルの表示
        var label0 = new Label('変数の値　　val    : ');
        var label1 = new Label('クマのX座標 kuma.x : ');
        label0.y = 20;
        label1.y = 40;
        game.rootScene.addChild(label0);
        game.rootScene.addChild(label1);
        
        // Spriteオブジェクト（クマ）の表示
        var kuma = new Sprite(32,32);
        kuma.image = game.assets['chara1.png'];
        kuma.y = 160;
        kuma.scale(2,2);
        game.rootScene.addChild(kuma);
        
        game.rootScene.addEventListener('enterframe',function(){
            if(game.frame % game.fps === 0)
            {
                // 変数に、0.2ずつ加算する。
                val += 0.2;
                kuma.x = val;
                // 変数の値をクマの座標値として代入する。
                label0.text = '変数の値　　val    : ' + val;
                label1.text = 'クマのX座標 kuma.x : ' + kuma.x;
            }
        });
        
    };
    game.start();
};
```


###小数点を扱いたい（計算する）ときにはどうしたらいいか
いろいろ方法はあるようですが、サンプルプログラムでは、「〇倍して整数値に戻して計算をし、最後に〇で割って戻す。」という方法を使っています。

例：小数点第一位まで持ちたい場合。
・計算→１０倍→四捨五入→１０で割る
http://code.9leap.net/codes/show/140324

```js
                // 計算
                val = (val * 10) + (0.2 * 10); // １０倍して計算する　
                val /= 10;             //  10で割る
                kuma.x = val;
                
                // 変数の値をクマの座標値として代入する。
                label0.text = '変数の値　　val    : ' + val;
                label1.text = 'クマのX座標 kuma.x : ' + kuma.x;
                
```
IE8でファイルアップロードを含むフォームをsubmitできない

## 経緯
すごくレアケースだとは思いますが、
たとえばファイルアップロードのボタンのデザインを変えようとして以下のようなHTMLを書いたとします。

```HTML
<input type="file" id="file" style="display: none">
<button type="button" onclick="$('#file').click()">
```

すると、普通にファイルを選択できて、ボタンのデザインも変えやすいです。

## 問題
しかし、IE8においてはこれが動きません。
どうやらちゃんとファイル選択欄からファイルを選択しないと、submit時に弾かれてしまうようです。

## 原因
IE8以前にのみ存在するセキュリティホールらしいですが、中途半端に対応されている感じですね。
> https://blog.tokumaru.org/2014/01/ie8html.html

## 対策
ちょこざいなことはしないで普通にinputタグを使おう

## 環境
なんの更新もしていないWindows7で、IEは以下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71557/402a9684-71be-af09-ca79-cb8942e0a6a1.png)

## 最後に
なんで2018年にIE8向けの開発をしてるんだ
[ios]CustomButtonを生成して、ViewControllerのメソッドを呼び出そうとしたら・・・

下記のようなCustomButtonを生成し、ViewControllerのメソッドをButtonに設定しようとしたところ、「unrecognized selector sent to instance」のエラー

```swift:CustomButton.swift
class startButton: UIButton {
    
    init(frame: CGRect,title: String) {
        super.init(frame: frame)
        self.setTitle(title, for: .normal)
        self.backgroundColor = UIColor.blue
        self.titleLabel?.font = UIFont.systemFont(ofSize: 26)
        self.layer.cornerRadius = 10
        self.layer.frame = frame
        self.addTarget(ViewController.self, action: #selector(ViewController.self.animateLabel), for: .touchUpInside)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}
```

```swift:CustomButton.swift
class ViewController: UIViewController{

    
    override func viewDidLoad() {
        super.viewDidLoad()
      
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    
    @objc func animateLabel(){   
        ・・・中略
}

```

なんでだろうと色々調べたが、答えがわからず・・・・
ネットの海をさまよっていたところ、delegateに関する記事を発見。
「あれ、これもしかしてデリゲート使わないといけないんじゃね？」と思い、記事を参考に下記ように実装。
無事、動きました。「delegateってtableView使うときに使うもの」とした認識してなかったので、自分の勉強不足を痛感。もっと体系的に勉強したいと思うようになってきました。

```swift:CustomButton.swift
@objc protocol startButtonDelegate{
    func animateLabel()
}

class startButton: UIButton {
    weak var delegate: startButtonDelegate?
    
    init(frame: CGRect,title: String) {
        super.init(frame: frame)
        self.setTitle(title, for: .normal)
        self.backgroundColor = UIColor.blue
        self.titleLabel?.font = UIFont.systemFont(ofSize: 26)
        self.layer.cornerRadius = 10
        self.layer.frame = frame
        self.addTarget(self, action: #selector(self.tappedButton), for: .touchUpInside)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    @objc func tappedButton(){
        self.delegate?.animateLabel()
    }
}

```

```swift:CustomButton.swift
class ViewController: UIViewController,startButtonDelegate{

    
    override func viewDidLoad() {
        super.viewDidLoad()
      
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    
    @objc func animateLabel(){   
        ・・・中略
}

```
unityテスト投稿

# 何の記事
unityでネットワーク対戦するときにハマり，
解決しなかったことの備忘
※　読む価値はないです

# エラー内容
photonをAssetStoreからインポートしたら
Assets/Photon Unity Networking/Editor/PhotonNetwork/PhotonEditor.cs(483,164): error CS0619: `UnityEditor.BuildTarget.iPhone' is obsolete: `Use iOS instead (UnityUpgradable) -> iOS'
ってエラーが出る．


#対処
else if (!InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.Android) || !InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.iPhone))
        {
            GUILayout.Label(CurrentLang.MobileExportNoteLabel);
            GUILayout.Space(15);
        }


の


else if (!InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.Android) || !InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.iPhone))

を

else if (!InternalEditorUtility.HasAdvancedLicenseOnBuildTarget(BuildTarget.Android))

にするとiphoneでは使えなくなりそうだけど，とりあえず動くようになった．
Wordpress + Contact Form 7 で Salesforce の Web-to-リード を送信する

Salesforce の Web-to-リードを使用すると、問い合わせフォームから見込み顧客の情報を直接Salesforceに取り込むことができます。

しかし、Salesforceで生成されたHTMLをそのまま使用すると、入力内容のバリデーションを行うことができません。

そこで、WordpressのContact form 7を使用して、レコードをWeb-to-リードに送信できるようにしてみました。

# Contact form 7でフォームを作成する

Salesforceで自動作成されたHTMLをもとに、フォームを作成していきます。

1点注意する必要があるのは、name属性が0からはじまる場合、Contact form 7では、自動的に先頭の0を削除してしまいます。
このため、name属性にさらに `sf-` を追加して、先頭の0が削除されないようにしておきます。この `sf-` は、後の処理で削除します。

また、`oid`はhiddenタグで追加しておきましょう。

![wp-cf7.png](https://qiita-image-store.s3.amazonaws.com/0/644/7bc590ba-77d0-7db5-40e4-1a01def61da1.png)

# functions.phpにコードを追加する

Contact form 7のアクションフックを使用して、SalesforceにWeb-to-リードを送信します。
参考 : [Contact Form 7 & Salesforce](https://daddyanalytics.com/integrating-contact-form-7-and-salesforce/)

```php:functions.php
function sf_web_to_lead($cf7)
{
    // 送信されるデータを取得します。
    $submission = WPCF7_Submission::get_instance();

    // POSTするクエリを用意します。
    $query_data = array();

    foreach ($posted_data as $name => $value) {
        // Contact form 7用のパラメータはスキップします。
        if (0 === strpos($name, '_wpcf7')) {
            continue;
        }

        // sf-からはじまるパラメータは、先頭のPrefixを削除します。
        if (0 === strpos($name, 'sf-')) {
            $name = substr($name, 3);
        }

        // 複数選択可能なフィールド（select[multiple]やcheckboxなど）の場合は、
        // hoge=value1&hoge=value2のように送信します。（Salesforceの仕様）
        if (is_array($value)) {
            foreach ($value as $option_value) {
                $query_data[] = sprintf('%s=%s', $name, $option_value);
            }

        } else {
            $query_data[] = sprintf('%s=%s', $name, $value);
        }
    }

    $query = implode('&', $query_data);

    // Init cURL session
    $ch = curl_init();

    if ('' !== curl_error($ch)) {
        // Error handling

    } else {
        $sf_url = 'https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';

        curl_setopt($ch, CURLOPT_URL, $sf_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        curl_exec($ch);
        curl_close($ch);
    }

    return $cf7;
}

add_action('wpcf7_before_send_mail', 'sf_web_to_lead');
```
二次方程式の解を求める（桁落ちと精度に気を付けながら）

この記事は[yukicoder「No.648　お　や　す　み」](https://yukicoder.me/problems/no/648)の解説です。
Python3で桁落ちと丸め誤差を避けるためのTipsです。

# 問題の概要
$i$秒目には、$i$匹の羊が柵を超えます。
柵を超えた羊の総数がちょうど$n$匹になるなら"YES"、ならないなら"NO"を出力してください。
$1\le n \le 2 \times 10^{18}$

# シンプルに足していく手法
羊が柵を超えた総数を$i=1$から足していき、総数が$n$ちょうどになるか、$n$を超えるかを調べる方法

```Python
def simple(n, N):
  """ TLEします """
  sum_sheep = 0
  for i in range(1,N+1):
    sum_sheep += i
    if sum_sheep < n:
    continue
    elif sum_sheep == n:
      print("YES")
      print(i)
      exit()
    else:
      print("NO")
      exit()

if __name__ == "__main__":
  n = int(input())
  N = 2*(10**18)
  simple(n, N)
```
  
このような脳死アルゴリズムでは、 $n$ が非常に大きな値のとき、実行時間2秒以内の時間制限にかかり失敗します（TLEします）。

# 1からnまでの和の公式を使って求める手法
$1$から$i$までの和 $= i\times(i+1)/2$ を使って求めます。

```Python
def sum_one_to_n(n, N):
  """ 1からnまでの和 = n*(n+1)/2 を求める
  veryverylarge1.txtでTLE
  """
  for i in range(1, N+1):
    sum_sheep = i*(i+1)/2
    if sum_sheep < n:
      continue
    elif sum_sheep == n:
      print("YES")
      print(i)
      exit()
    else:
      print("NO")
      exit()
      
if __name__ == "__main__":
  n = int(input())
  N = 2*(10**18)
  sum_one_to_n(n, N)
```
  
これも最初の手法とやってることは変わりません。同じくTLEします。

# 二次方程式の解を求める手法（本題）
$1$から$i$までの和が$n$になるかを調べればよいわけですから、次の式が導出できます。
$i\times(i+1)/2 = n$
これを変形すると以下になります。
$i^{2}+i-2n=0$
つまり、上記の式を満たす$i$を探せば良いことになります[（二次方程式の解を求める問題）](https://ja.wikipedia.org/wiki/%E4%BA%8C%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E3%81%AE%E5%85%AC%E5%BC%8F)。

```Python
import math

def _formula(n):
  """ 二次方程式の解を返す
  解が正になるのは問題文により自明です
  99_corner3.txtでWAになる（桁落ちが原因）
  """
  D = 1 + 8*n
  return (-1 + math.sqrt(D))/2  # ※式

def quadratic_formula(n):
  """ 二次方程式の解を求める方法
  1からnまでの和の公式を変形すると、
  i**2 + i - 2*n = 0
  このときのiを求めて、iが正の整数ならば"YES"である
  """
  i = _formula(n)
  if i != math.floor(i):
    print("NO")
    exit()
  print("YES")
  print(int(i))
  exit()

if __name__ == "__main__":
  n = int(input())
  N = 2*(10**18)
  quadratic_formula(n)
```
  
_formula()関数が二次方程式の解を求める関数です。

>if i != math.floor(i): 

の部分は、求めた解$i$が整数かどうかを判定しています。

この手法では、コーナーケース99_corner3.txtのテストで誤った解が求まります（WAになります）。原因は桁落ちです。
「二次方程式の解 桁落ち」でググればたくさんヒットしますが、**計算機を使って二次方程式の解を求めるときには分子の有理化をすれば大抵の桁落ちを避けることが出来ます** 。

# 二次方程式の解を求める（分子の有理化）
前回の手法の_formula()関数内の式を分子の有理化しました。それ以外は変えていません。

```python
import math

def _formula(n):
  """ 二次方程式の解
  桁落ちに対処するため、_formula()の※式を分子の有理化したもの
  99_corner6.txtでWAになる
  """
  D = 1 + 8*n
  return 4*n/(1+math.sqrt(D))
```

この手法でも、残念ながらコーナーケース99_corner6.txtでWAになってしまいます（それ以外はACでした）。

# 有効桁数を大きくして計算精度を上げる
原因は_formula()関数内の除算の誤差です。

```python
D = 1 + 8*n
return 4*n/(1+math.sqrt(D))
```

上記の計算結果で丸め誤差が生じています。

n = 1805000061750000527のとき、
4*n/(1+math.sqrt(D))

の計算結果は$1900000032.0$になります。整数なので、出力は"YES"です。

丸め誤差を避けるには、有効桁数を大きくして計算する必要があります。その場合はdecimalモジュールを使用します。

```python
from decimal import *
getcontext().prec = 28  # 28桁はほとんどの問題解決に十分な大きさ
Decimal(4*n)/Decimal(1+math.sqrt(D))
```

計算結果は$1900000031.999999998947368439$になります。整数でないので、出力は"NO"です。
RailsのDB接続先をbranch名に従って動的に変更する


複数のバージョンの並行開発でDBスキーマが異なる場合、DBの接続先切り替えが非常に厄介。

そこでdatabase.yml内では式展開できることを利用し、
以下のようにするとgitブランチ名に応じて接続先を変更することが可能になる。

```database.yml
default: &login
  username: root
  password: hogehoge
  adapter:  mysql
  host:     localhost
  encoding: utf8
  reconnect: true
  pool: 5

development:
  database: db_<%=
    branch = `git symbolic-ref --short HEAD`.chomp
    if branch == 'master'
      'master'
    elsif branch.start_with?('fix_')
      'fix'
    elsif branch.start_with?('pre_')
      'pre'
    else
      'development'
    end
  %>
  <<: *login
```
上記例
* master：db_master
* fix_で始まる：db_fix
* pre_で始まる：db_pre
* その他：db_development