OmniAICreator/Qiita-1.07M huggingface dataset:
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 7日目(ランダムエンカウントロジック)

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 14日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。

今回はバトル画面の実装を一旦置き、ランダムエンカウントの判定ロジックを組みます。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#参考にしたサイト

[DQ1,2（SFC）エンカウント判定に関する解析結果](http://kri.client.jp/RTA/DQ1-2_encount.html#3)

こちらに書いてある内容をそのまま実装したいと思います。
ちなみにオリジナルのエンカウント判定計算式は知りません。
~~というかむしろこちらも知りたい~~

大人の事情ということでご了承ください。

#関数ライブラリを作成

エンカウント判定は関数ライブラリで実装したいと思います。
コンテンツブラウザ右クリックで下のブループリントから、「ブループリント関数ライブラリ」を選択します。
![ライブラリ.png](https://qiita-image-store.s3.amazonaws.com/0/104377/78bca525-b992-fb06-5501-47e6bf54586a.png)

#ランダムエンカウント処理を実装

早速関数ライブラリにランダムエンカウント処理を実装します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/3f36825d-fe7d-4408-7cac-ceac7efd4db2.png)

かなり長くなったため、一部グラフを折りたたんでいます。
stageIdと歩数を元に計算していきます。

まずエンカウント指数と歩数しきい値のArrayを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/1483030f-e5cd-5e8b-7e88-78147478e9b0.png)

作成が終了したら、ステージIDから、エンカウント指数としきい値をローカル変数にセットします。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/0a63a7f9-1061-26ea-454c-ad55ecff8462.png)

続いて単純歩数によるエンカウント指数の除算処理を行います。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/0fa12490-a008-8b78-d7f0-c8fe11d1d339.png)

現状では12歩まで指数に除算補正が入るということになります。

続いて地形タイプに応じた歩数によるエンカウント指数の乗算処理を行います。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/5863c682-5f27-0743-c649-eae2ab4073d9.png)

歩数としきい値を判定し、エンカウント指数に乗算処理による補正を行っています。
最後にエンカウント判定を行います。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/1a4ab839-5324-e9fd-0f55-2fc2aa6b0b94.png)
最大255のランダム値 < 補正済みのエンカウント指数がtrueの時、エンカウントをしたとみなします。

#関数ライブラリ呼び出し

最後にエンカウント処理を呼び出します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/5439e427-ab20-e560-5f22-cf31893da623.png)

このようにブループリントの関数検索で先ほど作った関数ライブラリが呼び出せるようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/104377/e131ac0e-ce83-337e-35c1-ea68e17c2270.png)

#ランダムエンカウントが出来た！

ランダムエンカウントができるようになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/104377/69563c67-d23b-3bf7-fd94-f2915f506eb9.png)

計算式は一つの参考例です。このままだと相性の問題でなかなかエンカウントしないため、あとで修正をかけます。
これでまた一つ、ゲームっぽくなりました！　先人たちは偉大です。

次はちゃんとバトル画面の実装に戻ります。
……つらくなったら気分転換にノベル画面の実装に入るかもしれません。
WPF DataGridの列に画像を表示

# 前提
基本的にはDataGridTemplateColumnを設定します。
今回はTwitterのタイムラインをDataGridにバインドする際、アイコンの列を追加したい、という想定で書きます。

Windowのプロパティにxmlnsとしてlocalが定義されて(`xmlns:local="clr-namespace:hogehoge"`等)いて、その名前空間にTweetクラスがあるとします。
Tweetクラスは単純にName(ユーザー名),Text(本文),IconUrl(アイコン)などを持っているものとします。

# 列を自動生成していない場合
AutoGenerateColumnsがFalseの場合です。

```XML
<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="1" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTemplateColumn Width="48" Header="アイコン" >
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate DataType="{x:Type local:Tweet}">
          <Image Source="{Binding IconUrl}"></Image>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

    <DataGridTextColumn ...その他の列... />
  </DataGrid.Columns>
</DataGrid>
```

DataGridTemplateColumnのCellTemplateプロパティに、DataTemplateを指定しています。

# 列を自動生成している場合
この方法が良いのかどうかイマイチ判断がつきませんが……
まず、WindowかどこかのResourcesに、DataGridTemplateColumnを定義します。

```xml
 <!-- <Window>の中 -->
 <Window.Resources>
        <DataGridTemplateColumn x:Key="IconTemplate">
            <DataGridTemplateColumn.Header>Icon</DataGridTemplateColumn.Header>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="{x:Type local:Tweet}">
                    <Image Source="{Binding IconUrl}"></Image>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </Window.Resources>
```

で、これを列が自動生成されるときに発生するAutoGeneratingColumnイベントのときに渡しましょう。
DataGridのAutoGeneratingColumnイベントを作成します。

```C#
private void dataGrid_AutoGeneratingColumn(object sender,DataGridAutoGeneratingColumnEventArgs e){
  if(e.PropertyName == "IconUrl")
    e.Column = (DataGridTemplateColumn)Resources["IconTemplate"];
}
```

# おわりに
いまいちまだWPFのコンポーネントの使い方を理解していないので、画像などを含むものをリスト的に表示するには何を使えばいいかわかっていません。
ここまでするならListViewとかにしたほうがいいんでしょうか…
Android Things 用の空のプロジェクトの作り方

# Android Thingsで空のプロジェクト作成の仕方

2016/12/14に突然、Android Thingsが発表されました。
偶然、手元に、Raspberry Pi 3があるので、早速、動かしてみました。
インストールの仕方は、きっと、どこかにあると信じているので、Android Things用のアプリを書く方法について説明したいと思います。
豪華なサンプルアプリより、最小のプロジェクトで動作を理解したいので、空のプロジェクトファイルを作ってみました。

## 環境
Android Studio 2.2.3
Raspberry Pi 3 (image androidthings_rpi3_devpreview_1.zip)

### 手順１：プロジェクトの作成
まずは、アプリケーションの名前を指定します
![161215-0001.png](https://qiita-image-store.s3.amazonaws.com/0/33220/14d6fa10-56cc-410c-6a3c-1d071dc60e96.png)

現時点(2016/12/15）では、Android Things用のはないので、スマホ/タブレットを選択して、Minimum SDKをAPI24:Android 7.0を選択します。
![161215-0002.png](https://qiita-image-store.s3.amazonaws.com/0/33220/b683d0eb-65b9-6ae7-56be-1b07a4f4b042.png)

空のActivityを選択します
![161215-0003.png](https://qiita-image-store.s3.amazonaws.com/0/33220/2bd39834-c90f-d863-6bac-93001d8a141b.png)

ここで、Layoutファイルや、AppCompactを取り込まないようにチェックボックスを外します
![161215-0004.png](https://qiita-image-store.s3.amazonaws.com/0/33220/6d70337b-ee9e-7816-1aa4-1fca9e650c1c.png)

これでプロジェクトが作成されました。
![161215-0005.png](https://qiita-image-store.s3.amazonaws.com/0/33220/36824447-8f2c-c63e-5723-9dcb5d575d5a.png)

### 手順２：build.gradeに追記

『provided 'com.google.android.things:androidthings:0.1-devpreview'』を追加しました。
![161215-0006.png](https://qiita-image-store.s3.amazonaws.com/0/33220/22a5483c-a2f1-04b5-468d-6c0e1bede8b2.png)

### 手順３：Android Manifest.xmlを書き換えます。

書き換え前
![161215-0007.png](https://qiita-image-store.s3.amazonaws.com/0/33220/74e6087d-3e08-5d0e-3f53-0cb8920198aa.png)

変更箇所
applicationタグで不要なパラメータを削除
uses-libraryタグの追加
intent-filterタグの内容を書き換え
ここでは、ブート時に起動するアプリであるという記述も入れてあるので、自動起動するの嫌な場合はその部分は外しましょう

書き換え後
![161215-0008.png](https://qiita-image-store.s3.amazonaws.com/0/33220/80a6ffe7-a940-d332-d274-e91689cfad00.png)

### 手順３： MainActivity.javaの書き換え
これで、何もしないAndroid Thingsアプリが出来ているのですが、折角なので、LogcatにGPIO一覧を出力してみましょう！

書き換え前
![161215-0009.png](https://qiita-image-store.s3.amazonaws.com/0/33220/01a16268-8d16-c9d7-f8dc-dd7bba989398.png)

GPIO一覧を取得するコードを追記します
PeripheralManagerService service = new PeripheralManagerService();
Log.d(TAG, "Available GPIO: " + service.getGpioList());

書き換え後
![161215-0010.png](https://qiita-image-store.s3.amazonaws.com/0/33220/69b279e7-2d11-069f-4446-f2e6e5a21a8e.png)

### 手順４：実行してみる
デバイスと、adb connect 済みであると、信じて、実行します。

すると、Raspberry pi 3で利用可能なGPIOピンの情報が出力されることが確認できました。

![161215-0011.png](https://qiita-image-store.s3.amazonaws.com/0/33220/f87cd36e-c438-86bf-2556-2bacb90e9f61.png)

以上、ご参考までに！
ExtJSのgridでstatefulが効かない

ExtJSのgridでは stateful を true にして stateId を設定するだけで
グリッドのサイズ、カラムの幅や順番・表示/非表示といった状態が
ブラウザに記憶されるようになり、とても便利です。

ところが今回、statefulになるように設定しても
なぜかgridの状態が記憶されない現象にはまってしまいました。

あれこれ悩んでたどり着いた原因は
cookieのサイズオーバー。

- 100列以上のカラム
- field名(dataIndex)が日本語

というgridだったのですがstateを表すvalueが7000byte超になっていました。
chromeの場合、1クッキーあたりの最大サイズが4096byteということで
これをオーバーしているため保存できず、stateが記憶されなくなっていたのでした。

errorもwarningも出ず、ステップ実行で追っても
chromeの内部コードに迷い込んで出て来れなくなる
という状態だったので原因になかなかたどり着けませんでした。。

原因が分かったので、対策としては

- stateのプロバイダーにCookieProviderではなくLocalStorageProviderを使うようにする
- CookieProviderで保存するcookieのサイズが大きい場合はwarningが出るようにする

を行いました。

```js:cookieのサイズが大きすぎる場合に、warningを出すようにするオーバーライド
Ext.define('MyApp.overrides.state.CookieProvider', {
    override: 'Ext.state.CookieProvider',

    setCookie: function(name, value) {
        var MAX_SIZE = 4096,
            me = this,
            cookie = me.prefix + name + "=" + me.encodeValue(value) + ((me.expires == null) ? "" : ("; expires=" + me.expires.toUTCString())) + ((me.path == null) ? "" : ("; path=" + me.path)) + ((me.domain == null) ? "" : ("; domain=" + me.domain)) + (me.secure ? "; secure" : ""),
            len = cookie.length;

        if (len > MAX_SIZE) {
            Ext.log({level: 'warn'},
                'Too large cookie(' + len + ' byte > ' + MAX_SIZE + ' byte). ' +
                'You might as well use LocalStorageProvider.');
        }

        document.cookie = cookie;
    }
});
```
Yosemiteでのcoreファイルの設定

macでcoreファイルの設定を確認するときに以前は/etc/hostconfigを確認すれば良かった様であるが、yosemite以降はこのhostconfigというファイルがそもそもないらしい。

manコマンドでcore(5)を見ると
"  Core dumps are disabled by default under Darwin/Mac OS X.  To re-enable
     core dumps, a privileged user must do one of the following

     * Edit /etc/launchd.conf or $HOME/.launchd.conf and add a line specifying
     the limit limit core unlimited

     * A privileged user can also enable cores with launchctl limit core
     unlimited

     * A privileged user can also enable core files by using ulimit(1) or
     limit(1) depending upon the shell. "
とあるのでやはりOSX以降はデフォルトでcoreファイルは生成されない模様。(まあそうですよね)

常時coreファイルを生成するようにするにはlaunchd.confを書き換えれば良いと思われるがこのファイルも元々はないファイルなので作らなければならないし、素人には危険なのでこの方法はやらない。

よってターミナルでulimit -c unlimited を実行すれば良い。

**注意:coreファイルの生成は自己責任で。終わったら消しましょう。**
Ubuntuでのcore dumpの生成

Ubuntu 16.04(VirtualBox)でcore dumpを発生させる際、
`ulimit -c unlimited` だけではcoreファイルを生成出来なかったのでメモ。

aportでエラーが起きているらしく、
`echo core > /proc/sys/kernel/core_pattern`
を実行する。

またUbuntuでechoやsudoを実行しようとすると許可がありませんと言われるので、`sudo -i`でrootシェルにして実行する。
Heroku Redis Command


公式ドキュメントの内容が大分古くなっており、redisの操作はプラグイン不要でherokuコマンドに統合されている。
https://devcenter.heroku.com/articles/heroku-redis

````
$ heroku redis --help
Usage: heroku redis:info [DATABASE]

gets information about redis

 -a, --app APP       # app to run command against
 -r, --remote REMOTE # git remote of app to run command against

Additional commands, type "heroku help COMMAND" for more details:

  redis:cli [DATABASE]          #  opens a redis prompt
  redis:credentials [DATABASE]  #  display credentials information
  redis:info [DATABASE]         #  gets information about redis
  redis:maintenance [DATABASE]  #  manage maintenance windows
  redis:maxmemory [DATABASE]    #  set the key eviction policy
  redis:promote DATABASE        #  sets DATABASE as your REDIS_URL
  redis:timeout [DATABASE]      #  set the number of seconds to wait before killing idle connections
  redis:wait [DATABASE]         #  wait for Redis instance to be available

````

## よく使う機能など 

### 認証情報の確認

認証情報を確認する。公式のダッシュボードのデザイン修正でCredeintialが確認できなくなったので重宝する。

````
$ heroku redis:credential
````

### CLIでの接続

CLIからREDISへの接続を行う際に

````
$ heroku redis:cli
````

### メンテナンス関連の機能

````
$ heroku redis:maintenance --help
Usage: heroku redis:maintenance [DATABASE]

manage maintenance windows

 -a, --app APP       # app to run command against
 -f, --force         # start maintenance without entering application maintenance mode
 -r, --remote REMOTE # git remote of app to run command against
 -w, --window WINDOW # set weekly UTC maintenance window
 --run               # start maintenance

Set or change the maintenance window for your Redis instance
````

メンテナンス関連機能。 `-f`オプションや`--run`オプションでメンテナンス手動実行可能

メンテナンス時間をいじりたいときには `-w` オプションで。
NSUserScriptTask経由のJXAはdoShellScriptを実行できない

## 概要

サンドボックス下のアプリから`NSUserScriptTask`を用いてスクリプトを実行するとき、記述言語がJXAである場合に限り、`doShellScript`や`runScript`といった、外部プロセスを起動する命令を実行するとエラーが発生する。

CotEditorのユーザースクリプトなどがこのような環境に該当する。

## コード

```swift:ViewController.swift
import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let scriptsPath = try! FileManager.default.url(for: .applicationScriptsDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        
        let jxaTask = try! NSUserAppleScriptTask(url: scriptsPath.appendingPathComponent("doshellscript_jxa.scpt"))
        
        jxaTask.execute(withAppleEvent: nil) { (result, error) in
            print(error!.localizedDescription)
        }
    }  
}
```

```js:doshellscript.scpt
var app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript('ls')
```

## 結果

```
execution error: Error on line 3: Error: A privilege violation occurred. (-10004)
```

## ワークアラウンド

外部プロセス呼び出しをAppleScriptで記述し、`Library`関数で呼び出す。

```js:main.scpt
var ExternalProcess = Library('ExternalProcess')
ExternalProcess.doShellScript('ls')
```

```applescript:ExternalProcess.scpt
on doShellScript(theCommand)
    do shell script theCommand
end doShellScript
```
[C++Builder]CodeSite設定のメモ

C++BuilderにはCodeSiteというデバッグのシステムが使えます。
最近のC++BuilderにはGetItパッケージマネージャというやつでCodeSite(Expressであれば)インストールしたほうが楽なようです。
（ただし、インストール時にウィルス対策ソフトの監視機能が入っていると、ウィルス扱いで失敗することがあります。）
![スクリーンショット-2016-12-15-15.27.54.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/ebaf04d3-aa9a-c2c7-f07a-2e40b03893f4.jpeg)

CodeSiteを使うヘッダーファイルに下記を記載。（マクロで32bitと64bitの動作分け）
(環境により適宜変更)

```C++:test.h
#include "CodeSiteLogging.hpp"
#if defined(_WIN32) && !defined(_WIN64)
// 32bitでExpress版
#pragma comment(lib,"CodeSiteExpressPkg.lib")
// 32bitでStudio版(有償版)
// #pragma comment(lib,"CodeSiteLoggingPkg.lib")
#endif
#if !defined(_WIN32) && defined(_WIN64)
// 64bitでExpress版
#pragam comment(lib,"CodeSiteExpressPkg.a")
// 64bitでStudio版
// #pragma comment(lib,"CodeSiteLoggingPkg.a")
#endif
#pragma link "CodeSiteLogging"
```

例えばログ表示

```C++:test.cpp
CodeSite->Send("test");
```
![スクリーンショット 2016-12-15 15.41.58.png](https://qiita-image-store.s3.amazonaws.com/0/76058/09201e55-9deb-0b23-19eb-26fd4abd926a.png)

> 参考 :: CodeSiteLogging.hppが見つかりませんと出たら
> http://qiita.com/mm_sys/items/68fc06166a005aa811ce
Windowsグループポリシーの嘘:Powershellで操作できるって

大分前から、グループポリシーの設定を自動化する需要がありました。やっと、Windows 2012 R2の時代、PowershellからAD上のGPO(グループポリシーオブジェクト)を操作できると歌われました。ただし、実際は落とし穴があります。

- 落し穴１：Powershell中のグループポリシーモジュールは、ADと組んでいますので、ローカルのグループポリシーを設定するには利用できません。（興味あればMicrosoft.GroupPolicy.Management関連のdllをdotPeekでソースを参照すれば分かります）.

   ちなみに、ローカルグループポリシー中のレジストリ設定を変更するには、MSも高層APIを提供していないので、[これ](https://github.com/sjitech/powershell-local-group-policy-reg)を利用すればOK。

- 落し穴２：Powershell中のグループポリシーモジュールは、AD上のグループポリシーの中身を自由に変更できません（レジストリベースの設定しか設定できません）。

特に、アプリ配信のポリシーの中身は外部XMLに保存されているし、その中にはさらにバイナリ設定データが入っていますので、Powershellのグループポリシーモジュールは、これらの設定には全然無力です、これらの設定を変更するには、グループポリシーエディターが利用している該当グループポリシー拡張COM DLL(typelibなし)を無理やり利用するしか方法ない。

他に、ファイル設定、タスク設定、サービス設定、AppLocker、SRPなどはバイナリなしのXMLに保存されている、同様に、Powershellのグループポリシーモジュールは設定できないが、PowershellでXMLファイルを直接いじることができますので、なんとなく対応できますね。

とりあえず、上記2点。

Windows 10から、MSはMDM(モバイルデバイス管理)機能を内蔵実装しました、機能的には、グループポリシーの機能と重ねているところが多いです。どうやら、単純にMDMの目的であれば、グループポリシーをやめて内蔵MDMに移行する傾向が見えています。
いまさらながら Apache HTTP Server についてまとめてみた

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> 特徴

Apache は非常に高機能だが、高機能故に、一般的に重いとされている。C10K が問題になってきた現状、代替を求める声が大きくなってきた。

## <i class="fa fa-check-square-o" style="font-size:1em;"></i> チューニング

設定項目は多くあるが、実際に触るべきところは多くない。実際に動かしてみて、その都度ボトルネックを解消するために設定を変えていく方がいい。

### <i class="fa fa-list" style="font-size:1em;"></i> 注意したい項目

- `HostnameLookups off`
  - off になっていることを確認
  - on 担っていると、ログファイルにホスト名を出力するために DNSLookup を行ってしまう
- 無駄なログを出さない
  - ログのローテートを行い、ログファイルの容量が大きくならないように設定
  - 設定でログフォーマットを適切に設定
- 無駄なモジュールをロードしない
  - あまり効果はないという報告もある
  - なにがロードされているかは把握する必要あり
- .htaccess を無効にする
  - リクエストのたびに存在チェックと読み込みを行うため、パフォーマンスが劣化
  - 使用しないなら無効にする
  - パフォーマンスを優先したい場合は AllowOverride None を指定
- KeepAlive
  - HTTP はステートレスなプロトコルのため、リクエスト毎に TCP の接続、切断が発生する。
  - 一度接続が合った場合に、一定時間接続を維持する仕組みが KeepAlive
  - ロードバランサーを使っている場合、効果的に使われない可能性がある
- mod_deflate
  - コンテンツを圧縮して転送するモジュール
  - CPU リソースを消費するが、転送速度を向上することが可能

### <i class="fa fa-thumb-tack" style="font-size:1em;"></i> まとめると

**無駄なことをしない**、ということに念頭をおいて設定を行う。

## MPM(Multi Processing Module)

### <i class="fa fa-list" style="font-size:1em;"></i> MPM の種類

- prefork
  - エンドユーザのリクエストと子プロセスが 1:1 に対応して処理される
  - 安定性が高い
- worker
  - エンドユーザのリクエストは子プロセスの中のスレッドが 1:1 に対応して処理
  - あるスレッドが不安定になると他も引きずられる
- event
  - worker の改良版
  - 1 スレッドがリクエストを受け付け、Keep-Alive の処理を別スレッドに任せる

### <i class="fa fa-sliders" style="font-size:1em;"></i> prefork のチューニング

- StartServers
  - Apache 起動時の子プロセス数
  - 起動時に大量アクセスが発生するようなら引き上げる
- MinSpareServers, MaxSpareServers
  - 待機プロセスの調整範囲
  - 高すぎるとサーバプロセスを消費するため、様子を見ながら徐々に上げる
- ServerLimit, MaxClients(MaxRequestWorkers)
  - 同時アクセス数
  - MaxClients を上げる場合は ServerLimit も一緒に上げる
  - `Apache 割当メモリ / 子プロセス消費メモリ` が目安
- MaxRequestsPerChild(MaxConnectionsPerChild)
  - プロセスの再利用回数
  - 再利用するのはメモリリークなどがあった場合に安定的に動作させるための設定
  - 静的コンテンツのみの場合はプロセスを立ち上げ直す必要が無いため 0 にする

### <i class="fa fa-sliders" style="font-size:1em;"></i> worker/event のチューニング

- StartServers
  - Apache 起動時の子プロセス数
  - あまりいじる必要なし
- MinSpareThreads, MaxSpareThreads
  - 待機スレッドの調整範囲
  - あまりいじる必要なし
- ThreadLimit
  - ThreadPerChild に設定できる値の上限
- ThreadPerChild
  - 子プロセス毎に生成されるスレッド数
- ServerLimit, MaxClients(MaxRequestWorkers)
  - 同時アクセス数(MaxClients)
  - `MaxClients / ThreadPerChild ≦ ServerLimit` となるようにする

### <i class="fa fa-thumb-tack" style="font-size:1em;"></i> Tips

Apache の設定項目での `Server` という表記は、プロセスを表していると思われる。そのため、ServerLimit はプロセス数の最大数だと考えられる。
Python3.5 でNumbaをインストールして使ってみた

# 環境
Ubuntu 16.04

# インストール方法
[これ](http://stackoverflow.com/questions/28782512/getting-python-numba-working-on-ubuntu-14-10-or-fedora-21-with-python-2-7)を参考にしてインストールした

```bash
# llvmをインストール(入れるとバージョンが3.8だった)
$ sudo apt-get install llvm #他のパッケージは元から入っていた
$ sudo pip3 install enum34 funcsigs
$ sudo LLVM_CONFIG=/usr/bin/llvm-config-3.8 pip3 install llvmlite
$ sudo LLVM_CONFIG=/usr/bin/llvm-config-3.8 pip3 install numba
```

# 実行
時間の計測にtimeで良いのかは不明だけど、ざっくりと知りたいだけなのであまり気にしていない。

```python
import time
import numpy as np
import numba

@numba.jit
def rando(a):
    for i in range(N):
        for j in range(N):
            a[i][j] = np.random.rand()
    return a

start = time.time()
N = 100
a = np.zeros((N, N))
for i in range(1000):
    a = rando(a)

end = time.time()

print(end - start)
```

@numba.jitの部分をコメントアウトすると、時間が比較できる。
コメントアウトしなかった場合1.46s, コメントアウトした場合26.68sとなり**20倍以上速くなった**。
一方でループの回数を1000回から1回に変更するとコメントアウトしなかった時0.025s、コメントアウトしたとき0.541sとなり、numbaを使わなかった方が速くなった。一番最初にコンパイルするのに時間がやはりかかっている。

一枚目の画像がループ回数が0付近のときの画像で、二枚目が全体的な経過時間の画像
縦軸が時間(秒)で、横軸がループ回数、緑色がnumbaなしで青色がnumbaあり。
![around1.png](https://qiita-image-store.s3.amazonaws.com/0/145171/05e96258-8968-9b82-7c52-12abfd0b78d8.png)
![global.png](https://qiita-image-store.s3.amazonaws.com/0/145171/44bd351d-da0d-dddc-f667-26e62cb27cca.png)
rootがなくてもsshfsを使えばLinux上のファイルをWindowsからアクセスできるよ（踏み台がいるけど）

タイトルで全てなのですが、私みたいなWindows大好きな人は、いついかなる時でもLinux上のファイルにWindowsからアクセスしたいものです（主にGUIによる快適なファイル編集環境のため）。

しかし、sshでログインできる先がいつでもSAMBAなどを設定できるとは限りません。もしかするとsudoすらないことも多いです。
そんな場合には、sshfsで解決しているのですが、いつもやり方を忘れてイチから調べなおしたりするのがいい加減に面倒だったのでメモがてら書いておきます。

構成としては

```
<手元のWindows機> --- <踏み台Linux機> --- <接続先のLinux機>
```

という感じです。

0. まず、踏み台にするLinux機を用意します。仮想環境でも良いかと思いますが、私はいつもsshログインする時に踏み台にする実機があるのでそこを使っています。重要なのは、踏み台Linux機はsudo権限を持っていて好きに設定できるようにすることです。
1. 手元のWindows機から、踏み台Linux機へSAMBAを設定して、踏み台Linux機のフォルダを手元のWindowsからアクセスできる状態にします。
1. 踏み台Linux機から接続先のLinux機へsshでログインできる状態にします。
2. 踏み台Linux機から接続先のLinux機へsshfsを使ってマウントします。このコマンドいっつも忘れるのですが、``sshfs -o allow_other,follow_symlinks,idmap=user <username>@<server>:<server_dir> <my_dir>``です。``/etc/fuse.conf``で ``user_allow_other``を追加するの忘れないように。
3. そうすると、手元のWindows機から踏み台経由で接続先のLinux機のフォルダを読み書きできるようになります。

状態としては以下のようになってますね。

```
<手元のWindows機> --[samba]-- <踏み台Linux機> --[sshfs]-- <接続先のLinux機>
```

ほんとはbash on windowsがsshfsをサポートしていれば踏み台を用意する必要はないんですが・・・仕方ない。
あと、winsshfsみたいなのもあったのですが、うまく動きませんでした。

## アンマウント
何かの拍子にssfhsがつながらなくなったり変なことになった時にアンマウントするには

```
$ fusermount -u <my_dir>
```

## /etc/fuse.confが開けない
Ubuntuとかを踏み台にすると

```
fusermount – failed to open /etc/fuse.conf – Permission denied
```

みたいなエラーが起きることがあるが、この場合は、

```
$ sudo gpasswd -u <username> fuse
```

とfuseグループに追加しないといけない。
(メモ) node.jsのtwilioをproxy環境下で使う場合

## このメモについて

node.jsでtwilioをつかって電話を掛けようとしたところ、
HTTP接続にproxy設定が必要な環境下で少々はまったので
解決策のメモです。

## 発生するエラー

こんなエラーが出ます

```js
{ status: 'ECONNRESET',
  message: 'Unable to reach host: "api.twilio.com"' }
```

## 対策

node_modules/twilio/lib/Client.js の 108行目に 次の一行を追加

```js:Client.js
Client.prototype.request = function (options, callback) {
    ...
    options.timeout = client.timeout;
    options.proxy = 'http://プロキシのアドレス:プロキシのポート番号'; ★ これ

    // Manually create POST body if there's a form object. Sadly, request
    ...
};
```

もっとスマートなやり方がありそうだけど
とりあえずの対処ということで。
IBM Watsonを使ってみる準備をしてみた


IBM Watsonに前々から興味はあったけど、色々全然わからんので調べてみたまとめ。
「わからん」の理由はいろいろあるんだけど、その一つとして「結局今何が出来るのか」がよくわからん気がする。
ということで、この文書もあっという間に陳腐化するだろうけどひとまず2016年12月中旬時点のまとめ。

# そもそもWatsonの位置づけ
WatsonはBluemixというPaaSを構成するパーツの一つ。
じゃぁ他に何があるの？というとこれまたよくわからんのだけど、かつてSoftLayerだったIaaSは含まれているみたい。

# ともあれ使ってみる準備
…とか概要っぽいことだけ調べててもよーわからんのでまずは使ってみるための準備をする。

## Bluemixのアカウントを準備する
上記の通り、WatsonはBluemixの一部なので、Bluemixのアカウントを準備する必要がある…と思う。
ので、http://www.ibm.com/developerworks/jp/bluemix/ にアクセスして、下記画面の「今すぐBluemixのフリートライアルを開始する！」から始める。最後の「！」に気合を感じるなぁ。

![Kobito.Qpp6jQ.png](https://qiita-image-store.s3.amazonaws.com/0/35808/e18038f2-1ee1-a918-fd58-67f6757a7d96.png "Kobito.Qpp6jQ.png")


遷移先の画面では、

- メールアドレス
- 姓
- 名
- パスワードとその確認
- 居住地(…かな？)
- 秘密の質問とその確認

を入力したらとりあえず登録できたっぽい。で、登録したメールアドレス宛に確認用のメールが飛んできているはずなので「Confirm Account」のボタンをクリックすると登録完了。多分。

## Bluemixにサインイン〜トライアル用の環境を作ってみる

あらためて http://www.ibm.com/developerworks/jp/bluemix/ にアクセスしてサインイン、それから「フリートライアルを開始する！」を改めて押下。


![Kobito.rUS88V.png](https://qiita-image-store.s3.amazonaws.com/0/35808/a9bac9a4-5d90-bcd4-2427-42ca2d63e3fe.png "Kobito.rUS88V.png")


こんな画面になる。サインインした状態から入ったにも関わらず、「ログイン」「フリーアカウントの作成」があってプチ混乱。「さあ始めましょう」って言ってるんだからこっちかな。ということで、右側中央部の「ログイン」から進んでみる。


特に追加の認証情報を入力することはなく、こんな画面に遷移。
![Kobito.ohLJfs.png](https://qiita-image-store.s3.amazonaws.com/0/35808/2d9a724b-2b33-180d-53b5-f1bb1a2cebd8.png "Kobito.ohLJfs.png")

「組織に名前」ねぇ…。むぅ。何するか考えてからトライアルにのぞめばよかったｗ
とりあえず「仮の組織」にしてみた。

次に、スペースにも名前が必要らしい。組織名に日本語が使えたのでこっちも「仮のスペース」にしてみよう。


![Kobito.8lAU2b.png](https://qiita-image-store.s3.amazonaws.com/0/35808/8e10b095-b595-15f5-8e99-bb25d5889cc9.png "Kobito.8lAU2b.png")


どうやら準備はここまでらしく、「準備ができました」ボタンが表示されたのでこれを押下して進んでみる。

## Watsonのメニューにたどり着く

![Kobito.ZKwUlP.png](https://qiita-image-store.s3.amazonaws.com/0/35808/9c1b40ad-d011-9ab9-3685-18785c7f742f.png "Kobito.ZKwUlP.png")


むーん。この広大な画面。何をしたらいいのか全くみえないｗ

左上にハンバーガー的なメニューが有ることに気づいてつついてみたら、「サービス」があった。これかもしれない。


![Kobito.AdlbZp.png](https://qiita-image-store.s3.amazonaws.com/0/35808/3d3da9ab-9847-f66f-6470-07fb430f9675.png "Kobito.AdlbZp.png")


おお！ようやくWatsonの文字がみえたので早速つついてみる。


![Kobito.YkzWyH.png](https://qiita-image-store.s3.amazonaws.com/0/35808/22f201e2-2fc8-f515-ec85-397928a89250.png "Kobito.YkzWyH.png")


ふむふむ。唯一の選択肢である「Watsonサービスの作成」をつついてみる。


![Kobito.mZlOEP.png](https://qiita-image-store.s3.amazonaws.com/0/35808/af1dfafe-8177-636a-d290-50d0a831c47b.png "Kobito.mZlOEP.png")


これこれ！この画面に来たかったのだよ。ぜぇぜぇ。
次はこのたくさんあるメニューから、手軽そうなのを触ってみることにする。
SceneKitでビルボードを使用する (iOS、WatchOS3)

SceneKitでビルボードを使用する場合
板ポリゴンを常にカメラに向けたい場合がある。

主に
・簡易的なパーティクルを表示させたい
・テキストをキャラの上に表示させて常にカメラの向きにテキストを向けさせたい

これらの用途をすぐに思い浮かぶことができます。
SceneKitの情報特にビルボードの情報がほぼ見当たらなかったので
情報を公開します。

```objc:xxxxxx.m
//板ポリの作成
SCNPlane *plane = [SCNPlane planeWithWidth:6 height:6];
plane.firstMaterial.diffuse.contents = [UIColor redColor];
SCNNode *planeNode = [SCNNode node];
planeNode.geometry = plane;
planeNode.position = SCNVector3Make(0, 4, 0);
[scene.rootNode addChildNode:planeNode];

//ビルボードの設定    
SCNBillboardConstraint *billboard = [SCNBillboardConstraint billboardConstraint];
planeNode.constraints = @[billboard];
```

余談：
SCNLookAtConstraint　というのもある。
これは、あるノードに向きを向けるものでビルボードとは異なるので注意

```objc:xxxxxx.m
SCNLookAtConstraint *constraint = [SCNLookAtConstraint lookAtConstraintWithTarget:＊　向きを向けたいSCNNode　＊];
SCNBillboardConstraint *billboard = [SCNBillboardConstraint billboardConstraint];
planeNode.constraints = @[constraint /*,billboard*/];
```
GitHub: リポジトリ共有 or fork?

## はじめに
githubのコラボレーションには、

- チームメンバーでプロジェクトリポジトリを共有する
- 個々の開発者がプロジェクトリポジトリをforkする

の２つの方法があると思います。
OSSプロジェクトのような見知らぬ人とコラボレーションするプロジェクトの場合はfork一択ですが、社内で使うときや外注先との共同作業などのときはどうするのが良いのでしょうか？

## リポジトリ共有の場合
- プロジェクトリポジトリ内にブランチが作られるので、マージ済みのブランチは定期的に削除するなどしないと、リポジトリのサイズが肥大する。
- 権限の管理ができない。基本的にプロジェクトリポジトリ内のすべてのブランチの権限がチームメンバーに与えられる。protected branchesに設定することもできるが、個々のブランチごとに設定する必要がある。protected branchesに設定すると、プルリクエストによる承認を必須にしたり、force pushなどのリスキーな変更を制限したりできる。
- 作業した変更を取り込むのに、プルリクエストを出さずにマージコマンドでマージできる。プルリクエストを使わない開発フローを好む人もいる。
- 他のチームメンバーと、ブランチ名の衝突の可能性がある。
- 他の開発者が何をやっているかわかりやすい。
- forkする方法に比べてチームに一体感が出る（と思う）。

## forkする場合
- 作業した変更を取り込むのに、プルリクエストが必須。個々の開発者のforkリポジトリをremoteに設定してマージもできるが、やる人はあまりいないでしょう。
- プロジェクトリポジトリの更新を取り込むには、プロジェクトリポジトリをupstreamに設定して、upstreamからプロジェクトリポジトリの変更を取り込む必要がある。gitに慣れていないチームメンバーがいると、ネックになる場合も。https://help.github.com/articles/syncing-a-fork/
- forkの数が増えると、社内の人だとわかっていてもなんとなくうれしい。
- 開発者個人のアカウントにリポジトリが作成されので、自分の参加しているプロジェクトが把握しやすい。
- プルリクエストをマージする人以外、他の開発者が何をやっているかわかりづらい。

## おわりに
こういうふうにそれぞれの特徴を挙げていくと、
**リポジトリ共有では、他の開発者が何をしているかわかりやすい**
と
**forkでは、プロジェクトリポジトリの完全なコントロールができる**
が重要なポイントで、どちらをより優先したいかプロジェクトごとに検討が必要だと思いました。他のポイントは、上の２つに比べると副次的な感じがしています。当たり前の結論になってしまいましたが、ポイントが整理できたので良かった、、のかな？
Vagrant+Dockerでラズパイの仮想環境作ってHomebridge走らせようとして失敗した話

# はじめに
これは**失敗した話**なので読んで役に立つかどうかはわかりませんし保証もできません。が、一応Raspbian Jessieを走らせるところまでは動きました。

# 経緯
Homebridgeの開発環境をどうやって作るのがいいのか試行錯誤していたのですが、SDカードのあまりが手元になく、仮想環境でやったらいいんじゃないの？と思いやり始める。

# 前提
VagrantもDockerもあんまりなにかわかっていなかった。というかあんまりわかってない。触りながら少し勉強しました。

# やりたいこと
- Raspberrypiをmac上でエミュレートしたい
- 開発環境の構築をできるかテストしたい

# 方法
最初はdocker-machineで直接Raspbian立てられないかな？と思っていたのですが、なんか`docker run -ti resin/rpi-raspbian bash`をmacのterminal上で実行したのですがエラーがでたので[検索したら出てきたここ](http://stackoverflow.com/questions/33970083/docker-build-rpi-image-on-mac)を参考にしました。

dockerのイメージは[resin/rpi-raspbian](https://hub.docker.com/r/resin/rpi-raspbian/)にしました

1. Vagrant
    2. インストール `brew install vagrant`
    3. vagrantのファイル入れるフォルダ作る `mkdir raspbian-docker; cd raspbian-docker`
    4. raspbianは今jessieが新しいので、debian/jessieの仮想環境をvagrantで作成 `vagrant init debian/jessie64`
    5. 仮想環境を立ち上げる `vagrant up`
    6. 仮想環境にssh接続する `vagrant ssh`
2. Docker
    3. 仮想環境でdockerを使う
    4. QEMUを入れる`sudo apt-get install qemu-user-static`
    5. Dockerを仮想空間にインストール `sudo curl https://get.docker.com/ | sh`
    6. Dockerをvagrant上で走らせる`docker run -ti --volume /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static resin/rpi-raspbian bash`

# できたこと
Raspbianのインストール自体は上手くいったようで、無事に動いているように見えます。

# つまづいているところ
homebridge関連の開発をやりたかったので諸々をインストール([Homebridgeのインストールのやり方](https://github.com/nfarina/homebridge/wiki/Running-HomeBridge-on-a-Raspberry-Pi)を参考にしました)し
`$ homebridge`
ではしらせたところ

```
/usr/local/lib/node_modules/hap-nodejs/node_modules/mdns/lib/advertisement.js:56
  dns_sd.DNSServiceRegister(self.serviceRef, flags, ifaceIdx, name,
         ^

Error: dns service error: unknown
    at Error (native)
    at new Advertisement (/usr/local/lib/node_modules/hap-nodejs/node_modules/mdns/lib/advertisement.js:56:10)
    at Object.create [as createAdvertisement] (/usr/local/lib/node_modules/hap-nodejs/node_modules/mdns/lib/advertisement.js:64:10)
    at Advertiser.startAdvertising (/usr/local/lib/node_modules/hap-nodejs/lib/Advertiser.js:43:30)
    at Bridge.Accessory._onListening (/usr/local/lib/node_modules/hap-nodejs/lib/Accessory.js:539:20)
    at emitOne (events.js:77:13)
    at HAPServer.emit (events.js:169:7)
    at HAPServer._onListening (/usr/local/lib/node_modules/hap-nodejs/lib/HAPServer.js:190:8)
    at emitOne (events.js:77:13)
    at EventedHTTPServer.emit (events.js:169:7)
```

のエラーで落ちてしまい、ググったりなんだりしたけど解決せず諦めたところです。

## 一応Homebridgeのインストール
```
apt-get update
apt-get install git make
apt-get install wget
apt-get install python
apt-get install build-essential g++
wget https://nodejs.org/dist/v4.3.2/node-v4.3.2-linux-armv6l.tar.gz 
tar -xvf node-v4.3.2-linux-armv6l.tar.gz 
cd node-v4.3.2-linux-armv6l
sudo cp -R * /usr/local/
node -v
npm -v
apt-get install libavahi-compat-libdnssd-dev
npm config get unsafe-perm
npm config set unsafe-perm true
npm install -g --unsafe-perm homebridge hap-nodejs node-gyp
exit
sudo docker restart [dockername]
```


# 次にやろうかなあと思うこと
しらべていたら、vagrantでlinux立ててからでなくてもmacに直接QEMUでraspbianの仮想環境を置く方法もあるようなので、参考にしてやってみようかなあと思っています。
http://qiita.com/keita1987/items/f943b380a02e5ad67274
今更、トンネル、ポートフォーワードツールをNode.jsで作成

大昔からポートフォーワード、リバース関連のツールはたくさんありました：
ssh, nc, socat, redir...。(tcp tunnel port forwardでgoogle画像を見れば分かる)。

ただし、Windows上は、上記のようなツールを利用しようとすると、幾つか現実問題に遭遇します：

- インストーラや実行ファイルは、署名されていないので、信頼できません。
- 企業のセキュリティポリシーに利用が制限されます。
- 自分でソースからコンパイルするのは面倒。
- 極簡単なニーズなのに、sshのような複雑なツールに苦労しなければなりません。
- socatなどは接続情報不明瞭。
- socatなどのポートフォーワードは効率良くない(forkを利用するので）。

一方、Windows上は、IPHelperサービスにより提供しているportproxy機能はあります（netsh portproxyコマンドでポートフォーワードを設定できます）。ただし、パフォーマンスが良くないし、変なエラーが出てます（接続は切られたり）。これはおそらく、HalfOpen関連の処理に不十分です。

Node.jsの世界にもこのへんのツールは少しありますが、期待通りのシンプルではありません。

いいや、納得できません。やはり、作りましょう。

- [tunnel.js](https://github.com/sjitech/tunnel.js)
  これはsshトンネルの超簡潔版です：TCPポートのフォーワードやリバース over TCPトンネル。設定なし、パスワードなし！ adb forwardやreverseの感じです。
  
　利用例：`tunnel-listen.js 8888`でTCPトンネルサーバを起動し、`tunnel-connect.js トンネルサーバ:8888 forward 8080 宛先:80`で現在マシンの8080をトンネルサーバ経由宛先:80へフォーワードする。逆に、`tunnel-connect.js トンネルサーバ:8888 reverse 8080 宛先:80`はトンネルサーバ上の8080を現在マシン経由www.yahoo.co.jp:80へフォーワードする。

- [forward.js](https://github.com/sjitech/forward.js)
  これは単純なポートフォーワドです。パフォーマンスはいい。それに、ENTERキーで中継情報(接続や、データ）は見れます。もう一つ特長は、フォーワード先のソケットサーバはAllowHalfOpenである場合でも対応しています。

ちなみに、ncの超簡潔版[nc.js](https://github.com/sjitech/nc.js)も作りました。既存のncのサーバモードのコマンドラインの不統一、入力を複数クライアントに送信できないなど、接続情報不明など問題を解消しました。
Moduleについて

いつもmoduleの動きぐぐってるのでメモ

## Moduleとは
- classとほぼ同じ。classとの違いはインスタンス生成できないところ。

## 動作確認
インスタンスメソッドをmoduleに定義。classでincludeして使う。

```rb

# Moduleをincludeしたときに、特異クラスが自動生成されメソッドが定義されることの確認
module InsModule
  def instance_method
    p 'instance_method'
  end
end

class MyClass
  include InsModule
end

# moduleのメソッド呼べる
b = MyClass.new
b.instance_method
# => "instance_method"

# 特異クラスにinstance_method定義されていると思ったけど、されてない？？謎
p MyClass.singleton_class.instance_methods(false)
# => []
```

クラスメソッド風をmoduleに定義。classでincludeして使う。

```rb

# moduleに特異メソッドを定義すると、includeしたクラスからクラスメソッド風に呼べることの確認
module ClsModule
  # self.includedはincludeした時に呼ばれる
  def self.included(base)
  # extendは、baseオブジェクトの特異クラスにモジュールを取り込み、モジュールのメソッドを特異メソッドとして使えるようにする
    base.extend(ClassMethods)
  end
# ↑ここはextend ActiveSupport::Concernで書き換えるのが主流っぽい

  module ClassMethods
    def class_method
      p 'class_method'
    end
  end
end

class MyClass
  include ClsModule
end

MyClass.class_method
# => class_method
```
iOSのネイティブでユーザ名とパスワードを入力し、認証を行った後、そのセッションを維持したままWebViewへ飛ばす方法


iOSアプリを作っているときに、認証情報を次のWebViewへ持たせるときに詰まったので、その対処法を書きます。

認証を行った段階で、サーバから返答されるCookieを保存し、WebViewに渡します。

通信にはAlamofireを使っています

```ログイン
Alamofire.request("<url>",parameters: params)
	.responseString { response in
	let cookies = HTTPCookie.cookies(withResponseHeaderFields: response.response?.allHeaderFields as! [String : String], for: (response.response?.url!)!)

	for i in 0 ..< cookies.count {
		let cookie = cookies[i]
		HTTPCookieStorage.shared.setCookie(cookie)
	}	

}
```

```WebView

let authUrl = URL(string: "認証URL")
let url = URL(string: "ロードしたいURL")

var request = URLRequest(url: url)
let cookies = HTTPCookieStorage.shared.cookies(for: authUrl! as URL)
let header = HTTPCookie.requestHeaderFields(with: cookies!)
// Cookieをセットする
request.allHTTPHeaderFields = header
// webViewをロードする
webView.loadRequest(request as URLRequest)
```
Laravelで安全にwhereRawを使う


DBに入ってる電話番号はハイフンつきだけど、ハイフンなしで検索したいとき、SQL文はこんな感じだと思う。

```sql
select * from users where replace(telephone_number, '-', '') = '08000000000';

```

これをLaravelのORMでやろうとするとこんな感じ。
第二引数でバインドするのがポイント

```php
 whereRaw('replace(telephone_number, "-", "") = :telephone_number', ['telephone_number' => $telephone_number]);
```
Pug(Jade)の基本記法について

Pug(jade)は独特の記法なので、最初ちょっと覚えるの大変ですよね。
これだけ覚えれば、普通のHTML書くのに困らない、
基本のコードをpickupしてまとめました。

## はじめの一歩
- <>不要、閉じタグ不要
- タグの後ろにスペースをいれてタグ内テキスト

▼Pug(Jade)

```pug
p ほげほげ
```

▽HTML

```html
<P>ほげほげ</P>
```

## ネスト（入れ子）
- 改行＋インデントで要素の入れ子を作る

▼Pug(Jade)

```pug
ul
  li アイテム
  li アイテム
```

▽HTML

```html
<ul>
  <li>アイテム</li>
  <li>アイテム</li>
</ul>
```

　
 

## タグ内でテキストを改行する
- 「 | 」を使う

▼Pug(Jade)

```pug
p 吾輩は猫である。
  br
  | 名前はまだない。
  br
  | どこで生れたかとんと見当けんとうがつかぬ。

```

▽HTML

```html
<p>吾輩は猫である。<br>
  名前はまだない。<br>
  どこで生れたかとんと見当けんとうがつかぬ。
</p>
```


## idやclassをつける
- id=""不要、class=""不要
- タグのすぐ後ろに、「#id名」、「.class名」でつける
- divは省略できる

▼Pug(Jade)

```pug
#box
  h1.title タイトル
  p.lead ほげほげ

```

▽HTML

```html
<div id="box">
  <h1 class="title">タイトル</h1>
  <p class="lead">ほげほげ</p>
</div>
```

## 属性の書き方
- タグの後ろ（）をつけて、内に書きます。

▼Pug(Jade)

```pug
a(href="https://google.com" target="blank") ほげリンク
img(src="./sample.img")
```

▽HTML

```html
<a href="https://google.com" target="blank">ほげリンク</a>
<img src="./sample.img">
```

## ネスト（入れ子）する時、改行とインデントを省略する
- タグの後ろにスペースを入れて「：」を入れるとネストできる
- navを作る時に便利
- ２つ以上も使用可能(ただし、テキストの後には「：」は使えないので注意)


▼Pug(Jade)

```pug
ul
  li: a(href="#")
  li: a(href="#"): span ほげ
  li: a(href="#"): img(src="")
```

▽HTML

```html
<ul>
  <li><a href="#"></a></li>
  <li><a href="#"><span>ほげ</span></a></li>
  <li><a href="#"><img src=""></a></li>
</ul>
```

## コメント
- ２種類あり
- コンパイルした後、HTMLに残すもの
- コンパイルした後、HTMLに残さないもの（Pugでのみ表示）


▼Pug(Jade)

```pug
// コンパイルした後、HTMLに残すもの
//- コンパイルした後、HTMLに残さないもの（Pugでのみ表示）
```

▽HTML

```html
<!-- コンパイルした後、HTMLに残すもの-->
```


## ジェネレータを使う
やっぱり慣れなくてストレス溜まるー！って方はまずはこちらで感覚をつかむのをオススメします。

### HTML -> Pug(Jade)を自動変換サイト
HTML to Jade converter
http://html2jade.aaron-powell.com/


### Pug(Jade) -> HTML 自動変換サイト
Online Jade Template Editor
http://aramboyajyan.github.io/online-jade-template-editor/
laravel-mail-previewでメールをファイル出力する

Laravelフレームワークのメール処理はデフォルトでビルトインされております。楽で良いのですが、標準出力に出す方法だとテストでチェックしづらいので、ファイルに書き出すプラグインを使う方法を書きます。

### laravel-mail-previewのインストール
---
https://github.com/themsaid/laravel-mail-preview

インストールは、↑のgithubの手順どおりです。（Laravelプラグインの標準の入れ方になっています。）

### 使用感
---
tinkerコマンドからreplを起動。

`php artisan tinker`

```php
// 実行
>>> Mail::raw('honbuntext!!', function ($message) {
...     $message->from('daijinfrom@example.com')->to('daijinto@example.com')->subject('subjectdesu!!');
... });
=> null
```

```php
// ファイルの出力結果
storage/email-previews/.gitignore
storage/email-previews/1481775799_daijinto_at_example_com_subjectdesu.eml
storage/email-previews/1481775799_daijinto_at_example_com_subjectdesu.html
```

ファイル名は固定で、先頭の数値がユニーク番号になっているようです。

### 注意点
---

デフォルトの設定だと、実行するたびにファイルが増えていき、60秒以上前のファイルは消えていくようです。これだと、どれが最新のメールファイルか？わからないので、60秒を0秒に変えて最新のメール以外無くなるようにします。

■config/mailpreview.php

```php
'maximum_lifetime' => 0,
```

これで常にファイルは3ファイル（.gitignore, eml, html）だけになるので、emlとhtmlで拡張子指定でファイルを取得すれば、中身の確認が楽になりますね＾＾

### 所感
---
会社の同僚に、「[MailCatcher](https://mailcatcher.me/)」良いよと言われたのですが、ユニットテストで確認出来ないのと、Ruby入れてセットアップするのが面倒なので、ライトウェイトに確認したい場合は、こちらのほうが良いのでは？と思いました。（ちゃんと確認したい場合は、MailCatcherのほうが良さそうです。）
Herokuでhttpをhttpsにリダイレクトさせる。（フレームワークはLaravel）

通常は.htaccessでリダイレクトさせるのが良いのですが、何故か上手く行かなくてフレームワーク側でリダイレクトさせました。

# プログラム

Middlewareを新たに追加します。

app/Http/Middleware/HttpsProtocol.php

```php
<?php
namespace App\Http\Middleware;

use Closure;

class HttpsProtocol {

    public function handle($request, Closure $next)
    {
        if (env('APP_ENV') === 'production') {
            $request->server->set('HTTPS', 'on');
            if ($request->header('x-forwarded-proto') <> 'https') {
                return redirect()->secure($request->getRequestUri());
            }
        }

        return $next($request);
    }
}

```

作ったMiddlewareを登録します。

app/Http/Kernel.php

```php
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \App\Http\Middleware\HttpsProtocol::class, // ここに追加
        ],

        'api' => [
            'throttle:60,1',
        ],
    ];
```

こんな感じで行けるはずです。
LaravelでHerokuにSSLを設定した話。

以外にやり方面倒くさいので、メモ代わりに。
デプロイ用のマシンはmacです。

参考にしたサイト
http://blog.kakeragames.com/2016/09/14/heroku-ssl.html
http://qiita.com/kon_yu/items/302d8bc0924f292d378b

# インストール

`Let's Encrypt`を利用します。
昔はgitからインストールする必要がありましたが、最近はhomebrewで簡単にインストールすることが出来ます。

```bash
$ brew install certbot
```

# Laravelのコード修正

証明する際に、特定の場所にファイルを置く必要あります。

> ドメイン名/.well-known/acme-challenge/xxxx

で、定期的に手動で更新するする必要があるので、環境変数で簡単に更新できるようにします。

route.php

```php
Route::get('/.well-known/acme-challenge/{id}', function ($id) {
    if ($id == env('LETSENCRYPT_REQUEST')) {
        return env('LETSENCRYPT_RESPONSE');
    } else {
        abort(404);
    }
});
```

publicにファイルを追加します。
emptyは空で良いです。

> public/.well-known/acme-challeng/empty

ディレクトリを準備しないと、何故か403エラーになり上手く表示されませんでした。回避方法があれば誰か教えてください。


# 証明書を発行

証明書発行のコマンドを実行します。

```bash
$ certbot certonly --manual -d www.example.com --logs-dir certbot --config-dir certbot --work-dir certbot
```
sudo付けて実行しても良いですが、今回はworkingdirを変更して対応します。

色々、受け答えしますが、以下のメッセージが出たら作業を止めます。

```
Make sure your web server displays the following content at
http://www.example.com/.well-known/acme-challenge/xxxxx before continuing:

xxxxx.yyyyy
```

herokのconfigに設定を追加します。

```bash
$ heroku config:set LETSENCRYPT_REQUEST=xxxxx
$ heroku config:set LETSENCRYPT_RESPONSE=xxxxx.yyyyy
```

終わったらEnterして完了です。
成功したら以下のようなメッセージが表示されます。

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
...
```

# herokuに証明書を設定する。

workingdirを変更しているので、そのパスを指定します。

```bash
$ heroku certs:add ./certbot/live/www.example.com/cert.pem ./certbot/live/www.example.com/privkey.pem
```

正しく登録出来てるか `$ heroku certs:info` で確認します。

# まとめ

いままでSSL利用するのに、20ドル取られていましたが、Hobby Dynos （7ドル） にするだけでSSLを簡単に設定できるようになりました。
10分もかからないので、herokuで運用しているサービスはSSLにしても良いかもしれません。
※ 自動更新できないので、定期的に更新する必要があります。
Windowsでbatファイルを自動実行したい時（タスクスケジューラの設定）

作成したスクリプトを指定した時刻に起動したい時があります。
Windowsの場合、「タスクスケジューラ」というものがあるので、それを使いましょう。
比較的簡単に設定出来るので、今回はその方法について説明したいと思います。



## 実行したこと
- タスクスケジューラの起動
- タスクを設定

## :one: タスクスケジューラの起動

[Windowsキー]＋Rを押してください。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/127045/1d750471-a680-8846-e109-4fadf084e80e.png)

こんな感じの画面が出てくるかと思います。
ここで

```
taskschd.msc
```

と打ってコマンドを実行してください。そうするとタスクスケジューラが立ち上がるはずです。

![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/127045/99e8ef8e-dd55-4656-8072-67bbfdfb1a69.png)



## :two: タスクを設定
[タスクスケジューラライブラリ]を右クリックし、[新しいフォルダ]をクリックします。

![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/127045/73df0ab1-3146-0367-7c81-1a6ce98e9562.png)

新しいフォルダ（私はMyScheduleと名付けました）を右クリックし、
**[タスクの作成]**
をクリックします。
（**[基本タスクの作成]**ではありません！　そっちでもいいのですけどこっちのほうが自由度が高いので）

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/127045/2f66ad56-ebc1-077c-0df2-a20bf95b2c6c.png)

こんな画面になったら、早速設定し始めましょう！

### **:two: :one: [名前]、[セキュリティオプション]の設定**

タスクに名前を付けましょう。セキュリティオプションは、取りあえず今はこんな感じで設定しちゃってください。

![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/127045/7e347b9a-aa83-4384-4c88-b7df1022c3d8.png)

### **:two: :two: [トリガー]の設定**
[トリガー]タブ － [新規(N)] を選んだ後は、適当にスケジュールを設定できます！
今回は平日の五日間を設定しました！

![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/127045/8f05459a-9b87-c0b7-583a-ab8d3035bc52.png)

下の[詳細設定]で[繰り返し間隔]も設定できますので、お好みで！
（プルダウンですけど、[5 時間] [03:15:30]などの入力も可能ですよ）

### **:two: :three: [操作]タブにて実行させるスクリプトの設定**
[操作]タブ － [新規(N)] を選んだ後は、実行するスクリプトを指定しましょう！
今回はbatファイルなので、[参照]をクリックして適当なbatファイルを選択しました！

![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/127045/9aa8e2c4-4633-08f4-2dac-93ef5d84d17d.png)

### **:two: :four: [条件][設定]タブの設定**

今回はパスします。必要に応じて設定してください。このままでも大丈夫です！

### **:two: :five: パスワード入力**

最後にパスワードを入力して、設定終了です。

![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/127045/f7202186-dc5a-903e-6c24-e461e9951233.png)



## まとめ
- タスクスケジューラの起動
- タスクを設定
Vimの練習

最近vimに触ることが増えてきたのですが、「ショートカットなんだっけ???」といつも忘れてしまうので、
vimのショートカットをまとめ、練習をしてみました。
自分はMacユーザのため、そのまとめです。
ターミナルで、vimtutorと叩くと、詳しいものが確認ができます。

##基本移動の操作
|キー|動作|
|:--|:--|
|h|左へ移動|
|j|下へ移動|
|k|上へ移動|
|l|右へ移動|
|w|次の単語の頭へ移動|
|w|記号を含めた次の単語の頭へ移動|
|gg|先頭へ移動|
|G|末尾へ移動|

##その他の動作
|キー|動作|
|:--|:--|
|o|一行改行して編集|
|:help|ヘルプ画面に遷移|
|x|削除|

##終了
|キー|動作|
|:--|:--|
|:q!|保存せずに終了|
|:wq|保存して終了|

##練習
vimの練習用にPacVimをインストールしてみました。
PacVimは、Vimコマンドで操作するパックンゲームです。
導入はすごく簡単で、下記サイトを参考にしました。
本来あるものよりショートカットは限られているらしいのですが、身体が覚えるにはとてもいいと思いました。

・公式サイト
[PacVim](https://github.com/jmoon018/PacVim)
・日本語でわかりやすかったので、導入はこちらの記事を参照しました。
[Pacman風ゲーム「PacVim」でVimの操作を覚えよう](http://hachibeechan.hateblo.jp/entry/introduce-
pacvim)

###まとめ
PacVimは基本的なカーソル移動が利用できるので、すごく便利です。
ただ、本当に最初は適当なファイルを作って、vimのコマンドを利用した方が、わかりやすいかなと思いました。
ゲームだと焦ってしまいます(苦笑)
でも、ターミナルでPacVimと打てば、遊べるのでいい気分転換になります。
コードでUIImageViewに画像と一致するアス比のConstraintを設定する

### 環境
Swift 2.3, Xcode 8.2で確認。

~~~ UIImageViewExtension.swift
extension UIImageView {
    // 自身のアス比をimageのアス比と一致させる
    func addConstraintFromImageAspect() {
        guard let imageSize = self.image?.size else { return }
        let aspectRatioConstraint = NSLayoutConstraint(
            item: self,
            attribute: .Height,
            relatedBy: .Equal,
            toItem: self,
            attribute: .Width,
            multiplier: imageSize.height / imageSize.width,
            constant: 0
        )
        self.addConstraint(aspectRatioConstraint)
    }
}
~~~

以上Qiita初投稿 ;)
リスニング/技術英語 > Adafruit > Battery Basics @adafruit > Part 4 > Deep LearningによるClosed Captioningはすごい / whenever you feel like it

Batteryについて面白そうな動画を見つけたので、技術英語関連でリスニングしてみた。

Part 1: http://qiita.com/7of9/items/2f714355dcbbe3992cb5

[Collin's Lab: Battery Basics @adafruit #adafruit](https://www.youtube.com/watch?v=8ftkn7nZSDo&index=74&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4)

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(4:48-)
So you can top them off **whenever <font color=blue>~~you feel it (CC[Closed Captioning]では you feeling;文法的におかしい)~~ (whenever you feel like it; 訂正いただきました)</font>**. 

(4:52-)
Nickel metal hydride (NiMH) have about the same capacity as alkaline batteries. And they're even a bit better at powering current-hungry devices.
But, it's important to keep in mind that they DO self discharge at a faster rate.

(5:07-)
So, generally speaking, keep alkalines in your ~~small detectors~~ (smoke detectors;訂正いただきました) and nickel metal hydride (NiMH) in your game controllers. 
Or your **<font color=red>xxx (CCではmilk frother)</font>**.

(5:29-)
Lead acid batteries are the oldest rechargeable and with their low energy density they're also the heaviest.
They're still used today because they're so good at providing very high surge current as in tens of amperes. 

(5:47-)
Which makes them really good for applications such as a starting a car. 
Lead acid's size and weight means you ~~want~~ won't find it in your personal electronics but if you have a power-hungry project that needs to run for days, the Lead acid is your best choice.

(6:00-)
I hear robots are quite <font color=red>fondable (CCではfond of them; 正しそう)</font>.



 

### 上記のフレーズを抜粋

- milk frother
  - http://coffeegearathome.com/what-is-the-best-electric-milk-frother-and-steamer-you-can-buy/
  - これは自分の関心圏の外のもの
- be fond of them
  - 今回で耳が慣れただろうか

### CC(Closed Captioning)表示について

CC[英語(自動生成)]では「depleted」を「completed」と誤認識していたりした。
一方で、CCで他の多くの部分では正解と思われる識別をしている。半年前に見た動画のCC表示よりも認識率が高くなっているようにも思える (動画によるかもしれないが)。

Deep Learningすごい。

自分の今のリスニング力よりもCCの方が正解率が高いかもしれない。

they'reをthereと誤認識している。これは難しいかもしれない。前後の文脈も含めての認識方法によりこのあたりは改善するだろう。
CakePHP3のデータベースセッションにすると"Failed to decode session object."と言われる

CakePHP3を使ってて、セッション管理をDBにしたくて、

http://book.cakephp.org/3.0/ja/development/sessions.html#id5

に書かれている通りにしたのです。

```sql:config/schema/sessions.sql
CREATE TABLE sessions (
  id varchar(40) NOT NULL default '',
  data text,
  expires INT(11) NOT NULL,
  PRIMARY KEY  (id)
);
```
```php:config/app.php
'Session' => [
    'defaults' => 'database'
]
```

そしたら、

```
session_start(): Failed to decode session object. Session has been destroyed in [/path/to/vendor/cakephp/cakephp/src/Network/Session.php, line 325]
```

というエラー。

色々調べた結果、sessionsテーブルにmulti-byteが入る場合にそうなるらしい。

http://stackoverflow.com/questions/33051842/session-start-is-not-success-when-use-multi-byte-into-the-session-in-cakephp3

sessionsテーブルをutf8で作り直したらエラーが出なくなりました。

```sql:config/schema/sessions.sql
CREATE TABLE sessions (
  id varchar(40) NOT NULL default '',
  data text,
  expires INT(11) NOT NULL,
  PRIMARY KEY  (id)
) CHARSET=utf8;
```
初心者だけどGo

今回、初めて、アドベントカレンダーに参加させていただきます。
正直、Go言語もよくわかってなく、Qiitaも初投稿という。
ドキドキな感じです。

私にとっての、Go言語の魅力は、なんと言っても、gopherくんの可愛さです。
Lineのスタンプもゲットしましたし、gopherくんを見ると幸せな気分になれます。


![go.JPG](https://qiita-image-store.s3.amazonaws.com/0/131990/9d0b8697-3772-be8f-dda4-b23af7f55d5a.jpeg)





初心者だけど、gopherくんと共に、go言語頑張ろうっと思ってます。

そこで、まず、何を始めようかと、計画を立ててみました。

以前、参加したgo言語の勉強会でのハンズオンを、難しくて、ついてゆくのも大変で、未だに未完成のまま
日々の生活に追われて、ほったらかし状態だったのを完成させることから始めようと思っています。

コマンドラインツールを作ろうという、ハンズオンで、黒い画面怖いの私がコマンドツール？？と思いながらも、gopherくんと仲良くなるためならという動機付けを持ってtryしてみます。

そして、見事、完成したら次は、A Tour of Goを、日本語版ではなく、苦手な英語ですが、英語版でやってみたいと思ってます。

21世紀のc言語とも言われているgo言語と、本当に来るかわからないシンギュラリティの未来へgo
してみたいと思う、2016年の12月であります。
Cloud9でLaravel5.3のセットアップ

端的に言うと以下の方法を使った
https://community.c9.io/t/laravel-5-3-installation-on-cloud9/9038

へっぽこマシンで楽して開発の実験したかったからCloud9を使ってみる。フレームワークもよくわからないけどLaravelをためしてみる。PHPのバージョンに注意点があったので記録しておく。

# Cloud9デフォルトのPHPが5.5
Laravel 5.3のシステム要件は`PHP >= 5.6.4`。なのでCloud9上でそのままインストールしようとするとLaravel 5.2が落ちてくる。
5.2でやろうかとも考えたがそもそもPHP 5.5のサポートが切れてるので、せっかくなのでPHP 7まで上げてしまう。

# PHPアップデート方法
調べたところいろんな方法があった

1. c9-lemp(https://github.com/GabrielGil/c9-lemp)
cloud9上にNginx, PHP-FPM7 の環境を作ってくれるスクリプト。
インストールは楽だったのだが403エラーが出て設定がどうにもよくわからなかったので却下

2. phpbuildやphpbrew
ビルドに時間がかかってめんどくさくなった

3. ondrejさんのPPAレポジトリを使う
楽。
方法が公式コミュニティーに投稿されてた。そのままやれば多分いける
https://community.c9.io/t/laravel-5-3-installation-on-cloud9/9038

以下コミュニティーの投稿内容ほぼそのままなので読む必要なし

# PHP7.1へのアップデート

```bash
#リポジトリの追加
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

#apacheのphpモジュールを追加・設定
sudo apt-get install libapache2-mod-php7.1
sudo a2dismod php5
sudo a2enmod php7.1

#phpの各種モジュールを追加
sudo apt-get install php7.1-dom
sudo apt-get install php7.1-mbstring
sudo apt-get install php7.1-zip
sudo apt-get install php7.1-mysql
```

他のモジュールも必要になるかもしれないが、ひとまずdom, mbstring, zipを入れればLaravelインストール時に怒られることはなくなる

# Laravel5.3のインストール

```bash
composer global require 'laravel/installer'
export PATH=~/.composer/vendor/bin:$PATH
laravel new laravel
```

laravelフォルダにLaravelがインストールされる。

# apacheのルートディレクトリの変更
apacheのルートディレクトリをlaravelフォルダ内の`public`に設定する必要がある。
`/etc/apache2/sites-enabled/001-cloud9.conf`をコマンドラインエディタから編集

```diff:/etc/apache2/sites-enabled/001-cloud9.conf
- DocumentRoot /home/ubuntu/workspace/
+ DocumentRoot /home/ubuntu/workspace/laravel/public
```

これでapacheを起動させページを確認するとLaravel初期画面が表示されるはず。

# 次回
ひとまずここまでで次はデータベースの設定をする
ところでネットで検索した感じ、みんなデフォルトで用意されてる`README.md` `php.ini` `hello-world.php`消してたんですけど、ワークスペースに`php.ini`置いとくとそっちを読みに行くみたいだけど消して大丈夫？（ワークスペースから消すと`	/etc/php/7.1/apache2/php.ini`を読みに行く）
あとでdiffでも取った方がいいだろうか