OmniAICreator/Qiita-1.07M huggingface dataset:
RuboCop | Style/CollectionMethods PreferredMethods

# RuboCop | Style/CollectionMethods PreferredMethods

## 概要

RuboCopの「Style/CollectionMethods PreferredMethods」警告について。

コレクションのメソッドで、エイリアスが用意されているメソッドについて  
どのメソッドを利用するかを規約化する。  

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|PreferredMethods collect|map|collect と map のうち、mapを有効とする|○|
|PreferredMethods map|collect|collect と map のうち、collectを有効とする|--|
|PreferredMethods collect!|map!|collect! と map! のうち、map!を有効とする|○|
|PreferredMethods map!|collect!|collect! と map! のうち、collect!を有効とする|--|
|PreferredMethods inject|reduce|inject と reduce のうち、reduceを有効とする|○|
|PreferredMethods reduce|inject|reduce と inject のうち、injectを有効とする|--|
|PreferredMethods detect|find|detect と find のうち find を有効とする|○|
|PreferredMethods find|detect|finde と detect のうち detect を有効とする|--|
|PreferredMethods find_all|select|find_all と select のうち select を有効とする|○|
|PreferredMethods select|find_all|select と find_all のうち find_all を有効とする|--|

## CollectionMethods PreferredMethods

各設定値での検証結果をまとめます。

### 検証プログラム

preferred_methods.rb

~~~ruby
ary = [*1..5]

p ary.map { |e|e + 1 }
p ary.collect { |e|e + 1 }
p ary.map! { |e|e + 1 }
p ary.collect! { |e|e + 1 }
p ary.inject(&:+)
p ary.reduce(&:+)
p ary.find { |v|v.odd? }
p ary.detect { |v|v.odd? }
p ary.find_all { |v|v.odd? }
p ary.select { |v|v.odd? }
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
CollectionMethods:
  PreferredMethods:
    collect: 'map'
    collect!: 'map!'
    inject: 'reduce'
    detect: 'find'
    find_all: 'select'
~~~

*collect* , *collect!* , *inject*, *detect*, *find_all* 利用時に警告が発生

~~~bash
$ rubocop preferred_methods.rb
Inspecting 1 file
C

Offenses:

preferred_methods.rb:4:7: C: Prefer map over collect.
p ary.collect { |e|e + 1 }
      ^^^^^^^
preferred_methods.rb:6:7: C: Prefer map! over collect!.
p ary.collect! { |e|e + 1 }
      ^^^^^^^^
preferred_methods.rb:7:7: C: Prefer reduce over inject.
p ary.inject(&:+)
      ^^^^^^
preferred_methods.rb:10:7: C: Prefer find over detect.
p ary.detect { |v|v.odd? }
      ^^^^^^
preferred_methods.rb:11:7: C: Prefer select over find_all.
p ary.find_all { |v|v.odd? }
      ^^^^^^^^

1 file inspected, 5 offenses detected
~~~

### 実行結果 デフォルトと反対の設定をした場合

.rubocop.yml

~~~yaml
CollectionMethods:
  PreferredMethods:
    map: 'collect'
    map!: 'collect!'
    reduce: 'inject'
    find: 'detect'
    select: 'find_all'
~~~

*map* , *map!* , *reduce*, *find*, *select* 利用時に警告が発生

~~~bash
$ rubocop preferred_methods.rb
Inspecting 1 file
C

Offenses:

preferred_methods.rb:3:7: C: Prefer collect over map.
p ary.map { |e|e + 1 }
      ^^^
preferred_methods.rb:5:7: C: Prefer collect! over map!.
p ary.map! { |e|e + 1 }
      ^^^^
preferred_methods.rb:8:7: C: Prefer inject over reduce.
p ary.reduce(&:+)
      ^^^^^^
preferred_methods.rb:9:7: C: Prefer detect over find.
p ary.find { |v|v.odd? }
      ^^^^
preferred_methods.rb:12:7: C: Prefer find_all over select.
p ary.select { |v|v.odd? }
      ^^^^^^

1 file inspected, 5 offenses detected
~~~

## 補足

この警告は rubocop -a で修正可能です。
新しい言語開発するときに参考にしたいgitignoreのテンプレートまとめ -Github社


何をgitignoreすべき？って慣れてる言語だったらなんとなくわかってくると思うけど、新しい言語に触れ始めた当初は正直良くわからなかったりするもの。場合によっては賛否両論もあったりします。

そんな中、Github社が非常に良いまとめを作ってくれてました。
AndroidやObjective-C、Railsなどいろんな言語のgitignoreテンプレートをまとめてくれています。
https://github.com/github/gitignore

最初はとりあえずこちら参考にすると良さそうですね。独自に必要なものがあればForkしてカスタマイズすると良いと思います。
会社の組織と給与３

　前回にこの問題を解いたときは動的計画法を用いて解く事が出来ませんでした。そのため、今回は動的計画法を用いて解く！という目標を掲げて解いてみました。
　主な解法は前回と変わりませんが、long型配列dpを用意して、既に計算したデータ以降を枝刈り出来る様にコーディングしてみました！

```java:

public class CorporationSalary {
	long[] dp;
	String[] salaries;
	
	long totalSalary(String[] relations) {
		int total = 0;
		dp = new long[relations.length];
		salaries = relations;
		
		for(int r = 0; r < relations.length; r++) {
			total += calcSumSalary(relations[r], r);
		}
		return(total);
	}
	
	long calcSumSalary(String relation, int id) {
		if(dp[id] != 0) return(dp[id]);
		long total = 0;
		boolean flag = false;
		for(int r = 0; r < relation.length(); r++) {
			if(relation.charAt(r) == 'Y') {
				flag = true;
				total += (dp[r] = calcSumSalary(salaries[r], r));
			}
		}
		if(!flag) return(1);
		return(total);
	}
	
	void doIt() {
		String[] relations = {
				"NNYN",
				"NNYN",
				"NNNN",
				"NYYN",
		};
		System.out.println(totalSalary(relations));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new CorporationSalary().doIt();
	}

}


```

　ここをこう変えればもっと効率化出来る、この書き方は良くないなどの意見を下さると大変嬉しいです！！（≧▽≦）
SublimeText 3の導入パッケージをリスト化

#なりゆき
オレのパッケージリストを見ろ！っていうのが流行っている。
それを真似したかったけど、自分が導入しているパッケージがわからん。

パッケージコントロールからは見れるけど、テキスト化できない。

最初はリストの出し方がわからずハマった。出し方わかったのでメモ。

#出し方

メニューで以下の操作

**Preferences » Package Settings » Package Control » Settings - User**

出力リストは以下のとおり。

```json
{
	"installed_packages":
	[
		"AutoFileName",
		"BracketHighlighter",
		"Emmet",
		"HTML-CSS-JS Prettify",
		"IMESupport",
		"jQuery",
		"Local History",
		"SFTP",
		"SyncedSideBar"
	]
}
```

おわり
CentOS7でnginxをyumでインストール(phpのおまけ付き)

##nginxリポジトリの登録(作成)。
※まだ**mainlaine**にしかない模様。2014/07/15時点の最新版である1.7.3が入る

```lang:bash
[root@centos7 ~]# vi /etc/yum.repos.d/nginx.repo
```

```lang:/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
#baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=0
```

##nginxをインストール & 実行 & 登録

```lang:bash
[root@centos7 ~]# yum --enablerepo=nginx install nginx
[root@centos7 ~]# systemctl start nginx
[root@centos7 ~]# systemctl enable nginx
```

##php-fpmをインストール

```lang:bash
[root@centos7 ~]# yum install php-fpm php-mbstring
```

nginxの設定でphp-fpmが動くように変更する

```lang:bash
[root@centos7 ~]# vi /etc/nginx/conf.d/default.conf
```

```lang:/etc/nginx/conf.d/default.conf
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
```

```lang:bash
[root@centos7 ~]# systemctl restart nginx
[root@centos7 ~]# echo '<?php phpinfo();' > /usr/share/nginx/html/info.php
[root@centos7 ~]# systemctl start php-fpm
[root@centos7 ~]# systemctl enable php-fpm
[root@centos7 ~]# curl 'http://localhost/info.php'
```

外部からアクセスする時のおまけ(CentOS7からfirewalldに変わった)

```lang:bash
[root@centos7 ~]# systemctl stop firewalld
```
ActiveXの更新方法

ActiveXも[C - exeを署名してみた。 - Qiita](http://qiita.com/tukiyo3/items/643b535216c8e38b7b64)と同様に署名に対応している。
署名をするとcabファイルのプロパティに「デジタル署名」のタブが追加される。

# ActiveXの更新

* HTMLタグにActiveXのcabファイルのURL
* version

を記載する。

```bash:
<object id="activexobj1" width="0" height="0" classid="clsid:312F4CB1-F62D-4D9B-A146-AD1796D00000" codebase="https://myhome.com/activexobj1.cab#version=1,0,0,9"></object>
```

ActiveXのcabファイルを更新したらURLのversionも末尾1つあげる。

* version=1,0,0,9 の次はversion=1,0,1.0 を指定すること。
 (version=1,0,0,10だとダメ。)

* activexobj1.cabとは別にactivexobj1.inf が存在する場合、activexobj1.infはサーバにUPしなくてよい。(使われない)

# ActiveXが更新される端末とされない端末がある

* IEは32bitであること
* c:\windows\downloaded program files\activexobj1.inf を確認しがちだが、
* c:\windows\system32\activexobj1.ocx が存在する場合、activexobj1.infが入ってこない。
* activexobj1.ocxを削除することでActiveXのダウンロードができるようになる。
Centos6.5にロードバランサーのPound2.6を設置

centos6.5にpound2.6を設置して動かしたのでそのメモ書きです。

POUND - REVERSE-PROXY AND LOAD-BALANCER
http://www.apsis.ch/pound

opensslを使うのでインストールします。

```bash
yum install openssl openssl-devel
```

Heartbleedがあったのでバージョンを確認しましょう。

Version 1.0.1e-16.el6_5.14

ソースコードを取得して
configureからのmake - make install

```bash
cd /usr/local/src
wget http://www.apsis.ch/pound/Pound-2.6.tgz
tar zxvf Pound-2.6.tgz

cd Pound-2.6
./configure --prefix=/usr/local

make
make install
```

インストールはこれだけです。

あとはpound.cfgのファイルが最初ないので
/usr/local/etc/pound.cfg に作りましょう。

あとserviceに登録されてないとなんだかすっきりしないですよね。
登録しましょう。

```bash
vi /etc/init.d/pound
```

start|stop|configtest|restartを使えるようにします。

```bash
#!/bin/sh
#
# pound
#
# chkconfig: 345 85 15
# description: reverse-proxy and load-balancer
#

# Source function library
. /etc/rc.d/init.d/functions

# Get network config
. /etc/sysconfig/network

# Pound Directory
POUND="/usr/local/sbin/pound"
CFG="/usr/local/etc/pound.cfg"

# See how we were called.
case "$1" in
  start)
      # Check if the normal service is already running?
      if [ ! -f /var/lock/subsys/pound ]; then
          echo "Starting pound:"
          $POUND -f $CFG
          RETVAL=$?
          [ $RETVAL -eq 0 ] && touch /var/lock/subsys/pound
          echo ${base}
      else
          #msg_Already_Running pound
          echo "pound already started."
          # exit 1
      fi
      ;;
  stop)
      # Stop daemons.
      if [ -f /var/lock/subsys/pound ]; then
          #msg_stopping pound
          echo "Stopping pound:"
          killall $POUND
          rm -f /var/lock/subsys/pound > /dev/null 2>&1
          echo
      else
          echo "pound is not running."
          exit 1
      fi
      ;;
  restart|reload)
      $0 stop
      $0 start
      ;;
  configtest)
      $POUND -c -v -f $CFG
      ;;
  *)
      echo "usage: pound {start|stop|configtest|restart}"

      exit 1
      ;;
esac

exit $RETVA
```

実行権限を付けます。

```bash
chmod +x /etc/init.d/pound
```

サービスが自動起動するようにしましょう。

```bash
chkconfig pound on
```

動作するか確認してみましょうか。
設定ファイルがちゃんとある状態なら

```bash
service pound configtest

starting...
Config file /usr/local/etc/pound.cfg is OK
```

こんな感じでOKです。

さっくりSSLProxyやロードバランサーしたい時はpoundを使うのが楽なんですよね。
JavaフレームワークSparkでHelloWorld Webアプリを1行で作成

ちょっと前に知ったので試しに使ってみたら思いのほか簡単だったので投稿。
## What's Spark?
[Spark - A small web framework for Java](http://www.sparkjava.com/)
Sparkとはsinatraにインスパイアされて開発された小規模なアプリケーション向けのフレームワーク。

## Environment
使った環境
- Eclipse 4.4
- Java 8
- Spark
- Gradle

今回は少し楽をしてeclipseでGradleプロジェクトを作成。
build.gradleで環境をJava8にし、dependenciesにsparkを追加。

```grooby:build.gradle
...

sourceCompatibility = targetCompatibility = 1.8

...

dependencies {
	compile 'com.sparkjava:spark-core:2.0.0'
...

```

## Let's Hello World!

mainメソッドを持ったクラスを作成し、1行追加するだけ。

```java:HelloWorld.java

import static spark.Spark.*;

public class HelloWorld {

	public static void main(String[] args) {
          // 以下の行だけ
	      get("/hello", (request, response) -> "Hello World!"); 
	}

}
```


通常のJavaアプリケーションのようにmainメソッドを実行すると

```
== Spark has ignited ...
>> Listening on 0.0.0.0:4567
```

こんな感じのメッセージが表示されます。

これは今回作成したアプリケーションがJettyで起動している状態なので、http://localhost:4567/hello にアクセスすると。

![localhost.png](https://qiita-image-store.s3.amazonaws.com/0/28298/d79bd6f2-2702-9a3e-53ea-ce86a0cf63df.png "localhost.png")

あっという間にHello Worldを表示するWebアプリ完成！
他にクラスファイルも設定ファイルも無いし本当に簡単ｗ
ちょっとしたテストとかAPI作るならこれで十分かも。

## 感想
最近Javaアプリケーションとして起動するフレームワークちょいちょいありますね、DropwizardとかSpring Bootとか。(まぁそもそもSpring BootがDropwizardの影響を受けてるんですが)
流行りならDropwizardだし、多機能さならSpring BootなんだろうけどSparkの魅力って一体なんなんだろう？とにかく簡単に使えるってことなんだろうか？書いといてなんだけどｗ
systemctl

# 起動状態のユニット一覧
```
systemctl
```

# 起動していないユニットも含めた一覧
```
systemctl -all
```

# 起動
```
systemctl start アプリケーション.service
```

# 停止
```
systemctl stop アプリケーション.service
```

# 再起動
```
systemctl restart アプリケーション.service
```

# 確認
```
systemctl status アプリケーション.service
```

# 自動起動設定の一覧
```
systemctl list-unit-files
```

# 自動起動の有効化
```
systemctl enable アプリケーション.service
```

# 自動起動の無効化
```
systemctl disable アプリケーション.service
```
Windowsのローカルタイムゾーン設定をtz database名で取得

Windowsのローカルタイムゾーン設定をtz database名で取得しようとすると、結構めんどくさい。

MSDNで検索すると、タイムゾーンを取得するには、`GetTimeZoneInformation`を使えとある。

```c
#include <windows.h>

int main()
{
  TIME_ZONE_INFORMATION tzi;

  memset(&tzi, 0,sizeof(tzi));
  GetTimeZoneInformation(&tzi);

  // #define UNICODEしていなくてもwchar_tで取得される
  MessageBoxW(NULL, tzi.StandardName, NULL, MB_OK);
  return 0;
}
```

これで取得できる名称は「東京 (標準時)」のような文字列で、おそらく中国語のWindowsなら「东京」とかが取得できちゃう、これ誰が得するんだよという糞仕様のAPIなので、これをまず英語名に変換するため、レジストリを検索する。

レジストリの"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"に、英語名のディレクトリ名が並んでいて、その中のStdに、タイムゾーンの日本語名が入っているので、これを使う。

![timezone.png](https://qiita-image-store.s3.amazonaws.com/0/48925/04c0052f-63cd-d57b-f4e2-5336ab8b0e81.png)

```c
#include <windows.h>
#include <stdio.h>

enum {
  MAX_NAME_LEN = 64,
};

static void convert_english_tzname(char *dst, const wchar_t *src)
{
  const wchar_t *path = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones";
  HKEY hKey;
  int i;

  if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
    strcpy(dst, "UTC");
    return;
  }
  for (i = 0; ; i++) {
    wchar_t wbuf[MAX_NAME_LEN];
    DWORD wbuf_size = MAX_NAME_LEN;

    switch (RegEnumKeyExW(hKey, i, wbuf, &wbuf_size, 0, NULL, NULL, NULL)) {
    case ERROR_SUCCESS: {
      HKEY hKey2;
      if (RegOpenKeyExW(hKey, wbuf, 0, KEY_READ, &hKey2) == ERROR_SUCCESS) {
        wchar_t wbuf2[MAX_NAME_LEN];
        DWORD wbuf2_size = MAX_NAME_LEN * sizeof(wchar_t);
        DWORD type;

        if (RegQueryValueExW(hKey2, L"Std", NULL, &type, (BYTE*)wbuf2, &wbuf2_size) == ERROR_SUCCESS) {
          if (type == REG_SZ && wcscmp(wbuf2, src) == 0) {
            WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, dst, 64, NULL, NULL);
            RegCloseKey(hKey2);
            goto BREAK;
          }
        }
        RegCloseKey(hKey2);
       }
       break;
    }
    case ERROR_NO_MORE_ITEMS:
      strcpy(dst, "UTC");
      goto BREAK;
    default:
      break;
    }
  }
BREAK:
  RegCloseKey(hKey);
}
int main()
{
  char cbuf[MAX_NAME_LEN];
  TIME_ZONE_INFORMATION tzi;

  memset(&tzi, 0,sizeof(tzi));
  GetTimeZoneInformation(&tzi);
  convert_english_tzname(cbuf, tzi.StandardName);

  printf("%s\n", cbuf);
  return 0;
}
```
これでやっとタイムゾーンの英語名が取得できたが、もちろんこれで終わりではない。
Windowsのタイムゾーン名とtz databaseのタイムゾーン名の変換は、以下の表を使うとよいが、一対一の対応になっていないことに注意。

http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html

新たに国が独立してタイムゾーンが増えたりしない限り、この表を更新する必要はない。
RuboCop | Style/ParameterLists

# RuboCop | Style/ParameterLists

## 概要

RuboCopの「Style/ParameterLists」警告について。

引数の数をチェックします。
デフォルトは5個より多いと警告を出します。
デフォルトではキーワード引数もカウント対象としますが、
対象外に設定することも可能です。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|CountKeywordArgs|true|キーワード引数を対象にする|○|
|CountKeywordArgs|false|キーワード引数を対象にする|--|

## ParameterLists

各設定値での検証結果をまとめます。

### 検証プログラム

~~~ruby:parameter_lists.rb
def hoge(a, b, c, d, e)
  print a, b, c, d, e
end

def hige(a, b, c, d, e, f)
  print a, b, c, d, e, f
end

def hage(a, b, c, d, e, optional: {})
  print a, b, c, d, e, optional
end
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
ParameterLists:
  Max: 5
  CountKeywordArgs: true
~~~

~~~bash
$ rubocop parameter_lists.rb
Inspecting 1 file
C

Offenses:

parameter_lists.rb:5:9: C: Avoid parameter lists longer than 5 parameters.
def hige(a, b, c, d, e, f)
        ^^^^^^^^^^^^^^^^^^
parameter_lists.rb:9:9: C: Avoid parameter lists longer than 5 parameters.
def hage(a, b, c, d, e, optional: {})
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~

### 実行結果 *Max* を 6 に設定します

~~~yaml:.rubocop.yml
ParameterLists:
  Max: 6
  CountKeywordArgs: true
~~~

~~~bash
$ rubocop parameter_lists.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~

### 実行結果 *Max* を 5, *CountKeywordArgs* を *false* に設定します

.rubocop.yml

~~~yaml
ParameterLists:
  Max: 5
  CountKeywordArgs: false
~~~

~~~bash
$ rubocop parameter_lists.rb
Inspecting 1 file
C

Offenses:

parameter_lists.rb:5:9: C: Avoid parameter lists longer than 5 parameters.
def hige(a, b, c, d, e, f)
        ^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
pythonの辞書で，存在しないキーにアクセスされたら任意の値で初期化する

```py
import collections
word_count = collections.defaultdict(int)
for word in ["foo", "bar", "foo", "foobar"]:
    word_count[word] += 1
print word_count
# >>> defaultdict(<type 'int'>, {'foobar': 1, 'foo': 2, 'bar': 1})
```

辞書型にどんなキーが与えられるかわからない場合に，存在しないキーだったらfooで初期化する，という状況はよくあり，collections.defaultdictがそれを満たしてくれます．`defaultdict(int)`とすると↑のように初めてのアクセスで0に初期化してくれるわけですが，これは結局どういうことかというと

```py
import collections
word_count = {}
for word in ["foo", "bar", "foo", "foobar"]:
    if not word in word_count:
        word_count[word] = int()
    word_count[word] += 1
print word_count
```

これと同じ処理になるわけです．結局引数なしの関数で何らかの値を返すものであればいいわけですね．だからlambdaを使って`defaultdict(lambda: [])`とかしてやると結構わかりやすい．**追記: この空リストを生成する例だと，lambdaを使うまでもなくlist()を渡したほうが読みやすいです．lambdaを使うべきは下のようなもう少し複雑な例．**



さっきの例を発展させると，各アルファベットの出現頻度を数えるとかもできます．

```py
import collections
word_count = collections.defaultdict(lambda: [0 for i in range(26)])
for word in ["foo", "bar", "foo", "foobar"]:
    for chara in word:
        word_count[word][ord(chara)-ord("a")] += 1
print word_count
# >defaultdict(<function <lambda> at 0x10e5147d0>, {'foobar': [1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 'foo': [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'bar': [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]})
```

defaultdict()自体もdefaultdictを返すわけで，`defaultdict(defaultdict(lambda: {"name": "null", "age": 20}))`とかももちろんできます．
enthumble（キーカスタマイズ例）

MMOで使い慣れてるWASD型です。

他の方の設定を参考にしつつ、まだまだ試行錯誤中＾＾；

[HowToUse]
Check=http://jp.enthumble.com
Name=enthumble version 3.0
[KEY]
Space={Enter}
Muhenkan={Esc}
Henkan={Esc}
Hiragana={}
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
F23={}
F24={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={F7}
8={vkF2sc070B}{vkF3sc029}(){left}
9={F9}
0={F10}
-={F11}
Hat={F12}
\={}
Q={Backspace}
W={up}
E={delete}
R=^r
T=^t
Y=^y
U=^u
I=^i
O=^o
P=^p
@={}
LB={}
A={Left}
S={down}
D={right}
F=^f
G=^g
H=^h
J=^j
K=^k
L=^l
Semicolon={}
:={}
RB={}
Z={Backspace}
X={delete}
C=^c
V=^v
B=^b
N=^n
M=^m
,={}
.={}
/={}
Backslash={}
Up={ASC 33194}
Down={ASC 33195}
Left={ASC 33193}
Right={ASC 33192}
LButton={ctrl down}{PgUp}{ctrl up}
MButton={MButton}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Bacspace={}
Enter={}
Escape={}
Hankaku={}
Tab={}
Capslock={}
Lwin={}
Rwin={}
Insert={}
jsTreeの使い方


仕事でjsTreeを使う機会があったのでその使い方。
FuelPHPに組み込んでの利用なのでその点ご留意ください。

## 準備
 - [jsTree](http://www.jstree.com/)をダウンロードする
 - dist/jstree.js、libs/jquery.jsをjsフォルダへコピー
 - dist/themes/default/の中身をcssへコピー
 - demo/filebrowser/file_splite.pngをimgへコピー

今回はdemo/filebrowserを改変して利用しますので、そのための設定をしています。ファイルのコピーを行ったらindex.phpをエディタに開きます。

index.phpより
 - fsクラスをclasses/fs.phpにコピー
 - &lt;html&gt;より上のPHP部分をコントローラーにコピー
 - &lt;html&gt;から下の部分をビューにコピー

## DB
今回用意したDBは以下のとおり。
テーブル名:categories
カラム:
id integer primary key auto_increment,
name varcharてきとう,
grade integer,
parent integer

カテゴリで階層を作りたかったので、grade＝階層ランクとparent＝親カテゴリIDを入れるカラムを設定しました。

## コンテキストメニュー
view側のjQuery部分を編集。

```javascript
"contextmenu":{
    "items": function($node) {
        var tree = $("#tree").jstree(true);
        return {
            "addition": {
                "separator_before": false,
                "separator_after": false,
                "label": "追加",
                "submenu": {
					"addition_large_category" : {
					"separator_after" : false,
					"label" : "フォルダ",
					"action" : function (data) {
						var inst = $.jstree.reference(data.reference),
						obj = inst.get_node(data.reference);
						inst.create_node(
							obj, {
								type : "large_category",
								text : "New folder"
							},
							"last",
							function (new_node) {
								setTimeout(function () {
									 inst.edit(new_node);
								},
								0);
							});
						}
        			},
					"addition_middle_category" : {
					"separator_after" : false,
					"label" : "ファイル",
					"action" : function (data) {
						var inst = $.jstree.reference(data.reference),
						obj = inst.get_node(data.reference);
						inst.create_node(
							obj, {
								type : "meddle_category",
								text : "New folder"
							},
							"last",
							function (new_node) {
								setTimeout(function () {
									 inst.edit(new_node);
								},
								0);
							});
						}
        			}
				},
            },
            "rename": {
                "separator_before": false,
                "separator_after": false,
                "label": "名称変更",
                "action": function (obj) {
                    tree.edit($node);
                }
            },
            "remove": {
                "separator_before": false,
                "separator_after": false,
                "label": "削除",
                "action": function (obj) {
                    tree.delete_node($node);
                }
            }
        };
    }
},
```

コンテキストメニューの設定はおよそここから読み取れるかと思います。
サブメニューの作り方、作成タイプなど。

今回はドラッグ＆ドロップによるコピーや移動を省きたかった（めんどうだった）ため、以下部分を修正（同ファイル）

```javascript
'plugins' : ['state','dad','sort','types','contextmenu','unique']
```

どうやらdadがそれらしいのでここからdadを削除。

思いの外長くなったので此処から先は別記事で。長い記事は嫌い。
views下のファイルはこれ以外ほとんどいじることがないです。
次はコントローラー側の記述に触っていきますヽ(´@ω@｀)ﾉ
RubyでGmailのSMTPサーバを使ってメールを送信する


###Rubyコード

以下のコードでGmailのSMTPサーバ経由でメールが送信できる。

```ruby
require 'mail'

mail = Mail.new

options = { :address              => "smtp.gmail.com",
            :port                 => 587,
            :domain               => "smtp.gmail.com",
            :user_name            => '<username>@gmail.com',
            :password             => '<password>',
            :authentication       => :plain,
            :enable_starttls_auto => true  }		
mail.charset = 'utf-8'
mail.from "from@example.com"
mail.to "to@example.com"	
mail.subject "メールタイトル"
mail.body "メール本文"
mail.delivery_method(:smtp, options)
mail.deliver


```

###参考URL

http://stackoverflow.com/questions/12884711/how-to-send-email-via-smtp-with-rubys-mail-gem

https://github.com/mikel/mail

http://www.redmineblog.com/articles/setup-redmine-to-send-email-using-gmail

https://github.com/mikel/mail/wiki/Sending-email-via-Gmail-SMTP
Chromeの拡張機能でMarkdownのリンクをすぐ作成できるようにする。

Chromeの拡張機能を『Creat Link』を使った、Markdownでリンク付きのタイトルを簡単に作る設定を説明します。

Formatsの表にあるFormatに下記のコードを追加する。

```
[%text%](%url% "%text%")
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/49056/3bd353a8-636e-6392-9cda-093be2eaf40a.png)


ページを右クリックしてCreate Linkで追加した先程の項目を選べば、Qiitaのリンクで使える記述が簡単に作れる。(下記はリンクの例)

[Qiita - Qiita](http://qiita.com/Qiita "Qiita - Qiita")


![2.png](https://qiita-image-store.s3.amazonaws.com/0/49056/fc8643d9-1ce3-fd23-85ec-4352772c8eb1.png)

ちなみにMarkdawnでリンクを作りには下記の記述で行う。

<pre>[リンクテキスト](URL "タイトル")</pre>
<pre>[Qiita](http://qiita.com "Qiita")</pre>
と書くと下記のようにリンク付きのタイトルが作成できる。

[Qiita](http://qiita.com "Qiita")
AIXで1秒未満のsleepを実施


##背景
業務でAIXを使用しており、sleepコマンドを利用したshellスクリプトで1秒未満のループをさせたい処理があった。

##現状
しかし、AIXのsleepコマンドは1秒未満の設定ができない。


```sh
sleep 0.1  # AIXのsleepコマンドだと1秒未満の設定が出来ない
```

##対応策
1秒未満のsleepを実施するにはperlを使う。
「-MTime::HiRes」は標準モジュールで存在してた。


```sh
perl -MTime::HiRes=sleep -e 'sleep(0.1)' # 1秒未満の設定可能
```

##補足
perlの標準モジュールを把握しとこう。
他の方法を知っている方がいたら教えて下さい。
それよりもkobito便利ですね。
もっと早く使えば良かった。
TeX文書の編集中、白バックで目が疲れる


emacsでもなんでも、TeXソースの編集画面は黒バックで、表示チェックしてるpdfの文章は白バックって方いませんか？
私は、それでした。
pdfも黒バックにして、目の疲れを軽減したいということで、pdfを黒バックにするという、超小技。

TeXソースに次の二行を仕込む。

```latex
\usepackeage{pagecolor}
```

としておいて、

```latex
\pagecolor{black!100}\color{white}
```

をどこかに入れておけば、そこ以降は黒バックになります。
`100`の部分を変えれば、ソフトに黒目のバックになってくれます。

図とかは、黒バックで作成し直さないといけないので、諦めました。
ほんとは、dviからpdfへの変換時に、反転処理できればいいのですが、難しそうなので、今後の課題に。

では、目の健康を！
運用ツールはシェルなので非エンジニアには引継げません！…ってところはJenkinsを運用ツールにしたらいいんじゃない？（案）



# 背景

ldapユーザの登録とか、ちょっとしたDBのデータ確認とか
ldapadminやらmysqladminやら入れていればいいんだけど
わざわざ個別にGUIツール入れるのも面倒で使ってなくて
ほとんどシェルでOpsしちゃってる場合。

大抵が「あーコマンド使えないと厳しいですねー」
「あー社員じゃないとログインさせられないですねー」
「あー構成知らないとできな(ry」

で、自分で頑張る。そんな人達へ贈る。

# それ、Jenkinsでどう？（あくまで案）

Jenkinsだとパラメータ設定できるから
たとえば `hoge.sh username password` みたいなシェルは
ジョブとして登録しておくと、エンジニアじゃなくても
実行しやすいっ！（はず

## ジョブ作る

矢印のとこ押してー

![j0001_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/4866341a-c492-98e4-426c-388df58196c3.png "j0001_.png")

---

入力してー
`フリースタイルプロジェクトのビルド` を選択してー

![j0002_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/ba8e9f27-fba5-9c66-6349-3d235cb55271.png "j0002_.png")

---

ビルドのパラメータ化にチェックを入れるとー
パラメータが使用できるようになーる。

![j0003_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/d8d9d361-2a71-605d-cf95-14eab707fa07.png "j0003_.png")

---

テキストとか

![j0004_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/aa1f4ec5-199d-b80e-3acb-60abf1dd2a67.png "j0004_.png")

---

![j0005_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/5e10fa7e-cec4-e632-db9a-ff52fcc5022a.png "j0005_.png")

---
パスワードなんかも。

![j0006_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/bf9d2c9f-b3c8-e828-6769-53b7bb2840e1.png "j0006_.png")

---

`ビルド` で `シェルの実行` を選ぶと、シェルスクリプトがかけるようになる。

![j0007_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/8b2944da-0276-3a61-136f-7138ec3f171e.png "j0007_.png")

---

今まで使っていたシェルなんかを
ココに転記して、 `$1` とか `$2` とかを
さっき設定した `username` とか `password` に
変更して、
`適用`(1)
そして
`保存`(2)
※適用押さないとシェルの中身が保存されなかった。

![j0008_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/e298d32c-e377-b788-8c9f-fb66920c221b.png "j0008_.png")

---

で、ダッシュボードに戻って、ジョブが登録されているのを確認する。

![j0009_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/e45594ad-54dd-fc08-417f-74687406e2ec.png "j0009_.png")

---


## ジョブ動かす

この、いかにも「ジョブ動かす！」なボタンをクリック！

![j0101_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/963136dc-a791-1d5e-10ef-8fa21a07a9ac.png "j0101_.png")

---

こんなかんじで、初期値が設定されているので…

![j0102_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/078b263b-4063-60f1-f8e8-b444cd14dbe0.png "j0102_.png")

---

設定を入力して `ビルド` ！

![j0103_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/cd37a19d-5938-a7eb-745a-8ef327b437ef.png "j0103_.png")

---

## ジョブ結果見る


![j0201_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/45d75dd1-cdda-a4aa-2ef4-7ca9c160a0be.png "j0201_.png")

---
`コンソール出力` から、シェル実行時の標準出力を確認できる。

![j0202_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/c9ecb35e-ca16-25e9-3d15-7ccdc3552317.png "j0202_.png")

---
パラメータが使えているのが分かる。

![j0203_.png](https://qiita-image-store.s3.amazonaws.com/0/17518/8df08954-6f70-e32e-67c8-3ad01bf7357f.png "j0203_.png")

---



# まとめ

teratermマクロ組んだり
コピペテキスト作ったり
そもそも自分で頑張ったり。
そんなことしなくても良さそうな感じがしてきた…！
CakePHPで会員制サイト構築のプラグイン`CakeDC/users`を試す




こちらの
[CakeDC Users Plugin](https://github.com/CakeDC/users.git)
を試します。
間違っているかもしれませんが。。

`Docs/Home.md`をみて進めます。

#Requirements

> * CakeDC Utils plugin (Optional but recommended)
> * CakeDC Search plugin (Optional but recommended)

と記載されているpluginは一旦保留としておきます。
（あとで必要となった際に導入することにします）


#Installation
最初にドキュメントのInstallationに合わせてインストールします。
>To install the plugin, place the files in a directory labelled "Users/" in your "app/Plugin/" directory.

と記載がありますので、
もし、CakePHPプロジェクトをgitで管理しているならば
Pluginを`git submodule`とするのがよいでしょう。

```
git submodule add git@github.com:CakeDC/users.git app/Plugin/Users
```

または、

```
git clone https://github.com/CakeDC/users.git app/Plugin/Users
```

でインストールします。


#Configuration
次にConfigurationです。


##Email Templates 
`/app/Plugin/Users/View/Emails/text`
にtemplateがあるので、それを以下にコピーして編集します。
`/app/View/Plugin/Users/Emails/text`

今のところは編集が要らないので、コピーもしません。

##Disable Slugs
Utilsプラグインを入れていないため、保留。


##Email configuration
メール送信関連の設定です。
まず、`/app/Config/email.php.sample`を`email.php`にリネームします。
そして、`/app/Config/bootstrap.php`に

```bootstrap.php
Configure::write('Users.emailConfig', 'default');
```

を追記します。
`default`の場合は、CakePHPでメールを送信します。デフォルトではローカルサーバのMTAから送信することになるでしょう。
`smtp`とすれば、`/app/Config/email.php`の`$smtp`を参照しますので、SMTPサーバの設定を指定する必要があります。


`App.defaultEmail`は任意のメールアドレスを設定します。

```bootstrap.php
Configure::write('App.defaultEmail','noreply@example.com');
```

##Roles Management

権限関連の設定です。
デフォルトを置き換えれるということのようですので、このままにしていきます。

##Enabling / Disabling Registration

ユーザ登録を使えるようにするかどうかなので、デフォルトのまま有効とするため、とりあえずはコメントアウトにして追記します。

```/app/Config/bootstrap.php
// Disables the registration
// Configure::write('Users.allowRegistration', false);
```

##Configuration options
ここでの設定は、一旦デフォルトのままでよいので、何もしない。

```
Users.disableDefaultAuth
```
デフォルトのユーザ認証を使用しないかどうか。
ここでは、デフォルトのままとするので、設定しないか`false`と設定する。


```
Users.allowRegistration
```
上記の通り、ユーザによるユーザ登録を許可するか否かなので、設定しないまたは`true`とする。



#Routing

##Routing

`/app/Config/bootstrap.php`に、Usersプラグインを読み込むために以下を追記します。

```bootstrap.php
CakePlugin::load('Users', array(
    'routes' => true
));
```

##Changing the routes

こちらは変更なしで。

#Localize
日本語にしたいため、

```
$ cp -rp /app/Locale/eng /app/Locale/jpn
$ cp -p /app/Plugin/Users/Locale/users.pot /app/Locale/jpn/LC_MESSAGES/
```

として、`/app/Locale/jpn/LC_MESSAGES/users.po`を編集します。`msgstr`に対応する日本語を記入して保存します。
ここではとりあえずのサンプルとして一部を書き込んでおきます。


#データベース準備
ユーザ管理のためのデータベースを構築します。
*CakeDC Users Plugin*にはSchemaが用意されています。

```
$ app/Console/cake schema create --name Users -p Users
```


#動かしてみる

ひと通りの設定が出来たはずなので、実際に動かしてみます。

* ログインページ
http://localhost/login

先に日本語化しているため、日本語で表示されるはずです。


#Viewの変更

`/app/Plugin/Users/View/Users/add.ctp`
を
`/app/View/Plugin/Users/Users/add.ctp`へコピーして編集します。

編集の例として、”利用規約”の部分が、日本語化すると、
"同意します。[利用規約]()"
みたいになって違和感があったため

```add.ctp
31| 'label' => sprintf(__d('users', 'I have read and agreed to %s'), $tosLink )));
```

と３１行目を変更して、
`/app/Locale/jpn/LC_MESSAGES/users.po`
の

```users.po
msgid "I have read and agreed to %s"
msgstr "%sに同意します。"
```

としてみます。

- ユーザ登録ページ http://localhost/users/add

にアクセスすると、利用規約のところが、
"[利用規約]()に同意します”
的になります。
Markdown 記法についてワンランク上を目指す (1)

Qiita のアカウントを持ってる人は知ってると思うんですが、Qiita のエディタに Markdown のヘルプがついてます。

http://qiita.com/Qiita/items/c686397e4a0f4f11683d

私がこれから言いたいのは上記を読めとかじゃなくて、長文エントリとか書くときに手元のエディタとかで書いてからコピペしてプレビュー確認とかすると思うんですけど、そのエディタで書いてるときのプレビューを小賢しくやりたいよね？ってことです。

んで、まぁ、今回はその初回なわけですけど、とりあえず幾つかポインタだけ貼って今回は終了。

* [脱GitHub初心者を目指す人のREADMEマークダウン使いこなし術](http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/markdown-skills-for-github-beginners/)
* https://github.com/github/markup
* https://help.github.com/articles/github-flavored-markdown
* [GitHub Flavored Markdown viewer plugin for Eclipse](http://marketplace.eclipse.org/content/github-flavored-markdown-viewer-plugin-eclipse)

私としては Eclipse でプラグインがあったので第１段階クリアかなと思うんですけど、そんなこと言ってると Xcode 一筋の人たちが発狂しちゃうので、まぁなんか考えたいなと。

つづく。
Gravatar API　の使い方。

#Gravatar API　の使い方。

##Gravatarって。

オンライン上に自分のプロフィールを置いとくサービスです。SNSではありません。
ここ[http://en.gravatar.com/] で、自分のプロフィールを設定すると、APIから情報を取得できます。

[Github](https://github.com/)とか[Wordpress](http://wordpress.org/)とか[Qiita](http://qiita.com/)とかで使われてます。

Gravatarと連携してるサービスで、プロフィール画像を設定するのが楽になったりします。

こんな感じ(githubとアイコンが同じでわかりづらいですが。。)

![Screen Shot 2014-07-15 at 20.57.05.png](https://qiita-image-store.s3.amazonaws.com/0/48681/f8ea959d-e2fa-2a01-72e4-e43445ad2ebc.png)


##Gravatar API。

Gravatar API は簡単に使うことができます。
　
**ステップ１**：対象URLのmd5のハッシュ値を用意しよう。

md5ハッシュを生成する前に２つだけ、やることがあります。

- 前後の空白を消しましょう。
- 全て小文字に変換しましょう。

PHPだとこんな感じ。他の言語のサンプルも、[ドキュメント](http://en.gravatar.com/site/implement/)に書かれてます。

```
echo md5( strtolower( trim( "MyEmailAddress@example.com " ))); 
// "0bc83cb571cd1c50ba6f3e8a78ef1346"
```
　
**ステップ２**：APIを使ってみよう。

プロフィール画像取得<sub><a href="#1">1</a></sub>
http://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50
サイズも変更可能: http://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50?s=400

プロフィール情報をJSON形式で取得
http://www.gravatar.com/205e460b479e2e5b48aec07710c08d50.json

自分のプロフィールページも作成できます。
http://www.gravatar.com/205e460b479e2e5b48aec07710c08d50
　
　
SSL上で使ったりとか、[ドキュメント](http://en.gravatar.com/site/implement/)にもっといろいろ書かれてます。　

プロフィールの一元管理ができて素敵かもしれません。もっと流行れば。。。

(｀･ω･´)ゞ
　
　
<hr />
<a name="1">1.</a> 公式ページのサンプルを使っています。
2つの環境の間でファイルに差異がないことを確認する

shasumコマンドというのがある。環境によってはsha1sumだったりするかも。

使い方の例

```bash
shasum *.txt
```

実行結果

```
ff87bd6c2be12adae7a4e0e4eb00944b25b67c0e  test_1.txt
027d641e1a50c12b6b4ccc5ad29a9dc656a8cad5  test_2.txt
4b089403abbc290d14f77327e5406e45047c8b67  test_3.txt
```

結果をファイルに保存しておけば, 2つの環境の間でファイルに差異がないことを確認にも使える

```
shasum *.txt > test.sha1
shasum --check test.sha1
```

結果

```
test_1.txt: OK
test_2.txt: OK
test_3.txt: OK
```

差分があれば教えてくれる

```
test_1.txt: OK
test_2.txt: FAILED
test_3.txt: OK
shasum: WARNING: 1 of 3 computed checksums did NOT match
```

終了コードも変わるのでスクリプトからも使える

```
echo $?
```

```
1
```
OSXでAWS Elastic BeanstalkにRailsアプリをデプロイした

基本は以下ページの通り。

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html



https://pip.pypa.io/en/latest/installing.html からget-pip.pyをダウンロードし、以下コマンドでpipとbotoをインストール

```
sudo python get-pip.py

sudo pip install boto
```


AWS management consoleの
Software Configuration -> Environment Propertiesに行き、以下をセットする。

```
Property name : SECRET_KEY_BASE 
Property value : rake secretの実行結果
```

eb initでインスタンスの設定をする。

設定後git aws.pushでデプロイできる。

もしくは以下の通りにzipファイルを作成しそれをアップしてもデプロイできる。
git archive --format=zip HEAD > archive.zip

RDSでmysqlを利用する場合のconfig/database.yml

```
production:
  adapter: mysql2
  encoding: utf8
  database: <%= ENV['RDS_DB_NAME'] %>
  username: <%= ENV['RDS_USERNAME'] %>
  password: <%= ENV['RDS_PASSWORD'] %>
  host: <%= ENV['RDS_HOSTNAME'] %>
  port: <%= ENV['RDS_PORT'] %>
```

アプリはec2の以下にデプロイされる模様
/var/app/ondeck

RDS
新規にparameter groupを作成し、以下の値をutf8に変更する。
TODO 確認
```
character_set_database
character_set_client
character_set_connection
character_set_results
character_set_server
```
skip-character-set-client-handshakeを1に変更
該当インスタンスのparameter groupを作成したものに変更。

ec2からRDSに接続するコマンド
```
mysql -h $RDS_HOSTNAME -u $RDS_USERNAME -p $RDS_DB_NAME
```

作成済みのDBの文字コードを変更
```
alter database ebdb character set utf8;
```
http://blog.serverworks.co.jp/tech/2013/03/12/rds_on_beanstalk/
Facebookへの投稿をFacebook SDKとSocial.frameworkで比較

#はじめに
気づいて、すぐわすれそうなこと、です。

アプリからの投稿を行う場合はFacebookの審査を受ける必要がある
との情報から、Socialframework使えば問題ないとおもったので
念のため確認しました。

（追記：2014.7.23）
FBアプリを登録して使えるようにするところの手順を追記しました。
FB仕様やフォーマットがコロコロ変わるのはいつものことなので参考程度におねがいします。

#設定
##Facebookアプリの作成

新規にアプリを作成
https://developers.facebook.com

![スクリーンショット 2014-07-23 20.23.31.png](https://qiita-image-store.s3.amazonaws.com/0/12362/c18a6272-19f5-1057-f97c-e667e55aacd8.png)

怒られました。Display Nameを多少変更します。
![スクリーンショット 2014-07-23 20.23.57.png](https://qiita-image-store.s3.amazonaws.com/0/12362/7ad27594-1ba3-8bf0-db4c-9924dd74c97f.png)

登録出来たようです。開発版です。
![スクリーンショット 2014-07-23 20.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/12362/a33b3037-1bc8-9012-6c4b-d2f8bc21d76c.png)

公開版にするにはメールアドレスがいるとのこと
![スクリーンショット 2014-07-23 20.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/12362/00e34f4a-560a-3dc3-3462-b92cfd3673dc.png)

Contact Emailを追加しました
![スクリーンショット 2014-07-23 20.35.16.png](https://qiita-image-store.s3.amazonaws.com/0/12362/19132ba3-20d3-c8e1-af02-0e5ec3c73e65.png)

公開モードになりました。
![スクリーンショット 2014-07-23 21.02.17.png](https://qiita-image-store.s3.amazonaws.com/0/12362/9019c854-8816-c508-a852-2d81cb4470c7.png)

##Facebook SDK
Facebookアプリの作成と設定を行います。

![スクリーンショット 2014-07-15 20.49.06.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8d96c721-e60d-ab52-225d-91f303dc0d8f.png)

通常投稿の機能には申請が必要なpermissionが含まれています。
大まかすぎますが、この状態でもAdministratorな権限であれば投稿ができました。

##Social.framework
![Screenshot 2014.07.15 20.57.19.png](https://qiita-image-store.s3.amazonaws.com/0/12362/08ecb95c-0600-8337-b24f-f7a5818f4a1a.png)

設定からログインするIDとパスワードを設定しておきます。

#アプリ
こちらを利用しました。

##Facebook SDK
https://developers.facebook.com/docs/ios

##Social.framework
https://github.com/iosdevtutorials/SocialFrameworkDemo

#投稿内容
##Facebook SDKをつかったiOSアプリから

![スクリーンショット 2014-07-15 20.38.05のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/12362/09b23024-cf70-fab3-22fd-96cadf13380a.png)

こちらはFBアプリでの設定とアプリ本体への設定が必要です

##Social.frameworkをつかったiOSアプリから

![スクリーンショット 2014-07-15 20.37.54.png](https://qiita-image-store.s3.amazonaws.com/0/12362/f0e1b910-b0b3-e94e-22b2-d1b90c419ab2.png)

#さいごに
Facebook SDKをつかった実装でないとアプリ名がでないことを除くと
iOSの場合はSocial.frameworkを使えば、Facebookの申請は回避できそうです。
ただ、投稿したアプリの名前にこだわるのであれば
Facebookアプリの申請も合わせての日数がかかることを考慮する必要があります。
Sublime Text で、空白を可視化する

Sublime Text で全角空白を可視化する記事
http://keidrun.tumblr.com/post/73033053898/tips-sublime-text-sublime-text-3
があって、それは大いに参考になった。

だけど、怪しい空白は全角空白だけではない。

というわけで、trailing_spaces_regexp の設定は、ちと長いけど

```JSON:trailing_spaces.sublime-settings
"trailing_spaces_regexp": "\u0085|\u00a0|\u1680|\u180e|[\u2000-\u200a]|\u2028|\u2029|\u202f|\u205f|\u3000|[ \t]+"
```

こうすると良いと思う。

まあ、全角空白以外の怪しい空白に出会うことはほとんどないとと思うけどね。

各文字コードは下表の通り：

|文字コード|意味|
|:--|:--|
|U+0085|NEXT LINE (NEL)|
|U+00A0|NO-BREAK SPACE|
|U+1680|ハイフンに見えるけど、「オガム文字」の空白らしい|
|U+180e|モンゴル語の母音のなんからしい。|
|U+2000〜U+200a|いろんな幅の空白|
|U+2028|行区切り|
|U+2029|段落区切り|
|U+202f|NARROW NO-BREAK SPACE|
|U+205f|数学用の空白らしい|
|U+3000|我らが全角空白|

U+0085, U+2028, U+2029 は改行になると思うけど、気にせず入れた。

空白文字の選出は

```ruby
(0x21..0xd7ff).select{ |x| /[[:space:]]/===("%c"%x) }.map{ |x| "%04x"%x }
```

で行った。
Phalcon\Mvc\User\Component. Plugin, Module の違いについて（意訳）

以下は、[Difference between Phalcon\Mvc\User\Component. Plugin, and Module?](http://forum.phalconphp.com/discussion/1400/difference-between-phalcon-mvc-user-component-plugin-and-module-#C4917) を意訳したものです、翻訳力に欠ける部分がありますが、訂正などご指摘していただければと思いますので、よろしくお願いします。

## モジュール - Phalcon\Mvc\User\Module
自己完結型で、再利用可能な、クラスのコレクション - モデル、ビュー、コントローラを含む - アクションの特定のセットを実行するために作成しました。
例えば、それ自身でMVC構造を有する管理モジュールは、さまざまなプロジェクトで使用することができる。

## コンポーネント - Phalcon\Mvc\User\Component
独立したクラスやフレームワークやアプリケーションの基本機能を拡張するために設計された一連のクラス。
例えば、私は設定で利用可能なロケールの配列に基づいて、ユーザの最高のロケールを見つけ Phalcon のロケールクラスを作成しました。
私は、Phalcon\DI\Injectable を拡張したが、しかし、おそらく Phalcon\Mvc\User\Component を使用すべきです。
私はいずれにしてもロジック（おそらくpre.dispatchリスナー）を追加する場合、私はそれに切り替えます。

## プラグイン - Phalcon\Mvc\User\Plugin
既存のアプリケーションやフレームワークのコンポーネントに制限され、特定の機能を追加する。
Phalcon\Mvc\User\Plugin が本当に必要かどうか、私はちょっと思ったんだけど、ほとんどのプラグインは、"plugging into"(差し込む) とはクラスを拡張する。
Phalcon\Tag プラグインを作っている場合、Phalcon\Mvc\User\Plugin ではなく、Phalcon\Tag を拡張する。
(http://docs.phalconphp.com/en/latest/reference/tags.html#tag-service) 
私は scrypt ハッシュプラグインを書いたときには、Phalcon\Security クラスを拡張した。
Kobitoからログアウトする


# How to
ログアウト機能が無いため，手動で以下操作をする必要がある

1. ファイルを削除する
```
$ rm ~/Library/Preferences/com.qiita.Kobito.plist 
```
2. キーチェーンアクセスを起動し，com.qiita を削除する

# Env
- 1.9.2

# See Also
- https://twitter.com/kobitoapp/status/316869402177986560
RailsのActive Recordで指定した順序通りに取得したい


## 概要
Redis等のKVSでランキングロジックを持っていて、
その詳細データはMySQL等のRDSで持つことが少なからずあると思う。
kvsで取得した複数のidをactive_recordで指定した順序通りに取得したい。

ただしそのままにやると…

```rb
pry(main)> array = [1, 6, 3, 10, 7]
=> [1, 6, 3, 10, 7]

pry(main)> User.find(array).collect(&:id)
=> [1, 3, 6, 7, 10]
```
順序が変わって出力されてしまう。
それを解決する方法をまとめてみた。

## 内容
### 結論は
```rb
Something.find(array_of_ids).index_by(&:id).slice(*array_of_ids).values
```

### 例はこんな感じ
```rb
pry(main)> array = [1, 6, 3, 10, 7]
=> [1, 6, 3, 10, 7]

pry(main)> User.find(array).index_by(&:id).slice(*array).values.collect(&:id)
=> [1, 6, 3, 10, 7]
```

### 簡単に解説していく
#### index_by(&:id)
```rb
# index_byを使うことでこの形式ではなく
[
  #<data1>, 
  #<data2>, 
  #<data3>, ...
]
# この形式になる
{ 
  :id => #<data1>, 
  :id => #<data2>, 
  :id => #<data3>, ... 
}
# 上記の例だと下記のようになる
{ 
   1 => #<user1>, 
   3 => #<user3>, 
   6 => #<user6>, ... 
}
```

#### slice(*array)
```rb
# sliceを使うと指定したkeyのhashを返す。
# 配列をそのまま渡してももちろんダメ
hash = {1 => "1", 2 => "2", 4 => "4"}.slice([4,1])
=> {}

# 下記の用に引数展開で渡してあげる
hash = {1 => "1", 2 => "2", 4 => "4"}.slice(*[4,1])
=> {4=>"4", 1=>"1"}

# なので、これでも意味は同じ
hash = {1 => "1", 2 => "2", 4 => "4"}.slice(4,1)
=> {4=>"4", 1=>"1"}
```

#### values
```rb
# そしてそのhashの値だけをとってくる。
pry(main)> hash = {1 => "1", 2 => "2", 4 => "4"}.slice(4,1)
=> {4=>"4", 1=>"1"}

pry(main)> hash.values
=> ["4", "1"]
```

こんな感じでやれば指定した順序どおりに取得することが出来る。

## 参考
http://stackoverflow.com/questions/1680627/activerecord-findarray-of-ids-preserving-order

http://blog.livedoor.jp/sasata299/archives/51316965.html

http://d.hatena.ne.jp/satake7/20090118/p1
rails でモデルクラスとそのカラムの一覧を出力するスクリプト

モデルクラスとそのカラム名の一覧が欲しかったので作った。


```generator.rb
def self.column_names()

  for table_name in ActiveRecord::Base.connection.tables
                                                                                                                                                              
    model_object = table_name.classify.constantize

    pp"---------"
    pp model_object.name

    for column_name in model_object.column_names
      pp "  %s"%column_name
    end

  end
end

```

結果
```
"---------"
"Activity"
"  id"
"  created_at"
"  updated_at"
.
.
.
```






参考URL
[Model クラスの一覧を取得する方法](http://d.hatena.ne.jp/benikujyaku/20100801/1280659924)
[Rubyで文字列をクラス名として扱うには？](http://qa.atmarkit.co.jp/q/75)
Vagrantで作るJenkins

# Jenkinsを構築する
Jenkins自体のインストールはとても簡単ですが、Vagrantfile作ったので残しておきます。

# 事前準備
事前に、Vagrantをインストールしておいてください。
[Windows8 - Windowsに開発環境を構築する - Qiita](http://qiita.com/morozumi_h/items/bd373a1e4ad97e4667bc)
[環境構築 - Macに開発環境を構築する - Qiita](http://qiita.com/morozumi_h/items/d0967f5861154b92c26c)

# Jenskins構築

## Box作成

今回は、CentOS6.5上に構築します。

```
$ vagrant box add jenkins https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ vagrant init jenkins
```

## Vagrantファイルを修正

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

$script = <<SCRIPT
  sudo yum install -y wget
  sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
  sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
  sudo yum install -y jenkins
  sudo yum install -y java-1.7.0-openjdk.x86_64
  sudo chkconfig jenkins on
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "jenkins"
  config.vm.network "forwarded_port", guest: 8080, host: 8081
  config.vm.provision "shell", inline: $script
end
```

## Vagrantから仮想マシンを立ち上げます

```
$ vagrant up
```

vagrant up を実行すると、初期化スクリプトが走り、Jenikinsをインストールします。インストールが終わったら、イメージを再起動しましょう。
※もっといい方法があるかもしれません。。。

```
$ vagrant halt
$ vagrant up
```

## アクセスします 
http://localhost:8081/

# まとめ
BOXイメージを追加して、VargrantFileを修正するだけでJenkinsのインストールが終わりました。とても簡単ですね。

config.vm.box_url を追加して、BOXのDLも同時にやったほうがよかったかも。。。
Yahoo!ニュースWeb APIの終了について

お世話になっております。

このたび、Yahoo!ニュースWeb APIが2014年6月30日で提供を終了されたとの事で、
Yahoo!ニュースAPIのデータ取得ができなくなっていますが、

その代替として、YahooニュースRSSからデータを取得し、自身のホームページに
その内容(Yahooニューストピックス)を表示しても宜しいのでしょうか？

また、それが可能な場合、以下のWebAPIで行っていたクレジット表示
http://developer.yahoo.co.jp/attribution/
はどうすれば良いのでしょうか？

また、直近でYahoo!ニュースWeb APIが新しく復活する予定などはありますか？

以上、ご回答よろしくお願いいたします。
Dartで「TypeScriptでメソッドチェーンを書くとき、戻り値の型に気をつけないと継承でハマる」を解決してみた

mzsmさんの[「TypeScriptでメソッドチェーンを書くとき、戻り値の型に気をつけないと継承でハマる」](http://qiita.com/mzsm/items/cdba846700b7f66aad2d)という記事が面白かったので、Dartならどう書けるかという対抗記事（謎）を書きます。

# 基底クラス
クラス名は BaseCalcとします。足し算と引き算だけ実装します。

```dart:calc.dart
class BaseCalc {
  num number;

  BaseCalc(this.number);

  void plus(num n) {
    this.number += n;
  }

  void minus(num n) {
    this.number -= n;
  }

  num showResult() => this.number;
}

void main() {
  var c = new BaseCalc(10)
    ..plus(15)
    ..minus(5)
    ..plus(10);
  print(c.showResult());
  // 30
}
```

# 継承して拡張
BaseCalcを継承して掛け算とわり算も実装したNewCalcを定義します。

```dart:calc.dart
class BaseCalc {
  num number;

  BaseCalc(this.number);

  void plus(num n) {
    this.number += n;
  }

  void minus(num n) {
    this.number -= n;
  }

  num showResult() => this.number;
}

class NewCalc extends BaseCalc {

  NewCalc(num initial) : super(initial);

  void multiply(num n) {
    this.number *= n;
  }

  void divide(num n) {
    this.number /= n;
  }
}

void main() {
  var c = new NewCalc(10)
    ..plus(15)
    ..minus(5)
    ..multiply(10)
    ..divide(4)
    ..minus(10);
  print(c.showResult());
  // 40.0
}
```

このように、Dartであれば型パラメータやdynamic(TypeScriptのanyと同じ)を使わずに解決できました。

# メソッドカスケーディングについて
Dartの特徴的な文法「メソッドカスケーディング」は、ドット2つの`..`でメンバにアクセスすることで、戻り値を強制的に呼び出し元のインスタンスで上書きできる機能です。この機能はBertrand Meyer氏の主張である **「コマンド・クエリ分離原則」** の『コマンド（副作用のあるメソッド）は値を返さない』『クエリは副作用を持たず値だけを返す』というルールを守りつつ、メソッドチェーンによる書きやすさを実現しています。  

「コマンド・クエリ分離原則」については以下の記事でわかり易く説明されています。
http://d.hatena.ne.jp/m-hiyama/20101216/1292469108
http://kokudori.hatenablog.com/entry/20130206/1360170983

このメソッドカスケーディング機能、めちゃんこ便利なんですがなかなかサンプルコード等に出てきません（そもそも日本語のDart記事が少ない問題があり）。もっと知名度上げていきましょう！メソッドカスケーディング！
StrongParameterで配列要素を取得する

以下のようなリクエストパラメータを作成したときに、StrongParameterで配列内容を取得する方法

```rb
params # {"array"=> [{"key1":"value", "key2":"value"},{"key1":"value", "key2":"value"}]}
```

```rb
def array_params
  params.require("array").map do |p|
    ActionController::Parameter.new(p.to_hash).permit(:key1, :key2)
  end
end
```

# 参考

https://github.com/rails/strong_parameters/issues/140
Yesod経験者がRailsを経験してみて感じた事

# 前書き

　最近Railsを触ったりしています
　僕は元々WebフレームワークはYesodしか使った事がありませんでした、そんな僕がRailsを触って感じた事を書いてみようと思います

# Yesodとは

　僕の周囲ではメジャーなWebフレームワークであるYesodですが、おそらくはそこまで知名度が高いわけではないと思うので、簡単に説明します
　YesodはHaskell製のWebフレームワークです、Rails経験者の方はHaskellでもRailsのような事ができるんだなと思ってもらえれば十分だと思います

# YesodとRailsの違い

　Railsの設計思想は皆さんご存知の通り「設定より規約」です、設定ファイルをいじくったりはあまり必要ありません
　Yesodも基本的に同じだと思っていいと思います、設計思想にあまり違ったところは無いように感じます
　また、基本的に両者ともMVCに基づいた設計がされていますが、MVCのそれぞれのバランスというか比重が少し違うように思います、Yesodは全体的にControllerの責任が大きいように感じます
　それ以上に両者に違いを与えているのは、当たり前の話ですが「言語」です

　RailsはRuby
　YesodはHaskell

　RailsとYesodの違いはほとんど個の両者の言語の違いに起因するものだと思います

# Railsのメリット

## とりあえず動く

　多くの動的型付け言語がそうであるように「とりあえず動く」と言うのは非常に重要ではあると感じました
　Yesodでは全体として整合性がとれていないと動かす事すらできません、もちろんそのおかげで安心してアプリ作成が進めれるますが
　一方Railsでは「ここは途中までしか作ってないけどとりあえずここは確認したいな」と言うのが気軽にできるというのは重要だと感じました

## モデルの処理が充実している

　Yesodに比べてモデルのマイグレーションやバリデーションが柔軟に行えるのは非常にうらやましいなと感じました

# Railsのデメリット

## とりあえず動いてしまう

　Railsのメリットは「とりあえず動かせる」でしたが、一方デメリットは「とりあえず動いてしまう」だと思います
　同じ事を違う視点から見ただけなのですが、全体として整合性がとれていない事を「自覚した上で」「とりあえず動かす」分にはメリットですが、「自覚していない上で」「とりあえず動いてしまう」のはそれはデメリットです、簡単な例で言えばtypoなどでしょうか
　もちろんそう言ったところをチェックして、動かしたいところがちゃんと動いているかどうかを確認するためにテストを書いたりするわけですが、如何せん面倒くさいです、最低限のチェックは実行前に処理系に世話を見てもらいたいと強く感じます

## 型に対する意識が残念

　全体としてシンボルなどが多用されているのは非常に残念に感じます
　Rubyは動的とはいえ強い型付け(メタプロを多用する限りにおいてはその限りではないですが)が利点だと思うので、わざわざ事実上型の無いシンボルを多用するのは最低限のRubyのメリットさえもつぶしているように感じます
　シンボルと文字列を多くの場所で同一視しているのも同じ理由で残念に感じます

# Yesodのメリット

## 静的型

　静的型です、簡単に言えば「「とりあえず動いてしまう」事が無い」と言う事です
　モデルにも型がつくのはもちろんリンクにも型がつきます、フォームにも型がつきますし、それらの整合性は実行前にコンパイル時にチェックされます
　間違った処理を行ってしまう可能性が格段に減ります

# Yesodのデメリット

## 柔軟性に欠ける

　意図的に「ここ上手くできてないはずだけどとりあえず別の場所チェックしよう」と言って壊れた状態で動かす、というのが難しいです、最低限型を合わせないといけないので
　また、モデルのマイグレーションはモデルを変更したら勝手に行ってくれるのですが、少し処理に柔軟性が欠けるように感じます、例えばNULLを許容するカラムを後からNULLを許容しないように変更するなどは基本的にできません

## 依存性がヤバい

　Yesodは様々なHaskellのライブラリに依存しています、依存しまくっていて、下手に導入するとローカル環境をめちゃくちゃに破壊してくれます
　最近はcabalにもsandbox機能がついたりしたのでこの辺は大分緩和されていますが......

## コンパイルが長い

　はっきり言って、実行前にコンパイルする必要があるわけですが、これが非常に長いです、初回ビルドにおいては依存するライブラリもビルドするのでめちゃくちゃに時間がかかりますし、そうでなくてもWebアプリそのもののビルドも非常に時間がかかります
　ビルドせずにとりあえず動かす事も可能ですが、自分が試した限りだとAjaxをやろうとしたりしたら上手く行かないです、ビルドして動かした方がいろいろと楽でしょう、そうなるとコンパイル時間の壁にブチ当たります
　全体の整合性をチェックしてくれてるありがたい時間と思えばいいのですが、まあ、うーん

# 総括

　個人的にYesodはまだまだ実際のプロダクトで動かすには柔軟性に欠けるように思いますが、今後に非常に期待できると思います
　いくら柔軟性に欠けていたりコンパイルが長かったりしても、うっかりミスをやらかしがちなRailsよりかは個人的には安心です
　とりあえず動けばいいんだ動けば、という人にはRailsの方が向いているかもしれません
Pythonでドメインチェック

あるプロジェクトで、渡された文字列がドメインかどうかチェックしなければならかったので、そこで対処したメモ。

```py
import socket
domain = "qiita.com"

class DomainError(BaseException): pass

def check_domain(domain):
    if domain.find(".") != -1:
            try:
                host = socket.gethostbyname(domain)
                return True

            except socket.gaierror:
                raise DomainError("domain not found.")
    else:
        raise DomainError("this is not domain.")
```

まず、ドメイン文字列にドットが入ってるかどうかをしらべて、そのあと **socket** モジュールの `socket.gethostbyname` 関数を使って、 **ドメイン文字列をIPアドレスに変換する。** これで正常に変換できれば、与えられたドメイン文字列は正常なドメインなので、Trueを返す。関数がエラーを出せば、正常なドメインではないので、エラーを投げる。