OmniAICreator/Qiita-1.07M huggingface dataset:
RxJava2 めも(Single, Complete, Maybe, Observable, Flowable, Subject, Processor)


# Single, Complete, Maybe, Observableの使い分け

| 名前 | 説明| 使えるメソッド |
|-----------|------------|------------|
| Single| 値1つ| onSuccess(a: Any)/ onError(e: Throwable)|
| Complete| 値なし| onComplete()/ onEroor(e: Throwable)|
| Maybe| 値1つor 値なし| onSuccess(a: Any)/ onError(e: Throwable)/ onComplete() |
| Observable| 値たくさん | onNext(a: Any)/ onError(e: Throwable)/ onComplete() |

# Observable, Flowable, Subject, Processor使い分け


| | BackPressureなし| BackPressureあり |
|-----------|------------|------------|
| -able; 購読される　| Observable| Flowable|
| -er; 購読する　| Observer| Observer |
| -erであり、-ableでもある; 購読することも、されることもできる| Subject| Processor|

FlowableはObservableの進化系。
Flowableは、BackPressureなるものを調整して、onNestででてくるデータのスピード調整などができる。

Subect, Processorは、それぞれObservable, Flowableの進化系。
subscribeすることもできるし、subscriberとしてobserveすることもできる。


# 参考文献

- RxJava2.0 Observable, Single, Maybe, Completableの使い分けメモ
https://qiita.com/takahirom/items/f3e576e91b219c7239e7

- Understanding RxJava Subject — Publish, Replay, Behavior and Async Subject
https://blog.mindorks.com/understanding-rxjava-subject-publish-replay-behavior-and-async-subject-224d663d452f

- RxJavaで安全にイベント通知を行うためのRxRelay
https://qiita.com/kakajika/items/0db64ec6de370d0613f1

- Rxで知っておくと便利なSubjectたち
https://qiita.com/ralph/items/f7205c8171826cc2153b#serializedsubject
Android Mediaplayerにユーザーエージェントを付与する。

#概要
もしかしたらそれほど需要はないかもしれないけど半日探して情報がなかった為忘備録的に投稿。

##普通はMediaplayerにsetDataSourceでデータのパスを渡す。
こんな感じに。

```
mediaPlayer.setDataSource(url);
```

でもこれだとユーザエージェント認証付きのサーバーに保存してあるファイルにアクセスできない。

##答え

```
Uri uri = Uri.parse(url);　//まずURI変換する
Map<String,String> map =new HashMap<String,String>(){
{
　　put("User-Agent", "originalagent"); }//Mapでヘッダー情報を作る
};
mediaPlayer.setDataSource(this,uri,map);//引数1Context 引数２　URI　引数３　ヘッダー情報
```
な感じでsetDataSourceしてやるとユーザーエージェント付きでアクセスしてくれる。
RailsのフォームでEnterキーを押したときのsubmitを防ぐ術

# はじめに
フォームでEnterキーを押すと、submitされてしまう。
本来であれば、キーボード操作だけで処理が完結し、便利だと感じるが、逆に「まだ送信したくなかったのに...!」と感じるときもある。
今回はEnterキーでのsubmitを無効化し、該当するボタンをクリックしたときにだけ、submitが実行されるようにする方法を記す。

※Chromeでのみ検証しています

# 環境
- Rails `5.2.1`
- テンプレートエンジン `slim`


# やったこと

```ruby:デフォルト
= form_with model: @user, url: users_path, method: :post, local: true do |f|
  = f.text_field :name
  = f.submit '送信する'
```

このときに通常であればsubmitの処理が走るので、代わりに`button`を使う。

```ruby:buttonバージョン
= form_with model: @user, url: users_path, method: :post, local: true do |f|
  = f.text_field :name
  = f.button '送信する', type: 'button', onclick: 'submit();' # typeとonclickを追加
``` 

buttonにすることで、Enterでのsubmitが発生しないようになり、onclickを付与することでボタンクリック時に送信されるようになる。

# ちなみに
生のHTMLで記述を加える場合は、下記の記事も参考になる。
[Enterキーを無効にする方法](https://qiita.com/mimoe/items/89b317be5e38bfbc44ee)
奈良高専吹奏楽部のIT化

# はじめに

この記事は高専IT系部活 #kosenit Advent Calendar 2018の22日目の記事です．

はじめまして，とろんぽっと.naraです．
私は奈良高専で情報処理研究会で活動している傍ら吹奏楽部でトロンボーンを吹いています．
所属する奈良高専吹奏楽部で譜面を管理するのにあたり **Excel** から **Spreadsheet + GoogleAppsScript** に変えたお話です．

# 今まで
奈良高専吹奏楽部では「譜面管理」という購入した譜面の管理を行う役職があります．私の前々任者，部が所有している譜面のリストを紙媒体からExcelにしました（詳細情報は紙媒体）
しかし，`Excel`では情報を登録するには **Excelを使わなければいけない！**
　「なぜ激重ソフトを使わなくてはならないのか．理解に苦しむ．」
ってなわけで早速システムを開発することに

# 開発
システムの設計を始めた私ですが，最初は，`PHP+MySQL`で吹奏楽部サーバー上にシステムを構築しようと思いました．

が，ここで問題発生．そう，ここは吹奏楽部．引継ぎしようにも**情報をバリバリできる人がほぼいない！**（私より年下でプログラミング等ができる人間は1人!!）
`SQL`の保守は知識がないとできない．さぁどうしよう． 
  ........そうだ，Spreadsheetにしよう．`GAS`なら保守を放置されても大丈夫だろう．
ってなわけでGASによる構築へ

こんな感じ
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/171487/9b8a925f-1b4b-7dcc-cd8d-1f0dc1bdcada.png)

# 遊ぶ
開発終盤に「リストを表示するページはAPIサーバー用意してAPIでデータを取得すればいいじゃん」という遊び心によりAPIサーバーを用意することに．GASでjsonはかせるのにちょいちょい手間どいながらAPIサーバーなるもの完成．リストページは`Vue.js`で開発

# まとめ
**奈良高専吹奏楽部は全国で唯一APIサーバー保持している！**（のかな？） 
あと，数年に一人でいいからプログラム書ける人来てくれないかな～

今は即席で書いたコードを見直しつつきれいにしています．暇があれば譜面リスト以外のシステムを組みたいなぁ

[高専IT系部活 #kosenit Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kosenit)
vue-cli 3 の TypeScript環境で Prettier を使う

チーム開発する上で、コーディング規約は重要です。
linter や formatter などを用いてコーディング規約を実装するのが一般的かと思います。

本記事では vue-cli 3 環境での Prettier (code formatter) 実装について説明しています。
とは言っても設定内容を公開するだけですが。

# Prettier 環境の準備
Prettier と webpack のプラグインをプロジェクトにインストールします。`npm`の代わりに`yarn`でも構いません。

```shell
$ npm i -D prettier prettier-webpack-plugin
```

# vue.config.jsを編集
vue-cli 3 で作成したプロジェクトは、webpackの設定をvue.config.jsファイルに記載することができます。

[Working with Webpack | Vue CLI 3](https://cli.vuejs.org/guide/webpack.html)

下記の記述を行うとbuild毎にPrettierが実行されます。

```js:vue.config.js
const PrettierPlugin = require('prettier-webpack-plugin')

module.exports = {
  configureWebpack: {
    plugins: [
      new PrettierPlugin({
        singleQuote: true,
        semi: false,
        tabWidth: 2,
        printWidth: 200
      })
    ]
  }
}
```
# 備考
Prettierが`.vue`と`.ts`に対応しているため、私はこれでTypeScriptで書いた`.vue`ファイルをformatしています。

別途 linter は vue-cli 3 標準の tslint 設定を少しチューニングしたものを利用し、エディタでエラー表示するようにしています。

エディタの formatter 機能を使う手もありますが、チーム開発する場合、個々のエディタを指定するようなことはしたくないので、プロジェクトの方で設定できるのがいいですね。
ReactNativeでGraphQL開発をする為のApolloClient導入手順

## はじめに
今年はGraphQLをメインに動いていきました。
フロントエンドでGraphQLを使うにはApolloClientがオススメです。
今回はReactNativeにてApolloClientを使う方法をご紹介します。
結構情報が古くて最初は導入に時間がかかってしまった為、参考になればと思います。

#### 参考記事
[Apollo公式 Integrating with React Native
](https://www.apollographql.com/docs/react/recipes/react-native.html)
※こちら古いのでこのまま行うとバグ出ますw

以下２つは組み込みでとても楽になります。
Queryタイプと関数タイプがあるのですがQueryタイプがオススメです。

## 導入手順
### 1. ApolloClientのインストール
今回Clientは `apollo-client`ではなく`apollo-boost`を使います。
`react-apollo`は`Provider`として使います。

```bash
yarn add apollo-boost
yarn add react-apollo
```

### 2.GraphQLのインストール
GraphQLを使うのでGraphQLと中でタグの定義が出来る様に`graphql-tag`をインストールします。

```bash
yarn add graphql
yarn add graphql-tag
```

### 3.ReactNativeにApolloClientを組み込む
apollo-boostを使い、Clientを生成して、ApolloProviderでナビゲーションに渡しています。
※Reduxと同じ感覚。

この際、ユーザー認証を入れたりしたい場合は、ApolloClientにプロパティにて定義する必要があります。

```react
import ApolloClient from "apollo-boost";
import { ApolloProvider } from "react-apollo";

const client = new ApolloClient({
  uri: "http://127.0.0.1/graphql"
});

const Navigation = () => (
  <ApolloProvider client={client}>
    <Provider store={store}>
      <AppNavigation />
    </Provider>
  </ApolloProvider>
);
```

### 4.Queryの使用方法
Queryの使用方法は以下となります。
実際にはgqlはとても長いのと共通で使うので、別ディレクトリ「gql」をさくせいして、読み込む形がベストです。

```react
import gql from "graphql-tag";
import { Query } from "react-apollo";

const GET_DOG_PHOTO = gql`
  query Dog($breed: String!) {
    dog(breed: $breed) {
      id
      displayImage
    }
  }
`;

const DogPhoto = ({ breed }) => (
  <Query query={GET_DOG_PHOTO} variables={{ breed }}>
    {({ loading, error, data }) => {
      if (loading) return null;
      if (error) return `Error!: ${error}`;

      return (
        <img src={data.dog.displayImage} style={{ height: 100, width: 100 }} />
      );
    }}
  </Query>
);
```

### 5.Mutationの使用方法
Mutationの使用方法もQuery形式ならとても簡単です。
以下の形で出来ます。

```react
import gql from "graphql-tag";
import { Mutation } from "react-apollo";

const ADD_TODO = gql`
  mutation AddTodo($type: String!) {
    addTodo(type: $type) {
      id
      type
    }
  }
`;

const AddTodo = () => {
  let input;

  return (
    <Mutation mutation={ADD_TODO}>
      {(addTodo, { data }) => (
        <div>
          <form
            onSubmit={e => {
              e.preventDefault();
              addTodo({ variables: { type: input.value } });
              input.value = "";
            }}
          >
            <input
              ref={node => {
                input = node;
              }}
            />
            <button type="submit">Add Todo</button>
          </form>
        </div>
      )}
    </Mutation>
  );
};

```
Sigfox CallbackとAT&T M2X連携

[AT&T M2X](https://m2x.att.com/)とは、AT&Tが開発したIoT Platformです。ここでは、Sigfox Callbackを用いてAT&T M2Xと連携する方法を説明します。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/172313/1172472c-4ec9-6551-bc6f-fd81eca1ebc3.png)

#AT&T M2X側の設定
下記URLからSIGN-UPします。
https://m2x.att.com/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/c0376983-7712-ea57-c12e-9e91ec115b36.png)

##Deviceの作成
まずは、Sigfoxデバイスに紐づけるDeviceをM2X上で作成します。
画面上の**Create Device**ボタンをクリックすると、下記ダイアログが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b4d802a8-754b-8382-0320-3c0baf4935c1.png)
ここでは、*Device Name*と*Device Serial*を入力しCreateします。
Deviceが作成されると下図のように、M2X上で作成したDEVICEのIDやAPI KEYが生成されます。**PRIMARY ENDPOINT**と**PRIMARY API KEY**は、この後のSigfox Callbackの設定で使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/29704dd4-9670-44d5-0541-64111e0ff0fe.png)

#Sigfoxクラウド側の設定
##Sigfox Callbackの作成
[Sigfoxクラウド](https://backend.sigfox.com/)で、対象デバイスが属するDeviceTypeのCallbackを作成します。Sigfox Callbackについては、[こちら](https://qiita.com/ghibi/items/53259381a30363538a6d)を参照ください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/cb7eb320-2476-57e1-80ec-932e87181d4c.png)
ここで、M2X上でDeviceを作成した時に生成された**PRIMARY ENDPOINT**と**PRIMARY API KEY**を元にSigfox Callback設定項目を入力します。

|項目|設定|
|:---|:---|
|Url patern|`http://api-m2x.att.com/v2/devices/{M2X上でのDEVICE ID}/update`|
|Use HTTP Method|POST|
|Headers|header: X-M2X-KEY / value: {M2X上でのPRIMARY API KEY}|
|Content type|application/json|
Bodyは、

```body.json
{
    "values": {
        "payload": "{data}",
        "device": "{device}",
        "temperature": "{customData#temp}"
    }
}
```
とします。temperatureは[Custom Payload Config](https://qiita.com/ghibi/items/361ea55ea04658b4193c)を参考に設定してください。

#再びAT&T M2A側の設定
##Streamの作成
Sigfox Callbackで設定したデータ項目ごとにM2X上でStreamを作成する必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/89dff94b-56ce-f6ba-2f5a-c1d5c23f93ce.png)
[Add Stream]ボタンをクリックし、Streamを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/d59307bd-7945-1421-5d11-acdcf62c3927.png)
Add Stream画面では、Stream ID、Display Name、Stream Typeを設定します。
Stream IDは、Sigfox CallbackのBodyで設定した項目と一致する必要があります。
今回の例では、下記3つのStreamを作成します。

|Stream ID|Display Name|Stream Type|
|:---|:---|:---|
|payload|Payload|Non-Numeric|
|device|Device|Non-Numeric|
|temperature|Temperature|Numeric|

すべてのStreamを作成すると、SigfoxクラウドからAT&T M2Xへのデータ転送が成功し、Non-NumericのStreamはリスト形式で、NumericのStreamは時系列グラフで転送されたデータを可視化することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b2728e63-f8e8-5ea8-0d25-31a00a86f526.png)


Callbackがうまくいかない場合は、Sigfoxクラウドで該当デバイスのMESSAGES画面にあるCallbacksステータスを確認してください。赤ボタンになっている場合はCallbackに失敗している例であり、ボタンを押すとエラー内容を確認することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/5b3daad9-9ca3-1afd-b96a-17d934e9ec83.png)
M2Xでは、**Stream**とCallbackするときのJSONに定義した**values**が一致しないと、上図のようにHTTP:422エラーが発生します。

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
Arduinoで小型ステッピングモータを動かす。半田付け不要

#Arduinoで小型ステッピングモーターを動かして見る
##購入したもの
Longruner　5個セット　arduino用　電圧DC　5V　ステッピングモーター+28BYJ-48　ULN2003ドライバテストモジュールボード　電作キット　LK67
https://www.amazon.co.jp/gp/product/B0727P4L4H/ref=oh_aui_detailpage_o08_s00?ie=UTF8&psc=1
![stpmt.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/fde69ac4-ac7d-20ab-5e79-7922f81e5a3a.jpeg)
ステッピングモータとドライバがコネクタで繋がるので便利。ステッピングモーターとドライバのセットで約２００円と安い

Arduino Uno
https://www.amazon.co.jp/gp/product/B013QV28CW/ref=oh_aui_detailpage_o05_s00?ie=UTF8&psc=1
![uno.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/3363ac1c-e480-e9b8-6527-780fbc23a12b.jpeg)
中華製で１個６００円くらいで安い。遊ぶのに良い。

KKHMF ブレッドボード・ジャンパーワイヤ（オス-オス）（10cm）40本
https://www.amazon.co.jp/gp/product/B0177W93DS/ref=oh_aui_detailpage_o07_s00?ie=UTF8&psc=1
![sen.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/9e062c86-181c-846c-5476-f76e193cf2e3.jpeg)
ステッピングモーターのドライバとArduinoの接続に使う。１セットに６本使用。

##配線
①ステッピングモーターから出ているケーブルをドライバ基板につなぐ
![1つなぐ.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/5ec37f85-3f3b-fa70-f49a-181f184748bb.jpeg)
②ドライバ基板とArduinoをつなぐ
　ドライバ基板の「-」とArduinoの「GND」
　ドライバ基板の「+」とArduinoの「5V」
　ドライバ基板の「IN1」とArduinoの「D8」
　ドライバ基板の「IN2」とArduinoの「D9」
　ドライバ基板の「IN3」とArduinoの「D10」
　ドライバ基板の「IN4」とArduinoの「D11」をつなぐ
![２.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/f89c55ff-56d4-9297-e9d3-bf680f44e178.jpeg)
![３.jpg](https://qiita-image-store.s3.amazonaws.com/0/10836/af9f309b-97ca-69c3-6e7c-f4ef8c1db894.jpeg)
##ソース
Arduinoに以下のコードを書き込む

```c:stepping_moter.ino
#include <Stepper.h>

const int number_of_steps = 32;
const int steps_output_rev = 32 * 64; // 2048  減速比 1/64
const int CW = 1;
const int CCW = -1;

Stepper stepper(number_of_steps, 8, 10, 9, 11);//制御に使用するPIN(8-11)を指定

void setup() {
  stepper.setSpeed(300);
  //stepper.setSpeed(1000);//１分間の回転数
}

void loop() {
  int steps;

  steps = get_step_by_rev(CW, 1);
  stepper.step(steps);
  steps = get_step_by_rev(CCW, 1);
  stepper.step(steps);
}

int get_step_by_rev(int dir, float rev){
  return dir * (steps_output_rev * rev);  
}
```
メモ：「３０日でできる！OS自作入門 」8日目

## マウス制御と３２ビットモード切り替え

1) マウスからのデータ４バイトを読み取るため、ステートマシン的なのを作る
- phase1(0xfa) to phase4、揃ったら 3バイトを表示する

![スクリーンショット 2018-12-22 15.33.51.png](https://qiita-image-store.s3.amazonaws.com/0/109145/6483c2e8-5519-7e82-a3e6-23e203cd38ce.png)

２） マウスのデータをデコードする関数を追加し、phase 判定はその関数内でやる。
- enable_mouse に phase の初期化 0 にする
- 3バイトのバッファと、phase を持つ構造体を利用

３） マウスの解読
- ボタンはbuf[0]の下位３bit
- x,y は buf[1] と　buf[2]
    - x は buf[0] & 0x10 の場合、|= 0xffffff00 
    - y は buf[0] & 0x20 の場合、|= 0xffffff00 
    - y は更に反転する y = -y

![スクリーンショット 2018-12-22 15.51.01.png](https://qiita-image-store.s3.amazonaws.com/0/109145/94fe10df-babe-442a-6f8a-3bfc3615243b.png)

4) 動けマウス
- 画面の座標を超えたものをリセットしながらマウスのx, yによって描画していく感じ

![mouse-input.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/a319c3e8-5b64-33f7-0897-986cf523eb8f.gif)

だたこんな処理は対応していない

![スクリーンショット 2018-12-22 15.56.25.png](https://qiita-image-store.s3.amazonaws.com/0/109145/6e07d0ae-67f3-057c-6f7f-8b12e81168b7.png)

別途やるとのこと

５） 32ビットモードの説明
- A20 GATE の設定
    - キーボードと同じく、0x60のポートに, 0xdf (A20有効）の命令を送る
    - 1MB以上のメモリを使えるようになる、おぉ
- A20 有効化したあと、完了まで待つ
- Protected Mode に移行 `[INSTRSET "i486p"]`

```
LGDT [GDTR0]
MOV EAX, CR0
AND EAX, 0x7fffffff ; ページングを使わない
OR EAX, 0x00000001 ; プロテクトモード
MOV CR0, EAX
JMP pipelineflush ; すぐJMPする必要ある、機械語の解釈が変わるため

pipelineflush:
  MOV AX, 1*8 ; GDT + 1 セグメント相当
  MOV DB, AX
  MOV ES, AX
  MOV FS, AX
  MOV GS, AX
  MOV SS, AX
```

OSのメモリマップをこんな感じにするために色々 memcpy する

```
0x00000000 - 0x000fffff : 起動中一時利用、起動後空き (1M); BIOS, VRAM とかでも使われてる
0x00100000 - 0x00267fff : Floppyの内容 (1440k); 0x7c00 -> 0x00100000 (512), 0x8200 -> 0x00100200
0x00268000 - 0x0026f7ff : 空き (30k)
0x0026f800 - 0x0026ffff : IDT (2k)
0x00270000 - 0x0027ffff : GDT (64k)
0x00280000 - 0x002fffff : bootpack.hrb (512k)
0x00300000 - 0x003fffff : スタックなど
0x00400000 -            : 空き
```
日本語WordNetを知る

日本語WordNetは概念辞書です。
概念同士の関係や概念に対応する言葉の定義が分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44912/7d147146-9663-75af-71d1-22188be6feb9.png)

本家のWordNetが元になっていて、日本語だけでなく英語も含まれています。
本家WordNetのドキュメントと日本語WordNetを照らし合わせると、違うところも多いので、日本語WordNetのデータ構造から中身を把握していくことにします。

日本語WordNet - http://compling.hss.ntu.edu.sg/wnja/jpn/index.html
本家WordNet - https://wordnet.princeton.edu/
SUMO - http://www.adampease.org/OP/

## 日本語WordNetのDB定義

日本語WordNetのSQLite版をダウンロードして、DB Browser for SQLiteで見るとこうなっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44912/436f75bf-08bc-0b1c-d5d5-732bc18dce6e.png)

## 主要な定義

これだけおさえておけば、DBを使うことができます。

### word
単語の文字列の定義です。同じ概念に結びついていることは、同義語であることを示します。
概念とはsenseを通じてつながっています。

|キー|説明|
|:-:|:-:|
|wordid(int)|単語ID(8桁の数字)
|lang|言語(jpn:日本語, eng:英語)
|lemma|文字列
|pron|読み方(DBではすべてNULL)

### sense
概念と単語を結び付ける定義です。
どういう呼び方をするかを決める情報だと思われます。

|キー|説明|
|:-:|:-:|
|synset|参照概念ID
|wordid(int)|参照単語ID
|lang|単語の言語
|rank|不明
|lexid(int)|不明(DBではengのみ1以上の値が入っている)
|freq(int)|不明(DBではengのみ0以上の値が入っている)
|src|不明

### synset
概念の定義です。
概念が同じ単語は同義語、そうでない単語はリンクによる関連を持っている、もしくは持っていない単語です。

|キー|説明|
|:-:|:-:|
|synset|概念ID(8桁の数字-品詞ID)
|pos|品詞ID
|src|不明

### synlink
概念間の関係の定義です。
関係の種類については、以下が分かりやすいと思います。
http://www.sist.ac.jp/~kanakubo/research/knowledge_representation/concept.html

|キー|説明|
|:-:|:-:|
|synset1|リンク元の参照概念ID
|synset2|リンク先の参照概念ID
|link|リンクID
|src|不明

実際のリンクの意味はこちら。
http://compling.hss.ntu.edu.sg/wnja/jpn/detail.html

### pos_def
品詞の定義です。品詞IDは1文字の小文字です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44912/b90d1f9c-39d6-2fde-24bc-8fbda37a58c5.png)

### link_def
リンクの定義です。リンクIDは4文字以下の小文字です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44912/86ba0ce6-f3c2-11a7-edbe-cb23d977ac01.png)

### synset_def
概念の例文の定義です。
これはなくても使えますが、例文が集まって概念が成り立っていると考えると、重要な情報です。

|キー|説明|
|:-:|:-:|
|synset|参照概念ID
|lang|例文の言語
|def|例文
|sid|不明


これ以外の情報はデータが不十分であったり、特に利用方法が明記されていなかったりしますが、とりあえず以上の情報をおさえておけば日本語WordNetを利用できると思います。

## ImageNetとの関係

ImageNet - http://image-net.org/index

Deep Learningでよく使われている画像ライブラリであるImageNetは、WordNet 3.0のsynsetで分類されています。
最新のWordNetのバージョンは3.1で、synsetのコードが変わっているらしく、ImageNetと対応付かないみたいなのですが、日本語WordNetは3.0がベースなので問題ありません。

synsetのIDは同じですが、品詞IDの並べ方が異なっており、ImageNetでは以下のように指定する必要があります。

    品詞ID + 8桁のID

例えば、"ネコ"の概念名は"true_cat"、synset IDは02121620、品詞IDは"n"なので、ImageNetのURIは以下のようになります。

http://image-net.org/synset?wnid=n02121620

## 日本語WordNetにアクセスするpythonライブラリ

概念オブジェクトをキーに操作するライブラリです。
既存の情報にアクセスするだけでなく、概念や単語を追加することもできます。

https://github.com/hiraokusky/snark
Elastic Stack にふれて

# きっかけ
それまでサーバやアプリケーションのログをためるため elasticsearch 2.x を使っていました。サーバ9台（マスターノード2台、データノード6台、検索ノード1台）でクラスタを組んで運用していたのですが、2年ほどたってくるとindexやdocumentの数が増えてきて常にクラスタの負荷が高い状態になってしまっていました。うーん、なんとかしないとなと考えていたところ少し余裕ができたのでクラスタごと置き換えることにしました。とはいえ潤沢に時間があるわけではないのでデータの移行は考えず、新しいクラスタを作ってそちらに新しくデータを流しはじめることにしました。

# Elastic Stackってなんだろう？
さてさてまずは情報集めです。情報を集めたときの最新バージョンは6.4でそれまで elasticsearch 2.x を使っていたのでだいぶバージョンアップが行われていました。とくに5.xからは elasticsearch 関連製品をまとめて Elastic Stack と呼ぶようになっており浦島太郎状態です。インストールマニュアルをみるといろいろな製品をインストールする必要があり以前よりハードルがあがっているなと感じながら、それぞれの役割を整理していきました。


| 製品名       | 役割 | 可動環境 |
|:-----------------|:------------------|:------------------|
| Elasticsearch    | データ保存と検索 | Elastic Stackクラスタ |
| Kibana | データの可視化 |  Elastic Stackクラスタ |
| Logstash | データの変換 | Elastic Stackクラスタ |
| Beats | データの収集エージェント | サーバ |

可動環境はそれぞれの製品をどの環境にインストールして使うかです。Beats以外はElastic Stackクラスタを組むサーバに、Beatsはデータを収集したいサーバにインストールして使うことにしました。BeatsはさらにFilebeat、Metricbeatなど複数の製品にわかれています。


# クラスタ構成
実際に新旧環境でデータの流れがどうかわったのかを図で説明します。

## 旧環境
サーバにインストールしたfluentdからfluentdのクラスタにデータを転送して、そこからElastichseachクラスタにデータを転送していました。

![elasticsearch2x.png](https://qiita-image-store.s3.amazonaws.com/0/103201/4ec118a1-4d6e-4e22-b4a9-a2f77d04ab8b.png)


## 新環境
サーバにインストールしたBeatsからElastic Stackクラスタにデータを転送するようになりました。

![elasticseach6.4.png](https://qiita-image-store.s3.amazonaws.com/0/103201/5c65a8b6-235d-c2aa-212e-8215f2993815.png)


# まとめ
情報を整理する前は扱いが難しくなった印象があったのですが、整理してみるとそんなことありませんでした。個人的にはfluentdを使わなくて済むようになり、サーバにBeats製品のGoバイナリを置くだけでElastic Stackと連携できるようになったのは管理するサーバが減ってメリットだなと感じました。
今更ながらPython2.7で文字列を扱う基本(str, unicode, encode, decode)


# 概要
Python2.7での文字列の扱い方の基本や注意すべき点をまとめる。

普段はPython3を使っているがPython2.7で書かれたプログラムの保守をすることがあり、いろいろ戸惑ったのでその時のメモ。ご存知の通り、Python2からPython3への移行の際に文字列に関する大きな変更が入り、後方互換性が失われている。

この記事内の情報は、特に明示しない限りPython2についてである。

# 前提知識

符号化文字集合と[文字符号化方式](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E7%AC%A6%E5%8F%B7%E5%8C%96%E6%96%B9%E5%BC%8F)（主にUnicodeとUTF-8)の違いについて、だいたい理解していること。

これを読めば、だいたいOKかも。 [Unicode入門](https://docs.python.jp/2.7/howto/unicode.html#introduction-to-unicode)

# プログラムの方針

下記は、Pythonのドキュメントからの引用。Unicodeを扱うプログラムを書くための助言として書かれている。

> ソフトウェア内部の動作には Unicode 文字列のみを利用し、出力時に特定のエンコーディングに変換する。
> https://docs.python.jp/2.7/howto/unicode.html#tips-for-writing-unicode-aware-programs

この助言にしたがい、Unicode文字列の使い方、特定のエンコーディングへの変換について見ていく。

# Unicode文字列

> Unicode 文字列は Python の組み込み型の一つ unicode 型のインスタンスとして表現されます。
> https://docs.python.jp/2.7/howto/unicode.html#python-2-x-s-unicode-support

Unicode文字列は、文字列の先頭に`u`をつけると作成可能。

```
>>> u"a"
u'a'
>>> type(u"a")
<type 'unicode'>
```

Unicodeのコードポイントを指定することもできる。`\u` + 4桁の16進数で表現する。

```
>>> u"\u0061" == u"a"
True
```

この方法を利用すると、「こんにちは」は、`u'\u3053\u3093\u306b\u3061\u306f'`となる。


# ソースコード内のUnicode文字列

「こんにちは」は、`u'\u3053\u3093\u306b\u3061\u306f'`ではなく、「こんにちは」と書きたい。しかし、何も考えずに、これをやろうとするエラーになる。（対話的インタープリタではエラーにならないが、それはまた別の話）

``` 
$ cat foo.py
print u'こんにちは'

$ python2.7 foo.py
  File "foo.py", line 1
SyntaxError: Non-ASCII character '\xe3' in file foo.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
```

ソースファイルにエンコーディングを宣言すれば良い。

```
$ cat foo_with_encofing.py
# -*- coding: utf-8 -*-
print u'こんにちは'

$ python2.7 foo_with_encofing.py
こんにちは
```

Python3ではデフォルトで"UTF-8"として認識されるので、`coding`の指定は不要になった。

# 特定のエンコーディングへの変換

Unicode文字列を特定のエンコーディング（例えばUTF-8）へ変換する。

encode()を使えばよい。

```
>>> u"a".encode('utf-8')
'a'
>>> type(u"a".encode('utf-8'))
<type 'str'>
```

エンコードを行うとstr型のオブジェクトが作成されるが、これはバイト列を表す点に注意が必要。（Python3のstr型とは異なる）

# 特定のエンコーディングからUnicodeリテラルへの変換

今度は反対に、特定のエンコーディングから（例えばUTF-8）からUnicode文字列へ変換する。

decode()を使えばよい。

```
>>> "あ"
'\xe3\x81\x82'
>>> type("あ")
<type 'str'>
>>> type("あ".decode("utf-8"))
<type 'unicode'>
```


# 変換時のエラーに対応する

encode()およびdecode()には、エラー時の挙動をキーワード引数で指定することができる。

https://docs.python.org/ja/2.7/library/codecs.html
https://docs.python.org/ja/2.7/library/codecs.html#codec-base-classes



# 参考資料
* https://docs.python.jp/2.7/howto/unicode.html
* https://docs.python.jp/3/howto/unicode.html
macOS向けのxcworkspaceでこんなエラーが出たら: Command PhaseScriptExecution failed with a nonzero exit code

CocoaPodsをアップデートしてみたら直った。

```
sudo gem install cocoapods --pre
pod update
```

## 再現環境

- macOS 10.13.6
- Xcode 10.1
- Swift 4.2
- CocoaPods 1.5.3

## 参考

- https://stackoverflow.com/questions/52234957/xcode-10-command-phasescriptexecution-failed-with-a-nonzero-exit-code-expanded
- https://github.com/CocoaPods/blog.cocoapods.org/pull/154
CircleCI のデバッグ方法3つ

今年は仕事で、Rails アプリケーションの CI 環境を Jenkins から CircleCI に移行しました。
その際に、CircleCI のデバッグ方法って意外とまとまっていないなー、と感じました。

本記事では、私が実際にやっていたデバッグ方法について書かせていただきます。

ちなみに、2018年11月に行われた [Sansan Builders Box](https://jp.corp-sansan.com/sbb2018/) では、本記事の内容も含めて、CircleCI移行について話をさせていただきました。その際の資料は↓↓になります。
[名刺のデータ化システムを支えるCI基盤への取り組み/GEES and CircleCI \- Speaker Deck](https://speakerdeck.com/sansanbuildersbox/gees-and-circleci)

# ローカルビルド

基本的には、CircleCI 上でテストが全て通るように `.circleci/config.yml` を修正していく作業になると思います。その際に、修正する度に git push してビルドを走らせるのは時間がかかります。

CircleCI CLI を使えばローカルでビルドを実行できます。

Mac の場合は Homebrew でインストールできます。

```bash
brew install circleci

# Docker インストール済みの場合はこちら
brew install --ignore-dependencies circleci
```

`.circleci/config.yml` のバリデーション

```bash
circleci config validate
```

ローカルビルド

```bash
circleci local execute
```

ある程度までは、ローカルビルドで `.circleci/config.yml` を設定できると思います。

参考 : [Using the CircleCI Local CLI \- CircleCI](https://circleci.com/docs/2.0/local-cli/)

# コンテナに SSH 接続

CircleCI のビルドが実行されているコンテナに SSH 接続できます。

実行経過を確認できる画面の右上の「Rerun job with SSH」をクリックします。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/102964/644be355-22d6-465e-9eeb-0624c5cd9931.png)

`ssh -p xxx.xxx.xxx.xxx` と表示されるので、普段 GitHub にコミットなどする時に使っている秘密鍵を使ってSSH接続できます。（CircleCI と GitHub で連携している場合）

```bash
ssh -p xxx.xxx.xxx.xxx -i ~/.ssh/id_rsa_github
```

私はこれで実際に、PhantomJS が入っていないことを確認したりしました。

参考 : [Debugging with SSH \- CircleCI](https://circleci.com/docs/2.0/ssh-access-jobs/)

# スクリーンショットを取って確認する

最後は、CircleCI 上の E2E 自動テストに対してスクリーンショットを取る方法です。

Ruby のライブラリである Capybara を例にして説明させていただきます。
Capybara では `save_screenshot` を使ってスクリーンショットを取ることができますが、何も指定しない場合 `tmp/capybara/` に画像が保存されます。

この場合、以下の様に書くことで、CircleCI の画面上からスクリーンショットを確認できます。

```yaml:.circleci/config.yml
version: 2
jobs:
  build:
    parallelism: 3
    docker:
      - image: circleci/ruby:2.5.1-node-browsers-legacy
    （略）
    steps:
      - checkout 
   （略）
      - run:
          name: Run rspec in parallel
          command: |
            bundle exec rspec ＼
              $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
      - store_artifacts:
          path: tmp/capybara/
```

↓の部分がポイントです。

```yaml
      - store_artifacts:
          path: tmp/capybara/
```

これで Artifacts タブから確認することができます。

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/102964/be062b08-f2b9-56d4-56ba-c84e5029d89e.png)

# おわりに

本記事の内容は以上になります。少しでもお役に立てましたら幸いです！
SICP読書録 #22 2.2.1(続き)リストに対するマップ - 練習問題 2.23

[hiroshi-manabe様の日本語訳](https://github.com/hiroshi-manabe/sicp-pdf)を使わせてもらいます。
練習問題等は[Gauche](http://practical-scheme.net/gauche/index-j.html)で実行。

[前回はこちら](https://qiita.com/shuetsu@github/items/cb2665de9fa4e6382b60)

## リストに対するマップ

リストの全要素に指定した係数を掛けるという手続き。

``` _.scm
(define nil ())

(define (scale-list items factor)
  (if (null? items)
    nil
    (cons (* (car items) factor)
    (scale-list (cdr items) factor))))
```

``` _.scm
gosh> (scale-list (list 1 2 3 4 5) 10)
(10 20 30 40 50)
```

リストの全要素に何かをする、という抽象的な手続き`map`を作ってみよう。

``` _.scm
(define (map proc items)
  (if (null? items)
    nil
    (cons (proc (car items))
          (map proc (cdr items)))))
```

`map`を使えば、`scale-list`手続きは次のように書き直せる。

``` _.scm
(define (scale-list items factor)
  (map (lambda (x) (* x factor)) items))
```

### 練習問題2.21

リストの要素を2乗する手続きを作ろう。まずは`map`を使わずに。

```_.scm
(define (square-list1 items)
  (if (null? items)
    nil
    (cons (square (car items)) (square-list (cdr items)))))
```

続いて、`map`を使う方法。

```_.scm
(define (square-list2 items)
  (map (lambda (x) (square x)) items))
```

動かしてみよう。

```_.scm
gosh> (square-list1 (list 1 2 3 4 5))
(1 4 9 16 25)
gosh> (square-list2 (list 1 2 3 4 5))
(1 4 9 16 25)
```

### 練習問題 2.22

`square-lit`手続きを反復プロセス化したつもり。

``` _.scm
(define (square-list items)
  (define (iter things answer)
    (if (null? things)
      answer
      (iter (cdr things)
            (cons (square (car things)) answer))))
  (iter items nil))
```

動かしてみよう・・・あれれ？

```_.scm
gosh> (square-list (list 1 2 3))
(9 4 1)
```

逆になるのも当然だ。次のように結果のリストが作られるからだ。

``` _.scm
> (cons (square 1) nil)    => (1)
> (cons (square 2) '(1))   => (4 1)
> (cons (square 3) '(4 1)) => (9 4 1)
```

ならば、こうだ。`cons`の引数を逆にしてみる。

``` _.scm
(define (square-list-fix items)
  (define (iter things answer)
    (if (null? things)
      answer
      (iter (cdr things)
            (cons answer (square (car things))))))
  (iter items nil))
```

動かしてみよう。

``` _.scm
gosh> (square-list-fix (list 1 2 3))
(((() . 1) . 4) . 9)
```

ダメかー。そりゃそうだ。次のことが行われる。

``` _.scm
> (cons nil (square 1))             => (() . 1)
> (cons '(() . 1) (square 2))       => ((() . 1) . 4)
> (cons '((() . 1) . 4) (square 3)) => (((() .  1) . 4) . 9)
```

### 練習問題 2.23

手続きをそれぞれの要素に適用していくだけの手続き`for-each`を作ろう。`begin`使ってもいいよね・・・

``` _.scm
(define (for-each proc items)
  (if (null? items)
    #t
    (begin
      (proc (car items))
      (for-each proc (cdr items)))))
```

実行結果。

``` _.scm
gosh> (for-each
        (lambda (x) (newline) (display x))
        (list 57 321 88))

57
321
88#t
```
できるだけ楽に結月ゆかりになりたい

かわいい声を目指して、ディープラーニングを使って声質変換する話

先駆者様 -> http://blog.hiroshiba.jp/became-yuduki-yukari-with-cycle-gan-power/
この記事は先駆者であるヒホ様（[@hiho_karuta](https://twitter.com/hiho_karuta)）から多大なるインスパイアを受けています。

# 目的
1. 声をかわいくする。
2. 既存の声質変換のモデルの性能を向上させる。
3. できるだけ導入に楽をする

# かわいい声とは？
　個人的に結月ゆかりとかがいいかなと思ったのでそこで頑張る。
（将来的には声優さんの声に変換してみたい。）

# 結果から

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">結構結月ゆかりなのでは？ <a href="https://t.co/dfKYjppRjg">pic.twitter.com/dfKYjppRjg</a></p>&mdash; NEXT_GENERATION (@nec_gene) <a href="https://twitter.com/nec_gene/status/1076327919784321024?ref_src=twsrc%5Etfw">2018年12月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# では具体的な話
ソースコードは[こちら](https://github.com/toda-necgene/VRC_Project)

##大まかに
- ベースは[CycleGAN（Generative Adversarial Network）](https://junyanz.github.io/CycleGAN/)を使います。
- 構造はresnet型で、64のフィルターで統一します。resnetは4ブロックでGLU構造を用います。複数の構造で実験してみた結果、この構造になりました。

- 変換の際に[WORLD](http://www.kki.yamanashi.ac.jp/~mmorise/world/)という音声分析変換合成システムを用いています。今回はpyworldライブラリをお借りします。

##データについて

学習させるデータは、以下のように意味づけしました。

 - 音素を２つ並べた音素連鎖を日本語の範囲で全種類網羅した音声 
  
　音素は、言葉の発声するときの最小単位です。端的に言えばローマ字に直した時の文字に当たります。
　しかし、人間は発声するとき口を動かします。動かす中間の音は音素では表現することができません。”柿（kaki）”と発音するときと”菓子（kasi）”と発音するときの"a"の口の動きは違うことから、微妙な音の違いが発生していると考えられます。
　なので、文章を朗読する上で発生しうる２音素の列を全て網羅すればそれで充分なのではないかという予測に基づいています。”柿（kaki）”ならば、[-k,ka,ak,ki,i-]のように解釈します。（-は空白文字）

読み上げた文章は自作です。と、いうのもATR503文は文章的に長い（収録すると１０分ぐらいになる)ので自作しました。~~（作り始めたときに存在を知らなかったなんて言えない。）~~
 ちなみに怪文章になっています。

 音声の合計時間は、11分47秒（自分：4分52秒、結月ゆかり：6分55秒）で全て16kHzです。
 
 
###Generatorネットワーク
生成側ネットワークです。（NHWCで表記）
入力：（1,52,1,513）
出力：（1,52,1,513）

　前処理としてdio,stonemask,cheaptrick,d4cを使ってピッチ、スペクトラム包絡、非周期信号を取り出しますが入力はスペクトラム包絡のみです。

　学習時は4096サンプルずつシフトして、等倍速と４倍速のスペクトラム包絡を使います。
　推論時は4096サンプルのスペクトラム包絡を”そのまま”突っ込みます。

　周波数軸はチャンネルとして扱います。

　詳しい構造はソースコードをご覧ください。


###Discriminatorネットワーク
判定側ネットワークです。（NHWCで表記）
入力：（1,17,513,1）
出力：（1,17,1,3）
学習はGの更新前に1回行います。CycleGANの論文では、２つネットワークを用意していましたが今回は1つに統一しました。と、いうのも各ドメイン情報よりも"違い"を知っていたほうがGeneratorへの伝播が詳細になるという仮定に基づいています。
なお、今回はバッチノーマライゼーション層を避けたので、４種類の音声を１つのミニバッチとして扱います。そして、平均化対策として損失関数を４倍します。
また、こちらでは周波数軸を横軸として取ります。チャンネル方向にとると時間がかかる割に性能は向上しません。

##損失関数について

GANの損失関数にsoftmax_crossentropyを使います。
Cycleの損失関数はL2ノルムを使用します。
重みはGAN:CYCLE＝1:100です。

##Optimizerについて
　 Adam
学習率:
 　4e-6 (0.001や2e-4も実験で試しましたが、崩壊を招くので不採用)
ベータの値：
　 0.5 
学習はGTX1070で、2時間弱です。（100000イテレーション時）



##最後に
仕事をください。
FontForgeでフォントファイルをいろいろ修正してみる

前回、FontForgeをMacにインストールして起動するところまで書きました。今回は実際にフォントファイルを色々いじってみたいと思います。

[前回の記事](https://qiita.com/xiaca/items/94984e2c63800fe4c3dd)


## フォントファイルを開く
File>Openから修正したいフォントファイルを開く(ex, *.ttf
![Screen Shot 2018-12-22 at 16.02.41.png](https://qiita-image-store.s3.amazonaws.com/0/165335/5c03e1b2-bb0b-5a73-fcf1-b35f0397e0a6.png)

## グリフの削除
削除したいグリフをドラッグで選択し右クリック>Cutで削除できます。
![Screen Shot 2018-12-22 at 16.03.44.png](https://qiita-image-store.s3.amazonaws.com/0/165335/0cd9145c-fb11-1b27-f061-952868aa3aab.png)

こちらの記事に書いてあるグリフの削除はこの方法で削除しています。
[AA表示用の軽量なフォント(43KB)を作った](https://qiita.com/xiaca/items/b8bde1257a135d173585)

## グリフの修正
修正したいグリフをダブルクリックするとフォントファイルをいじれます。操作感はいわゆるベクター編集的な感じです。
![Screen Shot 2018-12-22 at 16.06.02.png](https://qiita-image-store.s3.amazonaws.com/0/165335/4df9ea99-385b-ddf9-b74d-9ae5b2ed876e.png)


## フォントの書き出し
File>Genearte Fonts...からフォントの書き出しが行えます。ひとまずTrueTypeフォントで書き出したら後はWoffコンバーター等を使ってwoff、woff2ファイルを生成したりしましょう。
![Screen Shot 2018-12-22 at 16.06.27.png](https://qiita-image-store.s3.amazonaws.com/0/165335/3cd95cf1-ab44-ea68-a068-872934ed4f40.png)

![Screen Shot 2018-12-22 at 16.06.48.png](https://qiita-image-store.s3.amazonaws.com/0/165335/6cebcc6d-231e-b449-ffc2-6077e91a074c.png)


## まとめ
FontForgeでいろいろやってみました。興味持ってもらえたら是非とも前回の記事もみてもらってFontForgeをインストールしてみましょう。
それでは。
クラスタリングによるデータ分析

[TOWNアドベントカレンダー2018 ](https://qiita.com/advent-calendar/2018/town)の22日目の記事です。

今回は機械学習手法の1つである**クラスタリング**について書かせて頂きたいと思います。

# クラスタリングとは

>（統計学）データ解析手法の1つ。「クラスタ解析」、「クラスター分析」とも。機械学習やデータマイニング、パターン認識、イメージ解析やバイオインフォマティックスなど多くの分野で用いられる(データ・クラスタリングを参照)。クラスタリングではデータの集合を部分集合（クラスタ）に切り分けて、それぞれの部分集合に含まれるデータが（理想的には）ある共通の特徴を持つようにする。この特徴は多くの場合、類似性や、ある定められた距離尺度に基づく近さで示される。
出典 : [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)

## 図

簡単に表すと以下の図になります。

↓クラスタリング前 
<img src="https://qiita-image-store.s3.amazonaws.com/0/189802/f87cac72-feb8-4a3e-f59e-7ce607cfeafd.png" width=30%>
***
↓クラスタリング後
<img src="https://qiita-image-store.s3.amazonaws.com/0/189802/a78f3c8e-26d6-353d-9092-1942e0f77553.png" width=30%>

## 機械学習について

機械学習には

- 教師あり機械学習
- 教師なし機械学習 <- クラスタリングはこちら

の2種類があります。

### 教師あり機械学習

こちらは、予め分類されているビッグデータを基に学習を行い、それを用いてまだ手がつけられていないデータを分類する手法です。
**学習**と**分類**という2つのステップが必要です。
ニューラルネットワークはこちらにあたります。

### 教師なし機械学習

こちらは、分類されていないビッグデータをアルゴリズムに入力することによって分類する手法です。
**分類方法の判断から自分で行う**のが特徴です。
クラスタリングはこちらに該当します。

# 実際に解析してみる

クラスタリング手法の1つであるeFCMA手法は、以下の条件を満たすu, v, αを求めることで解析できます。

```math
\underset{u,v,\alpha}{\text{minimize}}
    \sum_{i=1}^C\sum_{k=1}^Nu_{i,k}||x_k-v_i||_2^2+\lambda^{-1}\sum_{i=1}^C\sum_{k=1}^Nu_{i,k}\log\Bigl(\frac{u_{i,k}}{\alpha_{i}}\Bigl)
```

## アルゴリズム

例として、手法の1つである**Fuzzy *c*-means**のアルゴリズム
1. 各データがどれくらいクラスタに属するかの値(帰属度)を初期化する。
2. 帰属度の値を用いて、各クラスタ中心を更新する。
3. 計算した中心を用いて、各データの帰属度を更新する。
4. 中心の変化が一定以下であれば終了、そうでなければ2へ。

## サンプルデータ

<img src="https://qiita-image-store.s3.amazonaws.com/0/189802/806948b3-f85c-69b7-5ee0-fc40c463f3e2.png" width=50%>
ガウス平面上に人工的に作られたデータ群を用います。

## 解析結果

<img src="https://qiita-image-store.s3.amazonaws.com/0/189802/f2539aac-3594-db06-bffe-49c1b5f60a6e.png" width=60%>
以上のアルゴリズムで解析をすると、図のようにして分類境界が示されます。

# まとめ

情報通信技術、IoTの発達によってデータがどんどん増えていく中、ビッグデータをいかにして利用するかということが重要になってきています。今回紹介した手法もそれに関係する1つになります。

## 応用例

身近な例として、
- 某密林において「この商品を買った人はこんな商品を買っています」といっておすすめされる商品の抽出。
- 某鳥のSNSにおける繋がりのグルーピング
といった**推薦システム**へ応用されています。

## リポジトリ

https://github.com/Aqua-ix/clustering

## 参考

http://www.kamishima.net/jp/clustering/

https://www.slideshare.net/takemikami/k-means-55567232
gitでローカルからリモートへpushできなかった時の備忘録

ローカルからリモートへpushしようとしたら、エラーが出力されて困ったので同じようなエラーで困った人のための備忘録として記録しておきます。

```
error: src refspec ブランチ名 does not match any.
error: failed to push some refs to 'https://hoge@bitbucket.org/hogerin/test_repository.git'
```
# 経緯
過去にbitbucket既にpushしたローカルbranchから再度以下のようなコマンドでremote上のbranchにpushしようとしたらこのエラーがでてしまいました。

```
git push origin ブランチ名
```

# 原因
git push の正式な使い方は

```
git push origin リモートのブランチ名:リモートブランチ名
```
のように[push元のブランチ:push先のブランチ]を指定しなければいけなかったのを忘れていた。
実は今回、

①　リモートのmasterからbranchを作成
②①で作成したbranchをローカルへpull
③作業が済んだので②で作成したブランチへpush
④①で作成したbranchの用が済んだのでリモート上で削除
⑤②でpullしてきたbranchをそのまま作業に使う
⑥新しいbranchをリモート上で作成し、pushを試みる
⑦エラーを吐く

というような背景があった。

# 解決方法
ローカルのAブランチからリモートのAブランチにpushするときのみ、

```
git push origin ブランチ名
```
このコマンドが使えるので、
ローカルブランチAからリモートブランチBへpushするときは

```
git push origin リモートのブランチ名:リモートブランチ名
```

このように明示的に指定してあげなければいけなかったという結果なので、

```
git push origin リモートのブランチ名:リモートブランチ名
```

これで正しくpush出来ました。
てへ。
HackDayに参加してきた

時間なくて超雑記事です。ごめんなさい
#HacｋDayとは
ヤフーが主催しているハッカソンです。24時間タイムアタックで開発してそのクオリティを競い合います。
#何を作ったのか
名刺交換のコストを減らしたくて、AR×名刺をテーマに作りました。

仕組みはこんな感じです。動画には写ってないですがユーザ登録画面のUIとフロントを担当してました。

3:18:46秒あたりを見てください
https://youtu.be/VEbOvV7_BWw?t=11926



AR,サーバーサイドは
https://twitter.com/tomoki_sun
https://twitter.com/_hibinokota_
https://twitter.com/sora_lit
が担当してくれてます

<img width="960" alt="PP.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/185109/4041e37f-69aa-d2c2-c185-404a8fd2058d.jpeg">

<img width="960" alt="gif.gif" src="https://media.giphy.com/media/uWWHtpTeKaCekSbOIP/giphy.gif">

#感じたこと

ハッカソンってしんどい、24時間寝れないのしんどい、風呂入れないのしんどい、集団開発するにはGitHubをマスターすることが大切だと感じました🤔

Buz賞狙ってるのでぜひRTしてやってください（ツイートまだしてないので随時更新します）
GeoGebra が角度の作画に思いのほか便利で驚いた

[GeoGebra](https://www.geogebra.org/graphing)が、Inkscapeと比較して、少なくとも表題の用途では非常に使いやすかった件。

作図の元になった下描き(参考: [内積の公式から、加法定理を思い出す](https://qiita.com/syuuu/items/274ae0ac085ae4751df4))
![triangle_func_03.png](https://qiita-image-store.s3.amazonaws.com/0/326797/227d36bc-b78c-f5cc-73a9-70bb385eafee.png)

GeoGebraで書き直してみたもの
![geogebra-export_cos_alpha_minus_beta_clipped.png](https://qiita-image-store.s3.amazonaws.com/0/326797/61f8fa63-2ba5-910c-4e90-ce9a27d0cac5.png)

### 作図したときのおおまかな手順

#### 1. 円の追加
左上の図形アイコン(○△)をクリックした後、Circlesを選択し、適当なところをクリックすると、円が描ける。A, B といった点も追加される。
![capture_20181222_151846_1.png](https://qiita-image-store.s3.amazonaws.com/0/326797/b048f473-e0c9-8dfd-0973-5bc2c6f1ad70.png)

#### 2. 線分の追加
Lines から線分を追加できる。以下、2本ほど追加した状態の画面。
![capture_20181222_152134.png](https://qiita-image-store.s3.amazonaws.com/0/326797/7e0b8c66-c14d-a0bb-38ca-fa62e711334a.png)

#### 3. 角度の描画
Measure をクリックすると、角度を描ける。
以下、線分を二つ選択して、角度を描画したあとのもの。
![capture_20181222_153817.png](https://qiita-image-store.s3.amazonaws.com/0/326797/f157c628-9419-2392-d2e8-b8b509a59b65.png)

#### 4. 調整
以下、オブジェクトの選択を行うため、矢印ボタンを押す。
![capture_20181222_153939.png](https://qiita-image-store.s3.amazonaws.com/0/326797/0809bc13-4c89-9e4c-093e-339715674b02.png)

今の角度は表示したくはないので、Show Label の Name & Value (名前と値の表示)のとこを Name にする。
![capture_20181222_154316.png](https://qiita-image-store.s3.amazonaws.com/0/326797/f7b652b0-62fe-1d32-5271-e675cedb8271.png)

こんな感じで、お目当ての表示にできる。

![capture_20181222_154401.png](https://qiita-image-store.s3.amazonaws.com/0/326797/c2037c0b-bd7b-358c-9b29-7c70c1ac7976.png)

特に、数学用途特化というところが発揮されているのが、**点Cを円に沿ってグルグルと動かせる**ところだ。これは、汎用のベクター画像編集ソフトではできないことだ。
Goの環境構築をDisりながら覚える

新しい言語を覚えると必ず　ｘｘ言語なら簡単にできるのに！ というクレームを抱くはず
その負の感情をネットに書くと反感を食らうので文句を言わずに覚えるからストレスがたまる
あえて Disりながら言語を覚えれば　精神的に楽で長続きする
むしろ　Disることを目的にして　結果的に言語を覚えてしまうというのが 理想かもしれない

ので　あえてGoをDisりながら覚えよう！

#名前がKuso
GoogleだからGoなのはわかるが
`Go` は短く 英語では `行く` という動詞らしく、いっぱい他のものがヒットする
ポケモンGO　しかりだ
以前あった MicrosoftのCOMよりはいくぶんマシではあるが
検索エンジンの会社のくせに、SEO対策が出来てないと思われる

まー　Google様の力で　`Go` で検索したら GoLangが上位に来るようになってるが
そのために無駄な最適化強いられたんじゃないだろうか？

`Go`では他のものがヒットするので `Golang` `Go言語` で検索する必要がある

#環境変数がKuso
GOには環境変数が３つある

##$GOROOT
Goをインストールするディレクトリだ。
間違えないでほしいのは　インストール*した*ディレクトリではなく　インストール*する* ディレクトリだ
今は特に指定しなくてもよくなっている
指定しない場合は 勝手に適切なところにインストールされる

##$GOBIN
Goの実行ファイルのあるパスだ
これを環境変数 ＄PATHに追加すれば `go`コマンドが パスなしで使えるようになる

##$GOPATH
これが厄介者！！
Go1.8からは 無指定の場合は $HOME/go（Windowsは C:¥Go） を指定したとして扱われるが
基本的には指定するべきだ

このパスは何かというと
Goで開発するコードはすべてこの下に置け！ という傲慢な設計である
$GOPATH以外に置いたコードは Buildしようとしても パスが違うと怒られBuild出来ない
たとえ インターネットで拾ったサンプルを実行するにも、デスクトップやダウンロードフォルダでビルド出来ず
わざわざ ＄GOPATH 以下にコピーして　そこでBuildしなければならない

また、更におせっかいなのが、このパス構造が決められているということだ
$GOPATH/bin にビルドされた実行ファイルが置かれ
$GOPATH/pkg 以下に、パッケージごとの中間ファイルが置かれ
$GOPATH/src 以下に、ソースコードを置く必要がある

また、pkgやsrcディレクトリ以下も ディレクトリの制限がある
src/github.com/ユーザ名/アプリ名
というディレクトリ構成でおかなければ　色々と不具合がある

Git以外のサービスを使っていれば src/bitbucket.com/ユーザ名/アプリ名　など。
基本的に GoはGithubなどのOSSプロジェクトを対象にしているため
それ以外のディレクトリで開発する場合は色々と苦労を伴う

まさにKusoだ

#パッケージのimport
パッケージのimportは ｓｒｃフォルダを基準に行われる
例えば Githubのxxxさんの作ったyyy というライブラリを使うのであれば
importに  github.com/xxx/yyy  を追加する
go get　を使えば上記のパッケージをダウンロードして $GOPATH/src/github.com/xxx/yyy　に置いてくれる
便利だ

では　作ってるアプリ内のライブラリを指定するときはどうなるか？
たとえば ./lib/hoge　をimportしよう
相対パスを使い import lib/hoge　と書くこともできるが、毎度パッケージのビルドが走ったり、go getで取れないので
やめたほうがいいようです
素直に　アプリ内のパッケージも 
import github.com/xxx/yyy 　にしましょう

このあたりは下記でも述べられている
https://qiita.com/shopetan/items/eddcacec21cc7ea274f9

まさにKusoだ

##パッケージのバージョン指定は？
できません！
Kuso

Goからの回答としては
パブリックなライブラリに関しては最新版ですべてのバージョンで動くべきだ
互換性を捨てる場合はライブラリ名を変えるべきだ
とのことです。。

*そんなの無理に決まってる！！*

ということで、ほしいバージョンのパッケージをダウンロードし 名前をかえてコピーしておきます
例えば $GOPATH/src/github.com/xxx/yyy2
そして　そのファルをimport　すれば出来ます
なんて　アナログ！！
Kuso

ってことで 外部の人が試行錯誤し色んなパッケージ管理ツールを作ってくれました
go1.11では vgoというものが試験的に導入されたらしい
https://tanksuzuki.com/entries/golang-vgo/

これで一歩 まともな言語に近づいてきたね！


##GitLabのサブルグループを使う場合
たとえば Gitlabのサブグループで開発すると  
import gitlab.com/ユーザ/サブグループ/アプリ
と 1階層増えます
すると　下記のように そのままでは go get出来なく不便です
https://qiita.com/zatsuzatsu/items/f15c6dff88d053d46c43
そのため、うちではGoのみ Gitlabはサブディレクトリ使わない運用になってます

Kuso

上記は新しいバージョンで未確認なので　なおってればいいな・・・


#Docker
Dockerでアプリケーションをマウントさせるとき　よくあるのは下記のように アプリディレクトリ作ってそこに置く

```bash
WORKDIR /app
ADD . /app
```

コンテナ上の＄GOPATHがこの場合 /appに置くことになるが
内部ライブラリのimportが
import github.com/user/app/xxx
になっているはずなので、これではうまくいかない

試行錯誤したあげく　下記のようにする必要があった

```bash
WORKDIR $GOPATH/src/github.com/user/app
ADD . $GOPATH/src/github.com/user/app
```

深い・・
ので　この後 $GOPATH/bin/app　を /app にコピーする　などして使う事になるかもしれない

ちょっと面倒
Ruby while文はdoいらない。1行で書きたければdoを入れる

#通常

```
a = []
while a.size < 5
 a << 1
end

#結果 [1,1,1,1,1]
```

#1行

```
a = []
while a.size < 5 do a << 1 end
#結果 [1,1,1,1,1]
```

#1行でwhileを後ろ

```
a = []
a << 1 while a.size < 5
#結果 [1,1,1,1,1]
```
FontForgeをMacにインストールして起動する

前記事でさらっと触れたFontForgeをMacにインストールする記事です。
[AA表示用の軽量なフォント(43KB)を作った](https://qiita.com/xiaca/items/b8bde1257a135d173585)

なんか色々起動でハマったので書き記して起きます。

## XQuartzのインストール
FontForgeを動かすために必要です。以下のサイトから最新のdmgをダウンロードしてインストールします。
https://www.xquartz.org/

dmgをダブルクリックすればインストーラーが動きます。

## XQuartzの設定
インストールが完了したらXQuartzを立ち上げます。Prefernce > Inputタブから"Enable key equivalents under X11"のチェックを外しておきます。

## FontForgeのインストール
とりあえずbrewでインストールしましょう。

```
brew install fontforge
```

インスとーるが完了したら以下のコマンドを実行してAplicationにFontForgeを紐付けます。

```
brew cask install fontforge
```

これで完了です。

## FontForgeの起動
ここでハマりました。AplicationsフォルダにあるFontForgeをクリックしても何も動きません。ぶっちゃけ動かない理由はよくわかりません。しかし、動かす方法はあります。

まずX11からTerminalを開きます。上部メニューからApplication > Terminalをクリックします。
![Screen Shot 2018-12-22 at 15.30.16.png](https://qiita-image-store.s3.amazonaws.com/0/165335/87581f3c-e9dc-ddf4-8fc9-f6b0b7984d7b.png)

そうするとxtermsが立ち上がるので以下のコマンドを入力しましょう。

```bash
cd /Applicaions/
open FontForge.app/
```

![Screen Shot 2018-12-22 at 15.31.16.png](https://qiita-image-store.s3.amazonaws.com/0/165335/6d3cfbfc-4b76-06a1-2cf4-c91bd1cc5285.png)

こうすることでFontForgeが起動します。この後は普通のFontForgeと同じように使用することができます。
![Screen Shot 2018-12-22 at 15.33.24.png](https://qiita-image-store.s3.amazonaws.com/0/165335/75a219d4-0099-076d-0843-1a8552d3c40a.png)



## まとめ
以上、MacにてFontForgeが立ち上がりました。これで自由にフォントファイルをいじれるようになります。
それでは。
Three.js selectionBoxを使ってみた

#概要
three.jsで複数のオブジェクトを一気に選択できるselectionBoxって機能があったのでその使用方法と使用感の紹介

#使用環境
OS:Mac
ブラウザ：Chrome

#selectionBoxで何ができるのか？
three.jsのcanvasをドラッグ＆ドロップすると始点を左上、終点を右下とした正方形の薄い範囲が示されてその中のオブジェクトを抽出できる


以下にgithubのコードがあるので参考に。githubのthree.jsを落としてこのサンプルを開けば起動できる
https://github.com/mrdoob/three.js/blob/dev/examples/misc_boxselection.html

#使い方

githubのサンプルに沿って使い方の説明。selectionBox以外の説明は省略
主な工程は以下の三つ
- 初期化
- 始点の登録
- 終点の登録

### 初期化

```misc_boxselection.js
var selectionBox = new SelectionBox( camera, scene );
var helper = new SelectionHelper( selectionBox, renderer, "selectBox" );
```

new SelectionBox( camera, scene )は選択範囲のオブジェクトを発見するメイン機能のオブジェクト。sceneを渡してるがこれだとsceneに含まれる全てのオブジェクトを対象とする。対象を減らしたいときは自分で作ったオブジェクトリストを渡す。
ちなみに隠れた第三引数があり検索する奥行きを指定できる（デフォルトは無限）

new SelectionHelper( selectionBox, renderer, "selectBox" )はドラッグ＆ドロップした時の範囲を視覚化する薄い青色の四角をだす
以下のようなcssをどっかに登録しとく必要がある

```misc_boxselection.css
.selectBox {
  border: 1px solid #55aaff;
  background-color: rgba(75, 160, 255, 0.3);
  position: fixed;
}
```

### 始点の登録

```misc_boxselection.js
document.addEventListener("mousedown", function ( event ) {
  for ( var item of selectionBox.collection ) {
      item.material.emissive = new THREE.Color( 0x000000 );
  }
  selectionBox.startPoint.set(
    ( event.clientX / window.innerWidth ) * 2 - 1,
    -( event.clientY / window.innerHeight ) * 2 + 1,
    0.5
  );
});
```

mousedownを検出したところでクリックの位置を導出してselectionBox.startPoint.set()で登録している
このサンプルでは範囲内のオブジェクトを薄い青色の効果をつけているのでその初期化をここでやっている（`for( var item・・・`のところ）

### 終点の登録

```misc_boxselection.js
document.addEventListener( "mousemove", function ( event ) {
  if ( helper.isDown ) {
    for ( var i = 0; i < selectionBox.collection.length; i++ ) {
      selectionBox.collection[i].material.emissive = new THREE.Color( 0x000000 );
    }
    selectionBox.endPoint.set(
      ( event.clientX / window.innerWidth ) * 2 - 1,
      -( event.clientY / window.innerHeight ) * 2 + 1,
      0.5
    );
    var allSelected = selectionBox.select();
    for ( var i = 0; i < allSelected.length; i++ ) {
      allSelected[i].material.emissive = new THREE.Color( 0x0000ff );
    }
  }
});
```

ドラッグ中の終点の登録。
selectionBox.endPoint.set()で始点と同様に終点の登録を行なっている。
終点の登録を行えばselectionBox.select()で今範囲内にあるオブジェクトの計算が行われオブジェクトの取得ができる。

```misc_boxselection.js
document.addEventListener("mouseup", function ( event ) {
  selectionBox.endPoint.set(
    (event.clientX / window.innerWidth) * 2 - 1,
    -(event.clientY / window.innerHeight) * 2 + 1,
    0.5
  );
  var allSelected = selectionBox.select();
  for ( var i = 0; i < allSelected.length; i++ ) {
    allSelected[i].material.emissive = new THREE.Color(0x0000ff);
  }
});
```

ドロップ時の終点の登録。ドラッグ中とほぼ同じ処理。範囲内にあるオブジェクトに青い効果をつけて終了

##余談
抽出範囲はドラッグ＆ドロップで作られた正方形をカメラの位置と奥行きまでを前後させた時にできる立方体のなかに入ってるオブジェクトを抽出するようになっている。立方体作成にはTHREE.Frustumを使ってる。
また、THREE.Meshを継承したオブジェクトしか抽出できないので他のオブジェクトを抽出するためにはSelectionBox.jsで`if ( object instanceof THREE.Mesh ) {`ってなってるところを変更する必要がありそう

#まとめ
コード的には簡単に複数選択が実装できて便利そうだけどMeshしか選択できなかったりscene渡すと全部のオブジェクトが判定対象になったりでちょっと工夫がいる。ちゃんとしたドキュメントも見つからなかったので頑張って元コードを見るしかなさそう
Apex一括処理で、取引先責任者を全部かしゆかにする

毎度のごとく12/23は、かしゆかの誕生日です。お祝いです。おめでとうございます。

ネタとしてはホント甚だしいというか、ホントにPlatform Specialistなのかという話ではありますが、今更ながら「[Apex一括処理](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_batch.htm)」ってすごくないですか。やばいと思うんですよ。ちょっと失敗したら、データがこんな事になってしまうんだって、実行してから気がついてしまう。しかも復旧はほぼ不可能。

物理的なデータ破壊に関しては物理的なバックアップから時間をかければ読み戻せますが、論理的なデータの破壊って管理者の一撃でどうにでもなるんですよね。これはやばい。論理バックアップを取っていたとしても、どこで壊れて、どこまで戻そうかと買って容易じゃないです。物理的に壊れたときはそこで全てが停止して、ある地点まで戻ってしまいますが、どこからどこまでのデータが行方不明になっているかはわかります。諦めが付きます。論理的に停止した場合、業務が止まっていなかったら、その後もデータの更新が継続されます。気がついたときには、わけのわからないデータ状況になっていることもしばしばです。データを通常の行為で、強制的に変更ができる仕組み、それも大量のデータを。この恐怖をみなさまにも、１つ思い出していただきたく、コードを準備しました。

# Apex一括処理で誕生日を全部変更する

世界が平和になるには、世界がみんなPerfumeだったらという思想のもと、システム管理者が正義の鉄槌として、登録されているすべての取引先責任者の誕生日を、かしゆかの誕生日にしたら世界平和が訪れるのではないかと考えることは、ママあることでしょう。

試してみます。

```java:ChangeBirthday2Kashiyuka.apxc
global class ChangeBirthday2Kashiyuka implements 
Database.Batchable<sObject>, Database.Stateful {
    global Database.QueryLocator start(Database.BatchableContext bc) {
		return Database.getQueryLocator('SELECT Id, Birthdate FROM Contact');
    }
    global void execute(Database.BatchableContext bc, List<Contact> records){
        for (Contact contact : records) {
            contact.Birthdate = Date.newInstance(1988, 12, 23);
        }
        update records;
    }    
    global void finish(Database.BatchableContext bc){
        // execute any post-processing operations
    }    
}
```

なんてことのないApex一括処理の基本的な形・構成です。`Apex`では、Date型をテキストで表現するいわれがないので、`Date型`をいちいち呼び出してあげないようなところが、厳密だなってちょっと感じます。今回のキモはここですね。これ `contact.Birthdate = Date.newInstance(1988, 12, 23);`過去最高に素敵なコードに見えます。

おもむろに、開発コンソールで `^E` 別名 `Ctrl+E` を押して、次のコードをコピペして、「Execute」すると、登録されている取引先責任者が、一件だろうが数万件だろうが、これですべて「かしゆかの誕生日」に変わります。

```java:anonymous
ChangeBirthday2Kashiyuka myBatchObject = new ChangeBirthday2Kashiyuka(); 
Id batchId = Database.executeBatch(myBatchObject);
```

# まとめ

Apex一括処理、たったのこれだけのコードである程度の業務を停止することができていしまいます。されど誕生日。これがまだ誕生日なので、あとでいくらでもリカバリできる可能性がありますが、全員同じ名前になったとしたらどうでしょう。恐いですね。

おかげさまで、私の一番古くからある開発環境の取引先責任者が、すべてかしゆかの誕生日になりました。このような現象を引き起こすのは私だけで十分だと思います。みなさまも、「Apex一括処理」はドライランとテストを何度も試してから、気をつけて実行ください。
オブジェクト指向でなぜつくるのか 第5章 ~補足~

## 本について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186009/7bf8dcaf-d077-9b43-805e-7f6bcad83dc9.png)

Amazon: https://www.amazon.co.jp/dp/4822284654

以前「オブジェクト指向でなぜつくるのか-第2版-」の第5章に書かれているオブジェクト指向プログラミングにおけるメモリの使われ方をまとめました。そのときにまとめきれなかったことを補足としてまとめます。

記事: [オブジェクト指向でなぜつくるのか 第5章](https://qiita.com/tamago3keran/items/1eed8a3371acb715a0d8)

## プログラムの基本的な実行方式

### コンパイラ方式

プログラムを機械語に一括変換してから実行する方式

![oop-コンパイル式.png](https://qiita-image-store.s3.amazonaws.com/0/186009/7a9be595-d4be-70fb-9235-5a4de2e16de7.png)

**長所**: コンピュータが機械語を直接読むため実行効率が良い
**短所**: コードを修正するたびにコンパイルしなければならない（手間がかかる）

###インタプリタ方式

プログラムを逐次解釈しながら実行する方式

![oop-インタプリタ式.png](https://qiita-image-store.s3.amazonaws.com/0/186009/14b38117-b41d-f973-dc71-3cadd0c3a061.png)


**長所**: 書いたプログラムをすぐに実行して確認できる、プラットフォームに関係なく実行できる
**短所**: 逐次解釈しながら実行するので、実行効率が悪い

###中間コード方式

プログラムを特定の機械語に依存しない中間コードにコンパイル後、仮想マシンで解釈しながら実行する方式

![oop-中間コード方式.png](https://qiita-image-store.s3.amazonaws.com/0/186009/58061d82-910f-2f68-2d34-f99baaf7aa51.png)

**長所**: 異なるマシンに同じプログラムを配布できる上、コンパイラにより実行効率も上がる
**例**: Java, .NETなど

ここでいう **仮想マシン** とは、中間コードを機械語に変換する仕組みを示し、 Java の場合は `Java VM` という仕組みがこれに相当します。

クラスやポリモーフィズム、継承がコードレベルでの大規模な再利用を実現しましたが、仮想マシンはソフトウェア部品を様々なプラットフォームで再利用できるようにしました。

## マルチスレッド

ここで説明する **スレッド** とは、「プログラムの実行単位」を意味しています。

プログラムの実行単位にも種類があり、メーラーやWebブラウザといったパソコン上で独立して動くアプリケーションは **プロセス** と表現されます。 **スレッド** とは、メールの送受信やWebブラウザのリクエスト処理といった、プロセスよりも小さな実行単位のことを指します。

![oop-スレッドとプロセス.png](https://qiita-image-store.s3.amazonaws.com/0/186009/3cd83efa-b206-f6c6-cc70-9da7f4a03970.png)

パソコンを操作すると、複数のスレッドが同時進行しているように見えますが（Webブラウザでページを描画しながら、メールの送受信を行うなど）、CPUが一時点で実行できる処理はひとつだけです。

なぜ複数のスレッドが同時進行で実行されているように見えるかというと、複数のスレッドを非常に少ない時間で少しずつ順繰りに実行しているからです。

このようにスレッドを複数同時に実行できる環境を **マルチスレッド環境** といいます。
メモ：「３０日でできる！OS自作入門 」7日目

## FIFO と マウス制御

1) キーコードを取得
- ポート 0x60 から取得
- PIC0_ICW2 に 0x61 を送ることによって　IRQ1 受付完了になる (こうしないと次受け取れないため）
    - ０ｘ６１の 1はIRQ1を示す、 IRQ3 なら 0x63 (0x60 + IRQ番号）

![key-input.gif](https://qiita-image-store.s3.amazonaws.com/0/109145/8a31f282-b515-0d18-80ad-5291085a87b3.gif)

- キーコードを画面で見れる。やった！
- 押したときも、押した後も別のキーコードがでる。

2) 割り込み処理は早く
- キー入力があるときに毎回画面描画するのは遅い
- 対策
    - どのキーだったかを変数か構造体に入れて、
    - MainLoopで割り込みを一旦止める
    - キーデータをチェックして画面描画する
- Ctrlなどのキーはキーコードが２つあるのに、一個しか対応していない問題がある

3) キーのバッファをFIFO形式で作る
- 32個までのキーコードをためていく０ to 31番目まで
- 取り出すときに一個ずつ頭からとって画面に表示していく　（ちょっと効率は悪い）

4) バッファの改善
- 32バイトのリングバッファみたいにする
    - read用と、write用のインデックスを持って操作する

ちょっとキーの表示が早くなった感じもなくはない。

5) バッファの整理
- 32個固定ではなく、buf と size を渡して初期化するようにする
- FIFO put, get, status 関数を作成

6) やっとマウスだ
- マウスは PC の履歴からすればちょっと新しい装置
- マウス制御装置にもマウス自体にも有効化命令を発行する必要ある
- 制御装置はキーボードと一緒なので同じポートに命令を送る
    - ポート ０x６４が制御装置、0x60が装置自体
    - 盛業装置がReadyな状態かどうかまで待つ必要ある, NOT_READYフラグ & 2セットされてなければ OK
    - キーボードの場合、書き込み可能にするのが 0x60, 有効化？ モードが 0x47 でセットする
    - マウスの場合、0xd4でコントローラーを有効化、0xf4でマウスを有効化

マウスの割り込みが効くことを確認

![スクリーンショット 2018-12-22 15.03.31.png](https://qiita-image-store.s3.amazonaws.com/0/109145/e7f4964b-8d2f-17e1-7873-b82e1ff69a18.png)

７） マウスからデータ受信
- 基本キーボードと同じ
- マウス用のバッファを用意し(一旦128バイト）、データがあったら画面に表示していく

キーボードかマウスによって画面にキーコードが表示されることを確認

![スクリーンショット 2018-12-22 15.09.58.png](https://qiita-image-store.s3.amazonaws.com/0/109145/b1599e66-a809-b8d6-6643-2df3f3fc759e.png)

今日はこれで寝るといいらしい