OmniAICreator/Qiita-1.07M huggingface dataset:
脆弱性スキャンツール vuls 〜cron定周期スキャン編〜

##vuls稼働、リモートサーバのスキャンまで
vuls稼働、リモートサーバのスキャンまでは下記記事を参照ください。
[脆弱性スキャンツール vuls 〜リモートサーバスキャン編〜](https://qiita.com/kenji-toforone/items/79d8716878695cffa02e)

vulsをvulsuserなどのユーザで稼働させている場合、cronで定周期スキャンさせるには一手間必要になる。
`config.toml` が `/home/vulsuser` にあるのでどこからでも起動できるようにする。

##vuls稼働サーバでの作業
###cve更新、vuls起動シェルの設定
```console
# sudo su -
# mkdir /usr/bin/vuls2slack
```
```sh:/etc/profile.d/vuls.sh
function vuls() {
    case $1 in
      "scan")
        /home/vulsuser/go/bin/vuls $@ --config=/home/vulsuser/config.toml;;
      "configtest")
        /home/vulsuser/go/bin/vuls $@ --config=/home/vulsuser/config.toml;;
      "report")
        /home/vulsuser/go/bin/vuls $@ --config=/home/vulsuser/config.toml -cvedb-path=/home/vulsuser/cve.sqlite3 -ovaldb-path=/home/vulsuser/oval.sqlite3;;
      *)
        ;;
    esac
}

alias vuls=vuls
```
```sh:/usr/bin/vuls2slack/shell
#!/bin/bash
pushd /home/vulsuser
. /etc/profile.d/vuls.sh
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/go/bin:/usr/local/go/bin
export PATH
go get -u github.com/kotakanbe/go-cve-dictionary
go get -u github.com/future-architect/vuls
go-cve-dictionary fetchjvn -last2y
go-cve-dictionary fetchnvd -last2y
vuls scan --deep
vuls report --lang=ja -to-slack
```
```console
# chmod +x /etc/profile.d/vuls.sh
# chmod +x /usr/bin/vuls2slack/shell
```

###cve更新、vuls起動シェル動作確認

```console
# su - vulsuser
$ /usr/bin/vuls2slack/shell
$ exit
```

###cron設定

```sh:/etc/cron.d/vuls2slack
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
0 2 * * * vulsuser /usr/bin/vuls2slack/shell > /home/vulsuser/vuls2slack.log 2>&1
```
```console
# systemctl restart crond
```

起動時間にSlack通知が来ていればOK（脆弱性が無い場合は来ないのでログを確認する　`/home/vulsuser/vuls2slack.log`）

###Slackに通知が来ていない場合
・cronのログを見る `/var/log/cron`
・vulsシェルのログを見る `/home/vulsuser/vuls2slack.log`
よく使うショートカットキーまとめ（初心者）

個人的に調べた内容を自分のメモとして書き残します。

---

随時更新します
2018/05/31（木）-1

---


個人的に使用頻度が高そうなショートカットのみを記載します

本記事は windows OS を対象にしています
※ Mac OS には対応していないものがあります


〇 android studio

■ 全般

- Ctrl + S<br>
すべて保存
- Ctrl + Alt +S<br>
設定を開く

■ ビルド、デバッグ

- Ctrl + F9<br>
ビルド
- Shift + F10<br>
ビルドして実行
- Shift + F9<br>
デバッグ
- F9<br>
プログラムを再開


〇 VitualStudio

■ コーディング

- Ctrl + K , Ctrl + C<br>
コメントアウト
- Ctrl + K , Ctrl + U<br>
コメントアウト解除
- Ctrl + K , Ctrl + F<br>
インデントの整形（選択した部分のインデントを綺麗にしてくれる）
- Ctrl + → or Ctrl + ←<br>
単語単位でカーソル移動

■ ビルド、デバッグ

- Ctrl + Shift + B or F7<br>
ソリューションのビルド
- F5<br>
デバッグ
- Shift + F5<br>
デバッグの中止
- F9<br>
ブレイクポイントの設定、削除


---

最後までお読みいただきありがとうございました。
JUnitの勉強メモ

Junitを使ったことがないので、勉強したメモ。
Eclipse環境で学習しています。
バージョン：Oxygen.3a Release (4.7.3a)

# JUnit
Eclipseで、Junit3, Junit4, Junit Jupiterの３つが選べた。
JUnit5は、JUnit Jupiterのことらしい。

# 作ってみる
## 参考にさせていただいたLink
[テスト(Unitテスト)関連](http://www.develop-memo.com/etc/operation.html)
 基本的な作り方が参考になりました。
[ひしだま's ホームページ](http://www.ne.jp/asahi/hishidama/home/index.html)
→[JUnit5 テストの記述](http://www.ne.jp/asahi/hishidama/home/tech/java/junit/5/assertion.html)
　Junit5について、参考になりました。

# メモ

- Junit5を使用
- テスト対象プロジェクト（テスト対象のソースファイル）と、テストプロジェクト（テストコードが書かれたソースファイル。今回の目的）を２つ用意（分けなくても作れる）
- テスト対象プロジェクトのパスを、テストプロジェクトに通しておく
- テスト対象プロジェクトに、Junitのjarはいらない。
- テストプロジェクトには、JunitのJarを通しておく。
- テストコードを作るときは、テストしたいソースファイルを選択して、
右クリック→新規→そのた→JunitのJunit・テストケースを選択


## OK,NGが混在すると、１つでもNGがあれば、結果NGになる？？？
そんな気もしたような。。。

```java

package pkg;

import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class EvalTest {

    @Test
    void testIsOdd() {
        //fail("まだ実装されていません");
        Eval eval = new Eval();
        //7(奇数）を引数で戻り値がfalseであることをテスト（テストNGパターン）
        assertFalse(eval.isOdd(7));
        //100(偶数)を引数で戻り値がfalseであることをテスト（テストOKパターン）
        assertFalse(eval.isOdd(100));

    }

}

```

### EclipseでJunitを作ってしまうと、テスト対象クラスに後から作ったメソッドのテストメソッドって自動では作れないのかな。。

# @DisplayName("表示したい文字列")
実行結果の表示で、実行したテストメソッド名出るところが、このアノテーション（？）を指定しておくと、置き換わる。

```java

package pkg;

public class checkClass {

    String isNull(String s) {

        String result = null;

        if(s != null) {
            result = "notNull";
        }
        return result;

    }
}

package pkg;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class checkClassTest {

    @Test
    void testIsNull() {
        //fail("まだ実装されていません");
        checkClass cc = new checkClass();

        assertNull(cc.isNull(null));
    }

    @Test
    @DisplayName("戻り値がNULLか、NULL以外か")
    void testIsNull2() {
        //fail("まだ実装されていません");
        checkClass cc = new checkClass();

        assertNotNull(cc.isNull("NOT NULL"));
    }
}

```
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

#cloudSQL サーバに接続できない！！（突如
proxyでcloudSQLへの接続をしようとするも永遠にできないという苦しみを味わった。
[これだと思っていた](https://qiita.com/hachiya/items/a496cd2ec4ac3be4ea84)
永遠に権限周りを確認していたが変なことは一つもない

しかし、違った。。。。
[cloudSQLに接続できないなぁ](https://qiita.com/munaita_/items/1fc4dd581fed7f4c625d)

#GCPの無料クレジットが切れただけだった。。。。ああああ
![スクリーンショット 2018-05-31 13.17.40.png](https://qiita-image-store.s3.amazonaws.com/0/48025/1760a49f-55e7-dfe1-7eb2-1bf37d2b0ed9.png)

#以上です（泣）アホすぎる
TypeScript初心者が知っておくと嬉しいこと

# TypeScript初心者が知っておくと嬉しいこと
## 記事の概要
TypeScriptを学ぶ前に知っているともっとスムーズに理解できたな〜と思ったことを中心にまとめました。
## TypeScriptって何？

TypeScriptのコードはコンパイルするとJavaScriptになります。
TypeScriptはJavaScriptとは全く違う言語というわけではありません。
TypeScriptはJavaScriptの構文なので普通のJavaScriptと共存することができます。
静的型付け言語です。

##コンストラクタ
TypeScriptはコンストラクタを設定することができます。
コンストラクタは簡単に言うとインスタンスを作成したタイミングで実行されるメソッドのことです。
もう少し具体的に言うとクラスをnewした瞬間に実行される関数のことです。
コンストラクタの詳しい説明は下記のサイトを参考にするとわかりやすいと思います。
[コンストラクタの詳しい説明](http://wa3.i-3-i.info/word13646.html)
実際のコードはこんな感じです。

```typescript:constructor.ts
class User {
    name: string;
    //インスタンス化するとこのcounstructor()が実行されてthis.nameにTaroが入る。
    constructor(name: string){
        this.name = name;
    }
}

var taro = new User("Taro");
console.log(taro.name); //Taroが出力される。
```

ちなみにコンストラクタの書き方が少し違うのですが、
このconstructor2.tsは上のconstructor.tsと同じ意味になります。


```typescript:constructor2.ts
class User {
    constructor(public name: string) {
    }
}

var taro = new User("Taro");
console.log(taro.name); //Taroが出力される。
```

##private
コンストラクターの引数にprivate修飾子をつけるとクラス内からは呼ぶことができますが、他のクラスもしくはインスタンスから呼ぶことができなくなります。
private修飾子の変数の名前はわかりやすいようにアンダーバーをつけます。(例 _name)
先ほど紹介したコンストラクタの書き方をふまえてprivateを使ってみます。
具体的なコードはこんな感じです。

```typescript:constructor.ts
class User {
    constructor(private _name: string) {
    }
}

var taro = new User("Taro");
console.log(taro._name); //「_nameはprivateが付いているからclassの中でしか使えないよ」とエラーが出る。
```

##ゲッターとセッター
「コンストラクタの引数にprivateつけてもclassの外から触りたい！」
「値の設定とか値の取り出しくらいはさせてよー」
というときに使うのがゲッターとセッターです。
TypeScriptはゲッターとセッターを設定することができます。
ゲッターとセッターに関する詳しい説明は下記のサイトを参考にするとわかりやすいと思います。
[ゲッターとセッターの詳しい説明](http://wa3.i-3-i.info/word15855.html)
先ほどのconstructor.tsに続いて書いて行きます。

```typescript:constructor.ts
class User {
    constructor(private _name: string) {
    }
    
    //ゲッター
    //ゲッターは値を排出します。
    get name() {
        return this._name;
    }

    //セッター
    set name(value: string) {
        this._name = value;
    }
}

var taro = new User("Taro");
console.log(taro.name); //Taroが出力される。
taro.name = "yamada"; //セッターを使ってyamadaを代入。
console.log(taro.name); //yamadaが出力される。
```
##インターフェイス
インターフェイスとは簡単に言うとオブジェクトに名前をつける機能です。

下のコードの例ではResultというインターフェイスを作っています。
するとResult型ができます。Result型はaとbを持っていないとダメということになります。
aとbどちらか一方でも持っていないとエラーが出ます。

具体的なコードはこんな感じです。

```typescript:interface.ts
//インターフェイスを定義
interface Result {
    a: number;
    b: number;
}

//sum(result: Result)と書くことで引数resultは必ずaとb持たなければならない。
function sum(result: Result) {
    return result.a + result.b;
}

var result = {
    a: 30,
    b: 20
};

console.log(sum(result)); //50が出力される。
```

この

```typescript
function sum(result: Result){...}
```

はResult型のresultという引数だよという意味です。
DateTimeオブジェクトで正確に次月を求める

phpで以下のようにDateTimeを使って年月一覧を出力するみたいなことしてたんですが

```php
<ul>
<?php for ($i = 0, $date = new DateTime(); $i < 12; $i++, $date->add(new DateInterval('P1M'))): ?>
<li><?php echo $date->format('Y/m') ?></li>
<?php endfor; ?>
</ul>
```

これだと、本日5月31日のような日は、31日分追加されて6月越して7月になってしまいましたん。

```php
$date = new DateTime();
echo $date->format('Y/m/d'); // 2018/05/31
$date->add(new DateInterval('P1M'));
echo $date->format('Y/m/d'); // 2018/07/01
```

modify使うと、正確に次月に得られました

```php
$date = new DateTime();
echo $date->format('Y/m/d'); // 2018/05/31
$date->modify('first day of next month');
echo $date->format('Y/m/d'); // 2018/06/01
```

こわいこわい

```php
<ul>
<?php for ($i = 0, $date = new DateTime(); $i < 12; $i++, $date->modify('first day of next month')): ?>
<li><?php echo $date->format('Y/m') ?></li>
<?php endfor; ?>
</ul>
```
DjangoでDBを消去して再migrationする(sqlite3)

modelsを再定義した時にmigrationをやり直したい時があると思います。
そのままmigrateしても良いのですが、DBを消去してもう一度やり直したい時の方法です。

まずappディレクトリのmigrationsを消します。

```
cd [アプリケーション]
rm -d -r migrations/
```

プロジェクトのディレクトリに戻って、dbを消します（sqlite3の場合）

```
cd [プロジェクト]
rm -d -r db.sqlite3
```

そしてmigration

```
python manage.py makemigrations app
python manage.py migrate
```

管理ユーザーも消えるので、必要な場合はもう一度作ります。

```
python manage.py createsuperuser
```

この一連の流れをシェルスクリプトにしたので
必要な方はコピペでどうぞw
app名は適宜変更して下さい。

```dbreset.sh
#!/bin/sh
cd app
rm -d -r migrations/
cd ..
rm -d -r db.sqlite3
python manage.py makemigrations app
python manage.py migrate
python manage.py createsuperuser
```

manage.pyがあるプロジェクトフォルダに置いておけばそのまま動きます。
コンソールから

```
bash dbreset.sh
```

でどうぞ！
NPOI　VB.NET メモ










####**宣言**
```vb
Imports System.IO
Imports NPOI.SS.UserModel
Imports NPOI.XSSF.UserModel
'ブックの設定
Dim xWorkbook As IWorkbook = New XSSFWorkbook(path)

'シートの設定
Dim xSheet As ISheet = xWorkbook.CreateSheet
'列名設定
Dim xRow As IRow
'セル設定
Dim xCell As ICell

'セル番号を指定（0,x) 行
xRow = xSheet.CreateRow(0)

'セル番号を指定（x,0)　列
xCell = xRow.CreateCell(0)
xCell.SetCellValue("表示したいデータ") '表示する値指定
xCell = xRow.CreateCell(1)
xCell.SetCellValue("表示したいデータ") '表示する値指定
xCell = xRow.CreateCell(2)
xCell.SetCellValue("表示したいデータ") '表示する値指定


'UBoundで配列の最大インデックスを終了値に指定。
'UBound 配列内の指定された次元における最も大きいインデックスを返します。
For i As Integer = 0 To UBound(array)Step 1
'フラグでデータ管理　なければ終了
 If array.Flg = "" Then Exit For 

'セル番号を指定（0,x) 行
  xRow = xSheet.CreateRow(i)

'セル番号を指定（x,0)　列
    xCell = xrow.CreateCell(0) 
    xCell.SetCellValue(i1_Table(i - 1).arrayname0)
    xCell = xrow.CreateCell(1) 
    xCell.SetCellValue(i1_Table(i - 1).arrayname1)
    xCell = xrow.CreateCell(2)
    xCell.SetCellValue(i1_Table(i - 1).arrayname2)
    xCell = xrow.CreateCell(3)
    xCell.SetCellValue(i1_Table(i - 1).arrayname3)
Next
End If

'ここでSetCellValueで設定したデータを表示することが出来る。
Dim wFileStream As FileStream 
'FileModeに関しては調べてください。
wFileStream = New FileStream("path", FileMode,OpenOrCFCreate.FileAccess.Write)
'最終表示
xWorkbook.Write(wFileStream)

'宣言と逆にして開放する。
     xCell = Nothing
     xrow = Nothing
     xSheet = Nothing
     xWorkbook = Nothing
WordpressのACFにて。field_nameからfield_keyを取得する方法

やることはタイトル通り。
[公式のフォーラム](https://support.advancedcustomfields.com/forums/topic/get-field-key-by-field-name/)でも5年ほど更新されるような議題となっているくらいには、需要がある気がしたので、記事にしてみました。

やり方は、下のコードをfunctions.phpに追記するだけ。
もちろんながら、ACF入ってないと、意味がないので注意！

```php:functions.php
/*
 * ACFのフィールドネームからフィールドキー取得
 * 取得できないときには、falseを返す
 * 
 * @param string $field_name
 * @return string|bool
 */
function get_acf_field_key_by_name($field_name){
  //ACFのフィールドをすべて取得
  $args = array(
    'post_type'      => 'acf',
    'post_status'    => 'publish',
    'posts_per_page' => -1,
  );
  $the_query = new WP_Query($args);
  $acf_fields = $the_query->posts;
  wp_reset_postdata();

  //取得したフィールドのIDをもとに、フィールドキーとフィールドネームが保存されているメタ情報を取得する
  global $wpdb;
  foreach($acf_fields as $field){
    $meta_data = $wpdb->get_results(
      $wpdb->prepare("
      SELECT meta_key,meta_value
      FROM $wpdb->postmeta
      WHERE post_id = %d
        AND meta_key LIKE %s
      ", (int)$field->ID, 'field_%')
    );
    foreach($meta_data as $key => $value){
      if(unserialize($value->meta_value)['name'] === $field_name) return $value->meta_key;
    }
  }
  return false;
}
```
List#toArray の 引数って size と0 どっちがはやいの？

## まず結論

* toArray(new T[0]) の方がはやいっす。

## 経緯

* list.toArray は size の方がパフォーマンスがいい！と覚えていた。
* ちょっとググると、内部実装を踏まえ、そのように書いてあるページばかりだ。

* しかし、VMのパフォーマンスも日々進化している。
* 2018/05/31 現在において、本当にそうなのだろうか。

### → 実験してみよう！

## 前提

* ランタイムのバージョンや実行環境によって、後述の限りではないので、鵜呑みにしないで下さい。
* 内部実装は見てません。

## 実験コード

```java

import java.util.ArrayList;
import java.util.List;

public class Test {

	public static void main(String[] args) {

		List<String> list = new ArrayList<>();
		for (int i = 0; i < 1000; i++) {
			list.add(Integer.toString(i));
		}

		int[] loopCounts = new int[] { 1000, 10000, 100000, 1000000, 10000000 };
		for (int loop : loopCounts) {
			long sum = 0;
			for (int j = 0; j < 10; j++) {
				long start = System.currentTimeMillis();

				String[] temp = null;
				for (int i = 0; i < loop; i++) {
					temp = list.toArray(new String[0]);
				}

				long stop = System.currentTimeMillis();
				sum += stop - start;
			}
			System.out.println("toArray(new String[0]) " + loop + "回の速度*10回の平均速度は " + sum / 10 + " ミリ秒です。");

			sum = 0;
			for (int j = 0; j < 10; j++) {
				long start = System.currentTimeMillis();

				String[] temp = null;
				for (int i = 0; i < loop; i++) {
					temp = list.toArray(new String[list.size()]);
				}

				long stop = System.currentTimeMillis();
				sum += stop - start;
			}
			System.out.println("toArray(new String[list.size()]) " + loop + "回の速度*10回の平均速度は " + sum / 10 + " ミリ秒です。");
		}
	}
}
```

## 結果

### 【1,000回】

toArray(new String[0]) 1000回の速度*10回の  
平均速度は 2 ミリ秒です。

toArray(new String[list.size()]) 1000回の速度*10回の  
平均速度は 2 ミリ秒です。

### 【10,000回】

toArray(new String[0]) 10000回の速度*10回の  
平均速度は 19 ミリ秒です。

toArray(new String[list.size()]) 10000回の速度*10回の  
平均速度は 25 ミリ秒です。

### 【100,000回】

toArray(new String[0]) 100000回の速度*10回の  
平均速度は 207 ミリ秒です。

toArray(new String[list.size()]) 100000回の速度*10回の  
平均速度は 288 ミリ秒です。

### 【1,000,000回】

toArray(new String[0]) 1000000回の速度*10回の  
平均速度は 1497 ミリ秒です。

toArray(new String[list.size()]) 1000000回の速度*10回の  
平均速度は 1562 ミリ秒です。

### 【10,000,000回】

toArray(new String[0]) 10000000回の速度*10回の  
平均速度は 12949 ミリ秒です。

toArray(new String[list.size()]) 10000000回の速度*10回の  
平均速度は 15622 ミリ秒です。

## 改めて結論

**toArray(new T[0]) の方がはやい！**

#### あとがき

ネットでググって出てきた記事に書いてあるから ってのはアカンなぁ（自戒）

#### 参考になりそうなURL

[外部リンク：Arrays of Wisdom of the Ancients](https://shipilev.net/blog/2016/arrays-wisdom-ancients/)
ReactNavigationのボタン連打で何度も遷移する問題

※最近のバージョン(v2)以上なら対策されている？

### 解決方法

keyをつける
https://reactnavigation.org/docs/en/navigation-prop.html#navigate-link-to-other-screens

keyをつけてもダメだった場合は下記のやり方で対応
https://github.com/react-navigation/react-navigation/issues/3839#issuecomment-377159605

```js
const MainNavigator = StackNavigator(
  {
    Hoge: { screen: Hoge },
    Foo: { screen: Foo }
  },
  {
    initialRouteName: 'Hoge',
  }
)

const defaultGetStateForAction = MainNavigator.router.getStateForAction
MainNavigator.router.getStateForAction = (action, state) => {
  if (action.type === NavigationActions.NAVIGATE) {
    const { routeName, params } = action
    const lastRoute = state.routes[state.routes.length - 1]

    if (routeName === lastRoute.routeName && params === lastRoute.params) {
      return { ...state }
    }
  }
  return defaultGetStateForAction(action, state)
}
```
React NavigationのStackNavigatorでB画面からA画面に戻った時にA画面を更新する

やりたいこと
----
画面Bで画面Aに関する処理をした後にgoBackで戻ると画面Aの内容は更新されない。
goBackで画面Aの内容を更新された状態で表示させたい。

やり方
------
1. this.setStateするハンドルを画面Aから画面Bに遷移する時にパラーメータとして渡す。
2. 画面Bで画面Aに関する処理をした時にそのハンドルを実行する。

参考ソース: https://github.com/react-navigation/react-navigation/issues/922#issuecomment-344752635
dockerでインストールのない生活

dockerでインストール済みの環境が手に入る昨今ですが、なかなかインストール作業から逃れられません。
好みのDockerfileがなかなかないというのもありますが、dockerコマンドが面倒くさいというのもあります。
というわけで、使い方もセットにしたスクリプトをつくりました。

https://github.com/hiraokusoy/dol

# こんなふうに実行できます

sphinxのビルドをするなら、こうです。
pythonもmakeもいりません。

```
dol sphinx make html
```

gatlingでシナリオを実行するなら、こうです。
javaもgatlingそのものもいりません。

```
dol gatling run
```

# そうはいっても最低限必要なもの

* dolのcloneとパス設定
* docker
* bash(Git for Windowsなど)
モジュールとミックスインについて簡単な備忘録

# モジュールとは

複数の処理を書く際に共通の処理をまとめておく時に使われるもの。
使い方としては、後に説明するミックスインの機能を使って、複数のクラスで定義する
共通の複数の処理をモジュールを定義しまとめることによって、いちいち処理を定義し、コードを
書かずとも呼び出すだけで良くなるというメリットや、コード量が少なくなり、見やすくなるなどの
メリットがある。

モジュールを定義するときは、下記のような書き方から始まる。

```
module SampleModule

end
```
このようにmodule モジュール名から始まり、classを定義する際や、メソッドを定義する際と同じよう
にendで終わる。

moduleの中には、上記のようにいつでも呼び出せたらいいような、処理をまとめておく。
これにより、コードも見やすくなり整理されていい感じである。

次に、処理を定義したmoduleの呼び出し方について見ていく。


##モジュール内で定義したメソッドを関数として呼び出す方法。
```
module SampleModule
def sum(a,b)
  a + b
end
 function_module:sum
end

puts SampleModule.sum(1,1) => 2
```
上記のようにfunction_moduleメソッドでモジュール内で定義したメソッドをシンボルで指定する事で
関数として呼び出す事ができる。

##module内で定義した定数を呼び出す方法
```
module SampleModule 
 CONST_NUM = 100
def sum(a,b)
 a + b
 end
end

puts SampleModule::CONST_NUM => 100
```
上記のようにモジュール名にコロンを二つで指定する事ができる。

## includeを使ったmodule定義したメソッドを呼び出す方法
```
module SampleModule 
 CONST_NUM = 100
 def const_num
  CONST_NUM
 end
end

include SampleModule

puts CONST_NUM
puts const_num
```
モジュールを定義後、includeメソッドを呼び出すことで、その下から、直接、
moduleで定義したメソッドや、定数を呼び出す事ができる。

##ミックスインについて
ミックスインとはクラスにモジュールを読み込ませることである。下記のsample codeで説明する。

```
module SampleModule
 def sum(a,b)
 a + b
 end
end

class Sample
 include SampleModule
 def call_sum(a,b)
  sum(a,b)
 end
end

sample = Sample.new
sample.sum(1,1) => 2
sample.call_sum(2,2) => 4
```
上記では、sumという複数のクラスで使うと仮定したメソッドを定義している。その定義した処理を
クラスにincludeメソッドで読み込むことによって、見やすく、手間を省く事ができている。
また、ModuleSampleで定義したメソッドもSampleクラスでincludeすることにより、
sampleクラスのオブジェクトをレシーバーに、関数として、sumメソッドを呼び出す事ができている。

他のクラスでまた、moduleで定義したメソッドを呼び出す場合は、同じようにincludeを使うと良い。

##まとめ
複数のクラスで使いそうなメソッドは、モジュールを定義し、まとめておき、いつでも呼び出せるようにしておく。
また、クラス定義ではなく、普通に何度も使いそうなメソッドも、module_function :メソッド名で定義する事でコードを書く手間が省けて良い。
Pythonでビット単位演算したいのに間違えてブール演算を使ったときに起こること

組み込み機器から送られてくるデータのパーサーを書いていて、各ビットを取り出すときにビット単位演算の二項演算子(&)とブール演算(and)を間違えて使ってハマってしまったので自戒を込めてここにメモしておきます。Windows10、Python3.6.5で確認しています。

# 間違いパターン1
2byte(16bit)の値のうち上位10bitの値が有効なのでそれを取り出す

```python
>>> input_val = 0xFF0F # 0b1111111100001111
>>> bit_mask =  0x3FF  # 0b0000001111111111
>>> input_val and bit_mask # 間違い！！
1023
>>> bin(input_val and bit_mask)
'0b1111111111'

>>> input_val & bit_mask # 正解
783
>>> bin(input_val & bit_mask)
'0b1100001111'
```
これは気づきやすい

# 間違いパターン2
1byte(8bit)の値のうち2bit目の値が欲しいので取り出す

```python
>>> input_val = 0b00000011
>>> bit_mask =  0b00000010

>>> input_val and bit_mask  # 処理として間違いだが値としては合ってしまっている
2
>>> bin(input_val and bit_mask)
'0b10'

>>> input_val & bit_mask  # 正解
2
>>> bin(input_val & bit_mask)
'0b10'
```
特に例2の場合は結果だけ見ていると気づきにくい

# 何が起きているのか
+ [ビット単位演算](https://docs.python.jp/3/library/stdtypes.html#bitwise-operations-on-integer-types)は整数にのみ意味がある処理となっていて、input_valとbit_maskの論理積が実行されます。これは期待している動作ですね。

+ ブール演算では[ドキュメント](https://docs.python.jp/3/reference/expressions.html#boolean-operations)に以下のように説明されています。
> 式 x and y は、まず x を評価します; x が偽なら x の値を返します; それ以外の場合には、 y の値を評価し、その結果を返します。

　　なので、andの後にあったbit_maskが評価されて返ってきていたということですね。

# 所感
+ ミスの修正は簡単なのですが、何が起きているか説明しようとするとちゃんとドキュメントを読まないと説明できなかったです。精進しないとですね。
+ みなさまも既存のコードでこのようなことをやってないか確認してはいかがでしょうか？(ちなみに私はやらかしてました)

こちらはブール演算について詳しく解説している記事です。参考にさせていただきました。
http://qiita.com/keisuke-nakata/items/e0598b2c13807f102469
UITableViewでセルを複数選択する

##UIを作成する
ストーリーボード上で作成し、UITableViewをViewControllerで参照できるようにします。
特に難しい操作でもないので、詳しい説明は省きます。

##UITableViewにDataSourceとDelegateを設定する
以下サンプルを確認していただけるとわかります。

###ソースコード
```swift

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    
    let data = ["test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","test11","test12","test13","test14","test15","test16","test17","test18","test19","test20","test21"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        initView()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
extension ViewController {
    private func initView() {
        tableView.delegate = self
        tableView.dataSource = self
        // 複数選択可にする
        tableView.allowsMultipleSelection = true
    }
}

extension ViewController:UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .checkmark
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at:indexPath)
        cell?.accessoryType = .none
    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        cell?.textLabel?.text = data[indexPath.row]
        cell?.selectionStyle = .none
        return cell!
    }
}
```

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/46743/cd6da0d0-2783-dbbf-e6ec-325e69e9f0d5.gif)

##TableViewあるある
UITableViewではセルを使い回すため、チェックマークをつけてTableViewをスクロールすると、チェックマークが予期せぬセルに表示されます。
状態としては、選択状態ではないにも関わらず、表示上チェックされた状態になります。
チェックはついていても、本来チェック状態ではないため、そのセルをタップしてもｄｅｓｅｌｅｃｔは呼ばれず、チェックマークは外れません。

これを防ぐためには、セルにデータを詰める際、実際の選択状態に合わせてチェックマークの表示・非表示を切り替えます。

```swift
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        cell?.textLabel?.text = data[indexPath.row]
        cell?.selectionStyle = .none
        // セルの状態を確認しチェック状態を反映する
        let selectedIndexPaths = tableView.indexPathsForSelectedRows
        if selectedIndexPaths != nil && (selectedIndexPaths?.contains(indexPath))! {
            cell?.accessoryType = .checkmark
        } else {
            cell?.accessoryType = .none
        }
        return cell!
    }
```
PleskでLet'sEncryptを使ってwww付きドメインの証明書を発行する

www付きドメインのみで運用したい場合

管理パネルのLet'sEncryptから発行しようとすると、
wwwなしのドメインでcertbotが実行されてしまいエラーになる。

ので、コマンド叩く

```
/usr/local/psa/var/modules/letsencrypt/venv/bin/certbot -d www.example.jp -m info@hogehoge.jp 
```

環境
OS: ‪CentOS Linux 7.5.1804 (Core)‬
製品: Plesk Onyx 17.0.17 Update #12
私的メモ bashの配列 @（アットマーク）と *（アスタリスク）の違い

#参照URL
http://takuya-1st.hatenablog.jp/entry/2016/12/27/053456
http://www.task-notes.com/entry/20150119/1421646435

#先に結論
こだわりがなければ、@を使う方が良い。

#違いメモ
(詳細は、参考URL)

##配列を " (ダブルクォート)で囲む場合に、@と*で違いが出る。forの場合。

```
arr=("1" "2" "3")

for i in "${arr[@]}"; do
  echo $i
done
--- 実行結果 ---
1
2
3
----------------

for i in "${arr[*]}"; do
  echo $i
done
--- 実行結果 ---
1 2 3
----------------

"${arr[@]}"と"${arr[*]}"で結果に違いがでる。
```

##配列を " (ダブルクォート)で囲む場合に、@と*で違いが出る。echoの場合。（IFSを利用できる。)

```
arr=("1" "2" "3")
IFS=-

echo "${arr[@]}"
--- 実行結果 ---
1 2 3
----------------

echo "${arr[*]}"
--- 実行結果 ---
1-2-3
----------------

IFSを利用して、結果を出すことができる。
```

#その他
##配列を " (ダブルクォート)で囲み、@を利用する場合。配列の要素にスペースが入っていても大丈夫。

```
arr=("1" "2 2" "3")

for i in "${arr[@]}"; do
  echo $i
done
--- 実行結果 ---
1
2 2
3
----------------

for i in ${arr[@]}; do
  echo $i
done
--- 実行結果 ---
1
2
2
3
----------------

"${arr[@]}"を使えば、"2 2"が、スペース区切りされない。
```
powershellでexcelから情報抜き取る

たくさんファイルがあって、特定のシート、列の表から値を抜き取りcsvにしたい場合に
思い立って作った処理です。

変数の定義箇所に疑問あるがとりあえず、備忘録として。。。（今後メンテすることないけど）

```
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

function getRowValuesFromExcel ($ExcelFileName) {
  $basePath = "\path\to\dir\"
  # open read only
  $book = $excel.Workbooks.Open($basePath + $ExcelFileName ,0 ,$true)
  $sheet = $book.WorkSheets.item("hoge_sheet")
  
  # 1~100行のB,C,D,E列の情報をカンマ区切りで出力
  $firstRowIdx = 1
  $MaxRowIdx = 100
  $RowIdx = $firstRowIdx
  while ($RowIdx -lt $MaxRowIdx )
  {
    # 書式など維持した状態で取得は Text, 値のみはValue()
    $B = $sheet.Range("B" + $RowIdx).Text
    $C = $sheet.Range("C" + $RowIdx).Value()
    $D = $sheet.Range("D" + $RowIdx).Value()
    $E = $sheet.Range("E" + $RowIdx).Value()

    Write-Output @"
$B,$C,$D,$E
"@
    $RowIdx++
  }
}

getRowValuesFromExcel("hoge1.xls")
getRowValuesFromExcel("hoge2.xls")
getRowValuesFromExcel("hoge3.xls")
```


return 0
Unity と Mac で開発する Oculus Go アプリ #7 macbook トラックパッドによるSceneビューの移動方法

Oculus & Unity 初心者が開発するまでのメモ


Unityにある [チュートリアル > はじめてのUnity](https://unity3d.com/jp/learn/tutorials/projects/hajiuni/creating-a-project?playlist=45986) に **Sceneビューの移動方法** とありますが、あくまでマウス主体の内容

## Sceneビューの拡大・縮小

|トラックパッド|マウス|
|---|---|
|指２本で上下にスライド|マウスホイール|
![Sceneビューの拡大・縮小.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/33505/4a815cab-5fd7-8751-c749-c26e3ab17ec1.gif)

## 視点を回転させる

|トラックパッド|マウス|
|---|---|
|option(alt)ボタンを押しながら、指1本でタッチパッドを押し込んだまま動かす|右クリックを押しながらドラッグ|
![視点を回転させる.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/33505/ae02bfbe-9148-471b-a7cc-09d8877fcf43.gif)


## Sceneビューの並行移動

|トラックパッド|マウス|
|---|---|
|指1本でトラックパッドを押し込んだまま動かす|真ん中クリックを押しながらドラッグ|
![Sceneビューの並行移動.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/33505/8aeabf74-4d1b-c45b-a063-e316f90fa38e.gif)


１つ１つ学んでいる
TypeScript Sampleをやってみるその７


## はじめに
その７でようやく「Hello world!」をやります。
ブラウザへ「Hello world!」を出力するだけのサンプルです。
TypeScriptから生成されるJavaScriptとの差を確認してみましょう。

## 前提
* [Visual Studio Code](https://code.visualstudio.com/download)がインストール済み
* [Node.js/npm](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)がインストール済み
* gitから[Sampleをダウンロードして](https://github.com/Microsoft/TypeScriptSamples/archive/master.zip)任意のディレクトリに解凍済み
* View In Browserがインストール済み(Market Placeより)
* OSはWindows7/10を想定

## サンプル greeter
Hello worldの文字列をブラウザ出力するサンプル。
greeter : 挨拶

## ファイル構成
|パス|ファイル名|説明|
|:--|:--|:--| 
|.|greeter.html|Hello world出力のhtml|
|.|greeter.js|greeter.tsのコンパイルにて作成されたJavaScriptファイル|
|.|greeter.js.map|greeter.tsのコンパイルにて作成されたmapファイル|
|.|greeter.ts|Hello woldを出力するTypeScriptファイル|
|.|README.md|このサンプルの説明と使用方法|
|.|tconfig.json|TypeScriptのコンパイルコンフィグファイル|

## クラス図・フローチャート
![TS_030.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/3045e68c-0bbb-8ae6-5628-3fc1f71877c9.jpeg)

## 実行
```
cd ./greeter
tsc --sourcemap greeter.ts
```
`greeter.html`をエディターで表示<kbd>Ctrl+F1</kbd> 

## 結果
![TS_031.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/1b483f05-d6a6-35fa-de28-adc1234d3011.jpeg)

## ポイント
### greeter.ts
![TS_032.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/ba107570-061c-8d1b-12ca-5352879ca619.jpeg)
#### ① Greeterクラス
constructorはクラスが実体化（オブジェクト作成）した時に自動で処理されます。
string型のパブリックな引数を受け取ります。
次にパブリックなgreet関数を定義します。
この関数では、constructorで受け取った引数をブラウザ出力文字列に編集して戻り値としています。
#### ② greeterオブジェクトの作成
Greeterクラスに"Hello world!"を引数としてgreeterオブジェクトを作成します。
#### ③ documentオブジェクトへ出力設定
documentoオブジェクトのメンバーbodyのプロパティinnerHTMLへgreeterオブジェクトのgreet関数の戻り値を設定します。
### greeter.js
![TS_033.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/b9c1b0a8-40e6-94d7-0be9-d10edfc9481b.jpeg)
#### ① Greeterクラス
/** @class **/でclassを定義します。greet関数をGreeter.prototypeとして定義します。
#### ②③ Greeterクラス/greeterオブジェクトの作成
TypeScriptと同じコーディングになります。

TypeScriptのclassのコーディングはJavaScriptより明らかにシンプルです。

## ノート
TypeScript入門のサンプル。
コーディングの注意点として、セミコロン`(;)`に気をつけましょう。
TypeScriptのclass定義の最後はセミコロン。
TypeScriptのclass定義内のメンバーの最後にセミコロン不要。

## まとめ
この業界（IT?)のお約束の初めての出力はいつのまにか[Hello world!](https://ja.wikipedia.org/wiki/Hello_world)になっています。
次世代の新しい言語を作られる方は、もっとパッションのある気の利いた文言をぜひ出力して欲しいです。

以上、おそまつ
Bash のbind -x を使わないのももったいないだろう！

# Bash のbind -x を使わないのももったいないだろう！

[iTerm2のHotkeyを使わないなんてもったいない！！](https://qiita.com/okamu_/items/a5086d2d5ba405f35acb)
で、iTerm2 のキーバイドが紹介されていますが、

Bashのキーバインドを変更している人も案外少なそうなので、紹介します。

使うのは、`bind -x`

> bind -x keyseq:shell-command
>
> keyseq が押されるたびに、 shell-command が実行されるようにします。 
> [Man page of BASH](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)

# bind -x を設定するメリット

**早い！**
コマンドを入力したり、historyから検索しなくても、１キーで処理を実行できます。

**標準のショートカットキーより便利！**
Bash標準のショートカットキーも上書きできます。

例えば、Ctrl-Rのコマンド履歴検索はだいぶ貧弱ですが、
これを fzf や peco を使った自作のに差し替えられます。

**カスタマイズ可能!**
`bind -x` は単にコマンドを実行するだけですから、コマンドは自分でスクリプトを書いたり、Bash以外の言語で書いたり、自由にカスタマイズできます。

**かっこいい?**
ペアプロで、後輩に自分のマシンを操作させているときに

```
「あれ？なんか、変な画面に切り替わっちゃいました」
「俺のBashは、バッククオートに fzf を割り当てているんだよ」
```

って言えると、先輩すごーい！と言ってもらえる・・・かも[^1]。

[^1]: なお「変態だ」とか「zshつかえよ」と言われる可能性もありますが、ご了承ください。

# 設定方法

`~/.bashrc` で `bind -x` を実行するだけでOK。

```bash
# ~/.bashrc

_find_and_edit() {
  # fzf でファイルを検索して Visual Studio Code で開く
  fzf | xargs code
}
bind -x '"`": _find_and_edit'    # バッククオート「`」 に割り当てる

_replace_by_history() {
  # fzf を使った、コマンド履歴検索
  local l
  l=$(HISTTIMEFORMAT='' history | sort -k1,1nr | sed -e 's/^[[:space:]]*[0-9]\+[[:space:]]*//' | uniq-everseen | fzf --query "$READLINE_LINE")
  READLINE_LINE="$l"
  READLINE_POINT=${#l}
}

bind -x '"\C-r": _replace_by_history' # Ctrl-R の履歴検索を上書きする
```

なお、バッククオート「\`」 は、キーボード端の押しやすい場所にある割に使用機会が少ない（コマンド置換は `$(...)` で代替可能）ので、オススメです。
Rubyで例外を発生させる

## 特定の値を代入できないグローバル変数に代入

`$~`に`nil`や`MatchData`のインスタンス以外を代入すると例外が発生します。

```console
$ ruby -e '$~=1'
Traceback (most recent call last):
-e:1:in `<main>': wrong argument type Integer (expected MatchData) (TypeError)
```

## おこられるリテラルを書く

```console
$ ruby -e 'def Range.new(*); end; nil..false'
Traceback (most recent call last):
-e:1:in `<main>': bad value for range (ArgumentError)
```

例えば`Range.new(nil, false)`を実行すると同じように例外が発生しますが、`new`を上書きされてしまうと例外が発生しません。

```rb
def Range.new(*); end
Range.new(nil, false)
# => nil
```

リテラルで書くと`Range.new`を再定義していてもCの`Range.new`相当のC関数が直接呼ばれるため必ず例外を発生できます。

## 無限に再帰

```rb
def raise(_=raise)
end
raise
```

```console
$ ruby -e 'def raise(_=raise); end; raise'
Traceback (most recent call last):
        11913: from -e:1:in `<main>'
        11912: from -e:1:in `raise'
        11911: from -e:1:in `raise'
        11910: from -e:1:in `raise'
        11909: from -e:1:in `raise'
        11908: from -e:1:in `raise'
        11907: from -e:1:in `raise'
        11906: from -e:1:in `raise'
         ... 11901 levels...
            4: from -e:1:in `raise'
            3: from -e:1:in `raise'
            2: from -e:1:in `raise'
            1: from -e:1:in `raise'
-e:1:in `raise': stack level too deep (SystemStackError)
```

こう定義するとTracePointのcallイベントが発生するため再帰呼出しをする前に`return`されてしまう可能性があります。

```rb
def raise
  raise
end
TracePoint.trace(:call) {|tp| tp.binding.eval("return nil") }
raise
```

引数で再帰すると大丈夫です。

## メソッドの外でsuper

```console
$ ruby -e 'super'
Traceback (most recent call last):
-e:1:in `<main>': super called outside of method (NoMethodError)
```

## :x: raise

`raise`はメソッドなので上書きされる可能性があります。

```rb
method(:raise)
# => #<Method: main.raise>
```

```rb
def raise; end
raise
# => nil
```

## :x: catchせずにthrow

`throw`はメソッドなので上書きされる可能性があります。

```rb
method(:throw)
=> #<Method: main.throw>
```

```rb
def throw(*); end
throw :hi
```

## :x: 存在しないローカル変数やメソッドを呼び出す

`method_missing`で回避されてしまう可能性があります。

```rb
class Object
  def method_missing(*)
    true
  end

  def respond_to_missing(*)
    true
  end
end

foo
```

## :x: 未定義のクラス変数を参照

未定義かどうか調べる方法がなさそう

```console
$ ruby -e '@@foo'
-e:1: warning: class variable access from toplevel
Traceback (most recent call last):
-e:1:in `<main>': uninitialized class variable @@foo in Object (NameError)
```

## :x: 未定義の定数を参照

未定義かどうか調べる方法がなさそう

```console
$ ruby -e 'Foo'
Traceback (most recent call last):
-e:1:in `<main>': uninitialized constant Foo (NameError)
```
[webpack] [jest] Mac で動作するのに CI 環境だけ テストや ビルドが通らない

jenkins で jest を通そうとしたら、下記のようなエラーが発生。

```
  ● Test suite failed to run

    Configuration error:
    
    Could not locate module Core/api/server/BaseApi (mapped as /home/jenkins/workspace/bsr4b/BsrLib/src/js/core//api/server/BaseApi)
     "resolver": undefined
```

webpack のビルドも通らない。

### 原因

jest, webpack, babel の問題かと色々調べたのですが、原因はとても初歩的でファイル名の大文字小文字違いでした。

### Unix のような　Mac　OS X で　動作するのになぜ? 

Mac は大文字、小文字をちゃんと区別してくれる　OS だと思い込んでいたのでめっちゃくちゃハマりました。

[Mac OSX の 拡張の大文字/小文字区別はEl Capitanだと使えない（Sierraも同様）](https://qiita.com/usk81/items/c96e95447fd5122cc42e)

いつもまにか大文字小文字を区別しない　OS になってました。

この勘違いがものすごい苦戦の原因になりました。

### 対策

何かしら対策のできるライブラリがないか検討したところ、下記のプラグインを webpack に追加することにしました。

[case-sensitive-paths-webpack-plugin](https://www.npmjs.com/package/case-sensitive-paths-webpack-plugin)

大文字小文字がおかしいと 下記のようなエラーをはいてくれました。

```
ERROR in ./src/js/basic/Viewer.js
Module not found: Error: [CaseSensitivePathsPlugin] `/Users/kaoki/webapp/BSR4B_hybrid/src/js/basic/api/BasicAPI.js` does not match the corresponding path on disk `BasicApi.js`.
```

大文字小文字を区別って　英語で　CaseSensitive　Paths　っていうのだと学びました。
is it microsoft windows server security issue??? resolved!

​![2018-05-31 11_22_27-Book14 - Excel.jpg](https://qiita-image-store.s3.amazonaws.com/0/117479/717a9c47-bed1-838a-b49e-85eaf19d054f.jpeg)

Good Morning!

I hope you are doing well.

But there is something not going well. I am talking about the security issue of Microsoft Windows Server and other products.

One week ago, I was encountered with login issue on windows server 2012R2. I can not able to access my server2012R2. I am using a windows-10 machine with a ​mstsc command(remote desktop app) to connect with the windows server.
![web-500x400.png](https://qiita-image-store.s3.amazonaws.com/0/117479/82409e08-c98e-8872-da7d-e6461b693169.png)

But I got a solution. Below are the solutions.
**##First Solution:**
I can not able to log-in by using a windows machine. sad!!!!
But I can log in with other OS, such as Macbook.
![austin.jpg](https://qiita-image-store.s3.amazonaws.com/0/117479/c2a845d8-c45d-b059-29dc-f6043f76af81.jpeg)

Yes, I can log in by using my mac. really???
![neutral-s009-512.png](https://qiita-image-store.s3.amazonaws.com/0/117479/432655ff-2f20-3c75-cf3c-0c50f83da0ea.png)

it works. I can log-in on windows server by using MacBook. oh, my god!
Application name: Microsoft Remote Desktop

Is it really a security enhancement by Microsoft?
Because I can log-in by other OS(MacBook) but I can not login by Microsoft Windows(10, 7).
lol![laughing_and_pointing_emoticon_312207.jpg](https://qiita-image-store.s3.amazonaws.com/0/117479/42ee857f-5f86-1789-c97c-a4b7678c8a64.jpeg)


**##Second Solution:**

**2.1** If you disabled your windows server update, then go through the below step.
Microsoft released a solution.:thumbsup:

To download the solution, please check the below link.
https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2018-0886

**Step 1.**
In the above link, you can see the list of Affected Products and search your product.
in my case, it is Windows Server 2012 R2.

![2018-05-31 10_07_54-CVE-2018-0886 _ CredSSP Remote Code Execution Vulnerability.jpg](https://qiita-image-store.s3.amazonaws.com/0/117479/e683d9de-ea4a-0048-5689-b7bcc7286029.jpeg)

**Step 2.**
Download the security patch.
![2018-05-31 10_08_56-③店舗客注指示引当処理.xlsx - Excel.jpg](https://qiita-image-store.s3.amazonaws.com/0/117479/034a3aeb-c64c-eb73-0d54-c29bb84a444d.jpeg)

**Step 3.**
after clicking on download button, the new screen will appear.
![2018-05-31 10_09_22-Microsoft Update カタログ.jpg](https://qiita-image-store.s3.amazonaws.com/0/117479/139942d9-da97-1ee7-6535-40fd01c55d55.jpeg)

then download the windowsXXXXXXX.msu file.

**Step 4.**
after successfully download the security patch, install it on your affected server then restart the server.

And try to login with mstsc(windows machine) and it works.
![rdp_win7_main.png](https://qiita-image-store.s3.amazonaws.com/0/117479/e4490fa6-6872-0011-21f5-56dc7b69b92c.png)


**2.2** other action is, just install all updates.
go to your windows update panel then install.

I hope it will work for you. If you have any doubts then feel free to ask.

Have a good day ahead.:grinning::grinning:

Thanks,
cakephp3＋nicEdit+nicUploadプラグインでWysiwyg画像挿入

#calephp3とnicEdit、nicUploadプラグインを使用してWysiwyg画像挿入

主に自分用の覚書です。（すごく忘れっぽいので）

##nicEdit+nicUpload
###nicEdit
nicEditは日本語化されたものを使用
[nicEdit日本語版(CMONOS.JP)](https://cmonos.jp/blog/2010010800/1.shtml)
ただ、この日本語版にはnicUploadは含まれない。
CMONOS.JP開発者様曰く
>弊社で配布している日本語版では、弊社が開発しております CMONOS.JP と
>併用しにくいプラグインについては省略しております。
>ですから仕様といえば仕様になりますが、本家の画像アップロードプラグイン部分を
>日本語版にコピーすれば動作するのではないかと思います(恐れ入りますがプラグイン
>拡張についてはご自身でお調べください)。

だそうな。

###nicUpload
なので本家からnicUploadを穿ってきて日本語版に移植します。
[nicEdit本家](http://nicedit.com/)

* nicEdit終端にとってきたnicUploadを追加する。
* nicEditに付属している**nicEditorIcons.gif**にはUploadの
アイコンが入っていないので本家のnicEdit付属の**nicEditorIcons.gif**
からUploadのアイコンを移植する。（要画像編集ソフト{ペイントとか})

###nicEditの変更

* アイコンリストの変更

```javascript:nicEdit.js（original）321行目
iconList : {"xhtml":1,"bgcolor":2,"forecolor":3,"bold":4,"center":5,"hr":6,"indent":7,"italic":8,"justify":9,"left":10,"ol":11,"outdent":12,"removeformat":13,"right":14,"save":25,"strikethrough":16,"subscript":17,"superscript":18,"ul":19,"underline":20,"image":21,"link":22,"unlink":23,"close":24,"arrow":26,"undo":27,"redo":28},
```
```javascript:nicEdit.js（new）321行目
iconList : {"xhtml":1,"bgcolor":2,"forecolor":3,"bold":4,"center":5,"hr":6,"indent":7,"italic":8,"justify":9,"left":10,"ol":11,"outdent":12,"removeformat":13,"right":14,"save":25,"strikethrough":16,"subscript":17,"superscript":18,"ul":19,"underline":20,"image":21,"link":22,"unlink":23,"close":24,"arrow":26,"undo":27,"redo":28,"upload":29},
```

*画像アップロード先の変更
本家は外部のサイトにアップロードするようになっているので
自前のcakephp3で作ったサイトにアップロードするように仕向ける。

```javascript:nicEdit.js（original）
	nicURI : 'https://api.imgur.com/3/image',

```

```javascript:nicEdit.js（new）
	nicURI : 'http://localhost/unko/tinko/wysiwyg/fileupload',
```



##cakephp3側
###controllerを作成
画像をアップロードするControllerを作成する

```php:WysiwygController.php
<?php
namespace app\Controller\unko;

use Cake\Controller\Controller;

class WysiwygController extends Controller {

	public function fileupload() {

		$this->autoRender = false;

		$data = $this->request->getData();

		$path = "img/uploadWysiwyg/" . rand().$data['image']['name'];
		move_uploaded_file($data['image']['tmp_name'], $path);
		$imagedata = getimagesize($path);
		$link = "http://$_SERVER[HTTP_HOST]"."/tinko/".$path;

		$res = array("data" => array("link"  => $link,
									"width"  => $imagedata[0],
									"height" => $imagedata[1])
		);

		echo json_encode($res);
	}
}
```

##実行
* アップロードを選択

![1.png](https://qiita-image-store.s3.amazonaws.com/0/98458/e0987899-b385-a672-6a9c-fd252f3dd7ab.png)


* ファイルを選択

![2.png](https://qiita-image-store.s3.amazonaws.com/0/98458/c29efe8a-7b4a-53d4-1e93-796b091c2ecb.png)


* アップロード完了

![3.png](https://qiita-image-store.s3.amazonaws.com/0/98458/981b7a33-e826-469d-de82-d19cd8a929ee.png)
raspberry pi3でファイルシステムを拡張する方法(raspbian stretch版)

#　はじめに
ちょいと昔のバージョンのraspbianは`raspi-config`中に`Expand Filesystem`のメニューがあったが、いつの間にか消えていた。fdisk使えば出来るけど簡単で安全な方が良いので調べてみた。

# 方法
``` bash
$ sudo raspi-config  --expand-rootfs
```
コマンド打つと「現在マウント中、リブートしろ」ってメッセージが出るので再起動。これで拡張が完了する。

# おわりに
microSDカードも容量が大きめなのが当たり前なので、保存しておいたイメージより大容量のサイズを買う事が多くなった。また同じ表記nGBでも、カード（とフォーマット具合）によって微妙にサイズが変わったりするので比較的小さいmicroSDでベースになるイメージを保存している事が多い自分には、簡単に拡張できる方がありがたい。

参考にしたURL（ラズパイのフォーラム）
https://www.raspberrypi.org/forums/viewtopic.php?t=195836
そのまま書いてあったが日本語でググると出てこないので、自分用メモを兼ねて残しておく。
新人がGitについてまとめながら書いてみる 

# 0.はじめに
元銀行員で現エンジニアになった私ですが、まだ1年ほどしかエンジニア経験がなく、最新の技術の勉強もおろそかだったため、これを機に色々と学んでいきたいと思います。

# 1.Gitについて
- ファイル構成
ワークツリー（作業するディレクトリ）⇒インデックス（コミット準備するための場所）⇒リポジトリー

- 実際にインストールしてみた
    - はまったとこ
    windowsは、Git for windowsのインストールが必要だった。
FluentdでサクッとログをCloudwatchLogsに流す

よく忘れるので備忘録

## Fluentdのインストール
https://docs.fluentd.org/v0.12/articles/quickstart#step1:-installing-fluentd
gemでもインストールできるけどtd-agentの方がプロセス管理しやすいのでrpm Packageを使う

```
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

## fluent-plugin-cloudwatch-logsのインストール
https://github.com/fluent-plugins-nursery/fluent-plugin-cloudwatch-logs

普通に `$ gem install` するとtd-agentがgemを見つけられない

```
$ service td-agent start
Starting td-agent: 2018-05-31 01:27:51 +0000 [error]: fluent/supervisor.rb:373:rescue in main_process: config error file="/etc/td-agent/td-agent.conf" error="Unknown output plugin 'cloudwatch_logs'. Run 'gem search -rd fluent-plugin' to find plugins"
td-agent                                                   [FAILED]
```

fluentdのdocを見ると以下のような記載があるので

```
# If Using td-agent, Use /usr/sbin/td-agent-gem
If you are using td-agent, please make sure to use td-agent’s td-agent-gem command. Otherwise (e.g. you use the command belonging to system, rvm, etc.), you won’t be able to find your “installed” plugins.
```

これでOK

```
$ td-agent-gem install fluent-plugin-cloudwatch-logs
```

IAMでfluentdユーザーを作成して環境変数にアクセスキーを設定しておく

## configの設定
`/etc/td-agent/td-agent.conf` にconfigがあるので設定

```
<source>
  @type tail
  format none
  path /var/log/test.log
  pos_file /var/log/test.log.pos
  tag /var/log/test.log
</source>

<match **.log>
  @type cloudwatch_logs
  log_group_name test
  auto_create_stream true
  use_tag_as_stream true
</match>
```

起動してcloudwatchlogsにログが流れるのを確認

```
$ service td-agent start
td-agent td-agent:                                         [  OK  ]
```
sendgridのpythonAPIを使ってメールを送信する

ここのblogに書いてあった。

http://www.pochio.net/entry/2018/05/11/145300

```
import sendgrid
from sendgrid.helpers.mail import *

sg = sendgrid.SendGridAPIClient(apikey="SENDGRID_API_KEY")

mail = Mail()
mail.from_email = Email("example+from@example.jp")
mail.add_content(Content("text/plain", "Hello World!"))

## リプライ先を指定したい場合
#mail.reply_to = Email("hogehoge@example.jp")

## メールヘッダから To を隠蔽したい場合
#mail.add_header(Header("To:", ""))

to_addrs = ["example+to@example.jp"]
cc_addrs = ["example+cc@example.jp"]
bcc_addrs = ["example+bcc@example.jp"]

personalization = Personalization()
personalization.subject = "Hello World!"

for addr in to_addrs:
    personalization.add_to(Email(addr))

if len(cc_addrs) != 0:
    for addr in cc_addrs:
        personalization.add_cc(Email(addr))

if len(bcc_addrs) != 0:
    for addr in bcc_addrs:
        personalization.add_bcc(Email(addr))

mail.add_personalization(personalization)

try:
    response = sg.client.mail.send.post(request_body=mail.get())
except Exception as e:
    print(e)

print(response.status_code)
print(response.body)
print(response.headers)
```
Elixir の iex は `Ctrl+\` で抜けないとその後の vim がバグる

雑多にメモ

## iex を使ったあとの vim がなんだかバグる

iex を使ったあとに vim を起動すると途中の行が表示されない謎挙動がある。
shell を再起動 (`exec $SHELL`) すると治る。

### iex 利用前

![iex 利用前](https://qiita-image-store.s3.amazonaws.com/0/29517/debe6e23-4ee4-a7b0-1450-299f314a9159.png)

### iex 利用後

![iex 利用後](https://qiita-image-store.s3.amazonaws.com/0/29517/62e955de-30ab-2de6-87c8-6addd1733751.png)

選択してみると、ちゃんとあるからファイルが壊れてるとかじゃない

![iex 利用後 ちゃんとある](https://qiita-image-store.s3.amazonaws.com/0/29517/32759b07-9c06-ae1f-a884-d2415d3c6d34.png)


注：サンプルに [peco](https://github.com/peco/peco) の changelog を出していますが、特に深い理由は無いです。ちなみに peco にはお世話になってます。

## 解決方法

iex を抜ける時に `Ctrl+\` で抜けると回復する。

iex を抜ける手段はいくつかあるけど、この`\`で抜けるやつだけが問題を起こさなかった。

- `Ctrl+C` を2回
- `Ctrl+C` のあとのメニューで `q`
- `Ctrl+\` を1回

ちなみに一度 `Ctrl+\` 以外で抜けて壊れたあとでも、もう一度 iex を起動して `Ctrl+\` で抜けると回復する。

謎挙動や。。。。
【メモ】GAE/Goで特定の関数だけテストを実行したい場合のコマンド

# GAE/Goで特定の関数だけテストを実行したい場合のコマンド
ローカルで開発を行なっていて、確認のためにgitにcommit前に特定の関数だけのテストを実行したい場合など有効。

## シンプルな表示だけをしたい場合
### コマンド
`goapp test ./テストしたい関数の所属するディレクトリ/... -run 実行したい関数名`

### 実行結果例
`ok  	path/to/テストした関数の所属するディレクトリ	テストにかかった秒数`

## 被テスト関数が出力するログや各テストケースも表示したい場合
### コマンド
`goapp test ./テストしたい関数の所属するディレクトリ/... -v -run 実行したい関数名`

### 実行結果例
以下の内容が表示される

* 被テスト関数が出力するログ
* 各テストケース
* `ok  	path/to/テストした関数の所属するディレクトリ	テストにかかった秒数`

## コマンドの引数の意味
### ディレクトリ/...
ディレクトリ以下のテストを実行する
参考 : [はじめてのgo test - Qiita](https://qiita.com/marnie_ms4/items/e51cc6d879cc9ad07af3)

### -v


> -v
 Verbose output: log all tests as they are run. Also print all
 text from Log and Logf calls even if the test succeeds.


引用元 : goapp test -helpコマンド

意訳 :
冗長な出力 : 動作する全てのテストのログを記録する。Logの出力する全てのテキストを表示し、テストが成功したとしても、Logfを呼び出す。

### -run regexp

> -run regexp 
 Run only those tests and examples matching the regular expression.
 For tests the regular expression is split into smaller ones by
 top-level '/', where each must match the corresponding part of a
 test's identifier.

引用元 : goapp test -helpコマンド

意訳 :
正規表現に適合するテストとexamplesを動作させる。
テストにおいては、正規表現は最上位の'/'で分割される。分割された各々の箇所は、テストの識別子の部分一致に適合しなければならない。

### 参考にさせていただいたサイト
[はじめてのgo test - Qiita](https://qiita.com/marnie_ms4/items/e51cc6d879cc9ad07af3)
AWS Summit 2018 Tokyo AWS のネットワーク設計入門のメモ


## VPC Endpointについて
AWS サービスや VPC エンドポイントサービスに VPC をプライベートに接続できる。

VPC Endpointには、2つのタイプがある。

- Gateway type
 - S3 と DynamoDB をサポート
- Interface type
 - プライベート IP アドレスを持つ、アクセス専用の eniがアタッチされる。
 - EC2 API, Elastic Load Balancing API, Cloud Watch Logsなど、対応サービスが多い。

## AZを跨いだ設計（マルチAZ）について
- Design for Failure の観点から、複数AZで設計することは必須と考えるべき。
- 複数AZを利用するためにも、ELBを置く必要がある。
 - ELBを利用するときは、スティッキーセッションの設置に注意。
- RDSのマルチAZ化はオプションで一発
 - 障害時にslaveからmasterへの昇格が自動で行われる。
 - アプリのDNSキャッシュを長い時間に設定しないように注意。長く設定すると、RDSが切り替わった後でも故障したDBにアクセスをしてしまう。

## 考慮すべきポイント
- VPCそのものには課金はない。→subnetは大きく取っておくべき。
- VPC内サービスとVPC外サービスを意識するべき。。
- 設計するにあたって、構成に悩むよりも検証したほうが早い。
- NTPサーバを使用するためだけに、インターネット接続を考慮した設計にする必要はない。
 - VPCに閉じたNTPでEC2の時刻同期が可能になる、[マネージドNTPのAmazon Time Sync Service](https://dev.classmethod.jp/cloud/aws/amazon-time-sync-service-is-convenient/) を使えば良いから。
HTML5で閉じタグがいらないやつ

HTMLを書いてるときに閉じタグがいらないタグがあって、いるのかいらないのか迷ったので調べた。
HTML5の仕様では以下のタグはVoid elementsと呼ばれ閉じタグが存在しない。

### Void elements
area, base, br, col, embed, hr, img, input, link, meta, param, source, track, wbr
https://www.w3.org/TR/html5/syntax.html#writing-html-documents-elements

### HTML5でのVoid elementsの書き方

```html
<br>
<br/>
<br />
```
上記なら[https://validator.w3.org](https://validator.w3.org)でErrorにならなかった。

以下の書き方はError

```html
<br></br>
```
TypeScriptでファイル、ディレクトリ検索

# 目的
TypeScriptでファイル、ディレクトリ検索を行うプログラムの備忘録。
Node.jsで検索すれば有益な情報は見つけられますし書き方ほぼ同一ですが、
TypeScriptで逆引き検索している方など、お役に立てれば幸いです。

# 概要
対象のディレクトリを指定し、サブディレクトリ含めて指定した拡張子のファイルを一覧として出力する。

## npm インストール
ファイル検索、ディレクトリ検索に必要なモジュールをインストール
npm install --save @types/node

## サンプルコード

```ts

import * as fs from "fs";
import * as path from "path";

// 検索したいディレクトリ
var seekBaseDir = "C:\\Users\\";
// 対象ファイルの拡張子
var extFilter = "sln";

function extension(element: string) {
    var extName = path.extname(element);
    return extName === '.' + extFilter;
};

function seekDir(dirpath: string) {
    fs.readdir(dirpath, function (err, list) {
        if (list !== undefined) {
            list.filter(extension).forEach(function (value) {
                console.log(dirpath + "\\" + value);
            });

            list.forEach(function (value) {
                let nextDir: string = dirpath + "\\" + value;
                if (fs.statSync(nextDir).isDirectory()) {
                    seekDir(nextDir);
                }
            });
        }
    });
}
// 検索開始
seekDir(seekBaseDir);
```

結果
C:\Users\YFurugen\Documents\wpf\based\XamDataGrid\Simple\Sample.sln
C:\Users\YFurugen\Documents\wpf\based\XamGrid\Simple\Sample\Sample.sln
C:\Users\YFurugen\Documents\xamarin\BlueMonkey\client\BlueMonkey\BlueMonkey.sln
C:\Users\YFurugen\Documents\xamarin\BlueMonkey\server\csharp\BlueMonkey.MobileApp\BlueMonkey.MobileApp.sln
WSL環境でgyp ERR!を解決する手順

```zsh
yarn add firebase
```

これだけがしたかったのに解決まで半日ほどかかってしまった……。
`python2` がはいっていないのが原因てことはすぐわかったが、
入れるまでの道のりが長かった。

```zsh
sudo apt-get -f upgrade #30分くらいかかった
sudo apt-get -f install build-essential
sudo apt-get update
sudo apt install python3-pip python3-dev
sudo apt install python-pip python-dev
which python
# /usr/bin/python
yarn add firebase # done!
```

**gyp** _(Generate Your Projects.)_ とはmakeみたいなビルドシステムらしい。
AIアプリへの道:Python基礎(2)

Aidemy Python基礎 Day2
#今日学んだことのまとめ
##所感
今日は昨日よりも踏み込んだ内容だった。具体的には基礎文法の後半から関数に関するところまで。
javaとは異なる言葉（キーとバリューなど）が出てきて若干戸惑うこともあった。
覚えることも大切だが、まず理解したら進めてここに書くような形で復習して定着をはかろう。

##今日一番の驚き
リスト型の他に辞書型があること。
リスト型は昨日学んだように```リスト名=[[0,"A"],[1,"B"],[2,"C"]]```と記載できたのに対して
辞書型は「キー」と「バリュー」を用いて```辞書名={キー1: バリュー1, キー2: バリュー2}```と書くことができる。
リスト型では0から始まるインデックスを呼び出すことによって該当する値が返されたのに対して、辞書型ではキーをバリューに紐づけてキーを呼び出すことでバリューを返すことができる。
＊簡単にいうと、「辞書は順番という概念を持たない。リストはインデックス順。」という認識

##他の気づき
###辞書に要素を追加する
辞書に要素を追加したい場合は、辞書名["追加したいキー"] = 値
順序の概念がない分、追加するキーと値をセットにして辞書に追加。
*リストでは```リスト名.append()```を使うことでリストの最後に追加されインデックス番号もつく。
###for文とデータ群
データ群 とは、リスト型や辞書型のように変数の中に要素を複数個のセット。
例えば、辞書型の複数の値や、リスト型のそれ。
「 for 変数　in データ群: 」をつかうことによって、
データ群に入っている値を変数に代入し一回ずつ呼び出すことができる。
例えば

```python:データ群
animals = ["tiger", "dog", "elephant"]
for animal in animals:
    print(animal)
```

```text:〜出力結果〜
tiger
dog
elephant
```

Javaで同じことを表そうと思うと以下のようになると考えている。

```java:java
class a {
	public static void main(String args[]){
		String animal[] = {"tiger","dog","elephant"};
		for (int i = 0; i<3; i++){
    	System.out.println(animal[i]);
		}
	}
}
```

またfor文の中にifで条件をつけることで、
変数が条件の値になった時などにbreakやcontinueといった操作が可能（このあたりはjavaと似ている）

###関数len()
関数len()で長さを返す。
関数とメソッドは似ていて、処理をまとめたプログラム。
list型やstring型を返すことが可能
＊関数を使う場合はどのような型が使えるか注意が必要

おわり！