OmniAICreator/Qiita-1.07M huggingface dataset:
【C言語】ナル文字が付加されていない文字列に対しstrncpyを使ってはいけない

文字列にはstrncpyを使えばokなどと思考停止しながら書いていたらハマったのでメモ

#概要
strncpyの挙動は以下の通りです。

1. コピー元の文字列の長さが指定された文字列以上の場合、指定分コピーする この時ナル文字は付加しない
1. コピー元の文字列の長さが指定された文字列未満の場合、指定分コピーする この時余った部分にはナル文字を埋め込む

strncpyで利用を想定されているのは文字列なので、これらの文面は終端にナル文字が付加されている配列と言うのが前提です
その為末尾にナル文字が付加されていない配列に対して使えば当然範囲外参照になります


#例
具体的には以下のような感じです

```C:test.c
#include <stdio.h>
#include <string.h>

//以下のコードは違反コードです
//動かす際には注意してください
int main(){
        char str1[] = "hogehogehoge";
        char str2[sizeof(str1) + 2];
        char str3[sizeof(str1) - 2];

        //OK str1以上のサイズが確保されているため空いたスペースにはナル文字が付加される
        strncpy(str2,str1,sizeof(str2));

        //これもOK ただし末尾にナル文字は付加されない
        strncpy(str3,str1,sizeof(str3));

        //NG str3にナル文字は付加されていないので範囲外参照してしまう
        strncpy(str2,str3,sizeof(str2));

	printf("%s\n%s\n%s\n",str1,str2,str3);
        return 0;
}
```

1番目と2番目のstrncpy呼び出しでは正常に動作しますが、2番目のstrncpyだけサイズが足りておらず
ナル文字が付加されずに終了します

そして3番目のstrncpy呼び出しではナル文字の付加されていない文字列をコピーしようとしたため範囲外参照となってしまいます。
#結論
気を付けます
Django girls tutorial の .gitignoreで困ってます！！

現在Django girls tutorialを進めているのですが、

djangogirlsディレクトリに、.gitignoreという名前のファイルを作成しましょう。

myvenv
__pycache__
staticfiles
local_settings.py
db.sqlite3
*.py[co]

をファイル内に記入するというところでつまずいています。

djangogirlsディレクトリ内で、ターミナルで touch .gitignore　と記入したのですが、finderの中になくてファイルが作成されていないと思っているのですが、どのように対処すれば良いか教えていただけるとありがたいです！
IM-Workflow 申請・承認・参照・確認画面 URLまとめ 

## IM-Workflow コンテンツ画面 URL3種まとめ

下記の方法はコンテンツ画面がスクリプト開発、Java開発、IM-FormaDesignerのいずれでも使えます

### 1. 申請画面に直接アクセスする
##### リクエストURL
> im_workflow/user/apply/apply_direct/%フローID%

##### リクエストパラメータ
なし

##### 対象機能
申請画面

###### 使いどころ
メニューから直接ワークフロー申請画面を開くときに使える
ノンプログラミング用途向け
申請基準日を指定せずとも現在日付になる（指定しようとしてもできない）
パラメータがないので呼び方が楽

[intra-mart公式ドキュメント 申請画面に直接アクセスするには](https://www.intra-mart.jp/download/product/iap/im_workflow/im_workflow_administrator_guide/texts/imw_tips/article_10.html)

### 2. コンテンツ振分表示

##### リクエストURL
> im_workflow/common/switch/switch_content

申請画面、承認画面、確認画面などを表示できます。
詳細画面は表示出来ません。つまり参照画面はこのURLでは表示できません。

##### リクエストパラメータ

| パラメータ名 | 値 | 必須  | 備考 |
|:--|:--|:--:|:--|
| imwFlowId |フローID|○|
| imwApplyBaseDate | 申請基準日(yyyy/mm/dd) |○|
| imwPageType | 画面種別|○| 0 ～ 5のみ 4.  画面種別表参照|
| imwAuthUserCode |権限者ユーザーコード||
| imwUserDataId |ユーザーデータID|△|申請以外必須|
| imwSystemMatterId|システム案件ID |△|申請、一時保存以外必須|
| imwNodeId |ノードID|△|申請、一時保存以外必須|
| imwCallOriginalPagePath | 呼出元ページパス ||処理後遷移先| 
| imwCallOriginalParams | 呼出元パラメータ||処理後遷移に渡す|
| imwSerialProcParams |連続処理用|
| imwArriveType | 到達区分

##### 対象機能
申請画面
一時保存画面
申請（起票案件）画面
再申請画面
処理画面
確認画面 

###### 使いどころ
IM標準の一覧画面を経由しない独自画面を作るケースなど
プログラミングで細かく制御して各画面に遷移したいときに使う
なぜか公式ドキュメントがない・・・

### 3. 詳細画面用コンテンツ振分表示

##### リクエストURL
> im_workflow/common/switch/switch_content_detail


##### リクエストパラメータ

| パラメータ名 | 値 | 必須  | 備考 |
|:--|:--|:--:|:--|
| imwPageType | 画面種別|○| 6 ～ 9のみ 4.  画面種別表参照|
| imwUserDataId |ユーザーデータID|○|申請以外必須|
| imwSystemMatterId|システム案件ID |○|申請、一時保存以外必須|

##### 対象機能
処理詳細画面
参照詳細画面
確認詳細画面
過去案件詳細

###### 使いどころ
処理画面や確認画面を経由しないで詳細画面を開きたいときにどうぞ


[IM-Workflow の詳細画面への遷移URL](https://www.intra-mart.jp/document/library/iap/public/im_workflow/im_workflow_viewcreator_guide/texts/appendix/link_wf_detail_page.html)


### 4.  画面種別表

|コード名|プロパティ名|コード値|
|:--|:--|:-:|
|申請画面|pageTyp_App|0|
|一時保存画面|pageTyp_TempSave|1|
|申請（起票案件）画面|pageTyp_UnApp|2|
|再申請画面|pageTyp_ReApp|3|
|処理画面|pageTyp_Proc|4|
|確認画面|pageTyp_Cnfm|5|
|処理詳細|pageTyp_Procdetail|6|
|参照詳細|pageTyp_Refdetail|7|
|確認詳細|pageTyp_Cnfmdetail|8|
|過去案件詳細|pageTyp_ArcMatdetail|9|

画面種別や到達種別の詳細はここ参照
[IM-Workflow CodeList](https://www.intra-mart.jp/apidoc/iap/apilist-ssjs/doc/im_workflow/com/imwCodeList.html)

##追記 ついにintra-mart Developer Siteから情報が出ました

[intra-mart Developer Site IM-Workflowの色々なコンテンツ画面へ遷移するURL](https://dev.intra-mart.jp/cookbook176038/)
MySQL サーバー1つで複数DBを起動する

複数起動する意味というか実用性はまったくない 
ただ開発環境でマスタスレーブのレプリケーション環境を構築したかっただけ 
一応開発環境のバックアップ的要素にはなるかも 

mysqld_multiを利用してmysqlを複数起動します 
mysql-serverをyumなんかでインストールしてれば入ってるはず
### 環境
* CentOS release 6.6 (Final)  
* mysql  5.6.22

### 手順
#### マスタ、スレーブDB作成
既にmysqlがインストールされていて起動していればそれをそのまま利用することも可能 
今回はマスタ、スレーブともに新しく作ります

```bash
# マスタ用
mkdir /var/lib/mysql-master
chown mysql.mysql /var/lib/mysql-master
mysql_install_db --datadir=/var/lib/mysql-master

# スレーブ用
mkdir /var/lib/mysql-slave
chown mysql.mysql /var/lib/mysql-slave
mysql_install_db --datadir=/var/lib/mysql-slave
```
#### my.confの設定
```bash
# 念のため元の設定ファイルとっておく
cp /etc/my.cnf /etc/my.cnf.org

# mysqld_multiの設定例を表示
# これを元に設定します
mysqld_multi --example

# 設定した内容
cat /etc/my.cnf
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin

[mysqld1]
port = 3306
datadir = /var/lib/mysql-master
socket = /var/lib/mysql-master/mysql.sock
pid-file = /var/lib/mysql-master/mysql.pid
log-error = /var/log/mysql-master.log

[mysqld2]
port = 3307
datadir = /var/lib/mysql-slave
socket = /var/lib/mysql-slave/mysql.sock
pid-file = /var/lib/mysql-slave/mysql.pid
log-error = /var/log/mysql-slave.log
```

#### 起動と確認、停止など
```bash
# DBステータスを確認
mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is not running

# 起動(初回は初期化処理が走ります)
mysqld_multi start
mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running

# 停止
mysqld_multi stop
```

#### 各デーモンのコンソールにアクセスする方法
ソケットを指定してアクセスします  

```bash
# MasterDB
mysql --socket=/var/lib/mysql-master/mysql.sock

# SlaveDB
mysql --socket=/var/lib/mysql-slave/mysql.sock
```

#### レプリケーションの設定
あとはmy.cnfいじってレプリケーションの設定をする  
設定かくのめんど…割愛します！

#### 起動スクリプトの作成と設定
```bash
vim /etc/init.d/mysqld_multi
chmod 766 /etc/init.d/mysqld_multi
cat /etc/init.d/mysqld_multi
#!/bin/sh

# Mysql daemon start/stop script.
#
# chkconfig: 2345 90 90
# description: A very fast and reliable SQL database engine.

MYSQLDIR=/usr
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:$MYSQLDIR/bin
MYSQLID=1,2
export PATH

case "$1" in
start)
echo -n "Starting mysqld: "
$MYSQLDIR/bin/mysqld_multi start $MYSQLID
echo
;;
stop)
echo -n "Shutting down mysqld: "
$MYSQLDIR/bin/mysqld_multi stop $MYSQLID
echo
;;
status)
$MYSQLDIR/bin/mysqld_multi report $MYSQLID
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac

exit 0

# 自動起動設定
chkconfig mysqld_multi on
```
CakePHP3でfindしたときメモリ足りなくなった

なんも気にせず全件findしてぐるぐる処理しようとしていたら `Allowed memory size` で落ちた

```php
$query = $this->Table->find();
foreach ($query as $entity) {
    // いろんな処理
    // 何千件か処理したところで突然の死！！
}
```

1レコードでかいからかなーとか思っていたけどそれも違う。
`foreach`のなか全てコメントアウトしても一緒…
なんでや！！ と思っていたら公式にちゃんと載ってた。
「結果をキャッシュしつつ イテレートします」と…
http://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html#id15  

クエリーが遅延評価されるとこだけ見て勘違いしていた。
http://book.cakephp.org/3.0/ja/orm/query-builder.html#id6
npmが使えない時にIE11でPromiseを使う

## `Promise is undefined`対策
### cdnからpolyfillライブラリを読み込む
[Promiseのpolyfill(IE11お前もか!)](https://qiita.com/zERobYTezERo/items/ac458c4cf2a8f2f6c3dd)にも書かれている通り以下のソースをコピペしたい所だが、結構古い記事だったので今現在最新のものを持ってくるようにする。
多分最新はここに置いてあると思います。
https://www.promisejs.org/

```html
<script src="https://www.promisejs.org/polyfills/promise-done-7.0.4.min.js"></script>
```

## アロー関数を使わない
アロー関数があるとsyntax errorになってしまうのでfunctionに置き換えましょう。

### Promiseを返す時 アロー関数ver(動作しない)
```javascript
  function ajaxData() {
    return new Promise((resolve) => {
      $.ajax({ 
          url    : xxx,
          type   : 'GET',
          timeout: 5000
      })
      .done((data) => {
        resolve(data);
      })
    });
  }
```

### Promiseを返す時 function ver(動作する)
```javascript
  function ajaxData() {
    return new Promise(function(resolve){
      $.ajax({ 
          url    : xxx,
          type   : 'GET',
          timeout: 5000
      })
      .done(function(data){
        resolve(data);
      })
    });
  }
```

### Promiseの結果からthenで繋げるとき アロー関数 ver(動作する)
```javascript
  function parseAjaxData() {  
    ajaxData().then((result) => {
      console.log(result);
    })
  }
```

### Promiseの結果からthenで繋げるとき function ver(動作する)
```javascript
  function parseAjaxData() {  
    ajaxData().then(function(result) {
      console.log(result);
    })
  }
```
Elasticsearch への問い合わせ (Ruby)

こちらで作成したデータに Ruby で問い合わせをします。
[Elasticsearch へのデータ投入](https://qiita.com/ekzemplaro/items/b6dda109ffe19b3c39c8)

Arch Linux でのライブラリーのインストール

```bash
yay -S ruby-rest-client
```

```rb:elastic_query.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
#
#	elastic_search.rb
#
#					Oct/04/2018
#
# ---------------------------------------------------------------------
require 'restclient'
require 'json'
#
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"

URL = "http://localhost:9200/_search?q=tags:apple,moon"

str_json = RestClient.get URL

dict_aa = JSON.parse(str_json)

list_aa = dict_aa['hits']['hits']
list_aa.each {|unit|
	puts unit['_id']
	ss = unit['_source']
	puts "\t" + ss['name']
	puts "\t" + ss['title']
	puts "\t" + ss['content']
	str_out = ""
	ss['tags'].each {|tag|
		str_out += "\t" + tag
		}
	puts str_out
	}

STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
#
```

実行結果

```text
$ ./elastic_query.rb 
*** 開始 ***
t0003
	渡辺五郎
	My Name Is Watanabe
	I love fish
	apple	orange	banana
t0002
	田中康夫
	My Name Is Tanaka
	I love cat
	Earth	Moon	Mars
*** 終了 ***
```
Array の12つ


https://blog.csdn.net/andyzhaojianhui/article/details/78704219
下記の内容は上記のURLから

下面是stackoverflow中关于数组方法的相关问题中，获得最多票数的12个数组操作方法。 1.  声明一个数组 

Java代码 


String[] aArray = new String[5];  
String[] bArray = {"a","b","c", "d", "e"};  
String[] cArray = new String[]{"a","b","c","d","e"};  
2.  输出一个数组 

Java代码 


int[] intArray = { 1, 2, 3, 4, 5 };  
String intArrayString = Arrays.toString(intArray);  
   
// print directly will print reference value  
System.out.println(intArray);  
// [I@7150bd4d  
   
System.out.println(intArrayString);  
// [1, 2, 3, 4, 5]  
3.  从一个数组创建数组列表 

Java代码 


String[] stringArray = { "a", "b", "c", "d", "e" };  
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));  
System.out.println(arrayList);  
// [a, b, c, d, e]  
4.  检查一个数组是否包含某个值 

Java代码 


String[] stringArray = { "a", "b", "c", "d", "e" };  
boolean b = Arrays.asList(stringArray).contains("a");  
System.out.println(b);  
// true  
5.  连接两个数组 

Java代码 


int[] intArray = { 1, 2, 3, 4, 5 };  
int[] intArray2 = { 6, 7, 8, 9, 10 };  
// Apache Commons Lang library  
int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);  
6.  声明一个内联数组（Array inline） 

Java代码 


method(new String[]{"a", "b", "c", "d", "e"});  
7.  把提供的数组元素放入一个字符串 

Java代码 


// containing the provided list of elements  
// Apache common lang  
String j = StringUtils.join(new String[] { "a", "b", "c" }, ", ");  
System.out.println(j);  
// a, b, c  
8.  将一个数组列表转换为数组 

Java代码 


String[] stringArray = { "a", "b", "c", "d", "e" };  
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));  
String[] stringArr = new String[arrayList.size()];  
arrayList.toArray(stringArr);  
for (String s : stringArr)  
    System.out.println(s);  
9.  将一个数组转换为集（set） 

Java代码 


Set<String> set = new HashSet<String>(Arrays.asList(stringArray));  
System.out.println(set);  
//[d, e, b, c, a]  
10.  逆向一个数组 

Java代码 


int[] intArray = { 1, 2, 3, 4, 5 };  
ArrayUtils.reverse(intArray);  
System.out.println(Arrays.toString(intArray));  
//[5, 4, 3, 2, 1]  
11.  移除数组中的元素 

Java代码 


int[] intArray = { 1, 2, 3, 4, 5 };  
int[] removed = ArrayUtils.removeElement(intArray, 3);//create a new array  
System.out.println(Arrays.toString(removed));  
12.  将整数转换为字节数组 

Java代码 


byte[] bytes = ByteBuffer.allocate(4).putInt(8).array();  
   
for (byte t : bytes) {  
   System.out.format("0x%x ", t);  
}  

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

本文来自 andyzhaojianhui 的CSDN 博客 ，全文地址请点击：https://blog.csdn.net/andyzhaojianhui/article/details/78704219?utm_source=copy
はじめて学ぶ人のためのScala<->Erlang構文対応表

| | Scala | Erlang |
|:-----------|:------------|:------------|
| 変数 | `x` | `X` |
| 関数適用 | `f(x, y)` | `f(X, Y)` |
| 無名関数 | `(x) => x+1` | `fun(x) -> x+1 end` |
| 変数定義 | `val x = 1` | `X = 1`|
| if式 | `if(x < 1) 100`<br>`else 200` | `if`<br>&nbsp;&nbsp;`N < 10 -> 100;`<br> &nbsp;&nbsp;`true -> 200`<br>`end` |
| パターンマッチング | `"1" match {`<br> &nbsp;&nbsp;`case 1 => 100`<br>&nbsp;&nbsp;`case 2 => 200`<br>`}` | `case 1 of`<br>&nbsp;&nbsp;`1 -> 100;`<br>&nbsp;&nbsp;`2 -> 200`<br>`end` |
| | | |
ElementTreeによるxmlファイルの生成と読み込み

#ElementTreeを使って辞書データからXMLファイルを生成→生成したXMLファイルを読み込み
```py3:test_xml.py
import xml.etree.ElementTree as ET

def make_xml(dc):

    #XML文字列の生成
    roots = ET.Element('root', {'ttl':'test_root'})
    p = ET.SubElement(roots, 'p1') 
    t = ET.SubElement(p, 'fld1', {'atr1':'1.1','atr2':'1.5'}) 
    t.text = dc["fld1"] 
    t = ET.SubElement(p, 'fld2', {'atr1':'2.2','atr2':'2.5'}) 
    t.text = dc["fld2"] 
    p = ET.SubElement(roots, 'p3') 
    t = ET.SubElement(p, 'fld3', {'atr1':'3.3','atr2':'3.5'}) 
    t.text = dc["fld3"] 

    #XML文字列の出力
    ET.dump(roots)
    
    #XMLファイルの生成
    tree = ET.ElementTree(roots) 
    fl = 'test.xml'  
    tree.write(fl)
    
    # 生成したXMLファイル名を返す
    return fl 
  
def read_xml(fl):
    tree = ET.parse(fl) 
    root = tree.getroot() 

    #tg  = root.tag
    #atr = root.attrib

    for c1 in root:
        print(c1.tag)
        for c2 in c1:
            tg = c2.tag
            atr1 = c2.attrib.get("atr1") 
            atr2 = c2.attrib.get("atr2") 
            txt  = c2.text
            print(atr1,atr2,txt)
            
# main
if __name__ == '__main__':

      #引数で渡すダミーの辞書
      dc = {'fld1': 'test1', 'fld2': 'test2', 'fld3': 'test3'}

      #print(dc)
      #print(dc["fld1"])
      
      # XMLファイルの生成
      fl = make_xml(dc)                        
      print( fl )

      # XMLファイルの読み込み
      read_xml( fl )   

```
※数年前に何かの処理で、RDBのデータからレポーティング資料をPowerPoint(＝pptxファイル)にて半自動で生成する的な処理をpython-pptxというライブラリを使用して実装するスクリプトを書いたのだが。その時に、**Pandasで最寄りのRDBのテーブルを読み込んだデータを一時保存としてXMLファイルを生成**して、その上で**そのXMLファイルを読み込んで**データからpptxの中身のXMLを直接加工するという流れで、ElementTreeでXMLファイルの生成と読み込みのスクリプトを記述。

今久しぶりに見てみると、今ならパワポでレポーティング資料作るかなー？（今なら例えばGoogle Drive上にてpresentationを起動して、プレゼン資料を生成する）と思うのだけれども。そうはいいつつもpptxファイルを半自動で生成するスクリプトなどは捨てがたい？というか、半自動のアイデアはどこかで活かしたいところである。

どこかで利用するかもということで、Qiitaに蔵出しで公開。
（Google Colaboratory上で実行可能。なおGoogle Colaboratoryには既にElementTreeは入っている模様）
[Ruby] 全角チルダ/波ダッシュ問題

## 経緯
あるシステムで、日付を含む文字列を取得してその日付を使って処理を行うという実装をしていた。
そんで、分割して取得した2つの日付を比較する。みたいなイメージ。
ちなみに日付の文字列は動的に変わっていく感じ。

元々の処理

```
period_str = '2016/4～2017/9'
# '2016/4～'
# '2016/4～2017/9'
period = period_str.split('～')
```

## 問題
これだと、正しく分割出来たり、出来ない問題が発生していた。

```
[10] pry(#xxxx)> period_str.split('～')
=> ["2016/3"]
[11] pry(#xxxx)> period_str.split('〜')
=> ["2016/3～"]
```

## 原因
原因はこのサイトが説明してくれていたよ↓
http://ch.nicovideo.jp/suwatoh/blomaga/ar634436

文字コードをこのサイトで↓
https://www.marbacka.net/msearch/tool.php#str2enc

```
[10]('～') --->\U0000FF5E
[11]('〜') ---> \U0000301C
```

## まず浮かんだ対応策
あーね、全角チルダと波ダッシュで違う文字なのね。と。
じゃあその2パターンでsplitすれば良いやん！

こんなイメージ↓

```
period = period_str.split('～').split('〜')
```

いやいや、待てよ。もしその2パターン以外の文字(ちょっと思いつかないけど)で区切られてたらどうするよ!?
split('').split('')....って***イケてなさすぎ***でしょ。

## 最終的な解決策
ってことで、結局以下の方法に落ち着きました。
区切り文字部分を正規表現で取得して、そいつでsplitする
(2018/10/4 @kts_h からコメントを頂いたので追記)

```
# 元々の処理
separator = period_str[/[^0-9].*/][/.[^0-9]/][/[^0-9]/]
period    = period_str.split(separator)

# 修正後の処理(こんな簡潔に済むとは...)
period = period_sty.split(/[^0-9\/]/)

p period # ["2016/4", "2017/9"]
```

## 正規表現について
あんまり得意じゃないので、実行しまくりながらたどり着きました。

```
str    = '2016/4～2017/9'
first  = str[/[^0-9].*/]
second = first[/.[^0-9]/]
last   = second[/[^0-9]/]

p first  # "/4～2017/9"
p second # "～2017/9"
p last   # "〜"
```
```
separator = str[/[^0-9].*/][/.[^0-9]/][/[^0-9]/]
```

## 最後に
これまで気付かなかったってことは、途中で取得元のデータが変更になったのかな？
最初から出来ていなかったとしたら....結構恐ろしい...。
まぁ解決したので、とりあえず良しとしよう。
RTMP対応NginxをRPMパッケージにしてインストールする覚書

nginxはRTMPモジュールを組み込んで動画配信を行うことができます。
RTMPモジュールを組み込むため、nginxをソースインストールで導入することが多いですが、
これをRPMパッケージとして作成しインストールすることにより、パッケージ管理の恩恵にあずかることができます。

## 前提環境
- CentOS7
- EPELリポジトリを導入しておく

## コンパイルに必要なツール類の導入
```
yum groupinstall --enablerepo=epel 'Development Tools'
yum install yum-utils rpm-build redhat-rpm-config rpmdevtools git
```

## RPM環境をビルドするコマンド投入
```
rpmdev-setuptree
```

## Nginxのリポジトリ導入
```
wget http://nginx.org/keys/nginx_signing.key && sudo rpm --import nginx_signing.key
```

```
vi /etc/yum.repos.d/nginx.repo
```

```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
enabled=1
gpgcheck=1

[nginx-source]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/SRPMS/
enabled=1
gpgcheck=1
```

## 最新のNginxソースRPMを入手
```
yum update && yumdownloader --source nginx
```

## 依存関係のあるパッケージ類をインストールしておく
```
yum-builddep nginx-1.xx.x-x.el7_x.ngx.src.rpm
yum install pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel
```
バージョン番号は適時読み替えてください。

## RTMPモジュールを入手
```
git clone https://github.com/arut/nginx-rtmp-module.git
```

## SRPMを展開（インストール）
```
rpm -ivv nginx-1.xx.x-x.el7_x.ngx.src.rpm
```

## SPECファイル編集
```
vi rpmbuild/SPECS/nginx.spec
```
configureオプションが羅列されている行の末尾に以下を追記する

```
--add-module=/_any_path_/nginx-rtmp-module
```
バージョン番号は適時読み替えてください。

## リビルド前にspectoolを駆けらせる
```
spectool -g -R rpmbuild/SPECS/nginx.spec
```

## リビルド
```
rpmbuild -ba rpmbuild/SPECS/nginx.spec
```

## 出来たRPMをインストール
```
rpm -ivv rpmbuild/RPMS/x86_64/nginx-1.xx.x-x.el7_x.ngx.x86_64.rpm
```
バージョン番号は適時読み替えてください。

これでRTMPモジュールを組み込んだNginxがインストールされました。

## nginxスタート
```
service nginx start
```
Cognos Analytics で逆スタースキーマモデルの実践 - ④パフォーマンスチューニング

#概要
前回までのところで、属性データの逆スタースキーマへの取り込みをご説明しました。

③属性データのモデル取り込み
https://qiita.com/shinyama/items/b66d59a92a58533f7c2b

最終回の今回は、このモデルでできる数少ないチューニング方法です。

#生成されるSQLの形

逆スタースキーマモデルで、2つのファクト表からデータアイテムを取得した場合、以下の様なパターンのSQLとして発行されます。
FS1で、ファクト1のSALESと、共通ディメンションのPRODを取得し、
FS2で、ファクト2のPLANと、共通ディメンションのPRODを取得し、
それを**FULL OUTER JOIN**で結合します。
こういうクエリーをStitch Queryと言い、マルチファクトモデルではこの様なクエリーが発行されます。

```html
WITH 
"FS1" AS 
    (
    SELECT
        "DIMC1"."PROD" AS "PROD", 
        SUM("FACTC1"."SALES") AS "SALES"
    FROM
        "DB2INST1"."DIMC1" "DIMC1"
            INNER JOIN "DB2INST1"."FACTC1" "FACTC1"
            ON "DIMC1"."PROD" = "FACTC1"."PROD" 
    GROUP BY 
        "DIMC1"."PROD"
    ), 
"FS2" AS 
    (
    SELECT
        "DIMC1"."PROD" AS "PROD", 
        SUM("FACTC2"."PLAN") AS "PLAN"
    FROM
        "DB2INST1"."DIMC1" "DIMC1"
            INNER JOIN "DB2INST1"."FACTC2" "FACTC2"
            ON "DIMC1"."PROD" = "FACTC2"."PROD" 
    GROUP BY 
        "DIMC1"."PROD"
    )
SELECT
    COALESCE(
        "FS1"."PROD", 
        "FS2"."PROD") AS "PROD", 
    "FS1"."SALES" AS "SALES", 
    "FS2"."PLAN" AS "PLAN"
FROM
    "FS1"
        FULL OUTER JOIN "FS2"
        ON "FS1"."PROD" = "FS2"."PROD" OR ("FS1"."PROD" IS NULL AND "FS2"."PROD" IS NULL) FOR FETCH ONLY
```

FULL OUTER JOINじゃあ遅いのはしょうがないかなと感じてしまいますが、なんとかチューニングできないかと調査したところ、実は結合条件に記載されているこの部分があると非常に遅いことがわかりました。
**("FS1"."PROD" IS NULL AND "FS2"."PROD" IS NULL)**

キー項目のデータが、どちらもNULLの場合に結合するかどうか、という条件になります。
この部分を外したクエリーを投げると、元々300秒くらいかかっていたクエリーが、10秒以下で返ってくるようになりました。

#チューニング
何しろ自由分析なので、クエリーを書き換えるわけには行かず、この **("FS1"."PROD" IS NULL AND "FS2"."PROD" IS NULL)** を消すためにはどうしたら良いか、という問題ですが、Framework Managerのガバナーの設定で解決できました。
ガバナーで「複数ファクトの結合演算子」を「等価演算子」に変更し、パッケージを発行したところ、例のNULL&NULL結合の箇所がきれいに消えてくれて、レポート実行時間が1/30くらいになりました。
これにより大量のファクトテーブルをまたがる自由分析という厳しい要件が、まっとうな速度で実現できるようになりました。
※NULL&NULL結合を消してよいかはもちろんデータの要件によります
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/b2edaf49-0298-8be4-6269-c3be2e9aeb01.jpeg)

#終わりに
という訳で、全4回にわたる**逆スタースキーマモデルの実践**は終わりになります。
正直、最初に手をつけた時は「こんなモデルは無理できないだろうな」と思っていたのですが、Cognosの色々な機能を駆使して最終的に実現できてしまったとき、素直に**Cognosってすごいもんだな**と感心してしまいました。
手軽で操作が簡易なセルフサービスBIの製品も良いですが、やっぱり長年エンタープライズでもまれてきた製品は底力があるもんですね。
今回やってみて感じた、この感動を一人でも多くの人に共有できたらと思い、4回にも渡って投稿してみました。

#目次
第①回：基本的なモデルの動作検証
https://qiita.com/shinyama/items/0567425a4a47ad7d6efa

第②回：自由分析への対応
https://qiita.com/shinyama/items/5bb75bae2e67d6e9cac0

第③回：属性データのモデル取り込み
https://qiita.com/shinyama/items/b66d59a92a58533f7c2b

第④回：パフォーマンス・チューニング
https://qiita.com/shinyama/items/b4b28844b4235db70032
OSをmojaveにしたことでgitでxcodeによるエラーが出たときの対処法

git cloneをしたら以下のエラーが出た。

```
git: error: unable to locate xcodebuild, please make sure the path to the Xcode folder is set correctly!
git: error: You can set the path to the Xcode folder using /usr/bin/xcode-select -switch
```

前まで問題なくgit cloneできていたのだが、多分macOSをmojaveに変更したことに原因がありそうだった。

調べたところ`xcode-select --install`を実行したら行けるようなことが書いてあった。

```
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```

しかしだめだった。

どうやらパスが通っていないようだった。
そこで`sudo xcode-select -switch /Library/Developer/CommandLineTools`を実行したするとエラーがなくなった。

https://techracho.bpsinc.jp/hachi8833/2016_09_09/25454
https://apple.stackexchange.com/questions/254380/macos-mojave-invalid-active-developer-path

## homebrewも使えない問題

`brew update`を実行

```
Error: Failure while executing; `git config --local --replace-all homebrew.analyticsmessage true` exited with 71.
```

`sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer `を実行したら`brew update`でエラーは出なくなった。

https://qiita.com/atsush1m/items/b301a2eaf6ff4a391eca

## まとめ
ダークモードにしたいからって、早まってmojaveにアップデートすると良くない。いろいろ弊害が出る。
DockerSync起動時にundefined method エラー発生 

# 問題

Docker起動時に以下エラーが発生

```
 $docker-sync-stack start
/Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.9/lib/docker-sync/upgrade_check.rb:129:in `check_and_warn': undefined method `check_unison_image' for #<UpdateChecker:0x00007fc539918c18> (NoMethodError)
Did you mean?  check_rsync_image
	from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.9/lib/docker-sync/upgrade_check.rb:18:in `run'
	from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.9/tasks/stack/stack.thor:33:in `start'
	from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'
	from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'
	from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'
	from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.0/lib/thor/base.rb:466:in `start'
	from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.9/bin/docker-sync-stack:15:in `<top (required)>'
	from /usr/local/bin/docker-sync-stack:22:in `load'
	from /usr/local/bin/docker-sync-stack:22:in `<main>'
```

GemのVersionが揃ってないのかな、と思いDockerSync周りのGemを入れ直して見たが変わりませんでした。

# 解決策
複数Versionのdocker-syncが入っていたので一つにした。
＄HOME以下の`.docker-sync-glocal.yml`を削除し、再度`gem install docker-sync`（`docker-sync clean`で同じことができる？）

# 経緯

過去1年ほど前にDockerSyncを導入していた
今回DockerSyncを最新にupdate(`gem update docker-sync`)
この時＄HOME以下の`.docker-sync-glocal.yml`の内容が書き換わらなかった。
[Swift4.2]enumを使ったエラー通知処理

#前置き
QiitaもSwiftも初心者なのでよろしくお願いします！

個人的にenumをどのように扱うのか分からなかったので一つの例として今回書いて行こうと思います！

#動作環境
Swift4.2
Xcode 10.0

#はじめに
今回はソースコードの可読性を上げる為にenumでエラー文を書き、Alertでそれを表示する処理を書きます。

<img width="375" alt="Simulator Screen Shot - iPhone 7 - 2018-10-04 at 17.02.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/244234/0cd248fe-52f4-9aeb-b569-0a06f47b9f26.png">

#ファイル作成
上のタブのFileから New -> File...　を選びSwift Fileを選択します。
<img width="728" alt="スクリーンショット 2018-10-04 17.05.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/244234/38add785-2a61-f1cb-72f8-5a82da1235db.png">
 
ファイル名は「SomeError」にしときます。
そしてcreateボタンを押します。
<img width="343" alt="スクリーンショット 2018-10-10 18.26.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/244234/c002469e-ba86-0873-7de0-90188f6734eb.png">



そして作成したファイルにコードを書き込みます。

```swift:SomeError
import Foundation

enum SomeError:Error{
    case error1
    case error2
}

extension SomeError:LocalizedError{
    var errorDescription:String?{
        switch self {
        case .error1:
            return "エラーメッセージ_１"
        case .error2:
            return "エラーメッセージ_２"
        }
    }
}


```

#ボタン配置
Alertを表示する為にボタンを設置します。
ボタン配置場所は以下の写真のように適当です。ボタン名を「alertButton」に変更します。


<img width="688" alt="スクリーンショット 2018-10-04 17.22.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/244234/d385acbc-6e58-7a35-0104-2547c1ba63b1.png">

そしてViewControllerに紐付けします。
(connectionはActionにして下さい)
<img width="241" alt="スクリーンショット 2018-10-06 4.17.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/244234/832724b3-af94-7ce8-7378-e77a9b3521ec.png">


#ViewControllerの処理
ViewControllerのコードは以下の通りです。

```Swift:ViewController

import UIKit

class ViewController: UIViewController {
    let error1 = SomeError.error1
    let error2 = SomeError.error2
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    /*アラートボタン*/
    @IBAction func alertButton(_ sender: UIButton) {
        alertAction(error1.errorDescription!)
    }
    
    /*アラート処理*/
    func alertAction(_ message:String){    //引数にString型のデータを受け取る
        let ac = UIAlertController(title: "🚨", message: message, preferredStyle: .alert)
        ac.addAction(UIAlertAction(title: "OK", style: .default))
        present(ac,animated: true)
    }
  }
```

#実行結果

<img width="375" alt="Simulator Screen Shot - iPhone 7 - 2018-10-04 at 17.02.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/244234/3dcffc49-1326-f5b2-6138-3b2e8773777d.png">

#最後に
今回初めて記事を書きました。
enumについてはこの他にもたくさんの書き方があります。この記事ではenumでこんな書き方もあるのか程度で見ていただければ幸いです。
改善点があれば（たくさんあると思う）是非コメントをよろしくお願いします。
VSCode Ruby Monokai 定数 色を付けたい

###### ※ このメモは .rb 以外の事は全く考慮されていません

VSCode にデフォで入っている Monokai は定数に色が付いてくれない

![スクリーンショット 2018-10-04 17.37.26.png](https://qiita-image-store.s3.amazonaws.com/0/20787/cd863fc8-61e1-b62e-4087-83dcfb29bba2.png)

半泣きで試行錯誤したら出来たのでメモ

![スクリーンショット 2018-10-04 17.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/20787/ea0f2827-12df-4fe4-367a-65fbf1208b65.png)

他にも方法がありそう

```json
{
    "editor.tokenColorCustomizations": {
        "[Monokai]": {
            "textMateRules": [
                {
                    "scope": "variable.other.constant",
                    "settings": {
                        "foreground": "#ae81ff"
                    }
                }
            ]
        }
    }
}
```

###### 参考

https://code.visualstudio.com/docs/extensions/themes-snippets-colorizers#_textmate-theme-rules
https://macromates.com/manual/ja/language_grammars
https://www.sublimetext.com/docs/3/scope_naming.html
Linuxで5GHz帯を使うWi-Fiのregulatory domain設定

Linuxで5GHz帯を使うWi-Fiのregulatory domain設定の方法。

設定を行う前は電波が出なかったけど、設定したら電波が出るようになったので、この方法で良いみたいです。

# ネットワークインタフェースの設定

```
$ sudo iw reg set JP
```

# wpa_supplicantの設定

設定ファイルに1行追加する。

```
country=JP
```

以上
【朗報】まだJava8でいける!!

うれしかったので、投稿するよ。
2019/1までしかサポートしないといってたOpenJDK8が正式に 2023/6までサポートしてくれるって！！

![Screenshot_2018-10-04 https access redhat com.png](https://qiita-image-store.s3.amazonaws.com/0/24418/43d83d2b-c902-984c-d0e0-2b742d3f6f9b.png)
[OpenJDK ライフサイクルおよびサポートポリシーより](https://access.redhat.com/ja/articles/1457743#OpenJDK_Life_Cycle)

【関連記事】
http://mail.openjdk.java.net/pipermail/jdk8u-dev/2018-September/007923.html
https://developers.redhat.com/blog/2018/09/24/the-future-of-java-and-openjdk-updates-without-oracle-support/
Visual Studio CodeでC++をビルド＆実行

書き捨てプログラムを書く時に便利．

```tasks.json
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [{
      "label": "g++",
      "type": "shell",
      "command": "g++ -std=c++11 st.cpp",
    },
    {
      "label": "run",
      "type": "shell",
      "command": "./a.out",
      "dependsOn": [
        "g++"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}
```


`Shift + Ctrl + B`でビルドと実行の両方をやってくれる．
TensorFlow事始めメモ

【作成中】
jupyter notebookのリンク
・使い方の一通りが体験できます。
　https://techacademy.jp/magazine/17430
・より詳しい初心者向け使い方です。
　https://www.sejuku.net/blog/59437

Grad-CAMのリンク
https://qiita.com/haru1977/items/45269d790a0ad62604b3
http://blog.brainpad.co.jp/entry/2017/07/10/163000

GAN（Generative Adversarial Network）のリンク
https://elix-tech.github.io/ja/2017/02/06/gan.html
https://blogs.nvidia.co.jp/2017/06/21/generative-adversarial-network/
https://products.sint.co.jp/aisia/blog/vol1-19
Visual Studio Code で　Console.ReadLineを使う方法

##経緯

現在、Macで研修を行っています。とはいえC#大好きなので,Unityを使っていました。最初の構文の勉強ではMonoDevelopでコンソールアプリを作っています。
ところがUnity2018よりMonoDevelopではなく、Visual Studio for Macになるとのこと。でもその後のPHPやRubyの研修でAtom使うこともあり、いっそのことVisual Studio Code（以下 VS Code）でやってみようと思いました。 

##問題点
文字を出力し、文字を読み込むコードを書いて見ました。

```C#
static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            string messageg = Console.ReadLine();
        }
```
下図のようになり出力はできるのですが、入力部分でプログラムが停止してしまいます。

VS Code<img width="771" alt="スクリーンショット 2018-10-04 16.46.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/108556/ae2be726-0b9e-67b3-80dc-a249bfdd52ae.png">

調べたところVS Codeのデバッグコンソールは出力専用で入力はできないとのことでした。

##解決
それで通常のターミナルで実行するように設定を変更しました。
.vscodeディレクトリ配下にあるlaunch.jsonを開きます。

```json:launch.json

   "configurations": [
        {
            "name": ".NET Core Launch (console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/bin/Debug/netcoreapp2.1/consoleTest.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
//この下の部分を変更
            "console": "internalConsole",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart"
        },
```
この"console":"internalConsole"の部分を
"console":"externalTerminal"に書き換えました。

```json:launch.json
   "configurations": [
        {
            "name": ".NET Core Launch (console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/bin/Debug/netcoreapp2.1/consoleTest.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
//この下の部分を変更！！
            "console": "externalTerminal",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart"
        },
```
この操作をしていて気づいたのですが、"internalConsole"の部分をマウスでポイントすると
>internalConsole:Output to the VS Code Debug Console.This doesn't support reading console input (ex:Console.ReadLine)

と表示されました。意訳すると、「consoleの設定値を"internalConsole”にすると、例えばConsole.ReadLineみたいなコンソールからの入力はVS codeのデバッグコンソールでは使えないよ」となり思いっきり当てはまってました。
書き換えたところ無事実行時にターミナルが開き、入力も行えるようになりました。

参考にしたのは下記サイトですが、微妙に設定項目が違いました。

[Debug Console window cannot accept Console.ReadLine() input during debugging](https://github.com/OmniSharp/omnisharp-vscode/issues/1053)
git

spring-integration development guideline https://github.com/spring-projects/spring-integration/blob/master/CONTRIBUTING.adoc


upstreamの設定

```
git remote add upstream <中央のURL>
git fetch upstream
git branch -a
```

git fetch

```
git fetch
git branch -a
```

remoteのbranchを指定してlocalのbranchをきる

```
git branch <localの名前> <remoteの名前>/<remoteで取得したいbranchの名前>
git branch feature/jenkins origin/feature/jenkins
```

rebaseして綺麗にする。

```
git rebase -i HEAD~~
```

forkしたやつでPRだしたらconflictを起こした。こういう場合はrebase
* http://dev.toihrk.me/2015/06/02/github-fork-usage.html
* https://qiita.com/KTakata/items/d33185fc0457c08654a5
* 

```
git fetch upstream
(追従したいbranchにいることを確認)
git rebase upstream/<追従したいbranch>

例: issueブランチをupstreamのmasterに追従させたいとき
git fetch -a
git branch -a
git checkout issue
git branch
git rebase upstream/master
git log
```

PRをlocalにpullしたいとき

```
git fetch origin pull/ID/head:BRANCHNAME
```
cf.) https://help.github.com/articles/checking-out-pull-requests-locally/

gitlabのとき

```
git fetch origin merge-requests/13/head:pr_13
```
32ビットLinuxではVisual Studio Codeは自動アップデートできない⁉︎

## 背景
仕事の関係で、ちょっと古い32ビットのDebianに、Visual Studio Codeを入れています。

Visual Studio Code自体の動作は問題ありませんが、**自動アップデートができません**。「新しいバージョンがある」という通知は表示されるのですが、ダウンロードしようとしても、何も起こりません。

## 原因（リポジトリに無い⁉︎）
`apt`のリポジトリとして指定する[サイト](https://packages.microsoft.com/repos/vscode/ "packages.microsoft.com")をブラウザで見てみますと、アーキテクチャとして存在するのは、amd64だけです。**x86がありません**。インストール・ガイドをよく見ると、`[arch=amd64]`という記述があります。

参考: [インストール・ガイド](https://code.visualstudio.com/docs/setup/linux "code.visualstudio.com")

自動アップデートの取得元が、`apt`のリポジトリと同じかどうかはわかりませんが、同じようにamd64しか用意していない可能性はありますね。

## 対策…
[Visual Studio Codeのサイト](https://code.visualstudio.com/Download "code.visualstudio.com")から、手動でダウンロードしアップデートする…。
（64ビットにしなさい、ってことですよね…）
何気ないfreebsd-updateがZFSストレージプールを傷つけた

## はじめに
FreeBSDの更新をしたら正常にコマンドを実行できない状態に陥ったので、ひとまずデータだけを復旧したっていう話

## 経緯
以前からhp microserverにFreeBSD 10.1をインストールして、ファイルサーバとして利用していた。ストレージにはZFSを利用。そこに今回思い付きでPT3を入れて録画サーバとしても利用しようかなと思ったのが事の発端。

https://hgotoh.jp/wiki/doku.php/documents/freebsd/freebsd-019
上記URLに書いてあることを愚直に実行してPT3の関連ソフトウェアを導入していこう、と考えていたがrecpt1のautogen.shを実行するところで、autoconfとautomakeが要求されるのだが、それらのインストールでP5関連のエラーが発生し、解消しない。
海外のサイト見てると/usr/portsの下のファイルをコピーしたりして対応しているworkaroundも見受けられたが、portsの実装の問題のようにも見えるので、OS環境更新してみるべと思って実行したのが以下コマンド。

```
freebsd-update -r 11.2-RELEASE upgrade
freebsd-update install
```
今にして思えば軽いノリでfreebsd-update を実行したのがすべての間違いだった。
上記コマンド実行後、リブートしてからもう一度freebsd-update install打ってね♡、って内容の文言が表示されたのでそのまま実行。するとその後から

```
# ls
/bin/csh: Exec format error.
# what /boot/kernel.old/kernel
ELF interpreter /libexec/ld-elf.so.1 not found, error 8
Abort
```
こんな感じのエラーが。どうもOS領域が破損してしまったらしい。こうなってくるとPT3の導入がどうというより、元々のファイル復旧が先決となってしまった。

## ファイルを認識するまで
ここからはコンソール作業。まずはリブート後、kernel.oldで起動しようとしてみた。
が、あいにくエラーは解消されない。
仕方ないので FreeBSDをLiveCDから起動して、ファイルサーバとして使っていた領域だけでも解消しよう。
まずはZFSストレージプールをマウントせねば。

```
# zpool import
## 確認したidを指定する
# zpool import -f <id> mydata
```
とりあえずmydataにリネームしてインポートしてみた。なお、ちゃんとエクスポートしたストレージプールではないので、importには"-f"オプションが必要。

しかしながら、

```
# zpool list
ELF interpreter /libexec/ld-elf.so.1 not found, error 8
Abort
```
また、このエラーか、ELF。

これは、zpool import で/libexec下、というかルートのファイルシステム を上書きしているのかな。ZFSをルート領域に割り当ててたからさもありなん。
仕方ないので再起動後、今度は別のパスにインポート。手順は以下URLを参照した。
https://forums.freebsd.org/threads/mounting-and-editing-hard-disk-from-livecd.61726/

```
# mkdir /tmp/mydata
# zpool import -fa -R /tmp/mydata
# ls -l /tmp/mydata
～（ファイルの一覧）～
```
ひとまずこれでOK。

## ファイルの退避

ファイルが参照できるようになったので、次はファイルの退避。この状況でSamba共有してWindowsなりUbuntuなりからコピーしようとしたけど、LiveCDで起動している状況でportsやpkgのインストールができないようだったので(うまいことやる方法あったら教えてください)、外付けUSB HDD(FAT32)にコピーすることにした。
それでもとりあえずネットワーク接続。

```
ifconfig bge0 inet 192.168.1.50 subnet 255.255.255.0
route add default 192.168.1.1
```
それでこの後、/etc/resolv.conf に nameserver 192.168.1.1 を追加してネットワーク接続OK。

次に以下ページを参考にしてフォント b16.fnt をダウンロードして利用。
http://april.fool.jp/blogs/2014/11/freebsd-10-1-release%E3%81%AEvt4%E3%81%A7console%E3%82%92%E3%81%86%E3%81%A4%E3%81%8F%E3%81%97%E3%81%8F/

ただ、fetchでダウンロードしようとすると、Authentication Errorとなったため、別PCでダウンロードしてFTP経由で取得した。ダウンロードURLは
http://people.freebsd.org/~emaste/newcons/b16.fnt 
そのあと以下コマンド実行してコンソールで日本語表記可能となった。

```
# vidcontrol -f ./b16.fnt
```

次にFAT32のマウントは以下のコマンドで実行。手順は以下URLを参照した。
http://noichigo.moe.hm/freebsd/63.html

```
# mount -t msdosfs -o large,-L=ja_JP.UTF-8 /dev/da0s1 /mnt
```
-Lのオプション付けないと文字化けして、cpがInvalid Argumentになってコピー失敗となったので。
これでようやくファイルの退避が可能となった。

## まとめ
結局freebsd-update の何がいけなかったのか、わからないままだけどとりあえずデータは救えたのでよしとしよう。
ファイルの退避が終わったら、改めてFreeBSD 11をインストールして、ZFSでRAID組もうかな。ふー、長い闘いだった。
【Unity】ScriptがアタッチされているSceneやObjectを検索する

# 概要
Scriptがどのシーンにアタッチされているのか調べる方法。
SceneだけじゃなくEditor拡張をする事でGameObjectなども検索ができる。

## ScriptがアタッチされているSceneを検索する
Unityの標準機能として用意されているため使用する

* 調べたいScript上で右クリックする
* 右クリックメニューから`Find References In Scene`を選ぶ

## ScriptがアタッチされているGameObjectを検索する 
Unity標準機能にはなく、Githubにプラグインとして公開されているモノを使用する

* Githubにある[ReferenceViewer](https://github.com/anchan828/ReferenceViewer)から`git clone` OR `Download`する
* 上記で取得したリソースをAsset/Editorフォルダに入れる
* 調べたいScript上で右クリック -> `Find References In Project`をする
* 初回は検索用index作成？のため時間がかかる

## 追記: 有用なコメントをいただきました
インデックスの作成に時間がかかってしまう場合は、@unity_x_man さんのコメントを参考にしていただくと幸せになれるかもしれません
>使っていない不要スクリプトを削除したくて使ってみました。
中規模プロジェクトでインデックス作成に１時間ほどかかり、その後プロジェクトに変更があればインデックスを作り直さないと変更部分はヒットしないようです。
そんなに待ってられない！とか手っ取り早く済ませたい場合は調べたいリソースの.metaファイル内のguidでプロジェクト全体をgrepすれば使用している場所を調べることが出来ました。


## 参考
[テラシュールブログさまさま](http://tsubakit1.hateblo.jp/entry/2015/09/01/233000#%E3%81%A9%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%82%92%E6%8E%A2%E3%81%99)

以上
複合キーで重複チェック

例えば、月次の部門別の売上データがあった場合、「年月」と「部門コード」でユニーク管理したい場合があります
ただ残念ながらSalesforceには複合キーでユニーク管理する機能がありません。
（単一キーのユニーク化であれば、カスタムフィールとで設定できますが。。。）

なので多少めんどくさい手順を踏まなければなりません。

# 手順

## 1. ユニーク項目をテキストで作成

ここでは、カスタムフィールドを値の重複を許可しないユニーク項目として作成します。

API参照名：UniqueKey__c
項目ラベル：重複チェック用項目

## 2. プロセスビルダー設定

プロセスビルダーで先程作成した項目に自動でレコードのユニーク値が入るようにします。
例えば：

```
[MonthlyDepartment].[Month__c] & "_" && [MonthlyDepartment].[Department__c]
```

## 3. 動作確認

### 重複チェック用項目をレイアウトに表示した場合のエラー

<img width="360" alt="スクリーンショット 2018-10-15 18.52.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/56193/10b59b08-dfd3-686f-2a18-155b13f55186.png">

### 重複チェック用項目をレイアウトに表示しなかった場合のエラー

<img width="826" alt="スクリーンショット 2018-10-15 19.00.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/56193/c4e37948-3956-70c6-f1eb-f0b7f7321b98.png">



はい、これで基本的には終わりです。
【IntelliJ】Node.jsを書くときにrequireがwarningになるのを解消する

## 概要
たまにIntelliJを使ってNode.jsを書くときに`require`がwaringを吐いているのが気になっていた。
実行すると問題なく動作するので放置してたけど調べたら解消できるようなので手順を書く。

## 設定
`Preferences ->Languages & Frameworks -> Node.js and NPM`の`Coding Assistance`の箇所をEnableにする

## 参考
https://intellij-support.jetbrains.com/hc/en-us/community/posts/206324989-Unresolved-function-or-method-require-at-line-1
nuxtで環境（development/production）ごとに別の内容でファイルを配置したい

2018.10.4 nuxt-1.4

例えば、robots.txtだったり、DNS認証用ファイルだったり、pwaのmanifest.jsonだったり　apple-app-site-associationファイルだったり、faviconだったり、環境別に（ほぼ）静的ファイルを配置わけしたい場合。



## 1. 専用ライブラリを探して使う

robots.txtや、manifest.jsonの場合は、専用のライブラリがある
https://www.npmjs.com/package/nuxt-robots-module
https://github.com/nuxt-community/pwa-module


## 2. nuxt.config.jsのbuild設定に差し込む

buildのextendでwebpackの設定をカスタマイズできるので、copy-webpack-pluginでもcpxでもなんか使ってどうにかすればどうにかなりそうだけど、実際試してないので詳細不明。


## 3. 自力でmoduleでファイル書き出し対応する。

nuxtのwebpack設定ってあまりいじりたくなくて、結局とりあえずの処置としてこれで対応した。`nuxt dev`, `nuxt build`, `nuxt generate` で動いた。

例えばrobots.txtの場合

```js:/modules/robots-txt.js
const resolve = require('path').resolve
const fs = require('fs')

module.exports = function RobotsTxtModule(moduleOptions) {

  const isDev = this.options.dev
  const filename = 'robots.txt'
  const content = !isDev
    ? `User-agent: *
Allow: /`
    : `User-agent: *
Disallow: /`

  // generate 用にフックを追加する
  this.nuxt.hook('generate:done', async generator => {
    const path = resolve(this.options.generate.dir, filename)
    fs.writeFileSync(path, content)
  })

  // devまたはssr向け
  this.addServerMiddleware({
    path: filename,
    handler(req, res) {
      res.setHeader('Content-Type', 'text/plain');
      if (res.send) {
        res.send(content);
      } else {
        res.end(content, 'utf-8');
      }
    },
  })
}
```

```js:nuxt.config.js

module.exports = {
  // ... (略) ...
  modules: [
    ["~/modules/robots-txt"],
  ],
  // ... (略) ...
}
```
Laravel：ページネーション機能を追加


# 概要

ページの下の方にある
<< 1 2 3 >>
みたいなアレ

##- 動作確認環境

- PHP 7.1
- Laravel 5.7



# 使い方

##▼ View に埋め込む

###- 書き方

```diff:こんな感じ
{{ モデル名->links() }}
```

Viewの表示したい場所に埋め込む。


##▼ Controllerを直す

###- 基本の書き方

括弧内は1ページ中に表示する件数。
pageじゃなくてpagiなのが注意点。

```diff:基本の書き方
- $posts = Post::all();
+ $posts = Post::paginate(5);
```


#### 例)

```diff:app/Http/Controllers/UserController.php
    public function index()
    {
        //ユーザーを一覧表示
-       $users = User::all();
+       $users = User::paginate(5);
        return view('users.index')->with('users', $users);
    }
```


###- 両サイドの件数を指定する書き方

Laravel 5.7 でonEachSide() というメソッドが追加された。
デフォルトで3のところ、自由に設定できるように。

```
$posts = Post::paginate(10)->onEachSide(5);

// output
// .. 3 4 5 6 7 [8] 9 10 11 12 13 ...
```

参考： :link: readouble.com[ペジネーションリンク](https://readouble.com/laravel/5.7/ja/releases.html#laravel-5.7)
Githubサポートに問い合わせてみた。

#ありがとうステーシー
##gitからgithubへのプッシュがうまくできなかったので、聞いてみた。

1. git push -u origin master 
 - Warning: Permanently added the RSA host key for IP address '192.30.255.***' to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
 - 警告が出ました。
2. cd ~/.ssh
3. ssh-keygen -t rsa
 - 鍵を生成
4. pbcopy < ~/.ssh/id_rsa.pub
 - クリップボードに鍵をコピー
 - githubのsettingページSSH keysにコピペで貼付
5. ssh -T git@github.com
 - Hi abcde111! You've successfully authenticated, but GitHub does not provide shell access.
 - Githubのアカウント(ex.abcde111)と接続ができたようです。
 -
>1. git push -u origin master
 - もう一度git pushしてみる
 - fatal: not a git repository (or any of the parent directories): .git
 - githubにレポジトリが作成されていなかったので、fatalエラーが発生
 - github.comからpublic repository(ABCDE123)を作成して再挑戦。
 - 
># git push -u origin master
>fatal: remote error: 
   is not a valid repository name
  Email support@github.com for help
サポートへメールを送るようにメッセージが出現。
SSH接続が完了済みで、"git push"がうまく行かない旨を伝えると、打ったコマンドを送るよう依頼されたので、ログとして添付ファイルを送る。

返信が来ました。
>I believe the following command should update your remote url to use SSH:
`git remote set-url origin git@github.com:abcde111/ABCDE123.git`
何も起こらない。
`git push`
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

Githubのレポジトリにファイルが！！！9個アップロードされました。
> Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (9/9), 2.69 KiB | 1.35 MiB/s, done.
Total 9 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
remote: 
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/abcde111/ABCDE123/pull/new/master
remote: 
To github.com:abcde111/ABCDE123.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

めでたし。
ubuntu で ntfs 形式のファイルのパーミッションを変更する方法

先日、[ntfs 形式](https://ja.wikipedia.org/wiki/NT_File_System)にフォーマットした USB メモリ上のファイルを操作していた際、ファイルパーミッションの変更で躓いてしまいました。以下、備忘録としてまとめます。

#解決方法
ntfs 形式のデータ・パーティションをマウントするときに、次のコマンドを用いることでファイルパーミッションが変更可能になりました。

```bash
$ sudo mount -t ntfs-3g -o permissions <device> <directory>
or
$ sudo ntfs-3g -o permissions <device> <directory>
```
ただ、パーミッションの変更はこのコマンドでマウントしたときのみ反映されるようで、パーミッションを変更後に再度 `permissions` のオプションなしでマウントすると、全てのデータのパーミッションが `777` になった状態で開かれてしまうので注意が必要です。

#疑問点
Linux でファイルパーミッションを `700` に変更後、それを Windows で開くと、変更が ( 恐らく ) 反映されてはいるのですが、Windows のユーザーでファイルに変更を加えることが可能でした。どういうことやら。
ts-nodeをWebStormでデバッグ実行

[ts-node](https://github.com/TypeStrong/ts-node) は TypeScript ファイルをコンパイルせずにそのまま実行できるライブラリ。開発環境でお世話になるが、デバッグ実行するやり方の日本語情報がなかったので書いておく。

## 基本的なこと

node コマンドのオプションとして `--inspect` をつければデバッグ実行になる。そして `--require` をつけることで node_modules 内のライブラリを読み込ませることができる。

```sh
$ node --inspect --require ts-node/register src/main.ts

Debugger listening on ws://127.0.0.1:9229/690c42e8-c2d4-407a-b768-6c5270241775
For help, see: https://nodejs.org/en/docs/inspector
```

これだけで WebSocket の `ws://127.0.0.1:9229` でデバッグの待ち受け状態になる。あとは IDE からアタッチすることでデバッギングできるという仕組み。

## ts-node のインストール

```bash
$ npm install ts-node -D
```

or

```bash
$ yarn add ts-node -D
```

## WebStorm でのやり方

## 実行

`--inspect --require ts-node/register` して実行する ts ファイルを指定するだけ。
![Run](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jnst/20180910/20180910162556.png)

## Jest でテスト

~~`--inspect --require ts-node/register` して実行するテストファイルを指定するだけ。~~

[追記] WebStorm `2018.3.1` から (?) `--inspect` を指定するとデバッグ実行できなくなったので `--require ts-node/register` だけを指定し実行するテストファイルを指定する。


![Test](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jnst/20180910/20180910162618.png)


## 結果

![Result](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jnst/20180910/20180910163534.png)
minikube再インストール

## minikubeの再インストール

minikubeはバージョンはkubectlと一緒に使うことがあり
kubectlとminikubeのバージョンがあっていないと正しく起動しないことがある

そのためにminikube のバージョンアップ方法を記載した。

### 環境
MAC 
macOS Mojave


### minikube アップデート 手順
① brew　のアップデート

```
brew update
```


② 既にキャスクがインストールされていることを確認してください

```
brew cask install macdown --verbose
```

③ 最後に、以前にminiikubeをインストールしたのと同じディレクトリ
   （通常は /usr/local/bin ）に次のコマンドを実行します。

```
brew cask reinstall minikube
```



次のような出力が表示された場合：

Error: It seems there is already a Binary at '/usr/local/bin/minikube'; not linking.


④ 既存のバイナリを削除する

```
rm /usr/local/bin/minikube
```

もしエラーが出た場合は
④を実行した後、①〜③を再度実行してください。
障害対応用に作ったslashコマンドが結構役に立ったという話

# 目的

仕事帰りの電車の中とか、このタイミングでかよ！ってときにslackとかから障害の通知着たりしますよね :sob: :sob: :sob: 
じゃあ、まずは状況の確認を使用という場合に家とかPC＋ネットワークが繋がる環境があればまあ良いんですが、そうでもないときもあるわけです。。。

で、今回の記事はWebサービスの動作確認を出先でも手軽にやりたいというところがモチベーションとなってます。Webサービスなんでスマホでも本番環境の動作確認はできるんですが、面倒ではあるので、最低限の動作確認をサクッと行うというのが目的です。

あ、前提としてこういうのがあります。

* WebアプリケーションはAWSで動いている
* Webアプリケーションが使うAPIは会社のデータセンターのAPIサーバにある

当時はAWS <=> DC間のネットワークがいまいち安定していない時期だった（今は安定してますよ :sunglasses: ）というのもあり、アプリケーションのバグではなくてネットワーク的な問題によるエラーが発生しがちだったという背景があります。

そのため、ネットワーク系のエラーが一時的なものだったのか、それとも長く続きそうなのかを判断するためにも動作確認を手軽にできると嬉しいというのがありました。

# どの機能を確認・テストするか

管理してる機能はいくつかありましたが、ユーザー・事業的に一番重要な機能とメール送信を行う機能の2機能を対象としました。 この2機能をやっておけば確認したい部分はすべて確認できるというのもありました。

# slashコマンドの概要

サクッとお手軽にとなるとやっぱりslackのslashコマンドじゃないでしょうか？ということで作ったのが以下の図のような仕組みです。

![smoketest.png](https://qiita-image-store.s3.amazonaws.com/0/22325/267edb30-d2ed-305a-e7ef-fc74a9dd53b1.png)

## 処理の流れ

流れはこのようになってます。

1. slashコマンドでsmoke testのコマンドを実行
2. slashコマンドのリクエストURLはAWSのAPI Gatewayに設定しているのでそちらにリクエストが届く
3. API GatewayからLambdaにリクエストが届く
4. Lambdaがテスト実行
5. メールを使用しない機能の場合は結果をslackに通知して終了、メールを使用する機能の場合はWebサービス上での実行結果を成否を通知
6. メールを使用する機能の場合はテストアカウント用のGmailにメールが届く
7. GmailとIFTTTで連携させてる
8. IFTTT連携でslackにメールの内容が届く

サービスが落ちてるとか、機能が使えないような場合は5の段階でエラーがslackに通知されて、メールがとどかないような場合はいつまで経ってもslackにメールの通知がこない感じです。

## 実装

処理はLambdaで行ってます。言語はnodejsです。対象となるのはWebサービスですが、別にSelenium等のE2Eテストみたいに画面上の操作はする必要は無かったのでベタにhttpsのリクエストをGET/POSTする形で作ってます。
htmlはパースしたかったのでcheerioを使ってます。

実装上の工夫は特に無いですね。。。普通にリクエストを投げてそのレスポンスを見て、その結果をslack通知してるだけです。強いて言えばUI的な確認はざっくりと捨てて、機能面に絞ったところですね。

APIの実行に関しては制限を掛けてますがそれもslackのトークンを見てるくらいですね。デプロイ処理もslashコマンドにしていてそっちは他にも制限を掛けてますけど。

# 使用してみて

実際便利でしたね。slackで障害の通知が着てチームメンバーとのやり取りもslackで行われるので、動作確認がslackからできるから障害対応が1アプリで完結できるのと、実施結果が当然共有されるからみんなが結果を見れますし。

あと、手軽なので本番環境へのデプロイ後の動作確認にも使ってたりします。アプリケーションのデプロイはBlue/Greenデプロイをしてます。アプリケーションは待機系にデプロイしたときに動作確認しているので、ここではB/G切り替後の簡単な動作確認として使ってます。

Do Sorryの精神で必要だからサクッと作った感じなんですが、結構役に立ってますね :congratulations: 

# ちなみに

これ以外にも結構slackは使ってます。障害対応用チェックリストもslashコマンドで取得したり、（いまいち安定しなかったんだけど） Kibanaのグラフのスクリーンショットを撮ったりとslackを多用したりしてました。

もともと開発メンバーが東京と金沢に分かれていてslackによるコミュニケーションが重要だったのでslackを多用する形になったのも自然の流れだったかもしれませんね :thinking:
Node.js で TypeScript + TSLint を使う最小構成


Node.js で TypeScript + TSLint を使う最小構成。

# 環境

- typescript: 3.1.1
- tslint: 5.11.0

# TypeScript

## Install

`typescript` と `@types/node` をインストールする。

```sh
npm i -D typescript
npm i @types/node
```

## tsconfig.json

ルートディレクトリに `tsconfig.json` を作成し、次のように記述する。

```js
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2017",
    "sourceMap": true,
    "outDir": "dist",
    "types": [ "node" ]
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules"
  ]
}
```

これで、`src` ディレクトリ以下にある `ts` ファイルをコンパイルし、生成した `js` ファイルを `dist` ディレクトリ以下に出力する。
`src` ディレクトリ以下のディレクトリ構成は `dist` ディレクトリでも保持される。

## package.json

`package.json` を編集し、次のスクリプトを追加する。

```js
{
  "scripts": {
    "start": "node dist/app.js",
    "build": "tsc",
    "watch": "tsc --watch"
  },
}
```

# TSLint

## Install

`tslint` をインストールする。

```sh
npm i -D tslint
```

## tslint.json

ルートディレクトリに `tslint.json` を作成し、次のように記述する。
ルールはお好みで。

```js
{
  "defaultSeverity": "warning",
  "extends": [
    "tslint:recommended"
  ],
  "rules": {
    "quotemark": [true, "single"],
    "indent": [true, "space", 2],
    "interface-name": false,
    "ordered-imports": false,
    "object-literal-sort-keys": false,
    "no-consecutive-blank-lines": false,
    "no-console": false
  }
}
```

## package.json

`package.json` を編集し、次のスクリプトを追加する。

```js
{
  "scripts": {
    "lint": "tslint 'src/**/*.ts'"
  },
}
```