OmniAICreator/Qiita-1.07M huggingface dataset:
クラス内のメソッドで自身をnewするときはself、static、parentでいける

タイトルが雑

## コード
__2017/3/8 0:13 追記__
コメントで指摘を頂きました。下記のコードは正しく動作しません。
1. 生成されたオブジェクトを比較するとfalseとなる
2. 他のクラスから継承させると親クラスとなるmyClassのオブジェクトが返される

完全に私の検証不足です。申し訳ございません。
推測ですが、2についてはコンテキストがmyClass内なのでself()ではmyClassが生成されるのではないかと。staticを使用すれば呼び出し元のオブジェクトが返ると思います。

__2017/3/8 さらに追記__
コメントで教えていただきました。
比較するとfalseになる問題は私のコード記述ミスでした。メンバ変数にオブジェクトを入れてないので毎回新しいオブジェクトが生成されていました。
継承すると親クラスのオブジェクトが返される問題は、selfではなくstaticを使用することで解決できます。
また、privateやprotectedのメンバ変数を使用すると継承された際にエラーになるため、メソッド内でstatic変数を使用する必要があります。
これらを踏まえてコードを修正しました。教えていただいた方々、本当にありがとうございます。

```php
class myClass
{
    final private function __constructor() {}
    
    public static function getInstance()
    {
        static $instance;
        if (!$instance) {
            $instance = new static;
        }
        return $instance;
    }
}
```

## 実行結果
PHPのバージョンは5.5.38と7.1.1で確認しました。
```text
php > class myClass
php > {
php {     final private function __constructor() {}
php {     
php {     public static function getInstance()
php {     {
php {         static $instance;
php {         if (!$instance) {
php {             $instance = new static;
php {         }
php {         return $instance;
php {     }
php { }
php > 
php > var_dump(myClass::getInstance() === myClass::getInstance());
bool(true)
php > 
```
同じオブジェクトが返ります。

次は継承させてみます。

```php
class myParentClass
{
    final private function __constructor() {}
    
    public static function getInstance()
    {
        static $instance;
        if (!$instance) {
            $instance = new static;
        }
        return $instance;
    }
}

class myChildClass extends myParentClass {}
```
```text
php > class myParentClass
php > {
php {     final private function __constructor() {}
php {     
php {     public static function getInstance()
php {     {
php {         static $instance;
php {         if (!$instance) {
php {             $instance = new static;
php {         }
php {         return $instance;
php {     }
php { }
php > 
php > class myChildClass extends myParentClass {}
php > 
php > var_dump(myChildClass::getInstance());
object(myChildClass)#1 (0) {
}
php > 
```

シングルトンパターンが使われているコードを読んでいて、new myClass()と書かれているのを発見。
同じようなコードが大量にありまして、基底クラスにまとめて継承できそうだったので考えていた時に試しにself()って書いてみたら動いたんです。目から鱗が落ちました。

調べてみたら公式のドキュメントにさらっと書いてありますね。どうやらparentでもできる模様。先に書いたように継承を考慮するならstaticを使用します。
[PHP: クラスの基礎 - Manual](http://php.net/manual/ja/language.oop5.basic.php#language.oop5.basic.new)
>クラスのコンテキストにおいては、 new self や new parent のようにして新しいオブジェクトを作成することができます。

公式のドキュメントはちゃんと読むべきですね。

## まとめ
+ クラス内で自身のオブジェクトを生成する場合はself、static、parentが使える。
+ 継承されることを考慮するならstaticを使う。
[PHP: 遅延静的束縛 (Late Static Bindings) - Manual](http://php.net/manual/ja/language.oop5.late-static-bindings.php)
+ __書いたコードはちゃんと検証する。__
[EGL] EGLの初期化から終了処理までの実行手順まとめ

毎回忘れるのでちゃんとした手順としてまとめ

# 公式ドキュメント

[EGL - Native Platform Interface](https://www.khronos.org/egl)
[Khronos EGL Registry](https://www.khronos.org/registry/EGL/)

# EGL API呼び出しアクティビティ図

(クリックして拡大して下さい)

![EGLの使い方.png](https://qiita-image-store.s3.amazonaws.com/0/37721/2452bb33-3cc1-6de0-a323-7c749b371b6c.png)

上記のPlantUMLのファイルは以下のGistにも公開しています。
[EGLの使い方(PlantUML)](https://gist.github.com/koara-local/02330c77ac76371ccdd0ca9215fe31cc)

# 各APIに関する補足
## 全体としての注意事項

Khronosが定義しているのはAPIの仕様のみで、内部実装に関してはプラットフォームごとの実装に依存します。

オープンソースのEGL実装としては、`Mesa EGL` などがあります。

公式ページ：[Mesa EGL](https://www.mesa3d.org/egl.html)
ソース(GitHub Mirror)：[mesa3d/mesa: Mesa 3D graphics library (mirror; no pull requests here please)](https://github.com/mesa3d/mesa)

## eglTerminate

eglTerminateが呼ばれた瞬間にディスプレイに紐づく全てのリソースが開放されるわけではなく、eglMakeCurrentで有効になっているリソースは解除されるまでは解放されない。
angular2でaceエディターを動かすところまで


はこです。こんにちわ。

jsでテキストエディタを作りたいときは [ace](https://ace.c9.io/#nav=about) という超最高なライブラリがあるんですが、ng2環境で動かそうと思ったときにちょっとハマったのでメモ。


### What is Ace?

[![ace-logo.png](https://qiita-image-store.s3.amazonaws.com/0/34573/5093e9c7-5ac2-fb4e-4d00-51cab4bc462e.png "ace-logo.png")](https://ace.c9.io/#nav=about)


超イケてるテキストエディタ生成ライブラリです。
こんな感じの、色分け＆インテリセンス(オートコンプリート)＆シンタックスエラー警告までしてくれるエディタが数行のjsでかけちゃいます。


![brace.png](https://qiita-image-store.s3.amazonaws.com/0/34573/fe02727e-a3a6-6b9c-fb72-765efb713576.png "brace.png")


### How to import Ace into ng2?

```
npm install ng2-ace-editor --save
```

詳しい使い方は [npm](https://www.npmjs.com/package/ng2-ace-editor0) に書いてあるとおりです。


### ハマりどころ

シンタックスやテーマ、オートコンプリートを導入するときに大変混乱しました。
readmeに書いてある方法ではうまく導入できなかったので、こんな風にしました。


```
import { AceEditorComponent } from 'ng2-ace-editor';


// ** brace(ace) theme **
import 'brace/theme/chrome';

// ** brace(ace) mode & snippets **
import 'brace/mode/html';


@Component({
  // ...
export class AceEditorComponent implements OnInit {

  mode = 'html';
  theme = 'chrome';
```


### 要点

必要なテーマやスニペットやモードは、 `import 'brace/mode/html'` で取り込む。

**説明**
[brace](https://www.npmjs.com/package/brace) は、Ace-Editorのビルド済み＆browserify互換版で、(ng2環境では実際にはbrowserifyではなくてbabelがrequireを解決しているわけですが、)こっちからimportすることによってthemeとかを取り込めます。
標準の書き方だと、ace本体の機構(ace自体にも独自実装のrequireがある)で読もうとして、そしてうまくいかなくなってしまうのだ・・・。



バッドノウハウっぽいけど一応めも。
GroveのCircular LEDをNefryで使うメモ

Circular LEDは、円盤状にLEDがずらりと並んだデバイスです。くるくる回して何かを知らせるような用途に使うこともできるし、全部全開で灯すとフラッシュ代わりになります。

Grove - Circular LED - Wiki : http://wiki.seeedstudio.com/wiki/Grove_-_Circular_LED

動作電圧5VなのでNefryでは無理かと思ったのですけど、@wamisnetさんに助けていただいて動くようになりました。結論としては、３．５Vでも動くようです。

# 接続

![_20170307_173013.JPG](https://qiita-image-store.s3.amazonaws.com/0/30743/024f50c6-c58a-4b15-948a-f03f889778fe.jpeg)

Wikiのサンプルではデジタルポート2つで動かしていたのですけど、それだとうまくいかなくて、I2Cポートの方を使う必要がありました。

※ なんで駄目なのかはよくわかってないので、誰か詳しい人の説明に期待です:grinning:

# ライブラリの導入

http://wiki.seeedstudio.com/wiki/File:CircularLED.zip にあがっているZIPファイルを持ってきて、ZIPライブラリを追加します。

![Include_Library_and_Sketch_and_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/30743/aa9abbc4-c6ab-81e9-1d21-5f1f08208319.png)

ライブラリを追加すると、SketchBook保存フォルダ(Macのデフォルトだと*Documents/Arduino/libraries*)に展開されたファイルが配置されるので、見つけておいてください(あとで編集する必要が出てきます)

![CircularLED.png](https://qiita-image-store.s3.amazonaws.com/0/30743/78e2f337-b0d7-9f02-2693-a6017779592e.png)

# コードを書く

こんな感じで。ZIPファイルに入っている CircularLEDtest.ino から、ポートを変更して、Nefryの関数を使うように変更しました。

```
#include <Nefry.h>
#include <CircularLED.h>

CircularLED circularLED1(D1,D0);
unsigned int LED[24];
int k=0;
void setup() 
{
  Nefry.println("circularLED.");
  Nefry.setLed(0,0,0);
  Serial.begin(9600);
//  circularLED1.init();
  Nefry.println("init done.");
}
void loop() 
{
  for (int i =0;i<24;i++){
    LED[i]=0;
  }
  LED[k]= 0xff;
  k++;
  if (k==24){ k=0; }
  Nefry.setLed(k,k,k);

  circularLED1.CircularLEDWrite(LED);
  Nefry.ndelay(40);  
}
```

# ライブラリエラーへの対応

で、ビルドしようとすると、こんな感じでエラーになるかと思います。

```
~/develop/Arduino/libraries/CircularLED/CircularLED.cpp: In constructor 'CircularLED::CircularLED(int, int)':
~/develop/Arduino/libraries/CircularLED/CircularLED.cpp:37:12: error: cannot convert 'volatile uint32_t* {aka volatile unsigned int*}' to 'volatile uint8_t* {aka volatile unsigned char*}' in assignment
  PORT_Data = portOutputRegister(digitalPinToPort(_data));
            ^
~/develop/Arduino/libraries/CircularLED/CircularLED.cpp:38:11: error: cannot convert 'volatile uint32_t* {aka volatile unsigned int*}' to 'volatile uint8_t* {aka volatile unsigned char*}' in assignment
  PORT_Clk = portOutputRegister(digitalPinToPort(_clk));
           ^
exit status 1
Error compiling for board Nefry V2.

```

先程調べておいた場所にあるCircularLED.hをひらいて、*uint8_t*を*uint32_t*に置き換えて保存します。

これで、ビルドが通るようになったはずです。いつものようにブラウザからNefryにUploadしましょう

# 楽しむ

くるくる回るランプをお楽しみください。

NefryのLEDも、くるくる回るのにあわせてだんだん明るくなるようになっています。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/wamisnet">@wamisnet</a> うごいたー🙌ありがとうございます！<a href="https://t.co/8toWayiTAc">pic.twitter.com/8toWayiTAc</a></p>&mdash; daisuke furukawa (@mogya) <a href="https://twitter.com/mogya/status/839027060542599168">2017年3月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
PHPでユーザエージェントや引数からデバイスを判定

メモ。

```php:Device.class.php
/**
 * デバイス
 *
 * @method is_smartphone
 * @method is_fb_crawler
 * @method pc_or_android_or_ios
 * @method check_strict
 */
class Device
{
	/**
	 * スマホか判定
	 * @param  string $ua ユーザエージェント
	 * @return boolean スマートフォンからのアクセスか否か
	 */
	static public function is_smartphone($ua = null)
	{
		if ( is_null($ua) ) {
			$ua = $_SERVER['HTTP_USER_AGENT'];
		}

		if ( preg_match('/iPhone|iPod|iPad|Android/ui', $ua) ) {
			return true;
		} else {
			return false;
		}
	}


	/**
	 * Facebookのクローラか判定
	 * @return boolean Facebookのクローラか否か
	 */
	static public function is_fb_crawler()
	{
		if ( isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/^facebookexternalhit/u', $_SERVER['HTTP_USER_AGENT']) ) {
			return true;
		} else {
			return false;
		}
	}


	/**
	 * デバイス判定
	 * @param  string $ua ユーザエージェント
	 * @return string pc|android|ios
	 */
	static public function pc_or_android_or_ios($ua = null)
	{
		if ( is_null($ua) ) {
			$ua = $_SERVER['HTTP_USER_AGENT'];
		}

		if ( preg_match('/iPhone|iPod|iPad/ui', $ua) ) {
			return 'ios';
		} else if ( preg_match('/Android/ui', $ua) ) {
			return 'android';
		} else {
			return 'pc';
		}
	}


	/**
	 * 厳密にデバイスを判定
	 * @param  string $ua ユーザエージェント
	 * @return string|boolean デバイス。Windows|Macintosh|iPhone|iPad|iPod|Android|AndroidTablet|WindowsPhone|false(一致なし)
	 */
	static public function check_strict($ua = null)
	{
		if ( is_null($ua) ) {
			$ua = $_SERVER['HTTP_USER_AGENT'];
		}

		if ( preg_match('/Windows Phone/ui', $ua) ) { //UAにAndroidも含まれるので注意
			return 'WindowsPhone';
		} else if ( preg_match('/Windows/', $ua) ) {
			return 'Windows';
		} else if ( preg_match('/Macintosh/', $ua) ) {
			return 'Macintosh';
		} else if ( preg_match('/iPhone/', $ua) ) {
			return 'iPhone';
		} else if ( preg_match('/iPad/', $ua) ) {
			return 'iPad';
		} else if ( preg_match('/iPod/', $ua) ) {
			return 'iPod';
		} else if ( preg_match('/Android/', $ua) ) {
			if ( preg_match('/Mobile/', $ua) ) {
				return 'Android';
			} else {
				return 'AndroidTablet';
			}
		} else {
			return false;
		}
	}
}
```
jsdoでjmespath.js

#概要
jsdoでjmespath.jsやってみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/Y/v/8/Yv8r.jpg?t=1488878473)

#成果物

http://jsdo.it/ohisama1/Yv8r

#サンプルコード

```
function run() {
    var expression = $('#e').val();
    var inputData = JSON.parse($('#src').val());
    var result = jmespath.search(inputData, expression);
    $('#helloWorld').text(JSON.stringify(result, null, 2));    
}


```
２ステップでiPhone 7/6s/6/5s/5からPCに音楽を転送するには

普通、iTunesでiPhoneの音楽データを管理・バックアップ。同期するのは十分です。但し、もし以下の状況になったとしたら、どうすればいいのでしょうか:

１、iPhoneに同期したはずのパソコン中の音楽が消えてしまった；
２、iPhoneで購入した曲をPCに移し、PC側でも聞きたい；
３、パソコンを初期化、新しいパソコンを購入するなどでiPhoneからPCに音楽を移したい；
４、iPhoneの容量が足りなくて、ストレージを増やすため、PCへ一部の音楽データを移動したい。

以上の場合、iPhoneの音楽データをPCに移行する必要があります。が、iTunesの同期機能でiPhoneからPCに音楽を転送することができません。そのため、iOSデバイスからMac・Windowsパソコンにデータを移行できるソフトが必要です。そこで、iOSデバイス専用のデータ転送ツール　-　AnyTransをおすすめします。 なぜかというと、以下の理由を見てみましょう。

**AnyTransを使う理由**
AnyTransはiPhone・iPad・iPod専用のデータ転送・バックアップ・管理ツールです。それでは、このツールの詳細を見てみましょう！
１、有効　-　iPhoneにある音楽を容易くPCに移行できる；
２、速度　-　１分間で200曲を移せる；
３、安心　-　音質が劣化しなく、データも紛失しない；
４、お得　-　データをiPhone・iTunes・PCの間で移動するだけでなく、動画ダウンロード、iCloudにバックアップ・同期されたデータの管理などの機能もある；
５、多種類　-　音楽の他、着信音、メモ、連絡先、写真などの２５種類のデータの転送も支持する。

**iPhoneからPCに音楽を転送する簡単な方法**
ステップ1：　AnyTransをインストールして開く　＞　iPhoneをUSBケーブルでPCにつながる　＞　右にある![2016-11-02_10h56_06_副本.png](https://qiita-image-store.s3.amazonaws.com/0/144302/bb2b11c9-bb96-03c4-de5d-19a0e822cb20.png)
ボタンをクリックします。
ステップ2：　データ管理画面に入る　＞　「オーディオ」から「音楽」または「プレイリスト」を任意選択します。
![2017-03-03_10h02_19.png](https://qiita-image-store.s3.amazonaws.com/0/144302/7ee96496-0ab5-c833-6173-7be066c6f080.png)
ステップ3：　選択した項目の管理画面に入る　＞　PCに移行したい音楽を選択　＞　右上にある「PCへ」ボタンをクリックすると、iPhoneからMac・Windowsに音楽を移しました。
![2017-03-03_10h07_56.png](https://qiita-image-store.s3.amazonaws.com/0/144302/e541fe81-249c-ac04-fc98-c701047fb3d2.png)

以上は以上はiPhoneからPCに音楽を転送する方法です。

この文章も提供元は：
https://www.imobie.jp/support/easy-way-to-transfer-music-from-iphone-to-pc.htm
postgresのスキーマ切り替え

急にpostgresを使う必要がでてきたので覚え書き

## CLIからスキーマ一覧の表示

```
\dn
```

## 現在のスキーマ

```
select current_schema();
```

## スキーマを変更する

```
SET search_path = my_schema;
```
python async/await curio

python [curio](http://curio.readthedocs.io/en/latest/) を試してみたよ。

基本的な考え方としては「async/await を使う」。つまり「タスクを作って回す」になる。タスクは `async` キーワードを付けた関数の形で宣言する。interactive shell では「タスクを回す」ものを用意して実行することになる。昔から `asyncio` があったけれども、`curio` でもよい。あるいは coroutine method を呼び出してもよい。

```pycon
>>> async def hello():
...     return "Hello"
...
>>> import curio
>>> curio.run(hello())
'Hello'
>>> import asyncio
>>> asyncio.get_event_loop().run_until_complete(hello())
'Hello'
>>> try:
...  hello().send(None)
... except StopIteration as e:
...  e.value
...
'Hello'
```

`curio` だと短くていいね。

こうなると `asyncio` と `curio` の比較になってくる。`asyncio` は async/await 構文ができる前からあることもあって、async/await に最適な設計というわけでは[ないようだ](https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/)。`curio` に慣れていくと、`asyncio` はガードレールのない高速道路のような感覚がしてくる。`uvloop` で[速くなるよ](https://magic.io/blog/uvloop-blazing-fast-python-networking/) と言われても、躊躇する。

asyncio 作者。https://www.youtube.com/watch?v=m28fiN9y_r8

curio 作者。Live coding が鮮やか https://www.youtube.com/watch?v=ZzfHjytDceU https://www.youtube.com/watch?v=MCs5OvhV9S4

一方で、async/await それ自体の癖も相当ある。標準ライブラリは暗黙的に `socket` オブジェクトを中で使うけれども、普通に使うと I/O がブロッキングモードになって、組み合わせるときに苦労する。標準ライブラリとは別に、`socket` を取り除いてあって、プロトコル部分に絞ってステートマシン的に使えるライブラリもある。例えば `h11` や hyper `h2` は async/await の中では比較的組み合わせやすい。

h2 作者。https://www.youtube.com/watch?v=7cC3_jGwl_U

この方向でいくつか試していくと、`monkey_patch` しない `gevent`, `eventlet` のような感じになってくる。`curio` との比較で言うと、monkey_patch で生じる激甚な副作用と便利さを秤にかける感じになるだろうか。

最後の最後まで問題になるのは database 接続。SQLAlchemy 使うユースケースはまだ模索中…。構造を持った大きなファイルを seek して回るパターンも良いプロトコルパーサを作るのは難しい。

ちなみに開発者ドキュメントに [Please, Don’t Use Curio!](http://curio.readthedocs.io/en/latest/devel.html#please-don-t-use-curio) と書いてあって、笑ってしまった。そうですねぇ……geventがPEP492な `__await__` を実装してくれれば、鬼に金棒なのだけど。asyncio で事故らない自信が持てないんだよなぁ。

TIPS
----

async/await 使う場合は await 漏れを検出できるのはありがたい。

```py3
if __name__=="__main__":
	import logging
	logging.getLogger("asyncio").setLevel(logging.DEBUG)
	import gc
	gc.set_debug(gc.DEBUG_UNCOLLECTABLE)
	loop = asyncio.get_event_loop()
	loop.set_debug(True)
	try:
		loop.run_forever()
	finally:
		loop.close()
```


# UPDATE
(2020-12-20) この後 [trio](https://github.com/python-trio/trio)も出てきて、最近は[anyio](https://github.com/agronholm/anyio)という選択肢もあります！
.gitignoreで除外されているファイルとトラッキングしていないファイルを実際に消す

.gitignoreで除外されているファイルとトラッキングしていないファイルを掃除したい。

```bash
# 確認
git clean -xn

# 削除
git clean -xf
```

これで綺麗さっぱり
Goのテストの初期化処理でハマったところ

MySQLやRabbitMQ、Redisなどに接続する処理があるサービスのテストを書こうとしたらハマった。
golang1.4から

```
func TestMain(m *testing.M)
```

という関数が定義されていればこれがまず実行されて、ここに初期化処理や終了時の処理を書けば良いということだったので、mainパッケージにmain_test.goのようなファイルを作り、envファイルのロードや、DBの接続を行う処理を書いた。
(参考：http://golang-jp.org/pkg/testing/ )


```go:main_test.go
package main

import (
"testing"
"github.com/my_account/my_worker/cmd"
"github.com/my_account/my_worker/models"
"os"
)

//Check variables @ config/env/test.env
func TestMain(m *testing.M) {
	before()
	code := m.Run()
	after()
    os.Exit(code)
}

func before(){
cmd.InitConfig() //環境変数のロード
models.InitDBConnection() //DB接続処理
}

func after(){
}
```

初期化処理ができたので、テスト書いていくかーと思い
models/aaa_test.goみたいなファイルを作り、テストを書いてみたが、どうもDBの接続に失敗しているらしく読み込んだはずの環境変数も取得できない。

```go:aaa_test.go

package models

import (
	"github.com/stretchr/testify/assert"
	"testing"
)

func TestIsWhiteListed(t *testing.T) {

  b := IsWhiteListed(123456, 34)
  assert.Equal(t, b, true, "they should be equal")

}
```

そもそもmain_test.goでの初期化処理が失敗してるのでは？と思いmain_test.goのbefore()関数の後で環境変数やパッケージのグローバル変数をチェックすると正しく処理できていた。
その後小一時間ほど悩んで試行錯誤している時に

```
m.Run()
```
を消してテストを実行したところ、models/aaa_test.goのテストが走ったので、これはもしかして・・と思い
models/init_test.goみたいなファイルを作り、ここにも

```go
func TestMain(m *testing.M)
```
を定義して、初期化処理を行ったら予想通りの動きをしくれた。
どうやら初期化処理を行いたい場合は、パッケージ毎に

```go
func TestMain(m *testing.M)
```
が必要らしい。
あと、環境変数のロードはgodotenv( https://github.com/joho/godotenv )を使っていたんだけど、どうやらテストが実行されるパッケージごとにカレントディレクトリが変わるらしく、repositoryのルートに.envを置いている場合は

```go
  godotenv.Load("../.env")
```

のようにしてロードしないとダメみたいです。
iOSで暗号化した文字列をPythonで復号する


## はじめに

今回の暗号技術については私の勉強という一貫というものも含まれていますので、間違い、こうすればもっとよくなる等あればコメント等よろしくお願いします:bow:

## 環境

- Xcode8.2.1
- macOS Sierra
- iOS10 (on Simulator)
- Swift3
- CocoaPods 1.1.1
- Python3.6

## 暗号化

今回はAESを使った暗号化を使用します。
いくらHTTPS通信であれMITM対策指定ない限りパスワードなどの送受信は平文で見えちゃいますからね。せめて暗号化しましょう。

実装はiOS側でします。

### ライブラリ

- CryptoSwift 0.6.7

適当にプロジェクトを作る
ライブラリのインストール

```bash:
$ pod init
```

```ruby:Podfile
pod 'CryptoSwift', '~> 0.6'
```

```bash:
$ pod install
```

### サンプルソース

```swift:Hoge.swift
import Foundation
import CryptoSwift  // ここを書いた時点で「⌘+B」しておくべきかも

class Hoge: NSObject {
    func hoge(_ text: String) {
        let bytes = [UInt8](text.utf8)
        // AESの鍵方式に合わせて各自変更
        let key = [UInt8]("12345678901234567890123456789012".utf8)
        let iv: [UInt8] = AES.randomIV(AES.blockSize)

        do {
            let aes = try AES(key: key, iv: iv, blockMode: .CBC)
            let encrypted = try aes.encrypt(bytes)
            let encryptedData = Data(bytes: encrypted, count: encrypted.count)
            let sendData = NSMutableData(bytes: iv, length: iv.count)
            sendData.append(encryptedData)
            let sendDataBase64 = sendData.base64EncodedString(options: .lineLength64Characters)
            print("Encrypt: \(sendDataBase64)")
            // Encrypt: rLKCA1hNmqu2dq+08E9mK2lBlspQN0+CYBkWkCQz7IvHhh+qbfysc26Oh1SS4Adq
        } catch let error {
            print("Error: \(error)")
        }
    }
}
```

というような感じで暗号化は一応できたかと思います。
今回使う文字列は「 __Lorem ipsum dolor sit amet__ 」です。
あとはAlamofireでサーバに飛ばすなりなんなりする。割愛します。

## 復号

基本的に暗号化が必要そうなサーバサイド作る時は私はDjangoを使っていますが、Django特有のところは触らないので悪しからず...

### ライブラリ

- Simple-AES-Cipher 1.0.0

とても簡単に暗号化及び復号処理が書けるのでおすすめです。

### サンプルソース

```python:decrypt.py
from simple_aes_cipher import AESCipher


encrypt = 'rLKCA1hNmqu2dq+08E9mK2lBlspQN0+CYBkWkCQz7IvHhh+qbfysc26Oh1SS4Adq'
cipher = AESCipher('12345678901234567890123456789012')
plain_text = cipher.decrypt(encrypt)

print(plain_text)  # Lorem ipsum dolor sit amet
```

無事復号できたようです:clap::clap::clap:

## 最後に

こうしたらいいぞぉ〜とかあればドシドシコメントや編集リクエストいただければと思います！
LT概観 ＆ 高橋メソッド ＆ Qiitaスライドモード & 今まで見た変なLT

## LT

---

## 1. LTとは何か

---

## ライトニングトーク

---

## イナズマ(Lightning)のように一瞬で話す(Talk)プレゼンテーション

---

## ５分で話すのが基本

---

## ポイント

---

## 緊張しない

---

## 早口で話す

---

## 練習する

---

# 練習する！！！

---

## ちなみに、内容が薄かったりする場合にオススメな表現方法が

---

# 高橋メソッド

---

## 高橋メソッド？

---

# ←これ

---

### 文字を大きく<br>文字だけで<br>の<br>プレゼン方法です。

---

# 利点

---

# わかりやすい

---

# 準備が早い

---

## 文字が出るので観衆の理解が早い

---

### 次

---

## 3. Qiitaスライドモード

---

## Qiitaを使ってmarkdownでなんとなくスライドショーが作れます

---

## 慣れれば5〜10分で

---

## 他人のLTを聞いてる間に用意できる

---

### 次

---

## 4. 今まで見た変なLT

---

## 技術系が多いですが、非技術系もあります

---

## 事例

---

## 食べれる虫を都内で取って食べた話

---


### うえぇ〜・・・

---

## 代々木公園でセミとか取って、油であげて食べたそうです

---

## 燻製の作り方

---

## 燻製の作り方

- 自家製でベーコンとかソーセージ作ってた
- なぜかエンジニアは燻製好きが多い…
- 自家製の燻製卵とかも美味しそう
  - 燻製を極める → 次は『低温調理』らしい
  - 低温調理とは肉の加熱に60度くらいで４時間とかで、半生風になるらしい

---

## エンジニア的彼女の作り方

---

## エンジニア的彼女の作り方

最終的にBOTを作る話だった。
自分のことを好きと言ったり、たわいない雑談をするBOTを自分で作る話。

---

## LTで多い事例

---

## 多い事例１：作ってみた

* スマホからFAX送れるようにしてみた
* レゴでロボットを作ってみた・・・

<br>

エンジニアが得意そうな分野だ

---

## 多い事例２：体験談 

* 会社を作って潰した話
* 残業１２０時間を超えた話・・・

---

## 多い事例３：ライフハック

* スマートウォッチ
* 朝活
* 子育て・・・

---

## 多い事例４：ジョーク

笑いを取れば勝ち！

---

## とにかく短い時間でプレゼンする

---

## プレゼン？

---

## とにかく気持ちを伝える！

---

## それがLT

---

<br>
<br>
　　　　　ありがとうございました

---
php5.6をインストールしようとしたらphp5.4が優先されてはまったときのメモ



#環境
CentOS7(Azure)
remi,epelリポジトリは追加済み


# php56をインストールしてみる
phpとremiリポジトリのphp56はインストール場所が異なる。
通常の `yum install php` 先
/usr/bin/php/
remi-php56版のインストール先
/opt/remi/php56/
参考：https://teratail.com/questions/41512
`. /opt/remi/php56/enable`
を実行すれば利用可能だがapacheとの連携どうするか分からないので諦め

# リポジトリの優先度を変更してインストール
参考：http://easyramble.com/add-repositories-and-set-priorities.html

```
vi /etc/yum.repos.d/CentOS-Base.repo
```
とりあえず `priority=99` に変更して `yum info php` で確認。
5.6が指定されたのでインストール。
終わったら `priority` を戻しておくのを忘れずに。
jsのonclickとaddEventListenerの動きが気になったのでサンプル書いた



最初にonclickとaddEventListenerのイベントを定義してあるbuttonを用意

「onclick上書き」でonclickイベントを上書きする
「addEvnetで追加」でaddEventListenerでclickイベントを追加する

clickを押すと処理順がわかる

[demo](https://ozepon.github.io/onclick_vs_addEventListener/)

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>onclick vs addeventListener</title>
</head>
<body>
  <button id="button">click</button>
  <button id="onclickUpdate">onclick上書き</button>
  <button id="addEventAdd">addEventで追加</button>
  <script>
    // buttonにonlickとaddEventListenerを設定する
    var button = document.getElementById('button');
    button.onclick = function(){ write('最初からあるonclick')};
    button.addEventListener('click', function() { write('最初からあるaddEventListener1')}); 
    button.addEventListener('click', function() { write('最初からあるaddEventListener2')}); 
    button.addEventListener('click', function() { write('最初からあるaddEventListener3')}); 

    // onclickを上書きする関数
    var onclickCount = 0;
    document.getElementById('onclickUpdate').onclick = function(){ 
      write('■■■■■■■■onclickイベント更新');
      onclickCount++;
      button.onclick = function() {
        write('onclickで: ' + onclickCount + "回目に更新したイベント");
      };
    }

    // addEventでイベントを追加
    var addEventCount = 0;
    document.getElementById('addEventAdd').onclick = function(){ 
      write('■■■■■■■■addEventListenerでイベント追加');
      addEventCount++;
      var message = 'addEventListenerで ' + addEventCount + "回目に追加したイベント";
      button.addEventListener('click', function() {
          write(message);
      }); 
    }

    // bodyに書き込む関数
    var write = function(message) {
      var div = document.createElement('div');
      div.innerText = message;
      document.body.appendChild(div);
    }
  </script>
</body>
</html>

```
docker で RStudio Server を起動し, bookdown で日本語 pdf を作成する.

以前 bookdown で日本語 PDF を出力する方法を

> <http://qiita.com/kenjimyzk/items/d15fe378159b654d4067>

に紹介しました. ここでは表題のように  `docker` で RStudio Server を起動し, `bookdown` で日本語 pdf を表示する方法を紹介します.

docker で RStudio Server を起動するやり方は知られていて, kazutan さんにより

> <http://qiita.com/kazutan/items/76c4b478293a5d81296b>

および

> <http://qiita.com/kazutan/items/f1447cbabed8d4dd50b8>

で紹介されてます. 基本は 

> <https://github.com/rocker-org/hadleyverse>

および

> <https://github.com/tokyor/rstudio>

を参考に作成しています. ただこれだけだと, bookdown で 日本語 PDF は出力できません. 最大の困難は Debian がインストールする texlive が 2014 のため色々必要なのものが導入されていないことです. 個別に導入してもよいかもしれませんが, わたしは

> <https://github.com/rchurchley/docker-texlive/>

を参考に, texlive 2016 を一括に導入する Dockerfile を作成することにしました. その Dockerfile は以下にあります.

> <https://hub.docker.com/r/kenjimyzk/rstudio-latex/~/dockerfile/>


# 使い方

まず Docker を導入する. そしてターミナル上で以下のコマンドを実行する.

    docker pull kenjimyzk/rstudio-latex

つぎに RStudio Server の作業ディレクトリ, 例えば ~/work を作成する. そしてターミナル上で以下のコマンドを実行する.

    docker run -d -p 8787:8787 -v ~/work:/home/rstudio/work kenjimyzk/rstudio-latex

そしてブラウザ上のアドレスで

    localhost:8787

とする. ログイン時にユーザー名とパスワードを聞かれるのでともに rstudio とする.

RStudio Server が立ち上がるので, [tools] => [shell] としてシェルを立ち上げる. そこで

    git clone https://github.com/kenjimyzk/bookdown_ja_template

とする. そうするとテンプレートがクローンできる.

RStudio Server の **Files ペイン** で, 先程クローンしたフォルダを開き,
`bookdown_ja_template` をクリックして, プロジェクトを立ち上げる.

RStudio Server の **Build ペイン** で, Build book をクリック. 最初, いくつかのパッケージを導入するために名前空間がおかしくなって上手くコンパイルしない場合があるかもしれないけれど, 少なくとも二度目で上手くいくようです.

なお, 最後のクローンや私がよく使うライブラリを事前に導入した dockerfile が以下にあります.
> <https://hub.docker.com/r/kenjimyzk/myrstudio/~/dockerfile/>


# まとめ

以上, Docker で booddown をつかって日本語 pdf を作成するやり方を紹介しました. xelatex や cairopdf ではフォントが機種依存になってしまうので, Docker を導入することでそれらが回避できます.

ただ現状 Docker コンテナが **6G** というありえない大きさになっています. 今後は

> <https://raw.githubusercontent.com/kenjimyzk/rstudio-latex/master/installation.profile>

を編集し, 導入パッケージの取捨選択し, サイズを小さくしたいと考えています.
IntelliJ の GUI から git push -f したい

Git で自分のリポジトリの作業ブランチを upstream の master にリベースしたとき、自分のリモートリポジトリにそのまま git push するとはじかれるので、`-f` をつけますよね。

```
git push -f origin my-working-branch
```

でもふだん IntelliJ 系のIDEを使っていると、CLI に行かずに `Cmd + Shift + K` で出るあの Push Commits ダイアログを使いたい。ショートカットでウインドウ表示、からの、プッシュ前の差分再レビューがすごくいいので。

というわけで、 GUI で `push -f` したい人は、 Version Control > Git > Allow force push をチェックします。

![allow-force-push.png](https://qiita-image-store.s3.amazonaws.com/0/11525/8fc7edcd-cb13-b1cd-0046-020d6c285e2c.png)

Push から Force Push を選べるようになります。

![force-push.png](https://qiita-image-store.s3.amazonaws.com/0/11525/65f0e837-3502-094f-4878-6748c625a121.png)

`-f` ありを簡単に行えるのが危険なのはわかってるけど、自分ブランチ+リベース+プルリクエストでチーム開発/OSS貢献やってると、どうしても自分のブランチには `-f` せざるをえない。なら、typo して「あっ...」ってなる CLI より、視覚化されてるほうがまだ安全なんじゃないかと思うのですね。

それでも、うっかり間違って `push -f` すると死ねるブランチは、Protected branches に登録しておきましょう。リモート側に強い権限のある人ほど、仕事の割り込みが多くて、ついつい master とか release にいるのを忘れて操作してしまいがちなので。
UEFI のセキュアブート機にNVIDIAのドライバを入れる話

調べると Ubuntu とか Mac ばっかり出て来るので CentOS 7 に入れてみた話。

CUDAのインストールとかは他の環境と同じ手順で入るので、
セキュアブートを突破するところに絞ってメモ。

# 環境

```
$ uname -a
Linux alienware1 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```

## セキュアブートかどうか確認

```
$ dmesg | grep Secure
[    0.000000] Secure boot enabled
[    1.492249] sdhci: Secure Digital Host Controller Interface driver
```

以下、セキュアブートだった場合の話。
違ったら普通にインストールできると思う。試せてないからわかんないけど。


# NVIDIA のドライバを入れるとき

詳細はここ。
http://us.download.nvidia.com/XFree86/Linux-x86/361.45.11/README/installdriver.html

`kernel-devel` とか `gcc` がたぶん必要なので適宜 yum で入れる。

## 以下手順＠2017/3/7現在

NVIDIAのサイトからLinux用のドライバを落としてきて

```
$ sudo sh NVIDIA-Linux-x86_64-375.39.run
```

とかやると、ターミナル上でインストール画面が立ち上がる。

kernel のソースのパスが見付からなくて失敗したら、
`--kernel-source-path /usr/src/kernels/3.10.0-514.6.2.el7.x86_64/`
みたいなオプションで教えてやるとよい。

DKMS は入れなくてもよいのでは（本題じゃないので調べてない


### セキュアブートの鍵

セキュアブートが有効になってると、署名なしのモジュールは起動時に読み込めないので、
X.509 のキーペアを自分で作るか、あるいはツールの中で作ってくれるか、選択できる。

![スクリーンショット 2017-03-07 16.50.28.png](https://qiita-image-store.s3.amazonaws.com/0/41925/039dfd42-a9f8-7abb-ade3-e389ee835a14.png)

今回は作ってもらって、

![スクリーンショット 2017-03-07 16.50.39.png](https://qiita-image-store.s3.amazonaws.com/0/41925/a5491e73-82b7-f2b1-c3d3-6650a8967d0f.png)

署名付きの private key は破棄。
![スクリーンショット 2017-03-07 16.50.53.png](https://qiita-image-store.s3.amazonaws.com/0/41925/83631d26-4c00-088b-b0c7-dcbef8ed2a96.png)

すると、こんなパスで公開鍵ができているはずなので、これをメモっておく。

`/usr/share/nvidia/nvidia-modsign-crt-XXXXXXXX.der`
`XXXXXXXX` のところはhex8桁の値が入ってるはず。

![スクリーンショット 2017-03-07 16.51.03.png](https://qiita-image-store.s3.amazonaws.com/0/41925/bd8b0f6f-e6bc-4c79-8af8-e7de8792af44.png)

あとはインストール画面に従って最後まで終わらせる。

### 公開鍵の登録

細かい話はこちら。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-signing-kernel-modules-for-secure-boot.html

先程メモったファイルに対して、こう。

```
$ sudo mokutil --import /usr/share/nvidia/nvidia-modsign-crt-XXXXXXXX.der
```

登録時にパスワードの設定が必要。

### enrollする

公開鍵の登録まで済んだら、おもむろにリブート。
モニタを繋げておく必要あり。

```
$ sudo reboot
```

OS起動画面になる前に、公開鍵をenrollする画面が出るはずなので、
ここで先程のパスワードを入力して、登録。

一度成功すれば大丈夫。

### 確認

```
$ nvidia-smi
```

でエラーが出なければOK。

以上です。
《JavaScript》ES6の分割代入のはじめかた。

分割代入は、配列とオブジェクトを分解して、要素とプロパティ値をひとつひとつの変数に分解するための構文です。

元々の仕様では個々の要素にアクセスし変数に格納する必要がありましたが、ES6の分割代入では記述を簡潔にまとめることができます。

## 配列の分割代入

代入先の変数を`[]`で配列のように囲って列挙して記述します。

```js

// 分割代入なし
// - - - - - - - -

var list = [10,20,30,40,50];

var item0 = list[0];
var item1 = list[1];
var item2 = list[2];
var item3 = list[3];
var item4 = list[4];

// 分割代入
// - - - - - - - -

let list = [10,20,30,40,50];
let [item0,item1,item2,item3,item4] = list;

```


### 配列の残りをまとめる

`...`演算子を使うと、個々の変数に割り当てられなかった残りの要素をまとめて配列として切り出すことが可能です。

```js

let list = [10,20,30,40,50];
let [item0,item1,...other] = list;

alert(other); // [30,40,50]

```


### 変数の値を入れ替える

分割代入を利用すると、変数の値を入れ替えることができます。

```js

let x = 500;
let y = 1000;

[x,y] = [y,x];

```

## オブジェクトの分割代入

配列で行った分割代入のように、オブジェクトのプロパティを変数に分解することもできます。

オブジェクトの場合は`{}`で囲った変数名で個々の変数に分解します。

変数の並び順はプロパティの定義順と違っていても、分解しないプロパティがあってもokで、対応するプロパティがない場合は無視されます。
無視された場合のデフォルト値を左辺で指定することができます。

```js

let nami = {
  name: 'Nami',
  age: 20,
  weapon: 'magic tact'
}

let {age, name, dream = 'making world map'} = nami;

```

`dream`にはプロパティが存在しなかったので、デフォルト値がセットされています。


### 入れ子のオブジェクト

入れ子になったオブジェクトは、オブジェクトとして変数に格納することも、`obj: {key}`という形で値を抽出することも可能です。

```js

let nami = {
  name: 'Nami',
  age: 20,
  hair: {
    length: 'long',
    color: 'orange'
  }
}

let {hair, hair:{color}} = nami;

console.log(color); // orange

```

### プロパティとは異なる変数へ代入

`key: newKey`と記述すると元のプロパティと異なる名前の変数に値を割り当てることが可能です。

```js

let nami = {
  name: 'Nami',
  age: 20,
  weapon: 'magic tact'
}

let {age: namiAge, name: namiName} = nami;

console.log(namiName); // Nami

```



おわります。
DirtyFlag

Game Programming Pattern 17のメモ

----

# アジェンダ

- DirtyFlagとは?
- 例
- 利用場面
- 注意点

----

# Dirty Flagとは

- Dirty Bit ともいう
- 対象データか見極めるための実装パターン

----

# 例

----

Q. 海賊船の位置管理問題

![structure_480.png](https://qiita-image-store.s3.amazonaws.com/0/15000/7c08deef-bb56-48fd-a775-b4cd3e569529.png)

----

相対変換情報
- 位置変換処理の利便性で必要
- (船移動で見張り台移動)

絶対変換情報
- 各Objectの世界座標を決定する
- 画面描画する際に必要

----

位置表現の親子階層

```
舟 (p,r,s)
└─ 見張り台 (p,r,s)
   └─ 船員 (p,r,s)
      └─ オーム (p,r,s)
```

p: position(x,y,z)
r: rotation(x,y,z)
s: scale(x,y,z)

----

オームの絶対変換情報は？

- 親の相対変換情報から求められる

```
船(p,r,s) x 見張り台(p,r,s) x 船員(p,r,s) x オウム(p,r,s)
```

----

1frameで全て動く状況を考える

- 船移動 => 計算
- 見張り台移動 => 計算
- 船員移動 => 計算
- オウム移動 => 計算

----

絶対変換情報の更新対象

| 移動元 | 更新対象 |
|----|----|
| 船 | 船,見張り台,船員,オウム |
| 見張り台 | 見張り台,船員,オウム
| 船員 | 船員,オウム |
| オウム | オウム |

----

無駄な計算

- オウム: +3回
- 船員: +2回
- 見張り台: +1回

----

解決策

- 計算を遅延する
- DirtyFlag (1bit) を各objectに割当
- DirtyFlag:True => 絶対変換が古い
- DirtyFlag:False => 絶対変換は最新

----

無駄のない計算

- DirtyFlagが立っている物体を親から順に計算
- 計算後にDirtyFlagを下げる

```
- 船,見張り台,船員,オウム移動
  - 船計算
    - 見張り台計算
      - 船員計算
        - オウム計算
```


----

# 利用場面

----

Angular
- サーバー送信必要か?をチェック

物理エンジン
- 物体が動いているかどうか？をチェック

GUIエディタ
- 一定時間ごとに編集済みか？をチェック

Unidux
- 状態が変わったかどうか？チェック

-----

# 注意点

-----

CPUコスト
- 計算遅延をしすぎると重くなるケースもある

メモリコスト
- メモリコスト >> CPUコスト の場合は利用しないほうがいい

DirtyFlag粒度
- 粒度でチェック時のオーバーヘッドが変わる
- 処理時間、送信量、bitサイズなど
Implementing functional languages を頑張って読む.22日目

# 22日目
構造型とか全部スコットエンコーディングでええやん.

### 2.7.4 Pairs
pair型を作る.
`MkPair = Pack{1,2}`
まだcase式がないので

```
f p =case p of
<1> a b -> b*a*a
```

みたいなことができないのでcasePairプリミティブを作る.

carとcdrは`car = casePair p K; cdr = casePair p F`みたいな感じ.自明.

#### Exercise 2.22
casePairのための状態遷移関数を完成させよ.通常では2つのルールが必要である:1つ目の引数が評価済みかそうでないかである.
上に書いてある必要な変更を実装せよ.
実装をテストせよ.

| h |   |
|---|---|
| a | **NPrim** casePair |
|ap | **NAp** a p |
|af | **NAp** ap f |
| p | **NData** 1 [x, y] |
|ap'| **NAp** a z|

| a : ap : af : [] | d | h[ap: **NAp** a p] | f |
|---|---|---|---|
| af : [] | d | h[af: **NAp** b y; b: **NAp** f x] | f |

| a : ap' : af : [] | d | h[ap': **NAp** a z] | f |
|---|---|---|---|
| z : [] | (ap' : af : []) : d | h | f |

`main = fst (snd (fst (MkPair (MkPair 1 (MkPair 2 3)) 4)))`で試したら2が出てきたから多分出来てる.

### 2.7.5 Lists
pairとlist何が違うの問題(scheme脳).まあn-タプル(n=2)とリストみたいなもんか.

casePairは1つの'継続'を取る.caseIfは2つの'継続'を取る.caseListはこれらの組み合わせである.

```
caseList Pack{1,0} cn cc = cn
caseList (Pack{2,2} x xs) cn cc = cc x xs
```

#### Exercise 2.23
Core-LanguageでのCons, Nil, head, tailの定義を書け.headとtailを定義するにあたり,abortというプリミティブが必要になるだろう.これはheadもしくはtailが空リストを受け取ったときに返す関数である.abortはとりあえずホスト言語の強制終了として実装すれば良い.

```
Nil = Pack{1, 0}
Cons = Pack{2, 2}
head l = caseList l abort head'
head' x xs = x
tail l = caseList l abort tail'
tail' x xs = xs
```

とする.FalseとNilが区別できないが意図したものか?
あとConsの第二引数はlist型が求められるが型解析してないのでill-formed listが作れて困るんじゃないか?

#### Exercise 2.24
caseListのための状態遷移関数を完成させよ.これとabortを実装し,preludeDefsにCons, Nil, head, tailを追加せよ.
実装をテストするために何らかのプログラムを書け.

| h |   |
|---|---|
| a | **NPrim** caseList |
|al | **NAp** a l |
|acn| **NAp** al fcn |
|acc| **NAp** acn fcc|
|an | **NAp** a n |
| n | **NData** 1 [] |
| l | **NData** 2 [x, y] |
|ap | **NAp** a z |

| a : an : acn : acc : [] | d | h[an: **NAp** a n] | f |
|---|---|---|---|
| acc : [] | d | h[acc: **NInd** fcn] | f |

| a : al : acn : acc : [] | d | h[al: **NAp** a l] | f |
|---|---|---|---|
| acc : [] | d | h[acc: **NAp** b y, b: **NAp** fcc x] | f |

| a : ap : acn : acc : [] | d | h[ap: **NAp** a z] | f |
|---|---|---|---|
| z : [] | (ap : acn : acc : []) : d | h | f |

#### Exercise 2.25
case式を実装せずに型ごとについてcaseプリミティブを実装する時の欠点は何か?
→新しい型を作るときに同時に実装しないといけないので面倒なのと,caseXXXという名前が増えて解りづらい,くらいか?

### 2.7.6 Printing lists
暗黙のうちに結果は数値だと思ってきたけどlist型追加したしlist型の可能性もあるよね.
副作用を持つプリミティブ,printとstopを実装する.`(printList main)`のようになるようにcompileを変更する.
新しい状態 _output_ を追加する,とか言いやがって分割代入で書かれた関数がどんだけ影響受けると思ってんだこの野郎.

#### Exercise 2.26
→やったぞこの野郎.これmainが数値を返すと死ぬからcompileは変更してないし,printの状態遷移ルールを足しただけで実際にはprintできないけどな.
role enable/disable 切り替え


条件によって，roleを利用するかどうか分岐する．

host_vars/hoge

```yml
role_enabled: "yes"
```

playbook

```yml
    - name: build role
      include_role:
        name: foo
      when:
        - foo_enabled == 'yes'
        - ansible_distribution == 'CentOS'
        - ansible_distribution_major_version == '7'
```

ところで，whenについている条件は and で繋がる．
gceventでgoogleカレンダーからイベントを取得するメモ

googleカレンダーのイベントを[gcevent](https://github.com/ogawatti/gcevent)を使って取得する。
下記参考サイトのサービスアカウント作成手順で変更された部分があったため、その部分を中心としたメモ。

# 参考サイト
- [rubyでgoogleカレンダーのイベントを取得するメモ](http://qiita.com/mechamogera/items/bf2ed20e332dc31d2352)

# 参考サイトとの相違点まとめ
- サービスアカウントの秘密鍵パスワード取得
- サービスアカウントの設定

# サービスアカウントの秘密鍵パスワード取得
- gceventを利用するため、サービスアカウント作成のキーのタイプで[P12]を選択

# サービスアカウントの設定
- サービスアカウントの作成後に編集で、[G Suite ドメイン全体の委任を有効にする]にチェックを入れる
  - サービスアカウントの作成段階では表示されなかったため作成後に変更
  
# GoogleカレンダーAPIアクセス確認
- 今回は[gcevent](https://github.com/ogawatti/gcevent)というgemを利用した

---

- gceventのgemをインストール

```
$ gem install gcevent
```

```ruby:this_week.rb
require 'gcevent'

Google::Calendar.id = "[カレンダーID]"
Google::Calendar.secret_key.path = "[秘密鍵のファイルのパス]"
Google::Calendar.secret_key.password = "[秘密鍵のパスワード]"
Google::Calendar.client_secret_path = "[JSONファイルのパス]"
Google::Calendar.client_email = "[サービスアカウントID]"
 
events = Google::Calendar::Event.this_week
 
events.each do |event|
  printf("%s,%s\n",event.start.date,event.summary)
end
```
TortoiseHgのdocdiffって、Excel比較で必ずエラーになるよね。

　とりあえず、自分用メモ。TortoiseHg 4.1(Windows x64)でのお話。

 WinでTortoiseHgな私は、以前から気になっていた事が...

「Excel比較、なんかエラー出るだけで使えないんですけど!!」

　イチイチdiffツールの選択画面が出てきて、Excel関連のファイルだとデフォルトでdocdiffが選択されるのもげんなり...

　という事で、ちょっくらちょっといじってみることに。

## デフォルト設定群は hgrc.d にあるのだ

　デフォルトのconfigは、TortoiseHgインストールフォルダ以下の、 hgrc.d 以下にワラワラ落ちている。ReadOnlyなので、attrib外さないと編集できません。

　デフォルトのマージツールを指定しているのは、`MergePatterns.rc`というファイルなので、ここに記述されているExcel関連ファイルの指定(`**.xlsx=docdiff` とか)をコメント化してしまうと、docdiffが選択される事は無くなる。

　他にも`MergeTools.rc`で、それぞれのMerge/Diffツールの挙動やパラメータについての記述がある。

```
hg showconfig merge-tools
```
とかやると、ダダダダ～っと出てくるやつら。docdiffの設定はTortoise版のみ入っていて、素のpython版Mercurialには入っていない。ここをいじれば...とも思ったが、docdiffのdiff用argumentは...

```:MergeTools.rc
docdiff.diffargs=$child $parent
```

超シンプル。
どこを直せと？

## エラー出してるのはdocdiffじゃなくて、比較スクリプトだから！！

　docdiffはpy2exeで固めたpythonスクリプトっぽいが、拡張子に応じてスクリプトを呼び出しているだけ。実際エラーもよく見ればWSHが出している。

　エラーを吐き出すのは処理実体のスクリプトファイル。`diff-scripts`以下に入ってる。

　なので、そちらを覗いてみる。Excelの比較スクリプトは`diff-xls.js`なので、ソースを眺めてみると...

```js:diff-xls.js
if (objScript.GetBaseName(sBaseDoc) === objScript.GetBaseName(sNewDoc))
{
    Abort("File '" + sBaseDoc + "' and '" + sNewDoc + "' is same file name.\nCannot compare the documents.", "Same file name");
}
```

って記述が...

ぉぃ。Scripting.FileSystemObject.GetBaseName()ってば、パスと拡張子抜きのファイル名でんがな。TortoiseHgの一時ファイルは**[元ファイル名.拡張子]~x1**とかだから、これじゃ毎回エラーになって当たり前...

...なので、

```js:diff-xls.js
if (objScript.GetFileName(sBaseDoc) === objScript.GetFileName(sNewDoc))
```
と、GetBaseName()の代わりにGetFileName()を使えば幸せになれるのでした。
(Tortoise svnは確かBaseName側が変更されて拡張子は変わらない仕様だったので、このスクリプトでも問題なかった)

　これ結構前のバージョンからそうだったと思うんだけど、diff-toolsなんてTortoise svnに入ってたから持ってきたけど、所詮オマケだからテストもしてないんだろか?? TortoiseHgのメニューから呼び出した場合は100%エラーだしね…^^;

　ちなみに、同名ファイルが開けないExcelのためにスクリプトにこんなチェックが入っているワケだけれども、他のスクリプトたちには同名チェックは入っていないと思うので、多分大丈夫。
プリント基板を発注するときに役立つスクリプト

###Eagleから出力したガーバーデータをまとめて圧縮

投稿するほどのものでもないが急いで作業してるとプロジェクトディレクトリがごちゃるので、こんな感じで圧縮する。
*EAGLEから出力されたガーバーデーター想定です。中国の工場に発注する場合は適当に拡張子を変えればいいだけ。

```shell-session:generate-pban.sh

echo "packing all gerber files to zip!"

mkdir $1
cp *.cmp *.gpi *.plc *.sol *.stc *.sts *.out $1/

zip $1.zip $1/*
echo "packing DONE!"

```

```shell-session:リンク
# 実行権限を与える
chmod a+x generate-pban.sh

# コマンド検索パスに保存．例えば
sudo ln -s generate-pban.sh /usr/local/bin/generate-pban

# 確認
which generate-pban
```


###使い方

```
$ generate-pban {$project_name}
```


他にもちょくちょく出てきそうなので更新していく
TomcatのSessionをRedisに外部永続化する方法

Sessionの外部永続化（Not Sticky Session）のためにどうしたら良いか？　というのがこのポストです。

## 環境

* Java 1.6.0_45
* Apache Tomcat 6.0.48
* Redis 3.2.7

```
$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

$ sh version.sh
Using CATALINA_BASE:   /opt/apache-tomcat-6.0.48
Using CATALINA_HOME:   /opt/apache-tomcat-6.0.48
Using CATALINA_TMPDIR: /opt/apache-tomcat-6.0.48/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/apache-tomcat-6.0.48/bin/bootstrap.jar
Server version: Apache Tomcat/6.0.48
Server built:   Nov 7 2016 20:05:27 UTC
Server number:  6.0.48.0
OS Name:        Linux
OS Version:     4.9.12-moby
Architecture:   amd64
JVM Version:    1.6.0_45-b06
JVM Vendor:     Sun Microsystems Inc.

$ redis-server --version
Redis server v=3.2.7 sha=00000000:0 malloc=jemalloc-4.4.0 bits=64 build=4b4d638eb6ec5175
```

## 対応

[jcoleman/tomcat-redis-session-manager: Redis-backed non-sticky session store for Apache Tomcat](https://github.com/jcoleman/tomcat-redis-session-manager)を利用します。

### Jar取得

* tomcat-redis-session-manager-1.2-tomcat-6.jar
    * [ここ](https://github.com/jcoleman/tomcat-redis-session-manager/downloads)から[ダウンロード](https://github.com/downloads/jcoleman/tomcat-redis-session-manager/tomcat-redis-session-manager-1.2-tomcat-6.jar)します。
* commons-pool-1.6.jar
    * [ここ](https://mvnrepository.com/artifact/commons-pool/commons-pool/1.6)から[ダウンロード](http://central.maven.org/maven2/commons-pool/commons-pool/1.6/commons-pool-1.6.jar)します。
* jedis-2.0.0.jar
    * [ここ](https://mvnrepository.com/artifact/redis.clients/jedis/2.0.0)から[ダウンロード](http://central.maven.org/maven2/redis/clients/jedis/2.0.0/jedis-2.0.0.jar)します。

### Jar配置

`${CATALINA_HOME}/bin`配下に取得したJarを配置します。

### Config変更

`${CATALINA_HOME}/conf`配下にある`context.xml`に以下を追記します。

```
    <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
    <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="${redis host}"
         port="${redis port}"
    />
```

`${redis host}`: RedisのHost
`${redis port}`: RedisのPort

これでSessionをRedisに永続化できるようになります。
SQLでWith句を２つ以上書くには？

メモ書き
SQLでWith句を2つ以上書く場合は下記のように書く
ポイントは、2つ目以降のWith句は,でつなぎ、先頭にWithをつけないこと

#with句を２つ以上書くサンプル
declare @FromDate varchar(7) = '2017/03';
declare @ToDate varchar(7) = '2017/04';
declare @FromDate2 varchar(7) = '2017/03';
declare @ToDate2 varchar(7) = '2017/04';

with NendoMonth as	
( 	
	select cast( @FromDate + '/01' as datetime ) as monthDate
	union all
	select dateadd( MONTH, 1, monthDate )
	from NendoMonth
	where NendoMonth.monthDate < @ToDate + '/01' 
)	
, NendoMonth2 as --,でつなぎ先頭にはwithをつけない	
(	
	select cast( @FromDate2 + '/01' as datetime ) as monthDate
	union all
	select dateadd( MONTH, 1, monthDate )
	from NendoMonth2
	where NendoMonth2.monthDate < @ToDate2 + '/01' 
)
ファイル末尾をつねに改行で終端させる IntelliJ 系の設定

ファイル末尾にかならず改行を入れる設定、IntelliJ 系で .editorconfig めんどくさい人はせめてこれをチェックしましょう。

![eof-lf.png](https://qiita-image-store.s3.amazonaws.com/0/11525/69ba147c-ea7b-13c6-6399-31b1f4783e6a.png)

Editor > General > Other
Ensure line feed at file end on Save

改行ないファイル末尾に行を足すとコミットがこうなるから:

```diff
  9 行目
- 10 行目
+ 10 行目
+ 11 行目
```

まあしのごの言わずに EditorConfig プラグイン使いましょう。変な diff を出さないように。

```:.editorconfig
insert_final_newline = true
```

[どんなエディタでもEditorConfigを使ってコードの統一性を高める
](http://qiita.com/naru0504/items/82f09881abaf3f4dc171)
オブジェクト指向，手続き型，関数型の考え方の違い

#どんな記事？
ふとコードを書いてて思ったのですが，使用するプログラミング言語によってコードの性質が変わってくるってお話です．ただの学生が書く話なので，細かいところに関しては目をつぶっていただけるとありがたいです笑．
また，この記事はパラダイムについて詳しく説明する記事ではなく，具体的な言語でコーディングしてみると違いがあるね，と確認する記事なので本格的にパラダイムを勉強したい方は他のページを御覧ください．

#言語ごとの考え方の違い
たとえば，引数にリストを取ってその中から奇数のもののみからなるリストを抽出することを考えます．
Javaだとこんな感じにかくのかなと思います．

```java
public class ListConverter{
	
	private List<Integer> list;
	
	public ListConverter(List<Integer> list) {
		this.list = new ArrayList<Integer> (list);
	}
	
	public List<Integer> makeOddList() {
		List<Integer> result = new ArrayList<Integer>();
		for(Integer i : list) {
			if(i % 2 == 1) result.add(i);
		}
		return result;
	}
}
```

Java8のStream使えよって感じですが，その場合こんな感じ．

```java

public class ListConverter{
	
	public List<Integer> list;
	
	public ListConverter(List<Integer> list) {
		this.list = new ArrayList<Integer> (list);
	}
	
	public List<Integer> makeOddList() {
		List<Integer> res = list.stream().
			filter(i -> (i % 2 == 1)).collect(Collectors.toList());
 		return res;
	}
}
```

それでこれらのコードに共通してるのが，引数のリストを破壊せずに新しいリストを返していることです．これはJava（やpythonなどの言語）にはGCが搭載されているので，メソッド内でnewされたインスタンスを明示的にfreeしなくていいからこんな風に書けますね．さらに，ListConverterクラスにリストを抽出してもらうという，オブジェクトに〜してもらうという感覚がオブジェクト指向っぽいのかなと思います．

一方，CやC++の場合，

```c++

void make_odd_list(const std::vector<int> &vec, std::vector<int> &res){
	for(auto i : vec){
		if(i % 2 == 1) res.push_back(i);
	}
}
```

こんな感じにあらかじめ結果を格納するオブジェクトを引数として受け取るなり，vecに上書きするなりする場合があります．これは関数内で新しくインスタンスを作成してそれを返すと，このインスタンスをfreeするのは呼び出し側の責任となり，呼び出し側は自分でnewしていないインスタンスに対してfreeを行うことになります．（なお，C++でもスマートポインタの機能を使えば，自動的にfreeを行うことができますが，あくまで一例としての話です）

さらに，関数型の言語Haskellでは，

```haskell

makeOddList:: [Int] -> [Int]
makeOddList [] = []
makeOddList (x:xs) 
	| (x `mod` 2 == 1) = x : makeOddList xs
	| otherwise = makeOddList xs
```

こんな感じになります．Haskellは再代入が禁止されているので，引数を破壊するということが起こりえません．また，Haskellは遅延評価なので，再帰のコードに対してメモリ使用量が抑えられ（ることがあり）ますがCやJavaで再帰を使いすぎるとメモリ使用量が不安になりますよね．

こんな風に単なるリスト操作でも各言語ごとにコーディングの違いがでてきておもしろいですね．

#まとめ
上で示したコードはあくまで一例ですが，使用するプログラミング言語ごとにコードの書き方に差が出る可能性があることがわかるかと思います．
コードを書くときに，言語や求められている状況にあったコーディングを意識したいですね．
Webpack2 と karma-webpack で出会った問題

webpack2 に移行してた時、karma-webpack で以下のエラーが出て、小一時間ハマった。

```
16:10:58.288:ERROR [preprocess]: Can not load "webpack"!
```

# やったこと

```diff
resolve: {
-  extensions: [ '', '.js' ],
+  extensions: [ '.js' ],
}
```

http://naughtldy.hatenablog.jp/entry/2017/02/25/080000
「extensions にemptyな '' を指定してはいけない」様子。`Can not load "webpack"!`じゃわからんぜ。。
Prepareness


「準備」と「用意」と「支度」

**意味**　将来何かを行う為に条件を整えることを指す

#### :twisted_rightwards_arrows: 比較 
|用意|準備|支度|
|:-----------|:------------|:------------|
|意図的な事|意図的ではないことに備える意味|「用意」と似てる|
|試験の用意をする|試験の準備をする|-|
|試験を**出題する側**が試験問題などを作ること|試験を**受ける側**が勉強して試験に備える|主に**食事**や**服装**に使います|

#### :1234: 例
1. 地震を向けて準備する。（「用意」不可）
    Chuẩn bị cho động đất. (động đất là điều không nằm trong ý đồ của tôi)

:paperclip: 「手配」と「整備」は、準備や用意の中の具体的な作業に使います。

|手配|整備|
|:-----------|:-----------|
|作業を**他の人**に手伝ってもらうよう計らうこと|**機械**などを準備すること|
Gulp + Webpack2 + BrowserSyncで開発環境を作る

# はじめに
`Vue2のディレクトリ構成を考える`という記事を以前書きましたが
http://qiita.com/kurosame/items/b3f5bee8ea73df025cb1

その時のフロントエンドの環境について
検討して構築した内容を書きたいと思います。

# ライブラリ検討
ローカル環境で開発する時は、以下のサイクルで開発しています。

① プログラムの変更
② 変更を監視してビルドして、公開フォルダに置く
③ ブラウザをリロード
④ プログラムの変更（①に戻る）

②と③の部分を自動化するために以下のライブラリを検討しました。

- `webpack-dev-server`
- `webpack-dev-middleware` + `webpack-hot-middleware`
- `gulp.watch` + `browser-sync`

ビルドに関してはWebpackにて行います。
（本記事ではwebpack.configについては書いていません）

`webpack-dev-server`が良さそうでしたが、
`webpack-dev-server`と`browser-sync`で検索してみると
`browser-sync`寄りな意見が目についたので、、

今回は`browser-sync`を使ってみることにします。

# watch & build
Gulpを使っている前提となってしまうのですが、
Gulpのビルドタスクは以下のように作っています。

```js:webpack.js
const gulp = require('gulp')
const webpackStream = require('webpack-stream')
const webpack = require('webpack')
const webpackConfig = require('../webpack.config')

module.exports = gulp.task('webpack', () => {
  return gulp.src('src')
    .pipe(webpackStream(webpackConfig, webpack)) // 第2引数にwebpackを渡すことで任意のバージョンが使える
    .pipe(gulp.dest('dist'))
})
```

GulpでWebpackを使う際は`webpack-stream`を使います。
前に確認した時は`webpack-stream`はWebpack1系だったと思うので、
2系を使いたい時などは、第2引数で任意のバージョンのwebpackを渡してあげれば、それが使えます。

続いてwatchタスクです。

```js:watch.js
const gulp = require('gulp')

module.exports = gulp.task('watch', () => {
  gulp.watch('src/**', () => {
    gulp.start('webpack')
  })
})
```

単純に`gulp.watch`でsrc配下を監視して、
更新があったら、webpackタスクを実行します。

これでsrc配下をwatchしてbuildすることができました。

# watch & reload

BrowserSyncを使ったブラウザ関連のタスクは以下のように作っています。
HTML5のHistoryAPIとプロキシを使ったパターンで作成しました。

```js:browserSync.js
const gulp = require('gulp')
const browserSync = require('browser-sync').create()
const history = require('connect-history-api-fallback')
const proxy = require('http-proxy-middleware')

// プロキシ設定
const proxies = proxy('/api', {
  target: 'http://aaa.bbb.example.com:1234',
  changeOrigin: true,
  logLevel: 'debug'
})

gulp.task('browserSync', () => {
  browserSync.init({
    port: 8000,
    browser: 'Google Chrome',
    server: {
      baseDir: 'dist',
      index: 'src/index.html',
      middleware: [history(), proxies]
    },
    https: true
  })

  gulp.watch('dist/**', () => {
    browserSync.reload()
  })
})
```

ここでも`gulp.watch`を使っています。
dist配下を監視して、更新があったらブラウザをリロードします。
ちなみにdistは公開ディレクトリです。

これでdist配下をwatchしてリロードすることができました。

後は`run-sequence`を使ってタスクを順次実行します。

```js
const runSequence = require('run-sequence')
runSequence('webpack', 'watch', 'browserSync')
```

# さいごに
Webpackを使っていない頃はGulpは必須でしたが、
Webpackを導入してからは、Gulpをやめる方向も考えています。

そうなると
・`webpack-dev-server`
・`browser-sync` + `webpack-dev-middleware` + `webpack-hot-middleware`
のどちらかがいいのかなと思っています。
技術書評「Docker入門」

![51o7DPq5kTL._SX258_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/20307/3cd72fe2-2dfb-2e51-cc35-179ebbf44730.jpeg)


Docker入門 末安 泰三

https://www.amazon.co.jp/Docker%E5%85%A5%E9%96%80-%E6%9C%AB%E5%AE%89-%E6%B3%B0%E4%B8%89/dp/480071091X



## 感想
- おすすめ 3/5
- AWS -> GCPへの移行プロジェクトでGKEでの運用を検討したときにDockerをちゃんと勉強したくて読んだ
- kindle版が安い
- 英語の公式docが辛い時に逆引き的に使える
  - 公式: https://docs.docker.com/engine/reference/run/#operator-exclusive-options

## メモ
### Part1 Dockerとは何か、なぜ注目されるのか
- 軽量な実行
- 柔軟なイメージ管理

### Part2 様々な環境へのDockerのインストール

### Part3 Dockerコマンドによるイメージ取得とコンテナ稼働
- イメージ, コンテナ, プロセス
  - イメージ: コンテナ実行に必要なファイルシステム
  - コンテナ: ホストOSと同じLinux環境を共有するが、ホストOSは隔離されたプログラム実行環境
  - プロセス: プログラムの実行状態

- コンテナ
  - コンテナを実行: コンテナ内部でプログラムを実行する
  - コンテナを停止: コンテナ内部で稼働させている全プロセスを停止する
  - Dockerでは1コンテナ1プロセスを推奨: シンプルになる

- サーバー、クライアント
  - サーバーモード: イメージやコンテナの管理、レジストリと通信
  - クライアントモード: コマンドの実行

- 既存のイメージにファイル追加変更のレイヤーを追加してイメージ生成できる
- 逆にコンテナからイメージもできる

### Part4 Dockerfileからのイメージ生成とプライベートレジストリの活用
- できるだけシンプルなイメージの生成を目指す
- 1コンテナ1プロセスが理想
- 1行ごとに中間イメージをキャッシュする
  - —no-cacheでキャッシュしない

### Part5 複数コンテナの連携とDocker Composeを使ったサービス管理
ASP.NET Core を試す @VS2017


# はじめに

以前VSCodeを使った手順を書きましたが、
今度はVisualStudio本家を使った方法。


RC時に書いたものですが、
リリースされたものでも同じ手順でOKでした。

# 下準備

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

https://www.visualstudio.com/ja/downloads/

インストール時に「.NET Core 」を選択するのを忘れずに。


# 起動

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/ea9f2577-03b0-e9e9-1404-9f8592b1ead7.png)

### プロジェクトの新規作成

「新規作成」 > 「プロジェクト」を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/69413f57-a591-d385-776e-98ef47fb4a4e.png)

※「Webサイト」を選ぶと従来の.NET Framework 4.xになるので注意

### .NET Core Webアプリケーションを選択

「VisualC#」>「 .NET Core」 > 「ASP.NET Core Webアプリケーション」を選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/64d6edb1-c099-1f57-2d68-77c8311f931e.png)

プロジェクト名を入れるのを忘れずに。
入力したら「OK」

### テンプレートの選択

サンプル動かしたいので、テンプレート「Webアプリケーション」を選びます。

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/28144111-af5d-26ae-1080-2e100fe77535.png)

せっかくなのでASP.NET Coreのバージョンもv1.1にしてみよう。
※写真はDockerサポートをONにしていますが外してください。（面倒なので）


### サンプルアプリ、できあがりっ！

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/13a8350e-6f8b-1ff4-9406-1acf0ca1b56a.png)

### 起動する

![image](https://qiita-image-store.s3.amazonaws.com/0/97156/5ad720c9-964d-245f-de6b-4adffb0512f9.png)


ここまできたらサンプル作成まで完了。