OmniAICreator/Qiita-1.07M huggingface dataset:
Auto LayoutなUIScrollViewで、ピンチイン、ピンチアウト後に時々発生する位置ずれで困った話

### 問題が発生するまで

参考にしたのは、こちら
http://qiita.com/malt/items/6468921e57a30594d037

この例に従って、Auto Layoutして、制約はクリアした。

viewForZoomingInScrollViewでスクロールすべきviewを返してあげれば、contentSizeも勝手に設定されるので、この辺はカット。

今回は表示すべきコンテンツをセンタリングしたかった。
contentOffsetでセンターに来るように設定したんだけど、
これをviewDidLayoutSubviewsで設定しても上に張り付いて、ピクリともしない。
仕方がないので、これを挟み込んだ。
（この辺からがダメな道）

```Objective-C:Objective-C
dispatch_async(dispatch_get_main_queue(), ^{
...
}];
```

これで表示直後はセンタリングできるようになったんだけど、
ピンチイン、ピンチアウトで拡大縮小しようとしたら、変なことが起きた。

ピンチイン、ピンチアウトで指を離すと、これが呼ばれる

```Objective-C:Objective-C
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView
                       withView:(UIView *)view
                        atScale:(CGFloat)scale
```

もちろん、拡大縮小中は、これらが呼ばれる。

```Objective-C:Objective-C
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
```
scrollViewDidZoomが呼ばれた時に、contentOffsetを操作して、センタリングしてた。
ところがある一定の条件下で、scrollViewDidEndZoomingが呼び出された後に、scrollViewDidScrollが呼ばれることがあって、呼ばれた時に限って、contentOffsetが０になるようになってた。
（通常はscrollViewDidScrollが呼ばれた後にscrollViewDidEndZoomingで終わる）
だから、センタリングしたはずなのに、指を離すとコンテンツの位置が移動するという謎な現象に悩まされることになった。

### どうやって解決したか
コンテンツとなるviewをセンタリングするようにAuto Layoutで設定したのち、
scrollViewDidZoomでコンテンツとなるviewに対して、centerを設定するようにした。

こんな感じ。

```Objective-C:Objective-C
- (void)scrollViewDidZoom:(UIScrollView*)scrollView {
  CGFloat offsetX = MAX((scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5, 0.0);
  CGFloat offsetY = MAX((scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5, 0.0);
  
  self.contentView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX,
                               scrollView.contentSize.height * 0.5 + offsetY);
}
```

Auto Layoutで初期状態をセンタリングにしたから、viewDidLayoutSubviewsでは何もしなくても良くなった。
zoom後にoffsetが０になるような呼び出しもなくなった。（そもそもoffsetを自分で設定しなくなった。）

だいたいこれで終わりなんだけど、一つだけ引っかかるのが、訳あってコンテンツを初期状態ではUIViewContentModeScaleAspectFillで表示する（隠れる部分がある）のだけど、zoom処理をするまではなぜかスクロールが出来ない。（一旦ピンチインやピンチアウトをするとスクロールができるようになる）
この問題については、未解決。
【Laravel5】今までAWSにファイルをアップロードしていたものをGoogle Cloud Store(GCS)にアップロードする

# 前提
以下の記事を参考にAWSにアップロードするように実装します。
http://qiita.com/yamato/items/7b8aab6e1f3556e9aadb

今までAWSにアップロードしていたのですがふとGCSにアップロードをしてみたくなり、設定を変更します。

GCSにはAWSの互換APIが実装されているので、AWSへのアップロードの実装からほぼ変更なくGCSへアップロードが可能です。

# GCS側の設定

Google Cloud PlatformのコンソールからStorageでバケットを作成しておきます。
(今回は仮にtestというバケットを作成したとします。なお、バケットはCloud Storageの中で固有である必要があるため他の人がすでに作っているバケットは作成できません。なので実際にはtestというバケットも作れないと思います。


その後設定->相互運用性から相互アクセスをONにして、相互運用ストレージアクセスキーを作成します。

![gcp.png](https://qiita-image-store.s3.amazonaws.com/0/57634/d5c9edcf-d074-c1e2-ddb8-b868eaefee68.png)
これがAWSのACCESS_KEY,SECRET_KEYにあたります。

GCSの設定周りはこの記事が参考になります。
http://qiita.com/ngyuki/items/fd3bb47cd4aeb2f61fec

# envの設定
上記記事のように実装した場合ACCESS_KEY,SECRET_KEYはenvに指定するようにしてあるので、envに指定します。

```:.env
S3_ACCESS_KEY=your-GCS-key
S3_SECRET_KEY=your-GCS-secret
S3_BUCKET=your-bucket (今回はtest)
```

# base_urlの設定
config/filesystems.phpのs3の設定にbase_urlを指定します。
なお、driverはs3のままで大丈夫です。


```php:config/filesystems.php
		's3' => [
			'driver' => 's3',
			'key'    => env('S3_ACCESS_KEY'),
			'secret' => env('S3_SECRET_KEY'),
			'region' => env('S3_REGION'),
			'bucket' => env('S3_BUCKET'),
                        'base_url' => 'https://storage.googleapis.com'
 
		],
                ・・・
    ],
```

# GCSにアップロードする
[Laravelのファイルシステム](http://readouble.com/laravel/5/1/ja/filesystem.html)
にあるメソッドを使うことでGCSにアップロード/削除等ができます。

```php
$disk = Storage::disk('s3');
// ファイルのアップロード
$disk->put('hoge.jpg', $contents);
// ファイルの取得
$contents = $disk->get('hoge.jpg');
// ファイルのコピー
$disk->copy('hoge.jpg', 'fuga.jpg');
// ファイルの削除
$disk->delete(['hoge.jpg', 'fuga.jpg']);
```

# 画像のURL
画像のURLは以下の2パターンあります。

```
1. https://storage.googleapis.com/{bucket名}/{ディレクトリ名}/{ファイル名}
2. https://{bucket名}.storage.googleapis.com/{ディレクトリ名}/{ファイル名}
(どちらともhttpでも使用可能です)
```

AWSのURLは 

```
https://{bucket名}.s3.amazonaws.com/{ディレクトリ名}
```
の形式で、URLを使用してファイル名などを使用するメソッドを実装していた場合は、 2.のURLを使うといいでしょう。
snippet: HTA

* [php.vbs](http://phpvbs.verygoodtown.com/)

* HTA+WSH用

## コマンド実行時のリダイレクト

```vb
' リダイレクト > を使うには cmd /c が必要。実行内容を非表示にするため引数0がある。
cmd = "cmd /c dir > a.txt"
wsh.Run(cmd, 0, True)
```

## onClick

```html:input
<input type="button" value="hello1" onClick="hello()">

<script language="VBScript">
Sub hello()
    msgbox "hello"
End Sub
</script>
```


## sleep

```vb:sleep
Sub Sleep(Sec)
	CreateObject("WScript.Shell").Run "ping.exe localhost -n "&(Sec+1),0,True
End Sub
```

## フォルダを開く

```vb:フォルダを開く
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")

Sub openFolder(strPath)
	If fso.FolderExists(strPath) Then
		WshShell.Exec("explorer.exe " & strPath)
	Else
		msgbox strPath & "が存在しません"
	End If
End Sub
```

## ファイル読み込み

```vb:ファイル読み込み
Function readFile(fileName)
        Dim strLine
        Set objFile = fso.OpenTextFile(fileName, 1)
        Do Until objFile.AtEndOfStream
    	    strLine = strLine & objFile.ReadLine() & vbCrLf
        Loop
        readFile = strLine
        '
        objFile.Close
        Set objFile = Nothing
        Set objFso = Nothing
End Function
```

## ファイル書き込み

```vb:ファイル書き込み
Sub writeText(fileName, strLine)
        Set objFile = fso.OpenTextFile(fileName, 2, True)
        If Err.Number > 0 Then
    	    msgbox fileName & "を開くのを失敗しました。"
    	    Exit Sub
        Else
    	    objFile.WriteLine strLine
        End If
        '
        objFile.Close
        Set objFile = Nothing
        Set objFso = Nothing
End Sub
```

## 文字列置換

```vb:置換
Set objRegExp = New RegExp
objRegExp.Pattern = "'"
strLine = objRegExp.Replace(strLine, "　")
```

## onLoad

```vb:起動時に実行
Sub Window_OnLoad
    ' 画面リサイズ(横800px, 縦500px)
    Window.ResizeTo 800,500
End Sub
```

## 正規表現

```vb:match
Function match(strPattern, strLine)
        Dim regex, result, result2
        Set regex = New RegExp
        regex.Pattern = strPattern
        Set result = regex.Execute(strLine)
        If result.Count > 0 Then
    	    Set result2 = result(0).SubMatches
    	    For i = 0 To result2.Count - 1
    		    match = result2(i)
    	    Next
        End If
        '
        Set regex = Nothing
End Function

Dim strLine
strLine = ""
strLine = strLine & "hoge1=fuga12" & vbCrLf
strLine = strLine & "hoge2=fuga34" & vbCrLf
strLine = strLine & "hoge3=fuga56" & vbCrLf
msgbox match("hoge1=(.*)", strLine) 'fuga12
msgbox match("hoge2=(.*)", strLine) 'fuga34
msgbox match("hoge3=(.*)", strLine) 'fuga56
```


## ウィンドウの移動

```html
<title>Centered HTA</title>

<script language="VBScript">

Sub Window_Onload
    window.moveTo 100, 0
End Sub

</script>
```

## Edgeの起動

```html
<SCRIPT Language=”VBScript”>
    Sub Window_Onload

        CreateObject("Shell.Application").ShellExecute "microsoft-edge:about:start"

    End Sub
</SCRIPT>
Amazon Cognito User Poolsを使ってZendeskのヘルプセンターにシングルサインオンを行う

## 概要
Amazon Cognito User Poolsで認証認可を行うアプリケーションからZendeskへSSOをする場合を考えてみます。
自分たちのwebサービス用のダッシュボードからサポートやヘルプデスクはZendeskに投げてしまいたいというケースは結構あると思うのですが、そういったユースケースに使えると思います。

## 構成
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/65478/329a5fbe-e175-4b2f-a815-86e74fcb2b92.png)

構成はAPI Gateway + Lambdaの構成で考えます。
まず、前段のAPI認証では、API GatewayのCustom Authorizerの機能を使います。詳細は[Amazon API Gateway の Custom Authorizerを使い、User PoolsのユーザでAPI認証を行う](http://qiita.com/horike37/items/7e0984e7729099032930)にあります。

API認証を通過して認可を受ければ、SSO用LambdaファンクションでZendeskへのSSOを実施します。

## Zendeskの設定
[JWT(JSON Webトークン)を使用したシングルサインオンの設定](https://support.zendesk.com/hc/ja/articles/203663816-Setting-up-single-sign-on-with-JWT-JSON-Web-Token-)
今回はこちらを使用してSSOを実装します。

<img width="819" alt="スクリーンショット 2016-06-01 9.27.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/a4a2e5a5-761f-4563-efee-cd9734879ff1.png">
Zendeskのコンパネからエンドユーザに対するSSOを有効化してください。その際に共有シークレットが表示されるのでそれをメモしてください。共有シークレットは必ず外部に漏れないように気をつけましょう。

## SSO Lambda function
```js
'use strict';
var jwt = require('jwt-simple');
var uuid = require('node-uuid');

var subdomain = '<Zendeskのサブドメイン>';
var shared_key = '<Zendeskの共有シークレット>';

module.exports.handler = function(event, context) {
  var payload = {
    iat: (new Date().getTime() / 1000),
    jti: uuid.v4(),
    name: event.email,
    email: event.email
  };
  var token = jwt.encode(payload, shared_key);
  var sso_endpoint = 'https://' + subdomain + '.zendesk.com/access/jwt?jwt=' + token;
  context.succeed(sso_endpoint);
};

```

SSO用のエンドポイントを返却します。後はクライアント側で`location.href = JSON.parse(sso_endpoint);`とかやってあげるとZendeskにシングルサインオン実施されます。

## 実践
#### 1. User Poolsを使ったアプリケーションにログインします。
<img width="466" alt="スクリーンショット 2016-06-01 9.35.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/d08b965b-c3d7-ce74-2b29-eaddf0d758b6.png">


#### 2. horike@digitalcube.jpでログインを行えました。そしてサポートのボタンをクリックします。
<img width="531" alt="スクリーンショット 2016-06-01 9.36.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/84b93ff9-fc98-4bb2-b21a-e8b34eae3a07.png">


#### 3. SSOが走ってZendeskへリダイレクトされます。Zendeskで側を確認すると自動でhorike@digitalcube.jpというユーザが作られているのがわかります。
<img width="601" alt="スクリーンショット 2016-06-01 9.36.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/0b81ec6c-2a77-53fb-453c-4608bf76f62c.png">
Android 6.0 DatePickerDialog のバグの話。

この前捕まったAndroid 6.0固有と思しきバグをメモしておきます。

###再現法
1. DatePickerDialogを起こす。  
特別な設定はせずデフォルトのまま
2. 任意の日付が選択状態になっていることを確認。
3. 「＜」もしくは「＞」で月を移動する。  
前後どちらでもいいので年をまたいで移動　　

![Screenshot_20160527-160300 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/125972/48f9d0c2-7149-8b43-ec53-51ddf1e4b0cb.png)

###バグ
選択年ではない年で、選択月日と同じ月日が選択状態になっている。
![Screenshot_20160527-160253.png](https://qiita-image-store.s3.amazonaws.com/0/125972/b320cc8c-485f-8180-50f9-a646c46cf13d.png)
出入りするデータそのものは問題はなく表示上の問題になります。

同様のチェックを5.x系で試しましたが、発生しなかったので、6.0固有と断定しました。
以上、これに一日食べられた新人の悲しみのメモでした。
vmware > 共有フォルダ > ファイルの時刻がずれる

```txt:動作環境
VMware(R) Workstation 12 Pro
Windows 7 pro on VMWare
Windows 8.1 pro on VMWare
```

共有フォルダを使ってファイルをやり取りしたときに気づいた事項。

Windows 7にて作成したファイルがある。エクスプローラで見えるファイルの更新時刻は 2016/05/31 13:33。
このファイルをvmwareで共有したフォルダにコピーした。
Windows 8.1にて共有フォルダの中の該当ファイルを見ると、エクスプローラではファイルの更新時刻は 2016/05/31 13:32。

1分のずれの理由は不明であるが、時刻が異なることで、場合によっては別のファイルとして認識されてしまうので注意が必要だ。

USBメモリ経由では時刻ずれは生じない。

<hr>
(追記 2016/06/01)

該当ファイルの更新日時は「2016年5月31日 13:32:59」だった。
これがWindows 7のエクスプローラでは「更新日時 2016/05/13 13:33」と表示される。
共有フォルダに置いたファイルをWindows 8.1で開くと、エクスプローラでは「更新日時 2016/05/13 13:32」と表示される。

Windows7とWindows8.1のエクスプローラでは更新日時の表示（秒の繰上げ？）が違うのだろうか。

~~USBメモリ上に置いたファイルはどちらのOSでもエクスプローラにて「更新日時 2016/05/13 13:33」と見えるので整合性が取れていない。~~ 下の追記にて、この件は整合性が取れた。

<hr>
(追記 2016/06/01)

ファイルのプロパティで見た「更新日時」に以下の違いがある

- 生成したPC上の元ファイル: 2016年5月31日 13:32:59
- USBメモリ上にコピー: 2016年5月31日 13:33:00
- 共有フォルダにコピー: 2016年5月31日 13:32:59

複数要因が重なっているようだ。
[Oracle]存在するテーブルのみDROPする方法

自分用にメモ

## 目的
- DROP TABLE～時にOracleエラーを出したくない
- 複数テーブルの削除を自動で実行させたい


## 概要
0. all_tablesディクショナリから削除対象のテーブル名称を取得
1. Oracleのバージョンを確認
2. 1で取得したテーブルに対してDROP文を動的SQLで実行
3. 2で確認したバージョンが"10"以降であればPURGEも実行
4. 3,4をテーブル数分ループ

普通はCREATE TABLE～とDROP TABLE～はセットで1ファイルに保持しておくから、
こんな面倒なことはしなくてもいいはず。

***※適用するスキーマやサーバを間違えると取り返しがつかないので、
　使用前に必ず環境の確認をしておくこと。***

## SQL
一応動的SQLの実行個所はコメントアウト。
初回は出力されたDDLを確認して本当に実行するかを決める。

``` dropExistTables.sql
DECLARE
        -- 削除対象のテーブル
        CURSOR table_list IS
            SELECT
                     a.table_name
            FROM
                all_tables a
            WHERE
                a.owner         = 'SCOTT'           -- OWNERを指定
            AND a.table_name    IN (                -- テーブルを指定
                                        'BONUS'
                                       ,'EMP'
                                       ,'DEPT'
                                    )
            ORDER BY
                 a.table_name;

    version     VARCHAR2(2);
BEGIN
    -- Oracleのバージョンを取得
    DBMS_OUTPUT.PUT_LINE('Oracleのバージョンを確認...');
    SELECT
         REPLACE(SUBSTR(version ,0,2) ,'.' ,'') AS major_version
    INTO version
    FROM
        product_component_version
    WHERE
        LOWER(product) LIKE 'oracle%';
    DBMS_OUTPUT.PUT_LINE('バージョンは ' || version);
    
-- 削除処理開始
    DBMS_OUTPUT.PUT_LINE('テーブル削除 ----> START');
    FOR vRec IN table_list LOOP
        DBMS_OUTPUT.PUT_LINE('DROP TABLE ' || vRec.table_name || ' CASCADE CONSTRAINTS');   -- DDL確認用：DROP
        -- Oracleのバージョンが10g以降⇒PURGEでテーブルを完全削除
        IF TO_NUMBER(version) >= 10 THEN
            DBMS_OUTPUT.PUT_LINE('PURGE TABLE ' || vRec.table_name);                        -- DDL確認用：PURGE
--            EXECUTE IMMEDIATE 'PURGE TABLE ' || vRec.table_name;
        END IF;
--        EXECUTE IMMEDIATE 'DROP TABLE ' || vRec.table_name || ' CASCADE CONSTRAINTS';
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('テーブル削除 ----> END');

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('----エラー発生！----------------');
        DBMS_OUTPUT.PUT_LINE('--SQLERRM:'||SQLERRM);
        DBMS_OUTPUT.PUT_LINE('--SQLCODE:'||SQLCODE);
END;
/
```

## まとめ
間違っても本番環境には使えないシロモノなので、
開発環境のワークテーブル等を片づけるのによいかと。
他のDBMSだと
DROP TABLE IF EXISTS *table_name*
の1文で済むのに、Oracleだとこんなに長い。
Raspberry PiのブラウザEpiphanyが強制終了した話

どうもこんにちは。
ラズパイにセンサーを積んであの某番組でお馴染みの人力飛行機に積もうと画策している者です。
でセンサーデータの表示は、楽にブラウザで作ろうなんて考えていたのですが、見事バグを引き当てました。で何が問題だったのかを残しておこうと思います。

##なにが起きたか
Chromeでも他のブラウザでも動くのになせかEpiphanyだけページを読み込んでもブラウザが終了してしまいました。

##どんな構成
普通にHTML、css、jsで書かれたページ。

##検証
JS全部コメントアウト
→駄目
CSSコメントアウト
→動く

##原因
ということでCSSが原因で落ちていました。
で原因を特定したのですが、
``body{overflow-y:hidden;} ``
で落ちます。
同じ状況になった方はご活用ください。
ViewComposer使用時の変数上書きについて

Laravel5系ではViewComposerを使用する事で、view（やelement）と必要なデータ設定処理を切り分ける事が出来る為Controller側からロジックを切り離せる点が魅力です。
但し、下記のように同名の変数を複数箇所で設定した際、意図しない上書きが発生するパターンがある為注意ですね。

※Laravel5.1にて試行。
※ViewComposerは公式にあるようにComposerServiceProviderを作成して設定。

## 同一viewへ複数ViewComposerから同名変数を設定した場合

ComposerServiceProviderにてViewComposerをview(もしくはincludeしたelement)に設定した順の最後の変数が出力されます（後勝ち）。

## 同一viewへControllerとViewComposerから同名変数を設定した場合

ViewComposerで設定した変数が出力されます。

## viewにはControllerから、 includeしたelementにはViewComposerから同名変数を設定した場合

viewにはControllerから設定した変数、includeしたelementにはViewComposerから設定した変数が別々に出力されます（上書き無し）。

## viewとincludeしたelementに、各々別のViewComposerから同名変数を設定した場合

viewとincludeしたelement各々に設定したViewComposerからの変数が別々に出力されます（上書き無し）。
Ubuntu Version確認からディストリビューションのメモ


#よく環境メモする際にubuntuのversion確認方法とか忘れちゃうのでメモ！

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
```

もしくは`lsb_release`コマンドを使います。

```
$ lsb_release -a
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04 LTS
Release:	16.04
Codename:	xenial
```

上記のコマンドを使うには`lsb-release`コマンドがいるのでinstallしておきましょう。

```
sudo apt-get install lsb-release
```

DISTRIBはディストリビューション(distribution)のことです。

>ディストリビューションはOSや複数のソフトウェアを含めたパッケージのことだと私は認識しています。これらを配布している人たちはディストリビュータと呼ばれています。

Linux系ディストリビューションはたくさんありますよね？CentOS, Ubuntu, Red Hatなど。どれもLinuxカーネルを中核としたものなのになぜそれぞれ名前が違うのか考えてみました。

先にディストリビューションはOSや複数のソフトウェアを含めたパッケージのことだと申し上げました。その理由としてLinuxカーネルは同じだが、デフォルトで含まれている他のドライバやソフトウェアが異なるためディストリビューションが複数あるのだと思いました。そして、それによりユーザは目的に応じたディストリビューションを選択することができるため、Linux系は自由度があるのだと思います。


##アーキテクチャ(OSが32ビットなのか64ビットか)を調べる。

```
$ arch
x86_64

$ uname -a
Linux ubuntu 4.4.0-23-generic #41-Ubuntu SMP Mon May 16 23:04:25 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```

私のは64ビットでした。
ここでx86は何を表しているのかを検索したところ。
x86はIntelが開発したマイクロプロセッサシリーズの名前で、x86_64はx86プロセッサの命令を64ビットに拡張したアーキテクチャを表しているとのことです。

まだまだ未熟ゆえ、間違いなどがあれば是非コメントしてください！
2010年以前で止まっていたJavaScript脳を2016年までバージョンアップした話

## はじめに

専任のフロントエンドエンジニアが何人もいる大企業に長らく居たため、幸か不幸かJavaScriptを書く機会があまりなく、2010年以前で脳が停止している状況でした。（それって、エンジニアとしてどーよ、というツッコミは甘んじて受けます涙）


翻って、現職のスタートアップでは所謂フルスタックエンジニアにならざるをえないため、一念発起して2016年まで一気にキャッチアップしようという次第です。

学んだことを記録しておく意味でも、自分が採ったアプローチをまとめてみようと思います。


## ES6の構文を見てフリーズした

初めて見たときには、フリーズしました。。。

```js
var odds = evens.map(v => v + 1);
var nums = evens.map((v, i) => v + i);
```

map...


```js
class SkinnedMesh extends THREE.Mesh {
  constructor(geometry, materials) {
    super(geometry, materials);
  }
  update(camera) {
    super.update();
  }
  static defaultMatrix() {
    return new THREE.Matrix4();
  }
}
```

extends? static?

一足飛びにモダンなトピックを理解するのは無理だと悟ったので、順を追って理解していくことにしました。

## 歴史とトレンドを知る

Qiitaの以下の2つの記事を読むと、おおよその雰囲気が掴めて助かりました。

[春からはじめるモダンJavaScript / ES2015](http://qiita.com/mizchi/items/3bbb3f466a3b5011b509)

[ここ数年前から2015/5までのモダンフロントエンドを総まとめしてみた](http://qiita.com/okmttdhr/items/1caff5a36c8468779a64)


## 基礎固め

### オブジェクト指向

プロトタイプベース、プロトタイプチェーン、束縛、etc と言われて、なんのことやら状態であれば、「モダンなJavascriptがー」以前に基礎体力が不足してる可能性がありそうです。

JavaScriptのオブジェクト指向に関しては、下記資料が丁寧で分かりやすいです。

[最強オブジェクト指向言語 JavaScript 再入門！](http://www.slideshare.net/yuka2py/javascript-23768378)


### ES5

ES5の何たるかについては割愛しますが、[caniuse.com](http://caniuse.com/#feat=es5) によればほぼ全てのブラウザで利用可能です。

日本語解説記事は[ES2015(ES6)な時代だからこそ、ES5を改めて調べたJavaScript初級者のメモ](http://qiita.com/zaru/items/d833dca52962c3f7770f)が読みやすかったです。

どんな構文があったっけと調べるには、 http://kangax.github.io/compat-table/es5/ がよさそうです。


## npm と browserify あるいは webpack

昔はjQueryのzipをダウンロードし自分たちのプロジェクトに取り込む、といったことをやっていたわけですが、控えめに言っても「超めんどくさい」。

ブラウザで使うモジュール・ライブラリもrubyで言うgemのように管理したいというのは、自然な流れだと思います。

で、[browserify](http://browserify.org/)あるいは[webpack](https://webpack.github.io/)は、平たく言うとNode.jsで発展したモジュール管理システム・方式をブラウザでも使えるようにしちゃおうぜ、というツールです。

使い方・入門については、日本語記事も豊富にあるので割愛しますが、browserify のほうがシンプルで用途も限定的なので、初心者向きなのかなと思います。

## ES6

ここまでで、ようやくES6を理解するのに必要な下地ができました。

色々な記事見ましたが、[Learn ES2015](http://babeljs.io/docs/learn-es2015/)を見ながら同じくBabelの[REPL](http://babeljs.io/repl/)で写経していくのがオススメです。日本語記事なら、[ECMAScript 2015（ECMAScript 6）特集](https://html5experts.jp/series/ecma2015/)が分かりやすかったです。


写経が終わったら、自分で書いたコードをブラウザで使えるよう設定をします。

最低限必要な設定としては、

```json
{
  "name": "hello_babel",
  "version": "1.0.0",
  "description": "",
  "devDependencies": {
    "babelify": "^7.3.0",
    "babel-preset-es2015": "^6.6.0",
    "browserify": "^13.0.1"
  },
  "scripts": {
    "build": "browserify script.js -t babelify --outfile bundle.js"
  },
  "author": "",
  "license": "ISC"
}
```

```bash
echo '{ "presets": ["es2015"] }' > .babelrc
```

で、準備が整ったら

```bash
npm run build
```

すれば、script.js が bundle.js に変換されます。

アッサリ書いてますが、「babelifyとbrowserifyの違いって何？」とか「babelのpresetsって何？」とか戸惑うことはいくつかありました。（今はわかりますけど^^）

こればかりは1つずつ調べて身につけていくしかないのかなぁと思います。

## まとめ

自身がES6を使えるようになるまでの学習の道筋をダンプしてみました。
何らかのお役に立てれば幸いです。
node.jsでズンドコゲッター

#概要
paizaのnode.jsでズンドコゲッターやってみた。
#実際
https://paiza.io/projects/CXht_fiUVinsqtRsE1vu6w
#サンプルコード
```
process.stdin.resume();
process.stdin.setEncoding('utf8');

var http = require('http');

var i = 0;
var j = 0;
var str = "";
function zundoko(callback) {
    var URL = 'http://ohijs0.paas.jp-e1.cloudn-service.com/zundoko';
    http.get(URL, (res) => {
        var body = '';
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            body += chunk;
        });
        res.on('end', (res) => {
            callback(body);
        });
    }).on('error', (e) => {
        console.log(e.message);
    });
}
function kiyosi() {
    if (j < 1)
    {
        zundoko(function(response) {
            str += response + " ";
            if (response == "ドコ")
            {
                if (i == 4) 
                {
                    j = 1;
                }
                else
                {
                    i = 0;
                }
            }
            else
            {
                i++;
            }
            kiyosi(response);
        });
    }
    else
    {
        str += "キ・ヨ・シ！";
        console.log(str);
    }
}
kiyosi();
```
Registry v2 と Let's Encryptを使ってDocker Private Repositoryを構築

Registry (https://github.com/docker/distribution) を利用すると誰でも気軽にDocker Private Repositoryを立てられるが, DockerはHTTPによる通信を非セキュアとして通常は許可しておらず, HTTPSによる通信を行なうためには証明書を取得する必要があり, そのためのコストが高かった.

ここで面倒臭くなって大分長いことPrivate Repositoryを立てたいと思いつつ, 実行に移せていなかったのだが, そういえば Let's Encrypt が 2016年4月に正式公開されたはずなので, これを利用すればオレオレ証明書をでっちあげたりしなくても, 簡単に認証付きRegistryを立てられることに気付いた.

 この記事ではLet's Encrypt を利用して, 証明書を発行し,
認証付きのRegistryを立てる方法を簡単に紹介したいと思う.

## 準備

- Docker 1.6.0 or newer
- 自分の管理下にあるドメイン (この記事では `<my-domain>` と表記.)

## Let's Encrypt から 証明書をひっぱってくる

参考記事: http://qiita.com/sawanoboly/items/9fdde1707de5e975dd15

以下のコマンドで/etc/letsencrypt以下に証明書をひっぱってくる.

```
docker run -it --rm -p 80:80 -p 443:443 \
  -v "/etc/letsencrypt:/etc/letsencrypt" \
  -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
  quay.io/letsencrypt/letsencrypt:latest certonly --standalone

mkdir -p certs
cp /etc.letsencrypt/live/<my-domain>/fullchain.pem certs/<mydomain>.crt
cp /etc.letsencrypt/live/<my-domain>/privkey.pem certs/<mydomain>.key
```
ドメイン名やメイルアドレスを聞かれるので素直に答える. 処理が終了すると `/etc/letsencrypt/live/<my-domain>/` 以下に必要なファイルが生成されている.
今回はこのうち, `fullchain.pem` と `privkey.pem` を利用する.


## htpasswd を生成

パスワード認証用にhtpasswdを生成しておく. `<user>` と `<password>` にはそれぞれパスワード認証に使うidとpasswordを設定. `>` が混ざって読みづらくなってしまって申しわけない.

```
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn <user> <password> > auth/htpasswd
```

## Registryコンテナを立ち上げる

ホストのファイルシステム上のディレクトリ `/tmp/registry` で コンテナイメージを管理することにしよう.

```
docker run -d -p 5000:5000 --restart=always --name registry \
  -f /tmp/registry:/var/lib/registry
  -v `pwd`/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/<my-domain>.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/<my-domain>.key \
  registry:2
```

Ok.

## Registryコンテナから push/pull してみる

```
docker pull ubuntu # これは今回作ったRegistryからpullしているわけではない. 実際なんでもいい.
docker login <my-domain>:5000 # user/password を聞かれるので素直に答える
docker tag ubuntu <my-domain>:5000/ubuntu

# push
docker push <my-domain>:5000/ubuntu

# pull
docker pull <my-domain>:5000/ubuntu
```

Ok.

## 参考資料

https://docs.docker.com/registry/
https://docs.docker.com/registry/deploying/
技術英語 > So while this man was giving us his best every minute of every day, I [was busy judging him]. / vicious circle

@ Star Trek Voyager > INVESTIGATIONS

船を去るという、あるクルーについてNeelixが熱弁を奮っている

> So while this man was giving us his best every minute of every day, I <font color=red>was busy judging him</font>.

憎まれ口をたたき出したら、それが癖になるという罠。

<hr>
関連して思い出したのは

vicious circle

http://qiita.com/7of9/items/c572dffc4456a2c03946
ElastiCacheのredisのスケールアップ & スケールアウトについて調べた


## 事の始まり

関わっているウェブサービスの速度改善をしようということになりまして、まあそうなると大体はまず最初に思いつくのがキャッシュですよね。
EC2でサーバ動かして画像などのファイルはS3、DBはRDSと全てAWS上で動いており、キャッシュストアも例に漏れずElastiCacheを使用しておりました。
本来は最初に調べるべきだったんです、、、そうredisの余力を。

このウェブサービスはメディアだったので、画面数が多くフロントサイドのフラグメントキャッシュを使っていたためredisのメモリをかなり必要としました。
ステージングで気付けたので障害にはなりませんでしたが、なんも考えずにいたるところでキャッシュキャッシュしてたら死んでましたね。
キャッシュストアだけではなくセッション管理にも使っているため危なかったでした。
ごめん、、、こんなになるまで気づいてやれなくて。。。

ElastiCache自体のスケールアップについてはボタンをぽちぽちぽちとするだけでできちゃうので手順については書きません。
僕が知りたかったのは操作ではなく、何をしたらサービスが死ぬのか。マルチAZの構成に変更したらサービス死ぬ？バックアップとったら死ぬ？などなどなど。
これらの操作を行っている最中redis-cliでクエリを叩いてレスポンスが帰ってこない状況にならないかを調べました。

先に言っておきますと、railsアプリケーション側でキャッシュストアにアクセスできなくても落ちないように設計されていない場合に、ダウンタイムなしでスケールアップはできませんでした。

## スケールアウト
できない。
スケールアウトはノードの追加ってことだと思うんですが、redis3.0から対応しているredis clusterでないと途中からのノードの追加はできないようでした。
早くelasticacheでredis3.0を使える日が来てくれることを祈るばかりです。
memcacheならできるんですけどね。

## スケールアップ
スケールアップなら可能ですが、これも残念なことにスケールアップしている最中接続が切れます。
これはたとえレプリケーションやマルチAZの構成にしてあっても接続が切断されます。

理由は以下の通り。
http://qiita.com/dany1468/items/8946cd5e4c853b48bffd
説明に書いてある通り納得の理由ですね。

## 接続が切れる操作
スケールアップ マルチAZ+レプリケーション構成でもスケールアップ中レスポンスが帰ってこなくなる

## 接続が切れない操作
レプリケーションの作成
スナップショットの作成
マルチAZを使用していない状態から使用するに変更

## どうしてもダウンタイムなしにしたい
1. スナップショット作成
2. スナップショットから新しいprimary クラスタ作成
3. Webアプリケーションからキャッシュストアの向き先を新しく作成したredisのエンドポイントに設定

と、こんな感じでしょうか。。。どうしても1~3の間にこぼしてしまうデータがあるので、これ自体も完全なスケールアップ手順ではないので、完全とは言えないです。。。


間違ったことなどあればご指摘ください。
検討を祈ります。
Swiftを学ぶ：少し「Optional」を学ぶ　その２

[前回(Swiftを学ぶ：少し「Optional」を学ぶ)](http://qiita.com/t_punch/items/f3079f495ddae0a2bb5f)
の続き。

型の後ろに"?"の他に"!"が使えます。
アンラップするのに"!"を使いますが、

`var hoge: Int!`
とすることにより「nil」の定義も利用でき、さらに最初からアンラップされた状態で定義できます。
"!"を使った定義は暗黙的アンラップ型と呼ばれます。

```
var hoge:Int!
hoge = nil
hoge = 123
var fuge:Int = 5

fuge += hoge //すでにアンラップされた状態なのでエラーにならない
```
最初からこれでいいじゃない。
と、なりますが使用時には値が入っていることが前提となっているのできちんと対応しないと落ちバグの元になるので注意が必要です。

サンプルでInt型などで書きましたが、"?""!"が必要になるのはclassや構造体の定義時に
実態がある、ないなどの判断で利用することが多いかと思います。

その辺も勉強しつつ追記、投稿できたらと考えております。
OS X上のpyenvの環境でPython3.5.1でPygameをインストールした

# pygameの対応は大昔に終わっている
python3系への対応はされておらず、既に時代遅れとなっているpygameだが、pysdl2はpygameほど手軽ではなく、それほどまで厚いラッパーではない

今回は単純なものを素早く作りたかったので、pygameをpython3系で使うことにした。

ちなみに、2系でもこの方法でのダウンロードがいいらしいです。

## インストール

まずは必要物のインストール

```bash:インストール
brew install mercurial
brew install git 
brew install sdl sdl_image sdl_mixer sdl_ttf smpeg portmidi
```

次にpipを使ってpygameをインストール

```bash
pip install hg+http://bitbucket.org/pygame/pygame
```

pipでのインストール中に、こんなのが出てきた
<img width="432" alt="スクリーンショット 2016-06-01 02.23.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/92994/3af41f80-b6be-f74d-0fb6-c6019e0ccad7.png">

まさかgui側からこんなふうに出てくるとは思わなかったが、指示に従い依存関係の解決をした。

## 確認
```py3:かくにん
>>> import pygame
>>> pygame.init()
2016-06-01 02:46:59.521 python3[55786:2013267] 02:46:59.521 WARNING:  140: This application, or a library it uses, is using the deprecated Carbon Component Manager for hosting Audio Units. Support for this will be removed in a future release. Also, this makes the host incompatible with version 3 audio units. Please transition to the API's in AudioComponent.h.
(6, 0)
>>> pygame.display.set_mode((500, 500))
<Surface(500x500x32 SW)>
>>> exit()
```

動いたし問題~~無い~~ あります

どうやらKEY関連のイベントが[うまくいかないらしい](http://stackoverflow.com/questions/2718897/mac-os-x-pygame-input-goes-to-terminal-instead-of-python)です。

3系だとpysdl2に手を出す他ないようです…
convert template.HTML to string

<https://play.golang.org/p/VGmNOpn1sU>

```go
package main

import (
	"fmt"
	"html/template"
	"strings"
	"reflect"
)

func main() {
	html := template.HTML("Hello")
	s := string(html)
	fmt.Println(reflect.TypeOf(s))
	fmt.Println(strings.Replace(s, "He", "De", -1))
}
```
Unit Test実行時にjava.lang.VerifyErrorが発生する場合の対処方法


`./gradlew test`でUnit Testを実行した際に`java.lang.VerifyError`が発生しテストが全て失敗する場合の対処方法です。

以下のようにbuid.gradleにtestOptionsを追加します。

```gradle
android {
    testOptions {
        unitTests.all {
            jvmArgs "-noverify"
        }
    }
}
```

ただし`./gradlew testDebug`では`java.lang.VerifyError`が発生しません。

`./gradlew test`を実行すると、`testDebug`と`testRelease`の両方が実行されるため、`java.lang.VerifyError`は`testRelease`の場合に発生していることがわかります。実際に`testRelease`を実行すると`java.lang.VerifyError`が発生しました。

これをもう少し掘り下げて調査すると、以下のコードが原因であったことがわかりました。

```java
if (BuildConfig.DEBUG) {
    return;
}

FlurryAgent.setLogEnabled(false);
FlurryAgent.init(this, getString(R.string.flurry_api_key));
```

`testRelease`を実行することでFlurryの初期化がUnit Test実行時に行われていた結果`java.lang.VerifyError`が発生していたと考えられます。

したがって、今回のケースではreleaseビルドでUnit Testを実行する理由が無いことから、Unit Testの実行は`./gradlew testDebug`で行うことで`java.lang.VerifyError`の発生に対処することができました。

もし何らかの理由でtestReleaseを実行する必要がでた場合には、JVMオプションを指定する方法でUnit Testを実行しようと思います。
ofxFftでFFTWを使うための準備

ofxFftとは、FFTW と KISS FFT の両方を使えるAddonですが、FFTWを使うためには、準備がいるみたいです。

# 使用するもの
- of_v0.9.2_osx_release
- Xcode7
- [ofxFft](https://github.com/kylemcdonald/ofxFft)

# 手順
1. [こちら](https://github.com/kylemcdonald/ofxFft)からofxFftをダウンロードし、いつもどおりaddonsフォルダの中に保存します。   

2. readmeのここにもあるように、この[precompiled libraries](https://github.com/downloads/kylemcdonald/ofxFft/fftw-libs.zip)をクリックします。
![スクリーンショット 2016-05-31 14.23.34.png](https://qiita-image-store.s3.amazonaws.com/0/96807/d2a2bf9d-5145-fad7-bc81-099dc073ccc1.png)       

3. zipがダウンロードされるので、下のように開きます。
![スクリーンショット 2016-05-31 14.12.56.png](https://qiita-image-store.s3.amazonaws.com/0/96807/78afb778-5bc0-4dc2-c394-a42f99c5e543.png)       

4. このfftw3f.aを ```addons/ofxFft/libs/fftw/include``` の中に入れます。
![スクリーンショット 2016-06-01 0.25.26.png](https://qiita-image-store.s3.amazonaws.com/0/96807/d23d005c-18e8-1a76-0944-f59648d52669.png)
     

5. includeを右クリックし、Add Files to ~ を選択します。
![addfiles.png](https://qiita-image-store.s3.amazonaws.com/0/96807/079c9a99-7379-bff4-0e89-76996fc89a32.png)

6. 先ほどincludeの中に入れたfftw3f.aを選択し、Addします。
![add.png](https://qiita-image-store.s3.amazonaws.com/0/96807/c5c85c50-7c10-e229-0ea2-b26989aeb6c3.png)

7. 入りました。
![スクリーンショット 2016-06-01 0.48.30.png](https://qiita-image-store.s3.amazonaws.com/0/96807/b58ca4cf-56ce-28f1-3eb3-77376c3564e7.png)


8. プロジェクトのBuild Settingsを開き、Other C++ Flagsに```-DOFX_FFT_USE_FFTW
 ```を追加します。検索すると、見つけやすいです。
![flags追加.png](https://qiita-image-store.s3.amazonaws.com/0/96807/eb16ee8e-2bda-c938-da8e-bee62d1d95e7.png)

9. 32bitにします。
![bit.png](https://qiita-image-store.s3.amazonaws.com/0/96807/595ecc9f-d3ea-b5e2-fe8f-90a3a5004977.png)

10. ofApp.cppのsetup()で、FFTWを使うように書きかえます。

```ofApp.cpp 
fft = ofxFft::create(bufferSize, OF_FFT_WINDOW_BARTLETT);
// To use with FFTW, try:
// fft = ofxFft::create(bufferSize, OF_FFT_WINDOW_BARTLETT, OF_FFT_FFTW);
```
を以下のように書きかえて、、、

```ofApp.cpp
// fft = ofxFft::create(bufferSize, OF_FFT_WINDOW_HAMMING);
// To use FFTW, try:
fft = ofxFft::create(bufferSize, OF_FFT_WINDOW_HAMMING, OF_FFT_FFTW);
```



11. おわり
![スクリーンショット 2016-06-01 0.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/96807/ee97b1d4-c196-4c94-9de9-e742a69eae64.png)

# ちなみに
何も準備せずに、コードをFFTWに書き換えただけでもビルドは通りますが、使えていないみたいなので注意。
![warning.png](https://qiita-image-store.s3.amazonaws.com/0/96807/c95be05c-53f1-3c4c-53eb-a7377cecfa51.png)



# おまけ
exampleは最初こんな感じで実行できません。なのでprojectGeneratorでアップデートします。
![スクリーンショット 2016-05-31 14.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/96807/66784c68-eff5-e96b-bf33-ab6f6e9f7be8.png) 
1. projectGeneratorで、importをクリック。その後、アップデートしたいプロジェクトを選択し、開くを押します。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/96807/021c375f-3d11-23de-01b2-a514e750cf05.png)
2. Project nameが先ほど選んだものになっていること、Addonsが選択されていることを確認し、Updateを押します。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/96807/adc22ca2-aad7-1c7a-0947-6acaabbb92ce.png)
3. 先ほど、srcとaddons.makeしかなかったところに、example-basic.xcodeprojなどが作成されているので、それを実行します。
4. 完成！
![スクリーンショット 2016-05-31 14.45.09.png](https://qiita-image-store.s3.amazonaws.com/0/96807/20b5677a-2c2e-17b3-c06c-7ad2b54f0a53.png)
Spectron で Electron アプリのテストをする

Electron が Ver.1.0 になり、関連ツールもいくつかリリースされました。Spectron はその一つで、Electron の API 部分をテストできるようになるフレームワークです。

これまでも ChromeDriver を使ってテストを書くことはできましたが、あくまで WebDriver でしかなかったわけで、ブラウザとして実現できる部分のテストくらいしか書くことができませんでした。しかしこれからはアプリ全体のテストをすることもできるようになると期待できますね。

## 参考
[electron/spectron: Test Electron apps using ChromeDriver](https://github.com/electron/spectron#using)

正直 README.md がすべてな印象です。

## 環境
Electron 1.0.2
Spectron 3.0.1

## 導入
```
npm install --save-dev spectron
```

Electron と Spectron のマイナーバージョンを揃える必要があります (Electron 1.0.x であれば Spectron 3.0.y)。`package.json` を必ず編集してバージョン指定に **~** を使いましょう。

## 実装
Spectron の README.md に書かれているサンプルをどうぞ。

```test.js
var Application = require('spectron').Application
var assert = require('assert')

describe('application launch', function () {
  this.timeout(10000)

  beforeEach(function () {
    this.app = new Application({
      path: '/Applications/MyApp.app/Contents/MacOS/MyApp' // あるいは electron-prebuilt の実行ファイルを指定し、`args` にソースコードのパスを与える
    })
    return this.app.start()
  })

  afterEach(function () {
    if (this.app && this.app.isRunning()) {
      return this.app.stop()
    }
  })

  it('shows an initial window', function () {
    return this.app.client.getWindowCount().then(function (count) {
      assert.equal(count, 1)
    })
  })
})
```

`new Application()` にアプリの実行ファイルのパスを渡すだけでよいので、ChromeDriver + WebDriverIO の組み合わせよりもずっと楽に扱えます。`app.start()` の呼び出しでアプリが起動してくるので、あとは WebdriverIO と Electron(Spectron) の API を駆使してテストケースの作成を頑張る、という感じです。

Electron アプリを起動するだけあってかなり遅いので、簡単にテストがタイムアウトして失敗します。mocha であれば `this.timeout()` で各テストのタイムアウトを余裕を持って伸ばしておくと無難です。

## 雑感
ChromeDriver で Electron を動かすまでの面倒な部分が一掃されており、非常に使いやすくなっていると感じました。また `app.client` が WebdriverIO の API と統合されているため、既に WebdriverIO を使用しているのであれば楽に移行できると思います。[実際やってみた](https://github.com/mattermost/desktop/commit/b52dfa5348029a5cdf6bc7dfda7d94ecc0b5f0ec?w=)ところ、テスト本体は殆ど変わっていません (むしろ変わっていたらおかしいのですが)。

今すぐにテストを追加しなくとも、とりあえず Spectron を使える状態にしておくというのもありかと思います。
Wordで複数行が結合された表をOLEオブジェクトで読もうと思ったらハマった話

現在自分は、ふらっとステーション・とつかというコミュニティカフェのネット広報を担当しています（といっても、やってることは、イベント情報をGoogleカレンダーに取り込んでるだけです）。

ふらっとステーション・とつかの広報誌、わくわくだよりは、2016/06/01時点ではWordで作られており、このWordの中から表をOLEオブジェクトを使って読み取り、GoogleカレンダーのCSV形式に変換、Googleカレンダーにインポートしています。

で、この会報誌、ときどきフォーマットが変わっており、先々月からOLEエラーが発生して読めなかったので、そのときの体験談からこの記事を書きました。


なお、この問題に対応したソースコードは、Githubに上がっています。まあ、Word形式のふらっとステーション・とつかわくわくだよりは公開されていないので、読んでもなんの役にも立たないのですが、どういう感じに使うのかの参考にでも。

https://github.com/TakamiChie/UWSCScripts/blob/master/furattoschedule..uws

なお、自分は個人的な好み（ごく簡易的なGUIがあり、OLEも呼べる）から、UWSCをOLEをいじるために使ってますが、VBAでも大体同じですので、適宜読み替えると良いかと思います。

# ごくごく簡単に表を読む場合

WordのOLEオブジェクトを使って表を読む場合、DocumentオブジェクトのTablesコレクション（内のTableオブジェクト）を使います。

例えば以下のような表だと

| 1 | 2 | 3 |
|:--:|:--:|:--------:|
|日付|曜日|イベント内容|
|日付|曜日|イベント内容|
|日付|曜日|イベント内容|
|・・|・・|・・・・・・|
|・・|・・|・・・・・・|
|・・|・・|・・・・・・|
|・・|・・|・・・・・・|

以下のような感じになります

```uwsc
DIM doc
doc = // ドキュメントオブジェクトが入る
FOR i = 1 TO doc.tables.count
  DIM table = doc.tables[i]
  FOR l = 1 TO table.rows.count
    DIM date = table.rows[l].cells[1].range.text
    DIM week = table.rows[l].cells[2].range.text
    DIM detail = table.rows[l].cells[3].range.text
　　・・・
  NEXT
NEXT
```

ドキュメントのTablesコレクションからTableオブジェクトを取り出し、その中のRowsコレクションから各行を示すRowオブジェクトを取り出して逐一処理していくという感じですね。

## どこかの列が結合された表を読む場合

ただし、このやり方は、**表の中でどこかの列が結合されているときに使うことができません（エラーが発生します）**。つまり、以下のような表だとアウトと言うことです

| 1 | 2 | 3 |
|:--:|:--:|:--------:|
| 日 |曜日|イベント内容|
| 付 |曜日|イベント内容|
| 日 |曜日|イベント内容|
| 付 |曜日|イベント内容|
|・・|・・|・・・・・・|
|・・|・・|・・・・・・|
|・・|・・|・・・・・・|

Qiita記法にはspanを設定する記法がないため、少しわかりづらいですが、1列目の「日付」は、2行が結合されていると思ってください。

こうなると、TableオブジェクトのRowsコレクションにアクセスしようとした時点で、OLEエラーが発生します。

ではどうするかというと、TableオブジェクトのRangeプロパティを使用します。

```uwsc
DIM doc
doc = // ドキュメントオブジェクトが入る
FOR i = 1 TO doc.tables.count
  DIM table = doc.tables[i]
  FOR l = 1 TO table.range.cells.count
    DIM date = table.range.cells[1].range.text
    DIM week = table.range.cells[2].range.text
    DIM detail = table.range.cells[3].range.text
　　・・・
  NEXT
NEXT
```

ドキュメントのTablesコレクションからTableオブジェクトを取り出し、その中のRangeオブジェクトにあるCellsコレクションから、各セルを示すCellオブジェクトを取り出して逐一処理していくという感じです。

## セルのColumnIndexを知りたい場合

では今見ようとしているセルが、**テーブル上の何番目の列に位置するのか**というのを確認するにはどうすればいいでしょうか。

それは、CellオブジェクトのColumnIndexプロパティを使用します。

```UWSC
  table.range.cells[1].columnindex // 上に書いた表の通りであれば1
  table.range.cells[2].columnindex // 上に書いた表の通りであれば2
  table.range.cells[3].columnindex // 上に書いた表の通りであれば3
  table.range.cells[4].columnindex // 上に書いた表の通りであれば2
  table.range.cells[5].columnindex // 上に書いた表の通りであれば3
  table.range.cells[6].columnindex // 上に書いた表の通りであれば1
```

ということで、`table.range.cells[n].range.text`と`table.range.cells[1].columnindex`を使えば、とりあえず表の走査には困らなさそうです。
PostgreSQL 9.5 によるレプリケーション構成（同期）

今回の内容は[PostgreSQL 9.5 によるレプリケーション構成（非同期）](http://qiita.com/U_ikki/items/e117acad0413546d6923)の続編になります。


# 前提
- 非同期レプリケーションを構築した環境を使用します。
- 2台のPostgreSQLは停止した状態になっている。

# 1. 同期レプリケーションに必要な設定を行う
非同期レプリケーションの環境ができていれば、同期レプリケーションするための設定は少しだけです。

# 1-1. postgresql.confを修正する（マスタのみで実施）
非同期レプリケーションのときに設定した内容に、以下の内容を追記します。

```postgresql.conf
synchronous_standby_names = 'green'
```

# 1-2. recovery.confを修正する（スレーブのみで実施）
recovery.confの[primary_conninfoの接続文字列](http://www.postgresql.jp/document/9.5/html/standby-settings.html)に**application_name**を設定します。

```recovery.conf
standby_mode = 'on'
primary_conninfo = 'user=postgres host=192.168.1.1 port=5432 application_name=green'
```

# 2. PostgreSQL（マスタ、スレーブ）を起動する。
起動が終わったら、マスタの統計情報ビュー「pg_stat_replication」のapplication_nameやsync_stateを確認します。

```
$ psql postgres -c "SELECT * FROM pg_stat_replication" -x
-[ RECORD 1 ]----+------------------------------
pid              | 21620
usesysid         | 10
usename          | postgres
application_name | green
client_addr      | 192.168.1.2
client_hostname  | 
client_port      | 51078
backend_start    | 2016-06-01 00:45:17.080761+09
backend_xmin     | 
state            | streaming
sent_location    | 0/3014688
write_location   | 0/3014688
flush_location   | 0/3014688
replay_location  | 0/3014688
sync_priority    | 1
sync_state       | sync
```

sync_state:syncとなっており、同期レプリケーションされていることが確認できました。
名字ランキングから名字を抽出するスクリプト

名字由来NET(http://myoji-yurai.net/) の名字ランキングで名字を抽出するスクリプト。


```javascript:
var simple=document.getElementById("content").getElementsByClassName("simple"); for(var i=0; i<simple.length; i++) { var a=simple[i].getElementsByTagName("a"); for(var j=0; j<a.length; j++) console.log(a[j].innerHTML); }
```
虫の画像を作るPod作った


[CocoaPods](https://cocoapods.org/pods/BugImageCreator)

![Screenshot](https://raw.githubusercontent.com/malt03/BugImageCreator/master/Screenshot.png)

##使い方
###コードから
```swift:虫画像作成
let bugImage = BugImageCreator.getChacheOrCreate(size: 50, lineWidth: 1, color: .blackColor())
```

###Interface Builderから
![スクリーンショット 2016-06-01 0.26.35.png](https://qiita-image-store.s3.amazonaws.com/0/44356/6bb7a1df-6f57-7bfa-d5ea-339ca202c73f.png "スクリーンショット 2016-06-01 0.26.35.png")

##良い所
- 虫画像をバンドルしない。
- 一度作成した画像はキャッシュする。

デバッグ用のUIを可愛くしたい。
でもデバッグの時だけ必要な画像なのでバンドルしたくない。
かつデバッグ時の起動時間も遅くしたくない。
そう思ったので作りました。

http://qiita.com/malt/items/9ca22e0df67e764427d6
これで使ってます。
Hướng dẫn cài mangento trong docker


## Cài docker trên local

**Window :**
Docker: https://docs.docker.com/engine/installation/windows/
Docker compose: https://docs.docker.com/compose/install/

**Kiểm tra xem docker đã chạy chưa?**

```
docker ps
```

Nếu mà nó ra được màn hình như bên dưới thì ok.

![Screen Shot 2016-06-01 at 12.06.36 AM.png](https://qiita-image-store.s3.amazonaws.com/0/103998/e88d9f92-1062-890e-6e2a-47f97111e89a.png "Screen Shot 2016-06-01 at 12.06.36 AM.png")


## Cài magento trong docker

https://github.com/thangnv107/magento2-docker-compose

+ Clone link github bên trên về máy

```
git clone https://github.com/mageinferno/magento2-docker-compose.git
```

+ Di chuyển đến thư mục đã clone

```
cd magento2-docker-compose
```

**Chú ý:** Trong cái file ``docker-compose.yml`` có cái dòng: ``M2SETUP_BASE_URL=http://docker.local/`` thì domain sẽ dùng là ``http://docker.local/``

Trong cái file này thêm cái dòng bên dưới vào để có thể kết nối đến mysql từ bên ngoài:

```docker-compose.yml
ports:
    - 3306:3306
```

![Screen Shot 2016-06-01 at 12.13.32 AM.png](https://qiita-image-store.s3.amazonaws.com/0/103998/d953a30d-9f9f-f62a-b38b-178d041572ff.png "Screen Shot 2016-06-01 at 12.13.32 AM.png")


+ Cài docker image cho mangento

```
docker-compose run --rm setup
```

Khi cài nó sẽ hỏi nhập vào ``username`` và ``password`` của composer để tải magento về máy. Khi đó vào trang này để đăng kí lấy key: http://devdocs.magento.com/guides/v2.0/install-gde/prereq/connect-auth.html

Sau khi đã cài xong thì chạy docker container

```
docker-compose up -d app
```

## Gán địa chỉ ip của docker

Kiểm tra địa chỉ ip của docker

```
docker-machine ip
```

Gán địa chỉ đến cái ``docker.local`` vào file ``/etc/hosts``

```/etc/hosts
192.168.99.100 docker.local
```

Kiểm tra ``http://docker.local`` trên trình duyệt:


## Cấu trúc server đã được cài qua docker

Kiểm tra xem thông tin docker container đã được cài

```
$ docker ps

CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                         NAMES
e59efeeba3a4        mageinferno/magento2-nginx:1.9.14-0    "/usr/local/bin/start"   2 days ago          Up 2 days           0.0.0.0:80->80/tcp, 443/tcp   magento2dockercompose_app_1
647dad57ad4a        mageinferno/magento2-php:7.0.5-fpm-0   "/usr/local/bin/start"   2 days ago          Up 2 days           9000/tcp                      magento2dockercompose_phpfpm_1
a68ff67ffea3        mariadb:10.1.13                        "/docker-entrypoint.s"   2 days ago          Up 2 days           0.0.0.0:3306->3306/tcp        magento2dockercompose_db_1
```


Cấu trúc server gồm 3 server chính:

+ ``magento2dockercompose_app_1``: chứa nginx để xử lí các request tĩnh html, css, js, image và cache nó lại. Với những request động .php thì sẽ được chuyển sang magento2dockercompose_phpfpm_1

+ ``magento2dockercompose_phpfpm_1``: chỉ xử lí các request động .php
+ ``magento2dockercompose_db_1``: server mysql.

Để vào server magento2dockercompose_phpfpm_1:

```
docker exec -it magento2dockercompose_phpfpm_1 bash
```

Thư mục chứa code: `` /srv/www ``
シェル芸で指数乱数を発生させる

ワンライナーで指数乱数を発生させるシェル芸です。

ちょっとしたシミュレーションを"パッ"とやりたい時、ワンライナーでお手軽に乱数を発生させられます。

逆変換法ってのを使うと一様乱数から、任意の確率分布に従う乱数を得ることができるので、基本的に、一様乱数さえ作ることができれば、様々な種類の乱数が少ない手数で作れるんですね。

まずは一様乱数作成ワンライナー
```一様乱数作成
cat /dev/random | nkf -W | tr -dc '0-9' | gfold -b10 | sed 's/^/0./g' | head -n 1000
```
上記のワンライナーで[0-1]の一様乱数が1000個作られます。

次に、指数乱数を作成。
```指数乱数作成
cat /dev/random | nkf -W | tr -dc '0-9' | gfold -b10 | sed 's/^/0./g' | head -n 1000 | awk '{print -log($1)}'
```

これで、平均1の指数乱数が1000個作られます。
gitのcommitを誰にもバレずに消したいとき

git commitを消せずに焦ったgit初心者です

会社の先輩にバレる前にcommitを削除しましょう

# git resetでcommitを取り消し

<Font color="red">git reset</font>でcommitを消します

```
# git logを確認
$ git log --oneline
0b54514 test3
d839e07 test2
b4cdb08 test
```

```
#2つ前までのcommitを取り消す
$ git reset --soft HEAD^^

#2つ前までのcommitを取り消す
$ git reset --soft HEAD~2
```

このコマンドのどちらかを打つと

```
$ git log --oneline
b4cdb08 test
```

２つ前までのコミットが削除されました！

```
・--soft   commitのみ取り消したい時
・--hard   commit+ワークディレクトリから内容も書き換えたい時
```
HEADについて

```
HEAD^^、HEAD~2は同じ意味ですね
^や~の後の数字を変えれば削除出来るcommit数も変えることができます
```
UPROPERTY のプロパティ指定子をランタイムで Transient に変更してみた

プロパティ ACharacter::Mesh::SkeletalMesh にプロパティ指定子 Transient を付加したい場合が出てきたので調べてみたところ、以下の方法で出来ました。

```cpp
AMyCharacter::AMyCharacter()
{
	UClass* Class = GetMesh()->GetClass();
	UProperty* Property = Class->FindPropertyByName(TEXT("SkeletalMesh"));
	if (IsValid(Property))
	{
		Property->SetPropertyFlags(CPF_Transient);
	}
}
```

今回試したのは Transient だけですが、他のプロパティ指定子もできるかもしれません。
Proxy配下のGitLabでWebHookを飛ばす

# Proxy配下のGitLabでWebHookを飛ばす

> ※この記事は私の[ブログ](http://nmtysh.hatenablog.com/entry/2016/05/31/234736)にも掲載しています。

直接インターネットに出られない環境に構築されたGitLabだとWebHookが使えません。
Proxy経由で出られるようにします。

OSの場合だと環境変数に `http_proxy` や `https_proxy` を設定するとproxyが利用されますが、GitLabはこの設定を見ていないようです。
なので `/etc/gitlab/gitlab.rb` に設定を追記します。

デフォルトのgitlab.rbだと `gitlab_rails['env']` がコメントアウトされていると思うので、コメントアウトを解除して `http_proxy` と `https_proxy` を設定します。

```ruby
gitlab_rails['env'] = {
  'http_proxy'  => 'http://host:port/',
  'https_proxy' => 'http://host:port/'
}
```

あとは `gitlab-ctl reconfigure` を実行して設定を反映させるとGitLab上からProxyを経由してWebHookを送信することができます。

## x. 参考

- [Support Adding ENV variables to be used by unicorn and sidekiq (!130) · Merge Requests · GitLab.org / omnibus-gitlab · GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests/130)
UNIXコマンドは何の略なのか?

コマンドの機能については特に述べない。
あと基本的なコマンドしか述べない。
略称になっているのか、manコマンドのNAMEはどのように記述されているのか、略称で覚えるなら...を述べる。

参照している部分がMacOS標準のコマンド群(BSD版)をmanコマンドで調べた内容である。(NAMEの部分)

## awk
開発者のAlfred Aho・Peter Weinberger・Brian Kernighanの頭文字。
略語とコマンドの意味は一致していない。
NAMEは以下になっていた。
>pattern-directed scanning and processing language.

## cat
ファイルを結合してプリントするというのが、catコマンドの本当の意味。
以外に知らないと思う。
>concatenate and print files

## chmod
ファイルやディレクトリの権限を変更できるだけでなく、権限の経過をリスト化できる。
>change file modes or Access Control Lists

## chown

>change file owner and group

## ln

>make links 

## mkdir
>make directories

## pwd
print working directoryで覚えるといい。
>return working directory name

## touch
ファイルの最終アクセス日時と最終更新日時を変更する。
ファイルがない場合は新しいファイルを作成する。

新しいファイルを作成する機能だと覚えている人多いと思う。
>change file access and modification times

## ps

>process status

## wc
word countで覚えるといい。
>word, line, character, and byte count

## grep
global regular expression printで覚えるといい。
>file pattern searcher

## sudo 
super user doで覚えるといい。
>execute a command as another user

## ls
> list directory contents

## less
moreコマンドの逆。逆スクロールもできるmore型フィルタということで名付けられた。

>opposite of more

## diff
differenceで覚えるといい。
>compare files line by line

## rm
removeで覚えるといい。
>remove directory entries

## gcc
GNU Compiler Collectionで覚えるといい。

## sed
stream editorで覚えるといい。
>stream editor

## cd
change directoryで覚えるといい。

## cp
copyで覚えるといい。

## mv
moveで覚えるといい。
>move files

# 所感
初学者はコマンドの略称で機能を覚えるといいと思う。
私はcatとtouchの本当の機能を知れてよかった。

# Ref
以下の文献を参考にさせて頂きました。
[略語（UNIXコマンド）](http://sahirose.web.fc2.com/abb/unix.html)
[新版 UNIX由来/読み方辞書](http://x68000.q-e-d.net/~68user/unix/unix-term-dic.html)
[UNIXコマンド-コマンドの機能と使用方法-](http://www.k-tanaka.net/unix/)
ディレクトリ内の音楽ファイルを大雑把に指定して流す。

普段パソコンの音楽ファイルをBGMにして仕事をしているのですが、itunesなどのソフトを使うのはどうにもめんどくさい。

コマンドライン上から聞きたい歌手や曲を指定して、その指定に当てはまる曲を適当に流して欲しい時に使える関数です。

シェルの設定ファイルに書き込むことで、例えば***listen 倉*** とタイプするとファイル名に"倉"を含む曲が全て選択され、それらがランダムで流れます。（僕の場合は倉木麻衣さんの曲が抜き出されますね。）


```listen関数
function listen() {
#listen - 音楽ディレクトリに行き入力されたワードを含む曲をランダムで再生
  if [ $# -eq 0 ]
  then
    echo "Select the music."
    exit 1
  fi
#以下の/hoge/hogehogeを自分の音楽ディレクトリを指定
  cd /hoge/hogehoge
  ls |
#以下のmp3部分を書き換えるもしくは、複数マッチに足すことで別の拡張子のファイルも含められる
  grep mp3 |
  grep -i $1 |
  gsort -R |
  while read LINE
  do
    echo $LINE
    afplay -q 1 $LINE
  done
}
```

曲の種類やアーティストでディレクトリを分けている時にはfindコマンドで曲を持ってくるように書き換えればok。
RetrofitでJSONをPOSTする



## Server

＃sinatra

```ruby
post '/user', provides: :json do
  params = JSON.parse request.body.read
  puts params['name']
  puts params['age']
end
```

## Curl

```
$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"name":"hogehoge","age":"30"}' http://localhost:9292/user -w "\n%{http_code}\n"
```

## Java

＃Retrofit

```java
public interface ApiService {
    @Headers({
        "Accept: application/json",
        "Content-type: application/json"
    })
    @POST("/user")
    Observable<Void> createUser(@Body HashMap<String, String> body);
}
```

## おまけ

＃実装詳細

```java

// post
public static Observable<Void> postUser(String name, int age) {
    // create Retrofit
    Retrofit retrofit = new Retrofit.Builder()
        .client(new OkHttpClient.Builder().build())
        .baseUrl("http://localhost:9292")
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .build();

    return retrofit.createUser(createUserBody(name, age));
}

// create params
private static HashMap<String, String> createUserBody(String name, int age) {
    HashMap<String, String> hashMap = new HashMap<>();
    hashMap.put("name", name);
    hashMap.put("age", String.valueOf(age));
    return hashMap;
}

// API
public interface ApiService {
    @Headers({
        "Accept: application/json",
        "Content-type: application/json"
    })
    @POST("/user")
    Observable<Void> createUser(@Body HashMap<String, String> body);
}

```
【PowerShell】カレントフォルダのファイルの拡張子を小文字に変換

カレントフォルダのファイルの拡張子を小文字に変換するコード。

```ps1:素直な記述
Get-ChildItem -File |
  % { Rename-Item $_.Name ([regex]"\.\w+`$").Replace($_.Name, { $args[0].Value.ToLower() }) }
```

```ps1:簡略化を試みた記述
ls -File | ren -n { ([regex]"\.\w+$").Replace($_, { $args[0].Value.ToLower() }) }
```

* `ren`は`Rename-Item`コマンドレットの別名、`-n`は`-NewName`パラメータの簡略表現。
* 素直な記述だと`$_.Name`が二箇所に記述されてしまう。冗長な記述を避けるためにスクリプトブロックパラメータを使用。
* スクリプトブロックの戻り値がリネーム後のファイル名になる。
* キャプチャした文字列は`$args[0].Groups[n].Value`で取得する。今回は未使用。
* `ls -f`と書きたかったけど、パラメータ名`f`は曖昧だという指摘を受ける。やむをえずフルネームで記述。
* 簡略化を試みた記述で一番不安なのが、`Regex.Replace`メソッドの第一引数に`FileInfo`オブジェクトを渡しているところ。`FileInfo`オブジェクトを`String`型に変換するとファイル名になるけど、はたして別の環境でも同じように変換してくれるか。

[2016/06/01追記]

* パラメータにもエイリアスが存在している。PowerShellで`help ls -full`を実行することにより、`ls`コマンドのパラメータのエイリアスを知ることができる。`-File`パラメータのエイリアスは`-af`なので、簡略化を試みた記述は更に短くできる。

```ps1
ls -af | ren -n { ([regex]"\.\w+$").Replace($_, { $args[0].Value.ToLower() }) }
```
WordPressの調べたこと





## 拡張機能　プラグイン、データベース・開発

### 関数リファレンス

#### テーマ関数

#####  get template part

テンプレートパーツを（ヘッダー、サイドバー、フッターを除きます）をテンプレートへ読み込みます。これにより、テーマがコードのセクションを再利用すること、また子テーマが親テーマへのセクションを置き換えることが容易になります。

```.php
<?php get_template_part( $slug ); ?>
```

引用：<a href="https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_template_part" target="_blank">関数リファレンス/get template part - WordPress Codex 日本語版</a>