OmniAICreator/Qiita-1.07M huggingface dataset:
Linux環境でのpyenvでPythonのAnaconda環境構築メモ


データサイエンティストを目指す人のために。

**pyenv**:様々なバージョンのPythonを管理するツール。導入することで，Python v2系とv3系など，複数のバージョンの切り替えが容易になる。

**Anaconda**: Python本体に加え，科学計算やデータ分析などに使えるライブラリがセットで入っているパッケージ。


> Anaconda is a free collection of powerful packages for Python that enables large-scale data management, analysis, and visualization for Business Intelligence, Scientific Analysis, Engineering, Machine Learning, and more.



###環境  
Linux (Ubuntu, CentOS等)
※gitはインストールされている前提で進めています。現代の標準的な環境ではインストール済/入ってないような環境を扱っている方々はご自身でインストール可能かと思いますので..

###メモ
コマンドはターミナル上にそのまま入力。「\\$」以降がそれぞれ一つのコマンドとなってます。「\\$」マークは入力不要です。


###1.pyenvのインストール
[pyenv installer](https://github.com/pyenv/pyenv-installer)を使うことで一瞬でインストールが行えます。
pyenvも標準的なプラグインも同時にインストールを行います。

```bash:Terminal
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
```

コマンドを実行すると下部に以下のような表示が出ると思います。

```bash:Terminal
WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="/home/user_name/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```
(user_name部分は人によって変わります)

.bashrc (bashの設定ファイル)に書き込んでほしいとあるので，書き込みます。

```bash:Terminal
$ echo 'export PATH="~/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
```
/home/user_nameはユーザーのホームディレクトリを表しているので，'~'に置き換えてしまいました (同じ意味です)。
`~/.bashrc`の箇所は最初の出力文(`# the following to ~/.bashrc:`)に合わせて変更を行ってください。
例えばbashではなくzshを使ってる人は`~/.zshrc`と出るかと思います。

シェルを再起動します。

```bash:Terminal
$ exec $SHELL -l
```

pyenvをアップデートします。

```bash:Terminal
$ pyenv update
```

###2.Python (Anaconda) のインストール
#### pyenvでインストール可能なPython確認
anacondaの最新バージョンを確認します。
pyenvでインストール可能なバージョン一覧を表示します。

```bash:Terminal
$ pyenv install -l
```
※pyenvはかなり色んなものをインストールできるので，anacondaだけみたいという場合は，
`$ pyenv install -l | grep anaconda`とします。

####Python version 3系を使いたい方
```bash:Terminal
$ pyenv install anaconda3-4.0.0
$ pyenv global anaconda3-4.0.0
```
####Python version 2系を使いたい方
```bash:Terminal
$ pyenv install anaconda-4.0.0
$ pyenv global anaconda-4.0.0
```

###3.確認
```bash:Terminal
$ python --version
```
`Python 3.5.1 :: Anaconda 4.0.0 (x86_64)`
のように出れば導入成功です。(v.3系の場合)

###4. Pythonバージョンの切り替えについて (pyenvの使い方)

```bash:Terminal
$ pyenv versions
```
でpyenvでインストールしたpythonのバージョンが確認できます。

```bash:Terminal
$ pyenv global anaconda3-4.0.0
```
のようにしてpython 3 (この場合はanaconda3-4.0.0)を使うように指定できます。
他のバージョンへの切り替えも同様に行えます。

また，新しいAnacondaやPythonバージョンのインストールは，

```bash:Terminal
$ pyenv install -l
```
でインストール可能なpythonバージョン一覧を表示し，

```bash:Terminal
$ pyenv install ふぇぇ
```
で指定したバージョンをインストールできます。

※本来ならばAnacondaはバージョン管理機能も持っているため，複数のAnacondaを入れる必要は必ずしもありません。私はpythonのバージョン管理はpyenvのみで行うようにしているため，複数のAnacondaを入れています。
また，Anacondaを直にインストールすると他のプログラムと競合する可能性があるため，pyenv経由で入れています。
(うまくPATHの設定を行えば大きな問題は起こらないとも聞いてます)

何かご不明な点，誤り等ございましたらコメントお願いします。

mscOS版：[HomebrewのインストールからpyenvでPythonのAnaconda環境構築までメモ](https://qiita.com/aical/items/2d066801a7464a676994)
jQueryでクリックした要素のid取得

# jQueryでclickした要素のidを取り出す

メモ書きです。
苦手なので書き置きしておきます。

```js
// 日付選択
$('.day').on('click', function() {
    var day_id = $(this).attr('id');
    console.log(day_id);
});
```

これをすることでカレンダーをクリックして日付を取得するコードのパーツとして使います。

## attrでエラーが出たら

jQueryのバージョンの問題です。
propに書き換えてください。

```js
// 日付選択
$('.day').on('click', function() {
    var day_id = $(this).prop('id');
    console.log(day_id);
});
```
機械学習で可視化したいからVagrantにGUI環境を入れてみた

## はじめに

普段`Virtual Box × Vagrant`を利用して仮想環境下で、機械学習の勉強を行なっているのですが、学習データを可視化する為にGUI環境が必要となりました。
ホストOSはmacOSを使用しています。

そもそも、Vagrant上で構成されるLinuxはどれもGUIの必要がないため、それに関するドライバ、ツール、プラグインのたぐいは削除されています。
なので、GUI環境を構築するとなると、色々と手間がかかります（OSの知識も必要ですし）

Virtual Box上にCentOSをインストールした方が楽なのですが、既に行なっている環境下にGUI環境を構築したい、とシンプルに思いましたので、構築する事としました。

現段階でもまだ不完全なのですが、都度更新という事で、現段階までの状況を作る為の構築を記載したいと思います。


##ホストOSに(macOS)X11(XQuartz)を入れる

↓下記のページからX11(XQuartz)をインストールして下さい。
[https://www.xquartz.org/]

###X11(XQuartz)とは


X11(XQuartz)は、`X Window System`の事。厳密には異なると思うのですが、ここでは厳密に知る事を目的としていないので、解釈の一つとしてX Window Systemと解釈して良いと思います。
X Window Systemはざっくり言うと、GUI操作を可能にするウィンドウシステムです。(余談ですが、MIT(マサチューセッツ工科大学)で開発されたようです。さすが`MIT`[http://www.astec-x.com/FAQ/aboutx.html])

##CentOS側にX11 サーバーを入れる

↓下記のコマンドを叩いて仮想環境側のCentOSにX Window Systemをインストールします。

```
$ sudo yum -y groupinstall "X Window System"
```

このままでは日本語が文字化けするので、

```
$ sudo yum -y install vlgothic-*
```

を叩いて日本語フォントをインストールします。

上記インストールが終わったら起動モードを変更します。

```
$ sudo systemctl set-default graphical.target
```

`graphical.target`はランレベル5なので、ランレベル3の動作プラスX Window Systemの起動、になります。つまり、CUIを利用時にX Window Systemを起動させるという事です。

ランレベルに関しては下記の記事が参考になりましたので、一度読んでみる事をオススメします。
[参考]
https://qiita.com/takahirono7/items/8b971cd1cf2ddcfe0e04


起動モードを変更したら再起動して下さい。


##テストデータを作成して動作確認

```python
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt

plt.plot([0, 1, 2])
plt.show()
```

上記のコード書いて、スクリプトを実行してみて下さい。

```
$ python test.py
```

<img width="1028" alt="スクリーンショット 2018-10-26 13.52.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/267738/201dbe72-a85a-ba68-aa61-7b6646cc67f1.png">

上記の画像のようにグラフが表示されれば成功です！


##まとめ

簡易的なGUI環境の導入を記載しました。
正直これでは、あれしたい、これしたい、が出来ない状態かと思いますので、都度足りない点を補っていく必要があります。
面倒や手間の掛かる事を選択すると多くの事が学べて良いなぁと思いました。(過度の時間を浪費する事はナンセンスですが・・・)
冒頭でも述べたように都度更新して行く予定です。Vagrantで快適なGUI環境が整えられたら面白いなぁと思いながらこれからも勉強していこうと思います。
AmazonLinux (Docker)にNode.js & npmをインストールする。

AmazonLinuxにNode.jsとnpmをインストールします。

### ■ 動作環境
- AmazonLinux Docker images(https://hub.docker.com/_/amazonlinux/)
- Docker for mac

### ■ 事前準備
- AmazonLinuxのDocker imagesをpullします。

```bash
$ docker pull amazonlinux:latest
```


```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amazonlinux         latest              d656eea421ba        7 days ago          162MB

$ docker run -itd amazonlinux
$ docker ps -a --format "table {{.ID}} {{.Image}}"
CONTAINER ID IMAGE
8c128ef6eb5a amazonlinux
$ docker attach 8c128ef6eb5a
bash-4.2#
```

### ■ Node.js & npm インストール
[Installing Node.js via package manager](https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora)
の手順を参考にインストールしていきます。

AmazonLinuxは、Enterprise Linux and Fedoraの部分を参考にします。

**On RHEL, CentOS or Fedora, for Node.js v8 LTS:**

```bash
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
```

**Then install:**

```bash
sudo yum -y install nodejs
```
※sudoが使えない場合は、`yum install -y sudo`でインストールしてください。

完了です。
きちんとインストールされたか確認していきましょう。

```bash
$ node --version
v8.12.0
$ npm --version
6.4.1
```

以上です。
TRY...CATCH (Transact-SQL)　確認

# 概要
ストアドプロシージャの挙動を調べたので書く。
try catchがない場合とtry catchがある場合に、後続の処理がどうなるのかを書いた。
エラーになって次の処理をさせたくない場合は、@@ERROR　で常にチェックするか。
try catchで処理の全体を囲むのが良い

# サンプルプログラム

テーブル作成

```table.sql
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[01_T](
	[TITLE] [nvarchar](10) NULL
) ON [PRIMARY]
```

try catchがない場合は一行目がエラーとなり、２行目が実行されてしまう。

```no-trycatch.sql
ALTER PROCEDURE [01_INSERTPROC] AS

     -- 新規データ（処理は失敗する）←ここでエラーなっても
    INSERT [01_T](TITLE) VALUES('１２３４５６７８９０A')

     -- 新規データ（処理は成功する）←ここが実行される。
    INSERT [01_T](TITLE) VALUES('１２３４５')

  RETURN @@ERROR

```

try catchがある場合、一行目がエラーなれば、処理が終了する。

```trycatch.sql
ALTER PROCEDURE [01_INSERTPROC] AS

BEGIN TRY
     --新規データ（処理は失敗する）←ここでエラーなると下の処理は実行されない。
    INSERT [01_T](TITLE) VALUES('１２３４５６７８９０A')

     -- 新規データ（処理は成功する）
    INSERT [01_T](TITLE) VALUES('１２３４５')

END TRY  
BEGIN CATCH 
    --エラーを出力
    SELECT   
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_MESSAGE() AS ErrorMessage; 
	RETURN 9999
END CATCH 

  RETURN ERROR_NUMBER()
```

ストアドの実行

```ストアドの実行.sql
DECLARE @RC int
EXECUTE @RC = [dbo].[01_InsertProc] 
select @RC
GO
```

# 参考サイト
https://docs.microsoft.com/ja-jp/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017
Go 言語でサマータイムを扱う

# はじめに

* サマータイムは標準時とは別のタイムゾーンとして定義されており、時差はいくつか？開始終了日はいつか？という情報は [tz database](https://ja.wikipedia.org/wiki/Tz_database) にまとめられている。
* Go では `time.Location` 経由でこの tz database を利用しており、time.Location を time.Time に与えることでタイムゾーンを取り扱うことができる。

# コード

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	// 地域名から Location を取得
	loc, _ := time.LoadLocation("America/New_York")
	// Location を指定して日時を表示
	fmt.Println(time.Now().In(loc)) //=> 2009-11-10 18:00:00 -0500 EST

	// サマータイムと標準時の切り替わりの挙動を確認する
	// サマータイムを採用している地域の Location では日時によってタイムゾーンが切り替わる
	fmt.Println("サマータイム開始")
	fmt.Println(time.Date(2018, 3, 11, 6, 59, 59, 0, time.UTC).In(loc)) //=> 2018-03-11 01:59:59 -0500 EST
	fmt.Println(time.Date(2018, 3, 11, 7, 0, 0, 0, time.UTC).In(loc))   //=> 2018-03-11 03:00:00 -0400 EDT
	fmt.Println("サマータイム終了")
	fmt.Println(time.Date(2018, 11, 4, 5, 59, 59, 0, time.UTC).In(loc)) //=> 2018-11-04 01:59:59 -0400 EDT
	fmt.Println(time.Date(2018, 11, 4, 6, 0, 0, 0, time.UTC).In(loc))   //=> 2018-11-04 01:00:00 -0500 EST

	// サマータイムを採用している地域の時刻をパースする
	// タイムゾーン名やオフセットがない場合は該当地域の指定時刻のタイムゾーンが適用される
	t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2018-03-11 01:00:00", loc)
	fmt.Println(t) //=> 2018-03-11 01:00:00 -0500 EST
	t, _ = time.ParseInLocation("2006-01-02 15:04:05", "2018-03-11 03:00:00", loc)
	fmt.Println(t) //=> 2018-03-11 03:00:00 -0400 EDT
	// タイムゾーン名を指定すればそのタイムゾーンになる
	// 例はサマータイムから標準時に切り替わる際にタイムゾーン違いで二度あらわれる 1 時をパースする
	t, _ = time.ParseInLocation("2006-01-02 15:04:05 -0700", "2018-11-04 01:00:00 -0400", loc)
	fmt.Println(t) //=> 2018-11-04 01:00:00 -0400 EDT
	t, _ = time.ParseInLocation("2006-01-02 15:04:05 -0700", "2018-11-04 01:00:00 -0500", loc)
	fmt.Println(t) //=> 2018-11-04 01:00:00 -0500 EST
}
```

* The Go Playground での実行は[こちら](https://play.golang.org/p/lFgr8X0zXmV)
iTunes でデバイス表示ボタンが表示されなかった理由が、AppleConfigurator2 のせいだった件

# 経緯
以前 iTunes の左上側にあるデバイス表示ボタン（正式名称知らん）が表示されなくて困って小便を漏らしていたが、
今調べても、今回書く内容の原因と解決策が載ってなかったので記事を作成しておく。
他の理由でボタンが表示されていない時は、他の解説記事を見て。
<img width="261" alt="スクリーンショット 2018-10-26 13.06.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/19668/13c49282-5534-be1c-1f62-cd739316210c.png">
# 原因
**AppleConfigurator2** を起動していると、その間 iTunes のデバイス表示ボタンは表示されない。
これに気づくまでずっとキレてたし、気付いた時に更にキレた。
ていうか AppleConfigurator ってなんなのん。
いらないなのん。
# 解決方法
1. AppleConfigurator2 を終了する。  
ウィンドウの閉じるボタンではなく、コンテキストメニューから終了すること。
1. iPhone と Mac を繋いでいる USB を外して再接続するか  
iTunes をコンテキストメニューから終了してから再起動するか、どちらかをやる。
1. デバイス表示ボタンが表示される。
1. Apple ○ねメールを送る。

Apple なんで、バージョンアップしたらなんか知らんうちに治ってたとか、なんか新たなバグが発生してたとかきっとあると思う。

# 備考
似てないけど似たような問題に、設定画面に自作アプリが表示されない、というものがあったので、
それについても書こうかと思ったけど、
該当の端末も問題の解決方法も忘れたので放置です。
【OpenCVSharp】Bitmap画像を編集して保存すると編集した要素の色が無くなる

Bitmapを読み込んで画像中にCv2.Lineなどで描画して保存したら色指定を無視されて白く描画されてしまいました。

色を出して保存は出来ましたが、原因までは辿り着いてません。


```C#
using OpenCvSharp.Extensions;
~~
Bitmap bmp = new Bitmap(@"C:\hoge.bmp");
var mat = BitmapConverter.ToMat(bmp);
Cv2.Line(nat, x1, y1, x2, y2, Scalar.Red);

//赤い線が描画されていることが確認できる
Cv2.ImShow("show", mat);

//赤かったはずの線が白くなる！！
var saveBmp = BitmapConverter.ToBitmap(mat);
saveBmp.Save(@"C:\out.bmp");
//ImWriteしてみるがこちらも白くなる
Cv2.ImWrite(@"C:\out.bmp", mat);

```




取り急ぎの対策は読み込み時にBGRに変換してやれば良い。


```C#
var mat  = BitmapConverter.ToMat(bmp).CvtColor(ColorConversionCodes.RGB2BGR);
```

どうも一番初めにBitmapで読んだときに、
MatのColorがRGBになっている様で、LineはBGRで描かれる？
Matの中にRGBとBGRが共存している・・・？
ような印象です。
ソースまで読んでないのでなんとも言えませんが。


所でMatの色情報を後から調べるにはどうしたらいいのでしょうか？？
こういうところが分かっていないので躓くんですね・・・。

しかし、ImShowでは色が見えるのにBitmap出力したらに色が消えてしまうなるのは罠だと感じました・・・。
todoリスト作成（phpMyAdmin)

＃TODOリスト作成
基本ドットインストール通りやれば簡単にできる。



□つまずいたところ

データベースをphpmyadminで作るときドットインストール通りでは解説がない。
要領は同じなのでドットインストールではターミナルを使ってやっているところの要点だけ掴んでデータベースを作成する。

□データベース作成
![スクリーンショット 2018-10-26 13.14.27.png](https://qiita-image-store.s3.amazonaws.com/0/286477/43d15635-eb9e-3a6e-8fcb-d6df23ff8b31.png)

データベース名を決め作成


![スクリーンショット 2018-10-26 13.16.01.png](https://qiita-image-store.s3.amazonaws.com/0/286477/89913f99-4937-bd55-608e-4f4b1d624172.png)

テーブル名とカラム数を決め実行。


todoリストの時のテーブルはこんな感じ

id      int(11)              AI 
state   tinyint(1)   NULL 
title   text         NULL 

phpmyadminでの操作はこれくらい。
他にエラーが出る場合はphpで起こっている可能性が高い。
[個人の方]Sigfoxデバイスのトークン切れの時

この記事は、Sigfox Shield for ArduinoやSens'itなど1年間無料トークン付きのデバイスをお使いの個人ユーザの方を対象に、トークン期限切れの時の再登録方法を記します。
法人ユーザの方は、基本、法人契約となるため、本記述の対象外です。
また、Sigfox Shield for Arduino、Sens'itを[SORACOM](https://soracom.jp/products/sigfox/)から購入された方も対象外となります。

#トークン切れとは？
長期契約を結んでいない場合は、デバイスをアクティベート（回線開通）してから1年間がトークンの利用期間となります。SigfoxクラウドのDEVICEタブをクリックし、デバイス一覧を見ていただくと、下図のように**Token State**が![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/eaa88c41-f3a7-db27-6223-157c61e381ab.png)マークになっているデバイスがあります。（Token Stateが表示されない場合は、右上の![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/0e6edbc3-3040-da1e-9702-fd8113c43bd2.png)マークをクリックし、表示を有効化してください）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/d1e97b22-1075-34cf-4aa1-de3308429c98.png)
このような状況がトークン切れであり、新たなトークンを割り当てる必要があります。

#トークン割り当て方法
大まかな流れは、下記の通りとなります。

1. [Sigfox Buy](https://buy.sigfox.com/)でトークンを購入
2. DEVICE TYPEを新規作成
3. DEVICEを再登録

##Sigfox Buyでトークン購入
下記URL（Sigfox Buy）にアクセスします。
https://buy.sigfox.com/

1. （既にSigfoxアカウントをお持ちの場合は）右上の**Login with Sigfox Id**をクリックし、Sigfoxクラウドのユーザ、パスワードを入力し、ログインしてください。（初めての方はログインする必要はありません）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/7c7cdb87-fa11-ba89-5983-31e9c56c82d4.png)
[Buy Connectivity >]ボタンをクリックします。

2. トークン単価および必要トークン数、その他オプション設定の画面に移行します。設定後、**[Buy]**ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/0f83e811-cad9-ff64-6fb3-58ec0918e002.png)

3. クレジットカード情報とGeneral Terms of Serviceの合意☑を入力し、**[Confirm your order >]**ボタンをクリックしてください。（はじめての方は、氏名や組織等の入力画面が先に表示されます）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/6b814d8b-d680-4d77-8e90-8d8bf35aa66c.png)

4. カード決済処理後、登録済みメールアドレス宛にbuy★sigfox.com（★のところは@）からメールが届きます。これで、新たなトークンを利用することができます。

##DEVICE TYPEを新規作成
先程購入したトークン（Contract）を使ってDEVICE TYPEを新規作成します。

1. Sigfoxクラウドの**DEVICE TYPEタグ**を[クリック](https://backend.sigfox.com/devicetype/list)し、デバイスタイプの一覧画面の右上にある**[New]**ボタンをクリックします。
2. "Select a group"ダイアログが表示されるので、対象のグループを選択してください。
3. DEVICE TYPEの新規登録画面（Device type - New）が表示されます。NameとDescriptionを入力後、**Contract欄に新たに購入したContract（購入トークン数が X token leftとなっているもの）を選択**してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/b1820f96-06e1-705f-34c3-25ed9630b0cc.png)
4. [OK]ボタンをクリックするとデバイスタイプが新規作成されます。

##DEVICEの再登録
トークン切れになっているデバイスを再登録します。

1. Sigfoxクラウドの**DEVICEタブ**を[クリック](https://backend.sigfox.com/device/list)し、デバイス一覧画面の右上にある**[New]**ボタンをクリックします。
2. "Select a group"ダイアログが表示されるので、対象のグループを選択してください。
3. DEVICEの新規登録画面（Device - New）が表示されます。Identifier (hex!)はトークン切れになったデバイスのIDとName、PAC、Typeを入力し、OKボタンをクリックしてください。この時のTypeは上記DEVICE TYPEの作成時に入力したDEVICE TYPE名となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/8b207783-34df-a1ff-daca-c97bff791522.png)
※PACは、ワンタイムコードとなっているため、デバイス自体に印字されているコードではなく、最新のPACを入力する必要があります。
最新のPACコードは、該当デバイスのInformationページに記載されている16桁のコードをお使いください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172313/0be4ce0d-b26c-14c8-6654-c61f02288420.png)

これで、次にSigfoxデバイスからメッセージを送信した時に、再アクティベートされます。

[Sigfox Japan KCCS](https://qiita.com/organizations/sigfox)
Access の VBA で複数行をコメントアウト

偶に忘れるのでメモ失礼します。

メニューより 「表示 > ツールバー > 編集」にチェックを入れる。
コードを複数行選択し、ツールバーのコメントブロックのアイコンをクリック

とのことっっ
http://jutememo.blogspot.com/2010/01/access-vba.html
Fortran if文 for文 print文 真偽値　PythonからのFortran

# はじめに

[前回](https://qiita.com/nyancook/items/0c91e7e574dd121ce2c4)Fortranを使って簡単なプログラムを作るやり方を紹介しましたが、今回は基本的な文法をつらつら書き並べていこうと思います。

　ちなみに、コンパイル環境がローカルにない場合は、[こちらのサイト](http://ideone.com)でコードを試すことができます。

以下で紹介するコードは全て、「!!!!!!!!!!!!!!!!!!!」の部分に書くものとします。


```fortran
program main
implicit none
!!!!!!!!!!!!!!!!!!!
end program main
```

# print文

fortranでのコメントアウトは「!」です

```fortran
print *, "My ", "name ", "is ", "hoge" ! My name is hoge
```

# if文

絶対値は組み込みのabs( )を使える

```fortran
integer x
x = -100
if (abs(x) >= 10) then
    print *, "very big or very small value"
else
    print *, "-10 < x < 10"
end if
```

# for文

Fortranではfor文というよりdo文です

```fortran
integer i
integer n_iter
real x

n_iter = 10
x = 0

do i=0, n_iter-1
    x = x + i
    print *, x
end do
```

# 論理演算

```fortran
integer x
logical is_true
x = 10
is_true = .false.

! 値の大小
if ((x >= 10) .or. (x <= -10)) then
    print *, "bigger than 10 or smaller than -10"
end if

! true or false
if (is_true) then
    print *, "true dayo!"
else
    print*, "false dayo!"
end if
```

# 終わりに

次はサブルーチン（Pythonでのfunction的な扱い？）を使って何かやりたいと思います。
侍エンジニア塾の記事を Chrome 拡張なしに Google 検索結果から一掃するわりと簡単な方法

みなさん、こんにちは！ 侍なんとか塾絶対Xすマンです！！

皆さんは Google 検索していますか？ プログラミング関連の調べ物をしていると、ときどき **侍エンジニア塾とかいうメディアのちょっとアレなクオリティの記事** に遭遇したりしていませんか？？

この侍エンジニア塾の記事がどれくらいアレなクオリティなのかというと、この Qiita にも

- [侍エンジニア塾のC言語のサンプルがヤバすぎる。](https://qiita.com/hamichamp/items/7b7a7ee091a6856ac900)
- [侍エンジニア塾の記事が炎上しているので追撃してみる](https://qiita.com/s-yama16/items/dad4a7f7c6ce623d1d76)

みたいな投稿があるぐらいにとってもアレなクオリティです！！

## 侍エンジニア塾の記事を Google 検索結果から一掃したい！

さてそんなアレなクオリティの侍エンジニア塾の記事を Google 検索の結果に見つけてしまうと、仕事の効率は悪化しちゃうしテンションはダダ下がってしまいますよね。しかも、初歩的なプログラミング系の検索ワードで検索するとだいたい検索結果 1 ページ目に入ってくる [圧倒的 SEO 力](https://qiita.com/mu_tomoya/items/b764b655291146a43cc9) によって、侍エンジニア塾の記事から逃れることはとても困難です。

侍エンジニア塾に限ったことではないですが、できるならば **アレなクオリティの記事は Google 検索の結果から除外** したくなるのが人の常なわけで、すでに同じ発想を **Chrome 拡張を使って実現する** 方法をまとめた方がいらっしゃったりします。

- [うざい侍エンジニア塾の記事をGoogleの検索結果から除外する](https://qiita.com/Taka/items/aac598da094ded3de4f0)

ただし、人によっては **余計な Chrome 拡張を入れずにブラウザの標準機能だけで実現したい** という方もいるわけで、今回紹介する方法はそんな方にピッタリの方法になります！


## Chrome の「検索エンジンの管理」を利用する

では具体的にどのように実現するのかというと、(Chrome の利用が前提となりますが...) **Chrome そのものの「検索エンジンの管理」の機能** を利用します。

[【小ワザ】Googleの検索結果にデフォルトでフィルターをかける方法](https://conpath.net/columns/filter-google-search-results-by-default/) にその方法が詳しく書かれているので、こちらの記事を読みつつ、



1. Chrome のオムニバー (普段 URL とか検索語句を入力するあの入力エリア) に `chrome://settings/searchEngines` と入力して、「検索エンジンの管理」 を開きます
2. その他の検索エンジンの右端の「追加」ボタンを押して「検索エンジンの編集」ダイアログを表示します
    - <img width="883" src="https://qiita-image-store.s3.amazonaws.com/0/11734/8a3fb36f-446e-e8b3-f201-a6dfd63ab296.png">
3. 「検索エンジンの編集」ダイアログでそれぞれの入力項目を埋めます
    - <img width="528" src="https://qiita-image-store.s3.amazonaws.com/0/11734/203574d7-8db7-91bc-507f-0bd74c867fce.png">
    - **検索エンジン**: 任意の名前 (例えば「Google (侍エンジニア塾除去)」みたいなの) で OK です
    - **キーワード**: ここで設定したキーワードをオムニバーに入力 + スペースを入力すると、この検索エンジンが使われるようになります
    - **URL**: 侍エンジニア塾の記事を根こそぎ除去するため、`-www.sejuku.net` を検索クエリに含めるようにします。具体的には以下のようにします


```
{google:baseURL}search?q=%s+-www.sejuku.net&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}
```

これで設定はひとまず完了です。わりと簡単でしたね！


## 試してみよう！

さて、実際に Google 検索をして試してみましょう！

Chrome のオムニバーに先程設定した「キーワード」、そしてスペースを入力すると、以下のスクショのような表示になるはずです。

<img width="911" src="https://qiita-image-store.s3.amazonaws.com/0/11734/414389a6-d561-568a-de4c-156ea391e88b.png">

今回は例として `Python クラス` で検索をしてみます。デフォルトの検索設定だと、以下のスクショのように 2 番目の位置に侍エンジニア塾の記事が来ます。

<img width="799" alt="sejuku あり" src="https://qiita-image-store.s3.amazonaws.com/0/11734/75b2df70-7c3e-33e1-d453-5f652a96f49d.png">

でも、さきほど設定した検索エンジンの設定ならご覧のとおり！ 侍エンジニア塾の記事が表示されなくなりました :joy:

<img width="794" alt="スクリーンショット 2018-10-26 11.46.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/11734/ee9e3b89-4472-b3ca-1a26-dfae1ab526a2.png">


## まとめ

Chrome をお使いの方であれば、なんの拡張も必要とせずに侍エンジニア塾の記事を Google 検索結果から除外する方法をご紹介しました。またこの方法は侍エンジニア塾の記事に限らず、同様の Google 検索フィルタの設定を追加すればどんなサイトにも応用できます。

この方法を活用して、みなさんよい Google 検索ライフをお過ごしください！
ActiveModel::SecurePassword.min_cost ってなんじゃい

# ActiveModel::SecurePassword.min_cost ってなんじゃい
- RailsTutorialにこんなコードが登場するんです。

```ruby
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                              BCrypt::Engine.cost
```

- `min_cost`の定義についてはとくに説明がない…。
- しかたないので、Railsのソースコード見ました


# 結論

テスト環境だと`min_cost`が`True`になるようです。

```railtie.rb
module ActiveModel
  class Railtie < Rails::Railtie # :nodoc:
    config.eager_load_namespaces << ActiveModel

    config.active_model = ActiveSupport::OrderedOptions.new

    initializer "active_model.secure_password" do
      ActiveModel::SecurePassword.min_cost = Rails.env.test?  #　←ここ！！
    end

    initializer "active_model.i18n_full_message" do
      ActiveModel::Errors.i18n_full_message = config.active_model.delete(:i18n_full_message) || false
    end
  end
end
```

# 参考
初心者でもカンタンにRailsの中身のコードをコードリーディングする方法
https://qiita.com/jabba/items/8a9ac664eb2a0e61e621

# おわり　✨🍰✨
（というかRails6出るんですね！）
undifined !== '' がtrueになる理由

新卒の駆け出しエンジニアです。不慣れなJavascriptの実装中に等価演算子について理解していなかったために、少しハマってしまったことを共有します。

## 厳密等価演算子
厳密不等価演算子`!==`は`===`の逆。
そして`===`と`==`の違いは`===`はデータ型を変換するかどうか。

例)

```javascript
1 === '1'
=> false
```


しかし

```javascript
1 == '1'
=>true
```
下の方の`==`では型まで厳密にみていないため(同じ方に変換しようと試みる)`true`になる。

`!==`は`===`の逆で、型も含めて等しくなければ「true」
なので型が等しくないため

```javascript
1 !== '1'
true
```
になる

## undifined !== ''
`undefined` も `''` もboolean型では`false`に変換される。
だが変換されない厳密不等価演算子では、お互いの型が違うため`true`になってしまう。

つまり値がなかったらという処理を作る時に、不本意に`true`になってしまう場合がある。

そのため

``` javascript
if (hoge !== '') {
```

より

``` javascript
if (!hoge) {
```

と書くほうが良い
Xcodeのヘッダーコメントの年月を日本語表記にする

```
//  File.swift
//  ＜プロジェクト名＞
//
//  Created by <ユーザー名> on 2018/10/26.
//  Copyright © 2018 <著作権者>. All rights reserved.
```

この年月が、26/10/2018のような英語表記になっていた。
これはUSキーボードMacを買ったのが原因と思われる。

```
defaults write com.apple.dt.Xcode AppleLocale ja_JP
```

とターミナルで打つことで永続化設定できる。
US表記にしたければ、defaults write com.apple.dt.Xcode AppleLocale en_USとターミナルで打てばよい。

一時的にUS/JPを切り替えたいなら

```
/Applications/Xcode.app/Contents/MacOS/Xcode -AppleLocale "en_US"
```

とターミナルで打つ。

これでXcodeのヘッダーコメントは美しくなる。
なおCopyrightで「2018年」となるのが嫌でUSに変えてる人が過去いたようにググれば見られる。
が、23018年１０ガツ時点で上記コマンドでJPに変えれば、Copyrightの2018”年”は表記されない。
localhostと127.0.0.1を紐付けする方法

127.0.0.1はローカルループバックアドレスと呼ばれる自分自身を表す特殊なIPアドレスです。

ローカルループバックアドレスとlocalhostというホスト名を紐づけるには以下の設定を追加します。

```vim:/etc/hosts
127.0.0.1 localhost
```
SQLメモ CREATE ALTER


# CREATE文

```
//テーブル作成(mysql)
CREATE TABLE IF NOT EXISTS データベース名.テーブル名(
  cd integer NOT NULL PRIMARY KEY AUTO_INCREMENT, 
  name text,
  disp_flg integer NOT NULL DEFAULT 1,
  sort integer,
  new_record_time timestamp default current_timestamp(),
  update_record_time timestamp
);


//テーブル作成(POstgreSQL)
CREATE テーブル名
(
  cd serial NOT NULL,
  date date,
  name text,
  comment text,
  link text,
  target text,
  img1 text,
  img2 text,
  disp_flg integer NOT NULL DEFAULT 1,
  sort integer,
  new_record_time timestamp,
  update_record_time timestamp
  CONSTRAINT table_name_pkey PRIMARY KEY (cd)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE テーブル名
  OWNER TO postgres;
COMMENT ON TABLE テーブル名
  IS 'テーブル名';

//テーブルの複製
CREATE TABLE 新テーブル AS SELECT * FROM 既存テーブル;

```


# alter文

```
//カラムの追加
alter table テーブル名 add column カラム名;

//特定のカラムの後に追加したい場合
alter table テーブル名 add column カラム名 after 前のカラム名;

//カラムの削除
alter table テーブル名 drop column カラム名;
```
awsのs3のipレンジを取る

## 参考ページ

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html

## コマンド

```
curl https://ip-ranges.amazonaws.com/ip-ranges.json |  jq  '.prefixes[] | select(.region=="ap-northeast-1" and .service=="S3")'
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7059/2e17f8aa-7bf8-8df7-c627-7c105c5aa855.png)
知らないと損する検索ノウハウ

OJT で教えている後輩が検索で苦戦していたのでこのノウハウも大事だと思い記事にしました。
少し前の「ゴミ記事論争」に対し、検索側でできることもあると思ったのももう一つの理由です。

以下について説明します。

1. ショートカットキー
2. 検索ワード
3. 検索言語
4. 検索オプション
5. タブの有効活用
6. 検索エンジン

## ショートカットキー

ほとんどのブラウザはアドレスバーに検索ワードいれて Enter 押せば即検索できます。
ということでアドレスバーに即飛べるショートカットキーを覚えましょう。

```
Ctrl + l (小文字のL)
```

マウスとキーボードとの往復を極力なくすことで効率が上がります。
Chrome, Firefox, Edge, IE で確認してます。

## 検索ワード

調べたい単語 1 つだけでは、膨大な情報の海に対して良いコンパスにならないことも多いです。  
例えば JavaScript の Array について調べたいとします。
その場合`Array`とだけいれても、単なる一般名詞としての情報しかでてきませんよね。
なので`JavaScript Array`と入れるはずです。当たり前の話ですがワード選びが大切です。

検索ワードには欲しいものを忠実に入力することで欲しいものに近づけます。

- 説明がほしいときは「入門」、「解説」など
- サンプルコード「サンプル」、「example」、「source」

他にも、信頼性の高い特定のサイトやドメインの名前を入れてもいいかもしれません。
例えば JavaScript の配列の filter についての API ドキュメント読みたいときは、私は先頭に `mdn` と入れて検索してます。

```
mdn array filter
```

メジャーなサイトであればこれだけでサイト内検索もどきができます。

## 検索言語

基本的な情報であれば日本語による検索で十分事足ります。
ですが技術の話となると最新の情報は英語が圧倒的に多いです。
特に Experimental（実験的）に導入されてる API などはその傾向が強いです。
そういう時は検索ワードを英語に置き換えることで情報量が増えます。

もちろん検索結果は英語になるので、苦手な方は近年 AI で飛躍的に進化している Google 翻訳を使いましょう。

英語を読めるようになるのも良きエンジニアへの近道なので英語力を磨くのも一つの手です。

## 検索オプション

Google では検索オプションが用意されています。
https://support.google.com/vault/answer/2474474?hl=ja

以下は便利なのでよく使います。

| 演算子 | 使い方 | 効果 |
| ------ | ---- | ---- |
| -       | search -engine    | 検索から-をつけた語句を除外する |
| " " | "search engine" | 引用符で囲った語句の完全一致を検索する |
| site: | site:youtube.com engine | siteで指定したサイト・ドメインから検索する |

実はQiitaでも検索オプションが用意されています。
https://help.qiita.com/ja/articles/qiita-search-options

以下は一部です。全部見たい方は上のヘルプへどうぞ。

| 項目 | オプション |
|------|---|
| タイトルに「2018」を含んでいる | title:2018 |
| 本文に「Qiita」を含んでいる | body:Qiita |
| コードに「Ruby」を含んでいる | code:Ruby |
| 3件より多くストックされている	 | stocks:>3 |
| 「Ruby」または「Rails」を含んでいる | Ruby OR Rails |

## タブの有効活用

検索結果に対してトップページが一番見られることが多いです。
ただ、一番目に本当に欲しい情報がないことも多々あります。

なので私はよく検索結果の 1 ページめにて良さげなページを複数選んで別タブで開いてます。

![search01.gif](https://qiita-image-store.s3.amazonaws.com/0/89911/bd30b6d6-7e24-decd-8bd2-315fda3a40b3.gif)

違うなーって思ったらそのタブはすぐ閉じて次のタブ見てを繰り返してます。

## 検索エンジン

Google 選んどけば問題ないんじゃないでしょうか。
全検索結果のトップに広告表示してくる Bing は嫌だし……
あとは他にメジャーな検索エンジンって実はもうほとんどない？

## 終わりに

ゴミ記事論争は、趣旨外れた記事（Qiitaに作業日誌残すことなど）でなければ、エンジニアがアウトプットを習慣化していく過程で生まれるものなのでしょうがないと思ってます。

現実問題としてネット上の情報量は増えていくので検索する側も賢くならなくてはなりません。

検索しない日がない今、効率化ができればアウトプットにもより時間回せるはず。
もし「こんな方法もあるよ！」的なものがあればコメント欄にて共有いただけると嬉しいです。
UnityのPlayをせずに関数を呼ぶ

# はじめに
意外と知らない人がいたので簡単な使い方を。

Unityの再生ボタン(Play)を押さずに関数を呼びたいときありませんか？
例えば保存されているPlayerPrefsのデータを消したりなど。
その時は`ContextMenu`を使うと関数を呼ぶことができます。

公式ドキュメント
https://docs.unity3d.com/ja/2017.4/ScriptReference/ContextMenu.html

`ContextMenu 属性はコンテキストメニューにコマンドを追加することができます。`
なるほど。わからん
ということで画像で説明してきます。

# Script
テストコードを作りました。

```C#

public class ContextMenuTest : MonoBehaviour
{

	private string _scoreKey = "Score";

	// Use this for initialization
	void Start ()
	{
		//PlayerPrefsに保存されているUserIdとスコアを取得する.
		var score = PlayerPrefs.GetInt(_scoreKey,0);
		Debug.LogFormat("Score : {0}",score);
	}

	/// <summary>
	/// スコアのセット
	/// </summary>
	/// <param name="score"></param>
	public void SetScore(int score)
	{
		PlayerPrefs.SetInt(_scoreKey,score);
	}

	/// <summary>
	/// 仮のスコアをセットする
	/// </summary>
	[ContextMenu("TestScoreSet")]
	private void TestScoreSet()
	{
		SetScore(100);
	}

	/// <summary>
	/// スコアの値を削除する
	/// </summary>
	[ContextMenu("ClearScore")]
	private void ClearScore()
	{
		PlayerPrefs.DeleteKey(_scoreKey);

	}
}

```

保存するところは割愛します。
ContextMenuの説明ですが、関数の上に書くと、EditorのComponentの歯車クリックで出るようになります。
`[ContextMenu("Editorで表示される名前")]`
![スクリーンショット (23)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/255761/8236c124-4761-b482-e144-6336480f6ac8.jpeg)

自分で作った関数をクリックすると実行しなくても関数が呼ばれます。
これの使い所としては、値を削除とかしたい場合にuGUIなどでボタンを作り、実行時にポチっと。。。ということをしなくてもよくなります

ちなみにContextMenuの説明は日本語もできます。
`[ContextMenu("スコア削除する")]`
![スクリーンショット (24).png](https://qiita-image-store.s3.amazonaws.com/0/255761/b424bf3e-2f43-bdd1-4c79-f31df8792da1.png)

これを使ってエンジニア以外の方がUnityを使ってデバッグとか調整とかいろいろやりやすくなればいいなと思いました。
ReactNativeのリモートデバッグがiOSの実機で動かなくて困った話

# はじめに

ReactNativeのリモートデバッグをiOSの実機で行おうとしたら、jsのバンドルファイルのダウンロード完了から先に進まない現象に悩まされた。

# 対処法

デバッグに使うブラウザのコンソールを開き、↓ に表示されているURL (ここでは `http://192.168.100.32.xip.io:8081`) を開き直し、アプリをリロードしたら動いた。

<img width="518" alt="スクリーンショット 2018-10-26 12.15.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/73290/64baf8d5-8577-3238-31ed-3d4519261f14.png">

# 終わりに

手元で使っているReactNativeは少し古いので、最新のReactNativeでは直っているのかも。
自分が集めたデータの正確性のはなし。


趣味で某プラットフォームのデータを集めているのですが、実は自分が集めたデータがどれくらい正確かを調べたことはなかったんです。

ですので、HKT48さんが2018/10/19よりイベントを開始されてたので、そのイベントでの公式累計データを元に、自分のがどれくらい正確か調べました。

#ポイントシステム
コメント 1点（公式には１配信についき一人50コメントまで）
無料ギフト 1点（ただし10個同時に使用すると、1.25倍）
課金ギフト 課金額＝点数 （ただし10個同時に使用すると、1.25倍）

イベントでの得点はTwitterもしくはFacebookとの連携が必要だそうです。ただし、視聴者側として得られる情報に、Twitter連携しているかいないかはわかりません。（わからんこともないかもしれない）

一日の公式獲得ポイントは午前0時から午前5時までの、放送禁止時間帯での公式発表の前日との差から取得しました。

#考えられる傾向
　僕が使っている手法は、◯分に一度、配信されているか確認するため、最大◯分間の情報空白が発生します。ですが、高額課金アイテムについては、別途ログが取れるので、それらを活用しているので、課金アイテムについては、取りこぼしはないと思います。逆に、コメントと無料ギフトについては、配信開始から最大◯間の情報空白があります。視聴者は開始早々に手持ちのギフトを全て投げ込む傾向があるため、投入されるギフトは開始時が最も多くなります。この損失が大きく、おそらく総獲得ポイントの10％は減るかと覚悟していました。
　次に、イベント期間での得点はTwitter連携を行ったユーザーのギフトだけとなるのですが、パケット側からそれを判断する方法はありません（たぶん）。ですので、この面から見ると、公式に計算される得点より多くの得点を得ていると予想されます。
　後者の影響は小さいので、放送開始時の情報空白時間帯でのポイントが得られないことは予想され、最大20%、常に10%程度の差はあると予想しています。

#2018/10/24

2018/10/24の1日での公式獲得ポイント（Official Earn point）と、集収データ(Acquired Data)の差をみていきます。
テーブルの右端の差をみると、最大50％のデータ取りそこねがあることがわかります。（100%となっている箇所は、その日に放送してないはずのメンバーが、公式が何のアナウンスもなく獲得データを夜中に変更するために発生します）

傾向を見ると、獲得ポイントが多い＝人気メンバー様の放送で大きな差となっています。
逆に、下位の方をみると、僕の予想どおりに10％程度の差となっています。

![valdate001.png](https://qiita-image-store.s3.amazonaws.com/0/180426/7083d24a-7d38-09cc-42d3-b553eaa1f70a.png)

#2018/10/25

2018/10/25での公式獲得ポイント（Official Earn point）と、集収データ(Acquired Data)の差をみていきます。
前日同様に、MIKU_TANAKAさんの差が50％近くあります。

注目すべきは、AKI_TOMONAGAさんで、+159%でした。この日が誕生日でタワーが90本立ってましたが、イベントの公式には半分以下しか記録されていませんでした。おそらくこれは、タワーを投げタワーした方がTwitter連携してなかったのでしょう。非常にもったいないですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/2440b220-0de9-2dda-a6f2-554fdfcd4b04.png)

#2018/10/26

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/9d5f7a51-553c-56ab-b570-a7bd3148d277.png)

MIO_TOMONAGAさんのデータをみるとタワーがほとんど立ってないのに、課金アイテム１００万ポイントをきっちりと捕獲しています。
やはり、課金アイテムの優先度は高く送信されているのでしょう。


#考察
この2つのデータから、合計が50万ポイントを超えない範囲ないなら、だいたい10％から20％程度の誤差が生じる傾向があります。これは、僕の勘が言っている、最大◯分間の空白期間によるもだと予想されます。これはシステム的にどーしようもないものなので諦めてます。

次に、50万ポイントを超えるレベルになると、誤差が格段に多くなっています。
これは、運営側が、ユーザーに送る情報を絞っていることが原因だと思います。律儀に、全部の情報を与えなくても、描画で画面いっぱいの星を描くことはできるし、超人気配信者が星を投げた人を気にしているとは思えません。ログにも残りませんし。僕が運営側でもそうやって節約します。

常識的に考えて、送るべき情報の優先順位は、　課金アイテム＞コメント＞>>カウント＝星 であるため、放送開始直後の星ラッシュの時には相当情報を絞られていることが考えられます。またwebsocketの速度の限界もあるのかなぁという感じです。

また諸事情があって、情報が地球を1/4周してから取得してます。

#websocket最高データレート
代表的な方々の、イベント中の放送開始から3分間を10秒毎に区切って、その間に流れてきたデータの最大値を、放送開始時刻ごとにプロットしてみました。
ちなみに、アイコンの変化、ツイッター連携変化のパケットは捨ててます。

![hkt_rate.png](https://qiita-image-store.s3.amazonaws.com/0/180426/bcda15a4-b97f-f15e-1b8c-02e52b0779af.png)

これをみると、昼間の空いてる時間帯では最大300行/10秒程度、夜の混雑時には、250行/10秒程度が限界のようです。
常識的に考えて、夜のほうが圧倒的に視聴者が多いのだから、明らかに制限がかかっていることが読み取れます。
運営側ではないので、仕方がないことなのですが。


#まとめ

というわけで、僕が集めているデータは正確ではない場合があることが明らかになりました。
常識的に考えて優先度が低い星のデータはdropさせますよね。
僕が運営側でもそうします。
というわけで、逆に課金データについては大事にしているのではないでしょうか？
タワーに一万円払って、相手に表示されなかったらキレますよね？
僕ならキレます。
なので、課金額と課金ポイントについては正確なんじゃないかなぁという予想が立ちます。

また、イベント時ではない方々の、ロングテール部分に属する方々の放送については、かなり正確に取れてる気がします。
Unity iOS課金ビルドにはまった（EnterPriseと本番）

課金ビルドを作る時にハマった

●Unity上の設定
1:Signing TeamID にEnterPrise側のTeamIDをセット
2:Profile TypeをAutomaticにする。
3:課金用のバンドルIDをセット

ビルドしてXCodeプロジェクトを排出
XcodeのSigningで正しいProvisioningプロファイルを選択しても
Signingは通らない、KeyChainは正しく登録されている

■解決方法
Signing TeamID にEnterPrise側のTeamIDをセットしても、消してもビルド後問題なし
Profile TypeをDistributuionにする。
課金用のバンドルIDをセット

ビルドしてXCodeプロジェクトを排出

知らないだけかもしれないが
これだけで実機ビルドできた
・・・・Unity側で**Profile Type**を決定されると
XCode側で何をしてもSigning不可ですか？？？

Xcode10の問題？？
機械学習ってなんだろうと思ったのでUdemy視聴メモ（プレビューまで）


コンテナやGPUに関するサービスを考える中で、
「データサイエンティストは～」という仮説にたって話が進められることが多いです。

でも、AIとか機械学習とかディープラーニングとか、
なんとなーく概念はわかるけど・・・的な
色々なキーワードが多い。

あと、
「AIとディープラーニングって違うの？」って聞かれたときに、
そういえば、どういう風に違うのかな？と思い。


データサイエンティストの方々って、どういうことされているのかな？
これらのキーワードってひとつひとつ違うのかな？
というのをちょっとでも理解・自分でお話できるように
Udemyのデータアナリティクスの講座の無料部分を視聴してみました。

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -
https://www.udemy.com/kikagaku_blackbox_1/




無料視聴部分の視聴メモです。

##人工知能とは？
人工知能＞機械学習＞ディープラーニング

機械学習
　→数値情報をもとに判断をすること
　　入力Xと出力Yの関係性を見つけること

ディープラーニング


ディープラーニングはアルゴリズムのひとつ
　→具体的な手順

アルゴリズムの中には、SVMや単回帰分析もある


##微分について

微分は「何」が求まるのか？
　→接線の傾きが求められる(y=ax+bのa)

微分は「何」に使えるのか？
  →実際と予想の誤差をなくす

　　「傾き０」を利用することである関数が最小となる点が求まる
　　「傾き０」を求める


##単回帰分析について
回帰分析とは、関数をデータに当てはめることによって、ある変数yの変動を別の変数xの変動により説明・予測・影響関係を検討するための手法。

説明したい変数yを目的変数、それを予測するための変数xを説明変数とよぶ。


問題例：家賃の予測　（部屋の広さから家賃を予測する）
		ｙ：目的変数
		ｘ：説明変数（広さ、距離、・・・）

単回帰分析：目的変数「家賃の高さ」を、説明変数「広さ」だけで推論する。
重回帰分析：目的変数「家賃の高さ」を、複数の説明変数「広さ」「築年数」「駅からの近さ」などの様々な要素で推論する。


無料視聴は単回帰分析まで。

フェーズ１：学習
　広さ：20　→家賃：5万円
　　　：30　→　7万円
　　　：40  →　10万円
　　　：10　→　3万円

たくさん「学習済みモデル」を作る。


※機会学習をするうえで、
学習＝あらかじめデータを入れることが大切、それから規則性をみつけてフェーズ２に
※大事なのはここのデータの関係性を見つけること

フェーズ２：推論

　広さ：15→学習済みモデル→家賃：4万円　これが予測値


##環境構築について
windowsでのインストールについて
https://qiita.com/yoshizaki_kkgk/items/1057ed4dcc36ed9be7f5

AnacondaのURLは以下
https://www.anaconda.com/download/

Anacondaという、Pythonの環境構築から
Numpyとか、ある程度必要なライブラリのインストールまで一気に済ませてくれるOSSのプラットフォーム。

演習では、Anaconda内のjupyter notebookを使う

jupyter notebookは、
`Shift+Enterで改行`


##単回帰分析の演習
Numpy：数値計算のライブラリ


Numpyをインストール済みであれば
import　numpy で読み込める

今回は、
import numpy as np 　 　npという名前で読み込むのが通例らしい


パラメータa（傾き）を求めるには？

`a　の傾きは、
xyの共分散/xxの分散　
　として求めらる`

分散とは、データの散らばりの度合いを表す値。
分散を求めるには、偏差（それぞれの数値と平均値の差）を二乗し、平均を取る。



偏差とは、個々の数値と平均値との差のことです。個々のデータが平均値から偏っている程度を表している。

つまり、偏差の二乗平均が分散。

この偏差の正の平方根で、標準偏差をだす。
標準偏差は、データの散らばりの度合いを示す値。
（↑で偏差値とかも算出できる）


まずは、np.array　で　ベクトルを定義
x=np.array([1,2,3])
y=np.array([2,3.9,6.1])



データを中心化するには、

平均の算出
x.mean（）　・・・でarrayの平均を算出してくれる
y.mean（)  

中心化は全体から平均を引く

x-x.mean（平均）　で出せる

今回は変数xcを中心化の変数とする
xc=x-x.mean
yc=y-y.mean



パラメータaの計算

xx=xc*xc(中心化*中心化）
xy=xc*yc


総和を求める
xx.sum() 　・・・数値の合計をだしてくれる
xy.sum()


傾きがわかる
a=xy.sum()/xx.sum() 　



※ちなみに、この無料で視聴できる部分まででは、
単回帰分析の考え方は基礎的なことにすぎず、全然実用性はないとのこと

##戯言
「パイソン」って響きがかわいいよね、
って前々から思っていたけど、
その中で使える計算ライブラリの名前も「ナムパイ」ってめちゃかわいい！

ぱぴぷぺぽの半濁音ってかわいいよね。
プリン、ピッピ、ピカチュウ　とかね。
ONNX形式モデルをDocker/CPU上のTensorFlow Servingで予測する

## 抄訳

- ONNXはNCHW形式のデータを受け付ける
- 他方通常ビルド形式のTensorflowはNHWC形式のデータしか受け付けない
- 実際のサーバではGPUを使いたくない
- MKLを使用するとCPUでもHCHW形式の予測が可能になる
- tensorflow-serving公式のDockerfileはMKL形式でビルドしていない
- 公式Dockerfileを改造したら予測が動くようになった

## 詳細

Pytorchで訓練したモデルをONNX形式にexportしてtensorflow-servingで配信というフローがやりたかった。

公式のDocker Imageを普通にpullすると、`config=nativeopt`でビルドされたtensorflowを使用することになる為、MKLを導入するにはビルドの仕方を改造する必要がある。

公式のDockerfileからローカルでビルドを行う方法については[こちら](https://www.tensorflow.org/serving/docker#building_an_optimized_serving_binary)を参照

```shell:custom_build_procedure

# just clone public repository
git clone https://github.com/tensorflow/serving
cd serving

# edit Dockerfiles
sed -i 's#ubuntu:16.04#triage/python3.6-mkl#g' tensorflow_serving/tools/docker/Dockerfile.devel
sed -i 's#ubuntu:16.04#triage/python3.6-mkl#g' tensorflow_serving/tools/docker/Dockerfile

# build with custom options
docker build --pull -t $USER/tensorflow-serving-devel --build-arg TF_SERVING_BUILD_OPTIONS="--config=nativeopt --config=mkl" -f t
ensorflow_serving/tools/docker/Dockerfile.devel .
docker build -t $USER/tensorflow-serving --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel -f tensorflow_serving/tools/docker/Dockerfile .

# run
export MODEL_NAME="your model name"
export MODEL_DIR="where your model is"
docker run --rm -p 8501:8501 --name $MODEL_NAME --mount type=bind,source=$MODEL_DIR -e MODEL_NAME=$MODEL_NAME -t $USER/tensorflow-serving:latest
```

### 解説

基本は公式ガイダンスに従っています。

- MKL-DNNのライブラリが動作時に必要なので、ベースimageを `ubuntu:16.04` から `triage/python3.6-mkl`に変更
- ビルドオプションに`--config=mkl`を追加

あまり劇的に魔改造してるわけじゃないから、tensorflow-servingのバージョンが変わってDockerfileが編集されてもこのまま動作してくれるでしょう...
CodeSite Live Viewer をさらに使ってみた

「[CodeSite Live Viewer を使ってみた](https://qiita.com/CYonezawa/items/4e44503b7e9387fd3e75)」で基本的な使い方を書きましたが、もちっと続きを

## 前回書きそびれた話

### ログの On/Off
Enabled プロパティでログの表示をする/しないを設定できます (False を設定すると出力しません)
たとえば、TSwitch の On/Off でログの出力を操作するのであれば TSwitch の OnSwitch イベントで次のように記述します

```pascal
procedure TForm3.Switch1Switch(Sender: TObject);
begin
  CodeSite.Enabled := Switch1.IsChecked;
end;
```
![codesite05_2.gif](https://qiita-image-store.s3.amazonaws.com/0/164551/ada82c9a-46fe-5c2f-7eea-bf69bfaccc28.gif)

### SendIf メソッド
機能限定版では使用できない
条件を満たした場合のみログを表示するという便利なメソッドがあるようなんですよ奥さん

```pascal
// Height が 16 未満の時にのみ Height の値をログに出力する
  CodeSite.SendIf(Height < 16, Height);  
```

### Level 
ログの種類として Note とか Warning とかありますが、更に Level という種類があります
これは send メソッドなどで、特定の番号を指定することで設定できます
色とりどりで戦隊みたいだったり..
Send メソッドですので、オブジェクトを渡すこともできます

```pascal
procedure TForm3.Button4Click(Sender: TObject);
begin
  CodeSite.EnterMethod(Button4, 'OnClick');
  CodeSite.Send(csmLevel1, 'Level1 - Red');
  CodeSite.Send(csmLevel2, 'Level2 - Orange');
  CodeSite.Send(csmLevel3, 'Level3 - Yellow');
  CodeSite.Send(csmLevel4, 'Level4 - Green');
  CodeSite.Send(csmLevel5, 'Level5 - Blue');
  CodeSite.Send(csmLevel6, 'Level6 - Indigo');
  CodeSite.Send(csmLevel7, 'Level7 - Violet', Button4);
end;
```

このように表示されます
![codesite07.png](https://qiita-image-store.s3.amazonaws.com/0/164551/fb84c9a5-befa-dd0c-2a3e-9c59d7c8ad04.png)

### Viewer 画面を見やすくするメソッド
#### Clear
その名の通り画面をクリアにします

```pascal
  CodeSite.Clear;
```
![codesite05_1.gif](https://qiita-image-store.s3.amazonaws.com/0/164551/dc794b38-bd5b-be83-fdde-cb23052ead06.gif)

#### Separator
区切りの横線です
AddSeparator メソッドはネストした状態をキープして横線を引きます
AddResetSeparator メソッドは、ネストの状態など関係なく横線を引きます

たとえば...先程の Level のコードを少し書き直して

```pascal
procedure TForm3.Button4Click(Sender: TObject);
begin
  CodeSite.EnterMethod(Button4, 'OnClick');
    CodeSite.Send(csmLevel1, 'Level1 - Red');
    CodeSite.Send(csmLevel2, 'Level2 - Orange');
    CodeSite.Send(csmLevel3, 'Level3 - Yellow');
    CodeSite.AddSeparator;

    CodeSite.Send(csmLevel4, 'Level4 - Green');
    CodeSite.Send(csmLevel5, 'Level5 - Blue');
    CodeSite.Send(csmLevel6, 'Level6 - Indigo');
    CodeSite.Send(csmLevel7, 'Level7 - Violet', Button4);
  CodeSite.ExitMethod(Button4, 'OnClick');
  CodeSite.AddResetSeparator;
end;
```

は、Viewer で
![codesite08.png](https://qiita-image-store.s3.amazonaws.com/0/164551/075d636e-9e7a-6d5f-ab02-8a9dbab92078.png)
のように表示されます

## その他 
実は１ヶ月のアップできる画像の総容量をこえたので、この先は来月に～
とほほ...
C# virtual,overideの意味がわかる例。

virtual,overideの意味がわかる例です。
今回はコンソール。

Baseというのが基本クラス。
Inheritが継承するクラス。
それぞれメソッドでWriteLineしてどのメソッドが呼ばれたかを表示します。

```
using System;

namespace OverrideTest
{
    class Base
    {
        public virtual void Test1()
        {
            Console.WriteLine("BaseのTest1が呼ばれました");
        }
        public void Test2()
        {
            Console.WriteLine("BaseのTest2が呼ばれました");
        }
    }

    class Inherit : Base
    {
        public override void Test1()
        {
            Console.WriteLine("InheritのTest1が呼ばれました");
        }

        public new void Test2()
        {
            Console.WriteLine("InheritのTest2が呼ばれました");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Base Base = new Base();
            Base.Test1();//BaseのTest1が呼ばれました
            Base.Test2();//BaseのTest2が呼ばれました
            Console.WriteLine();//見やすいように改行

            Inherit Inherit = new Inherit();
            Inherit.Test1();//InheritのTest1が呼ばれました
            Inherit.Test2();//InheritのTest2が呼ばれました
            Console.WriteLine();//見やすいように改行

            Base Test = new Inherit();//継承元のクラスには、暗黙的に型変換できる
            Test.Test1();//InheritのTest1が呼ばれました
            Test.Test2();//BaseのTest2が呼ばれました

            Console.WriteLine("Press any key to continue");
            Console.ReadKey();
        }
    }
}
```

動作結果は以下のようなものになります。
![testform.png](https://qiita-image-store.s3.amazonaws.com/0/244460/dbc678bf-ad7b-cf72-8e24-76cbfc19e3bf.png)

さて、少し詳しくmain処理を見ていきます。

```
            Base Base = new Base();
            Base.Test1();//BaseのTest1が呼ばれました
            Base.Test2();//BaseのTest2が呼ばれました
            Console.WriteLine();//見やすいように改行

            Inherit Inherit = new Inherit();
            Inherit.Test1();//InheritのTest1が呼ばれました
            Inherit.Test2();//InheritのTest2が呼ばれました
            Console.WriteLine();//見やすいように改行
```
ここはわかりやすいと思います。
それぞれの型のTest1およびTest2メソッドが呼ばれます。


```
            Base Test = new Inherit();//継承元のクラスには、暗黙的に型変換できる
            Test.Test1();//InheritのTest1が呼ばれました
            Test.Test2();//BaseのTest2が呼ばれました
```
問題は最後のここです。
継承すると継承元のクラスには暗黙的に型変換できます。
ここでは、Inherit型でnewして、Base型の変数（Test)に暗黙的に型変換して代入しています。
さて、TestからTest1及びTest2を呼び出すとどうなるのか。

overrideで記述している場合(Test1)は、newした時の型(Inherit)のメソッドが呼ばれます。
そうでない場合(Test2)は、保存されている型(Base)のメソッドが呼ばれます。

"override"日本語で言うと、上書きです。
Baseで定義したTest1を、Inheritクラスで上書きしていることになります。

実は、このオーバーライドの動きを理解すると、オブジェクト指向の"多態性"という考えが理解できます。

例えば行列演算です。ソフトウェアはDeepLearningを行うソフトで、Test1は逆行列を計算するメソッドだったとします。

このとき、2×2くらいの小さい行列の演算を何度も行う場合と、100×100くらいの巨大な行列の演算を行う場合では、最適なアルゴリズムは違ってきます。GPUを使うかCPUを使うかでも最適なアルゴリズムは変わってくるでしょう。

例えばBaseでは小さい行列の演算に最適化されたアルゴリズムになっていて、Inheritが大きい行列に特化したアルゴリズムだとすると、オーバーライドをするだけで、DeepLearning全体の処理には変更を加えることなく、処理速度を上げることができます。
Service Worker のインストール・アクティベート処理のフローメモ

- [main] `serviceWorker.register('sw.js')` でインストールされる
- [worker] `install` イベントが発生し、インストールする Service Worker をアクティベートして良いか確認処理が行われる
  - 古い Service Worker が存在する場合、そのコントロール配下の Web ページが開かれていないか。古い Service Worker のコントロール化にある Web ページが開かれている場合、リロードしてもアクティベートされない
  - この確認処理をスキップし、強制的にアクティベートするには `e.skipWaiting()` を実行する
- [worker] `activate` イベントが発生し、インストールした Service Worker がアクティブになっても良い状態になる。このとき、対象の Web ページはコントロール配下にない
- [main] `serviceWorker.ready` が resolve される
- 通常 Service Worker をアクティベートしても、Web ページは即座にコントロール配下にならない
  - [main] 次回以降 Web ページへアクセスするとアクティベートした Service Worker が動作する
  - [worker] アクティベートした Service Worker に即座に Web ページをコントロールさせるには、 `self.clients.claim()` を実行する
- [main] Web ページをコントロールする Service Worker が存在する場合、 `serviceWorker.controller` プロパティを通して参照できる
  - このプロパティの状態変化は `controllerchange` というイベントを `navigator.serviceWorker.addEventListener()` で監視することでハンドルできる
git submoduleで複数プロジェクトから同一のmodelを参照する

#### 目的
- 複数プロジェクトから同一のmodelを参照したいため。
- 今回はBのmodelをAからも参照させたい。

#### 手順
- submod_sample_a(以下A)とsubmod_sample_b(以下B)を用意する。
- AにBをsubmoduleとして追加する
- `git submodule add git@github.com:xxxx/submod_sample_b.git submod_sample_b`
- Aで `git status` すると差分があるのでcommitする
- Bで任意のファイルを追加してcommitしてpushする
- Aで `git submodule update --remote submod_sample_b` これでfetch & merge出来る
- Aで差分をgit addしてcommitする
- developブランチを追従させるなら `git config -f .gitmodules submodule.submod_sample_b.branch develop`
- Aでサブモジュール内のディレクトリにリンクを作成する。 `ln -s ~/path/to/A/submod_sample_b/model(参照元の絶対パス) ~/path/to/A/model(参照先の絶対パス)`

#### おまけ submoduleを含めてgit cloneする方法
- `git clone --recursive https://github.com/path/project`
- `git submodule update --remote project_name`

#### 参照
[Git - サブモジュール](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
Array.prototype.filter() とか、配列操作時の３つの引数が理解できない

実際に記事として書いていきながら検証していけば、理解も深まると思ったのでやって見ます。

---

*僕の思い*
いつまでも`for`だけでやりたくない。
`filter`や`map`って書いてあるだけで、意図もわかりやすいので使いこなしたい。
**元々の配列は壊さず、新しく配列を作って返してくれる**のが嬉しい!
3つの引数？え？

---

#引数が3使えるって意味不明
それぞれがどのような役割なのかがわからないので、順番に検証して確かめていきます。

####1つ目の引数は何をしているの？

```js
const filtered = [1, 2, 3, 4, 5].filter((element, index, array) => {
    console.log(element) //1つ目の引数
    return element >= 4;
    });
console.log(filtered)//結果
```

結果

```js
1
2
3
4
5

[4, 5]
```
なるほど、元の配列の要素が１個づつ順番に吐き出されるわけですね。
結果として、4未満のものは全て削除された新しい配列が返りました


####2つ目の引数は何をしているの？
```js
const filtered = [1, 2, 3, 4, 5].filter((element, index, array) => {
    console.log(index)//2つ目の引数
    return 3 === index;
    });
console.log(filtered)//結果
```

結果

```js

0
1
2
3
4

[4]
```

なるほど、filterにかけた配列の要素は5つあるから、0~4までを順番に1つづつ当てはめてるわけですね。
結果として `[4]`となっているのは、元の配列の中の、0から数えて3番目の数字が返ったからですね。


####3つ目の引数は何をしているの？
```js
const filtered = [1, 2, 3, 4, 5].filter((element, index, array) => {
    console.log(array)//3つ目の引数
    return 3 === index;
    });
console.log(filtered)//結果
```

結果

```js
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

[4]
```
なるほど、元の配列が入っているんですね。
元の配列の要素は5つあるから、5回元の配列が吐き出されたのか。


配列を操るために必要な引数の使い方を知る事ができました。

---

React TODOリストの削除ボタンサンプル
作業を終えてデリートボタン押した時に
ボタンを押した要素のindex番号以外の要素を残して吐き出す事ができる。

```js
    onPressDelete(arg) { //押された番号を持った関数
        this.setState({
            //条件にあうものだけを抽出して再描画。
            todos: this.state.todos.filter((t, i) =>i !== arg),
        })
    }
```


間違っていたり、参考になるサイトやソース、リポジトリ等あれば教えてくださいませ！！
Pingは通るけどNASにアクセスできない事象

#事象
Windows10 端末から古めの NAS（TeraStation）に
アクセスすることができない事象が発生しました。

しかしPingは通ります。

また、社内の他の Windows10 端末では問題なくアクセスできました。

#原因
NAS の SMB バージョンが古く、
Windows10 で SMB 1.0/CIFS のチェックが外れていて、
アクセスできないらしい。

#解決策
2パターンあります。

- Windows10 の SMB 1.0/CIFSを許可する
- NASのSMBのバージョンを上げる

本来であれば、NAS のバージョンを上げるのが最善策です。
が、

- クローズド環境のため侵入される心配はないこと
- 客先の NAS なので勝手にホイホイ変更できないこと
- 客先のシステム部がめんどくさがりでやってくれないこと（☜ここ重要）

という、残念な環境であるため、
仕方なくWindows10 の設定を弄る方針をとりました。
~~（客先から借りてる端末だけど、なぜこっちは弄り放題なのか謎）~~
#手法
コントロールパネル>>プログラムと機能>>Windowsの機能の有効化または無効化

1. SMB 1.0/CIFS関連のチェックをONにする。
2. パソコンを再起動する。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/183992/ae535ff6-797b-2330-ac47-94788800c4fd.png)

#確認
無事NASにアクセス出来ました。

PowerShellを実行して「Get-SmbConnection」のコマンドを実行すると
Dialectの項目に1.5と表示されました。

古いですね。


以上
LaravelのValidatorでカスタムルールをつくる

例えばフィールドの値よりも、入力値が大きい場合はエラーをだすなど、
validatorでextendを使うとルールを拡張できる

$valueは入力値。returnでfalseになるとエラーとして返される。

```
Validator::extend('pointcheck', function($attribute, $value, $parameters, $validator){
　$user = Auth::user();
　return TotalPoint::where('user_id',$user->id)->where('give_point','>=',$value)->exists();
});

$rules = [
　'point' => 'required|integer|min:1|pointcheck',
];

$messages = [
　'point.pointcheck' => self::$messages['point.pointcheck'],
];
```
【メモ】レンダリングをブロックするCSSをどうにかする方法【暫定】

HEAD内にファーストビューで見える部分のCSSを書きつつ
閉じBODY付近に以下を。
Google先生が提案している方法なので問題ないと思う。

```html
    <noscript id="deferred-styles">
    <!-- 読み込むCSSにあわせて適宜書き換え -->
    <%= stylesheet_link_tag "jumbo/bounenkai/style" %>
    <!-- ここまで -->
    </noscript>
    <script>
      var loadDeferredStyles = function() {
        var addStylesNode = document.getElementById("deferred-styles");
        var replacement = document.createElement("div");
        replacement.innerHTML = addStylesNode.textContent;
        document.body.appendChild(replacement)
        addStylesNode.parentElement.removeChild(addStylesNode);
      };
      var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
          window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
      if (raf) raf(function() { window.setTimeout(loadDeferredStyles, 0); });
      else window.addEventListener('load', loadDeferredStyles);
    </script>
```

今後、ウェブ プラットフォームで JavaScript を用いずに 「HTML Imports」 を使用して、レンダリングをブロックすることなくスタイルシートを読み込めるようになる予定です。

とのこと
HTML5の<input type="color">でカラー選択

# 好きなカラー(色)を選ばせる
**&lt;input type="color"&gt;で選択したカラーを取得するjQueryの記述となります。**
「テンプレートコードを作成したからコピペして使ってくれ」という感じで、システム屋さん以外に渡しても、簡単に色のデザイン(カラー)の変更ができたらなと思いメモ。


```HTML
<form>
    <label>色の選択:
    <input type="color" name="color" id="color-button"></label>
    <input type="button" class="color-change" value="変更">
  </form>
```
```jQuery
$(function(){
    $('.color-change').click(function(){
      var data = $('#color-button').val();
      console.log(data);
    });
  });
```

**実行結果**
①カラーピッカで色を選択
![新しいビットマップ イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/306944/d416cf59-f4c7-abb3-4b14-99441ae12964.png)
②変更ボタンを押すと、コンソールにカラーコードが表示される
![新しいビットマップ イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/306944/203b3e58-d4a9-4a4d-f9f7-5b8ad18717cf.png)

以上