OmniAICreator/Qiita-1.07M huggingface dataset:
Photo Stream と PHAsset.fetchAssetsWithALAssetURLs の甘く切ない関係

内容的には、下のリンクと同じ内容です。ちょっと違うやり方をしたというだけ。なぜPHAsset.fetchAssetsWithALAssetURLsがPhotoStreamの場合だけきちんと値を返却してくれないのかと。。
- http://qiita.com/onizine/items/69b6cd4292add3cbadc0
- http://stackoverflow.com/questions/26588496/loading-image-from-my-photo-stream-using-uiimagepicker-results-url-and-phasset

単にfor文で回したくない :weary: というだけです。

```swift

	class func fetchAssetWithALAssetURL (alURL: NSURL) -> PHAsset? {
		var phAsset : PHAsset?

		let optionsForFetch = PHFetchOptions()
		optionsForFetch.includeHiddenAssets = true

		let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([alURL], options: optionsForFetch)
		if fetchResult.count > 0 {
			return fetchResult[0] as? PHAsset
		}
		let str = alURL.absoluteString
		let localIDFragment = str.componentsSeparatedByString("=")[1].componentsSeparatedByString("&")[0]

		let fetchResultForPhotostream = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.AlbumMyPhotoStream, options: nil)
		if fetchResultForPhotostream.count > 0 {
			let photostream = fetchResultForPhotostream[0] as! PHAssetCollection
			let fetchResultForPhotostreamAssets = PHAsset.fetchAssetsInAssetCollection(photostream, options: optionsForFetch)
			if fetchResultForPhotostreamAssets.count >= 0 {
				let i=NSIndexSet(indexesInRange: NSRange(location: 0,length: fetchResultForPhotostreamAssets.count))
				// 逆順で列挙する。フォトストリームが後から表示されているのでその方が効率的のはず
				fetchResultForPhotostreamAssets.enumerateObjectsAtIndexes(i,
					options: NSEnumerationOptions.Reverse,
					usingBlock: {
						(obj, idx, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
						let target = obj as! PHAsset
						let ident = target.localIdentifier
						if let _ = ident.rangeOfString(localIDFragment) {
							LOG("found!")
							phAsset = target
							stop.memory = true
						}
				})
				return phAsset
			}
		}
		return nil
	}

```

enumrateObjectsAtIndexesを利用する際の覚書です。
ポイントとしては、パラメータで渡す NSIndexSet の設定と、見つかった際に途中終了する方法でしょうか。stopをどうすれば良いのかというところがわかりにくかった。
concrete5 多言語サイトで使えるパンくず用オートナビカスタムテンプレートサンプル

concrete5 でパンくずを表示させるときは、オートナビブロックのパンくず (breacrumb.php) なカスタムテンプレートを使います。

しかし、concrete5 の多言語機能を使うと、各言語のトップページが第1階層に下がってしまうため、パンくずの設定をトップではなくて、第2階層化表示させるという設定にすると、どうしても、各言語のトップページが表示されなくなってしまいます。

ちょっと強引ですが、オートナビブロックのパンくずのカスタムテンプレートを改造して、多言語サイトな concrete5 サイトでのパンくずもきちっと各言語のトップページが表示されるカスタマイズをお教えします。

下記のサンプルコードを
自分のサイトの HTML に合わせるよう修正し、
breadcrumb.php という名前で、

/application/blocks/autonav/templates/breadcrumb.php

に保存してみてください。

```filename=breadcrumb.php
<?php defined('C5_EXECUTE') or die("Access Denied.");

$navItems = $controller->getNavItems(true); // Ignore exclude from nav
$c = Page::getCurrentPage();

switch($controller->displayPages) {
	case 'current':
		$cParentID = $controller->cParentID;
		if ($cParentID < 1) {
			$cParentID = 1;
		}
		break;
	case 'top':
		// top level actually has ID 1 as its parent, since the home page is effectively alone at the top
		$cParentID = 1;
		break;
	case 'above':
		$cParentID = $controller->getParentParentID();
		break;
	case 'below':
		$cParentID = $controller->cID;
		break;
	case 'second_level':
		$cParentID = $controller->getParentAtLevel(2);
		break;
	case 'third_level':
		$cParentID = $controller->getParentAtLevel(3);
		break;
	case 'custom':
		$cParentID = $controller->displayPagesCID;
		break;
	default:
		$cParentID = 1;
		break;
}

$cParent = Page::getByID($cParentID);
if (count($navItems) > 0) { ?>
    <div class="breadcrumb">
        <ul>
	        <li><a href="<?php echo $cParent->getCollectionLink();?>"><?php echo h($cParent->getCollectionName()); ?></a></li>
            <?php
                foreach ($navItems as $ni) {
                    if ($ni->isCurrent) {
                        echo '<li><span class="active">' . $ni->name . '</span></li>';
                    } else {
                        echo '<li><a href="' . $ni->url . '" target="' . $ni->target . '">' . $ni->name . '</a></li>';
                    }
                }
            ?>
        </ul>
    </div>
<?php  
} else if (is_object($c) && $c->isEditMode()) { ?>
    <div class="ccm-edit-mode-disabled-item"><?php echo t('Empty Auto-Nav Block.')?></div>
<?php }
```

以上
LaravelプロジェクトのAPIをswaggerを使ってドキュメント化

APIのドキュメント、書くのたいへんですよね。
作っても放置されて更新されず誰も読まなくなったなんてこともあると思います。

今回はswaggerを使って、ドキュメントの生成を楽にしてみました。

## swaggerとは
swaggerとはAPIドキュメント生成ツールです。
http://swagger.io/  
コード内に特定の記述でコメントを含めておくと、コマンド実行でAPIドキュメントを生成してくれます。

## 今回の環境
多くので言語でライブラリが用意されていますが、
今回はphpのLaravelフレームワークでの使い方を紹介します。

- php
- composer
- Laravel4 or 5

## 使い方

### インストール
まずcomposerで必要ライブラリをインストールします。
Laravelプロジェクトのルート・ディレクトリで実行。

```
$ composer require zircote/swagger-php
```

### 必要ファイル追加
ドキュメントを生成したいControllerのディレクトリにswagger用のphpファイルを配置します。
この記述はディレクトリ内のControllerクラスすべてに適応されます。
xxxにはバージョンとか、アプリ名とかその場にあったものを記述して大丈夫です。

```php:swagger-xxx.php
<?php

/**
 * @SWG\Swagger(
 *     host="http://api.example.com",
 *     schemes={"http", "https"},
 *     @SWG\Info(
 *         version="1.0",
 *         title="xxx　のAPIドキュメント",
 *     ),
 * )
 */
```

### Controllerにコメント追加
APIを出力をしているControllerのfunctionに以下のような感じでコメントを追加します。

```php:HogeController.php
    /**
     * @SWG\Get(
     *     path="/hoge/{hogeID}",
     *     description="hogeを取得する",
     *     produces={"application/json"},
     *     tags={"hoge"},
     *     @SWG\Parameter(
     *         name="hogeID",
     *         description="hogeのID",
     *         in="path",
     *         required=true,
     *         type="string"
     *     ),
     *     @SWG\Response(
     *         response=200,
     *         description="Success"
     *     ),
     *     @SWG\Response(
     *         response=404,
     *         description="Parameter error"
     *     ),
     *     @SWG\Response(
     *         response=403,
     *         description="Auth error",
     *     ),
     * )
     */
    public function hoge($userID)
    {
        return response()->json(['hoge' => 1]);
    }
```

使ったパラメータは以下のような感じです。

- SWG\Get - APIにアクセスするためのメソッド。GetとかPostとか
  - path - APIにアクセスするためのパス
  - description - APIの説明
  - produces - APIが返すcontent-type
  - tags - APIのタグ。APIをグルーピングできます。
  - SWG\Parameter
      - name - パラメータの名前
      - description - パラメータの説明
      - in - どこのパラメータか (path|query)
      - type - パラメータの型
  - SWG\Response
      - response - ステータスコード
      - description - 上のステータスコード時の説明 


上記は基本的な項目のみですが、他にも多くのアノテーションが用意されています。　　  
もっと見たい場合は以下で確認できます。
http://zircote.com/swagger-php/annotations.html


### コマンド実行
ターミナルよりコマンドを実行するとswagger.jsonファイルが出力されます。

```
vendor/bin/swagger {swagger-xxx.phpを記述したディレクトリ} -o {swagger.json出力先ディレクトリ}
```


### ブラウザでドキュメント確認
生成したswagger.jsonはswagger-uiに通して見ることによって、ブラウザでAPIドキュメントとして見ることができます。

https://github.com/swagger-api/swagger-ui

リンクからdistフォルダをダウンロードし、含まれているindex.html内にてswagger.jsonを読み込んでいる箇所（40行目付近）を探します。
そこに先ほど生成したswagger.jsonのパスを指定してあげれば大丈夫です。

Laravelの場合はpublic以下にディレクトリを作って、
上記のファイルを置いておくとすぐに確認できて便利です。

あとはブラウザで表示するだけ！
成功すると以下のような画面が見れるはずです。

<img width="1052" alt="スクリーンショット 2016-03-17 21.28.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/57610/de4d5928-99f5-8de1-64d1-8e68a2f3dee8.png">

"Try it out!"で実際にAPIにアクセスして、Responseを表示させることもできます。
自分でドキュメントを書いている場合は、返ってくるjsonの項目もツラツラとドキュメントに書き起こしたりすると思いますが、swaggerの場合は実際にAPIが返す値をすぐに確認できるので、とても便利。
実際にAPIが返している値なので、ドキュメントの修正漏れとかが起きる心配も不要ですね。
react-native-infinite-scroll-viewの使い方

react-native-infinite-scroll-view
https://github.com/exponentjs/react-native-infinite-scroll-view

ReactNativeでInfinite Scroll （いわゆる無限スクロール）　を実現できるこの素敵なコンポーネントですが、README見ただけでは上手く動かなかったので補足。

## 結論から先に言うと

READMEに載っていない`distanceToLoadMore`と`onLoadMoreAsync`というプロパティが必要。

## 例

```js
<ListView
    dataSource={...}
    renderRow={...}
    renderScrollComponent={(props) => <InfiniteScrollView {...props} />}
    canLoadMore={canLoadMore}
    isLoadingMore={isLoadingMore}
    distanceToLoadMore={10}
    onLoadMoreAsync={()=>{
        dispatch(loadMore())
    }}
/>
```

## ハマりどころ

`distanceToLoadMore`が未設定だと、デフォルト値として1500が設定され、少ししかスクロールしていないのに続きが読み込まれてしまう。

## プロパティ

* `dataSource` = リストデータ
* `renderRow` = Viewコンポーネント
* `renderScrollComponent` = おまじない（このまま記述）
* `canLoadMore` = まだ続きのデータがあるかどうか（boolean）
* `isLoadingMore` = 続きのデータを読込中かどうか（boolean）
* `distanceToLoadMore` = 最下部からのどれぐらいの距離で続きのデータを読み込むか（number）
* `onLoadMoreAsync` = 続きのデータを読み込むActionをここでdispatchする（function）
文学部出身の私がプログラムを書けるようになるまでにやったこと

# やったこと

ひたすらコード書く。以上。

だと身も蓋もないので、以下ポエムです。

# （遅れてきた）新卒でとある開発会社へ

人より~~だいぶ~~ちょっとだけ長く大学行ったあとで、なんとかエンジニア未経験で入社させていただき、SQLの研修から入って様々な経験をさせていただきました。LAMPメインのWeb系開発会社でした。

- SQLの研修から入ったのは良かった
  - コンソールでレスポンスがすぐ返ってくるのでトライ＆エラーしやすい
  - 技術としてもWeb系全般で役に立つ
- PHPなのは良かった
  - コードと結果が結びつきやすく非常にとっつきやすい
  - PHPが悪いんやない、PHPを使う人間が悪いんや…

# twitter bot 開発

プライベートでtwitterでbotの開発をしました。ちょうどtwitterが流行り始めたころで、今よりはbotも一般的ではなく、新しいことをやってる感があった。

- webの情報を頼りにしながら、１人で設計から実装までやったことによりコーディング力上昇
  - この頃はまだPHPer
- 今より貪欲に情報を収集してたかもしれない
  - twitterで目につくエンジニアは手当たり次第フォローしてた（今はサボってる）

# 基本処理情報技術者受ける

当時の会社の勧めもあって、受けました。大学に█年行くほど勉強~~大好き~~大嫌いな私でも受かったので、勉強嫌いな人にもおすすめ

- 計算機の仕組みについて入門レベルは学べるので特に文系出身者は有用かも
- それ以上はコード書いてた方が楽しいので受けなかった（勉強嫌い）

# OSSコミュニティとの関わり

node.jsの東京Node学園祭の第一回目のボランティアをさせていただきました。ちょうどその頃node.jsが流行り始めたころで、socket.ioすげーとかやりつつ、新しいことをやってる感があった。

- すごい企業のすごいエンジニアと繋がりを持てる
- 会社以外のオープンなつながりなので、様々な立場、考え方の人がいて、社会的な経験値も増える
- OSSとの関わりがイメージしやすくなった

~~この頃から仕事では実力もないのにうっかり代表取締役などをやらせていただき色んな人に迷惑をかける~~

# Android, iOSアプリの開発

時期的には東京Node学園祭の頃と被りますが、主に仕事でAndroidやiOSアプリの開発を中心にやるようになりました。ちょうどその頃スマホアプリが盛り上がりつつあったころで、新しいことやってる感があった。

- 書いた量だとこの頃が一番多いかも
- PHPer出身なので、コンパイル言語やってる感が良かった
- PHPer出身なので、Android NDKを使った時はもはやハッカー気取り
- ~~社内のiOSエンジニアと喧嘩し未経験から２徹で１人で１本完成させることに~~

# その後

Scalaにチャレンジしたり、アドテクやったり、また実力もないのに代表やって痛い目にあったりしながら、なんとか生きてますよ、お母さん。

# まとめ

## 流行りや新しいものに飛びつくのは悪いことではない

踊らされて終わりになることだけ気をつければ、モチベーション上がりやすいし、いろいろ成長できるのでむしろ推奨。

## Try and Error 〜あとちょっとこうすればできそうの繰り返し

歌のタイトルみたくなったけど、開発って結局これだよねっていう。
SSDをSecure Erase機能で安全に消去する

# 注意
この記事ではSSDのデータ消去について扱います。
データの消去はディスクを他人に譲渡する際などにやるべきことですが、当然データは消えてしまうので操作ミスに注意してください。
誤った手順での消去や、消去の失敗はSSDがロックされることに繋がり、アクセス不能になってしまう場合もあるようです。
言うまでもないことですが、**自己責任で**お願いします。

# SSDにおけるデータ消去の問題と解決策
SSDはフラッシュメモリによってデータを記録していますが、従来のHDDとは違った特徴を持ちます。
そのため、単純に`dd`コマンド等でデータを上書きするのがデータ消去における最適な方法とは言えません。

現在流通している大半のSSDでは、データを安全に消去するための**Secure Erase機能**が用意されています。
これによって容易にSSDのデータ消去を行うことができ、かつ消去後のパフォーマンス低下を抑えることができます。

# Secure Erase機能によるデータ消去

SSDをSecure Erase機能によって消去する手順は以下の通りです。

## 必要なソフト等
Secure Eraseを実行するためには、新しめの`hdparm`コマンドが使えるLinux環境が必要です。
（GParted Live CDで消去を実行できることを確認しています）
他にもHDDEraseと呼ばれるソフトがありますが、DOS環境が必要で面倒なのでここでは取り扱いません。

環境によっては消去に失敗してSSDがロックされる場合があります。
それを避けるためには、以下のような状態での消去はやめたほうがよいでしょう。

- 消去に2時間以上かかると予想される場合に、`hdparm`のバージョン9.31以前を使用すること
- USB-SATA変換アダプタ経由での消去

## SSDの状態を確認する

`# hdparm -I <device>`で消去対象デバイスの状態を確認します。

```
# hdparm -I <device>
(snip)
Security: 
       Master password revision code = 65534
               supported
       not     enabled
       not     locked
       not     frozen
       not     expired: security count
               supported: enhanced erase
       2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
```

出力の最後の方にSecure Eraseに関する情報が出てきますが、**`not frozen`**となっていないとSecure Eraseを行うことができません。
また、`supported: enhanced erase`はより安全なEnhanced Secure Eraseに対応していることを示します。
最後の行はSecure EraseとEnhanced Secure Eraseにおける消去にかかる時間です。

SSDの状態が`frozen`と表示されたとき、`not frozen`にするための方法として以下のものが知られています。

- 電源を入れたまま、SSDのSATAケーブルを抜き差しする
- `# echo -n mem > /sys/power/state` 等でPCをスタンバイに入れた後復帰させる

いずれの方法も環境に依存しており確実とはいえませんが、成功例のある対処法です。
（実際に、スタンバイに入れる方法でMacの内蔵SSDを消去することができました）

## Secure Eraseを実行する

Secure Eraseを実行する際には、ディスクにパスワードを設定する必要があります。
パスワードの設定は以下のコマンドで行うことができます。
なお、パスワードはSecure Eraseを実行すると解除されるので適当なもので大丈夫だと思います。

```
# hdparm --user-master u --security-set-pass <password> <device>
```

パスワードが設定された状態で再起動等が行われると解除するまではディスクへのアクセスができなくなります。
消去に失敗したなどの理由で解除したい場合は、以下のコマンドを使用してください。
この操作にはマスタパスワードが必要です（[主要なHDDのマスタパスワード](https://ipv5.wordpress.com/2008/04/14/list-of-hard-disk-ata-master-passwords/)）

```
# hdparm --user-master m --security-unlock <master password> <device>
# hdparm --user-master m --security-disable <master password> <device>
```

パスワードが設定されると、`# hdparm -I <device>`の出力において**`enabled`**と表示されます。

設定したパスワードを使用して、Secure Eraseを実行します。
Enhanced Secure Eraseを実行したい場合は`--security-erase`の代わりに`--security-erase-enhanced`を使用してください。
ここでは、`time`コマンドを併用して実際にかかった時間を計測しています。

```
# time hdparm --user-master u --security-erase <password> <device>
```

最後に、`# hdparm -I <device>`の出力を見て、**`not enabled`**となっていることを確認します。
これで、SSDの消去は終了です。

# 参考資料
ATA Secure Erase - ata Wiki
https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase

Secure Erase Wiki no longer available! (Instructions on how to securely erase your SSD)
http://peter.membrey.hk/2011/09/11/secure-erase-wiki-no-long-available-instructions-on-how-to-securely-erase-your-ssd/

SSDの性能低下とTrimの効き具合を大検証！ | SSDパーフェクトガイド | DOS/V POWER REPORT
http://www.dosv.jp/other/1005/18.htm
パワポでズンドコキヨシ

「ズン」と「ドコ」のスライドを追加していって、例のパターンが発生したら「キ・ヨ・シ！」で終わるスライドを自動で作ります。生成されたスライドはリズムに乗ってめくっていくなどすると盛り上がると思います。


1. PowerPointのオプションのリボンの設定で「開発」リボンを有効にします
2. 「開発」リボンの「Visual Basic」をクリックしてVisual Basic Editorを開きます
3. Visual Basic Editor左側の「VBAProject」を右クリックして「挿入→標準モジュール」を選択します
4. 作成されたモジュールの中に以下のコードをペーストします
5. コード中の``Sub ZunDokoKiyosi()``の行を選択してツールバーの実行ボタンを押します。

```vbnet
Sub ZunDokoKiyosi()
    Do While ActivePresentation.Slides.Count > 0
        ActivePresentation.Slides.Item(1).Delete
    Loop
    
    `パターン判定はC言語版のNLZ(number of leading ZUN)方式を拝借
    Dim nlz As Integer
    Dim c As Integer
    
    nlz = 0
    c = 0
    
    Do
        nlz = IIf(c = 1, nlz + 1, 0)
        c = Int(Rnd * 2)
        AddSlide IIf(c = 1, "ズン", "ドコ")
    Loop While nlz < 4 Or c = 1
        
    AddSlide "キ・ヨ・シ!"
End Sub

Function AddSlide(text As String)
    Dim p As Presentation
    Dim slide As slide
    Dim textBox As Shape

    Set p = ActivePresentation
    Set slide = p.Slides.Add(p.Slides.Count + 1, Layout:=ppLayoutBlank)

    Set textBox = slide.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 0, 0)

    With textBox
        .TextFrame.TextRange = text
        .TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
        .TextFrame.VerticalAnchor = msoAnchorMiddle
        .TextFrame.AutoSize = ppAutoSizeNone
        .Width = p.PageSetup.SlideWidth
        .Height = p.PageSetup.SlideHeight
        .TextEffect.FontSize = 200
    End With

    ActiveWindow.View.GotoSlide slide.SlideIndex
End Function
```

![pp-zun-doko-kiyoshi.gif](https://qiita-image-store.s3.amazonaws.com/0/42710/0492caeb-be3d-4577-c312-23a945268d8d.gif)
ズンドコキヨシ with Makefile

Makefileの再帰呼び出しでズンドコキヨシ。

```mf:Makefile
.PHONY=kiyoshi
ifeq ($(A), ドコ)
ifeq ($(B), ズン)
ifeq ($(C), ズン)
ifeq ($(D), ズン)
	EXIT = 1
endif
endif
endif
endif
ifeq ($(shell jot -r 1 0 1),0)
	NEXT = ズン
else
	NEXT = ドコ
endif

kiyoshi:
ifeq ($(EXIT),1)
	@echo キ・ヨ・シ！
	@exit
else
	@echo -n $(NEXT)
	@make A=$(NEXT) B=$(A) C=$(B) D=$(C)
endif
```
WITH句 の FUNCTION で ズンドコキヨシ(※ワンライナーも可)

> ズンドコキヨシまとめ
> http://qiita.com/shunsugai@github/items/971a15461de29563bf90

こないだは30個位だったズンドコキヨシのタグが、100個超えとる……

負けてはいられん！今度は Oracle Database 12cR1 新機能 の
WITH句 の FUNCTION で ズンドコしてみたやで彡(ﾟ)(ﾟ)

> 2.1.4.11 SQL WITH句に定義されるPL/SQLファンクション
> http://docs.oracle.com/cd/E57425_01/121/NEWFT/chapter12101.htm#FEATURENO10021

ソースは以下の通り。

```sql
WITH
  FUNCTION fnc_zun_doko(v_zun IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    IF SUBSTR(v_zun, -5) = '00001' THEN
      RETURN REPLACE(REPLACE(v_zun, '0', 'ズン！'), '1', 'ドコ！') || 'キ・ヨ・シ！';
    ELSE
      RETURN fnc_zun_doko(v_zun || MOD(TRUNC(DBMS_RANDOM.VALUE*10), 2));
    END IF;
  END;
SELECT fnc_zun_doko(NULL) FROM DUAL;
/
```

結果は以下やで 彡(ﾟ)(ﾟ)

```sql
SQL> WITH
  2    FUNCTION fnc_zun_doko(v_zun IN VARCHAR2) RETURN VARCHAR2 IS
  3    BEGIN
  4      IF SUBSTR(v_zun, -5) = '00001' THEN
  5        RETURN REPLACE(REPLACE(v_zun, '0', 'ズン！'), '1', 'ドコ！') || 'キ・ヨ・シ！';
  6      ELSE
  7        RETURN fnc_zun_doko(v_zun || MOD(TRUNC(DBMS_RANDOM.VALUE*10), 2));
  8      END IF;
  9    END;
 10  SELECT fnc_zun_doko(NULL) FROM DUAL;
 11  /

FNC_ZUN_DOKO(NULL)
--------------------------------------------------------------------------------
ドコ！ズン！ドコ！ズン！ズン！ドコ！ドコ！ズン！ズン！ドコ！ドコ！ズン！ズン！ド
コ！ズン！ズン！ドコ！ズン！ズン！ズン！ドコ！ズン！ドコ！ズン！ドコ！ズン！ドコ
！ズン！ドコ！ドコ！ドコ！ズン！ドコ！ドコ！ズン！ズン！ドコ！ドコ！ズン！ドコ！
ズン！ズン！ズン！ドコ！ズン！ドコ！ドコ！ドコ！ズン！ズン！ズン！ドコ！ドコ！ズ
ン！ドコ！ドコ！ズン！ズン！ドコ！ズン！ドコ！ドコ！ドコ！ズン！ドコ！ドコ！ズン
！ドコ！ドコ！ドコ！ドコ！ドコ！ドコ！ズン！ドコ！ドコ！ドコ！ズン！ドコ！ズン！
ドコ！ドコ！ズン！ズン！ドコ！ドコ！ドコ！ズン！ズン！ズン！ドコ！ズン！ズン！ド
コ！ドコ！ドコ！ズン！ズン！ドコ！ドコ！ズン！ドコ！ドコ！ドコ！ドコ！ズン！ドコ
！ズン！ズン！ドコ！ドコ！ズン！ズン！ズン！ドコ！ズン！ズン！ズン！ズン！ズン！
ドコ！キ・ヨ・シ！
```

12c限定やけど、こっちのがスマートやね！彡(^)(^)

※3/18追記・こいつは(ほぼ)ワンライナーでも行けたやで彡(ﾟ)(ﾟ)

```sql
SQL> WITH FUNCTION fnc_zun_doko(v_zun IN VARCHAR2) RETURN VARCHAR2 IS BEGIN IF SUBSTR(v_zun, -5) = '00001' THEN  RETURN REPLACE(REPLACE(v_zun, '0', ' ズン！'), '1', 'ドコ！') || 'キ・ヨ・シ！'; ELSE RETURN fnc_zun_doko(v_zun || MOD(TRUNC(DBMS_RANDOM.VALUE*10), 2)); END IF; END; SELECT fnc_zun_doko(NULL) FROM DUAL;
  2  /

FNC_ZUN_DOKO(NULL)
--------------------------------------------------------------------------------
ドコ！ドコ！ズン！ズン！ズン！ドコ！ズン！ズン！ドコ！ドコ！ズン！ズン！ズン！ド
コ！ドコ！ズン！ズン！ドコ！ドコ！ドコ！ズン！ズン！ドコ！ズン！ドコ！ズン！ドコ
！ドコ！ズン！ズン！ズン！ズン！ズン！ズン！ズン！ズン！ドコ！キ・ヨ・シ！
```
Z80 アセンブラからCの関数を呼ぶ

 Z80 アセンブラからCの関数を呼ぶ方法です
　
---

<b>アセンブラからＣの関数を呼ぶ</b>

実行したい関数のサンプル

```:C
ULONG test(UBYTE bt,UWORD wd,ULONG lg);
```


これをアセンブラから呼び出すには以下のように記述する

```:ASM
	LD      XWA,04050607H   ;３番目の引数「lg」にセットする値
	PUSH    XWA             ;スタックに引数を格納
	LDW     BC,0203H        ;２番目の引数「wd」にセットする値
	PUSHW   BC              ;スタックに引数を格納
	LDW     DE,0001H        ;１番目の引数「bt」にセットする値
	PUSHW   DE              ;スタックに引数を格納

	CALL    _test           ;関数を呼び出す

	POPW   DE               ;スタックの後始末
	POPW   BC               ;スタックの後始末
	POP    XWA              ;スタックの後始末
```

なお、関数の戻り値は

```:ASM
XHL
```

というレジスタに格納されます。
underscoreコードリーディング（isUndefined）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##isUndefinedとは


###[underscorejs.orgのisUndefined](http://underscorejs.org/#isUndefined)

こんな説明。
>####_.isUndefined(value) 
Returns true if value is undefined.

```javascript
_.isUndefined(window.missingVariable);
=> true
```

------------- 
valueがundefinedだった場合にtrueを返します

###[underscore.isUndefined](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1260)
コード的にはこのあたり。

```javascript
  // Is a given variable undefined?
  _.isUndefined = function(obj) {
    return obj === void 0;
  };

```

objとvoid 0(undefined)の比較の結果を返す。
AWS CLI でいろいろ使用例

AWSCLIを触る機会がありましたので、使用例を紹介していきます。

#S3からファイルのダウンロード#
S3に置いてあるファイルをダウンロードします。


**$ aws s3 cp s3://ダウンロードしたいファイルパス ダウンロード先のパス**

使用例

```
 $ aws s3 cp s3://~~~/~~~/test.txt ./
   download: s3://~~~/~~~/test.txt to ./test.txt
```

#S3へファイルのアップロード#
S3へファイルのアップロードをします。


**$ s3 cp アップロード元のパス s3://アップロードしたいファイルパス**
使用例


```
 $ $ aws s3 cp test.txt s3://~~~/~~~/
     upload: ./test.txt to s3://~~~/~~~/test.txt
```

##CloudFormation Stackの作成##

**$ aws cloudformation create-stack --region リージョン名 --stack-name スタック名 --template-url テンプレート配置パス --parameters パラメータ=値**


使用例

| templateファイルパス | aws s3 cp s3://~~~/~~~/test.template |
|-----------|------------|
| **stack名** | **testStack** |
| **リージョン** | **ap-northeast-1** |

使用例

```
$ aws cloudformation create-stack --stack-name testStack --region ap-northeast-1 --template-url https://s3.amazonaws.com/~~~/~~~/test.template --parameters ParameterKey=KeyName,ParameterValue=valueName 
```

##CloudFormation Stackの削除##

**$ aws cloudformation delete-stack --stack-name スタック名 --region リージョン名**

使用例

```
$ aws cloudformation delete-stack --stack-name testStack --region ap-northeast-1
```

##インスタンスの起動状態の確認##

**$ aws ec2 describe-instances --instance-ids インスタンスID --region リージョン**

使用例

```
aws ec2 describe-instances --instance-ids ○-××××× --region ap-northeast-1
```

##インスタンスリブード##
**$ aws ec2 reboot-instances --instance-ids インスタンスID --region リージョン**

使用例

```
**$ aws ec2 reboot-instances --instance-ids ○-××××× --region ap-northeast-1**
```
##インスタンスのターミネート##
**$ aws ec2 terminate-instances --instance-ids インスタンスID --region リージョン**

使用例

```
aws ec2 terminate-instances --instance-ids ○-××××× --region ap-northeast-1
```

#最後に#
今後もどんどん更新していければと思います。
使用するさいはインスタンスIDを間違えないようご注意ください。。
UniRxでダブルクリック

よくありそうなんですが、これぞというものが無かったのでまとめてみます。

##発行側

クリックの定義（例としてここではマウスダウン）

```
var clickStream =
  Observable
  .EveryUpdate()
  .Where(_ => Input.GetMouseButtonDown(0));
```

ダブルクリック時に発行（要Connect）

```
var doubleClickInterval = 250d;

DoubleClickStream =
clickStream
  .TimeInterval()
  .Select(t => t.Interval.TotalMilliseconds)
  .Buffer(2, 1)
  .Where(list => list[0] > doubleClickInterval)
  .Where(list => list[1] <= doubleClickInterval)
  .Publish();
```

##購読側
```
DoubleClickStream
  .Subscribe(_ => { hoge; });
```

#参考にさせてもらったもの

##時間でまとめる
http://www.slideshare.net/torisoup/unity-unirx/79

```
.Buffer(clickStream.Throttle(TimeSpan.FromMilliseconds(200)))
.Where(x => x.Count >= 2)
```

最後のクリックから指定時間経過すると発火し、その間の回数が2回以上かどうかで判定するやり方。
シンプルなんですが、実際試してみるとダブルクリックした瞬間ではなく最後に一定時間待たないといけないため、UIとしては反応が悪く感じられます。2回以上連続でクリックし続けたケースでも最後のクリックが終わるまで発火しません。

##カウントでまとめる
http://naichilab.blogspot.jp/2014/07/unityunirx.html

最初に書いたものとだいたい同じですが

```
.Buffer(2)
```

でまとめるとストリームを2個ずつ取り出す形になり、[0,1], [2,3], [4,5]...と偶数クリック目にしか発火しません。

```
.Buffer(2, 1)
```

skip値を指定すると、[0,1], [1,2], [2,3] と常に最新のペアが得られます。

#各部解説

```
var doubleClickInterval = 250d;
```

ダブルクリックと判定する間隔(ms)です。お好みで適当に設定しましょう。

```
.TimeInterval()
```

前回のクリックからの時間の差分を取得します。

```
.Buffer(2, 1)
```

最新2個のペアを取得します。

```
.Where(list => list[0] > doubleClickInterval)
.Where(list => list[1] <= doubleClickInterval)
```

ここでダブルクリックであるかどうかを以下の条件で判定します。
- 最新ひとつ前のクリックの前回との差分：指定時間より大きい
- 最新クリックの前回との差分: 指定時間以下

前者の判定が何故必要なのかというと、3回以上連続でクリックし続けた場合にダブルクリックが何度も発行されてしまうからです。

```
----c1-c2-c3-c4-c5----c6----c7----c8-c9----
```

たとえば上記のような間隔でクリックした場合、c2とc9でのみダブルクリックを発行します。
（c4もダブルクリックとする場合には対応してません）
git filter-branch とは？

git filter-branch について勉強したメモ。最強なだけあって奥が深い...

# git filter-branch について
## 最強のオプション: filter-branch
- 大量のコミットの書き換えを機械的に行いたい場合に使う
    - 少量のコミットの書き換えをを対話的に行う場合は git rebase -iが便利！

## 注意事項
- プロジェクトを一般に公開した後や書き換え対象のコミットを元にしてだれかが作業を始めている場合は使うのを避けたほうがよい
    - どうしても必要な場合は、すべての関係者に知らせてそれぞれのローカルリポジトリに対しても変更を反映してもらう必要がある

## コマンド例
プロジェクトの各チェックアウトに対して指定したコマンドを実行し、結果を再コミットします。

```
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
```
↑この場合は、すべてのスナップショットから passwords.txt というファイルを削除します。

```
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch passwords.txt' HEAD

```
↑ワークツリーにファイルを残したい場合はこんな感じ。


### オプションについて
- --tree-filter
    - 各チェックアウトに対してコマンドを実行し、結果を再コミットする
- --index-filter
    - インデックスを書き換える
    - ツリーをチェックアウトせずインデックスを書き換えるので、--tree-filterよりはるかに高速

### 余談：「スナップショット」とは...？
Gitは内部構造的に、「差分」を集積しているのではなく、「スナップショット」を保存している。
なので、コミットする＝変更後のスナップショットを保存するということなのです！


## 参考
http://git-scm.com/book/ja/v1/Git-のさまざまなツール-歴史の書き換え#最強のオプション:-filter-branch
http://git-scm.com/book/ja/v1/Gitの内側-メインテナンスとデータリカバリ#オブジェクトの除去

http://easyramble.com/git-filter-branch.html
役に立った！Gitコマンドまとめ

自分用メモ。

# ファイル単位でなく、変更した部分（＝ハンク）単位でのステージング
（そもそも、こまめにadd→commitしなさい！って話ですが、、、）

```
git add -p
```


# リモートにPUSHしてしまったコミットを、1つ前の状態に戻したい！

```
git push -f origin HEAD^:master
```
ローカルのコミット状態は変わらないので、必要に応じて`git reset`などをやる。


※ コマンドオプションの意味
-f　：　＝「––force」。強制的に上書きする。
origin　：　PUSHするリポジトリの指定。「origin」はリモートリポジトリ。
HEAD^:master　：　ローカルのブランチ:リモートのブランチ。HEAD^は1つ前（HEADの1番目の親）の意味。


その応用で...↓

# リモートのブランチを削除する！
```
git push -f origin :master
```
ローカルのブランチ指定がないので、空で上書き＝削除される。


# コンフリクトが起きたとき、どちらか一方を正とする
```
git checkout --ours/--theirs
```

# git diffで文字化けしないようにする

```
git diff {比較するコミット1}..{比較するコミット2} | iconv -f shift_jis
```

※ただし、diffへの色付けは失われるので、結局見づらい。。。


# 追跡ブランチに設定する
```
git branch --set-upstream-to origin/{ブランチ名} {ローカルブランチ名}
```

または

```
git branch -u origin/{ブランチ名} {ローカルブランチ名}
```

## 追跡ブランチを確認
```
git branch -vv
```


# releaseブランチをmasterにマージしてタグ付け

とりあえずfetch

```
git fetch --prune
```

Non-Fast-Forwardでマージ

```
git merge release --no-ff
```

masterをpush

```
git merge
```

そして、タグ付け

```
git tag -a v1.0 -m 'yyyymmdd released'
```

タグデータと関連づけられたコミットを確認

```
git show v1.0
```

既存のタグ一覧

```
git tag
```

タグのpush

```
git push origin v1.0
```


# cloneするときにリモートリポジトリの名前を origin 以外にする

```
git clone -o <remote-name> <remote-repository-uri>
```


# エイリアス設定
## `git log --oneline --graph` をさらにわかりやすく
```
git config --global alias.graph 'log --graph --pretty=format:"%C(yellow)%h%Creset%C(auto)%d%Creset %s %Cblue[%an]%Creset %ad" --all --date=iso'
```
ズンドコキヨシ with Vue.js

この[ビックウェーブ](http://qiita.com/tags/ズンドコキヨシ)に、Vue.jsも行っきまーす！

![Screen Shot 2016-03-17 at 8.05.30 PM-minishadow.png](https://qiita-image-store.s3.amazonaws.com/0/38383/538de0d9-1c09-f304-3944-c0f553439145.png)

```coffeescript
'use strict'

class Zundoko

  constructor: ->
    @data =
      kiyoshi: false
      zun: 0
      items: []

  methods:

    push: ->
      doko = Math.random() > 0.5
      str = if doko then 'ドコ' else 'ズン'
      @items.push({text:str})
      if doko and @zun >= 4
        @items.push({text:'キ・ヨ・シ!'})
        @kiyoshi = true
      if !doko then @zun++ else @zun = 0
      return

kiyoshi = new Zundoko()
new Vue({el: '#kiyoshi', data: kiyoshi.data, methods: kiyoshi.methods})
```

すいません、今ちょうどcoffeeしかなくて。

```jade:Jade
#kiyoshi
  button(type="button" @click="push" v-show="!kiyoshi") Push
  ul
    li(v-for="item in items" v-text="item.text")
```

実物は[こちら](http://codepen.io/anon/pen/ZWLKgJ)。
ASP.NET > ASP.NETからRazorEngineを使いメール送信する




https://github.com/mehdime

以下に解説があるような、ないような・・・
http://mehdi.me/generating-html-emails-with-razorengine-basics-generating-your-first-email/


以下のサンプルAPPを参考に
https://github.com/mehdime/RazorEngineEmails

RazorEngineのバージョンは3.4でした。
V3.5は
TemplateService→RazorEngineServiceへと推奨が変わっており、
RazorEngineServiceを使うほうがどうやらいいみたい。


```csharp

public static void StronglyTypedModel_RazorEngineService(string welcomeEmailTemplatePath)
{
    var config = new TemplateServiceConfiguration();
    config.Language = Language.CSharp; // VB.NET as template language.
    //config.EncodedStringFactory = new RawStringFactory(); // Raw string encoding.
    config.EncodedStringFactory = new HtmlEncodedStringFactory(); // Html encoding.\


    var service = RazorEngineService.Create(config);
    Engine.Razor = service;


    // Generate the email body from our email template
    var stronglyTypedModel = new UserModel() { Name = "Sarah", Email = "sarah@mail.example", IsPremiumUser = false };


   // string template = "Hello @Model.Name, welcome to RazorEngine!";
    string templateFile = welcomeEmailTemplatePath;
    var template = new LoadedTemplateSource(File.ReadAllText(templateFile), templateFile);
    var result = Engine.Razor.RunCompile(template, "templateKey", null, stronglyTypedModel);


    // Send the email
    var email = new MailMessage()
    {
        Body = result,
        IsBodyHtml = true,
        Subject = "Welcome (generated from strongly-typed model)"
    };

    email.To.Add(new MailAddress(stronglyTypedModel.Email, stronglyTypedModel.Name));

    var smtpClient = new SmtpClient();
    smtpClient.Send(email);

    service.Dispose();
}
```


送信元のアドレスやSMTPの定義はどこで？と思ったらApp.configで設定するみたいです。
```xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

    <system.net>
        <mailSettings>
            <!-- Use the optional 'from' attribute to specify a default sender name and email if none is set in code -->
            <smtp deliveryMethod="Network" from="John &lt;john@awesomesite.com&gt;">
                <network host="localhost" />
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
```
「EntityFramework.SqlServer' を読み込めませんでした」エラーの対策




追加情報:不変名が 'System.Data.SqlClient' の ADO.NET プロバイダーのアプリケーション構成ファイルに登録された Entity Framework プロバイダー型 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' を読み込めませんでした。



http://stackoverflow.com/questions/14033193/entity-framework-provider-type-could-not-be-loaded




使わないDLLはテストプロジェクトでは実行領域にコピーされないとのこと。
以下の基底クラスを作って、そこで使うようにした。

```csharp
    [TestClass()]
    public class TestBase
    {

        public TestBase()
        {
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        }

    }
```
AngularJS Error: $injector:unpr Unknown Provider



$injector:unprエラーがでまくってどうにもならなくなった時のメモ

angular.module('app',　を見直す事

モジュールで、angular.module('app', [] がダブって記載あると、
Error: $injector:unprが出る。


    var app = angular.module('app', []);
    var app = angular.module('app', ['ngResource']);
    var app = angular.module('app', ['ui.router']);
bitOperation > ((3 << 14)) > 49152 | 4294950912

## 症状

2つの異なるプラットフォームにおいて同じソースコードを使用する以下の式の結果が異なった。

```
srcVal = 3;
shift = 14;
workVal = ((srcVal << shift));
```

C++ Builder XE4: 49152
環境M: 4294950912

Windowsのプログラマ電卓やideoneのC実装で確認したところ、49152が正しそう。


## 対策

変数について記載すると

- workVal : 32ビット変数
- srcVal, shift: 16ビット変数

以下のようにすると49152となった。

```
#if 1
  workVal = srcVal;
  workVal = (workVal << shift);
#else
  workVal = (srcVal << shift);
#endif
```

どうも16ビットシフトしたものを32ビット変数に代入したときに上位ビットが1111...になるようだ。

算術シフトと論理シフトは右シフトの時に上位ビットの違いが出るが、上記の場合左シフトなので、そのあたりの振る舞いが理解できていない。
Oracleの表関数でズンドコキヨシ

巷で大流行している「ズンドコキヨシ」をOracleの表関数でキメてみた☆

http://qiita.com/shunsugai@github/items/971a15461de29563bf90

```sql
CREATE OR REPLACE TYPE TYPE_ZUNDOKO AS OBJECT(
	COL VARCHAR2(256)
);
/
CREATE OR REPLACE TYPE TYPE_ZUNDOKO_TABLE AS TABLE OF TYPE_ZUNDOKO;
/
CREATE OR REPLACE FUNCTION ZUNDOKO(MAXROW NUMBER DEFAULT 100) RETURN TYPE_ZUNDOKO_TABLE PIPELINED
IS
    WORD VARCHAR(4);
	TYPE WORD_ARRAY IS VARRAY(2) OF VARCHAR2(4);
    WORD_LIST WORD_ARRAY := WORD_ARRAY('ズン', 'ドコ');
    TYPE HISTORY_ARRAY IS VARRAY(5) OF VARCHAR2(4);
    HISTORY HISTORY_ARRAY := HISTORY_ARRAY('', '', '', '', '');
BEGIN
    FOR I IN 1..MAXROW LOOP
        WORD := WORD_LIST(TRUNC(DBMS_RANDOM.VALUE() * 2 + 1));
        PIPE ROW(TYPE_ZUNDOKO(WORD));
        IF HISTORY(2) || HISTORY(3) || HISTORY(4) || HISTORY(5) || WORD = 'ズンズンズンズンドコ' THEN
			PIPE ROW(TYPE_ZUNDOKO('キ・ヨ・シ！'));
			EXIT;
		END IF;
		HISTORY(1) := HISTORY(2);
		HISTORY(2) := HISTORY(3);
		HISTORY(3) := HISTORY(4);
		HISTORY(4) := HISTORY(5);
        HISTORY(5) := WORD;
    END LOOP;
    RETURN;
END;
/
```

で、このテーブル関数をセレクトすると以下が表示されるはず。

```cmd
SQL> SELECT * FROM TABLE(ZUNDOKO());

COL
--------------------------------------------------------------------------------
ドコ
ズン
ズン
ズン
ドコ
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ！

16行が選択されました。
```

パパやったね！！！
windows > プログラマ電卓 > (3<<14)の計算 > 49152

```txt:動作確認
Windows 7 pro 32bit
```

Windowsのプログラマ電卓を使って (3<<14)の計算をする。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4eec4128-084e-6d48-9f65-52d4fb0a4d2f.png)


1. 3をクリック
2. Lshをクリック
3. 1,4をクリック
4. =をクリック

49152となった。
brew installでundefined symbol: SSL_CTX_set_alpn_protosと出た時の対処

LinuxBrewでpyenvをインストールしようとした時に、依存解決のためのopensslのインストールでエラーが出てしまった。
解決したのでメモ。

# 事象

```bash
$ openssl version
OpenSSL 1.0.2d_1

$ brew install openssl
/home/umanoda/.linuxbrew/opt/curl/bin/curl: symbol lookup error: /home/umanoda/.linuxbrew/Cellar/curl/7.45.0/lib/libcurl.so.4: undefined symbol: SSL_CTX_set_alpn_protos
Trying a mirror...
==> Downloading https://dl.bintray.com/homebrew/mirror/openssl-1.0.2g.tar.gz
/home/umanoda/.linuxbrew/opt/curl/bin/curl: symbol lookup error: /home/umanoda/.linuxbrew/Cellar/curl/7.45.0/lib/libcurl.so.4: undefined symbol: SSL_CTX_set_alpn_protos
Trying a mirror...
==> Downloading https://www.mirrorservice.org/sites/ftp.openssl.org/source/openssl-1.0.2g.tar.gz
/home/umanoda/.linuxbrew/opt/curl/bin/curl: symbol lookup error: /home/umanoda/.linuxbrew/Cellar/curl/7.45.0/lib/libcurl.so.4: undefined symbol: SSL_CTX_set_alpn_protos
Error: Failed to download resource "openssl"
Download failed: https://www.mirrorservice.org/sites/ftp.openssl.org/source/openssl-1.0.2g.tar.gz
```

どうもopensslを新しくコンパイルする際に必要な共有ライブラリの設定が必要らしい。
openssl-1.0.2dでのみおきる？

```bash
LD_LIBRARY_PATH=~/.linuxbrew/Cellar/openssl/1.0.2d_1/lib/ brew upgrade openssl
```

これでopensslがインストールできた。
このあと `brew install pyenv` が無事出来た。よかったね。
Angularjs ng-checked="$index == (defaultCk || 0)"  メモ

# ng-checked で入力値が無い場合、デフォルトで0番目のチェックボックスを有効にしたかった。

`ng-repeat` で複製される ラジオボタンです。

```
<li ng-repeat="radio in radios"　ng-init="defaultCk= "myCheckValue">
    <input type="radio" name="myRadio" value="{{$index}}" ng-checked="$index == (defaultCk || 0)">
</li>
```

`myCheckValue` に値が無い場合、`defaultCk` は undefined になるので、 
` ng-checked="$index == (defaultCk || 0)"` の部分で、　`0` が `$index` に代入されるため、
`value="{{$index}}"` は　 0 が入ります。
SwiftTaskでアニメーションをすっきり実装する

[PromiseKitでアニメーションをすっきり書いている人](http://qiita.com/appwatcher/items/7ed4c9da65ad0b53d417)がいて、SwiftTaskの方が好きなのですっきりかけるようにしてみた。

#完成形

```swift:SwiftTaskAnimation
    let displayAnimation = UIView.animationTask(0.5, delay: 0.2, animations: {
      self.displayImageView.alpha = 1.0
    })
    let messageAnimation = UIView.animationTask(0.3, delay: 0.2, animations: {
      self.messageImageView.alpha = 1.0
    })
    let viewAnimation = UIView.animationTask(0.5, delay: 0.0, animations: {
      self.view.alpha = 1.0
    })
    
    //Animation Task
    viewAnimation >>> displayAnimation >>> messageAnimation
```

こんな感じ

まずはアニメーションをタスクで実行出来るようにする。

```swift
typealias AnimationTask = Task<NSProgress, Bool, NSError?>
extension UIView {
  
  class func animationTask( duration: NSTimeInterval,
                            delay: NSTimeInterval? = nil,
                            usingSpringWithDamping: CGFloat? = nil,
                            initialSpringVelocity: CGFloat? = nil,
                            options: UIViewAnimationOptions? = nil,
                            animations: (() -> Void)?,
                            completion: ((Bool) -> Void)? = nil) -> AnimationTask {
      
    return AnimationTask(paused: true) { progress, fulfill, reject, configure in
      if let usingSpringWithDamping = usingSpringWithDamping, initialSpringVelocity = initialSpringVelocity {
        UIView.animateWithDuration(duration, delay: delay ?? 0.0, usingSpringWithDamping: usingSpringWithDamping, initialSpringVelocity: initialSpringVelocity, options: options ?? [], animations: { () -> Void in
          animations?()
          }, completion: { finish in
            completion?(finish)
            if finish {
              fulfill(finish)
            } else {
              reject(nil)
            }
        })
      } else {
        UIView.animateWithDuration(duration, delay: delay ?? 0.0, options: options ?? [], animations: { () -> Void in
          animations?()
          }, completion: { finish in
            completion?(finish)
            if finish {
              fulfill(finish)
            } else {
              reject(nil)
            }
        })
      }
    }

  }
}


```

ごちゃごちゃしているけど、バネと普通のアニメーションメソッドを一つにまとめている部分が大半で、設定されたパラメータによって使い分けている。
ちゃんとポーズさせておかないとインスタンスを作った時点でタスクが実行されたのでポーズさせる。`(paused: true)のところ`

```swift
infix operator >>> { associativity left }
func >>> <T: AnimationTask>(left: T, right: T) -> AnimationTask {
  let task = left.resumeSelf().then { _ -> AnimationTask in
    return right.resumeSelf()
  }
  return task
}

extension Task {
  func resumeSelf() -> Task {
    resume()
    return self
  }
}
```

オペーレータとresumeして自身を返すメソッドを拡張。
これで`a >>> b`でPromiseKitみたいにアニメーションが順々に実行されていく

あとは最初のように呼び出せばOK。オペレータが気持ち悪いのであればresumeSelf().thenでつなげていけばOK(resumeSelf()も嫌ならresumeしてからry

//追記

SwiftTaskが即時実行されてしまう問題は
@taka0125 大先輩が調べてくださいました！ありがとうございます！
死ぬまでAndroid Studioを勉強する

GoogleのAndroidが発表した後、Androidの開発に入りましたけど、1年程だけでゲーム会社へ転職しました。
その後、HTML　PHP　など3年間、Cocos2dxは2年間、現在はUnity3Dですけど。
俺は一体何をやっているの？まあ、別にいいじゃない～　ここからAndroidに戻ります。

http://www.android-studio.org/
HttpSocket使うときSSL証明書に関するエラー

CakePHPで、HttpSocketを使って、Httpsリクエストするとき、
以下のようなSSL認証のエラーが起きた場合...

>
[SocketException] stream_socket_client(): Peer certificate CN='aaa.com' did not match expected CN='good.aaa.com'
stream_socket_client(): Failed to enable crypto
stream_socket_client(): unable to connect to ssl://good.aaa.com:443 (Unknown error) 


解決方法(の一つ)：
HttpSocketインスタンスを生成するとき、ssl_verify_hostの設定を、falseにする。
そう設定したら、証明書のホスト名とCN(コモンネーム)の一致性をチェックしないので、違ってもエラーにならないようです。

参考：[HttpSocketを使用してリクエスト送信](http://kwski.net/cakephp-2-x/1035/)

※もうひとつの方法は、証明書登録側が修正してもらいますか・・・


**原因（例）**
SSLのマークをクリックして、Securityのタブが表示します。（F12キーを押して開発ツールの画面からも見れる。）　”View Certificate”をクリックしたら、証明書の詳細を見える。

httpsでアクセスするURLのドメインと、証明書の「発行先」登録するドメインが一致しない場合、上記のエラーが発生。

![image](https://qiita-image-store.s3.amazonaws.com/0/26351/2bc96140-abdd-9169-430f-06e2265386c9.png)
gitコマンドのあれやこれ

自身の勉強のために新しく覚えたコマンドを乗せていく

色々なサイトでpushする際にオプション「-u」指定してるので、なんじゃこりゃと思って調べてみたら[ironsand](http://qiita.com/ironsand)さんの記事に書かれていました。
> `git push -u origin master` とすると次回から `git push` だけで勝手に origin master で push してくれる。
[記事はこちら](http://qiita.com/ironsand/items/6c301fef730d53f35bc3)

後は、[Ruby on Rails チュートリアル](http://railstutorial.jp/ "Ruby on Rails チュートリアル")見ていると `git push origin` の後にブランチ名だったりallだったりするのでこれも調べてみました

#masterブランチだけpushする

```
$ git push origin master
```

#全てのローカルブランチをpushする

```
$ git push origin --all
```

全てのブランチをpushすることなんて普通はやらないんだろうけど、レポジトリ作った後の最初のpushだから付けているのだろうと解釈しよう。

#add と commitまとめて
```
$ git commit -am "hogehoge"
```

#カレントディレクトリ（自分が今いる場所）以下を全てaddする

```
$ git add .
```

#全ての変更をaddする

```
$ git add -A
or
$ git add --all
```
PowerShellの手習いにズンドコキヨシ作ってみた

習いたてのPowerShellの習作でズンドコキヨシ作ってみた。かなり初心者っぽい簡素な書き方だと思う。

    <# 
    「ズン」「ドコ」のいずれかをランダムで出力し続けて
    「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら
    「キ・ヨ・シ！」って出力した後終了って関数作った
    https://twitter.com/kumiromilk/status/707437861881180160
    ----
    PowerShellの手習いにズンドコキヨシ作ってみた
    #>

    Get-ZunDoko

    function Get-ZunDoko {
        $words = @("ズン","ドコ");
        $tail = "";
        Do {
            $word = Get-Random -InputObject $words
            $word
            $tail += $word
            if ($tail.Length -gt 10) {
                $tail = $tail.Substring($tail.Length - 10, 10)
            }
        } while ($tail -ne "ズンズンズンズンドコ")
        "キ・ヨ・シ！"
    }

ワンライナー版だとか他言語版だとかもっと変態チックなのとかは「[ズンドコキヨシまとめ - Qiita](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)」あたりで探してください。
FlashAir の WEBDAV / UPLOAD の設定時の挙動


FlashAir ではファイルをアップロードするための仕組みに、upload.cgi を使った方法と webdav を使った方法があるんだけど、この挙動が大変わかりにくかったのでメモ。無駄にハマった…。

なお動作確認した FW は現時点の最新の ```FA9CAW3AW3.00.01``` です。

# UPLOAD=1 WEBDAV=2 のとき

- lua スクリプト経由での io でのファイル書き込みができない(アンドキュメントな挙動な気がする)
- webdav / upload.cgi での書き込み可能

# UPLOAD=0 WEBDAV=2 のとき

- lua スクリプト経由での io でのファイル書き込み可能
- webdav 経由で書き込み可能だが、SDカード上のファイルシステム上には現れない。しかし FlashAir を再起動すると現れる(!!)
- upload.cgi は 404 Not Found

(追記)
うーん、WEBDAV=0 UPLOAD=0 でも httpd -> lua 経由の書き込みだと、再起動後にファイルが突然現れる現象が…。なんなんだろう…。

(追記)
firmware を再度書き直した後、正常な挙動になった。ただやはり lua からの書き込み等と Mac のマウントボリューム上のファイルシステムで見えるファイルに差異があったり、再起動すると表示されたりして、きちんとした"仕様"を理解しないとハマり続けそうだ…。
[Wordpress]私的便利プラグイン集

Wordpressインストール後に入れるであろうプラグインたち。
※順次追加

| 名前 | 備考 |
|:-----------|:------------|
| Advanced Custom Fields | カスタムフィールド |
| Compress JPEG & PNG images | 画像圧縮 |
| Cron GUI （Cron View）| 動いてるWP-CRONみるやつ |
| Custom Post Type UI | カスタム投稿とカスタム分類 |
| Custom Post Type Permalinks | パーマリンク変更 |
| Disqus Comment System | コメントをDisqusに |
| Login rebuilder | 管理ログインURL変更ほかセキュリティ対策 |
| Amazon Web Services | AWS連携 |
| WP Offload S3 Lite | S3連携 |
| Form1 | 簡易お問合わせフォーム |
| WP-Mail-SMTP | メール送信 |
| 001 Prime Strategy Translate Accelerator | 翻訳キャッシュ |
| Nginx Cache Controller | nginx用キャッシュ |
| ~~Better Delete Revision~~ | ~~リビジョン削除~~ |
| Optimize Database after Deleting Revisions | リビジョン管理 |

#### WP-Mail-SMTP
wp_mail()使う際、宛先に

- @の前に「.」
- 「.」の連続

とかいうdocomoなどで許可されている変態形式は送れないので
形式チェックをはずさなくてはならない

[WordpressのPHPMailerのアドレス形式チェックをはずす](http://qiita.com/ki6ool/items/535f99db3624cf848dc2)


#### Optimize Database after Deleting Revisions

Better Delete Revisionが最近更新されないので
代替を探していたらいいのがありました。

[WordPressリビジョン削除と無効化プラグイン！自動保存回数管理も](http://affikatsu.com/revision-delete-4215/)

リビジョン削除対象の期間を指定できるのがいいですね。
Common Lispで可変長配列を使う


最近CommonLispの勉強をはじめた．
その中で可変長配列を作成したいなと思った時に案外ややこしかったので備忘録を書いておく．

Lisperの方たちどころか，ちょっと勉強した方にとっては当たり前かもしれないがあくまで自分のために．

#可変長配列の生成

可変長の配列は，JavaならArrayListを使って特に患うことなく定義できるが，CommonLispの場合は少しだけややこしいような気がする．
とは言っても大して難しいものでもない．以下のコードで作成できる．

``` :CommonLisp
CL-USER> (make-array 5 :fill-pointer 0 :adjustable t)
```
各要素を簡単に解説する．

##make-array
この関数は名前の通り，配列を作る関数．
固定長の配列を作るだけなら以下のように，配列の大きさと初期値を渡すだけでいい．

``` :CommonLisp
CL-USER> (make-array 5 :initial-element nil)
```

1つ目の引数が配列の大きさで，2つ目にあるキーワードが初期値を設定するためのキーワード，3つ目の引数がその初期値．
よって上のコードでは要素数5でその全てがnilである配列が生成される．

####:fill-pointer
このキーワード引数は次に要素を追加する位置(インデックス)を表す．
初めのコードでは0番目，つまり一番初めの位置に挿入することを意味している．

配列にデータを挿入する関数は後ほど．


###:adjustable
このキーワード引数が今回の可変長配列作成のキモ．
というかこれだけ知ってれば問題ないのか．

tに設定すれば可変長の配列を定義できる．


#可変長配列への要素の追加
上のようなコードで生成した配列に要素を追加するには**vector-push-extend**関数を用いる．
逆に配列から要素を取り出すには**vector-pop**を用いる．
**vector-push**という関数も存在するが，それらは要素数が最初に定義した数より大きい場所には追加できない．
**-extend** がついていると元々定義していた要素数を超過した際に自動的に配列を拡張してくれる．

``` :CommonLisp
CL-USER> (defparameter *sample-vector* (make-array 5 :fill-pointer 0 :adjustable t))
*SAMPLE-VECTOR*
CL-USER> (vector-push-extend 'sample1 *sample-vector*)
0
CL-USER> *sample-vector*
#(SAMPLE1)
CL-USER> (vector-pop *sample-vector*)
SAMPLE1
```

これだけ．
プログラミング（全般）の勉強に役立つ書籍まとめ（※面白い本のみ）

この記事は、プログラミングの考え方をわかりやすく説明している面白い本をまとめました。

※随時更新するかも。

## 小さく作る （Small is beautiful）

- [UNIXという考え方](http://www.amazon.co.jp/UNIX%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9%E2%80%95%E3%81%9D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3%E3%81%A8%E5%93%B2%E5%AD%A6-Mike-Gancarz/dp/4274064069)

多くのシステムがUnix（Linux）というOSで動いていますが、もちろんそのOS自体もプログラムです。巨大で複雑なOSというプログラムはどのような考え方で作られているのか、普段プログラミングするときに知るべきことがたくさんあります。

## オブジェクト指向とかいろいろなプログラミングの概念について

- [まつもとゆきひろコードの世界](http://www.amazon.co.jp/%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D%E3%80%80%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%B8%96%E7%95%8C-%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D-ebook/dp/B00HZGBI76/ref=sr_1_1?s=books&ie=UTF8&qid=1458206887&sr=1-1&keywords=%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%B8%96%E7%95%8C)

Rubyの作者Matzさんの著書。プログラミング全般のオブジェクト指向とかマルチスレッドなどの考えたかをわかりやすく説明し、かつプログラミング言語の設計者としての考えや今後の課題にも触れている。興味のある項目だけつまみ食いするのに最適。コラムでRailsにも言及していて、あまり好みではないと言っていて面白い。

※Rails: Rubyで書かれたWebフレームワーク。DHHというデンマークのプログラマが作った。

- [まつもとゆきひろコードの未来](http://www.amazon.co.jp/%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D-%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9C%AA%E6%9D%A5%EF%BC%88%E6%97%A5%E7%B5%8CBP-Next-ICT%E9%81%B8%E6%9B%B8%EF%BC%89-ebook/dp/B013DLCW0S/ref=sr_1_1?s=books&ie=UTF8&qid=1458206915&sr=1-1&keywords=%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9C%AA%E6%9D%A5)

Rubyの作者Matzさんの著書。上記本の続編。

## 天才プログラマの考えてること

- [小飼弾のアルファギークに逢ってきた](http://www.amazon.co.jp/%E5%B0%8F%E9%A3%BC%E5%BC%BE%E3%81%AE%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%82%AE%E3%83%BC%E3%82%AF%E3%81%AB%E9%80%A2%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F-WEB-DB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/477413452X/ref=sr_1_1?s=books&ie=UTF8&qid=1458206943&sr=1-1&keywords=%E5%B0%8F%E9%A3%BC%E5%BC%BE%E3%81%AE%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%82%AE%E3%83%BC%E3%82%AF%E3%81%AB%E9%80%A2%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F)

いろいろな世界の天才プログラマへのインタビュー。インタビューしている小飼さんも天才プログラマなので、天才同士の話が面白い。個人的には、Railsの作者のDHHとの対談が一番好き。
Support Library v23.2系へバージョンを上げた際に起きた不具合事例とその対策


# 概要
Support Libraryのバージョンをv23.1からv23.2.1にバージョンを上げたところ、デザインが崩壊したためそれに対応した際のメモです。


# バージョンを上げたことによって発生した問題
## タブのセルが正しく描画されなくなった

RecyclerViewをベースに作成した無限(擬似)SlidingTabのレイアウトが以下のGifのように崩れました。

![qiita1.gif](https://qiita-image-store.s3.amazonaws.com/0/43438/c3733b12-98d8-e586-9674-3020e7b4b89f.gif "qiita1.gif")


## onConfigurationChanged時にタブのリサイズが上手く動作しない

AndroidManifestでActivityに`android:configChanges="orientation|screenSize"`を指定しています。これによって画面回転時にAcitvityが破棄されなくなります。画面の回転を検知すると`onConfigurationChanged`メソッドが呼ばれるので、onConfigurationChangedをオーバーライドしタブのセル幅をリサイズしています。

これはタブのセルが正しく描画されるよう修正した後に気づいたのですが、画面を回転させた際にタブのリサイズが上手くできていませんでした。

![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/11d3e02a-32d6-2172-609f-8453523f7d3f.png "qiita2.png")

# 原因と解決方法

## タブのセルが正しく描画されない問題
v23.2系でRecyclerviewにサイズの自動調整機能が実装されたのが原因でした。したがって、タブのセルに利用してたレイアウトの寸法値の指定を`MATCH_PARENT`から`WRAP_CONTENT`に変更することでレイアウトの崩れを解消することができました。

## onConfigurationChanged時にタブのリサイズが上手く動作しない問題
タブをリサイズする際に以下のコードで画面幅を取得し、タブのリサイズに使用していました。

```java
@Override
protected void onConfigurationChanged(final Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    int displayWidth = getResources().getDisplayMetrics().widthPixels;
    
    // タブのリサイズ処理
}
```

タブのリサイズに失敗する原因を調べたところSupport Libraryをv23.2.1にバージョンを上げた場合、`getResources().getDisplayMetrics().widthPixels`で取得するwidthPixelsが、portrait時の画面幅のまま更新されていませんでした。

このため、画面幅の取得方法をWindowManagerから取得する方法に変更したところ、画面の回転に応じた画面幅を取得でき、タブのリサイズも問題なく動作するようになりました。

```java
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);

int displayWidth = displayMetrics.widthPixels;
```

![qiita3.png](https://qiita-image-store.s3.amazonaws.com/0/43438/73d42774-f4e9-400f-431a-0c6973bf176a.png "qiita3.png")

portrait固定の画面であればDisplayMetricsをResourcesから取得してもWindowManagerから取得しても問題ないと思います。ただ[DisplayMetrics](http://developer.android.com/intl/ja/reference/android/util/DisplayMetrics.html)のドキュメントにもWindowManagerから取得する方法が載っていますし、displayMetricsを利用する時はWindowManagerを利用するようにしていこうと思います。ドキュメント読むの大切...

# まとめ
Support Library v23.2系へバージョンを上げた場合

* RecyclerViewを使用している箇所でレイアウトが崩れたなら寸法指定を確認し`WRAP_CONTENT`を試す
* ResourcesからDisplayMetricsを取得している場合、onConfigurationChanged時等に正しい値が取れないのでWindowManagerからDisplayMetricsを取得する

# 参考
* http://developer.android.com/intl/ja/tools/support-library/index.html
	* Support Libraryの変更点についての概要
* https://speakerdeck.com/androhi/support-library-v23-dot-2-overview
	* 情報がまとまっていてとても参考になりました。
Error: $resource:badcfg

Response does not match configured parameter



Error in resource configuration for action `get`. Expected response to contain an object but got an array


Angularにてこのようなエラーが出たのでメモ。

かなりハマったが、
以下のAngularのドキュメントサイトに解決法が書いてありました。
https://docs.angularjs.org/error/$resource/badcfg


>Description
>This error occurs when the $resource service expects a response that can be deserialized as an array but receives an object, or vice versa. By default, all resource actions expect objects, except query which expects arrays.
>
>デフォルトでは、すべてのリソースアクションは、アレイを想定されているクエリーを除いて、オブジェクトを期待しています。


サーバーサイド（ASP.NET）から返していたデータは以下

```csharp
public IHttpActionResult Get()
{
    var result = new List<object>();
    return Ok(result);
}
```

Listを直接吐き出していたのが原因だった模様
以下に変更
```csharp
public IHttpActionResult Get()
{
    var list = new List<object>();
    var result = new
    {
        message = "success",
        data = list
    };
    return Ok(result);
}
```


これでデータを正常に受信できるようになりました。

```js

return fooSvc.get(queryArgs).$promise.then(
    function (result) {
        return result.$promise;
    }, function (result) {
        return $q.reject(result);
    });
    
```
Promise snippets memo

```
var promise = new Promise( (resolve,reject) => {
    var data = 10;
    resolve(data);
  }
).then( (data) =>{
  console.log(data); // 10
  data *= data; // 100
  return data;
}).then( (data) =>{
  console.log(data); //100
  return 'my name';
}).then( (data) =>{
  console.log(data); //my name
  return data + 'is pole';
}).then( (data) =>{
  console.log(data); //my name is pole
  return data + 'is pole';
});
```
hubotを生成するときにエラーが出てつまずいた話

# はじめに
hubotを作ろうと思ったら以下のエラーが出て作れなかった時のメモ

```
npm ERR! Darwin 15.3.0
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "hubot" "hubot-scripts" "hubot-diagnostics" "hubot-help" "hubot-heroku-keepalive" "hubot-google-images" "hubot-google-translate" "hubot-pugme" "hubot-maps" "hubot-redis-brain" "hubot-rules" "hubot-shipit" "hubot-slack" "--save"
npm ERR! node v5.8.0
npm ERR! npm  v3.8.2
npm ERR! code ENOSELF

npm ERR! Refusing to install hubot as a dependency of itself
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     
/XXX/myhubot/npm-debug.log
```

# 調査結果
```
$yo hubot
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

? Owner Name <email@email.com>
? Bot name (hubot)
```
Bot nameをいれるところで、名前を**hubot**にしていたのがいけなかったらしい。
知らんかった・・hubot以外の名前をつけてあげたら何事も無くhubot生まれました。