OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Teamsで使える「分析と BI」アプリ一覧

#はじめに
Microsoft Teams はさまざまな外部サービスと接続することができます。
2019年12月時点では、約280種類のアプリを使うことができます。
今回はその中でも「分析と BI」のアプリをまとめてみました。
他のアプリについては近日公開予定です。(余裕があれば。笑)

##「分析と BI」アプリ一覧
###MindMeister
マインドマップを簡単に作成できるアプリです。
リアルタイムで共同でマインドマップを作成することができます。
プロジェクト管理で使ったり、ブレインストーミングを行ったりと、アイデア次第で使い方は様々です。
これを使えば新しいアイデアが生まれるかも？
https://www.mindmeister.com/ja

###Freehand by InVision
ホワイトボード上でスケッチやワイヤーフレームを作成できるアプリです。
Webサイトのワイヤーフレームやデザインを作成するのにちょうどいいアプリです。
共同で作業もできるので便利です。
https://support.invisionapp.com/hc/en-us/articles/360027579432-Freehand

###Mindomo
マインドマップやガントチャートを作成するアプリです。
メモを取るときにこのアプリを使えば効率よく覚えられるかもしれませんね。
https://www.mindomo.com/ja/

###MURAL
ホワイトボードに付箋を貼ったり、マインドマップを作成することができるアプリです。
MindMeisterやFreehandよりも付箋を使うことがメインとなっています。
https://mural.co/

###Miro (formerly RealtimeBoard)
DropboxやG Suiteなどと連携できるホワイトボードです。
ビデオ通話をしながらマインドマップを作成することもでき、様々なサービスと連携できるので作業効率の向上につながります。
無限に広がるホワイトボードを作成することもできる画期的なサービスです。
https://miro.com/

###MeetingRoomMap
会議室のフロアマップを登録することができます。
Teamsに連携すると、従業員がボットに会議室の空き情報を聞いたり予約したりすることができるようになります。
Outlookと連携もできるようです。
https://www.meetingroommap.net/

###+BI Collaboration
SharePointアドインかやPower BIから通知を受け取ることができます。

###Cloudbot for Azure
Azureのバックエンドサービスのレポートやアラートを受け取れるアプリです。
Azureのサービスを使用している運用チームはぜひ導入してもらいたいアプリです。

####Dynatrace Davis Assistant
DevOpsやIoTのモニタリングで使えるアプリです。
AzrueやAWS、GCPなどのアプリのモニタリングを行えます。
https://www.dynatrace.com/

###Google Analytics Insights
Google analyticsとGoogle AdsのアラートとレポートをTeams上で受け取れることができます。
Google analyticsを使っているのであれば、ぜひ連携してみてください。

###iObeya
http://iobeya.com/
Minecraftサーバを立てる

# はじめに
CentOS7にMinecraftサーバを立てる方法。おうちに余りがちなLinuxサーバを有効活用するためにやってみます。
基本的に[公式Wiki](https://minecraft.gamepedia.com/Tutorials/Setting_up_a_server)の手順に則ってすすめます。

# 前提環境
**サーバ構築先**

- CentOS
    - Linux release 7.5.1804
- メモリ 6GB

# 流れ
1. Javaをインストール
2. server.jarの配置
3. server.jarを起動

## Javaをインストール
Java（JDK）をインストールします。
Minecraft ServerはJREでも動くようですが、このサーバ上でJava開発もやるのでJDKを選択。

導入コマンドは簡単。
`yum install -y java-1.8.0-openjdk`

## server.jarの配置
完全に好みの問題ですが、こうしました。
<pre>
/opt
├── minecraft-server -> minecraft-server-1.15.1/
└── minecraft-server-1.15.1
    └── server.jar
</pre>

シンボリックリンクを張ったので、今後Minecraft Serverのバージョンを上げても起動スクリプトなどに記載したパスを書き換えずに済みます。

## server.jarを起動
さっそく起動！
`java -Xmx1024M -Xms1024M -jar server.jar nogui`

不穏なログが出ますが想定通りです。
<pre>
[main/ERROR]: Failed to load properties from file: server.properties
[main/WARN]: Failed to load eula.txt
[main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
</pre>

server.jarと同じ階層にいくつか新しいファイル・ディレクトリが作られたはずです。
<pre>
minecraft-server-1.15.1
├── eula.txt
├── logs
│   └── latest.log
├── server.jar
└── server.properties
</pre>

eula.txtを編集して`eula=false`となっている箇所を`true`にしてあげます。
そして再度起動。
`java -Xmx1024M -Xms1024M -jar server.jar nogui`

下記のように出力されたら起動成功です。少し時間がかかりますが辛抱しましょう。
<pre>[Server thread/INFO]: Done (217.814s)! For help, type "help"</pre>

この時点でクライアントから接続できるはずなので用意のある人は試したほうがいいでしょう。
うまくつながらない場合はファイアウォールなどを見直す必要があります。

サーバを止める場合には`/stop`と打ち込みます。

# まとめ
単純に動かすだけならかなり簡単でした。
自動起動は別の機会に…。
pythonで角度変換(ラジアン<=>度数)

pythonで度数変換をする際のメモ。

```python
rad(ラジアン)=>度数
import math
math.degrees(theta)

#theta = pi/4なら45.0が出力
```

```python
度数=>rad(ラジアン)
import math
math.radians(theta)

#theta = 45なら0.78539...が出力
fopenを勉強しました。

# 概要

以前、既存機能の復活するため、
ログファイルを見ましたが、何かおかしいだったので、
コードを確認しました。

そこで、fopenのmodeがおかしいでした。
なんやら、上書きしている感じだったので、
追記モードでファイル作成ができるようにしました。

今回で、fopenのモードを整理しようと思います。

# fopenとは？

ファイル入出力関数で、
ファイル名（filename）で示されるファイルを、指定モード（mode）でオープンする。
ファイルが正しくオープンされると、ファイルポインタが返される。
エラーの時は NULLが返される。

```
FILE *fopen(const char *filename, const char *mode);
```

# fopenのモード

- r ：読み込みのみ 
- r+ ：読み込み／書き出し用
- w　：書き出しのみ。もし、同じファイルが存在している場合、そのファイルの内容をすべて消した後、内容を追記。ファイルが存在していない場合、ファイルを作成します。
- w+ ：読み込み／書き出し用。もし、同じファイルが存在している場合、そのファイルの内容をすべて消した後、内容を追記。ファイルが存在していない場合、ファイルを作成します。
- a  ：書き出し用のみ。もし、同じファイルが存在している場合、すべての書き込み操作は、ファイルの末尾で行う。ファイルが存在していなければ、空のファイルを新たに作成する。
- a+ ：読み込み／書き出し用。もし、同じファイルが存在している場合、すべての書き込み操作は、ファイルの末尾で行う。ファイルが存在していなければ、空のファイルを新たに作成する。
- b ：Binary Mode
- t ：Text Mode
Technology Radarの各リングがどういう状態か

## Technology Radarとは？

https://www.thoughtworks.com/radar

ThoughtWorksさんが提供しているソフトウェア開発に関わる技術がどういう状態なのか評価したもので、新しい技術を採用する際に、どのような評価がされているのか参考になります。
状態はAdopt/Trial/Assess/Holdに分類されますが、それぞれの分類がどういう状態なのか毎回忘れてしまうためメモとして残しておきます。

## 各分類

※この分類はRadar上でリングで表現されているため状態がリングと呼ばれています。

### Adopt

> The Adopt ring represents blips that we think you should seriously consider using. We don't say that you should use these for every project; any tool should only be used in an appropriate context. However we do think that a blip in the Adopt ring represents something where there's no doubt that it's proven and mature for use.

#### 意訳

- 真剣に使用を検討すべきもの
- 全てのプロジェクトで使用すべきとは言わない
- どのツールも適切なコンテキストで使用する必要がある
- ただし、Adoptの技術は間違いなく実証済みで成熟している

### Trial

> The Trial ring is for blips that we think are ready for use, but not as completely proven as those in the Adopt ring. So for most organizations we think you should use these on a trial basis, to decide whether they should be part of your toolkit. Typically we've used trial blips in production, but we realize that readers are more cautious than us.

#### 意訳

- 使用する準備は整っているがAdopt程完全には実証されていない
- ほとんどの組織ではトライアルベースで使用して、ツールキットの一部にする必要があるか決定する必要がある
- 一般に我々はTrialを本番環境で使用しましたが、読者の方が慎重であることに気がついた

### Assess

> The Assess ring are things to look at closely, but not necessarily trial yet - unless you think they would be a particularly good fit for you. Typically, blips in the Assess ring are things that we think are interesting and worth keeping an eye on.

#### 意訳

- よく目にする技術だがまだTrialではない
- ただし、あなたに特にフィットする技術ではない限り、Trial
- 一般に興味深く、注目する価値がある

### Hold

> The Hold ring is for things that, even though they are accepted in the industry, we haven't had a good experience with. Therefore we are calling them out to warn you that you may run into trouble with them as well. Sometimes this is because we don't think they're mature enough yet; sometimes it means we think they're irredeemably flawed; or just being misused. We do place things in the Hold ring that we wish the industry wouldn't use.

#### 意訳

- 業界で受けられているが良い経験がないもの
- トラブルに遭遇するかもしれないことを警告
- 成熟していない
- 救い難い欠陥があると考えられる
- 業界で使用しないことを望んでいる
叩くだけでSVNリポジトリにaddとcommitしてくれるbat書いたのでメモ

# 実行するだけでaddとcommitまでしてくれます。
バックアップ用途でsvnリポジトリを作ったときに書いたbat（と言いつつ中身はPowerShell）。
似たような要件があった時に使えそうなので残しておくことにしました。

```posh
@setlocal enabledelayedexpansion&set a=%*&(if defined a set a=!a:"=\"!&set a=!a:'=''!)&powershell/c $i=$input;iex ('$i^|^&{$PSCommandPath=\"%~f0\";$PSScriptRoot=\"%~dp0";#'+(${%~f0}^|Out-String)+'} '+('!a!'-replace'[$(),;@`{}]','`$0'))&exit/b

$targetFiles = @(svn status)
if ($targetFiles.Length -le 0) {
	echo "No files changed."
	exit
}

echo "$($targetFiles.Length) files changed."

foreach($file in $targetFiles) {
        if ($file.StartsWith("?")) {
                svn add $file.Remove(0, 1).Trim()
        } elseif ($file.StartsWith("!")) {
                svn delete $file.Remove(0, 1).Trim()
        } else {
                echo $file
        }
}

$dateStr = (Get-Date).ToString("yyyyMMdd-HHmmss")
svn commit --message "${dateStr}"
```

世代管理対象外のファイル（svn statusでファイル名の前に?とつくやつ）が現れたら
問答無用でsvn addするようになっているので、
特定のファイルを除きたい場合はif文の条件をイジる必要があります。

# 参考
[バッチファイルにPowerShellスクリプトを埋め込む 標準入力対応版](http://reosablo.hatenablog.jp/entry/2016/07/09/193617)
[PowerShellで戻り値が配列かどうか不定なコマンドレットを必ず配列で処理する方法](https://qiita.com/akira6592/items/5d677577e5b0f781b3a3)
新しい環境でGatsby環境を立て直す

# Abstract
MacにBluetoothマウスを接続しようとしたのだがどうもうまく行かない。サポートに問い合わせ、様々な対応を試みたがどうにもうまく行かないため、一度OSをクリーンインストールすることとした。
データはほとんどがクラウドで管理されており、手動で環境を再構築しても手間ではないのだが、今後のことも考えてmac用のdotfilesも整備し始めた。それはまた別の話ではあるが、ブログのローカル環境を移すのは初めてだったのでその覚書を記すこととした。
単純に言うとやることはnodeをインストールし、npmからgatsby-cliをインストールする。それだけ。

# Introduction
今回Gatsbyの初期環境構築は割愛させていただきます。Qiita内に様々なエントリがあるのでそちらを参考にしてください。「[Gatsbyで簡単にブログを作成](https://qiita.com/k-penguin-sato/items/7554e5e7e90aa10ae225)」など
私もこちらで紹介されているようにGatsby環境をGithubで管理し、ホスティングにNetlifyを利用して公開しています。無料で利用でき、Githubにソースコードをプッシュすると自動でデプロイする設定も簡単にできるのでおすすめです。

今回はすでにGithubへソースコードがプッシュされており、デプロイなどもすでに済んでいる状態で、ローカル環境を新環境へ移す時にすること。を記載していきます。

また、今回はmacでの環境構築となるためhomebrewを利用してnodebrewをインストールし、nodebrewから安定版のnodejsを使いますが、適宜読み替えていただければと思います。

# Procedure
Homebrewはすでにインストール済みであるという前提で始めます。
## Install nodejs
``` bash
$ brew install nodebrew
$ export PATH="$PATH:$HOME/.nodebrew/current/bin"
   # bash_profileなどにも記載しておく
$ nodebrew install-binary stable
   # バージョンはお好みで、今回は安定版(stable)
$ nodebrew use stable
$ node -v
   # nodeのバージョンが表示できたらGood
$ npm -v
   # 一応npmも確認しておく
```

## Install Gatsby
``` bash
$ npm install -g gatsby-cli
```

## Clone project
自身のGatsbyプロジェクトをクローンしてきましょう。
自分はGithubクライアントを使っているのでボタンポチでクローンしちゃいます。(単にCLIを普段あまり使わないので苦手)

``` bash
$ git clone [https://github.com/USER_NAME/GATSBY_REPO.git]
$ cd GATSBY_REPO
$ gatsby develop
```

ブラウザで http://localhost:8000/ を確認する。

# Conclusion
大したことではないので少し調べればわかるor思い出すと思うのですが、それも時間の無駄だと思ったのでテキストに残しておきました。
そのうち全部自動でセットアップできるようにスクリプトを整備しておきたい。

# ところで
OSのクリーンインストールを完了し、再度マウスのBluetooth接続を試みるも症状は改善しなかったので結果的に無意味だったので少しがっかり。きれいに掃除されたのでまぁいいのですが。
説明書見たら接続方法を間違えていただけでした。
[Logicool MX ERGO](https://www.amazon.co.jp/Logicool-%E3%83%AD%E3%82%B8%E3%82%AF%E3%83%BC%E3%83%AB-MXTB1s-bluetooth-%E7%AD%8B%E7%B7%8A%E5%BC%B520-%E8%BB%BD%E6%B8%9B/dp/B074Z71C2M)おすすめです。トラックボール最高。
mpsytで「ERROR: HTTP is not supported.」と表示されたときは

Linux Mint 18.3上にvenvでpython 3.5.2の隔離環境を作成し、そこにmpsytを入れて時々YouTubeの音楽を楽しんでいる。しかし、久しぶりにmpsytを起動したところ、「ERROR: HTTP is not supported.」なる今まで見たことがないメッセージが表示され、音楽が再生できなくなった。
この事象はYouTube側の仕様の変更によるものと想定されるが、そんなときは慌てずにパッケージを更新するだけで良い。

```
$ pip install --upgrade youtube-dl
$ pip install --upgrade mps-youtube
$ pip install --upgrade pafy
```

更新後の各パッケージのバージョンは以下の通り。

```
Package       Version   
------------- ----------
mps-youtube   0.2.8     
pafy          0.5.5     
youtube-dl    2019.12.25
```

これで何事もなく再生できるようになった。
高解像度降水ナウキャストの画像をpuppeteerによってロボット的に取得

# これは何ですか？
気象庁の降水レーダー画像を取得するスクレーパーです。今はこれもロボットと言えば言えるようです。長らくWatir + ChromeDriverで頑張ってきましたが、解析の困難なエラーが出るようになって、ChromeDriverがいくら更新しても直ってこないので、迂回策としてpuppeteerで書いてみたところあっさり動作した次第です。

[高解像度降水ナウキャストの画像取得 by puppeteer/node.js](https://gist.github.com/59t9/4244463dd836d0fa5c322b622c8325e7)

習作以上の物ではございませんが、お役に立てれば幸いです。
ArduinoUnoとROS（Raspberry Pi 3 Model B+, UbuntuMate 16.04LTS）を繋げる

# 目的
ArduinoUnoとROS（Raspberry Pi 3 Model B+, UbuntuMate 16.04LTS）を繋げた際の備忘録です。

# 準備
ArduinoUno
[Raspberry Pi 3 Model B+](https://www.amazon.co.jp/dp/B07R7M7N3P/ref=cm_sw_r_tw_dp_U_x_7bykDbQ32KV4P)

RaspberryPiは[Raspberry Pi 3B+(Ubuntu Mate 16.04LTS)にROS kinetic をインストールしてturtlesimを動かす](https://qiita.com/seigot/items/ce88174c1123400fc2a4)の環境を使います。

# コード

> [rosserial_arduino Arduino IDE Setup](http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup)
> [rosserial_arduino Hello World (example publisher)](http://wiki.ros.org/rosserial_arduino/Tutorials/Hello%20World)


rosserial for Arduino を installします。

```
$ sudo apt-get install ros-kinetic-rosserial-arduino
$ sudo apt-get install ros-kinetic-rosserial
$ mkdir -p ~/catkin_workspace/src
$ cd ~/catkin_workspace/src
$ git clone https://github.com/ros-drivers/rosserial.git
$ cd ~/catkin_workspace/
$ catkin_make
```

ArduinoIDE用のros_libライブラリを作成します。

```
$ mkdir -p ~/tmp/libraries
$ cd ~/tmp/libraries
$ rm -rf ros_lib
$ rosrun rosserial_arduino make_libraries.py .
$ ls
ros_lib 
```

ros_lib HelloWorldをArduinoへ書き込みます。

ros_lib HelloWorldを書き込んだArduinoをRaspberryPiと接続します。
RaspberryPi側で下記を実行してROS topicを確認します。

```
$ roscore
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
[INFO] [1561975864.676817]: ROS Serial Python Node
[INFO] [1561975864.683801]: Connecting to /dev/ttyUSB0 at 57600 baud
[INFO] [1561975867.311368]: Note: publish buffer size is 280 bytes
[INFO] [1561975867.311865]: Setup publisher on chatter [std_msgs/String]
[INFO] [1561975983.204755]: Send tx stop request
$ rosrun rosserial_arduino serial_node.py _port:=/dev/ttyUSB0
$ rostopic echo chatter
data: "hello world!"
---
data: "hello world!"
---
```

# CodingError対策

```
$ ls -l /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0  7月  1 18:55 /dev/ttyUSB0
$ sudo chmod o+r /dev/ttyUSB0 
$ sudo chmod o+w /dev/ttyUSB0
$ ls -l /dev/ttyUSB0 
crw-rw-rw- 1 root dialout 188, 0  7月  1 19:12 /dev/ttyUSB0
```

Arduinoと接続した際にデバイスファイルがttyUSB0となっていることを確認します。

--
make_libraries.pyのスクリプト実体は以下にあります。

```
/opt/ros/kinetic/share/rosserial_arduino/make_libraries.py
rosrun rosserial_arduino make_libraries.py ~/.
```

# 参考
[rosserial_arduino Arduino IDE Setup](http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup)
[rosserial_arduino Hello World (example publisher)](http://wiki.ros.org/rosserial_arduino/Tutorials/Hello%20World)
[ArduinoにROSのノードをのせる](http://ishi.main.jp/ros/ros_arduino.html)
[ArduinoでROSを使う(rosserial)→Ubuntuのみで利用可能](http://d.hatena.ne.jp/seinzumtode/20161129/1480407279)
[rosserial を用いてROSとArduinoの間の通信を行う](http://makemove.hatenablog.com/entry/2015/04/05/181604)
Amazon Connectの２つの管理画面で管理可能な項目とアクセス方法について

現在コンソールからAmazon Connectを管理する場合は、以下の２つの管理画面から行うこととなる。

- Amazon Connectインスタンス管理画面
- コンタクトセンター管理画面

それぞれの管理画面で管理可能な項目とアクセス方法について記載する。

## 管理画面

### Amazon Connectインスタンス管理画面

![image.png](https://image.docbase.io/uploads/f5ba5882-7752-4d1d-955b-cf9551e0a58a.png)

この画面で管理できる項目は以下の通り。

- テレフォニー
    - 着信
    - 発信
- データストレージ
    - 通話記録
    - チャット記録
    - ライブメディアストリーミング
    - エクスポートされたレポート
- データストリーミング 
- アプリケーション統合
    - 承認済みオリジン
- 問い合わせフロー
    - 問い合わせフローのセキュリティキー
    - Amazon Lex
    - AWS Lambda
    - 問い合わせフローログ

### コンタクトセンター管理画面

![image.png](https://image.docbase.io/uploads/5f2e4b1b-145c-429e-bc72-1d8d74c36015.png)

この画面で管理できる項目は以下の通り。

- メトリクスおよび品質
    - リアルタイムメトリクス
    - 履歴メトリクス
    - 問い合わせの検索
    - ログイン/ログアウトレポート
    - 保存されたレポート
- ルーティング
    - 電話番号
    - 問い合わせフロー
    - プロンプト
    - キュー
    - オペレーション時間
    - クイック接続
- ユーザー
    - ユーザー管理
    - ルーティングプロファイル
    - エージェントステータス
    - セキュリティプロファイル
    - エージェント階層

## 管理画面へのアクセス方法

### インスタンス管理画面へのアクセス方法

[AWSマネージメントコンソール](console.aws.amazon.com)で、[サービス]より[Amazon Connect]を選択。（もしくは [https://console.aws.amazon.com/connect/home](https://console.aws.amazon.com/connect/home) にアクセス）
![image.png](https://image.docbase.io/uploads/5d7aafb1-4b6c-48ad-abb3-067914c7866e.png)

Amazon Connectのインスタンスが作成されていれば一覧に表示されているので、管理したいインスタンスのインスタンスエイリアスをクリック。
![image.png](https://image.docbase.io/uploads/9b902b34-9569-46dd-9907-aa1e5e3c297e.png)

Amazon Connectインスタンス管理画面へアクセスできた。
![image.png](https://image.docbase.io/uploads/1ecc422d-3a06-4717-a5d9-674dc29a4cd5.png)

### コンタクトセンター管理画面へのアクセス方法

コンタクトセンターにアクセスしたいAmazon Connectインスタンスの管理画面で、[概要]で[管理者としてログイン]をクリック。
![image.png](https://image.docbase.io/uploads/fa911694-a550-42ba-837c-d95ac40eed2f.png)

もしくは以下のURLにアクセスする。

- https://<インスタンス名>.awsapps.com/connect/home

コンタクトセンターにアクセスできた。
![image.png](https://image.docbase.io/uploads/871170e5-0a7e-489a-8766-2b1f156c53f4.png)

## おわりに

2019年現在、Amazon Connectは[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/connect/index.html)で管理できる項目は限られており、またCloud Formationでのデプロイもサポートされていないため、しばらくは管理画面による実装を行う必要がありそうである。

## 参考

- [Amazon Connect とは（AWSドキュメント）](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/amazon-connect-instances.html)
- [[Amazon Connect] 電話するLambda と ユーザが入力した番号を受け取るLambda を作ってみた（Developers.IO）](https://dev.classmethod.jp/cloud/aws/amazon-connect-calling-lambda-and-subscribe-lambda/)
【Laravel × toastr.js】メッセージをふわっと表示させる

今回はメッセージをふわっと表示させる方法についてお話しします。

ふわっとメッセージを表示させるために色々探していて、見つけたのが`toastr.js`というものです。

[公式のデモはこちら](https://codeseven.github.io/toastr/demo.html)


# Laravelでtoastr.jsを使用する


## toastr.jsをインストールする

* npmを使っている人はこちら

```
npm install toastr
```

* yarnを使っている人はこちら

```
yarn add toastr
```


## JSファイルを作成する

名前は何でもいいんですけど、僕は`resources/js/toast.js`というJSファイルを作成したいと思います。

中身はこんな感じ。

```js

window.toastr = require('toastr');

// エラーの場合
if($('.validate-error').length){
    toastr.warning('エラーが発生しました');
}
```

ビューの方ではバリデーションエラーが発生したら、その要素に`validate-error`というクラスをつけるようにしています。

なので、バリデーションでエラーが発生する → `validate-error`というクラスがつけられる → JavaScriptが反応してエラーメッセージがふわっと表示される。


という流れにしています。

たったこれだけでふわっとメッセージが完成です！


# 終わりに

検索キーワードが難しくて「Laravel ふわっと　メッセージ　ライブラリ」とか「Laravel エラー　ふわっと jQuery ライブラリ」とか調べていて、なかなか見つからなかったので、メモとして記事を公開することにしました。

めちゃくちゃ万能で簡単なので皆さんもぜひ使ってみてください！
WSL（Windows Subsystem for Linux）の準備

最低限の設定ができたようなので、メモします。今時の？Windows ノートＰＣでのLinux環境構築の第一歩です。

# ubuntu を起動

Windows store から ubuntuをダウンロードしてインストールします。Store から持ってくるのは簡単にできると思うので、それ以外の部分をメモしておきます。

## 「Windowsの機能の有効化または無効化」

起動する前に、コントロールパネル の 「プログラムと機能」 から 「Windowsの機能の有効化または無効化」 を起動し、 「Windows Subsystem for Linux」 にチェックを入っているか確認しましょう。Store のページでよく読むと

> To use this feature, one first needs to use "Turn Windows features on or off" and select "Windows Subsystem for Linux", click OK, reboot, and use this app.

と書いてありました。ばか。

普通にターミナルが立ち上がり、コマンドが普通に使えます。なお、既存のWindows のファイルは /mnt/c に見えます。

![ubuntu20191231wsl.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/0e2696da-be31-aff6-ef48-7535d55dc9db.png)



#X11 を用意

## X server の用意

### VcXsrvをインストール

X server のソフトをインストールします。いろいろあるようですが、ネットで紹介されていたVcXsrvが良さそうなのでそれにしました。

- [VcXsrv Windows X Server](https://sourceforge.net/projects/vcxsrv/)　をインストールします。Default のままNextを押し続けたと思います。

- 起動させます。Xlaunch という名前のプログラムで、私の環境では検索でXlまでいれると出てきます。

- 起動させたら、４つの選択肢のうち "multiple window" を選択しました。立ち上がると、右下のＸのアイコンが見えます。

![20191231Xclient.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/94820f90-bdc5-423a-e581-f7395119c17a.png)


## X client 側(utunbu)の用意

環境変数DISPLAYの設定をします。


~/.profile に書く。書いた後で source ~/.profile とした方が良いかも。

```
export DISPLAY=:0.0
```

中身は分かりませんが、以下を実行しました。とても時間がかかりました。Ｘ関係のライブラリを０から全てインストールしていたのかな。

```
sudo apt-get install xfce4-terminal
```

動作確認として、gnuplot を動かしてみました。（当然、apt でいくつかはインストールしてあります。）

![gnuplot20191231.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/8027483c-2563-3386-6f16-a9a49a95bb9b.png)



### 参考　

環境変数DISPLAYの説明など詳しく紹介されているサイトもあるので、読むと勉強になります。

- [WSLでwindows上にLinuxのGUI環境を作る[メモ]](https://qiita.com/MERIK/items/ef4ecf7a51f89c403e94)
- [WSL上にXサーバをインストールしてGUIを実現する（VcXsrv編）](https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html
)
- [X Window on WSL (Ubuntu) on Windows 10 Pro](https://estuarine.jp/2017/11/wsl-x-window/)


そもそもの目的は、どうしてもAndroid GNSS Analyzer をWindows で想定通りに？動かないので、Linuxの環境を用意しました。が、結局こちらでも動かず。。。後でメモします。

何度もVMWare, OpenBoxなどインストールしましたが、Windows がメンテしてくれているものがあるならそちらを使いたいです。。。ということで、しばらくこちらを動かしていきたいです。WSL2というものも巷であるらしいですが、そのうちに。
正規表現とVSCodeのメモ

コードを書いているときに複数個所を一気に編集したいということが多々あるのですが、検索が面倒だったり、特定のパターンに則って編集したかったりとするのですが、毎回なんかググっている気がするのでメモがてら残しておこうと思います。

# 正規表現
パターンで検索するときに使うのは正規表現なので、よく使うやつをメモしておきます。

## 先読み
端的にいうと直後の文字列の有無を基点として検索する、正規表現の機能です。
種類は二つあり、

### 肯定的先読み(?=pattern)
直後にヒットするパターンがある文字列にヒットする

```
検索パターン: test(?=aa)
testaa // testにヒット

testbb

testcc
```

### 否定的先読み(?!pattern)
直後にヒットするパターンがない文字列にヒットする

```
検索パターン: test(?!aa)
testaa

testbb // testにヒット

testcc // testにヒット
```



## 後読み
こちらは直前の文字列の有無を基点にして検索します。

### 肯定的後読み(?<=pattern)
直前にヒットするパターンがある文字列にヒットする

```
検索パターン: (?<=aa)test
aatest // testにヒット

bbtest

cctest
```

### 否定的後読み(?<!pattern)

```
検索パターン: (?<!aa)test
aatest 

bbtest // testにヒット

cctest // testにヒット
```
# キャプチャ
パターンでマッチした文字列記憶しておいてあとで使う機能です。
使い方はシンプルで `()` で囲ってあげるだけでキャプチャしてくれます。

## 後方参照
キャプチャした文字列を検索条件時に再度利用する機能です。キャプチャした文字列は `\1` といった形で利用します。

```
検索パターン:(test)\1
aatesttest // testtest にヒット
```

複数キャプチャがある場合は

```
検索パターン:(t)(e)(s)(t)\1\2\3\4
aatesttest // testtest にヒット
```

## 置換
キャプチャした文字列を利用して置換する場合はこんな漢字になります。

```
検索パターン:(test)
置換パターン:$1$1

aatest // aatestestに置換される
```

# VsCodeでのメモ
vscode で使用する場合基本的な以下のコマンドで使えます

`ctrl + F` ファイル内検索
`ctrl + H` ファイル内置換
`ctrl + alt + F` プロジェクト内検索
`ctrl + alt + H` プロジェクト内置換

それとは別に便利なのが、 検索状態で `alt + enter` を押すことです。

これで、検索でマッチした文字列に対してマルチカーソルになり、一括で編集できます。

# 最後に
昔のvscodeだと後読みに対応していなかったりとしていましたが、現在の最新版で試してみましたが、問題なく動作しました。
もし、正規表現の後読み、先読みが使えなかったら、バージョンを挙げてみてください。
AmazonLinux2/CentOS7 日付表記を日本語化


#日付表記を日本語化

現在の状態

```
$ date
Tue Dec 31 13:44:42 JST 2019
```
設定確認

```
$ localectl status
   System Locale: LANG=en_US.utf8
       VC Keymap: n/a
      X11 Layout: n/a
```

利用できる日本語の設定を確認

```
$ localectl list-locales | grep ja
```

変更

```
$ sudo localectl set-locale LANG=ja_JP.utf8
$ source /etc/locale.conf
```

```
$ date
2019年 12月 31日 火曜日 13:39:07 JST
```

戻す

```
$ sudo localectl set-locale LANG=en_US.utf8
$ source /etc/locale.conf
```
【zshプラグインマネージャー】zgenを卒業してzplugを使用してみた

以前までzgenを使っていましたが、新しいMacを買って設定している時になぜか色々うまくいかず...

他のプラグインマネージャーなら！と思ってzplugを入れてみました。

zplugの導入メモを色々取っていたので、記事として公開してみたいと思います。


# zgenのアンインストール

zgenのアンインストール方法はこれだけだそうです。

```zsh

$ rm -rf $HOME/.zgen
```


参考：[Zshプラグインをzgenでシンプルに管理する](https://blog.longkey1.net/2018/03/24/zgen/#アンインストール)

# zplugのインストール

zplugのインストールは[公式サイト](https://github.com/zplug/zplug)に書いています。

```
curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh| zsh
```


# zshrcに設定を書いていく



一番最初にzplugを読み込む必要があります。

```.zshrc
# zplugの設定
source ~/.zplug/init.zsh
```

そして、僕が入れたプラグインはこちらです。

```
zplug "zsh-users/zsh-syntax-highlighting"
zplug "zsh-users/zsh-history-substring-search"
zplug "zsh-users/zsh-autosuggestions"
zplug "zsh-users/zsh-completions"
zplug "b4b4r07/enhancd", use:init.sh↲

zplug "plugins/git", from:oh-my-zsh
zplug "plugins/tmux", from:oh-my-zsh
zplug "plugins/sudo", from:oh-my-zsh
zplug "plugins/docker", from:oh-my-zsh
zplug "plugins/command-not-found", from:oh-my-zsh
```


そしてプラグインがインストールしていなかったらインストールする部分を入れる必要があります。

```
# インストールしていなかったら、インストールする
if ! zplug check --verbose; then
  printf "Install? [y/N]: "
  if read -q; then
    echo; zplug install
  fi
fi
```

最後に、ロードする部分を追加します。

```
# ロードする
zplug load
```

# 終わりに

そこそこ便利にしたいけど、まあ特にこだわりはないという僕に取ってはzgenもzplugもあまり変わりませんでした。

しかし、ネット上の記事はzplugが多かったような気がします。

なので、zshのプラグインマネージャーどれにしたらいいのおおお？って悩んでいる人は、ネット上の記事の多さで決めるのもいいと思います。
Django でadminにログインできない

djangoのインストールで、バーション指定しないと3系になる。
admin ( http://127.0.0.1:8000/admin/ ) にログインするときに、開発サーバが落ちてログインできない場合が多発するので、2系でインストールしましょう。

`pip uninstall django`
`pip install django==2.0.1`
Ubuntu 18.04でGifCurryを動かす

取り急ぎ自分用のメモ書き。
[GifCurry](https://github.com/lettier/gifcurry) を動かそうとしたが、まともに動かなかった。
「FFmpegのプラグインが読めない」ってエラーが出たり、
「gtksinkが見つからないからプレビューできないよ」というエラーが出たり。

### 対策
結論から先に言うと、

* snapは使わない。
  [Releases](https://github.com/lettier/gifcurry/releases)からダウンロードしたAppImageを実行、もしくはtar.gzを展開して使う。

* gstreamer1.0-gtk3 か gstreamer1.0-plugins-good をインストールする
  （自分の場合既にインストール済みだった）

* **gstreamer1.0-tools** をインストールする（これ重要）

### 詳細

* FFmpegのプラグインが読めない
  は、snapがsandboxで動いているせい、とのこと。

* gtksinkが見つからない
は、コマンドラインから gifcurry-gui を起動すると出る以下のエラーがヒントになる。

  ```
[ERROR] gst-inspect-1.0: readCreateProcessWithExitCode: runInteractiveProcess: exec: does not exist (No such file or directory)
```

CreateProcess だとか exec 、そして does not exist (No such file or directory) というあたりから、
「コマンド自体がない」と見当をつける。
inspect って事は、何かしらその「gtksinkが無いかどうかinspectする」という処理をしていて、
「その処理自体」が失敗しているのだが、それがgtksinkが無いという分岐に流れ込んでいるんだろう。

gst-inspect-1.0 を探す。　

```
$ apt-file search gst-inspect-1.0
gstreamer1.0-tools: /usr/bin/gst-inspect-1.0
gstreamer1.0-tools: /usr/share/man/man1/gst-inspect-1.0.1.gz
microsoft-mlserver-python-9.4.7: /opt/microsoft/mlserver/9.4.7/runtime/python/bin/gst-inspect-1.0
microsoft-mlserver-python-9.4.7: /opt/microsoft/mlserver/9.4.7/runtime/python/pkgs/gstreamer-1.14.0-hb453b48_1/bin/gst-inspect-1.0
```

というわけで、 gstreamer1.0-tools を入れると状況が変わるのではないか、と考えてインストールする。
apt-file は普通に `sudo apt-get install apt-file` で入る。 

正しく動くようになった。
JavaとJacksonでJSON その①サーバからJSONを返す

#初めに
今さらながらJavaでJacksonを用いたJSONのハンドリングを振り返ってみる。自分のプロジェクトの場合、JavaはほぼWebシステムであり、サーブレットとJavaScriptとの連携が肝になってくる。まずは、サーバからJSONを返すところを今回やってみた。Servletで実装している以外は、ほぼ参考文献の流用である。

#環境
- Java 1.8
- Tomcat 8.0.53
- Jackson 2.10.1

#ソース
## JSON用Javaクラス作成
まずは、JSON化するために、それ用のオブジェクトを格納するためのJavaクラスの作成が必要になってくる。以下の通り、id(number型), name(string型), datas(配列)のプロパティを用意した。肝となるのは、@JsonPropertyによるアノテーションである。これがないと、例外が発生する。

```JsonBean.java
package servletTest;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;

public class JsonBean {

	@JsonProperty("id")
	private int id;

	@JsonProperty("name")
	private String name;

	@JsonProperty("datas")
	private List<String> datas;

	public void setId(int id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setDatas(List<String> datas) {
		this.datas = datas;
	}
}
```

## サーブレットの作成
前項で作成したJavaのクラス用いてオブジェクトを作成し、ObjectMapperクラスのwriteValueAsStringメソッドでJson文字列に変換し、クライアントへ返す。

```SetvletTest.java
package servletTest;

import java.io.IOException;
import java.util.List;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;


// 参考　https://itsakura.com/java-jackson

@WebServlet("/helloworld")
public class ServletTest extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    	//Javaオブジェクトに値をセット
    	JsonBean jsonBean = new JsonBean();
    	jsonBean.setId(1);
    	jsonBean.setName("kimisyo");
    	List<String> datas = new ArrayList<>();
    	datas.add("Programmer");
    	datas.add("Data Scientist");
    	jsonBean.setDatas(datas);

    	ObjectMapper mapper = new ObjectMapper();
    	try {
    		//JavaオブジェクトからJSONに変換
    		String testJson = mapper.writeValueAsString(jsonBean);
    		//JSONの出力
    		response.getWriter().write(testJson);
    	} catch (JsonProcessingException e) {
    		e.printStackTrace();
    	}
    }
}
```

#実行結果
上記をEclipseで実行したところブラウザに以下の文字列が表示される。

```
{"id":1,"name":"kimisyo","datas":["Programmer","Data Scientist"]}
```

#おわりに
本来なら、Content-Typeなんかも設定した方がよいのだろうが、次回以降でやらざるを得ないと思われるので、先延ばしした。
次回以降（あればの話だが）は、以下の題目で進める予定である。
- ~~クライアント側で受け取ったJSONをJavaScriptで取得~~
- クライアントから送ったJSONをサーバ側で取得
- JSON文字列の~~エスケープ、~~XSS対策
- HTMLにJSONを埋め込んでJavaScript から利用する(Java版)

#参考
- [Java JacksonでJSONとJavaオブジェクトを変換する](https://itsakura.com/java-jackson)
「リファクタリング 第2版」Swiftでコーディング その9

# 14頁 第1章 play変数の削除 「変数のインライン化(p.129)」

## Swift版 main.swift

データ生成、結果表示付き。

```swift
import Foundation

makeData()

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func statement(invoice:Invoice, plays:Dictionary<String, Play>) -> String {
    var volumeCredits = 0
    var totalAmount = 0
    var result = "Statement for \(invoice.customer)\n"
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")

    for perf in invoice.performances {
        volumeCredits += max(perf.audience - 30, 0)
        if "comedy" == playFor(aPerformance: perf).type {
            volumeCredits += Int(perf.audience / 5)
        }
        result += "  \(playFor(aPerformance: perf).name): " + format.string(from: NSNumber(value: amountFor(aPerformance: perf) / 100))! + " (\(perf.audience) seats)\n"
        totalAmount += amountFor(aPerformance: perf)
    }
    result += "Amount owed is " + format.string(from: NSNumber(value: totalAmount / 100))! + "\n"
    result += "You earned \(volumeCredits) credits\n"
    return result
}

func amountFor(aPerformance:Performance) -> Int {
    var result = 0

    switch playFor(aPerformance: aPerformance).type {
    case "tragedy":
        result = 40000
        if aPerformance.audience > 30 {
            result += 1000 * (aPerformance.audience - 30)
        }
    case "comedy":
        result = 30000
        if aPerformance.audience > 20 {
            result += 10000 + 500 * (aPerformance.audience - 20)
        }
        result += 300 * aPerformance.audience
    default:
        print("error")
    }
    return result
}
 
let result = statement(invoice: invoices[0], plays: plays)
print(result)
```
AWS-SAA に認定してもらった話

このたびAWSのソリューションアーキテクト(SAA)に認定していただきましたので、合格に向けて私がやってきたことでもまとめてみます。

前提として、業務にてシステム開発に携わり早5年。基本的なWEBシステムについてはなんとなく知っているくらいのレベル感です。
AWS歴は半年ほど運用で携わっていました。


## 目次

1. 仲間を見つける
2. 計画を立てる
3. 書籍で学ぶ
4. 動画で学ぶ
5. 模試ラッシュ
6. お祈りフェーズ


## 仲間を見つける

はい、最初にして最大の難関がきました。

当初は友人が言い出したSAAの取得企画だったのですが、幸いにも声をかけてもらい私も混ぜてもらいました。

やっぱり一人ではモチベーションの維持が難しいので、勉強しなければならない理由が必要です。
お金を払ったらやるか？と言われるとそうでもないし、カレンダーに定期で予定を入れておいても通知をスワイプして勉強完了してしまいます。

自分との約束を守れない私にはお互いにバシバシと尻を叩きあう仲間がいました。
仲間でもライバルでもいいので一緒にプレッシャーをかけあう人がいると行動しやすいかと思います。


## 計画を立てる

初回の集まりでは
+ 受験日はいつにするか？
+ どのように勉強を進めるか？

といった内容を決めました。

期間は余裕を持って約3ヶ月で線引しました。
そのおかげでサボらず進めれば徹夜の詰め込み作業は必要ありませんでした。

はじめの勉強方法として黄色い書籍を選択しました。
[この1冊で合格! AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集 \| アクセンチュア株式会社, 青柳 雅之, 飯田 敏樹, 柿沼 力, 門畑 顕博, 他 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4046042036?tag=itsumonotakumi-22&linkCode=ogi&th=1&psc=1)

はじめの2ヶ月で書籍の内容を身につけてから公式の2,000円模試に挑む予定を立てました。
最終的には結局書籍1冊では不安だったので他の手法も取り入れました。

なお、勉強するために集まっているので始める前にお腹いっぱいにカレーを食べたり、ビールを飲み干したりは可能であれば控えたほうがいいかと思います。


## 書籍で学ぶ

淡々と買った本の内容を読み進めます。これで主要なサービスの概要を知りました。
集まって読み合わせみたいな形にはせずに、それぞれで読み進めてSlackでたまに進捗連絡をしていました。

私はKindleで購入したので電車内やお昼休憩などの合間に読み進めてました。
後々辞書みたいに用語から検索ように使用するので、書籍でもっているのもありかもしれません。
正直、読んでてもピンとこない内容もたくさんありましたが、3,4割わかればいいやくらいの気持ちで読むのがよいかと。

出題範囲がイマイチ見えていなかったので、どこまで知っていれば合格できるのかを把握するために、読みながら各サービスの位置関係を整理しながら進めました。


---
## 動画で学ぶ

友人の先輩の体験談より、本の内容では太刀打ちできない予感がしたので、ハンズオンが含まれている動画に手を出しました。

[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け21時間完全コース） \| Udemy](https://www.udemy.com/course/aws-associate/)

サービスを全く触らない状態だと役割のイメージがしづらいので、自分の触ったことのないサービスを中心に、動画を見ながらどんなサービスなのかを整理していきました。

よくわかんない部分は別途BlackBeltなどで調べておくと良いかと思います。


## 模試ラッシュ

問題集が販売されていたので買ってやりました。

[AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（5回分325問） \| Udemy](https://www.udemy.com/course/aws-knan/)

不安な問題に星マークをつけられるので、理解してないところに印をつけて解説を確認 and サービスの実態を調べるを繰り返します。
偶然の正解は流さないこと！

この模試ラッシュが一番効いたかと思います。無料の問題も公開されているのでそれも見ておくと良いかと思います。


## お祈りフェーズ

実際の試験にて。前日は大人しくしっかり休みましょう。

実際本番に向き合うと、機械翻訳なのかイマイチ問題が何を聞きたいのかしっくり来ない、問題が何を期待しているのか読み取りきれないところがたくさんありました。
英語が読めればすんなり理解できるものかのかな...?

自分流の理屈武装と模試で磨いた回答スキルを存分に発揮して祈りを込めて選択します。


## まとめ

1. 書籍で概要を掴む
2. 模試ラッシュでトライアンドエラー
3. 祈りを込めて回答を選ぶ

これでアソシエイト認定をいただきました。
参考までに。
「リファクタリング 第2版」Swiftでコーディング その8

# 13頁 第1章 play変数の削除 amountFor関数パラメータの削除

## Swift版 main.swift

データ生成、結果表示付き。

```swift
import Foundation

makeData()

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func statement(invoice:Invoice, plays:Dictionary<String, Play>) -> String {
    var volumeCredits = 0
    var totalAmount = 0
    var result = "Statement for \(invoice.customer)\n"
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")

    for perf in invoice.performances {
        let thisAcmount = amountFor(aPerformance: perf)

        volumeCredits += max(perf.audience - 30, 0)
        if "comedy" == playFor(aPerformance: perf).type {
            volumeCredits += Int(perf.audience / 5)
        }
        result += "  \(playFor(aPerformance: perf).name): " + format.string(from: NSNumber(value: thisAcmount / 100))! + " (\(perf.audience) seats)\n"
        totalAmount += thisAcmount
    }
    result += "Amount owed is " + format.string(from: NSNumber(value: totalAmount / 100))! + "\n"
    result += "You earned \(volumeCredits) credits\n"
    return result
}

func amountFor(aPerformance:Performance) -> Int {
    var result = 0

    switch playFor(aPerformance: aPerformance).type {
    case "tragedy":
        result = 40000
        if aPerformance.audience > 30 {
            result += 1000 * (aPerformance.audience - 30)
        }
    case "comedy":
        result = 30000
        if aPerformance.audience > 20 {
            result += 10000 + 500 * (aPerformance.audience - 20)
        }
        result += 300 * aPerformance.audience
    default:
        print("error")
    }
    return result
}
 
let result = statement(invoice: invoices[0], plays: plays)
print(result)
```
macでローカル環境に構築した仮想マシンにssh接続するコマンド

###やりたいこと

- (localhost:2222)->(仮想環境:22)へ接続

###前提条件
- 仮想マシンでポートフォワードは設定済み

###コマンド

```shell
ssh -l username localhost -p 2222
```

```shell
Are you sure you want to continue connecting (yes/no)? yes
```

```shell
username@localhost's password: 
```
でパスワードを入力する。
Gatsby-imageプラグインを導入して画像の読み込みを早くする

#  結果から
最初にgatsby-imageの効果を見てもらうために、検証動画を載せておきます。
リロード時における、gatsby-image化していない画像とgatsby-image化した画像の表示速度を比較検証した動画になります。
![gatsby-image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467535/46b38c74-8083-bf84-7b60-168819880bf5.gif)

体感1.5倍ほど差がある気がします。

#  gatsby-imageとは
gatsby-imageとは、画像読み込みを最適化してくれるGatsbyのブラグインです。

Webサイトにおいて画像読み込みの最適化は手間がかかりますが、それらをいい感じにやってくれます。

gatsby-imageを使用すると↓
> ![gatsby-picture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467535/75d2e85c-4eb7-959a-b94d-0b4458f56392.png)
[画像元](https://speakerdeck.com/sadnessojisan/gatsby-imagewoyametaikaramian-qiang-sitahua-gatsbywoamphua-sitai?slide=21) 

これだけ画像のサイズや読み込み速度が変わります。

gatsby-imageを導入すれば、サイトが速くなること間違いなさそうです。
# gatsby-imageがしていること
gatsby-imageは、ビルド時に以下の６つのことを行い画像の最適化をしています。

**1, 画像サイズや解像度を最適化** 
与えられたクエリを元に、画像をsourceから取得し、そのクエリを元に画像の変換や加工をします。 

**2, PCやスマホのサイズに対応した画像を別々に生成** 
疑似要素のpaddingを使って画像のアスペクト比を変更します。

**3, PCやスマホに対応した画像をデバイス毎に表示** 
srcsetを指定してデバイス毎に表示する画像自体を切り替えています。

**4, 画像をレンダリングする前に軽量なダミー画像を生成＆表示** 
ビルド時に画像からトレースしたSVG画像を生成します。本画像が表示されるまで軽量なSVG画像を表示しておきます。本画像がloadされると切り替わります。

**5, Base64でinline化** ([base64とは](https://wa3.i-3-i.info/word11338.html) )
画像をBase64に変換してinline化します。HTTPリクエスト回数を減らすために行います。

**6, 画像からメタデータを削除** 
画像からメタデータを削除します。

これら **全て** をgatsby-imageプラグインがやってくれます。

 通りで**画像の表示が速い**わけです。

gatsby-image化した画像は一旦ぼやけた後、素早く綺麗な画像を表示しています。
これは、ビルド時に画像からトレースした軽量なSVG画像をとりあえず表示して本画像が読み込まれるまで待ってるのでこのような画像の表示になります。

ふわっと画像が出てる感じが個人的にはいいなと思います（笑）


# gatsby-imageのデメリット
 **AMP対応が難しい** 

AMPとは↓
> AMP（Accelerated Mobile Pages、アンプ）は携帯端末向けサイトの閲覧を高速化し、ユーザー体験を向上させることを目的に、Googleが中心になって2015年に立ち上げたプロジェクトです。
> 現時点ではTwitterやGoogleの検索結果などではAMPページが優先的に表示されます。
GoogleはAMPの導入を推奨しているため、将来的にはAMPを導入したサイトがSEOの面で恩恵を受けられることが考えられます。
>[AMPとは？](https://pantograph.co.jp/blog/production/amp.html) 

gatsby-imageは画像をBase64でinline css(background-image)として展開します。そのため、tagの長さに制限があるAMPの制約を満たしてくれません。

現状ではgatsby-imageの使用とAMP対応を同時に行うのは難しいようです。

どうしてもAMPに対応したいなら、gatsby-imageを取り除いて↓を
● **画像サイズや解像度を最適化** 
●**PCやスマホのサイズに対応した画像を別々に生成** 
●**PCやスマホに対応した画像をデバイス毎に表示** 
● **画像をレンダリングする前に軽量なダミー画像を生成＆表示** 
● **Base64でinline化** 
● **画像からメタデータを削除** 
自作すればいいようです。（笑）

# まとめ


 **gatsby-image化された画像は表示が速い** 

しかし、AMP化と並行してできない問題点もあります。

今後、SEOで検索順位を上げていきたいとか、ユーザビリティを上げたいならWebサイトのAMP対応が必要になると思います。

個人的に、スマホからのサイトへのアクセスが多いのでAMP対応を優先した方がいいのかなと思ったりもします。ユーザーのサイト直帰率の減少とユーザー満足度の向上が見込めそうですし...



# 引用
[AMP](https://pantograph.co.jp/blog/production/amp.html)
[画像](https://speakerdeck.com/sadnessojisan/gatsby-imagewoyametaikaramian-qiang-sitahua-gatsbywoamphua-sitai?slide=24)
JavaScriptでプロパティ名に変数を利用する


このような基本的なこともわかってなくて死にたくなる。

[]で囲うことで変数名が展開されるのは知ってました。

```js
const prop = "name";

const obj = {
    [prop]: 'hoge',
    age: 33,
}

console.log(obj);
```

が、参照で、

```js
console.log(obj.name);
```

のname部分を変数で指定する方法がすぐにわからなかった。
雰囲気的には、

```js
console.log(obj.[prop]);
```

としたいところですがダメで、.を入れずに続けて書けば正しく処理されます。

```js
console.log(obj[prop]);
```

わかれば当然って感じなんですが。。。ま、１つ賢くなったということで。
zendeskサポートの日時表記を年月日時分秒に統一する

# zendeskサポートの日時表記

zendeskサポートは
　「お客様から問い合わせを頂いてから、どれだけの時間で解決できるか」
というようなことに焦点を当てている（それだけじゃないんだけどさ）サービスツールなので、日時表記がこんな感じです。

<img width="119" alt="スクリーンショット 2019-12-31 12.37.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129938/b9fe8461-0fb1-0465-9d2d-aa3459c27acf.png">

<img width="167" alt="スクリーンショット 2019-12-31 12.54.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129938/1eaeed19-c209-8b44-a9e6-07a4f933bce4.png">

表示させた時点から1週間以内は、曜日もしくは昨日今日という表記になっています。
「表示させた時点から」なので、同じ一週間前でもX曜日12:18 と xx月yy日という表記がごっちゃになったりします。

その表記に、マウスオーバーさせると本来の年月日時分秒表記が表示されます。

<img width="214" alt="スクリーンショット 2019-12-31 12.37.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129938/be46e887-721f-e74c-a82c-646d02f3e13a.png">

大元の表記は持っているので、それに書き換えてしまおうというのが趣旨です。

# tampermonkeyのインストール

ブラウザの拡張機能のtampermonkeyをインストールします。
インストール方法やスクリプトの入れ方は検索すると出てくるので割愛します。

#javascriptで表記を書き換える

設定で変更できるんじゃないかと思ったのですが、どうもそこら辺の設定は無さそうでした。
web上での表記を変更するにはjavascriptが楽ちんなので、javascriptで書き換えることにします。

調べると、標準の表記はタグネーム「time」のitem.innerTextに入っていて、大元の年月日時分秒はitem.titleに入っていることがわかりました。
titleの値ををinnerTextに入れてあげればいいはずです。

```js
// ==UserScript==
// @name         zen_time_change
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://companyname.zendesk.com/agent/*
// @grant        none
// ==/UserScript==


(function() {

    function renderEvent(){
        var datetime = document.getElementsByTagName('time');
        for(var i=0;i<datetime.length;i++){
            datetime.item(i).innerText = datetime.item(i).title;
        }
    }

    setInterval(renderEvent,1000);

})();
```
1秒に一度画面内をごっそり書き換えてます。

自分のところで使えるようにするには、7行目の@matchのところの「companyname」のところを自分の管理するzendeskサポートのURLに書き換えてください。

<img width="175" alt="スクリーンショット 2019-12-31 13.07.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129938/73142cca-2beb-65fd-f1a3-a5977cc88f9a.png">

レンダリングコストが高いので、「そういう表記になっていなかったら書き換える」ほうが良いかもしれませんが、最近のCPUパワーなら特段問題は無さそうです。

これを入れることで、チケット内の日時表記も同じように年月日自分秒に書き換わるようなので、zendeskサポートのダッシュボード全体で年月日時分秒表記になります。
191231_学習記録

【Time】
Today：3h　
Total：60h
TotalDays:30days
(2019/12/02より)

一ヶ月目やんけ・・

【Contents and learned】
**（１）Progate HTML&CSS道場コース　中級編**
-absolute使うときは親にrelativeの指定が必須
-float使っているのでflex-boxを使用できるようにならなくては。
-wrapper系>containerの順序がしっくりこなかったが、恐らくwrapper系で全体的な構成を指定する為、その中にcontainerが内包されていないとwrapperの指定がかからないから、という単純な理由な気がしている。(コンテナは「全てを内包するもの」というイメージを勝手にしていた)
-pはblock要素なのでtext-alignは指定できない。inline-blockにするとOK
-4個の要素を横並びにしたかったのでfloat:leftしたが効かず。20分ほど格闘した末、子要素それぞれではなく親要素にfloatを指定していたことが判明：発狂



**（２）Progate HTML&CSS道場コース　上級編**
-classの中のclassを指定する際： .top-wrapper .btn　←btnの.を忘れがち
2019年振り返り

新幹線のすごい硬いアイス「とちおとめ」甘くて美味しかった(^.^)
そして、俺は自身に甘かった。
勘違いしていた。ダークサイドの自身について書いていこうと思う。
映画の予告編のような、飾られた投稿じゃなくて。
特に、今年最後の2ヵ月は想像していなかった世界。嬉しいんだけど、うまく受け取れてなかった？実際は、図々しく受け取ってますが(ToT)
きれいごとは辞めて、来年は甘ったれで気軽に生きていきたい❗

資格で振り返る
・HTML5 L2取得
・AZ-103 Azure Administrator取得
・AZ-400 Azure DevOps Engineer Expert取得

学習コンテンツで振り返る
・MSLearn Level10超え
・Unityの本、2冊？実施

イベントで振り返る
・毎月2～3回参加
　大きなものではde:code2019, UniteTokyo2019, Ignite The Tour Tokyo
  あと、LTを12月に2回

ここから懺悔編
綺麗事？を言うのは辞めよう。
Azureについて勉強を始めようと思った時、何から始めていいか分からなかった。
とりあえずコミュニティイベントなどに参加して収集した。
会社では、Azure案件は「無い！」「無い！」言われたけど実際には存在するし事例を知ることが出来た。
雑音？を振りきりたくて前職を辞めた。だからフリーランスになった。回りはスゴいとか、SNSでは儲かるとか経費で落とせるとか騒ぐけど、で？って感じになる。
少なくとも社内政治？が下手くそだからAzure案件に関われなかったと言えなくもない。力が無かったとも言える。

その後、70-533を取得してAzure案件に携わることが出来たのはラッキーだ。仕事を探し続けてくれた営業さん、採用してくれた現場には感謝。どうしても実積で見られるのは仕方ないけど、やっぱ経験+可能性を感じてくれる所で働いた方が幸せな気がする。
因みに資格取得すれば案件に関われそうな気がしたのは過去にNW構築案件に携わりたくてCCNP取得して実際に携わることが出来たから。
来年はAzureDevOpsを使った案件に関わってるかも？

decodeではMVPの方に、最後はマンツーマンで教えて頂いてcogbotを時間いっぱいまで使って作ってた前代未聞？の参加者だった。
そのお陰で、家では何とか手順を見ながら作ることが出来た。

これらの経験から、コミュニティを作ってアウトプットの場を設けて恩返ししていきたいと少しずつ思うようになった。
今から考えれば、無理に設ける必要もないし、恩返しなんて考えは自己満足に過ぎないと思う。

そんなことを考え始めた頃だったかな？、父親が倒れて救急搬送されたとの連絡を受けた。
救急隊員、医者さんのお陰で命を救ってもらった。
障害と介護を見ると、何とも言えない感情はある。
結局、最後に命を救えるのは医者だけだ。
だから恩返しなんて詐欺くせぇ。
容易く使う言葉じゃないかも。

この事があったから、「もくもく会」を開くなら西宮市 or 神戸市にしたいなぁと思ったのは、この事が大きい。ただconpassを見ると西宮市や神戸市では、ほとんど見かけず、人を集めるのが難しそうだと思ったので大阪で開催するけど@関西にしたのは、そのためだ。

企画するにあたって場所のこと、特に人を集めるのが不安だった。
複数名で始められた方や、自社の会場で始められた方を見ると羨ましかった。
ただ、その一方で断られて１人になっても、やる覚悟がない人間を助けたいとは思わないだろうと思った。

いくつかの不安を抱えながら発起人に相談した。
もう、この時点で思ってたことと、やってることに矛盾が、ありすぎますね(汗)

この経緯を経て、会場を提供して頂けることに。ただ、お借りしたかった日は埋まってた所を調整して頂いて1室譲って頂けることに。
すでに、たくさんの方を巻き込んでる。。。

参加者集めも、募集ページのベースをもらい、リツイートしてくれた方や、お借りした会社の知名度もあり、今のところ結構参加者が❗(^.^)

女性/LGBT枠を設けることにした。
この業界では特に少数になりがちの方にも安心してと言う意図では、あるものの。
これも、ボヤいてたら、女性のエンジニアの方が手伝ってくれることに。実力も凄い方なんですけど❗

こうして振り返ると、自身の力なんて微々たるもの。周りに返していくなんてたいそれたことは無理だ。
むしろ、これからも多くの協力を必要とする。

2020年は、もう少し気楽に行こう❗(^.^)
JavaScriptでロード画面を作る

JavaScript勉強中、「文字にアニメーションをつける」解説動画を見つけたので、ロード画面として作ってみました。

##Demoページ
https://kngy0306.github.io/Loading/

##コード
###html
```html
<body>
    <!-- ロード画面 -->
    <div class="init">
        <h1 class="loading">Now Loading...</h1>
    </div>
    <!-- ロード後の画面 -->
    <div class="main">
　　　　<h1>メイン画面</h1>
　　</div>
</body>
```
###css
```css
*{
    padding: 0;
    margin: 0;
}

.init{
    background: black;
    width: 100%;
    height: 100vh;
    position: fixed;
}

.init h1{
    color: #ecf0f1;
    text-align: center;
    line-height: 100vh;
    font-size: 3em;
}

span{
    transition: all .3s;
}

.coloring{
    color: #812990;
}

.fadeout {
    animation : fadeOut 2s;
  }
  @keyframes fadeOut {
    0% {
      opacity: 1;
    }
    100% {
      opacity: 0;
    }
  }
```
###javascript
```javascript
// ロード中、表示する文字一つ一つに<span>をつける
const text = document.querySelector('.loading');
const strText = text.textContent;
const splitText = strText.split("");
text.textContent = '';

for(let i=0; i < splitText.length; i++){
    text.innerHTML += "<span>" + splitText[i] + "</span>";
}

// 160ミリ秒ごとspanにcoloringクラスを加える
let char = 0;
let timer = setInterval(setFade, 160);

function setFade(){
    const span = text.querySelectorAll('span')[char];
    span.classList.add('coloring');
    char++;
    // 最後の文字に到達したら二つの関数を呼び出す
    if(char === splitText.length){
        finish();
        fadeOut();
    }
}

function finish(){
    clearInterval(timer);
    timer = null;
}

// ロード画面を作るdivにfadeoutクラスを加える
function fadeOut(){
    const init = document.querySelector('.init');
    init.classList.add('fadeout');
    // 2秒後にdisplay: none;を加える
    setTimeout(function(){
        init.style.display = 'none';
    }, 2000);
}
```
Eclipseで保存時に未使用のimportが勝手に削除されるのを防止する

# はじめに
かなり細かてどうでもいいネタ。Eclipseを久々に使ってimport文を張り付けて一旦ショートカットキーで保存したら、毎回追加したimport文が勝手に削除されてしまうので、設定変更により対応した時のメモ。

# 環境
- Version: 2019-12 (4.14.0)

# やり方
「ウィンドウ」-> 「設定」を開き、左側のツリーで「Java」-> 「エディタ」-> 「保存アクション」を選択。
するとしたのような画面が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/d14448c4-71d9-afa7-6129-2987066f7c10.png)

ここで、右側の「保存アクション」に表示されている「インポートの編成」のチェックボックスをオフにして「適用して閉じる」ボタンをクリックする。

「インポートの編成」が何をしているのか知らないが、とりあえずこれで現象は回避された。
SOPHOS Cloud OptixでGKEの設定がアンセキュアなものをあぶり出す

TOPGATEの堤です。

SOPHOS Cloud Optixというセキュリティ製品を試用する機会があったので、紹介させていただきます。これをGCPやGKEで使えるかどうかも含めて検証してみた。

## SOPHOS Cloud Optixとは・・・

英国のセキュリティベンダーであるSOPHOSがリリースしているセキュリティ可視化ツールといったところだろうか。インスタンスの状態はもちろんのこと、リソースの設定に不備があるかどうかなども、SOPHOSのAI技術を使って分析して、その結果をレポートしてくれるツールと理解しています。

GCP以外にも、AWSやAzureにも対応。詳細は公式HPを御覧ください。

https://www.sophos.com/ja-jp/products/cloud-optix.aspx

Cloud Optixは、30日まで無償で試用できるので、興味ある方はぜひ使ってみてください。

## レポート機能を試す
いろんな機能があるが、今回試すものは、構築したインフラやリソースにアンセキュアな設定がないかどうかを自動的に検出する機能「レポート」を試したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/32e8d78f-b12d-57b5-5502-f65969a18007.png)

今回は、CIS Benchmarkを使って、CISが定めたベンチマークに則った設定や構成になっているかをチェックします。CISは、米国のNSA、NIPGATEの堤です。

SOPHOS Cloud Optixというセキュリティ製品を試用する機会があったので、紹介させていただきます。これをGCPやGKEで使えるかどうかも含めて検証してみた。

## SOPHOS Cloud Optixとは・・・

英国のセキュリティベンダーであるSOPHOSがリリースしているセキュリティ可視化ツールといったところだろうか。インスタンスの状態はもちろんのこと、リソースの設定に不備があるかどうかなども、SOPHOSのAI技術を使って分析して、その結果をレポートしてくれるツールと理解しています。

GCP以外にも、AWSやAzureにも対応。詳細は公式HPを御覧ください。

https://www.sophos.com/ja-jp/products/cloud-optix.aspx

## レポート機能を試す
いろんな機能があるが、今回試すものは、構築したインフラやリソースにアンセキュアな設定がないかどうかを自動的に検出する機能「レポート」を試したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/32e8d78f-b12d-57b5-5502-f65969a18007.png)

今回は、CIS Benchmarkを使って、CISが定めたベンチマークに則った設定や構成になっているかをチェックします。CISは、米国のNSA、NIST、NISAなどの米国政府機関、民間企業、大学などが協力して設立されたインターネットセキュリティに関する団体。こちらは、サーバやネットワーク、最近ではクラウドコンピューティングのセキュリティガイドラインを策定して、それを提供している非営利団体です。

これでレポートを出力すると以下のような画面になります。たくさん出てきてますね。これは、Rancherを使ってサクッとGKEクラスタを構成した直後の設定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92726/516bc94d-7ab1-2f89-5538-3b4779942127.png)

なお、GCP向けのCIS Benchmark 1.0は、PDFファイルで200ページにも及ぶドキュメントになっております。これらのドキュメントは、以下のページより無償でダウンロードが可能です。ご興味ある方はぜひ、一読ください。

https://www.cisecurity.org/blog/new-cis-benchmark-for-google-cloud-computing-platform/
ModuleNotFoundError: No module named, 今日のpython error(18)

プログラムちょい替え（6）pyhon sin 描画
https://qiita.com/kaizen_nagoya/items/2702bdf0b89b3d841921
用のdocker上で
docker(89) dockerでpython2, python3
https://qiita.com/kaizen_nagoya/items/ecbe11a4d743357134d5
で作ったdockerから起動して、

```shell-session:docker/ubuntu
# python3 sin3d.py
Traceback (most recent call last):
  File "sin3d.py", line 6, in <module>
    import matplotlib.pyplot as plt
ModuleNotFoundError: No module named 'matplotlib'
```

今日のpip error: Building wheel for subprocess32 (setup.py) ... error
https://qiita.com/kaizen_nagoya/items/f1665b45955118934ee9

今、ここ。

pip3 install matplotlib
とpython3だけ導入して先に進む。

# Reference
Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴(document history)
ver. 0.01 初稿 20191231
ver. 0.04 URL追記　20230302
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Karabiner-Elements の shell_command は /usr/local/bin に PATH が通っていない

Karabiner-Elements の Complex modifications では `shell_command` という項目があり、キー入力に対してコマンドを実行するような設定を記述することができる。

[to event definition - karabiner.json Reference Manual](https://pqrs.org/osx/karabiner/json.html#to-event-definition)

便利そうなのでさっそく試してみるも、なかなかうまく動かずに苦戦した。
設定ファイルを書き換えるたびに Karabiner-Elements を再起動しないといけなかったり、コマンド実行時のエラーを `2>$HOME/error.log` みたくファイルに吐き出さないとデバッグできなかったりと、試行錯誤するのも楽ではない。

試行錯誤する中で少しハマったのが、 `/usr/local/bin` に PATH が通っていない件。

試しに、shell_command の実行時にどんな環境変数が設定されているのかを確認してみる。

``` json
{
    "type": "basic",
    "from": {
        "key_code": "open_bracket",
        "modifiers": {
            "mandatory": [
                "left_control",
                "left_shift"
            ]
        }
    },
    "to": {
        "shell_command": "env > $HOME/env.txt"
    }
}
```

このような割り当てを追加する設定を追記して、Karabiner-Elements を再起動する。

この例では `control` + `shift` + `[` で環境変数がファイルに書き出される設定なので、そのキーを押してファイルを確認する。

``` sh:~/env.txt
SHELL=/bin/zsh
USER=hoto
PATH=/usr/bin:/bin:/usr/sbin:/sbin
PWD=/
HOME=/Users/hoto
```

(他にもいくつかあったが代表的なもののみを表示)

これをみると `/usr/local/bin` に PATH が通っていないことがわかる。
このままだと Homebrew で入れたコマンドなどを使う場合はフルパスで指定しないと動かない。

``` json
"to": {
    "shell_command": "PATH=$PATH:/usr/local/bin oysttyer 'foooooooo!'"
}
```

最終的にはこんな感じで PATH を通すことにした。

あまりスマートな書き方ではない気がするので、もっといい方法があったら教えて欲しい。
「コンピュータはなぜ動くのか」メモ①

新卒で入り早５年目。
SEとして伸びたいと思いつつも、学んでいく知識が何ひとつ線にならなくて、仕事をしていても「なんとなくわかるようでわからないな〜」と思い続けていました。

ふと、<b>「コンピュータの基礎的な知識が抜けているのでは？」</b>と思うようになり、いわゆるIT系名著（？）を年末年始に読んでみることにしました。

まず一冊目は<b>「コンピュータはなぜ動くのか」</b>。
大学院（医学系）を中退し、勢いで外資ITに入ったのはいいけれど、新人研修についていくことに必死で他に自分で学ぶようなことはしていなかったので…
（プログラミング言語に関してはeラーニングしていましたが）

今思えば、何を勉強すべきかわかっていなかったのだと思います。
イメージで「プログラミング言語を理解することは必須だよね」とプログラミング言語を選んだだけだし。
しかし、今年たまたま行かせてもらった研修で、<b>「ハードウェアの知識もゼロだし、やばすぎ（＝知識の欠如が甚だしくて致命的）ん？」</b>と思い、一通りハードウェア・ソフトウェアの基礎を学ぶべきだなと感じました。

そこで、コンピュータサイエンス（以下CS）の本を買って読んでみたり、edEXやcourseで米国の大学のCS課程のコースを取ってみたりしたのですが、英語で授業をとったせいかいまいち理解できた気がせず…

そしてさらに、「ただ読むだけじゃダメだよね〜。知識にしないと」と思っていたので、単純ではあるがQiitaにアウトプットすることにしました。

そんなわけで、この業界の人は読んだことがある本だとは思うのですが、今後は読んだ本をメモ的にまとめておきたいと思います。

--------------
●コンピュータはなぜ動くのか〜知っておきたいハードウエア＆ソフトウエアの基礎知識」
ー矢沢久雄 著/日経ソフトウエア監修

第1章：コンピュータの３大原則とは

■コンピュータの３大原則
　1. コンピュータは、入力・演算・出力を行う装置である（ハードウェアの基本）
　2. プログラムは、命令とデータの集合体である（ソフトウェアの基本）
　3. コンピュータの都合は、人間の感覚と異なる場合がある

・どんな複雑な機能も入力/演算/出力を一つの単位として組み合わせたもの
・プログラムはコンピュータに対する命令を書き並べたもの
・プログラミングでのひとかたまりの命令群　＝　「サブルーチン」「関数」「ステートメント」「メソッド」「副プログラム」
・データ　＝　命令の対象となる入力情報　または　命令の結果によって得られる出力情報

・人が書くもの/理解するもの　＝　ソースコード（一般的にいう「プログラミング言語」）
・機会が理解するもの　＝　ネイティブ・コード（機械語・マシン語）
・ソースコードからネイティブコードに変換すること　＝　コンパイル

・そもそもコンピュータは「人間の（手）作業を効率化するためのもの」
・コンピュータにとって全ては「数値」


第2章：コンピュータを作ってみよう

・コンピュータの内部は主にIC（集積回路）と呼ばれる部品から構成されている
・ICは主に「CPU」「メモリ」「I/O」
　　→CPU（Central Processing Unit）　＝　コンピュータの頭脳、プログラムを解釈・実行する
　　→メモリ　＝　プログラムやデータを記録する
　　→I/O(Input/Output) ＝　コンピュータと外部装置（周辺装置）を接続する

・CPUを動作させるためには「クロック信号（時計のようにカチカチと電圧の高低を繰り返す電気信号）」が必要
・クロック信号を出力する部品（クロック・ジェネレータ）は、中にある水晶が周波数に応じてクロック信号を発生する
・抵抗　＝　電流の流れを妨げ、電圧を定価させる素子
・集合抵抗　＝　敗戦の手間を省くために、複数の抵抗を１つの部品に収めたもの
・コンデンサ　＝　電気を貯める素子（単位：ファラド）
・ICのピンの番号は反時計回り、ピンの役割を表す略号（RD、WRなど）をICの図記号の中に書く

---------------

今日はここまで！
第3章以降は明日以降に。
Pd メモ

# linesとvline~

line は指定した間隔でアップデートされる。標準は20ms (50Hz)

src/d_ctl.c

この line のチュートリアルがとても参考になる。
https://forum.pdpatchrepo.info/topic/5315/line-line-vline-and-adsr-envelopes

t a b で、2.5 として来た値を a(anything) やb(bang)

line~ はサンプリングレート / block サイズでしか更新されないので、

vline~ の引数
値 変化する時間 wait, ...
0, 1 5, 0.2 50 50, 0 1000 55
wait は開始からの時間
同じ時間waitする場合は左優先

loadbang -> unpack で生成時のパラメータを取れる


# midi 再生
以下のサイトを
http://d-info.jp/archives/258


# slider
sliderにはsend symbolとreceive symbolが設定できるらしい