OmniAICreator/Qiita-1.07M huggingface dataset:
Composerのautoloadの書き方早見表

composer.jsonでautoloadをどう書くか忘れっぽい人のための早見表

## psr-4 (Vendor\\Namespace)

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "Alice\\MyModule\\": "src/"
        }
    }
}
```

ロードされうるファイルとクラス

```
composer.json
src/
  A.php   ... Alice\MyModule\A クラス
  B/
    C.php ... Alice\MyModule\B\C クラス
```

## psr-4 (Vendor)

```json
{
    "autoload": {
        "psr-4": {
            "Alice\\": "src/"
        }
    }
}
```

ロードされうるファイルとクラス

```
composer.json
src/
  A.php   ... Alice\A クラス
  B/
    C.php ... Alice\B\C クラス
```

## psr-0 (Vendor\\Namespace)

```json:composer.json
{
    "autoload": {
        "psr-0": {
            "Alice\\MyModule\\": "src/"
        }
    }
}
```

ロードされうるファイルとクラス

```
composer.json
src/
  Alice/
    MyModule/
      A.php   ... Alice\MyModule\A クラス
      B/
        C.php ... Alice\MyModule\B\C クラス
```

## classmap

指定されたディレクトリ配下やファイル内のクラスを解析し、クラス名とファイル名の対照表を作ってくれる。ファイル自体は遅延読み込み。

```json:composer.json
{
    "autoload": {
        "classmap": ["src/", "Something.php"]
    }
}
```

ロードされうるファイルとクラス

```
composer.json
Something.php ... このファイルに書かれている全クラス
src/ ... このファイルに書かれている全クラス
```

## files

classmapが遅延読み込みなのに対し、filesはプログラム実行前に指定したファイルを読み込む。

```json:composer.json
{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}
```

ロードされうるファイルとクラス

```
composer.json
src/
  MyLibrary/
    functions.php ... このファイルに書かれているコードすべて
```

## autoload設定後はdumpautoload

composer.jsonを書き換えただけでは反映されないので、下記コマンドを実行する。

```
composer dumpautoload
```

## 本家ドキュメント

* [The composer.json Schema - Composer](https://getcomposer.org/doc/04-schema.md#autoload)
nokogiriをインストールしようとするとエラー

ubuntu16.04でnokogiriをインストールしようとすると

```
sudo gem install nokogiri
```

下記のようにエラーになりました

```
ERROR:  Error installing nokogiri:
	ERROR: Failed to build gem native extension.
```

[公式](http://www.nokogiri.org/tutorials/installing_nokogiri.html)を参照しました

```
udo apt-get install build-essential patch ruby-dev zlib1g-dev liblzma-dev
sudo gem install nokogiri
```
【OSX】Python3.xでMeCab

#はじめに
スッキリした記事がなかったのでメモがわりに残しておきます。

#インストール
本体のインストール

```
$ brew install mecab
```

辞書のインストール

```
$ brew install mecab-ipadic
```

バージョン確認

```
$ mecab -v
mecab of 0.996
```

mecab-python3のインストール

```
$ pip install mecab-python3
```

以上で

```python3
import MeCab
```
が実行可能になります。

#使い方
```python3:mecab.py
import MeCab

tagger = MeCab.Tagger()

node = tagger.parseToNode('すもももももももものうち')

while node:
    #node.featureで品詞などを含む文字列を返す
    print(node.feature)
    node = node.next
```

```
$ python mecab.py
BOS/EOS,*,*,*,*,*,*,*,*
名詞,一般,*,*,*,*,すもも,スモモ,スモモ
助詞,係助詞,*,*,*,*,も,モ,モ
名詞,一般,*,*,*,*,もも,モモ,モモ
助詞,係助詞,*,*,*,*,も,モ,モ
名詞,一般,*,*,*,*,もも,モモ,モモ
助詞,連体化,*,*,*,*,の,ノ,ノ
名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
BOS/EOS,*,*,*,*,*,*,*,*

```
【学習備忘録】カワチーマン　C# ラムダ式編【身内用】

# 学習背景・概要
新しい現場で経験のないC#を活用するので、0から基礎言語仕様をまなびたい
初めてのラムダ式を理解したい（Ｍｕｓｔ）




# 学習に使用したもの
### パーフェクトC#（弊社レンタル本）
![51bE68d8tkL.jpg](https://qiita-image-store.s3.amazonaws.com/0/227943/8f69dddd-3725-7e57-2d20-810802888070.jpeg)


### MSDN
C# 
で検索しガイドページを参照
https://docs.microsoft.com/ja-jp/dotnet/csharp/

### 未確認飛行
http://ufcpp.net/study/csharp/

# 環境
Windows10
Visual Studio 2017

# 学習方法
・一度、舐めるくらいで本を読み終え、再度読み直す
・本で理解できなかった部分に関してはそれ以外の資料で調べる
・分かりにくい所は実際にコーディングしてみて、トレースしたり、実行結果が自分の理解したものとなる事を確認する

という感じで学習しています。
まだまだ、Ｃ＃の基本言語仕様の理解度は浅く、コーティングをすらすらできるとはいえない状況です


# ラムダ式の理解過程
以下は、ラムダ式を理解する過程がどんな風だったかを記述してみました

### ラムダ式とは何か（引用）

・匿名メソッドをより短く記述するための構文
・メソッド内で定義された即席のメソッド

上記の様な説明がありました



### 実際のコードを見てみる
コンソールアプリケーションで確認しました

```C#:test.cs
namespace ConsoleApp1
{
    class Program
    {
        public static void Main(string[] args)
        {
            Action action = () => Console.WriteLine("Hello, World!!");
            action();
            Console.ReadLine();
        }
    }
}
```

実行結果
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/227943/691c5993-d943-4079-bd55-40f440e488c6.png)

### ここまでの理解
「=>」の右にメソッド（関数）がある。これをさらに「=」でactionオブジェクトに入れ込んでいる
関数を値みたいに使用しているようにみえる・・・こんな書き方がそもそも可能なのか？


### ラムダ式を理解する前提知識の必要性
ラムダ式はなんとなく理解できた。色々省いてメソッドを展開できる書き方のようだ。
けれど今の理解だと、ただそれだけで実際どういう動きをしているかもわからないし
そもそも自分の知らないC#の言語仕様の上で成り立っているようにみえる。
なので関係する仕様を調べてみた


### デリゲート
デリゲートとは「メソッドを参照する型」の事。
なるほど、この機能があるおかげで右辺にメソッドを用意して、メソッド自体を値の用にいれこんでいるようにみえると。
デリゲート自体は下記の様な定義らしい。

```
public delegate int test_del(int value);
```

んで更にデリゲートインスタンスを生成して使えるようにするには下記のかんじ

```

test_del test1 = TestClass.testMethod

```


### 匿名関数（匿名メソッド）
更にこのデリゲートを作るためにメソッドや関数を定義するのが手間というような理由で用意されたと思われる匿名関数・匿名メソッドというものがある。
ここではサンプルコードが長くなるので割愛してしまうが、
デリゲートの呼び出しを名前なしでのインラインスステートメントブロック内に記述できるというものである
※インラインステートメントブロック＝難しいようにいってるけどようは{}内

### ここでやっとラムダ式
そして匿名関数（メソッド）を更に簡略化したものがラムダ式、という事なのである

ここまで理解するのにほんと時間がかかった。最初にラムダ式から理解しようとしたのが問題だったのかもしれない。順序だてて学習しないとやはり真に理解するのは遠いようだ。


# 休憩
というわけでこんな感じで0からC#の基本言語仕様を学んでいる状態です。
他にも学習しないといけない事がいっぱいあるけど、C#を学習するだけで正直いっぱいいっぱい。
時間もかぎられてるので効率よく勉強次第です、
ubuntuにjekyllをインストールするときmake: g++: Command not foundというエラーが出る人

[How to Set Up a Jekyll Development Site on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-jekyll-development-site-on-ubuntu-16-04)を参考にubuntuにjekyllをインストールしようとしました

```shell
sudo apt-get update
```

```shell
sudo apt-get install ruby ruby-dev make gcc
```

ここまではいいのですが、

```
sudo gem install jekyll bundler
```

をやろうとすると

```
...
make "DESTDIR="
compiling binder.cpp
make: g++: Command not found
Makefile:231: recipe for target 'binder.o' failed
make: *** [binder.o] Error 127

make failed, exit code 2
...
```

というエラーがでました。

[g++ command not found](https://ubuntuforums.org/showthread.php?t=1464768)を参考に下記を追加でインストールすると解決しました

```
sudo apt-get install build-essential g++
```
CMakeツールチェインの使い方

以前[CMakeのツールチェイン機能を扱う際の注意点](https://qiita.com/lapis_tw/items/c7335981d88e9f44f6aa)を書きましたが、そもそもツールチェイン自体の記事が見当たらなかったので基本的な使用方法を書いておきます。

# ツールチェインとは

CMakeには外部からビルド設定を組み込むための[cmake-toolchains](https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html)という機能があります。
たとえば、

* Visual Studioではプロジェクト設定に予め`/MT`や、`/MTd`を設定したい
* CMakeで生成する依存ライブラリは特定の環境でパス環境変数を要求するが、定義したくないので直接プロジェクトファイルに埋め込みたい
* 環境に応じて対象となるコンパイラの種類及びバージョンを細かく指定したい

のような状況は頻繁に発生するでしょう。これらの設定はcmakeコマンドのオプションじゃ賄い切れない事が多いです。
そこでツールチェインの機能を利用することにより、クロスプラットフォームを対象としたプロジェクトの生成において、各プラットフォーム間で生まれる細かい要求に対応することが出来ます。

# 使い方

ツールチェインは定義した`.cmake`ファイルを`-DCMAKE_TOOLCHAIN_FILE`オプションによって渡すことにより機能します。

```
cmake . -DCMAKE_TOOLCHAIN_FILE=/path/to/file.cmake
```

ここで渡す`.cmake`ファイルに各環境ごとの設定を書き加えるだけでCMake側が設定してくれるので楽ちんです。

# 設定方法

`.cmake`ファイルなので、そのままCMakeの文法を扱うことが出来ます。ここで例を見てみましょう

```cmake
# 対象は環境変数HOGE_PATHを要求しているが、環境変数を汚したくないので直接埋め込む 
include_directories(SYSTEM ${HOGE_PATH})

# 対象はHOGEライブラリをサポートしているため使用したい。そのための変数を定義する
add_definitions(-DUSE_HOGE)

# 対象のCMake設定では/MDdと/MDが指定されるため、/MTdと/MTに直したい
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd" CACHE STRING "description")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" CACHE STRING "description")
```

上の例では3つの要求に対応する設定を記述してみました。書き方は普段書くCMakeの設定方法とほぼ一緒なので何も考えることはないですね。ここに記述した設定は、基本的には優先して扱われるようになっているようです（ドキュメントを参照してもぱっと見見当たらないので不確定ですが）。
[以前の記事](https://qiita.com/lapis_tw/items/c7335981d88e9f44f6aa)でも解説したように、`set()`で設定する変数には`CACHE`指定をつけるのだけは忘れないようにして下さい。

ここで書いた設定はWindows（Visual Studio）を想定したものでしたが、各プラットフォームごとにツールチェイン用ファイルを用意してもいいですし、`CMAKE_SYSTEM_NAME`や`CAMEK_CXX_COMPILER_ID`のような変数を判定して分岐した設定を書いても良いでしょう。
Tableauで散布図を書く際は Aggregate Measures を外すのではなく、Detailに固有のIDを入れること

散布図を書いて、線形回帰のトレンドラインを引いて見る、ということはExcelでも簡単にできるので、わざわざTableauを使うことは無いのですが、Tableauで描くことで大きなメリットがあります。

それは、散布図から「外れ値」を見つけ、簡単にそれを除外して、トレンドラインを再確認する、という「分析プロセス」か容易に回せることです。

公式のTableauのチュートリアルはこちら [Trend Lines](https://www.tableau.com/learn/tutorials/on-demand/trend-lines)

ところが、私が実際に触っていてハマった点があったのでシェアします。

散布図を書く際に一番手軽なのは、2つのメジャーを選び、Analysisから集約を外す方法です。が、この方法で作った場合、任意のプロットを外れ値として除外する、といったことができないことに気づきました。

![method1-1.png](https://qiita-image-store.s3.amazonaws.com/0/42712/f3d76ac6-418b-afa0-4802-6114d68f2512.png)

![method1-2.png](https://qiita-image-store.s3.amazonaws.com/0/42712/2f82bc14-7dc9-39ac-dfdd-e4bee1e93da6.png)

正しい散布図の描き方は、2つのMeasureを選択し、散布図を描いた後、固有の値「ID」をDetailとして設定することです。これでIDごとにSUMされた値で（＝すべてバラバラに）プロットされ、さらに外れ値を「除外」できるようになりました。

![method2-1.png](https://qiita-image-store.s3.amazonaws.com/0/42712/0d88fe1e-db2e-32e6-1c49-da3d300374e1.png)

![method2-2.png](https://qiita-image-store.s3.amazonaws.com/0/42712/d145a1da-6b95-a69a-72c7-da7eee68eddb.png)

「散布図を書く」という点では最初の方法でも目的を達成できるのですが、その後「データとの対話」には、2番めの方法で描くのがポイントとなるようです。

サンプルで作ったワークブックはここからアクセス可能です。
https://public.tableau.com/shared/BHXMXZXG8?:display_count=yes

共有まで。
サーバーからサイズの大きいフォルダをダウンロードしたい

カゴヤの専用サーバー(root権限なし)からさくらの専用サーバーにデータを移動したいのですがどうしても画像フォルダをダウンロードすることができません。いい方法あれば教えていただけますか？
Pythonの Beautiful Soup を使ってプロ野球選手のプロフィールをスクレイピングしてみた

日本プロ野球はこんな[サイト](http://npb.jp/bis/teams/rst_t.html)があって、対象の選手をクリックするとその人のプロフィールや成績が見れるので、Pythonの Beautiful Soupを使って雑にスクレイピングしてみた

スクレイピング対象はひとまずこの感じで。
<img width="873" alt="貼り付けた画像_2018_01_03_19_00.png" src="https://qiita-image-store.s3.amazonaws.com/0/195331/a429ff71-e387-5c5a-e13a-9e4333d77d23.png">


# Beautiful Soupをインストール
Beautiful SoupはWebページの記法であるHTMLを良い感じにパースしてくれるライブラリです。
入れてない場合は、以下のコマンドでインストールできます。

```
$ pip install beautifulsoup4
```

# ライブラリを読み込む
```Python
from urllib.request import urlopen
from bs4 import BeautifulSoup
```

# まずは一覧ページにある選手のリンク先を取得する

```Python
# スクレイピングするページのurl(阪神タイガース選手一覧)
url = 'http://npb.jp/bis/teams/rst_t.html'
htmlData = urlopen(url).read()
htmlParsed = BeautifulSoup(htmlData, 'html.parser')
```

# 各々の選手プロフィールを取得してスクレイピング
```Python
for div in htmlParsed.select('.rosterRegister a'):
    player_url = 'http://npb.jp' + div.get("href")
    player_htmlData = urlopen(player_url).read()
    htmlParsed2 = BeautifulSoup(player_htmlData, 'html.parser')
    print(div.string)
    for detail in htmlParsed2.select('.registerDetail'):
        print(detail.string)
    print('--------------------')
```

# 最終的にはこんな感じ
```Python
# ライブラリの読み込み
from urllib.request import urlopen
from bs4 import BeautifulSoup

# スクレイピングするページのurl(阪神タイガース選手一覧)
url = 'http://npb.jp/bis/teams/rst_t.html'
htmlData = urlopen(url).read()
htmlParsed = BeautifulSoup(htmlData, 'html.parser')

for div in htmlParsed.select('.rosterRegister a'):
    player_url = 'http://npb.jp' + div.get("href")
    player_htmlData = urlopen(player_url).read()
    htmlParsed2 = BeautifulSoup(player_htmlData, 'html.parser')
    print(div.string)
    for detail in htmlParsed2.select('.registerDetail'):
        print(detail.string)
    print('--------------------')
```
# 取得結果 はこんな感じ
```
榎田　大樹
えのきだ・だいき
1986年8月7日生　　身長181cm　　体重92kg　　左投 左打
小林西高 - 福岡大 - 東京ガス
2010年ドラフト1位
--------------------
能見　篤史
のうみ・あつし
1979年5月28日生　　身長180cm　　体重72kg　　左投 左打
鳥取城北高 - 大阪ガス
2004年ドラフト自由枠
--------------------
横山　雄哉
よこやま・ゆうや
1994年2月21日生　　身長183cm　　体重83kg　　左投 左打
山形中央高 - 新日鉄住金鹿島
2014年ドラフト1位
--------------------
長いので省略
```
dlopen()した共有ライブラリ内の関数呼び出しをltraceする

# TLDR

**x86_64での話。他のアーキテクチャでは未確認。**

ltraceコマンドを使うと、共有ライブラリ内の関数に対する呼び出しをトレースできる。しかし単に `ltrace a.out` としただけでは、`-lhoge`のようにビルド時に指定したライブラリ内の関数呼び出しはトレースされるものの、dlopen()したライブラリ内の関数の呼び出しはトレースされない。そのためには `ltrace -x hoge a.out` のように関数名を指定する必要がある。

# 例

```hoge.c
// gcc -W -Wall -fPIC -shared hoge.c -o libhoge.so
int hoge(int a, int b)
{
    return 10 + a * b;
}
```

```main.c
// gcc -W -Wall -ldl main.c -o a.out
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main()
{
    void* lib = dlopen("./libhoge.so", RTLD_LAZY);
    if (lib == NULL) {
        printf("%s\n", dlerror());
        exit(1);
    }

    int (*f)(int, int);
    f = (int (*)(int, int))dlsym(lib, "hoge");
    int x = f(5, 9);
    printf("x = %d\n", x);

    dlclose(lib);
    return 0;
}
```

# ltrace a.outを実行
hoge()の呼び出しが表示されていない。

```
$ ltrace ./a.out
dlopen("./libhoge.so", 1)                                                                 = 0x55cd42d67280
dlsym(0x55cd42d67280, "hoge")                                                             = 0x7f0bc72cc5aa
printf("x = %d\n", 55x = 55
)                                                                    = 7
dlclose(0x55cd42d67280)                                                                   = 0
+++ exited (status 0) +++
```

# ltrace -x hoge a.outを実行
`hoge@libhoge.so(5, 9, 1, 0)`という行が表示されている。

```
$ ltrace -x hoge ./a.out
dlopen("./libhoge.so", 1)                                                                 = 0x564a38c5d280
dlsym(0x564a38c5d280, "hoge")                                                             = 0x7f8ffa51b5aa
hoge@libhoge.so(5, 9, 1, 0)                                                               = 55
printf("x = %d\n", 55x = 55
)                                                                    = 7
dlclose(0x564a38c5d280)                                                                   = 0
+++ exited (status 0) +++
```

# 解説

ltraceのdlopen()対応は2009年頃に実装されたらしい。
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=537781
元となったパッチとその解説がこちらのページにある。
http://timetobleed.com/extending-ltrace-to-make-your-rubypythonperlphp-apps-faster/
Arduino MicroでLチカ(その2)

## 導入

[Arduino MicroでLチカ(その1)](https://qiita.com/shela/items/069f85752ae4d52a3984)では、Arduino Microに実装されているLEDを使ってLチカをしたので、今回はブレッドボードに刺したLEDをArduino MicroのデジタルI/Oピンで点灯制御するのをやってみた。

## 前提知識

### I/Oピン

マイコンにはいくつか使用可能なI/Oピンがあり、目的に応じて適切なI/Oピンを使用することで色々なことができるようになっている。
I/Oピンには5Vを出力できるピンやGNDのピンのほか、シリアル通信に使用できるピン、アナログ入出力に使用できるピン、デジタル入出力に使用できるピンなどがある。

アナログ入出力とデジタル入出力で使用できるピンをデジタル入出力用に設定した場合、このピンはアナログ入出力では使用できなくなる、といったように排他的な利用しかできないので、シリアル通信のように他のピンでは代用できないものからピンを割り振っていって、余ったピンを自由に使うといった感じで使用するようだ。

Arduino Microのピン配置は以下のURLのところがわかりやすい。
http://www.pighixxx.com/test/portfolio-items/micro/

今回はデジタルI/OピンでLEDを制御したいので、デジタルI/Oピン→LED(と抵抗)→GNDと接続する。従って、Port Pinとなっているピンのうち適当なもの1つと、2つあるGNDのいずれか1つの2つのピンが使用できればよい。

デジタルI/Oピンは、入力に設定するとピンにかかる電圧がHIGHなのかLOWなのかを読み取ることができる。また、出力に設定するとHIGHまたはLOWの電圧をかけることができる。
今回はデジタルI/Oピンを出力に設定して利用する。出力をHIGHにするとGNDとの電位差が生じるのでLEDに電流が流れて点灯し、LOWにすると電位差がなくなるのでLEDに電流が流れなくなって消灯する、といった仕組み。

### 定格

https://store.arduino.cc/usa/arduino-micro のDOCUMENTATION -> Input and Outputに

> Each of the 20 digital i/o pins on the Micro can be used as an input or output, using pinMode(),digitalWrite(), and digitalRead() functions. They operate at 5 volts. Each pin can provide or receive 20 mA as recommended operating condition and has an internal pull-up resistor (disconnected by default) of 20-50 k ohm. A maximum of 40mA is the value that must not be exceeded to avoid permanent damage to the microcontroller.

とあるように、Arduino Microには5Vで動作するデジタルI/Oピンが20個ある。推奨動作条件は各ピン20mAまでの入出力となっている。

Arduino MicroのマイコンであるATmega32u4のデータシートによると、絶対最大定格に

> DC Current per I/O Pin . . . . . . . . . . . . . . . . . . 40.0mA
> DC Current VCC and GND Pins . . . . . . . . . . 200.0mA

とあるので、各ピンは40mA、マイコン全体では200mAを超えてはいけないようだ。従って、デジタルI/Oピン1個あたり20mAでも10個使うとアウト。

使用するLEDの特性はLEDのデータシートによると電流20mAにおける順電圧が標準値1.85V、最大値2.0Vとのことなので、20mA流すとしても

```math
\frac{5V - 1.85V}{20mA\times\frac{1}{1000}} = 157.5\Omega
```

くらいの抵抗を用意すれば良さそう。ただし、20mAも流すとLEDは相当明るいので適当に1kΩの抵抗を使うことにした。

LEDの特性上、電流が少なくなると電圧が少し下がるので正確ではないが、

```math
\frac{5V - 1.85V}{1000\Omega} \fallingdotseq 3mA
```

と3mA程度なら十分明るいので良しとする。

## 接続

使用したデジタルI/Oピンは11。使用したジャンパワイヤが届くちょうどの位置にあったデジタルI/Oピンが11だったという理由なのでどれでもよい。
ピン11→1kΩの抵抗→LEDのアノード(+)→LEDのカソード(-)→GNDと接続した。

![circuit.png](https://qiita-image-store.s3.amazonaws.com/0/28644/aa95a701-4e6f-4c67-020a-13f669adaa04.png)

なお、電源はArduino MicroのMicro USBを使用してPCから供給する。

余談だが、

- LEDを使う時は抵抗を使うのが当たり前
- LEDには極性がある

という話があるが、逆向きの2つのLEDを内蔵しているため極性がないLED、定電流素子を内蔵していて電流量を自動調節してくれる定電流LED、といったものがあるので一概には言えないようだ。

## スケッチ

ピン11をpinMode()で出力に設定しておき、digitalWrite()でHIGHにして1秒待ち、LOWにして1秒待つというのを繰り返す。

```C++
const int LED_PIN = 11;

void setup()
{
  pinMode(LED_PIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}
```

スケッチをArduino Microに書き込むまでは以前書き込んだスケッチのまま動作しているので、意図しない出力でマイコンを壊さないように配線する前にスケッチを書き込んでおくか、配線したままスケッチを書き込む場合でも配線の一部を外しておくなどの対策を取っておくといいようだ。

![Lチカ.png](https://qiita-image-store.s3.amazonaws.com/0/28644/d60dab48-8a68-9110-075d-68cd0907c673.png)
Rails カラムの追加


```
rails g migration AddTicketIdToTargetservers ticketid:integer
rails db:migrate
```


---
「マイグレーションを使ったカラムの追加、削除、データ型の変更」
https://qiita.com/dawn_628/items/13fa64dc6d600e921ce3


「railsでlabelに表示する名前をmodelの属性名から変更する方法」
http://se-bikou.blogspot.jp/2013/06/railslabelmodel.html
haproxy 根据https的域名做负载均衡


在看haproxy的官方配置的时候，发现其中有一个使用```use-server```的例子。可以根据https的域名来选择后端的server，从而实现根据域名将https的请求做负载。

想到之前也有一个类似的需求，好像因为当时没有找到解决方案就将功能放入了默认的后端server组里。

今天测试了一下，发现可以按照相似的思路实现根据https的域名做负载。

## 官方的示例

```
# intercept incoming TLS requests based on the SNI field
use-server www if { req_ssl_sni -i www.example.com }
server     www 192.168.0.1:443 weight 0
use-server mail if { req_ssl_sni -i mail.example.com }
server     mail 192.168.0.1:587 weight 0
use-server imap if { req_ssl_sni -i imap.example.com }
server     imap 192.168.0.1:993 weight 0
# all the rest is forwarded to this server
server  default 192.168.0.2:443 check
```
通过文档介绍可以看到，use-server仅仅可以用在 *listen* 和 *backend*。当有很多后端server组成一个集群的时候，这个方法不好用。

因此，想到既然```use-server```不行，就换成```use_backend```吧。这样不就可以了吗

## 自己的示例

```

frontend https
	bind :443 ssl crt /etc/haproxy/ssl/site.pem crt /etc/haproxy/ssl/example.pem #①
	use_backend site if { ssl_fc_sni -i www.site.com } #②
	use_backend example if { ssl_fc_sni_end -i example.com } #③
	
backend site
	mode http
	option forwardfor 
	balance roundrobin
	server myserver1 192.168.105.15:80 weight 1 check inter 10000
	server myserver2 192.168.105.17:80 weight 1 check inter 10000

backend example
	mode http
    option forwardfor
    balance roundrobin
	server server1 192.168.105.14:80 weight 1
	server server2 192.168.101.14:80 weight 1
	
```

① 配置了多个站点的ssl配置文件
② 使用```ssl_fc_sni```获取https访问的情况下的host，类似于req.hdr(host）。-i表示忽略大小写
③ 除了使用```ssl_fc_sni```做精准配置，还可以使用```ssl_fc_sni_beg``` 和 ```ssl_fc_end``做前缀和后缀的匹配

**测试可以达到预期目的。**
スクロールして表示領域に入ったら要素をアニメーション表示する

要素が画面に表示されたタイミングでいい感じにアニメーションして表示させたいときの備忘録。
jsライブラリの「jQuery.inview.js」とアニメーションのCSSライブラリ「animated.css」を使用します。
inviewだけでもアニメーションさせることはできますが、より色んなアニメーションをつけたいとき、違うライブラリに変えてみたり試行錯誤してみましたが、「animatede.css」を併用する方法が一番ラクだったので。。。


## **使用するライブラリ**
[jQuery.inview.js](https://github.com/protonet/jquery.inview)
[animated.css](https://daneden.github.io/animate.css/)
（使用する際は各サイトから最新版をCHECK）

## **ライブラリの読み込み**

head内に「animated.css」、body閉じタグ前にjQuery本体と「jQuery.inview.js」を記述。
(animated.cssはCDNあるのでそちらを使用・jQuery本体はGoogleのCDN)

```html:head_sample
<head>
・・・
<link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css">
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="/path/to/js/jquery.inview.min.js"></script>
</body>
</html>
```


## **htmlコード**

inviewしたい要素に任意のクラス名と、「animated.css」を適用するためのクラス名「animated」を記述。

```html:code_sample
<div class="animated inviewfadeInLeft">
fadeInLeft
</div>

<div class="animated inviewlightSpeedIn">
lightSpeedIn
</div>

<div class="animated inviewslideInLeft">
slideInLeft
</div>
```


## **jQueryコード**

上記htmlコードの場合のjQueryコード。
アニメーションの動きは[animated.css](https://daneden.github.io/animate.css/)から選択。
（addClassでつけているクラス名が「animated.css」のクラス名）

```js:jquery_sample
$(function() {
  $('.inviewfadeInLeft').on('inview', function(event, isInView) {
    if (isInView) {
    //表示領域に入った時
      $(this).addClass('fadeInLeft');
    } else {
    //表示領域から出た時
      $(this).removeClass('fadeInLeft');
      $(this).css('opacity',0); //非表示にしておく
    }
  });
  $('.inviewlightSpeedIn').on('inview', function(event, isInView) {
    if (isInView) {
      $(this).addClass('lightSpeedIn');
    } else {
      $(this).removeClass('lightSpeedIn');
    }
  });
  $('.inviewslideInLeft').on('inview', function(event, isInView) {
    if (isInView) {
      $(this).addClass('slideInLeft');
    } else {
      $(this).removeClass('slideInLeft');
    }
  });
});
```

inviewのコールバック関数は「isInView」「visiblePartX」「visiblePartY」の3つ。

「isInView」は要素が表示領域に見えるかどうかで「true」か「false」になる。
「visiblePartX」は要素の左右を基準に、「visiblePartY」は要素の上下を基準にする。
「visiblePartX」は、left・right・both、
「visiblePartY」は、top・bottom・both　を選択。

基本は「isInView」でOK。

## **参考**
参考にさせていただきました。ありがとうございます。
http://gimmicklog.main.jp/jquery/581/
the shape of the numpy.tensordot matrix

```python
p,n=2,1
M = np.random.randint(1,4,(p,n))
V = np.random.randint(2,5,(n,p))
print(M)
print(V)
MV = np.tensordot(M,V,0)
print(MV.shape)
```
* e.g.

```
[[3]
 [3]]
[[3 4]]
(2, 1, 1, 2)
```
CentOS7.4でDockerをインストール(おまけでDb2 Express-CをDockerで試してみる)

注意:本記事は以下の環境により動作確認をしています。

|||
|:-:|:-:|
|ゲストOS|CentOS Linux release 7.4.1708 (Core)|
|ホストOS|Windows 10|
|仮想化ソフト|VMware Workstation 14 Player|

***

2018年の正月はC#の勉強をするつもりでいたのですが、なぜかDockerを触っていました(´・ω・｀) どうしてこうなった(´・ω・｀)

それはさておきCentOS7.4でDockerをインストールした際のメモを共有します。といっても[Docker公式](https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-docker-ce-1)の指示通り、進めていくだけ。それを読むことすら面倒というものぐさな人は以下のコマンドを順番にたたいていくだけで、Docker環境が構築できます(もちろんrootユーザで実行するか、すべてのコマンドにsudoを付与する必要があります)。

```bash
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
```

この時点でDockerが停止している場合は、以下のコマンドによりサービスを活性化させましょう。

```bash
systemctl start docker.service
```

ちなみにDockerが正常に活性化したかどうかは以下のコマンドで確認することができます。

```bash
systemctl status docker
```

***

せっかくDocker環境を構築したので、Docker Imageをインストールしてみたいと思います。今回練習に利用するのがDb2 Express-C。IBMが誇るRDBMSの無償版ですね。IBMが公式でDocker Imageを用意してくれているので、これを利用します。といっても[Docker Hubの当該ページのREADME](https://hub.docker.com/r/ibmcom/db2express-c/)に指示されている通りにコマンドをたたくだけ。それを読むことすら面倒というものぐさな人(2回目)はまず`docker pull`コマンドによりimageをインストールします。

```bash
docker pull ibmcom/db2express-c
```

インストール後は`docker run`コマンドでコンテナを起動します。このとき環境変数`DB2INST1_PASSWORD`は自分のわかりやすいものを設定してください。その名前の通り`db2inst1`ユーザのパスワードになります。

```bash
docker run -it -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1passw0rd -e LICENSE=accept ibmcom/db2express-c:latest bash
```

この`docker run`コマンドが正常終了すると「db2がインストールされたOSのターミナルに接続している」ような状態になります。そこで`ibmcom/db2express-c`が用意しているインスタンスユーザ(db2inst1)でログインした後、インスタンスを活性化。サンプルDBを作成&接続し、作成されたテーブルの中身をのぞいてみましょう。

```
su - db2inst1
db2start
db2sampl
db2 connect to sample
db2 "select * from db2inst1.org"
```

すると以下のような内容がターミナルに表示されているはずです。

```
DEPTNUMB DEPTNAME       MANAGER DIVISION   LOCATION     
-------- -------------- ------- ---------- -------------
      10 Head Office        160 Corporate  New York     
      15 New England         50 Eastern    Boston       
      20 Mid Atlantic        10 Eastern    Washington   
      38 South Atlantic      30 Eastern    Atlanta      
      42 Great Lakes        100 Midwest    Chicago      
      51 Plains             140 Midwest    Dallas       
      66 Pacific            270 Western    San Francisco
      84 Mountain           290 Western    Denver       

  8 record(s) selected.
```

***

余談:[前述したibmcom/db2express-cのDocker HubのREADME](https://hub.docker.com/r/ibmcom/db2express-c/)によると、Db2は`/opt/ibm/db2/V10.5`というディレクトリにインストールされているそうなのですが――どう考えても見当たらない(´・ω・｀)

```bash
[db2inst1@a7c227901722 ~]$ ls -la /opt/
total 0
drwxr-xr-x. 2 root root  6 Jun 10  2014 .
drwxr-xr-x. 1 root root 51 Jan  3 08:36 ..
```

また2018-01-03現在、Db2の最新版は11.1ですが、今回利用したImageで利用できるのは10.5。ちょっと古い(´・ω・｀) IBM/Db2ちゃんはDockerには塩対応なのかしら(´・ω・｀)
numpy.tensordot sample:2x2 matrix and axis is scalar

```python
p, n = 2, 2
print("====intro.====")
M = np.random.randint(1,4,(p,n))
V = np.random.randint(2,5,(p,n))
print(M)
print(V)
print(np.tensordot(M,V,0)) # tensor
print(np.tensordot(M,V,1)) # dot(inner)
print(np.tensordot(M,V)) # dyad:default axis argument is 2
#print(np.tensordot(M,V,3)) # invalid
```
* e.g.

```
====intro.====
[[3 2]
 [1 2]]
[[2 4]
 [2 3]]
[[[[ 6 12]
   [ 6  9]]

  [[ 4  8]
   [ 4  6]]]


 [[[ 2  4]
   [ 2  3]]

  [[ 4  8]
   [ 4  6]]]]
[[10 18]
 [ 6 10]]
22
```
# Refs.
* [numpy.tensordot](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.tensordot.html)
* テンソル積  
http://segafreder.hatenablog.com/entry/2017/01/09/203811  
https://issus.me/projects/242/issues/10
* テンソル  
https://qiita.com/EtsuroHONDA/items/02635dc3026e29f3cb41  
http://hooktail.sub.jp/vectoranalysis/ReviewVectorProds/
* [ダイアド](http://hooktail.sub.jp/mathInPhys/productOfMatrice/)
* [double dot product](http://www.polymerprocessing.com/notes/root92a.pdf)
React + webpackな環境でthree.jsを使う。

Reactで作成したコンポーネント内でthree.js使おうとしたら結構ハマったので、メモ。

####1. three.jsをnpmインストールする。作業フォルダに移動して以下を実行。

```
npm install --save-dev three
```

####2. 使用箇所のJS内に以下一行を記述。


```
import * as THREE from 'three';
```

これだけで済む話でした。
Auth0を使用したAngular2+アプリの認証・認可チュートリアル

クラウド認証プラットフォーム Auth0を利用して、Angular２＋ SPAでのユーザー認証機能、およびAPI認可を簡単に実装する手順をGithubに公開されたサンプルソースを使用して解説します。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#チュートリアルを見る
![スクリーンショット 2018-01-03 16.16.43.png](https://qiita-image-store.s3.amazonaws.com/0/189613/2b2ba4cc-91f1-2469-1957-0a6a76de5061.png)

Angular2+ 認証チュートリアルは以下のURLからアクセスすることができます。

[Auth0 - Angular2+ 認証チュートリアル](https://auth0.com/blog/jp-angular-2-authentication/) 
(2016/09/26に作成されたブログを翻訳したものです)


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したAngular2+以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)



##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=auth0_angular_tutorial&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
【Android】任意の時刻が現在時刻から何秒前、何分前、何時間前、何日前かを計算する関数

SNSとかでよくある何秒前、何分前、何時間前、何日前の投稿かが分かるUIを実現したかったため作りました。

## やりたいこと
↓コレ（赤枠のところ）
![Screen Shot 2018-01-03 at 5.17.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/123122/433da7eb-5de3-aa54-0930-5e4f0392c08d.png)


## 環境
Kotlin: 1.2.10

## サンプルコード
```kotlin
fun foo(time: Long): String {
    val diff = System.currentTimeMillis() - time

    val sec = diff / 1000L

    val min = sec / 60L
    if (min == 0L) {
        return "${sec}s"
    }

    val hour = min / 60L
    if (hour == 0L) {
        return "${min}m"
    }

    val day = hour / 24L
    if (day == 0L) {
        return "${hour}h"
    }

    return "${day}d"
}
```

## 補足
`System.currentTimeMillis()`は引数で受け取るようにしてテストを書いたほうがいいですが、サンプルなのでわかりやすさ？を重視しました。
もっとうまく実装できるような気がしますがとりあえずこれでやりたいことは実現できました。
Twitterは1日以上前の場合はN日前という表示ではなく日付を表示しているようです。（例: `1 Jan`, ` 31 Dec 2017`）
Auth0を使用したReactJSアプリの認証・認可チュートリアル

クラウド認証プラットフォーム Auth0を利用して、ReactJSでのユーザー認証機能、およびAPI認可を簡単に実装する手順をGithubに公開されたサンプルソースを使用して解説します。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#ReactJS認証チュートリアルを見る
![スクリーンショット 2018-01-03 16.40.17.png](https://qiita-image-store.s3.amazonaws.com/0/189613/41849fd1-2a35-abc8-fbc9-508d2da16998.png)


ReactJS 認証チュートリアルは以下のURLからアクセスすることができます。

[Auth0 - ReactJS 認証チュートリアル](https://auth0.com/blog/jp-reactjs-authentication-tutorial/) 
(2017/02/21に作成されたブログを翻訳したものです)


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したReactJS以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)

##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=auth0_reactjs_tutorial&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
Auth0を使用したVuejs2+の認証・認可チュートリアル

クラウド認証プラットフォーム Auth0を利用して、Vuejs2+で作成したアプリケーションのユーザー認証機能、およびAPI認可を簡単に実装する手順をGithubに公開されたサンプルソースを使用して解説します。

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


#Vuejs2 認証チュートリアルを見る
![スクリーンショット 2018-01-03 17.17.07.png](https://qiita-image-store.s3.amazonaws.com/0/189613/3c36b041-c234-9e12-0e04-4e4709e2abd0.png)


Vuejs2 認証チュートリアルは以下のURLからアクセスすることができます。

[Auth0 - Vuejs2 認証チュートリアル](https://auth0.com/blog/jp-vuejs2-authentication-tutorial/) 
(2017/04/18に作成されたブログを翻訳したものです)

##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したVuejs2+以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=auth0_vuejs_tutorial&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
文字列からSNSのアカウント名・ハッシュタグ、URLを取り出す

# はじめに
SNSのスクショ画像からアカウント名やハッシュタグ、短縮リンクなどを取り出すWebアプリを作ってみました。

その中で、OCRの結果から要素を取り出すための正規表現をメモ。



# テスト用のテキストを用意
テスト用に以下のTwitterスクショ画像から[Cloud Vision API](https://cloud.google.com/vision/?hl=ja)で文字列を取得してみる。

<div align="center">
<img height="400px" src="https://qiita-image-store.s3.amazonaws.com/0/135313/d1673749-5431-2b6f-bced-ff96cc8699dc.png">
</div>

↓

```
. ホーム
合	g
koolweb37 | Web制作 @koolweb37・2h v
毎年こちらに、初詣2(Ca")
#初詣
#あけましておめでとう
#今年もよろしくね ift.tt/2A3kga2
たMii単理
9
u ゆーくりっどさんがリツイート
スケキヨ @sukekiyo56・18h
描き初め、柴犬パワードです。ことよろです
HAPPY
NEW
YEAR
```

さすがGoogle先生。
ただ、画像によっては「@」「#」などの記号やURLが誤認識する印象。歯がゆい❗

# 要素の抽出

```js

const text = `
. ホーム
合 g
koolweb37 | Web制作 @koolweb37・2h v
毎年こちらに、初詣2(Ca")
#初詣
#あけましておめでとう
#今年もよろしくね ift.tt/2A3kga2
たMii単理
9
u ゆーくりっどさんがリツイート
スケキヨ @sukekiyo56・18h
描き初め、柴犬パワードです。ことよろです
HAPPY
NEW
YEAR
`;

// アカウント抽出
const accounts = text.match(/[@＠][A-Za-z0-9._-]+/gm);
console.log(accounts);

// ハッシュタグ抽出
const tags = text.match(/[#＃][Ａ-Ｚａ-ｚA-Za-z一-鿆0-9０-９ぁ-ヶｦ-ﾟー._-]+/gm);
console.log(tags);

// URL抽出
const urls = text.match(/([a-z0-9]|\.)+\.(com|net|jp|org|io|info|me|ma|gl|ly|gd|cc|nu|tt).*/gm);
console.log(urls);
```

**出力**

```js
[ '@koolweb37', '@sukekiyo56' ]
[ '#初詣', '#あけましておめでとう', '#今年もよろしくね' ]
[ 'ift.tt/2A3kga2' ]
```
NVDのXML Feedから脆弱性情報を正しく取れない件

Qiitaのみなさん、お久しぶりです。
去年は忙しくてサボってましたが、2018年はちゃんと技術に関するアウトプットをするぞ

# NVDのXML Feedsが壊れている
[NVD](https://nvd.nist.gov/)は脆弱性情報が集まっている場所として非常に有名です。ここはヒューマンリーダブルなWebページだけではなく、XMLなどで脆弱性情報をフィードしてくれる機能があります。
このXML Feeds(僕はVersion 2.0を主に使っています)は11月の後半くらいから正常な応答を返さなくなっており、完全な脆弱性関連情報を入手することができなくなっています。

この件について、僕の方では12月頭に検出しNVDに問い合わせていますが、問題を確認してもらった後から返事がなくなってしまい、一ヶ月ほど、催促しても応答してもらえなくなっています。
XML Feedsに依存して動作しているシステムは多いと考えられ、影響がありますので、情報共有のためにブログにします。

# 壊れ方の詳細
XML Feeds(2.0)は、CVE番号ごとに脆弱性が影響する条件に関するデータを含んでいます。具体的には、脆弱性が影響する対象ソフトウエアの一覧や、そのソフトウエア同士の組み合わせがあります。一般的に、脆弱性情報のピックアップを行う場合、この情報が注目されています。しかし、現状のNVD XML Feedsでは、この情報が不十分なのです。

例えば、影響を受ける"CVE-2017-3771"の場合は、

```
   <vuln:vulnerable-configuration id="http://nvd.nist.gov/">
      <cpe-lang:logical-test operator="AND" negate="false">
        <cpe-lang:logical-test operator="OR" negate="false"/>
        <cpe-lang:logical-test operator="OR" negate="false">
          <cpe-lang:fact-ref name="cpe:/h:lenovo:thinkcentre_m710s:-"/>
        </cpe-lang:logical-test>
      </cpe-lang:logical-test>
    </vuln:vulnerable-configuration>
    <vuln:vulnerable-configuration id="http://nvd.nist.gov/">
      <cpe-lang:logical-test operator="AND" negate="false">
        <cpe-lang:logical-test operator="OR" negate="false"/>
        <cpe-lang:logical-test operator="OR" negate="false">
          <cpe-lang:fact-ref name="cpe:/h:lenovo:thinkcentre_m710t:-"/>
        </cpe-lang:logical-test>
      </cpe-lang:logical-test>
    </vuln:vulnerable-configuration>
    <vuln:vulnerable-configuration id="http://nvd.nist.gov/">
      <cpe-lang:logical-test operator="AND" negate="false">
        <cpe-lang:logical-test operator="OR" negate="false"/>
        <cpe-lang:logical-test operator="OR" negate="false">
          <cpe-lang:fact-ref name="cpe:/h:lenovo:aio_e95:-"/>
        </cpe-lang:logical-test>
      </cpe-lang:logical-test>
```

のような応答が返ります。

この表示がどうやら間違えているらしいことは、[CVE-2017-3771のページ](https://nvd.nist.gov/vuln/detail/CVE-2017-3771)の「Vulnerable software and versions」章を見に行けば明らかです。そもそも、logical-test要素が空になっている時点で何かがおかしい。また、影響を受けているCVEではvulnerable-software-list要素がなぜか消えてしまいます。

この問題はCVE-2017-3771にかぎらず、いくつかの情報で発生しています。僕が単純な検索で調べたトコロ、2017年発砲の情報だけで195個のCVEで同種の問題がありそうです。(発生条件については特定していて、NVDとは共有していますが、ここに書くのは控えます)

これは推測なのですが、おそらく、サイト上で"and previous versions"と表示していたところから"versions up to hoge"へ変更された際にDBの構造が代わり、XMLを正しく返せなくなったのでしょう。

# 影響概要
もしシステムがXMLのvulnebable-configulation要素や、software-list要素を参照して動作している場合、正しく処理することができていないでしょう。 SCAP的な対応を自動で行う場合、NVDのXML Feedsを参照するのは最もスタンダードな方法と考えられ、そのようなシステムを運用されている場合は確認が必要であると思われます。

おそらく、Vulsは影響を受けているものと思われます。僕はVulsの実装に詳しくないのですが･･･

# 対策方法
現状では完全な対策方法はありませんが、JSON Feedsには同種の問題が存在していないことを確認しています。ただし、JSON Feedsはβ版提供であり、他の問題の存在や今後の提供については保証されていません。
場当たり的にはJSON Feedを採用してやり過ごしてもよいと思いますが、XML Feedがきちんと修正されるようにおねがいを続けることが必要そうです。

JSON Feedsは、現状XML以上の情報量があり、リッチな造りです。また、XMLのversion 3.0が議論されていないことから、今後はJSONがメインストリームになっていく匂いを感じています。(これは個人の感想です。)

# まとめ
NVDのXML Feedsを活用して、SCAP的な作業を自動化しているユーザは、一部の処理で問題が発生している可能性があります。この問題は11月末から発生していますが、いまだに改修されていません。
足元では、運用者の努力によって改善することは難しいので、暫定的に対処していく必要がありそうです。
iOSエンジニアになる

# iOSアプリがついにエンプラに
スマートフォンアプリ開発はiPhoneの登場より10年を迎えますが、エンタープライズの世界ではそろそろ案件が出始めたと感じる人も多いのではないでしょうか。
以前も確かにB2B型の案件があったかもしれませんが、これまではそれ専門の会社がお客様から受注して開発していた(もしくは、Webビューで逃げてきた)と思います。しかし、クラウドのますますの隆盛により我々のお仕事もどんどん減っていき（多様化し）、自社からもスマホアプリも積極的にいけーと言われはじめてないでしょうか。
一度挫折した人も、実は興味があったと言う人もぜひ新年のやる気があるうちにはじめてみませんか。
始めてまだ２週間ですけど、感じたことをメモしておきます。また、初めてSwiftを触るにあたって、既存のスキルセットがどの程度役立ちそうかを最後にまとめました。

# 準備するもの
## Mac
iOSアプリを開発するのにMacは最終的に必ず必要になります。**ionic2やXamarinなどマルチプラットフォーム向けの開発手法があるのは事実**ですが、JavaScriptでの開発は覚えることが多すぎたり、余計なところでハマることが多いのでやめておきましょう。
XamarinはさすがMicrosoftと言える開発環境ですが、簡単に言うとObjective-CやSwiftのラップ実装なので覚えることがいっぱいです。C#なら普通にかけるけどと言う人でもやめておいたほうが良いでしょう。**iOSアプリを書くなら、現代ではXCode9とSwift4です**。
Macにもたくさん種類がありますが、現在販売されているMacあればどれでもいいと思います。StoryBoardなど快適に操作するのに画面は大きなほうが良いですが外付けディスプレイでも対応できるしなんでもいいですね。

## iPad or iPhone
Xcodeにはエミュレータがありますが、すぐに実機で動かしたいと思うはずです。持ってなければ購入しましょう。**エミュレータ on Macで動かしたところで起動時間やスクロール性能はわかりません**ので、実機で動作させると言うのはとても大事です。

## 開発者ライセンス(Apple Developer Program)
**まだいいです**。はやる気もちは抑えてください。**申請に必要なことを知るよりもまずは先に実装力を身につけましょう**。公開したいと思うものが本当にできたら有償プログラムに入りましょう。

## 書籍
[本気ではじめるiPhoneアプリ作り](http://amzn.to/2CvKQxJ)
Yahooのアプリ開発者が書いたアプリ作りのノウハウが書かれている良本です。良いと感じた理由はこれが1冊目ではなく、**シリーズであると言うことと、Xcode9.x/Swift4.x対応だから**です。プログラム初心者には厳しいですが、C#やJavaをこれまでそこそこ書いてきた人にはすんなり受け入れられるでしょう。
なので、**安いからといって、ブックオフで古い本を買うのは絶対やめましょう。**
また、ネット上に教科書的なものがありますが、それもまずは控えておきましょう。おそらく、**最初は写経や応用しながら書いていたサンプルコードが、疲れてコピペに走ってしまうことが目に見える**からです。その時点であなたのiPhoneアプリ開発の学習は the end です。もう一度、初詣からやり直しです。

# まとめ
「もう、まとめかい!」と言う声が聞こえてきそうですが、私が下手に言語やアプリ開発のポイントなどを書くよりも「[本気ではじめるiPhoneアプリ作り](http://amzn.to/2CvKQxJ)」を読んで手を動かしてもらうと、**SwiftからiOSアプリ開発を始めてよかった**と思えると思います。
ただ、人によってスタート位置が違うことも事実だと思いますので、私がSwift学習で感じた役に立った既存スキルを以下に記載します。

## 役に立つ既存スキル
### JavaやC#で培ったオブジェクト指向
継承やThrowなどはSwiftでもあります。すでにわかってるなら話はとても早いです。クラスを使用したプログラミングも必要になってきますので、**静的型付け言語の経験は大事**になってきます。
### JavaScriptで学んだ関数型プログラミング
関数型プログラミングはあちらこちらに出てきます。わからないとちょっと厳しいかもしれません。昨年プログラミングには階段があると言う「[記事](https://qiita.com/arimas/items/e3b06b686b8106b658c0)」を書いたのでこの辺りはぜひ読んで見てください。
### Lotus Notes開発で学んだIDEの開発
Notesでは画面を表示する際に色々なタイミングでイベントをフックできます。そして、それはIDEを駆使しながら、イベント毎に記述していきます。画面やフィールドのプロパティのオプションも豊富で色々と覚えることがあります。Xcodeを使用した開発はそれに似ているところがあるので、開発を進める中でも既視感が感じられました。

### iPhoneやiPadを買い続けてきた富豪スキル
この10年iOS端末を書い続けてきた継続性は色々なメソッドを利用する際に役立ちます。そして、何よりも**iOSアプリを作る際にiPhone自体のこれまでのUXの変遷を知っているのは何者にも代え難い**はずです。iOS端末を持っていない人がiOSアプリを作るというのはかなり厳しいと思うので早々に購入したほうが良いと思います。
ウィンドウ利用履歴を記録・可視化するツールultra-violetを開発しています

[独学してエンジニア職についた初級者が中級者になるためにプライベートで実践している学び方](https://qiita.com/aimof/items/b58e2b1c2e591cb33ef5)

という記事で紹介した[github.com/aimof/ultra-violet](https://github.com/aimof/ultra-violet)の紹介記事です。(実はREADME.mdの日本語下書きも兼ねています)

## 市民、あなたは幸福ですか？ (幸福は義務です)

ultra-violet(uv)は~~あなたが幸福かどうかコンピュータが監視するためのツール……~~cronに登録することでユーザーのウィンドウ利用履歴を記録し、可視化するツールです。元々[github.com/sourcegraph/thyme](https://githu.com/sourcegraph/thyme)というメンテされてないツールがあったので、それにテストコードを書いて、cronで使えるように改造しました。その辺りの動機は前述の記事に書かれているので詳しくはそちらをどうぞ。名前の元ネタは某ディストピアもののRPGです。

### 機能

ウィンドウの状態を取得、記録するtrackコマンド、取得したデータを可視化するshowコマンド、その両方を簡単にcron登録するためのwatchコマンドで構成されます。内部的には、x11のWindow情報をwmctrl, xdotoolなどでとってきてパースするというだいぶ原始的な処理を行っています。このコマンドをインストールしてね❤️と教えてくれるだけのdepというサブコマンドもあります。(文字列出力するだけだけどね)。

## ultra-violetの何が良いの？

普段あなたがコンピュータに向かっている時間、いったいどれだけ有効活用できていますか？ 生産的で幸福な活動をしていると言えますか？ その辺りを振り返り、自分を省みるためのツールです。(現状では簡単に改ざんできるけど、開発の方向性次第では本当に監視ツールにもなりうるかもね)

## デモ

![55383F3F-CE33-4D4F-AA12-70583E36A93D.png](https://qiita-image-store.s3.amazonaws.com/0/140543/8819b7e4-4b9c-c19a-9160-21cf3d7577ef.png)

こちらの画像はthyme付属のものですが、可視化部分には手を入れてないので今も同じです。記録したデータをjsonで保存してシンプルに出力してくれます。

## 開発状況

元々あったツール(thyme)からWindowsサポート切ってtrack部分のテストコードとwatchサブコマンドを追加しました。(年末年始はそれだけで吹っ飛んだ)。depコマンドでちゃんと依存関係をなんとかする機能や、バグフィックス、データ圧縮、READMEなどやることは山積みな状態です。

## 使い方

go(1.8以上)とdepがインストールされた状態で、

```shell-session
$ go get github.com/aimof/ultra-violet
$ cd $GOPATH/src/github.com/aimof/ultra-violet/cmd/uv
$ dep ensure
$ go install .
```

crontabへの登録（linux)

```
# crontab -e
* * * * * /path/to/bin/uv watch -d /path/to/dir
```

## まとめ

[github.com/aimof/ultra-violet](https://github.com/aimof/ultra-violet)をよろしくお願いします。価値を感じたら使ってみてください！
独学してエンジニア職についた初級者が中級者になるためにプライベートで実践している学び方

私は独学でエンジニア職についた初級者です。私はプログラミングを始めたのが遅かったため、もっとできることを増やしたい、もっとパワフルなエンジニアになりたいと思い、プライベートでも学ぶ時間を取っています。今私が行なっている学び方は、紹介している人が少ないけれどやっている人は多い学び方、つまり暗黙の常識のような学び方みたいなので、私と同じような初級者と共有するために記事を認めました。上級者の方は、何を当たり前な……と思うかもしれませんが、独学初心者はなかなか知らないことなのでお許しください。

## 学び方

__OSSからコードを拝借して自分なりに機能追加、テスト追加などをする__。その発展として私個人は、__需要はあるのにメンテナンスの停止したOSSを勝手に引き継いで、コンセプトの見直し、テストコード追加、機能変更を行なって公開する__、というようなことをしています。(運用はこれから)

### 注意

この記事は、読者が自分より腕の良いエンジニアのいる組織に所属していることを想定しており、その組織で学んだことをどのようにプライベートで復習するか、に重きをおいているのでご了承ください。

また、新規開発より運用、機能追加、改修、テストなど作ったあとのことに重きをおいています。

### 前書き

なんらかのプロジェクトにコントリビュートすると成長できる、とよく聞きます。その一方で、自分でプロジェクトを運用すると成長できる、ともよく言われます。どこかで働いているからには、前者は大なり小なり満たしているはずなので、後者、自分でプロジェクトを運用するために学びます。私がこれから話す学び方はその前段をなすものです。自分でなんらかのソフトウェアを運用するにはそのためのソフトウェアが必要だけど、どうやってそのソフトウェアを用意するのか、にフォーカスします。

### この学び方にたどり着いたきっかけ

haya14busaさん(だったはず)が2017年のvimconfの発表で、OSSのvimプラグインをフォークしてメンテしていたら、オリジナルの作者から連絡が来て、引き継いで欲しいと頼まれた、的なことをおっしゃってました。この時初めて、github(あるいは他のサイト)のリポジトリを基にして開発をするのは一般的なのだと気付きました。

githubにはfork数の項目がありその数字が多いのだから当たり前といえば当たり前ですが、この時まで意識していませんでした。読むところまではやっていたんですが、そこから先に進むのがなかなか遅れました。

#### 読むのと改修するのは別

一般的初心者からすると、読むのと改修するのは別の行為であるように思います。もちろん改修を加えるためには読む行為が伴いますが、目的意識と重みがただなんとなく読むのとは全然違いました。

自分がコードに手を加える前提でテストを書きながら他人のコードを読むのはなんのとっかかりもないまま読むのに比べて、良い部分悪い部分がはっきり見えます。テストを書きながら読めば設計の良し悪しにも踏み込めます。漫然と読んでいたのが馬鹿らしくなるくらいに真剣にコードを読むきっかけになりました。

#### 新規で作るのともまた違う

私は現状の仕事柄、新規で何かを作る機会はほとんどなく、他人が書いたコードを引き継いで運用、開発することが多いです。一方、前職ではスタートアップで一からコードを書いていました。新規で一から作る行為と、既存のものをより良くする行為は別物です。

初級者から中級者にあがるステップとして、さまざまに経験すべきことはありますが、その多くは既存コードがあるからできることです。個人的には、初級者中級者程度のレベル感だと、新規開発の能力よりも、既存コードありきで何かをする能力のほうが重要であるように感じています。もちろん、キャリア次第ではあります。ただ、運用経験のないエンジニアが書いたコードは技術的負債の塊になりやすい、というのが個人的経験です。

## 私が実践している方法

極論を言えば、好きなリポジトリをフォークなりクローンなりして、好き勝手に遊べばいいのですが、そう言われても戸惑ってしまう人も多いかと思うので、具体的に私が行った方法を書いていきます。

### 需要があり、わかりやすく改修の必要性があるのに、放ったらかしにされているリポジトリを探す

需要があることは重要で、直接的にやる気に結びつきます。需要なくてもいい、って人もいるかもですが、私には必須でした。スター数で判断しました。

わかりやすい改修の必要性の例としては、__テストがない__、__バージョンの壁を乗り越えていない__など考えられます。個人的には、テストがないプロジェクトを探すことをおすすめします。テストは必ず必要ですし、テストを書く技術を身につけることは初級者にとって優先度が高いからです。

放ったらかしにされていることは、改修の必要性と結びついています。コミュニティが活発ならわかりやすい問題点なんてすぐにつぶされちゃいますからね。初級者でもわかるレベルの問題が更新され続けているリポジトリにあるとは考えづらいです。

### 検索ワードはこれだ！

```
created:>2016-01-01 stars:>200 language:Go license:mit
```

これを最終更新の古い順に並べて、興味をもったリポジトリをクローンしました。

それぞれ説明しますと、

* `created`: あまり古いことを学んでも仕方ないと考え指定
* `stars`: 言語のスター数規模と相談しながら適切なものを
* `language`: 使いたい言語を
* `license`: クローンして怒られないものを指定。気をつけましょう。
* 最終更新: 好みが別れるところですが、私はオリジナルとは別のリポジトリを作るつもりだったので、更新が止まっているものを選びました。

## 年末年始の成果物

年末年始はこんな開発をやっていました。

[github.com/aimof/ultra-violet](https://github.com/aimof/ultra-violet)

[github.com/sourcegraph/thyme](https://github.com/sourcegraph/thyme)というリポジトリを元に改造しました。改造と言ってもまだテストを書いてcron対応しただけですが……

私が何をやっていたかはリポジトリの方を見ていただくとしてまとめにうつります。。

## まとめ

先ほどテストがないリポジトリを探すと良いという話をしました。自分でリポジトリを運用するとテストの有り難みが夜９区わかっていいです。改造しようにも影響範囲がわからないと思わぬバグを生むこと多数です。とりあえず一機能削除してみたら案の定バグったから、テストを書いて改造できる状態を整える、という流れになります。

他人のリポジトリを用いて自分でそれなりのサイズのリポジトリを管理するという試みは、程度の差こそあれ初級者にとて大きな学びをもたらします。私自信もまだまだ未熟ですが、正月の間だけでもかなり成長したとかんじています。

ぜひ試してみてはいかがでしょうか？
pyenv、pyenv-virtualenvインストールの個人メモ

pyenv、pyenv-virtualenvインストール手順をコピペーするための個人メモである
Linuxとで共通で使用のため、homebrewは使わない

## pyenvのインストール

```bash:bash
git clone https://github.com/pyenv/pyenv.git ~/.pyenv \
 && echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile \
 && echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile \
 && echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

## pyenv-virtualenvのインストール

```bash:bash
git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv \
 && echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
```

## 確認

```bash:pyenvとvirtualenvのversion確認
$ source ~/.bash_profile  # 確認のため、`.bash_profile`を読込

$ pyenv --version
pyenv 1.1.3-33-g48aa0c4

$ pyenv virtualenv --version
pyenv-virtualenv 1.1.1 (python -m venv)

```

以上。
Unityでリンクスタートをつくってみた


SAOより「リンクスタート画面」の長めバージョンを作成
https://www.youtube.com/watch?v=stGJWLFh6vM

```csharp:LinkStart.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LinkStart : MonoBehaviour {

	[SerializeField] GameObject m_godRayPrefab;
	[SerializeField] GameObject m_godRay;

	float rayStartPos = 200f;
	float tunnelRadius = 12f;

	float godraySpeed = 80f;
	float godraySpeedRate = 0.5f; // レイの速度を徐々に速く

	float minWaitTime = 0f;
	float maxWaitTime = 0.2f;
	float waitTimeRate = 0.002f; // 生成スパンを徐々に短く

	void Start() {
		StartCoroutine ("Fire");
	}

	IEnumerator Fire() {
		for(int i = 0; i < 1000; i++) {

			// position
			Vector3 pos = Random.insideUnitCircle * tunnelRadius;
			pos.z = rayStartPos;

			var godRay = Instantiate (m_godRayPrefab, pos, Quaternion.Euler(-90f,0f,0f));
			godRay.transform.parent = m_godRay.transform;

			// color
			Color color = new Color(Random.value, Random.value, Random.value);
			godRay.GetComponent<Renderer> ().material.color = color;

			// addforce
			godRay.GetComponent<Rigidbody>().AddForce(
				godRay.transform.up * godraySpeed * Random.Range(1f,1.5f),
				ForceMode.VelocityChange
			);

			if (minWaitTime < maxWaitTime) {
				godraySpeed += godraySpeedRate;
				maxWaitTime -= waitTimeRate;
			} else {
				// 生成スパンが最短になったらシーンをロード
				Invoke ("GoNextScene", 5f);
			}

			yield return new WaitForSeconds(Random.Range(minWaitTime,maxWaitTime));
		}
	}

	void GoNextScene() {
		// コルーチンを止める場合
		// StopCoroutine ("Fire");

		// fade
		SteamVR_LoadLevel.Begin("NextScene");
	}
}
```

トーラス形のトンネルをつくり、その内側に生成されたレイは削除するようにすることで、自分の周りだけをレイが飛んでいくようにした。
業務Powershell：テンプレExcelファイルにTSVを貼り付け別名で保存する。

# はじめに 
## どういった業務シーンで使用されているか。

* データベースから日次でTSVファイルを作成している。
    * こちらは自動化済み
* Excelファイルの特定シートにそれを貼り付ける作業を手動で行っている。
    * 更新したシートをVLOOKUPして書式や計算がついたシートを利用する形
* データ接続による更新は余計なダイアログが出るので不可
    * 同様の理由でExcelマクロも不可
* 無論Windows標準のツール＋Officeの範囲で処理。

## 解決方法

俺たちの銀の弾丸、リーサル・ウェポン、 **PowerShell** の出番である。

## 実行環境

* Windows7 SP1 64bit
* PowerShell 2.0

# 実装

## ソース

```powershell

$templateFile = "C:\hoge.xlsx"
$saveFile = "C:\today.xlsx"
$tsvSheetName = "tsvsheet"

# Excelを起動
$excel = New-Object -ComObject Excel.Application
try {
    # 非表示、警告なしに設定
    $excel.Visible = $false
    $excel.DisplayAlerts = $false
    # テンプレートファイルを元に新しいファイルを作成
    $book = $excel.Workbooks.Add($templateFile)
    try{
        # 展開用シートを選択
        $sheet = $book.Sheets.Item($tsvSheetName)
        try{
            # シートをアクティブにしA1を選択する。
            $sheet.Activate()
            $sheet.Range("A1").Select()
            # 文字コードをSJISに変更する。
            $OutputEncoding = [Console]::OutputEncoding
            # CSVファイルをクリップボードに展開する
            Get-Content $tsvFile | Clip
            # 貼付けを行う
            $sheet.paste()
            # US-ASCII に戻す
            $OutputEncoding = New-Object System.Text.ASCIIEncoding
        }catch{}
        finally{
            # シートを開放する。
            [System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet)
        }
        # 新しい名前でファイルを保存
        $book.SaveAs($saveFile)
    }catch{}
    finally{
        #ブックを開放する。
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
    }
}catch{}
finally{
    # Excel の終了
    $excel.Quit()  
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
}

```

## 参考にした記事

PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい
https://qiita.com/miyamiya/items/161372111b68bad0744a
Excelファイルを C# と VB.NET で読み込む "正しい" 方法
https://qiita.com/midori44/items/acab9106e6dad9653e73

## ちょっとだけ解説

### Excel.exeの開放について

　独学でExcelとからんだC#やVB.NETでの開発経験がある方であれば、必ず一度は通る**Excel.exeプロセス残りまくり問題**。現在では上記で記載した @midori44　さんの簡潔かつわかりやすい記事にスマートな最適解があります。
しかし、**業務PowerShellの舞台では、上記記事の最適解は使用できません。**

今回の様に日に一回の作業を自動化した際する際には、プロセス開放をお漏らしせずやる必要があるわけですが、`PowerShell2.0` から `try{}chatch{}finally{}` 構文に対応しているので、@midori44さんの記事で **それでもやりたいなら** と記載して頂いている方策をPowerShellでは利用可能となっています。

### クリップボードを利用したExcelファイルへの展開について

テキストの全データを展開するため、手っ取り早い手段としてクリップボードを経由する方法を利用しています。
`PowerShell5.0` 以降であれば `Set-ClipBoard` を利用できますが、Windows7標準の`PowerShell2.0` での利用を最優先としていますので、今回はパイプで `Get-Content` した内容を `Clip` へ渡しています。
codeanywhere.comでコード書き＆コンパイル＆実行

#オンラインでssh使えるっていいね。

##■codeanywhereへ登録
捨てアドでいいから，サインアップする。
いつもの通りで登録できる。

##■ブラウザでloginする。
loginすると，画面中央でぐるぐる回る。それが止まると使える。

##■vi, ed 使えます。

こんなかんじ↓で使えます。
使ってるキーボードがbluetooth接続だからか，キー入力に対しての反応が遅い。
あと，コマンドが限られる。/usr/local/binには何もない（ディレクトリは存在する）。
/usr/binにあるコマンドを使うことになる。

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/220344/e8649977-dba6-d276-56a4-2ac633753a52.jpeg)
view and __setitem__ sample in numpy

```python
class Symetric(np.ndarray):
    def __setitem__(self, index, value):
        print("==setiitem:"+str(index)+"==")
        i,j = index
        super(Symetric, self).__setitem__((i,j), value)
        super(Symetric, self).__setitem__((j,i), value)

class Symetric0(np.ndarray):
    def __setitem__(self, index, value):
        print("==setiitem:"+str(index)+"==")
        i,j = index
        #super(Symetric, self).__setitem__((i,j), value)
        #super(Symetric, self).__setitem__((j,i), value)

def setX(Z):
    print("====setX====")
    X = np.diag(Z.diagonal())
    print(X)
    X = np.asarray(Z + Z.T - X)
    print(X)
    return X

def symetric(Z,cn):
    print("====symetric====")
    return Z.view(cn)

def ae(a,b):
    print(a)
    print(b)
    print(np.array_equal(a,b))

Z = np.random.randint(0,10,(5,5))
print(Z)
print(Z.T)
print(Z.diagonal())
XZ = setX(Z)
S0 = symetric(XZ,Symetric0)
S0[2,3] = 42
ae(XZ,S0)
S = symetric(XZ,Symetric)
S[2,3] = 42
ae(XZ,S)
ae(setX(Z),S)
```
* e.g.

```
[[8 0 1 5 5]
 [8 1 2 6 7]
 [7 1 5 0 5]
 [7 9 9 7 9]
 [9 2 6 9 7]]
[[8 8 7 7 9]
 [0 1 1 9 2]
 [1 2 5 9 6]
 [5 6 0 7 9]
 [5 7 5 9 7]]
[8 1 5 7 7]
====setX====
[[8 0 0 0 0]
 [0 1 0 0 0]
 [0 0 5 0 0]
 [0 0 0 7 0]
 [0 0 0 0 7]]
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5  9 11]
 [12 15  9  7 18]
 [14  9 11 18  7]]
====symetric====
==setiitem:(2, 3)==
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5  9 11]
 [12 15  9  7 18]
 [14  9 11 18  7]]
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5  9 11]
 [12 15  9  7 18]
 [14  9 11 18  7]]
True
====symetric====
==setiitem:(2, 3)==
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5 42 11]
 [12 15 42  7 18]
 [14  9 11 18  7]]
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5 42 11]
 [12 15 42  7 18]
 [14  9 11 18  7]]
True
====setX====
[[8 0 0 0 0]
 [0 1 0 0 0]
 [0 0 5 0 0]
 [0 0 0 7 0]
 [0 0 0 0 7]]
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5  9 11]
 [12 15  9  7 18]
 [14  9 11 18  7]]
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5  9 11]
 [12 15  9  7 18]
 [14  9 11 18  7]]
[[ 8  8  8 12 14]
 [ 8  1  3 15  9]
 [ 8  3  5 42 11]
 [12 15 42  7 18]
 [14  9 11 18  7]]
False
```
# Refs.
* [\_\_setitem\_\_](http://atkonn.blogspot.jp/2008/02/python-python50.html)
* [array_equal](http://oppython.hatenablog.com/entry/2015/05/29/020902)