OmniAICreator/Qiita-1.07M huggingface dataset:
DjangoのCSRF周りの設定

Django 1.11.6版です

[前の記事](https://qiita.com/jp_ibis/items/0ac1ba8aba1398f2a492)でCSRF周りの内容がスッポリ抜けていたので、追加メモです。

送信フォームでの設定
===
基本中の基本ですね。テンプレートの中に{% csrf_token %}を入れておけば終わりです。

```html
<form action="auth" method="post">
	{% csrf_token %}
```
実際のHTMLでは{% csrf_token %}が

```html
<input type='hidden' name='csrfmiddlewaretoken' value='値' />
```
と展開されます。


Ajaxでの設定
===
TypeScriptで書いていますが、ほとんどJavaScriptそのままで動くかと思います。ただしfindのところでUnderscore使ってますので、使わない場合はfindの代わりの実装が必要です。

Djangoからページを取得した時のHTTPレスポンスのcookieにCSRFの情報が格納されています。

JavaScriptからはdocument.cookieよりcsrftokenというパラメータ名で取得できるので、POSTする時にcsrftokenの内容をX-CSRFTokenという名前でHTTPのヘッダに設定して送り返します。

```javascript
let xhr = new XMLHttpRequest();
xhr.open("POST", "api");

// 送るデータの設定
let params:any = {
};

// for Django
// ------------------------------------------------
let CSRF_KEY_NAME="csrftoken=";
let csrf = _.find(document.cookie.split(";"), (cookie)=>{
	return cookie.trim().substr(0, CSRF_KEY_NAME.length) == CSRF_KEY_NAME;
})
if(csrf) xhr.setRequestHeader("X-CSRFToken", csrf.trim().substr(CSRF_KEY_NAME.length));
// ------------------------------------------------

xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(params));
```
※document.cookieは;区切り。;の後にスペースもあるのでtrimして使ってます

なお、ここではあまり関係がないのですがついでなので……
**Pythonでfind**

```python
next((val for val in リスト if 条件), デフォルト値)
```
で、最初の条件にマッチしたリストの中身を返し、リストに無ければデフォルト値を返します。

タプルの内包表記はPython3だと遅延評価になるので(generatorが返る)速度も優秀です。


テストでCSRFを無効にする
===
テストの時はCSRF認証を止めてPOSTすることができます。

```python
from django.test.client import Client
client = Client(enforce_csrf_checks=False)
※公式ドキュメント読んだらデフォルトがFalseだとか(´・ω・｀)ｼﾞﾂﾊｲﾗﾅｲ

# パスワード無し時の動作テスト
result = client.post('/account/auth', {"user":"unknown_user"})
self.assertEqual(result.status_code, 403)
```
クロージャ(Closure)

業務でJavascriptのクロージャを勉強する機会があったので、
まとめておく。

①クロージャの概要
②具体的なプログラム
③クロージャのポイント
④クロージャの特徴とメリット
⑤クロージャの深い理解
⑥クロージャとメモリの関係

### ①クロージャの概要

>クロージャは、独立した (自由な) 変数を参照する関数です。言い換えるとクロージャ内で定義された関数は、自身が作成された環境を '覚えています'。

他には、

>クロージャ（クロージャー、英語: closure）、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数で実現している。引数以外の変数を実行時の環境ではなく、自身が定義された環境（静的スコープ）において解決することを特徴とする。

といった定義があります。
どうやら、*closure(閉鎖、締め切り、閉店)*といった意味も踏まえると、
閉ざされた空間で環境を保持していることが伺えます。

### ②具体的なプログラム

```javascript:closure.js
function closure(){ 
  var cnt = 0; 
  return function(){ 
    return ++cnt;
  }
}
var f = closure(); //関数closureを変数fに代入
console.log(f()); //1
console.log(f()); //2
console.log(f()); //3
console.log(f()); //4
```
closure.jsは、
console.log(f());で、関数f()を実行する度に、出力される数字が
1ずつ上がっていっています。
このように、**関数f()が変数(数値)の値を保持している機能**をクロージャと呼びます。

### ③クロージャのポイント

クロージャであるポイントは、以下の4つです。

A.関数の中に関数を作ること(関数closureの中に関数functionを作成)
B.外側の関数内に変数を定義する(関数closure内に変数cntを定義)
C.関数の中で入れ子になった関数内関数を返り値として返す(returnで関数functionを返している)
D.内側の関数からローカル変数を参照(関数function内でcntを参照)

### ④クロージャの特徴とメリット

クロージャの特徴として、**値を保持しつづけることができる**、**処理をまとめて記述できる**のでプログラムの構造がわかりやすいといったメリットがあります。

グローバル変数だと、名前の衝突といった問題がありますが、クロージャだとそれを解決してくれます。

### ⑤クロージャの深い理解

なんで、このような機能をもてるようになるのか？
これは、Javascriptの変数スコープの話や、関数ルールがそうさせています。
このサイトに詳しく書かれています。
http://analogic.jp/closure/

### ⑥クロージャとメモリの関係

クロージャを多用しすぎると、メモリが足りなくなることが起こりうるので、
メモリの使用を抑えたい場合は、極力使用しないほうがいいそうです。
これは、分かれば追記しようかなと思います。

### 以下のサイト・本を参考にしました。

http://analogic.jp/closure/
https://qiita.com/takeharu/items/4975031faf6f7baf077a
https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures
[脱初心者のためのプログラミング教本](https://www.amazon.co.jp/%E8%84%B1%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E6%95%99%E6%9C%AC-%E6%97%A5%E7%B5%8CBP%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%99%E3%82%B9%E3%83%88%E3%83%A0%E3%83%83%E3%82%AF-%E6%97%A5%E7%B5%8C%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A8%E3%82%A2/dp/4822277232)
【PHP】カタカナを、全銀フォーマットに対応した文字列に変換


# 概要
タイトル通り、カタカナを、全銀フォーマットに対応した文字列に変換する関数です。付け焼き刃なので、参考程度に・・・。

# 実装

```
/**
 * 与えられた文字列を全銀フォーマットに変換
 * @param string $kana 変換前文字列（カタカナ）
 * @return string 全銀フォーマット対応文字列
 */
public function get_zengin_format($kana) {
	// 全銀フォーマットの利用可能文字以外を除外するための正規表現(preg_replace用)
	$_zengin_pattern = '/[^0-9A-Zｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟ\(\)｢｣\/\-\.\\ ]/u';

	// 全銀フォーマット 特定文字列の置換リスト
	$_zengin_replace_from = array('ｰ');
	$_zengin_replace_to = array('-');

	// アルファベットを大文字化、全文字を半角化、特定文字を置換、全銀フォーマット外の文字を除去
	$kana = strtoupper($kana);
	$kana = mb_convert_kana($kana, 'khsa');
	$kana = str_replace($_zengin_replace_from, $_zengin_replace_to, $kana);
	$kana = preg_replace($_zengin_pattern, '', $kana);

	return $kana;
}
```
MySQLのGROUP_CONCAT関数の結果が切れる事象の対策


# 概要

MySQLのGROUP_CONCAT関数を使う場合、出力結果の文字列の文字数が1024文字を超えると、それ以降が出力されず、意図しない結果になってしまいます。これを、解消します。

# 原因
my.cnfに `group_concat_max_len` という設定があり、このデフォルト値が1024文字担っているのが原因。なので、これを変更してMySQLを再起動してあげれば、OK。

# 対応内容

1. my.cnfに以下を追記。設定値は、大丈夫だと思う文字数（適当でごめんなさい・・・）

    ```my.cnf
[mysqld]
group_concat_max_len=100000
```

2. MySQLを再起動

<hr>

以上です。ちなみに、とりあえずの設定（動作確認など）の場合は以下のクエリでOK

```
# 現在の設定値を確認
show variables like 'group_concat_max_len';
# 一時的に設定値を変更
set global group_concat_max_len = 100000;
```
Excelで数値の先頭に0をつける

なにかしらのキー(4桁以上7桁未満)が利便的にまとめられているけど、
先頭4文字(先頭から0を含む0001など)と後半3文字に分割して処理したいケースを想定。
※文字を切り出して少し離れたセルに出力してますが、非表示にすれば良いかと

Sub moji_trans()
Dim i As Long
Dim v_str As String

With Sheets("sheet1")
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
後半3文字を削除して前半4文字だけ切り出し
.Cells(i, 10) = Replace(.Cells(i, 1), Right(.Cells(i, 1), 3), "")
後半３文字だけ切り出し
.Cells(i, 11) = Right(.Cells(i, 1), 3)

セルの書式を文字列に指定
.Cells(i, 4).NumberFormatLocal = "@"
.Cells(i, 5).NumberFormatLocal = "@"

先頭に0をつける処理
.Cells(i, 4) = WorksheetFunction.Text(.Cells(i, 10), "0000")
.Cells(i, 5) = WorksheetFunction.Text(.Cells(i, 11), "000")
Next
End With
End Sub
【Terraform】インスタンスが作成できない。（Error launching source instance: OptInRequire）

#エラー
main.tfを作成して、`terraform apply`をしたら、下記エラーが出ました。
AWSのコンソールで確認すると、EC2インスタンスのみ作成されていないようでした。
→セキュリティグループやVPCなど、インスタンスに依存しない部分は作成されていました。

```
Error applying plan:

1 error(s) occurred:

* aws_instance.TestEC2: 1 error(s) occurred:

* aws_instance.TestEC2: Error launching source instance: OptInRequired: In order to use this AWS Marketplace product you need to accept terms and subscribe. To do so please visit http://aws.amazon.com/marketplace/pp?sku=aw0evgkw8e5c1q413zgy5pjce
	status code: 401, request id: 845acf0d-7dec-4ebd-b4b4-a4771f04ea16

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.
```


#解決方法
AWS Marketplaceで認証を許可してから、再度`terraform apply`を実行！

1.まずは、エラーに書いてあったWebページに移動し、[continue]を押下します。

```
To do so please visit http://aws.amazon.com/marketplace/pp?sku=aw0evgkw8e5c1q413zgy5pjce
```

<img width="1099" alt="スクリーンショット 2017-10-29 14.00.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/cb9bbdea-3154-f564-a6a1-e696bb10898f.png">


2.[Manual　Launch]を選択し、[Accept Software Terms]を押下します。

<img width="1098" alt="スクリーンショット 2017-10-29 14.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/1fd67ec8-8c6d-4f5d-c831-35fb58c24e92.png">


3.下記画面が出たら成功です！

<img width="934" alt="スクリーンショット 2017-10-29 14.04.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/168635/47c31073-4ecc-27c8-cf5a-f148d2620071.png">

再度`terraform apply`して、問題なければ完了！
collection_selectにインスタンス変数を渡すと、undefined method `map' for nil:NilClass が発生するエラー

#　実装内容
登録機能、編集機能などを実装中、名前などを空にして、validationでエラーメッセージを表示させようとしたときに発生しました。

viewではRailsのcollection_selectを使って、セレクトボックスを実装しています。
下記のコードを edit にも書いております。

```ruby:controller#new

def new
  @takumis = Takumi.all
end 

```

```ruby:view
.ui.grid
 .wide.column
   = c.label :name
   = c.collection_select :name, @takumis, :id, :name, include_blank: '選択してください'
 
```


# 発生したエラー

`undefined method `map' for nil:NilClass`

インスタンス変数で渡している場所を、@takumis => Takumi.allと書き直せばエラーは解消されます。
しかし、controllerとviewの責務にそって表示させたい時などは　インスタンスで定義したいと思うこともあるでしょう。

```ruby:変更後のview
.ui.grid
 .wide.column
   = c.label :name
   = c.collection_select :name, Takumi.all, :id, :name, include_blank: '選択してください'
```

# 解決方法
 @takumisを create updateなどにも持たせる必要がある。
 同じコントローラーに下記の様な形で追加しました。
 before_actionなどを使えば DRYになるかと....

 理由は現在も調査中でございます！すいません😱

```ruby:controller
before_action :set_takumis, only: [:new, :create, :edit, :update]

private

def set_takumis
  @takumis = Takumi.all
end
```


# 参考

https://qiita.com/shyamahira/items/30e56d8057edcd85ca2d
https://stackoverflow.com/questions/31734189/rails-undefined-method-map-for-nilnilclass-form-collection-select
iOSで数字の増減をアニメーションさせる

# 環境
- Xcode 9.0 Build version 9A235
- Swift4

# やりたいこと
数字が変化した時に、変化を分かりやすくするためアニメーションさせたい。
こんな感じ

![gif](https://raw.githubusercontent.com/satorun/CountAnimationLabel/b332d008a8464d8845fa1612e894f13e2e28e1ed/countupMov.gif)

# 実装方法
- CADisplayLinkを利用して画面描画毎に現在の値を表示するという方法で実装
- UILabelを継承した専用のクラスを実装。extensionで済ませたかったが、都度実行されるメソッドをselectorとして渡す必要があるため、各パラメータをプロパティにしてラベル自身に持たせて受け渡し

# コード
```Swift

class CountAnimationLabel: UILabel {
    
    var startTime: CFTimeInterval!
    
    var fromValue: Int!
    var toValue: Int!
    var duration: TimeInterval!
    
    func animate(from fromValue: Int, to toValue: Int, duration: TimeInterval) {
        text = "\(fromValue)"
        
        // 開始時間を保存
        self.startTime = CACurrentMediaTime()
        
        self.fromValue = fromValue
        self.toValue = toValue
        self.duration = duration
        
        // CADisplayLinkの生成
        let link = CADisplayLink(target: self, selector: #selector(updateValue))
        link.add(to: .current, forMode: .commonModes)
    }
    
    // 描画タイミング毎に呼ばれるメソッド
    @objc func updateValue(link: CADisplayLink) {
        // 開始からの進捗 0.0 〜 1.0くらい
        let dt = (link.timestamp - self.startTime) / duration

        // 終了時に最後の値を入れてCADisplayLinkを破棄
        if dt >= 1.0 {
            text = "\(toValue!)"
            link.invalidate()
            return
        }

        // 最初の値に進捗に応じた値を足して現在の値を計算
        let current = Int(Double(toValue - fromValue) * dt) + fromValue
        text = "\(current)"
    }
}
```

# 追記
等幅フォントにするときれいにみえるよ！

# github
https://github.com/satorun/CountAnimationLabel

# 参考
- https://qiita.com/peromasamune/items/a377b9c94c1f5d6eb355
    - ほぼこちらのSwift化です:bow:
- https://developer.apple.com/documentation/quartzcore/cadisplaylink
Elixirの環境をセットアップする


## 何をするの
ちょっとElixirを触ってみたくなったので、環境構築を備忘録をつけつつ行います。
言語のバージョン管理はanyenvで行なっているため、単一バージョンが欲しい方は別の記事を読んだ方が良いかもしません。

## 環境
```
MacBook Pro (15-inch, 2016)
macOS High Sierra
```

## セットアップ
### Install erlang
Elixirを動かすためにErlangの環境を構築する必要がある。

> Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語である。ElixirはErlangで実装されているため、分散システム、耐障害性、ソフトリアルタイムシステム等の機能を使用することができるが、拡張機能として、マクロを使ったメタプログラミング、そしてポリモーフィズムなどのプログラミング・パラダイムもプロトコルを介して実装されている。

[wikipedia](https://ja.wikipedia.org/wiki/Elixir_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))

Erlangにはインストールコマンドがないので、ビルドを自分で行います。

```zsh:
# install erlanv
❯ anyenv install erlenv

# Erlangのビルドに依存しそうなものをbrewで入れる
❯ brew install unixodbc wxmac fop
❯ brew install kerl
❯ kerl list releases
R10B-0 R10B-10 R10B-1a R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8 R10B-9 R11B-0 R11B-1 R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3 R12B-4 R12B-5 R13A R13B01 R13B02-1 R13B02 R13B03 R13B04 R13B R14A R14B01 R14B02 R14B03 R14B04 R14B R14B_erts-5.8.1.1 R15B01 R15B02 R15B02_with_MSVCR100_installer_fix R15B03-1 R15B03 R15B R16A_RELEASE_CANDIDATE R16B01 R16B02 R16B03-1 R16B03 R16B 17.0-rc1 17.0-rc2 17.0 17.1 17.3 17.4 17.5 18.0 18.1 18.2 18.2.1 18.3 19.0 19.1 19.2 19.3 20.0 20.1
Run '/usr/local/bin/kerl update releases' to update this list from erlang.org

# 最新版をbuild
❯ kerl build 20.1 20.1
...
Erlang/OTP 20.1 (20.1) has been successfully built

❯ kerl install 20.1 $ANYENV_ROOT/envs/erlenv/releases/20.1

❯ erl --version
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.1  (abort with ^G)
1>
```

ここまででErlangがインストールできました。

### Install Elixir

Elixirをインストールしていきます。

```zsh:
❯ anyenv install exenv
❯ exenv install -l
Available versions:
  1.5.2/Docs.zip
  1.5.2
  1.5.1/Docs.zip
  1.5.1
...
# 最新の1.5.2をインストールする
❯ exenv install 1.5.2
❯ exenv global 1.5.2
❯ exenv rehash
❯ elixir -v
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]

Elixir 1.5.2
```

### Interactive mode

```erl:
iex(1)> 100 + 50
150
iex(2)> "Hello" <> "World"
"HelloWorld"
```

### Run Script

```zsh:
❯ cat hello_world.exs
IO.puts "Hello World from Elixir"
❯ elixir hello_world.exs
Hello World from Elixir
```

### ついでに
パッケージ管理ツールのhexとフレームワークのPhoenixをインストールしておきます。

PhoenixはRuby on Railsに該当します。

Phoenix プロジェクトの生成はElixir付随のmixコマンドで行います。

```zsh:
❯ mix local.hex
Found existing entry: /Users/ryota/.mix/archives/hex-0.17.1
Are you sure you want to replace it with "https://repo.hex.pm/installs/1.5.0/hex-0.17.1.ez"? [Yn] Y
* creating /Users/ryota/.mix/archives/hex-0.17.1
❯ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
Found existing entry: /Users/ryota/.mix/archives/phoenix_new
Are you sure you want to replace it with "https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez"? [Yn] Y
* creating /Users/ryota/.mix/archives/phoenix_new
```

これで、webアプリケーションを作成する準備は完了です。
Xorshift のGoでの実装 (３２ビット版だけ）

# 本日は

Go の練習がてらXorshiftを実装してみます．

# 実装例(struct を使う場合)

```go
package main

import "fmt"

type xorshift32 struct {
	seed uint32
}

func (r *xorshift32) rand() uint32 {
	y := r.seed
	y = y ^ (y << 13)
	y = y ^ (y >> 17)
	y = y ^ (y << 5)
	r.seed = y
	return y
}

func uniform(generator xorshift32) func() float32 {
	inner := func() float32 {
		return float32(generator.rand()) / float32(^uint32(0))
	}
	return inner
}

func calcPi() {
	xor32 := xorshift32{seed: 2463534242}
	u01 := uniform(xor32)
	N := 100000000
	counter := 0
	for i := 0; i < N; i++ {
		x := u01()
		y := u01()
		if x*x+y*y < 1.0 {
			counter += 1
		}
	}
	fmt.Println(4 * float64(counter) / float64(N))
}

func test1() {
	xor32 := xorshift32{seed: 2463534242}
	for i := 0; i < 10; i++ {
		fmt.Println(xor32.rand())
	}
}

func main() {
	test1()
	calcPi()
}
```

xor32.rand() を複数呼び出す際に `seed`,`y` の値を記録しておく必要があるので `struct` を使いました．ポインターレシーバーのの良い練習になりました．

# 実装例（クロージャを用いた場合）

[Xorshift の Python 実装](https://qiita.com/SatoshiTerasaki/items/e101d4c0e2e9e0e55663)
にならって書いた場合です．

```go
package main

import "fmt"

func randXorshit32(seed uint32) func() uint32 {
	var y uint32 = seed
	inner := func() uint32 {
		y = y ^ (y << 13)
		y = y ^ (y >> 17)
		y = y ^ (y << 5)
		return y
	}
	return inner
}

func uniform(generator func() uint32) func() float32 {
	inner := func() float32 {
		return float32(generator()) / float32(^uint32(0))
	}
	return inner
}

func calcPi() {
	xor32 := randXorshit32(2463534242)
	u01 := uniform(xor32)
	N := 100000000
	counter := 0
	for i := 0; i < N; i++ {
		x := u01()
		y := u01()
		if x*x+y*y < 1.0 {
			counter += 1
		}
	}
	fmt.Println(4 * float64(counter) / float64(N))
}

func test1() {
	xor32 := randXorshit32(2463534242)
	for i := 0; i < 10; i++ {
		fmt.Println(xor32())
	}

}

func main() {
	test1()
	calcPi()
}
```

#書いていて思ったこと

Pythonに慣れてしまった人間から見るとGoがデフォルト引数をサポートしていないというのがとても不便に感じてしまします．

- [Default value in Go's method](https://stackoverflow.com/questions/19612449/default-value-in-gos-method)
- [Does function or method support argument default value?](https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ)
- [Default Value in structs?](https://www.reddit.com/r/golang/comments/1xbxzk/default_value_in_structs/)

そういうもんなんだろうな・・・．
PDFやreveal.jsからpptxに変換(より良い方法)

# 動機
パワポ嫌い！
下手だから上司が「フォント揃ってないね、舐めてるの？」とか言う！
だけど、reveal.js使ったら「何故パワポじゃないの？舐めてるの？」とか言う！
辛い(´；ω；｀)

# reveal.jsから場合
chromeでreveal.jsを開き、アドレス欄の末尾の
スラッシュとシャープを消して、?print-pdfを追加します。
すると印刷しても崩れなくなります。

印刷画面を出して、余白は無し、背景有りにします。
プレビューが綺麗になっていたらpdfとしてプリントします。

# PDFから
ImageMagikを使って全部pngにして、
そのpngをpython-pptxでくっつけていけば良いです。
必要物品を入れます。

```bash
brew install imagemagick
brew install gs
pip install python-pptx
```
具体的には下記のようなコード書きました。
https://github.com/uesseu/pdf2pptx

```python
from pptx import Presentation
from pptx.util import Inches
import sys
import os
import shutil


def main():
    fpath = sys.argv[1]
    out_file = sys.argv[2]
    tmp_dir = 'tmp'
    while(True):
        if os.path.exists('./' + tmp_dir):
            tmp_dir = tmp_dir + '_'
        else:
            break
    os.mkdir('./' + tmp_dir)
    tmp_img = './' + tmp_dir + '/tmp.png'
    os.system('convert ' + fpath + ' ' + tmp_img)
    pics_len = len(os.listdir('./' + tmp_dir))
    pics = ['./tmp-' + str(n) + '.png' for n in range(pics_len)]
    prs = Presentation()
    for pic in pics:
        blank_slide_layout = prs.slide_layouts[6]
        slide = prs.slides.add_slide(blank_slide_layout)
        left = top = Inches(0)
        left = Inches(0)
        pic = slide.shapes.add_picture('./' + tmp_dir + '/' + pic, left, top)
    prs.save(out_file)
    shutil.rmtree('./' + tmp_dir)


if __name__ == "__main__":
    main()
```
で、こいつを走らせれば変換できました。

```bash
python pdf2pptx.py in.pdf out.pptx
```

以上です…叩かないで…叩かないで…
機械学習のための数学メモ #1

復習と頭の整理のためにメモとして書いていきます。

#どうして機械学習が注目されるようになったか。

大量のデータを収集できる環境が整ってきた
大量のデータを処理できる環境が整ってきた
 

#機械学習が得意とするタスク

##教師あり学習
###**回帰（Regression）**
時系列データ（時間的な変化を連続的に観測したデータ）
株価、身長、体重など
###**分類（Classification）**
スパムメールか否か
分類先が２つしかないもの => 二値分類
３つ以上に分類する問題　=> 多値分類 （MNISTなど）
##教師なし学習
###**クラスタリング（Clustering）**
ラベルがついていない（正解データが与えられていない）分類


[=> 機械学習のための数学メモ #2 回帰について](https://qiita.com/anzunba/items/760f37bfc42b5bfbf97b)
Virtual Box（Windows 10 home）にCentOSをインストールしてみる

#はじめに
Windows 10 homeの環境にCent OSを導入することを目的として、[前回](https://qiita.com/Slowhands/items/9b352c609f15f07f4558 "前回")Windows10 homeにVirtual Boxをインストールした。
今回はその続きとしてVirtual BoxにCentOSをインストールする。

#CentOSのダウンロード
1. [Download CentOS](https://www.centos.org/download/ "Download CentOS")にアクセス。
![#1.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/967bea7c-999a-ea17-67b3-0fe9676d2302.jpeg)
<br>

1. [Minimaul ISO](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso "Minimal ISO")をクリック。
![#2.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/73f663c8-defa-8db8-fc74-a2f5f480fd7d.jpeg)
<br>

1. ISOをダウンロード。
![#3.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/f156825d-3862-c1ab-1fcb-d8e2cfb95414.jpeg)  
<br>

1. #Virtual Boxに導入
Virual Boxを起動。
![#4.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/f4f06751-b3f5-843e-e68a-471840be849e.jpeg)
<br>

1. 新規作成をクリックし、名前を入力し、[次へ]をクリック。
![#5.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/05677ddb-9c65-152a-555e-efe5082a4ed2.jpeg)
<br>

1. 今回メモリサイズはデフォルトのまま。
![#6.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/1fb0c77c-3605-06bd-c710-65f944df431e.jpeg)
<br>

1. [作成]をクリック。
[仮想ハードディスクを作成する]を選択したまま[作成]をクリック。
![#12.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/5a7995e5-75e7-4c97-3b58-931899d2bb8c.jpeg)
<br>

1. ファイルタイプは"VDI"を選択。
![#13.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/c019f04f-23c3-7516-7d92-6fdecaa1462d.jpeg)
<br>

1. ディスクサイズは最小の8GBを選択し、[作成]をクリック。
![#14.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/11dcfcb4-61f0-bc04-88e7-3c0e1af87662.jpeg)
<br>

1. 導入完了。
![#8.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/4bea088f-9d00-242a-f7fc-45d65da1ad7b.jpeg)
<br>

#CentOSの起動
1. [起動]をクリック。
![#8.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/b85432d0-7ce5-bfc7-c9e6-f3565acf5a5f.jpeg)
<br>

1. [起動ハードディスク]を聞かれるので、先ほどダウンロードしたISOを選択。
![#9.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/5036f12e-176e-54c8-e4a0-f00ed363eab7.jpeg)
<br>

1. しばらくすると[言語]の設定を聞かれるので、言語を設定。
ちなみに[キャプチャ]を選択するとゲストOSの制御ができ、右のCtrlをクリックするとホストOS側の制御に戻る。
![#15.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/2d2dd264-919e-56d7-7e17-073a54eea067.jpeg)
<br>

1. [インストール開始]をクリック。
![#16.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/1ed394be-4298-79d9-8173-3c387cb2cc60.jpeg)
<br>

1. [rootパスワード]からrootのパスワードを設定する。
![#17.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/2b10813c-b936-c76b-04a9-fb6af9bf7d7d.jpeg)
<br>

1. rootのパスワードを設定。
![#18.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/d34e23b0-701a-c8d2-84bf-0d7056f58b83.jpeg)
<br>

1. ユーザも作成。
![#19.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/d4d9a28e-b407-81b2-083f-08b1b5727d06.jpeg)
<br>

1. [再起動]をクリック。
![#20.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/4c8976f7-61d2-34d2-ce60-a994e3c4fd8f.jpeg)
<br>

1. 再起動したらrootでログイン。とりあえず起動まで確認した。
![#22.JPG](https://qiita-image-store.s3.amazonaws.com/0/158038/654c8552-5128-5eb3-220b-2815c55612f4.jpeg)<br>
演習で理解するディープラーニング#0

何事も理解を深めるためには例に対して自分の理解を当てはめ
実行し自分のものにしていくことが早道かと思います。

なのでこの記事ではディープラーニングの理解を深めるために
複数の例題を解きながら、自分の物にしていくことを目的としていきたいと思います。


##前提条件
・Python 3系

##参考図書/サイト
ブログ作成にあたって以下の図書、サイトを参考にさせていただきました。
・[ゼロから作るDeep Learning Pythonで学ぶディープラーニングの理論と実装 ]
(https://www.oreilly.co.jp/books/9784873117584/)
・[Morning Project Samurai:数学的基礎から学ぶ Deep Learning (with Python)](https://mpsamurai.doorkeeper.jp/events/65517)
Sublime Text3でPackege installが表示されない。

オリジナル投稿日：2016-04-28 11:04:08 

Sublime Text3でPackege Install がCtrl+Shift + Pを押して検索しても表示されない。

通常であれば、

Preferences(基本設定) → Brows（Pachagesフォルダ）

で表示された一つ上のフォルダにある

Installed Packeges　内

（通常はC:\Users\{ユーザー名}\AppData\Roaming\Sublime Text 3）

に、https://packagecontrol.io/installation#st3

からマニュアルダウンロードした


Package Control.sublime-package

を入れれば解決する筈。。

しかし、すでに入ってるではないか？！


色々調べた結果

https://github.com/wbond/package_control/issues/874

同じ症状で解決した人が。

簡単に言えば最近のアップデートで起きているバグだとの事。

設定の中にignored packagesというのがあり、その中に「Packege Install」が入ってしまっている為表示されなくなっているようだ。

この質問者は「Preferences（基本設定）」の中にある「Settings－Default（基本設定－標準）」の中にあったように書いてあるが、書いてあるように一番下にスクロールしても「ignored packages」の中に見当たらない。

希望をなくしかけてた所、

僕の環境の場合、「Settings－User（基本設定－ユーザー）」の中にあった！

![スクリーンショット 2017-12-14 15.26.18.png](https://qiita-image-store.s3.amazonaws.com/0/210122/6de9413f-b58c-bc98-dc05-406bcb3624bf.png)

ignored packagesにめでたく「Packege Install」が書いてあり、それを削除後、SublimeText3を再起動したら治った。

![スクリーンショット 2017-12-14 17.01.48.png](https://qiita-image-store.s3.amazonaws.com/0/210122/5966b3eb-658a-7219-823d-63073227c6ff.png)

いやぁ良かった良かった。

日本で検索しても情報がなかったので、誰かの役に立てばと記載。
Python3.6：cx_FreezeでPhantomJSのコンソールが表示されてしまう

2017-03-05 17:01:04 

version:Python3.6


cx_FreezeでPythonをexe化した所、exeファイルを実行する時だけPhantomJSのコンソールが表示されてしまう。何かかっこわるい。。
下記を参考にseleniumのservice.pyを入れ替える。
（Pythonインストールフォルダ）\Lib\site-packages\selenium\webdriver\common 

http://stackoverflow.com/questions/20785334/hide-console-of-phantomjs-driver

GitHub
https://github.com/Lazik/selenium/blob/d790915a1124bd4730f10855c7e0a40ab6e6b59f/py/selenium/webdriver/common/service.py
 
しかし、下記のエラーが出てexe化が失敗するようになってしまった。
win32process not found 

win32processが何かを調べた所、
pywin32をインストールすれば解決できそうな感じ
 
https://sourceforge.net/projects/pywin32/files/pywin32/
こちらから自分の環境にあったものをインストール。
 
しかし自分の環境では下記のエラーでインストールが途中で止まってしまった。。
Python version3.6 required which was not found in the registry
 
pywin32のインストーラが自分のPython3.6を認識できない。。
 
Windowsインストーラーからインストールしたのでレジストリ自体は間違いないはず。。
 
試しに、若干対処療法的になってしまうが
HKEY_CURRENT_USER\Software\Python\PythonCore\3.6-32
となっていたのを「-32」の部分を消して
HKEY_CURRENT_USER\Software\Python\PythonCore\3.6
としたら無事インストールできた。
docker-ceをcentosにインストール手順メモ

## 公式ドキュメント

- docker-ceをCentOSにインストールする手順が載ってる。
- しかしこの手順で`yum install docker-ce-<version>`を実行すると、conflictエラーが出ることがある。

## 対処法

- `--setopt=obsoletes=0`オプションを入れ、古い依存パッケージをインストールしないと明示的にyumに教えてあげるとうまく動く

```
yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos
```

- このオプションは公式ドキュメントに書かれてなかった。
Windows10 メディア作成ツールの進行状況が「作成しています」で止まってしまう。

2017-06-06 11:50:01 
どうしてもPCが重い。
32bitのままだとせっかく搭載した6GBのメモリが無駄になってしまっている。
かつ、Wordpressでの開発環境で導入してみたかった
[flywheel](https://getflywheel.com/)
もWindows64bitにしか対応していなかった。
これはもう64bitにあげるしかない、と
 
Windows10のメディア作成ツール。
https://www.microsoft.com/ja-jp/software-download/windows10
 
を使う事にした。
 
この「Windows10のメディア作成ツール」は、windows7や８から10にアップグレードする場合や、Windows10の32bitを64bitにしたい場合に大活躍する優れもの。
。。のハズだが、どうしても作成途中で止まるという現象に見舞われた。
 
何度か再度試しても、「作成しています。。」という状態で３％、あるいは４％程度で止まったまま。。。
 
イライラ。。。
 
朝まで放置してみても、作成ツールは勝手に閉じられているが、お目当てのisoファイルなどが、何も出来てない。。
 
色々調べても、自分の環境に該当するものは無かった。。
 
そこで色々試した結果、常駐していたマイクロソフトのOneDrive(旧SkyDrive)を停止したら動き始めました。
同じマイクロソフト社製なので、何か同じネットワークを共有しているのだろうか。
それにしても、エラーか何かを吐いてほしい。。こういう時無駄に待ちづづけてしまうよね。
 
動いた時ホッとした。
 
もしかしたら同じ方がいるかもしれないので、![o0712053613954469950.png](https://qiita-image-store.s3.amazonaws.com/0/210122/0ad4bb88-490f-bc7e-0843-66e3e7f5464c.png)
WordPressでアップロードしたメディアを投稿者自身にしか表示させたくない。

2017-08-09 18:13:43 

投稿者が不特定多数いる場合、アップロードした画像を投稿者自身にしか表示させたくないことがあるかと思います。
 
今回それを行いたいのは

contributor（寄稿者）とauthor(投稿者)だったので

```php:functions.php
function my_media_author_query( $wp_query ) {
if (! preg_match('/wp-admin\/(?:upload|media-upload|admin-ajax).php/', $_SERVER['REQUEST_URI']) ) {
  return;
}

  global $current_user;
  $user_roles = $current_user->roles;
  $user_role = array_shift($user_roles);
  if($user_role==='contributor'||$user_role==='author'){
      $wp_query->set( 'author', $current_user->id );
  }
}
add_filter('pre_get_posts', 'my_media_author_query' );
```

当初海外のQ&Aサイトに投稿されていたのは上記のようなコードでした。
とりあえずうまく行ったように見えるのは落とし穴。

その後クライアントからAdvancedCustomField（ACF）で作ったハズのユーザープロフィールが変更されない、とのご指摘をうけました。

色々問題を切り分けていくと、どうもこのコードが原因のよう。
そもそもadmin-ajax.phpをACFはつかっているようで、そのフィールドの抽出作業の過程で上記のコードでは作成者でフィルタリングされてしまう為に表示されなくなる模様。
 
結果色々工夫した挙句、


if($wp_query->query_vars['post_type']!=='attachment'){
  return;
}
を加えて

```php:functions.php
function my_media_author_query( $wp_query ) {

//追加！ post_typeがattachment以外はreturn 
if($wp_query->query_vars['post_type']!=='attachment'){
  return;
}

if (! preg_match('/wp-admin\/(?:upload|media-upload|admin-ajax).php/', $_SERVER['REQUEST_URI']) ) {
  return;
}

  global $current_user;
  $user_roles = $current_user->roles;
  $user_role = array_shift($user_roles);
  if($user_role==='contributor'||$user_role==='author'){
      $wp_query->set( 'author', $current_user->id );
  }
}
add_filter('pre_get_posts', 'my_media_author_query' );
```

でメディア画像の抽出時の動作の時のみフィルタリングさせる事に成功しました。

そもそもコードが不完全だったようです。。
あまり鵜呑みにしたらダメですね。
受験記：Python 3 エンジニア認定基礎試験

「Python 3 エンジニア認定基礎試験」を受けてきた。あまり需要はないだろうが、勉強法などを共有したいと思う。

# 目的
　Pythonを学ぶ中、基礎から体系的に学びたいと。事前に調べたところ、[あまり良い噂は聞かなかったが](http://fo.flop.jp/2017/05/30/post-251141/)受験料も会社持ちだし、（ま、いっか……）と勉強開始。

# 私のスペック
* Web業界プログラマ（5年以上）
* 普段使用の言語：PHP
* Python利用：ぜんぜん（趣味レベル）

# 試験概要

[PythonED](https://www.pythonic-exam.com/exam/basic)記載。

```
Python 3 エンジニア認定基礎試験

◆試験概要
概要：文法基礎を問う試験
受験料金：1万円（外税）　学割5千円（外税）
問題数：40問（すべて選択問題）
試験時間：60分
合格ライン：正答率70％
試験センター：全国のオデッセイ コミュニケーションズCBTテストセンター
出題範囲：主教材であるオライリー・ジャパン「Pythonチュートリアル 第3版」の掲載内容を出題範囲として、以下の比率で出題いたします。また、一般的な知識からも出題されます。
```

# 勉強法
　下記で紹介している記事の通り、８時間も（それ以下でも）合格には十分だと思う。実際、私も通勤（30分程度）と前日の３時間ほど（やはり合計で8時間程度）で合格できた。基本を学ぶことが目的だったので、出題数の少ない「クラス」や「標準ライブラリめぐり−PartⅡ」を読んでもそのくらいなので、資格取得だけを目指すならもっとかからないと思う。

## 1. 資格に関する情報を集める
　といっても下記ページだけでOK。非エンジニアの方もここに書かれている通りで良いと思う。

* [Python3エンジニア認定基礎試験の効率的な勉強方法!](http://ccie-go.com/python-exam-study/)

## 2. 「Pythonチュートリアル」を読む
　「試験概要」に「『Pythonチュートリアル 第3版』の掲載内容」とあるように、この資格は「Pythonチュートリアル理解度テスト」と言っていい。本に書かれている以上のことは出ないから、これだけ勉強すればいい。

* [Pythonチュートリアル 第3版](https://www.oreilly.co.jp/books/9784873117539/)

　私は通勤の時間で勉強したく、また、電車内でスマホをいじるのが嫌い（！？）なのでこれを購入したが、2,000円払うのがもったいないという人はwebで読めばいい。

* [Python チュートリアル](https://docs.python.org/ja/3.5/tutorial/index.html)

試験前日、私は付箋で出題数が分かるようにしていた（青は多い、黄は少ない）。

<img src="https://qiita-image-store.s3.amazonaws.com/0/169465/9f95ab5e-00a0-b0f2-7b2b-b0b4efbd8d4c.jpeg" width=30%>

## 3. β版試験に取り組む
　"Dive into Code"のページからβ版試験を受けられる。全80問ということで二回もやると同じ問題も出るが、出題形式がここで分かる。

* [Python3エンジニア認定基礎模擬試験 β版](https://diver.diveintocode.jp/exam)

# 受験結果

合格。

<img src="https://qiita-image-store.s3.amazonaws.com/0/169465/e45a33b5-9a43-e216-e618-db0dc2838165.png" width=50%>

試験時間は１時間あるが、15分程度で終わる。
見直しもしようかと思ったが、28問以上は正解している自信があったのでそのまま終了。

正直、もっと取れているかと思ったが、そうでもなかった（この点数ゆえ、記事削除しようと思ってるくらい）。
「β版」の問題よりはやや難しかった。ただ、似た（＝同じ？）問題も結構出る。

# 総評（試験について）

残念ながら、（Python）エンジニアとしての技術力を示す資格としては使えないと思う。
プログラミングをはじめたばかりの学生や、また、これからPythonを勉強しはじめようと思っている人が基礎を学ぶためのものと考えるのが良い。
実際、「チュートリアル」は、他言語との比較がちょいちょい書かれていたりもするのでPythonの良さが初学者でも感じることができると思う（読んでて面白いし）。
この資格について批判も多いだろうが、そもそも「Python」という言語の仕様、その簡潔さ故のものではないかと思う（私レベルで語れることではないかもしれないが）。やはり書き始めるまでに覚える文法量が少ない。それを理解できるだけでも価値はあるのではないか（１万円を誰かが払ってくれるなら）。
あと、「Python 3 エンジニア認定データ解析試験」のリリースはよ。
GoでTCPコネクションはるよー

# はじめに

Go言語の勉強し始めて2・3日のインフラエンジニアがなんとなく監視をテーマに選んで遊んで見る会。

今回はGo言語を用いてTCPコネクションをざっくり張ってみます。
要はServer-Client型のぷろぐらむです。

[ソースコード](https://github.com/imyslx/go-practice)も公開しておきます。誰得かはしらない。
気が向いたらアップデートされたりもするかも。

# Server コード

まずは`net.Listen`を利用してListenポートを開きます。
既にこのポートが別のアプリケーションで利用されていると即死します。

```go
func CreateListener() net.Listener {
	ln, err := net.Listen("tcp", ":8081")
	if err != nil {
		log.Fatal(err)
	}

	return ln
}
```

その後通信要求に応じてコネクション(`net.Conn`)を開きます。

```go
func ListenWorker(ln net.Listener) {	conn, err := ln.Accept()
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
```

複数のコネクションを受ける場合は[ドキュメント](https://golang.org/pkg/net/)にあるようにgoroutineに処理を放り投げるのが良いみたいですね。

deferしておくと終了時に勝手にコネクション閉じてくれるので、使えそうなら入れておきましょう。
今回は1対1の処理構造なので処理が済んだら終わりです。生成処理をfunctionにいれたりすると、function終わった瞬間に即死する気がする。

そしてメッセージの受信待ち、受信後の処理を定義します。
今回は改行を区切り文字として定義してるので複数行届いても1行ずつ処理されます。

```go
	for {
		message, err := bufio.NewReader(conn).ReadString('\n')
		if err != nil {
			log.Fatal(err)
		}
		log.Print("Message Received:", string(message))
		newmessage := strings.ToUpper(message)
		conn.Write([]byte(newmessage + "\n"))
	}
}
```

受信したら大文字にしてClientに返すってだけの処理です。
現状コネクション制御が全く入っていないので、Clientが死ぬと暴走する危険なやつになってます。

あとはmainで動かして終わりです。
Workerを分離したのはgoroutine使って複数Clientからの接続を後々試すために分けておいただけでした。

```go
func main() {

	// Create Listen port and accept to connection.
	log.Print("Launching server...")
	ln := CreateListener()

	ListenWorker(ln)

}
```

# Client コード

ClientはServerへの発呼とデータの送受信を行う処理がメインですね。
自分がやりたいことだけ書けばいいのでサーバ側に比べると楽。

とりあえずコネクション貼っちゃいましょう。
net.Dialの時点でサーバに接続しに行くので、ここでエラー処理をしないと接続失敗しても動いている変なやつになります。

```go
func MakeConnection(server, port string) net.Conn {
	conn, err := net.Dial("tcp", server+":"+port)
	if err != nil {
		log.Fatal(err)
	}
	return conn
}
```

ここでは標準入力から何らかの入力を得てそれをサーバへ流す仕組みにします。

```go
func GetInput() string {
	for {
		reader := bufio.NewReader(os.Stdin)
		fmt.Print("Input text: ")
		text, _ := reader.ReadString('\n')

		if len(text) > 1 {
			return text
		}
	}
}
```

取得した入力を送信する処理と、終了用にexitコマンドを定義してあります。
もっといろいろ増えそうならコマンド処理の部分はFunctionにしてもいいかなって思ったけどサボった。

Serverからの応答待ちと表示処理も一緒にやっちゃってます。

```go
func PublishMessage(conn net.Conn) {

Loop:
	for {
		// Read in input from stdin
		text := GetInput()

		// If the input is "exit", we will stop the loop and end client.
		switch {
		case text == "exit\n":
			log.Print("Entering exit command. EXIT.")
			break Loop
		}
		log.Print("Will send text: " + text)

		// Send to socket
		conn.Write([]byte(text + "\n"))

		// Listen for reply
		message, _ := bufio.NewReader(conn).ReadString('\n')
		log.Print("Message from server: " + message)
	}
}
```

実際にやりたい処理のための基盤は大体出来たので、粗も多いけど今回はこのくらいで。

```go
func main() {

	// connect to this socket
	conn := MakeConnection("127.0.0.1", "8081")
	defer conn.Close()
	log.Print("Connected.")

	PublishMessage(conn)
}
```
AndroidのListViewに設定したadapterでgetViewが必要以上に呼ばれる件

AndroidでListViewにAdapterを設定し、ListViewのアイテム数は1、特に他で複数呼ばれている箇所もなし、この状態でLogcatを見たら**#getViewだけが9回も呼ばれている**ことに気づいた。

「なんでや！　ImageLoaderを不要に呼びまくらないでくれ！」

どうやらこれ、**ListViewのheightの設定がmatch_parentになっていない**と起こる現象の模様。

【参考】
[getView が行数より多く呼ばれる - ただのメモです。](http://ayapon-lv1.blogspot.jp/2012/02/getview.html)
[ListViewの表示時にgetView()が表示個数以上に呼ばれている件 - アイスケットのブログ
](http://isket.jp/android/listview%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%99%82%E3%81%ABgetview%E3%81%8C%E8%A1%A8%E7%A4%BA%E5%80%8B%E6%95%B0%E4%BB%A5%E4%B8%8A%E3%81%AB%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E4%BB%B6/)

そういうわけでListViewのheightをmatch_parentにしたものの……まだ9回呼んでいる。

次にListViewの親要素もheightをmatch_parent以外で指定していたので、そこを変更……1回だけになった！


**ListViewに設定したadapterでgetViewが必要以上に呼ばれて困っている場合は、当該のListViewとその親Viewのheightをmatch_parentにしてみよう。**
Statement と ResultSet の close 整理

**Statement**

> 注: Statementオブジェクトがクローズされるとき、その**現在のResultSetオブジェクトが存在すれば、それもクローズされます。**

[Statement (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Statement.html#close--)

**ResultSet**

> 注: ResultSetオブジェクトは、このオブジェクトを生成したStatementオブジェクトがクローズされるとき、再実行されるとき、または一連の複数の結果から次の結果を取り出すのに使用されるときに、**そのStatementによって自動的にクローズされます。**

[ResultSet (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/java/sql/ResultSet.html#close--)


ということなので、 `Statement` の方を確実に `close()` していれば、 `ResultSet` の `close()` は書かなくても良いっぽい。

```java
package sample.jta;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        Class.forName("org.h2.Driver");

        try (Connection con = DriverManager.getConnection("jdbc:h2:mem:test", "sa", "")) {
            try (Statement stmt = con.createStatement()) {
                stmt.executeUpdate("create table if not exists foo(id number(10), code varchar(20))");
            }

            try (PreparedStatement ps = con.prepareStatement("insert into foo values (?, ?)")) {
                ps.setLong(1, 1L);
                ps.setString(2, "hoge");
                ps.executeUpdate();

                ps.setLong(1, 2L);
                ps.setString(2, "fuga");
                ps.executeUpdate();
            }

            ResultSet rs;
            try (PreparedStatement ps = con.prepareStatement("select * from foo")) {
                rs = ps.executeQuery();
                while (rs.next()) {
                    long id = rs.getLong("id");
                    String code = rs.getString("code");
                    System.out.println("id=" + id + ", code=" + code);
                }
                System.out.println("(1) rs.isClosed()=" + rs.isClosed());
            }
            System.out.println("(2) rs.isClosed()=" + rs.isClosed());
        } catch (SQLException e) {
            e.printStackTrace(System.err);
        }
    }
}
```

```text:実行結果
id=1, code=hoge
id=2, code=fuga
(1) rs.isClosed()=false
(2) rs.isClosed()=true
```

`PreparedStatement` が `close` されたら `ResultSet` も `close` されてる。

**追記**

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">コネクションプールがStatementもプールするかもしれないのでResultSetも明示的に閉じて置いた方が無難だと思うなー</p>&mdash; うらがみ⛄ (@backpaper0) <a href="https://twitter.com/backpaper0/status/924475451598258177?ref_src=twsrc%5Etfw">October 29, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ややこしいケースもありそうなので、明示的に `close()` するのが良さそうです。
gitで常に.vscodeを無視する

VS Codeを使っていると、.vscodeというディレクトリをプロジェクトのルートに作成し、そこに一時ファイルだったり、設定ファイルを保存するっぽい。

そのこと自体についてはまったく文句はないのだけども、gitのリポジトリに混入されると非常に迷惑なので、以下のように除外しようとしました。

```.gitignore
.vscode
```

結構、こういう記述をしているものを見たので、これで問題ないんだろうなとおもったら、この記述では無視されず、仕方ないので以下のように記述した。

```.gitignore
.vscode/*
```

プロジェクトのそれぞれ個別に書くようなものではないので、VS Codeを使うのであれば `$HOME/.config/git/ignore` に追加するといいと思う。
プログラマ脳を鍛える数学パズルをひたすらPythonで：Q3「カードを裏返せ」

#Q3:カードを裏返せ#

<b>全問Pythonで解いてみようと思ってますのでどうぞよろしくお願いします。</b>

※Q2はあまり面白くないのと学んだこともそんなにないので飛ばします。

#問題#
1～100までの番号が書かれた100枚のカードが順番に並べられています。
最初、すべてのカードは裏返しの状態で置かれています。
ある人が2番のカードから、１つおきにカードを裏返していきます。
すると、2, 4, 6, … , 100番のカードが表を向いています。
次に、別の人が、3番のカードから2つおきにカードを裏返していきます。
（裏向きのカードは表を向き、表向いているカードは裏返しされます。）
また、別の人が、4番のカードから3つおきに、カードを裏返してきます。
このようにn番目のカードからn-1つおきにカードを裏返す操作を、
どのカードの向きも変わらなくなるまで続けたとします。
裏向きになっているカードの番号をすべて求めてください。


#Code#

まずはrubyでの模範回答

```ruby
N = 100
cards = Array.new(N, false)

(2..N).each{|i|
    j = i - 1
    while (j < cards.size) do
        cards[j] = !cards[j]
        j += i
    end
}

N.times{|i|
    puts i + 1 if !cards[i]
}
```

Pythonで書くなら...


```python
N = [True]*100
for i in range(1, 101):
    j = i - 1
    while j < 100:
        N[j] = not N[j]
        j += i

print([k + 1 for k in range(100) if N[k] == False])
#1, 4, 9, 16, 25, 36, 49, 64, 81, 100
```


まぁそこまで長くなく無難なCodeになったのではないでしょうか？？

#今回の学習ポイント#
rubyでの以下のCodeをPythonで書くにはどうしたらいいか。

```ruby
cards[j] = !cards[j]
puts i + 1 if !cards[i]
```

```python
N[j] = not N[j]
print([k + 1 for k in range(100) if N[k] == False]) #list内包表記
```
プログラマ脳を鍛える数学パズルをひたすらPythonで：Q1「回文数」

#プログラマ脳を鍛える#


PaizaのスキルチェックにおいてBランクからなかなか抜け出せないので、気分転換も含めプログラマ脳を鍛える数学パズルをPythonで解いていこうと思います。

あと、他言語で書かれているCodeをPythonに変換してみたいという興味もかねて。

#問題#

問題内容は10進数でも2進数でも8進数でも上から読んでも下から読んでも同じ数字になること。

（例）

* 10進数：9
* 2進数：1001
* 8進数：11

では、9より上の10進数で回文数になる値は何？
というのが問題です。

#Code#
まずはruby

```ruby
num = 11
while true
    if num.to_s == num.to_s.reverse &&
        num.to_s(8) == num.to_s(8).reverse &&
        num.to_s(2) == num.to_s(2).reverse
        puts num
        break
    end
    num += 2
end
```

同じことをPythonで

```python
num = 11

while True:
    if str(num) == str(num)[::-1]\
    and str(format(num, 'b')) == str(format(num, 'b'))[::-1]\
    and str(format(num, 'o')) == str(format(num, 'o'))[::-1]:
        print(num)
        break
    num += 2
```

もう少し簡単にしてみる



```python
def palindrome(x):
    return str(x) == str(x)[::-1]

n = 11

while True:
    if palindrome(n) and palindrome(format(n, 'b')) and palindrome(format(n, 'o')):
        print(n)
        break
    n += 2
```

#今回の学習ポイント#
and とか or で記述が長くなるときに改行で"\"を使うことを知った。
64bitでもDXRubyを使いたい！

[DXRuby](http://dxruby.osdn.jp/)のgemは2.1/2.2/2.3のi386(32bit版)のバイナリしか用意されていません。それ以外は自分でコンパイルする必要があるのですが、x64ではコンパイルすらできません。

ということで、DXRuby 1.4.5 on Ruby 2.4.x x64ができるためのパッチ及びその他諸々を一気にやってしまう物を作りました。

[raccy/dxruby_x64: DXRuby build tool for x64](https://github.com/raccy/dxruby_x64)

パッチは

* とりあえずコンパイルできるようにする。
* とりあえずrequireできるようにする。

というところまではできていますが、動作は完全ではありません。ほとんどのサンプルは動作しますが、一部は正常に動作しませんので、予めご了承ください。詳しくは[サンプル集の動作チェック](https://github.com/raccy/dxruby_x64/issues/1)を見てください。

おいおい、全てのサンプルが正常動作するようにしていきたいとは思っていますが、如何せんDirectX詳しくなくて、ソースを見ても何をしているのかさっぱりわからない…ぐほっ
Docker (ファイル/CPU/メモリ/プロセス) のリソースを制限する方法まとめ

Dockerコンテナの実行時にunlimitを使用してリソースの制限をすることができます。

![images.jpg](https://qiita-image-store.s3.amazonaws.com/0/62822/34465842-f06f-8ed9-998e-f1f007b8c0ab.jpeg)

## 目次
- ファイルサイズ制限
- CPUコア制限
- CPU時間制限
- CPU相対量の指定
- メモリの使用量制限
- プロセス数の制限


## **ファイルサイズ制限**
1MBで制限します
これによって1MBより大きいファイルを作成することができなくなります。

```
$ docker run --ulimit fsize=1000000:1000000 ubuntu
```

## **CPUコア制限**
使用するCPUをCPU0番のみに制限します
CPU番号はtopコマンドで知ることができます。

```
$ docker run --cpuset-cpus=0 ubuntu
```

## **CPU時間制限**
--cpu-periodで指定した秒数（μs）に、--cpu-quotaで指定した秒数（μs）のCPU時間が割り当てられその量を超えたCPUを利用できなくなります。
この場合は、CPU使用率が50%になります

```
$ docker run --cpu-period=50000 --cpu-quota=25000 ubuntu
```

## **CPU相対量の指定**
複数のコンテナを実行した時に、--cpu-shareの比率によって使用するCPUの割当が決まります
この場合は、centosの50%のCPUがubuntuに与えられます。

```
$ docker run --cpu-share=512 ubuntu
```

```
$ docker run --cpu-share=1024 centos
```

## **メモリの使用量制限**
物理メモリの制限とスワップメモリの制限ができます
この場合は、メモリを50MBに、スワップメモリを150MBに制限しています。

```
$ docker run --memory=50m --memory-swap=150m ubuntu
```

## **プロセス数の制限**
この制限をしておくことで、fork爆弾対策にもなります
この場合は、プロセス数を20に制限しています。

```
$ docker run --pids-limit 20 ubuntu
```

カーネルバージョンの制限などのため、`--pids-linit`が利用できない場合、unlimitによる制限で代用することもできます。
この場合、プロセス数を3に制限しています。

```
$ docker run --unlimit nproc=3:3 ubuntu
```


## まとめ
- リソースの制限などは、普段しませんが不意に役に立ちそうなのでまとめました。
- お役に立てればと思います。

## 参考
- Docker実践活用ガイド
HerokuにRailsアプリをデプロイした時のdatabase.ymlの置き換えについて

[Ruby on Rails Tutorial 第４版](https://railstutorial.jp/?version=5.0#walk-through)をしていて、pushしたdatabase.ymlの内容と実際の動作が異なっていたのでメモします。

# database.ymlにはpgの設定がないのにHerokuで正常動作する
Tutorialに従っていると、database.ymlの中身は以下の様になっているはず。

```yaml:database.yml
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

(中略)

production:
  <<: *default
  database: db/production.sqlite3

```
Gemfileはこんな感じ。

```rb:Gemfile
group :production do
  gem 'pg', '0.18.4'
end
```

database.ymlにはsqlite3の設定しかないのに、デプロイしたHerokuではpgで正しく動作しています。ふしぎです。

# HerokuのRubySupportの項にちゃんと説明がありました

[Heroku::RubySupport](https://devcenter.heroku.com/articles/ruby-support#build-behavior)によると、herokuにアップしたdatabase.ymlの内容はすべて無視され、上書きされるということでした。

Rails4.1以上の場合は、以下のようにdatabase.ymlを作成/変更するようです。

- database.ymlがない場合は、database.ymlを作成する
- database.ymlがある場合は、database.ymlを置き換える
- 上のdatabase.ymlはHeroku環境変数のDATABASE_URLの内容をパースして動的に作成される
bisonでコンフリクトメッセージが出た時の対処方法(1)

[前回](https://qiita.com/tosyama/items/6766321025c6a2875109)に引き続きbisonネタ。
bisonで構文解析器を作っていて、文法が複雑になってくると急に表れて、開発者を地獄:persevere:に突き落とすのがコンフリクトです。結局どこがどうコンフリクトしてるのかよくわからなくて放置してたり。(私だけ?)[Palan](https://qiita.com/tosyama/items/8d25a1456afbafe40658)開発当初は何がどうなっているのかさっぱりわからず、しばらく見なかったことしてました。ここでは私がやっている対処方法を紹介します。

# コンフリクトとは
コンフリクトとは「文法があいまい(2種類上の解釈ができる)で定義された文法どおり正しく解析できない」とbisonが教えてくれる警告です。種類としては「shift/reduce conflict」/ 「reduce/reduce conflict」がありますが、正直あまり詳しくないので説明は省きます。shift/reduce conflictは大丈夫な場合がありますが、やはりなぜかが分かっていないと放置は危険と思います。また文法があいまいでなくても出る場合があります。bisonは通常トークン1文の先読みしかできないからです。2つ以上のトークンを先読みしないと確定できない文法はコンフリクトと判断されてしまいます。

# コンフリクトの例
例として以下の様な謎言語を設計してみます。何できるかさっぱりですが、とりあえず複数の戻り値を返せそうです。また戻り値の宣言では型だけでなく名前を付けたり省略することもできる様です。

```
int y,z;
calc(y+z, 3);
int a, float calc(int x, float y)
{
   x-1; y+1;
}
```

これが読めそうな構文解析器を勢いで書いてみましょう。いかにもコンフリクトしそうですが意図は明確と思います。

前提としては字句解析yylexは数字がきたらINT、アルファベットがきたらID、それ以外の記号がきたらその文字を返すとします。

```:conflict.yy
%skeleton "lalr1.cc"
%require "3.0.4"
%defines

%code
{
int yylex();
}

%token INT
%token ID

%start module
```

```
%%
module: /* empty */
	| module function_definition
	| module statement
	;

function_definition: return_values ID '(' parameters ')' block
	;

return_values: return_value
	| return_values ',' return_value
	;
return_value: type_def ID
	| type_def
	;

parameters: parameter
	| parameters ',' parameter
	;
parameter: type_def ID 
	;

block: '{' statements '}'
	;
```

```
statements:	statement
	| statements statement
	;

statement: declarations ';'
	| expression ';'
	| func_call
	| block
	;

declarations: declaration
	| declarations ',' declaration 
	;
declaration: type_def ID
	;
```

```
func_call: ID '(' arguments ')'
	;
arguments: expression
	| arguments ',' expression
	;
expression:
	| expression '+' expression
	| expression '-' expression
	| term
	;
	
term: INT
	| ID
	;

type_def: ID
%%                                                                                                                 
```

さてbisonで構文解析器を生成するためにコマンド叩いてみましょう。

```shell-session
$ bison conflict.yy
conflict.yy: warning: 6 shift/reduce conflicts [-Wconflicts-sr]
conflict.yy: warning: 1 reduce/reduce conflicts [-Wconflicts-rr]
```

はい、出ましたconflicts。コンフリクトさせようとしたからそりゃ出るのですが、思ったのとちょっと違う。。う、これを調べて直すのか。。。私の心が折れそうです。

# コンフリクトを分析して解決する
うーん、大変そうなので、次回にまわそう(汗)。
問題解決の手がかりは下記のコマンドです。

```shell-session
$ bison conflict.yy  -r all --report-file=conflict.log
```

[次回](https://qiita.com/tosyama/items/5a24c6d763bbdb2cce79)へ続く。
node-ffiでWindows APIでUnicode版のAPIを使って文字列を指定する

[node-ffiでWindows APIでUnicode版のAPIを使って文字列を取得する - Qiita](https://qiita.com/kjunichi/items/6e036d8ef4b8a0a757de)の反対に、UNICODE版のAPIに文字列を指定して呼び出す

```js
const ref = require('ref');
const ffi = require('ffi');
const wchar_t = require('ref-wchar');
const {Iconv} = require('iconv');

const wchar_string = wchar_t.string;
const voidPtr = ref.refType(ref.types.void);

const user32 = ffi.Library('user32.dll', {
    EnumWindows: ['bool', [voidPtr, 'int32']],
    IsWindowVisible: ['bool', ['long']],
    FindWindowW: ['long',[wchar_string, wchar_string]],
    GetWindowTextW: ['long', ['long', wchar_string, 'long']]
});

const windowProc =
    ffi.Callback('bool', ['long', 'int32'], function (hwnd, lParam) {
        if (user32.IsWindowVisible(hwnd)) {
            const buf = Buffer.alloc(255);
            const ret = user32.GetWindowTextW(hwnd, buf, 255);
            const s = ref.reinterpretUntilZeros(buf, wchar_t.size);
            const title = wchar_t.toString(s);
            if (title.length > 0) {
                console.log(title);
            }
        }
        return true;
    });

//user32.EnumWindows(windowProc, 0);
const title = 'ピクチャ'; // <- 適当なタイトル名で
myconv = new Iconv('UTF-8','UTF-16LE');
rmyconv = new Iconv('UTF-16LE','UTF-8');
const _buf = myconv.convert(title);
const __buf = rmyconv.convert(_buf);
console.log(__buf.toString());
wtitle=_buf;
const hwnd = user32.FindWindowW(null,wtitle);
console.log(hwnd);
const buf = Buffer.alloc(255);
const ret = user32.GetWindowTextW(hwnd, buf, 255);
const s = ref.reinterpretUntilZeros(buf, wchar_t.size);
console.log(wchar_t.toString(s));
```
ErgoDox EZを買って5分で設定する

# 背景
キーボードが左右に分かれた人間工学デザインに基づくキーボードとして話題のErgodox EZ。
https://ergodox-ez.com/pages/ergodox-ez-keyboard

しかし、設定方法が煩雑で設定段階で挫折する人も（過去の記事を読んでも大型連休とか使って設定していたり）

ただし、コツさえわかれば5分もあれば設定できるので、その方法を共有します。

# 設定方法（4ステップ）
## 1. キーボード間ケーブルとUSBケーブルを繋ぐ
キーボードの左右をキーボード間ケーブルでつなぎ、PCとErgoDox EXをUSBケーブルで繋ぐ

## 2. キーボードの配列を設定する
以下のサイトで、キーボードの配列を設定する。
[ErgoDox EZ Configurator](http://configure.ergodox-ez.com/keyboard_layouts/new)

「Clone and modify layout」でキーボードを自分好みにカスタマイズし、「Download this layout」で最後キーボード設定のhexファイルをそのままダウンロードする。

ちなみに自身のキーボード配列は以下。
http://configure.ergodox-ez.com/keyboard_layouts/qrnxpj
<img width="1089" alt="スクリーンショット 2017-10-29 6.27.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/175433/d0c89f37-8618-ce4c-586a-0a175c54dd78.png">

[Happy Hacking Keyboard Professional JP](http://www.pfu.fujitsu.com/hhkeyboard/lineup/pdkb420w.html)の版を参考にした。
Ergodox EZには、キーボードのレイヤー変更機能もあるが、自身に関しては同機能のメリットを感じなかったので、使わず１レイヤーのみでシンプルに使えるようにした。

## 3. Teensyをダウンロードする
キーボードの配列設定を、Ergodox EZに送るツールTeensyを以下のページよりダウンロードする。
[Mac用](https://www.pjrc.com/teensy/loader_mac.html)
[Windows用](https://www.pjrc.com/teensy/loader_win10.html)

## 4. Teensyよりキーボード配列データをErgodox EZに送る
Teensyを起動し、以下のページを参考に2.で作成したキーボード配列データ（hexファイル）をErgoDox EZに設定します。
[Ergodox EZ を使ってみよう#流し込み手順](https://qiita.com/kei_s/items/40a896d1a1c70f2961e0#%E6%B5%81%E3%81%97%E8%BE%BC%E3%81%BF%E6%89%8B%E9%A0%86)

以上で、Ergodox EZの設定は完了します！

# 補足
この記事では、最短シンプルにErgoDox EZを設定できることに特化しているため、ErgoDox EZの特徴のレイヤー設定や特殊なキーについての説明などは省いてます。
もし興味がありましたら、それらについて調べてみても面白いのでは？と思います！

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
《非プログラマー向け》Swift/iOSアプリ作成の効率的な学習方法

![スクリーンショット 2017-10-29 6.10.07.png](https://qiita-image-store.s3.amazonaws.com/0/199441/493c7ccc-f7b4-ead5-0948-a0e5069e5f72.png)

## 共有すること
swift / iOSアプリ作成の効率的な学習方法（非プログラマー向け）

## 学習方法
下記の流れで学習すると、非プログラマーでも効率的に学習できる。

### 1. ProgateでSwiftを学習
[Progate](https://prog-8.com/)

### 2. "絶対に挫折しない iPhoneアプリ開発「超」入門"で、Xcodeの操作方法を学び簡単なiOSアプリを作成
[絶対に挫折しない iPhoneアプリ開発「超」入門](https://itunes.apple.com/jp/book/%E7%B5%B6%E5%AF%BE%E3%81%AB%E6%8C%AB%E6%8A%98%E3%81%97%E3%81%AA%E3%81%84-iphone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E8%B6%85-%E5%85%A5%E9%96%80-%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC5%E7%89%88-swift-3-ios-10-1%E4%BB%A5%E9%99%8D-%E5%AE%8C%E5%85%A8%E5%AF%BE%E5%BF%9C/id1181404702?mt=11)

### 3. "Swiftによるアプリケーション開発：入門編"を参考にアプリを作成
[Swiftによるアプリケーション開発：入門編](https://itunes.apple.com/jp/book/swift%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E5%85%A5%E9%96%80%E7%B7%A8/id1209648719?mt=11)

### 4. "App Development with Swift"を参考に、より高度な技術を学習
[App Development with Swift](https://itunes.apple.com/jp/book/app-development-with-swift/id1219117996?mt=11)


## この学習方法のメリット・デメリット
### メリット
・学習コストが低い
・自分のペースで学習可能
・わからないことをネットで調べて自力で解決したいと思う人には向いている。

### デメリット
・英語が必要
・プログラミングを詳しい人から直接教わりたいと思う人には向いていない。