OmniAICreator/Qiita-1.07M huggingface dataset:
数値を(基準値の倍数で|有効桁数で)丸めるgem

を[作りました](https://github.com/diaphragm/ruby-pretty-round)。
rubyならこのくらい組み込まれてても良さそうですが、無いのが意外です。


# インストール
`$ gem install pretty_round`

# 使い方
```rb
require "pretty_round"

x = 123.456

# 指定した精度で丸める
x.roundup #=> 124
x.rounddown(2) #=> 123.45

# 基準値の倍数で丸める
# いわゆるExcelのMROUND()関数です。
x.mceil(50) #=> 150
x.mfloor(25) #=> 100
x.mroundup(2) #=> 124
x.mrounddown(0.3) #=> 123.3
x.mround(9.87) #=> 128.31

# 有効桁数で丸める
# IT界隈ではあまり見かけない丸め方ですが個人的によく使うのでgemに含めました。
x.sceil(1) #=> 200
x.sfloor(2) #=> 120
x.sroundup(3) #=> 124
x.srounddown(4) #=> 123.4
x.sround(5) #=> 123.46
```

# 丸め方向
- `#*ceil`, `#*floor`となっているものは、**値**が大きい方、小さい方に丸めます。ruby組み込みの`#ceil`、`#floor`と同じ挙動です。
- `#*roundup`, `#*rounddown`となっているものは、**絶対値**が大きい方、小さい方に丸めます。
- `#*round`となっているものは**絶対値**を四捨五入します。なお偶数丸めではありません。ruby組み込みの`#round`と同じ挙動です。
- `#*truncate`は`#*rounddown`と同じです。

一覧にすると以下のようになります。対比のため、ruby組み込みのメソッドも含めました。
縦がメソッド、横がレシーバです。

```
              |  1.9  1.1 -1.1 -1.9
-----------------------------------
.ceil         |    2    2   -1   -1 (ruby組み込み)
.floor        |    1    1   -2   -2 (ruby組み込み)
.roundup      |    2    2   -2   -2
.rounddown    |    1    1   -1   -1
.round        |    2    1   -1   -2 (ruby組み込み)
.truncate     |    1    1   -1   -1 (ruby組み込み)
.mceil(1)     |    2    2   -1   -1
.mfloor(1)    |    1    1   -2   -2
.mroundup(1)  |    2    2   -2   -2
.mrounddown(1)|    1    1   -1   -1
.mround(1)    |    2    1   -1   -2
.mtruncate(1) |    1    1   -1   -1
.sceil(1)     |    2    2   -1   -1
.sfloor(1)    |    1    1   -2   -2
.sroundup(1)  |    2    2   -2   -2
.srounddown(1)|    1    1   -1   -1
.sround(1)    |    2    1   -1   -2
.struncate(1) |    1    1   -1   -1
```


# 既知のバグ
ruby 2.2.3で確認しています。
何か解決策があったらご教示ください…。

## Floatの精度
```rb
1.2.mrounddown(0.1) #=> 1.1
```
ﾌｧｯ!
もちろん1.2になるのが正解です。

なぜこうなるのかといえば、

```rb
1.2.divmod(0.1) #=> [11, 0.0999999999999999]
```
になるからです。回避策としては`Rational`使いましょう。`Float`は信用ならない。

```rb
1.2r.mrounddown(0.1r) #=> (6/5)
```

## 勝手にRationalになる
```rb
0.123.sround(2).class #=> Rational
```
別に問題無いといえば問題無いのですが。

なぜこうなるのかといえば

```rb
(10**(-1)).class #=> Rational
```
の様に`Fixnum`同士の演算が`Rational`になる事があるからです。前からこんな仕様でしたっけ？


# おわりに
個人的に有効桁数で丸めるメソッドを必要としていたのですが、これがある言語はR(`signif()`)ぐらいしか無かったので自作しました。需要ないんですかね。

動かないとか仕様が気に食わないとか機能追加しろとか命名が気に入らないとかあったらコメントください。
windowsに置いたjenkinsからファイルをscpしたい

## 前提

windowsで起動したjenkinsの「windowsバッチコマンドの実行」にファイル転送バッチを書きたい
ファイル転送にはwinscpを使う
winscpはC:\Program Files (x86)\WinSCP\WinSCP.comにある
秘密鍵はD:\key_rsa.pri.ppkにある

### jenkins側のパラメータの設定
USER...転送先ユーザ名
TARGET_HOST...転送先のサーバ
TARGET_HOSTKEY...ホストキー（後述）
TARGET_FILE...転送したいファイル名
TARGET_WORKDIR...転送したいファイルがおいてあるローカルディレクトリ
TARGET_DIR...配置したい転送先のディレクトリ
TMP_FILE...転送コマンド群の一時ファイル、最後消される

## 実装

```
@echo off
echo option batch on > %TMP_FILE%
echo open %USER%@%TARGET_HOST% -hostkey="%TARGET_HOSTKEY%" >> %TMP_FILE%
echo cd %TARGET_DIR% >> %TMP_FILE%
echo rm %TARGET_FILE% >> %TMP_FILE%
echo put %TARGET_WORKDIR%%TARGET_FILE% >> %TMP_FILE%
echo exit >> %TMP_FILE%
@echo on

:: type %TMP_FILE%

"C:\Program Files (x86)\WinSCP\WinSCP.com" /privatekey="D:\key_rsa.pri.ppk"  /script="%TMP_FILE%"

del %TMP_FILE%
```

説明

```
@echo off
色々
@echo on
```

echo offで結果表示しない
色々の部分でwinscpに対するコマンド群ファイルを作成。
サーバー接続
転送先ディレクトリに移動
古い転送したいファイルを消す（この時ファイルが無くてもOK）
ファイル置く
終わり
echo onで結果表示する

ファイルを置く、で強制的に上書きするには

```
option confirm off
```
でいけるかも。（確認OFFしてるけど…）


```
:: type %TMP_FILE%
```
デバッグ用。::でコメントアウトされている。コメントアウトを外すとTMP_FILEの中身を表示

そしてwinscpにコマンド発行
最後にTMP_FILE消す

### ホストキーについて

必要。
適当な値で一度動かしてみると教えてくれる。

```
D:\jenkins\jobs\test\workspace>"C:\Program Files (x86)\WinSCP\WinSCP.com" /privatekey="D:\key_rsa.pri.ppk"  /script="tmp.txt" 
batch           on        
Searching for host...
Connecting to host...
Authenticating...
The server's host key was not found in the cache. You have no guarantee that the server is the computer you think it is.
The server's rsa2 key fingerprint is:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ←この部分
If you trust this host, press Yes. To connect without adding host key to the cache, press No. To abandon the connection press Cancel.
Continue connecting and add host key to the cache?
```

### 応用編

ついでにtomcatの再起動などサーバー側でコマンドを発行したい場合は

```
echo call 実行したいコマンド >> %TMP_FILE%
```

をコマンド群に追加する
Go: 努力せずにBigQuery Streaming使いたい

## 注意
BigQuery Streamingは時々データが消えるような現象があるようです。
このライブラリーのせいかと思ったから、[新しいやつ](https://github.com/guregu/bq)を作ってみたけど、それでもダメでした。
AWS Lambdaなどで、普通のStreamingじゃないインサートを推薦します。


## 本文

スキーマの定義とかは面倒ですよね。
CLIとか使わなくても動いてほしいよね。
Goはせっかく型システムがあるんだから、そっちに任せよう。

`rounds/go-bqstreamer`を[フォーク](https://github.com/guregu/go-bqstreamer)して、テーブルの自動生成、スキーマの自動変更（現在、フィルドの追加のみ）をするようにハックしました。

そして`reflect`をバリバリ使って、エンコードしてくれる[ヘルパーライブラリ](https://github.com/guregu/bq)ーを作りました。

### 使い方

`BQTabler`というinterfaceを作ります。これでテーブル名が決まります。

```go
type BQTabler interface {
	BQTable() string
}
```

ログをstructとして定義します。

```go
type HogeLog struct {
	UserID     int             `bq:"user_uuid"`
	Time       time.Time       `bq:"time"`
	HogeID     int             `bq:"hoge_id"`
	UserAgent  string          `bq:"user_agent"`
}

func (HogeLog) BQTable() string {
	return "hoge" + time.Now().UTC().Format("20060102") // 日別
}
```

BigQueryに接続します。

```go

type bigquery struct {
	projectID string
	datasetID string

	*bqstreamer.Streamer
}

func newBigquery(ctx context.Context, projectID, datasetID string) bigquery {
	key := ...
	srv, err := bqstreamer.NewBigQueryService(key)
	if err != nil {
		panic(err)
	}
	client, err := bqstreamer.NewStreamer(srv, 500, time.Second, time.Second, 10)
	if err != nil {
		panic(err)
	}

	b := bigquery{
		projectID: projectID,
		datasetID: datasetID,
		Streamer:  client,
	}
	b.CreateTables = true // 自動生成オン！

	go b.Start()
	go b.reportErrors(ctx) // clientのエラーチャンネルを見るgoroutine
	go func() {
		select {
		case <-ctx.Done():
			// contextがcancelされたらやめる
			b.Stop()
			return
		}
	}()

	return b
}
```




そしてログを流します。

```go
func (b bigquery) post(table string, msg interface{}) error {
	row, err := bq.Encode(msg) // guregu/bq
	if err != nil {
		return err
	}

	if t, ok := msg.(BQTabler); ok {
		table = t.BQTable()
	}

	// go-bqstreamerのQueueRowを呼ぶ
	b.QueueRow(b.projectID, b.datasetID, table, row)
	return nil
}
```

以上でBigQueryを気楽に使えます。

```go
 b.post("hoge", HogeLog{...}) // テーブル名はBQTablerによって上書きされる
```

### 注意

上記のライブラリーは開発中なので、今は使わない方がいいと思います。
将来的に`go-bqstreamer`をwrapしているようなライブラリーが作りたいですね。
CentOS 6.7にdocker-engine 1.7をインストールする


余ってたCentOS6.7のマシンにdocker1.7を入れてみた。公式によると、docker1.8以上はCentOS7以上しかサポートしないみたい。
> Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum, which CentOS 7 runs.

こっちにも詳しく書いてあった。

> [Docker v1.8 から RHEL/CentOS6 はサポート外になった - CUBE SUGAR CONTAINER](http://blog.amedama.jp/entry/2015/08/26/213828)


念のためCentOSのバージョン確認

	$ cat /etc/redhat-release
	CentOS release 6.7 (Final)

公式のインストール方法をちょこっとだけ修正して、yumリポジトリを`centos/6`にセット


	$ sudo yum update

	$ cat > docker.repo <<-EOF
	[dockerrepo]
	name=Docker Repository
	baseurl=https://yum.dockerproject.org/repo/main/centos/6
	enabled=1
	gpgcheck=1
	gpgkey=https://yum.dockerproject.org/gpg
	EOF

	$ sudo mv docker.repo /etc/yum.repos.d/


あとは普通に`yum install`するだけ

	$ sudo yum install -y docker-engine

	$ docker -v
	Docker version 1.7.1, build 786b29d

必要ならdaemon登録

	$ sudo chkconfig docker on

とりあえずdocker起動

	$ sudo service docker start

これで毎回`sudo`つければ`docker`コマンドが使えるけど、公式に書いてあるとおりdockerグループを作ってユーザーを追加する

	$ docker ps
	Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?

	# sudoつけると大丈夫
	$ sudo docker ps
	CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
	
	# dockerグループにユーザーを追加する
	$ sudo usermod -aG docker ユーザー名
	
	# ログアウトして再度ログイン

	# sudoいらなくなった
	$ docker ps
	CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ちゃんと動くか確認

	$ docker run --rm centos echo 'hello world'
	~~ 省略 ~~
	hello world
	

参考資料
-----
- [Installation on CentOS (公式)](https://docs.docker.com/installation/centos/)
Gitの設定ファイル

##Gitの設定
Gitの設定は``~/.gitconfig``に記述されています。
**設定を確認**
```git config --list --global```
**名前の登録**
```$ git config --global user.name "YOURNAME"```
**メールアドレスの登録**
```$ git config --global user.email "YOUREMAIL@sample.com"```

もちろんSourceTreeなどのGUIクライアントでも設定可能です。
XibでUINavigationControllerを使う方法

XibでUINavigationControllerを使う方法です。

基本的に、AppDelegateにいい感じで記述すればOKです

##AppDelegate.h

```objc
#import <UIKit/UIKit.h>
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic)  ViewController *ViewController;

@end
```
クラスにController名を設定し、クラスのインスタンスを作成します。

##AppDelegate.m

###import

```objc
#import "ViewController.h"
```
表示したいxibに紐づけられたcontrollerをimportする

###didFinishLaunchingWithOptions

```objc
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
#pragma mark -xib化
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    self.ViewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController: self.ViewController];
    
    navigationController.navigationBar.barTintColor = [UIColor colorWithRed:0.6392 green:0.709 blue:0.3529 alpha:1.0];
    
    navigationController.navigationBar.tintColor = [UIColor whiteColor];

    navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};
    
    self.window.rootViewController = navigationController;
    
    [self.window makeKeyAndVisible];
    
    return YES;
```

このようにAppDelegate.mのdidFinishLaunchingWithOptionsに記述します。

したら、navigationbarが全てのviewに現れます。
gitで差分ファイルの抽出とバックアップファイルの作成 .sh

#### `ftp`や`scp`を使用して本番デプロイする方向けの投稿です。

作業分のファイルを抽出する際に`git archive`を使用しますが、
合わせてバックアップのファイルも用意したい場合のスクリプトを作りました。
例えば`git archive`で抽出したファイルを本番環境にあてた際に予期せぬ不具合が発生した場合に、

- 元のファイルの状態に戻す
- 急いでbugfix を行う

以上のことを本番環境に対して行うと思います。
今回は「元のファイルの状態に戻す」について話を進めます。
元のファイルの状態に戻すとは、`git archive`で差分抽出前のファイルが用意できれば良いわけです。

### シェル化した

---

#### やっていること

- 差分ファイルの作成
- バックアップファイルの作成

https://github.com/takecore/git-archive-with-backup.sh

```sh
#!/bin/sh

# -------------------------------------------------------
# A shell script that generates a MIT LICENSE file
# Written by: takecore
# Last updated on: 2015/10/22
# -------------------------------------------------------

ORIGIN_BRANCH=`git rev-parse --abbrev-ref HEAD`
FROM_RIVISION=$1
TO_RIVISION=HEAD
if [ "$2" ]; then
	TO_RIVISION=$2
fi

# as you like change below
DIFF_LIST_PATH=$HOME/Desktop/diff_list_$FROM_RIVISION
RELEASE_ARCHIVE_PATH=$HOME/Desktop/release_$FROM_RIVISION.zip
BACKUP_ARCHIVE_PATH=$HOME/Desktop/backup_$FROM_RIVISION.zip

# archive start
git diff --name-only $TO_RIVISION $FROM_RIVISION > $DIFF_LIST_PATH
git archive --format=zip $TO_RIVISION `git diff --name-only $TO_RIVISION $FROM_RIVISION` -o $RELEASE_ARCHIVE_PATH
git checkout $FROM_RIVISION
zip $BACKUP_ARCHIVE_PATH -@ < $DIFF_LIST_PATH
rm $DIFF_LIST_PATH
git checkout $ORIGIN_BRANCH
```

# git-archive-with-backup.sh

リリース差分ファイルの抽出とバックアップファイルの作成を目的としたスクリプトです。

### 配置場所

- 任意のbin フォルダ等に配置し実行権限を与えて下さい

例えば以下のようなディレクトリ

```sh
$ chmod 755 /Uses/your_user_name/bin/git-archive-with-backup.sh
```

### 使い方

gitの作業ディレクトリ直下にて実行してください。使用例は以下になります。

```
# make revision_hash to HEAD diff archive
$ ~/bin/git-archive-with-backup.sh <from_revision_hash>
# or
$ ~/bin/git-archive-with-backup.sh <from_revision_hash> <to_revision_hash>
```

```
$ cd /Users/your_user_name/dev/git_repository
$ ~/bin/git-archive-with-backup.sh a88bfca3abbaffd69d16a3b71bb8eec210e27f67
```

### 差分ファイルとバックアップファイルの出力先

以下のディレクトリにそれぞれ.zipファイルが生成されます。出力場所は任意に書き換えてください。

```
~/Desktop/release_{from_revision_hash}.zip
~/Desktop/backup_{from_revision_hash}.zip
```

---

### 追記

上記の.sh を`SourceTree`と組み合わせるととても便利に使用できます。
そちらについては後日Qiitaに投稿したいと思います。

バグ等のご指摘も宜しくお願いします。

以上になります。

---

~~2015/10/26 コミットに削除ファイルがある場合にリスト化に失敗するため`--diff-filter=D` オプションを追加しました。~~

~~http://qiita.com/takecore@github/items/9e2067cfe62897205d5e/revisions/4~~
jQueryのAjaxでJavaScriptファイルを取得するときの罠

jQuery.ajaxを使って静的なJSファイルを取得しようとしたのですが、
取得するだけのつもりが勝手に実行されてしまいましたというお話。

しかも、こちらのコードのようにJSファイルが自らのJSファイルを読み込む機構にしてしまったため、意図せず無限ループを生み出してしまいました。
http://jsdo.it/butchi/GMl6

もっとわかりやすいコードで説明すると、main.jsがAjaxでtest.jsを取得したときに、
コールバックの``alert(res)``が実行される前に
test.jsに記述した``alert("hoge")``が実行されてしまいます。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Ajaxの罠</title>
</head>
<body>

<script src="jquery.js"></script>
<script src="main.js"></script>
</body>
</html>
```

```main.js
$.ajax({
  url: 'test.js',
  success: function(res) {
    alert(res); // => 'alert("hoge")'
  }
});
```

```test.js
alert('hoge');
```

## 種明かし

jQuery v2.1.4のコードをざっと見てみると、このような記述が見つかりました。

```jquery.js
// Install script dataType
jQuery.ajaxSetup({
	accepts: {
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
	},
	contents: {
		script: /(?:java|ecma)script/
	},
	converters: {
		"text script": function( text ) {
			jQuery.globalEval( text );
			return text;
		}
	}
});
```
（8651行あたりから抜粋）

たぶんレスポンスがスクリプトの形式だったときにdataTypeが'script'とみなされ、
evalしてしまう仕様のようです。

evalを避けるためには、dataTypeオプションを'text'とかに設定するとよいみたいでした。

```main.js
$.ajax({
  url: 'test.js',
  dataType: 'text',
  success: function(res) {
    alert(res);
  }
});
```

## もっと古いコード

ちなみにv1.2.2について記述している[こちらの記事](http://gihyo.jp/dev/feature/01/jquery/0012?page=4)では

jQuery.httpData()
というメソッドが

```js
httpData: function( r, type ) {
  var ct = r.getResponseHeader("content-type");
  var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;
  var data = xml ? r.responseXML : r.responseText;

  if ( xml && data.documentElement.tagName == "parsererror" )
    throw "parsererror";

  // If the type is "script", eval it in global context
  if ( type == "script" )
    jQuery.globalEval( data );

  // Get the JavaScript object, if JSON is used.
  if ( type == "json" )
    data = eval("(" + data + ")");

  return data;
},
```

となっており、JSONに対してevalを使っていたみたいなので、
もしかしたらJSONファイルに任意のスクリプトを書いて実行できる脆弱性があったのかもしれません。

## まとめ

jQueryはいろいろいい感じにやってくれる分、謎挙動も汲みながら扱っていく気概が必要ですね。
Gmail 経由での SMTP メール送信が出来ない時の解決法 (ユーザー名とパスワードは合っているのに。。)

# 問題

- Google側で2段階認証をオンにした。 
- アプリケーション用のパスワードを発行した。

だがしかし。

メールアドレスもパスワードも合っているはずなのに。
***Username and Password not accepted*** ( ユーザー名とパスワードが許可されていない ) と言われて失敗する。

Ruby on Rails の場合。

```rb
UserMailer.registration_confirmation.deliver_now
```

結果:

```
Net::SMTPAuthenticationError: 535-5.7.8 Username and Password not accepted. Learn more at
from /Users/yinaura/.rbenv/versions/2.2.3/lib/ruby/2.2.0/net/smtp.rb:976:in `check_auth_response'
```

# 解決

いつの間にか。
Gmail アドレス以外からは、SMTP 送信ができないようになっていた。( 2014年8月から )

=> [別のアドレスから送信する場合は、Gmail の SMTP サーバーを選択できなくなりました](https://productforums.google.com/forum/?hl=ja#!category-topic/gmail-ja/kK7cJQjc4_k)

結論。アカウント を Gmail のものに変えたら成功した。

```rb

-   :user_name => 'example@company.com', # gmail アドレスじゃないので使えない
+   :user_name => 'example@gmail.com', # gmail アドレスなので使える
```

以下は Ruby on Rails の場合の設定だ。

```rb:config/environment/development.rb
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => 'smtp.gmail.com',
    :port => 587,
    :domain => 'example.com',
    :user_name => 'example@gmail.com',
    :password => 'dlapwoeifkbmzksl', # Googleが発行する、12桁のアプリケーションパスワード
    :authentication => :login,
    :enable_starttls_auto => true
  }
```

### 参照

次の記事を参考にした。

- [Rails4 の ActionMailer でメール送信](http://easyramble.com/rails-action-mailer.html)
- [【メール送信エラー】Net::SMTPAuthenticationError - 534-5.7.14 <https://accounts.google.com/ContinueSignIn ...](http://qiita.com/mr-myself/items/d2911a6c77406c40eb9a)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
SFTPの操作をログに残すための設定

FTPだと/var/log/xferlogにログが残るけど、SFTPだと操作ログが残らないよね、といわれたので
SFTPのログを残すようにするためのメモ

参考にしたページ：http://aftercore.net/wordpress/2014/06/20/sftp%E3%81%AE%E6%93%8D%E4%BD%9C%E3%83%AD%E3%82%B0%E3%82%92syslog%E3%81%AB%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B/

# syslogに出力された内容をファイルへ出力するように設定する
`vi /etc/rsyslog.conf`

```# This rule to save the log output of sftp
local5.* /var/log/sftp
```

# 出力先のログファイルを作成する 
`touch /var/log/sftp`

# rsyslogdを再起動
`service rsyslog restart`
`systemctl restart rsyslog.service` #CentOS7


# sftpの操作ログをsyslogに出力するようにする
`vi /etc/ssh/sshd_config`
```Subsystem sftp /usr/libexec/openssh/sftp-server -f LOCAL5 -l VERBOSE```

( -f LOCAL5 -l VERBOSE を追加)

# sshdを再起動
`/usr/sbin/sshd -t`
`service sshd restart`
`systemctl restart sshd.service` #CentOS7

# ログファイルのローテート設定を行う
`vi /etc/logrotate.d/syslog`
/var/log/sftpを追加

ディレクトリを開いたときや閉じたときにもログが残るようなので、種類によってログを残すかどうかを決められないかな・・
画面遷移直後にNavigationBarがちらつくのを防ぐ

# Problem

UINavigationBarで画面遷移させると、画面遷移直後にNavigationBarがちらつく。

# Solution

原因はNavigationBarが半透明になっていることなので、半透明にしないようにします 。

## コードで設定する場合

```swift
override func viewDidLoad() {
  super.viewDidLoad()

  // ナビゲーションバーを半透明にしない(画面遷移直後にちらつくため)
  navigationController!.navigationBar.translucent = false
}
```

## Storyboardで設定する場合

1. Storyboardで、NavigationController配下にあるNavigation Barを選択します。
2. Attribute Inspectorを開き、Translucentのチェックを外します
Spot Instance のPersistant request

# 事象
一度入札価格がスポット価格を下回り、その後入札価格が再度上回ってもinstance がterminateされたままになっていた。

# 原因
調べてみると原因は簡単なことで、"Persistant request"の設定を忘れていたことでした。

この"Persistant request"は何かというと、入札価格をスポット価格が下回った後のSpot Instance のリクエストについての設定です。
もちろん入札価格をスポット価格が下回った場合は、instance はterminateされますが、この設定をしていないとデフォルトで"one-time"となり、Spot Instance のリクエストはされず、二度とinstance が起動してきません。
この設定をしておけば、再びスポット価格が下回ると、Spot Instanceのリクエスト行われ、instanceが起動します。

用途によっては不要な設定かもしれませんが、Spot Instance を使う際は少し気にかけてもいいかもしれません。
processingで2次元配列をソート

Processingで1次元配列をソートする関数は用意されているのですが、
2次元配列の2次元目のデータでソートしたかったのでちょっと調べてみました。

Comparatorインターフェースを実装したクラスを作って（その際、2次元目の
どのインデックスでソートするかを指定）、そのオブジェクトと元の配列を
Arrays.sort()に渡せばソートされました。

~~~java

import java.util.*;

int[][] num = new int[10][2];

void setup () {

	size (400, 400);

	num[0][0] = 5;
	num[1][0] = 8;
	num[2][0] = 1;
	num[3][0] = 3;
	num[4][0] = 9;
	num[5][0] = 7;
	num[6][0] = 6;
	num[7][0] = 2;
	num[8][0] = 4;
	num[9][0] = 10;

	num[0][1] = 10;
	num[1][1] = 4;
	num[2][1] = 6;
	num[3][1] = 8;
	num[4][1] = 5;
	num[5][1] = 2;
	num[6][1] = 7;
	num[7][1] = 3;
	num[8][1] = 1;
	num[9][1] = 9;


	for (int i = 0; i < num.length; i++) {
		println (num[i][0], num[i][1]);
	}

	//Comparatorインターフェイスを実装したクラスを作成
	Comp comp = new Comp ();

	//2次元目のインデックス0番でソート
	comp.set_index (0);
	//Arraysクラスのsort()を実行する
	Arrays.sort (num, comp);
	//ソート後のデータを出力
	for (int i = 0; i < num.length; i++) {
		println (num[i][0], num[i][1]);
	}

	//2次元目のインデックス1番でソート
	comp.set_index (1);
	//Arraysクラスのsort()を実行する
	Arrays.sort (num, comp);
	//ソート後のデータを出力
	for (int i = 0; i < num.length; i++) {
		println (num[i][0], num[i][1]);
	}

}

void draw () {
}

class Comp implements Comparator {

	int index = 0;

	void set_index (int i) {
		index = i;
	}

	int compare (Object a, Object b) {
		int[] int_a = (int[]) a;
		int[] int_b = (int[]) b;
		return (int_a[index] - int_b[index]);
	}
	
}

~~~
Railsのfromについて鬼

## Multiple objects
 [Multiple objects in a Rails form - Stack Overflow](http://stackoverflow.com/questions/972857/multiple-objects-in-a-rails-form)

```
<%= form_tag photos_update_path do %>
  <% @photos.each do |photo| %> 
    <%= fields_for "photos[]", photo do |pf| %>
      <%= pf.text_field :caption %>
      ... other photo fields
```

[Create Multiple Objects From Single Form in Rails - Too Busy Coding...](http://vicfriedman.github.io/blog/2015/07/18/create-multiple-objects-from-single-form-in-rails/)

```
<%= form_tag puppies_path do %>
  <% @kennel.each do |puppy| %>
    <%= fields_for 'puppies[]', puppy do |p| %>

      <div class="field">
        <%= p.label :name %><br>
        <%= p.text_field :name %>
      </div>
      <div class="field">
        <%= p.label :breed %><br>
        <%= p.text_field :breed %>
      </div>

    <% end %>
  <% end %>
  <div class="actions">
    <%= submit_tag %>
  </div>
<% end %>
```

## Nested Forms
[Learn Ruby on Rails -- Advanced Forms](http://www.theodinproject.com/ruby-on-rails/advanced-forms)

```
# app/models/user.rb
    class User < ActiveRecord::Base
      has_many :shipping_addresses
      accepts_nested_attributes_for :shipping_addresses
    end
```
```
    <%= form_for @user do |f| %>
      ...
      <% 3.times do %>
        <%= f.fields_for @user.shipping_address.build do |addy_form| %>
          ...
          <%= addy_form.text_field :zip_code %>
          ...
        <% end %>
      <% end %>
      <%= f.submit %>
    <% end %>
```


[Rails 3 submit a form with multiple records - Stack Overflow](http://stackoverflow.com/questions/4641565/rails-3-submit-a-form-with-multiple-records)

```
<%= form_for([@user, :reviews]) do |f| %>
  <% @reviews.each do |review| %>
    <%= fields_for review do |r| %>
      <%= render "reviews/form", :r => r %>
    <% end %>
  <% end %>
<% end %>
```

[ruby on rails - undefined method `order_path' for Class:0x00000102efef18:0x00000100f3c9c8 - Stack Overflow](http://stackoverflow.com/questions/9321080/undefined-method-order-path-for-class0x00000102efef180x00000100f3c9c8)


> The error should be a clue. It's missing the order_path, which isn't surprising since you are defining a route for plural orders in your routes file. 


[ruby on rails - Collection_select within a nested model form - Stack Overflow](http://stackoverflow.com/questions/3268807/collection-select-within-a-nested-model-form)
Sublime Txet 一斉検索 指定したフォルダを除外

指定したフォルダを一斉検索から除外するときは 【,-\*/hoge/\*】と書く



例：テストサイト内を一斉検索から除外

```

C:\hoge.jp\,-*/t/*

```



##複数指定

例：テストサイト、LPサイト、SPサイト内を一斉検索から除外

```

C:\hoge.jp\,-*/t/*,-*/lp/*,-*/sp/*

```
ボタンのベクター画像を作る。GoogleDriveで。

#ボタンのベクター画像を作る。GoogleDriveで。
###経緯
iOSアプリで、UIButtonにImageを設定する必要がありました。
UIButtonに画像を設定する方法等調べたら、Assets.xcassetsにNew Image Setを追加して、そのイメージを指定するとボタンがイメージになる。
わりと簡単そう。とか思いきや。
サイズの違う画像を準備しなければいけない！って〜面倒だな。
![スクリーンショット 2015-10-22 15.54.49.png](https://qiita-image-store.s3.amazonaws.com/0/88911/f53ebc8e-9c65-27d7-29ff-2e00af4296eb.png)
そんなわけで画像を作り始めたのですが、ボタンがいっぱいあるので作業が面倒だ！
・ボタンの数×３サイズ＝
なにか良い方法はないのかと考え、調べた。
→ベクター画像だと１つのボタンに１つの画像で済むらしい。
![スクリーンショット 2015-10-22 16.04.21.png](https://qiita-image-store.s3.amazonaws.com/0/88911/e089133f-8564-a162-2542-4b83f176ada3.png)
なんだ。ベクター画像を作ればいいんだね。PDFファイルね。…そっか。
そんなベクター画像を作ったことはない。イラストレーターも使ったことがない。そんな凝ったボタンを作るわけでもない。今は頼める人がいない。

##GoogleDriveでベクター画像を作る。
いつもお世話になっているGoogleDrive。
この方には.svgでファイルを出力する機能が付いている。そうベクター画像だ！
なので図形描画で画像を作って、形式指定でファイル出力すれば、ベクター画像ができる。PDF出力もある。こちらもベクターらしい。
###まずは図形描画を新規作成する。
![スクリーンショット 2015-10-22 16.03.51.png](https://qiita-image-store.s3.amazonaws.com/0/88911/10dee509-7e66-a286-796e-ad62fcb04e43.png)
###キャンパスを正方形にする。
ファイル→ページ設定。
![スクリーンショット 2015-10-22 16.06.12.png](https://qiita-image-store.s3.amazonaws.com/0/88911/4a2c707b-8389-4a1e-d26a-65f8a76189b4.png)
![スクリーンショット 2015-10-22 16.06.54.png](https://qiita-image-store.s3.amazonaws.com/0/88911/bd16e825-a1f4-5ae5-4f2d-55ca81847bb2.png)
この後、線と文字でアイコンの絵を作成します。
###形式を指定してダウンロードする。
ファイル→形式を指定してダウンロード→PDFドキュメント(.pdf)
ファイルをダウンロードします。
![スクリーンショット 2015-10-22 16.50.18.png](https://qiita-image-store.s3.amazonaws.com/0/88911/4d3cb17f-1fe3-5721-c673-a71678400c19.png)
###イメージセット(Image Set)にPDFを指定する。
Image Set の Scale Factors を Single Vector にします。
ダウンロードした、PDFファイルをDrag&Dropします。
多分できた！と思われる。
![スクリーンショット 2015-10-22 16.54.52.png](https://qiita-image-store.s3.amazonaws.com/0/88911/8bad9ff6-2796-3385-a7c8-4e01ecd54dbf.png)
「進捗・どう・です・か」をVim scriptで



> [「進捗・どう・です・か」をPerlで](http://qiita.com/B73W56H84/items/a6c4b770c6efc8d1af35)

Vim script で

```vim
scriptencoding utf-8

let s:seed = 0
function! s:srand(seed) abort
  let s:seed = a:seed
endfunction

function! s:rand() abort
  let s:seed = s:seed * 214013 + 2531011
  return (s:seed < 0 ? s:seed - 0x80000000 : s:seed) / 0x10000 % 0x8000
endfunction

function! s:shinchoku_dou_desu_ka() abort
  let words = ['進捗', 'どう', 'です', 'か']
  let pat = join(words, '')
  let buf = ''
  call s:srand(localtime())
  while 1
    let buf .= words[s:rand() % len(words)]
    if buf[-len(pat) :] == pat
      echo buf
      echo len(split(buf, '\zs')) . '文字で煽られました。'
      break
    endif
  endwhile
endfunction

call s:shinchoku_dou_desu_ka()
```

```bash:出力
どうどうですか進捗進捗どうです進捗進捗かかどうかかですかです進捗かかかです進捗どう進捗か進捗かです進捗か進捗ですですか進捗かどうですか進捗どうどうどうか進捗進捗どうですどうかどう進捗ですどう進捗進捗進捗ですどうですどうですかですです進捗ですどうです進捗どうどうかどう進捗進捗進捗です進捗進捗かか進捗ですかかです進捗どうかかかですどうかどう進捗ですどうかです進捗ですですどうどうですか進捗進捗かどうですどうどうですかかか進捗進捗か進捗どうか進捗進捗どうかどうどう進捗かですどう進捗どうかどうか進捗どうかかですかかどう進捗進捗かどうかどうどうどうどうですどう進捗です進捗か進捗かですですどう進捗進捗です進捗どうか進捗どうかですか進捗進捗進捗進捗ですどうかどうですです進捗かどうか進捗か進捗どうかですかですかかかどう進捗どう進捗ですどう進捗かですどうどうかどうかどう進捗かですどうどうどうどう進捗か進捗かどうですかです進捗かですどうですですどうですか進捗どう進捗進捗どうどうですどう進捗どう進捗進捗か進捗かかどうです進捗ですどう進捗かどう進捗ですです進捗ですどうか進捗どうかどうどうか進捗進捗進捗どうかです進捗か進捗ですかですですかです進捗か進捗どうかかですか進捗かどうですどうか進捗どうどうです進捗かか進捗進捗進捗ですどうですどうか進捗か進捗かですか進捗か進捗かですどうどう進捗どうどうどうどう進捗かか進捗どうかですどう進捗ですかです進捗か進捗ですどうかか進捗か進捗進捗かです進捗どう進捗か進捗どうかどうですかですか進捗進捗ですどうですですかどうかですですどうか進捗どうですか???
686文字で煽られました。
```

そして、進捗はかなり芳しくない。
Google Drive on Google Apps for Work でドメイン内の全ユーザーのファイルの共有状態を取得する

Google Apps for WorkのUnlimitedじゃないプランなので監査とかできないんだけど、ドメイン内の誰かがうっかり間違って公開したファイルが公開したままになってたらこわいよね。というわけで作りました。

https://github.com/kno2502/monitoring-google-drive

ちなみに、Unlimitedの監査機能でもファイルの公開状態の取得はできないっぽい(?)んですけど、ご存知でしたら教えてください。

## ハマったポイント

### Googleの公式ドキュメントにあるサンプルが動かない

クラス名やメソッド名が変わってて全然動かん。
gem google-api-rubyはalphaバージョンみたいだし、まあしゃーない…か?

### permissionsをキーに検索できない

まあそういうもんらしい。なので、全ファイルのpermissionをいちいち取得してます。
「え、できるだろ?」という方がいらっしゃいましたら教えていただけるとありがたいです…

### 自分以外の他のユーザーのファイルが探せない

管理者ユーザーであっても「誰でアクセスするか」を指定しないといけない。これがわからず、だいぶ時間を無駄にした。

* Service Account を使う。
* Google Apps for Work の 管理コンソール > セキュリティ > 詳細設定 > `API クライアント アクセスを管理する` からAPIクライアントを許可(登録)する。
* 「誰でアクセスするか」を指定する。

要するに下記の :sub のところ。

```
  client.authorization = Signet::OAuth2::Client.new(
    :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
    :audience             => 'https://accounts.google.com/o/oauth2/token',
    :scope                => ['https://www.googleapis.com/auth/drive.readonly', 'https://www.googleapis.com/auth/admin.directory.user.readonly'],
    :issuer               => issuer,
    :signing_key          => key,
    :sub                  => 'user@example.com'
  )
```

## あとがき

fork元の https://github.com/morimorihoge/google-drive-permission-search を公開してくださった morimorihoge さん、ありがとうございます。
割と原型を留めていませんが…
rails console で pry を使う方法

### 1. Gemfile に pry-rails を追記する

```:Gemfile
+ gem 'pry-rails'
```

### 2. Gem をインストールする

`$ bundle install`

### 3. Rails コンソールを立ち上げる

`$ rails console`

--- 

ポイント: 
pry ではなく pry-rails を入れること。



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
質問gitlabでcloneが出来ない

ここでの回答https://gitlab.com/gitlab-org/omnibus-gitlab/issues/138
に習い
 unicorn['worker_timeout'] = 60 
to change
 unicorn['worker_timeout'] = 600
→Same result
という結果です
内容は
git clone http://[[GitLab - URL]]/[[Group]]/[[Project]].git
Cloning into '[[Project]]'...
Username for 'http://[[Gitlab - Url]]': [[My Username]]
Password for 'http://[[My Username]]@[[GitLab - URL]]':
remote: Counting objects: 50195, done.
　remote: Compressing objects: 100% (28896/28896), done.
　fatal: The remote end hung up unexpectedly6 MiB | 724.00 KiB/s
　fatal: early EOF
　fatal: index-pack failed
何かわかりますかねえ
Windows > Firewall設定がうまく機能しない > 「Windowsファイアウォールを介したアプリまたは機能を許可」から登録

```txt:動作確認
Windows 8.1 pro
```

プログラムを初回実行時にファイアウォールの許可を設定しても許可設定が有効にならない時がある。

具体的には、プログラム初回実行時に「Windows セキュリティの重要な警告」ダイアログが表示され、そこで該当のネットワークにチェックを入れた上で「アクセスを許可する(A)」を選択してもファイアウォールで阻まれてしまう。

代わりに以下の登録方法では許可設定が有効となることを確認できた。

1. ファイアウォール > 詳細設定 > 受信の規則 において該当の規則を削除する　(初回実行時に作成された規則)
2. ファイアウォール > 「Windowsファイアウォールを介したアプリまたは機能を許可」 を選択
3. 「別のアプリの許可」 を選択
4. 許可したいプログラムのパスを選択

初回実行時の「アクセスを許可する」との違いは「受信の規則」に表示される一覧名が異なる。これが関係あるのかは未調査。
Raspberry Pi 2画面の黒い縁を消す

[先日の記事](http://qiita.com/jerrywdlee/items/4ffa93c1b37341db51fb)の続きです。
Raspiがモニターに接続して、画面は出たものの、どうも画面上下左右に出た黒いエリアに気になる。色々方法を探したが、結局自分で実践して問題解決した。

##方法

* まず、```sudo nano /boot/config.txt```で設定ファイルを開く(Viもいいが、RaspiのViはなんと「去勢」されたバージョンで、入力する時大変苦労だった)。
* そしてファイルの最後でこのような文言を見つける。 

```
# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
config_hdmi_boost=4
overscan_left=24
overscan_right=24
overscan_top=24
overscan_botton=16
disable_overscan=16
```
* overscan_*シリーズ全部0と書き換えて、rebootすれば、黒い縁がなくなる。

##参考
http://blog.livedoor.jp/victory7com/archives/23971362.html
http://raspberrypi.stackexchange.com/questions/23094/calibrate-overscan-settings
Chromeのオートコンプリートスタイルをカスタマイズする方法

### 背景色を変更する場合 
```
input:-webkit-autofill {
    -webkit-box-shadow: 0 0 0 1000px black inset;
} 
```

### テキストカラーを変更する場合
```
-webkit-text-fill-color: white !important;
```


[Removing input background colour for Chrome autocomplete?](http://stackoverflow.com/questions/2781549/removing-input-background-colour-for-chrome-autocomplete)
Amazon Linux 上でとりあえずPHPの開発環境っぽいのをざっと構築するシェルスクリプトを書いた

以下。
https://gist.github.com/YU81/4ddafe488f0bece58c28
HEADのrawのURLは以下。
https://gist.githubusercontent.com/YU81/4ddafe488f0bece58c28/raw/InitAmazonLinux_201503_for_PHP5.6.sh

やってることは以下。

- remiリポジトリの追加
- PHP5.6とMySQLのインストール
- なんとなく必要になりそうなPHPのモジュールと、依存関係のあるパッケージの明示的なインストール
- あるといいPHP以外のコマンドをインストール
- wwwユーザの作成
- composerのインストール
- FuelPHP, Laravel, Lumen のインストール
- nginx のconfファイルをFuelPHP前提っぽい感じに差し替え。
- php-fpm をwwwユーザで動作させるようにconfファイルを差し替え。


AMIから起動して、以下やったらだいたい通る。

```bash
curl https://gist.githubusercontent.com/YU81/4ddafe488f0bece58c28/raw/InitAmazonLinux_201503_for_PHP5.6.sh | sh
```

wget して修正して実行でももちろんOK。
本来自分用の秘伝のナントカ系なので。
nginxのシンボリックリンクミス

#いつもやってしまう原因
- 正しく理解出来ていない
- 権限についてもっと理解を深めなければならない
- それこそLPICとる

##本題
`sudo ln -s /etc/nginx/sites-available/www.foo.com /etc/nginx/sites-enabled`

#今回の教訓
- Linuxの理解が曖昧なままこんなことしているといつかドツボにハマる
- 目的をもった行動をする
PageMenuを改造してYahooアプリのようなUIを作ってみた

iPhone版のYahooアプリに興味があったので、[PageMenu](https://github.com/uacaps/PageMenu)を改造してUIを試しに作ってみました。

改造ポイントは以下です。
- UIScrollViewをネストさせています。
- contentとなるUITableViewのオフセットを監視しています。

注意事項は以下です。
- Object-C版のみ
- Autolayoutは後回しにしています。
- rotationの処理は自分には不要だったので削除しています。

こちらからどうぞ
[https://github.com/kikuchi-digiban/PageMenu](https://github.com/kikuchi-digiban/PageMenu)

![Simulator Screen Shot 2015.10.22 15.09.31.png](https://qiita-image-store.s3.amazonaws.com/0/3256/c865e32e-c22e-bf1d-ca83-2b333aa57a06.png)

![Simulator Screen Shot 2015.10.22 15.09.44.png](https://qiita-image-store.s3.amazonaws.com/0/3256/b3308cbf-7777-0e09-0dee-568b0070a2c4.png)

![Simulator Screen Shot 2015.10.22 15.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/3256/1653c54e-d1b6-eb35-352c-120837596ecc.png)

![Simulator Screen Shot 2015.10.22 15.09.51.png](https://qiita-image-store.s3.amazonaws.com/0/3256/d9a20c86-86be-718d-16d1-f3cdc3fabe0e.png)
raspberry pi + wireless usb dongle


無線（802.11）なUSBドングルは電力消費が大きいので、raspberry piで使うときは、セルフパワーなUSBハブを入れたりして使うのが一般的でした。raspberry pi B+や2が出てきた時に「USB電源強化」の記事は見かけていたのだけど、使っていて実感はなかった…。

今回どうしてもシステムをコンパクトにしたかったので、諦めきれずに調べてみたところ…

[公式な情報](https://www.raspberrypi.org/help/faqs/#power)を見てみると…(switchable) と書いてある…。

switchableな。

えーっと…。

明示的に設定しろってことかっ！！

`/boot/config.txt` に `max_usb_current=1` という行を追加して再起動！！

[このへん](http://raspberrypi.stackexchange.com/questions/27708/is-setting-max-usb-current-1-to-give-more-power-to-usb-devices-a-bad-idea)に書いてあるし、こうするとwifi usb dongle も1.6A消費しながら[動く](https://www.youtube.com/watch?v=GI9FG-guMVw)やつもあるらしい。もっと早く知っておけば良かった…。
command /usr/bin/codesign failed with exit code 11

##command /usr/bin/codesign failed with exit code 11
このエラーでハマる。解決のメモ
・Webで調べたものを試す。
　・Provisioning Profileの問題。
　　→一旦全部削除して追加しなおす。
　　→エラー解消されない。
　・キーチェーンの古い証明書の削除
　　→古い証明書がない。→エラー解消されない。
　・Xcode再起動
　　→エラー解消されない。
　・Macの再起動(reboot)
　　→解消された。解決。
推測：
キーチェーンがバグっていたのではと推測する。
ここ1ヶ月MyMacはスリープで使っていた。
→たまには再起動が必要。
pythonでcsvをダウンロードした時にExcelで開くと文字化ける

CSVをダウンロードするviewのサンプル。

## やりたいこと
DB(utf-8)から取得した情報をCSV出力したい。

## 問題
* Excelで開くと文字化ける。
* Sjisに変換しようとするとエラーが起きる。
* [csvモジュール](http://docs.python.jp/2/library/csv.html)がいけてない。

## 試したこと
* django1.6を使用していたため、[ドキュメント](https://docs.djangoproject.com/en/1.6/howto/outputting-csv/)を参照

```py

import csv
from django.http import HttpResponse

def some_view(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'

    writer = csv.writer(response)
    writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
    writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])

    return response
```
を試しに組み込んでみた。

### 結果
```lang:somefilename.csv
First row,Foo,Bar,Baz
Second row,A,B,C,"""Testing""",Here's a quote

```

できるじゃん。。


これに、取得したデータを出力するようにしたところ


![image](https://qiita-image-store.s3.amazonaws.com/0/38197/60eabd9c-5fe8-a637-3e10-24dbaf0bb271.png)


こうなった。


utf-8をexcelで開くと化ける。

そこで、sjisへの変換を試みた。

```
>>> u"ありが㌧。てすと〜ﾃﾞｽ".encode("sjis")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'shift_jis' codec can't encode character u'\u3327' in position 3: illegal multibyte sequence
```

エラーになる。(実際はもっと文章がわかりにくく、ここで無駄に時間をかけてしまった)

からの、こう！

```py
print u"ありが㌧。てすと〜ﾃﾞｽ".encode("sjis",'ignore')
���肪�B�Ă��Ɓ`�޽
```


化ける・・・・


ここでさらに詰まってたところ

隣の席の少年(27歳)が、[pythonの本](http://goo.gl/pamTCS)を見せつけてきた。

何気なく手に取ってみると


`unicodedata.normalize`

というものがあるらしい。


これをつかってみると。

```py
>>> import unicodedata
>>> print unicodedata.normalize('NFKC', u"ありが㌧。てすと〜ﾃﾞｽ")
ありがトン。てすと〜デス
```

あれ！キタコレ!!

少年(27歳)感謝!!!


っというわけで組み込んでみたサンプル。

```py

import csv
import datetime
import unicodedata

from django.http import HttpResponse
from django.db.models import Q
from apps.coupon_v2.models import UrbanShopCoupon

def csv_download(request):

    sample = samplemodel.objects.filter(is_deleted='0')

    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="sample%s.csv"' % datetime.date.today().strftime('%Y_%m')

    writer = csv.writer(response)

    for c in sample:
        writer.writerow([
            "%08d" % c.id,
            "%s" % c.is_deleted,
            "%s" % unicodedata.normalize('NFKC', c.name).encode('sjis','ignore') ,
            "%s" % c.start_at.strftime('%Y/%m/%d %H:%M'),
        ])

    return response
```


っという感じでできました♪
Gradleのカスタムタスクで、JUnitテストのカテゴリ分けをする


JUnitのCategoryテストっぽいことを@Categoryを使わずにできたので共有します

### どうやってやるか
gradleスクリプトに以下のようなカスタムタスクを作ります。これだけ。

```build.gradle
// targetパッケージだけをテスト対象にしたカスタムタスク
task customTest(type: Test, dependsOn: testClasses) {
    include '**/target/**'
}
```

この例ではパッケージ名にtargetと含まれるテストだけを含めていますが、excludeを使って除外したり、複数行で記述することも可能です。

あとは `./gradlew test` と実行していたところを`./gradlew customTest`にするだけでOKです。


### メリット

**カテゴリの切り方を柔軟にできる**のがこの方法の良いところだと思います。

元々Jenkinsで動かしているテストが遅くなって来たので分離して実行したいという背景からカテゴリ分けに取り組みましたので、既存のテストコードに@Categoryはついていませんでした。

テストが遅くなったと感じた時にはテストケースも膨大。
@Categoryをつけていくのも面倒ですので、つけない方法を探すとこの方法にたどり着きました。

この方法だと、今後さらに分割したいとかにも対応できるのもいいですね。


### その他の方法

検討した他のカテゴリ分け方法も紹介しておきます

#### (1) --testsを使う

頻繁に実行しないのであればこれが楽ですね。@Categoryもいらないです。

詳しくはリンク先を。
[Gradleで特定のメソッド、クラスのみテスト](http://qiita.com/toyama0919/items/a5a05ccc0b0304fa547d)



#### (2) @Category使う
JunitのCategoryを使う場合はこのあたりが参考になるかと思います。

[JUnitのCategoryさんとMavenのintegration-testでの実行](http://irof.hateblo.jp/entry/20130411/p1)
[gradleでJUnitのCategoryテストを実行する - 2014年版](http://mike-neck.hatenadiary.com/entry/2014/07/08/015251)
[PHP] FTPでのアップ/ダウンロード

# [PHP] FTPでのアップ/ダウンロード
備忘録
基本は以下でok
1. ftp_connect
2. ftp_login
3. ftp_pasv
4. ftp_put/get
## アップロード
### コード
```php
$ftpValue = array(
    'ftp_server' => FTP_ADDRESS,
    'ftp_user_name' => FTP_USER,
    'ftp_user_pass' => FTP_PASS
);
$remote_file = REMOTE_FILE_NAME;
$upload_file = LOCAL_FILE_NAME;

$connection = ftp_connect($ftpValue['ftp_server']);

$login_result = ftp_login(
    $connection,
    $ftpValue['ftp_user_name'],
    $ftpValue['ftp_user_pass']
);

ftp_pasv($connection, true);
$ftpResult = ftp_put($connection, $remote_file, $upload_file, FTP_BINARY, false);

if (!$ftpResult) {
    throw new InternalErrorException('Something went wrong.');
}

ftp_close($connection);

```

## ダウンロード
### コード


```php
$ftpValue = array(
    'ftp_server' => FTP_ADDRESS,
    'ftp_user_name' => FTP_USER,
    'ftp_user_pass' => FTP_PASS
);
$remote_file = REMOTE_FILE_NAME;
$download_file = LOCAL_FILE_NAME;

$connection = ftp_connect($ftpValue['ftp_server']);

$login_result = ftp_login(
    $connection,
    $ftpValue['ftp_user_name'],
    $ftpValue['ftp_user_pass']
);

//リモートでのファイル存在チェック
if(ftp_size($connection, REMOTE_FILE_NAME)){
    ftp_pasv($connection, true);
    $ftpResult = ftp_get($connection, $download_file, $remote_file, FTP_BINARY, false);
}

if (!$ftpResult) {
    throw new InternalErrorException('Something went wrong.');
}

ftp_close($connection);

```

## メモ
### ftp_pasv … パッシブモードのオン/オフ
ダウンロードでもアップロードでもこんなエラーが出るときにはパッシブモードをオンにしましょう。
`ftp_get(): Illegal PORT command. `
パッシブモードについて
* http://e-words.jp/w/PASV%E3%83%A2%E3%83%BC%E3%83%89.html
* http://www.rtpro.yamaha.co.jp/RT/FAQ/TCPIP/ftp-passive-mode.html
要は、FTPクライアント側がファイヤーウォールの内側にいるときは、サーバ側からのポート要求に応えられないため、クライアント側からコネクションを要求しちゃえと解釈。
あと、明示的にパッシブモードをオン/オフにするときは、それに合わせて`ftp_put/get`の第5引数に気を付けよう。
### アップロード先/ダウンロード元
`ftp_login`に使用したユーザのホームディレクトリが起点となる。
例：クライアントユーザをhoge　サーバのユーザをfugaとする。
1. `ftp_put($connection, 'hoge.txt', 'fuga.txt', FTP_BINARY)`
クライアントの「/home/fuga/fuga.txt」がサーバに「/home/hoge/hoge.txt」としてアップロードされる
2. `ftp_get($connection, 'fuga.txt', 'home.txt', FTP_BINARY)`
サーバの「/home/hoge/hoge.txt」がクライアントに「/home/fuga/fuga.txt」としてアップロードされる
Railsの重い処理を見つける


重い処理を見つけたい時のメモ。

## 監視サービス利用

パフォーマンス監視サービス

New Relic
https://newrelic.com/

遅いレンダリング箇所などが分かりやすいです

## logファイルから

### ※前置き

#### 念ためlogファイル分割

行数調べる

```
$ wc -l development.log
```

行数から分割したいサイズの行で指定

```
$ split -l 10000 development.log develop_20XX-XX-XX_
```

すると
develop_20XX-XX-XX_aa
develop_20XX-XX-XX_ab …
と ファイル名がアルファベット名を順に分けて分割される

#### 念ため半角スペース統一


```
$ sed 's/[[:blank:]][[:blank:]]*/ /g' develop_20XX-XX-XX_aa > develop_20XX-XX-XX_aa_sed
```

#### 念ためsortしたいruntime:位置がずれないように区切り文字(sort -t '%'ができるよう)に置換える

```
$ sed 's/runtime: /%/g' devlog_20XX-XX-XX_aa_sed > devlog_20XX-XX-XX_aa_sed_runtime
```


### mongo DB runtime 長い順に

```
$ grep "MOPED:" develop_20XX-XX-XX_aa_sed | sort -bnr -k 13 | head -15
```

### Render 遅い順に

```
grep "Rendered" devlog_20XX-XX-XX_aa_sed | sort -b -t '(' -k 2nr,2 | head -15
```


※参考
Railsのproductionログから処理に時間がかかっている部分を探す - 元RX-7乗りの適当な日々
http://d.hatena.ne.jp/rx7/20080930/p2


※sort オプションの詳しい参考
CodeZine（コードジン） 
http://codezine.jp/unixdic/w/sort

ShellScript - sortコマンド、基本と応用とワナ - Qiita 
http://qiita.com/richmikan@github/items/cc4494359b1ac2f72311

※sed
Linuxコマンド集 - 【 sed 】 文字列の置換、行の削除を行う：ITpro 
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/



## 細かい処理時間を rails console で計測
```rb
Benchmark.realtime do
  # 処理
end
```

その時によって違うので、複数回試して、平均をみる

※参考
Rails - Rubyで処理の時間計測方法 - Qiita
 http://qiita.com/yakiimo23/items/7293c7606c1d59501d89
Jenkinsで静的解析・テスト結果やらのレポートを生成するMavenの設定

# これは何？
Jenkinsに静的解析、テスト結果をまとめてレポートしてもらう為のMaven設定を記したもの。
※　Jenkins自体への設定は割愛します。

# レポートイメージ
Jenkinsの画面から静的解析の結果、テストの結果などが一望できる様な感じ

![CI_静的解析レポート.png](https://qiita-image-store.s3.amazonaws.com/0/39825/6afd8671-8d61-7200-cf29-c7d4a56f8da1.png)

# バージョン情報
* maven 3.3.3
* jenkins 1.634
* centos 6.5 (Open Logic 6.5)

# jenkinsに吐かせたいレポートの内容

* findbugs
* checkstyle
* jUnitのテスト結果
* カバレッジ測定
* PMD(Javaソースコード解析の為の静的なルールセット) 
* javadoc生成

# 必要なJenkinsのプラグイン

※ 標準でインストールされているプラグインを含みます
※ 依存関係でインストールされたプラグインは対象としていません。

* Checkstyle Plug-in
* Cobertura Plugin
* Dependency Analyzer Plugin
* Duplicate Code Scanner Plug-in
* FindBugs Plug-in
* Javadoc Plugin
* JUnit Plugin
* JUnit Attachments Plugin（テスト結果にエビデンスを貼り付ける為）
* Maven Integration plugin
* PMD Plug-in
* Static Analysis Collector Plug-in
* Static Analysis Utilities
* Task Scanner Plug-in

# pom.xmlの中身

※　試行錯誤の結果、動いた結果を示します。
※　mavenの各プラグインのバージョンは、2015年10月22日現在の情報です。

```xml:pom.xml

<projcet>
 ...
	<reporting>
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>findbugs-maven-plugin</artifactId>
				<version>3.0.3-SNAPSHOT</version>
				<configuration>
					<findbugsXmlOutput>true</findbugsXmlOutput>
					<xmlOutput>true</xmlOutput>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-checkstyle-plugin</artifactId>
				<version>2.17</version>
				<reportSets>
					<reportSet>
						<reports><report>checkstyle</report></reports>
					</reportSet>
				</reportSets>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jxr-plugin</artifactId>
				<version>2.5</version>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>cobertura-maven-plugin</artifactId>
				<version>2.7</version>
				<configuration>
					<formats><format>xml</format></formats>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<version>2.10.3</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-report-plugin</artifactId>
				<version>2.19</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-pmd-plugin</artifactId>
				<version>3.5</version>
			</plugin>
		</plugins>
	</reporting>

 ...
</project>
```

# 利用するMavenのゴール

```bash
mvn
/ compile
/ checkstyle:checkstyle
/ pmd:pmd
/ findbugs:findbugs
/ javadoc:aggregate
/ surefire-report:report
/ cobertura:cobertura -Dcobertura.report.format=xml
```
Android用アプリをJavaで作成してみた【Hello World!編】


Hello World!編→ここ
スクショソフト編→http://qiita.com/YSRKEN/items/4ef1890f660a9c26c045

#概要
　タイトルの通りです。ふとスマホ用アプリのアイディアが浮かんだのですが、未だに作ったことがなかったのでやってみようとした試行錯誤を記録しておきます。

#まず開発環境を導入する
　[このページ](https://akira-watson.com/android/adt-windows.html)を参考にしつつ、Android Studioを導入しました。最初は[EclipseにAndroid SDKを導入して](http://androidguide.nomaki.jp/index.html)……とやろうと思いましたが、現状ではAndroid Studioが推奨環境らしいので。読めば誰でも使い方が分かるでしょうから詳細は略します。

#エミュレータで実行する際の注意点
　サンプルとしてはみんな知ってる「[Hello World!](https://ja.wikipedia.org/wiki/Hello_world)」が既に入っているので、適当にプロジェクトを作成すればすぐに試せるはず……なのですが、その前にエミュレータの環境を整える必要があります。当然ですが、Androidデバイスは無数にあるので、画面解像度やAPIのバージョンなどで様々な設定でエミュレートできるのです。
　具体的には[AVD Manager](http://andro.hatenablog.com/entry/2014/11/20/115616)ってのを使えばいいのですが(IDE上でアイコンが出ているので分かりやすいはず)、デフォルトの奴ではなく、**普段使うスマホ**である[SH-02E](http://www.sharp.co.jp/products/sh02e/)**に合わせた設定と**、**より画面を小さくしたオリジナルスマホの設定**を用意しておきます。前者は実機テスト用、後者はディスプレイが小さいのでそれ対策ですね。
　また、CPU/ABIの設定ですが、あらかじめAndroid SDK Managerで「ARM EABI v7a System Image」等の**ナントカImageを導入しておかないと駄目**ということと、x86とかじゃなくてARMのABIを使うと**めちゃくちゃ遅い**ので気をつけろということですね。具体的な導入方法は[このページ](http://www.webtech.co.jp/blog/os/android/5966/)を読めばいいのですが、この辺を忘れると**Hello Worldがx86で15秒で済むところ、ARMで61秒も掛けてテストする**羽目になります(OS起動時間を含む)。
　なお、AVDの設定でメモリ使用量も設定できますが、こちらも取り過ぎるとPCが死ぬので気をつけましょう……ってのは普通のエミュレータも同じですね。

#実行例
　その辺を乗り越えれば、こんな感じでHello World!
(50％に縮小しています)
![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/29802/8c417a9d-cf9e-2860-5086-a398fe15ef41.png)
http(s)での疎通確認ツールをjavaで作成

複数の外部サービスを使っているシステムを構築している際、それらとhttp通信できるかをさっと確認したいということがあり、慣れているjavaで作ってみました。

GitHubにソースとjarを公開しています。
https://github.com/JunNakamura/trafficConfirmer

## 使い方

application.confに、疎通確認したいURLを、下記のように記述します。

```
urls = [
  "http://aaa/"
  "https://bbb/"
  "http://localhost"
]
```

それを、jarの実行時に指定すれば、URLごとに、OKかNGかと、レスポンスのhttpステータスコードを標準出力とログに出します。java8を使用してください。

`
java -Dconfig.file=application.conf -jar trafficConfirmer-x.y.z-jar-with-dependencies.jar
`

## 使ったライブラリ

[typesafeのconfig](https://github.com/typesafehub/config) で、URLのリストを取得しています。playで使い慣れているので、そのまま採用。

http通信は、apache httpcomponentsの[httpclient](https://hc.apache.org/httpcomponents-client-ga/)を使用。今回初めて使うのですが、定番のひとつということで採用。

気休めとして、URLのバリデーションを、[commons-validator](https://commons.apache.org/proper/commons-validator/) を採用。これもはじめてですが、さっと使えそうだったので。

## 感想

依存ライブラリを使うと、mavenプロジェクトとかにしないと結局面倒くさそう。jarをまとめるのもひと手間....
このくらいだと、javaでつくるのは重たい感じですね。（そもそも、そんなにライブラリに頼るなというのも）
Macでsudoのパスワード聞かれるのがうざい時の対処


Linux系だと、下記のようにユーザーを`wheel`グループに追加して、`visudo`で該当箇所のコメントアウトはずせばOK。

	# ログインユーザーの所属グループを確認
	$ groups
	
	# wheelグループに追加
	$ sudo gpasswd -a ユーザー名 wheel

	$ groups
	#  wheelが追加されていたらOK

	$ sudo visudo
	# %wheel ALL=(ALL) NOPASSWD: ALL  # => ここのコメントアウトをはずす

Macの場合は、グループの追加方法が違うだけ。

	# ログインユーザーの所属グループを確認
	$ groups
	
	# wheelグループに追加
	$ sudo dscl . -append /Groups/wheel GroupMembership ユーザー名

	$ groups
	#  wheelが追加されていたらOK

	$ sudo visudo
	# %wheel ALL=(ALL) NOPASSWD: ALL  # => ここのコメントアウトをはずす

参考資料
-----
- [dscl(1) Mac OS X Manual Page - Apple Developer](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dscl.1.html)
boto3 で デフォルトprofile以外を使う


## デフォルトの場合

```python
import boto3

s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
    print(bucket.name)

```

## ACCESS_KEY, SECRET_KEYを指定

ドキュメント

* http://boto3.readthedocs.org/en/latest/guide/session.html#custom-session
* http://boto3.readthedocs.org/en/latest/guide/configuration.html

```python
import boto3
from boto3.session import Session

session = Session(aws_access_key_id='<YOUR ACCESS KEY ID>',
                  aws_secret_access_key='<YOUR SECRET KEY>',
                  region_name='<REGION NAME>')

s3 = session.resource('s3')

```


## ~/.aws/credentials の profile名で指定する

Session に profile_name を渡す。

[ドキュメント](http://boto3.readthedocs.org/en/latest/guide/configuration.html) 見ても分からず、[githubのissue](https://github.com/boto/boto3/pull/69) で発見


```python
import boto3
from boto3.session import Session

profile = '<YOUR_PROFILE_NAME>'
session = Session(profile_name=profile)

s3 = session.resource('s3')
```
C言語でニュートン法を実装してみた


## ニュートン法とは
ニュートン法については、ここでは割愛します。
http://qiita.com/PlanetMeron/items/09d7eb204868e1a49f49
この方の記事がわかりやすいかも

## 微分
導関数の定義に従って微分します。

```c
#define DX 0.00000001

double f(double x) {
    return - 2*pow(x,4) + 3*pow(x,3) + 4*x - 3;
}

// 微分を求める
double fd(double x) {
    return (f(x+DX) - f(x)) / DX;
}
```

dxは0に近い適当な値を入れておきます。
fはxに対しての返り値で、fdはその微分を求めます。


## 接線を求める

dfを傾きとして、

```math
y = df(currentX) * (x - currentX) + f(currentX)
```

currentXは接線を求めたい位置のx座標


## x切片を求める

```c
// x切片を返す、y=ax+bの形、ax+b=0のとき
double searchInterceptX(double a, double b) {
    return -b/a;
}
```

y=ax+bの切片は簡単にもとまりますね！

## 完成したファイル

```c:Newton.c
#include <stdio.h>
#include <math.h>

#define DX 0.00000001

// 入力した関数
double f1(double x) {
    return - 2*pow(x,4) + 3*pow(x,3) + 4*x - 3;
}
double f2(double x) {
    return -2 * sin(x) + exp(x+1) + x - 10;
}

// 微分を求める
double fd(double (*func)(double), double x) {
    return (func(x+DX) - func(x)) / DX;
}

// x切片を返す、y=ax+bの形、ax+b=0のとき
double searchInterceptX(double a, double b) {
    return -b/a;
}

// ニュートン法で次のXを求める
double nextX(double (*func)(double), double currentX) {
    double dif = fd(func, currentX);
    return searchInterceptX(dif, func(currentX) - dif*currentX);
}

// 解いて結果を返す
// 本当は誤差評価すべき
double solve(double (*func)(double), double initialX) {
    double currentX = initialX;
    for(int i=0; i<10; i++) {
        printf("%lf\n", currentX);
        currentX = nextX(f1, currentX);
    }
    return currentX;
}

int main() {
    printf("f1\n");
    printf("result = %lf\n", solve(f1, 1));

    printf("\n");

    printf("f2\n");
    printf("result = %lf\n", solve(f2, M_PI));
}

```

関数ポインタを使って実装しました。
solve関数の第二引数は、ニュートン法の初期x座標になっています。求めたい解の近くの値にしておいてください。

誤差評価はすべきですが、今回はループ回数のみにしました
Ruby on Rails で究極の答えを表示する方法

Rails コンソールを立ち上げる。

`$ rails console`

1から100までの配列を作る。

```rb
hundled = [*(1..100)]
```

forty_one メソッドを実行する。

```rb
hundled.forty_one
```

結果: そんなメソッドは存在しない。

```NoMethodError: undefined method `forty_one'```

forty_two メソッドを実行する。

```rb
hundled.forty_two
```

結果:

` => 42 `

　
---

Thanks to Hirano




<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->