OmniAICreator/Qiita-1.07M huggingface dataset:
不審メールでiqyファイルが流行ってます

#はじめに
.iqyという聞き慣れない拡張子を持つウィルスメールが流行っているそうなので調べてみました。

#.iqy ファイルとは
iqyは「Internet Inquiry File」の略。
エクセルで「Webクエリ」という機能を使うと生成される、中身はURLが書かれているテキストファイルです。

Webクエリ機能自体はだいぶ昔(Excel97くらい)から実装されているらしく、web上にあるテーブルを取り込んでエクセルに貼り付けてくれるものです。

・・・便利だ。。知らなかった。。

.iqyファイルのフォーマットは以下
>1行目はWEB（固定）（省略可能）
2行目は1（固定）（省略可能）
3行目はURL
4行目以降は3行目が200文字を超える場合に使用する。

.iqyファイルをダブルクリックして実行するとエクセルが起動しますが、データ接続をしてもよいかの問い合わせダイアログが表示され、OK押下でWEBにアクセスし、データをエクセルに表示しています。

さて、これがどのように攻撃につながるのでしょうか。。

#攻撃手法
[【トレンドマイクロ】拡張子”.iqy”のファイルとは？1 日でメール 29 万通が日本国内に拡散](https://blog.trendmicro.co.jp/archives/19387)
.iqyファイルを添付したメールを送付、.iqyファイルを開くと最終的にバンキングマルウェア「Ursnif」に感染する。という攻撃が流行っているそうです。

[【はてな】『ご請求額の通知』『インボイス』『プロジェクト』『写真』『支払い』『文書』『請求・支払データ』『資料』の調査](https://bomccss.hatenablog.jp/entry/2018/08/10/033607)
検体を解析した情報が載っています。
1. .iqyファイルを開くとまず攻撃コードをダウンロードします。
2. 攻撃コードには
`=CMD|'/C PoWerSHeLL ...`
と、エクセルからコマンドプロンプトを起動し、PowerShellを更に起動しています。

#感想
うまいことやりますね。。なるほど〜と感心しました。
エクセルの方では .iqy ファイルを開くときに注意ダイアログが、コマンドプロンプトを開くときに更に注意ダイアログが表示されるので、たぶん感染する人はだいぶ少ないのではないかと思います。

#参考

[【JC3】不正送金等の犯罪被害につながるメールに注意](https://www.jc3.or.jp/topics/virusmail.html)

[【INTERNET Watch】拡張子「.iqy」の添付ファイルに注意！　ウイルス感染狙うメールが1日だけで29万件も拡散](https://internet.watch.impress.co.jp/docs/news/1137534.html)

[【トレンドマイクロ】拡張子”.iqy”のファイルとは？1 日でメール 29 万通が日本国内に拡散](https://blog.trendmicro.co.jp/archives/19387)

[【はてな】『ご請求額の通知』『インボイス』『プロジェクト』『写真』『支払い』『文書』『請求・支払データ』『資料』の調査](https://bomccss.hatenablog.jp/entry/2018/08/10/033607)

[ウェブデータを有効活用！Excelの「Webクエリ」機能を使って自動取込する](https://rtomura-taxacc.com/excel_webquery/)

[【ブログ】iqyファイルってご存じですか？](http://cutb.jugem.jp/?eid=119)


#履歴
2018/08/12 初版
Mac上でシェルを作成するには

#環境
MacOSX 10.13

#手順
## 任意のディレクトリで、以下ファイルを作成する
/Users/admin/tmp/hello_mac.sh

## 適当なエディタで、コーディング
### 10回、Helloとechoするソースを記述

```/Users/admin/tmp/hello_mac.sh
#!/bin/sh

for i in `seq 0 9`
do
  echo "Hello! Mac. I'm " $i;
done
```

## 実行権限を与えて

```
chmod 755 hello_mac.sh
```

##実行すると

```
sh hello_mac.sh
```

##以下の結果となります

```
Hello! Mac. I'm  0
Hello! Mac. I'm  1
Hello! Mac. I'm  2
Hello! Mac. I'm  3
Hello! Mac. I'm  4
Hello! Mac. I'm  5
Hello! Mac. I'm  6
Hello! Mac. I'm  7
Hello! Mac. I'm  8
Hello! Mac. I'm  9
```
MacにFiddlerをインストールするには

#環境
MacOSX 10.13

#MacにFiddlerをインストールしようとしたがハマった点
以下サイトで、brewコマンドでインストールするって書いてあったので、

```
brew install Caskroom/cask/fiddler
```

```
brew cask install fiddler
```

と試したけど、fiddlerなんて知らないよ　と怒られた。

http://sig9.hatenablog.com/entry/2016/06/26/230000

#改めて、MacにFiddlerをインストールするには
以下サイトを参考にしました。
https://www.k-karakuri.com/entry/2018/02/28/MacOS%E3%81%ABHomebrew%E3%81%A7Http%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%82%BD%E3%83%95%E3%83%88Fiddler%E3%81%AF%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%AA

##手順
###1. Fiddler配布元にアクセスして、利用目的、メールアドレス、国を入力して、ダウンロードボタンを押下
https://www.telerik.com/download/fiddler
![スクリーンショット 2018-08-10 16.09.52.png](https://qiita-image-store.s3.amazonaws.com/0/235774/90f3529a-ac3b-c679-76ab-4900f76ddb12.png)

###２. ダウンロードが始まり、インストール手順のページに遷移される。
https://www.telerik.com/download/fiddler/fiddler-osx-beta
![スクリーンショット 2018-08-10 16.13.13.png](https://qiita-image-store.s3.amazonaws.com/0/235774/b2565987-af9e-3877-c719-fddc379076d4.png)

###３. １から4の手順はそのまま進めれば良いが、5の手順で、ハマりました。

```
mono Fiddler.exe
```

とコマンドを実行しても、
> WARNING: The Carbon driver has not been ported to 64bits, and very few parts of Windows.Forms will work properly, or at all
> Stacktrace:
> 
> (中略)
> 
> Debug info from gdb:
> 
> (lldb) command source -s 0 '/tmp/mono-gdb-commands.ddhs3I'
> Executing commands in '/tmp/mono-gdb-commands.ddhs3I'.
> (lldb) process attach --pid 57585
> warning: (x86_64) /Library/Frameworks/Mono.framework/Versions/5.10.1/lib/mono/4.5/mscorlib.dll.dylib empty dSYM file detected, dSYM was created with an executable with no debug info.

起動できない。

以下、32bit指定で起動出来ました。

```
mono --arch=32 Fiddler.exe
```
Rowhammer攻撃を解説

#はじめに
rowhammer攻撃というメモリの値を無理やり書き換えてしまう手法について調べてみました。

#脆弱性の内容
##前提知識
DRAMの原理とCPU cacheについて知っておく必要があります。役に立ちそうな資料を列挙しておきますので読み漁ってください。

[メモリに関する話題(1)-cache](https://slidesplayer.net/slide/11237092/)

[【wikipedia】Dynamic Random Access Memory](https://ja.wikipedia.org/wiki/Dynamic_Random_Access_Memory)

[DRAMとは](http://rabbitcats.ldblog.jp/archives/67693439.html?.link_prev=1)
この図が重要です。「ランク」と「バンク」の関係についておさえます。
![1ae804d4-s.png](https://qiita-image-store.s3.amazonaws.com/0/272771/9eadb8f8-1e87-2638-7046-d5ed8ff0f854.png)


[今さら聞けないメモリーの基礎知識 FP～BEDO DRAM編](http://ascii.jp/elem/000/000/597/597885/)

[【PDF】DDRメモリ入門](http://jp.tek.com/dl/54Z-21473-1.pdf)

[Ryzenで話題になった、メモリの”Rank”って何のこと?](https://pc.watch.impress.co.jp/docs/column/century_micro/1053794.html)
「ランク」の説明です

##rowhammer
DRAMとCPU cacheについて理解できたということにして、本題に入ります。
![Row_hammer.svg.png](https://qiita-image-store.s3.amazonaws.com/0/272771/bb2c979f-55c6-bd3f-351f-dde046a44ff0.png)

紫の行が値を書き換えたいメモリセルの行、victim rowです。
その上下に黄色い行があります。
この黄色い行に猛烈に値を書き込んでやると、ノイズが大量に発生し、victim rowのメモリセルのキャパシタの電荷が影響を受け、結果値が書き換わります。これが rowhammer です。

ノイズ任せなのでvictim rowのどのメモリセルが影響を受けるのか、値が１になるのか０になるのかはコントロールできません。
(電荷が抜ける方向が主になると思うので値は0になりやすいと思いますが、1になる場合もあるようです。なので1次資料では bit flip という表現を使ってます)

PoCは以下。CPU cacheに乗っているとDRAMまで届かないのでclflushでCPU cacheをフラッシュし、追い出しています。
```
code1a：
  mov（X）、％eax //アドレスXから読み込み
  mov（Y）、％ebx //アドレスYから読み込み
  clflush（X）//アドレスXのキャッシュをフラッシュする
  clflush（Y）//アドレスYのキャッシュをフラッシュする
  jmp code1a
```



この攻撃を成功させるには
1. DDR3, DDR4 でECC無し版
2. DRAMの構成がわかっていること
3. リフレッシュが行われる前に攻撃
が必要です。

1は、rowhammerがノイズ任せなので微細加工の進化によるところが大きいそうです。微細加工によりノイズに弱くなりますからね。 「DDR ゃ DDR2 SDRAM モジュールにはほとんど、または全く影響しない。多くの DDR3 や DDR4 SDRAM モジュールには影響を及ぼす。」とのことです。またECCでエラー訂正するのは効果が高いそうです。

2は、ソフトウェアでアクセスできるアドレスは論理アドレスですが、rowhammerの原理からして物理アドレスに変更し、かつ同一バンク内にある上下行の物理アドレスを特定する必要があります。
linuxだと
`$sudo decode-dimms`
で調べられるようです。(macOSではdecode-dimmsは無かったです。。システムレポートでもわからず)

3は、リフレッシュが行われるとvictim rowの電荷がチャージされて元気になってしまうのでやり直しになる。ということですね。

#感想
面白い攻撃があるものです。

#参考
[Rowhammer問題私的まとめ](http://blog.daionet.gr.jp/knok/2015/03/13/rowhammer/)

[【Project Zero】Exploiting the DRAM rowhammer bug to gain kernel privileges](https://googleprojectzero.blogspot.com/2015/03/exploiting-dram-rowhammer-bug-to-gain.html)

[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%A6%E3%83%8F%E3%83%B3%E3%83%9E%E3%83%BC)

[JVNVU#92147586 統合型 GPU に対する WebGL を利用したサイドチャネル攻撃 および Rowhammer 攻撃](http://jvn.jp/vu/JVNVU92147586/index.html)

#履歴
2018/8/12 初版
jsの繰り返し文eachについて

#jsの繰り返し文eachについて
検索フォームにて予測変換を出す際に活躍するjsのeachを解説します。
以下が今回の例題です。
検索フォームに記入したものが配列で定義されていたものだった場合、テキストとして出力するものです。


```
var fruits = ['apple', 'apricot', 'avocado'];

$(function(){
  $("#submit").on("click",function(){
    var input = $("#keyword").val();
    $.each(fruits,function(i,fruit){
      if (input == fruit){
        $("#result").text(input);
        return false;
      }
    });
  });
});
```
jsにおいてeachは、第一引数に繰り返したい配列をとり、第二引数で取り出したい要素に行いたい処理を記述します。
ここでは、fruitsを変数fruitとして繰り返し処理を行い、配列にて定義したものと一致した場合、処理をとめ、出力を行なっています。ちなみに、functionの引数は第一引数に関数、第二引数で配列の変数を渡しています。
Db2:Netteza/PostgreSQL互換データ型(INT2,INT4,INT8,FLOAT4,FLOAT8)

Db2 11.1には、Oracle, Netteza, PostgreSQLなど他のデータベース製品で使用されるSQLも簡単にDb2環境で実行できるようにするSQLの互換性の機能拡張がいろいろ含まれています。


#シノニム・データ・タイプ

Db2は、CHAR, INTEGER, DECIMALといった標準データ・タイプをサポートしています。
Db2 11.1では、NettezaやPostgreSQLで使われている、以下のデータ・タイプも、シノニムとして扱えるようになっています。

これらのデータ・タイプです。

```
タイプ　　　Db2のどのデータ・タイプか
-------- ---------------------------------
INT2         SMALLINT データ・タイプの別名
INT4         INTEGER データ・タイプの別名
INT8         BIGINT データ・タイプの別名
FLOAT4       REAL データ・タイプの別名
FLOAT8       DOUBLE データ・タイプの別名
```



#シノニム・データ・タイプでテーブルを作成してみる

Db2 11.1のSAMPLEデータベースに接続し、これらのデータ・タイプを使ったテーブルを作ってみます。

```
CREATE TABLE SYNONYM_EMPLOYEE
  (
  NAME VARCHAR(20),
  SALARY     INT4,
  BONUS      INT2,
  COMMISSION INT8,
  COMMISSION_RATE FLOAT4,
  BONUS_RATE FLOAT8
  )
```

INT4, INT2などのデータ・タイプを使ってテーブルの列を定義しましたが、この「シノニム・データ・タイプ名」がそのままシステム・カタログに入っているわけではありません。

シノニム・データ・タイプのかわりに、Db2の本来のデータタイプで定義情報は保管されています。

DESCRIBEコマンドを使ってテーブルの列情報を表示すると、Db2の本来のデータ・タイプで表示されました。





```

DESCRIBE TABLE SYNONYM_EMPLOYEE

                                データ・タイ データ・         列の       スケ
列名                            プ・スキーマ タイプ名         長さ       ール  NULL
------------------------------- --------- ------------------- ---------- ----- ------
NAME                            SYSIBM    VARCHAR                     20     0 はい
SALARY                          SYSIBM    INTEGER                      4     0 はい
BONUS                           SYSIBM    SMALLINT                     2     0 はい
COMMISSION                      SYSIBM    BIGINT                       8     0 はい
COMMISSION_RATE                 SYSIBM    REAL                         4     0 はい
BONUS_RATE                      SYSIBM    DOUBLE                       8     0 はい

  6 レコードが選択されました。
```








#参考資料



- [Db2 11.1 Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.welcome.doc/doc/welcome.html)

    - [SQL の互換性の機能拡張](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.wn.doc/doc/c0054107.html)
        - 新しいデータ型
        

    - [データ・タイプの別名](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.porting.doc/doc/r0061981.html)
【自分用メモ】WindowsServer2016で作成した共有フォルダにアクセスできない

# 事象
WindowsServer2016にて、全てのユーザがアクセス可能な共有フォルダを設定したが、他のサーバやPCからそのフォルダにアクセスできない。

# 対応内容
共有の詳細設定の変更を行った。

- コントロール パネル->すべてのコントロール パネル項目->ネットワークと共有センター->共有の詳細設定
    - ゲストまたはパブリック
        - ファイルとプリンタの共有を有効にする
    - すべてのネットワーク
        - パスワード保護の共有を無効にする
MATLABのdiff関数って中心差分とかもサポートして良くない？

3分記事。

MATLABで差分diffという関数は簡単に離散n階差分を計算してくれますが，便利のように見えて配列の数を1つ減らしてしまうのがだるいです。
あとは，中心差分もサポートしてほしいっす。

## 中心差分の精度

以下のスクリプトを走らせてみてください。

```matlab
%% Function
Fun = @(x) exp(-x).*sin(3*x); 
dFun = @(x) -exp(-x).*sin(3*x)+ 3*exp(-x).*cos(3*x);
%% Data
x=linspace(0,4,101);
F=Fun(x);
h=x(2)-x(1);
xCentral=x(2:end-1);
dFCenteral=(F(3:end)-F(1:end-2))/(2*h);
xForward=x(1:end-1);
dFForward=(F(2:end)-F(1:end-1))/h;
xBackward=x(2:end);
dFBackward=(F(2:end)-F(1:end-1))/h;

%% Comparison
 figure
hold on
plot(xCentral,abs(dFCenteral-dFun(xCentral)),'r')
plot(xForward,abs(dFForward-dFun(xForward)),'k');
plot(xBackward,abs(dFBackward-dFun(xBackward)),'g');
legend('Central','Forward','Backward')

```

ということで中心差分，前進・後退差分の3つの解析解とのエラーを調べてみましたがこんなに違うんですねぇ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/529d5d72-3143-4879-255f-c263f07d8dbb.png)

時系列データをリアルタイムで処理しない限り中心差分を使わない手はないということです。

## diffを使った簡単中心差分クッキング
上記のプログラムの手法だと2つもデータ長が短くなって主にplot等の面で不便です。

以下のように2つのdiffの和として表せば多少スッキリするかな？どうかな？
速度Vを加速度Accに変換しています。（サンプルタイムは1秒としている）

```matlab
start_val = 0; 
end_val = 0;
Acc = ( diff([start_val;V])+diff([V;end_val]) )/2;
```

いうて5分かかった。。。
archLinuxでAnacondaを用いた、ＧＰＵでの機械学習(TensorFlow&Keras)の環境を整えてみた

## はじめに
多分OSは、あまり関係ないです…笑
anacondaを使う人全般だと思います（検証してないので何も言えません）
私自身、大分彷徨ってたどり着いたので、
もしかすると、必要な手順を飛ばして書いているかもしれません…
どうしても解決出来ない場合は、
ご連絡頂くか、オンライン質門サービスをご利用してください…

**初学者ゆえ間違えがあるかと思います。心優しいご指摘お待ちしております！**

利用環境
・DELL XPSタワー
・nvidia 1060
・archLinux (多分OSはあまり関係ないです…)

前提として、OSインストール済み、GUI環境が整っているものとします。

##anacondaのインストール
お好きなブラウザから、Anacondaの公式サイトから、Linux版をインストール。

こちらの公式サイト様からダウンロード
https://www.anaconda.com/download/#download

Anacondaのインストールについては、下記サイト様が詳しく書いてあるので参考に。
(こちらはubuntuだが基本は同じ)
https://pythondatascience.plavox.info/python%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/anaconda-ubuntu-linux


７月１７日確認時点では5.2.0だった。

そして、下記のサイト様の「condaからtensorflowをインストール」参考に進める。
https://vanhuyz.com/install-tensorflow-with-anaconda/

## パッケージのインストール
こちらの、サイトにはCPU版のみと書いてあるが、７月１８日現在
####GPU版もある！！

どのサイトもCPUの情報しか書いてなかった…
単純に、私の検索能力が足りなかっただけかもしれないが…
(ここで２日は無駄にした)

さらに、~~煩わしかった~~CUDAやcuDNNまでも、
anacondaで環境構築できる為、特に考える必要がない！

**これにより、飛躍的に難易度が降下**したと思っている…


もし、TensorFlowのCPU版をインストールしていたら、
`conda uninstall tensorflow`
を、してあげる必要がある。

この先は簡単
`conda install -c anaconda cudatoolkit cudnn tensorflow-gpu keras-gpu`
をすれば、多分全部入る…多分…

結構インストールに時間はかかる。

インストールが終わったら、下記サイト様のサンプルをありがたくコピペさせていただく。
https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.py

正しくGPUで実行出来ていると、GPUへのアクセス？みたいなメッセージが流れていく。

ちなみに、私の環境では
GPU無し 約9分
GPU有り 約1分30秒
約6倍と、かなりの高速化が見られた。


## おわりに
投稿しようと思い大分時間が経ってしまいました…
初投稿ゆえ、読みづらい点などあるかと思いますが、大目に見みてください…
また、お気付きの点などごさいましたら、ご連絡くださいませ！
JSTQB AL テストマネージャ 第４章 150分

### 参考
ありがとうございます

- [Advanced Level シラバス日本語版 テストマネージャ](http://jstqb.jp/dl/JSTQB-Syllabus.Advanced_TM_Version2012.J03.pdf)

- [スクエアリング　｜　用語集](http://squaring.jp/term/terms.do)

- [テストマネージャ試験対策勉強会](https://www.slideshare.net/mhlyc/ss-63870834)



## 4.2 欠陥ライフサイクルとソフトウェア開発ライフサイクル

```
欠陥　＝　障害 ： システムに含まれる不備
誤り　＝　エラー：　間違った結果を生み出す人間の行為
故障　：　期待した結果から逸脱すること
不正：実際の結果とテストの期待結果に相違が生じる
```
静的テストは、故障ではなく欠陥を直接発見する。

テスト担当者が不正を観察しない場合、偽陰性結果が発生することがある。

- 偽陰性 陰性が偽
    - 欠陥がありだが、陰性（欠陥なし）と判断してしまう。


#### 4.2.1 欠陥ワークフローと状態
欠陥に対して、テストチームが行うべき活動

- 初期状態
    - 欠陥を解決できる人が不正を再現できるように、必要な情報を収集する
    - この状態は、「オープン」状態または「新規」状態とも呼ぶ。
- 返却状態
    - 初期の情報収集プロセスまたはテスト自体が不十分であったことを意味する
    - これは、「拒否」状態または「明確化」状態とも呼ぶ。
- 確認テスト状態
    - 問題が解決したかの確認を行う
    - この状態は、「解決済み」状態または「検証」状態とも呼ぶ。


#### 4.2.2 無効および重複した欠陥レポートのマネジメント
偽陽性結果をもたらす

- 偽陽性
    - 欠陥なしだが、陽性（欠陥あり）と判断してしまう

#### 4.2.3 クロスファンクショナルな欠陥マネジメント

```:クロスファンクショナルチームとは
経営の課題を解決するために、社内だけではなく外部からも人材を招へいし、結成されたチームのこと。
```
```:欠陥マネジメント（または欠陥選別）委員会とは
クロスファンクショナルなステークホルダのチーム。
報告された欠陥の初期検出から最終的な解決（欠陥除去、欠陥除去の延期、報告取り消し）に至るまでを管理する。
構成管理委員会と同じチームとなることがある
```

- 各欠陥レポートが有効な欠陥を示しているかどうか、および解決すべきか延期すべきかどうかを決定する
    - 解決しない場合に生じるメリット、リスク、及びコストを検討する

## 4.3 欠陥レポート情報
- 欠陥レポートに含める情報、3つの目的
    - 欠陥ライフサイクル全体でのレポートのマネジメント
    - プロジェクトステータスのアセスメント、特に、プロダクトの品質とテスト進捗に関するもの
    - プロセス能力のアセスメント


ISO 9126（ISO 25000に改訂中）
IEEE 829
IEEE 1044

直交欠陥分類法

## 4.4 欠陥レポート情報によるプロセス能力の評価
- 欠陥レポートを、プロジェクトステータスのモニタリングとレポートに役立てる
- 欠陥情報は、プロセス改善の取り組みを支援する必要がある。
    - 各フェーズでの欠陥検出効率を改善する方法を提案する。
    - 欠陥の総数を削減するための的を絞った改善を行う。
    - 欠陥の総数を削減するためのプロセス改善を行う。
    - 欠陥により発生するコストを最小化する。
    - 問題の多いコンポーネントのりエンジニアリングを可能にする。

- 見つけた欠陥を追跡しないことがある。
 - 効率性の名目やプロセスオーバーヘッドを削減する目的で頻繁に行う。
 - 実際には、テストとソフトウェア開発のプロセス能力に対する視認性を大幅に低下させる。
Mac のTerminalのコマンドメモ

#目次
1. [ファイルの行数カウント](#ファイルの行数カウント)
2. [ファイルの行数カウント（フォルダ配下全ての合計）](#ファイルの行数カウント（フォルダ配下全ての合計）)

#ファイルの行数カウント
1. Finderから対象のファイルを右クリック後、Optionボタンを押す。
2. 「コピー」のメニューが「パスをコピー」になるので、それを選択する。
3. Spotlightのウィンドウを起動し、「terminal」と入力し、起動する。
4. `wc -l `と入力し、先程コピーしたパスを貼り付け
5. Enter！！！

#ファイルの行数カウント（フォルダ配下全ての合計）
1. Finderから対象のフォルダを右クリック後、Optionボタンを押す。
2. 「コピー」のメニューが「パスをコピー」になるので、それを選択する。
3. Spotlightのウィンドウを起動し、「terminal」と入力し、起動する。
4. ディレクトリを移動 → `cd ` と入力し、先程コピーしたパスを貼り付け
5. Enter！！！
6. `find . -type f | xargs cat | wc -l`と入力
7. Enter!!!
excel 関数 文字列 抽出 結合 カンマ追加

■excelの関数で文字列をここからここまで取得したいとかに使うメモ

①/より前を取得したい場合
192.168.4.0/22
=LEFT(A1,FIND("/",A1)-1)
結果
192.168.4.0

②文字列結合したい場合
192.168.4.0　192.168.4.1
=A1&B1
結果
192.168.4.0192.168.4.1

③文字列結合して、カンマを間に入れたい場合
192.168.4.0　192.168.4.1
=A1&","&B1
結果
192.168.4.0,192.168.4.1
【仕事メモ】OpenAM(Ver13) データストアの連携とローカル認証の確認（２）

# あえて別の記事にします
前回までのOpenAMデータストアの連携とローカル認証の確認であげていた記事で
環境によってはLDAP接続できないことが発生するため、
忘れないようあえて別の記事で記載します。

## 注意事項１：Windowsファイアウォールに要注意
まぁ、OpenAMでもOpenDJの話でもない話ですが、個人的には
見落とすと「えっ？」ってなりやすいポイントだったので書き留めておきます。

私の環境ではAWS上のEC2インスタンス上に構築しており、
そのため、サーバ間の通信はセキュリティグループで制御しています。
（という認識というか思い込みでした）

LinuxのEC2インスタンスはFirewalldもiptablesも搭載されていないため、
そのままセキュリティグループだけで制御されるのですが、
WindowsのEC2インスタンスはWindowsファイアウォールが有効になっています。

__これはやられました…__

なぜかOpenAMデータストア設定の「保存時にスキーマを読み込み」にチェックを入れて、
「保存」をクリックするとConnection Errorが発生します。

OpenAMサーバからldapsearchコマンドを実行して、netstatで確認しても
なぜか、SYN_SENT状態で止まります。

__もしや__

と思ってWindowsファイアウォールを切ってみたら接続することができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/1629b3f8-ca17-51a1-296e-a1a0a16d784f.png)

## 注意事項２：peopleコンテナの指定
データストア設定の項目にpeopleコンテナ(OpenAM標準のスキーマで認識させる)の値を指定する箇所があります。
この項目には__OUのフルパスDN値ではなく「people」とだけ__指定してください。
フルパスで指定するとデータストア プロファイルの設定は完了するのですが、
ユーザー作成時にDNが存在しない旨のエラーが発生します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/40405c64-1644-4654-9b5f-5c9378c25373.png)

うまくいくと以下のような形で「対象」から連携したデータストア上にユーザー/グループを作成することが可能になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/c925a476-330e-4545-7463-fb36cb224a82.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/23080283-ed0f-a5a2-ba33-ae6112331ec7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/644c89e1-eb8a-b8c2-0807-289e73dc7931.png)

## ログイン確認
実際に作成したユーザーでログイン可能であることを確認してみます。
OpenAMの管理コンソールに先ほど作成したユーザーのアカウント名(私の環境ではuid)とパスワードを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/5effb43c-b26c-7b71-4f16-41c6c1229583.png)

ログインが完了すると↓のユーザープロファイル画面が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/48a0ad32-b25d-ff6a-d4ec-cca978ed9bbb.png)

タブを変更するとパスワードを変更する画面が表示されます。
ちなみに私の環境ではppolicy設定を有効にしているため、ユーザー自身ではパスワードを変更できません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/10846948-3f55-6f5d-4704-d87e9b351bdc.png)

updateボタンをクリックしてDashboard画面を表示してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/0ae584b7-3d35-dba1-1f5f-d675d7ee1221.png)

認証連携しているアプリケーションが何も存在しないため、何も表示されていません。

## 次回予告
次はOffice365とのSSO認証連携を実施する際の手順や注意事項に関する記事をアップします。
エピソードを使ったINTER-Mediatorのハンズオン 5 - 機能拡張 (集計)

#はじめに
大勉強会のハンズオンのエピソードです。全員でエピソードに沿ってハンズオンを行います。マシンは各自持参したマシンかイベントで用意したマシンを1名1台使用します。


『[エピソードを使ったINTER-Mediatorのハンズオン 4 - 機能拡張 (検索)](https://qiita.com/motofumi/items/e6ef7b18c89ef076ea2e)』を拡張します。前段階で作成した、『page06.html』と『def06.php』をそれぞれ、『page07.html』と『def07.php』にコピーして機能拡張します。コピー後、ページファイルの中の定義ファイルを指定している部分を```<script type="text/javascript" src="def07.php"></script>```に書き直すのを忘れずに。

ここでは、集計機能を追加します。

#シナリオ
##背景
外回り営業マンに完成したWebアプリを見せたら、機能は満たしているので合格でした。ただ、入力支援の機能や件数がふえてきたら検索や集計ができると助かるとのこと。つまり、機能拡張の依頼です。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f35343433392f37653835376639322d666239322d316536612d376339392d3438373532633736623364642e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/54439/0f1d263f-7208-bbe0-408d-6ee4d57de650.png)

##機能拡張(集計機能を追加する)
『エピソードを使ったINTER-Mediatorのハンズオン 4 - 機能拡張 (検索)』の続きとして、集計機能を実装します。起票の有無で絞り込みをして合計金額を計算します。

![スクリーンショット 2018-08-09 10.07.38.png](https://qiita-image-store.s3.amazonaws.com/0/54439/d99773fe-baf6-55ec-6454-2e4f3c1bdc1f.png)





# 課題
『Calculations』キーを使って、出金額の合計を計算します。&lt;tbody&gt;タグ内の各出金額を&lt;tfoot&gt;タグ内で表示させます。

![スクリーンショット 2018-08-17 18.49.18.png](https://qiita-image-store.s3.amazonaws.com/0/54439/6826de51-6f46-77f6-047b-9d64c5ec92db.png)


## 課題1: 定義ファイルを編集する
手順1: 右上の『Show All』ボタンをクリックする。

![スクリーンショット 2018-08-17 18.56.53.png](https://qiita-image-store.s3.amazonaws.com/0/54439/29945451-53fa-e7af-5dd9-cfbb174ed720.png)



手順2:『Calculations』キーを追加して、次の通りに入力する。

```text:Calculationsの値
field: total
expression: sum(expenses_memo3@withdraw)
```

![スクリーンショット 2018-08-17 18.58.19.png](https://qiita-image-store.s3.amazonaws.com/0/54439/536aaea0-e979-f3c2-cef5-c447439977ea.png)



## 課題2: ページファイルを編集する
手順1: 『page07.html』を開き、次の通りに入力する。

```text:&lt;/tbody&gt;タグの後に挿入する。
<tfoot>
  <tr><td>合計:<span data-im="expenses_memo3@total">999</span></td></tr>
</tfoot>
```

![スクリーンショット 2018-08-18 21.22.14.png](https://qiita-image-store.s3.amazonaws.com/0/54439/123cf1d8-8e3a-cb91-4db2-e8133a2590fe.png)
Chart.jsを使って複数の折れ線グラフ＋棒グラフを表示する

Webページにグラフを表示させたいという要件があり、グラフツールを探していました。
**複数の折れ線グラフ＋棒グラフ**のような複数種類のグラフを表示できるツールがパッと発見できなかったのですが、**Chart.js**で実現できたので紹介させていただきます。
JS素人の私でも簡単にカッコいいグラフが作成できました。

# Chart.jsとは
JavaScriptのチャートライブラリです。
https://www.chartjs.org/

私のソースを参考にしなくても、公式の素晴らしいサンプルがありますので、そちらを見たほうが良いかもしれません。
[Chart.js 公式サンプルサイト](http://www.chartjs.org/samples/latest/)
[GitHub](https://github.com/chartjs/Chart.js)
↑`Combo bar/line`が参考になるかと思います。

# 表示結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172019/28982d08-698a-6edd-d281-90f5e0a2ac7b.png)


# サンプルソース
```chartjs_sample.html
<!DOCTYPE html>
<HTML>

<HEAD>
    <TITLE>chart.jsサンプル</TITLE>
</HEAD>
<meta charset="utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>

<body>
    <canvas id="myChart"></canvas>
    <script type="text/javascript">
        var ctx = document.getElementById('myChart').getContext('2d');
        var myChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ['2018/01/01', '2018/01/02', '2018/01/03', '2018/01/04', '2018/01/05', '2018/01/06', '2018/01/07'],
                datasets: [{
                    label: '折れ線A',
                    type: "line",
                    fill: false,
                    data: [10000, 11000, 15000, 12000, 9000, 12000, 13000],
                    borderColor: "rgb(154, 162, 235)",
                    yAxisID: "y-axis-1",
                }, {
                    label: '折れ線B',
                    type: "line",
                    fill: false,
                    data: [8000, 9000, 10000, 9000, 6000, 8000, 7000],
                    borderColor: "rgb(54, 162, 235)",
                    yAxisID: "y-axis-1",
                }, {
                    label: '棒グラフ',
                    data: [22, 23, 10, 15, 40, 35, 30],
                    borderColor: "rgb(255, 99, 132)",
                    backgroundColor: "rgba(255, 99, 132, 0.2)",
                    yAxisID: "y-axis-2",
                }]
            },
            options: {
                tooltips: {
                    mode: 'nearest',
                    intersect: false,
                },
                responsive: true,
                scales: {
                    yAxes: [{
                        id: "y-axis-1",
                        type: "linear",
                        position: "left",
                        ticks: {
                            max: 15000,
                            min: 0,
                            stepSize: 1000
                        },
                    }, {
                        id: "y-axis-2",
                        type: "linear",
                        position: "right",
                        ticks: {
                            max: 200,
                            min: 0,
                            stepSize: 5
                        },
                        gridLines: {
                            drawOnChartArea: false,
                        },
                    }],
                },
            }
        });

    </script>
</body>

</HTML>
```
Digdag で Slack に通知を送る

Digdag で例えば「エラー時に Slack にエラー内容を通知したい」という場合。

`http>` オペレータは任意の HTTP エンドポイントに JSON を投げつけることが出来るので、これを使えば Slack の Incoming Webhook を叩くことが出来る。

``` yaml:workflow.dig
_export:
  !include : shared/env.dig

# わざとワークフローを失敗させる
+fail_test:
  fail>: "foo!"

_error:
  +notify_to_slack:
    http>: ${SLACK_INCOMING_WEBHOOK_URL}
    method: POST
    content:
      attachments:
        - title: "Workflow failed!"
          text: ${error.message}
          color: danger
    content_format: json
```

``` yaml:shared/env.dig
SLACK_INCOMING_WEBHOOK_URL: https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
```

参考： https://github.com/treasure-data/workflow-examples/tree/master/http/slack
[C++] コンパイル時UTF-8文字列長計算

# 概要

constexprの復習用に作った。

作った本人でさえ何の役に立つのか分かっていない。

# 実装

C++14以上でコンパイル可能。BOMとかは一切考慮していない。

```cpp:utf8_strlen.hpp
#include <cstddef>
#include <cstdint>
#include <stdexcept>

constexpr size_t utf8_strlen(const char* str) {
  size_t count = 0;

  while (*str != '\0') {
    uint8_t lead = static_cast<uint8_t>(*(str++));
    ptrdiff_t secondary_chars =
        (lead < 0x80) ? 0 :
        ((lead >> 5) == 0b110) ? 1 :
        ((lead >> 4) == 0b1110) ? 2 :
        ((lead >> 3) == 0b11110) ? 3 :
        throw std::out_of_range("invalid UTF code point was detected.");

    while (secondary_chars) {
      if (-65 < *(str++)) {
        throw std::out_of_range("invalid UTF code point was detected.");
      }

      --secondary_chars;
    }

    ++count;
  }

  return count;
}
```

# 使い方

```cpp:main.cpp
#include <cstdio>
#include "utf8_strlen.hpp"

int main() {
  constexpr const char str[] = u8"UTF-8だよ〜ん";
  constexpr size_t length = utf8_strlen(str);

  printf("%lu\n", length);
  return 0;
}
```

```console
$ g++ -std=c++14 -o main main.cpp
$ ./main
9
```

ここで注意しなければならないのは、**引数が有効なUTF-8文字列でなければならない**ということだ。

ただし、大概のコンパイラはコンパイル時に例外に引っかかるとエラーを吐いてくれるようだ。自分の環境では、g++(8.0.1)およびclang++(6.0.0)がともにエラーを吐いてくれた。

# さいごに

気が向いたらBOMを考慮したバージョンも作ります。

# 参考

- [https://github.com/AutoItConsulting/text-encoding-detect](https://github.com/AutoItConsulting/text-encoding-detect)
- [https://github.com/nemtrif/utfcpp](https://github.com/nemtrif/utfcpp)

# 追記 (2018/8/10)

BOMありバージョン

```cpp
#include <cstddef>
#include <cstdint>
#include <stdexcept>

constexpr size_t utf8_strlen(const char* str) {
  size_t count = 0;

  // chark if str starts with bom
  if (str[0] == -17 && str[1] == -69 && str[2] == -65) {
    str += 3;
  }

  while (*str != '\0') {
    uint8_t lead = static_cast<uint8_t>(*(str++));
    ptrdiff_t secondary_chars =
        (lead < 0x80) ? 0 :
        ((lead >> 5) == 0b110) ? 1 :
        ((lead >> 4) == 0b1110) ? 2 :
        ((lead >> 3) == 0b11110) ? 3 :
        throw std::out_of_range("invalid UTF code point was detected.");

    while (secondary_chars) {
      if (-65 < *(str++)) {
        throw std::out_of_range("invalid UTF code point was detected.");
      }

      --secondary_chars;
    }

    ++count;
  }

  return count;
}
```
100円でバンドのWebサイトを作ってみた

バンドのWebサイトが欲しかったのですが、
・お金はかけたくない
・ 広告出てほしくない
・ いろいろ勝手にカスタマイズしたい
という状況でうまくやった話。

作ってから１年ぐらい経っています。

（大したことはしていないのですが、宣伝も兼ねて…笑）

##作ったもの
こちら↓
https://drmtrio.tokyo/

##かかったお金
・ドメイン費用 99円（税抜）

##作り方
###1. 頑張ってHTMLを組みます
bootstrapでゴリゴリ作りました。agencyっていうtemplateをちょっと使った。
https://startbootstrap.com/template-overviews/agency/  


###2. Githubにpushします。
バンド用のGitHubアカウントも作った。
organizationアカウントとして作るべきだったな…。
https://github.com/DRMtrio


###3. GitHub Pagesとして公開します。
GitHubのSettings→GitHub Pagesから簡単に公開できます。

###4. ドメインを取得します。
本当は「DRMtrio」というバンド名なので「drmtr.io」にしたかったのですが、
「.io」は4000円ぐらいしたので、貧乏なバンドには取得できませんでした。
お名前.comで「.tokyo」が1年間99円だったので取得。

###5. DNSの設定。
[こちらの記事を参照](https://qiita.com/tiwu_official/items/d7fb6c493ed5eb9ee4fc)

###6. CNAMEの作成。
「CNAME」というファイル名のファイルを作って、そこに取得したドメインを書き込んで、GitHubのレポジトリに置く。

###完成！
完成したのでバンドメンバーに見せたところ、
「前（広告が出てしまうサイト作成サービスを使っていたとき）はHTTPSやったのに、なんでHTTPなん？ブラウザから警告出るよ？」
と言われ、キレそうになりながらHTTPS化。

###7. HTTPS化
このサイト作成当時はGitHub Pagesで直接設定する方法がなかったので、頑張ってググってやったのですが、
今は直接設定できるとのこと。[こちらの記事](https://qiita.com/foobaron/items/cd9cfc403defa706372b)を参照。

###今度こそ完成。でも運用が大変
できました。（再掲）
https://drmtrio.tokyo/
しかし、みんなめんどくさがりなので、管理が面倒。
Liveスケジュールの更新をしたいときに、HTMLを書き換えるのかなりしんどい。
と、またメンバーに文句を言われたため、Google Spreadsheetsで管理しよう！ということに。

###8. Google SpreadsheetsからLiveスケジュールを更新する
まずはLiveスケジュールを書いたSpreadsheetsを用意します。

当初は、GASでSpreadsheetsの内容を返すAPIを実装しようとしていたのですが、なんだか認証？が面倒。
Spreadsheets自体にAPIがあるので、そちらを使うことにしました。

Spreadsheetsの「ファイル」→「ウェブに公開」→「csv形式」→出てきたURLをコピー
これだけでファイル全体の情報を返すAPIが作れます。

APIを呼ぶJavaScriptを用意します。
CSVの扱いはこれが便利。
https://github.com/evanplaice/jquery-csv

``` js
var url = "https://docs.google.com/spreadsheets/d/e/2PACX-1vTVKf_Rkxg-ytKIFxdNyXudY_Kp0EcMA09HXqaSdpOutV1_joZWIZYJ9KLIejRPdKIPAE1wFoqVyz6y/pub?gid=0&single=true&output=csv";
$.ajax({
  url: url
  ,success: function(data) {
    var list = $.csv.toObjects(data);
    var htmls = [];
    for (var i=0,len=list.length;i<=len;i++) {
      var l = list[i];
      if (l) {
        htmls.push(`<div class="col-md-2">
                      <div class="text-center">
                        <h6>${l.date}</h6>
                        <p class="text-muted">Open ${l.open} Start ${l.start}</p>
                      </div>
                     </div>
                     <div class="col-md-10">
                       <h5>${l.name}</h5>
                       <p class="text-muted">@${l.place}<br>${l.act}<br>${l.price}<br><a href="${l.url}">more info</a></p><br>
                     </div>`);
      }
    }
    $("#schedule").html(htmls.join(""));
  }
})
```
あとはこんな感じ。template記法便利。

###9. widgetをいろいろ足す
Twitter、YouTube、Instagramを埋め込むのは、公式のものを使うのが便利。

 
###その後
こうやって作ったWebサイトは、公開から１年が経ちました :congratulations: 
そういえば、ドメインの有効期限、１年だったよな…
と、思っていたら、ドメインは自動更新してくれたのですが、がっつり1000円近く取られていました。 :angel: 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80608/a77bd59c-0bec-fda9-5ba2-0f0a5df72fdb.png)
CUIでWebスクレイピングをする話

# はじめに
先日、WebスクレイピングでAzureポータルから情報を引いてくる案件がありました。当初windowsサーバ上でGUIを表示しつつスクレイピングしようとしたのですが、RDP切断後にスクレイバが動作しない問題があったため[^1]、CentOSからヘッドレスブラウザでスクレイピングするようにしました。
ネット上には色々な情報があったのですが、それぞれをつまみ食いしないと動作しなかったため、必要な設定等をまとめておきます。

# 環境
- Docker version 1.7.1, build 786b29d/1.7.1
- CentOS Linux release 7.5.1804 (Core) 
- Python 3.6.5
- selenium==3.14.0  
今回スクレイパをpythonとseleniumで行いましたが、その他のバインディングでも同じようにできると思います。

# 手順
## Chromeインストール
CentOSの標準リポジトリにChromeが存在しないため、Googleのリポジトリからダウンロードします。以下のrepoファイルを作成します[^2]。

```/etc/yum.repos.d/google.chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

yumでインストールします。この時、後述するchromedriverのバージョン選択に使用するため、`yum info`でインストールするchromeのバージョンを確認しておく必要があります。
この例ではバージョン68をインストールします。

```
# yum info google-chrome-stable
   (中略)
Name        : google-chrome-stable
Arch        : x86_64
Version     : 68.0.3440.106
Release     : 1
Size        : 185 M
   (中略)
# yum info install google-chrome-stable
```

## chromedriverインストール
chromedriverの公式サイト[^3]からchromedriverをダウンロードします。この時、インストールしたchromeをサポートしているバージョンをダウンロードします。今回の例ではバージョン68のChromeをインストールしたため、バージョン2.41のchromedriverをインストールします。
ちなみに、epelリポジトリにもchromedriverがありますが、バージョンが古く、stable版のchromeをサポートしていないため、動作しなくなります。

```
curl https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
cp -p chromedriver /usr/bin/
```

スクレイパからchromedriverにアクセスできることを確認しておいてください。PATHが通っているディレクトリが良いと思います。

## スクレイパからChromeを起動
スクレイパからChromeを起動する際、`--headless`、`--disable-gpu`、`--no-sandbox`オプションをつけて起動します。
`--headless`オプションでヘッドレスモードでChromeは起動するはずですが、`--no-sandbox`オプションを有効にしないとChromeがクラッシュします。ただ、いくつかのissueを確認したところ、コンテナ上で起動した場合に必要になるとの記載があるため、オンプレや仮想マシン上で動作させた場合不要かもしれません[^4][^5]。
`--disable-gpu`なしでもChromeは起動しますが、一部アクセラレーションが不具合を起こし表示が乱れる場合があるため、オプションを有効にしておいた方が良いでしょう。

```python:sample-open-google.py
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.google.co.jp")
driver.quit()
```


[^1]: 詳しい友人に確認したところ、RDP切断後は内部的に画面がない状態になるため、GUIを使用するスクレイピングができないとのことでした。コンソールで実行しても、同一ユーザからリモート接続するとコンソールがログオフするため、同様の状態になります。
[^2]: https://qiita.com/tatetate55/items/e35e268bdf5ee0518324
[^3]: https://sites.google.com/a/chromium.org/chromedriver/downloads
[^4]: https://github.com/theintern/intern/issues/878
[^5]: https://github.com/heroku/heroku-buildpack-google-chrome/issues/46
vue.js routerでのページ切り替え時ページ先頭に

```router.js
const router = new VueRouter({
  routes: [...],
  scrollBehavior (to, from, savedPosition) {
   return { x: 0, y: 0 };
  }
})
```

これでページ遷移時、ページ先頭に来るようになった。

[参考サイト(公式ガイド)](https://router.vuejs.org/ja/guide/advanced/scroll-behavior.html)
チョイ技まとめ(SQL置き場)

#目的
雑多に書いていると探すのに手間がかかるためジャンルによって分けることにしました。




#クエリのテーブル指定がフルパス(DB名.スキマー名.テーブル名)になるのを省略名(テーブル名)で扱いたい

* 原因
DB用のカレントディレクトリのようなもの？　言うとすればカレントテーブルの初期値が上の階層に行ってしまっているのではないのだろうか…。
→カレントスキマーって言うらしい(うろ覚え)

* 対策
以下のクエリを先頭に追加するだけ。

```sql
Use DB名
Go

通常クエリ
```

* 結論
これって、カレントスキマーを設定すれば良いだけなんじゃないだろうか…

***

#クエリの結果をcsvで出力する。
わりと便利。
試験所とかの変更前データを収集するのに使える
参考サイト
[SQLServerでselectの結果をCSVで出力する方法。](http://note.mokuzine.net/sqlserver-csv-out/)


#Select Top句

クエリの結果の出力数を制限するクエリ。

```sql
SELECT TOP 5 * FROM テーブル名
WHERE No >= 100
ORDER BY No
```
Noが100以上のデータを5個出力……
[SELECT TOP句について](https://www.dbsheetclient.jp/blog/?p=161)

***

#SQLの文字型変更で困ったとき
↓以下を参考 
[SQL Server Data Type Conversion Chart~SQLサーバーのデータ型変換チャート~](https://www.microsoft.com/en-us/download/details.aspx?id=35834)

#ストアド(プロシージャーとファンクション)

クエリを直接書かず使う方法。
**SQLの中に記載する関数。**
似てるものとしては、VBAのSubのイメージ。

 * 引数がない→ストアドプロシージャ
    * インサートとかアップデート等の返り値なしで良い処理で使用。
 * 引数がある→ストアドファンクション
    * セレクト等の返り値が必要な処理で使用する。

何回も使用するクエリ(書き込むクエリ)や、codeが長いときは重宝しそうだ。
クエリだけだからメンテしやすそう

###デメリット

1. デバッグで処理の中身が見えない。(ソースがServerに有るので当たり前)
たとえばVB6.0だと↓こんなのが出る(デバッグでストアド呼び出し箇所でステップインすると出る。それ以外ならＯＫ)

    ![STADERR.png](https://qiita-image-store.s3.amazonaws.com/0/159061/1a42dcad-e10e-43c9-97ec-451d4affb9d4.png)


2. 大量にストアドを使うとき命名規則がわかっていないとどれがどれだかわからない。
→ストアドに対して何が引数で何が返り値なのか記載したほうが良い。~~処理を追うためにわざわざSQL立ち上げるのは手間、業務用低スペならなおさら~~

3. マイナー(個人的な感想)

***

#かなり便利LIKE句
Where句に記載すると部分一致のデータを表示できる

```sql
Select * From Table
Where Table.Data Like 'h%'
```
結果としては

| Data       |
|:-----------|
| huga       |
| hoge       |

みたく取得できる。

説明すると
% -> ワイルドカード
となるため
%a%
は、何かしらの文字が前後にあるaのデータ
例〉
aaa
bab
とか

#SUBSTRINGについて
文字列出力に対してほしい文字の箇所を取得する。
取得した文字の3文字目から2文字とか…
**注意点**
あくまで文字判断になるため数字を取得したときは文字に変換してから使用すること。
取得文字を変換するには
`CONVERT(型,該当文字)`
を使用する

```sql
Selecr SUBSTRING(Convert(varchar,123),2,1)
```

#ストアドをCMDなどで流すとき少し便利な目印
InsertとかUPDATEした後に以下のクエリを入れるとチェックしやすい。
大量にあると結構書くのメンドイけど･･･

```sql

Select '対象のDB名' As '対象のDB名' , * Top 1 From 対象のDB名
```

＊1チェックしたいテーブルの中身で簡単にわかるのならSelect文のみでいいと思う。
＊2コストも気にしないのならTop 1なくてもいい

#SQL Server Management Studio　の利用状況モニターについて
###プロセスから表示できるセッション詳細の最大表示文字数
4551文字（自分で確認しました。）
負荷試験の仕方

# はじめに

負荷試験をやってみたことが無い人向けに
どういうことをしたらいいかを記載してます。

# 負荷試験の目的
構築したサーバー構成が運用中にどれくらい負荷に耐えられるかを知るためです。


# 負荷の見積もりを行う

いざ負荷をかけようと行っても闇雲に行っても意味がないです。
まずどれくらいの同時リクエス数が必要かを見積もる必要があります。
下記のサイトが非常にわかりやすいのでこちらを基準に必要リクエス数を見積もりました。

https://atuweb.net/201506_simultaneous-access-of-load-test/

お客さん、PMはなかなか数字を出してくれないこともありますが、
見積もりがないと始まらないので概算でもいいので出してください。


# 負荷試験ツールの準備

負荷試験ツールとはサーバに対して指定した量のリクエストを送り、そのレスポンスを受けることでパフォーマンス計測することができるツールです。
負荷試験を行うテスト計画(シナリオという場合もある)を設定し、実施・計測を行います。
JMeterを例にとると簡単には下記の通りです。

### 実施事項

* スレッドグループを設定
  * どのくらいの期間でどのくらいのスレッドを生成するか
  * ループ回数はどのくらいにするか
* 送信HTTPを設定
* テスト実施
* 結果表示

### 各種要素

* スレッド数：文字通りrequestを投げるスレッド数
* Ramp-Up期間：設定されたスレッド数になるまでの期間
* ループ回数：1スレッドにおける一連のリクエストの繰り返し回数
* 総リクエスト数 = スレッド × ループ回数


# その他の準備

* サーバー監視ツール(munin, NewRelic, ....)
* ログ監視(アクセスログ, エラーログ) ※エラーが発生した際に通知が来るようになっていればベスト



# ボトルネックを把握する

* ループ回数は1ですべてのリクエスト処理を一様に実行します
* リクエスト数を最初は低負荷で徐々に負荷を上げていきます
 
各主要機能の中でどの機能が重い処理なのか、つまりボトルネックを把握するのが目的です。

<img width="1622" alt="シングル.png" src="https://qiita-image-store.s3.amazonaws.com/0/76076/0d757fa0-2aa3-d1d9-d86c-5009b722fca8.png">



# 高負荷で動作させる計画

高負荷にて動作させるための計画を立てます。
先の項目にてボトルネック把握した上で負荷計画を考えます。

例えば、ログイン処理がボトルネックのアプリなのか、
それともログイン後の例えば、課金処理やゲームであればイベントバトル処理などがボトルネックのアプリかで負荷のかけ方の計画が変わります。

極端な例ですが、下記のようにスレッドループ計画に差が出るかと思います

- ログイン認証/ユーザー作成がボトルネック
いかに多くのスレッド数を短時間で増やすことに重きを置きます。
![type1.png](https://qiita-image-store.s3.amazonaws.com/0/76076/8f8cba2c-61e5-4780-6337-9d17b7e6ca91.png)

- ログイン以降のアクションがボトルネック
総リクエスト数 = スレッド数 × ループ回数です。ユーザー作成処理・認証処理でなければ、同じリクエスト回数でもループを駆使して賄うことができるかと思います。
ある一定のスレッド数でループ回数を使用することによりボトルネック処理が繰り返し実施させたほうが、負荷試験ツールがハングアップしないで済みます。
(インストール環境にもよりますが、JMeterなどの高性能負荷試験ツールはスレッドを多く生成するとメモリーが枯渇することがよくあります)
![type2.png](https://qiita-image-store.s3.amazonaws.com/0/76076/ef5bc558-5908-c051-299b-d7eb581002f1.png)

# エラー発生時の対応

負荷試験中のエラーの種類をまず振り分ける必要があります。

- エラーの種類
 - 負荷試験ツールの設定の誤り
 - 見落としていたバグ
 - 高負荷により発生したエラー

前2つはすぐに対応するものとして、3番目は下記の問題をはらんでいることがあると思います。

- StackTraceを見ても原因が分かりづらい
- 発生のトリガーとなっている箇所が実はログとは別の場所

アプリ全体の知識と想像力が試される箇所です。
WEBサーバー、DBやキャッシュのステータスを確認しながら、
不要なリソースアクセスはないか？などの観点て考えてみると軽減される箇所が見つかったりする場合があります。

# 結果の評価について

例えばWebサーバーのステータス項目だけでもこれだけあります。

- 代表的なWebサーバーのステータス項目
 - disk容量
 - ネットワークトラフィック数
 - netstat情報
 - CPU使用率
 - load avarage
 - memory使用量

初めての方は何をどころ評価しなくては行けないのか迷うところでしょうが、
すでに運用中の別プロジェクトの結果と見比べてみてください。

サーバー台数や規模は違うかもしれませんが、
サイト全体のスループットで考えると許容値が見えてくるかもしれません。

# 最後に

負荷試験は試行錯誤が必要で、検証と評価を繰り返し実施する必要があるかと思いますが
なるべく体系的に整理をしておくことでコスト削減につながるのではないでしょうか。

# 参考

* https://atuweb.net/201506_simultaneous-access-of-load-test/
* http://tech-blog.rakus.co.jp/entry/2017/08/24/111332
* https://qiita.com/tri-comma/items/94389afaef53b7d8e80e
* https://e-algorithm.xyz/jmeter/
* http://kubotti.hatenablog.com/entry/2016/03/16/112954
* https://qiita.com/aidy91614/items/d96ca0261665abc54f7d
bash で boolean を使った if 文 (条件分岐)

シェルスクリプトを書いているときに boolean を使って条件分岐させたいときにはまった罠について残しておきます。

# まとめ
* `if [ 条件式 ]; ` = `if test 条件式;` と同じ
* `test true` も `test false` も true になる
* boolen を使った条件式は `if "${boolean}";` を使おう

# boolean 値は if [ "${boolean}" ]; で判定できない
下記のようなコードを書いて条件分岐をさせようとしていました。

```bash

#!/bin/bash

readonly is_true=true
readonly is_false=false

if [ "${is_true}" ]; then
    echo 'is_true'
fi
if [ "${is_false}" ]; then
    echo 'is_false'
fi
```
出力結果

```
$ sh boolean_test.sh
is_true
is_false
```

どちらも出力されてしまってます。

# if [ 条件式 ]; は if test 条件式; と同様

http://tldp.org/LDP/abs/html/testconstructs.html
>There exists a dedicated command called [ (left bracket special character). It is a synonym for test, and a builtin for efficiency reasons.

と書かれているように
`if [ 条件式 ];` と `if test 条件式;` は同義です。
そして `test true` も `test false` も両方trueになります

```
$ test true
$ echo $?
0
$ test false
$ echo $?
0
```
なので両方出力されてたんですね

# 解決策 if "${boolean}"; を使おう

```bash
#!/bin/bash

readonly is_true=true
readonly is_false=false

if "${is_true}"; then
    echo 'is_true'
fi
if "${is_false}"; then
    echo 'is_false'
fi
```

出力結果

```
$ sh boolean_test.sh
is_true
```

# 参考資料
* https://qiita.com/Riliumph/items/f07272fa9b0834032a9d
* http://tldp.org/LDP/abs/html/testconstructs.html
a-blog cmsで、一つのカスタムフィールドに対して複数の単語を指定して検索する

エントリーに共通するあるカスタムフィールドに対して、複数の文字列をつかって絞り込み検索をしたい。

たとえば、エントリーごとに支店名が入るカスタムフィールド{branch}があり、そこに、仙台支店、東京本社、松阪営業所、のような文字列が入っていて、エリアごとに検索して、エントリー一覧を出したいというような場合。

```html
<form action="" method="post">
<input type="hidden" name="field[]" value="branch">
<input type="hidden" name="cid" value="%{CID}">
<input type="hidden" name="bid" value="%{BID}">
<input type="hidden" name="branch@operator" value="lk">
<select id="branch" name="branch">
<option value="">エリアを選択してください</option>
<option value="札幌/lk/or/青森/lk/or/仙台">北海道・東北</option>
<option value="東京/lk/or/横浜/lk/or/館林">関東</option>
<option value="名古屋/lk/or/瀬戸/lk/or/松阪">中部</option>
</select>
<input type="submit" name="ACMS_POST_2GET" value="この条件で絞り込む">
</form>
```

キーワードを「/lk/or/」でつなぐことで、部分検索かつ複数条件での絞り込みができる。
上記のフォームから「北海道・東北」を選んだ検索結果のURLのパス（acmsパス）は、

```
/field/branch/lk/札幌/lk/or/青森/lk/or/仙台/
```

というような形になる。
Amazon Sumerianで簡単な全天球動画ビューワーを作ってみる

Amazon Sumerianで簡単な全天球画像ビューワーを作ってみたので手順をメモしておく。
基本的に[Amazon Sumerianで簡単な全天球画像ビューワーを作ってみる - Qiita](https://qiita.com/mechamogera/items/93ed8a211f7615d3f028)の動画版。
SumerianのSlackで[動画のテクスチャを動的作成するコードがのっていた](https://amazonsumerian.slack.com/archives/C8AR6KC00/p1532455677000238)のでやってみた。
これでWebRTCの再生もできるんじゃないだろうか。

## 作成手順

[Amazon Sumerianで簡単な全天球画像ビューワーを作ってみる - Qiita](https://qiita.com/mechamogera/items/93ed8a211f7615d3f028)の手順と同じでスクリプトだけを以下のように変更する。

```javascript
'use strict';

function makeVideo(url) {
    let video = document.createElement('video');
    video.crossOrigin = 'anonymous';
    video.src = url;
    video.muted = true;
    video.autoplay = false;
	video.loop = true;
    video.oncanplay = function(ctx) {
        video.width = video.videoWidth;
        video.height = video.videoHeight;
    };
    return video;
}
	
// The sumerian object can be used to access Sumerian engine
// types.
//
/* global sumerian */
	
// Called when play mode starts.
//
function setup(args, ctx) {
	let input = document.getElementById("inputfile");
    input.addEventListener('change', (e) => {
        let file = e.target.files[0];
		
		ctx.video = makeVideo(URL.createObjectURL(file));
	
		var videoMat = args.target.meshRendererComponent.materials[0];
    	var texture = ctx.texture = new sumerian.Texture(null, {
        	generateMipmaps: false,
        	minFilter: 'BilinearNoMipMaps',
			repeat: [-1, 1],
    	});
    	texture.updateCallback = function () {
        	return texture.image && !texture.image.paused;
    	};
    	texture.readyCallback = function() {
        	return texture.image && texture.image.readyState === 4;
    	};
    	texture.setImage(ctx.video);
    	videoMat.setTexture('DIFFUSE_MAP', texture);
    	args.target.meshRendererComponent.materials[0] = videoMat;
    	ctx.material = videoMat;
    	ctx.video.play();
	});
}

// Called when play mode stops.
//
function cleanup(args, ctx) {
	ctx.video = null;
}

// Defines script parameters.
//
var parameters = [
	{
        name: "Target",
        key: "target",
        type: "entity"
    }
];
```
Digdagで変数を業務ワークフロー別に分けたい時のメモ

## 目的

業務のワークフロー単位でdigファイルで利用する変数を集約して使いたかった時に対応したメモです。

以下のように、業務ごとにymlファイルを定義して起動時に渡していたのですが、

```
# 開発環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig -P settings/domain01/development.yml
# 開発環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig -P settings/domain02/development.yml

# 本番環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig -P settings/domain01/production.yml
# 本番環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig -P settings/domain02/production.yml
```

**スクリプトの中でymlをロードしてdigファイルに変数を渡す**ようにしたメモになります。
こんな感じで起動したくて、試してみました。

```
# 開発環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig
# 開発環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig

# 本番環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig
# 本番環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig
```

## ディレクトリ構成

とりあえずこんな感じです。

```
.
|-- domain01_workflow.dig
|-- script
|   `-- variables_aggregation.rb
`-- settings
    `-- domain01
        `-- development.yml
```

## dig内で呼び出すymlをロードするスクリプト

```script/variables_aggregation.rb
require 'yaml'

# 変数集約用のクラス
class VariablesAggregation
  ENVIRONMENT = ENV['MODE']

  # 業務1のワークフローで使う変数をセット
  def domain01
    path = "./settings/#{__method__}/#{ENVIRONMENT}.yml"
    set_variables(path)
  end

  # 業務2のワークフローで使う変数をセット
  def domain02
    path = "./settings/#{__method__}/#{ENVIRONMENT}.yml"
    set_variables(path)
  end

  private

  def set_variables(path)
    variables = YAML.load_file(path).map{ |k, v| [k.to_sym, v] }.to_h
    Digdag.env.store(variables)
  end
end
```

## ymlファイルの定義

適当に以下のように作成しました。
環境ごとに作成するようにしています。

```settings/domain01/development.yml
# 業務1で使う変数定義ファイル
MARIADB_HOST: 192.168.100.100
MARIADB_USER: 48hands
```

## digファイルの定義と起動確認

こんな感じでymlをロードするスクリプトを呼び出すようにして、変数がdigファイルに引き渡されているか確認します。

```domain01_workflow.dig
_export:
  rb:
    require: 'script/variables_aggregation'

+set_env:
  rb>: VariablesAggregation.domain01

+task1:
  echo>: My Setting variables: ${MARIADB_HOST} ${MARIADB_USER}
```

起動して以下のように実行できるか確認します。
今回は、開発用として実行したいので、環境変数`MODE`を`development`でセットしておきます。

```
export MODE=development
```

実行します。こんな感じで出力されるはず。

```
digdag run domain01_workflow.dig
2018-08-10 16:01:38 +0900: Digdag v0.9.27
...
My Setting variables 192.168.100.100 48hands
Success. Task state is saved at /tmp/hoge/.digdag/status/20180810T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```
Node.js - ES6記法 - 8.xへのバージョンアップで必要なこと

# 資料
・バージョン
https://github.com/nodejs/Release#release-schedule
・本家資料
http://exploringjs.com/es6/ch_modules.html#sec_design-goals-es6-modules

# 変更点
・babel等のトランスパイラを利用しなくてもnodeだけでES6 moduleの記述ができるように。
（他略）

# 必要な作業
## サマリ
・バージョンを8.xへ
・`module.exports`等は`export default`を使う
・ファイルの拡張子を`.js`から`.mjs`にする
・UnitTest等でtestモジュールを利用している場合は`.mjs`を対象に
・node起動時に`--experimental-modules`オプションを付与して起動

## 詳細
▼ バージョンを8.xへ
今回は8.11.xに

```javascript:package.json
  "engines": {
    "node": "v8.11.*"
  },
```

▼ `module.exports`等は`export default`を使う
・修正 前

```
class A {
   # クラス内容
}
module.exports = A;  # ここを
```

・修正 後

```javascript
class A {
   // クラス内容
}
export default A; // こう
```

▼ファイルの拡張子を`.js`から`.mjs`にする
下記のように変更するだけ
`hoge.js`　→　`hoge.mjs`

▼UnitTest等でtestモジュールを利用している場合は`.mjs`を対象に
UnitTest等でtestモジュールを利用している場合は、拡張子が`.mjs`になることで、対象ファイルから外れてしまう
よって、拡張子を追加する必要がある
例）jest

```javascript:package.json
  "jest": {
    "verbose": true,
    "moduleFileExtensions": [
      "js",
      "json",
      "jsx",
      "node",
      "mjs"    // ここ
    ],
    "testMatch": [
      "**/__tests__/**/*.?(m)js?(x)",    // ここ
      "**/?(*.)(spec|test).?(m)js?(x)"    // ここ
    ],
    "collectCoverageFrom": [
      "**/routes/**/*.{js,jsx,mjs}",    // ここ
    ],
    "transform": {
      "^.+\\.(js|mjs)$": "babel-jest"    // ここも
    }
  },
```

・jestの設定
https://doc.ebichu.cc/jest/docs/ja/configuration.html


▼node起動時に`--experimental-modules`オプションを付与して起動

```javascript
node --experimental-modules app
```

# おわり
何かあれば適宜コメント下さい。勉強になります故
phpstorm(というかjetbrainsのIDE)のdiff機能って便利だよ

##phpstormとは
jetbrains社が販売している代表的な**有料**IDE。
https://www.jetbrains.com/phpstorm/features/

このjetbarainsのIDEにはとても便利なdiff機能が三つ搭載されているので、phpstormを例にとって紹介します。

##クリップボードとの比較
![クリップボード内比較_基本.png](https://qiita-image-store.s3.amazonaws.com/0/244122/433528c7-2d9d-4ef1-f1bb-4a1e49505a03.png)
かなり基本的な比較で、文字選択した部分とクリップボード内の文字を比較する際に用いる。
右側を主体(文字選択した部分)として、青部分が変更、緑が追加、灰色は削除と色分けされている。
使えるなと思ったのは
・どちらのタブでも検索や置換が行えること
・変更点は行番号ラベルにある>>記号を押すことで隣のタブに合わせることができること
・右側のタブは実際に文字選択した箇所と同期しているので、右側タブの変更がそのまま反映されること
わざわざdiffツールを用いるよりも断然早くて便利です。

**＜呼び出し方＞**
文字選択をして右クリック→「compare with Clipboard」でdiff画面が別ウィンドウで開く。


##GITコミット比較
![git_compare.png](https://qiita-image-store.s3.amazonaws.com/0/244122/3f550fb9-cb3e-96d0-bcc2-5c67a6139dac.png)
現在のローカルソースコードを、以前のgitコミットと比較できる。
もちろん、別ブランチにあるコミットに対しても比較可能。
コードレビューがかなり捗りますね。
さらにコンフリクトした際には、三画面にわたるマージ画面を使って解決させることができます。
参照：https://www.karakaram.com/phpstorm-useful-tips2#git

**＜呼び出し方＞**
ファイルタブを右クリック→「Git」→「Compare with ...」で比較したいコミットと比較
## ファイル履歴比較
![display_showhistoryy.png](https://qiita-image-store.s3.amazonaws.com/0/244122/3f554e3c-9def-7b2f-ffac-6d9fdb42ff92.png)
こちらは、ローカル内に保存されているファイルの変更履歴を使って比較ができる機能。
左端のカラムで履歴を選択できる。
ファイルを変更しまくって訳わからなくなったときに救われるかも？
またさらに、変更履歴に名前ラベルを付けて履歴をわかりやすく管理することが出来ます。
![ラベルを作成可能.png](https://qiita-image-store.s3.amazonaws.com/0/244122/79b01b9e-ce63-4d69-3317-8d35a306ce95.png)

**＜呼び出し方＞**
ファイルタブを右クリック→「Local History」→「Show history」でマージ画面が別ウィンドウで開く
(ラベルをつけるには「Local History」→「put a label」でラベル入力できる)


いかがでしたか？
IDEに金を払うなんて！という方もいらっしゃると思いますが、
無料IDEのデメリットは、使い物になるように、自分でプラグインを探して、ちょこちょこ設定ししないといけなかったりするので、その手間を減らせるのなら多少はお金を払ってもいいんじゃないのかな、とは思います。
(有料だったとしても毎日ずっと使い続けるんだとしたら、そのコストも微々たるものに逓減しますしね）

他にもphpstormは便利な機能がデフォルトで搭載されていたり、
gitクライアントとしても、SQLクライアントとしても、意外に優秀だったりします。
これを機に是非つかってみてはいかがでしょうか？（昔なつかしのステマ)
railsでpostgresを入れ替えたらsocketでエラーになったとき

あまりないケースでしょうが、遭遇している人がいないとは限らないので・・・

rails+postgresでアプリを構築して、途中でpostgresをパッケージインストールからソースからのインストールのものに移行したところ
ソケット　/var/run/postgresql/.s.PGSQL.5432
にないよ、となってエラーになる場合

・ソース版のデフォルトではsocketは/tmp
・新たにrails newしたものはつながる

という状況だったので、pg(Gemfile.lockに出てくるバージョン)を再インスト－ルで復旧しました。

多分ソース版からパッケージへの移行も同じかと思います。
Linux — tmpwatch の引数の数字は「削除のしきい値」を「時間」で表す

tmpwatch では単位として

- 秒 (`m`)
- 時間 (`h`)
- 日 (`d`)

が指定できる。

単位指定なしの場合は時間 ( `h` ) 指定となる。

## 出典

[tmpwatch(8) - Linux man page](https://linux.die.net/man/8/tmpwatch) より

>The time parameter defines the threshold for removing files.
If the file has not been accessed for time, the file is removed.
The time argument is a number with an optional single-character suffix specifying the units: m for minutes, h for hours, d for days.
If no suffix is specified, time is in hours.

## 指定例

以下はすべて同義。

### 単位指定なし (時間)

```
tmpwatch 24
```

### 時間指定

```
tmpwatch 24h
```

### 秒指定

```
tmpwatch 1440m
```

### 日指定

```
tmpwatch 1d
```









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
IIS上のASP.NET Coreアプリのリクエストタイムアウト設定

## 「502.3 BadGateway」エラーの発生

ASP.NET Core(2.0)のWEBアプリをIISで動かす場合、大量データ取込などの時間がかかる処理を実行していると2分程でリクエストタイムアウトとなっているらしく「502.3 BadGateway」のエラー表示となります。
開発中にローカルのVisual Studioの内蔵サーバーで実行していた時には出ない現象でした。

## IISのリクエストタイムアウト設定個所

IISマネージャー
　サイト＞(対象アプリのホーム)　
　　サーバーコンポーネント＞構成エディター
　　　セクション：system.webServer/aspNetCore
　　　　requestTimeoutの設定が「00:02:00」となっていました。

　　　　時：分：秒で設定するようです。

## 恒久的な設定方法は？

構成エディターによる設定はアプリケーションの差し替え・再起動時にリセットされるようです。
正しい設定は調査中