OmniAICreator/Qiita-1.07M huggingface dataset:
Object#equal?とObject#eql?の違い


equal?メソッドとeql?メソッドでは何が違うのだろうと思い調べてみました．

``
hoge_1 = 'hoge'
hoge_2 = 'hoge'
hoge_1.hash
 => -2293525597087874374
hoge_2.hash
 => -2293525597087874374
``

上の出力を見るとわかりますが，同じ文字列を違う変数に入れてますが，ハッシュは同じ値です．
それでは，equal?メソッドとeql?メソッドを使って比較しましょう.

``
hoge_1.equal?(hoge_2)
 => false
hoge_1.eql?(hoge_2)
 => true
``

...(´ﾟдﾟ｀)

何が違うのでしょう...

じゃあ次はそれぞれのオブジェクトIDを比較してみたいと思います．

``
hoge_1.object_id
 => 2168720820 
hoge_2.object_id
 => 2168704840 
``

何となく分かりました．
中身は同じ文字列であってもオブジェクトIDは違うのですね!!
つまり...

**equal?メソッドはオブジェクトIDも比較**して， **eql?メソッドではオブジェクトIDまでは比較しない**という事ですね!!(こういう理解で良いのかな...)

ちなみにちなみに...
StringオブジェクトのオブジェクトIDを調べてみました．

``
'hoge'.object_id
 => 2156471440 
'hoge'.object_id
 => 2156440200 
'hoge'.object_id
 => 2156412440 
``

ほぉほぉ，毎回オブジェクトIDが変わると...
じゃあ次は同じシンボル名だとどうなるのかな...??

``
:hoge.object_id
 => 538568 
:hoge.object_id
 => 538568 
:hoge.object_id
 => 538568 
``

同じシンボル名だと同じオブジェクトIDを指すのですね...!
中々面白いですね.
Koalaを使ってFacebookAPIにアクセスする．


最近FacebookのAPIに触れる事が多いので，それに関して簡単にまとめました．
というか，FacebookAPIとGraphAPIて一緒何ですかね...何か違う気がしますが

# 環境と必要なもの
* Ruby
 * 2.0.0
* [koala](https://rubygems.org/gems/koala)
 * 1.9.0
* [GraphAPIのアクセストークン](https://developers.facebook.com/tools/explorer/)

# 自分の情報を出力するサンプルプログラム

```trykoala.rb
require 'koala'

access_token = 'GraphAPIのアクセストークン'
graph = Koala::Facebook::API.new(access_token)
profile = graph.get_object('me')

puts profile['id']
puts profile['name']
```

``Koala::Facebook::API.new(access_token)``でAPIオブジェクトを作って``graph``に入れています．
``graph.get_object('me')``で自分に関する情報を取得して，``profile``に入れています．
あとは'id'とか'name'でFacebookAPIのUIDと自分の名前を出力しています．
ちなみに，これで取ってくる自分の情報は多分こんだけあるはずです...!

### get_object('me')で返ってくるハッシュの中身
|キー  | 内容 |
|:----|:-----|
|id   |UID   |
|bio  |ユーザーの経歴|
|birthday|誕生日|
|education|ユーザーの学歴リスト|
|email | メールアドレス(emailパーミッションが必要??)|
|name|名前|
|first_name|ファーストネーム|
|last_name |ラストネーム |
|gender |性別|
|hometown|出身地|
|interested_in|興味のある性別(恋愛対象)|
|languages | 母国語|
|link |ユーザーのFacebookプロフィールのURL|
|location|現住所|
|locale|ユーザーのlocale|
|relationship_status|交際ステータス|
|quotes|お気に入りの言葉|
|timezone|タイムゾーン|
|update_item|プロフィールの最終更新日時|
|username|ユーザ名|
|verified|アカウントのverificationステータス|

# 自分のプロフィール写真のURLを抽出するサンプルプログラム

```trykoala.rb
require 'koala'

access_token = 'GraphAPIのアクセストークン'
graph = Koala::Facebook::API.new(access_token)
picture_url = graph.get_picture('me')

puts picture_url
```

``graph.get_picture('me')``
で自分のプロフィール写真を取ってくる事が出来ます．
ちなみに，
``graph.get_picture('me', :type => 'square')``
と同じ意味です．
つまり! square以外にも写真サイズを指定する事が出来るのです！！

|指定出来るvalue|
|:------------|
|small|
|normal|
|large|
|square (指定しなければこれがデフォルト)|

# 同じFacebookAppを使っている友達を出力するサンプルプログラム
**注意!!**
**これは純粋に自分の友達全員を取ってこれるわけではありません!!**
**同じFacebookアプリケーションを使っている友達しかとってこれません．**
[こちらに詳細を書きました.](http://qiita.com/windhorn/items/51d063d25c8f69182b06)

```trykoala.rb
require 'koala'

access_token = 'GraphAPIのアクセストークン'
graph = Koala::Facebook::API.new(access_token)
friends = graph.get_connections('me', 'friends', :local => 'ja-jp')
friends.each do |friend|
	puts friend['name']
end
```
これで同じFacebookアプリケーションを使っている友達を日本語で出力する事が出来ます！
案外簡単ですね！

# 注意
FacebookのAPIは頻繁に仕様変更があるようです．
注意してください!!
nokogiriをインストールしようとしてlibxmlのエラーが発生

gem install nokogiri時に以下のエラーが発生。

~~~
Building libxml2-2.8.0 for nokogiri with the following patches applied:
  - 0001-Fix-parser-local-buffers-size-problems.patch
  - 0002-Fix-entities-local-buffers-size-problems.patch
  - 0003-Fix-an-error-in-previous-commit.patch
  - 0004-Fix-potential-out-of-bound-access.patch
  - 0005-Detect-excessive-entities-expansion-upon-replacement.patch
  - 0006-Do-not-fetch-external-parsed-entities.patch
  - 0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch
  - 0008-Improve-handling-of-xmlStopParser.patch
  - 0009-Fix-a-couple-of-return-without-value.patch
  - 0010-Keep-non-significant-blanks-node-in-HTML-parser.patch
  - 0011-Do-not-fetch-external-parameter-entities.patch
************************************************************************
IMPORTANT!  Nokogiri builds and uses a packaged version of libxml2.

If this is a concern for you and you want to use the system library
instead, abort this installation process and reinstall nokogiri as
follows:

    gem install nokogiri -- --use-system-libraries

If you are using Bundler, tell it to use the option:

    bundle config build.nokogiri --use-system-libraries
    bundle install

However, note that nokogiri does not necessarily support all versions
of libxml2.

For example, libxml2-2.9.0 and higher are currently known to be broken
and thus unsupported by nokogiri, due to compatibility problems and
XPath optimization bugs.
~~~

記載通りシステムのライブラリを利用するように設定したら、インストールできた

~~~
bundle config build.nokogiri --use-system-libraries
~~~
CoroaEnterpriseにいろいろSDKを入れるよ(iOS編)

CoronaをEnterpriseライセンスにしました。
忘れないように各種SDKの入れ方を書いておきます。

ちなみに僕はObjective-Cは全然知らないので、とりあえず動きました的なものだと思ってください。

**nend(NendSDK_iOS-2.3.3)**
1.とりあえず説明どおりにいれます。

2.Library Search Pathsの修正
1個妙なトラップがあり、デフォルトだと
Build Settings/Search Paths/Library Search Pathsが、
"$(SRCROOT)/CoronaEnterprise/Corona/ios/lib"
とダブルクォートがついてます。
nendのSDKを入れるとパスが追加されるのですが、このときに
上記libの中を参照できなくなるみたい。

なので、ダブルクォートを消したらビルドが通ります。
※これは後々のバージョンでは直っているものかもしれません。

3.ViewControrの追加
マニュアルでは表示するViewControllerにコードを追加してね…と書いてますが、
CoronaEnterpriseではdidLoadMainとかで取得できる
runtime.appViewControllerがViewになるため、interfaceの定義とかできません。※ですよね…?

なので、別のViewControllerファイルを作って、そこにマニュアル通りに書きます。

そして、それを
AppCoronaDelegate.mmのdidLoadMain内でaddSubviewしてやればOK。

```objc:AppCoronaDelegate.mm
- (void)didLoadMain:(id<CoronaRuntime>)runtime
{
    AdViewController *vc = [[AdViewController alloc] init];
    //サイズ指定しないと、下のゲームがタッチできなくなっちゃう
    vc.view.superview.frame = CGRectMake(0,0,320,50);
    [runtime.appViewController.view addSubview: vc.view];
}
```

おしまい


**Fello(NotificationSDK_iOS_140423r1)**
1.とりあえず説明どおりにいれます。

2.一個だけ、マニュアルと違うのは

```objc:AppCoronaDelegate.mm
    [KonectNotificationsAPI initialize:[NSObject self] 
                            launchOptions:launchOptions 
                            appId:appId];
```

これ。
selfをキャストしてやる必要がありました。
これで、無事、Pushもインターステーシャル広告もでましたよ。


**Lobi(Lobi-5.2.18)**
1.とりあえず説明どおりにいれます。

2.didLoadMainに、

```objc:AppCoronaDelegate.mm
    //ボタンつくる
    [LobiCore setRootViewController:runtime.appViewController];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];;
    button.frame = CGRectMake(100,100,120,32);

    //
    [button setTitle:@"Open Chat Groups" forState:UIControlStateNormal];
    [button addTarget:self
               action:@selector(presentPublicGroupList)
     forControlEvents:UIControlEventTouchUpInside];

    [runtime.appViewController.view addSubview:button];
```

こんな感じでaddSubviewしてやれば出る。

おわり

他にも入れたらここに書いてみます
WebDriverをChromeのJavaScriptで試した






環境：Windows7 64-bit


## セットアップ

* 作業フォルダを作る

* ChromeDriverをDLして作業フォルダに展開 http://chromedriver.storage.googleapis.com/index.html

* Selenium ServerをDLして作業フォルダに展開 http://www.seleniumhq.org/download/

Selenium Serverの項の Download version 2.41.0のところ。

* Selenium Serverを起動

```go_server.cmd
java -jar selenium-server-standalone-2.41.0.jar -Dwebdriver.chrome.driver=chromedriver.exe
```

go_server.cmdをダブルクリックすると以下のログが出力された。

```sh
5 16, 2014 5:24:00 午後 org.openqa.grid.selenium.GridLauncher main
情報: Launching a standalone server
Setting system property webdriver.chrome.driver to chromedriver.exe
17:24:01.032 INFO - Java: Oracle Corporation 24.51-b03
17:24:01.033 INFO - OS: Windows 7 6.1 x86
17:24:01.039 INFO - v2.41.0, with Core v2.41.0. Built from revision 3192d8a
17:24:01.173 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
17:24:01.174 INFO - Version Jetty/5.1.x
17:24:01.175 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
17:24:01.176 INFO - Started HttpContext[/selenium-server,/selenium-server]
17:24:01.176 INFO - Started HttpContext[/,/]
17:24:01.239 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@18dafec
17:24:01.239 INFO - Started HttpContext[/wd,/wd]
17:24:01.242 INFO - Started SocketListener on 0.0.0.0:4444
17:24:01.243 INFO - Started org.openqa.jetty.jetty.Server@1713b42
```

「RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub 」のURLが
JavaScriptで書くテストコードの接続先。



* NODE.jsをmsiでインストール http://nodejs.org/

* Seleniumの公式JavaScriptバインディング、selenium-webdriverをnpmで取得する

```sh
> node --version
v0.10.28

> npm --version
1.4.9

> npm install mocha
 :
npm http 304 https://registry.npmjs.org/lru-cache
mocha@1.18.2 node_modules\mocha
├── debug@0.8.1
├── diff@1.0.7
├── growl@1.7.0
├── commander@2.0.0
├── mkdirp@0.3.5
├── jade@0.26.3 (commander@0.6.1, mkdirp@0.3.0)
└── glob@3.2.3 (inherits@2.0.1, graceful-fs@2.0.3, minimatch@0.2.14)

> npm install selenium-webdriver
npm http GET https://registry.npmjs.org/selenium-webdriver
npm http 304 https://registry.npmjs.org/selenium-webdriver
selenium-webdriver@2.41.0 node_modules\selenium-webdriver

```


## 試す

```try.js

var webdriver = require('selenium-webdriver');

var driver = new webdriver.Builder().
    usingServer('http://localhost:4444/wd/hub').
    withCapabilities(webdriver.Capabilities.chrome()).
    build();

driver.get('http://www.google.com');
driver.findElement(webdriver.By.name('q')).sendKeys('webdriver');
driver.findElement(webdriver.By.name('btnG')).click();
driver.wait(function() {
  return driver.getTitle().then(function(title) {
    return title === 'webdriver - Google 検索';
  });
}, 1000);

driver.quit();

```

```sh
> node try.js
```

https://www.npmjs.org/package/selenium-webdriver や
https://code.google.com/p/selenium/wiki/WebDriverJs には
ChromeならネイティブサポートがあるからSelenium Serverは不要ですとあるが、
すんなりいかなかったのでサーバーを使った。こいつ動くぞ。
rails runnerを使ってみた


###rails runnerとは
railsの環境を読み込んだ上で任意のrubyコードが実行できるようです。
batch処理とかの時に使えるんじゃないでしょうか。
helpを見ると以下のように使うらしい。環境も指定できて便利ですね。

```help
% rails runner -h
Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]

    -e, --environment=name           Specifies the environment for the runner to operate under (test/development/production).
                                     Default: development

    -h, --help                       Show this help message.

Examples:
    rails runner 'puts Rails.env'
        This runs the code `puts Rails.env` after loading the app

    rails runner path/to/filename.rb
        This runs the Ruby file located at `path/to/filename.rb` after loading the app

You can also use runner as a shebang line for your executables:
    -------------------------------------------------------------
    #!/usr/bin/env /Users/a_kubota/bitbucket/grank/rails_runner -h runner

    Product.all.each { |p| p.price *= 2 ; p.save! }
    -------------------------------------------------------------
```
rubyのコードを直接実行する方法と

```
rails runner 'puts Rails.env'
```
スクリプトファイルを指定する方法があるみたい。

```
rails runner path/to/filename.rb
```
また、shebangも書けるようです。

###使ってみた。
実行するファイルを作ります。batchディレクトリを作ってその中においてみました。

```
myapp
├── app
├── batch
│   └── hello_batch.rb
:
```

```ruby:hello_batch.rb
class HelloBatch
  def self.execute
    puts 'hello world'
  end
end

HelloBatch.execute
```

実行結果

```
% rails runner batch/hello_batch.rb
hello world
```
できた！！

調べたところlibの下にclassを作ってそこを呼ぶのが作法のようでしたが、どこでも好きなところでいいんじゃないでしょうか。個人的にはlibだとちょっと違う気がしました。ここは個人差ありますよね。

###参考
http://masa2sei.github.io/blog/2013/02/01/rails-rails-runner/
http://d.hatena.ne.jp/hrendoh/20111111/1320990987
あらためてBundlerに関して理解する


ちょっと気になったのでBundlerに関する記事をあらためて読みなおしたのでそのまとめにでも．

# Bundlerって何ですか.
BundlerとはRubyのライブラリ管理ツールの事．
Railsでは既に標準で採用されている．
だからRailsのプロダクトじゃなくてもBundlerを使う事が出来る!

# Bundlerを使うメリット
* ライブラリのバージョンの違いで動かない事がなくなる．
* 複数人のチームで開発している時にライブラリを増やしても何をインストールするのか気にしなくよい．
 * Gemfileに使うgemが記載されているので，`$ bundle install``すれば良いだけ．

**メンバ間で開発環境を整えるのが容易になる!!**

# Bundlerを使ってみよう!

## Gemfileの記述方法

``` ruby:Gemfile
source 'http://rubygems.org'

gem 'rails', '4.1.0'
gem 'koala'
```

みたいな感じ．
一行目の``source ~~~~``はどのサーバーからライブラリをインストールするかを示している．

## ライブラリのインストール方法

``
$ bundle install
``


## Gemfile.lockとは

このファイルにはGemfileで記述されたライブラリについて，そのライブラリと依存している全てのライブラリの一覧とインストールしたバージョンが記載されている．

## Gemfileのバージョンの指定方法

|記述子|意味 | 記述例|
|:----|:---|:------|
|=    |そのバージョンのみ |'= 4.1.1' ('4.1.1'でもOK)|
|>    |このバージョンより大きいもの| '> 4.1.1'|
|<    |このバージョンより小さいもの| '< 4.1.1'|
|>=   |以降のバージョンすべて     | '>= 4.1.1'|
|<=   |このバージョンまで        | '<= 4.1.1'|
|~>   |最下位のバージョン番号以降 | '~> 4.1.1'|

## '~>'の動作
|記述例  |対象とするバージョン |
|:------|:----------------|
|'~> 4.1.0'|4.1.0から4.2直前まで|
|'~> 4.1'  |4.1から5直前まで|
|(指定しない)|全てのバージョン|
[傾向と対策] なぜ、Windows 8 から多くのコンソールアプリケーションで日本語が入力できなくなったのか

- 本記事は [nyaos.org](http://nyaos.org/d/index.cgi?p=(2013.03.25)+1823) より転載したものです。

Windows 8 になってから、vim , NYAOS といった多くのコンソールアプリケーションで、 日本語が入力できなくなったようです。 

NYAOS は2012年12月頃に、Windows 8 のユーザさんの御協力を得て、Windows 8 対応を行ったのですが、見返してみると Bitbucket に [issue](https://bitbucket.org/zetamatta/nyaos3000/issue/16/windows-8-ime) は起案したものの、文書として Windows 8になって何が変わっていたかの説明をしていなかったようです。

まだ、世の中には Windows 8 に対応していないコンソールアプリケーションの方が多いので、ここで何がどうなっていたかを解説しておきたいと思います。

# 原因は API の使われ方が変わってしまっていたことにある。

コンソールでの1文字キーボード入力の API に [ReadConsoleInput](http://msdn.microsoft.com/ja-jp/library/cc429661.aspx) というものがあります。従来のアプリケーションは、このAPI1回のコールで、1バイトの文字コードを取得していました。

ところが、Windows 8 になってから、API1回のコールで、1文字分(つまり ShiftJIS だと2バイト)の文字コードが得られるようになってしまったようなのです。

そのため、Windows 7 までのコンソールアプリケーションを Windows 8 で動かすと、ことごとく ShiftJIS の2バイト目を落としてしまって、正常な日本語が入力できなくなったのです。

# API そのものは変わっていない

実のところ、API そのものの仕様は一切変わっていません。 MSDNの [ReadConsoleInput](http://msdn.microsoft.com/ja-jp/library/cc429661.aspx)を見ていただくと、 [ReadConsoleInput](http://msdn.microsoft.com/ja-jp/library/cc429661.aspx) は、キー入力専用APIというわけではなく、 コンソールで起きたイベント情報を得るAPIとなっており、 元々一度に複数レコードのイベント情報を取得できるようになっていました。

ところが、なぜか 7 まではShiftJIS 1文字の入力を受けとった時でも、 上位バイト下位バイトを2回の API コールに分けて受信するという形になっていたのです。 そのため、多くのコンソールアプリケーションがバイト数分 [ReadConsoleInput](http://msdn.microsoft.com/ja-jp/library/cc429661.aspx) を呼び出して、 最初の1レコードだけを取得するという形で実装されていました。

# 対応するにはどうすればいいか

[ReadConsoleInput](http://msdn.microsoft.com/ja-jp/library/cc429661.aspx) で受信するイベントのバッファを大目にとって、 全てのレコードをちゃんと受取側で処理するようにすれば Ok です。

参考になるかどうか分かりませんが、NYAOS だと、[getch_msvc.cpp](https://bitbucket.org/zetamatta/nyaos3000/src/de745b698e8b6f664a52afd9d7b2e8f37aa1f2ed/getch_msvc.cpp?at=default) というソースで、この複数レコード対応を行いました。

このソースファイル自体は元々[lukewarmさんからいただいたもの](http://d.hatena.ne.jp/lukewarm/20091204#p2)ですが、Public Domain とおっしゃっているので、多分、転用いただいても問題ないと思います。

まだ、Windows 8 は少数派だとは思いますが、 多くのコンソールアプリケーションで、きちんと日本語入力対応が進むことを願います。
標本抽出法

いままで [Hadoop による全数調査の話](http://qiita.com/ynakayama/items/1494cf4fdf988e1c7c7c)や[分布の適合度を検定する話](http://qiita.com/ynakayama/items/5ab69d6d06d61148a689)をしてきましたが、ここで原点に立ち返って標本抽出法について整理をしたいと思います。

## 標本調査とは

観測対象のデータ全体を調査する全数調査とは違って、対象母集団から一定の手続を経て選んだ対象を調査することを **標本調査 (sample survey)** と言います。

全数調査と異なり、標本調査では選んだ標本が母集団の特徴を十分に反映した標本であるかどうかを慎重に検討し標本抽出しなければなりません。

## 標本抽出法の種類

標本抽出の方法には、大きく分けて無作為抽出法と有意抽出法があります。

無作為抽出法では母集団から標本の選ばれる確率が等しくなるように乱数表などを用いて確率的に標本を選びます。無作為抽出で選ばれた標本を確率標本あるいはランダム標本と言います。

一方、母集団から標本を抽出するにあたって、事前に与えられた情報などをもとに「典型的」あるいは「代表的」であるとして便宜的あるいは恣意的に抽出する方法を有意抽出法といいます。

無作為標本には客観性がありますが有意標本には客観性が乏しくなります。また、有意標本による調査結果はある観点からは価値があってもそれ以外の一般的な場面でそうであるとは限りません。そのため有意抽出法では母集団の状況を推計が難しく、無作為標本の方が一般的であると言えます。

主な標本抽出法をまとめます。

|抽出法名称|区分|説明|
|:--|:--|:--|
|単純無作為抽出法|無作為抽出法|母集団から乱数表を用いて標本を抽出します。|
|系統抽出法(等間隔法)|無作為抽出法|最初だけ乱数表で決めそれ以降を等間隔で抽出します。単純無作為抽出法よりは「標本誤差」が大きくなります。ただし乱数を適用するのが最初の一回だけなので計算量が少なくてすみます。|
|多段抽出法|無作為抽出法|一段階目で対象のグループ、二段階目でそのグループ内の個人という風に、段階を分けて無作為抽出をおこないます。三段階以上の場合もあります。|
|層化抽出法|有意抽出法|母集団をいくつかの部分母集団に分割し各部分母集団から標本を抽出します。|
|ネイマン配分法|有意抽出法|層化抽出法の一種ですが、層別の標準偏差に注目し比例配分します。層の標準偏差が著しく大きい場合は抽出率を 1 (全数抽出)とします。|
|層化多段抽出法|有意抽出法|層化抽出法と多段抽出法を組み合わせたもので、よく用いられている方法です。|

## 母平均・母比率の推定

母集団から標本抽出をおこない、標本調査によって母集団の性質を調べることが多々有ります。

母平均 μ 、母分散 σ^2 の母集団から大きさ n の無作為標本を復元抽出するとき標本平均 m の期待値 e' と標準偏差 σ' は次の通りです。

```math
e'  = \mu \\
\sigma' = \frac {\sigma} {\sqrt{n}}
```

### 極限定理

母平均 μ 、母 σ^2 の母集団から大きさ n の無作為標本を復元抽出します。 n が十分大きいとき標本平均 m は次のとおり正規分布に近似します。

```math
N(\mu, \frac {\sigma^2} {n})
```

### 母平均の推定

標本の大きさ n が十分大きいとき母平均 μ に対する 95% 信頼区間は次のようになります。

```math
m - 1.96 \frac {\sigma} {\sqrt{n}} \le \mu \le m + 1.96 \frac {\sigma} {\sqrt{n}}
```

### 母比率の推定

母比率 p の信頼度 95% の信頼区間は次のようになります。

```math
R - 1.96 \sqrt{ \frac {R(1-R)} {n} } \le p \le R + 1.96 \sqrt{ \frac {R(1-R)} {n} }
```
詳解GitHubを読んでみた


ざっくりまとめてみました．

# ソーシャルコーディングの世界

## GitHubとGitの違い

### Git
Gitリポジトリというデータの貯蔵庫にソースコード等を入れて利用する．

### GitHub
Gitリポジトリを置く場所をインターネット上で提供しているサービス．

## バージョン管理とは
ソフトウェアのソースコードを書き足したり，変更したりする過程を記録していき，特定の段階まで戻ったり，誤って消してしまったファイルを復活させたり等の機能を提供する．

## GitHubの最大の特徴
GitHubはプロダクトに加えて人にも注目する事が出来る．
その人が他に何をしているのかとか．

## GitHubが提供する機能
* Gitリポジトリ
* organization
* Issue
 * 1つのタスクを1つのIssueに割り当てて，トラッキングや管理を行える機能．
 * Pull Requestが行われると同時にIssueが1つ発行される．
 * GitのコミットメッセージにIssueの発行ID(#7とか)を書き加えると，自動的にIssueからコミットに対してリンクが張られる．
* Wiki
 * WikiページもGitリポジトリとして管理されているので，改版履歴が見れる．
* PullRequest
 * GitHubのリポジトリにpushした変更や機能追加を他の人のリポジトリに取り込んでもらうための要求を出す機能．
 * ソースコードの行単位でコメントをつけたり出来る．

# GitHubを使ってみよう!

## コミットメッセージ
GitHubでは特定のフォーマットに基づいてコミットメッセージを記述するとBTSと同様な機能が使える．

* コミットメッセージにIssueの発行ID(#7とか)を記述すると，そのIssueからそのコミットへのリンクが自動的に張られる．
* オープンされているIssueの対応が終わってクローズしたいときには，次の様にコミットメッセージを記述するとクローズされる．
 * fixes 発行ID
 * fixed 発行ID
 * fix 発行ID
 * closes 発行ID
 * close 発行ID
 * closed 発行ID

## GitHub Pages
プロジェクトのWebサイトを公開する目的で静的HTMLのホスティングを行える．独自ドメインの割り当ても可能!!
この機能を使ってブログ書くことも出来る．[Octopress](http://octopress.org/)

# はじめてのPull Request
## Pull Requestとは
自分が加えた変更を相手のリポジトリに取り込んで欲しい時にする行為．
PullRequestをすると，送信先のリポジトリにソースコード付きのIssueが発行される．

## Pull Requestの効果的な使い方
### 開発の途中で議論するためにPullRequestする．

ある程度イメージ出来るレベルのコードを書いてPullRequestを送信すると，まわりの人からフィードバックをもらえる事が出来る．
気付いてなかった事を指摘されたり，書こうとしていたコードが他のメンバーと重複している事に気づく事によって，質の高いコードになっていく．
忘れてはならないのが **Pull Requestはブランチ単位で送られる** ということ．

1. 最初の議論するきっかけとしてコードを書きコミットする．
2. Pull Requestを送信する．
3. オープンされたPull Reqeustで議論とコミットを積み重ねる事によってブランチを育てる．
4. 新しい機能がよりよい状態で完成し，そのブランチがマージされる．

### ForkせずにブランチからPull Requestを送る．
そもそも相手のリポジトリにブランチを作る権限を持っているのであれば，ForkせずにPull Requestを送るのもアリ!!

# Pull Requestが送られてきたら!?
## Pull Requestが取り込む準備
### コードレビュー
GitHubでは送られたきたPull Requestに関してコードレビューを行える．
GitHubではコード差分だけではなく，画像の差分まで表示できてしまう！
### 手元の開発環境にPull Requestの内容を反映させる．
* Pull Requestを受信した側のリポジトリをcloneする．
* 手元のリポジトリに対して，Pull Request送信側のリポジトリをリモートリポジトリとして登録してデータを取得する．

``
$ git remote add PullRequest送信者 git@github.com:PullRequeest送信者/リポジトリ名
$ git fetch PullRequest送信者
``

* マージ用のブランチを作成する．
 * Pull Requestを取り込んだ状態を再現するためのブランチを作成する．


# GitHubと連携して活躍するプロダクト
## Travis CI

[TravisCI](https://travis-ci.org/)はオープンソースコミュニティ向けのCIを無料でホスティングしてくれるサービス．
リポジトリを関しさせておいて，開発者がコミットした瞬間に自動的にテストやビルドを実行する．

## Coderwall
[Coderwall](https://coderwall.com/)はGitHubのリポジトリ情報等を基に開発者のプロフィールを生成するサービス．
逆引きUIStoryboard


# 任意のstoryboardを取得する

```objectivec
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
```


# storyboardから任意のビューコントローラを取得する

```objectivec
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];

// initial view controllerを取得する
UIViewController *vc = [storyboard instantiateInitialViewController];

// Storyboard IDから取得する
MBLoginViewController *loginVc = [storyboard instantiateViewControllerWithIdentifier:@"loginViewController"];
```

## Storyboard IDって何？

Storyboard内でViewControllerに定義したIDです。

![kobito.1400224181.136167.png](https://qiita-image-store.s3.amazonaws.com/0/29860/e797089d-4dbb-1070-3b98-5a38b0e5ac19.png "kobito.1400224181.136167.png")


## Initial View Controllerって何？

Storyboard内で最初に表示されるViewControllerです。

![kobito.1400224050.404908.png](https://qiita-image-store.s3.amazonaws.com/0/29860/cd9c5c91-2eb3-a6b9-4bbd-ac54299d22b6.png "kobito.1400224050.404908.png")

# プログラムからsegueを実行する

Storyboard Segueはこんなかんじ。

```objectivec
// ViewControllerからStoryboard Segueを指定してsegueを実行する
[self performSegueWithIdentifier:@"show_login" sender:self];
```


![kobito.1400224512.201717.png](https://qiita-image-store.s3.amazonaws.com/0/29860/80bd060e-040a-98bb-31a2-e70fe231c533.png "kobito.1400224512.201717.png")


# Segueの実行に割り込みをかける

```objectivec
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"show_login"]) {
        // destinationViewController:から遷移先のビューコントローラを取得する
        MBLoginViewController *loginViewController = [segue destinationViewController];
        loginViewController.delegate = self;
    }
}
```
ParseSDK のトラップを集めたページ

先日、potatotips #7 にて、Parse と上手に付き合うための tips を発表させていただきました。

https://speakerdeck.com/keithyokoma/falsehanafalseapuriwobao-su-dedong-kuyounisitahua

この記事では、ParseSDK を使う上で気をつけていないとハマるポイントを、もう少し掘り下げつつ、発表には無かったものも含めてお送りしようと思います。

## 1. 非同期処理

### 1-1. **InBackground はメインスレッドをブロックする

名前からして、メインスレッドとは違うスレッドで非同期に処理をしてくれて、結果をコールバックにかえしてくれるように見えますが、メインスレッドをブロックするところがあるので Stop the World します。

内部的にはリクエストをキューに積んで逐次処理でさばいているようですが…

### 1-2. **InBackground のコールバックは Context の生死にかかわらず呼ばれる

よくあるカンタンな実装として、以下の様なものがあると思います。

```java

public class SomeActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ParseQuery<ParseObject> query = ParseQuery.getQuery("SomeData");
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> result, ParseException e) {

            }
        });
    }
}
```

Activity が死んだら、コールバックは呼ばれてほしくないですが、Activity の死活管理をしていないので、コールバックが返ってきます。
内部的には、[Bolts フレームワーク](https://github.com/BoltsFramework/Bolts-Android)と同じものが使われています。

### 1-3. 同期呼び出し API は別のスレッドでリクエストを投げている

リクエストを同期的に実行する API も、実装としてはリクエストの実行は別のスレッドでやっています。
つまり、同期呼び出し API といいつつ、単に別のスレッドの結果を待つだけのことしかしていません。

同期呼び出し API を実行しているスレッドに割り込み等が発生すると、待っているところが`InterruptedException`を吐き出します。
SDK では、この`InterrutedException`をキャッチして、`RuntimeException`に翻訳してスローするようになっています。

たとえば、`AbstractThreadedSyncAdapter`を使ってデータを同期するようなことを考えると、同期のキャンセルが発生した時に、`AbstractThreadedSyncAdapter`のスレッドが途中で終わらせられるので、上記のような状況が発生します。

### 1-4. リトライ処理でクラッシュする

わりと古い Apache HttpClient を使用しているようです。リクエストのリトライで、`SingleClientConnManager`がうまく使えず`IllegalStateException`となる事があり、クラッシュの原因となります。

### 1-5. エラーコード表にないコードのエラーが帰ってくることがある

Parse も知り得ない謎のコードもあるようです。

## 2. オブジェクトの操作

### 2-1. レスポンスデータの取得の都度ロック取得があり、かつデータの存在確認をしている。

例えば、キー名を指定してデータを取得する際には、以下の様なコードを書きます。

```java

ParseObject object = // ...

String name = object.getString("name");
```

`ParseObject#get**(String)`のメソッド名からして、オンメモリのデータをすぐに返してくれそうなイメージが有りますが、並列性のため、アクセスの度にロックを取得します。

ロックの取得の上で、メモリにデータが有るかどうかも確認しますが、この確認にもロックの取得が行われます。

ロックのコストが嵩んでいるため、そこそこの時間を要することになります。

### 2-2. データ構造以上に様々な情報を持つのでメモリを割りとよく食う

`ParseObject`は内部的に、単なるデータを保持する`Map`構造以外にも、どのような操作を実行したかを記録するキューがあったり、必要な`Task`を保持するキューがあったりと、デコンパイルすると本当にいろいろなデータを保持していることがわかります。

`ParseObject`を拡張してデータ構造とモデルの兼用なクラスを以下のように作ると、サーバから取得したデータやその他のデータ構造の上に個々のデータのフィールドも持つことになるので、メモリをバクバク食います。

```java
public void MyData extends ParseObject implements Parcelable {
    private String mObjectId;
    private String mName;
    private Date mCreatedAt;
    private Date mUpdatedAt;
    // ...
}
```

仮に、`ParseObject`を拡張せず、自分でデータ構造の型(ex. `SomeData`)を定義した場合、`List<ParseObject>`から`List<SomeData>`にマップする処理を走らせると、結構な回数の GC が走っているのが見て取れると思います。
うさちゃん的　OpenVPN AccessServerで簡単VPN構築 (自分メモ)


うさちゃんです。
研究室から快適インターネットライフをおくるために、
そして先日からAzure環境を手に入れたのでVPN環境を構築してみました。

間違ってたら優しいどなたかおしえてくださいまし。。。。

##OpenVPN AccessServer
管理画面ついてて便利ですね。ログとか今だれが接続してるか一目瞭然。
ふつうにやると認証局とかつくらないといけないのめんどくさい。

##手順
1. 仮想マシンつくる
2. OpenVPNインスコする
3. 接続側にOpenVPNインスコする
4. つなぐ

##仮想マシン構築してOpenVPNいれる
内容はほとんどこちらと同じ
参考URL：http://azure-openvpn.github.io/

ユーザがopenvpnだけだと誰が接続しているかわかりにくいので
adduserしてつなぐ子を増やしておくといいかもしれません。
`passwd vpn-from-win` もお忘れなく。

##接続してみる
とりあえず、私は `$ adduser vpn-from-win` つくってみました

https://[your address]:943/に接続して、さっきつくったIDとパスでログイン。

* このVPN接続したいときは赤枠のところを「Connect」に、管理画面にいきたいときは「Login」ね
![ろぐいんがめん](https://qiita-image-store.s3.amazonaws.com/0/25735/62877cfc-b63f-ac2e-bf62-e6c5c3e769e4.png "Screen Shot 2014-05-16 at 16.13.05.png")

で、クライアントソフトウェアインスコしてねっていわれるのでおとなしく接続。[こんなかんじ（windowsの場合）](https://openvpn.net/index.php/access-server/docs/admin-guides/457-connect-to-openvpn-access-server-using-the-connect-client.html)


* 接続後、ブラウザでみてみるとつながってるのがわかりますー!
![つながたよ](https://qiita-image-store.s3.amazonaws.com/0/25735/f5d4f248-a5b2-a5b7-cdd2-e8505d5da5d2.png "Screen Shot 2014-05-16 at 15.53.36.png")

##こめんと
びっくりするほど簡単ですね。
一応[HeartBleed](http://qiita.com/usaribbon/items/b7ab913efed97176fc8c)の対策もしたけど、ちゃんとできてるのかなｗ
RPMをインストールせずにカレントディレクトリ以下に展開する

```shell-session:rpmの展開
rpm2cpio huga.rpm | cpio -idv
```

##参考
[逆引きUNIXコマンド/rpmファイルからファイルを取り出す](http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/rpm%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99.html)
うさちゃん的　HeartBleedの対応まとめ

============================

##HeartBleedの影響対象となるOpenSSLバージョン
以下のバージョンが影響を受けます。但し、システムによっては原因となっているheartbeat機能が無効化されている場合もあるため、バージョンが一致しただけで当該脆弱性の影響を受けるかは確定しません。

###1) OpenSSL 1.0.1系
バージョン名	リリース時期	CVE-2014-0160
**OpenSSL 1.0.1	2012/03/14	脆弱性あり**
OpenSSL 1.0.1a	2012/04/19	脆弱性あり
OpenSSL 1.0.1b	2012/04/26	脆弱性あり
OpenSSL 1.0.1c	2012/05/10	脆弱性あり
OpenSSL 1.0.1d	2013/02/05	脆弱性あり
OpenSSL 1.0.1e	2013/02/11	脆弱性あり
OpenSSL 1.0.1f	2014/01/06	脆弱性あり
OpenSSL 1.0.1g	2014/04/07	修正済

###2) OpenSSL 1.0.2系
バージョン名	リリース時期	CVE-2014-0160
OpenSSL 1.0.2 beta 1	2014/02/24	脆弱性あり
OpenSSL 1.0.2 beta 2	リリースされていない	修正予定

##操作手順
参考URL：http://qiita.com/cm3/items/5e200b0ac8f1e76436f0
http://www.ubuntu.com/usn/usn-2165-1/


1. pinternサーバのopensslのバージョン確認

```
$ openssl version
OpenSSL 1.0.1 14 Mar 2012
```

2.Ubuntuのバージョンも確認

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"
```

3.変更前のopensslの状態

```
$ dpkg -l | grep openssl
rc  libgnutls-openssl27              2.12.14-5ubuntu3.4           GNU TLS library - OpenSSL wrapper
ii  openssl                          1.0.1-4ubuntu5.9             Secure Socket Layer (SSL) binary and related cryptographic tools
```

4.opensslのアップデート

```
sudo apt-get update
sudo apt-get install openssl libssl1.0.0
sudo reboot
dpkg -l | grep openssl
```

```
$ dpkg -l | grep openssl
rc  libgnutls-openssl27              2.12.14-5ubuntu3.4           GNU TLS library - OpenSSL wrapper
ii  openssl                          1.0.1-4ubuntu5.12            Secure Socket Layer (SSL) binary and related cryptographic tools
```

* チェックツール
http://possible.lv/tools/hb/?domain=

###補足
openssl更新後・・・

```
$ openssl version
OpenSSL 1.0.1 14 Mar 2012
```
になってても

```
$ dpkg -l | grep openssl
rc  libgnutls-openssl27              2.12.14-5ubuntu3.4           GNU TLS library - OpenSSL wrapper
ii  openssl                          1.0.1-4ubuntu5.12            Secure Socket Layer (SSL) binary and related cryptographic tools
```

で変わっていればおｋだそうです
（参考：http://askubuntu.com/questions/444702/how-to-patch-the-heartbleed-bug-cve-2014-0160-in-openssl#comment582645_444709）
ある郵便番号が郵便番号検索APIでヒットしない

郵便番号「572-0837」のデータを
http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/zipCodeSearch?appid=(アプリケーションID)&query=572-0837
で取得しようとしたのですが、住所など取得できませんでした。
572-0836や572-0838では正常に取得でき、また他の郵便番号検索サービスでは「大阪府寝屋川市早子町」の結果が返ってきております。
使い方が悪いだけかもしれませんが、データの不具合かもしれませんので、ご報告いたします。
MacでSublimeText3を使う際にShift_JISを文字化けしないようにする


Shift_JISで書かれているcsvファイルをSublimeText3で開くと文字化けするので調べてみました。
vimやemacsを利用している人は大丈夫だと思うのですが、SublimeText3で色々なファイルを開いて見たり編集したい人が対象となる気がします。

## Shift_JISのファイルを開いてみる

Shift_JISのファイルを開くと文字が化けます。

![Shift_JISのテキスト](http://i.gyazo.com/fdec0dc9c24364754f775fba8ce23349.png)

## Package Controlを使えるようにする

色々便利なパッケージを利用できるようにするため、Package Controlをインストールします。

* ctrl + `でコンソールを開く
* https://sublime.wbond.net/installation を開き、SUBLIME TEXT3に書かれている内容をコピペしてエンターキーを押す


## ConvertToUTF8をインストールする

ConvertToUTF8を使うとUTF-8以外の文字に対応しているということなので、インストールします。

* shift + command + pを押してCommand Paletteを表示
* Command Paletteにinstallと入力するとPackage Control: Install Packageが表示されるのでエンターキーを押す
![Package Control: Install Package](http://i.gyazo.com/9f32a4e9581da3702842abfb140622a2.png)
* 次に、ConvertToUTF8を入力してエンターキーを押すとConvertToUTF8がインストールしてもOops!と言われたりします。
![ConvertToUTF8](http://i.gyazo.com/ee59b33a31db99c3a63f040897cd03d0.png)
* ConvertToUTF8がインストールされると
![ConvertToUTF8](http://gyazo.com/8d41fb14098111b41a78850bc6642dc5.png)

## Codecs33をインストールする

文字化けするので同じようなものが無いかと探すと以下の内容にたどり着きました。
[Sublime Text 3 で ConvertToUTF8 を使えるようにする](http://www.understandard.net/tool/tool016.html "Sublime Text 3 で ConvertToUTF8 を使えるようにする")
Codecs33をインストールします。

* shift + command + pを押してCommand Paletteを表示
* Command Paletteにinstallと入力するとPackage Control: Install Packageが表示されるのでエンターキーを押す
* 次に、Codecs33を入力してエンターキーを押すとCodecs33がインストールされる
![Codecs33](http://i.gyazo.com/069e989072355b48971bb1b83e72de77.png)
* インストール完了後、SublimeText3を再起動します

## Shift_JISで書かれたファイルを開いてみる

再びファイルを開いてみると、Shift_JISで記載されているファイルが文字化けせずに表示されます。

![Shift_JISのテキスト](http://i.gyazo.com/ddd841cee1602d9ce79e7bc9b4a37ac8.png)

Shift_JISとタイトルでは書いていますが、EUC-JPなども対応しています。

![ConvertToUTF8](http://i.gyazo.com/18d84a222a5db3713a5d3e37aaacbb94.png)

文字化けして困っている方が少しでも救われたら嬉しいです。


## 参考にしたURL

* [SublimeText2 で Shift-jis を使う](http://qiita.com/amay077/items/de8688595637d20102c4 "SublimeText2 で Shift-jis を使う")
* [Sublime Text 3 で ConvertToUTF8 を使えるようにする](http://www.understandard.net/tool/tool016.html "Sublime Text 3 で ConvertToUTF8 を使えるようにする")
はじめての競技プログラミング


このテキストは、ICPCラボというサークルに入ってくれた新入部員の方々に向けて競技プログラミングについてざっくり書いたものです。わかりづらい部分などはちょこちょこ修正していきます。

うちのサークルでは競技プログラミングの大会、ICPCへの出場に向けてこつこつと勉強をしています。近々飲み会とかもしたいね！

## 目次
1. 競技プログラミングの流れ
2. Javaの書き方
3. 必要とされる知識
4. 勉強方法

## 競技プログラミングの流れ
基本的には、こんな流れとなります。

1. 問題を読む
2. コードを書く
3. 提出する

なんとなくイメージをするため、簡単な例を見てみましょう。

> 以下のような表記で、九九を出力して終了するプログラムを作成して下さい。（×記号の代わりに、小文字の x を使用すること）

> ```bash
1x1=1
1x2=2
.
.
9x8=72
9x9=81
```

これに対する答えは、たとえばこのようになります。

```java
public class Main {
  public static void main(String[] args) {
    int k = 0;
    for (int i = 1; i < 10; i++) {
      for (int j = 1; j < 10; j++) {
        k = i * j;
        System.out.println(i + "x" + j + "=" + k);
      }
    }
  }
}
```

こういったコードを書いたら、手元で実行して出力を確認し、提出します。

書いたコードを実行する際、Javaではコンパイルという作業が必要になります。といっても簡単で、まずWindowsならコマンドプロンプト、Macならターミナルを開きます。

そして、たとえばHello, Worldを出力するプログラムファイルをデスクトップ上に置いているとすると以下のように実行できます。

```bash
$ cd desktop
desktop$ javac Main.java
desktop$ java Main
Hello, World
```

## Javaの書き方
Javaは初心者にとっては書くことが多いので、すべて理解できなくても焦ることはありません。困ったことがあった時に「知らんわそんなもん」と開き直れるくらいの図太さが（最初のうちは）必要です。

### 「こんにちは」を出力
```java
public class Main {
  public static void main(String[] args){
    System.out.println(“こんにちは”);
  }
}
```
「どうしてこんにちはを出力をしたいだけなのに、こんなに書かなくてはいけないの？」と考えだすとつらくなります。

`System.out.println`がテキストを出力するための呪文で、その中身として「こんにちは」を渡していると捉えればOKです。またその上下の何やらごちゃごちゃ書かれているものについては、「この決まり文句で挟んであげないと、目的の処理をしてくれないのね」という理解で十分です。先にも書きましたが、図太く考えましょう。

### 入力をオウム返し

```java
import java.util.Scanner;

public class Main {
  public static void main(String[] args){
    Scanner s = new Scanner(System.in);
    String a = s.next();
    System.out.pritnln(a);
  }
}
```
先ほどと同じ決まり文句の中に、Scannerだのなんだの出てきました。またしても決まり文句として覚えましょう。とはいっても、意味だけは理解するためにこの部分を日本語で書くきます。こんなかんじです。

```
入力をもらう
はじめの入力をaにいれる
そのaを出力する
```

日本語だと簡単ですね。さて、１行目のimportというのはなんでしょう。これはScannerというクラス（いろんな機能がごちゃごちゃ入った道具箱のようなもの）を使うために書いています。要するにこの`import java.util.Scanner`という１行は、「Scanner使わせてくれ」という意味です。

## 必要とされる知識
競技プログラミングを楽しむために、何が必要なのか。これはおそらく、大きく分けると２つです。

### 言語（Java）の知識
競技プログラミングという、ある意味特殊な目的のためにプログラミングをするので、必ずしも言語について習熟する必要はないのかもしれません。けれど、本番である特定の関数名がわからないために時間を浪費してしまうのは避けたいです。リファレンス無しである程度やりたい処理をささっと書けるようになるべきだと思います。

### アルゴリズム
アルゴリズムとは、問題に対する解法の総称で、もっと狭く捉えるとプログラミングにおけるレシピのようなものです。先に挙げた九九の計算だとfor文を２つ重ねることで九九に必要な乗算の繰り返しを実装していますが、こういう簡単なものでもアルゴリズムといえると思います。

アルゴリズムの勉強は、僕のように数学を避けて英語・現代文・日本史で大学受験したような文系野郎にはけっこう厳しいものです。しかし、競技プログラミングをやってみると、これは避けて通れません。

## 勉強方法

### ひたすら解く
これがなかなか難しいのですが、結局は問題を解くしか無いのかなあと。一時期、本を読んで理解してから問題を解こうとしたこともあったのですが、あまりうまく行きませんでした。学んだはずの事柄が、次の日にはさっぱり頭から消えているのです。

そうなるよりかは、実際に問題を解いて、分からない点を整理して、１つずつ潰していくしかないと思います。気をつけないといけないのは、わからないことがわかるようになるまでしっかり時間を費やさないと本番で使えるレベルにはならないということです。「なんとなくわかった」は全くなにもしてないのとあまり変わりません。

具体的には、[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/), [Paiza](https://paiza.jp/), [CodeIQ](https://codeiq.jp/)などで問題を解きます。今はオンラインでプログラミング問題を提供してくれているサイトがたくさんあります。これらを使っていきましょう。

### コードを読む
AOJには、他の回答者のコードを読むことができます。なので、それらを読んで「これってどういう意味？」と突き詰めていくと、かなり良い勉強になりそうです。言語の勉強として、自分が書いたコードを読み返して「そういえば`public class Main`のpublicって何なの？」と調べてみるのも楽しそうです。

### 説明する
理解したら、仲間に説明できるようになるといいですね。説明をするのは口頭でもいいし、できればブログやQiitaなどに文章として残せるのが理想です。あたりまえだけど、文章にして残しておくと後で読み返したりできるので、便利です。
Amazon Linux/CentOSのJenkinsのタイムゾーンを指定する

システムはUTC、jenkinsは日本のタイムゾーンの運用がしたかったので設定してみた。

##参照サイト
* [Change time zone - 日本語 - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JA/Change+time+zone)

##設定手順

 * /etc/sysconfig/jenkinsのJENKINS_JAVA_OPTIONSの最後に-Dorg.apache.commons.jelly.tags.fmt.timeZone=[タイムゾーン]を追加する

```bash
## Type:        string
## Default:     "-Djava.awt.headless=true"
## ServiceRestart: jenkins
#
# Options to pass to java when running Jenkins.
#
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo"
```

 * jenkinsを再起動する

```bash
$ service jenkins restart
```
Amazon Linux/CentOSのJenkinsでセッションタイムアウトを24時間にする

jenkinsにログインしてたらいつの間にかセッションがタイムアウトしていて不便だったのでタイムアウト値を24時間にしてみた。

## 参照サイト

 * [Jenkinsのセッションタイムアウトの設定 - Qiita](http://qiita.com/ayweak/items/f60b1f83387de7261066)
 * [RE: How to use --sessionTimeout? - Google グループ](https://groups.google.com/forum/#!msg/jenkinsci-users/XWRoU8uxeOc/D0_ZPZMv9hYJ)
  * 要するにjenkins.warのオプションに--sessionTimeoutが指定できたら良いっぽい

## 設定手順
 * /etc/sysconfig/jenkinsのJENKINS_ARGSの最後に--sessionTimeout=1440を追加

```bash
## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Pass arbitrary arguments to Jenkins.
# Full option list: java -jar jenkins.war --help
#
JENKINS_ARGS="--sessionTimeout=1440"
```

 * jenkins再起動

```bash
$ service jenkins restart
```

## セッションのデフォルト値
 * jenkins.warのオプション確認すると60分らしい

```bash
$ java -jar /usr/lib/jenkins/jenkins.war --help
...
   --sessionTimeout         = set the http session timeout value in minutes. Default to what webapp specifies, and then to 60 minutes
...
```
IE8+Bootstrap3で横幅いっぱいに広げる


# 結論

IE8+Bootstrap3の組み合わせで、ウィンドウ横幅いっぱいのレイアウトにしたい場合、containerクラスを使って以下のCSSを適用すればよい。

```css
/* 幅いっぱいにする設定 */
.container {
  width: auto;
}

/* 幅いっぱいにする設定(IE8対応用) */
@media (min-width: 768px) {
    width: auto;
  }
}
@media (min-width: 992px) {
  .container {
    width: auto;
  }
}
@media (min-width: 1200px) {
  .container {
    width: auto;
  }
}
```

# 経緯

[twitter bootstrap 3 で横幅をめいっぱい広げたいとき   at softelメモ](http://www.softel.co.jp/blogs/tech/archives/4610)を参考に、bootstrap.cssのあとで読み込むCSSファイル中で、

```css
.container {
  width: auto;
}
```

を追加した。IE8以外のブラウザでは期待通りの挙動になった。(上記記事には、Bootstrap 3.0.1でこの方法が利くと書いてあったが、3.0.0でうまくいった。)

しかし、IE8ではうまくいかない。responds.jsが原因。上記のCSSでは、bootstrap.cssの中のcontainerの横幅を指定している部分(↓)を上書きしているが、responds.jsがそれを元に戻してしまう。

このあたり:

```css:bootstrap.css
@media (min-width: 768px) {
  .container {
    width: 750px;
  }
}
@media (min-width: 992px) {
  .container {
    width: 970px;
  }
}
@media (min-width: 1200px) {
  .container {
    width: 1170px;
  }
}
```
responds.jsは、CSS3のMedia Queriesを解釈してJavaScriptでそれをMedia Queries非対応ブラウザ(IE8など)に適用するが、CSSのカスケードするしくみを完璧にカバーしているわけではなかった。ただ、`@media`を使った形式で記述しておけばオーバーライドに成功した。

```css
/* 幅いっぱいにする設定(IE8対応用) */
@media (min-width: 768px) {
    width: auto;
  }
}
@media (min-width: 992px) {
  .container {
    width: auto;
  }
}
@media (min-width: 1200px) {
  .container {
    width: auto;
  }
}
```

以上
Excel: ショートカットで値として貼り付ける

#対象
メインエディタはExcelの皆様。
Excelの2007以上をご使用の皆様。

#方法
クイックアクセスツールバーのプルダウンメニューから、「その他のコマンド」をクリック。
![valpast0.png](https://qiita-image-store.s3.amazonaws.com/0/42724/6db93cac-83b9-6a90-4a5a-e8b6232867eb.png)

プルダウンメニューから「全てのコマンド」を選択。
「値の貼り付け」を選択。
「追加」ボタンをクリック。
「OK」ボタンをクリック。

![valpast1.png](https://qiita-image-store.s3.amazonaws.com/0/42724/993167bb-2156-2fd4-5e44-c6988d55645c.png)

#結果
クイックアクセスツールバーにボタンが追加され、Altキーを押しながら数字キーを押すことで値として貼り付けることができるようになる。

![valpast2.png](https://qiita-image-store.s3.amazonaws.com/0/42724/eb80d134-b54e-8a27-5e59-2da143a52e5c.png)
[Java][Objective-C] JavaとObjective-Cを対応させながら覚える

Objctive-CにもJavaにも大学のやる気のない授業程度でしか触れてこなかった私が、iOSアプリとAndroidアプリを同時に携わることになりました。

それぞれ一つ一つ覚えようとしたらわからなくなったので、両方の言語を対応させながら基本を抑えようかと思います。

自分でこうかなって思っただけなので、間違っているのも多いかと思います！
間違いっていたらご指摘ください！！m(__)m！！

http://web-terminal.blogspot.jp/2013/05/javaobjective-ciphoneandroid.html

# Comment

同じっす。
//や/* hoge */です。

#import

```objc
#import <UIKit/UIKit.h>
#import "Hoge.h"
```

```java
import java.lang.string;
```

# 参照

```objc
NSObject *object
```

```java
Object object
```

# id型

ポインタみたいな感じ。

```objc
NSObject *object1 = [[NSObject alloc] init];
id object2 = object1;
```


```java
String object1 = new String("Hoge");
Object object2 = object1;
```

# Class

## 宣言

```objc:Hoge.h
@interface Hoge : NSObject{
//メンバ変数宣言
  int index;
  NSString *str;
}
//メソッド宣言
-(void) setData : (NSString*)str str: (NSSrting*)number;
@end
```

@interface {クラス名} : {親クラス名} って感じです。
この.hファイルでは実装は書きません。.mの方に書きます。

またメソッド宣言は、
-(戻り値の型)メソッド名 : (引数の型)引数名 ラベル : (引数の型)引数名

```objc:examplesOfDeclarationOfVariables
-(void)hoge : (NSString*)str isSave : (BOOL)isSave;
-(void)hoge : (NSString*)str num : (NSInteger)number;
```

## 実装

```objc:Hoge.m
#import "Hoge.h"
@implementation Hoge
  //implementation
}
@end
```

```java
public class Hoge {
  //implementation
}
```

# Class Method

```objc
+(void)hoge : (NSString)str isSave : (BOOL)isSave;
```

```java
public static void hoge(String str, Boolean isSave) {}
```

#Instance Method

```objc
-(void)hoge : (NSString*)str isSave : (BOOL)isSave;
```

#メッセージ式


#プロパティ

getter/setterを隠蔽してくれる感じの仕組み。

```objc
@interface Hoge : NSObject {
  NSInteger index;
}
@property(assign, nonatomic) NSInteger index;
@end
```

```java
public void setIndex(int index) {
  this.index = index;
}
public in getIndex() {
  return this.index;
}
```

# 文字列リテラル

```objc
NSString* str = @"hoge";
id str2 = @"fuga";
```

```java
String str = "hoge";
Object str2 = "fuga"
```

# Log

```objc
NSLog(@"m9(^Д^)ﾌﾟｷﾞｬｰ");
```

```java
// System.out.println("m9(^Д^)ﾌﾟｷﾞｬｰ");
Log.d("TAG", "m9(^Д^)ﾌﾟｷﾞｬｰ");
```


# サンプル

```objc
#import <FinalFantasy/FinalFantasy.h> 

[FFManager setAPIEndpoint:@"http://localhost:hoge/"];
[FFManager setAPISecret:@"hoge"];
```

```java
import FinalFantasy.FinalFantasy.h

FFManager.setAPIEndpoinjt("http://localhost:hoge/");
FFManager.setAPISecret("hoge");
```


# 連想配列へ値を追加する

```objc
FFEntity *entity = [FFEntity entityWithName:@"user"];
[entity setObject:@"Denis" forKey:@"name"];
[entity setObject:@"Berton" forKey:@"surname"];
[entity setObject:[NSNumber numberWithInteger:10] forKey:@"credits"];
[entity save];
```

```java
FFEntity entity = new FFEntity("user");
entity.put("name", "Denis");
entity.put("surname", "Berton");
entity.put("credits", Integer.valueOf(10));
entity.save;
```

# ref

http://visible-true.blogspot.jp/2011/06/javaobjective-c.html#1
http://web-terminal.blogspot.jp/2013/05/javaobjective-ciphoneandroid.html
exeを署名してみた。

[ナレッジベース - コードサイニング証明書 サポート](https://knowledge.verisign.co.jp/support/code-signing-support/index?vproductcat=V_C_C&vdomain=VERISIGN.JP&page=content&id=SO23062&actp=LIST&viewlocale=ja_JP&locale=ja_JP&redirected=true)

# わかったこと

* exeを署名することは、「このexeは自分が作りました」ということ。
  信頼できる機関から`有効期限`付きの証明書を発行してもらい、exeにくっつける。
  exeのプロパティで確認できます。

* 有効期限が切れていてもexeの実行できます。(PCの年月日を変更して確認した。)

* exeを実行するとき、未署名のときより実行開始されるまで時間がかかります。
  (証明書の確認のため?)

# 署名の準備

コードサイニング証明書は手続きを完了すると、

1. IEの個人証明書欄に登録される
1. 証明書を秘密鍵とともにエクスポート(この時のパスワードは後で使うのでひかえておく)
1. エクスポートは拡張子PFXのものになる。このままだとsigntool.exeで使えないので、
  * [Win32 OpenSSL v1.0.1g Light](http://slproweb.com/products/Win32OpenSSL.html)をインストールし`openssl.exe`を取得。
  * [pvktool](http://www.drh-consultancy.demon.co.uk/pvk.html)から`pvk.exe`を取得。

## 秘密鍵を取り出す(PFX->pem->pvk)

```bash:PFX->pem
openssl.exe pkcs12 -in cert.pfx -nocerts -nodes -out cert.pem
# 証明書エクスポート時のパスワード入力
```

```bash:pem->pvk
pvk.exe -in cert.pem -topvk -out cert.pvk
# pvkのパスワードを任意に設定。
```

## サーバ証明書を取り出す(PFX->pem->spc)

```bash:PFX->pem
openssl pkcs12 -in cert.pfx -nokeys -out cert.pem
```

```bash:pem->spc
openssl crl2pkcs7 -nocrl -certfile cert.pem -outform DER -out cert.spc
```


# 署名ツールをインストール

[Microsoft Windows SDK for Windows 7 and .NET Framework 4](http://www.microsoft.com/en-us/download/details.aspx?id=8279)をインストールして`signtool.exe`を使えるようにする。

[Download Platform SDK Redistributable : CAPICOM from Official Microsoft Download Center](http://www.microsoft.com/ja-jp/download/details.aspx?id=25281)も必要かも。

signtool.exeを実行して`capicom.dll`が無いと言われたら、以下コマンドでレジストリに登録

```:
regsvr32 "C:\Program Files\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86\capicom.dll"
```


# 署名実施

```bash:cabに署名
signtool.exe sign /f cert.pfx /p "pfxのパスワード" hoge.cab
```

```bash:exeに署名
signtool.exe sign /f cert.pfx /p "pfxのパスワード" hoge.exe
```
コマンドラインツールstreeを使う


> はてなにメモってた過去記事を再掲シリーズ（ちょっと古いかもしれない）

## 問題
新MacにしてSourceTreeのGUIから新規リポジトリを読み込もうと思ったら反映されなかった。

## 解決策
SourceTreeにはstreeというコマンドラインツールがあるらしいことを知ってこちらを使うことに。

メニューの
***SourceTree > コマンドラインツールをインストール***
でインストール。

で、反映させたいディレクトリに移動して

`$ stree .`

してみたらちゃんとSourceTreeの新規読み込みダイアログが開いて反映されました。
apex:inputHiddenの落とし穴

![2014-05-16_125036.png](https://qiita-image-store.s3.amazonaws.com/0/8407/09b29078-4363-f16a-b079-dde941dd7eed.png)

apex:inputHiddenでちょっとハマったのでメモ。

Visualforce開発でapex:inputHiddenを使うときにvalue="{!account.Id}"のように指定するとaccount.Idの値がNULLだったときに空白値がセットされるようになっています。

空白値がセットされた状態でUPSERTの処理を行うと「INVALID_ID_FIELD, 取引先 ID: 不正な種別の ID 値: : [Id]」のようなエラーが発生してしまうので注意が必要です。

なので、apex:inputHiddenでID値を表示させたい場合はsObject型を直接指定するのではなく一度String型の変数などにセットしてそちらを表示するようにした方が良さそうです。

```apex:Apex_InputHidden.page
<apex:page controller="Apex_InputHiddenController" tabStyle="Account">
  <apex:form id="form">
    <apex:pageBlock >
      <apex:pageBlockButtons location="top">
        <apex:commandButton value="CLICK" action="{!isAccountId}" reRender="form" />
      </apex:pageBlockButtons>
      <apex:pageBlockSection columns="1">
        <apex:pageBlockSectionItem >
          <apex:outputText value="Account ID = " />
          <apex:outputText value="{!msg}" />
        </apex:pageBlockSectionItem>
      </apex:pageBlockSection>
      <apex:inputHidden value="{!account.Id}" />
    </apex:pageBlock>
  </apex:form>
</apex:page>
```

```apex:Apex_InputHiddenController.cls
public with sharing class Apex_InputHiddenController {

  public Account account {get; set;}
  public String msg {get; set;}

  public Apex_InputHiddenController () {
    this.account = new Account();
    this.msg = '';
  }
    
  public void isAccountId() {
        
    if (this.account.Id == null) {
      this.msg = 'NULL';
    } else {
      this.msg = 'NOT NULL';
    }
  }
}
```
Jenkinsサーバを移行する際のjob移行


> はてなにメモってた過去記事を再掲シリーズ（ちょっと古いかもしれない）

***jobをコピーすればいいだけらしい。***
簡単！

JENKINS_HOMEの下のjobsディレクトリをまるっとコピー（もちろん権限も引き継いで）して再起動すればおｋ。

## 参考

* [Export/import jobs in Jenkins - Stack Overflow](http://stackoverflow.com/questions/8424228/export-import-jobs-in-jenkins)
* [Administering Jenkins - Jenkins - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/Administering+Jenkins#AdministeringJenkins-Moving/copying/renamingjobs)
Rubyで処理の時間計測方法

ループ処理やクエリ実行した際に計測する方法。

```
start_time = Time.now

#処理

p "処理概要 #{Time.now - start_time}s"
```

##追記
コメントより`Benckmark`というRubyの標準ライブラリがあるとのご指摘を頂いたので記述しておきます。

```
require 'benchmark'

result = Benchmark.realtime do
  # 処理
end
puts "処理概要 #{result}s"
```

`require 'benchmark'`でbenckmarkライブラリが使えるようになる。
さくらインターネットのレンタルサーバーのシェルをcshからzshに変更する

さくらインターネットのレンタルサーバー（スタンダードプラン）のログインシェルのデフォルトはcsh（C Shell）なので、zsh（Z shell）に変更した備忘録。
※シェルの種類に関しては → [シェル関係の覚書](http://qiita.com/kwkm10/items/fc9ec9f8387686d65ae3)

##1）ログインシェルの変更

デフォルトのシェル環境を確認。
 `/bin/csh` と出力され、cshを使用中なのが分かる。 

```sh
$ echo $SHELL
/bin/csh
```

使用可能（インストール済み）なシェルの一覧を確認。
 `/usr/local/bin/zsh` とあるので、さくらレンタルサーバーではzshがインストール済み。

```sh
$ cat /etc/shells
# $FreeBSD: release/9.1.0/etc/shells 59717 2000-04-27 21:58:46Z ache $
#
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/sh
/bin/csh
/bin/tcsh
/usr/local/bin/bash
/usr/local/bin/rbash
/usr/local/bin/zsh
/usr/local/bin/rzsh
/usr/bin/passwd
```

ログインシェルをzshに切り替える。

```sh
$ chsh -s /usr/local/bin/zsh
```

パスワードを求められるので、自分のサーバパスワードを入力。

```sh
Password:
```

更新メッセージが出力されれば完了。

```
chsh: user information updated
```

##2）.zshrcの作成

 `exit` コマンドでログアウトし、再度さくらのレンタルサーバーにログイン。
シェルを変更して初めてのログインなので、下記のメッセージが表示される。
zshの設定ファイル `.zshrc` を作成したいので、メッセージに従い `0` キーを実行。

```
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---
```

以下のコマンドで、 `.zshrc` ファイルが作成されているのを確認。

```sh
$ ls -al
```

##3）.zshrcの設定

vimでzshの設定ファイル `.zshrc` を開く。（vimをインストールしていない場合は ` vi` ）

```sh
$ vim ~/.zshrc
```

 `i` キーで挿入モードにして、以下を追加。（Macなら普通に `Command + c` 、Windowsなら `Shift + Insert` 、もしくは `マウスの右クリック` でペースト）
※下記は最低限の設定。

```sh:.zshrc
# 日本語が文字化けしないよう文字コードを指定
export LANG=ja_JP.UTF-8

# zshにメールチェックをさせない
export MAILCHECK=0
```

 `esc` → `:` → `w` → `q` キーで保存。以下のコマンドで実行。

```sh
$ source ~/.zshrc
```

再度シェル環境を確認。
 `/usr/local/bin/zsh` と出力されればログインシェルがzshに変更されている。 

```sh
$ echo $SHELL
/usr/local/bin/zsh
```

##補足
※上記の `export MAILCHECK=0` の設定で、zshを実行するたびに下記メッセージが表示されるのを防ぐ事ができる。

```
zsh: permission denied: /var/mail/example
```

参考：[さくらの共有サーバーでシェルを zsh に変更してから、zsh: permission denied: /var/mail/youraccount と怒られないようにする](http://d.hatena.ne.jp/littlebuddha/20090216/1234785251)
MacPortsのアンインストール＆Homebrewのインストール


> はてなにメモってた過去記事を再掲シリーズ（ちょっと古いかもしれない）

## 問題

ある時から
`$ sudo port selfupdate`
すると

```
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.0.3 installed,
MacPorts base version 2.1.3 downloaded.
--->  Updating the ports tree
--->  MacPorts base is outdated, installing new version 2.1.3
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl

Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: shell command failed (see log for details)
```

て言われるように。

## まずはMacPortsのアンインストール

`$ sudo port -fp uninstall --follow-dependents installed`

```
%% sudo rm -rf \
    /opt/local \
    /Applications/DarwinPorts \
    /Applications/MacPorts \
    /Library/LaunchDaemons/org.macports.* \
    /Library/Receipts/DarwinPorts*.pkg \
    /Library/Receipts/MacPorts*.pkg \
    /Library/StartupItems/DarwinPortsStartup \
    /Library/Tcl/darwinports1.0 \
    /Library/Tcl/macports1.0 \
    ~/.macports
```

## 環境変数から/opt/local系を削除

`$ emacs ~/.bash_profile`


## 次にHomebrewのインストール

`$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"`

## 試しに何かインストール

`$ brew install git`