OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドラインだけでWebブラウザのバージョンを調べる

# はじめに
Webブラウザのバージョンを調べる必要があったが、Webブラウザを立ちあげる必要がありそうで面倒臭い。
そこでコマンドラインだけでWebブラウザのバージョンを調べる方法を整理した。

## 確認したOS
- Windows 10 May 2019 Update （バージョン 1903 [18362.476]]） 64bit
- macOS High Catalina

## Google Chrome
### Windows10
```
dir /B /O-N "C:\Program Files (x86)\Google\Chrome\Application" | findstr "^[0-9].*¥>
```

### Mac OSX
```
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version
```

## Mozilla Firefox
### Windows10
```
"C:\Program Files\Mozilla Firefox\firefox.exe" -v | more
```

### Mac OSX
```
/Applications/Firefox.app/Contents/MacOS/firefox-bin -v
```

## Opera
### Windows10
```
dir /B /O-N "C:\Program Files (x86)\Google\Chrome\Application" | findstr "^[0-9].*¥>"
```

### Mac OSX
```
/Applications/Opera.app/Contents/MacOS/Opera --version
```

## Safari
## Mac OSX
```
cat /Applications/Safari.app/Contents/version.plist | xmllint --xpath "//string[3]/text() |//string[4]/text()" -
```


## Microsoft Edge
### Windows10
```
reg query HKEY_CLASSES_ROOT\ActivatableClasses\Package\ | findstr "Edge_"
```

※ cmd.exeやPowerShellでもう少しうまく加工したい。。。

## Internet Explorer
### Windows10
```
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer" /v "svcVersion"
```
avrでシリアル

#概要
avrでシリアルやってみた。
attiny85でアセンブラで書いた。

#環境
avr studio 4
attiny85 1mhz
tera term
usb-serial

#回路図
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/a6ea1773-6031-62a0-6dd3-5d1c398efb97.png)


#サンプルコード
9600ボーで「U」を送る。

```
;software 232c send
.include "tn85def.inc"
.cseg
.org 	0

reset:
	rjmp	setup
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti

wait:
	clr 	r0
	ldi 	r17, 4
wait1:
	dec 	r0
	brne	wait1
	dec 	r17
	brne	wait1
	ret

wait100:
	ldi 	r17, 28
	subi	r17, 1
	brcc	PC - 1
	dec 	r18
	ret

setup:
	ldi 	r16, high(RAMEND)
	out 	SPH, r16
	ldi 	r16, low(RAMEND)
	out 	SPL, r16
	sbi 	DDRB, PB1
	sbi 	PORTB, PB1
send_loop:
	cbi		PORTB, PB1 	;start
	rcall   wait100
	sbi		PORTB, PB1	;bit0
	rcall   wait100
	cbi		PORTB, PB1	;bit1
	rcall   wait100
	sbi		PORTB, PB1	;bit2
	rcall   wait100
	cbi		PORTB, PB1	;bit3
	rcall   wait100
	sbi		PORTB, PB1	;bit4
	rcall   wait100
	cbi		PORTB, PB1	;bit5
	rcall   wait100
	sbi		PORTB, PB1	;bit6
	rcall   wait100
	cbi		PORTB, PB1	;bit7
	rcall   wait100
	cbi		PORTB, PB1	;stop
	rcall   wait100
	sbi		PORTB, PB1
	rcall   wait
	rjmp	send_loop

```

#結果
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/0cd539e4-efa4-30d1-c7f3-ebd0e3e1ca07.png)

以上。
Project Euler 38「パンデジタル倍数」

# Problem 38 「パンデジタル倍数」
192 に 1, 2, 3 を掛けてみよう.
192 × 1 = 192
192 × 2 = 384
192 × 3 = 576
積を連結することで1から9の パンデジタル数 192384576 が得られる. 192384576 を 192 と (1,2,3) の連結積と呼ぶ.
同じようにして, 9 を 1,2,3,4,5 と掛け連結することでパンデジタル数 918273645 が得られる. これは 9 と (1,2,3,4,5) との連結積である.
整数と (1,2,...,n) (n > 1) との連結積として得られる9桁のパンデジタル数の中で最大のものはいくつか?

```python
def hoge():
    digits = set('123456789')
    ans = 0
    # 上限は n * 1 が4桁、n * 2 が5桁となる範囲
    for n in range(1, 10000):
        s =''
        m = 1
        while True:
            s += str(n * m)
            # 10桁を超えた場合、または重複する数字がある場合は次へ
            if len(s) > 9 or len(s) != len(set(s)):
                break
            if set(s) == digits and int(s) > ans:
                ans = int(s)
                break
            m += 1
    return ans

print(hoge())
```
冗長というか似たような問題ばっかりですなあ。。。
Visual Studio 2017 Visual C++ による Win32 DLL の開発 (クラス編)

#はじめに
Visual C++ ではクラスの DLL も簡単に作ることができます。しかし、関数の DLL と違ってクラスの DLL にはいろいろ制約があって、複雑で大きなクラスを DLL 化するのは簡単ではないようです。

クラスをエクスポート/インポートするには dllexport 属性または dllimport 属性をクラスに与えるだけでよいようですが、下記の MSDN の記事にいろいろ制約事項が書かれています。

- [一般的な規則と制約](https://msdn.microsoft.com/ja-jp/library/twa2aw10.aspx)
- [C++ クラスでの dllimport と dllexport の使用](https://msdn.microsoft.com/ja-jp/library/81h27t8c.aspx)

次の Qiita の投稿も参考になります。

- [C++形式の動的リンク・ライブラリの書き方(msvc編)](https://qiita.com/Chironian/items/462a3bdf271d5f0b00b6)

上記の投稿にも書いてありますが、クラスの DLL は制約が多く、大きく複雑な DLL だと制約を見落としがちです。結論から言うと、そういうクラスは DLL でなくスタティックライブラリにしたほうが無難なようです。

*参照*
　* [関数のDLLについてはこちら](https://qiita.com/tadnakam/items/45fa4b471d11d9cebf41)
　* [スタティックライブラリについてはこちら](https://qiita.com/tadnakam/items/00a2a7253f7b83d90777)
　* [MFC の DLL についてはこちら](https://qiita.com/tadnakam/items/76eab89fcc32e62fac95)

#プロジェクトの作成
プロジェクトの作成ですが、特別なことは特になくて「新しいプロジェクト」ダイアログで「Windows デスクトップ」グループの中の「ダイナミックリンクライブラリ(DLL)」を選んで作成します。具体的には次の投稿を参照してください。

[Visual Studio 2017 Visual C++ による Win32 DLL の開発](https://qiita.com/tadnakam/items/45fa4b471d11d9cebf41)

これによって作成されるプロジェクトは、一般的な DLL のひな形でヘッダーファイルも含まれません。ヘッダーファイルがないと、DLL を呼び出すときに不便なのでプロジェクトに追加しておきます。

クラスの先頭に dllexport 属性が必要です。以下では「C++形式の動的リンク・ライブラリの書き方(msvc編)」に倣って、次のようなマクロを使用します。

- dllのビルド時： #define DLL_EXPORT __declspec(dllexport)
- exeのビルド時： #define DLL_EXPORT __declspec(dllimport)

##サンプル DLL のソースファイル

```C++
// ClassDLL.cpp : DLL アプリケーション用にエクスポートされる関数を定義します。
//
#define DLL_EXPORT  __declspec(dllexport)

#include "ClassDLL.h"

MyClass::MyClass() : m_Count(0)
{

}

LPCTSTR MyClass::get_Name()
{
	return NAME;
}

int MyClass::get_Count()
{
	return m_Count;
}

void MyClass::addCount()
{
	m_Count++;
}

void MyClass::clearCount()
{
	m_Count = 0;
}
```

##サンプル DLL のヘッダーファイル
この場合、stdafx.h は変更なしで構いません。

```
#pragma once

#include "stdafx.h"

class DLL_EXPORT MyClass
{
protected:
	int m_Count;

public:
	const LPCTSTR NAME = L"MyClass";

	MyClass();
	LPCTSTR get_Name();
	int get_Count();
	void addCount();
	void clearCount();
};
```

ビルドを行い、ソリューションの下の Debug (または Release) の中に DLL と LIB ファイルができていることを確認します。

#サンプルのテストプログラム
呼び出し側ではマクロ DLL_EXPORT が __declspec(dllimport) になるようにします。これにより、クラスの宣言に付いた DLL_EXPORT が dllimport になります。

また、プロジェクトのプロパティダイアログを開き、「リンカー」「入力」「追加の依存ファイル」にインポートライブラリを追加しておきます。インポートライブラリは、ソリューションの下の Debug (または Release) の中にクラスのファイル名.lib というファイル名で作成されています。

```C++
// TestClassDLL.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#define DLL_EXPORT  __declspec(dllimport)

#include "ClassDLL.h"

int main()
{
	MyClass obj;

	wprintf_s(L"%s\n", obj.get_Name());
	obj.addCount();
	obj.addCount();
	obj.addCount();
	wprintf_s(L"%d\n", obj.get_Count());
	obj.clearCount();
	wprintf_s(L"%d\n", obj.get_Count());

	getchar();
	return 0;
}
```

-
【初心者】就活のためにJavaの勉強を始めてみた話〜1ヶ月目〜


こんにちは。
地方の無名文系大学に通う2年生です。

私は就活のために1ヶ月前からプログラミングの勉強を始めました。
これから1ヶ月ごとに勉強の進捗をここで記録していこうと思います。

今回は

・私が何故プログラミングの勉強を始めたのか
・初めてプログラミングについて勉強してみて感じたこと
・Javaの勉強で躓いてしまったところ

という3つの観点から記事を書いていきます。


## 自己紹介

・教育学部2年生（この春で3年になります）
・小学校の教員になるためのコースに所属
・今年の1月下旬にJavaの勉強を始める


## 何故プログラミングの勉強を始めたのか

私は小学校教員養成コースに所属していますが、元々小学校の先生になりたいわけではありませんでした。
本当は保育士養成コースに出願する予定だったのですが、親からの説得や自身の無知などの要因により変更しました。
そのあたりの事情は書き始めるときりがないので割愛させていただきます。
そして入学後初めて知った免許取得の条件や教育現場の実情、自身が教職に不向きであるという気付きなどにより、結局私は免許を取得せずに一般企業に就職することを決めました。
そのことを決意した後、大学の就職支援センターに相談に行きました。
東京で就職したいと考えているので、そのことも踏まえて話をしました。
正直その時は、学校のパンフレットに記載されている就職率の高さから、就職もそんなに難しいものでもないだろうと考えていました。
しかし勧められるのは大学付近の企業ばかり。
今までの卒業生で東京の企業に就職した人はいなかったのか？
疑問を感じ、過去の就職状況を調べました。
そして現実を知りました。

**こんな無名大学では地方の企業にしか雇ってもらえない…！**

よく考えれば分かることでしたが、国公立の底辺な上に設立してから数年しか経っていない大学では大卒の肩書もネームバリューも無いも同然。
もう東京で就職するには今バイトをしている飲食店の東京の店舗で社員をするしかないのではとも思いました。
そんな時、ふと頭に浮かんだのが

「学歴が関係のない職場であれば働けるのでは？」

ということ。
実は、私と同い年の知り合いに高卒でプログラマーになった人がいます。
その人（以下Ａ君）が高卒でも就職できたということや、彼からプログラマーの人数はまだ不足しているという話を聞いたことを思い出し、もしかして今から勉強したら私でもなれちゃうかも？と思ったのです。
また、勉強してみて向いていないと感じたとしても、今時パソコンの知識がどこの会社でも必要だろうから無駄にはならないかなぁとも思いました。
そんな思い付き程度の考えでしたが、とりあえずＡ君に相談してみることにしました。
ちなみにその時の私（今も大して変わりません）がパソコンで出来たことといえば、検索、Wordでレポートを書くこと、メールを送ること程度で、Excelすら使いこなせるか怪しいくらいです。その上英語も苦手です。
よくプログラミングに手を出す気になったなぁと我ながら思います。

## 初めてプログラミングについて勉強してみて感じたこと

私はプログラミングの勉強をprogateを使って行っています。
Ａ君の勧めでJavaから始めており、今はprogateのJavaの学習をとりあえず一通り終わらせ、復習として2巡目に取り掛かっているところです。
2巡目に取り掛かる前にGitも一通り学習しました。
progateの説明だけでは理解できなかった部分はＡ君に教えてもらいながら理解できるよう取り組んでいます。

この1ヶ月Javaの勉強をしてみて感じたことは、プログラミングが自分が思っていたよりも面白いということです。
思い付きで始めてみたことだったので、何事も三日坊主になりがちな私ではすぐに挫折してしまうのではないかと思っていましたが、就活のためとはいえ気付けば1ヶ月も続いており驚いています。
1ヶ月前までは何の暗号かと思っていたコードも、今では簡単なものなら理解できるようになり嬉しいです。
始めてみてよかったです。
しかし「出力する」「条件分岐する」「繰り返す」など一つ一つの動作はできてもまだ開発の経験がないため、実際にアプリを作るという段階ではどのようにこれらを活用していくかの想像もつきません。
また、これらを活用することでどのようなものを作ることができるのかもよく分かっていないままです。
この1ヶ月で勉強したことをこれから活用してアプリを開発するのは楽しみですが、同時に本当に自分にできるのかという不安もあります。

## Javaの勉強で躓いてしまったところ

私がJavaの勉強で躓いてしまった主なところは

・拡張for文
・戻り値
・オブジェクト指向
・インスタンスメソッド
・インスタンスフィールド

です。

**拡張for文**


まず拡張for文ですが


```java

for(int i = 0; i < names.length; i++){
   System.out.println(names[i]);
}
``` 
と

```java
for(String name : names){
  System.out.println(name);
}
```

が何故同じ意味になるのかが初めは全く分かりませんでした。
「i++どこに消えた？」と思っていました。
「name」と「names」がそれぞれ何を指しているかもよくわかっていなかったように思います。




**戻り値**


これについてはreturnに何が入ってそれがどこに返されるのかよくわかっていませんでした。
どういった場面で使われるのかもよくわかっていませんでした。
正直戻り値とか使わずにそのまま書いたらダメなのかなぁとか思ってました。



**オブジェクト指向**


これはオブジェクト指向そのものがわからないということではなく、このタイミングで新しい用語が一気に出てきたのでこんがらがってしまい理解が難しかったです。

**インスタンスメソッドとインスタンスフィールド**

これについてもオブジェクト指向と同じような理由です。
インスタンスメソッドを定義しろという問題でインスタンスフィールドを定義してみるなどめちゃくちゃなコードを書いてエラーを連発していました。


なんとかこのあたりの内容も乗り越えてJavaのレッスンをすべて終わらせるに至りましたが、まだ不十分である自覚があるのでprogateのレッスンⅣからは特に復習に力を入れたいと思います。


## 終わりに

最後まで読んでくださってありがとうございました。
まだまだ始めたばかりでわからないところだらけですが、これからも頑張って続けていきます。
次は来月末に2ヶ月目の進捗を書きたいと思いますので、ご覧いただければ幸いです。
Pd-plupでオーディオエフェクトを作る

# Pd-plupとは？
Pd-Plupはpdパッチを読み込めるVSTプラグインで、Pure DateのパッチをVSTとしてDAWから呼び出すことができます。

Pdで作ったシンセサイザーやオーディオエフェクトなどをDAW上で使うことができるようになります。素晴らしい。

"Pd-Plup"と"Pd-Plup Fx"の2つが用意されています。

- Pd-Plup・・・　インストゥルメンツで、MIDI入力受け取ってオーディオを出力します。

- Pd-plup FX　・・・オーディオエフェクトで、オーディオ入力を受け取って、オーディオを出力します。

最大10個のパラメータをDAW側からコントロールできるみたいです。
オートメーションも対応してます。

以下のリンク先に詳しい使い方が載っています。
GitHubページ
https://github.com/logsol/Pd-Pulp/wiki

#オーディオエフェクト作り
試しにグラニュラーエフェクト的なパッチをPd-Plupから呼び出してみました。
以下の通りです。

1. [adc~]と[dac~]を用意
2. エフェクトを作る
3. コントロール可能にするパラメータを用意


メインパッチとオーディオ処理を書くサブパッチに分けて作るのがオススメです。
注意しないといけないこととは、パラメータの値は0.0-1.0ですので、[* ]オブジェクトなどを使って、Pd側で適宜リサイズしてあげる必要があるようです。

Mainパッチ
<img width="1085" alt="スクリーンショット 2017-10-18 18.13.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/152481/d4a0ff56-84d2-5a10-8020-f1ccf34696ce.png">

FXパッチ
<img width="666" alt="スクリーンショット 2017-10-18 18.15.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/152481/7e194d07-7be7-f73f-4b69-8ab906fdcdb5.png">

<img width="518" alt="スクリーンショット 2018-02-27 16.16.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/152481/76114871-4e09-6203-39af-17199a6b6e57.png">
[memo] CentOS7.4 install on VMWare

## **VMWare Install**
**VMWare Workstation Player for Windows 64-bit**
https://eng-entrance.com/linux-vmware-install

## **CentOS Install**
### **CentOS Download**
**CentOS 7.4**
http://ftp.jaist.ac.jp/pub/Linux/CentOS/7.4.1708/isos/x86_64/
CentOS-7-x86_64-DVD-1708.iso (4.2GB)

### **CentOS Install**
**VMWare Instance Setup**
![centos01.png](https://qiita-image-store.s3.amazonaws.com/0/43130/8abf7b1d-c51e-8ddd-7e9a-f6a6dfe3e7df.png)

**CentOS Install**

| カテゴリ | 項目 | 設定 |
|:--|:--|:--|
| 地域設定 | 日付と時刻 | アジア／東京 |
| | キーボード | 日本語 |
| | 言語サポート | 日本語 |
| ソフトウェア | インストールソース | ローカルメディア |
|  | ソフトウェアの選択 | サーバー（GUI使用） |
| システム | インストール先 | 自動パーティション |
| | KDUMP | 無効 |
| | ネットワークとホスト名 | ○○（ホストPCのネットワーク接続）で接続 |
| | SECURITY POLICY | プロファイル選択無し（デフォルト） |

![WS0013.JPG](https://qiita-image-store.s3.amazonaws.com/0/43130/97ab920d-3ae5-e3c1-e2af-4327c1174cf8.jpeg)

![WS0014.JPG](https://qiita-image-store.s3.amazonaws.com/0/43130/2daf4e71-417a-cc55-bb04-6ed7738082d3.jpeg)

## **CentOS Setup**
### **user add to root**
```bash
# visudo
```
```bash:visudo
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
newuser ALL=(ALL)       ALL   # added user.
```

### **ntp install**
```bash
$ sudo yum -y install ntp
$ sudo ntpdate ntp.nict.jp
$ sudo vi /etc/ntp.conf
```
```bash:/etc/ntp.conf
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
↓
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
```
```bash
$ sudo systemctl start ntpd
$ sudo systemctl enable ntpd
```

### **SELinux stop**
```bash
$ sudo vi /etc/selinux/config
```
```bash:/etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
```

### **SSH Setup**
```bash
# sudo yum -y install openssh-server
```

## **Setup others**
### **g++ install**
```bash
$ sudo yum -y install gcc-c++
```

### **git install**
```bash
$ sudo yum -y install git
```

### **history customize**
```bash:~/.bashrc
# history
HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '
HISTSIZE=1000000
# HISTIGNORE=history:ls:ll:df
```

### **alias**
```bash:~/.bashrc
# alias
alias ll='ls -al'
alias his='history'
alias hisg='his | grep'
function hisr (){ history | awk '{print $4}' | sort | uniq -c | sort -nr | head -n 20; }

alias psa='ps aux'
alias psg='psa | grep'

# alias:git
alias g='git'
alias gpu='g pull origin'
alias gfe='g fetch origin --prune'
alias gpsh='g push origin HEAD'
alias ga='g add'
alias gan='ga -n'
alias gc='g commit -m '
alias gd='g diff'
alias gst='g status'
alias gl='g log'
alias gsub='g submodule'
alias gb='g branch'
alias gba='gb -a'
alias gbr='gb -r'
alias gco='g checkout'
function gdel (){ gb -D $1; g push --delete origin $1; }
function gcp (){ gb $1; gco $1; gba; }
alias gconf='git diff --name-only --diff-filter=U'
```
Thread 1: signal SIGABRT にぶち当たるたびに対策を追記

# 出で立ち
Thread 1: signal SIGABRTにぶち当たるたびにエラー箇所が分からなくてイライラするxcode初心者が「次にThread 1: signal SIGABRTにぶち当たった時のために、エラーの対策をまとめてしまえ」と思い描き始めたもの

#事例1: outlet接続の消し忘れ
##エラーの起こるタイミング
1. outlet接続しよう！control+ドラッグ
2. 名前とか決めて接続完了！スクリプトにも書き込まれた！
3. あ、でもやっぱ名前変えたいから消そう
4. スクリプトの文だけ消す
5. 実行
6. ***Thread 1: signal SIGABRT***

##対策
###Main.storyboardの方からもoutlet接続を消す
1. 接続したUIパーツを選択して二本指でクリック
2. 黄色の警告マークの出ているoutlet接続を消す
3. ***Thread 1: signal SIGABRT 撃破***
[EC-CUBE3]新規ページ追加で404 NotFound

管理画面から新規ページ追加したら404 NotFound エラーでビックリした。

### 新規ページの作り方
管理画面＞コンテンツ管理＞ページ管理＞（画面一番下の）新規入力　より。

コンテンツ部分だけじゃなくて、他のtwig同様に全部書く必要があるので、プライバシーポリシーとかのtwigからコピペするのがおすすめ。

### 発生した問題
作ったページのURLを開こうとするとNotFound。
管理画面＞コンテンツ管理＞ページ管理＞レイアウト編集＞プレビュー　でもNotFound。（当たり前）

### 原因
URLとファイル名が同じだと発生する。
詳しくは[EC-CUBE 開発コミュニティ](https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=16821&forum=2&post_id=74117)参照。
ApacheのMultiViewsが有効な環境（さくらインターネットのデフォルト環境とか）で起きるぽい。

### 解決策
URLとファイル名を違う名前にする。
ConEmuでvimを垂直分割 (vsplit) している際に、複数行に渡る文章の表示がおかしくなる問題

# 始めに

まずは下のGif動画を見てください。

![odd_display.gif](https://qiita-image-store.s3.amazonaws.com/0/216416/00d4e890-45dc-409b-0092-12f8386e1d49.gif)

この問題に割と苦しめられていたのですが、解決方法を見つけたので書いておきます。



# 解決策

設定画面のMainのところにある、"Compress long strings to fit space"のチェックを外します。

![setting_capture.png](https://qiita-image-store.s3.amazonaws.com/0/216416/168dc9b1-c3d4-8e65-540e-35fe68ecfb44.png)



# 結果

綺麗になりました。

![settled_odd_display.gif](https://qiita-image-store.s3.amazonaws.com/0/216416/64fb901b-46d3-28ad-e82d-dde8cf72968b.gif)



# おわりに

この問題についての名前がそもそもわからず、調べ方で苦労していました。
しかし、設定をいろいろ触ってみることで解決できました。
設定は大事ですね。
~~英語が読めていればこんなことには...~~

もし何か気づいたこと、気になったことがあれば教えてください！
contentEditableへの特定文字の挿入

### chromeは１行で済む。
```js
pnt=(str)=>{document.execCommand('inserttext',false,str)}
//original https://jsfiddle.net/erikwoods/Ee3yC/
```
### 全部
```html
<style>[contentEditable]{width:22rem;min-height:4rem;background:orange}</style>
<div contentEditable="plaintext-only">ctrl+d</div>
```
```js

let time=(timestamp=Date.now())=>{
    return new Date( timestamp+ 1000*60*60*9  )
      .toISOString()
      .replace(/-/g,'/')
      .replace('T',' ')
      .slice(0,'YYYY/MM/DD hh:mm'.length);
}
,pnt=(str)=>{document.execCommand('inserttext',false,str)}
,c=document.querySelector('[contentEditable]')
;
c.onkeydown =function(ev){
  if((ev.ctrlKey||ev.metaKey) && 'D'.charCodeAt(0)===ev.keyCode){
   ev.preventDefault();
   pnt( time(Date.now()) );//pnt( 'debugggggg' )
  }
}
;
```
### 追記　余計なdiv要素など不要な場合。inserttextをinserthtmlに変えてみる。但し挙動はブラウザ依存。
```js
pnt2=(str)=>{document.execCommand('inserthtml', false,str)}
```
ALEを使ったコードチェック

# 目的

Vim上でコーディングルールのチェックをする。
今回はALEを使ってPSR-1,2に準拠しているかのチェックをおこないます。

# 環境

Custom Version 8.0.1420 (KaoriYa 20171221)
PHP 7.0.17
→ 
Custom Version 8.0.1633 (KaoriYa 20180324)
PHP 7.2.13
でも問題なく動いてます(2019.03.12追記)

# ALE(Asynchronous Lint Engine)
https://github.com/w0rp/ale

## Install

ALEをインストールします。NeoBundleを使ってます。

``` :.vimrc
NeoBundle 'w0rp/ale'
```

`:NeoBundleInstall`を実行

## Settings

``` :.vimrc

" phpcsとsyntaxチェックのみ使用する
let g:ale_linters = {
      \ 'php': ['phpcs', 'php']
      \}

" PSR-1,2のチェックをおこなう
let g:ale_php_phpcs_standard = 'PSR1,PSR2'
```

これだけで完了かんたーん！
Python3 > struct パッケージ > TypeError: a bytes-like object is required, not 'int' | bytes-like objectのリテラル定義 | unpackできた

```txt:動作環境
ideone > Python 3.5
```

とあるセンサーの測定値読取りコード(at GitHub)においてstructのpack(), unpack()を使っている例がある。

structは使ったことがないので、試用してみる。

(追記 2018/02/27)
pack()の方は使ったことがあったが、忘れていた。。。

- [line monitor > 情報表示部分 (151125) > IPアドレスを取得するpython実装](https://qiita.com/7of9/items/2224c2e12bc521f02763)


### code v0.1 > TypeError: a bytes-like object is required, not 'int'

https://ideone.com/8pf6Is

```py
import struct
 
pi = 0x3141
 
msb, lsb = struct.unpack('>HB', pi)
print(msb)
print(lsb)

```

```txt:run
Traceback (most recent call last):
  File "./prog.py", line 5, in <module>
TypeError: a bytes-like object is required, not 'int'
```

### code v0.2 > unpackできた

- little endianで
- unsigned short(H)をmsbとして
- unsigned char(B)をlsbとして
- 取得する

https://ideone.com/wxvVPs

```py
import struct

#pi = 0x3141
pi = b'\x31\x41\x59'

msb, lsb = struct.unpack('>HB', pi)
print(msb)  # 12609 (0x3141)
print(lsb)  # 89 (0x59)

```

```txt:run
12609
89
```

### link

- [7.1. struct — バイト列をパックされたバイナリデータとして解釈する](https://docs.python.jp/3/library/struct.html)
- [7.1. struct — Interpret bytes as packed binary data](https://docs.python.org/3.6/library/struct.html#module-struct)

- [[Python][Ruby] hex string (16 進文字列) のエンディアンをビッグエンディアンからリトルエンディアンに変更する](https://qiita.com/QUANON/items/e3d91a6f33536bd0de5a)
Ubuntu(Bionic)のDNS設定

ubuntu 1804のDNS設定がまた変わってたみたいで、ハマりましたのでメモ。

# DNSの設定をGoogle(8.8.8.8)に固定する方法

`/etc/systemd/resolved.conf `

```
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details

[Resolve]
DNS=8.8.8.8
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=udp

search=hoge.co.jp #searchはデフォルトでは書いてませんが、手動で書いてあげれば検索してくれるようです。（20180801追記）

```
`DNS=`がコメントアウトされてますので、上記のようにすればOK。

# 設定の適用

```
systemctl restart systemd-resolved
```

確認は下記でできる様子です。

```
systemd-resolve --status
cat /var/run/systemd/resolve/resolv.conf
```

これでできたっぽい。
さくらのメールボックスを PHPMailer で SMTP + STARTTLS で送信する時の注意点

さくらのメールボックスと思われる SMTP から PHPMailer でメールを送信する際にハマったのでメモしておきます。

# TL;DR

- さくらで STARTTLS を使うには独自ドメインではなく初期ドメインを利用します。

# ハマった内容

ある案件で以下のような SMTP 情報が共有されました。

```
サーバー名: dokuji.example.com
ポート番号: 587
ユーザー名: foo@example.com
パスワード: foobar
```

ということで早速、動作確認済みの PHPMailer の SMTP 情報を書き換えるとエラーが発生してメールが送信できませんでした。

```
Message could not be sent. Mailer Error: SMTP Error: Could not connect to SMTP host.
```

PHPMailer にはデバッグ機能があるので以下を追加してログを確認します。

```php
$mail->SMTPDebug = 2;
```

すると以下のログが表示されました。

```
2018-02-27 02:15:19 SERVER -&gt; CLIENT: 220 www***.sakura.ne.jp ESMTP Sendmail 8.14.5/8.14.5; Tue, 27 Feb 2018 11:15:16 +0900 (JST)<br>
2018-02-27 02:15:19 CLIENT -&gt; SERVER: EHLO localhost<br>
2018-02-27 02:15:19 SERVER -&gt; CLIENT: 250-www***.sakura.ne.jp Hello ***.ne.jp [*.*.*.*], pleased to meet /* 略 */<br>
2018-02-27 02:15:19 CLIENT -&gt; SERVER: STARTTLS<br>
2018-02-27 02:15:19 SERVER -&gt; CLIENT: 220 2.0.0 Ready to start TLS<br>
SMTP Error: Could not connect to SMTP host.<br>
```

STARTTLS で弾かれているような感じがしますが、対応していないというわけでもなさそうです。
一旦以下を追加して TLS を無効にします。

```php
$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;
```

これでテストすると問題なく送信ができました。


のですが、流石に平文でのメール送信はどうかと思うのでなんとか STARTTLS で送信したいところです。

Stack Overflow や PHPMailer のトラブルシューティングなど調べましたがそれっぽい情報は見つかりません。
https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

色々調べている と答えは、なんてことはなくさくらの公式ドキュメントにありました。
https://help.sakura.ad.jp/hc/ja/articles/206206021--%E3%81%95%E3%81%8F%E3%82%89%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-%E5%9F%BA%E6%9C%AC%E4%BB%95%E6%A7%98

![スクリーンショット 2018-02-27 15.13.55.png](https://qiita-image-store.s3.amazonaws.com/0/26206/f01bbda7-0c8a-e3e8-b04c-153b6d8db251.png)

> （STARTTLS）
> ※ 初期ドメインのみ

(　ﾟдﾟ)



ということで初期ドメインを指定すればいいようです。
PHPMailer のログでサーバーが初期ドメイン名を返しているのでこれをそのまま HOST へ指定すると問題なく送信できました。

```php
$mail->Host = 'www***.sakura.ne.jp';
```
WPXサーバーでMW WP Formプラグインが動かなくなる場合の対処法

# 現象
WPXサーバー上のWordpressにMW WP Formプラグインでフォームを構築
→Wordpressにログインしている状態であればフォームが動作するが、非ログイン状態では動作しない。

# 対処法
①WPXサーバーのコントロールパネルから、フォームを使用しているページをキャッシュ除外対象に設定
　　↓　それでもダメなら
②キャッシュ設定を無効化

# 原因
WPXサーバーではWordPressの表示を高速化するために、独自の「キャッシュ」機能をデフォルトで提供している。
けれど、このキャッシュ機能がMW WP Formと相性が悪い。
ログインしている状態なら動作するのは、「/wp-login、/wp-admin、/wp-comments-post」ファイルがキャッシュの対象外とされているから？

----------------------------------------------------

※参考※
確認画面、完了画面に正しく遷移しないが、ログインしている状態であれば正しく動作する。
https://plugins.2inc.org/mw-wp-form/faq/
KdV 陽解法いろいろ

# 動機

前回の記事で KdV のシミュレーションを行ったが、

- 最後らへんで発散する
- 最初、切り立ちの右側で発振する（@termoshttさんからコメント）

あたりに問題があった。

非線形波動シミュレーション
https://qiita.com/Lirimy/items/26fa11bcb5b4309752f6

![kdv.gif](https://qiita-image-store.s3.amazonaws.com/0/202534/ffd6f1f0-0e56-bfc9-8177-41b912720251.gif)

数値計算の練習もしたかったので、 KdV の陽解法を論文に忠実に、４つのスキームで実装してみた。ほぼ写経。

Shahrill, M., Chong, M.S.F & Nor, H.N.H.M.: Applying Explicit Schemes to the Korteweg-de Vries Equation, _Modern Appl. Sci._ 9(2015) 200-224.
http://ccsenet.org/journal/index.php/mas/article/view/46132
PDFが無料で読める

# 計算結果

Interactive Code
http://nbviewer.jupyter.org/github/Lirimy/simulation/blob/master/kdv_explicit.ipynb

## First Order Upwind Scheme

![firstorderupwind.png](https://qiita-image-store.s3.amazonaws.com/0/202534/d92d627e-2546-c190-1af4-e4434d71053d.png)

Figure 4.4 の再現
25.1 s

## Zabusky and Kruskal Scheme

![zabuskyandkruskal.png](https://qiita-image-store.s3.amazonaws.com/0/202534/3557352f-9824-31f2-e9a3-efe9256ca8fd.png)

Figure 4.7 の再現
19min 28s

## Lax-Wendroff Scheme

![laxwendroff.png](https://qiita-image-store.s3.amazonaws.com/0/202534/427e401b-dd4a-bc44-8619-8ae11144aeb4.png)

Figure 4.12 の再現
54.1 s

$\Delta t = 0.000005$ （論文に記載がなかった）
式 (4.18) の最後の項で係数 1/2 が抜けているので注意

## Walkley Scheme

![walkley.png](https://qiita-image-store.s3.amazonaws.com/0/202534/ad115d51-0bf2-72bd-3e0a-548d6ac2e5f8.png)

Figure 4.15 の再現
19.4 s

# 時間発展

## 波形の変化

Walkley Scheme
t=20 まで

![kdv.gif](https://qiita-image-store.s3.amazonaws.com/0/202534/94a8f8da-1ae3-be03-04ca-ccde8a8f9b4a.gif)

t=10 あたりですべての孤立波がまとまったあと、再度分裂していくところが好き

## 孤立波のピークの軌跡

![timedevelopment.png](https://qiita-image-store.s3.amazonaws.com/0/202534/0c02d852-a978-a04a-8ac6-a3a448a0bafd.png)

「非線形波動の物理」図 5.3(b) とほぼ同じ（使っているスキームは違う）
【Java】Enum（列挙）型を使わずにEnum型を表現する

#はじめに
この記事では、Enum（列挙）型と同じふるまいをするコードをEnum型を用いない形で表現します。
JavaのEnum（列挙）型は、複数の定数をひとまとめにしておく型のことです。血液型や性別、月の名前、星座、様々なコードなどの決まった定数の集まりをオブジェクト指向の考え方に基づいてコードにすることができます。加えて、便利な関数をデフォルトで使用することができます。
今回は、トランプのマーク（スペード、ハート、ダイヤ、クラブ）を例に説明します。

#Enum型を使用した場合
```Suit.java
public enum Suit {
    SPADE("♠"), HEART("♡"), DIAMOND("♢"), CLUB("♣");

    private String symbol;
    
    private Suit(String symbol){
        this.symbol = symbol;
    }
    
    public String getSymbol(){
        return symbol;
    }
}
```

#Enum型を使用しない場合
```Suit.java
public class Suit implements Comparable<Suit>{
    public static final Suit SPADE = new Suit("SPADE", "♠");
    public static final Suit HEART = new Suit("HEART", "♡");
    public static final Suit DIAMOND = new Suit("DIAMOND", "♢");
    public static final Suit CLUB = new Suit("CLUB", "♣");
    
    private static final List<Suit> VALUES =
            Collections.unmodifiableList(
                    Arrays.asList(SPADE, HEART, DIAMOND, CLUB)
            );
    private final String name;
    private final String symbol;
    
    private Suit(String name, String symbol){
        this.name = name;
        this.symbol = symbol;
    }
    
    public String getSymbol(){
        return symbol;
    }
    
    @Override
    public int compareTo(Suit t){
        return Integer.valueOf(this.ordinal()).compareTo(t.ordinal());
    }
    
    public Class<? extends Suit> getDeclaringClass(){
        return this.getClass();
    }
    
    public String name(){
        return name;
    }
    
    public int ordinal(){
        return VALUES.indexOf(this);
    }
    
    @Override
    public String toString(){
        return name();
    }
    
    public static Suit valueOf(String name){
        for(Suit value : VALUES){
            if(value.name.equals(name)) return value;
        }
        throw new IllegalArgumentException();
    }
    
    public static List<Suit> values() {
        return VALUES;
    }
}
```

#解説

*コメントをたくさんいただいたので、2018/03/06 に追記しました。*

## メンバ変数 VALUES

List 部分は、このように書かれています。

```
private static final List<Suit> VALUES =
            Collections.unmodifiableList(
                    Arrays.asList(SPADE, HEART, DIAMOND, CLUB)
            );
```

この部分は、メンバ変数 VALUES に4つのマーク（Suit）を要素とした不変リストを代入しています。それぞれの関数について解説します。

1. Collections.unmodifiableList 関数は、不変リストを戻り値とします。不変リストは、ArrayList のような可変リストと異なり、値を変更することができません。
2. Arrays.asList 関数は、引数を要素とした List を戻り値とします。この関数を介することで、List に初期値を代入することができます。今回は使用しませんが、戻り値の List の size（要素数）を増やしたり減らしたりすることはできません。この List は固定リストだからです。

※ Enum 型では、values 関数の戻り値は配列です（今回の場合は、Suit[]）。ですが、勉強のためにList 型を戻り値としています。

## コンストラクタの引数

Enum 型を使用した場合と、

```
private Suit(String symbol)
```

使用しない場合で、

```
private Suit(String name, String symbol)
```

コンストラクタの引数が異なっています。その理由は、toString 関数やvalueOf 関数で用いるメンバ変数の変数名（値はそれぞれ文字列の SPADE, HEART, DIAMOND, CLUB）を、関数を用いて取得する方法がないためです。そのため、引数を介してクラスに保持させておく必要があります。

#参考資料
[新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES) ](固定リンク: http://amzn.asia/c5WxOUh)
文系大学生が会社でプログラマーとして働くまでにやったこと

#はじめに

こんにちは。東京理科大学の経営学部に通う4年生です。

本格的にプログミングをやり始めて約半年が経ちました。現在は広告代理店でインターンをして、web広告に関するスキルを身につけつつ、新規事業に関わりながらエンジニアリングのアウトプットをしています。

*今のスキル*
html/css：たいていのコーディングは難なくできる。（ただしコードが汚い笑）
ruby：勉強しながらECサイトを制作できた。「できます！」までもう少しってところ

今回は、初心者の頃から会社のLP制作を任されるまでにhtml/cssを書けるようになるまでにやったことを書こうと思います。

## スタート
僕は、本格的にエンジニアリングを勉強した時、少しhtml/cssについては前提知識がありました。そのため、勉強になりそうなサイト、特に流行りのデザインを取り入れいるサイトを真似して制作することをやっていました。

全くの初心者の方だったら圧倒的に[Progate](https://prog-8.com/)がおすすめです。イラスト中心で初心者でもすらすらと直感理解ができる上に、実践の場もあり圧倒的なスピードでプログラミングができるようになります。

ただし、Progateのhtml/cssコースを学習し終えてから（最低2週はしましょう）が本当のスタートです。

## 第2ステップ
Progateが終わったら、次に[bootstrap](https://getbootstrap.com/)を学ぶのが良いと思います。bootstrapはTwitter社が作ったcssのフレームワークで、モバイルファーストのサイトが最速でできるようになります。

公式のリファレンスを読むだけでも十分理解できると思いますが、「bootstrap　使い方」などで調べればたくさん記事がでてくると思うので調べて勉強してみてください！

## 第3ステップ
いよいよここまできたら、既存のwebサイトを真似して書いてみましょう。google chromeの検証機能を使えばコードを確認することができるので、気になるデザインを見つけたらどんどん検証して覚えていきましょう。

## 第4ステップ
最後はオリジナルのサイトを作るのが一番です。自己紹介サイトでも良いですし、もっとも良いのはインターンなどを始めてエンジニアに囲まれた環境でコードを書き続けることだと思います。

# 最後に
さてさらっと書いてしまいましたが、僕が現在までにやったことはこんな感じだったと思います。現在はruby on railsの勉強のためにProgateとUdemyを使っています。この2つで知識を入れながら自分の作りたいと思ったWebサービスの開発をしています。
[memo] Rails5.1.5 アプリケーション新規作成・初期設定

```Rails new```を使ったアプリケーションの新規作成と、簡単な初期設定の説明。
環境：```AWS``` ```EC2``` ```Ruby2.5.0``` ```Rails5.1.5``` ```MySQL5.7.21```

## **Railsアプリケーション新規作成**
```
$ rails new sample_app -d mysql -T --skip-bundle -s
```
| 引数 ([参考](http://railsdoc.com/rails)) | 意味 |
|:--|:--|
| sample_app | アプリケーション名 |
| -d mysql | DBにはMySQLを使用  |
| -T | test::unit をインストールしない |
| --skip-bundle | 新規作成時に bundle install を行わない |
| -s | 既存ファイルはそのまま残す |


これ以降の作業は```sample_app```ディレクトリ内で行う。

```
$ cd sample_app
```

### **タイムゾーン設定**
```ruby:config/application.rb
class Application < Rails::Application
  ...

  # Timezone
  config.time_zone = 'Tokyo'
  config.active_record.default_timezone = :local
end
```

### **Gemfile修正**
````ruby:Gemfile
...

# therubyracerのコメントアウトを外す
gem 'therubyracer', platforms: :ruby

...

# tzinfo-dataをコメントアウトする
# gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

### **bundle install実行**
```
$ bundle install --path vendor/bundle
```

### **vendor/bundleをgit管理から除外**
```ruby:.gitignore
/vendor/bundle
```

## **DBセットアップ**
```ruby:config/database.yaml
default: &default
  adapter: mysql2
  host: localhost
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  username: mysql-user
  password: mysql-password
  socket: /socket/file/path/hoge.sock

...
```
| 項目 | 値 | 意味 |
|:--|:--|:--|
| adapter | mysql2 | DBはMySQL |
| host | localhost | 接続先はローカルサーバー |
| pool | <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> | コネクション数の上限値（環境変数or固定値5） |
| timeout | 5000 | 接続タイムアウト（ミリ秒） |
| encoding | utf8mb4 | 文字コード  |
| charset | utf8mb4 | 文字コード |
| collation | utf8mb4_general_ci | 文字コード  |
| username | mysql-user | DB接続ユーザー  |
| password | mysql-password | DB接続ユーザーパスワード  |
| socket | /socket/file/path/hoge.sock | sockファイルの在処 |

### **DB作成**
```
$ bundle exec rake db:create
Created database 'sample_app_development'
Created database 'sample_app_development_test'
```
IntelliJ系で突如Gitが使えなくなった時の対応

#結論

コマンドライン上では問題なく使えるGitが、IntelliJ系で使えなくなった場合は以下を参考にSSH-AgentにKeyを登録してIntelliJ系再起動あげると動くかもしれない。

```
$ eval "$(ssh-agent -s)"
Agent pid 59566

$ vi ~/.ssh/config
# add
Host *
 AddKeysToAgent yes
 UseKeychain yes
 IdentityFile ~/.ssh/id_rsa

$ ssh-add -K ~/.ssh/id_rsa
Enter passphrase for /Users/me/.ssh/id_rsa: 
Identity added: /Users/me/.ssh/id_rsa (/Users/me/.ssh/id_rsa)

# IntelliJ系再起動
```

[Adding your SSH key to the ssh-agent](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent)

# 経緯

昨日までは普通にpushやpullが出来ていたのに突然PHPStorm上でGitのリモートレポジトリを操作する系のツール達が使えなくなってしまった。

VCS > Git > Pull
`Git Pull Failed: Could not read from remote repository.`

どうしたものかとググると以下のような記事がHit
[PhpStormでgit使おうとしたらエラー](https://qiita.com/naru0504/items/a2a171a7bb56e70f8414)

ふむふむSSH executableをNativeに変更すると治るのね。
どうして突然エラー出るようになったか分からないけど何はともあれこれで治るのね。

Preferences > Version Control > Git
SSH executableをNativeに変更。

VCS > Git > Pull
`Git Pull Failed: Could not read from remote repository.`

。。。

コマンドラインからは問題なく動く。

```
$ git pull
Already up-to-date.
```

GoLandの方も試す。
`Git Pull Failed: Could not read from remote repository.`

PHPStorm固有の問題でもない。

その後ググりながら色々試す。
・Native <-> BuiltInの何度か切り替え
・Mac再起動
・PHPStormの再インストール
・MacのDNSキャッシュクリア
・GitHubのAccessToken再設定

変わらない。

絶望しながら検索してるとGitHub上の以下のページにたどりたどり着く。
[Adding your SSH key to the ssh-agent](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent)

```
If you're using macOS Sierra 10.12.2 or later, you will need to modify your ~/.ssh/config file to automatically load keys into the ssh-agent and store passphrases in your keychain.
---
macOS Sierra 10.12.2以降を使用している場合は、~/.ssh/configを変更してssh-agentにキーを自動的にロードし、パスフレーズをキーチェーンに保存する必要があります。
```

なるほど怪しい。
ということでAdding Your SSH key to the ssh-agentの項を最初から全て実行し、PHPStormを再起動する。

Preferences > Version Control > Git
出来た！

基本すぐにOSのアップデートはしていたはずなので10.12.2以降になったのは結構前だと思うんだがなぜ突如こうなったのかは今のところ分かっていない。
toISOStringから時間を整形する。

### toISOStringはブラウザによる整形誤差が少ない。
```js
new Date().toISOString()
//"2018-02-27T05:39:34.596Z"
```
### ９時間分足す。Zは世界協定時を示すので、削る。
```js
  function time(){
    return new Date(Date.now()+1000*60*60*9)
      .toISOString()
      .replace(/-/g,'/')
      .replace('T',' ')
      .slice(0,'YYYY/MM/DD hh:mm'.length)
    ;
  }
time();//"2018/02/27 14:32"
```
dockerでメモリ不足を再現

よくある「手元では動いたけどデプロイしたらメモリ不足でこけた」を手元で再現検証したかったので、
調べてみたらdockerで普通にできるみたいなので、こう。

```bash:ホスト側：メモリ4GBのところに
$ docker run --rm -it --memory 4g python:3.6.2 bash
```

```bash:コンテナ側：8GB確保して死んでしまうの図
root@c131a93a39db:/# cat <<EOD | python
> a = bytearray(8589934592)
> import time
> time.sleep(5)
> EOD
Killed
```

Docker for Mac 使ってる場合、 *Preferences* でデフォルトで2GBに制限されてるので、GUIから制限を増やしてやる必要あるので注意。
コマンドラインの `--memory` オプションで指定してもそれ以上割り当てられない。
React のエコシステムに乗っかって、普通のランディングページを作りたい

[React](https://reactjs.org/) のエコシステムはどんどん大きくなっていて、ありとあらゆるツールが React を中心に構築されている気さえする。とはいえ、そのツールの設定は前提知識が必要で、例えば Webapck や各種 Lint ツールをうまく使うためには、少し経験が必要だし、細々したツールの組み合わせでできている React の開発環境は、一見するとオーバースペックのようにも感じる。

それでも、フロントエンドを推し進めているのが JavaScript で、そのエコシステムを支えているのが [Node.js](https://nodejs.org/en/) で、一番 yarn add されているライブラリが React.js だとしたら、ブラウザのこちら側で汗をかく自分にとって、一番うまくフィットするはずだ。もっと React を使っていたい。

けど、React 全てのウェブ制作にとって最適だとは言えない。React は一般的にいって SPA = シングルページアプリケーションと呼ばれるタイプのアプリケーションを作ることに最適化されている。つまり、ページをリロードしたり遷移させたりせずに、データを Ajax 通信によって取得して、そのデータをもとにブラウザの中で JavaScript によってレンダリングする。

一番よく知られた SPA はおそらく Google Map だ。昔の地図アプリケーションは、見たい場所を移動させるたびに、リロードをしていたけれど、今はそうじゃない。環七通りをもっと先に進んで、そうだ、ここを曲がったところに住んでいたんだ。あの公園を見たい。地図の端の、さらに奥の、記憶の片隅にあるあの場所を見たい。そんなときも SPA のおかげで、ページは遷移しなくなった。とにかくそういうことに最近はなっている。それが SPA だ。

```jsx
const mySweetMemory = ({name}) => <h2>someone call my {name} as...</h2>
```

でも、全てのエンジニアが Google Map を作っているわけじゃない。ぼくもそうだ。 "普通のサイト"、 つまり会社概要がまず表示されて、サイトマップリンクがあって、問い合わせ先があって、製品写真がスライドで動いている。HTML と CSS と、少しの JavaScript が必要だ。ほんとに少しの JavaScript でいい。

それなのに、こういう仕事の時に React を使うという選択肢は、ちょっと考えられないだろうと思う。どうしたんだって言われるかもしれない。HTML と CSS だけで、ブラウザが特権的に処理してくれる HTML と CSS だけで、仕事が終わるっていうのに、なぜ JavaScript をふんだんに書かないといけないんだ。JavaScript で動的に変更する要素なんてないのに。カルーセルや、ナビゲーションメニューは、jQuery のプラグインで綺麗にやれる。

ごもっとも。

それで "普通" の開発環境を作ることにした。

```shell
yarn init -y
```

Sass は、きっとみんなも使いたいだろう。

```shell
yarn add node-sass -D
```

ES2015+ で書けるようにしたっていいはずだ。ES5 をのけ者にするわけじゃない。
一緒にやれる。

```shell
yarn add babelif...
```

でも…待てよ。

モジュールは Browserify でまとめたほうがいいのか、それとも Webpack のほうがいいのか。Webpack の方がトータルのパフォーマンスはよくなるかもしれない。でも設定で苦労するかもしれない。Webpack は、みんながみんな使い慣れているとはまだ言えない。設定を楽にするなら、Parcel もいいとは聞いたぞ。

ここは一旦保留しよう…

テンプレートエンジンは必要だろう。ヘッダーやグローバルナビゲーションなど、共通パーツをまとめるには、テンプレートエンジンが必要だ。React ならここはコンポーネントを読み込むだけでいいけれど、テンプレートエンジンを使うなら、その設定も必要だ。Gulp を入れよう。

```sh
yarn add gulp or...
```

でも待てよ、Webpack を使うとしたら、そっちにやらせた方がいいのか？いや、開発サーバーは browser-sync の方を使うことにして、 Gulp で処理した方がシンプルだ。きっとそうだ。Webpac はバンドルに専念した方がいい。

けれどこのサンプルは全部 Webpack がやっているのか。ローダーも必要？...

---

どこまでがみんなが使える技術で、どこからがやりすぎなのかは判断するのが難しい。
SurfaceShaderオプションのalpha,alpha:fadeの違いについて（＠Unity）

#はじめに
HLSLの基礎もついて来たので最近はオプションや、tagの設定など少し細かい部分に目を向けて勉強をしています.そこで今回は自分的にSurfaceShadreのalpha,alpha:fadeオプションの違いについて些細な違いではありますが、少し面白かったのでちょろっと書きたいと思います.

##実装内容
それでは実際のコードと出力をみて行きましょう.

1. alphaを指定した場合

```transparent.shade
Shader "Custom/transparent" {
	Properties {
		[HDR]_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader {
		Tags 
        { 
            "Queue" = "Transparent"
            "RenderType" = "Transparent"
        }
		LOD 200
        Cull Back

        CGPROGRAM
		#pragma surface surf Standard alpha
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		half _Glossiness;
		half _Metallic;
		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutputStandard o) {
			
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}
```
<img width="614" alt="スクリーンショット 2018-02-27 14.20.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/53fb03f9-bdd1-46c2-6ebd-1da6ba4f7410.png">

2.alpha:fadeを指定した場合

```transparent.sahder
#pragma surface surf Standard alpha:fade
```
(１行しか変えてないのでスクリプトは同じものを使っているので、スクリプト名が同じでも混乱しないでください.すみません)

<img width="621" alt="スクリーンショット 2018-02-27 14.24.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/184790/42f1940a-e420-e91e-16a2-f62a8e30ec36.png">

###解説
実際これらのmaterialを付加させたオブジェクトは見事透過しています.
これらの違いは透過している部分が実際に存在しているように見せるか見せないかの違いがあります.つまり、alphaを選択した場合は透過部分は存在しているように見え、alpha:fadeを選択した場合は存在していないようにレンダリングしてくれます.めっちゃ細かい部分のこだわりですねぇー、でもこう言った部分が楽しい気づきだったりって感じています.

##おまけ
先ほどのスクリプトのtagの部分ですが、"Queue" = "Transparent"にしないとまずいです.何故ならば、unityのソリッドモデルのレンダリングの手順としてカメラからのZ orderingを決め、その後、ポリゴンの表面がカメラの方を向いているか向いていないかの判定をしてレンダリングを行います.しかし透過させたいジオメトリまでこの工程でレンダリングしてしまうと透明の透けている本来なら見えないポリゴンの裏側がレンダリングされないことになってしまいます。。。。それではまずいということで、"Queue" = "Transparent"に設定することで最後にレンダリングされ、ブレンドされるといった工程に設定できます.
ここで、最後にレンダリングするのにZ　orderingは平気なの？という疑問が上がるかもしれないかと思うのですが、それについてはZ orderingを保管しているbuffer(Z buffer)があるのでそれを確認しつつレンダリングしているようなので平気なそうです.

他のtagなどについてはhttps://docs.unity3d.com/ja/540/Manual/SL-SubShaderTags.html

何か気になる部分などがあればコメントください、最後まで読んでいただきありがとうございます.
Windowsでlaravelとvue.jsを使ったWebアプリケーション開発環境の構築


# はじめに

今回、laravelとvue.jsを使ったwebアプリケーションの開発に携わることになりました。そこで、初心者ながらではありますが開発環境を整えてみました。
当初OSは仮想環境のCentOS7を使うつもりだったのですが、面倒だったのでWindows上でxamppを使い構築しました。知識不足の初心者なので、もっといいやり方やここはこうすればいいのでは？等アドバイスやまさかりをいただければ幸いです。

[Macの方はこちら](https://qiita.com/A_zara/items/b552b4135006dc1e69f3)

# 構築手順

<br>

- [xamppのインストール](#xamppのインストール)

- [node.jsのインストール](#nodejsのインストール)

- [composerのインストール](#composerのインストール)

- [laravelのインストール](#laravelのインストール)


## xamppのインストール

1. まずは[xampp](https://www.apachefriends.org/jp/index.html)をダウンロードする。

2. インストールソフトウェア選択画面は必要なものにチェックを入れる(わからなかったら全てチェック) 
![xampp_install.png](https://qiita-image-store.s3.amazonaws.com/0/239790/c6658d4b-63cf-7051-5c25-8e1aeb821a62.png)

<br>

## node.jsのインストール

1. [node.js](https://nodejs.org/ja/)のダウンロード。

2. インストールフォルダとコンポーネントはデフォルトでok

3. インストールしたnodeのバージョンにパスが通っているか確認する。
cmdで`node -v`を打ちバージョンを調べてインストールしたバージョンが表示されればok。
インストールしたバージョンではなくとてつもなく古い(0.12とか)バージョンが表示された場合はpathを変更する(デフォルトのインストール先は`C:\Program Files\nodejs\`)。
パスの変更方法はコントロールパネル→システム→システムの詳細設定→環境変数から変更できる。再度`node -v`を打ちバージョンが変更されていればok。


<br>

## composerのインストール

1. [composer](https://getcomposer.org/)のダウンロード

2. ガイドに沿ってインストールする。

<br>

## laravelのインストール

1. cmdでプロジェクトを作りたい場所まで移動し、`composer create-project laravel/laravel --prefer-dist hoge`を実行する(hogeはプロジェクト名なので任意の名前で)。数分かかるので待つ。

2. プロジェクトが作り終わったら`cd hoge`でプロジェクトフォルダに移動し、`php -S localhost:8000 -t public`でpublicをルートに指定する。

3. `php artisan serve`でサーバを起動する。

4. `localhost:8000`にブラウザからアクセスし下記のような画面になっていればok

![laravel.png](https://qiita-image-store.s3.amazonaws.com/0/239790/22274043-5092-4191-a203-5f79a65957a0.png)

vue.jsはlaravelに一緒に入っているのでこれで完了。

<br>

# おわりに

環境を構築するだけで1日かかりました。
やはりMacを使っている人が多いようで調べてもコマンドラインでの構築の記事が多くWindowsの記事はあまり見かけませんね。Linuxコマンドが打てないことやGUIだと不便ということもありやはりCentOSで構築したほうが良かったと思いはじめてます。

<br>
Visual Studio > aspcore2 > IE11でReact (tsx) を動作できるようにする方法



IE11でReact (tsx) を動作できるようにする方法


[Supporting Internet Explorer 11 (or older) · aspnet/JavaScriptServices Wiki](https://github.com/aspnet/JavaScriptServices/wiki/Supporting-Internet-Explorer-11-(or-older))



## React

boot.tsx の先頭に以下を追加

```js
import 'core-js/fn/promise';
```


## React+Redux

boot-client.tsx の先頭に以下を追加

```js
import 'core-js/fn/object/assign';
import 'core-js/fn/promise';
```


## 参考

[React 16 β版 – 公式ドキュメント日本語訳 | maesblog](https://mae.chab.in/archives/59852)

[Polyfill · Babel](https://babeljs.io/docs/usage/polyfill/)

[reactjs - 'Symbol' is undefined in IE after using babel - Stack Overflow](https://stackoverflow.com/questions/33828840/symbol-is-undefined-in-ie-after-using-babel)

[React app not rendering in IE11 and below · Issue #8379 · facebook/react](https://github.com/facebook/react/issues/8379#issuecomment-264858787)
CS-Cart：ウェブサイト ページのエクスポート/インポート

先日、管理者ページで作成したウェブ ページを他のCS-Cartの環境にそのまま持っていきたいと相談されました。

調べてみたところ、管理者ページの「ウェブサイト」->「ページ」から作成したページはCS-Cartのデータベースに保存されるようなので、CS-Cartの「バックアップ/リストア」を利用すればウェブ ページをそのまま他の環境に移行できそうだと思い実行してみました。

# 注意点
※ページの移行をするにあたり、下記の２点にご注意ください。
1. 移行元の環境と移行先の環境には同じバージョンのCS-Cartがインストールされている事を確認する。
2. 関連するデータベースのテーブルが全て書き換わるので前もってバックアップをとっておく。

# 関連するデータベースのテーブル一覧
データベースのスキーマと保存された値を見てみたところ、ウェブサイト ページに関連するのは以下の6つのテーブルのようです。

`cscart_pages`
管理画面の「ウェブサイト」->「ページ」で作成したページの情報が保存される。

`cscart_page_descriptions`
管理画面の「ウェブサイト」->「ページ」で作成したページのコンテンツが保存される。

`cscart_seo_names`
管理画面の「ウェブサイト」->「ページ」で作成したページのSEO情報が保存される。

`cscart_seo_redirects`
管理画面の「ウェブサイト」->「ページ」で作成したページのSEOリダイレクト情報が保存される。

`cscart_form_options`
管理画面の「ウェブサイト」->「ページ」で作成したページのフォームビルダー情報が保存される。

`cscart_form_descriptions`
管理画面の「ウェブサイト」->「ページ」で作成したページのフォームビルダーのコンテンツが保存される。

# ページ（DB）のエクスポート
1. 管理ページ（開発環境）にアクセスする。
2. 「一般設定」->「バックアップ/リストア」をクリック。
3. 画面右上の「+」ボタンをクリック。
4. 「ファイルのバックアップ」のチェックが外れている事を確認。
5. 「データをバックアップ」をチェックする。
6. 「テーブルを選択」から以下のテーブルを選ぶ：
    * cscart_form_descriptions
    * cscart_form_options
    * cscart_page_descriptions
    * cscart_pages
    * cscart_seo_names
    * cscart_seo_redirects
7. 「テーブルのスキーマ（構造）をバックアップ」をチェックする。
8. 「データをバックアップ」をチェックする。
9. 「バックアップファイル名」に任意のファイル名を入力する。
10. 「登録」ボタンをクリック。
11. 登録されたファイル名にマウスのカーソルを当てると設定ボタンが表示されるので、「ダウンロード」をクリック。

# ページ（DB）のインポート
1. 管理ページ（本番環境）にアクセスする。
2. 「一般設定」->「バックアップ/リストア」をクリック。
3. 画面右上の設定ボタンから「ファイルのアップロード」をクリック。
4. 「ローカル」から先程エクスポートしたファイルを選択し「アップロード」ボタンをクリック。
5. アップロードされたファイル名にマウスのカーソルを当てると設定ボタンが表示されるので、「リストア」をクリック。
#Quantopian Algorithm で order_value

## order_value
[order_value](https://www.quantopian.com/help#api-order-value)は，銘柄と取引額を指定して注文する関数です．

`order_value(asset, amount, style=OrderType) `
>asset: Equity/Future オブジェクト
amount: 取引額．正であればLong,負であればShort．
style: 注文方法（指定方法は[order](https://www.quantopian.com/help#api-order-value)を参照）



##アルゴリズム例 

[#Quantopian Algorithm で order](https://qiita.com/shinseitaro/items/4e88c0b05c3452a86fbc)のコードを一箇所だけ変えました．

```python
def initialize(context):
    # AAPL
    context.security = sid(24)

    # rebalance 関数を毎日クローズ一分前（15：59）に実行するように指定
    schedule_function(rebalance, 
                      date_rule=date_rules.every_day(),
                      time_rule=time_rules.market_close(minutes = 1))

def rebalance(context, data):
    # 過去5日間の平均を取得して，今日の価格よりも１％大きければLong
    # 今日価格が移動平均より小さければ，ポジションクローズする

    # 過去5日間のヒストリカルデータを取得．
    # 【注意】https://www.quantopian.com/help#ide-history に説明があるとおり，
    # 日中にヒストリカルデータを複数日分取得すると，
    # 「過去4日分と今現在の価格」が取得できます．現在価格はhistorical data 同様，アジャストされた価格です．
    price_history = data.history(
        context.security,
        fields='price',
        bar_count=5,
        frequency='1d'
    )
    # price_historyを出力
    # log.info(price_history)

    # 平均値
    average_price = price_history.mean()
        
    # 現在の価格
    current_price = data.current(context.security, 'price') 
    # log.info(current_price)
    
    # 注文しようとしている銘柄が，現在上場されているか確認
    if data.can_trade(context.security):
        # 平均値より，１％大きければ，Long
        if current_price > (1.01 * average_price):
            # 成り行きで10株買う
            order_value(context.security, 1000) # ←変更箇所
            log.info("Buying %s" % (context.security.symbol))
        # 平均値より小さければ，ポジションをクローズ    
        elif current_price < average_price:
            # 0と注文することでポジションを精算することになる
            order_target(context.security, 0)
            log.info("Selling %s" % (context.security.symbol))
    
    # 平均値と現在価格を描画
    record(current_price=current_price, average_price=average_price)
```


##メモ

このアルゴリズムは，**条件にあえば1000ドル分買い足して行く**というアルゴリズムです．1000ドル分とは，1000ドルを超えないオーダーという意味になります．例えば，AAPLが105ドルであれば，9株注文してくれます．株数を確認したい場合は，`run full backtest` を実行した後，Transaction Detailsを見ると確認できます．

（株価に合わせて，よしなに5株買ったり6株買ったりしている↓）

![Screenshot from 2018-02-27 14-22-04.png](https://qiita-image-store.s3.amazonaws.com/0/14019/0e7b9d7a-7d6d-43d0-47d0-def14ed4bee0.png)


気が向いた時に，アルゴリズムの注文方法を少しずつ書いていこうと思います．
次は[order_percent](https://www.quantopian.com/help#api-order-percent "order_percent")です．

##他のオーダー方法

[#Quantopian Algorithm で order](https://qiita.com/shinseitaro/items/4e88c0b05c3452a86fbc "#Quantopian Algorithm で order - Qiita")
[#Quantopian Algorithm で order_percent](https://qiita.com/shinseitaro/items/943cfafe00dd3841a79e "#Quantopian Algorithm で order_percent - Qiita")
[#Quantopian Algorithm で order_target](https://qiita.com/shinseitaro/items/f1ea0245bba1e7ccc82d "#Quantopian Algorithm で order_target - Qiita")
[#Quantopian Algorithm で order_target_value](https://qiita.com/shinseitaro/items/7f9b45ab6fd5149e7a1e "#Quantopian Algorithm で order_target_value - Qiita")
Raspberry Pi | I2C > bug > clock stretching bug | sudo modprobe i2c-bcm2708 baudrate=400000で100000になる

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
I2C接続のとあるセンサー
```

### 関連

- [Raspberry Pi | I2C > I2Cセンサーの接続確認まで > 使用品 | 配線 | i2cdetect | link:Rasberry PIのI2Cコマンド詳解](https://qiita.com/7of9/items/c693244b65ecaf82c9f5)

### bug

I2Cのセンサーへコマンドの書込みはできるが、データ取得に成功していない。

調べているうちに以下の情報を見つけた。
https://www.richud.com/wiki/Rasberry_Pi_I2C_EEPROM_Program
> Generally use the lowest you can to mitigate the clock stretching bug, if your device supports clock stretching. (these eeproms dont)

以下の対応方法も見つけた。
http://gaje.jp/2015/01/03/3051/
> In order to workaround this, I set data rate in I2C slave module higher.  The communication rate is 400 kbps, but I set the data rate 1000 kbps.  It worked for me.  Here is the setup of I2C slave module.

### modprobeコマンドでの設定

```bash
$ sudo modprobe -r i2c-bcm2708
$ sudo modprobe i2c-bcm2708 baudrate=400000
```

```bash
$ dmesg
...
[ 1591.469283] bcm2708_i2c 3f804000.i2c: BSC1 Controller at 0x3f804000 (irq 79) (baudrate 100000)
```

modprobeで`baudrate=400000`としてもdmsgで表示されるのは`baudrate 100000`。


### Pythonコードで動作確認

対象センサーのPython実装コードをGitHubで見つけた。
そのコードで動作確認できた。

ハードウェアとしては問題はないということだろう。

baudrateを100kHzにしても400kHzにしても測定値を取得できた。
ffmpeg 連番静止画像➡︎動画


カレントディレクトリに
`test0000.png`,`test0001.png`,`test0002.png`,...
のような`test`+4桁の整数で表される連番静止画像からtest.mpegという動画を作る場合、

```bash:
ffmpeg -r 20 -i "./test%04d.png" -vcodec mpeg1video -qscale 1 test.mpeg
```

* %04d は右詰めの4桁の整数で、空いている部分には0を入れる。
* -r <rate> フレームレートを指定
* -i <filename> 入力ファイルのパスを指定
* -vcodec <codec> 映像コーデックを指定
* -qscale <n> nは1(非常に高品質)から31(最悪の品質)。http://fixedpoint.jp/ffmpeg/ffmpeg-doc.html
開発をするのにWindowsとMacどっちがいいのか問題を考えてみる

プログラマーとかSEが開発をするのにWindowsとMac OSXどっちがいいのかという問題を考えたいと思う。

経営/SIer?目線だと多分Windowsが割とデファクトになっていて、なぜかというと単純に

- 端末あたりの導入コストが少ない
- セキュリティ周りとかサポート周りをマイクロソフトがやってくれそう
- 必要なソフトウェアやミドルウェア、開発環境がもうすでにWindows仕様に集まっている
- そもそも使用するクライアントとか、商品を提供する側がWindows使っているから

それに比してMacは、

- Unix-like(Unix-y)である
- すなわちPOSIXスタンダードに則っている
- ユーザーの自由をある程度尊重してくれる
- ターミナル周りがMS-DOSに比べるとマシ
- ターミナルから道具とかをインストールできる(brewとか)

だと思う。

個人的に6年？ほど開発をしていて、Windows系の端末を使っていて思ったのは、
ターミナル周りがちょっと汚いかなと思う。重箱の隅を突くようなことだけど、
バックスラッシュ(`¥`とか`\`)がパスのセパレーターであること、
ドライブの定義は`C:`、とかそういうのがまず使いづらい。
`cygwin`を入れる方法もあるし専用のアプリもあるけど、
そういうのがネイティヴに備わっていないというところでテンションが下がる。

また、そのOSのあり方として、デスクトップありきだなというようにも感じる。
LinuxとかはデスクトップにおいてWindowsに負けたのかもしれないが、
そもそも開発者にデスクトップなんているのだろうか。
（画像、映像、音を扱う場合は別として）

デスクトップベースの開発だとそういうのを自動化したり短縮したりという習慣もつきづらい。
基本はターミナルから目が離れない、というのが開発としては一番スマートだと思うし、
Linus Torvaldsが（あの人はよくメディアに露出しているので）使っているデスクトップの使い方はそんな風だった。

そういった動機は、例えばemacsに顕著に表れているし、
vimもそのような考え方の延長上にある。どちらの操作を覚えることも、決して難しいことではない。

ここまでのことで何を言いたいかというと、WindowsとMacを比較すると、
どちらかというと後者の方がデスクトップ非依存で開発が可能である。

また、POSIXのスタンダードというのはとってもありがたい。
`/usr` ディレクトリの配下とか `Mac` と `CentOS` と `Debian` と `FreeBSD` で、僕の記憶が間違っていなければ特に差分があるとは思えない。
（権限のつきかたとかは違うだろうけど）

自分の作ったスクリプトとかツールのインストールとかさせるとき.... 例えばUnix-yなOSなら

```
/usr/local/bin/moomin
/usr/local/lib/moomin/utility.rb
/usr/local/lib/moomin/dsl.rb
/usr/local/etc/moomin/config
```
こんな感じで、`/usr/local` 配下の `bin` に実行ファイルを、
 `lib`に参照されるライブラリを、
 `etc`にライブラリではないもの（設定ファイルとか）を配置させる.... 
ということができる。

Windowsはこの辺りがごちゃっとしてて考えるのもめんどくさい。（個人的に）

そして、`apt-get`とかと同様、 `brew`みたいなのがあるのも非常に楽だと思う。

例えば、チーム全体で特定の環境開発の設定をしてみんな同じにしたい場合、

Windowsでよくある指示の仕方

```
1. エクセルの手順書を開く
2. エクセルの特定のタブに、画像付きで手順書があるのでそれを一個一個手動でやっていく
3. また別のエクセルの手順書を開く
4. エクセルの特定のタブの手順書を一個一個手動でやっていく
5. また何かあったら、対面できく
6. おしまい
```

みたいなことをやる。これがMacだったら（厳密にいったらUnix-yだったら)

```
1. スクリプト配る
2. みんなそいつを `./`で実行
3. おしまい
```
なので、普通に生産性に直結する問題かな、と感じる。

（そして、それはそうだと理想としていいよね、とかベターだよね、
じゃなくて、そうじゃないと「きつい」という問題として）

あと、Macの導入がどうしてもコスト的にきついんだったら ThinkPadとかで調達して中にLinuxぶっ込めばいいんじゃないかと。（下手したらそっちの方が一番安い）

などなど、まとまりのないことを書いてしまったけれど、今回はここまでで。

ありがとうございました。
ActiveModel::Errors の存在しないアイテムに添字アクセスすると空配列を作り出す

TL;DR
====

- `ActiveModel::Errors` のインスタンスは存在しないアイテムに添字アクセスすると空配列を作り出す。
- `model.errors` に値があるか調べるときは　`model.errors[:hoge].present?` とか使うのやめて `model.errors.include? :hoge` を使う。

原因
====

[`ActiveModel::Errors#initialize`](https://github.com/rails/rails/blob/0951306ca5edbaec10edf3440d5ba11062a4f2e5/activemodel/lib/active_model/errors.rb#L72)で、[`Hash#default_proc`](https://docs.ruby-lang.org/ja/latest/method/Hash/i/default_proc.html) を[設定して](https://github.com/rails/rails/blob/0951306ca5edbaec10edf3440d5ba11062a4f2e5/activemodel/lib/active_model/errors.rb#L459)どんなアクセスされても大丈夫なようにしてる。
例
==

```ruby
m = SomeModel.new

m.valid? #=> true
m.errors.keys #=> []
m.errors.include? :hoge #=> false

# []でアクセスしてみる
m.errors[:hoge].present? #=> false
m.errors[:hoge].is_a? Array #=> true


m.errors.keys #=> [:hoge]
```

参考ページ
========

- [ActiveModel::Errors](https://github.com/rails/rails/blob/0951306ca5edbaec10edf3440d5ba11062a4f2e5/activemodel/lib/active_model/errors.rb)
- [Hash#default_proc](https://docs.ruby-lang.org/ja/latest/method/Hash/i/default_proc.html)