OmniAICreator/Qiita-1.07M huggingface dataset:
エクセルのシリアル値から日付集計


あるデータの日付集計を頼まれたのだが,値が日付どころかどう見てもunixtimeでもない。
こんな感じ。
40820.89445601852

どうやらエクセルのシリアル値がそのまんま入っているようだ。
データベースをいじらすに集計したいところ。


## エクセルのシリアル値からunixtimeへの変換
[Excelの日付(シリアル値)についてと、UNIX時間との変換 (JavaScript, VBA) - Qiita](http://qiita.com/zakuroishikuro/items/eb8b7ab4aeb9db0f96dd)に詳しく書かれているので参考にした。感謝
unixtimeは1970/01/01からの時間(今回はミリ秒とする),
excelのシリアル値は1900/01/01からの1日=1の値なので,
  70(年)*365(日)+17(日 うるう年の分)+2(日 1969/12/31からの1日分と,謎の1900/02/29)
をexcelのシリアル値から引くことで,unixtrimeと起点が一緒になる。
あとは単位をミリ秒に合わせるだけ。


## aggregationでフィールドと四則演算
aggregationを使うとき "$excel_serial" - 25569 みたいに
フィールドの値と四則演算するときは,それを行うオペレーターを用いる。

```
  {$add: [<値1>, <値2>]}       // 値1 + 値2
  {$subtract: [<値1>, <値2>]}  // 値1 - 値2
  {$multiply: [<値1>, <値2>]}  // 値1 * 値2
  {$divide: [<値1>, <値2>]}    // 値1 / 値2
```

## aggregationで演算結果からISODateに変換
演算結果を直接new Date()でISODate型に変えようとすると

```
> db.excel_data.aggregate([{$project: {d: Date({$multiply: [{$subtract:["$excel_serial", (70*365+17+2)]}, 24*60*60*1000]})}}])
assert: command failed: {
	"errmsg" : "exception: FieldPath 'Fri Nov 27 2015 14:56:36 GMT+0900 (JST)' doesn't start with $",
	"code" : 16873,
	"ok" : 0
} : aggregate failed
```
こんな感じのエラーが出る。
これは一度new Date(0)で初期状態のISODate型をつくっておいて,
それとさっき計算したunixtimeの値を足し算することで回避できる。


## ISODate型から日付だけ取り出す
フォーマットを指定して変換できる.これは便利。
[$dateToString (aggregation) &mdash; MongoDB Manual 3.0](https://docs.mongodb.org/manual/reference/operator/aggregation/dateToString/)

```
{$dateToString: {format: "%Y%m%d", date: <さっきつくったISODate()>
```


## できたもの
```
db.excel_data.aggregate([
    {$project: {
        d:{$dateToString: {
            format: "%Y%m%d", 
            date: {
                $add: [
                    new Date(0),
                    {$multiply:[
                        {$subtract:["$excel_serial", 70*365+17+2]},
                        24*60*60*1000
                    ]}
                ]
            }
       }}
    }}, 
    {$group: {
        _id: "$d",
        count: {$sum: 1}
    }},
    {$out: "count_date"}
])
```
やったぜ。
(より)小さいDockerイメージを作ろう

> 私のブログとクロスポストしている: https://www.ianlewis.org/jp/small-docker-images

最近、コンテナ技術が流行っていていろなツールを興味深く触っている。その中の一番人気のはみんな大好きなDocker。Dockerは docker runでコンテナの実行環境を簡単に作ってくれる上、docker build でコンテナのイメージの構築も簡単にできる。Dockerのイメージ構築はDockerfileというMakefileのようなファイルを元にその中のコマンドを順番に実行して構築していくもの。

例えば、


```
FROM debian:jessie

RUN apt-get update
RUN apt-get install -y python
RUN mkdir -p /data

VOLUME ["/data"]

WORKDIR /data

EXPOSE 8000

CMD [ "python", "-m", "SimpleHTTPServer", "8000" ]
```
これは非常にシンプルなDockerイメージなんですが、実際にビルドして、イメージのサイズを見てみると：


```
VIRTUAL SIZE
167.4 MB
```
シンプルなアプリだったのに、結構大きいんだね。

## なんで大きいんだ？

上のDockerfileの1行目は `FROM debian:jessie` って書いているんだけど、イメージが大きくなっているのは、Debian 8.x がまるまるイメージに入るわけです。さらに、Dockerfileの中に何かをgccやg++をビルドする必要があれば、アプリを実行するのに必要ないのに、ビルドするたにツールやライブラリがイメージに入っていて、結構な量になる。

じゃ、例えばredisのイメージを作る場合はこうするのが一番わかりやすくて概念的にいいんだが

```
FROM debian:jessie

RUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN curl -sSL "http://download.redis.io/releases/redis-3.0.5.tar.gz" -o
redis.tar.gz
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install

# 全部削除
RUN rm -f redis.tar.gz
RUN rm -f /usr/src/redis
RUN apt-get purge -y --auto-remove gcc libc6-dev make

...

```

Dockerは RUNコマンドを実行するたびに、イメージの「レイヤー」を保存して、その状態をイメージにキャッシュする。最後に削除しても、途中でレイヤーにコミットしちゃっているから、結局イメージのサイズがそのまま大きくなる

## どうやって小さくするのか

結局 RUN を実行するたびにコミットするので、全部１個のRUNコマンドで実行しなければならない。

以下、は[実際のredisのDockerfile](https://github.com/docker-library/redis/blob/8929846148513a1e35e4212003965758112f8b55/3.0/Dockerfile)からとったスニペット


```
ENV REDIS_VERSION 3.0.5
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.0.5.tar.gz
ENV REDIS_DOWNLOAD_SHA1 ad3ee178c42bfcfd310c72bbddffbbe35db9b4a6

# for redis-sentinel see: http://redis.io/topics/sentinel
RUN buildDeps='gcc libc6-dev make' \
	&& set -x \
	&& apt-get update && apt-get install -y $buildDeps --no-install-recommends \
	&& rm -rf /var/lib/apt/lists/* \
	&& mkdir -p /usr/src/redis \
	&& curl -sSL "$REDIS_DOWNLOAD_URL" -o redis.tar.gz \
	&& echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \
	&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
	&& rm redis.tar.gz \
	&& make -C /usr/src/redis \
	&& make -C /usr/src/redis install \
	&& rm -r /usr/src/redis \
	&& apt-get purge -y --auto-remove $buildDeps
```
これでビルド用のライブラリのインステール、ビルド、片付け、全部一個のRUNコマンドでやる。こうするとイメージが大きくならない。

## 依存関係の地獄

Dockerイメージが大抵DebianやUbuntuのイメージから継承して、大きくなっているのは、アプリケーションをコンテナの中に実行すると、そのアプリの依存する動的にリンクするライブラリが全部入ってないと当然クラッシュするから。そうして、イメージを構築するときに、apt-get
などを使うのが便利。

[Googleではすべてのアプケーションがコンテナで動いている](https://speakerdeck.com/jbeda/containers-at-scale?slide=2)。コンテナのアプリを実行するために必要ないものがいっぱい入っているのが無駄なので、コンテナの外にスタティックバイナリにビルドして、そのバイナリと必要なファイルだけイメージに入れるのがGoogleのやり方。このやり方はイメージは小さくなって、依存ライブラリの管理は簡単なので、なかなか賢いと思う。これは Go がデフォールトでスタティックバイナリにコンパイルする理由のひとつ。
unity5でorientation（landscape横画面）の情報が、xcodeで逆になっている？

環境：
Mac10.10.4
Unity5.2.1f1
xcode6.4(6E35b)

<img width="334" alt="スクリーンショット 2015-11-27 13.55.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/bb08a3de-dca4-fe00-e6c0-dcf51b5a340a.png">

**Default Orientation**の**Landscape Left**が、
xcode上だと。

<img width="923" alt="スクリーンショット 2015-11-27 13.54.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/37406/5bc52340-2370-f39a-94d3-35f64c92b369.png">

おそらくこれの影響かと思いますが、
iphone5端末でスプラッシュ画像が逆になる事象が発生。
xcode上で修正すれば問題ないと思いますが、
中々気づけないのでメモ。

info.plist周りをチェックすると尚よいかも


## 追記
最新版のリリースノートに修正されったぽい記述が
http://unity3d.com/jp/unity/whats-new/unity-5.2.3

```
(none) - iOS: Don't constrain iPhone 6+ to single landscape orientation on launch.
```
swiftで画像を非同期で読み込む


```swift:ViewController.swift
var imgView:UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 240, height: 240))

override func viewDidLoad() {
	super.viewDidLoad()
    imgView.center = self.view.center
    imgView.contentMode = UIViewContentMode.ScaleAspectFit
	
	// 画像URL
    let url:String = "https://play.google.com/books/publish/u/0/static/images/google-search.png"
    let myURL:NSURL = NSURL(string: url)!

    // 非同期で読み込む
    let req:NSURLRequest = NSURLRequest(URL: myURL)
    // 通信開始
    NSURLConnection.sendAsynchronousRequest(req, queue: NSOperationQueue.mainQueue(), completionHandler: self.getHttp)

    self.view.addSubview(imgView)
}

func getHttp(res:NSURLResponse?, data:NSData?, error:NSError?) {
    // レスポンスデータをUIImageに変換
    let img:UIImage = UIImage(data: data!)!
    // 画像を適応
    imgView.image = img
}
```

結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/bec47ea4-e44c-685d-5319-66ca07f94055.png" alt="" width="300" />
トップページなどから特定のモデルの内容を一括表示したい

#はじめに

　環境はRuby2.0.0、Rails4.2.1。

　特定のモデルの内容（例：ユーザーの氏名、メールアドレス等）を一括表示する方法が複数あるようなので、それぞれの書き方、相違点についてまとめてみた。動作はどのコードも同じである。

#render @users を利用した方法
　これは一番手軽な方法である。最新版のRails Tutorialなどでも紹介されているが、手軽な分動作がわかりにくく、初心者は利用を控えた方がよいかもしれない。

###例

```erb:index.html.erb

//あらかじめcontrollerで@users = User.allと定義しておく
//また、app/views/usersに_userパーシャルを用意しておく
<%= render @users %>

```

これだけで十分である。renderに複数形の@からはじまるオブジェクトの配列を渡すと自動的にそれを_userパーシャルでレンダリングして表示してくれる。for each文も必要ない。

#render 'users/user', user: userを利用した方法
　これはやや面倒だが、明示的に動作を指定しているのでわかりやすい。

###例

```erb:index.html.erb

<% @users.each do |user| %>
   <%= render 'users/user', user: user %>
<% end %>

```

　user: userとしている部分では、userオブジェクトをuserという名前でパーシャルに渡している。例えばこれをobject: userとした場合userオブジェクトはobjectという名前でパーシャルから参照することができる。
　また、この場合はRailsが自動的にviews/usersディレクトリを見てくれないので、それをこちらが指定しておく。

#render(:partial => 'users/user', :object => user)

　これはよりActionViewらしい書き方である。:localsなどのオプション（パーシャル内部で別のローカル変数を参照したい時に使う）を利用したい時もこの書き方の場合はコードが書きやすい。

###例

```erb:index.html.erb

<% @users.each do |user| %>
   <%= render(:partial => 'users/user', :object => user)
<% end %>

```

　この場合、userはuserという名前でしかパーシャルからはアクセスできない。別の名前でアクセスしたい場合はさらに:as => :objectのように指定してやる必要がある。


#参考資料

　英文だがこちらが一番わかりやすい。
http://apidock.com/rails/ActionController/Base/render

#おわりに

　初歩的なrenderの仕様だが、和文の資料が少なく、非常に理解しづらかった。Railsを利用しているなら皆すでに知っている内容だと思うが、自分のような初学者にとってこのエントリが助けとなれば幸いである。

2016.02.10
コード部分にfor eachという謎の文法があったのを修正（自分でこの内容を改めて試していて気付いた）
この程度のViewしかないと、こうも堂々と誤っていても指摘をもらえないということがわかった。

2016.03.20
似たような内容が[ここ](http://railsguides.jp/layouts_and_rendering.html#%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B)に詳細に書かれていたのを発見した。非常に参考になるのでぜひ。
JAVA size()メソッドの注意点 ArrayList

■SizeMethod 例①

```java
import java.util.ArrayList;

public class SizeMethod {
	public static void main(String[] args) {
		// AutoBoxingによりラッパークラスCharacterがプリミティブ型charに自動変換される
		ArrayList<Character> moji = new ArrayList<Character>();
		moji.add('A');
		moji.add('B');
		moji.add('C');
		System.out.println(moji.size());

	}

}
```

■SizeMethod 例①実行結果
3

■SizeMethod 例②

```java
import java.util.ArrayList;

public class SizeMethod {
	public static void main(String[] args) {
		// AutoBoxingによりラッパークラスCharacterがプリミティブ型charに自動変換される
		ArrayList<Character> moji = new ArrayList<Character>();
		moji.add('A');
		moji.add('B');
		moji.add('C');
		moji.add(0, 'D');
		System.out.println(moji.size());

	}

}
```

■SizeMethod 例②実行結果
4

■SizeMethod 例③

```java
import java.util.ArrayList;

public class SizeMethod {
	public static void main(String[] args) {
		// AutoBoxingによりラッパークラスCharacterがプリミティブ型charに自動変換される
		ArrayList<Character> moji = new ArrayList<Character>();
		moji.add('A');
		moji.add('B');
		moji.add('C');
		moji.remove(0);
		System.out.println(moji.size());

	}

}
```

■SizeMethod 例②実行結果
2
##addは追加 setは上書き
■SizeMethod 例③実行結果

```java
import java.util.ArrayList;

public class SizeMethod {
	public static void main(String[] args) {
		// AutoBoxingによりラッパークラスCharacterがプリミティブ型charに自動変換される
		ArrayList<Character> moji = new ArrayList<Character>();
		moji.add('A');
		moji.add('B');
		moji.add('C');
		moji.add(0, 'D');
		System.out.println(moji.size());
		System.out.println(moji);
		System.out.println(moji.get(3));
		moji.set(2, 'E');
		System.out.println(moji.size());

	}

}
```

■SizeMethod 例③実行結果
4
[D, A, B, C]
C
4
Atomのインストール済みパッケージリストを出力する方法


apm list コマンドを使用します。

```bash
apm list --installed --bare
```

```bash:出力例
Sublime-Style-Column-Selection@1.3.0
atom-jade@0.3.0
autoclose-html@0.19.0
autocomplete-elixir@1.4.2
color-picker@2.0.13
docblockr@0.7.3
highlight-selected@0.11.1
jumpy@2.0.10
language-elixir@0.5.2
language-kotlin@0.4.0
maximize-panes@0.2.0
merge-conflicts@1.3.7
meteor-api@2.20.0
meteor-snippets@0.5.0
pigments@0.19.1
project-manager@2.6.5
source-preview-jade@0.1.1
tabs-to-spaces@1.0.1
trailing-spaces@0.3.2
```

# 参考

- [Installed packages list into single file - packages - Atom Discussion](https://discuss.atom.io/t/installed-packages-list-into-single-file/12227)
JAVA charAt

■Test05.java

```java
public class Test05 {
	public static void main(String[] args) {
		System.out.println(Test05("zzz11111"));
		System.out.println(Test05("ZAZ11111"));
		Boolean v = Test05("BBB0687S");
		System.out.println(Test05("AAAAAAAA"));
		System.out.println(v);
	}

	static boolean Test05(String name) {
		if (name.length() != 8) {
			// String x = "エラー";
			// System.out.println(x);
			return false;
		}
		char first = name.charAt(0);
		if (!(first >= 'A' && first <= 'Z')) {
			return false;
		}
		for (int i = 1; i < 8; i++) {
			char c = name.charAt(i);
			if (!((c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
				return false;
			}
		}
		return true;

	}

}
```

■Test05.java 実行結果
false
true
true
true
Ruby:  rake タスクのヘルプを表示する方法

`$ rake -T [task_name]`

もしくは

`$ rake --tasks [task_name]`

でその rake タスクの使い方が見られる。

---

- ちなみに rake 本体のヘルプは `$ rake -h` で見られる。
- Google で 「rake ヘルプ」と検索してもヒットしなかったのでメモ。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
JAVA char同士連結→数字になる

```java
public class Test06 {
	public static void main(String[] args) {
		char i = 'D';
		char i2 = 'B';
		int code = (int) i;
		System.out.println(code);
		int code2 = (int) i2;
		System.out.println(code2);
		System.out.println(code + code2);
		code2 = code;
		System.out.println(code2);
		System.out.println(i2);
		System.out.println((char) 66);
		System.out.println((char) 97);
		System.out.println((int) 'b');
		System.out.println((int) 'd');
		String num = Integer.toString(code);
		System.out.println(num);

		int i3 = 5;
		String num2 = Integer.toString(i3);
		System.out.println(num2);
		System.out.println(num2.toString());
		System.out.println(i + i2);
		// char同士の連結については、Stringに変換してからでないと正しい値が出ない

	}

}
```

■実行結果
68
66
134
68
B
B
a
98
100
68
5
5
134
Visual Studio Codeで、ユーザー定義スニペットで楽をする


早く調べておくんだった（血涙

最近typescriptやhtmlを書くことが多いので、なんとなくVisual Studio Codeで作業しているのですが、特にBootstrap関係でやたら同じような文字列を書いていることに気づきました。

以前RailsなプロジェクトにおいてRubymineを使って作業していた時は特にテストコードの定型文を吐くのにLive Templatesを使用しており、まあ同じような機能あるだろうということで調査しました。

# ユーザー定義スニペット
特にプラグイン等を追加せずに使用できます。

## 手順
メニュー > Code > Preferences > User Snippets をクリック

すると言語を聞かれるので、今回はhtmlを選択

html.jsonが開くので、例の通りに作ってみる

```html.json
...
	"Add new row": {
        "prefix": "row",
        "body": [
            "<div class=\"row padding-8\">",
            "    <div class=\"col-xs-12\">",
            "        $1",
            "    </div>",
            "</div>"
        ],
        "description": "crate 1row"
    }
...
```

よくある行を作るやつ

\$1は作成後のカーソル位置です。$2を設定するとそこからタブを押した際に更に移動します。

使用法はhtmlファイル編集中に 'row' と打ち、tabを押すだけ。


これで開発効率だいぶ上がりそうですね（ニッコリ
docker unpauseコマンド

##| はじめに

ここでは[公式リファレンス](http://docs.docker.com/v1.7/docker/reference/commandline/unpuase/)を参考に説明しています。
ただ、バージョンや環境等により若干挙動が異なるかもしれませんが、その点についてはご容赦ください。
また、その他のdockerサブコマンドについては[こちら](http://qiita.com/kooohei/items/8acb82c6c0bf00bfb9bb)に記載していますので、もしよければ参考にしていただければと思います。

##| 使い方

[pauseサブコマンド](http://qiita.com/kooohei/items/c7d6347bbb2057a31e26)によってSTATUSが(pause)となったコンテナの一時停止を解除をします。

```:使い方
使い方： docker unpause CONTAINER [CONTAINER...]
```

CONTAINERに入る値は"CONTAINER ID"または"NAMES"のどちらを指定しても良く、連続して指定することで複数コンテナの一時停止解除を同時に実行できます。

まずは現在のコンテナ情報を確認してみます。

```bash:コンテナ情報確認
$ docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                 PORTS               NAMES
3bf2eb952ea0        ubuntu              "/bin/bash"         36 hours ago        Up 36 hours (Paused)                       hopeful_brown
```

STATUSのところに(Paused)が付いて一時停止しているのがわかります。
それでは一時停止を解除してみましょう。

```bash:一時停止解除
$ docker unpause hopeful_brown
hopeful_brown

または

$ docker unpause 3bf2eb952ea0
3bf2eb952ea0
```

再度、コンテナ情報を確認します。

```bash:コンテナ情報確認
$ docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3bf2eb952ea0        ubuntu              "/bin/bash"         36 hours ago        Up 36 hours                             hopeful_brown
```

STATUSのところに付いていた(Paused)がなくなり、一時停止が解除されているのがわかります。

解除されると元通りattachで接続が可能となり、attachしていた際に画面操作ができなくなっていたのも解消されます。
ActiveRecord::PendingMigrationError と言われた時の解決方法

RailsでブラウザからアクセスしたところPendingMigrationErrorエラーがでました。

# PendingMigrationErrorがでる
以下がエラーの内容です。

```bash:エラー
ActiveRecord::PendingMigrationError (

Migrations are pending. To resolve this issue, run:

	bin/rake db:migrate RAILS_ENV=development

):
```
Migrationsが未解決なのでmigrateしろとあります。

# rake db:migrate を実行
migrateします。

```bash:migrate
bundle exec rake db:migrate 
== 20150917031451 CreateActivities: migrating =================================
-- create_table(:activities)
   -> 0.0192s
-- add_index(:activities, [:trackable_id, :trackable_type])
   -> 0.0077s
-- add_index(:activities, [:owner_id, :owner_type])
   -> 0.0067s
-- add_index(:activities, [:recipient_id, :recipient_type])
   -> 0.0068s
== 20150917031451 CreateActivities: migrated (0.0415s) ========================
```
migrationファイルが実行され、ボクの環境の場合はactivitesテーブルが生成されました。

# 再度 rails s

```bash:serverをstart
bundle exec rails s -b 0.0.0.0 -p 8888
```
エラーがでなくなりました。
Migrationを保留しているというエラーだったのでMigrationを実行するとエラーが出なくなります。
java 回転行列を使用した線描画

javaで回転行列を使用し、
指定した角度分回転させるようにしました。


<img width="396" alt="スクリーンショット 2015-11-27 12.11.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/85554/502eef1a-04bc-60a3-1848-65596f84581f.png">

コードはこちらになります。
ラインを使用し、見やすいようにしていますが、
座標だけを描画する場合は
((Graphics2D) g).
draw(new Line2D.Double(ox,oy,ox + x2, oy + y2));
の部分を
((Graphics2D) g).
draw(new Line2D.Double(ox + x2, oy + y2,ox + x2, oy + y2));
に変更してください。

```lang:turn.java
import javax.swing.*;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Line2D;
import java.awt.Color;
import java.awt.Component;

public class turn extends JPanel{
	int r = 100;
	int ox = 200,oy = 200;
	double x2,y2;
	
	public static void main(String[] args){
	    JFrame frame = new JFrame();

	    turn app = new turn();
	    frame.getContentPane().add(app);

	    frame.setDefaultCloseOperation
                    (JFrame.EXIT_ON_CLOSE);
	    frame.setBounds(10, 10, 400, 400);
	    frame.setTitle("回転行列使用");
	    frame.setVisible(true);
	  }
	
	 public void paintComponent(Graphics g){
		    g.setColor(Color.blue);
		    g.drawLine(200,0 , 200, 400);                       
                              //中央ラインy
		    g.drawLine(0,200 , 400, 200);
                              //中央ラインx
		    turn(g,100);
		  }
	 public void turn(Graphics g ,int s){
		 
		for(int i = 0;i <= 12; i ++){//12分割
		  g.setColor(Color.red);//色を赤に
		  double k = Math.toRadians(30 * i);
                               //radianに変換
		  
		  x2 = r * Math.cos(k);//x座標
		  y2 = r * Math.sin(k);//y座標
		  
		  /*線の描画、上の座標位置まで
            中央から回転させた線を描画する*/
		  ((Graphics2D) g).
draw(new Line2D.Double(ox,oy,ox + x2, oy + y2));
		  
		  
		} 
      }
}

```

開発環境
Mac OSX version 10.10.5

実行方法
Eclipseでインポートさせて実行してください。
Java 二次元 回転行列

Javaで回転行列のプログラムを作成しました。
![スクリーンショット 2015-11-27 12.09.59.png](https://qiita-image-store.s3.amazonaws.com/0/85551/bbc91566-a747-601e-bb10-b0d6aea5e0e9.png)

コード

```
package J3D;

import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Line2D;
import java.awt.Color;

public class J3D2 extends JPanel{

  public static void main(String[] args){
    JFrame frame = new JFrame();

    J3D2 app = new J3D2();
    frame.getContentPane().add(app);
    frame.setBackground(Color.BLACK);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(0, 0, 400, 400);
    frame.setTitle("あいうえお");
    frame.setVisible(true);
    Insets insets = frame.getInsets();
    frame.setSize(400 + insets.left + insets.right,
    		      400 + insets.top + insets.bottom);
  }

  public void paintComponent(Graphics g){
	Graphics2D g2 = (Graphics2D)g;
	
	int x = 1,y = 1;
	
	g2.setColor(Color.BLUE);
	g2.draw(new Line2D.Double(200,0,200,400));
	g2.draw(new Line2D.Double(0,200,400,200));
	
	drawCircle(g2);
  }
  public void drawCircle(Graphics2D g2){
	  
      double x , y , cx = 200, cy = 200, r = 100;
      for(int i = 0; i < 12; i++){
          x = r * Math.sin(Math.toRadians(30*i)) + cx;
          y = r * Math.cos(Math.toRadians(30*i)) + cy;
          g2.setColor(Color.GREEN);
          g2.draw(new Line2D.Double(x, y, x + 0.1, y + 0.1));
      }
  }
}
```

実行環境
・Mac versin 10.10.2
・eclipse
Java2D 回転行列 描画

Java2Dで回転行列の描画を行いました。

#コード

```rudy:Matrix2.java
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Line2D;
import java.awt.Color;

class Matrix2 extends JPanel{
  public static void main(String[] args){
            JFrame frame = new JFrame();

            Matrix2 app = new Matrix2();
            frame.getContentPane().add(app);

            frame.setBackground(Color.black);   // windowの背景色設定
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBounds(0, 0, 400, 400);
            frame.setTitle("タイトル1");
            frame.setVisible(true);
            Insets insets = frame.getInsets();  // 設定すべき値を求めるためのインスタンス化
            frame.setSize(400 + insets.left + insets.right,
                          400 + insets.top + insets.bottom); // 画面サイズ設定
          }
  
  public void paintComponent(Graphics g){
	  g.setColor(Color.green);
      drawLine(g);
      drawCercle(g);
    }

  public void drawPoint(Graphics g,double x, double y){
      Graphics2D g2 = (Graphics2D)g;
      g2.draw(new Line2D.Double(x, y, x, y));
  }
  
  public void drawLine(Graphics g){
      for(int i = 0; i < 1000; i++){
          drawPoint(g,i,200);
          drawPoint(g,200,i);
      }
  }
 
  public void drawCercle(Graphics g){
      for(int i = 0; i < 12; i++){
          double x = 100 * Math.cos(Math.toRadians(30 * i));
          double y = 100 * Math.sin(Math.toRadians(30 * i));
          drawPoint(g,x+200,y+200);
      }
  }
}
```


#実行画面
![スクリーンショット 2015-11-27 12.09.24.png](https://qiita-image-store.s3.amazonaws.com/0/85550/5d24b25d-9399-b8df-adf1-cf0d4961151d.png)

開発環境
Mac OSX version 10.10.1

実行方法
Eclipseでインポートさせて実行してください。
Javaで回転行列を使った円の描画

数学の延長で、回転行列の座標計算をプログラムでやってみました。


![スクリーンショット 2015-11-27 12.05.48.png](https://qiita-image-store.s3.amazonaws.com/0/85547/a786e544-4254-7ef8-4e3d-56e23c4c7d87.png "スクリーンショット 2015-11-27 12.05.48.png")

コード内容

```Test2
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Line2D;
import java.awt.Color;

class Test2 extends JPanel{
	
	private static final int CENTERVALUE = 300; 
	
	
  public static void main(String[] args){
		    JFrame frame = new JFrame();

		    Test1 app = new Test1();
		    frame.getContentPane().add(app);
		    
		    frame.setBackground(Color.BLACK);	// windowの背景色設定
		    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		    frame.setResizable(false);
		    frame.setBounds(0, 0, 600, 600);
		    frame.setTitle("Test");
		    frame.setVisible(true);
		    Insets insets = frame.getInsets();	// 設定すべき値を求めるためのインスタンス化
			frame.setSize(600 + insets.left + insets.right,
						  600 + insets.top + insets.bottom); // 画面サイズ設定
		  }

		  public void paintComponent(Graphics g){
		    Graphics2D g2 = (Graphics2D)g;
		    g2.setColor(Color.blue);
		    
		    g2.draw(new Line2D.Double(300,   0, 300, 600));
		    g2.draw(new Line2D.Double(  0, 300, 600, 300));
		    
		    g2.setColor(Color.green);
		    drawTest1(g2);
		  }
		  
		  public void drawTest1(Graphics2D g2){
			  double x, y, xx, yy, r = 200, cx = 300, cy = 300;
			  double[][] MathArray = new double[12][2];
			  
			  for(int i = 0; i < 360; i += 30){
				  /*  */
//				  x = r * Math.sin(Math.toRadians(i)) + cx;
//				  y = r * Math.cos(Math.toRadians(i)) + cy;
				  x = r * Math.cos(Radian(i));
				  y = r * Math.sin(Radian(i));
				  System.out.println(x - cx);
				  System.out.println(y - cy);
				  g2.draw(new Line2D.Double(x + cx, cy - y, cx + x, cy - y));
			  }
		  }
		  public double Radian(double angle){
			  angle = angle / 180 * 3.141592653589793;//Math.PI;
			  return angle;
		  }
}

```

開発環境
`Mac Version 10.10.5, Eclipse Mars`

Eclipseでimportして実行してみてください。

ターミナルで実行する場合は

```
javac Test2.java
java Test2
```

radian変換するという考えが思い浮かばず、これだけのプログラムに苦戦してしまいました...
java 回転行列

今回は回転行列を作成しました。
前回はキャストを使って円を表示していましたが、今回上手くならなかったので、キャスト自体は使わずにdouble型を使って作成しました。

下のは実行した時の画像です。
<img width="393" alt="スクリーンショット 2015-11-27 11.48.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/85552/ef25910e-a1ae-8e35-c248-b07530f8746c.png">



下のがコードです。

```java:Graphics2DTest1.java

import javax.swing.*;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Line2D;

public class Graphics2DTest1 extends JPanel{
	double x = 1;
	double y = 400;
	
	double r = 100;
	double cx, cy;
	double rx,ry;
	
	
	double movex;
	double movey;
	
	double theta = 30;

  public static void main(String[] args){
    JFrame frame = new JFrame();

    Graphics2DTest1 app = new Graphics2DTest1();
    frame.setBackground(Color.BLACK); 
    frame.getContentPane().add(app);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(0, 0, 400, 400);
    frame.setTitle("タイトル");
    frame.setVisible(true);
    Insets insets = frame.getInsets();
    frame.setSize(400 + insets.left + insets.right, 400 + insets.top + insets.bottom);
  }

  public void paintComponent(Graphics g){
	 Graphics2D g2 = (Graphics2D)g;
	 g.setColor(Color.white);
	 g.drawLine(0,200,400,200);
	 g.drawLine(200,0,200,400);
	 //array(g);
	 //Circle(g);
	 //oval(g);
	 rotation(g2);
  }
  
  public void array(Graphics2D g){
	  for(int i = 0; i <= 400; i++){
		  g.draw(new Line2D.Double(x + i ,y - i,x + i,y - i));
		  movex += 1;
		  movey -= 1;
	  }
   }
   
  
  public void Circle(Graphics2D g){
	  for(int i = 0; i < 360; i++){
		  cy = (int) (200 + Math.sin(i) * r);
		  cx = (int) (200 + Math.cos(i) * r);
		  g.draw(new Line2D.Double(cx, cy, cx, cy));
	  }
  }
  
  public void oval(Graphics2D g){
	  for(int i = 0; i < 360; i++){
		  cy = (int) (200 + Math.sin(i) * r / 2);
		  cx = (int) (200 + Math.cos(i) * r);
		  g.draw(new Line2D.Double(cx, cy, cx, cy));
	  }
  }
  
  public void rotation(Graphics2D g){
	  g.setColor(Color.yellow);
	  for(int i = 0; i < 12; i++){
		  double rx = 200 + (r * Math.cos((theta * i) / 180 * Math.PI));
		  double ry = 200 + (r * Math.sin((theta * i) / 180 * Math.PI));
		  g.draw(new Line2D.Double(rx, ry, rx, ry));
	  //g2.draw(new Line2D.Double(x, y, x, y));
		  System.out.println(i + "回目");
		  System.out.println("rx" + rx);
		  System.out.println("ry" + ry);
	  }
   }
}
```

作成環境　eclipse

ターミナルで実行する場合は下のコマンドを打ってください。
$ javac Graphics2DTest1.java
$ java Graphics2DTest1
【CentOS7】＜メモ＞ Webサーバー セットアップ


#不要なサービス

- mdmonitor

```Bash:サービス無効化
systemctl disable mdmonitor
```

#SELinux無効化

```Bash:selinux
setenforce 0
vim /etc/sysconfig/selinux
    SELINUX=disabled
```

#killall
psmiscパッケージをインストールする

```Bash:psmisc
yum -y install psmisc
```

#RPMリポジトリ
```Bash:RPMリポジトリ追加
yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

#httpd

```Bash:httpd
yum -y install httpd
firewall-cmd --permanent --add-service=http
systemctl restart firewalld
systemctl start httpd
systemctl enable httpd
```

##不要なモジュール、設定
内容をすべてコメントアウトする
*削除してはダメ（アップデート時に再作成される）*

- conf.modules.d/00-dav.conf
- conf.modules.d/00-lua.conf
- conf.modules.d/00-proxy.conf
- conf.modules.d/00-ssl.conf
- conf.modules.d/01-cgi.conf
- conf.modules.d/10-fcgid.conf
- conf.d/fcgid.conf
- conf.d/ssl.conf
- conf.d/welcome.conf

一部のモジュールをコメントアウトする

- conf.modules.d/00-base.conf

コメントアウトするモジュール

- mod_authn_anon
- mod_authn_dbd
- mod_authn_dbm
- mod_authn_socache
- mod_authz_dbd
- mod_authz_dbm
- mod_cache
- mod_cache_disk
- mod_dbd
- mod_dumpio
- mod_echo
- mod_ext_filter
- mod_filter
- mod_include
- mod_info
- mod_status
- mod_substtute
- mod_suexec
- mod_unqiue_id
- mod_userdir
- mod_version

##VirtualHost
```httpd:VirtualHost
<VirtualHost *>
  ServerName   HOSTNAME
  ServerAlias  ALIAS_HOSTNAME
  DocumentRoot DOCUMENT_ROOT_DIR
  CustomLog    ACCESS_LOG_FILE_PATH combined
  ErrorLog     ERROR_LOG_FILE_PATH
</VirtualHost>
<Directory DOCUMENT_ROOT_DIR>
  Options       FollowSymLinks
  AllowOverride All
  Require       all granted
</Directory>
```

#PHP 5.6
##インストール
```Bash:インストール
yum -y erase php*
yum -y install php-pear
yum -y install php56 php56-php-bcmath php56-php-gd php56-php-mbstring php56-php-mcrypt php56-php-mysqlnd php56-php-pdo php56-php-pgsql php56-php-soap php56-php-xcache php56-php-xmlrpc php56-xcache-admin php56-php-devel

```

##設定
```Bash:設定
ln -s /opt/remi/php56/root/etc/php.ini /etc/
ln -s /opt/remi/php56/root/etc/php.d /etc/
mv /usr/bin/php /usr/bin/php54
ln -s /usr/bin/php56 /usr/bin/php
vim /etc/php.ini
    date.timezone = Asia/Tokyo
```


#MariaDB
##インストール
```Bash:MariDB
yum -y install mariadb-server
```

##設定
デフォルトのままでOK

##起動
```Bash:起動
systemctl start mariadb
systemctl enable mariadb
```


#git
##デプロイ
```Bash:デプロイ
git clone REMOTE_REPOSITORY_URL DOUCMENT_ROOT_DIR
```
##更新
```Bash:更新
git pull
```
gitのすごい素人がdevelopへのマージで競合したときにやること

１）develop をブランチして feature-1-kakkoii-kinou-no-sinkaihatu をつくった
２）develop にマージした
３）なんか不具合とかがあったので、改めてdevelop をブランチして hotfix-2-kakkoii-kinou-no-syuusei をつくった
４）develop にマージした……競合した！！
５）しょうがないので手動で解消してコミット
６）また不具合があったのでさらに hotfix-2-kakkoii-kinou-no-syuusei をこちょこちょいじった
７）develop にマージした……また競合した！！　なんでや！


------

（天の声）内容の違う同じファイルを複数のブランチからねじこもうとしているからです

-----

８）feature-1-kakkoii-kinou-no-sinkaihatu に hotfix-2-kakkoii-kinou-no-syuusei をマージした！　競合しない！
９）develop に feature-1-kakkoii-kinou-no-sinkaihatu をマージした！　競合しない！

-----

これにて一件落着
java 2D画面描画

javaで2Dの画面描画を行いました。


<img width="399" alt="スクリーンショット 2015-11-27 11.58.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/85554/3a7ead72-254f-d99c-4258-3508cb7199e0.png">

コードの方はこちらになります。

```lang:Graphics2DTest1.java
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Color;

public class Graphics2DTest1 extends JPanel{
	int r = 100;//半径
    int cx, cy;//円表示に使用する座標

  public static void main(String[] args){
    JFrame frame = new JFrame();

    Graphics2DTest1 app = new Graphics2DTest1();
    frame.getContentPane().add(app);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 400, 400);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  public void paintComponent(Graphics g){
    g.setColor(Color.blue);
    g.drawLine(200,0 , 200, 400);
    g.drawLine(0,200 , 400, 200);
    //g.drawOval(10, 10, 100, 50);
    //g.drawOval(100, 100, 100, 100);
    point(g,1);
    circle(g);
    oval(g);
  }
  
  public void point(Graphics g,int x){//直線
	  for(int i = 0 ; i <= 400 ; i ++){
		  int y =x;
	  g.setColor(Color.red);//線の色変更
	  g.drawLine(x * (i * x), 400- y * i,
　　　　　　　　　　　x * (i * x) , 400- y * i);
	　}
  }
  
  public void circle(Graphics g){//円
      for(int i = 0; i < 720; i++){
          cy = (int) (200 + Math.sin(i) * r);
          cx = (int) (200 + Math.cos(i) * r);
          g.drawLine(cx, cy, cx, cy);
      }
  }

  public void oval(Graphics g){//楕円
      for(int i = 0; i < 720; i++){
          cy = (int) (200 + Math.sin(i) * r / 2);
          cx = (int) (200 + Math.cos(i) * r);
          g.drawLine(cx, cy, cx, cy);
      }
  }

}

```

開発環境は　Mac version 10.10.5

実行方法
Eclipseでインポートして実行してください。
Java2D 画面描画

Java2Dでの画面描画を行いました。

y=xの直線
r=100の円
r=100の楕円

![スクリーンショット 2015-11-27 11.41.54.png](https://qiita-image-store.s3.amazonaws.com/0/85550/47156d00-fb90-24ef-8720-58636026339b.png)

コード

```rudy:Test.java
import javax.swing.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.Line2D;
import java.awt.Color;

class Test extends JPanel{

  public static void main(String[] args){
            JFrame frame = new JFrame();

            Test app = new Test();
            frame.getContentPane().add(app);

            frame.setBackground(Color.white);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBounds(0, 0, 400, 400);
            frame.setTitle("2D描画");
            frame.setVisible(true);
            Insets insets = frame.getInsets();  // 設定すべき値を求めるためのインスタンス化
            frame.setSize(400 + insets.left + insets.right,
                          400 + insets.top + insets.bottom); // 画面サイズ設定
          }

          public void paintComponent(Graphics g){
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.black);

            g.drawLine(200,  0,200,400);
            g.drawLine(  0,200,400,200);

            drawPoint(g2);
            drawCircle(g2);
            drawEllipse(g2);
          }

          public void drawPoint(Graphics2D g2){
              int x=400, y=0; 
              for(int i=0; i<400; i++){
                  g2.fillRect(x, y, 1, 1);
                  x -= 1;
                  y += 1;
              }
          }

          public void drawCircle(Graphics2D g2){
              double x, y, cx=200, cy=200, r=100;
              for(int i = 0; i < 720; i++){
                  x = r*Math.sin(i)+cx;
                  y = r*Math.cos(i)+cy;
                  g2.draw(new Line2D.Double(x, y, x+0.1, y+0.1));
              }
          }

          public void drawEllipse(Graphics2D g2){
              double x, y, cx=200, cy=200, r=100;
              for(int i=0; i<720; i++){
                  x = r*Math.sin(i)+cx;
                  y = (r*Math.cos(i))/2+cy;
                  g2.draw(new Line2D.Double(x, y, x, y));
              }
          }
}
```
開発環境
Mac version 10.10.1

実行方法
Eclipseでインポートさせて実行してください。
Calling ruby script in Rails


Railsからrubyスクリプトを呼び出したら

```
./hoge.rb:3:in `require': cannot load such file -- fuga (LoadError)
```

というエラーとなった。
このスクリプトでは(Railsアプリにはない)fugaというgemを利用している。もちろんインストールはしてある状態。
どうやらRailsでは以下の環境変数が設定してある。

- GEM_PATH
- GEM_HOME
- BUNDLE_BIN_PATH
- BUNDLE_GEMFILE

このうち、BUNDLE_GEMFILEが存在すると、RailsのGemfileにあるモジュールしか使えなくなるようだ。
以下のようにunsetするシェルスクリプトを通したら実行できた。

```ruby:in_rails_code
  result = system "~/bin/hoge.sh '#{args}'"

```

```bash:hoge.sh
#!/bin/sh
unset BUNDLE_GEMFILE
cd `dirname $0`
./hoge.rb $*
```
JAVA StringBuilder省略形

#String Builderの宣言と確保/値代入の省略形

(省略前)

```java
System.out.println(new StringBuilder().append(moji.get(0))
				.append(moji.get(1)).toString());
```

(実行結果)AB
↓
(省略語)

```java
StringBuilder sb = new StringBuilder();
		sb.append(moji.get(0));
		sb.append(moji.get(1));
		String sb2 = sb.toString();
		System.out.println("省略していない→" + sb2);
```

(実行結果) 省略していない→AB

■例

```java
import java.util.ArrayList;

public class Omission {
	public static void main(String[] args) {
		// AutoBoxingによりラッパークラスCharacterがプリミティブ型charに自動変換される
		ArrayList<Character> moji = new ArrayList<Character>();
		moji.add('A');
		moji.add('B');
		moji.add('C');

		System.out.println(moji.get(0) + moji.get(1));

		System.out.println("メソッドは、オブジェクトを文字列として返します");
		System.out.println(new StringBuilder().append(moji.get(0))
				.append(moji.get(1)).toString());

		StringBuilder sb = new StringBuilder();
		sb.append(moji.get(0));
		sb.append(moji.get(1));
		String sb2 = sb.toString();
		System.out.println("省略していない→" + sb2);

		System.out.println(moji.get(0) + "と" + moji.get(1));

	}

}
```

■例 実行結果
131
メソッドは、オブジェクトを文字列として返します
AB
省略していない→AB
AとB
flunetdでさいきん遭遇したエラーの記録

自分用備忘録です。

###・S3upするときIAMロールにバケットの権限がたらなかった

こんなエラーでた

```/var/log/td-agent/td-agent.log
2015-11-17 07:12:20 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2015-11-17 08:11:51 +0000 error_class="AWS::S3::Errors::Forbidden" error="AWS::S3::Errors::Forbidden" plugin_id="object:3f8cee0b5d8c"
```

現象としては、届いてはいるんだけどバッファに結構送られてない過去のファイルが存在してて、日付と同じディレクトリに過去の日付のログが届いてしまうという。

原因はIAMロールにGetObject(たぶん)の権限がついてなかったための模様。
（ソースを読んだ方からきいたら、置く前にファイルの存在を確認してるときにその権限がいる模様）
ちょっとその権限つける権限を持ってないアカウントだったのでわかんなかったりしました。
あと、過去ファイルが当日のディレクトリにきちゃうのは`_%{index}`が不足してて置けなかったせいだった模様。
権限つけてもらって`s3_object_key_format`に`_%{index}` 追加したところ回復しました。

###・受信側にマッチするconfがかかれてなかった

まあこれはrole追加されて送信するクライアント側しか設定されてないまま起動しちゃうと受信するlogサーバ側で出るパターンが多いやつです。

```/var/log/td-agent/td-agent.log
2015-11-26 03:35:03 +0000 [warn]: no patterns matched tag="xxx"
```

解決するには合ったconfをサーバ側で準備するだけ。chefなのでattribute追加して撒くだけ。
（でも他のエラーを直さないとだめだったりした）
ただしchefと分離して他のツールつかってconf管理したらいいんじゃない説もあります。

###・td-agent1だとmatchタグ内にincludeつかえなかった（td-agent2だと可能だった）

```/var/log/td-agent/td-agent.log
2015-11-25 01:38:48 +0000 [warn]: parameter 'include' in <match xxx.http.error.**>
  type copy
  include /etc/td-agent/extra/td-agent-el-tag4
  <store>
    type forest
    subtype file_alternative
    <template>
      path /opt/data/logs/${tag_parts[3]}/xxx-http-error
      buffer_path /opt/fluent_buf/__TAG__
      flush_interval 1s
      buffer_queue_limit 512
      buffer_chunk_limit 10m
      buffer_type file
    </template>
  </store>
</match> is not used.
```

こんなwarnで送り先を何度も書くのが嫌でincludeしたかったけどtd-agent1だとだめぽかったので、
手で冗長の同じconf置いてるところから戻してからchef的にtemplateのelsifを増やして対応するなどしました。

以上。

最近調べてみかけたURLを無差別にぺたっと。
http://dev.classmethod.jp/cloud/aws/aws-cfn-advent-calendar-2013-fluentd/
https://github.com/fluent/fluent-plugin-s3/issues/92
https://gist.github.com/sonots/c54882f73e3e747f4b20
http://f-retu.hatenablog.com/entry/2014/05/14/014546
http://og732.hatenadiary.com/entry/2014/05/06/212817
https://github.com/fluent/fluent-plugin-s3
tcpdf 上部に罫線が出てしまう

TCPDFで出力した帳票になぜか罫線が入ってしまい、ハマっていました。

`$pdf->setPrintHeader(false);`

これだけでした。
デフォルトではヘッダが出力対象となっており
そこに罫線が設定されていたようです。
フッタはtrueでも何も出ないようです。
WinMergeの初期設定

# TL;DR

[WinMerge](http://winmerge.org/?lang=ja)で文字単位の差分を見やすくする設定です。

- タブや半角スペース数の違いは無視したい
- 空行も無視したい
- 差分がある場合、行単位ではなく、差分の単語だけを強調表示したい

# WinMergeとは

[WinMerge](http://winmerge.org/?lang=ja)

> WinMerge は、 オープンソースのWindows 用比較・マージツールです。WinMerge は、フォルダとファイル両方が比較でき、理解しやすく扱いやすいテキスト形式で差異をビジュアルに表現します。

# 設定

`WinMerge Version 2.16.2.0`での設定です。
ほかのバージョンでは表記が違ったり、なかったりする場合があります。

**`編集 > 設定`**

オプションウィンドウ

- `比較 > 一般`
    - 空白 > 「`全て無視する`」を選択
    - 「`空行を無視する(K)`」にチェック
    - 「`改行文字の違いを無視する(R)(Windows/Unix/Mac)`」にチェック

- `エディタ`
    - `行内差異の色付け`
        - 「`行内差異を表示する`」チェックボックスにチェック
        - ラジオボタン「`文字単位`」を選択
        - リストボックスから「`空白か句読点で区切る`」を選択
- `色 ＞ 差異`
    - `背景`を目立つ色に変更
        - 「`単語の差異`」 ※`差異`と差のある色にすると目立ちます
        - 「`選択された単語の差異`」　※`選択された差異`と差のある色にすると目立ちます

- `バックアップファイル`
    - 「`バックアップファイル作成`」全てチェックを外す ※バックアップファイルを自動で作りたくない人だけ
        - `フォルダー比較`
        - `ファイル比較`

## 空白やタブだけの行を無視する

設定の「空行を無視する(K)」だけでは、半角スペースやタブだけの行が差分として出てきてしまう。
それも無視する方法（全角スペースは無視しない）

`ツール(T) > フィルタ(F)`

「行フィルタ」タブ
> 「行フィルタを有効にする」にチェック
> 「新規」ボタンを押して次の正規表現を入力し、左のチェックを入れる

```
^\s*$
```

↓こんな感じ
![winmerge-ss.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/5883405b-b181-2c4e-2452-e8c0a50db493.png)
Qiita > 要望 > キーワード検索を「部分一致検索」にしてほしい

現状のQiitaの検索では、Settingというキーワードで検索をすると

- Setting を含む記事 : 検索される (1870件)
- Settings を含む記事 : 検索されない

Settingsというキーワードで検索すると

- Settingsを含む記事 : 3120件


どうもキーワード検索では「部分一致検索」でなく「完全一致検索」になっているような感じがする。

上記の問題点は

- extractCsvRow() のような関数の記事を探す時、キーワードに「extractCsvRow」まで入れないと検索できない。希望としてはextractでも検索したい。
- Setting / Settings の例のように、キーワードの入力により検索結果が分断される

以下のように変更を希望する。

- キーワード検索 : 部分一致検索にする
- タグキーワード検索 : 完全一致検索のまま

tag:testingのようなタグキーワード検索も部分一致検索にするのがいいかは検討が必要。

ただし、「完全一致検索がいい」という人もいるかもしれない。オプションで切替できればそれが望ましい。


## 対策

自分で記事の中に検索用キーワードを追加する。

OutOfBound で検索しても見つからなかったので、以下のリンクのようにした。
http://qiita.com/7of9/items/db7f3befcabf49236e80
Django マネジメントコマンドの重複起動防止デコレータ

```python:decorators.py

def find_process_ids(pattern):
    """
    pattern にマッチするプロセスIDを探して返す (自分以外)
    :rtype: list
    """
    self_pid = os.getpid()
    try:
        out = subprocess.check_output(['pgrep', '-f', pattern])
        return list(filter(
            lambda x: x != self_pid, map(int, out.splitlines())))
    except subprocess.CalledProcessError:
        return []


def runs_once(batch_name):
    """
    マネジメントコマンドの重複起動防止
    @runs_once(__file__)
    def handle(...):
        ...
    """
    re_batch_name = re.compile(r'^/.*/(\w+)\.py$')
    m = re_batch_name.match(batch_name)
    if m:
        batch_name = m.group(1)

    def _inner(func):
        @wraps(func)
        def decorate(*args, **kwargs):
            process_ids = find_process_ids(batch_name)
            if process_ids:
                print('process already exists. {}, {}'.format(
                    batch_name, process_ids)
                )
                return
            else:
                return func(*args, **kwargs)

        return decorate

    return _inner
```
PHPで処理時間を計測

# ベンチマーク(Benchmark_Timer)
ベンチマークというよりも自分の場合は処理時間の計測によく使います。
計測の時にはこのコードを使うのだけど調査が終わるとコードから消してしまうことが多いので計りたいときに毎回どうやって書くかライブラリの中を調べているのでここにφ(．． )メモメモ

## インストール
### debian

```text
# apt-get -y install php5 php-pear
```

### centos
```text
# yum  -y install php5 php-pear
```

### pear

```text
# pear install Benchmark
```


### サンプルコード
APIなどのサーバーでは画面にでると良くないのでログに出力する場合。

```php
require_once("Benchmark/Timer.php");
$timer = new \Benchmark_Timer(TRUE);

  :
(処理)
  :

$timer->stop();
error_log($timer->getOutput(true,'plain'));
```

通常のウェブサイトであれば結果として出力

```php
<?php
require_once("Benchmark/Timer.php");
$timer = new \Benchmark_Timer();
$timer->start();
$timer->setMarker("step1"); 
$timer->setMarker("step2");
$timer->setMarker("step3");
$timer->stop();
$timer->display();
```

実行するとこんな感じ
![img01.png](https://qiita-image-store.s3.amazonaws.com/0/12727/615808c2-884d-2237-5b90-74e3a3b7cc4b.png)


# 参考サイト
[Benchmark_Timer](https://pear.php.net/manual/ja/package.benchmarking.benchmark.timer.php)
window.openでモーダルぽくする

# Chromeではwindow.showModalDialogは使用できません。

「WEBサイトでポップアップが開かれて、開かれた画面（子画面）で何か選択すると、
元の画面（親画面）に選択された内容が反映される。」
ていうやつWEBサイトを開発してたらよくありますよね？

そんな時のやりたいこと、、、、、、
- 子画面が開いている時は親画面をいじられたくない。
- 親画面のElementを操作したい。
- 子画面を閉じると、親画面にフォーカスを当てたい。

window.showModalDialogを使って子画面を開き、
子画面で親画面のElementを取得し、
子画面を閉じると親画面にフォーカスが当たってくれます。

**親画面の処理**

```
// windowをモードダルで開く
// 第一引数Url、第二引数子画面をに渡す値
window.showModalDialog('sub.html',this,'width=400, height=300');
```
**子画面でボタンを押した時などの処理**

```
// 親画面から渡ってきた値を取得
// 今回は親画面のElementを操作する為windowを渡した
var parentWindowObject = window.dialogArguments;

// 親画面のelement1を取得
var element1 = parentWindowObject.document.getElementById('hoge1');
// element1に値を設定
element1.value = '値１';
// 親画面のelement2を取得
var element2 = parentWindowObject.document.getElementById('hoge2');
// element1に値を設定
element2.value = '値２';
// 子画面の終了
window.close();
```
簡単ですね・・・・

でも
**ChromeではshowModalDialogが使えません。**
クリックイベントなどでshowModalDialogを記載して、ボタンを押しても
Chromeだとウンともスンとも言ってくれませんでしたorz

なので、僕は以下の方法で、やりたいことを実現しました。

##showModalDialogが使えない時
**親画面の処理**

```
// 適当に高さを指定してwindow.openでポップアップ画面を開く
var openWindow = window.open('sub.html','sub','width=400, height=300');
// 親画面にシェードをかける処理を実施
 ~ 処理の内容は省略 ~

// １秒間隔で子画面の状態を監視
var interval = setInterval(function()
{
    // 子画面が閉じていたら
    if(!openWindow || openWindow.closed)
    {
        // 親画面のシェードを外す処理
        ~ 処理の内容は省略 ~

        // Intervalを破棄
        clearInterval(interval);
    // 画面が起動していたら
    }
    else
    {
        // 子画面にフォーカスを当てる
        if(!openWindow.document.hasFocus())
        {
            openWindow.focus();
        }
    }
},1000);
```

**子画面の処理①　~ボタン押下等の処理~**

```
// 親画面の存在確認
// 存在しなかったら次画面（子画面）を閉じる
if(!window.opener || window.opener.closed)
{
    window.close();
}
else
{
    // 親画面を取得
    var parentWindowObject = window.opener;
    // 親画面のelement1を取得
    var element1 = parentWindowObject.document.getElementById('hoge1');
    // element1に値を設定
    element1.value = '値１';
    // 親画面のelement2を取得
    var element2 = parentWindowObject.document.getElementById('hoge2');
    // element1に値を設定
    element2.value = '値２';
    // 子画面の終了
    window.close();
}
```

**子画面の処理②　~子画面自身の状態確認~**

```
    $(document).ready(function()
    {
        $(window).on("beforeunload",function(e)
        {
             window.opener.focus();
        });
    });
```

です。

##まとめ
window.showModalDialogで渡した親画面のObjectについては
window.openの場合はwindow.openerで取得することができます。

window.openの戻り値は子画面のObjectになります。

またjQueryの処理になりますが、
子画面起動後、setIntervalを行うことにより、
Timer処理で子画面の状態を監視できます。
**while等を使ってループさせてしまうと、画面が固まるので**
**setIntervalでTimer処理を行います。**

子画面が閉じられたと判断したら
clearIntervalでTimer処理を破棄します。

子画面が開いているときは、
openWindow.document.hasFocus
で子画面にフォーカスが当たっているか判断して、
当たっていなかったらopenWindow.focusでフォーカスを当てます。

**openWindow.document.hasFocusの判定を行わずに**
**フォーカスを当て続けると、テキストボックス等に値を入力しているときに**
**Window全体にフォーカスが当たってしまうので、入力が途中でキャンセルされちゃいます**

最後に子画面の監視処理です。
今回はjQueryを使ってwindowのbeforeunloadイベントをバインドしました。
これにより×ボタンでWindowを閉じてもイベントをひろうことができます。

完全なモーダルの場合は子画面を閉じると親画面にフォーカスがあたるのですが、
window.openで起動するとモードレスになるので、
親画面を最小化したりして親画面のIEを見失った時には便利です。

以上
Linuxのパスワード変更の仕組み

Linuxユーザは下記のコマンドを使用して自分のログインパスワードを変更することができます。

```
/usr/bin/passwd
```

全ユーザのパスワード情報は下記のファイルに保存されています。これをシャドウファイルといい
ます。

```
/etc/shadow
```

しかしここで不思議なのはシャドウファイルはroot権限でしか編集できないのです。

```
ls -l /etc/shadow
-rw-r----- 1 root shadow 0000 Jan 01 00:00 /etc/shadow
```

passwdプロセスはユーザによって実行されるのでroot権限はもっていません。
よってpasswdプロセスは直接シャドウファイルを編集できないはずです。別プロセスがシャドウファイルを代行で編集しているのかとも思いましたが違うようです。

実はLinuxのパーミッションにはsetuidアクセス権というものがあり、これが設定されているコマンドはそのプロセスを実行ユーザとは別のアクセス権で実行することができます。
`ls -l`コマンドでpasswdのファイルを見るとsetuidが設定されてることが確認できます。
(ユーザの実行権限がsになってることがsetuidが設定されている印です。）

```
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 00000 Jan 01  0000 /usr/bin/passwd
```

この仕組みによって一般ユーザがpasswdを実行した後、passwdプロセスがroot権限で実行され、シャドウファイルを編集することでパスワードを変更しているようです。
iOS のツイッタークライアント feather の CI の歴史

この記事は [モバイルCIダベリNight](http://ci-daberi.connpass.com/event/21942/) の資料です。

# iOS 版 feather の CI の歴史

[iOS 版 feather](http://covelline.com/feather/) の CI が
どのような歴史を辿ってきたのかを紹介します。

## 2013年9月〜 (feather 開発開始)

- ちょい古めの MacBook Pro で Jenkins 動かしてた
- Jenkins のプラグインを使って CI してた
- レビュー用に TestFlight を使ってアルファ版を開発者に配布
 
### 良かったことや辛かったこと

- Jenkins にはプラグインが沢山用意されてて環境構築が楽
- 開発当初からプルリク -> CI -> レビュー の体制が作れて最高
- Jenkins を動かしてるマシンが機嫌を損ねると何もできなくなる
- Jenkins のプラグインに頼りまくってるので Travis とかに移行することができない
- テスト件数増えると CI に20分とかかかって辛い
  - テスト件数増える = コードの量も増えるのでコンパイルの時間も増える
  - よく覚えてないけどテスト件数 1000件ぐらいになると辛かった

## 2015年2月〜

この時に過去の負債を一気に消し去った。

### アルファ版配布

旧 TestFlight が 2/26 でサービス終了なので代替として fabric を採用した。
Crashlytics を使っていたのでその流れで fabric を採用。

### ベータテスター導入

feather の機能が多くなりすぎて自分たちではチェックしきれなくなったので
アルファ版と同様に fabric でベータ版も配布するようにした

### Jenkins のプラグインを使わないようにした

make で CI プロセスを書いて Jenkins のサーバが壊れてても同じことがローカルできるようにした。
Jenkins では make のコマンドを叩くだけ。

### iTunesConnect で毎晩 validate

変な API 使っちゃって申請できないことが後になって発覚すると辛いので
ナイトリービルドした IPAを iTunesConnect で validate することで
おかしなことになっていないのかを毎晩確認して安心感上げた。

### CI マシンの新調

お金なくてずっと買えなかったけど、この辺りで少し余裕ができたので Mac mini を買いました。
20分以上かかってた CI プロセスが 10分以内で終わるようになりました。

### 良かったことや辛かったこと

- CI サーバ落ちててもローカルで `make hogehoge` 的なことすれば CI プロセスをローカルで実行できるので最高
- ベータテスター導入してリリース時の安心感が増した
- Makefile と シェルスクリプトで頑張るのは辛い
  - 秘伝のタレみたいになるので誰も弄れないものになる

## 2015年6月〜

### make やめて rake にした

- Makefile 書くの大変だったので rake を使うことにした
- 楽ちん

### 良かったことや辛かったこと

- Rakefile 書きやすい
  - 中に ruby かけるのでいろいろ楽
  - make って難しくないですか？

## 2015年7月〜

### TestFlight の External Tester を使うようになった

- もっとたくさんの人でテストをする必要があると感じた
- iTunesConnect に submit する仕組みはあったので導入楽

## 2015年10月〜

### [fastlane](https://fastlane.tools/) 使い始めた

xcodebuild のオプションの指定の仕方とか変わって若干の面倒臭があった。

具体的には

> xcodebuild: WARNING: -exportArchive without -exportOptionsPlist is deprecated

という警告が出るようになった。

fastlane はその辺の仕様変更を内部で吸収してくれるので最高だと思った。

### 良かったことや辛かったこと

- 新しい物に触れることができて楽しかった
- [こんな](http://qiita.com/mironal/items/5f9648ba2265a45100a4)問題が発生して辛かった
- fastlane は起動が遅いから rake と組み合わせるといいかも
  - 起動が遅いのは before_all とかで色々やってる場合
  - 何でもかんでも fastlane でやらない姿勢が大事

# 補足

## 現状(2015年11月)の feather の CI

### 動作環境

- 社内に置いてある mac mini の Jenkins で動いている
- 何もしてないので社外のネットワークからはアクセスできない

![IMG_7121.jpg](https://qiita-image-store.s3.amazonaws.com/0/17704/c41b9618-1b51-c24d-bb8d-c98732574883.jpeg)




### 回している CI の種類

iOS 版 feather では以下の2種類の CI プロセスが動いている。

- テストの CI プロセス
 - プルリクエスト & プルリクエストへの新規 push のたびに動く
 - テストを実行
 - アルファを fabric で配布
- ナイトリービルドの CI プロセス
  - テストを実行
  - ベータ版を fabric に配信
  - 新しいバイナリを iTunesConnect に submit

### テスターの種類

iOS 版 feather では以下の3種類の IPA を作っている。

- アルファ版
  - 社内テスター向けに fabric で配信
  - 主にプルリクエストのレビュー用
- ベータ版
  - 社外テスター向けに fabric で配信
  - 1週間に１、２回程度配布。
  - テスターは 10人ぐらいいる
- TestFlight 版 
  - 社外テスター向けに iTunesConnect の TestFlight で配信
  - リリース前に **申請に使用したものと同じIPA** を配布して申請が通るまで使ってもらう
  - テスターは 200人程度