OmniAICreator/Qiita-1.07M huggingface dataset:
5分でターミナルの「MacBook:~ Taro$」を見やすくして絶頂する方法

# はじめに
標準のプロンプト`Taro-no-MacBook:~ Taro$`は見辛いですよね。 
そんな見辛いプロンプトはササッと変えてしまいましょう。

## BEFORE
<img width="682" alt="スクリーンショット 2018-06-21 0.16.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/935f6086-09a2-6bb3-0b85-8a5fc284814a.png">


## AFTER
<img width="682" alt="スクリーンショット 2018-06-21 0.13.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/e9381fda-9014-4b03-068e-f2c57913be4f.png">

ンンン!!!

# やり方♂
## Step ①
[Menlo for Powerline.ttf](https://github.com/abertsch/Menlo-for-Powerline/blob/master/Menlo%20for%20Powerline.ttf) を「Download」し、フォントをインストールする。

<img width="512" alt="スクリーンショット 2018-06-21 0.29.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/b05cd21a-0adc-1c32-2487-aa6d4cec08b6.png">

なぜ?: 「▶︎」の形をした特殊な記号文字使いたいから。

## Step ② 
[このファイル](https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh) を `.git-prompt.sh`という(ドットから始まる)ファイル名を付けて :house: **ホームフォルダ**に保存する。

<img width="933" alt="スクリーンショット 2018-06-21 0.51.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/8b8269b4-f3df-3de3-6333-cb4ae787efde.png">

なぜ？: Gitのブランチ名(ex. master)を表示するのに必要。

## Step ③
:house: ホームフォルダにある`.bash_profile`に以下を貼り付けて保存。

```bash:~/.bash_profile
source ~/.git-prompt.sh

# 出力の後に改行を入れます
function add_line {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}
PROMPT_COMMAND='add_line'

export PS1='\[\e[37;100m\] \# \[\e[90;47m\]\[\e[30;47m\] \W \[\e[37m\]$(__git_ps1 "\[\e[37;102m\] \[\e[30m\] %s \[\e[0;92m\]")\[\e[49m\]\[\e[m\] \$ '
```

以上です。:tada:
新しいターミナルを開いてみよう。

<img width="682" alt="スクリーンショット 2018-06-21 1.27.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/5fdfcce3-f201-5fee-f8ea-396f999dd6d3.png">

**あれ？** :kissing:
ターミナルのフォントをまだ変えていなかった。

## Step ④
ターミナルの環境設定(⌘,)を開いて、フォントに`Menlo for Powerline`を指定する。

<img width="779" alt="スクリーンショット 2018-06-21 0.53.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/a031eb15-a737-7f77-2521-fbc47d521c1c.png">

これで本当の終わりです。
ターミナルを再起動してみましょう。

<img width="682" alt="スクリーンショット 2018-06-21 0.13.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/74e34d3b-2663-a07e-11ad-eb498cf6f9af.png">

**ンンンンンｱーｯ!!!!** :tada::tada::tada:

# 他のターミナル
iTermなど、他のターミナルをお使いの場合もちゃんと反映されています。
**※ 各ターミナルのフォントを`Menlo for Powerline`にするのを忘れずに。**

## iTerm2
<img width="762" alt="スクリーンショット 2018-06-21 1.24.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/01bb4a8e-bf9d-0154-1cbd-bd6d7c6b5533.png">

## Hyper Term
![スクリーンショット 2018-06-21 0.13.31.png](https://qiita-image-store.s3.amazonaws.com/0/225997/689a56d2-ff1a-6575-a312-06ddee6b83b9.png)

## Atom ([platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal))
![スクリーンショット 2018-06-20 23.39.57.png](https://qiita-image-store.s3.amazonaws.com/0/225997/f50d63d0-97b1-5f05-d755-0ff1bfd8e00e.png)

いやー、いいですね :relaxed:

# 最後に
これで5分は流石に厳しかったですね... すいません :sweat_smile:
いやー、でも、見やすくなってよかったと思って頂ければ幸いです。:clap:
最後まで、付き合っていただいてありがとうございました。m(_ _)m

仕組みが気になる方や、自分流にカスタマイズしたい人はこちらをどうぞ:
↓↓↓
https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60
React + TypeScrypt + Jest(ts, tsx) 環境をcreate-react-appから最速で構築する

> # ***そして全ては幻想だった...(6/23追記)***
```bash:
npx create-react-app my-app --scripts-version=react-scripts-ts
cd my-app
yarn test
```
でいけてた。完全に自分の設定ミスだった :angel_tone2:

```bash:setup
npx create-react-app my-app --scripts-version=react-scripts-ts
cd my-app
mkdir src/__test__/ src/__test__/__mocks__/
touch src/__test__/__mocks__/fileMock.js
yarn add -D ts-jest @types/jest identity-obj-proxy
```

```json:package.json
  "scripts": {
    "test": "jest"
  },

  "jest": {
    "transform": {
      "^.+\\.tsx?$": "ts-jest"
    },
    "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js",
      "jsx",
      "json",
      "node"
    ],
    "moduleNameMapper": {
      "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/src/__test__/__mocks__/fileMock.js",
      "\\.(css|less)$": "identity-obj-proxy"
    }
  },
```

```javascript:src/__test__/__mocks__/fileMock.js
module.exports = {};
```

```bash:fin.
yarn test
# yarn run v1.7.0
# $ jest
# PASS  src/App.test.tsx
#  ✓ renders without crashing (20ms)
```

# 解説

「--scripts-version=react-scripts-ts」でTypeScryptの実行環境までは提供してくれるが、
TSとJestとの互換性までは用意してくれないし、「react-scripts-ts test」では拡張性に限界があるので、test実行環境は一から作る必要がある。

> $ react-scripts-ts test --env=jsdom
Out of the box, Create React App only supports overriding these Jest options:
  • collectCoverageFrom
  • coverageReporters
  • coverageThreshold
  • snapshotSerializers
  • moduleNameMapper.
These options in your package.json Jest configuration are not currently supported by Create React App:
  • transform
  • testRegex
  • moduleFileExtensions
If you wish to override other Jest options, you need to eject from the default setup. You can do so by running npm run eject but remember that this is a one-way operation. You may also file an issue with
Create React App to discuss supporting more options out of the box.

## [transform](https://facebook.github.io/jest/docs/en/configuration.html#transform-object-string-string)
Jestはdefaultではimportなどの構文をサポートしていないため、ES6以降の構文で書いている場合は変換してやる必要がある。TSの場合 [ts-jest](https://github.com/kulshekhar/ts-jest) というローダー(トランスパイラー？)を使う。js, jsxは [babel-jest](https://github.com/facebook/jest/tree/master/packages/babel-jest) を使うっぽい。

## [testRegex](https://facebook.github.io/jest/docs/en/configuration.html#testregex-string)
Jestがテストファイルとして検出するために使用する正規表現。
defaultでは.ts, .tsxは含まれていないので必須。

## [moduleFileExtensions](https://facebook.github.io/jest/docs/en/configuration.html#modulefileextensions-array-string)
モジュールが使用するファイル拡張子の指定。
TSの場合は[ここ](https://github.com/kulshekhar/ts-jest#usage)で指定されているように「ts, tsx」を追加する必要がある。

## [moduleNameMapper](https://facebook.github.io/jest/docs/en/tutorial-react-native.html#modulenamemapper)
js以外のファイルをimportしている場合、コンパイルエラーが発生してしまうので、拡張子毎に指定したmockへとマップさせエラーを回避する。
[Mocking CSS Modules](https://facebook.github.io/jest/docs/en/webpack.html#mocking-css-modules)
["Syntax Error: Invalid or unexpected token" with .png](https://github.com/facebook/jest/issues/2663)
Officeのアイコンを探すのがメンドーな時に知ったら便利だったこと

# 「ファイル名を指定して実行」を使えば解決できる。

1. **[Windows]+[R]** を押そう。
2. 起動したいオフィスのコマンドを入力すれば完了だ。

```none
winword 'Wordの起動
excel 'Excelの起動
powerpnt 'PowerPointの起動
```
FirefoxのJavaScriptデバッガー

#はじめに
Firefoxでどこに値が入ってるかわからなかったので、ブレークポイントを指定して処理をとめてデータを確認します。

#セクション
Firefoxで about:debugging のページで、アドオンの左下にあるデバッグをクリックして、デバッガータブを開きます。止めたいソースコードの行数を左クリックしてマークします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262366/e1613e76-c6b3-a7f7-d6ad-ae7e4017c73a.png)

javascriptの動作する処理（このコード例だとページ上でテキストを選択の上で右クリック、get selected text メニューを選択）をします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262366/c7463012-aeee-bef2-983c-d95557bd3598.png)

選択していた文字が、info.selectionText に保管されているのがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262366/2b8e9ba7-4d58-a44c-376b-a91d41f00db1.png)

このテストケースだと console.log で info を出力させると selectionText に入ってるのはわかるのですが、どんなデータが入ってるかわからないときには止めてみてみるのは役にたちそうです。

```console:console
Object { menuItemId: "selectText", parentMenuItemId: 10, frameId: 0, editable: false, 
pageUrl: "https://qiita.com/keniooi/items/890...", selectionText: "csplit でファイル分割", 
modifiers: Array[0] }
```

やり方は知ってて当然かもしれませんが、一から自分で書いたコードでない場合に調べるのには使えそうです。

#参考
[デバッガー - 開発ツール](https://developer.mozilla.org/ja/docs/Tools/Debugger)
gcloud interactiveが便利すぎて感動した

## **突然ですが、みなさんコマンドラインツールのサブコマンドの数に圧倒された経験ありませんか？**
こんにちは、jackです。

特にたくさん種類があると大変ですよね。gcloudコマンドなんかもその一つです。
ただそれも、zshやbashの補完スクリプトでなんとか補えると思います。

## gcloudの補完スクリプト

gcloudはインストールすると親切に以下のように補完スクリプトをincludeしてくれます。

```shell
if [ -f 'pathto/google-cloud-sdk/path.zsh.inc' ]; then source 'pathto/google-cloud-sdk/path.zsh.inc'; fi
```

ただこれが**遅すぎてしかたない**。Tabを押してから1秒ほどかかるのに毎回イライラしてました。
すこし調べてGithub issueをみつけたのですが、2年前から動きがない様子…
https://github.com/isusanin/google-cloud-sdk/issues/512

もう少し調べていると、なんと...

## **gcloud 対話型シェル**を発見

実際にこんな感じでサクサク動く。

![interactive.gif](https://qiita-image-store.s3.amazonaws.com/0/265582/acda9b09-517a-174e-fad7-b76b01ef405f.gif)

## 導入は簡単

```shell
$ gcloud components update
$ gcloud components install alpha
$ gcloud alpha interactive
```

**これだけ！**
`kubectl`とか`bq`など使う方はこちらもやっておくと便利

```shell
$ gcloud alpha interactive --update-cli-trees
```

これ一つでGCPでの開発がすごく捗りそうです。

もっと詳しく知りたい方はこちらの[公式ブログ](https://cloudplatform-jp.googleblog.com/2018/03/introducing-GCPs-new-interactive-CLI.html)をどうぞ
DxLibプロジェクト作成編

どうしてもわからない場合は
http://dxlib.o.oo7.jp/dxuse.html
こちらを参照してください。

##①Visual Studioをインストール

～～省略～～

##②プロジェクト作成

<br>
VSを起動します
![SnapCrab_Microsoft Visual Studio _2018-6-20_23-27-51_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/3ab1ae16-2619-1644-0b87-3aff7fe6c8c3.png)

<br>
左上の`ファイル　=>　新規作成　=>　プロジェクト`をクリック。
出てきたウィンドで
`Visual C++　=>　空のプロジェクト`を選択
![SnapCrab_新しいプロジェクト_2018-6-20_23-29-24_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/193dc365-7351-83a3-2923-bb7b3992339b.png)
<br>

新しいプロジェクトが作成出来ました。
この時何かのファイルがあるときは作成の方法が間違っているのでやり直して下さい。
![SnapCrab_Project11 - Microsoft Visual Studio _2018-6-21_1-15-21_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/552c3d31-de2c-afa1-f289-ff46e514cb65.png)




<br>
左上の`プロジェクト =>　 新しい項目の追加`をクリックします。
出てきたウィンドで`Visual C++　=>　C++ファイル（.cpp）`を選択します。
追加をクリックします。
![SnapCrab_新しい項目の追加 - Project11_2018-6-20_23-41-7_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/c7b4392b-0da7-7edc-f0db-8b1a7434b707.png)



<br>
こんな画面が出れば問題ないと思います。
cppファイルを一つ追加するのがミソです。（既存のコード追加でもOK）
![SnapCrab_Project11 - Microsoft Visual Studio _2018-6-20_23-30-16_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/5fb5598f-6c39-1da6-be72-1e807595b37d.png)



##③プロジェクトの設定

次にプロジェクトのプロパティを開きます。

構成：すべての構成


`全般 =>　文字セット`を`マルチバイト文字セットを使用する`
![SnapCrab_Project11 プロパティ ページ_2018-6-20_23-32-51_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/234b0b8c-e6f9-7b8a-76d8-9be4ee9352cf.png)



<br>
`C/C++ =>　全般　=>追加のインクルードディレクトリ`にDxLib（プロジェクトに追加すべきファイル_VC用）を設定。
![SnapCrab_Project11 プロパティ ページ_2018-6-20_23-33-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/0ca0b8f2-5f6c-48a5-df08-16d59feb5665.png)


<br>
`リンカー　=>　全般　=>追加のライブラリディレクトリ`に先ほどと同じくDxLibを設定。
![SnapCrab_Project11 プロパティ ページ_2018-6-20_23-34-17_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/91a9a1f5-06c7-50d4-2a23-dfcc9c45c29e.png)


<br>
ここで左上の構成を`Release`に変更します。

構成：Release

`C/C++ =>　コード生成　=>　ランタイムライブラリ`を`マルチスレッド（/MT）`に変更。
![SnapCrab_Project11 プロパティ ページ_2018-6-20_23-34-49_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/1d5de427-0374-2b6f-d34a-b14a48c56c76.png)

<br>
再び構成を変更します。

構成：Debug

`C/C++　=>　コード生成　=>　ランタイムライブラリ`を`マルチスレッドデバッグ（/MTd）`に変更。
![SnapCrab_Project11 プロパティ ページ_2018-6-20_23-35-11_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/621d708c-12b1-f68e-96fc-5b8edee94c8f.png)


##④楽しくプログラミングする

～～以上～～
Scene遷移の注意点&遷移時のLightが暗くなる現象の改善策

#はじめに
Unityでよく使うSceneManager. しかし, よくSceneを遷移できなかったりするのでその際の注意点と遷移した際に暗くなる現象の解決策をここに記す. 

#Scene遷移時の注意点
- シーンを遷移するScriptに`using UnityEngine.SceneManagement`を入れているかどうか

```C#:LoadScene.cs
using UnityEngine.SceneManagement;
...
SceneManager.LoadScene("遷移するScene名");
```

- File->Build SettingsのSceneｓ in Buildにシーンを入れたかどうか
![スクリーンショット 2018-06-21 1.05.43.png](https://qiita-image-store.s3.amazonaws.com/0/207868/4adf08ed-c950-ef02-f473-e34c24fbdf11.png)

- Sceneを遷移するScriptをObjectにアタッチしているのかどうか

#Sceneを遷移した際にLightが暗くなる際の対処法
1. メニューバーのWindow->Lighting->Settingsを開く　　

![スクリーンショット 2018-06-21 0.58.40.png](https://qiita-image-store.s3.amazonaws.com/0/207868/f181cc52-de1f-80dc-8f92-219600d3fa07.png)
2. Auto Generateのチェックを外す　　

![スクリーンショット 2018-06-21 1.12.57.png](https://qiita-image-store.s3.amazonaws.com/0/207868/a26a79d6-1949-b4fa-4518-d6dd130c6dde.png)  

↓ 　

![スクリーンショット 2018-06-21 1.13.46.png](https://qiita-image-store.s3.amazonaws.com/0/207868/e64c18ab-0b28-f650-7237-d7ad5ca96375.png)　　
3. Generate Lightingをクリック
4. 実際にScene遷移を行ってみる
VirtualBoxにCentOSをインストールする方法 

# はじめに
IT職に就いていると、自宅のPCに学習用環境が欲しく(必要に)なったりします。
システムの開発環境や製品などは、個人利用フリーのものが多いので、利用には困りません。
そのため、割と簡単に自宅PCでも学習環境を整えることができます。

まぁ、そうなんですが…自宅PCにいろんなものをインストールしまくっていると、どんどん動作が重たくなってくるわけですね。
それで必要なくなった製品を消すかと思っても、アンインストールに失敗して二度と消せなくなるとかってこともあります。
どうしても解決しようと思うとOSごとインストールしなおすしかないんですが、それがまーまー面倒なわけです。

筆者は最近PCを買い替えたので、新しいPCにも開発環境を構築使用したわけですが、前のPCと同じ轍を踏まないため、今度はVMで仮想環境を立て、そこに開発環境を構築しようとしました。
VMであればバックアップなんかもOSごととっておいたり楽ですしね。

その時の手順を備忘として記載しておきます。

# 1. 環境情報
構築する環境情報を記載します。

|環境|バージョンなど|特記事項|
|:---|:-------------|:-------|
|ホストOS|Windows10 Pro||
|ゲストOS|CentOS7||
|仮想化ソフトウェア|Oracle VirtualBox|Windowsプロですが、Hyper-Vは使いません。|

#2. Oracle VirtualBoxのインストール
ダウンロードページからVirtualBoxをインストールします。

# 3. CentOSのインストール
VirtualBoxにCentOSをインストールします。
手順は[こちら](https://qiita.com/100/items/80a899fbaeb1e82b3f67)の記事で詳しく紹介されていますので、筆者が個人として参考記事とは違う操作をした際の注意書きだけ記載しておきます。
他にも参考になるWebはたくさんありますので、最後にまとめて記載します。

## 3.1. ダウンロード
ダウンロードするバージョンは、特にこだわりがなければ7をダウンロードしてください。

## 3.2. インストール
個人的に、インストール中に出てくるストレージは可変サイズを選択しておいた方が無難かと思います。
筆者はゲストOS上にOracleを入れようとして容量が足りなくなりました。
固定サイズにした方が動作は早くなりますが、あとで容量の拡張ができないというデメリットがあります。
絶対にできないわけではないのですが、正直めんどくさいです。
筆者はそれに気付かずあとでインストールしなおしましたorz

# 4. インストール後の設定
ネットワークアダプターの追加まではやっておいた方がいいと思います。
基本VMの画面でゲストOSの操作ができますが、どうしても重くなったりするので、TeratermなどSSHクライアントで操作できるようにしておいて損はありません。

# 5. その他の設定
筆者の個人的なオススメ設定を記載しておきます。
そんなにないのですが、パスやaliasなどの設定を記載しておきます。

## 5.1. カレントディレクトリにパスを通す
カレントディレクトリ(自分が今見ているディレクトリ)にパスを通します。
これをやっておくことで、カレントディレクトリにある実行ファイルを./抜きで実行することができます。
パスを通すには、.bash_profileにカレントディレクトリを追記ます。

	.bash_profile
	# 「.」はカレントディレクトリを示す記号なので、
	# 「.」をパスに追加します。
	PATH=$PATH:.

## 5.2. aliasの追加
aliasとはコマンドの別名で、登録したaliasをコマンドとして実行することでいろいろなことを実現できます。
ここではlsを見やすくするaliasしか紹介しませんが、aliasを知らなかった方はぜひ紹介しているもの以外にも活用してみてください。
aliasは.bashrcに記載します。

	# .bashrc
	alias ls='ls -F --color=auto'
	alias la='ls -aF --color=auto'

# 6. ゲストOSに製品をインストール
開発に必要なツールのいろいろとか製品のいろいろをインストールします。
長くなってしまうので、インストールするものごとに別の記事に記載します。
表にリンクをつけますので、そちらを参照してください。

|インストール物|リンク|特記事項|
|:-------------|:-----|:-------|
|Oracle DB 12c|[CentOS7にOracle12cをインストールして使う方法＋トラブルシューティング](https://qiita.com/tarosa0001/items/16377451a7e1b5786ac3)||

#おわりに
仮想環境は構築できましたでしょうか。
これからゲストのCentOS上に筆者がインストールしたいろいろの手順や、トラブルシューティングなどを記載した記事を増やしていきますので、困ったらこちらの記事をまたのぞきに来てみてください。

# おまけ
この記事を編集したときには知らなかったのですが、どうやら公式でOracle19c構築済みの仮想アプライアンスを配布してくれているようです。
これをインポートすれば、インストール作業不要でOracleが使用できます。
参考記事はこちらです。
https://qiita.com/ora_gonsuke777/items/b41f37637e59319796b4

# 参考
筆者もお世話になりました参考WebのURLを一覧で記載しておきます。
製作者、管理者の方々に感謝です。

- [VirtualBox (Windows) 上に CentOS 7 をインストールする](https://qiita.com/100/items/80a899fbaeb1e82b3f67)
- [VirtualboxにCentOS7をインストールするときの注意点](https://takaxtech.com/2017/07/06/article4/)
Chefでwrapper cookbookからキーを指定してターゲットクックブックのattributeを削除



公式サイトにnode.rm_defaultなどの記載が追加されていたので試して見る

[About Attributes](https://docs.chef.io/attributes.html)
Remove Precedence Level

#テストレシピ

```ruby:recipes/default.rb

node.default['foo']        = ' 2' # 優先順位
node.force_default['foo']  = ' 6' # 優先順位
node.normal['foo']         = ' 8' # 優先順位
node.override['foo']       = '10' # 優先順位
node.force_override['foo'] = '14' # 優先順位

def logput
  log "
  node['foo']                : #{node['foo']}

  node.default['foo']        : #{node.default['foo']}
  node.force_default['foo']  : #{node.force_default['foo']}
  node.normal['foo']         : #{node.normal['foo']}
  node.override['foo']       : #{node.override['foo']}
  node.force_override['foo'] : #{node.force_override['foo']}
  "
end

logput

node.rm_override('foo')
logput

node.rm_normal('foo')
logput

node.rm_default('foo')
logput



```
#実行結果

```
       Converging 4 resources
       Recipe: test::self_reference
         * log[
           node['foo']                : 14
         
           node.default['foo']        :  2
           node.force_default['foo']  :  6
           node.normal['foo']         :  8
           node.override['foo']       : 10
           node.force_override['foo'] : 14
           ] action write
         
# ここでnode.rm_override('foo')

         * log[
           node['foo']                :  8
         
           node.default['foo']        :  2
           node.force_default['foo']  :  6
           node.normal['foo']         :  8
           node.override['foo']       : {}
           node.force_override['foo'] : {}
           ] action write
         
# ここでnode.rm_normal('foo')


         * log[
           node['foo']                : {} #<= normalのリセットが必要。なお、もしここまでnomal系に触っていなければ6
         
           node.default['foo']        :  2
           node.force_default['foo']  :  6
           node.normal['foo']         : {} 
           node.override['foo']       : {} 
           node.force_override['foo'] : {} 
           ] action write

# ここでnode.rm_default('foo')

         * log[
           node['foo']                : {}
         
           node.default['foo']        : {}
           node.force_default['foo']  : {}
           node.override['foo']       : {}
           node.force_override['foo'] : {}
           ] action write
```

#結果サマリー
- rm_defaultはdefaultとforce_defaultを消す
- rm_normalはnomalを消す
- rm_overrideはoverrideとforce_overrideを消す

なお、normal系は、値が保持される特徴を持っていて、一度でも使われるとrm_normalしても{}として残り、defaultやforce_defaultを覆い隠してしまう。

rm_normalでその辺も削除できることを期待していたが残念。

このnormalの削除は、例えば以下などで可能
- Chef Workstatonでは、knife node edit NODEなどでトップレベルの  "normal": { }内の該当箇所をクリア
- test-kitchen + chef-zero 環境では、/tmp/kitchen/nodes/<インスタンス名>.json を同様に編集するか削除

```
$ kitchen exec all --command='sudo rm /tmp/kitchen/nodes/default-centos-7.json'
-----> Execute command on test-centos-7.
$
```


#追記
\#{node.role_default['foo']}などといった普通でないアクセスはテスト目的以外では行わないほうが良さそう。
いろいろ試して見た結果、値が設定されていない高優先順位のnode.force_override['foo']などにアクセスすると、以降node['foo']は空のHash?(Chef::Node::ImmutableMashクラスのインスタンス)となり、アクセスされたのより低優先順位の属性は隠されてしまった。
上の実行結果は、たまたまほぼ上手くいく順序。
Course 4 > Week 1 Foundations of Convolutional Neural Networks（Coursera Deep Learning Specialization 受講記録）

Coursera > [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) > **Course 4 : Convolutional Neural Networks** の受講記録。

#概要
Course 4 は4週分の講座から構成される。

1. [Week 1 Foundations of Convolutional Neural Networks](https://qiita.com/onooooo/items/7e1dadb271085045f2c4)
2. [Week 2 Deep convolutional models: case studies](https://qiita.com/onooooo/items/f35f521c6f68a2d88454)
3. [Week 3 Object detection](https://qiita.com/onooooo/items/f36dde6014304a02668b)
4. Week 4 Special applications: Face recognition & Neural style transfer

Week1 はCNNの基本を学ぶ。

---
#Convolutional Neural Networks
##Computer Vision
これまで学んできたようなNNのinputとしてそれなりのサイズの画像を与えると、パラメータの数が膨大になる。1000×300万次元の行列・・・等。畳み込み演算をつかうことでこの問題を解消できる。

##Edge Detection Example
畳み込み演算をつかって簡単な垂直エッジ検出を行う例。

##More Edge Detection
positive edge と negative edge
Sobel filter
Scharr filter
フィルタの値をlearning parameterとして学習させる方法もある

##Padding
Paddingを使わない場合、以下の課題がある。

- 畳み込み演算を繰り返すたびにinputの画像サイズがどんどん小さくなる
- 画像の端近くの情報は軽視されがち

Valid Convolutions : Paddingを使わない
Same Convolutions : inputとoutputが同じサイズになるようPaddingする

##Strided Convolutions
Stride = 畳み込み演算を適用する間隔。
Strideが大きいと、inputに比べてoutputがより小さなサイズになる

outputの1辺のサイズ =  floor( (n + 2p - f)　/　s + 1 )
n:inputの1辺のサイズ、f:filter、p:padding、s:stride

CNNの世界で言う「畳み込み演算」は、数学や信号処理の世界では厳密には「相互相関」と言われる。
(参考)[畳み込み警察です！　たまには反転のことも思い出してやってください](https://yaritakunai.hatenablog.com/entry/2017/08/01/181000)

##Convolutions Over Volume
channel数を加味した畳み込み演算の例。
inputとfilterのchannel数は合わせる必要がある

##One Layer of a Convolutional Network
畳み込みニュラルネットワークの1階層分の動作
表記法の紹介
ConvNetではパラメータの数は入力画像のサイズに依存せず、フィルタのサイズに依存し、入力画像サイズに比べてずっと少ない数で済む。

##Simple Convolutional Network Example
複数階層のConvNetの例。一般的なConvNetでは層が深くなるほどinputの高さと幅が小さく、チャネル数は多くなる。以下の種類のレイヤーがある。

- Convolution(CONV)
- Pooling(POOL)
- Fully Connected(FC)

##Pooling Layers
Pooling Layer：表現のサイズを縮小し、計算を高速化し、ロバスト性が増す
Max PoolingとAverage Poolingがあるが、通常はMax Poolingを使う
通常はPaddingしない
ハイパーパラメータは必要だが、学習の必要なパラメータは無い。

(参考)

- [CNNについて　③　プーリング層について How does Pooling Layer Work](http://keno-edu-lasalle.hatenablog.com/entry/2017/11/06/130034)
- [定番のConvolutional Neural Networkをゼロから理解する](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)


##CNN Example
全結合層も加えたCNNの例。
LeNet-5と呼ばれるClassicなニューラルネットワークに似ているサンプルで説明。
Pooling層には学習の必要なパラメータは無い
FC層はパラメータ数が多い
Conv層はパラメータ数が少ない

##Why Convolutions?
Parameter shareing
垂直エッジ検出器などの特徴検出器(filter)は、画像のいろいろな部分に対して有用と考えられる→filter（パラメータ）を使い回すことができ、学習の必要なパラメータ数を削減できる

---
#Heroes of Deep Learning (Optional)
##Yann LeCun Interview
後で見る。。
ubuntu16.04.4で全てのコマンドの実行権限を消してしまったときの対処法

##**はじめに**
コマンドの実行権限を消してしまい、コマンドの実行ができず、PCにログインすらできなくなってしまったときの対処方法です。

#**概要**
PCにログインしようとすると、"The system is running in low-graphics mode"というエラーが出てログインできなくなりました。いろいろと調べるとリカバリモードでログインすればいいらしいのでやってみました。

[How to fix “The system is running in low-graphics mode” error?
](https://askubuntu.com/questions/141606/how-to-fix-the-system-is-running-in-low-graphics-mode-error)
[Ubuntu 16.04: recovery modeの文字化けを修正する](https://www.hiroom2.com/2016/05/13/ubuntu-16-04%E3%81%AErecovery-mode%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B/)

##**GRUB起動**
1. PC(BIOS)を起動して`Esc`キーを入力し、GRUBを起動します。
2. `Advanced option for Ubuntu`の行で`Enter`キーを入力します。
3. `Ubuntu, with Linux .... (recovery mode)`の行で`e`キーを入力し編集します。(最新バージョンを選ぶ)
4. ルートパスワードの変更や文字化けの修正をする必要があるときは、編集画面の`linux /vmlinux ..... ro recovery nomodeset`の行の、`ro`を`rw`に変更(ルートパスワードの変更)し、最後に`locale.LANGUAGE=C`を追加(文字化けの修正)します。(別にやらなくてもいい) 
  
```
   linux /vmlinux ..... rw recovery nomodeset locale.LANGUAGE=C
```      

5.`Ctrl + x`で保存し、リカバリモードを起動します。
 
#**リカバリモード起動**
1. rootの行で`Enter`キーを入力し、rootユーザでコンソールを表示します。
2. コンソールでコマンドの実行権限を付与します。  
  
```
chmod ugo+x /bin 
```  


#**おわりに**
意外となんとかなるみたいですね。
OculusGoでVRChatを遊ぼうとしたときにつまづいたところまとめ

#つまづかなかったところ
OculusGoのセットアップはすんなりできた。

#つまづいたところ

##ALVRのバージョンが古かった
ALVRをダウンロードして1週間ほど放置していたらバージョンアップしていたので再ダウンロード。
##ALVRのdriver_install.batを叩いてなかった
driverフォルダの中にあったので見落としていた。

##グラボのデバイスドライバが古かった
ALVRのStartServerクリック時にALVRが落ちるので調べてみると、グラボのドライバが古かった。
最近は古いゲームばかりで遊んでいたので1年ぶりくらいのアップデートだった。

##SteamVRがインストールされてなかった
SteamVRをインストールする場合、ストアではなくライブラリ→ツールの一覧からインストールすること。
20分ほどハマった。

##OculusGoのポートを開放していなかった
ALVRとOculusGoの接続には成功するが、ゲームを起動してもOculusGo側の表示は変わらず。
ルームセットアップを進めようとしても「次へ」がグレーアウトしたまま。
ALVRの表示からOculusGoのIPアドレスを確認し、ポート9944を開放することで無事接続。
（それまではALVRを起動するマシンのポートを開けていた）

##その他
・ALVRを起動したマシンとOculusGoをUSBケーブルで繋ぐ必要はない。
・Xinput対応パッドを使うと快適。
・書いてる間にもアップデートあって笑った。
・導入よりもフレンド作るほうが大変そうです。
【iOS】UIPageViewControllerの無限ページングの実装

いつも忘れてしまうので備忘録として。基底クラスとしてもいいかな。


``` InfinitePageViewController.swift

class InfinitePageViewController: UIPageViewController {
    // 表示するViewControllerのリスト
    private let vcList: [UIViewController]
    
    // 今回はストーリーボードで作成した
    required init?(coder: NSCoder) {
        // ViewControllerのリストを初期化する
        let redVC: RedViewController = RedViewController()
        let blueVC: BlueViewController = BlueViewController()
        let yellowVC: YellowViewController = YellowViewController()
        let vcList: [UIViewController] = [redVC, blueVC, yellowVC]
        self.vcList = vcList
        super.init(coder: coder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.initPageViewControllers()
    }
    
    // ページングの初期化をする
    private func initPageViewControllers() {
        // 一番最初に表示したいViewControllerを指定する
        self.setViewControllers([self.vcList[0]], direction: .forward, animated: true, completion: nil)
        self.dataSource = self
    }
    
    // MARK: 次のViewControllerのindexを取得する
    // originViewController: ページングする前のViewController
    // ifAfter: true=後のViewControlelrか, false: 前か
    private func nextVCIndex(originViewController: UIViewController, ifAfter: Bool) -> Int? {
        guard let originVCIndex: Int = self.vcList.index(of: originViewController) else {
            return nil
        }
        var nextVCIndex: Int = originVCIndex
        nextVCIndex += ifAfter ? 1 : -1
        if nextVCIndex >= self.vcList.count {
            nextVCIndex = 0
        }
        else if nextVCIndex < 0 {
            nextVCIndex = self.vcList.count - 1
        }
        return nextVCIndex
    }
}

extension InfinitePageViewController: UIPageViewControllerDataSource {
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        if let nextVCIndex: Int = self.nextVCIndex(originViewController: viewController, ifAfter: false) {
            let nextVC: UIViewController = self.vcList[nextVCIndex]
            return nextVC
        }
        return nil
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        if let nextVCIndex: Int = self.nextVCIndex(originViewController: viewController, ifAfter: true) {
            let nextVC: UIViewController = self.vcList[nextVCIndex]
            return nextVC
        }
        return nil
    }
}

```

#プレビュー

![完成動画.gif](https://qiita-image-store.s3.amazonaws.com/0/263659/999a60f9-3cb5-c5c6-88ca-1adf0f1c6e65.gif)
console だけでわかる Redux 前編　~store/action/reducer 編~

![redux-1-312x234.png](https://qiita-image-store.s3.amazonaws.com/0/119234/ba862e21-4518-9599-7ba6-70ceb1f86020.png)

# この記事の対象

- Redux について知りたいけどよくわからんという初学者
- Redux をなんとなく使っているけど、全体像が理解できていない人

nodeのREPL(console)のみを使って、reduxというのは何なのかを説明してみます。
**わかりやすさ** と **手軽さ** に特化しています。
reducerの統合などの複雑化に対抗するための概念や、思想やそもそもなんで Redux すると嬉しいの？ ということについては、[他にもいい記事](https://qiita.com/kiita312/items/ae3ce31521ad24dd699f)がたくさんあるので、そちらで補完していただければと思います。


# そもそも Redux って？

一言でいうならば**アプリケーションの持つ状態(state)を一箇所で管理するためのライブラリ** です。  
React と併用することを想定されて作られて居ますが、 **単体でも動作します。** だからコマンドラインだけでできるんですね。

## 環境構築

とりあえず nodeが使える状況で以下のコマンドを叩いてください。

```
$ mkdir redux-console
$ cd redux-console
$ npm init
$ npm install redux
$ node
```

node_modules があるディレクトリで node の REPL を立ち上げるとライブラリが呼べるの、地味に便利なのでよく使います。

以下、コードはすべて node の REPL です。

## redux を用意

```JavaScript
const redux = require('redux');
```

まず node コンソールを立ち上げ、redux オブジェクトを用意します。

## reducer を作る

```JavaScript
const counterReducer = (state = { counter: 0 }, action) => {
   if (action.type==='COUNT_UP') {
      return { counter: state.counter+1 };
    } else {
       return state;
     }
   };
```

reducer は、redux アプリの状態(state)を変化させるための関数です。
引数に以下の二つをとります。

- 変化前の状態を表す state オブジェクト
- ユーザがどのような操作をとったかを表現する action オブジェクト

戻り値は

- ユーザが操作を行なった結果を表現する state オブジェクト

です。
今回は数を増やす'COUNT_UP'というをアクションを定義しました。
なお、今回コマンドライン上で各関数を再定義することがあるため let を使っています。実際に使うときはもちろん const を使ってください。

## reducer を store に渡す

```JavaScript
const storeA = redux.createStore(counterReducer);
```

redux.createStore に reducer を渡し、reducerが登録されたstoreを生成します。
storeオブジェクトはreduxで**state 管理を一手に引き受ける** オブジェクトです。  
stateを保持し、また登録されたreducer はこの store オブジェクトが呼び出します。**それ以外の場所からreducerが呼び出されることはありません。** state を触りたいときは、store に操作を依頼します。
例えば、state オブジェクトを取得したければ、store.getState()を使います。

```JavaScript
storeA.getState();
// -> { counter: 0 }
```

## action を定義して dispatch する

```JavaScript
const countAction = { type: 'COUNT_UP' };
storeA.dispatch(countAction);
storeA.getState();
// -> { counter: 1 }
storeA.dispatch(countAction);
storeA.getState();
// ->{ counter: 2 }
```

action は、**store を操作するためのコマンド** です。action を store.dispatch()することにより、store はその action を使って reducer を呼び出し、state を更新します。


後編　~actionCreator/middleware編~　に続きます。

## 余談

実はこの記事、かなり前に受講した、[meteo-fan](https://meteor-fan.connpass.com/)さんの「JavaScript を学ぶ Web アプリ開発塾」で教えていただいたチュートリアルのまとめです。
その説明があまりにわかりやすく、「これは独り占めにするのは勿体無い！」と思ったので、講師の方に許可をとってまとめよう....と、したのがかれこれ半年前。200 行くらいまで作ったところで次元の狭間に飲み込まれ、本日発掘されました。
まだ需要もある記事を SSD の肥やしにしておくのもアレなので公開しようと思います。
Qiita用MarkDownまとめ（テスト記事）

# はじめに
Qiita練習用のテスト記事です。

# 見出し1
## 見出し1.1
### 見出し1.1.1
「\#」の数で階層表現

# 引用
\> 引用文章
みたいに「>」で始める

> 引用文章

# 挿入
## コード
\`\`\`
def insert_code():
    print("code")
\`\`\`
みたいに「\`\`\`」で囲む

```
# コード挿入
def insert_code():
    print("code")
```
　　
\`\`\`python:insert_code.py
def insert_code():
    print("code")
\`\`\`
みたいに最初の「\`\`\`」のあとに言語、ファイル名を書くと
シンタックスハイライトとファイル名が付けられる

```python:insert_code.py
# コード挿入（シンタックスハイライト）
def insert_code():
    print("code")
```

## インラインコード
\`inline_code\`
みたいに「\`」で囲む

インライン`inline_code`コード

# リンク
## 名前無し
\[タイトル](URL)
みたいに書く

[Qiita](http://qiita.com/)

## 名前付き
\[タイトル](URL "名前")
みたいに書く

[Qiita](http://qiita.com/ "名前付きリンク")

# 画像
## 名前無し
\!\[タイトル](URL)
みたいに書く

![Qiita](http://cdn.qiita.com/assets/siteid-reverse-6044901aace6435306ebd1fac6b7858c.png)

## 名前付き
\!\[タイトル](URL "名前")
みたいに書く

![Qiita](http://cdn.qiita.com/assets/siteid-reverse-6044901aace6435306ebd1fac6b7858c.png "名前付き画像")

# 文字修飾
## イタリック
\_イタリック\_
みたいに「\_」か「\*」で囲む

_イタリック1_
*イタリック2*
部分_イタリック_です

## ボールド
\_\_ボールド\_\_
みたいに「\_\_」か「\*\*」で囲む

__ボールド1__
**ボールド2**
部分__ボールド__です

## 打ち消し
\~\~打ち消し\~\~
みたいに「\~\~」で囲む

~~打ち消し~~
部分~~打ち消し~~です

# リスト
## 普通のリスト
\* リスト1
\+ リスト2
\- リスト3
みたいに「*」か「+」か「-」で始める

* リスト1
+ リスト2
- リスト3

## 番号付きリスト
　1. 番号付きリスト1
みたいに「1.」で始める

1. 番号付きリスト1
2. 番号付きリスト2

## チェック付きリスト
\- [ ] チェックなし
\- [x] チェックあり
みたいに「- [ ] 」か「- [x] 」で始める

- [ ] チェックなし
- [x] チェックあり

# 水平線
\***
\-----
みたいに「*」か「-」を3つ以上つなげる
***
---

# テーブル
\|列1|列2|列3|
\|:--|:-:|--:|
\|左揃え|中央揃え|右揃え|
\|1|22|333|
みたいに頑張って書く

|列1|列2|列3|
|:--|:-:|--:|
|左揃え|中央揃え|右揃え|
|1|22|333|
　　
もしくは「3x2」みたいにやると下のようにできる

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |

# エスケープ
\\# 見出しじゃない（エスケープ）
みたいに「\」を付ける

\# 見出しじゃない（エスケープ）

# 改行
図とかの前後で改行したいときは「　　」
みたいにスペースを2つ入れる


# 参考記事
[良い記事を書くためのガイドライン](https://help.qiita.com/ja/articles/qiita-article-guideline)
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
USBカメラのopencv-processing差分更新

#環境
macOS High Sierra
processing 3.2.1

#はじめに
USBカメラで差分を撮ろうとしてつまづいたのでメモ
`opencv-processing`内のexample`BackgroundSubtraction`をUSBカメラを使って表示できるようにちょっと改造した

#できること
なにかものが動いたときに差分をとることができる
<img width="638" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/176479/98d99eac-03eb-6e6a-417c-161ab54691d8.png">


#　コード

```java
import gab.opencv.*;
import processing.video.*;
import java.awt.*;

Capture video;
OpenCV opencv;

void setup() {
  size(640, 480);
  video = new Capture(this, 640/2, 480/2);
  opencv = new OpenCV(this, 640/2, 480/2); 
  opencv.startBackgroundSubtraction(5, 3, 0.5);

  video.start();
}

void draw() {
  scale(2);
  opencv.loadImage(video);

  image(video, 0, 0 );
  opencv.updateBackground();
  
  opencv.dilate();
  opencv.erode();
  
  
  noFill();
  stroke(0, 255, 0);
  strokeWeight(3);
  for (Contour contour : opencv.findContours()) {
    contour.draw();
  }
}

void captureEvent(Capture c) {
  c.read();
}
```


##参考文献
https://github.com/atduskgreg/opencv-processing-book/blob/master/book/tracking/background_subtraction.md
symfony/finderでディレクトリとファイルの一覧を取得する

# 前提

```
composer require symfony/finder
```

でFinderが使えるようになっていること。

# 取得方法

## 対象ディレクトリを指定する

```php
use Symfony\Component\Finder\Finder;

$finder = new Finder();
$finder->in([対象ディレクトリ]);
```

## 取得条件を指定する

メソッドチェーンで指定出来るので必要に応じて指定する。

```php
$finder->files()->path('tmp')->name('*.bak')
```

説明の為に分割したが、上述の対象ディレクトリ指定からチェーンで繋げても問題無い。
良く使いそうな物としては下記のような物がある。

|メソッド|引数の指定例|備考|
|:--|:--|:--|
| in($dirs)| 'src/hoge/fuga' ||
| files()|-|ファイルのみを対象とする|
| directories()|-|ディレクトリのみを対象とする|
| sortByName() |-|名称でソートする|
| sortByType() |-|最初にディレクトリ、次にファイル名でソートする|
| name($pattern)| '*.html' | 正規表現も利用可能 |
| path($pattern) | 'image/foo' | 正規表現も利用可能 |
| depth($level) | '== 0' | 指定しないとサブディレクトリ全てが対象になる|

なお、１回設定した条件はクリア出来ないので、他の条件で一覧を取得したい場合は別インスタンスを使う必要がある。

## 結果を取得する

```php
foreach ($finder as $file) {
    var_dump($file->getPathname());
}
```
Jenkinsのユーザー名に「.(ドット)」を使いたい

#背景
今までユーザー名に「.(ドット)」を利用することができたが、バージョン2.107.3から制限された。
https://jenkins.io/doc/upgrade-guide/2.107/
でも使いたい。

#対応
Jenkinsの設定ファイルである**/etc/sysconfig/jenkins**にある**JENKINS_JAVA_OPTIONS**に対して下記を追加する。
`-Dhudson.security.HudsonPrivateSecurityRealm.ID_REGEX=[a-zA-Z][a-zA-Z0-9_.@-]+`
Shebang集


- ファイルが+xされた時直接実行できること
- **コンパイルできる言語はコンパイルも普通に行えること**
- を条件とします

なお、Perl等の自明なものは掲載しません。

## D

```
#!/usr/bin/env rdmd
```

## R

```
#!/usr/bin/env Rscript
```

- Rscriptが使えない古いバージョンでは[littler](http://dirk.eddelbuettel.com/code/littler.html)が使えます

```
#!/usr/bin/env r
```

## Haskell

```
#!/usr/bin/env runghc
```

## Crystal

- コンパイルキャッシュ機能が内蔵されています

```
#!/usr/bin/env crystal
```

## Boo

```
#!/usr/bin/env booi
```

## Groovy

- 普通の書き方でgroovycも問題なく使えます

```
#!/usr/bin/env groovy
```

## Kotlin

- コンパイル用の.ktを直接実行するには、現状では[kscript](https://github.com/holgerbrandl/kscript)が必要です
- 現状では.ktは.ktsと同様に`#!`形式が許容されていますが、今後変更されるかもしれないのがちょっと…

```
#!/usr/bin/env kscript
```

```
//usr/bin/env kscript $0 $@;exit
```

## Awk

- envを経由できない環境があるかもしれません

```
#!/usr/bin/env awk -f
```

- こちらであれば使える環境があるかもしれません

```
#!/usr/bin/awk -f
```

## Sed

- envを経由できない環境があるかもしれません(以下同様)

```
#!/usr/bin/env sed -f
```

## Octave

- envを経由できない環境があるかもしれません(以下同様)

```
#!/usr/bin/env octave -q
```

----

以下では厳密にはShebangではありませんがシェルスクリプトのPolyglotとして扱うことで+xを実現できるものを挙げます。

## Go

(~~runと$0の間に-gcflags=-G=3を付けても良いと思います1.17以降専用になりますが。~~ 1.18で不要になりましたね)

```
//usr/bin/env GO111MODULE=off go run $0 $@;exit
```

## Swift

```
//usr/bin/env swift $0 $@;exit
```

## F# ##

- 拡張子は.fsxに限定されます(fsxでもコンパイルは可能です)
- 直接実行の場合、C言語ライブラリ等(要するにSystem.Runtime.InteropServices)は呼べなくなります

```
//usr/bin/env fsharpi $0 $@;exit
```

## Java

- Java 11以降限定です
- `#!`形式も使えるようですが、javacではエラーになるため採用しませんでした。

```
//usr/bin/env java $0 $@;exit
```

## Scala

- `extends App`は使えなくなるので注意してください
- https://qiita.com/cielavenir/items/b83552a761419be57285

```
//usr/bin/env scala $0 $@;exit
```

## C# ##

- csとcsxを用意します。
- csxで以下のようにします。

```
//usr/bin/env csi $0 $@;exit

#load "prog.cs"
Klass.Main()
```

example: https://github.com/cielavenir/procon/blob/a3d296fb26cd10b1cadf1e5831c1958b4f310c42/hena/tyama_hena24_enum.csx

## C

### tempfile(汎用)

- キャッシュを作成しないため、コンパイルに時間がかかるプログラムは要注意 (C++も同様)
- この方法であれば、出力先を指定できる処理系であれば何でも適用できそうですね

[221007] ちゃんと明文化してなかったけど、これ、コンパイルフラグをコードの形で残せる点ではかなり有用だと思います。C/C++の規格指定やリンクすべきライブラリなど。

```
//usr/bin/env true; tmpfile=$(mktemp); gcc -O2 -std=gnu99 -xc -o $tmpfile $0 && $tmpfile "$@"; rm $tmpfile; exit
```

### picoc

- picocはいろいろ制限が多いです。

```
//usr/bin/env picoc $0 - $@;exit
```

## C++

### tempfile(汎用)

```
//usr/bin/env true; tmpfile=$(mktemp); g++ -O2 -std=gnu++11 -xc++ -o $tmpfile $0 && $tmpfile "$@"; rm $tmpfile; exit
```

### C (external cacher)

- 紹介のみ
- https://github.com/ryanmjacobs/c
- `#!`形式を使った場合、cコマンドで取り除かれた結果コンパイルできるだけなので、通常のコンパイルができなくなることは言うまでもないです

```
//usr/bin/env c $0 $@;exit
```
AndroidのToolbarを透明にする

# この記事は？
「Toolbarのを透明にして背景画像を隠さないようにしたい」という要望は多いと思います。
というわけで、やってみました。

# やってみた
```acticity_main.xml
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:tools = "http://schemas.android.com/tools"
    android:id="@+id/myLinearLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/main_page_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:elevation="4dp"/>

    <FrameLayout
        android:id="@+id/buttonAndPreviewAreaId"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <!--省略-->

    </FrameLayout>

</LinearLayout>
```

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

        // アプリ上部のToolbarを呼び出す
        setSupportActionBar(main_page_toolbar)

        // Toolbarの背景を透明にする（透明にしないときは255にする）
        main_page_toolbar.background.alpha = 0

    }
}
```

これだけです。

# 追記
「透明にしないときは１００にする」とか書いてありましたが、嘘です。
１００ではなく、２５５です。
alphaは以下のように定義されていました。

```java
    /**
     * Specify an alpha value for the drawable. 0 means fully transparent, and
     * 255 means fully opaque.
     */
    public abstract void setAlpha(@IntRange(from=0,to=255) int alpha);
```
[Unity] テクスチャの名前をいれておくとMemoryProfilerでみたときに画像が表示されて良い

## AB化されていない画像を読み込んでも MemoryProfiler上で表示してほしい
AssetBunle 化したテクスチャや、 Resource.Load を使って読み込んだテクスチャは次のようにMemoryProfiler上からどのテクスチャなのか確認できる。

<img width="399" alt="Screen Shot 2018-06-20 at 22.34.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/aa6664b3-19e5-bad4-3fbe-cc5d2b362e8c.png">

だけど、画像はそのままのファイルのままで扱うこともできるので、アセットバンドル化せずに扱ったりもする。

```csharp
// png画像を読み込んでTexture2Dにする
var texture = LoadTexture(filePath);
image.sprite = Sprite.Create(texture, new Rect(0,0, texture.width, texture.height), Vector2.zero);
```

そのときに読み込んだ画像が MemoryProfiler 上では次のようになって、どの画像なのかわからなくなるのでちょっと不便。

<img width="399" alt="Screen Shot 2018-06-20 at 23.06.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/0ef43743-43f0-e02c-fe82-878ebe480a3f.png">

これはテクスチャを生成したときに名前を入れてあげると解決した。

```csharp
// png画像を読み込んでTexture2Dにする
var texture = LoadTexture(filePath);
texture.name = filePath;
image.sprite = Sprite.Create(texture, new Rect(0,0, texture.width, texture.height), Vector2.zero);
```

<img width="398" alt="Screen Shot 2018-06-20 at 23.11.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/5ad9072a-f0bc-d8d8-9b80-f06b4c8ba486.png">

### MemoryProfier側の実装をみてみる
Inspector.cs の GetTexture(NativeUnityEngineObject nativeObject) で以下の処理をしていた。

```csharp
if(loadedTextures[i].name == nativeObject.name)
{
    return loadedTextures[i];
}
```

テクスチャの名前で比較している感じ。

昔のMemoryProfilerなら名前いれなくてもみれたけどなと思って確認したら、

```csharp
EditorUtility.InstanceIDToObject(nativeObject.instanceID) as Texture2D;
```
をしてテクスチャをとっていた。最新のものと実装が変わっていたのか。

## まとめ
そのままの画像ファイルを Unity で使う場合は Texture2D 生成時に name を更新しておくと MemoryProfiler が表示してくれるので確認しやすくなる。
powershell で ruby の String.gsub(pattern){|match| block} を作ってみた

PowerShellで文字列置換をする方法はいくつかありますが、
ruby の String.gsub でブロックをとるパターン的なものがなかったので作ってみました。

```powershell
# 動作環境
$PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17134.112
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17134.112
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

```

```powershell

function Get-Gsub {
  param([string]$pattern, [ScriptBlock]$block)
  begin {
    function reverse { 
      $arr = @($input)
      [array]::reverse($arr)
      $arr
    }
  }

  Process {
    $text = $_
    $_ | select-string $pattern -AllMatches | 
      % { $_.matches } | reverse |
      % {
      $m = $_
      $index = $m.index
      $length = $m.length
      $text = $text.remove($index, $length)
      $ret = & $block($m)
      $text = $text.insert($index, $ret)
    }
    $text  
  }
}

$text = @"
hello, world
hello, powershell
"@

$TextInfo = (Get-Culture).TextInfo
$text | Get-Gsub "\w+" { 
  $TextInfo.ToTitleCase($_.groups[0].value)
}
#=> Hello, World
#=> Hello, Powershell
```
zipファイルの中身とその圧縮前のサイズの一覧を取得したい

zipファイルの中身とその圧縮前のサイズの一覧を取得する--という、この世界でどれだけ需要があるかわからない処理を実装する機会があったため、その技術メモになります。

まずは下準備として、以下の手順でzipファイルを準備します。

```bash
mkdir -p dir0/dir1/dir2
echo -n 1   > dir0/file1
echo -n 22  > dir0/dir1/file2
echo -n 333 > dir0/dir1/dir2/file3
cd dir0
zip -r ../zipfile.zip *
cd ..
```

以上のコマンドを上から順番に流していくと、zipfile.zipというzipファイルが作成されます。中身の検証として、以下の手順でzipfile.zipを解凍、格納されたファイルと圧縮前のサイズの一覧を記録しておきます。

```bash
unzip -d dst zipfile.zip
cd dst
find . -type f -exec stat -c %n=%sB {} \;

# ./dir1/dir2/file3=3B
# ./dir1/file2=2B
# ./file1=1B
```

準備はこれで完了。本題のJavaコードは以下のようになります。

```java:Main.java
import java.io.IOException;
import java.util.zip.ZipFile;

public class Main {
	public static void main(String[] args) {
		try (var zipfile = new ZipFile("zipfile.zip")) {
			var entries = zipfile.entries();
			while (entries.hasMoreElements()) {
				var entry = entries.nextElement();
				if (entry.isDirectory()) {
					continue;
				}
				System.out.printf("%s=%dB%n", entry.getName(), entry.getSize());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

これを実行すると、以下のような出力が得られます。比較してみると、前準備の内容と一致していることがわかりますね(｀・ω・´)ｼｬｷｰﾝ

```bash
dir1/dir2/file3=3B
dir1/file2=2B
file1=1B
```
EV3RT上のmrubyで超音波センサーを使用するサンプルを試す

ETロボコン中四国地区夏の独自勉強会で使用した、超初心者向けのサンプルコード([detection-system](https://github.com/yamanekko/detection-system))の使い方です。
超音波センサーから30cm以内に障害物を検知している間、本体のLEDが緑色で光ります。


## ハードの準備
EV3本体の「Port2」に超音波センサーを接続してください。(他は何もいりません。ETロボコンプライマリークラスの走行体をそのまま使うこともできます)

## 使い方

GitHubから detection-systemプロジェクトをcloneします

```
git clone https://github.com/yamanekko/detection-system.git
```

### SDカードにローダー(uImage)をコピーする
EV3RTの動的ローディングで使用しているuImageが入っていればそのまま使ってください。
（sample_c4が動く状態であれば、新たにuImageをコピーする必要はありません）

EV3RTに同梱されているuImageを使います。
ev3rt/sdcard フォルダの中にあるev3rtフォルダとuImageファイルをSDカードにコピーします。

### detection-system をコピーする
コピーしたev3rtフォルダの中のappsフォルダにdetection-appとmain_task.rbをコピーします。

### 実行する
SDカードをEV3にさして電源を入れてください
起動したら、真ん中の少し濃いグレーのボタンを押します。
SD cardを選択、detection-appを選択すると、画面に小さく「detection system」と表示されます。超音波センサーが光ったらプログラムは動作しています。超音波センサーの前に手をかざしてみてください。（このプログラムは超音波センサーから30cm以内で検出するように設定されています）

左上ボタンを長押しすると終了します。

## 実行するRubyコードを変更する

main_task.rbの中身を自由に書き換えて実行することもできます。
変更したmain_task.rbをSDカードのappsフォルダにコピーし直すだけでOK
（ビルド等は必要ありません）
※ 起動するファイル名をdetection-app内で指定しているため、このサンプルプログラムではmain_task.rbという名前のRubyコードのみ実行できます。

## （参考）detection-appについて
本サンプルコードではこの部分を変更する必要はありませんが、改造して使うことはできますので、簡単に解説しておきます。
main_task.rbを実行するような設定になっているEV3RT用のアプリケーションです。
C/C＋＋と同様、ビルドはworkspaceフォルダで行います。
ご自身でビルドしてみる場合は、```Makefile.inc```の以下の場所を書き換えてください。

```
APPL_LIBS += /(mrubyがあるディレクトリ)/mruby/build/EV3RT/lib/libmruby.a -lm
INCLUDES += -I/（mrubyがあるディレクトリ）/mruby/include
```


書き換えたら、コマンドでworkspaceフォルダに移動します。

```
cd ~/ev3rt/hrp2/sdk/workspace
```

サンプルプログラムをビルドします。

```
make app=detection-system
```
生成されたappの名前をdetection-appにリネームしたものが同梱されているdetection-appです。

## （参考）開発環境の作り方
detection-appを変更してみたい場合はmruby用の開発環境が必要になります。

mruby用の開発環境をまだ作っていない場合は以下を参考に作成してください。
### EV3RTのC/C++用の環境がある人向け
[C/C++用のEV3RT環境構築にmruby環境を追加する方法](https://qiita.com/yamanekko/items/f4744383146aaee25ac5)
### EV3RT用環境構築がまだの方向け
[TOPPERSの環境構築ガイド](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnv#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB)
[Mac用にちょっと詳しいやつ](https://qiita.com/yamanekko/items/3cee3991ea9472a1f6b6)
「async」が「スコープ内でawaitを記述できる関数につけるやつ」じゃなかった


:writing_hand:  [async function](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)

```javascript:
//「async function式」or「async function宣言」で
//「AsyncFunction」オブジェクトを返すasync関数を定義
let f = async function(x) {
  return x;
};

console.log(f);
// -> [AsyncFunction: f]

console.log(async function f(x) {
  return x;
});
// -> [AsyncFunction: f]
```

```javascript:AsyncFunctionオブジェクトについて
// AsyncFunctionはグローバルオブジェクトではないのでこんな感じで取得して使える
const AsyncFunction = Object.getPrototypeOf(async function() {}).constructor;
let f = new AsyncFunction("x", "return x;");

console.log(f);
// -> [AsyncFunction: anonymous]
```

```javascript:async関数(AsyncFunctionオブジェクト)が呼び出された場合はPromiseを返す
let f = async function(x) {
  return x;
};
console.log(f());
// -> Promise { undefined }
```

> ***async 関数が呼び出された場合、 Promise を返します。***

... 🤦


```javascript:つまり
// Promiseなのでreturn, errorでthen, catchに繋げられる
let f = async function(x) {
  if (x === "🙋") {
    return x;
  } else {
    throw new Error("🚨");
  }
};

f("🙋")
  .then(v => console.log(v))
  .catch(e => e);
// -> 🙋

f("🙆")
  .then(v => v)
  .catch(e => console.log(e.message));
// -> 🚨
```

:moyai: 「...ずっと無駄なPromiseでラップしてましたわ」

[JavaScript の async/await の仕様をずっと誤解していた](https://dev.to/jgs/javascript--asyncawait---2l41)
[async function](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)
[async function expression](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/async_function)
[AsyncFunction](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/AsyncFunction)
ISO 8601のUTCの文字列から指定したタイムゾーンの文字列を得る方法

次のような[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)の拡張表現のタイプスタンプ文字列がログファイルなどにあったとき、JSTタイムゾーンの時刻に変換するには、[parsedateパッケージ](https://cran.r-project.org/web/packages/parsedate/index.html)を使うと便利。

````{R}
> 拡張表現文字列 = "2013-02-08T09:30:26Z"
> library(parsedate)
> parse_iso_8601(拡張表現文字列)
[1] "2013-02-08 09:30:26 UTC"
> as.POSIXlt(parse_iso_8601(拡張表現文字列), tz = "Japan")
[1] "2013-02-08 18:30:26 JST"
````
Clangでコンパイル時に評価されるコード量を増やす

# TL;DR

`clang++` を使用して `constexpr` を多用するコードをコンパイルするときに、式評価回数の限界に引っかかった場合は、`clang++` オプションに`-fconstexpr-depth=-1 -fconstexpr-steps=-1` を追加すれば良い。それでもエラーが出る場合はClangにパッチを当てれば良い。

# 発端

C++17の `constexpr` を使用してニューラルネットワークの誤差逆伝播を行うプログラムを[作成した](https://github.com/ushitora-anqou/constexpr-nn)際に、`clang++` のデフォルトの設定ではコンパイル時に十分な回数 式評価が行われず、以下のようなエラーが出た。

- `constexpr evaluation exceeded maximum depth`
- `constexpr evaluation hit maximum step limit`
- `constexpr evaluation hit maximum call limit`

これらのような制限を取り除くための簡単な調査をした。

# 過程

まず[cpprefjpの `constexpr` の項](https://cpprefjp.github.io/lang/cpp11/constexpr.html)によると、コンパイル時の再帰回数は `-fconstexpr-depth=` オプションによって指定でき、デフォルト値は512回である。これを正の方向に増大させると、その最大値が `2147483647` であることが分かる。これは内部的にこの値が `unsigned int` で保持されていることによる。 [^unsigned_int]

[^unsigned_int]: `unsigned int` は厳密に言えば4 bytesとは限らないが、この上限をClang側がどう決めているのかを詳しく調べてはいない。以下同様。

また、コンパイル時に評価されるステップ数を `-fconstexpr-steps=` オプションで指定することができ、これの最大値も同様に `2147483647` である。

ところが、Clangのコマンドラインオプション解析においては、オプションの整数値は `(signed) int` として評価され、それが整数の型変換によって `unsigned int` に変換されている。そのため `-fconstexpr-depth=` と`-fconstexpr-steps=` に `-1` を指定すると `4294967295` を指定したことになる。デフォルトのClangではこれがおそらく最大値である。

# 問題

C++14以降の `constexpr` の制限緩和によって `for` や `if` をそのまま書くことができるようになった。そのため、コンパイル時の再帰回数については以上の解決方法でおそらく問題ない。

一方で最大ステップ数は比較的容易に上限に達しうる。また、コンパイル時の式評価のためにClang内部で用いられている `CallStackFrame` のインデックスもまた `unsigned int` で管理されているため、それ以上の関数呼び出しを一関数内で行うことはできない。[^more_call]

[^more_call]: この表現は適切でないかもしれない。ある関数を呼び出すごとに、呼び出し元の関数の `CallStackFrame` のインデックスに1足した値を、呼び出し先の `CallStackFrame` のインデックスとしている。

これらの問題を解決するにはClangのソースコードを改変する他にない。

# Clangにパッチを当てる

以上の問題を解決するために、2種類のコード改変を行う。

- ステップ数の管理をしている変数の型を `unsigned int` から `int` に変更し、これが負の場合は、処理のステップ数のカウントをやめる。これによって `-fconstexpr-steps=-1` と指定すれば、無制限にステップを重ねることができるようになる。
- `CallStackFrame` のインデックスの型を `unsigned int` から `size_t` に変更する。これによって扱うことができるインデックスの値を $2^{64} - 1$ まで増やすことができる。[^size_t]

[^size_t]: もちろん `size_t` が64 bitsの環境に限る。 `uint64_t` を使用するほうがより良いかもしれない。

これらの改変を施すパッチが[これ](https://github.com/ushitora-anqou/constexpr-nn/blob/master/clang.diff)である。使用するためには、Clangの[公式ドキュメント](http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary)を参考にしながら、途中で `svn patch clang.diff` を行えば良い。以下に典型的な手順を載せる。

```bash
cd where-you-want-llvm-to-live
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
svn patch where-you-cloned-constexpr-nn/clang.diff
cd ../..
mkdir build
cd build
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm
make -j6
```

## C++の規格

上のパッチに関して、C++の規格上どのような扱いになるのか、気になる向きもあるかもしれない。C++17の規格には[^cpp-draft] "Annex B" として "Implementation quantities" という章があり、そこにコンパイル時の再帰回数と評価されるべき式の数の最小値が記載されている。[^annexb]引用すると

> (2.38) Recursive constexpr function invocations [512].
> (2.39) Full-expressions evaluated within a core constant expression [1 048 576].

先述のパッチはこれらの制限を満たすため、規格上も問題ないと思われる。

[^cpp-draft]: 正確には、公式のC++規格とほぼ同じとされる、C++17が出る直前のドラフトによる。[ここ](https://timsong-cpp.github.io/cppwp/n4659/)などから参照できる。

[^annexb]: 正確には推奨される最小値。

# 終わりに

C++初心者なので、なにか間違い等あればコメント欄などでマサカリを投げて頂けると幸いです。血を流して喜びます。