OmniAICreator/Qiita-1.07M huggingface dataset:
錠前の形状がスマートロックQrioに合わなかったのでサムターンホルダーを自作した

# はじめに
オートロックな生活に憧れたので、スマートロック**Qrio Lock (キュリオロック)  Q-SL2**を買ってみました。こちらで買えます。http://amzn.asia/d/9gv7RJR
しかし、自宅のサムターン（ドア内側にある錠前のつまみ）の形状が少し特殊で、残念ながら、Qrio Lock付属のサムターンホルダーでは形が合いませんでした。
![サムターン.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/35237053-ea76-b04c-6fbd-7efe8d4677e4.jpeg)
そこで、サムターンホルダーを自作してみました。

# Qrio Lockの形状
Qrio Lockの形はこんな感じです。回転部分に４つの突起があり、これがサムターンホルダーにはまります。
![Qrio.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/82a53d13-dbef-75af-bd38-bf00597337c5.jpeg)

# サムターンホルダーについて
まず付属のサムターンホルダーがどんな仕組みなのかを調べてみました。S, M, Lの３つのサムターンホルダーが付属されています。表面（ドアに取り付ける側）はこんな感じです。
![表面.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/e891851a-67f9-10cb-bc7e-00a4af1b605e.jpeg)
錠前のつまみにはめ込むための隙間があります。Sの隙間は狭く、Lの隙間は広いです。
裏面（Qrio Lockに取り付ける側）はこんな感じです。
![裏面.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/f928c963-746a-abd5-c25d-9fc6c4322979.jpeg)
４つの穴が空いていて、そこにQrio Lockの突起をはめ込みます。穴の寸法は写真の通りです。とてもシンプルです。サムターンホルダー自作できそうですよね。

# 作ったもの
完成品がこちらです！・・・ダサい！！
![完成品.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/968c2a40-a69e-38df-6c42-4fd88213214e.jpeg)
黒い部分はサムターン（ドアのつまみ）で、木材がサムターンホルダーです。こんなのでも、ちゃんと機能しました。

# 材料
## 木材
計算したところ、今回必要な木材の寸法は、30x30x15mmでした。（錠前の形状によって、必要な寸法は異なると思うので、設置場所に応じて計算してください。）
100円ショップで60x30x15mmの木材が売っていたので、これを半分に切って使いました。
![材料.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/727ef42b-908d-0b7c-631d-6e6cc670fd36.jpeg)

## 結束バンド
木材だけでは、サムターンをしっかりとホールドすることができなかったので、外周を結束バンドで抑えました。100円ショップ等で買えると思います。

# 道具
使った道具はこんな感じです。
![道具.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/f1414c54-9dcf-400e-6776-feaceb72ee10.jpeg)

## ノコギリ
木材の切断に必要です。それなりに大きいものを用意したほうが、切断は楽だと思います。写真のものだと小さすぎで、切断にかなり時間がかかりました。

## ドリル
Qrio Lockの突起をはめるための穴をドリルで開けます。写真のものは直径5㎜のハンドドリル（手動）です。こちらで買えます。https://www.monotaro.com/p/7581/2834/
もちろん電動ドリルでもかまいません。

# 加工
加工手順はこんな感じです。

- ノコギリで木材を２つに切る
- ２つの木材でサムターンを挟む
- 結束バンドでまとめる
- ドリルで穴をあける

# 設置
こんな感じに木材でサムターンをはさみ、外周を結束バンドで固めます。木材にあけておいた４つの穴にQrio Lockを差し込んで完成です。
<img width="400" alt="設置２.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/221845/90ca4a11-0fde-4604-45b1-ebabf6e06ca3.jpeg">
![設置.jpg](https://qiita-image-store.s3.amazonaws.com/0/221845/8afaf89a-4ddc-210f-e265-f86b29c5aec2.jpeg)

# さいごに
見た目はダサいですが、ちゃんとサムターンホルダーとして機能したので、よかったです。久々にIoTっぽい投稿（？）ができました。
Object.keysの挙動の変化

またIEだけで動かないコードが発生したのですが、今回ばかりはIEのせいとも言えない状況でした。

# IEだけエラーに

いちおうIE11だけは切り捨てずに維持しているコードで、あるときIEだけがうまく動かないという状態になっていました。確認してみると、`Object.keys`で、引数が「オブジェクトではありません」とエラーになっていました。

他のブラウザで確認してみたところ、`Object.keys`にオブジェクト以外を流してもちゃんと動作するようでした。

# 挙動の違い

で、調べてみたところ、これはIEのバグというわけではなく、ES5とES6で仕様が変化していました。

* ES5→`Object.keys`の引数をオブジェクト以外にすると、`TypeError`になる
* ES6→`Object.keys`の引数をオブジェクト以外にすると、`ToObject`（内部操作）によってまずオブジェクトに変換される

なお、`ToObject`の動作は以下のとおりです（`new`なしの`Object()`に近いですが、`Object(null)`や`Object(undefined)`は空オブジェクトを返しますので、その違いには要注意です）。

* `null`、`undefined`…変換できずに`TypeError`が発生
* プリミティブ値（`string`、`boolean`、`number`、`symbol`）…ラッパーオブジェクトを返す
* オブジェクト…そのまま

# 現実問題

ただし、ラッパーオブジェクトは同じ方法で生成されること、また`Object.keys`はプロトタイプを見ないこともあって、`String`以外のラッパーオブジェクト（プリミティブも）は、`Object.keys`に入れても空配列を返すだけです。`String`の場合は、0から`length-1`まで1つずつ詰まった配列を返しますが、そこまで有用でもなさそうです。

意図的に`Object.keys`の引数をオブジェクト以外とすることは、ほぼ必要ないでしょう。
CentOSのFluentd(td-agent)でどうしてもrootで動いてくれなかった件（解決方法あり）

# 概要
CentOSにtd-agentをインストールし、root権限が必要なログファイルをチェックしたかったが、
なかなかroot権限でtd-agent自体が起動しなくて困った

# 前提
CentOS7 
td-agent 1.2.2

※デーモンの起動方法

```console
systemctl start td-agent.service
```

# 最初にやったやりかた

```:/etc/init.d/td-agent
#TD_AGENT_USER=td-agent #コメントアウト
#TD_AGENT_GROUP=td-agent #コメントアウト
TD_AGENT_USER=root #追記
TD_AGENT_GROUP=root #追記
```

しかし、td-agentユーザで実行され続ける😇

# 最終的に解決したやりかた

```:/lib/systemd/system/td-agent.service
#User=td-agent #コメントアウト
#Group=td-agent #コメントアウト
User=root #追記
Group=root #追記
```

rootユーザで起動した！！😊
完全未経験からWebエンジニアになりたい

Javaをマスターすれば大体の言語はマスターできる的なことをなんかのサイトで読んだのでJavaをメインで勉強している。
この記事で自分の勉強記録をメモっぽく残していきます。

## 2018年6月
前々から転職して食いっぱぐれのない技術を身に着けたい！と思っていた。
ある日「[これならわかる！Java入門講座](https://www.amazon.co.jp/%E3%81%93%E3%82%8C%E3%81%AA%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B-Java%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%E6%B0%B4%E5%8F%A3-%E5%85%8B%E4%B9%9F/dp/4798043516)」っていう本を衝動的に買い勉強してみた。
本の内容は文系超初心者にもわかりやすかったけど、[プロゲート](https://prog-8.com/)という有名オンライン学習サービスがあることを知り衝動的に有料会員へ。(月980円)
プロゲートでJavaとHTML&CSSを学ぶ。
上記は全コースやったけど、これだけやってもエンジニアにはなれないだろうし、この後何を勉強すればいいかわからない状態。

## 2018年7月
Androidのアプリを作れるようになろう！と思い立ち、「[作ればわかる！Androidプログラミング 第4版 ](https://www.amazon.co.jp/%E4%BD%9C%E3%82%8C%E3%81%B0%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81Android%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-SDK5-Android-Studio%E5%AF%BE%E5%BF%9C-10%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AD%A6%E3%81%B6Android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-ebook/dp/B01EWY5E3W)」という本を買って勉強する。文系超絶初心者には基本的なことを端折られすぎてて少し読んで挫折。
懲りずに「[Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%EF%BC%86%E5%BF%9C%E7%94%A8%E5%8A%9B%E3%82%92%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E8%82%B2%E6%88%90%EF%BC%81-Android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%81%AA%E3%82%93%E3%81%A1%E3%82%83%E3%81%A3%E3%81%A6%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%BD%8A%E8%97%A4-%E6%96%B0%E4%B8%89-ebook/dp/B078X8H61T/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1537790455&sr=1-2&keywords=android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8)」を買った。わからないながらもリスナーとかフラグメントの概念をなんとか理解していく。だが残念ながらこの本も文系超初心者には優しくはなかった。

## 2018年8月
いろいろ転職とかエンジニアとか言語のことを調べているうちに、初学者はRubyを勉強したほうがいい、JavaはSIer企業が使うものという情報に翻弄される。
Rubyから始めなかったことを後悔しつつも、Javaはオブジェクト指向を本質から学べるとなんかのサイトで読み、JavaでWebサイトを作ってみることにする。
⇒現在
シェルスクリプトで多数のプログラムを同時実行: xargs, nohup, wait

サーバーで多数の実験を回すときにスクリプトである程度楽をするためのメモ. 

# xargs
`xargs`は, 標準入力から受け取ったものを引数とみなしたコマンドを生成して実行できる. 

```bash
echo -e "1 2\n4 5\n7 8" | xargs -L 1 -P 2 seq
```

- `-L 数字`: 数字行ずつ読み取って実行する
- `-P 数字`: 同時に実行するプロセス数の指定

この例では, `echo`により

>1 2
>4 5
>7 8

が1行ずつ`xargs`に入力される. 
同時に実行するプロセス数を2と指定しているため, `seq 1 2`と`seq 4 5`を同時実行したあと, `seq 7 8`が実行される. 

もっと複雑なパラメータを試すには, `()`で`for`を囲んで`echo`するとよい. 

```bash
(
for n in 10 20 30; do
    for d in `seq 5`; do
        for a in 1 0.1 0.01 0.001; do
            echo $n $d $a
        done
    done
done
) | xargs -L 1 -P 2 ./my_experiment 
```

## xargsのリダイレクト
並列実行するプログラムそれぞれの標準出力をファイルに保存したい場合, 少しややこしくなる. 
実行したいコマンドをスクリプトで覆う. 

```bash:script.sh
#!/bin/sh
seq $1 $2 > seq_$1_$2
```

作成したスクリプト`script.sh`をxargsで呼ぶ. 

```bash
echo -e "1 2\n4 5\n7 8" | xargs -L 1 -P 2 ./script.sh
```

これにより, `seq_1_2`, `seq_4_5`, `seq_7_8`の3つのファイルそれぞれに結果が書き込まれる. 


追記: 1つの引数なら, xargsの`-I{}`オプション(置換文字列)でいけるみたい.
```bash
seq 5 | xargs -L 1 -P 2 -I{} ./my_experiment {}
```

# nohup
並列実行するプログラムそれぞれの標準出力をファイルに保存したい場合,  `nohup`を使う方法もある. 

`nohup`コマンドはバックグラウンドでプログラムを動かすコマンドである. 
`nohup ./my_experiment 10 1 0.1 > result.txt &`
このように打てば, 標準出力は`result.txt`に記載され, ログアウトしたあとでも, プログラムは走り続ける. プログラムを終了したいときは, 
`pkill プロセス名` や `kill プロセスID` などを使う. (プロセスに関しては, `top`, `ps`, `pgrep`, `lsof`などで確認. )

さて, 本題の並列実行は次のように行う. 

```bash
#!/bin/sh
for n in 10 20 30; do
    for d in `seq 5`; do
        for a in 1 0.1 0.01 0.001; do
            nohup ./my_experiment $n $d $a > "result${n}_${d}_${a}" &
        done
    done
done
```
上記の例では, nohupにより, プログラムの終了を待たずに全てのループが回る. 
それぞれの引数に対する実験設定に関して, 別々の出力結果を保存できる. 

## プログラムの終了を同期する: wait
並列数をコントロールするには`wait`コマンドを使う. 
`wait プロセスID1 プロセスID2 ...`
`wait`コマンドは指定したプロセスが終了するまで, 次の処理に進まない. 
そのため, 終了を同期させたいときなどに使える. 

```bash
#!/bin/bash
for n in 10 20 30; do
    for d in `seq 5`; do
        array=()
        for a in 1 0.1 0.01 0.001; do
            nohup ./my_experiment $n $d $a > "result${n}_${d}_${a}" &
            array+=($!)
        done
        wait ${array[@]}
    done
done
```

先頭の`#!/bin/sh`が`#!/bin/bash`に変わっていることに注意. (配列を使用するには`bash`にする必要がある. )

`$!`変数には, **直前のプロセスID**が入るため, `array配列`は終了を合わせたいプロセスID達が保存されている. 

この例では, それぞれの`a`に関してのみ同時実行され, 4つの`a`がすべて終わらなければ, 次の`d`へは進まない. 

# waitで監視できないプロセスの監視
`wait`コマンドは, 現在のシェルの子プロセスしか監視できない. 

> wait 3148
> bash: wait: pid 3148 はこのシェルの子プロセスではありません

一度nohupでスクリプトを実行して, ログアウト後, そのスクリプトの終了を監視したいときは, 別の方法を取らなければならない. 

```bash
#!/bin/bash

while true;do
    pid=`pgrep script1.sh`
    if test -z $pid ; then
        echo "dead"
        nohup ./script2.sh &
        break
    else
        echo "running"
    fi
    sleep 5
done
```

この例では, `script1.sh`というスクリプトの実行が終わり次第, `script2.sh`を実行する. 
監視間隔は5sである. 

- `pgrep`: プロセス名からプロセスIDを得るコマンド
- `test -z $pid`: `$pid`文字列が空のとき真

# まとめ
- `xargs`
- `nohup`と`for`で同時実行
- `wait`で終了同期
- `wait`でできない場合, ループで監視
既存のnuxtプロジェクトにvuetifyをインストール

# 概要 
- 【目的】nuxtプロジェクトにvuetifyを適用したい
- - 環境
    - Windows10, VSCode
    - Node v8.11.3
    - Nuxt v1.4
    - vuetify v1.2.4
- 参考
  - 下記テンプレートでvuetifyを選択・生成したプロジェクトを参考 
  - https://github.com/nuxt-community/create-nuxt-app
  
# npm install 
> npm install --save vuetify
> npm install --save-dev stylus
> npm install --save-dev stylus-loader

# nuxt.config.js の変更
追記する

```js:nuxt.config.js

const nodeExternals = require('webpack-node-externals') //add
・・略・・
// アイコン
  head: {
    link: [
      { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' } //add
・・略・・
//CSS
css: [
    'vuetify/src/stylus/main.styl', //add
  ],
・・略・・
//plugins
 plugins: [
    '@/plugins/vuetify', //add
・・略・・
//webpack設定
  build: {
    extend(config, ctx) {
      if (ctx.isServer) {//add for vuetify
        config.externals = [
          nodeExternals({
            whitelist: [/^vuetify/]
          })
        ]
      }

```
# plugin ディレクトリにvuetify.jsを新規作成
```js:plugins/vuetify.js
import Vue from 'vue'
import Vuetify from 'vuetify'
import colors from 'vuetify/es5/util/colors'

Vue.use(Vuetify, {
  theme: {
    primary: '#121212', // a color that is not in the material colors palette
    accent: colors.grey.darken3,
    secondary: colors.amber.darken3,
    info: colors.teal.lighten1,
    warning: colors.amber.base,
    error: colors.deepOrange.accent4,
    success: colors.green.accent3
  }
})

```
Ruby技術者認定試験Silverに3週間で合格できました

Ruby技術者認定試験、Ruby Association Certified Ruby Programmer Silver version 2.1に82点で合格しました。準備期間3週間ということで、まずまずの結果です。受験録として、勉強法を公開します。

![silver.png](https://qiita-image-store.s3.amazonaws.com/0/112294/defed2c7-3d1c-0814-6fdb-5b6930f878d1.png)

##　教材は2つだけで十分

- 教材はWeb、本一つずつであれば十分足ります
- 間違った問題の解説を読んで一つ一つRubyの言語仕様を自分なりに理解していけば合格できると思います

### 1つ目(Web)： RubyExamination

https://rex.libertyfish.co.jp/

- 実際の試験問題と比較すると若干難しいのですが、毎回、ランダムで問題が出題されるので、問題数をこなすことができます
- 問題の後の解説が丁寧なので、その解説から理解を深めていく勉強方法がオススメです。

### 2つ目(本)： Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

http://amzn.asia/d/7P8OhfN

- Silver問題の4-5割は、この本の演習問題と同様の問題が出題されるので、しっかりやっておけば合格にかなり近づくことができると思います。

## 間違った問題の理解が重要

- 間違った問題は、Rubyの言語仕様に対して基本的な知識が抜けている部分ということです。つまり、その部分を理解し直することで、万遍なく知識を身に付けることができます。
- 私の場合、間違った問題に関して、実際にプログラミングして、Qiitaにまとめる方法をとりました
- 以下、私の作った個人的な問題集です。自分が間違った問題で構成されています。ご参考ください
- [Ruby 技術者認定試験 Silver/Gold 対策の個人的なハマり問題集](https://qiita.com/ffggss/items/0bab2a1e80e941378b49)

## まとめ

- 教材はWeb、本一つずつであれば十分たりる
    - [RubyExamination](https://rex.libertyfish.co.jp/)
    - [Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書](http://amzn.asia/d/7P8OhfN)
- 上記、２つの問題集で間違った問題を実際にプログラミングするなどして自分なりに理解して、万遍なく知識を身に付けることが重要
    - [[参考] Ruby 技術者認定試験 Silver/Gold 対策の個人的なハマり問題集](https://qiita.com/ffggss/items/0bab2a1e80e941378b49)
オンラインワープロの編集部分がDIVなのかSVGなのか表

Google Docs等オンライン上で共同編集できるワープロ類は多く、個人的にも作ってみたいので比較。

#結果

|実装|描画部分|
|---|-------|
|Google Docs|DIV → Canvasに移行予定|
|Microsoft Office online / Office 365|DIV 内の P|
|Apple iCloud Pages|SVG 内の G 内の TEXT|

なんとiCloudのPagesがSVGベースという驚きの結果。。TeXのような既存のタイプセッタとの統合を考えると、地味に有力な選択肢な気がしないでもない。

Wordは比較的HTMLに素直な実装。

Google Docsは中間的。まぁコンテキストを保持しないといけないようなシチュエーションでも無いので、`DIV`と`SPAN`でどうにかする方向性もそれほど間違っては居ないんじゃないだろうか。 追記: Google DocsはCanvasに移行予定 https://workspaceupdates.googleblog.com/2021/05/Google-Docs-Canvas-Based-Rendering-Update.html

## ToDo

- Libreoffice Online / Collabora Online
 - NextCloudか何かファイル管理部分が無いと使えないので保留 https://nextcloud.com/collaboraonline/
- Onlyoffice
 - 手元で試したけど認証が通らず上手くいかなかった。 https://qiita.com/yhornisse/items/cd320745454998484dac

Onlyofficeはreadonlyのオンラインデモを見る限り描画面やカーソルが `<canvas>` で描画されており興味深い。いやまぁ AGPL3 なんだし実装読めば良いんだけど。 https://github.com/ONLYOFFICE/DesktopEditors

# 実装比較

## Google Docs

- https://www.google.com/intl/ja_jp/docs/about/
 - 公式の説明ページ
- https://workspaceupdates.googleblog.com/2021/05/Google-Docs-Canvas-Based-Rendering-Update.html
 - Canvasへの移行計画を説明したページ  

![SnapCrab_NoName_2018-9-24_18-11-48_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/67446/aa0ecfba-476f-cd1f-7b39-67ba9e2af2d8.png)

日本語化されてないんだっけ？普通の実装と言える。

![SnapCrab_NoName_2018-9-24_19-51-52_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/67446/499f2ce9-d3eb-3ef6-d547-62ae5395804f.png)

編集pingは特になく、Google Analytics同様表に表示する等のimpressionのトラッキングを行っている。OPTIONS等のHTTP語彙も使用する。OfficeやiCloudに見られるような長期pollingも無い。帯域に配慮？

## Microsoft Office Online

- https://products.office.com/ja-jp/office-online/documents-spreadsheets-presentations-office-online
 - 公式の説明ページ

![SnapCrab_NoName_2018-9-24_18-10-10_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/67446/9aa263f8-fc16-7394-22b8-a32ba7dde1f2.png)

名前がひらがななのは、漢字にすると何故か"不適切な名前"と怒られるため。バルガリティフィルタに引っ掛るような名前に産まれたつもりは無いんだけど。。

MS Wordの再現性が地味に高い。MSはいわゆるAJAXを生んだ`XMLHTTPRequest`(XHR)実装の本家でもあり、XHRはOffice Onlineの先祖にあたるOutlook WebAppで使うために作られた。Outlook WebAppも登場当初からそれなりに再現性の高い実装をWebブラウザ上で実装していた。 

![SnapCrab_NoName_2018-9-24_19-55-12_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/67446/b728467b-7da8-bf0b-1065-964e9037ca80.png)

なぜか編集中のpingアドレスは `OneNote` になっている。長期pollingは30秒程度。

## Apple iCloud Pages

- https://support.apple.com/kb/PH14665
 - 公式サイト ..? iCloudが使えるAppleIDを持っていれば、 https://www.icloud.com/ でログインすることで使うことができる。
 - 2000年代前半にAppleIDを取得した場合、ドットや他の特殊文字をIDに入れることができてしまったためiCloudが使えないことがある。

![SnapCrab_NoName_2018-9-24_18-13-57_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/67446/ef26c4ec-74e0-81bd-e4a9-0f1eec2f2ad9.png)

編集面はSVGで実装されており、カーソルも普通にSVG的なRectで描画され、点滅は `visibility: hidden` の切り替えで行っている。ただし、右ペインの編集コントロールは普通に`DIV`等のHTML語彙で描画されている。

テキストの編集を開始すると、自動的にText要素は分割される。つまり、 `contenteditable` 的な意味で編集しているオブジェクトは常に空か、IME的なpreeditの内容だけということになる。リガチャ等は欧文固有の事情で、欧文ではキータイプ毎に変更が即反映されるのでこのデザインによって見た目が損われることは無い。(Zapfinoのような大きなフォントで f とか fi を入力してみるとわかりやすい。内部的には ﬁ のようなUnicode合字に自動的にcomposeされる。)

![SnapCrab_NoName_2018-9-24_19-54-9_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/67446/e8fc54ad-e56d-9aef-f6e0-07b126258731.png)

通信には1分ものlong pollingが有る。用途は謎。
Istio入門：既存のGKE上アプリケーションにIstioを導入するまでの流れ　その２

今回は、[前回のIstio記事](https://qiita.com/mihirat/items/c2a7e426f845031c360c)の構成について思っていた疑問点を、GoogleNextにせっかく参加したので聞いてみましたという記事です。

### 前回構成の疑問点
前回の構成図は下記のようなものでした。

![istio-blog 1.png](https://qiita-image-store.s3.amazonaws.com/0/100059/372fd984-58f5-a629-48f6-c12c2ef5269c.png)

これにて一見落着っぽいのですが、
ふと「あれ、これマルチクラスタとかできないのでは？」

Regional IPをそのまま　istio-ingressgatewayのserviceに紐づけてしまったので、
Istioを使うためにはマルチクラスタ構成ができないのか…？GCLB使いたいときは…？

これが疑問点でした。

### The Expert Response
Ask the Expertブースにはかの有名なイアン氏がいたので（日本語ペラペラ）、聞いてみました。
Istioはあまり把握していないとのことだったのですが、
「istio-ingressgatewayもserviceなのだから、LoadBalancerIPでexposeするのでなく、NodePortで公開してしまって、GCLBからはGKEのinstance groupに対してトラフィックを流せばいいのでは？」とのこと。
ズバリ下記構成です(podは省略)。

![stio-blog 2.png](https://qiita-image-store.s3.amazonaws.com/0/100059/be0bc7f8-4768-62f4-30aa-ca095904e7bd.png)


た、たしかに。
Istioの公式にも、istio-ingressgatewayをそのまま公開すべし、といった話はなく、NodePort使う場合には？みたいな説明もありました。
https://istio.io/docs/tasks/traffic-management/ingress/#determining-the-ingress-ip-and-ports-when-using-a-node-port

まだ試してませんが、こうすればGlobal IPも使えるし、マルチクラスタもできそうです。
どのみち既存構成からダウンタイムなしでIstio化することはなかなか難しそうではあります。


この記事は[元記事](http://techeten.xyz/10322)の転載です。
VPS上のLinuxでVS CodeをX Windowで動かしてみた



勉強会やキャンプ中にスマホのギガを消耗せずに、`npm install`とか`vagrant up`とかしたかったのでやってみました。
あと、WindowsタブレットとかでネイティブLinuxで開発できたらなぁとも思って。

結論から言うと、めっちゃ動作が遅かったです。


## 環境
Conohaの512MBプラン+Debian9

## 構築

### とりあえずユーザーを作る
vscodeはrootユーザーだと怒られるので、ユーザーを作って公開鍵認証できるところまで

```sh
# adduser <user名>
# su - <user名>
$ mkdir .ssh
$ cd .ssh
$ nano authorized_keys # ← 自分の公開鍵を書き込む
$ chmod 600 authorized_keys
$ cd ../
$ chmod 700 .ssh
$ exit
```

### X Serverを入れる
```sh
# apt-get -y install xserver-xorg
```

### 日本語化する
日本語対応しておかないと、vscodeに日本語拡張入れた時に豆腐まみれになります

```sh
# apt -y install task-japanese locales-all
# localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" 
# source /etc/default/locale
```

### VS Codeを入れる
リンクやファイル名は、記事を書いた時のバージョンです
詳しやり方は[ここ](https://code.visualstudio.com/docs/setup/linux)見てください。

```sh
# apt install -y libxss1 libgtk2.0-0 libasound2
# cd /tmp
# wget https://az764295.vo.msecnd.net/stable/f46c4c469d6e6d8c46f268d1553c5dc4b475840f/code_1.27.2-1536736588_amd64.deb
# dpkg -i code_1.27.2-1536736588_amd64.deb
# apt-get install -f
```
### クライアントからX Window試す
クライアントPCからServer上のVS Codeが動くか試します

```sh
client:$ ssh -X <user名>@<ホスト>
server:$ code .
```
## 感想
冒頭にも書いたように、動作がもっさりしてます。ネットワーク的な問題だと思うので、どうしよもない感じですね。
あと、このままではまだ日本語入力はできませんが、今回は「どのくらい使えるか」をやってみたかったので、試してません。

## 参考
[Visual Studio Code on Linux](https://code.visualstudio.com/docs/setup/linux)
[日本語環境にする](https://www.server-world.info/query?os=Debian_9&p=japanese)
本(書籍)について考えさせられた、2018年夏

# **0．はじめに**
猛暑続きだった2018年夏も終わり、秋らしくなっている今日この頃ですが、この夏、本(書籍)について考えさせられた、2つの出来事があり、以下に紹介したいと思います。

# **1．「これから先も・・・書籍が果たせる役割は相当に大きい」**
我々IT業界の人間は、趣味以外で本(書籍)を読むことってあるのでしょうか？何かのスキルを身につけるのに、書物とマジマジと向き合うというよりは、実際にディスプレイと向き合ってソースコードを書いたり、マシン環境に入って設定をいじったりすることによって、理解することのほうが多いと思います。また、何かを調べたいときにも本を読むというよりは、Google先生に聞いてそこから導き出されたWebサイトを閲覧することの方が主流ではないかと思います。

この夏から学習し始めたPythonの本「[Pythonスタートブック](https://www.amazon.co.jp/Python%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-%E8%BE%BB-%E7%9C%9F%E5%90%BE/dp/4774142298)」の冒頭に、こんなことが書かれていました。

> 本書を書きながら気付いたことは、書籍の中の日本語とWebの中のそれとは質が違うという事実です。Webにあふれる言葉が（中略）、その多くは軽い気持ちで書かれた文章です。こうした文章は読み流すときには楽ですが、何かを理解しようとするときには力不足です。

と、Webの欠点を述べたうえで、

> 書籍の中の文章は、全体の構成から検討し、何度も読み返し、言い回しや説明の順番を最適化します。

と、書籍化するプロセスにおいて構成や文章が洗練された形となることを強調し、最後に、

> これから先も時代は変わっていくでしょうが、読んで何かを理解するという場面で、書籍が果たせる役割は大きい

と結論づけています。まさに真理を突いているなと思うと同時に、Webにしばしば投稿している筆者も反省しなければいけないと思いました。

現在、AIやフィンテック、IoT、AWSにdocker等、新しい技術や製品が次々と登場しています。今後もどんどん出てくるでしょう。その中でWebを参照することによってある程度の理解はできるかもしれません。他方、個々の要素がどうつながっているのかを整理された形で理解するにはWebだけだと苦しいと思います。そういった中で、体系化された知識を提供する点で本(書籍)は今後も役立つ存在になるだろうし、存在にならなければいけないのだろうと考えました。


# **2．「本は2回以上、読まないと分からない」**
筆者は[日経ビジネス](https://www.nikkeibpm.co.jp/item/nb/661/index.html)を定期購読しているのですが、[2018年7月30日号](https://business.nikkeibp.co.jp/atcl/NBD/15/223710/071900175/?ST=pc)のコラム「有訓無訓」の内容に非常に感銘を受けました。詳細な内容はここでは敢えて触れませんが、ポイントとしては、

- 最初の読書は、自分の先入観等が入り、書いてあることを確認するだけにとどまってしまう。
- 本質的な意味を知るのは2回目の読書から。

のとおりです。そして同コラムでは、本を二度読むことによって発見が得られたという、幾つかのエピソードが紹介されたのち、「ある本を最初に読むのはもう一度読むための準備作業、あるいはその誘いである」と述べられています。

「本は2回以上、読まないと分からない」を聞いて「ああ。自分もそんな経験あるな」という方もいらっしゃるのではないかと思います。筆者もその1人です。IT業界に入りたての頃、[矢沢久雄著／日経ソフトウェア監修『プログラムはなぜ動くのか～知っておきたいプログラムの基礎知識～』　日経BP社](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2%E4%B9%85%E9%9B%84/dp/4822283151)
と[矢沢久雄著／日経ソフトウェア監修『コンピュータはなぜ動くのか～知っておきたいハードウエア＆ソフトウエアの基礎知識～』　日経BP社](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B%EF%BD%9E%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A8%E3%82%A2%EF%BC%86%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A8%E3%82%A2%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%EF%BD%9E-%E7%9F%A2%E6%B2%A2-%E4%B9%85%E9%9B%84/dp/4822281655)
を読んだのですが、当時はぼんやりとした理解しかしていなかったことが、今年に入って再度読み出したら結構理解できたりして、知識・経験を積むことによって見方の幅が広がり、結果深い理解につながったものと思います。小さいころ何気なく聞いていた曲の歌詞も大人になってもう一度その音楽を聞いてみると歌詞の意味がわかる、という経験と似たような感じかもしれません。

もし機会があれば過去読んだ本をもう一度手に取って読んでみるとよいかもしれません。違う発見があるかもしれません。

# **0．おわりに**
以上、この夏、本(書籍)について考えさせられた、2つの出来事を紹介しました。2．について完全に余談ですが、この夏『SLAM DUNK』を読んだのですが、なぜ『桜木花道』が天才なのかがわかる気がしました。なお『桜木花道』は筆者のこれまでの投稿で何回か登場します。ぜひ探してみてください。
JavaScriptでよく使う関数集

#概要
- よくつかう関数の自分用メモです。随時追記します。
- jQueryに依存している個所があります。
- 基本、オレオレスクリプトが多数ですので生温かくご覧ください。

##関数の一覧（随時更新）
- デバッグ用コンソール表示
- URL引数を取得
- 時刻表示
- ゼロサプライ２桁固定
- ディープコピー
- ランダム配列を作成
- ボタン処理
- リサイズ時処理

#コード

```javascript
//デバッグ用コンソール表示
var debug = true;
function _c_(str){
  if(debug && console){
    console.log(str);
  }
}

//URL引数を取得
//メモ：クロスサイトスクリプティング対策なし
var arg;
function getParams(){
  arg = new Object;
  pair = location.search.substring(1).split('&');
  for(var i=0;pair[i];i++) {
    var kv = pair[i].split('=');
    arg[kv[0]]=kv[1];
  }
}

//時刻表示　※zeroSupが必要です。
//73.234 → 01:13
function timeView(_num){
	var num = Math.floor(_num);
	var out = '';
	var min = Math.floor(num/60);
	var sec = Math.floor(num%60);
	return zeroSup(min)+':'+zeroSup(sec);
}

//ゼロサプライ（ゼロパディング）２桁固定
// 3 → 03　12 → 12
function zeroSup(_num){
	var out = '';
	if(_num < 10){
		out = '0' + String(_num);
	}else{
		out = String(_num);
	}
	return out;
}

//ディープコピー
//メモ：Date型は非対応。その他も問題あるらしいが想定外のデータが入らなければこれで十分
function clone(obj){
  return JSON.parse(JSON.stringify(obj));
}

//ランダム配列を作成
//0～(total-1)までの配列からnum個の数値をピックアップした配列を作成する
function randArr(num,total){
	var cnt,randnum;
	var base = [];
	var out = [];
	//base配列作成
	for(cnt=0;cnt<total;cnt++){
		base.push(cnt);
	}
	while(out.length!=num){
		//ランダムに１つピックアップしoutに追加、baseから削除
		randnum = Math.floor(Math.random()*base.length);
		out.push(base[randnum]);
		base.splice(randnum,1);
	}
	return out;
}

//ボタン処理
//DOM読み込み完了時に初期化する
function btn_click(){
  var btnid = $(this).attr('id');
  //ボタンのidで処理を分ける
  switch(btnid){
    case 'btn-A':
      //btn-Aの処理
    break;
    case 'btn-B':
      //btn-Bの処理
    break;
  }
}

//DOM読み込み完了時処理
$(document).ready(function(){
  //ボタンの設定初期化（.containerの中にある.btnすべてに適用する）
  //clickイベントでスマホのタッチイベントも動作する。
  //以前はclickイベントは遅延があるといわれていたが、最近ない気がする（未検証）
  $('.container').on('click','.btn', btn_click);
  
});

//リサイズ時処理
function resized(){
	// do something
}

//リサイズ時処理のセット
//モバイル端末で端末の回転時も処理をする場合は、orientationchange を追加する
$(window).on('resize', resized);

```

##参考
JavaScriptでURLパラメーターを取得し配列に格納しておく
https://qiita.com/tonkatu_tanaka/items/99d167ded9330dbc4019
[JavaScript]色々なディープコピー
https://qiita.com/knhr__/items/d7de463bf9013d5d3dc0
JavaScriptの配列の使い方まとめ。要素の追加,結合,取得,削除。
https://qiita.com/takeharu/items/d75f96f81ff83680013f

##追加
- 2018.10.11　ランダム配列生成
- 2018.10.24　時刻表示、ゼロサプライ、リサイズ時処理

##今後追加予定
- ~~ゼロサプライ~~
- 数値の三桁カンマ
- csv読み込み（Papaparse）
- 時間差計算
- 文字数カウンタ
- ~~リサイズ時処理~~
Vector形式できれいな資料づくり

普段からBeamerでVector型(EPS, PDF, SVGなど)の資料づくりを目指している. 
Vector型は, どれだけ拡大してもボケないという特徴を持つ形式である. 
その際によく使う方法やツールを紹介する. 

# PDFからPDF形式で図を取り出す
PDFから図を取り出したい時, 「Prt Scr」で画面をキャプチャすると, 拡大した際に図がボケてしまう. 
図をきれいに切り出すには, Vector形式で切り出す必要がある. 
Windowsでは, 以下のような手順で行うことができる. 

1. [Adobe Acrobat Reader](https://get.adobe.com/jp/reader/)で対象のPDFを開く
2. `編集`→`スナップショット`を選択
3. 切り取りたい箇所を選択
4. `Ctrl+P`(印刷)で, プリンターに**Microsoft Print to PDF**や**[CubePDF](https://www.cube-soft.jp/cubepdf/index.php)**などPDFへの変換が可能なプリンターを選択し, 印刷 (PDFへ変換)する

なお, 4.で`PDFのページサイズに合わせて用紙を選択 (Z)`にチェックを入れれば,  自動的に選択範囲に合ったページサイズのPDFが作成される. 

選択範囲に厳密に切り出したいときは, `必要な場合にカスタム用紙サイズを使用`にもチェックをいれるとよい. 

文字を文字として認識するCubePDFがオススメ. 

CubePDFで図が回転してしまう場合, AdobeReaderで印刷を確定した後, CubePDFの「詳細設定」から, `ページの向き: 横`を選ぶことで解消される

# Libre Office Drawでできること
[Libre Office Draw](https://ja.libreoffice.org/)を使うと以下のことが可能となる. 

- PDFを編集する
- PDFやEPSを作成する
- TexMathsでLaTeXコマンドが使える

※Libreofficeのアイコンがバグるときは, `ツール`->`オプション`->`表示`->`アイコンのスタイル`を変更するとよい. 

## PDFの編集
あまり知られていないと思う機能. 
`Ctrl+O`(開く)でpdfを選択すると, 普通に編集ができる. 
(注意) DrawにドラッグアンドドロップしてもVector型で貼り付かない. 

たとえば, PythonやMatlabのプロットで, 後から色を変えたいとか, フォントサイズを大きくしたいとかなったときに便利. 

## PDFやEPSの作成
Drawで図を作成後, 出力したい範囲を選択して, `ファイル`→`エクスポート`から, **EPS**を選択し, `選択範囲`にチェックをいれて保存すればよい. 
圧縮形式は, `LZWエンコード`にしておくとよい. 

(注意) PDFで出力する場合, `選択範囲`にチェックを入れても, 保存される大きさは, 作成したページのサイズに依存するため, 余白が大きくなってしまうことがある. 

これを解決するには, ページサイズを直接変えれば良い. 
非常に気づきにくいところにある. 
<img width="190" alt="page.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/d37a4834-583b-9274-447d-b21304920628.png">

自分は基本的にEPSを使うようにしているが, EPSで表現しきれない情報 (透過色, 縦書き文字列など)を含む場合はPDFを使うようにしている. 

## LaTeXコマンドを使う
作成する図に$\LaTeX$数式を打ちたいことがあるだろう. 
プラグイン[TexMaths](http://roland65.free.fr/texmaths/)を使うとそれが可能になる. 
Downloadしてきて, 開くだけでインストールは簡単にできる. 
<img width="89" alt="texmaths.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/7084c2cf-f05c-c572-620d-eeba1b46d8c7.png">
`ファイル`のすぐ下にできる$\pi$アイコンから数式作成が可能. 
<img width="537" alt="texmaths.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/9219065d-8153-25fb-d2f8-f8b784137a0c.png">
そのままいつもどおり数式を打てば良い. 

- `Image Format`は, `svg`必須. 
- `Transparency`にチェックを入れることで, 白い部分が透過する
- `Preamble`からは, $\LaTeX$で使うパッケージ(usepackage)の追加が可能 

#Adobe Readerの注釈やコメントをPDFに埋め込む
Adobe Readerの注釈機能で, コメントや色付けしてもBeamerにincludegraphicsすると表示されない. 
それを解決するには, CubePDFでPDFとして出力(印刷)すればよい. 

#PowerPointにVector型を貼る
PowerPointには, PDFやEPS, SVGが貼れない. 
WMF (Windowsメタファイル)なら貼れる. 
LibreOfficeから, WMFで図を出力して貼ろう. 
WMFで出力するとフォントが変になることがある. 
代わりのフォントとして, `MS UI Gothic`がおすすめ. 

# PDF余白削除
texliveを入れると, `pdfcrop`というコマンドが使えるようになる. 
`pdfcrop ファイル名`とすれば, 余白を切り取れる. 

# PDF・EPS・PS変換
texliveを入れると, 下記のコマンドで変換が可能になる. 
`コマンド名 ファイル名`でOK. 

- epstopdf
   - epsからpdfへ
- pdftops, pdf2ps
   - pdfからpsへ
- ps2pdf
   - psからpdfへ

# PDFフォント確認
これもtexliveについてくる: `pdffonts ファイル.pdf`

# 数式画像からLaTeXコマンドへ
[Convert images to LaTeX](https://mathpix.com/)が使える. 

#まとめ

- Adobe Reader + CubePDFでPDFの切り出しが可能
- Libre Office Draw + TexMathsできれいな図が作成できる

論文にはキレイな図を貼ろう.
Rubyの配列を繰り返し処理で取り出す①

# Rubyの配列を繰り返し処理で取り出す
今まで配列の取り出し方はEachで行なっていましたが、forでも同様の処理ができるのでメモ。

Eachで取り出す

```ruby:sample.rb
arrays = ["hoge", "huga"]
arrays.each do |array|
   puts array
end
```
Forで取りだす

```ruby:sample.rb
arrays = ["hoge", "huga"]
for array in arrays
   puts array
end
```

出力結果は同じです。
JavaScriptの記号一覧

JavaScriptのコードを見ていた時、知らない記号がありました。
記号を検索しようとしても、できませんでした。
そこで、記号について、ここに一覧にしてまとめておこうと思いました。
#記号一覧
記号|意味
:-:|:-:
+|整数に変換
+|加算
+=|加算代入
++|インクリメント
-|正負の反転
-|減算
-=|減算代入
--|デクリメント
*|乗算
*|ジェネレータ関数
*=|乗算代入
**|べき乗
/|除算
/=|除算代入
//|コメント
/\*_hoge_\*/|コメント
/_abc_/|正規表現
%|剰余
%=|剰余代入
=|代入
~|ビット否定
&|ビット論理積
&=|ビット論理積代入
&&|論理積
&#x7c;|ビット論理和
&#x7c;=|ビット論理和代入
&#x7c;&#x7c;|論理和
^|ビット排他的論理和
^=|ビット排他的論理和代入
..._obj_|式を複数の引数または複数の要素に展開
==|等値
=>|アロー関数
===|同値
!|論理否定
!=|不等値
!==|非同値
<|小なり
<=|以下
<<|ビット左シフト
<<=|ビット左シフト代入
>|大なり
>=|以上
>>|ビット右シフト
>>=|ビット右シフト代入
>>>|ビット符号なし右シフト
>>>=|ビット符号なし右シフト代入
'|文字列
"|文字列
`|テンプレート文字列
\|複数行の文字列の定義
()|グループ化
()|関数のパラメータ
[]|配列の作成・配列の要素の取得
[_a_, _b_] = [_1, 2_]|分割代入
{}|オブジェクトの作成・オブジェクトのプロパティの取得
{}|ブロック文
{_a_, _b_} = {_a_:_1_, _b_:_2_}|分割代入
?|三項演算子
:|三項演算子
:|ラベル
;|文の終わり
,|単一の文で評価し、最後の式の結果を返す
.|オブジェクトのプロパティ
#参考

 * [式と演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators)
 * [JavaScriptを読んでて「なにこれ！？」と思うけれど調べられない記法8選。 - Qiita](https://qiita.com/ukiuni@github/items/5f3d8620187905aea3d4)
UIViewやUIButtonに影をつける

# はじめに
アプリを作っていてUIViewをベタ張りするととても見辛かったのでGoogleMapsを参考にViewに
影をつける方法をまとめます．
![IMG_3844.PNG](https://qiita-image-store.s3.amazonaws.com/0/195267/6e2408b7-222e-5edb-0325-9d24623deb52.png)
![IMG_3848.PNG](https://qiita-image-store.s3.amazonaws.com/0/195267/7a9a90bd-3e04-c53c-96b1-b0b1695112e6.png)

# ソースコード
``` CALayerEx.swift
import Foundation
import UIKit

public extension CALayer {
    enum Direction {
        case top
        case bottom
    }
    
    public func addShadow(direction: Direction){
        switch direction {
        case .top:
            self.shadowOffset = CGSize(width: 0.0, height: -1)
        case .bottom:
            self.shadowOffset = CGSize(width: 0.0, height: 1)
        }
        self.shadowRadius = 1.5
        self.shadowColor = UIColor.black
        self.shadowOpacity = 0.5
    }
}
```
コードはとても簡単で、色々な場面で使えるのでExtensionに入れました．
これをこんな感じで使えば影がついてみやすくなります．
topにすると下から光が当たる感じになって上辺に影がつきます．
なおshadowRadiusやshadowColor,shadowOpacityは各々で統一したい値に変更するといいです．

``` 

        self.menuBarView.layer.addShadow(direction: .bottom)
```

![IMG_3846.PNG](https://qiita-image-store.s3.amazonaws.com/0/195267/c34b39a4-61d8-b1c2-c55c-49edcf6e9c78.png)

# 最後に
他の人の記事を見るとこの処理は重いと言われているのをみたのですが検証していないのでわかりません、すみません．
UniRxを使ってキーボードの入力を受け取るサンプルプログラム

UniRxの使い方がやってわかってきたのでメモ。

個人で親指シフトの練習ソフト(WEBGL)を作っているが、
キーボードからの入力を楽に実装できないか検討した。

その結果、UniRxを使ったほうが楽に実装できることがわかった。

#キーボードからの入力を取得するサンプルプログラム

以下の４行のみの実装でキーボードからの文字を取得できます。

```
//キーボードからの入力を取得する
var keyStream = Observable.EveryUpdate()
.Select(_ => Input.inputString) 
.Where(xs => Input.anyKeyDown)
.Subscribe(xs=> Debug.Log(xs));
```

UniRxは、慣れるまでそれなりに時間かかりますが、使えると開発工数が減るので幸せになれますね！
RubyのArrayクラスで使えるメソッド①

# RubyのArrayクラスに使うメソッド　①

Railsをなんとなく書いて、なんとなくアプリケーションを作って、なんとなくAWSでデプロイができたが、プログラミング問題がろくに解けなかったので一から基本を固めるべく少しづつメモ

### よく使いそうなArrayメソッド
    - array.push("hoge") #配列の一番後ろに要素を加える
    - array << "hoge"    #配列の一番後ろに要素を加える
    - array.delete_at(インデクス番号) #指定した番号を削除
    - array.length       #配列に格納されてある要素の数を返す
    - array[インデックス番号] = "hoge" #指定した番号の要素を更新する

よし、頑張ろう。
リーダブルコード要約

###概要
全体の内容をさっと把握したい時などに、お使い下さい。
##リーダブルコードとは
表紙には以下のように記載されています。
***より良いコードを書くためのシンプルで実戦的なテクニック　***

##1章　理解しやすいコード
* コードは理解しやすくなくてはならない
* コードは他人が最短時間で理解できるようにかかなければならない

##2章　名前に情報をつめこむ
* 明確な単語を選ぶ 
 * `不明確なget~等は非推奨`
* tmpなどの汎用的な名前は避ける
 * `意味があるときは別`
* 具体的な名前を使って物事を詳細に説明する
* 変数名のフォーマットで情報を伝える
 * `ミリ秒の場合は _ms`
* スコープの大きな変数には長い名前を付ける
* `逆にスコープが小さいときは短い名前`
* 大文字やアンダースコアに意味を付与する

##3章　誤解されない名前

* 名前が「他の意味と間違われることはないだろうか」と自問自答する
* 最善の名前は誤解されない名前である
* 単語に対するユーザーの期待に合わせる
* **get()やsize()は軽量なメソッドが期待されている**

### 悪い例

 **filter()**
選択するor除外する

**Clip(text, length)**
文字を切り詰めるor最後から文字を削除する
単位も複数考えられる

**bool値の名前**
否定的な名前はつけないよう注意
bool disable_ssl = false;

### 良い例

**限界値を明確にする**
名前の前に「_min」・「_max」を付ける

**範囲を指定する**
firstとlastを用いる

**包含/排他的範囲の場合**
beginとendを用いる

**bool値の名前**
頭にis/has/can/shouldをつける
否定形よりも肯定形で書く
bool use_ssl = true;

##4章　美しさ

* 優れたコードは「目に優しい」
* **余白・配置・順序**に気を使う
* 読み手がなれているパターンと一貫性のあるレイアウトを使う
* 似ているコードは似ているようにみせる
* 関連するコードをまとめてブロックにする
* コードの「列」を整形すれば、概要が把握しやすくなる
* 意味のある順番を選んで、常にその順番を選ぶ
* 空行を使って大きなブロックを論理的な「段落」をつける

##5章　コメントすべきことを知る

* コメントの目的とは、コードの意図を読み手に理解してもらう事
* コメントすべきでは「ない」こと
	* コードからすぐに抽出できること
	* ひどいコードを補う「補助的コメント」→コメントではなくソースを修正すべき
* 記録すべき自分の考え
	* なぜコードが他のやり方ではなくこうなっているのか
	* コードの欠陥をTODO等の気泡を使って示す
	* 定数にまつわる背景
* 読み手の立場になって考える
	* 読み手が「えっ？」と思うところを予想してコメントを書く
	* ファイルやクラスには「全体像」をコメントする
	* コードブロックにコメントを付けて概要をまとめる
* ライターズブロックを乗り越える
 * 以下、手順
 * 頭の中にあるコメントをとにかく書き出す
 * コメントを読んで改善が必要な部分を書き出す
 * 改善する

##6章　コメントは正確で簡潔に

* コメントの質をあげるために
* 曖昧な代名詞「これ」などは使わない
* 関数の動作はできるだけ正確に説明する
* コメントに含める入出力の実例は慎重に選ぶ
* よくわからない引数にはインラインコメントを使う
* 多くの意味が詰め込まれた言葉や表現を使ってコメントを簡潔に保つ

##7章　制御フローを読みやすくする

* 条件やループなどの制御フローはできるだけ「自然」に
* 条件式の引数並び順

```
例1：
if(length > 10)
例2：
if(10 < length)
```
* 例1の方が読みやすい
**左側：調査対象の式、変化する。右側：比較対象の式、変化しない**

* if/else文のブロックの並び順
	* 肯定形・単純・目立つものを先に処理する
* 非推奨な要素
	* 三項演算子(aa?bb:cc)
	* do/whileループ
	* goto
* ネストを浅くする
	* 失敗する場合を出来るだけ早めに関数から返せばよい
	* ループ内部のネストを削除する
      * `continue`を用いる
	* 関数の上部で単純な条件を先に処理しておく

##8章　巨大な式を分割する

* 説明変数
   * 式を簡単に分割するには、式を表わす変数を使う
* 要約変数
   * 式を説明しなくても複数回使用する際は、小さい名前に置き換えておく
* ド・モルガンの法則をつかう
* コードの主要な「概念」を読み手が認識しやすくする

##9章　変数と読みやすさ

* 変数を適当に使うとプログラムが理解しにくくなる
   * 変数が多いと追跡が難しくなる
   * スコープが大きいと、スコープを把握する時間が長くなる
   * 頻繁に変更されると現在ではの値を把握するのが難しくなる
* 対応策
  * 邪魔な変数を削除する
     * `中間結果などは不要`
  * できるだけ小さいスコープとする
     * `変数のことがみえる行数を減らす`
  * 1度だけ書きこむ変数を使う
     * `constやfinalなど`

##１０章　無関係の下位問題を抽出する

* プログラム固有のコードから凡用コードを分離する
    * ほとんどのコードは凡用化できる
    * しかし、やりすぎは注意して

##１１章　一度に1つの事を

* コードは1つずつタスクを行うようにしなければならない
   * 「関数は1度に1つの事しかしてはいけない」のアドバイスと似ている内容
* 読みにくいコードがあれば、そこで行われているタスクを全て列挙し、全体像をみよう

##１2章　コードに思いを込める
* 簡単な言葉で説明する
* ラバーダッキングしてみよう

##１3章　短いコードを書く
* できるだけコードを書かない
   * 不必要な機能をプロダクトから削除する。過剰な機能は持たせない
   * 最も簡単に問題を解決できるような要求を考える
   * 定期的にAPIを読んで、標準ライブラリに慣れておく

##１4章　テストと読みやすさ

***テストとはテストコードのこと***

* 他のプログラマが安心してテストの追加や変更ができるようにテストコードを読みやすくする
    * できるだけ簡潔に
    * 失敗したらわかりやすいエラーメッセージを
    * 単純な入力値を使う
    * テストに説明的な名前をつけて何をテストしているのかわかりやすくする

##感想

* 自分がレビューする際に、上記の内容を確認し、指摘するよう心掛ける
* 自分がレビューしてもらう際は、上記の内容を指摘されないように心掛ける

リーダブルコード
http://www.oreilly.co.jp/books/9784873115658/
Windows10でLaravelを始めるために役立つURL、メモ、知識など

初投稿です。
laravelでアプリケーションを作ってみようと思い、その過程で学んだことをevernoteに書き溜めているのですが、どこかの誰かの役に立つかもしれないと思って公開することにしました。
現在進行形でLaravel学習中なので、この内容もどんどん修正していきます。

PHPやGitHub自体のメモもごちゃまぜになっちゃっているので、
そのうち整理します。

##laravelのインストールなど（Windows10前提）
・https://satouyousuke.hatenablog.com/entry/2017/08/17/161224
・https://qiita.com/maruyama42/items/43d7029d7e00e587bf0b
・https://sekaiokaeru.com/tips/install-composer

##XAMPPとSkypeが競合して起動できない
Skypeで使用するポート番号を変更して解決する。
XAMPPで使用するポート番号を変更しても解決するみたいだが、慣れないうちはXAMPP側はあまりいじらないほうがいいと思う。
https://web-generalist.com/skype-port-off/

##Laravelアプリケーションガイド
ここに記載されているアプリケーションをまず作っています。
https://qiita.com/Fendo181/items/dece727ea402552fee19

##Laravel artisan
https://qiita.com/zaburo/items/37768b743ed6d0e28bf5

##【知識：PHP】
リファレンス（仕様書）
http://php.net/manual/ja/langref.php
PHPは型を省略できる。もしくは、型定義自体ができない？
http://php.net/manual/ja/language.types.type-juggling.php
PHP7からは、boolean/string/integer/float型の指定が可能になっているらしく、
戻り値や、引数に型を指定できるようになっている。
https://qiita.com/bokotomo/items/1ead446ef689dc45b487

##【知識：GitHub】
git push origin masterの意味
https://qiita.com/hshimo/items/99811144bf4a081319e5


コミットの流れ
```
$ git add .
$ git status
$ git comiit
$ git push
```

https://qiita.com/konweb/items/621722f67fdd8f86a017
https://techacademy.jp/magazine/10172

##【知識：データベース】
https://readouble.com/laravel/5.0/ja/schema.html

```
Schema::create(
    'users',
    function($table) {
    $table->increments('id')
    });
```

Schema::create：テーブル作成に使用するメソッド
'users'：テーブル名
fucntion($table)・・・：無名関数。引数はblueprint型。
$table->increments：自動増分を付与した主キーの作成。「id」に指定するのは慣例？
http://php.net/manual/ja/functions.anonymous.php
incrementesを含むSchemaで使用できる型は下記に記載
https://www.ritolab.com/entry/25

無名関数の中身は、作成・変更したいカラムのデータ型によって変わる？
http://laraweb.net/practice/1301/
マイグレーション：その他
https://readouble.com/laravel/5.5/ja/migrations.html
Selenium のサンプル 予約フォーム (Golang)

GoogleChrome で予約フォームに入力するサンプルです。

```go:reserve_form_chrome.go
// ---------------------------------------------------------------
//
//	reserve_form_chrome.go
//
//					Sep/24/2018
// ---------------------------------------------------------------
package main

import (
	"github.com/sclevine/agouti"
	"fmt"
	"os"
	"log"
)

// ---------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")

	driver := agouti.ChromeDriver()
	driver.Start()
//	defer driver.Stop()
	page, _ := driver.NewPage()

	url := "http://example.selenium.jp/reserveApp/"
	page.Navigate(url)
	log.Printf(page.Title())

	tag := page.FindByID("reserve_month")
	tag.Clear()
	tag.SendKeys("11")

	tag = page.FindByID("reserve_day")
	tag.Clear()
	tag.SendKeys("10")

	tag = page.FindByID("reserve_term")
	tag.Clear()
	tag.SendKeys("3")

	tag = page.FindByID("headcount")
	tag.Clear()
	tag.SendKeys("2")

	str_select := "input[type='radio'][name='bf'][value='off']"
	item := page.Find(str_select)
	item.Click()

	str_select = "input[type='checkbox'][id='plan_b']"
	item = page.Find(str_select)
	item.Click()

	tag = page.FindByID("guestname")
	tag.Clear()
	tag.SendKeys("明智小五郎")

	tag = page.FindByID("goto_next")
	tag.Click()

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

```text:Makefile
reserve_form_chrome: reserve_form_chrome.go
	go build reserve_form_chrome.go
clean:
	rm -f reserve_form_chrome
```

コンパイル

```text
$ make
go build reserve_form_chrome.go
```

実行方法

```bash
export PATH=/opt/chromedriver:$PATH
./reserve_form_chrome
```
Phoenixを触ってみる その5

[前回](https://qiita.com/utonn/items/b0a256244b779438a25e) またいつかと言っていたPlugの話です。

# Plug

> Plugは、Webアプリケーション間で構成可能なモジュールの仕様です。

…とりあえずgoogle翻訳してみましたけど、良くわかりませんね。

とりあえずこんな理解をしておけば良さそうかと思ってます。

- Plug.Connという構造体を通じて処理を行う仕組み
- Plug.Connを受け取ってPlug.Connを返すという仕組みに則り、処理を組み合わせることが出来る
- ```plug HogePlug``` と書くことで順に実行される

仕組み的な話はいったん置いておきます。
…メタプログラミング勉強しないと。

## Function Plug

関数によるPlug。
これまでの例ではRouterに ```plug HogePlug``` を書いてたけど、Controllerにも書けます。

Controllerに書くことで、Controller内での共通処理のようなものが実装できるようです。

``` hello_controller.ex
defmodule HelloWeb.HelloController do
  use HelloWeb, :controller

  plug :checkAdmin

  def index(conn, _params) do
    render conn, "index.html"
  end

  def show(conn, %{"user" => messenger}) do
    render conn, "show.html", messenger: messenger
  end

  defp checkAdmin(%Plug.Conn{params: %{"messenger" => "admin"}} = conn, _) do
    render conn, "admin.html", messenger: "admin"
  end

  defp checkAdmin(conn, _) do
    conn
  end
end
```

この場合、index,showどちらへのアクセスであっても、
パラメータ"messenger"がadminであればadmin.htmlを表示します。

ガイドの方にもあるようにヘッダ追加したりとかってときに使うようですね。

## Module Plug

関数ではなく、モジュールとして定義されたPlug。
実際に使われるときの挙動は同じで、定義の仕方が違うだけです。

実装すべき関数は２つ

- init/1 引数はplug利用時に渡す。
- call/2 第1引数はPlug.Conn、第2引数はinit/1の返り値。Plug.Connを返します。

call/2に関してはFunctionPlugで作った関数と同じですね。
使い方はFunctionPlugとほぼ同じで、atomの代わりにモジュール自体を渡します。

``` hello_controller.ex
defmodule HelloWeb.MyPlug do
  import Plug.Conn

  def init(initOption) do
    initOption #これがcall/2の第2引数に渡る
  end

  def call(%Plug.Conn{params: %{"messenger" => "utonton"}} = conn, ops) do
    assign(conn, :hoge, "様") #Plug.Connの関数。値を引き回したいときに使うっぽい
  end

  def call(conn, ops) do
    assign(conn, :hoge, ops)
  end
end

defmodule HelloWeb.HelloController do
  use HelloWeb, :controller

  plug HelloWeb.MyPlug, "さん" #この"さん"がinit/1に渡る

  def show(conn, %{"messenger" => messenger}) when messenger=="utonton" do
    render conn, "special.html", messenger: messenger <> conn.assigns[:hoge]
  end

  def show(conn, %{"messenger" => messenger}) do
    render conn, "show.html", messenger: messenger <> conn.assigns[:hoge]
  end
end
```

それぞれの関数でどのように値が流れていくのかが分かるかと思います
※内容がPlugでやるようなことではないのは気にしないでください。

モジュールにすることで複数のControllerやRouterに適用することが出来るようになるのがメリットですかね。
基本的にはこっちでの実装がメインになる気がしています。

----

Plug自体はPhoenix独自のものではなく、elixirのものです。
そして、PhoenixのほとんどはPlugで出来ています。
一見RouterやEndpointなど色々な登場人物が出てくるPhoenixですが、実は全て同じ仕組み上にあると考えると、面白いですね。

ただ実装時には、どこでPlugを差し込むべきかは考える必要がありそうです。
RouterかControllerか、ある程度ルールを設けないとカオスが見えてきそう。
ASK CLI で自前のテンプレートからスキルを作成できるようにする

ASK CLIコマンドの`ask new --template <template-name>`オプションを使うと、https://github.com/alexa にあるスキルテンプレートを使ってスキルの作成を開始することができる。ただし、`--template <template-name>`で指定できるのは、 　https://s3.amazonaws.com/ask-cli/templates.json にリストされている https://github.com/alexa にアップされている英語のスキルのみ。

これを自作のスキルテンプレートからスキルの開発を開始できるようにしたい。

まず自前のスキルテンプレートをGiuHub.com上に置く。次に、独自のスキルテンプレートリストをS3に置くことで、自前のテンプレートからスキルを開発できるようにする。

以下の手順で行う。

## 1. テンプレートリストのサンプルをダウンロードする

　https://s3.amazonaws.com/ask-cli/templates.json

## 2. 中身を自分のGitHubリポジトリをポイントするように編集する


```jp-templates.json
{
    "Fact": {
        "gitUrl": "https://github.com/toshimin/skill-sample-nodejs-fact.git"
    },
    "Trivia": {
        "gitUrl": "https://github.com/toshimin/skill-sample-nodejs-trivia.git"
    },
    "Quiz Game": {
        "gitUrl": "https://github.com/toshimin/skill-sample-nodejs-quiz-game.git"
    },
    "Foodie": {
        "gitUrl": "https://github.com/toshimin/skill-sample-nodejs-the-foodie.git"
    }
}
```

## 3. jp-templates.json をS3などにアップロードして公開する

https://s3-ap-northeast-1.amazonaws.com/alexaskillsassets/jp-templates.json

## 4. ask コマンドでスキルを作成する

```
$ ask new --template Fact --url https://s3-ap-northeast-1.amazonaws.com/alexaskillsassets/jp-templates.json
```

これで自前で作ったテンプレートがGitHubから落ちてくる。
【Spring】複数のBeanをAutowiredする。（おまけ付き）



# こんなときに使える
コンテナに登録した複数(0~n個)のBeanを`@Autowired`して使いたいとき。

# 前提


MyServiceインターフェース（doSomethingが定義されている）を実装したクラスが2つ定義されコンテナに登録されてます。

``` java

@Component("myServiceImpl1")
public class MyServiceImpl1 implements MyService {

	@Override
	public void doSomething() {
		System.out.println("myServiceImpl1!!")
	}

}

@Component("myServiceImpl2")
public class MyServiceImpl2 implements MyService {

	@Override
	public void doSomething() {
		System.out.println("myServiceImpl2!!")
	}

}

```

使う側は、この2つを両方`@Autowired`して使いたい。しかし、普通に`@Autowired`すればBeanの重複エラーで怒られてしまいますし、`@Qualifier`を付けてこれらを一つずつ`@Autowired`するのはナンセンス(用件による)ですね。

``` java:ナンセンスなインジェクション例

@Qualifier("myServiceImpl1")
@Autowired
private MyService service1;

@Qualifier("myServiceImpl2")
@Autowired
private MyService service2;

```

# やり方

複数のBeanを`＠Autowired`するには、`@Autowired`する側でListクラスを使います。

``` java:MyServiceExecuter.java

@Autowired
private List<MyService> services;

public void execServices(){
	services.forEach(s -> s.doSomething());
}

```

``` :出力
myServiceImpl1!!
myServiceImpl2!!
```

# おまけ：List以外にも・・・
こうして見てみると、List以外にもジェネリクス使って色々できるクラスはありそうですね。

### Mapクラス

Mapクラスに`@Autowired`すると`KeyがBean名`、`ValueがBean`のMapが取得出来ます。

``` java
@Autowired
private Map<String,MyService> services;

public void printServices(){
	services.get("myServiceImpl1").doSomething();
	services.get("myServiceImpl2").doSomething();
}
```

``` :出力
myServiceImpl1!!
myServiceImpl2!!
```

### Optionalクラス

コンテナに対象Beanが登録されているか分からない。登録されるならそのBeanを使いたいし、無いならインジェクトしなくていいよ。という場合に

``` java
@Autowired(required=false)
private MyService service;
```
`required=false`と書くことで、`NoSuchBeanDefinitionException`が発生するのを回避できるのはご存知の方も多いと思います。が、null安全なコードを書きたいのなら、***Optionalを使えばいいじゃない。***

``` java
@Autowired
private Optional<MyService> service;
```
こう書けば@Autowiredに`required=false`が要りませんし、何よりnull安全です。

# まとめ

Spring DIは奥が深いですね。

サラッと検索した感じ情報載ってなかったのでまとめてみました。

環境↓

``` 
springBootVersion = '2.0.5.RELEASE'
```

【追記】
表現を変更しました。2018.09.24
Gatsby.jsで画像のインポートに失敗した時のメモ

# 現象
[このissue](https://github.com/gatsbyjs/gatsby/issues/5479)と同じ現象が出て、webpackが画像ファイルのインポートに失敗する。

エラーメッセージはこんな感じ（上記issueから抜粋）:

```
Loader D:\Personal\Projects\gatsby\myPage\node_modules\url\url.js?{"limit":10000,"name":"static/[name].[hash:8].[ext]"} didn'tstcss-loader!./src/layouts/index.module.css 6:61-111 return a function
```

# 対処法
`npm install url-loader`で解決する例もあるみたいですが、原因はnpmっぽいので、yarnでパッケージ入れ直した。

**直った。**

# 参考
npm: 5.8.0
yarn: 1.9.4

たぶんそのうち直る問題かもしれませんが、issueがまだopenなので一応。
HUMANOTE 初のオープンβをリリースしました


#HUMANOTE初のオープンβ版リリース
***小学生でも「自由な言葉で」「本格的な」論理プログラミング***
ができることをめざし

自然言語ベースの論理プログラミング言語である
**「中学＄Ｐｒｏｌｏｇ」**と
これが動作する自由文思考プログラミング環境
**「ＨＵＭＡＮＯＴＥ」**
という、約７年にわたって開発してきたものを

初のオープンβ版（日本語Ｗｉｎ１０の６４ビット用のみ）
として９月１３日に***リリース***しましたので、
以下からダウンロードし、お試し頂ければ幸いです。

[GitHubからダウンロード](https://github.com/keisukebecome/humanote_for_public/releases/tag/3.3.8.1b)

これらは、下記に示す**長所**と**主な機能**をもっております。
#◆長所◆
- ディープラーニングと異なり、論理であるため判断根拠や思考過程についての説明責任を果たすことが容易。
- 自然言語に許された本来の自由度（表記ゆれ、方言、外国語、新語、等）にしなやかに対応（相互変換）。 
- 子供達に構成要件（ＡＮＤ）や選択肢（ＯＲ） 、ＮＯＴ等の論理を自分の言葉で本格的に考える経験を提供。 
- おばあちゃんに「お茶の間から音声対話で世界を冒険する楽しみ」を提供。 
- 疲れたり、勉強不足だったりしても、最新の知識と独自の発想・価値観に沿ったアイディア合成が可能。 

#◆主な機能◆
- 変数つきの「言葉方程式」のパターンマッチングによる検索・三段論法・構成要件（ＡＮＤ）の統合
- 便利ないくつものＯＲ
    - 通常
    - 個数の閾値による
    - 重みの和の閾値による、・・・）
- 便利な３つのＮＯＴ
    - 証明不能
    - 該当する例がない
    - 科学的／道徳的に・・・であるべきでない
- デバッグ・検証機能
    - 根拠ツリー
    - 推論トレース
    - 差分質問
    - 重文質問
- 人格系
    - 前向き推論による提案
    - 後向き推論による解答
    - ２種類の自発的あいさつ構文
    - タイマーによる起動
    - 逆質問
    - 価値観の定義と価値観に沿ったアイディア自動合成
- 業務用／遊戯用アドベンチャーゲーム
    - マルチメディア制御
    - 音声認識
    - 音声合成
    - 手続的解釈
        - 四則演算
        - 文字列操作
        - 変数代入
- 高速化キャッシュ
- 汎用ＡＩ／汎用ＲＰＧに向けた論理サーフィンブラウザ 
    - ネット等最新知識の実行時取込（２種類） 
    - 文脈の本格的な管理できる
    - 半自動目視枝刈り

#◆標準的なＰｒｏｌｏｇとの主な違い◆
Prologの標準的な仕様のサブセットを、以下の観点で独自に拡張しています。

Ａ．自由な文型・語彙（自由文）で、事実や規則を記述
Ｂ．**（）**や**，**のない無境界のオープンなユニフィケーション
Ｃ．変数の束縛（探索）は、基本的に幅優先で無限ループを抑制
Ｄ．ネット等から最新知識（事実や規則）を動的に引用可能
Ｅ．強いＮＯＴ、各種ＯＲ、独自価値観の定義等が可能
Ｆ．主プログラムを動的に切替えて、文脈を再帰的に書換える

#β版のサンプルプログラム例題
##例題１（「１＿アイスクリーム.jpl」）
「は」を中心に推移律を適用可能に！
下の質問文「⇒？アイスクリームは＄Ｘ」の答えは２つ！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104680/6de373b5-54b4-a1c0-5d05-b292b0789adb.png)

##例題２（最新の別知識の動的引用）
例題１の「１＿アイスクリーム.jpl」を実行時にインライン取込
下の質問文「⇒？私が＄Ｘ」の答えは２つ！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104680/8518274d-f3fd-04d6-53c5-4ecc5f2376dc.png)

##例題３（無境界で解を再帰的に合成）
幅優先であり「深掘度」で答えの数が変わります
解の集合は「交通手段の順番」と「目的地」となります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104680/3aa6b832-49f7-811e-2b7f-af1868de023a.png)

##例題４（価値観を定義し比較可能に）
様々な独自の価値観を定義してアイディアを絞り込めます
価値観以外のものの程度も順位付けをすることができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104680/a6b98e40-3f21-d2fd-6ca1-d0ceab07dc7b.png)

##例題５（条件の範囲を積極的に否定）
ヤギが紙を食べるとしても、道徳に反するアイディアは禁止！
そんなとき、これが便利！科学に反するアイディアも排除！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104680/fdea3090-94d5-a3b9-fc39-acd2778a46a0.png)

##例題６（ＬｉｎｋｅｄＯｐｅｎＲＰＧ）
お茶の間から、おばあちゃん達を、世界中の冒険に誘います！
詳しくはダウンロードＺＩＰの中のＰＤＦファイルをご確認願います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104680/960aff4f-69c7-bb16-b978-5936ef09c9dc.png)

##汎用ＡＩへの我々のアプローチ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104680/7c73d444-85c5-c74d-d682-06f0ee49123c.png)

#今後も投稿していきます。宜しくお願いいたします。
[備忘録] Laravelにライブラリをインストールする方法について

# 概要

Laravel でライブラリのインストール方法を調べていたので、
そのやり方をノウハウとして自分用に残しておくことにする。


# 環境について

|    PHP    | Mac OS   | Laravel
|:------:|:--:|:--:|
|        7.1.16        |  Mac OS High Sierra (10.13.6)  |5.7.5 |

## 作業内容

- ライブラリの選定
- Composerでのインストール
- Config ファイルの編集

の３つの作業でライブラリをインストールできる。

## ライブラリの選定

今回は比較的ウェブ開発で使われやすいスクレイピング用のライブラリである  
[Goutte](https://github.com/dweidner/laravel-goutte)を元にして説明する。  
LaravelはComposer での操作を推奨しているのでComposerでインストールする  
 
## Composerでのインストール

おそらくプロジェクトファイル別にインストールしなければならない仕様だと思う。

Macのターミナルでプロジェクトのディレクトリに移動する。

```
$ cd <Laravelをインストールしたディレクトリ>
```

プロジェクトディレクトに移動したら次のコマンドを叩く

```
$ composer require weidner/goutte
```

## Config ファイルの編集

~~ライブラリをインストールしてもLaravelではそのまま使用できない。~~
(Laravelは5.4+だとAutoDiscoveryの機能があるみたいでインストール後はConfig ファイルの編集は必要ないそうです。操作でうまくインストールできていない場合は下の操作をすればよさそう。)
Laravelの設定は`config/app.php`(プロジェクト名が`Sample`であれば`Sample/config/app.php`といった具合)で行う。

```config/app.php
    'providers' => [
(以下略)
        /*
         * Laravel Framework Service Providers...
         */
        Weidner\Goutte\GoutteServiceProvider::class,

    ],

```

```config/app.php
    'aliases' => [
(以下略)
        'Goutte' => Weidner\Goutte\GoutteFacade::class,
    ],

```

これで Goutte が使えるようになりました。
Google Cloud Platform(GCP) 無料トライアルの開始方法

## 目的

- GCP無料トライアルの登録

## 前提

- Googleアカウントを所有していること
- クレジットカードまたはデビットカードを所有していること

## 内容

[GCP](https://console.cloud.google.com/getting-started)のスタートページへアクセスし無料トライアルに登録します｡
![001.png](https://qiita-image-store.s3.amazonaws.com/0/88753/6f35ce00-04ec-d65d-ba98-dfc8171f7f7d.png)
国を選択し､GCPに関する情報をメールで受け取るか選択します｡好みで選択してください｡
無料トライアル利用規約を確認し､｢はい｣を選択します｡
![002.png](https://qiita-image-store.s3.amazonaws.com/0/88753/1ff9d7ef-229b-a2e9-00bc-3b8e06c73feb.png)
アカウントの種類はビズネス(法人)/個人から選択します｡私は個人利用なので｢個人｣を選択しました｡
名前と住所を入力します｡
お支払いたいタイプは｢毎月の自動支払い｣から変更できませんでした｡他にどういった手段があるかは確認していません｡
![003.png](https://qiita-image-store.s3.amazonaws.com/0/88753/5feaed72-3c39-842d-adf9-b782f30d3751.png)
クレジットカードまたはデビットカードの情報を入力します｡登録したカードから請求は**自動で開始されません**､手動のアップグレードが必要なので安心してください｡
![004.png](https://qiita-image-store.s3.amazonaws.com/0/88753/51a6dd9f-69bf-b2ec-ff66-bff909c408f1.png)
GCP無料トライアルの登録が完了しました!
![005.png](https://qiita-image-store.s3.amazonaws.com/0/88753/810c8921-4400-dcfd-87d6-bc55f48b77b0.png)

## あとがき

Googleアカウントとクレジットカードさえあれば､数分で無料トライアルの開始が可能でした｡
無料トライアル利用規約に､```2.2 Customer may not use the Services to engage in mining cryptocurrency;```
と記載があり､マイニングは禁止されています｡違反しないようにご注意ください｡