OmniAICreator/Qiita-1.07M huggingface dataset:
VMWareの自分向けMEMO

会社ではESXi6.5、自宅ではVMWare Workstationを使用しているので、自分向けのメモを残しておく。

# VMWare Workstation

## VM作成時
### ファームウェアタイプ

**セキュアブートにはしない。**
セキュアブートはUEFIの場合に使える、ルートキット系ウイルスを防ぐ仕組み。
ただしWindows OS8以降などOS側での対応が必要になり、対応していないLinux系ディストリビューションでは起動しなくなる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/f0cb8708-cff5-8327-5b08-4c0d5b5dac66.png)

### プロセッサ構成
自宅のskylake Core i3は2コア4スレッド。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/9284aeb2-44aa-a8f6-e614-e1c299a1e85e.png)

プロセッサ数やプロセッサごとのコア数を変更することにより、ホストのCPUがどう変更になるかを後で検証する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/c49b88fc-2683-2a38-27e8-11f730937df9.png)

### 仮想マシンのメモリ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/1c392d68-e1ba-e55a-c63e-256001545b11.png)

### ネットワークの種類
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/9adebbd3-2460-d6dd-1b5a-5088dfd8eb8a.png)

### I/Oコントローラライプの選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/8ed418e4-1d38-7c47-5b1a-0264a7472bba.png)

### ディスクタイプの選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/157708b2-0c09-f074-bc8f-0720206c775e.png)

### ディスクの選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/515bb36a-1c5b-9ee2-0c28-3e8bac79d0ba.png)

### ディスク容量の指定
**仮想ディスクを単一ファイルとして格納**に変更する。
ファイルを分割すると2GB単位に分けられるため。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/c3cb64f1-4475-659e-13b7-294abc685057.png)

## VM作成後

### コメントの作成
「説明」欄に入力可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187121/f4737372-16a4-2324-cc62-51c4f3337f35.png)
Bluetooth5 LongRange NRF52840 EFM32 BGM13P BGM13S

私は、Bluetoothの企画でIoT業界に舞い戻ってきました。
最初に設計したのはBLE4.2を搭載したビーコンでした。
しかし、制約が多い為に、新規格であるBLetooth5かつLongRangeに移行する事にしたのが昨年の事でした。
そして、やっと、モジュールが出始めました。

春先にはNordicツアーで太陽誘電の小網部長が「しっかり配置すれば、ロングレンジじゃなくても飛ぶんです」と言っていましたが
リファレンスや資料を下さいとお願いしたら
「条件によって変わる」といわれて提供してもらえず
私の力ではLongRangeじゃないと飛ばない為に、技適取得済みのモジュールを待つ為、約1年経過してしまいました。

と言う事で、やっと手に入ったモジュールを使ってこれから設計します・・・
今回手に入ったのはRaytecのMDBT50モジュールです。

NRF52840の良い点は、USBの機能がついていること。
LDOやDC/DCがあるようです。
これは、リファレンスをよく理解しないとダメですね。
![BLEmodule-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/c758ee02-daf2-c59b-19b2-436025e21fa4.jpeg)
![BLEmodule-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/7e94ebbc-db0f-78b7-8872-df87416e63c9.jpeg)

さらに夏ごろに入手したのがSiliconLabsはBGM13Pです
これは、BGM13Sという小型の物が既に提供されています。
https://www.silabs.com/documents/login/data-sheets/bgm13s-datasheet.pdf
アンテナの設計が難しいようで、ちょっと悩みます。

BGM13Sのサイズは6.5ｘ6.5とメチャ小さいです。
NRF52840のモジュールは基本が10X15で
ISP1807が８ｘ８と最小です。
（太陽誘電のEYSKJNZWBは秋口に聞いたところ、設計中と聞いたんですが、もう出来たのかな？）

BGM13PやSなどのテスト用基板は価格が高いので、自分で作りました。

![BMG13P.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/23466448-855a-9215-b224-32c3e5a87b6e.jpeg)

そろそろどっちも作らないとダメですね・・・
WebStormでESLintを使いたい for Windows

# ESLintでのエラーの対処法です。(初期設定)
WebStormでHTML5 Boilerplateのテンプレでプロジェクトを作成した際、
ESLint: please specify Node.js interpreter
とエラー表示された際の対処法です。
※当記事はWebサイトを作ったことが無い無知な人が書いてます。
Windowsでの対処法が見つからなかったのでメモとして。

##解決策
ESLint settings...を選択して、Node interpreterとESLint packageを指定してやればよい。(まあそれはそう)
<img src="https://qiita-image-store.s3.amazonaws.com/0/269181/a3c4a527-d0e6-2620-ed46-9b60ab358073.png" width=50%>

## Node interpreterについて
1. ESLintにはNode.jsが必要らしいので、Node.jsをインストールします。
windowsは[公式サイト](https://nodejs.org/en/)からインストーラーをDL
LTSの方がお勧めです。最新版だとインストールして、何かコマンド叩いたら
```log.progressEnabled = log.gauge.isEnabled()
TypeError: log.gauge.isEnabled is not a function```
と出たりしたので。
インストールパス以外デフォルトで進めました。

2. インストールが終わったら、パスを指定してやればokです。
Add > node.exeの場所を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269181/9f3aace6-0315-10c7-8aa2-04ea0f8a9a95.png)
正常に選択できると右側にバージョンが表示されます。

## ESLint packageについて
エラーのパスを見るとどうやらプロジェクト毎に生成する感じっぽいですね。
先程のインストールでnpmも使えるようになってるはずです。
cmd起動して
``` npm install --save-dev eslint ```
をプロジェクト直下でたたくとインストールされます。
```./node_modules/.bin/eslint --init```
を叩くと初期設定もできるらしいですが、しなくても動いたのでとりあえず放置。

おわり。
Rails でタブイメージを設定する方法

```application.html.haml
%head
    省略
    %link(rel="shortcut icon" href="#{image_path("tag_image.png")}" type="image/png")

```
以下だと、Routing Errorになる。

```application.html.haml
%head
    省略
    %link(rel="shortcut icon" href="tag_image.png" type="image/png")

```
DockerでTensorflow開発環境をつくる

環境に依存しないかたちでTensorflowを使った開発をしたいなぁと思い、Dockerで環境を作りました。

## 環境

* MacOS mojave 10.14.1
* Python 3.6.5
* pyenv 1.2.8
* Docker 18.09.0

## Dockerで構築

Tensorflow の Dockerイメージを取得する。

``` bash
$ docker pull tensorflow/tensorflow
```

> Tensorflow Docker package
> https://www.tensorflow.org/install/docker

ちゃんと動くか確認します。

``` bash
$ docker run -it --rm -p 8888:8888 tensorflow/tensorflow
```

試しに下記へアクセスしてみてください。
jupyter notebook が表示されれば大丈夫。

http://localhost:8888

## サンプル実行

自分でかいたコードを実行するための準備。

### 構成

``` text
tensorflow/
  ├── src/
  │    └── sample.py
  └── docker-compose.yml
```

### docker-compose.yml

``` yaml:docker-compose.yml
version: '3'
services:
  tensorflow:
    image: tensorflow/tensorflow:latest
    ports: 
      - '8888:8888'
    volumes:
      - '$PWD/src:/tmp'
```

### sample.pyの実行

``` bash
$ docker-compose up -d
...
$ docker exec -it tensorflow_container bash
...
$ root@xxxxxx:/notebooks python /tmp/sample.py
> （実行結果が表示されます）
```

これでとりあえず、開発の下準備は完了。
あとはゴリゴリ開発するのみです。
プログラマ&エンジニアは全角スペース撲滅したい。まだGoogle日本語入力で消耗してるの？

設定で完全に半角スペース矯正できることを知った。
世界が変わった。
今までの人生はなんだったのか。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/174bfe84-e732-43d5-fb5f-90e091da5a7c.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8d6b5f09-b261-0780-05d7-c06578cc8f74.png)

[入力モードを切り替えず、日本語入力中に半角スペースを打つ方法 | gori.me（ゴリミー）](https://gori.me/mac/mac-tips/83880)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
関東最速でElm+JSなアプリの開発環境を作る

とりあえず関東最速でElm+JSなアプリを作るためのレシピです

# parcel
Webpackで設定ファイルを弄っていると一生終わりません。最速で作るにはparcel一択です。

```bash:parcelを導入
$ mkdir yourapp
$ npm init
$ npm install -D parcel-bundler
```

npmで公開しなければ以下のように `private` フラグを true にしておくとフィールドが減らせて楽です

```json:parcelインストールまで完了したpackage.json
{
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "devDependencies": {
    "parcel-bundler": "^1.11.0"
  }
}
```

# Elm実装
先に簡単なElmアプリを実装します。`src` ディレクトリを切って `App.elm` を作ります。ここでは0.19を使うこととします。

```elm:src/App.elm
module App exposing (..)

import Browser
import Html exposing (Html, div, input, text)
import Html.Events exposing (onInput)


main =
    Browser.sandbox { init = init, update = update, view = view }



-- MODEL


type alias Model =
    { value : String
    }


init : Model
init =
    { value = "type something below"
    }



-- UPDATE


type Msg
    = UpdateModel String


update : Msg -> Model -> Model
update msg model =
    case msg of
        UpdateModel value ->
            { model | value = value }



-- VIEW


view : Model -> Html Msg
view model =
    div []
        [ div [] [ text model.value ]
        , input [ onInput UpdateModel ] []
        ]

```

# JS実装
`index.js` を作って下さい。 parcelを使っているのでJS側から直接Elmをrequireできます。

```js:index.js
const { Elm } = require("./src/App.elm")

const app = Elm.App.init({
  node: document.getElementById('main')
})
```

# HTML実装
最後にHTMLを作ります。
`index.js` と同じ階層に `index.html` を以下の内容で置きましょう。

```index.html
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>YourApp</title>
</head>

<body>
  <div id="main"></div>
  <script src="./index.js"></script>
</body>
</html>
```

# 起動
`start` と `build` をコマンドとして追加しておきます。
`test` は一旦いらないので消してしまいましょう。

```diff
{
  "private": true,
  "scripts": {
-   "test": "echo \"Error: no test specified\" && exit 1",
+   "start": "parcel index.html --out-dir dist",
+   "build": "parcel build index.html --out-dir dist"
  },
  "devDependencies": {
    "parcel-bundler": "^1.11.0"
  }
}
```

あとは以下を実行すると起動できます。
起動と同時に `node-elm-compiler` のインストールが実行されます。

```bash
$ npm start
```

デフォルト設定であれば `localhost:1234` にアクセスすると以下の画面が見れるはずです。

![Peek 2018-12-23 13-25.gif](https://qiita-image-store.s3.amazonaws.com/0/18973/ad71e028-4c8a-9c8c-5793-705598c40c89.gif)
u-blox社の現行GPSモジュールメモ

#u-blox社のGPSモジュール
u-blox社謹製のRTKエンジンが一部には乗ってたり、RTKLIBとの相性が良くて、数万円（他社ならば数十万円）で1cm級の測量が可能なため一部？で人気が高まりつつあるGPSモジュールです。

###RTKLIB
http://www.rtklib.com/
オープンソースのGPS測量ソフトウェアパッケージ。linuxやosxにも対応(CUI)していて、RaspberryPiと相性がいい。（と個人的に思ってます）

#モジュール
F9シリーズ
・F9P
最近発売開始した新製品。
２周波対応になりました。RTKの場合は１分以内という驚異のFIX速度です。
ネット通販で買えますが、店舗によって価格がマチマチ。

NEO-M8シリーズ

・M8T
RTKLIBでRTKを使うなら、現状これ一択。QZSS,GLONASS,BeiDou対応。 

・M8P
RTCM3ライセンスがあるのが-2で、ライセンス無いのが-0モデル。U-blox社謹製RTKエンジン搭載。
でもRTCM3出力にするとQZSSは拾ってくれない仕様。
基地局用にsurvival modeという機能が入っており、コレを使うと電源ONから一定時間の平均値を取ってRTCM3 1005に基地局の座標を出力してくれる。
基地局の移動が多い場合にとても便利。 

・ M8U
20hz出力対応のハイエンドモデル。ドローン向けのようで、3Dアクセラレータと３Dジャイロが入ってるらしい。

NEO-M7シリーズ
・7P
10hz,PPP対応。SBAS+PPPで１m級ぐらいの精度。
PPPなので単体でシステムが完結するのが素晴らしい。
DevTools tips — day 8: Color picker

この記事は[Tomek Sułkowski](https://medium.com/@tomsu)さんによる
フロントエンドエンジニア向けアドベントカレンダーの翻訳記事です。
とても勉強になったので許可を得て翻訳させていただきました。元記事は[こちら](https://medium.com/@tomsu/devtools-tips-day-8-color-picker-827f1692bfab)。
 
---

*休暇まであと24日です。私はこれからDevToolをより効果的に、そしてもっと楽しく使うためのコツを紹介する短い記事を書いていきたいと思います。[昨日](https://qiita.com/rena_m/items/ce0cca73048e5418cca7)はasyncコンソールで遊びましたね」。今日はcolor pickerを見てみましょう。*

# 23. Color picker ：イントロダクション
color pickerをあまりきちんと見たことがなければ、color pickerはただ色を選べるものでしかなく、そんなに優れた物とは思えないでしょう。ですがよく見てみると、開発者ツールのチームがこの小さなウィジェットにいかに便利な情報をつめこんでいるかに気が付いて驚くはずです。
![12.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/725b2f75-e54e-a168-788d-5e9fcf5efcf4.gif)

# 24. すでに使用されている色の中から色を選ぶ
color pickerの一番下の部分にはカラーパレットがあります。これはカスタマイズすることが可能です。
- 影のバリエーション付きマテリアルカラーパレットに切り替える
- 色を追加したり削除したりできるカスタムパレットにする
- ページにあてられているstylesheetに存在する[CSS変数](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_variables)から色を拾うパレットにする
- ページのstylesheetで用いられているすべての色を含んだパレットにする
![13.png](https://qiita-image-store.s3.amazonaws.com/0/318825/0cf92455-5a39-f5e3-77af-18e984b2edd6.png)

# 25. 簡単に色を選べるようにする
テキスト向けのカラーピッカーを開いたとき(＝cssの`color`プロパティ。`background-color`ではなく)、“**Contrast ratio**”が目に入るでしょう。これはテキストの色とテキストの背景色と考えられているものとのコントラスト比を表示します。この数値が高い場合、背景に対してテキストが適切に見えるようになっていることを意味します。一方で、その値が`1`に近い場合、テキストの色は背景と区別をつけることが難しい状態です。

数値の横の“🚫”マークは良くないという印で、“✅”マークは[Web Content Accessibility Guidelines (WCAG) 2.0](https://www.w3.org/TR/UNDERSTANDING-WCAG20/conformance.html)の**AA**レベルを満たしているということで、コントラストは少なくとも`3`あるということを意味します。“✅✅”マークのときは、より厳しい**AAA**レベルを満たすということで、コントラストが`4.5`であることを意味します。

![15.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/c9613cfe-b691-ee6a-dec9-a580ffff4eec.gif)

色に関する[アクセシビリティのルール](https://developers.google.com/web/fundamentals/accessibility/accessible-styles#color_and_contrast)についてはマークをクリックすることでより詳しく知ることができます。

Contrast ratioを開くと、追加の情報と比較のために別の背景色を選べるシステムが現れます。さらに、color spectrumではコントラストの境界線を確認できます。これはつまり、背景がラインより上にある色よりも暗い場合、それはAAレベルを満たすということで、背景がラインより明るい場合はそのラインの下から色を選ぶべきであるということです。

---

いつも通り、**なにか新しいことを学べたらぜひ**
→ もっと多くの人の目に止まるように**拍手👏ボタンをお願いします！**
→ 他の投稿も見逃さないように**[Twitter (@sulco)をフォロー](https://twitter.com/sulco)**してください！
(Heroku)モデルを作成した後にデプロイする場合

モデル作成したあとにはHeroku上でも、マイグレショーンをしないといけない。

```コマンドプロンプト
git add .
git commit -m "Demo"
git push heroku master
```
コマンドプロンプト上で、デプロイした後、

```コマンドプロンプト
heroku run bash
python manage.py migrate
```

これをしないと、ローカル上は上手くいってても、
オンライン上で上手く表示されない。

以上
【AWS】Pythonの開発環境Chaliceを使ってみる - API Key

PythonのLambda関数の開発環境としてChaliceを使ってみます。今回はChaliceによって作られるAPI Gatewayへのアクセスを、API Keyで制限してみます。

Chaliceの環境設定などは以下の記事を参照してください。
[【AWS】Python Lambdaのdeploy - Chalice](https://qiita.com/sand/items/4642f417bf0d2b49c7e2)

ドキュメントは[「AWS Chalice」](https://chalice.readthedocs.io/en/latest/) と [「aws/chalice - github」](https://github.com/aws/chalice) になります。


#１．プロジェクト作成

まずプロジェクトを作成作成します。

```
$ chalice new-project api-key-test
$ cd api-key-test
```

次にソースコートは、ドキュメントにあるものを流用させていただきます。
APIが必要なパスと、必要無いパスを設定します。

```python:app.py
from chalice import Chalice

app = Chalice(app_name='api-key-test')

# 以下のパスへのアクセスにはAPI Keyが必要ありません。
@app.route('/')
def index():
    return {'hello': 'world'}

# 以下のパスへのアクセスにはAPI Keyが必要です。
@app.route('/auth', methods=['GET'], api_key_required=True)
def authenticated():
    return {"secure": True}
```

次にdeployします。自動的にIAM roleが生成され、LambdaとAPI Gatewayが作成されます。最後に作成されたリソースが表示されます。

```
$ chalice deploy
Creating deployment package.
Creating IAM role: api-key-test-dev
Creating lambda function: api-key-test-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxx:function:api-key-test-dev
  - Rest API URL: https://yyyyy.execute-api.ap-northeast-1.amazonaws.com/api/
```


#２．テスト

まずAPI Keyの必要ないパスにアクセスします。問題ありません。

```
$ curl https://yyyyy.execute-api.ap-northeast-1.amazonaws.com/api/

{"hello": "world"}
```

次に、API Keyを要求するパスに、API Keyを指定せずに、アクセスします。これはエラーとなります。


```
$ curl  https://yyyyy.execute-api.ap-northeast-1.amazonaws.com/api/auth/

{"message":"Forbidden"}
```


それでは作成したAPI GatewayにAPI Keyの紐づけを行います。「[ゼロから作りながら覚えるAPI Gateway環境構築](https://dev.classmethod.jp/cloud/aws/getting-start-api-gateway/)」を参考にさせていただきました。今回はLambdaやAPI Gateway自体は自動生成されているので、API Keyの紐づけだけが必要となります。


AWSのコンソールのAPI Gatewayで使用量プランを選択します。無かったら上記ブログを参考にして作成ます。以下の画面のように作成されたAPI Gatewayを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/6ba8d975-b8b1-d4fc-c8da-54f84fe634b9.png)


追加されたら、APIキーの画面で「表示」をクリックし、キーをコピーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/d2679fea-42af-f684-2a1f-35c82b8cf223.png)



コピーしたキーをx-api-keyの値（zzzzz）にしてアクセスします。


```
$ curl -H 'x-api-key:zzzzz' https://yyyyy.execute-api.ap-northeast-1.amazonaws.com/api/auth/

{"secure": true}
```


これで無事にアクセスできました。

今回はこれで終わりです。



#★最近の投稿
[Python でいろいろスクレイピング](https://qiita.com/sand/items/f2466320c8dde905cb3b)
[【AWS】Pythonの開発環境Chaliceを使ってみる - アマゾン売れ筋ランキング](https://qiita.com/sand/items/cfdc9957caa0aee63c0f)
[【AWS】Pythonの開発環境Chaliceを使ってみる - CloudWatch Events](https://qiita.com/sand/items/4a4c273872b266af6680)
[【AWS】Pythonの開発環境Chaliceを使ってみる - API Key](https://qiita.com/sand/items/2f8615b03c6f24c85b49)
[【AWS】Python Lambdaのdeploy - Chalice](https://qiita.com/sand/items/4642f417bf0d2b49c7e2)
[【AWS】Python Lambdaのdeploy - CloudFormation](https://qiita.com/sand/items/2b918a29bf08bfb86d32)
VPSにSSHできなくなった話

初めてVPSを契約したので、アカウントの設定をしていたら設定を間違えてSSHできなくなってしまったので経緯を残しておく。

## 環境

* ホスト側:centOS7.6
 * Conohaで借りたから解決にConohaの管理画面を使います。
 * 他社でも通用する解決法かは不明(多分いける。)
* クライアント側:MacOS
 * 一応クライアント側も書いといたけど間違えたのはホスト側の設定だからあまり関係ないと思われ

## 原因
公開鍵認証できるように設定する前にパスワード認証を無効にしてしまったため。

## 解決策
緊急の人がもし見てくれた場合のために先に書いておきます。
めっちゃ簡単です。
お使いのマシンにインストールされているコンソール
(俺のMacの場合はiTerm2が入ってるし、WindowsではGitBashを使っている。)
ではなく、**VPS契約したサーバ会社の管理画面のコンソールからログインしてください。
sshd_cofigでパスワード認証を無効にしてもパスワードでログインできます。**
もう案内する必要性もないと思いますが、一応やるべきことを書いておくと、

```bash:sshd_cofigのバックアップを取ってあった場合
# 名前は何でもいいので、renameして退避しておく。
mv /etc/ssh/sshd_config /etc/ssh/sshd_config.hoge

# バックアップを反映
mv /etc/ssh/BACKUP_FILE /etc/ssh/sshd_config

# sshdを再起動 (systemctlにredirectされると思う)
sudo service sshd restart
```

```bash:バックアップがない場合
# 設定を書き換えます。
sudo vi /etc/ssh/sshd_cofig

PasswordAuthentication yes # noとなっていると思うので、yesに書き換える。

#sshdを再起動 (systemctlにry)
sudo service sshd restart
```
クライアントマシンのコンソールからとりあえずパスワード認証できるようになっていることを確かめて終了。

```bash:自分のパソコンのコンソールから
ssh USER@IPorHOSTNAME
```

## 経緯
1. VPSを契約する
1. SSHしてアカウントを作る
2. ~~新規に作ったアカウントの公開鍵認証を設定する~~
 * 本当はこれを先にやらなきゃいけなかったのにもう済んでるものだと思いこんでたのが原因。
2. rootでのログインを無効にする
3. パスワード認証を無効にする

## あとがき
* Conohaでは契約時にrootの鍵の自動生成をしてくれるんですが、それが新規に作ったアカウントの鍵だと思いこんでいた(1アウト)
* パスワード認証を公開鍵認証のパスフレーズを聞かれているのだと勘違いしていた(2アウト)
* SSHできるかちゃんと確認しないでパスワード認証を無効にしてしまった(3アウト)

**深夜のテンションでサーバいじくるのダメ、ゼッタイ**
ElmでWebAPIから受け取ったオブジェクト配列のレスポンスをRecordにマッピングする

たとえば以下のような JSON が WebAPI からレスポンスとして返ってくることを想定する

```json
[
  {
    "name": "juestine",
    "age": 21
  },
  {
    "name": "alice",
    "age": 23
  }
]
```

このレスポンスを以下の `Person` レコードにマッピングするにはこのような実装にする。
`fetchPeople` を呼ぶと WebAPI へのフェッチが走る。

```elm
import Json.Decode as Decode exposing (field, string, int)

-- 省略...

type Msg =
  | PeopleFetched (Result Http.Error (List Person))

-- 省略...

type alias Person =
  {
    name: String
    age: Int
  }

fetchPeople : Cmd Msg
fetchPeople =
  Http.get {
    url = "http://your-own-web-api/users",
    expect = Http.expectJson PeopleFetched peopleFetchingDecoder
  }

personDecoder : Decode.Decoder Person
personDecoder =
  Decode.map2 Person
    (field "name" string)
    (field "age" int)

peopleFetchingDecoder : Decode.Decoder (List Person)
peopleFetchingDecoder =
  Decode.list personDecoder
```

あとは `PeopleFetched` で受け取れる Result 型のメッセージを煮るなり焼くなり好きにする。
Apache Mesosをインストールしてみよう

使ってますか。[Apache Mesos](http://mesos.apache.org/)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62601/909e4608-0d30-b474-2587-0d63d39cafc2.png)

複数台のサーバを統合して、一台の巨大なサーバとして扱うことができるイカしたフレームワークです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62601/a59feea4-0697-d343-9feb-f24cf697d5f4.png)

ref. Masataka Tsukamoto, Apache Mesos is 何?, https://speakerdeck.com/tsukaman/apache-mesos-is-he?slide=16

これまでアチラコチラで「Mesosサイコー」という資料をつくりましたが、どういう風にインストールするかを一度もまとめたことがなかったので、やってみたいと思います(๑•̀ㅂ•́)و✧

# 出来上がりのイメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62601/339575b4-06f0-d80a-6a2d-114e4d707719.png)

一台の中にmaster/zookeeper/slaveが同居します。


# 必要なもの

* Mac or Linux (この記事ではUbuntu 16.04LTSを使う）
* 基本的なシェルの知識
* 基本的なパッケージ管理ソフトウェアの知識
    * brew or apt-get


# Mac
brewで全部入ります。

## zookeeper
```bash
brew install zookeeper
zkServer start
```

## mesos agent

brewが`/usr/local/sbin/`以下にバイナリを置こうとするので、なければ事前に作ってパスを通しておく

```bash
sudo mkdir /usr/local/sbin
sudo chown -R `whoami`:admin /usr/local/sbin
```

```bash
brew cask install homebrew/cask-versions/java8
brew install mesos
```

### master
```bash
mesos-master --work_dir=/tmp --zk=zk://localhost:2181/mesos --quorum=1
```

この時点で`localhost:5050`にWebUIが立ち上がる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62601/8e265507-a2d3-f401-7792-926706067229.png)


## slave
```bash
mesos-slave --work_dir=/tmp --master=zk://localhost:2181/mesos
```

WebUIの左下にリソースが追加されます。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62601/99c14adb-528a-b7b8-3959-13bfc354625f.png)


Mesosクラスタ完成 :tada:
# Linux (Ubuntu 16.04）の人

## zookeeper
```bash
sudo apt-get install zookeeperd
sudo systemctl restart zookeeper
```

## mesos agent

init.shを準備

```bash
#!/bin/bash

# Setup
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv DF7D54CBE56151BF
DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
CODENAME=$(lsb_release -cs)

# Add the repository
echo "deb http://repos.mesosphere.com/${DISTRO} ${CODENAME} main" | 
          sudo tee /etc/apt/sources.list.d/mesosphere.list
sudo apt-get -y update
```

```bash
bash init.sh
sudo apt-get install mesos
```

## master
```bash
sudo systemctl start mesos-master
```

この時点で`localhost:5050`にWebUIが立ち上がる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62601/928568cd-db86-afb0-d983-c7be3f613008.png)


## slave
```bash
sudo systemctl start mesos-slalve
```

WebUIの左下にリソースが追加されます。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62601/3fa187de-39d6-a409-9f33-5de70e7437c1.png)

Mesosクラスタ完成 :tada:

# まとめ
Mesosクラスタは非常に簡単に構築できます。

今回は一台の中にすべての要素をいれましたが、複数台であっても基本は同じです。
mesos agentをインストールし、zookeeperにつなげてやってください。

ぜひ、分散システム管理のお供にMesosをどうぞ
最も簡単にLINE Clovaからobnizを起動する方法


#1.概要
**Clovaから最も簡単にobnizを起動する方法の設定手順を紹介します。Clovaとobnizを連携させてみたいけど、Clovaのスキル開発とかハードルが高すぎてという方、ぜひ試してみて下さい。**
##1.1できること
Clovaに**「ねぇクローバ、XXX(を起動して)」**と話しかけて、**obnizのプログラムを起動**します。単純に音声トリガでobnizを起動するだけなので、Clovaにレスポンスを話させたり、obnizにコマンドを渡して処理を分けたりはできません。

##1.2紹介する方法のポイント
**obniz EventのEndpointのURLを、CEKのEndpointサーバーのURLに登録**するだけです。CEKからobnizを直接起動するので、**特別なサーバーは不要**です。また、CEKへの登録内容は基本情報のアプリ名～サーバ設定までで、面倒な**会話モデルの登録も不要**です。
#2.設定手順
#2.1obniz側の設定
① 起動したいプログラムをWebhookでEvent登録を行う。
② 発行された**EndpointのURLをひかえておく**。(後でCEKに登録する)
![無題6.png](https://qiita-image-store.s3.amazonaws.com/0/234533/dc3612f7-5e21-93fa-4879-48aa15f38caa.png)

#2.2Clova側の設定
① CEKの基本情報(アプリ名、呼び出し名等)を登録します。
② サーバ設定のEndpointサーバーのURLにひかえておいた**obniz EventののEndpointのURLを登録**します。
③ **会話モデルの登録は不要**です。
![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/234533/6e6d617e-9d0c-03de-5642-6d70eb701912.png)

#3.補足
ここで紹介した技は、**CEKがEndpointサーバーと会話モデルの非同期登録を容認しているという挙動(2018年12月23日時点)に依存**しています。非同期である必然性は見当たらないので、今後何らかの改修が行われるかもしれません。なので、**永続的に使用できるかは不明**です。ちなみに、AlexaのASKでは会話モデル系情報とエンドポイントの両者がそろわないと登録を実行できないようになっています。

以上
Nimbleファイルのバージョン情報をソースに埋め込む

# 概要

追記：2018/12/24 
最終的には @flat_leon さんのコメントの方式にしました。
気になる方はコメントへジャンプ！！

以下、読み物としてどうぞ。

Nimbleファイルのバージョン情報をstaticExecを使って、ソースに埋め込みます。

## コンパイル時実行

Nimにはコンパイル時に実行するstaticRead/staticExecという機能があるそうで、@2vgさんのこちらの[記事(Nimでコンパイルタイム実行を使用してみる)](https://qiita.com/2vg/items/2c124f32c65dddbddf2c)を読んで初めて知りました。

## リリース時のミス

ちょうど私のNimで作っているツールのバージョンをアップしようと、Nimbleファイルに記述しているバージョン番号を変更したところ、ツール内で利用しているコマンドラインパーサー(docopt)に渡しているバージョン番号と合っていないという状態になりました。

```nim:sample.nimble
srcDir  = "src"         # ソースフォルダ
version = "0.2.0"       # バージョン情報
```

```nim:main.nim
import docopt

let doc = """
application

Usage:
  application (-v | --version)

Options:
  -v --version  Show version. 
"""

# docoptの初期化はバージョンを渡す必要があり、nimbleのversionと合っていない
let args = docopt(doc, version = "application 0.1.0")
```

## コンパイル実行時にnimbleファイルを読んでしまえ

で、冒頭の記事にてstaticExecを使って、コンパイル時に自動でソースにバージョン情報を埋め込んでしまおうというのが今回の内容となります。

ディレクトリ構成は以下を想定します。
utilディレクトリはビルド対象外フォルダとしています。

```
C:.
|   application.nimble   <= nimbleファイル。バージョンが記述されている
+---src
|   main.nim             <= バージョンを表示したいモジュール
|   version.nim          <= バージョンを埋め込むソース
\---util
    get_version.nim      <= application.nimbleからバージョンを抜き出す
```

```nim:main.nim
import version    # バージョン情報が埋め込まれたソース

# version.nimでexportされたcurrent_versionをバージョン情報として渡す
let args = docopt(doc, version = "application " & version.current_version)
```

```nim:src/version.nim
# staticExecで、util/get_version.nimを実行した結果を埋め込む
const current_version* = staticExec(
  "nim c -r --hints:off --verbosity:0 -o:../bin/test ../util/get_version.nim application")
```

バージョン埋め込みがリリース時のみで良いなら、以下のようにすれば、ビルドのたびにバージョン読み込みしなくても良いかもしれません。

```nim:src/version.nim
when defined(release):
  # staticExecで、util/get_version.nimを実行した結果を埋め込む
  const current_version* = staticExec(
    "nim c -r --hints:off --verbosity:0 -o:../bin/test ../util/get_version.nim application")
else:
  const current_version* = "X.X.X"
```



nimbleファイルからバージョンを取得

```nim:util/get_version.nim
import os
import nre, options, strutils
import strformat

# 引数を取得
let 
  cmdArgs = os.commandLineParams()
  pkgName = cmdArgs[0]

# XXXX.nimbleを読んで、version = X.X.X の X.X.Xを抜き出して、表示する
let f = open(fmt"../{pkgName}.nimble", FileMode.fmRead)
let lines = f.readAll().split("\n")
for line in lines:
  let mOpt = line.match(re"(version)\s*=\s+""(\d+\.\d+\.\d+)""")
  if mOpt.isSome:
    let m = mOpt.get
    echo m.captures[1]
    break
f.close
```

## まとめ

- staticExecを使って、Nimbleファイルに記述されたバージョン番号をソースに埋め込むことができました。
- staticReadというメソッドもあり、ファイルの内容を埋め込んでしまうこともできるみたいです。
- なんでもありなNimが大好きです。
ScrapBox VS Qiita もしかしたらこの世界にはMarkDownも箇条書きリストも要らないのかもしれない

[scarpbox yumainaura - Google Search](https://www.google.co.jp/search?q=scarpbox+yumainaura&oq=scarpbox+yumainaura&aqs=chrome..69i57.2688j0j7&sourceid=chrome&ie=UTF-8)


# 精密さを求められない、情報アウトプットの世界では

特に。
構造の整った資料作成なら別だろうけど。

#ScrapBoxを使い始めてからというもの、全てのMarkDownが面倒臭くなってきた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d137e133-f248-4021-9c8a-0ade0a5b6188.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/30c9b084-06d6-e345-1c67-1d0f1c71a3be.png)

ScrapBoxは箇条書き的な入力を意識せずに、箇条書きを作れる仕様


#日本語とMarkDownって改めて、仲悪いよね？

見出しのシャープを入力することさえ指先のストレスを感じる

箇条書きをまったく使わなくなってきた

日本語とMarkdownの親和性が悪すぎてカモミール

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c18706a1-9156-da7b-10fd-10486c9617b0.png)

# あと日本語IMEとプログラミングと相性もそもそも悪いよね？

根本的な問題。
悲しみ。

# 日本語とエンジニアリングの相性も悪い？

物事の理解という面では日本語はわりと優れている気もする
抽象論とか、デメテルの法則とか、あれやこれやの
気のせい？


# 爆速であるScrapBoxやYoutubeなどの情報発信のスピードに追いつける？

日本語＋Markdownでは無理な気がしてきた








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
EOS ノードの実行モードとDBのステートデータについて

## 問題
EOS のステートデータ、つまり、マルチインデックステーブルのデータは、いつ更新されるのかは気になってきたので、少し調べてみました。
下記の記事を参考して整理しました。

[EOS ソース解析 read only モードとは(原创| EOS 源码解析 什么是 read only 模式)](https://eos.live/detail/18718)
[EOS DApp ハッキング解析トランザクション拒否によるなりすまし攻撃(原创| EOS DApp 攻击解析之利用交易未上链进行欺骗攻击)](https://eos.live/detail/19215)

## 結論
上記２つの記事を参考して、結論を先に出しますと

- dapp から API ノードにアクション（トランザクション）を送信すると、APIノードがトランザクションを実行して、API ノードのステートデータを更新して、pending として記録しておく
- API ノードが BP ノードからそのトランザクションを含めるブロックを受信すると、一旦 pending のトランザクションをロールバック（ステートデータもロールバックされる）してから、トランザクションを再度実行して、ステートデータを更新する

図に整理してみました。

![Screen Shot 2018-12-23 at 11.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/4777/bc1c186c-0f06-6218-e0b3-45f4a343f73f.png)

## ノードの実行モード
- 特に設定してない場合は、`SPECULATIVE` モードに設定される
    - このモードの場合は、上記の動きで処理される
- 記事１で紹介された`READ_ONLY` モードでは
    - dapp 側から `push transaction` を受信しても処理せず無視する
    - そのため、ステートデータの更新は、`BP`からのブロックブロードキャストを受けた時だけステートデータを更新する

## まとめ
EOS のステートデータはブロックチェーンに乗ってないので、更新タイミングがよく分かりませんでした。
既にお分かりかもしれませんが、上記のフローの中では、ステートデータの更新タイミングがズレているところがあるので、それによって `dapp` が被害されてしまうことは、既に出てしまいました。
別の記事で詳細をまとめる予定です。
あなたのアウトプット情報発信のモチベは？Qiita勢 Twitter勢 会社仲間Slack/Skype勢/リアル勢 非エンジニア性 はてぶ勢 Google検索勢 

[アウトプット yumainaura - Google Search](https://www.google.co.jp/search?q=%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88+yumainaura&oq=%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88+yumainaura&aqs=chrome..69i57j69i60l3.2749j0j7&sourceid=chrome&ie=UTF-8)

# YoutubeStudio的なアクセス解析を実装してほしいQiitaヘヴィーユーザーの叫び

こちらが収まらなかったサブタイトル。

# Qiita勢

いいねをつけるのはここだけ‥！

なおかつ「俺は本当にいいねと思ったものにしか、いいねを押さないぜ‥！」的な文化がありそうな予感がするので、@yumainauraのようなチラシ裏の記事ばかり書いていると、なかなかいいねは付かないけどアウトプット大好き症候群だから僕は完全に幸福です‥！

Qiita記事を読むQiitaユーザーは全体の何パーセント？ 分からないが記事の種類にもよると思われる

他の流入経路もあるが、僕らにはこのQiita勢しか、なかなか見えない、可視化されない他のアクセスは見えづらい

[qiita いいね yumainaura - Google Search](https://www.google.co.jp/search?q=qiita+%E3%81%84%E3%81%84%E3%81%AD+yumainaura&oq=qiita+%E3%81%84%E3%81%84%E3%81%AD+yumainaura&aqs=chrome..69i57j69i60l3j69i64.3310j0j7&sourceid=chrome&ie=UTF-8)

# Qiitaでいいねが付かない？

その理由はユーザー層の違いかも。

# Twitter勢

Twitter拡散すると、Twitterでファボする。

# 社内Slack勢/Skype勢/リアル勢

あの記事見たよ！良かったよ！

Slackで拡散すると「いいね！」リアクションが付いたりするけど、Qiita使ってるはずの社内の人からも「いいね」は付かなかったりする

たぶんQiitaの「いいね」なんか気にしているのはアウトプットする情報発信者だけ、ほとんどの場合は、主に、いやこの言い方だと語弊があるか

そもそもQiitaアカウントがない人は押せないし

# Google検索勢

Qiitaアカウントはだいたい持っていないと思われる

いいねはつかないが記事の閲覧数が膨大に上がっていたりする

# 非エンジニア性

流入経路によらず

いいねを押したくてもQiitaアカウントを持っていないから押せない

# はてなブックマーク勢

わりとQiita勢とかぶってる？

作者の知らないところでしれっとブクマされてたりして、1年後に気付いたり

# 嗚呼サイレントマジョリティー！

これは自己承認欲求よりもアウトプット大好きな初期衝動、ブルーハーツ精神、ビギナーズマインドに何度でも立ち戻れという神のお告げである

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/923807b3-d4b5-21d9-f82b-b5581137eef2.png)

# いいね押してこうぜ？

この記事以外に。

エンジニアの幸福な未来社会実現はQiitaのいいねから始まるかもね？

# システム的な解決

QiitaがMediumやYoutubeStudioみたいにモチベ上がりそうなアクセス解析、閲覧時間の統計的なものを実装

アクセス解析を見るのが楽しい、自分の記事は役立っている！という仕組みはとても大事だと実感している、特にYouTubeStuioはかなり参考になる

# YoutubeStudio

こんなん

iphoneアプリでも見られてどきどきわくわく

でも自己承認欲求の罠にはまりがちなので用法用量は注意

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f3930987-5361-8cfe-2119-528925a8f492.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
静的ファイルを使う Django を Heroku にデプロイ

次のページを参考にしました。
[Django and Static Assets](https://devcenter.heroku.com/articles/django-assets)

開発サーバーで動いている次のようなアプリを
![django01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/49208108-1287-71f7-f007-9d4604697079.png)

Heroku で動かします。
![django02.png](https://qiita-image-store.s3.amazonaws.com/0/179446/700a4a6d-57fe-dc6e-e397-16e6e2d7e70f.png)

元としたプロジェクトの作成方法です。
[Django で 静的なファイル (jQuery,css) を使うアプリを作成](https://qiita.com/ekzemplaro/items/d0246d8a99740ac21b21)

1) ライブラリーのインストール

```bash
sudo pip3 install whitenoise
```

2) proj01/settings.py の編集

```py:proj01/settings.py
（省略）
ALLOWED_HOSTS = ['*']
（省略）
MIDDLEWARE = [
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
（省略）
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
```

3) この段階で開発サーバーがちゃんと動くことを確認

```bash
python manage.py runserver
```

4) 次のファイルを用意します。
>runtime.txt
>Procfile
>requirements.txt
>.gitignore

```text:runtime.txt
python-3.10.7
```

```text:Procfile
web: gunicorn proj01.wsgi --log-file -
```

```text:requirements.txt
django-heroku
gunicorn
pytz
whitenoise
```

```text:.gitignore
.vscode
__pycache__
env
staticfiles
db.sqlite3
*.py[co]
local_settings.py
```

5) Heroku にアップロードします。

```bash
heroku login -i
git init
git add .
git commit -m "init"
heroku create p0500
heroku config:set DISABLE_COLLECTSTATIC=1
git push heroku master
```

6) この例ではデータベースを使ってないので
>https://p0500.herokuapp.com/app03/ にブラウザーでアクセスします。

## アプリの削除

```bash
heroku apps:destroy --app p0500
```
[vim] insert mode 中に貼り付けるのまとめ

vimのヤンク操作や貼り付け操作は通常、ノーマルモードから実行されます。
しかし、挿入モードから抜けないでドキュメントにテキストを貼り付けたいと思うこともあります。

今回は、insert mode中にコピーしているテキストを貼り付ける方法を備忘録的にまとめています。

# 挿入モードから抜けないでレジスタから貼り付ける

挿入モード中にヤンクしたばかりのテキストを現在のカーソル位置に貼り付ける場合、

```
<C-r> 0
```

というコマンドが使えます。

`<C-r>`のあとにレジスタを指定することでそのレジスタの内容を挿入モード中に貼り付けることができます。
このコマンドの一般的な形式は以下になります。

```
<C-r> {register}
```
( ヘルプ => `:h i_ctrl-r` )


## レジスタの種類

| レジスタ名 | 意味 |
|:-----------:|:------------|
| " | 無名レジスタ。最後に　削除/ヤンク したテキストが格納される。|
| 0 | ヤンクレジスタ。ヤンクしたテキストが格納される。 |
| a-z | 名前付きレジスタ。ユーザが指定した場合に使われる。 |
| % | 現在編集しているファイル名が格納されている。 |
| * | クリップボードの内容が格納されている。 <br>(ブラウザで Ctrl+cしたものなど)|
| + | 上と同じ(win, mac) |

```
:reg
```

でレジスタの内容を確認することができます。


### (補足) 特定のレジスタ(a-z)にヤンクする方法

aレジスタにカーソル位置の単語をヤンクする場合、

```
"ayiw
``` 

というコマンドで出来ます。


このコマンドの一般的な形式は以下になります。

```
"{register}{motion}
```


# 挿入モード中に1度だけノーマルモードのコマンドを実行する

挿入モード中に

```
<C-o>
```

というコマンドで1度だけノーマルモードのコマンドを実行できる**挿入ノーマルモード**に切り替えることが出来ます。

**`<C-o> p`**というコマンドでも挿入モード中にヤンクしているテキストを貼り付けることができます。


# 参考文献
[挿入モード、コマンドモードで貼り付ける](https://qiita.com/fukajun/items/22e05c194866bf6aab6c)
[vimのレジスタ](https://qiita.com/0829/items/0b3f63798b6910623efc)
[Vim日本語ドキュメント(レジスタ)](https://vim-jp.org/vimdoc-ja/change.html#registers)
[挿入ノーマルモード](https://qiita.com/takasianpride/items/6900eebb7cde9fbb5298)
[vimのinsert modeの全てのキーマップ一覧](https://qiita.com/34ro/items/6163f595785ae99a632a)
ハッカソンに参加してみた

はじめまして、この記事で初投稿になります。
技術的な事を書こうと思ってたりもしていたのですが、そうこうしているうちに締め切りが迫ってきたので、先日大学の先輩2人と参加したハッカソンについて書こうと思います。

#ハッカソンとは

ハッカソンとは何かを作って発表するコンテストです。今回ぼくが参加したのはyahoo!hack dayというヤフー主催のハッカソンで、24時間でプロダクトを作り発表するというものでした。

#何を作ったのか

先輩が考案してくれたのですが、ダイエットを楽しくするアプリを作りたい、という事で、対戦型ダイエットアプリを作りました。相手と対戦して負けると相手から美味しそうなご飯の写真が送られてくるといった感じのアプリです。

#自分は何をしたのか

今回のハッカソンにおいて僕がした事は、ほとんどありませんでした笑
自分の未熟さを恥じるばかりですが、時間もないなかで先輩の足を引っ張ることないように、簡単な作業を少し手伝った程度でした。

#思ったこと

いままで個人的には参考書をみてサンプルのアプリを作ったりしたことしかないような僕にとっては、実際に案をだしてゼロからアプリを作る事はとても難しく感じました。ほとんど何も手伝えることがなくて、申し訳なかったです。ただ、何かを開発するということは、単純に面白い事だなあと、ほとんど何もしてない僕でも思ったので、きっと自分の出来ることが増えると、もっと面白いのかなあとも思いました。

発表の際には約80組のチームがみんな個性的で斬新なアイデアを積んだ作品をプレゼンし、高校生から自分たち大学生、さらには社会人の方までいろんな人達が参加していて、つい最近までプログラミングもやったことがない僕にとっては出会った事のないジャンルの人達の、独特な空間を感じることができました。

今回先輩2人にはいい経験をさせてもらってとても感謝したいます。ありがとうございました。

#最後に

メリークリスマス
USBのVid/Pidについて

こんにちは、
やましょうです。

#VID/PIDって何だ？
VIDはVENDER ID　企業コード
PIDはPRODUCT ID 製品コードとなっています。
有名どころのVENDER IDは、8086です。
このIDでUSB HOST側は、接続機器を確認します。

#すでにあった。
この企業コードを取得するには、現在ですと..
といろいろ書いていたところまとめらたページを発見しました。
https://qiita.com/gpsnmeajp/items/8eb8ecf0541032f6de0e

#補足
補足的にMICRO CHIPとNXPのPIDＮＯ取り方を記載しておきます。
NXP:
https://www.nxp.com/jp/support/developer-resources/software-development-tools/lpc-developer-resources-/usb-vid-pid-program:USB-VID-PID-PROGRAM

MICROCHIP:
https://www.microchip.co.jp/support/faq_usb.html
http://microchipdeveloper.com/faq:67

ってことで、自腹で払わなくても取得できる方法はいろいろありますね。
非エンジニアにプログラミングやQiitaを広めたいLINEの使い方、小悪魔女子風

[えんじにあ yumainaura - Google Search](https://www.google.co.jp/search?q=%E3%81%88%E3%82%93%E3%81%98%E3%81%AB%E3%81%82+yumainaura&oq=%E3%81%88%E3%82%93%E3%81%98%E3%81%AB%E3%81%82+yumainaura&aqs=chrome..69i57.4578j0j7&sourceid=chrome&ie=UTF-8)

# Facebookリア充女子的な「あ、映っちゃった」メソッド

LINEでのさりげない連絡や雑談

写真のバックグラウンドにひっそりとQiita記事を入れる

よく目を凝らすと見えるぐらいにしてみる

女子力が低いのでたぶん白々しく思われてる気もする

小悪魔の練習が必要

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1cb83e7c-b6fa-e811-5697-f286b3206f34.png)

# エンジニアのセルフブランディング、リアル口コミ拡散なら、まずはリアル知人友人から

Twitterやネットの遠くから広めようとしない

半径5メートルいないに全てのはあちゅうは存在する

下心満載だけど会話のネタにでもなったら面白いよね？


# これってQiita荒らし‥？

そろそろ怒られそうな気がしてきた

チラシの裏に書け

良いチラシがあれば教えてください

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/70a8b29b-b73e-781c-e669-9f764af7a6f2.png)

ただし、Qiita炎上させられるソーシャルハック的なスキルさえ@yumainauraには存在しない‥バズらせ方教えてください


# エンジニアリングは人間の幸福のために

広まれば広まるほど幸福に近づくのでは？

デジタルユートピア的な

人間は技術革新によって、ほんの少しずつではあるが幸福に近づいていくという思想

正しい言い方を忘れてしまった

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ae4af3d4-d946-69ba-1147-b55f30161c52.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/714454c6-ec8a-8ff1-887b-524b797b6f24.png)


# 決断、そして実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/74a3a6b1-17e2-4df4-ade0-609507060506.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MicrosoftDocsにプルリク送ってみた

Xamarin.EsssentialsでMicrosoft Docsの該当ドキュメント見ながらセンサーの値をとって遊んでいたところ、ちょっとしたあやまりを見つけました。
ほんの些細なことなので、これなら僕にも修正（や）れるんじゃないかなと思って修正申請を試みてみました。

今回修正したい箇所はこちらです。
[Xamarin.Essentials](https://docs.microsoft.com/ja-jp/xamarin/essentials/)のページの`機能ガイド`の部分で、`バロメーター`の説明で「負荷の変化」となっているところなのですが、「気圧の変化」がよいかと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/4f05bfe5-e6b5-249d-7f1c-375d841c5f58.png" title="" alt="clipboard_20181223093521.png" width="60%" height="" >


さて、じゃあこれどうやって修正するんだろう、ということで調べてみたら@amay077 さんがQiitaでMicrosoft Docsの修正リクエストの送り方を[説明](https://qiita.com/amay077/items/8823376f307235a7f651)してくれていたので、それを全力で参考にしてやってみます。


##まずは「編集」ボタンを押します
修正したいページの上部にあるメニューから「編集」を押します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/abe5214d-da2d-51ce-534b-ef0adce6bd73.png" title="" alt="image.png" width="60%" height="" >

するとGitHubがひらく、と。順調です。
ここで、また鉛筆マークの「編集」ボタンを押します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/61597167-3377-a24a-adb9-a1ff14734be1.png" title="" alt="dfasdfasdfa.png" width="60%" height="" >

##修正します
マークダウンの編集ページが開くので、ここで、修正したい箇所を編集します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/7d3deed5-b2ce-6905-8411-d19fea15ac1e.png" title="" alt="image.png" width="60%" height="" >

「負荷」を「気圧」に修正しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/d03b4144-3e78-378e-6148-da8f33acda97.png" title="" alt="adfasdfasdfa.png" width="60%" height="" >

下のほうに修正内容を端的に表す見出し的なものを一言入力しておきます。

##リクエストを送る準備をします
コメントを入力したら「Propose file Change」ボタンを押します。

**押しても大丈夫**、というお墨付きがありますので安心して押します。
まだ送られません。
せい、ぽち！
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/2c9baeca-d589-06b5-b31f-ebc045c47d1c.png" title="" alt="image.png" width="60%" height="" >

修正箇所の確認画面が表示されます。
まったくもって順調です。
修正内容に問題がなければ緑の「Create pull request」ボタンを押します。
これを押しても**まだ大丈夫**、ということなので、安心して押しましょう。
まだ送られません

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/93bd900a-8f7d-08f3-acb8-c497877c3313.png" title="" alt="image.png" width="60%" height="" >


##いよいよリクエストが送られます
以下の画面が表示されたら、コメントを入力するのですが、ここには「どんな修正をしたか」とか「なぜこの修正をしたか」を書くとのことです。
簡単な修正なのでシンプルに書いてみました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/74a8276c-a592-503d-a71e-bb751b4a89b9.png" title="" alt="image.png" width="60%" height="" >

このページの緑の「Create pull request」ボタンを押すと、修正リクエストが**送られる**ので緊張します。
ぽち。

##リクエスト送信完了
すると以下の画面が表示され、リクエストの送信が完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/845257fa-e123-9a6e-75e4-d9e125fcb336.png" title="" alt="image.png" width="60%" height="" >

##ちょっとみてみよう
さて、「Pull request」タブに「4」と数字がついていますね。
ということはおそらく、このページに対する修正リクエストが僕のも含めて4件溜まっているということでしょう。
そこで他にどんなリクエストが出されているんだろう、と思って開いてみました。

**他のリクエスト、全部英語じゃないですか(/ω＼)！**
<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/59eca120-32c4-71b5-2127-360393ab0ed7.png" title="" alt="image.png" width="60%" height="" >

日本語の文章に対する修正とはいえ、日本語で書いちゃって大丈夫だったのかな…。


#おわりに
@amay077 さんの記事のおかげでスムーズに修正リクエストを送ることができました。
やってみたら本当に簡単で、作業的な負荷はほとんどありませんでした。
これだったらGitHubの知識も必要ないですし、一度でもやってみたら心理的なハードルもなくなる（自分がそうだった）ので、カジュアルにリクエストを出していけるのではないでしょうか。

ぜひやってみてください。
二度と忘れたくないショートカットキー！手と指を見て叫ぶ脳科学的な記憶術。ディスプレイを見てつぶやくようでは初心者だぜ？


[ショートカット yumainaura - Google Search](https://www.google.co.jp/search?q=%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88+yumainaura&oq=%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88+yumainaura&aqs=chrome..69i57j69i60l3.4747j0j7&sourceid=chrome&ie=UTF-8)

# GoogleChromeで全画面表示する例

`Command+Control+F`

# こまんど、こんとろーる、えふ‥とか、言葉でつぶやいても覚えられない。

音じゃない。言葉じゃないんだ。

# 人間はショートカットを手と指で覚えている

「手では覚えてるんだけど、うまく言えない」ってことない？

つまり覚えるときは手に覚えさせる。

自分の手を見よう。

# ぐわっ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/bc1c95ea-7cc2-8a70-141e-7130c4b83add.png)


# ファッキンChrome全画面！と叫ぶ。

FはファッキンのF。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/721450de-d8d0-8a34-d44e-5fbd178af42d.png)

# 覚えやすそうなキャッチフレーズとともに叫んで脳に刻みつける

野球の素振りみたいに、何度かぐわっ、ファッキン！を繰り返すと良い。









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
qs(クエリ文字列のパース)の使い方メモ

### [qs](https://github.com/ljharb/qs)とは
セキュリティ強化されたクエリストリングのパースと文字列化のライブラリです。
ネストのサポートもしてます。

### 基本
リポジトリに書いてあるので割愛しようかと思いましたが、一応コードだけ載せておきます。

```javascript

var qs = require('qs');
var assert = require('assert');

var obj = qs.parse('a=c');
assert.deepEqual(obj, { a: 'c' });

var str = qs.stringify(obj);
assert.equal(str, 'a=c');
```

### URLパラメータを取得して変数にいれる
フロントでURLパラメータを利用するときは、こんな感じで取得できる

```javascript

var qs = require('qs');
var params = qs.parse( location.search.substr(1) );
```

`location.search`
はURLの?で始まるクエリを参照できる。

`.substr(1)`
は、?以降の文字列を切り出すため。

<br>
#### 例えば
ex)URLがhttps://hogehoge.com?q=javascript だった場合.
`location.search.substr(1)`は、`q=javascript`となる。
そして`params`は、`{q: "javascript"}`となる。


### 参考
- [qs](https://github.com/ljharb/qs)
- [location.search](http://www.htmq.com/js/location_search.shtml)
- [substr](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/substr)
くいなちゃんとなかよくなる方法

> 命がけでふざけてますけど、
> その点について誰か何か気になる人がいたら
> 是非そのまま黙り続けて頂けますか？
> それだと幸いです
> ヘイターの声聞こえないです
> 頭ん中 TWILIGHT です
>
> ― m-flo, 楽曲 No Question より

[No Question / m-flo](https://www.youtube.com/watch?v=UXa1bG5YFq0)

# くいなちゃん６さい

くいなちゃんは永遠に６さいです。

# 人のやることにいちいち口を出さない

人生はたった一度きり、その人のやることはその人の責任でやっているのでいちいち口を出さないことが重要です。例えば、ライセンスに関わる問題はその人の責任で行っているのでくいなちゃんが何をしようと、誰がどんなことをしてプルリクエストを出そうといちいち口を出さないことです。自分のやることに関してのみ真剣に考えればいいのです。

# Kuin言語はくいなちゃんのものです

Kuin言語はくいなちゃんの名前を冠しているのでくいなちゃんのものです。私は若輩者なのでくいなちゃんの経歴についてはあずかり知らないのですが、くいなちゃんはあなたが生まれるずっと前から６さいだったようです。なのでプログラミングのことに関してはかなりの力量があります。だから、今のトレンドや新奇的な技術に関しては懐疑的だったりします。そこのところをくみ取ってほしいのです。くいなちゃんがやっていないことに関してはたいてい理由があります。くいなちゃんの意思を尊重してほしいのです。

# くいなちゃんは奴隷ではありません

くいなちゃんはプログラミング以外にも、数学・物理学・化学・心理学など、あらゆる物事に興味をもっています。くいなちゃんはただの言語メンテナーではありません。Kuin言語に関する質問や要望を出して、すぐに対応してもらえなかったり、拒否されたり無視されたりしても怒らないようにしましょう。また、くいなちゃんは神様ではありません。くいなちゃんがもしくいなちゃんをやめたとしても怒らないようにしましょう。
【Realm】忘れがちなcloseは、拡張関数のuseを使うと便利【Kotlin】

本記事では、Realmの忘れがちな `close` は、Kotlinの拡張関数 `use` を使ったら便利だった、という小さな小さなTipsをご紹介します。

# Realmのcloseを忘れがちな件
基本的にRealmのインスタンスを使用した場合、使い終わったら `close` を呼ぶことになっていると思います。
ドキュメントにも、 **Closing Realms** というセクションにて記載があります。
https://realm.io/docs/java/5.8.0#closing-realms

しかしながら、GitHubでRealmを使っているプロジェクトを見てみると、 `close` を呼んでいないものをちらほら見かけます。実際自分も忘れてしまっていたことがありました。。

ちなみに、Realmのトップページのサンプルコードでは `close` を呼んでいる箇所がないため、必要ないと理解している方も一定数いるのかもしれません。
<img width="500" alt="スクリーンショット 2018-12-22 0.42.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/995/632557a5-22c2-6301-47b9-5052d9725344.png">

# closeを忘れても動きはするが…
そんな忘れがちな `close` ですが、別に呼ばなくてもクラッシュが起きたりなどがなく、動きはする模様です。

しかし、おかしな挙動をするケースがあるようで、一度削除したはずのデータが再度取得できる、というケースがありました。

実際のソースコードを記載することは出来ませんが、Androidアプリを例にすると
1. `AActivity` から `BActivity` を起動
2. `BActivity` で特定のデータを削除（ `close` は呼ばない）
3. `BActivity` をfinishして、 `AActivity` に戻る
4. `AActivity` でデータ一覧を取得すると、(2)で削除したはずのデータが何故か取得できた
という感じでした。

やはり `close` は必ず呼んでおくほうがいいと言えそうです。

# 拡張関数「use」
ちょろちょろと前説しましたが、本題です。
`close` を呼ぶ場合、下記のようにRealmインスタンスを使い終わったタイミングで `close` すればいいのですが、これだとふとした時に忘れてしまうこともあるかと思います。

```
Realm realm = Realm.getDefaultInstance();

// ... realmインスタンスを使った処理 ...

realm.close(); // ← 忘れがち
```

そんなときに便利なのが、Kotlinの拡張関数 `use` 
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.html

`Closeable` インターフェースを実装しているクラスに使用することができ、使用後に勝手に `close` を呼んでくれるという拡張関数です。 Javaの `try-with-resources` と同じようなもので、このようなものを **Loan Pattern** と呼ぶらしいです。

Realmは `Closeable` を実装しているため、 `use` を使ってみると…

```
Realm.getDefaultInstance().use { realm ->

// ... realmインスタンスを使った処理 ...

}
```

ちょっとばかしシンプルになったかと思います。
Realmのインスタンスもスコープがはっきりしているので、可読性も増したのではないでしょうか？
これで `close` の呼び忘れもなくなりますね。 :smile:

# まとめ
Realmの `close` は、Kotlinの拡張関数 `use` を使うとシンプルに書けますし、 `close` 忘れもなくなるので、かなり便利だと感じました。
Kotlinには他にも便利な拡張関数があったりするので、色々と調べて、便利なやつはどんどん使っていきたいですね。

# 参考
https://qiita.com/msh5/items/b2c9e80f205892195416
laravel5.5でのLogViewerのインストールについて

#Laravel5.5のLogViewerが便利

Laravelでログを管理するには、Logviewerを使っています。便利なのでプロジェクトを作るたびにやっていることをメモ

<img src='https://raw.githubusercontent.com/ARCANEDEV/LogViewer/master/_screenshots/1-dashboard.jpg'>
##手順

基本的には下記の手順

1. ENVファイルにAPP_LOG=singleを追加
2. LogViewerのインストール
3. LogViewerの設定

##LovViewerのインストールについて

下記のリンクを参照
https://github.com/ARCANEDEV/LogViewer/blob/master/_docs/1.Installation-and-Setup.md

##インストールと設定のポイント

###composer install の際にバージョンを指定する　 
composer require arcanedev/log-viewer 4.4

### ルーティングはconfigから
基本のルーティングはhttp://{your-project}/log-viewer

config/logviewer.php から設定を変更

    'route'         => [
        'enabled'    => true,

        'attributes' => [
            'prefix'     => 'log-viewer',

            'middleware' => env('ARCANEDEV_LOGVIEWER_MIDDLEWARE') ? explode(',', env('ARCANEDEV_LOGVIEWER_MIDDLEWARE')) : null,
        ],
    ],


##ログページを公開しない

インストール後は誰もがログのページにアクセスができます。そのため、middlewareで制御する

envファイルに下記を追加すると、auth,adminのmiddlewareが効いて、認証ユーザーしかログが見れないようになります

ARCANEDEV_LOGVIEWER_MIDDLEWARE=web,auth,admin

##参考記事
APP_LOGの変更
https://qiita.com/isao_e/items/304c66f7807f141b6f43
位置情報Joinをやってみる

#ArcGISで位置情報Joinをやってみる

何かしらの形で地理情報を扱ったことってありますよね。いろいろな形式などありますが、GoogleMapsとかでみるあのLatとかLonとかいうやつです。
このようなデータをメインに扱うシステムのことを地理情報システムといいます (通称GIS Geographic Information System)

今回は、結構本格的なGISの代表角のArcGISを使って少しだけできることを書いてみます。。。

みなさんSQLでJoin文とかって書いたことありますよね。別々のテーブルを関連するデータを使って連携させてより詳細なデータを取得していく。
GISでは位置情報を扱うので位置情報でのJoin (Spatial Join) ができます、しかもかなりお手軽に！

例を使って見てみましょう。

この例では2つの地理情報を使いますホテルの位置データと地域のデータこの2つをJoinしてホテルがどの地域にあるか調べてみましょう。

アメリカワシントンDCのホテルの位置データ（点:Point）: http://opendata.dc.gov/datasets/a3ed163dbf994792a010d742ef1f683d_6
このようなデータが入ってます：
![Screen Shot 2018-12-25 at 06.48.29.png](https://qiita-image-store.s3.amazonaws.com/0/121687/34427880-dbe0-6cca-3a26-4802a15d7e5e.png)

地域のデータ（多角形:Polygon）はこちらからダウンロード: https://www.zillow.com/howto/api/neighborhood-boundaries.htm
データはこんな感じです：
![Screen Shot 2018-12-25 at 06.48.41.png](https://qiita-image-store.s3.amazonaws.com/0/121687/741375b8-ce69-3719-a0ce-7a2b684067ed.png)

（地理情報のオープンデータって結構あるんです）

ではこのホテルがどの地域にあるかSpatialJoinをして特定してみます。手順は簡単です。

1) GISに2つのテータを追加（ドラッグアンドドロップするだけです）
![uuuu.gif](https://qiita-image-store.s3.amazonaws.com/0/121687/c8c8b36e-4bb0-6add-b451-3b37d0166569.gif)

2) SpatialJoin(Catalog->System Toolboxes->Analysis Tool->Overlay)を実行する、1つ目のInputがホテルのデータ、2つめが地域、あとはデフォルトでOK：
![oooo.gif](https://qiita-image-store.s3.amazonaws.com/0/121687/22e93b88-f5d6-d99a-e154-45d0bcc16056.gif)

新しいデータが作成されデータを見ると地域の情報がJoinされてますね！

今回はこれだけですがGISにはまだまだたくさん面白い機能がありカスタマイズなども可能です。テキスト、数字だけではなくたまには視点を変えてデータを見ると普段あまり気づかないことも気づけるかもしれませんね。
GIS試してみてね。

おわり。
Bash でファイルを使いこなす

Bash は多くの GNU/Linux ディストリビューションや macOS のデフォルトログインシェルとして普及しており、これらの OS では `/bin/sh` で起動するシェルも Bash の Bourne Shell 互換モード(なので Bash の POSIX に従っていない拡張機能は無効化される)だったりします。Debian では dash だ、とかいろいろありますが。この投稿では、Bash の便利機能だったり、Unix 系のシステムで使える便利な機能をまとめたいと思います。

# パイプ

```shell-session
$ command1 | command2
```

おなじみの機能ですね。`command1` の標準出力が `command2` の標準入力につなげられます。UNIX 哲学に「すべてのプログラムはフィルタとして動作する」というものがありますが、この機能はその典型だと思います。
ちなみに、`grep` をパイプして `less` に渡したりすると、 `grep` から見て標準出力が tty ではなくなるので色がつかなくなります。それを防ぐには、expect というパッケージに含まれる `unbuffer` というコマンドに渡し、`less` に `-R` オプションを付けると色がついたまま less で見られるようになります。

```shell-session
$ unbuffer command1 | less -R
```

# リダイレクト

```shell
# 標準出力をファイル out.txt にリダイレクト
$ command >out.txt
# 標準エラー出力を標準出力にリダイレクト
$ command 2>&1
# 標準出力と標準エラー出力を /dev/null にリダイレクトして無視する
$ command >/dev/null 2>&1
# out.txt に追記する
$ command >>out.txt
```

ファイルから標準入力に流したり、標準出力や標準エラー出力を標準入力に流したりします。`>` では既存の内容に上書きする一方、 `>>` を使うと既存の内容に追記できます。`.bashrc` にリダイレクトで追記しようとして誤って `>` を使ってい、他の内容が消えてしまうみたいな事故を起こさないように注意が必要です(実体験)。
Bash では標準出力と標準エラー出力を同時にリダイレクトできます。

```shell-session
$ command &>/dev/null
```

# プロセス置換

```shell-session
$ command <(command2) <(command3)
$ command >(command2)
```
~~呼び方は分かりません。~~ コメントで教えていただきました。
`<(command)` では `command` の標準出力からファイルとして読むことができ、 `>(command)` では `command`の標準入力にファイルとして書き込むことができます。 Bash の機能なので sh では使えません。

# tty をファイルとして扱う

tty は `/dev/tty` という仮想的なファイルとして存在しているのでファイルとして扱えます。
他にも以下のようなファイルかあります。

## 特殊ファイル

### `/dev/null`

書き込んだ内容は破棄され、読もうとすると即座に EOF が返ってきます。コマンドの出力を無視するのによく使われています。
苦情を受け付けたくない場合に「不平不満は /dev/null に！」みたいな使い方もするらしいです。[Wikipedia](https://ja.wikipedia.org/wiki//dev/null) が言ってました。

### `/dev/zero`

書き込んだ内容が破棄されるのは `/dev/null` と同じですが、 延々と `\0` を詰め込んで返してきます。EOF は返さないみたいです。

### `/dev/random`

ランダムなバイトを返します。デバイスなどから拾った環境のノイズを加工して返してくるので質は高い一方遅いです。書き込んだ内容は乱数生成のエントロピーとして使われます。

### `/dev/urandom`

`/dev/random` と似ていますが、エントロピーが足りないと擬似乱数生成器で乱数を生成して返してくるので読み込みをブロックされません。GPG や SSL や SSH の鍵を生成する時以外はこちらを用いるべきと man に書いてあります。

### `/dev/tty`

端末への出力や入力はここへの入出力に見えます。ファイルからの入力しか取らないプログラムたファイルへの出力しかしないプログラムに `/dev/tty` を渡すと端末から読むことができます。ただし、プログラムがファイルをシークする場合はうまく動かないので注意が必要です。`/dev/stdin` や `/dev/stdout` や `/dev/stderr` というのも存在します。こちらは `/proc/self/fd/[0..2]` へのシンボリックリンクになっています。`/proc/self/fd/[0..2]` それぞれの実際の出力先(tty、ファイルなど)へのシンボリックリンクになっています。
JASL:JavaScript-likeにGLSLを書きたい

この記事は「[WebGL Advent Calendar 2018](https://qiita.com/advent-calendar/2018/webgl)」21日目です
更新遅くなってしまい申し訳ありません．そして実装も中途半端でございます....笑
こういう思想を持つ人もいるんだなあぐらいの気持ちで読んでいただけると幸いです

#はじめに

WebGLではGLSLとJavaScript，２つの言語を書かなくてはなりません
そのため，２つの言語間での記述の違いに戸惑いが生まれます
GLSLでは明確に型を定義しなくてはならないのに対し，JavaScriptでは型定義は基本的に行わなくていいです．varとか書いとけばいい
こういう言語間の違いでミスが生まれる経験は誰しもがあるんじゃないでしょうか
今回はGLSLでもvarとか書けたらいいよね！っていう割と思想的なお話です

#プロトタイプ
![ 2018-12-23 10.37.54.png](https://qiita-image-store.s3.amazonaws.com/0/199455/52c83c9c-ff06-0108-4356-094464d3e5dd.png)




変数p,colorをvar文で定義してます．エディタが勝手に型を変換して実行してくれます

#実装
めっちゃゴリ押しです．一応こんな感じで実現できるよってお話です

一度var文で定義されている行を取り出します

```glsl
var p = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
```

次に正規表現で，=から右辺を取り出します

```glsl
= (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
```

取り出したこの行を，一度

```glsl
float x = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
```
のようにfloat型の変数で再定義します
こいつを用意しておいたWebglContextに突っ込んでコンパイルして，エラーを見ます
次のようなエラーが出ます

ERROR: 0:5: '=' : cannot convert from 'highp 2-component vector of float' to 'highp float'

このエラーはつまり，vec2型からfloat型に代入していてエラーが出ています．つまり，'highp 2-component vector of float'がvec2型を表しているわけです
したがって，var をvec2に変換し，実行します
もし右辺がfloat型ならエラーは出ません．そのためvarはfloatに変換します

#おわりに

GLSLをJavaScriptみたいにvarのみで変数定義できればいいよね！ってお話でした
実際に型のつけ忘れとか間違いの際に，エラー文では一応右辺の方が判定できてるんだなあと思い，ちょっとそれを利用して遊んでみた感じです
実装が甘々ですので，まだ全然実用には至っていません(例えばuniform変数はvar文で定義できてないですし，右辺がないと型が判定できません...)

https://ukeyshima.github.io/jasl/
サンプルはここで動作を確認できます！