OmniAICreator/Qiita-1.07M huggingface dataset:
sqliteのin memoryデータベースをテストに使うとrefreshApplication後におかしくなる

# はじめに

Laravelのテストでsqliteのメモリ内データベースを使うと、途中でテーブルが存在しないというエラーがでる問題をなんとかしようとして、[LumenでsqliteのURI Filenamesを使いたい](https://qiita.com/crhg/items/3151b3676a410a77aa39)では、PDOがそもそもURI filenamesをサポートしてないというオチで玉砕しましたが、やっぱりテストは速い方がいいのでもう少し頑張ってなんとかならないか調べて見ました。

# どうしてテーブルが存在しないエラーが出るのか

Laravelは基本的にはデータベースへの接続は使い回してくれるはずで、なぜ新しい接続が作られるのかをちゃんと調べて見ます。

すると、テスト中で`refreshApplication`を行った後にエラーが出る(=新しい接続がつくられる)ことがわかりました。

つまり以下のようなことが起きたと考えられます

* `refreshApplication`が実行されたので、サービスコンテナは空の状態から再出発
* 作成済みのデータベース接続を管理する`\Illuminate\Database\DatabaseManager`もシングルトンとしてサービスコンテナに登録されているが、これに伴って作り直し
* 既にあったsqliteへの接続は引き継がれていないので次に必要になったタイミングで新たに接続される

わかってみれば当たり前です。普通はDBへの新しい接続がつくられるだけでDBの中身はかわらないから問題がないですが、`:memory:`の時には空になってしまうからエラーになるわけです。

# 対策

いろいろな対処方法があるとは思いますが、ここでは一度作ったin memoryデータベースに接続しているPDOをなんとかして使い回せばいいだろうと考えて、SQLiteConnectorを改造するパターンで行きます。

`:shared-memory:`という特別な名前を用意して、これが指定されたときは最初に作ったPDOを保持して以後それを使い回すようにします。

作成した`\App\Database\SqliteConnector`です。

```php
<?php
namespace App\Database;


class SqliteConnector extends \Illuminate\Database\Connectors\SQLiteConnector
{
    protected static $shared_memory_connection = null;

    /**
     * Establish a database connection.
     *
     * databaseが:shared-memory:のときは作成したPDOを保存して以後はそれを返すようにする
     *
     * @param  array  $config
     * @return \PDO
     *
     * @throws \InvalidArgumentException
     */
    public function connect(array $config)
    {
        if ($config['database'] === ':shared-memory:') {
            if (self::$shared_memory_connection === null) {
                $options = $this->getOptions($config);
                self::$shared_memory_connection = $this->createConnection('sqlite::memory:', $config, $options);
            }

            return self::$shared_memory_connection;
        }

        return parent::connect($config);
    }
}

```

あとは`AppServiceProvider`の`register`メソッドで登録してやります。

```php
    public function register()
    {
        $this->app->bind('db.connector.sqlite', SqliteConnector::class);
    }
```

`.env.testing`で新たに使えるようになった`:shared-memory:`を指定します。

```
DB_CONNECTION=sqlite
DB_DATABASE=:shared-memory:
```

# おわりに

テストの実行時間はこんな感じです。Docker for macなのでファイルアクセスが遅いのですが、やはりメモリは速いです。

|使用したDB|実行時間|
|:----|----:|
|MySQL|74.1sec|
|SQLite(ファイル)|23.4sec|
|SQLite(メモリ)|7.3sec|

`refreshApplication`は影響が大きいので使うのはどうかというのはありますが、追加したモックをバッサリ戻すのに便利なんですよね。
JS初心者のメモ：Event Handling

# Eventとは
ブラウザがHTMLを読み込む際に作成されるのがDOMです。作成されたDOMは\<script>タグ内のJavascriptにより更新されます。その中でもっとも重要なのがEventです。Eventはマウスの動き、クリック、サーバからのレスポンスなど多種多様です。ブラウザ上の処理はSingle-threaded modelにしたがってる為EventはEvent Queueに溜まり順番に実行されていきます。Eventに対してEvent Handler（Javascript関数）を登録することができます。

## addEventListener関数
```javascript
document.body.addEventListener('click', function() {
    console.log('Clicked');
});
```

DOMの\<body>にクリックイベント時の処理を登録。<body>内をユーザがクリックした時にコンソールに'Clicked'がプリントされる。
カメラ RAW 画像処理についてのメモ

漢ならカメラ RAW 画像処理極めたいですね!

やりましょう!

http://www.odelama.com/photo/Developing-a-RAW-Photo-by-hand/
http://www.odelama.com/photo/Developing-a-RAW-Photo-by-hand/Developing-a-RAW-Photo-by-hand_Part-2/
http://graphics.stanford.edu/courses/cs178/

だいたいこれを見ればわかります.

一眼レフカメラなどで撮った RAW 画像(NEF, CR2 など)は, dcraw https://www.cybercom.net/~dcoffin/dcraw/ でだいたい 16bit TIFF とかに変換できます.

tinydngloader でも多少 RAW 画像を読み出すことができます.

NEF(Nikon RAW) からセンサー RAW 値を取り出す
https://qiita.com/syoyo/items/6344ebea59bd97657819

Canon RAW(CR2)を TinyDNGLoader で読む
https://qiita.com/syoyo/items/b6158f47acf1679b6509

HDR ビューアについてはこのコードも参考になります.

https://bitbucket.org/wkjarosz/hdrview


## モバイル環境での RAW 画像記録

Mark Levoy 氏(http://graphics.stanford.edu/~levoy/ Lytro の創立メンバーの一人でもあったはず)をはじめ, Stanford 大学でコンピュテーショナルカメラを研究してる研究者やエンジニアが Google にも在籍しているため, Android で Camera 周りの API はそこそこ充実しており, Camera2 API では RAW 記録をすることができるようになっています.

https://developer.android.com/reference/android/hardware/camera2/package-summary

iOS でも, iPhone6 以降くらいのデバイスから RAW(DNG) 記録ができるようになっています.

https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/capturing_still_and_live_photos/capturing_photos_in_raw_format
Laravelライブラリ探訪 - SQL実行ログを取るのに便利なライブラリ - Laravel SQL Logger

## Laravel開発でのSQLログを取る
LaravelでSQL実行ログを取るには、 \DB::listenのリスナーを自前で登録してログを取る等が可能であるが、容易にライブラリで実現出来る物があるので紹介
※ Laravel5.6、ライブラリのバージョンはv2.0.3で確認

[mnabialek/laravel-sql-logger](https://github.com/mnabialek/laravel-sql-logger)

## 導入方法
ReadMeの通り、ライブラリのインストールと設定ファイルの配置を行う

```shell
composer require mnabialek/laravel-sql-logger --dev
php artisan vendor:publish --provider="Mnabialek\LaravelSqlLogger\Providers\ServiceProvider"
```

.envに以下を追加し必要に応じて調整

```shell
SQL_LOGGER_DIRECTORY="logs/sql"
SQL_LOGGER_USE_SECONDS=false
SQL_LOGGER_CONSOLE_SUFFIX=
SQL_LOGGER_LOG_EXTENSION=".sql"
SQL_LOGGER_ALL_QUERIES_ENABLED=true
SQL_LOGGER_ALL_QUERIES_OVERRIDE=false
SQL_LOGGER_ALL_QUERIES_PATTERN="#.*#i"
SQL_LOGGER_ALL_QUERIES_FILE_NAME="[Y-m-d]-log"
SQL_LOGGER_SLOW_QUERIES_ENABLED=true
SQL_LOGGER_SLOW_QUERIES_MIN_EXEC_TIME=100
SQL_LOGGER_SLOW_QUERIES_PATTERN="#.*#i"
SQL_LOGGER_SLOW_QUERIES_FILE_NAME="[Y-m-d]-slow-log"
```

これで、デフォルトだとstorage/logs/sqlフォルダ以下に日別でSQL実行結果のログをプレースホルダの変数を適用済みで出力してくれる。
必要に応じてスロークエリも出力できるのでシステム開発を効率的に行うことが可能

### SQL実行ログの例
```
/* Origin (request): GET http://xxx.example.com/posts/1
   Query 2 - 2018-07-09 12:00:00 [0.45ms] */
select * from `posts` where `id` = 5 and `posts`.`deleted_at` is null limit 1;
```
共有ライブラリの依存関係のhello world

ある共有ライブラリに依存している共有ライブラリを生成したかったので，hello worldとしてまとめます．

hello2.cはhello1.cに依存しています．hello1.cは普通に共有ライブラリを作ればよいのですが，hello2.cの共有ライブラリは依存している共有ライブラリを宣言しなければなりません．-Lオプションは後にその共有ライブラリのディレクトリを指定します．例ではカレントディレクトリを指定しています．-Wlオプションはリンカへオプションを伝えてあげるもので，続くrapthで動的ライブラリのサーチパスを指定しています．-ltest1というオプションはlibtest1.soという共有ライブラリを指定したいので，libをlに変え，.so以下を消したものです．

```c:hello1.c
#include <stdio.h>
#include "hello.h"

void hello1(void)
{
  printf("Hello World!\n");
}
```

```c:hello2.c
#include "hello.h"

void hello2(void)
{
  hello1();
}  
```

```c:hello.h
void hello1(void);
void hello2(void);
```

```shell:shell
gcc -shared -fPIC -o libtest1.so hello1.c
gcc -shared -fPIC -o libtest2.so hello2.c -L . -Wl,-rpath,. -ltest1
```

Pythonから呼び出して確認します．

```python:test.py
import ctypes

libc2 = ctypes.cdll.LoadLibrary('./libtest2.so')
libc2.hello2()
```

以下のように出力されました．

```
Hello World!
```

参考

[ライブラリとは何なのか？ -Qiita](https://qiita.com/false-git@github/items/4b531467788b446a18d2)
[linux - linuxでの共有ライブラリのリンクについて - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/16944/linux%E3%81%A7%E3%81%AE%E5%85%B1%E6%9C%89%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
文字列の下何桁とか上何桁とかをマスクする


## 下4桁残してあとは`*`で埋める

```ruby
'0123456789'.gsub(/.(?=.{4})/, '*') # => "******6789"
```

`?=`は`positive lookahead`だから「先を見てくれ〜」なので、この`gsub`は「先を見てくれ〜、`.{4}`あったか？その手前の`.`を`*`に変えてちょ」である。

## 上4桁残してあとは`*`で埋める

```ruby
'0123456789'.gsub(/(?<=.{4})./, '*') # => "0123******"
```

`?<=`は`positive lookbehind`だから「手前を見てくれ〜」なので、この`gsub`は「手前を見てくれ〜、`.{4}`あったか？その先の`.`を`*`に変えてちょ」である。
[Visual Studio2017]OpenCV3.4.2の導入について

OpenCVの開発環境準備に躓いたので、忘れないようにと個人的なメモです。
誰かの役に立てば幸いです。
#環境
OS    : Windows10(64bit)
IDE   : Visual studio community 2017(v141)
OpenCV : 3.4.2
#とりあえず環境設定
方法としては他の方を参考させてもらいました。（参考文献欄に後述）←~~そちらのほうが断然わかりやすい~~
###1.OpenCVを入れる。
#####-1. opencvのインストーラーをダウンロード
   https://github.com/opencv/opencv/releases にて

https://github.com/opencv/opencv/releases/download/3.4.2/opencv-3.4.2-vc14_vc15.exe (opencv3.4.2)をダウンロードする。


#####-2. installする
ダウンロードしたもの(.exe)を実行すると以下のようなものが立ち上がる。
opencvのファイルを展開してくれるもの。
<img src="https://qiita-image-store.s3.amazonaws.com/0/235684/80489477-264a-bd8d-eeea-8bfdaf890c08.png" width=50%>

ので任意のところにopencvのフォルダを展開する。
今回はCドライブ直下に置くことにする。

###2.PATH(環境変数)を通す。
コントロールパネル>システムとセキュリティ>システム>システムの詳細設定>環境変数>PATH
に以下を追加する。
```
C:\opencv\build\x64\vc15\bin
```
###3.Visual Studioの設定
まずは適当に空のプロジェクト、コンソールアプリケーションを作成する。
プロジェクトのプロパティで以下を設定する
以下設定例(opencvフォルダはCドライブ直下にある。)

| パスの種類|設定に追加するパス|説明|
|:-----------------:|:---------------------------------------:|:--------------:|
|インクルードパス|C:\opencv\build\include|OpenCVのヘッダファイル(.h or .hpp)を検索する対象フォルダへのパス|
|ライブラリパス|C:\opencv\build\x64\vc15\lib|ソースコード中にリンク指定した静的ライブラリ(.lib)を探すためのパス|



最後に
opencv_world341.libも設定しておく。
<img src="https://qiita-image-store.s3.amazonaws.com/0/235684/22c89e48-ecbc-452f-190c-bab3f999fcd4.png" height=50% width=75%>
#サンプル

以下を動かして動けばおわり。
なお、自分の場合はエラーが出たので終われない模様。

```OpenCV_sample.cpp
#include <opencv2/opencv.hpp>
 
int main(void)
{
	cv::Mat	image;
	image = cv::imread("C:/opencv/sources/samples/data/lena.jpg");

	if (image.empty() == true) {
		return 0;
	}

	cv::imshow("画像", image);
	cv::waitKey();
 
	return 0;
}
```

#LINK2019やE1696などのエラーが出る。
設定がうまくいっていないとエラーが出る
ざっくりとそのエラーの説明。

| エラー名    |その内容|
|:-----------------:|:---------------------------------------:|
|LINK2019 |includeやlibraryなどリンカー設定がうまくいってない？|
| E1696   |ヘッダーファイルが開けない？ほぼ上と同じ|

#エラー改善
前述した設定について、$(IncludePath)などを消してしまうと、C++の標準ライブラリが読み込めなくなる？らしい
ので消してはいけない。
<img src="https://qiita-image-store.s3.amazonaws.com/0/235684/481043b1-e444-a4c9-c511-937135078437.png" height=50% width=75%>

opencv_world341.libについても同様に追記という形で設定することを間違えない。

#参考文献
[OpenCV 3.4.2をVisual Studio 2017から使用する時の手順]
https://qiita.com/h-adachi/items/aad3401b8900438b2acd
[Visual Studio Community 2017にOpenCV 3.4.1を入れた話]
https://qiita.com/mental_hell/items/4a19ae450f5909d099ed#_reference-9638d0835fc4b07897e5
pyCharmでproxyを利用する。

pyCharmを利用するにあたってproxy設定でつまづいたのでその解決方法を共有する。

IDE上でのプロキシ設定は公式記事参照
https://pleiades.io/help/pycharm/settings-http-proxy.html

IDEでプロキシ設定済みなのに参照モジュールインストール時にこんなエラーが出る場合
`
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 407 Proxy Authentication Required'))': /simple/django/
`

#Windowsのシステム環境設定にプロキシへのパスを設定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108367/4802e437-b407-96d1-cc01-fd2e974393bd.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108367/ecaaec4f-8da1-c320-fa6b-95e04546a8d7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108367/df1bd028-aa83-e3a4-2337-ba3021d0206b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/108367/bcafc723-e19e-8e5b-3a4d-3d65ba2c3130.png)


pyCharm上で実行できなかった場合にコマンドライン上でSETPATHを実行後にpip instrallを実行するとダウンロードがうまくいっているのは一時的に環境変数にパスを通しているためなので永続的に設定してやることでpyCharmがそれを参照してくれる。
Sharepointカスタムリスト参照列をPowerAppsで初期値固定させたい時のTips

#はじめに・・・？

**祝！Qiita初投稿！**
Qiitaはいつも見る側だったのですが
いよいよ投稿していかないといろいろダメな気がするので
今回から、業務中などでぶつかった壁とその改善策を備忘録的にまとめて
Qiita上で情報共有できればなと思っている次第です。

#今回の投稿背景
創業してそろそろ１年。
私共もようやくオフィスを構えることができたのです。
そんな中、社長から
「受付表を電子化したいなぁ」という鶴の一声があり
PowerAppsとMicrosoft Flow、データ管理にSharepointのカスタムリストという組み合わせで
作っておりました。
※弊社はOffice365のヘビーユーザーです

パイロット版は大変好評を博しまして、色々追加注文が出てきたのですが
その中で、「福岡本社をわざわざ選ばせたくないんだけど・・・」という言葉が・・・

一応パイロット版ながら、今後拠点拡大を視野に入れて、オフィスの定義を別カスタムリストに作っておいて
PowerAppsで使用しているメインのカスタムリストから参照して登録するという方式をとっていました。

普通の選択肢だけなら初期値を入力するのは特に問題なく入れられるのですが
※選択肢の文字列をそのまま入れておけばいいだけ
参照項目となると、選択肢のような指定ではうまく入らずまともに動いてくれませんでした。

#参照列の時はこうするといいお（＾ω＾）
参照列の初期値はどのように指定すればよいのか・・・
結論から言いますと
**「カスタムリストを更新する内容をそのまま入れたらいい」**

というわけで、対象のデータカードのDefault値に以下の関数を入れました。

```
//新規登録モードの場合
If(Form1.Mode = New, 
{
  '@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference", 
  Id: 1, //参照先リストのIDを入力
  Value: "福岡本社" //実際のデータ
}, 
ThisItem.Requirement)
```

こうすることで、初期値に参照列のデータを埋め込むことができ、わざわざ入力させなくてもよくなりました！
ヘッダーを固定した時のページ内リンクのズレを解消する方法

ヘッダーを固定する時
position:fixed;を使用して固定をすると思いますが、
ページ内リンクを行う時にヘッダー文の高さが被ってしまいます。

例えばheaderの高さがheight:100px;だったとすると100px分被ってしまします。

解消法としましてはpadding-topで高さ分ずらし、marjin-topでマイナス値で戻すとうまいこといきます。

```html
<header>ヘッダー</header>
	<main>
		<p>メインコンテンツ</p>
		<a href="#link01">リンク01</a>
		<p id="link01">リンク先</p>
	</main>
<footer>フッター</footer>
```

```css
header {
	position:fixed;
	width:100%;
	height:100px;
	top:0;
	left:0;
	z-index:100;
}
main{
	margin-top:100px;
}
#link01{
	padding-top:100px;
	margin-top:-100px;
}
```

※
ただデザインによってはpaddingやmarginでマイナス値をずらしたりすると同じようにならないので気をつけて設定した方が良い。
※
スマホなどでヘッダーの高さが変われば高さの値も変わるので細かく調整する必要がある。
なぜモナドが必要なのか？

[haskell - Why do we need monads? - Stack Overflow](https://stackoverflow.com/a/28139260)
の回答がわかりやすかったため翻訳させていただきました。

---

### STEP 1
 私たちは**関数のみを使って**プログラミングしたい。(つまるところ「関数型プログラミング(FP)」)

### STEP 2
その時、私たちは最初の大きな問題にぶつかる。

```
f(x) = 2 * x
g(x, y) = x / y
```

何が最初に実行されるべきだろうか？

どのように関数以外のものを使わずに、関数の羅列(プログラム)を作れるだろうか？

#### 解決法
関数の合成。もし`g`を最初にして、次を`f`にしたいなら、`f(g(x, y))`と書く。この方法では、「プログラム」は次のような関数だ: 

```
main = f(g(x, y))
```

良い感じだが…

### STEP 3
次の問題: いくつかの関数は失敗する可能性を持っている(例えば、`g(2, 0)`は0除算となる)。

関数型プログラミングでは「例外」を持ってはいない(例外は関数ではない)。これをどのように扱うか？

#### 解決法
**関数に二種類のものを返すことができるようにする**。

`g : Real,Real -> Real`(二つの実数から一つの実数への関数)の代わりに、`g : Real,Real -> Real | Nothing`(二つの実数から一つの実数またはNothingへの関数)とする。

良さそうだ、しかし…

### STEP 4
しかし、関数は**一つの値**のみ返すべきだ(シンプルにするため)。

#### 解決法
戻り値のための新しい型を作ろう。
新しい型は、実数かNothingを閉じ込む「**Box化型**」だ。
そのため、`g : Real,Real -> Maybe Real`となる。だがしかし…

### STEP 5
現状、`f(g(x, y))`はどうなってしまうか？
`f`は`Maybe Real`を引数として受け取る準備はできていない。
そして、`Maybe Real`を引数として受け取るために、`g`に接続(connect)する全ての関数を変更したくない。

#### 解決法
**関数を「connect」「compose」「link」するための、特別な関数**を作ろう。
この方法は、舞台裏で、ある関数の出力(戻り値)を次の関数に渡すために合わせることができる。

私たちの場合は、`g >>= f` (`g`を`f`へconnect/compose)となる。
私たちは`>>=`に`g`の出力を拾い上げさせ、調査させ、`Nothing`の場合は`f`を呼び出すことなく`Nothing`を返し、それ以外の場合はBox化された実数を取り出し`f`に与える。
(このアルゴリズムは`Maybe`型のための`>>=`の実装にすぎない)。

`>>=`は「Box化型」ごとに**一度だけ**書かれなければならないことに注意してほしい(Boxが異なれば、適用アルゴリズムは異なる)。

### STEP 6
同じパターンを使って解決できるたくさんの問題がある。

1. 「Box」を異なる意味/値を体系化/保存するために使う。そして、`g`のような「Box化された値」を返す関数を作る。
2. composer/linkerである`g >>= f`を、`g`の出力を`f`の入力に接続するために作る。このため、`f`を変える必要は全くない。

### STEP 7
このテクニックで解決できる目立つ例として:

#### 例1
関数の羅列(プログラム)内の全ての関数が共有することができる、グローバルな状態を持つ

##### 解決法
`StateMonad`

#### 例2
`純粋でない関数`が嫌いだ: 同じ入力に対して異なる出力を生成する関数。

##### 解決法
これらの関数にマークをつけておいて、これらの関数にタグ付け/Box化された値を返させる。

`IO` Monad

幸せ！


---

# ライセンス

StackOverflowのコンテンツは[cc-by-sa](http://creativecommons.org/licenses/by-sa/3.0/)のライセンスの下でシェアすることができます。

以下に、翻訳元の情報を記します。

翻訳元のURL: <https://stackoverflow.com/questions/28139259/why-do-we-need-monads>

- 質問をした方のプロフィール [cibercitizen1](https://stackoverflow.com/users/286335/cibercitizen1)
- 翻訳させていただいた回答をした方のプロフィール
    - [cibercitizen1](https://stackoverflow.com/users/286335/cibercitizen1)
    - [jubobs](https://stackoverflow.com/users/2541573/jubobs)
    - [Vitalii Fedorenko](https://stackoverflow.com/users/288671/vitalii-fedorenko)
- その他の回答をした方のプロフィール
    - [Carl](https://stackoverflow.com/users/383200/carl)
    - [user3237465](https://stackoverflow.com/users/3237465/user3237465)
    - [leftaroundabout](https://stackoverflow.com/users/745903/leftaroundabout)
    - [heisenbug](https://stackoverflow.com/users/1465449/heisenbug)
    - [jdinunzio](https://stackoverflow.com/users/60823/jdinunzio)
    - [mljrg](https://stackoverflow.com/users/1483503/mljrg)
[js]PHPで言うところのempty関数を実装してみた

# はじめに
PHPの `empty` 関数、便利じゃないですか？私はよく使ってます。
jsでも同じような関数があればいいのですが、[**連想配列の空判定が色々と面倒**](https://www.deep-rain.com/programming/javascript/910)みたいで、配列・連想配列・文字列・数値なんかを考慮せずに空かどうか判定したかったので自作してみました。

# ちなみに
PHPの `empty` 関数は次のような挙動です。
`"0"` の扱いとは。

```php:php_empty
 ''     => true
 ""     => true
 0      => true
"0"     => true  // 注意
 0.0    => true
"0.0"   => false
 null   => true
"null"  => false
 true   => false
"true"  => false
 false  => true
"false" => false
[]      => true
[[]]    => false
```

# コード&動作確認
## 概要
以下からどうぞ。
なお、PHPでは `"0"` が `empty` 扱いとなりますが、本コードでは `not empty` とするようにしています。
判定甘くしてあげればPHPと同じ挙動になるかと。その是非は別にして。

```js:js_empty
''          => true
""          => true
 0          => true
"0"         => false  // 注意：PHPと挙動を変えている
 0.0        => true
"0.0"       => false
 null       => true
"null"      => false
 true       => false
"true"      => false
 false      => true
"false"     => false
 undefined  => true
"undefined" => false
[]          => true
[[]]        => false
{}          => true
[{}]        => false
```

## 使い方
`test` 関数内の配列に左から `[テストしたい値, 画面に表示される文字, 期待値]` で入れてあげればOKです。
挙動チェックついでにアサーションしてくれるすごいやつだ！

## コード
<p data-height="600" data-theme-id="0" data-slug-hash="Zjzzve" data-default-tab="js,result" data-user="tosite" data-embed-version="2" data-pen-title="js-isEmpty" class="codepen">See the Pen <a href="https://codepen.io/tosite/pen/Zjzzve/">js-isEmpty</a> by tosite (<a href="https://codepen.io/tosite">@tosite</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 終わりに
もしもっといいやり方あったら教えてください。
ESLint v5.1.0

前 [v5.0.0] | 次 [v5.2.0]

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v5.1.0 has been released: <a href="https://t.co/JlcbOA9ju8">https://t.co/JlcbOA9ju8</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1016073893864329216?ref_src=twsrc%5Etfw">July 8, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 5.1.0 がリリースされました。

[no-catch-shadow] ルールが非推奨になりました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

特になし。

# 💡 新しいルール

特になし。

# 🔧 オプションが追加されたルール

特になし。

# ✒️ `eslint --fix` をサポートしたルール

特になし。

# ⚠️ 非推奨になったルール

## [#10526]: [no-catch-shadow]

[no-catch-shadow] ルールは非推奨になりました。将来のメジャーアップデートにて削除されます。

このルールは「文法的には問題ないが Internet Explorer 8 のバグのために利用できないコード」を検出するために存在していました。しかし、IE8 は EOL になってから 2 年以上経過しているため、このルールは既に役割を終えていると考えられ、非推奨になりました。

シャドーイング全般を禁止するには、[no-shadow] ルールを利用して下さい。

[v5.0.0]: http://qiita.com/mysticatea/items/f34097961bf2827b675d
[v5.2.0]: http://qiita.com/mysticatea/items/0ed7fbb74dc31a65cdc2
[#9999]: https://github.com/eslint/eslint/issues/9999
[#10526]: https://github.com/eslint/eslint/issues/10526
[no-catch-shadow]: http://eslint.org/docs/rules/no-catch-shadow
[no-shadow]: http://eslint.org/docs/rules/no-shadow
[xxxx]: http://eslint.org/docs/rules/xxxx

<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
bind9 系の dynamic dns 設定時における、ジャーナルファイルの書き戻し及手順

bind9 系でダイナミック DNS を設定している場合、動的リソースレコードが書き換わるたびに専用のジャーナルファイルが生成され、そのファイル内に起動時に読み込まれる静的ゾーンファイルからの差分情報を記述していくのだが、更新分を静的ゾーンファイルに書き戻ししたい場合や、nsupdate(8) コマンドを使わずに静的ゾーンファイルを直接編集したい場合には、一旦ダイナミック DNS の外部からリソースレコードの書き換え（更新）禁止にする必要がある。

以下のコマンドで対処すべし。

```txt:
dynamic update 禁止(書き戻し)
# rndc freeze example.jp
```

```txt:
dynamic update 許可(書き換え再開)
# rndc thaw example.jp
```
WSHからtsdiscon.exeを実行しようとして実行できなかったので呼び出し元アプリがx86かx64か判別してSysnativeとSystem32を使い分ける

# 背景

(背景追記)
勤務先の「働き方改革(笑)」でリモートセッションの接続時間を管理されるようになったから，うっかりログインしっぱなしになってると人事から警告がくるようになったので，自動切断したいよ！
で，タイマーでリモートセッションを切断しようとして，タスクスケジューラから `cmd /C tsdiscon` を素直に呼べばいいものを，他の方法も勉強しようとvbaから呼び出そうとしてハマったのが発端．

# 問題

`C:\Windows\System32\tsdiscon.exe`を呼んでるのに，そんなもんないって言われるよ！

# 結論

(修正)
呼び出し元アプリがx86アプリかx64アプリによって，呼び分けが必要だった．(64bit windowsの場合)

x86アプリから呼ぶ場合は，`C:\Windows\Sysnative\tsdiscon.exe`を呼ぶのじゃ
x64アプリから呼ぶ場合は，`C:\Windows\System32\tsdiscon.exe`を呼ぶのじゃ
アーキテクチャは環境変数から取ってくるのじゃ

タスクマネージャやエクスプローラから呼ぶ場合は，64bit windowsの場合はx64アプリのようだ．
vbaの実行エンジンがx86だとかx64で固定されているわけではなさそう．
共通の呼び方，用意しておいてくれんかな…

# 再現方法

1. パスを書き分けた2種類のvbsを用意する
2. エクスプローラ(x64アプリ)から呼び出すとSysnativeのパスを書いた方はエラーを吐く．
3. 例えばあふｗ(x86版とx64版がある)などx86アプリから呼び出すと，System32のパスを書いた方はエラーを吐く

# 参考URL

[徒然なるままに　x64版Windowsで32ビットアプリケーションから64ビットアプリケーションを呼び出すには%Systmroot%\\Sysnativeを指定する](http://norimaki2000.blog48.fc2.com/blog-entry-1302.html)

# ソース

- 「いいえ」を押さなければ切断される
- x86かx64か判別できないと実行されない


```vb:discon.vba
Set objShell = WScript.CreateObject("Wscript.Shell")
arch = objShell.Environment("Process").Item("PROCESSOR_ARCHITECTURE")

Select Case arch
    Case "x86", "32bit"
        cExec = "C:\Windows\Sysnative\tsdiscon.exe"
    Case "IA64", "AMD64"
        cExec = "C:\Windows\System32\tsdiscon.exe"
    Case Else
        MsgBox "32bitか64bitか分からないよ！"
        cExec = ""
End Select

If Len(cExec) > 0 Then
    iBtn = objShell.Popup( _
        "セッションを切断したくない場合には「いいえ」を押してください．",_
        10, "セッションを切断しますか？", vbYesNo + vbQuestion)

    Select Case iBtn
        Case vbYes, -1
            objShell.Exec(cExec)
    End Select
End If
```
pyenv-virtualenv環境構築法（メモ）

pyenv, virtualenv, pyenv-virtualenvがインストール、セットアップ（.zshrc修正）が済んだ状態で

# working環境を作る
```
pyenv virtualenv 2.7.10 working
```
これでpython2.7.10が使われるworkingという名の環境が出来上がり

# working環境を起動

```
pyenv local working
```
local環境をworking環境にする

```
pyenv virtualenv-init
```
が必要な場合もあります
私の開発環境

# 開発環境について
普段私はWindowsでWSLのコンソールを利用して開発を行っています.

![vscode.png](https://qiita-image-store.s3.amazonaws.com/0/269455/3db28a18-979d-7c0b-b007-3f3afa161c9f.png)


## VSCode
Microsoftが開発しているソースコードエディタです.
以前はメインの開発環境がLinuxでして, エディタはVimを用いていたのですが, WSLの誕生によってWindowsでどこまで程度の良い環境構築ができるかにチャレンジしている最中です. そのなかで選んだエディタがコレでした(もちろんキーバインドはVimと同様にしています).

ダウンロードリンク([https://code.visualstudio.com/download](https://code.visualstudio.com/download))

## Python
私の使用している主な言語はPythonです.
数値計算を主としているためNumpy, Scipyなどを多用しています.
ダウンロードはAnacondaを利用して行っています.

Anacondaリンク([https://www.anaconda.com/download/](https://www.anaconda.com/download/))

## WSL
WSLとは Windows Subsystem for Linux を略したもので, Windows10以降のバージョンで用いることができます.
これはWindowsであるにもかかわらず, Ubuntuのコンソールを利用できるようにしたとても画期的な機能です.
もちろんパッケージ管理システムのaptも使えますし, Windows上のファイルもカンタンに扱えます.
このサービスが開始されなければ, 私はずっとLinux上で開発していたと思います.
Microsoft Storeで購入可能です(無料).

ダウンロードリンク([https://www.microsoft.com/ja-jp/p/ubuntu-1804/9n9tngvndl3q?activetab=pivot%3aoverviewtab](https://www.microsoft.com/ja-jp/p/ubuntu-1804/9n9tngvndl3q?activetab=pivot%3aoverviewtab))

## ArchLinux
計算を回すためのPCにはArchLinuxを入れています.
Sambaを入れてWindowsからネットワークドライブとしてデータを編集できるようにしてあります.
(本当はGentooに挑戦したいという願望がありますが...)

## 最後に
各々の設定方法などは, また詳しく記事を載せていけたらと思います.
[初学者]subメソッドとgsubメソッドで文字を置換する

# 目的 
- 人のコードを読んでいるときに「gsub」が分からなかったので調べた内容メモ

# 条件
- ruby 2.4.1

# 目次

- subメソッドとは
- gsubメソッドとは
- gsubメソッドのスニペット

## subメソッドとは

subメソッドは指定したパターンにマッチした<font color="Red">最初の部分</font>を特定の文字列に置換します。パターンには文字列や正規表現が使えます。

```bash:irbでやってみた
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.sub(/shi/, 'ya')
# 第1引数に最初にマッチした置換されるパターン文字(正規表現)を指定
# 第2引数に置換したい新しい文字列を指定


結果
=> "yamada-shimada"
# 最初にマッチした'shi'が'ya'に置換される
```

```bash:ブロックをとる場合
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.sub(/shi/) {|str| 'ya'}

結果
=> "yamada-shimada"
# 最初にマッチした'shi'が'ya'に置換される

---
a.sub(/\w+/) {|str| str.upcase}

結果
=> "SHIMADA-shimada"
# 最初にマッチした'shi'のブロックを大文字にする
```

## gsubメソッドとは

gsubメソッドはマッチした<font color="Red">すべての部分</font>を特定の文字列に置換します。パターンには文字列や正規表現が使えます。

```bash:irbでやってみた
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.gsub(/shi/, 'ya')
# 第1引数にマッチした置換されるパターン文字(正規表現)を指定
# 第2引数に置換したい新しい文字列を指定


結果
=> "yamada-yamada"
# 全てマッチした'shi'が'ya'に置換される
```

```bash:ブロックをとる場合
# 変数aに'shimada-shimada'を代入
a = 'shimada-shimada'

# 'shimada-shimada'の最初の'shi'を'ya'に置換する
a.gsub(/shi/) {|str| 'ya'}

結果
=> "yamada-yamada"
# マッチした'shi'が'ya'に置換される

---
a.gsub(/\w+/) {|str| str.upcase}

結果
=> "SHIMADA-SHIMADA"
# マッチした'shi'のブロックを大文字にする
```

## gsubメソッドのスニペット

```ruby
  def normalize(str)
    str.strip                                    # 前後の空白除去
       .tr("０-９ａ-ｚＡ-Ｚ 　（）－−", "0-9a-zA-Z  ()-")  # 全角英数字を半角に
       .gsub("\t", ' ').gsub(/ +/, " ")          # 空白を単一半角スペースに統一
       .gsub("\r\n", "\n").gsub("\r", "\n")      # 改行を\nに統一
  end
```

## まとめ
いろいろ調べてみると「gsubメソッド」は結構使いそう。あと「正規表現」

## 参考
[第6回 正規表現と文字列の置換](http://www.geocities.jp/m_hiroi/light/abcruby06.html)
[subやgsubで括弧とマッチした部分の再利用、および式展開の方法](http://akisute3.hatenablog.com/entry/20111126/1322314400)
Docker でお試し Spark クラスタを構築する

ちょっと Spark クラスタを試すためにわざわざ Amazon EMR を起動させたりするのも面倒なので、Docker で出来るようにした。

## Dockerfile を用意する
``` Dockerfile
FROM openjdk:8

ARG SPARK_VERSION=2.4.5
ARG HADOOP_VERSION=2.7

RUN wget -q http://apache.mirror.iphh.net/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
    && tar xzf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \
    && mv spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} /spark \
    && rm spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz

EXPOSE 8080
```

やっていることは

- OpenJDK 8 イメージをベースにする
- Spark バイナリをダウンロードして `/spark` に配置する

だけ。

## docker-compose.yml を用意する
クラスタを同時に起動するために Docker Compose を利用する。

``` yml:docker-compose.yml
version: '3'

services:

  master:
    build: .
    ports:
      - 4040:4040
      - 8080:8080
    command: /spark/bin/spark-class org.apache.spark.deploy.master.Master --host 0.0.0.0

  worker:
    build: .
    depends_on:
      - master
    ports:
      - 8081-8089:8081
    command: /spark/bin/spark-class org.apache.spark.deploy.worker.Worker spark://master:7077 --host 0.0.0.0
```

Docker Compose で起動する場合はデフォルトではすべてのコンテナが同じ仮想ネットワーク内で起動するため、Worker ノードから `spark://master:7077` で Master ノードに接続することが出来る。

## クラスタを起動する
``` console
$ docker-compose up -d
```

Master ノードと Worker ノードが一台ずつ起動する。

ブラウザから Spark の Web UI (http://localhost:8080/) にアクセスすると、いまクラスタがどういう状態になっているのかを確認することが出来る。

## Worker ノードの数を変更する
``` console
$ docker-compose up -d --scale worker=2
```

これで Worker ノードが2台に増える。

## spark-shell を起動してみる
``` console
$ docker-compose exec master /spark/bin/spark-shell --master spark://localhost:7077
Spark context Web UI available at http://b5d1fcbe1a7b:4040
Spark context available as 'sc' (master = spark://localhost:7077, app id = app-20180709092212-0003).
Spark session available as 'spark'.Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.3.1
      /_/
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_171)Type in expressions to have them evaluated.
Type :help for more information.

scala>
```

spark-shell が起動したので、ここから色々と試すことが出来る。

``` console
scala> sc
res0: org.apache.spark.SparkContext = org.apache.spark.SparkContext@4fa91d5b

scala> val ds = Seq(1, 2, 3).toDS()
ds: org.apache.spark.sql.Dataset[Int] = [value: int]

scala> ds.show()
+-----+
|value|
+-----+
|    1|
|    2|
|    3|
+-----+

scala> ds.map(_ * 2).show()
+-----+
|value|
+-----+
|    2|
|    4|
|    6|
+-----+
```

ブラウザから Spark Context Web UI (http://localhost:4040/) にアクセスすると、ジョブの実行状況などを詳しく見ることが出来る。
基礎知識のメモ

WebSocketと、socketはまったく別のものだ。


http アプリケーション層

tcp socket　セッション層


socket是一个抽象层
可以和TCP链接也可以和udp链接

=======================================================
以下の用語を理解するのは必要である。
长连接
短链接
pcntl
posix
异步处理
virtual boxで開発環境作成メモ

virtual boxでlinux(64bit)を選択できない場合
以下のサイトを参照する
http://www.sebegginer.com/article/449599527.html


mysqlインストール際に出たエラーの改善策

① リポジトリの修正
ll /etc/yum.d/*
　修正するリポジトリファイルを確認
viで修正

今回はmysql-commuityのリポジトリ
mysql5.7の
enableを1に修正する
他には
enableを0に修正する。

enabled=0 →無効
enabled=1 →有効

②リポジトリの指定

yum -y install --disablerepo=base,ius →（今回はbase,ius)
mysql mysql-server


ポートについて

同じipでも　違うポートを設定すれば、違うサイトにアクセスことができる。

firewallでポートの設定が必要である。

コマンド
firewall-cmd --add-port=[ポート番号]/[プロトコル] --zone=public --permanent(※恒久的な設定)

例:
firewall-cmd -add-port=9000/tcp --zone=public --permanent

yum list installed | grep
星座を取得

PHPにて星座を取得する。

・まずは星座の番号を取得
・その後星座の番号を星座名に変換

という2ステップで行う。
( DBに星座を数値で保存しておきたいので )

・メイン

```

$datetime = new \DateTime("2018-03-07");
$zodiac_id = getZodiacId($datetime);
$res = getZodiacName($zodiac_id);
print_r($res);//魚座

```

・関数

```

//星座をIDとして取得
function getZodiacId($datetime){

    $m = (int)$datetime->format("n");
    $d = (int)$datetime->format("j");

    $zodiacs = [
        [3, 21,  4, 19],//0
        [4, 20,  5, 20],//1
        [5, 21,  6, 21],//2
        [6, 22,  7, 22],//3
        [7, 23,  8, 22],//4
        [8, 23,  9, 22],//5
        [9, 23, 10, 23],//6
        [10, 24, 11, 22],//7
        [11, 23, 12, 21],//8
        [12, 22,  1, 19],//9
        [1, 20,  2, 18],//10
        [2, 19,  3, 20]//11
    ];

    foreach($zodiacs as $key => $zodiac){
        list($start_m, $start_d, $end_m, $end_d) = $zodiac;
        if(
            ($m === $start_m && $d >= $start_d) ||
            ($m === $end_m && $d <= $end_d)
        ){
            return $key;
        }
    }
    
    return false;
}

//星座のIDを星座名に変換
function getZodiacName($key){

    $zodiacs = [
        '牡羊座',//0
        '牡牛座',//1
        '双子座',//2
        'かに座',//3
        '獅子座',//4
        '乙女座',//5
        '天秤座',//6
        '蠍座',//7
        '射手座',//8
        '山羊座',//9
        '水瓶座',//10
        '魚座',//11
    ];

    return $zodiacs[$key];

}


```

以上
Oracle ORA-29861 ドメイン索引にはLOADING/ FAILED/ UNUSABLE のマークが設定されています。 対処方法

ORA-29861 対処　解決方法
ドメイン索引にはLOADING/ FAILED/ UNUSABLE のマークが設定されています。
# ドメイン索引の確認
`SELECT * FROM user_indexes WHERE INDEX_TYPE = 'DOMAIN' AND DOMIDX_OPSTATUS <> 'VALID';`
これで
DOMIDX_OPSTATUSがFalseになってるやつを探す
STATUSがVALIDになっていてもだまされないのが大事

# インデックスの作成に失敗してるので作り直す
`DROP INDEX {hoge}`
`CREATE INDEX {hoge}`

# 原因とか
要するにインデックスの作成に失敗してるというエラー
たちの悪いことにCREATEコマンドで作成時にエラーを吐いても使い物にならないインデックスだけが作成されている模様。
エラーならそもそも作られないでほしい・・・:cold_sweat:
私の場合インデックスの名前が長すぎるっていうエラーを吐いていた:head_bandage:
バッチで一斉作成するので気が付かなかった

CREATEのときにエラーがでるくせにインデックス自体は存在できてそれを参照しようとするからエラーになる
機械学習論文読みメモ_133

[AI Safety Gridworlds](https://arxiv.org/abs/1711.09883)
本論では、新たな強化学習の実験環境としてAI Safety Gridworldsを公開する。
この環境は、いくつかの重要な、強化学習エージェントが持つべき特性の評価に役立つ。
余分な交絡因子などの影響を避けるため、環境はシンプルなグリッドで成り立ち、
エージェントは各マス上で行動を起こすかとなりあるマスへ移動する事が可能である。
この環境では、エージェントは設定されたreward functionに基づくrewardを得る事が出来る。
このrewardもエージェントが観測するものと、エージェントが観測できないものに分ける事も
可能で、この両者が一致しない場合、それはagentが理想的なrewardを得られないような
specification環境と呼ぶ。
以上の環境で、主に以下のような行動特性評価を行う事が出来る。
safe interruptibility、いつでもエージェントに介入が可能かどうか。
avoid side-effects、主な目標と関係のない事柄による影響を最小化できるか。
absent supervisor、教師ありとなしの場合に行動が変わらないか
reward gaming、利得最大化のためにわざとミスを犯す事はないか
self-modification、自己変革が許される場合に、正しく行動可能か。
distributional shift、学習とテスト環境の変化に対してロバストか。
robustness to adversaries、エージェントは友好的あるいは敵対的な環境信号を見分け、適応可能か。
safe exploration、初めての環境で、安全な探索が出来るか。

[AdaBatch: Adaptive Batch Sizes for Training Deep Neural Networks](https://arxiv.org/abs/1712.02029)
deepnetモデルの学習をstochastic gradient descentにより行う際、慎重なlearning rateとbatch sizeの決定が重要である。
小さいバッチサイズでは、より少ないエポック数で収束するが、大きいバッチサイズを用いる事で並列処理を活かした、
高速化が可能である。
本論では、すべてのエポックに対して一定のバッチサイズを利用するのではなく、学習中に適応的に変化させる手法を
提案する。
この手法は小さなバッチサイズを利用した場合と同等の収束速度を持ちつつ、大きいバッチサイズを利用した場合と同等な
計算効率を実現する。

[What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision?](https://arxiv.org/abs/1703.04977)
私たちには大きく分けて2通りのuncertaintyをモデル化する事が出来る。
一つはAleatoric uncertaintyで、これは観測に内在するノイズをとらえる。
もう一つはepistemic uncertaintyで、これはモデルの持つ曖昧性をとらえる。
後者は十分なデータを与える事で消し去る事が出来る。
従来epistemic uncertaintyは画像認識の分野においてモデル化する事が難しかったが、
bayesian deep learningを用いる事で可能になった。
本論では画像認識系のタスクにおいて、この二種類のuncertaintyをbayesian deep learningの
文脈でモデル化する事の利点について述べる。
特に、損失関数に関して、それら各観測毎のaleatoric uncertaintyを別々考慮した新たな損失関数に変更する事で
ＳＯＴＡの性能を発揮可能である。
FacebookでシェアするOGP画像を動的に書き換える

#Facebookでもシェアするぞ

[以前書いたTwitterのogpに関わる話](https://qiita.com/SHIN_DEVELOP/items/2d2861528919e6336af6)に続けて書こうと思ってた話を。
最近の若い子はFacebook使ってないらしいですが…シェアするっていうとtw,fb,insta,line辺りが主流かと認識してますがどうなんでしょうね。

#おさらい
Twitterではパラメータをぶら下げて.htaccessでクローラ判定して〜って流れでした。
同様にFacebookもそれで行けるやろって思って組み込もうとした矢先、コードが以下のようになってたわけです。

```html
<a href="https://www.facebook.com/sharer/sharer.php?u=https://tebasaki.mushamusha.jp?chicken=broiler" target="_blank">
```

あれれ〜おかしいぞ〜？なんですよね。
クエリにクエリが付いたURLを設定しちゃってるのでイミフな状況が生まれてるんです。
これではうまく動かないのでどうしたものやらと小一時間悩みました。

#で考えたのが以下

```html
<a href="https://www.facebook.com/sharer/sharer.php?u=https://tebasaki.mushamusha.jp/broiler/" target="_blank">
```

パラメータを一つの階層にしてしまえ！
で、最後の文字列を.htaccess側でパラメータにしてリダイレクトしてしまいしょう。

```apache

<IfModule mod_rewrite.c>
	RewriteEngine on
	RewriteCond %{HTTP_USER_AGENT} (facebookexternalhit/[0-9]|Twitterbot)
	RewriteCond %{REQUEST_URI} !(^/ogp.php)
	RewriteRule ^(.*)/$ ogp.php?chicken=$1 [L]
</IfModule>
```

##受け側の動き
ogp.phpはもはや説明要らんと思いますがこんな感じです。

```ogp.php
<?php
	$chicken = htmlspecialchars($_GET["chicken"],ENT_QUOTES);
	$ogpUrl = "https://tebasaki.mushamusha.jp/".$chicken."/ogp.png";
```

おわり。
diff -r --side-by-side --suppress-common-lines ファイル名1 ファイル名2

diff コマンドのお気に入りのメモ。

差分のところだけ、左右に分けて表示される。
あっちのファイルにあって、こっちのファイルにない、
みたいな 2 ファイルの違いを可視化するのに便利。

```
$ diff -r --side-by-side --suppress-common-lines ファイル名1 ファイル名2
```
サブモニターでoFの画面が更新されない問題

# はじめに
今回の話題はopenFrameworksです。

先日、マルチウィンドウでgui画面と描画画面を作成し、描画画面をサブモニターに映そうとしたところ、ウィンドウをサブモニターに移動した瞬間なぜか動かなくなるという事態が起きました。
おかしいと思い、試しに適当な1画面のサンプルを起動しサブモニターに移すと、これも動かない。
タイトルにfpsを表示するようにしたところ、そこは更新されるが画面だけ全く更新されない。

結構詰まったので備忘録。
ちなみにそういう問題じゃなくてただ2画面でマルチウィンドウしたいと言う人はこの辺とかどうでしょう↓
https://qiita.com/aframeworks-blog/items/2244b11afbfa1a4218ed

# 結論
PC内部、環境の問題でした。

自分の環境は以下のような感じです。

|||
|---|---|
|OS|Windows10 Home|
|openFrameworks|v0.10.0|
|開発環境|Visual Studio Community 2017|

まぁ正直この辺はたぶんそんなに関係ないです。
問題はグラフィック周り。

自分のグラフィック周りでは、以下のような設定になっていました。

![設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/153451/e5deb4d7-aa22-baee-9691-3f5973c8eae3.png)

この画面は、
　スタートメニュー→設定→システム→ディスプレイ→ディスプレイの詳細設定
から行けます。

見ての通り、オンボードとグラフィックカードが各ウィンドウで別々に制御してるっぽかったので、そこら辺で何かあるんじゃないかと踏んでいろいろしました。

## 1. ドライバーの更新

注：先に書いておくとここは「ちょっと効果があった」くらいです。
やり方はどこからでもいいですが、せっかく上の画面まで来た人は、そのまま
　ディスプレイ〇のアダプターのプロパティを表示します
　→プロパティ
　→ドライバー
　→ドライバーの更新
って流れで更新できます。

NVIDIAから更新してみましたが変化0だったので、Intelの方も更新したところ、一応動くようにはなりました。
ただ爆遅。メインモニターでは60fps出てたものが、サブに移した瞬間20~30ほどまで落ちました。
これじゃ使い物にならん。

## 2. NVIDIAコントロールパネルの設定

最終的にここまでやって直りました。

NVIDIA製のグラフィックカードが入っている人は、NVIDIAコントロールパネルというものがあるのではないでしょうか。
自分の場合、デスクトップの何もないところで右クリックしたら出てきました。
多分他にもやり方はあると思います。

何はともあれ起動したら、画面左のツリービュー的なやつから
　3D設定→3D設定の管理
と進みます。

そこの「優先するグラフィックスプロセッサ」を「高パフォーマンスNVIDIAプロセッサ」に変えてください。

![nvidiaコントロールパネル.PNG](https://qiita-image-store.s3.amazonaws.com/0/153451/5f649178-023a-6e01-e8ae-d10957ffdab8.png)

そして右下の適用をクリック。
するとあら不思議、2画面で60fpsで動きました。

# おわりに
適当ですが終わります。
備忘録で結構適当なので何かしらあったらコメントください。
ハードウェア周りは苦手です...

以下1個ですが参考↓
[グラフィックカードの有効化(オンボードからの切り替え)](https://support.graphisoft.co.jp/hc/ja/articles/360000418373-%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96-%E3%82%AA%E3%83%B3%E3%83%9C%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88-)
Ethereum の各種テストネット比較

# まえがき
Ethereum のテストネットは現在 Ropsten, Kovan, Rinkeby の3種類が用意されていますが
それぞれの比較を行います

## Ropsten
長所：
PoW（Proof of Work）を使用しているため本番環境に近い
geth と parity の両方が使用可能
ETHの採掘が可能。または Faucet により送付も可能
短所：
攻撃を受けており、安定性が低め

## Kovan
長所：
PoA（Proof of Authority）を採用しているため比較的安定
ブロック生成時間が4秒と短め
短所：
parity のみのサポートとなっている
PoA を使用しているため、本番環境を完全には再現していない
ETH の採掘は不可（Faucet より送付してもらう必要がある）

## Rinkeby
長所：
PoA（Proof of Authority）を採用しているため比較的安定
短所：
geth のみのサポートとなっている
PoA を使用しているため、本番環境を完全には再現していない
ETH の採掘は不可（Faucet より送付してもらう必要がある）

## まとめ
軽量なテスト環境が必要で parity を使用している場合は Kovan、geth を使用している場合は Rinkeby
PoW や採掘可能な環境が必要な場合は Ropsten を使うのがよさそう？
Install Pytorch for windows

#1.Pytorchのサイトを参照
https://pytorch.org/

#2. Get Started で、自分の環境を選択
PowerShellを開き、cmdでコマンドプロンプトにしてから、表示されたコマンドを実行

※以下は、windows & pip $ python 3.5 & CUDA 9.0 を選択した場合

```
pip3 install http://download.pytorch.org/whl/cu90/torch-0.4.0-cp35-cp35m-win_amd64.whl
pip3 install torchvision
```

#3.以下のエラーが表示された場合
`Could not install packages due to an EnvironmentError: raw write() returned invalid length 2 (should have been between 0 and 1)
`

win_unicode_consoleを先にインストールしてから、再度whlのインストールを実行

```
conda install -c anaconda win_unicode_console
```

参考：[バグ回避策有り：Fall Creator Update (Win10) でpython が 「OSError: raw write() returned invalid length・」](https://qiita.com/non0/items/4014b81f5a2d232ae22f)

#4.Pytorchの動作確認
```
import torch
torch.__version__
```

#5.以下のエラーがでる場合
`>>> import torch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Anaconda3\lib\site-packages\torch\__init__.py", line 78, in <module>
    from torch._C import *
ImportError: DLL load failed: このオペレーティング システムでは %1 は実行されません。`

intel-openmpをインストール

```
conda install intel-openmp
```

参考:[Pytorch on Windows gives ImportError](https://stackoverflow.com/questions/50264129/pytorch-on-windows-gives-importerror)
Apigee のAPI を監視してみるの巻

#目的
API が正常であることを確認する

#目標
Apigee Analyze を使って、応答速度とエラーを確認する
下の続き
https://qiita.com/hatakkkk/items/fcddd7460483113fde68

#利用方法
[営業向け] 運用担当者様へ監視イメージの共有
[エンジニア向け] Apigee 監視設計に向けて触り


#作業
Apigee ポータルへアクセス
https://login.apigee.com/login

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/184724/3bc28f6a-4930-b7ac-49aa-d1d96ae0c3af.jpeg)

Analyze を選択
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/184724/ce3d9d61-0715-4046-524e-2cde2a1fa43a.jpeg)

performance を選択
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/184724/ef110498-1583-091d-5848-66d605f8b60d.jpeg)

API 応答の状態を確認
![WS000000 - コピー.JPG](https://qiita-image-store.s3.amazonaws.com/0/184724/b0f21075-5eb7-0621-a39e-afe98cb1ce84.jpeg)


#注意点
Analyze は、(フリープランでは)１週間分の状態しか保持できない。
監視サーバへ情報を投げるなど、２週間分の状態保持をできると良いだろう。
※一人で運用するなど、小型案件では、GW や年末年始など、大型連休明けにエラーを発見するもログ無し、、、という経験があり、２週間はログ保持できるよう保存先（S3など）を確保すると良いだろう
SQL Server の計算列に助けられたが、実行速度が気になったので検証

[ブログからの転載](http://1bed.allright.life/?p=2703)

## 経緯

SharePoint の 1 行テキストにある「コード列」(仮称)というのがあり、オンプレのシステムにバッチで同期を取っているシステムがあったとします。
(もちろん実際はそんなんじゃないけど)

納品日に言われました。
「コード列の並び順は数字順にしてください」

俺「そのフィールドは 255 文字の 1 行テキストなので、数値型以外が入る可能性があります。」
お客様「んー それは並ばなくていいから、数字のだけ並べてください」

(´；ω；｀)ｳｯ…

今更、同期バッチに手を入れる訳にもいかなかったので、SQL Server の計算列を作り、ORDER BY 句だけ変更する事で逃げ切れました。

その時に気になったのは、次の 3 パターンで実行速度がどの程度変わったのだろう？ということ。

* ORDER BY 句で CAST する
* 計算列の値を物理的に保存しない仮想列で作る
* 計算列の値を物理的に保存する PRESISTED を付ける

## そもそも計算列とは？

Docs には次の説明がありました。
> 計算列の式は、他の列のデータを使用して値を計算し、それを自身の列に格納します。

## 検証環境

検証で使ったのは SQL Server 2017 (64bit)で、検証用テーブルは次の通り。

```sql
CREATE TABLE [dbo].[dummy](
	[CODE] [nvarchar](50) NOT NULL
) ON [PRIMARY]
GO
```

検証用データとして次のデータを作成しています。
* CODE 列に、TEST00 ～ TEST09 を登録
* CODE 列に、000010 ～ 999999 をランダムに登録


検証用計算列をつけます。

```sql
ALTER TABLE [dbo].[dummy] ADD [INTCODE] AS TRY_CAST(CODE AS int);
ALTER TABLE [dbo].[dummy] ADD [INTCODE_PERSISTED] AS TRY_CAST(CODE AS int) PERSISTED;
```
PERSISTED を付けると物理的にデータを保存します。
かかった時間は、テストデータが入っている状態で 3 秒ほどでした。

## 検証

SQL Server Management Studio で実行

### 計測で使った SQL 文

```sql
DECLARE @StartTime datetime
DECLARE @EndTime datetime

-- キャッシュのクリア
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE 

SELECT @StartTime=GETDATE()

-- ここに検証する SQL 文

SELECT @EndTime=GETDATE()
SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in millisecs] 
```

### 検証する SQL 文

* ORDER BY する時に CAST してソート

```sql
SELECT [CODE] FROM [test].[dbo].[dummy] ORDER BY TRY_CAST(CODE AS int);
```

* 計算列の値を物理的に保存しない仮想列でソート

```sql
SELECT [CODE] FROM [test].[dbo].[dummy] ORDER BY [INTCODE];
```

* 計算列の値を物理的に保存する PRESISTED をつけた列でソート

```sql
SELECT [CODE] FROM [test].[dbo].[dummy] ORDER BY [INTCODE_PERSISTED];
```

### 検証結果

| 検証内容 | かかった時間(ミリ秒) |
| --- | --- |
| ORDER BY する時に CAST してソート | 7606 |
| 計算列の値を物理的に保存しない仮想列でソート | 7624 |
| 計算列の値を物理的に保存する PRESISTED をつけた列でソート | 7300 |

計算列にはインデックスも張れるようなので、インデックスもつけて再度検証してみる

* 作成したインデックス

```sql
CREATE NONCLUSTERED INDEX IX_INTCODE ON [dbo].[dummy]([INTCODE]);
CREATE NONCLUSTERED INDEX IX_INTCODE_PERSISTED ON [dbo].[dummy]([INTCODE_PERSISTED]);
```

* インデックスをつけて検証

| 検証内容 | かかった時間(ミリ秒) |
| --- | --- |
| 計算列の値を物理的に保存しない仮想列でソート | 7424 |
| 計算列の値を物理的に保存する PRESISTED をつけた列でソート | 7316 |

## 考察

数字を見てどちらでも良かったんだなと安心。  
今回は同期バッチを修正せず、プログラム側も最小限の変更に抑えたかったので、計算列を使って良かったと今でも思っている。

向いている処理としては、各種税の計算を計算列でやるとかはアリかもと思った。

## 参考

* [テーブルの計算列の指定](https://docs.microsoft.com/ja-jp/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-2017)
* [TRY_CAST (Transact-SQL)](https://docs.microsoft.com/ja-jp/sql/t-sql/functions/try-cast-transact-sql?view=sql-server-2017)
phpunit6でテストしてるプロジェクトをphpunit7にあげてparatestの最新版を使えるようにする

## PHPUnit6→PHPUnit7

```bash
$ composer update phpunit/* sebastian/diff sebastian/comparator 
```

phpunit7+ ではtestsuiteにnameがないと怒られるようになったのでphpunit.xml.distを修正する。

## paratest入れる

```bash
$ composer require --dev brianium/paratest
```

## paratestでテストを実行する

```bash
$ vendor/bin/paratest -p 5
```

## 雑記

- あまりスペック良くない環境だと、通常のphpunitにくらべてあまり実行時間の差が出なくて旨味が少ない（先人も言っている通り）
【Rails】carrierwaveの文字化けの対処法

carrierwaveの設定を初期設定のままファイル名に日本語が入っているものをアップロードすると、文字化けしますよね。

そんな時は

```ruby:config/initializers/carrierwave.rb

# 日本語のファイル名が「__」に置き換わるのを防止
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
```
と一番下に追加すればOK！！！
書いたらサーバーの再起動を忘れずに！！！

けれどこれだと、（株）や①などの特殊文字が入っているファイル名が「__」に置き換わってしまいます。

そんな時は

```ruby:config/initializers/carrierwave.rb

# 日本語のファイル名が「__」に置き換わるのを防止
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:print:]]/
```

に変えればOK!!!
[:print:]で日本語も特殊文字も文字化けしなくなります！！
なので、[:word:]よりこっちを書いた方がいいかもしれませんね。
もう一度言いますが、書いたらサーバーの再起動を忘れずに！！！

ちなみに、[:word:]や[:print:]はPOSIX文字クラスといいます！

詳細は、このURLに書いてあるので、読んでみてください！！
[https://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fregexp.html]
コントローラ以外で Jbuilder の部分テンプレートを描画する

# 方法

```app/views/users/_user.json.jbuilder
json.(user, :name, :musical_instrument)
```

```rb
ApplicationController
  .new
  .view_context
  .render(
    partial: 'users/user',
    locals: { user: User.find_by!(name: '中川 夏紀') }
  ) #=> "{\"name\":\"中川 夏紀\",\"musical_instrument\":\"ユーフォニアム\"}"
```

# 関連

Slim で同様のことを行う場合は [コントローラ以外で Slim のテンプレートを描画する](https://qiita.com/QUANON/items/18945092d2fa47c90318) を参考に。
CSS Flexbox がなかなか覚えられない人のための確認ツール

Flexbox を試すツールを作ってみました。

既存のツールもいろいろあるのですが、英語に疎い私にはそもそも align justify content items のキーワードたちが何を意味するのかがなかなか頭に入ってきませんでした。なので特徴としてデフォルトでは簡潔な日本語にしています。

ボックスをクリックすると子要素の設定もできます。ただし1つだけです。

下に他の方が作ったツールもあるので英語が堪能な方はそちらも参照してみてください。

<p data-height="1300" data-theme-id="0" data-slug-hash="xzvEqE" data-default-tab="result" data-user="akicho8" data-embed-version="2" data-pen-title="FlexBox Test" class="codepen">See the Pen <a href="https://codepen.io/akicho8/pen/xzvEqE/">CSS FlexBox playground</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 他の方が作ったFlexboxレイアウト確認ツール

▼Flexbox playground
https://codepen.io/enxaneta/full/adLPwv
挙動をすぐに確認できるように項目ごとにボックスが初期配置されています

▼Flexbox Playground
https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/
子要素の設定もそれぞれ変更できます

▼TEST CSS FLEXBOX RULES
http://flexbox.help/
親要素だけですがCSSが下に表示されるのが便利です
[ エラー ]  PHP MySQL SQL文 日付で範囲指定し絞り込む 

#Datepickerを使用し、日付で絞り込みをする

SQL文で、絞り込みをしましたがエラーでつまづいたので :frowning2:

```html:index.html
<div id="datepicker">
 <input type="text" name="date_start">
 <input type="text" name="date_end">
</div>
```

```php:date.php
$start = $_POST['date_start'];
$end = $_POST['date_end'];

$sql = "SELECT * FROM news WHERE created_at BETWEEN $start AND $end";
```

上記の書き方だと、絞り込みができませんでした。

- 絞り込み条件の部分には、プレースホルダを使用する

```php:date.php
$start = $_POST['date_start'];
$end = $_POST['date_end'];

$sql = "SELECT * FROM news WHERE created_at BETWEEN start = ? AND end = ?";

$stmt->bindValue(1, $start, PDO::PARAM_STR);
$stmt->bindValue(2, $end, PDO::PARAM_STR);

$stmt = $pdo->prepare($sql);
$stmt->execute(array($start,$end));
```
経費申請承認アプリ作るには、どうするといい？

友達から相談を受けたので、自分がやるなら、という観点での選択肢を列挙。

ワークフロー, Business Process Management, ビジネスプロセス管理システム (BPMS)  という分野になるもよう。

SaaSいいかもと思ったけど、通信条件が不安定な場所で使いたいという要望もあったので、便利なフロントエンド作り自身がなく、オンプレ側での提案になるかもしれない。


## Python / Django で実装

### Viewflow

* [Viewflow](http://viewflow.io/)
* GitHub > [viewflow](https://github.com/viewflow/viewflow/)
* [viewflow – Djangoのための再利用可能なワークフローライブラリ](https://githubja.com/viewflow/viewflow)

pip で導入できる Django のライブラリ。[ドキュメント](http://docs.viewflow.io/)、[デモ](http://demo.viewflow.io/)も用意されてるなど、非常に揃ってるので、安心して使えそう。

AGPL v3.0 ベースのライセンス提供OSSの他、商用利用向けライセンスも用意されているとのこと。


### SpiffWorkflow

* GitHub > [SpiffWorkflow](https://github.com/knipknap/SpiffWorkflow)

こちらも pip で導入できるエンジン。Python向けなのでDjangoなくてもOK。[ドキュメント](http://spiffworkflow.readthedocs.io/en/latest/index.html)もあり、良さそうな感じ。

LGPL v3 で提供されており、商用サポートを受けることも可能とのこと。


## プラットフォームを使う

### Activiti

* [Activiti](https://www.activiti.org/)
* GitHub > [Activiti/Activiti](https://github.com/Activiti/Activiti)
* [Activitiを使ったワークフローシステムの構築 第1回目：業務フローとActiviti](http://labs.opentone.co.jp/?p=5500)
* [Activitiを使ったワークフローシステムの構築 第2回目：ワークフローを描く](http://labs.opentone.co.jp/?p=5752)

> Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted at business people, developers and system admins. Its core is a super-fast and rock-solid BPMN 2 process engine for Java. It's open-source and distributed under the Apache license. Activiti runs in any Java application, on a server, on a cluster or in the cloud. It integrates perfectly with Spring, it is extremely lightweight and based on simple concepts.


[Developer Guide](https://activiti.gitbooks.io/activiti-7-developers-guide/)なんかも揃ってるし、Dockerでインストールできるイメージがあったりと、活発な印象。

Javaで作られていて、Apacheライセンスで提供されてる。


## クラウド使う

### Questetra BPM Suite


* [Questetra BPM Suite](https://questetra.com/ja/features/)

> Questetra BPM Suite は、100% ウェブベースの ビジネスプロセス管理システム (SaaS BPMS) です。
> 設計担当者（プロセスオーナー）は、業務フロー図・担当ルール・入力画面 の設定を通じて ワークフローアプリ を定義します。 > 作業担当者は マイタスク に表示された作業を処理します。

解決できるワークフローの例が豊富で良いなぁ。これならサーバー運用いらないし、一番高速に対応できそう。

Approval Flows : 申請承認 ももちろん対応。[Freeプラン](https://questetra.com/ja/pricing/)もあり（連続15日間の利用がない場合に停止、10ユーザまで登録可能）


## その他

友人はRuby入門中と聞いたので、Rubyでの対応方法も少し探してみた。

* Twilio Doc > [RUBYおよびRAILSを使用したワークフローの自動化](https://jp.twilio.com/docs/sms/tutorials/workflow-automation-ruby-rails)
Azure functions workshop

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azure Functions でサーバーレスを体感してみよう」で使われた資料のご案内です。</p>

- <strong>Azure functions workshop </strong><br />
https://www.slideshare.net/secret/KstsH4Csb2wT8D

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
BFF

BFFそれは最後のフロンティア。

## Webエンジニア

*BFF* : **Backends for Frontends**

https://docs.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends

人によってはBackendがBackendsになったり、FrontendｓがFrontendsになったり、さらにはFront-endといった表記をする人もいるが、上記リンクのように、特に単数形を明示的に使用する意図がない場合はMicrosoft様にならい、どちらも複数形が正式なBFFの正式な説明として使用することが望ましい。

## 一般人（10代女性用語）

*BFF* : **Best Friends Forever**

https://ejje.weblio.jp/content/BFF

USのティーンなガールが使用する用語。
男性及びティーンではない女性は使用を控えるのが望ましい。


---
AE　ExtendScriptでコードをエラーチェックしながら一つずつ処理していく。

#コンストラクタに入ったオブジェクトをチェックしていく

チェック方法はtureかfalseかで判定してく。
まずは理解しやすく、a・b・cの変数にはtrueかfalseが入っています。

```jsx
var a = true;
var b = false;
var c = true;

function check01(){
    $.writeln("◆◆◆◆◆check001");
    if ( !a ){$.writeln("aが中断されました"); return false;};
        $.writeln("aが通りました");
    if ( !b ){$.writeln("bが中断されました"); return false;};
        $.writeln("bが通りました");
    if ( !c ){$.writeln("cが中断されました"); return false;};
        $.writeln("cが通りました");
}
     
check01();
```
check01の結果は↓

```console
◆◆◆◆◆check001
aが通りました
bが中断されました
```

これで「a」の処理が通った後「b」の処理では中断され、「ｃ」も通ってませんね。

#では応用として
この様なプログラムになります。

```jsx

var d = 0 ;
var e = 1 ;

function pt01(){
    if ( d != 0 ){
    alert("0ではありません");
    return false;
    }
return true;
}

function pt02(){
    if ( e != 0 ){
    alert("1ではありません");
    return false;
    }
return true;    
}

function check02(){
    $.writeln("◆◆◆◆◆check002");
    if ( !pt01() ){return false;};
    $.writeln("pt1が通りました");
    if ( !pt02() ){return false;};
    $.writeln("pt2が通りました");    
}

check02();

```
これを実行するとfunction pt02では
e!=0
これは変数[e]には１が入っているのでfalseですね。
check02でfalseの判定によりreturn falseが返ってきて次の処理はされません。

```console
◆◆◆◆◆check002
pt1が通りました
結果 : false
```

これでひとつひとつエラーチェックをして通れば次の処理が出来ますね。
結局新卒はどの記事をみたら良いのかを２年目が考える 


いろいろ詰まってる。一度は読んでほしい。
[ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】 - Qiita](https://qiita.com/jacksuzuki/items/b2fa6b44962e73a53d08)

情報収集方法。
[エンジニアの情報収集法まとめ - Qiita](https://qiita.com/nesheep5/items/e7196ba496e59bb2aa28)

工数見積もりは必ず身につけておきたいスキル。あとは経験。
[工数見積もりのコツ - Qiita](https://qiita.com/yutakakn/items/b0e36196df474acf9359)

コードに関する原則。新人のうちは必ず守れよってより意識するだけでも○
[新人プログラマが知るべきプログラミングの原則６選！ - Qiita](https://qiita.com/ryotanatsume/items/018cae5c5be8faba367a)

議事録はいずれ書くはずだ。
[新人さんに議事録の取り方をレクチャーしたときのメモ - Qiita](https://qiita.com/y_saeko/items/44f3f7054a033960de23)

同士は多い。前向きに頑張ろう。
[エンジニアを指導する立場の人こそ読んでほしい、新卒エンジニアが1年間で上司に感じた５つのこと - Qiita](https://qiita.com/H_Crane/items/22ea96300dda82ec5b02)

しくじり先生的なイメージ。こういうのも知っておこう。
[【新人向け】入社して３年たった僕が後悔していることまとめ - Qiita](https://qiita.com/januaryCOM/items/07569baa0fc699c7766b)

新卒の時に感じていたこと
[プログラミングをよく知らない初心者がシステム開発をしてみて気付いた話 - Qiita](https://qiita.com/minakenty321/items/da213cac83bce9884a67)


新卒、新人向けの記事をまとめました。新卒の時に困っていたこと、助かったことをベースにチョイスしました。
カラーミーで商品のオプション価格を全て取得する

`$option_view_data`の中に色々入っているようです。
`<{$option_view_data|@debug_print_var}>`配列をdumpできます。

JavaScriptで商品データを作成するには

```javascript:optionData.js
<{* 価格表データの生成 *}>
var optionData = [];
for (let i = 0; i < 3; i++) {
  optionData[i]=[,,];
}
<{foreach from=$option_view_data item=i key=k}>
  <{foreach from=$i.data item=i2 key=k2}>
    optionData[<{$2}>][<{$k}>] = "<{$i2.sales}>"
    <{* option_view_dataの配列の次元がなぜか直感とは逆っぽいです *}>
  <{/foreach}>
<{/foreach}>
```
のような感じでできるかもしれません。

この情報にたどり着くまで3時間くらいかかってしまった。