OmniAICreator/Qiita-1.07M huggingface dataset:
絵文字ライブラリ「Emoji One」がなかなか良さげ

[Slack](https://slack.com/) の絵文字表示設定に「Emoji One Style」という選択肢があって、存在を知らなかったんだけど調べてみると良さげなツールだったのでメモ。
単なる「Webフォント」や「アイコン配布」でなく「ライブラリ」であるのがいまどき珍しいなと思った。

> Emoji One 公式サイト
> http://emojione.com/
>
> GitHubプロジェクトページ
> https://github.com/Ranks/emojione


![2015-09-04_164003.png](https://qiita-image-store.s3.amazonaws.com/0/37122/fb7740a7-fb5c-7128-7f44-e596d994d770.png)


上記公式サイトのトップに書いてあることには主に2つの問題を解決します的な感じで、
1つは「**モバイルでは表示されるけどデスクトップでは文字化け**問題」。
もう一つは「**表示できるとしてもデザインが違う**問題」。
**Emoji One はその2つの問題を解決**する、とのこと。

基本的には**文中にある絵文字っぽい記述を画像にして表示するというライブラリ**。
昨今流行りのWebフォントなどは単色にせざるをえないのと、絵文字のように国際化したものは見た目も統一されているべきなので、個人的にはこの Emoji One の方法以上の解決方法はいまのところなさそうに思う。


## 使い方

使い方はおもに JavaScript での使用方法と PHP での使用方法がある。
文字列内に絵文字っぽいものがあれば自動変換してくれる。

以下の例は[絵文字コード](http://www.emoji-cheat-sheet.com/)を画像に変換する例で、どちらも 「ねこ <img src="http://cdn.jsdelivr.net/emojione/assets/png/1F638.png?v=1.2.4" width="32"> です」と出力される。

### JavaScriptでの簡単な使い方

```html:JavaScriptでの簡単な使い方
<!-- CSS と JavaScript ファイルを読み込み -->
<link rel="stylesheet" href="./assets/css/emojione.min.css">
<script src="./lib/js/emojione.min.js"></script>

<!-- 出力 -->
<script>document.write(emojione.toImage('ねこ :smile_cat: です'));</script>
```

ちなみに JavaScript での使用なら CDN が利用できる。

```html:EmojiOne公式CDN
<!-- CSS -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/emojione/[バージョン]/assets/css/emojione.min.css">

<!-- JavaScript -->
<script src="//cdn.jsdelivr.net/emojione/[バージョン]/lib/js/emojione.min.js"></script>
```


### PHPでの簡単な使い方

```php:PHPでの簡単な使い方
// Emoji One ライブラリの読み込み
require('emojione/lib/php/autoload.php');

// インスタンス作成
$client = new Emojione\Client(new Emojione\Ruleset());

// (オプション) 出力画像の形式を指定 (デフォルトは「png」)
$client->imageType = 'svg';

// (オプション) 画像のパスを指定
$client->imagePathSVG = './assets/svg/';

// 出力
echo $client->toImage('ねこ :smile_cat: です');
```

上の例では絵文字コードからの変換だけど、もちろんユニコードからの変換も可能。


### パッケージマネージャーも

最近のこういうのはだいたい対応してますな。

```bash
# NPM
npm install emojione

# Bower
bower install emojione

# Composer
composer rewuire emojione/emojione
```


## ブラウザ対応状況

公式サイトに言及がなく、すべては調べてないけど **IE7でも表示できた**のでわりと安全っぽい。

## プラグインとか

[公式サイトの開発者向けのページ](http://emojione.com/developers)にあるように、[Railsパッケージ](https://github.com/dimelo/emojione-rails)とか[WordPressのプラグイン](https://wordpress.org/plugins/wp-emoji-one/)とかもあるので便利そう。


## ライセンス

CCライセンスは **[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/deed.ja)**、
ソフトウェアライセンスは **[MITライセンス](https://ja.wikipedia.org/wiki/MIT_License)** とのこと。

公式サイトのライセンス部分を引用すると以下のような感じ？

> :thumbsup: 改変したり、自作のものに混ぜたり可。
> :thumbsup: 商用でも非商用でも可。
> :thumbsup: 印刷物に使っても可。
> 
> :x: ライセンス条件を変えての配布はダメ。
> :x: 所有権とライセンスだけを保持するのはダメ。


-----

過去、ガラケーサイト全盛期に各キャリアで違う絵文字に四苦八苦した人には、少しなつかしい感じがするライブラリかもしれない。
この Emoji One はクライアントサイドでもサーバーサイドでも絵文字変換ができるので、必要ならガラケーサイトでもいけるはず（試してない）。
capistrano-passengerを使ってデプロイ後にPassengerを再起動する。



## やりたいこと

PassengerにのせているRailsアプリケーションをCapistranoでデプロイした後に再起動したい。


## やったこと

1. [capistrano/passenger](https://github.com/capistrano/passenger/)を使う

 ```ruby:Capfile
 
 require 'capistrano/passenger
 
 
 ``` 



2.  (rvmを使用している場合) `set :passenger_rvm_ruby_version` でRubyのバージョンを指定する。
 [capistrano/passengerのREADMEを読むと](https://github.com/capistrano/passenger#note-for-rvm-users)、Passengerがcapistranoの`rvm_ruby_version`と違っている場合は書いたほうがいいってこと？

 ```ruby:config/deploy.rb
 set :passenger_rvm_ruby_version, '指定するRubyのバージョン' 
 ```



3. `:passenger_environment_variables` と `:passenger_restart_command`を設定。

 この記述がなかったせいか、1,2だけの設定では` Could not find 'passenger' (>= 0) among 15 total gem(s) (Gem::LoadError)`などのエラーが出てしまった。
 `path-to-passenger`は、`passenger-config --root`で出てきたものに書き換える。
 
 ```ruby:config/deploy.rb
 set :passenger_environment_variables, { /path-to/passenger/bin:$PATH }
 set :passenger_restart_command, "/path-to-passenger/bin/passenger-config restart-app #{deploy_to}" 
 ```

以上で、`cap production deploy`をするとPassengerを再起動してくれると思います。

## 参考

- [Automating deployments of Ruby application updates through Capistrano - Standalone - Passenger Library](https://www.phusionpassenger.com/library/deploy/standalone/automating_app_updates/ruby/#editing-instructions-1)

- [capistrano/passenger](https://github.com/capistrano/passenger#note-for-rvm-users)

- [Issues · capistrano/passenger](https://github.com/capistrano/passenger/issues)
拾弐 Cocos2d-xでデータを保存する 読み出す

#目次
1 はじめに
2 データを保存する 読み出す
3 今後の予定

#はじめに

#データを保存する 読み出す
下記コードを実行すると、タッチ回数が左上に表示され、アプリを再起動時に、保存されたタッチ回数を読み出すことができます。

```GameScene.lua
local KEY = "SCORE"

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()

    scene:addChild(scene:createLayer())

    return scene
end


function GameScene:ctor()
    self.visibleSize = cc.Director:getInstance():getVisibleSize()
    self.origin = cc.Director:getInstance():getVisibleOrigin()
    self.schedulerID = nil
end

function GameScene:playBgMusic()

end

function GameScene:createLayer()
    local layer = cc.Layer:create()

    -- 背景
    local sprite_background = cc.Sprite:create("farm.jpg")
    sprite_background:setPosition(self.visibleSize.width/2, self.visibleSize.height/2)
    sprite_background:setScale(1.2)
    layer:addChild(sprite_background)

    -- a1)保存されている"SCORE"の値を取得　ない場合は0
    local score = cc.UserDefault:getInstance():getIntegerForKey(KEY, 0)

    -- 得点ラベルを追加
    local label = cc.Label:createWithSystemFont(score, "Arial", 50)
    label:setPosition(100,900)
    layer:addChild(label)
    
    -- タッチ開始時に呼ばれる
    local function onTouchBegan(touch, event)
        local location = touch:getLocation()

        -- 得点を1足して得点表示を更新
        score = score + 1
        label:setString(score)
        
        -- a2)得点情報を"SCORE"に保存する
        cc.UserDefault:getInstance():setIntegerForKey(KEY, score)

        return true
    end

    -- タッチイベントで呼ばれる関数を登録し、このレイヤーでのタッチイベント取得を有効化
    local listener = cc.EventListenerTouchOneByOne:create()
    listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
    local eventDispatcher = layer:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)

    return layer
end

return GameScene

```

a1)の`cc.UserDefault:getInstance():getIntegerForKey(KEY, 0)`が保存された値を読み出すAPIです。ここでKEYの部分は任意の文字列を指定できます。ここでは"SCORE"を指定しています。また、第二引数の0は、保存された値がないときに返されます。つまり、"SCORE"の値を読み出せ、但し保存された値がない場合は0を返せ、という意味です。

a2)`cc.UserDefault:getInstance():setIntegerForKey(KEY, score)`で"SCORE"の値を保存しています。第二引数の値が"SCORE"の値として保存されます。

初回起動時は、左上の表示が0ですが、

![12-1.png](https://qiita-image-store.s3.amazonaws.com/0/90495/6f56f98f-8da3-5807-e081-33f4f32bca62.png)

何回か画面をタッチしてから、再度起動すると、保存されたタッチ回数が起動時にすぐ表示されます。

![12-2.png](https://qiita-image-store.s3.amazonaws.com/0/90495/54ba5175-e0b9-71bf-0f3e-972baf76ba73.png)



#今後の予定
Cocos2d-xでゲームを作るときに有用な、表示桁数の指定や、時間の取得を行う等、いくつかのLuaの関数について説明します。
Ansibleを使ってみた

2011年からお世話になっているmacbookproのHDDがお亡くなりになったので、SSDに換装した。
でも今までの開発環境が微妙だったので、クリーンインストール後、タイムマシンからのバックアップ復元をせず、新規に構築していこうと思った。

でも。。。。新しく構築するのめんどくさいなぁ。。。。ということで、せっかく他の人もやってるようなので、chefではなくansible使って環境設定していこうって思ってやってみた。

#homebrewの導入
```lang:yosemite
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew doctor

```

#anbileの導入
```lang:yosemite
brew install python
brew install ansible
```

#環境構築
```lang:yosemite
mkdir initialSetup
cd    initialSetup
vi    hosts.list
vi    setup.yml
```
自分しか使わないので、

```lang:hosts.list
localhost
```

```lang:setup.yml
- hosts: localhost
  connection: local
  gather_facts: no           
  sudo: no
  vars:
    homebrew_taps:
      - caskroom/cask
    homebrew_packages:
      - { name: python }
      - { name: ansible }
      - { name: git }
      - { name: wget }
      - { name: curl }
      - { name: tree }
      - { name: nkf }
      - { name: go }
      - { name: ruby-build }
    homebrew_cask_packages:
      - { name: cocoapods }
      - { name: firefox }
      - { name: google-chrome }
      - { name: adobe-reader }
      - { name: sourcetree }
      - { name: atom }
      - { name: intellij-idea }
      - { name: vagrant }


  tasks:
    - name: リポジトリを追加
      homebrew_tap: tap={{ item }} state=present
      with_items: homebrew_taps

    - name: homebrew をアップデート
      homebrew: update_homebrew=yes

    # brew
    - name: パッケージをインストール
      homebrew: >
        name={{ item.name }}
        state={{ item.state | default('latest') }}
        install_options={{
          item.install_options | default() | join(',')
          if item.install_options is not string
          else item.install_options
        }}
      with_items: homebrew_packages
      register: brew_result
    - name: パッケージの情報保存先ディレクトリを作成
      file: path=brew_info state=directory
    - name: パッケージの情報を保存
      shell: brew info {{ item }} > brew_info/{{ item }}
      with_items: brew_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list

    # cask
    - name: homebrew-cask のインストール
      homebrew: name=brew-cask state=latest
    - name: cask パッケージをインストール
      homebrew_cask: name={{ item.name }} state={{ item.state|default('installed') }}
      with_items: homebrew_cask_packages
      register: cask_result
    - name: cask パッケージの情報保存先ディレクトリを作成
      file: path=cask_info state=directory
    - name: cask パッケージの情報を保存
      shell: brew cask info {{ item }} > cask_info/{{ item }}
      with_items: cask_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list

  handlers:
    - name: run fc-cache
      shell: fc-cache -vf
```

```lang:yosemite
HOMEBREW_CASK_OPTS="--appdir=/Applications" ansible-playbook -i hosts -vv setup.yml
```
なんか上手くいったくさい。
確認してみる。

```lang:yosemite
ls -l brew_info
ls -l cask_info
ls -l /opt/homebrew-cask/Caskroom/
ls -l /opt/vagrant
ls -l /Applications
```

#思ったこと
開発環境はvargrant上で構築したほうがいいかと思うので、caskだけホストで実施し、それ以外の環境構築はvargrant上で構築できるように修正していこうかなと思う。


こちら参考にさせていただきました。
[Mac の開発環境構築を自動化する (2015 年初旬編)](http://t-wada.hatenablog.jp/entry/mac-provisioning-by-ansible)
Rを使うなら知っておきたいチートシート群

Rにもチートシートはある。
なかでもRStudio社のチートシートは使い勝手が良い。
RStudio社のチートシートは知っている人にとっては当たり前の情報だが、知らない人は本当に知らないことを最近知ったのでQiitaにも記事を残しておく。
**できればこの記事をストックするのではなく、以下のURLをブックマークしてほしい。**
https://www.rstudio.com/resources/cheatsheets/

以下に各チートシートの簡単な紹介とURLを示す。

## データハンドリング
いわゆるデータの前処理。Data Wranglingとも言う。
dplyr、tidyrを使った例が図入りで書かれている。必見。
https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
なお、データハンドリングのみ有志により日本語に翻訳されたものがある。
https://www.rstudio.com/wp-content/uploads/2015/09/data-wrangling-japanese.pdf

## 可視化
ggplot2を使ったモダンな可視化が一覧としてまとまっている。
https://www.rstudio.com/wp-content/uploads/2015/08/ggplot2-cheatsheet.pdf

## レポーティング
Rを使ったレポーティングにはR markdownを使うと非常に便利である。
レポーティングの流れも含めて書かれたチートシートと、様々なオプションが一覧になったリファレンスがある。
まずはチートシートで流れを頭に入れてからリファレンスで細かいところを確認すると良い。

チートシート
https://www.rstudio.com/wp-content/uploads/2015/02/rmarkdown-cheatsheet.pdf
リファレンス
https://www.rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf

## パッケージ開発
RStudioを使うことでパッケージは簡単に開発できる。
その流れがまとめられている。
https://www.rstudio.com/wp-content/uploads/2015/06/devtools-cheatsheet.pdf

## Shiny
RでWebアプリを作るならShinyを使うと便利。
http://shiny.rstudio.com/images/shiny-cheatsheet.pdf
Angucomplete-altの積みどころ

AngularJSでオートコンプリートを実装しようとした時に
https://github.com/ghiden/angucomplete-alt
を使用したのですが、使い方がちょっとわかりづらかったのでこれから使う方のためにまとめておきます。


##Angucomplete-altとは

Angucomplete-altは`<angucomplete-alt/>`というタグを入れるだけで簡単にオートコンプリートを実装できるというものです。しかし、オートコンプリートは簡単に実装できますが、そのデータの扱いが少し複雑で積みました。

##具体例
ここで、配列要素を`ng-repeat`で繰り返してそこにこのオートコンプリートを実装します。

```hoge.html
<div ng-repeat="hoge in hoges">
  <angucomplete-alt id="huga" selected-object="selectedFn" remote-url="/hoge?q=" title-field="hoge" input-changed="changedInput"/>
</div>
```

このコードでオートコンプリート自体は完成です。これで入力した文字が自動的にurlの`q`パラメータに代入されGETリクエストを送りオートコンプリートを表示します。
選択されたデータは`selected-object`に渡されます。`selected-object`には関数をかけます。ここでは関数を書いています。

ここで一つ罠があって`selected-object`に`hoge.huga`などと書いてもそこにバインドされません。また、オートコンプリートを利用せずにそのまま文字を書き込んだ場合は`selected-object`に指定された変数、関数に値が渡されません。
そこで下記のようにJSのコードを書いてhogeないの特定データに値が代入されるようにします。

```controllers.js
$scope.selectedFn = function($item){
  $scope.hoges[this.$parent.$index].huga = $item.title;
}

$scope.changedInput = function(huga){
  $scope.hoges[this.$parent.$index].huga = huga;
}
```

上の`selectFn`ではオートコンプリートが選択された時に呼ばれる関数で`selected-object`の値に設定しています。
下の`changedInput`はテキストフィールドないの文字列が変化した時に呼ばれる関数で`input-changed`の値に設定しています。ちなみにこの`$item.title`には`title-field`で指定したレスポンスのプロパティが入っています。

両関数とも入力データをhoge内のhugaプロパティに代入しています。

##結論
これが正しい方法なのかはわかりませんが、angucomple-altは少しめんどくさい実装をしなければならなかったのでまとめておきました。
他にやり方があれば教えて下さい。
rails g 実行時テストファイルを作らないようにする方法

# 1.アプリケーション作成時にtestファイルを作らないようにする
`rails new`する際、次のようなオプションを指定して実行します。

```terminal:ターミナル
& rails new myApp -T
```

-Tオプション(または--skip-test-unit)をつけることで、`test::unit`を組み込まない状態で`rails new`ができます。
# 2.すでに作成したアプリケーションに対して適用する場合
`application.rb`ファイルの`class Application < Rails::Application`内を次のように編集します。

```rb:application.rb
module Practice
  class Application < Rails::Application
    # ---------------追記部分--------------
    config.generators do |g|
        g.test_framework false
    end
    #----------------追記終了--------------
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de
  end
end

```
このように記述することで`rails g model`などを実行した時、テストファイルを作成することがなくなります。 
# 参考url

1.[rails g コマンドでテストを作らないようにする方法](http://qiita.com/narikei/items/36ac346d2b9eedfb8fdc)
2.[Rails ドキュメント railsコマンド(rails)](http://railsdoc.com/rails)
3.[Railsのgenerateコマンドを俺好みに設定する](http://tmiyamon.github.io/blog/2014/11/13/configure-the-behavior-of-scaffolding-in-rails/)
4.[Ruby on Rails: Switch from test_unit to rspec](http://stackoverflow.com/questions/9884033/ruby-on-rails-switch-from-test-unit-to-rspec)
(g.test_frameworkの指定の仕方を参考にしました。)
CollectionVIewで複数選択＆tagの意外な使い方

メモ

collectionViewの複数選択で調べていたら

```swift
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
{
         var cell = collectionView.cellForItemAtIndexPath(indexPath)
         if cell?.selected == true {
            cell?.backgroundColor = UIColor.orangeColor()
         }
          else 
             cell?.backgroundColor = UIColor.clearColor()
}
```
が見つかって早速実装したが、どうやらtapする度にtrue が入るのでどうにかfalseに切り替える必要があったが、変数でカウントする方法では関数が呼び出される度にカウントされてしまうため、cell独自のカウンターをtagを使ってつくってみた
生成のときに初期化してある

```swift
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        var cell = self.cellForItemAtIndexPath(indexPath)
        
        cell?.tag += 1
        if cell!.tag % 2 == 0 {
            cell?.selected = false
        }
        
        if cell?.selected == true {
            cell?.backgroundColor = UIColor.redColor()
        } else if cell?.selected == false {
            cell?.backgroundColor = UIColor.clearColor()
        }
    } 
```
Apache Zeppelinのビルド時にPhantomJSのエラーが出る場合の対処方法

この記事の執筆時は2015年9月4日です。

[Apache Zeppelin](https://zeppelin.incubator.apache.org/)の最新版を[GitHub](https://github.com/apache/incubator-zeppelin)から取得してビルドしようとしたら

```bash
git clone https://github.com/apache/incubator-zeppelin.git
cd incubator-zeppelin/
mvn install -DskipTests -Dspark.version=1.4.0 -Dhadoop.version=2.6.0 -Phadoop-2.6 -Drat.numUnapprovedLicenses=100
```

`PhantomJS` が起動できなくて停止してしまいました (´；ω；｀)

```bash
[INFO] Running "karma:unit" (karma) task
[INFO] INFO [karma]: Karma v0.12.37 server started at http://localhost:8080/
[INFO] INFO [launcher]: Starting browser PhantomJS
[INFO] ERROR [launcher]: Cannot start PhantomJS
[INFO]
[INFO] INFO [launcher]: Trying to start PhantomJS again (1/2).
[INFO] ERROR [launcher]: Cannot start PhantomJS
[INFO]
[INFO] INFO [launcher]: Trying to start PhantomJS again (2/2).
[INFO] ERROR [launcher]: Cannot start PhantomJS
[INFO]
[INFO] ERROR [launcher]: PhantomJS failed 2 times (cannot start). Giving up.
```

ありがたいことに `Karma` のissueに解決方法が上がっていました。
https://github.com/karma-runner/karma-phantomjs-launcher/issues/31

どうやら `libfontconfig` が必要とのこと。

```bash:REHL
yum install -y fontconfig-devel.x86_64
```

```bash:debian
apt-get install libfontconfig
```

これでビルドが通るようになります v(￣Д￣)v
c++ builder XE4, 10.2 Tokyo > Window Message > E2227 __fastcall TForm1::funcAfterOnShow()の呼び出しに余分なパラメータがある

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

Window messageを使おうと思って実装したところ、以下のエラーに遭遇した。

> E2227 __fastcall TForm1::funcAfterOnShow()の呼び出しに余分なパラメータがある

```cpp:Unit1.h
BEGIN_MESSAGE_MAP
	MESSAGE_HANDLER(WM_SHOWED, TMessage, funcAfterOnShow);
END_MESSAGE_MAP(TForm)
```

```cpp:Unit1.cpp
void __fastcall TForm1::funcAfterOnShow(void)
{
	ShowMessage(L"test");
}
```

関数の定義を以下のようにすることでエラーはでなくなった。

```cpp:Unit1.cpp
void __fastcall TForm1::funcAfterOnShow(TMessage msg)
{
	ShowMessage(L"test");
}
```

E2227の「余分なパラメータがある」というエラーメッセージで混乱したが、実際にはfuncAfterOnShowの引数を`(TMessage msg)`とすべきところを`(void)`という引数にしていたのが問題だった。

`(void)`で定義されたfuncAfterOnShow()からすると、確かに`MESSAGE_HANDLER`の引数2つめの`TMessage`が「余分なパラメータ」という認識だったのだろう。
EditTextのバグに対処した話

##目的
ドットインストールの勉強中に出たエラーの処理。

##内容
ドットインストール
「Androidでウェブブラウザを作ろう」の中の
「#08 任意のサイトを表示してみよう」の一部分

```MainActivty.java
   public void clearUrl(View view) {
        urlText.setText("");
    }
```

```activty_mail.xml
   <EditText
    ...
    android:onClick="clearUrl"
    ...
```

##エラー内容
EditTextをタップするとアプリが落ちる

```Could not find a method clearUrl(View) in the activity class ```

エラーはclearUrlというメソッドがないという内容

##やったこと
エラーを見て始めはclearUrlのタイプミスかと思いましたが、全部をコピペしても解消せず。
SDK、BuildToolsのversionを下げても解消せず。

##解決方法
調べたら恐らく同じサイトで同じ場所でエラーが出ている方がいました。

androidのactivity_mainでEditTextにonClickを設定するとエラーが起きる
http://ja.stackoverflow.com/questions/10545/android%E3%81%AEactivity-main%E3%81%A7edittext%E3%81%ABonclick%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E8%B5%B7%E3%81%8D%E3%82%8B

バグのようなので最終的に
Buttonを新しく作り、そのButtonにonClickを設定しました。

```
      <Button
          android:text="Clear"
          android:onClick="clearUrl"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
```

##感想
エラーが出るのは全て自分が悪いはずだと思っていましたが、こういう事もあるんですね。
c++ builder XE4, 10.2 Tokyo > TForm > 最初のフォームを切り替える > onShow / window message

```txt:動作環境
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

やりたいこと

- アプリ実行時に、最初のフォームを実行時引数に基づき変更する

とりあえず「実行時引数に基づき」は後で実装するとして「フォームを変更する」だけやってみる。

##try1 (onShowで処理)

OnShowに以下のコードを実装してみた。

```cpp
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Form2->ShowModal();
	this->Close();
}
```

やっているのはFormShowで別のフォームを表示しておき、そのフォーム(Form2)がクローズされた時にForm1を閉じる。

上記の問題点は、<font color=red>タスクバーにアプリケーションアイコンが表示されないこと</font>

<hr>

##try2 (window messageで処理)

以下のようにフォームが表示された直後に処理を実装する方法を使うことになるのだろうか。
http://www.din.or.jp/~egawa-n/delphi/tips/form_showed.html

上記をもとに、以下を実装してみた。

```cpp:Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "Unit2.h"
class TForm1 : public TForm
{
__published:
	void __fastcall FormShow(TObject *Sender);
private:
	void __fastcall funcAfterOnShow(TMessage msg);
	static const int WM_SHOWED = WM_USER + 1;

public:
	__fastcall TForm1(TComponent* Owner);

BEGIN_MESSAGE_MAP
	MESSAGE_HANDLER(WM_SHOWED, TMessage, funcAfterOnShow);
END_MESSAGE_MAP(TForm)

};
extern PACKAGE TForm1 *Form1;
#endif
```

```cpp:Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{

	PostMessage(Handle, WM_SHOWED, 0, 0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::funcAfterOnShow(TMessage msg)
{
	this->Hide();
	Form2->ShowModal();
	this->Close();
}
//---------------------------------------------------------------------------
```

こちらでも、タスクバーのアイコンが消えてしまった。

Form1の表示を消そうと `this->Hide()`をすることにより、アイコンも消えてしまうようだ。

`this->Hide()`をコメントアウトにすることで、Form1が表示されたままではあるが、タスクバーにアイコンが表示されるようになった。
初心者がFB APIとPHPを使って自分のFBのタイムラインに投稿するまでのチュートリアル

注意。投稿はできるし自分のタイムラインには投稿が表示されますが、FBに申請しないとほかの人のタイムラインには表示されません。

##1.FBに登録
もうすでにアカウントを持っている人は飛ばして OK。
1-1.FBにアクセスしてトップページからアカウントを作成。
https://www.facebook.com/
1-2.個人情報登録。公開範囲は気をつけて。

##2.開発者登録
2-1.FBにて電話番号もしくはクレジットカード番号を登録。そうしないと開発させてくれない。
https://developers.facebook.com/
2-2.FB developerにアクセスしログイン。ログインするとなぜかFBのタイムラインに飛ばされる謎仕様なのでもう一度developersにアクセス。
https://developers.facebook.com/

##3.アプリ登録
3-1.上のメニューのMY Appsをクリック、[Add a New App]をクリックし、phpでうごかすので[www(ウェブサイト）]をクリック。
3-2.アプリの名前を入力し、Create New Facebook App IDをクリック。適当に「test」とかでもOK。
3-3.Is this a test version of another app? はいいえでOK。
3-4.　カテゴリーは適当にエンターテイメントでも教育でもいいので選んでOK.
3-5.Tell us about your websiteのところにサーバかローカルのURLを入れとくと使い勝手良くなるけれど、別に無視して右上のskip quick startクリックしちゃってOK

##4.SDK for PHP v5.0をダウンロードもしくはサーバへアップロード
4-1.Facebook SDKをダウンロード。こいつ使うと簡単に投稿できるようになってる、くらいの理解でOK。
https://developers.facebook.com/docs/php/gettingstarted/5.0.0
githubからも入手可能だけれどこっちはv4
https://github.com/facebook/facebook-php-sdk-v4
4-2.サーバー、もしくはローカル（サーバ起動してね。）にダウンロードしたSDKをアップロードして解凍。Facebookのパス（リンク）を確認しておく。

##5.各パラメータを入手
5-1.上のメニューからTools&Supportをクリック。Graph API Explorerをクリック。
投稿にはこのグラフAPIというのを使用する。投稿権限（permission)「pubrish_actions」というのが必要です。FBページに投稿する場合も同様に「publish_pages」が必要。これは**スパムアプリが流行ったせいで申請しないともらえないようになっちゃったけれど、自分のタイムラインでテストする分には使える**ので、以下にその方法を紹介。
5-2.右上のapplication?のとこでさっき入力したアプリ名を選択
5-3.そのすぐ下にあるGet TokenからGet Access Tokenを選択、上にあるExtended Permissionsをクリックし、「pubrish_actions」にチェックをいれる。
5-4.Get Access Tokenをクリック。[アプリ]は次の情報を受け取ります: あなたの公開プロフィール。という画面が出てくるのでOKをクリック。赤い注意書きで「以下に示す権限の一部はFacebookで使用するように承認されませんでした。」とか出てくるけど気にしない。同様に「cheezがあなたの代わりにFacebookに投稿する許可を求めています。
投稿を誰とシェアしますか？」という画面が出てくるのでこれもOKをクリック。共有範囲は友達を選択すればいいのだけれど、申請しないまま投稿しても友達のタイムラインに反映されない
5-6.もとの画面にもどってAccess Token:のところに表示されるので、左側の[i]ボタンを押して右下のOpen in Access Token Toolをクリック。
5-7.左下のExtend Access Tokenボタンをクリック。FBのパスワードを求められるので入力。この文字列をテキストエディタとかにメモる。

##6.投稿の準備と投稿
6-1.上のメニューのMy Appから作ったアプリを選択。
6-2.App IDをメモる。右のApp secretもshowボタンを押してパスワードを入力し表示してコピペでメモる。
6-3.phpファイルをつくる

```php:post.php
<?php
//AppID,APP secret,access tokenの設定を入力。access tokenは超長い文字列になってるはず。
$appId = '**********19094';
$secret = '3e**890458184d6******9d6';
$access_token ='**************************scOBK9Q6p1XZAIiZButIJFpnmdIZC********************************************************39MBoEdIUEmDZAolbFWnkdRNyk3qZBlKs5NZCWF*************';

// 投稿したい文章を入力
$message = 'FB APIからの投稿です。';

// PHP SDKを読み込む。パスを確認すること。
require_once 'src/facebook.php';

$facebook = new Facebook(array('appId' => $appId, 'secret' => $secret));
// Facebookオブジェクト生成時にappId、secretを指定しなくても投稿可（投稿時のパラメータにaccess_tokenを指定するため）

// POSTメソッドで「/me/feed/」を指定すると自分のタイムラインに投稿できる

$facebook->api('/me/feed/', 'POST', array('access_token' => $access_token, 'message' => $message));
?>
```

http://socialmedia.project0884.com/facebook/post_wall.phpを参照しました。
6-4.post.phpにアクセスすれば投稿完了。以下はつまづきやすい点。
6-5.#100エラーが出た場合、appIDやsecretやaccess_tokenなど必要な変数やスペルが間違っている可能性を確認。
6-6.#200エラーが出た場合、Get Access Tokenで管理権限（permissions)がちゃんと設定されていない可能性を確認。

【参考】http://snowadays.jp/2014/06/2851
Rubyの日付関係メモ　(RoRを使っていることが前提）

# Dateクラス

[Is Date.today in UTC?](http://stackoverflow.com/questions/10219670/is-date-today-in-utc)
> Dates do not have timezones

[(Dateクラス）RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い](http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c#date%E3%82%AF%E3%83%A9%E3%82%B9)



> * Date.today で現在の日にちが取得できる。このとき、環境変数またはシステムに設定されているタイムゾーンで日にちが取得される。

> * 生成されたインスタンス自体はタイムゾーンを考慮しない。（タイムゾーンの情報は保持されない）

## Dateクラス特徴
（詳しいことは上記参照だが）

* とにかく**インスタンスはタイムゾーンの情報を持ってない**
* アクティブレコードで`:date`で定義されたものは`Dateクラス`
* タイムゾーン持ってないので`date.day`とかは素直に持ってるdayを返してくれるはず

### 資料
`Schema Information`で`date       :date`になっているもののDBでの表示
![Screen Shot 2015-09-04 at 06.16.05.png](https://qiita-image-store.s3.amazonaws.com/0/27895/9bfe16db-db43-afe8-fbd2-50c2813e14a8.png)

`p アクティブレコード.date.class`は`Date`が表示される

# TimeWithZone

[RailsのActiveRecordで日付処理](http://techracho.bpsinc.jp/baba/2010_05_26/1600)

## TimeWithZoneの特徴

* アクティブレコードで`:datetime`で定義されてものは`TimeWithZone`

## 資料
![Screen Shot 2015-09-04 at 06.50.14.png](https://qiita-image-store.s3.amazonaws.com/0/27895/b0a5eaa6-6575-f34b-ac42-37c4ae253da2.png)

```rb
tokyo_gantan = Time.zone.local(2015, 1, 1);
puts tokyo_gantan.iso8601;
puts [tokyo_gantan.year, '年', tokyo_gantan.month, '月',tokyo_gantan.day, '日', tokyo_gantan.hour, '時',tokyo_gantan.min, '分'].join

utc_gantan = tokyo_gantan.utc;
puts utc_gantan.iso8601;
puts [utc_gantan.year, '年', utc_gantan.month, '月',utc_gantan.day, '日', utc_gantan.hour, '時',utc_gantan.min, '分'].join
```

結果

```
2015-01-01T00:00:00+09:00
2015年1月1日0時0分

2014-12-31T15:00:00Z
2014年12月31日15時0分
```

## Timeクラス
[Rails で DB の Time 型を扱う](http://blog.willnet.in/entry/2015/06/12/063731)

多くのDBは時間だけを扱うクラスを持っているが、Rubyのはそうではない。

アクティブレコードで`start_time         :time`と定義されたものは、RubyのTimeクラスが使われる。PostgreSQL側は時間のみを扱えるTime型が使われる。

![Screen Shot 2015-09-04 at 08.02.47.png](https://qiita-image-store.s3.amazonaws.com/0/27895/aea4bb3d-09b8-c4b4-63ed-68460403195a.png)
Rails & Haml の form で 閉じタグが出力されなかったりエラーが起きたりするときの対処。

↓動く。

```rb
= form_tag do
  = text_field_tag :text
```

↓動かない。エラー。(do がない)

```rb
= form_tag
  = text_field_tag :text
```

↓動くが、閉じタグ </form> が出力されない。( do がない )

```rb
= form_tag
= text_field_tag :text
```

↓動かない。エラー。(二行目が無いので、do の中身も無いとみなされる)

```rb
= form_tag do
```

はまった。



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
RetrofitのResponseからCookieのデータを取得する

[Retrofit](http://square.github.io/retrofit/)を使っていて、レスポンスヘッダからCookie情報を取り出したい場合のやり方です。結論から言うと、 `java.net.CookieManager` を拡張して実装できます。

**2015/09/03時点の情報なので、今後Retrofit2がリリースされたら変わる可能性があります。**

# `CustomCookieManager`を作る
Retrofitのコールバックインターフェースに`Response`クラスがありますが、このクラスからアクセスはできないので、独自のCookieManagerを作ります。

```java
package com.konifar.network;

import java.io.IOException;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.URI;
import java.util.List;
import java.util.Map;

public class CustomCookieManager extends CookieManager {

    private static final String SET_COOKIE_KEY = "Set-Cookie";
    private static final String EQ = "=";

    public CustomCookieManager() {
        super.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
    }

    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException {
        super.put(uri, responseHeaders);

        final List<String> cookieList = responseHeaders.get(SET_COOKIE_KEY);
        if (cookieList == null) return;

        for (String cookieString : cookieList) {
            if (cookieString != null) {
                for (String cookie : cookieString.split(";")) {
                    // session_key（適当）というnameでセッション取得する場合
                    if (cookie.startsWith("session_key") && cookie.contains(EQ)) {
                        String session = cookie.split(EQ)[1];
                        // キャッシュしたりとか好きなようにする
                        return;
                    }
                }
            }
        }
    }
}
```

#CookieHandlerにセットする
`CustomCookieManager` を `CookieHandler` にセットします。

```
public class MainApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 略
        CookieHandler.setDefault(new CustomCookieManager());
        // 略
    }

}
```

これでいい感じに動くはずです。


# [おまけ] 通信時にsession_store_keyを仕込む場合
こちらを参考にどうぞ
[Retrofitでアレをやりたい時のTips](http://qiita.com/konifar/items/91bbb39cfaf5469273f1#2-%E9%80%9A%E4%BF%A1%E6%99%82%E3%81%ABsession_store_key%E3%82%92%E4%BB%95%E8%BE%BC%E3%81%BF%E3%81%9F%E3%81%84)
RetrofitのPOST/PUTリクエストのパラメータに配列を渡す

[Retrofit](http://square.github.io/retrofit/)を使ってPUTリクエストのパラメータに配列を渡す方法です。POSTでも同じです。

# 間違い
```java
@FormUrlEncoded
@PUT("/tags.json")
void putTags(@Field("tags") List<String> tags,
             Callback<Tag> cb);

```

このように書くと、配列ではなく1つ目のStringが渡されます。

```ruby
Processing by TagsController#update as JSON
  Parameters: {"tags"=>"hoge1"}
```

# 正解
```java
@FormUrlEncoded
@PUT("/tags.json")
void putTags(@Field("tags[]") List<String> tags,
             Callback<Tag> cb);
```

`@Field` アノテーションにつける名前を `tags[]` に変えれば配列が渡されます。

```ruby
Processing by TagsController#update as JSON
  Parameters: {"tags"=>["hoge1", "hoge2", "hoge3"]}
```

# おまけ
`List<String>` ではなく `String[]` でも動きます。

```java
@FormUrlEncoded
@PUT("/tags.json")
void putTags(@Field("tags[]") String[] tags,
             Callback<Tag> cb);
```


参考 : [Android Retrofit Posting Array](http://johnsonsu.com/android-retrofit-posting-array/)
MYSQLでUNIQUE制約を外す方法


カラムに付いているインデックス情報を確認する。

```
show indexes from agencies;
```

UNIQUEを外したいカラムのKey_name名を確認する。


以下のコマンドで削除できる。

```
ALTER TABLE テーブル名 DROP INDEX Key_name名;
```
対処方法 re-run the `docker-machine env` command. 


## 環境

* Mac OS X: 10.10.5
* Docker: 1.8.1
* VirtualBox: 5.0.3


## メッセージの内容

以下が出た時の対処方法

```
$ docker-machine start default
Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```

```
$ docker-machine start default
Starting VM...

Too many retries.  Last error: Maximum number of retries (60) exceeded
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```


再起動すると毎回起こる?


## 対策

以下を実行

```
$ eval "$(docker-machine env default)"
```

環境変数を表示。上記で以下の環境変数の結果をシェルに設定している

```
docker-machine env default
```

## 参考

* [MacOSX - macにdocker toolboxをインストールする - Qiita](http://qiita.com/imtnd/items/8f0db6e938d55dfd4794)
To convert an integer into a comma-separated string

何ぞ JavaScript には 整數を comma くぎりにする 方法 見つからず。
ちなみに Number.prototype.toLocaleString() は comma くぎりとする 保證は 有らず。
これは 正規表現 (regular expression) により おこなへば よろしからむ。

```javascript:addCommas.js
s = String(number - 0).replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
```

みそは 正規表現 x(?=y) か。 これ matches x only if x is followed by y。 所謂 "肯定的 先讀み" なり。
ちなみに 否定的 先讀みは x(?!y), 肯定的 後讀みは (?<=y)x, 否定的 後讀みは (?<!y)x と なる。
たゞし、JavaScript にては 後讀みは 無き やうなり。
streamstatsを使う前には_timeでソートしておく

ネットワークインターフェースやブロックデバイスの使用状況を計算する時などで、「一つ前のイベントとの差」を取得したい時がある。

その場合、`streamstats`を使うのが定石である：

```
| streamstats current=false last(value1) as last_value1 | eval diff=value1-last_value1
```

が、実はSplunkでは、 **検索対象となっているイベントが時間でソートされていることは保証されない** ので、場合によっては、上記のクエリでは期待した差分を取れないことがある。

なので、`streamstats`を使う前には`_time`などで明示的にソートしておくと：

```
| sort _time | streamstats current=f last(value1) as last_value1 | eval ...
```

常に期待した差分をとることができる。
しれっとlollipopっぽく

Android開発って古い機種救ったりで、結構大変ですよね。

やっとこさ日本のキャリア端末でもlollipop（Android5.x）が
ちらほら・・

lollipop の　あの　ボタン押した時の波紋がひろがったりなエフェクト綺麗ですよね。

これ、単純にセレクターを

android:background="?attr/selectableItemBackground"

に換えるだけでいけたりしますw

lollipop以前との使い分けはattr/selectableItemBackgroundの値をThemeで切り替えて使うと簡単だとおもいます(-v15とかのやつです)。

華やかでなめらかなUIっていいですよね。
Codebreakの微妙なところ

GitHubやBitBucketにはプライベートリポジトリやメンバー数の制限があります。
それらの制限を取り払うにはお金がかかります。

今回、お金がかけられない趣味のプロジェクトでそれらの制限が問題になるという事態が起きてしまい、無料で無制限にGitリポジトリを使えるというCodebreakを試してみました。

ところが、GitHubやBitBucketなどと同じように使おうと思うと色々機能がなくて微妙でした・・・
Codebreakを検討している方のために、微妙だったところを列挙しておきます。

・フォークがない
リポジトリのフォークができません。複製したリポジトリを管理したい場合はcloneしてから自分のアカウントにpushする必要が有ります。

・プルリクを別アカウントのリポジトリにできない
フォークがないので元のリポジトリをCodebreakが認識できません。よってプルリクも別アカウントのリポジトリにたいしてできません。

・push -f すると壊れる？
authorを間違えたのでmasterブランチでgit commit --amendしてからpush -fしたらそれ以降のプルリクがマージできなくなりました。
「Merge Successfully」というメッセージが表示されプルリクがクローズされますがmasterにマージされません。

・プロフィールを収集して転職の斡旋業務に利用するらしい
Codebreakがなぜ無料なのかというとプロフィールを収集して転職の斡旋に利用することで利益を出す仕組みだからだそうです。
別にプロフィール見られてもかまわないんですがちょっと気持ち悪い感じがしますね。

いろいろ微妙ではあるものの、無料で無制限っていうのは太っ腹だと思います。
マッチしそうなプロジェクトでは今後も利用してもいいかな。
マッチするのってかなり特殊なケースなだけな気はするけど。
vSphere Clientでコンソールを使うとエラーが出た話


vSphere Clientを普段業務利用しています。
Virtual BoxやParallelsだからなのか、コンソールを起動しようと思っても、起動に失敗する不具合に見舞われました。

多様なバージョンが存在するvSphereのクライアントですが、下記を使えば、vSphereが使えたので、そのメモを残しておきます。

ソフトウェアのバージョンは下記のサイトに接続するとたくさんあることがわかります。

[VMWare Knowledge Base](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2090544)

その中で下記のクライアントは問題なく動作しましたので、最新版を使わず、下記のファイルを使用することをおすすめさせていただきます。

[vSphereClient 5.0.0-1300600.exe](http://vsphereclient.vmware.com/vsphereclient/1/3/0/0/6/0/0/VMware-viclient-all-5.0.0-1300600.exe)

サーバ側から別バージョンを要求しても、最初にインストールしたソフトでコンソールは動作しますので、問題なさそうです。

全ては下記のサイトで検証いただけていたため大変助かりました。

[WorkFront VMRCコンソールが切断されました…再接続を試みています](http://www.work-front.com/vmrcコンソールが切断されました-再接続を試みてい/)
最近のgenymotionとvirtualBox （unable to connect to your virtual device）

macbookにgenymotionをインストールする際にはまったので
同じような問題で困っている方いたらな・・
単純な解決方法を紹介してます（）

genumotionを使いたい場合、virtualBoxが必要になります。
そこで最新の virtualBox 5.0.2 と genymotion 2.5.2 を組み合わせたりすることになるのですが

ふがっ
unable to connect to your virtual device
が発生しましてw

エミュレータ起動がうまくゆかなかったですw

ぐぐるといろいろ出てくるのですが、
単純にVirtualBox側を4.3にするだけで解決しました。

VirtualBox 4.3.30 は、以下からダウンロードできます。
https://www.virtualbox.org/wiki/Download_Old_Builds_4_3

深掘りは深掘りが好きな方に、お願いしたいとおもいまぁすw
Windows10でnginx起動 ローカル開発環境構築

## 大まかな流れ

1. ダウンロード
1. 設定ファイル編集
1. 起動

## ダウンロード

[公式サイト](http://nginx.org/en/download.html) から最新版のzipをDLし、ローカルに解凍する。
例）c:\nginx

## 設定ファイル編集

c:\nginx\conf\nginx.confを編集する。

まず、ルートディレクトリを指定する。
このとき、rootのパスの最後にスラッシュを入れること。
<pre>
location / {
    root   c:/mapplus/branches/app_web/;
    index  index.html index.htm;
}
</pre>


apache等別のWebサーバが動作していて"localhost"がかち合うときは、
バーチャルホストの設定を見直す。以下、"localsys"にした例。
<pre>
server {
    server_name  localsys;
}
</pre>

このときhostsファイルの書き換えも忘れずに。
hostsを開いて、最後の行に「127.0.0.1 localsys」を記述して保存。

## 起動

c:\nginx\nginx.exeをクリック。
再起動は、コマンドプロンプトから次のコマンドを叩く。

<pre>
c:\nginx>nginx -s reload
</pre>

## 参考・引用したサイト

[nginxをローカル環境のwindows7にインストールする方法を図解付きで解説。XAMPPとの併用も。](http://wp.yat-net.com/?p=2976)
dockerの125byteのイメージについて

## docker の125byteのイメージについて

125byteのイメージがあったので調べてみました。

#結論

戻り値に、0を返すイメージでした。

* [dockerfiles/true at master · tianon/dockerfiles](https://github.com/tianon/dockerfiles/tree/master/true)

# 調べた経緯

data container として、busyboxを使うことが多いが、他にないのかなぁと思っていたという前提があります。

* [funnythingz - Goでの個人開発における本番環境](http://www.funnythingz.com/2015/04/25/plog-production.html)

で scratchイメージに興味を持ちました。
その後、以下の記事などを読んだりしていました。

* [Dockerのscratchイメージを探検する ｜ Developers.IO](http://dev.classmethod.jp/server-side/docker-server-side/exploration-to-docker-scratch/)

さらに以下の記事を読んでいたら、

* [Orchestrate Containers for Development with Docker Compose | via @codeship](https://blog.codeship.com/orchestrate-containers-for-development-with-docker-compose/)

[tianon/true](https://hub.docker.com/r/tianon/true/~/dockerfile/) という非常に小さなコンテナがあることを知りました。

### docker run scratch
やったことがなかったのですが、scratchはdocker run できない感じでした。
```
$ docker run scratch
Unable to find image 'scratch:latest' locally
Error response from daemon: 'scratch' is a reserved name
```

# 参考、他のコンテナのイメージのサイズ

20150902時点でのサイズ（注意：すべてのイメージをこの日にとってきたわけではない）

docker pull してきて、imagesの出力から、いくつか。

busyboxが結構小さいのだなぁとおもいう印象でした。
以前は8Mくらいあったかなぁと思っていましたが、、、

|イメージ|サイズ|
|---|---|
|tianon/true|125B|
|busybox|2.433 MB|
|debian:wheezy|84.97 MB|
|debian:jessie|125.2 MB|
|centos:7|172.2 MB|
|ubuntu:trusty|188.4 MB|
|centos:6|203.1 MB|
定期的にサーバを再起動　（例：毎月第1日曜日の午前2時）

### 再起動スクリプト
/usr/local/bin/reboot.sh
<pre>
#! /bin/sh
reboot
</pre>

### 権限設定
<pre>
# chmod 755 /usr/local/bin/reboot.sh
</pre>

### crontabの設定

rootで設定

<pre>
# crontab -e

#1日~7日までの日曜日（%w=0)の2時に実行：第一日曜日午前二時に再起動実行
0 2 1-7 * * test $(date +\%w) -eq 0 && /usr/local/bin/reboot.sh
</pre>
JavaScriptのオブジェクト配列に対してdistinct的な事（重複を排除した結果を返す）をする

配列の要素がStringや、Numberであれば[indexOfを使った実装](http://qiita.com/cocottejs/items/7afe6d5f27ee7c36c61f)が紹介されているのですが、オブジェクト配列に対しては素直にindexOfが使えず、なかなかサンプルが無かったので晒します。

そもそもJavaSciriptのオブジェクト同士の同値判定が無いので、そこを作りこまねばならぬという感じです。


```js:function定義
/**
 * 配列に対してSQLのdistinct句的なことをするやつ
 * @param fields distinctする対象のフィールドの名前を配列で
 * @return filterメソッドに渡すためのfunctionを返す
 */
function distinct(fieldNames) {
  var self = this;
  return function(item, i, arr) {
    return i == indexOf(arr, item, equalsAllFields)
  }
  
  // arrのなかにobjが含まれていればそのインデックス番号を返す
  // 探し方はcomparatorを使って探す
  function indexOf(arr, obj, comparator) {
    for(var index in arr) {
      if(comparator(obj, arr[index]) == true) return index;
    }
    return -1;
  }
  
  // オブジェクトaとbが fieldNamesに当てられたプロパティーを比較して同じであればtrueを返す
  function equalsAllFields(a, b) {
    for(var i in fieldNames) {
      var f = fieldNames[i];
      if(a[f] !== b[f]) return false;
    }
    return true;
  }
}
```

```js:使い方(nodeコンソールで実行してみた)
> var data = [ 
  { id: 0000, name: 'hoge', tag: 'tttt' },
  { id: 1111, name: 'hoge', tag: 'tttt' },
  { id: 1111, name: 'hoge', tag: 'gggg' },
  { id: 2222, name: 'fuga', tag: 'gggg' } 
];

> data.filter(distinct(["id"]))
[ { id: 0, name: 'hoge', tag: 'tttt' },
  { id: 1111, name: 'hoge', tag: 'tttt' },
  { id: 2222, name: 'fuga', tag: 'gggg' } ]

> data.filter(distinct(["id","tag"]))
[ { id: 0, name: 'hoge', tag: 'tttt' },
  { id: 1111, name: 'hoge', tag: 'tttt' },
  { id: 1111, name: 'hoge', tag: 'gggg' },
  { id: 2222, name: 'fuga', tag: 'gggg' } ]

> data.filter(distinct(["name","tag"]))
[ { id: 0, name: 'hoge', tag: 'tttt' },
  { id: 1111, name: 'hoge', tag: 'gggg' },
  { id: 2222, name: 'fuga', tag: 'gggg' } ]
```

あ、ネストしたオブジェクトには対応していませんが、一応comparatorを差し替えられるように中途半端に書いてあるのでこの辺をゴネゴネすれば・・・
Deviseを使ってるときに、ユーザー情報詳細画面を作成する


## 目的
Deviseでは、ユーザー情報編集画面は作られるが、詳細画面（参照）は作られない。

これをできるだけ手軽に作る。

## 作り方

### config/routes.rb

`devise_for`の後に、ルーティングを追加する。

```config/routes.rb
  devise_for :users, controllers: { confirmations: 'confirmations', omniauth_callbacks: 'users/omniauth_callbacks', registrations: 'registrations' }
  resources :users, :only => [:index]
  ・・・
```

確認する。

```
$ rake routes
(略)
    users GET      /users(.:format)           users#index
(略)
```

### コントローラ

Usersコントローラを作成する。

```shell
$ rails g controllers Users index
```

不要なルーティングを削除する。(以下の行を削除する)

```config/routes.rb
  get 'users/index'
```


### ビュー

ビューを編集する。

```app/views/users/index.html.erb
<section id="user-detail" class="scroll-page bg-white">
  <div class="page-header">
    <h1>会員情報</h1>
  </div>
  <table>
    <tr>
      <th>メールアドレス</th>
      <td><%= current_user.email %></td>
    </tr>
    <tr>
      <th>お名前</th>
      <td><%= current_user.name %></td>
    </tr>
  </table>
</section>
```

### 確認

サーバを再起動したのち、確認しましょう。
http://localhost:3000/users/


## 参考

http://easyramble.com/create-users-index-show-on-devise.html
キーと値が連続で並ぶ配列から、キー、値のペアを列挙したい


キーと値が連続で並ぶ配列から、キー、値のペアを列挙したいとき、下記のように書いた。
他に良い方法があるかも。

```lang:pair.cs

var hoges = new string[] { "key1", "value1", "key2", "value2", "key3", "value", };

var numOfPair = hoges.Count() / 2;
foreach (var pair in Enumerable.Range(0, numOfPair)
                               .Select(i => new { Key   = hoges[i * 2], 
                                                  Value = hoges[i * 2 + 1], }))
{
    // pair.Key ...
    // pair.Value ...
}
```
「SSL サーバーが古い可能性があります」と出る場合の対処方法（サーバー管理者）

Chromeで突然「SSL サーバーが古い可能性があります」と出てアクセスできない現象が発生すると言われて調査したのでまとめておきます。

![スクリーンショット 2015-09-04 23.27.20.png](https://qiita-image-store.s3.amazonaws.com/0/14768/c61e9d39-c23e-8d9b-dca3-7dc09566dd92.png)

2015/9/3にリリースされたChrome v.45からアクセスできなくなったようで、IEやFirefox、Safariからだと問題無く見れているようです。

追加情報をいただき、間違っているようでしたので修正しました(15/9/4)

# 原因

Chrome 45から「TLS 1.0への安全でないフォールバック」が無効にされたことが原因との事です。
https://code.google.com/p/chromium/issues/detail?id=498998

https://groups.google.com/a/chromium.org/forum/#!msg/security-dev/F6ZjP6FnyRE/bK7TKtvnHYsJ

# 調査方法

以下のサイトでSSLの有効状況を調査する事ができます。
https://www.ssllabs.com/ssltest/

グレードFは重大なセキュリティエラーがある場合です。

![ssl.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/f53c8cd4-348d-669f-a250-2303a4c5ad4e.jpeg)

![alert.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/85ecdcd1-1fe7-4e7c-c928-ddf17e58a989.jpeg)


# 対応方法

## サーバー側
+ OpenSSLのバージョンを上げる必要があります。
+ SSL3.0がいまだに有効になっているところも多いので、無効にします。

[SSL 3.0 の脆弱性対策について(CVE-2014-3566]
(https://www.ipa.go.jp/security/announce/20141017-ssl.html)

※TLS1.0のみしかONになっていない場合は、SSL3.0をOffにする事でアクセスできるようになるという話しもあります（未検証。

## Chrome側で対応する場合（非推奨）

Chromeを起動するショートカットを編集して、オプションに「--ssl-version-fallback-min=tls1」を指定することで回避できますが、セキュリティリスクがあります。


# ぶつぶつ

クロネコの再配達ページの管理者様早くなおしてあげてください！
Android Marshmallow の App Standby テストが動作しない

# 前提

Android 6.0 Marshmallow (MPA44I) Developer Preview 3
Nexus 5, Nexus 6

# 公式ガイドの記載が間違っている？

[Google 公式ガイド](http://developer.android.com/intl/ja/preview/testing/guide.html)の記載が間違っている様です。`am set-idle` では「そんなものは知らん」と怒られます。正しくは `am set-inactive` のようです。
追記：[こちら](http://developer.android.com/intl/ja/training/monitoring-device-state/doze-standby.html) では修正されたようです。

am コマンドのヘルプより抜粋：
> am set-inactive: sets the inactive state of an app.
> am get-inactive: returns the inactive state of an app.

公式ガイドの記載が間違っている件は Issue として報告されていました。
[Issue 2275: Documentation for testing app standby via ADB incorrect](https://code.google.com/p/android-developer-preview/issues/detail?id=2275)

## am コマンド

App Standby モードに移行する

```:×
$ adb shell am broadcast -a android.os.action.DISCHARGING
$ adb shell am set-idle <package> true
```

```:✓
$ adb shell am broadcast -a android.os.action.DISCHARGING
$ adb shell am set-inactive <package> true
```

App Standby モードから復帰する

```:✓
$ adb shell am set-inactive <packageName> false
```

App Standby モードかを確認する

```
$ adb shell am get-inactive <packageName>
  Idle=false
```

# 結局、うまく動作しない模様

```:AppStandbyをシミュレート
$ adb shell am broadcast -a android.os.action.DISCHARGING
$ adb shell am set-inactive <package> true
$ adb shell am get-inactive <package>
```

これで `Idle=true` と返されれば良いみたいなのですが、常に `false` が返ってしまいます。
この件も Issue として報告されていました。次回のリリースで修正されることを期待しましょう。
[Issue 3024: Adb commands for app-standby](https://code.google.com/p/android-developer-preview/issues/detail?id=3024)


# 関連資料

[Android M Adds New Battery Performance Features](http://developerboards.att.lithium.com/t5/AT-T-Developer-Program-Blogs/Android-M-Adds-New-Battery-Performance-Features/ba-p/40239)
[Qiita – Android Marshmallow の Doze テストの正しい手順](http://qiita.com/items/7c549336a9aee447dd97)
UITableViewの編集モードでセルをタップで選択したい

UITableViewの編集モードにて、セルを選択する設定で少しつまづきました。
その後、調べて解決しました。
### 編集モードで、セルをタップしたい。
この状態から、
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/80688/f5dd2743-cf04-f4ca-5bc5-033fe41f00b3.png)

こんな風に行きたい。
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/80688/cf4f44e8-d11b-41fc-d0ef-c3395538d5ea.png)

そしてまた戻りたい
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/80688/8fe59732-a8af-7ba2-3daf-539e90f7480d.png)

## 調べると、IBから設定できるようだ
>**編集時もセルの選択を有効にする**
デフォルトのままだと、編集モード時にはセルを選択することができません。編集モード時にも選択を有効にするには、Interface Builderで以前Table ViewのStyleを選んだところ（Attributes Inspectorの上の部分）にある、 Allow Selection While Editingにチェックを入れます。 これで編集モードでも選択が有効になります。

>引用元▶︎[UITableViewの使い方2:編集モード編](
http://konton.ninpou.jp/program/cocoa/userinterface/UITableView/UITableView2.html)

上記サイトの指示通り、Interface BuilderにおいてAttributes Inspectorを開き、Allow Selection While Editingというチェック項目を探したのだが、見当たらない。

### 本来ならこう表示されてるらしい
![](http://cfile8.uf.tistory.com/image/185465534D709A09143BCB)
引用元▶︎[20. UITableView 데이터 편집 및 삭제](
http://dudfufl.tistory.com/entry/20-UITableView-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8E%B8%EC%A7%91-%EB%B0%8F-%EC%82%AD%EC%A0%9C)

### 僕のはこうなっていた
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/80688/06808833-8090-182d-5a13-2d456b9f5db6.png)

見当たらない。バージョンの違いだろうか。

## ちゃんとコードありました


>このようなUI（あんまりよろしくないですが）は、見ての通りUItableviewに
`[self.tableView setEditing:YES animated:YES];`
されているのですが、これをすると困ったことに
`tableView: didSelectRowAtIndexPath:`
が呼ばれなくなります。…ので要するにタップ出来なくなります。
当初、UITapGestureRecognizerで強制的に呼んでいたのですがそうすると今度はデリートボタンの反応がとても悪くなります。
どうすりゃええんやーと思ってリファレンス読み直したらちゃんと
`self.tableView.allowsSelectionDuringEditing=YES;`
っていうのがありました（汗

>引用元▶︎[UItableViewで編集モードにしつつタップも有効にする
](http://qiita.com/noppefoxwolf/items/ef486146f7f767fe2ef3)


とのことで。
`self.tableView.allowsSelectionDuringEditing=YES;`
このコードをviewDidLoadに追加すると、目的は達成されました。

# 追記・・Attributes Inspectorにもありました

fuzzballさんのご指摘があり、確認するとIBのAttributes Inspectorにもちゃんと設定項目がありました。
チェック項目だったものが、Single,Multipleという選択肢が追加され、プルダウン形式になっていたようです。よく確認できてませんでした。


![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/80688/da15c2c5-3803-63a4-8759-52d780307ad9.png)

Singleを選択すると良いようです
![sca.png](https://qiita-image-store.s3.amazonaws.com/0/80688/6c75e15e-a716-48a3-a00c-2409645eb91b.png)

fuzzballさんありがとうございました。
「拡張子」は英語で……

- extension
- file extension
- filename extension

「extension」で十分なことが多い。しかし、調べ物のとき「extension」でぐぐると「拡張」についての情報がたくさん出てきて困ることがある。そんなときは「file extension」とか「filename extension」と呼んでやる。
Entity FrameworkでJoinを使わずに内部結合する

RDBからデータ取得する時はテーブルの結合は必須です。
しかしながら、メソッド構文でJoin書くのってめんどくさい。
*テーブル構造は[EntityFramework6で単純なデータ表示フォームを作成](http://qiita.com/keidrumfreak/items/15fc7217817c7f8b01b3)のを流用。

```csharp
var result = entities.Models.Join(entities.Titles,                                //結合するEntityの指定
    model => model.ModelID, title => title.ModelID,                               //結合キーの指定
    (model, title) => new { model.ModelName, title.TitleName, title.RunningDate } //取得するデータの指定
    ).ToArray();
```

これをノータイムで読める人ってほとんどいないんじゃないですかね……。
~~おとなしくクエリ構文で書け？ｱｰｱｰｷｺｴﾅｲ~~

外部キーをしっかりEntityクラスないしContextクラスで設定していればこんな書き方ができます。

```
var result = entities.Titles.Select(title => new { title.Model.ModelName, title.TitleName, title.RunningDate }).ToArray();
```

今回のは多→1の対応のものですが、SQLServerからの自動生成されたクラス見てる限り、逆方向(1→多)の対応のものも似たような感じで実現できそうな感じはします。
zsh+rbenv+crontab @wheneverで「no such file to load -- bundler/setup (LoadError)」等のエラー回避法

#.zshrc
`rbenv`や`whenever`などは`bash`を前提として説明してあるので、`zsh`に切り替えた場合そのままでは機能しない

```zsh
# .zshrcへ追加
export PATH=$HOME/.rbenv/shims:$PATH
if which rbenv > /dev/null; then eval "$(rbenv init - zsh)"; fi
```

**"$(rbenv init - `zsh`)"がポイント**


# rbenv
変更点なし

# crontab

```bash
# crontab -e で編集して以下をファイル先頭に追加

SHELL=/path/to/your/zsh # which zsh のパス

```

cronのデフォルトの`SHELL`は`/bin/sh`なので変更する

# whenever
デフォルトのjob typeは[こちら](https://github.com/javan/whenever)

```rb
set :job_template, "bash -l -c ':job'"

job_type :command, ":task :output"
job_type :rake,    "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
job_type :runner,  "cd :path && bin/rails runner -e :environment ':task' :output"
job_type :script,  "cd :path && :environment_variable=:environment bundle exec script/:task :output
```

 `config/schedule.rb`の中で次のものだけ上書きする

```rb
# Use this file to easily define all of your cron jobs.
#
# It's helpful, but not entirely necessary to understand cron before proceeding.
# http://en.wikipedia.org/wiki/Cron

# Example:
# ...
# ...
# ...

set      :job_template, "source $HOME/.zshrc; $(which zsh) -l -c ':job'"
job_type :runner,       "cd :path && bundle exec rails runner -e :environment ':task' :output"
```

`.zshrc`をソースして、シェルを`zsh`がインストールされているパス`$(which zsh)`で指定し、さらに`runner`は`bundle exec rails ...`へ変更

これにてタイトルのようなエラーが回避出来る
ggplot2でラベル

cf: http://rpubs.com/dichika/ggplot2_shape
cf: http://blog.goo.ne.jp/r-de-r/e/29758f8210d278bcf4d0599664621fd2

```r
ggplot(smp, aes(x = year, y = value, group = country, colour = country)) + 
  geom_line() + geom_point() +
  geom_dl(aes(label = country), list("last.points", dl.trans(x=x+0.5))) + 
  xlim(1995, 2015) +
  theme_bw() + theme(legend.position = "none")
```

![Rplot02.png](https://qiita-image-store.s3.amazonaws.com/0/4390/89a202b5-3400-48b3-0062-0e786141c2c9.png)

あと、ggplot2で作ったグラフでも論文誌に載せてくれると思います（少なくとも自分の分野では文句言われたことない）。

Enjoy!!