OmniAICreator/Qiita-1.07M huggingface dataset:
AWS LambdaのiOS SDKで "Unable to parse clientContext as json" エラー

AWS LambdaのiOS SDKでタイトルの様なエラーが出てfunctionが実行されない場合の原因と解決策です。結論から言うとBundle display nameに特定の文字が含まれていると起こるようです。

## 実験
次のようなコードで実験してみます。アプリ名を表示するだけです。

```js:Lambda
console.log('Loading function');

exports.handler = function(event, context) {
    context.succeed(context.clientContext.client.app_title);
};
```

```objc:iOS
AWSLambdaInvoker *lambdaInvoker = [AWSLambdaInvoker defaultLambdaInvoker];
NSLog(@"client: %@", lambdaInvoker.clientContext.appName);
[[lambdaInvoker invokeFunction:@"helloLambdaWorld" JSONObject:@{}] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
    if (task.error) {
        NSLog(@"Error: %@", task.error);
        if ([task.error.domain isEqualToString:AWSLambdaInvokerErrorDomain]
            && task.error.code == AWSLambdaInvokerErrorTypeFunctionError) {
            NSLog(@"Function error: %@", task.error.userInfo[AWSLambdaInvokerFunctionErrorKey]);
        }
    }
    if (task.exception) {
        NSLog(@"Exception: %@", task.exception);
    }
    if (task.result) {
        NSLog(@"server: %@", task.result);
    }
    return nil;
}];
```

### Bundle display nameが英語のみの場合

```xml
<key>CFBundleDisplayName</key>
<string>shogi</string>
```

```
client: shogi
server: shogi
```

期待した通りの結果です。

### Bundle display nameに特定の文字を含んでいた場合

```xml
<key>CFBundleDisplayName</key>
<string>将棋</string>
```

```
client: 将棋
Error: Error Domain=com.amazonaws.AWSLambdaInvokerErrorDomain Code=1 "(null)" UserInfo={com.amazonaws.AWSLambdaInvokerFunctionErrorKey=Unhandled, errorMessage=Unable to parse clientContext as json}
Function error: Unhandled
```

エラーが出ました。メッセージからもclientContextに問題があったことが分かります。

## 対応

### SDKを変える

AWS SDKをCocoaPodsで入れている場合、clientContextを組み立てる部分を変更すればいけます。

```objc:AWSCore/AWSClientContext.m
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *appBuild = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *appPackageName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
// ここを何とかする
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
```

Lambda側でアプリ名を使ってない場合問題無さそうです。ただし、Podsで入れたコードを書き換えるのは何かと面倒です。

### Bundle display nameを変える

iOSアプリでホーム画面に表示されるアプリ名を変えたい場合、InfoPlist.stringsを使えばそちらが優先されるので、表示したいアプリ名をInfoPlist.stringsに書いてBundle display nameは英語だけにしておくという方法でも対応できます。

[[iOS] アプリ名を国ごと変更したい場合](http://qiita.com/hiroo0529/items/da9909f6787f2dce75e3)

ただし、Bundle display nameは検索用のキーワードを入れる場所として使えるという噂もあるので、状況によってはこの手が使えない場合もあります。

[App Store の検索について](http://hoshi0523.hatenablog.com/entry/2015/02/09/194331)

***

Lambda側で対応されるまではプロジェクトに応じて回避策を選ぶのが良さそうです。
Ruby 可変長引数でのメソッド作成

昔作ったClassの整理をしていて、コンストラクタに渡す引数が違うので別Classを用意して対応しているいけていないものがあったので、今更ながら可変長引数を利用してまとめることに。

##1.内容

例
Memcacheの操作で必要となる、値のSet/Getを行うだけのクラス

```
class MemCacheR

    include Singleton
    attr_accessor :x, :y, :z

    def initialize(*args)
        @x, @y, @z = args
    end

    def mem_get(*args)
       x = args[0]
       y = args[1]
       cache = MemCache.new('127.0.0.1:11211')
       cache.get(x+y)
    end

    def mem_set(*args)
      x = args[0]
      y = args[1]
      z = args[2]
      z ||= 0
      cache = MemCache.new('127.0.0.1:11211')
      cache[x+y]= z
    end
end
```

X + yで keyを生成、Zは値

##2.確認

```
MemCacheR.instance.mem_set("hogehoge", "1111111", 500000)
a =  MemCacheR.instance.mem_get("hogehoge", "1111111")
p a
500000
```
取得できればOK
iPhoneかiPadか区別し、画面の向きを変更する

アプリをビルドした時に、iPhoneは縦向き固定。iPadは、右左の横向き固定にしたい。

TARGETSのGeneralにある、Device Interfaceは、どれにもチェックしていません。

以下の記述で対応可能

```ViewController.swift
    // デバイスの向き変更
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        var orientation = UIInterfaceOrientationMask()
        // iPhoneの時は縦固定、iPadの時は、横向きの右左固定
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
            orientation = UIInterfaceOrientationMask.Portrait // 縦
        } else {
            orientation = [UIInterfaceOrientationMask.LandscapeRight,UIInterfaceOrientationMask.LandscapeLeft] // 右、左
        }
        return orientation
    }
    
    //指定方向に自動的に変更
    override func shouldAutorotate() -> Bool{
        return true
    }
```

NavigationControllerを使っている場合は、上記の記述をそちらに書くとうまくいきます。
GitHubで世界一スターの多いリポジトリが数年ぶりに交代。Bootstrapが2位FreeCodeCampが1位へ

GitHubで世界一Starの多いリポジトリが数年ぶりに交代し、BootstrapからFreeCodeCampとなっています。


#ここ数年GitHubのスター数1位はBootstrapだった

GitHubでは各リポジトリにスターをつけることができ、スターが多い程人気のプロジェクトということになりますが、ここ数年一位はTwitter社のBootstrapでした。事実、2016/3/22時点のWikipediaには「**GitHubで最も人気がある(2013/10/5調査)**」との記載があり、また2016/3/9にスター数ランキングを調べた時（※1）、1位はBootstrapでした。

![Bootstrap - Wikipedia](https://qiita-image-store.s3.amazonaws.com/0/67884/c178ecdc-c694-2855-6d1f-b2456ef62a89.png)

![](https://qiita-image-store.s3.amazonaws.com/0/67884/4f364f50-c4be-153e-af68-5d289e2e258b.png)

▲ 2016/3/22時点でのWikipedia


#FreeCodeCampがスター数1位になった
2016/3/22現在、[FreeCodeCamp](https://github.com/FreeCodeCamp/FreeCodeCamp)に代わり、Bootstrapは2位になっています。FreeCodeCampとはコードを学習するためのオープンソースのコミュニティです。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/6759d9d2-da9d-6fca-67b5-b1cdbaf96079.png)

▲ 2016/03/22時点での[GitHubスター数ランキング](https://github.com/search?o=desc&q=stars%3A%3E1&s=stars&type=Repositories&utf8=%E2%9C%93)


2016/3/9にスター数ランキングを調べた時（※2）は約88,000(2位)、 @n-oshiro 氏が2016/1/10に調べた時（※3）は約54,000(2位)とのことですので、急激な伸び(1万Star/1ヶ月)を見せていることがわかります。

Wikipediaに倣うなら、「GitHubで今1番人気があるのはFreeCodeCamp」ということになりますね。

※1,※2 [GitHubで1番人気のあるプロジェクトはどれだ！ 2016年版スター数ランキング](http://qiita.com/tonkotsuboy_com/items/9db94fd1daddb0d6c957)
※3 参考：[GitHubリポジトリのスター数ランキングを表示する by @n-oshiro ](http://qiita.com/n-oshiro/items/e344bbeca52e41df443a)
cross join unnestを利用して、カンマ区切りのデータを単一の列の複数レコードに分解する。

# 「cross join unnest」という関数と「split」関数を使えば実現できます。

## サンプル

```sql
select
  split_record
from
  tbl_test t1
cross join unnest( --・・・(1)
  split(t1.csv_column, ',') --・・・(2)
) as t (split_records)
```

## 処理概要

ざっくり説明すると
(2)のsplit関数で文字列(t1.csv_column)をカンマで分割して、配列にし、
その配列を(1)のcross join unnest関数で、単一の列のレコードに展開します。

## イメージ
![cross join unnest-1.png](https://qiita-image-store.s3.amazonaws.com/0/19858/8fa4c33c-e2e9-cafd-282f-c9a19b3bbf81.png)


## ■split関数

split(文字列, 区切り文字)・・・
第1引数の文字列を第2引数の区切り文字で分割し、配列にします。

## ■cross join unnest関数

cross join unnest(配列) AS t (展開後のカラム名)・・・
第1引数の配列を単一の列のレコードに展開します。
カラム名は第2引数の展開後のカラム名になります。

## まとめ

treasureデータなどのビックデータ基盤には、分析時に扱い易いように加工した上で
データが登録されているケースもありますが、必ずしもそうではなく
そのままでは分析に使い辛いようなデータも、登録されていることがあると思います。
今回のご紹介は、csv形式でデータが登録されているが
そのcsvの1区切りを1レコードとして扱いたい場合を例に紹介させて頂きました。
この記事が分析などの業務のお役に立てばと思います。
Fragmentで引数なしコンストラクタを消したらハマった話

頭から結論ですが、「Fragmentを実装するとき、引数なしコンストラクタは必ず実装するように」という話です。

以前、Fragmentで実装された画面部品からActivityが保持する画面部品に対して操作をさせようとするために、Listenerを実装してActivityからFragmentにコンストラクタ経由で渡すように実装したところ、罠にはまりました。

というのも、Fragmentはメモリが枯渇すればActivityとは別のタイミングで破棄されるので、Fragmentが必要になれば、いつでも再生成させるようになっています。
そのときOS側が再生成するのに利用するのは、該当Fragmentの【引数なし】コンストラクタです。

そうとも知らず、Fragmentの引数ありコンストラクタを実装して空のコンストラクタを削除すると、以下のようなエラーが【たまに】出るようになります。

```
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.SampleActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.sample: make sure class name exists, is public, and has an empty constructor that is public
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2244)
	at android.app.ActivityThread.access$600(ActivityThread.java:149)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:213)
	at android.app.ActivityThread.main(ActivityThread.java:5092)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:511)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:564)
	at dalvik.system.NativeStart.main(Native Method)
Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.sample: make sure class name exists, is public, and has an empty constructor that is public
	at android.support.v4.app.Fragment.instantiate(SourceFile:413)
	at android.support.v4.app.FragmentState.instantiate(SourceFile:97)
	at android.support.v4.app.FragmentManagerImpl.restoreAllState(SourceFile:1790)
	at android.support.v4.app.FragmentActivity.onCreate(SourceFile:213)
	at android.support.v7.app.ActionBarActivity.onCreate(SourceFile:97)
	at com.sample.SampleActivity.onCreate(SourceFile:100)
	at com.sample.SampleActivity.onCreate(SourceFile:100)
	at android.app.Activity.performCreate(Activity.java:5104)
	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158)
	... 11 more
Caused by: java.lang.InstantiationException: can't instantiate class com.sample; no empty constructor
	at java.lang.Class.newInstanceImpl(Native Method)
	at java.lang.Class.newInstance(Class.java:1319)
	at android.support.v4.app.Fragment.instantiate(SourceFile:402)
	... 20 more
```

このエラーの厄介なところはシステムが一旦Fragmentを破棄し、再び利用されたときにしか再現しないので、普通に端末テストをしただけでは再現しないということです。

ちなみにこの話はあんざいゆき先生のブログでも紹介されている。

[Android　Fragment で setArguments() してるサンプルが多いのはなぜ？](http://y-anz-m.blogspot.jp/2012/04/androidfragment-setarguments.html)

ただ、AndroidStudioではFragmentに引数なしコンストラクタがないとエラーを表示するようになったので、この罠を踏む人は少なくなるのかもしれない。


ちなみに、このハマった問題はやっぱりあんざい先生のブログからヒントを得て改善しました。
※あんざい先生はこの方法は好きではないとおっしゃっていますが。。。

[Fragment から Activity にコールバックする方法](http://y-anz-m.blogspot.jp/2012/06/fragment-activity.html)

この場を借りてあんざい先生に感謝。
Ubuntu 14.04.4 の Docker でZabbix agent を static library で作る

# 概要

* [zabbix_agent staticライブラリ化 - Qiita](http://qiita.com/rotekxyz/items/2dfa6879bcb7eb4b36a8)

ここに書いてあることを、Ubuntu 14.0.4.4 でやってみたかった。

# 結論

できた。

# やりかた

zabbixのソースを落としてきて（今回は2.2.11をつかった)、そのディレクトリで


```
docker run -v $PWD:/work -ti ubuntu:14.04.4 /bin/bash
```

開発環境を整える

```
apt-get update
apt-get install build-essential
```

configure から make

```
./configure  --enable-static --enable-agent
make
```

以下のコマンドでzabbix_agentの確認

```
file src/zabbix_agent/zabbix_agentd
ldd src/zabbix_agent/zabbix_agentd
```

実際のログ

```
#file src/zabbix_agent/zabbix_agentd
src/zabbix_agent/zabbix_agentd: ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=6d4d498b933736650f71cb66e7f4874338fc8b04, not stripped
# ldd src/zabbix_agent/zabbix_agentd
	not a dynamic executable
```

以下のコマンドでzabbix_senderの確認

```
file src/zabbix_sender/zabbix_sender
ldd src/zabbix_sender/zabbix_sender
```
実際のログ

```
# file src/zabbix_sender/zabbix_sender
src/zabbix_sender/zabbix_sender: ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=4d8a1cbb447ac5b9822deb0c8c2574dc1da68c79, not stripped
# ldd src/zabbix_sender/zabbix_sender
	not a dynamic executable
```
fastlaneでfabric/crashlyticsにアップロードできない時の対処法

コンソールには `Build successfully uploaded to Crashlytics Beta 🌷` と出るのにアップロードできない時の対処法。

crashlytics_pathを変える。

### before
`crashlytics_path: './Pods/Crashlytics/Crashlytics.framework'`

### after
`crashlytics_path: './Pods/Crashlytics/iOS/Crashlytics.framework'`
imagesLoadedで画像の読み込み時になんかする (祝・背景画像対応)

Webサイトを作っていると、画像の読み込み完了を待ってなにかする、という実装をよくします。
僕は面倒なので[imagesLoaded](http://imagesloaded.desandro.com/)をいつも使うんですが、いつの間にか背景画像にも対応していて、さらに便利になった印象です。

参考：[imagesLoaded gets backgrounds · Metafizzy blog](http://metafizzy.co/blog/imagesloaded-gets-backgrounds/)


## 書き方
### jQueryと一緒に使う場合

```js
$('#container').imagesLoaded({background: true}, () => {
  console.log('背景画像が読み込まれたよ！');
});
```

### jQuery使わない場合

```js
imagesLoaded(document.getElementById('container'), {background: true}, () => {
  console.log('背景画像が読み込まれたよ！');
});
```

と、こんな感じで書けます。便利ですね！


## 補足：Browserify/Webpack環境でimagesLoadedを使う場合
Browserify/Webpackでimagesloadedを使用する場合は、以下のように書きます。

### jQueryと一緒に使う場合
まず、imagesLoadedとjQueryをインストール。

```
$ npm install imagesLoaded jquery --save
```

そして、imagesLoadedを使いたい箇所で以下のようにします。

```js
window.jQuery = window.$ = require('jquery');
const imagesLoaded = require('imagesloaded');
imagesLoaded.makeJQueryPlugin($);

$('#container').imagesLoaded(() => {...});
```

### jQuery使わない場合
まず、imagesLoadedをインストール。

```
$ npm install imagesLoaded --save
```

そして、以下のようにします。

```js
const imagesLoaded = require('imagesloaded');

imagesLoaded(elem, () => {...});
```


## まとめ
背景画像の読み込み完了の検知、諦めていたのでimagesLoadedが対応してくれて、ありがとうの生まれる光…🙏という感じです。

あんまりソースは読めていませんが(読めるだけのJS力がない…😇)、ダミーの`image`要素を作って、その`src`に背景画像のパスをセット→その`image`要素の読み込み完了する=背景画像の読み込みが完了する、というような実装っぽいです。こういう面倒な処理をいい感じにやってくれるのは助かります。ライブラリ自体もMinify時で5KBほどだし。
ShellScriptとxmllintでxmlを解析

ShellScriptド素人メモ
xmllintを使って以下のxmlを解析して値＆属性値を取り出す

```xml:sample.xml
<?xml version='1.0' encoding='utf-8' ?>
<top>
    <int name="hoge" value="327">100</int>
</top>
```

# 属性値を出力
327を取り出す場合、以下のようにする

```bash
echo 'cat /top/int/@value' | xmllint --shell sample.xml | grep value= | sed 's/[^"]*"\([^"]*\)"[^"]*/\1/g'
```

# 要素の内容を取得
100を取り出す場合、以下のようにする

```bash
echo 'cat /top/int' | xmllint --shell sample.xml | grep value= | sed 's/^.*<int.*>\(.*\)<\/int>.*$/\1/' 
```
訪問済みのリンクを未訪問にするブックマークレット

# 訪問済みのリンクを未訪問にするブックマークレット
 
もう覚えてないくらい昔に作ったものだけど投下

未訪問というか、a タグ href 属性の末尾に、問答無用で ? + 乱数三桁 付けるだけです。
未訪問状態の画面キャプチャをしたい時などに。

```js
javascript:(function(){var%20at%20=%20document.getElementsByTagName('a');%20var%20atr%20=%20Math.random().toString().substr(3,%203);%20for(i%20in%20at){var%20yv%20=%20at[i].getAttribute('href')%20+%20'?'%20+%20atr;%20at[i].setAttribute('href',%20yv)}})();;
```
【vvvv】パーティクルを理解する【particles】

vvvvはいろいろな表現を作ることができるわけですが、はじめたての方にはどっから手を付けていいかわからないことでしょう。
「パーティクル」といえば、メディアアートっぽい表現ですね。とりあえず、パーティクルをどう使うかを通じて、vvvvの処理を学んでいきましょう。

あと、ほかの用途としては、Particlesのヘルプパッチを見て絶望した人向けです。

# vvvvでパーティクル表現をする。

何はともあれ、パーティクル関係のノードを出してみましょう。

![p2d.png](https://qiita-image-store.s3.amazonaws.com/0/100231/d4b2c327-720a-5046-303b-c9c7e6572021.png)

ほほう。4つありますね。
4つとも使い道はあるのですが、とりあえずスタンダードに行きましょう。

Particles(2d Field)[vux]
を使ってみたいと思います。
![par2d.png](https://qiita-image-store.s3.amazonaws.com/0/100231/768aec81-bb4f-1b08-5c41-371c7f2bc7ed.png)

こういう時に、vvvvではお約束がありました。

ノードを出したら、そのノードを選択して[F1]キーを押します。すると作例とともにヘルプパッチが姿を現すのです！！！！
![ヘルプパッチ.png](https://qiita-image-store.s3.amazonaws.com/0/100231/ea4f013d-d008-533a-f45a-f1eed521fa3d.png)





**わかりにくい！！！！！**



はい。なぜかなぜか、パーティクルのヘルプパッチはなかなか複雑に作られていて、初心者の心を折りかねない不親切設計になっています。
なので今回は、必要十分の表現を紹介したいと思います。

#Particles(2d Field)[vux]
Particles(2d Field)[vux]を使ったパーティクル表現です。
![stunderd.gif](https://qiita-image-store.s3.amazonaws.com/0/100231/c5759194-b406-766f-237c-76df3d19c5fc.gif)

Quadがたくさん出ては消えてゆきます。
そうです、2dの空間で、パーティクルが生成されました。

**Age**は1つのパーティクルの寿命(秒数)です。つまり例の場合だと、生成された各Quadは2秒間表示されては消えることになります。この値が0だとパーティクルが生まれた瞬間に死ぬので、何も起こってないように見えます。

**VelocityDeviationXY**は、XY方向への広がりを決めます。この値を0にしてしまうと、生成されたパーティクルが動かないため、何も起こってないように見えてしまいます。

**Emit**は、1が入力されているとき、1フレームに1つのパーティクルを生成します。この値が0だとパーティクルが生成されません。

はい。これがとりあえず、一番簡単なパーティクル表現です。

ここで違和感を持たれた方がいるかもしれません。パーティクルはTransformにつながれて、それからQuadにつながっています。これはどういうことかというと、
**Particlesが出力するのは、あくまで座標なのです。**
その座標がQuadというプリミティブ(図形)に渡されているからたくさん出ているように見えるのです。
もちろん。Segmentというプリミティブにつなげば、丸い形のパーティクルが出ますし、
Boxというプリミティブにつなげば、ボックスの形をしたパーティクルが出ます。

**パーティクルは、あくまで座標である**ということを覚えておきましょう。


#Particles(**3d** Field)[vux]
さっきは2d上、つまりxy平面上でパーティクルが散っていました。
vvvvはさくっと3d表現が作れるのがウリです。
早速3dで作ってみましょう。
![3dpar.gif](https://qiita-image-store.s3.amazonaws.com/0/100231/5f873208-5cf7-7856-fcec-c79f36096071.gif)

実はほぼほぼさっきと変わっていません。
3d空間で飛ばしているので、xyz方向それぞれに広がってゆきます。
それをわかりやすくするためにAxisAndGridとCamera(TransformSoftimage)を使って3d空間を見やすくしています。

(誤表記というか…gif画像だとVelocityDeviationXYZに2つのスプレッドしか持ってないようになってるのですが、実際はxyzの3つに0.01がすべてに入っています。Rowsの値をあげて、3つ表示させるのを忘れました。まぁ同じようにやっても、1つ目のスプレッドが使われるだけなので問題ないです。)

#Particlesのおまけ

パーティクルはもちろんテクスチャを張ったQuadなどを飛ばすこともできます。透過pngとかを使えばもちろん透過します。
おまけとしてはこんな感じに、飛んでく角度も制御することができます。
![arrow.gif](https://qiita-image-store.s3.amazonaws.com/0/100231/eb9cced7-9a15-8d79-553d-28dd56db9e9a.gif)

あとは、エフェクトをかけることが重要ですね。
Glowのエフェクトをかけるだけで、かなり神々しくなります。
![test5.gif](https://qiita-image-store.s3.amazonaws.com/0/100231/aa7c2051-3440-8750-9652-5fb476cf816e.gif)


こんな感じですかね。
何かあればTwitterで「#vvvv_jp」をつけて質問してください。
vvvvJpのメンバーがタイムラインを監視しているので、返事があるはずです。

動画だと、こちらがおすすめです。
https://www.youtube.com/watch?v=vpbA6NnjDsE

よきvvvvライフを。
PowerShellプログラムのおすすめディレクトリ構成とユニットテストメモ

# ユニットテストリンク集

* Pesterの紹介と使い方 http://www.powershellmagazine.com/2014/03/12/get-started-with-pester-powershell-unit-testing-framework/
* Pester公式Wiki https://github.com/pester/Pester/wiki

# おすすめディレクトリ構成

この構成はPesterの実装からいただきました。


```
+---Invoke-MyCommmand.ps1
+---Invoke-MyCommands.Tests.ps1
\---Functions
    +---function1.ps1
    +---function1.Tests.ps1
    +---function2.ps1
    +---function2.Tests.ps1
    \---（続く……）
```

`Invoke-MyCommand.ps1`が本体プログラムです。

`Functions`の下に関数を置き、本体プログラムから読み込みます。

ユニットテストは`.Tests.ps1`という拡張子をつけます。


# プログラムのひな形

```ps1:Template.ps1
<#
.SYNOPSIS
プログラムの短い説明

.DESCRIPTION
プログラムの詳しい説明
#>
Set-StrictMode -Version Latest

$moduleRoot = Split-Path -Parent $MyInvocation.MyCommand.Path

# 関数を読み込み
"$moduleRoot\Functions\*.ps1" |
Resolve-Path |
Where-Object { -not ($_.ProviderPath.ToLower().Contains(".tests.")) } |
ForEach-Object { . $_.ProviderPath }
```

# ユニットテストのひな形

```ps1:Template.Tests.ps1
Set-StrictMode -Version Latest

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path).Replace(".Tests.", ".")
. "$here\$sut"

Describe "function1" {
    It "returns true" {
        # テストコード
    }
}
```
node.js+websocketとProcessingでやりとり


#環境
mac osx 10.10 yosemite

node.js v0.10.25
ws(node.jsのモジュール インストール方法は下に)

Processing3.0.2(3.0aはエラーでました)
websockets(Processingライブラリ)

##環境設定
### node.js
https://nodejs.org/en/
http://nodejs.jp/（日本語）

インストール方法は色々なサイトで紹介されています
nvmやnpmも入れると便利です

### ws

```
npm install ws
```

npmあること前提で、このコマンドでインストールします。

### Processing
https://processing.org/download/

### websockets
Processing内の[Add Library]から検索したらありました
Github https://github.com/alexandrainst/processing_websockets

#サンプルコード

サーバ側のnode.js

```js:wsServer.js
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ port: 5000 });

console.log("listening port :5000");

wss.on('connection', function connection(ws) {
    console.log('connection');

    ws.on('message', function incoming(message) {
        console.log('received: %s', message);

        ws.send('Hello from ws');
    });

    ws.on('close', function() {
        console.log('close');
    });
});

```

クライアント側

```java:odeWsSample.pde
import websockets.*;

WebsocketClient wsc;
String message = "";

void setup(){
  size(400,400);
  
  wsc= new WebsocketClient(this, "ws://localhost:5000");
}

void draw(){
  background(255);
  fill(0);
  text(message, 20, 20);
  
  if(frameCount % 60 == 0) {
    wsc.sendMessage("Hello from P5");
  }
}

void keyPressed() {
  wsc.sendMessage("press key"+key);
}

void webSocketEvent(String msg){
 println(msg);
 message += msg + "\n";
}

```

#実行
まず、ターミナルからwsServer.jsがあるところまで移動します

```
$node wsServer.js
```

nodeを実行し5000番ポートで待ち受けます
次に、Processingのサンプルを実行します
基本ですが、必ずサーバ側から起動してください

無事Processingのスケッチもしくわコンソールとターミナルから各ログが出力されていれば成功です
Processing側でキーボードを押すとターミナルでその文字が出るかと思います

#補足的な発展
websocketなのでProcessing以外のものでも可能だし，Processingがサーバ側になることも可能
もちろんProcessing同士でも可能
「localhost」の部分を変更し，サーバ機を別にし遠隔やりとりも可能
Grepで簡単アクセス解析


アクセス解析ツールを使うまでもない、だいたいのアクセス数が知りたい場合のTips。
いろいろやり方はありますが、とりあえずGrepでお茶を濁す。

IISなり、Apacheなりのログファイルが手元にあるとする。

###全アクセス数=行数とみなす

特定のファイルを対象とする場合は、

```bash
cat abc.log | grep -c ""
```

とする。""で全行が対象となる。

IISとかでは、ヘッダ情報とかが入るので、実際のアクセス数よりは多くなる。
が、あくまで、だいたい・・・の話。

###特定のページへのアクセス=特定のページ名を含む行数

```bash
cat abc.log | grep -c "index.html"
```

###フォルダ内のすべてのファイルを対象とする

基本は特定ファイルの時と何も変わらない。

全行取得。

```bash
cat *.log | grep ""
```

特定のページ。

```bash
cat *.log | grep "index.html"
```

後は、正規表現等を駆使するなりしてお好みで。

###その他

ちなみに条件に正規表現を使いたい場合はegrepを使う。

```bash
cat *.log | egrep "admin+"
```
BackWpup（Free版）を日本語化した。

# 動機
WordPressの自動バックアップをしたかったので、鉄板プラグイン？のBackWpupを導入し、バックアップを試みた。

一番やりたかったDBのバックアップ・ダウンロードには難なく成功した。

メディア類も含めた丸ごとバックアップを試し、ダウンロードを試したら、なぜか解凍できなかった（stuffit explorer使ったら問題なくできた）
そして、画像などのメディアが保存されているディレクトリを開いたら一部の画像がない？！

## 一部画像がバックアップできなかった件について

年月別にメディア類がアップロードされているディレクトリ
（/wp-content/uploads/2016/03/ など）を見てみると、ファイル名が半角英数字以外だった画像が存在しない。

Webサーバ上で扱うファイルに使う文字は、ASCIIコードに含まれる半角英数字だけにしてほしいのが、エンジニア側の本音ですが・・・

大人の事情で、日本語（UTF-8）が含まれていても問題なく使えるようにする必要があるので、方法を考える。

# プラグインを日本語化すればよくね？

BackWpup(free)は、デフォルトの状態では英語しか用意されていません。
英語のままでも操作には差し支えなかったのですが、現状では「プラグインが直接操作する対象に、英語以外のものが含まれて居る事を想定していない」可能性が高いので、まずは日本語プラグインを導入する。

# 日本語プラグインを導入してみた。

下記リンク先を参考にしました。というか、手順は同じ。

BackWPup の最新版で日本語化する方法
http://qiita.com/inamoth/items/c2670757d6cba29e6ecf

付け加えて言えば、stableのjaのページで、export のところをクリックし
ダウンロードするときに、 all で、 (.po/pot)と(.mo）の両方をダウンロードする必要がある。 

https://translate.wordpress.org/projects/wp-plugins/backwpup/stable/ja/default

そして`backwpup-ja.po`と`backwpup-ja.mo`にリネームしたファイルを
`/wp-content/languages/plugins`（プラグインを問わず、言語ファイルを配置する位置）にアップロードする。

以上で日本語化に成功。

# ただし・・・

本題の、日本語を含むファイル名の問題は全然別のところだった。
この件は別途触れます。
androidのdatabindingで "Error:Cannot resolve type for item~"

こんなエラーがででビルドに失敗する。ついでに他のdatabindingのエラーもでる。ややこしい。

```
Error:Cannot resolve type for item~
```
なんやitem~って。

どうやら、databindingさせるレイアウトファイルのvariableのnameの書き方でbuild時にエラーになることがある。


```hoge.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="item"
            type="jp.shikajiro.HogeDto"/>
    </data>
...
```

~~variableのnameを"item"にするとだめっぽい。適当に他のにしよう。~~
typeの指定が間違ってる（存在しないクラスなど）と起きる模様。ただし、どのファイルでエラーかはメッセージは出てこないので自力で探すしかない。

```hoge.xml
    <data>
        <variable
            name="dto"
            type="jp.shikajiro.HogeDto"/>
    </data>
```
MITM1

#FREAKとは
輸出グレードのRSA暗号をサポートしていることによる脆弱性

※輸出グレードのRSA暗号
SSL/TLS 通信で使用する暗号アルゴリズムを非輸出用の鍵長の長い暗号から、輸出用の鍵長の短い暗号（輸出ってなんやねん！）

つまり、ソフトウェアが弱い暗号の受け入れをサポートしてるせいでMITMによって、弱い暗号の鍵を使った通信を強制される。
この通信はSSL通信であるのにもかかわらず解読可能になってしまう。

## MITAってどうやんの？
APRスプーフィング
DNSキャッシュポイジング

## 検証してみましょう。
続く
Python2.7 on Windowsでファイル名だけでPythonスクリプトを実行した際にsys.argvが渡されない問題の対処法

## 問題点
Python2.7 on Windowsの環境で、
たとえば以下のようなtest.pyがあったとして

```py
import sys

print(len(sys.argv))
```

引数付きでコマンドプロンプトから実行してもsys.argvが常に1になってしまう。

```
> test.py a b c
1 // <= NG: 本来は4であるべき
```

なおpythonコマンドから実行すると問題ない。

```
> python test.py a b c
4 // <= OK
```

## 対処方法
https://bugs.python.org/issue7936 にissueとして上がっていた。
結論としてはレジストリーをいじる。

regeditを立ち上げて、 `HKEY_CURRENT_USER\Software\Classes\Applications\python.exe\shell\open\command`に移動

<img width="556" alt="スクリーンショット 2016-03-22 午後5.57.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/42169/0ca6ab7a-2c0a-79e6-3984-7dd030d1a5da.png">

この値が`"C:\Python27\python.exe" "%1"`になっている場合は、`"C:\Python27\python.exe" "%1" %*`に修正する。

これで正しくsys.argvが渡されるようになるはず。

```
> test.py a b c
4 // OK
```

それにしても6年前に報告されたバグなので、さすがに修正されててほしかった。
Electron0.37でCSS Variables(CSSの変数)が利用可能になりました

**Electron0.37.0**から搭載Chromeが**49**になりました。
それに伴い49から実装された**CSS Variables**がElectronで利用可能になりました。
利用方法などは
[CSS Variables （CSS カスタムプロパティ） の使い方 | WWW WATCH]
など、日本語の記事がありますのでご活用ください。

丁度0.36系で触っていて`margin`周りの`calc()`でマジックナンバーだらけになってしまい、
「これは後々見返すとやばいっ…変数ほしい！」
となっていたので、Chrome49のリリースとElectronの対応を心待ちにしておりました。
**Sass**？なにそれｺﾜｲ！という自分のような方々も安心してデフォルトCSSで変数ライフをご堪能ください。
別ブラウザの対応を気にせず使えるのもやっぱりいいよね…

基本は

```css
:root {
    --hoge: 1px;
}

body { 
    margin: var(--hoge);
}
```

と`--`付きで宣言して`var(--～)`で利用します。

`calc()`にも使用できますが、符号の反転は
`-var(--hoge)`
ではまあ当然できなかったので、
`var(--hoge) * -1`
などで代用しました。


# 参照

* [Release electron v0.37.0 · atom/electron]
* [CSS Variables （CSS カスタムプロパティ） の使い方 | WWW WATCH]
* [Chrome Releases: Stable Channel Update Chrome 49]
* [Chromium Blog: Chrome 49 Beta: CSS custom properties, background sync with service workers, and new ES2015 features]  
Stable updates には見落としか見つけられませんでしたが、Betaのころから49で実装予定と各所で書かれていました。

[Chrome Releases: Stable Channel Update Chrome 49]:http://googlechromereleases.blogspot.jp/2016/03/stable-channel-update.html
[Chromium Blog: Chrome 49 Beta: CSS custom properties, background sync with service workers, and new ES2015 features]:http://blog.chromium.org/2016/02/chrome-49-beta-css-custom-properties.html
[Release electron v0.37.0 · atom/electron]:https://github.com/atom/electron/releases/tag/v0.37.0
[CSS Variables （CSS カスタムプロパティ） の使い方 | WWW WATCH]:https://hyper-text.org/archives/2014/07/css_variables.shtml
MacのVB上でCoreOSをホストに使い、alpineベースのdocker環境を作る part 1

### 構成
+ part 1

Mac上のVBにCoreOSを入れ、インストールする。

+ prat 2

CoreOSの基本設定とdockerの基本設定をする。

+ part 3

alpineベースのdockerを楽しむ。
 
# Mac上のVBにCoreOSを、入れインストールする

+ Mac 
OS X El Capitan

+ VirtualBox
4.3.30

### CoreOSを入手

下記のURLより、CoreOSのISOをダウンロードする(stable推奨)

[Booting CoreOS from an ISO](https://coreos.com/os/docs/latest/booting-with-iso.html)

### ネットワーク設定

VB上で以下のネットワーク設定のhost-only Networksにて以下を作成


![011.png](https://qiita-image-store.s3.amazonaws.com/0/25582/e21f758b-a0f0-62b7-44f4-435d7e229602.png)

![012.png](https://qiita-image-store.s3.amazonaws.com/0/25582/e4de7aeb-d8b1-37de-388f-35f8ed463ac4.png)


### CoreOSを立ち上げる

上記の設定を当てたVBを立ち上げる。
当てた設定が反映されていれば、DHCPでIPアドレスが割り当てられる。


![013.png](https://qiita-image-store.s3.amazonaws.com/0/25582/ed2c2b5d-e3c8-f589-9c90-f2095c63c94f.png)


### CoreOSにSSH出来るように設定する

VBのコンソールは使いづらいので、Mac上のターミナルからssh出来るようにしたい。

ダウンロードしたCoreOSにはデフォルトでCoreというユーザがあるが、パスワードが設定していないため設定する。

```text:cmd
$ sudo passwd core
```


ここまでの設定で、IPの設定とユーザ・パスワードの設定が完了したので外からSSHが出来るようになる

```text:MacからSSH
$  ssh core@192.168.59.100 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
Warning: Permanently added '192.168.59.100' (ED25519) to the list of known hosts.
core@192.168.59.100's password: 
Last login: Mon May  9 08:37:54 2016
CoreOS stable (835.13.0)
Update Strategy: No Reboots
core@localhost ~ $ 
```

# 鍵の設定をする

### Macにて

+ 秘密・公開鍵の作成

```
$ ssh-keygen -t rsa -C 'for coreos' -f id_rsa-coreos
$
$
$ ls -1
id_rsa-coreos
id_rsa-coreos.pub
```

### coreos上にて

+ 鍵の設定をする。

```
$ sudo su -
# vim config
```

```text:/root/config
#cloud-config

ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAA....(id_rsa-coreos.pubの中身)
```

+ cloud-configのシンタックスチェック

```text:cmd
$ sudo coreos-cloudinit -validate=true -from-file=./config
```

+ 設定の反映

```
### ダウンロードしたバージョン(Stable | Beta | Alpha)でstableのところを書き換えて下さい。
# coreos-install -d /dev/sda -C stable -c config
# shutdown -h now
```

### Mac上にて。

+ VB上の操作でstorageからcoreosをアンマウントする
+ 起動 
+ 鍵を使って、sshする

```
$ ssh -i id_rsa-coreos core@192.169.59.100 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
Warning: Permanently added '192.169.59.100' (ED25519) to the list of known hosts.
CoreOS stable (835.13.0)
core@localhost ~ $ 
core@localhost ~ $ 
core@localhost ~ $ 
core@localhost ~ $ 
core@localhost ~ $ 
core@localhost ~ $ 

```

無事、鍵によるsshが出来るようになる。

ただ、今回の設定だと鍵以外の全ての設定が吹っ飛んでしまうので次回はちゃんと設定していく。
nginxのログをS3に送信(td-agent)


# やりたいこと
* nginxのaccesslogをS3に貯めたい


#### td-agent install 

```
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```
#### S3 outputプラグインインストール
```
$ sudo /opt/td-agent/embedded/bin/fluent-gem update
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-s3
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest
```

#### td-agent.confの編集 /etc/td-agent/td-agent.conf

```
<source>
  type config_expander
  <config>
    type tail
    # format nginx
    format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/
    time_format %d/%b/%Y:%H:%M:%S %z
    pos_file /var/log/td-agent/access.log.pos
    path /var/log/nginx/access.log
    tag ${hostname}/nginx.access
  </config>
</source>
<source>
  type config_expander
  <config>
    type tail
    format /^[[^ ]* (?<time>[^]]*)] [(?<level>[^]]*)] (?<message>.*)$/
    time_format %b %d %H:%M:%S
    pos_file /var/log/td-agent/error.log.pos
    path /var/log/nginx/error.log
    tag ${hostname}/nginx.error
  </config>
</source>

<source>
  type config_expander
  <config>
    type tail
    format syslog
    pos_file /var/log/td-agent/syslog.pos
    path /var/log/messages
    tag ${hostname}/syslog.messages
  </config>
</source>

<match *.**>
  type forest
  subtype s3
   <template>
     # /etc/sysconfig/td-agent
     aws_key_id "#{ENV['AWS_KEY_ID']}" 
     aws_sec_key "#{ENV['AWS_SECRET_KEY']}"
     s3_bucket fluent-log-test

     path
     buffer_path /var/log/td-agent/buffer/${tag}
     time_slice_format %Y/%m/%d/${tag}/ec2-%Y-%m-%d-%H
     retry_wait 30s
     retry_limit 5
     flush_interval 1s
     flush_at_shutdown true
   </template>
</match>
```

#### AWS設定 /etc/sysconfig/td-agent
```
export AWS_KEY_ID="xxxxxxxxx"
export AWS_SECRET_KEY="xxxxxxxxxxxx"
```


#### td-agent 起動

```
service td-agent start
```
Railsアプリの名称を変える方法

railsが4系の場合、`config/application.rb`と`config/initializers/session_store.rb`を変えるだけで良い。

```ruby:config/application.rb
require File.expand_path('../boot', __FILE__)

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module SampleApp ### ここを変える 
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de

    # Do not swallow errors in after_commit/after_rollback callbacks.
    config.active_record.raise_in_transactional_callbacks = true
  end
end
```

```ruby:config/initializers/session_store.rb
# Be sure to restart your server when you modify this file.

Rails.application.config.session_store :cookie_store, key: '_sample_app_session' ### ここを変える
``` 

ただし、`config/database.yml`にあるDB名は変更されないため、必要であれば手動で変更する。


3系以下の場合は、[rename](https://github.com/morshedalam/rename)というgemを使う。

```ruby:Gemfile
gem 'rename'
```
で`bundle install`した後に

```shell
rails g rename:app_to New-Name
```

とする。ただし、`-`と`_`の区別がついていないっぽいことに注意する。名前に`-`とか`_`がある場合は`rails g rename:app_to New-Name`した後の挙動を見て、必要に応じて手動で直す必要がある。

このgemを使った場合でもDB名は変わらないため`config/database.yml`を必要に応じて手動で編集する。

## 参考
- http://loumo.jp/wp/archive/20141223002853/
N-gram言語モデルに基づく補完 (company-ngram)

外国語の文章を書いているときに，次にどんな単語を書くのが自然なのかを知りたいと思ったことはありませんか？
[company-ngram](https://github.com/kshramt/company-ngram)という`company-mode`のバックエンドを使うと，そのような希望を高い可能性で実現できます．

`company-ngram`はN-gram言語モデルに基づき，カーソルよりも前に書かれた単語の並びから次に書かれる可能性の高い単語を予想し補完候補を提供します．

![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/8802/e3d11d93-bdc5-2146-02e1-4b753b22d0ea.jpeg)

`company-ngram`による補完候補の例です．
補完候補表示の右側の列の`.`の左側の数字はN-gramデータ中での補完候補の頻度を表します．
`.`の右側の数字は，カーソルの前のどの単語が補完候補の生成に使われたのかを表します．
`1`の位置に対応する単語はN-gramデータにマッチしたことを，（図中には存在しませんが）`0`の位置に対応する単語はN-gramデータにはマッチしなかったことを表します．
例えば，`a b c`に対して`d	42.110`という補完候補が表示された場合，N-gramデータのもとになったテキストデータ中に`a b * d`という並び（`*`は任意の単語を表す）が42個存在していたということが読み取れます．

## 利用方法

`company-ngram`は[Melpa](http://melpa.org/#/company-ngram)からインストールできます．
インストール後，`~/.emacs.d/init.el`に以下の設定を追加してください．

```elisp
; ~/.emacs.d/init.el

(with-eval-after-load 'company-ngram
  ; ~/data/ngram/*.txt are used as data
  (setq company-ngram-data-dir "~/data/ngram")
  ; company-ngram supports python 3 or newer
  (setq company-ngram-python "/path/to/python3")
  (company-ngram-init)
  (cons 'company-ngram-backend company-backends)
  ; or use `M-x turn-on-company-ngram' and
  ; `M-x turn-off-company-ngram' on individual buffers
  ;
  ; save the cache of candidates
  (run-with-idle-timer 3600 t
                       (lambda ()
                         (company-ngram-command "save_cache")
                         ))
  )

(require 'company-ngram nil t)
```

`company-ngram`を使いたいバッファで`M-x turn-on-company-ngram`すると，`company-ngram`が有効になります．

`company-ngram`を使うには，N-gramデータを生成するためのテキストデータが必要です．
デフォルトでは，`~/data/ngram/*.txt`がテキストデータとして読み込まれます．
既存のコーパスを利用するか，`w3m -dump <URI>`でスクレイピングして自分のコーパスを作っても良いでしょう．
とりあえず試すには[RFCのテキスト](https://www.rfc-editor.org/rfc/rfc5661.txt)が手頃です．

詳細は，[README](https://github.com/kshramt/company-ngram)をご覧ください．
AppleStoreからCoda2がアップデートできなくなっていたのを解決した

３年前くらいにCoda2をAppleStoreから購入したのだけれど、
アップデートできないなあと思っていた
困ってはいなかったのだけど、プラグインの出し入れとかしてて不便さを感じ始めて調べてた。

ら、Coda2.0.14までの段階でどうやらPanicが引き揚げていたらしい
[【公式】Coda 2.5とMac App Storeについて](https://panic.com/blog/ja/coda-2-5-and-the-mac-app-store-j/)

[Codaのトップページ](https://panic.com/jp/coda/)に「AppleStore版で買ってしまった人も直販版に切り替えられます！」とのことだったのでやってみた

- AppleStoreでの最新版(2.0.14)にアップデート
されてた。問題なし
<img width="392" alt="スクリーンショット 2016-03-22 16.51.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/52381/b3170b31-0e46-a91f-d1f6-22ca9d65899a.png">


- 直販版Coda2.5をダウンロードする
<img width="131" alt="スクリーンショット 2016-03-22 17.02.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/52381/d0863410-5bd4-0f8f-aef3-6fb046ae5b47.png">

- 適当な場所で起動
AppleStoreからダウンロードした方がないところで(Applicationフォルダさえ避ければよさげ)

- 現れたダイアログに従・・・・・・・・・・・出ない
<img width="1017" alt="スクリーンショット 2016-03-22 17.03.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/52381/b8f51c76-02ea-8454-0d5a-b259f04eea55.png">

- ここだった

<img width="165" alt="スクリーンショット 2016-03-22 17.04.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/52381/44caf3c2-7cb8-90fd-7048-da6c64c73697.png">

- Mac App Store版ライセンスを参照
<img width="522" alt="スクリーンショット 2016-03-22 17.05.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/52381/6d5e1e0d-cd24-7c9b-4939-051969a1044e.png">

- Success!
<img width="419" alt="スクリーンショット 2016-03-22 17.05.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/52381/2af73bf8-3282-cb7f-0f55-3bcb6c061514.png">

あとはメールでシリアルナンバーが届くのを待つのみらしい。
japan.panic.comということは、日本にもサポート会社があるんですかね。
英語が苦手な身としてやってもらえるのはとても嬉しい


メール１日以内か・・・と思っていたら直後に来ていた。自動送信？
無事に認証できました。
***

AppStoreでアプリを公開するにもいろんな制限があるんですね、
これだと他のエディタもなかなかつらそうな・・・
JavaScriptのPromiseとチェーンを組み合わせる

非同期処理をjQueryのチェーンみたいにして使えないものかと、試行錯誤した結果、こうするとできた。

```js
function MyClass(){}
MyClass.prototype.addObj = function() {
  var self = this;

  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      var myObj = new MyObj();
      resolve(myObj);
    });

  });
};

function MyObj() {
}

MyObj.prototype.testMethod1 = function(opts) {
  var self = this;
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      console.log("---> testMethod1");
      resolve("hello");
    }, 100);
  });
};
MyObj.prototype.testMethod2 = function(opts) {
  var self = this;
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      console.log("---> testMethod2");
      resolve(opts + " world");
    }, 100);
  });
};
var myClass = new MyClass();

myClass.addObj()
      .then(function(myObj) {
        myObj.testMethod1()
            .then(function(result) {
              console.log("result of the testMethod1(): ", result);
              return myObj.testMethod2(result)
            })
            .then(function(result) {
              console.log("result of the testMethod2(): ", result);
            })
            .catch(function(error) {
              console.log("error ---> ", error);
            });
      });
```

結果

```js
---> testMethod1
result of the testMethod1():  hello
---> testMethod2
result of the testMethod2():  hello world
```
シェルスクリプトでのLTSV出力イディオム

ログの出力がLTSVだと色々できるようになってきてますね(若干遅い)。

スクリプトからログ出力って多いとは思うのですが、そこでのLTSV出力の比較的楽な方法が微妙です。
で、あれこれ頑張った結果から、エッセンスを抽出してイディオム化してみました。

たぶん車輪の再発明なんでしょうけども...

```bash
#!/bin/bash

cat << EOS | tr '\n' '\t' | sed -e 's/\t*$//' >> ${log}
name:${app}
time:$(date --iso-8601=seconds)
pid:$$
args:"${*}"
EOS
echo "" >> ${log}

# このスクリプトで、ログには自分自身(の名前/)PIDを出しているが
# 実行した(コマンド名/)ステータス/PIDとするなら以下のような行を入れる
# 直前に実行したコマンド(同期実行)のステータス(ex test -f <file>)
status:$?
# 直前に実行したコマンド(非同期実行)のPID(ex.make &)
pid:$!
```

1. ヒアドキュメントで、変数展開を利用する。
2. そこで要素ごとに改行して記述
3. 1行1要素なので楽(LTSVなので順序はまあ重要ではないので、そこは都合に合せてよい)
4. ラベルについては、タブやコロンを含まないようにするのは自前
5. 改行されている要素をtrコマンドでタブにして1行に連結
6. 最後のタブは一応削除(ツールによっては誤動作するかも、なので)
7. 上記によく使う、アプリ名(これの定型ってあんまりないな)、日時、プロセスID(スクリプトだけど)、引数を載せた
8. 最後に改行が必要なので`echo`、ただbashとしては[ここの方法](http://qiita.com/richmikan@github/items/3c74212b0d8dec9bd00f)でLFをsedで入れてしまってもいいかも

あとは必要な要素を追加すればよさげ。

サンプルの結果
<pre>
name:testapp    time:2016-03-22T16:59:42+0900   pid:3031        args:"1 2 3"
name:testapp    time:2016-03-22T16:59:46+0900   pid:3036        args:"4 5 6"
</pre>
ファイルシステムでズンドコキヨシ

Filesystem in Userspace (FUSE) を使って以下の仕様のファイルシステムを実装します。

- 各ディレクトリには「ズン」「ドコ」というディレクトリか、「キ・ヨ・シ！」というファイルがひとつだけある
- 「ズン」「ドコ」のディレクトリはランダムでどちらかひとつだけが出現する
- パスが「/ズン/ズン/ズン/ズン/ドコ」なディレクトリの中には「キ・ヨ・シ！」というファイルが出現する

今回はRubyとgemの[rfusefs](https://github.com/lwoggardner/rfusefs)を使って作ります。


```rb:zundoko_fs.rb
#!/usr/bin/ruby
# -*- encoding: utf-8 -*-
require 'fusefs'

class ZundokoFS < FuseFS::FuseDir

  def contents(path)
    if path =~ /\/ズン\/ズン\/ズン\/ズン\/ドコ$/ then
      [ 'キ・ヨ・シ！' ]
    else
      [ ['ズン', 'ドコ'].sample ]
    end
  end

  def directory?(path)
    path =~ /\/(ズン|ドコ)$/
  end

  def file?(path)
    path =~ /\/キ・ヨ・シ！$/
  end

end


if (File.basename($0) == File.basename(__FILE__)) then
  if ARGV.size != 1 then
    puts "Usage: #{$0} <directory>"
    exit
  end

  dirname = ARGV.shift

  unless File.directory?(dirname) then
    puts "Usage: #{dirname} is not a directory."
    exit
  end

  FuseFS.set_root(ZundokoFS.new)
  FuseFS.mount_under(dirname)

  FuseFS.run
end
```

```text:実行結果
% mkdir zundoko
% sudo ./zundoko_fs.rb zundoko &
% ls -l zundoko
合計 0
dr-xr-xr-x 1 root root 0  1月  1  1970 ドコ
% ls -l zundoko
合計 0
dr-xr-xr-x 1 root root 0  1月  1  1970 ズン
% find zundoko
zundoko
zundoko/ドコ
zundoko/ドコ/ズン
zundoko/ドコ/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ
zundoko/ドコ/ズン/ズン/ドコ/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン/ズン
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン/ズン/ドコ
zundoko/ドコ/ズン/ズン/ドコ/ズン/ドコ/ズン/ズン/ズン/ズン/ドコ/キ・ヨ・シ！
```
フレームワークのCSSで用いられているカラーをスウォッチに登録する

# 動機

ある程度Illustratorに慣れてくると、

- 矩形オブジェクトを大量に作っても管理しやすい
- どうせアイコンやイラストはIllustratorで作る
- スウォッチウィンドウでカラーフォルダが使える

という理由から、Webページのカンプを作成する際にPhotoshopでなくIllustratorを使うことが多くなった。
特に、Illustratorとマテリアルデザインの親和性はとても気持ちがいい。

マテリアルデザインに基づいたサイトを作るとき、PolymerなりMaterializeなり、フレームワークを用いることが多い。
そのフレームワーク内で使われているカラーをスウォッチに登録できるととても便利なのでは？と考えた。

# 概要

* Photoshopを用いて、フレームワーク（今回はMaterialize）のCSSに基づいた、互換性のあるスウォッチファイルを作成する
* Illustratorを用いて、スウォッチをカラーフォルダにまとめる

# 前提

MaterializeのCSSファイルがローカルにダウンロードしてあること。

# CSS読み込み手順（＠Photoshop）

## 読み込みの準備

Photoshopを立ち上げて、適当にWeb向けのファイルを新規作成する。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/95607/5116d911-cbd2-246b-375d-89fdd58ab172.png)

大体上のような感じでデフォルトのスウォッチが表示されている。
今回は必要ないので、Alt＋Click（Command＋Click？）でひとつずつ消していく。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/95607/0745b4a8-59d4-109c-9024-c6fab2a82753.png)

スッキリ。

## CSSの読み込み

右上の「スウォッチメニュー」を開くと「スウォッチの読み込み」が表示されている。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/95607/ca2b03e5-e471-29a8-ba7b-1f610a6f8d0a.png)

クリックすると読み込むファイルを選択させられるので、ファイル形式を「*.css」にして件のCSSファイルを読み込む。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/95607/76539298-5d8e-0c2a-5b3e-31ccfc2f1150.png)

読み込んだ状態のキャプチャを撮り忘れた。

## 読み込んだスウォッチを互換性のある形式で保存

再び「スウォッチメニュー」を開き、「交換用にスウォッチを保存」を選択する。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/95607/ed0cfd26-3ee4-5997-2eb7-4b319450a5da.png)

保存先はIllustratorのユーザー定義ファイルを置く場所がいいと思った。
ちなみに自環境ではここ。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/95607/919bcae9-d820-b614-da3a-f57cbdbdb5fa.png)

以上でPhotoshopでの作業は終わり。

# スウォッチ読み込み手順（＠Illustrator）

## スウォッチの読み込み

Illustratorを立ち上げて、白紙ファイルを開き、余計なスウォッチを削除する。
「スウォッチ」＞「スウォッチライブラリメニュー」（左下）＞「ユーザー定義」から「Materialize」を読み込むことができる。

![07.png](https://qiita-image-store.s3.amazonaws.com/0/95607/6459fbd5-3ba3-4f66-82bb-b5191fe0fa01.png)

## カラーフォルダにまとめる

Photoshopには「カラーフォルダ」という概念が（多分）無いので、Illustratorで使いやすいよう、カラーフォルダにスウォッチをまとめたい。

![08.png](https://qiita-image-store.s3.amazonaws.com/0/95607/6f2cc062-702b-5812-e6aa-bf11621169b4.png)

「Materialize」タブのスウォッチを全選択するとスウォッチウィンドウに追加される。
その追加されたスウォッチを新しいカラーフォルダにまとめて再度「交換用にスウォッチを保存」すると幸せになれた。

# 感想

- スクリプトとか使ってもっとスマートにできないんだろうか。
- というのも、Materializeはクラス名で色指定するので、スウォッチの名前もHexでなくセレクタにして欲しかった。
- Illustratorまいしてう

# 参考Webページ

- [PhotoshopでWebデザインを効率化するための便利な使い方 | 株式会社LIG](http://liginc.co.jp/web/design/photoshop/88454#a8)
- [Adobe Photoshop * カラーピッカーとスウォッチのカスタマイズ](https://helpx.adobe.com/jp/photoshop/using/customizing-color-pickers-swatches.html)
- [Adobe Illustrator CCでオリジナルのカラーグループを保存する - Qiita](http://qiita.com/yukinoyoshino/items/8deaf0f3b2323cbd00af)
Mac Terminal における proxy の設定メモ


Qiita 及び Kobito による投稿テストを兼ねて．
大学とかで Terminal で homebrew を使う時とか proxy で弾かれて毎回調べてるので...
Markdown 記法ムズカシイネ...

## exportによる設定
設定するとき

```
$ export http_proxy="http://[hogehoge]:[port]"
$ export https_proxy="https://[hogehoge]:[port]"
```

消去するとき

```
$ export http_proxy=""
$ export https_proxy=""
```

これで homebrew が使えました．
macports はインストールしてないので未検証... 

## 環境ごとの自動設定とか
下記の記事が詳しいので，時間があるときにでも(やらないフラグ)

* [Macbookでproxy環境と非proxy環境のネットワーク設定をスマートに切り替えるメモ](http://qiita.com/shiraco/items/8971e38cbbd42ea32d73)


## 参考サイト
* [MacのTerminalでプロキシを設定する](http://d.hatena.ne.jp/nyanplus/20120412/1334191139)
elasticsearchのインデックス操作でインデックス名の先頭にハイフンつけた場合の挙動

##先頭ハイフンなしのインデックス作成

```
$ curl -XPUT "http://es-test.bashishi.local/index001?pretty"
{
  "acknowledged" : true
}

$ curl -XPUT "http://es-test.bashishi.local/index002?pretty"
{
  "acknowledged" : true
}

$ curl -XPUT "http://es-test.bashishi.local/index003?pretty"
{
  "acknowledged" : true
}
```

当然問題なく作成される。

##先頭ハイフン付きのインデックスを作成

```
$ curl -XPUT "http://es-test.bashishi.local/-index999?pretty"
{
  "acknowledged" : true
}
```
問題なく作成できる。
一応、一覧を表示してみる。

```
$ curl -XGET "http://es-test.bashishi.local/_alias?pretty"
{
  "index001" : {
    "aliases" : { }
  },
  "index002" : {
    "aliases" : { }
  },
  "index003" : {
    "aliases" : { }
  },
  "-index999" : {
    "aliases" : { }
  }
}
```
ちゃんとある。

##先頭ハイフンのインデックスがある状態で、そのインデックスを削除してみる。

```
$ curl -XDELETE "http://es-test.bashishi.local/-index999?pretty"
{
  "acknowledged" : true
}
$ curl -XGET "http://es-test.bashishi.local/_alias?pretty"
{
  "index001" : {
    "aliases" : { }
  },
  "index002" : {
    "aliases" : { }
  },
  "index003" : {
    "aliases" : { }
  }
}
```
ちゃんと削除できる。

##インデックスの先頭にハイフンを付けて削除してみる。
index003 が存在する状態で、削除するインデックス名として -index003を指定する。

```
$ curl -XDELETE "http://es-test.bashishi.local/-index003?pretty"
{
  "acknowledged" : true
}
```

index003以外が削除される。

```
$ curl -XGET "http://es-test.bashishi.local/_alias?pretty"
{
  "index003" : {
    "aliases" : { }
  }
}
```

存在しないインデックスの先頭にハイフン付けて削除しようとすると 404 NotFound になる。

```
$ curl -XDELETE "http://es-test.bashishi.local/-index004/?pretty"
{
  "error" : "IndexMissingException[[index004] missing]",
  "status" : 404
}
```
Config dirのsub dir指定


## config\app.php の url を得る場合

公式マニュアル通りに
[設定値にアクセスする](http://readouble.com/laravel/5/0/dev/ja/configuration.html)

```lang:php
namespace App\Http\Controllers;
use Config;
class IndexController extends Controller
{
	public function getIndex()
	{
           echo Config::get('app.url');		
```

##自分でsub dirを切った場合

例えば configの下にusers dirを作って
config\users\app.php の url を得る場合

```lang:php
namespace App\Http\Controllers;
use Config;
class IndexController extends Controller
{
	public function getIndex()
	{
           echo Config::get('users.app.url');		
```
sub dirを切れば自前で追加したconfigが整理されてよい :D
Swift 初心者がまとめる Xcode 7.3 で Warning になった Swift の文法

Warning の文を見出しとしてまとめます。

# Curried function declaration syntax will be removed in a future version of Swift; use a single parameter list

Swift 3.0 でカリー化関数の構文が廃止が決定していますので、今から書き換えておこうね と Xcode が教えてくれます。

カリー化関数ってなんですか…？初めて聞きました…。

```swift:Warningになる書き方
func curried(x: Int)(y: String) -> Float {
    return Float(x) + Float(y)!
}
```

```swift:Xcodeの自動修正
func curried(x: Int, y: String) -> Float {
    return Float(x) + Float(y)!
}
```

```swift:GitHubに書かれている代替記述方法
func curried(x: Int) -> (String) -> Float {
    return {(y: String) -> Float in
        return Float(x) + Float(y)!
    }
}
```

[SE-0002: Removing currying func declaration syntax](https://github.com/apple/swift-evolution/blob/master/proposals/0002-remove-currying.md)

# 'var' parameters are deprecated and will be removed in Swift 3
Swift 3.0 で関数の引数に var が使えなくなることが決定していますので、今から書き換えておこうね と Xcode が教えてくれます。

```swift:Warningになる書き方
func foo(var i: Int) {
    i += 1
}

```

```swift:Xcodeの自動修正
func foo( i: Int) {
    i += 1
}
```

Xcode の自動修正だと、結局はエラーになっちゃうんですよね…。


```swift:GitHubに書かれている代替記述方法
func foo(inout i: Int) {
    i += 1
}

var x = 1
print(foo(&x))
```

この `print` の結果は `2` です。
[SE-0003: Removing var from Function Parameters](https://github.com/apple/swift-evolution/blob/master/proposals/0003-remove-var-parameters.md)

# '++' is deprecated: it will be removed in Swift 3
Swift 3.0 で`++`演算子の廃止が決定していますので、今から書き換えておこうね と Xcode が教えてくれます。

```swift:Warningになる書き方
var x = 1
let a = ++x
let b = x++
```

```swift:Xcodeの自動修正
var x = 1
let a = x += 1
let b = x += 1
```

いや、`for`文とかで使うときはこの修正でいいんですけどね…。


```swift:代替記述方法
var x = 1
x += 1
let a = x
let b = x
x += 1
```

successor メソッドを使ってもいいですね。
[SE-0004: Remove the ++ and -- operators](https://github.com/apple/swift-evolution/blob/master/proposals/0004-remove-pre-post-inc-decrement.md)

# '--' is deprecated: it will be removed in Swift 3
Swift 3.0 で`--`演算子の廃止が決定していますので、今から書き換えておこうね と Xcode が教えてくれます。

```swift:Warningになる書き方
var x = 1
let a = --x
let b = x--
```

```swift:Xcodeの自動修正
var x = 1
let a = x -= 1
let b = x -= 1
```

```swift:代替記述方法
var x = 1
x -= 1
let a = x
let b = x
x -= 1
```
[SE-0004: Remove the ++ and -- operators](https://github.com/apple/swift-evolution/blob/master/proposals/0004-remove-pre-post-inc-decrement.md)

# C-style for statement is deprecated and will be removed in a future version of Swift
これは結構有名かと思われますが、Swift 3.0 で C言語のような`for`文が廃止されます。

```swift:Warningになる書き方
for var i = 0; i <= 5; i += 1 {
    print(i)
}
```
この書き方だと Xcode は自動修正してくれません。

```swift:代替記述方法
for i in 0 ..< 5 {
    print(i)
}
```
`for/in`ループを使うようにすると解消できます。
[SE-0007: Remove C-style for-loops with conditions and incrementers](https://github.com/apple/swift-evolution/blob/master/proposals/0007-remove-c-style-for-loops.md)



とりあえず、急ぎで書いたので…
気が向いたら追記します…。
python3: trees [still ip]

数週間前に出くわした言葉。木の形をしたダイアグラム。図に書いてみるとこんな感じ。他のエンジニアリングでも同じらしいが、コンピューターサイエンスの世界でもTreesは基本的に逆さ構造になっている。leavesが下、the root of the treeが一番上に位置している。treesはlistでもlinked listでも表現することが可能。
![Tree.png](https://qiita-image-store.s3.amazonaws.com/0/87666/4a01633c-323d-d158-0ae8-4d265b07a92c.png)

#Components of Trees
- parent (node): childrenを持っているnode (e.x. 21より下のleaves(12, 16, 27, 41)以外)
- child (node): parent nodeを持っているnode。parent nodeは一つしか持てない。(e.x. 21より下)
- Root: 一番上のnode (e.x.21)
- Leaf: child (nodes)を持っていないnode。別の言い方をすれば一番下の層のnode。(e.x. 12, 27, 41)
- Subtree: 木のしたの層に備わっている別の木は全てsubtreesにあたる。これは上の21をrootにした木ともとれるし14,23...と各nodeをrootにして見立ててもちゃんとした木になることを表している。ちなみにこの考え方こそがRecursive Data Structuresに関係してくる。
- Depth: nodeからrootまでの距離(e.x. the depth of 33 == 2)
- Height: 木全体の階層。(e.x. the height of T == 4, IOW the depth of the lowest leaves) 

#Constructor and Selectors 

Treesを作るのに必要な道具は以下:

```
# constructor
def tree(label, children=[]):
    return [label] + list(children)

# selectors
def label(tree):
    return tree[0]

def children(tree):
    return tree[1:]

def is_leaf(tree):
    return not children(tree)
    # also be implemented: len(children(tree)) == 0 or len(tree) == 1

```

なぜこれがrecursive structureなのかというとtreeの形は基本的に:
- a `label` and
- a zero or more `children`, each a tree

の集合体みたいなものなのでこれを上手くrecursive algorithmに入れればtreeも簡単にいじれる。

#More with trees

```
def count_leaves(tree):
"""returns the number of leaves in tree"""
    if is_leaf(tree):
        return 1
    return sum(count_leaves(child) for child in children(tree))

def leaf_labels(tree):
"""a list of the labels of all leaves in Tree"""
    [label(tree)] + reduce(add, map(leaf_labels, children(tree)), [])
    
    # Alternative
    result = [label(tree)]
    for child in children(tree):
        result += leaf(leaf_labels(child)
    result
```

# More to come soon, stay tuned! 

基本中の基本だけ触れようと思ったので、細かい概要や応用はまた追って投稿予定。