OmniAICreator/Qiita-1.07M huggingface dataset:
バッチファイルでIPアドレスの変更を簡略化(win10)

# どれだけ楽か？
## 3クリックでIPアドレスの変更
1. バッチファイルを右クリック
2. 「管理者として実行」を選択
3. ユーザアカウント制御画面で「はい」を選択

以上

# 静的にIPアドレスの変更
## ソースコード
```
@echo off
netsh interface ipv4 set address name="イーサネット" source=static address=xxx.xxx.xxx.xxx mask=xxx.xxx.xxx.xxx gateway=xxx.xxx.xxx.xxx
netsh interface ipv4 set dns name="イーサネット" source=static address=xxx.xxx.xxx.xxx register=primary validate=no
netsh interface ipv4 add dns name="イーサネット" address=xxx.xxx.xxx.xxx index=2 validate=no
pause
```
### 解説
- 2行目はIPアドレスの変更
- 3行目は優先DNSサーバの変更
- 4行目は代替DNSサーバの変更

 nameの値"イーサネット"は
 1. 赤丸部分を右クリック→プロパティを選択
 2. 青色部分をクリック
 3. 緑矢印の名前
 から確認しました。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/319891/94414396-794a-cb25-5a53-f52d28cc9600.png)
![002.png](https://qiita-image-store.s3.amazonaws.com/0/319891/1c67adfe-af97-5c9d-6ac2-6540919c44d1.png)
![003.png](https://qiita-image-store.s3.amazonaws.com/0/319891/e4ac6383-431b-6196-ea65-dba885c5593e.png)


# DHCPに変更
## ソースコード
```
@echo off
netsh interface ipv4 set address name="イーサネット" source=dhcp
netsh interface ipv4 set dns name="イーサネット" source=dhcp
pause
```
### 解説
静的なIPアドレスに変更するより楽なコード。
sourceの値をdhcpにするだけでよいので、アドレスの記述などはない。

# 注意！！
私はこれで1週間を無駄にしました。
ソースコードを作る際は、文字コードを**Shift JIS**にしてください。
もう一度言います。
文字コードは**Shift JIS**
どんなに検索しても文字コードのことに関しては出てきませんでした。
（私の調べ方が悪かっただけかもしれませんが）
バッチファイルの作成は初めてだったので、このような常識的なことは知らず、躓いてしまいました。
以上になります。
ご閲覧いただきありがとうございます。
PyCharmの日本語化とショートカットキー一覧

便利なのでメモ

WillBrains代理店業務いつの間にか終了してる

[PyCharm 価格 \- JetBrains 日本公式販売代理店 WillBrains](https://www.willbrains.jp/product/5)

おや、いつの間にやら日本語マニュアルが充実してる。

[PyCharmの使い方 \- 公式ヘルプ \| PyCharm](https://pleiades.io/help/pycharm/meet-pycharm.html)

おまけに本体の日本語化とショートカットキー一覧PDFまで公開されてる

[JetBrains 製品の日本語化マニュアル \- IntelliJ IDEA](https://pleiades.io/pages/pleiades_jetbrains_manual.html)
※ショートカットキー一覧は下の方にある。
データクレンジングする時に気を付けた方が良いと思ったこと+α

## はじめに
ある意味[こちら](https://qiita.com/ryoutoku/items/0efd6cbdcdac4dca16ee)の続き
ここではSpark(pyspark)を使ってデータクレンジングをしていた時に~~やらかして~~手戻りなど色々あったので、あのとき気を付ければなーと思ったことを纏めます。
また、当たり前な感もありますが、個人的tipsを合わせて纏めます。
特に明言していなければPythonコードはpyspark(df=DataFrame)を想定して記載しています。
pythonは3系、pysparkは2.0系を想定しています。

## 気を付けたい事
### 処理前にデータの型を確認する
私の中で忘れがち&やらかしがち1位。そして気づくのが遅れるとやべぇやつ。
読み込んだデータのカラムが文字列なのか数値なのかでsortやmax、minの処理が変わります。
csvを読み込む際はカラムの型を推定するように```option(inferSchema, True)```とすると幸せになれます。

```python:sample.py
from pyspark.sql.functions import *
from pyspark.sql.types import *

# csvからデータを読み込み。読み込む際はinferSchemaで推定する
df = spark.read.option("inferSchema", True).csv("csvファイル")

# 後からカラムをキャストする場合はこんな感じ(int型(IntegerType)にキャスト)
# キャストする型はpyspark.sql.typesのxxxTypeを参照
df = df.withColumn("キャストする", df["キャストする"].cast(IntegerType()))
```

### 処理前後でデータの量を確認する
私の中で忘れがち&やらかしがち2位。気づくのが遅れるとそこそこやべぇやつ。
where(フィルタ)やjoinした前後でデータ量が想定より上下していると、想定していないデータが増えた(減った)可能性があります。
また、joinの種類(inner/outer/left/...)やカラムの数によって想定していない結果が出てきたりします。

```python:sample.py
# 処理前のデータのカウント
df.count()

# データをフィルタリング。その後
df = df.where(df.columns > 10)
df.count()

# データのjoin
# dfのidとdf2のidでleft joinする例
# df2のidに重複がある場合はデータが増えることに注意
df = df.join(df2, df.id == df2.id, "left").drop(df2.id)
df.count()
```

## 個人的tips
### idを再度振る
データにいわゆるDBの主キー(id)となるカラムが存在しているが、そのidが実は一意になっていない、なんてことがあります(ちゃんとデータ作ってりゃー基本無いはずですなんですけどね、、、)。
データのイメージとしては↓こんな感じ。本来はid - A が1対1の関係になっているが、新たにidとして3が振られているなどです。

|id  |A  |
|---|---|
|1  |1  |
|2  |2  |
|3<br>↑は1であってほしい |1  |

そんな時にidを再度振る方法です。

```python:sample.py
# 新たにnew_idとしてidを振りなおす
# dfは↑のデータを読み込んでいるDataFrameである前提
# monotonically_increasing_id()は1から増加する訳ではないことに注意
tmp = df.withColumn("new_id", monotonically_increasing_id())

# idに対して唯一のnew_idを決める。
# new_idは重複がないのでここではminを取ってidに対して唯一のnew_idを取得する
tmp = tmp.groupBy("id").agg(min("new_id").alias("new_id"))

# idでjoin。必要に応じてnew_idをidにリネームなどすればok
df = df.join(tmp, df.id == tmp.id, "inner").drop(tmp.id)
```

### 複数カラムの情報を1カラムに
複数のカラムの入力の状態を元に、例えばstateとして1つのカラムに纏めたい、ということがあります。
複数のマスタデータから一つに統合されたデータなどにありがちなデータでしょうか。
データのイメージとしては↓こんな感じ。カラムAとBの値の組み合わせで、ある状態を表している場合などは、その状態を表すカラムを追加するほうが分かりやすく混乱も少なくなります。

|id  |A  |B  |
|---|---|---|
|1  |True  |True  |
|2  |False  |True  |
|3  |True  |False  |

そんな時に新たにカラムを追加する方法です。
簡単に言えば、一般的なプログラムと同じように2進数でデータを振り、統合します。

```python:sample.py
# カラムAに対する状態を取得。Aを統合用にリネーム
tmp_a = df.select("id", "A").withColumnRenamed("A","state")

# 値に対して0/1で置き換える
tmp_a = tmp_a.withColumn("state", when(tmp_a.A == True, 1).otherwise(0))

# カラムBも同様に処理。ただし数値に置き換える場合は10/0で置き換え
tmp_b = df.select("id", "B").withColumnRenamed("B","state")
tmp_b = tmp_a.withColumn("state", when(tmp_b.B == True, 10).otherwise(0))

# unionで上下にデータを合体
# idでstateをsumすることでA/Bの組み合わせ(0/1/10/11)が分かる
tmp = tmp_a.union(tmp_b)
tmp = tmp.groupBy("id").agg(sum("state").alias("state"))
```


## 〆
他にもいろいろあったはず、、、なんですが忘れてしまっているので今後も拡張していきたい。。。
「ASP.NET Web API でモデルの検証」を試してみる

#背景
ASP.NET Web APIで「モデルの検証処理」の実装が必要だったので、試した際の備忘録

#今回試した内容
- 必須の値の検証(Required)
- 最大文字数の検証(MaxLength)
- 数値の最小範囲～最大範囲の検証(Range)

#開発環境
- Windows 10
- Visual Studio 2017
- .NET Framework 4.7.2

#参考にした資料
- [ASP.NET Web API でモデルの検証](https://docs.microsoft.com/ja-jp/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api)
- [System.ComponentModel.DataAnnotations Namespace](https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations?view=netframework-4.7.2)

#実装
[ASP.NET Web API でモデルの検証](https://docs.microsoft.com/ja-jp/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api)に沿って、ModelとControllerを作成。

```User.cs
//Using System.ModelComponentModel.DataAnotaions が必要。
public class User
 {
    [MaxLength(4)]
    [Required]
    public string UserID { get; set; }
    public string UserName { get; set; }
    [Range(0, 999)]
    public int Age { get; set; }
    public DateTime BirthDay { get; set; }
    public bool IsActive { get; set; }
}
```

```UsersController.cs
public class UsersController : ApiController
{
    public HttpResponseMessage Post(User user)
    {
        if (ModelState.IsValid)
        {
            return new HttpResponseMessage(HttpStatusCode.OK);
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
    }
}
```

#実行結果
##1. UserIDの文字数制限を超過した場合

```RequestBody.json
{
    "userid":"user1"
}
```
```ResponseBody.json
{
    "Message":"The request is invalid.",
    "ModelState":{
        "user.UserID":[
            "フィールド UserID は、最大の長さが '4' の文字列型または配列型でなければなりません。"
        ]
    }
}
```

##2. UserIDを指定しなかった場合
```RequestBody.json
{
    "age":27
}
```
```ResponseBody.json
{
    "Message":"The request is invalid.",
    "ModelState":{
        "user.UserID":[
            "UserID フィールドが必要です。"
        ]
    }
}
```


##3. Ageの範囲外の値を指定した場合

```RequestBody.json
{
    "userid":"user",
    "age":1000
}
```
```ResponseBody.json
{
    "Message":"The request is invalid.",
    "ModelState":{
        "user.Age":[
            "フィールド Age は 0 から 999 までの範囲で指定してください。"
        ]
    }
}
```

##4. 「UserIDの文字数超過」 かつ 「Ageの範囲外の値」を指定した場合
```RequestBody.json
{
    "userid":"user1",
    "age":1000
}
```
```ResponseBody.json
{
    "Message":"The request is invalid.",
    "ModelState":{
        "user.UserID":[
            "フィールド UserID は、最大の長さが '4' の文字列型または配列型でなければなりません。"
        ],
        "user.Age":[
            "フィールド Age は 0 から 999 までの範囲で指定してください。"
        ]
    }
}
```

#今後試したい内容
- プロパティの型の検証
- エラーメッセージのカスタマイズ
- [RFC7807](https://tools.ietf.org/html/rfc7807)に準拠したエラーレスポンス形式でエラーを返す
MySQLでテーブル作成からデータ追加まで。

インターン先の業務でDBの設計をすることになったので、最近SQLを書くようになりました。これまでSQLの業務経験はなくまだ初心者です。
業務ではGCPをDBに使っています。GCPの提供するCloudSQLというサービスでMySQLとPostgreSQLが使えるため、MySQLでのテーブル作成を行いました。

今回は振り返りを兼ねて、「データベースの作成からテーブルのカラムにデータを入れるまで」を書いていこうと思います。

##データベースの作成
まずは今あるデータベースを一覧表示して確認してみましょう。

```
SHOW DATABASES;
```
すでにデータベースがある場合はこれでデータベースが表示されますね。まだない場合は以下のコマンドで作成しましょう。
ちなみに、<データベース>の<>は実際に記述しないでくださいね。

```
CREATE DATABASE <データベース名>;
```
次に、使用するデータベースの選択をします。以下のコマンドで選択したデータベースの中に入りましょう。

```
USE <データベース名>;
```
これで、選択したデータベースを編集できる状態になります。
##テーブルの作成

```
**構文**
CREATE TABLE <`テーブル名`> (
   `column1` [データ型][任意の属性など],
   `column2` [データ型][任意の属性など],
   `column3` [データ型][任意の属性など]
);

**実例**
CREATE TABLE cars (
   `id` INT(10) AUTO_INCREMENT,
   `car_name` TEXT,
   `price` INT(10),
   PRIMARY KEY (id)
);
```
カラムにはデータ型を指定します。整数型も文字列型も見慣れたものが揃っていて、[MySQL公式](https://dev.mysql.com/doc/refman/5.6/ja/data-types.html)に詳しく書いてくれています。いろいろあるみたいなので僕もう少し読んでみます。数値型には属性がつけれます。これも[公式](https://dev.mysql.com/doc/refman/5.6/ja/numeric-type-attributes.html)にまとまっています。

##データの挿入
では、最後にデータの挿入をしましょう。

```
**構文**
INSERT INTO <`テーブル名`> (`<カラム名>`, `<カラム名>`) VALUES('<値>', '<値>');

**実例**
INSERT INTO cars(`id`, `car_name`, `price`) value(1, 'プリウス', '300万円');
```
VALUEで値を記述する場合は「`(バッククオート)」ではなく「'（シングルクオート）」で囲みます。僕は何度か誤ってどちらもバッククオートで記述してSyntaxErrorになりました。。

データがしっかり入っているかも確認してみましょう。

```
**テーブル全体のデータを表示**
SELECT * FROM `cars`; 

**一部のカラムを指定して表示**
SELECT * FROM `cars` WHERE id = 1 ; 
```

##SQLの学習
まだMySQLに入門したばかりなので、僕自身さらなる基本と応用を学んでいこうと思います。普段はフロントエンドを触ることが多いのですが、何か自分で作ろうと思った時にバックエンドの知識も必要なんですね。
[「たった２日でわかるSQL」](https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F2%E6%97%A5%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8BSQL-MySQL%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798044261)という本を手に入れたのでそれをやったあと、おなじみの[ドットインストール](https://dotinstall.com/)でMySQLのコースをしてみようと思います。

そのほか、いい学習法があればコメントいただけると幸いです！^^
DataFrameに関する関数

列名が同じときに1つだけ残して同じ名前の列を除く関数

```python
def del_duplicate_columns(df):
    """this function removes columns if they have the same name"""
    ret_list=df.columns.tolist()
    ret_result=[]
    for i in range(len(ret_list)):
        if ret_list[i] not in ret_list[0:i]:
            ret_result.append(i)
    return df.iloc[:,ret_result]
```

季節調整ダミー変数行列の作成

```python 
import pandas as pd

def df_seag(index_len=24, seag=12):
    df_seag=pd.DataFrame(0, index=range(index_len), columns=range(seag-1))
    for i in range(index_len):
        if i%seag != seag-1:
            df_seag.iloc[i,i%seag]=1
    return df_seag
```

df dropper

```python 
def df_dropper(df, criteria=0.05):
    '''delete row if it is not densed enough'''
    df=df.reset_index()
    list_to_del=[]
    for i in range(len(df.index)):
        r=df.iloc[i,:]
        if sum(r==r) / len(r) <0.05:
               list_to_del.append(i)
    df.drop(list_to_del, axis=0)
    return df
```
[cocoa][swift]PubHack.swift 2018-03 を振り返る

<p>2018年3月9日（金）の夜間、東京都新宿区の<a href="http://www.dubliners.jp">THE DUBLINERS' IRISH PUB 新宿店</a>におきまして、「PubHack.swift 2018-03」を開催致しました。</p>

<p>PubHack.swiftは、飲み会イベントを通じて、macOS/iOS/tvOS/watchOS/Androidエンジニアの人たちの交流を目的としています。<br />
名前のPubHackは、英国 Pub Rock からとりました。Punk魂で盛り上げたいと考えています！</p>

<p>PubHack.swiftを開催することにした理由は二つあります。一つは勉強会のメンバーはMOSAの準備チームに参加することになる、MOSAの主な活動は交流会なので、NPO法人から任意団体に移行したのちも、継続的に交流会を開催できるようになるための実験です。もう一つは、勉強会に参加する方々が必ずしも硬い活動のみを希望されていないからです。</p>

# 勉強会について
<ul>
<li>Cocoa勉強会 関東 Swift分科会 です。</li>
<li>ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催してます。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>プログラムに関する知識や経験を共有を目的としています。</li>
<li>会の活動内容や発表資料、サンプルコードは公開を前提としています。</li>
<li>申し込みは、connpassから。<br /><a href="https://cocoa-kanto.connpass.com/">https://cocoa-kanto.connpass.com/</a></li>
</ul>

# 概要
<ul>
<li>発表資料は<a href="https://cocoa-kanto.connpass.com/event/80501/">connpassページ</a>からどうぞ！</li>
<li>会場の様子は、ハッシュタグ『#cocoaswift #cocoastudy #bukuroswift』でtweetしています。</li>
</ul>

# 自主トレ
<p>早く会場に到着した有志による飲みです。パブなので、時刻による制限がありませんので。</p>

# Lightning Talks
<ul>
<li>池袋でWilko Johnson氏に遭った</li>
<li>ソロキャンプへの第一歩</li>
</ul>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/80501/">PubHack.swift 2018-03</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
カメラはプレーヤーの動きをフォローする

## カメラのオブジェクトはプライヤーの「Child」オブジェクトを設定する

![data.png](https://qiita-image-store.s3.amazonaws.com/0/286746/2bef7a00-b1c8-0db1-83e1-68d5c34ba1fb.png)

この方法は動きの設定ができない、プライヤー全部変更の動きはカメラも変更されている。

この動きが３つうごきがあります。
・Transform。
・Scale
・Rotate

## カメラで新しいスクリプトファイルを作る
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class followPlayer : MonoBehaviour {
    
    public Transform player;
    public Vector3 offset;
    
	// Update is called once per frame
	void Update () {
        transform.position = player.position + offset;	
	}
}
```

![Screenshot_1.png](https://qiita-image-store.s3.amazonaws.com/0/286746/b4dea0c8-b5aa-9ce0-5220-91710ad26b99.png)

↑のコードを使ってそのカメラはプライヤーの動くをコピーすることができる。

```
        transform.position = player.position + offset;	
```

↑のコードはその「Transform」の動きをコピーするためのコードです。

GITHUB : https://github.com/andybit-okutama/Unity_Learn
Go言語で factory method パターンを書いてみる

正しいか分かりませんが、Go言語でfactory method パターンを書いてみました。

``` go:factory.go
package main

import "fmt"

// created struct
type PersonStruct struct {
	Name string
}
type Person interface {
	GetZikoshoukai() string
}

type Man struct {
	PersonStruct
}
func (man *Man) GetZikoshoukai() string {
	return man.Name + "だぜ！"
}

type Woman struct{
	PersonStruct
}
func (woman *Woman) GetZikoshoukai() string {
	return woman.Name + "よ！"
}

// factory
type Factory interface {
	CreateInstance(name string) Person
}

type ManFactory struct {}
func (factory *ManFactory) CreateInstance(name string) Person {
	man := new(Man)
	man.Name = name
	var person Person = man
	return person
}

type WomanFactory struct {}
func (factory *WomanFactory) CreateInstance(name string) Person {
	woman := new(Woman)
	woman.Name = name
	var person Person = woman
	return person
}

// entry point
func main() {
	var factory Factory = new(ManFactory)
	man := factory.CreateInstance("ひろし")
	fmt.Println(man.GetZikoshoukai())

	factory = new(WomanFactory)
	woman := factory.CreateInstance("なおこ")
	fmt.Println(woman.GetZikoshoukai())
}
```
クラスで言うと、Personが親クラスでManとWomanが子クラスということになります。
PMPを更新するときに読むべき書籍一覧


## PMPの更新
PMPは、3年おきに更新が必要な資格です。
また、3年以内に60PDUを取得する必要があります。
60PDU取得する方法として、書籍で勉強するのが一番安上がりかと思います。
私が、60PDU取得した時に読書した本の一覧を記載します。

また、PDU申請時に申請した情報も記載します。一度もPMIからつっこみが来なかったのでこのまま申請しても問題ないかと思います。

# PMP更新申請した書籍一覧

|NO|書籍名称|選択カテゴリ|Author|Title|Technical　project　management|Leadership|Strategic and business management|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
1|ドラッカー 365の金言|Education Read|Peter F. Drucker|The Daily Drucker (Japanese) |4|4|4
2|7つの習慣-成功には原則があった|Education Read|Covey,Stephen R. |The 7 Habits of Highly Effective People(Japanese)|5||6
3|PMBOK®ガイド 第5版 ソフトウェア拡張版|Education Read|Project Management Institute|Software Extension to the PMBOK® Guide Fifth Edition|4|4|3
4|PMツールの実践的活用法 　さまざまな課題に挑戦するPMたち|Education Read|PMI Japanese Chapter|Practical Application of PM Tool -- PMs to challenge various challenges|6||
5|戦略的PMO　-新しいプロジェクトマネジメント経営-|Education Read|PMI Japanese Chapter|Strategic PMO -- New project management strategy|1||4
6|プロジェクトマネジメントプリンシプル|Education Read|John R. Adams|Principles of Project Management|3|3|
7|プロジェクトマネジメント・ツールボックス|Education Read|Dragan Z. Milosevic|Project Management Toolbox - Tools and Techniques for the Practicing project Manager|10||

※以下のPDU Claimedは40～50ページを1時間の学習として計算しました。
Technical　project　management
Leadership
Strategic and business management

####これを参考にPDU取得に励んでみてください。
【小ネタ】cowsayを入れたマシンでAnsibleを実行すると、牛が出てきてめっちゃウザい!!!

#【事象】
cowsayを入れていたsandbox環境からAnsibleを実行すると、実行時に牛が出てくるようになった。

```
< PLAYBOOK: playbook.yml >
 ------------------------ 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

##【解決】
Ansibleの環境変数を設定することで無効化できる。

■コマンドの場合

```
export ANSIBLE_NOCOWS=1
```
■ファイルの場合
対象ファイル（/etc/ansible/ansible.cfg）

```
　[defaults]
　nocows = 1
```
モォ〜。

最近、知ったのですが、マザー牧場って千葉県にあるんですね。

>マザー牧場
http://www.motherfarm.co.jp/
insta
https://www.instagram.com/motherfarm_official/

##【詳細】
外人ブロガーの記事によると、cowsayをマシンに入れてしまうとこれが発生するそう。
https://michaelheap.com/cowsay-and-ansible/

ドキュメントにもDisable方法が
https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-disable-cowsay
IntelliJでGoogle Java Styleのフォーマッターを適用する

## intellij-java-google-style.xmlをダウンロードする

IntelliJ用の[Google Java Style](https://google.github.io/styleguide/javaguide.html)のフォーマッターxmlは以下で公開されています。
https://github.com/google/styleguide/blob/gh-pages/intellij-java-google-style.xml
なので、まずはこれをダウンロードします。

## IntelliJにフォーマッターをImportする
ダウンロードした「intellij-java-google-style.xml」をIntelliJにImportします。
設定ダイアログを開き、「Editor」→「Code Style」→「Java」にて、Schemeのところの設定アイコンから「Import Scheme」→「IntelliJ IDEA Code Stye XML」を選択し、ダウンロードした「intellij-java-google-style.xml」をImportします。
以上で、IntelliJへの適用は完了です。

## フォーマッターをプロジェクト固有のものにカスタマイズする
場合によっては、Google Java Styleの一部をプロジェクト固有のもの（例えばインデントはスペース4等）に変更したいケースがあります。そういった場合は、[IntelliJコードスタイル](https://pleiades.io/help/idea/settings-code-style-html.html)を参考にしながら適宜修正していきます。修正が完了したら、このフォーマッターをチームに配布する必要があるので、Exportして配布します（Exportのやり方は「IntelliJにフォーマッターをImportする」の項とほぼ同様で、Exportを選択し任意の名前でExportするだけです）。

以上です。
「npm」ってなんの略？

Node.jsを使うなら欠かせない、npmのリポジトリ群ですが、総本山である[https://www.npmjs.com/](https://www.npmjs.com/)に行ってみると、こんなことが書いてありました。

![npm.png](https://qiita-image-store.s3.amazonaws.com/0/60327/b63cde2c-545f-9de3-12f0-34f14fb96b6a.png)

…Neutrino Packing Machine!?

気になったし、ホバーすると反応したので、クリックするとまた別な文言へと置き換わりました。

## npmパッケージになっていた

さらに調べていくと[reddit](https://www.reddit.com/r/webdev/comments/3ofx71/did_anyone_notice_that_npm_has_a_possible_acronym/)にたどり着いて、そこから[npm/npm-expansions](https://github.com/npm/npm-expansions)というパッケージを発見しました。見てみると、[出るもののリストが入ったテキストファイル](https://github.com/npm/npm-expansions/blob/master/expansions.txt)もありました。面白そうなものをピックアップしてみます。

* Nabbing Pleasant Monads（快適なモナドを捕まえる）
* Naively Programmable Module
* Naked Panda Meditations（裸のパンダの瞑想）
* Named Pipe Mechanism（名前付きパイプの仕組み）
* Namespace Pollution Mechanism（名前空間を汚染する仕組み）
* NaN Producing Misery（NaNを生成してしまう悲劇）
* Nanometers Per Millisecond（nm/ms、約分すればμm/s）
* Ne Pas Manger!（フランス語で「食べるな」）
* Nearly Pooped Myself（漏らすところだった）
* Negating Past Mistakes（過去の失敗を打ち消す）
* Neverending Pile of Messages（片付かないメッセージの山）
* Novice Pokémon Master（新人のポケモンマスター）

## 用途

このパッケージを、npmサイト以外で使う用途は…パッとは思い付けませんでした。
Rspecをやって"ふ〜ん"てなったこと

最近初めて、Rspecを触り始めて「あ、そうなんだ」って思ったことをまとめます。
調べたけどあまり出てこない部分のみ抽出してます。
Rspecの文法は他の記事を参考に。。。。。

#勝手にDB構築してくれない

railsでは、下記のようにコードを書いてあれば問題なく、結果が出てきますよね。

```
#book.rb
belongs_to :author
```

```
#author.rb
has_many :books 
```
```
#example_controller.rb
Author.new.books
#=> authorが持つbooks一覧

```

ですが、rspecではexample_controller.rbと同じことを書いても
nilで返ってきます。
どうもdbとメモリ間で同一化してくれないらしい。。。。
なので、

```
#spec内
Author.new.books = create_list(hogehoge)
```
みたいに定義してあげる必要があります。

#define内で親モデルを呼び出してIDに入れられる

親モデルがあって子モデルがあり、子モデル側の外部キーに親のidを入れたいとき、
factorybot内において、

```
#books.rb

FactoryBot.define do
  factory :book do
    author
    name "example"
    price 100
  end
end

```
authorと書いてあげれば、このdefine内でauthor_id 1みたいに定義しなくてもokです。
むしろ定義しちゃうとバグるみたい。。。。。


#材料と結果を入れて仕様がわかりやすいようにする

これは概念というか、考え方の問題ですが、テストは動作確認だけでなく仕様を伝えるものでもあります。
ですので、テストを見たとき、この材料を渡すとこのような結果になるのね。。。ということが他の人にわかるように書いてあげないといけません。

例えば、bookのpriceの合計を出すメソッド(price_sum)を書いているとして。。。

```
#spec内

book1 = Book.new(price: 100)
book2 = Book.new(price: 200)
book3 = Book.new(price: 300)

price_sum
expect(hogehoge).to_eq 600

```
しっかりとbook1などの材料をspec内に書いてあげましょう。
普通にメソッドのみを書いてもテストは通りますが、

```
#spec内
price_sum
expect(hogehoge).to_eq 600
```

これだけ書いても何をテストしているのかさっぱりわかりません。。。。
しっかりとこの材料を与えてあげればこの返り値になるんだということがわかりやすいテストの方がいいですね。


テストは奥が深いですが、めっちゃ楽しいです！
Google Apps Script で Slack からの投稿などを受け取る

Slack の API ドキュメントはリクエストの情報は充実しているのだが、 Google Apps Script で受けてみようとするとなんか POST パラメータの受け取り型がよく分からず苦戦したので、まとめてみた

Slack 側の設定はもうやり方が思い出せないので特に書かない。Google Apps Script で POST リクエストを受け取る方法は、

* [Google Apps Script で Spreadsheet にアクセスする方法まとめ](https://qiita.com/negito6/items/c64a7a8589faaffcfdcf)
* [GAS ビギナーが GAS を使いこなすために知るべきこと 10 選#web-公開](https://qiita.com/tanabee/items/2c51681396fe12b6a0e4#web-公開)

この辺りを参考にしていただければと思います。

なお、例の中に出てくる `TOKEN` という変数は Slack 側で設定して取得したものを代入しておくこと（プロジェクトのプロパティに設定して取り出すなど）を想定してます。

# Event API

Event API は、まず最初に、登録されたエンドポイントがきちんと動くよう実装されていることを確認するために verification が必要となる。

少し余談になるが、 permission の scope を変えた場合は `Installed App Settings` から `Reinstall App` をしないと反映されない。

## verification

https://api.slack.com/events-api#subscriptions

verification では、 challenge に入っている文字列をそのまま Output してあげればよい。

```js
function doPost(e) {
  try {
    var json = JSON.parse(e.postData.getDataAsString());
    if (json.type == "url_verification" && json.token == TOKEN) {
      return ContentService.createTextOutput(json.challenge);
    }
  } catch (ex) {
  }
}
```

## subscribe posted messages

https://api.slack.com/events/message.channels
https://api.slack.com/events/message.groups
https://api.slack.com/events/message.mpim
https://api.slack.com/events/message.im

発言を受け取るのは4つの event typeあるが、受け取るパラメータはほとんど同じ

```js
function doPost(e) {
  try {
    var json = JSON.parse(e.postData.getDataAsString());

    if (json.type == "event_callback" && json.token == TOKEN && json.event.type == "message") {
      // 何かを実装する

      // channel, user は ID しかない
      // json.event.channel
      // json.event.user
      // json.event.text
    }
  } catch (ex) {
  }
}
```

# Interactive messages

いくつかタイプあるけど、とりあえず menus についてだけ書く

## menus

https://api.slack.com/docs/message-menus

意外にもこれは `e.postData` ではない。

```js
function doPost(e) {
  if (e.parameter.payload) {
    try {
      var json = JSON.parse(e.parameter.payload)
      if (TOKEN == json && json.type == "interactive_message") {
        var return_text = "";
        // 何かを実装する
        // 
        // json.channel.name チャンネル名
        // json.user.name ユーザー名
        // json.actions[0].selected_options[0].value 選択された値

        // 何かを返さないと、タイムアウトのエラーが出てしまう
        return ContentService.createTextOutput(return_text);
      }
    } catch (ex) {
    }
  }
}
```

# Outgoing Webhook
何かと便利な Outgoing Webhook だが、非推奨らしい。事情は特に知らないが、気持ちは分からなくもない

https://api.slack.com/custom-integrations/outgoing-webhooks

```js
function doPost(e) {
  if (TOKEN == e.parameter.token) {
    // 何かを実装する

    // e.parameter.channel_name チャンネル名
    // e.parameter.user_name ユーザー名
    // e.parameter.text 入力されたテキスト
    // など
  }
}
```
Qiita(18)記事を書くときに注意していること

Qiitaに記事を書くときに注意していること

 <この項は書きかけです。順次追記します。>
# 1 ソースコードを示す
多い場合は一部を記述し、全体はURLを示す。

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

# 2 コマンドを示す。
導入方法、実行方法、エラー記録方法など。

docker(0) 資料集
https://qiita.com/kaizen_nagoya/items/45699eefd62677f69c1d

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2
  
# 3 エラーメッセージを示す
できれば全体を記録する。
エラーが多すぎる時は、エラーのファイルを保存しているURLを示す。

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

# 4 Qiitaの記事を参考文献に示す。
同じような記事との違いを明確にできる。

アセンブラへの道
https://qiita.com/kaizen_nagoya/items/46f2333c2647b0e692b2

量子コンピュータプログラムへの道
https://qiita.com/kaizen_nagoya/items/37c90488c87bbe9f2d71

# 5 書籍、論文、規格、特許を参考文献に示す。

参考文献駆動執筆(references driven writing)・デンソークリエイト編
https://qiita.com/kaizen_nagoya/items/b27b3f58b8bf265a5cd1

参考文献の参考文献
https://qiita.com/kaizen_nagoya/items/093fa43ed9595190b961

# 5.1 一覧を示す。
Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

# 5.5 Wikiを利用したら、リンク切れを直し、Wikiに参考文献等を追記してくる。
日本語のwikiで、わからないから削除するという行動をとる人がいるらしい。削除する時は必ず削除する根拠のついた文献を一つ追加することを推奨する。なぜ日本語のWiki項目が13位と低いかは、削除する人が多すぎるからかも。削除するのではなく訂正すればいい。
https://ja.wikipedia.org/wiki/Wikipedia:全言語版の統計

# 6 専門用語・略号
略号にはなるべくfull spellをつける。
専門用語は英語を併記する。

# 7 外来語
外来語はなるべく原語を表記し、語源にあたり解説する。
カタカナ語は避ける。
英語のまま表記すれば意味がわかっても、
カタカナ語すると意味があいまいになる言葉がある。

英単語３つ連続でカタカナにすると文字列が長くなり、意味を取るのに時間がかかるかもしれない。

例：ソフトウェアライフサイクルプロセス
software lifecycle process
算譜輪廻過程

なぜ計画者(programmer)はカタカナ語を使わない方がよいのか　日本語（２２）
https://qiita.com/kaizen_nagoya/items/d09e5ee549c4d9a17912

カタカナ語で選手権 日本語(17)
https://qiita.com/kaizen_nagoya/items/f1c0384a13dd13c5e7f1

# 参考文献(reference)
プログラマが知っていると良い「公序良俗」官（４）
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

プログラマが心がけるとよい文章の書き方
https://qiita.com/kaizen_nagoya/items/af1e6207ccaa063dafb8

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事　１００
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 20181127 朝
ver. 0.02 6,7 追記。2項目を詳細化 20181127 夕
ver. 0.03 見出しを簡明にし内容追記 20181128
ver. 0.04 参考文献追記 20181218
ver. 0.05 ありがとう追記 　 20230529
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
AWS Batchの設定方法（アンマネージド型でt2.microのコンピューティング環境を作る）

AWS Batchはジョブを実行する度にコンテナを展開し、Lambdaのように使用時間を節約できる便利なサービスです。

しかしマネージド型は、最も安価なインスタンスタイプでもm3.mediumまでしか選べません。
インスタンスはジョブ終了後、10分放置すると自動でterminateされますが、少し無駄な気がします。

選択肢の一つとして、アンマネージド型でt2.microのEC2インスタンスを利用する方法を紹介します。

# 公式ドキュメント
https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/create-compute-environment.html

# 利用するポイント
① AWS Batchのコンピューティング環境の設定で、アンマネージド型の設定を新規作成する
② ①の後、ECSクラスタが生成されるので、ARNを取得する
③ t2.microのインスタンスを作成※1する際、「/etc/ecs/ecs.config」に「ECS_CLUSTER=②のARN」を書き込むbashスクリプト※2をユーザーデータに登録する
④ ①のコンピューティング環境を使用してAWS Batchジョブを実行する

# ※1：インスタンス作成に使用するAMI
ECSに最適化されたAMIイメージがAWSによって公開されていますので、使用したいリージョンのイメージを指定します
例）**ami-05b296a384694dfa4**（2018年11月、ap-northeast-1の場合）
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-optimized_AMI_launch_latest.html

# ※2：③で登録するユーザーデータについて
- 登録例
    - コンピューティング環境名：example_compute_environment
    - 生成されたECSクラスターのARN：arn:aws:ecs:ap-northeast-1:000000000000:cluster/example_compute_environment_a0000000-0000-0000-0000-000000000000

```
#!/bin/bash
echo "ECS_CLUSTER=arn:aws:ecs:ap-northeast-1:000000000000:cluster/example_compute_environment_a0000000-0000-0000-0000-000000000000" >> /etc/ecs/ecs.config
```
本を読むのが苦手な人でもABDで楽しく本を読む

# 概要

　私は本を読むのが苦手で、買う時のモチベーションは高いが買った後にズルズルと読んでしまうタイプです。そんな私が先日社内でABD（Active Book Dialogue/アクティブ ブック ダイアログ）を用いた読書会に参加し、短時間で楽しく本が読めたことに感動したので、読書が苦手な方に是非紹介したいと思います。
　また、読書（インプット）だけではなく、アウトプットや共有も短時間に行われるので効率よく読書することができ、終わった時は充実感に満ち溢れますｗ

# 体験したこと
　勉強会で扱った書籍は「悲劇的なデザイン」で240ページを6人で分担した
　1時間で読む＆要約、1時間（特に制限なし）で発表（1人5分ぐらい）とディスカッション

　なので、**2時間で1冊の本**を読めちゃいます！

こんな感じ↓のアウトプットになります
![IMG_6453.JPG](https://qiita-image-store.s3.amazonaws.com/0/30522/6e127736-48bf-fb69-5c51-0d271b58fe85.jpeg)

# ABD（Active Book Dialogue）とは

http://www.abd-abd.com/ より引用させて頂きます

> アクティブ・ブック・ダイアローグ®は、読書が苦手な人も、本が大好きな人も、短時間で読みたい本を読むことができる全く新しい読書手法です。

> １冊の本を分担して読んでまとめる、発表・共有化する、気づきを深める対話をするというプロセスを通して、著者の伝えようとすることを深く理解でき、能動的な気づきや学びが得られます。

> またグループでの読書と対話によって、一人一人の能動的な読書体験を掛け合わせることで学びはさらに深まり、新たな関係性が育まれてくる可能性も広がります。アクティブ・ブック・ダイアローグ®という、一人一人が内発的動機に基づいた読書を通して、より良いステップを踏んでいくことを切に願っております。

以下ではインプット、アウトプット、ディスカッションとフェーズごとに手順を書かせて頂きます

## 必要なもの

- 色があるペン（マーカー）
- 付箋（複数色）
- 白紙（A4サイズ～）
- セロハンテープ

## 1. インプット

- 複数人で1冊の書籍を読む
    - 参加者が多くなった場合は、複数チームに分け、チーム同士で共有しあうやり方でもOK
- 対象の書籍を裁断し、特定の範囲のページを参加者1人が読む
    - 章の切れ目ではなく、ページ数で指定する
    - 書籍の内容が複雑なものはペアで同じ個所を担当するのもアリだそうです（ジグソー法）

## 2. アウトプット

- 制限時間内に各担当者が読んだ内容を要約し、用意した白紙に書き出す
    - 文字数制限のルールがあるとよい
- 各パートの要約を張り出し、みんなに発表する。聞く側はその間に感想や質問などを付箋に書き出す
    - 1人1色の付箋で書くとあとで識別しやすくなります
- 発表後に各自の付箋を気になった要約の横に張り出す

## 3. ディスカッション

- 付箋の内容や発表内容について参加者同士でディスカッション
    - 各々が思ったことや詳しい説明を求めたりしてOK


流れは以上です
字面だけではおもしろさが伝わりにくいので、是非体験してみてほしいです
ただ、本を裁断しなければならないので、覚悟が必要です


# 応用編

　ここまで本を読むのが苦手な人が本を楽しく読める方法として紹介しましたが、個人的にチームビルドでチーム全体に共有しなければいけない時でも効果を発揮するのではないかと思いました。例えば、チームでコードのリファクタリングしていきましょう！となったとした時に、リファクタリングの書籍を経験豊富なメンバーとそうではないメンバーでペアを組み読解し、ペア内で同じ内容を共有した後に、全体で各パートの共有するのもアリかなっと思いました。
VueでsetTimeoutを使う

メソッドのところ

```js
test(event) {
  setTimeout(
    function(target) {
      console.log(this.dataVariable);// dataにアクセス
    }.bind(this),
    500,
    event.target
  );
}
```

`@click="test"`を設定したのに`event.target`が取得できない場合は`@click.native="test"`等を試してみる。
【Python基礎】list型(リスト型)の使い方

##はじめに：リスト型（list）とは
- Pythonで扱えるデータの型です。
- リスト型を使用すると、配列形式でデータを格納できます。


```python

#データを作る
members = ["Ono", "Matsumoto", "Sakurai", "Aiba"]

#データを追加する
members.append["Ninomiya"]

#データを削除する
members.delete["Tanaka"]
```

##Index Access(インデックスアクセス)を使用してデータにアクセスしてみる
以下のようにいろいろな形でデータにアクセスが可能です。

```python
#使用するデータはこちら
members = ["Ono", "Matsumoto", "Sakurai", "Aiba", "Ninomiya"] 

#0番目のデータにアクセスする
print(members[0])

#0から2番目未満のデータにアクセスする
print(members[0:2])

#1番目以降のデータにアクセスする
print(members[1:])

#(最初から最後のデータまで)2こおきにデータにアクセスする
print(members[::2])

#後ろのデータから逆にアクセスする
print(members[::-1])
```

結果を見てみましょう。

```実行結果
Ono
['Ono', 'Matsumoto']
['Matsumoto', 'Sakurai', 'Aiba', 'Ninomiya']
['Ono', 'Sakurai', 'Ninomiya']
['Ninomiya', 'Aiba', 'Sakurai', 'Matsumoto', 'Ono']
```

<img src="https://1.bp.blogspot.com/-gzLEofP6ujc/WRaTLoelyFI/AAAAAAABEO0/09k2DS2UcxwaDy4FWS31A_9PYZWKRTglACLcB/s600/idol_kids.png" width=50%>


#☆おまけ☆文字列を交互に読み取ることで、謎のデータを解読してみよう
今回は以下の謎の文字列を解読してみます。

```python
word = "あきいみしとてでるあのあひたびききせだつけがでこつのよむくねなにれあるふきれがてしるた"
```

奇数番号の文字と偶数番号の文字をそれぞれ取り出してみましょう。

```python
# 奇数番目の文字を抽出　※0番目の文字から二個おきにデータにアクセスする。
kisu_words = word[::2]
print(kisu_words)

# 偶数番目の文字を抽出　※1番目の文字から二個おきにデータにアクセスする。
gusu_words = word[1::2]
print(gusu_words)
```

実行結果を見てみると、
偶数番と奇数番を取り出すことで、隠れていた歌詞が出てきましたね！

```実行結果
あいしてるのひびきだけでつよくなれるきがした
きみとでああたきせつがこのむねにあふれてる
```

<img src="https://4.bp.blogspot.com/--8F-ZpVwytE/W1vhhCVE68I/AAAAAAABNwo/WfprKeAcYHcJ-FVAcZ4OQL3ZcpoAm7G6wCLcBGAs/s400/message_loveletter_boy.png" width=50%>
Google Colaboratory を触ってみる~目次ページ~

# はじめに
無料でGPU環境が利用できる Google Colaboratory を使ってみたかったので、いろいろ調べています.
その作業記録です. ネットで調べた内容のトレースがメインとなりますので, 退屈な内容かもしれないことを予めご了承ください.

# 目標
1. [Chainer Colab Notebook の HandsOn](https://chainer-colab-notebook.readthedocs.io/ja/latest/begginers_hands_on.html)をやってみる **←イマココ**
2. [Keras でカプセルネットワーク（CapsNet）](https://www.codexa.net/capsule-network-keras-mnist-tutorial/)を体験してみる
3. [Pytorchで学ぶニューラルネットワークと深層学習](https://www.amazon.co.jp/PyTorchで学ぶニューラルネットワークと深層学習-杜-世橋-ebook/dp/B078WK5CPK)を GoogleColab でやってみる

# Google Colaboratory とは
かなり平たく言うと,「Gmail や google map みたいな感じで, 手軽に機械学習の実行環境が使える Google のサービス」です. Jupyternote book のような使い勝手です. 作成したファイルは, google ドライブに保存されます. 私のように, 環境設定で挫折することの多いヒトにとっては, 非常に心強い存在です. 便利な世の中になったものだ...

詳細は私が解説するより, 下記記事を読んでもらった方が早いと思います. わかりやすいしサクッと読めますよ.

* [Google Colaboratoryの無料GPU環境を使ってみた](https://www.tdi.co.jp/miso/google-colaboratory-gpu)
* [Google Colaboratoryトップページ](https://colab.research.google.com/notebooks/welcome.ipynb#scrollTo=f4-4_atqyNG3)

# むすび
掲げた目標をやりながら, 機械学習やディープラーニングの勉強の記録を残していきます.
書いた記事は, 下記リンクにまとめようと思います.

---
# リンク
[ディープラーニングフレームワークの比較](https://www.hellocybernetics.tech/entry/2017/05/15/063753)
### Chainer
* [Google Colaboratory で Chainer を触ってみるvol.1 ~HandsOn 通りに動かす~](https://qiita.com/4no3/items/53b350a4fa06c60cd8da)
* [Google Colaboratory で Chainer を触ってみるvol.2 ~隠れ層を理解する~](https://qiita.com/4no3/items/c805fa4d609dc483bf64)
* [Google Colaboratory で Chainer を触ってみるvol.3 ~nodeを理解する~](https://qiita.com/4no3/items/ae549e32583da5d1637b)
* [Google Colaboratory で Chainer を触ってみるvol.4 ~活性化関数を理解する~](https://qiita.com/4no3/items/d1283bcdaedabafcb958)
* [Google Colaboratory で Chainer を触ってみるvol.5 ~エポック数, バッチサイズを理解する~](https://qiita.com/4no3/items/cc2322d654e279d55596)
* [Google Colaboratory で Chainer を触ってみるvol.6 ~optimizerの理解、いままでのまとめ~](https://qiita.com/4no3/items/46df75e2a16dfadf19d9)
* [Google Colaboratory で Chainer を触ってみるvol.7 ~LeNet を嗜む~](https://qiita.com/4no3/items/73462cf05770805666e2)

### Pytorch
chainer やったあとかなぁ

### TensorFlow, Keras
JScriptでExcelファイルを編集する

## 概要
JScriptでExcelファイルを編集する機会があったのでメモ。
値の変更などは基本的にはExcel VBAと同じだが、定数的なのが使えないので数字で直接指定することになるのでそこで詰まらないようにまとめておく。
(家に実行環境が無いので未検証)

### Excelファイル読み込み、シートを開く、編集準備


```javascript
var ExcelApp = new ActiveXObject("Excel.Application");
ExcelApp.Visible = true;
ExcelApp.DisplayAlerts = false;
var WB = ExcelApp.Workbooks.Open("[Excelファイルのパス]");
var WS = WB.Worksheets(1);
WS = WB.Worksheets("シート名");
```
[JavaScript でエクセル触ってみたけど | nmm実験室](http://var.blog.jp/archives/70755128.html)
### 値の書き換え

```javascript
// Cells(行, 列)
WS.Cells(1,1).Value = 1;
// 日付は/区切りで
WS.Cells(1,1).Value = "2018/11/26";
```
Valueは省略してもいい。
### 色の扱い
24bitの整数値で指定する。16進数では"BBGGRR"。`parseInt()`を使うと楽。
RGBの順番で指定したほうがわかりやすいので関数を作って対応。

```javascript
// BGRで指定
var red = parseInt("0000FF", 16);

// RGBから変換
function Convert_RGB(r, g, b){
  var color;
  color += r;
  color += g << 8;
  color += b << 16;
  return color;
}
```

### 背景色

```javascript
// 背景色を黄色に
WS.Cells(1,1).Interior.Color = ConvertRGB(255, 255, 0);
```
[Interior\.Color property \(Excel\) \| Microsoft Docs](https://docs.microsoft.com/en-us/office/vba/api/excel.interior.color)
### 罫線

```javascript
// 四方に普通の線を引く
WS.Cells(1,1).Borders.LineStyle = 1;
// 下にドットを引く
WS.Cells(1,1).Borders(9).LineStyle = -4118;
```
罫線
[Borders object \(Excel\) \| Microsoft Docs](https://docs.microsoft.com/en-us/office/vba/api/excel.borders)
位置
[xlBordersIndex enumeration \(Excel\) \| Microsoft Docs](https://docs.microsoft.com/en-us/office/vba/api/excel.xlbordersindex)
スタイル
[xlLineStyle enumeration \(Excel\) \| Microsoft Docs](https://docs.microsoft.com/en-us/office/vba/api/excel.xllinestyle)

## 応用
`for`で回して配列に設定した背景色を適用する

```javascript
var r = Convert_RGB(255,   0,   0);
var g = Convert_RGB(  0, 255,   0);
var b = Convert_RGB(  0,   0, 255);
var colors = [r,g,b];
for (var i=0; i < 15; i++) {
  WS.Cells(1,i+1).Interior.Color = colors[i % 3];
}
```
WebpackによるDynamic Import（実践編）

以前に[WebpackでDynamic importを行ってみる](https://qiita.com/jkr_2255/items/8d3b58f993c8739e211d)という記事を書きましたが、実際に使ってみるとなると、文法以外に考える点がちょくちょく出てきました。

## `import()`自体の書き方

まず、以前書いたように、実用的な`import()`を行う上ではコメントを付けて細かな指示を出すことが必要となります。ということで、あちこちに直接`import()`を書いていては必要以上に煩雑になります。ということで、`import()`だけするファイルを作っておきましょう。

```js
// Promise直出しの場合

export default import(/* webpackChunkName: "qiita" */'path/to/qiita');

// 関数を挟む場合

export default function importer(){
  return import(/* webpackChunkName: "qiita" */'path/to/qiita');
}
```

当然ながら、関数の中に入れた場合は関数を実行するまで`import()`は実行されませんが、直接`import()`を書いた場合はファイル読み込みによって`import()`がスタートします。

## ファイル分割の粒度

HTTP/2での送信ならある程度マシになるかもしれませんが、ファイルを分けすぎてもファイル管理や通信コスト、オーバーヘッドなどを考えればマイナスとなりかねません。ある程度関連する機能をくくった上でまとめて`export`するファイルを作って、それを`import()`する形にするのがいいでしょう。

なお、`import()`の結果は`Promise`の`resolve`へ引数として渡されます。default importであれば`default`キーとして、named importであればその名前のキーとして取れます（静的な`import`/`export`で行われる名前の最適化は行われません）。

## どのようにコードを分割するか

どのようにコードを分割するかは、どのようなコードを書いているかによって大きく違ってきます。

たとえばSPAでは、画面単位で切り分けるのがいいでしょう。Reactには16.6で[Dynamic importをサポートする機能が入っています](https://qiita.com/jkr_2255/items/45079573e0691878eb54#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E9%81%85%E5%BB%B6%E3%83%AD%E3%83%BC%E3%83%89reactlazyreactsuspense)ので、それに沿うのが合理的かと思います。

あとは、

* クリックイベントでしか使われないルーチン
* ページ表示時にいきなり出すわけではないモーダル
* ファーストビューの際に通信しない場合の、通信用ライブラリ

など、ファーストビューで使わないものも遅延させてそこまで問題はありません。
【備忘録】暗号化されたpassword_digestカラムを導入する

# やりたいこと
`bcrypt`をもちいてモデルのパスワードカラムを暗号化する。
（最近Deviceなどの既存ツールを使うことが多く、自分で暗号化パスワードの設定をしようと思った時に毎回調べて時間がかかってしまったのでまとめることにした）

# 前提
データベース名：Room

# 手順
### bcryptのインストール
Gemfileに以下を入力して、ターミナルにてbundle install するだけ。

```ruby:Gemfile
gem 'bcrypt'
```

```ruby:ターミナル
$ bundle install
```

これでbcryptが使えるようになった
### has_secure_passwordメソッドの追加
指定のモデルのrbファイルにvalidationを加える要領で以下を追記

```ruby:app/models/room.rb
class Room < ApplicationRecord
has_secure_password
・
・
・
end
```
これで自動的にパスワードを暗号化して保存できるようになった。
しかしこのままでは暗号化したパスワードの保存先がないため使えない。

### password_digestカラムの追加
生成された暗号化パスワードを保存するpassword_digestカラムを作成する

```ruby:ターミナル
$ rails g migration AddPasswordDigestColumnToRooms
```
```ruby:app/db/migrate/add_password_digest_column_to_rooms.rb
class AddPasswordDigestColumnToRooms < ActiveRecord::Migration[5.2]
  def change
    add_column :rooms, :password_digest, :string
    remove_column :rooms, :password, :string    #既にpasswordカラムがあれば削除しておく
  end
end
```
```ruby:ターミナル
$ rails db:migrate
```
これで`has_secure_password`によって暗号化されたパスワードが保存できる準備が整った。

###【おまけ】認証方法 
`has_secure_password`によって使えるようになった`authenticate`メソッドによってパスワード認証を行う。
(「room_id」と「password」を入力させて`rooms#example`に送信したと想定)

```ruby:app/controllers/rooms_controller.rb
class RoomsController < ApplicationController
 def example
  @room = Room.find_by(room_id: params[:room_id])  #room_idで認証したいroomを指定する

  if @room && @room.authenticate(params[:password]) #room_idが存在する、かつ、パスワードが入力されたものと一致するか調べる
   #ここにやりたい処理を書く

  end
 end
end
```
これにて暗号化されたまま認証ができるようになった。
ターミナルからAtomやVisual Studio Codeを起動する方法【Mac編 決定版】

# ターミナルから _Atom_ や _Visual Studio Code_ を起動する方法

ターミナルから特定のディレクトリやファイルを、 _Atom_ と _Visual Studio Code_ から開けるようにする設定方法についてそれぞれ説明します。

```bash
# Atom でカレントディレクトリを開く
atom .

# VSCode でカレントディレクトリを開く
code .
```


## ターミナルから _Atom_ を起動する

_Atom_ のインストール後に、`atom`というコマンドから起動できるようにエイリアスを貼ります。

1. `~/.bash_profile`に以下の1行を追加
_vim_ や _emacs_ などから`.bash_profile`を編集し、以下の1行を追加してください。

      ```text
      alias atom="/Applications/Atom.app/Contents/Resources/app/atom.sh"
      ```

2. _source_ して有効にする

      ```bash
      source ~/.bash_profile
      ```

上記の手順の実行後、 bash から以下の方法で _Atom_ を起動できます。

```bash
atom .
```


## ターミナルから _Visual Studio Code_ を起動する

_Visual Studio Code_ を起動して設定します。

1. _Visual Studio Code_ を起動

2. `command` + `shift` + `p` を押してコマンドパレットを開く。

3. `shell` と入力して `Shell Command: Install 'code' command in PATH`を選択した状態で `Enter` でインストール

上記の手順の実行後、 bash から以下の方法で _VSCode_ を起動できます。

```bash
code .
```
LibreOfficeで改行を置換するためにやったこと


大学の講義で英語論文を頻繁に読む必要があり、効率よくgoogle翻訳をしたかったのでメモメモ

google翻訳は、改行があるとうまく訳してくれない場合がある。

###論文翻訳のいつもの流れ
普段は
PDFをgoogle chromeで表示→LibreOffice Writerに文をコピペ

という流れで、改行が自動でなくなった状態でクリップボードに保存されるので、便利。

##あとは、そのままgoogle翻訳にぶち込んでやればOK。

だが、時々うまくクリップボードに保存してくれないときがある。
そんな時は別のPDFビューワーを使えばよいのだが、ほとんどのビューワーが改行を消してくれない。

#そんなときの解決策

まずは一旦改行を残してそのままLibreOfficeに英文をぶち込もう

その後に、Libreの置換機能を活用する。

メニューバーから置換を選択
正規表現にチェック
![Screenshot from 2018-11-26 21-08-18.png](https://qiita-image-store.s3.amazonaws.com/0/319778/d730aa49-1b25-8ef5-a43f-f3bc8948568c.png)

改行の正規表現は"$"　(shift+ Enter を使ってる場合は　"\n")
なので置換する文字は"$"を選択
置換後の文字列には半角スペースを選択

![Screenshot from 2018-11-26 21-08-27.png](https://qiita-image-store.s3.amazonaws.com/0/319778/ba9acf0d-a9bc-640b-9521-8853bee63515.png)


置換を実行して完了

あとは翻訳にぶち込めばOK。
機械系アドベントカレンダーを作った話

# はじめに
この記事は[機械系 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/utmech)の1日目の記事です。
プログラミングに関する記事でないし、内容もないので、削除される対象なのですが、今回機械系アドベントカレンダーを立ち上げたことについて少し話します。
途中で、執筆初心者向けにそもそもの記事の書き方についても触れました。
やり方よくわからなくて参加を躊躇している方はぜひお読みください。

# 機械系でアドベントカレンダーをやるモチベ
我々機械系は、授業の約半分が演習という形態になっています。また、工房を自由に使うことができ、各種工作機械などはある程度使い放題です。つまり何かを作ることが好きな人たちの集まりと言っていいでしょう。
さらに3年生の夏学期には全員がスターリングエンジンを制作する機会があり、冬学期には何でもいいので面白いものを作れ！という演習も用意されています。
自分でプロジェクトを考え、それに必死に取り組む機会が与えられている我々は、「こんなことをやってみたらこうなりました」みたいな知見を得ることが日常的にありますし、それをネタにいろいろ面白いことを書けるかな〜と思い、それを晒せる場所としてこのアドベントカレンダーを立ち上げました。

# 初心者のためのアドベントカレンダーでの記事の書き方
1. Qiitaにログインする（Googleアカウントなどでログインできます）
2. ページの下の方のカレンダーで、空いている日の「参加登録」を押す
3. 適当にコメントをつけて、これで参加枠確保！
4. URLの欄には後でいいので記事のURLを貼る（つまり参加登録日に記事を書くのではなく、事前にURLを貼っておけば当日公開される仕組み）
5. ページ右上の「投稿する」を押せば、記事の執筆ができる
6. Markdownで書けるので、書き方の例をマネしながら執筆していく
7. 書き終わったら、右下のボタンで「限定共有投稿」を選択して投稿する
8. 出てきたURLを先ほどの参加枠のURL欄に貼って更新すればすべて完了！
9. 後は当日に自動で公開されます（編集や更新も可能です）当日はSNSなどでアピりましょう

こんなものですかね。
特に4番の**参加登録日に記事を書かなければならないのではなく、前もって好きな時に書いて登録しておける**ってところがあまり知られていない気もします。
当日急いで書く必要もないですし、25日に書いてクリぼっちを疑われる心配もないんですよ。


# アドベントカレンダーのススメ
今回は初めての試みだったこともあり、そこまで参加者は集まらなかったのですが、興味のある人はそこそこいることが（Twitterなどで）分かったため、次回も参加者がいれば続けていきたいな、と思っています。
今年参加されない方も、「賢い記事を書いてアウトプットしよう！」なんて気負わずに、自分の見つけた面白いことを気軽に書いてみるといいと思います。
これからもアドベントカレンダーが盛り上がっていくと良いですね！
以上です！（**まだまだ参加者募集中です！**）
xonshでもcdしたらlsをする他

# はじめに
## 普段はzshとipythonを使っている
- シェルスクリプトをよく書く
- ちょっと凝ったことをしようとすると結局pythonで書いてsubprocess.runする
- 関数にしておいてipythonからimportする
- ちょっとした計算も電卓よりipython

## なんかPython製のShellがあるらしい
もしかして最高ですか？

(参考)
>[xonsh入門](https://qiita.com/ryuichi1208/items/1c127cf3dc827e76409f)
>[Xonsh Advent Calendar 2017](https://qiita.com/advent-calendar/2017/xonsh)

# 環境
- macOS Mojave
- homebrew

# xonshの設定
- $HOME/.xonshrcに書く
- zsh上からxonshを起動しているのでPATHの設定とかは引き継がれている様子

## mac用のエイリアス(GNU版の方を普段使っている)
```
aliases['ls'] = ['gls', '--color=always']
```
 
## cdしたらls(これができなかったら窓から放り投げる)
```
@events.on_chdir
def auto_ls(olddir, newdir, **kw):
  ls
```
関数のデコレータとして記述できるのが神だと思った。
bash, zsh, fishでも同等の設定を使用してきたが今までで一番しっくりくる。

## プロンプト(2行にするのが好み)
```
$PROMPT = "[@{BOLD_YELLOW}{hostname}{NO_COLOR}:{INTENSE_BLUE}{cwd}{NO_COLOR}]\n {prompt_end} "
```
![スクリーンショット 2018-11-26 21.05.42.png](https://qiita-image-store.s3.amazonaws.com/0/109532/c6f10316-f824-6d8b-3111-3f1f0421d27e.png)

# numpyをimportしたい
```
$ /usr/local/Cellar/xonsh/0.8.3/libexec/bin/pip3 install numpy
```
homebrewでインストールした自分の環境だと上記のパスにpipが存在した

後は今のところデフォルトの設定で割と満足している
docker で nginx を root ユーザー以外で起動する

コンテナ内で実行するプロセスを root ユーザで実行しないようにしたいときのメモ。

# `root` ユーザーに実行するケース

次の例は nginx の master プロセスは `root` ユーザー、 worker プロセスは `nginx` ユーザーで実行される。

```dockerfile
FROM nginx

COPY ./nginx.conf /etc/nginx/nginx.conf

CMD ["nginx"]
```

```nginx
user nginx;
worker_processes 1;
daemon off;

error_log   /var/log/nginx/error.log warn;
pid         /var/run/nginx.pid;

events {
  worker_connections  1024;
  multi_accept on;
}

http {  
  •••

  server {
    listen      80;
    server_name _;
    charset     utf-8;

    location / {
      try_files $uri @app;
    }

    location @app {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://hogehoge.com:3000;
    }

  }
}
```

# `nginx` ユーザーで実行するケース

次の例は nginx の master プロセスと worker プロセス両方を `nginx` ユーザーで実行されるようにする

`nginx` ユーザーは `nginx` イメージで作成されているのでそれを使う。
基本的に well-known port 0〜1023 は root ユーザーでしか使えないため、listen するポートが `80` だと権限エラー `bind() to 0.0.0.0:80 failed (13: Permission denied)` になる。

listen するポートは `80` から `8080` に変更する。

```dockerfile
FROM nginx

COPY ./nginx.conf /etc/nginx/nginx.conf

# 追加
# ディレクトリオーナーを変更
RUN touch /var/run/nginx.pid && \
  chown -R nginx:nginx /var/run/nginx.pid && \
  chown -R nginx:nginx /var/cache/nginx

# 追加
# uid=100(nginx) gid=101(nginx) groups=101(nginx)
USER nginx

CMD ["nginx"]
```

```nginx
worker_processes 1;
daemon off;

error_log   /var/log/nginx/error.log warn;
pid         /var/run/nginx.pid;

events {
  worker_connections  1024;
  multi_accept on;
}

http {  
  •••

  server {
    # 変更
    listen      8080;
    server_name _;
    charset     utf-8;

    location / {
      try_files $uri @app;
    }

    location @app {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://your-app-domain.com:3000;
    }

  }
}
```
IE11でStyle属性にAngularJSのExpressionを用いた表現ができない

AngularJS×IEというオワコンオブオワコンですが備忘録として残します。

## 課題
IE11において、style属性にAngularJSのExpressionを用いた記述ができず、値が空として扱われてしまう。

## 解決策
`style`属性の代わりに`ng-attr-style`を用いる。

## 参考リンク
https://github.com/angular/angular.js/issues/2186
https://github.com/angular/angular.js/blob/master/docs/content/guide/ie.ngdoc
https://stackoverflow.com/questions/23610625/angular-expression-inside-style-attribute-dont-work-in-ie
https://stackoverflow.com/questions/25436055/angularjs-style-issue-ie/
Railsのセッション管理方法

## Sessionとは

簡単に言うと
> ページ間で変数の内容を維持するための仕組み

## Sessionの特徴
- セッション情報は、Railsのデフォルトの設定ではクッキーに保存
- 4KB以上のデータは保存できない

参考：http://railsdoc.com/references/session

## Sessionを用いたフォーム登録

本来であれば、
`<%= form_for(@user) do |f|　%>`
としてform_forの引数にモデルのインスタンスを渡して上げることで自動的にパスの設定は行ってくれるが、今回の場合はsessionモデルという名のモデルを用意していないので明示する。
例えばログインの場合は、以下のように書くことが出来る。

```ruby:new.html.erb
<%= form_for(:session, url: login_path) do |f| %>
  <%= f.label :email %>
  <%= f.email_field :email　%>
  
  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.submit "Log in" %>
<% end %>
```

そして、このように書くと、paramsに入る内容は
`params[:session][:email]`
`params[:session][:password]`
のように入れ子構造になる。

例えば、
email_fieldに `test@test.com` 、password_fieldに `hogehoge` と入力すると、
パラメーターは以下のように。
{ session: { email: "test@test.com", password: "hogehoge" } }
社内システムの全サーバーをAWSに引越した話

## はじめに
この記事はRandstad Advent Calendar 2018 の1日目の記事です。今日からRandstad JapanのIT部門のメンバーが毎日なにかを書いていきます。

初日は、今年実施した大きいイベントの一つである、全サーバーをAWSに引越したプロジェクトについて振り返りの記事を書きます。既存サーバーをAWSのEC2へ移行する際の注意点や考慮すべき点について、みなさまの参考になる記事になれば嬉しいです。

## 概要
「**各国のRandstadのオペレーションカンパニーの全サーバーをAWSに移行し一元管理する**」という方針の下、Randstad Japanもゴリ押しでAWS移行を完了させ、データセンター解約を実現した時のお話です。

## 移行計画
**コスト**
追加ライセンスや外部サービスの利用コスト、外部ベンダーに協力が必要なシステムに関しては委託費用など、最初に想定できるコストについては一通り予算を確保しました。

**体制**
本プロジェクトはアプリケーションチームとインフラチームの2チーム体制で構成され、アプリケーションチームは、PM(私)と関連アプリケーションの有識者3名の計4名でした。必要なメンバーをアサインするというよりは、それ以上リソースを割けない状況のためこうなりました。なおかつ、みんな通常業務と掛け持ちで対応(笑)

**スケジュール**
メンバー全員がこのようなプロジェクトは初めてということもあり、対象となるシステムごとに各担当者がざっくりと移行期間を見積り、各メンバーが同時期に複数システムを担当することが無いよう並べる、というシンプルな組み方でスケジュールを作成しました。振り返ってみると、割と妥当なスケジュールでした。後に起こる想定外のトラブルがなければ。。。


**移行プロセス**
以下の図の通り、移行プロセスは単純です。
国外にいるインフラチームと、ほぼ完全分業制で進めた点は弊社ならではの特徴かもしれません。
![Pictures-Page-6 (2).png](https://qiita-image-store.s3.amazonaws.com/0/314356/cd0300e7-621f-8a75-29ce-9a9db83e817e.png)

## AWSへの移行を実施してみて学んだこと

社内組織やプロジェクトの都合により、インフラのポリシー固めを並行して行ったということもあり、結果として移行方針がブレ、想定外のトラブルに見舞われました。それらの中でも印象に残った想定外を記載しておきます。

### AIX→SUSE Linuxへ変更したら、C言語のバッチがエラー連発
AWSのEC2が対応していないAIX上で稼働しているシステムはSUSE Linuxに移行することになったのですが、AIXで問題なく動いていたソースコードがSUSE Linuxだと動かないというトラブルが。。

トライアンドエラーで壮絶なモグラ叩き大会を実施した結果、エラーの種類は90弱、ソースコードの修正箇所は200箇所以上、ほぼ全テストとなりました。。
※修正リストは多すぎてアップできないので、興味がある方はご連絡ください。

修正対象の中には、もともとC言語のコーディングとしてはNGですが、AIXでは問題なく実行できてしまっていたというケースも数多くありました。AIXさん、寛容過ぎます。。「**甘やかすという事は本人ためにならない**」ということに改めて気付かされた瞬間でした。

### AWSに移行することで発生した想定外のコスト増
あるミドルウェアにおいて、調査及びベンダーへの確認の結果、
　**１．現バージョンではAWSで動作しないのでバージョンアップが必要です**
　**２．バージョンアップをするとライセンスのカウント方法が変わります**
　**３．ということで、ライセンスの追加購入が必要です**
という3段論法で追加コストを決断させられました。反論の余地がありません。ぐうの音も出ません。。

### EOLが迫るソフトウェアのバージョンアップに伴うテスト増
テストに時間をかけられるタイミングはなかなか無いので、これを機にバージョンアップを決断しました。一旦、現状のまま移行してからバージョンアップ、という選択肢もありましたが、それは問題を先延ばしするだけです。鉄鋼王として知られるアンドリュー・カーネギーも名言を残しています。「**いつやるか？今でしょ！**」


結果として色々な壁にぶち当たりました。AWSへの移行プロジェクト、ちょっとナメてました。大変だった反面、学ぶことも多いプロジェクトであったとも思います。もし私がもう一度AWS移行を任されたら、以下は絶対実施します。
　・インフラのポリシーや移行方針はブレないよう調整する。
　・ソフト/OSバージョンアップのための調査およびPoCの実施フェーズを設ける。
　・スケジュールと予算のバッファを~~めっちゃ~~多少多めに積む。

## 最後に
初参加1日目の記事の締めとして、事業会社の情シス部門という、ガチの技術者集団とは若干毛色の違う私達が、Qiitaに記事を書く意義について触れたいと思います。

私達は情シス部門に所属しておりますので、ゴリゴリの技術記事というよりは、情シスならではの観点で情報を発信するというスタンスでコミュニティに貢献していければと考えてます。
※Randstadの皆さん、ちょっとだけハードル下げておきました(笑)

そして、私達がこのような場で記事を書くことによって得られる気づきはやはり、
　**自分たちは世の中のエンジニアと同じ土俵にいることを自覚する**
ということで、これは今の私達にとって一番重要だと考えてます。今回のAdvent Calendarへの初参加が、RandstadのITメンバーのレベルアップに繋がる事を願い、1日目の記事を終わらせていただきます。