OmniAICreator/Qiita-1.07M huggingface dataset:
ざっくりwebpack ~その弐~

# 概要
[ざっくりwebpack ~その壱~](https://qiita.com/HeRooooo/items/16b2ad16701b131550bc) の続き
前回は入出力の設定とビルドまでしたのでその続きをやってみる

# まずブラウザで見たい
画面みずに作業できないし
折角バンドル出来ても実際の動作をブラウザで確認しない事には...
ということでブラウザで見れるようにしようぜ

# 準備しようか
んじゃまずは見るものを用意する

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>ざっくりwebpack</title>
  </head>
  <body>
    <p>はろーうぇぶぱっくでぶさーばー</p>
    <script src="app.bundle.js"></script>
  </body>
</html>
```

適当な`.html`を作ったら、前回ビルドした時に出来た`public/`ディレクトリにぶち込むぜ
ビルドしてたらapp.bundle.jsが出来てると思うけどまぁとりあえずそいつはシカトで

```text
public/
　 ├ index.html <- こいつね
　 └ app.bundle.js
```

これで見るものはOK

# webpack-dev-serverとかいうやつ
誰でも簡単に開発サーバを立てられるモジュール
というわけでパッケージ入れちまおう

```bash:ターミナル
$ yarn add -D webpack-dev-server
```
# webpack-dev-serverの設定
パッケージが入ったら`webpack.config.js`に設定を書いていくぞ

```javascript:webpack.config.js
module.exports = {
  { ...省略 },
  devServer: {
    port: 3007,
    contentBase: path.resolve(__dirname, 'public'),
    watchContentBase: true,
    open: true
  }
}
```
**`port:`**
--
ポート番号を設定できる。この辺は空いてるポートをお好きにどうぞ

**`contentBase:`**
--
どこを基準にサーバ動かしたいかのかを設定する
上で`public/`に`index.html`置いたし、もちろん`public`を起点にしたいよなってことで`public`一択

**`open:`**
--
`webpack-dev-server`を動かしてサーバが立ち上がったと同時にブラウザを開くかどうかの設定

```javascript
open: 'firefox'
```
とか書くとブラウザの指定もできる

**`watchContentBase:`**
--
`livereload`とかいうやつ
ファイルに変更があったら勝手にブラウザリロードして変更箇所が反映されますよーみたいな

# package.jsonにscriptを書く
以上、設定が終わったな
他にも色々設定できるんだけど、それはちゃんと調べなおして別で書いてみるとしよう

とりあえず今回はここまで出来たら`package.json`に追記して動かしてみようぜ

```javascript:package.json
"scripts": {
 "build": "webpack",
 "start": "webpack-dev-server" <- これ
},
```

追記したらコマンド叩く

```bash:ターミナル
$ yarn start
```

ブラウザ立ち上がって`index.html`が見れたよな？見れたよな？？
そしたら続きは其の参でやる。
システム運用をChatOpsからNoOpsでさらに効率化した話

# ChatOpsとNoOpsとは :question: 
## ChatOpsとは？
- 「Chat」と「Ops」という2つのワードを掛け合わせて作られた造語
- チャットサービス（Chat）をベースとして、システム運用（Ops）を行うという意味がある
- みなさんご存知の `Slack`、`Chatwork` などがチャットサービスにあたります

## NoOpsとは？
- 運用のうれしくないことをなくす「**No "Uncomfortable" Ops**」のこと
- システム運用そのものをなくしてしまう“No Ops” という意味で発言されることもある？

# システム運用、監視について私が思うこと :thinking: 
監視ツール、サービスって結構いっぱいある :thinking: 

Zabbix, NewRelic, Mackerel, Prometheus, Nagios, Sensu...etc.

CloudWatch, Datadog, Stackdriver...etc.

なんだこれ、どれ使ったらいいの :question: ってなりません :question: :sweat_drops: この時に私が考えたこと :speech_balloon: :thinking: 
どれも基本的にやってくれることってこんなことですよね :question: 

- モニタリング(Monitoring) :eyes: 
- ロギング(Logging)
- リソース（CPU負荷、メモリ使用率）レポート :chart: 
- アラート（Notification） :alarm_clock: 


・・・ん :question: アラートまではやってくれるけど、それで終わり :question:  :sweat_smile: 

アプリの設計にも同じこと言える

バッチ開発時、エラーはメール or Slackで通知後して終了ってなりがち :sweat: 

え？じゃあアラート来たら家のパソコン開くの :question: もしくは会社行くの :question: 

気持ちよく飲んでる時 :beers: とかすごい嫌じゃない :question: 

可能なら自動 or リモートで簡単に対応したいですよね :exclamation: :question: 

### **そこで ChatOps と NoOps :thumbsup:**

# まずはChatOpsからお話 :speaking_head: 
Chatサービスをベースとして、システム運用(Ops)を行うことを実践してみました :exclamation: 

以前に別の場所で話している資料があるので、こちらをご参照お願いします :exclamation: ぜひ読んでね :bow: 
- [※引用：ChatOpsでシステムの運用が改善された話](https://www.slideshare.net/shinyatakara3/chatops-69577241)

# 続いてNoOpsのお話 :speaking_head: 
NoOps ＝ 運用のうれしくないことをなくす(自動化)するってことと解釈し、実践してみました :thinking: 

アプリの現在の設計が影響して、「定期的に○○しないといけない」とか、「エラー(もしくはアラート)が起きた時に何かしらのOpsをしないといけない」とかってことよくありますよね :question: 

監視ツールからアラートがきた時に何かアクションできればいいはず :thinking: 

通知後にアクションできるやついた :astonished:

### **それできるよ、そうCloudWatchさんならね(ちょっと古いですが・・・ :sweat_smile:) :wink:** 

実は皆さんも既に NoOps してるはず :eyes: 

- CPU負荷監視のアラートからのAutoScaling
- SQS監視にて処理速度低下検知アラートからのAutoScaling
- アラート時にLambda動かしてWEBサーバのプロセス再起動など

## これだ :exclamation:  これでNoOpsしよう :exclamation: 
### :arrow_forward: 今回のNoOps化したい課題
- アプリケーションにて、S3からファイルのDL(download)を繰り返し、削除されないことでEC2のフルディスクによる障害が発生 :sweat_drops: 
    - Slackへアラートがきたら手動対応を繰り返してた :cry: 

### :arrow_forward: 解決策
- [AWS Lambda で CloudWatch アラームからの障害対応自動化 - Qiita](https://qiita.com/quickguard/items/ec398056e4bd006d397e)
    - 先駆者というのはいるもんなんだなと感動しました :sweat_smile: 
    - 今回対応したのはまさに↓これｗ

![97c3784a-ee41-77ae-976b-f7f5c4cdfeef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14268/ff74a45f-1be7-aeff-5765-83c1728acc91.png)

### :arrow_forward: 対応した結果
- 毎朝、アラートが来てないか Slackを確認する手間もなくなり、ChatOpsでコマンド打つこともなくなったので、**ChatOps -> NoOps**化できた :exclamation: :exclamation: :exclamation: 
- アラートが発生しても自動で解決する状態ができた :thumbsup: 

これで心置きなくお酒が飲めますね :beer: :wine_glass: 

開発時、エラーが起きたらメール等での通知っていう設計もありですが

アラートのたびに会社行きたくないので自動復旧させるなら CloudWatch & Lambda でNoOpsかなーと思いました :thinking: 

アプリちゃんと直すまで手動対応なやつは自動化しちゃおう :exclamation: 

それでこそ**エンジニア**・・・ですよね :question: :grin: 

その仕組みが他のPJでも役にたつはず :stuck_out_tongue_closed_eyes:

# まとめ
- 導入する監視ツールと運用(Ops)はセットで考えよう :thinking: 
    - アプリの設計も同じ :wink: 
- 運用時の手動対応をChatOpsで自動化すると会社行かなくていいしスマホ(Slack or Chatwork)で対応できるよ :thumbsup: 
- さらに、NoOps化すると会社行かなくていいし、自動障害対応できるよ

## 皆さんの `Ops` が少しでもハッピー :heart: になりますように :pray:
機械学習のズブの素人が頑張ってQoreSDKを触ってみる

## 登場人物
 
### 俺

機械学習ズブの素人。

### 後輩

機械学習むっちゃできる。

## まず「リザーバコンピューティング」とは何なのか？

俺「よし、とりあえずQoreSDK使ってみっか」

俺「なになに。リザーバコンピューティングとは、多変量時系列データの解析に適しており・・・」

俺「多変量時系列データとはなんぞ・・・」

・・・会社にて・・・

俺「なーなー後輩氏。リザーばコンピューティングとはなんぞ？」

後輩「パイセンそんなことも知らないんっスか？」

後輩「いいっスか先輩？多変量時系列データとは・・・

　　・・・ちゃんとした説明・・・

　　」

俺「（よう分からん）」


要するに、「複数のファクターから形成される時系列データ」で、
声や心音のようなデータが得意

と言う感じで理解した。

## とりあえずやってみよう

### Kaggleからデータを落とす

俺「なんか心音とか声がいいってゆーとったな」

俺「心音はサンプルあったから声をやってみよう」

と言うわけで、[男女別の音声データ](https://www.kaggle.com/primaryobjects/voicegender)を使用してみよう

あとはサンプルを改造するだけでやってみっぞ！

```python:import
from qore_sdk.client import WebQoreClient
from sklearn import model_selection
from sklearn.metrics import accuracy_score, f1_score
from sklearn.neural_network import MLPClassifier
from sklearn.linear_model import LogisticRegression
import time
import numpy as np
import pandas as pd
import json
import os
```

```python:データ分割
csv = pd.read_csv('voice.csv')

ratio = 0.7

df = csv.reindex(np.random.permutation(csv.index)).reset_index(drop=True) # ランダムに並べ替える（ソートされたデータには効果が高い）

# 分割
p = int(ratio * len(csv)) # 分割点を計算
df1 = df.iloc[:p, :]
df2 = df.iloc[p:, :]
```

labelがmale/famaleだったので変換。
あとOne-Hotもしたかったが、以下のコードだとエラーが発生したので0/1とした。

```python:エラーになったコード
train_y = pd.get_dummies(df1['label'])
test_y = pd.get_dummies(df2['label'])
```

↓に変更

```python:変更後
train_y = df1['label'].replace('male', 0).replace('female', 1)
test_y = df2['label'].replace('male', 0).replace('female', 1)
```

ここが悩んだところ。
PandasのDataFrameからjsonに戻せなかったので力技。

```python:型変換
train_x = json.loads(train_x.to_json(orient='values'))
train_y = json.loads(train_y.to_json(orient='values'))
test_x  = json.loads(test_x.to_json(orient='values'))
test_y  = json.loads(test_y.to_json(orient='values'))
```

あとはそのまま

```python:学習
start = time.time()
res = client.classifier_train(X=train_x, Y=train_y)
print(res)
```

```python:計測
res = client.classifier_test(X=test_x, Y=test_y)
print(res)
```

なお、正答率は0.7程度だった。

まあ速いのは間違いなかった。

## 後輩「データを加工するのじゃ」

俺「はっ！そういえば後輩氏がなんか言っとったな。
　　なんか -1〜1にデータを抑えればいい・・・だったか？」

とりあえずでっかいデータをちっさくしよう。

```python:データ補完
csv['skew'] = csv['skew'] / 30
csv['maxdom'] = csv['maxdom'] / 30
csv['mindom'] = csv['mindom'] / 30
csv['meandom'] = csv['meandom'] / 30
csv['dfrange'] = csv['dfrange'] - 1.0
csv['kurt'] = csv['kurt'] / 1200
```

## 再チャレンジ！

結果：0.835

俺「よっしゃ！上がったわ。流石Qore。簡単やな。」


## 衝撃でもない事実

Kaggle先生「最適なデータセットなら99%行くで」

![スクリーンショット 2019-12-13 17.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/42e32cff-802f-b707-1b73-d5a910a78ea2.png)

## 最後に

とりあえずRaspiでも快適に動作しました。
(わざわざRaspi4を使うまでもなかったか・・・)

やはり前処理は大事
明日から前処理をちゃんと勉強して再チャレンジします。
IDEなしでC#のHelloWorld

VisualStudioなどのIDEなしでC#のHelloWorldやってみます。

# 好きなところにソースコードを用意します。

ファイル名: helloworld.cs

```C#
using System;
public static class HelloWorld
{
  public static void Main()
  {
    Console.WriteLine("Hello C#!");
  }
}
```

# ソースコードをコンパイルしてexe形式にします。

## C#の環境を確認

.NET Frameworkがインストールされていれば以下の場所にバージョンごとの.NET Frameworkが存在します。

**32bit Windowsの場合**
%windir%\Microsoft.NET\Framework

**64bit Windowsの場合**
%windir%\Microsoft.NET\Framework64

こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/181c0010-105e-9dd7-97b9-37260f275003.png)

バージョンのディレクトリの配下にcsc.exeというコンパイラが存在します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/ae15a069-0907-f9ae-e218-85390a95e16c.png)

## コンパイルしてみる

```
> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe helloworld.cs
Microsoft (R) Visual C# Compiler version 4.8.3752.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/95df5082-9637-2f6a-1877-bfdcd14868cd.png)

コンパイルエラーはこんな感じに出ます。

```
helloworld.cs(6,35): error CS1002: ; が必要です。
```

## exe実行してみる

```
> .\helloworld.exe
Hello C#!
```
BottomNavigationViewについてと要素を動的に減らしたり


- この記事はAndroid 初心者向け Advent Calendar 2019 の6日目の内容です:snowman2:

# はじめに

- 意外とよく見る系画面の代表格、下に配置されるタブUIの**BottomNavigationView**を取り上げて記事にしてみようと思います。

## BottomNavigationViewって:thinking:

- MaterialDesignComponents に含まれるUIコンポーネント
- アプリの**主要画面**の切り替えを行えるようにするもの
    - 主要画面（メインとなるもの）**でない**画面を配置しては:x:
    - 何を配置すべきかという事を意識して使用するように:o:

　　[BottomNavigationについて](https://material.io/components/bottom-navigation/#)

ね、このUIよくみませんか？:grinning:

## BottomNavigationを使用したAndroidアプリをつくる

- AndroidStudio に含まれる、ProjectTemplateを利用してサクッと:relaxed:
- [File] -> [New] -> [New Project]を選択
- ProjectTempleteで**BottomNavigationActivity**を選択

<img width="907" alt="image01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495289/05f93dbf-c05a-00b3-afd5-2c13e373f154.png">

### 生成されたプロジェクト一式をみると、大まかな実装が見えてくるのおすすめ:point_up:

#### MainActivity
- メインという名の通り、元となるActivityクラス
- この中でBottomNavigationViewを管理
    - 表示項目は`menu/bottom_nav_menu`に記載
- 画面遷移処理は、`navigation/mobile_navigation`で記載

#### HomeFragment / HomeViewModel
- Homeタブ選択時に表示される`Fragment`と`ViewModel`部分
- タブに対応したFragmentという役割
- Dashboard も Notification も同じ役割となる
- `menu`のIDと`navigation`のIDを同じものにすると連動してくれる:point_up:

![device-2019-12-04-144954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495289/7d45b023-6df2-c99b-5888-4e7c201238b9.png)


## 要素を動的に減らしたり

- アプリの状態で一部の主要機能を使用させたくないという場合の対応
- :bangbang:注意:bangbang:
    - BottomNavigation は最小3個、最大5個の範囲内で使うのが推奨されています。
    - 今回の話では 3個 <-> 2個 に減らしているので、例としては良くなかったり:frowning2:

### 消し方＆戻し方
- BottomNavigationViewの表示項目は`menu`が管理しているので、子要素を探す（`findViewById()`）するのではなく、`menu`から`findItem()`で取得した`Menuitem`に対して設定の変更を実施

``` MainActivity.kt

    private fun changeVisibleStatusTabId(id : Int , isVisible : Boolean){
        val navView: BottomNavigationView = findViewById(R.id.nav_view)
        navView.menu.findItem(id)?.also {
            it.isVisible = isVisible
        }
    }
```

### さいごに
- BottomNavigationViewはよくみかけるUIコンポーネントですが、推奨されたのは、Android OS 8（26.1）あたり
    - iOS では**Tab Bars**というコンポーネントで、初期からあった
    - 最近に使用できるようになったコンポーネントで、それまでは各アプリで実装していた代表格:sweat:
    - ただ、iOSのように画面の管理といった機能は無いので、そのあたりは自分で実装する必要がある:cry:
    - バッジの表示といった追加機能もあるが`alphaバージョン` or `betaバージョン`を使う必要があったり
    - ただ、自分で作るよりかははるかに楽だよねというコンポーネントでした:relaxed:


これからも楽しいアプリケーション開発を:dancers:
Robloxで追いかけてくる警察をつくる

# 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/695a796b-b454-1917-ddc0-d67c1afe6698.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/c2b5cdde-1e1f-da73-2f5f-b268ddf32bd2.png)


# 全体のフォルダ構成
- workspace下にFolderを追加。名前はTeleportとか適当につけておきましょう。
- その中に、Toolboxから持ってきたNPCを配置
- 捕まったときに飛ばされる先のテレポートブロックStartPointを配置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/872848c2-b788-920f-732c-6bcc964d4577.png)


# NPCのフォルダ構成
- Toolboxの中のNPCは、誰かがつくったスクリプトがくっついている可能性が高いので、あれば消しちゃいましょう
 - HealthとかSoundとかAnimateとか、NPCの行動に関係なさそうなスクリプトは残しておいていいです
- 消した上で、今回つかう「Catch」という名前のスクリプトを作りましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206887/fd47241d-c453-40bd-61a2-f935c89ca751.png)


# プログラミング
- テレポートについて復習したい人はこちらを参考にどうぞ

> https://blog.mitsuruog.info/2019/04/roblox-teleport-block

- こちらがNPCにつけるスクリプトになります

```Catch.lua
-- 捕まったときにプレイヤーが戻される場所のオブジェクト
local StartPoint = script.Parent.Parent.StartPoint

-- 何かにぶつかったとき、それが人間だったら、その人間をStartPointへ飛ばす
function onTouched(hit)
	local humanoid = hit.Parent:FindFirstChild("HumanoidRootPart")
	if humanoid then
		humanoid.CFrame = StartPoint.CFrame + Vector3.new(0, 5, 0)
	end
end

-- ほかく者のオブジェクト
local Figure = script.Parent
-- ほかく者のHumanoidオブジェクト
local Humanoid = Figure:FindFirstChild("Humanoid")

-- ほかく者のHumanoidオブジェクトにふれたときに、onTouched関数が起動する
-- ほかく者のオブジェクト（Model）にはTouchedメソッドがついてない
-- なので、わざわざほかく者のHumanoidオブジェクトを上で準備している
Humanoid.Touched:connect(onTouched)

-- ずっと繰り返す
while true do
	-- ちょっと待つ
	wait(math.random(2, 6))
	
	-- 追いかける相手を決めるためにつかう変数
	local targetPlayer
	
	-- オンラインプレイで複数プレイヤーがいる場合、その中からランダムに追いかける相手をえらぶ
	-- しかし、GetService("Players")ではプレイヤーの名前やIDはわかっても、座標がわからない
	-- なぜかというと、GetService("Players")で取得しているのは、Workspace内のプレイヤーオブジェクトではなく
	-- workspaceと並んでいるPlyersというフォルダの中のプレイヤーオブジェクトのため。
	-- このプレイヤーオブジェクトは名前やIDしか持っていない。
	local targetPlayer_list = {}
	local Players = game:GetService("Players")
	for i, player in pairs(Players:GetPlayers()) do
		targetPlayer_list[i] = player
	end	
	targetPlayer = targetPlayer_list[math.random(1, #targetPlayer_list)]
	
	-- GetService("Players")で取得したプレイヤーの名前をつかって
	-- workspace内のプレイヤーオブジェクトを探している
	local targetPlayer_obj = workspace:FindFirstChild(targetPlayer.Name)
	
	-- workspace内のプレイヤーオブジェクトの場所へむかって動く
	Humanoid:MoveTo(targetPlayer_obj.HumanoidRootPart.Position)
end
```
Visual Studio Code のターミナルが別Windowで立ち上がってしまうようになった

いつからか、何をしたからなのかわからないが、ターミナルが Visual Studio Code 内で起動されず、別Windowで立ち上がるようになってしまった。

ネットで調べても出て来ず、ほったからかしにしてたが、やっと原因がわかった。

#### Windowsで、Visual Studio Code の統合ターミナルとして、cmd/PowerShellが起動するように戻す方法 
1. コマンドプロンプトを立ち上げる
2. コマンドプロンプトのプロパティ ＞ オプションタブ
3. 「レガシコンソールを使用する」のチェックを外す
Compute ShaderとFragment Shaderのレイマーチング での速度検証

# はじめに

Pixel Sortを実装しようと四苦八苦していた時にCompute ShaderでのRWTextureへのランダムアクセスがかなり遅い印象を受けた。そこで、テクスチャへのランダムアクセスを使わないGPU処理においては、ラスタライズなどのパイプラインの機能をフルに起動しないことでCompute Shaderの方がFragment Shaderより処理速度が早くなるのではないかと思い、実験した。結果としてはほぼ変化がなかったが、私の実行環境ではRadeonと古いGeforceでのみFragment Shaderの方が若干速くなっていた。ここでは実験方法、得られた結果のプロットと実験環境をまとめる。
また、実験に使ったプロジェクトは以下のリポジトリで公開している。
https://github.com/Kuyuri-Iroha/compute_fragment_test

# 実験

## 実験方法

まず、今回行う実験では実際の処理速度に重きを置いて実験をしたかったこともあり、Unityのレンダリング統計ウィンドウのTime per frame(ms)を評価することとした。Time per frameの値は、実行画面を動画として撮影。撮影した動画の開始20秒を除いた30秒間を3秒ごとにサンプリングしたものを各実行環境で取得し、その平均値を処理時間として評価した。

## 実験環境

また、実験環境は以下の5つのPCとする。

- Windows Desktop 1
    - Intel Core i9-9900K (オーバークロックなし）
    - 16GB RAM
    - GeForce RTX 2070 (8GB VRAM)
- Windows Desktop 2
    - Intel Core i7-4770K（オーバークロックなし）
    - 16GB RAM
    - GeForce GTX 770 (2GB VRAM)
- Windows Laptop
    - Intel Core i7-4710MQ
    - 8GB RAM
    - GeForce GTX 960M (2GB VRAM)
- Macbook Pro
    - Intel Core i7-7567U
    - 16GB RAM
    - Intel Iris Plus Graphics 650 (1.5GB VRAM)
- iMac
    - Intel Core i5
    - 16GB RAM
    - Radeon Pro 555 (2GB VRM)

## 実験用プログラム

実験用プログラムはinigo quilez氏の[Iterations - inversion 2](https://www.shadertoy.com/view/4t3SzN)をCgへの書き換えた後、`#define AA 4`に変更、72行目をコメントアウトしたものを使用した。また、描画サイズは400x400で統一した。
Compute Shaderでは、ARGB32のRenderTextureに出力して、PlaneのUnlitマテリアルのTextureとして設定することでレイマーチングを実行。スレッド数は`(20, 20, 1)`、グループ数は`(20, 20, 1)`としている。
Fragment Shaderでは、ARGB32の空のTexture2Dをsrc、同じくARGB32のRenderTextureをdestとして`Graphics.Blit`を実行する形の実装とした。マテリアルとTextureの設定はCompute Shaderと同様の処理にて行っている。

# 実験結果

|                 | Windows Desktop 1 (ms) | Windows Desktop 2 (ms) | Windows Laptop (ms) | Macbook Pro (ms) | iMac (ms) |
|-----------------|------------------------|------------------------|---------------------|------------------|-----------|
| Compute Shader  | 15.5                   | 18.6                   | 40.6                | 146.1            | 110.3     |
| Fragment Shader | 15.3                   | 18.7                   | 37.8                | 147.7            | 81.2      |
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242966/c520e1fb-3e84-9a01-1f59-155d97cae7f5.png)


結果としてはこのようになった。どのPCにおいても実行速度にほとんど差はなかったが、RadeonのiMacのみFragment Shaderの方が速いという結果になった。
正直この差についてはサンプル数が少ないためなんとも言えないが、5つの中では一番古いWindows Laptopも若干Fragment Shaderの方が速かった。そのため、2次元の画像として扱えるデータならFragment Shaderで計算した方が良さげである。

# おわりに

最初はCompute Shaderの方が速いんじゃないかという期待を持って実験を始めたので、結果としてかなり残念なものとなった。しかし、Compute Shader使いたいマンであった私に待ったをかけることになったので、それだけでも私にとっては有意義である。また、Compute Shaderは1次元であっても3次元であっても直感的に記述できるため、この程度の処理速度差であれば十分選択肢に入るということが検証できたわけでもあるので、今後より身近に使っていければと思う。
【swift】xcodeの基礎ショートカット/文法

 - cmd + R : ビルドラン
 - ctr + E : 行の最後に移動  
 - ctr + A : 行の最初に移動   
 - cmd + shift + F(O) : プロジェクト内検索  
 - cmd + クリック : そこへとぶ  
 - ctr + i : インデントの調整(範囲選択が必要)  
 - option + クリック : クラスを2画面ひらける  
 - cmd + option + / : メソッドのコメント 
 
 ```sample.swift
// 変数
var
// 定数
let
// null
nill
// 数字を文字列に変換  
string(a)
// boolean
var a : Bool = true
// 関数(戻り値->int)
func myFunc(value:Int)->Int{  }
// 画像をセット
let image = UImage(named:Const.LogoImage)
```
アクセシビリティ(a11y)対応の 「実際に使う・試す側について」の自分メモ


## a11yの必要性

* 過去記事
    * https://qiita.com/SatoshiMukainakano/items/6a23f4ca90579eeff277
    * https://qiita.com/SatoshiMukainakano/items/f38b71d99698576696c9
    * ワールドワイドで見たら、より厳しいとこ多数
    * 自分だって、いつケガしたり、障害もったり、するかわからない
    * ケガや障害じゃなくても、公共の場の利用でもヒントになる


## 実際に使う・試す側を取り巻くあれこれ

※作り始める前段階・途中での 設計・デザイン を検討するときや、実際の分析などに。


### (1) 環境

* 国・地方・範囲
    * 言語、母語、非母語、方言、専門用語
* 居場所
    * 屋内、講堂・暗室、屋外、地下、高層階
    * 都市、高層階、山地農地、海上
    * 立ち入り制限がある区域　（※病院・治療室、公衆トイレ・浴場、管理区域、裁判所・留置場、私有地など）
* その場の状態
    * 降雨下・水中・発雷・強風
    * 熱暑・酷寒・異臭・強い環境光・暗闇・虫類の大量発生・大きな環境音・無音
* 時間
    * 早朝、朝
    * 日中、昼休み、通勤中
    * 夜間、深夜
    * 長時間の継続利用
* その他、特殊な状況
    * 公共の場、通信できない（オフライン）
    * 音を出せない、光を出せない、画面に目を向けられない、画面に手を伸ばせない
    * 据え置き・固定、手に持つ、首からさげる、バンドで体に固定、ポケットやバッグにしまう
    * 法令・処分・権利関係に基づく、情報制限・活動制限　（※親権、契約関係、ストーカー規制法など）
    * 社会情勢、風潮、流行、法令・条例、取り締まり

### (2) 利用者の状態

* 物理位置・動き
    * 静止、立ち止まっている
    * 歩行中・運転中　（※歩きスマホは厳禁。音声案内などのシーン）
    * 電車・バス・タクシー車内、船内、飛行機内　（※通信が禁じられてる状況での利用は厳禁。着陸後などのシーン）
* 時間・経験・シチュエーション
    * 年齢（若年～学生～社会人～中年～高齢）
    * 健康状態（健常、余裕がない・便意尿意、疾病疾患、ケガ、精神状態、発作・特性）
    * 関係（友好的、敵対的、中立的、日和見、虚言的）
    * 興味特性（好戦的、積極的、誰かと一緒ならやる、一人ならやる、守備的、消極的、拒否的）
    * 動機（自発的、反応的、ルーティン・日課、指揮・命令下、取り消し、計画的、衝動的、ランダム、テスト・試行、妄想）
* 能力・方向性
    * ハンディキャップ（四肢、視覚・視力、聴覚・聴力、触覚、発話・語彙、体質・アレルギー・菜食）
    * 行動特性（無計画、軽率・慎重、悪意、破壊的、愉快犯）
    * 経験・熟練度（初心者、知っている、慣れている、使いこなせる、詳しい、マニア）
    * 知識・学習・リテラシー・反応速度・勘違い・思い込み・常識・流行・流行語・世代ギャップ・マナー・主義主張・動機
* 帯同・主副
    * 本人
    * 子ども連れ（だっこ・ベビーカーなど）
    * 保護者、付き添い・付き添われ
    * グループで参加
    * 誰かの代理、誰かに委任
    * 権利が有効、欠格、意図せぬ権利切れ、そもそも権利未獲得

### (3) デバイス

* 出力の種類
    * スマートフォン、タブレット、ノートPC、デスクトップPC、マルチスクリーン、ガラケー
    * ゲーム機、電子書籍ビューワ、プロジェクタ、大型スクリーン
    * ヘッドフォン、インカム、スマートスピーカー、音声プレイヤー
    * 音の高低、ドレミ、自動音声・発語、生身の人間・肉声
    * 点字・地面のパネル、点字ディスプレイ、直接手を引く・誘導・案内する
* 入力の種類
    * キーボード、点字キーボード、数字キーボード、視線入力デバイス
    * マウス、タップ・フリック・ピンチ
    * 音声・発声、脳波
    * 専用装置（コントローラ、タッチパネル、ボタン群）
* スペック
    * 処理・描画スピード、FPS
    * 発色、ピクセルの寸法
    * 画面の大小、寸法、縦長横長、セーフエリア、フロート部品との競合
    * マルチタスク中、バックグラウンドで処理中
* その他、個人設定
    * 画面にフィルタ
    * ダークモード、スキン設定
    * CUI/GUI、WYSIWYG
    * 自動ロボット

### (4) 通信

* メンバーログイン・非ログイン
* 潤沢、混雑、そもそも貧弱、そもそもギガ制限
* 高速低速、大容量、直列的・並列的
* 同期・非同期、避けられないブロッキング
* プロトコル、書式、双方向単方向
* 公開、部分公開、内部のみアクセス可
* サービス事業者側のトラブル、通信事業者側のトラブル、世界的なトラブル
* データ損失・消失、セッション切れ、タイムアウト
* 個人情報の取り扱い







[EOF]
Django REST frameworkをざっくりと説明！

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているErika-Mです。
Django REST frameworkについて学習しているのですが、前提知識が足りていないのでこれを理解するための知識からまとめていきたいと思います。

#Django REST frameworkとは（ざっくり）
「RESTという設計ルールに従って、DjangoでWebAPIの作成をサポートするもの」です。

初見で内容がよくわからなかったので、「REST」「Django」「API」について少し説明を加えていきます。

###REST
Webの設計モデルの一つです。
リソース（ブログの記事や、写真などひとかたまりの情報）を扱うための考え方です。

###Django

Pythonをもとに作られたWebフレームワークのことで、いろいろな機能やWebの仕組みそのものが用意されているため簡単にWeb開発ができます。
詳しいことはこちらの記事、[はじめてのDjango](https://qiita.com/Erika-M/items/7742076aa7c106dbbf48)に書いています。

###API
ソフトウェアが外部アプリケーションとコミュニケーションや連携ができる状態をつくるものです。
WebAPIはWeb上に公開されているAPIで、AmazonやFacebook、Googleなどが身近な例として挙げられます。
例えば、会員登録をする際にGoogleアカウントやYahooアカウントを利用するのもAPIによって行われます。

さて、ここで先程の説明に戻ってみましょう。
「RESTという設計ルールに従って、DjangoでWebAPIの作成をサポートするもの」という意味がだいぶ理解できたのではないでしょうか？

#まとめ
Django REST frameworkのざっくりとした説明をしました。
どのようなものなのかを知ることで、今後の学習の役に立てたらいいなと思います。

#参考
[[Django]Django REST framework入門](https://codelab.website/django-rest-framework/)
[アーキテクチャスタイル「REST」とは何か](https://thinkit.co.jp/free/article/0609/8/4)
[今さら聞けないIT用語：やたらと耳にするけど「API」って何？
](https://data.wingarc.com/what-is-api-16084/2)
[expo][ReactNative]なにかエラーが出たときにまず試すコマンド

# 基本的にキャッシュを疑う
エラー箇所を特定し、修正したが何も変化がない、、、
このような場合、大抵キャッシュが残っているのが原因なので、次のコマンドでexpoを再起動させる。
下記は、キャッシュを削除した上で、expoを起動するコマンドである。

```
expo r -c
```
macの基本ショートカットまとめ

##はじめに
よく使うショートカットをまとめました

##修飾キーの記号

記号 |対応するキー
---|---
⌘ |command
⌃ |control
⌥ |option
⇧ |shift
commandはともかく、その他は結構忘れがち。

##mac全般
ショートカットキー |処理内容
---|---
⌘ + C |選択内容をコピー
⌘ + V |コピーした内容を貼り付ける
⌘ + Z |最後にした操作を取り消す
⌘ + S |変更を保存する
⌘ + ⇧ + S |別名で保存する
⌘ + P |印刷する
⌘ + W |ウィンドウを閉じる
⌘ + A |すべて選択
⌘ + tab |開いているアプリをリスト表示する（tabを複数回押すと切り替える）
⌘ + space |Spotlight検索
⌘ + F |画面内で文字列を検索する
⌘ + T |新しいタブを開く
⌘ + N |新しいウィンドウを開く
⇧ + 上下左右 |文字を選択・選択範囲を変更する
⌘ + R |ブラウザの更新（リロード）
⌘ + delete |ゴミ箱に捨てる
⌘ + Q |アプリケーションを終了する
⌘ + ⌥ + esc |アプリケーションの強制終了

カーソルが虹色になってもうどうにもならなくなったら、`⌘ + ⌥ + esc`で強制終了するか、アクティビティモニタで問題のプロセスを終了しましょう。
アプリケーションはずっと起動していると、メモリがどんどん増加して重くなっていくので、（特にChrome）定期的にアプリケーションを閉じると、PCが重くならず作業できます。

##テキスト入力
ショートカットキー |処理内容
---|---
⌃ + F |カーソルを右へ移動...Forward
⌃ + B |カーソルを左へ移動...Backword
⌃ + P |カーソルを上へ移動...PreviousLine
⌃ + N |カーソルを下へ移動...NextLine
⌃ + A |行の先頭に移動...Ahead
⌃ + E |行末に移動...End
⌃ + D |カーソル右側の文字を削除...Delete
⌃ + H |カーソル左側の文字を削除
⌃ + K |カーソル右側の文字から行末まで削除...KillLine
⌃ + Y |`⌃ + K`で削除した文字を貼り付け
⌃ + O |カーソルの後ろに一行挿入

テキスト入力のショートカットは慣れるとメチャクチャ便利です。ただ、AdobeのIllustratorなどテキストエディタでないものは効かないので注意が必要です。

>#####参考サイト
[Macにおける時短ショートカット](https://boel.jp/tips/vol88_shortcut.html)
[テキスト入力が死ぬほどはかどるMacショートカットキー15個](https://www.find-job.net/startup/mac-shortcut)
Javaをはじめよう - 開発環境をつくる①

#Javaをはじめよう
Javaのプラグラムを組むときは,**IDE(統合開発環境)**を使いましょう。IDE以外でJavaのプログラムを組むにはメモ帳なども使えますが,こちらは軽めのプログラムを試すときに使いましょう(大規模なプログラムを組むには向いていない)。
#IDEをインストールしよう
まず,IDEとは,Javaなどのプログラムを扱うときに効率よくコードを組めるアプリケーションです。
無償で公開されているものもあります。**JDK**とインストールすれば,すぐに使用することができます。
**追記: 今回説明したIDEにはJDKがセットになっているためJDK単体は不要です!!**
> JDKとは,Java SE Development Kit(Java SE開発キット)の略。無料でインストールができます。
今回は詳しい説明は省きます。

代表的なIDEとして**Eclipse**や**IntelliJ IDEA**があります。
しかし単体だとすべて英語となっているため,日本語したい場合は,**Pleiades All in One**というIDEを使い,EclipseやIntelliJ IDEAなどといったIDEを日本語化することができます。
これらを使うことで,大規模なプログラムを効率よく組むことができます。

Eclipse: https://www.eclipse.org/downloads/
IntelliJ IDEA: https://www.jetbrains.com/idea/
Pleiades All in One: https://mergedoc.osdn.jp/

私はEclipseを使っていくので,Eclipseの導入方法を別記事で説明します。
~~記事が完成したらリンクを張っておきます~~~

次) Javaをはじめよう - 開発環境をつくる②
https://qiita.com/_Hage_K/items/08308ff5abd372155fbc
【Android/Kotlin】kotlinでAndroid開発tips

## 多言語対応のstringsファイルのディレクトリ  
 - valuesと同等の階層に置く。valuesのなかにおくと参照できないのでNG。

## onCreateでfindViewByIdをする  
 - メンバー変数でViewを定義せず、  
 xmlのViewをonCreateの中でfindViewByIdしたいときは、  
「as ImageView」をつければOK。

## adapterでsetTagをする意味  
 - adapterの中でsetTagをすると、  
 viewHolderにviewが紐付けられる。  
 - viewHolderは他のActivityなどから参照できるので、  
 viewを紐付けて格納しておきたい。  
 - ただし、「5番目」のViewを取得する、というようなことはできないので、  
 別途ifなどでてらしあわせる処理が必要。  

## switch(トグル)の活性/非活性  
 - isEnable = false : グレーになる  
 - isClickable = false : 指定した色になる  

## クリックまわりで確認すべき仕様  
 - 同じボタンをクリックしてもよいかどうか  
 - 一度クリックされてから他のボタンをクリックできるまでに、  
 インターバルをおくかどうか  
 - アニメーションのかかっている最中に他のボタンをクリックできるかどうか  

##  canvas関係  
 - paint.style = paint.style.fill : ぬりつぶし  
 - paint.style = paint.style.stroke : ぬりつぶしなし  
 - canvas.drawRect : 四角形を描画  
 - canvas.drawArc : 円を描画  

## conttextに？がついてしまうとき  
 - context(=getContext)をすると?がついてしまうので、  
 requireContextを使用すると解消される。  
ただし、内部的には！！のような処理が行われているみたいなので微妙。。  

## scaleanimation関係  
<img width="805" alt=" 2019-12-04 14.48.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275576/7771fe1b-1785-52dc-81d8-4750179c119a.png">
<img width="602" alt=" 2019-12-04 14.52.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275576/013af9ce-6910-c4b2-bb91-2d9d305a83fd.png">
Raspberry Pi で ADS1115 を使う

Adafruit のライブラリーを使って、A/D コンバーター　ADS1115 を使う方法です。

参考ページ
[Adafruit_CircuitPython_ADS1x15](https://github.com/adafruit/Adafruit_CircuitPython_ADS1x15)


インストール

```bash
sudo pip3 install adafruit-circuitpython-ads1x15
```

コードのクローン

```bash
git clone https://github.com/adafruit/Adafruit_CircuitPython_ADS1x15
```

サンプルコードのあるフォルダーに移動

```bash
cd Adafruit_CircuitPython_ADS1x15/examples
```

サンプルプログラムを実行

```text
$ python3 ./ads1115_simpletest.py 
  raw       v
   -1   -0.000
    0   -0.000
    0   -0.000
   -1   -0.000
   -1   -0.000
   -1   -0.000
```

この時の　I2C のアドレス

```bash
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 
```
Ruby on RailsでBasic認証を実装する方法

Ruby on RailsでBasic認証を実装する方法について説明します。

##Basic認証とは
HTTP通信の規格に備え付けられているユーザー認証の仕組み
サーバーと通信が可能なユーザーとパスワードがあらかじめ設定されており、それを知るユーザーのみがアプリケーションを利用できる仕組み

##導入方法
Ruby on RailsにはBasic認証を導入する為のメソッドが用意されている
メソッド　**authenticate_or_request_with_http_basic** 

```ruby
authenticate_or_request_with_http_basic do |username, password|
  username == '設定したいユーザー名' && password == '設定したいパスワード'
end
```

これで実装できます。　Basic認証のログイン要求を全てのコントローラで行う場合が多いと思うのでbefore_actionに設定しとくと良いかもです!
5分で理解するWebAuthn@2019

2019年はWebAuthnへの対応が随分進みました。
しかしながら、WebAuthnの情報は先駆者が走ったあと、後進へのバトンが綺麗に途切れています。
初学者向けに「今から調べるんだけど何から調べたらいいの？」「使えるのか？使えないのか？導入って大変なの？」といった丁度いいサイズの情報をまとめました。

# WebAuthnとは何か？

- 2018/4/10 W3C勧告候補
- 2019/3/04 W3C正式勧告

今年になり、W3Cで正式勧告しまして、Win/Mac/Android/iOSといったOSの主要ブラウザで採用が進んでいます。
WebAuthnはパスワードレス認証(UAF)と、2要素認証(U2F)の2通りの方式があり、これまでのパスワードだけの認証から、公開鍵暗号を用いた認証にすることで堅牢な認証を実現します。
詳しくは[FIDOの仕組み](https://fidoalliance.org/fido%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF/?lang=ja)を参照ください。

# WebAuthnを導入する

現在は、クラウドの認証基盤ではWebAuthnの導入が進んでいます。
今後は自社認証サーバーへの導入が進んでいくと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/9fd21485-4797-c7dd-4a23-6f212d3759b5.png)

ここでは図の赤字の自社認証サーバーに焦点を当てて書きます。

# WebAuthn対応状況

主要ブラウザやOS(Win/Mac/Android)はほぼ対応しています。
ただiOSの対応は不十分な状況です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/f02cf3e3-ea9b-d824-faa8-9e995fedbbfd.png)

https://caniuse.com/#search=webauthn

MacのSafariではTouch IDや、Yubicoのデバイスに対応していますが、
iOS13.3ではYubicoのデバイスのみが対応している状況です。(2019年12月現在)

![WebAuthn201912 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/2b98a9ee-1b25-0ec1-16f5-570b019552a4.jpeg)

今後Appleで対応が進むか、主要ブラウザで独自実装が待たれます。

# どのようにして導入するか？

自社認証サーバーにはどうやって組み込めばよいでしょうか？

[Web Authentication: An API for accessing Public Key Credentials Level 1](https://www.w3.org/TR/webauthn/) に実装に必要なAPIの情報が書かれています。
ぱっと見ても実装や学習コストが高いことが肌感で解ると思います。

そこで、現在オープンソースで、.Net/Java/Goの準拠したコードが公開しています。
[herrjemand/awesome-webauthn](https://github.com/herrjemand/awesome-webauthn)を見ますと認定済み(CERTIFIED)と準拠(COMPLIANT)が見受けれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/bacf4d03-f054-c87b-f262-3113f9437d50.png)

準拠しているかは、[遵守の自己評価テスト](https://fidoalliance.org/%e8%aa%8d%e5%ae%9a%e3%81%ae%e6%a6%82%e8%a6%81/%e8%aa%8d%e5%ae%9a%e3%81%ae%e6%a6%82%e8%a6%81/%e9%81%b5%e5%ae%88%e3%81%ae%e8%87%aa%e5%b7%b1%e8%a9%95%e4%be%a1%e3%83%86%e3%82%b9%e3%83%88/?lang=ja)のテストツール(FIDO Conformance Tool)を用いて評価したようです。
※ テストツールは登録制になります。

これまでは自力でWebAuthn APIに対応が必要でしたが、準拠したコードがあるのは非常に助かります。
導入には、コードの必要な箇所を修正し、マイクロサービスとして実装するか、バインディングやシステムコールで実装することが考えれます。
また、最近になりRubyのコード[cedarcode/webauthn-ruby](https://github.com/cedarcode/webauthn-ruby/pull/280)も準拠したそうです。

# 動作検証

先程のテストツールで準拠の確認や、[相互運用性テスト](https://fidoalliance.org/%E8%AA%8D%E5%AE%9A%E3%81%AE%E6%A6%82%E8%A6%81/%E7%9B%B8%E4%BA%92%E9%81%8B%E7%94%A8%E6%80%A7%E3%83%86%E3%82%B9%E3%83%88/?lang=ja)で認定済みになるのが筋道です。
ただし、定期的に動作しているか確認するにはCIツールを利用してのテストを考えておく必要があります。

# おわりに

ここまでで、それなりに導入の敷居が高いことが解りました。
クラウド大手で導入が進むのも納得です。
テストツール(FIDO Conformance Tool)についても登録制であったり、導入が簡単になるようなエコシステムの発展が待たれます。
結論としては、対応しているクラウドのSSOを使うのが最も簡単となりますが、冒頭の導入にあった自社認証サーバーを持つシステムはそれなりに存在しますので、安全なWebを実現する為にもぜひ導入に踏み切ってもらえればと思います。
Raspberry Pi ファイルをRAMに保存

# はじめに
Raspberry Pi にちょっとしたログを残したい事がありませんか?
しかし，SDカードに書き込むとSDカードの寿命が短くなってしまいます。
そこで，RAMに保存してログを確認する方法を紹介いたします。
(ただし，シャットダウンするとデータは揮発します。)

# 環境
- Raspberry Pi model 3 B
- Raspbian OS
- ユーザ名: Pi

# RAMディスクの作成
保存先ディレクトリを作成します。
今回は，/home/pi ディレクトリ下にhogeディレクトリを作成し，hogeディレクトリ下をRAMディスクにします。

``` sh
$ mkdir ~/hoge
```

/etc/fstab を編集してRAMディスクにします。
容量はとりあえず32MBにします。

``` sh:/etc/fstab　

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p5  /boot           vfat    defaults          0       2
/dev/mmcblk0p6  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
#### ramdisk
# 以下を追加
tmpfs           /home/pi/hoge    tmpfs   defaults,size=32m 0       0
```

編集が終わったら再起動します。
df -h コマンドで/home/pi/hoge がRAMとしてマウントされているか確認します。

```sh
df -h
 
ファイルシス   サイズ  使用  残り 使用% マウント位置
----------             省略                ----------
tmpfs             32M  8.0K   32M    1% /home/pi/hoge
```

これで，/home/pi/hoge ディレクトリにファイルを保存すると，RAMに書き込まれた事になります。
再起動するとデータが消えるため，気をつけてください。
VDI環境を使ってみた

# 概要
VDI環境のAWS workspacesを業務で利用してみました。
ローカル端末と比較して、なかなか利点を感じましたので、その内容を共有します。

# VDIとは
VDIとは
> wikipedia wrote:
 仮想デスクトップインフラストラクチャー (VDI：virtual desktop infrastructure もしくは virtual desktop interface) とは、仮想環境のためのハードウェアとソフトウェアを含むデスクトップ仮想化のためのサーバーシステムを指す

です。AWS workspacesに特化した書き方をすると、クラウド上であがってるOSにリモートデスクトップしてる環境になります。

# ここが良き
- 複数端末から同じ環境を利用できる（業務上、４か所から使用しておりておても便利）
- 作業中の状態のまま切断、再開できる
- キッティング済みの状態でテンプレートを作成し配布できる
- ID,PWを伝えれば環境を他者と共有できる（物理的に離れている開発メンバーの環境のメンテナンスがしやすい）
- 開発環境構築に邪魔なプロキシがいない
- 端末に情報を残さない
- マルチディスプレイに対応
- ディスク、CPU、メモリの変更が可能
- 料金が月額固定と変動（基本＋時間単価）と柔軟

# ここはわろし
- AWSに障害が起きると何もできなくなる
- FW内からの利用時には、TCPとUDPのポートをあける必要あり（[参考](https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/workspaces-port-requirements.html#health_check)）
- ずっと（何日も）つなげてると入力が遅延しまくる
- 接続ソフトのアップデートがうまくいかない

# 他
- 社内のサーバーとの接続も可らしい
- 専用ソフトから接続する
- ブラウザアプリからの接続も可能
- クライアント証明書認証も可

# 妄想そう
- 開発メンバーが数か月で増減するような現場では非常に有効そう
- ローカル側をゼロクライアントにすればコストも圧縮できそう
- 個人の環境をクラウド化したらPCの買い替えから解放されるのだろうか
【SQL】住所から都道府県だけ抽出する正規表現【PostgreSQL】

カラムには市町村まで入っているが都道府県単位で集計したいときに便利


```sql
SELECT 
    SUBSTRING(table.city FROM '東京都|北海道|(?:京都|大阪)府|.{2,3}県') todouhuken
FROM table
```

正規表現自体はMysqlやBQとか（なんならプログラミング言語）でも使えるはずなので参考になれば幸いです。
Laravelアプリケーションリリースタイミングでやっておくべき Tips

この記事はLaravel #2 Advent Calendar 2019の3日目になります。
まだ投稿されていないようですので、投稿します。

# 背景

Laravelアプリケーションをリリースする際に、やっておくべきTipsを共有がてら。

## アプリケーションをメンテナンスモードにする

アプリケーションがメンテナンスモードの時、ステータスコード503でMaintenanceModeException例外が投げられます。

```console
$ php artisan down
```

## メンテナンス中にアクセス許可するIPを指定する

メンテナンスモード中でも開発者は確認をしたいと思うので、アクセスIPを設定します。

```console
$ php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16
```

＊＊Laravel5.5以前だとmiddlewareを編集してアクセスIP許可機能の人力設定が必要の記憶です。

## Laravelアプリケーションを最新化する

masterにリリースするものが全部入っている前提です。

```console
$ git pull origin master
```

## マイグレーション実行

```console
$ php artisan migrate
```

APP_ENV=production
だと確認メッセージがコンソールに出ます。

## composer installを実行する

```console
$ composer install --no-dev
```

** --no-devは必須です!つけないと開発環境用の余計なモジュールが入って、事故の原因となります。

## フロントエンド関連のファイルを本番環境用にコンパイル

```console
$ npm install
$ npm run prod
```

## キャッシュを更新する

```console
$ php artisan cache:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan view:clear
```

## アプリケーションを復帰させる

```console
$ php artisan up
```


## 最後に

これらのコマンドをshellにまとめて実行すれば、ヒューマンエラーも減らせそうです。
CI/CDしている際は、これらを実行するようにすれば多分OKだと思います。

明日は[@izayoi256](https://qiita.com/izayoi256/items/da1a30e9a5a68ab62c44)さんの記事です！
Kotlinのwhen式でEnumを判定した際にコンパイルエラーになるパターンとwarningになるパターン

Kotlinのwhen式は様々な形でパターンマッチを行うことができ便利なので多用している人は多いと思います。
[公式ドキュメント](https://kotlinlang.org/docs/reference/control-flow.html#when-expression)

特にwhen式に対しEnumを指定してやると、Enumの種類を増やした際に `'when' expression must be exhaustive` とコンパイルエラーが出るため、網羅的な判定を型安全に行いたい場合に便利です。
例えば以下のような使い方をするとwhen式の箇所でコンパイルエラーになります。

```kotlin
enum class Type { A, B, C }

fun getName(type: Type): String {
	//ERROR: `Type.C`に対する判定が無い！！
    return when (type) {
        Type.A -> "a"
        Type.B -> "b"
    }
}
```

ところがwhen句にEnumを使ってさえいれば型安全だろうと安心するかもしれませんが、warningが出るのみでコンパイルは通ってしまう危険なケースもあることに注意する必要があります。
以下はwarningが出つつも通ってしまいます。（もし良ければなぜか考えてみてください）

```kotlin
fun outputLog(type: Type) {
    when (type) {
        Type.A -> println("a")
        Type.B -> println("b")
    }
}
```

答えは「when句の結果となる値がどこからも利用されていないためです」。
こういった場合は以下のように強引に`return` をつけてやりreturn Unitしてやることで型安全にすることができます。
※なお、結果の値が利用されさえすればいいので、他の手としては値を変数に一度入れるという手もあります。

```kotlin
fun outputLog(type: Type) {
    return when (type) {
        Type.A -> println("a")
        Type.B -> println("b")
    }
}
```
pythonのintは無限

知ってましたか！pythonのintの表現できる数に上限はないんです！！
Cにおいてのintは32bitなので、最大で2147483647までしか表すことはできません。
大きい数を扱うときに用いるlong longでも64bit、つまり9223372036854775807までしか表せません。
一方で、pythonにおいてのintは無限だと言うのです。

## それじゃあ
上限はないと聞くと、糞でかい数を扱いたくなるのが人情というもの。
ほんとに限界はないのか、また限界がないならその計算時間がいか程かを確かめるため、
簡単な実験をしてみました！
計算にかかる時間と表示するのにかかる時間、2つを以下のコードを元に実際に確認します。

```python:test.py
num_list, time_list = [], []
for i in range(9):
    start = time.time()
    ans = 10 ** (10 ** i)
    end = time.time()
    print('Elapsed time to calculate 10 ** {} is {}'.format(10 ** i, end - start))
    num_list.append(10 ** i)
    time_list.append(end - start)
plt.plot(num_list, time_list)
plt.show()
```

実験結果を以下の表に示します！
分かりづらいですが、表の左端の数字は$10^n$の$n$の部分を表しています。
そのため、表の一番上の欄の100は$10^{100}$を計算、表示するのにかかった時間です。

$10^n$|calculate[s]|print[s]
---|---|---
100|0.000|0.000
1000|0.000|0.000
10000|0.000|0.002992
1e05|0.01562|0.1396
1e06|0.1562|13.27
1e07|5.985|1324
1e08|221.7|-
1e09|8791|-

こんな大きい数でもちゃんと計算できるけど、結構時間かかりますね。
$n$が10倍になると大体計算時間は40倍、表示時間は100倍になりそうな感じがします。
ちなみに、"表示する"とは言っても値が大きすぎてバグってコンソールに表示しきれてません（当然）。
それと、printの1e08と1e09は時間がかかりすぎて飽きたのでNo dataです。
バグって0から表示されている図　→　![print_bag.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419937/c813ae25-9631-1129-6c24-2b0c1afd528e.png)

グラフにしたものが下になります。
上でも触れたように、ぱっと見 指数的に増大しそうですね！
![calculate_time.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419937/e2aa9c15-4ebc-d32d-a17f-78067a3af5d9.png)
![print_time.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419937/3ba65011-ee24-c608-10fd-8ddb0fb438d0.png)

最初はグーゴルプレックスを計算しようと思い始めましたが、そもそも
　　　　$log2(10^{10^{100}}) \simeq 3.32*10^{100}bit = 4.15*10^{87}TB$
だけメモリが必要なので、正味無理な話でした！

# 結果：すごい大きい数が表せる！
<br>
<br>
いかがでしたでしょうか？
ワザップっぽい口調で記事を書こうとしましたが、
ワザップぽい口調ってなんだ？となってしまったのでよくわかんないノリになってます。
補足：プログラム実行中の一人だけがめっちゃ頑張る現代社会の縮図
![resource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419937/29e47660-2cbf-bb96-08af-5fb51017c6a3.png)
Webサービスでの起業をめぐる時代の変化

# 15年前に独立した時

　15年前、ソフトウェア会社の営業を辞職し、フリーランスとのWebプログラマーとして独立した。

　その時は、デファクトスタンダードになっているサービスやソフトもOS、Office、Adobe製品、会計・人事ソフト、検索エンジンぐらいしかなかったように思う。それもローカルアプリ。今とは違う。
　ちょうどmixiが上場するぐらいの時期に独立したが、そのときは、多くの会社がいろいろな分野でのデファクトスタンダードになるため、凌ぎを削り、フリーランスですらそれを狙っている人たちがいた。
　自分もその一人だった。

# 時を経て2019年、各分野でのデファクトスタンダードの確立

　15年前と比べると、OS以外にも、各分野でのデファクトスタンダードとなるサービスやソフトウェアがでてきた。Office365、Kintone、Slack、BackLog、Trello、Wixなどなど上げればきりが無い。
　もう、これらデファクトスタンダードのサービスやアプリを知っている、使いこなすことも一つのリテラシーなんではないかとすら思えてきた。

 
# これから起業する際の方向性(SaaSを使うか、SaaS自体を作るのか）

　昔は、巨人にならんとして起業家がいろいろなアイデアを企画し、製造してきた。その中で成功した企業が今のデファクトスタンダードになっているし、失敗した起業家も数多いるのだと思う。私は、結局何もつくってないので、失敗以前なのだが。

　もう、昔みたいに大きくなった巨人と同じ分野で張り合うよりは、各分野、各サービスを踏まえたうえで、その隙間をつなぐようなサービスをつくっていく必要があると思う。

　競争より協業というスタンスで、既存のデファクトスタンダードの得意分野と不得意なところを把握する
　そのうえで、隙間になっているところを、WebAPIをつくったり、ブラウザプラグインをつくったりする。はたまた、デファクトスタンダードとなるサービスを統合・管理するプラグインアプリなどをつくるのもありかもしれない。
　既存のSaaSの運用を設計する。そして、SaaS間の溝を埋めるサービスを作る。

　もしくは、あえて、巨人と肩を並べるべき、SaaS自体をつくっていくか。
　仮に作る場合でも、認証をはじめ、他のSaaSとの連携はしないと行けない。

　昔と違った、今の時代の、Webサービスでの起業の振る舞い方があるように思う。

　個人的に思うのは、SaaSでできることをわざわざオレオレシステムで実現しようとすることは、バカバカしいと思う。


# Web以外のサービスでは、システムやアプリを作るのではなく、SaaSをつかって「事業・行動スタイル」を早期に形にする

　昔は、システムやアプリをつくることに時間をかけていたが、今は、SaaSをつかえば、あるワークフローをより便利にすることができる。
　
　つまり、事業アイデアを考えることに時間やお金、人を集中させ、それを既存のSaaSで作っていく。システムをつくるのではなく、ほんとうの意味での「サービス」を形にしていく。

　もう、システム開発に無駄なお金や時間を使うのはやめて、事業プラン・サービスを形にいくことを優先的、集中的に行なう時代ではないかとも思う。

　そして、プログラマーも単なるコーダーではなく、こうしたSaaSの運用設計もふくめた、幅広意味での「プログラム」をできるようになるべきだと思う。

# 起業を支えるプログラマとして必要だと思う知識

　有名なIaaS、SaaS、mBaaSとかはとりあえず使ってみる。ガッツリ運用するのもよし。
　あとは、これらのWebAPIを使ってみる。結果的に、JavascriptやTypeScriptなどAltJSとかは使うことになると思う。
 サーバサイドは、Firebaseとかサーバレスを使えばいいので、無理に他の言語を覚えなくても、Javascriptでもなんとかなると思う。たとえば、O365のプラグインもJavascriptでつくる。

　最低限、Javascriptは知っといたほうがいいかも。余力があれば、goやRustなんかを覚えればいいんじゃないかと。サーバサイドはもちろん、WebAssemblyが台頭してくればフロントもいけると思う。
LaTeXiTが沈黙した時の対応

# TL;DR

* LaTeXiTがエラーも出さずにコンパイルできなくなったら、GhostScriptが原因のことがある
* `gs`を実行してみて「Can't find initialization file gs_init.ps.」と言われたらそれ。
* LaTeXiTが参照している`gs-noX11`が、brewで入れたgsを参照するようにすれば解決する。

# LaTeXiTが死んだ

どういうタイミングかわからないのだが、たまにLaTeXiTが「コンパイルはしているっぽいが、プレビューに何も表示されないしエラーも出ない」状態になることがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79744/6ba0ca7e-f941-d011-9b2b-5373332c8dba.png)

この状態で「LaTeX it!」をクリックしても、なんかくるくる回った挙げ句に何も表示されない。

以前もそういう状態になったのだが、しばらくしたら治った。しかし、また同じ症状になったのでちゃんと調べることにした。

# gsを調べてみる

まず、LaTeXiTの「環境設定」→「プログラム」から、実行パスを調べる。デフォルトではこんな感じだと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79744/35bcb461-5f46-fd27-f7af-9819b85af336.png)

注目すべきは以下の二つ。

* Ghostscript (gs): /usr/local/bin/gs-noX11
* ps2pdf : /usr/local/bin/ps2pdf

とりあえず`gs-noX11`を実行してみよう。。

```txt
$ /usr/local/bin/gs-noX11
GPL Ghostscript 9.27: Can't find initialization file gs_init.ps.
```

あ、これが問題ですね。直そう。まず、homebrewでghostscriptを入れてみる。

```txt
$ brew install ghostscript
Warning: ghostscript 9.50 is already installed, it's just not linked
You can use `brew link ghostscript` to link this version.
```

あ、既に入っているけど、リンクが切れているようですね。リンクしようとすると`symlink`を作れませんとか言ってくるので、強制上書きしましょう。

```txt
$ brew link --overwrite ghostscript
Linking /usr/local/Cellar/ghostscript/9.50... 58 symlinks created
```

もう一度`gs`を実行してみる。

```sh
$ gs --version
9.50
```

大丈夫そうだ。`gs-noX11`は？

```txt
$ gs-noX11
GPL Ghostscript 9.27: Can't find initialization file gs_init.ps.
```

ありゃ、だめだ。調べてみると、`/usr/local/bin/gs`は`/usr/local/Cellar/ghostscript/9.50/bin/gs`のシンボリックリンクになっているが、`gs-X11`と`gs-noX11`は古い実体が置かれたままになっている。`gs-noX11`をリネームして、新しい方の`gs`にシンボリックリンクを張ろう。

```txt
$ cd /usr/local/bin
$ sudo mv gs-noX11 gs-noX11.org
$ ln -s gs gs-noX11
```

`gs-noX11`を実行して問題がないことを確認する。

```txt
$ cd
$ gs-noX11
GPL Ghostscript 9.50 (2019-10-15)
Copyright (C) 2019 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.
GS> quit
```

うん、問題ないですね。

この状態でもう一度LaTeXiTを使ってみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79744/c4525c95-bb2b-c215-d3bd-649d6dc3f8f2.png)


できた！

## まとめ

LaTeXiTが突然沈黙したら、それはgsのリンクがおかしくなっているせいかもしれません。

## 参考

* [gs_init.psが見つからない時の対応方法メモ](https://qiita.com/greymd/items/9ca59ad3e6cf10e8a2f6)
blueqatのインストールと量子回路の作成

## この記事について
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は公式の[チュートリアル](https://github.com/Blueqat/Blueqat-tutorials/tree/master/tutorial-ja)を元に作成しています。

## Blueqatに関して
量子ゲート方式の量子コンピュータ回路をシュミレーションしてくれるPythonライブラリです。

パッケージは以下のURLにあります。
Github: https://github.com/Blueqat/Blueqat

#### インストール
```
pip install blueqat
```
コマンド一つでインストールできます。

##回路の作成
量子状態に様々なゲートを施した一覧の流れを量子回路と言います。
量子回路の初期値は全てのビットで $\left|0\right>$ です。

回路の初期状態は`Circuit()`で作ることができます。
あとはこの回路に好きなゲートを`Circuit().x[0].z[0]`と繋げていくだけです。
`[]`の中にはゲートを施すビットの位置を表します。

####実装
```python:sample.ipynb
from blueqat import Circuit

c = Circuit().x[0].z[0]
```
これで`c`は以下の回路を表すことになります。

``` math
\left|0\right> \begin{array}{cccccccc}-&-&\large{X}&-&-&\large{Z}&-&-\end{array}
```
行列では以下の式と同義です。

``` math
Z \times X\left|0\right>
```
※ $\left|0\right>$ に近いゲートから施していくので回路の表示と実際の積の順番は逆になります。

##測定と観測
重ね合わせの状態では $\left|0\right>,\left|1\right>$ のどちらが観測されるかは確率で決まります。
これを実際にプログラミングしてみます。

測定は`m[:]`をつけて行います。(この時点で 0, 1 のどちらかに確定)
観測は`run(shots=x)`で行います。(`x`には測定回数を入れます。)

状態ベクトルを見たい場合は 0, 1 を確定させてはいけないので`m[:]`を置かず、`run()`を繋げます。
(測定しないので確率は関係ないからこの場合`run`の`shots`はいらない。)

####実装
今回はXゲートを考えます。
計算上では $X\left|0\right>=\left|1\right>$ より 1 が100%観測されるはずです。
Xゲートは回路に`.x[]`をつけるとできます。

普通に値を観測する場合

```python:sample.ipynb
from blueqat import Circuit

c = Circuit().x[0]
c.m[:].run(shots=1000)

結果
Counter({'1': 1000})
```
Counterの一つ目の値が観測された値で二つ目の値が観測された回数を表します。

1000回観測して1000回とも1が測定されましたので
100%できちんと1が取れました。

ベクトルを観測する場合

```python:
from blueqat import Circuit

c = Circuit().x[0]
c.run()

結果
array([0.+0.j, 1.+0.j])
```
arrayの中の配列が状態ベクトルです。
きちんと $\left|1\right>$ が取れました。

## まとめ
今回はblueqatを用いて回路作成の流れを説明していきました。
次回は複数量子ビットの操作を説明しようと思います。
自作PCで学ぶコンピュータアーキテクチャ マザーボード メモリ SSD編

# はじめに
3日連続の投稿になります！！
今日は、マザーボードとメモリについて。
自作PCを作り始める前に全く知識がなかった2つのパーツです。
クラウドや様々なツールが溢れる近年にプログラミングを始めた人に取って、メモリやSSDは概念であり、ハードウェアと頭の中で紐づいている人は少ないかもしれません。
ましてや、マザーボードなんて存在すら知らない人が多いでしょう。
今回は、普段お目に触れることの無いこれらを紹介することで、メモリと言われて、ハイハイあれねと頭の中で理解できることが目的です。
それではいってみよう！

## マザーボード
マザーボードって何？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/c3741d40-c041-d3bc-d402-fb5853d282ec.png)

マザーボードとは、
コンピュータなどで利用される、電子装置を構成するために必要となる主要な電子回路基板のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/cb678312-3b06-23ed-b5e4-8f159227a24e.png)

マザーボードはPCの性能を決めるといっても過言では無いです。
部品がかなり多いので、選ぶ際に重要なパーツだけ紹介していきたいと思います。
### CPUソケット
CPUにはIntel製とAMD製の2つがあります。
マザーボードのCPUソケットが、対応しているCPUの種類を決めています。
つまり、Intel規格のマザーボードではIntelのCPUしか使えないということです。
今回はIntelのCPUを購入したので、マザーボードもIntel規格の品にしました。

### メモリスロット
メモリスロットはメモリを挿すパーツで、利用できるメモリと、取り付けできるメモリ数が決まっています。
メモリの規格としてDDRというものがあり、例えば、DDR3のメモリスロットには、DDR3のメモリを挿す必要があります。

### SATAコネクタ
PCでのデータは、ストレージに保存され、電源を落としてもストレージに保存されたデータにアクセスすることが可能になります。具体的には、ストレージに保存されたデータをメモリに送る
主に光学ディスク、HHD、SSDの3つに分けられますが、今回はSSDを購入しました。
マザーボードとSSDの接続はSATAコネクタを通して行われます。


### 余談
マザーボードには対応しているOSが決められているのですね。
自分はLinuxを学びたかった(Windowsに数万も払ってられるかよ)ので、UbuntuをインストールしたUSBをマザーボードに挿したのですが、ディスプレイに何も表示されずに悲しい気持ちになったことがあります。
PCを作っている際にパーツを壊したのかとか初期不良を考えたりしたのですが、そもそもOSが規格とあってなかったらダメだよね。

# メモリ
Crucialのメモリを採用しましった。8GB*2を2つ買ったので32GBです。
まあ十分かなと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/2dc1673c-0343-4429-3ce8-597416aead18.png)

# SSD
256GBぐらいだった気がする。
詳細は後で追加する。

# 最後に
今回、自作PCを購入＆組み立てをしてみて、
10万でこれからの低レイヤーの学習効率が上がるなら安いもんだなと思いました。
おしまい
Azure BlobStorage SDK Java V8 で BlobItemにテキストを追記(Append)する


BlobItem の TYPE が APPEND BLOBとして作成されていないとAppendできないところがポイントでした。

```java
package hello.azure.blobstorage;

import java.util.Date;

import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.BlobRequestOptions;
import com.microsoft.azure.storage.blob.CloudAppendBlob;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;

public class WriteData2 {
	// copy from azure console
	public static final String storageConnectionString = "{yourString}";

	public static void main(String[] args) {
		CloudStorageAccount storageAccount;
		CloudBlobClient blobClient = null;
		CloudBlobContainer container = null;

		String containerName = "{yourContainerName}";
		String blobName = "{yourBlobName}";

		try {
			// Parse the connection string and create a blob client to interact with Blob
			// storage
			storageAccount = CloudStorageAccount.parse(storageConnectionString);
			blobClient = storageAccount.createCloudBlobClient();
			container = blobClient.getContainerReference(containerName);
			{
				CloudAppendBlob cab = container.getAppendBlobReference(blobName);
				if (cab.exists() == false) {
					// BLOB TYPE : Append Blob として作成される
					cab.createOrReplace();
				}
				BlobRequestOptions options = new BlobRequestOptions();
				options.setAbsorbConditionalErrorsOnRetry(true);
				// BLOB TYPE が Append Blob でないとエラーになる
				// Error returned from the service. Http code: 306 and error code:
				// IncorrectBlobType
				cab.appendText("Hello " + new Date() + "\n", "UTF-8", null, options, null);
			}
			System.err.println("finished.");
		} catch (StorageException ex) {
			ex.printStackTrace();
			System.err.println(
					String.format("HttpStatusCode=%d,ErrorCode=%d", ex.getHttpStatusCode(), ex.getErrorCode()));
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {

		}
	}
}
```
『ディープラーニング G検定（ジェネラリスト）公式テキスト』読書メモ：01

2020年3月に開催されるG検定を受験しようと思うので，合格のために，まずはこの教科書を読んでいこうと思います．
読むだけでは，中々頭に入っていかないと思い，ここでアウトプットすることにしました．

## 人工知能（AI)とは 

### 人工知能とは何か

「人工知能（Artificial Intelligence）」という言葉は，1956年にアメリカで開催せれた<font color="Lime">ダートマス会議</font>において，<font color="Lime">ジョン・マッカーシー</font>が初めて使った言葉．

AIの定義は専門家の間でも異なる．

| 中島　秀乃（公立はこだて未来大学学長），武田　英明（国立情報学研究所教授） | 人工的に作られた，知能を持つ実態．あるいはそれを作ろうとすることによって知能自体を研究する分野 |
| ------------------------------------------------------------ | :----------------------------------------------------------- |
| 西田　豊明（京都大学大学院　情報学研究科教授）               | 「知能を持つメカ」ないしは「心を持つメカ」                   |
| 溝口　理一郎（北陸先端科学技術大学院大学教授）               | 人工的に作った知的な振る舞いをするためのもの（システム）     |
| 長尾　真（京都大学名誉教授）                                 | 人間の頭脳活動を極限までシュミレートするシステム             |
| 堀　浩一（東京大学大学院工学系研究科教授）                   | 人工的に作る新しい知能の世界                                 |
| 浅田　稔（大阪大学大学院工学研究科教授）                     | 知能の定義が明確でないため，人工知能を明確に定義できない     |
| 松原　仁（公立はこだて未来大学教授）                         | 究極には人間と区別がつかない人工的な知能のこと               |
| 池上　高志（東京大学大学院総合文化研究科教授）               | 自然にわれわれがペットや人に接触するような，情動と冗談に満ちた相互作用を，物理法則に関係なく，あるいは逆らって，人工的に作り出せるシステム．分析的にわかりたいのではなく，会話したり付き合うことで談話的にわかりたいと思うようなシステム． |
| 山口　高平（慶應義塾大学理工学部教授）                       | 人の知的な振る舞いを模倣・支援・超越するための構成的システム |
| 栗原　聡（電気通信大学大学院情報システム学研究科教授）       | 人工的に作られる知能であるが，その知能のレベルは人を超えているもの |
| 山川　宏（ドワンゴ人工知能研究所所長）                       | 計算機知能のうちで，人間が直接・間接に設計する場合           |
| 松尾　豊（東京大学大学院工学系研究科准教授）                 | 人工的に作られた人間のような知能，ないしそれを作る技術       |



### 人工知能の大まかな分類

周囲の状況（入力）によって行動（出力）を変えるエージェント（プログラム）としてAIを捉えると，4つのレベルに分けることができる．

・レベル1：シンプルな制御プログラム

エアコンの温度調整や洗濯機の水量調整などのように，<font color="Lime">あらかじめ単純な振る舞いが決められている</font>もの

・レベル2：古典的な人工知能

<font color="Lime">探索・推論，知識データを利用することで，状況に応じて極めて複雑な振る舞いをする</font>もの

・レベル3：機械学習を取り入れた人工知能

<font color="Lime">非常に多くのサンプルデータをもとに入力と出力の関係を学習した</font>もの

機械学習では，学習対象となるデータのどのような特徴が学習結果に大きく影響するか（特徴量）が重要．

・レベル4：ディープラーニングを取り入れた人工知能

特徴量を自動的に学習するもの



## 人工知能研究の歴史

### ダートマス会議

先ほども出てきたが，1956年のダートマス会議において，初めて人工知能という言葉が生まれた．
また，同会議において，<font color="Lime">アレン・ニューウェル，ハーバード・サイモン</font>によって，世界初の人工知能プログラムといわれる<font color="Lime">ロジック・セオリスト</font>によって，コンピュータを用いて数学の定理を自動的に証明することが可能であることを示した．

### 人工知能ブーム

これまでに2度AIブームがあり，今は第3次AIブームの真っ最中である．

第1次AIブームは1950年代後半〜1960年代であり，<font color="Lime">推論や探索</font>がブームの要因になった．
しかし，<font color="Lime">トイ・プロブレム</font>は解けても，複雑な現実の問題は解けないことが明らかになり，ブームは冷める．

第2次AIブームは1980年代〜1995年頃であり，<font color="Lime">エキスパートシステム</font>と呼ばれる，データベースに大量の専門知識を入れるアプローチが要因．
しかし，その知識を蓄積・管理することが困難であることが明らかになり，ブームは再び冷める．

第三次AIブームは2012年の画像認識コンテスト「ILSVRC (ImageNet Large Scale Visual Recognition Challenge)」でトロント大学のヒントンが畳み込みニューラルネットワーク(CNN)を使ったAlexnetというモデルが圧勝したことが要因であると言われている．
また，コンピュータの性能が上がったことや，インターネットの普及でデータが集めやすくなったことなども背景にあると考えられる．

ただし，第2次ブームのキーである知識表現も，第3次ブームのキーである機械学習も本質的な技術の提案は第1次ブームの時に既に行われていた．

[次 [探索・推論]](https://qiita.com/yoshiki_1122/items/00ae299fd2b47732ceaa)はこちら
検索について

# 概要
私が使用している検索テクニックをまとめました。

# 基本
```
*
```

検索で使うのは、ほぼこれだけです。

手打ちは面倒です。

検索ワードはファイル内に存在するので移動したほうが早いことが多いです。



# 単語を調べたいけれど、単語までが遠い場合

```
\<aaa\>
```

は、打つの面倒なので

```
/aaa
```

で検索してから、`*`を使用します。

# 単語を打つのが面倒でクリックするのも面倒な場合
```
.
```

で代用します。

```
a...b
```

みたいな感じです。
先頭と末尾だけで合致すれば、ほぼ見つけられます。

```
set incsearch
```
を設定していると検索中にハイライトされて便利です。


# 単語の途中を調べる場合

```
/<c-r><c-w>
```
でカーソルしたをとり、編集します。


# 検索して変更したい場合

```
cgn<c-r>"
```

消して復元して編集します。


# 検索して先頭の文字を変更したい場合

```
5s
```

先頭はこちらも使えます。


# 検索したやつの後ろに移動したい場合

```
//e+1
```

# `//e+1`をもう一回編集する場合

```
/<c-n>
```


# 検索したやつをGrepする場合

```
:vim // %
:vim // *
```


# もう一回検索する
```
//
```

# さいごに
以上です。