OmniAICreator/Qiita-1.07M huggingface dataset:
CVE-2014-6271のbashの脆弱性に対応する方法




##Mac

Macの場合は、`Homebrew`や`MacPort`でも修正版である`4.3.25`が配布されています。したがって、以下のコマンドで対応できます。

###Homebrew

```bash:
$ brew update

$ brew upgrade bash
```

###MacPort

```bash:
$ sudo port self update

$ sudo port upgrade bash
```

###/bin/bash

脆弱性を有しているかどうかは以下のコマンドを実行すると分かります。

```bash:
$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
hello
```

デフォルトでインストールされているbashである`/bin/bash`は、手元環境を確認した所によると`bash 3.2`になりました。

```
$ /bin/bash --version
```

これを最新版に差し替えるか、パッチを当てておくほうが良いでしょう。

####new

> ただし、既存のシェルスクリプト等がバージョン間の実装差異の問題で死んでしまう可能性が (わずかですが) あります。注意してください。

```bash:
$ /usr/local/bin/bash --version
4.3.25

$ mkdir bash-3.2-old

$ sudo cp /bin/bash !$

$ sudo cp -v /usr/local/bin/bash /bin
```

古いやつ残しておく場合は、念のため`chmod a-x`した方がいいと思います。

####patch

```bash:
$ mkdir bash-fix

$ cd bash-fix

$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -

$ cd bash-92/bash-3.2

$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0

$ cd ..

$ xcodebuild

$ sudo cp /bin/bash /bin/bash.old

$ sudo cp /bin/sh /bin/sh.old

$ build/Release/bash --version # GNU bash, version 3.2.52(1)-release

$ build/Release/sh --version   # GNU bash, version 3.2.52(1)-release

$ sudo cp build/Release/bash /bin

$ sudo cp build/Release/sh /bin

$ sudo chmod a-x /bin/bash.old /bin/sh.old
```

oss-sec: CVE-2014-6271: remote code execution through bash http://seclists.org/oss-sec/2014/q3/649

security - How do I recompile Bash to avoid the remote exploit CVE-2014-6271? - Ask Different http://apple.stackexchange.com/questions/146849/how-do-i-recompile-bash-to-avoid-the-remote-exploit-cve-2014-6271

###sh

`/bin/sh`も実質、`bash`である可能性があります。調べて、問題があるようなら、パッチを当てるかしたbashをリネームしたりしてください。

```bash:
$ which sh
/bin/sh

$ sh --version
```

##Linux

###yum

```bash:
# yum update bash

# /sbin/ldconfig
```

###pacman

```bash:
# pacman -Sy bash
```



##参考

<a href="http://qiita.com/tukiyo3/items/0b06bd8b41a3cb5491ee" target="_blank">bashの脆弱性によりCGIのshebangの実体がbashの場合、任意のコマンド発行できる件 - Qiita</a>

<a href="http://qiita.com/tomohisaota/items/8a8049eea11ece3781b3" target="_blank">AWS - bash脆弱性への対応 - Qiita</a>

<a href="http://d.hatena.ne.jp/Kango/20140925/1411612246" target="_blank">bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた - piyolog</a>

##追加

<a href="http://d.hatena.ne.jp/nekoruri/20140926/shellshock" target="_blank">ウェブアプリにおけるBash脆弱性の即死条件 #ShellShock - めもおきば</a>

<a href="http://d.hatena.ne.jp/hasegawayosuke/20140926/p1" target="_blank">ファイアウォール内のサーバに対するShellshockを利用した攻撃 - 葉っぱ日記</a>

<a href="http://www.atmarkit.co.jp/ait/articles/1409/26/news071.html" target="_blank">影響範囲はどこまで？：bashにコードインジェクションの脆弱性「Shellshock」、管理者に大きなショック - ＠IT</a>

<a href="http://blog.0day.jp/2014/09/bash-0dayreal-time.html" target="_blank">0day.jp (ゼロデイ.JP): bash 0dayマルウェア感染の「real time」リバースエンジニアリング</a>

<a href="http://moro-archive.hatenablog.com/entry/2014/09/27/200553" target="_blank">bash の脆弱性 "Shell Shock" のめっちゃ細かい話 (CVE-2014-6721) - もろず blog</a>
carton install で DBD::Pgがnot installed 

Centos 6.5でテスト環境をコピー中にDBD::Pgがインストールできなかったのでメモ。

コピー元はgitの管理下にあり、cartonでインストールしたモジュールを含む。
local, cpanfile.snapshotなどは管理対象外。

git cloneでコピーしてきて、carton install すると
DBD::Pgだけインストールできず。

build.logを参照すると、pg_configが見つからない等のエラー。
使用シェルのパスにpg_configのディレクトリを追加して、
再度 carton install すると無事インストール完了。


> export PATH="/usr/pgsql-9.3/bin:$PATH"
Angular.js+GoogleChartToolsでグラフ描画1(円グラフ)



##インストール〜動作確認
####1.npmインストール確認

```
npm -v
```

npmがインストールされていれば、npmのバージョンが表示されます。
もし、npmがインストールされていなければ[こちら](http://qiita.com/koshihikari/items/015d92595fa22a8ee336)を参考にインストールしてください。

####2.LiveReloadインストール
以下のサイトからLiveReloadをChromeにインストールしてください。
https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei

####3.compassのインストール

```
gem install compass
```

####4.yo、gurnt-cli、bowerのインストール

```
npm install -g yo grunt-cli bower
```

####5.generator-webappのインストール

```
npm install -g generator-angular
```

####6.作業用ディレクトリに移動し、angularプロジェクトを作成する

```
yo angular アプリケーション名 --minsafe
```

※--minsafeを付けるとminifyした際にもエラーが起きない。 

####7.Angular.js用のGoogleChartToolsをインストール

```
bower install angular-google-chart --save
```


####8.動作確認
以下のコマンドを実行し、ブラウザに下記の画面が表示されたらインストール成功です。

```
grunt serve
```
![screenshot-127.0.0.1 9000 2014-09-22 14-35-23.png](https://qiita-image-store.s3.amazonaws.com/0/34439/4c5613af-cc11-5c65-4318-2725cdd4325a.png "screenshot-127.0.0.1 9000 2014-09-22 14-35-23.png")


##グラフ挿入


####1.main.html修正
app/views/main.htmlを開き、
\<div class="header">\</div>と\<div class="footer">\</div>以外の
\<div class="jumbotron">\</div>と\<div class="row marketing">\</div>を削除し、
代わりにGoogleChart用のタグを記述します。

```app/views/main.html
<div class="header">
  <ul class="nav nav-pills pull-right">
    <li class="active"><a ng-href="#">Home</a></li>
    <li><a ng-href="#">About</a></li>
    <li><a ng-href="#">Contact</a></li>
  </ul>
  <h3 class="text-muted">angular chart</h3>
</div>


<!-- Google Chart用のタグを記述 -->
<div google-chart chart="testchart">


<div class="footer">
  <p><span class="glyphicon glyphicon-heart"></span> from the Yeoman team</p>
</div>
```



####2.app.js修正
app/scripts/app.jsを開き、
module()の第二引数の配列に'googlechart'を追加します。

```app/scripts/app.js
'use strict';
angular
  .module('chartApp', [
    'ngCookies',
    'ngResource',
    'ngSanitize',
    'ngRoute',


    'googlechart'   // <=追加


  ])
  .config(function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      })
      .otherwise({
        redirectTo: '/'
      });
  });
```


####3.main.js修正
app/scripts/controllers/main.jsを開き、
以下のコードを記述します。

```app/scripts/controllers/main.js
'use strict';
angular.module('chartApp')
  .controller('MainCtrl', function ($scope) {
    $scope.testchart = createChart();
     function createChart() {
          var chart = {};
          chart.type = "PieChart";
          chart.data = [
               ['title', 'val'],
               ['パターンA', 55],
               ['パターンB', 45]
          ];
          return chart;
     }
  });
```

上記の修正を行い、下記の画面が表示されたら成功です。
![screenshot-by-nimbus.png](https://qiita-image-store.s3.amazonaws.com/0/34439/8a635220-1625-28b7-ca2e-cd10c87a144a.png "screenshot-by-nimbus.png")


##リンク
Google Chart Tools AngularJS Directive
http://bouil.github.io/angular-google-chart/#/fat


bouil/angular-google-chart
https://github.com/bouil/angular-google-chart


Plunker(棒グラフ)
http://plnkr.co/edit/3RJ2HS?p=preview

Plunker(円グラフ)
http://plnkr.co/edit/E4iPtQ?p=preview
CoffeeScript での配列走査、`for in` と `for of` の使い分け


CoffeeScript で配列とオブジェクトの走査には `for in`, `for of` を使い分けるのですが、なかなか覚えられなくて毎回ググっているのでメモ。

## 配列には `for in`

```coffeescript
ary = []
for value, index in ary
    console.log index, value

```


## オブジェクトには `for of`

```coffeescript
obj = {}
for key, value of obj
    console.log key, value
```

`for of` だけど、JavaScript にコンパイルしたら `for in` になるところがちょっと解せない。

でも**オブ**ジェクトには**`of`**.... **オブにはオブ**、これで覚えた！

## `for` 後の変数の記述順

- 配列の場合、`for` のあとには `value, index` の順で書く。
- オブジェクトの場合、`for` のあとには `key, value` の順で書く。

`value` が1番目にくるか 2番目にくるかが違うので混乱するが、これは2番目の変数が省略可能になっているのが理由なのかな？

```coffeescript
# 配列: index は省略できる
for value in ary
    console.log value

# オブジェクト: value は省略できる
for key of obj
    console.log key
```

なんとなく納得できた。
bashの脆弱性によりCGIのshebangの実体がbashの場合、任意のコマンド発行できる件

# 参考

* [Blog: bashの脆弱性がヤバすぎる件 – x86-64.jp - くりす研](https://x86-64.jp/blog/CVE-2014-6271)
* [bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた - piyolog](http://d.hatena.ne.jp/Kango/20140925/1411612246?utm_source=dlvr.it&utm_medium=twitter)
* CGIでbash依存している場合まずいようですね。[BASHの脆弱性でCGIスクリプトにアレさせてみました - ブログ - ワルブリックス株式会社](http://www.walbrix.com/jp/blog/2014-09-bash-code-injection.html)

一括でcgiの1行目を確認する方法

```bash:
find . -type f -name "*.cgi" -exec head -n 1 {} \; 2>/dev/null
```

で、/bin/shの実体が/bin/bashの場合、外部からの攻撃を受け兼ねない。

```bash:hoge.cgi
#!/bin/sh
echo 'hoge'
```

# bashのアップデート

```bash:yum
yum update bash
```

```bash:pacman
pacman -Sy bash
```

# 脆弱性のチェック

```bash:
AHO='() { baka; }; echo manuke' bash -c 'echo Hi'
```

と入力し、`manuke`が表示されたら脆弱性の対象。
macosx 10.9.5, centos, archlinuxにて対象を確認。

# 修正後の動作確認

```bash:
$ AHO='() { baka; }; echo manuke' bash -c 'echo Hi'
bash: 警告: AHO: ignoring function definition attempt
bash: `AHO' の関数定義をインポート中にエラーが発生しました
Hi
```

こうでればOK。

# レガシーシステムの場合

```bash:
ls -l /bin/sh
```

を確認し、/bin/bashでなければOK。
/bin/bashの場合、

```bash:
apt-get install dash
unlink /bin/sh && ln -s /bin/dash /bin/sh
```

すればよい。

# CentOS4の場合

* [vagrant - PackerでCentOS4.8のbox作った - Qiita](http://qiita.com/tukiyo3/items/01d3b92dde944c25d2e8)を使ってrpmを作ればよい。
Elasticsearch in OSX クイックスタート


全文検索エンジンElasticsearchを試してみたくていろいろやってたんですが、割とみんな本番環境への構築方法は書いてもローカル構築の方法はあまりみあたらなかったので書いてみました。

## OSX

homebrewで。

```bash
$ brew install elasticsearch
```

これで終わりです。他になにかしたかったですか？　これだけです！

## パス通す

Elasticsearchにはpluginコマンド使ったり、起動にelasticsearchコマンド使うんですけど、その辺パスが通ってないのでリファレンスみただけだと「？」ってなります。通しましょう。

homebrewでいれると「/usr/local/Celler/****」の下にインストールされていくので探します。

「/usr/local/Cellar/elasticsearch/1.3.0/bin」とかがバイナリのパスになってると思います。1.3.0はバージョンによって変わるので適宜読み替えてください。

これを.zshrcや.bashrcとかでパスを通してあげます。全体に通すなら/etc/bashrcとかに書いてもいいですがそこは好みで。

```bash
export ELASTICPATH=/usr/local/Cellar/elasticsearch/1.3.0/bin
export PATH=$PATH:$ELASTICPATH
```

書いたらsourceしましょう。

```bash
source ~/.zshrc
source ~/.bashrc
```

## 設定する

設定ファイルは以下にありました。

 * /usr/local/Cellar/elasticsearch/1.3.0/config/elasticsearch.yml

ログのパス、クラスタ名、ノード名とか設定できるみたいです。この辺りは今回ローカルでしかつかわないんでデフォルトで。必要になったら追記します。詳しいことはまた別記事で。

## プラグインいれる

pluginコマンドでできます。なんかいろいろあるみたいです。
プラグインページは[ここ](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-plugins.html)からいろいろ。

インストールはgitの短縮アドレスを叩くだけでいけるみたい。便利ですね。

```bash
$ plugin --install ******
```

## 起動

起動はelasticsearchコマンドで。

```bash

$ elasticsearch
[2014-09-25 12:23:01,360][INFO ][node                     ] [Veil] version[1.3.0], pid[57072], build[1265b14/2014-07-23T13:46:36Z]
[2014-09-25 12:23:01,361][INFO ][node                     ] [Veil] initializing ...
[2014-09-25 12:23:01,375][INFO ][plugins                  ] [Veil] loaded [analysis-kuromoji], sites []
[2014-09-25 12:23:03,919][INFO ][node                     ] [Veil] initialized
[2014-09-25 12:23:03,920][INFO ][node                     ] [Veil] starting ...
[2014-09-25 12:23:04,013][INFO ][transport                ] [Veil] bound_address {inet[/127.0.0.1:9300]}, publish_address {inet[/127.0.0.1:9300]}
[2014-09-25 12:23:04,047][INFO ][discovery                ] [Veil] elasticsearch_srockstyle/4QyazfZ_RoGQ_vHw1N4fDQ
[2014-09-25 12:23:07,063][INFO ][cluster.service          ] [Veil] new_master [Veil][4QyazfZ_RoGQ_vHw1N4fDQ][srockstyle-no-MacBook-Pro.local][inet[/127.0.0.1:9300]], reason: zen-disco-join (elected_as_master)
[2014-09-25 12:23:07,088][INFO ][http                     ] [Veil] bound_address {inet[/127.0.0.1:9200]}, publish_address {inet[/127.0.0.1:9200]}
[2014-09-25 12:23:07,088][INFO ][node                     ] [Veil] started
[2014-09-25 12:23:07,110][INFO ][gateway                  ] [Veil] recovered [0] indices into cluster_state

```

なんかぞろぞろでてきました。

## アクセスしてみる

みんな大好きcurlコマンドで。

```bash
$ curl -XGET 'http://localhost:9200'
```

これ、コンソールに9300ってでるからそっちかなと思うとエラー大発生したんでなにかとおもったんですが、9200が正解みたいです。

Jsonがもどればオッケーです！

```json
{
  "status" : 200,
  "name" : "Arkady Rossovich",
  "version" : {
    "number" : "1.3.0",
    "build_hash" : "1265b1454eee7725a6918f57415c480028700fb4",
    "build_timestamp" : "2014-07-23T13:46:36Z",
    "build_snapshot" : false,
    "lucene_version" : "4.9"
  },
  "tagline" : "You Know, for Search"
}
```

ではよいElasticsearchライフを！
bashとrbash

linuxサーバで実行コマンドを制限するユーザを作成する時に使います。
セキュリティの件です！
すぐ忘れるのでメモです！

》 ＠IT：特定のコマンドしか実行できないユーザーIDを作成するには http://www.atmarkit.co.jp/flinux/rensai/linuxtips/363rbashuser.html

上の記事の通りです。
詳しくはこのままです。

```bash
% # 環境準備
% # ln -s /bin/bash /bin/rbash
% # /etc/shells にrbash登録
% vi /etc/shells
（省略）
/bin/csh
/bin/ksh
/bin/zsh
/bin/rbash　←この行を追加
% 
```

```bash
% # 制限ユーザ追加
% useradd foo　←fooという専用のユーザーIDを作成
% passwd foo　←fooのパスワードを設定
% sudo - foo
$ chsh
foo のシェルを変更します。
Password:　←パスワードを入力
新しいシェル [/bin/bash]: /bin/rbash　←「/bin/rbash」を入力
シェルを変更しました。
$ exit
% cd /home/foo
% chown root .bash_profile　←.bash_profileの所有者をrootに変更
% chgrp root .bash_profile　←.bash_profileのグループをrootに変更
% chmod 755 .bash_profile　←.bash_profileのアクセス権を変更
% ls -al .bash_profile
-rwxr-xr-x    1 root     root          238 Oct 15 01:31 .bash_profile
% mkdir bin
% #テキストエディタで.bash_profileを開いて、最下行に以下の記述を追加する。
% vi .bash_profile
（省略）
export PATH=/home/foo/bin
%
% # dfコマンドを実行可能にする
% ln -s /bin/df /home/foo/bin/df
```
iOS8 UIAlertViewでdismissViewControllerAnimated:completionするときの注意点

https://devforums.apple.com/message/1034603#1034603

iOS8 UIAlertView を つかって、dismissViewControllerAnimated:completionする場合は、
clickedButtonAtIndexからやるのではなく、didDismissWithButtonIndexからやらないといけない。clickedButtonAtIndexからやると、次にUIAlertViewを出すときにappがcrashする。

取り急ぎのメモ
Redmine をサブディレクトリで運用する際に CSS, JS が読み込まれない現象が発生した場合の解消方法

## 確認する点

* Apache の設定ファイルに ```RackBaseUri = /<サブディレクトリの名称>``` が設定されていること。
* Apache の設定ファイルで Redmine のディレクトリに ```Options FollowSymLinks```, ```AllowOverride all``` が設定されていること。
* ```config/environment.rb``` で ```Redmine::Utils::relative_url_root = "/<サブディレクトリの名称>"``` が正しく設定されていること。

3 つめでハマったのでメモ。
AWS-SDK for RubyからELB直下のインスタンスのpublic DNSを一括取得するには


# AWS-SDK
みなさんAWS-SDK使ってますか？
あれドキュメントたくさんある上にサンプルコードあまりなくてあれですよね。

## Elastic Load Blancerを操作する
ちょいちょいやってるとあの直下にぶら下がっているインスタンス全台に対して処理したいなんてことがでてきたりします。

増えたり減ったりするインスタンスを意識せずにデプロイとか。

## Public DNSの取得

以下でできます。

```ruby
#!/usr/bin/ruby 
require "aws-sdk"
require "pp"

AWS.config(
  access_key_id: '******',
  secret_access_key: '******',
  ec2_endpoint: '[環境に合わせてください]',
  elb_endpoint: '[環境にあわせてください]'
)
elb = AWS::ELB.new.load_balancers['[自分のELB名]']
instances = elb.instances.select {|i| i.exists? && i.status == :running}.map(&:dns_name)

pp instances
```

これでインスタンスの一覧が配列で出てきます。

ppで出した結果はこんな感じ。

```bash
[ "ec2-**-***-***-**.ap-southeast-1.compute.amazonaws.com",
 "ec2-**-***-***-**.ap-southeast-1.compute.amazonaws.com",
 "ec2-**-***-***-**.ap-southeast-1.compute.amazonaws.com",
 "ec2-**-***-***-**.ap-southeast-1.compute.amazonaws.com"]
```

あとはそのままdeploy.rbやserverspecにぶちこんで回せば検証ができると思います。

それではよいAWSライフを！
2進数10進数16進数

# 対応表 #
| 10進数 | 16進数 | 2進数 |
|:------|:-------|:-----|
|  0 | 0x0 | 0000 |
|  1 | 0x1 | 0001 |
|  2 | 0x2 | 0010 |
|  3 | 0x3 | 0011 |
|  4 | 0x4 | 0100 |
|  5 | 0x5 | 0101 |
|  6 | 0x6 | 0110 |
|  7 | 0x7 | 0111 |
|  8 | 0x8 | 1000 |
|  9 | 0x9 | 1001 |
| 10 | 0xA | 1010 |
| 11 | 0xB | 1011 |
| 12 | 0xC | 1100 |
| 13 | 0xD | 1101 |
| 14 | 0xE | 1110 |
| 15 | 0xF | 1111 |


# 下位ビットの取り出し #
| ビット数 | 16進マスク | 2進マスク |
|:------|:-------|:-----|
| 1 | 0x01 | 0000 0001 |
| 2 | 0x03 | 0000 0011 |
| 3 | 0x07 | 0000 0111 |
| 4 | 0x0F | 0000 1111 |
| 5 | 0x1F | 0001 1111 |
| 6 | 0x3F | 0011 1111 |
| 7 | 0x7F | 0111 1111 |
| 8 | 0xFF | 1111 1111 |


# 各ビット単体 #
| 2進数 | 16進数 |
|:----------|:-----|
| 1000 0000 | 0x80 |
| 0100 0000 | 0x40 |
| 0010 0000 | 0x20 |
| 0001 0000 | 0x10 |
| 0000 1000 | 0x08 |
| 0000 0100 | 0x04 |
| 0000 0010 | 0x02 |
| 0000 0001 | 0x01 |
ListView 内 layout の tap を検出

ListView を使って LINE みたいな感じのプロフ画＋メッセージの画面を作った時に、
プロフ画を tap したことを検出したい

OnItemClickListener だと Item 全体を検出してしまう
ListView をいろいろすればとれるとのことだったけどあんまり手を加えずなんとかしたかった

Adapter で item が tap されたときに performItemClick を呼べば良さそう

```
public View getView(int pos, View view, final ViewGroup parent) {
  item.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
         ((ListView) parent).performItemClick(v, pos, R.id.itemId);
     }
  });
}
```
```
listView.setOnItemClickListener(new ItemClickListener() {
    @Override
    public void onItemClick(ViewGroup parent, View view, int pos, long id) {
        Message item = messageListAdapter.getItem(pos);
        switch (view.getId()) {
        case R.id.itemId:
            Toast.makeText(this, "tap!!", Toast.LENGTH_LONG).show();
            break;
        }
    }
});
```
これでとれた

参考
http://tomstay.hatenablog.jp/entry/20110421/1303391426
Titanium Alloy の オレオレ app.tss テンプレート


プロトタイピング的にAlloyでViewをだーっと先に作る事あるじゃないですか。

別に[FLINTO](https://www.flinto.com/)でも[POP](https://popapp.in/)でもいいんですけど、TitaniumerならAlloyで書いちゃった方が合理的なので。

そんな時は app/styles/app.tss に大体のテーマ的な何かを書いておいたりすると捗りますよね。

[Alloy Styles and Themes - Titanium 3.X - Appcelerator Docs](http://docs.appcelerator.com/titanium/3.0/#!/guide/Alloy_Styles_and_Themes)


別にプロトタイピングに限った話では無いですけれど、
個人的に app.tssに必ず書くやつのパターンみたいなのがあるので、纏めてみました。



まずは Window。特にiOSはNavigation BarやらStatus Barやら色々と組み合わせがあって面倒ですけど仕方ない。

```
'Window': {
	backgroundColor: '#ffffff', // 画面背景色
	barColor: "aqua", // ナビゲーションバーの背景色
	tintColor : "red", // 配下のViewの色合いに影響 (TextAreaのキャレット色とか)
	navTintColor : "blue", // 子Windowで戻るのクチバシの色とか
	translucent: false, // NavBarがうっすら透けて下のWindowのNavbarが見えちゃう時にはこれ
}
 
"Window[platform=ios]": {
    statusBarStyle: Ti.UI.iPhone.StatusBar.DEFAULT,
	titleAttributes:  { // NavBarのタイトルのスタイル
		color:'#fff',
		font: {
			fontFamily: "HiraKakuProN-W6", // ヒラギノ角ゴ bold
		},
	}
},
```


Androidはこちら。Window内にTextFieldとかがあるとOpen時にハイライトがあたってソフトキーボードが出ちゃうのを抑制したいので。

```
"Window[platform=android]": {
	windowSoftInputMode: Ti.UI.Android.SOFT_INPUT_STATE_ALWAYS_HIDDEN
}
 
"TabGroup[platform=android]": {
	windowSoftInputMode: Ti.UI.Android.SOFT_INPUT_STATE_ALWAYS_HIDDEN
}
```


Buttonはこちら。 iOS6だとコレを指定しないとデフォルトで角丸の枠有りなボタンになるので。
というかiOS8に対応したらもうiOS6はオワコンみたいなのでもう不要になりますけど。

``` 
"Button": {
	backgroundImage: ''
}
```


ImageViewはコレが無いと、リモートの画像とかがロードされるまで山の絵のやつが出てカッコ悪いので。

``` 
'ImageView': {
	defaultImage: ''
}
```

Androidのズームコントロールは隠したいです。
``` 
'ImageView[platform=android]': {
	enableZoomControls: false
}
```

TableViewとListViewの罫線は左までピッタリになって欲しいって言われる事が多いです。
 
```
"TableView[platform=ios]": {
	separatorInsets: {
		left: 0, right: 0
	}
}
 
"ListView[platform=ios]": {
	separatorInsets: {
		left: 0, right: 0
	}
}
```

あとLabelは色々書くこと多いんですけど、alignとかfontFamilyとかすぐスペル忘れちゃうのでリファレンスも兼ねて書いてます。

``` 
"Label": {
	width: Ti.UI.SIZE,
	height: Ti.UI.SIZE,
	textAlign: Ti.UI.TEXT_ALIGNMENT_CENTER,
	verticalAlign: Ti.UI.TEXT_VERTICAL_ALIGNMENT_CENTER, 
	color: "#000",
	font: {
		fontSize: "14dp",
		fontFamily: "HiraKakuProN-W3", // ヒラギノ角ゴ normal
	}
}
```


gistに纏めてみました。気が向いたらブラッシュアップします。

[app.tss template - Titanium Alloy](https://gist.github.com/tdtsh/93559dce8eecf9f9b9de)
macosでchromeのショートカットアプリケーションを作る

## はじめに

chromeの表示ページを毎度開くのが面倒なので、
スポットライトから一発で開ける用にショートカットを作成する。
作業手順を忘れるのでメモする。
Gmailのショートカットを作る。


## 参考

英語が得意な方はこちらから。

https://www.lessannoyingcrm.com/blog/2010/08/149/Create+application+shortcuts+in+Google+Chrome+on+a+Mac

## 手順

### makeApp.shをダウンロード

```
$ cd /tmp
$ wget https://s3.amazonaws.com/LACRM_blog/makeApp.sh
```

### 念のため権限変更

```
$ chmod 755 makeApp.sh
```

### iconが欲しいので準備

```
$ wget https://www.google.com/a/livesense.co.jp/images/favicon.ico
```

### ショートカットの作成

```
$ sh makeApp.sh

What should the Application be called (no spaces allowed e.g. GCal)?
Gmail
What is the url (e.g. https://www.
google.com/calendar/render)?
https://mail.google.com/mail/#inbox
What is the full path to the icon (e.g. /Users/username/Desktop/icon.png)?
favicon.ico
```

### スポットライト(control + スペース)呼び出し

gmail.appを呼び出し、ログインすることによってGmailが見れることを確認する。
CSSを用いたパンくず

# コード

```html
<style>
	ul.pan {

	}
	ul.pan > li {
		display: inline-block;
		padding: 0px;
		margin: 0px
	}
	ul.pan > li:after {
		padding: 5px;
		content: ">";
	}
	ul.pan > li:last-child:after {
		content: " ";
	}
</style>
<ul class="pan">
<li>home</li>
<li>admin</li>
<li>user</li>
</ul>
```


# 表示形式

home > admin > user
Vagrantのネットワーク処理が異常に遅い場合の解決策


#問題
CentOSで立ち上げたVagrantのインスタンスでネットワーク処理(外部のAPIを叩く等)をしようとすると異常に遅い。
Vagrant以外なら0.5secくらいで終わるものが、5sec以上かかってしまう。


#解決方法

調べたら以下で議論されている不具合だった
https://github.com/mitchellh/vagrant/issues/1172


解決方法としては、Vagrantfileに以下を追記して、Vagrantを再起動したら直った！

**Vagrantfile**

```
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
  end
```
Vagrantで同期フォルダ中の静的ファイルの更新がブラウザアクセスに反映されない

#現象
「ローカルで開発して、その変更をVagrantと同期させ、Vagrant側でapacheを設定してブラウザ確認」という流れの開発を行っている際に、同期が完了(Vagrant側のファイルも変わっている)しているにもかかわらず、ブラウザでアクセスした際にその変更が反映されない。ブラウザキャッシュも削除済み。
直接Vagrantの該当ファイルを書き換えるとようやく反映される。


#解決方法

apacheの設定ファイルの`EnableSendfile`という項目（デフォルトはON）をOFFにする。

今回は、VagrantのDocumentRoot(/var/www/html)以下を、ローカルの開発ディレクトリと共有させていたので、以下のように変更。

```
  <Directory /var/www/html>
      EnableSendfile off 
   </Directory>
```

`EnableSendfile`の詳細な説明は以下リンクで確認できます。

http://httpd.apache.org/docs/2.2/mod/core.html#enablesendfile
VagrantをParallelsで使ってみた

* [Getting Started - Vagrant Parallels Provider Documentation](http://parallels.github.io/vagrant-parallels/docs/getting-started.html)

```bash:plugin
vagrant plugin install vagrant-parallels
```

```bash:init
vagrant init parallels/boot2docker
```

## vagrant up

```bash:
vagrant up --provider=parallels
```

もしくは~/.zshrcに以下追記、読み込んでから`vagrant up`

```bash:~/.zshrc
export VAGRANT_DEFAULT_PROVIDER=parallels
```

## synced_folder

* 参考: [Basic Usage - Synced Folders - Vagrant Documentation](https://docs.vagrantup.com/v2/synced-folders/basic_usage.html)

```diff:Vagrantfile
+ config.vm.network "private_network", ip: "192.168.33.10"
+ config.vm.synced_folder ".", "/vagrant_data", type: "nfs"
```

## 注意点

* Parallels Desktop 10からポートフォワーディング設定に対応。
  * [Parallels/vagrant-parallels](https://github.com/Parallels/vagrant-parallels#features)
* Parallelsの画面はFn+F6で非表示。
* [Parallels Desktop 10 for Mac の新機能](http://www.parallels.com/jp/products/desktop/whats-new/)
moden.ieのparallels用イメージ一括ダウンロード、解凍

```bash:download.sh
#!/bin/sh
CURL="curl -s -O -L"
BASE_URL="https://www.modern.ie/vmdownload?platform=mac&virtPlatform=parallels&browserOS="

# IE11 + windows8.1
${CURL} "${BASE_URL}IE11-Win8.1&parts=4&filename=VMBuild_20140402/Parallels/IE11_Win8.1/Mac/IE11.Win8.1.For.MacParallels.part0{1.sfx,2.rar,3.rar,4.rar}"

# IE10 + windows8
${CURL} "${BASE_URL}IE10-Win8&parts=4&filename=VMBuild_20131127/Parallels/IE10_Win8/IE10.Win8.For.MacParallels.part0{1.sfx,2.rar,3.rar,4.rar}"

# IE11 + windows7
${CURL} "${BASE_URL}IE11-Win7&parts=3&filename=VMBuild_20131127/Parallels/IE11_Win7/IE11.Win7.For.MacParallels.part0{1.sfx,2.rar,3.rar}"

# IE10 + windows7
${CURL} "${BASE_URL}IE10-Win7&parts=3&filename=VMBuild_20131127/Parallels/IE10_Win7/IE10.Win7.For.MacParallels.part0{1.sfx,2.rar,3.rar}"

# IE9 + windows7
${CURL} "${BASE_URL}IE9-Win7&parts=4&filename=VMBuild_20131127/Parallels/IE9_Win7/IE9.Win7.For.MacParallels.part0{1.sfx,2.rar,3.rar,4.rar}"

# IE8 + windows7
${CURL} "${BASE_URL}IE8-Win7&parts=3&filename=VMBuild_20131127/Parallels/IE8_Win7/IE8.Win7.For.MacParallels.part0{1.sfx,2.rar,3.rar}"

# IE7 + windows vista
${CURL} "${BASE_URL}IE7-Vista&parts=3&filename=VMBuild_20131127/Parallels/IE7_Vista/IE7.Vista.For.MacParallels.part0{1.sfx,2.rar,3.rar}"

# IE8 + windows xp
${CURL} "${BASE_URL}IE8-WinXP&parts=2&filename=VMBuild_20131127/Parallels/IE8_WinXP/IE8.WinXP.For.MacParallels.part{1.sfx,2.rar}"

# IE6 + windows xp
${CURL} "${BASE_URL}IE6-WinXP&parts=0&filename=VMBuild_20131127/Parallels/IE6_WinXP/IE6.WinXP.For.MacParallels.sfx"

for sfx in *.sfx
do
  unrar x $sfx
done
```


* 90日間の試用期限が過ぎたwindowsは、起動して1時間後にシャットダウンされる。
* 30日で警告が出る。コマンドプロンプトから`slmgr –rearm`で警告削除。
[Unity] ひとつのPass内で複数のライトを使う


まだちょっとしっかりと理解できていませんが、[こちらの記事（Light calculations inside Unity's CG shader）](http://www.geekyhamster.com/2013/04/lighting-calculations-inside-unitys-cg.html)を参考にさせて頂きました。

## `"LightMode"="Vertex"`を使う

Tagsに`"LightMode"="Vertex"`を指定することで、複数ライトがある場合に、それぞれのライトの位置や色にアクセスできるようになります。


## ライトの位置と色を取得する

ライトの位置と色は`unity_LightPosition[n]`と`unity_LightColor[n]`でアクセスできます。
複数ある場合は配列になっているので適宜添字を使ってアクセスします。


### 注意点

ひとつだけ注意点があります。
通常、ライトの位置は`_WorldSpaceLightPos0`で取得するかと思いますが、上記の場合はワールド空間上ではなく、どうやらビュー座標空間としての位置となります。なので計算する際は注意が必要です。
（位置をそのまま色として出力してみると、視点移動するだけで色が変わるのが分かります）


### 位置を計算する

ビュー座標系なので計算しやすいように座標変換します。
Directional lightとそれ以外で若干、計算が異ります。

```Cg
if(unity_LightPosition[0].w == 0.0) { // `w`が0の場合はDirectional light.
	float3 lightPos = normalize(mul(unity_LightPosition[0], UNITY_MATRIX_IT_MV).xyz);
}
else { // それ以外はSpot lightかPoint light.
	float3 lightPos = normalize(mul(unity_LightPosition[0], UNITY_MATRIX_IT_MV).xyz - vertex.xyz);
}
```

Directional lightの場合は「どの方向から来ているか」の値が入っています。
なので光の方向が仮に`0, -1, 0`（地面が垂直に照らされている）の場合は、変数には`0, 1, 0`という値が入ります。
ライトの位置に関係なく、ライトの方向（パラメータ的にはrotation）で決まります。

一方、それ以外のライトに関しては変数名通り位置が入っています。
座標変換でローカル座標空間に変換した上で、自身の頂点位置との差分を取って方向を計算します。


## スポットライトなどの情報を得る

スポットライトやポイントライトは、その位置だけでなく、範囲や角度などライティングに必要なデータがあります。
そうしたデータについては[こちらの記事（Cg Programming/Unity/Light Attenuation）](http://en.m.wikibooks.org/wiki/Cg_Programming/Unity/Light_Attenuation)が参考になります。

`_LightTextureB0`や`_LightMatrix0`などを使って必要な情報を得るようです。
railsでbad interpreter: No such file or directoryエラー

OSXにて、普通に

```bash
sudo gem install rails
```

で、railsをインストールして成功したのに、いざ、

```bash
rails -v
```

で、

```bash
-bash: /opt/local/bin/rails: /opt/local/bin/ruby: bad interpreter: No such file or directory
```

となった。

```bash
which rails
/opt/local/bin/rails

which ruby
/usr/bin/ruby

ls -F /opt/local/bin/rails
/opt/local/bin/rails*
```

どうも、このrailsは/opt/local/binのrubyを探しに行っちゃって、ない、ってことを言ってるようだ。
というわけで、

```bash
sudo ln -s /usr/bin/ruby /opt/local/bin/ruby
```

としてみると、

```bash
/opt/local/bin/rails -v
Rails 4.1.6
```

動いた。
ssh-copy-idで公開鍵をリモートホストへ登録する


## はじめに

ssh-copy-idを利用して、公開鍵をリモートホストへ登録する方法を記述します。

## 環境

* CentOS 6.5
* openssh 5.3p1

## 動作確認

* 認証用の鍵を生成します。

```shell
$ ssh-keygen
$ ls -la ~/.ssh
drwx------. 2 admin admin 4096 Sep 25 04:39 .
drwx------. 4 admin admin 4096 Sep 25 04:29 ..
-rw-------. 1 admin admin 1675 Sep 25 04:39 id_rsa
-rw-r--r--. 1 admin admin  403 Sep 25 04:39 id_rsa.pub
-rw-r--r--. 1 admin admin  412 Sep 25 04:29 known_hosts
```

* ssh-copy-idでリモートホストへ公開鍵を登録します。

```shell
$ ssh remote-host ls -la ~
drwx------. 2 admin admin      4096 Sep 25 04:31 .
drwxr-xr-x. 3 root  root       4096 Sep 10 22:42 ..
-rw-------. 1 admin admin      7763 Sep 25 04:31 .bash_history
-rw-r--r--. 1 admin admin        18 Jul 18  2013 .bash_logout
-rw-r--r--. 1 admin admin       176 Jul 18  2013 .bash_profile
-rw-r--r--. 1 admin admin       124 Jul 18  2013 .bashrc

$ ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host
Now try logging into the machine, with "ssh 'remote-host'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
```
* リモートホスト側の状態を確認します。

```shell
$ ssh remote-host ls -la ~
drwx------. 3 admin admin      4096 Sep 25 04:43 .
drwxr-xr-x. 3 root  root       4096 Sep 10 22:42 ..
-rw-------. 1 admin admin      7763 Sep 25 04:31 .bash_history
-rw-r--r--. 1 admin admin        18 Jul 18  2013 .bash_logout
-rw-r--r--. 1 admin admin       176 Jul 18  2013 .bash_profile
-rw-r--r--. 1 admin admin       124 Jul 18  2013 .bashrc
drwx------. 2 admin admin      4096 Sep 25 04:43 .ssh

$ ssh remote-host ls -l ~/.ssh
-rw-------. 1 admin admin 403 Sep 25 04:43 authorized_keys
```

* リモートホスト側に登録された公開鍵とローカルホストの公開鍵を比較してみます。

```shell
$ ssh remote-host cat ~/.ssh/authorized_keys | diff - ~/.ssh/id_rsa.pub
※ (出力なし)
```

## 参考

* [SSH-COPY-ID](http://porklips.org/cgi-bin/man/man2html?ssh-copy-id+1)
* [SSH-KEYGEN (1)](http://www.unixuser.org/~euske/doc/openssh/jman/ssh-keygen.html)
Forge1.7.10Moddingメモ－CoremodsとFMLModを同じJarパッケージにまとめて読み込ませる方法

#CoremodsとFMLModを同じJarパッケージにまとめて読み込ませる方法
+ この記事はあくまで個人的なメモです。
+ 読みにくいかもしれませんが、仕様です。
+ 当方知識不足なため詳細なことは書かれてません。悪しからず。

##概要
Minecraft1.7.10のForge(10.13.0.1180)にて既存書き換えMod(以下CoreMod)及びFMLを用いた通常Mod(以下FMLMod)を1つのjarファイルにまとめる方法。

##前提
この説明では以下のソースファイルが存在すると仮定します。
ここではCoreMod,FMLMod共に解説はしません。

```ruby:CoreMod
TestCorePlugin.java .......'CoreModのメインクラス'
TestModContainer.java(任意) .....'Mod情報(?)を格納するクラス。FMLModで言うmcmod.info'
TestTransformer.java ......'既存クラスを改変するクラス'
ModelCreeper.java(任意) ...'置換クラス。ここでは、クラス自体を
置き換えるCoreModとします'
```

```ruby:FMLMod
TestMod.java ...'@Modを含んだ、FMLModのメインクラス'
mcmod.info .....'Mod情報を記入するファイル'
```

##jarにまとめる前の注意点
+ ~~CoreModとFMLModとでModIdをそれぞれ別々に定義する必要がある。~~CoreModサイドでMod情報を定義しなければ問題ありませんでした。[詳細](#coremodでmod情報を定義したくない場合は)
+ CoreModとFMLModのメインクラスをそれぞれ別パッケージに配置する必要がある。

>(例)
test/asm/TestCorePlugin.java
test/fml/TestMod.java

##CoreModでMod情報を定義したくない場合は
単に`IFMLLoadingPlugin`クラスを実装したクラスのメソッド`getModContainerClass()`の戻り値を`null`にするだけ。

```java:TestCorePlugin.class
public String getModContainerClass() {
    return null;
}
```

##パッケージのまとめ方
###MANIFEST.MFの記述例
通常のCoreModの場合、Manifestバージョンと`FMLCorePlugin`のみを下記のように記述します。
`FMLCorePlugin`の値には、CoreModとして読み込ませる為のメインクラス(ここではTestCorePluginクラス)をパッケージに沿って記入します。

```ruby:MANIFEST.MF
Manifest-Version: 1.0
FMLCorePlugin: test.asm.TestCorePlugin
```

上記に`FMLCorePluginContainsFMLMod`節を追加することにより、FMLModを読み込ませることが出来ます。
`FMLCorePluginContainsFMLMod`にはFMLModのメインクラス(@Modのあるクラス。ここではTestModクラス)を記入します。

```ruby:MANIFEST.MF
Manifest-Version: 1.0
FMLCorePlugin: test.asm.TestCorePlugin
FMLCorePluginContainsFMLMod: test.fml.TestMod
```

###jarパッケージのまとめ方
jarパッケージのまとめ方は以下のようになります。

__test.jar__

* test
  + asm
     - TestCorePlugin.class
     - TestModContainer.class
     - TestTransformer.class
  + fml
     - TestMod.class
* META-INF
  + MANIFEST.MF
* ModelCreeper.class
* mcmod.info

##参考元リンク
この記事で参考になったサイトです。
[Coremodsの基礎](http://minecraftjp.info/modding/index.php/Coremods%E3%81%AE%E5%9F%BA%E7%A4%8E)
2014/09/24に発表されたBash脆弱性と解決法(RedHat系、9/26更新)

**2014/09/26更新:**
本日新たに公開された再修正版を適用するように、情報を更新しました。恐らく、24日のは暫定対応版で今回のリリースが正式対応版だと思います。緊急性については前回のレベルほど高くありません（が、前回の作業を行っていない場合は急ぎましょう）。

# Bash使い(特にBashのCGIスクリプト書いてる人)は一刻を争うべき

[2014/09/24に発表されてたBash脆弱性](https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/)。

上記サイトに概要が書いてありますが、何が一番ヤバいかと言えば**Bashで書いたCGIスクリプトを動かしているサーバー**だと私は思います。

詳しくは書きませんが、**telnetコマンドで簡単に悪意のあるコードを仕込めました。**悪意あるコードが、`rm`コマンドだったりしたら。取り返しが付きません。

# 解決法(RedHat、CentOS等)

`yum`コマンドや`rpm`コマンドでパッケージ管理をしているRedHat系（CentOSも）での解決方法を記します。

情報源:
1. [Resolution for Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271) in Red Hat Enterprise Linux](https://access.redhat.com/solutions/1207723)
2. [2014/09/26追加情報](https://rhn.redhat.com/errata/RHSA-2014-1306.html)

## yumコマンドが使える場合

下記の2つのコマンドを実行すれば直せるそうです。

```shell-session:
# yum update bash
```

この時、**更新後のBashのバージョンが次項のrpmで行うための表に書いたバージョン以降になっていること**を確認してください。（CentOSの場合。本家RedHatの場合は[こちら](https://rhn.redhat.com/errata/RHSA-2014-1306.html)から使用している製品のバージョンを確認）

<del>また、2番目の`/sbin/ldconfig`に関しては、再起動ができないホスト向けの代替措置であり、できればシステム再起動が望ましいとのことのようです。</del>

## yumは使えないがrpmコマンドなら使える場合

既に修正済rpmパッケージが出ています。

下記は一応CentOS用のものであり、本家RedHat用のものは[Red Hat Network](https://www.redhat.com/wapps/sso/login.html)にログインして取得するようです。

| CPU＼OS ver. | 5                                                                                                                         | 6                                                                                                                               | 7                                                                                                                               |
|--------------|---------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|
| i386         | [bash-3.2-33.el5_10.4.i386.rpm](http://ftp.riken.jp/Linux/centos/5/updates/i386/RPMS/bash-3.2-33.el5_10.4.i386.rpm)       | [bash-4.1.2-15.el6_5.2.i686.rpm](http://ftp.riken.jp/Linux/centos/6/updates/i386/Packages/bash-4.1.2-15.el6_5.2.i686.rpm)       | (なし)                                                                                                                          |
| x86_64       | [bash-3.2-33.el5_10.4.x86_64.rpm](http://ftp.riken.jp/Linux/centos/5/updates/x86_64/RPMS/bash-3.2-33.el5_10.4.x86_64.rpm) | [bash-4.1.2-15.el6_5.2.x86_64.rpm](http://ftp.riken.jp/Linux/centos/6/updates/x86_64/Packages/bash-4.1.2-15.el6_5.2.x86_64.rpm) | [bash-4.2.45-5.el7_0.4.x86_64.rpm](http://ftp.riken.jp/Linux/centos/7/updates/x86_64/Packages/bash-4.2.45-5.el7_0.4.x86_64.rpm) |

運用している環境に該当するパッケージを取得して、下記のように`rpm`<del>して`/sbin/ldconfig`</del>すれば完了です。<del>（ただし、これもldconfigよりはシステム再起動の方が望ましいでしょう）</del>

```shell-session
# wget <上記のrpm>
# rpm -Uvh <上記のrpm>
```
コマンドの出力をそのままcurlでPOSTする


man page にこのように書いてある。

```
To read content from stdin instead of a file, use - as the filename. This goes for both @ and < constructs.
```

curlでファイル名を指定するのは `--data @file` のようにするので、ファイル名部分を `-` にするということは `--data @-` にするということだそうな。

`--data` だと改行がなくなってしまうので、`--data-binary` にすると標準出力そのまま送信できる。

```bash
echo "foo\nbar\nbaz" | curl --data-binary @- 'http://localhost:6666/'
```

どういうデータが送信されているかを見るにはncコマンドが便利

* http://blog.livedoor.jp/sonots/archives/34703829.html


これで立ち上げておいて、

```bash
nc -l 6666
```

上のcurlコマンドを実行するとこのように出る。

```
POST / HTTP/1.1
User-Agent: curl/7.30.0
Host: localhost:6666
Accept: */*
Content-Length: 12
Content-Type: application/x-www-form-urlencoded

foo
bar
baz
```

`--data` だと改行されていないのはこれで見つけた。
IMEを切り替える方法

Ubuntuでibus 1.5が入ってるよ(`sudo apt-get install ibus-mozc`したよ)というごく普通の環境を想定します．

普通はIMEを切り替えるには半角/全角キーを押したり，Alt + ` を押したりします．

これをコンソールから実行してやることが出来ます．

```bash
ibus engine 'mozc-jp' # 日本語入力に切り替え
ibus engine 'xkb:us::eng' # 英語配列の英語入力に切り替え
```

`ibus`コマンドの2つ目の引数に指定するべき値は，

```bash
ibus list-engine
```

で調べることが出来ます．

こんなことして何が嬉しいのかというと，Vimでインサートモードから抜けてノーマルモードに戻った時に，勝手に日本語入力をオフにしてて欲しいというのが実現出来るのです．mozc側の設定でEsc押したらIMEをオフにするってのもあるみたいなんですが，どうもそっちが上手く行かなかったので今はとりあえず自分はこのようなアプローチを取ることにしました．

ちなみにそのための`.vimrc`の設定は以下の通りです．

```vim
call system('type ibus')
if v:shell_error == 0
  inoremap <Esc> <Esc>:call system('ibus engine "xkb:us::eng"')<CR>
endif
```

まず`type ibus`を実行して`ibus`コマンドの有無を確かめます．

なければ`v:shell_error`が 0 以外に，あれば 0 になっているはずなのでそれで条件分岐して`inoremap`で`<Esc>`を`<Esc>:call system('ibus engine "xkb:us::eng"')<CR>`に変えてやる感じです．

これもうちょっと頑張れば，IMEの状態を覚えさせておいて，再度インサートモードに入った時にIMEの状態を復元する，とか出来るはずなんですよね．事実そういうのを出来るようにしてるブログのエントリとかをこれ調べてるときに見かけました．

## References

* [im_control.vim - 外部コマンドによるIM制御の準備 - fudist](https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-japanese/ime-control/xvkbd)

ここを参考にしながら，

1. `IMCtrl`って関数便利やなこれ
2. `<Esc>`を`<Esc>:call IMCtrl(...)<CR>`にしてやったらええんちゃうか？
3. `xvkbd`とか`xdotool`とかせんでも直接iBus制御する方法あるんちゃうか？
4. `IMCtrl`経由せずに`system('ibus engine ...')`って直接呼んでやったらええんちゃうか？

と紆余曲折をここ数日してました．
New Features in Picasso

Squareが開発している画像ライブラリのPicassoは今や有名ですが，次期リリースに乗る予定の新機能について，[Lucas Rochaがブログを書いていた](http://lucasr.org/2014/09/23/new-features-in-picasso/)ので要約しました。
これらの機能は全てmasterにマージされているので2.4でのリリースが濃厚です。

### Request Handlers

Picassoは、単純なリソースからコンテントプロバイダ、ネットワークなど，多くの画像の読み込みをサポートしています。しかし、時にはデフォルトでサポートされていない方法で画像を読み込みたい時もあります。 
そういった用途の為にRequest Handlersという機能が追加されました。RequestHanlderを継承して2つのメソッドをオーバーライドします。

```java
public class PonyRequestHandler extends RequestHandler {
    private static final String PONY_SCHEME = "pony";

    @Override public boolean canHandleRequest(Request data) {
        return PONY_SCHEME.equals(data.uri.getScheme());
    }

    @Override public Result load(Request data) {
         return new Result(somePonyBitmap, MEMORY);
    }
}
```

実装したクラスをPicassoの初期化時に渡します。

```java
Picasso picasso = new Picasso.Builder(context)
    .addRequestHandler(new PonyHandler())
    .build();
```

すると，以下の様なカスタムスキーマの画像を読み込む事が可能になります。

```java
picasso.load("pony://somePonyName")
       .into(someImageView)
```

必要であればビルトインのRequestHandlerを書き換える事も可能になるようです。

### Request Management

Picassoはビューリサイクリングを扱っていますが，非効率な方法です。
例えば，ListViewを勢い良く操作した場合，ユーザーのインタラクションに合わせてリクエストを停止/再開する方法がないので，Picassoはリクエストの発火とキャンセルをそのままにします。

新しいRequest Management APIはタグを用いてリクエストを管理する事を可能にします。特定のタグに関連付けられたリクエストの停止/再開をする事ができるようになります。

```java
Picasso.with(context)
       .load("http://example.com/image.jpg")
       .tag(someTag)
       .into(someImageView)
```

これによってタグに関連付いた（ListViewのscroll状態など）リクエストの停止/再開が可能になります。例えば，Picassoのサンプルアプリは以下の様なスクロールリスナーを持つようになりました。

```java
public class SampleScrollListener implements AbsListView.OnScrollListener {
    ...
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        Picasso picasso = Picasso.with(context);
        if (scrollState == SCROLL_STATE_IDLE ||
            scrollState == SCROLL_STATE_TOUCH_SCROLL) {
            picasso.resumeTag(someTag);
        } else {
            picasso.pauseTag(someTag);
        }
    }
    ...
}
```

Request Management APIは画像のリクエストに関して素晴らしい制御を提供します。スクロールリスナーは極々標準的な使い方の1つに過ぎません。

### Request Priorities

UIで画像毎に優先度を付けたいというのはよくあるケースだと思います。例えば，同じ画面内の他のセカンダリ·イメージに関連した，大きなヒーローの画像に高い優先順位を与えたいとか！
これまでは画像間の相対的な優先度についてPicassoに通知する方法はありませんでした。が，priority APIは、リクエストの優先度についてPicassoへの通知を可能にします。

```java
Picasso.with(context)
       .load("http://example.com/image.jpg")
       .priority(HIGH)
       .into(someImageView);
```

priorityは特定の順序を保証するものではありません，優先度の高いリクエストの方にバランスを傾けるだけです。

これらの新機能を利用したい場合は，GitHubから最新のコードを取得してください。
PSGetのインストールワンライナー

PowerShellに関してだけであれば、chocolateyよりpsgetの方が便利。
[PsGet - PowerShell Modules Directory - Get started](http://psget.net/)

公式サイトにはインストール用のワンライナーが書いてあるけれど、

```ps1
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex
```

今時はこっちの方がカッコいいんじゃないかな。

```ps1
iwr "http://psget.net/GetPsGet.ps1" | iex
```

iwrはInvoke-WebRequestのエイリアスで、PowerShell3系から入ったcurlっぽいコマンドレットです。

[Invoke-WebRequest](http://technet.microsoft.com/en-us/library/hh849901.aspx)
SublimeTextのsublime-settingsファイル読み込み順について


SublimeTextがsettingファイルを読む時、

1. Packages/Default/Preferences.sublime-settings
1. Packages/Default/Preferences (OSX).sublime-settings
1. Packages/User/Preferences.sublime-settings
1. Packages/Python/Python.sublime-settings
1. Packages/User/Python.sublime-settings
1. Session data for the current file
1. Auto adjusted settings

の順番で読み込まれて設定がオーバーライトされる。

基本的なプラグインのDefaultの設定は
`Packages/PackageA/PackageA.sublime-settings`
に書かれていて、ユーザが後から設定する場合は以下のファイルに設定を書かせる様にしている。
`Packages/User/PackageA.sublime-settings`
コマンドラインからiOSアプリをビルドするMakefileテンプレ


xcodeを一切起動することなく、
コマンドラインからのみビルドできます。
もちろん、xcodeを起動していも整合性は維持しており
case by case でどちからでもビルドできます。

-

```Makefile
PROJECT = @ここにプロジェクト名@.xcodeproj
SCHEME = @ここにスキーム名@

# RELEASE or DEBUG を選択します
BUILD_CONFIG = $(RELEASE)


DEST = 'platform=iOS Simulator,name=iPhone Retina (4-inch)'
XC = xcodebuild -scheme $(SCHEME) -destination $(DEST) -configuration 
DEBUG = Debug
RELEASE = Release

# -----------------------------------------------------
# BUILD_CONFIG 設定次第のビルド
all: 
	$(XC) $(BUILD_CONFIG)

# BUILD_CONFIG 設定次第のクリーン
clean:
	$(XC) $(BUILD_CONFIG) clean

# -----------------------------------------------------
# 明示的なリリースビルド
release:
	$(XC) $(RELEASE)

# 明示的なリリースクリーン
clean_release:
	$(XC) $(RELEASE) clean

# -----------------------------------------------------
# 明示的なデバッグビルド
debug:
	$(XC) $(DEBUG)

# 明示的なデバッグクリーン
clean_debug:
	$(XC) $(DEBUG) clean

```

make run でシミュレータの起動もTryするものの、
なかなかいい方法が見つかりませんでした。
ご存知な方はお知らせください。
Javaのアノテーションを学んでみたの巻


# アノテーション

## アノテーションとは

Wikipedia抜粋

```
Javaのアノテーションは、クラスやメソッド、パッケージに対してメタデータとして注釈を記入する。
```

らしい。

## アノテーションの種類

Javaのアノテーションは大きく分けると3つに分類される

* マーカーアノテーション  
文字通り目印レベルの役割を果たすアノテーション、Javaでよく使われるアノテーションとして@Overrideや@Deprecatedなどがある
* 単一値アノテーション  
1つのデータを持つアノテーション
* フルアノテーション  
少なくとも2以上のデータを持つアノテーション

## メタアノテーション

アノテーションを作るに当たってのアノテーションがあって、以下の定義を付加することで独自のアノテーションを定義することができる

* @Retention  
アノテーションの保持ルールを決める
* @Target  
アノテーションが利用可能なプログラム要素を定義する
* @Inherited  
アノテーションを付加した対象が継承後も付加された状態にしたい場合にこれを付加する

## 独自アノテーション定義

### マーカーアノテーション

眠たいときに見てはいけないコードのアノテーション

定義

```Java
public @interface Sleepy { }
```

使用例

```Java
public class Work {
    @Sleepy
    public void meeting() {
		System.out.println("...zzz");
    }
}
```

### 単一値アノテーション

出身県を表すアノテーション

定義

```Java
public @interface NativePrefecture {
	String value();
}
```

使用例

```Java
@NativePrefecture("大阪府")
public String getMessage(){
	return "なんでやねん";
}
```

### フルアノテーション


定義

```Java
public @interface NativePrefecture {
	String value();
	Int jisCode();
}
```
pandas で日経平均株価指数を plot する

何をするのか
==========
Python のデータ処理ライブラリ pandas (http://pandas.pydata.org/) で遊んでいたら、

1. Web から Finance 情報を取ってくる
2. プロットする

というのがコードだけでできてすばらしかったので投稿。


コードと解説
=========

```py
import pandas.io.data as web
import matplotlib.pyplot as plt
import datetime

# 取得する日の範囲を指定する
start = datetime.datetime(2014, 1, 1)
end = datetime.datetime(2014, 9, 1)

# Yahoo ファイナンスから、 ^N225 (日経平均株価指数) を
# とってくる。
f = web.DataReader('^N225', 'yahoo', start, end)

plt.title('Nikkei 255 from 2014.1.1 to 2014.9.1')

# fill_between でその日の最高値と最低値をプロットする
plt.fill_between(f.index, f['Low'], f['High'], color="b", alpha=0.2)

# plot で、始値をプロットする。
# 自動的に Index が Date になっているので、横軸が時間になる。

f['Open'].plot()
print f[:10]
plt.show()
```

実行結果
======

pandas の DataFrame オブジェクトはこんな風に
表としてデータが保持される。

```text
                Open      High       Low     Close  Volume  Adj Close
Date                                                                 
2014-01-06  16147.54  16164.01  15864.44  15908.88  192700   15908.88
2014-01-07  15835.41  15935.37  15784.25  15814.37  165900   15814.37
2014-01-08  15943.68  16121.45  15906.57  16121.45  206700   16121.45
2014-01-09  16002.88  16004.56  15838.44  15880.33  217400   15880.33
2014-01-10  15785.15  15922.14  15754.70  15912.06  237500   15912.06
2014-01-13  15912.06  15912.06  15912.06  15912.06       0   15912.06
2014-01-14  15657.20  15661.71  15383.69  15422.40  214500   15422.40
2014-01-15  15649.07  15808.73  15636.57  15808.73  185800   15808.73
2014-01-16  15845.15  15941.08  15710.14  15747.20  214200   15747.20
2014-01-17  15695.46  15783.37  15621.80  15734.46  180100   15734.46
```

プロット結果はこちら。
![nikkei.png](https://qiita-image-store.s3.amazonaws.com/0/29984/9e0b44ea-5a12-1667-4263-979171b297f7.png)


ちなみに
======
`^N225` を `AAPL` にすると Apple の株価が得られたりする。
日本の市場のアクセス API はまだ無いようだ。
【Android】Terminalから端末時間を変更する - adb shell date

Androidで端末の時間をTerminal等から設定する場合、**adb shell date**を使うとよい。
使い方は以下のような感じ。
※コマンド実行は可能ですが、Root化しないと時間が変更されないかも
→裏付け調査しました。[【Android】adb shell date は System User or radio Groupじゃないと反映されない](http://qiita.com/operandoOS/items/61bbbed2568e27a6ee4e)

## adb shell date
```
adb shell date -s YYYYMMDD.hhmmss
```
※YYYYMMDD:年月日 hhmmss:時分秒

簡単にPCの時間と合わせられるように、Linux/MacとWindows用のコマンドを作ってみた。

## Linux/Mac
```
adb shell date -s $(date +"%Y%m%d.%H%M%S")
```

## Windows
```
adb shell date -s %date:~0,4%%date:~5,2%%date:~8,2%.%time:~0,2%%time:~3,2%%time:~6,2%
```

という感じ。

検証端末とか時間がおかしい端末を、一々設定開かなくても直せちゃうよ－。という利点。
後はAlarm等のテストをしたい時も、無理矢理時間変更したりするからオススメかなー。
clojure から java 呼び出し

clojureにはJava呼び出しのための糖衣構文がある。
例えば以下の２つの呼び出し方。

```clj:time
(let [x (. System currentTimeMillis) 
      y (System/currentTimeMillis)]
  )
```

糖衣構文は他にもなんやかんやあるっぽい。

ちょっと年月日を取得してみる。

```clj:calendar
(import java.util.Calendar)
(let [calendar (Calendar/getInstance)]
  (str "year: " (.get calendar Calendar/YEAR) 
       " month: " (+ 1 (.get calendar Calendar/MONTH))
       " date: " (.get calendar Calendar/DATE)))
```
Androidでよく書く基本的な記述集(その１)

今回はActivity間で必要となってくる基本的な記述について集めました。

#Activityを起動したい
```java:MainActivity
Intent intent = new Intent(this, NextActivity.class);//第２引数に移動したいActivity
startActivity(intent);
```
startActivity()メソッドにintentを渡してIntentのコンストラクタに渡したActivityを起動する。

```java:MainActivity
Intent intent = new Intent(this, NextActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);引数に起動方法を指定
startActivity(intent);
```
setFlags()メソッドを使えば起動時にどのような振る舞いを行うか指定できます。
Intent.FLAG_ACTIVITY_NO_HISTORYの場合、履歴にスタックせずに次のアクティビティを起動できる。

#他のActivityを起動するときに値を渡したい
現在のActivity

```java:MainActivity
String value = "value";
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("KEY", value);//第一引数key、第二引数渡したい値
startActivity(intent);
```

受け取り側のActivity

```java:NextActivity
Intent intent = getIntent();
String value = intent.getStringExtra("KEY");//設定したkeyで取り出す
```
putExtraメソッドはプリミティブ型およびString型なら渡すことが可能。
また、SerializeしたクラスおよびParcerableしたクラスも可能。

渡すときはputExtra()のメソッドのみだが取り出す際は
int型ならgetIntExtra("");
String型ならgetStringExtra("");
のように型に対応したメソッドを呼び出す。

#どのActivityからも自由に値を参照したい
Applicationクラスを使います。
Applicationクラスを使うとアプリケーション内でデータの共有が可能。
このクラスはアプリ起動と同時に作成され動作する。
イメージとしてはどこからでも参照できる最上位のメモリ領域を確保している感じ。

Applicationを継承したクラスを作成する。

```java:MyApplication
public class MyApplication extends Application{
    private String value = "";
    @Override
    public void onCreate() {
        //アプリケーションクラス作成時
    }
    public String getValue(){
        return this.value;
    }
    public void setValue(String value){
        this.value = value
    }
}
```

applicationの属性に作成したクラス名を記述。

```xml:AndroidManifest.xml
//applicationの属性にandroid:name="アプリケーションのクラス名"を記述
<application android:name="com.example.MyApplication"
    android:icon="@drawable/icon" android:label="@string/app_name">
```

使うときは


```java:MainActivity
MyApplication mApp = (MyApplication) this.getApplication();
mApp.setValue("value");//valueをセット
```

```java:NextActivity
MyApplication mApp = (MyApplication) this.getApplication();
mApp.getValue();//valueを取得
```


次回も基本的な記述について集めたいと思います。
Gitlabでチーム専用のGithubを構築する。


## はじめに
今回は、ubuntu14.04にgitlab7.3をインストールしました。
最後にも書いてますが、メモリは1GB必要です。

## インストール

基本的に、[公式サイトのDLページ](https://about.gitlab.com/downloads/)でubuntu14.04を選択して、表示される手順に従っていくだけです。

まずは、もろもろダウンロードとインストール

```
$ wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.3.0-omnibus-1_amd64.deb
$ sudo apt-get install openssh-server
$ sudo apt-get install postfix
$ sudo dpkg -i gitlab_7.3.0-omnibus-1_amd64.deb
```

次に、configファイルで設定を書く。

```
$ sudo -e /etc/gitlab/gitlab.rb
```

このコマンドからだと、nanoというエディタが開きます。
私は、よくわからないので、viで編集しました。

```
$ sudo vi /etc/gitlab/gitlab.rb
```

いろいろ設定できますが、最低限URLのアドレスさえ書いとけば、問題ないと思います。

``` /etc/gitlab/gitlab.rb
external_url 'http://hogehoge.com'
```

設定を反映するために、

```
$ sudo gitlab-ctl reconfigure
```

とコマンドを打つと反映され、自動的に起動されます。
どうやら、一度シャットダウンしても自動的に起動されるようです。

ブラウザで設定したURL( http://hogehoge.com )にアクセスすると、gitlabのページがみれるはずです。

id/passは公式サイトに書いてある通りです。

Username: root 
Password: 5iveL!fe


### コマンド

基本的に、`gitlab-ctl`を使うようです。

- gitlab-ctl start : 起動
- gitlab-ctl stop : 停止
- gitlab-ctl restart : 再起動
- gitlab-ctl reconfigure : 設定ファイルを反映

など

- gitlab-ctl help : 他のコマンド

## つまづいたとこ

いざ、ブラウザにアクセスすると、502エラーが出ました。

調べると、どうやらメモリ不足でうまく起動してないみたいです。

公式サイトにも要件としてメモリ1GBって書いてあるらしいです。（らしいというは、ちゃんと英語を読めてない）
今回使った環境では、512MBしかつんでなかったです。

インストールは自体はうまくいるみたいなので、メモリをなんとかします。swapファイルを作成して、仮想メモリで補いました。

### swapファイル作成

以下の手順で、1Gの仮想メモリを/swapfileに作成しました。
（2016.1.21追記）別の環境で試したところ1Gだとうまくいかず、4Gにするとうまくいきました。
http://askubuntu.com/questions/566745/allocate-swap-after-ubuntu-14-04-lts-installation


```
$ sudo dd if=/dev/zero of=/swapfile bs=1G count=1
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo vi /etc/fstab
```

``` /etc/fstab
/swapfile none swap defaults 0 0
```

再度、ブラウザにアクセスすると、ちゃんと起動していました。

どれくらいメモリをつかってるか調べたところ、だいたい物理メモリ400MB、仮想メモリ500MB使ってました。

# 参考URL
- https://about.gitlab.com/ : 公式サイト
- http://dogmap.jp/2014/03/28/gitlab/
- http://linuxsalad.blogspot.jp/2009/05/swap.html
railsでデータを登録、更新したユーザーの情報がほしい

#やりたいこと

データを登録した人、更新した人の情報がほしい

# どうやるか
[record_with_operator](https://github.com/nay/record_with_operator)を使う

# 前提

```rb:Gemfile
gem 'devise'
```

```zsh
% bundle
% rails g devise:install
% rails g devise User
% rake db:migrate
```

# 導入
```rb:Gemfile
gem 'record_with_operator'
```

```zsh
% bundle
% rails g migration add_operator_to_model created_by:integer updated_by:integer
% rake db:migrate
```

```rb:application_controller.rb
  before_action do
    RecordWithOperator.operator = current_user
  end
```

```rb:model
  records_with_operator_on :create, :update

```

これで登録、更新時のユーザーIDが勝手に登録される

# 使い方
```haml
  = " #{ User.find(post.created_by).name }が#{ l post.created_at }に投稿"
```

# 参考
[record_with_operator](https://github.com/nay/record_with_operator)