OmniAICreator/Qiita-1.07M huggingface dataset:
Grunt で、utf-8 で開発を行いながら shift_jis のファイルを自動生成する方法

## 問題

Grunt では shift_jis のファイルをうまく扱うことができません。  
特に、grunt-contrib-connect などで立てたローカルサーバで shift_jis の HTML ファイルを表示すると文字化けしてしまい、使い物になりません。


## 解決策

普段通り utf-8 で開発を行いながら、shift_jis のファイル群も生成する Grunt タスクを作成しました。  
以下のようなディレクトリ構造を想定しています。

```
├─Gruntfile.js
├─package.json
├─sjis   【shift_jis のファイル群を自動生成するディレクトリ】
│  └─
│
└─utf8   【utf-8 で普段通り作業をするディレクトリ】
    ├─css
    ├─img
    ├─js
    └─index.html
```

Gruntfile は下記になります。

```Gruntfile.js
module.exports = function (grunt) {
  
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-copy');
  
  var iconvLite = require('iconv-lite');
  
  
  grunt.initConfig({
    
    watch: {
      files: [ 'utf8/**/*' ], // (1)
      tasks: [ 'clean', 'copy' ]
    },
    
    clean: {
      sjis: ['sjis/*'] // (2)
    },
    
    copy: {
      copy_html: {
        files: [
          {expand: true, cwd: 'utf8/', src: ['**/*.html'], dest: 'sjis/'} // (3)
        ],
        options: {
          encoding :'utf8',
          process: function( content ){
            var replacedContent = content.replace('<meta charset="utf-8">', '<meta charset="Shift_JIS">'); // (4)
            return iconvLite.encode(new Buffer(replacedContent), 'shift_jis'); // (5)
          }
        }
      },
      copy_css: {
        files: [
          {expand: true, cwd: 'utf8/', src: ['**/*.css'], dest: 'sjis/'} // (3)
        ],
        options: {
          encoding: 'utf8',
          process: function( content ){
            var replacedContent = content.replace('@charset "UTF-8";', '@charset "Shift_JIS";'); // (4)
            return iconvLite.encode(new Buffer(replacedContent), 'shift_jis'); // (5)
          }
        }
      },
      copy_js: {
        files: [
          {expand: true, cwd: 'utf8/', src: ['**/*.js'], dest: 'sjis/'} // (3)
        ],
        options: {
          encoding: 'utf8',
          process: function( content ){
            return iconvLite.encode(new Buffer(content), 'shift_jis'); // (5)
          }
        }
      },
      copy_others: {
        files: [
          {expand: true, cwd: 'utf8/', src: ['**', '!**/*.html', '!**/*.css', '!**/*.js'], dest: 'sjis/'} // (6)
        ]
      }
    }
    
  });
  
  grunt.registerTask('default', [ 'watch' ]);
  
};
```

### 解説

1. utf8/ 以下を監視し、更新があると
2. sjis/ 以下をいったん全削除し
3. utf8/ 以下の html、css、js ファイルを対象にして
4. charset の指定を Shift_JIS に置き換えたうえで
5. 文字コードを Shift_JIS に変換して sjis/ 以下にコピーして
6. 残ったファイルはそのまま sjis/ 以下にコピーする

ということをしています。

これで utf-8 で作業をしながら shift_jis のファイル群を生成することができるので、あとは好きなタスクを追加して快適な環境で開発ができます。


## 参考

http://qiita.com/svartalfheim/items/45bc0ae5c80109f476c8
Rails4.2のweb-console上で直接Rakeを実行する

`ActiveRecord::PendingMigrationError`でエラー画面に飛んだ時、下に出ているweb-consoleのreplから`rake db:migrate`が実行できれば便利なのに、という話をしていて、ほぼそれだけのためにgemを作りました。

[joker1007/web-console-rake](https://github.com/joker1007/web-console-rake "joker1007/web-console-rake")

Gemfileに書いておくだけで、web-consoleのreplで`rake(taskname)`というメソッドが使えるようになります。
オプションを渡せば`spring`にも対応します。
`rake "spec"`とかやればテストも流せます。(意味は余りない)

中身はめちゃくちゃダーティハックな感じで、ちょっと面白かったw
findコマンドで無視リストを利用する


## 動機
* findで.DS_Storeが引っかかるのウザすぎ！！！
* 無視リストをどっかから引っ張ってきたい
* ~/.gitignoreでよくね？

## 方法
下記記事がそのものズバリだった。

* [linux - Exclude list of files from find - Stack Overflow](http://stackoverflow.com/questions/22558245/exclude-list-of-files-from-find)

```bash
# .DS_Storeや*.swpが出力される
$ find . -maxdepth 1 -mindepth 1 -type f
./.blanc.scpt.swp
./.DS_Store
./hoge.txt

$ cat ~/.gitignore
.gitignore
.DS_Store
*.swp
*.bak
.watsonrc

# 展開後のコマンド: 
# find . -maxdepth 1 -mindepth 1 ! -name .gitignore ! -name .DS_Store ! -name *.swp ! -name *.bak ! -name .watsonrc 
$ find . -maxdepth 1 -mindepth 1 $(printf "! -name %s " $(cat ~/.gitignore))
./hoge.txt
```

ここで、気を利かせて`$(~)`をダブルクォートで囲ってはいけない。findコマンドはダブルクォートされた文字列をオプションとして解釈しないので、エラーになる。

実はけっこう長いことハマってた。

```bash
$ find . -maxdepth 1 -mindepth 1 "$(printf "! -name %s " $(cat ~/.gitignore))"
find: ! -name .gitignore ! -name .DS_Store ! -name *.swp ! -name *.bak ! -name .watsonrc : unknown primary or operator
```

## シェルスクリプト化
* 無視リストを利用する以外、通常のfindコマンドと同様にする。
* スクリプトの引数を全部findのオプションとしてブチ込む。

```findi.sh
#!/bin/bash
# alias find=findi
find $* $(printf "! -name %s " $(cat ~/.gitignore))
```
WordPressメモ


##テンプレートタグ
####name
[設定]→[一般設定]管理画面で指定したサイトのタイトル
####description
[設定]→[一般設定]管理画面で指定したサイトのキャッチフレーズ
####url
サイトアドレスURL(トップページのURL)
####stylesheet_url
使用中のメインCSSファイル(style.css)のURL
####template_url
使用中のテンプレートのURL
####template_directory
し湯中のテーマファイルディレクトリのURL


##ファイル名の決まっているモジュールテンプレートファイル
header.php => <?php get_header(); ?>
footer.php => <?php get_footer(); ?>
sidebar.php => <?php get_sidebar(); ?>
searchform.php => <?php get_search_form(); ?>
comments.php -> <?php get_comments_templete(); ?>


##新規投稿画面の内容を表示させるタグ
出力する際の定義 => the_post();
記事のタイトルを出j力 => <?php the_title(); ?>
記事の本文を出力 => <?php the_content(); ?>
記事の抜粋を出力 => <?php the_excerpt(); ?>
記事の登校日を出力 => <?php date(); ?>
					 <?php time(); ?>
記事のカテゴリーを出力 => <?php the_category(); ?>
タグを出力 => <?php the_tags(); ?>
記事のパーマリンクURLを出力 => <?php the_permalink();  ?>

##記事内容を出力する際のループのテンプレート

```
//have_posts() => 投稿データがあるかどうかを判断する
<?php if(have_posts()); ?>
	<?php while(have_posts()): the_post(); ?>
		<h2><a hrer="<?php the_permalink(); ?>"<?php the_title(); ?></a></h2>
		<p><?php the_content(); ?></p>
	<?php endwhile; ?>
	<?php else; ?>
		<?php echo "投稿記事がありません"; ?>
<?php endif; ?>
```


##カスタムメニューを作成
functions.phpに記述
(カスタムメニューの機能が有効化され、サイトの管理画面から[外観]→[メニュー]をクリックしてメニュー画面を表示。)

```
<?php
register_nav_menus(array('nav' => 'ナビゲーション'));
?>
```


メニュー画面の「メニューの名前」に「nav」とつけメニューを作成をクリック。
[テーマの場所]のプルダウンから「nav」を選択し「保存」をクリック
「固定ページ」のタブメニュー「すべて表示」をクリックして「ホーム」を選択し下の「メニューに追加」をクリック。
右のメニューの中に「ホーム」が表示されたかを確認
「カスタム」をクリックすれば名称を変更することも可能

###カスタムメニューを表示
header.phpに記述する
(カスタムメニューを表示させる)

```
<?php
wp_nav_menu(array('theme_location' => 'nav'));
?>
```


##パンクズリストを表示
http://05step.com/2012/09/22/wordpress-pan-navi/

```
<a href="/">HOME</a>&gt;
<?php $cat=get_the_category(); ?>
<?php $cat=$cat[0]; ?>
<?php echo(get_category_parents($cat, true,' > ',false)); the_title(); ?>
```

##PHPの特有の記号
###@ (アットマーク)
エラー制御演算子。
「PHPの式の前に付ければ、その式により生成されたエラーは無視される」

###-> (アロー演算子)
オブジェクトが持つメンバ変数やメンバ関数を使用する場合、この演算子を使ってアクセスする。
$オブジェクト -> メンバ;

###=> (ダブルアロー演算子)
連想配列(辞書)の値をセットするときに使う

###:: (ダブルコロン)
「スコープ定義演算子」
static、定数、およびオーバーライドされたクラスのプロパティやメソッドにアクセスすることが出来る。
簡単にシンボリックリンクを作るシェルスクリプト


## 動機
* `ln -s`が意外とめどいので簡単にする。
* 相対パスを与えた場合も絶対パスでリンクして欲しい。
    * パスを通したディレクトリにリンクする際、絶対パスでリンクしないと正常に実行できない。
* ターゲットがディレクトリである場合、ソースのbasenameを継承して欲しい。
* 単純にリンクする場合と、ソースを移動して元のパスにリンクする場合をオプションで分けたい。

## コード

```sln
#!/bin/bash
# @(#) $0 [-hr] [source] [target]
# @(#) Symbolic link source path to target path (as absolute path).
# @(#) If target is directory, source basename is succeeded. 

readonly SCRIPTNAME="$(basename "$0")"
FLAG_R=0
Usage () {
  what "$0" | sed "s/\$0/$SCRIPTNAME/" 1>&2
}
Notice () {
  echo "$SCRIPTNAME": "$*" 1>&2
}
while getopts hr OPT
do
  case "$OPT" in
    h) # #(@) -h: Print help.
      Usage
      exit 0
      ;;
    r) # @(#) -r: (Reverce) Move source, and link to original path.
      FLAG_R=1
      ;;
    \?)
      Usage
      exit 1
      ;;
  esac
done
shift $((OPTIND - 1))

#
# set source dir, source basename, target dir, target basename
#
if [ ! -e "$1" ];then
  Notice "[ERROR] Source is not existing."
  exit 1
fi
SPATH=$(cd "$(dirname "$1")" && pwd)/$(basename "$1")
if [[ "$2" =~ ^/.* ]]; then # Target is absolute path or not.
  TPATH="$2"
else
  TPATH="$PWD/$2"
fi
if [[ -d "$TPATH" || "$TPATH" =~ .*/$ ]]; then # If target is directory, succeed source basename.
  TPATH="${TPATH%/}"/"$(basename "$1")"
fi
mkdir -p "$(dirname "$TPATH")" >& /dev/null
if [ -f "$TPATH" ];then
  Notice "[ERROR] Target is already existing."
  exit 1
fi
 
#
# Process
#
if [ "$FLAG_R" = 1 ];then
  mv -f "$SPATH" "$TPATH" && ln -s "$TPATH" "$SPATH" && Notice "linked: $SPATH <- $TPATH"
else
  ln -s "$SPATH" "$TPATH" && Notice "linked: $SPATH -> $TPATH"
fi
```

## 補遺
* ターゲットの親ディレクトリは**存在しない**可能性がある
    * そのため、絶対パスに直すときは`cd`を使わず、絶対パス指定であるかどうかを、（チルダ展開した上で）単に先頭の文字によって判断する
VsVim用のvimrcを作成する

[VsVim](https://visualstudiogallery.msdn.microsoft.com/59ca71b3-a4a3-46ca-8fe1-0e90e3f79329)というVisualStudio上でVimでコーディングができるアドオンがありますが、
そのアドオン上で.vimrcを実現するための方法をメモとして残しておきます。

```shell-session:作成先
%userprofile%\.vsvimrc
```

上記で作成したvimrcに設定を記載します

```shell-session:.vsvimrc
set clipboard=unnamed
nnoremap Y y$
nnoremap x "_x
# nnoremap d "_d
nnoremap D "_D
```

いやー、これで本当にいろいろ快適になりますね！！
IntelliJのGoプラグイン1.0.0.alphaの導入手順

この記事内容はバージョンは、[1.0.0.aplha#201](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases)までの手順となります。

**※2015/03/30追記: ビルド #201 を最後に GitHub で公開するのはやめたようです。=> [こちら](http://qiita.com/kyokomi/items/c6d58e6fac2401d965d3#comment-e0f2138a36fa5e21d3c1)を参照ください。**

こちらの記事（[IntelliJ の Goプラグイン 1.0αを試す](http://qiita.com/Fq4X/items/a80108340143a777c673)）を書いた方と同意見で、1.0.0aplhaからかなり良くなってます。

かなり更新が活発なのと[issues](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/issues)を見た感じまだまだ改善していくみたいなのでとても期待してます。

プラグイン開発者様に感謝... :pray: :bow: 

ただ一点、↓にもあるように、**zipそのままinstallする**の気が付かなくて、最初ハマったので一応手順残しておきます。

[Please install the whole zip file.](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/issues/1203#issuecomment-72307347)

# インストール手順

## 既存プラグインの削除

普通にuninstallしてrestartします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/40887/18a4ba4e-f8e7-0841-b1e0-849c0374e3c7.png)

## ダウンロードしたzipをInstall

Preferencesの`Install plugin from disk ...`の押してzipファイルを選択します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/40887/d227d287-8665-585d-7097-2505226ae2c8.png)

## SDK登録

Project StructureのSDKsにGo SDKを追加します。
この時GOPATHを追加したほうがいいと思います。

*（プロジェクトごとにGOPATHを変えたりする方は、入れないほうがいいです）*

![3.png](https://qiita-image-store.s3.amazonaws.com/0/40887/908ef4df-6fce-5aeb-be34-4f96838e9b61.png)

## ProjectのSDKをGoにする

さきほど追加したSDKをGoのプロジェクトに指定します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/40887/6cc72d11-63f0-9d34-0794-ee407d095487.png)

## コード補完とか使えます

最初はIndex作成とかCacheでしばらく時間がかかりますが、コード補完効くようになります。

こんな感じです。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/40887/32c1f590-5e17-140f-e61f-6afbc02828cb.png)

## `Go fmt`と`Goimports`

GofmtやGoimportsもkeymapに指定できるので、便利です。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/40887/8369ea20-caa6-6e62-bbe9-1bed906e7b4a.png)

# おわり
少しバグってる挙動を見かけましたが、かなり使い勝手がよくなっているのでオススメです。

# 公式
- https://github.com/go-lang-plugin-org/go-lang-idea-plugin
stylesheet_link_tag ( link_to ) メソッドでのカスタムデータ属性(独自データ属性)の利用

## はじめに

[skrollr-stylesheets](https://github.com/Prinzhorn/skrollr-stylesheets)をMiddleman で使おうとして、
stylesheet_link_tagメソッドでのカスタムデータ属性の指定にちょっぴり迷ったのでメモ。

いつもlink_toメソッドを使うときのように
下記のように盲目的に
```data-skrollr-stylesheet: ""```
とやったらエラー(そりゃそうだ)

```slim
= stylesheet_link_tag "skrollr/index", media: "only screen and (min-width: 1200px)", data-skrollr-stylesheet: ""
```

## カスタムデータ属性の指定

```data: {"skrollr-stylesheet" => ""}```
もしくは
```"data-skrollr-stylesheet" => ""```
って感じで指定すればよい。

Railsでも同じ。

(以下の例はテンプレートはSlim使っています。)

### data: 使う場合の例
```slim
= stylesheet_link_tag "skrollr/index", media: "only screen and (min-width: 1200px)", data: {"skrollr-stylesheet" => ""}
```
### data: を使わず一気に書く場合の例
```slim
= stylesheet_link_tag "skrollr/index", media: "only screen and (min-width: 1200px)", "data-skrollr-stylesheet" => ""
```

### 変換後
```html
<link href="/stylesheets/skrollr/index.css" rel="stylesheet" type="text/css" media="only screen and (min-width: 1200px)" data-skrollr-stylesheet="">
```

当然ですが、link_toでも同じように記述すればOKでした。
awk で気軽に集計

とある集計用のスクリプトで複雑なことをやっていて、「それ awk でできるよ」と思ったので

# 基本

```text:sample-1.txt
3
4
5
6
```

こういうファイルがあった時に

```shell-session
$ awk '{s += $1} END {print s}' < sample-1.txt
18
```

という具合に集計できる。

# カラムが複数

```text:sample-2.txt
1 5
2 6
3 7
4 8
```

みたいにカラムが 2 つあっても簡単。

```shell-session
$ awk '{a += $1; b += $2} END {print a, b}' < sample-2.txt
10 26
```

3 つ以上の時も同じように伸ばして行けば OK

# 応用

```text:sample-3.txt
a
a
a
a
a
a
a
b
b
b
c
```

普通に sort | uniq -c すると空白で整形されて出力される。

```shell-session
$ sort -n < sample-3.txt | uniq -c
   7 a
   3 b
   1 c
```

awk 使えば整形してさらに合計を出したりできる。
↓ の結果はカラムを並び替え、「計」をつけてみた。

```shell-session
$ sort -n < sample-3.txt | uniq -c | awk '{a+=$1; print $2, $1} END {print "計”, a}'
a 7
b 3
c 1
計 11
```

個人的には、 Perl ワンライナーよりも覚えやすいと感じるので重宝している。
みんなの為のMySQLまとめ（１０）

参考
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_13.htm

■絶対値

  ・abs() 関数は、絶対値を返す。
  
>```
select abs(-123);
```
```
select key1, abs(data1) from testm;
```

■余り

  ・mod() 関数は、余りを返す。

>```
select mod(123, 10);
```
```
select key1, mod(data1, 10) from testm;
```

■四捨五入

  ・round() 関数は、四捨五入結果を返す。
>select round(10.346, 2);
![kobito.1423675268.196075.png](https://qiita-image-store.s3.amazonaws.com/0/59354/0c70a9e6-6167-00e3-faf8-afbd63cddce6.png "kobito.1423675268.196075.png")

■切り捨て

  ・truncate() 関数は、切り捨て結果を返す。

>```
select truncate(10.349, 2);
```
```
select key1, truncate(data1, 2) from testm;
```

■スクエアルート

  ・sqrt() 関数は、平方根を返す。

>select sqrt(2.0);
![kobito.1423675446.365277.png](https://qiita-image-store.s3.amazonaws.com/0/59354/3d5a8f5e-308b-ee2a-2b4f-feb7d5651cdf.png "kobito.1423675446.365277.png")

■数値から文字列へ変換 (数値フォーマット、書式変換)

  ・文字列としての結合は concat() を使用する。

>```
select concat(123456, 789012);
```
```
select concat('123456', 789012);
```
```
select concat('123456', '789012');
```
![kobito.1423675573.425190.png](https://qiita-image-store.s3.amazonaws.com/0/59354/10da82bb-926d-9b1f-a979-0edce8ff2068.png "kobito.1423675573.425190.png")

・三桁毎にカンマを付けるには、次のようにする。

>```
select format(123456, 0);
```
```
select format(123456, 2);
```
![kobito.1423675691.070904.png](https://qiita-image-store.s3.amazonaws.com/0/59354/17efee22-d2d4-59bd-0538-d9484b8ebc55.png "kobito.1423675691.070904.png")
wgetと右クリックからダウンロードで落としてきたファイルのパーミッションが違う

証明書ファイル落としてくる時に、ダウンロードの仕方によってパーミッションが違った

`wget http://curl.haxx.se/ca/cacert.pem`

これで落としてくると
`-rw-r--r--`
この状態

>http://stackoverflow.com/questions/6400300/https-and-ssl3-get-server-certificatecertificate-verify-failed-ca-is-ok

ここの`http://curl.haxx.se/ca/cacert.pem`のリンクを右クリック＞リンク先を別名で保存で保存すると
`-rw-r-----`
この状態

パーミッションが許可されてなくて証明書にアクセスできないってエラーに丸1日くらい悩まされた
ファイルもパスも合ってる時はパーミッション疑わないとですね
この挙動には注意が必要そう…
さくらVPSでCentOS7・PHP・MariaDB・HTTPDをインストール


1.custom os image を選択
2.インストール先のHDD選択、Rootパスワード入力と一般ユーザーアカウント作成
3.サーバ起動
4.utility インストールする

```sh
$ sudo yum install yum-utils deltarpm -y
$ sudo yum install vim bash-completion wget curl lsof -y
```

5.拡張Yum Repository インストール

```sh
$ sudo yum install epel-release -y
$ sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```
6.HTTPD & PHP

```sh
$ sudo yum --enablerepo=remi,remi-php56 install php php-mysqlnd php-gd php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-soap php-tidy
```
7.MySQL
※ https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.0

```sh
$ vim /etc/yum.repos.d/mariadb.repo
# MariaDB 10.0 CentOS repository list - created 2015-02-05 09:11 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

$ sudo yum install MariaDB-server MariaDB-client # server & client
$ sudo yum install MariaDB-client # client only
$ sudo mysql_upgrade
$ sudo mysql_secure_installation
$  vim /etc/my.cnf.d/server.cnf
[mysqld]
character-set-server=utf8
```

8.Firewall設定

```sh
$ sudo firewall-cmd --permanent --zone=trusted --add-source=<client ip>/32
$ sudo firewall-cmd --permanent --zone=trusted --add-port=3306/tcp
$ sudo firewall-cmd --reload
```
みんなの為のMySQLまとめ（９）

参考
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_12.htm

■集計問い合わせ(合計値)

  ・集計問い合わせを行うには、group by 句を使用する。
    この例では、key1 の先頭が「a」で始まる明細を key1 単位に集計(サマリー)
    し、data1 の合計が 10 以上のものを問い合わせる。
    having 句は、集計後の結果に対して抽出条件が指定できる。

>select key1, sum(data1) from testm
  where key1 like 'a%'
  group by key1
  having sum(data1) >= 10
;

・count() を使用すると、合計件数が問い合わせられる。
    (問い合わせ件数表示、照会件数表示、抽出件数)
    この例では、key1 単位に集計し、data1 の合計が 10 以上のものを
    問い合わせる。

>select key1, count(*), sum(data1) from testm
  group by key1
;
![kobito.1423449846.106480.png](https://qiita-image-store.s3.amazonaws.com/0/59354/23a77cc9-2ce1-3056-a038-5eca75bc69d9.png "kobito.1423449846.106480.png")

 ・単純に特定の明細のレコード件数を問い合わせるときは、次のように使用す
    る。この例では、key1 の先頭が「a」で始まる明細の件数が得られる。
>select count(*) from testm
where key1 like 'a%'
;
![kobito.1423579043.718863.png](https://qiita-image-store.s3.amazonaws.com/0/59354/f6c64456-65ac-15da-acf5-fc3893348492.png "kobito.1423579043.718863.png")

・max、min を使用すると最大値と最長値を問い合わせることができる。
    この例では、key1 毎の data1 の最大と最小が得られる。
 >   select key1, max(data1), min(data1) from testm
  group by key1
;
![kobito.1423673538.223021.png](https://qiita-image-store.s3.amazonaws.com/0/59354/5dd86ad9-d31d-b6e1-147c-2afe6f4656c6.png "kobito.1423673538.223021.png")

 ・testm のキーがユニークでないと仮定すると、同じキーのレコードが複数
    存在する事になる。
    distinct を指定すると重複レコードを取り除いて問い合わせできる。
    distinct の代わりに unique と Oracle のように指定することはできない。
    (重複データ)

>select distinct key1
  from testm
;
![kobito.1423673734.695547.png](https://qiita-image-store.s3.amazonaws.com/0/59354/48d91a90-c7d6-a97d-fca6-6570f96efb01.png "kobito.1423673734.695547.png")

・union all を使用すると問い合わせ結果をマージできる。
    union all の代わりに union とだけ指定すると、重複レコード
    は含まれない。(表を合わせ、付け足す)

>select * from testm
  where key1 like 'a%'
union
select * from testm
  where key1 like 'a%'
;
![kobito.1423674236.103380.png](https://qiita-image-store.s3.amazonaws.com/0/59354/54eeaf70-eab7-8992-a658-18bb8c8b84af.png "kobito.1423674236.103380.png")
型のないDataColumnに入っている数値を数値としてDataTableをソートする

型のないDataColumnに入っている数値データを、DataTable.Sort()でソートしようとすると辞書順にソートされてしまうため一手間必要です。

1. ソートしたいDataTableをDataView.Tableとして持たせる
2. そのTableに数値の列を追加する(今回はdouble)
3. 数値としてソートしたい列を数値に変換し2.で作成した列に与える
4. 3.の列でソート
5. もう3.の列は不要なので削除
6. DataViewをDataTableに戻して終了

以下、コード

````c#
// DataTable dataTable;
DataView dataView = new DataView(dataTable);
dataView.Table.Columns.Add("num", typeof(double));
 dataView.Table.Columns["num"].Expression = "CONVERT(" + columnWantedToSort + " , 'System.Double') ";
dataView.Sort = "num";
dataView.Table.Columns.Remove("num");
DataTable sortedTable = dataView.ToTable();
````

本当にこんなことしないといけないんですか？
Ripple でのゲートウェイ、アドレス情報の調べ方

以下に移行しました<br><a href="http://block-chain.jp/tech/ripple-gateway-address/" title="Ripple でのゲートウェイ、アドレス情報の調べ方">Ripple でのゲートウェイ、アドレス情報の調べ方</a>
レビュー意見は「良い」「悪い」でなく「適している」「適していない」を

* 「開発者はコードを批判されても自分を否定されたと傷つくな」
* 「レビュワーはコードを批判し人格を攻撃するな」

よく言われるコードレビューの心構えですが、果たしてこれだけで摩擦なくディスカッションできるものでしょうか。
だって純粋にコードだけ批判されたって、僕ならやはり傷つきますね。コード書くときには自分の全知見・全思考力を叩き込んでますから結局コードは自分の人格の一部みたいなもんです。

批評ではなく、議論を提起したい
--
擁護のしようも無いようなクソコードでさえ、何らかの意図を持って（すなわち何らかの利点のある手法だという意志のもとに）書かれています。意図と言うべきものもなくプログラムされたとしても、それはそれでつまり直感的な記述だという利点を含んでいると見なすことは可能です。

すべての記述方法は利点と欠点を多かれ少なかれ持っているのだという点は認めましょう。

するとレビュー意見はこういう形になります。
「この書き方に●●のような利点があることは認めるが、このケースにおいては●●という事情からこういう記述の方がより適していると思う」
良い悪いではなく選択肢の提示とそれらの利点欠点の検討、という視点に持っていけばコードを、すなわち書き手の人格を批判することなく議論へと向かうことが可能になります。
LINQでクロス集計表の作成

データの集計を目的に使われるクロス集計を、DataTableに対するLINQで書いてみます。
EXCELでも簡単にできると思いますが、私はやりたくないです。

# やってみよう
DataTableに入っているデータをcolumn1, column2という2軸でクロス集計しています。


````c#
var query = from table 
            in dataTable.AsEnumerable()
            group table by new { column1 = table[column1], column2 = table[column2] }
            into groupby
          //orderby hogepiyo
            select new
                {
                     groupby.Key.column1
                    ,groupby.Key.column2
                    ,frequency = groupby.Count()
                };

````

# 並び替え

orderby句をLINQの中に入れるとなぜかうまくいかなかったので、
集計結果にメソッド記法でソートを実施

````c#
query.OrderBy(x => x.column1).ThenBy(x => x.column2);
````

//orderby hogepiyoの部分に

````c#
orderby groupby.Key.column1.ToString(),groupby.Key.column2.ToString()
````

と書くと動きそうですがなぜかダメでした。
正しい書き方わかる人いたら教えてください。

# 追記1

このクエリではgroupby句に引っかかる箇所しかとれないので、厳密にクロス集計表を作るなら引っかからなかった箇所は0で埋める必要があります。

# 追記2

chocolamintさんにコメントで指摘いただいたのですが、
上記のクエリだと辞書順ソートになってしまいます。
(OrderByメソッドも同様です。ごめんなさい；；)

正しくは、tableへのアクセスで
````
table.Field<int>(column1)
````
として数値として取得する必要があります。


````c#
var query = from table 
            in dataTable.AsEnumerable()
            group table by new { column1 = table.Field<int>(column1), column2 = table.Field<int>(column2) }
            into groupby
            orderby groupby.Key.column1, groupby.Key.column2
            select new
                {
                     groupby.Key.column1
                    ,groupby.Key.column2
                    ,frequency = groupby.Count()
                };

````
Rails - アイコン画像のGemライブラリ evil_iconsを使う

## evil_icons概要

`evil_icons`は、webアプリケーションに特化してデザインされたSVG型式のアイコン画像集です。

こう書くと、ただの画像ファイル詰め合わせのような感じですが、gemとして公開されているので、Railsプロジェクトに追加して簡単に利用することができます。


また、SVGの形式なので、画像のサイズや色をプログラムから指定することができるのも特徴です。

## 使い方
Gemfileに`evil_icons`を追加します。

```rb:Gemfile
gem 'evil_icons', github: 'outpunk/evil-icons'
```

[rubygems](https://rubygems.org) にも公開されているのですが、どういうわけかインストールしたgemの`assets/`フォルダの中に、あるはずのcssファイルが無くてうまく動かなかったため、githubからインストールしました。

application.cssに、以下の記述を追加します。

```css:app/assets/stylesheets/application.css
/*
 *= require evil-icons
 */
```

アイコンを使うページのビューに以下を追加します。
いろんなページで使う場合は、application.html.erbとかに書くのが手っ取り早くていいと思います。

```erb:app/views/layouts/application.html.erb
<%= evil_icons_sprite %>
```


アイコンを表示するには、`evil_icon`ヘルパーメソッドを使います。

```erb
<%= evil_icon 'ei-search' %>
```

`evil_icon`のパラメータに表示したいアイコンの種類を指定します。アイコンの種類は以下のページで一覧を参照できます。
http://evil-icons.io/

## 画像サイズの指定
`size`オプションで画像の大きさを指定することができます。

```erb:xxx.html.erb
<%= evil_icon 'ei-search', size: :s %>
<%= evil_icon 'ei-search', size: :m %>
<%= evil_icon 'ei-search', size: :l %>
<%= evil_icon 'ei-search', size: :xl %>
<%= evil_icon 'ei-search', size: :xxl %>
```


## 色の指定
CSSファイルでアイコンの色を指定できます。

```css:xxx.css
/* 全アイコン種類の色を指定する場合 */
.icon {
  fill: red;
}
```

「基本は黒でよいけど検索のアイコンは青で表示したい」など、特定のアイコン種類だけ色を変えたい場合は、`icon--` + 「アイコンの種類」というクラス名を指定します。

```css:xxx.css
/* 特定のアイコン種類だけに色を指定する場合 */
.icon--ei-search {
  fill: blue;
}
```


ひとつひとつのアイコンに個別に色を指定する場合は、独自のクラス名を定義して、`evil_icon`のパラメータに`class`というオプションを渡します。


```css:xxx.css
.custom-class-silver {
  fill: silver;
}
.custom-class-gray {
  fill: gray;
}
```

```erb:xxx.html.erb
<%= evil_icon 'ei-search', class: 'custom-class-silver' %>
<%= evil_icon 'ei-search', class: 'custom-class-gray' %>
```
MongoDBをDockerでインストールする

Dockerのセミナを受けたので、とりあえずDockerの勉強のためにMongoDBをDockerでインストールしてみた。

環境
* CentOS 7.0.1406 (Core) 
* docker-1.3.2-4.el7.centos.x86_64

#### Dockerのインストール

yumでインストールして、その後systemctlコマンドで起動する。

```
# yum install docker
# systemctl start docker
```

#### MongoDBのコンテナイメージのインストール

MongoDBのコンテナイメージは[Dockerhub](https://registry.hub.docker.com/)で公開されているので、`docker pull`コマンドでDockerhubからコンテナイメージを落としてくる。

落としてくるコンテナイメージ名は[mongo](https://registry.hub.docker.com/_/mongo/)。

```
# docker pull mongo

Trying to pull repository docker.io/mongo ...
5242d1368ac4: Download complete
21e4345e9035: Download complete
（中略)
c44083d34fb8: Download complete
Status: Downloaded newer image for docker.io/mongo:latest
```

これで最新バージョンのMongoDBのコンテナイメージがインストールされる。

#### MongoDBのコンテナの作成＆起動
MongoDBの本体(mongod)を`docker run`コマンドで作成して、起動する。

```
# docker run --name some-mongo -d mongo
```
オプションはそれぞれ、

+ `--name`はコンテナのエイリアス指定
+ `-d`はバックグラウンド実行
+ 最後にコンテナイメージである`mongo`を指定

`docker ps`コマンドで起動確認もできる。

```
# docker ps

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
5eabc7ec23a4        mongo:latest        "/entrypoint.sh mong   46 seconds ago      Up 45 seconds       27017/tcp           some-mongo
```



#### コンテナの停止

```
# docker stop some-mongo
```

#### コンテナの二回目以降の起動

```
# docker start some-mongo
```

#### MongoDBクライアントでの接続

MongoDBに接続するためには通常MongoDBクライアントコマンドである`mongo`コマンドを用いるが、MongoDB自体をコンテナイメージとしてインストールしているため、ローカル環境に`mongo`コマンドは存在しない。
そのため、Docker経由で`mongo`コマンドを呼び出す必要がある。

```
# docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
```
オプションはそれぞれ、

+ `-i`と`-t`は対話するために必要
+ `--rm`は終わったらコンテナを消す(コマンドを一回打つためだけのコンテナなので)
+ `--link`は既に起動しているmongodbコンテナと接続。別コンテナなので、こうしないと接続できない。
+ `mongo`でコンテナイメージを指定
+ 最後に実行コマンドとして`sh -c 'mongo xxx'`を指定。これが実行される。
  + `$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT`の部分はDockerで自動的に生成される環境変数でMongoDBのIPアドレスとポート番号を参照している（ちなみに私の環境では`172.17.0.1:27017`となっていた）。
  + `/test`はデータベース名。testというデータベースに接続している
 

#### コンテナの中に入る

```
# docker exec -it some-mongo bash
```

#### コンテナの中はどうなっているのか

[mongoのDockerifle](https://github.com/docker-library/mongo/blob/c9a1b066a0f35f679c2f8e1854a21e025867d938/3.0/Dockerfile)を見れば、DevianLinuxの上にMongoDBのDebianパッケージが入っていることがわかる。

そこでコンテナの中に入ってDebianパッケージを見る

```
# docker exec -it some-mongo bash

root@5eabc7ec23a4:/# dpkg -L mongodb-org-server

(出力抜粋)
/usr/bin/mongod # 本体
/usr/share/man/man1/mongod.1.gz # マニュアル
/etc/mongod.conf # 設定ファイル
/etc/init.d/mongod # 起動スクリプト
```

ちなみにデータディレクトリは`/data/db`だ

#### 所感
とまあ、勉強がてらMongoDBをDocker化してみましたが、非常に簡単でした。
ただ、**MongoDBをコンテナ化してもあまり嬉しい事はないだろうなぁ...**と思います。
というのも、MongoDBのパッケージは１バイナリで非常にシンプルだし、インストールも簡単だし、設定ファイルもシンプル。バージョンアップも１バイナリの置き換えだけだし、すぐに戻す事もできる。登場人物が少なすぎるが故に、コンテナにすることによるメリットが受けにくいものの一つでしょう。
VisualStudio2013でEmacsキーバインドを使う

開発環境が VisualStudio2013 に最近更新されたので、
その環境設定でやったことをまとめたいと思います。

# Emacsキーバインドの適用

とりあえずまずは、Emacs拡張機能をインストールします。
https://github.com/owainlewis/emacs-visual-studio-2013

詳しい導入方法については、[toburau](http://d.hatena.ne.jp/toburau/)さんのページが参考になります。
http://d.hatena.ne.jp/toburau/20141116/
http://d.hatena.ne.jp/toburau/20141117

**(注意点)**
一度 .vsix 形式の状態で実行して、拡張機能をインストールして、
VS2013上で、ツールタブの拡張機能と更新プログラム内に
Emacs emulationが見える状態にします。
その状態で、vsixをzipに変更して指定された場所に置きます。
こうしないとEmacsの設定に変更しても効きませんでした。


## VisualStudio同士でテキストのコピペができない問題

VisualStudioでは、Emacsキーバインドに変更すると、
コピーした内容をVisualStudio同士でペーストすることができません。
そこで、以下のコマンドを追加します。

* 編集.クリップボードリングの切り替え => Ctrl+Y(テキスト エディター) 

これで何故かコピペできるようになります。
ただしクリップボードリング本来の使い方をするためには注意する必要があります。
(履歴がおかしくなるため)

## Ctrl+Hでバックスペース

自分は、「Ctrl+H」でバックスペースを入力したいのですが、
VisualStudio上では置換処理が起動してしまいます。
そこで、

* 編集.置換 => Ctrl+F, Ctrl+F 
* 編集.1語削除 => Ctrl+H

のように変更しました。

# 最後に

とりあえず、自分が使いたいようにするために修正した点は以上です。
いくつかの機能が不具合を起こす可能性があるので、
もっといい方法をご存じの方はぜひ教えていただきたいです。

## おまけ（インストールした拡張機能）

ついでに使っている拡張機能も晒しときます。

1. Indent Guideline (インデントを揃えてくれる)
2. Highlight all occurrences of selected word (選択した文字と同じ部分に色をつける)
3. Productivity Power Tools 2013 (色々拡張)
4. RockMargin (スクロール部分に詳細情報を表示する)
5. VSColorOutput (出力部分に色をつける)
libc.so をつかんでいるプロセス一覧

CentOS Blog にあった ```lsof | grep libc | grep DEL``` が何の役にも立たなかったので、代替として、プロセス一覧を取得するワンライナー。

```
grep '\<libc\>' /proc/[0-9]*/maps | sed 's:^/proc/::; s:/maps.*$::' | uniq | sort | xargs | tr ' ' ',' | xargs ps kstart_time -f -p
```

typo 修正 
所得 -> 取得
CoffeeScript

# CoffeeScript

CoffeeScriptはJavaScriptにコンパイルされてるプログラミング言語。出力はただのJavaScriptコードですが、構文は軽くて書きやすい言語です。つまり、CoffeeScriptは新しいプログラミング言語の用なシンタクスでJavaScriptを書く事が出来ます。

## coffeescript.org
CoffeeScriptのプログラミングなら、http://coffeescript.org/ はとても便利です。良いドキュメンテーションがありますし、「Try CoffeeScript」というメニューで、CoffeeScriptをタイプすれば、リアルタイムでJavaScriptのアウトプットが見えますから、ずいぶん分かりやすいです。

## 変数
変数はラムダ式のままで書きます。

```square.coffee
square = (x) -> x * x
```
パラメータがありませんと何も書かなくても良いです。

```greet.coffee
greet = -> alert "Hello!"
```
先の例の用に、括弧は一般的に書かなくても良いですが、括弧が必要場合もまります。例えば、

```ambiguous.coffee
functionA functionB parameterX, parameterY
```
はディフォルトで

```output1.js
functionA(functionB(parameterX, parameterY));
```
になりますが、元々意味は

```output2.js
functionA(functionB(parameterX), parameterY);
```
だったと思えます。

ディフォルトパラメータも出来ます。

```input.coffee
greet = (message = "Hello!") -> alert(message)
```
```output.js
var greet;

greet = function(message) {
  if (message == null) {
    message = "Hello!";
  }
  return alert(message);
};
```
関数の最後のラインは自動的にリターンされてます。

## 波括弧
波括弧の代わりにインデントを使うことが出来ます。

```input.coffee
if flag
    newObject =
        name: "Sanomaru"
        age: 4
        prefecture: "Tochigi"
        specialties: [
            "fencing"
            "ramen"
        ]
```
```output.js
var newObject;

if (flag) {
  newObject = {
    name: "Sanomaru",
    age: 4,
    prefecture: "Tochigi",
    specialties: ["fencing", "ramen"]
  };
}
```
そのままでアレイも書けます。

## Comprehensions
```comprehensions.coffee
displayContentWithIndex = (index, content) -> alert "#{index} - #{content}"

colors = ["Red", "Green", "Orange", "Blue"]

displayContentWithIndex index, content for content, index in colors when content != "Orange"
```
Visual Studio で Xamarin.Forms の XAML を編集する時に IntelliSence を活用する方法

> 追記：Visual Studio 2015 Update 2 より Xamarin が標準搭載され、拡張機能は基本的に不要になりました！
IntelliSense が機能しないかな？と思ったときはソリューションのリビルドや Xaml のエディタを閉じて開く、などをお試しください。

こんにちは。エクセルソフトの田淵です。

Xamarin.Forms の XAML って、Xamarin Studio だと多少 AutoComplete が効きますが、Visual Studio だと全部手打ちで発狂しそうになりますよね。

![スクリーンショット 2015-02-12 17.43.38.png](https://qiita-image-store.s3.amazonaws.com/0/32453/59871bd7-0a36-554e-acbd-bca7f42e3640.png)
Oh...

そんな時は [Mobile Essentials](http://www.cazzulino.com/mobileessentials.html) を使いましょう。
Xamarin 純正ではないですが、十分に力を発揮してくれます。

![スクリーンショット 2015-02-12 17.50.23.png](https://qiita-image-store.s3.amazonaws.com/0/32453/5e9799c4-fbb7-0946-833d-f3f3062ab830.png)
![スクリーンショット 2015-02-12 17.50.44.png](https://qiita-image-store.s3.amazonaws.com/0/32453/eac61440-c0e2-426f-9135-c506f89c9c59.png)
![スクリーンショット 2015-02-12 17.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/32453/aa5eb6ca-3f85-dc21-71e7-a8244fca7c63.png)

# [Mobile Essentials](http://www.cazzulino.com/mobileessentials.html) のインストール

1. [Mobile Essentials pack](http://www.cazzulino.com/mobileessentials.html) ページの説明にあるように、``ツール>オプション`` から ``環境>拡張機能と更新プログラム`` を選択し、名前欄に任意の名前と URL 欄に  ``http://gallery.mobileessentials.org/feed.atom`` を記載して適用、OK をクリックします。
<span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150211/20150211032136.png" alt="f:id:ytabuchi:20150211032136p:plain" title="f:id:ytabuchi:20150211032136p:plain" class="hatena-fotolife" itemprop="image"></span>

1. ``ツール>拡張機能と更新プログラム`` のオンラインに Mobile Essentials がありますので ``Xamarin.Forms IntelliSence`` をインストールしてやりましょう。
<span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20150211/20150211032558.png" alt="f:id:ytabuchi:20150211032558p:plain" title="f:id:ytabuchi:20150211032558p:plain" class="hatena-fotolife" itemprop="image"></span>


Visual Studio が自動的に再起動されて、準備が整ったところで、公式ドキュメントの [Part 1. Getting Started with XAML | Xamarin](http://developer.xamarin.com/guides/cross-platform/xamarin-forms/xaml-for-xamarin-forms/getting_started_with_xaml/) の「Setting Page Content」の部分を試しに写経してみます。

Xamarin.Forms ソリューションを作成し、Forms プロジェクトに Forms Xaml Page を XamlPage などで追加し、App.cs で XamlPage を呼び出しましょう。

```csharp
public App()
  {
    MainPage = new XamlPage();
  }
```

では XamlPage.xaml を開いて写経してみます。(Label は写経用に削除しています。)


<iframe width="420" height="315" src="https://www.youtube.com/embed/0HZA-kaWdDE" frameborder="0" allowfullscreen></iframe>
[【速報】拡張機能で Visual Studio で Xamarin.Forms の IntelliSence が使えるようになります！！ - YouTube](https://www.youtube.com/watch?v=0HZA-kaWdDE) にビデオを上げておきましたので宜しければご参照ください。

是非試してみてください。

# Xamarin 気になった方は

是非 [ダウンロード(直接)](http://xamarin.com/download) / [ダウンロード(弊社経由)](https://www.xlsoft.com/jp/products/download/index.html?option=Xamarin&r=ythb) して触ってみてください。
[学習用リソース](http://ytabuchi.hatenablog.com/entry/2014/08/26/191759) や [JXUG リンクページ](http://jxug.org/links.html) に参考資料を纏めてますので併せてどうぞ。

以上です。
Macに異なるバージョンのアプリを入れた時、バージョン別にアイコンを変えて解りやすくする

# タイトルのまんまなんですが。

Arduino 1.6が出たのですが、私のMacには既に1.0.5と1.0.6が入っていて、さらに1.0.6はノーマル版とgcc環境の改造版が入っていたりしてます。

![フォルダ表示](http://img.dfm.lrv.jp/icon/icons.png)

上記のように、アプリにVersion名つけることでフォルダ表示では問題ないのですが、Dockだと酷いことになりますw

![Dockだと](http://img.dfm.lrv.jp/icon/source.png)

というわけで、アイコンを加工して、下記のようにしてみました。

![こんな風にしてみた](http://img.dfm.lrv.jp/icon/fixed.png)

解りやすくなりました！

というわけで、やり方を書いておきます。

# 「情報を見る」と「プレビュー」アプリだけでできる。

## 1. 情報を見るからアイコンをコピーする

まず、加工したいアイコンのファイルを選んで、`ctrl+クリック`でコンテキストメニューを開き、「情報を見る」で情報を表示します。

そこで、左上の方にアイコンが表示されていますが、ここでクリックすると、アイコンが選択できます。
（青い枠でうっすら囲まれる）

![「情報を見る」からアイコンをクリップボードにコピーする](http://img.dfm.lrv.jp/icon/clip.png)

これで、アイコンがクリップボードにコピーされました。

## 2. 「プレビュー」を起動して、ベース用のPNGファイルを作る

Macの「アプリケーション」の中に、「プレビュー」アプリが入ってます。
↓のアイコンです。

![プレビューのアイコン](http://img.dfm.lrv.jp/icon/preview.png)

これを起動します。

起動後、「ファイル」→「クリップボードから新規作成」を選びます。

![クリップボードから新規作成](http://img.dfm.lrv.jp/icon/new.png)

すると、こんな感じに先ほどクリップボードにコピーしたアイコンが開かれます。

![Arduinoのアイコンが開かれた](http://img.dfm.lrv.jp/icon/new2.png)

次に、このファイルを一旦保存します。
開いた時は、大きさが異なる複数のイメージを持ったicon形式として開かれています。
これを、一番大きなイメージだけのpngファイルとして保存しましょう。

`コマンド+S`とキーを押すと、↓こんな感じでファイル保存のダイアログが表示されます。

![保存画面](http://img.dfm.lrv.jp/icon/save.png)

ここで、**フォーマットを「PNG」に変更して**から、適当な名前をつけて保存しましょう。

これで、ベースとなるPNGファイルができました。

## 3. ベースから編集用のコピーを作る

ベースとなるPNGファイルをコピーして編集用のファイルを作ります。
例えば、今回私は4つのアプリアイコンを作りたいので、ベースを4回コピーして、それぞれ4個の編集用ファイルを作ります。

![編集用のコピーを作る](http://img.dfm.lrv.jp/icon/copyfiles.png)

`1.0.5`、`1.0.6`、`1.0.6mod`、`1.6`が編集用ファイルです。
`base`は編集せず残しておきます。

## 4. 編集用ファイルを加工する

今回は、アイコンにバージョン番号を付けたいだけですので、アイコンに文字が足せれば良いわけです。
このような簡単な画像編集にはPhotoshopは不要です。「プレビュー」があれば出来ます。

編集用ファイルをダブルクリックすると、通常「プレビュー」で開かれた状態になります。

![編集用ファイルを開く](http://img.dfm.lrv.jp/icon/open.png)

その後、「表示」→「編集ツールバーを表示」を選択。

![編集ツールバー表示](http://img.dfm.lrv.jp/icon/menuselect.png)

すると、下記のようにツールバーが表示されたはずです。
そこで、テキストツールを選択します。

![テキストツール選択](http://img.dfm.lrv.jp/icon/texttool.png)

こんな感じで編集できるようになります。

![編集中](http://img.dfm.lrv.jp/icon/editing.png)

編集が終わったら、一旦`コマンド+S`で保存しましょう。
その後、`コマンド+A`で全選択後、`コマンド+C`でコピーします。

これで、加工したアイコンがクリップボードに入りました。

## 5. 「情報を見る」から加工したアイコンをペースト！

いよいよ最後です。
アイコンを変更したいアプリを選択して、再度`ctrl+クリック`でコンテキストメニューを開き、「情報を見る」で情報を表示します。

![ペースト前](http://img.dfm.lrv.jp/icon/view.png)

ここで、左上のアイコンを選び、`コマンド+V`でペーストします。

![ペースト後](http://img.dfm.lrv.jp/icon/result.png)

はい！できました。
アプリを1度起動するとDockにも反映されます。

というわけで、残りのアイコンも同じようにして加工〜コピー＆ペーストで変えられます。

## アイコン戻すには？

アイコンを戻したいときは、「情報を見る」のアイコンを選択して`delete`キーを押せば元に戻ります。

# まとめ

これで、Arduinoバージョン増えまくっても平気！！！
。。。。。のはずw
GoogleTagManagerのgtm.linkClickが複数回発火するのでこうしてみた。

どうやらgtm.linkClickはMouseDownとMouseUp両方で反応してるらしい。
で、デフォルトで用意されているものは1回だけ動くようにしてるみたいだけど、
カスタムHTMLタグとかはそんなこと知ったこっちゃないので、
何にもしないと2回動いたりする **( ｀д´) ｹｯ!**

## カスタムHTMLタグ

一番簡単なのはMouseDownだけ反応するようにしてしまう。

```
‘event’: ‘my.mouseDown’,
‘gtm.element’: e.target,
‘gtm.elementClasses’: e.target.className,
‘gtm.elementId’: e.target.id,
‘gtm.elementTarget’: e.target.target
```

via [SIMO AHAVA'S BLOG](http://www.simoahava.com/analytics/dont-gtm-listeners-work/)

## カスタムJavascript

カスタムJavascriptでなんやかんやしてるところがあったりしたら、
おっ、ちょうどいいじゃん。データ揃ってるしこの中でEvent Trackingとかしちゃおうぜ！！ってなるじゃん。
**にんげんだもの。**

でもね.....

カスタムJavascriptはもっとひどくて、謎に何度も動いたりする場合がある。
カスタムJavascript in カスタムJavascriptとかすると謎挙動のオンパレードになる。
**もうグローバルオブジェクトとか作って制御するしかない。( ･ㅂ･)و ̑̑ ｸﾞｯ**

でこうしてみた。

```
window.clickValidate = window.clickValidate || 0;

if (window.clickValidate === 0) {
  if (なんか判定式 part1) {
    // たとえばこんなかんじで
    ga('mutual.send', 'event', 'hogefuga', 'click', target.text);
  }

  // sidemenu event tracking
  if (なんか判定式 part2) {
    // たとえばこんなかんじで
    ga('mutual.send', 'event', 'foobar', 'click', target.text);
  }
  window.clickValidate++;
}
```

リンクをクリックした時の挙動なので、
クリックしたら別のページに遷移するからまだ動いてないか動いたかの判定のみ。
(だったらtrue OR falseでよかったね...)
Ajaxでページ遷移せずにやるとか#とかがある場合は別の手を考える必要があるかも
画像ファイルからMacのQuickTimeで開けるmp4ファイルを作る

# はじめに

複数の画像を連結してmp4ファイルを作る方法です。
コマンドラインで使えるように ffmpeg を使ってみましたが、オプションが多くはまりどころも多いです。
最小限の手順をメモしておきます。

# 手順

### ffmpegのインストール

homebrewでインストールします。

```
brew install ffmpeg
```

### 画像ファイルの準備

ファイル名を連番で準備しておきます。私はtifファイルで画像を作成し、*001.tif*, *002.tif*, ...というようにファイル名をつけておきました。

### ffmpegの実行

結論から書いてしまうと変換コマンドは以下のようになります。

```
ffmpeg -r 25 -i %03d.tif -pix_fmt yuv420p output.mp4
```

- -rオプションはフレームレートを指定します。
- -iオプションは入力ファイルを指定します。連番の部分は *%03d* のように指定できます。
- **`-pix_fmt yuv420p` を指定する必要があります。** これが無いとQuickTimeで再生できるmp4になりません。
    - 参考 : http://qiita.com/NaokiOgawa/items/ce94e972992b63b87043
- （任意）-cオプションでコーデックを指定できます。例えば `-c:v libx264`といった具合です。**このオプションは-iの後に来なければいけません！**
    - 参考 : http://isaji.jp/popfulmail/index.php?%B0%CB%BB%B0%BC%A1%2F2008-03-24
範囲変数を使った case の書き方

Swift の switch-case 文は使える書き方が非常に多くて強力で、とくに範囲が使えるのは非常に助かりますね（以前言ってた効率面の問題はまあ別として）。例えば極端なはなしではありますが、このような書き方もできます：

```swift
let x = Int(arc4random_uniform(1000))
switch x {
case 0 ..< 100:
	println("x is smaller than 100")
	
default:
	println("x is larger than 100")
}
```

これを普通の書き方でcase 0, 1, 2, 3………と延々と書くとさすがにだるすぎて心が折れそうですね。
ところがこんな書き方ができるのはいいんですけど、おそらく内部処理としてはコンパイル時にこの範囲を展開しているだけで、case 文自体は範囲変数に対応していないと思います、多分。なので以下のようにここの 0 ..< 100 を範囲変数として入れておくと文法エラーが起こります

```swift
let x = Int(arc4random_uniform(1000))
let range = 0 ..< 100
switch x {
case range:
	println("x is smaller than 100")
	
default:
	println("x is larger than 100")
}
```

今まで筆者は「何なんだよ範囲変数使えないのかよ（泣）」と涙目になりながら範囲を書いてその後ろにコメントで範囲変数を入れてたのですが、さっき気づいたことですけど case 文で where が使えるし更に find は範囲変数に対しても有効なので、こんな書き方も出来ます：

```swift
let x = Int(arc4random_uniform(1000))
let range = 0 ..< 100
switch x {
case let x where find(range, x) != nil:
	println("x is smaller than 100")
	
default:
	println("x is larger than 100")
}
```

まあ書き方がちょっと面倒なのはしかたないですが、これで範囲変数をそのまま利用できるのは非常に大きいと思うんですね。ただ気持ち悪いのはなんで case の直後に let X を書かないといけないのか…なんでそのまま case find… はダメなのか…というところです

ちなみにどうでもいい事言うとここの let は switch になっているものを更に別の定数に代入するというプロセスで、アップルの公式テキストブックでは</del>

```swift
let vegetable = "red pepper"
switch vegetable {
	//何かのケース
	
case let x where x.hasSuffix("pepper"):
	//何かしらの pepper の場合
	
default:
	//その他
}
```

という例文がありますので、これからもお察しの通り、別に case let の後ろはなんだっていいんです。本当になんでここで一回 let かます必要があるんですかね…（だってここでは書いてないけど where のうしろに実は vegetable.hasSuffix("pepper") もちゃんと動くんだよ…


--------

ところが karupanerura の[記事](http://qiita.com/karupanerura/items/425b00839c1c358c2d7a)でふっと気づきました…もしかして単に変数の型が違うだけじゃね？というわけで、早速検証してみましょう。まずは通常の範囲変数宣言：

```swift
let testRange = 0 ..< 100
```

これで opt キー押しながら testRange 変数をクリックしてみましょう。すると `let testRange: Range<Int>` の説明が出てくるはずです。ところが上記の karupanerura さんの記事によりますと `..<` は　`HalfOpenInterval<T>` 型だそうです。なるほど。確かに微妙な違いではありますが型が違うと強い静的型付け言語である Swift は受け付けてくれないわけですね。<del>なんでデフォルトでは `Range` 型で宣言するかの問題は置いとくとして。</del>というわけで型を明示して宣言してみましょう：

```swift
let x = Int(arc4random_uniform(1000))
let range: HalfOpenInterval<Int> = 0 ..< 100

switch x {
case range:
	println("x is smaller than 100")
	
default:
	println("x is larger than 100")
}
```

はい、これで普通に `case range:` で書いてもコンパイル通ります！やったね！
AWS AutoScaling スケジュール実行


> ※追記 マネジメントコンソール上でもscheduled設定できるようになったようです。

# マネジメントコンソールでの設定

 ![autoscaling1.jpg](https://qiita-image-store.s3.amazonaws.com/0/9519/c4729ed8-d3ea-16fc-022f-25ecc80619e2.jpeg)

 ![autoscaling2.jpg](https://qiita-image-store.s3.amazonaws.com/0/9519/568f3601-4850-c59e-ebf9-2f92276ac13a.jpeg)

- - - 

# コマンドラインでの設定

as-put-scheduled-update-group-actionコマンドを使えばmm月dd日以降この設定したいというときに使える。

例えば、月初だけインスタンス数を増やしたい、深夜帯だけインスタンスを減らしたいなど
期間内スケジュールを実行したいときは、--recurrenceオプションを使うことにより簡単に期間内の設定できる。

参考:AWSドキュメント
http://docs.aws.amazon.com/ja_jp/AutoScaling/latest/DeveloperGuide/schedule_time.html

## 準備
マネジメントコンソールで設定できないのでAWS CLIを使う。

### 設定

```
$ aws configure
AWS Access Key ID [****************5A#]:
AWS Secret Access Key [****************D3IT]:
Default region name [ap-northeast-1]:
Default output format [json]:
```

~/.aws/credentials
が作成される

### 微修正

``` bash:credentials
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYY
``` 
が生成されるがなぜか as系コマンド実行で"Malformed input-Bad credentials in file: "
と怒られたので、以下のように書き換える

``` bash:credentials
AWS_ACCESS_KEY=XXXXXXXXXXXXXXXXXXX
AWS_SECRET_KEY=YYYYYYYYYYYYYYYYYYYYYYYYYYYY
```

### 環境変数設定

```
$ # credentialファイルを環境変数に設定
$ export AWS_CREDENTIAL_FILE=~/.aws/credentials
```



## スケジュールの登録

例えば、
月末(28-31日)にインスタンス最小数を増やし
月初(3日)にインスタンス最小数を減らす

### 月末にインスタンス最小数を増やす

毎月28-31日 23:00 にスケジュール実行 インスタンス数の最小を5,最大を10に設定

```
$ as-put-scheduled-update-group-action {スケジュール名} -g {Auto Scaling Group} --name {スケジュール識別名} --region ap-northeast-1 --recurrence "00 14 28-31 * *" -min-size 5 -max-size 10
```

> 時刻はUTCで設定すること
> --recurrence オプションを使うことによりLinuxのcronのようにスケジュールを実行

### 登録されたスケジュール確認

```
$ as-describe-scheduled-actions --headers
```

### Auto Scalingで立ち上がったインスタンス確認

```
$ as-describe-auto-scaling-instances --region ap-northeast-1
```

### 月末にインスタンス最小数を減らす(戻す)

毎月 3日 03:00 スケジュール実行 インスタンス数の最小を2,最大を10に設定

```
$ as-put-scheduled-update-group-action {スケジュール名} -g {Auto Scaling Group} --name "スケジュール識別名" --region ap-northeast-1 --recurrence "00 18 3 * *" -min-size 2 -max-size 10
```

## スケジュールの削除

```
$ as-delete-scheduled-action {スケジュール識別名} --auto-scaling-group {Auto Scaling Group}
```
Rubyでメールアドレスのバリデーション

RailsのActiveModelのバリデーションではなく、普通の処理の中でメールアドレスが正しいかどうか確かてみる

ここでは正規表現を書かずにAciveModelのバリデータである、`validates_email_format_of `を使う

インストール

```
$ gem install validates_email_format_of
```

使う

```rb
require 'validates_email_format_of'

ValidatesEmailFormatOf.validate_email_format('hoge') # ["does not appear to be valid"]
ValidatesEmailFormatOf.validate_email_format('hoge@example.com') # nil
```

自分で正規表現を書かずに済むので楽
docker registry frontendインストール


docker registry のリポジトリの中身をGUIで見れるツールです。
mac上のboot2dockerで入れてみました。

https://github.com/kwk/docker-registry-frontend


## インストール
イメージをpullしてきてContainerとして起動させます。

```
# docker run -d \
-e ENV_DOCKER_REGISTRY_HOST=192.168.59.103 \
-e ENV_DOCKER_REGISTRY_PORT=5000 \
-p 8080:80 \
--name registry_frontend \
-h registry_frontend \
konradkleine/docker-registry-frontend
```

ENV_DOCKER_REGISTRY_HOST→docker_registryのホスト名orIP
ENV_DOCKER_REGISTRY_PORT→docker_registryのポート

本環境ではboot2docker上のcontainerでport5000で転送してるので、boot2dockerのipを指定してます。

```
$ boot2docker ip
192.168.59.103
$ docker ps
CONTAINER ID        IMAGE                                          COMMAND                CREATED             STATUS              PORTS                           NAMES
f204916b2099        stackbrew/registry:latest                      "docker-registry"      2 hours ago         Up 2 hours          0.0.0.0:5000->5000/tcp          registry            
```


## 画面イメージ
### トップページ
![スクリーンショット 2015-02-12 17.07.18.png](https://qiita-image-store.s3.amazonaws.com/0/59856/d686ec51-5294-7d08-2774-8a49fc0b2c85.png "スクリーンショット 2015-02-12 17.07.18.png")

### リポジトリ一覧
![スクリーンショット 2015-02-12 17.07.28.png](https://qiita-image-store.s3.amazonaws.com/0/59856/0d3b6099-178c-434f-843b-8686524de206.png "スクリーンショット 2015-02-12 17.07.28.png")

### リポジトリの中身
リポジトリごと消したり、特定のtagを消したりがGUIで出来ます。

![スクリーンショット 2015-02-12 17.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/59856/3fcae7f6-90e0-1502-3736-407b68577a4d.png "スクリーンショット 2015-02-12 17.09.20.png")

![スクリーンショット 2015-02-12 17.11.07.png](https://qiita-image-store.s3.amazonaws.com/0/59856/b368a3c7-be27-4f11-e7af-b5281944ec2d.png "スクリーンショット 2015-02-12 17.11.07.png")
macでmemcachedを導入する手順

# インストール

`brew install memcached`

実行すると下記のように表示されるはず。

```
$ brew install memcached
==> Installing memcached dependency: libevent
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/libevent-2.0.22.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring libevent-2.0.22.yosemite.bottle.tar.gz
?  /usr/local/Cellar/libevent/2.0.22: 48 files, 1.8M
==> Installing memcached
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/memcached-1.4.20.yosemite.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring memcached-1.4.20.yosemite.bottle.1.tar.gz
==> Caveats
To have launchd start memcached at login:
    ln -sfv /usr/local/opt/memcached/*.plist ~/Library/LaunchAgents
Then to load memcached now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist
Or, if you don't want/need launchctl, you can just run:
    /usr/local/opt/memcached/bin/memcached
==> Summary
?  /usr/local/Cellar/memcached/1.4.20: 10 files, 184K
```

# 自動起動の設定

下記のコマンドを実行する。

`ln -sfv /usr/local/opt/memcached/*.plist ~/Library/LaunchAgents`
`launchctl load ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist`

# 動作確認

まずプロセスが起動しているか確認する。

`ps aux | grep memcached`

下記のように /usr/local/opt/memcached/bin/memcached が表示されていればOK。

```
$ ps aux | grep memcached
username  67407   0.0  0.0  2440964    660 s000  S+    4:00PM   0:00.01 grep memcached
username  67399   0.0  0.1  2465176   2240   ??  S     3:56PM   0:00.03 /usr/local/opt/memcached/bin/memcached -l localhost
```

次にtelnetで接続して値の保存と取得ができるか確認します。

`telnet localhost 11211`

telnetで接続すると下記のような表示がされると思います。

```
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
```

まずは値の保存をします。testというキーにabcdという値を入れます。

```
set test 0 0 4 ←ここまで入力したらenter
abcd
```

実行すると下記のように STORED と表示されます。

```
set test 0 0 4
abcd
STORED
```

次に値の取得をします。testというキーに保存されている値を取得します。

```
get test
```

実行すると下記のように保存されている abcd が表示されます。

```
get test
VALUE test 0 4
abcd
```

確認が完了したら `Ctrl + ]` でログアウト後 `quit` でtelnet接続を終了します。

# 起動オプション

```
-d : デーモンとして起動します。
-p <ポート番号> : TCPポートの指定ができます。デフォルトは11211です。
-U <ポート番号> : UDPポートの指定ができます。デフォルトは11211です。
-m <MegaByte数> : 保存領域の最大サイズを指定します。デフォルトは64MBです。
-c <同時接続数> : 同時接続数の最大を指定します。デフォルトは1024です。
-P <ファイル名> : プロセスIDを保存するファイルを指定します。-dオプションを使用した時のみ使用されます。
-I <サイズ> : slab pageのデフォルトサイズを上書きします。デフォルトは1MBで、最小1KBから最大128MBまでの範囲で指定できます。
```

自動起動されるmemcachedに上記の起動オプションを適用するにはplistを編集する必要があります。

`vi ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist` などで編集して起動時の引数を追加しましょう。

ちなみにplistの編集で失敗すると起動できなくなるので、編集したら `plutil -linst <plistファイル>` で文法チェックをしましょう。
docker1.5の新機能[stats]を使用して、外部からリソース状況を拾ってみる。

### 検証した環境
**Docker Server: CentOS 7**

### statsについて
  - stats     Display a live stream of one or more containers' resource usage statistics<BR>1つ以上のコンテナリソース状況をライブ表示する
  - 1秒間隔でデータを取得する<BR>感覚的にはUnixのtopコマンド

### 参考資料
  - docker reference<br>
  https://docs.docker.com/reference/commandline/cli/#stats <BR>
  https://docs.docker.com/reference/api/docker_remote_api_v1.17/

### dockerコマンドで取得した場合

```
# docker stats cadvisor

  CONTAINER           CPU %               MEM USAGE/LIMIT      MEM %               NET I/O
  cadvisor            1.66%               25.3 MiB/3.704 GiB   0.67%               11.23 MiB/27.22 MiB
```

簡易的はビューには重宝しますね。

### 外部からAPIを使用して取得する場合

- docker confに外部接続許可設定を加える<BR>今回使用したのは2375/tcp ポート。

```lang:/etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
# OPTIONS=--selinux-enabled -H fd://
OPTIONS=--selinux-enabled -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

# Location used for temporary files, such as those created by
# docker load and build operations. Default is /var/lib/docker/tmp
# Can be overriden by setting the following environment variable.
# DOCKER_TMPDIR=/var/tmp
```

### docker 再起動

    # systemctl restart docker.service

### ポート開放

    # firewall-cmd --add-port=2375/tcp

### コンテナのステータスを取得する
    $ curl -X GET http://127.0.0.1:2375/containers/[container id]/stats

上記で取得した場合、延々とステータス情報が垂れ流されるので、運用データとしての収集には不向きかなと。
そこで、タイムアウトを1秒としてjqを使用しjsonデータを加工してみた。

  - cpuのステータス情報を表示する場合

        $ curl -X GET http://127.0.0.1:2375/containers/[container id]/stats --max-time 1 | jq '.cpu_stats'
          % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
        100  1961    0  1961    0     0   1210      0 --:--:--  0:00:01 --:--:--  1210
        curl: (28) Operation timed out after 1620 milliseconds with 1961 out of -1 bytes received
        {
          "throttling_data": {
            "throttled_time": 0,
            "throttled_periods": 0,
            "periods": 0
          },
          "system_cpu_usage": 1.01798489e+15,
          "cpu_usage": {
            "usage_in_usermode": 1.0411e+11,
            "usage_in_kernelmode": 5.916e+10,
            "percpu_usage": [
              99302252799,
              101617606123
            ],
            "total_usage": 200919858922
          }
        }

必要に応じてこのデータを収集ツールに食べさせるスクリプトを組めば、運用がはかどりますね。

~~※ timed outの表示が不細工なので何とかしないと。まぁ、実データとしてはそっから下だし良いか。~~

#### 追記(解決)

** -s オプションを加える事で簡単に消せました( 2015/02/18 ) **

    # curl -s -X GET http://127.0.0.1:2375/containers/[container id]/stats --max-time 1 | jq '.cpu_stats'
    {
      "throttling_data": {
        "throttled_time": 0,
        "throttled_periods": 0,
        "periods": 0
      },
      "system_cpu_usage": 2.03790306e+15,
      "cpu_usage": {
        "usage_in_usermode": 5.0961e+11,
        "usage_in_kernelmode": 3.5196e+11,
        "percpu_usage": [
          445562955080,
          439404240147
        ],
        "total_usage": 884967195227
      }
    }