OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift] Control Statement (control_statement): 　if,for,while,do statements shouldn't wrap their conditionals in parentheses.

##control_statement

Control Statement (control_statement):
　if,for,while,do statements shouldn't wrap their conditionals in parentheses.

どうやら()を使っているから警告を出しているようです。
()を取り除けば警告は消えます。

SwiftLintのdisabled_rules
---
Typescriptの押さえておくべき構文

JSはわかるけど、TS触りたて、程度のレベルを想定しています。

## const
- ES6の構文。
- 使い方：`const root = document.getElementById('app');`
- JSでいう`var` `let`の定数版。一旦宣言すると、後から値が書き換えられない（イミュータブル）。

##  =>
-  ES6のアロー関数を採用しているもの。functionの記述と関数名が必要なくなる。
-  直ちに値を返すなら`{}`と`return`も省ける。

```arrow.ts
function (x) {
  return "Hello," + x + "!"; 
}

// アロー関数を使うと
(x: string) => {
    return "Hello," + x + "!";
}
```

## interface
- 変数や関数（メンバ）の型を定義するだけのもの

```interface.ts
interface インターフェイス名 {
    メンバ変数名: メンバ変数の型名;
    メンバ関数名(引数名: 引数の型名): 戻り値の型名;
}
```

## typeof
- すでに具体的なデータが宣言されている場合に、その型をまるっと使ってタイプの定義をするときに使用する。

```type.ts
let sampleState = {
  id: 1,
  text: "sample",
}

type sampleState = typeof sampleState;
```

### ジェネリック `T`
- 型引数を導入してその都度定義できる。クラス、関数に使用すると効果を発揮する。戻り値に指定しても良い。

```ex.ts
function a<T>(x: T) {
  alert(x);
}
 
a<string>("BELTLOGGER");
a<number>(9);
a<Date>(new Date());
```
クラスに付加するときはこう。

```ex2.ts
class MyPerson<T>{
  public name: T;
}
```

## 型推論
全てに型定義の記載をすると、コードが長くなる場合がある。
その場合はコードの文脈（変数の初期化や、戻り値の型など）によって、
型が推測できる場合は、型定義を省略できる。


```type-inference.ts
var str = ''; //変数の初期化
str = 123;  //初期化時に文字列を入れている為、変数の型定義無しでもコンパイルエラーとなる。

// 関数定義時に、引数で型=numberを定義
function hoge(n:number):void{
    alert(n *10);
}

// 定義した型で変数を初期化
var num = 10;
hoge(num); // => 100

// 定義した型と異なる型で変数初期化
var str = 'あいうえお';
//引数の型定義をしている為、ここでコンパイルエラーとなる。
hoge(str);
```

## オーバーロード
同名の関数で、引数・返り値の型が異なる場合などに使う。
以下のように書くと、`string`か`number`が継承できるので、コンパイルエラーにならない。

```overload.ts
function a(x: string);
function a(x: number);
function a(x: any) {
  alert(x);
}
 
a("BELTLOGGER");
a(9);
```

###参考
https://www.typescriptlang.org/docs/home.html
[ES2015(ECMAScript2015)の文法を覚える - ブログ書くより読むほうがすき](http://blosuki.hatenablog.com/entry/es2015)
今更だが、vagrantがどうやってsudoを実現しているのか知った

# 環境
OS: CentOS 7.2

# `/etc/sudoers`に設定がない
NOPASSWDはコメントアウトされてるし、なんならvagrantユーザはwheelにすら所属してない
ので、訳が分からなかった

# たまたま`ls /etc`した時に見つけた
`/etc/sudoers.d`というディレクトリ

# 中身を見ると、`/etc/sudoers.d/vagrant`というファイルがあった
`cat /etc/sudoers.d/vagrant => vagrant  ALL=(ALL)  NOPASSWD: ALL`
なるほど

# 試しにhogeユーザに同じ要領でsudo権限付与できるかやって見た
rootユーザで
`echo -e 'hoge\tALL=(ALL)\tNOPASSWD: ALL' > /etc/sudoers.d/hoge && chmod 440 /etc/sudoers.d/hoge`
をしてからhogeユーザでログイン
hogeユーザで'sudo su -'でrootになれた

# 所感
なぁにコレェ！？
R で 巨大な Bayesian networks を扱う


# R でベイジアンネットワーク

Rでベイジアンネットワークをやる際に、少数のノードの場合はよいのですが、多数のノードによるネットワークを表現するためには、少し工夫がいるようでした。

以下のhoxo_mさんのエントリなどを参考にやっていましたが、特にノードの表現で巨大ネットワークでは難しいことがわかりました。

[Rでベイジアンネットワークメモ](https://rpubs.com/hoxo_m/21327)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/d617e69f-e6a8-a022-72e1-b72dfcde7b8e.png)

# 使うライブラリ

R にはlibrary(deal)、library(bnlearn)などのライブラリがありますが、上記で紹介されている、比較的有名そうなdealを使う例が多いようでしたが、これだとノード数がある程度を超えると、以下のようなエラーに見舞われることが多いようです。

```R 
> prior.dist <- jointprior(pre.network)

Error in array(1, Dim) : negative length vectors are not allowed
```

このエラーは以下のStackoverflowのエントリを読むとどうもメモリオーバーフロー問題のようです。
[Negative number of rows in data.table after incorrect use of set - stackoverflow](https://stackoverflow.com/questions/16877027/negative-number-of-rows-in-data-table-after-incorrect-use-of-set)

使っているデータはノード数が400を超えるので、これはこのライブラリには難しいのかもしれません。
抜本的な対策ではありませんが（打算的な対応ですが）bnlearnというライブラリを使ってみましたところ、同じネットワークに対してモデルを構築することができました。

参考：[Rでグラフィカルモデル(ベイジアンネットワーク)を行う際に使うパッケージまとめ](http://st-hakky.hatenablog.com/entry/2016/12/14/160837) 

|library|Author|Organization|Download|Document|
|:------|:-----|:-----|:-------|:-------|
|deal|Susanne G. Bøttcher, Claus Dethlefsen |Aalborg U.| [CRAN](https://cran.r-project.org/web/packages/deal/index.html)|
|bnlearn|Marco Scutari|U. Oxford|[CRAN](https://cran.r-project.org/web/packages/bnlearn/index.html)|[bnlearn](http://www.bnlearn.com/about/)|
|catnet|Nikolay Balov, Peter Salzman|Stata Corp LP|[CRAN](https://cran.r-project.org/web/packages/catnet/index.html)|[r-project](https://cran.r-project.org/web/packages/catnet/vignettes/catnet.pdf)|

catnetは触っていませんが、後発のようです。

# ネットワークの表示

dealにはplotメソッドがあらかじめ用意されていましたので、簡単に表示できました。しかし上記の理由で大きなネットワークそのものを作れませんでしたので、どの程度まで表示できるかはわかりませんでした。

bnlearnでは外部のgraphvizを内包しており、以下のようにやれば、簡単にネットワークを表示できます。ちなみにshapeをrectangleにしないと、キャプションが入りきらず、見えにくくなります。

```R
graphviz.plot(fitted, layout = "dot", shape = "rectangle")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/4a3efb4d-0891-24c7-bf0a-f065a2fdf175.png)

しかし、これで表示しても、レイアウトによっては、以下のようにプロットエリアの解像度の問題で、大きなネットワークではノード名などがつぶれて表示されなくなります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/e11cf3bb-b8fc-9883-105c-7eaaa5541881.png)

おそらくオートレイアウト機能がフォントサイズをコントロールしており、規定以下のサイズになり、消えてしまったのでしょう。
bnlearnのgraphvizラッパーには、解像度やフォントサイズをコントロールするオプションはありませんでした。

そこで、高解像度の表示をするためにpdf化を行ったところ、plotエリアの制限を超えて表示できました。width,heightで大き目のサイズ（インチ）の用紙を設定すれば、高解像度になります。dpiの直接指定はできません。

```R
    pdf("plots.pdf", width = 24, height = 18)
    graphviz.plot(fitted, layout = "dot", shape = "rectangle")
    dev.off()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/bf908b60-aaa1-f190-6878-9a6404b85828.png)

PDF化をすれば、さらに大きなネットワークでもなんとかなりそうですね。ちなみに大きなPDFはブラウザ内蔵のビュアーではなくAcrobat Readerを使わないと拡大しきれないようです。
Quantopianチュートリアル LESSON 4

[前回](http://qiita.com/driller/items/b7eb097ea094ee92e023) の続きです。

# LESSON 4 Ordering Securities

`order_target_percent()` 関数を用いて銘柄をロングしたりショートしたりします。
第一引数には [LESSON 3](http://qiita.com/driller/items/b7eb097ea094ee92e023) で作成した銘柄のインタンス、第二引数には全資産を1とした場合(以降ポートフォリオ)の比率を指定します。

下記の例ではAAPLをポートフォリオの50%分ロングしています。

```python
order_target_percent(sid(24), 0.50)
```

上記を実行する以前にポジションがなければ、0.5の資金がロングされますが、この時点で他のポジションが含まれている場合は投入される金額が異なることに注意してください。

ショートする場合は第二引数に負の値を指定します。

```python
order_target_percent(sid(24), -0.50)
```

下記のコードではAAPLをポートフォリオの60%分ロングし、SPYをポートフォリオの40%分ショートしています。
コードは [こちら](https://www.quantopian.com/tutorials/getting-started#lesson4) からクローンできます。
`data.can_trade()` については LESSON 5で解説します。

```python
def initialize(context):
    context.aapl = sid(24)
    context.spy = sid(8554)

def handle_data(context, data):
    # Note: data.can_trade() is explained in the next lesson
    if data.can_trade(context.aapl):
        order_target_percent(context.aapl, 0.60)
    if data.can_trade(context.spy):
        order_target_percent(context.spy, -0.40)
```
[LESSON 3](http://qiita.com/driller/items/b7eb097ea094ee92e023) <--> [LESSON 5](http://qiita.com/driller/items/9816429105afba6972aa)
denite.nvim で grep -> qfreplace をやる

# はじめに
いつもは丁寧に記事を書くのだが、今回はさっと書きます。

# 対象
- vim/neovim を使っている
- unite.vim を知ってる
- 今は denite.nvim 使ってる

# 内容
unite.vim では以下の事ができたが、denite.nvim ではできなかった。

- `Unite grep` する
- 候補を選択する
- replace-action を起動する（thinca/vim-qfreplace が必要）
- 置換バッファが開くので、編集して保存
- 複数ファイルにまたがった置換を行うことができる

denite.nvim は速度に優れているので、grep みたいなことはとても得意。
でも、grep 結果を一括置換できないので、うーん。と思っていた。

しかし、先日 denite.nvim に custom-action が搭載された。
これ、自分で qfreplace 叩けばできるんじゃないの？
unite.vim の replace-action を見てみたら、めちゃ簡単なコードだったので書いてみた。

# 実装
```VimL:.vimrc

  if dein#tap('denite.nvim') && dein#tap('vim-qfreplace')
    function! MyDeniteReplace(context)
      let qflist = []
      for target in a:context['targets']
        if !has_key(target, 'action__path') | continue | endif
        if !has_key(target, 'action__line') | continue | endif
        if !has_key(target, 'action__text') | continue | endif

        call add(qflist, {
              \ 'filename': target['action__path'],
              \ 'lnum': target['action__line'],
              \ 'text': target['action__text']
              \ })
      endfor
      call setqflist(qflist)
      call qfreplace#start('')
    endfunction
    call denite#custom#action('file', 'qfreplace', function('MyDeniteReplace'))
  endif
```
※ 行儀悪い部分もあるが許して（g:, l: つけてないとか）

# おわりに
プラグイン化しないの？とか言われそうなので、そこだけ言っておくとこんな簡単なコードをプラグインにしてもなあと思ったのと、このコードは 2 種類の plugin に依存したコードなので、みんな vimrc に書けばいいんじゃないのと思ったので、特に予定はないです。
【swift3】CGAffineTransformを使ってインジケータのサイズを拡大or縮小する

**あまり需要はないかもしれないですが・・・**

```swift:ViewController.swift

//インスタンスの生成
let activityIndicatorView : UIActivityIndicatorView! = UIActivityIndicatorView()

//スタイルを指定
activityIndicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.whiteLarge

//色を指定
activityIndicatorView.color = UIColor.black

//表示位置を指定
activityIndicatorView.frame = CGRect(x: 100, y: 100, width: 0, height: 0)

//インジケータサイズを拡大
activityIndicatorView.transform = CGAffineTransform(scaleX: 2.55, y: 2.55)

//Viewに追加
self.view.addSubview(activityIndicatorView)

//アニメーションの開始
activityIndicatorView.startAnimating()

```
namespaceの使い方


# 名前空間

名前空間は下記の様に定義させる。基本的に名前空間の宣言より前にはコメント以外の出力や文が存在してはいけない。

**namespace 名前空間;**

また、名前空間を機能によって階層化させる場合、バックスラッシュ(\)で区切る

**namespace 名前空間\サブ名前空間;  (例：namespace Project\Module)**

```php:lib1_2.php

//1つのファイルに複数の名前空間の定義をすることも可能
<?php 
namespace Lib1;
class Foo {
    public function get_foo() {
        return 'lib1.foo';
    }
}

//ここから Lib2の名前空間の中
namespace Lib2;
class Foo {
    public function get_foo() {
        return 'lib2.foo';
    }
}
?>
```


```php:lib3.php
<?php 
    namespace Lib3;
    class Foo {
    	public function get_foo() {
             return 'lib3.foo';
    	}
    }
?>
```


```php:class.php
<?php 
	// namespaceの使い方
	require_once 'lib1_2.php';
	require_once 'lib3.php';

	$foo = new Lib1\Foo();
	echo $foo -> get_foo();//lib1.foo

	$foo = new Lib2\Foo();
	echo $foo -> get_foo();

	$foo = new Lib3\Foo();
	echo $foo -> get_foo();//lib3.foo
?>
```

# インポートツール 

名前空間を使う際、別の名前空間やそれに属するクラスをuseキーワードを使ってインポートしたり、asキーワードにより別名をつけることができます。定数と関数はこれによってインポートすることはできない

```php:qiita.php
use \クラス名;
use 名前空間;
use 名前空間 as 別名;
use 名前空間 \クラス名;
```

たとえば、次のように記述することにより、Project\Moudule2名前空間をAnotherMouduleという別名で扱うことができるようになる

```php:example.php
namespace Project\Moudule;
use Project\Moudule2 as AnotherMoudule;

$obj = new AnotherModule\SomeClass(); //new Project\Moudule2\SomeClass()　と同様
```
Elixirのsumについて（ガード節）


前回の記事の補足。

http://qiita.com/tajihiro/items/f7dbf444608355c84ff6

下記のsumに関して言うと、実は抜け穴があって、n をマイナスにすると無限ループに陥る。


##Elixir

```sum.exs

defmodule Sum do
  def sum(0), do: 0
  def sum(n), do: n + sum(n - 1)
end

n = -5
IO.puts(Sum.sum(n))

# => ....
```

そこで、ガード節でパラメータの制限をする。


```sum.exs

defmodule Sum do
  def sum(0), do: 0
  def sum(n) when n > 0 do
   n + sum(n - 1)
  end
end

n = -5
IO.puts(Sum.sum(n))

#=> ** (FunctionClauseError) no function clause matching in Sum.sum/1
    sum.exs:2: Sum.sum(-5)
    sum.exs:9: (file)
    (elixir) lib/code.ex:370: Code.require_file/2
```

このエラーに対するハンドリングは必要なのだと思うが、別件として後日調べてみる。たぶんElixir的には、落ちたら落としてしまえという考え方なのであろうか？
Quantopianチュートリアル LESSON 3

[前回](http://qiita.com/driller/items/1c6311c3570e96a1df66)の続きです。

# LESSON 3 Referencing Securities

今回は銘柄を設定する方法を解説します。
Quantopianではティッカーシンボルを文字列で指定する方法ではなく、銘柄のインスタンスを作成する必要があります。このインスタンスには銘柄名やSIDの他、取引所の情報等、さまざまな情報が含まれています。

## sid()
`sid()` 関数の引数にSIDを渡すことで対象となる銘柄のインスタンスを作成できます。
下記の例ではアップル社のインスタンスを作成しています。

```python
def initialize(context):
    print(sid(24))
```

後述するsymbolを用いればティッカーシンボルを指定することができますが、`sid()` を使う利点として、ディッカーシンボルは変更される可能性があることに対して、SIDは変更されないことです。SIDは銘柄名を連想できないですが、下記のように `context` オブジェクトに設定することで識別がしやすくなります。

```python
def initialize(context):
    context.aapl = sid(24)
    print(context.aapl)
```

## symbol()
引数にティッカーシンボルを指定することで、銘柄のインスタンスを作成します。
下記の例ではアップル社のインスタンスを作成しています。

```python
def initialize(context):
    print(symbol('AAPL'))
```

ティッカーシンボルが変更された銘柄については、異なる名前が出力されることがあります。

```python
def initialize(context):
    print(symbol('UA'))
```

```
1970-01-01 09:00  PRINT Equity(27822 [UAA])
End of logs.
```

`set_symbol_lookup_date()` 関数を用いて古い名前を参照することもできますが、この方法は推奨されません。

```python
def initialize(context):
    set_symbol_lookup_date('2017-01-01')
    print(symbol('UAA'))
```

[LESSON 1,2](http://qiita.com/driller/items/1c6311c3570e96a1df66) <--> [LESSON 4](http://qiita.com/driller/items/d2aa7178773cfcafadbd)
TangoでQRコードの位置と向きを検出する


Tango SDKの中にある MarkerDetection というサンプルを見ればすぐわかると思いますが、要点をまとめておきます。

## Texture and Raw Bytes
Tango Manager の Enable Video Overlay にチェックを入れ、Method は「Texture and Raw Bytes」を選びます。「Raw Bytes」があるやつを選ばないと後述の `OnTangoImageAvailableEventHandler` が呼ばれません。また、「Texture」があるやつでないと画面にカメラの映像が出てきません。

![TextureAndRawBytes.png](https://qiita-image-store.s3.amazonaws.com/0/90023/21c1b5a7-a423-b686-0716-7207f70e7403.png "TextureAndRawBytes.png")


## 大きなQRコードを使う
自分が使っている端末は ZenFone AR なのですが、そのままではカメラのフォーカスが合っておらず、またTango SDK内にフォーカスを設定するAPIも見当たらないようだったので、10cm角程度の大きなQRコードを使う必要がありました。いずれフォーカスを設定するAPIの整備もされると思いますが、現状はこのような状況のようです。

## TangoSupport.DetectMarkers にはQRコードの正確なサイズを渡す

`TangoSupport.DetectMarkers` の4番目の引数は、TangoSupport.csのドキュメントコメントによると *Physical size of marker's length.* となっています。ここに適当な値を渡してもQRコードの認識はしてくれるので、自分は最初、この値はヒント的なものと思い込んでいました。しかし、よく調べてみると `TangoSupport.DetectMarkers` から返される `TangoSupport.Marker` の `m_corner3DP0` などの値がおかしくなっていました。QRコードの空間内での位置も利用したい場合には、ここにQRコードの正確なサイズを渡す必要があります。

（深度センサーの値からよしなにやってくれるとよいのですが、そうではないようです）

## OnTangoImageAvailableEventHandler

コード内でカメラの映像を利用するには `ITangoVideoOverlay` インターフェースを実装します。このインターフェースには `OnTangoImageAvailableEventHandler` というメソッド１つだけがあり、次のように実装します。

```csharp:
public class DetectMarker : MonoBehaviour, ITangoVideoOverlay {

	void Start () {
		TangoApplication tangoApp = FindObjectOfType<TangoApplication> ();
		tangoApp.Register (this);
	}
	
	public void OnTangoImageAvailableEventHandler(
		TangoEnums.TangoCameraId cameraId, 
		TangoUnityImageData imageBuffer)
	{
		List<TangoSupport.Marker> markerList = new List<TangoSupport.Marker> ();
		TangoSupport.DetectMarkers (imageBuffer, cameraId, TangoSupport.MarkerType.QRCODE, 0.0945, markerList);

		if (markerList.Count > 0) {
			TangoSupport.Marker marker = markerList[0];

			Debug.Log (marker.m_content);

			transform.position = marker.m_translation;
			transform.rotation = marker.m_orientation;

			var bottomToTop = marker.m_corner3DP3 - marker.m_corner3DP0;
			var leftToRight = marker.m_corner3DP1 - marker.m_corner3DP0;
			transform.localScale = new Vector3(leftToRight.magnitude, 1, bottomToTop.magnitude);
		}
	}
	
}
```
utf8mb4を使う時

例えばツイッターからの投稿をデータベースに格納する場合、
これじゃないと絵文字以降の文字がなかったことにされる。
フィールドだけだとダメだったのでテーブルの基本文字コードもutf8mb4にしたら
ちゃんと絵文字コードが登録されるようになったと。
DB移行時の整合性チェック

データ移行をした後、新旧DBの整合性チェックをいくつかのテーブルの中身見てOK！
の様にしていまして、、

これだと、不十分 & 非効率だけど、開発にも、確認にもそんなに時間を掛けられないなと思って放置していたら！
こんな記事を見つけました。

http://qiita.com/shigekid/items/d7eb7e0b9076103ffc52

新旧テーブルのカウントを比較しているスクリプトです。
こちらを流用させて頂きました。

こちらの記事では、mysqlだったのでpostgresql用に変更 + 少しアレンジ

```shell:DB_check.sh
#!/bin/bash
SOURCE_PASSWORD=""
SOURCE_DB_NAME=""
SOURCE_USER_NAME=""
SOURCE_HOST_NAME=""
SOURCE_PASSWORD=""
SOURCE_PORT=""
SOURCE_OPTIONS="-U $SOURCE_USER_NAME -h $SOURCE_HOST_NAME -p $SOURCE_PORT -d $SOURCE_DB_NAME"

TARGET_PASSWORD=""
TARGET_DB_NAME=""
TARGET_USER_NAME=""
TARGET_HOST_NAME=""
TARGET_PASSWORD=""
TARGET_PORT=""
TARGET_OPTIONS="-U $TARGET_USER_NAME -h $TARGET_HOST_NAME -p $TARGET_PORT -d $TARGET_DB_NAME"

# 指定したデーベースのテーブル名を全て取得
CMD="echo 'select relname as TABLE_NAME from pg_stat_user_tables;' | psql $TARGET_OPTIONS -t"
TABLES=(`eval $CMD`)

# 各テーブルごとにcountの結果を比較
export TOTAL_ERROR_CODE=0
for table in "${TABLES[@]}"
do
    export PGPASSWORD=$SOURCE_PASSWORD
    SOURCE_SQL="select count(*) FROM $table;"
    SOURCE_CMD="echo '${SOURCE_SQL};' | psql ${SOURCE_OPTIONS} | head -3 | tail -n 1"
    SOURCE_TABLECOUNT=(`eval $SOURCE_CMD`)

    export PGPASSWORD=$TARGET_PASSWORD
    TARGET_SQL="select count(*) FROM $table"
    TARGET_CMD="echo '${TARGET_SQL};' | psql ${TARGET_OPTIONS} | head -3 | tail -n 1"
    TARGET_TABLECOUNT=(`eval $TARGET_CMD`)

    if [ $SOURCE_TABLECOUNT = $TARGET_TABLECOUNT ]; then
      echo "OK is $table"
    else
      echo "NOT EQUAL $table SOURCE_DB count $SOURCE_TABLECOUNT  :  TARGET_DB count $TARGET_TABLECOUNT"
      export TOTAL_ERROR_CODE=1
    fi
done
if [ "$TOTAL_ERROR_CODE" -gt "0" ];then
  echo '---> エラーがあります!!!!'
else
  echo '---> 整合性が確認されました'
fi
```

【 実行環境 】
centos7.2
postgresql9.5
Crystal Report / Visual Studio 2015 : where is product.xml ?

## Visual Studio 2015 
1. download and extract CRforVS_clickonce_13_0_20.zip
1. move CRforVS_clickonce_13_0_20 to C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages\

##
**How to force the 32bit runtime to install on all CPU Architectures (Intel and AMD64) when using Click-Once deployment**
https://apps.support.sap.com/sap/support/knowledge/public/en/1553482


## file location

FOR CLICK ONCE DEPLOYMENT

In addition to making SAP Crystal Reports Runtime a prerequisite, you need to modify the product.xml file on the development machine. This file is located in: {Program Files}\Microsoft SDKs\Windows\v*.0A\Bootstrapper\Packages\Crystal Reports for .NET Framework 4.0\

Find the following line and comment it out: 

```
<BypassIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="Intel"/>
```


- 32bit OS with Visual Studio 2015 (14.0)



```
{Program Files}\Microsoft SDKs\Windows\v*.0A\Bootstrapper\Packages\Crystal Reports for .NET Framework 4.0\
```

- 64bit OS with Visual Studio 2015 (14.0)

```
C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages\Crystal Reports for .NET Framework 4.0
```
Elixir と Ruby のsumの比較


まだ、関数型プログラミングの記述、特に再帰には慣れていない。
でも、再帰＆パターンマッチが含まれているので理解するべき。

## Ruby

```sum.rb
def sum(n)
  result = 0
  (1..n).each do |n|
    result = result + n
  end
  result
end

n = 5
puts sum(n)

# => 15
```

##Elixir

```sum.exs
defmodule Sum do
  def sum(0), do: 0
  def sum(n), do: n + sum(n - 1)
end

n = 5
IO.puts(Sum.sum(n))

# => 15
```

または、わかりやすく書くと

```sum.exs
defmodule Sum do
  def sum(0) do
    0
  end
  def sum(n) do
    n + sum(n - 1)
  end
end

n = 5
IO.puts(Sum.sum(n))

# => 15
```


話す時に、日本語(Ruby)⇒英語(Elixir)みたいに脳内変換しているうちは、まだまだ未熟。
日本語(Ruby)、英語(Elixir)ともにネイティブで話したいものです。


### ※追記

ちなみに、`Elixir` には標準でリストを`sum`する関数は`Enum`に存在します。

```sum.exs
n = 5
IO.puts(Enum.sum(1..n))


# => 15
```
メールアドレスの正規表現に＋を忘れないで

そうか。忘れていました。

gmailのメアドは、+を使うと、１つのアカウントで、複数のメアドを擬似的に作ることができること。
例えば、
AAA@gmail.com
というメアドのアカウントを持っていた場合、
AAA+01@gmail.com
AAA+XXX@gmail.com
というメアドをアカウントを発行しなくても作成できます。
開発のテストとかに便利な技なのですが、サンプルとして提供しているコードには、この＋が正規表現に入っていないことが多いので要注意です。
ChefTips: yum グループインストール を使いたい

Redhat系のパッケージ管理ツールであるところの yum には グループインストール という関連するパッケージを一気にインストールしてくれる機能があります。

[参考] Yum のグループ機能を使ってパッケージ インストールを楽にする
https://jp.linux.com/Linux%20Jp/tutorial/420167-tutorial2014081101

また、Chef には yum_packageリソースという機能があり、recipeに

`yum_package ksh`

と書くだけでいい感じに パッケージを導入してくれます。が、yum_packageリソースのマニュアルを読むと分かるように、Chef の yum_package リソースには グループインストール のオプションがありません。

[参考] yum_package
https://docs.chef.io/resource_yum.html

yum のグループインストール機能が使える Chef の recipe というのをご紹介したいと思います。

## 解決策(1) supermarket のcookbookを利用する

Chef supermarket で そのものズバリ `yumgroup` という cookbook が提供されています。  

yumgroup
https://supermarket.chef.io/cookbooks/yumgroup

このCookbookはrecipeを持たない LWRP(Light Weight Resources & Provider) Cookbook なので、拡張Resourcesを提供してくれます。本Cookbookの場合は、`yumgroup` という yum グループインストール の機能を持つ 拡張Resourcesを提供してくれるようです。


```rb
include_recipe 'yumgroup'

yumgroup 'Web Server' do
  action :install
end
```


## 解決策(2) executeリソースを利用する

supermarket の cookbook に頼らずとも、以下のように execute リソースをうまく活用すれば、若干 recipeの可読性は落ちるかもしれませんが、実装可能です。

```rb
execute 'X Window System' do
  user 'root'
  command "LANG=C yum groups install -y hidden 'X Window System'"
  action :run
  not_if "LANG=C yum groups list -q installed hidden | grep 'X Window System'"
end

execute 'Fonts' do
  user 'root'
  command "LANG=C yum groups install -y hidden 'Fonts'"
  action :run
  not_if "LANG=C yum groups list -q installed hidden | grep 'Fonts'"
end
```

supermarket の cookbook とくらべても シンプルな実装が実現できますので、execute リソースでの実装がおすすめです。
ChefTips: Chef Serverの監視について

Chef Server が 正常に稼働していることを確認する 監視についてまとめます。

## プロセス監視について

以下のコマンドで、Chef Serverが稼働するのに必要なプロセスの確認をしてくれます。

```shell-session
$ chef-server-ctl status
run: bookshelf: (pid 9362) 448380s; run: log: (pid 15172) 20481787s
run: nginx: (pid 9397) 448380s; run: log: (pid 15283) 20481781s
run: oc_bifrost: (pid 9402) 448379s; run: log: (pid 15001) 20481795s
run: oc_id: (pid 9431) 448379s; run: log: (pid 15025) 20481793s
run: opscode-erchef: (pid 9450) 448378s; run: log: (pid 15216) 20481786s
run: opscode-expander: (pid 9463) 448378s; run: log: (pid 15109) 20481788s
run: opscode-solr4: (pid 9468) 448377s; run: log: (pid 15069) 20481790s
run: postgresql: (pid 9475) 448377s; run: log: (pid 14943) 20481796s
run: rabbitmq: (pid 9485) 448376s; run: log: (pid 14851) 20481798s
run: redis_lb: (pid 9501) 448376s; run: log: (pid 15277) 20481782s
$ echo $?
0
```

停止しているプロセスがある場合は、`chef-server-ctl status`コマンドの返り値が 0以外になるので、プロセス監視としては、このコマンドの返り値を監視すればよいと思います。
 
ちなみに、Chef Workstation や Chef Node側にインストールされる Chef Development KitやChef-Client は通常常時起動ではありません。Cookbook実行時に都度起動されるので、プロセス監視は不要です。


## ディスク使用率監視について

公式サイトのススメに従い、以下の２つのディレクトリ（もしくはこれらのディレクトリが格納されているファイルシステム）を監視しましょう。

* /var/log/opscode
* /var/opt/opscode



## その他Chef Serverを構成するアプリケーションの監視について

以下の公式サイトが参考になりますので、必要に応じて参照してください。
また、ここも経験上監視しておいたほうがいいよ！という情報をお持ちの方がいらっしゃいましたら、コメントなどで教えてくださると助かります。



参考/引用: [Monitor](https://docs.chef.io/server_monitor.html)
Oracle Java を使って Glassfish 5 を起動する Dockerfile を作ってみた


**Glassfish5** の 配布パッケージから Docker Image を作成する Dockerfile です。

## 説明

Glassfish5 は Java EE 8 の参照実装となっていて、その Java EE 8 の公開（最終リリース）も 2017年7月という事で迫ってきました。
リリースに向けて Glassfish5 のビルドも盛んに行われています。
この Glassfish5 の配布パッケージを取得して、Oracle Java を使って動かす環境のDocker Image を作成する Dockerfile です。

## 動作イメージ

![](https://raw.githubusercontent.com/shinyay/docker-glassfish5/v1.0.0/docs/images/docker-glassfish01.gif)

## 特徴

- ２種類のビルドパッケージ毎の Dockerfile
  - [Nightly](http://download.oracle.com/glassfish/5.0/nightly/)
  - [Promoted](http://download.oracle.com/glassfish/5.0/promoted)
- Oracle Java ベース
  - [Oracle Java 8 SE (Server JRE)](https://store.docker.com/images/oracle-serverjre-8)
    - ※上記 Oracle Java は Docker Store で公開しているイメージのため、Docker Store のアカウントに使用権限を付与しておく必要があります
- リモート接続設定済み
  - Glassfish Console にローカル以外からアクセスする場合に必要となるリモート接続設定を予め構成
  - 管理者ユーザ ： admin / 管理者パスワード：glassfish　を設定

## 前提

- Docker Store のアカウントを保有していること
- Oracle Java の使用権を Docker Store に紐付けていること

## 使用方法

### Docer Image の取得 (`docker pull`)

`docker pull shinyay/docker-glassfish5`

Docker Hub の以下に登録している Docker Image を取得します
https://hub.docker.com/r/shinyay/docker-glassfish5/

### Docker Container の起動 (`docker run`)

#### 最新のバージョン
`docker run -d -it --rm -p 4848:4848 shinyay/docker-glassfish5`

タグをつけない場合は、`latest` が起動します。このタグの実体は、Nightly Build の最新版になるようにビルドしています。

#### Promoted ビルド
`docker run shinyay/docker-glassfish5:<ビルドバージョン>`

たとえば、`docker run shinyay/docker-glassfish5:b10` とすると、一連のテストケースをクリアした安定しているビルドの **Promoted Build** のイメージを起動します。

#### Nightly ビルド
`docker run shinyay/docker-glassfish5:<ビルドバージョン>-MM_DD_YYYY`

たとえば、`docker run shinyay/docker-glassfish5:b10-07_04_2017` とすると、簡易的なテストケースのみをクリアしたビルドの **Nightly Build** のイメージが起動します。

#### ビルドバージョンの確認
Docker Hub の **Build Details** タブにDockefileからのビルド結果が一覧表示されています。以下のURLで確認できます:

- https://hub.docker.com/r/shinyay/docker-glassfish5/builds/

![](https://raw.githubusercontent.com/shinyay/docker-glassfish5/v1.0.1/docs/images/docker-glassfish02.png)

### 管理コンソール (Glassfish Console) へのアクセス
上記のDocker の起動コマンドのオプションで、以下のパラメータを追加していました、

- **-p 4848:4848**

これは、Docker Container 内で起動している Glassfish の管理コンソールが Listen しているポート番号 **4848** に対して、外部（Glassfish コンテナ を起動しているホスト環境）のポート番号をマッピングする設定です。

これを行うことで、ローカル環境のIPアドレス、ホスト名や localhost の 4848 番ポートでか管理コンソールにアクセスできます。

- 管理コンソール: http://localhost:4848

なお管理者は、デフォルトでは設定済みの `admin/glassfish` を使用してください
enumを使って結果をハンドリングする Swift 3.0

例えば、以下の例は、オーブンの電源がついているか、消えているか判定している。
オーブンが付いていた場合は、温度付きのStringを返す。

```

import UIKit

enum OvenState{
    case on(Double)
    case off
}

var ovenState = OvenState.on(450)

switch ovenState{
case let .on(temperature):
    print("The oven is on and set to \(temperature) degrees")
case .off:
    print("The oven is off")
}
```
angular.io FUNDAMENTALS/Bootstrapping メモ

https://angular.io/guide/bootstrapping

# Bootstrap

アプリケーションは少なくとも1つのModuleを持っていて、 `bootstrap` でアプリケーションを起動する。便宜的にAppModuleと呼ぶ。

```ts:src/app/app.module.ts
import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent }  from './app.component';

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
```

`bootstrap` で指定したコンポーネントが `index.html` に描画される。

## The _imports_ array

Angularでは機能ごとのモジュールを統合してアプリケーションを作る。Angular自体も、 `HttpModule` `RouterModule` のようにモジュールに分かれている。 `imports` の配列にモジュールを追加してそのモジュールの機能を使う。

ほとんどのアプリケーションがブラウザで動作するので、 `@angular/platform-browser` の `BrowserModule` が必要になる。

> `imports` に入るのは `NgModule` のクラスだけで、他のクラスを入れてはいけない

> ES2015の `import` とAngularのNgModuleでの `imports` は異なる

## The _declarations_ array

モジュールで使うコンポーネント、ディレクティブ、パイプを全て `declarations` に並べる。 `declarations` に入れていないコンポーネントを使うとエラーメッセージがブラウザに表示される。

> `declarations` に入れるのはコンポーネント、ディレクティブ、パイプのみで他のNgModuleクラスやサービスクラスなどを入れてはいけない

## The _bootstrap_ array

AppModuleをbootstrapしてアプリケーションを起動する。 `bootstrap` の配列に並べたコンポーネントがDOMに挿入される。

各ブートストラップされたコンポーネントはコンポーネントのツリーのルートになる。

複数のコンポーネントを `bootstrap` に書くのは一般的ではなく、ほとんどの場合一つのコンポーネントを指定し、それがルートコンポーネントとなってコンポーネントのツリーとなる。

そのルートのコンポーネントをなんと読んでもいいが、大抵のデベロッパーは `AppComponent` と呼ぶ。

## Bootstrap in _main.ts_

アプリケーションをブートストラップする方法はたくさんある。どれにするかは、コンパイルの方法と実行の方法による。

最初はアプリケーションを動的にコンパイルするJIT(Just-In-Time)コンパイラを使って、ブラウザ上でコンパイルする。他の方法は後述する。

JITコンパイルのアプリケーションは `src/main.ts` に置くのを勧める。

```ts:src/main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule }              from './app/app.module';

platformBrowserDynamic().bootstrapModule(AppModule);
```

このコードは、動的（JIT）コンパイル用のブラウザプラットフォームを作成し、上記のAppModuleをブートストラップする。

ブートストラップは実行環境を設定し、モジュールの `bootstrap` 配列からルートになる `AppComponent` を取り出し、コンポーネントのインスタンスを生成してタグを挿入する。

```html:setup/src/index.html
<my-app><!-- content managed by Angular --></my-app>
```

## More about Angular Modules

最初のアプリではルートのモジュール一つだけだが、アプリケーションが大きくなるとフィーチャーモジュールに切り分けて遅延ロードすることもできる。
Objectに対してaget/asetを使うな、という話

ここ数日ClojureScript界隈でオブジェクトに対してaget/asetを使うな!
という話題が散見されており、何故そうなのかを調べてみた。

## 要するに?
- aget/asetは元々配列に対する操作であり、オブジェクトに対しても動作するのは偶然
    - jvmの方のClojureではこのような使い方は出来ない
- Closure Libraryにオブジェクトを操作するための関数があるのでそちらを利用するべき 
    - goog.object/get
    - goog.object/set
- aget/asetでオブジェクトを操作しようとすると警告が出るようにするオプションがコンパイラに追加された
    - aget/asetが動かなくなるわけでは無い
- パフォーマンスクリティカルなケースに対応するための 'unsafe-get' マクロが追加された

## オブジェクトのプロパティへのアクセス方法

### .-でアクセス
扱うオブジェクトが':optimizations :advanced'(いわゆるアドバンスドコンパイル)の際に、
リネームの対象になる場合は以下の用にしてプロパティにアクセスする。
.-propertyはアドバンスコンパイルの際に適切にリネームされる。

```clj
(.-property an-object)
```

### aget 
一方、扱うオブジェクトが外部ライブラリ等でアクセスするキーが予め定まっている場合、
'.-' でプロパティにアクセスを行うとアドバンスコンパイル時に意図していたキーとは異なる値にリネームされてしまう。
このようなケースにexternファイルをわざわざ書きたくない人は多数おり、
- Closure Compilerが文字列には一切手をつけないこと
- JavaScriptではオブジェクトに対して文字列の添字でアクセスできること
を逆手にとりagetを利用して回避していた。

事実

```clj
(aget an-object "property")
```
は

```js
(cljs.user.an-object["property"])
```
のようにコンパイルされ、動く。

### goog.object

agetの代わりに利用を推奨されているgoog.object/getは以下のように使う

```clj
(require '[goog.object :as o])
(o/get #js {:foo "bar} "foo")
=> "bar"
```

## 参考

- https://google.github.io/closure-library/api/goog.object.html
- https://github.com/clojure/clojurescript/commit/fb6c04f4ae16877ba7fa797e9378d8a1ba74fd89
- https://github.com/clojure/clojurescript/commit/3b5d88a2546c07fc27da5014445f03ac15a9f22f
- https://dev.clojure.org/jira/browse/CLJS-2148
- https://twitter.com/mfikes/status/881315944257204224
- https://github.com/glittershark/core-async-storage/pull/8
Rubyでユニットテスト以外のところでassertを使いたい

# 背景
ユニットテスト以外のところ、つまり通常のコード内で、条件が満たされなかったら例外を投げたい。
独自の`assert`メソッドを作ればできるけど、`assert_equal`や`assert_in_delta`などたくさん作るのは面倒くさい。

# minitestを使う方法

そこでminitestのassertをなんとか使えないかとやってみたのがこちら。

```rb
require "minitest"

# このモジュールの中に各種assertが定義されているのでinclude
include Minitest::Assertions

# それだけでうまくいくかと思いきや、self.assertionsが定義されていないとエラーになってしまった
class << self
  attr_accessor :assertions
end
self.assertions = 0


a = 1 + 2
assert_equal 3, a
#assert_in_delta Math::PI, (22.0 / 7.0), 0.00001, "これは失敗するはず"
#refute_empty [], "これも失敗するはず"```
```

確認したのは

- Ruby 2.4.1
- minitest 5.10.1

minitestの各種assertメソッドのリファレンス：http://www.rubydoc.info/gems/minitest/2.2.0/MiniTest/Assertions

---

# RSpec Expectationsを使う方法

rspecはexpectationsの部分がライブラリとして切り出されていて、そちら単体でも使える。

```
gem install rspec
```

```rb
require "rspec/expectations"

include RSpec::Matchers

expect(1+2).to eq 3
expect(2+3).to eq 6
```
【WordPress】post_classに好きなclassを追加する方法（WP初心者メモ）

WordPressでpost_classを使って好きなclassを追加する方法のメモ。
自動でクラスを追加してくれるpost_class();ですが、ここにクラスを追加したい場合は()の中に記入します。

```
<?php post_class('ここにクラス名'); ?>
```
()の中にクラスを追加する時は''を忘れないように・・・！

例えば、hogeというクラスを追加する場合は

```
<?php post_class('hoge') ?>
```
と書けばOK。

##複数のクラスを追加する場合
###スペースで追加する方法
複数のクラスを追加したい場合はスペース空けて記入していきます。

```
<?php post_class('hoge fuga') ?>
```
###配列で追加する方法

```
<?php
	$classes = array( 'class1', 'class2', 'class3' );
?>
<div id="post-<?php the_ID(); ?>" <?php post_class( $classes ); ?>>
```
複数のクラスのセットを使いまわしたい場合は配列にして使用するのが便利かもしれないですね。

[Codex テンプレートタグ/post class](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/post_class)
面接で絶対に押さえておきたいアルゴリズム問題(6)

## 問題：Valid Parentheses 

Parentheses とは　(), {}, []などの囲むものである。
StringのInputを取り込んで、括弧が有効であるかチェックをして、Boolを返せ。


## 例：

```
input： "{}()[]" もしくは "()"
return: true

input "[("
return: false

input "["
return: false

input "[()]"
return: false

```

## ヒント：



## 解答：

```
func isValid(_ s: String) -> Bool {
    
    var isValid = true
    var b:Character = "c"
    let chars = s.characters
    
    for a in chars{
        
        if chars.count % 2 != 0 {
            isValid = false
            break
        }
   
        if a == "(" || a == "{" || a == "["{
            
            if a == b{
                isValid = false
                break
            }
            
            if b == "{" || b == "(" || b == "["{
                isValid = false
                break
            }
            
            b = a
        }
        
        if a == ")" && b != "("{
            isValid = false
            break
        }
        
        if a == "}" && b != "{"{
            isValid = false
            break
        }
        
        if a == "]" && b != "["{
            isValid = false
            break
        }
        
        if a == ")" || a == "}" || a == "]"{
            b = a
        }

    }
    
    return isValid
}
```

### メモ /　一言

またですが、もっといい解決方法があるはず・・・！

これはできればいつか解きたい↓、もしくは誰かに解いて欲しい
あとは最後の "{()}"が Stringだった場合にtrueを返す、という方法がわかりませんでした。
AWS CLI で取得したEC2インスタンス一覧を jq で絞ってソートする

ハマったので備忘録。

#環境
Amazon Linux or CentOS
aws-cli 1.11.83
jq 1.5

#やりたいこと
EC2インスタンスを対象のタグで絞ってインスタンス名のソートで表示する

```:CLI
$ aws ec2 describe-instances \
--filter "Name=tag:Name,Values=sono*" | 
jq -r '.Reservations[].Instances[] |
 [.Tags[] | select(.Key == "Name").Value][] + "\t" +  .InstanceId + "\t" +
 .PublicIpAddress + "\t" +  .PrivateIpAddress' | sort
```
```:結果
sono1	i-0X0X0979e008fd5f8	54.70.109.00	10.0.4.000
sono2	i-0X0X06f7ucd19029a	54.70.109.000	10.0.4.000
sono3	i-0X0X0p8e699ae08ab	54.70.109.00	172.31.10.00
sono4	i-0X0X0oebe92d37784	34.210.182.00	10.0.4.00
sono5	i-0X0X0564fb43b1fd6	34.210.192.000	172.31.15.00
sono6	i-0X0X095cb7ae6998b	54.70.210.00	10.0.1.00
sono7	i-0X0X093e5e6e008ed	35.164.127.00	172.31.13.000
sono8	i-0X0X0rc9854d1db65	52.33.146.000	172.31.3.000
sono9	i-0X0X08d243309f8cb	35.166.176.00	172.31.13.000
```
１. EC2のインスタンス一覧の表示

```
aws ec2 describe-instances 
```
２. タグの前方一致検索

```
--filter "Name=tag:Name,Values=sono*" 
```
３. 結果をタブ区切りで表示

```
jq -r '.Reservations[].Instances[] |
 .Tags[].Value + "\t" +  .InstanceId + "\t" +
 .PublicIpAddress + "\t" +  .PrivateIpAddress'
```
４. 並べ替え

```
 | sort
```

##次に検討中なこと
`@tsv` を使うと警告がでるので調査してみる。

```:CLI
$ aws ec2 describe-instances | \
    jq -r '.[][].Instances[]
         | [[.Tags[] | select(.Key == "Name").Value][],
            .InstanceId,
            .PublicIpAddress,
            .PrivateIpAddress,
            .InstanceType]
         | @tsv' | sort 
```
```:エラー
jq: error (at <stdin>:1210): Cannot iterate over null (null)
```

#Tips
CentOS6に`pip`をインストール

```
rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install python-pip
```
`pip` のアップデート

```
$ pip install --upgrade pip
```
`aws-cli` のインストール

```
$ pip install awscli
```
JSONパーサ `jq` コマンドのインストール

```
$ sudo yum install jq
```
使う前に認証してから

```
$ aws configure
```
すべてのインスタンス一覧の取得

```
$ aws ec2 describe-instances | jq '.Reservations[].Instances[]'
```
実行結果を複数カラムに分けて整形（プロンプト上で縦がそろう）

```
column -t
```
実行したディレクトリに結果ファイルを出力（末尾に追加）

```
--output result
```
削除保護の無効化

```:instance1個
$ aws ec2 modify-instance-attribute --instance-id i-0X0X0X0X --no-disable-api-termination
```

```:instance複数
$ aws ec2 modify-instance-attribute --instance-id i-0X0X0X0X --instance-id i-0X0X0X0X --no-disable-api-termination
```
稼働中インスタンス一覧の取得

```
aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" | 
jq -r '.Reservations[].Instances[] |
 .Tags[].Value + "\t" +  .InstanceId + "\t" +
 .PublicIpAddress + "\t" +  .PrivateIpAddress' | sort
```
インスタンスの削除

```
aws ec2 terminate-instances --instance-ids i-0X0X0c9854d1db65
```
Kotlinいいとこまとめ②

#いいとこまとめ
[こちら](http://qiita.com/yutaka_izumaru/items/f77a9053f896ece99a4b)の続編
あんまいい例が思い浮かばないのはご勘弁を。。

###プロパティ
前回もプロパティ触れたんですが。
バッキングフィールドを自動で生成してくれる。
いちいちバッキングプロパティ用意しなくていい。素敵。

```Kotlin:BackingProperty
public var text: String = "Kotlin"
    get() = "Hello " + _foo
    set(value) {
        _foo = value
    }
private var _text = ""
```

```Kotlin:BackingFiled
public var text: String = "Kotlin"
    get() = "Hello " + field
```

###if文ではなくif式である
これなら便利さが伝わる...はず...

```Kotlin
val str1 = "Hello"
val str2 = "World"
val string: String = if (str1 === "Hello") {
    if (str2 == "World") str1 + " " + str2 else "Kotlin"
} else {
    "Bye"
}
```

###シングルトン
Android Javaのシングルトンはいまいちだった。
[参考](http://devdevdev.hatenablog.com/entry/2014/12/06/232423)
ちょー簡単。

```Kotlin
object SingletonObject {
    val hoge : Int = 1
}
```

###Extension
きたーー
もう語るまでもないですね
公式から拝借

```Kotlin
fun MutableList<Int>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}
```

###Nullable
きたーー
こちらも語るまでもないですね
同じく公式から拝借

```Kotlin
var a: String = "abc"
a = null // compilation error
```

###コンストラクタ
らくちん

```Java:Java
class Foo {
    private final String name;

    Foo(String name) {
        this.name = name;
    }
}
```

```Kotlin:Kotlinにそのまま直すとこう
class Foo(name: String) {
  private val name = name
}
```

```Kotlin:もうちょい省略できる
class Foo(private val name: String) {
}
```

###アクセス修飾子
デフォルトでpublic final
継承されるの想定されないのにfinalじゃないのが嫌で嫌で毎回毎回finalつけてたぼく歓喜。

あとはtoとかかなー。これは次回。

[株式会社Arrvis](http://www.arrvis.com)
Django Site Tuning -- サイトのチューニング　#１

# Overview

Django でサイトの高速化を図るためのTipsを記述していく

## Compress

CSSやJavascript類を圧縮してくれる・・・以外にもいろいろ機能があるはずだが
理屈と実装の容易さを考えるととりあえずその程度の理解でも貢献度は十分ある。
これまた測定結果をどこかで載せたい。

 - django-compressor
  - https://django-compressor.readthedocs.io/en/latest/
 - django-assets
  - https://django-assets.readthedocs.io/en/latest/
 - django-pipeline
  - https://django-pipeline.readthedocs.io/en/latest/index.html

### django-compressor

これだけ試してみた。非常に簡単だが1点だけ微妙にハマったので記述

1. Quick Install通りインストールする
    - pip install django-compressor
    - settings.py に記述
1. CACHE フォルダを作り書き込み権限を与える！！
1. Templateにcompress タグを記述するだけで直ぐに動く

2．の手順を忘れると見事にPermission Deniedと出て動かないので注意が必要。

## django-assets

たぶん、Compressorと同じことはできる。
Documentのサイトが微妙に見づらかったのでスルー。

## django-pipeline

上記、二つを探している過程で知ったもの。
settings.pyに読み込むJavascriptを書けるなど、
カスタマイズ要素が非常に豊富な印象を受けるが、
Templateファイルの利便性は即時反映という書き換えの容易さもあるので
一概に設定できるというのがメリットかといわれると何とも言えない。

# パフォーマンス結果

# その他

SQL回りも同時に書こうと思いましたが、圧縮だけでも1ページ書けそうなので
別枠でPostすることにします。
怠惰なRAII

C++のRAIIは素晴らしい。
ご存知の通りRAIIはコンストラクタとデストラクタの対称性を利用した資源の解放忘れのリスクを減らすテクニックである。
例えば、以下の様な安易な資源の作成には、資源の解放忘れによるメモリリークのリスクが存在する。

```cpp:example1.cpp
int main() {
  auto p = new int{};
  if (p && *p) {
    std::cout << *p;
    delete p;
  }
  // *p==0の時メモリリークする
}
```

この様なリスクを減らす為にRAIIを利用する。
コンストラクタに作成した資源を渡し、デストラクタで資源を解放する。

```cpp:example2.cpp
int main() {
  struct RAII {
    RAII(int* p) : p_(p) {}
    RAII(RAII const&) = delete;
    RAII& operator =(RAII const&) = delete;
    ~RAII() { if(p_) { delete p_; } }
    int& operator *() { return *p_; }
    explicit operator bool() const { return p_; }
  private:
    int* p_;
  } p{new int{}};

  if (p && *p) {
    std::cout << *p;
  }
  // pの資源はここで解放される
}
```

RAIIは便利で安全だが、その都度コンストラクタとデストラクタを定義するのは面倒である。
そこで標準機能のstd::unique_ptrがある。

std::unique_ptrを利用する事で、上記のコードが以下のように短縮できる。また、任意の位置で資源を開放できる。

```cpp:example3.cpp
int main() {
  std::unique_ptr<int> p(new int{});
  if (p && *p) {
    std::cout << *p;
    p.reset();
  }
  // *p==0であれば、pの資源はここで解放される
}
```

std::unique_ptrには資源を開放する時の手続きを変更する機能（デリーターの指定）もある。
テンプレート実引数の第2引数に第1引数のポインタを受け取る関数型を渡せばよい。
例えば、資源を解放する直前に内容を表示したい場合は以下の様にデリーターを指定する。

```cpp:example4.cpp
int main() {
  auto deleter = [](int* p){ std::cout <<*p; delete p; };
  std::unique_ptr<int, decltype(deleter)> p(new int{}, deleter);
}
```

実にシンプルで美しい機能である。しかし、資源が常にポインタであるとは限らない。
例えば、モジュールの初期化と解放が対の関数になっている場合である。実際に、この様な関数を持つモジュールは多数存在する。
この時、やはり解放の関数（例ではmylib::term）を忘れてしまうリスクが存在する。

```cpp:example5.cpp
int main() {
  auto good = mylib::init();
  if (good && mylib::setup()) {
    mylib::update();
    mylib::term();
  }
  // mylib::setup()が失敗すると解放されない
}
```

モジュールはポインタではない為、std::unique_ptrが利用できない。とは言え、前述のRAII型を定義するのは面倒である。
ここで、ポインタではない資源に対するRAIIに於いてstd::unique_ptrを利用するテクニックを紹介する。
std::unique_ptrは保持するポインタがnullptrである場合はデリーターを呼び出さない。
そこで、モジュールの初期化が成功した時にnullptrでないポインタを設定する。失敗した場合はnullptrを設定する。
これにより、初期化が成功した時にだけ解放関数が呼び出される。そして成功した時に設定するポインタはnullptrでなければなんでも良い。例えば、以下の様にvoidポインタとしてstd::unique_ptr自身のアドレスを渡しても良い。
未初期化のインスタンスのポインタを渡す事になる。しかし、このポインタが真偽テスト以外に利用される事はない。**大丈夫だ、問題ない。**

```cpp:example6.cpp
int main() {
  auto mylib_term = [](void*){ mylib::term(); };
  std::unique_ptr<void, decltype(mylib_term)> mylib_raii(mylib::init() ? &mylib_raii : nullptr, mylib_term);
  if (mylib_raii && mylib::setup()) {
    mylib::update();
    mylib_raii.reset();
  }
  // mylib::setup()に失敗しても解放される
}
```

どうしても心配な場合は、デリーターのポインタを渡しても良い。
この時constなstd::unique_ptrに指定できる為、より堅牢になる場合がある。

```cpp:example7.cpp
int main() {
  auto mylib_term = [](void*){ mylib::term(); };
  std::unique_ptr<void, decltype(mylib_term)> const mylib_raii(mylib::init() ? &mylib_term : nullptr, mylib_term);
  if (mylib_raii && mylib::setup()) {
    mylib::update();
  }
}
```

以上、怠惰なRAIIでした。
プログラミング初心者がRubyを独学するときにとりあえずやったこと

#この記事について
Rubyを独学しようと思ったときに、とりあえずやってみたことのご紹介です。

##レベル感
プログラミングを習得したいフロントエンドエンジニアです。jQueryを使った見た目上の操作、人が作ったphp(WordPress)をいじる、程度のプログラミング（と言えるのか）レベルで、javaScript習得に挫折気味のため、プログラミングに対する苦手意識が強いです。この、プログラミングに対する強い苦手意識を克服する＋仕事の幅を広げるため、楽しいプログラミング言語であると評判のRubyを限界までやってみることにしました。

##とりあえずやってみたこと
###1.概要の理解
[Rubyドキュメント](https://www.ruby-lang.org/ja/documentation/)の「Rubyとは」をじっくり読んでみました。他の項目は軽く目を通す程度に。
###2.エディターを使って"Hello, Ruby!"
エディターを選定して、とりあえずお決まりのこれを実行してみました。

```ruby:Ruby
print "Hello, Ruby!"
```
エディターはRubyMineにしました。Run機能を使えばターミナルを開くことなくその場で実行結果を見られるなど細々したことはあとで知りましたが、ガイドが優しいので、確かに初心者でも安心して使えそうです。

参照サイト
 ・[Railsの開発に使えるエディタ･IDE+新世代クラウドIDE](http://blog-ja.sideci.com/entry/2014/04/15/080000)
 ・[RubyMine](https://www.jetbrains.com/ruby/)
###3.オンラインレッスンProgate初級
オンライン上で実際にコードを動かしながらクイズ感覚で学習を進めることができるサービスです。Ruby Ⅰ（基本的な文法、変数、条件分岐など）は無料で受講できます。Rubyは初めてで、環境設定をする以前にとりあえずどういう振る舞いをするのか触ってみたいという方にはおすすめですが、ちょっと触ったことのある方には、無料プランは易しすぎて不向きかもしれません。

参照サイト
・[【完全保存版】Ruby入門に絶対おすすめな学習サイト厳選5選！](http://www.sejuku.net/blog/2132)
・[Progate](https://prog-8.com/)
###4.入門書を選定
なにか1冊決めてとことんやれ、というアドバイスを受け、とことんやる入門書を選定しました。ブログや書店をうろうろして、こちらに決定しました。

参考書籍
[『たのしいRuby 第5版』 高橋 征義(著), 後藤 裕蔵(著), まつもと ゆきひろ(監修)](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC5%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797386290)

訳がわからなくとも気力でとにかく1巡！

###5.アプリをつくってみる
入門書を進めていく途中（第8章クラスとモジュールあたり）で、「でも、実際のwebアプリケーションはどういう構造でどうやって動くんだろ？」というところが気になってしまい、入門書と平行してTwitter的なwebアプリケーションのチュートリアルをやってみました。

参照サイト
[『小学生でもわかるRuby on Rails入門』](https://openbook4.me/projects/92/)

##とりあえずこれからやってみること
※ここからはまだ、妄想の領域です
###1.入門書を3巡する
訳がわからなくとも状態で1巡したので、書いてあるコードを実行してみながら2巡、ちゃんと理解しながら3巡します。
###2.チュートリアル写経
入門書3巡が終わったら、いい感じのチュートリアルがたくさんあるサイトを選んでとにかく写経します。
###3.Ruby on Rails
2.と平行してRuby on Railsを基礎から学習します。
###4.webサービスを自力で作ってみる
自力で作ってみます。ルームメイト募集サイトか思い出共有サイトか何か、作りたいものかつ簡易な構成のものを考え中です。まだ、できることとできないことがきちんとわかってないので、追々…。
###5.コミュニティに行ってみる
人見知りな私には一番勇気がいるやつです。でも、Rubyistさんは、普段どんなことしてるのか、どんな人たちなのか知りたいです。あわよくば先生になってku...

##最後に
そんな感じで今度こそ挫折せず(js挫折気味)に頑張ります。
想定外の(98)Address already in use: make_sock: could not bind to address　

vagrantでPHPの環境を作ってる過程で詰まったときの話を書こうと思います

なお、実行環境については前回の記事をご参照ください。
http://qiita.com/wakaran_ojisan/items/894fdd8adcea2e95e2d3

##(98)Address already in use: make_sock: could not bind to address

フレームワーウを使った環境とフレームワークを使っていない環境を切り分けるためにバーチャルホストの設定をしていたところ上記のエラーが起こりました。
vagrantに登録されていたボックスは一つ。PCの再起動などもしてみましたが解決せず、誰がAddressを握っているのかもわかりませんでした。

で、エラーメッセージから下記の記事を参考に調べてみましたが解決せず。

他プロセスがポートを占有してhttpdを再起動できない
http://qiita.com/ysk24ok/items/ffe8d5d1479aaf5afeaa

詳しい方にバーチャルホストのファイルを確認してもらいましたが、ファイルには問題ないとのこと。

##結果
原因は過去に環境構築をやり直したときに残っていたvagrantの残骸が同じIPアドレスを使用していたためでした。
vagrantをアンインストールし名のつくファイルすべて削除してやり直したら治りました。

不幸なことにhttpdの自動起動（schkconfig httpd on）を設定していたため再起動しても再立ち上げされ、しかも使用しているvagrantと別バージョンを試したときのもので同じPC内に2つのvagrantが存在しており、片方で確認しても、もう片方が立ち上がっていることを検知できませんでした。コマンドを打っても違う仮想マシンの情報なので出力されません。

みなさんも、環境構築をやり直したりした際はお気をつけを。
gitでbareリポジトリを作成して、ディレクトリ指定でクローンする

# 環境
* Windows Server 2012
* git for windows 2.13

# セントラルリポジトリの作成

```bat:コマンドプロンプト
cd git-central

mkdir git-test.git
cd git-test.git

git init --bare --shared=true
```

  * git-central: セントラルリポジトリのルートディレクトリ
  * git-test.git: 新規作成するプロジェクトディレクトリ

# 認証を無効化
git-test.gitディレクトリでgit bashを起動する

```bash:gitbash
touch git-daemon-export-ok
```

  * gitアクセス時に認証不要になるため、内部LANなどアクセスが限られる場合のみに使用すること。

# git daemonを起動
git-test.gitディレクトリでgit bashを起動する

```bash:gitbash
git daemon --export-all --enable=receive-pack --base-path=/c/git-central/git-test.git/
```

  * 起動したプロンプトは閉じないでおく

# 利用者側でクローン

```
git clone git://localhost/git-test.git
```

  * PATHに```C:\path\to\PortableGit-2.6.3-64-bit\usr\bin```を通さないと警告がでる。

# 参考

[Windows: LAN内専用のGitリモートリポジトリを作る](http://sutara79.hatenablog.com/entry/2015/03/28/165745)
CREATE INDEX CONCURRENTLY を読み解く

[Explaining CREATE INDEX CONCURRENTLY](https://blog.2ndquadrant.com/create-index-concurrently/) というブログ記事がなかなかおもしろかったので、自分なりにまとめなおしてみます。PostgreSQLのソースコードでもコメントで説明されているので、それを読むのもおすすめです。それ読みながら書きました。

通常インデックスの作成時には、その最中にインデックスに影響する変更が行われるのを防ぐため、テーブルレベルのロックが行われます。CREATE INDEX CONCURRENTLY はこのようなロックを行わずにインデックスを作成する機能です。

（ソースコードやネット上の記事を参考に書いているので、勘違い等あればご指摘ください）

## どうしたら実現できるか

基本的な考え方は、ある時点のスナップショットを元にインデックスを作成し、インデックスへの挿入を有効化してから、改めて取ったスナップショットとの差分をインデックスに反映するというものです。

## Heap Only Tuple (HOT) の存在

PostgreSQL ではレコードの変更も新規タプルの作成として処理されるため、タプルへの参照を保持するインデックスもそのたびに更新、もといエントリを追加する必要があります。この方法では更新にかかるコストが馬鹿にならないので、**どのインデックスにも影響しない変更ならヒープ内のリダイレクトで済ます**というのが HOT です。ヒープ内に存在するだけでインデックス等からは直接参照されないので Heap Only Tuple だそうな。

ところで、インデックスの作成は「どのインデックスにも影響しない」という判定に影響します。インデックスが作成される前に作成されたHOTチェインはこのルールを満たしていない可能性が、つまり末端のタプルではもはやキーと異なる値に変更されている可能性があります。

これらを踏まえて、処理の流れを追ってみます。

## Step1. とりあえず宣言する

早速スナップショットを取りたいところですが、その前にインデックスの存在をカタログに登録します。こうすることで、インデックス作成中の更新の際、この新インデックスを考慮してHOT作成が行われるようになります。この時点ではインデックスはまだ挿入も参照もできません。

この時点でShareLockと競合するトランザクションがある場合、それらによる更新はまだ新インデックスのことを考慮していない可能性があります。このためそれらのトランザクションを待ちます。

## Step2. 作る

スナップショットを取り、普通にインデックスを作成します。対象のカラムにインデックスが作られることは既に周知されているので、並行して更新が発生してもHOTにできるかどうかが正しく判断されます。

これが済んだらインデックスを挿入可能としてマークし、Step1同様にShareLockと競合するトランザクションが全て終了するまで待機します。

## Step3. 差分を反映

ここまでで既存レコードのほとんどはもちろん、今後発生する挿入や更新もインデックスに反映されるようになりました。残るはStep2の最中に発生した差分を反映するだけです。

インデックスを参照可能にする前にもう一度、今度は古いスナップショットを参照しているトランザクションが終了するのを待ちます。インデックス作成時までに変更・削除が行われていたレコードがあった場合に、それらのトランザクションのクエリにインデックスを使うとまずいので。

最後に、インデックスを参照可能としてマークし、テーブル情報のキャッシュも飛ばすことで再計画を促します。

## 参考

* [src/backend/commands/indexcmds.c DefineIndex()](https://github.com/postgres/postgres/blob/REL9_6_3/src/backend/commands/indexcmds.c#L684)
* [PostgreSQL のトランザクション & MVCC & スナップショットの仕組み](http://www.nminoru.jp/~nminoru/postgresql/pg-transaction-mvcc-snapshot.html)
【Raspberry Pi】ユーザランドからレジスタ経由でGPIOを制御する小さなメモ

# 前提

- GPIO21を出力させる
- Raspberry Pi Model B+(多分)

# コード
includeしてるヘッダは適当

```c:test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint-gcc.h>
#include <fcntl.h>
#include <sys/mman.h>

void main(void){
        volatile uint32_t        *gpio_base = NULL;
        int fd = open("/dev/mem", O_RDWR | O_SYNC );
        void *gpio_mmap = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x20200000);
        //0x20200000
        gpio_base = (volatile uint32_t *)gpio_mmap;
        //GPFSEL2の4bit目を1にする
        gpio_base[2] = 0x8;
        //GPSET0レジスタの21bit目を1にする
        gpio_base[7] = 0x200000;
        //GPCLR0レジスタの21bit目を1にする
    //    gpio_base[10] = 0x200000;
}
```

# メモ
- GPIOのレジスタは物理メモリアドレス0x20200000から割り当てられている
    - 具体的なマッピングは↓の本等参照
- 出力の操作の流れは
    - GPFSEL2レジスタ(=0x20200008)でGPIO毎の機能を切り替える（シリアルにしたり、入力にしたり、出力にできる、らしい）
        - GPFSELはGPIO9個毎割り当てられてる
            - GPFSEL0: GPIO0 ~ GPIO9
            - GPFSEL1: GPIO10 ~ GPIO19
            - GPFSEL2: GPIO20 ~ GPIO29
        - GPIO毎3bitずつ割り当てられてるので、GPIO21はGPFSEL2の4bit~6bit目を001にする
    - GPSET0レジスタ(=0x2020001c)で出力させる
        - 1bitずつそれぞれのGPIOに割り当てられてる
        - GPIO21は21bit目(0x200000)を1にする
- mmapで仮想アドレス空間に物理アドレスをマッピングさせる
- uint32_tでキャストした配列の添字を増やすと4バイトずつアクセス先が増えていく


#実行
```
root@raspberrypi:/usr/local/work# gcc test.c
root@raspberrypi:/usr/local/work# ./a.out
```
![ファイル 2017-07-05 0 15 26.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50690/33319295-2bfe-e3b1-07ca-3219fcdaed40.jpeg)

![ファイル 2017-07-05 0 15 43.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50690/465c0084-77fe-8baf-be4b-2ded0cb4e168.jpeg)


# 参考
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/488337940X/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/51WODnx95pL._SL160_.jpg" alt="RaspberryPiで学ぶ ARMデバイスドライバープログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/488337940X/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">RaspberryPiで学ぶ ARMデバイスドライバープログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 17.07.04</div></div><div class="amazlet-detail">米田 聡 <br />ソシム <br />売り上げランキング: 174,251<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/488337940X/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>