OmniAICreator/Qiita-1.07M huggingface dataset:
ディスクの容量をチェックするスクリプト


*df* (1) の結果を *awk* (1) でチェックして必要であればメイル送信するだけの単純なスクリプトです。

このスクリプトを *cron* (8) に登録する事で定期的にディスクの容量チェックが可能です。
「ログやゴミなどでディスクが一杯になってサービスが停止した」という事故は意外と多発しているので、その様な問題を未然に防ぐために簡単に作って実行できるスクリプトは非常に重宝します。
このスクリプトではパスフレーズ無しのホストキー認証を設定した状態で *ssh* (1)を使用してリモートホストにアクセスしています。

Linux で動作する GNU df の挙動がオリジナルとは異なっていたので、 *df* (1) のオプション指定は POSIX の範疇から逸脱しています **（残念）**

```sh
#!/bin/sh

# ログファイル
logfile="/var/log/${0##*/}.log"
# 警告メイルの送信元アドレス
from=admin@example.com
# 警告メイルの送信先アドレス
to=mitz@example.com
# 一時ファイル
tmpfile=${TMP:-/tmp}/${0##*/}.$$
# ssh コマンド（ポートを変更してホストキー認証としてあります)
ssh="/usr/bin/ssh -p 10022"
# logger(1) 
logger="/usr/bin/logger"
# df(1)
df="LANG=C df -hlP -t ext3 -t ext4"

# 監視対象となるホスト名
remote="host1 host2 host3 …"
# 監視対象となるドメイン名
domain="example.com"

# for debug
exec > /tmp/rdf.log 2>&1
date
set -x

#
# メイル送信
#
warning()
{

	LANG=C
	subject="##### [ ${1}: Disk Usage ] #####"
	${logger} "${subject}"

	# sendmail に -t を指定する事で宛先などをメイル本文から取得する
	cat << EOF | /usr/sbin/sendmail -t -i
From:		${from}
To:			${to}
Subject:	${subject}

${1} disk usage warning!

`date`

`cat ${2}`
EOF

}

trap 'rm -r ${tmpfile}; exit' 0 1 2 3 9 13 15

# メイン処理
for i in ${remote}
do
	# df の結果を標準出力と ${tmpfile} に同時に出力
	${ssh} ${i}.${domain} ${df} | tee ${tmpfile} |
		awk '{
			# 2行目以降について処理する (dfの出力の1行目はヘッダ情報なのでスキップ)
			if(NR > 1)
				# 後ろから2番目のフィールドがディスクの使用量 (%) なので閾値との比較結果を取得
				ret += $(NF-1) > '${1:-80}';
        }
        END {
		# 結果通知
		exit ret
        }' || warning ${i} ${tmpfile}
done
```
Rails4.2にあげたらrails-erdが動かなくなった


----------------------------

__※追記__
__4.2に対応した`rails-erd`が出たようです。__

----------------------------



以下のようなエラーメッセージが出て止まってしまうようになった。

```bash:erd
$ bundle exec erd
Loading application in 'myapp'...
Generating entity-relationship diagram for 13 models...
Failed: NoMethodError: undefined method `primary' for #<ActiveRecord::ConnectionAdapters::Column:0x00000007b842f8>
```

4.2になると動かなくなるようだ。
https://github.com/voormedia/rails-erd/issues/85


対応版があるみたいだけれど、現時点ではマージされていないようだったので、
以下のようにして対応版をインストールするようにした。

```ruby:Gemfile
group :development, :test do
  ...
  gem 'rails-erd', github: 'ready4god2513/rails-erd', branch: 'rails-4.2-support-fix'
end
```
プログラマになること#4


###記述する動機
私、とある専門学校でPGを教えています。はや８年。
いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、公開していきたいと思います。全て実例です。個人名は秘密！！

###出会い
私、10数年前、フリーのエンジニアとして、多忙な日々を送っていました。
あるプロジェクトでリーダーとして、２期目のメンバー選定してる時に
お世話になってる人から、「よろしくね。」と１名。

###環境
クライアントはWin2000の頃。サーバーも2000サーバーだったと思う。
Oracle8i+画面はVB6+処理のほとんどをPROCEDURE
当時としては、良くある環境です。

###彼が恥ずかしいと思っていたこと
プログラムの能力は高いのだが、ビジネスに関わる部分の語彙があまりにも弱い。うーん何故かなぁ？
ある日喫煙所で、「私、実は中卒なんです。」「中学の頃から族やってました。知らないことばかりで迷惑かけてます。」
「うん。皆色々あるよ。でも、ほっておいちゃいけないね。」
「歴史と科学を知りましょう。Unix、cを学びましょう。英語の辞書も買いましょう。」
「俺、中卒のバカやけん。」
「違う。君はバカでは無い。ちょっとだけ環境が良くなかっただけです。学びましょう。世間に負けたらいかんやろ？君には素晴らしいポテンシャルがあるんです。」

###彼がやったこと
Linux環境構築、ｃの勉強英語の勉強はとにかく辞書。
そして読書。私が読み終えた色んな本を差し上げました。

###結果
誰もが認めるサブリーダーとなり、３期のリーダーになりました。
その後、東京のJava案件にいったらしい。きっと元気でやってるだろう。
アプリが新規にインストールされたら、IntentServiceを呼んでログを吐く


前回[ServiceをAIDLを使って弄ぶ練習](http://qiita.com/neiraza/items/e8c9982a7cd9556e78df)、前々回（[端末に新規アプリがインストールされたらログを吐く](http://qiita.com/neiraza/items/1f3a44830bfdd2363c91)）に引き続き、 __IntentService__ の利用方法とか、ほとんど覚えていないので、メモを残す。

## 概要

前回、Serviceを使ってみたけど常駐する必要はなかったので、[IntentService](http://developer.android.com/training/run-background-service/create-service.html)を実装すれば充分かなという自己完結。
こいつはキューがなくなったら自分でdestroyするみたいで、明示的にServiceをstopする必要もなく、楽ちんだし便利ぽい。work queue processorパターンとかいうみたい。

アプリが新規にインストールを検知したら、IntentServiceを起動してオシマイって流れが、シンプルかなと思う。
ここでは単純にログを吐いているだけだが、何か裏側で重い処理をしようってんなら、この作りでいいんじゃまいか。

## 実装

[GitHubにサンプルソースを置きました](https://github.com/neiraza/ServiceSampleA)

だいたい下記ファイルを眺めればわかるかと。

* [ShoutIntentService.java](https://github.com/neiraza/ServiceSampleA/blob/master/app/src/main/java/ri/togu/sample/servicesamplea/services/ShoutIntentService.java)
* [AppInstalledObserveReceiver.java](https://github.com/neiraza/ServiceSampleA/blob/master/app/src/main/java/ri/togu/sample/servicesamplea/receivers/AppInstalledObserveReceiver.java)
* [AndroidManifest.xml](https://github.com/neiraza/ServiceSampleA/blob/master/app/src/main/AndroidManifest.xml)

AndroidStudioでIntentServiceを生成したら、
勝手にヘルパーメソッドを作成してくれて、サンプルを作る分には楽だった。

レシーバはアプリと同じプロセスにし、サービスは別プロセスにした。

```XML:AndroidManifest.xml
<service
    android:name=".services.ShoutIntentService"
    android:enabled="true"
    android:exported="false"
    android:process=":shout" />

<receiver
    android:name=".receivers.AppInstalledObserveReceiver"
    android:enabled="true"
    android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />

        <data android:scheme="package" />
    </intent-filter>
</receiver>
```
git diff の青色が見づらいとき

背景が黒のターミナルなどを使っていると`git diff`したときの青色の文字(ファイル名とかの部分)が見づらいことがあります。

そんなときは`git diff`の色の設定を変更してあげます。

```gitconfig
[color "diff"]
  meta = cyan
```
上記を.gitconfigに追記すれば、ファイル名などの部分が青からシアンに変わります。
水色っぽくなって見やすくなります。
httpclientのインターフェースが4.3から大きく変わったみたいですよ

API呼び出しなどでおなじみのhttpclientさん。
最近コイツを使う機会があったのだが、
どうやら4.3系からインターフェースが大きく変わったらしい。
なんかカッコよく書けるって噂だったので調べて実装してみたの巻。

準備
---
ビルドツールとしてmavenを使っているので以下のように`pom.xml`に書いてやる。

```xml
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.3.6</version>
</dependency>
```
今回はバージョン`4.3.6`を使用。
依存関係で `httpcore4.3.3`, `commons-logging1.1.3`, `commons-codec1.6` がついてきます。いらっしゃい。

早速実装してみる
---
*  接続設定を書いてみる

``` java
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
			connectionManager.setMaxTotal((int) maxTotal);
			connectionManager.setDefaultMaxPerRoute((int) defaultMaxPerRoute);
```

* リクエスト設定を書いてみる

```java
RequestConfig requestConfig = RequestConfig.custom()
		.setConnectTimeout((int) connectionTimeout)
		.setSocketTimeout((int) socketTimeout)
		.build();
```

* ヘッダーを準備する

```java
List<Header> headers = new ArrayList<Header>();
headers.add(new BasicHeader("X-API-Token", "hogehogefugafuga"));
```

* リトライ設定をしてみる

```java
HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(
		(int) retryCount(),
		(boolean) requestSentRetryEnabled());
```

* さぁ、クライアントを生成しよう

```java
HttpClient httpClient = HttpClientBuilder.create()
		.setConnectionManager(connectionManager)
		.setDefaultRequestConfig(requestConfig)
		.setDefaultHeaders(headers)
		.setRetryHandler(retryHandler)
		.build();
```

* リクエストを実行だー

```java
URI uri = new URIBuilder()
		.setScheme(scheme)
		.setHost(domain)
		.setPath(path)
		.addParameter("hoge", "fuga")
		.build();
httpClient .execute(new HttpGet(uri));
```

いろいろメモ
---
#####使ったら閉じよう！
* `HttpClientUtils.closeQuietly(httpClient)` でクライアントを閉じてあげませう。
内部で`IOException`をキャッチしてくれているのでnull判定を自分で書く必要がなくなったね！

#####4.2系以下のバージョンとの競合しないの？
* mavenの場合依存階層の高いやつがインストールされるみたいなんだけど、4.3系でも以前のソースは残ってるので(当たり前)4.2系以下のコードも今までどおり動く。
但し、大体のソースが`@Deprecated`だったりするのでIDEでwarning出ちゃったりして残念な気持ちになるのでいずれはみんなキレイにしてあげたいですね。
SublimeTextでGistを操作する

はじめに
--------

SublimeTextの拡張パッケージである`sublime-github`を使うと、SublimeTextで
Gistを操作することができます。

ここでは、sublime-githubコマンドの名前と概要の説明をします。

インストール方法や初期設定の方法は公式のドキュメントなどを参照して下さい。


sublime-githubコマンドの使い方
------------------------------

コマンドパレットを開き`github:`まで入力すると、sublime-githubコマンドの
一覧が表示されますので、その中から目的のコマンドを選択して下さい

コマンドの種類
---------------

* Switch Account: アカウントの切り替え
* Private Gist from Selection: 選択中、またはすべてのコードをプライベートGistとして保存
* Public Gist from Selection: 選択中、またはすべてのコードをパブリックGistとして保存
* Copy Gist to Clipboard: Gistに登録されているコードを選択して、クリップボードに登録
* Copy Starred Gist to Clipboard: スターを付けたGistのコードを選択して、クリプボードに登録
* Open Gist in Editor: Gistに登録されているコードを選択して、SublimeTextで開く
* Open Starred Gist in Editor: スターを付けたGistのコードをSublimeTextで開く
* Open Gist in Browswer: Gistに登録されているコードを選択して、ブラウザで開く
* Open Starred Gist in Browswer: スターを付けたGistのコードをブラウザで開く
* Update Gist: Open Gist in Editorで開いたGistのコードを更新
プロジェクトを作らずにClojureライブラリをREPLで試す


ライブラリをREPLにロードして動作を確かめたい、という時に、`lein new`でプロジェクトを作ってから、`project.clj`を編集するという手順を踏むことなく、いきなりREPLを起動する方法です。

### lein-tryをLeiningenに登録
`~/.lein/profiles.clj`の:pluginsに`[lein-try "0.4.3"]`を追加します。

````clojure
{:user {:plugins [[lein-try "0.4.3"]]}}
````

### REPLを起動
project.cljの存在しないディレクトリでも、`lein try com.taonsso/timbre "3.3.1"`のようにライブラリを指定することで、Replにロードされます。バージョン名を省略すれば、最新版を取得してきます。

````
$lein try com.taoensso/timbre
Retrieving com/taoensso/timbre/3.3.1-1cd4b70/timbre-3.3.1-1cd4b70.pom from clojars
Retrieving com/taoensso/encore/1.8.1/encore-1.8.1.pom from clojars
Retrieving io/aviso/pretty/0.1.12/pretty-0.1.12.pom from clojars
Retrieving com/taoensso/timbre/3.3.1-1cd4b70/timbre-3.3.1-1cd4b70.jar from clojars
Retrieving com/taoensso/encore/1.8.1/encore-1.8.1.jar from clojars
Retrieving io/aviso/pretty/0.1.12/pretty-0.1.12.jar from clojars
nREPL server started on port 64783 on host 127.0.0.1 - nrepl://127.0.0.1:64783
REPL-y 0.3.5, nREPL 0.2.6
Clojure 1.6.0
Java HotSpot(TM) 64-Bit Server VM 1.6.0_65-b14-466.1-11M4716
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=> (ns my-app (:require [taoensso.timbre :as timbre]))
nil
my-app=> (timbre/refer-timbre)
nil
my-app=> (info "test")
2014-Dec-24 21:56:32 -0800 mba.local INFO [my-app] - test
nil
````
Middleman(middleman-blog)で続きがないときに「続きを読む(READMORE)」を表示しない


Middlemanで要約に全文表示したい時って、文の最後にREADMOREを書くのが良いのですが、こうすると今度は「続きを読む」ボタンが常に表示されて鬱陶しいですね。

```
- blog.articles[0...3].each do |article|
  = article.summary
  - unless article.summary == article.body
    = link_to "続きを読む", article
```

こんな風に、article.summaryとarticle.bodyを比較してあげると、本当に要約されているのかどうか判断ができるので、必要なときだけ「続きを読む」ボタンを表示できます。

http://4th-cluster.com で実際に使っている様子が見れるので参考まで。

しかしMiddlemanってどれぐらいの人が使ってるんだろうね...
firefoxOSのアプリ開発を始めるまで


firefoxOSとはなにかは[ここ](https://www.mozilla.org/ja/firefox/os/) を見てください。

アプリ開発自体はfirefoxさえあれば始められます！

firefoxがないという方は

https://www.mozilla.org/ja/firefox/developer/

以上からダウンロードすると開発者向けのfirefoxが入手出来ます。

**実際のアプリ開発の始め方は[youtube](http://youtu.be/nAi9P20nSIk)にあげときました。**

デフォだと画質がガスガスなので、HDにして視ていただければ。
色々と書くより、動画を見たほうが早いので。

動画を見ていただければ1分くらいで開発が始められることはわかるはずです！

始め方以外の情報が知りたい方は[公式のクイックスタート](https://developer.mozilla.org/ja/Apps/Quickstart)とかを見たらいいと思います。

いつの間にか[日本語のドキュメント](https://developer.mozilla.org/ja/Apps)が充実しているし、 [auからFx0](http://au-fx.kddi.com/products/)も発売されるので、来年はFireFoxOSがもうちょっと話題になるのではないかと思います。
AVAudioEngineを使ってみる

iOS8からAVAudioEngineの登場により、CoreAudioがもっと使いやすくなりました。
今回はSwiftとPlaygroundを用いて音で遊んでみたいと思います。

最初に使用するクラスについて軽く説明です。

- AVAudioEngine
AVAudioNodeを管理するクラス
AVAudioEngineに対してAVAudioNodeをattachすることで入力にエフェクトなどをかけることができます。

- AVAudioNode
音の生成、処理、入出力のための抽象クラス
エフェクトなどはAVAudioUnitEffectクラスを使用しますが、これらもAVAudioNodeのサブクラスです。

基本的には上記の２つクラスが元となっているようです。

では、簡単にマイク入力にエフェクトをかけてみましょう。

まず適当なPlaygroundを作成します。
>このときPlatformは`Mac OS`にしてください。
>iOSにしてしまうと入力nodeの生成ができません。

ではとりあえず下のコードを一気に貼り付けてしまってください。
これでマイク入力にdelayとreverbがかかります。

```swift
import AVFoundation
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)

var engine = AVAudioEngine()

//effectNodeの用意
var delay = AVAudioUnitDelay()
var reverb = AVAudioUnitReverb()

var input = engine.inputNode
var output = engine.outputNode
var format = input.inputFormatForBus(0)
var error:NSError?

//delayの設定
delay.delayTime = 1.5
delay.feedback = 20

//reverbの設定
reverb.loadFactoryPreset(.LargeRoom2)
reverb.wetDryMix = 80

//engineにdelayとreverbを追加
engine.attachNode(delay)
engine.attachNode(reverb)

//effectをつなぐ順番を指定　入力 -> delay -> reverb -> 出力
engine.connect(input, to: delay, format: format)
engine.connect(delay, to: reverb, format: format)
engine.connect(reverb, to: output, format: format)

// engineを実行
engine.startAndReturnError(&error)
```

比較的簡単そうに見えますよね。
特にエフェクトを繋いでいく部分はギターのエフェクターを繋いでいくような感覚ですね。

マイクの入力はAVAudioEngine生成時に確保してくれるようです。


次は任意のオーディオファイルを再生してみます。
これもPlaygroundでやりたかったのですが、Playgroundでファイルの読み込みがうまくできなかったのでCocoaAppliationで実装します。

CocoaApplicationテンプレートからプロジェクトを作ります。


```swift
import Cocoa
import AVFoundation

class ViewController: NSViewController {

	var engine = AVAudioEngine()
	//playerNodeの準備
	var player = AVAudioPlayerNode()
	//revebNodeの準備
	var reverb = AVAudioUnitReverb()

	override func viewDidLoad() {
		super.viewDidLoad()
		self.playAudio()
	}

	func playAudio() {
		var fileUrl = NSURL(fileURLWithPath: "/Users/Muukii/Desktop/sample.m4a")
		// オーディオファイルの読み込み
		var audioFile = AVAudioFile(forReading: fileUrl!, error: nil)

		if let file = audioFile {
			// reverbの設定
			reverb.loadFactoryPreset(.LargeHall2)

			// AudioEngineにnodeを設定
			engine.attachNode(player)
			engine.attachNode(reverb)

			engine.connect(player, to: reverb, format: file.processingFormat)
			engine.connect(reverb, to: engine.outputNode, format: file.processingFormat)

			engine.startAndReturnError(nil)

			// playerにオーディオファイルを設定
			self.player.scheduleFile(file, atTime: nil, completionHandler: { () -> Void in
				// 再生が終了すると呼ばれる
				println("Completion")
				})

				// 再生開始
				self.player.play()
			}
		}
	}
```

これで実行すると指定したファイルが再生されます。
ファイルフォーマットはwav,mp3,aacあたりなら大体再生できそうです。

***
簡単なサンプルはこれで以上となります。

今回エフェクトはDelayとReverbを使用しましたが、他には
- AVAudioUnitDistortion
- AVAudioUnitEQ

など用意されています。全部で４種類なのでまだちょっと少ないですね。
AVAudioUnitEffectのサブクラスを作ることで独自のエフェクトは作れそうですが、
結局のところ内部ではCoreAudioが使用されているようで、
エフェクト処理はC,C++で書く必要がありそうです。

ただ、今までは音にエフェクトをかけるにはCoreAudioを直接使う必要がありましたが、
AVAudioEngineの登場によりObjective-C,Swiftで簡単に記述できるようになったのは素晴らしいと思います。
今後のAPI追加にも期待したいと思います。
ScalaのString#split


Scalaというか、JavaのString#splitが今までのやってきた他の言語と違うということに気がついたので投稿。


```scala:Scala
println(":".split(":").size) // 0
```

ゼロ！？


```js:JavaScript
":".split(":").length // 2
```

```go:Go
println(len(strings.Split(":", ":"))) // 2
```


```python:Python
print len(":".split(":")) # 2
```

```php:PHP
echo count(explode(":", ":")); // 2
```

2だよね！



```ruby:Ruby
puts ":".split(":").length # 0
```

よく調べたらRubyも同じ！！
React.jsについてのリソース、そして締め

メリークリスマス！
いよいよ最終日です！

ここまでReact.jsについて紹介してきましたが少しでも参考になって使ってみようと思ってもらえると幸いです。

React.jsはfacebook、instagramやGitHubのAtomEditorもちろん、↓を見てもらえればわかる通り「AirBnB」、「Atlassian」、「Netflix」、「Reddit」、「The New York Times」、「Yahoo」など多くのところで使われているようです。

https://github.com/facebook/react/wiki/Sites-Using-React

また、来年の1月後半にはReact.js Confがあるので色々な知見が出てますます盛り上がっていくと思うので来年も楽しみです！

http://conf.reactjs.com/

React.jsについての情報は、[公式のブログ](http://facebook.github.io/react/blog/)でも色々紹介されますし、[#reactjs](https://twitter.com/hashtag/reactjs?f=realtime&src=hash)のハッシュタグ追ってると色々情報集めることが出来ます。

このAdvent Calendar読んで興味を持ったら是非↓のリンクなども参考にしてみてください！
個人的にReact.jsを使うことでアプリケーションをシンプルに考えることが出来る点が気に入っています。

## リソースまとめ

個人的に読んで面白かったものや公式のものを集めてみました。

### 公式

* 公式
  * http://facebook.github.io/react/
* Flux
  * http://facebook.github.io/flux/
* Complementary Tools
  * React.jsに関するToolなどがまとまっているので開発する前には目を通しておきたいリンク集です
  * https://github.com/facebook/react/wiki/Complementary-Tools
* Immutable.js
  * http://facebook.github.io/immutable-js/
* Jest
  * http://facebook.github.io/jest/  

### Component、サンプル集

* React Coponents
  * React.jsの公開されているComponentが集まっています
  * http://react-components.com/
* React Rocks
  * React.jsのサンプルなどが集まっています
  * http://react.rocks/


### 入門

* Learning React.js: Getting Started and Concepts
  * 連載になっていて、順番にReact.jsを使ってアプリを作る過程がわかりやすく説明されています
  * http://scotch.io/tutorials/javascript/learning-react-getting-started-and-concepts
* React JS and why it's awesome
  * React.jsのいいところについてのわかりやすい説明です
  * http://www.slideshare.net/AndrewHull/react-js-and-why-its-awesome

### React.jsについて

* React: Convincing the Boss
  * 2013年にReact.jsがfacebookでどう使われているかなどが書かれています
  * http://www.quora.com/Pete-Hunt/Posts/React-Convincing-the-Boss
* React Through the Ages
  * React.jsのこれまでとこれからについて書かれたスライドです
  * https://speakerdeck.com/zpao/react-through-the-ages

### Virtual DOM
* OSCON - React Architecture
  * React.jsのVirualDOM実装について中の人の説明です
  * https://speakerdeck.com/vjeux/oscon-react-architecture
* Components, React and Flux
  * React.jsとFluxについてコードを交えながらわかりやすく説明しています
  * http://slides.com/danabramov/components-react-flux-wip#/

### Flux

* Isomorphic Flux
  * YahooがIsomorphicなFluxアプリを作った話です
  * https://speakerdeck.com/mridgway/isomorphic-flux
* flux-meetup
  * Fluxの中の人による説明です
  * https://speakerdeck.com/fisherwebdev/flux-meetup

### developer tool

そういえば紹介するのを忘れていましたが、React.jsの開発をするときに便利なChrome拡張もあるので是非入れてみてください。

http://fb.me/react-devtools

↓のような感じでReact.jsを使っているページに行くとReactのタブが表示されるのでそこからHTMLのタグではなくてComponentで見ることが出来て、PropやStateやEventListenerやComponentの値も確認出来るので便利です。

![developer-console.png](https://qiita-image-store.s3.amazonaws.com/0/4677/44fd3ffd-f6eb-427a-2389-6251ef680141.png)

(これはinstagram.comで開いた例)

### 更新情報

* http://blog.koba04.com/post/2015/03/05/react-js-v013-changes/
* http://blog.koba04.com/post/2015/09/22/react-js-v014-changes/
* http://blog.koba04.com/post/2016/03/09/react-js-v15-changes/

----------------

お疲れさまでした！
React.js meetupやりたいですね！
FuelPHPでLESSを使う

BootstrapはやっぱりHTMLの記述量が多いので今話題のLess化してしまおうという試み。
開発環境でのみコンパイルを行い、公開時にはコンパイル済みファイルを参照するようにもしてみる。

# Packageをインストール

https://github.com/kriansa/fuel-less

```
git clone --recursive git://github.com/kriansa/fuel-less.git fuel/packages/less
```

```php:fuel/app/config/development/config.php
'auto_load' => array(
    'packages'  => array(
        'less',
    )
)
```

## コンパイル環境を確認

CentOS6ならこのあたり入れておく必要があるかも

```
sudo yum install gcc gcc-c++ ld-linux.so.2 libstdc++.so.6
```

# 設定を変更

```
cp fuel/packages/less/config/less.php fuel/app/config/
cp fuel/packages/less/config/less.php fuel/app/config/development/
```

```php:fuel/app/config/less.php
<?php
return array(
/*	'less_source_dir' => APPPATH.'assets/less/', //元ファイル格納用
	'less_output_dir' => DOCROOT.'assets/css/', //公開用コンパイル済みファイル格納用
	'less_compiler' => 'Less\\Compiler_Node',
	//'less_compiler' => 'Less\\Compiler_Lessphp',*/
);
```

```php:fuel/app/config/development/less.php
<?php
return array(
	'less_source_dir' => APPPATH.'assets/less/', //元ファイル格納用
	'less_output_dir' => DOCROOT.'assets/css/', //公開用コンパイル済みファイル格納用
	'less_compiler' => 'Less\\Compiler_Node',
	//'less_compiler' => 'Less\\Compiler_Lessphp',
);
```

# Bootstrapを用意

Githubからプロジェクトをダウンロードし、lessフォルダのみリネームして格納

* https://github.com/twbs/bootstrap
* ダウンロードしたlessフォルダをbootstrapにリネームし保存

```
pushd ~/
git clone https://github.com/twbs/bootstrap.git
mkdir fuel/app/assets/less -p
cp bootstrap/less fuel/app/assets/less/bootstrap -r
popd
```

# 開発環境のみコンパイルを実行するように設定

```
touch fuel/app/config/event.php
```

```php:fuel/app/config/event.php
return array(
	'fuelphp' => array(
		'controller_started' => function()
		{
			if( Fuel::$env == Fuel::DEVELOPMENT ){
				//compile less
				$css = Asset::less('style.less'); 
			}
		},
	),
);
```

# テスト

## ソース

```css:fuel/app/assets/less/style.less
@import "bootstrap/bootstrap.less";

h1{
	.text-success;
}
h1{
	.glyphicon;
	.glyphicon-ok;
}
h1:before{
	margin-right:5px;
}
p{
	.text-warning;
}

```

```css:fuel/app/views/template.php
<html>
<head>
<?php echo Asset::css('style.css'); ?>
</head>
<body>
<div class="container-fluid">
	<div class="row">
  	<div class="col-md-8">
		<h1>success</h1>
		<p>warning</p>
		<?php /*echo $content;*/ ?>
	</div>
	</div>
</div>
</body>
</html>
```

## 結果
![fuel_less_test.png](https://qiita-image-store.s3.amazonaws.com/0/64098/7bf50f2f-2202-ca23-ad38-66b75ccb0de0.png)

いい感じ！
Scalaで「ソースコードの更新が効いてない!?」と思ったらできること



## 1. 実行したプログラムは本当にそのコード？

実は違うファイル、ディレクトリ、プロジェクトなんてことはありませんか？悩みに悩んだ挙句、実は違うファイルを見てた、コピーした別のプロジェクトを開いてた、サーバ側のコードだった…。といったことは無さそうで有ります。

## 2. 保存した？

ベテランプログラマのあなたは無意識のうちにショートカットキーでファイルの変更を保存しているでしょう。もう一度、意識下でファイルを保存してみてください。

## 3. sbt clean

たまにコンパイルがおかしくなって、最新のコードが取り込まれないことがあります。sbtでcleanを実行しましょう。


```
> clean
```

## 4. sbt reload

新しい依存パッケージのバージョンの変更等、build.sbtを変更したのに反映されないとしたら、reloadし忘れていないか確かめましょう。

```
> reload
```

## 5. sbtを再起動する

極稀にcleanでもキレイにしきれないことがあります。そんな場合はsbtを一旦終了してはじめからやり直してみましょう。
ServiceをAIDLを使って弄ぶ練習


前回（[端末に新規アプリがインストールされたらログを吐く](http://qiita.com/neiraza/items/1f3a44830bfdd2363c91)）に引き続き、Serviceの利用方法とか、ほとんど覚えていないので、 __Service__ の超簡単なサンプルを作成したのでメモを残す。

## 概要

[Service](http://developer.android.com/guide/components/services.html)を[AIDL](http://developer.android.com/guide/components/aidl.html)を使って、アプリから利用サンプル。
複数アプリから同じサービスを参照して遊び[タイ](http://ja.wikipedia.org/wiki/%E3%82%BF%E3%82%A4%E7%8E%8B%E5%9B%BD)ので、[Implicit intents with startService are not safe](http://stackoverflow.com/questions/22050813/is-this-warning-caused-by-my-app-implicit-intents-with-startservice-are-not)って出ても気にしないでokなはず。

AndroidManifestにServiceを定義する際の[リファレンス](http://developer.android.com/guide/topics/manifest/service-element.html)をすぐに忘れるので残す。

## 実装

[GitHubにサンプルソースを置きました](https://github.com/neiraza/ServiceSampleA)

だいたい下記ファイルを眺めればわかるかと。

* [ItemListActivity.java](https://github.com/toguri/ServiceSampleA/blob/master/app/src/main/java/ri/togu/sample/servicesamplea/ItemListActivity.java)
* [CalculatorService.java](https://github.com/toguri/ServiceSampleA/blob/master/app/src/main/java/ri/togu/sample/servicesamplea/services/CalculatorService.java)
* [ICalculatorService.aidl](https://github.com/toguri/ServiceSampleA/blob/master/app/src/main/aidl/ri/togu/sample/servicesamplea/services/ICalculatorService.aidl)

## 備忘

僕はサンプル作成にAndroidStudioを利用しています。
ディレクトリ構成を標準のまま使っており、aidleディレクトリが参照されず、しばし空を見つめました。

build.gradleのandroidブロックに下記を書けば、okokでした。


```XML:AndroidManifest.xml
sourceSets{
    main{
        aidl.srcDirs = ['src/main/aidl']
    }
}
```
RubyMineを更に快適に使うための5つのTips

こんにちは。今年は[PhpStorm](http://qiita.com/advent-calendar/2013/phpstorm)からRubyMineに乗り換えました。

便利なキーマップとかPhpStorm版ではありますが[去年の今頃](http://qiita.com/Vexus2/items/fc328619deac316c3ff5)書いたのがありますので、そちらを見ていただくと良いのかなーと思います。

今回はRubyMine7から入った機能や、RubyMineならではの機能のうち、自分が頻繁に使っているものをいくつか紹介してみます。

## ファイル間移動
自身のカーソルの位置をもとに、 *現在のファイルからジャンプ可能なファイルを表示* してくれます。
ファイル移動は `Go To Decralation(Ctrl+B)` で飛べるんですが、テストファイルへの行き来だったり、Viewファイルへ直に飛びたいときはこっちのコマンドの方が便利です。


![全画面_2014_12_24_18_53.png](https://qiita-image-store.s3.amazonaws.com/0/20074/2223247a-f3c9-df88-58be-cad9f1a70122.png "全画面_2014_12_24_18_53.png")

## Scratch

プラグインとして提供されていたのと同等の機能がRubyMine7からデフォルトで入りました。
Scratchは簡易メモ書き的な領域を提供してくれます。RubyMine内のエディタやキーバインドで簡単なテキスト操作やメモを残したいときに便利です。

![42162eb706a2da20bef98bdb53f0c1fe.gif](https://qiita-image-store.s3.amazonaws.com/0/20074/2ae4da53-1865-38d0-038d-70c41a79ada4.gif "42162eb706a2da20bef98bdb53f0c1fe.gif")


## Find Actionからrakeコマンドを直に実行

元々は `Find Action(Cmd+Shift+A)` からrakeを指定して実行したいコマンドを辿る必要があったんですが、RubyMine7から直にrake内のコマンドを実行出来るようになりました。

![全画面_2014_12_25_12_54.png](https://qiita-image-store.s3.amazonaws.com/0/20074/d9a5e6f4-17b5-07ff-0f87-a5e1d706af7c.png "全画面_2014_12_25_12_54.png")

上記画像のように、 Find Action内にて `db:` などと入力するとrakeで実行出来るコマンドが直に表示されます。
開発中頻繁に使うものはショートカットキーを割り当てておくと便利ですが、たまに使う程度のものは、このようにFind Actionから呼び出すと即座に実行できるのでとても楽です。

ちなみに `Search Everywhere(Shift*2)` でも同じことができますが、個人的にはSearch Everywhereは使ってないです。多機能すぎるが故に絞り込みが遅い＆前回の入力内容を保持していないので逆にストレス感じることが多いので。数msの待ち時間にストレス感じちゃう方はシンプルにFind ActionやGoto Filesなど個別のアクションを使うのをおすすめします。

## デバッガで動的コード確認
こちらもRubyMine7からの新機能です。
ブレイクポイントを貼ってステップ実行している際、既に代入済の変数の中身がコードの横に表示されます。

![kobito.1419480625.453147.png](https://qiita-image-store.s3.amazonaws.com/0/20074/25aaa54a-0445-5505-e6bf-ad312b72f803.png "kobito.1419480625.453147.png")

また、Interactive console上で動的にコード実行して確認することができます。もちろん、Console上でもコード補完が効くので、今ある変数をもとにちょっと動作を検証したいときなどにとても捗ります。


## Emmet Preview

名前のまんまですが、Emmet(Zen Coding)のプレビュー機能です。
同じくRubyMine7からの新規機能になります。
PreviewのToggleをONにしておくと下記の画像みたいな感じで、自身のカーソルの位置までのEmmetを展開した状態のポップアップを表示してくれます。

![全画面_2014_12_24_18_50.png](https://qiita-image-store.s3.amazonaws.com/0/20074/7783ba71-b4d0-80f3-e18b-b510b41f2536.png "全画面_2014_12_24_18_50.png")
月額料金を発生させず予算1,000円で独自ドメインのWebサイト設置

# はじめに

月額料金を発生させずに独自ドメイン(カスタムドメイン)でWebサイトを持ちたく、色々と調査し、一つの着地点を見つけましたので共有します。

ドメインレジストラや無料サーバを調べ始めると多数情報が出るのですが、選択肢が多いと疲れてしまいますよね。
海外の怪しいレジストラや広告が付加される無料サーバを使うのもストレスが溜まります。

また、ポートフォリオやランディングページを置きたいだけなのに月額料金を払い続けるのも避けたいし...

という課題を「お名前.com」「Dropbox」の2サービスで解決しました。
何かの参考になりましたら。

最も安価なケースでドメイン取得&年間使用料の99円です。
(1年後にドメイン更新費用が掛かるので注意してください)

私の場合「.tokyo」ドメインを取得し、550円程でした。

# 独自ドメインの取得

お名前.com
http://www.onamae.com/

お名前.comにて自分が使いたいドメイン名で検索します。

.co, .com, .orgなど、複数のドメインにチェックが入った状態の画面が表示されます。

自分が欲しいドメインのみが選択された状態にし「お申し込みへ進む」をクリック。

登録年数は「1年登録」を選択。
Whois情報公開代行にチェックを付ける。

サーバーの選択ではチェックを付けない。

お名前.comのIDが無い場合は「初めて利用します」を選択し「次に進む」をクリック。

お支払い方法の選択で、任意の支払方法を選択。
クレジットカードではなく「その他の支払い方法」でコンビニエンスストアでの支払も可能です。

「規約に同意し、上記内容を申し込む」ボタンをクリック。

料金支払後、登録が完了します。
コンビニ支払後、2時間程で登録完了のメールが届きました。

# Dropboxにファイル設置

Dropbox
https://www.dropbox.com/

Dropboxに登録・ログインします。

Publicフォルダ以下にindex.html、cssやscriptファイルを設置します。

最低限、index.htmlがあれば表示可能です。
試しにBootStrap一式を置いても動作しました。

index.html上で右クリック「公開リンクをコピー...」で、URLをコピーしておきます。

# DNSレコード設定

再びお名前.comで作業。
フレーム転送設定し、取得した独自ドメインとDropbox上のアドレスを紐付けます。

登録したお名前.comのIDにてログイン後
「オプション設定」タブより転送設定Plusの「URL転送設定」をクリック。

ドメイン名一覧の「設定する」をクリック。

設定情報の「新規追加」をクリック。

転送元URLは空欄、もしくは任意の文字列を入力。
転送先URLには先程コピーしたindex.htmlの公開リンクURLを貼り付け。
転送タイプは「フレーム」

「確認画面へ進む」から登録。

約10分〜1時間ほど待つと、登録した独自ドメインでindex.htmlが表示されます。
登録直後は「このウェブページにアクセスできません」となるので気長に待ちましょう。

# おわりに
Webページ表示速度はそんなに速くないと思います。

未テストですが階層がある構成のページではURL表示等がおかしくなるかもしれません。

Bootstrapが動作して少し感動しました。

月額無料でWebサイトを持ちたい人にとって、参考になりましたら幸いです。
Yosemiteにアップグレードした時のiCloud Drive設定でハマった（解決済）

**iMac 20inch early 2008をMarvericksからYosemiteにアップグレード。**
**iCloud Drive設定で少しハマったのでメモ。**

# iCloud Driveが設定できない
環境設定のiCloudからiCloud Driveにチェックをつけようとするが、設定中のまま止まってしまった。
翌日パソコンを再起動しても変わらず。

[こちら](http://itea40.jp/technic/mac-troubles/can-not-use-icloud-drive/)を参考に一度サインアウトしてからログイン
サインアウトするときに、iCloudに保存された書類が削除される、という警告が出て少しドキドキした。
再度ログインしたら設定できた。

#iCloud Driveにファイルがコピー出来ない
Finderのよく使う項目に「iCloud Drive」フォルダが出てきたが、クリックしてもフォルダを開けない。
適当なファイルをドラッグドロップしようとしてもできない。
右クリックで情報を見ようとしても反応しない。
新規タブで開いてみると、タブ名は「iCloud docs libraries」となる。
開いたタブの中にファイルをドロップしようとしてもできない。

なんでだぁーーーーっと思って調べてもよくわからず。。。

##解決法
結局、Finderを一度閉じて、新たに開き直すことで解決した。
こんな単純なことだったか、と恥ずかしい。
GitLabでgit cloneできなかったときにやったこと

#GitLabでgit cloneが失敗する

```lang:エラー
Cloning into '[リポジトリ名]'...
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
fatal: The remote end hung up unexpectedly
```

###前提

* ssh-keyは登録済。(local[自分のPC]にある公開鍵)
* GitLabサーバーのpingは通る。
* 自分はリポジトリに追加されたユーザー。(新しくプロジェクトを作るわけじゃない)


###解決策

ssh-keyを登録し直した。
但し、local(自分のPC)で使っていた公開鍵ではなく、
サーバー上の公開鍵を登録した。

でも同じキーで、若干コメントが違うぐらいの違いしかない。
もしかしたら変な改行とか入ってたのかも？

何はともあれできました。。。
gitのリモートURLを変更した話

gitのリモートURL(でいいのかな？cloneとかに使うやつ)を変更したい事案が発生したのでメモ。

###やりたいこと
---
個人のRepositoryで管理していたものをあるOrganizationsに移したい。
`https://git.example.com/hoge/sample` を
`https://git.example.com/fuga/sample` にしたいのでござる。

###どうやんの？
---
+ とりあえず現状の確認をば

```bash
$ git config -l | grep remote.origin.url
remote.origin.url=ssh://git@git.example.com/hoge/sample.git
```
⇒ hogeになっていることが確認できる。

+ 魔法のコマンドを打つべし、打つべし！

``` bash
$ git remote set-url origin git@git.example.com:fuga/sample.git
```

+ どうなったかな…

```bash
$ git config -l | grep remote.origin.url
remote.origin.url=ssh://git@git.example.com/fuga/sample.git
```
…おっ！？ｋｔｋｒ

＿人人人人人人人人人人人人人人人人人人人人人＿
＞　git.example.com/**fuga**/sample.git　＜
￣Y^Y^Y^Y^Y^Y^Y^^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
ｷﾀ━━(ﾟ∀ﾟ)⌒Ｙ⌒(｡Ａ｡)⌒Ｙ⌒(ﾟ∀ﾟ)⌒Ｙ⌒(｡Ａ｡)⌒Ｙ⌒(ﾟ∀ﾟ)━━!!

###さいごに
---
pullとかちゃんとできることも確認しよう！
junitでprivateメソッドのテストをする話

ここ最近、クラスファイルを新規で作ったり編集したらテストをちゃんと書こう！的なのを実践中なのだけれど、プライベートメソッドって他所から呼べないからプライベートなわけで。。。

まぁ、書かないわけにもいかないし、結果調べて書けたので忘れないようにメモっておく。


###とりあえずやってみよう
---
対象クラスは適当に(残念な感じに)書いてみた。

``` java
public class MyClass {
    private String getGreeting(String name) {
        return "hello! " + name;
    }
}
```
以下がテストクラス。

``` java
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Method;
import mockit.Tested;
import org.junit.Test;

public class MyClassTest {
    @Tested
    private MyClass sut;

    @Test
    public void test() throws Exception {
        Method method = MyClass.class.getDeclaredMethod("getGreeting", String.class);
        method.setAccessible(true);
        assertEquals((String) method.invoke(sut, "bob"), "hello! bob");
    }
}
```

###なにやってんの？
---
```java
Method method = MyClass.class.getDeclaredMethod("getGreeting", String.class);
```
privateメソッドちゃんを探しだしてMethodオブジェクトを作ってくれている模様。
`getDeclaredMethod(メソッド名(, 第一引数の型, 第二引数の型…)`
※ 引数がないメソッドの場合はメソッド名だけでおｋ

```java
method.setAccessible(true);
```
privateメソッドにアクセス可能になるおまじない。

``` java
(String) method.invoke(sut, "bob")
```
privateメソッドの呼び出し。
`invoke(インスタンス(, 第一引数, 第二引数...))`
今回はメソッドの戻り値が文字列なのでStringにキャストしたった！

###これで
---
無事にprivateメソッドもテスト書けるようになったのです。
使い方覚えてしまえば難しくないんだろうけど、結局毎度調べてるという…笑
Gradleをざっくりと


(順次更新)

# Gradle
* ビルドツールのこと
* Groovyで書く
* ライブラリの取得・ビルド・テスト・デプロイ等を自動化することが可能
* Android Studioではこちらを採用

# Gradleを使ってみる

```shell-session:
$ brew install gradle
```

複数のバージョンを使うときはGVMを使うといいかも

# はじめてのGradle

gradleで”Hello, Worldと表示するタスクを定義して実行してあげます。

```:build.gradle
task hello << {
    println “Hello, World"
}
```

結果は以下です。


```shell-session:
$ gradle hello
:hello
Hello World

BUILD SUCCESSFUL

Total time: 3.187 secs
```

# はじめてのJavaコンパイル

```gradle:buiuld.gradle
apply plugin :"java"
```

```java:src/main/java/Hello.java
package jp.blogspot.sassylog;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}
```

でビルド

```shell-session:
$ gradle build
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 3.297 secs

$ java -cp build/classes/main jp.blogspot.sassylog.Hello
Hello, World

```

# Javaのプロジェクトを作ってみる

適当なフォルダを作成して


```shell-session:
$ gradle init --type java-library
``` 

を実行します。
すると、下記のようなディレクトリ構成が生成されます。


```
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java
    │       └── Library.java
    └── test
        └── java
            └── LibraryTest.java
```

src/main/java/Hello.javaを作成し、ビルドしてみます。


```shell-session:
$ gradle build
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 11.271 secs
```

buildすると、buildディレクトリが生成し、
buildディレクトリにはclassファイルやjarファイルが生成されます。
Jenkins・GitHub・HipchatによるCI環境構築

## はじめに

Gunosyの広告エンジニアの印南です。
今回は、GitHub上で管理されているコードに対してJenkinsを使用して、開発者がテストしたい任意のタイミングでテストを行える環境を構築する方法についてご紹介します。

## やりたいこと 

- 開発者がGitHub上にプルリクを出したタイミングでテストを自動で走らせたい
- マージされたブランチに対してもテストを自動で走らせたい
- GitHub上で開発者の好きなときにテストを走らせたい
- 結果をHipChatに通知するようにしたい


## 全体の構成

全体の構成としては、GitHubの更新をJenkinsが監視して、更新があればテストし、結果をHipChatに通知するという流れになります。

![jenkins-ci.png](https://qiita-image-store.s3.amazonaws.com/0/43202/8c828db8-200e-d67b-a1aa-7739a01e7022.png)


① 開発者がGitHub上でプルリク/プルリクに対するコメントを発行します
② JenkinsがGitHubの更新を定期的（2分置きくらい）に監視しており、更新があった場合にはテストを開始します。
③ ステージング環境にプルリク対象のブランチをデプロイし、テストを実行します
④ 実行結果はjunitなどで使用される形式でレポートされ、HipChatに実行結果を通知します

ちなみに、①ではGitHub上で特定のキーフレーズ（例：Test this please）をコメントすることでプルリク発行とは別のタイミングでテストを実行することができます。


## Jenkins Plugins

上記の構成をJenkinsで実現するためいくつかのプラグインを使用しています。ここでは特徴的なものを紹介します。

### GitHub Pull Request Builder Plugin

GitHubを監視して、プルリクが発行されたタイミングで、テストを自動実行してくれるプラグインです。

また、以下のような機能もあります。

- プルリク上に特定のキーワードが書かれた場合にテストを実行する
- GitHub上にテスト結果を反映する

詳細はこちらで紹介されていますので参照してください。

[JenkinsプラグインのGitHub pull request builder pluginを使ってみる](http://d.hatena.ne.jp/oovu70/20130118/p1)

[Jenkinsでプルリクエストをビルドする](http://qiita.com/quattro_4/items/6b1962909ce868f12e5a)

### HipChat Plugin

テストの実行結果をHipChat上の特定の部屋に記載してくれるプラグインです。
テスト結果へのリンクはもちろん、結果によって背景色を変えることなどできます。

詳細はこちらで紹介されていますので参照してください。

[Jenkinsのビルド結果をHipChatで通知する方法](http://kkurahar.github.io/blog/2013/09/18/jenkins-hipchat/)

## おわりに

目新しい情報があるわけではありませんが、比較的簡単に作れるCI環境として参考にしていただけたら幸いです。
[Swift]値渡しと参照渡しでこけたのでメモった


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##そもそも値渡しとか参照渡しって何？
簡単にまとめると、、、
**「値渡し(call by value)」とは変数の値をコピーする渡し方**
**「参照渡し(call by reference)」とは変数を共有する渡し方**
え、、、(錯乱)と、とりあえず進む


###値渡し: 変数の値をコピーする渡し方

```
let a = [1, 2, 3]
var b = a
b[0] = 100
//  a[0]は100ではなく1のまま
```

上記のはbはaから要素をコピーして作られた、aとは別のミュータブルなArray(配列)となる。つまり **aにはbの変更は反映されない**

```
letで宣言: イミュータブル(不変)
let b = [1, 2, 3]
b[0] = 100
// コンパイルエラー

varで宣言: ミュータブル(可変)
var a = [1, 2, 3]
a[0] = 100
// [100, 2, 3]
```

###参照渡し: 変数のメモリのadress(住所)を渡す
下記ではSwiftが参照渡しだったと仮定します。
(本来はSwiftは値渡し)

```
let a = [1, 2, 3]
var b = a
b[0] = 100
// a[0]は100
//(注)値渡しの場合は1のままだった
```

つまり参照渡しは値渡しと異なりコピーではく、adress(メモリの住所)を渡し共有しているのです。

下記はclassとstructの参照渡し、値渡しの例です。



このほかに
**Swiftでポインタを使用する方法**
**参照の値渡し、値の参照渡し**
**変数の実態がメモリ領域ってどういうこと？**
などもかければなーと思います。

まだまだ不束者ですので不備や修正など、ご教授のほうよろしくお願いします！！
Linux > HDD増設時のswapの再設定

HDDを増設した時にswap領域がうまく設定できていなかった。

http://qiita.com/2or3/items/501f206a6091a4ce895f
に従いHDDの増設はうまくできた。

その後swapの設定を行わないといけなかった。

手順としては以下の通り (/dev/sda3をfdiskにてswap領域としているとして)
1. mkswap /dev/sda3
2. swapon /dev/sda3をしてエラーとならないことを確認
3. freeコマンドでswap領域のtotalが0でないことを確認
4. sudo blkid /dev/sda3 でUUIDを表示
5. 手順4で表示されたUUIDを/etc/fstabの以下の行に書き換える
    
    UUID=dd7c3030-dcaa-4x69-bk81-e753084a3f62 swap                    swap    defaults        0 0

これで再起動すると起動時にswap領域がマウントされるようになる
ブラウズ履歴を全部保存しておきたい

この記事は [Iwate Advent Calendar 2014](http://qiita.com/advent-calendar/2014/iwate-dev) の25日目の記事です。

# あのページはどこに消えたんだろう？

ブラウザでお気に入りに登録しても、あるいは、ソーシャルブックマークに残しても、元ページが書き換わったり消えたりして、「あの時に読んだ情報はどこに消えたんだろう？」となることないですか？

「あとで必要になるかもしれないから、とりあえず手元に保存しておきたい」

該当ページをブラウザで開いて

> ファイル > 別名で保存 > 形式 : Webページ (完全) や Webアーカイブ

など、毎回保存するのが大変でした。


## いっそのこと全ページ保存

毎回保存するのが面倒くさいので、ならいっそのこと「ブラウザで表示したページは、全部手元に保存しておけば良い。」という思考に。

数回前の[IWDD](http://www.iwdd.net)で発表しましたが、

1. ブラウザのExtentionを作る
2. 魚拓を取るサーバー側プログラムを作る
3. ブラウザでアクセスした全URIが自動的に手元に保存される

ような仕組みを運用して約半年くらい経ちましたので、そのふり返り。


## 1. ブラウザExtention

Google ChromeでExtentionを作ると、こんな感じ。

manifest.json では urlを取得するpermissions。

```manifest.json
{
  "manifest_version": 2,
  "name": "archiver",
  "description": "archiver",
  "version": "0.1",
  "permissions": [
    "http://*/",
    "https://*/",
    "tabs"
  ],
  "background": {
    "scripts":["background.js"],
    "persistent": false
  },
  "icons": {
    "128": "icon128.png"
  }
}
```

urlを取得して 魚拓サーバーにurlをGETで投げるだけ。

```background.js
chrome.tabs.onUpdated.addListener(function(tabId, changedInfo, tab) {
  if ( !(/^chrome:\/\//.test(tab.url)) ) {
    var httpreq = new XMLHttpRequest();
    if (changedInfo.status == 'loading') {
      httpreq.open('GET', 'http://localhost:9293/?url=' + tab.url, true);
      httpreq.send(null);
    }
  }
});
```

## 2. 魚拓を取るサーバー

sinatra を使うとこんな感じ。ブラウザExtentionからGETで届いたURLを、単にwgetしているだけ。

```server.rb
require 'sinatra'
require 'uri'

get '/' do
  _uri = URI.parse(URI.escape(params['url']))
  `/usr/local/bin/wget "#{_uri}"`
end
```


## 保存されたデータ

約半年間の運用で

* HTMLファイル数 = 18,000個
* データ容量 = 1.2GB
* 一番多く保存されていたサイト = ピー(自主規制)

初期の頃はCSSやJPEGも全て保存するようにしていたら、保存容量が大変なことになったので、HTMLファイルのみ保存するようにした。*.google.com や *.google.co.jp も保存対象外にしている。


年末の今、自動保存されたデータを個別に振り返ってみると、「俺が今年どんなサイトにアクセスしたか」が全部記録されていて... いろいろ思うことがあります...



## さらに今後の改良

最近のサイトはJSゴリゴリの SPA(Single-page Application) が多く、しっかりRESTされてGETに対するpermalinkが存在しないと、wgetではつらい。

なので、wgetでHTMLファイルを保存するのではなく、「その瞬間のDOMを保存する」ような仕組みに変えていきたい。


では、よいお年を。
Mortal で Activity を利用する場合の実装方法

Mortal/Flow はライフサイクルを単純化し、とても良い設計を提供してくれます。

ただ、Mortal で実装された``View.getContext()``ラップされていて Activity として利用することができません。

```
java.lang.ClassCastException: mortar.MortarContextWrapper cannot be cast to 
android.app.Activity
```

その場合、[この Mortal のサンプル](https://github.com/square/mortar/blob/master/mortar-sample/src/main/java/com/example/mortar/android/ActionBarOwner.java)が参考になります。

以下の様に、Presenter を実装しこれを経由して Activity へアクセスします。

```java
    class WindowOwner extends Presenter<WindowOwner.Activity> {

        interface Activity {
            void addFragsToWindow(int flags);
        }

        public static class Config() {
            final private int flags;
            Config(int flags) { this.flags = flags; }
            public int getFlags() { return this.flags; }
        }

        private Config config;

        public void setConfig(Config config) {
            this.config = config;
            update();
        }

        private void update() {
             WindowOwner.Activity activity = getView();
             if (activity != null) {
                  activity.addFlagsToWindow(config.getFlags());
             }
        }

        @dagger.Module(injects = {}, library = true)
        public static class WindowOwnerModule {
             @Provides
             @Singleton
             WindowOwner provideWindowOwnerPersenter() { return new WindowOwner(); }
        }
    }
```

上記で定義した``WindowOwner.Module`` を``ApplicationModule``等のルートのModule へ``includes``してください。

そして、Activity に``WindowOwner.Activity``のメソッドをオーバーライドします。

```java
     class AwesomeActivity extends Activity implements WindowOwner.Activity {
          @Inject WindowOwner windowOwner;

          @Override
          protected void onCreate(Bundle savedInstanceState) {
              Mortar.inject(this, this);
              this.windowOwner.takeView(this);
          }

          @Override
          void addFragsToWindow(int flags) {
              getWindow().addFlags(flags);
          }
     }
```

これで、あなたの Screen で``@Inject``を行えば Activity にアクセスすることが出来るようになりました。
Jenkinsおじさんビルド結果Slackに通知して

Jenkinsおじさんビルド結果通知してのSlack版を書いておこうと思います。
すでにSlackとJenkinsを導入している場合の連携設定についてだけ記載するので

+ Jenkinsの導入については
[こことか](http://qiita.com/search?q=jenkins)

+ Slackの導入については
[こことか](http://kai-you.hatenablog.com/entry/2014/08/11/154324)
参考にしてください

#1.JenkinsプラグインのInstall
[Jenkinsの管理]-[プラグインの管理]-[利用可能]
「Slack Notification Plugin」へチェックをつけてインストール
#2.SlackのIntegrationsの設定
##2.1.Jenkins CIを追加
[Menu]サイドバー-[Integrations]-[All Services]-[Jenkins CI]をAddします
![Integrations   green Slack.png](https://qiita-image-store.s3.amazonaws.com/0/10605/98011dd8-a70c-af51-cb72-62053b2a54f3.png)
##2.2.Jenkins CIの設定
ビルド結果を出力するチャネル設定をします。
![Jenkins CI   green Slack.png](https://qiita-image-store.s3.amazonaws.com/0/10605/d6721262-fbb8-c2b7-4178-07ffa949703c.png)
チャネルを選択したら「Add Jenkins CI Integration」を押します
[Setup Instructions]がでてきてJenkins側の設定について詳しい説明が出てきます
ここの[Step3]にJenkins側へ設定すべき項目が赤字で表示されています

- Team Domain
- Integration Token
![Jenkins CI   green Slacksetup.png](https://qiita-image-store.s3.amazonaws.com/0/10605/b8e53960-9205-8172-c03a-f7e77e4822f7.png)


これらを設定します
#3.Jenkinsシステムの設定
[Jenkinsの管理]-[システムの設定]
![システムの設定  Jenkins slack.png](https://qiita-image-store.s3.amazonaws.com/0/10605/5e260d5f-4787-a994-fa28-82a6b4ce1b26.png)

- Team Domain
- Integration Token

#4.Jenkins Jobの設定
##4.1.通知種別の設定
[JOB名]-[設定]で「Slack Notifications」を設定していきます
![green Config  Jenkins .png](https://qiita-image-store.s3.amazonaws.com/0/10605/8f388a73-26e4-d4dc-937e-804c72539b9f.png)
このJobの紐付けチャネル名を入力
通知したい種別にチェックを入れる
##4.2.ビルド後処理の設定
[JOB名]-[設定]-[ビルド後の処理の追加]から「Slack Notifications」を選択する
![green Config buildend Jenkins .png](https://qiita-image-store.s3.amazonaws.com/0/10605/852b43da-5724-c0b4-bf02-85c6eef6166a.png)
[保存]か[適用]を実施する

#5.連携を試す
#5.1.ビルド実行
Jenkinsの[JOB名]-[ビルド実行]
![green  Jenkins build.png](https://qiita-image-store.s3.amazonaws.com/0/10605/ca891cc0-83f6-c5b1-f313-554b8a99f32b.png)
#5.2.Slackへの通知確認
Slackの指定した紐付けチャネル名に結果が出ているか確認

![random   green Slack.png](https://qiita-image-store.s3.amazonaws.com/0/10605/9868411b-4e00-4c54-4f41-c7d4b7748c69.png)

おぉめでたく連携設定完了

ちなみに
HipChat連携についても書いています
[コミットしたらGitBucketとJenkinsとHipChatに任せて他の事やってましょう(1)](http://qiita.com/ryuthky_github/items/c27b8f0f15b7e658efc2)
[コミットしたらGitBucketとJenkinsとHipChatに任せて他の事やってましょう(2)](http://qiita.com/ryuthky_github/items/f3d5e641cfbe8d4f3cde)
[コミットしたらGitBucketとJenkinsとHipChatに任せて他の事やってましょう(3)](http://qiita.com/ryuthky_github/items/6bb3a62477f474b0fe19)
Facebook API v1.0 -> v2.0 の際のUser IDの挙動についてのメモ



Facebook Graph API がバージョニングを始め、v2.0を提供するにあたって、今まで一意だったUser ID(Original User ID)の代わりに、アプリ個別のUser ID(App-scoped User ID)が返ってくることになった。


https://developers.facebook.com/docs/apps/changelog#v2_0


これからFacebookアプリを作る人は大丈夫だが、既存のアプリを移行する+Web版もMobile App版も存在するとなると、話は結構ややこしくなる。
ここでは、そういった話についてまとめる。


## 基本的な移行時の挙動

- v2.0の時にユーザー登録した人はApp-scoped IDになる。
- v1.0の時に既にユーザー登録していた場合App-scoped IDはOriginalのままになる

## バージョンが混ざった時の挙動

携帯ではv1.0, Webではv2.0になっているということもあるのでそういった時に生じる挙動

- v2.0で新規作成されたユーザーがv1.0でアクセスすることも出来る
- v2.0でApp-scoped IDが付与されると、v1.0でアクセスしてもそのApp-scoped IDが返ってくる
- 一度v2.0でログインしてしまうと友達情報はアプリを使っている友達のみの情報になってしまう

> Once a user has logged into an app using version 2.0 (or later), calling this edge for v1.0 will continue to return the later version's response.
https://developers.facebook.com/docs/graph-api/reference/v1.0/user/friends

ここでv1.0の結果が返ってくるかどうかは
https://developers.facebook.com/tools/debug/accesstoken
のUser IDの項目に`User last installed this app via API v1.0`と書いているかどうかで判断できるみたい。
(どこにも書いてないけど、実験した限りそうっぽい。)


## ユーザーのアプリ間での同一性判定について

2015年の5月以降に全く別のアプリで同じユーザーを突合するのは基本的には不可能になった。


v1.0ではID的な役割であった`username`というものもあったが、それもv2.0では廃止になっている。


もちろん、名前とかプロフィールとかを総合的に見て、賢く突合する事はできるし、2つの異なるアプリのApp-scoped User IDが同じ人のものかどうかは、リダイレクトを元に判断できる。(今後リダイレクトしなくなる可能性もあるけど)
大量のUser IDのリストのマッピングは、賢くやれば出来るとはいえ、とてもめんどくさくなっていると言える。

ただし、同じ会社のアプリなどでは、[Business Manager](https://business.facebook.com/) を用いると対応マッピングを得ることが出来る。

## バージョンを指定しないアクセス、古いバージョンのアクセスについて

- バージョンを指定しないアクセスは、その時そのアプリが使える一番古いAPIアクセスになる
- APIのバージョンが期限切れになった場合、期限が切れていない一番古いAPIアクセスになる

https://developers.facebook.com/docs/apps/versions
dockerで後からポートを公開する

## docker で後からポートを公開する

docker run したときに -p を忘れたり後から公開の必要ができた場合には

```
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.15:80
```
でポート転送すればよい
ubuntu 14.04 ではこの設定でOKだった
DockerfileでEXPOSEしていないポートでも転送できた
IPアドレスは外からは `docker inspect` で確認

うまくいかな場合は `iptables-save` でほかのコンテナの転送設定見てやればいいと思う

### 2014/12/30 追記：
ubuntu 14.04のdockerのパッケージを*docker.io*から*lxc-docker*に変更したら natテーブルだけじゃダメで FORWARDも必要だった

```
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 9292 -j DNAT --to-destination 172.17.0.49:80
iptables -A FORWARD -d 172.17.0.49/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
```
[要確認! 2015/4/30まで] Facebookアプリの審査について


Facebook APIのv1.0がv2.0（現在の最新はv2.2）に上がって、色々変更があったが、その中で、ユーザーから取得許可を求める多くの項目についてFacebookの審査が必要になったのはご存知だろうか？

https://developers.facebook.com/docs/apps/review


ここでは、この審査についての基本情報をお伝えする。

ちなみにv1.0は2015年の4月いっぱいで全面廃止され使えなくなるので、まだ対応が済んでいない人は、あと4ヶ月で対応しないといけない。
モバイルアプリなどにFacebook連携を組み込んでいる場合はAppleの審査や、ユーザーが新しいバージョンを使いはじめるののタイムラグなどでより早くから対応しないといけないので、もう既にかなりギリギリの状態になっているかもしれない。

現在あるサービスを見ていると、まだ対応して無さそうなのが多かったので、詳細はともかくFacebookを使っているサービスを作っている人は是非自分は大丈夫か確認してみて欲しい。

## 審査が必要な項目、必要ない項目

Facebookのレビューがいらないのは以下3つの基本的なパーミッションのみ。

https://developers.facebook.com/docs/apps/review/login

- public_profile
- user_friends
- email

この内、public_profileはデフォルトで取得できる。

v1.0ではデフォルトで取得できていたのは、basic_infoというものだった。
これは、public_profileとuser_friendsの内容を両方含んだものだった。
これがv2.0への移行で分割され、user_friendsの方は明示的に取得しないといけくなった。
(ただし、v1.0のuser_friendsの内容とv2.0のuser_friendsの内容は異なっており、前者は友達全員、後者はアプリを使っている友達全員となっている)
この他のものについて何らかの情報を取得するアプリは全てFacebookレビューを受けなければいけなくなった。

## その他パーミッションの主要な変化

まず、どのパーミッションも個別にオン・オフを選択が可能になった。つまり、そのパーミッションがオンであること前提のコードは書けなくなった。

その他大きい変更としては、友達のプロフィール情報(写真や学歴、誕生日)に関してはそもそも取得すること自体ができなくなった。friends_xxxというパーミッションが軒並み削除されている。
現状、入手できる友達情報(user_friends)はその友達の以下の情報のみである。

- 名前
- uid (Facebookのページへリンクできる)

実は最も大きいのは、この際に既に同じアプリを使用している友達の情報しか取得できないように変更されたことだ。

また、このuidもこれまでのFacebookで一意なIDではなく、アプリごとに個別のIDに変更されている。ただし、新しいuidを元にFacebookページにアクセスすることはリダイレクトを介して出来るようになっている。（移行の前からの登録ユーザーに関しては新しいアプリ固有のUIDではなく、元々のUIDがアプリ固有のUIDとして設定され返ってくる仕様になっている。）

その他、publish_streamをpublish_actionにしないといけなくなったなどの変更もある。その他、詳細は以下の変更ログとバージョンについての説明を参照。
https://developers.facebook.com/docs/apps/changelog
https://developers.facebook.com/docs/apps/versions


### JavascriptSDKの変更の話

パーミッションとは少し関係ないけれど、JavascriptSDKの話もFacebook APIを使っている多分殆どの人に関係するのでついでに書いておく。

JavascriptSDKが
https://connect.facebook.net/ja_JP/all.js
から
https://connect.facebook.net/ja_JP/sdk.js
に変わった。
これはv1.0が使えなくなるまでに変えないといけない。(今のところFacebookはそう言っている。実際4月に入って動かなくなるサービスがいっぱい出たらまたかわるかもしれないけど)
ja_JPのところはロケールによって、en_USとか適宜変えること。

この時、FB.initをする際にversionを指定する必要があり、`version: "v2.0"`のように明示的に指定する。
さらにFB.initのデフォルトのフラグの値がほとんどtrueからfalseに変わっているので気をつけること。

## 審査の際に気をつけること

審査の際には

- アプリの概要
- プライバシーポリシー
- スクリーンショット最低4枚

が必須条件になっている。
ココらへんの話についての日本語情報は http://snowadays.jp/2014/06/2790 が詳しい。

その他、審査時には、Facebookのポリシーを守っていることも見られる。
このポリシーも、もちろん後出しポリシーなので、例えば、

- Facebook投稿の際に、デフォルトの投稿メッセージを入れておく

といったことは、既に多くのFacebook連携しているサービスが行っていると思うが、こういったものが全て禁止となっている。

これら条件をすべてクリアした上で、各パーミッションについて

- それを取得することが、ユーザーにとってどんなメリットがあるか
- それを取得するまでの細かな手順

を書くことで審査される。

この時に必要のないタイミングで必要のないものを取得するとリジェクトされ、必要なタイミングで取得することを要求される。
ただし、最初にとるのが全面禁止なわけではなく、最初のサインアップ時にとるのが最もふさわしいと認められた場合は可能になる。

## 最後に

実際、ここで書いた内容はFacebookのAPIの変更の一部で全然網羅性はない。
ただ、皆も気づくことが大切なので、Facebook連携サービスを作っている人は

https://developers.facebook.com/apps

を見に行ってみることをオススメします。

v1.0が使えるのは
**2015/4/30** 
までです。
Sublime Text でSQLを整形する

改行などが全くない長〜いSQLは、Sublime Text のプラグイン [SQL Beautifier](https://github.com/zsong/SqlBeautifier) を使って読みやすく整形できます。

※同様の用途で FormatSQL というプラグインもありますが、こちらは私の環境ではうまく動きませんでした。

##使い方

1. Sublime Text にプラグイン [SQL Beautifier](https://github.com/zsong/SqlBeautifier) をインストールします。
1. 整形したいSQLを Sublime Text に貼り付けます。
1. super+k, super+f キーを押します。(Windows/Linux だと ctrl+K, ctrl+f)
1. できあがり

##こんな感じに整形されます

###使用前

```lang:player.sql
select name, job, level, exp, gold, gender from player where id = 12345 and update_date > '2014-12-01';
```

###使用後

```lang:player.sql
SELECT name, job, LEVEL, exp,
                         gold,
                         gender
FROM player
WHERE id = 12345 and
      update_date > '2014-12-01';
````
ReactとDeLorean.jsとACネタでTodoアプリ

[React](http://facebook.github.io/react/) と、Flux フレームワークのひとつである [DeLorean.js](https://github.com/deloreanjs/delorean) 、そして今年のJS関係のアドベントカレンダーのネタをいくつか散りばめて、サンプルレベルのものですが Todo 登録アプリを作成してみました。

主な構成は以下です：

- React(without JSX), DeLorean.js
- CoffeeScript, gulp, webpack
- mocha, power-assert, 実行はnodeで行う
- スタイルは Semantic UI (`ui xxx` のようなクラス指定はこれのルール)
- express のサーバアプリの中の一部分として配置

各要素の連携を確かめたかったので、無駄に gulp を介したり、無駄にサーバサイドを含めて express 上で動かしたり、しています。

----

アプリの内容は、入力フォームに値を入れてEnterすると..

![](http://i.gyazo.com/373669071ba85f8bfe38a504742c9b05.png)

下にどんどん出る、だけです。 ザ・サンプル。

![](http://i.gyazo.com/c5db1938c69ac0cfecb23e74a574cdfa.png)

なお、外部に動かせる環境は建てていません。

----

リポジトリは https://github.com/kjirou/react-deloreanjs-todo-list です。

- client 以下が、SPAなJSアプリの世界
  - これ以下を webpack がビルドして .js にしてくれる
- client 外が、大体 express-generator で生成されたサーバサイドアプリの世界
  - (ちなみに、何これ？という npm パッケージは、大体 experss-generator 実行時に自動で登録したもの)

というディレクトリ構成です。

その中で DeLorean.js のコードは、client/dispacher と client/stores/* 、そして `Flux.mixins.storeListener` を Mix-in している client/views/* が該当します。

本アプリにおいて、DeLorean.js が特にやっていることは、`Flux.mixins.storeListener` による Store インスタンスの共有です。
これはこれで便利ですが、Component 内に設定が残り続けるので、個人的にはあんまり好きじゃないなーと感じてしまいました。


## 以上
Virtual DOM 、あまり関係なくてすみませんでした。

メリークリスマス！
【Excel小技】一歩先行く連番の付け方

利用頻度は割と高いのに、毎回やりかた忘れるので備忘録として・・・


Excelで連番を付ける場合、大抵はオートフィルを使う方が多いかと思います。

でもこれだと、途中の行を削除したり、途中の連番を削除したりした場合に、
以降の連番をいちいち振りなおさないといけなかったり何かと面倒ですよね。よね？？

そんな物臭な皆さんの為に、一歩先ゆく連番の振り方について考えました。

まず、基準となるセルどこでも良いのでに **1** を入れてください。
で、説明をしやすくしたいので、基準セルに **start** って名前を付けます（セルを **右クリック > 名前の定義** できます）。

あとは、連番を振りたい向きによって次の式を入れれば完成！！


**縦**

> =MAX(OFFSET(start,,,ROW()-ROW(start),1))+1

**横**

> =MAX(OFFSET(start,,,1,COLUMN()-COLUMN(start)))+1




やっている事は

> **start** から自身の手前のセルまでの最大値にプラス１する



## 出来る事

次の操作を行っても自動で連番を振りなおしてくれます。

**途中の連番を削除**

> * 途中に帯を入れるなど、歯抜けの行を作りたい場合でも連番を自動で維持してくれます。

**途中の行を削除**

> * 後でこの行いらないと思って行を削除した際など、連番の振り直しが必要ない！！

**行をコピーして挿入**

> * 似た内容をコピーして途中に差し込みたい！！といった時も自動で連番を振りなおします。

## 出来ない事

**行の挿入**

> 新しく行を挿入した場合は、連番用の式がないので連番の振り直しが働かない :scream_cat: 
>> 上のセルなどから、フィルで式をコピーしてあげれば以降の連番も振りなおせます