OmniAICreator/Qiita-1.07M huggingface dataset:
PowershellでLotusScriptを利用する

# PowershellでLotusScriptを利用する

　[VBScript](https://qiita.com/fumimix/items/90d26fbb3ccf2d21167f)のときと同じように、COMでLotusScriptの各種クラスを呼ぶことが可能です。
　Powershellの強力なコマンドレットを扱えるため、書き方を覚えればこちらのほうが便利です。
　個人的にはログの吐き出しがリダイレクトで簡単になるのが楽でよいです。
　一方で、LotusScriptの書き方とシェルの書き方が混在するので、木に竹を接いだようになるのが見た目あまりよくないですが…。

```Powershell:HelloWorld的例
$ss = new-object -comobject Lotus.NotesSession
$ss.Initialize("")
Write-Output "Hello world!" $ss.CommonUserName
pause
```

```Powershell:出力例
PS C:\HelloWorld.ps1
Hello world!
Yamada Taroh
Press Enter to continue...: 
```

<script src="https://gist.github.com/Fumimix/9b176fdd4ed1aac507fb30580fe5609c.js"></script>

　注意点としては、Windowsが64bitの場合以下のようなエラーが出ることがあります。
　dllが32bitのためこのエラーが出るため、32bit版Powershellを使ってください。
　64bit版と32bit版では初期ディレクトリが異なるので、そこも注意してください。

```CMD:32bit版Powershellの場所
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell_ise.exe
```

```Powershell:64bit版でNotesSessionを呼んだ例
PS C:\> .\HelloWorld.ps1
new-object : CLSID {29131539-2EED-1069-BF5D-00DD011186B7} を含むコンポーネントの COM クラス ファクトリを取得中に、次の
エラーが発生しました: 80040154 クラスが登録されていません (HRESULT からの例外:0x80040154 (REGDB_E_CLASSNOTREG))。
At C:\HelloWorld.ps1:1 char:7
+ $ss = new-object -comobject Lotus.NotesSession
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [New-Object], COMException
    + FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand

You cannot call a method on a null-valued expression.
At C:HelloWorld.ps1:2 char:1
+ $ss.Initialize("")
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Hello world!
Press Enter to continue...:
```

## おまけ（他言語からLotusScriptを呼ぶパターン）

　Pythonからも呼ぶことができます。

[addicted: Python から COM 経由で Lotus Notes にアクセス](http://torufurukawa.blogspot.com/2005/09/python-com-lotus-notes.html)


## 参考
[Powershell for Lotus Notes and Domino… \| Messaging, Collaboration & Identity](https://quickclix.wordpress.com/2011/07/04/powershell-lotusnotesdomino/)　※分かりやすいサンプルあり
[PowerShellでアンマネージドdllを使おうとしたらハマった話 \| $m0t0k1x2\["code"\]\.content](http://m0t0k1x2.tumblr.com/post/124725219509/powershell%E3%81%A7%E3%82%A2%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%89dll%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E8%A9%B1)　※Windowsが64bitなのにdllは32bitなので引っかかった例
Python独習に役立つ組み込み関数

REPL環境でPythonの挙動を調べることは理解をよく助けてくれます。ここに便利なコマンドをまとめます。
# コマンド一覧

```pycon:python3
>>> id()
>>> type()
>>> dir()
>>> bool()
>>> help()
```
# 実用例と解説
## id()
id()はオブジェクトの「識別値」を返すものです。
見た目が同じでもpythonは違うと認識していたり、逆のこともあります。
基本的に同じ数字は同じ識別値、同じ短い文字列は同じ識別値となります。
リストの識別値を調べてみると、興味深いでしょう。

```pycon
>>> id(1)
1814648560
>>> id("a")
3024896
>>> a = [1,2]
>>> b = [1,2]
>>> id(a)
4500000648
>>> id(b)
4499932168
```

## type()
type()はオブジェクトのクラスを調べます。

```pycon
>>> type(1)
<class 'int'>
>>> type("1")
<class 'str'>
```

## dir()
dir()は名前空間を調べます。クラスを渡すとそのクラスの名前空間を返します。

```pycon
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
```

## bool()
真偽値を調べます。ifに渡すとどうなるかな、と迷ったときに便利です。

```pycon
>>> bool()
False
>>> bool("")
False
>>> bool("any string")
True
```

## help()
クラスや関数のヘルプを参照します。

```pycon
>>> help(dir)
Help on built-in function dir in module builtins:

dir(...)
    dir([object]) -> list of strings
    
    If called without an argument, return the names in the current scope.
    Else, return an alphabetized list of names comprising (some of) the attributes
    of the given object, and of attributes reachable from it.
    If the object supplies a method named __dir__, it will be used; otherwise
    the default dir() logic is used and returns:
      for a module object: the module's attributes.
      for a class object:  its attributes, and recursively the attributes
        of its bases.
      for any other object: its attributes, its class's attributes, and
        recursively the attributes of its class's base classes.

>>> help(''.split)
Help on built-in function split:

split(...) method of builtins.str instance
    S.split(sep=None, maxsplit=-1) -> list of strings
    
    Return a list of the words in S, using sep as the
    delimiter string.  If maxsplit is given, at most maxsplit
    splits are done. If sep is not specified or is None, any
    whitespace string is a separator and empty strings are
    removed from the result.
```
【Playcanvas】描画順を考慮してオブジェクトを追加する【2Dゲーム】

オブジェクトを画面上に追加するには「addChild」メソッドを用います。

```js

// 弾丸オブジェクトを複製する
var bul = this.bulletTemplate.clone(); 

// 弾丸オブジェクトを画面に追加する
this.entity.addChild(bul);

```

この方法だとHierarchyの最後に追加されるため、最前面に描画されます。
例えばキャラクターがいて、その前に描画したい場合は「insertChild」メソッドを用います。

```js

// キャラクターのHierarchy上のインデックスを取得する
var index = this.entity.children.indexOf(this.charactor);

// 弾丸オブジェクトを複製する
var bul = this.bulletTemplate.clone();

// キャラクターの位置に弾丸を追加する(キャラクターが後ろにづれる)
this.entity.insertChild(bul, index);

```
PHPのタイプヒンティングメモ

PHP7になってからタイプヒンティング(型宣言)が増えたのもあって、いつこれが追加されたのか？といったところがよくわからなくなってきたのでメモしました。

# 関数の引数に書けるタイプヒンティング

ドキュメントに書いてあるものをほぼそのまま持ってきました。

|型|利用可能になるバージョン|
| --- | --- |
|クラス/インターフェース名|5.0.0|
|self|5.0.0|
|array|5.1.0|
|callable|5.4.0|
|bool|7.0.0|
|float|7.0.0|
|int|7.0.0|
|string|7.0.0|
|iterable|7.1.0|
|object|7.2.0|
|union型(\|)|8.0|
|mixed|8.0|
|交差型(&)|8.1|
|DNF型(unionと交差の複合)|8.2|

# 戻り値に書けるタイプヒンティング(7以降

php7から戻り値にもタイプヒンティングが記載できるようになりました。
基本的には関数に書けるものと同じです。

```php
function test(): int
```

また、php7.1からはvoid型もサポートします。

```php
function test(): void
```

# 強い型付けを要求する(7以降

デフォルトの場合は、緩い型付けが許容されるので可能な限りはその型に変換されるようになっています。(スカラー型のみ)

強い型付けを実現するには、`declare(strict_types=1);`を書きます。
もし、型があってない場合はTypeErrorをスローします。

# タイプヒンティングしてるけどnullableにもしたい

PHP7.1未満のバージョンの場合は、引数のデフォルト値にnullを指定すると動作します。(厳密には似たような動きをするだけです)

```php
function test(int $number = null)
```

PHP7.1からは型の前に`?`をつけます。なお、これは戻り値の型にも指定できます。

```php
function test(?int $number)
```

# 7.1から導入されたiterable

iterableは7.1から導入されている疑似型です。
arrayや、Traversable(foreachで回せる)を実装したものであれば受け取ることが出来ます。

# おまけ

## 7.1からはクラス定数にもアクセス修飾子を指定可能になっている

いままではクラス定数にアクセス修飾子(publicなど)をつけることは出来ませんでしたが、7.1から可能になっています。

```php
class Sample {
    public const $test;
```

# 参考

https://www.php.net/manual/ja/language.types.declarations.php

https://www.php.net/manual/ja/language.types.type-system.php
Pythonの例外処理で例外の内容を知る

例外が起きてもプログラムが動くように組みたい。
それでいて
例外が起きたらその内容をちゃんと知りたい。

そんな時に役立つ方法。

```sample_square.py
import traceback

while True:
    user_input = input("////////////\nenter number\n////////////\n>>")
    if (user_input == "") or (user_input == ".") or (user_input == "q"):
        break
    try:
        num1 = int(user_input)
    except ValueError:
        print("ValueError. please enter number only")
        continue
    except:
        traceback.print_exc()
        continue
    print("{0}^2={1}".format(num1, num1 ** 2 ))
```

参考：
http://ja.stackoverflow.com/a/6982/20993

追記
---
内容を知るだけならもっと簡単に済ませることができるとわかった。

```sample.py
try:
    print(1 / 0)
except Exception as e:
    print(e)
```

Exceptionクラスはすべての例外が当てはまるので、それをeとしておいて表示すれば内容がわかる。
VivaldiでChrome拡張のKeyboardShortcutが効かない時の対策法

[Keyboard shortcuts for extensions is ineffective | Vivaldi Forum](https://forum.vivaldi.net/topic/8364/keyboard-shortcuts-for-extensions-is-ineffective)
コミュニティで議論されていた。

### 解決方法。
下の画像の様に、デフォルトでは「Vivaldi専用」となっているのを「グローバル」に変更してあげると良い。
 ![貼り付けた画像_2017_10_22_17_47.png](https://qiita-image-store.s3.amazonaws.com/0/86747/956afcb1-dc0c-cd2d-6987-bc0ed9caf9e9.png)
gradle で作成されるディストリビューションにスクリプトを追加する

https://www.mkyong.com/gradle/gradle-multiple-start-script-examples/
http://gradle.monochromeroad.com/docs/userguide/application_plugin.html
(45.4)

上記参考に

``` build.gradle
task createExtScript(type: CreateStartScripts) {
    mainClassName = "Main"
    classpath = startScripts.classpath
    classpath += files('/tmp/hoge')
    outputDir = startScripts.outputDir
    applicationName = 'extra_shell'
    defaultJvmOpts = ["-Xms1024m", "-Xmx2048m"]
}

applicationDistribution.into("bin") {
    duplicatesStrategy= DuplicatesStrategy.EXCLUDE
    from(createExtScript)
    fileMode = 0755
}
```

タスクに以下プロパティを設定可能

- mainClassName
- classpath 
- outputDir 
- applicationName 
- defaultJvmOpts
画像投稿でiPhoneから投稿すると縦長が横長になってしまう場合の対応(Laravel + Intervention/Image)

写真や画像をアップロードするアプリをLaravel5.4作ってるのですが、iPhoneからアップすると縦だと思ってた写真が横になってアップされてしまうという現象が出ていました。

これはExifというものが問題になっているらしく修正を行ったので手順を書いておきたいと思います。

Exifの詳細はこの辺を参考にさせていただきました。ブラウザとか環境ごとに挙動が異なっていたりするようです。
https://qiita.com/RichardImaokaJP/items/385beb77eb39243e50a6

#controllerの修正
僕の場合幸いIntervention/Imageを元から使っていたので、orientate()という関数があることを知りイージーにそれで対応を試みることに。
http://image.intervention.io/

       Image::make('/tmp/'.$name)
              ->resize(700, null, function ($constraint) { $constraint->aspectRatio(); } )
            　　 ->save('/tmp/'.$regular_name);
みたいなコードをcontrollerの書いてたので、
ここにorientate()を処理に追加すれば大丈夫そう。

       Image::make('/tmp/'.$name)
       　　->resize(700, null, function ($constraint) { $constraint->aspectRatio(); } )
        ->orientate()
       　　->save('/tmp/'.$regular_name);

と追加。
で試してみるとエラー。

#ext-exifの追加
ExifがPHP側で必要みたいなので

Composer.jsonに
"ext-exif":"*"
を追加。

  "require": {
	-省略-
        "ext-exif":"*"
    },

コンソールから
Composer update

Herokuへもアップ。
Git push heroku master

ローカル環境とHeroku、両方問題なく動いています。
Unityの機械学習ライブラリで歩くモーションを作成する実験をした

#概要
前回の続き。歩くモーションも出来るんじゃないかと思って実験してみた。
[(前回の記事)Unityの機械学習ライブラリで待機モーションを作成する実験をした](https://qiita.com/UnagiHuman/items/3645fe48b9578249b303)

出来たのが以下のもの。想像の範囲外の歩き方になった。これが機械学習の面白いところかもしれない。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">機械学習で歩くモーションを作る実験。想像の斜め上を行く歩き方になった。 <a href="https://t.co/wUXG335Poe">pic.twitter.com/wUXG335Poe</a></p>&mdash; unagi (@UnagiHuman) <a href="https://twitter.com/UnagiHuman/status/921985888761950209?ref_src=twsrc%5Etfw">2017年10月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

この記事にはこの歩き方にいたるまでの試行錯誤の過程を書いておこうと思う。

#失敗例1
まずは歩いて前進するという行為を要素に分解してみた。

* 足以外の部分が地面につかない（待機モーションと同じ）
* 目標地点に到達するように移動する

これをAgentが得られる報酬に置き換えると

* 足以外の部分が地面に設置したら罰則を与えてstep終了しリセット
* 目標地点に到達したら報酬を得られてstep終了しリセット
* 1step毎に目標地点に近いほど多く報酬をもらえる

その結果がこれ。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">機械学習で画面手前の個所まで2足歩行させようとしているのだが、なかなか1歩目を踏み出してくれない。。 <a href="https://t.co/XyXppRMIwf">pic.twitter.com/XyXppRMIwf</a></p>&mdash; unagi (@UnagiHuman) <a href="https://twitter.com/UnagiHuman/status/921790927022071808?ref_src=twsrc%5Etfw">2017年10月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

おそらくこの条件が良くなくて、前に倒れこむだけで報酬が貰えるという欠陥があるのだろうと推測。

* 1step毎に目標地点に近いほど多く報酬をもらえる

#失敗例2
失敗例1の欠点である倒れこむだけで報酬が貰えるのを改善する為に目的地までの間に撒き餌をまいて、撒き餌を採ると報酬が貰える条件を追加してみた。

* 足以外の部分が地面に設置したら罰則を与えてstep終了しリセット
* 目標地点に到達したら報酬を得られてstep終了しリセット
* 1step毎に目標地点に近いほど多く報酬をもらえる（近づいたときだけ貰える）
* （New）撒き餌を採ったら報酬が貰える

結果がこれ。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">撒き餌をしてみたらやっと一歩を踏み出してくれた。 <a href="https://t.co/9VScKvPZlD">pic.twitter.com/9VScKvPZlD</a></p>&mdash; unagi (@UnagiHuman) <a href="https://twitter.com/UnagiHuman/status/921930134696861696?ref_src=twsrc%5Etfw">2017年10月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

これまでのように足が地面についたまま倒れこむのではなく、足を浮かせて前に進もうとしているのが分かる。一歩を踏み出したので大きな前進である。

#成功例
正直、これ以上どんな条件を加えれば良いのか思い浮かばなかったので、公式のページをここで初めて参考にしてみた。
[Camera as a state #92](https://github.com/Unity-Technologies/ml-agents/issues/92)
Agentの状態を測定するのに、手動で加えたState(前回の記事ではStateにRagdollの位置、速度を与えた)だけではなく、Cameraからの画像を利用する方法があるようだ。これを利用してみる。設定は、Agentのインスペクタのobservationsにカメラを設定するとの事。

![alt](https://github.com/Unity-Technologies/ml-agents/raw/master/images/agent.png)

カメラを使うと計算時間が何倍にもなるようで自分の環境で30分ぐらいで済んでいた計算が3時間ほどかかった。
ただ、結果としては概要で示したように、満足いくものとなった。今回の実験のように、操作するパラメタ（36つ）と監視するパラメタ（72こ）が多い場合はカメラを使った方が効率的に分析できるのかも？

#成功例の考察
なぜ、奇妙な動き方になったのかは正直分からない。どの関節にも均等に偏りなく回転速度を与えるようにしたし、報酬を与える条件も目的値に近づくという単純な条件だけである。Unityの物理エンジンにおいてRagdollが一番安定して移動できる方法がそれだったという事か。
PRML 4章(4.1〜4.3) 線形識別モデルの気持ち 

# PRML 4章 線形識別モデルの気持ち
## この記事の目的
これからPRMLの第4章（4.1〜4.3）を読み始める人が、それぞれの項目がどのような関係になっているか、どんなことに注意して読めば良いかなどをガイドしたいというモチベーションの元に書かれています。

## 4章（4.1〜4.3）の全体像
4章ではクラス分類問題について解説されています。
クラス分類をする上でどんな方法があるのかという観点から、PRMLではざっくり分けて以下の2つで説明しています。

* 写像関数によってバシッと分類
* 確率的な観点を元に分類
    * データの生成モデルを計算してからベイズ的に分類
    * クラスに分類される確率をそのまま計算して分類

それぞれの方法と各項目の対応については以下のようになっています。

* 関数的にバシッと分類→ ```4.1 識別関数（判別関数)``` 
* データの生成モデルを計算してからベイズ的に分類→```4.2 確率的生成モデル```
* クラスに分類される確率をそのまま計算して分類→```4.3 確率的識別モデル```

それぞれについて、以下でざっくり説明していきます。

## 4章で取り上げられる項目とその気持ち
### 4.1 識別関数（判別関数)
上述のように、ここでは写像関数によって入力データをバシッと分類する方法が紹介されています。

#### 4.1.1〜4.1.2
単純な線形識別関数の例で2クラス分類と多クラス分類の方法が解説されています。
2クラス分類については、入力ベクトルと重みベクトルの内積の正負で分類しようねという話です（ざっくり）。
多クラス分類については、クラスの数だけ識別関数作って組み合わせるとか色々な方法があるよということ言っています（こちらもざっくり）。

#### 4.1.3〜4.1.7
4.1.3〜4.1.7では、上記の線形識別関数で用いる重みベクトル（パラメタ）の学習方法について以下の3つが紹介されています。

* 最少二乗和誤差最小化
* フィシャーの線形判別（参考：http://s0sem0y.hatenablog.com/entry/2016/08/07/054847 ）
* パーセプトロンアルゴリズム

それぞれの項目は独立して読むことができるので、気になるものからピックアップして勉強するのが良いと思います（多分全部重要）。

それぞれの方法について簡単な概要だけ述べておきます。

<b>最小二乗和誤差最小化</b>については、正解データと計算結果の二乗和誤差が最少になるようにという最小二乗法的な計算で、パラメータを最適化します。
<b>フィッシャーの線形判別</b>については、識別関数の計算の際、得られる値を別のクラス同士できるだけ離れた値にするような制約（平均間の分離どクラス内分散を抑える）を行うことによって、より良い分類を目指します。
<b>パーセプトロンアルゴリズム</b>については、生物の神経を参考に作られた2クラス分類のモデルです。ニューラルネットワークから、流行りのディープラーニングの基礎となるモデルです。

### 4.2 確率的生成モデル
確率的な観点を導入してクラス分類をしようという方法その1です。

ここでは分類のステップを以下のように分けて、考えようということが書かれています。
1. データがどんな風に生成されているか（生成モデル）を考える
2. 生成モデルを前提として、入力データがとあるクラスから生成された確率を求める
3. 求めた確率をベースに入力データがとあるクラスに分類されるかどうかを決定する境界を決める

PRMLでは1〜2までを<b>推論</b>、3を<b>決定</b>と言っています（ざっくり説明なので細かいニュアンスは違うかも）。

#### 4.2.1〜4.2.2
実数値の特徴量に対して、ガウス分布からデータ生成されると仮定した場合のクラス分類がどう行われるかが説明されています。

#### 4.2.3〜4.2.4
入力値が離散の場合と多クラス問題への拡張について書かれています。

### 4.3 確率的識別モデル
確率的な観点を導入してクラス分類をしようという方法その2です。

その1ではクラス分類のために色々やっていましたが、確率的識別モデルでは1〜3のステップ2（入力データがとあるクラスから生成された確率）を直接モデル化してしまおうという方法です。

本書では以下のモデル（方法）が紹介されています。

* ロジスティック回帰
* プロビット回帰


#### 4.3.1 固定基底関数
入力データを事前に非線形変換して別の空間に写像しておけば、4.1で見てきたアルゴリズムを良い感じに適用できるよねという話がきちんと書いてある。
そもそもこれって確率的識別なのかなという疑問があるため、この場所にこの解説があると混乱する（記事書いた人の感想）。

#### 4.3.2〜4.3.4
ロジスティック回帰と呼ばれる確率的識別モデルの解説。
パラメタの学習方法として、反復重み付けけ二乗法（IRLS）を理解できると良いと思います。

#### 4.3.5 プロビット回帰
プロビット関数を用いたプロビット回帰というモデルの解説。

#### 4.3.6 正準連結関数
一般化線形モデルの観点から、4.3の話をまとめる。




## 注意書き
この記事には、間違いが含まれる可能性があります。
また、記事中におかしなものがありましたらぜひご指摘お願いします。

これから線形識別モデルを勉強する人のガイドになれば嬉しいです。
iTerm2のおすすめ設定〜ターミナル作業を効率化する〜

# iTerm2
iTerm2使ってますか？

Macの標準ターミナルで十分だという方も是非ご一読頂きたいですが、
iTerm2には、純正のターミナル.Appにはない**デスクトップ上に被せてフルスクリーンで表示できる設定**があります。
HotKeyの設定と組み合わせると使いたいときだけ画面上にショートカットキーでフルスクリーン表示ができ、非常に便利です！
自分は、iTerm2をこの設定にして、前から愛用していますが、これができるのとできないのとではかなり作業効率が変わってきます。
他の方の作業効率化の助けにもなれば幸いです:sparkles:

# iTerm2の設定をいじるとこんな感じ
好きなショートカットコマンドを入力すると現在のデスクトップ上にフルスクリーンでiTerm2を表示させたり消したりすることができます！とても便利:+1:
<img src="https://qiita-image-store.s3.amazonaws.com/0/128422/509608d4-9db6-2e91-b99d-d84559bef5e3.gif" width=720>

# iTerm2 設定
ここからは、iTerm2の設定のやり方を記します。
3ステップのみなので、とても簡単です:sunglasses:

### 1. Native full screen windowsを無効にする
こちらの設定は、デフォルトで有効となっていますが、これを有効にしておくとiTerm2を開く際にiTerm2用のデスクトップを勝手に開いてしまうため、任意のデスクトップ上にフルスクリーンで表示できなくなってしまいます。
そのため、こちらの設定は無効にします。

```iTerm2 > Preferences > General > Window > Native full screen windowsのチェックを外す```
<img width="720" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128422/a4d872d7-96af-de55-6b31-cadea1b16890.png">

### 2. 新しいウィンドウの設定をフルスクリーンにする
次は、開く画面のスタイルを設定していきます。
StyleはFullscreenにします。
Screenは今カーソルがあるスクリーンで表示するようにするため、Screen with Cursorを選択します。
最後にSpaceをどのSpaceでも開くようにするためにAll Spacesを設定しましょう。

```iTerm2 > Preferences > Profiles > Window > Settings for New Windows > Style, Screen, Space```
<img src="https://qiita-image-store.s3.amazonaws.com/0/128422/4ab0f644-c728-fa15-2b5f-80aa8c78fb02.png">

### 3. HotKeyを設定してショートカットで開けるようにする
最後は、ショートカットの設定です。
もともとショートカットによって表示したり非表示にしたりする機能がiTerm2にはついているので、その設定を有効にするだけです。
自分は、Option+Spaceを利用していますが、ここはお好みで設定すると良いと思います。

```iTerm2 > Preferences > Keys > HotKey > Show/hide iTerm2 with a system-wide hotkeyにチェック```
```HotKey: のテキストボックスを選択しRecording状態になったら任意のショートカットを入力```
<img width="631" alt="貼り付けた画像_2019_06_16_23_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128422/1baa401e-b647-bd1a-f899-8fe5d62ac7b8.png">

### 設定完了 :tada::tada::tada:
さっそく、iTerm2の新しい画面を立ち上げてみましょう。
ショートカットを押すと表示/非表示が簡単に切り替えられ、どのデスクトップにいてもそのデスクトップ上に表示することができるようになったと思います。

# :memo: Tips
最初にお見せしたGifアニメーションでお分かりの方もいらっしゃるかもしれませんが、自分は上記の設定に合わせて、iTerm2の背景色の設定を黒の半透明にしています。（```iTerm2 > Preferences > Profiles > Window > Window Appearance > Transparancy```を調整し、Blurは無効）
この設定にすることで、あるテキストやコマンドを写経したいときなどに、ブラウザなどが開いているデスクトップ上でiTerm2を表示させると後ろの画面が透過するので、とても役に立ちます。

さらに、ターミナルの領域を最大限に引き出したい場合は、menu barを非表示にする設定もおすすめです。（```iTerm2 > Preferences > Appearance > General > Auto-hide menu bar in non-native fullscreen```にチェック）

この辺はお好みですがこれらの設定によって、かなり作業の効率化が進んだりします。
ぜひ一度これらの使い心地を試していただき、自分に最適な設定を見つけてほしいです。

# あとがき
いかがでしたでしょうか。
こんな感じで、Macの標準のTerminalにはできない細かい設定ができるところがiTerm2の強みだと思っています！
ほかにもiTerm2のTipsがあれば知りたいです！コメントに書いていただけますと喜びます:pray:
最後までお読みいただき、ありがとうございました:bow:
SPA を Azure Functions Proxy を使って公開する その２

これはいつもにまして自分に対するメモ。

前回、やり方がわかったところで、タイムアップだったので、前回は、URL に `/web/index.html` がつくというかっこ悪い感じで時間切れだったので、今回は、`/`でアクセスできるように変更する。これで、URL 系はオッケーかな。

# ホスト名でアクセスしたら、SPA が動くようにしたい。

前回わかったことで、現在、Azure Functions V2 だと、Proxy の動きが怪しい様子。だから、現在 Functions に使っているもの以外に、Function App をもう一つ作成し、そちらは、V1 にする。Consumption プランにするからお金の問題も大したことないだろう。

設定は簡単だった。見ての通りで、とても簡単。URLを変えたので、バックエンドサーバーの CORS の設定を変える程度で終了。

<img width="752" alt="Screen Shot 2017-10-22 at 4.27.01 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/3a99c253-6ea3-5bcc-011e-dd3ac5d65b89.png">


# index.html と書かずにアクセスしたい

これも簡単。通常の、httpd 系だとこんなの設定しなくてもうまくいくが、プロキシなのでそうもいかない。しかしこれも設定は簡単。

<img width="794" alt="Screen Shot 2017-10-22 at 4.27.16 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/0efdcd47-4394-dca0-a8e0-9ba58efa8133.png">

あとは、Angular をビルドするのに

```
$ ng b -prod --base-href /web/
```

だったのをオプション無くして、Blob にあげるだけ

```
$ ng b -prod
```

これはとても簡単だった。

次は、Continuous Delivery 周りの様々なデプロイテクニックを試していきたい。
JavaScript jQuery Canvas でアナログ時計を作る

Canvasを使ってみたかったので、作ってみました。
他にもたくさん方法はあると思いますが、今の私には精一杯。
# コード

```HTML
<!DOCTYPE html>
<html lang="ja">
  <head>
      <meta charset="UTF-8">
      <title>Clock</title>
      <script src="https://code.jquery.com/jquery-3.1.1.js" integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA=" crossorigin="anonymous"></script>
  </head>
  <body>
      <h1>時計</h1>
      <div>
        <canvas id="canvassample" width="300" height="300" style="background-color: #ddd;"></canvas>
        <h2>現在時刻<span id="hour"></span>:<span id="minute"></span>:<span id="second"></span></h2>
      </div>
  </body>
</html>
```

```Javascript
$(window).on('load', function(){
  repeat();
})

function repeat() { //1000ミリ秒ごとに繰り返し
 setInterval('clock()',1000);
}

function clock() { //canvasに描画
  var d = new Date();
  var second = d.getSeconds();
  var second_hand = second *6;
  var minute = d.getMinutes();
  var minute_hand = (second/60 + minute) *6;
  var hour = d.getHours();
  if (hour < 12){
    var hour_hand = (minute/60 + hour)*30;
  }else{
    var hour_hand = ((minute/60 + hour) -12)*30;
  }

  var canvas = document.getElementById('canvassample');
  /* canvas要素の存在チェックとCanvas未対応ブラウザの対処 */
  if ( ! canvas || ! canvas.getContext ) {
    return false;
  }
  var ctx = canvas.getContext('2d');
  ctx.beginPath();
  ctx.moveTo(150, 150);
  ctx.lineWidth = 6;
  ctx.arc(150, 150, 100, ((hour_hand-90)*Math.PI)/180, ((hour_hand-90)*Math.PI)/180, false);
  ctx.clearRect(0, 0, 300, 300);
  ctx.stroke();

  ctx.beginPath();
  ctx.moveTo(150, 150);
  ctx.lineWidth = 3;
  ctx.arc(150, 150, 130, ((minute_hand-90)*Math.PI)/180, ((minute_hand-90)*Math.PI)/180, false);
  ctx.stroke();

  ctx.beginPath();
  ctx.moveTo(150, 150);
  ctx.lineWidth = 1;
  ctx.arc(150, 150, 120, ((second_hand-90)*Math.PI)/180, ((second_hand-90)*Math.PI)/180, false);
  ctx.stroke();

  ctx.beginPath();
  ctx.arc(150, 150, 140, 0, Math.PI*2, false);
  ctx.stroke();
  time();
}

function time() { //デジタル時計
  var d = new Date();
  var hour = d.getHours();
  document.getElementById("hour").innerHTML= hour;
  var minute = d.getMinutes();
  document.getElementById("minute").innerHTML= minute;
  var second = d.getSeconds();
  document.getElementById("second").innerHTML= second;
}
```
# 完成画面
![FireShot Capture 6 - Practice - http___localhost_3000_clock.html.png](https://qiita-image-store.s3.amazonaws.com/0/131949/b639c938-bd28-6db2-3c41-f2f814afd475.png)

# デモ
<p data-height="265" data-theme-id="dark" data-slug-hash="yzrwmr" data-default-tab="js,result" data-user="ShoutaWATANABE" data-embed-version="2" data-pen-title="Simple Clock" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/ShoutaWATANABE/pen/yzrwmr/">Simple Clock</a> by ShoutaWATANABE (<a href="https://codepen.io/ShoutaWATANABE">@ShoutaWATANABE</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

# 参考・参照
http://www.html5.jp/canvas/how.html
http://www.html5.jp/canvas/how2.html
Dropbox > UI > 同期後にチェックマークは表示されなくなった

```txt:動作環境
Windows 8.1 Pro (64bit)
Dropbox v37.4.29 (2017/10/22現在)
```

Dropboxのアイコンを見ると、黄色のマークが付いていた。
ここ数年、そういう表示はなかったように思う。

Dropboxの通知を見ると、以下のメッセージが追加されていた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/29cefa99-35f9-2270-c056-7cb0bf550554.png)

同期が終わった時はチェックマークが表示されないようになったようだ。

通常の処理完了時にはあえて通知しない、というのも一つのUIの考えではある。
ユーザ側にとっては、慣れるまでは「同期処理が始まらない？」という小さな混乱を誘発する気はする。

以下の情報が現状のソフトと整合しているのか判断しにくい。
https://www.dropbox.com/help/desktop-web/sync-icons

### 関連?

@ UNIXという考え方 by Mike Gancarz
> 10の小定理
5. 沈黙は金 (詳細なエラーメッセージを出すべきときにも、悪名高いほど沈黙を守る)
GNU screen @MAC でUSBシリアルコンソール接続

GNU screen で　USB　シリアルコンソール接続をする時、毎回「どうやって接続するんだっけ？」となってたのでシェルスクリプトを書いた。

ちなみに、複数USBシリアルコンソールを接続してる場合にも対応してます。（数字を入力して、どのUSBシリアルに接続するか選択する）
自分が、複数個USBシリアル接続して作業することがあるもんでして。

# スクリプト本体
```bash:connect-usbserial.sh
#!/usr/bin/env bash
##########################################
# Update history
# 2017-05-02 first commit
# 2017-10-22 コメントを追記
#
##########################################
# 終了方法 : control + z を押して k

function usage_exit() {
cat <<_EOT_
Usage:
  $0 [-b 9600] [-h]

Description:
  Connect USB serial console @ MAC

Options:
  -b  Baud rate (default : 9600)
  -d  debug mode
  -h  help

screenrc memo:
  escape ^z^z
  bind ^e encoding eucJP UTF-8
  bind ^u encoding UTF-8 UTF-8
  bind ^w encoding SJIS UTF-8

_EOT_
exit 1
}

# 引数が 0 個だとエラー
# if [ $# = 0 ]; then
#     usage_exit
#     exit 1
# fi

# setting
BAUD_RATE="9600"
SCREENRC=~/tmp/connect-usbserial.screenrc

if [ "$OPTIND" = 1 ]; then
    while getopts :b:dh OPT
    do
        case $OPT in
            b)
                BAUD_RATE=$OPTARG
                ;;
            d)
                FLAG_DEBUG="on"
                echo ">>> Debug mode on <<<"
                ;;
            h)
                usage_exit
                ;;
            \?)
                usage_exit
                ;;
        esac
    done
else
    echo "No installed getopts-command." 1>&2
    exit 1
fi
shift $((OPTIND - 1))

# screen の設定ファイル作成
cat <<_EOF_ > $SCREENRC
autodetach off
startup_message off

# key bindings
escape ^z^z

# character code
# defutf8 on
# defkanji UTF-8
# defencoding UTF-8
# encoding UTF-8 UTF-8

bind ^e encoding eucJP UTF-8
bind ^u encoding UTF-8 UTF-8
bind ^w encoding SJIS UTF-8

# logfile
logfile "$HOME/logs/%H_%Y%m%d-%02c-%s.log"
deflog on
logtstamp on
logtstamp string "\n----- SCREEN [%Y/%m/%d %02c %s] %n:%t -----\n"
_EOF_

# ls の結果を配列に入れる
ttyList=(`ls -1 /dev/tty.usbserial*`)
#echo "${ttyList[@]}"; # 配列全て
#echo "${ttyList[0]}"; # 配列の1個目

# usbserial が１個もなかったらエラー
if [ -z "${ttyList[@]}" ]; then
    echo ">>>"
    echo ">>> There is no USB serial tty."
    exit 1
fi

# 接続する usbserial を選択
count=0
for elem in "${ttyList[@]}" ; do
    echo $count : $elem
    count=`expr $count + 1`
done
echo ">>>"
echo ">>> Select the USB serial console."
echo -n ">>> Input the number : "
read line

# 入力された数字に対応する usbserial があるか確認
if [ -z "${ttyList[$line]}" ]; then
    echo ">>> Input error --> ${line}"
    exit 1
fi

if [ "$FLAG_DEBUG" = "on" ]; then
    echo '>>> screen -c' $SCREENRC "${ttyList[$line]}" $BAUD_RATE
    echo ">>> sleep 3"
    sleep 3
fi

# usbserial へ接続
screen -c $SCREENRC "${ttyList[$line]}" $BAUD_RATE

# screen の設定ファイル削除
rm $SCREENRC

echo ">>> ${0} finish <<<"
```
# 実行例

```
$ connect-usbserial.sh
0 : /dev/tty.usbserial-FTFLHK8K
1 : /dev/tty.usbserial-FTXUZ1QS
>>>
>>> Select the USB serial console.
>>> Input the number : 1           <-- 1を入力して Enter 押してる

                                   <--  ここで、コンソール接続されている状態（記載は省略）
                                   <--　Ctrl z + k  --> y(yes) を入力して終了

[screen is terminating]
>>> /Users/xxxxx/bin/connect-usbserial.sh finish <<<
$
```
swiftからKotlinに入門した

直近の業務ではswiftを扱っていますが、プライベートのAndroidアプリをKotlin化してみました。
その時のメモを残していこうと思います。

# if let
```swift:swift
let array: [Int]?
if let array = array {
  print(array.size)
} else {
  print("array is nil")
}
```

```kotlin:kotlin
val array: IntArray?
array?.let {
  print(it.size) // itでarrayにアクセスできます
} ?: run { print("array is nil") }
```

# guard let
```swift:swift
let array: [Int]?
guard let array = array else {
  return
}
```

```kotlin:kotlin
val array: IntArray?
array ?: return
```
または

```kotlin:kotlin
val array: IntArray?
array?.run {
  // nonnullの場合の処理
} ?: run {
  // nullの場合の処理
}
```

# A ?? B
```swift:swift
let str: String?
let value = "test"

str = value ?? "test"
```

```kotlin:kotlin
var str: String?
val value = "test"

str = value ?: "test" // エルビス演算子
```
yum が動かなったときの対処（Cannot open logfile /var/log/yum.log）

# yumが動かなかったときの対処（Cannot open logfile /var/log/yum.log）

## 結論
　yum install を実行したら失敗→rebootしたら問題なく実行できた。
　本来はしっかりとチェックしてからrebootすべき。
　原因：ファイルシステムのエラーが原因でディスクがread-onlyになっていました。

##ログ
vpsを借りてgitをインストールしようとしたら失敗した。

```logos
# yum install git
読み込んだプラグイン:fastestmirror
Cannot open logfile /var/log/yum.log
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 298, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 124, in main
    base.doLock()
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 1851, in doLock
    while not self._lock(lockfile, mypid, 0644):
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 1917, in _lock
    errmsg = _('Could not create lock at %s: %s ') % (filename, str(msg))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 11: ordinal not in range(128)
```

##調査〜復旧

dmesgコマンドでOSのログを確認しました。

```logos
#dmesg
・・・・
JBD2: Detected IO errors while flushing file data on sda1-8
JBD2: Detected IO errors while flushing file data on sda1-8
JBD2: Detected IO errors while flushing file data on sda1-8
・・・・
Aborting journal on device sda1-8.
EXT4-fs error (device sda1): ext4_journal_start_sb: Detected aborted journal
EXT4-fs (sda1): Remounting filesystem read-only
・・・・
```
ファイルシステムがエラーを検知して読み込み専用になったようです。
なにも載っていないサーバなので容赦なくrebootしてみました。（危険！！）

reboot後にログの確認

```logos
#dmesg | tail -50
・・・・
sd 2:0:0:0: [sda] Attached SCSI disk
EXT4-fs (sda1): INFO: recovery required on readonly filesystem
EXT4-fs (sda1): write access will be enabled during recovery
EXT4-fs warning (device sda1): ext4_clear_journal_err: Filesystem error recorded from previous mount: IO failure
EXT4-fs warning (device sda1): ext4_clear_journal_err: Marking fs in need of filesystem check.
EXT4-fs (sda1): recovery complete
EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: 
dracut: Mounted root filesystem /dev/sda1
・・・・
```
問題なく復旧したっぽい。
yumも問題なく実行できました。

##本来すべきことは

今回は壊れても問題ないサーバのため容赦なくリブートしてみました。

ちょっと検索してみると

- ハードディスクが壊れていないかチェック(badblocksコマンド？)
- バックアップの取得
- （壊れていたら）fsckコマンド

などなどあるので慎重に調査のした上で対処してください。

<参考>
[ファイルシステムが読み込み専用になってしまった](http://ymotongpoo.hatenablog.com/entry/20110323/1300882608)
[Ubuntu システムログ その6 - HDDが故障もしくは故障しそうな時に出力されるログ・ファイルのバックアップについて](https://kledgeb.blogspot.jp/2013/07/ubuntu-6-hdd.html)
[Web系エンジニアbcoのメモ帳](http://d.hatena.ne.jp/bco/20101225)
PowerPointやpaintで書いた図を直接Qiitaに張り付ける (Excelの表も可能)

Qiitaの投稿記事に画像を挿入する場合、画像ファイルを指定してアップロードなくても、アプリケーションから直接画像として張り付けることができます。

1. PowerPoint や paint(Windows標準提供の画像編集ソフト)などで貼り付けたい部品や部分または Ctrl+A で全選択
2. Ctrl+C でコピー
3. Qiitaの投稿編集画面に Ctrl+V で貼り付け

これだけで画像がアップロードされて pngファイルへのリンク が生成されます。

画像編集してからアップロードしたい場合は、

1. PowerPoint などで Ctrl+C でコピー
2. paintに Ctrl+V で貼り付け
3. 画像編集
4. paintで張り付ける範囲を選択または Ctrl+A で全選択
5. Qiitaの投稿編集画面に Ctrl+V で貼り付け

参考
[Keynoteで作った図をQiitaに貼るとPNGになる](https://qiita.com/Ryosuke0624/items/9e4a81d16469659c657d)
ゲーム開発におけるgit戦略

# はじめに
ゲーム開発に合ったgit運用を模索する機会があり、その時のメモです。
主にスマートフォンゲーム開発をターゲットにしています。

# リポジトリ分割
リポジトリを作成する際、リリースするタイミングによって分割します。
例えば、Unityの開発でResourcesフォルダ以下をAssetBundle化する場合
Resourcesフォルダをリソースリポジトリに分けて運用を行います。

これは後述するブランチ戦略との相性をよくするためです。

# ブランチ戦略

有名なブランチ戦略
git-flow
github-flow
gitLab-flow
gitworkflows

様々なブランチ戦略がありますが、以下の点からgit-flowをベースにすることにしました。
1. スマートフォンゲーム開発ではリリース作業が明確に存在する点
2. ツールが存在する点(SourceTreeにも内臓)
3. 複数バージョンリリースする点

ただ、gitworkflowsに関してはログを綺麗に保つブランチ戦略のため、併用も可能です。

素のgit-flowではdevelopブランチが一本しかありませんが、
ゲーム開発では複数のバージョンを同時に開発することがあるため、developブランチを複数運用します。
e.g. develop/develop
e.g. develop/1.0.1

※初期化の際に開発ブランチをdevelop/developとして作成します。
※develop/developには次のリリースに必要なものしかマージしてはいけません。


# 開発フロー
初回リリースまでをプロトタイプ期
初回リリース後を運用期とします。

git-flowに関しては、たくさん記事が上がっているのでそちらを参照してください。

## プロトタイプ期
この時期は仕様変更も多く、柔軟な開発を行いたいため
develop/developブランチとFutureブランチのみを利用して、作業を行います。

## 運用期
### 複数バージョンの開発が必要な場合
複数バージョン開発が始まったときはバージョン名で開発ブランチを作成します。
e.g. develop/1.0.2

develop/developブランチには次のリリースに必要なものだけをマージし、
次々以降の機能はバージョンに合ったブランチにマージしていきます。

時折develop/developブランチをdevelop/1.0.2ブランチにマージして整合性を保ちます。

その後、develop/developのリリースが完了したら、develop/1.0.2ブランチをdevelop/developにマージして削除します。


### 旧バージョンを保守する場合

タグからsupportブランチを作成します。
1.0.1 リリース時に1.0.0も保守する場合

e.g. tag/1.0.0 → support/1.0.0 作成

supportブランチ作成後はコミットを行ずに、管理のためだけに使用します。

強制アップデートにより、保守が終わったものは削除します。

## 互換性リストの作成

ゲームは、クライアント、サーバー、リソースなどいくつものシステムが絡み合っているため、
どれか一つをバージョンアップすると正常に動かなくなる可能性があります。
そのため、正常に動くバージョンの組み合わせを記録しておくと何かと便利です。

クライアント、サーバー、リソース等どれか一つでもアップデートを行った場合、
関連リポジトリの最新タグおよびsupportブランチから互換性リストを作成します。
この作業はjenkins等で自動化するといいでしょう。

互換性リストがあることで、確実に動くバージョンの組み合わせにロールバックできるほか、
海外対応などで旧バージョンから追っかける開発をする場合非常に楽になります。

# まとめ
リリースタイミングでリポジトリを分割
git-flowベースでdevelopを複数運用
管理用にsupportブランチを作成
互換性リストの作成

git-flowよりも複雑になっていますが、慣れてしまえは問題ありません。
特に複雑な部分はリリース時の作業のため、この辺りは自動化してしまったほうがいいかもしれません。
[忘備録]OS X上でC言語をsublime text3で実行する

OS Xでc言語を実行する環境を準備しようと思ったが、なかなか参考になる記事が少なかったので、今後の忘備録として軽く記載します。
[環境]OS X
[エディタ]sublime text3
[シェル]zsh

まずは下記のおかやましんいちさんの記事からxcodeをインストールし、gccをインストールしました。
[Macにgccをインストールする](https://qiita.com/ShinichiOkayama/items/962e55ac7f8920a5f007)

インストール後ターミナルでgccがインストールされているかを確認します。

```zsh
[taka.baya@baya]# gcc --version                                                                                                                                                          [/Users/taka.baya]
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.38)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```
これでgccがインストールされてることが確認できました。

sublime textを起動＞ツール＞ビルドシステム＞ビルどシステムの追加を開き次のように記載する

```
{
    "cmd" : ["gcc", "-std=c99", "-o", "$file_base_name", "$file_name"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "gcc '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        }
    ]
}
```

これで完了です。試しに実行して見ます。

<img width="505" alt="スクリーンショット 2017-10-22 15.23.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/154154/1e0f374f-6cde-99b4-1470-6421ec580ada.png">

上手く実行出来たことが確認できました。

#windowsでも実行できるようにした。
windowsではまずMinGWをインストールします。インストール方法については下記の記事を参考に行いました。
[ぱーくん plus ideaさんから](http://web.plus-idea.net/2014/06/mingw-install-2014/)

その後上記同様に
sublime textを起動＞ツール＞ビルドシステム＞ビルどシステムの追加を開き次のように記載する

```
{
    "cmd" : ["gcc", "$file_name", "-o", "${file_base_name}.exe", "&&", "${file_base_name}.exe"],
    "selector" : "source.c",
    "shell" : true,
    "working_dir" : "$file_path"
}
```

こちらも実行の確認することができた。

---
至らない点や追記して欲しいことがあれば、ご指摘の方宜しくお願いします。
JupyterLabのフォント変更（Windows&Anaconda環境)

## 環境
- JupyterLab alpha release version: 0.28.5

今後は設定ファイルのJSONから簡単に変更できるようになるだろうなと思う。
Anacondaを導入していれば以下のコマンドでJupyterLabをインストールできる。

```bash
conda install -c conda-forge jupyterlab
```

## 関連
基本的に以下の記事を参考にしました。
[MacでJupyterLabを試す（黒背景とフォント変更） - Qiita](https://qiita.com/damyarou/items/fd92471f1005a3dc93be)

## 変更方法
以下のパスにあるcssを変更する。

```
Anacondaへのパス\Anaconda3\share\jupyter\lab\themes\@jupyterlab
```


※以下のファイルを変更しても反映されない。

```
Anacondaへのパス\Anaconda3\Lib\site-packages\jupyterlab\themes\@jupyterlab\theme-light-extension
```

1. themeLightを使っている場合は、theme-light-extension\variables.cssを開く。
2. 90行目付近のContent Fontsを変更する。

一例（Ricty Diminishedはインストールする必要あるので、任意のフォントに）

```css
  /* Content Fonts

  Content font variables are used for typography of user generated content.
  */

  --jp-content-font-size: 16px;
  --jp-content-line-height: 1.5;
  --jp-content-font-color0: black;
  --jp-content-font-color1: black;
  --jp-content-font-color2: var(--md-grey-700);
  --jp-content-font-color3: var(--md-grey-500);

  --jp-ui-font-scale-factor: 1.2;
  --jp-ui-font-size0: calc(var(--jp-ui-font-size1)/var(--jp-ui-font-scale-factor));
  --jp-ui-font-size1: 14px; /* Base font size */
  --jp-ui-font-size2: calc(var(--jp-ui-font-size1)*var(--jp-ui-font-scale-factor));
  --jp-ui-font-size3: calc(var(--jp-ui-font-size2)*var(--jp-ui-font-scale-factor));

  --jp-code-font-size: 16px;
  --jp-code-line-height: 1.307;
  --jp-code-padding: 5px;
  --jp-code-font-family: 'Ricty Diminished';
```
Windows10のPowerShellでファイル名のスペースを削除するワンライナー


```ps1
dir | rename-item -newname { $_.name -replace '\s', '' }
```

↑の内容を拡張子.ps1とかにすれば、ダブルクリックとかで実行できるようになります。対象のファイルはカレントディレクトリにあるファイルなので、フォルダ配下全部とかにしたい場合は、dir部分を工夫してください。

また、カレントにあるファイル全部にコマンドをかけるため、スペースが含まれないファイルに対してもrenameを行おうとして下記のエラーが出ます。

```ps1
dir | rename-item -newname { $_.name -replace '\s', '' }
rename-item : ソース パスとターゲット パスを同じにすることはできません。
発生場所 行:1 文字:7
+ dir | rename-item -newname { $_.name -replace '\s', '' }
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (R:\temp:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
```

雑なスクリプトファイルですネ(・∀・)
git cloneしてRocket.Chatを動かしてみる

対象OS : Ubuntu 16.04 LTS (Ubuntu Desktop 日本語 Remix)
Rocket.Chat : 0.59.0 くらいで動作確認。

[本家ドキュメント](https://docs.rocket.chat/developer-guides/pre-requisites/) に書いてある通りなのですが、エラーが出てうろたえたので記載しておきます。
私はMeteorやMongoDBをあまり知りませんが、とりあえず起動まではできました。

## 事前準備
OSのインストール

以下からUbuntu 16.04 LTS (Ubuntu Desktop 日本語 Remix)をダウンロードし、インストールします。
https://www.ubuntulinux.jp/download/ja-remix

最新化

```sh
sudo apt update && sudo apt full-upgrade -y
```

Gitインストール

```sh
sudo apt install git
```

Meteorインストール

```sh
curl https://install.meteor.com/ | sh
```

## clone

```sh
git clone https://github.com/RocketChat/Rocket.Chat.git

# 特定バージョンにする場合
# git checkout refs/tags/0.59.1

cd Rocket.Chat

meteor npm start
```

すると `=> Your application has errors. Waiting for file change.` とエラーが出て止まるので、 Ctrl+Cで終了します。
![error.png](https://qiita-image-store.s3.amazonaws.com/0/154744/dd08ff33-ade2-8130-8c5c-370b81f15280.png)

そして再度 `meteor npm start` を実行すると、今度は正常にサーバーの起動まで行きました。
＃初回起動時にエラーの原因は未調査です。
![success.png](https://qiita-image-store.s3.amazonaws.com/0/154744/2b7d0509-d7da-106a-f959-fb68365b376d.png)

## DBについて
Rocket.Chatというより、Meteorの仕組みのような感じですが、以下、私が引っ掛かった箇所です。

### 接続ポート
上記方法で起動したときのDBのポートは 3001 (Meteor内のMongoDBのデフォルトポートみたい)で接続可能ですが、リモートからの接続はできませんでした。
~/Rocket.Chat/.meteor/local/db にDBの実体があるようなのですが、 mongod.conf がみあたらず・・・

### リモートから接続する
Windowsから[Robo 3T(旧Robomongo)](https://robomongo.org/)を使ってみたのですが、直接続はできずSSH経由で接続できました。
接続設定は、SSHタブの設定と、ConnectionタブのAddressにlocalhost、ポートに3001を指定すればよかったです。

### MongoDBのバージョン確認
Rocket.Chatが起動している状態で、以下の手順で確認できました。

1. Rocket.Chatディレクトリに移動します。
1. `meteor mongo` で接続します。
1. `db.version()` でバージョンが表示されます。
1. `exit` で切断します。

### MeteorデフォルトのDBを使わない。
本格的に調査や開発を行う場合、アプリを起動しないとDBも起動しないのでDBは別で用意したほうが良いと思います。
外部DBを使用するには環境変数を指定して起動すればよいようです。

```sh
export MONGO_URL=mongodb://localhost:27017/parties
meteor npm start
```
Linux版VirtualBoxでUSBを使う方法

今までは、Linux版のVirtualBoxでは、USBが使えないという問題がありました。
sudo adduser <ユーザー名> vboxusers
としても、できませんでしたよね。でも、ついに謎を解明しました。
# これまでの方法
## adduserをしてvboxusersグループに入れてみる
```bash
root@pc:~# adduser <username> vboxusers
root@pc:~#
```
結果→できない
## フィルタをかける
マシン設定の「USB」で、フィルタを追加して、ベンダーIDとプロダクトIDを入れてやる。
結果→できない
#これからはこれでできる！
※Extension Packをインストールしていない方は https://www.virtualbox.org/wiki/Downloads/ の「Oracle VM VirtualBox Extension Pack」のとなりにある「All supported platforms」をクリックしてダウンロード。その後VirtualBoxにD&Dでインストール

```bash
mypc@pc:~$ sudo -i
root@pc:~# adduser <username> vboxusers #念のためvboxusersグループに追加
root@pc:~# apt-get install gksu #gksudoを導入
(省略)
root@pc:~# gksu virtualbox &
```
adduserでvboxusersグループに入れます。
次に、gksudoを導入してvirtualboxをスーパーユーザーで起動します。

**これだけです。**
ちなみに、gksuは仕様上$HOMEを/rootに置き換えますので、VirtualBox VMsディレクトリを自分のホームに置いている人はsudoで構いません。
**Enjoy the good VirtualBox life!**
ざっくばらんメモ_11：kaggle


###kaggle seguro
[code](https://github.com/festa78/kaggle_seguro/blob/master/first_xgboost.ipynb)
まず基本のコンポーネントを実装する．
モデルは動作確認のためシンプルに
xgboostを利用．
結果：LB0.269．ベースラインとしては妥当？
この後はハイパーパラメータチューニングを
トライしてみる．
特に，パラメータ毎の感度解析的の事が出来ると良い．
Firebaseの基本：追加、更新、削除を捕捉する

#これは何？
Firebaseを使ったAuthenticationの方法の一連の作業です。

# 参考にしたサイト
参考というかほぼコピペ。
- YouTunbe: [Getting Started with the Firebase Realtime Database on the Web, Part 2](https://www.youtube.com/watch?v=dBscwaqNPuk)

# 実装
## FirebaseのDatabase
<img width="600" alt="Screen Shot 2017-10-21 at 10.45.37 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/61221/9865c2ab-ea9e-78cd-1558-afc50c414ca8.png">

## HTMLとJavaScript
サンプルではユーザ固有のキー等は別ファイル `key.js` に書き込んでいます。よってこのコードには含まれていませんのでご注意ください。

`hoge.on('[event-name]', (snap) => {})`
で`[event-name]`のイベントを補足できます。`snap`には変更があった値が入ってきます。

````html
<!DOCTYPE html>
<html>
  <head>
    <meat charset="utf-8" />
    <title>Getting Started with the Firebase Realtime Database on the Web, Part 2</title>
  </head>
  <body>
    <pre id="preObject"></pre>

    <ul id="ulList"></ul>

    <script src="./keys.js"></script>
    <script src="https://www.gstatic.com/firebasejs/4.6.0/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/4.6.0/firebase-messaging.js"></script>

    <script src="https://www.gstatic.com/firebasejs/4.6.0/firebase.js"></script>

    <script type="text/javascript">
     firebase.initializeApp(config);

     let preObject = document.querySelector('#preObject');
     let ulList = document.querySelector('#ulList');

     let dbRefObject = firebase.database().ref().child('object');
     let dbRefList = dbRefObject.child('hobbies');


     // Sync object changes
     dbRefObject.on('value', (snap) => {
         preObject.innerText = JSON.stringify(snap.val(), null, 3);
     });

     // Sync list changes
     dbRefList.on('child_added', (snap) => {
         const li = document.createElement('li');
         li.innerText = snap.val();
         li.id = snap.key;
         ulList.appendChild(li);
     });

     dbRefList.on('child_changed', (snap) => {
         const liChanged = document.querySelector('#'+snap.key);
         liChanged.innerText = snap.val();
     });

     dbRefList.on('child_removed', (snap) => {
         const liToRemove = document.querySelector('#'+snap.key);
         liToRemove.remove();
     });

    </script>
  </body>
</html>
````

# 動作させてみる
[ここ](https://youtu.be/dBscwaqNPuk?t=8m50s)と同じなので割愛します😅

# まとめ
本当にお手軽で、しかも簡単、という感想しかない。。。
【Android】RxJavaの非同期処理部分をテストする

RxJavaを使った非同期処理のコードをテストしたいときに、そのままだとエラーになったのでその対処法メモです。

## 結論
テスト時のみ`Schedulers.trampoline()`を使う。

## 環境
RxJava 2.1.4
RxAndroid 2.0.1
Kotlin 1.1.50
Mockito 2.10.0

## エラー内容
```
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.
```

## Scheduler
まずSchedulerのinterfaceを用意

```kotlin:BaseSchedulerProvider.kt
interface BaseSchedulerProvider {
    fun computation(): Scheduler
    fun io(): Scheduler
    fun ui(): Scheduler
}
```

BaseSchedulerProviderを継承したScheduler（実装で利用）

```kotlin:SchedulerProvider.kt
object SchedulerProvider : BaseSchedulerProvider {
    override fun computation(): Scheduler = Schedulers.computation()
    override fun io(): Scheduler = Schedulers.io()
    override fun ui(): Scheduler = AndroidSchedulers.mainThread()
}
```

BaseSchedulerProviderを継承したScheduler（テストで利用）
全て`Schedulers.trampoline()`を返すようにしている。

```kotlin:ImmediateSchedulerProvider.kt
class ImmediateSchedulerProvider : BaseSchedulerProvider {
    override fun computation(): Scheduler = Schedulers.trampoline()
    override fun io(): Scheduler = Schedulers.trampoline()
    override fun ui(): Scheduler = Schedulers.trampoline()
}
```

## 実装
MVPアーキテクチャのPresenterでRxJavaでリクエストしてるところ。（説明のために簡略化してます）
`mSchedulerProvider`は`BaseSchedulerProvider`型のメンバ変数。
実装時はSchedulerに`SchedulerProvider`を利用する。

```kotlin:Presenter.kt
mRepository.getList()
        .subscribeOn(mSchedulerProvider.io())
        .observeOn(mSchedulerProvider.ui())
        .subscribe({
            mView.showList(it)
        }, {
            mView.showError()
        })
```

## テスト
`Repository#getList()`の戻り値を`Mockiot.when()`でモックして、それぞれのパターンに応じてViewの特定のメソッド（今回は`showList()`と`showError()`のみ）が呼ばれているかを`Mockito.verify()`でテストしている。
テスト時はSchedulerに`ImmediateSchedulerProvider`を利用する。

```kotlin:PresenterTest.kt
@Test
fun loadListOk() {
    `when`(getList()).thenReturn(Single.just(mList))
    mPresenter.loadList()
    verify(mView).showList(mItemListWithFooter)
}

@Test
fun loadListEmpty() {
    `when`(getList()).thenReturn(Single.just(arrayListOf()))
    mPresenter.loadList()
    verify(mView).showError()
}

@Test
fun loadListError() {
    `when`(getList()).thenReturn(Single.error(Exception()))
    mPresenter.loadList()
    verify(mView).showError()
}
```

## まとめ
`Schedulers.trampoline()`を使うことでRxJavaを使った非同期処理のところもテストできます。
実際に使うときはDIライブラリ（Daggerなど）でSchedulerを差し替えるようにするのが良さそうです。

## 補足
[RxAndroidPlugin](https://static.javadoc.io/io.reactivex/rxandroid/1.2.1/rx/android/plugins/RxAndroidPlugins.html)の`registerSchedulersHook()`で`getMainThreadScheduler()`をOverrideすることで`AndroidSchedulers.mainThread()`が返すSchedulerを差し替えることもできるっぽいです。


## 参考
googlesamples/android-architecture at todo-mvp-rxjava
https://github.com/googlesamples/android-architecture/tree/todo-mvp-rxjava/


RxAndroidPlugins (rxandroid 1.2.1 API)
https://static.javadoc.io/io.reactivex/rxandroid/1.2.1/rx/android/plugins/RxAndroidPlugins.html

unit testing - Android RxJava 2 JUnit test - getMainLooper in android.os.Looper not mocked RuntimeException - Stack Overflow
https://stackoverflow.com/questions/43356314/android-rxjava-2-junit-test-getmainlooper-in-android-os-looper-not-mocked-runt
mac AndroidStudio emulator が起動しない

#HAXMがないってエラーがでる or KVMがない　VT-x うんたらのエラー

自分用メモ。きれいにまとめる気はない。どシロートなので質問されても何もわからない。

自分の場合は以下で起動するようになった。
いろいろやったので何が効いたのかいまいちわからない。

##HAXMがないってエラーがでる
Tools > Android > SDK Manager　を開き
SDK Toolsタブの[intel x86 Emulator Accelerator (HAXM installer)]がインストールされていなければインストール

###インストール済みになっているのにエラーがでる
intelのHAXMダウンロードサイトでmac用をダウンロードしてインストールする
https://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager-intel-haxm

###こんどはKVMなんたらのエラーがでる。
macの　システム環境設定　> セキュリティとプライバシー を開く。
[ダウンロードしたアプリケーションの実行許可]の下の方に intel なんたらかんたらって出てたので許可をした（許可する前のスクリーンショット撮り忘れた）。
![androidStudio emulater 制限解除.png](https://qiita-image-store.s3.amazonaws.com/0/174834/e50510fd-bde4-d631-e2ae-ea00ecb3e17f.png)
もしかしたらこの時点で復旧したのかもしれないが。。。

その後、Android Studio の Tools > Android > SDK Manager　を開き。
SDK Toolsタブの[intel x86 Emulator Accelerator (HAXM installer)]のチェックを×にしアンインストールして再度インストールで起動するようになった。
Google BigQueryは、分析関数とUDFを活用すると、いい感じの超並列計算機になる

最近、仕事でGoogle BogQueryを使っているのですが、そこでBigQueryのすばらしさに改めて気づいてので記事にしました。

「仕事で使っている」といってもお客様向けのプロダクションサービスとかではなく、実験的なプロジェククトのデータ分析基盤として、なので、いろいろ気づいていないデメリットなんかもあるかもしれませんが、そこは悪しからず。

## UDFと分析関数を活用

で、何がすごいかというと、Queryが早いというのは皆さんご存知とは思いますが、さらにすごいのが [UDF(User Difinition Function)](https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions#supported-external-udf-languages) です。UDFは文字通り自由に定義できる関数で、Queryの中で行単位のデータに対して計算されることができます。データ分析なんかしていると統計的な数字を出したかったり、データを変換したかったりすると思いますが、そんなことが自由自在です。現在は対応している言語はJavaScriptだけなのですが、まぁそこは問題にはならないでしょう。さらにもちろん、BigQueryでは [分析関数/Analytic Functions](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#analytic-functions) が使えますから、行をまたぐような処理はこれを併用していろいろ高度な集計が可能です。

Analytic functionsを使っていい感じに行単位にまとめておき、そこにUDFを使ってBigQuery上で計算をさせれば、BigQueryが超ハイパフォーマンスのデータ加工のための並列コンピューティングとして利用できます。

さらにここの計算リソースはデータの読み込みとは無関係なので、課金周りもまったく気にする必要がありません！(はず)

## 具体例

具体例として私が活用している処理例を紹介します。

時系列のデータを扱っているので、レコードを並べ変えつつ、前後の値からデータを作りたいので、LEADとかLAGを使って1行にまとめ、

```SQL
SELECT
  COALESCE(LEAD(A.count, 1, 0) OVER (PARTITION BY mesh ORDER BY time),0) AS rc10_prev1row,
  COALESCE(LAG(A.count, 1, 0) OVER (PARTITION BY mesh ORDER BY time),0) AS rc10_after1row,
  LEAD(Latitude, 1) OVER (PARTITION BY id ORDER BY time ASC) AS next_latitude,
  LEAD(Longitude, 1) OVER (PARTITION BY id ORDER BY time ASC) AS next_longitude
```

その後、まとめた情報を使って、UDFを使って計算した結果をしまう

さらにすばらしいのは、JavaScriptの処理をGoogleCloudStorageにファイルとしておいておくことができるので、いくら`.js`に、ごちゃごちゃ汚い処理のコードがあったとしても(笑)、Query側からは完全に隠蔽でき、すっきりなんです！再利用性含めたメンテナビリティも改善しますね。

```SQL
CREATE TEMPORARY FUNCTION latlon_to_meshcode(lat FLOAT64, lon FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
    mesh = latlon_to_meshcode(lat, lon);
    return mesh;
"""
OPTIONS (
  library="gs://bq-js-lib/convmesh.js"
);

SELECT
  latlon_to_meshcode(next_latitude, next_longitude) AS next_mesh,
```
こんな感じ。

ね。すっきり。いやぁ、BigQueryすばらしいなぁー:grinning: