OmniAICreator/Qiita-1.07M huggingface dataset:
Project Euler Q27 【二次式素数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
オイラーは以下の二次式を考案している:

```math
n^2 + n + 41
```

この式は, $n$ を$0$から$39$までの連続する整数としたときに$40$個の素数を生成する. しかし, $n = 40$ のとき $402 + 40 + 41 = 40(40 + 1) + 41$ となり$41$で割り切れる. また, $n = 41$ のときは $412 + 41 + 41$ であり明らかに41で割り切れる.

計算機を用いて, 二次式 $n^2 - 79n + 1601$ という式が発見できた. これは $n = 0$ から $79$ の連続する整数で$80$個の素数を生成する. 係数の積は, $-79 × 1601$ で $-126479$である.

さて, $|a| < 1000, |b| ≤ 1000$ として以下の二次式を考える (ここで $|a|$ は絶対値): 例えば $|11| = 11,|-4| = 4$である.

```math
n^2 + an + b
```

$n = 0$ から始めて連続する整数で素数を生成したときに最長の長さとなる上の二次式の, 係数 $a, b$ の積を答えよ.

## アプローチ
0.$f(n)=n^2+an+b$とおく。
1.$f(0)=b$である為、$b$は素数である。ゆえに$2≦b$
2.$m$を任意の自然数とすると、$f(2m)=4m^2+2am+b$
もし$b$が偶数$(=2)$であるならば、$f(2m)$が偶数になってしまう為、
$b$≠偶数すなわち、$b$=奇数である。
3.$f(2m-1)=(2m-1)^2+a(2m-1)+b$
$a$を偶数と仮定すると、$f(2m-1)$=奇数+偶数+奇数=偶数(=合成数)となってしまう。
よって、$a$は奇数である。
※上記は特に必要ではないが、処理時間を減らす為に考慮した。

## 解答

3秒ほどで実行できます。

```bash
seq 3 1000 |
factor |
awk 'NF==2' |
awk '{for(i=-499;i<=500;i++){v=2*i-1;if(2<=1+v+$2){print v,$2}}}' |
awk '{for(i=0;i<=100;i++){v=i^2+$1*i+$2;if(v<2){break};for(j=2;j<=int(sqrt(v))+1;j++){if(v%j==0){next}};print i,v,$1,$2}}' |
uniq -f2 -c |
sort -n |
tail -1 |
awk '{print $4*$5}'
-59231
```

真ん中の長い`awk`で素数じゃなくなったらやめる、という処理をやっている為実行速度が格段に速くなりました！！

やっぱりループは途中でやめるのが非常に大切だと感じました。

## 参考にさせて頂いたサイト様
[Project Euler 27 _ 二次式素数 - PEをMathematicaで](http://variee.hatenadiary.com/entry/2017/04/09/114939)
[xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個) _ 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2015/07/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AA%E3%82%89%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%80%8Exargs%E3%80%8F/)
PHPにおけるスマホ判定

# スマホ判定、その前に

ぶっちゃけメディアクエリで…

いやいや、そこをなんとか…

考える。

とりあえず楽したい。

つまりユーザーエージェントのif文連打条件分岐力技コードは書きたくない。
(しかし自分が書かないぶん誰かが書いているのを使うしかないのだ:rolling_eyes:)

という流れでいろいろスマホ判定ライブラリを探してみたが、
私も何年か前に使ったことのあるWoothee以降、使いやすそうなライブラリが見つからない。

そもそもスマホ判定をすること自体古い??

# Woothee

不穏な考えは置いておいて、Wootheeについて。
自分が使ったのは2年ぐらい前だったので、今もメンテされているか不安だったが、
コミットログを見ると数ヶ月前にもコミットされており、まだまだ廃れてはいない模様。

https://github.com/woothee/woothee-php

PHPではComposerでらくらくインストール。

README.mdを元にサンプルコードを書くと、

```php
<?php
include __DIR__ . '/vendor/autoload.php';
$classifier = new \Woothee\Classifier;
$r = $classifier->parse($_SERVER[‘HTTP_USER_AGENT’]);
var_dump($r);

// PCから
// array(6) { ["name"]=> string(7) "Firefox" ["vendor"]=> string(7) "Mozilla" ["version"]=> string(4) "57.0" ["category"]=> string(2) "pc" ["os"]=> string(7) "Mac OSX" ["os_version"]=> string(5) "10.12" }
// スマホから
// array(6) { ["name"]=> string(6) "Safari" ["vendor"]=> string(5) "Apple" ["version"]=> string(4) "10.0" ["category"]=> string(10) "smartphone" ["os"]=> string(6) "iPhone" ["os_version"]=> string(6) "10.3.2" }

```

スマホの場合は`['category']`に`"smartphone"`と入る。

簡単ですね。

スマホ判定にしては大仰だけど、選択肢のひとつに考えてみては:relaxed:
Amazon RDS(mysql)のIAM認証でハマった

Amazon AuroraとmysqlはIAM認証によってdbに接続することができます。**が、設定がなかなかにシビアです。**

## 解
```:証明書のinstall
$ wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem -P ~/.ssh/
```

- [IAM policyの設定](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) はここを参考に

```:接続
$ mysql -u iam_user -h iamtest.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com \
    --enable-cleartext-plugin \
    -p`aws rds generate-db-auth-token --hostname iamtest.xxxxxxxxxxxx.ap-
        northeast-1.rds.amazonaws.com \
        --port 3306 \
        --username iam_user \
        --region ap-northeast-1` \
    --ssl-ca=~/.ssh/rds-combined-ca-bundle.pem \
    --ssl-verify-server-cert
```

## ハマりポイント
- [IAM policyの設定](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) を精読しましょう。**rds-db:**と末尾の**/user名**に注意
- 設定に問題がある場合 `ERROR 1045 (28000): Access denied for user 'iam_user'@'<ip>' (using password: YES)` としか言わない


## 参考
- http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
- https://dev.classmethod.jp/cloud/aws/iam-auth-rds/
Unityから画像のピクセル情報をネイティブに渡す方法

UnityのRenderTextureなどのテクスチャ画像のピクセル情報をネイティブに渡したいケースがありまして、かなり苦労した（特にAndroid側）のでメモ。
ちなみにAndroidはクソ。さっさと消えてほしい。
もう少し具体的にどんな感じで使うかというと、Unity側のWebCameraを使ってその画像データをJavaのライブラリに渡したいみたいなケースです。

サンプルプロジェクトはこちら
[https://bitbucket.org/HoshiyamaTakaaki/pixelreadstest](https://bitbucket.org/HoshiyamaTakaaki/pixelreadstest)

まずはUnity側の実装

```csharp:CameraOnPost.cs
RenderTexture.active = m_TargetTexture;
m_TargetTexture2D.ReadPixels(new Rect(0, 0, m_TargetTexture.width, m_TargetTexture.height), 0, 0);
m_TargetTexture2D.Apply();

var col = m_TargetTexture2D.GetPixels32();

var handle = default(GCHandle);
try
{
	handle = GCHandle.Alloc(col, GCHandleType.Pinned);
	var ptr = handle.AddrOfPinnedObject();
	libglutil_SetPixels(ptr.ToInt32(), m_TargetTexture.width, m_TargetTexture.height);
}
finally
{
	if (handle != default(GCHandle))
		handle.Free();
}
```

iPhone側に関してはUnityのGetPixels32がそこそこ早いので、Unity側で普通に色情報を取得してそのポインタをNative側へ渡してやって問題ないと思います。
RenderTextureの場合、一度Texture2Dに移してやる必要があり、その辺りがオーバーヘッドになるので要注意かもしれないです。

```csharp:CameraOnPost.cs
m_NativePlugin.CallStatic("sendRgbaFrame", m_Context, m_TargetTexture.GetNativeTexturePtr().ToInt32(), m_TargetTexture.width, m_TargetTexture.height);
GL.InvalidateState();
```

Androidは残念ながらUnityのReadPixelsではパフォーマンスが出ません。
そしてJavaへのbyte[]の引渡しがとても重いです。
もうこの段階で重すぎて使い物になりません。
なのでAndroidではテクスチャをそのままJavaに渡して、Java側でReadPixelsを行います。
ちなみにNDKへの引渡しはiPhoneでやったような形にすれば受け渡しができます。
大きなByte配列の転送はC#→NDK→JNI経由でJavaに渡した方が早いっぽいです。

Java側ではもらったテクスチャを使い、OpenGLESでフレームバッファにテクスチャを描き込みglReadPixelsで読み出します。
しかしAndroidのglReadPixelsはとても重いです。
結局のところ重いです。
PBO(Pixel Buffer Object)を使うと多少速くなります（逆に遅くなる場合もあります）が、やはり重いです。
しかもPBOはOpenGL ES3.0を要求するし、Javaでは完結しなくなってしまうしで、踏んだり蹴ったりです。
（Java完結させるには最低SDK APIを24まで上げる必要あり。上げられるか、バカ）

取得したRGBA情報をMP4などで保存するには、さらにYUVに変換する必要があり、もうこの段階まで来るとカクカクの状態は避けられません。

苦労した割にはあまり使い道がない気もしますが、RenderTextureのサイズを調整すれば、パフォーマンスはある程度改善します。

その他、Androidは色々と苦労しました。
aarに他で作成されたsoを含める方法も、探すのにかなり苦労しました。
64ビット版のsoファイルを含めるとUnityで作ったアプリを起動した瞬間にポップアップが出て終了するのも解決に時間がかかりました。

今回のサンプルを作成するに辺り、たくさんの先人の情報をお借りしました。
そしてAnswerの無いたくさんのQuestion（屍）を見ました。
みんなAndroidには困ってるんですね。

どうもありがとうございました。
ASP.NET Identityの実装 DBからユーザ情報を取得する

# ASP.NET Identityの実装 DBからユーザ情報を取得する

[ASP.NET Identiyのログイン機能実装](https://qiita.com/Sa_Ru/items/0e11413f994cc4108560#%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E6%AF%94%E8%BC%83%E6%96%B9%E6%B3%95%E3%81%AE%E5%A4%89%E6%9B%B4)のつづき。

データベースから生成したADO.NET Entity Data Model を使用するにはどうしたら良いんだろうと思ったので実装してみた。

* ASP.NET Identiyを使用した認証。
* 認証用のユーザテーブルはすでにあるものとする。
  * MSSQLに接続する。

単純にログイン画面でユーザ、パスワードが入力されたら、データベースからユーザを探し出してパスワードと一致すればOWINのミドルウェアに登録(サインイン)する。

ここで出てくる`HashPassword`は文字列型なので[ASP.NET Identiyのログイン機能実装](https://qiita.com/Sa_Ru/items/0e11413f994cc4108560#%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E6%AF%94%E8%BC%83%E6%96%B9%E6%B3%95%E3%81%AE%E5%A4%89%E6%9B%B4)で記載した`IPasswordHasher`を実装するか、`FindAsync`をオーバーライドしてパスワード比較を実装しないとログインできないことに注意。

## ADO.NET EntityDataModelの実装

まず、データべース参照クラス(`DbContext`)を実装する。
1."新しい項目"の追加から、ADO.NET EntityDataModelを選択する。
2."データベースからEF Designer"を選択する。
3.接続先を入力する。
4.使用するテーブルを選択する。

![2017-11-30_16h08_24.png](https://qiita-image-store.s3.amazonaws.com/0/77279/caa4a224-1d9f-6c6b-6689-1e3479b0e3c1.png)





ADO.NET EntityDataModelをデザイナで生成すると、以下のクラスが出来た。
`Models\Model1.Context.cs`

```csharp
public partial class TESTDBEntities : DbContext
{
    public TESTDBEntities()
        : base("name=TESTDBEntities")
    {
    }
・・・省略
    public virtual DbSet<userMst> userMsts { get; set; }
}
```

`userMst`はユーザー情報の定義を含む型クラスとなっている。

## ユーザー情報をDBから取得

`TESTDBEntities`を使って`FindByNameAsync`を変更する。

```csharp
public class AppUserStore : IUserStore<AppUser>, IUserStore<AppUser, string>, IUserPasswordStore<AppUser, string>
{
・・・省略
    public Task<AppUser> FindByNameAsync(string userName)
    {
      //ここでログインユーザ情報を見つけて返す処理。
      using (var db = new TESTDBEntities())
      {
          var dbUser = db.userMsts.FirstOrDefault(w => w.userName == userName);
          if (dbUser == null) return Task.FromResult(default(AppUser));
          // DBからユーザを見つけらAppUser型にして返す。
          var user = new AppUser
          {
              Id = dbUser.userCd,
              UserName = dbUser.userName,
              HashPassword = dbUser.password
          };
          return Task.FromResult(user);
      }
    }
}
```

実行するとデータベース上のユーザ上のデータベースを使用してログインされる。
今回DbContextを使用したが、DataSetやLink to sqlでも同じような実装ができるはず。
CentOS6.x > Let’s Encrypt（certbot）


# 環境
OS: CentOS6.9
さくらのクラウドでRedmineを自動インストール済


# 参考

いろんなサイトを参考にさせていただきましたが、 Let’s Encrypt周りは、（Python周り？）は変化が早いのか、
どれを試してもうまくいきませんでした。（virtualenvが無いと弾かれてしまう）
以下を試してもうまくいかず・・・
[CentOS 6 で発生するエラーの対処法 \- Let's Encrypt 総合ポータル](https://letsencrypt.jp/usage/centos6-error.html)
certbot-auto 0.9.3 において、これらの不具合が解消しているらしいが、解消しておらず・・・（2017/12/1現在）

最終的には以下を参考に
[How to Install Python 2\.7\.14 on CentOS/RHEL 7/6 and Fedora 27/26/25](https://tecadmin.net/install-python-2-7-on-centos-rhel/)

Phthonをソースコードからビルドして実行する事で、certbotを起動してLet’s Encryptの設定ができました。



# Let’s Encrypt 利用手順

## 必用パッケージのインストール


## install epel-release 
`yum install epel-release`




## Step 1 – Install GCC
`yum install gcc openssl-devel bzip2-devel`

## Step 2 – Download Python 2.7
```
cd /usr/src
wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz
```

## Step 3 – Extract Archive and Compile

```
tar xzf Python-2.7.14.tgz
cd Python-2.7.14
./configure --enable-optimizations
make altinstall
```
## Step 4 – Check Python Version

`/usr/local/bin/python2.7 -V`


## Step 5 – Install PIP

```
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python2.7 get-pip.py
```

## Step 6 – Install virtualenv

`pip install virtualenv`



## certbot（letsencrypt）の起動

```
cd /usr/local/
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
```

無事にスタートすれば
あとはなんとなく質問に回答していく。


# 最終確認

最後にメールで確認がくるのでそれに応えればOKです。

メールは、Electronic Frontier Foundation　からやってきます。
複製すべきか、参照すべきか、それが問題だ

タイトルは単に勢いです。"問題"はないです。
Power BI Desktop や Excel などの クエリ エディター のお話。クエリ エディター では複数のクエリを作成や修正、そして管理することができます。データモデルにロードする分析用のデータを作成する作業、いわゆる ETL が結構手間で時間がかかるんですよね。一度完成してしまえばあとは調整的な流れでよいのですが、あれこれやっているときにクエリの複製と参照が思いのほか役に立ちます。機能を理解して使うととても便利なのです。

#クエリの複製と参照
複製 と 参照 で作成されたクエリは、その時点では同じ結果を返すクエリになる。
##複製(Duplicate)
- 複製元と同じ内容のクエリを新規に作成する。
- クエリのコピペと同じ結果が得られる。
- 複製元を変更したとき、複製したクエリには影響を受けない。

##参照(Reference)
- 参照元の結果を参照するクエリを新規に作成する。
- 参照元を変更したとき、参照しているクエリはその影響を受ける。y = g(f(x)) ということ。 

#使いどころ
##複製
適用するステップは順番を変えてみたりいろいろなことができるのだけど、元に戻したいとかうまくいっていたところまで戻したいとき、折をみて複製してちょっと置いとくみたいな使い方をよくしています。
ちょっと置いておくということについては、クエリをコピーすると Mコードがクリップボードに入るので任意のエディターなど貼り付けることも可能だし、別に起動している クエリ エディターにペーストすることも可能。また、クエリはユーザー定義関数(UDF)にすることが可能なので、繰り返し使用されるロジックが組みあがったら複製して引数の部分を加工するという感じですね。

##参照
データ抽出に使用するクエリから複数の種類のデータを取得したりすることがあります。例えば、ひとつの Excel ワークブックから複数のデータを取得しようとするとき。

対象の Excel ワークブックを選択し、ブック内のメタデータ(テーブル/名前付き範囲/シートの3種類)から選択できる [ナビゲーター] ダイアログ。ここで テーブルなどを選択せず、ルートから [編集] を押下。
![ナビゲーター ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/193509/4d5204bb-2629-a6d6-cc09-727413edc678.png)

クエリ エディターにはメタデータ一覧が表示される。多くの場合、"Data"列 のリンクを使ってドリルダウンをしていくのだけど、まずはこのまま。このクエリには、データソースとした Excel ワークブックのフルネームが使われていることがポイント。 (テーブルなどを選択して作成されたクエリの場合は、[適用したステップ] で "ソース" までさかのぼれば同じ状態になる)
![クエリ エディター2](https://qiita-image-store.s3.amazonaws.com/0/193509/285adeb6-02f1-81ac-f596-7c378efaa1a9.png)

先にこのクエリを参照するクエリを作成していく。
![クエリ エディター3](https://qiita-image-store.s3.amazonaws.com/0/193509/e390db36-f3f4-2bda-a75c-db5ed9cd299b.png)

[参照]で作成したクエリの "Data"列から[ドリルダウン] もしくは、[新しいクエリとして追加]する。

- [ドリルダウン] は 作業対象のクエリでドリルダウン(展開)
- [新しいクエリとして追加] は 作業対象のクエリをコピーしドリルダウン(展開)

![クエリ エディター4](https://qiita-image-store.s3.amazonaws.com/0/193509/73fa3089-7757-fb0b-3bac-456a2416e474.png)

必要なだけ参照するクエリを作成。そして、[クエリの依存関係] でどのような参照がされているか確認することが可能。

1層目：File.Contents 関数 - 最初に作成されたクエリ(まだバイナリの状態)
2層目：Excel.WorkBook 関数 で メタデータまで展開 - 最初に作成されたクエリ
3層目：テーブルにそれぞれドリルダウン - [参照] で作成されたクエリ

![クエリ エディター](https://qiita-image-store.s3.amazonaws.com/0/193509/e8499353-8254-662e-2e3e-1827686ab13d.png)

参照して作成したクエリには、データソースにした Excel ワークブックのフルネームは使われていない。ナビゲーター ダイアログ でテーブルなどを複数選択し作成されたクエリと比較してみるとよい。

##確認
データソースとした Excel ワークブックが別のディレクトリに移動したり、ファイル名を変更したとき、参照元クエリのファイルフルネームの部分を変更すれば すべてのクエリは期待する結果を返すことができる。参照の挙動の確認ではあるけれでも要件を満たすならこれでよいし、[パラメーター]も使うとクエリの管理面がシンプルになると思う。

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)
D3のカラーオブジェクトに値をhexで返すメソッドを追加する

ver.3まではレンジにカラーを指定した場合、hexで返ってきた。

```js
D3 ver.3

> var colorScale = d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#ff0000"])
> colorScale(20)
<- "#d6a3a3"
```


ver.4 では、rgb形式の文字列で返ってくる。

```js
D3 ver.4

> var colorScale = d3.scaleLinear().domain([0, 100]).range(["#cccccc", "#ff0000"])
> colorScale(20)
<- "rgb(214, 163, 163)"
```

どうやら、hexに変換するようなメソッドも無いっぽい。

```js
> var c = colorScale(20)
> d3.color(c).toString()
<- "rgb(214, 163, 163)" 
```

D3のスケールを他のライブラリと組みわせて使いたい時に、相手のライブラリがhexでのカラー指定しか受け取れない場合があるので、とりあえず、hexに変換するメソッドを追加して対応してみた。



```js
> d3.color.prototype.toHex = function(){ return ["#", this.r.toString(16),  this.g.toString(16), this.b.toString(16) ].join("") ; }
> d3.color(c).toHex()
<- "#d6a3a3"
```
[雑記] HerokuでjQueryのreadyイベントが動かなかった時にやったこと

チェックボックスのクリックをトリガーとするreadyイベントを作りたかったんです。
そこで、こんなreadyイベント関数を書きました。

```js
// readyイベント関数
$(window).on("load", function(){

	// checkboxイベントの設定
	$('input[type="checkbox"]').change(function() {
		//
		// ここにはイベントの内容を書きます
		//
	});

});
```

ローカルでの動作確認ができたので、公開のためにこのコードを含めたファイルをHerokuにデプロイしたんです。

しかし、readyイベントだけ動作せず。
即時関数としては機能したのですが、readyイベント関数としては機能しませんでした。

一体なぜ...。
調査をすること××時間。
こんなブログ記事に出会いました。
▶︎ [jQueryが動かない時に確認する9項目](http://www.finefinefine.jp/jquery/kiji2117/)

そして、「2）処理のタイミングを確認」を参考に、以下の部分を...

```js
// checkboxイベントの設定
$('input[type="checkbox"]').change(function() {
```

こう変えました。

```js
// checkboxイベントの設定
$(document).on('change', 'input[type="checkbox"]', function() {
```

これで動きました...。
readyイベント関数を作る際には、`on()`を使うのが有効らしいです。


## 付録：実際に作ったコード

```Javascript:checkboxEvent.js
// readyイベント関数
$(window).on("load", function(){

	// checkboxイベントの設定
	$(document).on('change', 'input[type="checkbox"]', function() {
		var selectedCheckbox = document.getElementById($(this).val());
		if ($(this).prop('checked')) {
			selectedCheckbox.style.opacity = 1;
		} else {
			selectedCheckbox.style.opacity = 0;
		}
	});

});
```
TypeScriptをVSCodeでデバックする

## 概要

- TypeScriptのデバック効率を上げたい
- フロントエンドのコードでは無いのでchromeのデバッグツールが使えない
- VSCodeのデバックツールを試してみた
- 5分くらいで設定できた

## VSCodeでのデバック画面

![スクリーンショット 2017-11-30 午後4.35.17.png](https://qiita-image-store.s3.amazonaws.com/0/23606/e4886922-e64f-a3b3-b856-8c6f743b6a4d.png)

こんな感じの画面でデバックができます。

## 設定方法

VSCodeにおけるTypeScriptデバックの流れとしては、下記の通りです

1. launch.jsonを読み込む
2. launch.jsonのpreLaunchTaskにて、実行するタスクを指定する
3. 指定されたタスクを tasks.jsonから探して実行する 
4. デバッガが動く

```json:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debugging TypeScript",
      "program": "${file}", 
      // tasks.json のlabelで指定
      "preLaunchTask": "Compile TypeScript", 
      "cwd": "${workspaceFolder}", 
      "outFiles": [
        "${workspaceFolder}/build/**/*.js"
      ]
    }
  ]
}
// ${file}: 今開いているコード
// ${workspaceFolder} : VS Codeを開いたフォルダ
```

```json:.vscode/tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Compile TypeScript",
      "type": "shell",
      "command": "yarn build",
      "problemMatcher": []
    }
  ]
}
```

## デバックの実行

![スクリーンショット 2017-11-30 午後4.53.21.png](https://qiita-image-store.s3.amazonaws.com/0/23606/4dda330c-1485-4eb4-a1dd-d5d0cddcdd34.png)

fn + F5で、デバックが開始されます。

※ `node.js version could not be determined` というログが出ている原因は、これから見ていきます :pray:

## 参考資料

https://code.visualstudio.com/docs/editor/debugging
https://code.visualstudio.com/docs/editor/tasks#vscode
アウトバウンドの帯域制限をWindows標準機能で行う

巨大なファイルをアップロードする際、帯域を食いつぶしてしまい、他の方に迷惑をかけてしまう事があると思います。
そんな時に帯域制限をかけるのですが、Windowsの標準機能で行うことができたのでご紹介したいと思います。

# 諸注意
**アウトバウンド（アップロード帯域）のみの制限です。** インバウンド制限したかったのですけど今回ご紹介する方法ではできませんでした。（やりたかった・・・）

# やり方
QoSポリシーと呼ばれる機能がWindowsにあるので、それを使うことで帯域制限をかけることが可能です。
スタートボタンを押し、検索欄に「gpedit.msc」と入力します。ローカルグループポリシーエディターが起動します。

ここから、Windowsの設定→ポリシーベースのQoSを選択し、右クリックから「新規ポリシーの作成」を選びます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/212587/d6bcdbdf-08d4-6ecc-6136-d7fa1ee0a1f9.png)

ポリシー名は自由に。DSCP値は0で大丈夫です。
「出力方向のスロットル率を指定する」の欄に、制限値を設定します。単位が**KBps** ですのでちょっと注意です。ここでは1MBpsの制限をかけてみます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/212587/9e060d90-a9a6-a328-602f-190b884e7dfe.png)

制限をかけたいアプリケーション名を入力します。ここではChromeの帯域を制限してみましょう。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/212587/0cb63a09-38f4-4e06-65a2-4ebc1d651c79.png)

宛先を選択します。すべての帯域を制限したい場合はそのまま、特定の宛先のみ制限したい場合はIPアドレスをしています。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/212587/bd264100-3841-1731-b7bc-5d9e2eac1ab9.png)

最後もこのままで大丈夫だと思います。完了ボタンをおして終了します。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/212587/6f8dbb06-d898-1017-f48b-ff97e788a6c0.png)

これで制限をかけることができました。速度チェッカーで試してみましょう。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/212587/274d5144-e240-dfa5-71a3-1f277ff3ffc3.png)

1MBpsで設定したので、きちんと8Mbpsの速度になっています。

ですがそこまで厳密な制限ではなく、たまに設定値以上の値が出てしまうので、厳密な帯域制限が必要なケースには向かないと思いました。
監視対象のサーバーにはタグを振ろう

#一度書いたスクリプトはいじりたくない
AWS EC2のステータス監視をLambdaで行う際、スクリプトに直接インスタンスIDを記載して
実行するのも一つの手段ですが、監視対象サーバーが増えたり減ったりした場合や、動作確認のため対象サーバーをいちいち書き換えて実行するのも意外とめんどい。

あと、外部モジュールを使った際、ZIPでアップロードが必要な為、いちいちやってられんのじゃー！

#その為
インスタンスにタグを振り、タグが付いているサーバーを監視対象とすることでスクリプトを変えず対応可能となります。

#EC2タグサンプル
「KanshiFlag」という名のタグを作成し、監視対象サーバーの値に「1」を振ります。

![EC2.jpg](https://qiita-image-store.s3.amazonaws.com/0/117598/afafb94a-0de4-2b16-564c-6695367d36ea.jpeg)

#取得条件
「KanshiFlag」が「1」で起動中（インスタンスの状態が「runninng」）のサーバーの
インスタンスIdとサーバー名を取得する。（赤丸がついているサーバー）

#サンプルスクリプト
```py3

import boto3

ec2c = boto3.client('ec2')

##############################################
#フィルターから起動しているインスタンスID取得
#引数：タグ名　KanshiFlag 値：1
#戻り値：インスタンスIDのList
##############################################
def func_GetInstanceId(FilterName,FilterValue):

    instanceid_List = []
    retec2c = ec2c.describe_instances(
        Filters=[
        {'Name': FilterName, 'Values': [FilterValue]}
        ,{'Name':'instance-state-name','Values': ['running']}
        ]
    )
    for reservation in retec2c['Reservations']:
      for instanceid in reservation['Instances']:
        instanceid_List.append(instanceid['InstanceId'])

    return instanceid_List
##############################################
#インスタンスIDからタグ名取得
#引数：インスタンスID　i-123456789abcdefg
#戻り値：タグ名　Win2016_SV2
##############################################
def func_RET_ServerTagName(SET_InstanceId):

    TagName = ec2c.describe_tags(
        Filters=[
        {'Name': 'resource-id', 'Values': [SET_InstanceId]}
        ,{'Name': 'tag-key', 'Values': ['Name']}
        ])
    try:
        RET_ServerTagName=TagName['Tags'][0]['Value']
    except Exception as e:
        RET_ServerTagName="サーバー名未設定"
    return RET_ServerTagName

################################
# MAIN
################################
def lambda_handler(event, context):
#if __name__ == "__main__":

    #タグ名 KanshiFlag 値:1のインスタンスIDを取得（List)
    insid_list = func_GetInstanceId('tag:KanshiFlag','1')

    for insid in insid_list:
        #インスタンスIDからTag名（サーバー名）を取得
        ins_name=func_RET_ServerTagName(insid)
        print(ins_name + "(" + insid + ")")
```
#補足
[以前記載したスクリプト](https://qiita.com/gameover/items/779ecae47747664ac6f7)と同じような内容ですが

```py3
def func_GetInstanceId(FilterName,FilterValue):
```
にタグ名と値の引数を追加。

又、describe_instancesに引数の「タグ名」「値」、又、「起動中サーバー」を取得するようにフィルターを追加

```py3
    retec2c = ec2c.describe_instances(
        Filters=[
        {'Name': FilterName, 'Values': [FilterValue]}
        ,{'Name':'instance-state-name','Values': ['running']}
        ]
    )
```

取得する際には

```py3
FilterName　に　'tag:KanshiFlag'
FilterValue　に　'1'
```
を引数にし取得。

```py3
insid_list = func_GetInstanceId('tag:KanshiFlag','1')
```

#結果
「KanshiFlag」が「1」で起動中のサーバー名、インスタンスIDが取得できたことを確認。
（インスタンスIDは適当に書き換えています。）
```
WindowsSV(i-0123456789abcdefg)
Zabbix(i-5656565656)
Win2017SV(i-000111222333444555)
Win2012(i-7777777777777777)
```
#監視対象を変えるには
追加する場合・・・「KanshiFlag」タグの値に「1」を設定する。
削除する場合・・・「KanshiFlag」タグの値を削除する（又は値を「1」以外を設定する）

これでスクリプトをいじらずに変更可能となります。
Product HuntのAPI叩いてみた

どうも、連続投稿です。tack.saitoです。
[nijibox](https://nijibox.jp)でエンジニア風を醸し出して過ごしています。

さてさて。
今後、流行るような単語、知りたいなー、ってことで。

Product HuntのAPI叩こう
結果をスプレッドシートに保存して、すこーし解析して、流行りに敏感になろう！
そうだ、GASで完結だ！！

と、思いついたのでProduct HuntのAPI叩きにいきます。

## API叩く準備
```js

  // product huntにログインして、keyとsecretを発行しときます
  var key = "your key";
  var secret = "your secret";
  
  var preHeaders = {
    "Accept": "application/json",
    "Content-Type": "application/json"
  };
  
  var preBody = {
    "client_id" : key,
    "client_secret" : secret,
    "grant_type" : "client_credentials"
  };
  
  var preParams = {
    "headers" : preHeaders,
    "payload" : preBody
  };
  
  var tokenResponse = UrlFetchApp.fetch("https://api.producthunt.com/v1/oauth/token", preParams);
  var tokenData = JSON.parse(tokenResponse.getContentText());
  var access_token = tokenData.access_token; //API叩くためのaccess token取得
  
```

## API叩く

```js

  var headers = {
    "Authorization": "Bearer "+ access_token, // さっきのtoken
    "Accept": "application/json",
    "Content-Type": "application/json"
  };
  
  var params = {
    "headers" : headers,
    "payload" : ""
  };

  var url = "https://api.producthunt.com/v1/posts?days_ago=1";

  try{
    // API叩く部分
    var response = UrlFetchApp.fetch(url, params);
    var data = JSON.parse(response.getContentText());
    var posts = data.posts;
    
    // 結果をスプレッドシートに保存部分
    for(var key in posts){
      var id = posts[key].id;
      var name = posts[key].name;
      var tag = posts[key].tagline;
      var url = posts[key].discussion_url;
      var voteCount = posts[key].votes_count;
      // ここはページにアクセスして、正規表現でdescription部分を取得してます(今回は省略)
      var description = getDescription(url);
      // 書き込む先のsheetを取得しといて
      var sheet = getMySheet();
      sheet.appendRow([id,name,tag,description,voteCount,url]);
    }
  } catch(e) {
    Logger.log(e);
  } 
```

動かすと....

![スクリーンショット 2017-11-30 16.14.30.png](https://qiita-image-store.s3.amazonaws.com/0/99988/59fdde56-dac2-eda7-b1a3-d9716305a6a0.png)

いけました。素敵です。
ただ、他のendpointはなぜか認証に失敗するっぽく、叩けない。
うーむ。謎です。。。


## 解析部分
description detailの部分を単語に区切って
大文字が入っているものを抽出し、
iPhoneやAndroid,App,And,How,Why,Weなど除外。
で、カウントしていきます。

![スクリーンショット 2017-11-30 16.21.14.png](https://qiita-image-store.s3.amazonaws.com/0/99988/b43fb281-d76d-6e1f-46bb-8d4b91dc71ce.png)
(右側は出てきた回数)

**これからの時代はAIだ!!!**

ってことが分かったので、2番目に流行っているslackに投稿しよう

## slack投稿
やり方は他の人が書いてる(と思うので)そこは省略

![スクリーンショット 2017-11-30 16.25.40.png](https://qiita-image-store.s3.amazonaws.com/0/99988/5065fb73-8c09-a810-b9e1-930f82ba76f2.png)

テキストのリアクション、結構好きです。


## まとめ
スプレッドシート + GASで
流行りの単語を検出 + 解析 + slack通知
ができました(?)

解析は、うまいことしたいなーと思いつつ。
今はクリスマスを待ちましょう。
AWS LINUX FIREWALLD アクセス制御

外からAWSサーバアクセスする時、どうしたらアクセスできないことよくでます。

原因：AWSセキュリティグループの設定
　　　FIREWALLDの設定

下記、AWS LINUX FIREWALLD アクセス設定のコマンドです。

①LINUXの場合、下記コマンドを実行します。
・設定
　sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
　sudo iptables -A OUTPUT -p tcp --sport 3306 -j ACCEPT
・保存
　service iptables save
・確認
　iptables -L -n -v
AndroidからShadowsocksサーバーに接続する

# はじめに
Shadowsocksサーバーの構築方法は[こちら](https://qiita.com/nao20010128nao/items/131bba1dc1f61b1b2afb)から

## 必要なもの
- 上述の記事で建てたサーバー(以下`A`)
  - ファイアウォールの設定を忘れずに
- [Shadowsocks](https://play.google.com/store/apps/details?id=com.github.shadowsocks)

# 接続する
最初にサーバーが一個ありますが、それは気にしないでください。(横にスワイプして消してOK)

## サーバーを追加
1. 上のファイルアイコンに`+`が書かれたボタンをタップ
2. `手動設定`を選択
3. 以下のように設定する
   - `サーバー名` - 適当に分かりやすい名前
   - `サーバーアドレス` - 建てたサーバーのIP
   - `リモートポート` - `A`の`サーバーポート`の値
   - `ローカルポート` - 変更しない(`1080`のまま)
   - `パスワード` - `A`の`パスワード`
   - `暗号化方式` - `AES-256-CFB`
   - `プロクシ方式` - `すべて`
   - `リモートDNS` - `1.1.1.1`
   - `IPv6 プロキシ` - ON
   - `アプリ別のプロキシを使用` - お好みで
     - アプリ別にプロキシを有効化するかしないかで選択してください
   - `DNS転送` - OFF
4. 上部の適用(チェックマーク)をタップ

## 接続する
1. 先程追加したサーバーをタップし、左側を緑色にする
2. 下部の飛行機マークをタップする
3. `接続済み、タップして接続状況をチェック`をタップして接続状況を確認
   - `成功: XXXmsの遅延`と表示されれば成功
   - エラーになる場合は最初からやり直し
これで完了です。お疲れ様でした。

# 後始末
1. Shadowsocksアプリを起動する
2. 下の緑色に飛行機のアイコンをタップする
3. サーバーの後始末も忘れずに

# おわりに
前回の方法とは異なり、他のアプリもプロキシに通せるのでこちらに変えました。
BTCのブロックチェーン同期なんかと一緒にできてしまうので面白い。

以上、ご覧いただきありがとうございました。
GitHubで人気のオープンソースTOP５ - Swift編 🌟

11月18日〜25日の間に、GitHubで公開されているオープンソースの中で最もStarが付いたプロジェクトを紹介していきます🌟  

今回はSwiftを集めました。  
![20171127152608.png](https://qiita-image-store.s3.amazonaws.com/0/200848/6051a944-9215-7d3f-587b-2759ee32953d.png)


# No.1
#### airbnb/Lona
![20171125171022.jpg](https://qiita-image-store.s3.amazonaws.com/0/200848/2fe461a2-821f-bc60-3d98-21aff98d44f9.jpeg)
 
設計システムを定義し、それらを使用してクロスプラットフォームのUIコード、  
スケッチファイル、画像、その他の成果物を生成するためのツール。  
スター数:1,486

https://github.com/airbnb/Lona

# No.2
#### Juanpe/SkeletonView
![20171125171011.jpg](https://qiita-image-store.s3.amazonaws.com/0/200848/4958ed00-1079-b793-0fa9-0450fd9c6c80.jpeg)  
ユーザーにイベントが発生していることを示す良い方法、  
またユーザーが待っているコンテンツを準備することもできます。  
スター数:2,547

https://github.com/Juanpe/SkeletonView



# No.3  
#### Interactive-Studio/TransitionableTab  
![20171125170953.png](https://qiita-image-store.s3.amazonaws.com/0/200848/1d4d3497-0783-9b31-7114-095de6d52c07.png)
  
TransitionableTabを使用すると、  
タブを切り替えるときに簡単にアニメーションを作成できます。  
スター数:304

https://github.com/Interactive-Studio/TransitionableTab

# No.4  
#### fastred/Optimizing-Swift-Build-Times
<img width="512" alt="20171125170942.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/c401f0e4-192b-72d6-7593-568b734128bf.png">
  
Swiftプロジェクトのコンパイル時間の最適化に関するアドバイスまとめ。  
スター数:1,694  

https://github.com/fastred/Optimizing-Swift-Build-Times
  
# No.5  
#### raywenderlich/swift-algorithm-club  
![20171125170934.png](https://qiita-image-store.s3.amazonaws.com/0/200848/4c818900-4b34-bd35-e3c6-5f59642261f0.png)
  
説明付きのSwiftのアルゴリズムとデータ構造  
スター数:15,088  

https://github.com/raywenderlich/swift-algorithm-club
Oreo対応した話

担当サービスのOreo対応した話。
`targetSdkVersion` を 26にあげると対応が必須になる。
対応は主にここに書いてあることをやることになる。
[Background Execution Limits | Android Developers](https://developer.android.com/about/versions/oreo/background.html)
以下やったこと、ハマったところを列挙。

## NotificationChannel の追加
通知が届かなくなるので対応必須。
このあたりを参考にした。
https://github.com/googlesamples/android-testdpc/blob/master/app/src/main/java/com/afwsamples/testdpc/common/NotificationUtil.java

## 暗黙的broadcastを明示的broadcastへ置き換え
`android.intent.action.PACKAGE_REMOVED` を `android.intent.action.MY_PACKAGE_REPLACED` に置き換え。
 https://developer.android.com/about/versions/oreo/background.html#broadcasts
担当サービスはこれだけだったが、他にも色々あるので要確認。

## background で動かしている Service の対応
ここに書いてあるように、background で startService() が呼ばれるものはクラッシュするので対応する。
https://developer.android.com/about/versions/oreo/background.html#migration

ただし、
> NotificationManager.startServiceInForeground() instead of startService().

と書いてあるが、実際は `ContextCompat.startServiceInForeground()` 。
上記メソッドを叩いた後、 `Service.startForeground()` 5秒以内に呼ばないとクラッシュする(break point で止めても例外なし)など色々曲者。
こちらにNGケースが詳しく書いてある。
[Android Oからのバックグラウンド・サービスの制限事項を実演する。 - Qiita](https://qiita.com/nukka123/items/791bc4f9043764789ee6)

また、 `WakefulBroadcastReceiver` は内部で `startService()` を使用しているのでクラッシュする。
もともと deprecated だったのでこのタイミングで完全廃止。
`BroadcastReceiver` にして、後述の `JobDispatcher` と組み合わせる。

対応にあたって、IntentService を使い続けるのはしんどかったので、該当の Service は JobScheduler に置き換えることにした。
しかし担当サービスの minSDK が 16 以上なこともあり、 Firebase の JobDispatcher を導入する。
21以上だったら JobScheduler を使うといいと思う。

### JobDispatcher
https://github.com/firebase/firebase-jobdispatcher-android

backgroundから呼ばれる `Service` を job に置換していく。
大枠こんな感じ。

before

```AndroidManifest.xml
<service android:name=".MyIntentService"/>
```
```java
public class MyIntentService extends IntentService {		
		
    public MyIntentService() {		
        super("MyIntentService");		
    }		
		
    public static void startService(final Context context) {		
        context.startService(new Intent(context, MyIntentService.class));		
    }		
		
    @Override		
    protected void onHandleIntent(final Intent intent) {		
        // do something
    }		
}
```
after (kotlin 化もついでに..)

```AndroidManifest.xml
<service
      android:name=".MyJobService"
      android:exported="false">
      <intent-filter>
          <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
      </intent-filter>
</service>
```
```kotlin
class MyJobService : SimpleJobService() {

  override fun onRunJob(parameters: JobParameters?): Int {
    // do something
    return JobService.RESULT_SUCCESS
  }
}
```

呼び出し

```kotlin
val dispatcher: FirebaseJobDispatcher = FirebaseJobDispatcher(GooglePlayDriver(context))
val myJob: Job = dispatcher.newJobBuilder()
    .setService(MyJobService::class.java)
    .setTag("my-unique-tag")
    .setTrigger(Trigger.NOW) // NOW と言いつつも、30秒後ぐらいに発動する
    .build()

dispatcher.mustSchedule(myJob)
```
他にも色々オプション設定があるので公式参照。

## まとめ
ここまで終わったら後はひたすら動作確認！
TPI NEXT®を社内で1年半やってみて

<h2>はじめに</h2>
ノハナで品質管理を担当している田井です。
今回は2016年から品質管理グループで導入したTPI NEXT®の結果をご報告したいと思います。
<h2>2016年</h2>
TPI NEXT®を知ったのが、2016年3月に開催された「JaSST'16 Tokyo」で、2016年10月ぐらいから本格的な作業に入りました。
まずは現状把握をするためにチェックポイントにYes/Noをつけていきました。ここでわかったことは、弊社のQAチームはメトリクスの活用がほぼ皆無で、全体的なバランスも良くありませんでした。
そこで、テスト業務に密接である「テスト管理」と「テスト業務の専門性」内の優先度Dレベルまでを、半期で全てコントロールレベルにすることを目標としました。
チェックポイントに対して必要な改善策を考え、6ヶ月間で「テストプロセス管理」から「テスト環境」までをすべてコントロールレベルに到達させることができました。

<img class="alignnone size-large wp-image-902" src="http://blog.nohana.co.jp/wp-content/uploads/2017/11/1510025406-1024x326.jpg" alt="" width="720" height="229" />

詳しくは<a href="http://blog.nohana.co.jp/article/tpi-next2016h2"><font color="#ff0000">「TPI NEXT®導入による品質管理のプロセス改善の成果」</font></a>で書いていますので、ご覧ください。
<h2>2017年</h2>
2017年4月からの半期は前期と方針を変更しました。前期はチェックポイントの達成を目標としていましたが、今回は改善施策をまず考え実施することにより、結果的にチェックポイントをクリアできるようにと考えました。
改善施策を考えマイルストーンを設定しました。以下がマイルストーンです。

<img class="alignnone size-full wp-image-903" src="http://blog.nohana.co.jp/wp-content/uploads/2017/11/スクリーンショット-2017-04-20-13.50.14.png" alt="" width="958" height="537" />

結果としては、12個のうち11個を達成しました。その後にチェックポイントの再チェックを行いましたが、達成できたものは数個でした。
もともと改善施策を実施するということに重点を置いていましたので期待通りの結果ではありますが、少し物足りない感もあります。
<h2>今後</h2>
今期は2016年のようにチェックポイントの達成を目標としています。ただし、規模はかなり小さくして、優先度AとBが３つ残っているので、それらを達成するという目標としています。
マイルストーンを設定して、目標を達成できるように頑張りたいと思います。
Shadertoy はじめました week #4

[![20171130_140708.png](https://qiita-image-store.s3.amazonaws.com/0/2585/3d48a9b9-340c-7645-da7c-a6068532fa6b.png)Shadertoy: glass and metal hearts](https://www.shadertoy.com/view/MdfcRs)


# Week #4
大分時間が空いてしまいましたが、[前回ブリリアントカットの距離関数が導出できた](https://qiita.com/keim_at_si/items/73e4c2008dd846e82310)ので、折角なら[ハートシェイプカット](https://www.google.co.jp/search?q=%E3%83%8F%E3%83%BC%E3%83%88%E3%82%B7%E3%82%A7%E3%82%A4%E3%83%97%E3%82%AB%E3%83%83%E3%83%88&source=lnms&tbm=isch&sa=X)もやってみたいという事で挑戦しました。[4月にはすでに導出できてた](https://twitter.com/mike_at_cg/status/848743484605349888)のですが、いざこのモチーフ使って何作ろうかって段になって全く良いイメージが浮かばず、放置していました。
そんな中、光栄なことに[Shader of the week に拙作を選出いただき](https://twitter.com/Shadertoy/status/928168533619499009)モチベーションが復活。とりあえず何とか形にしてケリをつけて新しい事をやろう、という事でリリースしました。センスのかけらも感じられない残念な仕上がりですが、技術面は見た目以上に進化していたりします。センスが欲しい。

ハートシェイプカットの距離関数

```heart_shaped_cut.glsl
const float vtx[11] = float[11](1.10, 1.39, 1.75, 2.32, 2.68, 2.08, 1.44, 1.12, 0.98, 0.95, 1.00);
const float vcnt = 5.0;
float dfFreeDSBC(in vec3 p, in float r, in float t) {
  p = vec3(p.x, abs(p.y)-t, abs(p.z*2.0));
  float at = atan(p.z,p.x)/(PI/vcnt);
  float a = floor(at+.5)*(PI/vcnt), c = cos(a), s = sin(a);
  int   i = int(at*2.);
  float rf = mix(vtx[i], vtx[i+1], fract(at*2.)) * r;
  vec3  q = vec3((c*p.x+s*p.z)/rf, p.y/r, abs(-c*p.z+s*p.x)/rf);
  float fcBezel = dot(q, vec3(.544639035, .8386705679, 0))           - .544639035;
  float fcUGird = dot(q, vec3(.636291199, .7609957358, .1265661887)) - .636291199;
  float fcStar  = dot(q, vec3(.332894535, .9328278154, .1378894313)) - .448447409;
  float fcTable =   q.y - .2727511892 - .05;
  float fcCulet = - q.y - .8692867378 * .96;
  float fcGirdl = length(q.xz) - .975;
  return max(fcGirdl, max(fcCulet, max(fcTable, max(fcBezel, max(fcStar, fcUGird)))));
}
```
鎖の距離関数

```chain.glsl
// r=鎖の径、l=鎖一つの長さ、w=太さ
float sdChain(vec3 p, float r, float l, float w){
  float a=(l+r-w)*2., x0=mod(p.x, a*2.), x1=mod(p.x+a, a*2.);
  return min(length(vec2(length(vec2(max(abs(x0-a)-l,0.),p.z))-r,p.y))-w,
             length(vec2(length(vec2(max(abs(x1-a)-l,0.),p.y))-r,p.z))-w);
}
```
ハートシェイプカットについては、力技でねじ伏せてる感じです。ブリリアントカットを同心円上で拡大縮小することでハート型に加工しています。この方法だと、真ん中で折れてしまうファセットが発生して、厳密なハートシェイプカットより面数が多いのですが、それっぽいのでとりあえず良いかなと思ってます。
それよりも、鎖の距離関数を3行程度で導出できたのが、結構美しくてお気に入りです。

# Tips #4
成果物4つ目です。
[glass and metal hearts](https://www.shadertoy.com/view/MdfcRs)
とりあえず[WebGL Advent Calender 2017](https://qiita.com/advent-calendar/2017/webgl)に1本寄稿予定です。絶賛停止中でしたが、今後も少しづつ書いていこうと思ってます。
- ハートシェイプカット・鎖の距離関数
- 反射物体と透過物体を同時に効率よくレンダリング
- 古典的なレイトレースによる背景描画と模様計算
‐ Shadertoy のフーリエヒストグラム連携
PHPUnit チートシート

# PHPUnitチートシート

コマンドを何度も調べたりするのが面倒なのでメモを作成。

## 参照

[PHPUnit マニュアル](https://phpunit.de/manual/current/ja/appendixes.configuration.html)
[PHPでテスト自動化を実現しよう（PHPUnit Jenkins Selenium 活用編） Kindle版](https://www.amazon.co.jp/PHP%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E8%87%AA%E5%8B%95%E5%8C%96%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%97%E3%82%88%E3%81%86%EF%BC%88PHPUnit-Jenkins-Selenium-%E6%B4%BB%E7%94%A8%E7%B7%A8%EF%BC%89-kenpapa-ebook/dp/B072YG53BF)

## XMLファイル

``` phpunit.xml
<phpunit>
    <filter>
        <whitelist processUncoverdFilesFormWhitelist="true">
            <directory suffix=".php">.</directory>
        </whitelist>
    </filter>
</phpunit>

```

## 実行コマンド

```
phpunit --coverage-html html <dir>
```

```
phpunit --whitelist <dir> 
```

## Mock生成

```
$mock = $this->getMockBuilder(クラス名::class)->setMethods(['配列でメソッド名'])->getMock();
$mock->expects($this->once())->method('メッソド名')->will($this->returnValue(戻り値));
```
できるだけコードを書かずにwebサイトの改善仮説を検証する方法2つ

この記事は「[IDOM Engineer Advent Calendar 2017](https://qiita.com/advent-calendar/2017/idom-engineer)」の1日目の記事です。

#はじめに

webサービスを運営していると、日夜試したい改善のアイデアが湧いてきます。
「購入動線のボタンの色をテストしようぜ」
「×××っていう新しいサイト解析サービスがあるから試してみよう」
「商品のレコメンドしたいよね」

「どれも効果ありそうだし、とりあえず全部やろう」となりがちなのですが、私が経験した中では多くの場合

> 施策が当たる可能性は、その施策の実装にかかった工数に反比例する

という非情なマーフィーの法則が発動してしまいます。
そこから脱却し、リーン的PDCAを回そうと思った時に、私が使ったツールを紹介します。

# Google Optimize
今年から全ユーザに公開された[Google Optimize](https://optimize.google.com/)は、ボタンの色や文言、ヘッダーに差し込む画像、表示上の改善であればGoogle Optimizeを使って検証することができます。

こんな感じでテキストを変更します。
![スクリーンショット 2017-11-30 14.42.14.png](https://qiita-image-store.s3.amazonaws.com/0/44525/95cd2c29-ab7f-045d-f94b-ad95437af8eb.png)

こんな風にスタイルを編集できます。
![スクリーンショット 2017-11-30 14.43.46.png](https://qiita-image-store.s3.amazonaws.com/0/44525/68a7b5d4-7cfa-2cdb-cf00-437b73970749.png)

直接HTMLを書き換えるのも簡単
![スクリーンショット 2017-11-30 15.04.14.png](https://qiita-image-store.s3.amazonaws.com/0/44525/d0025deb-240b-ffd8-69f6-db24b7a6dcc9.png)

設定方法はこちら
[オプティマイズを設定する](https://support.google.com/360suite/optimize/answer/6211921?hl=ja)

# ※準備中
その機能のメニューを追加しておいてクリックすると、実際にその機能はなく静的なページを表示する（あるいは「準備中です」のポップアップを出すだけ）というとてもローテクな方法です。
意外と機能のニーズ検証はこれをやるだけで実装に迷いが無くなったりするので、少ないコストでチームの精神衛生を保つことができたりします。

この場合、自前で効果検証が必要なので、Google Analyticsなどを使って効果検証をするためのイベントを仕込む必要があります。

直接Google Analyticsのカスタムイベントトラッキングを呼び出すのも良いですが、JSのあちこちにイベントトラッキングのコードが分散して「今何をトラッキングしてるんだっけ？」となりがちです。
なので、可能な限りGoogle Tag Managerと組み合わせると良いと思います。

[Google タグマネージャによるイベント トラッキング](https://support.google.com/analytics/answer/6164470?hl=ja)

Tag Managerがデフォルトで用意していないイベントをトラッキングしたい場合、以下のようにTag Managerのトリガーをjavascriptからキックすることもできます。

```js:何かしらのイベントをTagManagerで計測する
function onXXXXEvent(){
    (window.dataLayer || (window.dataLayer = [])).push({'event':'event_hoge','event_label':'lavel_fuga'});
}
```

# 終わりに
少ないコードでより効果の高い改善ができると、自分の書いたコードの価値を実感しやすくなって、さらなる改善へのモチベーションにもつながります。

昔はA/Bテストのためのツールを自前で作ったりしていましたが、どんどん改善されていくツールに自前のシステムを最適化させていく方が圧倒的に効率がいいですね。
【MarkLogic Server】XQueryチューニングメモ～パスの書き方

はじめに
===
これまでいくつかチューニングの記事を挙げてきましたが、今回は問い合わせ言語「XQuery/XPath」についてのチューニング手法を挙げていきたいと思います。性能チューニングで行き詰ったときはまず試してもらいたいものを列挙していきます。

「//」というパス表現はなるべく避けよう
===
あるXML形式変数$aからsaleSum要素を取り出すとき、以下の2パターンのXPathが考えられます。

```
パターン①・・・$a/repeat/info/saleSum
パターン②・・・$a//saleSum
```

慣れていない人のプログラミングではついついシンプルに見えるパターン②の記述を採用するのを見かけますが、「//」というXPathは$aの子孫の要素すべてを評価対象にします。また仕様変更でsaleSum要素が全く別の意味で追加されると、従来まであったクエリの戻り値が仕様と異なるものになる恐れもあるので、必ずパターン①のように要素名を書くことをお奨めします。


子ノードをたどるときは「node()」より「*」を使ってみる
===
取得対象の要素名が変数だった場合、以下の2パターンのXPathが考えられます。

```
パターン①・・・$a/*[fn:name() = $elementName]/text()
パターン②・・・$a/node()[fn:name() = $elementName]/text()
```
この2個のノードテスト記述は以下のような微妙な違いがあります。

| パス表現 | 取得対象 |
|---|---|
|*|主ノード型の全てのノード|
|node()|全てのノード|

「\*」は軸となっているノードの種類を要素・属性・名前空間と判別して、これに限定したノードテストを行います。要素のみを相手にすればよい場合、「\*」を使う方が良いようです。

複数の子ノードを取得するコストをハッシュマップで抑える
===
パス表現は、例えば\$a/sampleと明確に要素名をしていた場合でも、\$aの全ての子ノードの名前を「sample」と照合します。このため$aから複数の子ノードを参照する場合、何度も同じ照合を受ける要素が出てきます。では、初めに子ノードを全て確認してハッシュマップに入れておけばどうでしょうか？2個目の要素からはパス取得せず、ハッシュマップを参照すればよくなり無駄な照合が省けそうです。

実は通常のXQueryではハッシュマップのデータ型はなかったりしますが、MarkLogicにはmap:map型というハッシュマップを実現するデータ構造があります。[こちら](https://developer.marklogic.com/blog/im-a-map "こちら")に使い方などの説明があります。
適用方法や効果は、以前に書いた[記事](https://qiita.com/JucoML/items/2842091ba1ee0c47414e "記事")を参照して頂ければ思います。

本項ではXQuery/XPathを対象にしていますが、例えばJava上で行う無索引のXMLパースでは、この考えがさらに性能向上効果をもたらします。

おわりに
===
RDBより複雑な構造を持つXMLに対する問い合わせ言語であるXQuery/XPathは、「子だけなのか？子孫すべてなのか？」など選択の余地が幅広いのが特徴です。今回は、多用されかつ修正も容易そうなパス表現を対象にしました。性能問題に対応するときは、まずはこの辺りを見ることをお奨めします。


```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
Kotlinの近況を整理してみた

# 最初に

この記事は[WHITEPLUS Advent Calendar](http://qiita.com/advent-calendar/2017/whiteplus "")  2017 1日目になります。

こんにちは。株式会社ホワイトプラス、エンジニアの @knakamigawa です。

私はホワイトプラスでは、
- 衣類オンラインクリーニングの[リネット](https://www.lenet.jp/)
- 布団オンラインクリーニングの[ふとんリネット](http://www.futonlenet.jp/)
- 靴オンラインクリーニングの[くつリネット](http://www.kutsulenet.jp/)

の各サービス、特にふとん、くつのサービスを中心に
フロントエンドからサーバーサイドまで広く担当しています。

## 仕事でやってる事の一例

- Reactでのフロントエンド開発
- PHPでのWeb開発
- GolangでのAPI開発
- サービス仕様の検討、提案

と、実は仕事でKotlinを書いていないのですが、Kotlinを社内で布教して行くため今回もKotlin（昨年も[Kotlin](https://qiita.com/knakamigawa/items/de0082d2a8449b09acf6) でした）について書きたいと思います。

# Kotlinのはなし

11月の頭に行われたKotlinConfにて様々な発表があったので遅ればせながらRecapして行きたいと思います。
拙い英語力で読み取った内容なのでもし誤りがあったらご指摘頂けると幸いです。

Kotlin Conf Keynote Recap
https://blog.jetbrains.com/kotlin/2017/11/kotlinconf-keynote-recap/


### Webバックエンド
KotlinのWebフレークワークKtorが0.9になったこと。
使ったことがないので雰囲気しか言えませんがRubyのSinatraのような軽量フレームワークのように見えます。
モバイルアプリのAPIなど手軽に作れそう。

### Webフロントエンド
Kotlin/JavaScript、いわゆるAltJSで、TypeScriptのようにJSにトランスパイルします。
create-react-kotlin-app（https://github.com/JetBrains/create-react-kotlin-app/ ）を用いてReactフロントエンドアプリケーションの構築を手軽に行えるようになりました。（まだお試し版という位置付けですが）
create-react-kotlin-appはまんまReactのcreate-react-appのKotlin版で、npm installして使います。yarnで起動、ビルドなど手軽にできます。

### ネイティブアプリ（Android以外のはなし）
- Kotlin/Native v0.4でのiOS対応
- Kotlin/NativeのIDEサポート

そもそもKotlin/Nativeってなんじゃらほい。
今までのJVMで動いているKotlinをKotlin/JVMと記述するとなんとなーくわかってくるかと思いますが、LLVMを用いてJVMを用いずにバイナリを作成して実行する為の仕組みです。

現在はJVMが動かない環境やアプリケーションのフットプリントを小さくしたいアプリ向けという位置付け。

いちばんわかりやすいのは先に書いたようにv0.4で対応したKotlinでiOS向けのアプリが作れるという事です。

また、Kotlin/NativeがIDEサポート。テストやデバッグをIntellijIDEAから実行可能になります。今後もサポートを進めて行くとのことなのでKotlin/Nativeでの開発がどんどん便利になっていくと考えられます。

## マルチプラットフォーム

これらのWebバックエンド、フロントエンド、ネイティブ（iOSなど）を組み合わせたマルチプラットフォーム対応の例としてKotlinConfの講演スケジュールアプリが作られています。（まだ中身をしっかり見れていないので年末年始のネタかな・・・）
https://github.com/jetbrains/kotlinconf-app

マルチプラットフォーム向けの機能として、common moduleという仕組みが実装されました。
これはバックエンド（Kotlin/JVM）、フロントエンド（Kotlin/JS）、ネイティブアプリ（Kotlin/JVM、Kotlin/Native）などで共通のmoduleとして実装、各層向けにビルドすることでコードの多重実装を防ごうという目的のものです。



このKotlinマルチプラットフォームによって、最初に仕事でやってる事の一例 としてあげた
- Reactでのフロントエンド開発
- PHPでのWeb開発
- GolangでのAPI開発

この3つの領域＋ネイティブアプリ全てがKotlinで書くことが可能となりました。
実際には既存コードや固有の問題など簡単な話ではありませんが、Kotlinを学ぶだけでフロントエンドからバックエンド、アプリまでカバー出来るエンジニアになれるかも知れません。


# おわりに

いまさらで特に目新しい話題があるわけではないのですが自分の中で整理をする意味も込めてまとめてみました。

そんなこんなで今年は今まで以上にKotlinが大きく話題になった1年でした。
来年にむけてさらにKotlinの勉強をしていこうと思います。

ということをつらつらと書いていたらKotlin 1.2が正式リリースされてました。
https://blog.jetbrains.com/jp/2017/11/29/828
早速common moduleを試してみたいと思います！


---

明日はシステム開発Gマネージャー @t_yamatoya にバトンを渡します。
タイトルは「 ホワイトプラスを支えるエンジニア」
どんなエンジニアがいるのか、どんな仕事をしているのかみたいな内容とのことです。

# ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[新しい技術にどんどん挑戦したい！という技術で事業に貢献したいエンジニアを募集](https://www.wantedly.com/projects/169974)しております。
SP2LCとは

# SP2LCとは？

SP2LCとは，Salesian Polytechnic System Programming Learning Communityの略です．
東京都町田市にある私立の高等専門学校である[サレジオ工業高等専門学校](http://www.salesio-sp.ac.jp/)で設立された情報系学生プロジェクトです．
主に，プログラミングやシステム（サーバー，ネットワーク）などを学ぶための「**場所**」として提供しています．

## 具体的に何をしているか

学ぶための場としてただただ自由に使えるサーバーやネットワークを提供するだけではなく，学んだことを発表したりしています．
その活動の一つとして，[全国高専プロコン](http://www.procon.gr.jp/)や[KOSEN SECCON](https://sckosen2017.kisarazu.ac.jp/)，[Microsoft Imagine Cup](https://imagine.microsoft.com/)などに挑戦をしています．

コンテストなどだけでなく，[高専カンファレンス](http://kosenconf.jp/)への参加や企画，運営なども行っています．

## 学生たちのスキル

学生たち（OB/OG）のスキルは私が話すまでもなく[SP2LC Advent Calendar](https://qiita.com/advent-calendar/2017/sp2lc)を見て頂ければわかると思いますので，楽しみにしてください．
ApplicationProperties 

#概要
プロパティのコレクションを管理します。

これは、PropertiesFileオブジェクトを管理するためのやや上位のラッパーです。

内部には、ユーザー固有の設定（ユーザーディレクトリに格納されているもの）と、すべてのユーザーに共通の設定（すべてのユーザーがアクセスできるフォルダに格納されているもの）の2種類のPropertiesFileオブジェクトがあります。

このクラスは、オンデマンドでこれらのファイルの作成を管理し、getUserSettings()およびgetCommonSettings()メソッドを介したアクセスを許可します。

ApplicationPropertiesオブジェクトのインスタンスを作成したら、最初にsetStorageParameters()を呼び出して、ファイルの作成に使用するパラメータを指定する必要があります。

いわゆるアプリのプロジェクトファイルやユーザーコンフィグなどアプリの設定値を管理するためのクラスという認識でよさそう。

作成されるファイルは以下のフォルダにデフォルトでは保存される。

windows
```C:\Documents and Settings\username\Application Data\[folderName]\[applicationName].[filenameSuffix]```
macos
```~/Library/[osxLibrarySubFolder]/[folderName]/[applicationName].[filenameSuffix]```


[リファレンス](https://juce.com/doc/classApplicationProperties)

#検証


```cpp:test.cpp
//==============================================================================
int main (int argc, char* argv[])
{
	initialiseJuce_GUI();	//GUIが初期化できていないと動作しない

	ApplicationProperties apppro;
	PropertiesFile::Options options;

	//ファイル名を決定する
	options.applicationName = "ApplicationPropertiesTest";
	options.filenameSuffix = ".settings";
	options.osxLibrarySubFolder = "Application Support";
	apppro.setStorageParameters(options);

	//これが初めて呼び出されると、プロパティファイルが作成されてロードされます。
	juce::PropertiesFile* commonProperties = apppro.getCommonSettings(true);


	//環境により以下のフォルダに格納される
	//windows	C:\Documents and Settings\username\Application Data\[folderName]\[applicationName].[filenameSuffix]
	//macos		~/Library/[osxLibrarySubFolder]/[folderName]/[applicationName].[filenameSuffix]
	//linux		~/[folderName]/[applicationName].[filenameSuffix]
	juce::PropertiesFile* userProperties = apppro.getUserSettings();
	userProperties->setValue("mode", true);
	userProperties->setValue("x", 1);
	userProperties->setValue("y", 1.5f);
	userProperties->setValue("z", 1.2);

	//現在の値のディスクへの書き込みが強制的に行われます。
	userProperties->save();

	//最後の値から変更されていれば、すべての値がディスクにフラッシュされます
	apppro.saveIfNeeded();

    return 0;
}

```
```out.xml
<?xml version="1.0" encoding="UTF-8"?>

<PROPERTIES>
  <VALUE name="mode" val="1"/>
  <VALUE name="x" val="1"/>
  <VALUE name="y" val="1.5"/>
  <VALUE name="z" val="1.1999999999999999556"/>
</PROPERTIES>
```

#補足

挙動を確認しgetCommonSettings()、getUserSettings()は同じパラメータについて環境共通の状態(common)とユーザーごとの上書き値(UserSettings)を取り扱う想定ではないかと推測する。
SourceTree 「SSHキーによる認証に失敗しました。...」

## 現象
WindowsのGitBashからはpushできるのにSouceTreeからはできない。

## 原因
SouceTreeのデフォルトのSSHクライアントの設定がPuTTYになっていて、
マシンに登録されているSSHキークライアントがOpenSSHだった。

SSHクライアントをOpenSSHに設定してあげれば解決。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/33237/d5c39131-04eb-8a5e-6df3-7917633c2c67.png)
JUCE ValueTreeSynchroniser

#概要
このクラスは、ValueTreeの状態に対するすべての変更を監視し、それらを送信可能なバイナリエンコーディングに変換するために使用できます。

このクラスの目的は、エンコードされた変更をある種のトランスポートメカニズムを介して送信することによって、2つ以上のValueTreeをリモートで同期させることです。

これを使用するには、ValueTreeSynchroniserのサブクラスを実装し、エンコードされた変更を（ネットワークなどの手段を使用して）リモートの宛先に送信するためのstateChanged（）メソッドを実装し、ターゲットツリーに適用する必要があります。


#検証
リモートPCへデータを送信しビュアー的なものに反映するのに便利そうなクラスであるが検証は後日
Capistranoで `repository not found` と言われる


GitHubやBitBucketでリポジトリを移動したりリネームした後、手元のconfig/deploy.rbを修正しても、すでに存在する(capistranoの)リモートリポジトリの方で `repository not found` と怒られてしまうことがあります。

config/deploy.rb ではなく以下の位置にURLを記憶してしまっていることが原因です。ここも合わせて書き換えるとうまくいくようです。

``` repo/config
url = git@bitbucket.org:foo/bar.git
```


https://stackoverflow.com/questions/30282567/deploying-rails-app-with-capistrano-error-repository-not-found
ActiveAdminでPOSTパラメータを加工してUpdateするメモ

# 問題
- ActiveAdminで簡単に管理画面を作りたい
- PostgreSQL特有のデータ型はがないので自作する必要がある
  - 本当はformをいじるなりしてデータ作成出来るようにするほうが良いと思われる
- Formtastic::Inputs(および付随するjs/css)を書く手間をかけたくない
  - そうだActiveAdmin側のcontrollerを変更しよう

# 注意点とか？
- `ActiveAdmin.register Post do ... end`とするとAdmin::PostContollerが定義されている
  - その中でcontollerを定義すればオーバーライドできる
- resource_paramsはArrayにActionController::Parametersが入っていた
  - 未確認：複数インスタンスを扱うため？

# サンプルコード

```ruby:app/admin/post.rb
ActiveAdmin.register Post do 
  permit_params :uid, :name, :meta, :related_ids

  form do |f|
    f.semantic_errors # shows errors on :base
    f.inputs do
      f.input :uid
      f.input :name
      f.input :meta,         as: :text    # json,jsonb型をtextとして扱う
      f.input :related_uids, as: :string  # arrayをstringとして扱う
    end
    f.actions
  end # form
 
  controller do
    # 既メソッドを利用してパラメータを加工する
    # https://github.com/activeadmin/inherited_resources/blob/46493ce10fc7d9f0bcd753f5d298c67ca83cf9b0/lib/inherited_resources/base_helpers.rb#L316
    # https://github.com/activeadmin/inherited_resources/blob/46493ce10fc7d9f0bcd753f5d298c67ca83cf9b0/lib/inherited_resources/base_helpers.rb#L356
    def nomralized_params
      resource_params.map{ |p|
        p.merge(
          related_uids: p[:related_uids].split.map{&:to_i}
        )
      }
    end

    # メソッドをオーバーライドする
    # https://github.com/activeadmin/inherited_resources/blob/46493ce10fc7d9f0bcd753f5d298c67ca83cf9b0/lib/inherited_resources/actions.rb#L42
    def update(options={}, &block)
      object = resource
      if update_resource(object, nomralized_params)
        options[:location] ||= smart_resource_url
      end

      respond_with_dual_blocks(object, options, &block)
    end
  end

end
```
Cloud9でvue-cli環境を作る

最近開発はめっきり[cloud9](https://c9.io/?redirect=0)でやってます。

Cloud9便利ですよね。
環境構築する必要がないのですぐ試せるし
クラウドなのでPCさえあればどこでも同じ環境ですぐ実行できます

~~さらに現在の現場ではプロキシかまされててGitHub等にpushできないんですが、Cloud9ではそんなん関係なくpushできる~~

## Cloud9でvue-cliを使う
VueJSの雛形を作成するvue-cliをCloud9で使おうとしたら少しハマったので、備忘録も兼ねて

cloud9のworkspaceは **Node.js** を選択しております

### vue-cliインストール
まずはvue-cli自体をインストールします

```bash
npm install -g vue-cli
```

### vue.jsプロジェクトを作る
次にカレントディレクトリにvue.jsのプロジェクトを作ります

```bash
vue init webpack .
npm install
```

### サーバを立ち上げてみる
```bash
npm run dev
```

デフォルトの状態で立ち上げると以下の画面になり正常に表示されません
![アセット 1.png](https://qiita-image-store.s3.amazonaws.com/0/203247/3ef2e9d6-c79d-4f5f-8bde-0e0bfb29af5d.png "アセット 1.png")

## Cloud9でサーバを起動できるように修正

Cloud9ではポートやIPアドレスの設定を変更する必要が多々あり、今回のvue-cliもその対象でした。

**build/webpack.dev.conf.js**の24行目付近を以下のように修正します

```diff
devServer: {
  clientLogLevel: 'warning',
  historyApiFallback: true,
  hot: true,
  compress: true,
- host: process.env.HOST || config.dev.host,
- port: process.env.PORT || config.dev.port,
+ host: '0.0.0.0',
+ port: '8080',
+ disableHostCheck: true,
```

### サーバを立ち上げてみる
```bash
npm run dev
```

この状態でサーバを立ち上げると以下のページが表示され正常に起動することができました
![アセット 1.png](https://qiita-image-store.s3.amazonaws.com/0/203247/75c0f224-5319-9b4d-96f5-f8b33fe3cda3.png "アセット 1.png")

以上です
Redmine > SSL > 動作遅くなる時の対処


# SSLにした瞬間に遅くなる

SSLにした瞬間に動作がもっさり遅くなりました。

原因はキャッシュを不可にしている事からのようです。

以下を参考にさせていただきました。



[lambda me : Redmineが急に遅くなった](http://atsuyama.blog.jp/archives/51330678.html)

[でぃべろっぱーってへてむる: SSLだとRedmineが遅い件](http://devml.blogspot.jp/2009/08/sslredmine.html)


## 対処法
以下のファイルに数行追加します。
`vi /etc/httpd/conf.d/ssl.conf` 
ファイルの末尾、</VirtualHost>の上に以下を追記しました。

```
## 静的ファイルをキャッシュ
Header onsuccess append Cache-Control public  

ExpiresActive On 
ExpiresByType text/css "access plus 3 days" 
ExpiresByType application/x-javascript "access plus 3 days" 
ExpiresByType image/jpeg "access plus 3 days" 
ExpiresByType image/png "access plus 3 days" 
ExpiresByType image/gif "access plus 3 days"

```


ファイルを保存してRedmineを確認すると、早くなりました。