OmniAICreator/Qiita-1.07M huggingface dataset:
こんなuser名が狙われやすい！linuxで使ってはいけないuser名5選

![download-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/74851/42636cb2-639d-5c7d-c5d1-ec4b715a75b6.jpeg)


# 存在しないユーザからのsshアクセスがあった

/var/log/secureをなんとなく見ていると、

```bash
Failed password for invalid user *** from ...
```
というログを発見。

これは、

「linux上で登録されていないユーザ *** からのアクセスがありました」ということ。

ログを漁って、攻撃者がどんな名前を用いてアクセスしてくるのか探ってみました。

# 手順

今回は、ある一日のログを漁ることにした。

## ログからinvalid userだけ取り出す

awkを使う。

```bash
cat /var/log/secure | awk -F' ' '/Invalid/{print$ 8}' | sort | uniq
```

```
0
1
1111
111111
123123
1234
12345
123456
123456789
12345qwert
1234qwer
12qwaszx
1q2w3e4r
1q2w3e4r5t
1qaz2wsx
1qaz@WSX
```

出てきた。

ついでに集計もしてみる。

```bash
cat secure | awk -F' ' '/Invalid/{print$ 8}' | awk '{count[$0]++}END{for(i in count)print count[i], i}' | sort -nr
```

```
15 minecraft
14 www
14 user1
14 steam
14 server
14 debian
```
出てきた。


# 不正アクセス者ランキング

## 5位　centos: 1023件

なお、ubuntuは63件でした。

なぜubuntuじゃなくてcentosなのか。

単純にサーバとしてよく使われているから・・・？

それともnmapでOSがわかるから・・・？

（自分のサーバにnmapしてみましたが、unixという情報しか出てきませんでした）


## 4位　guest: 1096件

ありがち。

## 3位　user: 1126件

これもありがち。


## 2位　test: 1178件

これすごくありがち。

## 1位　admin: 1300件


これからは安易に使わないようにしよう。。。

なお、6位から20位はこんな感じ。

<table>

<tr><th>順位</th><th>回数/month</th><th>ユーザ名</th></tr>
<tr><td>6</td><td>112</td><td>oracle</td></tr>
<tr><td>7</td><td>98</td><td>nagios</td></tr>
<tr><td>8</td><td>90</td><td>git</td></tr>
<tr><td>9</td><td>63</td><td>ubuntu</td></tr>
<tr><td>10</td><td>54</td><td>hadoop</td></tr>
<tr><td>11</td><td>52</td><td>pi</td></tr>
<tr><td>12</td><td>46</td><td>ftpuser</td></tr>
<tr><td>13</td><td>43</td><td>teamspeak</td></tr>
<tr><td>14</td><td>41</td><td>zabbix</td></tr>
<tr><td>15</td><td>41</td><td>vagrant</td></tr>
<tr><td>16</td><td>37</td><td>vnc</td></tr>
<tr><td>17</td><td>37</td><td>ubnt</td></tr>
<tr><td>18</td><td>35</td><td>support</td></tr>
<tr><td>19</td><td>31</td><td>ts</td></tr>
<tr><td>20</td><td>30</td><td>ts3</td></tr>
</table>

上位５位が圧倒的すぎる。



# 分類してみた

## 数字 + ランダムアルファベット系

```
0
1
1111
111111
123123
1234
12345
123456
123456789
```

## 管理者系

```
ADMIN
Admin123
Administrator
admin
admin1
admin123
admin2
administrador
administrator
```

## 有名人系
```
adam
eva
```

## 特定のクラウドサービスを狙ったもの
```
ec2-user
```

## 人名系

### 外国人
```
alberto
aleksei
alessandro
alex
alfresco
ali
alice
alicia
allison
ally
alma
```

### 日本人
```
dai
daichi
daiki
daisuke
hideaki
hideki
hideo
hikaru
hiro
hiroaki
hiroki
hiroshi
hiroyuki
```

## ソフトウェア名
```
nagios
git
hadoop
nginx
nodejs
redis
vagrant
```


### デプロイ用ユーザを狙ったと思われる系
```
deploy1
deploy123
deploy1234
deploy12345
deploy123456
deploy2
deploy3
deploy4
deploy5
```


### 明らかに悪意がある系

```
exploit
```


### 番外編
```
PPAP
```
これで日本人だと特定できたかなと思ったのもつかの間、

これ世界的に流行ったやつだからどこからアクセスされてもおかしくねえぞ。



# まとめ

## user名で避けるべき名前

* admin
* test
* user
* guest
* centos

よく使われているからこそ、狙われる。


## 感想

割と日本人の名前が多い。

どこまで考えて攻撃しているのかはしらないけど、

安易に自分の名前をユーザ名にするのは良くないと感じた。

せめて記号や数値と織り交ぜたい。


また、ソフトウェア名も良くないということがわかった。
PWAでインストールを試してみる

#はじめに

PWAとは何ぞや？というのは「[はじめてのプログレッシブ ウェブアプリ](https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/?hl=ja)」などを見て頂くとして、この中でインストールについて試してみた。
インストールバナーについては「[ウェブアプリのインストール バナー](https://developers.google.com/web/fundamentals/app-install-banners/?hl=ja)」など。

#やってみる
注意点として、一度インストールを保留またはキャンセルすると、ページを更新してもバナーは表示されなくなります。
もしも再インストールしたければ「[ウェブアプリのインストール バナー：アプリのインストール バナーのテスト](https://developers.google.com/web/fundamentals/app-install-banners/?hl=ja#test)」の手順を行う必要があります。

インストール方法は、以下のページの「PWA（インストール）」リンクを開くとインストールバナーが表示されるはず。
（AndroidのChromeのみ？）

[確認用サイト](https://atatago.azurewebsites.net/)

#やりかた
とりあえずmanifest.jsonとserviceWorker.jsを作成してサイトルートに設置。

```json:manifest.json
{
  "name"              : "パンジャン",
  "short_name"        : "パンじゃん",
  "description"       : "パンジャンじゃん",
  "start_url"         : "/",
  "display"           : "standalone",
  "orientation"       : "any",
  "background_color"  : "#00FF00",
  "theme_color"       : "#FF0000",
  "icons": [
    {
      "src"           : "/icon.png",
      "sizes"         : "512x512",
      "type"          : "image/png"
    }
  ]
}
```



```javascript:serviceWorker.js
self.addEventListener('fetch', function(event) {
});
```

今回はAzureに設置してみるのでjsonのMIMEを追加する。

```xml:web.config
<configuration>
	<system.webServer>
		<staticContent>
			<mimeMap fileExtension=".json" mimeType="application/json" />
		</staticContent>
	</system.webServer>
</configuration>
```

あとはサイトトップのデフォルトページにmanifestへのリンクと少しのJavascriptを記述すればおｋ。

```html:index.html
<html>
	<head>
		<title>いろいろテスト</title>
		<link rel="shortcut icon" href="/icon.ico">
		<link rel="manifest" href="/manifest.json">
		<style type="text/css">
			<!-- body {background-color: #ffffff; -->
		</style>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	</head>
	
	<body>
		<a href="/page01.html">ページ01</a><br /><br />
		<a href="/page02.html">ページ02</a><br /><br />
		<a href="https://www.google.co.jp">ぐぐる</a>

		<script>
			window.addEventListener('load', function() {
			if ('serviceWorker' in navigator) {
				navigator.serviceWorker.register("/serviceWorker.js")
					.then(function(registration) {
						console.log("serviceWorker registed.");
					}).catch(function(error) {
						console.warn("serviceWorker error.", error);
					});
				}
			});
		</script>	</body>
</html>
```

#所感

* ちょっとした変更で既存サイトにも適用出来てお手軽。
* 表示するタイミングを考えないと概ねキャンセルされそう。
* キャンセルされた際のリカバリ方法が欲しい。
* サイトのトップページに設置しないと反応しないっぽい？インスペクタから強制インストールはいけた。
* "display" : "standalone" だと戻るボタンが表示されない（Androidなら戻るボタンあるからいいけど戻るリンクとか考えた方が良い気がする）
* 別ドメインはアプリ内ブラウザっぽく表示される

といったところ
iOSは現在開発中でそのうち出来るようになるらしいので期待
JNativeHookライブラリを使ってJavaでグローバルフックしてみる


# 筆者環境
Windows10 Home / JDK1.8

# Mavenリポジトリ
```xml
<dependency>
    <groupId>com.1stleg</groupId>
    <artifactId>jnativehook</artifactId>
    <version>2.1.0</version>
</dependency>
```

# とりあえず試してみる（キーをクリック）
```Java
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

public class Example implements NativeKeyListener {
    public static void main(String[] args) {
        //フックされていなかったら
        if (!GlobalScreen.isNativeHookRegistered()) {
            try {
                //フックを登録
                GlobalScreen.registerNativeHook();
            } catch (NativeHookException e) {
                e.printStackTrace();
                System.exit(-1);
            }
        }
        //キー・リスナを登録
        GlobalScreen.addNativeKeyListener(new Example());
    }

    //キーを押したとき
    @Override
    public void nativeKeyPressed(NativeKeyEvent e) {
        System.out.println(e.paramString());
    }
    
    //キーを離したとき
    @Override
    public void nativeKeyReleased(NativeKeyEvent e) {
        System.out.println(e.paramString());
    }

    //キーをタイプしたとき
    @Override
    public void nativeKeyTyped(NativeKeyEvent e) {
        System.out.println(e.paramString());
    }
}
```

このコードでは、このコードを実行しているスレッドだけではなく、すべての実行されているスレッドに対してキー・リスナを設置することができます。

ChromeやMinecraftなど、どのソフト上でキーを押してもイベントが発生します。

また、キーイベントの各定数はjava.awt.event.KeyListenerの各定数と同じです。

# 他のリスナは？
```Java
//マウス・リスナ
GlobalScreen.addNativeMouseListener(NativeMouseListener);

//マウスモーション・リスナ
GlobalScreen.addNativeMouseMotionListener(NativeMouseMotionListener);

//マウスホイール・リスナ
GlobalScreen.addNativeMouseWheelListener(NativeMouseWheelListener);
```
などとマウス関連のリスナが用意されています。


# ログを消す
デフォルトだと相当な量のログが出力されるので必要がなければ
LogManager.getLogManager().reset();
をmainメソッド辺りにでも追加しておきましょう。

# イベントを文字表現にする
paramString()メソッドが用意されているのでそれを使いましょう。
楕円に外接する多角形の描画シミュレーション

[前回](https://qiita.com/kashiraWork/items/e8bdfdd423d920878edc)、楕円の外接多角形の描き方を書きましたが、今回はmatplotlibでシミュレーションｆしてみようと思います。


比較のために、楕円の外接多角形を含めて合計4つの図形を描画しました。

<ul>
<li>真円</li>
<li>真円を外接する多角形</li>
<li>長径が真円の半径と同値の楕円</li>
<li>楕円を外接する多角形</li>
</ul>

結果は、以下のとおりになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213435/7660ea10-1cc7-6e47-885e-7fdb2cc39c86.png)


楕円を外接する多角形が描けていることがわかります。
ちなみに、ソースコードは、こんな感じです。

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# numpyをインポート
import math
import matplotlib.pyplot as plt
import pylab
inRadius = 5.0
radius_a = 5.0
radius_b = 3.0

#
# 真円の描画
#
def draw_circle():
    # 中心(0.2,0.2)で半径0.2の円を描画
    list = plt.Circle((0.0, 0.0), inRadius, fc="#f0f0f0", label = "TrueCircle")
    plt.gca().add_patch(list)
    plt.axis('scaled')

#
# 真円外接多角形の描画
#
def draw_out_circle():
    outSeg = 10
    deg = math.radians(360 / outSeg)
    angle = 0
    x = []
    y = []
    outRadius = inRadius / math.cos(deg / 2)
    for i in range(outSeg + 1):
        angle += deg
        x.append(outRadius*math.cos(angle))
        y.append(outRadius*math.sin(angle))

    plt.plot(x, y, label = "OutTrueCircle")

#
# 楕円の描画
#
def draw_ellipse():
    outSeg = 360
    deg = math.radians(360 / outSeg)
    angle = 0
    x = []
    y = []
    outRadius = radius_a / math.cos(deg / 2)
    for i in range(outSeg + 1):
        angle += deg
        x.append(outRadius*math.cos(angle))
        y.append(outRadius*math.sin(angle) * (radius_b / radius_a))

    plt.plot(x, y, label = "Ellipse")

#
# 楕円外接多角形の描画
#
def draw_out_ellipse():
    outSeg = 10
    deg = math.radians(360 / outSeg)
    angle = 0
    x = []
    y = []
    outRadius = radius_a / math.cos(deg / 2)
    for i in range(outSeg + 1):
        angle += deg
        x.append(outRadius*math.cos(angle))
        y.append(outRadius*math.sin(angle) * (radius_b / radius_a))

    plt.plot(x, y, label = "OutEllipse")


if __name__ == '__main__':
    draw_circle()
    draw_out_circle()
    draw_ellipse()
    draw_out_ellipse()
    plt.legend()  # 凡例を表示
    pylab.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
    pylab.subplots_adjust(right=0.7)
    plt.title("Graph Title")
    plt.xlabel("X-axis")
    plt.ylabel("Y-axis")
    plt.show()

```
画像処理プログラミングの基礎（導入編）

# はじめに 

  私は20年近くにわたって、画像処理関連の仕事に携わってきました。
　大きくは２つの産業分野の画像処理です。
　１．**FA分野の画像処理システム**（生産ラインで使われる画像処理を使った自動製品検査システム）
　２．**プリンターの画像処理システム**（銀塩、インクジェット、レーザー）
  画像処理技術者としてこの両者を経験出来たのは大変運が良かったと思います。

そこで、これまでの仕事から得た知識やノウハウをよりたくさんの方に知って頂くために
この場をお借りしてまとめてみようと思い立ちました。
よろしくお願いします。

#  そもそも画像とは一体何でしょうか？

Wikipediaによれば
・事象を視覚的に媒体に定着させたもので、そこから発展した文字は含まない
とあります。

一般にデジタル画像処理で扱う画像は、小さな「画素」の集まりで構成された2次元状のデータです。
<img width="914" alt="SnapCrab_NoName_2018-2-11_20-5-5_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/106761/226a6dec-8e60-b729-8962-b7a1d8b65ca3.png">

#  これまでの経験から画像処理に対して**個人的に**感じること

画像処理という分野は様々な理論、考え方が集まっているな、と感じます。
<img width="694" alt="SnapCrab_NoName_2018-2-11_20-11-33_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/106761/e4aa4d85-d1a6-31c1-6f89-c80f2b424b7e.png">

これについては、これから折に触れて解説していきたいと思います。
ここでは、いろいろな理論や技術が必要なんだな、と思って頂けるだけでOKです。

ひとまず、今回はここまでとします。
次回から画像処理の中身の部分について何回かに分けて解説していきます。

よろしくお願いします！
エンジニアが学習で使うサイト&ブログなど

ソフトウェアのエンジニアです。自分の能力を少しでも高めるために、様々な技術を学ぶ日々です。
ほかのエンジニアの方から勉強で使ったサイトを教えていただく機会が多いのですが、すぐ忘れてしまうため、記録として残しておこうと思います。
他のエンジニアの方が普段どのようなサイトを見ているのか興味あるため、オススメのサイトや書籍や掲載資料(SlideShare等)がありましたらコメントください。
**※随時更新予定です。**

# 総合的な学習サイト
- [Paiza Learning](https://paiza.jp/works)
- [WPJ](https://www.webprofessional.jp)
- [Progate](https://prog-8.com)
- [MOOC] (http://mooc.org)
- [Lynda](https://www.lynda.com)
- [Qiita](https://qiita.com/trend)

# バージョン管理
- [GitHub](https://github.com)
- [Gitコマンドリファレンス](https://git-scm.com/docs)

# SaaS
- [Heroku](https://id.heroku.com/login)

# Thymeleaf
- [Thymeleaf](http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html)

# JavaScript
- [MDN Web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript)
- [jsSTUDIO](http://js.studio-kingdom.com)

# JQuery
- [JQuery英語リファレンス](https://jquery.com)
- [JQuery日本語リファレンス](http://semooh.jp/jquery/)

# Java
- [Java SE8 API仕様(日本語)](https://docs.oracle.com/javase/jp/8/docs/api/)
- [Java SE8 API仕様(英語)](https://docs.oracle.com/javase/8/docs/api/)
- [TECGSCORE](http://www.techscore.com)
- [新人研修では教えてくれないJava](https://speakerdeck.com/masatoshitada/wan-quan-ban-xin-ren-yan-xiu-yaben-dehajiao-etekurenaijava)

# Google Apps Script
- [API](https://developers.google.com/apps-script/)

# ネットワーク関連
- [3Minutes Networking](http://www5e.biglobe.ne.jp/aji/3min/index.html)
- [ネスペイージス](http://www.infraexpert.com/info/netspecial1.html)

# ブロックチェーン・仮想通貨
- 

# DeepLearning
- 

# Blog
- [Mitsuyuki.Shiibaさんのブログ](http://bufferings.hatenablog.com)
- [カサレアル多田さんのブログ](http://masatoshitada.hatenadiary.jp)
- [BLOG.IK.AM](https://blog.ik.am)
- [サイボウズエンジニアブログ](http://blog.cybozu.io)
AnsibleでJenkinsのviewを管理するモジュールを作ってみたよ

Jenkins離れが叫ばれて久しいですが
皆さんいかがお過ごしでしょうか。
私もJenkins代替ツールをずっと探しているのですが
ジョブを無数に作りまくるという性質上
中々クラウドスケジューラに移行出来ない日々を送っています。

ついにこの間管理している1ジェンキンスサーバが1000タスクを越えてしまいました。

# viewの管理

さて、そんなこんなでJenkinsを使い倒している訳ですが
基本的にはAnsibleで作業を完結したいと思っています。
ジョブの管理はこの間記事に書いたのですが
ビューの管理はAnsible2.4時点では出来ません。
というか、JenkinsではJenkinsの操作は下の3つしかありません。

http://docs.ansible.com/ansible/2.4/list_of_all_modules.html

```
jenkins_job - Manage jenkins jobs
jenkins_plugin - Add or remove Jenkins plugin
jenkins_script - Executes a groovy script in the jenkins instance
```

手で毎回作業するのも辛かったので、モジュールを作ってみました。

# Ansible-Jenkins-view

https://github.com/cahlchang/ansible-jenkins-view

ソースコードはこれだけですね
https://github.com/cahlchang/ansible-jenkins-view/blob/master/library/jenkins_view.py

## しくみ

ソースコードも短いので読んで頂ければ簡単に追えるのですが
単なるPythonのJenkinsライブラリのラッパーになっています。
ただこのライブラリもXMLを頑張るタイプのライブラリなので
ラッパー挟むだけでも使い勝手よくなりますね。

## 使い方

サンプル（Github上のREADME.md内と同じものです）

```yaml:sample_task
- hosts: jenkins_host
  tasks:
    - set_fact:
        list_view_example:
          - name: example_view
            list_job:
              - exmpla_job_a
              - exmpla_job_b
              - exmpla_job_c
              - exmpla_job_d
        list_view_regex_example:
          - name: example_regexp_view
            list_job:
              - exmpla_job_a
            ptn_regex: "exmpla_regex_job.*"

    - name: "Create ordinary view"
      jenkins_view:
        name: "{{ item.name }}"
        list_job: "{{ item.list_job | join(',') }}"
      with_items:
        - "{{ list_view_example }}"

    - name: "Create a job with regular expressions"
      jenkins_view:
        name: "{{ item.name }}"
        list_job: "{{ item.list_job | join(',') }}"
        regex: "{{ item.ptn_regex }}"
      with_items:
        - "{{ list_view_regex_example }}"

```

シンプルにJenkinsの情報とジョブ名
もしくは正規表現を入れます。
サンプルではset_factで定義してますが
直接記載しても問題ありません。

list_viewで指定するジョブは設定するジョブをカンマで繋げてください。
ここ、どうしようかと迷って色々モジュールを見てみたんですが
Route53のvalueがカンマ区切りで指定するようなので真似してみました。
…だったはずなのですが、今みたら普通にリスト指定も出来るのか。

## 冪等性とか

一応まじめに対応してます。
細かい所はソースに書いてる通りなのですが
正規表現とかも含め一通り使えるものにはなってるんじゃないかなぁと。

## 課題点
正規表現入りのビューパラメーターを1回作ってから消した時
「 」という空スペース1つだけの
正規表現のビューパラメーターが入ってしまいます。
jenkins-pythonライブラリには
正規表現のビューパラメーターを設定出来るのですが
消すことは出来ないみたいで。

正規表現のパラメーターを含まないXMLを設定しても
「 」という空スペース1つだけのパラメーターが入ってしまいます。
代替の場面において運用には困らないと思うのですが…。

# まとめ

Ansibleモジュールは作ってみると結構簡単に出来るなーって印象です。
コマンドラインのAPIやライブラリが用意されてる物なら
結構簡単にできちゃいますね。
これからもどんどんモジュールを作って運用を楽にしていきたいですね。
ConoHa vps 初期設定(ubuntu16.01)

# ConoHa VPSを初期設定する

SSHでrootでログイン

##hostnameを変更する

`hostnamectl set-hostname xxxx`

/etc/hosts
の127.0.1.1も変更する

##ユーザの追加

rootでログイン可能となっているので

ユーザを追加

`adduser xxxx`

sudo グループに追加

`gpasswd -a xxxx sudo`


##rootログイン禁止

vi /etc/ssh/sshd_config

```:/etc/ssh/sshd_config 
PermitRootLogin yes 
=>
PermitRootLogin no
```

sshdの再起動

`service ssh restart`

SSHをもう一つ立ち上げて、作成したユーザでログインしてみる

##ufwの設定など

アップグレードする

`sudo apt-get upgrade`

firewallを有効
`sudo ufw enable`

ステータスの確認
`sudo ufw status verbose`

デフォルトを遮断
`sudo ufw default deny`

192.168.1.1からのSSHを許可
`sudo ufw allow from 192.168.1.1 to any port 22`

80版ポートを開放
`sudo ufw allow 80`

ステータスを確認
`sudo ufw status numbered`

削除
`sudo ufw delete 番号`
ソフトウェアテストを学び始める

<!-- TOC -->

- [0. 始めに](#0-始めに)
- [1. ソフトウェアテストとは](#1-ソフトウェアテストとは)
    - [ソフトウェアはシステムの一部または全体を構成するもの](#ソフトウェアはシステムの一部または全体を構成するもの)
    - [信頼度成長曲線（ゴンベルツ曲線）の横軸](#信頼度成長曲線ゴンベルツ曲線の横軸)
    - [7つの一般原則](#7つの一般原則)
        - [初期テスト](#初期テスト)
        - [殺虫剤のパラドックス](#殺虫剤のパラドックス)
    - [システム・ソフトウェア品質](#システム・ソフトウェア品質)
    - [基準を作る](#基準を作る)
    - [PDCAは常に回す](#pdcaは常に回す)
- [2. 品質計画](#2-品質計画)
    - [利用時の品質の特性](#利用時の品質の特性)
    - [外部・内部品質の特性](#外部・内部品質の特性)
    - [品質計画の立て方](#品質計画の立て方)
- [3. 非機能要件のテスト](#3-非機能要件のテスト)
    - [非機能要求グレード](#非機能要求グレード)

<!-- /TOC -->

## 0. 始めに

先週、とある研修に行かせてもらい、ソフトウェアテストに関する基本を研修してきたので、その内容からの抜粋と、プラスして自分が調べた内容をメモとして残すことにする。

## 1. ソフトウェアテストとは

### ソフトウェアはシステムの一部または全体を構成するもの

テストは、ソフトウェア自体ではなく、システムに要求される事項を満たしているかを証明するために実施する活動。

「システムに要求される事項」とは、

+ お客様の明示的な要求
+ 本来備えておくべき暗黙の特性
+ 供給者側が必要とすること

このうち、1番目は**機能要件**、それ以外は**非機能要件**と考えることが出来る。

### 信頼度成長曲線（ゴンベルツ曲線）の横軸

信頼度成長曲線を適切に扱うためには、横軸を見直すべき。大概は「テスト時間」を横軸に設定しているが、実際は**「テスト項目消化件数（テストケース数）」**を設定した方が適切である。

このように設定しないと、理想的な曲線（最初にバグが多く見つかり次第に収束する）にはならず、時間が経つと二次関数的にバグが増える曲線になってしまいがちになる。

### 7つの一般原則

1. テストは欠陥があることしか示せない
2. 全数テストは不可能
3. 初期テスト
3. 欠陥の偏在
4. 殺虫剤のパラドックス
5. テストは条件次第
6. 「バグゼロ」の落とし穴

このうちから一部抜粋する。

#### 初期テスト

テストケースを用いたテストは動作するソフトウェアが既に存在することを前提としているが、テスト活動自体は要件定義や基本設計を行っている段階から適用することが可能。欠陥を早期発見することの大切さが主張されている。レビューをこまめに行うことが最も近道だが、初期段階ではなかなかそうならないという問題にも対処しなければならない。

#### 殺虫剤のパラドックス

同じテストを繰り返すと、最終的にそのテストでは新しい欠陥を見付けられなくなる。このため、テストケースを定期的に見直して、改定する必要がある。

### システム・ソフトウェア品質

単に欠陥がなければ品質のよいシステム・ソフトウェアであるというわけではなく、対象とするソフトウェアの**特性**を実現できているかが重要となる。

**クリティカルな特性**はシステムによって異なる。品質保証は、**クリティカルな特性**を実現できていることで達成される。

### 基準を作る

**ISO/IEC 9126**を用いて、品質モデルの基準を作成する（1つ1つの項目に当てはめていく形でOK）。ここで作成した基準に対して、現状がどれくらい離れているか、何を達成できていないか、という判断を行う。我武者羅に品質を上げればよい、というものではない。

### PDCAは常に回す

PDCAサイクルは常に回すことを心掛ける。要件定義が終わったら1周、実装が終わったら1周、という決まりはない。業務に追われているとついつい振り返りや反省を踏まえた取り組みが蔑ろにされてしまう…

## 2. 品質計画

ISO9126はソフトウェアの品質を3つに分類する。

### 利用時の品質の特性

- 有効性
- 生産性
- 安全性
- 満足性

### 外部・内部品質の特性

- 機能性
- 信頼性
- 使用性
- 効率性
- 保守性
- 可搬性

品質特性には、他に「セキュリティ」、「環境・エコロジー」が含まれる。

非機能要件はテスト機能要件に比べ、テストを入念に実行しづらい。

### 品質計画の立て方

+ 目的に合った目標を定め、計画を立てる
+ 品質計画≠監査計画
+ 文化や習慣の差異（非対称性？）をなくすため、用語を定義する
+ 計画の根拠を明らかにする

## 3. 非機能要件のテスト

### 非機能要求グレード

情報処理推進機構（IPA）が公開している。

[https://www.ipa.go.jp/sec/softwareengineering/reports/20100416.html](https://www.ipa.go.jp/sec/softwareengineering/reports/20100416.html)

さらに、セキュリティのような未来の予測がつかない脅威などに関するテストは、別の指標が必要になる。

例：[https://www.ipa.go.jp/security/vuln/websecurity.html](https://www.ipa.go.jp/security/vuln/websecurity.html)

こういった資料の各項目を埋めていく形で計画を立てることが出来る。
Ubuntu16.04 desktop版でOpenShift(MiniShift)を導入した時の備忘録

Ubuntu 16.04 desktop版にOpenShift Originを動作させるためにMiniShiftをインストールする機会があったのでその備忘録です。

## 公式ドキュメント
Installing Minishift
https://docs.openshift.org/latest/minishift/getting-started/installing.html

## 前提
- OS: Ubuntu 16.04 desktop
- ユーザ: developer 
- dockerがインストールされていること
- 利用するOSにVT-xやAMD-vなどの仮想化支援機能が有効になっていること
- VMwareWorkstationの場合は、「Intel VT-x/EPTまたはAMD-V/RVIを仮想化(V)」を有効にする。
<img width="791" alt="スクリーンショット 2018-02-11 18.26.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/209170/0815fae6-f1cc-b042-f690-dd58570aa608.png">

## インストール手順
libvirtとqemu-kvmをインストール
```$ sudo apt install libvirt-bin qemu-kvm
```
libvirtdグループに自分自身を追加
```$ sudo usermod -a -G libvirtd developer
```
現在のセッションを更新してグループを適用
```$ newgrp libvirtd
```
KVMドライバのバイナリインストール
```$ sudo curl -L https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.7.0/docker-machine-driver-kvm -o /usr/local/bin/docker-machine-driver-kvm
```
KVMドライバのバイナリに実行権限を付与
```$ sudo chmod +x /usr/local/bin/docker-machine-driver-kvm
```
minishiftのバイナリをminishiftのリリースページより取得
```$ sudo curl -L https://github.com/minishift/minishift/releases/download/v1.12.0/minishift-1.12.0-linux-amd64.tgz -o minishift-1.12.0-linux-amd64.tgz
```
minishiftのバイナリを/usr/bin(パスの通ったディレクト)に解凍
```$ sudo tar xf minishift-1.12.0-linux-amd64.tgz -C /usr/bin --strip=1 minishift-1.12.0-linux-amd64/minishift
```
minishiftの起動
```$ minishift start --openshift-version v3.7.1 --iso-url centos --cpus 2 --memory 2GB --disk-size 20GB
```openshiftのバージョン:v3.7.1、CPU:2コア、Memory:2GB、Disk容量:20GBで、isoをcentosで指定

起動するとOpenShiftのログインメッセージが出力されます。
```
The server is accessible via web console at:
    https://192.168.42.78:8443

You are logged in as:
    User:     developer
    Password: <any value>

To login as administrator:
    oc login -u system:admin
```

環境変数設定
```eval $(minishift oc-env)  # OpenShiftのクライアント(ocコマンド)
eval $(minishift docker-env) # MiniShiftのVM内のDockerとの接続
source <(oc completion bash) # コマンドとリソースのシェル補完
```

OpenShift CLIログイン
```
$ oc login -u developer
Logged into "https://192.168.42.78:8443" as "developer" using existing credentials.

You have one project on this server: "myproject"

Using project "myproject".
```

これでOpenShiftが使えるようになりました。
比較的簡単にOpenShiftが起動するので、お試しでインストールしてみたらいかがでしょうか？
pythonチートシート

#windowsで仮想環境をつくる

目的のフォルダに移動するコマンドたち

lsに当たるもの

```
dir
```
cd に当たるもの

```
cd
```

所定のフォルダに入ったらactivateを起動する

```
hoge\Scripts\activate 
```

deactivateで仮想環境をシュル用

```
(hoge) # hoge\Scripts\deactivate 
```

#pandsでエクセル操作

## エクエルの読み出し

```python
Xlsx = "hoge.xlsx"
Xlsx_SheetName = "hogehoge"
Xlsx_Data = pd.read_excel(Xlsx, sheet_name=Xlsx_SheetName)
```

## エクセル書き出し
```python
writer = pd.ExcelWriter("Result.xlsx")
Xlsx_Data.to_excel(writer, sheet_name="hoge1")
writer.save()
```

## for文で処理するとき
```python
for Index,Row in Xlsx_Data.iterrows():
・
・一行づつ処理する部分を書く
・
```
## pandasに一列加える
hoge列を加える

```python
Xlsx_Data["hoge"] = pd.DataFrame(hoge_list)
```


#文字列操作

##Emailからドメインだけを抜き出す
```python
import re
pattern = "(.*)@(.*)"
Domain = re.search(pattern,Email_String).group(2)
#re.search(pattern,Email_String).group(1)だと@前が取り出せる
```
UnityでTextに座標を表示させる（初心者&自分向け）

名前の通りTextに座標を表示させようと思います。

##前提
1.[Hierarchy]Create->UI->Textを設置する
2.[Project]Create->C#Projectでスクリプトを作る
3.２で作ったスクリプトを１で作ったTextにアタッチする。

##前提２で作ったスクリプトに書くコード
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//ここ注意

public class （スクリプト名） : MonoBehaviour {
	//変数設定
	float m_X;
	float m_Y;
	float m_Z;
	//知りたい座標のGaeObjectの設定
	public GameObject target;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
		//それぞれに座標を挿入
		m_X = target.transform.position.x;
		m_Y = target.transform.position.y;
		m_Z = target.transform.position.z;

		//テキストに表示
		this.GetComponent<Text> ().text = "X座標は" + m_X.ToString() + "\nY座標は" + m_Y.ToString() + "\nZ座標は" + m_Z.ToString();
		
	}
}
```
##コピペした後にすること
1.``（スクリプト名）``のところにScriptの名前を入れる
2.Inspectorの``target``のところに場所を知りたいGameObjectをドラッグ＆ドロップする
3.後は適当にTextの大きさや色、場所などを変更する。

##解説

まず
```using UnityEngine.UI```
これを追加しないとUIを変更できません。

次にfloat型で変数設定
```m_```が変数の頭についているのはわかりやすいように
ちなみに、変数名の頭が```_```や```m_```、```k```で始まるとInspecterでは取り除いてくれるらしい。
[一様、Unityスクリプトリファレンス（特に何も書いてない）](https://docs.unity3d.com/ja/current/ScriptReference/ObjectNames.NicifyVariableName.html)

次に```target.transform.position.x```は```target```のX座標の場所だけを取得する。
**結構便利だから覚えたといたほうがいい**
ちなみに他の```y```とか```z```とかでも同じ。


最後に```this.GetComponent<Text> ().text```を```=```でつないだ先に書く内容を入れる。

---
日本語やそのまま表したい文字は```"```で囲み（※1）
変数を表示させるためには```（変数名）.ToString()```と書く（※2）
また、両方とも描きたい場合は```+```を間に挟む（※3）
Textを改行したくなったら\nを入れる(※4）

---
※1　*（例：```"Qiita始めました"```だと、そのまま『Qiita始めました』と出る）*
※2 *（変数名をSpeedとした場合の例：
　　```Speed.ToString()```と、なり```Speed```の中身（数字だったら数字文字列だったら文字列が表示される））*
※3　 *（変数名をSpeedとし 、Speedの中身が10だった場合の例：
　　　```"現在の速さは" + Speed.ToString() + "です。"```と書き、『現在の速さは10です。』と表示される。）*
※4　*（例：```"Qiita\n始めました"```と書き、
　　　Qiita
　　　始めました
　　　と表示されます。）
　　　ちなみに、```"```の中に書かないとエラーが出るので注意です。
　　　又、Macで『\』を打つにはoption+¥で打てます*

##最後に
結構がっつり解説ましたがどうでしょうか？
そして初心者が結構頑張ってほぼ自分向けに書いた初Qiita投稿ですがどうでしょうか？
~~正直言ってInspectorで見れるから使わない、だから便利も何もない~~
python リスト

##リストに代入する

```py3:python_lesson1.py
l =['c', 'h', 'a', 'n', 'e', 'l']
print(l)
>>['c', 'h', 'a', 'n', 'e', 'l']

#リストの一部の文字を変更する
print(l[0])
>>c
l[0] = 'C'
print(l[0])
>>C

#リストの複数の文字を一括で変更する
print(l[2:5])
>>['a', 'n', 'e']
l[2:5] = ['A','N','E']
print(l)
>>['C', 'h', 'A', 'N', 'E', 'l']

#リストの複数の文字列を削除する
l[2:5] = []
print(l)
>>['C', 'h', 'l']
```

##リストに文字列を追加

```py3:python_lesson2.py
l = [1,2,3,4,5,6,7]

#文字列を後ろに追加する
print(l.append(100))
>>[1, 2, 3, 4, 5, 6, 7, 100]

#文字列を挿入する
#0番目に0を挿入する
print(l.insert(0,0))
>>[0, 1, 2, 3, 4, 5, 6, 7, 100]
```

##リストに文字列を削除
```py3:python_lesson3.py
l = [0, 1, 2, 3, 4, 5, 6, 7, 100]

#一番後ろの値を取り出したい時
print(l.pop())
>>100
print(l)
>>[0, 1, 2, 3, 4, 5, 6, 7]

#2番目の値を取り出したい時
print(l.pop(2))
>>2
print(l)
>>[0, 1, 3, 4, 5, 6, 7]

#delで一部を削除する
print(del l[0])
>>[1, 3, 4, 5, 6, 7]

#removeで削除する
print(l.remove(3))
>>[1, 4, 5, 6, 7]

#delを使って削除すると、lの存在自体がなくなる
del l
```

##リストの結合
```py3:python_lesson4.py
a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]

#Xに代入して結合させる
x = a + b
print(x)
>>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#aにbを付け足して結合させる
a += b
print(a)
>>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#extendを使ってaにbを付け足して結合させる
a.extend(b)
print(a)
>>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

###Read Me
このメモについて
Udemyのアメリカシリコンバレーの世界IT産業トップのIT企業で働くソフトウェアエンジニアが、Python3の入門、応用、コードスタイルを伝授してくれる、酒井潤さんのコースからの学びメモです。
※pycharmを活用して行ってます。
UnityでAndroidのToast風UIを実装する

#概要
UnityアプリでAndroidのToastのようなUIを実装するコードを見つけたので、紹介させて頂きます。

```c#:ToastUtil.cs
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class ToastUtil : MonoBehaviour
{
    public static Color imgColor = new Color(1.0f, 0.5f, 0.5f, 0.9f);
    public static Color textColor = new Color(0.1f, 0.1f, 0.1f, 0.9f);
    public static Vector2 startPos = new Vector2(0, -500); // 開始場所
    public static Vector2 endPos = new Vector2(0, -300); // 終了場所
    public static int fontSize = 60;
    public static int moveFrame = 30; // 浮き上がりの時間(フレーム)
    public static int waitFrame = 30; // 浮き上がり後の時間(フレーム)
    public static int pad = 100; // padding
    public static Sprite imgSprite;
    public static Font textFont;

    public static void Toast<T>(MonoBehaviour mb, T m)
    {
        string msg = m.ToString();
        GameObject g = new GameObject("ToastCanbas");
        Canvas canvas = g.AddComponent<Canvas>();
        canvas.renderMode = RenderMode.ScreenSpaceOverlay;
        canvas.sortingOrder = 100; //最前
        g.AddComponent<CanvasScaler>();
        g.AddComponent<GraphicRaycaster>();

        GameObject g2 = new GameObject("Image");
        g2.transform.parent = g.transform;
        Image im = g2.AddComponent<Image>();
        if (imgSprite) im.sprite = imgSprite;
        im.color = imgColor;
        g2.GetComponent<RectTransform>().anchoredPosition = startPos;

        GameObject g3 = new GameObject("Text");
        g3.transform.parent = g2.transform;
        Text t = g3.AddComponent<Text>();
        g3.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);

        t.alignment = TextAnchor.MiddleCenter;
        if (textFont)
            t.font = textFont;
        else
            t.font = (Font)Resources.GetBuiltinResource(typeof(Font), "Arial.ttf");
        t.fontSize = fontSize;
        t.text = msg;
        t.enabled = true;
        t.color = textColor;

        g3.GetComponent<RectTransform>().sizeDelta = new Vector2(t.preferredWidth, t.preferredHeight);
        g3.GetComponent<RectTransform>().sizeDelta = new Vector2(t.preferredWidth, t.preferredHeight);//2回必要
        g2.GetComponent<RectTransform>().sizeDelta = new Vector2(t.preferredWidth + pad, t.preferredHeight + pad);

        mb.StartCoroutine(
          DoToast(
            g2.GetComponent<RectTransform>(), (endPos - startPos) * (1f / moveFrame), g
          )
        );
    }
    static IEnumerator DoToast(RectTransform rec, Vector2 dif, GameObject g)
    {
        for (var i = 1; i <= moveFrame; i++) { rec.anchoredPosition += dif; yield return null; }
        for (var i = 1; i <= waitFrame; i++) yield return null;
        Destroy(g);
    }
}
```

##使用例
```c#
ToastUtil.Toast(this, "Toast message.");
```

#参考
[【Unity】スマートフォン用のトースト機能を作ってみる](http://blog.narumium.net/2017/04/27/%E3%80%90unity%E3%80%91%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E7%94%A8%E3%81%AE%E3%83%88%E3%83%BC%E3%82%B9%E3%83%88%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6/)
Cordovaのチュートリアルをやってみる 第二回

# 使用したもの(環境)
 1. cordova
 1. visualStudioCode
 1. windows10
 1. Android
 

---

# チュートリアルを訳しながらやってみる
チュートリアルのページは下記。

[Module 2: Building a Cordova Project](http://ccoenraets.github.io/cordova-tutorial/build-cordova-project.html)

[Module 3: Setting Up the Workshop Files](http://ccoenraets.github.io/cordova-tutorial/setup-files.html)

前回のチュートリアル。

[Cordovaのチュートリアルをやってみる 第一回](https://qiita.com/tokky_se/items/dabc97d23f444f8d25e5)

環境構築については別途まとめてあるので下記参照。

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)

---


# Module 2: Building a Cordova Project

ここではAndroidのビルド方法だけ確認しています。  

以下翻訳。

Building for Android

以下の手順でAndroidバージョンのアプリケーションをビルドするには、コンピュータにAndroid SDKがインストールされている必要があります。

workshop / platforms / androidフォルダにプロジェクトをビルドし、USBケーブルを使用してコンピュータに接続されたAndroidデバイスで実行するには、次のように入力します。

```console  
cordova run android
```

workshop / platforms / androidフォルダにプロジェクトをビルドしてAndroidエミュレータで実行するには、次のように入力します。

```console  
cordova emulate android
```

VSCodeでデバッグ環境を整えたのでパス。

---

# Module 3: Setting Up the Workshop Files

1\. プロジェクトのwwwフォルダの中身を削除する。  
(なんとなく不安なので別途バックアップをとっておく)

2\. リンクからチュートリアル用ファイルをダウンロードするか、git clone でダウンロードすること。  
ここではworkshopフォルダで下記コマンドを実行。

```console  
git clone https://github.com/ccoenraets/cordova-tutorial
```

3\. zipでダウンロードした場合は何処かに解凍しておいてね。

4\. wwwフォルダの中にダウンロードしてきたファイル(解凍したファイル)のうち、starter-wwwの中身を入れてね。

ここまででファイル配置はこのようになってます。

```console  
www
├─assets
│  ├─css
│  │  └─images
│  ├─pics
│  └─ratchet
│      ├─css
│      └─fonts
├─js
│  └─services
│      ├─json
│      ├─localstorage
│      ├─memory
│      └─websql
└─lib
```

5\. ビルドしてアプリケーションをテストしてみましょう。
チュートリアルの2章で確認した実行の仕方、もしくはwww/index.htmlをブラウザで開いてみてください。

今回はworkshopフォルダにて下記コマンドを実行。

```console  
cordova run android
```

こんな感じの画面が出ました。  

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/461d53a5-f805-9e59-c5e1-35183d46c61a.png)

6\. 検索ボックスに少数の文字を入力して、従業員を名前で検索します。従業員リンクをクリックしても、現時点では結果は得られません。

適当に入力してみると下記の様にリンクが出ます。
でもリンクをクリック(タップ)してみても特に反応はありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/e34dac9a-a57c-8446-ea1b-cae713fdb3b9.png)

---

# 参考URL

[Module 2: Building a Cordova Project](http://ccoenraets.github.io/cordova-tutorial/build-cordova-project.html)

[Module 3: Setting Up the Workshop Files](http://ccoenraets.github.io/cordova-tutorial/setup-files.html)

[Cordovaのチュートリアルをやってみる 第一回](https://qiita.com/tokky_se/items/dabc97d23f444f8d25e5)

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)
OpenCV(cv2)をcondaでインストール (python3.6)


## 結論
`conda install -c conda-forge opencv`

## 環境
`$python --version # Python 3.6.3 :: Anaconda custom (64-bit)`

## 変遷
この記事を見て、以下のコマンドを試したがうまくいかない
https://qiita.com/matken11235/items/2a17dc7c460b8d606efc

```
$ conda install -c menpo opencv3
Solving environment: failed

UnsatisfiableError: The following specifications were found to be in conflict:
  - opencv3
  - xlwings
Use "conda info <package>" to see the dependencies for each package.
```

githubのcondaのissue(https://github.com/conda/conda/issues/2448) に、
conda-forgeでインストールしたら上手くいくぜ!! という記事があったので、以下のコマンドを試したら上手く行った。
`conda install -c conda-forge opencv`
HHKBでかな打ちする時の設定備忘録

# Mac
インストールするもの
[Google日本語入力](https://www.google.co.jp/ime/)
[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)

1. キーボード環境設定で「US」と「Google日本語入力のひらがな」のみの状態にする

 ![スクリーンショット 2018-02-11 18.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/131788/dea96825-43ba-99f7-fc3b-144346f03d18.png)
※ことえりの「ひらがな」をUSキーボードで使うと「ろ」が消滅する

2. Karabiner-Elementsで下記のmodを入れる

　　コマンドキー単体で英数かなキー送信
　　escキーを押したときに英数キーを送信


![スクリーンショット 2018-02-11 18.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/131788/ee638935-9fdb-d99f-9f64-2a64a8543db1.png)
※karabinerを導入しない場合は、control+spaceでかな英数切り替え。
外部キーボードを接続した際にデフォルトキーボードを無効にする(尊師スタイル)等、有用な設定ができるのでkarabiner推奨

上２つを設定することにより、[(今度こそ)HHKBとかな入力でHappyにHackする](https://qiita.com/blackawa/items/370b411301692226280b)
こちらの記事の画像と同じマッピングでかな打ちができる。(英数切り替えは左右のコマンドキー単打ち)

# Windows
インストールするもの
[HHKBキー配列切替ツール](https://www.pfu.fujitsu.com/hhkeyboard/tooldownload.html)

1. HHKBキー変換ツールをインストールし、「英語配列」に設定することで、

[(今度こそ)HHKBとかな入力でHappyにHackする](https://qiita.com/blackawa/items/370b411301692226280b)
こちらの記事の画像と同じマッピングでかな打ちができる。(半角/全角切り替えはこの状態ではAlt+`)


2. MicrosoftIMEプロパティ -> MicrosoftIME詳細設定 -> キー設定変更
　　
![2018-02-11.png](https://qiita-image-store.s3.amazonaws.com/0/131788/e60434c4-5f69-36df-31f7-f60029e257cf.png)

　　上記画面でCtrl+SPACEをIMEオン/オフに割り当てる
　　これにより、windowsでもIME切り替えがcontrol+spaceになる

※キー単押しでもIME切り替えできるようになるらしいが、レジストリをいじる必要があるらしい。

# Linux（Ubuntu)

1. 入力メソッドの設定で、「US」、「Mozc(日本語)(キーボードレイアウト:US)」を設定
![スクリーンショット 2018-02-11 20.24.12.png](https://qiita-image-store.s3.amazonaws.com/0/131788/d2178232-76d7-cca0-47a6-65b8b0e197f0.png)

2. Mozcプロパティでかな入力にする 
![スクリーンショット 2018-02-11 20.24.54.png](https://qiita-image-store.s3.amazonaws.com/0/131788/3280e2a8-8ab0-5e9a-0740-9736b892b478.png)


上記を設定する事で、control+spaceでかな/英数を切り替える
Localeのエラーの直し方

このようなエラーが出た時の対処法。

```
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
```

多言語パッケージをインストール。
ここでは英語版をインストール。

```
$ apt-get install language-pack-en
```

ロケールを追加。

```
$ vi /etc/environment
$ cat << EOS >> /etc/environment
> LANG=en_US.UTF-8
> LC_CTYPE=en_US.UTF-8
> EOS
```
式で円を描く

計算式で、円を描くための座標を計算してみます。

#0.計算したいこと
平面上に円を描くための座標を求めたい

#1.Rubyで計算式をプログラムしてみる
プログラム名はmath03.rbとします。

```ruby
puts "x,y"
0.step( Math::PI*2, 0.5 ) do |rad|
    x = Math.sin( rad )
    y = Math.cos( rad )
    puts "#{x},#{y}"
end
```
#2.実行してみる
今回は、座標を見てもピンとこないので（今回だけじゃないかも）、結果をファイルに出力します。
結果を出力するファイルは、仮にmath03.csvとします。

```
ruby math03.rb > math03.csv
```
#3.図形を描く
エクセルかLibreOfficeを呼び出して、結果を保存したファイルを開きます。ファイルの種類をテキストファイルやCSVに切り替えないとうまく見つけられないかも知れません。結果の値をカンマ(,)で区切ったので、表計算ソフトで開くときも区切りにカンマ（コンマ）を指定しないと、うまくxとyの値が分かれてくれないので注意します。エクセルはファイルをダブルクリックして開くだけでうまく分けてくれるハズです。

表計算ソフトでうまく値が表示されたら、2行目以降のxとy値の部分だけを範囲選択します。

エクセルの場合は、メニューの挿入から、散布図（直線）を選択します。
LibreOffceの場合は、メニューのグラフボタンでグラフウィザードを開いて、散布図の線のみを選択し、種類で直線を選択して完了ボタンをクリックするとグラフが表示されます。

ぱっと見た感じ、3つ気になる点があります。
1つ目は、描いたグラフがつぶれて、横長や縦長になっていること。これは、グラフの外枠を縦や横に伸ばしたりすることで、ある程度調整できます。
2つ目は、そもそも円じゃない事。直線で描く指定にしたのでガタガタです。もしガタガタに見えないのは、グラフを描く条件で、直線を指定せず平滑化を選択している場合です。
3つ目は、閉じていない事。輪っかにならないなら円じゃなくて円弧です。

#4.プログラムの修正
一旦、表計算ソフトは終了して、プログラムを見直そうと思います。
まずは、気になる点の2つ目をどうにかしたいので、stepメソッドの中のステップ数を0.5から0.1にしてみます。

```ruby
puts "x,y"
0.step( Math::PI*2, 0.1 ) do |rad|
    x = Math.sin( rad )
    y = Math.cos( rad )
    puts "#{x},#{y}"
end
```
#5.再度、実行
```
ruby math03.rb > math03-2.csv
```
#6.再度、図形を描く
表計算ソフトで、結果を保存したファイルを開いて、先ほどと同じように、xとyの値を範囲選択し、グラフを描きます。今度は、さっきよりも滑らかに描かれていると思います。これは、プログラムから出力するデータを増やして、円を描くために必要な頂点の数を増やしたからです。
でも、円弧のままですね。最後に描く頂点を最初の頂点と同じ座標にすれば、円になると思いますので、データを少し加工しましょう。最後の行（多分64行目だと思います)の下に、最初の頂点の座標となる2行目と同じデータを追加してしまいましょう。具体的には、65行目に0と1を追加します。
#7.円完成！
6で描いたグラフは、邪魔にならなければそのままでも良いですし、削除しても構いません。もう一度、xとyの値を範囲選択しグラフを描いてみましょう。今度は気になる点の3つ目も解消されたと思います。
プログラムから、データとして揃った座標を出力する場合は、

```ruby
puts "x,y"
0.step( Math::PI*2, 0.1 ) do |rad|
    x = Math.sin( rad )
    y = Math.cos( rad )
    puts "#{x},#{y}"
end
x = Math.sin( 0 )
y = Math.cos( 0 )
puts "#{x},#{y}"
```
と、最後の行に最初の値(0)で計算した結果を出力すれば、データの修正は不要です。

今回は、開始を0、終了を2πとして円を描きましたが、開始と終了を好きな値にすることで、円弧を描くこともできます。また、stepメソッドの引数を0.1にしましたが、描く円の大きさによって、頂点の数が多いこと、少ないことも考えられます。その時は、数値を調整してみてください。
centos gnuplot ビルド

# centosにgnuplotをソースからコンパイルする


yumを使うと古いバージョンのgnuplotしかないので，自分でコンパイルしてインストールする方法。


## 必要なライブラリのインストール

gnuplotの出力形式として，pngやpngcairoを使いたかったので，ビルドの前に事前インストール。

```
$ su
# yum install pango-devel cairo-devel wxGTK-devel wxBase gd gd-devel
# exit
```

## ダウンロード

http://www.gnuplot.info/
にてソースファイルをダウンロード。

現在の最新版は以下。
Version 5.2 (current)
Release 5.2.2 (November 2017)

https://sourceforge.net/projects/gnuplot/files/gnuplot/5.2.2/
gnuplot-5.2.2.tar.gz


## 解凍

```
$ tar -zxvf gnuplot-5.2.2.tar.gz
```

## ビルド

```
$ cd gnuplot-5.2.2
$ sh ./configure --prefix=/home/hnishi/local
$ make 
$ make check
$ make install
```

configureのときに--prefixのオプションでインストール先のディレクトリを指定できる。
--prefixオプションを使用しない場合は，たぶん/usr/binとか/usr/local/binとかがデフォルトになっているので，スーパーユーザになってからmakeする。

インストール後，

```
$ /home/hnishi/local/bin/gnuplot
```

で実行可能。

パスの設定は，

https://qiita.com/hnishi/items/508b3cdbd237d1b5732a
とか，
http://rh7.hateblo.jp/entry/20100324/1269409310

# 追記
   
CentOS 5にversion5.0.5をインストールしようと思ったら以下のようなエラーが出た。

`undefined reference to 'pango_layout_get_baseline'`

CentOS5で利用できるyumのcairo, pangoライブラリのバージョンが古すぎるようである。
gnuplot-5.0.1 であれば，なんとかpngcairoが使えた。
emacsのコード補完ツールcompany-modeの設定備忘

# はじめに
emacsでコードを書くときに補完機能があると便利ですね。
現在主流なのがauto-completeとcompany-modeあたりだと思います。
これまではauto-completeを使用していたのですが、最近company-modeを導入し、思いの外軽くて使いやすいかったので乗り換えようかなと思っている今日この頃です。

company-modeの導入記事は既に沢山ありそうだったので、ここでは備忘も兼ねて設定をまとめておこうと思います。

【参考】
[emacsの補完用パッケージcompany-mode](https://qiita.com/sune2/items/b73037f9e85962f5afb7)

# 設定したこと
init.elには基本的なキーバインドと挙動を記述してあります。
あと私はC-hがバックスペースなのですが、company補完時だとドキュメントの呼び出し機能ととぶつかってしまいました。ドキュメントの呼び出しは頻繁でないので、C-Shift-hに設定しました。

※ 当初`company.el`を直接編集してキーバインドを変更していましたが、メンテナンス性の観点から`init.el`に設定を集約させるべきとのご指摘を頂きましたので修正致しました。

```elisp:init.el
(with-eval-after-load 'company
  	  (setq company-auto-expand t) ;; 1個目を自動的に補完
	  (setq company-transformers '(company-sort-by-backend-importance)) ;; ソート順
	  (setq company-idle-delay 0) ; 遅延なしにすぐ表示
	  (setq company-minimum-prefix-length 2) ; デフォルトは4
	  (setq company-selection-wrap-around t) ; 候補の最後の次は先頭に戻る
	  (setq completion-ignore-case t)
	  (setq company-dabbrev-downcase nil)
	  (global-set-key (kbd "C-M-i") 'company-complete)
	  ;; C-n, C-pで補完候補を次/前の候補を選択
	  (define-key company-active-map (kbd "C-n") 'company-select-next)
	  (define-key company-active-map (kbd "C-p") 'company-select-previous)
	  (define-key company-active-map [tab] 'company-complete-selection) ;; TABで候補を設定
	  (define-key company-active-map (kbd "C-h") nil) ;; C-hはバックスペース割当のため無効化
	  (define-key company-active-map (kbd "C-S-h") 'company-show-doc-buffer) ;; ドキュメント表示はC-Shift-h

	  ;; 未選択項目
	  (set-face-attribute 'company-tooltip nil
			      :foreground "#36c6b0" :background "#244f36")
	  ;; 未選択項目&一致文字
	  (set-face-attribute 'company-tooltip-common nil
                    :foreground "white" :background "#244f36")
	  ;; 選択項目
	  (set-face-attribute 'company-tooltip-selection nil
			      :foreground "#a1ffcd" :background "#007771")
	  ;; 選択項目&一致文字
	  (set-face-attribute 'company-tooltip-common-selection nil
                    :foreground "white" :background "#007771")
	  ;; スクロールバー
	  (set-face-attribute 'company-scrollbar-fg nil
			      :background "#4cd0c1")
	  ;; スクロールバー背景
	  (set-face-attribute 'company-scrollbar-bg nil
			      :background "#002b37")
	  )
```
楕円を外接する多角形の描き方

楕円を<strong>外接</strong>する多角形の描き方を説明します。
「こんなマニアックなことどこでやるのか？」という声が聞こえて来そうですが、とある案件で実際に必要になりました。高校数学が仕事で活用されている一例としてみてくれればと思います。

<h2>書き方</h2>
以下の前提知識が２つあれば描くことができます。
<ul>
    <li>楕円と楕円の半長径を半径とした真円の関係</li>
    <li>真円の外接多角形の描画方法</li>
</ul>

<h3>前提知識１:楕円と楕円の半長径を半径とした真円の関係</h3>
中心を原点とした半径aの真円と半長径をa、半短径bの楕円について考えます。
この２つの図形には、以下の関係があります。
<ul>真円の座標(x, y)=楕円の座標(x, (b/a)y)</ul>
つまり半径a真円をy方向にb/a倍すると長径2a, 短径2bの楕円ができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213435/1bf080b5-970d-49e4-78a6-97de6a116fdb.png)

<h3>前提知識2:真円の外接多角形の描画方法</h3>
真円の外接多角形は、三角関数の理論を使うとで算出できます。
真円の半径をr、真円の外接多角形の頂点のなす角をθとすると、「真円の中心」から「真円の外接多角形の頂点」までの距離は、r/cos(θ/2)になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213435/42fe4022-7943-fbb8-7729-531370ca9aec.png)

<h3>結論：描画方法</h3>
「1.」で楕円と真円の関係を説明しました。
つまり、楕円の外接多角形と真円の外接多角形にも同様の関係があります。
「2.」で真円の外接多角形の描き方を説明しました。

よって、半径aの真円の外接多角形を生成して(「2」の方式)、生成した各頂点のy座標を(b/a)倍することで(「1」の方式)、半長径をa、半短径bの外接多角形の楕円を描画できます。

次回は、実際にMatplotlibを使って楕円を図示してみようと思います。
Seleniumを使ってPythonでブラウザ操作

Windows10、Python3.6.3での使い方をまとめてみました。
Linux、macOSは、機会があったら追加します。


# PythonのSeleniumライブラリインストール

```
pip install selenium
```

# 各ブラウザのSelenium用ドライバの入手と使い方

## 使いやすい

* Google Chrome  
    [Getting started - ChromeDriver - WebDriver for Chrome](https://sites.google.com/a/chromium.org/chromedriver/getting-started)

```py3:使用例
from selenium import webdriver
browser = webdriver.Chrome(executable_path='C:\Work\Selenium\chromedriver.exe')
browser.get(https://www.google.co.jp/)
```


* Microsoft Edge  
    [WebDriver - Microsoft Edge Development](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)

```py3:使用例
from selenium import webdriver
browser = webdriver.Edge(executable_path='C:\Work\Selenium\MicrosoftWebDriver.exe')
browser.get('https://www.bing.com/')
```


* PhantomJS  
    [PhantomJS | PhantomJS](http://phantomjs.org/)

```py3:使用例
from selenium import webdriver
browser = webdriver.PhantomJS(executable_path='C:\Work\Selenium\phantomjs.exe')
browser.get('http://seleniumhq.org/')
browser.save_screenshot('C:\Work\screenshot.png')
```


## 設定が面倒

* Microsoft Internet Explorer  
ドライバを用意するだけではなく、ブラウザの設定変更も必須のようです。
    * ドライバの入手  
        [SeleniumHQのダウンロードサイト](http://www.seleniumhq.org/download/)
    * 使い方  
        [Selenium2をIEで起動させてみる。 - Qiita](https://qiita.com/tsuttie/items/372f5d4cad37650711f1)


## 動かせなかった。。。

Firefoxは奥が深そうなので割愛しました。
Microsoft Graphのruby sampleを実行するDocker Imageを作る

## 試した環境
- Windows 10 Enterprise
- Docker for Windows10 : 17.12.0-ce

## ポイント
ruby-connect-rest-sampleの config\environment.rb に、CLIENT_ID, CLIENT_SECRETを設定すること。

## 手順
### ruby-connect-rest-sampleをclone

  ```sh:git_bash
　$ cd /e/work
　$ git clone https://github.com/microsoftgraph/ruby-connect-rest-sample.git
 ```

### environment.rbにApplication IDとPASSWORDを設定
#####  environment.rb をエディターで開いておく

 ```sh:git_bash
 $ cd ruby-connect-rest-sample/config
 $ vim environment.rb
 ```

##### Application IDの設定
1. [Microsoft Development Portal](https://apps.dev.microsoft.com/)にログインし、[アプリの追加]ボタンをクリック
1. Application Name (例: ms graph sample) を入力して、[Create]をクリック
1. 登録画面の「プロパティ」下、「アプリケーションID」をコピーして、environment.rbへペースト

 ```rb:/e/work/ruby-connect-rest-sample/config/environment.rb
 ENV['CLIENT_ID'] = '<ここへ「アプリケーションID」をペースト>'
 ```

##### パスワードの設定
1. 登録画面で、アプリケーションシークレットの、[新しいパスワードを生成]をクリック
1. 表示されたパスワードをコピーして、environment.rbへペースト

 ```rb:/e/work/ruby-connect-rest-sample/config/environment.rb
 ENV['CLIENT_SECRET'] = '<ここへパスワードをペースト>'
 ```

##### リダイレクトURLの設定
1. 登録画面の「プラットフォーム」下で、[プラットフォームの追加]、[Web]の順にボタンをクリック
1. 「暗黙的フローを許可する」チェックボックスをONにする(デフォルトでONになっている)
1. リダイレクトURLに、このURLを入力

 ```:リダイレクトURL
 http://localhost:3000/auth/microsoft_v2_auth/callback
 ```

##### アプリケーションの登録を完了
1. 登録画面の一番下の、[保存]ボタンをクリック
1. 開いておいたenvironment.rb(CLIENT_ID,  CLIENT_SECRETを設定済み)を閉じる

### Dockerfileを作る
ruby-connect-rest-sampleディレクトリに、Dockerfileを作る

全面的に参考にさせていただきました。: [RailsアプリをDockerで開発するための手順](https://qiita.com/togana/items/30b22fc39fe6f7a188ec)

 ```sh:git_bash
 $ cd /e/work/ruby-connect-rest-sample
 $ vim Dockerfile
 ```

 ```Docker:/e/work/ruby-connect-rest-sample/Dockerfile
 FROM ruby:2.4.2
 ENV APP_ROOT /usr/src/ruby-connect-rest-sample
 WORKDIR $APP_ROOT
 COPY . $APP_ROOT
 RUN \
  　echo 'gem: --no-document' >> ~/.gemrc && \
  　cp ~/.gemrc /etc/gemrc && \
  　chmod uog+r /etc/gemrc && \
  　bundle config --global build.nokogiri --use-system-libraries && \
  　bundle config --global jobs 4 && \
  　bundle install && \
  　rm -rf ~/.gemrc
 EXPOSE 3000
 CMD ["rails", "server", "-b", "0.0.0.0"]
 ```
 
### Docker imageをビルド

 ```sh:git_bash
 $ docker build -t developer_name/ms-graph-sample .
 ```

### imageを実行

 ```sh:git_bash
 $ winpty docker run --rm -it -p 3000:3000 developername/ms-graph-sample
 ```

### ブラウザから接続してみる
 `http://localhost:3000`

- ダウンロードしたサンプルをいじって実行したいときは、mountしてimageを実行

```sh:git_bash
$ winpty docker run --rm -it -v //e/work/ruby-connect-rest-sample://usr/src/ruby-connect-rest-sample -w //usr/src/ruby-connect-rest-sample -p 3000:3000
```

-v と -w で //e/work のように / を重ねた理由 : 
[git bashで docker -w /usr/src/projectが失敗](https://qiita.com/drafts/6db4ee5f444fbdeb7a35)

## 参考
- [RailsアプリをDockerで開発するための手順](https://qiita.com/togana/items/30b22fc39fe6f7a188ec)
- https://github.com/microsoftgraph/ruby-connect-rest-sample
git bashで docker -w /usr/src/projectが失敗

### git bashで、Docker run -vや -wが "working directory ... invalid"になる
```
$ docker run --rm -v /e/work/project:/usr/src/project -w /usr/src/project ruby:2.3.0 bundle init
CProgram Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: the working directory 'C:/Program Files/Git/usr/src/project' is invalid, it needs to be an absolute path
```

```:環境
Windows10 Enterprise
git bash
docker version : 17.12.0-ce, build c97c6d6
```

### パスの前の / を重ねることで解決。
```
$ docker run --rm -v //e/work/project://usr/src/project -w //usr/src/project ruby:2.3.0 bundle init
Writing new Gemfile to /usr/src/project/Gemfile
```
### 参照
[Problem with -v shared folders in 1.6](https://github.com/moby/moby/issues/12590)
GitLFSのLFSオブジェクトを圧縮する

# 課題

* GitLFSは非常に便利ですがLFSオブジェクト（.git/lfs/objects以下にあるファイル）は非圧縮で管理されるためディスク容量がもったいない。
* リモートリポジトリへpushするときもそのまま非圧縮で転送されるため通信帯域がもったいない。
* 圧縮したい！

# 解決策

* ありました。
  https://github.com/git-lfs/git-lfs/blob/master/docs/extensions.md

* GitLFSでLFSオブジェクト化する前に任意のプログラムを通せるらしい。圧縮以外にも暗号化したり検閲したりできる。

# やってみる

検証環境はサーバーが GitBucket-4.13.0 でクライアントが Windows8.1 / Cygwin(xzだけ) / [Git for Windows](https://gitforwindows.org/) で詳細なバージョンはこんな感じ

```
$ git version
git version 2.14.2.windows.3

$ git lfs version
git-lfs/2.3.2 (GitHub; windows amd64; go 1.8.3; git 81153cc0)
```

（Git for Windows は GitLFS を同梱しているので導入が楽ですね）

```bash
$ ls -gh hoge.dat
-rw-r--r-- 1 なし 42M 2月   6 01:59 hoge.dat

$ git config lfs.extension.compress.clean "xz -z"
$ git config lfs.extension.compress.smudge "xz -d"
$ git lfs track hoge.dat
$ git add -vA
add '.gitattributes'
add 'hoge.dat'

$ find .git/lfs/objects/ -type f | xargs ls -gh
-rw-r--r-- 1 なし 5.4M 2月  11 18:15 .git/lfs/objects/7c/e4/7ce459e1bfaac3371800decd182254712e20393e2426f8c8e85092d84dbc9d55
```

* 42MBあったファイルが5.4MBのLFSオブジェクトに！！（デフォルトでは42MBのまま管理される）
* push時にもこのファイルがそのまま転送されるので通信帯域にもやさしい。
* 素晴らしいことにこの拡張設定はポインタファイルに明記されるため、すでに運用しているLFSリポジトリに途中から導入できる。

# まとめ

* xzだと圧縮率は高いがそれなりに時間がかかってしまうのでzstdなど軽めの圧縮コマンドを使うなど用途に応じて調整するのがおすすめ。
* GitLFS拡張は複数設定できるものの拡張子で拡張設定を選択することはできないようなので、
  %f でファイル名を引数に受け取って分岐する独自コマンドを作るのが良いかも。
* この拡張の設定はリモートリポジトリには保存されないのでGitHubのようなWebフロントエンドからは圧縮ファイルしか閲覧できない。
* 同じ理由でclone後に毎回この設定を行う必要があり、そのままだとLFSの展開に失敗してしまう。対策としてclone時にcheckoutされるデフォルトブランチを環境設定用ブランチにしておいて、LFS設定＆masterチェックアウトするスクリプトだけ配置しておくというのが現実的かもしれません。
HP Stream 11でbashからCopy&Paste

## [fn]-[ins/prt sc]がinsertキー
### キーボードの最上段右側にある :  [f12/飛行機] **[ins/prt sc]** [delete]
Copy : Ctrl-Insert : **[ctrl]-[fn]-[ins/prt sc]**
Paste : Shift-Insert : **[shift]-[fn]-[ins/prt sc]**
gem install rails で"... can't find header files for ruby"

## ruby, riのインストール後、railsのインストールでエラーが発生。
```
    current directory: /var/lib/gems/2.3.0/gems/nokogiri-1.8.1/ext/nokogiri
/usr/bin/ruby2.3 -r ./siteconf20180106-13919-1x409ih.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1
```
たしかに/usr/lib/rubyの下に includeディレクトリが無い。

```:環境
OS: ubuntu 16.04
ruby: 2.3
rails: 5.1.4
```

## ruby-dev のインストール後にrailsをインストールしたら成功。

rubyのインストール時「提案パッケージ」にruby-devが出ていたが、無視していた。

```
$ sudo apt install ruby
    ...
提案パッケージ:
  ri ruby-dev
以下のパッケージが新たにインストールされます:
  libruby2.3 rake ruby ruby2.3
    ...
$ sudo apt install ri
    ...
$ sudo gem install rails
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/nokogiri-1.8.1/ext/nokogiri
/usr/bin/ruby2.3 -r ./siteconf20180106-13919-1x409ih.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.3.0/gems/nokogiri-1.8.1 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/nokogiri-1.8.1/gem_make.out
```
このエラー後、ruby-dev をインストール

```
$ sudo apt install ruby-dev
 
   ...
以下のパッケージが新たにインストールされます:
  libgmp-dev libgmpxx4ldbl ruby-dev ruby2.3-dev
    ...
```

その後、railsのインストールに成功

```
$ sudo gem install rails
```

参考
- [puma gemがインストールできない](https://qiita.com/sei0o/items/1ecdcf4602e342cdcf8e)