OmniAICreator/Qiita-1.07M huggingface dataset:
コンパイル前のテンプレートが画面に表示されるのを防ぐ

# コンパイル前のテンプレートが画面に表示されるのを防ぐ
Vue.jsのお勉強。

まず，[Vue.jsの公式サイト](https://jp.vuejs.org/v2/guide/installation.html)から，必要なファイル（vue.js）をダウンロード。
次に，testフォルダを作成し，このフォルダ直下に，下記のファイルを保存。

- test.html
- test.css
- test.js
- vue.js　←さっき，ダウンロードしてきたやつ。

で，以下のように記述。

``` test.html
<!Doctype html>
<html lang="lang">
<head>
    <meta charset="utf-8">
    <title>テスト</title>
    <link href="test.css" rel="stylesheet">
</head>
<body>
    <div id="app">
        <p>{{ message }}</p>
    </div>
    <script src="vue.js"></script>
    <script src="test.js"></script>
</body>
</html>
``` 

```test.js
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello Vue.js'
    }
})
```

まあ最初だし，これで1回ブラウザ上で表示してみようと思ったら，
`{{ message }}`が一瞬表示されたのちに，`Hello Vue.js`が表示された。

え？何今の？
と思ったけど，調べてみたら，ちゃんと対処法があったので安心。

`v-cloak`ってのを使うらしい。

```test.html
<!Doctype html>
<html lang="lang">
<head>
    <meta charset="utf-8">
    <title>テスト</title>
    <link href="test.css" rel="stylesheet">
</head>
<body>
    <!--この1文に，v-cloakを追記-->
    <div id="app" v-cloak> 
        <p>{{ message }}</p>
    </div>
    <script src="vue.js"></script>
    <script src="test.js"></script>
</body>
</html>
```



```test.css
@charset "utf-8";

[v-cloak] { display: none }
```

これで，コンパイル前にテンプレートが表示されるのを防げた。
network.service が起動できなかったので対処　CentOS7

# 概要

久々に**VirtualBox**上でLinuxを起動し、コンソールからsshで繋ごうとしたけど接続できない。
Linux側を確認してみると**networkが死んでる。**restartができない。

結論から言うと、「使用してないネットワークインターフェイスは**自動接続機能をOFF**にしておかないと
エラーが起きて**ネットワークサービス自体が起動できなくなる**よ」ということでした。


>結論：Centos7は使っていないインターフェイスはautoconnect offにしよう！
[【CentOS7】networkが起動しない – ZacoDesign](http://zacodesign.net/blog/?p=862)


# コマンド実行 → エラー表示 → 対応　の流れ
まずネットワークサービスを再起動しようとした

```zsh:
systemctl restart network
```

で、以下のようなエラーが表示される
### Job for network.service failed because the control process exited with error code. See "Systemctl status network.service" and "journalctl -xe" for details.

`ログを見ろ` と。

で、とりあえず上記に従い
まずは**network**を確認してみる

```zsh:
systemctl status network
```

```zsh:サービス死んでますね
Active: failed (Result: exit-code)...
```
で、ログ部分に以下のようなメッセージが

### .... enp0s4 .....: ........: No suitable device found for this connection .

「`enp0s4`というネットワークインターフェイスを接続しようとしたけど、適切なデバイスが見つからなかった」と。

```zsh:デバイスを確認
nmcli c
```
```zsh:
NAME    UUID                                  TYPE      DEVICE 
.
enp0s4 fwfewf-fewfewf-wfewf-wefwef-ewfewfwef  ethernet  --
.
.
```
`enp0s4`はネットワークインターフェイスのデバイスとして**使用されてない**みたい


## 使用していないネットワークインターフェイスの自動接続機能をOFFにする

```zsh:
nmcli connection modify enp0s4 connection.autoconnect no
```
で、再度ネットワークサービスを再起動

```zsh:
systemctl restart network
```
何も表示されないので。。。

```zsh:
systemctl status network
```

### Active: active (exited)

ネットワークサービスが再起動できました！

この後、sshも成功してめでたしめでたし。
という流れでした。


# その他参考
>
[RTNETLINK answers: File exists が出てしまった時の対処方法 | 穀風](https://kokufu.blogspot.com/2019/02/rtnetlink-answers-file-exists.html)
[ネットワークインターフェースを設定した際のコマンドなど - 午後から→オーバークロック](http://nemupm.hatenablog.com/entry/2014/09/20/035935)
[CentOS７で再起動後、ネットワークが上がらなかった原因 | ex1-lab](https://ex1.m-yabe.com/archives/2201)
『ソフトウェア・ファースト』読書メモ　その１

バズワードが先行して、実態が伴わない時代には、本質的なことを熱く語ってくれる書籍はそれほど多くではない、これはそのうちの一冊と思います。まさに内製化の必要性を強く感じて、それを模索中の自分には、トンネルから明かりが見えたかのように、行くべき方向を見つかりました。
下記は本から抜粋した、あとで何度も読み返したい内容です。

- 日本は変化が止まっています。その理由は、社会が変化を望んでいないではないかと感じることがあります。変化には苦痛を伴います。一次的に不幸になる人も出てくるかもしれません。しかし、今の日本は全員が平等に少しずつ不要になる道を歩んでいるのではないでしょうか？不幸になる人を生んでいいと決して言いませんが、少しでも不幸になる要素がある変化を拒み続けた結果、全員が不幸になっているということはないでしょうか？
　⇒　先のリスクを過小評価する傾向があるので、苦痛を負っても現状を打ち破る突破力が必要

- サービス化する社会に合わせたプロダクトを開発するには、開発手法も変えていく必要があります。変革が必要なのはプロダクトの企画、開発・運用手法、技術だけではありません。それらすべて変革を推進する人と組織も含まれます。
　⇒　Product、Process、Peopleという三点セットで常に考えなければいけません

- ユーザーのニーズを追えばあらたなプロダクトの企画が生まれるわけではない
　⇒　イノベーションのジレンマーの示された通り

- DevOpsは開発と運用が一体となり、プロダクトを育てていくという組織連携、それを支える文化、そして開発と運用のツール等を含むものとされています
 
- 企業がソフトウェアファーストを実践するには、ソフトウェア技術を理解し、事業に活用できる人材が必要です。このような人材を育て、生かせる組織が必要です。さらには、失敗することを前提に、つくっては壊すことをよしとする文化も大切です。
　⇒　失敗する前提は一番難易度が高い、利益至上主義との熾烈な闘いが必要かも、内外からのプレッシャーを受け入れ、解消してくれるマネジメントの強力なサポートが必要
 
- ソフトウェアファーストで最も大事なこてゃ、変化しないものを理解することです。つまりビジョンやミッションであり、それに関連する社会課題や価値観です。
 
- アジャイルやDevOpsはあくまでも手段、ユーザードリブンなマインドが不可欠、この目的意識をチーム全体に浸透させることが、ソフトウェアファーストを実践する最初の一歩です。
 
- エンジニア、レビュアー、QAのみんなが同じプロダクトチームになると、必然的にブラックボックスだった箇所が減っていきます。

- 日本企業が変化に乗り遅れ、世界市場で存在感を失う状況に陥る理由は大きく三つ
  **要因１：ITを「効率化の道具」と過小評価**
  ・効率化や省力化だけがITの可能性ではありません。
 ・ITには既存産業のルールを壊し、新たなビジネスに作り替えるだけのパワーがあります。これにいち早く気付いたのが米国の企業群でした。
　
・日本企業の多くは、正常性バイアスによって過去の成功体験にとらわれ、モノづくりこそが日本の「正業」であり、ITは「虚業」という誤った認識をもってしまったのではないでしょうか？

　　・事業会社がじそうできるようになったら、デジタルトランスフォーメーションに対する外部からの支援は終了となります。デジタル・トランスフォーメーションの本質を突き詰めていくと、SIerは関連する案件をやり続けることで自らの存在価値を最小化していくことになるのです。

・**問題提起：ITの価値を誤認した結果、自社にIT活用のノウハウが蓄積されない「SIer丸投げ文化」が形成されてしまったのではないか。しかし、この構図もいずれ成立しなくなるはず**

 　**要因２：間違った製造業信奉から抜け出せない**
　・製造業の物づくりとソフトウェア開発の違い
　　製造業：　企画⇒先行開発（試作）⇒製品開発（量産設計）⇒製造⇒販売　※手戻りが許されない
　　ソフトウェア開発（特にSaasの場合）：　企画⇔PoC（試作）⇔設計⇔開発⇔運用　※手戻り発生が前提

　・製造における生産性と品質支えているのが生産技術、これはソフトウェア開発では「開発基盤」と考えることができます

　・日本企業はソフト愛和を「設計パターンに従って複製可能な工業製品」とみなし、米国企業は「ビジネスであり商売の重要な武器」、欧州企業は「ソフトウェアの標準化に代表される美」　を体現するものとして捉えている。			* 
　
　・**問題提起：日本企業はソフトウェア開発をレバレッジの効くビジネスとしてではなく、工業製品のようにとらえたため、イノベーティブなソフトウェアを生みだせなかったのではないか？**
　
**要因３：サービス設計運用面で誤解**
・狩野モデルで考える間違った品質追求の愚
　イノベーティブなプロダクト開発を考えるときに重視すべきは魅力的品質であり、一元的品質です。魅力的品質は当たり前品質に変質可能です

・日本企業のプロダクト開発は、当り前品質を高めることが唯一の道だと信じ込み、魅力的品質を磨くことを怠っている

・現実に即していない情報セキュリティポリシー

・データ活用に感じる二つの違和感
　　データへの期待が先行しすぎ、収集するデータの種類と用途を考えずに集める
　　ユーザーのプライバシーを踏まえ、データ収集、ユーザー体験設計、データ活用を考える人材不足

・**問題提起：多くの日本企業がITを使ったイノベーションを起こせていないのは、品質管理やセキュリティ施策のやりかたが画一的だったり過剰になっているため、ユーザーが本当に欲しいものを追求できていないからではないか**

- ITサービスで存在感を示すためのアイディア

　・フィジカル＊サーバー領域の新規事業

　・現在の製造業の典型的な姿は、製品の販売後はユーザーとの関係は薄れ、製品の利用状況の把握もせず、再びユーザーとの関係が生じるのは製品の買い替えか、新たな製品の購入を検討した時だけとなります

　・プラットフォームを構築せよ
最初の一歩は特定の領域、またはごく少数の企業が確実に使えるものを提供するバーティカルなサービスづくりから始めるべきだと考えています。領域によっては、素早く汎用化を進めない限り、より大きな汎用プラっとフォーマーににも困れてしまう危険性がある

　・課題ありきで物事を考える習慣がないと、開発中にエンジニアがコードを各ことを目的化してしまい、オーバーエンジニアリングになってしまうという問題も出てきます。課題の解決法は常に戦略、技術、オペレーションという３つの観点で考えなければなりません
Mac OS上にDockerを使ってkaggle kernelっぽい環境を構築

## はじめに

* kaggleで使われるkernelと同じ環境を、local上に再現したい。
* kaggle kernelはそれなりの性能をもったインスタンスだが、localマシンの方がより性能が良いので、 `localマシン上で試行錯誤した後、kaggle kernel上にコードを持ってきてsubmitする` と言った使い方がしたいからだ。
* kaggle kernelの仕様はDockerイメージとして公開されているので、これをlocalで動かす事により、それが実現できる。

## 環境

* MacOS

## 手順の概要

基本的に以下の2つの手順をやれば良い。

* MacにDockerをインストール
    * https://qiita.com/nemui_/items/ed753f6b2eb9960845f7
    * ちなみにこの手順で `docker-compose` もインストールされる。
* kaggle kernelのDocker imageをセットアップ
    * https://qiita.com/bam6o0/items/354faa9394755a984661

私は、 `docker-compose` を使うと管理が何かと楽なので、使う。

## docker, docker-composeの確認

dockerの確認

```bash
$ docker --version
Docker version 19.03.4, build 9013bf5
```

docker-composeの確認

```bash
$ docker-compose --version
docker-compose version 1.24.1, build 4667896b
```

## Dockerfileの作成

```Dockerfile:Dockerfile
FROM kaggle/python

WORKDIR /kaggle

COPY ./input /kaggle/input
COPY ./kernel /kaggle/kernel
```

* とりあえずimageとして `kaggle/python` を指定する。
* また、kaggle kernelでは、 `/kaggle/input/*`に `train.csv`などが置かれているケースが多い。
    * そこで、localの `./input/*` をDockerコンテナ上に`COPY`するようにした。
* さらに、localの `./kernel/*`もDockerコンテナ上に`COPY`する。
    * ここに`.py` を置く事にする。

## docker-compose.yamlの作成

とりあえず単に`Dockerfile`を使って `build` を行う。
`command` で`kernel/script.py`を実行させる。

```yaml:docker-compose.yaml
kaggle-kernel:
  build: .
  command: python kernel/script.py
```

## 動かしてみる

### build

```bash
$ docker-compose build kaggle-kernel
```

### run

適当なスクリプト

```python:kernel/script.py
import pandas as pd

train = pd.read_csv("/kaggle/input/nfl-big-data-bowl-2020/train.csv")
print(train.shape)
```

```bash
$ docker-compose run kaggle-kernel
(509762, 49)
```

動いた。
pandasが使えていることから各種packageについても `Kaggle/docker-python` に設定されているものが使えていることが分かる。
docker-composeでcommand走らせる時に楽にするshell(fish)

```shell:config/fish
function dr --description 'docker-compse run --rm (peco service) $arg'
  if not string length -q -- $argv
    echo 'command empty'
    return
  end

  set -l container (docker-compose ps | awk '/_1/ {print $1}' | peco )
  if string length -q -- $container
    set -l service (string split _ $container)[2]
    docker-compose run --rm $service $argv
  else
    echo 'container not found'
  end
end

```
Misskeyのインスタンス建てたときのメモ

# はじめに
**参考にした記事**
[その1](https://noellabo.qrunch.io/entries/8i3RHuZ1wJNDinIn)
[その2](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

極論こいつらをコピペすれば僕の記事なんて見なくてもビルドはできます

使っているOSはDebian 10 Busterです

# 建て方

## アプデと主要なソフトのインストールをする
当たり前だけど一応
`sudo apt update`
`sudo apt upgrade -y`

パッケージのインストール、DBがクラウド上にある人はPostgresは要りません
`sudo apt install postgresql redis-server nginx build-essential python npm nodejs wget curl nginx`

## DBの設定をする (クラウド上にある人はry)
`sudo -u postgres psql`
`CREATE ROLE misskey LOGIN CREATEDB PASSWORD 'YOURPASSWD';`
`CREATE DATABASE misskey OWNER misskey;`
`\q`

## Nodeのインストール
`sudo npm install n -g`
`sudo n latest`

`sudo apt purge -y nodejs npm`
`exec $SHELL -l`

## Yarnのインストール
`curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -`
`echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list`

`sudo apt-get update && sudo apt-get install yarn`

## ここでGCEなどの無料枠を使用している人はスワップの作成を推奨
`sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo nano /etc/fstab`

## Misskeyのインストールをする
`sudo adduser --disabled-password --disabled-login misskey  
sudo -iu misskey  
git clone -b master git://github.com/syuilo/misskey.git
cd misskey
git checkout master  
yarn install
cp .config/example.yml .config/default.yml  
nano .config/default.yml`
コンフィグはファイル内に書き換え方が書いてます

そしてビルド,DBの初期化
`NODE_ENV=production yarn build
yarn run init`
いったんここで止めます

## systemd,nginxの設定

systemd設定
`sudo nano /etc/systemd/system/misskey.service`

内容
`[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/yarn start  
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target`

`sudo systemctl daemon-reload
sudo systemctl enable misskey`

ここからnginx
私は証明書をCloudflareから引っ張ってきたので
必要な人は[ここ](https://qiita.com/ynakayama/items/eb47b3161874ee5fc44a)からLetsEncryptの設定をやってください
そのあと[ここ](https://noellabo.qrunch.io/entries/54MFy6cuWRsKUhQg)からCloudflareなんかに紐付けしてください

`sudo cp /home/misskey/misskey/docs/examples/misskey.nginx /etc/nginx/sites-available/YOURDOMAIN.com
cd /etc/nginx/sites-enabled  
sudo ln -s ../sites-available/YOURDOMAIN.com`

その後はexanple.tldを適宜取得したドメインに書き換えてください
Nginxのテスト
`sudo nginx -t`

systemd関連更新
`sudo systemctl reload nginx
sudo systemd start misskey`

## 最後に
中の人はCloudflare,Wasabi,Google Cloud SQL,Google Compute Engine上に建てました
多分これが一番安定すると思います
リンクはこちら
https://misskey.nemonet.xyz
Alamofireのバージョン5ではダウンロードのキャンセル時の一時領域ファイルの扱いが少し変わったぽい？

**この投稿は調査中のメモです**

実際に試すとは思いますが、今すぐではありません。
繰り返しになりますが、この投稿はメモです。

Alamofireのバージョン5ではダウンロードのキャンセル時の一時領域ファイルの扱いが少し変わったぽい？


## まず前提となりそうな内容

* [Can I specify the temporary url of the downloading file? · Issue #2434 · Alamofire/Alamofire](https://github.com/Alamofire/Alamofire/issues/2434)

## Alamofire5で変更が加わったものをAlamofire4でも使えるようにしたと思われる内容

* [Cancel download without producing resume data in tmp folder · Issue #2841 · Alamofire/Alamofire](https://github.com/Alamofire/Alamofire/issues/2841)

* [Add option to not create resume data on cancel for DownloadRequest by ullstrm · Pull Request #2851 · Alamofire/Alamofire](https://github.com/Alamofire/Alamofire/pull/2851)
Longan Nano 爆速Tips - 環境設定～Lチカ編 -

RISC-V CPU搭載 GD32VF103CBT6開発ボードのLongan Nano
みなさんの手元にも届きましたでしょうか。
![IMG_20191025_215240.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/26c4cb77-789f-4661-7a1b-55b3bbfbf66e.jpeg)

RGB LCDとアクリル製透明ケースがついて1000円でお釣りが来ます。
日本だと秋葉原のShigezoneで買えます。

![IMG_20191025_215812.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/d49b9004-8187-27be-dc5e-479293bb8278.jpeg)

デザインもかっこいい！


そんなLogan NanoでLチカする爆速Tipsを紹介します。

※「Windows」で「USB DFU download」方式の手順です

## 環境構築　IDE編

###IDE準備

Longan NanoはPlatformIO IDEに正式に対応しています。

IDEといいつつVScodeやAtomのプラグインです。

今回はVScodeを使用しました。

サクッとPlatformIO IDE環境を準備してきてください。

以下、PlatformIOはPIOと表記します。

※Longan IDEという名の謎のvscodeも配布されてますが、配布されている意味がよくわからなかったので使いませんでした。


### IDE設定

PIO homeを開き「NewProject」を選択。

プロジェクト名を入れて、Boardのところに「lon」まで入れると絞り込みされるので、選択。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/e10a83e4-5200-bda8-e044-fa8be11086cd.png)

Frameworkに「Giga Device GD32V SDK」を選択

Finishを押すと初期設定がされます（ちょっと時間かかる）

次に、PIO homeの「Project Example」から「longan-nano-blink」を選択してFinish

これであとはボードに書き込めばLチカの完成です。


## ボード初期設定手順

ボードの初期設定は少しややこしいです
すーぐ色々と変わりそうなので2019年10月25日現在の情報ということで予めご了承ください。

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

・以下のドライバを入手し、インストール
　//dl.sipeed.com/LONGAN/Nano/Tools/GD32_MCU_Dfu_Tool_V3.8.1.5784_1.rar

・Longan NanoをDFUモードにします
　→　BOOT0ボタンとResetボタンを同時押し（BOOT0を先に押して、Resetボタンを先に離す、BOOT0ボタンを離す）

### ドライバの書き換え

・以下からZadigをダウンロードして起動
　//github.com/pbatard/libwdi/releases/download/b721/zadig-2.4.exe
　→　ボードがDFUモードに入っていたら表示されます
　→　表示されないときは「Option」から「List All Devices」を試してください
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/e9e31965-f4c1-e176-9152-f4e0338a4eb6.png)


## 書き込み手順

・PIOに戻り、先で準備したサンプルプロジェクトの「platformio.ini」を編集
　→　upload_protocol = dfu　を追加

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/835a507b-009f-8d25-7cfb-a3cc15fbf36b.png)

・いよいよ書き込み
　→　ArduinoIDEと同じ手順です（チェックでビルド、矢印で書き込み）
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/3ae1eff3-8cc0-8f3b-24b1-0b5a9bde8ff7.png)

***

以上が爆速Tipsとなります。

↓無事書き込めるとこうなります
![ezgif-2-6592a98ac121.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/0dd094e7-e530-580d-1ef6-3db7cd0313d2.gif)

何故か僕の環境だとエラーが出るんですが、調べても情報がなく、無事書き込めてるのでよしとしました。
しかし、最初、書き込むプログラムがおかしくてLチカできないのをこのエラーのせいだと思い込んで、かなり時間ロスしたので、念のため掲載しときます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273740/d1055900-326d-f9a6-d8ff-57c13c9fef39.png)

Invalid DFU suffix signature
A valid DFU suffix will be required in a future dfu-util release!!!
dfuse_download: libusb_control_transfer returned -9
*** [upload] Error 74

***

以上です。
いかがでしたか？

SpecialThanks : ﾃﾝｲﾝｻﾝ
NGINX Ingress ControllerのPodがPendingになる

# 環境

* EKS v1.13
* NGINX Ingress Controller 0.26.1

# 事象

### 公式通りにデプロイ

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
```

### Pendingになる

```
$ kubectl get pod -n ingress-nginx
NAME                                       READY     STATUS    RESTARTS   AGE
nginx-ingress-controller-5bcd4b688-9hlzz   0/1       Pending   0          2m50s
```

### describe pod(eventのみ記載)

```
$ kubectl describe pod -n ingress-nginx
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  17s (x2 over 17s)  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.
```

スケジューラが適切なノードが発見できない、と言っている。
ちなみに、`kubectl logs`は、ログが出力されませんでした。つまりコンテナは作成されていない。

### ノードに異常は見られない

```
$ kubectl get node -o wide
NAME                                        STATUS    ROLES     AGE       VERSION               INTERNAL-IP   EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                  CONTAINER-RUNTIME
ip-10-0-16-149.us-east-2.compute.internal   Ready     <none>    146m      v1.13.11-eks-5876d6   10.0.16.149   <none>        Amazon Linux 2   4.14.146-119.123.amzn2.x86_64   docker://18.6.1
ip-10-0-44-207.us-east-2.compute.internal   Ready     <none>    146m      v1.13.11-eks-5876d6   10.0.44.207   <none>        Amazon Linux 2   4.14.146-119.123.amzn2.x86_64   docker://18.6.1
ip-10-0-78-170.us-east-2.compute.internal   Ready     <none>    146m      v1.13.11-eks-5876d6   10.0.78.170   <none>        Amazon Linux 2   4.14.146-119.123.amzn2.x86_64   docker://18.6.1
```

# 直接的な原因

### NginxのPodにNodeSelectorが追加された

* [Bind ingress controller to linux nodes to avoid Windows scheduling](https://github.com/kubernetes/ingress-nginx/commit/1908d0e60582ca7db0d2ae778efc2318dc9fdd07)

# 背景

KubernetesがWindowsノードにも対応していくが、NGINX Ingress ControllerはLinuxノードで起動する必要があるため、NodeSelectorが追加された。
恐らく、今後はkubeadmやクラウドのマネージドサービスなど、ノードにはデフォルトでLinux/Windowsを示すラベルが貼られるのだと思う。
たぶん公式の[Well-Known Labels](https://kubernetes.io/docs/reference/kubernetes-api/labels-annotations-taints/)にあるようなものだろう。

# おわり

何か不思議に感じたら[最新の公式手順](https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md)と[最新のマニフェスト](https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/mandatory.yaml)を見た方が良いと思います。
Golang で string 型の enum 的なもの


## やりたいこと :relieved:

連続する数値の文字列

```golang
const (
	zeroStr = "0" 
	oneStr = "1"
	twoStr = "2"
	threeStr = "3"
	fourStr = "4"
	fiveStr = "5"
)
```

をintみたく:point_down:iotaで自動採番したい。

```golang
const (
	zeroInt int = iota
	oneInt
	twoInt
	threeInt
	fourInt
	fiveInt
)
```

## やったこと :angel:

asciiにしてあげる

```golang
const (
	zeroStr = string(iota + '0') // '0' == 0x30
	oneStr
	twoStr
	threeStr
	fourStr
	fiveStr
)
```

以上です:relaxed:
Railsでポートフォリオを作ってみよう！ vol.1 前編 (Docker導入編)

※すぐにDockerの導入から始めたい人は→[Dockerの導入](https://qiita.com/pondo/items/547a9cb4cd2a6f291468#dockerの導入)
#Dockerとは

DockerとはDocker社が、開発を行っている。
コンテナ型の仮想環境を作成、配布、実行をすることができるプラットホームのこと。
[公式文章](https://www.docker.com)
[日本語訳公式文章](http://docs.docker.jp/engine/installation/toc.html)

ホストマシンのカーネルを使用し、プロセス等を隔離しつつ実行を行っている為、別のマシンを動かしているように使用する事ができる上に、軽量、高速で起動や停止を行う事ができる。
比較対象としてよく仮想マシンが挙げられている事が多いが、違いとしては、

>仮想マシン
物理マシン > ホストOS > Hypervisor > ゲスト(仮想)OS > ミドルウェア > アプリ

>コンテナ
物理マシン > ホストOS > DockerEngine >ミドルウェア > アプリ

である。

参考文章
[Hypervisorとは？](https://www.idcf.jp/words/hypervisor.html)
[ミドルウェアとは？](https://thinkit.co.jp/article/11837)

#コンテナの利点
・コード化されたファイルを共有することにより、どこの誰でもどのようなOSでも同じ環境が作成可能
・構築と削除が簡単に行える
・作成した環境の配布のしやすさ

つまりはめっちゃ万能

#Dockerの導入
Dockerの導入方法は複数ある(公式サイトからのDLやyarm経由での導入)
今回はHomebrew経由で導入を行ったが、まずHomebrew持ってないよ！っていう人もいると思うので、導入から。
まず、Dockerをインストールするまでに前提条件で必要になってくるのは
・Homebrew
・homebrew-cask
の2つなのでそれらを引っ張ってくる

```
>>Homebrewの導入
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

>>caskの導入
$ brew update
$ brew install caskroom/cask/brew-cask
```

そして上2つを入れれたら次にDockerを入れる

```
>>Dockerの導入
brew cask install docker
```

以上。おしまい。
※結構導入には時間がかかる為、時間に余裕があるときに行いましょう。

#Dockerを起動してみる

Dockerの導入は完了したので、早速Dockerを試してみたいが、このままdockerコマンドを打ち込んでも [command not found] と出てしまい何もする事ができない。
理由としてはDockerの起動を行っていないからなので

```
$ open /Applications/Docker.app
```

を叩くとDockerから
Docker Desktop is now up and running!
と言われ、dockerコマンドの使用が可能になる。

```
$ docker --version
Docker version 19.03.3
```

今回はDockerの導入〜起動までを行ってきた。
次回docker-composeの導入〜起動までを行い、rails環境を構築してみたいと思う。
組込の開発でも CI/CD を構築してみた

最近は組み込みの分野で CI/CD を構築していました。

組み込みの世界は物理的な状態変化が伴うので、 Web や業務アプリで使われているようなソフトウェア・エンジニアリングのプラクティスが簡単には適用しづらい所があります。そのような障害はありつつも、いくつもの製品がどんどんアップデートを繰り返す中で、テストやリリースを自動化しないとどうにもならないという機運が高まってきたので、今回仕事の中で挑戦することになりました。

今回はその取り組みが良い感じにできてきたので、時間をもらって記事にしてみました。

# Before/After

従来の開発では

* デバイスベンダーの IDE
* 手動リリース

だったものが

* VS Code
* Makefile
* GCC
* Jenkins でリリース

になりました。気合と根性のリリースがいくらか解消されて良い感じです。

# やったこと

1. VS Code を中心とした開発スタイルの確立
2. IDE のプロジェクトファイルを変換（するためのスクリプト）
3. Jenkins の構築と Job の設定

## VS Code を中心とした開発スタイルの確立

具体的には、サンプルアプリのプロジェクトに対して以下のことができるようにしました。

* VS Code からビルド・デバイスへの書き込み
* ログの取得・デバッガの利用

ビルドはサンプルについていたものを改造して、 Debug/Release/Test ビルドの定義を行いました。 Test ビルドは起動時に [Unity Test](https://github.com/ThrowTheSwitch/Unity) でテストを行い、ログに結果を出力します。

ログの取得・デバッガは、ベンダーから出ている Debug Server をバックグラウンドで起動して、 GDB を起動します。 VS Code から実行する GDB サーバーの起動スクリプトは以下のような感じです。

```bash
#!/bin/bash

GDBサーバーのコマンド $@ | sed --unbuffered 's/^/[GDBサーバーログの Prefix] /' &
sleep 1
ログ表示のコマンド | sed --unbuffered 's/^/[ログの Prefix] /' &
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
wait
```

これを `.vscode/launch.json` の `debugServerPath` に設定し、通常通り VS Code のデバッグ機能が使えるようにしました。

## IDE のプロジェクトファイルを変換

しばらくは並行期間を作りたいので、 IDE の設定を元に Makefile や VS Code の設定を生成するようにしました。ソース・インクルードパスやマクロの定義、コンパイラオプション、リンカの設定などが対象です。情報が充実しているとは言えませんが、 C のビルドをやったことがあるような人なら名前からおおよそ対応付けができる感じでした。

### Jenkins の構築と Job の設定

本当は Groovy とかでビルドの設定をコード化できると良いのですが、今回は簡易的に以下のような設定を行いました。

```bash
#!/bin/bash

if [ -x ./scripts/jenkins.sh ]; then
	./scripts/jenkins.sh
else
	echo -e "\033[1;43m WARN \033[00m ./scripts/jenkins.sh is not configured." 1>&2
fi
```

これで `scripts/jenkins.sh` さえいじれば誰もがビルドスクリプトを変更できます。完璧とは言えませんが、お手軽に Travis CI などに近い使用感が得られます。

`jenkins.sh` の内容はおおよそ以下のような内容です。

1. Lint
2. デバイスを必要としないホストマシン上の単体テスト
3. ビルド
4. デバイスへの書き込み
5. 実機自動テスト
6. （リリース時のみ）配布用パッケージの作成・テスト環境へアップロード

※追記：実機自動テストは安定稼働が難しく結局やめてしまいました。手元の開発では引き続き利用しています。

SaaS を利用せずに Jenkins を自前で構築したのは、実機のテストを行いたかったからです。現在はそれほど複雑なテストは行っていませんが、今後はセンサーなどと組み合わせて自動化の範囲を拡大できたらと構想しています。 CI/CD の導入自体に加えて、自動化されたテストで積み上げを作って行きたい所です。

# まとめ

組み込みの世界でも、 Web や業務アプリで行われているような CI/CD が実現できました。組込の CI/CD の障壁の一つは、 GUI のツールが充実していて CUI で自動化しようとすると少なからずリバースエンジニアリングが必要になってくる点があるかと思います。今回は充実してはいないものの、一応用意はされていたので、そこまで困難ではありませんでした。しかし、クローズドなツールに隠されてしまうと、このような取り組みは一気に難しくなってしまいます。また、ビルドや開発ツールチェーンのような低レイヤの知識は、なかなか身につける環境が無いという問題もあります。このあたりさえ突破すれば、開発プロセスをモダンに作り変えることができます。

今回これできたのは、 アプリ・組み込み・ハードのエンジニアがうまく連携できていることが一つ要因にあるかなと思います。ここからさらに静的解析を導入したりや自動テストを洗練させたりさせて、今よりももっと高品質な製品リリースを目指してまいります。また、このような取り組みに興味がございましたら[ぜひ一緒にやっていきましょう](https://qiita.com/organizations/bitkey)！

追記： [組込 1 年目のエンジニアが開発環境を整備した話](https://qiita.com/utisam/items/dd8717e007326e360e41) でその後の取り組みをより詳細に紹介しております。
Mac に Google 日本語入力を導入して設定する手順

Google 日本語入力については「 [Mac にインストールすべき GUI アプリケーションの薦め](https://qiita.com/normalsalt/items/e9603e6159338966ac81) 」にて、簡単に紹介しましたが、

設定の手順も忘れないよう、ここに記しておきたいと思います。

次の URL から、もしくは Cask により、インストールが完了していることは前提として、

https://www.google.co.jp/ime/

```
% brew install --cask google-japanese-ime
```

まず、システム環境設定で「 キーボード ＞ 入力ソース 」の画面を開いてください。
<img width="668" alt="Google 日本語入力 手順1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/95ee9b36-4387-6e20-a056-1ff2bf9491da.png">
ここで、上の画像の矢印で示した「 ＋ 」ボタンを押すと、以下のようなダイアログが現れるので、インストールした入力ソースを選択して、追加します。
<img width="668" alt="Google 日本語入力 手順2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/a4167d6b-9c7d-b553-0e33-0822a6edff1a.png">
また、同様にして、英語の入力ソースも追加しておきましょう。
<img width="668" alt="Google 日本語入力 手順3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/98a090fb-39e3-76bb-5adc-a90ec0cdeeb5.png">
これで、デフォルトの「 日本語 」入力ソースが削除できるようになったはずなので、下の画像の矢印で示している「 − 」ボタンを押して、消しておきます。
<img width="668" alt="Google 日本語入力 手順4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/c318a9bd-ac60-d16e-abf7-8923933b75c0.png">
以上で、設定は終わりなのですが、まだ、次のような警告が出てくるかもしれません。
<img width="420" alt="スクリーンショット 2019-10-25 19.13.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/c031175b-d062-0863-f694-6d9fa4a6a116.png">
そして、設定直後は、もしかすると「 英数キー 」や「 かなキー 」による入力の切り替えができなくなっている可能性があります。

切り替えについては、一度「 control + Space 」や、メニューバーの入力メニューから変更してみると、直るかもしれませんが、

いずれにせよ、警告の通りに、再起動しておきましょう。

これらの手順により、おそらく、Google 日本語入力の環境設定ソフトウェア（ ConfigDialog ）や、ユーザー辞書ツール（ DictionaryTool ）なども、使用できるようになっているはずです。

ちなみに「 [複数の Mac で Google 日本語入力のユーザー辞書を共有する方法](https://qiita.com/normalsalt/items/2dbd5e32c8845ce0b754) 」についても記事を書いているので、良かったら参考にしてみてください。
自分用

<h1 style="font-size: 24px;
margin: 50px;">
本文</h1> 

読みやすい文字サイズは14~16px
12px以下は読みにくい
marginは余白

```css:
    h1 ｛
         font-size: 24px
         margin: 0;
        ｝
    p   ｛
          font-size: 14px;
         ｝
```
headタグの中にスタイル属性を入れると､まとめてfontsizeを変えることが出来る
セレクターを入力する事で指定できる(p､h1など)
marginは0;
タグの中にはインデント(半角スペース4回)
コメントは<!--コメント-->
css内のコメントは/＊コメント＊/
見やすくするためにする
複数のページがあるときに､スタイルを統一したい時には、別のファイルに記述する(外部参照)
headタグの中に書くのは内部参照
タグの中にスタイル属性で書くのはインライン
ファイルの名前はstyle.css(index.html)と同じ場所に作る
フォーマッターをインストールしてインデントを調整する
頭のタブは全体を選択してshift+tabキーで調整する
右上にエディターを分割出来る機能がある
画面を分割してhtmlとcssを同じ画面で操作出来る

```html:
<link rel="stylesheet"href="style.css">
```

外部で作ったcssファイルを読む込むにはlinkタグを使う
linkタグにはrel属性が必要(関連したものという意味)
cssを読み込むには必須
hrefはウェブ上の資産を参照するという意味
基本的には外部参照で書いていく

```css
 body {}
.classname {}
 #IDname{}
```

```css
transform: rotate(xxdeg);回転させる
```
Scalaのsealedクラス

Enum書いたりパターンマッチで網羅させたいときに呪文のように書いてる`sealed`クラス、根本的に何なんだっけと思ったのでメモ

# 封印されたクラス
sealed = 封印されたクラス。
sealedクラスでは、同じファイルで定義されているサブクラス以外は新しいサブクラスを追加できないようになっている。
だから、sealedクラスのサブクラスをケースクラスで定義してしまえば、それらがsealedクラスの全サブクラスになるので、パターンマッチでの網羅性が保証される（具体的にはコンパイラーが警告を発してくれる）。

```scala
sealed abstract class Color
case class Red(code: String) extends Color
case class Blue(code: String) extends Color
case class Green(code: String) extends Color
```

以下のような場合漏れがあり怒られる

```scala
def func(c: Color) = c match {
  case Red(_) => "red"
  case Brue(_) => "blue"
}
```

# 参考
[Scalaスケーラブルプログラミング第3版 | Martin Odersky, Lex Spoon, Bill Venners, 羽生田 栄一, 水島 宏太, 長尾 高弘 |本 | 通販 | Amazon](https://www.amazon.co.jp/Scala%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E7%AC%AC3%E7%89%88-Martin-Odersky/dp/4844381490)
UIButtonのフォントサイズを横幅に合わせて調整してくれる設定

コードから

```swift
let button = UIButton()
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.minimumScaleFactor = 0.3 // 30%まで小さくなる
```

Stroryboardから設定出来るようにするextention

```swift
@IBDesignable
extension UIButton {
    @IBInspectable var adjustsFontSizeToFitWidth: Bool {
        get { return titleLabel?.adjustsFontSizeToFitWidth ?? false }
        set { titleLabel?.adjustsFontSizeToFitWidth = newValue }
    }
    @IBInspectable var minimumScaleFactor: CGFloat {
        get { return titleLabel?.minimumScaleFactor ?? 1.0 }
        set { titleLabel?.minimumScaleFactor = newValue }
    }
}
[Ruby] self、特異クラス、特異メソッド、値と参照について

```rb
self
=> main
```

---

# 初級編

---

```rb
h_class = class Hoge
  self
end

h_class == Hoge
=> ?
```

---

true

---

```rb
class Hoge
  def foo
    self
  end
end

hoge = Hoge.new

hoge.foo == Hoge
=> ?
```

---

false

---

```rb

class Hoge
  def foo
    self
  end
end

hoge = Hoge.new

hoge.foo == hoge
=> ?
```

---

true

---

初級編まとめ

- class 内の self はクラス自身
- メソッド内の self はレシーバ
- トップレベルの self は main

---

# 中級編

---

```rb:特異メソッドその1
class Hoge; end
hoge = Hoge.new

def hoge.foo
  self
end

hoge.foo == hoge
=> ?
```

---

true

---

```rb:特異メソッドその2
class << hoge
  def foo
    self
  end
end


hoge.foo == hoge
=> ?
```

---

true

---

特異メソッドだとしてもメソッド内の self はレシーバを指す。

---

```rb
s_class_hoge = class << hoge
  self
end

s_class_hoge == hoge
=> ?
```

---

false

---

```rb
s_class_hoge = class << hoge
  self
end

s_class_hoge == hoge.class
=> ?
```

---

false

---

```rb
s_class_hoge = class << hoge
  self
end

s_class_hoge == hoge.singleton_class
=> ?
```

---

true

---

特異クラス内の self はその特異クラスを指す。

---

中級編まとめ

- 特異クラス、特異メソッドでも、普通のクラス、メソッドと同じルール。
- 特異クラス内の self は、その特異クラスを指す。
- 特異メソッド内の self は、レシーバを指す。


---

# 上級編

---

Ruby 世界の UFO と呼ばれている特異クラスを捕まえることができました。

```rb
ufo = class << hoge
  self
end

# または

ufo = hoge.singleton_class

# 特異クラス ufo のクラスは Class なのか？

ufo.class == Class
=> ?
```

---

true

---

ufo は singleton class （特異クラス）です。まるでシングルトンパターンを満たすクラスのように振る舞うのでしょうか？

```rb
u1 = ufo.new
u2 = ufo.new
u1 == u2
=> ?
```

---

error

解説: singleton class は new することはできません。

---

あるオブジェクトが singleton class か、ただの class かどのように見極めたら良いでしょうか？

```rb
ufo.singleton_class?
```

直感的です。

---


上級編まとめ

- singleton_class は new できない
- obj.singleton_class? で判別できる


---

超上級編

---

```rb
def foo
  self
end

def foo.bar
  self
end

foo.bar == foo
=> ?
```

---

true

---

```rb
def foo
  "str"
end

def foo.bar
  self
end

foo.bar == foo
=> ?
```

---

error

---

```rb
f = def foo
  self
end

def f.bar
  self
end
f.bar == f
=> ?
```

---

error

---

```rb
def foo
  "foo"
end
def foo.bar
  self
end

foo.bar == foo
=> ?
```

---

error

---

```rb
def foo
  "foo"
end

f = foo
def f.bar
  self
end

f.bar == f
=> ?
```

---

true

---

```rb
def foo
  123
end
def foo.bar
  self
end

foo.bar == foo
=> ?
```

---

error

---

```rb
def foo
  123
end

f = foo

def f.bar
  self
end

f.bar == foo
=> ?
```

---

error

---

超上級編まとめ

- 特異メソッドはオブジェクトに生えるのではなく、オブジェクトの参照に生える
- Symbol、Integer、Float、Rational、Complex などは、特異メソッドは生やせない


---

ありがとうございました！


---


# cf

We've said that all values in Ruby are objects and all objects are manipulated by reference. In the reference implementation, however, Fixnum and Symbol objects are actually "immediate values" rather than references. Neither of these classes have mutator methods, so Fixnum and Symbol objects are immutable...The only practical difference between immediate values and reference values is that immediate values cannot have singleton methods defined on them.
CTF解法蓄積メモ

# これはなに
* CTFの解法を主にまとめていきます．
* 最初は一つの記事として作りますが，後に分離させるかも
* 大体自分で見返す用
* なんとなくジャンル的な分類でまとめては行きたい
* 開催された大会ごとにまとめるということはしませんが，見出しの後ろにつけます

# 主な章立て

```text
## ジャンル
### 問題名 (出題元) : XSSとかSQLiとかCodeInjectionとか...
解けたか解けなかったとか，所感とか書く
#### 問題と試行
ここに問題と，その試行の記録などを書く
#### 解法
ここに解法，まとめを書く
#### 知見
ここに解くことによって得た知見を書く
```

# 本体

## Injection

### web_search (SECCON2019) : SQLi
* 解けなかった(2019/10/22)
* 基礎知識の不足が問題

#### 問題と試行
* 検索窓があり，そこにテキストを入力して送信すると，検索に一部一致した結果が返ってくる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341127/d89b5b1a-0b29-27da-28ee-f356df660e06.png)

* SQLiだろうなという印象があったのでとりあえず `';--` とかやってみた，エラー．
* 次に `';#`でやってみる，普通の結果が返ってきた -> MySQLかな
* 元のSQLは`SELECT rfc, desc from rfc_table WHERE rfc LIKE 'RFC%' AND desc LIKE '%ココ%';`かなといった所感
* `' or 1;#`とかやってみる． -> `';#` になって？？？？？？ << ここでお手上げ

#### 解法
* SQLiである．またMySQLで動いている．
* サーバ側で `,`,` `,`or` がエスケープされている
* ORだけ再帰的にエスケープされていない．
    * これにより`OORR`とすることでORをバイパスできる
* `,`,` `なしでSQLを組み立てる必要があった．
    * スペースに関しては，`/**/`でスペースに置き換わるようだ，
    * `,`が使えないことに関しては以下の方法で解決できるようだ，
        * `SELECT * (SELECT 1)a join (SELECT 2)b join ...`
        * joinしていって，お目当ての個数になるまでつなげる．
* まず全件表示`' OR(1)` -> flagがflagテーブルにあることを教えてくれる
* flagテーブルの結果をunionで引っ付ける
    * RFC番号とその説明なので，ID含めて3つでいいかな -> 3つ枠を用意しておく
    * `hoge' UNION SELECT * FROM (SELECT * FROM flag)a JOIN (SELECT 1)b JOIN (SELECT 2)c;#`
    * 上記のスペースを`/**/`に置き換える．  
    * 
結論

```sql:payload.sql
'or(1);#
hoge'/**/UNION/**/SELECT*FROM(SELECT*FROM/**/flag)a/**/join(SELECT/**/1)b/**/join(SELECT/**/2)c;#`
```

#### 知見
1. `/**/`はスペースに置き換えられる
2. `SELECT * FROM (SELECT 1)a JOIN(SELECT 2)b JOIN...`とカンマなしで取得
3. とりあえず色々試してみる．`OR`とか特に動かしやすい物を，エスケープだけならSQLがエラーでもわかる
4. `OR(1)`という記法もある
picoCTF 2019 Easy1 - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/07d8b073-a14d-7e32-4d5c-6232a3ebf844.png)

#解いてみた

tableリンクからファイルをダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/bd369c4b-547d-0e22-c0f7-bfcd873b9944.png)

このテーブルに従って復号する問題のようです。
1行目とSOLVECRYPTOが一致するところ、中とUFJKXQZQUNBが一致するところの左の列が答えになります。

次の問題も簡単だったのでここで一緒に書きます。

----

First Grep - Points: 100

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3831fa93-5dab-1ddf-0893-8ef93890bd95.png)

ファイルを開いて「pico」で検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f2d57fed-20cc-d6c9-fdbf-4a05e4f20c16.png)
日本語プログラミング言語「プロデル」でIrisの分類タスクをやる（ニューラルネットワーク編）

機械学習用データといえば，UCIのMachine Learning Repositoryですが，中でも有名なのがIris Data Setではないでしょうか。分類問題を一層のニューラルネットワーク（？）で解いていきたいと思います。

## データの前処理

データセットは，カンマ区切りで，1行につき1つのデータとなっています。4つの数値と，1つのラベルからなっています。

### splitの実装

さて，perlにもpythonにもsplitなるものがあるのですが，プロデルにはありませんので，まずこれを実装します。

```プロデル:文字列操作.rdr
［文字列：文字列］を［区切り文字：文字列］で分割する手順：配列
	【配列】は，｛｝。
	【現在位置】は，1。
	【次の位置】。
	繰り返す
		次の位置は，文字列の現在位置文字目から区切り文字を探したもの。
		もし次の位置が0なら
			文字列の現在位置文字目以降を配列に加える。
			繰り返しから抜ける
		でないなら
			文字列の現在位置文字目から次の位置-現在位置文字，取り出したものを配列に加える。
			現在位置は，次の位置＋1。
		もし終わり
	繰り返し終わり
	配列を返す。
終わり
```

配列の添字が1から始まることに注意して下さい。

これで，「アイリスデータを「，」で分割する」という表現が可能になりました。

### データの読み込み

HTTPから直接読み込む場合は，

```
アイリスデータは，HTTPで「https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data」を取得したものの行区切り
```

このようにします。ローカルに保存した場合は，

```
アイリスデータは，「ファイル名」から読み込んだものの行区切り
```

とします。これで，配列アイリスデータに，1行ずつテキストが入りました。

データ数は150ですが，なぜか空っぽの151行目，152行目があるので，これを消しておきます。

```
アイリスデータは，アイリスデータの151番目を消したもの。
アイリスデータは，アイリスデータの151番目を消したもの。
```

次に，データとラベルを入れるための行列を作ります。データは，1行につき1つですから，150行4列の行列が必要です。また，ラベルはone-hotベクトルになっていないといけないので，3クラスの分類ですから3次元必要です。よって，150行3列の行列を作ります。

```
データという行列（アイリスデータの個数，4）を作る。
正解という行列（アイリスデータの個数，3）を作る。
```

ちなみに，

```
データは，行列（アイリスデータの個数，4）を作ったもの。
正解は，行列（アイリスデータの個数，3）を作ったもの。
```

という書き方もできます。

続いて，1行ずつデータを処理していきます。

```プロデル:アヤメの分類_NN.rdr
アイリスデータの個数回，【カウンタ】にカウントしながら繰り返す
	【一行】は，アイリスデータ（カウンタ）を「,」で分割したもの。
	4回，【添字】にカウントしながら繰り返す
		データの中身（カウンタ）（添字）は，一行（添字）。
	繰り返し終わり
	一行（5）について分岐
		「Iris-setosa」の場合
			正解の中身（カウンタ）は，｛1，0，0｝。
		「Iris-versicolor」の場合
			正解の中身（カウンタ）は，｛0，1，0｝。
		「Iris-virginica」の場合
			正解の中身（カウンタ）は，｛0，0，1｝。
	分岐終わり
繰り返し終わり
```
これで，前処理は終了です。

## 学習を行う

本来は訓練データと評価データを分けるのですが，別に研究をやっているわけではないので，全部ぶち込みます。

```プロデル:アヤメの分類_NN.rdr
ネットワークは，一層（4，3）を作ったもの。
反復数は，500。
学習率は，0.05。
反復数回，繰り返す
	勾配は，ネットワークで正解が正解でデータにおける勾配を計算したもの。
	勾配の個数回，【キー】にカウントしながら繰り返す
		ネットワークのパラメータ（キー）から，学習率を勾配（キー）に全部かけたものを破壊的に引く。
	繰り返し終わり
	ネットワークで正解が正解でデータにおける損失を計算したものを表示。
繰り返し終わり
結果は，ネットワークでデータから推定したものが最大値となる添字を転置したもの。
結果を表示。
正解が最大値となる添字を転置したもので結果を比較したものを表示。
```

たかが150個なので，ミニバッチもなにもありません。全部そのまま投げます。

「正解が正解で」という変な表現がありますが，これは変数名のつけ方がヘタクソなだけです。

インタプリタで実行しても大して時間はかかりません。

結果は以下のようになりました。

```
1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，1，2，2，2，2，2，2，2，2，2，2，2，2，2，2，2，2，2，2，2，2，3，2，3，2，2，2，2，2，2，2，2，2，2，3，3，2，2，2，2，2，2，2，2，2，2，2，2，2，2，2，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3，3
----- アヤメの分類_NN -----
0.973333333333333
```

学習データをそのまま使って推定していますが，正解率は97.3%です。きちんと学習したことが分かります。「きちんと」というのは，プログラムが無事動作したという意味で，汎化性能が良いなどという意味ではありません。
ディレクトリについて

ここではファイルとディレクトリの内容について記述しています．
訂正がありましたら適宜更新しています．
##引用サイト
http://www.cc.kyoto-su.ac.jp/~hirai/text/files.html
（こっちのサイトの方がわかりやすいと思います．）

#ディレクトリとは？

現実世界と同じで，整理整頓するときは目的や種類に応じて整理した方が探しやすいです．
UNIX / Linuxではこの整理のために"ディレクトリ（directory）"が使われています．
ディレクトリは，ファイルとディレクトリの両方を自分より下の階層に置く（格納する）ことができます．

ファイルやディレクトリは，全てディレクトリによって整理されていて1つのツリー構造で表されています．
（確率の樹形図を想像するとわかりやすいかも）
ツリーの一番上を"ルートディレクトリ（root directory）"と言います．
（樹形図なら一番左）

##あとがき
そのうちファイルとディレクトリの違いをまとめて再編集したいです...
組織の生産性

組織について語る前に、まず大前提としてクリアしなければならないことがある。

それは、組織内にNPDを存在させないことだ。

組織論、手法、マネジメントなど類はこのNPDの存在一つで全く機能しなくなる。

それほど、NPDは危険であり、全力で排除する必要がある。
picoCTF 2019 Bases - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/676ce623-3368-a8e7-9302-0307e26dd282.png)

#解いてみた

basesと言ってるのでbase64してみる。
CyberChef使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cd7af6a3-9346-560f-938a-7c17150dc347.png)

flagの中身のようなものができたので、これを入力したら答えでした。
picoCTF 2019 13 - Points: 100

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e5698706-19de-af18-5a5c-9c66b35d4a8d.png)

#解いてみた

ROT13の問題です。
CyberChef使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9e16bbc9-1e5c-1d25-48d9-a4685844d7a2.png)


答えです。
picoCTF 2019 handy-shellcode - Points: 50

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b9d16d12-711c-2615-8b62-accda079c4e1.png)

#解いてみた

この問題を解く前に、もっと前に一つ飛ばしていた問題があったので、それから解きます。

----

2Warm - Points: 50

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/66b9224b-e0fe-c518-846d-2f29413aa6cb.png)

10進数を2進数に変換する問題です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c558c30c-f7fd-441e-f5db-65e6e6dabf2c.png)

----

さて本来の問題に戻ります。
sourceを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/745fb47d-605b-ae5c-ebe8-ccd4e9e1c560.png)

```
((void (*)())buf)();
```

で頑張る系のやつです。
サーバを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/edd81e93-d5e6-0e08-509a-d7fa889c7cd6.png)

さっきのを頑張ってflag.txtを表示するやつです。

[picoCTF 2018 shellcode - Points: 200](https://qiita.com/CTFman/items/154d6a3b008f8080d103)

と一緒の解き方でできます。

実行ファイルのビットを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f199342c-a8ee-e022-dc77-459325330b27.png)

32bitだということが分かりました。

shellcodeを調べます。
http://shell-storm.org/shellcode/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/acfd1116-f8e1-4cbf-007e-c6fb69f437e8.png)

ここら辺がよさそうでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/bf898f8e-3bc0-ca27-924d-c6cdcc91cb90.png)

これをコピーします。

```
(echo -e "XXXXXXXXXXXXXX";cat) | ./vuln
```

のXXXのところにコピーした文字列を入れて実行します。
実行後入力状態になったら

```
cat flag.txt
```

を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e96b9f23-e7eb-242e-c1e8-583b6fa533e5.png)

できた。
50点問題がまだ続くのでここで一気にいきます。

----

practice-run-1 - Points: 50

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/426f54e5-5b4d-bd42-a0d3-07502c3e4b88.png)

ファイルをダウンロードして、「pico」で検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a08c80fc-0b2e-362c-31f3-baf1c9cf0d07.png)

----

unzip - Points: 50

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/16c52521-8f54-38ff-b468-d55b1d6e090c.png)

ファイルをダウンロードして、解凍して画像を表示させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b9b8e09d-f359-4c8c-1b8a-7067ea4c2437.png)

フラグが書かれているので、そのまま入力する。

----

vault-door-training - Points: 50

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/050a3198-f3ae-3b10-71a9-41be4757a0c1.png)

英語が長すぎてよく意味がわからないので、javaファイルをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/77a5c29e-4fc8-a229-42e6-e1083fa72bf2.png)

怪しげな文字列があったので、入力してみたらこれが正解でした。
50点問題はここで終了です。

それにしても1点問題はよくわからん。
EmacsからVisual Studio Codeに移るメモ（随時更新予定）

随時更新していく予定です。

## Emacsのあれはどれ編

### .emacs.d

OSによりますが、Macの場合は`~/Library/Application Support/Code/User/`です。ファイルは2つあるので以下のようにしてシンボリックリンクにしています。

```shell
ln -s settings.json  ~/Library/Application\ Support/Code/User/
ln -s keybindings.json  ~/Library/Application\ Support/Code/User/
```

### Emacsキーバインド

[Awesome Emacs Keymap - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=tuttieee.emacs-mcx)

この拡張機能がほぼ完璧です。他の拡張機能はバグっていたりして大変。

### M-x

`⌘-Shift-p`

### 隠しフォルダを開く

これはMacのデフォルトの機能ですが、`⌘-Shift-.`を押すと一時的に出てくるのでそこで選択できます。

### emacsclient

`code`をインストールすれば同じように使えます。`⌘-Shift-p`でインストール。

### describe-key

```
Code > Preferences > Keybord Shortcuts
```

で色々検索できます。便利。

### C-x b

`⌘-p`

### toggle-trucate-lines

`Toggle Word Wrap`

### require-final-newline

`"files.insertFinalNewline": true`を設定

## Emacsのあれを実現する

GUIでもできますが、codeをインストールしておくと良いです。

```shell
# リスト
code --list-extensions

# インストール
code --install-extension hogehoge
```

### tramp

今までEmacs以外を使えなかった理由の1つだったtramp。Remote Developmentが最高すぎて最高なのでそんなことはもう言ってられません。これが使いたいから移ったと言っても過言ではない。

[VSCodeのRemote Developmentを使ってリモートのRuby\(Sinatra\)をデバッグする \- Qiita](https://qiita.com/saboyutaka/items/fc147478db58eeeaa742)

### whitespace

`shardulm94.trailing-spaces`がよさげ

### expand-region

`letrieu.expand-region`で`editor.action.smartSelect.expand`を適当なキーに当てる

### git-link

`ziyasal.vscode-open-in-github`

### open-junk-file

`patricklee.vsnotes`をインストールしていい感じに設定します。機能が豊富で便利。

### recentf-open-files

`workbench.action.openRecent`

## 便利な設定とか

### markdown

`shd101wyy.markdown-preview-enhanced` `yzhang.markdown-all-in-one` をインストール

### コピペしたら書式も一緒にコピペされる

[VSCodeでコピーする時に「書式なし」をデフォルトにする - Qiita](https://qiita.com/kaityo256/items/d39884c36bd5b35e6427)
Firestoreからたくさんのデータを取得してたくさんのデータを書き込むのに使えそうな関数

500件以上取得する可能性のあるクエリで取得したドキュメントをコピーしたいときがあったので作りました。一応テストもしたのでちゃんと動きます。

```typescript
import { firestore } from "firebase-admin"
const db = firestore()

/// batchExecutorに最大500件ずつSnapShotを渡してくれる
/// 注意：
///   queryにはorderつけて渡すこと（query.startAtがうまく動かなさそうなので）
///   await batch.commit() はbatchExecutor内で呼ばないとデータ処理されない
export async function executeInBatch(query: firestore.Query, batchExecutor: (batch: firestore.WriteBatch, snapshot: firestore.QueryDocumentSnapshot[]) => Promise<void>): Promise<void> {
  const BATCH_LIMIT = 500

  let hasNextPage = true
  let lastDocument: firestore.DocumentSnapshot | undefined

  while (hasNextPage) {
    // 1件多めに取得して次がまだあるか判断する
    let q = query.limit(BATCH_LIMIT + 1)
    if (lastDocument) {
      // 前回の続きから取得
      q = q.startAt(lastDocument)
    }

    const snapshot = await q.get()

    // 取得できた件数が指定通りだったら次のデータがまだある
    hasNextPage = snapshot.size === (BATCH_LIMIT + 1)
    // snapshot.docsをpopしても要素が消えないのでコピーした配列に対して操作する
    const docs = snapshot.docs.concat()
    if (hasNextPage) {
      // 続きから取得する用に1件とっておく
      lastDocument = docs.pop()
    }

    // batch処理してもらう
    await batchExecutor(db.batch(), docs)
  }
}

// 使い方
const query = db.collection("users").order("createdAt", "desc")
await executeInBatch(query, async (batch, documents) => {
  documents.forEach(doc => {
    batch.set(db.collection("samples").doc(), { name: doc.name })    
  })
  await batch.commit()
})
```
日本語プログラミング言語「プロデル」でニューラルネットワークを構築する

## はじめに

まずは，動かしてみたいので，全結合層のみの一層ないし二層のニューラルネットワークを作ってみたいと思います。機械学習は専門ではないので，以下の文献を参考にしました。1冊目は数式の説明が端折られているので，2冊目で補った格好です。

* 斎藤康毅著「ゼロから作るDeep Learning」（オライリー）第4章・第5章
* 岡谷貴之著「深層学習」（講談社サイエンティフィク）P.41～P.48

といっても，ほとんど文献の内容を焼き直しただけなので，プロデルっぽいところだけ説明したいと思います。

## プロデルっぽいところ

```プロデル:ニューラルネットワーク.rdr
【推定：行列】と【正解：行列】の交差エントロピー誤差を求める手順
	（（（正解に（（推定に0.0001を全部足したもの）を対数関数で処理したもの）をかけたもの）を推定の大きさ（1）で全部割ったもの）の各列の和の各行の和）に-1を全部かけたものを返す。
終わり
```

「（（（正解に（（推定に0.0001を全部足したもの）を対数関数で処理したもの）をかけたもの）を推定の大きさ（1）で全部割ったもの）の各列の和の各行の和）に-1を全部かけたものを返す。」

えらくややこしくて頭のスタックがパンクしそうですが，日本語として読めなくもない文になっていますね！

それから，出力層の部分はこんな感じです。

```プロデル:ニューラルネットワーク.rdr
ソフトマックスに損失関数もくっつけたやつとは
	【行列T】を持つ。
	【行列Y】を持つ。
	【損失】を持つ。
	はじめの手順
		
	終わり
	自分が【X：行列】を【T:行列】で順伝播させる手順
		行列Tは，T。
		行列Yは，Xをソフトマックスで処理したもの。
		損失は，行列Yと行列Tの交差エントロピー誤差。
		損失を返す。
	終わり
	【自分】が逆伝播させる手順
		行列Yから行列Tを引いたものを行列Tの大きさ（1）で全部割ったものを返す
	終わり
終わり
```

「ソフトマックスに損失関数もくっつけたやつ」という日本語らしいネーミングが可能になっています。クラス名だけならマルチバイト文字を指定できる言語もありますが，これに動詞がくっつくのがプロデルの醍醐味だと思いました。

## ニューラルネットを作る

では，一層，つまり行列1つだけを使ったニューラルネットを書いてみたいと思います。

```プロデル:一層.rdr
一層とは
	＋パラメータ：配列
	【層】は，｛｝。
	はじめ（入力の大きさ，出力の大きさ）の手順
		パラメータは，｛｝。
		パラメータ（1）は，行列（入力の大きさ，出力の大きさ）を作ったもの。
		パラメータ（1）をランダム化する。
		パラメータ（2）は，行列（1，出力の大きさ）を作ったもの。
		層（1）は，全結合層（パラメータ（1），パラメータ（2））を作ったもの。
		層（2）は，ソフトマックスに損失関数もくっつけたやつを作ったもの。
	終わり
	自分で【入力：行列】から推定する手順
		（層の個数-1）回，【カウンタ】にカウントして繰り返す。
			入力は，層（カウンタ）が入力を順伝播させたもの。
		繰り返し終わり。
		入力を返す。
	終わり
	自分で【正解：行列】が正解で【入力：行列】における損失を計算する手順
		【推定結果】は，自分で入力から推定したもの
		層（層の個数）が推定結果を正解で順伝播させたものを返す。
	終わり
	自分で【正解：行列】が正解で【入力：行列】における勾配を計算する手順
		自分で正解が正解で入力における損失を計算する。
		【出力】は，層（層の個数）が逆伝播させたもの。
		（層の個数-1）回，【カウンタ】にカウントして繰り返す
			出力は，層（層の個数-カウンタ）が出力を逆伝播させたもの。
		繰り返し終わり
		【勾配：配列】。
		勾配は，｛｝。
		勾配（1）は，層（1）の行列dW。
		勾配（2）は，層（1）の行列dB。
		勾配を返す。
	終わり
終わり
```

「ゼロから～」のように，

```
パラメータ（「W1」）
勾配（「B1」）
```

などと辞書を使っても動きます（今回は諸事情で配列にぶち込んでいます）。

隠れ層の初期値を適当にランダム化していますが，望ましい初期値の論文がありますので，変える場合は行列.rdrの該当の手順を変えて実現することになります。
Operation (NSOperation) 実装方法

Operationの実装方法には２種類あり、どちらのタイプも並列で処理されます。

|タイプ|概要|
|:---|:----|
|**non-concurrent** タイプ| 同期的なタスクをOperation化する|
|**concurrent** タイプ| 非同期的なタスクをOperation化する|

# non-concurrentタイプ

画像の合成など同期的な処理をOperation化したい場合は、`non-concurrent` タイプを実装します。

以下のメソッドをオーバーライドします。

* `main()`

実装例

```swift
class RequestOperation: Operation {
    func main() {
        //同期的なタスクを実装すること
        self.createImage()
        //main関数終了後自動的にqueueから削除される
    }
}
```

**mainメソッド終了後、OperationQueueから削除される**
したがって非同期的な処理が実装できないため、非同期的なタスクは `concurrent`タイプを実装します。

# concurrentタイプ

ネットワークからのデータの取得やストレージへの保存など非同期的な処理をOperation化したい場合は、`concurrent`タイプを実装します。

以下のメソッドをオーバーライドします。

* `start()` **このメソッドから処理が抜けてもQueueから削除されません。**
* `isFinished { get }`
* `isExecuting { get }`
* `isAsynchronous { get }` **※もはや無視されている**

以下の状態変更はKVOで通知します。

* `isFinished { set }` **この値がtrueになった時にOperationQueueから削除される**
* `isExecuting { set }`
* `isAsynchronous { set }` **※もはや無視されている**

処理がstartメソッドを抜けてもOperationQueueから削除されません。
OperationQueueからの削除は`isFinished`プロパティがtrueになったときです。
(KVOで通知する必要があります。)

```swift
class RequestOperation: Operation {

    var object: Object? = nil

    enum State {
        case ready
        case executing
        case finished
    }

    private var state = State.ready {
        didSet {
            switch self.state {
            case .ready: break
            case .executing:
                self.isExecuting = true
            case .finished:
                self.isExecuting = false
                self.isFinished = true
            }
        }
    }

    private var _executing: Bool = false
    override var isExecuting: Bool {
        get {
            return _executing
        }
        set {
            if _executing != newValue {
                self.willChangeValue(for: \RequestOperation.isExecuting)
                _executing = newValue
                self.didChangeValue(for: \RequestOperation.isExecuting)
            }
        }
    }

    private var _finished: Bool = false;
    override var isFinished: Bool {
        get {
            return _finished
        }
        set {
            if _finished != newValue {
                self.willChangeValue(for: \RequestOperation.isFinished)
                _finished = newValue
                self.didChangeValue(for: \RequestOperation.isFinished)
            }
        }
    }

    init(object: Object?) {
        super.init()
        self.object = object
    }

    override func start() {
        guard self.isCancelled == false else {
            // Queueから削除される
            self.state = .finshed
            return
        }

        self.state = .executing

        // データストアへの登録を実施
        object?.saveInBackground({ (error) in
            if error != nil {
                // 保存に失敗した場合の処理
            } else {
                // 保存に成功した場合の処理
            }
            // Queueから削除される
            self.state = .finished
        })

        // startメソッドが終了してもQueueから削除されない
    }
}
```

#　参照

[[Qiita] Operation(NSOperation)について ](https://qiita.com/ysn551/items/ecd8cd9fff5fb3d77f66) 
今読むと分かりにくかったのでまとめ直しました。
[メモ]systemctlの主なサブコマンドと扱うサービス

## サブコマンド

```
start      : ユニットを開始(アクティブ化) 
restart    : ユニットをリスタート
stop       : ユニットを停止(非アクティブ化)
status     : ユニットの状態を表示
enable     : ユニットをenable。システム起動時にユニットは自動的に開始
disable    : ユニットをdisable。システム起動時にユニットは自動的に開始しない
isolate    : ユニット、依存ユニットを開始し、他のユニットは全て停止(稼働中のターゲットを変更する場合に使用)
list-units : アクティブな全てのユニットを表示(サブコマンド省略時も同じ)
```

※isolateの例

```
$ systemctl isolate multi-user.target // CUIモードにする
$ systemctl isolate graphical.target // GUIモードにする
$ systemctl default // デフォルトのモード（起動時のモード）にする
```


## サービス
```
udisks2        : ディスクの自動マウントサービス
gdm            : GDMディスプレイマネージャー
lightdm        : LightDMディスプレイマネージャー
NetworkManager : NetworkManagerサービス
sshd           : SSHサービス
postfix        : Postfixメールサービス
httpd          : HTTPWebサービス
``` 

出典：本気で学ぶLinux実践入門
NLP4J - Java で 形態素解析（Yahoo! デベロッパーネットワーク 日本語形態素解析を利用）

[NLP4J Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)

#Yahoo! デベロッパーネットワーク 日本語形態素解析とは？

Yahoo! Japan が提供している日本語形態素解析APIです。

テキスト解析:日本語形態素解析 - Yahoo!デベロッパーネットワーク
https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html

| 項目 | 説明 |
|:-----------|:------------|
| 提供者       | ヤフー株式会社 Yahoo Japan Corporation        |
| 提供形式       | Web API (HTTP GET)        |
|  公式クライアントライブラリの提供  | なし       ​|
| API キー | アプリケーションID |

#Maven

```xml
<dependency>
	<groupId>org.nlp4j</groupId>
	<artifactId>nlp4j-core</artifactId>
	<version>1.3.0.0</version>
</dependency>
<dependency>
	<groupId>org.nlp4j</groupId>
	<artifactId>nlp4j-yahoojp</artifactId>
	<version>1.3.0.0</version>
</dependency>
```

#APP IDの用意

Yahoo!デベロッパーネットワーク (https://developer.yahoo.co.jp/) にてAPP IDを取得済みの場合は以下のようにJVMの環境変数(yhoo_jp.appid)にセットして実行してください。

未取得の場合でもとりあえず動かしてみたいという場合は無しでもとりあえず動くようにしてあります。
お早目にAPP ID の取得をお願いします。

```
-Dyhoo_jp.appid=YOUR_CODE
```

# コード

```java
package example;
import java.util.ArrayList;
import nlp4j.Keyword;
import nlp4j.yhoo_jp.YJpMaService;

public class HelloYahooNLP1 {

	public static void main(String[] args) throws Exception {
		// 自然文のテキスト
		String text = "今日はいい天気です。";

		Document doc = new DefaultDocument();
		// 属性「text」としてセットする
		doc.putAttribute("text", text);

		// Yahoo! JP アノテーター
		YJpMaAnnotator annotator = new YJpMaAnnotator();
		// 処理対象の属性を指定
		annotator.setProperty("target", "text");
		// 形態素解析処理
		annotator.annotate(doc); // throws Exception

		// キーワードの出力
		for (Keyword kwd : doc.getKeywords()) {
			System.err.println(kwd);
		}
	}
}
```

#結果

出力結果は以下のようになります。
短いコードで形態素解析の結果を取得することができました。

```
今日 [facet=名詞, str=今日]
は [facet=助詞, str=は]
いい [facet=形容詞, str=いい]
天気 [facet=名詞, str=天気]
です [facet=助動詞, str=です]
。 [facet=特殊, str=。]
```

#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">

---
[Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)