OmniAICreator/Qiita-1.07M huggingface dataset:
バッファ等の分割処理

ほにゃららwrite()とかを分割するパーツです。

```c:splitter.c
/* Splitter */

#include <stdio.h>

#define		DEBUG_PRINT(...)	printf(__VA_ARGS__)

static void splitter(size_t total_size, size_t split_size)
{
	size_t offset = 0;
	size_t length = split_size;

	DEBUG_PRINT("\nTotal=%u, Split=%u\n", total_size, split_size);

	while (offset < total_size) {
		if (offset + length > total_size) {
			length = total_size - offset;
		}
		/* ex. write() */
		DEBUG_PRINT("  Offset=%d, Length=%d\n", offset, length);
		offset += length;
	}
	return;
}

/* Test Driver */
int main(void)
{
	splitter(   0, 1000);
	splitter(1000, 1000);

	splitter(2000,  999);
	splitter(2000, 1000);
	splitter(2000, 1001);

	return 0;
}
```
Oracle Database 11g Release 2 Client付属のOracle SQL Developerのjava.exeのパスを間違えたときの対処方法

Oracle Database 11g Release 2 Clientに付属しているOracle SQL Developerは、初回起動時にjava.exeのパスを指定しなければなりません。
そこで、__32ビット版のJDK6__のものを指定するのが正しい方法なのですが、ここで間違えてしまうケースがあるかと思います。
そういった場合には、管理者権限でテキストエディタを起動し、`<Oracleベース>\sqldeveloper\sqldeveloper\bin\sqldeveloper.conf`の`SetJavaHome～`の行を削除します。
PythonからJavaScriptに桁落ちなしで浮動小数点数のデータを移す

Pythonで作成した64ビットの浮動小数点数の数値を、そのままJavaScriptに持って行きたいことってありますよね？どっちもIEEE-754の64ビット(符号1ビット、仮数52ビット、指数11ビット)です。

そのまま渡せたらいいんですが、ダンプして10進数で出すと丸めとか行われてしまってうれしくありません。

このエントリーでは、誤差なしでそのまま浮動小数点数渡す方法を詳解します。

実際には、JavaScriptはECMAScriptの仕様で決められていて、PythonはCのdoubleと同じなので、結果としていまあるほとんどのOSの環境で同じフォーマットになっています。

Pythonで浮動小数点数バイト表現の文字列でエクスポートする
-------------------------------------------------------

float64はstruct.packを使ってバイト配列にして、その後formatで16進数の文字列にします。ネットワークバイトオーダーで出しています。

```py:dump.py
>>> import numpy as np
>>> import struct
>>> import binascii
>>> a = np.float64(10.12345456)
>>> binascii.hexlify(struct.pack("!d", a))
'40243f356fa37bf1'
```

今回の説明からは少しはずれますが、復元も次のようにして行えます。

```py:load.py
>>> b = struct.unpack('!d', binascii.unhexlify('40243f356fa37bf1'))[0]
>>> a == b
True
```

JavaScriptでバイト表現の文字列をロードする
------------------------------------------

みなさんおなじみのTypedArrayを使います

```js
>  a = new ArrayBuffer(8)
> b = new Float64Array(a)
> c = new Uint32Array(a)
> d = '40243f356fa37bf1'
> c[0] = parseInt(d.slice(8, 16), 16)
> c[1] = parseInt(d.slice(0, 8), 16)
> b[0]
10.12345456
```

はい。読み込めました。Mac OS X 10.9上のPython 3.4とnode.js 0.12.2で試しました。
Map Fashion


OSMタイルを布に出力してスカートかワンピかタイツかニーハイでもつくろうかと思ってるのでとりあえず事例収集

* [Oneindustries路線図柄ジップアップパーカー総柄・黒](http://e-dracaena.com/?pid=79984296)
* [ニューヨーク地下鉄路線図柄のタイツ](http://digital-memo.blogspot.jp/2013/01/nylon-journal.html)
* [地図柄ミドル丈サーキュラースカート](http://www.fint-shop.com/products/detail6113.html)
* [Skirt patterned with the London Underground](http://underaglasssky.com/2012/08/15/)
EC2 "Retirement Notification"とその対応について

# はじめに

`[Retirement Notification] Amazon EC2 Instance scheduled for retirement [AWS Account: 123456789012]`

上記のような件名でやってくる通知に対して、どういうものなのか？どう対処すれば良いか？について **ざっくりと** 記述します。

# 通知の趣旨

- 使用中のEC2インスタンス(の一部)をホスティングしているハードウェアが劣化した
- 指定の期限(メールに記載)以降は対象インスタンスはUnreadchableになっちゃうよ
- こういう影響があるよ("影響"にて後述)
- 引き続き対象インスタンスにアクセスしたいのであれば次のようなことを実施してね("対処方法"にて後述)

# 影響
## ルートデバイスがインスタンスストアボリュームだった場合
期限が来たら該当インスタンスは *terminate* される。インスタンスストアに保管されたデータは **消去され、復元もできない** 。

## ルートデバイスがEBSボリュームだった場合
期限が来たら該当インスタンスは *stop* される。いつでもrestartできる。

## 共通事項
どっちみち、 *ホスティングしているハードウェアに接続されているインスタンスストアボリューム* に入っているデータは消えてしまう。
通知に該当したインスタンスが↑のどっちのケースに当てはまるのかはマネコンから確認可能。

# 対処
## ルートデバイスがインスタンスストアボリュームだった場合
最新のAMIからインスタンスを起動し、そっちにデータを移行する。
もしくはルートデバイスをEBSに変更する。

## ルートデバイスがEBSボリュームだった場合
AMIを作成して、新しいインスタンスをそのAMIから起動する。詳しくはEC2ユーザーガイドの[AMIのドキュメント](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)にて。

## EC2 Classic 使ってる場合
スキップします。余裕があれば追記します。
OSSのdroneでgitプロトコルを利用してGitLab連携してみた

## 1. Activate不具合対応

droneのマスターブランチを改造して、GitLabの7.12系でもActivateが動くように改造しました。


* [drone](https://github.com/letusfly85/drone/tree/project_id_handle)


## 2. GitLab運用前提

GitLabをAWS上でマルチノードで動かし、その際にELBを利用を前提とします。
このとき、ELBをでは22番ポートではポートフォワーディングができません。。

* [elbの仕様](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/elb-listener-config.html)

## 3. GitLabとDroneの連携についての対応案

droneは、基本的にソースを取得する際にはコンテナ内部から、sshプロトコルでVCS（GitHubやGitLab）にアクセスするみたいです。
また、22番ポート以外は利用できなさそうでした。。

回避策として以下を考えてみました。

* 22番ポートを開放するGitLabインスタンスを一台作成する
* gitプロトコルを利用できるGitLabインスタンスを一台作成する

セキュリティやアクセスポリシーは気になりますが、まずは後者を試しました（鍵管理がめんどい。。）

## 4. Droneのデータベースを直接更新しちゃう

Droneの内部では、reposというテーブルをもっていて、ここに[repo_clone_url]というカラムをもっています。

* [droneのreposのDDL](https://github.com/drone/drone/blob/90de72aacc9502d1fe454c00f9e7d18124b1705a/server/datastore/migrate/migrate.go#L101)

こいつを更新するRESTが今のところ公開されてないので、手でデータベースを更新しました。

```sql
update repos set
  repo_clone_url='git://${git-daemonが動いているインスタンスのIP}/hogenamespace/hogerepo.git'
where
  repo_name = 'hogerepo'; 
```

これで準備がととのいましたので、該当のリポジトリに対してpushしてみました。


行けました。

```
$ git clone --depth=50 --recursive --branch=master git://*.*.*.....
```
PhpStormのFile Watcherでgulp.taskを実行する

compassがあまりすきじゃないので、node-sass (libsass) でコンパイルしたいなー、と思った。

# 経緯
* Node.jsをつかう。
* node-sassをつかう。
* autoprefixer (pleeease) をつかう。
* node-sassってからautoprefixerを動かすのがめんどそうなので、gulpタスクを実行するのがよさそう。
* すでにgulp.taskで以下を用意している。

``` coffeescript:gulpfile.coffee
gulp   = require 'gulp'
coffee = require 'gulp-coffee'
sass   = require 'gulp-sass'
please = require 'gulp-pleeease'

path =
  src:
    scss: __dirname + '/sass/**/*.scss'
  dest:
    css: __dirname + '/css'

gulp.task 'compile-scss', () ->
  gulp.src path.src.scss
    .pipe sass
      outputStyle: 'expanded'
    .pipe please
      autoprefixer: 
        'browsers': ['last 4 versions', 'Android 2.3']
      minifier: false
    .pipe gulp.dest(path.dest.css)
```

# 設定方法
* [Setting > Tool > File Watchers > Add > SCSS]
* 以下を変更。

```conf:FileWatcher
Program: C:\gulp.cmdがあるディレクトリ\gulp.cmd
Arguments: compile-scss
```

こんだけ!

コマンドライン引数を使えば、編集中のファイルのみをコンパイルしたりできます。

```coffeescript:gulpfile.coffee
# 略
minimist = require 'minimist'

args = minimist(process.argv.slice(2))

path =
  src:
    scss: args.PATH_SRC
  dest:
    css: args.PATH_SRC.split(args.FILENAME)[0].replace('sass', 'css')

# 略
```

```conf:FileWatcher
Arguments: compile-scss --PATH_SRC $FilePath$ --FILENAME $FileName$
```
開発環境の「rails s」でサーバを立ち上げるときにunicornを使う方法


こんにちは！　 Rails芸人の[@srockstyle](http://twitter.com/srockstyle)だよ！！！

rails sでサーバが開発用のサーバが立ち上がることは周知の事実ですが、なぜかunicornを起動させたいなーってときがあったりしたときにつらみを感じます。ないんです。

## rails sの開発サーバでunicornを使おう

まずGemfileに追加してください。

```Ruby
gem 'unicorn'
gem 'unicorn-rails'
```

bundleします。

```bash
$ bundle install
```

config/boot.rbを編集します。追記すればいいです。

```ruby
require 'rubygems'
require 'rails/commands/server'

module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Host => '0.0.0.0')
    end
  end
end
```

つまりデフォルトのrails sだとHostはlocalhostが指定されるんですが、unicornはIPで指定しないとコケるんですね。

これを保存してrails sで起動。
http://0.0.0.0:3000/ でUnicornが起動します。

localhostでみたい場合は/etc/hostsとかでひも付けてあげればよいのではないでしょーか。

では楽しいRailsライフを！

参考
 * [cannot bind to 127.0.0.1/0.0.0.0 in Rails 4.2.0](https://github.com/samuelkadolph/unicorn-rails/issues/12)
 * [unicorn-rails](https://github.com/samuelkadolph/unicorn-rails)
FlashからSwiffyへの一括変換についてのメモ

Google Swiffyは死にました。この記事はゴミになりました。



# FlashからSwiffyへの一括変換についてのメモ

(2016/01/22)
  https://www.npmjs.com/package/swiffy-convert
  これを利用するほうが圧倒的にラクできます。


結論：Adobe FlashにJavaScript APIがあるのでそれを使うと何とかなる。

- Swiffy公式よりSwiffyのAdobeエクステンションを落す。
- AdobeFlashエクステンションマネージャーでXZP形式に変換する。
- XZP拡張子をzip拡張子に変換してunzipで解凍する。
- 解凍されたディレクトリの中からjsflファイルを探す。

あとはそのjsflファイルをコピーして、配列などで変換したいファイルをSwiffyの変換処理にfor文などを使ってぶん回す！

作ったjsflファイルを実行するには下記のページが参考になる。

 [Adobe Flash Professional * JavaScript API の操作](http://help.adobe.com/ja_JP/flash/cs/extend/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fe8.html)

ページ内の説明で1つだけ意味不明だったところのメモ
> tell application "flash"
> open alias "Mac OS X:Users:user:myTestFile.jsfl" 
> end tell

※ Adobe Flash CS6.appで「Mac OS X」というボーリュームの /Users/user/myTestFile.jsflというファイルを実行する。という感じの意味になる。

上記のファイルを実行する場合はターミナルで「osascript 作成したスクリプト」でOKです。


約250ファイルを手作業で変換することになるかと思って焦ったお話でした。
Adobe Flash CS6を使わずに変換する方法を探しているが、見つかりそうにないのでこれで妥協です。(Ajax使って公式サイトにぶん投げまくるってのはやらない。)
Concernsに切り出したmoduleのなかでActiveRecordのScopeを使う方法


こんにちは！　Rails芸人（仮）の@srockstyleです！

concern内にあるmoduleに切り出したメソッドでScopeつかいたーい、なんて時に使う方法です。

```ruby
module TestModule
	extend ActiveSupport::Concern
	def self.included(base)
    	base.class_eval do
      		scope :testerexe, -> do 
      			where(deleted_at: nil)
      		end

      		scope :testabexe, -> do 
      			where(created_at: nil)
      		end
      		
      		scope :testcdexe, -> do 
      			where(updated_at: nil)
      		end
      	end
	end
	
	## ここでScope読み込めちゃう
	def self.test
		User.testcdexe
	end
end 
```

複数モデルから参照するときは、whereなどでつかうカラムがあったりなかったりすることに気をつけて下さい。

以上、あまりRailにのってないかもしれないConcernの使い方でした。
MySQLのFLOAT、DOUBLE（5.0.3より前ではDECIMALも）は注意して扱う


自分のためのメモ

## System

```
mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| innodb_version          | 5.6.22   |
| protocol_version        | 10       |
| slave_type_conversions  |          |
| version                 | 5.6.22   |
| version_comment         | Homebrew |
| version_compile_machine | x86_64   |
| version_compile_os      | osx10.9  |
+-------------------------+----------+
7 rows in set (0.01 sec)
```

## What happens?

### ユーザのスコアテーブルを考えましょう

```sql
CREATE TABLE IF NOT EXISTS `scores` (
`id` int(10) unsigned NOT NULL,
  `score` double NOT NULL,
  `user_id` int(11) NOT NULL
);

INSERT INTO `scores` (`id`, `score`, `user_id`) VALUES
(1, 2, 1),
(2, 0.2, 2),
(3, 3, 2),
(4, 0.2, 2);
```

```
mysql> SELECT * FROM `scores`;
+----+-------+---------+
| id | score | user_id |
+----+-------+---------+
|  1 |     2 |       1 |
|  2 |   0.2 |       2 |
|  3 |     3 |       2 |
|  4 |   0.2 |       2 |
+----+-------+---------+
4 rows in set (0.00 sec)
```

### 合計しましょう

```
mysql> SELECT SUM(`score`) AS `total_score` FROM `scores`;
+-------------+
| total_score |
+-------------+
|         5.4 |
+-------------+
1 row in set (0.00 sec)
```
想定どおり

### ユーザ毎に合計しましょう

```
mysql> SELECT SUM(`score`) AS `total_score_per_user`, `user_id` FROM `scores` GROUP BY `user_id`;
+----------------------+---------+
| total_score_per_user | user_id |
+----------------------+---------+
|                    2 |       1 |
|   3.4000000000000004 |       2 |
+----------------------+---------+
2 rows in set (0.00 sec)
```
！！！

## Why?

`FLOAT`、`DOUBLE` はおおよその値である（5.0.3 より前では `DECIMAL` は文字列として保存されるが、計算は `FLOAT` として計算される）ため

## Reference sites

- https://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
SalesCubeでフォームから入力したリクエストパラメータをActionにて受け取る方法

EditBankを例に説明する。

EditBank関連ファイルで編集が必要なものは、下記である。

	editBank.jsp
	AbstractEditAction.java
	BankDto.java
	MasterEditDto.java
	EditBankForm.java

既存の入力項目に、任意の入力項目を追加する場合は、
上記の５ファイルに対して変更が必要である。

以下、それぞれのファイルの変更内容を記載する。


●editBank.jsp

	<tr>
		<th><div class="col_title_right">やまと</div></th>
		<td colspan="3">
			<input type="text" name="yamato">
		</td>
	</tr>

●AbstractEditAction.java

	DTOCLASS dto = this.createDtoFromActionForm();
	String ss = dto.getYamatoName();
	java.lang.System.out.println("Oh! Java yamatoken ss: "+ss);

●BankDto.java

	public String yamato;

●MasterEditDto.java

	String getYamatoName();

●EditBankForm.java

	@Required
	@Maxlength(maxlength=20)
	public String yamato;

コンソールには下記のように表示される。
（フォームから　ほげたろう　と入力した場合）

	Oh! Java yamatoken ss: ほげたろう
Slackを更に効率よく使うための便利機能



## 未読のチャンネルへ移動

> option + shift + up/down

未読チャンネルへの上下移動ができます。

すべての操作をキーでやりたい方には必須ですね。
ちなみにこの記事の中で **最もよく使う機能** です。



## チャンネルへの上下移動
> option + up/down

すべてのチャンネルへの上下移動ができます。

こちらは並んでいる未読でないチャンネルをざーっと見たいときなどに使いますね。
例えば返信し忘れがないかを確認するときとか。



## チャンネル検索移動

> command + K or T

チャンネル検索移動ができます。

例えば `command + K` `de` `enter` で、
`#developer` に行くことができると思います。
（他のユーザーの名前によってはもう少し入力しなければいけないことがあります）

![7f92072e3256b17b7ae97315c0ad73cc.png](https://qiita-image-store.s3.amazonaws.com/0/66391/db17cd46-bbda-5d34-58cc-20663307dd96.png "7f92072e3256b17b7ae97315c0ad73cc.png")


余談ですが、最近この機能を開くボタンがサイドバーに追加されたと思ったら消えました。




## 時間を24時間表記にする

Slackの時間表記ってちょっとわかりにくいですよね。

![7fe506f57976e96c26058e71553dfb6c.png](https://qiita-image-store.s3.amazonaws.com/0/66391/67b6c7b3-046a-f096-1215-e6ab352ef7cd.png "7fe506f57976e96c26058e71553dfb6c.png")

実際にこんな勘違いも生まれてしまいます。
なので **24時間表記** にしましょう。


設定方法は **Preferences** から、

![bcb6a2d45fd4e782ed583a1e5011c877.png](https://qiita-image-store.s3.amazonaws.com/0/66391/5a875f71-5647-0439-03c4-f87ac13298cd.png "bcb6a2d45fd4e782ed583a1e5011c877.png")

**Messegae Display** タブの
**Show times with 24-hour clock** にチェック

![89996c3bf02f1559bc8100aab4f68a89.png](https://qiita-image-store.s3.amazonaws.com/0/66391/4f96d435-401c-ebe2-2106-a6a51337ae3c.png "89996c3bf02f1559bc8100aab4f68a89.png")

これで一目瞭然ですね。

![7dbc0dd3e70fa96282869b3c56695082.png](https://qiita-image-store.s3.amazonaws.com/0/66391/245914f7-52dd-1820-1034-d2195be932d5.png "7dbc0dd3e70fa96282869b3c56695082.png")



## トピックを強調する

Slackでは `/topic hoge` でチャンネルに詳細を記入することができます。

![3ab677a37812de73546a6572f706d52c.png](https://qiita-image-store.s3.amazonaws.com/0/66391/a0f4c45f-6b02-ca80-9c7b-4f05491044d3.png "3ab677a37812de73546a6572f706d52c.png")



ですがこのトピック、文字が灰色で少し分かりづらかったりするんですよね。

![a74706bd59f6d6563f0b89bd546a512e.png](https://qiita-image-store.s3.amazonaws.com/0/66391/eba0eb85-4e66-5ba9-372f-8bafad1d660d.png "a74706bd59f6d6563f0b89bd546a512e.png")


そこでこの文字にちょっと装飾をしてみましょう。

実はこの`/topic`にも、`ハイライト`や絵文字🐱が使えるんです。
もちろんSlackに登録した専用絵文字も。

このように。

![906120bed596027171e95ee66b8a69a7.png](https://qiita-image-store.s3.amazonaws.com/0/66391/4add6dfe-c9ff-1f07-e49e-9b6c086bc456.png "906120bed596027171e95ee66b8a69a7.png")


文字自体は少し小さくなってしまいますが、個人的にはこちらのほうが分かりやすいかなと思います。



## カラースキーマの変更
以下のように **Preferences** から、

![bcb6a2d45fd4e782ed583a1e5011c877.png](https://qiita-image-store.s3.amazonaws.com/0/66391/a8888285-0e2a-3705-6c20-f525122c30f5.png "bcb6a2d45fd4e782ed583a1e5011c877.png")

**Sidebar Theme** タブでサイドバーの色を変えられます。

![b2fe444d6eafdfc309ed70590b8498f6.png](https://qiita-image-store.s3.amazonaws.com/0/66391/c559f822-7e69-2e31-324f-5e01fa70db8a.png "b2fe444d6eafdfc309ed70590b8498f6.png")


また、Custom Themeで好きな色を設定することもできます。

![0135a103a42bd496e161745eec1514d1.png](https://qiita-image-store.s3.amazonaws.com/0/66391/1500a2c3-2aa4-4493-6a82-dde2ede8bc82.png "0135a103a42bd496e161745eec1514d1.png") ![e2c178256a3c45f3f161d93bf9e78fc8.png](https://qiita-image-store.s3.amazonaws.com/0/66391/916624bb-2c9f-13e9-34d5-a8ea78cda289.png "e2c178256a3c45f3f161d93bf9e78fc8.png")

自分好みの色に染めてあげましょう。

可愛いカラースキーマができたらぜひ教えてください。
「第11回デスマコロシアム」の回答を公開します。

## はじめに
[CodeIQ](https://codeiq.jp/)の[「第11回デスマコロシアム」の結果](https://codeiq.jp/magazine/2015/07/26460/)が発表されたので回答したコードを公開します。

## 前準備
シェル芸を使用して、問題の出力結果から'*'の挿入位置を取得する。

1.問題の出力結果

```lang:bash
$ cat text
br*infuckbra*nfuckbrain*uckbrainfu*kb*ainfuckb*ainfuckb*ainfuckbra*nfuckb*ainfuckbrainfu*kb*ainfuckbrainfuck*br*infuckbra*nfuckbr*infuckbrainfuck*bra*nfuckb*ainfuckbra*nfuckbrainfu*kbrai*fuckb*ainfuckbrai*fuckbra*nfuckbrai*fuckbrainfu*kbrain*uckbra*nfuckbrain*uckbrainfuck*brainf*ckb*ainfuckbrainf*ckbrainfu*kbrainfu*kb*ainfuckbrainfu*kbra*nfuckbrainfu*kbrainfuck*brainfuc*bra*nfuckbrainfuc*brainfuck*brainfuck*brainfu*kb*ainfuck*rainfuckb*ainfuckb*ainfuck*rainfuckbra*nfuckb*ainfuck*rainfuckbrainfu*kb*ainfuck*rainfuckbrainfuck*b*ainfuckb*ainfuckbra*nfuck
```
2.単語を一行毎に分割
　文字に対応しない'*'は単語の直後に置くのが味噌。

```lang:bash
$ !!|gsed -E 's/(ck|\*k|c\*|ck\*)(br|\*r|b\*)/\1\n\2/g'
(中略)
b*ainfuck
brainfu*k
b*ainfuck
brainfuck*
br*infuck
(以下省略)
```
3.'*'の挿入位置を取得
　単語の先頭の文字が0、単語の直後が9となる。

```lang:bash
$ !!|awk '{print index($1,"*")-1}'
(中略)
1
7
1
9
2
(以下省略)
``` 
4.挿入位置を1行にまとめる
　ここで出来上がった数列が素数を先頭から30個繋げたものだと判明する。

```lang:bash
$ !!|tr -d '\n'
2357111317192329313741434753596167717379838997101103107109113
```
## コードの説明
同じ言語を選択した回答者が多いとペナルティが増えるため、前回の回答者が0だったHaskellを選択。しかし、今回は自分も含めて2人だった。(-10)
また、指定の[ideone](http://ideone.com/)では、素数ライブラリが使用できなかったため、数列はコードに直接記述した。
1. 前準備で求めた数列を順番に数値に変換し、
2. 単語"brainfuck"の数値が示す位置に'*'を挿入し、
3. 結果を一行に結合する。
## 提出したコード
"main="より後の部分が評価対象(148文字)

```lang:Haskell
main=putStr$concat$map((\s i->take i s++"*"++drop(i+1)s)"brainfuck")$map(\x->read[x]::Int)"2357111317192329313741434753596167717379838997101103107109113"
```

## 改良版
関数合成と型推論を使うともう少し短く出来た。自分はHeskell初心者なのでこれが限界の模様。

```lang:Haskell
main=putStr$concat$map(((\s i->take i s++"*"++drop(i+1)s)"brainfuck").(\x->read[x]+0))"2357111317192329313741434753596167717379838997101103107109113"
```

2015/7/17追記。
エラトステネスの篩を実装して、もう一寸頑張ってみる。

```lang:Haskell
import Data.Char
main=putStr$concat$map(((\s i->take i s++"*"++drop(i+1)s)"brainfuck").digitToInt)$let f[]=[];f(x:s)=show x++f[y|y<-s,mod y x/=0]in f[2..113]
```

2015/7/18追記。
さらに3文字減った模様。

```lang:Haskell
import Data.Char
main=print$concatMap(((\s i->take i s++'*':drop(i+1)s)"brainfuck").digitToInt)$let f[]=[];f(x:s)=show x++f[y|y<-s,mod y x/=0]in f[2..113]
```

## 最後に
トーナメント結果はベスト16で、豪傑バッジをいただきました。
MongoDB - エラー「code: 13298」の対処方法について

shard構築後の動作確認をするために、insert・findした時にエラーが発生したのでメモ

### 環境
- OS: Ubuntu14.04
- MongoDB: 3.0.4

### shard構成
```
mongos> sh.status()
--- Sharding Status ---
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("55a74b5850ca953287ad16e0")
}
  shards:
	{  "_id" : "set01",  "host" : "set01/mongod11.example.com:27018,mongod12.example.com:27018" }
	{  "_id" : "set02",  "host" : "set02/mongod21.example.com:27018,mongod82.example.com:27018" }
  balancer:
	Currently enabled:  no
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours:
		No recent migrations
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
	{  "_id" : "testdb",  "partitioned" : true,  "primary" : "set01" }
		testdb.collectiontest
			shard key: { "skey" : 1 }
			chunks:
				set01	1
			{ "skey" : { "$minKey" : 1 } } -->> { "skey" : { "$maxKey" : 1 } } on : set01 Timestamp(1, 0)
	{  "_id" : "collectiontest",  "partitioned" : false,  "primary" : "set02" }
mongos>
```

### エラーメッセージ
まずテストデータをinsertしたら以下のエラーメッセージ

```
mongos> use testdb
mongos> db.collectiontest.insert({skey:1, name:"yamada"})
WriteResult({
	"nInserted" : 0,
	"writeError" : {
		"code" : 82,
		"errmsg" : "no progress was made executing batch write op in testdb.collectiontest after 5 rounds (0 ops completed in 6 rounds total)"
	}
})
mongos>
```

そしてfindしたら以下のエラーメッセージ

```
mongos> use testdb
mongos> db.collectiontest.find();
Error: error: {
	"$err" : "setShardVersion failed shard: set01:set01/mongod11.example.com:27018,mongod12.example.com:27018 { errmsg: \"exception: remote client 10.0.22.71:56638 tried to initialize this host (set01/mongod11.example.com:27018,mongod12.te...\", code: 13298, ok: 0.0, $gleStats: { lastOpTime: Timestamp 0|0, electionId: ObjectId('55a7277a6037b3179737b77b') } }",
	"code" : 10429,
	"shard" : "set01"
mongos>
```

### 対応
mongodを再起動すると復旧するとのこと
早速mongodと念のためmongos再起動して実行した結果がこちら

```
mongos> use testdb
mongos> db.collectiontest.insert({skey:1, name:"yamada"})
WriteResult({ "nInserted" : 1 })
mongos> db.collectiontest.find()
{ "_id" : ObjectId("55a7650fa2708fabb9475021"), "skey" : 1, "name" : "yamada" }
```

原因はよくわからなかったので、ご存じの方がおりましたら教えて下さい

### 参考
http://stackoverflow.com/questions/21959365/mongodb-sharded-collection-query-failed-setshardversion-failed-host
GUIでDockerがサクサク使えるKitematicが便利


[Kitematic](https://kitematic.com/)

OSX, WindowsでGUI経由でDockerが使えるようになります。Electronベースらしいのでそのうち他のOSにも対応されるかもしれません。

- 他の人の作ったコンテナのインストール
  - Docker Hubから簡単に検索してダブルクリック
- ホストマシンのブラウザからコンテナ上に立ち上げたサービスを開く
  - 自動でURLが割り当てられる(後述)
- CLIからの操作も可能
  - 左下の`Docker CLI`ボタンより
  - Dockerfileから自前でビルドしたり、複数のコンテナで連携する場合はこちらから

誰かの作ったコンテナを簡単に手元で試してみたい、といったときなどにめちゃくちゃ便利です。複雑なコマンドを覚えるのは便利さを感じてからでいいですね。

![kitematic-01.png](https://qiita-image-store.s3.amazonaws.com/0/3885/08edc0c7-22b2-bd27-31c0-c0a0d8e91876.png "kitematic-01.png")

## インストール

- [Kitematic](https://kitematic.com/)から`Download Kitematic`をクリック。
- .zipを解凍して`Application`ディレクトリに置く
- `Kitematic`をダブルクリックして起動
  - 後は待つだけ(少し時間がかかります)

私はすでにBoot2Dockerを入れていたのでVirtualBoxはインストール済みでしたが入っていない人はその辺りも自動でやってくれるそうです。便利！

## IRuby notebook コンテナを動かす

マウスクリックでどんなサービスでも動かせるようになったのでさっそく試してみます。

ここではインストールが割と大変(でもとても便利)な[IRuby notebook](http://qiita.com/domitry/items/aa348caf993e876a7be5)をローカル環境で動かしてみます。

### コンテナ選択画面で`domitry/sciruby-docker`を入力
すでに他のコンテナを選択している場合は`+ NEW`ボタンを押す

![kitematic-02.png](https://qiita-image-store.s3.amazonaws.com/0/3885/caeabee8-e378-f5cc-e9f0-4d1245e252a1.png "kitematic-02.png")

### `CREATE`ボタンを押してコンテナ作成開始
少し時間がかかった後、以下の画面がでれば成功です。

![kitematic-03.png](https://qiita-image-store.s3.amazonaws.com/0/3885/0e0c8add-5688-48b1-41a1-06cfc3aed099.png "kitematic-03.png")

### コンテナ作成が終わったら sciruby-docker をクリック

右側の歯車ボタンを押すとホスト側にバインドされたURLが出るのでクリックします

![kitematic-04.png](https://qiita-image-store.s3.amazonaws.com/0/3885/677d7b6f-b31c-a2e5-b8a1-64ba363fa532.png "kitematic-04.png")

無事動かすことができました

![kitematic-05.png](https://qiita-image-store.s3.amazonaws.com/0/3885/dbf8b0a5-01d6-e1c9-82cf-1fdc108cc140.png "kitematic-05.png")

## KitematicやVM本体を終了する

Kitematicを終了してもDocker用に起動したVirtualBoxのVMは停止しません。なので不要であればKitematicを終了させてもIRuby notebookは使い続ける事ができます。

VMは割とメモリを食うので不要になったときはVirtualBoxを起動して`dev`というVMを停止すればOKです。(私はよく分からなかったので電源オフしていますが何が適切なんでしょうか・・？)

![kitematic-06.png](https://qiita-image-store.s3.amazonaws.com/0/3885/c3d1187a-0fa5-5881-b8bb-068d4f3ae312.png "kitematic-06.png")

## まとめ
Dockerを使うと他の人が作った便利なコンテナをすぐに手元で動かしてみたり、Dockerfileを書いて環境に依存しない自作のコンテナを作って配布することができます。

細かいコマンドを覚えなくてもそれなりに使えるKitematicはおすすめです。
ionic＋$cordovaOauthが動かない


#**概要**

以下の記事に従い、ionicで$cordovaOauth.twitterを使ってユーザー認証をしようとしたところ、動かない。logにも、`console.log(error);`部分は何も出力されず、nullになってしまう。

* <a href="http://blog.ionic.io/displaying-the-twitter-feed-within-your-ionic-app/" target="_blank">Displaying the Twitter Feed within Your Ionic App | The Official Ionic Blog</a>
* <a href="http://ngcordova.com/docs/plugins/oauth/" target="_blank">ngCordova - Document and Examples - by the Ionic Framework Team</a>

```js
$cordovaOauth.twitter(ConsumerKey, ConsumerKeySecret).then(function(result) {
  console.log('success');
  console.log(result);
}, function(error) {
  console.log('error');
  console.log(error);
});
```


#**解決方法**

<a href="https://github.com/nraboy/ng-cordova-oauth" target="_blank">ng-cordova-oauth</a>のIssueを検索したところ、以下の様な記事を発見。

* <a href="https://github.com/nraboy/ng-cordova-oauth/issues/39" target="_blank">Twitter Ouath · Issue #39 · nraboy/ng-cordova-oauth</a>
* <a href="https://github.com/nraboy/ng-cordova-oauth/issues/96" target="_blank">In App Browser opening to ( and sticking on ) blank screen · Issue #96 · nraboy/ng-cordova-oauth</a>
* <a href="https://github.com/nraboy/ng-cordova-oauth/issues/28" target="_blank">Google errors with "Cannot authenticate via a web browser" · Issue #28 · nraboy/ng-cordova-oauth</a>

これらによると、**ionicの`livereload`を使うな**、ということらしい。

`livereload`せずに`ionic:emulate:ios`を実行して、正常な処理が行われるようになった。
ステップバイステップでLightningコンポーネントを楽しもう！ - モジュール8


# ヘルパーを使ってみよう

コンポーネントにヘルパーを作り再利用する関数をまとめます。

## 画面イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/86505/39bbc829-b82d-6fc8-8c06-5c78371386fb.png" width="50%"/>

## ソース

### Apex

モジュール7のApexクラス(LeadController.cls)を利用します。

### コンポーネント

モジュール6のソース(m06_CallApex)をリファクタリングします。

```xml:m08_Helper.cmp
<aura:component controller="LeadController" implements="force:appHostable">

    <aura:attribute name="leads" type="Lead[]"/>
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

    <h3>リード表示</h3>
    <ui:button label="更新" press="{!c.refresh}"/>
    <ul>
        <aura:iteration items="{!v.leads}" var="lead">
            <li>
                <p>
                    {!lead.Company}<br/>
                    {!lead.LastName}
                </p>
            </li>
        </aura:iteration>
    </ul>
</aura:component>
```

```javascript:m08_HelperController.js
({
    doInit: function(component, event, helper) {
        helper.getLeads(component);
    },
    refresh: function(component, event, helper) {
        helper.getLeads(component);
    },
})
```

ヘルパーは開発コンソール内の右サイドバーで[HELPER]をクリックしてファイルを作成します。

```javascript:m08_HelperHelper.js
({
    getLeads: function(component) {
        var action = component.get("c.findAll");
        action.setCallback(this, function(a){
            component.set("v.leads", a.getReturnValue());
        });
        $A.enqueueAction(action);
    }
})
```


## ポイント

特になし。

## 補足
* P159 コンポーネントのバンドル内のJavaScriptコードの共有

---

:arrow_backward: [モジュール7へ](http://qiita.com/UmekitaForce/private/cbd41a21b072bf799963 "モジュール7") | [モジュール9へ](http://qiita.com/UmekitaForce/private/a293fccd027ef6f08321 "モジュール9") :arrow_forward:
ステップバイステップでLightningコンポーネントを楽しもう！ - モジュール6


# データの一覧を表示してみよう

ApexからLeadデータの一覧を取得し画面に表示します。

## 画面イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/86505/ca37b7c7-61c1-aa0a-467a-c79018c5a0b3.png" width="50%"/>

## ソース
### Apex
```java:LeadController.cls
public class LeadController {

    @AuraEnabled
    public static List<Lead> findAll() {
        return [SELECT Id, LastName, Company FROM Lead ORDER BY LastModifiedDate DESC LIMIT 50];
    }

}
```

### Component
```xml:m06_CallApex.cmp
<!-- controller属性でApexコントローラを指定 -->
<aura:component controller="LeadController" implements="force:appHostable">

    <!-- Leadオブジェクトの配列を属性にもつ -->
    <aura:attribute name="leads" type="Lead[]"/>

    <!-- 表示ライフサイクル中に発火されるinitイベント購読 -->
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

    <h3>リード表示</h3>

    <ul>
        <aura:iteration items="{!v.leads}" var="lead">
            <li>
                <p>
                    {!lead.Company}<br/>
                    {!lead.LastName}
                </p>
            </li>
        </aura:iteration>
    </ul>
</aura:component>
```

```javascript:m06_CallApexController.js
({
    // initイベント処理
    doInit: function(component, event, helper) {
        // Apexコントローラのアクションを取得
        var action = component.get("c.findAll");
        // Apexコントローラ処理後のコールバック設定
        action.setCallback(this, function(a){
            component.set("v.leads", a.getReturnValue());
        });
        // 実行アクションキューに追加
        $A.enqueueAction(action);
    }
})
```

## ポイント

###Apex

コンポーネントからコールするApexでは以下が必要です。

* ```@AuraEnabled```アノテーション
* Staticメソッド

### コンポーネント
componentタグにApexコントローラを指定する属性(```controller="LeadController"```) の追加が必要です。

### コンポーネントコントローラ

* ```c.<Apexメソッド名>```でアクションを取得します。
* ```setCallback```でコールバックの指定が可能です。
* ```$A```はJavaScriptでのAuraオブジェクトの短縮名です。
* ```enqueueAction```では、個々のアクションごとにApexに送信するのではなく、イベントチェーンを処理し、関連する要求をバッチにまとめてからキューのアクションを実行します。

### 注意点
Apexコントローラとコンポーネントコントローラのメソッド名が重複するとエラーになります。

### 表示ライフサイクルイベント

* init: コンポーネント初期化が完了した
* render: コンポーネント表示開始
* afterRender: コンポーネント表示完了
* waiting: サーバ要求が実行された場合
* doneWaiting: サーバ要求への応答待機終了
* doneRendering: 再表示が必要なコンポーネントの再表示が終了

### ```aura:iteration```タグ

繰り返し処理が行えます。

     
## 補足
* P132 表示ライフサイクル中に起動されたイベント
* P173 コンポーネントの初期化時のアクション呼び出し
* P182 Apexの使用
* P188 サーバ側のアクションのコール
* P217 aura:iteration

---

:arrow_backward: [モジュール5へ](http://qiita.com/UmekitaForce/private/44371fdd652b92d3be5e "モジュール5") | [モジュール7へ](http://qiita.com/UmekitaForce/private/cbd41a21b072bf799963 "モジュール7") :arrow_forward:
ステップバイステップでLightningコンポーネントを楽しもう！ - モジュール5


# CSSを使ってみよう

コンポーネントにCSSをあてます。

## 画面イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/86505/b1a2db9c-6485-7bb3-53bb-23cf9e75d925.png" width="50%"/>

## ソース

```xml:m05_CSS.cmp
<aura:component implements="force:appHostable">

    <div class="white">白</div>
    <h3>黒</h3>
    <ul>
        <li class="red">赤</li>
        <li class="blue">青</li>
        <li class="green">緑</li>
    </ul>
</aura:component>
```

CSSは開発コンソール内の右サイドバーで[STYLE]をクリックしてファイルを作成します。

```css:m05_CSSStyle.css
.THIS {
    background-color: black;
}

.THIS.white {
    background-color: white;
}

.THIS .red {
    background-color: red;
}

.THIS .blue {
    background-color: blue;
}

.THIS .green {
    background-color: green;
}
```

## ポイント

### ```THIS```クラス

コンポーネントの最上位要素のクラスです。
これでコンポーネント同士のスタイルの上書きを回避します。

### 外部スタイルシート

コンポーネント外部のCSSを使用するには静的リソースに追加する必要があります。
```<link href="resource/bootstrap" rel="stylesheet"/>```

ちなみに外部JavaScriptライブラリも静的リソースに追加する必要があります。
```<script src="/resource/resourceName" type="text/javascript"></script>```

### ベンダープレフィックス

-moz, -webkitのベンダープレフィックスはLightningで自動的に追加されます。

## 補足

* P48 コンポーネント内のCSS
* P153 CSSリソースの参照、ベンダープレフィックス
* P179 スタイルの追加と削除

---

* P152 マークアップでのJavaScriptライブラリへのアクセス
* P156 JavaScriptライブラリの使用

---

:arrow_backward: [モジュール4へ](http://qiita.com/UmekitaForce/private/e5958c0f79b015b6fb17 "モジュール4") | [モジュール6へ](http://qiita.com/UmekitaForce/private/81734b74809ab876754c "モジュール6") :arrow_forward:
ステップバイステップでLightningコンポーネントを楽しもう！ - モジュール4


# 入力した値を表示してみよう

入力テキストボックスで入力した値を動的に画面に表示します。

## 画面イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/86505/22e8d178-d962-9ff7-a39d-0c7cc68623a6.png" width="50%"/>

## ソース

```xml:m04_InputOutput.cmp
<aura:component implements="force:appHostable">

    <aura:attribute name="target" type="String" default="world"/>
    <h1>Hello, {!v.target}!</h1>

    <ui:inputText aura:id="input" label="名前" value=""/>
    <ui:outputText aura:id="output" value=""/><br/>

    <ui:button aura:id="submit" label="設定" press="{!c.set}"/>

</aura:component>
```

```javascript:m04_InputOutputController.js
({
    set: function(component, event, helper) {

        // 入力コンポーネントから属性値取得
        var inputValue = component.find("input").get("v.value");

        // 入力コンポーネントへ属性値セット
        var output = component.find("output");
        output.set("v.value", inputValue);


        // コンポーネントの属性値取得(仕組みを把握するためのコードでこの変数"target"は利用しない)
        var target = component.get("v.target");

        // コンポーネントの属性値セット
        component.set("v.target", inputValue);
    }
})
```

## ポイント
### 入力コンポーネントの値の取得と設定
コンポーネントから入力コンポーネントの参照を取得し```"v.value"```でアクセスします。

### コンポーネントの属性値の取得と設定
コンポーネントの参照から```"v.<属性名>"```でアクセスします。


## 補足

* P86 入力コンポーネントの概要
* P156 DOMへのアクセス、JavaScriptでの属性値操作

---

:arrow_backward: [モジュール3へ](http://qiita.com/UmekitaForce/private/fd33c41fa1b4c4876a1e "モジュール3") | [モジュール5へ](http://qiita.com/UmekitaForce/private/44371fdd652b92d3be5e "モジュール5") :arrow_forward:
ステップバイステップでLightningコンポーネントを楽しもう！ - モジュール3


# コンポーネントコントローラを使ってみよう

コンポーネントにクライアント側のコントローラを作ります。
(Apexのコントローラはサーバ側のコントローラとなります。)

## 画面イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/86505/254ed22b-3d4a-39db-810b-9a370f5a0fb6.png" width="50%"/>

## ソース

```xml:m03_ClientSideController.cmp
<aura:component implements="force:appHostable">

    <aura:attribute name="switch" type="Boolean" default="false" />

    <h1>ボタンクリックでON/OFF</h1>

    <aura:If isTrue="{!v.switch}">
        <p>ON</p>
        <aura:set attribute="else">
            <p>OFF</p>
        </aura:set>
    </aura:If>

    <ui:button label="{!v.switch ? 'OFFにする' : 'ONにする' }" press="{!c.toggle}"/>
</aura:component>
```

コンポーネントコントローラは開発コンソール内の右サイドバーで[CONTROLLER]をクリックしてファイルを作成します。

```javascript:m03_ClientSideControllerController.js
({
    toggle: function(component, event, helper) {
        var status = component.get("v.switch");
        component.set("v.switch", !status);
    }
})
```

## ポイント

###引数
component, event, helper

### コンポーネント
コンポーネントは以下のリソースをバンドルします。

* コンポーネント または アプリケーション
* コントローラ
* ヘルパー
* CSS
* レンダラ
* 設計
* ドキュメント
* SVGファイル

### コンポーネントの属性へのアクセス
コントローラからコンポーネントの属性にアクセスするにはコンポーネントの参照から```"v.<属性名>"```で取得します。

### 式
アプリケーションやコンポーネント（.app/.cmp）では```{!}```構文を使用します。
コントローラやヘルパーといったJavaScript（.js）では文字列```""```を使用します。

### 条件式
* ```<aura:If>```
* 三項演算子

## 補足
* P71 条件式
* P46 コンポーネントのバンドル
* P72 値プロバイダ
* P216 aura:if

---

:arrow_backward: [モジュール2へ](http://qiita.com/UmekitaForce/private/f8075bfda0453331939e "モジュール2") | [モジュール4へ](http://qiita.com/UmekitaForce/private/e5958c0f79b015b6fb17 "モジュール4") :arrow_forward:
ステップバイステップでLightningコンポーネントを楽しもう！ - モジュール2


# コンポーネントに属性を追加してみよう

コンポーネントに属性を追加します。
コンポーネントの属性はApexクラスのメンバー属性に似ています。

## 画面イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/86505/9e706e74-bb90-926a-91e7-640c0082c38b.png" width="50%"/>

## ソース

```xml:m02_ComponentAttribute.cmp
<aura:component implements="force:appHostable">
    <aura:attribute name="target" type="String" default="world"/>
    <h1>Hello, {!v.target}!</h1>
</aura:component>
```

## ポイント

### ```<aura:attribute>```タグ
コンポーネントの属性です。
```{!v.<属性名>}```でコンポーネントから属性にアクセスできます。

### 値プロバイダ
* v コンポーネントの属性セット
* c 固有のアクションおよびイベントハンドラを含むコンポーネントのコントローラ

## 補足

* P69 式
* P245 サポートされる aura:attribute の型
* P246 基本の型
* P72 値プロバイダ

---

:arrow_backward: [モジュール1へ](http://qiita.com/UmekitaForce/private/8ad7e8cdaa680ec3a05f "モジュール1") | [モジュール3へ](http://qiita.com/UmekitaForce/private/fd33c41fa1b4c4876a1e "モジュール3") :arrow_forward:
ステップバイステップでLightningコンポーネントを楽しもう！ - モジュール1


# まずはコンポーネントを作ってみよう

まずは簡単なコンポーネントを作ります。

## 画面イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/86505/700a0013-df30-8c15-b8a3-9508997b9ae3.png" width="50%"/>

## ソース

```xml:m01_CreateComponent.cmp
<aura:component implements="force:appHostable">
    <h1>Hello, Umekitaforce!!</h1>
</aura:component>
```

## ポイント

### 作成方法
1.開発コンソールでコンポーネント作成します。
[File] > [New] > [Lightning Component]
[Name]に「m01_CreateComponent」と入力しSubmit

2.上記コードをコピペ

3.タブを作成します。
[設定] > [作成] > [タブ] > [Lightning コンポーネントタブ]

4.モバイルナビゲーションタブに追加します。
[設定] > [モバイル管理] > [モバイルナビゲーション]

5.以下のURLで動作を確認します。
https://[ *yourdomain* ]/one/one.app


以降のモジュールでも同じ作業をします。

### implements属性

```
implements="force:appHostable"
```

コンポーネントをSalesforce1のナビゲーションメニューで使用できるようになります。

```
implements="flexipage:availableForAllPageTypes"
```
LightningアプリケーションビルダーやLightningページタブに表示できるようになります。

## 補足
特になし。

---

:arrow_backward: [準備へ](http://qiita.com/UmekitaForce/private/565b5451181d55ed26e2 "準備") | [モジュール2へ](http://qiita.com/UmekitaForce/private/f8075bfda0453331939e "モジュール2") :arrow_forward:
ステップバイステップでLightningコンポーネントを楽しもう！ - 準備


# ハンズオンの準備をしよう！

## Developer Editionアカウントの作成

https://developer.salesforce.com/signup

Lightning コンポーネントを有効化すると、組織のすべての Force.com Canvas アプリケーションが Salesforce1 で動作しなくなります。自前の組織でハンズオンされる方はご注意ください。

## 開発ドキュメントの入手

https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/

v34.0を選択しPDFをダウンロードしてください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/59750/5900effc-7a9c-f637-fe88-57313c5f6250.png" width="50%"/>

## Lightningコンポーネントの有効化

以下の設定を行います。

1. [設定] > [開発] > [Lightning コンポーネント]
2. [Salesforce One で使用される Lightning コンポーネントを有効化 (ベータ)] チェックしてSaveします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/59750/23dde244-24a1-ba11-7033-c7970e0594df.png" width="80%" alt="enebled.png"/>

## 本ハンズオンについて

本ハンズオンにでてくる内容は以下を参考にしています。
[Lightning コンポーネント開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/)
[Salesforce Lightning コンポーネントチュートリアル](http://salesforcedevelopersjapan.github.io/lightning-components-tutorial/)


---

それではハンズオンスタート！

[モジュール1へ](http://qiita.com/UmekitaForce/private/8ad7e8cdaa680ec3a05f "モジュール1") :arrow_forward:
heroku メモ

cakephp3で作ってて、herokuにdeployする時のメモ。

heroku 操作

ログインして、

```bash
heroku login
```


アプリでクリエイトして

```bash
heroku create
```

プッシュして、

```bash
git push heroku master
```

MySQL作って、

```bash
heroku addons:create cleardb
```

シェル立ち上げて

```bash
heroku run bash
```

cakephpのマイグレーションして、

```bash
bin/cake migrations migrate
```

ブラウザで確認

```bash
heroku open
```

ログの確認

```bash
heroku logs
```

うまくいかなくてheroku側を削除したりしてやり直すとき。
gitのremoteの設定に削除したherokuが残ってるのでpushできなくなるので、設定しなおす。

```bash
git remote set-url heroku https://git.heroku.com/heroku-no-git
```

その他、CakePHP3側の設定は以下参照。

http://qiita.com/tektoh/items/90f533c7f2a66e4a3fad

だた、今のところMemcachedを使ったキャッシュ設定がうまくいかない。
ELBの証明書更新時に切断は発生するのか？

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

SSL証明書の期限は大丈夫でしょうか？

AWSですと、WEBサーバーの代わりにELBに登録することもできます。
そこで気になるのはELBのSSL証明書を更新した際に、切断が発生するのかどうかです。

そこで確認したところ、ELB の証明書の更新した場合は新規セッションから有効となり、既存セッションへの影響は受けないそうです。

つまり切断は発生しないようです。

これで安心してSSL証明書の更新ができると思います。
2 つの配列に共通要素が存在するかを確認する

どうも。スプラトゥーン依存症の僕です。

2 つの配列に共通要素が存在するかを確認するために、今までは [くコ:彡](http://www.nintendo.co.jp/wiiu/agmj/) もとい以下のようなコードを書いていました。

```rb
array1 = [1, 2, 3]
array2 = [3, 4, 5]

# ActiveSupport を利用している場合は
# (array1 & array2).present? の方が読みやすいと思います。
(array1 & array2).length > 0 #=> true
```

つまり [Array#&](http://docs.ruby-lang.org/ja/2.2.0/method/Array/i/=26.html) を利用して `array1` と `array2` に共通要素が存在するか調べていました。

しかし、`array1` を主語と見立てたい場合に、より直感的な書き方は無いものかと悩んでいました。
それは `array1.some_method(array2)` のような形式の書き方のことです。
でも Array クラスには `some_method` に該当するようなメソッドは無いしなぁ…。

そんな折、会社で [Set#intersect?](http://docs.ruby-lang.org/ja/2.2.0/method/Set/i/intersect=3f.html) の存在を教えてもらいました。
確かに集合演算なら [Set](http://docs.ruby-lang.org/ja/2.2.0/class/Set.html) クラスについて調べてみればよかったのですね。
あまり馴染みがなかったので盲点でした。
 (せっかく [Effective Ruby](http://www.amazon.co.jp/Effective-Ruby-Peter-J-Jones/dp/4798139823) が Set をおすすめしてくれていたのにね… :scream:) 

というわけで Set#intersect? を用いると、以下のように書き直すことができます。

```rb
array1 = [1, 2, 3]
array2 = [3, 4, 5]

# Set[*array1] は array1.to_set でも OK です。
Set[*array1].intersect?(Set[*array2]) #=> true
```

Array は便利ですが、集合演算に関するコードでは Set も積極的に使っていきたいところですね :blush: 

# 追記

Set#intersect? は Ruby 2.1.0 で Set に新しく追加されたメソッドでした。ナウいね！
[NEWS for Ruby 2.1.0](https://github.com/ruby/ruby/blob/v2_1_0/NEWS) の 279 行目に載っています。
jquery UI Tooltipで独自のクラスを指定してスタイルを設定する


ツールチップごとに異なるスタイルを指定したい時は、”tooltipClass”オプションで追加したいクラスを指定するといい。

```js:sample.js
$(function() {
    $(".test1").tooltip({
        tooltipClass:"ui-tooltip1"
    });
    $(".test2").tooltip({
        tooltipClass:"ui-tooltip2"
    });    
     $(".test3").tooltip({
        tooltipClass:"ui-tooltip3"
    });
     $("#test").tooltip({
        tooltipClass:"ui-tooltip-test"
    });
});
```

```html:sample.html
<p>これは<a class="test1" href="#" title="てすと１">ツールチップのテスト</a>です。ツールチップごとに異なるスタイルを指定しています。</p>
<p>これは<a class="test2" href="#" title="てすと２">ツールチップのテスト</a>です。ツールチップごとに異なるスタイルを指定しています。</p>
<p>これは<a class="test3" href="#" title="てすと３">ツールチップのテスト</a>です。ツールチップごとに異なるスタイルを指定しています。</p>

<p>共通のstyleは".ui-tooltip"クラスで指定しています。</p>
<p><label for="test">test:</label><input id="test" title="test" /></p>
<p>リンクやフィールドをマウスオーバーするとツールチップが表示されます。</p>
```


```css:sample.css
.ui-tooltip{background: #F2FBEF}

.ui-tooltip1{color:red;}
.ui-tooltip2{font-style: italic;}
.ui-tooltip3{font-weight:borld;}
.ui-tooltip-test{background:red;color:white;}
```

サンプル（jsfiddle）：
https://jsfiddle.net/cuf0cunj/
mbed HRM1017 をつかって、Eddystone対応のビーコンを作ってみる

昨日、GoogleからオープンプラットフォームのBeacon技術である[eddystone](https://github.com/google/eddystone/)が発表された。
mbedを使ってEddystone対応のビーコンを作ってみた。

プロジェクトの構成はこんな感じ
![150716-0001.png](https://qiita-image-store.s3.amazonaws.com/0/33220/85cbe4da-f41a-df76-41c7-c8b74d05c309.png)

です。

殻となるmain.cppは

```lang:main.cpp
// mbed HRM1017 Eddystone
// Programed by Kazuyuki Eguchi

#include "mbed.h"
#include "BLE.h"

BLEDevice ble;

static const uint16_t uuid16_list[]        = {0xFEAA};
                                              
const static uint8_t beaconPayload_uid[] = {
    0xaa,
    0xfe,
    
    // UID

    0x00, // Frame Type
    0x00, // Ranging Data
    
    0x01, // NID[0]
    0x02, // NID[1]
    0x03, // NID[2]
    0x04, // NID[3]
    0x05, // NID[4]
    0x06, // NID[5]
    0x07, // NID[6]
    0x08, // NID[7]
    0x09, // NID[8]
    0x0A, // NID[9]
    
    0x11, // BID[0] 
    0x22, // BID[1]
    0x33, // BID[2]
    0x44, // BID[3]
    0x55, // BID[4]
    0x66, // BID[5]
    0x00, // RFU
    0x00  // RFU
};

const static uint8_t beaconPayload_url[] = {
    0xaa,
    0xfe,

    // URL
    
    0x10, // Frame Type
    0x00, // Ranging Data
    0x02, // URL Scheme (http:// = 0x02)
    
    'e',
    'g',
    'u',
    'c',
    'h',
    'i',
    '.',
    'j',
    'p'
};

const static uint8_t beaconPayload_tlm[] = {
    0xaa,
    0xfe,

    // TLM
    
    0x20, // Frame Type
    0x00, // Version
    0x01, // VBATT[0]
    0x00, // VBATT[1]
    0x02, // TEMP[0]
    0x00, // TEMP[1]
    0x03, // ADV[0]
    0x00, // ADV[1]
    0x00, // ADV[2]
    0x00, // ADV[3]
    0x04, // SEC_CNT[0]
    0x00, // SEC_CNT[1]
    0x00, // SEC_CNT[2]
    0x00 // SEC_CNT[3]
};


int main(void)
{
    ble.init();

    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
    
    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
    
    // ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA,beaconPayload_uid, sizeof(beaconPayload_uid));
    ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA,beaconPayload_url, sizeof(beaconPayload_url));
    // ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA,beaconPayload_tlm, sizeof(beaconPayload_tlm));
    
    ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);

    ble.setAdvertisingInterval(160);

    ble.startAdvertising();

    for (;;) {
        ble.waitForEvent();
    }
}
```
Rubyでのインスタンス変数とクラス変数の扱いについて

# Rubyでのインスタンス変数とクラス変数の扱いについて

いきなりコード。

```rb
class Access
  def initialize
    # インスタンス変数を初期化
    @instance = "Access instance var"
    # クラス変数を初期化
    @@class = "Access class var"
  end

  def self.test
    p @instance
    p @@class
  end

  def test
    p @instance
    p @@class
  end
end

obj = Access.new

p "--CLASS--"
Access.test

p "--INSTANCE--"
obj.test
```

実行結果がこちら

```
"--CLASS--"
nil
"Access class var"
"--INSTANCE--"
"Access instance var"
"Access class var"
```

## 解説
上記のコード内では、

1. Accessクラス定義
2. initializeメソッド定義
3. testメソッド(クラスメソッド)定義
4. testメソッド(インスタンスメソッド)定義
5. Accessクラスのオブジェクト作成
6. Accessオブジェクトからtestメソッド呼び出し
7. オブジェクトからtestメソッド呼び出し

という処理を行っています。

Accessクラスのオブジェクトを生成したタイミングで、initializeメソッドにより、インスタンス変数とクラス変数をそれぞれ初期化されます。

それぞれのメソッド内では、初期化したインスタンス変数とクラス変数を呼び出していますが、クラスメソッド内で呼び出したインスタンス変数が__nil__を返しています。

Rubyのインスタンス変数はそのクラスのオブジェクトごとに別々の値を持ちます。
Rubyはクラスもオブジェクトの一種です。
コード内の`self.testメソッド`はAccessオブジェクトの特異メソッドという扱いになり、特異メソッド内で呼ばれるインスタンス変数は、__Accessオブジェクト内のスコープに属しています。__
そのため、クラスメソッド内で呼ばれたインスタンス変数は初期化されていないため、nilを返したというわけです。

ためしに、クラスメソッド内でインスタンス変数を初期化してみます。

```rb
class Access
  def initialize
    # インスタンス変数を初期化
    @instance = "Access instance var"
    # クラス変数を初期化
    @@class = "Access class var"
  end

  def self.test
    @instance = "Access class instance var"
    p @instance
    p @@class
  end

  def test
    p @instance
    p @@class
  end
end

obj = Access.new

p "--CLASS--"
Access.test

p "--INSTANCE--"
obj.test
```

実行結果はこちらです。

```
"--CLASS--"
"Access class instance var"
"Access class var"
"--INSTANCE--"
"Access instance var"
"Access class var"
```

クラス内で同じインスタンス変数を用いていますが、別々の値を表示しており、変数のスコープがことなっていることがわかります。

一方、クラス変数は、そのクラスやそのクラスに紐付いたオブジェクトから共通に呼び出すことができるため、問題なく表示されています。
SlackのAppleWatchアプリ触ってみた

[AppleWatch](http://www.apple.com/jp/watch/)アプリでSlackが対応してたので触ってみた。

# できること

基本はやっぱり通知を受け取るだけ。
DM・mentionの際に、本体がブルッて教えてくれる。

青い方がDM。赤い方がmention。
![Slack-watch1.jpg](https://qiita-image-store.s3.amazonaws.com/0/69809/553e41eb-aae0-4129-37ac-17514ef1eb12.jpeg)

# Replay

一応送れる。
ただし、前述のとおり自分宛てのメッセージを**受け取る**ことを中心に設計されているようなので、簡易的な返信機能しかない。

ちなみにchannelからもらったmentionに対して、ReplayをしようとしてもDMに飛ばされるので、こちらからの発信はDMでしか出来ないようになっていた。

![Slack-watch3.jpg](https://qiita-image-store.s3.amazonaws.com/0/69809/56d4997b-e0bf-6012-e9b4-fd2739bf994f.jpeg)

出来るのは以下の定型文と標準搭載の絵文字と音声？

* Indeed
* Sounds good
* Nope
* `¯\_(ツ)_/¯`
* Be right back
* Nudge



###カスタム絵文字
残念ながら絵文字名が出るだけでした。これ本当しょんぼりした。
![スクリーンショット 2015-07-16 15.46.38.png](https://qiita-image-store.s3.amazonaws.com/0/69809/407d0e88-7459-9401-f27a-33753a94951c.png)
↓
![Slack for iOS Upload.png](https://qiita-image-store.s3.amazonaws.com/0/69809/18340d76-f96c-29d7-df60-bedbfd2ab326.png)

# チームの切り替え

いわゆる**強押し**をすることでメニューが現れて変更ができる

![Slack-watch2.jpg](https://qiita-image-store.s3.amazonaws.com/0/69809/eb143959-6642-01b4-5094-a0910f3fb4d8.jpeg)
Want to use MySQL 5.6 at CircleCI? (Faster version)

Add following settings to `circle.yml`. While well-known existing approaches use `apt-get update`, this configuration directly fetches and installs deb packages.

# CircleCIでMySQL5.6を使うには(高速版)

以下のような設定をするとよいと思います。ググって引っかかる方法でもちゃんと動くんですが、`apt-get update`が必要になってしまい、それなりに時間がかかるのでキャッシュして`dpkg`でインストールという設定を書きました。ご査収のほど、お願いいたします。

dpkgを二回唱えているのはとても大事だから、ではなくなぜだかわからないんですがそうしないと失敗してしまいます。

なお、もうちょっときれいに書けるだろうとは思っているのですが、もちろんpatches welcomeです。


```
dependencies:
  cache_directories:
    - "~/deb"
  pre:
    - mkdir -p /home/ubuntu/deb
    - (cd /home/ubuntu/deb; if [ _8cb5bb1bb2fc1e661c60d67be67330b5 != _`md5sum mysql-server-core-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb  |cut -f1 -d " "` ]; then curl -O  http://ppa.launchpad.net/ondrej/mysql-experimental/ubuntu/pool/main/m/mysql-5.6/mysql-server-core-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb; fi)
    - (cd /home/ubuntu/deb; if [ _c2df384f3715ad0e2463b693003ad5f3 != _`md5sum mysql-server-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb  |cut -f1 -d " "` ]; then curl -O  http://ppa.launchpad.net/ondrej/mysql-experimental/ubuntu/pool/main/m/mysql-5.6/mysql-server-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb; fi)
    - (cd /home/ubuntu/deb; if [ _317a22c2d55c6cf0c8e79b3dd1b2353b != _`md5sum mysql-client-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb  |cut -f1 -d " "` ]; then curl -O  http://ppa.launchpad.net/ondrej/mysql-experimental/ubuntu/pool/main/m/mysql-5.6/mysql-client-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb; fi)
    - (cd /home/ubuntu/deb; if [ _ea268ff1fa0dd1000cfe3b8c50d44ce9 != _`md5sum mysql-common_5.6.14+dfsg-1+debphp.org~precise+1_all.deb  |cut -f1 -d " "` ]; then curl -O  http://ppa.launchpad.net/ondrej/mysql-experimental/ubuntu/pool/main/m/mysql-5.6/mysql-common_5.6.14+dfsg-1+debphp.org~precise+1_all.deb; fi)
    - sudo dpkg -r mysql-server-5.5 mysql-server mysql-client-5.5 mysql-client-core-5.5 mysql-server-core-5.5
    - (cd /home/ubuntu/deb; sudo DEBIAN_FRONTEND=noninteractive dpkg -i mysql-server-core-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb mysql-server-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb mysql-common_5.6.14+dfsg-1+debphp.org~precise+1_all.deb mysql-client-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb || sudo DEBIAN_FRONTEND=noninteractive dpkg -i mysql-server-core-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb mysql-server-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb mysql-common_5.6.14+dfsg-1+debphp.org~precise+1_all.deb mysql-client-5.6_5.6.14+dfsg-1+debphp.org~precise+1_amd64.deb)
    - sudo service mysql restart
```
.NET(C#)でALT+Tabを無効化する

.NET(C#)でALT+Tabを無効化する方法です。
WindowsAPIのRegisterHotKeyを使用し、ALT+Tabをホットキーとして登録することで無効化します。
コードを以下のように記述します。

```CSharp:Form1.cs
namespace KeyboardIgnore
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        extern static int RegisterHotKey(IntPtr hWnd, int id, uint vkModifiers, uint vk);

        [DllImport("user32.dll")]
        extern static int UnregisterHotKey(IntPtr hWnd, int id);

        private const int HOTKEY_ID1 = 0x0001;
        private const int HOTKEY_ID2 = 0x0002;
        private const int MOD_ALT = 0x0001;
        private const int MOD_CONTROL = 0x0002;
        private const int MOD_SHIFT = 0x0004;
        private const int MOD_WIN = 0x0008;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // ホットキーの登録
            RegisterHotKey(this.Handle, HOTKEY_ID1, MOD_ALT, (uint)Keys.Tab);
            RegisterHotKey(this.Handle, HOTKEY_ID2, MOD_ALT | MOD_SHIFT, (uint)Keys.Tab);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // ホットキーの登録解除
            UnregisterHotKey(this.Handle, HOTKEY_ID1);
            UnregisterHotKey(this.Handle, HOTKEY_ID2);
        }
    }
}

```

なお、Windows7の場合は視覚スタイルを無効にしておかないとRegisterHotKeyが失敗するようです。
私はここで結構ハマったのでご注意ください。:joy:
1.スタート
2.コンピュータを右クリック
3.プロパティ
4.システムの詳細設定（画面左側）
5.詳細設定タブ（システムのプロパティ）
6.パフォーマンスの「設定」をクリック
7.視覚効果タブ（パフォーマンス オプション）
8.「ウィンドウとボタンに視覚スタイルを使用する」のチェックを外す
DateTimeオブジェクトのコンストラクタにUNIX_TIMEを渡した時の謎挙動


[マニュアル](http://php.net/manual/ja/datetime.construct.php)にもしれっと書いてあるんだけど、DateTimeオブジェクトのコンストラクタにUNIX_TIMEを渡すとタイムゾーンがUTCになってしまう。

```php
$dateTime = new DateTime( '@' . time() );
```

こんな感じに

```php
$dateTime = new DateTime( '@' . time(), , new DateTimeZone( 'Asia/Tokyo' ) );
```

コンストラクタでタイムゾーンを指定してもさくっと無視される。

なので、

```php
$dateTime = new DateTime( '@' . time() );
$dateTime -> setTimezone( new DateTimeZone( 'Asia/Tokyo' ) );
```

みたいに、後からタイムゾーンを設定してやる必要がある。

地味にハマってしまった。