OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkins + HipChatをHubotなしで連携する


JenkinsとHipChatを連携させると、Jenkinsジョブの結果をHipChatに通知したり、HipChatからbotコマンドを投げてJenkinsのジョブを起動したりすることができます。
HipChatそのものや、Hubotを使った連携のさせ方は以下を参照。

> [Jenkins＋HipChat＋Hubotをチーム開発に導入してお手軽CI - @IT](http://www.atmarkit.co.jp/ait/articles/1408/25/news034.html)

で、Hubotを運用するのも面倒なので、Jenkinsプラグインだけでお気軽にbotコマンド対応させる方法がこちらです。

設定方法
----------------

### HipChatにJenkins用のアカウントを作成する

Jabber Pluginが使用する、HipChatのアカウントを作ります。Jenkins側では、XMPP/Jabber infoで表示される値を設定していきます。上記のサイトに詳しい手順が載っています。

アカウントを作成したら、利用したいチャットルームを作成しておき、アカウント設定ページからJabberでの設定値を確認しておきます。
![HipChat Account Setting](http://cdn-ak.f.st-hatena.com/images/fotolife/t/taktos/20140826/20140826191952.png)

### Jenkinsに[Jabber Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Jabber+Plugin)をインストールする

他のプラグインを入れる方法と変わりありません。アップデートセンターからインストールできます。
[HipChat Plugin](https://wiki.jenkins-ci.org/display/JENKINS/HipChat+Plugin)との違いは、このプラグイン自体がbot機能を持っていることです。

HipChatはXMPPプロトコルに対応しているので、HipChat PluginのようにAPIを経由せずとも、XMPPに対応するJabber Pluginで普通に利用できるのです。

### Jenkinsの設定

Jenkinsのシステム設定で、Jabber Pluginの設定を行います。
![Jabber Notification](http://cdn-ak.f.st-hatena.com/images/fotolife/t/taktos/20140826/20140826192509.png)

HipChatで作成したJenkins用アカウントのJabber IDとPasswordを入れ、「高度な設定」を押すと出てくる **Nickname** と **Jenkins Username** にHipChatのRoom nicknameを入力します。

**Initial group chat** には、botコマンドを待ち受けるグループチャットを任意の数追加できます。 **Name** には、`HipChatのルーム名`＋`@conf.hipchat.com`を入力します。

この設定後、JenkinsのログにHipChatとの接続状況が出力されます。もしエラーが出てる場合は、メッセージを見ておかしいところを修正してみてください。


使ってみる
---------------

### ジョブ結果の通知
Jenkinsからジョブの結果を通知するには、ジョブの設定ページにて、ビルド後の処理にJabber Notificationを追加します。
![Job Config](http://cdn-ak.f.st-hatena.com/images/fotolife/t/taktos/20140826/20140826193734.png)

**Targets**には、`*` ＋ `HipChatのルーム名` ＋ `@conf.hipchat.com` を指定します。高度な設定から、通知する内容を変更することもできます。

### botコマンド

**Initial group chat** に設定したHipChatのチャットルームで `!help` と打ってみましょう。うまく接続できていれば、Jenkinsがボットコマンドの一覧を返してくれます。
![Bot](http://cdn-ak.f.st-hatena.com/images/fotolife/t/taktos/20140826/20140826193535.jpg)

`!build <ジョブ名>` で任意のジョブをキックしたり、`!status`でジョブの成功・失敗を一覧で取得したりすることができます。


というわけで、Jenkinsのジョブをキックするためのスクリプトを書いたりせず、お気軽に連携させることができました。めでたしめでたし。


※この記事は、[ブログ](http://taktos.hatenablog.com/entry/2014/08/26/Jenkins_%2B_HipChat%E3%82%92Hubot%E3%81%AA%E3%81%97%E3%81%A7%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B)に書いたものをQiita向けに整形したものです。
Google API Python Clientを使ってYouTube Data APIv3をいじる



## アプリ登録

YouTube Data APIをonにする。





https://console.developers.google.com/project


## google-api-python-clientのインストール



`pip install --upgrade google-api-python-client`

https://github.com/google/google-api-python-client



## doc

https://developers.google.com/youtube/v3/docs/channels/list



## 公式サンプルコード　
sample: https://developers.google.com/youtube/v3/code_samples/python?hl=ja



## 完成コード

Djangoのviews.pyから抜き出し

```python
from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponse
 

from oauth2client.client import OAuth2WebServerFlow
import httplib2
from apiclient.discovery import build
 
CLIENT_ID = 'xxxxx'
CLIENT_SECRET = 'xxxxx'
FLOW = OAuth2WebServerFlow(
    client_id=CLIENT_ID,
    client_secret=CLIENT_SECRET,
    scope='https://www.googleapis.com/auth/youtube',
    redirect_uri='http://localhost:8000/account/fetch_channel/on_auth/'
)
 
 
def index_view(request):
    return render(request, 'index.html', {})
 
 
def fetch_channel(request):
    auth_uri = FLOW.step1_get_authorize_url()
    return HttpResponseRedirect(auth_uri)
 
 
def fetch_channel_on_auth(request):
    code = request.GET.get('code', None)
    credentials = FLOW.step2_exchange(code)
    http = httplib2.Http()
    http = credentials.authorize(http)
    service = build('youtube', 'v3', http=http)
    r = service.channels().list(
        mine=True,
        part="snippet"
    ).execute()
    username = r['items'][0]['snippet']['title']
    return HttpResponse(username)
```
DjangoでAjaxする時の注意点


## DjangoでAjax

通常Djangoは`{% csrf_token %}`をテンプレートで書いていないとcsrftokenをクッキーにセットしない。

確実にセットするためには

```python
from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def view(request):
    pass
```

みたいな感じで使う。



## JS

以下コピペ

```javascript
// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    crossDomain: false, // obviates need for sameOrigin test
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
```


使う

```javascript
$.ajax({
    type: 'POST',
    url: "/ajax/",
}).done(function(data){
    alert('success!!');
}).fail(function(data){
    alert('error!!!');
});
```
systemdが使うライブラリ

コンパイルに必要なライブラリを見ると、プログラムがどういう機能を提供しているかがわかるはずということで調べてみた。リストは[README](http://cgit.freedesktop.org/systemd/systemd/tree/README)にあります。

- glibc >= 2.14
- libcap
- libseccomp >= 1.0.0 (optional)
- libblkid >= 2.20 (from util-linux) (optional)
- libkmod >= 15 (optional)
- PAM >= 1.1.2 (optional)
- libcryptsetup (optional)
- libaudit (optional)
- libacl (optional)
- libselinux (optional)
- liblzma (optional)
- liblz4 >= 119 (optional)
- libgcrypt (optional)

ここら辺まではシステムソフトウェアならそうだよなーって感じのライブラリですが、ここからは少し特殊なライブラリが。

- libqrencode (optional)

QRコード！？

...どうやら、ログを保護(というか改竄検出)するのに必要なキーの一つを手軽に人間が保存するためのものらしい (詳しくは[Forward secure sealing [LWN.net]](http://lwn.net/Articles/512895/)や[LennartさんのG+の投稿](https://plus.google.com/+LennartPoetteringTheOneAndOnly/posts/g1E6AxVKtyc)を参照)。

- libmicrohttpd (optional)

[systemd-journal-remote](http://www.freedesktop.org/software/systemd/man/systemd-journal-remote.html) でネットワーク越しにログを受け取るためのもの。

- libpython (optional)

pythonモジュールをビルドするため。

- libidn (optional)

DNSのためのドメイン名処理(StringprepとかIDNA)関連 ([GNU IDN Library](http://www.gnu.org/software/libidn/)参照)。

- gobject-introspection > 1.40.0 (optional)

udevとgobjectをやりとりする用。

- elfutils >= 158 (optional)

coredumpからスタックトレースを取得するため。
Vimメモ


乱雑に書き散らかしててごめんなさい、そのうちまとめます

## バッファ
複数ファイルを開くのはいいけど今まで開いていたファイルが表示されなくなってしまった。
これ、消えているわけではなくて、簡単に言うと裏にある状態。これを表に持ってきたりしたい。
開いている(すべての)ファイルは「バッファにある」状態で、このバッファを表にしたり、裏にしたりする。

##### バッファの切替
`C-^` 直前に裏に回ったバッファを表にする(表示させる)(`:e #` でもOK)
`:bn` 次のバッファに移動する
`:bp` 前のバッファに移動する

##### バッファ一覧見れないの？
`:ls` バッファの一覧を見る
% がカレント(操作中)ウィンドウのバッファ、 # はオルタネイト(`C-^`で切り替え可能な)バッファ。

こんな表示になる

```
:ls
  1      "foo.php" 行 22
  2 %a   "bar.php" 行 7
  3 #    "hoge.php" 行 6
```

各バッファへの切り替え(表にする)
`:b バッファ番号`

現在開いているカレントバッファを消す
`:bd`

## タグジャンプ
`C-]` カーソル位置の単語の定義位置ジャンプ。
`C-t` 直前のタグに戻る。
`g C-]` 複数候補がある場合に選択ウィンドウをだしてジャンプ。
`C-w }` カーソル位置の単語の定義を、プレビューウィンドウで開く。
`C-w C-z` プレビューウィンドウを閉じる。(:pcと同じ)


## バッファとタブ
##### 現在保持しているバッファをすべてタブ化
`:tab ba`

##### バッファ名を指定したタブ化
`:tabnew | b [N|バッファ名]`
↓参考
http://qiita.com/kuwa72/items/deef2703af74d2d993ee

## 他
`%` 対応する括弧"{ }","[ ]","( )"、コメント("/* */")にジャンプ

`gd` ローカル宣言にジャンプ
`gD` グローバル宣言にジャンプ
HealthKitを使ったアプリを申請する時に気をつけること

###プライバシーポリシーURLが必須。
事前に準備しておかないと申請の時に困る。

プライバシーポリシーが空のまま申請しようとすると、
"HealthKitのAPIを使用するアプリはプライバシーポリシーURLが必須"と警告が出てレビュー待ちへの申請ができない。

身体に関する機密性の高い個人情報を取り扱うためだと思うが
個人デベロッパーにはつらい。
インナークラスのシグネチャを取得する


# 概要
インナークラスは、Outer\$Inner.classといった形で「\$」で繋げられるらしい。
javapコマンドを使ってインナークラスのシグネチャを取得しようとして困った。
javapしてみたらアウタークラスのシグネチャじゃん！
ってことで。

## 単純にjavapしてみた結果

**OuterClass**

```
$ javap -s OuterClass.class
Compiled from "OuterClass.java"
public class jp.sample.OuterClass {
  public jp.sample.OuterClass();
    Signature: ()V
}
```

**InnerClass**

```
$ javap -s OuterClass$InnerClass.class
Compiled from "OuterClass.java"
public class jp.sample.OuterClass {
  public jp.sample.OuterClass();
    Signature: ()V
}
```

指定している.classファイルは異なるのに出力結果は同じだったorz

## InnerClassのシグネチャを取得するためには？

1. $を.に置き換える
2. .classを削除する

```
$ javap -s OuterClass.InnerClass
Warning: Binary file OuterClass.InnerClass contains jp.sample.OuterClass$InnerClass
Compiled from "OuterClass.java"
public class jp.sample.OuterClass$InnerClass {
  final jp.sample.OuterClass this$0;
    Signature: Ljp/sample/OuterClass;
  public jp.sample.OuterClass$InnerClass(jp.sample.OuterClass);
    Signature: (Ljp/sample/OuterClass;)V
}
```

コンストラクタにはOuterClassのインスタンスが必要なのがわかる。
上記はstatic classじゃないので実際にjavaで外部から仕様する際は、
OuterClassのインスタンスが必要になるからだろう。

## まとめ

* javapする際に.classは不要だった。
* $を.に置き換えれて、.classを削除すれば、インナークラスのシグネチャも取得できる。

## おまけ

**インナークラスのインナークラス**

```
$ javap -s OuterClass.InnerClass.InnerInnerClass
Warning: Binary file OuterClass.InnerClass.InnerInnerClass contains jp.sample.OuterClass$InnerClass$InnerInnerClass
Compiled from "OuterClass.java"
public class jp.sample.OuterClass$InnerClass$InnerInnerClass {
  final jp.sample.OuterClass$InnerClass this$1;
    Signature: Ljp/sample/OuterClass$InnerClass;
  public jp.sample.OuterClass$InnerClass$InnerInnerClass(jp.sample.OuterClass$InnerClass);
    Signature: (Ljp/sample/OuterClass$InnerClass;)V
}
```

ちゃんと取得できた。

***

**スタティックなインナークラス**

```
$ javap -s OuterClass.StaticInnerClass
Warning: Binary file OuterClass.StaticInnerClass contains jp.sample.OuterClass$StaticInnerClass
Compiled from "OuterClass.java"
public class jp.sample.OuterClass$StaticInnerClass {
  public jp.sample.OuterClass$StaticInnerClass();
    Signature: ()V
}
```

コンストラクタでOuterClassのインスタンスは必要なかった！
SwiftでParseのログイン処理を実装してみた


Parseでのログイン画面をswiftで実装してみた。

```LoginViewController.swift
import UIKit

class LoginViewController: UIViewController,
                           PFLogInViewControllerDelegate,
                           PFSignUpViewControllerDelegate {

    override func viewDidAppear(animated: Bool) {
        //ログイン画面生成
        NSLog("ログイン画面生成!!")
        var loginViewController:PFLogInViewController = PFLogInViewController()
        
        loginViewController.fields = PFLogInFieldsDefault
        //loginViewController.fields = PFLogInFieldsFacebook
        presentViewController(loginViewController, animated: true, completion: nil)
        loginViewController.delegate = self
        loginViewController.signUpController.delegate = self
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    /*
     * ログイン成功処理
     */
    func logInViewController(logInController: PFLogInViewController!,
                           didLogInUser user: PFUser!)
    {
        NSLog("ログイン成功!!")
    }

    /*
     * ログイン失敗処理
     */
    func logInViewController(logInController: PFLogInViewController!,
               didFailToLogInWithError error: NSError!)
    {
        NSLog("ログイン失敗!!")
    }

    /*
     * サインイン成功処理
     */
    func signUpViewController(signUpController: PFSignUpViewController!,
                            didSignUpUser user: PFUser!)
    {
        NSLog("サインイン成功!!")
    }

    /*
     * サインイン失敗処理
     */
    func signUpViewController(signUpController: PFSignUpViewController!,
                didFailToSignUpWithError error: NSError!)
    {
        NSLog("サインイン失敗!!")
    }
}
```

まだ、不明な部分はあるが少しづつ。
Cygwin 環境に RugyGems 2.4.1 を入れて gem install 出来なくなった場合の対応

# Cygwin 環境に RugyGems 2.4.1 を入れて gem install 出来なくなった場合の対応

## 概要
Cygwin 環境に RugyGems 2.4.1 を入れて gem install 出来なくなった場合の対応について。

## 問題発生環境
* Windows7
* Cygwin(64bit)
* rbenv + ruby 2.1
* RubyGems 2.4.1

## 経緯
Cygwin 環境で RubyGems のバージョンを 2.4.1 に上げたところ、
下記のエラーが発生して、 gem install ができなくなりました。

~~~bash
$ gem i qiita_scouter
Fetching: qiita_scouter-0.0.1.gem (100%)
ERROR:  While executing gem ... (TypeError)
    no implicit conversion of nil into String
~~~

## 対応
RubyGems の GitHub をあさったところ、該当 Issue を発見。

https://github.com/rubygems/rubygems/pull/1000
https://github.com/rubygems/rubygems/pull/1000/files

プルリクエストの内容を `rubygems/installer.rb` に適用すれば直ります。

* 修正前

~~~ruby
  def windows_stub_script(bindir, bin_file_name)
    ruby = File.basename(Gem.ruby).chomp('"')
    return <<-TEXT
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"#{bindir.tr(File::SEPARATOR, File::ALT_SEPARATOR)}\\#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"%~dp0#{ruby}" "%~dpn0" %*
TEXT
  end
~~~

* 修正後

~~~ruby
  def windows_stub_script(bindir, bin_file_name)
    ruby = File.basename(Gem.ruby).chomp('"')
    alt_separator = File::ALT_SEPARATOR || File::SEPARATOR
    return <<-TEXT
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"#{bindir.tr(File::SEPARATOR, alt_separator)}\\#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"%~dp0#{ruby}" "%~dpn0" %*
TEXT
  end
~~~
RubyKaigi 2014 事前情報 #rubykaigi

# RubyKaigi 2014 事前情報 #rubykaigi

## 概要
Ruby Kaigi 2014 関連 事前情報のまとめです。

私は3日とも行きます。
どうせ参加するなら事前に色々情報を調べたい,と思って情報収集しました。
せっかく調べたので共有しよう、ということで公開。

Ruby Kaigi 2014 に来場される方や、Streamingでどのスピーカーの話を聞こうか
迷っている方のお役に立てれば幸いです。

## 公式
### トップページ
http://rubykaigi.org/2014

### Streaming
* Hall A  
    http://www.ustream.tv/channel/rubykaigi1
* Hall B  
    http://www.ustream.tv/channel/rubykaigi2

## スピーカー関連
氏名昇順
ググって、ブログやQiitaなど関連記事を書いている方の情報をまとめました。
氏名の表記は RubyKaigi の記載に合わせてあります。

### Kensuke Nagae 氏

* "bundle update" can be more fun to review
    * 日時：2014年9月19日 11:30
    * http://rubykaigi.org/2014/presentation/S-KensukeNagae

* 関連記事名：RubyKaigi 2014でmod_mrubyを作った経緯やその後の応用について発表します #rubykaigi
    * http://blog.kyanny.me/entry/2014/06/11/022922
    * http://blog.kyanny.me/entry/2014/08/16/040453

### Kouji Takao 氏, Nobuyuki Honda 氏

* Kids, Ruby, Fun!: Introduction of the Smalruby and the Ruby Programming Shounendan
    * 日時：2014年9月19日 16:30
    * http://rubykaigi.org/2014/presentation/S-KoujiTakao-NobuyukiHonda

* 関連サイト
    * https://github.com/smalruby/smalruby-doc/wiki/RubyKaigi-2014-CFP
    * http://smalruby.jp/

### MATSUMOTO Ryosuke 氏

* Resource Control Architecture scripting with mruby for a Web Server Separating Computer Resources Virtually at Each HTTP Request
    * 2014年9月19日 15:30
    * http://rubykaigi.org/2014/presentation/S-MATSUMOTORyosuke

* 関連記事名：RubyKaigi 2014でmod_mrubyを作った経緯やその後の応用について発表します #rubykaigi
    http://hb.matsumoto-r.jp/entry/2014/08/25/183829

* mod_ruby GitHub
    https://github.com/matsumoto-r/mod_mruby

### Satoshi Egi 氏

* Non-Linear Pattern Matching against Unfree Data Types in Ruby (Egison Pattern Matching in Ruby)
    * 日時：2014年9月18日 15:30
    * http://rubykaigi.org/2014/presentation/S-SatoshiEgi

* 関連記事名：RubyにHaskellよりも強力なパターンマッチを実装した
    * http://qiita.com/egisatoshi/items/38f7f8aef32ac67ccd4b

* 関連記事名：続編 - RubyにHaskellよりも強力なパターンマッチを実装した
    * http://qiita.com/egisatoshi/items/dfa13e45edbc71430048

* Egison gem GitHub
    * https://github.com/egison/egison-ruby

### Takehiko YOSHIDA 氏

* Open the door of embedded systems to IoT! mruby on LEGO Mindstorms EV3 ®
    * 日時：2014年9月19日 14:00
    * http://rubykaigi.org/2014/presentation/S-TakehikoYOSHIDA

* 関連記事名：Proposal to RubyKaigi 2014
    http://qiita.com/chihayafuru/items/0a32fd3c68661a5be4be

## LT
Lightning Talks は 2014年9月19日 17:30 より

### Kenichi TAKAHASHI 氏
* http://rubykaigi.org/2014/LT
* 関連記事名：RubyKaigiのLTに採択されたのでCFLTの内容を公開します  
    http://diary.shu-cream.net/blog/2014/09/09/rubykaigi-2014-cflt-adopted.html

## その他
### Matzさんに聞く、RubyKaigi2014の楽しみ方
http://tech.vasily.jp/matz_rubykaigi2014

### CodeIQ
* RubyKaigi 2014問題初級
    https://codeiq.jp/ace/codeiq_rubykaigi2014_tbpgr/q945

* RubyKaigi 2014問題中級
    https://codeiq.jp/ace/codeiq_rubykaigi2014_tbpgr/q946

問題の正解/不正解にかかわらず、
CodeIQ オリジナルステッカーか、オリジナルチョコがもらえる。

RubyKaigi 2014 とは直接関係ないのですが、
CodeIQ プログラミング言語★総選挙
というイベントを開催中。
予選が終了し、18日から本線。
Rubyが予選を通っていたら、皆さんもRubyに投票するのはいかがでしょうか？

ちなみに、私は9ヶ月ほどCodeIQの出題を続けていますが、
言語不問の問題を出題すると、多くの問題で Ruby による解答が最多になっています。
Ruby人気、来てます。
Qiita要望 | フィード画面のフィルタ機能の追加

# Qiita要望 | フィード画面のフィルタ機能の追加

## フィード画面のフィルタ機能の追加
2014/09/17 現在の仕様だとフィードのタイムラインには、以下のイベント情報が流れています

* フォローした相手の投稿・ストック・コメント
* 自分の投稿・ストック・コメント
* フォローしたタグの投稿

この中だとフォローした相手のストックに関する情報が表示される頻度が高く、
人気記事をストックする人が多いため、フォロー相手が増えるほど
同じようなフィード情報で埋め尽くされることになります。

例えば、フォロー相手の直近投稿が気になる場合に
該当情報が埋もれてしまい探しにくくなってしまいます。

相手をフォローする理由の中では
「フォロー相手の投稿が気になるから」
という理由が一番大きいように思います。
そのため、現状のフィードだとフォローのシステムの意義が
やや薄れてしまっています。

フォロー相手の投稿が埋まっていしまいがちな現在の仕様に
フィルタ機能を追加してはいかがでしょうか？

## 改善案
* 下記項目に対して任意のフィルタ機能を追加する
    * フォローした相手の投稿・ストック・コメント
    * 自分の投稿・ストック・コメント
    * フォローしたタグの投稿

* フィルタは名前付きで保存可能（RedmineやJIRAのフィルタのように）

＞運営担当者様
ご検討、よろしくお願い致します。
CentOSでPHPのImageMagickラッパーライブラリ、PECL::imagickを入れてWebPで出力してみる

ImageMagickを使えばさまざまな画像加工が簡単に出来てしまうのは有名ですよね。

ImageMagickは各言語で使えるライブラリが用意されています。今回はPHPのPECL::imagickです。

## きっかけ

SPAM記録をTwitterでやりたい！
↓
文字でtweetすると厄介
↓
なら画像にしよう
↓
何使うの？
↓
やっぱImageMagickでしょ！

## インストールしてみる
### →なぜか動かない

いきなり本番環境にインストールをそこら辺に転がってる情報たよりにしようとした自分はバカだった。

```shell-session
# yum install ImageMagick
 ...
# pecl install imagick
 ... 
# vim /etc/php.ini
 ...
```

一見インストール出来たかのようだったが何故か`setImageFormat`するだけでエラーがthrowされた。(違ったかも。セグメンテーション違反とか言われた覚えもある。)

自分でビルドもしてみたけどダメだった。

よくわからないままテスト環境で試行錯誤した結果、ある単純な解決方法にたどり着いた。

### rpmリポジトリから普通にいけるじゃん

`remi`にあった`ImageMagick-last`と`php-pecl-imagick`をインストールしてみたところ何の問題もなくImagickが使えた。なおPHPのバージョンごとに用意されているリポジトリからどうぞ。

```shell-session
# yum install --enablerepo remi,remi-php56 ImageMagick-late php-pecl-imagick
```

もしかしてImageMagick-lastはいらなかったのかもしれない。

## とりあえず動作確認してみよう

動作確認の方法はいくらでもあるだろうけど今回特に必要としているのは**画像への文字入れ**

とりあえずphp.netのサンプルコードを借りて$_SERVER変数の中身を画像内に入れてブラウザに返してみる、ということをやってみよう。

```php:imagetest.php
<?
 try{
  $image = new Imagick();
  $image->newImage(1300,800,new ImagickPixel('gray'));

  $draw = new ImagickDraw();
  $draw-> setFillColor(new ImagickPixel('blue'));
  $draw->setFontSize(20);
  $text = "";
   foreach($_SERVER as $key => $val ):
    $text.= "[{$key}] => {$val}\n";
   endforeach;
  $image->annotateImage($draw,10,30,0,$text);
  $image->setImageFormat('png');
   header('Content-type: image/png');
   echo $image;
  
 }catch(Exception $e){

   header('Content-type:text/plane');

  echo $e->getMessage();
 var_dump($e);
 }
```

ブラウザからアクセスしてみる。
![スクリーンショット (388).png](https://qiita-image-store.s3.amazonaws.com/0/23997/a0e1c598-de93-a04c-95db-f550a64b330a.png)

## WebPを試してみる
さて、ImageMagickは2011年ごろからWebPも扱えるようになっているらしい。WebPと言えばGoogleの開発する高圧縮な画像コーデック。
対応ブラウザがChromium系のみだったりと使いにくいのは確かだが、Googleの一部ページ内画像やChromeの帯域節約Proxyなんかでも利用されている。ちなみにChromeのような対応ブラウザはリクエストヘッダに`Content-type: image/webp,*/*`を含め、サーバー側でそれに応じてwebpを返しているみたい。

このimagickでもwebpが使える。14~15行目を

```php
  $image->setImageFormat('webp');
  header('Content-type: image/webp');
```

にするだけ。

15行目を

```php
  header('Content-type: */*');
```

みたいにテキトーな値にしておいてもChromeの開発者ツールにwebpと表示されていることが確認できる。

ところでこのWebP画像、明らかに非可逆圧縮されてるんだけど[losslessオプション](http://d.hatena.ne.jp/yoya/20130424/webp)はImagickではどうすればいいんだ…
Array.include? メソッドの逆を実装


## きっかけ

例えば、Userクラスが`role`という文字列の属性を持っているとします。
その`role`は、`manager`、`administrator`、`staff`のいずれかを取ります。
そのような時に、「マネージャーと管理者だけが実行できる処理」を判定するために

```ruby
if user.role == "manager" || user.role == "administrator"
  # 管理者用の処理
end
```

というのは冗長で書きたく無いです。
とは言え、

```ruby
if ["manager", "administrator"].include? user.role
  # 管理者用の処理
end
```

と書くと、DRYな感じがしましたが、文字列のArrayに`user.role`を引数としてメッセージを送るのは、何か違う気がします。

そこで、「`Array.include?`メソッドの逆を実装」しようと考えました。

*ちなみに、「マネージャーか管理者かを判定するメソッドをUserクラスに実装する」という正しい答えはこの際忘れて下さい。*


## できあがったものがこちら

実装から先に。思い切ってObjectクラスに実装しました。

```ruby
class Object
  def included? *params
    params.each do |param|
      return true if param === self 
    end
    false
  end
end
```

動きを見てみましょう。

```ruby
"apple".included? "orange", "apple"
=> true

"apple".included? "orange", "pineapple"
=> false

3.included? 1, 2, 3
=> true

5.included? 1, 2, 3
=> false
```

良いですね。比較には`===`メソッドを使っているので、

```ruby
"apple".included? String, Fixnum
=> true

3.included? TrueClass, Float
=> false
```

といった感じで、インスタンスに対してクラスを確認することもできます。

先程の例は、

```ruby
if user.role.included? "manager", "administrator"
  # 管理者用の処理
end
```

と書くことが出来て、一件落着です。

凄く簡単にですが、gemも作ったので良かったら使ってみて下さい。
https://github.com/norifumi/extensions
メモ

```hs:TreeSet.hs
import Data.Tree
import qualified Data.Set as S

branch :: Tree a -> [[a]]
branch Node {rootLabel=n, subForest=[]} = [[n]]
branch Node {rootLabel=n, subForest=f} = map (n:) $ branchF f
  where branchF f = concat $ map branch f

powerset :: Ord a => S.Set a -> S.Set (S.Set a)
powerset s
    | s == S.empty = S.singleton S.empty
    | otherwise = S.map (S.insert x) pxs `S.union` pxs
        where (x, xs) = S.deleteFindMin s
              pxs = powerset xs

ppowerset s = S.delete s (powerset s)
```
githubにpushする際のoriginを変更する方法


githubのpush先レポジトリを変更したい場合、
addコマンドではなくset-urlコマンドを使ったほうが好ましい。

```
git remote set-url <リポジトリの名前> <新しいリポジトリのURL>
```


例：

```
git remote set-url origin https://github.com/hogehoge/fugafuga.git
```
RailsアプリケーションがRakeから起動されたかどうかを知る方法（厳選2選）


## Railsアプリケーションの起動の仕方

Railsアプリケーションは基本的にwebアプリケーションとしてunicorn等のアプリケーションサーバーから起動されるのが一般的です。

また、バッチ処理的なものもRailsのアプリケーションの一部として記載でき、モデル等を共有して処理を記述できるので非常に生産効率が高いです。

バッチ処理的なものはrakeタスクにして、Rakeから起動することも多いと思います。その場合、モデル等からunicornから起動されたのか、Rakeから起動されたのかを知りたい時等あるかもしれません。

そんな時に役立つかもしれない、RailsアプリケーションがRakeから起動されたかどうかを知る方法、厳選2選です。

### 1)実行コマンドを確認する

Rakeタスクとして起動する場合は、`rake`コマンドから起動されます。それを確認します。

```ruby
if $0.split("/").last == "rake"
  # Rakeタスクとして起動したときの処理
else
  # それ以外の処理
end
```

という感じですね。とても素直です。
rakeコマンドにシンボリックリンクを貼っていたらどうするかについて知りたい？
インフラを構築した人に文句を言って直してもらいましょう。

### 2)環境変数にそれと分かる値を入れてRakeタスクを実行

元も子も無いですが、これが一番確実だと思います。cronで実行するならば、crontabに環境変数付けて`rake`コマンドを登録して下さい。

```sh
BATCH=true bundle exec rake any:task
```

てな感じでRakeタスクを起動して、

```ruby
if ENV["BATCH"] == "true"
  # Rakeタスクとして起動したときの処理
else
  # それ以外の処理
end
```

という感じで判定します。

## 結論

2種類方法を示しましたが、合わせるのが良いのでは無いか、というのが結論です。
実際にRakeタスクとそうでない時で処理を変えたいことがありました。その時は、

```ruby
if ENV["BATCH"] == "true" || $0.split("/").last == "rake"
  # Rakeタスクとして起動したときの処理
else
  # それ以外の処理
end
```

てな感じにして、環境変数を付けて判別しつつ、Rakeコマンドから実行されたかどうかの判定を安全装置的に利用しました。

安全装置は場合によっては（テスト等で）不要になると思いますので、時と場合によって使い分けると良いかと思います。
Java でオンメモリキャッシュを実装するときにスレッドについて気をつけるべきこと


Java では常にスレッドについて意識する必要がある｡
Map にキャッシュデータを入れたい場合､HashMap を使ってはいけない｡HashMap はスレッドセーフではないからだ｡

synchronized で保護してもいいが､いちいちするのも面倒だし､問題が起きがちなんで､

	   Map m = Collections.synchronizedMap(new HashMap(...));

のように､`Collections.synchronizedMap()` でよしなにする方法がある｡この方法でラップすると､メソッドアクセスの際に synchronized がかかるので安全になる｡

## ConcurrentHashMap と HashMap

HashMap をマルチスレッドからアクセスする場合､get メソッドを使った場合でも synchronized をかけざるをえず､パフォーマンスが出ない｡

ConcurrentHashMap ならば､取得時にはロックがかからないので､キャッシュには ConcurrentHashMap を使うことが望ましい｡
## Java 8 以後における ConcurrentHashMap によるキャッシュ実装

Java 8 では ConcurrentHashMap に computeIfAbsent メソッドが追加されている｡これを利用すれば簡単にキャッシュを更新することが可能となる｡

<blockquote>
指定されたキーがまだ値に関連付けられていない場合、指定されたマッピング関数を使用してその値の計算を試行し、nullでない場合はそれをこのマップに入力します。メソッドの呼出し全体は原子的に実行されるため、関数はキーごとに多くても1回しか適用されません。他のスレッドがこのマップに対して試行する更新オペレーションの一部は計算の進行中にブロックされる可能性があるため、計算は短く簡単にしてください。また、計算でこのマップの他のマッピングを更新しようとしないでください。
<br>
<br>
http://docs.oracle.com/javase/jp/8/api/java/util/concurrent/ConcurrentHashMap.html#computeIfAbsent-K-java.util.function.Function-
</blockquote>
これを利用することにより､今まで記述が難しかったキャッシュ処理の記述が極めて簡単になっている｡

````java
import java.util.concurrent.ConcurrentHashMap;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CachedMD5 {
    private final ConcurrentHashMap<byte[], byte[]> cache = new ConcurrentHashMap<>();
    private final MessageDigest md;

    public CachedMD5() throws NoSuchAlgorithmException{
        this.md = MessageDigest.getInstance("MD5");
    }

    public byte[] get(byte[] src) {
        return cache.computeIfAbsent(src, it -> {
            System.out.println("Calcurating...");
            return md.digest(it);
        });
    }

    public static void main(String[] args) throws Exception {
        CachedMD5 cached = new CachedMD5();
        byte[] bytesOfMessage = "hogehogefugafuga".getBytes("UTF-8");
        System.out.println(cached.get(bytesOfMessage));
        System.out.println(cached.get(bytesOfMessage));
    }
}
````
Microsoft Azure 請求書払い

※自分の経験を元に書いているので、同じ対応がされるとは限らないと思います

# Azureは請求書払いもできる
「 MSDN Blogs > Microsoft Azure サポート チーム サイト > 請求書払いへの変更申し込みについて 」
に説明ある
http://blogs.msdn.com/b/dsazurejp/archive/2013/06/27/azure-invoicing-process.aspx


# 登録前に
事前に、請求書払いが出来るかどうかの確認も出来る
```
Windows Azureのポータルで表示される事前購入相談窓口 (ページ上部「セールス」の電話番号) に電話いただき、ご相談下さい
```
ポータルサイト : http://azure.microsoft.com/


相談前に、利用するmicrosoft アカウントを決めておく必要ある（いきなりきかれる）
Office 365登録していて自社ドメインのアカウントある場合には、それでも大丈夫
※Office 365のメールは使っていなくても大丈夫

事前に相談して始めから請求書払いOKにしてもらっても登録時にはクレジットカード登録が必須。
サブスクリプション購入時に、最初から請求書払いが選べるようになる

# 登録したクレジットカード情報は削除してもらえる
登録後にクレジットカードの登録削除は、サポートにお願いするとやってくれる（手作業らしくかなり時間かかる）


# 請求期間とか締め日とかの詳細は
http://msdn.microsoft.com/ja-jp/windowsazure/dn221938
Vagrant チームメンバー用


Vagrantをチームで利用するときに、配布したVagrantfileを使うメンバーが時折おきるトラブルをまとめました.

チーム運用の際にメンバーに共有するつもりで作ったので参考にしてくだい.

## 基本

まずは基本コマンドから説明します.
`Vagrantfile`ファイルが置かれているディレクトリか、その下層のディレクトリで
`vagrant`コマンドが利用できます.

コマンド中の`[name]`は複数のVMがある時に指定するものです.

|コマンド|説明|
|:-----|:---|
|`vagrant status [name]`|ステータス表示|
|`vagrant suspend [name]`|サスペンド|
|`vagrant up [name]`|起動 (サスペンドからの復帰等) |
|`vagrant halt [name]`|シャットダウン|
|`vagrant reload [name]`|再起動|
|`vagrant destroy [name]`|イメージの削除|
|`vagrant ssh [name]`|SSH接続|

## SSHの設定

sshのconfigを設定しておくと、幸せになれます.

`vagrant ssh-config`コマンドでconfigの雛形が出力してくれます.

この結果を`~/.ssh/config`等に書いて`ssh ${HOST}`で接続できるようになります.

以下の出力結果の場合は`ssh default`で繋がります.

```bash
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/foo/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes
```

## トラブルシューティング

### ホスト/ゲスト間で`/vagrant`以下のパーミッションが異なる

Windows環境の場合、ゲストOSがLinux環境だと共有フォルダでマウントしたディレクトリ以下が`777`のパーミッションになります.

根本解決にはなりませんが`Vagrantfile`でマウントしたときのファイルとディレクトリのパーミッションが指定できます.

```Vagrantfile
config.vm.synced_folder “./”, “/vagrant”, owner: ‘root’, group: ‘root’, mount_options: ['dmode=777', 'fmode=666']
```

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

### `/vagrant`がマウントされない

ゲストOS上で`/vagrant`がマウントされない場合があります、
VirtualBox等のバージョンアップ等でマウントされなくなる様です.

この場合以下のコマンドをゲストOS上で実行することでマウントできるようになります.

```bash
sudo /etc/init.d/vboxadd setup
```

その後、念のためゲストOSを再起動するとマウントされると思います.
以下のコマンドをホスト側で実行すると再起動します.

```bash
vagrant reload
```

ちなみにマウントできない時のエラーは以下のような感じ

```
Failed to mount folders in Linux guest. This is usually beacuse
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:
/sbin/mount.vboxsf: mounting failed with the error: No such device
```

### ネットワークが使えなくなった

ゲストOSからグローバルへpingが通っていたものが、使えなくなることがあるようです.
`vagrant reload`等で再起動すれば直ったらしいですが、掴めていません.

windowsのノートPCでサスペンドからの復帰時に起きた事象です.
プログラムメモ[2014/09/17]

# iOS ColorPicker
どれにするか悩み中
参考URLのどれかを選ぶ予定．
初心者の小生でも，組み込みやすいものを選ぶ予定．
ソースコードをじっくり読んでみることにする．

このなかだと，Color-Picker-for-iOSのみ日本の方が作成しているものなので，英語にあまり自信がない俺には，最適なのだろうか？
## 参考URL
### Color-Picker-for-iOS
[説明サイト](http://yomoapp.tumblr.com/post/11770967899/ios-color-picker)
[github](https://github.com/katsuyoshi/Color-Picker-for-iOS/tree/master/Sample/Hayashi311ColorPickerSample)

### RSColorPicker
[github](https://github.com/RSully/RSColorPicker)

### InfColorPicker
[github](https://github.com/InfinitApps/InfColorPicker)

### iPhoneColorPicker
[説明サイト](https://code.google.com/p/iphone-color-picker/)
[github](https://github.com/fcanas/ios-color-picker)

### ILColorPicker
[github](https://github.com/jawngee/ILColorPicker)

# iOS 画面遷移
xibからxibへ，xibからコードによるビュー作成へ，などなど
iOSにおける画面遷移について

## 参考URL
[iPhoneアプリを作ろう: 画面遷移の３パターン](http://firstiphoneapp.blogspot.jp/2011/12/blog-post.html)
[次の画面のxibを呼び出して移動する | iPhoneアプリ開発者の憂鬱](http://ios.steppers-hi.net/?eid=2)
[Cocoaの日々: loadView と nib](http://cocoadays.blogspot.jp/2010/07/loadview-nib.html)
[ヒビノアワ: loadViewとviewDidLoadとself.view](http://cheebow.info/chemt/archives/2010/11/loadviewviewdid.html)
[UIViewControllerのloadViewとviewDidLoadの使い分け | DjangoAppLab](http://djangoapplab.com/uiviewcontroller%E3%81%AEloadview%E3%81%A8viewdidload%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91/)
[【iOS開発】 viewDidLoadとかviewWillAppearのタイミング - 3分クッキング](http://d.hatena.ne.jp/cooking_3min/20121129/1354176847)
Rails4.2の新機能について

#Rails4.2の新機能
Rails4.2から追加される機能について調べているので、そのメモです。適宜修正したりします。

##ActiveJob
まずはActiveJobです。これはdelayed_jobやresqueなどのキューイングを行うgemを同じインターフェースで使えるようにしたものです。使うためには以下のようなコードを追加する必要があります。

```ruby:config/initialize/active_job_setting.rb
ActiveJob::Base.queue_adapter = :delayed_job
```

上記はキューイングで使うgemに何を使うのかで右側の値が変わります。上の例ではdelayed_jobを使う設定になっています。
そして次にActiveJobのジェネレータを使った~Jobクラスを作成します。

```
rails g job hello
```

これをによりapp/jobsディレクトリが作成されて、配下にhello_job.rbが作成されます。この作成されたクラスに若干コードを追加して以下のようにします。

```ruby:app/jobs/hello_job.rb
class HellloJob < ActiveJob::Base
  queue_as :urgent

  def perform(message = 'test')
    # Do something later
    puts message
  end
end
```

ここまで作成したら、後はキューにセットしている箇所でActiveJobが用意しているメソッドを使うようにするだけです。
例えば以下のように書きます。

```ruby:
HelloJob.perform_later 'ほげほげほげ'
HelloJob.set(wait: 1.minute).perform_later 'うごうぐぐ'
```

このperform_laterメソッドがActiveJobが用意しているキューイング処理を行うメソッドです。でsetメソッドで何分後に時刻するかなど設定します。
4.2からはdelayed_jobやresqueを直接使うのではなくActiveJobを使うのがベストなやり方ということになるのでしょうかね。まだちょっとこれを使うメリットが分かっていないのですが・・。

##AdequateRecord
これはActiveRecordのfind_byやfindメソッドでRelationオブジェクトのキャッシュをすることで処理スピードを早くするというものらしい。

##Action Mailer
アクションメールについてもリリース事項があります。deliver_nowメソッドやdeliver_laterメソッドが追加されました。

```ruby:
Notifier.welcome(User.first).deliver_now!
Notifier.welcome(User.first).deliver_later!(wait: 1.hour)
Notifier.welcome(User.first).deliver_later!(wait_until: 10.hours.from_now)
```

##その他
Web Consoleなど他の機能はまた後日
APIを使わずにGoogleカレンダーに予定を作成する

### 結論：URLにパラメータを設定します。
例えばこんなイベントをカレンダーに登録したいとき。

```php
$event = array(
  "title" => "北海道旅行",
  "description" => "ぶらり旅",
  "place" => "北海道",
  "start_date" => "20200909T122530",
  "end_date" => "20200910T230030"
);
```

このイベント情報を含めたURLを組み立てます。

```php
$url =
  "http://www.google.com/calendar/event?"
    ."action="    ."TEMPLATE"
    ."&text="     . $event["title"]
    ."&details="  . $event["description"]
    ."&location=" . $event["place"]
    ."&dates="    . $event["start_date"]. "/". $event["end_date"];
```

オプションの内容は
text　予定タイトル
details　予定詳細
location　場所
dates　開始日時と終了日時
sprop　リンク元など
　spropは&で繋げれば複数設定できるようです。

あとはこのURLを叩くだけです。

```php
<html>
<head>
<body>
  <a href=<?php echo $url?>>カレンダーに登録</a>
</body>
</head>
</html>
```

参考
[googleカレンダーにurlパラメーターから追加する](http://kokonotsu.net/log/google%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%ABurl%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%8B%E3%82%89%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/)
正規表現でスネークケース↔キャメルケース/パスカルケースの変換


# 前提

ここでは、

- **ローワーキャメルケース** を **キャメルケース**
- **アッパーキャメルケース** を **パスカルケース**

と呼ぶ。

|これは|こんな感じ|つまり|
|---|---|---|
|スネークケース|hoge_hoge_hoge|単語をアンダースコア区切りにしたもの|
|キャメルケース|hogeHogeHoge|単語の先頭を大文字にしたもの(最初の単語は先頭が小文字)|
|パスカルケース|HogeHogeHoge|単語の先頭を大文字にしたもの(最初の単語も先頭が大文字)

# スネークケース → キャメルケース

hoge_hoge_hoge → hogeHogeHoge

```bash
echo 'hoge_hoge_hoge' | sed -r 's/_(.)/\U\1\E/g'
```

# スネークケース → パスカルケース

hoge_hoge_hoge → HogeHogeHoge

```bash
echo "hoge_hoge_hoge" | sed -r 's/(^|_)(.)/\U\2\E/g'
```

# キャメルケース → スネークケース

hogeHogeHoge → hoge_hoge_hoge

```bash
echo "hogeHogeHoge" | sed -r 's/([A-Z])/_\L\1\E/g'
```

# パスカルケース → スネークケース

HogeHogeHoge → hoge_hoge_hoge

```bash
echo "HogeHogeHoge" | sed -r -e 's/^([A-Z])/\L\1\E/' -e 's/([A-Z])/_\L\1\E/g'
```
Railsで作成するMVPの構築を効率化してみる


リーン・スタートアップでいうところのMVP(Most Valuable Product)を作る機会がここのところよくあり、MVPの立ち上げを効率よくするためにベースとして使っているリポジトリを公開してみます。

ここでは、そのリポジトリを使って、ローカルPC上に開発環境を構築して、その上で動作確認しながら開発し、Herokuで限定公開する流れをご紹介します。

それでは手順を順におっていきます。

## 準備

開発の環境はMacを想定しています。必要なアプリケーション類を入れていきます。

### VirtualBox

仮想化はVirtualBoxのバージョンは4.3.12で動作を確認しています。下記から対象のOSのインストーラーをダウンロードしてインストールします。

https://www.virtualbox.org/wiki/Downloads


### Vagrant

#### 本体

Vagrantは1.6.2で動作を確認しています。下記から対象のOSのインストーラーをダウンロードしてインストールします。

http://www.vagrantup.com/downloads.html


#### プラグイン

プラグインが必要になるので、コマンドラインから`vagrant plugin`でインストールします。

```bash
$ vagrant plugin install vagrant-omnibus
```

### Berkshelf

ホストOS側にChefの公開CookbookをいれるのためにBekshelfが必要になるので、rbenvを下記のURLを参照にしていれます。

http://www.d-wood.com/blog/2014/03/20_5847.html

Rubyのバージョンは特に問わないのですが、ここでは2.1.2をいれます。

```bash
$ rbenv install 2.1.2
$ rbenv global 2.1.2
```

gemでBerkshelfをいれます。


```bash
$ gem install berkshelf
```

## 開発環境の構築

ベースになるリポジトリを`git clone`して、依存するcookbookをいれます。

```bash
$ git clone git@github.com:hirotaka/rails-for-mvp.git
$ cd rails-for-mvp
$ berks vendor vendor/cookbooks
```

このままでもいいのですが、共有フォルダをNFSにすることでひとつひとつのコマンドの実行が早くなります。

NFSで共有するにはIPを固定にしなくてはいけないので、例えば下記の設定をVagrantfileに追加します。

```ruby:Vagrantfile
config.vm.network :private_network, ip: "192.168.33.11"
```

また、共有フォルダのオプションを変更します。

```ruby:Vagrantfile
config.vm.synced_folder ".", "/home/vagrant/rails-for-mvp", type: :nfs, create: true
```

`vagrant up`します。ネットワーク環境などによりますが結構時間がかかります。

```bash
$ vagrant up
```

立ち上がったらvagrant環境にsshでログインします。

```bash
$ vagrant ssh
```

データベースを作成します。

```bash
$ cd rails-for-mvp
$ cp config/database.yml.example config/database.yml
$ bundle install --path vendor/bundle
$ bundle exec rake db:create
```

適当に何かscaffoldでテーブルを作成します。ここでは、Userテーブルを作成します。

```bash
$ bundle exec rails generate scaffold User name:string email:string
$ bundle exec rake db:migrate
```

Railsサーバを起動します。

```bash
$ bundle exec rails server
```

ブラウザで下記に接続して管理画面を表示します。

http://localhost:3000/admin


追加したファイルをコミットします。

```bash
$ git add -a
$ git commit -am'Add user model'
```

## デモ環境

他の人でも見られるように、Herokuにデモ環境を構築していきます。

すでにHerokuのアカウントがあり、Heroku Toolbeltが設定されている状態で、

```bash
$ heroku create
$ git push heroku master
$ heroku run rake db:migrate
$ heroku open
```

これでブラウザが起動して、開発環境と同じアプリが動作していることを確認します。

以上です。
mintty をWindowsのタスクバーにグループ化する方法

minttyをWindowsのタスクバーにピン留めして、-i とかオプションを指定して起動すると別のアイコンがタスクバーに追加されて、複数起動するとそっちでグループ化されていた。
これを解消する方法が`man mintty`に記述されていた。

1) ~/.minttyrc に以下を追記  

```
AppID=mintty
```  
  minttyは何でもよい

2) https://code.google.com/archive/p/win7appid/ からダウンロードしたWin7AppId1.1.exeを実行（2014-09-17時点で1.1）
https://github.com/mintty/utils にもある  

```
$ ./Win7AppId1.1.exe "C:/Users/xxx/AppData/Roaming/Microsoft/Internet Explorer/Quick Launch/User Pinned/TaskBar/Terminal.lnk" mintty
```
minttyは.minttyrcのAppIDで指定した文字列を指定する。

これで、ショートカットにAppIDが設定されて？タスクバーのピン留めされたアイコンが起動中を示す状態になる。

# 追記（2018-09-20)

以下が参考になる

* [B.WH |Win : タスクバーのピン留めのがグループ化統合されない](http://blogwizhook.blog.fc2.com/blog-entry-187.html)
Swiftで複数の条件で配列をソートする関数を作ってみた


## はじめに

[Swiftで複数の条件で配列をソートする](http://qiita.com/yuch_i/items/ee78f2199575136a3700)の記事を見て汎用関数っぽいものを用意できないかなーと考えていたのですが、不細工なりに動いたので晒してみます。
(ろくに検証していません。)

* XCode6 GM + Playground



## 用意するもの

```swift:
extension Array {
    mutating func sort<T1: Comparable>(key1 k1: T -> T1, asc1: Bool) {
        if asc1 {
            sort { k1($0) < k1($1) }
        } else {
            sort { k1($0) > k1($1) }
        }
    }
    
    mutating func sort<T1: Comparable, T2: Comparable>(key1 k1: T -> T1, asc1: Bool, key2 k2: T -> T2, asc2: Bool) {
        sort {
            if k1($0) == k1($1) {
                return asc2 ? k2($0) < k2($1) : k2($0) > k2($1)
            } else {
                return asc1 ? k1($0) < k1($1) : k1($0) > k1($1)
            }
        }
    }
    
    mutating func sort<T1: Comparable, T2: Comparable, T3: Comparable>(key1 k1: T -> T1, asc1: Bool, key2 k2: T -> T2, asc2: Bool, key3 k3: T -> T3, asc3: Bool) {
        sort {
            if k1($0) == k1($1) {
                if k2($0) == k2($1) {
                    return asc3 ? k3($0) < k3($1) : k3($0) > k3($1)
                } else {
                    return asc2 ? k2($0) < k2($1) : k2($0) > k2($1)
                }
            } else {
                return asc1 ? k1($0) < k1($1) : k1($0) > k1($1)
            }
        }
    }
}
```

## 使い方の例

```swift:
class hogeClass {
    private var x: Int
    private var y: Int
    private var str: String
    
    init(_ x: Int, _ y: Int, _ str: String) {
        self.x = x
        self.y = y
        self.str = str
    }
}

var array = [hogeClass(50, 3, "aa"), hogeClass(50, 2, "bb"), hogeClass(60, 2, "bb"), hogeClass(15, 2, "bb"), hogeClass(15, 2, "aa")]

array.sort(key1: {$0.x}, asc1: true, key2: {$0.y}, asc2: true, key3: {$0.str}, asc3: true)

array
// [{x 15 y 2 str "aa"}, {x 15 y 2 str "bb"}, {x 50 y 2 str "bb"}, {x 50 y 3 str "aa"}, {x 60 y 2 str "bb"}]

```

## 所感

* 引数の数が可変ではないので、引数の数ごとに関数を用意してあげる必要が有るのが難点です。
* Swift上手い方ならもうちょっとスマートに書けそうですね（良いコードがあったら教えてください）。
RubyMotionでiOS Simulatorを任意の拡大/縮小率にセットする


[RubyMotion Kaigi](http://connpass.com/event/8254/)に行くので、簡単にコマンドとして作ってみました。

↓自分のエントリーですが、参考までに。
[iOS Simulatorを任意の拡大/縮小率で表示する](http://qiita.com/bellx2/items/db1bbd95512a3f88ab3c)


## インストール

~/Library/RubyMotion/command/scale.rbとしてのコードを保存します。

```~/Library/RubyMotion/command/scale.rb
module Motion; class Command
  class Scale < Command
    self.summary = 'Set Simulator Scale'
    self.description = 'Set iOS Simulator Window Scale. Set value (0.3 = 0.3x).'
    self.arguments = '[zoom_scale]'

    def initialize(argv)
      @zoom_scale = argv.shift_argument
      super
    end

    def validate!
      super
      help! "Specify a window scale of iOS Simulatorter." unless @zoom_scale
    end

    def run
      line = "defaults write com.apple.iphonesimulator SimulatorWindowLastScale "
      line << "#{@zoom_scale}"
      system(line)
    end
  end
end; end
```

## 使い方

プロジェクトディレクトリーで

> motion scale 0.4
> rake device_name="iPhone 6 Plus"

とすれば0.4倍にシミュレータのズームサイズを設定してiPhone6 Plusで実行できます。

## ごにょごにょ

RubyMotionのコマンドとして追加するよりはrakeコマンドとして「rake device_name="iPhone 6 Plus" scale=0.4」のように
作った方が適切かもしれませんが、ちょっと調べきれなかったので。
OS X 10.8 における Mac App Store の IAP の落とし穴2つ

# Auto-renewable subscription を有効期間中に再度購入すると購入が失敗する

有効期間が切れていない subscription を購入する `SKPayment` を発行すると、対応する `SKPaymentTransaction` の `-transactionState` が最終的に `SKPaymentTransactionStateFailed` になる。

このとき `theTransaction.error.code == 2` となる。

この挙動は10.9で変更され、有効期間中に再度購入しても正常に購入が完了する。 `-transactionState` は最終的に `SKPaymentTransactionStateCompleted` になる。

# 新規に取得したレシートにはそれ以前のトランザクションが記録されていない

レシートがない状態（おもに開発中でビルド直後の状態）から新規に取得したレシートには、それ以前に購入された IAP のトランザクションが記録されていない。 `-[SKPaymentQueue restoreCompletedTransactions]` を呼ぶと古いトランザクションも取得できる。

10.9では、新規に取得したレシートにも古いトランザクションが記録されている。
iOS SimulatorでiOS8を動作させるとHTTP通信ができない

# Summary
iOS SimulatorでiOS8を動作させたときにHTTP通信ができない場合、ESETなどのセキュリティソフトのWebアクセス保護を無効にすると通信できるようになる場合があります。
(HTTPSはできるんですけどね....)

# Description
Xcode6 GM を入れてiOS Simulatorで自分のアプリをテストすると、HTTP通信時に必ず

`NSUnderlyingError = "Error Domain=kCFErrorDomainCFNetwork Code=-1005 ...` 

ってなエラーが出てテストにならない。
errorの詳細を見てると、以下のエラーが出ておりSocketが作成できてないみたい。

`   "_kCFStreamErrorCodeKey" = 57;
    "_kCFStreamErrorDomainKey" = 1;`

いろいろ試した結果、ウチの環境では ESET Cyber Security Pro 5 のWebアクセス保護を無効にすることで通信できるようになりました。

とりあえず、これはESETに連絡かな...

### 追記
ESET Cyber Security Pro 6 に上げたらWebアクセス保護を有効にしたままでも行けますた。
gulp で、CoffeeScript をコンパイルして concat して SourceMap 出力して SCSS もコンパイルして watch する


とりあえず手元では動いているようなので上げておく。

- CoffeeScript をコンパイルして
- できた JavaScript ファイルを全部結合して
- sourcemap ファイルを出力して
- ついでに scss もコンパイルして
- ファイルの変更を監視する

という gulpfile です。

### gulpfile.coffee

```
gulp       = require 'gulp'
coffee     = require 'gulp-coffee'
concat     = require 'gulp-concat'
plumber    = require 'gulp-plumber'
sass       = require 'gulp-sass'
sourcemaps = require 'gulp-sourcemaps'


files =
	coffee: './app/**/*.coffee'
	scss  : './assets/css/**/*.scss'


gulp.task 'js', ->
	gulp.src files.coffee
		.pipe plumber()
		.pipe sourcemaps.init
			loadMaps: true
		.pipe coffee
			bare: true
		.pipe concat 'app.js'
		.pipe sourcemaps.write '.',
			addComment: true
			sourceRoot: '/src'
		.pipe gulp.dest './app'


gulp.task 'css', ->
	gulp.src files.scss
		.pipe plumber()
		.pipe sass()
		.pipe gulp.dest './assets/css'


gulp.task 'watch', ['build'], ->
	gulp.watch files.coffee, ['js']
	gulp.watch files.scss, ['css']


gulp.task 'build', ['js', 'css']
gulp.task 'default', ['build']
```

### package.json

```
{
	"name": "gulp-coffee-sass",
	"version": "1.0.0",
	"devDependencies": {
		"coffee-script": "*",
		"gulp": "*",
		"gulp-coffee": "*",
		"gulp-concat": "*",
		"gulp-plumber": "*",
		"gulp-sourcemaps": "*",
		"gulp-sass": "*"
	}
}
```

### つかいかた

```
gulp
```

でビルド、
指定フォルダの *.coffee ファイルをすべてコンパイルして1つのファイルにまとめ、SourceMap ファイルを出力。また、指定フォルダの *.scss もコンパイルします。

```
gulp watch
```

で監視に入ります。

---

一応 github に置きました

- [github.com/matsuoshi/gulp-coffee-concat-sourcemaps-sass-watch](https://github.com/matsuoshi/gulp-coffee-concat-sourcemaps-sass-watch)

gulp 昨日使い始めたばっかりなので、見よう見まねです。おかしいとこなどありそう。
Windows IEでBASIC認証をURLから行えるようにする。


IEでは、http://user@pass:example.org/のようなURLが無効になっている。
これを有効にするには、レジストリにキーを追加して対応する。

この方法はIE10では使えないようだ。IE9まではこの方法で使える。

## 32bit版
```
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
```

## 64bit版
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
```

これらのキーに、iexplore.exeというDWORD値を作成し、値を0にする。

## batファイル

regedit.exeからGUIで行うのは面倒なので、下記の内容のbatファイルを作って実行すると楽。

```
reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE" /v iexplore.exe /t REG_DWORD /d 0 /f

reg add "HKLM\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE" /v iexplore.exe /t REG_DWORD /d 0 /f
```


## 参考URL

http://support.microsoft.com/kb/834489


## おまけ IEの自動アップデートを無効化するbat

```
reg add "HKLM\SOFTWARE\Microsoft\Internet Explorer\Setup\8.0" /v DoNotAllowIE80 /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Internet Explorer\Setup\9.0" /v DoNotAllowIE90 /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Internet Explorer\Setup\10.0" /v DoNotAllowIE10 /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Microsoft\Internet Explorer\Setup\11.0" /v DoNotAllowIE11 /t REG_DWORD /d 1 /f
```
eclipse が Java heap spaceで止まる


>org.eclipse.ant.core.antBuildFile のコンテンツ・ディスクドライバーを作成できませんでした。コンテンツ・タイプが使用不可になりました。

>Java heap space


とダイアログがでた。

メモリ足りてるのに何でかいな？と思ったら、
JavaVM のヒープメモリの不足らしい。

eclipse.ini に以下を修正した。
(macの場合は、eclipse.app のパッケージに含まれている)

```
-Xmx1024m
```

デフォルトは 512MB。
CodeIgniterの設定

マニュアルに掲載されている手順でインストールしたあと、
アクセスするURLはデフォルトでは、

`example.com/index.php/news/article/my_article`

となっているので、
example.com/news/article/my_article
とするために、.htaccessに
`
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
`
を追加する

詳しくは、[本家のマニュアルを](http://codeigniter.jp/user_guide_ja/general/urls.html)を。
BitbucketでSSHエラー


今日bitbucketのリポジトリにSSH接続しようとしたら、
cloneもpushもpullも全て

```
ssh_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

というエラーになってました。

これはbitbucket側の問題っぽいのであきらめるのが良さそうですね。
寝て復旧を待つっていう。
Vagrantで構築した開発環境内でbundle installがフリーズする場合の解決策


## 1. 概要

以下の環境下で`bundle install`すると、途中でフリーズしてしまう現象が発生した（`Installing actionview`のところでフリーズしてしまう）。

- Mac OS X 10.9.4
- VirtualBox 4.3.16
- Vagrant 1.6.5
- CentOS 6.5
- Chef Solo 11.14.0.rc2
- Ruby 2.1.2（rbenv）
- Ruby on Rails 4.1.1
- 共有フォルダ: NFS

また、Boxは[Vagrantbox.es](http://www.vagrantbox.es/)に登録されている以下のものを利用した。

```
https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```

## 2. 解決策

結論からいうと、Boxを変えればよい。
例えば、Vagrant Cloudで公開されているChef公式のCentOSであれば問題なく`bundle install`が通った。

- [chef/centos-6.5](https://vagrantcloud.com/chef/boxes/centos-6.5)

Box以外まったく同じ環境で、いくつかのBoxを試したが、[2creative/vagrant-centos](https://github.com/2creatives/vagrant-centos/)のみフリーズした（私の力不足で、詳細な原因は分からなかった……）。

当該Boxはいくつかのチュートリアル系記事でインストールすべきBoxとして取り上げられている。
もし同じような現象が発生したら、Chef公式のBoxを試してみるとよい。

## 3. 考えられる原因

参考までに、解決に至るまでに考えた原因について書く。

### (1) rubygems.comに接続できない？（ネットワークの問題）

いくつかのGemがインストールできている時点で、ネットワークの問題ではない。

### (2) Linuxのパッケージ依存の問題？

パッケージの問題であれば、その旨のエラーが出力されるはず。

### (3) NFSのsynced_folderのパーミッションの問題？

NFSのパーミッション問題は検索するといくつも出てくるようで、疑ってみた。

MacでNFSを有効にすると、Vagrant内の共有フォルダの`uid:gid`が`501:20`になる。
これがvagrantユーザの各IDと異なり問題が起きていると考えた。

しかしそうであれば(1)と同じく1つもGemがインストールされるはずはない。

### (4) CPU/メモリが逼迫している？

十分に増やして試してみたが、現象は再現された。


### (5) Boxの問題？

Boxを変えたら現象は再現されなくなった。
ただ、前述のとおり原因は不明。

## 4. 備考

Vagrantは現在rsyncによる共有フォルダの同期が実装されている。

しかし、これはホスト側→ゲスト側の片方向のみの同期で、pull型はまだ実装されていない。
そのため、開発に使うことはまだ現実的ではない（例えば`rails g`など、ゲスト側で生成したファイルがホスト側に同期されない）。

NFSはUNIX系OS専用ということもあり、双方向rsyncによる同期が実現されればより汎用性の高い開発環境となり得る。

- 参考：https://github.com/mitchellh/vagrant/issues/3062

## 5. おわりに

上記現象について、原因に心当たりのある方はぜひコメントの方をよろしくお願いいたします。
NOREN〜アクションフィールドの作成〜

# はじめに
アクションフィールドの作成手順について説明。
- 項目の割出し
- 仕様書の作成
- アクションフィールド・リストメニュー作成方法
を1つの流れとする。

# 項目の割出し
商品のタイトル・説明文・値段等、
AFを作成するに当たり必要項目の割出しを行います。

![項目の割出し](https://qiita-image-store.s3.amazonaws.com/0/48560/f4822069-d9ba-7812-803e-509b5d34ed73.jpeg "項目の割出し")

この様な商品詳細ページがあった場合割出す項目は以下のようになります。

1. 商品画像
2. カテゴリ名
3. 商品名
4. 商品説明
5. お知らせ内容

# 仕様書の作成
項目の割出し後すぐにアクションフィールドの登録を行う事が出来ますが、
制作中にコンポーネント名やアクションフィールド名の確認が行え、
作業効率の向上に繋がるので仕様書を作成する事を**推奨**します。

ここから雛形をダウンロード出来るので参考にして下さい。
`DownLoad `：[AF仕様書](http://goo.gl/D2BLw7)

# アクションフィールドについて
仕様書を元にアクションフィールド及びリストメニューの作成を行います。

**<ポイント>**
リストメニューの最上部の項目は「---」とするとストーリテンプレート構築の際に条件分岐の項目として使用出来るので便利です。


## アクションフィールドの作成方法
1. アクションフィールド一覧ページから`登録 `を押す
![アクションフィールド一覧ページから`登録 `を押す](https://qiita-image-store.s3.amazonaws.com/0/48560/cc71673f-d9c6-4874-7bac-7162a370162c.jpeg "アクションフィールド一覧ページから`登録 `を押す")

2. 入力項目に記入し`登録 `を押す
**<備考>**
ID・フィールド名・グループ名以外の項目はアクションフィールドのタイプによって異なります
![入力項目に記入し`登録 `を押す](https://qiita-image-store.s3.amazonaws.com/0/48560/512d210f-33bf-6923-4ea4-65c748aa5efc.jpeg "入力項目に記入し`登録 `を押す")


## アクションフィールドのリストメニュー作成方法
1. アクションフィールド一覧ページから`アクションフィールドのリストメニュー `を押す
![アクションフィールド一覧ページから`アクションフィールドのリストメニュー `を押す](https://qiita-image-store.s3.amazonaws.com/0/48560/0f4335fa-80d1-f8bb-99b9-31da9c54b5ba.jpeg "アクションフィールド一覧ページから`アクションフィールドのリストメニュー `を押す")


2. `登録 `を押す
![`登録 `を押す](https://qiita-image-store.s3.amazonaws.com/0/48560/20104e1f-ef2e-4e24-a837-0fab0dc02669.jpeg "`登録 `を押す")


3. 仕様書で決めたメニュー名と項目を入力し`登録 `、最後に`適用 `を押す
![仕様書で決めたメニュー名と項目を入力し`登録 `、最後に`適用 `を押す](https://qiita-image-store.s3.amazonaws.com/0/48560/4ea2835f-1412-ed61-9343-6ee2765c4c80.jpeg "仕様書で決めたメニュー名と項目を入力し`登録 `、最後に`適用 `を押す")


# 併せて読む
[1. NOREN〜基礎〜](http://qiita.com/xxxamxxx/items/7e8e2bb3824b8f594e3d)
[2. NOREN〜アクションフィールドの作成〜](http://qiita.com/xxxamxxx/items/711c46e85ae1f55ee632)
[3. NOREN〜コンテンツマネージャの構築〜](http://qiita.com/xxxamxxx/items/19aa596e805075515f28)
AndroidStudio .jarファイル追加


##librariesディレクトリ追加
プロジェクト名にカーソルがある状態で  
`File > New > Directory > 'libraries'`

app,gradleと同じ階層にlibrariesディレクトリ作られる

##librariesディレクトリにコピペ
.jarファイルをコピペ。
※ドラッグ&ドロップだとパーミッションで怒られるのでコピペ

##build.gradle追加
`.jarファイル > 右クリック > 'Add as library' `
build.gradleに追加されていることを確認(srcの中のほう)

```java:build.gradle
dependencies { 
	compile files('../libraries/ほげ.jar’)　←追加されてる	
}
```
追加後ナビバーの sync gradle ボタン押して完了
HTMLに"chucknorris"(チャック・ノリス)色なんてあったっけ？

Stack Overflowで見かけたちょっと変わった質問とその回答。

質問：[Why does HTML think “chucknorris” is a color?](http://stackoverflow.com/questions/8318911/why-does-html-think-chucknorris-is-a-color)

回答：[Netscape時代の名残](http://stackoverflow.com/questions/8318911/why-does-html-think-chucknorris-is-a-color/8333464#8333464)

（参考 [チャック・ノリス・ファクト](http://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%83%83%E3%82%AF%E3%83%BB%E3%83%8E%E3%83%AA%E3%82%B9%E3%83%BB%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88)）
複数フォントを列挙して最初に見つかったフォントを使う

こんな感じの関数を定義する:

``````````````````````````````````````````el
(require 'cl)
(defun find-font (&rest fonts)
  "与えられたフォント FONTS で最初に見つかったフォントを返す"
  (find-if (lambda (f)
             (find-font (font-spec :name f)))
           fonts))
``````````````````````````````````````

使い方:

```````````````````````````````````````````````````el
(when window-system
  ;; 最初に見つかったフォントをデフォルトフォントに設定
  (let ((font (find-font "Ricty-11"
                         "Inconsolata-11"
                         "Monospace-11")))
    (if font (set-default-font font)))
```````````````````````````````````````````````````