OmniAICreator/Qiita-1.07M huggingface dataset:
C言語の基礎 (ポインタ) NO.4 備忘録

ポインタを銀行でのお金のやり取りを例にしてみる。

お金のやり取りをする際

・口座番号を教えてそこに振り込んでもらう。
・口座番号を教えてもらいそこに振り込む。

お金を使うではなく、__口座番号__という__アドレス__を使う。

つまり、

・口座番号(アドレス)を教えるから、そこに値を入れてください。
・口座番号(アドレス)を教えるから、そこから引き出してください。

プログラム上でこの口座番号を格納できる変数があれば超便利ですね!!

これを__ポインンタ変数__という。

```c++:test.cpp
  int iMyKouza;          // int型の変数を定義   ( 口座の預金額 )
  int *piKouzaNumMemo;   // int型のポインタ変数 ( 口座番号のメモ　)を定義
  
  iMyKouza = 1000;       // 1000を代入  ( 預金額：1000円 )
  piKouzaNumMemo = &iMyKouza; // iMyKouzaのアドレスを代入 ( 口座番号を口座番号メモに記入 )
  CCLOG("変数iMyKouzaのアドレス:%p",piKouzaNumMemo);
```

実行結果
変数iMyKouzaのアドレス:0x16fdb8bbc

ポインタ変数 (piKouzaNumMemo)には、iMyKouzaのアドレスが入っている。
ポインタ変数同じ型の変数のアドレスを代入する == 口座番号を記入する

ポインタ変数の宣言 == 口座番号のメモを作成
ポインタ変数に変数のアドレスを代入することで口座番号を自由に使うことができる。

#ポインタ変数を用いたデータの出し入れ

ポインタ変数名の先頭に*(アスタリスク)を付けると、*が先頭に付いたポインタ変数名全体が、そのポインタを指し示すデータを表す変数になる。

```c++:test.cpp
  if ( *piKouzaNumMemo == iMyKouza )
    CCLOG("等しい");

  CCLOG("piKouzaNumMemoの示すデータの値:%d",*piKouzaNumMemo);
```
実行結果
等しい
piKouzaNumMemoのサスデータの値:1000


#ポインタを使ったデータの出し入れの例1
```c++:test.cpp
  int iData1;
  int iData2;
  
  int *piData;        // int型のポインタ変数の宣言(口座番号を書くメモの作成)
  
  iData1 = 100;       // iData1の預金額(100)

  iData2 = 200;       // iData2の預金額(200)
  
  piData = &iData1;   // ポインタ変数にiData1の口座番号を記入
  
  *piData = 200;      // iData1の預金額(200)
  
  iData2 += *piData;  // iData2の預金額(200)に、iData1の預金額(200)を追加
  
  
  CCLOG("*piDataの値:%d",*piData);
  
  CCLOG("iData1の値:%d",iData1);
  
  CCLOG("iData2の値:%d",iData2);
```
実行結果
cocos2d: *piDataの値:200
cocos2d: iData1の値:200
cocos2d: iData2の値:400


#ポインタを使ったデータの出し入れの例2
```c++:test.cpp
  int iMyKouza = 1000;   //最初の預金口座(1000円)
  
  CCLOG("私の預金口座:%d",iMyKouza);
  
  furikomi5000(&iMyKouza);  // 預金に5000円の振込を依頼
  
  CCLOG("私の預金口座:%d",iMyKouza);
  
  furikomi5000(&iMyKouza);  // 預金に5000円の振込を依頼
  
  CCLOG("私の預金口座:%d",iMyKouza);


void stageSelectScene::furikomi5000(int *piKouzaNumMemo)
{
  *piKouzaNumMemo += 5000;  //口座に5000円を振り込む
}


```
実行結果
cocos2d: 私の預金口座:1000
cocos2d: 私の預金口座:6000
cocos2d: 私の預金口座:11000

関数にポインタを渡せば、ポインタが示している変数自体を操作できる。
MySQLで遭遇したトランザクションとロックのお話(1)

DBについて発表した内容について詳しくかきます。
初回はトランザクションについて
資料のソース元はこちら
http://www.slideshare.net/takukobayashi560/my-sqltake2-2

### トランザクションって? ###
トランザクション処理は、既知の一貫した状態のデータベースを維持するよう設計されており、相互依存のある複数の操作が全て完了するか、全てキャンセルされることを保証する。(by Wikipedia)
http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

![201205268.jpg](https://qiita-image-store.s3.amazonaws.com/0/72596/b72dbd76-3f1a-b030-c3c4-782b3cbaa0ef.jpeg)

### 例 ###
ドラゴンク○ストでの1場面

![図1.jpg](https://qiita-image-store.s3.amazonaws.com/0/72596/b7df5639-3c50-02c2-65b9-bc7d24cc5acd.jpeg)

お店で薬草を1個購入すると
***
 * 所持Gから8Gが減る
 * 薬草の所持数が1個増える

となる。

ここで、もし

 * 薬草の所持数が1個増える

ところでエラーが発生して薬草が1個増えなかったら。

 * 所持Gから8Gが減る

だけ実行されてしまうので、ユーザーは激怒プンプン丸になってしまう。
なので、

 * 薬草の所持数が1個増える。

がエラーになったら、

 * 所持Gから8Gが減る

もなかったことにしたい。

 * 薬草の所持数が1個増える。
 * 所持Gから8Gが減る
の処理をセットで見て、両方とも反映完了するか両方ともなかったことにするようにする必要がある。

このように処理をセットとして扱うことを**トランザクション**という。
そして、トランザクションを終了するとき、両方とも反映完了とする時を**コミット(COMMIT)**
両方ともなかったことにすることを**ロールバック(ROLLBACK)**
という

### コード ###
 * SQL

```
BEGIN
~
COMMIT 又は ROLLBACK
```
 * Ruby on Rails

```
ActiveRecord::Base.transaction do
~
end
```

こんな感じに書く。

排他制御
楽観ロック
悲観ロックについては次回へ
PHPでTwig とりあえず動くところまで@Windows 8.1

PHPのテンプレートエンジン、Twigを使ってみました。基本的な使い方はあちこちのサイトで紹介されてるので使い慣れてる人なら問題ないと思うのですが、自分で探してみたところいくつかのサイトを巡って調べる必要があったのでメモ。

# まず、Composerをインストール
Twigは、Composerというパッケージマネージャによって管理されています。たぶんComposerを使わなくてもTwig自体は使えるのだと思いますが、情報が多いのでPHPに慣れてない人は素直にComposerを使っておいた方が良いです。

## ComposerをWindowsにインストール

Windows用にはインストーラーがあります。使い方などは[CodeZine](http://codezine.jp/article/detail/7827)にまとまっていますが、とりあえず以下のサイトからインストーラーを入手できます。

 * https://getcomposer.org/doc/00-intro.md#installation-windows

インストーラについてはとくにこれといって困ることはないと思うのですが、もし「Some settings on your machine make Composer unable to work properly.」みたいな文章が出てインストールがとまった場合、次の段落に書かれている指示に従ってPHP.iniの設定などを見直す必要があります。
自分の場合「The openssl extension is missing, …」という文言が出てきたので調べてみたところ、PHP.iniの「extension=php_openssl.dll」行のコメント解除が必要とのことでした。

# Twigをインストールする

次にTwigをインストールします。Twigを配置したいフォルダをコマンドプロンプトで開き、以下のコマンドを実行します。

```bat:コマンド
> php C:\ProgramData\ComposerSetup\bin\composer.phar require twig/twig:1.*
/composer.json has been created
oading composer repositories with package information
pdating dependencies (including require-dev)
 - Installing twig/twig (v1.18.0)
   Downloading: connection...
   Downloading: 0%
   Downloading: 5%
   Downloading: 10%
   Downloading: 15%
   Downloading: 20%
   Downloading: 25%
   Downloading: 30%
　　・・・
```
pdating dependenciesからInstallingまでの間に、1,2分程度待たされます。お茶でも飲んで待ちましょう。

すると、カレントフォルダにtwigフォルダとcomposerフォルダができます。

# 実際に使ってみる

それではひとまず実際に使ってみます。ここから先は以下を参考にしました

 * http://www.pxt.jp/ja/diary/article/288/

参考というか、そのまんまですが。

```php:test.php
<?php
require_once './vendor/autoload.php';

$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader);

echo $twig->render('Hello {{ name }}!', array('name' => 'TakamiChie'));
?>
```

```bat:コマンド
> php index.php
Hello TakamiChie!
```
というわけでとりあえず入門ができました。めでたしめでたし。

# ポイント

 * TwigはPHP用のテンプレートエンジン
 * パッケージ管理には、Composerというツールを使用する
 * ComposerにはWindows用インストーラーがある
 * インストーラーでは、PHP.iniの設定によりインストールが中断することがある。「Some settings on your machine make Composer unable to work properly.」という文言が表示されたらPHP.iniの記載を疑え
 * Composerをインストールできたら、コマンドプロンプトよりTwigをインストールする。インストールしたTwigはカレントフォルダに配置される
iOSアプリ開発におけるMVC


iTunes Uで公開されているStanfordの「Developing iOS 8 Apps with Swift」で、MVCの解説をしている部分がわかりやすかったのでまとめてみました。

[Lecture 2 Slides](https://itunes.apple.com/jp/course/lecture-2-slides/id961180099?i=333886880&mt=2
)

オブジェクトは以下の３つのグループに分けられる。

- モデル
  - アプリケーションの本質的な部分（見た目については関知しない）
- コントローラー
  - モデルがどのように表示されるか（UIロジック）
- ビュー
  - コントローラーに隷属するもの

３つのグループ間のコミュニケーションには以下のような原則がある。

- コントローラーからモデルは直接呼べる  
（＝ヘッダーをインポートして直接メソッドを呼べる）
- コントローラーからビューも直接呼べる  
コントローラーからビューへの参照がアウトレット
- ビューからコントローラーは以下のパターンを使う
  - ターゲット-アクション
  - デリゲート
  - データソース
- モデルからコントローラーは以下のパターンを使う
  - 通知
  - KVO
- モデルとビューは直接やり取りしない  
（モデルからの通知やKVOをビューで受け取ることはあり得る）
Amazon KinesisにFluentdで流し込んだデータをHiveでクエリ


このポストはわたし個人のメモであり、所属する組織を代表するものではありません。

## サマリ

Fluentd -> Kinesis -> Hive(EMR)
という感じのストリームデータのクエリ環境を作った。というか動かしてみた。

## 準備

### KinesisのStream作成

AWSの万地面とコンソールで。

### Kinesisへのデータ流し込み

[aws-fluent-plugin-kinesis](https://github.com/awslabs/aws-fluent-plugin-kinesis)を使って流しこみ。

### EMRを起動

CLIからEMRクラスタを起動。

```bash
aws emr create-cluster \
--name Hive \ #クラスタ名
--ami-version 3.4.0 \   #AMIバージョン
--applications Name=Hive Name=Hue \ # HiveとHueをインストール
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=c3.xlarge InstanceGroupType=CORE,InstanceCount=2,InstanceType=c3.xlarge \ #インスタンスタイプと台数
--ec2-attributes SubnetId=YOUR_SUBNET,KeyName=YOUR_KEYPAIR \ #デプロイするEC2のサブネットやキーペアを指定
--log-uri s3://PATH/TO/LOG/ \  #ログを回収するS3バケット
--enable-debugging \ #デバッグフラグ。これをオンにしておくとマネジメントコンソールでログが確認できる
```

### EMRにSSHでログイン

```bash
aws emr ssh --key-pair-file YOUR_KEY_FILE --cluster-id YOUR_CLUSTER_ID
```

### hiveでテーブル定義

Fluentdはデータを1行毎にJSONの文字列としてKinesisに流し込むので、まずはひとかたまりの文字列として取り扱う。また、HiveからKinesisへの接続は **com.amazon.emr.kinesis.hive.KinesisStorageHandler**というEMRに予めインストールされているコネクタクラスを利用する。このクラスの詳細については[AWSのドキュメント](http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/query-kinesis-generate-data.html)を参照。

```sql
CREATE TABLE json (line string)
STORED BY
'com.amazon.emr.kinesis.hive.KinesisStorageHandler'
TBLPROPERTIES(
  "kinesis.stream.name"="YOUR_STREAM_NAME",
  "kinesis.endpoint.region"="ap-northeast-1",
  "kinesis.records.batchsize"="10000"
);
```

だいたいこれで準備完了。

## クエリ

ここまでで準備はできたのであとはクエリする。
例えばKinesis Stream内にあるレコード群を1分ごとにGroupingしつつ、Levelというラベルで更にGroupingしてレコード数をカウントしてみるならこんなかんじ。

元のJSONの中身は特に触れてないが、あんまり重要なポイントではないのでそのままスルー。

```
SELECT
  source.time_str,
  source.level,
  count(1)
FROM(
  SELECT 
    parsed.*,
    regexp_replace(parsed.time,"[0-9]{2}Z","00Z") as time_str
  FROM
    json
  LATERAL VIEW
    json_tuple(json.line, 'id', 'level', 'method', 'uri', 'reqtime', 'foobar', 'time', 'tag') parsed
  AS 
    id, level, method, uri, reqtime, foobar, time, tag
) source
GROUP BY
  source.time_str, source.level;
```

無事にクエリできた！

## 何が起こったのか？

今回のKinesis Streamには8つのShardがあった。それに対してMapReduceのログを見ると、下記のように8つのMapperが動作していたことがわかる。つまり、ShardごとにMapperが立ち上がり、データ取り出しをしていたということだろう。
![mr.jpg](https://qiita-image-store.s3.amazonaws.com/0/10292/186ab7ba-135e-4144-60b1-0b7f66ac7094.jpeg "mr.jpg")

絵にするとこんな感じか。
![emr.jpg](https://qiita-image-store.s3.amazonaws.com/0/10292/8fe9b480-784a-fc87-0771-15d5aca1459b.jpeg "emr.jpg")

たしかにKinesis Stream側でもガシガシGetRecordsをRequestされてる感がある。
![kinesis.jpg](https://qiita-image-store.s3.amazonaws.com/0/10292/3660d176-fd2f-4616-300d-dc00a60314db.jpeg "kinesis.jpg")


## それなりに時間はかかる。

Hiveだから結構時間かかる、というのもあるけれども、もうひとつ時間かかるところが。

今回使ったEMRのKinesisコネクタクラスにはチェックポイント機能がないので、毎回Kinesis Stream内のデータをフルスキャンすることになるというのがポイント。Kinesis Streamには常に過去24時間分のデータが保持されているので、言い変えてみると、毎回これをスキャンすることになる。（毎回過去24時間のWindow関数的な感じ？w）

## 高速化するには？

しかしこれって、[Spark Streaming](http://spark.apache.org/docs/1.2.1/streaming-kinesis-integration.html) + SparkSQLでやるにしても同じ問題がつきまとう気がする。Sparkに対して逐次的にKinesisからデータを取り込んでおいて、クエリは取り込み済みデータに対して行う、みたいな感じにSQLのクエリエンジンとデータ取り込み部分を分離してやる必要がありそう。
書き捨てのスクリプトにRubyが向いてる理由

炎上Rails案件を経験したおかげで少しRubyから遠ざかっていましたが、調査だったりちょっとした自動化が目的のスクリプトを書くには、やっぱり便利な言語です。

この記事の目的は、便利なRubyの特徴を挙げて、研究畑の人がPythonでなくRubyを使うようになるよう仕向けることです。

## 1. ファイルの読み書きが楽
streamを開いて中身をごにょごにょした後close...とかまどろっこしいことは考えたくなくて、ただスパッとStringの読み/書きをしたいんです。

```py:python
f = open("sample.txt") 
content = f.read()
f.close()

f_w = open("result.txt", "w")
f_w.write(content + "feelin' bad")
f_w.close()

# or

with open("sample.txt") as f: content = f.read()
with open("result.txt", "w") as f_w: f_w.write(content + "feelin' bad")
```

```rb:ruby
content = File.read("sample.txt")
content << "feelin' alright"
File.write("result.txt", content)
```

## 2. シェルコマンド呼び出しが楽
機械学習・自然言語処理系のライブラリを検討するとき、言語バインディングが用意されてなくて、コマンドの呼び出しが必要なことがあります。

インジェクション対策とかはどうでもよくて、ただお望みのコマンドを実行して結果が欲しいだけなのです。

```py:python
import subprocess

s = "吾輩は蛇である。"
result = subprocess.check_output('echo "%s" | mecab' % s, shell=True)
```

```rb:ruby
s = "吾輩は猫である。"
result = `echo "#{s}" | mecab`   # 式の埋め込みもポイント高いネ☆
```

注) MeCabは言語バインディングあります

## 3. 文字列処理が楽
コマンドを実行した結果が文字列で得られたとしましょう。

各行は、第1フィールドと第2フィールドの間だけtab区切りで、それ以降のフィールドはカンマ区切りという構造になっているとします。

ここで、第1フィールドの値と、第4フィールドを数値に変換した値を抽出することを考えます。

ただし第4フィールドは数値の前にアルファベットがくっついていて、それを無視する必要があるとします。*例) E42*

```py:python
import re

for line in result.splitlines():
    fields = re.split(r'[\t,]', line)
    name = fields[0]
    num = int(re.search(r'\d+', fields[3]).group())

    # ~~~ごにょごにょ~~~
```

```rb:ruby
result.each_line do |line|
  fields = line.split(/[\t,]/)
  name = fields[0]
  num = fields[3][/\d+/].to_i
  
  # ~~~ごにょごにょ~~~
end
```

## 4. 例外よりも、いい感じの返値
Rubyだと標準のAPIが、例外を投げない仕様になっているものが多くて、エラー処理をしないでさくっと動くものを作りたいときによい。

```py:python
int("42a")    #=> ValueError
[1,2,3][3]    #=> IndexError
{'one' : 1}['two']   #=> KeyError
''.join([1,2,3])   #=> TypeError
```

```rb:ruby
"42a".to_i    #=> 42
[1,2,3][3]    #=> nil
{one: 1}[:two]  #=> nil
[1,2,3].join    #=> "123"
```

## 5. Gemfile
Gemfileを使えば、グローバルにgemをインストールせずに済む・・・!
と思ったんだけど、最近は検証用にはvagrantかdockerで仮想環境を用意するので、その点ではあまり関係ありませんでした。

## 感想
Pythonではもうちょっと面倒な印象だったんですが、まとめてみると思ったより手間が変わらないように見えます。
面倒だと思ったのはPythonに慣れてなかっただけなのかも...
こんなはずじゃ...
gitをOSXの標準で使っていたからHomebrewによせる

gitをHomebrewで管理したいから寄せようと思った。  

```
brew install git
```

これだけで済むと思ったけどパスを変えなきゃいけない事実に向き合ったじょうほうじゃくしゃであった。

```
cat /etc/paths
```

そしたらTerminal再起動でバージョンを確認した。

```
git --version
```

問題なくバージョン上がってましたとさ。  
![Screenshot 2015-03-18 00.57.21.png](https://qiita-image-store.s3.amazonaws.com/0/58800/b05903a3-10b8-ec62-2f4d-2ae828f2efa4.png)
【小ネタ】ディレクトリの権限を数値化して表示させるコマンド

lsコマンドで表示される、ディレクトリの権限をアルファベットだけではなく、数値で表示させたい為の小技コマンド。

find /検索対象ディレクトリ -type d -exec stat --format "%a %U %G %n" {} \;

●--formatのオプションについて
%a：アクセス権の8新表記
%U:オーナー名
%G:グループ名
%n:ファイル名("-type d"を指定しているため、ディレクトリ名が表示される)

●実行結果例
[root@localhost ~]# find /var/ -type d -exec stat --format "%a %U %G %n" {} \;
755 root root /var/
755 root root /var/lib
755 root root /var/lib/yum
755 root root /var/lib/yum/repos
755 root root /var/lib/yum/repos/x86_64
755 root root /var/lib/yum/repos/x86_64/7
755 root root /var/lib/yum/repos/x86_64/7/anaconda
755 root root /var/lib/yum/repos/x86_64/7/base
755 root root /var/lib/yum/repos/x86_64/7/extras
755 root root /var/lib/yum/repos/x86_64/7/updates
755 root root /var/lib/yum/yumdb
…省略…
`newtype` キーワードに関して勉強したことの整理

学習の素材は、
[すごいHaskellたのしく学ぼう!](http://www.amazon.co.jp/すごいHaskellたのしく学ぼう-Miran-Lipovača/dp/4274068854)

> この表記は、私見・感想です。


## `newtype`  キーワードと似たようなキーワードとの比較

### `newtype` 
`newtype` キーワード は既存の型を包んで新しい型を作るためのもの。値コンストラクタ、フィールドがそれぞれ一つだけ用意されている。後述するようなインスタンスを作るために使用することがある。
`newtype` で型を包むと（ほどくと）、`data` と違ってオーバーヘッドがかからない点がメリット。

### `data`
`data` キーワード は自作の新しいデータ型を作るためにある。値コンストラクタもフィールドも複数用意できる。 オリジナルの型を作る！ということなら、このキーワードが適切。

###  `type`
型シノニムを作るために `type` キーワードを用いる。既存の型に別名をつけて、プログラムを整理しやすくする。その型をどういう目的で使っているのか、コードを読む人に伝えられる。

> たとえば、`Int` を特定の文脈に合わせて `Books` と読んでみたり。


## `newtype` を使って型クラスのインスタンスを作る
ある型を型クラスのインスタンスにしたいをのだが、型引数が一致しなくてできないということがある。たとえば、タプル `(,) :: a -> b -> (a, b)` を`Functor` のインスタンスにして、`fmap` の引数でとる関数を `fst` に適用したいというようなケース。

> `((,) a)` をインスタンスにすることは簡単にできるが、これだと関数適用できるのは `snd` の方になってしまう。

このような時に `newtype` で新しい型を作り、要求を満たすことができる。

```hs
newtype Pair b a = Pair { getPair :: (a, b)} deriving (Show)

instance Functor (Pair c) where
    fmap f (Pair (x, y)) = Pair (f x, y)
```

型引数の順序が反転しているため、固定されているのが `snd` の型になっていることがわかる。パターンマッチも使えるので、`pair` 型からタプルを取り出して、`fst` 側に関数適用できている。
また、`getPair` により、タプルに変換することも簡単に行える。

> 内部的にはタプルを使うが、型引数の順番だけ工夫して新しい型を作り、型クラスのインスタンスに対応させている。そういうニーズで、`newtype` が使える。

##  `newtype` と遅延評価
`newtype` で新しい型を作ると、**必ずコンストラクタが一つ、フィールドが一つとなる** ことが明らかなので、　パターンマッチにおいて引数を評価しなくてもその型であると判定できる。そのため、ある関数が `newtype` で作られた型を引数に取るとき、それが` undefined` だとしても結果がエラーとならない場合がある。 Haskell は本当に必要になるまで評価を遅らせる性質があり、ここでもその性質が現れている。

```hs
newtype CoolBool = CoolBool {getCoolBool :: String}
helloMe :: CoolBool -> String
helloMe (CoolBool _) = "hello"
```

この例では、GCHi で次のように書いても、結果を得られる。

```
*Main> helloMe undefined 
"hello"
```

> `undefined :: a` は任意の型として取り扱うことができる。そして、評価するとエラーになるという特徴がある。つまり、このコードに `undefined` を埋め込むと、通常、コンパイルは通るものの実行する（ために評価する）とエラーを出す。上のケースではコンパイルが通り、かつ遅延評価なので評価されずに（エラーが出ないので）正常終了するということである。
BEM記法におけるElement/Modifierの付け方メモ

ElementとModifierの付け方・順序で迷った事例があったので書き起こしておく。

# BEMおさらい

#### Block
構成要素。ページ内で何度でもどこでも置くことが出来る独立して動作するもの。

#### Element
Blockに紐付いて定義される。要素内のパーツであり、Block内であれば繰り返し使用できる。

#### Modifier
少しだけ違うものを量産するときに用いる。
あくまで変更がかかる要素に対して付ける。

# Example

## Block + Element
`.box__ttl`

```html
<div class="box">
    <div class="box__ttl">タイトル</div>
    <div class="box__txt">テキスト</div>
</div>
```
標準的な使用。本来のElementの使い方そのまま。

## Block + Modifier
`.box--white`

```html
<div class="box">
    <div class="box__ttl">タイトル</div>
</div>
<div class="box box--white">
    <div class="box__ttl">タイトル</div>
</div>
```
**構成要素自体の**違いを表現したい場合。
この例でいうと、boxの白背景バージョンとかを拡張してるイメージ。


## Block + Element + Modifier
`.box__alert--big`

```html
<div class="box">
    <div class="box__alert">標準</div>
    <div class="box__alert box__alert--big">大</div>
    <div class="box__alert box__alert--small">小</div>
</div>
```
**Elementの**バリエーションをつくる場合。
同じアラートだがサイズの違いを作っている。

## Block + Element + Element
`.box__alert__ttl`

```html
<div class="box">
    <div class="box__alert">
        <p class="box__alert__ttl">アラートタイトル</p>
        <p class="box__alert__txt">アラートテキスト</p>
    </div>
</div>
```
Elementの中で、さらに細かいパーツが分かれることが考えられる

## Block + Modifier + Element
`.box--white__ttl`

```html
<div class="box box--white">
    <div class="box__ttl box--white__ttl">タイトル</div>
</div>
```
**Modifierとして拡張された要素の**、パーツとして定義したい場合。
「Block + Element + Modifier」と明確に違うのは、あくまでBlockが親になっている点。
なので同時に`.box--white`が定義されているのが前提となる。

## Block + Modifier + Modifier 
`.box--white--big`

```html
<div class="box">
    <div class="box__ttl">タイトル</div>
</div>
<div class="box box--white">
    <div class="box__ttl">タイトル</div>
</div>
<div class="box box--white--big">
    <div class="box__ttl">タイトル</div>
</div>
```
拡張された要素をベースに、さらに拡張したパターン。
三次創作みたいな状態。
実際の運用では非常に理解しづらくなるため、Modifierの連結は避けたほうが良さそう。

```html:推奨
<div class="box">
    <div class="box__ttl">タイトル</div>
</div>
<div class="box box--white">
    <div class="box__ttl">タイトル</div>
</div>
<div class="box box--whiteBig">
    <div class="box__ttl">タイトル</div>
</div>
```
実際は連結はせずに`.box--whiteBig`のように別の１バリエーションとして定義した方がわかりやすい。
embulkでCloudFrontのログを扱う


CloudFrontのログをトレジャーデータに叩き込みたいと思い、最近リリースされたembulkを使ってみました。

## embulkのインストール

jarファイルを落としてきて、PATHを通してあげるだけ。

参考：[Macでembulkを使う](http://qiita.com/mats116/items/44d92f2a9eb5b54da4d0)

## インプットプラグイン

### プラグインのインストール

次のコマンドで`embulk-input-s3`をインストールします。

```shll
embulk gem install embulk-input-s3
```

### 設定ファイル

記述する内容は

- ClohdFrontのログが保存されているS3のバケットの情報
- CloudFrontのログのスキーマ（これは使い回しで大丈夫なはず）

で、次のような感じ。

```yml:cloudfront.yml
in:
  type: s3
  bucket: <バケット名>
  path_prefix: XXXXXXXXXXXXX.2015-03-18-
  endpoint: s3-ap-northeast-1.amazonaws.com
  access_key_id: XXXXXXXXXXXXXXXXXXXX
  secret_access_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: "\t"
    quote: ''
    escape: ''
    skip_header_lines: 2
    columns:
    - {name: date, type: string}
    - {name: time, type: string}
    - {name: edge_location, type: string}
    - {name: sc_bytes, type: long}
    - {name: c_ip, type: string}
    - {name: cs_method, type: string}
    - {name: cs_host, type: string}
    - {name: cs_uri_stem, type: string}
    - {name: sc_status, type: string}
    - {name: cs_referer, type: string}
    - {name: cs_user_agent, type: string}
    - {name: cs_uri_query, type: string}
    - {name: cs_cookie, type: string}
    - {name: edge_result_type, type: string}
    - {name: edge_result_id, type: string}
    - {name: host_header, type: string}
    - {name: cs_protocol, type: string}
    - {name: cs_bytes, type: long}
    - {name: time_taken, type: double}
exec: {}
out:
  type: stdout
```

日付`date`と時刻`time`が別々のカラムに入っているので、タイムスタンプとして利用するのを我慢して`string `としています。
誰か、CloudFrontのログ用のプラグイン書いてくれないかな。。。

※ CloudFrontのログフォーマットについては[こちら](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html)

### テスト

次のコマンドで読み込みのテストを行うことが出来ます。

```shell
embulk preview cloudfront.yml
```

## アウトプットプラグイン

### プラグインのインストール

次のコマンドで`embulk-output-td`をインストールする。

```shll
embulk gem install embulk-output-td
```

が、

```
ERROR:  Could not find a valid gem 'embulk-output-td' (>= 0) in any repository
```

と表示される。。。？

[リポジトリ?](https://github.com/muga/embulk-output-td)を見てみると一応あるので、クローンしてきてビルドしてみるが、、、、動かない。

[プラグインリスト](http://www.embulk.org/plugins/)を見ると載っていないので、どうやらまだリリースされていないようです。。。

## まとめ

結果、TDに叩きこむことは出来なかったが、embulkの可能性は感じました。
matchingプラグインも開発中のようなので、パラメータによってフィルタリング出来ると活用の幅が広がり便利そうです。
※随時、更新します。

勝手にマルチプロセス化して叩き込んでくれるのはaerospikeと非常に相性が良さそうですが、僕がプラグインを書くのはまだまだ先になりそうです。
Android で JUnit4 を使う方法 (Espressoなし) 

## はじめに

Android で JUnit4 を使う方法は [続・AndroidでJUnit4を使う方法](http://qiita.com/AbeHaruhiko/items/91aa8fe0f2299969d0e7) に紹介されていますが、Espressoなしで使う方法が書かれていなかったので、やり方を記載します。

といっても build.gradle の設定が若干違うだけです。テストクラスの書き方は同じです。

## build.gradle の設定

dependency と android.defaultConfig に以下のように設定を追加します。

```groovy:build.gradle
dependency {
    ...
    // 以下２行追加
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
}

android {
    ...
    defaultConfig {
        ...
        // 以下1行追加
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    }
}

```
CentOS7で開発環境構築

nodeであれこれするための準備をします

この記事の続きになります
> Win8上でVagrant動かしてCentOS7セットアップ
http://qiita.com/11th-dice/items/7bcb56c349d6c6199034


##ユーザ追加
```
$ sudo useradd ******
$ sudo passwd ******

```

##firewallの設定
表に公開する予定はないから別にfirewall切ってもいい気がしてるけど一応。

下記のコマンドでポート解放の設定。
```
$ sudo firewall-cmd --permanent --add-port=8124/tcp
$ reboot
$ node.js hello.js
```

これでHello Worldされました。
$ sudo firewall-cmd --add-service=http で駄目だったので仕方なくポート解放で対処した形です。
毎度ポート解放の設定するのがめんどくさくなったらそのうち設定しなおします。

##Expressとmongoのインストール
```
$ npm install express
$ npm install mongodb
```

##/vagrantにシンボリックリンク張る

作成したユーザでログインしておく

```
$ sudo ln -fs /vagrant test
```

testのなかで適当にファイル作ったりして確認。

実はここでかなりこけたけどメモ取ってなかった、失敗。
いろいろな方が記事にしている、vboxのセットアップやguest additionsのバージョンをホストとゲストで合わせるとかしただけじゃ解決せず、
改めてvagrant init centosしてやったら上手くいきました。
/vagrantを変に弄っていたのが悪かったんでしょうか。


##パッケージにしておく

```
$ vagrant package
$ vagrant box add mybox package.box
```


とりあえずこんなところで。
ようやくそれっぽい環境整ったので、次はなんか動くものを作りたいです

##参考にしたサイト
CentOS7 firewalldの設定
http://www.unix-power.net/centos7/firewalld.html

CentOS7 64bit firewalldによるアクセス制御
http://www.kakiro-web.com/linux/firewalld.html

expressパッケージとコマンドのインストール
http://qiita.com/pakiln/items/826a9199697576e2e24a

express
http://hideyukisaito.github.io/expressjs-doc_ja/guide/

node.jsでMongoDBを扱う
http://d.akiroom.com/2011-10/node-js-mongodb-native/

Vagrant導入メモ
http://qiita.com/ANTON072/items/a0dabf0c2e4941803dce

Vagrantで仮想サーバ構築
http://www.happytrap.jp/blogs/2013/07/26/10602/

Vagrantのmountエラーを解決しようとしたらvboxのリビルドがこける
http://qiita.com/wakaba260/items/b5c87b7815b710f303a0

vagrantでmountエラーの解決方法
http://qiita.com/osamu1203/items/10e19c74c912d303ca0b

Vagrant can't mount shared folder in VirtualBox 4.3.10
https://github.com/mitchellh/vagrant/issues/3341
gxui - Googleが出したGoのGUIライブラリを使う

[gxui](https://github.com/google/gxui)はGoogleが作ったGUIライブラリです。

作業環境は MacOSXです。

# 依存解決

ビルドするには色々入れないといけないものがあります。

```bash
$ brew install glew
$ go get code.google.com/p/freetype-go/freetype/truetype
$ go get github.com/go-gl-legacy/gl
$ go get github.com/go-gl/glfw/v3.1/glfw
```

それと、フォントデータも必要で GoogleFontsからダウンロードしておきましょう

[SourceCodePro](https://www.google.com/fonts#UsePlace:use/Collection:Source+Code+Pro)

# ビルド

gxuiのプロジェクトの中にsampleがあります。

とりあえずpolyeditをビルドします。

```bash
$ cd sample/polyedit
```

で　移動し　先ほどダウンロードしたフォントデータのSourceCodePro-Regular.ttfをdataディレクトクリに入れます。

```
.
├── data
│   └── SourceCodePro-Regular.ttf
└── main.go
```

そして`go build`でビルドすれば`polyedit`っという実行ファイルができるので実行します。

```bash
$ ./polyedit
```

![スクリーンショット 2015-03-17 23.38.21.png](https://qiita-image-store.s3.amazonaws.com/0/15818/fcd0446f-1075-ce8d-4179-185e24912437.png)
Seasar2 [No.1] 概要

概要
====

## Seasar2の特徴
###<red>**DI**</red>(Dependency Injection)と**AOP**(Aspect Oriented Programming)をサポートした軽量コンテナ
 

 ***
4つの特徴

- 設定ファイルの記述量が少ない
- SMART deploy機能を備えている
- フルスタックフレームワークである
- 技術面以外でのメリット


**1. 設定ファイルの記述量が少ない**
個人的に使用したフレームワークがFuelしかないので
感想として、記述量が少ないという実感はない。

**2. SMART deploy機能を備えている**
DIコンテナとしてSearsar2の最大の特徴の1つ。
特にHOT deployモードは、アプリケーションサーバを再起動せずにクラスの修正を反映できる。
※スマートデプロイに関する内容はまとめて記載します。

**3. フルスタックフレームワークである**
フルスタックが良いのかシングルタスクが良いのかは意見がわかれると思いますが。
各利点を簡単に…
フルスタック⇒機能満載でビジネスロジックに集中して開発ができる
シングルタスク⇒拡張性がある、学習コストが低い

**4. 技術面以外でのメリット**
日本産のフレームワークである為にググったら日本語での資料が沢山見つかる。
***
##**DIとは**
Dependency Injection 日本語で「**依存性の注入**」

###Q.『依存性の注入』とは何か?
A.「依存していた部分を、外から注入すること」

###Q.『依存性』とは何か?
A.あるクラスに固定の①変数②定数③インスタンスが入っている状態のことで、
そのクラスは変数、定数、インスタンスに依存しているということ。

###Q.『注入』とは何か?
そのクラスの外から変数、定数、インスタンスをクラスに入れること。

###Q.なぜ依存性を注入したいのか?
1. 外から動的に動作を変更できないので、テストしづらい
2. 決め打ちなので、柔軟性がなくカスタマイズしにくい

###ラーメンで例えてみる
**依存性のあるラーメン = カップラーメン**
カップヌードルだとすると、お湯を注ぐだけで完成
簡単だがアレンジしにくい。
味は全てカップの中にあるので工夫もしにくい。
カップヌードル(日清)が提供しているものに依存する。

**依存性のないラーメン = 袋麺(即席麺)**
麺を茹でるのは決まっているが、具材は自分で決められる。
色々麺や具材などでアレンジができる。
ラーメンに具材や調味料を外から注入できる。
***
新しいホストをknown_hostsに追加

[serverfault](http://serverfault.com/questions/132970/can-i-automatically-add-a-new-host-to-known-hosts)から転載:

```bash

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts
```
Raspberry Pi2でGPIO制御(メモリマップトレジスタ)

#RaspberryPi の場合
RaspberryPiでは、SoCがBCM2835だったため、
ペリフェラルレジスタアドレスは、以下であった。
*0x20000000*

ペリフェラルレジスタアドレス＋GPIOオフセット0x00200000となる
*0x20200000*
に対しアクセスすることでGPIOを制御できる。



#RaspberryPi2の場合
RaspberryPi2では、SoCがBCM2836(BCM2709?)であるため、
上記アドレスでは、GPIOを制御できない。
BCM2836(BCM2709?)のペリフェラルレジスタアドレスは、以下となる。
*0x3F000000*

GPIOオフセットは、0x00200000のままであるため
*0x3F200000*
に対しアクセスすることでGPIOを制御できる。

#参考HP
Jun's Homepage Raspberry Pi と Raspberry Pi2の非互換性
http://www.mztn.org/rpi/rpi42.html

こじ研 Raspberry Pi 応用編
http://www.myu.ac.jp/~xkozima/lab/raspTutorial3.html

\#define BCM2708_PERI_BASE        0x3F000000
https://github.com/raspberrypi/linux/blob/cccc0886453edffc761ab30fa38cebfda434c36a/arch/arm/mach-bcm2709/include/mach/platform.h
WordPressテーマ作成のための備忘録

WordPressのテーマ作成のための備忘録(随時更新)

## 開発環境関連(Mac)
### プラグインなどをインストールできるようにする
apacheがWordPressのディレクトリに書き込める権限を持っていないと、ブラウザ上からプラグインのインストールなどができないので不便。

[WordPress更新時にFTP情報入力画面が表示される場合の対処方法3つ](http://www.sandalot.com/wordpress更新でftp入力画面が表示される場合の対処法/)

`chown`でWordPressがあるディレクトリ全体の権限を`_www`にしてしまうのが楽。

```
chown -R _www wordpress
```

### 自動更新
#### BrowserSync
ファイルを更新した際のブラウザの自動リロードは[LiveReloadよりもBrowserSyncの方が手軽で便利](http://nantekottai.com/2015/03/23/browser-sync/)。

BrowserSyncのproxyモードを使う。

```
browser-sync start --proxy="localhost:80" --files "*"
```

proxy経由でアクセスしていてもWordPressのインストールURLにリダイレクトされてしまう場合は、テーマの`functions.php`で`Canonical Redirection`を無効にする。

```
<?php
remove_action('template_redirect', 'redirect_canonical');
```

※他にもっと良いやり方はないのだろうか

### サーバーへのデプロイ
#### rsyncでの転送
特にサーバー側でファイルが増えるようなものでもないしファイル数も少ないので、`rsync`によるデプロイでも十分

```
rsync -av -e ssh . user@serverhost:www/path/to/wordpress/wp-content/themes/mytheme/
```

### gulpを使う場合

```
var gulp = require('gulp');

var browserSync = require('browser-sync');
var rsync = require('gulp-rsync');

gulp.task('deploy', function() {
  gulp.src('.')
  .pipe(rsync({
      hostname: 'serverhost',
      destination: 'www/path/to/wordpress/wp-content/themes/mytheme/',
      user: 'user',
      recursive: true,
      exclude: ['.git/', 'node_modules/', 'gulpfile.js'],
      args: ['--verbose']
    }));
});

gulp.task('browser-sync', function() {
  browserSync({
    proxy: "localhost:80",
    startPath: "~username/wordpress/"
  });
});
```

## スケルトンの作成
WordPress4.1のデフォルトテーマのTwenty Fifteenは若干個性が強く、ベースとしては使いにくい。
[Underscores](http://underscores.me)を使ってベースのテーマを作るのが良い。

## Bootcampのインストール
難しく考えなくてもレスポンシブデザインを実現できるBootstrap最高。
特に理由がなければCDNを使ってインポートするのが楽。

```header.php
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
```

```footer.php
<?php wp_footer(); ?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
</body>
</html>
```
StethoでSQLite, Preferenceの中を覗く

StethoはAndroidアプリケーション用のデバックブリッジ. 
Chrome Developer Toolsを使用してChrome Desktop Browserからリモートデバックを実現する. 
ネットワークパフォーマンスの解析等を可能にするが, SQLiteやPreferenceの中を覗くこともできる. 
今回はStethoを使ってPreferenceを確認してみる. 

Stetho公式: http://facebook.github.io/stetho/

転載元：[Android: StethoでSQLite, Preferenceの中を覗く](http://yuki312.blogspot.jp/2015/03/android-stethosqlite-preference.html)

### Gradleを編集

Stethoライブラリを導入するために下記をgradleに追加.

```gradle
dependencies {
    compile 'com.facebook.stetho:stetho:1.0.0'
}
```

ApplicationクラスのonCreateで下記を実行. 

```java
public class MyApplication extends Application {
  public void onCreate() {
    super.onCreate();
    Stetho.initialize(
        Stetho.newInitializerBuilder(this)
            .enableDumpapp(
                Stetho.defaultDumperPluginsProvider(this))
            .enableWebKitInspector(
                Stetho.defaultInspectorModulesProvider(this))
            .build());
    }
}
```

あとはアプリを実行し, 端末とPCを接続. 
PCのChromeブラウザから`chrome://inspect/#devices`にアクセスし, デバッグ対象の端末のinspectを選択. 
Developer Toolが起動するのでResources＞Local Storageからアプリが持つPreferenceを確認・編集することができる. 

![DevTools](http://4.bp.blogspot.com/-I_kedDpEDV0/VQgwvjBISLI/AAAAAAAAFoA/qXlgr4s3fGs/s1600/stetho_dev_tool.png)

### 追記

ProguardのShrinkでstethoに必要なクラスが削除されるのを防ぐ必要がある.
https://github.com/facebook/stetho/issues/42

```text
-keep class com.facebook.stetho.** {*;}
```

以上.
ぼくのかんがえたpython2.6こまんどらいんあぷりひながた

## 特徴

* CentOS6にデフォルトで入ってるpython2.6使用
* python3.5でも動く
* 外部ライブラリ排除でとりまわしをよく
* 標準でついてるoptparse/argparseを使用。今後のためにオプションはdictに変換
* プロファイラを動かせるようにする
* thread,multiprocessing対策にloggingを使う
* pipeが切れてもいいようにsignalとる
* よくある関数/メソッドの入りと出を出力するwrapper
* objectの中身の概要をjson表示できるhelper関数

## ソース

```py:simple.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

import sys

from logging import getLogger, StreamHandler, Formatter

logger = getLogger(__name__)

def global_loginit(logname=__name__, format="%(message)s", stream=sys.stderr, level=20, datefmt="%Y-%m-%dT%H:%M:%S" ):
    _logger = getLogger(logname)
    _logger.setLevel(level)
    _handle = StreamHandler(stream)
    _handle.setFormatter(Formatter(fmt=format,datefmt=datefmt))
    _logger.addHandler(_handle)
    return _logger

def main(opts):
    logger.info("Python {0}".format(sys.version))
    logger.warning("{0}".format(opts))
    logger.info("{0}".format(opts))
    logger.debug("{0}".format(opts))
    opts["consolelogger"].info("This is it")

def options(opt, add_func, help_tail):
  optadd=add_func(opt)
  optadd('-P', '--prof', default=False, action='store_true', help='get profile' + help_tail )
  optadd('-D', '--Debug', default=False, action='store_true', help='log debug' + help_tail)
  optadd('-Q', '--Quiet', default=False, action='store_true', help='log quiet' + help_tail)
  if type(opt).__name__.startswith("Arg"):
    optadd("args", type=str, nargs='*')
  return opt

def parsed_opts():
  try:
    import argparse
    description= "test"
    epilog = """epilog
    """
    opt = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=description, epilog=epilog)
    add_func = lambda x: x.add_argument
    parsefunc = lambda x: dict(vars(x))
    help_tail=''
  except ImportError as e:
    import optparse
    opt = optparse.OptionParser()
    add_func = lambda x: x.add_option
    parsefunc = lambda x: dict(vars(x[0]).items() + [('args', x[1])])
    help_tail=' [default: %default]'
  return parsefunc( options(opt, add_func, help_tail).parse_args())


if __name__ == '__main__':
    opts = parsed_opts()

    loggercfg = {
      "format": "%(asctime)s.%(msecs).03d %(process)d %(module).4s %(levelname).4s %(lineno)d/%(funcName)s %(message)s",
      "level": 20 if (not opts["Debug"] and not opts["Quiet"]) else 10 if opts["Debug"] else 30
    }
    global_loginit(**loggercfg)
    opts["consolelogger"] = global_loginit(logname=__name__+"console",stream=sys.stdout)

    if opts['prof']:
      import cProfile
      cProfile.run('main(opts)')
      sys.exit(0)
    main(opts)
```
Enumerable モジュールのメソッドを類似グループ分け

個人的なイメージです。

要素それぞれ: `each`/`reverse_each`/`cycle`/`each_entry`
要素それぞれと付随物を: `each_with_index`/`each_with_object`
要素を元とした配列: `map`(`collect`)/`flat_map`
合わせた配列: `zip`
畳み込み: `inject`(`reduce`)
条件を満たすか: `all?`/`any?`/`one?`/`none?`
要素に含まれているか: `include?`(`member?`)
要素を一つ探す: `find`(`detect`)/`find_index`
一定数毎に要素区分け: `each_cons`/`each_slice`
先頭から抜き出し/叩き落とした配列: `first`/`drop`/`drop_while`/`take`/`take_while`
条件を満たす要素を抜き出した配列: `select`(`find_all`)/`reject`/`partition`/`grep`
条件がキー、条件を満たす要素が配列の値にしたハッシュ: `group_by`
条件を満たす要素で区分け: `chunk`/`slice_before`/`slice_after`/`slice_when`
最大最小: `max`/`min`/`minmax`/`max_by`/`min_by`/`minmax_by`
並べ替え: `sort`/`sort_by`
変換: `to_a`(`entries`)/`to_h`
数え上げ: `count`
遅延評価: `lazy`

参考：[module Enumerable](http://rurema.clear-code.com/2.2.0/class/Enumerable.html)

関連：

- [Ruby - Array クラスのメソッドを類似グループ分け - Qiita](http://qiita.com/riocampos/items/6fdc5ce90eda53e18228)
- [Ruby - Hash クラスのメソッドを類似グループ分け - Qiita](http://qiita.com/riocampos/items/46cf01b1753ef8a1d081)
- [Ruby - String クラスのメソッドを類似グループ分け - Qiita](http://qiita.com/riocampos/items/b678e1a535470dc614cf)
Lazy<T>なプロパティのスニペット


## Lazy\<T\>クラス
https://msdn.microsoft.com/ja-jp/library/dd642331%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
にあるように変数の遅延初期化を行えます。
正直Lazy\<T\>を使わなくても書き方はいろいろありますが、

* コンストラクタの引数つかって初期化処理するけどその引数をわざわざフィールドなりで持つまでもない
* Parallel or Task 越しに触れるようにしておかなければいけない

場合はLazy\<T\>推奨なわけです。

## よくある使い方

```csharp

        private Lazy<HogeClass> _hoge;
        public HogeClass Hoge { get { return _hoge.Value; } }

```

遅延初期化したいプロパティなどで上のような書き方をすることがよくある(毎回 `.Value` を書きたくない)と思いますが。。。正直めんどくさい。
のでスニペット作りました。

##Lazy\<T\>なフィールド、プロパティでゲット
```lazy.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
	<CodeSnippet Format="1.0.0">
		<Header>
			<Title>LazyProperty</Title>
			<Shortcut>lz</Shortcut>
			<Description>Lazy Property</Description>
			<Author>Taro Furuya</Author>
			<SnippetTypes>
				<SnippetType>Expansion</SnippetType>
			</SnippetTypes>
		</Header>
		<Snippet>
			<Declarations>
				<Literal>
					<ID>typename</ID> 
					<ToolTip>TypeName</ToolTip>
					<Default>TypeName</Default>
				</Literal>
				<Literal>
					<ID>fieldname</ID>
					<ToolTip>FieldName</ToolTip>
					<Default>_fieldName</Default>
				</Literal>
				<Literal>
					<ID>propertyname</ID>
					<ToolTip>PropertyName</ToolTip>
					<Default>PropName</Default>
				</Literal>
			</Declarations>
			<Code Language="csharp">
				<![CDATA[
				private Lazy<$typename$> $fieldname$;
				public $typename$ $propertyname$ { get { return $fieldname$.Value; } }
				]]>
			</Code>
		</Snippet>
	</CodeSnippet>
</CodeSnippets>

```

##Lazy<T>のフィールドがreadonlyバージョン 

```readonlylazy.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
	<CodeSnippet Format="1.0.0">
		<Header>
			<Title>ReadonlyLazyProperty</Title>
			<Shortcut>lzr</Shortcut>
			<Description>Readonly Lazy Property</Description>
			<Author>Taro Furuya</Author>
			<SnippetTypes>
				<SnippetType>Expansion</SnippetType>
			</SnippetTypes>
		</Header>
		<Snippet>
			<Declarations>
				<Literal>
					<ID>typename</ID> 
					<ToolTip>TypeName</ToolTip>
					<Default>TypeName</Default>
				</Literal>
				<Literal>
					<ID>fieldname</ID>
					<ToolTip>FieldName</ToolTip>
					<Default>_fieldName</Default>
				</Literal>
				<Literal>
					<ID>propertyname</ID>
					<ToolTip>PropertyName</ToolTip>
					<Default>PropName</Default>
				</Literal>
			</Declarations>
			<Code Language="csharp">
				<![CDATA[
				private readonly Lazy<$typename$> $fieldname$;
				public $typename$ $propertyname$ { get { return $fieldname$.Value; } }
				]]>
			</Code>
		</Snippet>
	</CodeSnippet>
</CodeSnippets>

```

##使い方
これらをファイルに保存してからVSのツール>スニペットマネージャから追加してください。
任意のクラスの直下でlz->tab or lzr->tab で

```ex.cs
        private Lazy<TypeName> _fieldName;
        public TypeName PropName { get { return _fieldName.Value; } }
```

こんな感じのできるのでTabで移動しながらTypeName,_fieldName,PropNameを入力すればできあがりです。
ほんのり楽になります。
チケットの質を(ある程度)担保するためのテンプレート

# よいチケットは不幸を防ぐ

* **再現できないから直せない**
* **ぱっと見面倒そうなので後回しにする**

チケットに情報が不足していると「誰かが」それを調べ・確認し、追記しなければなりませんが、
そのような「予想外のタスク」は地味にスケジュールを圧迫します。

* **書いてある通りに直したのにお客さんに「思ってたんと違う」と言われてやり直し**
* **直したら今までOKだったところが壊れて結果的にバグが増える・やり直し**

開発は往々にして「仕様書に書いてあることを実装すればOK」ではありません。
製品の歴史的経緯、市場の傾向、バグの勘所、開発メンバーの顔ぶれ、お客さんの性格・ビジネスの進め方、無数のミーティング・交渉の積み重ね、等々から、「暗黙の要求」「将来のための最適解」を「読み取って」対応する必要がありますが、
「プロジェクトに途中から参加したメンバー」や「忙しい開発者」には、それら事前知識を十分に知る時間が取れません。

…などと書きましたが、単純に

* **何のために切られたか分からない一行チケット**
* **直される当てがない積みチケット**
* **何をどうしたのか確認のしようがない「直した詐欺状態」のチケット**
* **書かれた通り実装したのにリリース後にリオープンされるチケット**
* **仕様考慮漏れのためにデグレで遅延するチケット**

が好きではないので、「そのチケットを無事にクローズさせるために必要十分な情報が書かれた理想のチケット」を追求しようという話です。

# テンプレート

>背景： ※ある場合のみ。なければ省略

>環境：
Revision: commit XXXXXXX (7桁以上)
Device: NexusS (4.1.2), iPhone6 (8.1.3) 
Test Data: ※現象が起きるデータ、コンテンツ、ファイル、ページ

>再現手順：
1. アプリを起動してテストデータを表示する
2. ...

>実動作（現象）：

>期待動作：

>再現率： ※100%のときは省略してもよい

>ログ： ※クラッシュログなど、必要な時

## 背景：
（主に仕様策定や機能実装チケットで）なぜこのチケットが起票されたのか、このチケットを対応することで最終的に実現すること/解決したい課題、などを記載する。
例えば、「商品を横断的に検索する機能実現のため」や「クライアント側の修正が困難なためサーバー側で対応する必要がある」、「AppStoreのレビューでXX機能についての改善要望が多かったため」など。

x: XXがしたいからXXを実装する
→ o: XXをすることでOOがしたいから（OOをすることを想定したXXの実装ができる。OOをするための最適解はXXではないことに気付ける）

## 環境：
いつでも/誰でも、確実に再現ができるよう、端末・OS・コンテンツなどの情報を記載する。
Jenkinsでビルドされたものを使用した場合は、ビルド番号も記載する。

## 再現手順：
なるべく簡単・確実に再現できる手順を調査し、記載する。
（再現が面倒・時間がかかる・難しいチケットは修正しにくく、改修確認しづらい）

## 実動作（現象）：
いつでも/誰でも、どのような現象かが理解できる/再現したかしないかを判断できるように分かりやすく、具体的に記載する。

**NGワード：** おかしい、変、不正、異常、崩れる
x: 表示がおかしい（←どうおかしいの？）
→ o: 文字サイズが変わらない

**言葉で表現しにくい現象は、スクリーンショットを使う。**
x: 画面の一部が白くなる（←一部ってどこ？どんなふうに白くなるの？）
→ o: 画面の一部が白くなる（添付画像参照）

## 期待動作：
いつでも/誰でも、期待動作かどうかを判断できるように分かりやすく、具体的に記載する。
**NGワード：** 正しい
x: 検索が正常に動作すること（←何ができれば正常なの？）
→ o: 検索でヒットしたページへ移動し、検索ワードをハイライトすること

**言葉で表現しにくい現象は、スクリーンショットを使う。**
x: 正しく表示される（←どういう表示が正しいの？）
→ o: 正しく表示される（添付画像参照）

**【重要】影響範囲のバグ発生・見逃しを予防するため、現象に関連する仕様も記載する。**

x: 背景色が設定した色に変わること
→ o:

* カテゴリA,Bの各条件の時、背景色が設定した色に変わること
* モードXの時も設定した色に変わること
* モードYの時は設定によらず白背景で表示すること

x: 文字列がハイライトされること
→o :

* 文字列がハイライトされること
* 背景色を設定で変更しているときでもハイライトされること
* モードX,Yの時もハイライトされること

# 未来の自分のためのチケット作成

何百・何千と起票されてはクローズされていくチケット群。
整然と並べられただじっと対応されるのを待っているチケット群。
忘れた頃に掘り起こされては埋もれ、一瞥されては閉じられていくチケット群。

時間の経過とともに蒸発していく情報をできる限り記録して、未来の誰かの「？」に答えられるように、頑張ってチケットを書きましょう。
VisualStudio+ReSharper Alt+Insでらくらくコード生成

#Resharperとは

VisualStudioの強力な拡張です。

詳しくはこちら
https://www.jetbrains.com/resharper/

#Alt+Insで出てくる項目について

クラスの中にキャレットを置いてAlt+Insキーで出てくるメニューについてよく使うものを挙げてみます。
ちなみにVisualStudio上では↓のようになります。(Hogeクラス内でAlt+Insした例)

![altins.png](https://qiita-image-store.s3.amazonaws.com/0/52072/0f16a01d-a58e-88a5-2033-43cbc22c9256.png)


##Constructor
* コンストラクタで渡したいプロパティなりフィールドを指定してFinishすると、適切に引数をとってプロパティに入れてくれるコンストラクタを作ってくれます。
* ReShaper8.1以降ならctorp->tab,ctorf->tab,ctorpf->tabのスニペットでもさくっといけます。

##(フィールドがあるクラスで)Read-only properties / Properties
* フィールドを選択してFinishすると該当のフィールドをGet(Propertiesならsetも)するReadOnlyなプロパティを適切につくってくれます。
* auto propertyでsetterプライベートなプロパティならpropg->tabで!

##(継承先のクラスで)Missing-members / Overriding-members
* 未実装のAbstractの何かがあれば実装するコードを生成してくれます
* 未実装の何かがあれば実装するコードを生成してくれます。

##Equality-members
* 比較すべきプロパティ･フィールドをチェックしてFinishすると、 Equals(),object版Equals(),GetHashCode()を適切に実装してくれます。(HashCodeは要件に合わせて修正要です。)

##Formatting-members
* 確認したいプロパティ･フィールドをチェックしてFinishすると、該当プロパティ･フィールドを全部string.Format()するToString()を適切に実装してくれます。
 * コレクションに対してはそれぞれにToString()してくれるわけじゃないのが惜しい。。。


#まとめ
ReSharperは機能が豊富なので探ればもっといろいろ楽できそうですね。
UIに枠線、角丸を適用する

# はじめに

UIImageViewやUIButtonに枠線や角丸を適用する方法をSwiftで書きます。

# 画像を表示する

UIImageViewを配置して画像([NASA Blue Marble of Eastern Hemisphere](http://commons.wikimedia.org/wiki/File:Earth_Eastern_Hemisphere.jpg))を読み込みます。

実行すると画像が表示されます。

![地球1](https://qiita-image-store.s3.amazonaws.com/0/3862/79e55c0f-468a-b6b0-7a3b-264887d830e5.jpeg)

# 枠線

枠線を適用します。ここでは枠線の色を赤にします。

```swift:sample1.swift
self.imageView.layer.borderColor = UIColor.redColor().CGColor
self.imageView.layer.borderWidth = 10
```

![地球2](https://qiita-image-store.s3.amazonaws.com/0/3862/5029311f-47b0-65bf-e384-fd7f2652c329.jpeg)

# 角丸

次に角丸を適用します。

```swift:sample2.swift
self.imageView.layer.cornerRadius = 30
```

![地球3](https://qiita-image-store.s3.amazonaws.com/0/3862/b50962e3-ba6d-052e-6de7-3276acc85396.jpeg)

角丸が適用されました。この状態では画像の上に枠線が描画されているように見えます。
角丸に合わせて画像をマスクする処理が必要です。

```swift:sample3.swift
self.imageView.layer.masksToBounds = true
```

![地球4](https://qiita-image-store.s3.amazonaws.com/0/3862/2b9d46ab-5a74-789e-9f7a-009325f6c4c5.jpeg)

これで画像が角丸に合わせてマスクされました。

今回はUIImageViewを例に枠線、角丸を適用しましたが、UIButtonでも同様の処理で実装できます。

# 最後に

cornerRadiusの値を大きくしていくと画像はどう表示されるのか実験してみました。
UISliderを配置してスライダーを右に動かすほどcornerRadiusの値を大きくするようにしています。

![スライダー](https://qiita-image-store.s3.amazonaws.com/0/3862/53669987-66e7-e0ee-eacb-d6079e7c4c44.jpeg)
objective-cで書かれたcocoa podsのライブラリを使ってハマった件

objective-cで書かれたcocoa podsのライブラリを使ってハマったので、何をしたかメモ程度に書いておく。

注）執筆時はswift勉強中で、objective-cはあんまり触ったことないです。cocoapodsも今回が初めての使用。


### 1. Xcodeでプロジェクトを作成
プロジェクト名をMySwiftProjectとする。

###2. cocoapods追加
プロジェクトルートに移動。
```
$ pod init
$ vi Podfile (ここでライブラリを追加、仮にmyCocoaPodsLibとする)
$ pod install
$ open MySwiftProject.xcworkspace (.xcodeprojを開けてはダメ)
```

多分ここまでは定石通り。ここからswiftのプロジェクトにcocoapodsのobjective-cをインポートするステップ。以下を参考にした。
http://stackoverflow.com/questions/24002369/how-to-call-objective-c-code-from-swift

### 3. 対象の.mファイルのみをプロジェクトに追加。これでbridging-headerを自動生成

### 4. つぎに対象の.hファイルをプロジェクトに追加。これでbridging-headerを自動生成
もしかしたら.hはプロジェクトに追加する必要ないかもしれない。

### 5. bridging-header に対象の.hファイルをインポートする記述を追加

```objc
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "myCocoaPodsLib.h"
```

## 6. 3.と4.でインポートした.mファイル、.hファイルを削除
これをやっておかないとbuildでリンカでエラーが出た。

これでようやくswiftでobjective-cのライブラリが使えるようになっているはず。


参考:
http://qiita.com/konomi_rose/items/6c0d2795227124653a0e
xcodeにまかせずヘッダファイルを書いて、設定する場合はこれで良さそう。

おそらくだが、cocoapodsでライブラリをインストールしておくとPodsフォルダの下に先ほどインポートした.mファイルとかがすでにプロジェクトの中に入っているっぽい。

以上、使い方がよくわからずもがいてしまった記録でした。
【解決済】C#フォームでSQLite。他のDBでも通用するINSERT文とは…？

**※※※※※※※※※※※※※※※※※※※※※ 
teratailと同様の投稿内容となっております。 
ご容赦ください。 
※※※※※※※※※※※※※※※※※※※※※**

C#でSQLiteを扱うプログラムを書いていて、お偉いさんにもらった指摘からどう改良していけばいいかで詰んでるお話。

## 何をするのか
現存するテーブル「TABLE」に、
・ID：テーブル内の最高値の次の番号
・NAME：TextBoxから入力
・POINT1～3：NumericUpDownから入力
をINSERTでレコードとして追加していくだけなので、単純といえば単純。

## とりあえず組んでみた

```c#:Form_Input.cs
/// <summary>
/// レコードを追加
/// </summary>
private void recordAdd()
{
    // 宣言
    SQLiteConnection cn = null;

    try
    {
        // DB接続文字列
        string connectionString = string.Format("Data Source={0};Version=3;", Application.StartupPath + @"\result.db");

        // DB Open
        cn = new SQLiteConnection(connectionString);
        cn.Open();

        SQLiteCommand cmd = cn.CreateCommand();
        cmd.CommandText = string.Format("INSERT INTO TABLE(ID, NAME, POINT1, POINT2, POINT3) SELECT MAX(ID) + 1, {0}, {1}, {2}, {3} FROM TABLE;",
            "'" + this.textBox_Name.Text + "'",
            this.numericUpDown_Point1.Value.ToString(),
            this.numericUpDown_Point2.Value.ToString(),
            this.numericUpDown_Point3.Value.ToString());
        cmd.ExecuteNonQuery();
    }
    finally
    {
        // DBクローズ
        if (cn != null)
        {
            cn.Close();
        }
    }
}
```

…とまあ、こんな感じで。実行中も特にエラーは起きなかったので、これで提出すると…。

## お偉いさんからの返事

>SQLiteはプライマリーキーに数字が割り当てられていると自動で一番大きな値+1をしてID発行するようになっている。
データがない場合MAXはnullになることを考慮しているかは不明だが、たまたまうまく動作している原因となっている。
nullを考慮したSQLもしくはプログラムを組んでほしい（他のDBでも同じようなSQLを書いてしまうのを防ぐため）。

**…どゆこと？**

`MAX(ID) + 1`
と書くのがよろしくないのか…？
テーブルが空であるときにIDの最高値を見てもnullだから、SQLiteはともかく他のDBで同様に動作する保証はないので、
他のDBでも問題なく動作しそうなコードに改良しろ、ということか…。

当然、INSERTするIDはDBから取得して決定するのが普通だろうから、
DBの中身が空であるかどうかを判定すればいいのか。

で、どっちをいじるべきかな…と迷いだす。
ちょっと考えればif文とかで強引に組めるんだろうけど、SQL文ちょっといじるだけで突破できるならそうしたいよねっていう。


…どなたかご教授ください…(;꒪ ω꒪)

## 追記 3/18 11:30
お偉いさんに、
> IDを指定せずにオートインクリメントで付けていくのは、仕様に甘えている。
たしかに普通はオートインクリメントを設定しておくものだが、
今回に限りその設定がないものとして考えてみてくれ。

とのお言葉をいただいて参りました。なんじゃそりゃ。

teratailにてご回答いただいた、`ISNULL(MAX(ID) + 1, 0)`を利用してみようと思いましたが、そのまま組み込んで、

```sql:クエリ文
INSERT
  INTO TABLE
  ( ID
  , NAME
  , POINT1
  , POINT2
  , POINT3 )
SELECT
  ISNULL(MAX(ID) + 1, 0)
, {0} /* TextBox */
, {1} /* NumericUpDown */
, {2} /* NumericUpDown */
, {3} /* NumericUpDown */
FROM
  TABLE
;
```

としてみたのですが、`try-catch`で例外を返されてしまいました。

> SQL logic error or missing database near "ISNULL": syntax error

あれ、クエリが間違ってる…？もしかしてINSERT文のときは`ISNULL`を使えないとか…？
というかそもそもSQLiteに`ISNULL`って存在するのか…？


## 自己解決
結局、CASE文で書きました。

```SQL:クエリ文
INSERT
  INTO TABLE
  ( ID
  , NAME
  , POINT1
  , POINT2
  , POINT3)
SELECT
  CASE
    WHEN COUNT(*) = 0 THEN 1
    ELSE MAX(ID) + 1
  END
, {0} /* TextBox */
, {1} /* NumericUpDown */
, {2} /* NumericUpDown */
, {3} /* NumericUpDown */
FROM
  TABLE
;
```
最初からこうすればよかった…。
なにはともあれ解決。結果もごくごく単純なものでした。
VC++12 (VS2013) で POCO 1.6.0 をビルドしたメモ

# 目的

POCO 1.6.0 （OpenSSL に依存した機能込み）の x86, x64 向け DLL をビルドする。

ビルドしたいものは

1. POCO x86 マルチスレッド DLL
2. POCO x86 マルチスレッドデバッグ DLL
3. POCO x64 マルチスレッド DLL
4. POCO x64 マルチスレッドデバッグ DLL

# 準備

OpenSLL 1.0.2 を [x86](http://qiita.com/softgate/items/6628438777197854740f), [x64](http://qiita.com/softgate/items/1c28b7292f0148c0b278) どちらも（スタティックライブラリは不要のため、DLL およびそのインポートライブラリを）ビルドしておく。

また、それぞれ、`D:/Libraries/openssl-1.0.2-x86` と `D:/Libraries/openssl-1.0.2-x64` にインストールしたものとする。

# POCO のビルド

## x64 版

* VC++ 12 の x64 ツールセットにパスが通ったコマンドプロンプトを開いて、poco-1.6.0-all.zip を展開したディレクトリに移動。
* `components` というテキストファイルを編集し、不要なコンポーネントを削除。ここでは `Data/MySQL` という行のみ削除した。
* `buildwin.cmd` を編集して OpenSSL のディレクトリを適切に指定する：

```
set OPENSSL_DIR=D:\Libraries\openssl-1.0.2-x64
```

* x64 の DLL をビルドするには次のようにしてバッチを起動：

```
> buildwin.cmd 120 build shared both x64
```

* x64 の DLL は `bin64` 以下に、インポートライブラリは `lib64` 以下に生成されている。

## x86 版

* 基本的には同様の手順に従う。
* まず、`buildwin.cmd` を編集して OpenSSL のディレクトリを指定する。

```
set OPENSSL_DIR=D:\Libraries\openssl-1.0.2-x86
```

* x86 の VC++ ツールセットにパスが通った状態で

```
> buildwin.cmd 120 build shared both Win32
```

* x86 の DLL は `bin` 以下に、インポートライブラリは `lib` 以下に生成されている。

# 備考

そもそも OpenSSL の x86 と x64 を一つのフォルダにインストールしておく等の改良も可能かもしれないが、普段は C++ で開発しておらず、一時的に OpenSSL と POCO のビルドを通すのが目的だったため、少々泥臭くても気にしないことにした。
[IntelliJ IDEA]チームでコードフォーマット設定を共有する方法

## 誰向けのもの？

* チームでIntelliJ IDEAを使ったscala開発をしている
* コードスタイルやインスペクションの設定を共有してチーム内のコードフォーマットを一定に保ちたい

## 作ったもの

https://github.com/bigwheel/intellij-scala-project-settings

## 使い方

https://github.com/bigwheel/intellij-scala-project-settings#%E4%BD%BF%E3%81%84%E6%96%B9

## 蛇足

インスペクションやコードスタイルの設定の提案、募集中です。
こちらのほうがいいってアイデアある方はissueかプルリク送っていただければ随時対応します。
Firefoxのelement.offsetTopが上手く動かないときはElement.getBoundingClientRect()を使う


## FirefoxでoffsetTop/offsetLeftが上手く動かない（ことがある）

Firefox（36.0.1）で[element.offsetTop](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/offsetTop)が上手く動かないことがあります。
例えば487個のspanから順番にoffsetTopを取った時、期待した値と違う値が取れることがあるます。

残念ながら再現コードはありません。

## 代わりにElement.getBoundingClientRect()使う

[Element.getBoundingClientRect()](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect)を使うと正しい位置が取れます。

ただし、offsetTopと違い絶対位置を取得します。
相対位置を取るにはoffsetParentの位置を引きます。

```html
<style>
    .base,
    .main {
        position: relative;
        top: 25px;
    }

    .base {
        background-color: blue;
        width: 100px;
        height: 100px;
    }

    .main {
        background-color: red;
        width: 50px;
        height: 50px;
    }
</style>
<div class="base">
    <div class="main">
    </div>
</div>
<script>
    var element = document.querySelector('.main')
    console.log(element.offsetTop) //25
    console.log(element.getBoundingClientRect().top) //58
    console.log(element.getBoundingClientRect().top - element.offsetParent.getBoundingClientRect().top) //25
</script>

```

こんな感じです。

動くサンプルです。
http://jsfiddle.net/4hjbzc20/


Firefoxでも487個のspanからoffsetTopを取れます。

## 参考になるリンク
https://github.com/jquery/jquery/blob/74ae5444832b2fb966768a97281d2ad8c088bc58/src/offset.js#L101

jQuery最高！