OmniAICreator/Qiita-1.07M huggingface dataset:
Electronで作ったメニューバーアプリで、iconの下にwindowを表示できない（できるようになった）

## やりたかったこと

1. メニューバーに表示しているiconをクリックした時に、windowをicon表示位置の下に表示する。
2. ショートカットキーをクリックした時にwindowを、windowをicon表示位置の下に表示する。

1のほうは、過去にelectronの機能として、trayのclickedイベントにbounds（tray iconの位置情報）が渡されることになったことでできるようになった。 menubarもこの機能を利用して、windowの表示位置を設定しているみたい。

2のほうは、メニューバーのiconの位置を（上記のclickedイベント以外で）取得する方法が用意されていないため、今現在（2016/03/26）もできないっぽい。[ココ](https://github.com/atom/electron/issues/2469)のIssueにあがってる。できるようになったらこの記事も更新してやり方を書くようにしたい。

2016/07/26追記: 1.1.1 くらいからできるようになりました。

https://github.com/electron/electron/blob/master/docs/api/browser-window.md#wingetbounds

これを使うと 2 のときに直接 bounds を 取得することができます。

## 今のところ考えている回避策

一度、メニューバーiconをクリックされた時に位置を記憶しておいて、以降はそれを使ってショートカットキーが押された時にwindowを正しい位置に表示する。
この方法だと、ショートカットキーが押される前に、クリックされている必要がある。プログラム側でクリックイベントを発生させるみたいなのも調査したけどわかってない。

## 作ったもの

ちなみに、作ったのは[コレ](https://github.com/fukajun/245cloud-app) で簡単に次のようなアプリ
- http://245cloud.com っていうポモドーロテクニックやりながら音楽聴けるWEBサービスを表示するアプリ
- メニューバーでWEBサービスを表示してアクセスしやすくしただけ
- ショートカットキーで操作できる
- 表示しているコンテンツにあわせて通知を表示する（例: あと何分です）
- メニューバーにアイコンを表示して、タイマーの時間を表示する
- メニューバーアプリは、https://github.com/maxogden/menubar この辺、使うと良い
- Mac版しか作っていないのでWindows版のノウハウはない
AD2 / ブリッジ回路 > Link > Wien Bridge Oscillators > ブレッドボード上構築例

youtubeでWien Bridge Oscillatorで検索して中で気になった動画。

ブレッドボードで構築していたので、参考にしようと思った。
https://www.youtube.com/watch?v=u5ngtwTIcDk&list=PL_MJualihC5CAtnZHphK-hli8aSL3PRRz&index=27

配線を短くするように、と言っている。こちらの構築では長い配線で一応動いたが、高周波の場合は問題になるのかもしれない。
AD2 / ブリッジ回路 > Link > Learn about electronics > Wien Bridge Oscillators

http://qiita.com/7of9/items/2015f7a16e2b1f80b3db
のコメント関連で見つけたリンク
http://www.learnabout-electronics.org/Oscillators/osc34.php

後々の検索のための別記事にしておく。
Railsのお勉強備忘録

```rb
config.assets.enabled = false
```

```rb
config.active_record.table_name_prefix = "northwest_"
config.active_record.default_timezone = :local
config.active_record.schema_format = :sql
```
http://railsguides.jp/configuring.html#active-record%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82

```rb
<% cache [ "v1", @hoge ] do %>
```

```rb
delegate :name, to: :user, allow_nil: true
allow_nil指定でuser.try(:name)と同じ
```

```rb
'author_id'.humanize
# "Author"
"active model".camelize
=> "Active model"
```

```rb
<%= render 'product', object: product %>
=> _product.html.erb

<%= render @products %>
=> _product.html.erb

<%= render partial: "product", locals: {product: @product} %>
=> _product.html.erb
```
http://railsguides.jp/layouts_and_rendering.html#%E3%81%BE%E3%81%A8%E3%82%81

```rb
@request.user_agent = "iPhone"
@response.user_agent => NG
@request == request => true
request.headers["HTTP_USER_AGENT"] => OK
request["headers"]["HTTP_USER_AGENT"] => NG
response.headers["HTTP_USER_AGENT"] => OK
```

```rb
mail to: email, subject: 'test'
何も指定しなければhtmlもtextも送信可能
```

```rb
namespace :task_name do
  desc "実行処理の説明"
  task :create, ['name'] => :environment do |task, args|
    args.name
  end
end
```
http://qiita.com/yoshiokaCB/items/c97ba878469701c3d99b ここ参考！！

```rb
assert_difference
assert_difference(User, :count, 1)
```
http://api.rubyonrails.org/classes/ActiveSupport/Testing/Assertions.html#method-i-assert_difference

```rb
before_validation -> after_validation -> before_save -> before_update -> after_update -> after_save
```

```rb
http_basic_authenticate_with name: 'hoge', password: 'hogehoge'

def authenticate
  authenticate_or_request_with_http_basic('Administration') { |username, password|
    username == 'hoge' && password == 'hogehoge'
  }
end
```

```rb
<%= f.hidden_field :lock_version %>
楽観的ロックには必須
```

```rb
gteq => WHERE (`users`.`age` >= 20)
lteq => WHERE (`users`.`age` <= 60)
```

http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html
http://api.rubyonrails.org/classes/ActionController/Metal.html
http://api.rubyonrails.org/classes/ActiveRecord/Store.html
http://stackoverflow.com/questions/3664024/select-with-find-in-batches-in-rails
http://easyramble.com/rails-active-record-serialize.html

Assets マニフェスト
http://qiita.com/samurairunner/items/da22eddb64e867b4e145
find_by_sql
http://takumi-skillup.blogspot.jp/2009/05/railssql.html
H27年春期 基本情報技術者 午後問12 解説

```
MAIN    START
        LD     GR1,N          ; GR1 ← n
        LAD    GR0,F          ; GR0 ← F(n)のアドレス
        CALL   FACT
        RET
N       DC     5
F       DS     1
      
FACT    START
        RPUSH
        LD     GR0,=1
        SUBL   GR1,=1
        JPL    NEXT
        JUMP   FIN
NEXT    LD     GR2,=1
LP      LAD    GR2,1,GR2
        CALL   MULT
        SUBL   GR1,=1
        JNZ    LP
FIN     RPOP
        RET

MULT    START            ; シフトによる乗算（GR0=GR0xGR2）
        RPUSH
        LD     GR1,GR0   ; 被乗数を GR1 に保持
        LD     GR0,=0    ; 乗算結果の初期化

        LD     GR3,=15
        LD     GR2,GR2
LP2     JZE    FIN2
        JPL    CONT
        LD     GR4,GR1
        SLL    GR4,0,GR3
        ADDL   GR0,GR4
CONT    LAD    GR3,-1,GR3
        SLL    GR2,1
        JUMP   LP2
FIN2    RPOP
        RET
        END
```
n=5
GR0=F(5)=5!=120=0x78
Zenmap(nmap)を使ったサーバのポートスキャン

# この記事の内容

リモートのサーバで使用されているポートの調査を行うためのメモになります。

デフォルトで設定されているポートの設定について代表的なものだと
HTTP 80、HTTPS 443、SSH 22
だったりしますが、1つのサーバに複数のHTTPを立てたり、SSHがデフォルトのポートに設定されていないということがあるかと思います。

# Zenmap
[Zenmap](https://nmap.org/zenmap/)

nmapというコマンドの結果をGUIで表示してくるツールです。

nmapについて概要
[https://nmap.org/man/jp/](https://nmap.org/man/jp/)より引用

> Nmap (“Network Mapper”)は、ネットワーク調査およびセキュリティ監査を行うためのオープンソースのツールである。大規模ネットワークを高速でスキャンするように設計されているが、単一のホストに対してもまったく問題なく機能する。Nmapは生の(raw)IPパケットを用いて、ネットワーク上でどのようなホストか利用可能になっているか、これらのホストが提供しているサービス(アプリケーション名とバージョン)は何か、ホストが実行しているOS(OS名とバージョン)は何か、どのような種類のパケットフィルタ/ファイアウォールが使用されているかなど、その他数多くの特徴を斬新な方法で判別する。Nmapは、セキュリティ監査用に広く利用されているばかりでなく、ネットワーク・インベントリ(資産情報収集)、サービスのアップグレード予定管理、ホストやサービスのアップタイム(利用可能時間)の監視等の日常業務にNmapを役立てているシステム管理者やネットワーク管理者も多い。


# 使い方は簡単

Target　に対象のホストを入力して、Profileを「Intense scan, all TCP ports」にしてスキャンを開始を行えば対象のサーバの使用されているポートを調べることができます。

![スクリーンショット 2016-03-26 15.45.49.jpg](https://qiita-image-store.s3.amazonaws.com/0/89599/38bcc1d7-e6ef-ba9e-f615-ebd76ce24210.jpeg)
シンプルにBool値を設定できるRailsテクニック

`#index`の画面で、チェックボックスをポチポチ押す度に、DBを更新して画面がロードされます。複雑なAjax処理ではなく、`link_to` で`#update`へのリクエストを発生させ、更新後に`#index`にリダイレクトします。 

![rails_check.gif](https://qiita-image-store.s3.amazonaws.com/0/102667/7c52fb87-2507-c489-3ee7-efbcc6bf372d.gif)

<i class="fa fa-database"></i> モデルの作成
-------------------------------------------

boolean型の属性を持つモデルをscaffoldで作成します。model/view/controllerはscaffoldで作成されたものを元に実装してゆきます。

```sh
bundle exec rails g scaffold User name:string admin:boolean
```

<i class="fa fa-fort-awesome"></i> FontAwesome のインストール
-------------------------------------------------------------


チェックボックスは、`<input type='checkbox'>`ではなく、FontAwesomeのアイコン <i class='fa fa-check-square-o'></i> / <i class='fa fa-square-o'></i> を使います。`Gemfile`に必要なgemを書いて、`application.css` でロードします。

```ruby:Gemfile
gem "font-awesome-rails"    
```

```css:app/assets/stylesheets/application.css
/*
 *= require font-awesome
 */
```

<i class="fa fa-tasks"></i> Railsアプリの編集
---------------------------------------------

viewでは、`#index` に `link_to` でモデルを更新するリンクを配置します。リンク先を`user_path(user, user: {admin: false})`、メソッドを `method: :put` で指定することで、 `#update` を呼び出して任意の属性を更新できます。

```erb:app/views/users/index.html.erb
<table class="table table-striped">
  <% @users.each do |user| %>
    <tr>
      <th><%= user.name %></th>

      <td>
        <% if user.admin %>
          <%= link_to User.human_attribute_name(:admin),
                      user_path(user, user: {admin: false}),
                      method: :put,
                      class: 'fa fa-check-square-o' %>
        <% else %>
          <%= link_to User.human_attribute_name(:admin),
                      user_path(user, user: {admin: true}),
                      method: :put,
                      class: 'fa fa-square-o' %>
        <% end %>
      </td>
    </tr>
  <% end %>
</table>
```

controllerでは `#update` が呼び出されると `redirect_to` で `#index` にリダイレクトさせます。

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  # ......
  def update
    if @user.update(user_params)
      redirect_to users_path
    else
      redirect_to users_path, notice: 'Error occurs'
    end
  end
  # ......
end
```

<i class="fa fa-fighter-jet"></i> 動作確認
--------

Rails Serverを起動させると、以下のようなチェックボックス状のリンクが表示されます。各チェックボックスをクリックすることで、RailsコンソールでDBが更新されるのが確認できます。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/102667/a6b1e34d-1969-b42b-1d31-a65a90a7669e.png)

turbolinksと組合せると、画面遷移がAjaxで処理されるので、より滑らかに画面が切り替わります。また`link_to`をhelperにまとめると、もっと可読性が上がるかもしれません。
単体テストについて

一月ほど前に「テスト不要論」なるものが炎上しており、思うところがあったので、少しまとめてみました。
ご存じのとおり、テストにはブラックボックステスト・ホワイトボックステストがあります。
しかし、この二つの目的が大きく違うということを知らない人が多いのではないでしょうか。
## ブラックボックステスト
ブラックボックステストはコード実装者以外が行うべきものです。
コード実装者は書いてしまった以上ブラックボックスにはできませんし、
テストファストであっても頭の中にこれから書く実装が出来上がっていれば同様です。
ブラックボックステストは**設計書通り（設計者の意図通り）にかけているのか**という観点でテストし、品質指標とします。
別に設計書通りに書けば品質は高いなんて保障はないので、これを時間の無駄と考える人がある程度いるのではないかと思います。
しかし、**プログラマの義務はブラックボックステストではなくホワイトボックステストなのです。**

## ホワイトボックステスト
ホワイトボックステストテストはコード実装者が行うべきものです。
ホワイトボックステストは、**私の書いたコードはこういう動きを保障している**というのをテストコードを用いて伝えているのと同じです。
そのため、リファクタリング、仕様変更、機能追加でコードをいじった結果、始めに保障していた動きができなくなるとテストに通らなくなります。
つまり、**ホワイトボックステストはデグレ防止に真価を発揮するのです。**
**コードがすべて出来上がり、納品前にテストを作成するなんていうのはナンセンスです。**
## 単体テストを行う上で便利なAPI
できるだけ単体テストを行いやすいようにLogicに切り出す方が単体テストは楽ですが、
どうしても切り出しが行えず、複雑な処理をテストで追う必要がある場合があります。
そんな時MockObjectを作成できるAPIは非常に便利です。
私はMockitoを使っています。

```XXX.java
public int xxx(YYY yyy)  {
        if(yyy.isStarted()){
            return 1;
        } else{
            return 0;
        }
    }
```
この時YYY#isStarted()はfieldを返すgetterではなく複雑な処理で起動しているのか調べるものなのでYYY#setStarted()はないものとします。
(コーディング規約違反になる機関も多そうですが・・・）

```XXXTest.java
private final static XXX TARGET = new XXX();
@Test
public void xxxTest_YYYが起動している場合1を返す()  {
        YYY yyy = mock(YYY.class);
        when(yyy.isStarted()).thenReturn(true);
        assertThat(TARGET.xxx(yyy),is(1);
    }
```

このようにMockを使うことでテストは楽にかけます。
この一見意味のないようなテストも書いておくことにより、リファクタリングの際のミスを減らすことができます。

## カバレッジは品質指標として不十分
少し話は変わりますが、マネジメント系の人って「カバレッジ100%」って言葉が好きですよね。
でもカバレッジを100%にするということはすべての分岐を行ったことが確認できただけで、
その分岐内で行われている処理自体が正しいかどうかまでは確認できません。
ちゃんと正しいassertが行われていることも確認してください。

逆にカバレッジ100%にするために絶対発生しないExceptionをスタブを用いて無理やり発生させるなんてテストを書くのは時間の無駄なのでやめましょう。

## まとめ
・ブラックボックステストは設計者の義務。
・ホワイトボックステストはプログラマの義務。
・カバレッジだけでは品質を保証できない。
Swift 並列プログラミング基礎

Apple公式ドキュメントがとっつきにくいので、そのとっかかりとして。

<img width="557" alt="スクリーンショット 2018-12-25 10.37.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/69002/bc2cd1d9-9bdc-6390-1613-6fa4a7035efc.png">

# 1. はじめに
## 並列プログラミングとは
複数の実行処理をCPUに対して並列的に行わせるような実装のこと。ちなみに、並列の対義語は直列。

## 効能
* 実装コードがシンプルに。
* 処理を分担して実行速度が向上。
* ビューとその他の処理を分けることで、遅延や引っ掛かりのないインタラクティブなUIに。

## 用語
* **CPU**
 * 中央演算処理装置。PCやスマホを構成する部品のうち、処理をどんどんさばいていく最も重要な部品。
* **メモリ**
 * 主記憶装置。PCやスマホを構成する部品のうち、処理で使うデータを一時的に保持するための部品。データを永続的に保持するHDDやフラッシュメモリなどの補助記憶装置とは別。
* **プロセス**
 * アプリケーションやプログラムごとに確保される実行インスタンス。専用に仮想メモリ空間とシステムリソースが割り当てられ、一つまたは複数のスレッドを含む。
* **スレッド**
 * プロセスが実行する処理を格納するためのフロー。独自のスタック空間をもつ。
* **タスク**
 * 実行処理を表すための抽象的な単位。
* **キュー**
 * スレッドにタスクを追加したり、複数スレッドの順番を整えたりといったスレッド管理をOS側に任せる代わりにできた概念。適切なキューにタスクを追加するだけで、自動的に適切なプロセスの適切なスレッドにタスクが追加され実行される。
 * GCDではディスパッチキュー、Operationではオペレーションキューを用いる。

# 2. 種類
## ①Thread／NSLock
スレッド管理を直接行うための仕組み。より安全で効率よく並列プログラミングを行うための仕組みとして②③があるため積極的に使う理由は無いが、スレッドを直接扱うぶん②③に比べて実時間処理のタイムラグが少ない利点がある。

## ②GCD(Grand Central Dispatch)
並列プログラミングの仕組みのひとつ。スレッドの管理をOS側で隠蔽する代わりにキューという概念を用いて、より安全で効率よく並列プログラミングを実現できるようになっている。（[記事書いたよ！](http://qiita.com/ShoichiKuraoka/items/bb2a280688d29de3ff18)）

## ③Operation
並列プログラミングの仕組みのひとつ。②をラッピングした仕組みで、キューやタスクの状況が追跡しやすいようになっている。

# 3. 使い分け
* 基本的にOperationで良いが、難点もあり。
 * キューやタスクをインスタンスとして扱うため、異なるクラスやメソッドが絡んだ並列プログラミングになると一気にコードが複雑になる可能性あり。
 * 通常の記述でもGCDの方がシンプルになりやすい。
 * パフォーマンス的にもGCDに分があり。
* 上記難点との兼ね合いによっては、GCDを使う方が良い。
* その他OperationやGCDで解決できない特殊な状況については、Thread等の使用を検討。

# 4. 参考
* [AppleDocumentation: Dispatch](https://developer.apple.com/documentation/DISPATCH)
* [Apple: Concurrent Programming With GCD in Swift 3](https://developer.apple.com/videos/play/wwdc2016/720/)
* [AppleDocumentation: Foundation>TaskManagement>Operation](https://developer.apple.com/documentation/foundation/operation)
* 荻原剛志『詳解Objective-C 2.0 第3版』（←今のところSwift版には記述なし。）
ズンドコキヨシで bundle install をスリルある時間にしよう

# bundler は長くて退屈だ

皆さん、bundler 使用していますか？（はーい！という声）そうですね、とても便利ですね。でも遅い。長くて退屈だ…そう思う時もあるのではないでしょうか。

そんなときは、 [bundle install を早くする](http://d.hatena.ne.jp/suu-g/20130908/1378623978)ことを考えてもいいのですが、せっかくですからその時間を楽しむことにしましょう。

# 封印されしズンドコキヨシ

![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/11976/966281e5-317a-18ae-83d5-0f8540139dd4.gif)


「ズン」「ズン」「ズン」「ズン」「ドコ」が揃うと、次の出力で bundle install が強制終了されるという、大元リスペクトなズンドコ処理が組み込まれています。

いつもの退屈な `bundle install` の時間が、いつ強制終了されるか紙一重の、手に汗握るスリリングな時間へと変貌します。

# 興味ある方は

…ということで、あなたも bundle install でズンドコしてみませんか。
方法は簡単。普通の `Gemfile` 内に以下の記述をコピペするだけ！

```rb
class << Bundler.ui
  def tell_me(msg, color = nil, newline = nil)
    @zd ||= 0
    if msg == '.'
      if @zd == 30
        @shell.say('キ・ヨ・シ！', color)
        exit(1)
      end
      n = [0,1].sample
      @zd = 31 & (@zd << 1) + n
      msg = n == 1 ? 'ズン' : 'ドコ'
    end
    msg = word_wrap(msg) if newline.is_a?(Hash) && newline[:wrap]
    if newline.nil?
      @shell.say(msg, color)
    else
      @shell.say(msg, color, newline)
    end
  end
end
```

# コメント

この[ズンドコのビッグウェーブ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)をついさっき知って、完全に乗り遅れたなあと思ったけど、まだ bundler でやってる人はいないようだったのでせっかくなのでやってみた。強制終了の条件があるのがfizzbuzzより面白い。
コンソールに色付きの出力をする方法

以下を定義して、

```python:bcolors
class pycolor:
    BLACK = '\033[30m'
    RED = '\033[31m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'
    PURPLE = '\033[35m'
    CYAN = '\033[36m'
    WHITE = '\033[37m'
    END = '\033[0m'
    BOLD = '\038[1m'
    UNDERLINE = '\033[4m'
    INVISIBLE = '\033[08m'
    REVERCE = '\033[07m'
```

```python:main
print pycolor.RED + "RED TEXT" + pycolor.END
```
と実行すると

<Font color="red">RED TEXT</font>

と出力されます。
終わるときには pycolor.ENDをつけるのを忘れないで下さい。
eventmachine not initialized: evma_connect_to_serverのエラー対処


websocket-railsを使ってチャット機能を実装した時に掲題のエラーに悩まされましたので対処をメモ。

websocket-railsの参考にしたのは以下の記事様。
[Railsで複数グループ対応のチャットアプリを作ってみた](http://altarf.net/computer/rails/2502)

上記記事ではスタンドアローンモードで実行していますが、今回はRedisに繋げてやっています。

【追記】
色々とやってみた結果をザクっとこちらにまとめました。ご参考ください。
[websocket-railsの使い方](https://github.com/syossan27/til/blob/master/rails/use-websocket-rails.md)

__記事との相違__

```config/initializers/websocket_rails.rb
config.standalone = false
config.synchronize = true
config.redis_options = {:host => 'localhost', :port => '6379'}
```

evma_connect_to_serverと書いてあるのでEventMachineの接続先が設定されていないのかな？と当たりをつけて色々調べてみました。

そういやRedisと繋げてあるとこってあったっけ？と思ったら案の定なかったので以下のファイルを作成しました。

```config/initialize/redis.rb
$redis = Redis.new(host: 'localhost', port: 6379, driver: :hiredis)
```

これでエラーは解消されました。
Swiftのクラスの一番最初のプロパティを非ObjCの型にするとEXC_BAD_ACCESSする件


ちょっと怖すぎんだろうと思ったので記事にします。
なお、このバグはこちらでレポートされています。
https://bugs.swift.org/browse/SR-1055


# 発生している問題
サンプルコードはこちらです。https://github.com/fmtonakai/SwiftPropertyCrash7_3

Swiftで次のようなクラスを定義します。

```swift
enum MyEnum {
  case Foo
}

class MyObject: NSObject {
  let myEnum: MyEnum = .Foo
}
```

これを利用すると実行時にクラッシュします。

![スクリーンショット 2016-03-26 15.31.49.png](https://qiita-image-store.s3.amazonaws.com/0/32525/e4c90398-81ec-031e-ecfd-c828d4b60ac1.png "スクリーンショット 2016-03-26 15.31.49.png")

なお、ObjCとSwiftの混合プロジェクトで実行してますが、Swift onlyのプロジェクトでも同様にクラッシュが発生します。


# 回避方法
なんでもいいのでmyEnumの前にObjCからアクセスできるプロパティを設定します。もしくはプロパティの順番を変えて最初にObjCからアクセスできるものを一番最初に持ってきます。(どういうことなの・・・)

```swift
class MyObject: NSObject {
    let str = "str"
    let myEnum: MyEnum = .Foo
}
```

# 対策
## 自分のアプリがクラッシュするかを調べる
実行時エラーであり、問題のあるクラスを生成した時にクラッシュするので、アプリのどこでクラッシュが起こるかわかりません。アプリの中に爆弾を抱えた状態になります。

ここで、アプリがこれによってクラッシュするかを検出する方法があります。
それはObjC runtime関数のobjc_copyClassListを呼ぶことです。

![スクリーンショット 2016-03-26 15.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/32525/f1ab3993-b01b-fec8-1c55-9b45a1be8dd7.png "スクリーンショット 2016-03-26 15.46.18.png")

このように問題のあるクラスがあるとobjc_copyClassListでBAD_ACCESS起こすので、この問題を引き起こすクラスがあることを検出できます。クラッシュしなければとりあえず安心です。(がこれから作るクラスには十分注意してください）

## クラッシュを引き起こすクラスを探す
クラッシュした場合、問題のあるクラスを探す必要があります。その時、この方法が便利です。
環境変数に`OBJC_PRINT_CLASS_SETUP: YES`を設定します
![スクリーンショット 2016-03-26 16.01.02.png](https://qiita-image-store.s3.amazonaws.com/0/32525/69977030-5c8c-90de-e1a1-af63d83c73e0.png "スクリーンショット 2016-03-26 16.01.02.png")
すると起動時にObjCのクラスのセットアップがトレースされますが、問題のあるクラスがあった場合、そこでトレースが止まります。

クラッシュ時のログ

```log
objc[24395]: CLASS: realizing class 'PropertyCrash.MyObject'  0x1002b0ec8 0x1002aff18
objc[24395]: CLASS: realizing class 'PropertyCrash.MyObject' (meta) 0x1002c5a88 0x1002afe88
objc[24395]: CLASS: methodizing class 'PropertyCrash.MyObject' (meta)
```

正常時のログ

```log
objc[24453]: CLASS: realizing class 'PropertyCrash.MyObject'  0x1002b0f30 0x1002aff80
objc[24453]: CLASS: realizing class 'PropertyCrash.MyObject' (meta) 0x1002c5af8 0x1002afe88
objc[24453]: CLASS: methodizing class 'PropertyCrash.MyObject' (meta)
objc[24453]: CLASS: methodizing class 'PropertyCrash.MyObject' 
```

methoding classが2度行われないクラスが問題のあるクラスとわかります。


# まとめ
早くHotfix出てくれー！つらい・・・
再起動の仕様を指定するatom

言葉の意味を考えれば挙動は分かるのですが、単語自体を思い出せずになんだっけ？となって調べることがあるのでメモ。

### restart

|atom|挙動|
|---|---|
|`:permanent`|停止したら必ずしたら再起動|
|`:transient`|異常終了したら再起動|
|`:temporary`|再起動されない|

### strategy

|atom|挙動|
|---|---|
|`:one_for_one`|停止した子だけ再起動|
|`:one_for_all`|1つ停止したら全部再起動|
|`:rest_for_one`|停止した子と、それより後に起動した子を再起動|
|`:simple_one_for_one`|停止した子だけ再起動。子の動的な生成に使う|
ブロック型デバイスドライバの概要（のつもり）

バージョン:linux-2.6.0
参考書:[詳解 Linuxカーネル 第3版](http://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E7%AC%AC3%E7%89%88-Daniel-Bovet/dp/487311313X)

# ブロック型デバイスドライバ関連の構造
システムコール
↓
VFS
↓
マッピングレイヤ
↓
汎用ブロック層
↓
I/Oスケジューラ層
↓　↓　↓
ブロック型デバイスドライバ
↓
ハードディスク

# それぞれでやってること（を軽く説明）

●システムコール
↓(ファイルディスクリプタ、ファイルのオフセットを渡す)
●VFS
読み書き処理の方法を決定
↓
●マッピングレイヤ
ハードディスクの読み込む位置を特定
↓
●汎用ブロック層
bio構造を元にI/Oを発行
↓
●I/Oスケジューラ層
I/Oを効率的にできるように処理を並べ替え
↓　↓　↓
●ブロック型デバイスドライバ
データを転送
↓
●ハードディスク
Qt Creatorでビルド用の定義変数のリストを表示する


MACでQt（4.8）の開発をしていて、作成したライブラリファイルをデバッグディレクトリに手でコピーするのが面倒だった。

もっと良い方法があるのだろうなぁと思いつつ、カスタムビルドステップでコピーすることに。

プロジェクトはWindowsやLinuxでもビルドするので、MACに依存した書き方はできるだけ避けたい。

カスタムビルドのコマンド用に定義された変数の一覧は以下で表示できました。（普通知っている？）

<img width="1081" alt="quiita-qt.png" src="https://qiita-image-store.s3.amazonaws.com/0/77703/ca4e3c73-f004-fbb8-1cb1-64398be8e6b2.png">

MAC版だとメニューのQt Creaotr - 設定で表示される画面の「ビルドと実行」ダイアログ

「ビルドディレクトリ」という設定のテキストボックスにカーソルを置くと赤丸のアイコンが表示されます。
これをクリックすると一覧が。

たとえば、MAC版の場合はビルドが出来るディレクトリは、以下のようなMAC依存形式です。

＜ターゲットアプリ＞．app/Contents/MacOS/

これを``` %{DebuggedExecutable:Path} ```で表現できます。

他のプロジェクトの成果物（ライブラリのデバッグ版）を持ってくる方法はまだ　？

変数の一覧もまだ良く見ていないので、メモ程度で。
Atom のパッケージインストールで SELF_SIGNED_CERT_IN_CHAIN

こんにちは。
テキストエディタなら MIFES と vim が好きな者です。

# 概要
Atom を試してみたいと思い、自宅の OS X Yosemite でダウンロードしてみました。
メニューを日本語化するため、パッケージをインストールしようとしたらエラーになってしまい、少しハマってしまったので、そのときの解決方法をメモ。

# 事象
Settings > Install でこんなエラーが出ました。
![スクリーンショット 2016-03-26 15.18.09.png](https://qiita-image-store.s3.amazonaws.com/0/83323/df444926-42d0-0aef-b2a5-a93b44bf5566.png)

# 解決方法
Mac Book Air にインストールされていたカスペルスキーインターネットセキュリティの保護機能を一時的に無効化したら接続成功したので、以下のコマンドを実行してみたところ、うまく接続成功しました。
`apm config set strict-ssl false`

# 参考資料
* https://github.com/atom/atom/issues/4122
* https://github.com/atom/apm#behind-a-firewall
H27年秋期 基本情報技術者 午後問12 解説 設問3

```
MAIN    START
        LD     GR0,X          ; GR0 ← X
        LAD    GR1,Y          ; GR1 ← Yのアドレス
        LD     GR2,=42        ; GR2 ← m
        LAD    GR3,Z          ; GR3 ← Zのアドレス
        LD     GR4,=4
        CALL   BITINSL
        RET
X       DC     #5E96
Y       DC     #1234
        DC     #5678
        DC     #EF18
        DC     #CDEF
Z       DS     5

BITINSL START
        RPUSH
LOOP1   CPA    GR2,=17
        JMI    INS
        CALL   COPY        ; ビット列 Y の先頭から挿入位置の直前の
        SUBA   GR2,=16     ; 語までを結果の領域ヘコピー
        JUMP   LOOP1
INS     CALL   BITINS
        LAD    GR1,1,GR1
        LAD    GR3,2,GR3
        SUBA   GR4,=1
        JZE    FIN
LOOP2   CALL   COPY        ; ビット列 Y の残りの部分を
        JNZ    LOOP2       ; 結果の領域ヘコピー
FIN     RPOP
        RET
COPY    START              ; ビット列 Y の１語を結果の領域ヘコピー
        LD     GR5,0,GR1
        ST     GR5,0,GR3
        LAD    GR1,1,GR1
        LAD    GR3,1,GR3
        SUBA   GR4,=1
        RET

BITINS  START
        RPUSH
        LD     GR6,=16
        SUBA   GR6,GR2        ; GR6 ← シフト数
        LD     GR1,0,GR1      ; GR1 ← ビット列 B
        LD     GR4,GR1        ; GR4 ← ビット列 B
        LD     GR5,GR0        ; GR5 ← ビット列 A
        SRL    GR1,0,GR6
        SLL    GR1,0,GR6      ; GR1 ← ビット列 B の左 n ビット(b1)
        SLL    GR4,0,GR2
        SRL    GR4,0,GR2      ; GR4 ← ビット列 B の右(16-n)ビット(b2)
        SRL    GR0,0,GR2      ; GR0 ← ビット列 A の左(16-n) ビット(a1)
        SLL    GR5,0,GR6      ; GR5 ← ビット列 A の右 n ビット(a2)
        OR     GR1,GR0        ; C1 ← b1+a1
        OR     GR4,GR5        ; C2 ← a2+b2
        ST     GR1,0,GR3
        ST     GR4,1,GR3
        RPOP
        RET
        END
```
X:#5E96
m:42
Y:#1234 5678 EF18 CDEF
N:4
Z:#1234 5678 EF17 A598 CDEF
Java8 ラムダ式でComparatorのコールバック関数を簡単に書く方法

# 今さらながらJava8の新機能で遊んでみる #

普段仕事ではJava7を使っており、Java8の新機能を少し触ってみたら楽しかったので少しづつ書き残していきたいと思います。

まず、今まで鬱陶しいと思っていたComparatorクラス

Personオブジェクトのリストを年齢順で並び替えたいと思います。
 
Java7以前は以下のような書き方でした。

```Java7.java
Collections.sort(list, new Comparator<Person>(){
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
);
```

それがJava8のラムダ式を使えば以下のように書けるようになりました。

```Java8.java
Collections.sort(list, (p1, p2) -> p1.getAge() - p2.getAge());
```

次にID、名前、年齢の順でソートしてみたいと思います。


```Java7.java
Collections.sort(list, new Comparator<Person>(){
    @Override
    public int compare(Person p1, Person p2) {
        int ret = p1.getId() - p2.getId();
        if (ret == 0) {
            ret = p1.getName().compareTo(p2.getName());
        }
        if (ret == 0) {
            ret = p1.getAge() - p2.getAge();
        }
        return ret;
    }		
});
```

つづきましてJava8ラムダ式を用いた方法です。


```Java8.java
Collections.sort(list, (p1, p2) -> {
    int ret = Integer.compare(p1.getId(), p2.getId());
    if (ret == 0) {
        ret = p1.getName().compareTo(p2.getName();
    }    
    if (ret == 0) {
        ret = Integer.compare(p1.getAge(), p2.getAge());
    }
    return ret;
});
```			

ラムダ式に対して賛否両論ありますが、非常に短く書けるようになり個人的にはわかりやすいと思います。

Stream APIについても後々書きたいと思います。

お読みいただきありがとうございました。
Google Chrome-49.0.2623.87でのUser Agentの設定変更

##User Agent の変更
Chromeバージョン バージョン 49.0.2623.87

ディベロッパーツール[⌘＋⌥＋i]を開く
[…]→[More tools]→[Network conditions]を選択
[User agent]の[select automatically]のチェックを外す
下のプルダウンから変更したいものを選ぶ
認定スクラムマスター　テストを受けた際のメモ

スクラムマスター研修から１ヶ月
テスト受験資格が得られたようなのでテスト受けました。

# テストについて

ブラウザで受けられます。
ただ案内メールから受けるまでちょいと分かりづらく
0. メール受信
1. メールにアカウント名が記載してあるので保存
2. Scrum Allianceのページに移動
3. パスワードの初期化申請
4. パスワード登録のためのメールが届くのでリンクに飛んでパスワードを初期化
5. 登録したパスワードとアカウントでログイン
6. マイページに移動すると受験用ページがあるのでそこから受験

という流れになります。

## テスト形式

ScrumAlianceのページは英語ですがテストは**日本語**で受けることができます。

テスト開始するとポップアップウィンドウが開きます（※ポップアップウィンドウの許可をしておかないと駄目です。）
テストは4択方式で計35問　26問正解すれば合格できます。
問題に対してブックマークボタンが有り　チェックを入れておくことで提出前に見返すことが出来ます。
なのでとりあえず自身の無い答えはブックマークボタンにチェックを入れておいて
35問選択したらブックマークした設問だけ見返して　これで良いと思ったら提出といった事が出来ます。
制限時間は無いので研修で取ったノートなどを見ながら落ち着いて受けることが出来ます。

## 設問の傾向

少し分かりにくい表現があったりします（翻訳してるから？）
ひっかけっぽいものがありますがスクラムガイドやノートを見ながら原則を確認して1個ずつ除外していくとほとんどの答えは1つに絞り込めます。

# 結果

32問正解で無事合格しました。
swiftで遷移元のviewcontrollerのインスタンスを取得する方法

# 1画面戻るとき
viewContollerAからviewControllerBに画面遷移をしたときにviewControllerBでviewControllerAをインスタンスを取得したいとする。

```swift
let count = (self.navigationController?.viewControllers.count)! - 2
let vcA = self.navigationController?.viewControllers[count]
```

で取得ができる。
肝は`-2`とすること。

前のviewControllerによって処理を分けることも可能

```swift
let count = (self.navigationController?.viewControllers.count)! - 2
if count < 0 {
    // 戻るviewControllerがないとき(navigationController上で一番最初の画面のとき)
}
if let previousViewController = self.navigationController?.viewControllers[count] as? viewControllerA {
    // viewControlllerAの処理
} else {
    // それ以外のviewControllerの処理
}
```

# 複数戻るとき
例えば
vcA -> vcB -> vcC
でvcCで２画面前のvcAを取得したいとき

```swift
let count = (self.navigationController?.viewControllers.count)! - 3
let vcA = self.navigationController?.viewControllers[count]
```

といった具合でインスタンス化して取得することができる。

つまり、n画面前のviewControllerを取得したいときは`n+1`引けばよいということ
AD2 > ウィーンブリッジ発振回路の測定

```txt:動作環境
Analog Discovery 2 (以下AD2)
```

http://qiita.com/exabugs/items/fd447b7bdf578c832c4b
のウィーンブリッジ発振回路をブレッドボードで構築し、AD2で測定してみた。

## 回路
http://qiita.com/exabugs/items/fd447b7bdf578c832c4b
の回路のうち、R5を省いたもの。
R5を省いた理由としては、３という値に近づける理由から。

## IC

- NJM4580D ([datasheet @ marutsu](http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/njm4580d.pdf))
- R: 16k x 2
- R: 20k x 1
- R: 10k x 1
- C: 0.01u x 2

OPampは両電源のもので試した。単電源のOPampも購入済。

## 接続

AD2（左）とブレッドボード回路(右)

- Scope 1 Negative <--> GND
- Scope 1 Positive <--> NJM4580DのB Output(pin7)
- V+ <--> NJM4580DのV+(pin8)
- V- <--> NJM4580DのV-(pin4)
- GND <--> GND

## AD2の設定

Suppliesを使用し、V+とV-にそれぞれ+5Vと-5Vを供給する。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/45ae09ac-5ee8-c626-1c00-6997c301d131.png)



## 実装の写真

![DSC_0159.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/9c5afc1a-11ad-7f6e-0f3f-8c988a5f3d13.jpeg)

## 波形
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8458a801-b789-36b6-94a8-6650bbf82a49.png)

sine curveが見れた。

しかしながら、ここに来るまでに３回程度ブレッドボードの構築をしなおした。接続が間違って、全然波形がでていなかったが、３回目でようやく波形がでた。　

波形の下側が歪んでいる。

関連 http://www.rlc.gr.jp/project/e_circuit/analog/opamp/wien_bridge/genri/genri.htm

## R5に可変抵抗200Ω追加

R5に可変抵抗200Ωをいれて調整してみたが、波形の下側の歪みは取れなかった。

## FFT結果

スペクトル解析の結果。

1kHzとその高調波が補足できている。
波形の歪みのためか中心波長がそれぞれずれている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/acc9d5a7-9149-e102-82ff-1a1cdcdd62e6.png)
CentOS7でステルスSSIDへ接続する方法

#概要

CentOS7で無線LAN（Wi-Fi）に接続しようと試みたがステルスSSIDのためかハマったのでメモ。

**ググると下記設定をいれれば、一発OK牧場との記載を見つけ入力**

```
$ nmcli d wifi connect [ssid] password [password]

```
**ところが安定のエラーが出て接続できずハマってませんか？？**

```
$ nmcli d wifi connect [ssid] password [password] hidden yes

=> Error: No network with SSID '[ssid]' found.
```

#OS
この記事ではCentOS7.1を使用しています。

#手順
## 1. deviceのstatusを確認

```
$ nmcli d status
DEVICE  TYPE  STATE         CONNECTION
wlp2s0  wifi  disconnected  --

=> deviceは認識しているがAPへ接続できてない。
```

## 2. 接続プロファイルを作成

```
$ nmcli c add type wifi con-name <connect name> ifname <ifname> ssid <ssid>
 ifnameはnmcli d statusで表示された<DEVICE>を入力
$ mcli con modify <connect name> wifi-sec.key-mgmt wpa-psk
$ nmcli con modify <connect name> wifi-sec.psk <password>
```

## 3. プロファイルを作成しても自動接続されないので下記コマンドを入力

```
$ nmcli con up <connect name>
Connection successfully activated

=>接続成功
```

## 4. deviceのstatusを確認

```
$ nmcli d status
DEVICE  TYPE  STATE      CONNECTION
wlp2s0  wifi  connected  <connect name>

$ nmcli d show
GENERAL.DEVICE:                       wlp2s0
GENERAL.TYPE:                         wifi
GENERAL.HWADDR:           **:**:**:**:**:**
GENERAL.MTU:                            0
GENERAL.STATE:                        100 (connected)
GENERAL.CONNECTION:                   <connect name>
GENERAL.CON-PATH:                       
IP4.ADDRESS[1]:                        192.168.**.**/28
IP4.GATEWAY:                           192.168.**.**
IP4.DNS[1]:                            192.168.**.**
IP6.ADDRESS[1]:                        fe80::****:****:****:****/64
IP6.GATEWAY:
```

同じ状況でハマっている方、試してみてください！
Google Apps ScriptでスクレイピングしてSlackに定期ポストするbotを瞬殺で作った

# お金とかソース管理とか何も考えなくていいスクレイピングbotを作りたい

「SlackにStackShare.ioからトレンドランキング拾って投稿するbot作って」「ほいきた」
Slackのbotってhubotとかいう奴の事でしょ？皆作ってるし余裕だろ、と何も考えずに引き受けたら何やらサーバが必要だわ`yo hubot`したらファイルが2000個自動生成されるわ、で速攻ぶん投げたくなりました。目的が単純ならその実装も運用も管理も可能な限りシンプルにしたいものです。探してみたところ、Google Apps Scriptが一番手軽そうだったので早速やってみました。

## Google Apps Script

PaaSやIaaS系のサービスとかでは全然無いです。ざっくり言えばGoogleドライブにスクリプトをアップしておくだけ。
![image](https://qiita-image-store.s3.amazonaws.com/0/42843/4afe7f6d-09a5-c2ad-7f86-49d99c45dc51.png)新規⇢アプリを追加⇢Apps Scriptを検索、追加しておきます。

## プログラミング

* 新規⇢その他⇢Google Apps Script でGASのプロジェクトが作られます。
* GASプロジェクト画面のメニューのリソース⇢ライブラリで以下のキーを入力して追加します。

|ライブラリ |key    |出典   |
|:-------|-------|------|
|SlackApp|M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO|[Slack BotをGASでいい感じで書くためのライブラリを作った](http://qiita.com/soundTricker/items/43267609a870fc9c7453)
|Parser|M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV|[Easy data scraping with Google Apps Script in 5 minutes](http://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html)

* コーディングします。以下が全文。ちなみにHTMLパーサなるリッチな物はありません。探してみると正規表現で実装している例が殆どでしたが、Parserライブラリを使って極力手抜きを目論見ます。

```js
function postMessage() {
  var prop = PropertiesService.getScriptProperties().getProperties();

  var html = UrlFetchApp.fetch('http://stackshare.io/trending/tools').getContentText();
  var doc = Parser.data(html)
                    .from("<div class='trending-load-more div-center' style='margin-top: 0;'>")
                    .to("<div class='div-center'>")
                    .build()

  var as = Parser.data(doc)
                    .from("<a href='")
                    .to("' style='cursor:pointer'>")
                    .iterate()
  var names = Parser.data(doc)
                    .from("<span id='service-name-trending'>")
                    .to("</span>")
                    .iterate()
  var descs = Parser.data(doc)
                    .from("<div class='trending-description'>")
                    .to("</div>")
                    .iterate()

  var slackApp = SlackApp.create(prop.token);

  for(i=0;i<as.length;++i){
    slackApp.postMessage("チャンネルのID", "[" + (i+1) + "] http://stackshare.io" + as[i] + " : " + names[i] + " : " + descs[i].replace(/¥n/ig,""), {username : "stackshare.io"});
  }
}
```

`from().to()`はfromとtoに挟まれた部分を抜き出します。`build()`で文字列、`iterate()`で文字列の配列が得られます。楽ちん。prop.tokenやチャンネルIDといったSlack側の細かい部分は"[Slack BotをGASでいい感じで書くためのライブラリを作った](http://qiita.com/soundTricker/items/43267609a870fc9c7453)"にお任せします。

## 定期実行

ツールバーの![image](https://qiita-image-store.s3.amazonaws.com/0/42843/ad0f6736-ad46-5f0b-ad92-e91c32d2b0f2.png)をクリックしてタイマートリガーを仕込みます。これだけ。

## 結果

動作するとこんな感じになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/42843/e274710a-9e33-06aa-37b2-0cf1f0a2d504.png)
Rubyのメモリ使用量を見ながらロジック考える

ActiveRecordとかでバッチを書いていると、メモリ使いすぎて止まってるなんてことがある。

「一気に結果セット受け取るんじゃなくて、キーだけpluckで配列として受け取って、そのキーを100件毎に処理すればよくない？」
「でもその配列も数としては膨大でしょ？」
「いや配列の個数ではなくOSから見たメモリ使用量で判断すべきだと思うんだ」

ってやり取りがあったので、メモリ使用状況を見ながら、ロジックを考えようの会ができました。

```rb
p `ps -o rss= -p #{Process.pid}`.to_i

ary = []

1.upto(1000000).each{|e|
	ary.push(e)
}

p `ps -o rss= -p #{Process.pid}`.to_i

p ary[100000,10]

p `ps -o rss= -p #{Process.pid}`.to_i

```

出力結果（OSX,Ruby2.1,4)

```
7128
15152
[100001, 100002, 100003, 100004, 100005, 100006, 100007, 100008, 100009, 100010]
18704
```

100万件の配列を作って、どっかの10件をスライスするというだけのソース。

`ps -o rss= -p #{Process.pid}`

で、プロセスが使用している物理メモリ使用量がKBで返ってくる。起動直後に7MB使われていて、100万の配列を加えると、１５MBになる。そっから部分的に配列を取り出すと、またちょっと増える。

という具合。100万件だからってむやみにビビることない。レコードのキーだけ取ってきて、Ruby側の配列でページングしたバッチ処理なんてなのは理にかなってるよねって話です。

オブジェクト単位でメモリ使用量を見たい時には、ObjectSpace みたいなモジュールを使えばいいんだろうけど、実際に知りたいのは、OSからみたメモリ使用量ってケースが多いので、psコマンド直に呼び出し。
HTML,CSS勉強メモ #2 〜1カラムアレンジ〜

午前中に時間ができたので昨日の続きを勉強。
一先ずノートまとめだけ終わらせて、ワンカラムレイアウトを自分なりにアレンジしました。

##**勉強内容**##
###CSS3入門:###
ノートまとめ
CSSレイアウト入門:
04ワンカラムレイアウトを作ろう

##**進度**##
###CSS3入門:###
まとめ終了
CSSレイアウト入門:
ワンカラムレイアウトをアレンジ

##**メモ**##
###アレンジ内容:###
mainのcontainerだけ名前を変えて高さを調節。

![IMG_2154.JPG](https://qiita-image-store.s3.amazonaws.com/0/96102/e1b8e06d-0400-c5d9-8c2d-7ef173470484.jpeg)

###ハマった:###
アレンジ以前にしょっぱなbackgroundの色が適応されずハマった。
解決→`rel="stylsheet"` ×
     `rel="stylesheet` ◯
スペルミスは学生時代からの悪いクセです…
kintone Café大阪 vol.6に参加した記録


## kintoneとは

** Web型のデータベース **
業務向けのアプリケーションが作りやすい。
フォームなども **ドラックアンドドロップ** で簡単に作ることができる。

コミュニケーションなども簡単でき、ミニ掲示板や、コメントができる
1画面にコメントやディスカッションを表示できるため、後での確認がしやすい

## kintoneのカスタマイズ 
http://slideshaer/kojiasaga

カスタマイズの虎の巻
**cybozu developer network**
https://cybozudev.zendesk.com/hc/ja


**JSwatchDog** 

*(なんでkintoneのポータルはフラットデザインがメインなのにボタンはフラットデザインじゃないんだろう…)*
MacにJavaとAndroid Studioを入れる

Javaのインストールとかバージョンの確認まで書いてあるサイトがあまりなかったのでまとめてみた
## Android Studioのダウンロード
![androidstudio.png](https://qiita-image-store.s3.amazonaws.com/0/95469/b85fb2bc-99a5-a108-29f8-334df14c9710.png)
http://developer.android.com/sdk/index.html
ダウンロードしたファイルを展開する
![downloadandroidstudio.png](https://qiita-image-store.s3.amazonaws.com/0/95469/69993359-0490-a4ee-6d0f-5c3c1fa5acf5.png)

アプリケーションフォルダにD&Dして起動
## Javaのインストール
![java_install.png](https://qiita-image-store.s3.amazonaws.com/0/95469/595582c8-16f7-fc17-1c2e-3034f7dd1e34.png)

リンクをクリックして
![mac_java_install.png](https://qiita-image-store.s3.amazonaws.com/0/95469/8c32d058-5b68-392d-26a9-c7a2c93a55a3.png)

青のDownloadからダウンロードする。
ダウンロードしたファイルをからJavaをダウンロード(ずっと「次へ」でいい)
## 引き継ぎ
いままでに作成したプロジェクトがなければ下、あったらフォルダを指定する。
![prev_project.png](https://qiita-image-store.s3.amazonaws.com/0/95469/cb239fb9-3892-9504-1cf5-8d93b45fc6c5.png)

## 起動
![startandroidstudio.png](https://qiita-image-store.s3.amazonaws.com/0/95469/1bec635a-cc04-3a69-0741-b7d45d6ef86d.png)

![androidstudio_setup_wizard.png](https://qiita-image-store.s3.amazonaws.com/0/95469/e9ae05d3-f49f-a0fa-5b2a-ce4eca271a24.png)

Nextで進む
## JDKの場所
![java_setting.png](https://qiita-image-store.s3.amazonaws.com/0/95469/a5800e27-51e5-e76a-6b93-241f2f66008a.png)

JDK7.0以降がないとこの画面が出る。

```
/usr/libexec/java_home -V
```
このコマンドで入ってるJavaが分かる。

```
Matching Java Virtual Machines (2):
    1.6.0_65-b14-468, x86_64:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386:	"Java SE 6"	/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
```
7.0以降がないのでダウンロードしないといけない。
## 7.0以降のJavaのダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
の上のリストのMac OS Xをダウンロードする。
![download_java.png](https://qiita-image-store.s3.amazonaws.com/0/95469/ae21b28b-5c0b-e398-0626-5195054a1801.png)

ダウンロードしたファイルをからダウンロード(ずっと「次へ」でいい)
/usr/libexec/java_home -Vでディレクトリを確認してテキストボックスに入力する
![Java_setting_insert.png](https://qiita-image-store.s3.amazonaws.com/0/95469/4cfe7346-4eb6-b4d5-d408-a57151d47c1a.png)

## インストールするもの
![install_type.png](https://qiita-image-store.s3.amazonaws.com/0/95469/bffe2c9c-6cfd-0f49-23a1-ba2a7f3ea4bc.png)

とりあえずはstandardで。
進んでいくとダウンロードが始まる。
![install.png](https://qiita-image-store.s3.amazonaws.com/0/95469/b6eb300b-8813-1df5-b276-9b1a6729d5d9.png)

## インストール完了
![androidstudio_finish.png](https://qiita-image-store.s3.amazonaws.com/0/95469/1d4b9dcd-9973-9577-8dc4-733f965090d3.png)

finishを押すと完了
![androidstudiofinish.png](https://qiita-image-store.s3.amazonaws.com/0/95469/8ccbf023-784c-9493-f702-bc5d1072f9c9.png)

## 参考サイト
MacにAndroid Studioを入れる
http://chmod.tech/?p=777
(自分のブログ)
JIS認識されているKinesisキーボードをレジストリ変更なしでUS配列にする

# kinesisキーボードがUS配列なのにJIS配列だと思われて認識される

Windows7や8で確認。
Kinesis Advantage MPC USB Contoured Ergonomic Keyboard　がJISキーボードとしてJISキーボードとして認識される。

この場合、そのまま使おうとするとキー印字通りにキーが打てないし、キーが足りずそもそも入押すことができないキー(バックスラッシュ、アンダースコア)が存在する。
キー印字はともかく、押せないキーがいると仕事にならない＆お試しで貸すとき、レジストリをいじるのがつらいので、AutoHotKeyを使って、とりあえず印字通りにキータイプできるrimapスクリプトを用意しました。

なるべく、キー印字＝スクリプトの検知対象となるようにしています。
が、本当はスキャンコードのほうがわかりやすいかもしれない…。

# スクリプト

```ahk:jis_to_us.ahk
$+2::Send,{@}
$+6::Send,{^}
$+7::Send,{&}
$+8::Send,{*}
$+9::Send,{(}
$+0::Send,{)}
$^::Send,{=}
$~::Send,{+}
$+-::Send,{_}
$]::\
$+]::\
$+;::Send,{vkBAsc028}
$@::[
$[::Send,{]}
$+@::Send,{{}
$+[::Send,{}}
$vkBAsc028::Send,{'}
$+vkBAsc028::2
$+vkBBsc027::Send,{vkBAsc028}
$sc056::`
$+sc056::Send,{~}
```
## memo

$X…最初に押されたXキーを指す
Send,…リマップ時に「＋(シフトキー)の入力状態を無効にする」。Sendする場合、厳密にはリマップとは呼ばずホットキーと呼ばれるようだ。
sc056…kinesis左下のバッククォート(`)のスキャンコード。少なくともWindowsOSでJIS認識されているとキー押下に対応するマップがないので、スキャンコード扱いとした。
またA::Bは、半角スペースを行中に入れないこと。

# 併せて読みたい
qiitaですでにまとめられているkinesis初期設定記事
http://qiita.com/hanabokuro@github/items/0dd0b52b9b97d7c063c5

# そのほか
小指Ctrlのホットキーが指の関節的に辛くて、
ハードウェアレベルで構造が違うkinesisで買ってみたけど…。
AutoHotKeyでリマップしちゃうなら、無変換キー→Ctrl修飾キー化でも結果的によかったんじゃないかなって思いました。
bash で コマンドが成功するまでリトライする


ここにいろいろ載ってました。

http://stackoverflow.com/questions/12321469/retry-a-bash-command-with-timeout

### 回答1

```bash
NEXT_WAIT_TIME=0
COMMAND_STATUS=1
until [ $COMMAND_STATUS -eq 0 || $NEXT_WAIT_TIME -eq 4 ]; do
  command
  COMMAND_STATUS=$?
  sleep $NEXT_WAIT_TIME
  let NEXT_WAIT_TIME=NEXT_WAIT_TIME+1
done
```

リトライ間隔を0秒、1秒、2秒… と増やしながら実行する感じですね。
ただ、これだと、2回めで成功してもsleepしちゃうな、とか、最終的に全部失敗した際、無駄に最後にsleepだけして終了するな、とか気になりました。


### 回答2

```bash

NEXT_WAIT_TIME=0
until command || [ $NEXT_WAIT_TIME -eq 4 ]; do
   sleep $(( NEXT_WAIT_TIME++ ))
done
```

こっちの方がシンプルで良さそう。

あと、こんなのもあった。

### その他

http://fahdshariff.blogspot.jp/2014/02/retrying-commands-in-shell-scripts.html


```bash
#!/bin/bash
 
# Retries a command on failure.
# $1 - the max number of attempts
# $2... - the command to run
retry() {
    local -r -i max_attempts="$1"; shift
    local -r cmd="$@"
    local -i attempt_num=1
 
    until $cmd
    do
        if (( attempt_num == max_attempts ))
        then
            echo "Attempt $attempt_num failed and there are no more attempts left!"
            return 1
        else
            echo "Attempt $attempt_num failed! Trying again in $attempt_num seconds..."
            sleep $(( attempt_num++ ))
        fi
    done
}
 
# example usage:
retry 5 ls -ltr foo

```


実際使うときには、timeout コマンドと組み合わせて、◯秒以内に終わらなかったら、再実行　みたいな感じかな。
文字セルの次にある空白セルを結合(マージ)する

## やりたいこと
文字セル→空白行(複数個)→文字セル→空白行と続く列について、空白セルを文字セルに結合する。
イメージは、こんな感じ↓
![ChrMergeやりたいこと.PNG](https://qiita-image-store.s3.amazonaws.com/0/80231/05788131-f08f-b153-061a-f1bd82b48d2c.png)

##使い方
上記ルールで結合したいセル範囲を選択します。
その状態で、Alt+8からマクロを実行します。
![使い方.PNG](https://qiita-image-store.s3.amazonaws.com/0/80231/10d008bf-1b59-85f1-944d-b524869fd175.png)

空白セルは1個でも、複数でも、動作します。
![使い方3.PNG](https://qiita-image-store.s3.amazonaws.com/0/80231/000e9b3d-bcea-6b94-a3c5-95007f7c3657.png)

##ソースコード

```vbnet:module1
Public Sub chrMerge()
    
    Dim rngSel As Range, rng As Range
    
    If TypeName(Selection) <> "Range" Then Exit Sub 'エラー処理
    
    Set rngSel = Selection
    
    For Each rng In rngSel
        If rng.Text <> "" Then
            Do While rng.Offset(1, 0).Text = ""
                If Intersect(rng.Offset(1, 0), rngSel) Is Nothing Then Exit Do
                Range(rng, rng.Offset(1, 0)).Merge
            Loop
        End If
    Next
    
    Set rngSel = Nothing

End Sub
```

##参考
[罫線で囲まれた範囲を結合するマクロ](http://qiita.com/AfricaUmare/items/fa0977edf594cc3bd1c9)
Makerbot DesktopをDocker上で起動するイメージを作った

docker-makerbot-desktop: [DockerHub](https://hub.docker.com/r/mhiroaki8270/docker-makerbot-desktop/), [GitHub](https://github.com/HiroakiMikami/docker-makerbot-desktop)

[Makerbot Desktop](https://www.makerbot.com/desktop)を使いたい，とふと思ったが，わざわざそのためにUbuntuを入れたり，無理やりArch Linuxにインストールはしたくなかったので，Docker上で動かすことを考えた．
しかし，Githubにあったいくつかのレポジトリは，自分の環境では上手く動かなかったり，Dockerhubにあがっていなかったので，自作した．

動作については，上記DockerHubやGitHubにあるReadmeの通りなので割愛して，これを作った時にハマった点，思った点をメモ．

# Docker上のGUIアプリケーション
ググると色々方法はでるが，X Window Systemを利用しているならこれを使うのが最も単純だと思う([参考](http://postd.cc/running-gui-apps-with-docker/))．

ただ，上の方法そのままだと`No protocol specified`と言われて，起動できなかった．dockerのコンテナは結局rootユーザで起動されるので，

```bash
$ xhost local:root
```

として，rootからのX Windowのアクセスを許可すればいい(のだと思う)．
正直，X Window Systemの話はあまりちゃんと勉強していないので違うかもしれない．

# 解決できていない問題点
上記の通り，docker daemonはrootユーザで起動されているので，コンテナもrootユーザで起動されてしまう．従って，Makerbot Desktopがホストから見るとrootで起動されている事になる．

サーバサイドであれば，大半のアプリケーション(`httpd`等)にroot権限が何かしら必要なので，この点は問題にはならなかったのだろうと思う．しかし，GUIアプリケーションなどのクライアントアプリケーションやソフトウェア開発環境をdockerを使って起動する場合には，迷惑だし怖い．

クライアントアプリケーションのdockerによる管理をするなら，この点は解決したいところだなぁと思う．
が，解決策はググっても見つからなかったのでとりあえずこれで公開した．
arduinoでmicros

#概要
arduino unoでピン割り込みした時に、microsが破綻すると言ううわさを検証してみた。
arduino ideは、v1.6.3
#回路図
![micros.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/cb932fb8-ac03-f6e1-03a3-0c089a3220a9.jpeg)

#サンプルコード
```
volatile unsigned long c0 = 0;
volatile unsigned long f0 = 0;
volatile uint8_t pstate = 0;
ISR(PCINT0_vect)
{
	uint8_t state = (PINB >> PINB0) & 0x01;
	if (state != pstate)
	{
		if (state != 0)
		{
			c0 = micros();
			f0 += 2040;
		}
		pstate = state;
	}
}
void setup()
{
	pinMode(8, INPUT);
	PCMSK0 = (1 << PINB0);
	PCICR = (1 << PCIE0);
	Serial.begin(115200);
	while (!Serial) delay(250);
	Serial.print("ok");
	Serial.println();
	f0 = micros();
	analogWrite(9, 127);
}
void loop()
{
	Serial.print(c0);
	Serial.print(" , ");
	Serial.print(f0);
	Serial.println(" ");
	delay(400);
}

```
#写真
http://jsdo.it/ohisama1/aBv2
![micros2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/beeb7ee4-4181-83e6-5f75-57e71e1b0e47.jpeg)
CakePHP2でModel名の複数形を間違えていてエラー。

#cakephp2のモデルとDBの関係性

cakephp2ではモデルとDBのテーブルが1:1で対応している。
そしてその対応は単数形<=>複数形らしい。

モデル ：post (単数形)
テーブル：posts(複数形)

みたいに。

この複数形<=>単数形の関係で詰まったのでメモ。
結論から言うと、僕の英語力が弱かった。

#Dataの複数形は？

Dataモデルを作成してみた。

```
<?php
App::uses('AppModel', 'Model');

class Data extends AppModel {
}
?>
```
複数形はdatasかなと思い、DBのテーブルに作った。動かしてみると下記エラー。

```
Error: Table data for model Data was not found in datasource default.
```

ネットでこのエラーで調べると、modelがキャッシュされてるので、/app/tmp/を消せとか出てくるのが試しても上手くいかず。
うーんと思ってエラーメッセージをよく見ると、「data」テーブルを参照しにいっている。

var_dumpでDataModelオブジェクトを出力する。

```
object(Data)#28 (41) { ["useDbConfig"]=> string(7) "default" ["useTable"]=> string(4) "data" 
～～～～
```

useTableが"data"になってる・・・。

あれ・・・？

もしかして、dataの複数形って、と思って調べる。
http://www.thiroe.net/?p=152

dataはdatumの複数形らしい。つまり、dataという単語自体が複数形なので、それを複数形とするdatasという単語は存在しないとのこと。

あらら・・・。

テーブル構造に手を加えたく無いので、Modelが参照するテーブルをコードの修正で対応。

```
<?php
App::uses('AppModel', 'Model');

class Data extends AppModel {
    var $useTable = 'datas';  //ここを追加

}
?>
```

動きました。
まさか英語力でつまずくとは。
StreamSets Data Collectorの紹介

 
アメリカ在住のJava女子です。
StreamSetsというサンフランシスコのスタートアップ(というか自分が働いている会社なんですがw)が開発している、Data Collecterについて紹介してみます。

##Data Collectorとは何？
会社のホームページによると
>StreamSets Data Collector is a lightweight, powerful engine that streams data in real time. Use Data Collector to route and process data in your data streams.

軽量でパワフルなデータストリーミングエンジンで、データの移動と変換が簡単にGUIで出来ますよ、という製品です。オープンソース製品なのでソースコードが公開されています(github.com/streamsets)

例えばローカルのファイルを、field validationをしながらHadoop FSに移動させたり、Apache Web serverのログをElasticSearchに移動させ、途中の過程でalertを検出したり。

製品のGUI画面です。ホームページより引用。
<img width="549" alt="Screen Shot 2016-03-25 at 4.04.40 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/e16080f8-3be9-7d6f-ca32-35488eac9af6.png">

現時点でのデータ入力元

- ローカルファイル
- File Tail
- Hadoop FS
- JDBC
- HTTP Client 
- Amazon S3 
- Kafka
- MongoDB
- Omniture
- MapR
- RPC
- UDP 
- RabbitMQ

データ入力先は

- Cassandra
- Elasticsearch
- Flume
- Hadoop FS
- HBase
- Hive Streaming
- InfluxDB
- JDBC
- Kafka
- Kinesis
- MapR
- RabbitMQ
- SDC RPC
- Solr 
- Error/Trash

インストールしてGUI画面を見ればなんとなく分かると思うので、早速インストールと起動をしてみよう。

##インストールと起動
動作環境
- Mac OS
- Java 1.8インストール済み

streamsets.comのサイトへ行き、右上のDownload Open Sourceをクリック。
<img width="1197" alt="Screen Shot 2016-03-25 at 3.34.24 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/df40cd56-b3dc-693c-4d25-439ac262281c.png">

ダウンロードサイトからtarballをダウンロード。適当なディレクトリで、

```
$ tar xvzf streamsets-datacollector-all-1.2.2.0.tgz
$ streamsets-datacollector-1.2.2.0/bin/streamsets dc
```

ブラウザからhttp://localhost:18630 にアクセスすると、ログインページが表示されます！

<img width="1165" alt="Screen Shot 2016-03-25 at 4.16.16 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/1847e278-ec33-a2ed-3280-c611462f0e94.png">

UsernameとPasswordは両方 admin でログイン。
Create new pipelineのボタンをクリック。適当にパイプラインの名前を入力します。

こちらがGUI画面です。(初期状態はエラーが２つ表示されているはずです)
<img width="1027" alt="Screen Shot 2016-03-25 at 4.18.48 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/99de7976-adbb-bf2e-6560-9643b07510a3.png">

このキャンパスの上に入力元や入力先のアイコンを置いて、データストリーミングのパイプラインを作っていきます！

例えば、ローカルのファイルからデータを２種類に分け、Jython EvaludatorとField Maskerを使いながらデータをクリーンアップし、最終的にHadoop FSへと移動させるパイプライン例。
<img width="732" alt="Screen Shot 2016-03-25 at 4.48.52 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/de36fe96-001f-77d8-9eed-ecb85f92298c.png">

膨大なJSONオブジェクトをApache Hiveに移動させる例。
<img width="889" alt="Screen Shot 2016-03-25 at 4.45.06 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/118126/8de8b4de-f05c-d3a4-24a5-0f08dfad6345.png">

とりあえず今回はここまで。次回はチュートリアルに乗っているパイプラインを実際に作ってみたいと思います。
特定のIPからのアクセスは認証無しで、それ以外は認証

* apache 2.4 + ubuntu16.04で確認

## Digest認証

```bash:
a2enmod auth_digest
service apache2 restart
```

```apache:.htaccess
AuthType Digest
AuthName "Secret Zone"
AuthUserFile /opt/htdigest
Require valid-user

Satisfy any

order deny,allow
allow from 222.222.111.111
deny from all
```

```bash:認証用ファイル作成
htdigest -c /opt/htdigest 'Secret Zone' user1
```

## Basic認証

```apache:.htaccess
AuthType Basic
AuthName "Secret Zone"
AuthUserFile /opt/htpasswd
Require valid-user

Satisfy any

order deny,allow
allow from 222.222.111.111
deny from all
```

```bash:認証用ファイル作成
htpasswd -c -b /opt/htpasswd username password
```
技術英語 > Well, they come in different shapes and sizes. / come in different forms / linguee

@ Star Trek Voyager > PROTOTYPE

蘇生したばかりのアンドロイドとトレスの会話

艦隊がアンドロイドを所有しているかについての質問に対してトレスが

> Well, they come in different shapes and sizes.

この後に The Next Generation のアンドロイド Data の話が出てくる。


<hr>

http://www.linguee.jp/英語-日本語/翻訳/come+in+different+shape.html

> Analog signals involve the measurement of constantly changing physical operating characteristics which <font color=red>come in many different forms</font>, the most common of which are temperature and pressure.

lingueeは豊富な例文が検索できる点が良い。
最近あまり使ってなかった。
Node.jsで，標準入力のecho backを止める

何かしらシェルコマンドを作ろうとすると，パイプから入力を読まなければならない事がある．必要は無くとも，ファイルを受け取る所は標準入力からも受け取れるようにしておくと後々便利なことは多いと思う(`diff`，`grep`とかみたいに)．

シェルコマンドでは大抵の場合，echo backを止める必要があるが，ググってもQiitaでも方法が見つからなかったのでメモがてら投稿．
(Node.jsでecho backとするとecho serverが出てきてしまい標準入力の話に中々行き着かなかった．)

# まとめ
* Node.jsでパイプを扱う際には`readline`モジュールを使用．
* echo backをなくすには`terminal: false`を追加．

# 基本的な`stdin`の扱い方
Node.jsでstdinを読む方法を調べると，いくつかのWebページ([これ](http://qiita.com/hiroqn@github/items/c927bc97780c34eda562)など)が見つかる．
これらを参考にすると，`readline`モジュールを使って，

```javascript:test1.js
var readline = require('readline');
var reader = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
reader.on('line', function (line) {
  console.log(line);
});
reader.on('close', function () {
  console.log("---close---");
});
```

のように書けばプラットフォーム間の動作の差異もなく，望ましいということがわかる．

しかし，自分の環境(Arch Linux，Node.js 5.7.1)では，次のように表示されてしまった．

```bash
$ echo a | node test1.js
a
a
---close---
```

標準入力のecho backがなくなっていないため，`a`が2つ表示されてしまっている．

# echo backをさせない読み方
これを修正するためには，

```javascript:test2.js
var readline = require('readline');
var reader = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    terminal: false
});
reader.on('line', function (line) {
  console.log(line);
});
reader.on('close', function () {
  console.log("---close---");
});
```

というように，`createInterface`で`terminal: false`を追加する．
こうすると，

```bash
$ echo a | node test2.js
a
---close---
```

となり，echo backが消える．
jsでrange関数をつくる

ブラウザのコンソールでrangeの作り方を試行錯誤してる記事を見つけました。

[飛び飛びArrayのイテレート - Qiita](http://qiita.com/tkrkt/items/8037b1c814c55e9bb79c)

`Array.from`あまり使ったことがなかったので、なるほどという感じです。

今回は、自分なりにrange関数を考えたいと思います。
動作確認はモダンブラウザ(Chrome49)及びnode5.9で行いました。

# Array.from
さて、上記の記事にもある通り、まずは`Array.from`を使ってみます。

[Array.from() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from)

をみると、Array.fromは任意で配列のすべての要素に対して呼び出されるMap関数を引数にとれます。
とゆうかMDNの例のなかに目当てのものがいますね。完。

```js
// Generate a sequence of numbers
Array.from({length: 5}, (v, k) => k);
// [0, 1, 2, 3, 4]
```

とここで終わってもあれなのでもう少し見ていくことにします。

# Array

仕様を確認したらnewをしなくてもコンストラクタが呼ばれて配列が返ります。

- [ECMAScript 2015 Language Specification – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-array-len)

なので、下のように書けます。

```js
Array.from(Array(5), (v, k) => k)
// [0, 1, 2, 3, 4 ]
```

`{length: 5}`より`Array(5)`のほうが多少書きやすいですね。

# Spread operator

- [Spread operator - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator)

雑に言うと、`...`で配列を展開することができます。
これを使うと以下のように書くことができます。

```js
[...Array(5)]
// [ undefined, undefined, undefined, undefined, undefined ]

[...Array(5).keys()]
// [ 0, 1, 2, 3, 4 ]
```

ずいぶんシンプルになりました。

# まとめ

ブラウザでさくっと使うなら、`var range = n => [...Array(n).keys()];`あたりでしょうか。
es6さまさまです。
groovy の `.&` 演算子についてのメモ

ネットで検索していると、「メソッドをクロージャに変換するには`.&`を使って、 `System.&getProperty` みたいな形で使うといいよ！」みたいな記事がわんさかヒットする。

あれ？そのメソッドがオーバーロードされてたときに、自分が欲しい方のメソッドをクロージャに変換するにはどうするんでしたっけ？について、調べた際のメモ。

(正式名称がわからなかったので、すこし検索に手間がかかった)

# メソッドポインタ演算子 (method pointer operator)

http://docs.groovy-lang.org/latest/html/documentation/index.html#method-pointer-operator

を見れば、すべて書いたあるのだけれども、自分の疑問に対する答えの抜粋。

* `.&`演算子によって、メソッドをクロージャに変換できる。
* オーバーロードされていた場合の、引数の型による呼び出すメソッドの切り替えは、**ランタイム**に行われる。