OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub 初心者による GitHub 入門（１）〜 git のインストールとセットアップ・リポジトリの作成・ clone 〜

## はじめに

GitHub はじめました。
初めて使用するので、その手順を残したいと思います。

### ローカル環境

* Mac OSX Yosemite 10.10.1
* Homebrew 0.9.5

### 前提条件

GitHub のユーザ登録が完了していること。

### 参考サイト

下記のサイトを参考にさせていただきました。感謝！

* [[git会準備]MacにHomebrewでgitをインストールする | e2esound.com業務日誌](http://blogged.e2esound.com/2013/07/03/git-kai_how_to_install_git_with_homebrew/)

* [GitHubにリポジトリを作成してみる - yk5656 diary](http://d.hatena.ne.jp/yk5656/20140212/1393158928)

## git のインストール

なにはともあれ git が必要なので、インストールします。

```sh:ターミナル
$ brew install git
```

インストールの確認をします。

```sh:ターミナル
$ git --version
git version 2.2.1
```

インストール完了！やったね。

## git のセットアップ

忘れちゃいけない、git のセットアップ。
自分の名前とメールアドレスを設定しましょう。

```sh:ターミナル
$ git config --global user.name "meguma"
$ git config --global user.email "memegumama@gmail.com"
```

こちらも参考に。
[Set Up Git - User Documentation](https://help.github.com/articles/set-up-git/)

## GitHub にリポジトリを作成する

「new repository」ボタンを押して、リポジトリを作成します。

私はこんな感じで入力して、` sample `リポジトリを作成してみました。

![create_repo.png](https://qiita-image-store.s3.amazonaws.com/0/62698/a58131fa-e496-cb13-e5a5-e1a3585e4ceb.png)

「Create repository」をポチッとな。

![sample_repository.png](https://qiita-image-store.s3.amazonaws.com/0/62698/4b5d0014-b2ad-c92b-9949-ba2bb0f87396.png)

これでリポジトリが完成！

こちらも参考に。
[Create A Repo - User Documentation](https://help.github.com/articles/create-a-repo/)

## リモートリポジトリを clone する

作成したリモートの` sample `リポジトリを clone します。

ローカルに適当なフォルダを作成します。
今回はリポジトリを管理する` gitrepos `ディレクトリを作成し、
ここに` sample `リポジトリを clone しました。

```sh:ターミナル
$ mkdir gitrepos
$ cd gitrepos
$ git clone https://github.com/meguma/sample.git
Cloning into 'sample'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
Checking connectivity... done.
```

これで、リモートリポジトリを自分のローカルリポジトリに clone できました！


## ローカルリポジトリのブランチを確認する

clone できたので、ローカルリポジトリのブランチを確認してみましょう。

```sh:ターミナル
$ git branch
* master
```

-a オプションをつけることで、リモートのブランチも確認することができます。

```sh:ターミナル
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```

## 余談

個人的にプチつまづいたところ。

最初、git のセットアップをしないまま（セットアップが必要であることを忘れてました・・・）
git clone を行ってしまい（clone は普通に成功する・・・）
git branch コマンドを使用した場合、下記のエラーが発生しました。

```sh:ターミナル
$ git branch
fatal: Not a git repository (or any of the parent directories): .git
```

これは、git のセットアップが行われていないため、
正しく ` .git `ディレクトリが作成されないことが問題となっているようです。

` .git `ディレクトリには git で管理するための情報が詰まっています。
正しく git セットアップを行ってから、clone しなおすことで、
` .git `ディレクトリが作成され、エラーを解消することができました。


## 次回予告

次回は add して commit して push したいと思います。



以上、おわり。
DockerでDebianを使いたい

[Dockerでいい感じのDebianのイメージが欲しい 最新 - Qiita](http://qiita.com/catatsuy/items/8f6c0809b7140ddd1558)

以前に書いたこの記事ですが，最近またいじりはじめたので今やっている方法をまとめておきます．

現在サポートされているものは [docker/mkimage-debootstrap.sh at master · docker/docker](https://github.com/docker/docker/blob/master/contrib/mkimage-debootstrap.sh) とのことです

Debian 以外の `debootstrap` が使えるディストリビューションに対応しているようですが Debian でしか動かしたことないです．
それで以下の様に実行します．

    LANG=C ./mkimage-debootstrap.sh -t wheezy.tar wheezy http://ftp.jp.debian.org/debian

これで apt のミラーが日本のものの wheezy のイメージである wheezy.tar というファイルが手に入ります．
このファイルをインポートするには以下のようにします

    cat wheezy.tar | docker import - catatsuy/wheezy

このスクリプトは `debootstrap` に `--variant=minbase` が指定されているために普通の Debian には入っているパッケージなどが入っていなかったりします．

[Best practices for writing Dockerfiles - Docker Documentation](https://docs.docker.com/articles/dockerfile_best-practices/)

ここにあるように Docker のイメージには不要なパッケージのインストールは避けるべきなので `--variant=minbase` で最低限のパッケージのみをインストールして必要な物は全部 Dockerfile に書いてあげます．

このイメージを使った Dockerfile は以下の様になります．

```Dockerfile
FROM catatsuy/wheezy

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update

RUN apt-get install -y \
  ca-certificates
```

ca-certificates は SSL の証明書で Debian だと標準で入っていないので外部と HTTPS で通信をしようとすると失敗するので必要な可能性が高い上にはまりやすいところだと思うので気を付けてください（というかはまりました）．

これを土台に必要なものをインストールしていくといい感じになります．
Bashを使ってカレントディレクトリでファイルのみ操作する

カレントディレクトリにディレクトリとファイルが混在している時に、ファイルのみ、コピーや削除をしたいことが時々あります。そのような時、今は以下のコマンドを使っています。

```bash
$ ls -F|grep -v /|xargs -i cp {} ./path/to/dest # ファイルのみコピー
$ ls -F|grep -v /|xargs rm                      # ファイルのみ削除
```

ただし、カレントディレクトリに実行可能なファイルやシンボリックリンクが含まれているとうまく動きません。

```bash
# 実行可能なファイルの例
$ ls -F
dir/ exec.sh* file.txt
$ ls -F|grep -v /|xargs rm
rm: cannot remove `exec.sh*': No such file or directory
$ ls -F
dir/ exec.sh*
```

これは、 `ls -F` が、実行可能なファイルの末尾に `*` を、シンボリックリンクの末尾に `@` を追加したリストを返すからです(他にもFIFOには `|` が、ソケットには `=` が追加されるらしい)。

そこで、こうした場合は `sed` で応急処置をしています。

```bash
ls -F|grep -v /|sed -e "s/\*//g" |xargs rm
```

さすがに長さを感じて、 `find` を試してみたりもしましたが

```bash
find . -maxdepth 1 -type f |xargs rm
```

`maxdepth` が長くて、結局打ち慣れた `ls` に戻っています。
python optparse の結果を dict に変換して活用する

## optparse の基本
Python の非常に便利なモジュールである optparse ですが、
```parse_args``` で得られる ```options``` があまり使い勝手が良くない
と感じるのです。

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

import optparse
parser = optparse.OptionParser()
# option '-i' を追加
parser.add_option('-o', '--output', type='str',
                  help='output filename')

# コマンドライン引数をパース
options, args = parser.parse_args()
print(type(options))
```
例に上げるのはただ単に出力ファイル名を ```-o``` もしくは ```--output```
オプションで指定できるようにした OptionParser ですが、
この返り値 ```options``` って辞書でも何でもなく、```<type 'instance'>```
という型のオブジェクトが返ってくるわけです。
オプションの値にアクセスする場合は ```options.output``` といったように
Attribute にアクセスする形となります。
これ、dict に変更できたら、関数のキーワード引数の位置にそのまま投げれるのにと。

## dict 化
というわけでさくっとやってしまいます。
得に難しいことはせず。以下のように一旦文字列にして組み込み関数の ```eval``` で
Python として解釈してしまえば、```dict``` に変換できてしまいます。

```py
options = eval(str(options))
```

## キーワード引数として
こうなってしまえば、他の関数などにパラメータを渡す場合も楽ですね。

```py
def hogehoge(foo, fuga, **kwargs):
    output = kwargs.get('output', sys.stdout)

hogehoge(foo, fuga, **options)
```

こんな感じでキーワード付き引数のように使えます。
実装しているアルゴリズムに新しくパラメータを追加する必要が
出来たときなど、地味に役にたつ一工夫ですた。
私が2015年に作りたい物

# はじめに
2015年、今年作りたい物がある！
言葉に出し宣言しておくと何故か物事は進む！

# iOS用ノック操作ライブラリ
iPhone、iPadで本体ノック操作を受け付ける処理ライブラリ。
加速度センサによりノック回数とノックのパターンを認識しイベントを実行します。

使用シーンは
　ランニングや運転中の音楽プレーヤ操作
　テキストエディタでのコピペ呼び出し
　お気に入り登録操作
などなど。

# ミニチュア外部モニタ
イメージとしては、これに実際にモニタを埋め込んだような。
もう少しシンプルでも良いけれど。
サブモニタとして使用も可能にしたい。

![4943209520145.jpg](https://qiita-image-store.s3.amazonaws.com/0/63205/2d44e406-449d-cbda-0deb-a5424f5c7549.jpeg)

DSでこんなのを作っていた人がいた。
http://miki800.com/arcade_cabinet/

# グレートタイムライン
宇宙の始まりから、現在、未来までの出来事を一つのタイムラインに集約した、すべてのタイムライン。

イメージは「タイムライン版のWikipedia」

「中国三国志の時代、日本は卑弥呼の邪馬台国だった」
「イギリスで産業革命が始まった頃、平賀源内がエレキテルを作っていた」

外部からAPI経由で登録可能。
また検索もAPI経由でJSONで返却。

# おわりに
宣言することで自分を駆り立てるメソッド。

ワクワクする物を作りたいです。
ActionMailerでメールを送るとき，slimを使って改行を入れる

# 1. はじめに

RailsでActionMailerを使ってメールを送信するとき，
本文のテンプレートにslimを使っていると改行を入れる方法が見つけられませんでした．

今回は力技気味ですが，改行を入れることに成功したので記録しておきます．

そもそも，ここだけでもslimを使わなければ良いので，
どうしてもslimを使ったままやりたいという人向け．

# 2. rubyファイルの方で何とかする

```app/mailers/notice_mail.rb
def send_mail(email, subject)
  @body = "改行\r\n"
  @body += "します\r\n"
  mail to: email
  mail subject: subject
```

```app/views/send_mail.text.slim
| #{ @body }
```

元々，引数にbodyを持たせておき，それを表示する分には問題がありませんが，
最後にテンプレートなどを付けたい場合はこのように力技でしか解決できませんでした．

また，mail body: bodyとしても本文に載りますが，
何故かsubjectが正しく出なかったため，viewsの方で表示しています．
もしかしたら，bodyは先頭に書けば解決したのかもしれません．

# 3. もっと賢い方法

mailerのテンプレートだけslim以外を使いましょう．
OS X の say コマンドで延々と 2 桁かける 1 桁の掛け算をしゃべり続けるスクリプト

```bash
#!/usr/bin/env bash


while true ;
do
    a=$(( $RANDOM % 9 + 1 ))$(( $RANDOM %9 + 1 ))
    b=$(( $RANDOM % 8 + 2 ))
    c=$(( a * b ))

    say -v Kyoko "$a 、かける、 $b 。わ"
    sleep 2
    say -v Kyoko "$c"
    sleep 1
done
```
Laravelをサブディレクトリで動かす

# 参考
http://kore1server.com/279/

#概要
すでに既存のシステムがexample.comとして稼働している状態で、`example.com/laraveltest`にアクセスした場合は、処理をlaravelに任せたい。
基本的にはnginxのconfを修正するのみ。

なお、LinuxMintの場合、nginxのデフォルト設定は`/etc/nginx/sites-available/default`となっている。（apt-getでインストールした場合）

# 実際のconfの内容

以下の`location ~ ^/laraveltest((/)?(.+))?$ {`で始まっているlocationディレクティブを追加するのみ。
追加したら`nginx -s reload`で再起動すれば、`example.com/laraveltest` にアクセスするとちゃんとlaravelアプリケーションが動作する。

```nginx:/etc/nginx/sites-available/default
server {

    #...省略

    #ここを追加する。
    location ~ ^/laraveltest((/)?(.+))?$ {

        root /var/www/nginx/laraveltest/public;
 
        try_files $1 /laraveltest/index.php?$query_string;
 
        location ‾ ^/laraveltest/index.php$ {
            include fastcgi_params;
            #try_files                $uri = 404;
            include                  fastcgi_params;
            fastcgi_param            SCRIPT_FILENAME $document_root/index.php;
            fastcgi_param            PATHINFO        $fastcgi_path_info;
            fastcgi_param            PATH_TRANSLATED $document_root$fastcgi_path_info;
            fastcgi_split_path_info  ^(.+¥.php)(/.+)$;
            fastcgi_pass            127.0.0.1:9000;
            fastcgi_index index.php;
        }
    }
    # ... 省略
}
```

# ディレクトリ名とURLを分けたい場合
URLは`/laraveltest`にしたいけど、Laravel自体は`hoge`というディレクトリにあるんだよね〜という場合は、単純にrootディレクティブを以下のように変更するのみ。

```nginx:/etc/nginx/sites-available/default
root /var/www/nginx/hoge/public
```
aptの依存関係を知りたいそんなときに

apt の依存関係を知りたい時があります．特に『このライブラリは何が依存しているの！？』みたいなシチュエーションは割とあります．

そのパッケージが依存しているパッケージを知りたい場合は以下のコマンドで分かります．

    apt-cache depends ca-certificates

逆にそのパッケージに依存しているパッケージを知りたいときは以下のコマンドで分かります．

    apt-cache rdepends ca-certificates

めっちゃ便利なのでおすすめです．
電大UNIPAログインPHPスクリプト

脳を停止しても出来る方法

使うもの
+ PHP
+ Goutte
+ composer

まず設定ファイル

```php:keys.php
<?php
// TODO: write this
define('TDU_USER_ID', '*******');
define('TDU_USER_PW', '************');
```
keys.php に保存
もちろんこのファイルは絶対に公開してはいけない

composer.jsonに以下を追加

```json:composer.json
    "require": {
        "fabpot/goutte": "~2.0"
    }
```

```shell-session
composer install
```

実行スクリプト

```php:marco.php<?php

require_once('./vendor/autoload.php');
require_once('./keys.php');
use Goutte\Client;

$client = new Client();
$url = 'https://portal.sa.dendai.ac.jp/up/faces/login/Com00504A.jsp';

$crawler = $client->request('GET', $url);
if ($logout_btn = $crawler->selectButton('form1:logout')) {
    // セッションタイムアウトページの場合
    $crawler = $client->submit($logout_btn->form(), array());
}

// submitするform
$form = $crawler->selectButton('form1:login')->form();
// POSTするパラメータ
$params = array(
    'form1:htmlUserId' => TDU_USER_ID,
    'form1:htmlPassword' => TDU_USER_PW
);
$crawler = $client->submit($form, $params);
$username = $crawler->filter('span')->text();
echo $username . "\n";
```

出力

```shell-session
◯◯　◯◯ さん ： 前回ログイン 2015/01/17 00:47

```
BibTeX使用時に「参考文献」を目次に出力する

LaTeX+BibTeXで文章を書いていて、「参考文献」が目次に表示されていないことに気が付きました。解決までに少しつまづいたので、経緯と解決法を書いてみます。

# 経緯
検索して調べた結果、 `thebibliography` 環境の中に

```latex
\addcontentsline{toc}{chapter}{\bibname}
```

を追加して、再定義してやることで対応できるようでした。そこで、使用中の `jsbook` で該当する箇所を見てみたところ

```latex:jsbook.cls
\newenvironment{thebibliography}[1]{%
  \global\let\presectionname\relax
  \global\let\postsectionname\relax
  \chapter*{\bibname}\@mkboth{\bibname}{}%
  \addcontentsline{toc}{chapter}{\bibname}%  <-書いてある
   \list{\@biblabel{\@arabic\c@enumiv}}%
        {\settowidth\labelwidth{\@biblabel{#1}}%
         \leftmargin\labelwidth
         \advance\leftmargin\labelsep
         \@openbib@code
         \usecounter{enumiv}%
         \let\p@enumiv\@empty
         \renewcommand\theenumiv{\@arabic\c@enumiv}}%
   \sloppy
   \clubpenalty4000
   \@clubpenalty\clubpenalty
   \widowpenalty4000%
   \sfcode`\.\@m}
  {\def\@noitemerr
    {\@latex@warning{Empty `thebibliography' environment}}%
   \endlist}
```

問題の記述が元から書いてありました。

気を取り直して、利用していたパッケージを調べていったところ、 `natbib` で原因を発見します。

```latex:natbib.sty
\renewenvironment{thebibliography}[1]{%
 \bibsection\parindent \z@\bibpreamble\bibfont\list
   {\@biblabel{\arabic{NAT@ctr}}}{\@bibsetup{#1}%
    \setcounter{NAT@ctr}{0}}%
    \ifNAT@openbib
      \renewcommand\newblock{\par}
    \else
      \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
    \fi
    \sloppy\clubpenalty4000\widowpenalty4000
    \sfcode`\.=1000\relax
    \let\citeN\cite \let\shortcite\cite
    \let\citeasnoun\cite
 }{\def\@noitemerr{%
  \PackageWarning{natbib}
     {Empty `thebibliography' environment}}%
  \endlist\vskip-\lastskip}
 \let\bibfont\relax
```

このソースを使って、プリアンブルで `thebibliography` 環境を再定義することで「参考文献」を目次に表示することが出来ました。

# 解決法
プリアンブルの中、 `\usepackage{natbib}` の後ろに、

```latex
\makeatletter
\renewenvironment{thebibliography}[1]{%
 \bibsection\parindent \z@\bibpreamble\bibfont\list
   {\@biblabel{\arabic{NAT@ctr}}}{\@bibsetup{#1}%
   \addcontentsline{toc}{chapter}{\bibname}%
    \setcounter{NAT@ctr}{0}}%
    \ifNAT@openbib
      \renewcommand\newblock{\par}
    \else
      \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
    \fi
    \sloppy\clubpenalty4000\widowpenalty4000
    \sfcode`\.=1000\relax
    \let\citeN\cite \let\shortcite\cite
    \let\citeasnoun\cite
 }{\def\@noitemerr{%
  \PackageWarning{natbib}
     {Empty `thebibliography' environment}}%
  \endlist\vskip-\lastskip}
 \let\bibfont\relax
\makeatother
```

を書きます。

定義の中で@が登場するので、 `\makeatletter`と `\makeatother` で包んでいます。
Androidの暗号化ライブラリConcealを使ってみる

## 重要なデータを保存するときは暗号化しよう

Androidで重要なデータをSharedPreferenceや内部ストレージに保存する際、セキュリティを考慮して暗号化した値を保存することが好ましいです。

「Android AES」とかでググれば色々な例は出てきますが、秘密鍵をソース内にベタに書いてたりする微妙なコードも多いので注意です。
で、調べるうちに、Facebookが公開している[Conceal](https://facebook.github.io/conceal/)という暗号化ライブラリに行き着きました。
ソースを全部読んでるわけではないですが、

- APIがシンプル
- Android 4.3以前の端末で標準の暗号化ライブラリより高速
- 暗号化アルゴリズムはAES-GCM
  - 実装はOpenSSLのもので、JNI経由でネイティブコードで実行する
- 暗号化に使う秘密鍵は初回に生成し、SharedPreferencesに保存している
- Androidの既知の乱数生成関連の不具合にも対応済み

な感じでした。

## Concealの使い方

### build.gradleに一行足す

```
compile 'com.facebook.conceal:conceal:1.0.3@aar'
```

- 2016/02/17 ライブラリのバージョンを1.0.3に更新
    - 古いバージョンは脆弱性のあるOpenSSLを使っているため、必ず最新版を使ってください
    - 古いバージョンは64bit対応していないため、必ず最新版を使ってください

### サンプルコード

大きいデータやファイルに対しては、getCipherOutputStreamというストリームベースのAPIもありますが、ここでは小さい文字列なのでencrypt/decryptを使用。

```java
    private void testConceal() {

        String plainText = "この文字列を暗号化したいのだ";

        // encrypt/decryptのときに同じ文字列を渡す必要がある
        String name = "hoge";
        KeyChain keyChain = new SharedPrefsBackedKeyChain(context, CryptoConfig.KEY_256);
        Crypto crypto = AndroidConceal.get().createDefaultCrypto(keyChain);

        if (!crypto.isAvailable()) {
            return;
        }
        try {
            // UTF8でbyte[]に変換して、暗号化する
            byte[] cipherText = crypto.encrypt(plainText.getBytes("utf-8"), new Entity(name));

            // 暗号化されたbyte[]を復号化して、UTF8で文字列に戻す
            byte[] decrypted = crypto.decrypt(cipherText, new Entity(name));
            String data = new String(decrypted, "utf-8");

            Log.v("test", "decrypted data is " + data);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (CryptoInitializationException e) {
            e.printStackTrace();
        } catch (KeyChainException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
```

## 参考

- https://facebook.github.io/conceal/
- https://code.facebook.com/posts/1419122541659395/introducing-conceal-efficient-storage-encryption-for-android/
sky formsという素敵すぎるフォームについて・・・

WebアプリケーションやHPなど作っていると、コンタクトフォームやログインフォームを作ることがありますよね。

フォーム系はメールアドレスの整合性だったり、必須入力のものなどその案件に応じてつけていくと思いますが、開発者によっては何も考えずにサーバーサイドでバリデーションをかけたり、整合性をチェックすることがあると思います。

色々ご批判を頂くかもしれませんが、僕個人的にはサーバーサイドで整合性をチェックしている時のレスポンスを待つ時間だったり、一瞬ページが再読み込みがされた時の一瞬ホワイトアウトする感じがあまり好きじゃありません。また、ネットが遅い環境下で、バリデーションに引っかかってしまった時のガッカリ感は半端ないです。（大げさ）

最近僕的にハマっているのが、[スカイフォーム](http://voky.com.ua/showcase/sky-forms-pro/)です。

下記がデモ画像ですが、
![スクリーンショット 0027-01-16 23.20.46.png](https://qiita-image-store.s3.amazonaws.com/0/64427/3bc80907-dbe5-7b85-2d04-7f93e5f6fb89.png)

Submitボタンを押すと、
![スクリーンショット 0027-01-16 23.21.40.png](https://qiita-image-store.s3.amazonaws.com/0/64427/58d063ca-d9e0-8068-2553-4d558e55be33.png)

背景色変更と共にうまい具合にバリデーションのチェックをしてくれます。

これを軽く応用して、バリデーションエラーメッセージを日本語にしてみると
![スクリーンショット 0027-01-16 23.25.40.png](https://qiita-image-store.s3.amazonaws.com/0/64427/48822c53-0a12-3e14-6b08-fdc6b2711c22.png)

このような形でリアルタイムでチェックしてくれます。（チェックが完了したものは、色を変えて知らせてくれます。）便利！

---

バリデーションは、たとえば下記のようなことが実装可能です。

* 必須項目かどうか
* 最低文字数
* 最大文字数
* メール形式
* チェックが入っているか
* パスワード、パスワード再入力のパスワードが一致しているか
* etc

カスタマイズも可能です。

視覚的にパッとわかり、僕的にはナイスです。ご参考まで。
Microsoft AzureのMobile Servicesを使う - Part1: Dockerにxplat-cliをインストール

新しくSaltクラスタをAzureに構築してみようと思います。LinuxからAzureのコマンドラインを使うため、xplat-cli([Microsoft Azure Cross Platform Command Line](http://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli/))をインストールして使います。

## xplat-cli用のコンテナ

xplat-cliはNode.jsで書かれたツールなので、Node.js用コンテナを[dockerfile/nodejs](https://registry.hub.docker.com/u/dockerfile/nodejs/)から作成します。

``` bash
$ docker pull
$ docker run -it --name nodedev dockerfile/nodejs
```

azure-cliをインストールします。

``` bash
$ npm install -g azure-cli
```

バージョンを確認します。

``` bash
$ azure -v
0.8.13
```

## アカウント設定

アカウント設定ファイルをダウンロードするURLが表示されるので、Webブラウザで開き、Microsoft Azureにログインします。xxx-credentials.publishsettingsの名前の、アカウント設定ファイルをダウンロードします。

``` bash
$ azure account download
info:    Executing command account download
info:    Launching browser to http://go.microsoft.com/fwlink/?LinkId=254432
help:    Save the downloaded file, then execute the command
help:      account import <file>
info:    account download command OK
```

ダウンロードしたアカウント設定ファイルをインポートします。

``` bash
$ chmod 400 .publishsettings
$ azure account import .publishsettings
info:    Executing command account import
info:    account import command OK
```

## アカウント情報

アカウント情報をコマンドから確認します。

``` bash
$ azure account list
info:    Executing command account list
data:    Name  Id                                    Current
data:    ----  ------------------------------------  -------
data:    従量課金  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  true
info:    account list command OK
```

## azure-cliの動作確認

CLIの動作確認のため、Microsoft Azureのロケーションをリストしてみます。

``` bash
$ azure vm location list
info:    Executing command vm location list
+ Getting locations
data:    Name
data:    ----------------
data:    West Europe
data:    North Europe
data:    East US 2
data:    Central US
data:    South Central US
data:    West US
data:    North Central US
data:    East US
data:    Southeast Asia
data:    East Asia
data:    Japan West
data:    Japan East
data:    Brazil South
info:    vm location list command OK
```
int型からchar型へのconvert関数でポカしたこと

　ストアドで引数で入ってきた年(char型)の一年前の12月1日の日付が欲しいっていうことがあって、あー、intにconvertしてから1引いてcharに戻せばいいやろー、って単純に思っていたんだ。
　んで、書いたconvertがこれ

```sql
declare @year char(4)
set @year = '2013'
-- 結果見れるようにselectつけてる
select convert(char, convert(int, @year) -1) + '/12/01'
```

　で、実際に使ってみたんだけど、計算したデータを入れた変数を条件に使っても何も出てこない……。という事態に。
　あれ？　と思ってそこだけ抜き出してManagementStudioでデータ見てみたら、出てきたデータが

「<b>2012△△△△△△△△△△△△△△△△△△△△△△△△△△/12/01</b>」
　※△は半角スペース

　あー！　そういうことー!?

　つまりは、intにconvertした時にこいつが4バイト（32ビット）持ってて、それを何も考えずにcharにしちゃうと32ケタにされて、足りない分右側に空白を埋めてくれるという。そういうことか……！

　というわけで、いそいそと書き直しました。

```sql
declare @year char(4)
set @year = '2013'
-- 結果見れるようにselectつけてる
select convert(char(4), convert(int, @year) -1) + '/12/01'
```
wercker を使って Coq コードを CI する

[wercker](http://wercker.com/) の [Coq box](https://app.wercker.com/#explore/boxes/amutake/coq) をけっこう前に作っていたのでその紹介です。

wercker は [Travis CI](https://travis-ci.org/) のような CI as a Service と呼ばれる類の Web サービスです。基本無料です。
wercker では任意のアプリケーションをインストールした環境 (box といいます) を自分で作ることができて、その環境を使って CI をすることができます。


使い方
----

1. GitHub または Bitbucket にリポジトリ (Private でも可) を作り、wercker にそのリポジトリを登録します。

2. `Make` というファイルを作り、下のように Coq ファイルの名前を書いていきます。
  - ファイル名は `Make` でなくてもいいのですが、[Coq演習第7回](http://qnighy.github.io/coqex2014/ex7.html) に「Makeという名前にすることが多い」と書いているとおり ssreflect やその他いろいろなライブラリで `Make` という名前を使っていたので、ここでも `Make` というファイル名にしています。
  - `Make` ファイルには本当はもっといろいろ書けるのですが、ここでは簡単のためファイル名を書くだけにしています。詳細については [Coq Reference](https://coq.inria.fr/distrib/current/refman/Reference-Manual017.html#sec578) を参照してください。プラグインかつライブラリである ssreflect の `Make` ファイルも参考になると思います。

```:Make
A.v
B.v
C.v
```

3.リポジトリのトップに下のような `wercker.yml` というファイルを作ります。

```yaml:wercker.yml
box: amutake/coq@0.0.2
build:
  steps:
    - script:
        name: build
        code: |
          coq_makefile -f Make -o Makefile
          make
```

こんなかんじに書くと、リポジトリにプッシュする度に wercker で自動的にビルドスクリプトが走ってコードをコンパイルしてみてくれます。Coq ではコンパイルが通る = 証明が正しいということ (`Admitted` とか使ってズルをしてたら別ですけど) なので、Coq の場合は GitHub や Bitbucket にプッシュすると自動でその証明が正しいかどうか確かめてくれるということになります。

こうしておくと、間違っておかしい証明をプッシュしたときにもすぐに気がつけますし、Coq の証明に Pull Request が来たときにも、その証明が正しいかどうかをチェックして結果を表示してくれたりするので嬉しいです。

また、実際に試してみてはいないのですが、頑張れば OCaml とかに抽出してビルドしてデプロイまでの一連の流れをすべて Wercker にやってもらう、みたいなこともできそうです。

[ssreflect/mathcomp の box](https://app.wercker.com/#explore/boxes/amutake/ssreflect) もあります。

たぶん便利なので使ってみてください。
webで頑張っている元教え子ちゃんにおくるまとめ＃4


#記述の動機
専門学校でPG、Webを教え始めてもう８年。
マイナススタートの２年はあまりに短い。教えきれなかったことが多い。
頑張ってる元教え子ちゃんにむけてまとめているのですが
ついでに、公開しておきます。


#そもそもデザインって何ですか？
川崎和男の言葉を借りれば「機能、性能、効能」です。
私の師匠（都市デザイナー）の言葉を借りれば「必要な物を具現化すること」
とても深い言葉です。

##デザイン≠デコレーション
デザインとデコレーションは混同されます。
デコレーションは「飾り付け」
デザインできていてこそのデコレーションです。

##物的デザイン
「物」ですから、全てを物理的に決める必要があります。
一般道、高速道には大きな違いがあります。
スーパーバイク、原付きには大きな違いがあります。
わかりやすいですね。設計するのは大変ですよ。（笑）

##概念デザイン
「概念」ですから、物的には決めにくい。
「言葉」で伝えるのも大変です。
従って、三歳児でも、老人でも「見てわかるもの」
「グラフィック」が必要です。
標識が良い例です。

##Webデザイン
デバイス、プロトコル、いろんなものは時代の要求に合わせて変化していきます。
現在のところ、Web技術は双方向かつインタラクティブな「道具」に過ぎません。そう思ったほうがいい。
技術的にどれだけ高めても、駄菓子屋のばーちゃんの笑顔には勝てません。
「笑顔」を超えるインターフェイスは無いのです。
バッチファイルから PowerShell を呼び出す方法

# 背景

PowerShell でスクリプトを書くメリットの一つとしては、Windows7 以降ならデフォルトで入っているので、Windows を使っている人になら書いたスクリプトを渡して、そのまま使えることにあると思っている。（しかも .NET が使える）
ただデフォルトの設定だと PowerShell のスクリプトを実行できなかったり、ダブルクリックで実行できないのも、ちょっと不便だなと感じるので、その回避方法をメモする。


# 普通に引数で渡す

一番単純な方法は、PowerShell のスクリプトを呼び出すバッチファイルを、いっしょに置いておくことだと思う。
デフォルトだと ExecutionPolicy の値でスクリプトの実行ができないのでオプションで指定する。

``` bat:hello.bat
powershell -NoProfile -ExecutionPolicy Unrestricted .\hello.ps1
```

``` ps1:hello.ps1
Write-Host "Hello, World!!"
```

ただちょっとした処理を書くために使いたいケースが多いのに、ファイルが 2 つに分かれてしまうのは、ちょっと嫌だなと感じる。

一行だけなら、こうも書ける

``` bat 
powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { echo 'Hello, World!!' }"
```

ただこれで書くと、少し量が増えただけでゴチャゴチャする。


# 1 つのファイルにまとめる

これが今回メモしておこうと思った内容。
最近、Scala を使いだしたら、Scala だとバッチファイルに、

``` scala
::#!
@echo off
call scala %0 %*
goto :eof
::!#

println("Hello, World!!")
```

とか書くと、Scala がインストールされている環境なら動いてしまう。
これがなぜ動くを、よく見てみると PowerShell でもできるのではないかと思った。
ググってみると、 [stackoverflow](http://stackoverflow.com/questions/6671913/scala-scripts-in-windows-batch-files) に説明してあるのがあった。
さらにググってみると、 [Make it easier to wrap powershell scripts in batch files](https://connect.microsoft.com/PowerShell/feedback/details/724524/make-it-easier-to-wrap-powershell-scripts-in-batch-files) というのを見つけた。

``` ps1
@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof

Write-Host "Hello, World!!"
```

とりあえず、これで動くらしい。というか動く。
やってることは、両方ともバッチファイルの中で自分自身を呼び出して、その呼び出す記述を呼び出す側で無視するという感じ。

これなら多少コードが増えても、そこそこ使える気がする。


# Base64 encode

ついでに、Base64 encode するというのもあった。
ちょっと面倒な気もするけど、これはこれで何かに使えるかもしれない。

``` bat
powershell -NoProfile -ExecutionPolicy Unrestricted -EncodedCommand ZQBjAGgAbwAgACIAaABlAGwAbABvACIAOwAgAGUAYwBoAG8AIAAiAHcAbwByAGwAZAAiADsA
```

エンコードする PowerShell ワンライナー

``` ps1
# 文字コードは適宜調整すること
# 元にする PowerShell のコードは行末に ; を付けること
"powershell -NoProfile -ExecutionPolicy Unrestricted -EncodedCommand $([Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($(cat .\hello.ps1))))" | Out-File .\base64encoded.bat -Encoding Default
```
ループ構文内外とブロック内外でのスコープの違いについて

基本的なスコープの違いを正しく理解できていませんでした。
以下にまとめました。

# スコープを作らないグループ(for, while)
## for

ループ構文の内外でスコープは変わらない。
**forで渡す式はブロックではない**

```rb:for
for i in [1, 2, 3] do
  num = i
end
puts num
```
```rb:出力
3
```

### forでは`do`は省略可能
```rb:for(doの省略)
for i in [1, 2, 3]
  num = i
end
puts num
```
```rb:出力
3
```

### forではループ変数もスコープが変わらない
ループ変数`i`をforの外でも参照できる

```rb:for(ループ変数の参照)
for i in [1, 2, 3]
end
puts i
```
```rb:出力
3
```

## while

**whileで渡す式はブロックではない**

```rb:while
a = [1, 2, 3]
counter = 0

while counter < a.size do
  num = a[counter]
  counter += 1  
end

puts num
```
```rb:出力
3
```

### whileでも`do`は省略可能

```rb:while(do省略)
a = [1, 2, 3]
counter = 0

while counter < a.size
  num = a[counter]
  counter += 1  
end

puts num
```
```rb:出力
3
```



# スコープを作るグループ(each, loop)

## eachメソッド
以下の例ではArrayクラスのeachメソッドである。[Class: Array (Ruby 2_4_0)](http://ruby-doc.org/core-2.4.0/Array.html#method-i-each)
ブロックの内外でスコープが変わる。
eachはもちろん`do`必須

```rb:each
[1, 2, 3].each do |i|
  num = i
end
puts num
```

```rb:出力
each.rb:5:in `<main>': undefined local variable or method `num' for main:Object (NameError)
```

## loopメソッド
Kernelモジュールのloopメソッドである。[Module: Kernel (Ruby 2_4_0)](https://ruby-doc.org/core-2.4.0/Kernel.html#method-i-loop)
ブロックの内外でスコープが変わる。
loopでも`do`必須

```rb:loop
a = [1, 2, 3]
counter = 0
loop do
  break if counter == a.size
  num = a[counter]
  counter += 1
end

puts num
```

```rb:出力
loop.rb:9:in `<main>': undefined local variable or method `num' for main:Object (NameError)
```

loopで`do`を省略すると、構文エラーで怒られる

```rb:loop(do省略)
a = [1, 2, 3]
counter = 0
loop
  break if counter == a.size
  num = a[counter]
  counter += 1
end

puts num
```


```rb:出力
loop.rb:7: syntax error, unexpected keyword_end, expecting end-of-input
```


# まとめ
for, whileではループ構文の内外で変数のスコープは変わらない
each, loopではブロックの内外で変数のスコープが変わる



# 参考リンク
## るりま
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fcontrol.html#for
制御構造 > 繰り返し > for

```rb:例:
for i in [1, 2, 3]
  print i*2, "\n"
end
```

```rb:文法:
for lhs ...  in 式 [do]
  式..
end
```
>
式を評価した結果のオブジェクトの各要素に対して本体を繰り返して実行します。これは以下の式とほぼ等価です。
>

```rb
(式).each `{' `|' lhs..`|' 式.. `}'
```

>
「ほぼ」というのは、**do ... endまたは{ }によるブロックは新しいローカル変数の有効範囲を導入するのに対し、for文はローカル変数のスコープに影響を及ぼさない点が異なるからです。**
for は、in に指定したオブジェクトの each メソッドの戻り値を返します。
>




## パーフェクトRuby(p.80 3-2-2繰り返し)

```rb
for name in %w(Alice Bob Carol)
  puts name # 配列の要素が順番に出力される
end

# ループの中で定義された変数を参照できる
puts name # "Carol" と表示
```

>
 each では繰り返しをブロックで記述していましたが、**for に渡す式はブロックではありません。**
**ループの内外で変数のスコープは変わらないため、**for の中で使用している変数 name は for の外から参照できます。
>

## その他
[Ruby勉強会@札幌-22に参加しました]
(http://terakonya.sarm.net/wordpress/2012/02/13/rubysapporo-22/)
※「初めてのRuby読み合わせ 6.3.5 for式」の部分

>
eachはブロック内で定義した変数のスコープはブロック内だけだけど、forの場合はブロックの外側でも変数を参照できる。
>
Semantic Versioning | 整形芸能人 ver 2.1.13 の意味するところは？

# Semantic Versioning | 整形芸能人 ver 2.1.13 の意味するところは？
## :musical_score: 概要
Semantic Versioning 整形芸能人 2.1.13 の意味するところについて。
:construction_worker::construction: 「整形芸能人」 の部分には好きな芸能人を思い浮かべてイメージを補強してください :construction::construction_worker:
:construction_worker::construction: また、ここで「整形芸能人」にたとえているのは理解の促進のためで、整形に対する批判などの意図は一切ありません :construction::construction_worker:

## <i class="fa fa-question-circle" style="font-size:1em;"></i> Semantic Versioning とは？
バージョン番号の付け方のルールです

## <i class="fa fa-cubes" style="font-size:1em;"></i> 基本構成 Major.Minor.Patch
例えば、

~~~
整形芸能人 2.1.13
~~~

の場合、

2 は Major 番号です。
1 は Minor 番号です。
13 は Patch 番号です。

### <i class="fa fa-cube" style="font-size:1em;"></i> Major 番号 の意味
APIの変更に互換性がないことを意味します。

つまり、

:person_with_blond_hair:`整形前芸能人 1.x.x` :arrow_right: :princess:`整形後芸能人 2.x.x` 

は API 互換を保証しませんよ、ということになる。
:congratulations: 昔と同じ仕事ができることを保証しません！しかし、昔はできなかった新たな仕事ができますよ！

### <i class="fa fa-cube" style="font-size:1em;"></i> Minor 番号 の意味
後方互換性があり機能性を追加することを意味します。

つまり、

:man:`整形前芸能人 2.1.x` :arrow_right: :person_with_blond_hair:`整形後芸能人 2.2.x` 

は API 互換を維持しつつ新たな機能を追加しましたよ、ということになる。
:congratulations: 昔と同じ仕事ができることを保証しつつ、引出（機能）が増えましたよ！

### <i class="fa fa-cube" style="font-size:1em;"></i> Patch 番号 の意味
後方互換性を伴うバグ修正することを意味します。

つまり、

:feelsgood:`整形前芸能人 2.2.1` :arrow_right: :man:`整形後芸能人 2.2.2` 

は後方互換を維持しつつ、ちょっくらバグっちゃった箇所を修正工事しましたよ、ということになる。
:congratulations: 昔と同じ仕事ができることを保証しつつ、ちょっとおかしくなっちゃったところをなおしましたよ！

## :parking: プレリリースバージョン
### <i class="fa fa-question-circle" style="font-size:1em;"></i> プレリリース とは？
プレリリース は通常のリリースの前に行うリリースです。
一般に

<i class="fa fa-sort-numeric-asc" style="font-size:1em;"></i>

~~~
Pre-Alpha
Alpha
Beta
Public Beta
RC（Release Candidate）
~~~

のような段階があります。
RC が1回で Fix しなかった場合などは、 rc1, rc2 ... のようにインクリメントされます。

http://semver.org/ のルールの場合は、
Patch 番号の直後にハイフンとドットで区切られた識別子を追加します。(任意)
<i class="fa fa-external-link" style="font-size:1em;"></i> [RubyGems のドキュメント](http://guides.rubygems.org/patterns/#prerelease-gems)では、ドットつなぎになっています。

## :office: ビルドメタデータ
パッチもしくはプレリリースの後ろにプラスとドットで区切られた識別子を追加する。
この識別子はバージョンの優先度に影響を与えません。

## :baby_chick: [WIP] Major Version 0 の持つ意味
Major 番号が 0 の場合は、開発段階を指し、厳密なルールの外として考える。

逆に言うと、 Version 0 を掲げている間はユーザーからも

「このソフトまだ、 Version 0 系 だから怖くて本格導入できないな」

と、判断される可能性があります。

## :memo: 補足
### :moon: Nightly Build
開発プロジェクトの最新のソースコードを用いて生成されたビルド。
とりたてほやほや。 :sweat_drops::fish::sweat_drops:

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Semantic Versioning 日本語版](http://semver.org/lang/jp/)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Semantic Versioning Slide](http://sssslide.com/speakerdeck.com/usamik26/semantic-versioning)
Go+Revel環境でBinary Fileダウンロードさせる方法


#目的:
　あるサイトにアクセスすると要求に応じたBinary fileをダウンロードさせる方法を実装する
#環境:
 Go 1.3.3
 Revel
#実装概要:
　実装を簡単にするために、ファイルはlocalに置いておくことにします。要求があってからdbにアクセスしてその場で展開しても良いのですが説明が複雑になるのでしていません。
　適当にProjectを生成してルートを構築しておきます。あまりかっこよくないですが、URLでパラメーターを渡すことにします。
　この渡されたパラメーターをもとにlocalのファイルを開き、renderへ渡すことにします。
#ソースコードと詳細説明:
　早速ですが、要求に対するレスポンスを以下のように実装します。

```go:test.go
// --- View response ---
// Action: View.image
func (c *Airportshop) ViewImage(fileName string) revel.Result {
	filePath := "/file_path/" + fileName

	file, err := os.Open(filePath)
	//defer file.Close()

	if err != nil {
		panic(err)
	}

	return c.RenderFile(file, revel.Inline)
}
```

パラメーターとして表示したいファイル名を"fileName"として受け取ります。その値を利用しlocalのファイルをopenします。私がはまったのが、いつものように

> defer file.Close()

を入れてしまうと、ファイルがありませんというErrorになります。参考にもありますようにどうやらBugらしいです。
　RenderFile部分ですが、revel.Inlineですとそのまま表示されます。revel.Attachmentだとダウンロードになります。
#参考
https://github.com/revel/revel/issues/684
Ruby から ImageMagick を使う方法の速度を比較する

比較しているのはよくある適当な 1080 x 236 px の JPEG 画像を ImageMagick を使って適当な位置を切り取ってくるという処理をして速度を比較しています。

比較したのは以下の3つ。

* MiniMagick
* ファイル渡しで ImageMagick を直接叩く
* パイプ渡しで ImageMagick を直接叩く

## ベンチマークのスクリプト

```rb
require 'benchmark'
require 'mini_magick'
require 'tempfile'
require 'open3'

TARGET = 'common_case_1.jpg'

N = 1000

IMAGE = File.open(TARGET).read

def minimagick
  piece_image = MiniMagick::Image.read(IMAGE)
  piece_image.crop('450x556+0+0')
  image = piece_image.to_blob
end

def imagemagick_file
  Tempfile.open('tmp_piece_input', './') do |input_image|
    Tempfile.open('tmp_piece_output', './') do |output_image|
      input_image.write IMAGE
      `convert -crop 450x556+0+0 #{input_image.path} #{output_image.path}`
      output_image.read
    end
  end
end

def imagemagick_pipe
  image,_ = Open3.capture2("convert -crop 450x556+0+0 jpeg:- jpeg:-", stdin_data: IMAGE, binmode: true)
end

Benchmark.bm(20) do |x|
  x.report('minimagick:') { N.times { minimagick } }
  x.report('imagemagick_file:') { N.times { imagemagick_file } }
  x.report('imagemagick_pipe:') { N.times { imagemagick_pipe } }
end
```

## 結果

```
                           user     system      total        real
minimagick:            0.910000   2.490000  30.950000 ( 33.037064)
imagemagick_file:      0.300000   1.470000  26.260000 ( 27.954511)
imagemagick_pipe:      0.590000   1.420000  24.920000 ( 25.720133)
```

子プロセス分での処理をなんだかうまく表示できないのでわかりづらいが total から user + system 引いた分。
パイプ渡しで叩くのが早いっぽい。

## 考察

結局 ImageMagick 内での処理が一番かかり、ファイルの読み書きで速度が大幅に低下しているというわけではないようにみえるが、ファイルの読み書きをなくせばある程度は早くなる。JPEG の処理が一番処理を食うのであろうことが想像される。
slack でのいろんな表記方法

slack でのいろんな表記方法. だいたい markdown っぽい。

|表記|説明|
|:-------------:|:------------|
|>slack| blockquote. 頭に｜がついてインデントする。引用表現|
|\`slack\` |インライン引用表現。ボーダーで囲まれて 文字色赤、背景灰色になる|
|\`\`\` slack \`\`\` |ボーダー付き引用段落表現。\`\`\` で発言を開始すると再び\`\`\`が来るまでは改行しても送信しない　というオプションがある|
|\_slack\_ |イタリック |
|\*slack\* |ボールド |
|~slack~ |ストライク（取り消し線） |
|:slack: |slack という名前で登録された絵文字になる (: のあとタブ押すと絵文字一覧がでる) |
|+:slack:|slack という名前で登録された絵文字で、直前の発言にリアクションする|
|-:slack:|直前の発言に slack という名前で登録された絵文字がある場合、リアクションを削除する|
| - |(- のあとに半角スペース). html の ul. bullet タイプのリストアイテムになる |
| 1. |(1. のあとに半角スペース). html の ol. number タイプのリストアイテムになる |
|#ff0000|カラーコードに対応する色見本をつけてくれる|
|#ff0000を,区切りで8つ|この配色のカラーテーマボタンを表示する ![スクリーンショット 2018-02-20 14.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/25422/2996cf69-259a-6595-4197-ca8dfca164b9.png)
| `@hoge` | hoge さん、あるいは hoge グループへのメンション |
| #hoge | チャンネル　hoge へのリンク |
PagerSlidingTabStripのタブにMaterialデザインを適用する方法

[PagerSlidingTabStrip](https://github.com/astuetz/PagerSlidingTabStrip)を使うとMaterialデザイン対応したタブを実装できます。いくつか設定しなければいけない属性があるのでメモ。

#Before
特に設定していない場合はこんな感じ。

![2015-01-16_11_03_25_png.png](https://qiita-image-store.s3.amazonaws.com/0/15267/443869fb-ffec-0eef-abb9-b90c2cb38c2f.png "2015-01-16_11_03_25_png.png")

```xml
<com.astuetz.PagerSlidingTabStrip
    android:id="@+id/tab_strip"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:layout_below="@id/toolbar"
    app:pstsShouldExpand="true" />
```

#After
属性を設定するとこんな感じ。

![2015-01-16_10_45_48_png.png](https://qiita-image-store.s3.amazonaws.com/0/15267/716af472-4bb7-187d-a4ec-a0d2ff616a8c.png "2015-01-16_10_45_48_png.png")


```xml
<com.astuetz.PagerSlidingTabStrip
    android:id="@+id/tab_strip"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:layout_below="@id/toolbar"
    android:background="?attr/colorPrimary"
    android:textColor="@color/white"
    android:textSize="14sp"
    app:pstsDividerColor="@android:color/transparent"
    app:pstsIndicatorColor="@color/white"
    app:pstsIndicatorHeight="2dp"
    app:pstsShouldExpand="true"
    app:pstsTabBackground="@drawable/bg_feedback"
    app:pstsUnderlineColor="@android:color/transparent" />
```

#説明

* `background`に?attr/colorPrimaryをセットすることで、Toolbarと同じ色に。
* `textColor`で文字色を設定。
* `textSize`は14spに。ちなみにYouTube、Playニュースだと14sp、Playストアだと16spのようです。(2015/01/16時点）
* `pstsDividerColor`は表示しないので@android:color/transparentをセット。
* `pstsIndicatorColor`は白にする。ここはテーマカラーによって調整。
* `pstsIndicatorHeight`は2dp。ちなみにYouTubeは4dp、Playニュース、Playストアだと2dpのようです。(2015/01/16時点）
* `pstsTabBackground`には、タップフィードバック用のdrawableをセット。
* `pstsUnderlineColor`を透明にして、タブ下のバーを非表示に。

#その他Tips

###影をつけたい
ViewPagerにbackgroundをセットしたらつきます。影のつけ方は[Toolbarに影をつける方法まとめてみた](http://qiita.com/tomoima525/items/d361d05adf6807e85ccd)が非常にわかりやすいです。

```xml
<android.support.v4.view.ViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/tab_strip"
    android:background="?android:windowContentOverlay" />
```

###タブテキストのTextStyleのboldを取りたい
PlayニュースやPlayストアはboldですが、YouTubeだとnormalなんですよね。これ実はxmlだと設定できなくて、コードでセットしてあげる必要があります。

```java
mTabStrip.setTypeface(null, Typeface.NORMAL);
```

###いちいち設定するのめんどくさい
デフォルトがMaterialデザインっぽくなるforkリポジトリもあるようです。
https://github.com/jpardogo/PagerSlidingTabStrip
さくらレンタルサーバーにSSHで公開鍵ログインする

さくらレンタルサーバー([スタンダードプラン以上のプラン](https://help.sakura.ad.jp/hc/ja/articles/206054152-SSH-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6))にSSHの公開鍵認証でログインしました。

この記事では、**SSH ログインの手法**とともに、**公開鍵認証でログイン**しパスワードを毎回入力しないで済む手順を記載しています。SSH でのパスワード要求に配慮した内容としました。

# 環境・事前準備
SSH ログイン環境は Mac から行いました。

環境はさくらレンタルサーバー（ボクの場合はスタンダードプラン）が契約済みであり、ローカルマシンには公開鍵と秘密鍵のペアが`~/.ssh`ディレクトリに用意されているものとします。

**必要な情報は３つ**です。

1. さくらレンタルサーバー名
2. さくらレンタルサーバーのアカウント名
3. さくらレンタルサーバーのパスワード

# ログイン情報が書いてある契約サービスの接続情報を確認
さくらレンタルサーバーに契約すると、FTPのアクセス情報をメールで送ってきます。

メールの接続情報を確認します。

```bash:さくらレンタルサーバーから届いたメールに書いてある情報
《 契約サービスの接続情報 》

FTPサーバ名 ： ほげほげ.sakura.ne.jp
FTPアカウント ： ほげほげ
FTP初期フォルダ ： www
サーバパスワード： ぴよぴよ
```
このようにメールに記載されたFTPのログイン情報を使ってSSHログインします。

# SSHでさくらレンタルサーバーにログインする
メールに書いてある情報に従ってSSHでさくらレンタルサーバーにログインします。

```bash:SSHでさくらレンタルサーバーにログイン
ssh ほげほげ@ほげほげ.sakura.ne.jp

# パスワードを聞かれます
ほげほげ@ほげほげ.sakura.ne.jp's password:ぴよぴよ

# ログイン
Welcome to FreeBSD!
```
SSHでログインしようとすると、パスワードを聞かれるので、メールに記載されたパスワードをタイプします。

**Welcome to FreeBSD!**と表示されたらログイン成功です。

ログインが成功したら、一旦ログアウトします。

```bash:exitします
exit
```

# ログイン設定を用意
さくらのドメインは長いので毎回書くのが面倒です。短く書けるように`~/.ssh/config`というファイルにログイン設定を用意します。

```bash:ログイン設定をconfigファイルに書き込む
vi ~/.ssh/config

Host example.com
  HostName ほげほげ.sakura.ne.jp
  User ほげほげ
```
Hostはexample.comにしていますが、ここを適当にhogeなど短い名前にしておけばログインが簡単になります。

# 公開鍵をさくらレンタル−サーバーにSCPで転送する
scpで公開鍵をさくらレンタル−サーバーに転送します。ここで公開鍵はid_rsa.pubという名前です。

```bash:scpで公開鍵をコピー
scp ~/.ssh/id_rsa.pub example.com:/home/ほげほげ/.ssh/authorized_keys
```
ここではパスワードを聞かれる場合があります。もし聞かれたら、[ログイン情報](http://qiita.com/pugiemonn/items/1597939003ca83208e0d#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%83%85%E5%A0%B1%E3%81%8C%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%82%E3%82%8B%E5%A5%91%E7%B4%84%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E7%A2%BA%E8%AA%8D)にあるパスワードを入力します。

さくらレンタル−サーバーへコピーしたauthorized_keysのパーミッションを変更します。

```bash:authorized_keysのパーミッションを変更する
# さくらレンタル−サーバーにログイン
ssh example.com

# パーミッションを変更する
chmod 600 .ssh/authorized_keys
```

一旦ログアウトします。

```bash:exitします
exit
```

# SSH公開鍵認証でさくらレンタル−サーバーにログイン
sshでログインできるか確認します。

```bash:SSH公開鍵認証でさくらレンタルサーバーにログイン
ssh example.com
```
今度はさくらレンタル−サーバーのパスワードを聞かれないでログインできました。
Memcachedのshadeを使ってみる


MemcachedをScalaで使うならこれがいいということで使ってみた。

詳しくは[shade](https://github.com/alexandru/shade)を参照

SBTでresolverとDependencyを書いて

```scala
resolvers += "Spy" at "http://files.couchbase.com/maven2/"
dependencies += "com.bionicspirit" %% "shade" % "1.6.0"
```

あとはget, set, add, deleteを使用する

Non-blockingの場合

```scala
import concurrent.duration._
import concurrent.Future
import shade.memcached._
import scala.concurrent.ExecutionContext.Implicits.{global => ec}

val memcached = Memcached(Configuration("127.0.0.1:11211"), ec)
val op: Future[Boolean] = memcached.set("username", "Alex", 1.minute)
```

Blockingの場合

```scala
import concurrent.duration._
import concurrent.Future
import shade.memcached._
import scala.concurrent.ExecutionContext.Implicits.{global => ec}

val memcached = Memcached(Configuration("127.0.0.1:11211"), ec)

memcached.awaitGet("username") match {
	case Some(username) => doSomething
	case None =>
		memcached.awaitSet("username", "Alex", 1.minute)
}
```
POSTするとMissing param: csrf-tokenが返ってくるときの対処法


詳しくは公式ドキュメントを参照

GETメソッド以外でリクエストする場合は、CSRF対策がデフォルトで入っているため *csrf-token* を渡す必要がある。 *csrf-token* がないとPOSTしたリクエストに対して *Missing param: csrf-token* がレスポンスとして返ってくる。

## CSRFチェックを省略する場合
*xitrum.SkipCsrfCheck*を継承してActionを作成する。

```scala
import xitrum.{Action, SkipCsrfCheck}
import xitrum.annotation.POST

trait Api extends Action with SkipCsrfCheck
@POST("api/positions")
class LogPositionAPI extends Api {
  def execute() {...}
}

@POST("api/todos")
class CreateTodoAPI extends Api {
  def execute() {...}
}
```
これで *Missing param: csrf-token* を返ってくることはない。

## レイアウトに記載する

csrf-tokenは *antiCsrfMeta* Tagsをレイアウト(HTML)内に記載する必要がある。xitrum.jsが勝手にtokenを付けてくれる。

```scala
import xitrum.Action
import xitrum.view.DocType
trait AppAction extends Action {
  override def layout = DocType.html5(
    <html>
      <head>
        {antiCsrfMeta}
        {xitrumCss}
        {jsDefaults}
        <title>Welcome to Xitrum</title>
      </head>
      <body>
        {renderedView}
        {jsForView}
      </body>
</html> )
}
```

## antiCsrfInput または antiCsrfToken を使用する

メタタグとxitrum.jsを使わない場合は *antiCsrfInput* または *antiCsrfToken* を使用する必要がある。

```scala
￼form(method="post" action={url[AdminAddGroup]})
  != antiCsrfInput
￼￼￼￼￼form(method="post" action={url[AdminAddGroup]})
  input(type="hidden" name="csrf-token" value={antiCsrfToken})
```
Git ブランチとタグの削除に関する備忘録


※ Gitのバージョンによっては実行できる/出来ないがあるので注意

## ブランチを削除する（ローカル）

```
# git branch -d test
```

強制的に消す時は

```
# git branch -D test
```

## タグを削除する（ローカル）

```
# git tag -d tag
```

## ブランチを削除する（リモート）

```
# git push origin :test
```

または

```
# git push --delete origin test
```

## タグを削除する（リモート）

```
# git push origin :refs/tags/tag
```

または

```
# git push --delete origin tag
```

## リモートリポジトリから削除されているリモートブランチを削除する

```
# git remote prune origin
```

または

```
# git fetch --prune
```

## 複数のブランチ（タグ）を一括で削除する

・ブランチ

```
# git branch | grep test | xargs git branch -D
```

・タグ

```
# git tag | grep tag | xargs git tag -d
```
Pepperくんで HTML5 TEST やってみた

Pepperくんのタブレットには任意のWebページを表示したりできるわけですが、さてどの程度の機能が使えるもんなのか。
[HTML5 Advent Calendar 1日目：12月1日時点の html5test とかで色々なブラウザを試してみる](http://albatrosary.hateblo.jp/entry/2014/12/01/170626) を拝見して、おお、ならばやってみようと。

やったことは単純で、[HTML5 TEST](https://html5test.com/)をPepperくんのタブレットに表示しただけ。テストに用いたプロジェクトなどは最後に。

#結論

Pepperくんのバージョンによるかもですが、点数は **409** / 555 でした・・・！

![20150116_133544.jpg](https://qiita-image-store.s3.amazonaws.com/0/28770/222b56b4-470b-6112-2037-673f02e7d402.jpeg)

先の記事によれば、**2014/12/1時点のIE11には勝てたみたい**です。

###詳細

まあ点数はさておき、それぞれどんな機能で点が取れて、どんな機能で点が取れなかったかは以下。

- [PepperタブレットHTML5 TEST結果](https://html5test.com/s/c9f22d2508c24d52.html)

2D Graphicsは部分的ではあるけどなんかできそうな感じ、WebGLはやっぱダメかーみたいなそんな感じ。詳しくはないけど、ドキュメントではAndroid 4.0.4と示されていて、そんな感じなのかなー、と。

#テスト用プロジェクト

テスト用プロジェクトとボックスライブラリとかはこの辺に。何かあればプルリクください！！！

- https://github.com/yacchin1205/pepper-web-boxes

プロジェクトは `samples/html5test` に置いてあります。ビヘイビアのボックス構成はこんな感じ。

![show-url.png](https://qiita-image-store.s3.amazonaws.com/0/28770/f80fff7c-0bd4-f796-77d3-2c8f065ef834.png)

なお、[PepperのタブレットにWebページを表示してみる](http://qiita.com/tokuhisa_f/items/1746c5a6993d9f19f2cb)で説明されている通り、事前にタブレットのWiFiの設定をおこなう必要がありますので要注意。

あと、`Show URL` は独自ボックスで、 `web-boxes` ディレクトリにボックスライブラリとしてもまとめてみています。ボックスライブラリとかどう管理するのかとかまだまだ試行錯誤中・・・
Mavericks における Compass 0.1x.x → 1.x.x アップデート には 要 xcode-select --install


```command
$ sudo gem update --system

$ xcode-select --install
$ sudo xcodebuild -license

agree

$ sudo gem install sass
$ sudo gem install compass --pre
```

Mavericks における Compass v1 へのアップデートには、
Rubyのバージョンアップにともない
Xcode Command Line Toolsのインストールが必要とのこと

これにて & で BEM 書けるようになりますね
MacとCentOSではLANGに設定可能な値が微妙に異なる

vimで何故か文字化けするなー。と思って調べてみたら、OSによってLANG設定が微妙に違うという罠でした。
何かで規格化されているものだとばかり思っていたよ……

```bash:Mac環境
$ locale -a | grep -i ja_JP
ja_JP
ja_JP.eucJP
ja_JP.SJIS
ja_JP.UTF-8
```

```bash:CentOS7環境
$ locale -a | grep -i ja_JP
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
```

まとめ
-----------
* vimの場合、大文字小文字は違っても問題にならない
* Linux(CentOS 7)ではja_JP.utf8 / ja_JP.utf-8のどちらでも良い
* Macではハイフンが無いとvimがlatin1で起動した
MacのGitで補完を効かせたりブランチ名を表示する設定(Homebrewでgitをインストールした場合)


# 目的
Macのターミナルでgitコマンドの補完を有効にする。
Homebrewでgitをインストールした場合は、`git-completion.bash`が既にダウンロードされている。特に新しいファイルを用意せずとも`.bashrc`の設定のみで利用可能。

# 設定方法

## git-completion.bashの存在を確認

補完を有効にするためには`git-prompt.sh`と`git-completion.bash`を有効にする必要がある。
Homebrewでgitをインストールした場合は`/usr/local/etc/bash_completion.d/`の中にシンボリックリンクがおかれているようなので、存在を確認する。

```bash:
$ ls /usr/local/etc/bash_completion.d/
git-completion.bash	git-prompt.sh
```

ちなみに実態はこのへんにあるらしい。
`/usr/local/Cellar/git//1.X.X.X/etc/bash_completion.d/`

## ターミナルでの補完を有効にする

`.bashrc`に次のように設定すると、補完が効くようになる。

```bash:.bashrc
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
```

## ターミナルにブランチ名を表示する

ターミナルにブランチ名も表示したい場合は、次の二行も加える。

```bash:.bashrc
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\h\[\033[00m\]:\W\[\033[31m\]$(__git_ps1 [%s])\[\033[00m\]\$ '
```

# 参考

Macのターミナルのプロンプトにgitブランチ名を表示して幸せになったある男の話 | もふもふ技術部
http://j-caw.co.jp/blog/?p=901

bash_completionで「-bash: __git_ps1: command not found」となった時の対処法 - くりにっき
http://sue445.hatenablog.com/entry/2012/08/30/005627 

MacのターミナルでGitのブランチ名を表示する - アインシュタインの電話番号
http://blog.ruedap.com/2011/07/06/mac-terminal-git-branch-name 

/opt/local/etc/bash_completion.d - Gitコマンドをタブキーで補完できるようにする | mawatari.jp http://mawatari.jp/archives/git-completion-bash
MySQLでテーブルのコピー


ちょっとクエリのチューニングとかでテストしたい時とかにサービスに入ってないDBでやるのはもちろんだけどそのままやると色々怖い（レプリ作りなおしたりするはめにはなりたくない）のでちょっと別のテーブルにコピーする（別のDBだと更に間違いが減るので良し）

## テスト用のスキーマ作る
    CREATE DATABASE hoge_test
    
## テスト用のテーブル作る／データ流し込む
    CREATE TABLE hoge_test.t1_test LIKE hoge.t1_test;
    INSERT INTO hoge_test.t1_test SELECT * FROM hoge.t1_test;

## 確認
    SHOW CREATE TABLE hoge_test.t1_test;
    SELECT count(*) FROM hoge_test.t1_test;

## 終わったら後始末
    DROP DATABASE hoge_test

いじょ。
(jQuery) clone()をテーブル作成で試す。

#clone()とは？

要素のコピーに使う。同じ内容のものを複製したいときなどに便利、行追加ができるテーブルを作ってみる。

##サンプル

```
<!DOCTYPE html>
<html lang="ja">

<head>
	<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    <script>
    $(document).ready(function(){
		var title = $("tr:first").clone();
		var input = $("tr:first").next().clone();
		
		$("#ap-add").click(function(){
			$(input).clone().appendTo("table");
		});

		$("#pre-add").click(function(){
			$("tr:first").remove();
			$(input).clone().prependTo("table");
			$(title).clone().prependTo("table");
		});

		$("#del").click(function(){
			$("td").parent().remove();
			$(input).clone().appendTo("table");
		});
	});
    </script>
</head>

<body>
    <div id="table">
        <table border=1>
            <tr>
                <th>チェック</th>
                <th>入力欄</th>
            </tr>
            <tr>
                <td>
                    <select name="sample">
                        <option value="A">A</option>
                        <option value="B">B</option>
                        <option value="C">C</option>
                    </select>
                </td>
                <td>
                    <input type="text">
                </td>
            </tr>
        </table>
    </div>
    <button id="ap-add">最後尾に追加</button>
    <button id="pre-add">先頭に追加</button>
    <button id="del">クリア</button>
</body>

</html>
```

htmlではテーブルと操作系のボタンを用意している。
以下、jQueryについての説明

```
var title = $("tr:first").clone();
var input = $("tr:first").next().clone();
```

ページを開くと同時に、titleとinputにそれぞれ項目行と入力行をクローンしている。これらを使って行の操作をおこなっている。

```
$("#ap-add").click(function(){
	$(input).clone().appendTo("table");
});
```
inputは入力行をそのままクローンしているので、テーブルの末尾に行を追加するにはappendTo("table")するだけ。

```
$("#pre-add").click(function(){
	$("tr:first").remove();
	$(input).clone().prependTo("table");
	$(title).clone().prependTo("table");
});
```
では先頭行に追加するにはどうするか。prependTo("table")すればいい、というほどシンプルではなく、それだけだと項目行より手前に入力行が追加されてしまう。そこでクローンしてるtitleの出番。
$("tr:first").remove()で項目行を一度削除してしまい、prependTo("table")で入力行、項目行の順に追加することで対応できる。

```
$("#del").click(function(){
	$("td").parent().remove();
	$(input).clone().appendTo("table");
});
```
$("td").parent().remove()で全ての入力行を削除し、その後に1行だけ入力行をappendTo("table")。これだけで初期の状態に戻すことができます。
top風にqstatの情報をリアルタイムで表示する

Grid Engineに投げたジョブ情報を継続的に監視したくなったのでncursesでtop風にqstatの情報をリアルタイムに更新してくれるプログラムを書きました。

## コード
gistにGPLで公開してあります。
https://gist.github.com/ktnyt/96d69d3467686bdeede1

## ビルド
普通にgccでビルドします。
```gcc -o iqstat -O3 -lncurses iqstat.c```

## 使い方
オプションはそのままqstatに渡されます。
```iqstat```

詳細出力
```iqstat -f```

キュー指定
```iqstat -q queue.q```

## 結論
便利 (自己満足)
Chefを使ってGCEでpostgresqlのインストールに失敗する時の対処方法


Google Compute Engineで[postgresqlクックブック](https://supermarket.chef.io/cookbooks/postgresql)を使ってインストールしようとすると失敗する。
原因は`apt-get update`の実行が抑制されていて、あらかじめ`apt-get update`を実行しておくとできる。

レシピファイルで何とかしたい場合は以下のようにする。

```
include_recipe 'postgresql::server'
execute('apt-get update').run_action(:run)
```

### 解説

クックブックをみていくと[aptクックブック](https://github.com/opscode-cookbooks/apt)に定義されている`execute 'apt-get update'`の実行を抑制する処理が入っている。

```ruby
  if platform_family?('ubuntu', 'debian')
    e = execute 'apt-get update' do
      action :nothing
    end
    e.run_action(:run) unless ::File.exists?('/var/lib/apt/periodic/update-success-stamp')
  end
```

`/var/lib/apt/periodic/update-success-stamp`がある場合、無条件で`apt-get update`が実行されなくなってしまっている。
自分のレシピファイルで再度上書きすることで対処している。