OmniAICreator/Qiita-1.07M huggingface dataset:
ビッグデータの背景と技術：Hadoop／NoSQL／クラウド

データ分析基盤の理解を深めるために、[ビッグデータを支える技術](https://amzn.to/3q6n5kY)を学習。2017年9月の本で、もっと新しい技術が出ているかもですが、基礎を学び、まとめていきます。今回は、ビッグデータが定着した背景と技術についてです。
<a href="https://www.amazon.co.jp/%E3%83%93%E3%83%83%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93%E2%80%95%E5%88%BB%E3%80%85%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8C%E8%84%88%E6%89%93%E3%81%A4%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E4%B8%96%E7%95%8C-WEB-DB-PRESS-plus/dp/4774192252/ref=as_li_ss_il?&linkCode=li1&tag=gakutaku-22&linkId=2fd9720aec947c3e101270fe7aa7a573&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4774192252&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=gakutaku-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=gakutaku-22&language=ja_JP&l=li1&o=9&a=4774192252" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# スモールデータDWHとビッグデータDWH

![bigdata-dwh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991759/abf1c578-55c8-2811-9350-87a831af3448.png)

従来（スモールデータ）ではRDB（Relational Data Base）から、DWH（データウェアハウス）にデータを蓄積。データ量が増えるにつれ、大量のデータ処理・大量のデータの蓄積などの問題。また、データ自体も多様化し、RDBで対応できない場合も。

そこで、大量のデータ（ビッグデータ）に対応する技術として「Hadoop」と「NoSQL」。

# Hadoop

Hadoopは「多数のコンピュータで大量のデータ処理を行う」ためのシステム。

Hadoopは元々、Googleで開発された分散処理フレームワーク「MapReduce」を参考に作られていた。MapReduceを動かすために、Java言語によるプログラミングが必要だったが、「Hive」が開発され、SQLのようなクエリ言語でデータ集計できるようになった。

| 時期 | イベント |
|:--|:--|
|2004年12月   |GoogleからMapReduce論文が発表   |
|2007年9月   |Hadoopの最初のバージョン(0.14.1)がリリース   |
|2009年5月   |Hiveの最初のバージョン(0.3.0)がリリース   |
|2011年12月   |Hadoop 1.0.0リリース   |

# NoSQL

NoSQLは伝統的なRDBの制約を取り除くことを目指したデータベースの総称。NoSQLの種類は以下の通り。

|NoSQLの種類 |説明 |
|:--|:--|
|キーバリューストア (KVS)   |多数のキーと値を関連づけて保存   |
|ドキュメントストア   |JSONのような複雑なデータ構造を保存   |
|ワイドカラムストア   |複数のキーを用いて高いスケーラビリティを実現   |

|時期 |イベント  |製品の種類  |
|:--|:--|:--|
|2009年8月   |MongoDB 1.0 リリース   |ドキュメントストア   |
|2010年7月   |CouchDB 1.0 リリース   |ドキュメントストア   |
|2011年9月   |Riak 1.0 リリース   |キーバリューストア   |
|2011年10月   |Cassandra 1.0 リリース   |ワイドカラムストア   |
|2011年12月   |Redis 1.0 リリース   |キーバリューストア   |


# ビッグデータとクラウドサービス

多数のコンビューターで分散処理するためのハードウェアを揃えて管理するのは簡単ではないので、時間単位でリソース確保できるクラウドサービスを利用。
また、大量のデータを蓄積するためのDWHとしてもクラウドサービスを利用。

|時期 |イベント |サービスの特徴 |
|:--|:--|:--|
|2009年4月   |Amazon Elastic MapReduce発表   |クラウド向けHadoop   |
|2010年5月   |Google BigQuery発表   |データウェアハウス   |
|2012年10月   |Azure HDInsight発表   |クラウド向けHadoop   |
|2012年11月   |Amazon Redshift発表   |データウェアハウス   |
自分で撮影した360度動画をOculus Questで描出する方法のまとめ

# Oculusの設定
1) OSを最新版アップデートする
アップデートがうまく行かない場合は、[Oculusの初期化](https://support.oculus.com/298586437740040/?locale=ja_JP)を行うと、OSがアップデートされる
2) Oculusで開発者モードを設定する
[開発環境を設定する](https://developer.oculus.com/documentation/unity/unity-import)を参考に進める。OculusIDとfacebookIDを統合していると進めやすい。


# Unity上に360度画像を表示
とりあえず、Unity上360度画像を出すまでは、[Unityで360度動画を見る方法（Unity2018.1.0）](https://mono-pro.net/archives/6139)の記事を参考に設定する。
ただし、oculus Goでの設定のため、Oculusの設定部分は参考にしない。


# Oculus統合パッケージ(Oculus Integration)のインストール
Asset Storeから[Oculus統合パッケージ(Oculus Integration)](https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022)をインポートする。

# Unityの設定
[Unity設定を構成する](https://developer.oculus.com/documentation/unity/unity-conf-settings/?device=QUEST#build-settings)を見ながら設定を行っていく。

## build settings
![スクリーンショット 2021-01-10 7.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581193/3aee0a68-417c-eca8-5924-cb5781eaac3a.png)

Runデバイスの部分に自身のOculusが認識されない場合は、上述のOculsの開発者モード（[開発環境を設定する](https://developer.oculus.com/documentation/unity/unity-import)を参考）を設定した上で、[開発とテスト用にデバイスを有効にする](https://developer.oculus.com/documentation/unity/unity-enable-device/)を参考に設定する。その後refreshすると自身のデバイスが表示されるはず。

＊ すでに記載済みですが、Oculus Quest2の販売に伴い、OculusIDとfacebookIDの統合が進んでいるため、バラバラな場合は統合しておくと話が進みやすいです。

## project settings
一回ビルドセッティングスを閉じて、[上記](https://developer.oculus.com/documentation/unity/unity-conf-settings/?device=QUEST#build-settings)を参考にして、プロジェクトセッティングを進める

# カメラの設定
![スクリーンショット 2021-01-10 9.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581193/c8e2f7ef-b470-e0ff-4543-fb879c9b93f1.png)
Oculus上で３６０度で画面を表示するために、main cameraを削除し、Assets→Oculus→VR→PrefabsないのOVRCameraRigをHierarchyにドラッグ。
OVRCameraRig→TrackingSpaceのCenterEyeAnchorにSkyboxをadd componentし、表示したい画像のマテリアルを設定する。

# Built and Run!!
上記設定がうまくいけば、自分で撮影した360度画像がOculus questで表示されます！
VSCodeのtask実行でzsh:1: command not found: npmになる。

ターミナル上で実行するのは問題がなくて、~/.zshrcのパスにも以下が追加してあるのですが、タスクを実行するとcommand not foundが発生する。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

VSCodeの設定で、以下をTrueにすると解決しました。

Terminal › Integrated: Inherit Env
新しいシェルが VS Code から環境を継承する必要があるかどうか。これは Windows ではサポートされていません。

Windowsは特に関係無いのかな・・・またWindowsでも確認して追記します。
Mac OS Big Sur で VirtualBox の仮想マシンが起動できない

# 1. 概要

職場の同僚で「Mac OS Big Sur にて VirtualBox 仮想マシンが起動できなくなってしまった」と相談あり、その際の対応メモ。仮想マシンを起動しようとすると以下のようなエラーが出てくる。

![figure13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/13366dd8-2d4b-2407-a8b2-0fcab9b29d2f.png)


`NS_ERROR_FAILURE` とか `Kernel driver not installed (rc=-1908)` とかのメッセージが出力される。。

# 2. 原因・対処方法

※ 自身ではなく他者が出会った事象の又聞きをメモしているので不正確なところがあるかも。
あくまで参考で。

調べてみたところ、以下の記事が。
VirtualBox のバージョンが、MacOS Big Sur に対応していないバージョンであることが原因の可能性が高そう(同僚の VirtualBox のバージョンを調べると、ver6.1.11 だった)。

[参考]
https://macosxlib.net/virtualbox-6116/

ということで一旦 VirtualBox をアンインストールの上、最新版をインストールするように提案したところ、インストール時に以下の画面が出てきて実施できない。

![figure14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/7d3c172f-881b-e471-68cb-46e4818947c5.png)

これについては、
`「システム環境設定」 → 「セキュリティとプライバシー」 → 「一般」` にて、以下のようにアプリケーションの実行許可を出しておく。

![figure15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/b80c48e5-9f4f-4c19-5066-c30c02bf83e0.png)

そうすると最新版の VirtualBox がインストールでき、仮想マシンも無事起動できる。
firebaseでメールアドレスを取得する方法

#Firebaseでユーザネームをメールアドレスを取得する方法

```
export const createUserProfileDocument = (userAuth. additionalData) => {
 if(!userAuth) return;
 
const userRef = firestore.doc(`users/${userAuth.uid}`)

const snapshot = await userRef.get()

if(!snapshot.exists) {
 const {displayName, email} = userAuth;
 const createdAt = new Date();

 try {
  await userRef.set({
   displayName,
   email,
   ...additionalData
  })
} catch (error){
 console.log('error creating user' error.message)
}
}
return userRef
}
```


間違っていたら教えてください
【Laravel】Homestead + Laravel Mix + ReactでBrowsersyncする

公式ドキュメントの情報が薄くて役に立たないため、他の方の記事を参考にした。
しかしうまくいかなかったため、試行錯誤してうまくいった結果だけ残しておく。

# 環境
- MacBook Pro
- Vagrant 2.2.10
- Laravel Homestead 9.5.1
- Laravel Framework 6.20.7
- Laravel Mix 5.0.9
- React 16.14.0

# 設定
watchOptionsとか要らない。

```javascript:/webpack.mix.js
...
mix.browserSync({
    host: 'hoge.test', // proxy.targetと合わせる
    proxy: {
        target: 'http://hoge.test', // /etc/hostsで設定しているドメインのURL
    },
    files: [ // 変更検知してほしいファイルを列挙する
        './resources/**/*',
        './public/**/*',
    ]
});
```

# 起動
watchだと変更検知されないためwatch-pollする。

```bash
$ npm run watch-poll

...
[Browsersync] Proxying: http://hoge.test
[Browsersync] Access URLs:
 ----------------------------------
       Local: http://localhost:3000
    External: http://hoge.test:3000 # ブラウザでこれを開く
 ----------------------------------
          UI: http://localhost:3001
 UI External: http://localhost:3001
 ----------------------------------
[Browsersync] Watching files...
```

画面右上にBrowsersync: connectedと出るため、ファイルを変更してホットリロードされればOK。

# 参考
https://www.browsersync.io/docs/options
Vue.routerでリダイレクト時にスタックトレースが大変なことになる

###vue.routerを使用して認証済以外のアカウントはログイン画面にリダイレクトさせようとしていたら下記のようなエラーが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632987/47f318a4-2385-4f07-5f51-369c9c90e2ec.png)

スタックオーバーフローしてる。
私はログイン画面にリダイレクトさせたいだけなんだ…。

rooter.jsの設定(抜粋)

```
export default new Router({
    // モードの設定
    mode: 'history',
    routes: [
        {
            path: '/login',
            name: login,
            redirect:  '/login',
            component: login
        }
    ]
});
```
気付いた。
'/login'のパスで'/login'にリダイレクトさせるようにしているから、
/loginにアクセスしたら/loginにリダイレクトして…ん？


>**<div><font color="red">redirect:  '/login',</div>**

はい、要りませんね。
解決。
rake routes をしたら、怒られた。yarnのバージョンが低いってばよ

```
rake routes
error Couldn't find an integrity file                                                                                                                                                              
error Found 1 errors.                                                                                                                                                                              


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).


yarn check v1.22.10
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.


koyoishikawa@ishikawyounoAir Ruby_on_rails_task_2 % yarn install --check-files  
yarn install v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
warning " > webpack-dev-server@3.11.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
warning "webpack-dev-server > webpack-dev-middleware@3.7.2" has unmet peer dependency "webpack@^4.0.0".
[4/4] 🔨  Building fresh packages...
✨  Done in 341.25s.
```
Edgerouter XでDS-Lite(xpass)

# TL;DR
AFTRのアドレスを自分で解決する。

# remote-ipどうする問題
IPv6 over v4の設定をするときに

```ssh:edgemax
set interfaces ipv6-tunnel v6tun0 remote-ip 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX'
```
の設定[^1]で楽天ひかりの`dgw.xpass.com`を指定するとIPv6形式でないと怒られてしまう。
YAMAHAなどのルーターのように親切にドメインネームで登録させてはくれない模様。

IIJ（`gw.transix.jp`）の資料[^2]によるとHITACH GR2000-1BやNEC IX3001や他のLinux系OSを採用したルーターやサーバーでも同じらしいが，手動で解決すれば良いらしい。

# 解決
IPv6で解決する。

```zsh
$ nslookup
> set type=AAAA
> dgw.xpass.jp

...

Non-authoritative answer:
dgw.xpass.jp has AAAA address XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
```

`set type=AAAA`を指定することでv6の解決が帰ってくる。

# 参考
[^1]: Edgerouter (ER-X) で DS-lite だけしてみる (ひかり電話なし) https://qiita.com/sho7650/items/23d668d246166338c398

[^2]: てくろぐ・セレクト「自宅でもIIJをつかってみませんか？」 https://www.iij.ad.jp/dev/tech/techweek/pdf/141128_0.pdf

Edgerouter X でひかり電話なし IPv6 をやる https://pikachuism.hatenablog.com/entry/2020/05/16/174424
ノートPCのキーボードの構造は厄介なので、気楽に分解しないほうがいい。

#言いたいこと

ノートPCのキーボードの構造は厄介なので、気楽に分解しないほうがいい。

#ノートPCのキーボードの構造

以下の記事より、図（写真）を引用。　⇒　複雑です。構造を理解するためには、記事を参照して下さい。

https://tikitengo.com/note-pc-keyboard-attach/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481161/b486b260-778a-bcf9-ce0f-d4bb987522c6.png)

#比較として、デスクトップPCのキーボードは

以下の記事より、図（写真）を引用。⇒　一般に、シンプルです。シンプルであることを経験的に知っているかも。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481161/1b7c7da0-f982-1a17-674d-aa23f0f1e442.png)

#ポイント

ノートPCのキーボードは、ちょっと、構造が複雑です。
複雑さはある程度、慣れたりすると思いますが、
構造がデリケートなので、金属部位が曲がったりすることもあり、
あんまり、気楽に、ぱかーーんとはずしたりはしないほうが良いです。

単なる経験談！。
pythonのlogをコンソールとファイル両方に出力する

# はじめに

ファイルにログを残すために`logger.~`を使い、コンソールにログを出すために`print()`を使う。
面倒臭いと思ったことはないでしょうか。

会社でツールを作る際にコンソールとファイル両方にログを出力したいと思い、loggingモジュールを調べていたらコンソールにログを出力する`StreamHandler`とファイルに出力する`FileHandler`の両方使用すれば、コンソール出力とファイル出力の両方が簡単にできることがわかったので、その時の備忘録を残します。

## 参考文献

- [ログ出力のための print と import logging はやめてほしい](https://qiita.com/amedama/items/b856b2f30c2f38665701)
- [Python公式リファレンス(logging)](https://docs.python.org/ja/3/library/logging.html)

# 環境
- python 3.8.5

# ロガーのセットアップ

`logging.basicConfig()`でファイルやコンソールのどちらかに出力すれば良い場合は`filename=`や`stream=`を指定すれば良いですが、ファイルとコンソール両方に出力したい場合などのハンドラを複数使用するときは指定せずに`handlers=`にハンドラをリストで与えて初期化します。
ファイルハンドラは保存パスに存在しないフォルダを指定するとエラーになってしまうので、ない場合は作成する処理を入れます。

```python
import os
import sys
from datetime import datetime
import logging
from logging import StreamHandler, FileHandler, Formatter
from logging import INFO, DEBUG, NOTSET

# ストリームハンドラの設定
stream_handler = StreamHandler()
stream_handler.setLevel(INFO)
stream_handler.setFormatter(Formatter("%(message)s"))

# 保存先の有無チェック
if not os.path.isdir('./Log'):
    os.makedirs('./Log', exist_ok=True)

# ファイルハンドラの設定
file_handler = FileHandler(
    f"./Log/log{datetime.now():%Y%m%d%H%M%S}.log"
)
file_handler.setLevel(DEBUG)
file_handler.setFormatter(
    Formatter("%(asctime)s@ %(name)s [%(levelname)s] %(funcName)s: %(message)s")
)

# ルートロガーの設定
logging.basicConfig(level=NOTSET, handlers=[stream_handler, file_handler])
```

これでloggingモジュールをコンソールとファイル両方に出力する設定ができました。
注意するのは`logging.basicConfig()`で設定する出力レベルです。ログはルートロガー→ハンドラの順に渡されます。なので、ルートロガーの設定である`logging.basicConfig()`で出力レベルを`INFO`等にしてしまうと、ルートロガーの時点で出力レベルが`DEBUG`のログは弾かれてしまいます。そのため、ファイルハンドラの設定で出力レベルを`DEBUG`にしても出力レベルが`DEBUG`のログがファイルに保存されません。

ここではプログラムをベタで書いていますが、なにか適当に関数に入れておくと良いと思います。ほかでこれらのオブジェクトは使用する場所がないので。

# ロガーを使用する

ロガーを使用する場合は、`logging.getLogger(__name__)`でロガーオブジェクトを取得して使用します。
また、関数やファイルをまたぐ場合でも、一度ルートロガーの設定をしてしまえば、どこでも使えるので、使用したい場所で`logging.getLogger(__name__)`を呼び出してあげれば使用できます。

```python
logger = logging.getLogger(__name__)

logger.debug("debug")
logger.info("info")
logger.warn("warn")
logger.error("error")
logger.critical("critical")
```
ファイルには全部のログが、コンソールにはinfoからのログが出力されていると思います。

# コンソール出力をリッチにする

ついでにrichを使用して、コンソール出力をリッチにします。方法は簡単で`logging.StreamHandler`を`rich.logging.RichHandler`に変えてあげるだけです。

richをインストールします。

```
$ pip install rich
```

インストールしたら、ロガーのセットアップの章の`StreamHandler`を`RichHandler`に書き換えます。

```python
from rich.logging import RichHandler

# ストリームハンドラの設定
rich_handler: RichHandler = RichHandler(rich_tracebacks=True)
rich_handler.setLevel(INFO)
rich_handler.setFormatter(Formatter("%(message)s"))

# ファイルハンドラの設定
# 省略

# ルートロガーの設定
logging.basicConfig(level=NOTSET, handlers=[rich_handler, file_handler])
```

出力がリッチになりましたね。
Homebrew 2.6.0 以上で brew cask install が失敗する

## 対処方法
- Homebrew 2.6.0 以降は `brew cask install` を `brew install --cask` で読み替える
- 失敗する理由は Homebrew 2.6.0 から `brew cask` コマンドが非推奨になったため ( M1 Mac と Intel Mac の両方をサポートするための取り組みみたい [\[2\]](https://brew.sh/2020/12/01/homebrew-2.6.0) ) 

```console
// これを🍺
$ brew cask install FORMULA_NAME

// こう🍺
$ brew install --cask FORMULA_NAME
```

### 追記
- 2.6.0 で非推奨になって、2.7.0 で削除されたらしいです。なので、2.6.0 では非推奨って出るだけでこけないかも。
    - [Error: Calling brew cask install is disabled! · Discussion #340 · Homebrew/discussions](https://github.com/Homebrew/discussions/discussions/340)

## 筆者が遭遇したやつ
### GIMP のインストールに失敗した
- GIMP のダウンロードページの説明通り[\[1\]](https://www.gimp.org/downloads/)、 `brew cask install` しようとしたら失敗する

>  There are indications that there is now a formula for GIMP, installable with: brew tap homebrew/cask && brew cask install gimp.

```console
$ brew tap homebrew/cask && brew cask install gimp
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).
==> Updated Casks
Updated 4 casks.

Updating Homebrew...
Error: Calling brew cask install is disabled! Use brew install [--cask] instead.

```

### 対策
- エラー文に書いてある通り、 `--cask` オプションをつけて実行する
    - なお、私はすでに GIMP をインストールしていたことを忘れて実行したので、もうインストールしてるよ！！って言われてます。

```console
$ brew tap homebrew/cask && brew install --cask gimp
Updating Homebrew...
Updating Homebrew...
Warning: Cask 'gimp' is already installed.

To re-install gimp, run:
  brew reinstall gimp
```

### その後
- インストール方法に書いてある情報古くなってるよ！ってどうやって GIMP に報告したらいいんだろう、と思いつつ gimp-web のリポジトリに [issue 立てて](https://gitlab.gnome.org/Infrastructure/gimp-web/-/issues/214) みました。英語難しいですね。。

## 参考
1. https://www.gimp.org/downloads/
2. https://brew.sh/2020/12/01/homebrew-2.6.0
Intel Open Image Denoiseを使ってみた

# はじめに
<!-- 発端や概要を記載 -->

最近Blenderなどにも追加されたIntel Open Image Denoiseというレイトレーシング画像用のノイズを取り除くライブラリがどれだけレイトレーシング画像を綺麗にすることができるかを試すべく、コマンドラインから使ってみました。
[Intel Open Image Denoise](https://www.openimagedenoise.org/)

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [インストール](#Chapter1)
2. [使用画像](#Chapter2)
3. [実行方法](#Chapter3)
4. [実行結果](#Chapter4)
4. [補足](#Chapter5)
5. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# インストール

まずは以下のリンクのDownload the Toolkitのリンクから自分の環境にあったバージョンをインストールします。（Intel Developer Zoneへの登録が必要です）
[Intel oneAPI Rendering Toolkit](https://software.intel.com/content/www/us/en/develop/tools/oneapi/rendering-toolkit.html)

次に画像形式の変換のためのImageMagickをインストールします。インストール後のパス設定オプションはオンにしておきます。
[ImageMagick](https://imagemagick.org/script/download.php#windows)

<a id="#Chapter2"></a>
# 使用画像
今回は以前シンプルなレイトレーサーを作った時のノイズだらけの画像を使用します。256x256のppm画像ですがjpgや他の形式でも構いません。
![128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1014868/4928ca79-65e0-7805-f946-c5c65335d842.jpeg)


<a id="#Chapter3"></a>
# 実行方法

まずは任意のフォルダにデノイズしたい画像を配置します。ここでは`raytracer.ppm`になります。

次にコマンドラインからインストールされたIntel Open Image Denoiseの中にある`setvars.bat`を使って環境変数設定を行います。

```
call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"
```

コマンドラインで画像のあるフォルダに移動し、ImageMagickを使って入力画像をpfm形式に変換します。

```
magick raytrace.ppm -endian LSB -resize 256x256 PFM:noisy_input.pfm
```

`oidnDenoise.exe`を実行しデノイズを行い、最後にImageMagickを用いて任意のファイル形式に戻します。

```
oidnDenoise.exe -ldr noisy_input.pfm -o denoised_output.pfm

magick convert denoised_output.pfm PNG:denoised_output.png
```

<a id="#Chapter4"></a>
# 実行結果

以下がデノイズ後の画像になります。デノイズ前の画像と比べるとかなり綺麗になってると思います。デノイズにかかった時間は`13.1384(msec)`となりました。
![denoised_output128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1014868/e3734ee3-7e33-d369-80dd-8832b53d9ebf.png)

![128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1014868/4928ca79-65e0-7805-f946-c5c65335d842.jpeg)

<a id="#Chapter5"></a>
# 補足

Intel Open Image Denoiseは公式ドキュメントにある通り、albedoやnormal画像と共に実行すると更に綺麗になったりします。レイトレーシング画像のみでもかなり高速に改善されることが分かったのでレンダラーに組み込んでみてもいいかもしれません。

<a id="#reference"></a>
# 参考文献
- [Intel Open Image Denoise](https://software.intel.com/content/www/us/en/develop/documentation/get-started-with-intel-oneapi-render-windows/top/run-sample-with-intel-open-image-denoise.html)
- [Intel Open Image Denoise 公式サンプル](https://www.openimagedenoise.org/)
Gatsbyjsメモ

# あらすじ
* これ買ったけどしっくり来なかった
    * Webサイト高速化のための　静的サイトジェネレーター活用入門 (Compass Booksシリーズ)
    * http://www.amazon.co.jp/dp/B088WJWJK9
    * 理由
        * contentfulの癖が強い（カテゴリ追加し損ねるとブランクが勝手にできたり）
        * .md書いたほうが早くて楽そう
        * ローカル内で全てまとめたい
        * サービス増やしたくない
    * ということでシンプルなのから一からやり直すことに

# 理想
* ここの再現 https://kikunantoka.com/
* 構成
    * firebase + githubAcion
    * Material UI
* やりたいこと
    * 必須
        * タグつけたい
        * お問い合わせフォーム入れたい（googleformじゃないやつ）
        * GAやってみたい
    * できたら
        * 検索機能いれたい algolia??
    * そのうち
        * 本番環境/開発環境で分けたい、developはbasic認証入れたい、mainマージ時のみ外したい
        * 画像が増えてきたらgut lfs入れたい
        * npm ci のキャッシュしたい

# starter
https://github.com/gatsbyjs/gatsby-starter-blog

# firebase hosting設定
* 公式
 * https://www.gatsbyjs.com/docs/how-to/previews-deploys-hosting/deploying-to-firebase/
* ブログ (GatsbyJS) を Netlify から Firebase Hosting に移した
 * https://wktk.jp/entry/migrated-from-netlify-to-firebase-hosting/
【git】 Argument list too long に対する対処法

※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。

##Argument list too long に対する対処法

git commitしようとした際に、下記のようなエラー表示がなされることがある。
###「 /Library/Developer/CommandLineTools/usr/libexec/git-core/git: Argument list too long」

これは、bundle install で取り込んだ大量のファイルなどを含めてコミットしようとした際に表示されるエラー文です。

bundle instalでインストールするファイル自体は、コミットに含める必要はないので外してしまいます。
(gemファイルにインストールすべきファイルが記載してあるので)

まず、.gitignoreに、git対象から外したいファイルを記載します。(今回であればvendor)

```.gitignore.
vendor/
```

次にGitのキャッシュから、対象ファイルを削除します。

```
git rm -r --cached vendor/
```
VueのSPAをIISで動かすときの設定メモ

VueのSPAアプリをローカルのIISで動かしたときのメモ

参考(https://www.linkedin.com/pulse/hosting-vue-js-spa-build-microsoft-iis-zainul-zain/)

1.Vue JS SPAを 'npm run build'でビルド

2./distフォルダに出力されるのでIISで/distフォルダをwebサイトに設定

3./distフォルダに「web.config」を作成

```web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
      <rule name="DynamicRewriteCss" stopProcessing="true">
                <match url="^(.*)/js/(.*)\.js$" />
                <action type="Rewrite" url="js/{R:2}.js" />
            </rule>
      <rule name="DynamicRewriteJsMap" stopProcessing="true">
                <match url="^(.*)/js/(.*)\.js.map$" />
                <action type="Rewrite" url="js/{R:2}.js.map" />
            </rule>
      <rule name="DynamicRewriteJs" stopProcessing="true">
                <match url="^(.*)/css/(.*)\.css$" />
                <action type="Rewrite" url="css/{R:2}.css" />
            </rule>
        <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll">
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            </conditions>
          <action type="Rewrite" url="index.html" />
        </rule>
        
      </rules>
 
    </rewrite>

      <httpErrors>     
          <remove statusCode="404" subStatusCode="-1" />                
          <remove statusCode="500" subStatusCode="-1" />
          <error statusCode="404" path="/survey/notfound" responseMode="ExecuteURL" />                
          <error statusCode="500" path="/survey/error" responseMode="ExecuteURL" />
      </httpErrors>
      <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>
```

4.IISのアプリケーションプールの設定で.NET CLR Versionをマネージドコードなしに変更

5.下記をインストール
　https://www.iis.net/downloads/microsoft/url-rewrite

6.IIS再起動

※IISが<modules runAllManagedModulesForAllRequests="true"/>でエラーを吐いたら
　IISの機能の委任でハンドラーマッピングとモジュールを読み取り専用から書き込み権限も追加


おわり。
【Swift】クロージャ

# 実行環境
Xcode 12.2
Swift 5.3.1

# クロージャとは
クロージャの機能は、ブロック{}で囲んだ処理を実行すると言ったもので関数ととてもよく似ています。
関数はfuncで宣言しますが、クロージャは定数や変数を宣言するときと同様にvarやletを使って宣言します。

```Swift
let closure1 = { (num1:Int, num2:Int) -> Int in
    return num1 + num2
}
```
上記がクロージャの基本的な書き方になります。

num1、num2では引数を指定し-> Intの部分では戻り値の型を宣言しています。そしてinの後に処理を記述します。しかし、クロージャは簡略化して書くこともできます。
例えば、引数や戻り値がない場合は()やVoidと記述することができます。また、(引数) -> 戻り値の型 inも省略して処理だけ書くこともできます。

```Swift
// 引数と戻り値がない場合
let closure2 = { () -> Void in
    print("クロージャ2")
}
closure2() // クロージャ2

// 戻り値だけがない場合
let closure3 = { (num1: Int,num2: Int) -> Void in
    print(num1 * num2)
}
closure3(8, 9) // 72

// 引数と戻り値がない場合はここまで省略することもできます!
let closure4 =  {
    print("クロージャ4")
}
 closure4() // クロージャ4
```

Voidではなく()と書くこともできます。

ここまででなんとなく記述の仕方と簡略ができるんだなということはわかっていただけたと思います。

# func関数ではなくクロージャを使うメリットは？
クロージャを使うメリットは場合によってはfunc関数よりも見やすかったりシンプルに記述できたりする点です。特に非同期処理で良く使われます。

# 参考URL
開発現場で役に立つSwiftのクロージャの使い方
https://arma-search.jp/article/swift-closure#i-3

【Swift入門】クロージャの使い方をわかりやすく解説！
https://www.sejuku.net/blog/34503
[Javascript]inputのチェックボックスでチェックを一つしかつけさせない

HTMLのinputで指定できるチェックボックス（checkbox）。

一つしか選択させたくない場合はまあラジオボタンにしておけという話かもしれないが、どうしてもチェックボックスでやりたい場合の方法を<b>JQuery＆JS両方</b>で紹介。

```oncheck.js
//Jqueryの場合
$(".inputClass").on("click", function(){
   $('.inputClass').prop('checked', false);
   $(this).prop('checked', true);
}); 

//JSの場合
const inputClass = document.getElementsByClassName("inputclass");
for(let i=0;i<inputClass.length;i++){
　　inputClass[i].onclick = function(){
      for(let u=0;u<inputClass.length;u++){
        inputClass[u].checked = false;
        this.checked = true;
      }
  　}
} 
```

入れ子で分かりづらいが、指定したクラスを持つすべてのinputにonclickを追加している。
onclickの先で、一度全てのinputのチェックを外し、<font color="#55aaff">onclickが発動したinputだけチェックを付けている。

HTMLは<b>こんなの↓</b>を想定

```check3.html
<input type="checkbox" class="inputclass">1
<input type="checkbox" class="inputclass">2
<input type="checkbox" class="inputclass">3
```


余談だが、やはりinputはお堅いフォーム以外の場合での装飾にlabelを使わないといけないのが<font color="red">すごくめんどくさい。</font>
[Windows] プログラムを指定して実行から特殊フォルダを呼び出す

ファイル名を指定して実行(Win＋R)から、以下実行する。

## shell:startup
起動時に実行されるスタートアップフォルダを開く

## shell:sendto
右クリックして「送る」に表示されるフォルダを開く

## shell:desktop
デスクトップフォルダを開く

## shell:windows
windowsのインストールフォルダが開く。標準だとC:\windows

## shell:system
system32のフォルダが開く。標準だとC:\windows\system32




##下記の記事に纏まっていた(笑)
https://www.atmarkit.co.jp/ait/articles/1401/24/news036.html
Docker for Mac上でのunittestを高速化した話

# 概要
自作したdocker環境があまりにも遅かったので高速化しました

結論としては
ボリュームマウントに大量の読み書きを走らせない
のが最も効果がありました

# 前提
### 環境
- MacOS Mojave バージョン 10.14.6
- Docker version 20.10.2 build 2291f61
 - php:5.5-apache
 - mysql:5.6
 - redis:2.8.23
 - memcached:1.4.39

### unittest内容
1. gitで指定のブランチにチェックアウト
1. pipでのパッケージインストール
1. composerでのパッケージインストール
1. sqlファイルをDBに投入してのフォーマットチェック
1. テスト用データをDBに投入
1. phpコードのフォーマットチェック
1. phpのunittest（DB/Redis/Memcachedアクセスあり）

### 効果
ホストマシン上で実行した場合：20分
効率化前：1時間
効率化後：20分

## 対応策
### ボリュームマウントにdelegated/cachedを付けた
https://docs.docker.jp/docker-for-mac/osxfs-caching.html

docker for Macではボリュームマウントに設定されたファイルアクセスが非常に遅いらしく
ホストマシンとコンテナ内で整合性を担保しないかわりに高速化するオプションだそうです

これだけでは体感できるほど高速化できませんでした

### ボリュームマウントに巨大なファイルを渡すのをやめた
git管理のプロジェクトコードが巨大なので
ボリュームマウントに設定するのではなくコンテナにCOPYした

これでunittestがかなり早くなり
ホストマシン上で動かすのと大差ない状態になりました

## 結論
ボリュームマウントに大量の読み書きを走らせない
cakephp3のインストール

cakephp3(cakephp3.9)を使用することが増えそうだったので、
忘れないようにインストール方法をまとめることにした

ついでに、cakephp3公式のスタートアップのガイドはこちら
https://book.cakephp.org/3/ja/quickstart.html

今回はvagrantを使用し、php7.1環境にセットアップします
※cakephp3はPHP7.4 (最小は PHP 5.6)の環境が必要です


### インストール
インストールはcomposerを使用

```
curl -s https://getcomposer.org/installer | php
php composer.phar create-project --prefer-dist cakephp/app:^3.8 cms
```

しかし、エラー、、
>
Install of cakephp/plugin-installer failed
  [RuntimeException]
Could not delete /var/www/html/cakephp3/cms/vendor/cakephp/plugin-installer /tests:

調べてみたら、vagrant特有のエラーみたいです
--no-pluginsを付与すればいいみたいです

```
php composer.phar create-project --prefer-dist --no-plugins cakephp/app:^3.8 cms
```


インストールはできたが警告が...
> Action required!                                                                                                                                  
     The CakePHP plugin installer v1.3+ no longer requires the "post-autoload-dump" hook. Please update your app's composer.json file and remove usage of                                              Cake\Composer\Installer\PluginInstaller::postAutoloadDump                  


https://tt-computing.com/cake4-remove-post-autoload-dump 
こちらのページによるとcomposer.jsonのここの部分削除したら問題ないみたいです、これでバッチリ

```                                                         
"post-autoload-dump":"Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump"
```

### DBの設定
使用するためのデータベースを作成してください
今回、確認のためだけだったので、スタートアップにあったSQL使いました
https://book.cakephp.org/3/ja/quickstart.html#cms

config/app.php
の以下の部分を正しいものに書き換えます

```
<?php
return [
    // 上には他の設定があります
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => '[MySqlユーザー名]',
            'password' => '[MySqlパスワード]',
            'database' => '[データベース名]',
            'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
        ],
    ],
    // 下には他の設定があります
];
```

ここまでがcakephpの公式にある内容なのですが、、
![スクリーンショット 2021-01-04 1.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/8ccca357-4252-9af9-a03e-5577e9a510d9.png)


あれ、、データベースでエラー出てますね、、設定は間違いないはずなのになんで、、、？

調べてみると3.9からの機能で`app_local.php`というものがあり、こちらも設定
テスト用に作られたファイルみたいです。
こちらも設定した方が良さそうですね、、、
一旦、試したいだけだったので、本番と同じDB情報を設定します
>参考URL
https://coodip.com/articles/3649

![スクリーンショット 2021-01-04 1.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/a2b755fc-665c-eb98-8ba1-a0e5ff50041e.png)


成功したみたいです。
よかった！
基本的なセットアップはここまでになります＾＾


### bakeコマンド
必要に応じて、モデル、ビュー、コントローラー作る必要があります
bake の後にどれを作る種類を選択し、その後に名前を指定するとcake側で基本に沿ったファイルを作ってくれます。
最初にファイルを作る時、勝手に作ってくれるのでこれは覚えておくと便利！


```
 php ./bin/cake.php bake model users
```
JSで十字キーと他のキーを同時押しさせたい

# はじめに
Webゲームを作っている時に、十字キーを二つ以上押しながら他のキーを押すと一部効かなかったので調べてみました。
# 調べ方
ただ単純に十字キーをいずれか二つ押しながら他のキーをポチポチする。
# 結果
以下が結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234613/777ca2df-8a18-d240-e141-fee599ee5e70.png)
これより、5つのパターンに分けられます。

- どの時でも押せる
    - C,D,F,H,J,L,O,P,W
- 「上」が含まれていると効かない
    - E,I,Q,T,Y
- 「下」が含まれていると効かない
    - A,B,G,S
- 「左」が含まれていると効かない
    - M,N,V,X,Z 
- 「右」が含まれていると効かない
    - K,R,U

なので、十字キーを押しながら押せるキーは限られてしまいます。
これには何か規則性があるのではないかと思い、適当にキーの色を分けてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234613/f01258c2-2109-6ebf-519b-65fff88aa7b7.png)
塗った感じ、上が含まれていると効かないキーは上の段、下が含まれていると効かないキーは下の段に固まっているぐらいで、特にこれといった規則性はなさそうでした。
# まとめ
何か規則性があればよかったのですが、ないので十字キーを押しながら他のことをさせる場合は使用できるキーを限る必要がありそうです。
何か対策出来る案やライブラリがあれば教えてほしいです。
RSpecの導入&関係の深いgemについて

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

Ruby on Railsのテスト用のgemであるRSpecの導入と関係するgemについて整理します。

## RSpecとは
Ruby on Railsのテストコードを書くために用いられるgemです。
実際のgem名は「rspec-rails」です。

ユーザーの新規登録やログイン、メッセージの投稿や編集などの機能をテストするために使用します。

Rubyには標準でmini_testという別のテスト用Gemが導入されているのですが、開発現場ではRSpecが主流だそうです。

## RSpecのインストール

`Gemfile`に以下のように記述し、ターミナルで`bundle install`を入力します。

```ruby:Gemfile
#group :development, :testというグループの中に記述する。
group :development, :test do
  gem 'rspec-rails', '~> 4.0.0'
end
```

```zsh:ターミナル
$ bundle install
```
## RSpecの設定をする
ターミナルで以下のとおり入力して、ディレクトリとファイルを生成します。

```zsh:ターミナル
$ rails g rspec:install
#上記実行後、下記のディレクトリとファイルが生成される
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

```

`.rspec`ファイルに以下の記述をします。テストコードの実行結果をターミナル上に可視化するために記述します。

```rb:.rspec
--require spec_helper
--format documentation #この一文を追加
```

RSpecについてはここまです。

## RSpecと関係の深いgem
RSpecとよく一緒に使用するgemとしてFactoryBotとFakerがあります。

### FactoryBotとは
インスタンスをまとめることができるgemで、他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用します。

RSpecと同様にGemfileの`group :development, :test`というグループの中に記述してからインストールします。

```ruby:Gemfile
group :development, :test do
  gem 'factory_bot_rails'
end
```

```zsh:ターミナル
$ bundle install
```

簡単な紹介になりますが、FactoryBotは以下のように記述して使います。※アプリにUsersテーブルがあると想定

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name {"sample"}
    email {"sample@mail"}
    password {"sample777"}
  end
end
```

このように記述することで、テストで使用するユーザーの情報を事前に用意しておくことができます。

###Fakerとは
ランダムな値を生成するgemで,メールアドレス、人名、パスワードなどのランダムな値を生成してくれます。
RSpecと同様にGemfileの`group :development, :test`というグループの中に記述してからインストールします。

```ruby:Gemfile
group :development, :test do
  gem 'faker '
end
```

```zsh:ターミナル
$ bundle install
```

Fakerはこんな感じでランダムな値を生成します。

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { Faker::Name.initials(number: 5) }
    email { Faker::Internet.free_email }
    password { Faker::Internet.password(min_length: 6) }
  end
end
```

### FactoryBotとFakerでできること
テストコードを実行するたびにランダムな値でインスタンスを生成することができます。
テストをするアプリにユーザー管理機能がある場合、emailなどのカラムをテーブルに用意されていると思いますが、複数のテストを行う際に、「すでにemailの重複したインスタンスが存在する」といったような意図しない形でテストエラーが出てしまうことを防ぐのに役立ちます。

今回はここまでで、次の記事でRSpecを使った単体テストについて取り上げたいと思います。

## RSpecのシリーズ記事
第1回:[RSpecの導入&関係の深いgemについて](https://qiita.com/yamaday0u/items/c3bf6036e11298771a99) ※この記事
第2回:[RSpec:モデルの単体テストの記述例](https://qiita.com/yamaday0u/items/7ad2c714224a651b6189)

##参考資料
[RSpecの公式GitHub](https://github.com/rspec/rspec-rails)
[FactoryBot(factory_bot_rails)の公式GitHub](https://github.com/thoughtbot/factory_bot_rails)
[Fakerの公式GitHub](https://github.com/faker-ruby/faker)
オブジェクトとは

関連する変数（値）と関数（動作）をまとめて、そのまとまりに名前を付けたものです。これまで、変数と関数は別々に宣言され管理されてきましたが、関連する変数や関数は1つのオブジェクト内で宣言してまとめてしまうことで、管理しやすくするのがオブジェクト指向。

ブジェクト(object)は、日本語に訳すと、物体。

クラスに含める変数のことは プロパティ 、クラスに含める関数のことは メソッド とも言います。

オブジェクト指向プログラミングとは、積極的にオブジェクトという概念を導入したプログラミング手法ということ。オブジェクト指向プログラミングができるプログラミング言語をオブジェクト指向プログラミング言語。

多くのプログラミング言語がオブジェクト指向を採用。PHP をはじめ、 Java, Ruby, C++, C#, Swift といったプログラミング言語は全てオブジェクト指向プログラミング言語。更に言うと、クラスベースのオブジェクト指向プログラミング言語。

クラスベースのオブジェクト指向では、オブジェクトには クラス と インスタンス という2つの側面があります。
pythonで`while queue`がうまく行かなかった話

# pythonでのQueue

キューの実装は複数あるが、`queue.Queue`と`collections.deque`での差が問題になった。
もともと`deque`を使って書いていたものを`Queue`を使って書き直した

```python:もともとのコード
from collections import deque

queue = deque()
queue.append("hogehoge")
while queue:
    item = queue.popleft()
    if n := len(item) == 1:
        print(item)
    else:
        queue.append(item[:n//2])
        queue.append(item[n//2:])
```


```python:書き直したコード
from queue import Queue

queue = Queue()
queue.put("hogehoge")
while queue:
    item = queue.get()
    if n := len(item) == 1:
        print(item)
    else:
        queue.put(item[:n//2])
        queue.put(item[n//2:])
```

この状態で下のコードを実行すると無限ループとなった。

## `Queue`は空のものも`True`と判定される

[https://docs.python.org/ja/3/library/queue.html](https://docs.python.org/ja/3/library/queue.html)には直接の記載はないがREPLではそのように出力された。

```python:REPL
from queue import Queue
q = Queue()
bool(q)
> True

q.put("hoge")
bool(q)
> True
```

どうやら`Queue.empty()`があるようなので使って書き直してみたが無限ループは解消されなかった。

```python:Queue.empty()を使って書き直したコード
from queue import Queue

queue = Queue()
queue.put("hogehoge")
while not queue.empty():
    item = queue.get()
    if n := len(item) == 1:
        print(item)
    else:
        queue.put(item[:n//2])
        queue.put(item[n//2:])
```
論理演算子

&&	　条件A && 条件B	条件Aと条件Bがどちらもtrueならばtrueを返す
||	　　条件A || 条件B	条件Aと条件Bのどちらかがtrueならばtrueを返す
!	　　!条件A	条件Aがfalseならtrueを返す
比較演算子

==	右辺と左辺が等しい場合にはtrueを返す。等しくない場合にはfalseを返す。

!=	右辺と左辺が等しくない場合にはtrueを返す。等しい場合にはfalseを返す。

<	右辺より左辺が小さい場合にはtrueを返す。右辺より左辺が大きいか等しい場合にはfalseを返す。

＞	右辺より左辺が大きい場合にはtrueを返す。右辺より左辺が小さいか等しい場合にはfalseを返す。

<=	右辺より左辺が小さいか等しい場合にはtrueを返す。

＞=	右辺より左辺が大きいか等しい場合にはtrueを返す。
バリデーション

バリデーション 【 validation 】 

バリデーションとは、検証、実証、認可、妥当性確認などの意味を持つ英単語。ITの分野では、対象がその仕様や文法などに照らして適切に記述・構築されているか否かを検証するという意味で用いられることが多い。

プログラムのバリデーションといった場合、記述に用いた言語の文法や、そのプログラムに要求される仕様（書の記述）に則って正しく記述されているかを検証することを表す。
xamppでCSV(TSV)がうまく読み込めないとき

xamppでCSVやTSVを読み込んでMySQLに登録するバッチを書きました。
PCが故障したのでxamppを入れ替えたらなぜか動かなくなりました。
（一部の行で区切り文字がうまく判定できていない？）

xamppのバージョンかPHPのバージョンか原因はわかりませんが、解決しました。

こちらの記事を参考にさせていただきました。
[Windows版php-7.1 で UTF8 の CSV をパースする](https://iamapen.hatenablog.com/entry/2017/08/10/134224)

```php
setlocale(LC_CTYPE, 'C');
```
Laravel Collective

Laravel のFormファサードを使うと、HTML のフォームタグがすっきり。

Composer で「Laravel Collective」パッケージをインストール。
$ composer require "laravelcollective/html":"6.*"

Formファサードの引数
第一引数：name属性の値
第二引数：value属性の値
第三引数：「class」「placeholder」など追加の属性

HTML
input type="text" class="form-control" id="lastName" placeholder="名字">

 Formファサード
{{Form::text('lastName', null, ['class' => 'form-control', 'id' => 'lastName', 'placeholder' => '名字'])}}

HTML
form method="POST" action="http://localhost" accept-charset="UTF-8" enctype="multipart/form-data">

Formファサード
{{Form::open(['url' => '/', 'files' => true])}}

HTML
/form>
Formファサード
{{Form::close()}}
【Android/Kotlin】最小構成でLiveDataを使う

# 環境
- Mac
- AndroidStudio4.1
- Kotlin

# LiveDataとは
データの変更をリアルタイムで検知して、それをトリガーとしてなんらかの処理を行う
`LiveData`に検知したいデータを格納し、
`Observer`に変更された時の処理を記述する

# 結論
[ソースコード全文 - Github](https://github.com/yuki-kamikita/LiveDataSample)

# コード解説
## 今回のコードの動き
### 事前準備
1. LiveDataを初期化
2. Observerを定義

### 動かす
1. 背景をタップする
2. `LiveData`の中身を変更する
3. `Observer`が変更を検知し、`text_view`に`sampleLiveData`の値を入れる


## コード
```xml:build.gradle(app)
dependencies {
    // LiveData
    implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
}
```


```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // LiveDataを初期化
        val sampleLiveData: MutableLiveData<LocalDateTime> by lazy {
            MutableLiveData<LocalDateTime>()
        }

        // Observerを定義
        // 3.sampleLiveData の値の変化を検知し、実行される
        sampleLiveData.observe(this, Observer { value ->
            // sampleLiveData.valueの値が変数valueに入っている
            value?.let { 
                text_view.text = it.toString() // text_viewにsampleLiveDataの内容を入れる
            }
        })

        // 1.背景タップ時
        constraint.setOnClickListener {
            // 2.sampleLiveDataに現在時刻を入れる
            sampleLiveData.value = LocalDateTime.now()
        }

    }
}
```

# 参考にした記事
[LiveData の概要 - Android Developer](https://developer.android.com/topic/libraries/architecture/livedata?hl=ja)
Chromebookタブレットをクラムシェルモードに切り替える

# はじめに
Chromebookには2つのモードがあります。

+ クラムシェルモード（デスクトップモード）
    + PC的なUI。
    + ウィンドウを何枚でも開ける。
    + ウィンドウサイズを自由に変更できる。
+ タブレットモード
    + タブレット的なUI。
    + ウィンドウを2枚まで開ける。
    + ウィンドウサイズを全画面表示と2画面分割表示にのみ変更できる。

タッチパッドやマウスといったポインティングデバイスが取り外されるとタブレットモードへ切り替わります。
2in1タイプのChromebookは画面を190°以上開くとタッチパッドが無効化されるため、取り外されたと判定されます。



# Chromebookのモードを手動で切り替える
Chromebookのモードを手動で切り替えるために、以下のフラグを有効化します。
`chrome://flags/#ash-debug-shortcuts`
`chrome://flags/#new-shortcut-mapping`

有効化すると「`Ctrl` + `Alt` + `Shift` + `T`」にてモード切替を行うことができるようになります。
クラムシェルモード↔タブレットモードのトグルのため、タブレット状態のChromebookをクラムシェルモードにすることもノートPC状態のChromebookをタブレットモードにすることも出来ます。


## タブレットモードでキーボードショートカットを押下する
タブレットモードでは外付けキーボードを接続していない場合は画面キーボードを使用しますが、
通常の画面キーボードには`Ctrl`,`Shift`,`Alt`といった修飾キーが無いため、キーボードショートカットを押せません。
これは、ユーザ補助機能の方の画面キーボードを使用することで対応できます。
![Screenshot 2021-01-10 at 00.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/f558b811-a502-38c9-d1b9-36aff43ff00f.png)
![Downloads.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/eeac184f-f49f-ce13-b22c-2a5c7e0e8e37.png)
キーボード左下に修飾キーが表示されています。



# 問題点
タブレットモードでは筐体側面等にある電源キーを押下するとスリープ状態になりますが、クラムシェルモードでは電源メニューが表示されるだけでスリープ状態になりません。
キーボードショートカット「`検索キー(Search)` + `Shift` + `L`」にてスリープすることができますが、画面キーボードには検索キーがありません。
そのため、クラムシェルモードに切り替えたタブレットではサッとスリープする方法が無さそうです。
電源メニューまたはシェルフからロックすれば1分程でスリープ状態になります。
また、画面の自動回転が効かないため、「`Ctrl` + `Shift` + `更新キー(F3)`」にて手動回転する必要があります。



# おまけ
フラグ有効化で使用できるショートカットは下記URLに記載されています。
[accelerator_table.cc - Chromium Code Search](https://source.chromium.org/chromium/chromium/src/+/master:ash/accelerators/accelerator_table.cc;l=65-84)
``` cpp
// A mask of all the modifiers used for debug accelerators.
ASH_PUBLIC_EXPORT constexpr int kDebugModifier =
    ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN;

const AcceleratorData kDebugAcceleratorData[] = {
    {true, ui::VKEY_N, kDebugModifier, TOGGLE_WIFI},
    {true, ui::VKEY_M, kDebugModifier, DEBUG_MICROPHONE_MUTE_TOGGLE},
    {true, ui::VKEY_O, kDebugModifier, DEBUG_SHOW_TOAST},
    {true, ui::VKEY_P, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
     DEBUG_TOGGLE_TOUCH_PAD},
    {true, ui::VKEY_T, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
     DEBUG_TOGGLE_TOUCH_SCREEN},
    {true, ui::VKEY_T, kDebugModifier, DEBUG_TOGGLE_TABLET_MODE},
    {true, ui::VKEY_B, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
     DEBUG_TOGGLE_WALLPAPER_MODE},
    {true, ui::VKEY_L, kDebugModifier, DEBUG_PRINT_LAYER_HIERARCHY},
    {true, ui::VKEY_V, kDebugModifier, DEBUG_PRINT_VIEW_HIERARCHY},
    {true, ui::VKEY_W, kDebugModifier, DEBUG_PRINT_WINDOW_HIERARCHY},
    {true, ui::VKEY_B, kDebugModifier, DEBUG_TOGGLE_SHOW_DEBUG_BORDERS},
    {true, ui::VKEY_F, kDebugModifier, DEBUG_TOGGLE_SHOW_FPS_COUNTER},
    {true, ui::VKEY_P, kDebugModifier, DEBUG_TOGGLE_SHOW_PAINT_RECTS},
    {true, ui::VKEY_K, kDebugModifier, DEBUG_TRIGGER_CRASH},
    {true, ui::VKEY_G, kDebugModifier, DEBUG_TOGGLE_HUD_DISPLAY},
};
```
　

（バージョン: 88.0.4324.47（Official Build）beta （64 ビット）にて確認）

以上
Raspberry PiでTP-Link Archer T9UHを使う

# 概要
Raspberry Pi 3以降では基板上にWi-Fi IFがついており、Rasbianを入れたら何もしないで認識してくれる。
しかし性能がイマイチなので、**TP-Link Archer T9UH** を使うことにした。
こいつは何もしないとIFとして認識してくれないので、ドライバを入れることにした。

# ポイント/狙い
ドライバの導入、あるいはTP-LinkのIFを扱った記事はqiitaや各種ブログにたくさんあるが、T9UHを扱った記事が少なかったことと、特にRealtek 8814auチップを扱った記事がなかったので、ここに残しておく。

# 作戦
[TP-Linkオフィシャル](https://www.tp-link.com/jp/support/download/archer-t9uh/)にドキュメントとドライバがあるが、それによると、カーネルを再コンパイルしてドライバを入れるようだ。しかし今時カーネルまで触るのは面倒くさいのでやりたくない....。
とするともう一つ、ドライバをモジュール化してカーネルに組み込む方法があるようで、その手順とドライバが[GitHub](https://github.com/aircrack-ng/rtl8814au)で公開されている。
これならaptでカーネルを更新したときも追随が楽そうなので、こっちでやることにする。

なおArcher T9UH向けの手順（ドライバ）として、rtl8812auチップ用を使っている人を見かけるが、私がやったときはそのドライバでは動かなかった。
入手したハードのロットによってチップの違いがあるのかもしれないが、私の場合はrtl8814auチップ用で動いてくれた。
（GitHubでも、[rtl8814au](https://github.com/aircrack-ng/rtl8814au)は[rtl8812au](https://github.com/aircrack-ng/rtl8812au)から分岐しているので、そういう経緯を辿ったのかもしれない）

# 手順
書かれている手順に従うだけだが、事前にカーネルヘッダとdkmsを入れる。

```
apt -y install raspberrypi-kernel-headers dkms
```

次、上記GitHubから落としてくる。

```
git clone https://github.com/aircrack-ng/rtl8814au.git
```
もしbranchがあってそっちの方が良さそうなら、-bでブランチ指定して落としてくる。

で、落としてきたMakefileは、Raspberry Pi(ARMアーキテクチャ)の指定をしなければならない。
これは[rtl8814au](https://github.com/aircrack-ng/rtl8814au)には書かれていないが、分岐元の[rtl8812au](https://github.com/aircrack-ng/rtl8812au)に書かれていて
>Then run this step to change platform in Makefile, For RPI 1/2/3/ & 0/Zero:
>
```
$ sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile
$ sed -i 's/CONFIG_PLATFORM_ARM_RPI = n/CONFIG_PLATFORM_ARM_RPI = y/g' Makefile
```
But for RPI 3B+ & 4B you will need to run those below which builds the ARM64 arch driver:
>
```
$ sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile
$ sed -i 's/CONFIG_PLATFORM_ARM64_RPI = n/CONFIG_PLATFORM_ARM64_RPI = y/g' Makefile
```
In addition, if you receive an error message about unrecognized command line option `-mgeneral-regs-only` (i.e., Raspbian Buster), you will need to run the following commands, then retry building and installing:
>
```
$ export ARCH=arm
$ sed -i 's/^MAKE="/MAKE="ARCH=arm\ /' dkms.conf
```

とのこと。
私の英語力不足かもしれないが、『3B+＆4Bで64bitドライバの場合は』って言っているようだが、2Bだって一部はARM64bitだったりするので、ここは単に『64bitドライバの場合は』と考えて良いっぽい。
今回私は32bitドライバで良いので

```
cd rtl8814au/
sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile
sed -i 's/CONFIG_PLATFORM_ARM_RPI = n/CONFIG_PLATFORM_ARM_RPI = y/g' Makefile
export ARCH=arm
sed -i 's/^MAKE="/MAKE="ARCH=arm\ /' dkms.conf
```
とした。

これで準備完了なのでコンパイルするわけだが、dkmsでインストールまでお願いする。

```
make dkms_install
```

もしエラーが出たら対処をするが、問題なくインストールできると`/etc/modules/(kernel-ver)/updates/`にモジュールが入れられる。
また`/usr/src/8814au-x.x.x.x/`に、コンパイルに使ったソースが保存される。なので元々cloneしてきたものは消して良い。
CRUD

CRUDとは、データベース管理システム（DBRS）に必要とされる4つの主要な機能、「作成（Create）」「読み出し（Read）」「更新（Update）」「削除（Delete）」をそれぞれ頭文字で表したもののことである。

例えばSQLにおいては、「作成」に「INSERT」のコマンドが、「読み出し」に「SELECT」、「更新」に「UPDATE」、「削除」には「DELETE」のコマンドがそれぞれ対応している。CRUDのそれぞれの機能を網羅していることは、データベースシステムの完全性を備えるために必須の要素であるとされている。

フルスペル：Create, Read, Update, Delete
読み方：クラッド
Google Apps Script GitHub アシスタントが表示されない&Google認証でエラー This app is blocked

# 現象

 Chromeの拡張機能のGoogle Apps Script GitHub アシスタントをインストールしたが、何も表示されない。
![画像取得サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103028/fc909ab6-6ec2-c850-7865-052e3261c0b4.png)

本来なら下記のようになります。
![画像取得サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103028/a70c3aa1-c057-84b6-416f-412c9f85a4f4.png)


また、表示されないことを気にせずにGithubののAccess Token等設定しても、Googleアカウントの認証後にエラーになる。

**This app is blocked**
This app tried to access sensitive info in your Google Account. To keep your account safe, Google blocked this access.
![許可の確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103028/e91f6f6d-d55d-c49e-4f5b-6b41cbe759a7.png)

# 原因
作成者のGithubのIssueに上がってました。
https://github.com/leonhartX/gas-github/issues/136

v5がGoogleの審査中らしく、審査が終わるのを待つ or v4.0.7を手動でインストールしてとのこと。

# 対処方法
審査を待てないので、手動でインストールを行う。
[作者のGithub](https://github.com/leonhartX/gas-github/releases/tag/v4.0.7)からv4.0.7をダウンロードする、もしくは[こちら](https://drive.google.com/file/d/11ObrOb_1BIH2Iv_jajGsZxjtDJ4voeIU/view?usp=sharing)からダウンロードし、解答する。

Chromeの拡張機能を開き、デベロッパーモードをオンにし、パッケージ化されていない拡張機能を読み込むをクリック。
![拡張機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103028/43a89d52-d30a-28eb-05e5-118bd3eae467.png)

解凍したv4.0.7のソースのディレクトリを選択し、更新する。

再度GASを確認すると表示されるようになった。
![画像取得サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103028/a70c3aa1-c057-84b6-416f-412c9f85a4f4.png)
マイグレーションとは

マイグレーション機能では、テーブルを新規に作成するためのマイグレーションファイルと呼ばれるファイルを作成して、マイグレーションを実行することで、マイグレーションファイルに書かれたテーブルの定義がMySQLなどのデータベースに間接的に反映される。

例えば、既存のテーブルに、後からカラムを追加したい場合には、カラムを追加するための別のマイグレーションファイルを新たに作成して実行することで、テーブルの定義を変更していく。

マイグレーション機能を使って、テーブル定義を修正すれば、履歴がマイグレーションファイルという形で残っていく。テーブル定義に変更や追加がある度に、新しくマイグレーションファイルを追加作成する。

マイグレーションファイルをある地点まで戻すことを ロールバックという。

$ php artisan make:migration create_???_table --create=???

$ php artisan migrate

$php artisan make:model Message
Eclipseでリモートデバッグ Xdebug起動時78%で止まるの巻

開発環境をVagrantへ統一したのは良いが、環境面で色々とつまりまくります。
今回はEclipseでXdebug環境を構築していざリモートデバッグ開始

### 開発環境

OS：Mac OSX 10.14.6
仮想環境：Vagrant + CentOS 7
PHP：7.3.26
Eclipse : Version: 2020-12 (4.18)

### Xdebug開始時に78%で止まる現象

Eclipseのリモートデバッグ構成を作成して、デバッガーはXdebugを設定してこんな感じにする。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56314/e98441cf-9d33-7533-1fb6-a33ac1ee2775.png)


デバッグスタートすると78%で止まる・・・

phpinfoを出すと`/etc/php.d/15-xdebug.ini` の確認ができたのでXdebug自体は入っている。
![スクリーンショット 2021-01-09 19.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56314/99531448-5ef4-c54d-5988-cfc43be436ed.png)

php.iniの設定も確認します。

```
[xdebug]
 zend_extension=xdebug.so
 xdebug.remote_enable=1
 xdebug.remote_mode=req
 xdebug.remote_host=[REMOTE_ADDR]
```

**自分の環境に最適なXdebugを調べる**　https://xdebug.org/wizard
上記のページに行って、下のように出力したphpinfoのソースを貼り付けて調べる
![スクリーンショット 2021-01-09 19.45.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56314/c9ad9346-4110-a80d-8c58-6fb3135364f3.png)

![スクリーンショット 2021-01-09 19.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56314/0ab2667e-fae8-2940-fbd2-9584118cdca6.png)
ほぉ。。。どうやらXdebug3.0を使いなさいと(^^;;

**Instructions** 通りにxdebug3.0をインストールします。
xdebug3.0 の設定は2.0と少し違うので気をつけて下さい。

`/etc/php.ini` の最下部に以下を追加

```bash
[Xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.mode = debug
xdebug.client_host = [REMOTE_ADDR]
```

[REMOTE_ADDR] はVagrant(ゲストOS)へアクセスするホストOSのアドレスです。
適当なPHPファイルを作って`echo $_SERVER['REMOTE_ADDR'];` で確認できます。

**デフォルトの接続ポートも9000から9003に変更されていますので変更します。**
![スクリーンショット 2021-01-09 23.20.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56314/b544cf2b-a1e1-4cc3-4b61-589803ab59d0.png)
![スクリーンショット 2021-01-09 22.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56314/177572cf-9a0d-123a-fc55-ce65ee0951c8.png)
動いた〜〜！！

自分の環境で、Xdebug開始して72%で止まる現象はXdebugのバージョンでした。
環境によってバージョンではない場合もあるのでご参考までに。
Go言語-randパッケージ

# randパッケージ
プログラミング基本からGoの理解を文字におこして行こうと思います！

### 処理結果をランダムに表示
```go
package main
import "main/rand"  //「fmt」と同様""で囲む
...
}
```
ランダムな数を扱うためのmath/randというパッケージ

### 乱数の生成
```go
package main
import "fmt"
import "main/rand"

func main() {
  fmt.Println(rand.lntn(10)) //0~9の乱数を生成
  fmt.Println(rand.lntn(10)) //0~9の乱数を生成
}

//コンソール
1
8
```
「rand.Intn(10)」と書くことで、0~9までの10個の整数の乱数を生成できる

### 乱数の注意点
```go
package main
import "fmt"
import "main/rand"

func main() {
  for i := 1; i <= 5; i ++ {
    fmt.Println(rand.lntn(10))
  }
}

//コンソール
[1回目]   [2回目]
 1         1 
 5         5
 3         3
 4         4
 8         8

```
単に「rand.Intn(10)」のように呼び出すだけでは
実行する度に、毎回同じ乱数が生成

### 完全な乱数を生成する
```go
...
import "main/rand"
import "time"  //timeパッケージのインポート

func main() {
  rand.Seed(time.Now().Unix())  //完全な乱数を生成するコード
  for i := 1; i <= 5; i ++ {
    fmt.Println(rand.lntn(10))
  }
}

//コンソール
[1回目]   [2回目]
 1         2 
 5         6
 3         1
 4         9
 8         8

```
完全な乱数を生成するために
「rand.Seed(time.Now().Unix())」という1行を追加する必要がある
このコードを使うためには「time」パッケージをインポートする必要がある
RDB（リレーショナル・データベース）について説明します

# <font color="RED">RDB（リレーショナル・データベース）とは</font>

表形式でデータを管理するデータベースのこと。
行を示している名称を【レコード】列を【カラム】という。
次はRDBを実際に管理するシステムについて説明します。

## <font color="RED">RDBを管理するシステム、RDBMS(RDB,マネジメントシステム）とは</font>

RDBMSはRDBを管理するシステムのこと。
ターミナルにrails newコマンドを実行するときに、-dオプションでRDBMSを指定する。
ターミナルでの記述例は以下の通り。

```
% rails _6.0.0_ new アプリケーション名　-d RDBMSを指定する
```

## <font color="RED">RDBMSの具体的なシステムについて</font>

RDBMSの種類には<font color="Blue">My SQL</font>というものがあります。
My SQLの特徴に関しては、以下の3つがあります。

①拡張機能が多い。
②小規模から大規模のデータの取り扱いができる。
③柔軟性が高い。

###  **最後に、、、お願い！**
ブログを最後まで見ていただきありがとうございます。
私も勉強中でありますので、訂正箇所や捕捉がありましたら
どんどんコメントして下さい！！
よろしくお願いします！！