OmniAICreator/Qiita-1.07M huggingface dataset:
Proxmox4.2リリース

## 参考

* [Roadmap - Proxmox VE](http://pve.proxmox.com/wiki/Roadmap#Proxmox_VE_4.2)

## 特筆する点

* LXCの alpine, ubuntu16.04 サポート
* しかしubuntu16.04でavahi dameonを動かすと[遅くなる](https://forum.proxmox.com/threads/ubuntu-16-04-template-for-proxmox-4-1.27034/)ので注意。

## changelog

> Released 27.04.2016: See Downloads
> 
> * GUI update to Sencha Ext JS 6, including new icon set and dynamic performance charts
> * based on Debian Jessie 8.4.0
> * Linux kernel 4.4.6
> * KVM/qemu 2.5.1
> * installer: LVM thin or ZFS plugin pre-configured
> * LVM thin support
> * Let´s Encrypt support
> * DRBD9: drbd 9.0.2 kernel module and drbdmanage 0.95
> * LXC: improved container setup
> * LXC: network rate limits
> * LXC: adding mount-points via GUI
> * LXC: pct can mount rootfs for read/write access of stopped or running containers
> * LXC: backup/snapshot improvements, including proper backup and restore of ACL
> * LXC: add support for Alpine Linux, Ubuntu 16.04
> * HA manager improvements
> * new confirmation dialog to prevent accidentally removal of a virtual machine or container
> * updated GUI translation (especially French, Italian and German)
> * many new and improved manual pages
> * countless bug fixes and package updates (for all details see bugtracker and GIT)
Learning Rails 4 (Create User Model)


[前回はこちら](https://qiita.com/joji/items/16978994b24e57944238)

```bash
rails g model User name:string approved:boolean deleted:boolean
```

```bash
vi db/migrate/20160426100041_create_users.rb 
```

Change this line

```ruby:20160426100041_create_users.rb 
t.boolean :approved, default: true
```

current 20160426100041_create_users.rb

```ruby:20160426100041_create_users.rb 
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.boolean :approved, default: true
      t.boolean :deleted

      t.timestamps
    end
  end
end
```

Create MySQL table

```bash
rake db:migrate
```

Confirm users table

```bash
 mysql -uroot learning_development -e "desc users"
```

```bash
rails console
```

```ruby
User.create(name: "taro", approved: true, deleted: false)
v.save
```

```ruby
User.create(name: "yamada", approved: true, deleted: false)
```

```
exit
```

You can confirm it.

```bash
rails db
```

```mysql
SELECT * FROM users;
```

```bash
exit;
```

or You can check it like this.

```bash
mysql -uroot learning_development -e "SELECT * FROM users"
```
lib-noirでアクセス権限を設定する

セッションに格納されているキーで判別し、権限を分けています。
defroutes ではなく、def-restricted-routes を使わないといけないことに気づかずハマってしまいました。

```Clojure:core.clj
(def-restricted-routes api-routes
  (GET "/" req (index-page)
  (GET "/hoge" req (hoge-page))

(defn user-access [req]
  (contains? (:session req) :user))

(def access-rules
  [{:uri "/hoge" :rule user-access}])

(def app
  (noir-middleware/app-handler
    [api-routes]
    :access-rules access-rules))
)
```
S先輩にきいてみたっ！- Amazon Web Serviceにまつわるエトセトラ - 第1話 起動

最近、AWSの勉強をしています。
ただ、どうも勉強が地味なので、AWSを面白く勉強するためのコンテンツが欲しいと思いました。
が、なかなか見つからないため、自分たちで作ろうと思った次第です。
有志が持ち回りで、ストーリー仕立てでAWSを勉強していきます。
なお、ストーリーはフィクションであり、実在の人物・団体とは一切関係ありません。



# 1話　起動

O上司から呼ばれたのは、春から夏に移ろうと木々が全力で新緑を芽吹かせている、そんな季節の朝だった。
「A君な、頑張ってもらったあの案件、失注したわ。」
いつもの快活なトーンでO上司は話し始めた。
「先方からメールで連絡もらってな。今回は別の会社にお願いするそうだわ。まぁ、やっぱりイニシャルにかかるコストが重かったって話だわ。」
『やっぱりか。。。』
頑張ってこなかったわけではない。それなりに思い入れを持ってプロジェクトを進めてきたつもりだった。しかしながら、見積もりを出した時の顧客の曇った顔を見ていたAは、この結果を予期していた。
「申し訳ありませんでした。」
かすれた声でAは言った。
「まぁ、気を落とすなよ！」
Oは最後まで快活だった。

席に戻ったAは、ハードウェアベンダーから出された数千万の見積書をゴミ箱に捨てた。
顧客のECサイトの刷新を行うプロジェクトで必要な費用の1/3を占めていた。

後ほど顧客からこっそりと教えてもらったところによると、今回のプロジェクトを受注した会社はクラウド、Amazon Web Servicesを組み込んだ提案をしたそうだ。その柔軟さが受注の要因となったということだ。

もちろん、Aも、クラウド、PaaSを全く知らなかったわけではない。ただ、セキュリティーや費用について、提案に盛り込むためには自分の知識に自信が持てなかった。

「やっぱり、勉強してみるかな。AWS。」
ネット上で情報を集めていくと、AWSには資格試験があることがわかった。
「試験対象となる分野か。」
[このPDF](http://media.amazonwebservices.com/jp/certification/AWS_certified_solutions_architect_professional_blueprint_final.pdf) によると、AWS 認定ソリューションアーキテクト – プロフェッショナル の試験は以下の分野で出題されることがわかった。
1. 高可用性および事業継続性
2. 原価計算
3. デプロイメントマネージメント
4. ネットワーク設計
5. データストレージ
6. セキュリティ
7. 拡張性と伸縮自在性
8. クラウド移行およびハイブリッドなアーキテクチャ

Aはこの分野にそって勉強していくことを決めた。

「あ、A君、AWSの資格とるの？」
「S先輩。」
振り返ると、そこにはS先輩がいた。
「S先輩。たしかAWSの資格お持ちでしたっけ？」
「もってるよー。アーキテクトの アソシエイト。次、プロフェッショナル取ろうと思ってるんだ。A君もアソシエイト持ってるの？みてるのプロフェッショナルだよね。」
「えっ？」

S先輩は、プロフェッショナルを受けるためにはアソシエイトを持っていなければならないことを教えてくれた。

「じゃ、最初はアソシエイトを勉強してみたら？」
「いえ！はじめからプロフェッショナル目指して勉強してやろうと思います！自分、登ろうとする山が高いほうが燃えるたちなので！」
「あ、あぁ。そうなの。お互い、頑張ろうね。」
「はい。分からないところがあったら教えて下さい！」
「う、うん。」
『よしよし、これでS先輩と話す口実ができた。』

そして、Aは勉強に取り組んでいくのであった。

。。。。なんだか、AWSの宣伝っぽくなってきましたが、続きます。
次回は「1. 高可用性および事業継続性」の勉強です。~~来週~~ GWにつき、再来週の投稿を予定しています。
このページをストックしていただくと、続きが発刊されたらリンクを付けて通知するようにします。

！！！！！！！！！！！！！！更新！！！！！！！！！！！！！！
[第2話 両得 - 高可用性および事業継続性 -](http://qiita.com/kazuqqfp/items/1e326e1452468c33800b)
[第3話 お金 - Amazon Web Serviceの原価計算 - ](http://qiita.com/imafuku/items/b40a5a9b049c38fdbd48)
[第4話 自動 - Amazon Web Serviceのデプロイメントマネジメント - ](http://qiita.com/aikawa2002/items/191d34b5b7c2c836a69f)
`git diff` で sjis の差分をみるために

現代でもソースコードが sjis なことがあります。

git の diff が文字化けしてこまるときには、pager で `lv -c -Is` のように lv を pager にして

1. `-c` 色付きの、
2. `-Is` 入力を sjis に

すると良い。

```csh:~/.gitconfig
[core]
  pager = lv -c -Is
```

もしくは `git diff | lv -c -Is` でもよい。
Bluemixでデータ分析！dashDBとTwitter連携

前回↓、とりあえず触ってみたので、今度はBluemixっぽいことをしてみたいということで、Twitterのデータを読み込んでみた。
http://qiita.com/azzeten/items/d10fa47d115093cffef8

先に結論を言ってしまいますと、こんな感じのグラフを書いていきます。
たとえば、どの国からのTweetが多いかとか、何日のtweetが多いかとか、ポジティブな発言が多いのかnegativeな発言が多いのかとか、他にはどんなハッシュタグと一緒にtweetされているのかとか、そういうのが見れるようです。
![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/339fe348-9752-15c7-9431-5b3b536561b4.jpeg)

で、もちろん、これらのデータはリレーショナルなDB表に突っ込まれているので、自分でクエリを書いたりなんやかんやするってことが可能というわけですね。

では、張り切ってやってみよー。

## まずはTwitterのデータを読込準備：Bluemixで「Insight for Twitter」のサービスを作成する
dashDBにTwitterのデータを取り込むには、まずTwitterのデータを読み込むためのBluemixのサービス「Insight for Twitter」を作成。
特に何も難しいことは考えずクリックしまくればOK。
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/b5748d0e-c657-94b7-a613-5e10b07ce691.jpeg)

## dashDBからTwitterのデータを取り込む
前回の記事で紹介したように、専用URLにアクセスし、左ペインから「Load」→「Load Twitter Data」をクリック
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/fc8889f6-daa6-fd09-1315-585b52b79c77.jpeg)

どのInsight for Twitterのサービスを使うのかと聞かれるので、先ほど作成したものを選んで、Next
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/c5c9ccb6-7816-205b-9c3a-ecf453209e30.jpeg)

①Twitterデータの具体的に何を取り出したいのかを指定する。たとえばハッシュタグとかが指定できる。ここでは#dashDBとしてみます。
②入力したらGetTweetCountをクリック。#dashDBで、どれくらいのデータ規模になるかがわかります。データは入らないと意味がないので、ここで確認。
③OKそうだったらNext
![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/d55d91d0-70a4-96c9-7a20-9ca32e28c4af.jpeg)

Twitterのデータをimportすると、複数のテーブルに分けていろんなデータが入るようで、それらのテーブルがひとめでわかるようにprefixを入力せよとウィザードにでてきます。
適当にいれて、Next。
![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/4e36a933-2445-ce44-7301-bec82c37a5ca.jpeg)

あとは待つだけです。
![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/ce057156-e7bb-0eca-9eb6-e2a1330c3258.jpeg)


##というわけで、冒頭の結果が返ってくるわけです。

まだまだ自分もいじりきれていませんが、試してみるのは面白いなと思います。
【AndroidStudio】パッケージ名を変更してみた

#AndroidStudio で Android アプリのパッケージ名を実際に変更してみた

Android Studio で Android アプリのパッケージ名を変更した。ネット上に情報はあるが、それらと微妙に違ったので備忘録的にメモ。AndroidStudio は Version 2.0。

[主に参考にしたのはこちら](http://qiita.com/nusa/items/413c8a131ebc451e80f8)

##パッケージ名 xxx.yyy.zzz を aaa.bbb.ccc にする場合の手順

##0. 念のためにプロジェクトをバックアップ
##1.AndroidManifest.xmlを編集する

```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="aaa.bbb.ccc">
```

##2.build.gradle に applicationId を追加
　今回のプロジェクトにはなぜか build.gradle に applicationId がなかったので、android -> default Config の中に追加。
(この行は最後に削除したので、追加しなくてもよかったかも...)

```build.gradle
android {
    defaultConfig {
        applicationId "aaa.bbb.ccc"   // この行を追加
        minSdkVersion 21
    }
}
```

##3. ディレクトリ名の変更
###3.1 パターン１(新しめ？)
　プロジェクトのディレクトリ構造が
>[プロジェクト名]\app\src\androidTest\java\xxx\yyy\zzz\
>[プロジェクト名]\app\src\main\java\xxx\yyy\zzz\
>[プロジェクト名]\app\src\test\java\xxx\yyy\zzz\

となっているところを
>[プロジェクト名]\app\src\androidTest\java\aaa\bbb\ccc\
>[プロジェクト名]\app\src\main\java\aaa\bbb\ccc\
>[プロジェクト名]\app\src\test\java\aaa\bbb\ccc\

に変更

###3.2 パターン２(割と古め？)
　プロジェクトのディレクトリ構造が
>[プロジェクト名]\src\xxx\yyy\zzz\

となっているところを

>[プロジェクト名]\src\aaa\bbb\ccc\

に変更

##4. パッケージ名を置換
　java ソース中の pakege * や import * の中の "xxx.yyy.zzz" を "aaa.bbb.ccc" に置換する。Android Studio の [Refactor]->[Rename] を使っても、なぜか zzz が ccc に変わるだけなので、サクラエディター上で [検索]->[Grep置換]と進み Grep置換を起動して

>[プロジェクト名]\src\aaa\bbb\ccc\

以下のファイルに対して "xxx.yyy.zzz" を "aaa.bbb.ccc" に置換。このときサクラの Grep置換ダイアログ上の [単語単位で探す(W)] はチェックを外す。

##5. Syncする
　AndroidStudio のコードエディターで build.gradle を開くと、上の方に、Sync しろ！と表示されているので Sync を実行。

##6. build.gradle から applicationId を削除
　ここで Run すると、Build はできるが、実機で起動しようとするとエラーになった。理由はわからないが applicationId を削除したらうまくいった。
　もともと build.gradle に applicationId がない場合は追加しなくても良いのかもしれない。次の機会に検証しよう。
WinSCPで踏み台サーバ経由でファイルGet

#### WinSCPで踏み台サーバ経由でファイルGet

コマンドラインから、WinSCPを踏み台サーバ経由で使用します

①ScpTest.txtを用意する

ScpTest.txt
192.168.1.1がファイルを取得したいサーバ
172.16.1.1が踏み台サーバとします
option sftp〜TunnelPasswordPlainまでは改行しないでください

```
option batch abort
option confirm off

open sftp://user:passwd@192.168.1.1 -rawsettings ProxyMethod=1 Tunnel=1 TunnelHostName=172.16.1.1 TunnelPortNumber=22 TunnelUserName=user TunnelPasswordPlain=passwd

lcd "C:\aaa\Desktop\getfiles"

get /tmp/20160101/*

close 
exit

```

②実行方法

```
"C:/Program Files/WinSCP/WinSCP.exe" /console /script=C:/aaa/ScpTest.txt /xmllog="C:/aaa/Scplog.log"
```
Arch LinuxにSwiftをインストールする

# はじめに
Appleが開発したSwiftがオープンソースになって、Linux上で動くようになりました。公式バイナリはUbuntu版しかありませんが、これを利用した"swift-bin"パッケージがAURに登録されています。これをそのまま利用できればよかったのですが、一筋縄ではいかないので工夫しましょう、というのがこの記事です。

ちなみに、ソースコードからビルドする"swift"というパッケージもありますが、これはこれでビルドにこけたりするのであまりおすすめしません。

# PGP鍵のインポート
依存関係でインストールされるパッケージの中には鍵の照合を行うものがあります。しかしその鍵は自動でインポートしてくれません。インストールを行う前に、手動でインポートする必要があります。今回は2種類の鍵をインポートします。

```sh
$ gpg --keyserver pgp.mit.edu --recv-keys F7E48EDB
$ wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import -
```
先にインポートした鍵は依存関係でインストールされる"ncurses5-compat-libs"のためのもので、後にインポートした鍵はswift-binのためのものです。

# 依存関係の解決
~~リポジトリにあるlibtinfoのバージョンが6になってしまいましたが、Swiftはバージョン5を要求しています。swift-binパッケージの依存関係では6系がインストールされ、動作に支障があるので5系をインストールします。AURにあるパッケージなので、yaourtを用いてインストールを行います。~~

```sh
$ yaourt -S libtinfo-5
```

**2016年4月27日に、依存関係として登録されていたlibtinfoがlibtinfo-5に変更されたため、この作業は必要なくなりました。**

# Swiftのインストール
ここに来てやっとSwiftがインストールできます。

```sh
$ yaourt -S swift-bin
```

# 動作確認
## バージョン確認
--versionで確認できます。

```sh
$ swift --version
Swift version 2.2 (swift-2.2-RELEASE)
Target: x86_64-unknown-linux-gnu
```

# 対話環境のテスト
対話環境を試してみます。対話環境はCtrl+Dで抜けられます。

```shell-session
$ swift
Welcome to Swift version 2.2 (swift-2.2-RELEASE). Type :help for assistance.
  1> 1 + 1
$R0: Int = 2
  2> print("Hello World")
Hello World
  3> let num = 2
num: Int = 2
  4> num * 2
$R1: Int = 4
  5>  
```

ちなみに対話環境中では常に行末でエンターを押さないと何かおかしいことになります。

```shell-session
% swift
Welcome to Swift version 2.2 (swift-2.2-RELEASE). Type :help for assistance.
  1> print("Hello World 
  2.     ") 
  3.  
  4.  
```

# コンパイラのテスト
コンパイラの動作も確認してみましょう。テスト用のコードを書きます。

```swift:test.swift
let nums = (1...10)

for num in nums {
  print(num)
}
```

コンパイルして実行してみます。

```shell-session
$ swiftc test.swift
$ ./test
1
2
3
4
5
6
7
8
9
10
```

バッチリですね。

# おわりに
そういうわけで、無事にSwiftをArch Linuxにインストールすることができました。Linux上での動作はまだまだ怪しいところがありますが、とりあえず試してみたりだとか、コンパイルできるスクリプト言語の代わりに使ってみるだとか、いろんな方法で遊んでみてください。
display: inline-block で配置した隣接要素の空白を消す方法

# 結論

親要素に `font-size: 0;` を指定して子要素に(任意の値) `font-size: xxx;` を指定するだけ。

```code:css

ul {
  font-size: 0;
}

li {
  font-size: 1rem;
}

```

## 参考の画像とデモ

![並び](https://qiita-image-store.s3.amazonaws.com/0/119581/6dba0a1d-8411-d209-7a9d-6945a502e6e6.png)

http://codepen.io/norhythm/pen/vGzeax

## よくあること

* htmlを生で記述していないので `li` を詰めれない
    * slimとかだと困る
        * タグに対して `<>` で詰めきれない
* `margin` とかで詰めるとブラウザ毎に何か違う

なんかしらこういうのがあると思います。

## こういう時に便利

下記みたいなことしなくて良くなるので、記述が綺麗になるぞ！

```code:html
<ul>
  <li>a</li><li>b</li><li>c</li>
</ul>

<ul>
  <li>a</li><!--
  --><li>b</li><!--
  --><li>c</li>
</ul>
```

## というお話だったのさ

役に立つかは不明
Rails4 | Model.select ( SQLクエリ上でカラムを絞る )

# .select

たとえば次のように書くと。
内部的に発行されるSQLとして、id カラムだけを得ることが出来る。

```rb
User.select(:id)
```

実際に確認してみよう。 ( *`users`.`id`* の部分に注目 )

```rb
User.select(:id).to_sql

# => "SELECT `users`.`id` FROM `users`"
```

もちろんこの場合は、「未指定のカラム」をオブジェクト上で得ることは出来ない。
id だけを得ているのに、 name を出そうとしてもダメだｋ．

```rb
User.select(:id).first.name

# => NoMethodError: undefined method `name'
```

# 用途

ひとつのカラムに膨大なデータが入っていたりして。
メモリを食う時に使うと良い。

( いつでも必要なカラムだけを得よ、という話もある )

# Rails3 以前

Rails3 では書き方が古い。
次の書き方は、Rails4では廃止されている。

```rb
User.all(:select => 'id')
```

# 参考

- [モデル(model) -  - Railsドキュメント](http://railsdoc.com/model)

# 環境

- Rails 4.2.6



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Phoenixガイドラインを読んでみた(7) - Template -

## はじめに

[前回](http://qiita.com/dynamitecoolguy/items/894c394faf9c3690ec5d)はViewを見てきました。
今回は[テンプレート](http://www.phoenixframework.org/docs/templates)です。
[次回](http://qiita.com/dynamitecoolguy/items/8529bbf96fd6b278ef1a)は、Channelになります。

## 鋳型

PhoenixのTemplateはpre-compiledなので速いです。
Phoenixのデフォルトのテンプレートシステムは[EEx](http://elixir-lang.org/docs/stable/eex/EEx.html)です。EExでは、RouterやViewのようなファイル生成も行います。
テンプレートは、標準では`web/templates`ディレクトリの下に、Viewの先頭部分と同じ名前のディレクトリを作り、そこに格納されます。

### リスト表示

テンプレートで、文字列や数字を記述する例はいままで出てきましたが、リストの値を表示したい場合にはどうすればよいでしょうか。
答えは、Elixirの内包表現(Comprehension)を使うことです。

`conn`に含まれるリストの全キーを表示する例を書いてみます。まずViewです。

```
defmodule HelloPhoenix.PageView do
  use HelloPhoenix.Web, :view

  def connection_keys(conn) do
    conn
    |> Map.from_struct()
    |> Map.keys()
  end
end
```

次にテンプレートを書いてみます。

```
<div class="jumbotron">
  <p><%= handler_info @conn %></p>

  <h3>Keys for the conn Struct</h3>

  <%= for key <- connection_keys @conn do %>
    <p><%= key %></p>
  <% end %>
</div>
```

注意が必要なのは、何かを出力する場合は、常に、"<%= %>"を用いなければならないということです。何も出力する必要が無い場合は"<% %>"と"="は必要ありません。

### テンプレートの中のテンプレート

上記の例でキーを表示するコードが"<%= key %>"と単純なのでいいですが、これが複雑になると可読性が著しく低下します。
解決方法として、キーを表示する部分を別のテンプレートにすることです。

キーを表示するテンプレートとして、`web/templates/page/key.html.eex`を以下のように作成します。

```
<p><%= @key %></p>
```

ここで、`key`を`@key`にしているのは、呼び出しもとでrender関数のパラメータとして値を渡すためです。
`@key`は実際には`<%= {:ok, v} = Access.fetcch(assigns, :key); v %>`と変換されます。

上記で記述したTemplateは次のように変更します。

```
<div class="jumbotron">
  <p><%= handler_info @conn %></p>

  <h3>Keys for the conn Struct</h3>

  <%= for key <- connection_keys @conn do %>
    <%= render "key.html", key: key %>
  <% end %>
</div>
```

### View間でのTemplate共有

Templateを複数のViewで共有したいというケースはままあります。こういう場合、render関数に明示的にViewを指定することで、他のViewのTemplateを使用することができます。

例えば、先ほどの例で`key.html.eex`を複数のView間で共有したいとします。
まず共有用のViewを作成することにします(`web/views/shared_view.ex`)。

```
defmodule HelloPhoenix.SharedView do
  use HelloPhoenix.Web, :view
end
```

次に、このView用のTemplateディレクトリを作成します(`web/templates/shared`)。そして、先ほどの`key.html.eex`をこのディレクトリに移動します。

後は、TemplateをこのViewとサブのTemplate用に変更します。

```
<%= for key <- connection_keys @conn do %>
  <%= render HelloPhoenix.SharedView, "key.html", key: key %>
<% end %>
```
Error detected while processing function <SNR>53_getKeyAlias: 

.vimrcをいじってたら、vim開くごとにエラー出るようになって困ったのでメモ

エラーはこんな感じ

```
rror detected while processing function <SNR>53_getKeyAlias:
line    6:
E118: Too many arguments for function: nr2char
E15: Invalid expression: nr2char(a:code, 1)
line    8:
E121: Undefined variable: alias
E15: Invalid expression: alias
```

nr2char(a:code, 1)な箇所を検索すると、最近落とした wenresizerプラグインだった模様。
以下の対応したら直った。


```vim:winresizer.vim
$ vim .vim/bundle/winresizer/plugin/winresizer.vim

=== 略 === 180行目くらい
fun! s:getKeyAlias(code)
  if a:code == 13
    let alias = "Enter"
  elseif a:code == 32
    let alias = "Space"
  else
"    let alias = nr2char(a:code, 1) ←古いほう 
  let alias = nr2char(a:code) 
  end
  return alias
endfun
```
rubyだったりbundle exec rubyだったりするのが面倒だったのでどうにかする

bundleで管理しているプロジェクトかそうじゃないかを考えながら、「ruby test.rb」したり「bundle exec ruby test.rb」したりするのが辛くなってきたので、適当に判断してくれるようなシェルスクリプトを書いたらものすごく捗るようになりました。

「bundle check」の結果で判定するだけの簡単なスクリプトですが、いい感じに役に立ってくれています。ついでに、引数がない時はirbを起動するようにもしてみました。

かならずbundle checkする分ちょっと動作が遅くなりますが、まぁ許容範囲内です。

```bash:rb
#!/bin/bash
bundle check 2>&1 > /dev/null
case $? in
    0)
        if [[ $# == 0 ]]; then
            bundle console
        else
            bundle exec ruby "$*"
        fi
        ;;
    10)
        if [[ $# == 0 ]]; then
            irb
        else
            ruby "$*"
        fi
        ;;
    *)
        bundle check
        ;;
esac
```

ちなみに、vimのquickrunで実行する対象にしたらもっと捗りました。（私はこのスクリプトを「rb」で実行できるようにしてます。）

```vim:.vimrc
 let g:quickrun_config = {
             \ 'ruby': { 'command': 'rb' }
             \ }
```

前までは、[vimのquickrunでrubyをbundle exec rubyする方法](http://qiita.com/lighty/items/12d86c3c9570e1b3e5e1) に従って設定していたのですが、これだと、いちいち「:setl ft=ruby.bundle」するのが面倒だったんですよね。
Learning Rails 3 (ER map and what we want to create)



[前回はこちら](https://qiita.com/joji/items/5e61c9a96a387ad57933)

1. We will create user
2. We will edit edit user
3. We will delete user
4. We will suspend user
5. we will write review for user
6. We aill add items for user

ER map is here.

![er_rails.png](https://qiita-image-store.s3.amazonaws.com/0/39073/67958dbd-84fe-d3c1-b46b-1eb395104ca2.png "er_rails.png")
[Unity] Leapmotion Orionで手のモデルの位置を簡単に取得する


Leapmotionが神アップデートされ、トラッキング精度とできることが格段によくなりました。
ただそれに伴って、APIやら仕組みやらが一新され、以前の感覚で実装するとうまく動きません。

Leapmotion Orionで手のモデルの位置とか手のひらの法線とかってどうやって取るのかなーと探していたら、[この質問](https://community.leapmotion.com/t/get-unity-world-space-position-in-4-0-2/4900)を見つけました。

結論から言うと、 `LeapServiceProvider ` を使うことで非常に手軽に手のモデルの位置などの情報を取得することができます。
もっと言うと、 `CurrentFrame` で取得できる `Frame` オブジェクトの `Hand` オブジェクトはUnity上で手のモデルが実際に表示されている位置をすでに保持しているので、 `Hand` クラスの各種値がそのまま使えます。
（ただ、Documentとかから見つけられなくて苦労しました( ;´Д`)）


とても短いコードなので全文載せておきます。

## サンプルコード


```cs
using UnityEngine;
using System.Collections;
using Leap;
using Leap.Unity;
using System.Collections.Generic;

public class AnyHand : MonoBehaviour {

    [SerializeField]
    GameObject m_ProviderObject;

    LeapServiceProvider m_Provider;

    void Start () {
        m_Provider = m_ProviderObject.GetComponent<LeapServiceProvider>();
    }

    void Update() {
        Frame frame = m_Provider.CurrentFrame;
        
		 // 右手を取得する
        Hand rightHand = null;
        foreach (Hand hand in frame.Hands) {
            if (hand.IsRight) {
                rightHand = hand;
                break;
            }
        }

        if (rightHand == null) {
        	return;
        }
        
        // 手のひらの法線
        Vector3 normal = rightHand.PalmNormal.ToVector3();
        
        // 手の向き
        Vector3 direction = rightHand.Direction.ToVector3();

		// 情報がとれたので、あとは煮るなり焼くなりお好きに。
    }
 }
```
[Android] Manage data folder


```sh
# Enter the adb shell
adb shell

# Change to package folder
run-as jp.package.name.app
```

This is only available for debuggable android application.

For setting the application to be debuggable, add this option to your AndroidManifest.xml file.

```xml
<application android:allowBackup="true"
```

**Do not set this option in your release application AndroidManifest.xml.**
Learning Rails 2 (Create rails app)



[前回はこちら](https://qiita.com/joji/items/0dd0e4a113b65b4c9c09)

```bash
mkdir -p /srv/www
```

```bash
cd /srv
```

```bash
chown vagrant:vagrant www
```

```bash
exit
```

```bash
cd /srv/www
```

```bash
rails new learning -d mysql
```

```bash
cd learning
```

```bash
vi Gemfile
```

Comment in 

```Gemfile:ruby
gem 'therubyracer',  platforms: :ruby
```

```bash
bundle install
```

```bash
sudo service mysqld start
```

```bash
sudo chkconfig mysqld on
```

Create table

```bash
mysql -uroot -e "create databae learning_development"
```

or

```bash
rake db:create
```

```bash
cd /srv/www/learning
```

```bash
rails s
```

You can check this URL from your browser
http://192.168.43.200:3000/

![rails.png](https://qiita-image-store.s3.amazonaws.com/0/39073/21800faf-0cee-eb80-4948-bc80fac576d1.png "rails.png")
WordPressのプラグインでMySQLの何か調子が悪かった問題を解決した話

# はじめに
ある日突然、WordPressを動かしているサーバのLAが50を超えました。
インフラエンジニアとしては緊急事態です。
サイトのユーザが離れて行ってしまう非常に危険な状態です。
すぐに原因調査をする必要があり調べることになりました。

# 重い原因はindex.php?
調べたところページの生成に時間が掛かっているようでした。index.phpの実行に時間がかかります。
WordPressでは全てのページを一度index.phpが受け、その後にテンプレートの読み出しなどを行います。
調べたところ[WP Sitemanager](https://ja.wordpress.org/plugins/wp-sitemanager/)のキャッシュ機能が効いていませんでした。
curlでページを取得して末尾を確認しても、SiteManagerのキャッシュで生成されるコメント文がありませんでした。

```bash
$ curl http://example.com | tail
</script>
</body>
</html>
```

本来であれば`</html>`の後ろに`<!-- page cached by WP SiteManager -->`というキャッシュである旨を表示するコメントがあるのですがそれがありません。
もちろんキャッシュが効いていないので想定しているよりかなりサーバが重いです。

# 存在するキャッシュテーブル
すぐにキャッシュされているかどうかを調べみました。
WP SiteMangerではデフォルトでMySQLにキャッシュデータを保存します。そのテーブルを確認しました。
確認したところデータは入っているようです。MySQLの接続をモニタリングしたところキャッシュを保存するUPDATE文は走っていてキャッシュする事自体には問題が無いようです。
ということは読み出しがされていないようです。
読み出しがされない原因について調べることになりました。

# 読み出しが行われなかった理由
色々と調査したところ、PHPからMySQLへの接続がうまく行われてないことが判明しました。
コードを確認したわけではありませんが、どうやらWP SiteManagerでは`mysql_connect()`(若しくは`mysqli_connect()`)を利用しているようです。

これらの接続がうまく行っていませんでした。

`mysql_connect()`では接続する際にsocketを使う場合があります。接続先がlocalhostの場合です。今回のサイトでもデータベースは同じサーバ内にあり、接続先はloclhostとしていました。そのためこれを変更しました。

# 解決策
wp-config.phpでこの接続先を127.0.0.1とするとうまくいきました。

# 解決策その2
`mysqli_connect()`が利用するsokcetを変更しました。　

```conf:/etc/php.d/30-mysqli.ini
mysqli.default_socket=/path/to/mysql.sock
```

テストのために

```bash
$ php -r "mysqli_connect('localhost', 'user', 'password');"
```

を実行して確認しました。

socketがうまく一致しない場合には

```
PHP Warning:  mysqli_connect(): (HY000/2002): No such file or directory in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. mysqli_connect() Command line code:1
```
が出ました。

PHPを使ったMySQLの接続周りでは /etc/my.cnf を使わないことがあるので要注意です。

# 原因
sockファイルの位置を変更したために発生したと思われます。

# その他
同じサーバではBackWPUpというプラグインも動きませんでした。同じようにmysqliを利用していると思われます。
Learning Rails 1 (Setup vagrant, install Rails, install MySQL)


```:bash
mkdir learning_rails
```

```:bash
 cd learning_rails
```

```:bash
vagrant box add "centos_6.6" https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box
```

```:bash
vagrant init
```

```:bash
vi Vagrantfile
```

```:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.define "host" do |node|
    node.vm.box = "centos_6.6"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.200"
  end
end
```


```:bash
vagrant up
```

```:bash
vagrant ssh
```

```:bash
su -
```

```:bash
cd /usr/local/src/
```

```:bash
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz
```

```:bash
tar xvzf ruby-2.3.0.tar.gz
```

```:bash
cd ruby-2.3.0
```

```:bash
./configure
```

```:bash
make
```

```:bash
make install 
```

```:bash
gem install rails -v 4.1.15 --no-rdoc --no-ri
```

```:bash
yum -y install mysql-server
```

```:bash
yum -y install mysql-devel
```
Flashでウィグラーみたいな効果をつけてみたかった

タイムラインで表現しきれない思いが、我々にはある。
時にスクリプトにその思いをぶつけるわけだけれども、たいてい再利用できないクソコードが出来上がる。
しかし、現代、記すことができる。
まずはコードを貼り付ける。

```
import flash.geom.Transform;
import flash.geom.ColorTransform;

var trans:Transform = new Transform(bg);
var colorTrans:ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0);

var w:int = bg.width;
var hh:int = bg.height;
var posiX:int = bg.x;
var posiY:int = bg.y;

bg.addEventListener(Event.ENTER_FRAME, bgclchange);

function bgclchange(evt):void{
	var go:int = Math.random() * 60;
	var ro:int = Math.random() * 255 * 2;
	var bo:int = Math.random() * 60;
	
	colorTrans.greenOffset = go;
	colorTrans.redOffset = ro;
	colorTrans.blueOffset = bo;
	
	if(ro > 140 && ro < 160){
		var vw:int = w * ro / 100;
		bg.width = vw;
		bg.x = posiX + ((w - vw) / 2);
	}else if(ro > 120 && ro < 140){
		var vh:int = hh * ro / 100;
		bg.height = vh;
		bg.y = posiY + ((hh - vh) / 2);
		
	}else if(ro > 200){
		var rand:int = Math.random() * 100;
		if(rand < 50){
			bg.x = posiX + ro/100;
			bg.y = posiY + ro/100;
		}else{
			bg.x = posiX - ro/100;
			bg.y = posiY - ro/100;
		}
	}else{
		bg.width = w;
		bg.x = posiX;
		bg.height = hh;
		bg.y = posiY;
	}
	trans.colorTransform = colorTrans;
}
```

もともとこんな長いものを書くつもりはなかったのだが、コードとは冗長になりがちである。

さて、ウィグラーとは何かということについて、
http://zero.ie-t.net/tutorials/basic/wiggler-motionblur/
今回は上記のURLのようにタイムラインにランダムなキーフレームを打ってくれるAfterEffectsの機能を指す。
Flashをやっていると、あまりのタイムラインの扱いのむつかしさから、上記のようなクソコードがしばしば錬成される。

今回は、bgというmovieClipを、一定のしきい値を設けて、大きさを変更したり、位置を変更したりしている。
常に色は変更している。
色の変更は、下記部分だ。

```
var go:int = Math.random() * 60;
var ro:int = Math.random() * 255 * 2;
var bo:int = Math.random() * 60;
	
colorTrans.greenOffset = go;
colorTrans.redOffset = ro;
colorTrans.blueOffset = bo;
```

いちいち変数に格納しているのは、後で値を使うかなーと思ったからだ。

```
var trans:Transform = new Transform(bg);
var colorTrans:ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0);

~中略~

trans.colorTransform = colorTrans;
```

色の変更は上記コードを宣言後、ひとつ前のコードを呼ぶだけで行える。
TransFormなどについては自分で探してみてほしい。
今回は安直にbgにaddEventListenerをくっつけているのでフレーム毎にランダムな色に切り替わることになっている。
60fpsで試しているので本当にそうなのかわからない。（flashPlayerはコマ落ちしてないだろうか…）
アラートを意識したので、赤の変化量が大きい。

さて、スケールと、位置の調整だが、

```
if(ro > 140 && ro < 160){
	var vw:int = w * ro / 100;
	bg.width = vw;
	bg.x = posiX + ((w - vw) / 2);
}else if(ro > 120 && ro < 140){
	var vh:int = hh * ro / 100;
	bg.height = vh;
	bg.y = posiY + ((hh - vh) / 2);
}else if(ro > 200){
	var rand:int = Math.random() * 100;
	if(rand < 50){
		bg.x = posiX + ro/100;
		bg.y = posiY + ro/100;
	}else{
		bg.x = posiX - ro/100;
		bg.y = posiY - ro/100;
	}
}
```

赤のオフセットをキーとして、140より大きく160より小さい場合は幅を伸ばして、中心に来るようにxの値を調整。
120より大きく140より小さい場合は、高さを伸ばして、yの値を調整。
赤のオフセットが200を超えている場合は、ポジションをランダムに移動。
今回はランダムに値をとって、右上か左下に移動するように設定している。

これでウィグラーっぽい動きができたと感じている。

使うとは一言も言ってない。
JSで0は値あり、空配列を空と判定するfunction例



値が空( null or undefined or ''(空文字) or [](空の配列) or {}(空のオブジェクト) )を判定し、空の場合はtrue、値がある場合はfalseを返す

```javascript:値のない変数を検出するfunction
/*
値が空( null or undefined or ''(空文字) or [](空の配列) or {}(空のオブジェクト) )を判定
返り値 true: 空 */
function isEmpty(val){

    if ( !val ) {//null or undefined or ''(空文字) or 0 or false

        if ( val !== 0 && val !== false ) {
            return true;
        }

    }else if( typeof val == "object"){//array or object

        return Object.keys(val).length === 0;

    }

    return false;//値は空ではない
}

//-----------------------------------------------------
//テスト true
var _undefined; console.log(isEmpty(_undefined));
console.log(isEmpty(null));
console.log(isEmpty(""));
console.log(isEmpty([]));
console.log(isEmpty({}));
console.log(isEmpty({}));
//空ではないが、trueを返す
console.log(isEmpty(NaN));

//テストfalse
console.log(isEmpty(0));
console.log(isEmpty(1));
console.log(isEmpty("a"));
console.log(isEmpty("0"));
console.log(isEmpty(" "));
console.log(isEmpty([1]));
console.log(isEmpty({"key": "val"}));
console.log(isEmpty(function(){}));

```
プログラマの考えが・・身につく本より(Python)：配列のおさらい

配列のおさらいという項目で
Pythonのリストを勉強中

<h1>配列の取得と検索より</h1>
***特定の値を検索***する。
C++での解答コード

```
const int ARRAY_SIZE = 10;
int intArray[ARRAY_SIZE] = {4,5,9,12,-4,0,-57,30987,-287,1};
int targetValue = 12;
int targetPos = 0;
while((intArray[targetPos] != targetValue) && (targetPos < ARRAY_SIZE))
    targetPos++;
```

<h1>自分のPythonコード</h1>

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

def Search(targetValue):
    ARRAY_SIZE = [4,5,9,12,-4,0,-57,30987,-287,1]
    for x in ARRAY_SIZE:
       if targetValue == x:
           return x
       else:
           continue

    if targetValue != x:
        print("not found")

・・・・(ターミナル実行)
>>> from test33 import Search
>>> Search(12)
12
>>> 

```

とにかくif文で考えているけどこれでいいのかな。
続けてみます。
Windows + vagrant 1.8.1 + cwRsync 5.5.0 だと、synced_folderでエラーになる


[rsync 5.5.0.20160518]()パッケージだと直っているかもしれません。rsyncパッケージを更新しても改善されない場合は、rsyncパッケージを再インストールしてみてください。

```
choco uninstall rsync
choco install rsync
```

# 発端
私は[この記事のような構成](http://qiita.com/ndxbn/items/0c4f3b382ce9de2893cb)で、Windows環境でVagrantを使用していた。 
で、[rsyncパッケージに更新](https://chocolatey.org/packages/rsync/5.5.0)が来ていたので（元の[cwRsyncでの更新](https://chocolatey.org/packages/cwrsync/5.5.0)に追従した形）、updateしたところ、**StrictHostKeyChecking=noしても警告が出るようになり、synced_folderでfailする**ようになった。

``` 発生するようになった警告
Could not create directory '/home/{user_name}/.ssh'.
Warning: Permanently added '[127.0.0.1]:2222' (ECDSA) to the list of known hosts.
```

## 原因
原因は、**付属しているSSHのバージョンが7.1になったことでした。** 
未確認ですが、多分6.x→7.0あたりで、Warning: Permanently addedが抑制されなくなって、エラーになるようになったんだと思います。[要出典]  
 
 OpenSSHのChangeLog（まだ読んでない）

* [6.8](http://www.openssh.com/txt/release-6.8)
* [6.9](http://www.openssh.com/txt/release-6.9)
* [7.0](http://www.openssh.com/txt/release-7.0)
* [7.1](http://www.openssh.com/txt/release-7.1)

# 回避方法
**rsyncを一回uninstallして、version 5.4.1.20150827を入れなおしてください。**ついでに、pinしておくと良いでしょう。

```ps1
cuninst rsync -y
cinst -y rsync --version 5.4.1.20150827
choco pin add -n=rsync --version 5.4.1.20150827
```

## downgradeだと、sshが7.1のままだった
"choco upgrade rsync -version 5.4.1.20150827 --allow-downgrade"だけだと、肝心のsshのバージョンが戻りませんでした。

rsyncのバージョン | sshのバージョン
--- | ---
5.4.1.2 | OpenSSH_6.7p1, OpenSSL 1.0.1i 6 Aug 2014
5.5.0 | OpenSSH_7.1p1, OpenSSL 1.0.2e 3 Dec 2015
5.4.1.2 (downgradeした) | OpenSSH_7.1p1, OpenSSL 1.0.2e 3 Dec 2015
環境ごとに.ebextensionsファイルを切り替えたかった

# .ebextensionsに欠けているもの

elastic beanstalk環境を構築する上で便利な機能である.ebextensionsですが、環境ごとの設定ができないという欠点があります。

[このへん](https://forums.aws.amazon.com/message.jspa?messageID=685803)でも議論されてます。

上記ポスト内でamazonの中の人は、環境ごとに別のコードベースを使えばいいんじゃないかといっています。

vcsでリリースブランチを環境ごとに分けろといった提案なのだと思うのですが、正直管理が煩雑になるし、たとえばstagingと本番に別のコードがデプロイされ得るというのでは検証環境の意味がなくなってしまいます。

# 具体的事案

td-agentの設定ファイルを環境ごとに切り替えたかったのですが、.ebextensionsのfilesディレクティブだけでは不可能でした。

# 以前とっていた方法

.ebextensionsディレクトリを空にしておき、デプロイ用に手製のスクリプトで必要な.ebextensions設定ファイルをコピーしてくるという方法をとっていました。

やりたかったことは実現できていたのですが、そのスクリプト経由でしかデプロイできなくなるという欠点がありました。

また、vcsのコードがそのままデプロイされないという点で一抹の不安も残ります。

# そこで

```01-td-agent-dev.config
files:
  "/path/to/workspace/development.conf":
    owner: root
    group: root
    content: |
      略
```

```02-td-agent-prod.config
files:
  "/path/to/workspace/production.conf":
    owner: root
    group: root
    content: |
      略
```

というふうに複数の設定ファイルをどこか適当な場所に作る.ebextensions設定を追加し、

```03-run-td-agent.config
files:
  "/etc/td-agent/apply_td_config.sh" :
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/sh
      if [ 'production' == "$RAILS_ENV" ]; then
        cp /path/to/workspace/production.conf /etc/td-agent/td-agent.conf
      else
        cp /path/to/workspace/development.conf /etc/td-agent/td-agent.conf
      fi
      touch /etc/td-agent/using-$RAILS_ENV-conf

container_commands:
    # commands実行時点だと環境変数が見れなかった
    01-command:
        command: sh /etc/td-agent/apply_td_config.sh

    02-command:
        command: /etc/init.d/td-agent restart
```

というふうに、環境変数を見て設定ファイルをコピーしてくる.ebextensions設定を追加することで実現しました。

あとで環境を確認したときにどちらの設定ファイルを使っているかを確認しやすくするようにtouchしていますが必要はないです。

注意点としては、上記ファイルのコメントにも書いていますが、commandsディレクティブ実行時点では環境変数が設定されていなかったので、container_commandsで実行する必要がありました。

# 追記

2016/09/01にaws側で変更があったようで、.ebextensions以下のファイルにマルチバイト文字列が含まれているとデプロイに失敗するようになりました。

上記の例には日本語コメントが入っているので、ご注意ください。
今さらだけどElixirで「進捗どうですか」

# 概要
ついでだから「進捗どうですか」もやってみた。

# 実装
ほとんど[ズンドコキヨシver](http://qiita.com/takenta/items/36fac7bf7accd4dae21d)と同じ。

違うのは、副作用的に生成過程を表示していたのを、すべて保持して最後に出力する形にしたところ。最後に文字数を表示する必要があったのでこのように実装した。

```ex:shintyoku.exs
defmodule Shintyoku do
  def doudesuka do
    {:ok, pid} = Shintyoku.start

    Shintyoku.doudesuka(pid)
  end

  def doudesuka(pid) do
    if Shintyoku.complete?(pid) do
      num = Shintyoku.get(pid)
      |> Enum.reduce(0, fn (x, acc) -> acc + String.length(x) end)

      Shintyoku.display(pid)
      IO.puts("？？？")
      IO.puts("#{num + 3}文字で煽られました")
    else
      Shintyoku.add(pid)
      Shintyoku.doudesuka(pid)
    end
  end

  def start do
    Agent.start_link(fn -> [] end)
  end

  def get(pid) do
    Agent.get(pid, fn prev -> prev end)
  end

  def add(pid) do
    Agent.update(pid, fn prev ->
      [Shintyoku.random | prev]
    end)
  end

  def complete?(pid) do
    "進捗どうですか" ==  Shintyoku.get(pid)
    |> Enum.take(3)
    |> Enum.reverse
    |> Enum.join
  end

  def display(pid) do
    Shintyoku.get(pid)
    |> Enum.reverse
    |> Enum.map(&IO.write/1)
  end

  def random do
    ["進捗", "どう", "ですか"]
    |> Enum.random
  end
end
```

```bash:出力結果
iex(1)> Shintyoku.doudesuka
進捗進捗進捗進捗ですかですかですかどう進捗どうどう進捗ですか進捗どうですか？？？ 
40文字で煽られました
:ok
iex(2)> Shintyoku.doudesuka
どう進捗ですか進捗ですかですかどう進捗ですかですか進捗どうどうどうどうどう進捗進捗ですかですか進捗ですかどうどう進捗進捗進捗進捗ですかですかですかどうですかですか進捗進捗ですか進捗進捗進捗ですかですかどうですか進捗ですかですかですかですかですか進捗どうどうですかですか進捗どうどうどうですか進捗ですか進捗どうどうですかですかどうですか進捗ですか進捗ですか進捗どうどうですかどうどうですかどうどうですか進捗どうですか？？？
210文字で煽られました
:ok
iex(3)> Shintyoku.doudesuka
どうですかですか進捗進捗進捗進捗どう進捗ですかですかどうですか進捗進捗ですかどうですかどうどうですかですかどう進捗どう進捗どう進捗進捗ですかですかどうどうどうですかどうどう進捗進捗ですかどうどうどうどう進捗どうどうどうどうどう進捗ですか進捗ですかどうどうどうどう進捗ですかですかですかですかどうですかどう進捗ですか進捗進捗進捗進捗ですか進捗ですか進捗どうどうですか進捗ですかどうどうですかどうですか進捗進捗どうどうどうどうどうどうですか進捗進捗進捗ですかですかですかですか進捗ですか進捗進捗進捗進捗進捗ですかどう進捗進捗進捗ですかですかどう進捗ですか進捗進捗どうですか？？？
287文字で煽られました
:ok
iex(4)> Shintyoku.doudesuka
どうですかですか進捗進捗ですか進捗どうですか？？？
25文字で煽られました
:ok
```
El Captainでknife-soloがインストールできない

数年前に knife solo を使っていた環境の再セットアップのために knife を使おうとしたら、Ruby 2.0 が入っている OS X 10.11 El Captain では、そのままでは knife-solo がインストールできなくなっていた。

```
$ sudo gem install knife-solo --verbose
ERROR:  Error installing chef-zero:
    chef-zero requires Ruby version >= 2.1.0.
```

chef-zero が Ruby 2.1.0 を要求しています。
OS X 標準以外の Ruby を追加で入れるのは、管理が面倒になるので、
https://rubygems.org/gems/chef-zero で探してちょっと古いバージョンを入れることにします。

```sh
$ sudo gem install chef-zero -v 4.5.0 --verbose
```

https://rubygems.org/gems/chef も同様に少し古いものを選択します。

```sh
$ sudo gem install chef -v 12.7.2 --verbose
```

knife-solo がインストールできました。

```sh
$ sudo gem install knife-solo --verbose
（中略）
Successfully installed knife-solo-0.5.1
Parsing documentation for knife-solo-0.5.1
Parsing sources...
100% [50/50]  lib/knife-solo/tools.rb                                           
Installing ri documentation for knife-solo-0.5.1
1 gem installed
```

これで、うまく動くようになりました。
サーバ側はよろしくやってくれるみたい。

-----

(2017/03/08 追記)

2017 年現在では、[fi-yajl](https://rubygems.org/gems/ffi-yajl/versions/2.2.3) と [rack](https://rubygems.org/gems/rack/versions/1.6.5) など他の依存モジュールも、古いものを入れる必要がありそう。

```sh
sudo gem install ffi-yajl -v 2.2.3 --verbose
sudo gem install rack -v 1.6.5 --verbose
sudo gem install net-ssh-gateway -v 1.3.0 --verbose
sudo gem install net-ssh -v 2.9.4 --verbose
sudo gem install ohai -v 8.17.1 --verbose
sudo gem install chef-zero -v 4.5.0 --verbose
sudo gem install chef -v 12.7.2 --verbose
sudo gem install knife-solo -v 0.5.1 --verbose --ignore-dependencies
```

これで、macOS Sierra 10.12.3 でも、Chef: 12.7.2 の knife が使えるようになりました。
しかし、素直に Gemfile を書くか、古い knife を諦めたほうがいい気がする。
Java Content Repository API (JSR-170, JSR-283)と仲良くしたい

大嘘が書いてある可能性がありますので、薄目で読んでやってください。

# はじめに

CMS(Content Management System)を作りたいと思ったことがありますか？
掘れば掘るほど要件が出てきて、めっさ実装が大変そうです。

Javaには、そんなCMS開発に使えそうな標準API ～ JSR-170 Java Content Repository API 1.0 / JSR-283 Java Content Repository API 2.0 ～ があるそうです。

# それってそもそも何よ？

Wikipedia [Content Repository API for Java](https://en.wikipedia.org/wiki/Content_repository_API_for_Java) から引用します。

> Content Repository API for Java (JCR) is a specification for a Java platform application programming interface (API) to access content repositories in a uniform manner. The content repositories are used in content management systems to keep the content data and also the metadata used in content management systems (CMS) such as versioning metadata. 

> コンテンツレポジトリAPI for Java (JCR)とは、統一されたやり方でコンテンツレポジトリへアクセスするためのJava向けAPIです。コンテンツレポジトリは、コンテンツマネジメントシステムでコンテンツデータやバージョン履歴メタデータなどを格納するために使われます。

つまり、JCR APIを使えば、データベースアクセスとかファイルアクセスとかパーミッション管理とか面倒なことを考えなくてよくなるんんだよ！？

な、なんだってーーー！！

ってところでしょうか。

そんなJCR APIを実装しているのが [Apache Jackrabbit](http://jackrabbit.apache.org/jcr/index.html) です。

# JCR実装Jackrabbitを使ってみる

それでは早速Jackrabbitを使ってみましょう。 [Getting Started](http://jackrabbit.apache.org/jcr/getting-started-with-apache-jackrabbit.html) をクリック！

> To get started with Jackrabbit you should first become familiar with the JCR API.

> Jackrabbitを使い始めるにあたっては、まずJCR APIに馴染んでください。

ガッカリですよ！ 
:astonished: 

続く。。。
screen (gnu screen)をつかったときにtty関連でエラーが出てしまう件の対処

# 情況
sshでトンネルを掘りつつscreenに繋いだ場合やsudoでscreenに繋ごうとした場合、エラーが出てしまうことがあります。

```bash
$ sudo -u user screen -x
Cannot open your terminal '/dev/pts/12' - please check.
```

これはsudoした際にターミナルの環境がptsになっているせいのようです。

解決作はserverfaultにありました。

> Sudo as different user and running screen
> http://serverfault.com/questions/116775/sudo-as-different-user-and-running-screen/116830#116830

以下の関数を.bashrcに載せることでscreenコマンドを変更できるようです。

```bash:~/.bashrc
function screen() {
  /usr/bin/script -q -c "/usr/bin/screen ${*}" /dev/null
}
```

この状態で

```bash
$ screen -x
```

とするとうまく繋がります。
関数化が面倒な場合には若しくは

```bash
$ /usr/bin/script -q -c "/usr/bin/screen -x" /dev/null
```

といったように、`script`の引数の箇所に`sceen`の引数を生書きするとうまく動きました。
異なるレポジトリ間でのマージ

## やりたいこと
たまたま業務中に、異なるブランチ間でマージを行う必要がありました。
状況としては、異なるレポジトリ間のマージを行いたい場合で、ベースとなるブランチのbugfixをマージしたい場合に利用しました。簡単なんですが、意外と慣れていないと一瞬難しく感じると思います。(そもそもなぜレポジトリが別々なのかはまた別の話で)

## 実装
baseレポジトリ Bison
類似レポジトリ Gollira
とします。

Bison/masterのバグフィックスをGollira/masterにマージしたい場合の実装です。
手順としては、
1. Gollira/masterに移動
2. remoteにBisonレポジトリを追加
3. fetchする
4. mergeする

```
git remote add bison git@github.com:neonankiti/Bison.git //これでbison(自分で好きに付けられる。デフォルトのoriginと同じ)の参照にリモートのBison.gitを変更(追加)

git fetch --prune bison/master

git merge bison/master 

git push origin master //Golliraのmasterが最新に。
```
Protocol Extensions のメソッドディスパッチについての誤解

## 概要
Swift2.0 で追加された Protocol Extensions のメソッドディスパッチの振る舞いが、混乱しやすい物だと感じたので、その振る舞いについてまとめておきます。

## Protocol Extensions の振る舞い
```
protocol SomeProtocol {
}

extension SomeProtocol {
    func someMethod() {
        print("call someMethod of SomeProtocol")
    }
}

struct SomeStruct : SomeProtocol {
    func someMethod() {
        print("call someMethod of SomeStruct")
    }
}
```

このような定義があるとき

```
let a = SomeStruct()
a.someMethod() // => "call someMethod of SomeStruct"
```

`SomeStruct`型の変数`a`の`someMethod`呼び出しの結果、
`SomeStruct`に定義された`someMethod`が呼び出されます。
これは多くの人が期待する振る舞いだと思います。

では、

```
let b:SomeProtocol = a
b.someMethod() // => ?
```
このように`SomeStruct`型の変数`a`を代入した`SomeProtocol`型の変数`b`を宣言し、その`b`の`someMethod`を呼び出すとなんと出力されるでしょうか。
少なくとも私は`"call someMethod of SomeStruct"`と出力されることを期待していたのですが、実際は`"call someMethod of SomeProtocol"`が出力されます。

つまり現状 Protocol Extensions のメソッド呼び出しは、polymorphic な振る舞いをしないようです。

### Default Implementations
一方、Protocol の Default Implementations においては、上記とはメソッドディスパッチの振る舞いが異なります。

```
protocol SomeProtocol {
    func someMethod()
}

extension SomeProtocol {
    func someMethod() {
        print("call someMethod of SomeProtocol")
    }
}

struct SomeStruct : SomeProtocol {
    func someMethod() {
        print("call someMethod of SomeStruct")
    }
}


let b:SomeProtocol = SomeStruct()
b.someMethod() // => "call someMethod of SomeStruct"
```

---

これらの挙動を知らずに、以下のようなコードを書くと、想像しているものとは異なる振る舞いに悩まされるのでご注意ください。

```
protocol SomeDelegate {
}

extension SomeDelegate {
    func optionalMethod() {
        // nothing to do.
    }
}

class SomeClass: SomeDelegate {
    func optionalMethod() {
        print("optionalMethod") // ← 呼ばれない
    }
}

let delegate: SomeDelegate = SomeClass()
delegate.optionalMethod()
```

#### 参考にしたページ
- https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future
- https://medium.com/ios-os-x-development/swift-protocol-extension-method-dispatch-6a6bf270ba94#.rzvy2rc5f
Mosesのマニュアルインストール


学校の共用計算機などを利用する際に、マニュアルインストールを要する場合がある。
基本的には[公式のマニュアルインストール](http://www.statmt.org/moses/?n=Development.GetStarted)に則れば良い。
そのときの備忘録。

学校の計算機の環境
- OS:Red Hat Enterprise Linux Server release 6.7
- 1プロセスで最大16スレッド
- boostはインストールされておらず、ライブラリなどはおそらくほぼ標準構成

おそらくREHEL6系なら以下の手順でインストール可能なはず。

--
# boostのインストール
任意のディレクトリ（ここでは、$HOME/env以下）にインストールする。

```Bash
mkdir moses_install_src
cd moses_install_src

wget http://downloads.sourceforge.net/project/boost/boost/1.60.0/boost_1_60_0.tar.bz2

tar zxvf boost_1_60_0.tar.bz2
./b2 install -j16 --prefix=$HOME/env --libdir=$HOME/env/lib64 --layout=system link=static
```

# mosesのインストール

```Bash
cd moses_install_src
git clone https://github.com/moses-smt/mosesdecoder.git
cd mosesdecoder

# 先ほどインストールしたboostのパスを指定
./bjam --with-boost=$HOME/env -j16
# 16はコア数
```

# 単語アラインメントツール
## mgizaのインストール

```Bash
cd moses_install_src
git clone https://github.com/moses-smt/mgiza.git
cd mgiza

# BOOSTのパスをCMakeLists.txtに追加
emacs CMakeLists.txt
```

## Boostのパスを追記

```Bash:CMakeLists.txt
49:# BOOST_ROOT=/e/programs/boost_1_35_0
50:# BOOST_LIBRARYDIR=$BOOST_ROOT/stage/lib
51:set(BOOST_ROOT $HOME/boost_1_60_0)
52:set(BOOST_LIBRARYDIR $BOOST_ROOT/libs)
```

## コンパイルしてコピー

```Bash
cmake . -DCMAKE_INSTALL_PREFIX=$/env
cp ~/moses_install_src/mgiza/mgizapp/bin/{mgiza,mkcls,snt2cooc} ~/moses_install_src/mosesdecoder/tools
```

--

良きMosesライフを！

### 学校で利用する際にハマったこと
学校のバッチキューシステム(PBS)で利用する際に、環境変数でハマった。
ジョブファイルにも変数を書く必要がある。
Houstonで簡単にPush通知を飛ばす

Push通知の実装をしていて、Pushサーバーが用意されてない時に、手軽に動作を試す時に使えそうでした。
ApnsPHPがオワコンっぽいので、代替するものを探してたところ、Houstonにたどり着きました。

# 準備
## インストール
下記のコマンドでインストールする。  

```
gem install houston
```
 
## 証明書準備

1. キーチェーンアクセスからPush通知サーバー向けの証明書を書き出す。
	- パスワードなしで出力する。 
	- p12形式とする。

2. p12をpemに変換する。

```
openssl pkcs12 -in cert.p12 -out apple_push_notification.pem -nodes -clcerts
```

# ソースコード作成
下記のような感じでrubyで書く。  

```test_push.rb
require 'houston'

# Environment variables are automatically read, or can be overridden by any specified options. You can also
# conveniently use `Houston::Client.development` or `Houston::Client.production`.
#APN = Houston::Client.development
APN = Houston::Client.production
APN.certificate = File.read("./apple_push_notification.pem")

# An example of the token sent back when a device registers for notifications
token = "<XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX>"

# Create a notification that alerts a message to the user, plays a sound, and sets the badge on the app
notification = Houston::Notification.new(device: token)
notification.alert = "１２３４５６７８９０１２３４５６７８９０１２３４５６７８９０１２３４５６７８９０１２３４５６７８９０"

# Notifications can also change the badge count, have a custom sound, have a category identifier, indicate available Newsstand content, or pass along arbitrary data.
notification.custom_data = {url: "http://www.google.com"}

# And... sent! That's all it takes.
APN.push(notification)

```
# 実行
下記のような感じで実行する。

```
ruby test_push.rb
```
 
できた！   
<img width="320" alt="IMG_3374.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/103647/7e94e8a6-fb04-7aae-22e2-532d4dd79495.png">


# 参考

- [houston](https://github.com/nomad/houston)

- [iPhoneアプリのPush通知をRubyで実装するならhoustonが良さげ](http://qiita.com/u1_fukui/items/1534a7a043882805aa88)
長年運用を続けてきたHTMLページ群を整理する


## はじめに

[HTMLの孤島発見スクリプト](http://qiita.com/kaityo256/items/320e31f1200f73706cea)という記事を見て、私ならどう実装するか考えてみた。
私が対象とするページは十数年運用されており、相当な人が手を入れているため内部はばらばらなので、ひと手間かける必要があった。

## 前提

- 文字コードはShift_JIS、EUC-JP、UTF-8（またはそれ以外）が入り混じっている
- インデント等は全く揃っていない
- リンクも`http://`から書いているものや相対パスのものが入り混じっている
- 画像が多用されており、中にはPDFやWord, Excelファイルへのリンクも存在する

## 実装

文字コードの判別に`NKF`を利用し、HTMLをよしなに扱うのは正規表現だけでは面倒なので`Nokogiri`を利用することにした。
`normalize`の実装は非常に適当なので何かしらバグが入っていそうな気はするが、ひとまず私が必要とするページで確認したところ問題なさそうだった。

```ruby
require "nokogiri"
require "nkf"

def normalize url, file, baseurl
  unless url.nil?
    if url.match /^http/
      url.gsub! /^#{baseurl}/, ""
      url = "" if url.match /^http/
    elsif File.dirname(file) != "." and not url.empty? and not url.match /^#/
      dirs = File.dirname(file).split "/"
      url.scan("../").length.times{dirs.pop}
      url.gsub! "../", ""
      url = File.join dirs, url
    end
    url.gsub! /#.*$/, ""
    url.gsub! /\/$/, "/index.html"
    url = "" if url.match /^javascript:/
  end
  url
end

baseurl = "http://yourdomain/path/to/"
files = []
links = []

Dir.glob('**/*') do |file|
  next if File.directory? file

  if file.match /htm(l)*$/
    files.push file
    content = File.open(file).read
    encoding = NKF.guess(content)
    content = content.force_encoding(encoding)
    doc = Nokogiri::HTML content
    dirs = File.dirname(file) === "." ? [] : File.dirname(file).split("/")
    links.concat doc.search("a").map{|elm| normalize elm.attr("href"), file, baseurl }
    links.concat doc.search("link").map{|elm| normalize elm.attr("href"), file, baseurl }
    links.concat doc.search("script").map{|elm| normalize elm.attr("src"), file, baseurl }
    links.concat doc.search("img").map{|elm| normalize elm.attr("src"), file, baseurl }
  elsif file.match /(pdf|doc(x)*|xls(x)*|jpg|gif|png|css)$/
    files.push file
  end
end

links = links.uniq.reject{|url| url.nil? or url.empty?}
p links

files.each do |file|
  puts file unless links.include? file
end
```

## 既知の問題

- JS、CSSでのみ参照しているファイルが含まれる可能性がある
- `normalize`の実装が気持ち悪い
スクラム個人メモ

[スキルマップ作成のすすめ](http://www.ryuzee.com/contents/blog/7065)
[認定スクラムマスター研修に行ってきました](http://blog.toshimaru.net/scrum-training/)
[GMOテクノロジーブートキャンプ2015(アジャイル編)](http://www.slideshare.net/aratafuji/gmo-48274763)
slackの導入まとめ

#Slackとは・・・

[こちら](https://seleck.cc/note/seleck_howto/article/8)をご参考ください。
まとめると、
・ビジネス向け**チャットツール**
・チームでも1対1でも、ストレスのない**リアルタイムのコミュニケーション**ができる
・パソコン、スマホ、タブレットなど、**閲覧環境を選ばず**サクサク使える
・過去のやりとりの中で**あとで参照したいものを保存**でき、検索も簡単
・画像を含めたどんな種類のファイルでも、**手軽に共有**できる
・業務で使用している**他のサービスと連携**させ、仕事を効率化することができる
（現時点でslackと連携可能なサービスは[こちら](https://slack.com/apps)から）
・オリジナルの絵文字を作ったり、**カスタマイズ**して楽しめる

結論から言うと、「コミュニケーションや仕事が間違いなく楽になる！」ということです。

[Slackはもはやチャットツールではない！ 外部連携、bot、IoTまで広がる活用法](https://seleck.cc/article/184)
[非エンジニアでも簡単にカスタマイズできる！業務効率化にも役立つSlack活用法](https://seleck.cc/article/130)

よくSkypeとかとはなにが違うのと聞かれることがあるので、[こちら](http://creive.me/archives/7161/)から

個人的には、**デザインの良さ**と**自由度の高さ**が気に入ってます！！

##始め方
なんだか英語で取っつきにくい…
でも安心してください！簡単にできます！

[ここ](https://slack.com/create#email)からサインアップするだけで、サブドメインが与えられてすぐ使い始めることができます。
（すでにチームが作成してある場合には招待してもらいましょう）

詳しい手順は[こちら](https://seleck.cc/note/seleck_howto/article/8#-)をご参考ください。
（すでに勘のいい人はお気づきだと思いますが、基本的に他力本願です）

ブラウザから使うこともできますが、アプリをインストールして使うことをお勧めします！
[ダウンロードページへ](https://slack.com/downloads)(クリックしてもダウンロードはされません)


##使い方

さっそく使っていきましょー！すごくいい記事があったのでそれをシェアさせていただきます。
習うより慣れろなんで余計な事考えずにさくさくいきます。
結構ボリューミーなんで最初の４つだけでも十分使える様になるかと思います。


###[まずは使いやすい設定から！Preferencesをチェック](https://seleck.cc/note/seleck_howto/article/1)
【内容】
・Slackのデザインを自分好みにカスタマイズできます。
・通知や通知音の有無、画像のインライン表示などをお好みに設定できます。
・よく使うチャンネルを、上の方に表示できます。


###[これぞSlackの醍醐味、スラッシュコマンドを使い倒せ！](https://seleck.cc/note/seleck_howto/article/5)
【内容】
・スラッシュコマンドなるものが理解できます。
・無料で、Slackからいきなりビデオチャットが始められます。
・Slackに自動でリマインダーを流すことができます。
・画像だらけのスレッドをすっきりさせることができます。

[参考]
[Slackであまり知られていない便利機能一覧](http://qiita.com/kozyty@github/items/cbe58a72a715b540c60f)
[slack の /remind 機能まとめ](http://qiita.com/takesato/items/335061d7945ebd5c23f7)


###[過去の投稿を引用する「Copy Link」と「Pin」、そして記法](https://seleck.cc/note/seleck_howto/article/6)
【内容】
・なんかプロっぽい感じで、Slackに普通じゃない表示形式の投稿ができる。
・過去の投稿をURLで共有し、引用することができる。（＝Copy Link）
・過去の投稿の中で、何度も見るものにすぐアクセスできるようになる。（＝Pin）
・過去の投稿を、タスクやToDoとして表示しておける。（＝Pin)


###[メニュー項目を網羅！右サイドバーの賢い使い方](https://seleck.cc/note/seleck_howto/article/9)
【内容】
・右サイドバーに表示できるものがひととおり全部わかる
・チャンネルごとに、目的やよく使う資料へのリンクを設定できる
・チャンネルごとに通知の有無を設定したり、添付ファイルの一覧が確認できる
・過去に投稿されたファイルをすぐに参照、シェア、コメント、ダウンロード等ができる


###[メンションも飛ばせる！オリジナル絵文字の作り方](https://seleck.cc/note/seleck_howto/article/10)
【内容】
・絵文字をたのしく使えるようになる。
・オリジナルの絵文字が作れる。
・絵文字を使ってメンションが飛ばせる。


###[みんなで投稿が編集できる新機能Postを使ってみよう](https://seleck.cc/note/seleck_howto/article/12)
【内容】
・Slackに記事形式のドキュメントを投稿してシェアできる。
・みんなでひとつのドキュメントを共有して、共同編集できる。


###[効率をひたすら上げるなら！ショートカットと十字キー](https://seleck.cc/note/seleck_howto/article/14)
【内容】
・自分の直近の投稿にすぐにジャンプできる
・Slackのショートカットをチートできる。
・すぐに添付ファイルが送れる。


###[これぞSlackの醍醐味！使って楽しい外部サービス連携](https://seleck.cc/note/seleck_howto/article/15)
【内容】
・外部連携とはなんぞや。何ができるのか。ということがわかる。
・タスクや予定を管理する外部ツールと、Slackを連携させられる。
・SlackにランダムにGIFアニメを流せる。

[発展]
[Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた。](http://qiita.com/KAKY/items/55e6c54fa2073cdc0bbe)


***
以上になります。
botの作り方なども随時更新したいと思います。


**これでみんなもslackマスター** :bowtie:
Awkでログファイルを集計

Awkでログファイルを集計したいときに使います

#### 最初の行を取得

awk 'NR == 1' aa.log

#### 最終行を取得

awk 'END {print}' aa.log


#### 該当行をカウントする

```
awk '$8>0{count++} END {print count}' a.log'
```

#### 列を合計する

```
echo -n "si total: " >> ${mylog}
SIALL=`awk '{m+=$8} END{print m}' ${myfile}`
echo $((SIALL/1000)) MB >> ${mylog}
```


#### ログファイルの該当行を抜き出す

```
awk '$8 == "si" {print $0}' aaa.log
```

#### ログファイルから必要な日時を取り出す

```
cat test.csv | awk '$1 ~ /20151214/ {print}'
```

#### ログファイルに行番号をつけて出力

```
cat test.csv | awk '$1 ~ /20151214/ {print NR "\t" $0}'
```

#### ログファイルの指定行を抜き出し

```
awk  'NR==103240, NR==225590 {print $0}' test.csv > aa.txt
```

#### ログファイルの指定行番号のみ吐かせる
出力

```
cat test.csv | awk '$1 
~ /20151214/ 
{print NR "\t" }'
```

#### Awkでsplitと同じことをする

```
echo 'aaa,bbb,ccc' | awk '
{n=split($0, array, ",")} 
END{print n, array[n]}'
```