OmniAICreator/Qiita-1.07M huggingface dataset:
WPFでWatermarkのメモ

## WPFでWatermark(透かし)を使ったときのメモ

### 参照設定
Microsoft.TeamFoundation.Controls
※.NET Framework4.5

### サンプル
``` MainWindowViewModel.cs
using Codeplex.Reactive;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reactive.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace WatermarkSample
{
    public class MainWindowViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string _name { get; set; }
        private string _numberstring { get; set; }

        public ReactiveProperty<string> Name { get; set; }
        public ReactiveProperty<string> NumberString { get; set; }
        public ReactiveCommand ClickCommand { get; private set; }

        public ReactiveCollection<string> ComboBoxSource { get; private set; }

        public MainWindowViewModel()
        {
            ComboBoxSource = Observable.Range(0, 100).Select(i => i.ToString()).ToReactiveCollection();

            Name = ReactiveProperty.FromObject(this, o => o._name).ToReactiveProperty();
            NumberString = ReactiveProperty.FromObject(this, o => o._numberstring).ToReactiveProperty();

            ClickCommand = Name.CombineLatest(NumberString, (l, r) =>
            {
                return !string.IsNullOrEmpty(l) && !string.IsNullOrEmpty(r);
            }).ToReactiveCommand();
            ClickCommand.Subscribe(param =>
            {
                MessageBox.Show(string.Format("TextBox:{0}{1}ComboBox:{2}", Name.Value, Environment.NewLine, NumberString.Value));
            });
        }

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

```

``` MainWindow.xaml
<Window x:Class="WatermarkSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:WatermarkSample"
        xmlns:wm="clr-namespace:Microsoft.TeamFoundation.Controls.WPF;assembly=Microsoft.TeamFoundation.Controls"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <l:MainWindowViewModel/>
    </Window.DataContext>
    <Grid>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="142,84,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Text="{Binding Name.Value, Mode=TwoWay}">
            <wm:Watermark.HintText>enter your id</wm:Watermark.HintText>
        </TextBox>
        <ComboBox HorizontalAlignment="Left" Margin="142,152,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding ComboBoxSource, Mode=OneTime}" SelectedIndex="{Binding NumberString.Value,Mode=TwoWay}">
            <wm:Watermark.HintText>select</wm:Watermark.HintText>
        </ComboBox>
        <Button Content="Button" HorizontalAlignment="Left" Margin="142,211,0,0" VerticalAlignment="Top" Width="75" Command="{Binding ClickCommand}"/>
    </Grid>
</Window>

```
ubuntu 再起動でpidファイルディレクトリ消える対処


今回はmongodbのpidファイルだが、他も多分同じように消える。
→ubuntu の tmpfs (temporary file system)

再起動すると、mongodbのpidファイルが置いてある`/var/run/mongodb`のmongodbディレクトリが消える。その対処。

`/var/run` -> `/run`
というようにシンボリックリンクになっているので、mongodbディレクトリを作成して、シンボリックリンク貼れば行けるかと思ったが、できなかった。
ので、start up scriptを作成。

```pid_dir.sh
#!/bin/sh
mkdir -p /var/run/mongodb
cd /var/run
sudo chown -R mongodb:mongodb mongodb/
```

実行権限与える。 `chmod u+x pid_dir.sh`

これをcronでreboot時に実行されるようにする。

`sudo crontab -e`

<pre>
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

@reboot /home/ubuntu/bin/pid_dir.sh
</pre>

他にいい方法あったら教えてください！
fswatchの使い方がわからない

プログラムが入っているフォルダを監視して、変更があった場合にテストを実行するようにしたいが、fswatchが期待どおりに動かない。

##インストール

```
$brew install fswatch
```

##Version

```
fswatch 1.3.8
```

とりあえず、modelフォルダを監視して、変更があった場合にHelloWorldと表示させる

```
$ fswatch model/ "echo HelloWorld"
```

##結果
modelフォルダにfoo.phpを追加

```
$ fswatch model/ "echo HelloWorld" 

/path/model/foo.php
```

期待値

```
$ fswatch model/ "echo HelloWorld" 

HelloWorld
```
Vimで括弧の反対側のハイライトを調節する

括弧にカーソルがあったとき、その反対側もハイライトしてくれる設定になっているのですが、これが括弧が隣接している場合、デフォルトだと色が微妙で超みずらかったのです。

こんな感じです。

![スクリーンショット 2014-09-19 16.41.41.png](https://qiita-image-store.s3.amazonaws.com/0/45822/1949f110-c639-cf6a-cef2-be32d9cdb3d9.png)


なので、この反対側の色を調節したいです。


```vim:.vimrc
hi MatchParen ctermbg=1
```

こんな感じでいけます。MatchParenです。

ありがとうございました。

![スクリーンショット 2014-09-19 16.43.50.png](https://qiita-image-store.s3.amazonaws.com/0/45822/68081848-4812-436d-e709-2b96f1076580.png)
プログラムメモ[2014/09/19]

# 調べたこと

## Xcode5でのフォルダ追加方法
FinderからXcode5に対してDrag&Dropするだけ．
設定については，よくわかっていない．

### Destination

*"Copy items into destination groups’s folder"*
Checkすると，ImageFileをCopyし，Projectに登録する．
Check無しだと，Projectに追加するが，ファイルの参照が追加される．
標準は，Check無し．

### Folders

*"Create groups for any added folders"*
登録しているフォルダにグループを作成．

*"Create folder references for any added folders"*
登録しているフォルダにフォルダ参照を作成．

---
## カラーピッカー
自分のプログラムに導入することが出来ました．
作者さんには，頭が上がりません．
[Color Picker For iOS](https://github.com/hayashi311/Color-Picker-for-iOS)
自分のプログラムにも導入しやすいし，なおかつARC&Xcode5対応です．
使う機会があれば，みなさんぜひ使ってみてください．
おすすめです．
適当な Python コードを Vim で開いた場合の mode line

以下のように書くと 4スペースでインデントできるし、インデント毎に za で fold できるので便利。

```python
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8 ff=unix ft=python ts=4 sw=4 sts=4 si et fdm=indent fdl=99:
# vim:cinw=if,elif,else,for,while,try,except,finally,def,class:
```

以下略した設定。

- fenc: fileencoding
- ff: fileformat
- ft: filetype
- ts: tabstop
- sw: shiftwidth
- sts: softtabstop
- si: smartindent
- et: expandtab
- fdm: foldmethod
- fdl: foldlevel
- cinw: cinwords

------------------------

僕が所属している[会社](http://www.beproud.jp/)が[社員募集中](http://jobs.beproud.jp/)みたいです。なんか、 Python 書いてみてーなと思った人は応募してみてくださいな。 (すてま)
Windows 8.1 で IE を空白のページで開く方法 (小ネタ)

今日は小ネタとして、Windows 8.1 (7/8 でも作業内容は同じです) で IE にホームページを設定していても通常起動の際に「空白のページ」で表示させる方法をご紹介します。

![スクリーンショット 2014-09-18 23.56.18.png](https://qiita-image-store.s3.amazonaws.com/0/32453/9ea33c3f-54e1-3806-46f1-b17382f8343b.png)
やりかたは簡単。タスクバーの IE を右クリックして出てきたジャンプリストから `Internet Explorer` を更に右クリックし、`プロパティ` をクリックします。

![スクリーンショット 2014-09-18 23.57.31.png](https://qiita-image-store.s3.amazonaws.com/0/32453/48605def-794f-72eb-5c29-8365ec431c6e.png)
後は今まで通り、リンク先の末尾にスペースを入れてその後に

- about:blank
- about:tabs

のどちらかを追加すれば OK です。`about:tabs` はいわゆる「よくアクセスするサイト」ページです。
ホームページに社内のポータルなどが設定されている場合は、社外でいちいち接続しにいってページが表示できません。となるのを防いでくれます。また、常にタブ 1個で開いてくれるのですぐに開きます。ホームページを開きたい場合は `Alt+Home` で開けますし。

2014/9/22 追加：書いた後で気付きましたが、インターネットオプションのスタートアップの項目で、`前回のセッションのタブから開始する` がチェックされているとこの設定は意味ないんですね… 

以上、小ネタでした。
AngularJS プルダウンメニューに未選択の項目を追加する


ng-options で指定する option 用配列に「未選択」の項目は含めず、HTML に option タグを直接書く。

```html
<select ng-model="data.id" ng-options="v.id as v.name for v in items">
    <option value="">未選択</option>
</select>
```
What's new in Gradle Plugin 0.13

メモ書き

http://tools.android.com/tech-docs/new-build-system

1. Gradle 2.1 が必要になるので、`${project_root}/gradle/wrapper/gradle-wrapper.properties`を書き換えましょう(Gradle Plugin のバージョンをあげたら書き換えを促すプロンプトが出るはず)。
2. テスト用に`AndroidManifest.xml`が、`src/androidTest`以下に配置できるようになりました。
3. ライブラリモジュールの`AndroidManifest.xml`でプレースホルダが使えるようになりました。ライブラリモジュール内で解決されないプレースホルダは、それを使用するプロジェクト側で解決されます。
4. ProductFlavor や Build Type ごとにプレースホルダが設定できるようになりました。
5. `Variant.getMappingFile()`で、ProGuard の mapping.txt へアクセスできるようになりました。
6. 画面密度や ABI ごとに apk を分割する新しいメカニズムが導入されました。
7. バグ修正
Infinite Scrollのリセット方法

jQueryプラグイン「Infinite Scroll」は最初に初期化して使用しますが、何かのタイミングで一度リセットし、再設定したい場合には下記の処理を実行します。

```js

var $infiniteScrollContainer = $('ここはコンテナとなるDOM要素');
  $infiniteScrollContainer.infinitescroll('binding','unbind');
  $infiniteScrollContainer.data('infinitescroll', null);
  $(window).unbind('.infscr');
  
  // Initialize plugin
  $infiniteScrollContainer.infinitescroll(
  {
    state: {
      isDestroyed: false,
      isDone: false,
      isDuringAjax : false
    }
  }
);

```

これでリセットされるので、もう一度設定し直す事ができます。
iOS8でまたUItableViewCellの階層が変更された


```:iOS8
<UITableViewCell>
   | <UITableViewCellSelectedBackground>
   | <UITableViewCellContentView>
   | <_UITableViewCellSeparatorView>
```

```:iOS7
<UITableViewCell>
   | <UITableViewCellScrollView>
   |    | <UITableViewCellSelectedBackground>
   |    | <UITableViewCellContentView>
   |    | <_UITableViewCellSeparatorView>

```

```:iOS6
<UITableViewCell>
   | <UITableViewCellContentView>
```

cell.superView.superViewみたいなアクセスの仕方をしているアプリは要注意ですね…！
Chef Analytics(ChefServer12)のお試しはxip.io利用がおすすめ

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。


[Chef Analytics](https://www.getchef.com/blog/2014/07/15/meet-the-chef-analytics-platform/)はChefServer上のオブジェクト変更や、Chef-ManageやKnifeといったクライアント達が何をしたか見やすく記録する、情シス臭あふれるコンポーネントです。

![Chef_Analytics.png](https://qiita-image-store.s3.amazonaws.com/0/7454/a5b26475-6c97-547f-bdb1-23b0f47cf3de.png "Chef_Analytics.png")


基本はChef-Serverに到達可能な別の場所に構築すべし(Standalone)なのですが、既存Chef-Server12と同じサーバにインストールする(Combined)ことも可能です。

[Install Chef Analytics — Chef Docs](https://docs.getchef.com/install_analytics.html "Install Chef Analytics — Chef Docs")


ただしChef-Server12と共存させる場合、次の仕様になります。
> Chef-Server12がRC3の時点での仕様なので、このへんは変わるかもしれません。

- Chef-Server APIと同じIP/PortでListen
- ネームベースでChef-ServerAPIとChef Analyticsが振り分けられる
    - Servernameを一緒にしちゃうと、Chef Analyticsが優先

この仕様から、うかつにCombinedでインストールすると、Chef-Server本体のエンドポイントが乗っ取られる悲劇が待っています。


## 安全にCombinedでインストールしよう

関連パッケージの`chef-server-core`, `opscode-manage`, `opscode-analytics`はrpm/dpkgでインストール済みとします。

まずは公式の案内通りに`/etc/opscode/private-chef.rb`を編集します。

```/etc/opscode/private-chef.rb
dark_launch['actions'] = true
```


analyticsとインテグレーションするため、reconfigure時に`private-chef/recipes/actions.rb`レシピを呼びます。
※ 一応案内通り、デフォルトで`true`な気がするんだけど...

で、一回`chef-server-ctl reconfigure`しておきます。


```
# chef-server-ctl reconfigure

...

Chef Client finished, 31/384 resources updated in 19.674226684 seconds
opscode Reconfigured!
```

### ホスト名にxip.ioを利用しよう

次に`/etc/opscode-analytics/opscode-analytics.rb`を作成します。

ここで名前ベースのホスト名に、[xip.io](http://xip.io/ "xip.io: wildcard DNS for everyone")を使います。

```/etc/opscode-analytics/opscode-analytics.rb
analytics_fqdn "54.199.xx.xxx.xip.io"
```

ちなみに、このファイルもRubyで書いてOKなうえ、Ohaiのアトリビュートもそのまあ使えるので、次のように書いてもOK。

```/etc/opscode-analytics/opscode-analytics.rb
analytics_fqdn "#{node[:cloud_v2][:public_ipv4]}.xip.io"
```

IaaSクラウドでEIPとか付け外ししても`reconfigure`すれば済むのでおすすめ。

編集したら **opscode-analytics-ctl** で`reconfigure`します。

```
# opscode-analytics-ctl reconfigure

...


Chef Client finished, 104/114 resources updated in 36.144560204 seconds
opscode-analytics Reconfigured!
```

あとはパブリックIPとxip.ioでブラウザからアクセスすればChef Analyticsを使って見る事ができます。
xip.ioなので、オンプレミスでChef-Server12にプライベートIPしか付与してないという状態でも特に問題ないのはいいですね。

![Chef_Analytics.png](https://qiita-image-store.s3.amazonaws.com/0/7454/4ab317fc-0acc-bec7-a1be-d833d07df243.png "Chef_Analytics.png")

ログインはChef-Serverに登録済みのユーザで、関連付けられたOrgに関する情報を見ることができます。
Analyticsを有効にした後で色々と操作をしていくと、アクティビティが表示されていきます。

![Chef_Analytics.png](https://qiita-image-store.s3.amazonaws.com/0/7454/e408ad6f-1da4-ceed-56a8-e3c70762faef.png "Chef_Analytics.png")



止めたくなったら`opscode-analytics-ctl stop`で止めときましょう。
本格運用したくなったらStandAloneを検討するか、自ドメインのホスト名くらいは付けてあげたほうが良いかも。

## さいごに

Node内のChef-Clientの挙動はReporting, 操作ログ(オペログ)はChef Analyticsと役割が分かれていますね。
ディレクトリ間のファイル比較による、ファイル削除・上書きコマンド

## 本コマンドの使いどころ
ディレクトリA・Bがあるとする。

| どんなファイル？ | アクション |
|:-----------|:------------|
| Aにはない Bにはある | Bのファイルを消す |
| Aにもある Bにもある | Bのファイルを上書き |


## コマンド

### ファイル削除
ディレクトリAにはないがディレクトリBにあるファイルを、ディレクトリBから削除。

```bash
diff -qru /path/to/directoryB/ /path/to/directoryA/ | egrep "\/path\/to\/directoryB\/.+だけに発見" | gawk '{ print gensub(/\/path\/to\/directoryB\/(.+)だけに発見: (.+)/, "\\1/\\2", "")}' | xargs -i rm -vr /path/to/directoryB/{}
```

### ファイル上書き
ディレクトリA・B双方に存在するファイルについて、
ディレクトリAのファイルでディレクトリBのファイルを上書き。

```bash
diff -qru /path/to/directoryB/ /path/to/directoryA/ | gawk '{ print gensub(/ファイル\/path\/to\/directoryB\/(.+)と.+/, "\\1", "")}' | xargs -i mv -v /path/to/directoryA/{} /path/to/directoryB/{}
```
Smartyでインクリメント（カウント）

今までこれを知らずにassignでひたすら足していた。
うーん、ちゃんと知っておかないとなぁ。メモメモ。

$xxxxxx の配列数が「5」の場合

```smarty
{counter start=1 skip=1}
{section name=cnt loop=$xxxxxx}
  index:{$smarty.section.cnt.index}
  iteration:{$smarty.section.cnt.iteration}

  {if !$smarty.section.cnt.first}
    counter:{counter}
  {/if}
  {if !$smarty.section.cnt.last}
    counter:{counter}
  {/if}
{/section}
```

■表示結果

```smarty
index:0 iteration:1 counter:0
index:1 iteration:2 counter:1
index:2 iteration:3 counter:2
index:3 iteration:4 counter:3
index:4 iteration:5 counter:3
```

そのままカウントすると表示（echo）がかかるので、
値を保持する場合は、assignで

```smarty
{assign var=counter start=1 skip=1}
```

■参考URL
http://www.smarty.net/docsv2/ja/language.function.section.tpl
http://www.smarty.net/docsv2/ja/language.function.counter.tpl
herokuに入れたSlack用のhubotの簡易運用手引き


## はじめに
* SlackにHeroku経由のhubotを導入している事が前提 
 * [herokuのインストール](https://toolbelt.heroku.com/)について
 * [slackにHubotを導入(Heroku経由)](http://qiita.com/Katsumata_RYO/items/dc4543aa5827d4c3211c)について

## herokuのアプリケーションのコラボレータ登録を依頼する
* 追加は、herokuダッシュボード > アプリケショーン名 > Access > collaborator にて行う

## herokuのサーバーのTZを設定しておく（クローンとか動かす為に）
```
heroku config:add TZ=Asia/Tokyo
```

## herokuのアプリをcloneする

以下のコマンドで、アプリケーションをダウンロードする

```
$ git clone git@heroku.com:アプリケーション名.git -o heroku
$ cd アプリケーション名
$ ls 
Procfile
README.md
bin
external-scripts.json
hubot-scripts.json
package.json
scripts
```

## hubotを進化させたい
* cloneしたherokuのアプリケーションディレクトリに入って、スクリプトをごにょごにょする。そして、以下のコマンドを叩いてデプロイする。
* npm install パッケージしたら、package.json の dependencies にパッケージを追記して、heroku にプッシュを忘れずに

```
$ git push heroku master
$ heroku ps:scale web=1
```

## 動作の確認
* 単純に @slackbot: ping で pong してみる

## 追加したスクリプト
* redmine.coffee
 * http://qiita.com/kseta/items/978dce4bfe0c8016b233

以下、redmine用の環境変数を追加

```
$ heroku config:add HUBOT_REDMINE_BASE_URL=http://a.redmineurl.com
$ heroku config:add HUBOT_REDMINE_TOKEN=***************************(your API access key)
```
「operation system not found」 と画面に出て起動しなくなった時の対応方法(VAIO)

こんにちは。
SONYのVAIOでロゴが出た後
「operation system not found」と昨日出ました。

お手上げですね。
Enter押すと、同じのがもう一行表示されるだけ。

##原因
僕が見たときは既にこの表示がされていたので、全くの不明。
何故こうなったか確認するも、どうやらつけたらこうなったとのこと。

でも考えてみる。
所謂OSが見つからないって言ってる。
だけども何かしらボタンを押すと、反応はするしPCは動いている音がする。

土台のPC自体は生存確認できたので、何かしらボタンを押すと反応するはず。

##アクション

__1.__
まずはCD等が入っているか確認
以前CDが不具合となって起動しなくなったケースがあったので。
そしてやはり入っていたので、取り外す(音楽のCDだったので問題はなさそう)。

__2.__
エンターを押して見るも同じメッセージ。
じゃあ「ctrl」+「Alt」+「delete」を押したらどうなるか確認。
お、再起動を勝手に始めた。

そしてメーカーのロゴも表示される。
BIOSは生きている。
とりあえずそのまま読み込ませる。

※有識者に、物理的破損の可能性もあり何もしないと動かないままなため
　データ、最悪PC破損しても問題ないかの了承はとってます

__3.__
読み込ませてみても同じメッセージ。
そのため再度「ctrl」+「Alt」+「delete」でメーカーロゴ表示後
F2連打でBIOSの起動。
そしてそのまま再起動をかける。
(ここはちょっと誤った判断だったかも。それは後述します。)

しかし、結局同じメッセージ。

__4.__
キーでダメなら最終手段。
電源ボタン長押しで一旦PCを落としてから起動させる。

__OS読み込んで起動した__


##結果
強制終了で一旦落として、起動させるのと
「ctrl」+「Alt」+「delete」で再起動かけるのでは挙動が違った。
ただ確信をもって対処方はこれだ！と言えないのが非常に残念です。

ただ対応はBIOSで「念のため」ということで他に行いました。

##その後調査
圧倒的にCドライブの容量が少なかったので、データの整理を依頼
再起動をかけるも起動確認
BIOSを再度起動し、起動順序の確認


__起動順序が光学ディスク→HDDの順になっていた__
恐らくこれも原因していたような。
というより、まさに初めにここの設定を変更して起動確認を行うべきでした。
反省です。。

起動順序を変更し、再度起動確認。
音楽用に使っていたようなので、デバイス認識がされているかも確認。
問題なし。

ということで、終了いたしました。
ご参考になれば幸いです。
※PCトラブル対応関連はひとつの手段として、あくまで参考になりますので
　壊れてしまう可能性もございます。
　残念ながら、責任は負えません。
iPythonでoptparseを使う場合


## 問題

optparseを用いたスクリプトをipythonで実行する時、通常の
``$ python main.py -i ./hoge.txt``
という書き方にならって
``$ ipython main.py -i ./hoge.txt``
と実行してもオプションが認識されない。

## 解決策

``$ ipython -- main.py -i ./hoge.txt``
とする。
これにより、`--`以降のコマンドはipythonによりパースされず、正常に実行できる。
boot2dockerの自作



# boot2dockerの自作

* [mitchellh/boot2docker-vagrant-box](https://github.com/mitchellh/boot2docker-vagrant-box)


```bash:
git clone https://github.com/mitchellh/boot2docker-vagrant-box.git
cd boot2docker-vagrant-box.git
vagrant up
vagrant ssh -c 'cd /vagrant && sudo ./build-iso.sh'
vagrant destroy --force
packer build template.json
# 最後、vmware fusonをCommand-Qで終了させること。
```

* boot2docker-vagrant.iso
* boot2docker_virtualbox.box
* boot2docker_vmware.box

が作成される。
GET https://ghconduit.com:25035/status net::ERR_CONNECTION_REFUSED

### Issue

GitHubサイト上で下記のような読み込みエラーが出る。

![スクリーンショット 2014-09-19 1.27.34 PM.png](https://qiita-image-store.s3.amazonaws.com/670/229/188bb43c-aa7f-7bf5-f5a6-d93d3f388e83.png "スクリーンショット 2014-09-19 1.27.34 PM.png")

ghconduit どこ

```
nslookup ghconduit.com
Server:         10.0.1.1
Address:        10.0.1.1#53
```

なにこれ……

### Solution

すごい斜め上だったんだけど GitHub on Mac https://mac.github.com/ を入れると直る。

- https://github.com/igrigorik/ga-beacon/issues/7

ブラウザのGitHubページ上からGitHub.appで連携するための何か上のすご技っぽい。
LINEスタンプ フォーマット

LINEスタンプを下書きする用のフォーマットを作成しました。

[ [PDFダウンロードはこちらから](http://www.hugkey.com/691/ "hugkey.com") ]

![スクリーンショット 2014-09-19 13.16.43.png](https://qiita-image-store.s3.amazonaws.com/0/6688/289ef90f-83cd-1426-7fc3-8d47a8a3b535.png)

[ [PDFダウンロードはこちらから](http://www.hugkey.com/691/ "hugkey.com") ]


■活用例
![スクリーンショット 2014-09-19 13.31.00.png](https://qiita-image-store.s3.amazonaws.com/0/6688/1997cb4b-1752-ae6b-9aae-32bc5c268470.png)

私はこちらに鉛筆で下書きをして、スキャンしたものをPsやAi上で清書して使っています。


■スタンプ販売中
こちらのフォーマットを使って作成したLineスタンプが販売中です。
帰る羊、帰りを待つひつじ
http://www.hugkey.com/line_stamp_sheep/

![3b8e8aca3bba62111b0354838c6278ae.png](https://qiita-image-store.s3.amazonaws.com/0/6688/fd932ccc-c4f7-ded0-b2b8-181a94b06b62.png)
はみ出さないスクロール

画面に埋込された、facebookとかtwitterとかのパーツ、
マウスでコロコロしてスクロールして一番下まで行くと・・・
スクロールイベントがはみ出して、画面全体がスクロールしますよね？

その動きにいつもイラッとするので、自分でパーツを作る際には、
「はみ出さないスクロール」がいいとおもいました。

動きは以下のページからお試しください。
http://hodade.adam.ne.jp/etc3/hamidasanai.html

いまのところiframeにしか対応していなくて、iframe側のHTMLソースに以下の記述をすると、スクロールイベントがはみ出さなくなります。

```
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script>
$(window).on('mousewheel', function(e) {
    //上にスクロール
    if (e.originalEvent.deltaY < 0 || e.originalEvent.wheelDelta > 0) {
    	//最上部まできたらスクロール無効
		if ($(window).scrollTop() == 0) {
		    e.preventDefault();
		}
    }
	//下にスクロール
    if (e.originalEvent.deltaY > 0 || e.originalEvent.wheelDelta < 0) {
    	//最下部まできたらスクロール無効
		var documentHeight = $(document).height();
		var scrollPosition = $(window).scrollTop() + document.body.clientHeight;
		if (documentHeight == scrollPosition) {
		    e.preventDefault();
		}
    }
});
</script>
```

2014/12/18
jQueryプラグイン化してgithubで公開しました！ DIVタグにも適用できます。
https://github.com/hodade/jquery-scroll-hamidenai
iOS8リリースされたので即座にWeb上でSwiftを勉強してハイパーアプリエンジニアになろう！

by @mixiaappwchr
![_600スクリーンショット 2014-09-19 13.00.40.png](https://qiita-image-store.s3.amazonaws.com/0/37731/8d76ef85-923c-035f-1ccf-981888b6596f.png)


Xcode6,iOS8からはSwiftでの開発が選択しに入り、よりiOSアプリ開発の敷居が低くなったかと思います。

それでもアプリを開発するにはMacを手に入れたり,ライセンスをかったり諸々必要です。

そんなお金ない！でもSwift試したい方に朗報です。

でると思ってましたがWebでSwiftを実行できるサービスがありました。

RunSwift
http://www.runswiftlang.com/

ちょうどXcode6のplaygroundみたいなもんですね。

正直これでアプリ開発ができる訳ではありませんが、Swift触ってみたいぜひやってみてください！
Redisの永続化をオンラインで設定する


####設定確認

```
$ edis-cli CONFIG GET save
1) "save"
2) ""
$ redis-cli CONFIG GET appendonly
1) "appendonly"
2) "no"
```

####動作中のRedisで実行

```
$ redis-cli CONFIG SET appendonly yes
OK
$ redis-cli CONFIG SET save "900 1 300 10 60 10000"
OK
```
AOFがonの場合、起動時にAOFファイルを読み込んでデータを再構成するので先にオンラインで実行する必要がある。
RDBのみ設定する場合は`BGSAVE`でもRDBファイルはできるのでどちらでもいいが、再起動する手間も省けるし`CONFIG SET`で良い。

####変更を確認

```
$ edis-cli CONFIG GET save
1) "save"
2) "900 1 300 10 60 10000"
$ redis-cli CONFIG GET appendonly
1) "appendonly"
2) "yes"
```

####設定ファイルを変更

```redis.conf
・・・
save 900 1
save 300 10
save 60 10000
・・・
appendonly yes
・・・
```

###参考
<a href="http://redis-documentasion-japanese.readthedocs.org/ja/latest/topics/persistence.html">Redis の永続化 — Redis Documentation (Japanese Translation)</a>
jenkinsでファイルをアップロードできるジョブを作る

jenkins氏にファイルを渡して、サーバに上げてもらうという物を作ります。
Webの画面でフォームからファイルをアップロードできるので、ユーザフレンドリな感じでいけるのではという試み。

#### ビルドのパラメータでファイルを選ぶ
ジョブ作成時に、実行時にファイルをアップロードさせられるようにできます。
![capt2.PNG](https://qiita-image-store.s3.amazonaws.com/0/29745/17f85939-b6d6-5545-1fea-63edb13ee1d9.png)

* 上げるファイルによらず、指定したファイル名になります。
* 例の場合だとfoobar.csvというファイルでワークスペースに保存されます。
* ファイル名に日本語は使えないっぽい。
* パラメータを増やすことで複数ファイルも可。
* **ファイル指定なしで実行した場合、空ファイルができます。**

ジョブ実行でワークスペースにファイルが保存されるので、あとはそれをシェル実行で転送すれば良し！
なんですが、空ファイルができるので全部転送すると空で上書きされてしまうという事態になります。
これがめんどくさい。

#### 空ファイルを避けて転送

ジョブのビルド時にコマンドが実行できるので、それで`cp`なり`scp`なりでワークスペースのファイルを送ります。

![capt3.PNG](https://qiita-image-store.s3.amazonaws.com/0/29745/aa40c333-8468-8426-d550-ea4999ce6c57.png)

アップされず実行された場合に備えて、ようは空のファイルは避ければ良い。
こんな感じで実行させます。

````sh
for csv in *.csv
do
  if [ $(wc $csv | awk '{print $1}') -ne 0 ]
  then
    echo copy $csv
    #cp $csv 転送先のディレクトリ
  else
    echo empty $csv
    rm $csv
  fi
done
````

これでアップしたファイルのみ処理される！

あとはいい感じにアレすれば万事収まるのではないかと思われます。
サンキュー！jenkins氏！
vim window

## ヘルプ
:help windows

## vimのウィンドウ操作

### ウィンドウ移動
|キーマップ |動作|
|:-:|:--:|
|\<C-w\> h |左隣のウィンドウに移動する|
|\<C-w\> j |下隣のウィンドウに移動する|
|\<C-w\> k |上隣のウィンドウに移動する|
|\<C-w\> l |右隣のウィンドウに移動する|



### サイズ変更
|キーマップ |動作|
|:-:|:--:|
|\<C-w\> - |現在のウィンドウ高さを減らす|
|\<C-w\> + |現在のウィンドウ高さを増やす|
|\<C-w\> < |現在のウィンドウ幅を減らす|
|\<C-w\> > |現在のウィンドウ幅を増やす|
|\<C-w\> = |最適なサイズに調整|

数値入力後に上記のキーで増減値を指定できる。
CentOS6.xにOracleのJDK8をインストールする

追記 2017/12/28
当時の自分は無知で知りませんでしたが、`alternatives`でバージョンを切り替えるのが主流です。

https://qiita.com/genreh/items/5ca16775442f3e3a355a

こちらなどの他の記事を参考にしてください。

# 概要
CentOS7がリリースされているが、CentOS6.X系を使うことが未だににあるのでデフォルトでインストールされているOpenJDKを削除してOracleのJDKをインストールするときのメモ

# 実施環境
* CentOS6.5 x86_64

# 用意するもの
* JDK8のRPM

※http://qiita.com/hajimeni/items/67d9e9b0d169bf68d1c9 ダウンロードの仕方はこの記事を参照

GUIが使えるなら
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
からダウンロードしてもよい

# 手順
## 現在インストールされているJavaのバージョンを確認する

```
java -version
```

おそらく以下のような文字列が出力される

```
java version "1.7.0_45"
.....
```

## 過去バージョンのJavaをアンインストールする
CentOs6.5では通常の構成でインストールしていればOpen-JDK1.6とOpen-JDK1.7がデフォルトでインストールされている。
これらをアンインストールする


```
yum remove java-1.6.0-openjdk
yum remove java-1.7.0-openjdk
```

*suでログインしていることを前提のコマンドとなります。
実行時に適宜sudoなどを補完してください。

これでJavaがアンインストールされ、バージョン確認を行ってもコマンドが無いと怒られるはず。

## Java8をインストールする
ターミナルでrpmを落としたディレクトリ（wgetならコマンドを叩いた時のカレントディレクトリ、GUIでブラウザからならおそらく”ダウンロード”）に移動し、以下のコマンドを叩く

```
rpm -ivh jdk-8uXX-linux-yyy.rpm
```
※XXの部分はその時の最新バージョンにより変化します
※yyyの部分はOSが64ビット、32ビットで変わります。
64ビットは"x64"、32ビットは"i586"となっていると思われる。

## 再度Javaのバージョン確認
以下のコマンドを叩いてJavaのバージョンを確認する
```
java -version
```

以下のように出力されるはず

```
java version "1.8.0_XX"
.....
```

※例によってXXの部分はその時の最新バージョンにより変化します。

この出力を確認できればJava8がインストールできています。

一応バージョン確認はjavacのバージョンも確認しておいたほうが良いでしょう。

```
javac -version
```
Underscore.jsを使ってプロパティの初期化処理をシンプルに書く

[昨日の記事](http://qiita.com/yd_niku/items/8dad4e59ddf779650076)書いてて気づいたのですが、コンストラクタでデフォルト値を受け取って初期化するときの処理をシンプルに書けそうです。

いままで↓こういうふうにしていたのが

```js
// Before
function MyClass(options) {
  options || (options = {});

  if('hoge' in options) {
    this.hoge = options.hoge;
  }

  if('fuga' in options) {
    this.fuga = options.fuga;
  }

  // etc ...
}
```

↓こういうふうにスッキりかけます。

```js
// After
function MyClass(options) {
  options || (options = {});

  var acceptOptions = ['hoge', 'fuga'/*, etc ... */];
  _.extend(this, _.pick(options, acceptOptions));
}
```

受け入れたいプロパティを増やすときは`acceptOptions`を増やすだけでよいです。

# 初期値が必要な場合

```js
// Before
function MyClass(options) {
  options || (options = {});

  this.hoge = options.hoge || 0

  this.fuga = options.fuga || [];

  // etc ...
}
```

↓これも`_#default(object, *defaults)`をつかうとスッキりかけますね。

```js
// After
function MyClass(options) {
  options || (options = {});

  var acceptOptions = ['hoge', 'fuga'/*, etc ... */];
  var defaults = {
      hoge: 0,
      fuga: []
  };
  _.extend(this, _.default(_.pick(options, acceptOptions), defaults));
}
```

`defaults`に初期値がないものはそのまま何も起こらないので、必要なプロパティに関してだけ明示的に`defaults`オブジェクトに入れればいいので分かりやすいです。

underscore.jsを使うと`_#extend()`とか`_#pick()`とか`_#default()`やってる処理の目的が明確になるのがいいですね。
BeautifulSoupを使ってHTMLファイルからある文字列を含むリンクを抽出する


・HTMLファイルから"mp4"を含むリンクを抽出。
・BeautifulSoupを使用。

```python

from BeautifulSoup import BeautifulSoup

open_name = raw_input('Open html file: ')
save_name = raw_input('Save file name: ')

f = open(open_name)
html = f.read()
f.close()

f2 = open(save_name, 'w')

soup = BeautifulSoup(html)

for link in soup.findAll("a"):
    if "mp4" in link.get("href"): # "mp4"を含むリンクを抽出
        f2.writelines(link.get('href') + '¥n')

f2.close()

```

下記リンクのStack Overflow を参考にしました。
他にもいい方法がありましたらご指摘ください。


参考：
python - how can I get href links from html code - Stack Overflow
https://stackoverflow.com/questions/3075550/how-can-i-get-href-links-from-html-code/3075568#3075568
privateメンバー変数へのアクセスの例

```php
<?php
class A {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function copyName(A $from) {
        $this->name = $from->name;
    }

    public function __toString()
    {
        return $this->name;
    }
}

$a1 = new A('test1');
$a2 = new A('test2');

echo $a1.PHP_EOL;

$a1->copyName($a2);

echo $a1.PHP_EOL;
```
Vagrant1.6でboot2dockerを使ったメモ


* [boot2dockerのデータ永続化まとめ - Qiita](http://qiita.com/tukiyo3/items/07f1eb77b5ffd9031e30)も参照

# vagrant rsync

* [Vagrant 1.5 で追加された Rsync Synced Folder が良い - Shin x blog](http://www.1x1.jp/blog/2014/03/vagrant-rsync-synced-folder.html)

## ファイルのコピー(ホスト -> ゲスト)

```bash:rsync
vagrant rsync
```

```bash:rsync-auto
vagrant rsync-auto
```

ゲスト->ホスト は無い。

## 設定

```bash:Vagrantfile
  config.vm.synced_folder ".", "/vagrant_data", type: "rsync"
```

vagrant upすると以下メッセージが追加される。

* ==> default: Installing rsync to the VM...
* /tmp/tcloop/rsync/usr/local/bin/rsync にインストールされる。
* rebootコマンドだとOS再起動の度に設定がリセットされる。
  * vagrant reloadを使うこと。


# 初回のvagrant up時にscriptを実行

* Vagrantfile と同じフォルダにscript.shを作成。
* `docker save tukiyo3/fedora:rawhide -o fedora.tar`して作成したfedora.tarも置く。

```bash:script.sh
#!/bin/sh
set -eux

echo TZ=JST-9 > /etc/sysconfig/timezone
docker load -i /vagrant_data/fedora.tar
docker run --name fedora -it tukiyo3/fedora-ja:rawhide /bin/bash
```


```bash:Vagrantfile
  config.vm.provision "shell", path: "script.sh"
```

* script.shは初回だけ実行される。

# vagrant --provider=docker

macだと使えなかった。ホストがlinuxの時使えるのか。

* [Docker - Provisioning - Vagrant Documentation](https://docs.vagrantup.com/v2/provisioning/docker.html)
* [Configuration- Docker Provider - Vagrant Documentation](https://docs.vagrantup.com/v2/docker/configuration.html)
* [fgrehm/docker-provider](https://github.com/fgrehm/docker-provider)

```ruby:Vagrantfile
  config.vm.box = "mitchellh/boot2docker"
  config.vm.provider "docker" do |d|
      #d.build_dir = "."
      #d.pull_images = "tukiyo3/ubuntu-debootstrap-ja:14.10"
      d.run "tukiyo3/ubuntu-debootstrap-ja:14.10",
        cmd: "bash"
  end
```

# ブリッジ設定する場合

* [環境変数で Vagrant の bridge を指定できるようにする - Qiita](http://qiita.com/elim/items/816f03c732e4b274d181)

```bash:ip設定
sudo ifconfig en4 alias 192.168.9.2 netmask 0xffffff00
```

```bash:Vagrantfile
  config.vm.network "public_network", ip: "192.168.9.10", bridge: 'en4: USB Ethernet'
```

```bash:ip削除
sudo ifconfig en4 -alias
```

```bash:ブリッジのインターフェイス一覧
VBoxManage list bridgedifs | awk '/^Name:/{$1=""; print}'
 en0: Wi-Fi (AirPort)
 en1: Thunderbolt 1
 bridge0
 p2p0
 en4: USB Ethernet
```

# boot2dockerにパッケージをインストール

```bash:パッケージ操作
tce-load -wi vim
```

[パッケージ一覧](http://www.tinycorelinux.net/5.x/x86/tcz/)


```bash:インストール済みパッケージ一覧
tce-status -i
```

## vagrantを使って起動

以下のように使える。
TinyCore Linuxだとdockerのパッケージが無いので、boot2dockerは良い。

```bash:
tce-load -wi screen
```


# その他

## global-status

* vagrantでイメージ作り過ぎたときにこのコマンドを打って後悔する

```bash:
vagrant global-status
```
seil と Karabiner で日本語入力をカスタマイズする


mac で Windowsキーボードを使いやすくするツール

### キーボードの割り当てを行う

Seilを使う
https://pqrs.org/osx/karabiner/seil.html.ja


####割り当て


|項目|Macキーボード割り当て|JISキーボード割立て|
|---|-----|---|
|左Ctrlキー|Ctrl_L:59|CapsLock:57|
|左コマンド|Command_L:55|Alt_L:58|
|右コマンド|Command_R:54|Alt_R:61|
|左オプション|Option_L:55|Windowskey:55|
|右オプション|Option_R:55|WindowsKey:55|
|CapsLock|CapsLock:51|Ctrl_L:59|
|変換|かな:104|変換:104|
|無変換|英数:104|無変換:102|

### 機能の割り当て

Karabiner を使う
https://pqrs.org/osx/karabiner/index.html.ja

|項目|Macキーボード割り当て|JISキーボード割り当て|メニュー割り当て|
|---|---|---|---|
|ファンクション|Fn|Menu Key|For PC User>Change PC Application Key(Menu Key)>Application Key to Fn|
|コピペ|Command-C/V/X|Ctrl-C/V/X|For PC User>Use PC Style Copy/Paste|
|全選択|Command-A|Ctrl-A|Use PC Style All|
|\|JIS YeN(¥)|\|For Japanese > Change Yen(¥) Key|
|ボリュームアップ|F12|PrintScreen|For PC Users > Change PC PrintScreen Key, ScrollLockKey > Right-hand funciton key bock to system valume controls |
|ボリュームダウン|F11|ScrollLock|For PC Users > Change PC PrintScreen Key, ScrollLockKey > Right-hand funciton key bock to system valume controls |
|ミュート|F10|Pause|For PC Users > Change PC PrintScreen Key, ScrollLockKey > Right-hand funciton key bock to system valume controls |
EC2インスタンスに複数のENIをアタッチした場合のデフォルトルート


EC2には複数のENIをアタッチ出来るが、そのような場合デフォルトルートが複数表示される。
この場合の優先順位はMetricを確認すること。

## Amazon Linuxの場合

```sh
# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         ip-10-0-0-1.ap- 0.0.0.0         UG    0      0        0 eth0
default         ip-10-0-2-1.ap- 0.0.0.0         UG    10001  0        0 eth1
10.0.0.0        *               255.255.255.0   U     0      0        0 eth0
10.0.2.0        *               255.255.255.0   U     0      0        0 eth1
instance-data.a *               255.255.255.255 UH    0      0        0 eth0
```


上の例では,eth0に設定されたデフォルトゲートウェイのMetricが0となるので優先される。

http://linuxjm.sourceforge.jp/html/net-tools/man8/route.8.html
Go言語からBigQueryのAPIを使う

[追記] JWTまわりのAPIが変わったようなので、以下のサンプルそのままだと動かない可能性あり

Googleの提供するライブラリをimportする。

```lang:go
import (
	bigquery "code.google.com/p/google-api-go-client/bigquery/v2"
	"code.google.com/p/goauth2/oauth/jwt"
)
```

アクセスに必要なトークンを準備する。

```lang:go
iss := "yourname@developer.gserviceaccount.com"
scope := bigquery.BigqueryScope
pem := `-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----`
token := jwt.NewToken(iss, scope, []byte(pem))
```

HTTPクライアントを準備する。

```lang:go
transport, err := jwt.NewTransport(token)
client := transport.Client()
bq, err := bigquery.New(client)
```

APIを呼ぶ。
以下の例ではBigQueryに保存された行を取得している。

```lang:go
call := bq.Tabledata.List("projectid", "dataset", "table")
call.MaxResults(10)
list, err := call.Do()
```

上記の`list`をJSON形式に変換して表示する場合。

```lang:go
buf, err := json.Marshal(list)
fmt.Println(string(buf))
```

ちなみに行をBigQueryに挿入したい場合は`Tabledata.InsertAll`というAPIを使う。
nginxのログをBigQueryにインポートする

## はじめに

nginxのログをBigQueryにインポートする設定のメモです。
手順の詳細は省略していますが、おおまかな設定などの参考になると思います。

この記事ではnginxを例として使っていますが、Apacheの場合は適宜読み替えてください。

## 必要なもの

以下のもののインストールや準備が必要です。

* BigQuery
* nginx
* fluentd
* fluentd-agent-lite

## BigQuery

ログを受け取るテーブルを作成しておきます。

```
time    INTEGER REQUIRED
size    INTEGER NULLABLE
reqsize INTEGER NULLABLE
status  INTEGER NULLABLE
host    STRING  NULLABLE
uri     STRING  NULLABLE
method  STRING  NULLABLE
referer STRING  NULLABLE
ua      STRING  NULLABLE
vhost   STRING  NULLABLE
reqtime FLOAT   NULLABLE
apptime FLOAT   NULLABLE
```

全部`REQUIRED`で良い気もしますが、何となく`NULLABLE`になっています。

## nginx

LTSV形式でログを出力するようにします。

```
log_format  ltsv  "time:$time_local"
                  "\thost:$remote_addr"
                  "\turi:$request_uri"
                  "\tstatus:$status"
                  "\tsize:$body_bytes_sent"
                  "\treqsize:$content_length"
                  "\tmethod:$request_method"
                  "\treferer:$http_referer"
                  "\tua:$http_user_agent"
                  "\treqtime:$request_time"
                  "\tapptime:$upstream_response_time"
                  "\tupstream:$upstream_addr"
                  "\tvhost:$host";

...

access_log          /var/log/nginx/access.log  ltsv;
```

通常の形式でも問題はありませんが、他にも何かと便利なのでLTSV形式を使っています。

## fluent-agent-lite

保存したログは、fluent-agent-lite によって fluentd へ転送します。

```
TAG_PREFIX=""
LOGS=$(cat <<"EOF"
raw.nginx.access /var/log/nginx/access.log
EOF
)
PRIMARY_SERVER="xxx.xxx.xxx.xxx:24224"
```

## fluentd

LTSV形式のアクセスログをparseします。

```
<match raw.nginx.*>
  type parser
  format ltsv
  remove_prefix raw
  key_name message
  time_format %d/%b/%Y:%H:%M:%S %z
</match>
```

parseされたものをBigQueryに保存します。

```
<match nginx.access>
  type copy
  <store>
    type              bigquery
    method            insert
    auth_method       private_key
    email             youraccount@developer.gserviceaccount.com
    private_key_path  /etc/td-agent/bigquery.p12
    project           yourproject
    dataset           mixch
    table             http_%y%m
    time_format       %s
    time_field        time
    field_integer     time,size,reqsize,status
    field_string      host,uri,method,referer,ua,vhost
    field_float       reqtime,apptime
  </store>

  ...

</match>
```

fluent-plugin-bigquery は `table` のパラメータに日付のフォーマットを使うことが出来ます。

すべてのログを1つのテーブルに保存するのではなく、月ごとなどに分割することで、クエリのスキャンするデータ量を抑制するなどの効果があります。BigQueryは複数のテーブルに対してクエリを実行できるので、月をまたいだクエリも可能なため分割が問題にはなりません。
chatwork で URL が省略されるのシンドイ

# 背景

chatwork って長い URL 送ると省略されますよね。
コピペした後に気づいたりすることありませんか。

![cw0.png](https://qiita-image-store.s3.amazonaws.com/0/7823/ab91c5cc-ec98-f793-ca1c-77d34454c81b.png)

表示エリアが長い URL で埋まることを防ぐための対応だとは思うのですが、省略されて困ることの方が多いですね。

# 対応

URL を省略しないようにしましょう。

右上の動作設定 > 表示設定から。

![cw1.png](https://qiita-image-store.s3.amazonaws.com/0/7823/d48500b9-fccb-81fc-fcb8-e2ee3a8647f1.png)

![cw2.png](https://qiita-image-store.s3.amazonaws.com/0/7823/e9304493-5652-7318-cc5a-dacc9585b90a.png)

これで省略されないようになりました。

![スクリーンショット_2014-09-19_10_02_28.png](https://qiita-image-store.s3.amazonaws.com/0/7823/ef66a8ab-53b2-b1aa-d643-1ca3bea33734.png)
iPhone6/6 Plusも発売された今！アプリ開発のUI/UX戦国時代を勝ち抜くカイゼンのための便利サービスの紹介

by @mixiappwchr

![placeit.jpg](https://qiita-image-store.s3.amazonaws.com/0/37731/0b826733-e197-7fea-cc88-d0126f27e2ca.jpeg)



アプリ開発においてUI/UXは最重要の課題といえます。

よりアプリに没頭してもらう、提供した機能を意図通り、効率よく使ってもらうには、細やかな設計が必要になります。

ただし、予想に反して

###ユーザーは思いもよらない使い方をしてくれる
###自分たちでも気づかなかった阻害要因により思った通りに使ってもらえなかった

などなど、開発時には気づかない点が多く発生します。

今後、iPhone6/6 Plusも発売になり、デバイスサイズが複数になることにより、ユーザーの使い方はより複雑になり、UI/UXの検討がさらに困難になることでしょう。

そういうときは、ユーザービリティのテストを行い、こちらの意図通りに使ってもらえているかの確認をすればよいのですが、、、なかなかテスターのリルーティング、テストの準備、金銭的な問題により難しかったりします。


今回はそのような分析を行いたい場合に非常に助けになるサービスをご紹介します


##ユーザーの行動から使用中の表情まで！すべて動画で簡単に記録できるサービス Repro
![_400スクリーンショット 2014-09-19 9.03.58.png](https://qiita-image-store.s3.amazonaws.com/0/37731/b5a9d622-1726-c154-116c-11d86cf6e985.png)

Repro

[https://repro.io/](https://repro.io/)

通常ユーザービリティテストをおこなうとなると、

* テスターを探してくる
* ユーザーにさわって、実際の操作をみる為に、機材を用意する

などなど、いろいろと面倒な点が発生します。

こちらのサービスはSDKを導入するだけで,リモートでユーザー行動を動画で記録してアップロードしてくれるため、手間がかかる点を一気に解消してくれます。



###機能

#### ユーザーの操作を動画で保存してアップロードすることにより、リモートから実際にユーザー行動分析を行うことが可能。
動画は実際のアプリの画面できちんと保存され、また、ユーザーの表情、音声なども記録可能なため、手に取るように操作状況やユーザーの感情、思っていることを記録可能です。



#### イベントも定量分析が可能なため、定性・定量の両面からグロースハックが可能
定性的な分析に加え、定量分析のデータも保存できるため、セットでの分析を行えます。

#### クラッシュに至るまで動画付きのレポートがあるので、再現確認などを飛躍的にやりやすくします。
クラッシュレポートサービスは皆さん使っているかと思いますが、結局ログみてもどうやったらこのクラッシュ再現できるの！？
といった場合でも実際の操作が記録されているため再現がしやすいかと思います。

#### サーベイ機能もあり、ユーザーへのアンケートによるデータ収集も可能
さらに深堀したい場合に簡単にサーベイも可能です


同様のサービスがいくらかある中で

* セキュリティ、プライバシー面の細やかな配慮もされている
* 同様のサービスの中ではパフォーマンスは最高レベル

といった点がおすすめポイントです。

![_600スクリーンショット 2014-09-19 9.25.47.png](https://qiita-image-store.s3.amazonaws.com/0/37731/7a8e5d6e-6a1b-1716-903e-a8da61eca909.png)


###インストール
Cocoapodsでの配布がされているため、一発でインストールが可能です。導入も簡単

```bash
pod "Repro"
```

よりユーザーを知ることによりヒットサービスをどんどん生み出していきましょう！


現在β提供中は無料なので使ってみてはいかがでしょうか？

Repro

[https://repro.io/](https://repro.io/)
優先度つきキュー (Chapter 6)


優先度つきキューとは、その名の通り優先順位がついているキューのことです。[英語版](http://qiita.com/cmtkc/items/75ac641284743b04c8c2)
用途としては、
- 	[ジョブ管理システム](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%96%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)
-  印刷の順番
-  [event-driven simulation](http://www.cs.toronto.edu/~heap/270F02/node54.html)

##オブジェクト##
全ての ```x ∈ S``` に優先度がついており、x.priorityが存在する。
優先度つきキューはFIFO (first in first out) に限定していないので応用が利く。

##オペレーション##
* Insert(S,x)
	- xの値をSに追加する	
	- 返り値はvoid
* Max(S)
	- x.priorityの最大値を返す
* Extract_max(S)
	- x.priorityの最大値を返す
	- x.priorityの最大値をSから削除する
* Increment_priority(S, x, k)
	- x.priorityの値をkに設定する
	- k > x.priority
	- xの設定を更新する

##List##
1. Unsorted List: 未ソートのリスト
* Sorted List: ソート済みのリスト
* Special List: x.priorityの最高値が相対的に低い場合（１〜１０など）
* [Heap]()：バイナリヒープの事をさす、特に最大二分木の事をさす。特にMin-Heapが優先度つきキューの実装に使われる。
##データ構造##

 | Insert | Max| Extract_Max(削除の部分）|Increment_priority
------------ | -------------| -------------|-------------|-------------
Unsorted List | O(1)|O(n)|O(1)|O(1)
Sorted List | O(n)|O(1)|O(1)|O(n)
Special List| O(1)|O(k)|O(1)|O(n)
Heap | O(log(n))|O(1)|O(log(n))|O(log(n))

##参考文献目録##
主にCormenら著書「Introduction to Algorithm」
ansibleでec2.pyを使ってpingするまで



###セットアップ

```
# yum install python-boto.noarch
# yum install python-argparse.noarch
# mkdir ~/.ansible
# cd ~/.ansible
# curl -k -LO https://raw.github.com/ansible/ansible/# devel/plugins/inventory/ec2.ini
# curl -k -LO https://raw.github.com/ansible/ansible/devel/plugins/inventory/ec2.py
# chmod +x ~/.ansible/ec2.py
```

#### .bash_profile

```
export AWS_ACCESS_KEY_ID='YOURACCESSKEYID'
export AWS_SECRET_ACCESS_KEY='YOURSECRETACCESSKEY'
export EC2_INI_PATH=~/.ansible/ec2.ini
```

```
# . .bash_profile
```


### ping
セキュリティグループで Port22を許可しておく

```
# ansible ec2 -i ~/.ansible/ec2.py -u ec2-user -m ping
1.2.3.4 | success >> {
    "changed": false, 
    "ping": "pong"
}
```
docker で ansibleコンテナ作ってlocalともう1台にpingするまで

#### Dockerfile

```
# Dockerfile
#
#
FROM centos:centos6
MAINTAINER tkni2005

ENV USER_NAME root
ENV USER_PASSWORD hogehoge

RUN yum clean all
RUN yum update -y
RUN yum install -y which rsyslog rsync cronie mailx
RUN cp /usr/share/zoneinfo/Japan /etc/localtime

# repos
RUN rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm

# ssh
RUN yum install -y sudo passwd openssh openssh-clients openssh-server
RUN sed -i '/pam_loginuid\.so/s/required/optional/' /etc/pam.d/sshd
RUN echo "$USER_NAME:$USER_PASSWORD" | chpasswd

# ansible
RUN yum install -y ansible

# ec2-user
RUN useradd ec2-user
RUN mkdir /home/ec2-user/.ssh
RUN echo 'ssh-rsa AAAAB3NzaC1yc2EAAAA(略) hoge' > /home/ec2-user/.ssh/authorized_keys
RUN chown -R ec2-user.  /home/ec2-user/.ssh
RUN chmod 700  /home/ec2-user/.ssh 
RUN chmod 600  /home/ec2-user/.ssh/authorized_keys 
 
# hoge.pem
ADD hoge.pem /hoge.pem

# run     
RUN touch /bin/run ; chmod 755 /bin/run
RUN echo /etc/init.d/sshd start >> /bin/run
RUN echo ssh-agent bash >> /bin/run
          
EXPOSE 22/tcp
```


#### docker build

```
 docker build -t tkni2005/ansible .
```

#### docker run

```
docker run -t -i -p 2222:22 tkni2005/ansible /bin/bash
```

#### sshまわり設定

```
コンテナログイン後
bash-4.1# run
Generating SSH1 RSA host key:                              [  OK  ]
Generating SSH2 RSA host key:                              [  OK  ]
Generating SSH2 DSA host key:                              [  OK  ]
Starting sshd:                                             [  OK  ]
bash-4.1# 
bash-4.1# ssh-add /hoge.pem
Identity added: /hoge.pem (/hoge.pem)
bash-4.1# 
```

#### ansible hosts

```
bash-4.1# cat /etc/ansible/hosts 
10.101.0.68
127.0.0.1
bash-4.1#
```

### ansible -m ping

```
bash-4.1# ansible all -uec2-user -m ping

paramiko: The authenticity of host '127.0.0.1' can't be established.
The ssh-rsa key fingerprint is f4a370547208cd59742523f2760217b9.
Are you sure you want to continue connecting (yes/no)?
yes

paramiko: The authenticity of host '10.101.0.68' can't be established.
The ssh-rsa key fingerprint is 129c632cb6ce3bc298fa19277938cbf5.
Are you sure you want to continue connecting (yes/no)?
yes
127.0.0.1 | success >> {
    "changed": false, 
    "ping": "pong"
}

10.101.0.68 | success >> {
    "changed": false, 
    "ping": "pong"
}

bash-4.1#
```
nagios設定が面倒な環境用の素案

```bash:bin/cron_check_diskfree.sh
HDD_FREE=`df -hm /mnt/target | awk '/\//{print $4}'`
if [ $HDD_FREE -lt 1000 ];then
    echo disk free space is too small: $HDD_FREE \
     | mail -s "hdd space warning" mymobile@domain.com -- -f nagios@`hostname`
fi
```

fcrontab -e

```bash:cron登録
9 0 * * *           $HOME/bin/cron_check_diskfree.sh
```
Rails4対応CMS「ComfortableMexicanSofa」のプロジェクト作成方法


### Rubyのインストール

環境：Ubuntu 14.04LTS

* RVMのインストール

```
$ curl -sSL https://get.rvm.io | bash
$ source /home/(UserName)/.rvm/scripts/rvm
```

* Ruby2.1.2のインストール

```
$ rvm install 2.1.2
$ rvm default 2.1.2
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
```

### ComfortableMexicanSofa CMSプロジェクト作成

* 必要なモジュール・Gemをインストール

```
$ sudo apt-get install libxml2-dev libxslt2-dev nodejs
$ gem install bundler
$ gem install comfortable_mexican_sofa --no-ri --no-rdoc
```

* Railsプロジェクトを作成

```
$ rails new mycms
$ cd mycms
```

* Gemfileに追記

```
gem 'comfortable_mexican_sofa'
```

* ビルド

```
$ bundle install
$ rails generate comfy:cms
```

* 以下のようなロゴが表示させる

```
    ____                 __            _        _     _      
   / ___|___  _ __ ___  / _| ___  _ __| |_ __ _| |__ | | ___ 
  | |   / _ \| '_ ` _ \| |_ / _ \| '__| __/ _` | '_ \| |/ _ \
  | |__| (_) | | | | | |  _| (_) | |  | || (_| | |_) | |  __/
   \____\___/|_| |_| |_|_|  \___/|_|   \__\__,_|_.__/|_|\___|
   __  __           _                   ____         __       
  |  \/  | _____  _(_) ___ __ _ _ __   / ___|  ___  / _| __ _ 
  | |\/| |/ _ \ \/ / |/ __/ _` | '_ \  \___ \ / _ \| |_ / _` |
  | |  | |  __/>  <| | (_| (_| | | | |  ___) | (_) |  _| (_| |
  |_|  |_|\___/_/\_\_|\___\__,_|_| |_| |____/ \___/|_|  \__,_|
```

* db:migrateの実行

```
$ rake db:migrate
```

* Rails Serverの起動

```
$ rails s
```

### 動作確認

「localhost:3000/admin/」にアクセスして、以下のユーザー名とパスワードを入力します。
ユーザー名：username
パスワード：password

以下のようなUIで、ページを作成することができます。

* ログイン画面

![ログイン画面.png](https://qiita-image-store.s3.amazonaws.com/0/34365/d4e786f6-d2f4-9f79-c019-c48d7136f003.png "ログイン画面.png")

* ページ作成画面

![ページ作成.png](https://qiita-image-store.s3.amazonaws.com/0/34365/beacc297-3bbe-785b-bd9a-72620668583b.png "ページ作成.png")



### 参考URL

ComfortableMexicanSofa (GitHub)
https://github.com/comfy/comfortable-mexican-sofa

RubyGems
https://rubygems.org/gems/comfortable_mexican_sofa
rspecコマンドに色を付けてフォーマットを指定する

rspecを実行するときに色がつくようにオプションをつけます。

```bash:--colorオプションを指定
bundle exec rspec --color --format d
```
色がつきます。

# rspecのオプションを確認
ヘルプを見るとオプションはこんな感じ

## カラー

```
-c, --[no-]color, --[no-]colour  Enable color in the output.
```

## フォーマット

```
-f, --format FORMATTER           Choose a formatter.
                                   [p]rogress (default - dots)
                                   [d]ocumentation (group and example names)
                                   [h]tml
                                   [j]son
                                   custom formatter class name
```
ログインしたらサーバの状態を表示させる


~/.bashrcとかにかけば良い。

```bash:~/.bashrc
startup() {
    grep model\ name /proc/cpuinfo
    df -h /
    free -m | grep cache
    sensors | grep C
}
if [ $SHLVL -eq 1 ];then
    startup
fi
```

こんな感じか
secret_token.rb/セッションという概念

#セッションについて
Railsのsecret_tokenの意味がよく分かってなかったので少し調べたことのメモ。まず「セッション」という概念について。

セッションとHTTPというステートレスなプロトコル上において、一連の通信、およびそれを実現するのに必要な「状態」を記憶しておく仕組みのことだ。もうちょっと噛み砕いてみる。

よくあるたとえだけど、以下のような流れを考える。

あるショッピングサイトにアクセスする。
↓
ログインする
↓
Ａを買い物かごに入れる
↓
Ｂを買い物かごに入れる

当然私たちの脳内文脈では、「ログインした後」に「商品をかごに入れてる」んだから何もおかしなことはないわけだけど、最初の方に書いた文章を思い出してもらうと、
**HTTPというステートレスなプロトコル**
とある。つまり、素のままだとログイン後に送る通信の上に「私は今ログインしていますよ」、という状態情報を乗せることはできないのだ。不便。
しかし実際のwebアプリケーションではちゃんとログアウトするまで「今ログイン中」という文脈、状態を保持してページ遷移してくれる。これを実現する仕組みをセッションという。

#セッションの仕組み
webアプリケーションは**セッションID**という仕組みでこれを実現した。全然難しいことは無くて、状態はサーバ側で管理して、その一つの一連のアクセスとの対応のためのIDを割り振ってしまうという方式だ。
そうすると、さっきの流れも、
あるショッピングサイトにアクセスする。
↓
ログインする（セッション開始、IDが割り振られる）
↓
Ａを買い物かごに入れる（IDからこのセッションは「ログイン済み」であるという文脈が保たれている）
↓
Ｂを買い物かごに入れる（以下同上）

となるわけだ。めでたい。
このセッションIDの受け渡し方法には幾つかパターンがある。
1. Cookieに乗せて渡す
2. URLに乗せて渡す
3. フォームデータに埋め込む
の三つだ。大体そのままなのでここは細い説明説明ははぶく。

#セッションに関してのセキュリティ
##攻撃
###セッションハイジャック
分かりやすい名前の通り、セッションの乗っ取りのことを指す。さっき上げた例のように、セッションによって「ログインしている」という状態を管理する。よってセッションIDがばれたらパスワードとか関係なく、「ログイン状態」が盗まれる。こわい。
###セッション・フィクゼーション
これはちょっとだけややこしい。まず、対象のwebアプリケーションから発行されうるセッションIDを取得する。次にそのセッションIDを適当な人間のクッキーとかにセットする（適当なページを踏ませるとかする）。そして、その人にwebアプリケーションにログインしてもらう。そうすることによってそのセッションIDがログイン状態と紐づけられる。よってログインされる。一言で言うとユーザーに自分のセッションIDでログインしてもらう、ということだ。
###CSRF
これはセッションが張られているユーザーにスクリプトを読み込んでもらって、色々変なことをする。

##サーバー側の対策
###セッションIDをわかりにくくする
当然だが、割れたら終わりなので、まずこういう対策がある。基本的に乱数になるらしい。
これがsecret_token.rbと関係してくる。
###その他の対策
本題からはちょっとだけ外れるので、
http://itpro.nikkeibp.co.jp/article/COLUMN/20081010/316688/?ST=selfup&P=1
を参照されたし。

#ようやく本題
このセッションIDを暗号化するのに使用されるのが、
`config/initializers/secret_token.rb`
である。ここに書かれてる乱数を種にしてセッションIDが生成されるので、ばれないように.gitignoreしておきましょうね、という話であった。本題短すぎる……

#おわり
セッション関連の知識がついてよかった。なお、
http://itpro.nikkeibp.co.jp/article/COLUMN/20081010/316684/
の記事をだいぶ参考にさせていただきました。ありがたや。
間違いがあったら指摘お願いします。
screenで、別のウィンドウにコマンドを送る

# 背景

もともとの背景は、諸々のShell的なコマンド（pythonだったりpsqlだったりgnuplotだったりmongoだったり）に、zshの補完やヒストリの機能を持ち込めればいいのになと思った所からです。

zshで（補完、ヒストリやpercolなんかを駆使して）コマンド文字列を作り
そいつを、別のウィンドウ上で実行したい、ということです。

別のウィンドウでは、たとえばpythonが動いていたり、別のサーバだったりするかも知れません。

# 方法

先ず、``screen -X split``などして、screenを分割しておきます。
片方は、コマンドラインを作る用の端末、もう片方では、目的のコマンドを起動しておく。

```zsh:.zshrcに追加
send_command_next_windos() {
    command=$BUFFER:gs/\"/\\\\\"/
    screen -X eval "focus" "stuff \"$command^M\"" "focus"
    print -s "$BUFFER"
}

zle -N send_command_next_windos
bindkey '^X^M' send_command_next_windos
```
screenの``eval``コマンドは、引数をscreenのコマンドとして順番に実行します。
``focus``で、分割されたウィンドウの切り替えて、``stuff``は、引数を標準入力に入力します。
^Mは改行をメタ文字で入れてください。
終わったらまた``focus``で戻ってきます。
``print -s`` は、ヒストリに入れるみたいです。

"をエスケープするようにしたいんですけど、なんか良いやりかたは無いでしょうか？

いろいろと肉付けはできると思いますが基本的な動きとしては、こんな感じです。

* 実行したら、コマンドを消すようにしても良いかも。このままでも、いろいろ編集できて意外と便利感。
* fcコマンドを上手く使って、historyを別のものにする、とか
* 対象コマンドに応じてモードを切り替えて、引数の補完とかまでできたらいいなぁ、とか。
* 対象コマンド側で補完機能を持っているような場合（psqlなど）それが死んじゃうなぁ、とか。
* \$BUFFERを送る、もいいですし、$BUFFERを評価した標準出力を送る、もよさそうかも、と思ったり。
基盤地図情報（数値標高モデル）（5mメッシュ（標高））のGeoJSONタイルのビューア

さきほど作成したDEM5AのGeoJSONタイルのビューアは、次のようになる。

```html
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <title></title>
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css"/>
    <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
    <script src="http://handygeospatial.github.io/mapsites/js/leaflet-hash.js"></script>
    <script src="http://handygeospatial.github.io/mapsites/js/TileLayer.GeoJSON.js"></script>
    <style>
      body {padding: 0; margin: 0}
      html, body, #mapdiv {height: 100%; width: 100%;}
      .leaflet-container {background: #fff;}
    </style>
  </head>
  <body>
    <div id="mapdiv">
    <script>
      var std = L.tileLayer(
        'http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png',
        {maxZoom: 24, maxNativeZoom: 18,
         attribution: '地理院タイル（標準地図）'});
      var dem = new L.TileLayer.GeoJSON(
        './{z}/{x}/{y}.geojson',
        {minZoom: 18, maxNativeZoom: 18, maxZoom: 24, 
         attribution: '基盤地図情報（数値標高モデル）（5mメッシュ（標高））'},
        {pointToLayer: function(feat, latlng) {
           return L.circleMarker(latlng, {radius: 4});
         },
         onEachFeature: function(feat, layer) {
           var popupString = '<div class="popup">';
           for (var k in feat.properties) {
             var v = feat.properties[k];
             popupString += k + ': ' + v + '<br />';
           }
           popupString += '</div>';
           layer.bindPopup(popupString);
         }
        });
      var map = L.map('mapdiv', {
        center: [35.68467, 139.65380], zoom: 18,
        layers: [std, dem]});

      var hash = L.hash(map);
      L.control.layers({'地理院タイル（標準地図）': std}).addTo(map);
    </script>
  </body>
</html>
```
python -m SimpleHTTPServer とかやって見ることができる。（ベクトルタイルなので、file: スキームでは動かない場合がある。）