OmniAICreator/Qiita-1.07M huggingface dataset:
phpの実行開始が遅い場合の対処

```
php -v
```

```
php -n -v // -nはiniファイルを読まないオプション
```


この２つの実行で体感で分かるぐらい速度差がある時は特定のPHP拡張の初期化が原因です。[liipのPHP](https://php-osx.liip.ch/) v7.1.7とMacOS Sierraで問題があり1秒ぐらいかかってました。

iniファイルで読まれてるPHP拡張を外して確かめました。

```
php --ini
```

```
Configuration File (php.ini) Path: /usr/local/php5/lib
Loaded Configuration File:         /usr/local/php5/lib/php.ini
Scan for additional .ini files in: /usr/local/php5/php.d
Additional .ini files parsed:      /usr/local/php5/php.d/10-extension_dir.ini,
/usr/local/php5/php.d/20-extension-opcache.ini,
/usr/local/php5/php.d/40-curl.ini,
/usr/local/php5/php.d/40-openssl.ini,
/usr/local/php5/php.d/50-extension-apcu.ini,
/usr/local/php5/php.d/50-extension-curl.ini,
/usr/local/php5/php.d/50-extension-gmp.ini,
/usr/local/php5/php.d/50-extension-igbinary.ini,
/usr/local/php5/php.d/50-extension-imap.ini,
/usr/local/php5/php.d/50-extension-intl.ini,
/usr/local/php5/php.d/50-extension-mcrypt.ini,
/usr/local/php5/php.d/50-extension-memcached.ini,
/usr/local/php5/php.d/50-extension-mongodb.ini,
/usr/local/php5/php.d/50-extension-mssql.ini,
/usr/local/php5/php.d/50-extension-pdo_pgsql.ini,
/usr/local/php5/php.d/50-extension-pgsql.ini,
/usr/local/php5/php.d/50-extension-propro.ini,
/usr/local/php5/php.d/50-extension-raphf.ini,
/usr/local/php5/php.d/50-extension-readline.ini,
/usr/local/php5/php.d/50-extension-redis.ini,
/usr/local/php5/php.d/50-extension-solr.ini,
/usr/local/php5/php.d/50-extension-ssh2.ini,
/usr/local/php5/php.d/50-extension-xdebug.ini,
/usr/local/php5/php.d/50-extension-xsl.ini,
/usr/local/php5/php.d/60-extension-pecl_http.ini,
/usr/local/php5/php.d/99-liip-developer.ini
```

すると`50-extension-imap.ini`の

```
extension=imap.so
```

が問題でコンソールを見ると実行するたびにエラーが出ていました。

<img width="426" alt="スクリーンショット 2017-09-02 12.03.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/3940/69cd0349-d8b6-f615-d997-35552a97e2b9.png">
<img width="262" alt="スクリーンショット 2017-09-02 12.20.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/3940/fb01bd1f-03ae-5c58-c69a-06c6379e474f.png">
https://discussions.apple.com/thread/7705551?start=0&tstart=0
多くの人が疑問に思ってるようですがサポートを見ても原因がはっきりしません。


```
;extension=imap.so
```
外して対処すると`-n`付きと変わらない速度になりました。
TensorFlowでkeras その3

#概要
TnsorFlowでkerasやってみた。
学習済みVGG16を使ってみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード


```
import numpy as np 
import os.path
from tensorflow.contrib.keras.python.keras.preprocessing import image
from tensorflow.contrib.keras.python.keras.applications.vgg16 import VGG16
from tensorflow.contrib.keras.python.keras.applications.vgg16 import preprocess_input
from tensorflow.contrib.keras.python.keras.applications.vgg16 import decode_predictions


img_path = os.path.join('./', 'p1m.jpg')
img = image.load_img(img_path, target_size = (224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis = 0)
x = preprocess_input(x)

model = VGG16(weights = 'imagenet', include_top = True)
features = model.predict(x)
results = decode_predictions(features, top = 5)[0]
for result in results:
	print (result)



```
RubyMineでフォントサイズを変更するためのショートカットキー

## はじめに

RubyMineのフォントサイズを変更する場合は、「RubyMine -> Preferences -> Font」で変更ができます。
しかし、いちいち設定画面を開くのが面倒なのでショートカットキーを利用したいと思うのですが、どうやらRubyMineにはデフォルトでフォントサイズ変更のショートカットキーが存在していないみたいです。
**今回はRubyMineでフォントサイズを変更するためのショートカットの作成方法について説明をします。**
例としてフォントサイズを小さくするショートカットの作成方法を説明をします。

## ショートカット対象の検索

まず、「RubyMine -> Preferences -> Keymap」 を開き、そこの検索画面で「Decrease Font Size」と打ちます。


## ショートカット作成

選択すると「Add Keyboard Shortcut」という項目が出てくるので、そこで自分が利用したいショートカットのコマンドを打ちます。

![スクリーンショット 2017-09-02 11.16.46.png](https://qiita-image-store.s3.amazonaws.com/0/140792/04bc9d96-ccdf-cde4-5b76-1507fa280d26.png)


もし作成しようとするショートカットコマンドが他で既に使われている場合は警告が出てきます。
今回は「Command, -」をショートカットにしようとしたのですがCollapse(ソースコードの括弧の部分を閉じる)のショートカットと被っていたため警告が出ました。
![スクリーンショット 2017-09-02 11.17.26.png](https://qiita-image-store.s3.amazonaws.com/0/140792/790eb3e0-aed8-dcaa-2395-77f7d6ae9c45.png)


特に既存のショートカットが使えなくても問題ないようなら「Remove」を選択してショートカット作成を終了します。

![スクリーンショット 2017-09-02 11.17.32.png](https://qiita-image-store.s3.amazonaws.com/0/140792/d05e00c6-eaab-edd8-4ff4-7bb9053eea01.png)


## 終わりに

以上でフォントサイズのショートカット作成は終了です。
**フォントサイズを大きくする場合は「Decrease Font Size」の部分を「Increase Font Size」に変えて読んでください。**
これで、わざわざ設定画面を開かなくてもフォントサイズを変更することができるようになります。
**フォントサイズ変更に限らず、新しいショートカットを作成する場合は上記の手順で行えるので参考にしていただければと思います。**

ただ**今回の問題点として、ショートカットだと全体のフォントサイズが変更になるのではなく、フォーカスの当たっているファイルのフォントサイズしか変更されない**という点があります。
また、Macのピンチイン・アウトでフォントサイズが変更できればそもそもショートカットを作る必要がなかったと思うのですが自分の環境だとトラックパッドの動きがRubyMineにうまく反応しなかったです。
この辺りについて何かご存知の方がいらっしゃいましたら教えていただけたらありがたいです。
[Mac] 形態素解析エンジンMeCab をpython3 で使えるようにする


形態素解析エンジン MeCab (和布蕪)のインストール方法（2017年9月）

```bash
$ brew install mecab mecab-ipadic;
$ pip3 install mecab-python3;
```

これで使えるようになるはずです。

試しに[piruty_joyさんの記事](http://qiita.com/piruty_joy/items/5ae2c2ba660796112207)の例を使ってみます。

```bash
$ python3
```
```python3
Python 3.6.2 (default, Sep  2 2017, 11:36:05) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> mecab = MeCab.Tagger("-Ochasen")
>>> print(mecab.parse("今日はいい天気ですね。"))
今日	キョウ	今日	名詞-副詞可能		
は	ハ	は	助詞-係助詞		
いい	イイ	いい	形容詞-自立	形容詞・イイ	基本形
天気	テンキ	天気	名詞-一般		
です	デス	です	助動詞	特殊・デス	基本形
ね	ネ	ね	助詞-終助詞		
。	。	。	記号-句点		
```

問題なさそうですね。
TensorFlowでkeras その2


#概要
TnsorFlowでkerasやってみた。
xorを学習してみた。
save,loadしてみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード


```
import numpy as np 
from tensorflow.contrib.keras.python.keras.models import Sequential, model_from_json
from tensorflow.contrib.keras.python.keras.layers.core import Dense, Activation
from tensorflow.contrib.keras.python.keras.optimizers import SGD
import os.path

X = np.array([[0, 0], [0, 1.0], [1.0, 0], [1.0, 1.0]])
y = np.array([[1.0], [0], [0], [1.0]])

model = Sequential()
model.add(Dense(8, input_dim = 2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
sgd = SGD(lr = 0.1)
model.compile(loss = 'binary_crossentropy', optimizer = sgd)
model.fit(X, y, batch_size = 1, epochs = 300)
model.summary();
print (model.predict_proba(X))

print ('save model')
json_string = model.to_json()
open(os.path.join('./', 'xor_model.json'), 'w').write(json_string)
yaml_string = model.to_yaml()
open(os.path.join('./', 'xor_model.yaml'), 'w').write(yaml_string)
print ('save weights')
model.save_weights(os.path.join('./', 'xor_model.h5'))

model1 = model_from_json(open(os.path.join('./', 'xor_model.json')).read())
model1.load_weights(os.path.join('./', 'xor_model.h5'))
model1.summary();
model1.compile(loss = 'binary_crossentropy', optimizer = 'sgd')
score = model1.evaluate(X, y, verbose = 0)
print (score)
print (model1.predict_proba(X))

```
TensorFlowでkeras

#概要
TnsorFlowでkerasやってみた。
sinを学習してみた。

#写真


![keras10.png](https://qiita-image-store.s3.amazonaws.com/0/18104/51f3dd6b-163c-f783-e555-ca782bb617eb.png)


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#サンプルコード

```
import numpy as np 
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers.core import Dense, Activation
from tensorflow.contrib.keras.python.keras.optimizers import SGD
import matplotlib.pyplot as plt

x = np.arange(200).reshape(-1, 1) / 30
y = np.sin(x)

model = Sequential()
model.add(Dense(30, input_shape = (1, )))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('sigmoid'))
model.add(Dense(1))
sgd = SGD(lr = 0.1)
model.compile(loss = 'mean_squared_error', optimizer = sgd)
model.summary();
model.fit(x, y, epochs = 400, batch_size = 10, verbose = 0)

predictions = model.predict(x)
print (np.mean(np.square(predictions - y)))
preds = model.predict(x)
plt.plot(x, y, 'b', x, preds, 'r--')
plt.savefig("keras10.png")
plt.show()


```
chromy でフルサイズのスクリーンショットをとる。Headless Chrome

headless chrome でフルサイズ（縦に長いページ）のキャプチャをとりたかっただけなのですが。いろいろライブラリを試したのですが、うまくいかず。離れた島にいる @tkhr に聞いたら [chromy](https://github.com/OnetapInc/chromy) がいいらしいよとのことで試してみたら、確かにとても簡単でした。よかったです。

```bash
yarn add chromy
```

```js:sample.js
const Chromy = require('chromy')
const fs = require('fs')

async function main() {

  let chromy = new Chromy()

  try {
    await chromy.goto('http://todays-quiz.com')
    const png = await chromy.screenshotDocument()
    fs.writeFileSync('out.png', png)
    await chromy.close()
  } catch(e) {
    console.log(e);
    chromy.close()
  }

}

main()
```

```bash
$ node sample.js
```

上のコードは公式サンプルを `async` `await` で書いたものになります。
公式サンプルは[こちら](https://github.com/OnetapInc/chromy/blob/for-chrome61/examples/screenshot.js)。



以上です。ありがとうございました。 🍊

**追記:** ちょっとわからないところ
`http://google.com` とかを対象ページにすると、横幅が想定以上に短くなってしまいます。

![out_doc_await.png](https://qiita-image-store.s3.amazonaws.com/0/45822/239e2f88-8dec-3ede-d72e-382d7ffd136b.png)

右側が切れているように見えます。この辺は調べてないので、まだわかっていません。 😮
【iOS】UINavigationControllerにViewをaddSubviewしてアプリ全体で表示し続ける方法

アプリのトップにViewを表示し続ける方法は、UIApplicationからwindowを取得してaddSubviewすると表示できますが、

```swift
UIApplication.shared.keyWindow?.addSubview(view)
```

UINavigationControllerやUITabBarControllerを使っている場合は、それらのsubviewにすることで表示し続けることもできます。

```swift
let view = UIView.init(frame: CGRect(x: 0, y: UIScreen.main.bounds.size.height - 50.0, width: UIScreen.main.bounds.size.width, height: 50.0))
view.backgroundColor = UIColor.yellow

self.navigationController?.view.addSubview(view)
```

<img width="375" alt="navigationAddsubview.png" src="https://qiita-image-store.s3.amazonaws.com/0/194104/7891f290-e4df-b1be-aa1c-99c175c58960.png">

しかし、これだと追加したViewの下に本来表示されるViewが隠れてしまうことになります。

そこで、UINavigationControllerを継承したクラスを作り、ViewをaddSubviewしたタイミングで、**self.navigationController?.view.setNeedsLayout()**を呼び出して、viewDidLayoutSubviewsで元々のviewのサイズを再設定します。

```swift:NavigationController
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    for subview in self.view.subviews {
        if subview.isKind(of: NSClassFromString("UINavigationTransitionView")!) {
            subview.frame.size.height = UIScreen.main.bounds.height - 50.0
        }
    }
}
```

<img width="375" alt="navigationSizeChange.png" src="https://qiita-image-store.s3.amazonaws.com/0/194104/1d04f851-5455-3512-717d-41deaf4ceb45.png">

これで無事にサイズ変更ができました。

また、追加するViewをViewControllerで管理したい場合は、コンテナ機能を使ってchaildViewControllerに設定することができます。

```swift
self.navigationController?.addChildViewController(viewController)
self.navigationController?.view.addSubview(viewController.view)
self.navigationController?.didMove(toParentViewController: self)
```
Matplotlib > 凹凸の激しい形状の可視化 > Link @ stackoverflow

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

Chebyshev粒子のような凹凸の激しい形状を画像化したい。

以下を見つけた。
https://stackoverflow.com/questions/30497737/applying-colormaps-to-custom-axis-in-matplotlib-3d-surface

自分の環境で実行してみた。

```py:meshgrid_170902.ipynb
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

X = np.linspace(-np.pi, np.pi, 200, endpoint=True)
Y = np.linspace(-np.pi, np.pi, 200, endpoint=True)
XX, YY = np.meshgrid(X,Y)
Z = np.cos(XX)*np.cos(YY)

fig = plt.figure()
ax1 = plt.subplot2grid((1,2), (0,0), projection='3d')
ax2 = plt.subplot2grid((1,2), (0,1), projection='3d')
surf = ax1.plot_surface(XX, YY, Z,
                        cmap=plt.cm.Set2)
surf2 = ax2.plot_surface(XX, YY, Z, shade=False,
                         facecolors=plt.cm.Set2((XX-XX.min())/(XX.max()-XX.min()))
                         )
plt.draw()
lines = np.array(surf2.get_edgecolor())
surf2.set_edgecolor(lines*np.array([0,0,0,0])+1) # make lines white, and keep alpha==1. It's an array of colors like this: [r,g,b,alpha]

plt.show()

```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d50836e5-2b49-1d38-b120-466192e59c2a.png)

リンク元の画像と感じが違う。


### TODO

(x, y, z)で与えられたリストからmeshgridを作る処理が必要になる。
[Swift]ReadLine()のエラーハンドリングと他Datatypeへの変換方法

プログラム問題を解いている時に、いろいろ気づいたことをメモリます。
コマンドラインでInputを読み込む時のエラーハンドリングや、キャストが意外と面倒だったので（そして忘れる）、メモで残すことにしました。


## ReadLineからString以外のデータタイプに変換する方法

ReadLineは**何を入力してもStringとして扱われる**ので、後で変換したりしないといけないです。例ではStringからDoubleに変換する方法を載せていますが、
StringからInt
StringからFloat
等、どれでもいけます。

### 方法１：最初に変数を定義しておいて、Inputをキャストする

```.swift
    
    var meal:Double!
    var tip:Double!
    var tax:Double!
    
    let mealCost = readLine()
    let tipPercent = readLine()
    let taxPercent = readLine()
    
    meal = Double(mealCost!)
    tip = Double(tipPercent!)
    tax = Double(taxPercent!)
 
    tip = tip * (meal / 100)
    tax = meal * (tax / 100)
    
    var totalCost = Double(meal) + Double(tip) + Double(tax)
```

### 方法２:最初にInputを読み込んで置いて、あとでUnwrapする

```.swift
    let mealCost = readLine()
    let tipPercent = readLine()
    let taxPercent = readLine()
    
    guard let convertMeal = Double(mealCost!) else{
        return
    }
    
    guard let convertTip = Double(tipPercent!) else {
        return
    }
    
    guard let convertTax = Double(taxPercent!) else {
        return
    }
    
    let tip = convertMeal * (convertTip / 100)
    let tax = convertMeal * (convertTax / 100)

    let totalCost = convertMeal + tip + tax
    
    print("The total meal cost is \(Int(totalCost.rounded())) dollars.")
```

### 方法３：一番短い

```
let numStrings = Int(readLine()!)!
```


## 実行結果

```.swift
12.0 // mealCost = readLine()
4 // tipPercent = readLine()
5 // taxPercent = readLine()
The total meal cost is 13 dollars.
```

## ReadLineのエラーハンドリング

下記のサンプルコードでは、InputのデータタイプがIntでなければ、永遠にInputを要求し続けます。

```.swift
        
var isInputCorrect = false

while !isInputCorrect{
      print("Input number of computers")
            
      if let num = readLine(){
            if let convertNum = Int(num){
                 print("right input!")
                 isInputCorrect = true
            } else{
                 print("wrong input, try again")
                 isInputCorrect = false
            }
      }
}
```

実行結果

```
Input number of computers // 一回目：アルファベットを入力
f
wrong input, try again
Input number of computers　// 二回目： Doubleを入力
4.66
wrong input, try again
Input number of computers　// ３回目：正しく Intを入力
4
right input!
```
【iOS】可変サイズに対応して余白を設定するLabelを作る

background colorのあるlabelを作成する際に、背景に対して文字の余白が無い状態で表示されます。

![nomallabel.png](https://qiita-image-store.s3.amazonaws.com/0/194104/c597f22c-b41e-643a-9471-fc98146bc429.png)

こういった場合は、UIButtonのInsetsの設定を利用すると簡単に余白を出すことができます。

まずstoryboardで、Insetsの変更します。
text部分の余白を作るのでTitle Insetsを変更します。

![insets1.png](https://qiita-image-store.s3.amazonaws.com/0/194104/3f53ada3-2403-acab-3d83-a7427ef1109c.png)

画像では、左側と右側に５ポイント余白を作りました。
しかし、これだけでは、文字が...となって全て表示されなくなります。

![labelinsets.png](https://qiita-image-store.s3.amazonaws.com/0/194104/e4f19e11-3fc3-6759-3057-d3cf46947c64.png)

そこで、Content自体のInsetsを変更します。

![insets2.png](https://qiita-image-store.s3.amazonaws.com/0/194104/19b32b28-b84a-eb85-cda5-de3d298e580d.png)

Title Insetsの右側も-5に変更します。
すると、無事に背景に対して余白ができました。

![buttonInsets.png](https://qiita-image-store.s3.amazonaws.com/0/194104/d00c3564-231a-6ac6-1ea3-4e135ce35fb2.png)

上のLabelと比べても余白ができているのがわかります。
あとは、ButtonのEnabledを変更してボタン機能を無くせばラベルと同じうようになります。

簡単な背景色のあるLabelを作る場合は、この方が楽に作れると思います。

**コードで書く場合**

```swift
button.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 10)
button.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, -5)
```
Numpy > meshgrid() > x, y 方向のループ数 > x方向:len(mx[0]), y方向:len(mx)

```txt:動作環境
ideone (Python 3)
```

https://ideone.com/RzHTsb

```py
import numpy as np

inx = np.linspace(-3, 3, 5, endpoint=True)
iny = np.linspace(-5, 5, 10, endpoint=True)
mx, my = np.meshgrid(inx, iny)

print("===y loop===")
for iy in range(len(mx)):
    print(mx[iy][0], my[iy][0])
print("===x loop===")
for ix in range(len(mx[0])):
    print(mx[0][ix], my[0][ix])
    
```

```txt:run
===y loop===
(-3.0, -5.0)
(-3.0, -3.8888888888888888)
(-3.0, -2.7777777777777777)
(-3.0, -1.6666666666666665)
(-3.0, -0.55555555555555536)
(-3.0, 0.55555555555555536)
(-3.0, 1.666666666666667)
(-3.0, 2.7777777777777786)
(-3.0, 3.8888888888888893)
(-3.0, 5.0)
===x loop===
(-3.0, -5.0)
(-1.5, -5.0)
(0.0, -5.0)
(1.5, -5.0)
(3.0, -5.0)
```
主要ブラウザでCookie / JavaScript / Web Storageを無効にする方法まとめ

ここ数日、プロダクトのブラウザテストを実施していたのですが、CookieやJavascriptなどのオンオフを繰り返したり、Web Storageの挙動を調べたりするケースが何回か出てきました。
毎回やり方を調べようとすると地味に面倒なので、調べたものをまとめておきます。
なおここに書いてあるものは、現時点(2017/8/31時点)での最新版ブラウザで全て実際に試しました。OSは記載がなければ `Windows10 64bit` です。

# Chrome（PC）
## Cookie
- 設定→詳細設定→コンテンツの設定→Cookie→スイッチをオフ

## JavaScript
- 設定→詳細設定→コンテンツの設定→Javascript→スイッチをオフ

## Web Storage
- 単体で無効にするのは不可能（Cookieを無効にするしかない）

# Chrome（モバイル・Android7.0 / 6.0）
## Cookie
- 設定→サイトの設定→Cookie→スイッチをオフ

## JavaScript
- 設定→サイトの設定→Javascript→スイッチをオフ

## Web Storage
- 単体で無効にするのは不可能（Cookieを無効にするしかない）

# FireFox(PC)
## Cookie
- オプション→プライバシー→`サイトから送られてきたCookieを保存する`のチェックを外す

##JavaScript
- URL欄に`about:config`と入力→警告が出たら内容をよく読んだうえで次へ進む→`javascript.enabled`をダブルクリックして`false`にする

## Web Storage
- URL欄にabout:configと入力→警告が出たら内容をよく読んだうえで次へ進む→`dom.storage.enabled`をダブルクリックして`false`にする

# IE11(PC・Windows10)
## Cookie
- インターネット オプション→プライバシー→詳細設定→`ファーストパーティのCookie`・`サードパーティのCookie`の両方で`ブロックする`を選択。さらに`常にセッションCookieを許可する`のチェックを外す

## JavaScript
- インターネット オプション→セキュリティ→`インターネット`が選択された状態で`レベルのカスタマイズ`→`アクティブ スクリプト`の欄で`無効にする`を選択

## Web Storage
- インターネット オプション→詳細設定→`DOM ストレージを有効にする`のチェックを外す

# IE11(PC・Windows7)
## Cookie
- インターネット オプション→プライバシー→スライダーを一番上まで上げて`すべてのCookieをブロック`にする

## Javascript
- Windows10と同様

## Web Storage
- Windows10と同様

# Edge(PC)
## Cookie
- 設定→詳細設定を表示→Cookieの欄で「すべてのCookieをブロックする」を選択

## Javascript
※ 無効にする方法が見つかりませんでした...
以前はWindows10の設定画面→`グループポリシーの編集`に行くと該当する項目があったのですが、現在はそれがなくなっています。

## Web Storage
- 単体で無効にするのは不可能（Cookieを無効にするしかない）

# Safari(PC)
## Cookie
- Safari→環境設定→プライバシー→`CookieとWebサイトのデータ`で`常にブロック`を選択

## JavaScript
- Safari→環境設定→セキュリティ→`JavaScriptを有効にする`のチェックを外す

## Web Storage
- 単体で無効にするのは不可能（Cookieを無効にするしかない）


# Safari(モバイル・iOS10）
## Cookie
- iphoneの設定画面→Safari→ `Cookieをブロック`の欄で`常にブロック`を選択

## JavaScript
- iphoneの設定画面→Safari→詳細→`Javascript`のスイッチをオフ

## Web Storage
- 単体で無効にするのは不可能（Cookieを無効にするしかない）
object　連想配列の表示方法

連想配列の表示方法。
忘れてしまいそうなので、備忘録として記述。

```js
var object2 = {
  'obj1':{'c1':'A','c2':'B','c3':'C'},
  'obj2':{'c1':'A','c2':'B','c3':'C'}
};

console.log(object2.obj1.c1);  //A
```
フォルダを監視して、空になったら1ファイルだけ移動する君

```vbnet:filemover.hta
<script language="VBScript">
'監視フォルダ
CONST DIR_FROM="C:¥from"
'移動先フォルダ
CONST DIR_TO="C:¥to"
'監視秒数
CONST INTERVAL_SEC=5
</script>

<head>
    <meta charset="Shift-jis">
    <title>FileMover 2017/09/02</title>
</head>
<script language="VBScript">
Option Explicit
dim fso
set fso = CreateObject("Scripting.FileSystemObject")
'main
Sub main
	' ウィンドウサイズ
	Window.ResizeTo 700,500
	'
	from_check()
	If is_to_empty() = True Then
		move_file
	End If
	' 指定秒待ってから繰り返す
	Call window.setTimeout("main",INTERVAL_SEC*1000,"VBScript")
End Sub

Sub from_check
	dim folder
	set folder = fso.getFolder(DIR_FROM)

	' ファイル一覧
	dim file
	document.getElementById("from").innerHTML = DIR_FROM
	for each file in folder.files
	    document.getElementById("from").innerHTML = document.getElementById("from").innerHTML & "<br>" &file.name
	next 
End Sub

Sub move_file
	dim folder
	set folder = fso.getFolder(DIR_FROM)

	' ファイル一覧
	dim file
	for each file in folder.files
	    fso.MoveFile DIR_FROM&"¥"&file.name, DIR_TO&"¥"&file.name
	    ' toにファイルを一つ移動したら処理を中断
	    Exit Sub
	next 
End Sub

' is_to_empty
Function is_to_empty
	dim folder_to
	set folder_to = fso.getFolder(DIR_TO)
	' ファイル一覧
	dim file
	dim i : i=0
	document.getElementById("to").innerHTML = DIR_TO
	for each file in folder_to.files
	    document.getElementById("to").innerHTML = document.getElementById("to").innerHTML & "<br>" &file.name
	    i = i+1
	next 
	IF i = 0 Then
		is_to_empty = True
	Else
		is_to_empty = False
	End If
End Function
</script>
<body onLoad="main()">
<!-- 左右に並べる -->
<div id="from" style="display:inline; width:20em;vertical-align:top;"></div>
<div id="to" style="display:inline; width:20em;vertical-align:top;"></div>
</body>
```
bashのkeybindを変更 (Ctrl-gを押したらEsc)

## 一覧

```
bind -p
```

## bash
```sh:escape.sh
bind '"\C-g": "\e"'
```

```sh:適用
source escape.sh
```

## vim

```vim:~/.vimrc
cmap <C-g> <Esc>
imap <C-g> <Esc>
nmap <C-g> <Esc>
omap <C-g> <Esc>
vmap <C-g> <Esc>
```
Escキーを押して離すだけのプログラム

## 参考

* [Linux Input Subsystemの使い方](http://www.tatapa.org/~takuo/input_subsystem/input_subsystem.html)
* /usr/include/linux/input.h

## キーボードがどのevent番号か確認

```
egrep "^(N|H)" /proc/bus/input/devices
```

* 自分の場合は`/dev/input/event5`がキーボードだった。

```
ls -lh /dev/input/event5
crw-rw---- 1 root input 13, 69  8月 24 18:33 /dev/input/event5
```

* ユーザーをinputグループに追加しておく。
* event5 の番号を固定にしたい場合はudevを使う。

## Escキーを押して離すだけのプログラム

```c:write.c
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <sys/time.h>

void write_key_event(int code, int value, int fd)
{
        struct input_event key_event;

        gettimeofday(&key_event.time, NULL);
        key_event.type = EV_KEY;
        key_event.code = code;
        key_event.value = value;
        write(fd, &key_event, sizeof(key_event));
}

int main(void)
{
        write_key_event(KEY_ESC, 1, 1);
        write_key_event(KEY_ESC, 0, 1);

        //int i = 0;
        //int keys[] = { KEY_A ,KEY_B ,KEY_C };
        //while (keys[i] != '\0' ) {
        //      write_key_event(keys[i], 1, 1);
        //      write_key_event(keys[i], 0, 1);
        //      i++;
        //}

        //i = 0;
        //write_key_event(KEY_LEFTSHIFT, 1, 1);
        //while (keys[i] != '\0' ) {
        //      write_key_event(keys[i], 1, 1);
        //      write_key_event(keys[i], 0, 1);
        //      i++;
        //}
        //write_key_event(KEY_LEFTSHIFT, 0, 1);

        exit(EXIT_SUCCESS);
}
```

## 実行

```
gcc -o write.o write.c
./write.o > /dev/input/event5
```
Numpy > Link: 複数のリストの要素を同じ順番で入れ替える

```txt:動作環境
ideone(Python3)
```

2つのnumpy.array(以下、array)があるとする。
1つのarrayを入替え、もう１つのarrayも同じ順番で入替えたい。
(ニホンゴムズカシイ）

https://stackoverflow.com/questions/4601373/better-way-to-shuffle-two-numpy-arrays-in-unison
の
answered Jan 5 '11 at 8:52
mtrw
のコードが参考になりました。

ideoneでの実装例。
https://ideone.com/pw7L27

```py
import numpy as np


def unison_shuffled_copies(a, b):
    assert len(a) == len(b)
    p = np.random.permutation(len(a))
    return a[p], b[p]
    
alist = np.array([ 1, 2, 3, 4, 5 ])
blist = np.array([ 3, 1, 4, 1, 5 ])
ares, bres = unison_shuffled_copies(alist, blist)
print(ares)
print(bres)

```

```txt:run
[2 1 5 3 4]
[1 3 5 4 1]
```
[rubyクイズ]&.とtry

#問題

```rb
1&.to_hoge #=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```rb
1&.to_hoge #=> NoMethodError: undefined method `to_hoge' for 1:Fixnum 
```

###ちょっと解説

```rb
# 存在しないメソッドを呼ぶ場合、
# tryだとnilになるが、
# &.だとNoMethodErrorになる。
1.try(:to_hoge) #=> nil
1&.to_hoge #=> NoMethodError: undefined method `to_hoge' for 1:Fixnum 

#ちなみに、レシーバがnilだったら、どっちでもnilになる。
nil.try(:to_hoge) #=> nil
nil&.to_hoge #=> nil
```
MIPS SOCのパフォーマンス

AtherosとMediaTek(旧Ralink)は共にMIPSベースのSOCを作っていますが、AtherosのSOCがmrubyで極端にパフォーマンスが悪いのでunixbench 4.1で性能比較をしてみました。

ZRouterでunixbenchをビルドできるようにして、unixbenchのindexの中のfile関係を除いた数字を見てみました。

```
# unixbench dhry2reg whetstone-double shell execl pipe context1 spawn syscall
```

* AR9310の結果

```

                     INDEX VALUES            
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        116700.0   492487.4       42.2
Double-Precision Whetstone                      55.0        5.0        0.9
Execl Throughput                                43.0       38.2        8.9
Pipe Throughput                              12440.0    80802.4       65.0
Pipe-based Context Switching                  4000.0    27217.2       68.0
Process Creation                               126.0      280.8       22.3
Shell Scripts (8 concurrent)                     6.0       14.0       23.3
System Call Overhead                         15000.0    63838.0       42.6
                                                                 =========
     FINAL SCORE                                                      20.7
```

* MT7620の結果

```
                     INDEX VALUES            
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        116700.0   724551.6       62.1
Double-Precision Whetstone                      55.0        7.6        1.4
Execl Throughput                                43.0       75.8       17.6
Pipe Throughput                              12440.0   115928.7       93.2
Pipe-based Context Switching                  4000.0    35735.6       89.3
Process Creation                               126.0      438.2       34.8
Shell Scripts (8 concurrent)                     6.0       26.0       43.3
System Call Overhead                         15000.0   113341.8       75.6
                                                                 =========
     FINAL SCORE                                                      33.1
```

MT7620のクロックは580MHzでAR9310は400MHzです。ほぼほぼクロックの差に近い数字のように見えます。

ところがこのSOCでfib(32)をawkやmrubyを実行するとかなり違いが出てしまいます。

|SOC|awk|mruby|
|:--|:--|:--|
|MT7620|44sec|14sec|
|AR9310|106sec |71sec|

最初エンディアンがらみのmrubyを疑って、次にメモりコントローラーを疑ったのですが、どうも両方とも外れているような気がします。

amd64でawkとmrubyを比べるとawkの方が早かったりします。もうなんだかよくわかりません。何が原因なんでしょうか。。。
ADDA > runtime argument > -shape chebyshev [eps: amplitude] [n: order] 

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Excerpt from `manual.pdf` (last revised: February 20, 2014) related to save the internal fields.

### -shape chebyshev

manual.pdf
@ 6.4 Predefined shapes

> chebyshev – axisymmetric Chebyshev particle of amplitude ε (|ε| ≤ 1) and order n (natural number). Its formula in spherical coordinates (r, θ) is

Eq.10

```math
r = r_0 [ 1 + \epsilon cos(n\theta)]
```

### example


```
Generated by ADDA v.1.3b6
command: './adda -grid 26 -shape chebyshev 0.6 5 -store_int_field '
lambda: 6.283185307
shape: axisymmetric chebyshev particle; size along x-axis (Dx):10.77580685, amplitude eps=0.6, order n=5, initial radius r0/Dx=0.3269304082
box dimensions: 26x26x24
refractive index: 1.5+0i
Dipoles/lambda: 15
        (Volume correction used)
Required relative residual norm: 1e-05
Total number of occupied dipoles: 3824
Volume-equivalent size parameter: 4.063482254

```
vmg形式のファイルをeml形式で出力するjava

eml形式にするためのメッセージ単位のタグの間をファイルに書き出すだけの、
単純なもの。作った経緯は以下のページ参照。
[Androidスマホのキャリアメールを取り出す方法](https://matome.naver.jp/odai/2150430226412352701)

vmgは複数のメッセージデータがタグに囲まれて入っている。タグに関しては、以下を参考にした。
[PowerShell で VMG ファイルを変換してエクセルで読む](http://nyoro2.net/wp/?p=414)

```

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.FileNotFoundException;

class vmg2Eml{
    public static void main(String args[]){
				String input_maildata_filename;
       if(args.length <= 0){
            System.out.println("コマンドラインにてファイル名を");
						return;
        } else {
					input_maildata_filename = args[0];
        }
        try{
						int line_number = 0;
            File file = new File(input_maildata_filename);

						if (!file.exists()){
							System.out.println("ファイルはありません");
							return;
						}

						FileInputStream FIS = new FileInputStream(file);
						BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(FIS,"UTF-8"));
						String data;
						String strBegin = "BEGIN:VBODY";
						String strEnd = "END:VBODY";
						Boolean Has2Write = false;
						int mail_number = 0;

						PrintWriter printwriter = null;
						FileOutputStream FOS2write = null;

						while ((data = bufferedReader.readLine()) != null) {
							int isBegin = data.indexOf(strBegin);
							int isEnd = data.indexOf(strEnd);
							
							if(isBegin != -1){
								Has2Write = true;
								data = bufferedReader.readLine();
								mail_number++;
								String filename2write = String.format("%05d",mail_number) + ".eml";
								File file2write = new File(filename2write);
								FOS2write = new FileOutputStream(file2write);
								printwriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(FOS2write,"UTF-8")));
							}

							if(isEnd != -1){
								Has2Write = false;
								printwriter.close();
							}

							if(printwriter != null && Has2Write){
								printwriter.println(data);
							}
						}

            bufferedReader.close();

        }catch(FileNotFoundException e){
            System.out.println(e);
        }catch(IOException e){
            System.out.println(e);
        }
    }
}

//System.out.println(data);

```
TensorFlow | ADDA > 線形方程式を解き直してみた (21 x 21のrefractive index分割) > 様々なiterative solverでの効果 | 2007年の結果

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

学習コードv0.1 http://qiita.com/7of9/items/5819f36e78cc4290614e

http://qiita.com/7of9/items/bc2f8a09d8681702b066
の続き。

### 概要

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

- TFRecordsを読込んで学習する
- input: 5 nodes
- output: 6 nodes
- サンプル数: 4,113,648
- 学習データ: ADDAにより計算した値
    - #input
    - x,y,z: dipole position
    - refractive index: real and imaginary part
    - #output
    - initial values for linear equation solution for (x,y,z),(real,imaginary)

５次元関数の補間を学習させようとしている。
(5次元の回帰問題というのだろうか？）

補間の対象はADDAでの線形方程式の初期値としている。初期値が実際の解に近い値から線形方程式を解くと、iterationの回数をおさえられるという目論見。

### 確認事項

https://github.com/adda-team/adda/blob/master/doc/manual.pdf
p39においてADDAに用意されている様々なiterative solverが記載されている。

- Bi-CGStab(2)
- Bi-CG
- Bi-CGStab
- CGNR
- CSYM
- QMR
- QMR2

デフォルトはQMR。

TensorFlowでの学習(線形方程式の初期値)によるiteration回数の変化がiterative solverでどう異なるかチェックしてみた。

| A:type | B:original[回] | C:TF学習[回] | D:C/B |
|:-:|:-:|:-:|:-:|
| Bi-CGStab(2) | 13  | 11  | 0.846  |
| Bi-CG  | 46  | 39  | 0.847  |
| Bi-CGStab  | 26  | 22  | 0.846  |
| CGNR  | 65  | 46  | 0.707  |
| CSYM  | 112  | 88  | 0.785  |
| QMR  | 47  | 39  | 0.829  |
| QMR2  | 46  | 39  | 0.847 |

(originalの初期誤差:1.0, TF学習を用いた場合の初期誤差:0.0808)

D列の値が0.8程度にしかならない。
「TF学習結果から初期値を計算する時間」と「iterationを減らした時間」を比べて考えたら、計算効率改善には貢献していない。


### 2007年の計算

2007年にトルコで発表した結果。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9f43802f-aca6-87ed-64a3-dd050075b9a0.png)

- 計算コード: DDSCAT (v6.1)
- m=1.60 + 0.01i
- 形状: BCCA64, OMMT, GSP
- TM, TEモードの初期値を補間
   - 入射光の方向に対する補間処理
- 結果（上図）として、0.2から0.8の範囲でのC/B値を得ていた

この結果をベースとしてトライをしているが、ADDAでは0.8程度にしかならないのはなぜだろうか。

実施した計算の異なる条件を合わせていくと何かわかるだろうか。
Ubuntuにcomposer-cliをインストールする


Ubuntuにcomposer-cliをインストールしようと以下のコマンドを実行したところ失敗しました。
事前作業を実施していなかったためです。

```
sudo npm install composer-cli
```

Ubuntuにcomposer-cliを導入するための事前作業が記載されていました。
[マニュアル](https://www.npmjs.com/package/composer-cli/tutorial)

```bash
curl -sL https://deb.nodesource.com/setup | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install composer-cli
```
[CEDEC2017]『ソードアート・オンライン』 仮想から現実へ。 小説とゲーム技術のお話。  ～ソードアート・オンラインが現実になる日まで。～


##『ソードアート・オンライン』 仮想から現実へ。 小説とゲーム技術のお話。  ～ソードアート・オンラインが現実になる日まで。～

###講演者
川原 礫　さん（作家）
原田 勝弘　さん（株式会社バンダイナムコエンターテインメント)
二見 鷹介　さん（株式会社バンダイナムコエンターテインメント）

###講演内容
原作「ソードアート・オンライン」この小説をゲーム化した際のお話やこれからのVRの技術としてのお話。

VRでの映像表現の進化は著しいが、ゲームの世界を現実と勘違いするほどの表現をされている原作を
実際にエンターテイメントとして作るのはかなり難しいこととのこと。
例としてジェットコースターなど恐怖を体験するアトラクションなどは乗る前に予めどういうことを
体験できるかという想像をして乗ることができるが、そういった前情報が無い状態では
ただ単に恐怖しか感じなくなってしまう。
こういった部分の線引をどうするかがリアルになりつつあるVRの課題の一つだといえる。

また、VR機器に関しても現在はあまり一般受けしていない。
原因としてはやはり装着の煩わしさや使う前の準備（センサーの用意など）があるためである。
これを一般受けしていくにはやはり装着の手軽さが一番だという。
想定としてメガネ型やコンタクト型にし網膜照射という事ができればいいのかも。

また、現在は主にゲームとしての話題となっているが、ビジネスとしてそういった技術が出来上がると
普及はし易いのではないかという話も上がっていた。
想像上の話だがタクシーやビジネスホテルなどVR？MR？を介して見ることで
すぐに乗れる、空き室・料金がわかるなどのビジネス分野で応用ができそうという考え。

また、原作に登場するAIに関しても話題として上がっていた。
予め答えが用意されているトップダウン型AIと人間の脳を再現したボトムアップ型AIが話題となっていた。
トップダウン型が主にチャットサービスなどで使われているもので、人によっては
実際にはAIの発言だが人と勘違いしてしまうということもある。
ボトムアップ型の場合は人間の脳を模倣することでいずれは知性を持つことができるかもしれない。

###まとめ
VRに関しては確かに色々と考えさせられる内容でした。
開発者の多くはVR機器の壁にあたっているのでいずれはこれを超えることができればと思いました。
また、AIに関してはここ最近はいろいろと話題となっており、ツールやソースが公開されたりと
話題が尽きないこととなりそうだ。
[CEDEC2017]中規模チームを支える自動化と属人化しないノウハウ共有の取り組み

#中規模チームを支える自動化と属人化しないノウハウ共有の取り組み

##講演者
矢吹 遼介　さん（面白法人カヤック）

##資料
[講演スライド](https://speakerdeck.com/konboi/cedec2017)

##講演内容
マスターデータの運用を自動化することで色々なことが出来ると思い自動化を決意

前提としてこのセッションの内容ではマスターデータの編集にGoogleSpreadSheet（GSS）を使用

###GSSのメリット
- 同時に編集することが可能
- インターネットに繋がっていればどこでも編集可能
- 編集の履歴が残る
- JavaScriptでプラグインを記述することが出来る

###デメリット
- 式や関数を使うとすぐに重くなる
- インターネットに繋がっていないと編集できない

###自動化前の問題点
同時に編集出来るが作業の衝突が発生し易いため使用する際に宣言をしていた。
テスト前のデータを入力中に本番に公開しているデータの修正が入った場合にRevertしていた。

~~現にこれと同じ状況に遭遇していたりする~~

###対策（まるっとコピー）
本番のマスターデータをコピーし、QA前は複製したものに記入しテストを行い、
完了したものを本番に移動して順番待ちという状況を一旦回避した。
だが！
これでは解決せずに修正したものが編集中のものに反映されずに巻き戻ってしまうことなどがあり
問題が発生した祭の調査にエンジニアの手間が増えるという状態に陥っていた。

###対策（GSSの分割）
基準となるシートとそれに追加するシートに分割を行い、
データを取り組む際に元のシートと追加したシートを統合するように対策を行った。
これによりデータの入力待ちという無駄な時間の発生がなくなり、
また、データの不具合の調査等も追加されたデータのみを見ることで可能となり
調査する手間も併せて減少することが出来た。

###新たな問題
だが、マスターデータの更新頻度が上がったことにより、テスト環境が足りなくなった。
テスト環境は約10個ほど用意していたが、テストする際にその環境を他の人が使っていないかなどの
確認をする手間が増えてしまった。

###docker×mirage（内製のミドルウェア）で対応
確認環境を自動的に立てるように対応を行った。
こうすることで、サーバーの空き待ちなどをする必要もなくすぐに確認することが出来るようになった。
※一定間隔で未使用の環境や無くなったブランチの環境などは削除するように対応

###さらなる問題が発生
データ入力の高速化、テスト環境の改善を行った結果
施策内容が増加しその影響でQAチェックが甘くなってしまっていた。
そのため、マスターデータを反映する前にチェック機能を設けて入力ミスを未然に防ぐように対応を行った。

###属人化しないノウハウ
- アチーブメントシートを作成する

アチーブメントシートは自身の主観でそのプロジェクトにおいて何が出来るかを見える化したもの。
これを元に同じ人に同じようなタスクを常に割り振るのではなく、メンバの成長のために挑戦的な形で
タスクを割り振ると良い。

ただし、いくつかのデメリットが存在している。

- アチーブメントシート自体を作るのが大変
- メンテが大変（機能追加などがあるたびに更新しないといけない）
- 主観で作成するため完全に信用しきってはいけない
- **評価に結び付けない** ←結びつけると誰もやらなくなる。
- ノウハウがある人でないと出来ないタスクも存在する（緊急時対応など）

これに対応するために専用タスクが完了した際に簡単な資料をまとめてもらい
それを元に情報共有を行い、ノウハウの蓄積をしていくことが大切

##まとめ
マスターデータの入力の手間を解決することで、今まで見えていなかった問題が浮き彫りになり、
最終的にはQA体制の見直しなど他人事とは言えないような話を聞くことが出来、
とても参考になりました。
対応できそうなこともあったりするので、合間合間に対応していってもいいのかと思いました。
[CEDEC2017] 受講セッションまとめ

今年のCEDEC2017で受講したものの一覧
少しずつ感想を投稿予定

##１日目
- [『ソードアート・オンライン』 仮想から現実へ。 小説とゲーム技術のお話。 ～ソードアート・オンラインが現実になる日まで。～](http://qiita.com/h_tomi/items/2aa6a4fc42d1780c74d3)
- [中規模チームを支える自動化と属人化しないノウハウ共有の取り組み](http://qiita.com/h_tomi/items/381735f4dcda5ecf2822)
- [cgvi×CEDECコラボセッション] ニューラルネットを用いたキャラクター制御
- [複雑化するAssetBundleの配信からロードまでを基盤化した話](http://qiita.com/h_tomi/items/c21dcbdfff7442b05f8f)
- [アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現](http://qiita.com/h_tomi/private/57b7f32d528be24f6e83)
- [2020年代のゲームハードウェア技術トレンド](http://qiita.com/h_tomi/private/63f3d563129586a6b93b)

##２日目
- [本格スマホRPG『アナザーエデン』開発の裏側を包み隠さずお話します　〜コード資産も無く、チームとしての経験も豊富ではない中エンジニアはどう挑んだのか〜](http://qiita.com/h_tomi/private/0bebf8eb2b46330d3181)
- [無料で始める！「龍が如く」を面白くするための高速デバッグログ分析と自動化](https://qiita.com/h_tomi/private/06752631d89b61b30de8)
- 『ゼルダの伝説　ブレス オブ ザ ワイルド』のプロジェクト運営　～試作から製品までシームレスに！～
- [ユーザを飽きさせない高頻度の更新を可能にする開発運用ノウハウ ～ハイスピードな開発、リリースを実現するために～](http://qiita.com/h_tomi/items/9a97c23c7e1dd9ae5c3d)
- 『ゼルダの伝説　ブレス オブ ザ ワイルド』におけるQA　～ゲームの面白さを最大化するツールやデバッグの紹介～

##３日目
- "GO OUTSIDE! Adventures on foot"
- プレ・シンギュラリティ ー 近い未来のコンピューティング環境が生み出す全く新しい技術革新 ー
- [チートの傾向と対策 〜クライアントサイドのセキュリティ入門！〜](https://qiita.com/h_tomi/private/072653dd9a35231e5551)
- [『MONSTER HUNTER: WORLD』における、製品クオリティを最大化するテクニカルディレクションと、エンジニアの能力を引き出すマネージメント](https://qiita.com/h_tomi/private/36fc44f0c19506673252)
- [プロダクトマネージャーの仕事術](https://qiita.com/h_tomi/private/440c0c3d03e2954b5bd3)
- [本当にリアルなMixed Realityコンテンツを実現するための技術開発](http://qiita.com/h_tomi/items/c01eada9a0395acf3856)
BPMSを主体とした開発

# BPMSを元にした業務システムの開発方法を説明していく

テスト
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0.jpg)](http://www.youtube.com/watch?v=YOUTUBE_VIDEO_ID_HERE)

説明としてはEコマースに元がわかりやすいので
ECCUBEをフロントで使い
processmakerをBPMSに使用 https://www.processmaker.com/

# 下記の順で徐々に説明していく
## まずは、クラウドで使えるように申請　
### processmakerのサイトでクラウドの登録
https://www.processmaker.com/ から必要事項を登録すると　1分位でテスト用サイトが作成される。

* 組織作成
* グループ作成
* ユーザー作成
* 役割の作成
* プロセス作成
* タスク作成
* 画面作成
* プロセステスト
* タスク分岐の作成
* プロセステスト
* ECCUBEと同期
* プロセステスト
* KPIでの業務判断
* PDCAサイクルの検討
* TALENDによる大規模データ導入
* そのあと、LINEなどとの連携
* AIによる分岐（査定の自動化）
* 音声入力によるデータ登録による作業効率化
確率論 ~確率密度関数と積率母関数（モーメント母関数）~

最も代表的な確率分布として、以下のようなものが挙げられます。

- 一様分布
- 二項分布
- ポアソン分布
- 正規分布
- 指数分布

これらの分布の確率密度関数（Probability Density Function, p.d.f.）や
積率母関数もしくはモーメント母関数（Moment Generating Function, m.g.f.）について、
導出は勿論、関数の形は覚えておくだけでも、非常に有効です。

# 一様分布

```math
p.d.f.　f(x)=\begin{cases}\dfrac{1}{b-a}&(a\leq x\leq b)\\\\0&(\mathrm{Otherwise})\end{cases}
```

```math
m.g.f.　m_X(t)=E[e^{tX}]=\dfrac{e^{tb}-e^{ta}}{t(b-a)}　(a\leq x\leq b)
```

> 【証明】

```math
m_X(t)=E[e^{tX}]\\
=\int_a^be^{tx}f(x)dx\\ 
=\int_a^be^{tx}\dfrac{1}{b-a}dx\\
=\dfrac{1}{b-a}\left[\dfrac{e^{tx}}{t}\right]_a^b\\ 
=\dfrac{e^{tb}-e^{ta}}{t(b-a)}
```

# 二項分布

```math
p.d.f.　p(k)={}_n\mathrm{C}_kp^k(1-p)^{n-k}　(k=0,1,\cdots, n)
```

```math
m.g.f. 　m_X(t)=E[e^{tX}]=(pe^t+1-p)^n
```
> 【証明】

```math
m_X(t)=E[e^{tX}]\\
=\sum_{k=0}^ne^{tk}p(k)\\
=\sum_{k=0}^ne^{tk}{}_n\mathrm{C}_kp^k(1-p)^{n-k}\\
=\sum_{k=0}^n{}_n\mathrm{C}_k(pe^t)^k(1-p)^{n-k}\\
```

> 二項定理より、

```math
=(pe^t+1-p)^n
```

# ポアソン分布

```math
p.d.f.　p(k)=\dfrac{{e^{-λ}}λ^k}{k!}　(k=0,1,2,\cdots)
```

```math
m.g.f.　m_X(t)=E[e^{tX}]=e^{λ(e^t-1)}
```
> 【証明】

```math
m_X(t)=E[e^{tX}]\\
=\sum_{k=0}^{\infty}e^{tk}p(k)\\
=\sum_{k=0}^{\infty}e^{tk}\dfrac{{e^{-λ}}λ^k}{k!}\\
=e^{-λ}\sum_{k=0}^{\infty}\dfrac{(\lambda{e^{t}})^k}{k!}\\
```

> マクローリン展開より、

```math
\sum_{k=0}^{\infty}\dfrac{(\lambda{e^{t}})^k}{k!}=e^{\lambda{e^{t}}}
```
> したがって、

```math
=e^{\lambda(e^t-1)}
```

# 正規分布

```math
p.d.f.　f(x)=\dfrac{1}{\sqrt{2\pi}{\sigma}}e^{-\dfrac{(x-\mu)^2}{2{\sigma}^2}}
```

```math
m.g.f.　m_X(t)=E[e^{tX}]=e^{{\mu}{t}+\dfrac{{\sigma}^2{t^2}}{2}}
```
> 【証明】

```math
m_X(t)=E[e^{tX}]\\
=\int_{-\infty}^{\infty}e^{tx}f(x)dx\\
=\int_{-\infty}^{\infty}e^{tx}\dfrac{1}{\sqrt{2\pi}{\sigma}}e^{-\dfrac{(x-\mu)^2}{2{\sigma}^2}}dx\\
=\int_{-\infty}^{\infty}\dfrac{1}{\sqrt{2\pi}{\sigma}}e^{tx-\dfrac{(x-\mu)^2}{2{\sigma}^2}}dx\\
=\dfrac{1}{\sqrt{2\pi}{\sigma}}\int_{-\infty}^{\infty}e^{-\dfrac{\{x-(\mu+\sigma^2t)\}^2}{2\sigma^2}+\mu{t}+\dfrac{{\sigma}^2{t^2}}{2}}dx\\
=e^{\mu{t}+\dfrac{{\sigma}^2{t^2}}{2}}\int_{-\infty}^{\infty}\dfrac{1}{\sqrt{2\pi}{\sigma}}e^{-\dfrac{\{x-(\mu+\sigma^2t)\}^2}{2\sigma^2}}dx\\
```
> $N(\mu+\sigma^2t,\sigma^2)$ の $p.d.f.$ より、

```math
\int_{-\infty}^{\infty}\dfrac{1}{\sqrt{2\pi}{\sigma}}e^{-\dfrac{\{x-(\mu+\sigma^2t)\}^2}{2\sigma^2}}dx=1
```

>したがって、

```math
=e^{\mu{t}+\dfrac{{\sigma}^2{t^2}}{2}}
```

# 指数分布

```math
p.d.f.　f(x)={\lambda}e^{-{\lambda}x}　(x\geq0)
```

```math
m.g.f.　m_X(t)=E[e^{tX}]=\dfrac{\lambda}{\lambda-t}
```

>【証明】

```math
m_X(t)=E[e^{tX}]\\
=\int_{0}^{\infty}e^{tx}f(x)dx\\
=\int_{0}^{\infty}e^{tx}{\lambda}e^{-{\lambda}x}dx\\
=\lambda\int_{0}^{\infty}e^{(t-\lambda)x}dx\\
=\lambda\Biggr[\dfrac{e^{(t-\lambda)x}}{t-\lambda}\Biggr]_{0}^{\infty}
```

> $t-\lambda<0$ のとき、

```math
=\dfrac{\lambda}{t-\lambda}(0-1)\\
=\dfrac{\lambda}{\lambda-t}
```
UILabelの文字色をグラデーションさせる

## やりたいこと

UILabelで文字を横にグラデーションさせたい。（文字毎にグラデーションさせる場合は背景設定すれば良いだけになる。後述）

<img width="119" alt="Screen Shot 2017-08-29 at 12.19.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/20160/000907f6-cb87-9122-79a3-f20ce5dc109c.png">

グラデのかかったUIViewを作成し、UILabelをUIImageViewに変換して、マスク処理をかけてやるとこれが作成できる。

## コード

```swift
    func ここから() -> UIImageView {
        let label: UILabel = makeLabel(text: "ABCDEFG")
        let imageReference: CGImage = makeGradientCGImage(frame: label.bounds)
        let maskReference: CGImage = convertImage(label).cgImage!
        return makeMaskedImage(imageReference: imageReference, maskReference: maskReference)
    }

    private func convertImage(_ view: UIView) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
        let context:CGContext = UIGraphicsGetCurrentContext()!
        context.translateBy(x: -view.frame.origin.x, y: -view.frame.origin.y)
        view.layer.render(in: context)
        let renderedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return renderedImage
    }
    
    private func makeLabel(text: String) -> UILabel {
        let label = UILabel()
        label.font = UIFont.systemFont(20)
        label.textColor = UIColor.black
        label.backgroundColor = UIColor.white
        label.text = text
        label.sizeToFit()
        return label
    }
    
    private func makeGradientCGImage(frame: CGRect) -> CGImage {
        let gradientView = UIView(frame: frame)
        let layer: CAGradientLayer = CAGradientLayer()
        layer.frame = gradientView.bounds
        layer.startPoint = CGPoint(x: 0, y: 0.5)
        layer.endPoint = CGPoint(x: 1.0, y: 0.5)
        layer.colors = [UIColor.colorWithHex(0xFFD195).cgColor, UIColor.colorWithHex(0xF5670C).cgColor]
        gradientView.layer.addSublayer(layer)
        return gradientView.convertImage(false).cgImage!
    }
    
    private func makeMaskedImage(imageReference: CGImage, maskReference: CGImage) -> UIImageView {
        
        let imageMask = CGImage(maskWidth: maskReference.width,
                                height: maskReference.height,
                                bitsPerComponent: maskReference.bitsPerComponent,
                                bitsPerPixel: maskReference.bitsPerPixel,
                                bytesPerRow: maskReference.bytesPerRow,
                                provider: maskReference.dataProvider!,
                                decode: nil,
                                shouldInterpolate: true)!
        
        let maskedReference: CGImage = imageReference.masking(imageMask)!
        return UIImageView(image: UIImage(cgImage: maskedReference))
    }

```

### 補足

文字毎にグラデーションさせたい場合は、1pxの画像を用意するのがシンプルで良い解決方法のようである。
https://stackoverflow.com/a/4558480
Hyper-VでCentOS7のIPアドレスを固定にしてSSH接続をする方法

Hyper-V上にCentOS7をインストールしたのだが、
Hyper-Vマネージャから接続すると開くコンソールが非常に使いにくい。

そこでIPを固定化して、RLoginなどのSSHクライアントから接続する方法を調べた。

Hyper-Vマネージャから対象のホストに接続したあと、
nmtui 実行。下記のようなメニューが出るので、Edit a connection を選択＞OK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/116259/0c4c2eaa-d130-1d44-d349-272d022ab809.png)

ネットワークアダプターを選択（eth0）＞Edit...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/116259/b84e247e-f496-2fe8-3dfc-5f5afc077f62.png)

Addresses、Gateway、DNS servers に自分の環境に合ったIPアドレスを入力する
Windowsと同じネットワークにすれば良いようだ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/116259/2637a795-47d7-584a-0b35-ba587863ba68.png)

```
systemctl restart network.service（設定を有効に）
ip addr show（設定したIPアドレスになっているか確認）
```

確認できたら、RLoginからSSH接続すれば良い。
CentOS7側で特に設定なしで接続ができるようだ。
イニシャライザとは

#どういう時に使う？
イニシャライザは**init**という名の特別なメソッドで、**構造体**と**クラス**で初期化のために使用します。
インスタンスを**生成するとき**に呼び出される為、インスタンス毎に異なる値を使って実装したい時に使う

#使用例

・以下だと「社員番号」「名前」「担当」に値が入ってないのでコンパイルでエラーが出る

```ruby:社員クラス　
class Employee {
    let id:Int        //社員番号
    let name:String   //名前
    let tantou:String //担当

    //注文を受ける
    func reciveOrder() -> Bool{
         return true
    }
}
```

・そこで、以下のコードのようにプロパティの宣言と同時に値を設定すればエラーは発生しなくなる。社員番号、名前、担当はインスタンスごとに値を変える必要があるので、未設定を意味するような値を設定しておく。

```ruby:社員クラス
class Employee {
    var id:Int = 0 //社員番号
    var name:String = "無し" //名前
    var tantou:String = "無し" //担当
 
    //注文を受ける
    func reciveOrder() -> Bool{
         //とりあえず処理は省略
         return true
    }
}
```

・インスタンスの生成は下記でできるが、毎回プロパティ値を初期化するために何行も記述しなければならずまた、初期化後に変更しない値を変数(var)で宣言しなければならないため、プロパティ値が思わぬところで変更されないよう今後のコーディングで注意する必要が出てくる

```ruby:インスタンスを生成
var employee1 = Employee()
employee1.id = 1054
employee1.name = "佐藤"
employee1.tantou = "ホールスタッフ"
 
 
var employee2 = Employee()
employee2.id = 3672
employee2.name = "広田"
employee2.tantou = "キッチンスタッフ"
```

そこで、利用するのがイニシャライザでインスタンスを生成するときに呼び出されるinitメソッドのことである。イニシャライザの中でプロパティ値を設定すれば、プロパティを宣言すると同時に値を代入しなくても良くなる。

例えば、以下のコードのように、init(社員番号, 名前, 担当)というメソッドを定義しておけば、社員クラスのインスタンスを生成するときに必ず社員番号, 名前, 担当を引数に与えることになる。

```ruby:社員クラス
class Employee {
    let id:Int        //社員番号
    let name:String   //名前
    let tantou:String //担当
 
    //イニシャライザ
    init(id:Int, name:String, tantou:String){
        //引数の値をインスタンスの変数に代入する
        self.id = id
        self.name = name
        self.tantou = tantou
    }
 
    //注文を受ける
    func reciveOrder() -> Bool{
         //とりあえず処理は省略
         return true
    }
}
 
//社員クラスのインスタンスを生成
var employee1 = Employee(id:1054, name:"佐藤", tantou:"ホールスタッフ")
var employee2 = Employee(id:3672, name:"広田", tantou:"キッチンスタッフ")
 
```

#補足
Objective-Cのイニシャライザは生成したインスタンスを返す必要がありますが、Swiftの場合は何も返しません。

構造体とクラスのイニシャライザの書き方は基本的に同じですが、それぞれで気をつけるところがあるのでそれらについて以下で説明します。

```ruby:構造体
/* パーソン */

struct Person {

    var name: String    // 名前
    var age: Int        // 年齢

    // イニシャライザ
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}
let person = Person(name:"タロウ", age: 18)

```
イニシャライザは上の様に関数と違い、initの前にfuncは不要です。また、引数の内部名は自動的に外部名となり（関数で内部名に#をつけたのと同じ）、インスタンスの生成時に引数のラベルをつける必要があります。

**※swift3では関数ラベルの扱いが func も init も同じ、暗黙的なラベルがつけられ、ラベルが要らない時は明示的に書く必要があります**

構造体の場合は、イニシャライザを記述しないと、プロパティ値を引数にとるイニシャライザ（Memberwise Initialization:メンバワイズイニシャライザといいます。）を自動的に生成してくれます。
onedaybeforethelastdayofthemonth

####cron
cronは自作してもっている。作ったのは7年ほど前で、コードはいま見ると目を覆うばかりなのだが、まあないよりマシ、動作しているのでそのまま使いつづけている。
それはそれとして自作のメリットは、拡張性の自由度がきわめて高いこと。
月末の1日前にリマインダーを起動する場合に、crontabに、こう書けるようにした。

```crontab
19 20-23 onedaybeforethelastdayofthemonth * * reminder.exe
```

crontabの3項目めは日付を数字で入れるのだが、そこに27とか28とか29とか30とかと書くのでは月末の1日前にならない。
そこで、「onedaybeforethelastdayofthemonth」と書くと、それをcron実行時に、月末の1日前の数字に置き換えるようにした。
日付の数字はC#で次のようにして取得している。

```C#
var today = DateTime.Now;
var firstDayOfMonth = new DateTime(today.Year, today.Month, 1);
var oneDayBeforeTheLastDayOfMonth = 
    new DateTime(today.Year, today.Month, 
                 DateTime.DaysInMonth(today.Year, today.Month-1));
var lastDayOfMonth = 
    new DateTime(today.Year, today.Month, 
                 DateTime.DaysInMonth(today.Year, today.Month));
```
Deep Security as a service 登録編

Deep Security as a service(以下DSaas)について書いていこうと思います。

まずDSaasですが、簡単に言うとパブリッククラウドに対応した統合的なセキュリティサービスだと言えます。
IPS/IDSであったり、改ざん検知であったり、ファイアーウォールなどの機能があります。

## ログイン
Trialで30日間無料なので、以下のURLからアカウントを作成して使うことができます。
https://app.deepsecurity.trendmicro.com/SignIn.screen

## 管理インスタンス登録
まずDSaasで管理するインスタンスを登録する方法で、
AWSアカウントを登録します。
![InkedWS000000_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/106369/1a7ed8d9-9955-a73d-74fe-45d9fe532411.jpeg)

まずIAMユーザを作成します。
アタッチするポリシールールは以下です。

```
{
   "Version":"2012-10-17",
   "Statement":[  
      {  
         "Sid":"cloudconnector",	
         "Effect":"Allow",
         "Action":[ 
            "ec2:DescribeImages",
            "ec2:DescribeInstances",
            "ec2:DescribeRegions",
            "ec2:DescribeSubnets",
            "ec2:DescribeTags",
            "ec2:DescribeVpcs",
            "iam:ListAccountAliases",
            "sts:AssumeRole"※
         ],
         "Resource":[  
            "*"
         ]
      } 
   ]
}
```

※クロスアカウントロールアクセスを使用している場合のみ、「sts:AssumeRole」権限が必要

DSaasにAWSアカウントを追加したら、
AWS上のインスタンスが表示されます。

## 
そして画面上部のサポート情報をプルダウンし、
インストールスクリプトを選択します。
![InkedWS000001_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/106369/08f7b3c3-5f57-66b2-8fb9-e08d1fab37ee.jpeg)

OSやポリシー、Relayグループを選択したら、
インストールスクリプトができますので、
このスクリプトをインスタンス上で実行させるか、
インスタンス作成時のユーザデータに記載します。

そしてステータスが管理対象(オンライン)になれば、
インスタンスの登録は完了です。