OmniAICreator/Qiita-1.07M huggingface dataset:
LCS

- [LCS](https://atcoder.jp/contests/dp/tasks/dp_f)

## コンテスト中の考察

### LCSの大きさの考察

- DPの状態変数を考える。`dp[siまで見たとき][tiまで見たとき]`のように、2つの文字列のどこまで見たかを持っておけば良さそう
- つぎに、dpの意味を考える。`dp[siまで見たとき][tiまで見たとき] = LCSの大きさの最大値`とすれば良さそう
- そんで、遷移を考えてみる。遷移は$S_i = Ti$のときと、そうでないときで分岐しそう。
- $S_i=T_i$のとき、`dp[si][ti] ← dp[si-1][ti-1] + 1`になりそう。$S_i, T_i$共に1文字進むイメージで。
- $S_i \not= Ti$のとき、`dp[si][ti] ← max(dp[si-1][ti], dp[si][ti-1])`になりそう。さっきDPの意味を考えた時に`dp[si][ti]`が$S_i, T_i$まで見た時のLCSの最大値とした。なので、DPの値を継続させる必要があるからこんな遷移になる。あと、最後に`dp[sのサイズ][tのサイズ]`でLCSの最大値が出てくるようにしたいからこの遷移を書く
- コード書いたら、サンプルケースの文字列の大きさと同じになったのでこのDPは成功してそう



### LCS復元の考察

- `dp[si][ti] ← dp[si-1][ti-1]`への遷移で数が増えていればそこが文字列一致部分だから、それを元に復元コードを書く。けど失敗
- DPの値を使っていろんな復元方法を考えたけど、全部失敗
- なので、文字列を元に復元方法を考えた。でも失敗
- わからずにコンテスト終了



## LCSの復元方法

- DPの復元は、遷移がどこからきたのかを記録しておくことで復元できるそうだ。
- 図を描くとなんとなくわかる。DPテーブルで遷移の矢印を書いて、ゴールから矢印をたどっていけば復元できることがわかる。



## [コード](https://atcoder.jp/contests/dp/submissions/3959228)

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

string s, t;
int dp[3333][3333]; // dp[si][tj]: s[i], t[j]まで見たときのLCSの大きさの最大値
int pre[3333][3333]; // どこから遷移して来たかを記録。左から: 3, 上から: 2, 左上から: 1

// DPでLCSの大きさを求める
void lcs() {
  int n = s.size(), m = t.size();
  s = "+" + s;
  t = "*" + t;

  fill(dp[0], dp[1111], 0LL);
  fill(pre[0], pre[1111], 0LL);

  for (int si = 1; si <= n; si++) {
    for (int ti = 1; ti <= m; ti++) {
      if (s[si] == t[ti]) {
        dp[si][ti] = dp[si-1][ti-1] + 1;
        pre[si][ti] = 1;
      } else if (dp[si-1][ti] > dp[si][ti-1]) {
        dp[si][ti] = dp[si-1][ti];
        pre[si][ti] = 2;
      } else {
        dp[si][ti] = dp[si][ti-1];
        pre[si][ti] = 3;
      }
    }
  }
}

// LCSの文字列自体を求める
string solve() {
  string ans = "";

  int si = s.size() - 1;
  int ti = t.size() - 1;
  while (si >= 1 && ti >= 1) {
    if (pre[si][ti] == 1) { // 左上に遷移
      ans += s[si];
      si--, ti--;
    } else if (pre[si][ti] == 2) { // 上に遷移
      si--;
    } else { // 左に遷移
      ti--;
    }
  }

  reverse(ans.begin(), ans.end());
  return ans;
}

signed main() {
  cin >> s >> t;
  lcs(); // dpテーブルを埋める
  cout << solve() << endl;

  return 0;
}
```



## 要点

- DPがどこから遷移してきたかという情報があれば復元できる



## メモ

- [AOJのLCS](https://onlinejudge.u-aizu.ac.jp/status/users/nomi/submissions/1/ALDS1_10_C/judge/3327324/C++14)
- [えびちゃんが投げてくれた復元問題](https://yukicoder.me/problems/417)
- [えびちゃん2](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0155)
- [えびちゃん3](https://csacademy.com/contest/archive/task/classic-task/)
- [DP復元記事](https://qiita.com/drken/items/0c7bab0384438f285f93)
scriptからマテリアルの色、発光を変える。

scriptからマテリアルの色、発光を変える。
http://dnasoftwares.hatenablog.com/entry/2015/03/19/100108

```leftHandObj.GetComponent<Renderer>().material.SetColor("_EmissionColor", Color.yellow);
```
だけで動かないなーと思っていたが、
```leftHandObj.GetComponent<Renderer>().material.EnableKeyword("_EMISSION")
```
も必要ということが分かった！

```leftHandObj.GetComponent<Renderer>().material.SetColor("_EmissionColor", Color.clear);```

これで発光をオフに
AWS Lambda for Ruby を使って Lambda から Thinreports ライブラリで生成したPDFをS3に保存してみるメモ 

[AWS Lambda の Ruby サポート を受けてRubyのインストールからデプロイまでやってみたメモ](https://qiita.com/sy250f/items/a3cfab59b51a5b2f7f7a)の続きです。

前回は、 AWS Lambda のRubyサポートを受けて、LambdaにアップロードしたRubyスクリプトを API Gateway のエンドポイントを叩いて表示されるテストまでやって見ました。

今回は、LambdaのRubyスクリプトでPDFを生成し、それをS3に保存して見ます。
PDF生成のライブラリには[Thinreports](http://www.thinreports.org/)を利用します。

# Rubyコード
まず初めにRubyのコードを載せておきます。


```ruby
# coding: utf-8

require 'thinreports' #Thinreportsのライブラリを読み込み
require 'aws-sdk-s3' #AWS Ruby SDK を読み込み

def lambda_handler(event:, context:)
    # TODO implement
    region = 'region' #S3バケットのリージョンを設定。アジアパシフィック (東京)の場合は 'ap-northeast-1'
    bucket_name = 'bucket_name' #S3バケット名を設定
    key = 'put-hello-world.pdf' #生成するファイル名を設定
    s3 = Aws::S3::Resource.new(region: region)
    obj = s3.bucket(bucket_name).object(key)
    
    #Thinreportsを利用してPDFファイルを生成
    report = Thinreports::Report.new layout: 'hello_world'
    # 1st page
    report.start_new_page
    report.page.item(:world).value('Thinreports')
    report.page.item(:thinreports).value('Thinreports')

    #S3に書き込み
    obj.put(body: report.generate)
end
```

#今後
後ほど下記を追加していきます。

 - S3バケットの設定
 - Ruby SDK の設定
 - Thinreportsの設定
  - ThinreportsからPDFを生成して表示させるテスト
  - kintoneからkintone.poxy経由でLambdaにレコードを渡すテスト

# S3バケットの設定
S3バケットを作成します。
その際に下記のようにアクセス権を設定することで外部からのアクセスを禁止しています。

- バケットのデータへのパブリックアクセスを許可しない（標準の設定のままとします）
- バケットポリシーにて作成したLambdaからS3にオブジェクトの読み込みと書き込みを許可します

```json
{
    "Version": "2012-10-17",
    "Id": "Policy9999999999999",
    "Statement": [
        {
            "Sid": "9999999999999",
            "Effect": "Allow",
            "Principal": {
                "AWS": "Lambdaを実行するIAMユーザーのARN"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "作成したバケットのARN/*"
        }
    ]
}
```
バケットポリシーはポリシーエディタにて生成した物を貼り付けます。
他にも良いやり方があるかもしれませんので、上記は参考程度にしてください。
ひとまず上記の設定で、作成したS3バケットに作成したLambdaから読み込みと書き込みが出来るようになるかと思います。

# IAMユーザーの設定
上記で設定したバケットポリシーに指定したIAMユーザーの設定です。

 - ポリシーに「AWSLambdaBasicExecutionRole」を設定
上記の設定でLambdaにアクセスする最低限の権限を持つIAMユーザーが作成出来ます。

# Lambdaの設定
Lambdaに実行ロールを設定します。ロールはあらかじめIAMにて作成しておきます。
今回は下記のようにロールを作成しました。

 - 「AmazonAPIGatewayPushToCloudWatchLogs」
後々必要なAPI GatewayのログをCloudWatchに書き込むようにしています。

S3バケットへの権限は前段のようにバケット側で許可することも出来ますが、Labmda側に設定するロールに付与することも出来ます。
その場合は、Lambda実行ロールにインラインポリシーを追加することで可能となります。

# 参考リンク

 - AWS SDK for Ruby(V3) https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html
A-Frameで始めるWebVR 　"Hello World"やってみよう

##A-Frameとは
「A-Frame」はFireFoxで有名なMozillaのVRチームが開発したWebVR用のオープンソースフレームワークです。web上で3Dを描画するための標準仕様「webGL」や、そのwebGLを簡単に扱えるようにするjavascriptライブラリ「three.js」を用いてweb上にVRに特化したコンテンツを作成することができます。


また構築にあたりjavascriptをゴリゴリに書くのではなく、htmlタグとしてシーンやカメラ、オブジェクトなどの設定ができるため、かなりとっつきやすくなっています。さっそくはじめてみましょう．

[関連サイト] 
A-Frame
https://aframe.io/

##Hello Worldをやってみよう

特にダウンロードなどは必要ありません．
htmlファイルを作成し，以下のコードを打ち込むことで，BOXが現れます．

```html

<!DOCTYPE>
<html>
	<head>
		<script src="https://aframe.io/releases/0.2.0/aframe.min.js"></script>
	</head>
	<body>
		<a-scene>
			<a-box color="#4CC3D9" width="2" height="1" depth="2" position="0 0 0" scale="1 3 1">
			</a-box>
			<a-sky color="#ECECEC"></a-sky>
		</a-scene>
	</body>
</html>
```


BOXが表示されたら成功です．
![A-Frame_HelloWorld.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/6ef6e198-d72e-05e2-085e-5e57217fd8bc.png)


このBoxをマウスでグリグリ動かすことができるので体験してみてください．
通常のVRの開発と比較にならないくらいお手軽で，衝撃的でした．
マザーボードがイカれた物理マシンを引っ越し

- 旧いPCサーバや業務PCの物理マシンが起動しなくなったりしたもの。
- 最新だったり最新じゃなかったりする物理マシンに移行。
- 主記憶デバイスは旧マシンより取り外し、新マシンに取り付けて起動する。
- Linuxの場合は比較的簡単。Windowsは難易度が上がる。

# 事例1 Windows7で動いていた業務システム

- 旧マシン：Lenovo H30 （CPU AMD E1-6010 APUのコンパクトデスクトップ）
- 新マシン：Fujitsu TX1310 M3
- OS Windows7 Professional 64bit

## 要点 

### 中継ぎに、TX1310M1を使用する

- 旧マシンの ChipsetはAMD APUに統合、AMDのAHCIドライバで動作しているだろうと推測。
- 新マシンはChipsetはIntel C236。BIOSでRAIDかAHCIモードしか選べないのでこのままHDDを移植しても起動しない。
- 中継ぎに、TX1310M1を使います。これで起動することを確認します。

### USB2インターフェースを使用する。

- 新マシンはUSB2.0インターフェースやPS/2インターフェースが無く、そのままではWindows7のHDDを移植してもキーボード・マウスが使えない。
- USB2.0インターフェースを新マシンに接続し、設定完了までのキーボード・マウスの接続用に使用する
![IMG_20190103_162354.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/ca4a5eff-3491-76b8-6d6b-1361535d07bf.jpeg)

## 実際の作業

- Lenovo H30 で故障診断。電源ユニットの問題ではないことを確認、マザーボードの問題なのでHDDを取り外し、移植を行うことに決定。
- 中継ぎマシン TX1310M1 に HDD を接続、これで起動することを確認します。
- 中継ぎマシン TX1310M1 の SATA インターフェースは BIOS 上でデフォルトで AHCI に設定されています。それで起動しない場合は、 BIOS 設定を IDE に変更して起動します。
- 起動したら、TX1310M1用の ChipsetDriver(F1017120.exeを実行)をインストールします。
- IDEモードで起草した場合は場合はレジストリエディタを使ってAHCIモードに変更します。
- HDD を取り外し、新マシンの TX1310M3 につなぎます。
- PCI変換ボードにUSB2.0ボードを刺してキーボードなどをつなげます。
- これで起動し、ドライバ類をインストールします。

## トラブルシュート

今回、TX1310M3用に適用するドライバが間違って、起動しなくなってしまいました。
その場合、「前回起動時の構成」で起動し、正しいドライバを入れ直します。

# 事例2 Debian Squeeze で動いていたWebサーバ

- 旧マシン：HP ProLiant DL160 G6 Server
 - intel 5520チップセット
 - HP smart array P410 controller
 - 4ベイ × 3.5" SAS/SATA でRAIDを構成
![IMG_20190107_154017.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/dd186c9d-1bbf-3f5f-519e-679625e9f7fa.jpeg)

- 新マシン：自作機
 - リプレイスして廃棄待ちだったクライアントPC 
 - AsusTek M5A88-Mマザーボード
 -  AMD 880G/SB850チップセット
 
![IMG_20190107_150123.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/b9209777-6536-b613-48e8-4555192afcb2.jpeg)

## 要点

- HP ProLiant DL160 G6 Serverのマザーボード故障で起動しない
- バックアップ等から新しいシステムを作るのに時間がかかるのでそれまでのつなぎ
- 主記憶はRAIDコントローラーで動いています。RAIDコントローラーを移植します。

## 実際の作業

- HP Proliant DL160 からストレージを取り外し
- RAIDコントローラのインターフェースが特殊なので、バックプレーンごと取り外す
![IMG_20190107_145943 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/77a0de44-7240-40bf-198d-cd48c8b3ac62.jpeg)
- バックプレーンに接続する電源コネクタをATX電源にはんだづけ
![IMG_20190107_150625.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/6930d867-4e40-19a0-b6e7-682aa3259fb8.jpeg)
- RAIDコントローラを移植し、ストレージに接続
![IMG_20190107_150003.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/ed1ef252-dc28-b0ea-2331-f7f03b9c3f9b.jpeg)
- 起動テスト

```

Slot 2  HP Smart Array P41B Controller     Initialzing...
```
- このまま10分ほど立ったら起動する。
- /etc/udev/rules.d/70-persistent-net.rules を編集、ネットワークの設定をNICの変更に対応させる。
- 19インチシャーシに組換え、ラックに仮収納。
-![IMG_20190107_153912.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/972093f4-1452-7ede-f5a4-218250195c16.jpeg)



# トラブルシューティング

- HP smart array P410 controller は RAID 構成をバッテリで保存している。
- うっかりバッテリ端子を外してしまったが、自動認識されて一安心。
- ![IMG_20190104_112628.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/a11e09b1-885b-07b3-bc38-b510a1075fb3.jpeg)
Segmented Controlの幅の調整の仕方

下の画像のように`Auto Layout`を使って`Table`の幅に`Segmented Control`の幅を合わせたいときのやり方
![one.png](https://qiita-image-store.s3.amazonaws.com/0/67153/98678d02-2483-a948-8e86-ec0f97ac9831.png)

1. `Segmented Control`を選択してユーティリティエリアで`Distribution`を`Fill`に設定する．

![two.png](https://qiita-image-store.s3.amazonaws.com/0/67153/7aa0299b-2f0e-e76b-8c90-bb9ab863ff4f.png)

2. モノサシのところで機能を持たせている(ボタンを配置してある）`Segment`の幅を指定して`Fixed`にする．

![three.png](https://qiita-image-store.s3.amazonaws.com/0/67153/e8f2e4a9-96d9-a11f-fad3-e103a9ab29ec.png)

3. `Auto Layout`で`Table`と`Segmented Control`の幅が同じになるように設定する．
Swift：NSGradientで透明なグラデーションを作るときのTips

# はじめに
NSGradientを使って透明なグラデーションを作る際，ぜひ押さえておきたい点があるので共有します．
単色で透明度に変化のあるグラデーションを作る際は，終端が不透明度0であっても`NSColor.clear`は使わないでください！
燻んだ汚い感じの色になってしまいます．

## テスト実装
```swift:
import Cocoa

class CustomView: NSView {
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        
        let colorStart = NSColor(red: 0.6, green: 0.2, blue: 0.3, alpha: 0.8)
        let colorEndA = NSColor(red: 0.6, green: 0.2, blue: 0.3, alpha: 0.0)
        let colorEndB = NSColor.clear
        
        let gradientA = NSGradient(starting: colorStart, ending: colorEndA)
        gradientA?.draw(in: NSRect(x: 5, y: 5, width: 100, height: 100), angle: 90)
        
        let gradientB = NSGradient(starting: colorStart, ending: colorEndB)
        gradientB?.draw(in: NSRect(x: 110, y: 5, width: 100, height: 100), angle: 90)
    }
    
}
```

## 実行結果
![gradient.png](https://qiita-image-store.s3.amazonaws.com/0/67153/7cdb428d-8646-3468-093e-a3261c1106e9.png)

どうやら`NSColor.clear`の実態は，rgbの値全てに0を代入しているようで，黒の不透明度0ということらしいです．
したがって途中グレーが混ざってしまうようです．
Swift：NSPopUpButtonに関する小ネタ

## はじめに
NSPopUpButtonをコードで生成してカスタマイズする際の小ネタの忘備録です．
意外と実装に手こずったので参考までに．

## actionの紐付け方
senderを使ってうまいことやります．

```swift:
var popUp: NSPopUpButton!

override func awakeFromNib() {
    super.awakeFromNib()
    popUp = NSPopUpButton(frame: NSRect(x: 0, y: 0, width: 60, height: 40))

    popUp.target = self
    popUp.action = #selector(selectPopUp(_:))
}

@objc func selectPopUp(_ sender: NSPopUpButton) {
    // sender.selectedTag() とか sender.numberOfItemsを使った処理
}
```

## arrow positionの変え方
一度`NSPopUpButtonCell`にキャストしてから，`arroPosition`を変更します．

```swift:
let popUp = NSPopUpButton(frame: NSRect(x: 0, y: 0, width: 60, height: 40))

if let cell = popUp.cell as? NSPopUpButtonCell {
    cell.arrowPosition = NSPopUpButton.ArrowPosition.arrowAtBottom
}
```

## 画像選択式ポップアップの作成例

```swift:例：色選択ポップアップ
var colorPopUp: NSPopUpButton!

override func awakeFromNib() {
    super.awakeFromNib()
    let colorPopUp = NSPopUpButton(frame: NSRect(x: 0, y: 0, width: 60, height: 40))
    colorPopUp.addItems(withTitles: ["", "", ""])
    for (index, item) in colorPopUp.itemArray.enumerated() {
        item.tag = index
        item.image = createColorImage(index)
    }
    colorPopUp.imagePosition = NSControl.ImagePosition.imageOnly
    // 角丸などやるとなお良し
    // colorPopUp.wantsLayer = true
    // colorPopUp.layer?.cornerRadius = 12
}

func createColorImage(_ num: Int) -> NSImage {
    let image = NSImage(size: NSSize(width: 28, height: 28))
    image.lockFocus()
    let rect = NSRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28))
    let path = NSBezierPath(roundedRect: rect, xRadius: 8, yRadius: 8)
    NSColor.色名.setFill() //numに基づいて色を決定
    path.fill()
    image.unlockFocus()
    return image
}
```

## その他属性変更

```swift:
// ベゼルスタイルの変更
popUp.bezelStyle = NSButton.BezelStyle.shadowlessSquare

// 外観モードの変更
popUp.appearance = NSAppearance(named: NSAppearance.Name.aqua)
```
clojure.string/replace の使い方


replace には下記のように、第２引数に正規表現、第３引数に関数を渡すことができるが Clojure のドキュメント https://clojuredocs.org/clojure.string/replace には渡す関数についての説明が一切ないので調べる。

```
(clojure.string/replace string regex function)
```

以下の通り実行した結果、関数は正規表現にマッチした文字列毎に呼び出され、引数としてマッチした文字列全体 `$&` と括弧で記憶した部分文字列 `$1 $2 ..` が Vector で渡される。`[$& $1 $2 $3 ...]`

```Clojure
(defn r-str [a]
  (println (type a))
  (println a)
  (println (clojure.string/join " : " a))
  (clojure.string/join " " a))
```

```Clojure
(clojure.string/replace "#1 #12 #123 #1234" #"#(\d)(\d+)" r-str)
```

```shell-session
clojure.lang.PersistentVector
[#12 1 2]
#12 : 1 : 2
clojure.lang.PersistentVector
[#123 1 23]
#123 : 1 : 23
clojure.lang.PersistentVector
[#1234 1 234]
#1234 : 1 : 234
```

# 余談

Clojure のドキュメント(doc 含む)は記述方法に統一感が無いので読んで動作が推測できるようになるのはどれくらいかかるのか検討もつかない。
RubyのLevenshtein距離ライブラリはどれを使えば良いか？

## 結論

[damerau-levenshtein](https://github.com/GlobalNamesArchitecture/damerau-levenshtein#damerau-levenshtein)を使えばOK

## 比較結果サマリー

damerau-levenshteinは、UTF-8をサポートしていてかつ、短い文字列と長い文字列でそこそこ高速なので、damerau-levenshteinを使うと良いと思います。

|Gem|短い文字列パフォーマンス|長い文字列パフォーマンス|UTF-8サポート|
|:-:|:-:|:-:|:-:|
|gem 'damerau-levenshtein'|1.673M|8.370k|o|
|gem 'levenshtein'|98.976k|20.000|?|
|gem 'levenshtein-ffi'|5.860M|1.716k|x|

パフォーマンス: 大きいほど速い

## 比較詳細

https://github.com/contribu/ruby_levenshtein_bench
Conway's Game of Life実装

#このゲームは？

ケンブリッジの数学者ジョンコンウェイによって発明されて、Game of Life「日本語：ライフゲーム」は「ゼロプレーヤー」セルオートマトンゲームです。生きることや、死ぬことや、増殖することができる細胞の集まりからなります。

それについての詳細はこちら：https://ja.wikipedia.org/wiki/ライフゲーム

哲学的およびその他の科学的意義はさておき「やっぱりこのポイントも面白いと思うですけれども」、プログラミングの高度な概念を学びたいとき、新しい方法で実装すると、いい勉強になると思っています。

##コーディングプロセス

他の言語をテストしてみたかったですが、JavaFX Vanillaを使うことを決めました。

細胞はライフゲームの重要な要素です。

####細胞の生活状態：
1) **生きている**　「1で表す」
2) **死んでいる**　「0で表す」

####隣の細胞の生活状態に基づいて、ルールに従っている：
1) 隣細胞は2つ以下生きているなら：**死ぬ**
2) 2つか3つの隣細胞が住んでいるなら：**生き続ける**
3) 隣細胞は３つ以上生きているなら：**死ぬ**
4) 死んだ細胞は正確に3つの隣があったら：**生きる細胞になる**

**僕の実装は：**

```java:cell.java
public void update() {
    int active_neighbors = countLivingNeighbors();
    if(active_neighbors == 3) turnAlive();
    else if(this.getStatus() == 1 && (active_neighbors < 2 || active_neighbors > 3)) turnDead();
}
```

**隣の細胞をチェックするコード：**

```java:cell.java
private int getNeighbor(int x, int y) {
    if(POSX + x < 0 ||POSY +  y < 0 || POSX + x >= this.map.size() || POSY + y >= this.map.get(0).size()) 
        return 0;
    
    return this.map.get(POSX + x).get(POSY + y).getStatus();
}
```
このコードで、範囲外の細胞は死んだ細胞であると仮定する。


##ユーザーインターフェース

JavaFXの技術を使って：

**グリッドを書くコード**

```java
private void drawGrid(Group root) {
    for(int x = 0; x < loopsize; x ++) {
        ArrayList<Cell> row = new ArrayList<>();
        for (int y = 0; y < loopsize; y ++) {
            Cell rect = new Cell(gridmap, x, y,x * CELLSIZE, y * CELLSIZE, CELLSIZE - 1,CELLSIZE - 1);
            rect.setStroke(Color.GHOSTWHITE);
            rect.setStrokeWidth(1);
            row.add(rect);
            root.getChildren().add(rect);
        }
        gridmap.add(row);
    }
    update();
}
```

このコードで、セルタイプの2Dアレイリストで、ボードを設定する

**アニメーションコード**

```java
time = new AnimationTimer() {
    long old_time = -1;
    @Override
    public void handle(long now) {
        if(old_time == -1) old_time = now / 1000000;
        long new_time = now / 1000000;
        if( (new_time - old_time) > TIMER_SPEED ) {
            update();
            TIMELINE++;
            updateTitle();
            old_time = now / 1000000;
        }
    }
};
```

*タイマースピードはナノ秒で測定して、様々な計算が必要*

**スペースバーのキーコントロール**

```java
scene.addEventFilter(KeyEvent.KEY_PRESSED, ke -> {
    if (ke.getCode() == KeyCode.SPACE) {
        if(running) {
            running = false;
            time.stop();
            RUNNING_STATUS = STOPPED_STRING;
            updateTitle();
        }
        else {
            running = true;
            time.start();
            RUNNING_STATUS = RUNNING_STRING;
            updateTitle();
        }
        
        ke.consume(); // <-- stops passing the event to next node
    }
});
```

#完成

で、それで、実装をできました！
![gol.png](https://qiita-image-store.s3.amazonaws.com/0/293084/83d0b79b-4846-8841-0449-902cedbd1ac5.png)

やってみたら
レポシトリーがこちら：　https://gitlab.com/bananasinmyear/game-of-life

#振り返り

このプロジェクトはコードすることが楽しかった！
色々な問題を遭遇したとき、新しい解決策を考えて、
いい練習だと思います！
ずっと改善したいと思っています！

####開発したい改善特徴:

死の崩壊の遅れ
メモリ管理効率
UIボターン

###お楽しみに！
【Unity】キャラクターが走る先に床の自動生成してどこまでも走れる

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Xcode10.1

実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1082314515172122624
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">床の✨自動生成✨を勉強したよぉ。<br>❤️v(≧∇≦)v ❤️<br>キャラクターが走る先に、床を生成して、どこまでも走れる。<br>Animator Controller　走りを入れてみたよぉ。<br>床から落ちないように、制御も入れてみたよぉ。<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://t.co/biP0WTi6nO">pic.twitter.com/biP0WTi6nO</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1082314515172122624?ref_src=twsrc%5Etfw">2019年1月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


1.床のAssets「Yughues Free Pills Materials」をインポートする。
<img width="1028" alt="スクリーンショット 2019-01-07 22.21.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/dc3df87d-b906-6058-ac20-82fd5136a7d9.png">

2.空のAssets「Skybox Volume 2 (Nebula)」をインポートする
<img width="1084" alt="スクリーンショット 2019-01-08 0.58.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/18b35f06-bbf4-5e69-e161-ee8af2523a8f.png">

3.Main Camera カメラ追従
<img width="1202" alt="スクリーンショット 2019-01-08 1.41.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/3a161788-3a31-c6f4-f3f9-2272be4d0466.png">

4.Character Controllerをセットする
<img width="1206" alt="スクリーンショット 2019-01-08 1.43.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/2d9e1cad-f8bc-70a1-7ed8-8b1a1fa28fbc.png">

５.Stage1を作る
<img width="1195" alt="スクリーンショット 2019-01-08 1.45.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/78d1650f-d4cf-6380-90ad-71b0265b9be7.png">

６.Stage2を作る
<img width="1185" alt="スクリーンショット 2019-01-08 1.46.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/47d8da94-1132-0b64-0f99-fda9ef927331.png">


7.GameObjectでStageGeneratorを作る
<img width="1178" alt="スクリーンショット 2019-01-08 1.48.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/f21cd3af-5529-c301-129c-632aa7f651b2.png">

</br>
</br>
</br>
#<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【Unity】やっとVR用のゲームができました！！<br>シーンの遷移も、スマホにVR用の出力もできました！！<br>やった！！<br>v(≧∇≦)v イェェ～イ♪<a href="https://twitter.com/hashtag/unity?src=hash&amp;ref_src=twsrc%5Etfw">#unity</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://t.co/AEsbXdrnhX">pic.twitter.com/AEsbXdrnhX</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1076511052043448320?ref_src=twsrc%5Etfw">2018年12月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
初めてのGCP(google cloud platform) part2 (php+smarty環境)

1から、GCPにphp+smarty環境を構築してみました。
結構はまったので、メモ的な備忘録。

◆一番はまったところ
smartyのコンパイルファイル生成する方法にはまった。
下記２点を設定する必要があった。
・php.iniで、バケット指定
・index.phpでgsバケット/フォルダ指定が必要

◆準備
・gae必要ファイル
app.yaml　　　(index.php指定)
php.ini　　　 （※追加ファイル)
index.php
/templates/
　　┗index.tpl
/smarty/　　　(※追加プラグイン)
　　┗(公式SmartyからDLしたファイル中、/libs/の中身をUPロードする)
　　　　※libs中身がsmarty本体


・ストレージのバケット作成
　　①gcp左上メニューから→ストレージ→ブラウザ→バケット作成
　　　例）バケット：test1作成　(Regional / ASIA-NORTHEAST1)
　　②バケットにフォルダ作成 (smartyコンパイル・キャッシュファイル用)
　　　　┣/compiled/ (フォルダ)
　　　　┗/cache/ (フォルダ)

　※バケット権限設定を閲覧者：読み込み→書き込みに変更している
　　→必要かは調査しきれてない・・(ファイル生成するので必要とおもう・・多分)



◆手順の流れ
①app.yamlがある同じ場所にphp.iniファイルを作成

・app.yaml

```
runtime: php55
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: index.php
```
・php.ini

```
allow_url_include = "1"
google_app_engine.allow_include_gs_buckets = "バケット名(のみ)"
```
(※バケット名→gcpメニュー：ストレージ/ブラウザで、バケット作成したバケット名)
例)google_app_engine.allow_include_gs_buckets = "test1"


②app.yamlで指定してるindex.php

・index.php

```
<?php
// Smartyクラス読込
require_once("smarty/Smarty.class.php");

// Smartyインスタンス生成
$smarty = new Smarty();

// テンプレートディレクトリ
$smarty->template_dir = "./templates/";

// コンパイルディレクトリ
$smarty->compile_dir= "gs://バケット名/compiled/";
$smarty->cache_dir="gs://バケット名/cache/";
$smarty->display('index.tpl');
```
例)
$smarty->compile_dir= "gs://test1/compiled/";
$smarty->cache_dir="gs://test1/cache/";

・index.tpl

```
<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8">
     <title>初めてのGCP php+Smarty環境</title>
</head>
<body>
    表示テスト
</body>
</html>
<script>
  {literal}
    alert("表示OK");
  {/literal}
</script>
```

③デプロイして確認。

```
gcloud app deploy　※デプロイ
gcloud app browse　※url表示
```
url飛んで、アラート「表示OK」でたら成功。
【tex】一行の中に右揃えと左揃えを混在したい！ので無理やりやったという話

# ことの発端
卒業論文の概要集ってあるじゃないですか．
あなたの大学にもありますよね／ありましたよね？
あるという前提で話をします．
そこで，まあ，どの大学にもあるかと思いますが，フォーマットっていう，
雛形ですね，まあ，こういうふうに書きましょうみたいなものがですね，
pdfで送られてきたりするわけですよ．

それがこんな感じで．（身バレするので完成品を先行公開です笑）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321497/3d6d92af-a3b2-a93e-b8c1-f9fb25803774.png)

（左寄せで専攻名を書き，同じ行の右寄せで名前……？？）

正直なところ，これをMicrosoft Wordでやる方法すら知らなかったので，texで卒論を書いている私としてはハ？という心境でした．
ですから，つい先程まではこの通りに書くのを諦めていたのですが，

**なんとかなりました～～～～！！**

という話です．

# 環境
$\LaTeX$
Windows 7 （なんでもいいとおもいます）
Texmaker （TexLiveでもいけるとおもいます）

# やりかた
## おさらい
まず先述の「Microsoft Wordで右揃えと左揃えを混在させる」方法ですが，ぐぐったら出てきました．
のでメモしておきます．
[行内で右揃えと左揃えを混在したい（タブ） - 教えて！HELPDESK](http://office-qa.com/Word/135.htm)
いやすごいですね，便利ですね～．

要約すると，

1. 左揃えの文字を書く
2. 右端にカーソルを動かし，右寄せのアイコンが出てきたらダブルクリック
3. 文字を書く（左寄せの文字を書いた同じ行に右寄せに書けるよ！）

です．

こんな．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321497/574af5d1-881f-11d1-4f89-f9bf942ae65a.png)

## texで一行の中に右揃えと左揃えを混在させるぞ
まず普通にtexでタイトル，著者，所属を表示させようとするとこうなるんですよ．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/321497/acf6fb5d-1522-39a6-55d7-b11d95e07859.png)
texの中身は以下です．

```demo1.tex
\documentclass[twocolumn, a4paper]{ieicejsp}
\usepackage{pxrubrica}%ルビ

\title{{\bf たいとる～～～～～}}
 
  \author{
    \ruby{山田太郎}{やま|だ|た|ろう}\\
    指導教員 田中たかし\\
    担当教員 佐藤やまと
	}
	\affliate{
	〇〇専攻 △△研究
	}  

\begin{document}
\maketitle
\section{はじめに}
ここから2カラムなんですよ～
\end{document}
```

ちなみに，本文は２カラムを求められていたためこうなっています．

テンプレートに沿っていない上に，
ここで使ってるスタイルファイルがそもそもtexに最初から入っているやつじゃないんですよね．
ハイダメ～．

ルビのパッケージは最初から入っていました．

では，以下に先述の完成例を出力したコード（？）を書きますね．

```demo2.tex
\documentclass[twocolumn, a4paper]{jarticle}
\usepackage{pxrubrica}%ルビ

\begin{document}
\twocolumn[
\begin{center}
{\LARGE\bf たいとる～～～～～}
\end{center}
\vspace*{0.5cm}
\begin{flushright}
〇〇専攻\hspace{\fill}\ruby{山田太郎}{やま|だ|た|ろう}\\
△△研究\hspace{\fill}指導教員 田中たかし\\
担当教員 佐藤やまと\\
\end{flushright}
]
\vspace*{0.5cm}
\section{はじめに}
ここから2カラムなんですよ～
\end{document}
```

違いを説明しますと，

まず，`\maketitle`がないですね！
はい！これでは無理でした！
ので，やめました．プリアンブルに書くのは諦めて，本文の領域に書いています．
タイトルも`\begin{center}`とかやって書いているのがわかりますね．
あと，タイトルや著者の箇所は段組みとかしないでぶち抜きたいので，`\twocolumn[]`で囲っています．

で，今回の主役！**`\hspace{\fill}`**です！
これは，できるだけ空白を入れてやるぞ！という気概を持ったスペースらしく，
前の文字が左揃えになり，後の文字が右揃えになります．
便利ですね～．

いいかんじの行間にするために，`\vspace*{}`を入れたりしています．
アスタリスクを入れないとうまくいかないんですよね～なんででしょう．

# おわり
論文の概要は書けたものの，本文が終わっていません！がんばりま～す！
Claudia.jsの始め方

## はじめに

サーバレスアプリケーションを構築するためにClaudia.jsを利用する。
Claudia.jsは以下の特徴がある。

- AWSのAPI GatewayとLambdaを用いたREST APIを構築できる
- 構築に利用する環境は、Node.jsである

## 実施環境

Mac 10.14.2
node 11.4.0
npm 6.5.0

## 開発環境構築

npmにより以下をインストールする。

```
$ npm i claudia -g
```

プロジェクトのフォルダを作成し、package.jsonを作成する。

```
$ mkdir test-api
$ cd test-api
$ npm init
```

プロジェクトに必要なパッケージをインストールする。

```
$ npm i -S claudia-api-builder
$ npm i -S aws-sdk
```

サンプルのアプリを作成する(チュートリアルと同じ)。

```JS:app.js
var ApiBuilder = require('claudia-api-builder')
var api = new ApiBuilder()

module.exports = api

api.get('/hello', function() {
  'use strict'
  return 'hello claudia.js'
})
```

AWSで以下を許可するポリシーを作成しIAMユーザにアタッチする。

- API Gateway：フルアクセス
- IAM : 完全: リスト, 読み込み, アクセス権限の管理 制限: 書き込み
- Lambda : 制限: リスト, 読み込み, 書き込み

上記IAMユーザのアクセスキー及びシークレットアクセスキーを生成する。

生成したアクセスキー及びシークレットキーを.aws/credentialsに書き込む。

```:credentials
[claudia]
aws_access_key_id = xxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

ここではプロファイル名をclaudiaとした。

## AWSへのデプロイ

最初のデプロイは以下コマンドで実施する。

```
$ AWS_PROFILE=claudia claudia create --name testserver --region ap-northeast-1 --api-module app
```

実行した結果以下の情報がclaudia.jsonに出力される。

```JS:claudia.json
{
  "lambda": {
    "role": "testserver-executor",
    "name": "testserver",
    "region": "ap-northeast-1"
  },
  "api": {
    "id": "zzzzzzzzzz",
    "module": "app"
  }
}
```

以降、app.jsの修正を行った後は以下のコマンドで更新する(アクセスキー及びシークレットアクセスキーを特定するために最初にプロファイル名であるclaudiaを指定する)。

```
$ AWS_PROFILE=claudia claudia update
```

## 動作確認

デプロイが成功したらWebブラウザで以下にアクセスする。

https://<claudia.jsonに出力されたid>.execute-api.ap-northeast-1.amazonaws.com/latest/hello

その結果、以下が返却されたら成功である。

```
hello claudia.js
```
「Go言語でつくるインタプリタ」のつづき ~for文を実装してみる~

「[Go言語でつくるインタプリタ](https://www.oreilly.co.jp/books/9784873118222/)」で作ったインタプリタにfor文を実装してみました。
ちなみに、[前回は再代入可能な変数を実装しました。](https://qiita.com/tatsumack/items/2f725e7eb5524d9c3f31)

# 仕様
今回実装するfor文の書式は以下の通り。

```swift

for ( var i = 0; i < 10; i = i + 1) { // 初期化; 継続条件; 増分処理
    puts(i); // 文
}
```

# 字句解析
`for`をキーワードに追加します。

```go:token.go
var keywords = map[string]TokenType{
    ...
    "for":    FOR,
}
```

# 構文解析
for文を表現するASTのNodeを以下のように定義します。

```go:ast.go
type ForStatement struct {
	Token            token.Token
	InitialStatement Statement       // 初期化
	Condition        Expression      // 継続条件
	PostStatement    Statement       // 増分処理
	Block            *BlockStatement // 本体のブロック
}
```

そして、以下のように構文解析を行います。

```go:parser.go
// "for"のTokenを読み込むと呼ばれる関数
func (p *Parser) parseForStatement() *ast.ForStatement {
	stmt := &ast.ForStatement{Token: p.curToken}

	// forの次は"("
	if !p.expectPeek(token.LPAREN) {
		return nil
	}
	p.nextToken()

	// 初期化の文の解析
	stmt.InitialStatement = p.parseStatement()
	p.nextToken()

	// 継続条件の式の解析
	stmt.Condition = p.parseExpression(LOWEST)
	if !p.expectPeek(token.SEMICOLON) {
		return nil
	}
	p.nextToken()

	// 増分処理の文の解析
	stmt.PostStatement = p.parseStatement()

	// 増分処理の次は")"のはず。ただし、増分処理が空の場合はすでに")"が読まれている。
	if p.peekTokenIs(token.RPAREN) {
		p.nextToken()
	}
	p.nextToken()

	// 本体の文の解析
	stmt.Block = p.parseBlockStatement()

	return stmt
}
```

# 評価

評価は以下の通り。

```go:evaluator.go
// for文のNodeを評価するときに呼ばれる関数
func evalForStatement(stmt *ast.ForStatement, env *object.Environment) object.Object {
	// 初期化の文を評価
	initStmt := Eval(stmt.InitialStatement, env)
	if isError(initStmt) {
		return initStmt
	}

	var result object.Object

	for {
		// まず継続条件を評価
		condition := Eval(stmt.Condition, env)
		if isError(condition) {
			return condition
		}
		if !isTruthy(condition) {
			// 評価結果が偽だったらループを抜ける
			break
		}

		// 本体の文を評価
		result = Eval(stmt.Block, env)
		// エラーもしくはreturnで返り値が渡ってきたらそのまま返す
		if isError(result) || isReturn(result) { 
			return result
		}

		// 増分処理の文を評価
		postStmt := Eval(stmt.PostStatement, env)
		if isError(postStmt) {
			return postStmt
		}
	}

	return result
}
```
これで実装完了です。

# REPLで試してみる

```
>> for (var i = 0; i < 10; i = i + 1) { puts(i); }       
0
1
2
3
4
5
6
7
8
9
```
ちゃんと動いてそうですね :tada:

# さいごに
この記事では一部のコードしか記載しなかったので、全体の差分が見たい方は [こちらのPR](https://github.com/tatsumack/monkey/pull/2)をご覧ください。
Leap MotionとVRプロダクトを開発方法

今、VRのプロダクトは本当に前進ですので、たくさんエンジンとプラットフォームをVRのためにAPIを作りました。Leap Motionも作る。
Leap MotionでVRプロダクトの開発方法が３つあります。

##LeapUnreal

![image.png](https://qiita-image-store.s3.amazonaws.com/0/293090/9f16f553-c759-c9a7-f582-f05e795bbb1c.png)

LeapUnrealはunrealエンジンのLeap Motionのプラグインです

Unreal Engineは、ゲームのようなVRを開発するためにLeap Motionをコラボレーションするエンジンです。

セットアップ：
1．最後のバージョンのLeap Motionドライバーをインストールする。
2．新しいプロジェクトを始める。
3．Unrealエンジンのために最後のLeap Motion Orion SDKをダウンロードする。
4．Unrealエンジンのでは、プラグインをプロジェクトのルートフォルダにドラッグとドロップする。
5．開発にプラグインを使う。

プラグインがOnになったあとは、デフォルトのポーンをLeaphandsPawnに変更できる

Unrealエンジンでは、いくつかの手ジェスチャーがあります。例えば、PinchとGrab、そして他のジェスチャーもうあります。

これはLeapUnrealの[Git](https://github.com/leapmotion/LeapUnrealModules)です.

もっとディテールこのリンクを読んでください。

##Leap Motion Unity Modules
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293090/9f00d91d-c1b1-3afd-702d-00b7dd4be055.png)

Leap MotionのためにUnityに4つモジュールがあります。
1．Core :　全部のモジュールのdependencyです.
2．Interaction Engine : APIの対応の物理です。
3．Graphic Renderer : 全部のカーブと３D、ダイナミックなインターフェースをデンデルするためです。
４．Hands Module :　３DのアセットをLeap handsで使えるようにするために必要なツールを提供します。

CoreはUnityモジュールのための唯一のDependencyです。Unityに新しプロジェクトを始めるの時、最後のバージョンをダウンロードしか必要です。

CoreにｘLeap Motion でxRを開発のためにLeap Rig　Prefabがあります。UnityにLeap Motion VRを開発の時Orionアセットしか必要です。

セットアップ：
１．Leap Motion OrionソフトウェアとOculus　Runtimeが必要。
２．[Unity Core](https://developer.leapmotion.com/unity/#5436356)アセットをダウンロードする。
３。新しプロジェクトを始める。
４．Unityにアセットのタブをクリックしてパッケージをインポートする。
５．ここから３つフォルダーがあります。プラグインとLeapCフォルダーは全てのLeap MotionAPIばバインディングのフォルダーですそしてLeap MotionフォルダーはPreafabsやスクリプトと場面のフォルダーです。

##LeapC
LeapCはLeap Motionから追跡データにアクセスするためのC-StyleAPIです。これはC言語でプロジェクトを使うことができる。

##最終に：
Leap MotionでVRプロダクトを作る時に、UnrealエンジンとUnityで一番いい方法です、Leap MotionUnrealエンジンとUnityのためにSDKをどんどん改善している。

##レファレンス

[イメージ](http://blog.leapmotion.com/)上のイメージおソースです。
[leapC ガイド](https://developer.leapmotion.com/documentation/v4/index.html)これはLeapCのSDKとやり方です。
追伸。そろそろおまえもstationでslackやWebアプリを一括管理をするように。　母より

みなさん、slackを開きすぎてブラウザのタブが煩雑になったりしていませんか？
gmailやtwitter,GoogleDrive,githubのタブを開いたり閉じたりめんどくさくないですか？

stationを使うと、Webアプリを一括管理できて、ブラウザで見るより効率化できます。

自分はプログラム歴13年、フリーランス歴4年の[@望月](https://twitter.com/freemotio)と申します。
stationをもう6ヶ月以上使っていて、とても良いアプリだと感じたので紹介しようと思いました。
stationを使う事でブラウザでWebアプリ開きすぎ問題を解決しました。

今回はstationの概要と登録したアプリ、使用感を紹介します。

stationは誰でも簡単に使えるので、アプリを一括管理して効率化しましょう！

## stationってなに？

![stationtop.jpg](https://qiita-image-store.s3.amazonaws.com/0/18377/e0aa6382-f363-5c4f-9a99-6538a59fe69f.jpeg)

https://getstation.com/
stationはモダンな人の為のスマートワークステーションです。
全てのWebアプリケーションを一箇所にまとめることができます。
ブラウザのタブでGmailやgithub、gitlabのページを開いていて、
タブをなくしたことはありませんか？

stationは自動的にアプリケーションをグループ毎に管理します。
バラバラにブラウザで管理していたアプリが一箇所にまとまるので、
とても作業が早くなり時間を節約できます。
ブラウザでタブを固定するのではなく、stationを使って一元管理する事ができます。

## 自分の感じたstationの良いところ

- Slackを複数立ち上げても動作が安定。
- 対応アプリが600以上ある。主要Webアプリに対応。
- PCを立ち上げたときに自動的に立ち上がるので楽。
- Twitter 見れる
- Franz（同じ一括管理アプリ）よりも動作が安定。
- Googleアプリのほとんどに対応。
- UIが洗練されていて、使いやすい。

## 自分が登録しているWebアプリ

![slack.jpg](https://qiita-image-store.s3.amazonaws.com/0/18377/617f9d21-845d-692e-ed37-4fc08b604a8b.jpeg)

- チームのSlack
- 会社全体のSlack
- 協力会社のSlack
- お客さんとやり取りするSlack
- 情報収集のためのモヒカンSlack
- 自分専用のぼっちSlack
- Google Keep
- Gmail
- GoogleDrive
- gitlab
- Netlify
- Twitter
- TweetDeck
- Google Cloud
- Google Search
- Google Analytics
- Google AdWords

かなりたくさん追加してますね。
こんなにも沢山のアプリを追加しても、
動作が不安定になることもなくサクサクと動きます。

## まとめ・感想

やっぱりWebアプリをブラウザで開いて使っていると、
何がどこにあるのかいちいち探すのも手間だし、
ブックマークをして閉じたり開いたりするのも面倒くさいです。

やりがちなのが、ブラウザを2個立ち上げて、
閉じる順番を間違えるとタブが復元しないで、
消えちゃったりすることもあるんですよね。
stationを使っていればこんなことはありません。

stationを使う前はFranzを使っていたのですが、
バックエンドのサーバーが不安定で、
突然ログインできなくなることが３回起きたんですね。

Franzは動作も若干不安定で代わりのツールを探していて、
stationにたどり着きました。
もうかれこれ6ヶ月くらいは使っていますが、非常に気に入っています。

## 最後に

以上、stationの紹介と使ってみての感想でした。
ダウンロードと設定インストールは、ポチポチ指示に従って進んでいけば簡単にできると思います。

[@クラウドランス望月](https://twitter.com/freemotio)の技術ブログ[【札幌のフリーランスブログ】](https://cloudlance-motio.work/)ではフリーランス界隈の情報や
最新のIT情報の発信していますので、よろしくお願いします。
それでは、モダンなツールstationをぜひ使ってみてくださいー！
Asterisk slin(Signed-LINear)フォーマットを新しいSoXで変換する手順


# Asterisk slin(Signed-LINear)フォーマットを新しいSoXで変換する手順

Asteriskで使用するslinフォーマットの音声ファイルを変換する手順は
[voip-info.org で公開されているドキュメント](https://www.voip-info.org/convert-wav-audio-files-for-use-in-asterisk/)にありますが、使用している[SoX](http://sox.sourceforge.net/)のバージョンが古く、sox-14.4.0以降のバージョンでは変換できないため、新しいバージョンに対応した変換手順のメモを残しておきます。


## WAV to slin

    (short form)
    $ sox test.wav -t raw -r 8000 -c 1 test.slin
    (long form)
    $ sox test.wav --type raw --rate 8000 --channels 1 test.slin

    $ file test.slin
    test.slin: data

## slin to WAV

    (short form)
    $ sox -t raw -r 8000 -c 1 -b 16 -e signed-integer test.slin -t wav test2.wav
    (long form)
    $ sox --type raw --rate 8000 --channels 1 --bits 16 --encoding signed-integer test.slin \
	    --type wav test2.wav

    $ file test2.wav
    test2.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 8000 Hz

## 参考資料

* [Convert WAV audio files for use in Asterisk - VoIP-Info](https://www.voip-info.org/convert-wav-audio-files-for-use-in-asterisk/)
* [SoX - Sound eXchange | HomePage](http://sox.sourceforge.net/)
String#===の、String#to_str定義時の挙動が微妙な件


https://docs.ruby-lang.org/ja/2.5.0/method/String/i/=3d=3d.html

これを見たときに、

```ruby
class A
	def to_str
	end
	def === pair
		true
	end
end

p("" === A.new)
```

このコードの実行結果を予想してみてください。

多分trueになると思うじゃないですか！

**実はこのコード、falseが出力されます！**

本当にtrueになるのは、

```ruby
class A
	def to_str
	end
	def == pair # === から == に変わったよ！
		true
	end
end

p("" === A.new)
```
こんなコードになります。

この挙動だと、case句では簡潔に書きたいけど、==で直接評価する程でもないようなオブジェクトを作ったときに困る気がします。(困ってます)

ちなみに英語版ではもっとはっきりと書かれています。
https://docs.ruby-lang.org/en/2.5.0/String.html#method-i-3D-3D-3D

そんな変な挙動のお話でした。

`ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]`
Nuxtでvue-analytics(URLとタイトルのズレとか）

Nuxt.jsで静的書き出し（universal&generate）を行いましが、GoogleAnalyticsのところで少し工夫が必要でした。
その備忘録になります。

## 前提
Nuxt.jsでのサイト構築はSPAモードでいくつか経験していましたが、今回はページ数も少なく更新も手動なので、universalでのgenerateを選択しました。
universalとgenerateについてはこちらに詳しくあります。

- [nuxt.js(v2)でgenerate納品する前にやっておきたい設定](https://qiita.com/amishiro/items/11bd642728f6b5838189)

#### 環境
- nuxt: "^2.0.0"
- [vue-analytics](https://github.com/MatteoGabriele/vue-analytics): "^5.16.1"
- npm

## やろうとしたこと
サイトが完成に近づいたので、GAを組み込もうと思いました。以前使用したこともあり、[公式](https://ja.nuxtjs.org/faq/google-analytics/)でも紹介されている[analytics-module](https://github.com/nuxt-community/analytics-module)を導入しました。
ただ、なぜかエラーが発生したので、こちらのモジュールを使うのを諦めました。（このエラーは当方の環境依存かもしれません）

そこで上記モジュールも使っている、[vue-analytics](https://github.com/MatteoGabriele/vue-analytics)を使うことにしました。導入はさほど難しくなく、npmしてpluginファイルを追加します。nuxtなのでpluginsフォルダに下記pluginファイルを追加します。

```js:vue-ga.js
import Vue from 'vue';
import VueAnalytics from 'vue-analytics';
//
export default async function ({ app: { router } }) {
  Vue.use(VueAnalytics, {
    id: 'UA-1234567-0',
    router
  });
}
```
```js:nuxt.confg.js
plugins: [
  { src: '~/plugins/vue-ga', ssr: false }
]
```
これでページ遷移したときにGAを発行してくれます。簡単ですね。
ただ、ここで問題が発生しました。ChromeプラグインのGAデバッガで確認していると、ページタイトルに正常な値が入っていません。遷移前のページタイトルが送られています。URLが正しいのでまーいいかなと思いましたが、少し粘ってみました。

## ページタイトルを正確なものに
### URLとタイトルのズレ
先ずページのURLとページタイトルがズレているのを修正します。いろいろ調べたのですが、routerに頼るのではなくmountedで呼ぶのが良いみたいです。[こちら](https://github.com/MatteoGabriele/vue-analytics/issues/32)で議論されていて参考にしました。
pageのvueファイルに下記を追加しました。


```vue:page.vue
<script>
export default {
  head () {
    return {
      title: 'Post',
    }
  },
  mounted () {
    this.$ga.page({
      page: this.$route.path,
      title: this.$metaInfo.title,
      location: window.location.href
    });
  }
}
</script>
```

- page
    - $routeからパスを取得
- title
    - $metaInfoからtitleを取得
- location
    - window.locationから取得

特に変わったところはなく、期待した結果になりました。
#### titleTemplate
ただ、今回ページタイトルはtitleTemplateを使っています。titleTemplateはnuxt.config.jsで指定して、サイト全体の共通したタイトルスタイルを設定するものです。

```js:nuxt.config.js

module.exports = {
  mode: 'universal',
  head: {
    titleTemplate: '%s | Qiita',
  }
}
```
この場合に先程のページで期待するのは「Post | Qiita」というタイトルです。ですが、先程の設定では「Post」となります。$metaInfoはページのmetaへアクセスするものだからです。
そこでプロパティを色々探していたらtitleTemplateを取得出来たので、下記のように書き直しました。

```vue:page.vue
<script>
export default {
  mounted () {
    // ここでtitleTemplateの中身を置換
    var pageTitle = this.$router.app.$options.head.titleTemplate.replace('%s', this.$metaInfo.title);
    this.$ga.page({
      page: this.$route.path,
      title: pageTitle,
      location: window.location.href
    });
  }
}
</script>
```

えらく長いですが、routerのapp.$optionsにheadが有り、titleTemplateにアクセス出来ました。あとは、pageの$metaInfo.titleと置換すれば、nuxtが表示してくれているページタイトルと同じものがGAに送ることが出来ます。

## まとめ
スマートでは無いかもしれませんが、vue-analyticsを使って期待した結果になりました。
各ページに書くのは見た目にも保守的にもアレなので、本来はpluginかmiddlewareにすべきだと思います。今回はページ数が少なかったので、記事の通りmountedに書いています。
中国からSFTPを使ってS3を使用する

## はじめに
ファイル連携は業務システムであれば、今でもよく使われる連携方法の一つです。
一昔前はファイル連携するとなれば、高価なファイル転送ツールを購入していた（しかもその機能の２０％も使用しない）時期もありました。

しかし、今はクラウド環境が気軽に使えるので、S3を経由してファイル連携すれば安価に連携環境を構築することができるでしょう。もちろん、適切なIAM振り出しとACL設定をすることでセキュリティを担保することも可能ですし、Lambdaを使ったイベントトリガーを使用すればリアルタイムでの取り込みや、ファイルアップロード後のイベント通知も可能です。

中国を考慮しなくてよいのであれば、これらの機能でファイル連携することができます。しかし、中国では[グレートファイアウォール](https://ja.wikipedia.org/wiki/%E9%87%91%E7%9B%BE)と呼ばれる検閲システムがあり、S3は使用できないのが現状です。

そこで、AWSが2018年11月26日にローンチした[AWS Transfer for SFTP](https://aws.amazon.com/jp/blogs/news/new-aws-transfer-for-sftp-fully-managed-sftp-service-for-amazon-s3/)を使るとよいのでは、というのがこの記事の内容です。

## 中国からはS3が使えないのか
先ほど述べた通り、中国からはS3が使えません。正確には、S3のエンドポイントがグレートファイアウォールによってアクセスブロックされています。
エンドポイントがアクセス可能かどうかはComparitechが提供している[Test if a site is blocked in China](https://www.comparitech.com/privacy-security-tools/blockedinchina/)というサイトから確認できます。なお、AWSの各ドメインは[AWS のリージョンとエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html)に一覧があり、今回、S3のエンドポイントは`s3-ap-northeast-1.amazonaws.com`で確認たところ、全て使用不可になりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134221/710bed81-58d3-fbb3-78b9-f14ea872e119.png)

試しに、AWS Transfer for SFTPのエンドポイント`transfer.ap-northeast-1.amazonaws.com `で確認すると使用可能となります。これで中国からSFTP経由でS3を操作できる見込みが立ちました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134221/8353df80-3b82-4452-71aa-9291efc5db72.png)

## AWS Transfer for SFTPの設定方法

いつもお世話になっているクラスメソッドのブログ[「新サービスAWS Transfer for SFTPを使って、WinSCPからS3へアクセスする #reinvent」](https://dev.classmethod.jp/cloud/aws/try-aws-transfer-for-sftp/)が大変参考になりました。

SFTPサーバにはRoute53のエイリアス機能を設定することができます。（既存のDNSにサブドメインをつけて設定するとDNSレコードはCNAMEで自動的に作成されます。Aではない。）

## おわりに
中国からのアクセス制限はグレートファイアウォール以外にも、プロバイダによって制限が異なると聞いたことがあります。従って、実証しないと確証は得られません。
もし、皆さんがファイル連携でS3を使用する際は、要件定義の段階で中国が連携先に含まれるかを確認することで、対応方法を予め特定することができるのかと思います。

この記事は私の狭い知識の中で書かれたものです。もし、中国とのファイル連携でよりよい方法がありましたら、コメントいただけると幸いです。
atcoder ABC110 D問題

今回は方針は数学的な問題だったが全くできなかった。
https://atcoder.jp/contests/abc110/tasks/abc110_d
#方針
まず素因数分解を考える。MについてM = p<sub>1</sub><sup>q<sub>1</sub></sup> p<sub>2</sub><sup>q<sub>2</sub></sup>p<sub>3</sub><sup>q<sub>3</sub></sup>　と表せた時、M=a<sub>1</sub>a<sub>2</sub>a<sub>3</sub>の組み合わせは、それぞれのp<sub>i</sub>について、q<sub>i</sub>+N-1の中からq<sub>i</sub>を選ぶ組み合わせの数の積となる。また、今回は、答えについて1000000007で割ったあまりを求めるという操作がある。普通、足し算や引き算や掛け算ではさほど問題ではないが、割り算の時の場合、計算結果が変わる可能性も多いにあるので、ただ単にmodで割るわけにはいかない。ここで逆元を使う。

#逆元
b/a ≡ b*a<sup>p-2</sup> (mod 1000000007)
これによって正確に値を求めることができる。なおpがmodとなり桁がすごいことになるので、aのp-2乗を素早く求める必要がある。そこで、二分累乗というテクニックを使う。

#二分累乗
aのx乗を求める際に、再帰を使うことで高速に求めるテクニック。実装例は以下の通り、

```java
static long modpow(long a,long p){
		if(p == 0){
			return 1;
		}
		if(p % 2 == 0){
			long halfp = p/2;
			long half = modpow(a, halfp);
			return half*half%pow;
		}else{                       //桁が奇数の時の調整
			return a*modpow(a, p-1)%pow;
		}
	}

```

#参考url
https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a#4-%E7%B4%AF%E4%B9%97-an
AWSのサブドメインの設定の盲点

AWSで作ったwordpressのサイトで、同一内容のサイトがあるので、セーフモードで動いていますという趣旨のメッセーが管理画面のダッシュボードに表示されていました。

私が設定したのを忘れたサブドメインが使えるようになっているのでは？と思い、AWSとお名前.comの管理画面で確認していました。
でも、今、問題になっているサブドメインを設定した形跡がありませんでした。

誰かにハッキングされてサイトを複製されたのでは？と思っていまい、セキュリティ強化も行いました。

**Route53の設定で、Aレコードにサブドメインを設定する際に、アスタリスク「*」をサブドメインの所に入力することは、絶対に止めましょう。**

サブドメインをなんでもありの＊を使って＊.example.comと使えるようにすると、誰かが適用にサブドメインを付けてURLを作った場合、ちゃんと正規のウェブサイトにアクセスできてしまいます。
www.example.com
とアクセスしたいときなど正しくサブドメインの文字を設定しましょう。
**何でもありの*を使うと、誰かに適当にサブドメインを作られてしまうリスクがあります。**

私が勉強不足で知らなかっただけなのかもしれませんが、私の失敗が誰かの失敗を防ぐことに役立てばと思い、記事を書きました。
VPSでブラウザからアクセスできなかった話

初めてVPSを契約して、SSHの設定やWebサーバの設定を終え、満を持してブラウザからアクセスしようとしたときにハマったので、経緯を残しておく。

## 環境
* centOS7.6(重要)
* apache
    * nginxでも再現する

## 原因
80ポート(ブラウザからアクセスするためのhttpで使われるポート)がファイアウォールで遮断されていたため

## 解決策
早い話がファイアウォールの設定を変更して80ポートへのアクセスを許可すれば良い。

centOS7から「firewalld」というファイアウォールが初期状態で動作している。
また、この初期設定で80ポートへのアクセスが遮断されているので変更する。

### firewalldの設定変更と再起動
```bash:firewalldの設定変更と再起動
# 設定変更。httpを追加って書いてある。
firewall-cmd --add-service=http --zone=public --permanent

# 再起動
firewall-cmd --reload
```

Webサーバソフトを再起動してブラウザからIPアドレスでアクセスして確認。
(DNS設定後ならドメインでも可能。)

## 解決までに確認したこと
* そもそもVPSは起動してる？
    * conohaのコンソールから確認した 
* nginxは起動してる？(最初はapacheでなくnginxで設定してた)
    * ```systemctl restart nginx```でOK 
* ドキュメントルートとパーミッションあってる？
    * 合ってた。
    * そもそも、ドキュメントルート間違ってたらnginx起動しなさそうだし、パーミッション違うなら403とか返ってきそうなもんだよね。
* apacheは起動してる？
    * 以下、略。
* DNS設定大丈夫？
    * DNSチェッカーを使って確認したが疎通確認できず
    * 念のため、ドメイン会社のコンソールとVPS会社のコンソールから設定されているか確認した。
* IPで接続できる？
    * DNS設定失敗の疑いがあったため、IPで接続試行。
    * 失敗したのでもっと前に原因があることが判明。
* Webサーバのログ確認
    * apacheやnginxのログファイルを確認した
    * ログ一切排出なし。これはおかしい
* 接続を遮断するなにかがあるはず...
    * いろいろググってたら、プロキシやファイアウォールの疑いは？って意見があったので、```centOS7 ファイアウォール```のクエリでようやく解決した。

## ひとこと
1年もWebエンジニアやってましたが、本物のサーバを素の状態からチューニングするのは初めてでした。
ファイアウォールとかインフラのおじちゃんがやってくれるヤツというイメージしかなかったので反省です。
同時に、今までなかった知見を得られたのは少なからず収穫かなと思いました。
今後もしっかり戒めていきます。
Windows関連まとめ(随時更新予定)

# Excel関連


## ピボットテーブル(VBA - csv自動読込)
```vb:csvImport.vba
Private Sub csvImport()

    Dim strPath As String
    Dim qtCsv   As QueryTable
    
    strPath = "D:\Angular\codeCount.csv"
    Set qtCsv = Sheet1.QueryTables.Add(Connection:="TEXT;" & strPath, _
        Destination:=Sheet1.Range("B2")) '取り込むCSVパスと、取り込み先のシート、セルを指定
    
    With qtCsv
        .TextFileCommaDelimiter = True 'カンマ区切りの指定
        .TextFileParseType = xlDelimited   ' 区切り文字の形式
        .TextFileStartRow = 1 '開始行の指定
        .TextFileTextQualifier = xlTextQualifierDoubleQuote '引用符の指定
        .TextFilePlatform = 932 '文字コード指定
        .RefreshStyle = xlOverwriteCells '表示されるセルに上書き
        .Refresh 'QueryTablesオブジェクトを更新し、シート上に出力
        .Delete 'QueryTables.Addメソッドで取り込んだCSVとの接続を解除
    End With
 
End Sub

Private Sub Workbook_Open()

    csvImport

End Sub
```


# WinRM関連
◆Windows Server 2012 リモート デスクトップ環境の構成について
　https://blogs.technet.microsoft.com/askcorejp/2012/12/27/windows-server-2012/

◆Windows Server 2012 ドメイン コントローラーで “リモート デスクトップ サービスのインストール” ができない。
　http://support.microsoft.com/kb/2795837

◆PowerShellを使ってリモートPCからWindowsサーバに接続
　https://usado.jp/spdsk/2018/05/11/post-3678/
　　※Enter-PSSession -ComputerName <サーバ名> -Credential Workgroup\Username

◆[WinRM/WinRS] 簡単リモート管理！WMI の代わりに使ってみませんか？
　https://blogs.technet.microsoft.com/jpilmblg/2010/10/26/winrmwinrs-wmi-6531/

◆MCSA Windows Server 2012リモートサーバ管理
　https://www.kenschool.jp/blog/?p=1602

2. [リモート デスクトップ セッション ホスト] 役割サービスをインストールします。
> Add-WindowsFeature -Name RDS-RD-Server
3. [デスクトップ エクスペリエンス] をインストールします。
> Add-WindowsFeature -Name Desktop-Experience
4. [ライセンス診断] ツールをインストールします。
> Add-WindowsFeature -Name RSAT-RDS-Licensing-Diagnosis-UI

Get-WindowsFeature
Remove-WindowsFeature
vue.js(nuxt.js)を理解していない初心者がポートフォリオを作る

# 初めに
Hello 2019, Hello vue.js.
この記事はフロントエンド初心者がvue.jsを使って作ったポートフォリオを披露する記事です。
今年の自身のテーマはフロントエンド元年ということで、普段サーバーサイドのJavaエンジニアですがフロント技術を身につけていきたいです。

# 環境整備
- vue-cliをのインストール
 
 ```
 npm install -g vue-cli
 ```

- starterテンプレートを使用してプロジェクトを作成

```
 vue init nuxt/starter nuxt-example
```

※どうやらnuxt/starterテンプレートは非推奨とのこと。
今後は npx create-nuxt-appを使いましょう。
[nuxt-community/starter-template](https://github.com/nuxt-community/starter-template)

- プロジェクトの実行
 
```
cd nuxt-example // プロジェクトのディレクトリに移動
npm install     // package.jsonを元にモジュールをinstall
npm run dev     // Nuxtをローカルで起動
```
これで[http://localhost:3000/](http://localhost:3000/)にアクセスすると画面が描画されていることを確認できます。

# 作成したもの
自身のポートフォリオを作成しました。
作成したものはGitHubPagesを使ってホスティングしています。
[nuxt-portfolio](https://kidoto.github.io/nuxt-portfolio/)

<img width="1677" alt="スクリーンショット 2019-01-07 23.00.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/215082/6d221808-0657-b6bd-13b5-9b9bac143402.png">

<img width="1545" alt="スクリーンショット 2019-01-07 23.05.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/215082/93ab9e0a-777d-fc34-381f-afdb9cf46023.png">

Carrierのページだけvue.jsらしいことをしていて、v-forで描画しているcarrierに、案件の年、概要とインデックスを保持しており、
対象の行にマウスをhoverすると案件詳細として定義していた、配列のインデックスに対応する文字列をmsg,msg2に描画します。
~~これ絶対正解じゃないやつー~~

```vue:carrier.vue（一部）
      <table class="carrier" width="90%">
        <tr>
          <th v-for='head in header' v-bind:key='head.item'>
            {{ head.item }}
          </th>
        </tr>
        <tr v-for="cal in carrier" v-bind:key='cal.key' v-bind:class='cal.index' v-on:mouseover="mouse">
          <td align='center'>{{cal.year}}</td>
          <td style="white-space: pre-wrap;">{{cal.desc}}</td>
        </tr>
      </table>
      <br />
      <div id='detail'>
        <h3>案件詳細</h3>
        {{msg}}<br />
        {{msg2}}
      </div>
```

# Nuxt.jsの存在
どこにNuxt.js要素があるんだというところですが、今回感じたものとして、ルーティングが凄いなということに尽きます。
pagesディレクトリ配下にvueファイルを作成するだけで自動的にルーティングを解釈してくれるので、
例えばstruts.xml、例えばsqlMapConfig.xmlのようなファイルを自動的に作成してくます。
そのため、本来開発すべきvueファイルの実装に専念できるので気が楽だなという印象です。

[Nuxt.js - ルーティング](https://ja.nuxtjs.org/guide/routing/)
 
# 今後
とりあえず動くモノは作れたので、次は猫本で体系的に学習、理解した上で、同じポートフォリオを作ってみます。
成果物の差分が出るので学習の成果がはっきり出るかと考えています。

# 参考にした記事

[フロント未学習の大学生が1週間でVue.jsを使ったポートフォリオを作った話](https://qiita.com/plus_kyoto/items/a01578b782f17f573510)
[Nuxt.jsで作ったWebサイトをささっとGithub Pagesに公開する](https://qiita.com/SugarShootingStar/items/73da90103a995a614ec3)