OmniAICreator/Qiita-1.07M huggingface dataset:
【IntelliJ】Scala/PlayFrameworkをIntelliJでデバッグする【Play】


注意：IntelliJは13.1（2014/4/6 時点のEAPです。）、PlayFrameworkは2.2.2でございます。

あんまり有用な情報ではないですが、手順書づくりの一環で作っています。
知っている人はスルーしてください。

## PlayFrameworkを入れる＆アプリを作る

play consoleでアプリを作ってください。
アプリ作成後、play consoleで、IntelliJ用の設定ファイルを生成しましょう

```
> idea
```

## IntelliJの設定

開発マシンにIntelliJを入れてください。
Ultimate版はPlay 2プラグインもあるので幸せになれるかも

前述で作ったアプリで、play console で idea を実行していれば、すでにそのアプリはIntelliJのプロジェクト扱いなので、IntelliJのファイルメニューのOpenから開けます。開いてください。

### デバッグ設定

下矢印を押すと、Edit Configurationsって出てくるので押してください。

![lepus_kanaloco_-____Development_PHP_lepus_kanaloco__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/c33409e1-3f2b-a316-e02e-a9086c4db4d0.jpeg "lepus_kanaloco_-____Development_PHP_lepus_kanaloco__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg")

新しい設定を作るので、左上のプラスボタンをクリック、Remoteをクリックします。

![Run_Debug_Configurations_と_lepus_kanaloco_-____Development_PHP_lepus_kanaloco__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/2f181965-0d22-5081-6024-35865d035193.jpeg "Run_Debug_Configurations_と_lepus_kanaloco_-____Development_PHP_lepus_kanaloco__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg")

クリック直後

![Run_Debug_Configurations.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/c2f57fa8-68a1-7f68-2685-110fcbc11fd0.jpeg "Run_Debug_Configurations.jpg")

任意のデバッグ名称をつけ、ポートを9999にします

![Run_Debug_Configurations.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/f2331de6-7ae5-946e-c605-90b0905a5a39.jpeg "Run_Debug_Configurations.jpg")

OKを押してください。
これで準備完了です。

## デバッグ開始

```
$ play debug
> run
```

で起動します。
play console の立ち上げ時に、play debugで立ち上げてください。


IntelliJの、先ほどの下矢印のところに作った名称が出ていると思うので、それが選択されている状態で、虫アイコンをクリックするとデバッグ開始です。

![lepus_kanaloco_-____Development_PHP_lepus_kanaloco__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/77e0fa7c-6606-276a-7270-da5a34785031.jpeg "lepus_kanaloco_-____Development_PHP_lepus_kanaloco__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg")

ブラウザで http://localhost:9000 にアクセスして、ブレークポイントを貼ったあたりに止まってくれれば成功です。

デバッグ中は↓みたいな感じです。

![Top_scala_-__twigs__-_twigs_-____Development_Scala_twigs__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg](https://qiita-image-store.s3.amazonaws.com/0/34165/c3f1940a-116b-0e0f-f730-e2e43f5cbafa.jpeg "Top_scala_-__twigs__-_twigs_-____Development_Scala_twigs__-_IntelliJ_IDEA__Cardea__IU-135_666.jpg")

以上。
mac OSX環境にphp-mcryptをインストールするtips

http://topicdesk.com/downloads/mcrypt

下の方にあるインストーラーをDLする。
パッケージをぽちぽちしてインストールする。
php.iniにextension=mcrypt.soを追記。
httpdを再起動する。

ネ申、いわゆるGOD。
ビルド時にバージョン番号のインクリメント + git tag作成

こんなん

```
versionNumber=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString $versionNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"`
git tag -a $versionNumber -m $versionNumber
versionNumber=${versionNumber%.*}.$((${versionNumber##*.}+1))
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $versionNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
```

追記：
<a href='https://twitter.com/h6a_h4i'>@h6a_h4i</a> にもっと見やすいのを教えてもらった
```
echo "1.2.3" | awk -F '.' '{print $1"."$2"."($3+1)}'
```
Custom Elementsで定義する要素名にはハイフンが必須


`document.registerElement`で定義するCustom Elementsの名前はハイフンがないとエラーになる。

```javascript
document.registerElement('foo')
//=> SyntaxError: Failed to execute 'registerElement' on 'Document': Registration failed for type 'foo'. The type name is invalid.

document.registerElement('foo-bar')
//=> ok
```

以下仕様より引用。

> The first argument specifies the name of the custom element, by which it will be referred to in markup. These names must include a hyphen.
> 
> http://w3c.github.io/webcomponents/explainer/#custom-element-section
TitaniumでGoogle Analytics


Titanium-Google-Analyticsというモジュール(Titanium Moduleではなくjsファイルで配布されている)を動かしたてみたので、その履歴を残しておきます。上記モジュールのコードの中をみるとgoogleのsdkをtitaniumに移植(ラップするモジュールを作成した等)した訳ではなく、ピュアなjavascriptで実装(渡されたパラメータを元にhttpリクエストを作成して送信しているだけ)しているようです。

###サンプルコードを動かすまで

1. Google Analyticsでウェブサイト用(モバイルではない)のトラッキングIDを作る

モバイルアプリをウェブサイト(ダミーの)に見立ててgoogle analyticsを使っているため
2. サンプルコードを動かす為の適当なプロジェクトを作成
3. [1] からコードをチェックアウト
4. Ti.Google.Analytics.jsを自分のプロジェクトにコピー
5. app.jsに以下のコードを追加

```javascript
  var gaModule = require('Ti.Google.Analytics');
  var analytics = new gaModule("UA-XXXXXXXX"); //トラッキングID入
  
  Titanium.App.addEventListener('analytics_trackPageview', function(e){
      var path = "/app/" + Titanium.Platform.name;
      analytics.trackPageview(path + e.pageUrl);
  });
  Titanium.App.addEventListener('analytics_trackEvent', function(e){
      analytics.trackEvent(e.category, e.action, e.label, e.value);
  });
  Titanium.App.Analytics = {
      trackPageview:function(pageUrl){
          Titanium.App.fireEvent('analytics_trackPageview', {pageUrl:pageUrl});
      },
      trackEvent:function(category, action, label, value){
          Titanium.App.fireEvent('analytics_trackEvent', {category:category, action:action, label:label, value:value});
      }
  };
  analytics.start(10);
```

ほとんど参考URL[2]のサンプルコードですが、動かす為に以下の部分を変更する必要がありました。
- モジュールの読み込みをincludeからrequireへ変更
- 読み込むモジュール名をanalytics.jsからTi.Google.Analyticsへ変更
6. デフォルトで作成されているFirstView.jsとかに以下のコードを突っ込む

```javascript:FirstView.js
	//label using localization-ready strings from <app dir>/i18n/en/strings.xml
	var label = Ti.UI.createLabel({
		color:'#000000',
		text:String.format(L('welcome'),'Titanium'),
		height:'auto',
		width:'auto'
	});
	self.add(label);

	//Add behavior for UI
	label.addEventListener('click', function(e) {
		alert(e.source.text);
		Titanium.App.Analytics.trackEvent('Button','click','hello world',1); //追加部分
	});

  Titanium.App.Analytics.trackPageview('/FirstView'); //追加部分
```

###参考URL

[1] Example Titanium project that uses Google Analytics to track page views
https://github.com/rogchap/Titanium-Google-Analytics


[2] [Titanium Mobile] アプリ内の画面ページビューやボタンのクリック回数をGoogle Analyticsで計測する
http://m.designbits.jp/12111909/
Polymer の Shadow DOM Polyfill


[Polymer](http://www.polymer-project.org/)は、WebComponentsが実装されてないブラウザにもWebComponentsの機能を使えるようにするためのPolyfillを提供している。（Polymerの一部であるplatform.jsというのがPolyfillのためのライブラリ）

[Browser Compatibility - Polymer](http://www.polymer-project.org/resources/compatibility.html)

ただ、あたりまえだけどShadow DOMの機能だけは正確にPolyfillできてないみたい。例えば[polymer-ui-clock](http://www.polymer-project.org/components/polymer-ui-clock/demo.html)というコンポーネントをShadow DOMに対応していないブラウザで見てみると次のように、単にカスタムエレメントの子要素にDOMを追加しただけで、CSSも単に`head`要素内に展開されているだけである。

![スクリーンショット 2014-04-06 18.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/12262/e833e2dd-aef6-19d8-70a5-535474e82b0b.png "スクリーンショット 2014-04-06 18.05.38.png")

なので、例えば次のようなCSSがあったら、`#widget-title`のテキストは赤色になる。

```css
div {
  color: red;
}
```

これがShadow DOMだと外側からのCSSに影響を受けない。

まあこの挙動をPolyfillでどうにかするのは現実的ではないのでいいんだけど、やはりShadow DOMはブラウザ側に実装してもらわないとどうにもならん機能だというのはわかった。
CakePHPのためにPHPUnitを導入する一番簡単な方法


=> cakephp-phpunitというプラグインを使います。
https://github.com/dereuromark/cakephp-phpunit

cakephp-phpunitとはCakePHPのアプリケーションにPHPUnitを導入するためのプラグイン。単に環境にインストールするのではなくアプリにインストールする方式なので「とりあえず入れて使ってみたい」という要望にはぴったり。依存関係等もバッチリ解決してくれます。動作環境はPHP5.3以上、CakePHP2.3以上。

pearもcomposerも使わないのでこれが一番ラクかなーと。

## cakephp-phpunitのインストール
CakePHPアプリケーションをgitで管理しているものとして、git submoduleでapp/Vendorに入れましょう

```
$ cd mycakephpapp/app
$ git submodule add https://github.com/dereuromark/cakephp-phpunit Plugin/Phpunit
```

ここで必ずプラグインのディレクトリ名を「Phpunit」にすることを忘れないこと。頭が大文字というのが大切。

次にapp/Config/bootstrap.phpに以下を追加し、読み込まれることを確認。

```app/Config/bootstrap.php
CakePlugin::load('Phpunit');
```

もしくはこっちで全部プラグインを読み込むならそれでもよい。

```app/Config/bootstrap.php
CakePlugin::loadAll();
```

最後にinstall。/app/Vendorにいれるか/vendorにいれるか聞かれますが、ここでは/app/Vendorを選択します。

```
$ Console/cake Phpunit.Phpunit install
（略）
Installing PHPUnit 3.7 ...
1. /app/Vendor/
2. /vendors/
Select VENDOR path to install into (q/1/2)
[q] > 1
```

依存関係等合わせてゴリゴリダウンロードされます。

ブラウザでhttp://アプリのURL/test.phpにアクセスして以下のように出たらインストール成功。

![Screen Shot 2014-04-06 at 18.04.18.png](https://qiita-image-store.s3.amazonaws.com/0/28666/f0ed1871-8347-1671-fa3b-2856bcd3c1ad.png "Screen Shot 2014-04-06 at 18.04.18.png")

実体は/app/Vendor/にインスコされています。

## 追記（2014/6/26）

CakePHPにおけるライブラリ一般に言えること。
インストール先として/app/Vendorと/vendorsが選べますが、/vendorsはデフォルトで.gitignoreに記述されているので、アプリケーション内入れたくない場合はここにPHPUnitを入れるようですね。便利。
Chromeでブラウザが定義している要素のShadow DOMを表示する


最近のChromeだとvideo要素のコントローラーとかprogress要素なんかはShadow DOMで実装されているらしく、Dev Toolsの設定で「Show user agent shadow DOM」にチェックを入れるとその内部構造を見ることができる。

例えばvideo要素だとこんな感じ。

![shadow.png](https://qiita-image-store.s3.amazonaws.com/0/12262/e6dab53f-f144-36dc-2f99-24a001b7117d.png "shadow.png")

バージョン: 36.0.1927.2 canary
はまったこと: 完了通知 (completion handler) の呼び出し忘れ

先日、完了したら完了通知を呼び出すような処理を書いていて、（自分で仕込んだ）バグにはまったので書いてみます。

困った問題
===

ものすごく簡単に書くと、

```cpp
typedef boost::function< void() > handler_t;

// 終わったらhandlerを呼ぶ
void func(int x, handler_t handler)
{
   // some logic
   // some logic
   // some logic

   handler();
}
```

こんなロジックがありましたが、うっかりこんな変更を加えてしまい、

```cpp
typedef boost::function< void() > handler_t;

void func(int x, handler_t handler)
{
   if (!x) return;

   // some logic
   // some logic
   // some logic

   handler();
}
```

handler が呼び出されなくなってしまいました。

ここで、テストが足りなかった、今度から気をつけよう、と思うだけでは進歩がないと思います。

ちょっとreturn文を追加する、こんな些細なことで構造が壊れてしまうような設計の脆弱性に問題があったと考えるわけです。

気をつけなくても、必ずhandler()が呼び出されるようにするにはどうすればいいのか、考えてみました。


解決案
====

案１　関数を分ける
---

非常につまらない話なのですが、単に内部ロジックを別の関数をわけておけば、こういう間違いは犯さなかったと思います。

```cpp
typedef boost::function< void() > handler_t;

void func_impl(int x)
{
   if (!x) return;

   // some logic
   // some logic
   // some logic
}

void func(int x, handler_t handler)
{
   func_impl(x);
   handler();
}
```

案２ Scope.Exit 的なライブラリーを使う
---

BOOST_SCOPE_EXITを知らないとコードが読めないのは欠点ですが、慣れるとこっちのほうが便利で安全な感じがしますね。

```cpp
#include <boost/scope_exit.hpp>

typedef boost::function< void() > handler_t;

void func(int x, handler_t handler)
{
    BOOST_SCOPE_EXIT(void) {
        handler();
    } BOOST_SCOPE_EXIT_END

   if (!x) return;

   // some logic
   // some logic
   // some logic
}
```


さらに考えると
===

元のソースと、案２のソースは例外が発生した場合に、handler()が呼び出されるかどうかが違うので、挙動が変わっていますね。

エラーハンドリングのポリシーも考える必要がありそうです。
Google+ APIの全機能を体験するツールを作った



##はじめに

Google+ APIを触ってみたのですが、割りとハマってしまったので、APIを使うまでの手順を自動化してみました。



認証に必要なシークレットIDなどを含む情報は、jsonをダウンロードしてきます。

jsonのダウンロードは、手動で行わなければなりませんが、ほぼ自動でGoogle+ APIが使えるようになります。

[airgoogleplus](https://github.com/syui/airgoogleplus)


割と雑に作ってあるので、できなかったら言ってくださると嬉しいです。


##airgoogleplus

###インストールと実行

```
git clone https://github.com/syui/airgoogleplus

cd !$:t

./airgoogleplus
```

ブラウザは、`Google Chrome`が使用されます。

###ツール

必要なツールはいくつかありますが、自動ダウンロードされるようにしておきました。

自動ダウンロードされるのは、以下のツールです。ダウンロードされる場所は、`airkeepass/tool/`です。


> percol https://github.com/mooz/percol

ただし、`jq`は、自分でインストールしてください。

> jq http://stedolan.github.io/jq/


###基本手順

```bash:
$ ./airgoogleplus gplus-a
```

または、





ブラウザが開かれますが、そこで、jsonをダウンロードします。ダウンロードフォルダがデフォルトから変更されている場合は、ダウンロードしたjsonファイルを`airgoogleplus/text/`に置きます。



ちなみに、承認後に特定のURLに飛ばされます。


これは正しい表示です。このURLの`code=`以降の部分がアクセストークンの取得に必要な値になります。

ブラウザでの承認やページが飛ばされた後には、`Enter!`という表示に従ってください。

###コマンド

|コマンド|内容|
|---|---|
|gplus-a| 認証からAPIを使うまでの自動化|
|gplus-m| APIでできることを一覧表示|
|gplus-o| OAuth 2.0での認証|
|gplus-j| プロフィールを取得|
|gplus-f| フォロワーを取得|
|gplus-u| URLを渡す|
|gplus-d| 個人ファイルの削除|
|gplus-e| 終了|

認証後は、Google+のAPIを使えるようになります。メニューを使うことをおすすめします。

```bash:
$ ./airgoogleplus gplus-m
```

###注意点

Google+ APIでは、1回での取得数が制限されていることが通常です。よって、すべての情報の取得は、`pageToken`を使います。

`pageToken`を使った継続処理は、考慮していませんが、`script/googleapi_page_token_test.sh`のスクリプトでテストしてみました。参考にしてみてください。


```bash:
$ curl -H "Authorization: Bearer $access" $url | jq .nextPageToken | curl -H "Authorization: Bearer $access" $url
```

###参考

<a href="https://developers.google.com/+/api/?hl=ja" target="_blank">Google+ API - Google+ Platform — Google Developers</a>

<a href="http://www.eisbahn.jp/yoichiro/2011/10/oauth2-0_google-api.html" target="_blank">天使やカイザーと呼ばれて » OAuth2.0によるGoogle+ APIのアクセス方法</a>

<a href="http://mba-hack.blogspot.jp/2013/12/google-api.html" target="_blank">Google+ API を触ってみた | MBA-HACK</a>
git diff --remote (gdr)を作ってみた。

StackOverFlowにすでに載っていたネタ投稿で一ヶ月一回の更新終了なんて寂しいので、もう一個ネタ投稿。

以前[push漏れ防止策を作ってみた](http://qiita.com/shiraji/items/92bbe60e9ddc618e11c2)でlogだけ見るくらいなら、コミットされていない編集全部見れるようにしたらいいじゃない。と思ったので、急いで作ってみた。

## .bashrc/.zshrc

```sh
alias g='git'
alias gd='g diff'
alias gdc='g diff --cached'
alias gdrm='gdr remotes/origin/master'
alias gdrd='gdr remotes/origin/develop'

function gdr() {
  # 引数取得
  _remotes="$1"
  # 引数がない場合は、今のブランチのリモートを比較対象とする
  if [ "${_remotes}" = "" ]; then
    _remotes="remotes/origin/"`gbn`
  else
    # remotes/originがついていなかった場合、remotes/origin/を付与する。
    if [[ "${_remotes}" != remotes/origin* ]]; then
      _remotes="remotes/origin/"${_remotes}
    fi
  fi

  # ブランチの存在確認
  _hash="`git rev-parse --verify -q ${_remotes} 2>/dev/null`"
  if [ "$?" = "0" ]; then
    # git diffをここで行う
    git diff ${_hash}
  else
    echo "${_remotes} does not exist"
    return 1
  fi
}
```
##aliasの概要

###git add前での比較
`gd`: git diffのalias。

###git add後〜git commit前
`gdc`: git diff --cachedのalias

###git commit後〜git push前
`gdr`: 下に詳細記載
`gdrd`: リモートのdevelopブランチとの比較する時に使う。
`gdrm`: リモートのmasterブランチとの比較する時に使う。

##gdrの説明
`gdr`は`git diff`の中でもリモートブランチとの比較で利用するものです。
 **ファイル単体や特定のハッシュでの比較には向いていません。（対応する予定なし）** 

###利用方法

```gdr [ブランチ名]```: 現在のローカルブランチとその名前と同じリモートブランチを比較します。
ブランチ名はremotes/origin/branch_nameかbranch_nameの指定を許可しています。
ブランチが存在していなかった場合、存在していないよとエラーになります。

##余談
最近、git関連のaliasだらけになりつつある。数えてみたら30個もあった。
CLIから1Passwordのように自動ログインする方法


##はじめに

`1Password`というMacのアプリがあります。

このアプリは、保存されたパスワードの強度な暗号化と自動ログインを補助するものです。

ここで、CLIユーザーの方は、`Keepass`というOSSのツールを使っている人が多いと思います。

私も、`Keepass`の方を使っています。

よって、`Keepass`で作られたデータベースファイルを使って、自動ログインを補助するツールを作ってみました。


[airkeepass](https://github.com/syui/airkeepass)


##airkeepass

###インストールと実行

``` bash
git clone https://github.com/syui/airkeepass

cd !$:t

./airkeepass
```

必要なツールはいくつかありますが、自動ダウンロードされるようにしておきました。

自動ダウンロードされるのは、以下のツールです。ダウンロードされる場所は、`airkeepass/tool/`です。

> percol https://github.com/mooz/percol

> kptool https://github.com/shirou/kptool

###コマンドからの実行

選択メニューを使わない場合は、`airkeepass/text/theme.txt`を確認して下さい。

|コマンド|内容|
|---|---|
|./airkeepass login-a|オートログインの実行|
|./airkeepass login-k|データベースファイルの追加|
|./airkeepass login-l| リストの表示|
|./airkeepass login-t| テストログイン|
|./airkeepass login-b| ブラウザの指定|
|./airkeepass login-d| 個人ファイルの削除|
|./airkeepass login-e| 終了|


###自動ログイン

試しに自動ログインしてみましょう。

テストのデータベースファイルが用意されていますので、それを選択します。`text/keepass-test.kdb`



指定したブラウザが開き、無事、IDとパスワードが入力され、Enterが押されました。


データベースファイルの場所は、`text/keepass.txt`に保存されますので、`airkeepass`は、一度実行すれば、次も同じファイルを選択します。

変更するには、`login-k`を選択または引数に指定します。

もし候補に上がってこない場所にある場合は、パスを手動で入力してください。



###注意点

`Google Chrome`を使ってなら確実にログインできます。

しかし、`Safari`と`Firefox`を選択した場合は、ブラウザのリロードによっては失敗することがあります。

原因は以下のコードになります。

```applescript:script/browser_form_input.sh
Safari|Firefox)

echo "
tell application \"$brows\"

--キー操作(C-v,Tab,入力,Enter)
--省略

"|osascript -
;;

Google Chrome|*)

echo "
tell application \"$brows\"

--リロード完了を待つ処理
   repeat while loading of active tab of window 1
        delay 0.1
   end repeat

--ペーストを実行
    paste selection active tab of window 1

--キー操作(Tab,入力,Enter)
--省略

"|osascript -
;;
```

Chromeは、リロード完了、ペーストの処理を書いていますが、SafariとFirefoxは書いていません。
「クリプタン帝国の暗号文を解読しよう！」の解答可能性について

問題：https://codeiq.jp/ace/yuki_hiroshi/q781
解答例：https://gist.github.com/cielavenir/10002153

今まで結城先生の問題は14連覇であったが、この問題に正解することはできなかった。
否、厳密には問1は正解できたが問2は正解できなかった。
問題の解説を読み、一度は納得し、私の答案を修正することに成功した。

だが、この問題は本当に普通の方法で解答可能なのか、検証することにした。

結城先生の実装では、 **Digest::SHA1が内部状態を持つ** ことを前提としたコードになっている。
確かに長いファイルのSHA1を算出するときは、ファイルを一度に読み込むのではなく、ブロックごとに読み込み、何度もupdate(sha1_loop())を呼び出して、最後に結果を出力するのが普通である。

しかし、私の記憶が確かならば、SHA1は最終状態を出力する際にパディングを付与するはずだ。
検証してみよう。
https://gist.github.com/cielavenir/10002153#file-codeiq781_2-c
ビンゴだ。 **このif 1をif 0に書き換えた瞬間、このプログラムは正常に動作しなくなる。つまり、sha1_result()を実行した瞬間に内部状態は破壊される。** Rubyではこのコピーを内部的に行っているだけなのだ。

この問題では何度もsha1_result()を呼び出す必要がある。そのたびにsha1_ctxのコピーが必要となるとなれば、SHA1が *この問題で示されるような* 内部状態を持つとは考えにくいのではないだろうか?
(i.e.このような解法は普通とは考えにくい。)

ここに問題の不備を指摘し、結びとさせて頂く。
プログラマがUIデザインするときに意識すること


最近はフラットデザインが主流となり、リッチな画像を作成する必要が減り、ノンデザイナでもデザインしやすくなっています。プログラマだからと言わず、バンバンUIをデザインしましょう。

##シンプルに

###余分な要素を取り除く
シンプルに物事を伝えるのはデザインとしてとても重要なことです。1つの画面でできることを減らし情報量も減らしましょう。情報量が増えるとUIは迷いやすくなります。重要な要素を2箇所以上強調表示しなければいけない状況に陥ったら、それは要素を詰め込み過ぎです。

###空白は大切
要素を取り除くと「落ち着いた感じ」に見えるのか「スッカスカ」に見えるのかのどちらかになります。「スッカスカ」に見せないためにも、レイアウトを意識するのが大切です。

##設計

###コンポーネントを設計する
画面によってボタンの色や形状が違うと、ユーザは操作方法がわからなくなります。まずはテキスト入力の表現、ボタンの表現などを統一しましょう。画面を設計するときに、作成したコンポーネントセットからチョイスするようにし、設計した画面からコンポーネントセットを作成するのはやめましょう。

###ポリシーを統一する
コンポーネントの設計と同じですが、文言、レイアウト、配色が画面でバラバラだとユーザは操作に迷います。

##インターフェイス

###アフォーダンスはそこまで重要ではない
明らかにクリックできる要素であるのが明確であれば、ボタンを無理やり立体にする必要はありません。立体にしなければ目立たないのであれば、それは他の要素が多すぎるのが原因です。

###フィードバックを明確に
デスクトップならマウスオーバーやマウスダウン、タッチパネルならタッチなどの操作によってUIの表現を変化させ、ユーザに「押されたよ」というのを伝えなければいけません。

###方向
操作の順番があちこちに飛ぶと操作しにくいです。上から順に選択する、情報は左から右へなど方向を意識しましょう。

##色彩

###HSVで色を決める
RGBではなく輝度、色相、彩度のバランスで決めましょう。文字が読みにくくなる原因の1つとして背景色との輝度差があります。輝度は常に意識する必要があります。

###カラフルにしない
それぞれの色の意味が不明瞭化すると、色以外で情報を増やす必要があります。例えばECサイトで、どの商品のカテゴリが選択されているかを明確にすれば、商品カテゴリ毎に背景色を変える必要はありません。

###リッチブラックとピュアホワイトをカラースキームで選択しない
＃000000と＃FFFFFFの色は極力避け、近い色を選択しましょう。ハイライトやシャドウが必要になった時に#000000や#ffffffを使用します。

##アニメーション

###アニメーションは重要
アニメーションは単なるエフェクトではありません。ユーザの要求に対する応答の表現であり、コンテキストの変化を表すためのものです。例えば画面が右から左へスライドするのは、次のページへ移動したという表現です。ユーザは前に戻ることもできると認識するでしょう。前に戻ることができるということを認識させることができれば、「現在のページはN/Mです」というような表現を省くことができ、画面をよりシンプルにすることができます。

###フレームレートを高くする
24fps程度だと遅い印象を与えます。常時60fps出るようになると使用感がとても上がります。昔のAndroidと昔のiPhoneを比べるとよくわかります。

##フォント・テキスト
(画像を作るとき用)

###フォントがダサいと全体がダサく見える
和文フォントなら新ゴシックやヒラギノゴシック、欧文フォントならHelvetica系を選んでおくと無難です。

###カーニングを調整する
イラストレータを使うならオプティカルカーニングを使用すると無難です。

###行間を調整する
行間を適切に調整しないと文章が読みづらくなります。

###UIとのバランスを考慮する
UIフォントと画像のフォントがアンバランス過ぎるとまとまりのない印象を与えます。

###和文フォントは大抵無料ではない
ライセンス的に画像に含めて配布するのは問題ないのが殆どですが、TrueTypeのままアプリに含めるのは大抵の場合ライセンス違反です。Flashの埋め込みフォントや、AndroidのAPKに含めるなども該当します。

##パクる
###丸コピーはしない
いいとこ取りをしましょう。[Pinterest](http://www.pinterest.com)辺りに参考になる元ネタが沢山あります。

###大体トレンドに収束する
デザインは大体がトレンドに収束するため、トレンドのデザインを抑えておけば、ユーザに馴染みのあるデザインになります。奇抜すぎるデザインは操作方法に迷うでしょう。
RDPでバッククォートとチルダが入らないときの対処

バッククォートとチルダが入力できないときの対処
=======
USキーボードを使っていて、Macからリモートデスクトップを使っているとき。
なんでか、Backquote(`)とかTilde(~)がうまく押せなくて、日本語入力ができなかった。

----
Karabiner(旧KeyRemap4MacBook) の、private.xmlに書く。

```xml
<appdef>
    <appname>MRD</appname>
    <equal>com.microsoft.rdc.mac</equal> 
</appdef>
<item>
    <name>Fix Backquote and Tilde input</name>
    <identifier>private.remotedesktopswapbackquote</identifier>
    <only>MRD</only>
    <autogen>__KeyToKey__ KeyCode::BACKQUOTE, KeyCode::DANISH_DOLLAR</autogen>
</item>
```
----
US International Keyboardは左シフトキーの右に、バッククォートとかチルダがおかれているらしい。Microsoft Remote Desktopがそのキーボードと勘違いしているのかな?
よくわからん。

----
参考になったところ: http://apple.stackexchange.com/questions/120913/unmap-key-combinations-in-keyremap4macbook
マクロ呼出画面に表示されないPublic関数を用意する

#概要
ExcelVBAで共通関数をPublicの形で定義した場合、
マクロ呼出画面（ツール >> マクロ）で表示されてしまう。
他モジュールのコード上からは呼び出せるが、
マクロ呼出し画面では表示させない方法を探した。

#コード
```vba:画面非表示Public関数.bas
'引数を設定すると、マクロ呼出し画面で表示されない。
Public Sub CommonSub(Optional ByVal dammy As Variant = Nothing)
    '何らかの処理
End Sub
```
Mac(iTerm)でscreenのタブ切替をファンクションキーで行う。

screenでタブを結構使うのですが、タブの切替を頻繁にします。
その都度、```<c-a> タブの番号```とタイプするのは正直つらい。

ということで、functionキーを使う設定が以下になる。

```sh
termcapinfo xterm* 'k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~'
bindkey -k k1 select 1
bindkey -k k2 select 2
bindkey -k k3 select 3
bindkey -k k4 select 4
bindkey -k k5 select 5
bindkey -k k6 select 6
bindkey -k k7 select 7
bindkey -k k8 select 8
bindkey -k k9 select 9
bindkey -k k; select 0
```

Windows+Poderosaだったらこれで動く。がこれMacのiTermのデフォルトの設定だと動かない。

HOMEキーとかを使ったりしているので、こういう設定しているんだけど

```sh
term xterm-256color
```

これのせいなのかなんなのか、F0は動くけど、他は全滅。
で、諦めていたのですが、readコマンド叩いた時にF1を間違って押してしまって、気づいた。
F1のバインドキーが```^[OP```になっていた。

それで、F1〜F9までの設定見直して、こんな感じにしてみた。

```sh
termcapinfo xterm* 'k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~'
bindkey -k k1 select 1
bindkey -k k2 select 2
bindkey -k k3 select 3
bindkey -k k4 select 4
bindkey -k k5 select 5
bindkey -k k6 select 6
bindkey -k k7 select 7
bindkey -k k8 select 8
bindkey -k k9 select 9
bindkey -k k; select 0

terminfo * k1=\EOP
terminfo * k2=\EOQ
terminfo * k3=\EOR
terminfo * k4=\EOS
terminfo * k5=\E[15~
terminfo * k6=\E[17~
terminfo * k7=\E[18~
terminfo * k8=\E[19~
terminfo * k9=\E[20~
terminfo * F1=\E[23~
terminfo * F2=\E[24~
```

この設定にしてから、Windows触っていないから、そちらの検証ができていない・・・。動かないなら、OSでのif/elseでなんとかすればいいと思う。（確認できたら、更新しておきます。）

* * *

と書いた後に少しググってみたら、すでに[StackOverFlow](http://stackoverflow.com/questions/4653572/how-do-i-get-the-f1-f12-keys-to-switch-screens-in-gnu-screen-in-cygwin-when-conn)に載っていたw
FreeBSD 無線LAN AP 切替時に DHCP で IP を自動的に取得するようにする。

*/etc/wpa_supplicant.conf* で AP ごとの接続設定は可能だと思うけど、 DHCP の設定は別で必要。

具体的には */etc/rc.conf* に *ifconfig_wlan0="WPA SYNCDHCP"* と記載する。

これで AP 切替時、 */etc/wpa_supplicant.conf* 書き換えて `/etc/rc.d/netif restart` した時など、DHCP で IP を自動的に取得するようになる。

# 参照

* [wpa_supplicant and dhclient (8.1RC2)](https://forums.freebsd.org/viewtopic.php?&t=15815)
Rails よく使うメソット集


```
  request.request_uri
  # => "/entries"

  request.path_info
  # => "/entries"

  request.url
  # => "http://localhost:3000/entries"
```

```
  collection_select デフォルト表示
  :prompt => "デフォルト表示"

```

Rails 定数の呼び出し

```
Rails.root.to_s
=> インストールされているpath
```

Rails 日付や時間の取り扱い

```
Date.tomorrow
# => 明日
Date.yesterday
# => 昨日
```

## console

```
Model.methods
# => そのModelの持っているMethod一覧を表示する。
```

## scope

```
■joinしたときにwhere文
Shop.joins(:charge).where(charges: {user_id: 1})
# => SELECT `shops`.* FROM `shops` INNER JOIN `charges` ON `charges`.`shop_id` = `shops`.`id` WHERE `shops`.`deleted_at` IS NULL AND `charges`.`user_id` = 1

```

## controller

```
before_filter
#=> ActionMethodを呼び出す前に読み込む ActionMethod
around_filter
#=> ActionMethodを呼び出す前後に読み込む ActionMethod
```
Python 多次元配列

多次元配列を使うのに、いちいちリスト内包表記で書くのは面倒だし、可読性が悪い

```py
def mlist(n, *args, **keys):
    if len(args) == 0:
        return [keys.get('default')] * n
    else:
        return [mlist(*args, **keys) for i in range(n)]

print mlist(5)
# [None, None, None, None, None]

print mlist(2, 3, default='a')
# [['a', 'a', 'a'], ['a', 'a', 'a']]

print mlist(4, 3, 2, default=1)
# [[[1, 1], [1, 1], [1, 1]], [[1, 1], [1, 1], [1, 1]], [[1, 1], [1, 1], [1, 1]], [[1, 1], [1, 1], [1, 1]]]
```
purescriptライブラリの動かし方


 前提
=======
purescript, grunt-cli, node, npmをインストール済み

ライブラリを動かすまで
=====================

例として、purescript-parsingの場合を書いてみます。まずgithubからプロジェクトをダウンロードします。それから、プロジェクトのルート・ディレクトリに移動して以下の操作をします。

>
> $ npm install
> $ bower install
> $ grunt

エラーが発生することがなければ、`example/test.purs.hs`をjavascriptにコンバートしたファイルが`js/Main.js`にできます。プログラムの実行は`node js/Main.js`とすれば動きます。出力は次の通りです。

>
> $ 3
> $ [a, a, a]
> $ Just b
> $ [a, a, a]
> $ [a, a, a]
> $ abc
> $ -2.25
プッシュ(リモート)通知(Apple Push Notification)の仕様


LocalおよびPush Notificationプログラミングガイドを読んで、気になった仕様をピックアップしてみました。iOSは詳しくないので間違いがあるかもしれません。

### Terminology

| 単語 | 説明 |
|:----------:|:-----------:|
| ペイロード(通知ペイロード) |システムがユーザに警告する方法に関する情報や、別途渡したカスタムデータなどが収容される.通知メッセージの正体.|
| アプリケーションデリゲート |アプリケーションのイベントを処理するオブジェクト|
| プロバイダ |サーバ側のアプリケーション(リモート通知をAPNに送信するサーバ)|

###ローカル通知との違い

- ローカル通知の発生源はデバイス上のアプリ
- プッシュ通知の発生源はリモートサーバ

### プッシュ通知受信時の流れ

アプリがフォアグラウンドで起動している時の通知

- アプリケーションデリゲートが通知を受ける

アプリがフォアグラウンドで起動していない時の通知

- システムにより通知(警告、数字付きバッジアイコン、サウンド)が行われる
- ユーザのクリックによりアプリケーションが起動
- メソッドが呼び出されペイロードが渡される

### 通知の失敗

- APNでは配信に失敗したデバイスのアプリケーションごとのリストが管理されている
- 失敗が続いているデバイスを確認し、配信の停止ができる
- 毎日定期的にフィードバックサーバに問い合わせて、デバイストークンのリストを取得するといい

###バッジ
- バッジの数字はアプリケーション固有のもので、どんな事柄の数を表しても構わない

### プッシュ通知の利用方法
- プッシュ通知による配信は保証されていないため、データ送信の目的でリモート通知メカニズムを使用してはいけない

### オフラインのデバイスへの再送

- APNsはプロバイダから受信した最後の通知を保持
- APNsによって保持されている通知はデバイスがオンラインになったときに、再送される
- オフラインの間に複数の通知が送られた場合、古い方から順に破棄
- 長時間にわたってオフラインになると、保存していた通知も破棄

### 警告音の仕様

サポートフォーマット

- リニアPCM
- MA4（IMA/ADPCM）
- µLaw
- aLaw

再生時間の制限

- 30秒未満### 登録の仕様

- アプリケーションを起動するたびに登録する必要がある
- 得られたデバイストークンは毎回プロバイダへ送信

### 通知ペイロードの制限

- 通知ペイロードに許される最大サイズは256バイト
- 上限を超える通知は拒否

### 参考URL

Localおよび Push Notificationプログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/RemoteNotificationsPG.pdf

iOSアプリケーション プログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/iPhoneAppProgrammingGuide.pdf
オムニ補完時の col('.') の値

`<C-x><C-o>` で Vim 標準の方法でオムニ補完をした場合、`!a:findstart` 時の `col('.')` は補完の開始位置、つまり `a:findstart` 時に返した場所になる。

しかし、[neocomplete.vim](https://github.com/Shougo/neocomplete.vim) や [YouCompleteMe](https://github.com/Valloric/YouCompleteMe) の場合、各自のエンジンが補完関数を呼んでいるため、`col('.')` の値は普通に補完時のカーソル位置になる。なので `col('.')` の値に依存した omnifunc を書くと neocomplete.vim や YouCompleteMe では動かなくなる。
neocomplete.vim の場合、gather_candidate の中で `a:context.complete_pos` が補完開始位置になっているので、この値を使うようにする。
YouCompleteMe の場合、そもそも `a:findstart` 時に返した補完開始位置を無視するので (つらい……)、本当の補完開始位置を知るためには再度 `a:findstart` 時の処理を行う必要がある、と思う。

[neco-ghc](https://github.com/eagletmt/neco-ghc) では汎用的に書く方法を思い付けず、`col('.')` のこの挙動等によって Vim の補完なのか neocomplete.vim の補完なのか YouCompleteMe の補完なのかを判定して分岐させている……
プログラマ向けのデザイン解説、ツールまとめ


私もプログラマでデザイナではありませんが、仕事柄デザインをすることも多々あります。過去に参考にしたサイトやスライドをまとめます。要点だけを抑えておけば、絵心がなくても「何となく垢抜けた感じ」のデザインにすることもできます。

##デザインの基本

レイアウトや書体など分かりやすく解説されています。

[ノンデザイナーズ・デザインブックを読み解く](https://speakerdeck.com/monoooki/read-a-non-designers-designbook)

[伝わるデザイン](http://tsutawarudesign.web.fc2.com/index.html)

##配色ツール

WEB上でカラースキームを作成できるサイトです。

[COLOURlovers](http://www.colourlovers.com)

[Adobe Kuler](https://kuler.adobe.com)

[HUE/360](http://hue360.herokuapp.com)

##配色の解説スライド
分かりやすく配色理論が解説されています。

[ノンデザイナーのための配色理論](http://www.slideshare.net/saucerjp/ss-14902681)

[色彩センスのいらない配色講座](http://www.slideshare.net/marippe/ss-9003317)

[色で失敗しないた為に　〜理論に基づく配色フロー〜](http://www.slideshare.net/yuudaitachibana/hokurikunet2)

[配色を楽にするコミュニケーション](http://www.slideshare.net/kyunitan/book-17718095)

[Webデザイナーのための配色セオリー](http://www.slideshare.net/webcampusschoo/web-26859730)

##インスピレーション
デザインの参考になるサイトです。

[Pinterest](http://www.pinterest.com)
Flat UIやIconなどのキーワードで検索すると捗ります。

[Dribbble](http://dribbble.com)
おしゃれな画像をアップするサイト。Pinterest同様に特定のキーワードで検索すると捗ります。

##その他ツール
デザインを考える上で便利なツールです。

[Webデザイン黄金比計算ツール](http://zapanet.info/blog/item/1298)
macに慣れる


随時書く。よく使いそうなものを上に。

# ブラウザ(safari)

- reload は command + r 
    - これが知りたかったw！
- ソースを表示
    - 環境設定 > 詳細 > 開発メニューを表示
- 他にも
    - http://inforati.jp/apple/mac-tips-techniques/internet-hints/how-to-use-mac-safari-browser-with-keyboard-shortcut.html


# 日本語入力系

- 日本語入力
    - command + space
    - さすがにこれは知ってた
- (日本語入力モード中に)半角に変換
    - ctrl + 「 ; 」
    - これは便利。
    - fn + F8 でも
- (日本語入力モード中に)数字の入力は半角にする
    - これ、結構便利
    - ことえりの"日本語環境設定"を開き
    - 入力ソース：日本語
    - 数字を全角入力のチェックを外す
- functionキーは、fnキーを押して使う
    - 設定で切り替えられる
    - システム環境設定->キーボード->「F1,F2など...」で反転

# 開発環境::Atomエディタ
- 行の折り返し
    - http://qiita.com/nsatohiro/items/33d87cfb7cfca436f3d2

# タッチパッドのジェスチャー

- http://support.apple.com/kb/ht4721?viewlocale=ja_JP
    - と、システム環境設定->トラックパッド、のムービーをみる
    - App Expose は便利そう
- App Expose
    - 感圧トラックパッドの場合は、dockのアイコンを強クリック。
    - http://www.gizmodo.jp/2015/03/macbook_150319_trackpad.html

# スクリーン、デスクトップ操作

# 開発環境::Sublime Text

- https://github.com/mhartl/rails_tutorial_sublime_text
- SublimeText3 を入れたいので適宜読み替え
    - まず、ダウンロードしたappの場所で戸惑った
    - dmgを開いてそのままiconから使えちゃうのだけど、ApplicationのショートカットにドラッグしてApplicationの下に配置する
        - そうすると、/Application/Sublime Text.app/ になる
            - tabで補完するとよい(spaceがescapeされる)
    - 自分のユーザーの下にbinを作り、ターミナルから起動しやすくする

```
$ mkdir ~/bin
$ ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl ~/bin/subl
$ vi ~/.bash_profile

PATH=$PATH:~/bin
を追記

$ source ~/.bash_profile
```

# 開発環境::サービスの制御

```
$ sudo brew services start postgres
$ sudo brew services stop postgres
$ sudo brew services list
```

- brew便利

## macのパッケージ管理の話＋α

- .app と.dmg 
- http://www.atmarkit.co.jp/ait/articles/1403/31/news032_2.html

# 開発環境::vim

- NeoBundle から
    - http://qiita.com/puriketu99/items/1c32d3f24cc2919203eb
- alpaca隊長の。
    - http://qiita.com/alpaca_taichou/items/ab2ad83ddbaf2f6ce7fb
-
TeraTermマクロで試験ログ取得

試験の自動化はかなりの手間がかかるが、
手動で試験する場合、試験毎のログ取得にも地味に時間がかかる。

ここではTeraTermのマクロを利用したお手軽なログ取得スクリプト例を紹介。

試験をやる際の稼働がぐっと減るのでおすすめ。
■用意するもの
・ログ取得対象のサーバ
・マクロを実行する操作用PC（サーバにSSH接続できること）
　→TeraTermとTeraTermMacroをインストールしておく
　 ※TeraTermのバージョンは4.66以上

■マクロの内容
・自動SSHログイン
・ログ取得

※いろいろ試した結果、ログ取得には以下のSCP受信方法を使わせて頂きました。
参照：http://qiita.com/KurokoSin/items/b4d2d0a81c8d05f110ef

```TeraTermMacro：自動SSHログイン

;************************************************************************************
;初期設定
;************************************************************************************

;===================================================================================
; IPアドレス、ID、パスワード設定
HOSTADDR = '192.168.1.1'
LOGIN_ID = 'root'
LOGIN_PASSWORD = 'password'
;===================================================================================

;===================================================================================
;ログインプロンプトチェック　※サーバにログインしたときのプロンプトと合わせる
PROOUT = '[root@test]#'
;===================================================================================

;===================================================================================
;ログを保存するパス 
;remoteFile:サーバ側のログファイルパス
;localFile:ローカル（マクロ実行側）のログ保存パス
remoteFile = '/var/log/message'
localFile = 'C:\test\testlog'
;===================================================================================

;************************************************************************************
;自動SSHログイン
;************************************************************************************

COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND LOGIN_ID
strconcat COMMAND ' /passwd='
strconcat COMMAND LOGIN_PASSWORD

connect COMMAND

wait PROOUT
sendln ''

wait PROOUT
sendln ''

;************************************************************************************
;取得するログを初期化
;************************************************************************************

sendln ':> /var/log/message'


;************************************************************************************
;メッセージを表示　※メッセージを表示している間にテスト実行　終わったら、OKボタンを押す
;************************************************************************************

messagebox 'Wait until the end of the test. Press After testing.'


;************************************************************************************
;ログをサーバから取得　
;************************************************************************************

;wait synchronized
filesearch localFile
    if result then
        filedelete localFile
    endif

    scprecv remoteFile localFile

    mpause 1100
    sizeBef = 0
    :confirm_start
        filestat localFile sizeNow
        if sizeNow = sizeBef then
            goto confirm_end
        else
            mpause 1100
        endif
        sizeBef = sizeNow
        goto confirm_start
    :confirm_end


;************************************************************************************
;SSH接続終了
;************************************************************************************

wait PROOUT
sendln 'exit'

```
CI環境構築 ~ Python編 ~

Pythonの継続的インテグレーション環境を無料で簡単にセットアップする方法

### 利用するサービス
- [Travis CI](https://travis-ci.org)（無料のCI環境）
- [CoverAll](https://coveralls.io)（Travis CIで実行したコードのカバレッジを閲覧できるサービス）
- [Slack](https://slack.com/)（Travis CIからの通知を受け取るチャットサービス）

### 事前準備
1. GitHubアカウントの取得
2. リポジトリ作成
3. RubyGemのインストール（Travisコマンドインストールに使用）

### Travis CIのアカウント取得とリポジトリ選択
1. 右上のリンクからGitHubアカウントでサインイン
2. テストしたいリポジトリをONに変更

### テストコード
- tests/hoge_test.py
- src/fuga.py

#### tests/hoge_test.py
1. "test_first"を表示
2. Fugaクラスのindexメソッドを呼び出してTrueを確認する。

```py:tests/hoge_test.py
# coding:utf-8

import unittest
from fuga import Fuga

class HogeTest(unittest.TestCase):

    def setUp(self):
        print('setUp')

    def test_first(self):
        print('test_first')

    def test_fuga(self):
        fuga = Fuga()
        self.assertTrue(fuga.index())


def suite():
    suite = unittest.TestSuite()
    suite.addTests(unittest.makeSuite(HogeTest))
    return suite
```

#### tests/fuga.py
1. `index()`：Trueを返す。

```py:src/fuga.py
# coding utf-8

class Fuga:

    def index(self):
        return True
```

### 設定ファイル
- setup.py
- .travis.yml

#### setup.py
1. 実行環境の設定スクリプト
2. `sys.path.append()`に使用するコードのパスを設定
3. `test_suite`にコード中で`suite.addTests()`したテストファイル名を"testfile_name.suite"の形式で指定

```py:setup.py
from setuptools import setup, find_packages
import sys

sys.path.append('./src')
sys.path.append('./tests')

setup(
    name = 'Hoge',
    version = '0.1',
    description='This is test codes for travis ci',
    packages = find_packages(),
    test_suite = 'hoge_test.suite'
)
```

#### .travis.yml
1. Travis CIの設定ファイル
2. `python:` バージョン指定
3. `install:` pipでcoverallsパッケージをインストール
4. `script:` coverageコマンドでテストを実行
5. `after_script:` coverallsコマンドを実行
6. `notifications:` slackへの通知設定

```yaml:.travis.yml
language: python

python:
  - 3.3
  - 3.4

install:
  - pip install coveralls

script:
  - coverage run --source=hoge_test setup.py test

after_success:
  - coveralls

notifications:
  slack:
    secure: your_token_key
```
- [CoverAll](https://travis-ci.org)との連携については[COVERALLS FOR PYTHON](https://coveralls.io/docs/python)を参照
- notificationの設定は[Configuring Build Notifications](http://docs.travis-ci.com/user/notifications/)を参照
- your_token_keyを暗号化する方法は[Encryption keys](http://docs.travis-ci.com/user/encryption-keys/)を参照  
※ rbenvを使ってる場合はrehashをお忘れなく
- **coveralls-python**ライブラリが**python3.0 ~ 3.2について対応しなくなった**ので、テストバージョンを3.3以上にする。

### GitHubにPush

結果表示については[CI環境構築 ~ PHP編 ~](http://qiita.com/masashi0127/items/16b1d7f8c0669a5f8e92#3-6)を参照
Pythonistaのための静的Blogエンジン'Pelican'とAmazon S3でブログを公開する方法

Amazon S3は言わずと知れた, 静的ファイルをWeb上にホスティングできるサービス。Pelicanは日本ではマイナーですがMarkdownかreStructuredText形式のファイルを作るといい感じにhtmlを生成してくれるPython製のツール。"Pelican"という名前は, フランス語でノートを指す"calepin"から来ているらしいです。

![Pelican](http://docs.getpelican.com/en/3.3.0/_static/pelican.png "Pelican")
[http://docs.getpelican.com/en/](http://docs.getpelican.com/en/)

Pythonが流行ってない日本だとかなりマイナーなんですが, 使ってみた感じとてもシンプルで使い勝手も良いのでみんな使って欲しい！まだテーマ少ないので誰か作って欲しい！（他力本願）

今回はAmazon S3上にホストする例を挙げていますが, [Heroku](https://www.heroku.com/)や[Github Pages](http://pages.github.com/)にも簡単にアップロードできるようになってるし, タグやプログラミングコードのハイライト, RSSなど機能的にも最低限のものは揃っているように感じます。

### 事前準備
***

* Amazon S3のサービス登録と設定（アクセスキーとシークレットキー）
* 独自ドメインの取得（必要な場合）

は先に実施しておきます。
Amazon S3のドメインは長ったらしくて微妙なので独自ドメインは必要かと思います。
私は以下のブログ等を参考にさせていただいて設定を進めました。

[AWS S3 のバケットに独自ドメインを割り当てて、静的ファイルをホスティング - ニッチなWordPress徒然日記](http://gatespace.jp/2013/03/05/aws-s3-static-site/)


注意点

1. サブドメインではなくルートドメインで運用する場合, [Amazon Route 53](http://aws.amazon.com/jp/route53/)でのドメイン登録が必須。

2. Webページとして運用する場合S3のbucket nameとブログのドメインとが一致している必要あり。

### Pelicanのインストール
***

私はPythonは2.7系を使用してます。pipを使うと楽ですね。

    
    $ pip install pelican
    
Markdown形式で書きたい場合はこちらも。

 
    $ pip install markdown

    
インストールできたらクイックスタートコマンドを実行。

   
    $ pelican-quickstart
    
たくさん質問が出てくるので順番に答えていってください。

入力が終わるとPelicanプロジェクトのひな形が作成されます。

   
    $ ls
	content/
	output/
	Makefile
	develop_server.sh
	pelicanconf.py
	publishconf.py
	
**content/**
 
MarkdownかreST形式のファイルを入れるフォルダ。ユーザがブログを編集する作業フォルダになります。

**output/**
 
最終的なhtmlの出力先。

**Makefile**
 
htmlを出力したりlocalhostでコンテンツを確認したり, いろんなコマンドを提供してくれます。

**pelicanconf.py**
 
Pelicanの設定ファイル。
Blogの設定を変えたいときはだいたいこいつを編集します。

**publishconf.py**
 
商用の設定。実際に公開するときに必要な情報を編集します。Google Analyticsや[Disqus](http://disqus.com/)によるコメント入力の設定なんかも。

### 記事を書いてみる
***
とりあえず上記の設定ファイルなんかはいじらず, content配下にMarkdown形式でファイルを作ってみましょう。"This is..."以降がMarkdown形式での本文, そこから上はPelicanにブログのタイトルや日付, タグなどを伝えるためのシンタックスです。"Slug"は記事のURLをタイトルの文字列のハイフン繋ぎで表したものです。[Huffingtonpost](http://www.huffingtonpost.jp/)の各記事のURLなんかを見るとイメージがつくと思います。


	Title: My super title
	Date: 2010-12-03 10:20
	Tags: thats, awesome
	Category: yeah
	Slug: my-super-post
	Author: Alexis Metaireau
	Summary: Short version for index and feeds

	This is the content of my super blog post.
	
上記のようなファイル page.md をcontent/ に作成します。
出来たら


    $ make html

でhtml出力, 

 
    $ make serve
    
でローカルサーバが動くのでlocalhost:8000で確認してみましょう。
上で作ったmdファイルがhtmlとして閲覧できるのが確認できるはずです。簡単ですね！

### S3にデプロイ
***
ここまで出来たらいよいよS3にデプロイです。s3cmdというツールをインストールして, configureで設定をします。

    $ pip install s3cmd
    $ s3cmd --configure
    
また質問が出てきますが, アクセスキーとシークレットキー以外は空白でENTERで構いません。

次に商用の個別設定をpublishconf.pyにしている方は

 
    $ make publish

コマンドを発行。これは読み込む設定ファイルをpublishconf.pyに変えて make html しているだけです。

最後に

    $ make s3_upload
    
これでファイルがS3にアップロードされてブログが閲覧できます。

私も勉強しながらなので, 情報はちょこちょこ追記してきたいです。
基本は[ドキュメント](http://docs.getpelican.com/en/3.3.0/)を見ながら勉強ですね。Pythonの宿命として, 情報はだいたい英語圏にあります…。

__追記__
良く変更しそうな設定について別記事にまとめました.
[Python製静的ブログ生成ツール'Pelican'の各種設定](http://qiita.com/_rdtr/items/8052d2595825f8bc6c2b)
「Max OS 拡張(大文字/小文字を区別、ジャーナリング)」でフォーマットしてしまった環境にCS6をインストールする方法


## やりたいこと＆発生している問題

MacOSXの再インストールを行った時に、ディスクのフォーマットをデフォルトの「Mac OS 拡張(ジャーナリング)」ではなく、「Mac OS 拡張(大文字/小文字を区別、ジャーナリング)」を選択してしまっていた。
選択した理由は、基本的にターミナルで作業をしていて、区別するのが普通だろ。ぐらいな認識で特に問題があって変更したわけではなかった。

作業上必要が生じて、Adobe CS6をインストールすることになったところ、以下のエラーが発生してインストールできなかった。

>次の問題が発生しました
> 大文字と小文字が区別されるボリュームへのインストールはサポートされていません。別のボリュームをインストール先として指定してください。

![](https://qiita-image-store.s3.amazonaws.com/0/31839/c4d6b2fb-a4b1-60ab-9d3a-cb4c9249fc75.png)

パーティションを切り直して、別のボリュームを作成したが、起動している環境のフォーマットを変えないと、そもそもインストーラー起動時にエラーになってしまうようだ。

## 環境

- Mac OSX 10.9.2
- ディスクの空き容量が半分以上ある
	- パーティションを切っていない

## やったこと

結局の解決は、ディスクフォーマットを変更して環境を移植するということ。

### パーティションを切り、新環境を用意する

OSXでは、起動中に手軽にパーティションを切り直すことが出来る。

参考: http://inforati.jp/apple/mac-tips-techniques/application-hints/how-to-add-or-remove-a-partition-of-macos-hard-disk-drive-with-disk-utility-app.html

パーティションを切って新環境を用意する。

MacbookPro 500Gなので、こんな感じにしてみた
- 既存環境のOS領域 150G
- 新環境のOS領域 150G
- データ領域 150G
- 管理用のOS領域 50G

VMware等のサイズがでかいけど環境依存ではないデータは、データ領域に移行。
管理用のOS領域には、保険のために作った。
フォーマットはもちろん「Mac OS 拡張(ジャーナリング)」。

## 新環境の作成

OSを再起動し、起動時に `Command+R` を押すと、復元ユーティリティが起動する。

OSXを新環境のOS領域を選択してインストールする。間違っても既存環境を選択しないように。。

## データ移植

あとは、新環境から起動して、移行アシスタントを使用して、既存環境からデータを移植し、CS6をインストールする。

## 移植確認後に既存環境を削除する

移植が完了して問題無いと判断できた時点で、旧環境を消す。
再度、再起動して復元ユーティリティで起動する。

1. 復元機能を使って、既存の領域に新環境をコピーする
1. 新環境で起動できることを確認してから新環境の領域を削除する
1. 既存の領域を広げる

復元機能の参考: http://www.maruko2.com/mw/MacOSX%E8%B5%B7%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%AE%E5%AE%8C%E5%85%A8%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2
復元のソース、復元先を間違えないように！

最終的なディスクのパーティション

- 新環境のOS領域 300G
- データ領域 150G
- 管理用のOS領域 50G

## さいごに

当たり前ですが、ディスクをこねくり回すのでバックアップをお忘れなく、自己責任で。
外部ディスクがあれば、もっと簡単に出来るかも。

## 追記

移行アシスタントを使用して環境移行すると、`/etc/`や`/usr/`以下のファイルやbrewでインストールした設定がちゃんと引き継がれていなかった。

###  apacheの設定

- `/etc/apache2/extra/httpd-vhosts.conf` の設定は移行されていた
- `/etc/apache2/httpd.conf` は初期ファイルっぽかったのでコメント外したりする必要があった

### brewで入れたもの

いくつか正常に動かなかったので、結局一度 uninstall してから入れなおした。
[rails3, devise] Devise認証のカスタマイズ (Strategies)

Devise の認証ロジックをカスタマイズしてみた。
認証ロジックを独自実装する方法を会得すると devise のカスタマイズの幅が大きく広がる。
試作した全ソースコードは https://github.com/katoy/rails-canvas にある。

  0. test を書く
  1. config/initializers/devise.rb で 認証ロジックのメソッドを指定する。
  2. 認証ロジックを実装する。

ここでは、username で login 制限をつけてみた。
 user_02, user_04, user_06, user_08 をログイン禁止にする。
（実際にはこんな制限をつけることはないだろうが、ロジックを簡単にする為に。)

 $ rake db:fixtures:load 
 で user_01, user_02, ... を登録できます。
 (定義される内容は test/fixtures/user.yml を参照すること)

0. test を書く
-----------------

 user_02 はログインできないこと、 user_01 はログインできること をテストする。

```test/integration/devise_test.rb 
  ...
  test 'user_02 can not login' do
    post '/users/sign_in', user: { username: 'user_02', password: '123123' }, format: 'js'
    # assert that the response code was status code 401 (unauthorized)
    assert_response 401
  end

  test 'user_01 can login' do
    post '/users/sign_in', user: { username: 'user_01', password: '123123' }
    assert_response :success
  end
  ...
```

1. 認証ロジックのメソッドを指定する。
------------------------------------

   以下の行を追加

```ruby:config/initializers/devise.rb
  ...
require Rails.root.join('app/controllers/local_devise/local_authenticatable')
  ...
  config.warden do |manager|
    manager.default_strategies(:scope => :user).unshift :local_authenticatable
  end
  ...
```

2. 認証ロジックを実装する。
------------------------

devise 内にある database での認証ロジックに手を加えた実装をする。

```ruby:app/controllers/local_devise/local_authenticatable.rb
# -*- coding: utf-8 -*-

require 'devise/strategies/authenticatable'

# See
#  https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/database_authenticatable.rb
#  http://qiita.com/hattorix@github/items/f383afdef336975bd669#2-3

# ログインチェック方法を独自に定義する。
# databas_authenticable を ベースにして、ログイン許可のアカウントチェックを追加する。
# config/initializers/devise.rb 中で、このチェックメソッドをつかうことを設定する必要がある。

module Devise
  module Strategies
    # Devise 標準の DatabaseAuthenticatable に サーバータイプ別のアカウントチェックを追加。
    class LocalAuthenticatable < Authenticatable
      def authenticate!
        resource  = valid_password? && mapping.to.find_for_database_authentication(authentication_hash)
        encrypted = false

        if validate(resource){ encrypted = true; validate_resource(resource) }
          resource.after_database_authentication
          success!(resource)
        end

        mapping.to.new.password = password if !encrypted && Devise.paranoid
        fail(:not_found_in_database) unless resource
      end

      # ログインチェックのロジック
      def validate_resource(resource)

        # user_0[2468]* のユーザーは login 不可にする。
        return false if /user_0[2468]/ =~ resource.username

        # パスワードのチェック
        resource.valid_password?(password)
      end
    end
  end
end
Warden::Strategies.add(:local_authenticatable, Devise::Strategies::LocalAuthenticatable) 
```

$ rake test でテストを実行する。
Virtualenvwrapperの導入

Pythonの固有環境を作成するvirtualenvの機能を簡単に使えるようにするVirtualenvwrapperの紹介と, Mac OS Xでの基本的な使い方について。

###Virtualenvwrapperのインストールと設定

#### Virtualenvwrapperのメリット
Virtualenvだけでも十分に簡単に使用できますが, wrapperを導入することで

+ 各環境の管理, 切り替えが簡単になる
+ 各環境に切り替えた時など特定のポイントで実行したい処理をフックとして記述できる

といったメリットがあるので, 入れる価値があると思います。Python3.x系にも対応。

#### インストール
pipから落とせる。各環境を管理するツールなので, wrapperそのものはグローバルにインストールする。

```sh
$ sudo pip install virtualenvwrapper
```

***
#### 設定
インストールしただけではまだ使える状態になっていない。
ログインシェル(※1)に以下の設定を追記する。

```sh
### Virtualenvwrapper
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi
```

これは見たままで, 

/usr/local/bin/virtualenvwrapper.sh があれば(=virtualenvwrapperがインストールされていれば), WORKON_HOMEを設定してvirtualenvwrapper.shを実行するようにしている。

virtualenvwrapper.shのPATHは環境にもよるので

```sh
$ which virtualenvwrapper.sh
```

で確認しておく。WORKON_HOMEはvirtualenvで作成した各環境が格納されているフォルダを指定する。まだ1つも作成済の環境が無い場合は上記の設定のままでよい。

(※1) .bashrc とか.bash_profile とか .profile とか。自分の場合はzshを使っているので .zshrc です。

***
#### 使い方
##### 環境の一覧を確認
もう作成済の環境がある場合はworkonコマンドで一覧を見ることができる。

```sh
$ workon                                                                                   
sandbox2
sandbox3
```
    
##### 環境を作成

mkvirtualenv [環境名]で作れる。

```sh
$ mkvirtualenv --python=/usr/local/bin/python3 testdayo
    
Running virtualenv with interpreter /usr/local/bin/python3
Using base prefix '/usr/local/Cellar/python3/3.3.2/Frameworks/    Python.framework/Versions/3.3'
New python executable in testdayo/bin/python3.3
Also creating executable in testdayo/bin/python
    
Installing Setuptools...done.
Installing Pip...done.
    
$(testdayo)
```
   
virtualenv単体で使った時と同じく, --pythonのオプションで使用するpythonを指定できる。
実行後はtestdayoという固有環境が作られて自動的にグローバルからその固有環境へ切り替えが行われる。

上記WORKON_HOMEで指定したディレクトリ内に, 仮想環境が作成されていることを確認しよう。

##### 環境の切り替え

workon [環境名]で作成済の固有環境に切り替えることができる。また一度入った固有環境からシステム(グローバル)に抜けたい場合はdeactivateコマンドを打つ。

現状↑で作成したtestdayo環境に入っていたので, deactivateで抜けてみよう。

```sh
$(testdayo) deactivate
                                                                      
$ 
```

再度testdayoに切り替えてみる。

```sh
$ workon testdayo  
                                                                        
$(testdayo)
```

固有環境に入っている場合はカッコで環境名が明示されるので, 分かりやすい。

##### 環境を削除

作った仮想環境を削除するときは, いったんグローバルに抜けてrmvirtualenv [環境名]を打てば良い。

```sh
$ rmvirtualenv testdayo
Removing testdayo...
                                                                      
$ 
```

##### フック
virtualenvwrapperを使うもう1つの利点が, 上で書いたような環境の作成, 切り替え, 削除といったタイミングで特定の処理を行うような記述ができること。特定の処理を実施させるフックポイントにはpreactivate, predeactivate, postdeactivateといった様々なものがある。詳細はドキュメントを参照されたし↓

[Extending Virtualenvwrapper - virtualenvwrapper](http://virtualenvwrapper.readthedocs.org/en/latest/plugins.html)

これらのフックポイントに対応したファイルが


[virtualenvwrapperのWORKON_HOMEのPATH]/[環境名]/bin/


配下にあるので, そこに実行したいシェルスクリプトを記述すると良い。たとえばある環境に切り替えた際にtest.shを実行したい, ということであれば対応するフックポイントはpostactivateであるため, 

[virtualenvwrapperのWORKON_HOMEのPATH]/[環境名]/bin/postactivate

に

```sh
#!/usr/local/bin/zsh
# This hook is run after this virtualenv is activated.

source test.sh
```

と記述してやれば良い。1行目は自身のシェルの実行環境に合わせる( #!/bin/bash とか)こと。
HomebrewでインストールしたMySQL,MongoDBを自動起動させる


## やりたいこと

HomebrewでMySQL,MongoDBをインストールて、Macログイン時に自動起動させたい。

## 環境

- OS X 10.9.2
- Homebrew 0.9.5

## やったこと

### MySQL,MongoDBのインストール

```
brew install mysql
brew link mysql
brew install mongodb
brew link mongodb
```

link時に以下のようなエラーが出た場合は、一回unlinkしてからリンクし直す。

```
$ brew link mysql
Warning: Already linked: /usr/local/Cellar/mysql/5.6.16
To relink: brew unlink mysql && brew link mysql
```

### 自動起動の設定

```
ln -fs /usr/local/opt/mysql/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/
ln -fs /usr/local/opt/mongodb/homebrew.mxcl.mongodb.plist ~/Library/LaunchAgents/
```

### すぐに起動する場合

次回、再起動時に自動起動されるが、設定後すぐに起動する場合は以下実行する。

```
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
```

### 起動しているか確認

```
$ ps ax | grep mysql
34910   ??  S      0:00.02 /bin/sh /usr/local/opt/mysql/bin/mysqld_safe --bind-address=127.0.0.1
35003   ??  S      0:00.65 /usr/local/Cellar/mysql/5.6.16/bin/mysqld --basedir=/usr/local/Cellar/mysql/5.6.16 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/5.6.16/lib/plugin --bind-address=127.0.0.1 --log-error=/usr/local/var/mysql/maru.local.err --pid-file=/usr/local/var/mysql/maru.local.pid
35153 s001  S+     0:00.00 grep mysql

$ ps ax | grep mongo
35142   ??  S      0:00.15 /usr/local/opt/mongodb/mongod run --config /usr/local/etc/mongod.conf
35162 s001  S+     0:00.00 grep mongo
```

### 起動に失敗した時

OSの不正終了等で lock ファイルが残っていて起動に失敗した場合の対応

```
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
rm /usr/local/var/mongodb/mongod.lock
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
```
会議の時間

本当はRange Problem( http://www.checkio.org/mission/painting-wall/share/8a0e0061de3ff95664776d904d309e57/ )を実装したかったところだが面倒なので止めました。

```cpp:hena20.cpp
//http://qiita.com/Nabetani/items/5791f8ae1bb5d069a49b
//http://nabetani.sakura.ne.jp/hena/ord20meetime/
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<string> split(string &str, const char *delim){
	vector<string> result;
	int cutAt;
	while( (cutAt = str.find_first_of(delim)) != str.npos ){
		if(cutAt > 0){
			result.push_back(str.substr(0, cutAt));
		}
		str = str.substr(cutAt + 1);
	}
	if(str.length() > 0){
		result.push_back(str);
	}
	return result;
}

int get_hhmm(const char *s){
	return (s[0]-'0')*600 + (s[1]-'0')*60 + (s[2]-'0')*10 + (s[3]-'0');
}
void print_hhmm(int n){
	putchar('0'+n/600);
	putchar('0'+n/60%10);
	putchar('0'+n/10%6);
	putchar('0'+n%10);
}

int main(){
	string line;
	int i,j,k;
	for(;getline(cin,line);){
		vector<string> data=split(line,",");
		vector<int>A(24*60),B(24*60),I(24*60),J(24*60),Z(24*60);
		for(i=0;i<data.size();i++){
			vector<int> &v=data[i][0]=='A'?A:data[i][0]=='B'?B:data[i][0]=='I'?I:data[i][0]=='J'?J:Z;
			int start=get_hhmm(data[i].c_str()+1);
			int end=get_hhmm(data[i].c_str()+6);
			for(;start<end;start++)v[start]=1;
		}
		for(i=600;i<=1020;i++){
			for(j=0;j<60;j++)if(A[i+j]||B[i+j]||!Z[i+j])break;
			if(j==60){
				for(j=0;j<60;j++)if(I[i+j])break;
				for(k=0;k<60;k++)if(J[i+k])break;
				if(j==60||k==60){
					print_hhmm(i);
					putchar('-');
					print_hhmm(i+60);
					break;
				}
			}
		}
		if(i>1020)putchar('-');
		putchar('\n');
		fflush(stdout);
	}
}
```