OmniAICreator/Qiita-1.07M huggingface dataset:
Google Spreadsheet + Google Apps Scriptで席替えアプリ

さて，初記事です．笑　研究室で定期的に席替えをすることになってるんですが，席決めたり記録したりするのめんどくさいよねってことでボタンひとつでどっちもやってくれるアプリ（？）をGoogle Spreadsheet + Google Apps Scriptで書いてみました．実際に使うかどうかは微妙です．笑

# Google Apps Scriptとは？
[Google Apps Script](https://developers.google.com/apps-script/?csw=1)とは，Googleのサービス（CalenderとかSpreadsheetとか）と連携して動かすことのできるスクリプトです．Javascriptで書けるので学習コストが低くて嬉しいですね．使い方は[API Reference](https://developers.google.com/apps-script/overview)を見ればだいたい分かるのではないかと．今回はこのGoogle Apps Scriptを使って席替えアプリを作っちゃおうというわけです．

# 書いてみる

とりあえずScript Editiorを開きましょうと．


![Screen Shot 2015-01-06 at 18.09.29.png](https://qiita-image-store.s3.amazonaws.com/0/46036/f0d75f53-1467-0962-dca0-01f0fc056e0b.png)


すると，あんまり使いやすくないこんな感じのエディターが立ち上がります．


![Screen Shot 2015-01-06 at 18.14.08.png](https://qiita-image-store.s3.amazonaws.com/0/46036/7dbeea0d-3965-58b7-ab5d-11e5631291a2.png)


とまあ，後は書くだけですね．


```js

function onClickButton() {
  changeSeat();
};

function changeSeat() {
  var members  = readMembers();
  members = shuffle(members);
  writeSeat(members);
  writeDate();
};

function readMembers() {
  var sheet   = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Members");
  var range   = sheet.getDataRange();
  var values  = range.getValues();
  return values[0];
};

function shuffle(array) {
  var shuffled = [];
  var len;
  while(len = array.length){
    var ele = array.splice(Math.floor(Math.random() * len),1)[0];
    shuffled.push(ele);
  }
  return shuffled;
};

function writeSeat(members) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Seat");
  
  // size of seats
  var rows = 2, cols = 5;
  var values = [];
  for(var i = 0; i < rows; i++){
    values[i] = members.slice(i*cols,(i+1)*cols);
  }
  // top left position of seats is 3,3
  var range = sheet.getRange(3, 3, rows, cols);
  range.setValues(values);
};

function writeDate(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Seat");
  var range = sheet.getRange("C7");
  var date = new Date();
  range.setValue(date.toLocaleString());
}
```


席替えのボタンを押したときに`onClickButton()`が発火するようにします．（オブジェクトを右クリックしてassign function）


![Screen Shot 2015-01-06 at 18.20.23.png](https://qiita-image-store.s3.amazonaws.com/0/46036/9ff1ea0b-3bb6-f402-6136-4f05cc3553ef.png)


あら簡単．席替えアプリの完成です．


![Screen Shot 2015-01-06 at 18.22.41.png](https://qiita-image-store.s3.amazonaws.com/0/46036/5b2fa3d9-af5f-ad31-b52d-046c040b6dc0.png)
![Screen Shot 2015-01-06 at 18.25.06.png](https://qiita-image-store.s3.amazonaws.com/0/46036/44a8ec71-b2ce-c722-797b-68659d1c4b61.png)


席数とかの拡張性も皆無ですし完成度が全然高くないですが．．．一応使えるレベルではあるかな？笑　変更履歴とか残したり席数の設定をSpreadsheet側からやったりしようかと思ってましたが，めんどくさくなってしまってやってません．少なくとも戻すボタンはあった方がいい気がする．．．笑　まあ，Google Apps Scriptは初めて書きましたが，意外と便利じゃんって思いました．エディターの完成度はもうちょっと何とかして欲しいな．．

# ソースコードなど
公開の方法がイマイチわかってませんが一応公開しておきます．https://docs.google.com/spreadsheets/d/1L1O56Q3Q2d5jMubXBhhIQjKSkxbSNviSJYusunOhYso/edit?usp=sharing
在室管理をIT化してみた

先日LTで発表した内容をもうすこし細かくまとめ

### 1. 背景

ラボの在室表を誰も使ってなかったのがきっかけ．
在室表というのは，研究室の扉とかに貼ってある「在室」とか「食事」とか「帰宅」とか書いてあるやつ．
人数に対して紙の面積が少ないので，一人あたりのスペースが狭く動かしづらいので面倒くさがって動かさないのが原因だった．

もう一つの理由は，研究時間のログを取る必要性があったこと．
うちの学科では卒業論文を出すときに，研究にどのくらいの時間をかけたか記録を提出しないと行けない．
大概みんな忘れているので，せめていつどのくらい研究室にいたのか分かれば，提出の助けになるんじゃないだろうか．

そこで，在室管理をどうにかログをとる方法を考え始めたのが昨年の7月頃だった気がする．

### 2.作る上での軸
いくつか作る上でぶれてはいけないポイントを考えていた．

1.作る側の手間
作るために必要以上にプログラムを書かせたくない．
コンピュータとかセンサは使い勝手がどんどんよくなってきているので，利用できるところはできるだけ利用して，開発に余計な労力を割きたくなかった

2.使う側の手間
　使う人にも余計な労力を使わせてはならない．というか，すぐに面倒臭がってやらなくなるので，デメリットがない限りそのうち面倒臭がって無駄になりかねない．
　自然に生活しているだけで使えるのが一番．

3.汎用性
　一つ上の内容にも関わるけれど，「これを使うにはこれがないといけません」ってのは避けたかった．
　使うものを限定すればいろんな事ができて効率化もできるんだろうけど，じゃあそれを持ってない人はどうするの？　ってなってしまうのが嫌だった．
　ある程度なら許容できるものが作りたかった．

### 3.アイディア

たぶんこの辺りが一番時間がかかってたところだと思う．

まず最初に考えたのが，距離センサなどを使って着席しているかどうかを判定するという方法．
Arduinoもセンサもあったし作るのは簡単だったけど，みんなの分を揃えるのは大変そうだった．それに，SDカード等を使わなければ単体でログを取れないのも気に食わなかった．
あとは，設置が汚くなりそうとか，閾値の設定が面倒そうだとか，物理的に邪魔になるのが必然的になりそうとか，単刀直入に面倒そうだった．

次に考えたのがカードリーダーで管理する方法．
学生証に非接触ICが入っているのでそれを利用する案もあったが，即決で却下．
リーダー端末を用意しないといけないし，使う人は絶対やらなくなるのが目に見えてた．
しかも次の年から学生証が変わったのでやろうとしなくてよかった．

最終的に辿り着いたのが，スマートフォンを利用する方法．
研究室のLANに接続されれば在室と判定する．
スマートフォンは大学生なら大抵持っているし，持ち歩くので自然に判定できる．しかも無線を使うのでポケットの中に入れっぱなしでも問題ない．

### 4.実装
時間があったらそのうち書く．
iOS で Universal Static Library を作る方法


* 複数のアーキテクチャで作成されたStatic Library （*.aファイル）を一つにまとめることが出来ます。
* 環境ごとに設定ファイルを変更して、Static Libraryを設定する必要がないので便利です。

##作り方

* Xcodeがインストールされている前提（確認済みの Xcodeのバージョンは 6.1.1になります)

1. 実機用バイナリをコマンドラインでビルドします
    * 最近のトレンドに合わせて armv7, armv7s, arm64 としています

    ```bash
xcodebuild -project Test.xcodeproj -sdk iphoneos -configuration Release -arch armv7 -arch armv7s -arch arm64 clean build
    ```


2. シミュレータ用バイナリをコマンドラインでビルドします
    * 最近のトレンドに合わせて i386, x86_64 としています
    
    ```bash
xcodebuild -project Test.xcodeproj -sdk iphonesimulator -configuration Release -arch i386 -arch x86_64 clean build
    ```


3. 上記でビルドした a ファイルを結合

    ```bash
xcrun -sdk iphoneos lipo -create build/Release-iphonesimulator/libTest.a build/Release-iphoneos/libTest.a -output build/Release-universallib/libTest.a

    ```

##確認

1. ただしく出来たか確認

    ```bash
xcrun lipo -info build/Release-universallib/libTest.a

    ```

    この例だと

    ```bash
Architectures in the fat file: build/Release-universallib/libTest.a are: armv7 armv7s i386 x86_64 arm64

    ```


    こんな感じで表示されるはず。
Xcode6でPrefixHeaderを利用する


Xcode6から自動でPrefixHeaderが作成されないようになりました。
pchを利用したい場合は以下のようにします

***
1. pchファイルを作成する
`File > New > File > Other > PCH File`

2. パスを指定する
`PROJECT > Build Settings > Apple LLVM 6.0 - Language > Prefix Header`
*ex)*
`$(SRCROOT)/$(PRODUCT_NAME)/MyProject-Prefix.pch`

3. PrefixHeaderを有効化する
`Build Settings > Apple LLVM 6.0 - Language > Increase Sharing of Precompiled Headers`
の項目を **Yes** にする



**注意**
*$(PRODUCT_NAME)* が指定されていない場合があります。
その場合は、
`Build Settings > Packaging > Product Name`
を指定します。
また、 *$(SRCROOT)* 以下のディレクトリ構成を変更している場合は、
それに合わせてPathの指定をします
Emacsの管理

####emacs 24以上を対象とする
---

#Emacsの基本

```emacsの設定ファイルの場所
~/.eamcs.d/init.el
~/.emacs.d/elpa/この下に拡張機能のlispが入る
```
init.elに追記して好きな拡張機能を追加していこう

#Emacsの拡張方法の基本
パッケージ管理ソフトを使う

- パッケージインストール

```emacs起動中に
M-x package-install [ret]
パッケージ名
```
これで自動でパッケージがインストールされる。
注:M-xはMeta(escape)+xのこと
[ret]はリターンキー

- パッケージを反映

```init.el
(require 'パッケージ名)
```

---
- パッケージ管理ソフトのパッケージライブラリの設定(init.elの先頭に書いておこう)
標準のパッケージリストはelpaというやつだが、これでは少ないので非公式のパッケージリストmarmaldeとmelpaを追加する。

```init.el
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

```

- パッケージリストを最新のものに更新(installでエラーが出た場合はリストが古い可能性がある)

```emacs起動中に
M-x package-refresh-contents
```


###補足
- init.elをgitで管理すればいい。elpa/は管理しない
- 管理にCaskというのがあるが、ここでは標準的でわかりやすいpackage.elを使う方法を紹介した。
Swiftでファイル/ディレクトリの更新日付やサイズを取得するには


## 結論

これで良さそう。

```swift:
let path = "..."         
if let attr: NSDictionary = NSFileManager.defaultManager().attributesOfItemAtPath(path, error: nil) {
     println(attr.fileModificationDate())
     println(attr.fileSize())
}
```

## 事の経緯

関数の定義を見ると

```swift:Swift
func attributesOfItemAtPath(path: String, error: NSErrorPointer) -> [NSObject : AnyObject]?
```

というように、戻り値の型が`[NSObject: AnyObject]?`になっているのですが、この辞書型から更新日付などを"お手軽に"取り出す方法が当初解りませんでした。

Objective-Cでは、`NSDirectory`型で結果が得られ、カテゴリで各情報が取り出しやすいようになっていましたが、

```objc:Objective-C

- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);

@interface NSDictionary (NSFileAttributes)

- (unsigned long long)fileSize;
- (NSDate *)fileModificationDate;
- (NSString *)fileType;
- (NSUInteger)filePosixPermissions;
- (NSString *)fileOwnerAccountName;
- (NSString *)fileGroupOwnerAccountName;
- (NSInteger)fileSystemNumber;
- (NSUInteger)fileSystemFileNumber;
- (BOOL)fileExtensionHidden;
- (OSType)fileHFSCreatorCode;
- (OSType)fileHFSTypeCode;
- (BOOL)fileIsImmutable;
- (BOOL)fileIsAppendOnly;
- (NSDate *)fileCreationDate;
- (NSNumber *)fileOwnerAccountID;
- (NSNumber *)fileGroupOwnerAccountID;
@end
```

Swiftだとどうなるんだろう？と思い、調べていくうちにそれらしい補助関数を発見。

```swift:Swift
extension NSDictionary {
    
    func fileSize() -> UInt64
    func fileModificationDate() -> NSDate?
    func fileType() -> String?
    func filePosixPermissions() -> Int
    func fileOwnerAccountName() -> String?
    func fileGroupOwnerAccountName() -> String?
    func fileSystemNumber() -> Int
    func fileSystemFileNumber() -> Int
    func fileExtensionHidden() -> Bool
    func fileHFSCreatorCode() -> OSType
    func fileHFSTypeCode() -> OSType
    func fileIsImmutable() -> Bool
    func fileIsAppendOnly() -> Bool
    func fileCreationDate() -> NSDate?
    func fileOwnerAccountID() -> NSNumber?
    func fileGroupOwnerAccountID() -> NSNumber?
}
```

`[NSObject: AnyObject]?`型から`NSDictionary`型に変換すれば行けそう！ってな所まで来ましたが、どうやって変換すればいいのか判らず...

どうやら、普通に`as`や型指定だけで`[NSObject: AnyObject]`型から`NSDictionary`型へは変換（ブリッジ）できるもよう。

この辺は公式ドキュメントにも載っていました（Dictionaries項目参照）。
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

試したソースも載せておきます。

```swift:Swift
import UIKit

let dic: [NSObject: AnyObject] = ["aaa": "bbb"]
let test1 = dic as NSDictionary // OK
let test2: NSDictionary = dic // OK
```

ということで、`if let`でアンラップしつつ`NSDictionary`型にするという冒頭のコードになりました。
Atom 基本操作 チートシート

備忘録的にまとめました。

## 表示関連

|Short Cut Key|内容|memo|
|---|---|---|
|```⌘``` + ```F2```|現在行をブックマーク|ファンクションキーの設定は Mac OS の環境設定のキーボードから|
|```F2```|次のブックマークに移動||
|```⌘``` + ```⌥``` + ```[```|ブロックを畳む||
|```⌘``` + ```⌥``` + ```]```|ブロックを開く||
|```⌘``` + ```⌥``` + 分割数|Panes - 横分割|分割後に再設定も可能|
|```⌘``` + ```⌥``` + 分割数|Panes - 横分割|分割後に再設定も可能|
|```⌘``` + ```k```  =>   ```←```/```→```/```↑```/```↓```|Panes 分割|分割方向を矢印キーで指定|
|```⌘``` + ```k```  => ```⌘`````` ```+ ```↑``` or ```↓```|Panes 移動|移動方向を矢印キーで指定|
|```⌘``` + ```⌥``` + ```←``` or ```→```|タブの切り替え||
|```⌘``` + ```⌥``` + ```[``` or ```]```|タブの切り替え||
|```⇧``` + ```⌘``` + ```t```|最後に閉じたタブを復元||
|```⌘``` + ```\```|Toggle Tree View（サイドバー表示切り替え）||
|```⌃``` + ```0```|Tree にフォーカス||
|```⇧``` + ```⌘``` + ```⌃``` + ```g```|Style Guide 表示||
|```⌘``` + ```⇧``` + ```p```|コマンドパレット表示|||

## 検索関連
|Short Cut Key|内容|memo|
|---|---|---|
|```⌘``` + ```⇧``` + ```p```|コマンドパレット表示|||
|```⌘``` + ```t```|ファイル検索||
|```⌘``` + ```f```|ファイル内検索・置き換え||
|```⌘``` + ```r```|シンボルへジャンプ||
|```⇧``` + ```⌘``` + ```r```|シンボルへジャンプ（プロジェクト横断）||


## プロジェクト管理
|Short Cut Key|内容|memo|
|---|---|---|
|```⌘``` + ```⌃``` + ```p```|プロジェクトリスト表示|※ 要 [Project Manager](https://atom.io/packages/project-manager)|


## Markdown
|Short Cut Key|内容|memo|
|---|---|---|
|```⇧``` + ```⌃``` + ```m```|Markdown Preview|||

---

# 参考にさせていただいた記事

- [[Mac] Atomの基本的なショートカットキー - Qiita](http://qiita.com/yamagh/items/0fb4e7bbbd3c9ef4d855)
- [GitHub製エディター”Atom”のよく使いそうなキーバインド。（Mac版） | Diglog](http://diglog.org/tool/2453.html)
- [Atom の package で定義されているキーバインドを変更する方法 - Qiita](http://qiita.com/iorionda/items/0f386408fb9591c0ed7f)
- [マイAtomチートシート - Qiita](http://qiita.com/oinume/items/e6aa66fc20183ebeddb4)
[Jenkins] Throttle Concurrent Builds Pluginの使い方メモ

**Throttle Concurrent Builds Plugin**
https://wiki.jenkins-ci.org/display/JENKINS/Throttle+Concurrent+Builds+Plugin

Jenkinsで並列実行を許可している場合に、各ジョブごとに並列実行動作をカスタマイズできる便利プラグイン。
「特定のジョブ同士は並列で実行したくない」場合などに有効。


## ジョブAとジョブBのみ同時に実行させないようにする
### Jenkinsの管理

Jenkinsの管理で同時ビルド数を設定する

```
同時ビルド数: 5（任意の値）
```

Throttle Concurrent Builds設定でカテゴリを作成し、最大同時実行数を1に設定

```
Throttle Concurrent Builds
　Category Name: categoryA
　Maximum Total Concurrent Builds: 1
```

### ジョブの設定

ジョブA/ジョブBでそれぞれ下記の通り設定

```
Throttle Concurrent Builds: 有効
　Throttle this project as part of one or more categories: 選択する
　Maximum Total Concurrent Builds: 0
　Maximum Concurrent Builds Per Node: 0
　Multi-Project Throttle Category: categoryA
```


## ある特定のジョブを最大2つまで並列実行できるようにする

### Jenkinsの管理

Jenkinsの管理で同時ビルド数を設定する

```
同時ビルド数: 5（任意の値）
```

### ジョブの設定

ジョブの並列実行を有効にする

```
ビルドを並行実行: 有効
```

これだけだと、Jenkinsの管理で設定した同時ビルド数の5つまで並列実行できてしまうので以下もあわせて設定する。

```
Throttle Concurrent Builds: 有効
　Throttle this project alone: 選択する
　Maximum Total Concurrent Builds: 2
```
【質問】GoogleAnalyticsでのアプリ解析方法

アプリにGoogleAnalyticsを入れているのですが、
スクリーン名毎のスクリーンビュー数は取得できているのですが、

たとえば、アプリ内で、クリップしてアプリ内で保持している情報を
GoogleAnalyticsで取得する方法はありますでしょうか。

いわゆるPVのページの取得ではなく、
Catalystのカスタムトラフィックみたいなものを想定しています。

あるユーザがある画像をクリップしたときに、その画像のIDとクリップ日時を取得して、
GoogleAnalytics上で見れる、みたいなことがしたいです。

どなたかいいアドバイスを教えていただけないでしょうか。
Mac OS テキスト入力チートシート

備忘録的に。

## キャレット移動
|Short Cut Key|内容|memo|
|---|---|---|
|```⌘``` + ```←```|行頭へ||
|```⌘``` + ```→```|行末へ||
|```⌃``` + ```a```|行頭へ|アルファベットの先頭の「a」|
|```⌃``` + ```e```|行末へ|End の「e」|
|```⌃``` + ```f```|次の文字へ|Forward/Front の「f」|
|```⌃``` + ```b```|前の文字へ|Back の「b」|
|```⌃``` + ```n```|次の行へ|Newx の「n」|
|```⌃``` + ```p```|前の行へ|Previous の「p」|
|```⌥``` + ```→```|次の単語へ||
|```⌥``` + ```←```|前の単語へ||
|```⌘``` + ```↑```|ドキュメントの先頭へ||
|```⌘``` + ```↑```|ドキュメントの後尾へ||
|```fn``` + ```←```|ドキュメントの先頭を見る|キャレットは移動しない|
|```fn``` + ```→```|ドキュメントの最後を見る|キャレットは移動しない|
|```fn``` + ```↓```|次の画面へスクロール|キャレットは移動しない|
|```fn``` + ```↑```|前の画面へスクロール|キャレットは移動しない|
|```fn``` + ```⌥``` + ```↓```|次の画面へスクロール|キャレットも移動|
|```fn``` + ```⌥``` + ```→```|前の画面へスクロール|キャレットも移動|

## テキストの選択

|Short Cut Key|内容|memo|
|---|---|---|
|```⇧``` + ```⌥``` + ```→```|単語の選択|単語の先頭にキャレットがある状態で|
|```⇧``` + ```⌥``` + ```←```|単語の選択|単語の後尾にキャレットがある状態で|
|```⇧``` + ```⌥``` + ```→```|行選択|```⌘``` + ```←``` で行頭にキャレットを移動した後に|
|```⇧``` + ```⌃``` + ```e```|行選択|```⌃``` + ```a``` で行頭にキャレットを移動した後に|
|```⌘``` + ```a```|全てのテキストを選択|All の「a」|

## テキストの編集

|Short Cut Key|内容|memo|
|---|---|---|
|```delete```|キャレットの前の文字を削除||
|```⌃``` + ```h```|キャレットの前の文字を削除||
|```fn``` + ```delete```|キャレットの次の文字を削除|Backspace|
|```⌃``` + ```d```|キャレットの前の文字を削除|Backspace|
|```⌘``` + ```delete```|キャレットの前から行頭までの文字を削除||
|```⌃``` + ```a``` => ```⌃``` + ```k```|行頭へ移動し、行末まで文字を kill|ターミナルの操作時に便利そう|
|```⌃``` + ```o```|改行の挿入|改行が挿入されてもキャレットの位置は変わらない|
|```⌃``` + ```t```|キャレットの左側と右側の文字を入れ替え|||

## kill & yank

|Short Cut Key|内容|memo|
|---|---|---|
|```⌃``` + ```k```|kill|キャレットの位置から行末までの文字を消す|
|```⌃``` + ```y```|yank|kill で消えた文字を貼り付ける|
|```⌃``` + ```k```|任意の選択した文字列を kill|Copy & Paste と使い分ける|

## Terminal（bash）

|Short Cut Key|内容|memo|
|---|---|---|
|```⌃``` + ```a```|行頭へ|※ Mac OS と共通|
|```⌃``` + ```e```|行末へ|※ Mac OS と共通|
|```⌃``` + ```k```|kill|キャレットの位置から行末までの文字を消す ※ Mac OS と共通|
|```⌃``` + ```u```|キャレット位置から行頭までを削除||
|```⌃``` + ```w```|キャレット位置から単語の先頭まで削除||
|```⌃``` + ```d```|キャレット位置の文字を削除|||

## その他

|Short Cut Key|内容|memo|
|---|---|---|
|```⌘``` + ```;```|スペルチェック|マークされた単語の上で右クリックすると正しいスペルの候補が表示|
|任意の文字列上で右クリック|全角／半角切り替え|ユーティリティ => 全角英数に／半角英数に|
|任意の文字列上で右クリック|ひらがな／カタカナ切り替え|ユーティリティ => ひらがなをカタカナに／カタカナをひらがなに|

---

# 参考にさせていただいた記事

- [Macの基礎の基礎: テキスト入力と編集とテキストエディット編 | Stocker.jp / diary](http://stocker.jp/diary/mac-textedit/)
- [テキスト入力が死ぬほどはかどるMacショートカットキー15個 | Find Job ! Startup](http://www.find-job.net/startup/mac-shortcut)
- [[Mac] Atomの基本的なショートカットキー - Qiita](http://qiita.com/yamagh/items/0fb4e7bbbd3c9ef4d855)
エクセルVBAでいろいろ

ファイルを開くダイアログを開いて、選択したファイルのファイル名を変数に入れる。

```vbnet
    Dim ファイル As String

    ChDir ThisWorkbook.Path & "\"
    ファイル = Application.GetOpenFilename("CSVファイル, *.csv")
```

CSVファイルを開いて一行ずつ読み込んでカンマで分割して配列に入れる。

```vbnet
Dim answer(100, 5) As String
Dim str As String
Dim tmp As Variant
Dim cnt As Long

Open ファイル For Input As #1
	Do Until EOF(1) = True
		Line Input #1, str
		tmp = Split(str, ",")
		cnt = cnt + 1
		answer(cnt, 1) = tmp(0)
		answer(cnt, 2) = tmp(1)
		answer(cnt, 3) = tmp(2)
		answer(cnt, 4) = tmp(3)
		answer(cnt, 5) = tmp(4)
	Loop
Close #1
```

印刷範囲を指定する。

```vbnet
ActiveSheet.PageSetup.PrintArea = "A1:J55"
```

正規表現で文字列置換

```vbnet
Set reg = CreateObject("VBScript.RegExp")
pat = "「.+」"
With reg
   .Pattern = pat
   .IgnoreCase = True
   .Global = True
End With

result = reg.Replace("「なにか？」", "")
```


デバッグ用の出力。

```vbnet
Debug.Print "result=" & Result
```
Devlove 2014/12/01 「動画」にまつわる技術・物語 に参加してきた

## 概要
http://devlove.doorkeeper.jp/events/17326
日時：2014/12/01 
会場：東京都千代田区麹町三丁目６番地 住友不動産麹町ビル３号館 6F



## 「動画配信システムの2年間の変化」
スピーカーはDMMの正木さん。DMMでの動画配信業務の2年間を振り返ってみるとのことでした。
資料なしでトークのみだったけど、構成図とか見てみたかった。

**2年間の変化**

* VOD系はDL配信とストリーミングに分岐。
* ライブ配信が後から追加。
* PCからスマホ、タブレット、TVなどデバイスが増加。

**2年前＞iPhone4S向け構成**
　・ストレージx2
　・メディア（配信）サーバーx2
　・ロードバランサーx1
　の構成でアクティブスタンバイを構築。すぐに1組増設が必要になった。

**負荷増大と拡張**

* 最初は高価なストレージ使ったけど、後にクラスタストレージに変更。
* 配信サーバー増強に伴い、ストレージ⇔配信サーバー間の帯域増加。
* サーバーの構成は変わらないけど、機械自体は結構変えた。
* 半年に1回の半額キャンペーン用に専用サーバーを組んだ。
* 現在は配信サーバーが24台くらいある。


**まとめ**

* スマホだけでなく、タブレットやTVも対象になっていくので、トラフィック対策大事。スムースストリームとか。
* 自分で技術を仕入れてアップグレードし続けないとダメ。

----
## 「ゼロからの動画プレイヤー開発」 
スピーカーはMediaLinkPlayerの開発をやってた石田氏。
基礎知識の紹介的な要素が強かった印象です。

**動画再生の基本的なところ**

* TV、DVD、BD、youtube、vine、TV電話など、日常のいろんな所で動画再生が使われているけど、仕組みは大体同じ
* TVだけは、遅延が許されないという制約がある。
* 動画データを圧縮/解凍するのがコーデック。
* コーデックを使うメーカー、ベンダーは、MPEG-LAなどに特許使用料を払わないといけない。
* コーデックは音声と動画を個別に圧縮する。それらをマージするのがコンテナ。
* 動画の3要素はコーデックとコンテナと伝送路。これらを用途で選ぶ。

**動画コーデック**

* MPEG2：DVDとか地デジ
* H.264：スマホなど。MPEG2より高圧縮で高負荷
* H.265：4kTVなど。H.246よりさらに高負荷で、ソフトでは処理が追いつかないかも
* WMV/VC-1：Microsoftのコーデック。WMPなどで採用


**音声コーデック**

* AAC：地デジで採用
* MP2：スカパーで採用
* MP3
* WMA

**コンテナ**

* MPEG2-TS：地デジ用
* MPEG2-PS：DVD。ストリーム蓄積に優れる。
* MP4：ストリームに向かないが、先頭にアドレス情報があるのでランダムアクセスに向く。
* ASF

**動画プレイヤーの基本的な処理**
ただし、ユースケースによって違う事はある。

1. データ読み込み
2. デマスク（コンテナから音と映像を分離）
3. デコード（音声と動画の圧縮を解く）
4. ディスプレイやスピーカーに出力（この時AV同期が実行される）
5. １に戻る

----
## 「サービス開発をして気づいた3つのこと」
スピーカーはスタジオ・アルカナの落合さん。
リプレというサービスを作ったときの事を、３つのテーマで

**職域について**

* リプレをオープンソースカンファレンス用のデモアプリとして開発しようとしたけど、社内コンペで落ちた。
* スカンクワークで作成したけどやる事たくさん。
* リーンキャンパス6枚以上書いた。デザイナーだけどいろんなことをやった。
* 職域が違うと言ってやらなくてよいことなんてないよ。

**問題解決の仕方**

* 上司のコネでRed5使う予定つもりだった。
* FLV生成だとスマホで見れない→ffmpeg使ってMP4にしたいけど、Red5がffmpegと連携しない。
* なので、nginx-rtmp-module採用してRed5捨てました。
* 最初の解決方法にこだわると、かえって問題解決が遅くなる事があるよ！

**サービスを育てる**

* UVP（Unique Value Proposision)が異なってた。
* 限定された人とのやり取りを、（外部に漏れないという意味で）安心して動画を送れるものをUVPと考えてた。
* ママさん間のコミュニティで、全然違う部分(撮影とアップロード同時なので、アップロード待ちの時間がない事)が評価されてた。
* それを受けて、アプリサイトを手直ししたり、機能追加の方向性を考え直した。
* サービスは作って終わり、ではないので、リサーチを怠らずに改善を続けるのが大事。

**まとめ**

* ３つの共通点：目標、目的を見失わない。
* その方が開発やその後の展開を気持ちよく進められる。

----

## ダイアログタイム
テーマごとに３～4人のグループを作って、その話題の中で一人ずつ話をしよう、というセッションです。
なお、主張を押し付けたり、説得したり、論破したりするのは厳禁、というルールがあります。

興味があるグループに集中的に行けるので、聞いただけ、というのになりにくいのですが、4人で順番に話すため、時間が来るとぶつ切りになる感もあります。
LTだとスピーカーの言いっぱなしになりますが、こちらはテクニカルリーダーが一人混じると面白い形式に思えました。
逆に、あまり主張するものがない人同士になると、皆悩みを話すけど誰も答えられない状況になりそうな印象です。


----
# まとめ
セミナー内容については、概要よりな印象でした。
個人的にはもう少し突っ込んだ内容を聞きたかったです。

が、今日得たものを明日の現場に繁栄させよう、というDevLoveのコンセプトは結構面白いと思います。

・初心者は卒業したんだけど、大きなカンファレンスを聞いてもまだピンとこない
・社外のコミュニティに参加したいけど、業界の仕様策定に協力みたいな大きなテーマを扱うところにはちょっと付いていけない

という感じ人が、スキルアップしていくには良い所なのではないかと感じました。
ShinobiLayer: Virtual Serverの作成者や稼動ホストのRack/Slot情報を確認するスクリプト

#はじめに
**仮想サーバーがどのデータセンターで動いているか**という情報だけではなく、更に一歩踏み込んで「**どのサーバールームの、どのラックの、どのスロットで動いているのか**を確認したいのだけど、具体的にどうやれば確認できるのでしょうか？」という話をよく聞きます。
Publicクラウドでこうした情報が欲しいというのはちょっと欲張りな感じがしますが、実はSoftLayerでは確認することができます。とはいっても、ポータルからは確認できないので、APIを使って自分で実装しないといけないのですが、、、そうした実装をするのは敷居が高いという方もいらっしゃるでしょう。
また、**サーバーの注文者を知りたい**という用件もよく聞きますが、こちらもAPIを使って実装する必要があります。こちらもよく利用するにも関わらずポータルからは確認が難しい内容の１つです。
というので、サンプルスクリプトを提供しようと思います。何やっているか分からないよ！っていう方は、是非(今後継続連載予定の）記事もご参考にしていただければ幸いです。
・http://qiita.com/testnin2/items/f04ca0cee9b2f0a8f830

#スクリプト(2015/11/27修正版）
```py:getVsLocation.py
import SoftLayer
from prettytable import PrettyTable

client = SoftLayer.create_client_from_env()

_mask = '''
    id,
    fullyQualifiedDomainName,
    operatingSystem,
    billingItem.orderItem.order.userRecord.username,
    primaryIpAddress,
    primaryBackendIpAddress,
    datacenter,
    serverRoom,
    location.pathString '''

table = PrettyTable(['id',
                     'FQDN',
                     'Operating System',
                     'Owner',
                     'Primary IP',
                     'Backend IP',
                     'DataCenter',
                     'Server Room',
                     'location detail'])

virtualGuests = client['Account'].getVirtualGuests(mask=_mask)
for vg in virtualGuests:
    if ('fullyQualifiedDomainName' in vg and
                'operatingSystem' in vg and
                'billingItem' in vg and
                'primaryBackendIpAddress' in vg and
                'datacenter' in vg and
                'serverRoom' in vg and
                'location' in vg):
        table.add_row([vg['id'],
                       vg['fullyQualifiedDomainName'],
                       vg['operatingSystem']['softwareLicense']['softwareDescription']['longDescription'],
                       vg['billingItem']['orderItem']['order']['userRecord']['username'],
                       vg.get('primaryIpAddress') or "--",
                       vg['primaryBackendIpAddress'],
                       vg['datacenter']['longName'],
                       vg['serverRoom']['longName'],
                       vg['location']['pathString']])

print(table)
```

#実行結果の例
slコマンドが実行できるようになっていることが前提です。
`# python getVsLocation.py`
のようにして実行して下さい。

![VS_locatoin.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/0720932f-a585-3b72-c75c-5c611a92b5da.jpeg)

表の意味

| 列 | 意味 | 
|:-----------|:------------|
| ID | VirtualGuestオブジェクトのID |
| FQDN | 仮想サーバーのFQDN |
| Operating System|仮想サーバーのOS |
| Owner| 仮想サーバーの注文者 |
| Primary IP|仮想サーバーのPublic IP|
| Backend IP|仮想サーバーのPrivate IP|
| DataCenter| 仮想サーバーが存在するデータセンター|
| Server Room|仮想サーバーが存在するサーバールーム|
| location detail|「sng01.rk401.sl11」は、データセンター: SNG01、ラック：rk401、スロット：sl11を、「dal05.sr01.rk05.sl40」は、データセンター: DAL05、サーバールーム：sr01、ラック情報：rk05、スロット情報：sl40を意味していると思われます。サーバーによって、サーバールーム情報が含まれていたり含まれていなかったりする理由は、よく分かりません。。。|
WARCファイルについての情報～Webアーカイブの保存用ファイルフォーマット～

## はじめに

Webクローラ「Heritrix」のアウトプットが.warc.gzファイルなのだけど、
WARCファイルってなんやねん、ってなって調べたのをまとめとく。

## WARCファイルとは？

ひとことで言うと、

* Webアーカイブの保存用ファイルフォーマット
* WARC は「`W`」eb 「`Arc`」hiving に由来
* 国際標準機構（ISO）の国際規格ISO 28500:2009になってる
* Wayback などの WARC 形式に対応したツール使うとオリジナルサイトのように表示できる

ごめん、ひとことじゃなくなってた。

## 関連情報

もう少し詳しく知りたい方は下記サイトをご参考までどうぞ。

* [保存用ファイルフォーマット WARC | ウェブアーカイブのしくみ｜国立国会図書館インターネット資料収集保存事業](http://warp.da.ndl.go.jp/contents/reccommend/mechanism/mechanism_warc.html)

* [ウェブアーカイブの保存用ファイルフォーマットWARCがISO標準に | カレントアウェアネス・ポータル] (http://current.ndl.go.jp/e947)

フォーマット化されているといっても、
なにか複雑な記述に変換されているわけではなくって、中身はただのテキストデータなので、
気になる人は直接テキストエディタなどで開いて見てみたらいいと思う。

それが一番理解が早い。

## おまけ

解析する方法ないかな～と探していて、最初にみつけたのが
Python のライブラリだったので、紹介しておく。さすがでござる。

[warc: Python library to work with WARC files]
(https://github.com/internetarchive/warc)

↑の Readme.rst にも書いてあるけど、ドキュメントもちゃんとあるよ。

[warc: Python library to work with ARC and WARC files — warc 0.1 documentation] (http://warc.readthedocs.org/)

私も実際に動かしてみたけど、サクッと使えたよ。

@heavenshell 先生がサンプルコードくださった。ありがたく掲載させていただきますm(_ _)m

```py3
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import warc

           
def read(path):
    f = warc.open(path)
    for r in f:
        print(r.payload.read())
                       
                       
if __name__ == '__main__':
    read('./test_data/crlf_at_1k_boundary.warc.gz')

```
```html
HTTP/1.1 200 OK
Connection: close
Date: Fri, 18 Feb 2011 23:32:58 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-Powered-By: UrlRewriter.NET 2.0.0
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 4680


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>

</title>
以下略
```

ただ、HTMLの部分のみを取得するメソッドなどはなさそうなので、
それは自分で作らないといけないぽいな～。
（私はHTMLの部分だけを抜き出したかったので・・・。）

Java のライブラリとかも探してみたい。ありそう。

おわり。
nl2br　改行コードを含むデータを表示するのに、HTML の改行タグ<br>を挿入するphp関数

nl2br


http://phpspot.net/php/man/php/function.nl2br.html


phtml上に

<p class="tit"><?= nl2br(escape($title))?></p>

というような感じで書くと、

ウェブページ上で以下のようになる。
○○○○○
××××××

△△△△△△△△△△

DBには、○○○○○\n××××××\n\n△△△△△△△△△△ というデータが入っている。
AWS/EC2の時間をUTC(協定世界時)→JST(日本時間)に変更する


# 1. ハマったこと
AWS上のプログラムで現在日時を取得して、
Salesforce上の日付型項目に日付を入れていたのだが、
UTC(協定世界時)で登録されていたため、日本時間の-9時間で登録されていた。

Salesforceの日付型項目は日付しか表示されないので、
時間がずれていることに気づかなかった。
(午前0時から9時の間にテストをしていれば日付がずれるので気づいたと思われる。)

# 2. 例
▼作成日  (Salesforceの作成タイムスタンプ)
2014/09/11 8:48  
▼開始日  (日付型項目。AWSで現在日時を取得して値をセット)
開始日 2014/09/10  
▼開始日の内訳(計算式)
9/11 8:49 - 9時間 = 9/10 23:49 

# 3. 対処法
インスタンスがAmazon Linuxの場合、AWSにログインして下記コマンドを実行して
EC2の時間をUTC(協定世界時)→JST(日本時間)に変更できる。

##【コマンド】/etc/localtimeを置き換える
    #cp -p /usr/share/zoneinfo/Japan /etc/localtime

##【コマンド】 権限で怒られた場合→sudoコマンドを使用する。
    #sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime

**コマンド実行後、サーバーの再起動をしないと、時間が変更されませんでしたので、忘れずに。**

# 4. 補足：Herokuの時間変更方法
Herokuの場合は下記コマンドで時間変更が可能。

```
heroku config:add TZ=Asia/Tokyo --app [アプリ名]
```
MacのIntelliJ IDEA でGO言語を使う②



さて、新規プロジェクトを作成してみるか。

1.`create New Project`を選択。

![スクリーンショット 2015-01-06 15.04.40.png](https://qiita-image-store.s3.amazonaws.com/0/25562/f8679914-0037-bbdc-a57c-1a1e83608544.png "スクリーンショット 2015-01-06 15.04.40.png")


2.`Go`を選択し、`Next`をクリック。

3.「create a new package」を選択して、適当にパッケージ名を入力する。今回はそのまま、「newPackage」にした。

4.`GOPATH`の設定はそのままで。
   `on Save`はファイル保存時になにをするかを選択できるみたい。フォーマットを自動で整えて欲しいので、
　　画像の通りに選択した。

![スクリーンショット 2015-01-06 15.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/25562/eb52f7a1-9d26-1131-e07c-84656b0dfebd.png "スクリーンショット 2015-01-06 15.07.24.png")

5.SDKの確認画面。設定済みのはずなので、そのまま`NEXT`で。

6.プロジェクト名の入力画面。「test」とした。

7.するとこんな画面が立ちあがり、すでに、サンプルソースまで書いてあります。

![スクリーンショット 2015-01-06 15.51.01.png](https://qiita-image-store.s3.amazonaws.com/0/25562/1eb43d6c-8e58-2058-c9b5-eb6e1f14035b.png "スクリーンショット 2015-01-06 15.51.01.png")

8.左上の緑三角ボタンを押すと実行できます。
あたりまえですが、左下のコンソールに以下のように出力されました。

```
Hello world!
```


やっぽい

##まとめ。

これでありあえず、IntelliJ IDEAでGo言語の開発ができそうです。
次は、ブレークポイントはったりしてみたいなー。

以上。
go言語まとめ（その１）


###変数について
:=は宣言と代入
=は代入

```例)
var a string = "hoge"
//型の省略も可能
var a = "hoge"
a := "hoge"
```

###型

| データ型 | 値 | 
|:-----------|------------:|
| int       |        53 |
| float64     |      10.2 |
| bool       |        false / true |
| nil         |          空 |

###空の値

| データ型 | 値 | 
|:-----------|------------:|
| string       |       "" |
| int     |      0|
| bool       |        false|

###出力
```
fmt.Printf()
```

| データ型 | 値 | 
|:-----------|------------:|
| int       |        %d |
| float64     |      %f |
| string       |        %s |
| bool         |          %t |

```例)
a := 10
b := 1.2
c := "hoge"
var d bool

fmt.Printf("a: %d, b: %f, c: %s, d: %t\n", a, b, c, d)
```

```出力
a: 10, b: 1.2, c: hoge, d: false
```

###関数

######複数の引数
```
n := func (a1, a2 int)(int, int) {
 return a1, a2
}
 ```
 
###即時関数

```
func(name string){
 //処理
}("doguchi")
```

###配列

######初期化

[変数名] := [長さ][型]{値, 値, 値}

```
a := [....]int{100, 200, 300, 400}
```
######長さ
```
len(a)
```
```出力
4
```
######スライス
```
a[1,3]
```
```出力
200 400
```
######スライスの第1引数から最大で切り出せる数
配列aのスライスはa[1, 3]なのでa[1]から配列の最後までの数が返ってくる

```
cap(a)
```
```出力
3
```
######スライスへ代入
```
a[1] = 1
```
```出力
1, 200, 300, 400
```
######スライスに値を入れる
```
 a := []int{100, 200, 300}
 ```
MacのIntelliJ IDEA でGO言語を使う①


デバックしたい！ということで、IntelliJ IDEAを使ってみることに。

##brewのアップデート

まずは、brewのアップデートしておく。


```
# brew update
```

##goのアップデート

[大分前(ほんとに大分前)にbrewでgoを入れたんで](http://qiita.com/puttyo_bubu/items/4e60e42ff041f2474428)、
バージョンを確認してみた。

```
# go version                                                                                                                                                                                                        
go version go1.2.2 darwin/amd64
```

で、最新をチェック。

```
#brew info go
go: stable 1.4 (bottled), HEAD
```

古いじゃん。
アップデートします。

```
#brew upgrade go
==> Upgrading 1 outdated package, with result:
go 1.4
==> Upgrading go
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/go-1.4.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.4.yosemite.bottle.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  http://golang.org/doc/code.html#GOPATH

`go vet` and `go doc` are now part of the go.tools sub repo:
  http://golang.org/doc/go1.2#go_tools_godoc

To get `go vet` and `go doc` run:
  go get golang.org/x/tools/cmd/vet
  go get golang.org/x/tools/cmd/godoc

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
?  /usr/local/Cellar/go/1.4: 4557 files, 134M
```

いけた。バージョン確認。

```
#go version                                                                                                                      
go version go1.4 darwin/amd64
```

```
#which go
/usr/local/bin/go
```

##IntelliJ IDEAのインストール
[ここ](https://www.jetbrains.com/idea/)からIntelliJ IDEA Community Editionバージョンをダウンロードして、
インストール。

###golangのプラグインの追加。
[golang.org support plugin](https://plugins.jetbrains.com/plugin/?idea&id=5047)を
追加する必要があります。

こんな感じ。このwindowは、Preferencesから開けるよ。

![スクリーンショット 2014-12-26 12.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/25562/6e04733b-94ee-8322-145f-d92619a5efd0.png "スクリーンショット 2014-12-26 12.57.13.png")


**※ 2015/01/06 現時点で、最新のGo1.4には対応していないので、1.4で使いたい場合は、**
**[github](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases)からダウンロードすれば使えるよ**

##IntelliJ IDEAにgo言語の設定。

1.以下画像の通り、`project structure`を選択する。

![スクリーンショット 2015-01-06 14.54.32.png](https://qiita-image-store.s3.amazonaws.com/0/25562/70c84bc3-8aee-7414-b68a-9d0a713a76d1.png "スクリーンショット 2015-01-06 14.54.32.png")

2.次に、左のメニューから、`SDKs`を選択し、`+`ボタンを押下して、`Go SKD`を選択。
3.sdkの場所を聞いてくるので教えてあげる。

brewで入れた場合は、基本的に、

```
/usr/local/Cellar/go
```

にバージョン別で入っている。僕の場合は、さっきアップデートしたので、
`1.2.2`と`1.4`が入っていた。

最終的には、以下の場所をSDKとして登録する。

```
/usr/local/Cellar/go/1.4/libexec
```

するとこんな画面に。

![スクリーンショット 2015-01-06 14.58.01.png](https://qiita-image-store.s3.amazonaws.com/0/25562/5a7a674b-9757-f25a-50e5-abdacd07565e.png "スクリーンショット 2015-01-06 14.58.01.png")


##まとめ。
やっと、SDKの設定が終了。
次は新規プロジェクトを作成してみます。次回は[こちら](http://qiita.com/puttyo_bubu/items/5c1572c93d05f506480a)


以上。
MacでGit管理下の複数ファイルの中身を置換


あくまで一つの方法。ほかにも色々やり方はありそう。

例えば、Git管理しているRailsプロジェクト下において、
ルートディレクトリ下の全ファイル内にある"hoge"という文字列を、"fuga"に一括変換したいとする。

`git grep -lz hoge`で"hoge"が含まれるファイル名を連続で出力できるので、
それをパイプで`xargs -0`に渡す。

以下の様な感じ。

```
$ git grep -lz hoge | xargs -0 sed -i '' -e 's/hoge/fuga/g'
```

メソッド名の一括変換とかに使えるかも
緯度経度より距離を（地球の丸さも考えて）求める。

緯度経度から距離を求めるとき、地球の丸さを考慮に入れても地球を真球に近似して良ければ難しいことはありません。

```py3
from math import sin, cos, acos, radians
earth_rad = 6378.137

def latlng_to_xyz(lat, lng):
    rlat, rlng = radians(lat), radians(lng)
    coslat = cos(rlat)
    return coslat*cos(rlng), coslat*sin(rlng), sin(rlat)

def dist_on_sphere(pos0, pos1, radius=earth_rad):
    xyz0, xyz1 = latlng_to_xyz(*pos0), latlng_to_xyz(*pos1)
    return acos(sum(x * y for x, y in zip(xyz0, xyz1)))*radius

Osaka = 34.702113, 135.494807
Tokyo = 35.681541, 139.767103
London = 51.476853, 0.0

print(dist_on_sphere(Osaka, Tokyo)) # 403.63km
print(dist_on_sphere(London, Tokyo)) # 9571.22km
```

さらに精度よく計算したければ、回転楕円体とかで近似する必要があったり、`acos`関数は1近傍で誤差か大きいとか改良の余地はありますが、カジュアルな目的ならこれでそこそこ行けるかと。

とにかく、別に丸みを考慮してもそんな複雑じゃありませんよ、ということで。APIやらライブラリやら使えないときのご参考まで。
SSRS で0x80070542のエラーが発生した場合

SSRSでレポートビルダーを使い、共有データソースを使いレポートを作成しようとしたところ、0x80070542のエラーが発生した。このエラーの日本語のページが見つからなかったので投稿する。
原因はセキュリティの定義が出来ていなかったからで、[msdn](http://msdn.microsoft.com/ja-jp/ja/library/ms365173.aspx)に記事を見つけた。
記事の通り、定義を行うと使えるようになった。
権限を、SQL Server Management Studioで設定する必要があり、さらにレポート管理からサイトの設定でユーザーを追加する必要があった。
また、共有データソースをlocalhostにしたときは、サーバー以外のパソコンからレポート定義すると接続エラーになるので、共有データソースはホスト名 or IPアドレスを指定する。
当然のことながら、サーバーとクライアントのバージョンを合わせないとエラーになる。なぜか1回目はうまく動作したように見えた。sp2とcu1～3が出ていたので、すべて適用して解決した。
SSRS でサブスクリプション再定義時の注意点

共有データソースを消すと、各レポートの共有データソースがすべて無効になってしまった。そこですべてのレポートを消すためフォルダごと消すと、サブスクリプションが削除されてしまった。

再度、サブスクリプションを構成するのに一苦労したので自習書を順次読めばわかることだが記録に残す。

Visual Studio で配信した後、下記の作業をおこなった。Visual Studioで共有データソースは定義済み。

1. Webブラウザから「http://localhost/Reports/」をアクセス
1. データソースフォルダをクリック
1. 変更したい共有データソースをクリック
1. 接続に使用する認証を「レポートサーバーに保存され、セキュリティで保護された資格情報にユーザー名、ADのパスワードをセットを入力して、「データソースへの接続時にWindows資格情報として使用する」をチェック
「データソースへの接続が確立した後に、認証されていうユーザーの権限を借用する」はチェックしない

上記作業を行っていないと、サブスクリプションが新規登録できないようになっている。上記の設定を行うと、上記作業を行った共有データソースをつかったレポートは新規登録ができるようになった。
ビルド設定に応じて特定のファイルを除外する

1. プロジェクト設定の Build Settings 上部にある Levels の右ある + から Add User-Defined Setting を押し、EXCLUDED_SOURCE_FILE_NAMES を定義する
2. Release に *+Debug を設定

このようにすることでReleaseビルド時に *+Debug をファイル名に含むファイルを除外してビルドしてくれる。
情弱なのでHugoをVPSに設置したい


## Hugoとは

http://gohugo.io/

静的なサイトジェネレータ、だって。
Octopress（技術と意識と目線が高いエンジニアのgithub.io行くとたいていコレですよね）みたいなヤツ。

## Githubにホスティングできるのは分かった。私はVPSに置きたいですね。

たいていの記事ではgithubページに置くヤツだった。
ところで私はVPSに置きたいですね。

`hugo server`?

なにこれ、プロセス作っちゃったよ。
これは違いますね。

## 結論：hugoコマンドでpublicディレクトリが生成されるので、それをサーバの任意の場所に設置する

`hugo new site /path/to/site`で作ったディレクトリの中で`hugo -t "任意のテーマ名"`で同ディレクトリにpublicが生成される。
このディレクトリを何らかの方法でホスト用のサーバにアップロードして参照できるようにすればOK

## 日々の投稿ルーチン（情弱スタイル）

* ローカルで記事を書く（個人的にはAtomが好きです）
* `hugo server -w`で`http://localhost:1131`を目視、記事を校正する
* ローカルで`hugo -t "任意のテーマ名"`でhtmlファイルを生成
* 生成されたpublicディレクトリをscpやらrsyncとかでホスト先にアップロードする

アップロード処理は下記のようなスクリプトにしておくと2mmくらい楽です。

```sh:suckscript
#!/bin/bash

# ↓ site-sourceってディレクトリにhugo関連のソースがあるので、そこにcdするようにする
# なので、ここは無視しておｋかも
DIR=$(cd $(dirname ${0})/../../site-source && pwd)
cd ${DIR}
echo ${DIR}

#  
rsync -avz --delete public/ "ログインユーザ名"@"ホスト先のipとか":"ホスト先サーバで設置したいパス"
// 例: rsync -avz --delete public/ awesome_user@"awesomesite.com":"/var/www/awesome/"
```

もちろん、私はこちらの情弱スタイルを採用しています。

## 日々の投稿ルーチン（情強スタイル）

こんなんあるみたい。

http://blog.gopheracademy.com/advent-2014/easy-deployment/

ﾄﾞｯｶｰwwwwwwwとwebhookを使って`git push`をトリガーにデプロイしてくれるヤツ。
かっこいいですね。

なので、私は情弱スタイルを採用しています。
RecyclerViewでスクロールバーの動きがおかしいバグ対処法


`support:recyclerview-v7:21.0.0`のRecyclerViewをスクロールすると、1つ目のアイテムをすぎたところでスクロールバーがジャンプしたり一番下まで行ってもスクロールバーのボトムに変な余白がついてしまったりすることがあります。

何を言っているかわからないと思いますが、つまりこんな感じです。

![ezgif.com-crop.gif](https://qiita-image-store.s3.amazonaws.com/0/15267/8f9fb545-dfb7-2d96-4daf-5cbcd7e0e069.gif "ezgif.com-crop.gif")

結論から言うと、これは **supportライブラリのバグ**です。詳しくは[こちら](http://stackoverflow.com/questions/26823202/recyclerview-scrollbar-jumps-back-to-top-after-first-item)。
すでに修正されているので、supportライブラリのバージョンを`21.0.2`に上げれば直ります。

```
dependencies {
    compile 'com.android.support:appcompat-v7:21.0.2'
    compile 'com.android.support:recyclerview-v7:21.0.2'
}
```
Atomの画面の真ん中の線を消す


Atomの画面の真ん中に白い線がある。

![スクリーンショット 2015-01-06 13.23.31.png](https://qiita-image-store.s3.amazonaws.com/0/31659/a328bd53-9260-cc2d-3356-6b6b8b9c5c5b.png "スクリーンショット 2015-01-06 13.23.31.png")

この線って何？邪魔だから消したい。


## 線の正体は`Wrap Guide`です

要するに、折り返しの目安の線です。


## `Wrap Guide`を非表示にする

設定から`Wrap Guide`を見つけて、`Disable`する。

もしくはPackageごと消す。


## 以上

以上です。


### 補足

3行目の黄色い横線は、自分で選択行をハイライトしている線です。
Docker開発環境のIonicとRippleをnpmからインストールして使う

[IonicのDocker開発環境](http://qiita.com/masato/items/8dda2a874a20228d6f76)のエミュレータに[Apache Ripple](http://ripple.incubator.apache.org/)をnpmからインストールして使います。以前はChromeエクステンションの[Ripple Emulator (Beta)](https://chrome.google.com/webstore/detail/ripple-emulator-beta/geelfhphabnejjhdalkjhgipohgpdnoc)として提供されていました。[Ripple is Reborn!](http://www.raymondcamden.com/2013/11/05/Ripple-is-Reborn)によるとPhoneGap 2.6のあたりから動作が不安定になったようです。それまではBlackberryの開発チームによりメンテナンスされていましたが、2013年の11月に新しくApache Rippleとして生まれ変わっています。

## Linux Mint 17.1 MATEの環境を使う

最初に[Linux Mint 17.1 MATE](http://qiita.com/masato/items/f602b745d305a620a606)に構築したGUIのCordova開発環境へRippleをインストールして確認します。[ripple-emulator](https://www.npmjs.com/package/ripple-emulator)をグローバルにインストールします。

``` bash
$ npm install -g cordova ionic
$ npm install -g ripple-emulator
```

Rippleのバージョンは0.9.24です。

```
$ ripple version
0.9.24
```

## Ionicのサンプル作成

テスト用にIonicのサンプルアプリを作成します。

``` bash
$ mkdir ~/ionic_apps
$ cd !$
$ ionic start ionicTestApp tabs
$ cd ionicTestApp 
$ ionic platform add android
```

## Rippleの起動

`ripple emulate`コマンドを実行するとデフォルトのブラウザが自動的に起動します。`--path`フラグはビルド前の`www`ディレクトリを指定します。

``` bash
$ cd ~/ionic_apps/ionicTestApp/
$ ripple emulate --path www
```

URLは次のようにクエリ文字列に`?enableripple=cordova-3.0.0`が付いています。
http://localhost:4400?enableripple=cordova-3.0.0

![ripple-mint-17.png](https://qiita-image-store.s3.amazonaws.com/0/43745/25a06fc9-c2f5-8374-9396-f72412d1aa00.png)


クエリ文字列を外して、http://localhost:4400をブラウザから開くと通常のionicのアプリになります。

## Docker開発環境で確認

Dockerイメージは[masato/ionic-cordova](https://registry.hub.docker.com/u/masato/ionic-cordova/)を使います。使い捨ての開発環境コンテナを起動します。

``` bash
$ docker run -it --rm --name ionic-env masato/ionic-cordova  bash
```

dockerユーザーにスイッチして、予め作成してあるIonicのサンプルアプリのディレクトリに移動してRippleを起動します。

``` bash
$ su - docker
$ cd /data/ionicTestApp
$ nvm use v0.10
Now using node v0.10.35
$ ripple emulate --path www
```

## ngrokでトンネルする

開発環境コンテナのIPアドレスを確認して、ngrokでトンネルします。

``` bash
$ docker inspect --format="{{ .NetworkSettings.IPAddress }}" ionic-env
172.17.4.93
$ docker run -it --rm wizardapps/ngrok:latest ngrok 172.17.4.93:4400
```

先ほどと同様にクエリ文字列に`?enableripple=cordova-3.0.0`を指定してブラウザから開きます。
http://6e7e14f6.ngrok.com/?enableripple=cordova-3.0.0

![ripple-docker.png](https://qiita-image-store.s3.amazonaws.com/0/43745/cdc1062f-f8cc-a313-cd71-38ffd223c8c0.png)


## まとめ

Cordovaのエミュレーターは起動に時間がかかります。Rippleは起動も速く、GUI開発環境がなくてエミュレータで確認ができるのでDocker開発環境に便利です。
suggest.jsのsubmit機能を取り戻す方法


皆さま，2015年もよろしくお願いいたします。新年一発目はインクリメンタルサーチに関わるこの一本（とか書きながら，このエントリは新年に見られるとは限らんのですな…）

#suggest.jsとは
検索をするときに，Google Suggestっぽく入力補完をしてくれるライブラリです。

 **[suggest.js - 入力補完ライブラリ](http://www.enjoyxstudy.com/javascript/suggest/)**

事前にリストを必要とするので，リストの数が多すぎない時に，ユーザーへの入力補助に便利なツールです。MITライセンスで使用可能です。

#submit機能を取り戻す
suggest.jsでインクリメンタルサーチを実装していたのですが，suggest.jsはあくまで入力補助に特化していたので，submit機能はデフォルトではついていませんでした（説明見落としてたらすみません…）。
なので，PHP等で実装するときに，選択後にsubmitまでしたいときにリターンキーを2回叩いたり，選択リストから目的のものをクリックした後に，Submitボタンを押す必要がありました。色々調べていたら，開発者の方が，submit機能を無くすための設定をしていたので，これを無くせば取り戻せそうだということが分かりました-[テキストエリアでリターンキーを押した際に、submitイベントの発生を抑止する方法](http://onozaty.hatenablog.com/entry/20060202/p1)。
上記ブログを参照の元，プログラムを眺めたら，ちょこっとの変更で出来たので，ちょこっと紹介します。

##リターンキーのsubmit機能を取り戻す。
これは， this._stopEvent(event);をコメントアウトするだけです。
以下，suggest.jsを修正しています。

```suggest.js
…抜粋…
 // key event
  keyEvent: function(event) {

    if (!this.timerId) {
      this.timerId = setTimeout(this._bind(this.checkLoop), this.interval);
    }

    if (this.dispAllKey && event.ctrlKey
        && this.getInputText() == ''
        && !this.suggestList
        && event.keyCode == Suggest.Key.DOWN) {
      // dispAll
      this._stopEvent(event);
      this.keyEventDispAll();
    } else if (event.keyCode == Suggest.Key.UP ||
               event.keyCode == Suggest.Key.DOWN) {
      // key move
      if (this.suggestList && this.suggestList.length != 0) {
 //     ここをコメントに
 //     this._stopEvent(event);
        this.keyEventMove(event.keyCode);
      }
    } else if (event.keyCode == Suggest.Key.RETURN) {
      // fix
      if (this.suggestList && this.suggestList.length != 0) {
//      ここをコメントに
//      this._stopEvent(event);
        this.keyEventReturn();
      }
    } else if (event.keyCode == Suggest.Key.ESC) {
      // cancel
      if (this.suggestList && this.suggestList.length != 0) {
        this._stopEvent(event);
        this.keyEventEsc();
      }
    } else {
      this.keyEventOther(event);
    }
  },

```
## クリックで選択後にsubmit機能を追加
これは，意図的にsubmit機能を与えることで解決させました。
まず，suggest.jsを呼び出しているhtmlのformに名前をつけておきます。
ここでは，"post"としました。

```html
…抜粋…
<form action="results.php" name="post">
  <input id="text" type="text" name="pattern" size="30" value="" autocomplete="off" />
            <div aline="center" id="suggest" style="display:none" tabindex="-1"></div>
　  <input type="submit" value="Search" />
    <input type="reset" value="Reset">
</form>
```

これをsuggest.jsでクリックした際に実行させるようにします。

```suggest.js
…抜粋…
  listClick: function(event, index) {

    this.changeUnactive();
    this.activePosition = index;
    this.changeActive(index);
    post.submit();
    this.clearSuggestArea();
    this.moveEnd();

  },
```

以上でsubmit機能は，復活＆追加できるはずです。
I hope this will be of some help :-)
Webクローラ「Heritrix」のロボット排除プロトコル（REP）について

## はじめに

クローラを使うとき、「ロボット排除プロトコル」を必ず意識しなければなりません。

ということで、
Heritrix のロボット排除プロトコルについて、ドキュメント内の記述を探してみることに。

## ロボット排除プロトコルとは？

参考まで。
[ロボット排除プロトコル（REP）とは？――メタタグやrobots.txtの基礎]
(http://web-tan.forum.impressrd.jp/e/2008/02/27/2710)

## Heritrix のロボット排除プロトコル

おもいっきりトップページに記述があった。大事なことだから、そりゃそうか。

Heritrix - Heritrix - IA Webteam Confluence
https://webarchive.jira.com/wiki/display/Heritrix/Heritrix#Heritrix-Webmasters!

以下、引用と翻訳。

> Webmasters!
> Heritrix is designed to respect the robots.txt exclusion directives and META robots tags,
> and collect material at a measured, adaptive pace unlikely to disrupt normal website activity.

```lang:うっちー翻訳
ウェブマスターのみなさん！
Heritrix は robots.txt が指示する除外ページやメタタグ（REPタグ）を尊重するよう設計されています。
そして、一定でかつ、一般的なウェブサイトの活動を邪魔することがないように適応したペースで資料を集めます。
```

ロボット排除プロトコルに、ちゃんと対応していることが確認できました。

ちゃんちゃん。

おわり。
docker execコマンドでHostからGuestへのファイル転送をする

# 背景
`sshd`等を使わずに、Dockerコンテナ上でtest-kitchenを実行したい等の理由から、
[これを作ったこと](http://marcy.hatenablog.com/entry/2014/12/25/020211)によって得た知見。

ちなみに逆（Guest→Host）は`docker cp`コマンドで正式にサポートされている。

# 前提
- Docker 1.3 or later
- tar (GNU Tar) ※Host, Guest両方

# 方法
`docker exec`コマンドを利用してファイル転送を実現する。

### 簡単な説明
目的のファイル(or ディレクトリ)を`tar`で固めて、
それを標準入力に流し、`docker exec`にパイプで繋いでコンテナ上で展開させる。

### 実際のコマンド例

```shell-session
cd /path/to/host/target && tar cf - ./ | docker exec -i container_id tar x -C /path/to/guest/target
```

もう少しスマートな書き方ありそう…ｗ

# 所感

- `docker exec`を運用で使ったら負け感あるけど、あるとだいぶ便利
- たぶんtarじゃなくてもできる方法は色々ある(特に単体のファイル転送とか)
Rails Gemでsyntax error, unexpected tIDENTIFIER, expecting end-of-inputで詰まったから対処法

Gemfile syntax error on line 6: 
syntax error, unexpected tIDENTIFIER, expecting end-of-input
が出た。
対処法としては
gem 'rails','4.1.0'の'が違うものに変わっていたので詰まっただけだった。
【mysql】view

## Viewの作成

```mysql
create view drink_products
as
select id, name from products where category = 'drink';
```

## Viewの定義の確認

```mysql
show create view drink_products;
```

## Viewの変更

```mysql
alter view drink_products
as
select id, name from products where category = 'drink';
```
createの箇所がalterになっただけで他は同じcreateと同じ構文。
MySQLSocketとかの話

Mac環境下でXAMPP使ってたときにハマったので
備忘録的に

環境：OSX 
コマンドラインでこんな感じに

＜まず、ソケットの位置を表示＞
$ mysql_config --socket　

$ cd /var
$ sudo ln -s /Applications/XAMPP/xamppfiles/var/mysql . 

参考：MacでXAMPPのmysqlでCakePHPを使うとき

http://qiita.com/fumikony/items/092576729efd65c5e315
外部ディスクを、LVMでフォーマットされたルートディレクトリとして拡張


cloud stackとかさくらVPSとかで外部ディスク割り当ててもらった時にやる対応をまとめておく。


## マウントされた既存のディスクを確認

```
# マウントされたディスク確認
% fdisk -l

# 拡張されるターゲットはこいつ
ディスク /dev/vda: 21.5 GB, 21474836480 バイト
ヘッド 16, セクタ 63, シリンダ 41610
Units = シリンダ数 of 1008 * 512 = 516096 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0002e329

# 未フォーマットのボリュームはこいつ
ディスク /dev/vdb: 107.4 GB, 107374182400 バイト
ヘッド 16, セクタ 63, シリンダ 208050
Units = シリンダ数 of 1008 * 512 = 516096 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

# 再確認
% fdisk /dev/vdb
```

## ボリュームを拡張

```
# 物理ボリューム作成
% pvcreate /dev/vdb

# volGroup拡張
% vgextend /dev/mapper/VolGroup /dev/vdb

# 論理ボリュームが拡張されてるか確認
% vgdisplay

# VolGrup-lv_rootに全て割当
% lvextend -l +100%FREE /dev/mapper/VolGroup-lv_root

# 論理ボリュームが拡張されてるか確認
% lvdisplay

# ファイルシステムのリサイズ
% resize2fs /dev/VolGroup/lv_root
```

## 実際に拡張されているか確認

ルートディレクトリがおっきくなってるのが確認できた！

```
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                      114G  843M  108G   1% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/vda1             485M   52M  408M  12% /boot
```
スマホでラジオボタンやチェックボックスを使う場合の注意

通常、フォームを使うときは、labelタグを使って選択しやすくすると思います。
しかし、スマホではlabelで囲った部分をタップしても反応しないことがあるので、ちゃんと対策しないといけません。
これは、labelがタップされるためのものと認識されていないためなようです。

方法は2つあります。

## pointer

cssで指定する。

```css
label{
	cursor:pointer;
}
```

## onclick

labelにonclickを追記する。

```html
<input type="radio" id="sunflower" name="flower" /><label for="sunflower" onclick="">ひまわり</label>
//または
<label onclick=""><input type="radio" name="flower" />チューリップ</label>
```

jQueryで書く。

```jQuery
$("label").click(function() {});
```

jQeryの方が一括指定できるので便利だが、他のjQueryなどと競合する場合もあるので注意。
RSA暗号の全体像


# RSA暗号とは

[公開鍵暗号と電子署名の基礎知識](http://qiita.com/kunichiko/items/ef5efdb41611d6cf7775)で解説したように、RSAというのは公開鍵暗号の具体的な仕様です。

RSAという名前は発明者の３人の名前の頭文字からつけられています。歴史的なところは[RSA暗号に関するWikipediaのエントリ](http://ja.wikipedia.org/wiki/RSA暗号)を参照してください。

# RSA暗号の仕様

## RSA暗号の仕様を管理している人は誰？

RSA暗号は1983年にアメリカで特許が取られていて、RSAセキュリティという会社(現在はEMCコーポレーションに買収されている)がその権利を持っていましたが2000年に特許が切れています。

RSAセキュリティ社がRSAの普及を進めていく中で、PKCSという規格群を制定しました。PKCSとは、Public Key Cryptography Standards の略で、公開鍵暗号のやり方やファイルフォーマットなどを規定しています。

なので、基本的にはPKCSを読めばRSA暗号に関する仕様は網羅されているはずなのですが、PKCSの一部はRFCとしても登録されていたり、また、関連技術仕様が ITU-Tや ISOの仕様としても登録されていたりと、どこを読めば良いのか、何が最新なのかよくわかりません。

## PKCSの全体像

全体像が掴みにくいRSA暗号ですが、やはりRSAセキュリティ社(現、EMCコーポレーション)が策定した PKCSを起点に追いかけていくのが良さそうです。

PKCSは以下のように PKCS #1〜#15の規格からなっています。うち２つは廃案で、一部は他の仕様に引き継がれています。また、一部の規格はRFCにも登録されています。

| 番号    | 説明   | 対応RFC |
|--------|--------|------|
| PKCS #1| RSA暗号に関する標準  | [RFC 3447](https://tools.ietf.org/html/rfc3447) |
| PKCS #2| (廃案)             | |
| PKCS #3| Diffie-Hellman鍵共有に関する標準    | |
| PKCS #4| (廃案)       | |
| PKCS #5| パスワードに基づく暗号化の標準       | RFC 2898 |
| PKCS #6| 証明書のフォーマットの拡張(X.509 v3に引き継がれている?) ||
| PKCS #7| 暗号文や署名のフォーマットに関する標準| [RFC 2315](https://www.ietf.org/rfc/rfc2315.txt) |
| PKCS #8| 秘密鍵のフォーマットに関する標準     | RFC 5208 |
| PKCS #9| 属性タイプの拡張 ||
| PKCS #10| CSR (証明書署名要求)のフォーマットに関する標準 | RFC 2986 |
| PKCS #11| 暗号トークンインターフェースの仕様 | |
| PKCS #12| 個人情報交換のためのフォーマットに関する標準。<br> 秘密鍵と証明書などをセットで保存するためのもので、.p12 という拡張子はこれを表している。||
| PKCS #13| 楕円曲線暗号の標準 (策定中?) | |
| PKCS #14| 擬似乱数の標準 (策定中?)    | |
| PKCS #15| 暗号トークン情報フォーマットの標準  | |


# 公開鍵暗号と電子署名に関わる仕様はどのあたり？

PKCSだけ見てもその仕様の範囲は非常に広いので、全部を読むのは大変です。公開鍵暗号や電子署名に関する知識としてはどのあたりを見ればよいのでしょうか。いくつかピックアップしてみました。

## PKCS #1
公開鍵暗号と電子署名の範囲で一番重要なのは、PKCS #1 です。

PKCS #1は [RFC 3447](https://tools.ietf.org/html/rfc3447) としても公開されています。

## X.509

X.509も公開鍵暗号に関する規格で、カバーする範囲も広いのですが、一般的には「X.509証明書」というコンテキストでのみ使われます。 **X.509** と聞いたら「デジタル証明書のこと」と思ってほぼ間違い無いです。

証明書のフォーマットにつていは、PKCS #6でも触れられているようですが、現在は X.509に引き継がれているようです。

### デジタル証明書とは？
https://webpo.jp のように暗号化されたWebサイトを開くと、ブラウザのアドレスバー付近に鍵のアイコンが表示され、クリックすると証明書の中身を見ることができます。
![スクリーンショット 2014-12-22 18.58.20.png](https://qiita-image-store.s3.amazonaws.com/0/41616/b7850238-b6ec-f93f-6e74-2a3d8567f764.png "スクリーンショット 2014-12-22 18.58.20.png")


このようなデジタル証明書のフォーマットやその署名方法などを規定したのが X.509という規格です。
公開鍵暗号をプログラムで扱う方法のまとめ


RSAの公開鍵暗号や電子署名の仕組みを使ったプログラムを書く必要があり、そのときにいろいろと調べたので、忘れないうちにまとめておきます。

書いているうちに量が多くなってしまったので、幾つかのエントリに分割して投稿します。(まだリンクがないものは執筆中です)

- [公開鍵暗号と電子署名の基礎知識](http://qiita.com/kunichiko/items/ef5efdb41611d6cf7775)
	- これを知らないとそもそも以下のエントリの意味がわからない、という基礎知識を切り出しました。
- [RSA暗号の全体像](http://qiita.com/kunichiko/items/7796ecfb88a62ce26b36)
	- 公開鍵暗号や電子署名の具体的な仕様の一つが **RSA暗号**です。デファクトスタンダードと言っても過言ではありません。
	- RSAの仕様は膨大で多岐にわたっていて全体像が把握しづらいので、要点をまとめてみました。
- [OpenSSLコマンドによる公開鍵暗号、電子署名の方法](http://qiita.com/kunichiko/items/3c0b1a2915e9dacbd4c1)
	- OpenSSLのコマンドを使って公開鍵暗号や電子署名を行う方法をまとめました。
	- OpenSSLは RSA暗号を実際に実装したライブラリやコマンドです。
	- 自分のプログラムが正しく実装されているかを確かめるためには、OpenSSLの出力と比較したり、OpenSSLで作成した署名を検証できるかなどの連携を行ってみるのが近道です。
- [RSA鍵、証明書のファイルフォーマットについて](http://qiita.com/kunichiko/items/12cbccaadcbf41c72735)
	- RSAで取り扱う鍵や証明書にはさまざまなファイルフォーマットがあり、その構造を理解していないと混乱します。
	- プログラムで鍵を扱う際にファイルフォーマットの変換が必要になることもあるため、その変換方法などをまとめました。
	- また、鍵ファイルの中身をダンプする方法などもまとめています。
- [PKCS #12 個人情報交換ファイルフォーマットについて](http://qiita.com/kunichiko/items/3e2ec27928a95630a73a)
	- 複数の鍵や証明書をひとまとめにできる、個人情報交換ファイルフォーマットについて解説しています。
- [電子署名のファイルフォーマットについて](http://qiita.com/kunichiko/items/2e0a2bd35c8e9492ceb5)
	- 電子署名のファイル構造は結構複雑なのですが、あまり分かりやすく解説したものがなかったのでいろいろ調べてみました。
	- ここがよくわかっていないと、異なる暗号化ライブラリ間で署名がうまく検証できないなどのトラブルに見舞われます。
- [iOSで Swiftから暗号化ライブラリを使う](http://qiita.com/kunichiko/items/a57e4707e455f814d671)
	- iOSには Security Frameworkという暗号のためのライブラリが用意されていて、RSA暗号や電子署名を扱うことができます。
	- 特に Objective-Cではなく Swiftから Security Frameworkを扱う方法や、OpenSSLの鍵をインポートする方法などについてまとめました。
- Javaの暗号化ライブラリを使う方法(執筆中)
	- Javaには JCE (Java Cryptography Extension) という暗号化拡張ライブラリがあり、公開鍵暗号や電子署名を扱えます。
	- OpenSSLや iOSのSecurity Frameworkで作成した電子署名を検証する方法などをまとめました。