OmniAICreator/Qiita-1.07M huggingface dataset:
HomebrewでMavenのインストール


homebrewでmavenをインストールする。

##前提条件
・Javaインストール済み

###インストール
```
$ brew install maven
```
###インストールの確認
mavenとJavaのバージョンが表示されればOK

```
$ mvn --version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T16:58:13+09:00)
Maven home: /usr/local/Cellar/maven/3.5.2/libexec
Java version: 1.8.0_40, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.6", arch: "x86_64", family: "mac"
```
受託開発しかしてこなかったエンジニアが自社製品を開発するスタートアップに入ってみた


はじめまして。
人生で初めてのQiitaへの登録になります。どうかお手柔らかにお願いします。
本日はタイトルにもある通り、技術的なお話ではなく、私の経験的なお話をしようと思います。

# 入社まで
今まで2社のITコンサルティング会社に在籍し、要件定義から設計辺りまでの業務に従事してきました。
一時期はbackbone.jsを利用していたWEBシステムの開発担当として、夜な夜なjQueryと格闘する日々が続いたこともありましたが、基本はコードをほとんど書かない系の典型的な管理系エンジニアです。

そんな中、今年の7月から心機一転フロムスクラッチというスタートアップの会社でエンジニアをしています。経緯についてはまた別の記事でお話ししたいと思います。

私は管理系エンジニアだったこともあり、開発プロセスを考えることが多かったのですが、今までの受託開発での開発の進み方とは大きく違い、今までとは全く違うスピードで開発が進んでいきます。
**本日はその受託開発での開発進み方の違いについて、3点ほどお話したいと思います**

# 開発の進み方の違い１　「自分たちで要件をマジで考える」
こちらは受託開発なのか、自社開発なのかで大きな違いがあるかもしれませんが、本当に開発者が要件を考えなかれば開発は進まない体勢になっています。
というのも弊社ではScrum開発を進めており（Scrum開発についてはたくさん記事があるのでそちらを見ていただければと思います）、開発についてはユーザーストーリーというものをベースに開発を進めます。
このユーザーストーリーといいうものが、仕様書でも基本設計書でもない、「ユーザーストーリーはユーザーが実現したいことやユーザーにとって価値があることを簡潔にまとめた文章」を纏めたものになります。
なので、開発者は上記のユーザーの価値になることを開発で実現には何かを考え、それを完遂させなければ開発を完了することはできません。その過程で開発者は開発の途中段階でマジで要件を考えることになります。そのため、開発した後に要件が漏れることが少なくなり、結果的に開発のスピードが上がります。

# 開発の進み方の違い２　「技術選定にも自由がある」
受託開発時によくある話で、「過去に導入実績のあるIEしか容認することはできない」とか「言語も新しい言語は信頼性にかけるのが」ということが往々にしてあると思います。提案して、承認をもらうまでのプロセスが長く、結果的に導入事体が見送りになるケースも多いと思います。
しかし自社開発×スタートアップともなると、積極的に新技術を投入していきます。開発のベースが「ユーザーに価値のあるものを提供」を目的としているため、いま世の中にある技術をフルに活かして実現しなければなりらないからです。もちろん技術検証はしっかりとした上で。
新技術をいち早く導入し、新技術におけるメリット教授して開発できるため、こちらも結果的に開発スイードがあがります。

# 開発の進み方の違い３　「アジャイル開発を本当に実現している」
こちらは受託開発の時でもアジャイル開発ができるように導入にしようという話があがることが多いのですが、私がいたプロジェクトとでは結果的にはほとんどアジャイル開発はできていませんでした。というのも、基本的にお客様の業務システムに関わる部分で仕事をしているため、業務上決まっている導入スケジュールが優先されるため、イテレーションを実施を繰り返すように進めようとしても、結果的にはウォーターフォールで仕事が進むことがほとんどです。
ですがこちらも先に記載の通り弊社ではScrum開発を導入しているため、短い基幹でのSprintで開発基幹を区切り、書sprint毎に仕組みの改善に取り組んでいることから、本当にアジャイル開発を実現できています。
アジャイル開発を実現できているということは、ウォーターフォールでは追加の開発期間が必要になる開発を短いスパンで実現できるようになるため、結果的に開発スピードが上がります。

# 最後に
いかかでしたでしょうか。
自社製品を開発したことがなかった私としては、上記の３つの違いは私の中では今までにない衝撃的な内容でした。本当に。
上記を実現し続けることは相当量のエネルギーも必要だし、大変な部分も多いですが、このスピード感で開発をしだしたら、受託開発でのスピードにはもどれなくなるなと、自分は感じています。

あとエクスキューズですが、まだまだ開発力が足りなすぎて、「◯◯やってみました」的な記事がうまくかけませんでした笑。
そういった内容の記事についてはまた次回、チャレンジしようと思います。絶対に。
grepの使い方 備忘録。shellで　特定の文字列以降を抽出

結論
```grep -Po 'キーワード\K[^ ]+' <<<　入力データ　>> 出力先```

例)gnuplotで表示するためのテキストファイル準備[VASP計算用 in Linux] 


```
\#!/bin/bash 
\#各フォルダのOSZICARkからエネルギーの値を抽出したい
WORKDIR=`pwd`
echo "" > energy
for Q in 0.97 0.98  0.99   1.0    1.01   ;
do
  cd \$WORKDIR/\$Q
echo "$Q"  |tr '\n' '\t' >> ../energy
tail -n 1 OSZICAR   >> ../energy
done
```

で
``` 
0.97    4 F= -.21544349E+02 E0= -.21515451E+02 d E =-.259105E-04
0.98    4 F= -.21544349E+02 E0= -.21515451E+02 d E =-.259105E-04
0.99    4 F= -.21544349E+02 E0= -.21515451E+02 d E =-.259106E-04
1.0     4 F= -.21544349E+02 E0= -.21515451E+02 d E =-.259107E-04
1.01    4 F= -.21544349E+02 E0= -.21515451E+02 d E =-.259106E-04
```
を得たけど、本当は[d E =]以降を集めて
```
0.97    　-.259105E-04
0.98    　-.259105E-04
0.99    　-.259106E-04
1.0     　-.259107E-04
1.01    　-.259106E-04
```
が欲しい。


```tail -n 1 OSZICAR   >> ../energy```
を
```grep -Po 'd E =\K[^ ]+' <<<`tail -n 1 OSZICAR` >> ../energy```
に置き換えて解決！


\K[^ ]+とか正確に覚える自信がないので備忘録として保存

参考リンク
https://askubuntu.com/questions/697120/extract-word-from-string-using-grep-sed-awk
cesiumで雨量

#概要
cesiumで雨量を表示してみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/b688d407-74c3-c149-bb43-132acda606b3.png)


#サンプルコード

```
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.0 + 0.4, 38.0 - 1.0, 500000.0),
});
var test = new Cesium.TileCoordinatesImageryProvider({
	tilingScheme: new Cesium.WebMercatorTilingScheme()
});
var layers = viewer.imageryLayers;
var l0 = layers.addImageryProvider(new Cesium.SingleTileImageryProvider({
    url: 'http://jsrun.it/assets/S/A/h/G/SAhGj.png', 
    rectangle: Cesium.Rectangle.fromDegrees(120.0, 30.0, 160.0, 60.0)
}));
l0.alpha = 0.75;            
```


#成果物
http://jsdo.it/ohisama1/sQw1

以上。
channelとsync.Poolを使ってgoroutine内の処理の同時実行数を制御する

元ネタ

- [チャンネルを使って、決まった数のリソースをgoroutine間で共有するパターン - 詩と創作・思索のひろば](http://motemen.hatenablog.com/entry/2017/12/go-channel-resource-pool)
- [Big Sky :: 簡単に goroutine の実行個数を制限する方法](https://mattn.kaoriya.net/software/lang/go/20171221111857.htm)

どちらも、固定長のバッファを持ったチャネルを共有リソースとすることでgoroutineの同時実行数を制御するパターンの例として紹介されています。

`sync.Pool`を使うともうすこし可読性があがると思ったので、サンプルコードを書いてみました。
今回ベースにしたのはmotemenさんの方で、実行数の制御とワーカーリソースのプールを主題としています。

**NOTE:**

元ネタの[Big Sky :: 簡単に goroutine の実行個数を制限する方法](https://mattn.kaoriya.net/software/lang/go/20171221111857.htm)にも追記がありますが、goroutine自体の同時実行数は抑制できていません。ここで紹介するのはgoroutine内の処理実態を抑制する手法です。goroutineが大量に起動する可能性がある場合は[事前にgoroutineを起動しておくパターン](https://gobyexample.com/worker-pools)を検討してください。

## sync.Pool

https://golang.org/pkg/sync/#Pool

使い方ですが、sync.Pool内の生成関数`New`にほしいリソース取得処理を書きます。
※生成関数が返すのは変数のポインタです。

```go
pool := sync.Pool{New: func() interface{} {
    t := time.Now()
    return &t
}}
```

取り出したものは型キャストして使い、必要なくなったらプールに戻します。

```go
t1 := pool.Get().(*time.Time)
time.Sleep(100 * time.Millisecond)

t2 := pool.Get().(*time.Time)
fmt.Println(t1 == t2) // output: false

pool.Put(t1)

t3 := pool.Get().(*time.Time)
fmt.Println(t3)
fmt.Println(t1 == t3) // output: true
```

残念ながら `sync.Pool` に数の制限のしくみはないので独自のプールが必要になります。
今回はworkerリソース制御のしくみをつくりました。

## ワーカープールを作る

同時実行数制御のlimitとワーカープールを内包したstruct `workers` をつくります。

```go
type workers struct {
	limit chan struct{}
	pool  sync.Pool
}

func newWorkers(n int) *workers {
	ws := workers{}
	ws.limit = make(chan struct{}, n)
	ws.pool = sync.Pool{New: func() interface{} {
		return &worker{}
	}}
	return &ws
}
```

プールからのGetはlimitチャネルの空き状況によって制限されます（待たされます）。

```go
func (ws *workers) Get() *worker {
	ws.limit <- struct{}{} // 空くまで待つ
	return ws.pool.Get().(*worker)
}
```

戻すときは同時にlimitチャネルから解放します。

```go
func (ws *workers) Put(w *worker) {
	ws.pool.Put(w)
	<-ws.limit // 解放
}
```

このworkersを使ったmain関数はこうなります。
goroutineからfor/selectが消えてすっきりしました。

```go
func main() {
	ws := newWorkers(5)
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			w := ws.Get()
			log.Printf("[worker %v] --> goroutine %d", w, i)
			w.work()
			log.Printf("[worker %v] <-- goroutine %d", w, i)
			ws.Put(w)
		}(i)
	}
	wg.Wait()
}
```

全体像はこんな感じ。

- https://play.golang.org/p/3K4IfLeObOI

今回はcancel処理を省略しましたが、実際はworkerPoolにキャンセル用の仕組みを組み込む必要が有ってもうすこし複雑になりそうです。

mattnさんのコードをもとにしたものはこんな感じです。

- https://play.golang.org/p/jGMM2810oEl
javascript備忘録

<h1>javascriptの歴史と言語の特徴＋ES6についてちょこっとまとめてみた

![js.jpg](https://qiita-image-store.s3.amazonaws.com/0/225252/0aa44d0d-9dda-fe51-30a4-9a09aa99cdb9.jpeg)

<h2>はじめに

javascriptに触れる機会があり、こちらの本をよんでいて気になったことをまとめてみました。
![book.jpg](https://qiita-image-store.s3.amazonaws.com/0/225252/11e63b40-a8cc-dc7a-4d86-7085f07e66a1.jpeg)

 <h2>Javascriptとは?

 Javascriptとは、Netscape Communications社によって開発された、プラウザー向けスクリプト言語です。開発当初はLivescriptと呼ばれていましたが、当時注目を浴びていたJava言語にあやかりその後、Javascriptと名前を改めることになったようです。
※JavaとJavascriptとは言語仕様に似た部分はあるものの、まったくの別言語です。javeではなくjs(ジェーエス)と呼ばれます。

ブラウザ向けの言語のため「InternetExproler」や「GoogleChrome」といったブラウザと、あとはテキストエディタ（メモ帳）さえあれば実際に動かすことが可能です。WEBサイトへ動作を付けられるという特徴や手軽さから、WEBデザイナーの方でも記述する機会のある言語にもなっています。JavaScriptなどを専門に扱う「フロントエンジニア」と呼ばれる方もいますが、様々な人に広く使われている言語でも有ります。

![chrome.jpg](https://qiita-image-store.s3.amazonaws.com/0/225252/083e3050-bcf1-aea2-d3ad-2f716296532a.jpeg)![explorer.jpg](https://qiita-image-store.s3.amazonaws.com/0/225252/d9e9c2f2-3503-09c5-54a7-80107e345f46.jpeg)


<h2>言語としての特徴

①スクリプト言語である

 スクリプト言語とは、簡易であることを目的として作られたプログラミング言語のことです。すでにほかの言語を学んだことがある方はもちろん、ブログラミングが初めてという方も短期間で習得することが可能です。そのー方で、オブジェクト指向的な構造も持ち合わせており、再利用性/保守性に富んだコードも記述しやすいつくりになっています。

②インタプリター型の言語である

インタプリター言語とは、プログラムを先頭から逐一解析し、コンピユーターに理解できる形式に翻訳しながら実行していく言語のことです。このため、いわゆるコンパイル言語に比べると動作が遅いという問題はありますが、反面、プログラムを実行するためにコンパイルは必要ないというメリットがあります。コードを書いて、そのまま実行できる手軽さが魅力です。

③さまざまな環境で利用できる

Javascriptはもともとはブラウザー上で動作することを想定して作られた言語ですが、現在はブラウザー上での用途にとどまりません。Javascript、または、Javascript(ECMAScript)をべースとして作られた言語が、じっにさまざまな環境で動作しています。
Android/Node.js/Java Platform,Standard Edition/..etc





<h2>ECMAScript 2015とは？

ECMAScriptとは、標準化団体ECMA Internationalによって標準化されたJavascriptです。1997年の初版から改訂が重ねられ、現在の最新版は2015年6月に採択された第6版がECMAScript 2015(ES2015)です。版数から、通称、ECMAScript 6(ES6)と呼ばれることもあります。
ES2015で新たに提供された仕様には、以下のようなものがあります。
<ul>
<li>class命令の導入で、Java/C#のようなクラス定義が可能に
<li>import/export命令によるコードのモジユール化をサポニ卜
<li>関数構文の改善(アロー関数、引数のテフオルト値、可変長引数など)
<li>let/const命令によるブロツクスコープの導入
<li>for...of命令による値の列挙
<li>イテレータ/ジェネレータにより列挙可能なオブジエクトの操作が可能に
<li>組み込みオブジエクトの拡充(Promise、Map/Set、proxyなど)
<li>String/Number/Arrayなど、既存の組み込みオブジエクトも機能を拡張など

</ul>
ただし、ES2015は大きな変革であったため、すべてのブラウザニがES2015に対応しているわけではありません。現時点での対応状況を確認するには「ECMAscript 6 compatibility table」が便利です
→https://kangax.github.io/compat-table/es6/

![es6.png](https://qiita-image-store.s3.amazonaws.com/0/225252/9df515bb-499a-655a-a8e9-218bb36e4967.png)

<h2>まとめ

![study.jpg](https://qiita-image-store.s3.amazonaws.com/0/225252/e8c58e11-a02b-126a-182b-be0dd521911f.jpeg)

ブラウザ向けの言語として開発されたjavascriptは再利用性/保守性に長けてコードも書きやすい特徴があります。今ではブラウザにとどまらずいろいろな環境で利用できるようになりました。同時に標準化も進められどのブラウザでも同様に使えるようになってきています。
これからもjavascritは変化し続けていくと思います。変化に遅れないよう学び続ける必要があるということがわかりました！（javascriptだけにかぎったことじゃないですね、、）
関数型プログラムの紹介かつ自分用備忘録的なもの

advent callendar 12/20日投稿用だったのですが、落とし所がよくわからずに期限過ぎてしまいました。ごめんなさい。

最近趣味でやってる言語にHaskellというものがあります。
いわゆる関数型言語と言うもので、数年前から、話題になり始めた感があります。
Haskellやる前はScalaに少し手を出してました。
Haskellの紹介しようと思ったけど、あまりまとまらなかったので、まずは関数型言語の説明をします。
この記事はHaskellの説明は一切ありません。また別の機会にします。
サンプルコードみたいなものはPHPで記述しています。


#関数型プログラムとは

まとめる時間が今はないので、命令形プログラムと、関数型プログラムで 1~10の足し算を書いてみる

```php5
<?php
//命令形的な　0~10の足し算
$x = 10
$sum = 0;
for ($i = 0 ; $i <=$x $i++) {
    $sum = $sum + $i;
}
echo $sum;
//55

//関数型的な 0~10の足し算
function sum($x)
{
    if ($x == 0) return 0;
    return $x + sum($x-1);
}
echo sum(10);
//55
```
　
検索すると大体以下のようなキーワードとセットになってます。

* immutable
* 参照透過性
* 第一級関数・高階関数
* カリー化

## immutable

値を定義した後に変更不可能であること、
PHPでいったら常にconstで定義してるようなものです。
この性質によって、「いつの間にか値が変わってた」みたいなバグを起こらないようにできます。


##参照透過性

簡単にいえば、同じ入力に対して、同じ結果を返す性質
例えば、以下のような関数は参照透過性ではありません

```php5
<?php
function getRandom($last)
{
    return mt_rand(0, last)
}

getRandom(100);
```
同じ引数を与えてますが、返ってくる結果は常に同じとは限りません。
これだと、テストがしづらいです。
参照透過性のある関数を定義すると、同じ引数に対して、常に同じ結果が返ります。

## 第一級関数・高階関数

変数への格納や関数の引数・戻り値として定義できる関数のことです。
PHPの関数も、第一級関数・高階関数の性質をもっています。
PHPで記述すると以下のような感じになります。

変数に関数を格納する例

```php5
<?php
$hello = function($name) {return "hello ${name}!!"; };

$hello("John");
// hello John!!
```
関数を引数に取る例

```php5
<?php
//数値を2倍にする
$double = function($x) {return 2*$x; };

//とある範囲の数を、足し合わせる
$sum = function ($from,$to,$f){
    $result = 0;
　　for($i = $from; $i <= $to; $i++) {
       $result += $f($i);
    }
    return $result;
};

$sum(1, 10 ,$double);
// 110
```

##カリー化

いろいろ調べたり考えたりした結果、カリー化とは、どう活用するかは別として、
**複数引数の関数を単引数の関数に変える。**
ただこれだけと言う結論になりました。

```php5
<?php
//数値をN倍にする
$multiply = function($n,$x) {return $n*$x; };

//2引数なのでこれを1引数関数に変更する
$cmultiply = function ($n) {
     $_mult = function ($x) use ($n) {return $n*$x;}; 
     return $_mult;
};

//$cmultiplyは引数を1つ取り、関数$_multを返す関数
//第一級関数・高階関数でないと、関数を返り値にできない

//$cmultiplyを利用するとdoubleはこのように書ける
$double = $cmultiply(2);
$double(10)
// 20

//3倍する関数は以下の様に書ける
$triple = $cmultiply(3);
$triple(10)
// 30
```


#終わりに

今回は全然まとまらずに、関数型言語の特徴を書いただけになってしまいました。
haskellの説明も関数型言語のメリットもデメリットも全く書けていないので、次回の宿題にします。
Node.jsのMongoClientの仕様が変わってた

さっきnpmインストールしていつも通り接続しようとしたら `TypeError: db.collection is not a function` になるので調べてみたら、3系から仕様が変わったみたいです。

> MongoClient.connect now returns a Client instead of a DB
http://mongodb.github.io/node-mongodb-native/3.0/upgrade-migration/main/

# 使い方
## 変更前
```javascript
const MongoClient = require("mongodb").MongoClient;

const _url = 'mongodb://heroku_xxxxxxxx:lvojimq4uc5lu7fnljpg5b2vig@ds999999.mlab.com:49511/heroku_xxxxxxxx';

MongoClient.connect(_url, (err, db) => {
  db.collection('foobar', (err, collection) => {
    collection.find().toArray((err, docs) => {
      :
      :

    });
  });
});
```
## 変更後
```javascript
const MongoClient = require("mongodb").MongoClient;

const _url = 'mongodb://heroku_xxxxxxxx:lvojimq4uc5lu7fnljpg5b2vig@ds999999.mlab.com:49511/heroku_xxxxxxxx';

MongoClient.connect(_url, (err, client) => {
  // callbackに渡されるオブジェクトが変わった
  // db名を明示的に指定してdbオブジェクトを取得する必要がある
  const db = client.db('heroku_xxxxxxxx');

  db.collection('foobar', (err, collection) => {
    collection.find().toArray((err, docs) => {
      :
      :

    });
  });
});
```
デザインがわからなくても大丈夫！伝わるパワポを作るために3分で出来る設定


# **■ はじめに**
こんにちわ！
スマホゲームのガチャでSSRを引くと、
よろしくない事態がサーバーに起きるmontaimontaiと申します。

　
上長「アドベントカレンダーも技術者の真面目な話ばっかりじゃ飽きるから、
　　　**非・エンジニア視点でなんか記事を書いて**よ」

montai「~~（何書いても怒らないなら）~~やります」

　
と、いう経緯で12月22日に参上させていただきました。
※上長からは**「節度ってわかる？」**という温かなお言葉をいただきました。

とはいえ、非エンジニアな一般社員ですので、IOTとかAIとかこれからのバックエンドサービスとかイケてる記事は**弊社の優秀な社員がメタンコ良い記事**を書いてくれると思うので、
私の仕事の一部である資料作成において、**「みやすいパワポデザインのためにやってる設定」**をつらつら書いていきます。



# **■ パワポサイズ 編**
![srd-1.png](https://qiita-image-store.s3.amazonaws.com/0/213048/70951d29-e8d7-4ffd-c756-1cb1cf26face.png)

　
・16：9　→ 印刷はしない( スライド )
・ 4：3　→ 印刷する予定がある( 手渡し資料 )
　
まず一番初めに設定するパワポサイズ。
だいたい、作成の際は4：3で作成すること多いのですが、
スライドだけで作るなら、隙間が出ない16：9で作成した方が見栄え良くなります。

また、あとで**「別のパワポスライドと合体しといて！」**という~~めんど~~オーダーが入るときがあるので、
確認は始めにとっておきましょう。余計な遺恨が残らずに済みます。




# **■ グリット 編**
 
　
~~めんどくさいけれどやっといた方がいいのが~~
スライドマスターへのグリッド設定です！

新規作成時にデフォルトで、（たぶん）中心に縦横入っていますが、
それとは別に、スライドマスターへ、横+1cmで入れると、
**ここからはみ出さなければきれいに仕上がる**ので、初めに設定しておくとおすすめです。
※普通の画面に入れると、簡単に動くので、スライドマスターに私は入れています。

![gurid3.png](https://qiita-image-store.s3.amazonaws.com/0/213048/d4224c5a-9264-6178-6d9f-331d9b976b36.png)
だいたい、真ん中・端から1cm ～ 1.5cmの中に収めるとビジュアル的にキレイです。


# **■ 文字（フォント） 編**

　
![kakidasi-1.png](https://qiita-image-store.s3.amazonaws.com/0/213048/9815fd9e-dbfb-5780-dabd-230cd7e79704.png)

通常文字：メイリオ
数字・英字： Segoe UI

文字（フォント）はこの二つを設定しています。
この二つだと、**winでもmacでも利用でき（た、はず）、印刷でもスライド見やすい**ので、おススメです。


# **■ 文字と文字の行間 編**
 
 
![pt.png](https://qiita-image-store.s3.amazonaws.com/0/213048/c91164a2-76ef-41f9-77b7-9e7aa35ec6f6.png)


　
資料に長文を書く場合は、行間を開けると読みやすくなります。
~~（そもそもスライドはあまり長い文章を書かない方がいいというのは置いといて）~~

　
　


ちなみに設定の仕方は簡単で、
　


![pawapo-1.png](https://qiita-image-store.s3.amazonaws.com/0/213048/7f9ac270-4e60-2aed-9e4f-aeab10471f06.png)

①ホーム画面から、行間のオプションを選び、
　


![pawapo-2.png](https://qiita-image-store.s3.amazonaws.com/0/213048/c437aecc-6563-4274-e18e-ed3468268ef4.png)

②段落値をクリックして、ポイントをいい感じに指定してください。
　
フォントサイズによって、細かく設定するのがめんどうな方は、
**1.5行**に設定するといい感じで行間があきます。

# **■ 文字色 編**
文字カラーはデフォルト設定で

![qita.png](https://qiita-image-store.s3.amazonaws.com/0/213048/0dce0ce2-375f-16c3-6621-375b5b3179ad.png)

こちらの黒が選ばれていると思いますが、
この色だと、印刷・WEBでみたときに少しクドいイメージになる~~（と勝手に思っているので）~~


![パレット-1.png](https://qiita-image-store.s3.amazonaws.com/0/213048/f93754a7-1c3f-0f08-c96d-ccd46589b347.png)

この中のどちらかの色に変えています。
特に印刷に出すと、黒を変えるだけで柔らかい雰囲気になったりもするので、おすすめです。


## その他の文字色
その他のカラーについては、ノリで決めます。
~~（サービスのテーマカラーとか、カラーイメージとかありますが）~~
とはいえ、基本的には、

<font color="red">・これめっちゃくちゃ注目してください！（目立つ 赤系）</font>
<font color="sbule">・そこそこ見てください！（黒と比べて明るい程度の青）</font>

という感じで**2タイプ**の色を選択すると素敵になる（といいなぁ…）。

ただ、<font color="red">赤</font>は結構曲者で、
すごくうまく使わないと使いすぎるとごちゃごちゃした印象になります。
だいたい**1Pに1か所**がよい塩梅ですね。

![iro1.png](https://qiita-image-store.s3.amazonaws.com/0/213048/fd92ecb5-910f-f28d-2ac3-91ac491d0cb7.png)

スライドや画面で見ると、よけいに赤はうるさく見えるので、
一つ暗い色のものを選択すると良いと思います。


# **■ おわり**
　
だれでもササッと作れるパワーポイントですが、少しの設定できれいに見やすく作成できます。
たかがパワポ、されどパワポですので、~~企画を通りやすくするために~~
一度お試しいただけたらと思います！

それでは、これから23日・24日~~一人で~~楽しく過ごしたいと思います。
メリークリスマース～。



【追伸】内容が駄々被りしている~~（しかもクオリティは向こうの方が）~~
記事を見つけてしまったので、しばらく拗ねています。
DataFrame に複数列を使って計算列を高速に加える方法

# 概要

DataFrame に複数列を使って関数やハッシュマップを通して値をセットする場合、`iterrows()` を使ってしまうと遅い。シリーズ同士の計算にもっていくこと。

# 説明

DataFrame に単一列を使って追加する場合、下記のようにやれば高速。

```py
df['z'] = df.a + 100
```

ただ、複数列を使って列を追加しないといけない場合に `iterrows()` を使って下記のようにやってしまうととても遅い。

```py:遅い
max_for_each_b = {1: 100, 2: 200, 3:500}
df['z'] = [v.a / max_for_each_a[v.b] for i, v in df.iterrows()]
```

このような場合は下記のようにシリーズ同士の計算にもっていけば高速。

```py:速い
max_for_each_b = {1: 100, 2: 200, 3:500}
df['z'] = df.a / df.b.apply(lambda b: max_for_each_b[b])
```
高卒Webプログラマのお給料

[IT屋お給料リレー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/salary)向けの記事。
適当に要所要所ボカしてますが、おおよそ実話です。

## 書いてる人のスペック
- 高卒
- 現在27,8歳くらい
- 地方出身関東在住
- いわゆるWeb系のプログラマ(社会人になってから今まで)

## 19-22歳:年収250万程度(基本給15万/月)
高卒で働いていた地方の中小企業。その地域だとそこそこ規模の大きい会社で数百名程度の従業員がいた。

ブラック上等、毎月100時間超の残業当たり前、うつ病になる同期もいたし、すぐに辞めていく同期もいた。当時横並びで入社した同期も今では半分程度しか残っていないらしい。基本給を抑えて残業代は40時間分までしか払わないという、裁量労働制という言葉を悪用している会社だったけど、現在は多少様子が違うらしい(詳しくは知らないけど多少は是正されたとかなんとか)。

まあ、何はともあれ僕が在籍していた頃は最悪だった。辞めるって人事の方に相談したら、高卒で10年働いている先輩を例に出して頑張れば年間で400万くらい稼げるようになるよ、と説得を受けた。ただ、その先輩社員は残業しまくってて、それだったので夢がないなと思い結局退職をする意志は変わらなかった。

## 22-23歳:年収400~500万(詳細忘れた 基本給20万/月)
転職したため上京。零細企業で従業員数は片手で収まる規模。 

いわゆる技術派遣的な感じで常駐業務をこなしていて、燃え盛るプロジェクトに2,3度投入されて残業代はフルできっちり貰えたので年収が少し上がった形。まあ2度と大企業のプロジェクトには関わりたくない、と心に誓った。

そんなに面白くなかったですね。一緒に働いてたこの道何十年という先輩は色んな意味で強かったし、良い人だったけど。

## 23-24歳:年収300万(基本給25万/月)
転職じゃなくて関わるプロジェクトの都合上転籍しないといけなくて、転籍したら契約上基本給は25万になった。ただ残業しなくなってしまったので年収が下がる形に。

このときは非常に面白かったですね。残業する程仕事も降ってこなかったし、外国人が沢山いてコミュニケーション取れたのが楽しかった。ただ、年収が下がっていた(残業してなかったから残業代がつかなくて)のと趣味にお金を使えるようになった(使う暇ができた)ので、生活的には多少苦しかった気がする。

## 24歳-現在:年収500 -> 700(41万 -> 55万/月)
現職。一応、ベンチャー企業。運良く転職したらお金払いの良い会社だった。これだけ基本給/月ではなくて単に額/月で書いているのは、みなし残業が45h分含まれていて基本給忘れたから。ちなみに月の残業は10h未満。

都合3,4年勤めていることになるけど、毎年転職するのと同じくらい年収上がってるので給与面に関する不満はほぼない。

## まとめ
給料は運ゲー。残念ながらめちゃくちゃ努力したから給料あがるとか、そういうゲームや小説みたいなことは起こらない(努力した結果として転職できれば話は別として)。お金を持っててお金を払ってくれる会社に入れるかどうかが大事なんだ、というのがこの10年弱で学んだこと(ちなみに運要素を減らすなら会社のお金周りとかを調べて転職すると良いと思う)。
AWS FargateでサーバーレスZabbix

cloudpack大阪の佐々木です。

# 概要
Zabbixを使うとなると、サーバの面倒はどうするんだ？って話に絶対なるので、AWS Fargateで動かして、サーバーレス化してしまおうということです。
(実際はサーバーレスってい言えるかどうか分かりませんが・・・）
*実用に耐えうるかは考慮してません。*

# 構成イメージ
![Untitled(1).png](https://qiita-image-store.s3.amazonaws.com/0/3246/8124388b-e966-b2fd-50b8-ddf45f163284.png)

IPが変わるのもどうかなーということで、NLB、ALBを使ってホスト名でアクセスできるようにします。
ZabbixサーバはNLBで、ZabbixWebの方はALBで受けるので、サービスを分けています。


# 手順
VPCまわり、クラスタ、RDS、NLB、ALBの手順は省略します。
CloudWatch Logsのロググループも先に作っておく必要があります。

### ファイル構成
```
. ─┬─ server ─┬─ docker-compose.yml
   │          └─ ecs-params.yml
   │
   └─ web ────┬─ docker-compose.yml
              └─ ecs-params.yml
```

## zabbix-server
### コンフィグファイル
```yaml:server/docker-compose.yml
version: '2'
services:
  zabbix-server:
    image: zabbix/zabbix-server-mysql
    ports:
      - "10051:10051"
    environment:
      DB_SERVER_HOST: <RDSのエンドポイント>
      MYSQL_DATABASE: <RDSに設定したDB名>
      MYSQL_USER: <RDSに設定したユーザー名>
      MYSQL_PASSWORD: <RDSに設定したパスワード>
    logging:
      driver: awslogs
      options:
        awslogs-group: <ロググループ名>
        awslogs-region: us-east-1
        awslogs-stream-prefix: zabbix
```

```yaml:server/ecs-params.yml
version: 1
task_definition:
  ecs_network_mode: awsvpc
  task_execution_role: ecsTaskExecutionRole
  task_size:
    cpu_limit: 256
    mem_limit: 0.5GB
  services:
    zabbix-server:
      essential: true
 
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - <サブネットID>
        - <サブネットID>
      security_groups:
        - <セキュリティグループ>
      assign_public_ip: ENABLED
```

### 起動
```bash:
$ cd server
$ ecs-cli compose service up --launch-type FARGATE \
 --target-group-arn <NLBのターゲットグループのARN> \
 --container-name zabbix-server \
 --container-port 10051
```

## zabbix-web
### コンフィグファイル
```yaml:web/docker-compose.yml
version: '2'
services:
  zabbix-web:
    image: zabbix/zabbix-web-apache-mysql
    ports:
      - "80:80"
    environment:
      DB_SERVER_HOST: <RDSのエンドポイント>
      MYSQL_DATABASE: <RDSに設定したDB名>
      MYSQL_USER: <RDSに設定したユーザー名>
      MYSQL_PASSWORD: <RDSに設定したパスワード>
      PHP_TZ: Asia/Tokyo
      ZBX_SERVER_HOST: <zabbix-serverのホスト名（NLBのFQDN）>
      ZBX_SERVER_NAME: <zabbixの管理画面に表示される名前>
      ZBX_SERVER_PORT: 10051
    logging:
      driver: awslogs
      options:
        awslogs-group: <ロググループ名>
        awslogs-region: us-east-1
        awslogs-stream-prefix: zabbix
```
### 起動
```bash:
$ cd web
$ ecs-cli compose service up --launch-type FARGATE \
 --target-group-arn <ALBのターゲットグループのARN> \
 --container-name zabbix-web \
 --container-port 80
```

# 接続
ブラウザから `http://（ALBのFQDN）` にアクセスするとWeb管理画面にログインできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/72c366c9-f0fb-0fa1-8dcd-74d218d0e5bb.png)

ダッシュボードでのステータスも正常です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/f26fce34-bb32-e56a-8e71-40fda8ef1456.png)

エージェントで指定する `Server` はNLBのFQDNになります。

# まとめ
Zabbixは単純にスケールアウトできるものでもないですので、あまりFargateに適したものではないですが、サーバのメンテは誰がやる？って話が進まないようなときは、とりあえずFargate化してしまえばいいんではないでしょうか？
Pythonでクローラーを作成するときに有用なライブラリ集


## 基本
 * Webページの取得
    * Requests
 * xml/html操作
    * lxml
 * HTMLの操作
    * cssselect
 * スクレイピングライブラリ
    * Beautiful Soup 
 * RSSのパース
    * feedparser
 * MySQLへの接続（データの保存）
    * mysqlclient
        * MySQL-pythonからフォークされた

## 応用
 * クローラー開発のフレームワーク
    * Scrapy

## 参考文献
 * 加藤 勝也、 横山 裕季、（2017）『Pythonによるクローラー＆スクレイピング入門 設計・開発から収集データの解析まで』翔泳社
Minecraftで学ぶプログラミング~CodeConnection編~

# はじめに
これは、[Minecraft Advent Calendar 2017](https://qiita.com/advent-calendar/2017/minecraft)用に書いた記事です。この記事を書くために初めてMakeCodeを触ったので間違ったことを書いているかもしれません。 
だいぶ変わり種です。
最近Minecraftを通したプログラミング教育用のツールが出てきています。今回は以前までEducationEditionのみでしか使うことが出来なかったCode ConnectionがMinecraft for Windows10でも使えるようになったということで試してみました。
# 書くこと
- Code Connection for Minecraftの導入方法について
- サンプルスクリプトの実行方法
- 触ってみた感じと感想

# 必要なもの
- Minecraft for Windows10 Ver1.2.8

#Code Connection for Minecraftの導入方法
https://education.minecraft.net/get-started/download/ から、Code ConnectionのWindows10版をダウンロードしてください。次にダウンロードしたインストーラーを起動し、誘導に従って、インストールしてください。 
これだけです。

# サンプルコードの実行
まずはMinecraft for Windows10を起動します。次にチートを有効にしたワールドを新規に作成します。今回は、スーパーフラット(ゲーム上では**気の抜けた**)のワールドを生成しました。
次にCode Connection for Minecraftを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214395/67a94c21-48f3-af4e-cb21-45dc8a856bef.png)
(Minecraft:Education Editionってなってますが、Windows10用です。)

指示通りにコマンドをマインクラフト側で実行すると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214395/81aae726-0052-1c3c-2893-96064bc69702.png)

画像のようなAgentがスポーンします。後々これを動かしたりもします。
そしてCodeConnection側には次の画像のようにボタンが並ぶと思います。![image.png](https://qiita-image-store.s3.amazonaws.com/0/214395/8c02660b-8297-0395-fd21-f5b8fdf472ea.png)

今回はMakeCodeを使用するためMakeCodeのボタンをクリックしてください。ここでは取り上げませんが、他にもCode.org,Scratch,Tynkerを使ってプログラミングすることもできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214395/87064ece-9565-8c96-b4ae-415d2ea37cc8.png)
MakeCodeのボタンをクリックするとこのような画面が出ると思います。色々なサンプルが並んでいますね。今回はSuper Powersの中にあるMega Jumpを選択しましょう。![image.png](https://qiita-image-store.s3.amazonaws.com/0/214395/5a2b3358-bade-b5d0-8599-370da2cd1e65.png)

すると、このようにブロックプログラミングの画面が表示されます。
見ただけでなにやってるか大体察せるかもしれません…。
それではゲームに戻って```jump　20```とチャットをしてみてください。すると…今のy座標+20のところにテレポートします。だけです。~~何がMega何だろう…~~
このようにマインクラフトの中でコードを実行することが出来るのがCodeConnectionです。

# それでは自分でも触ってみましょう。

先ほどの画面の左上にある家のボタンを押すとMakeCodeのホーム画面に戻ります。
新しくプロジェクトを作ろうと思うので、マイプロジェクトから新しいプロジェクトを選択し、プログラミングを始めてみましょう…。

#触ってみた結果と感想
ちょっと触ってみました。その結果spreefのような何かが出来上がりました。
下の動画を見ていただければ、分かっていただけるかと思います。
https://youtu.be/9kzfkPXqEZs
1時間くらいかけて作り上げた感想ですが、初めてプログラミングに触れるのにちょうどよさそうだな、と感じました。modやプラグインと比べたら、もちろんできることが少ないのですがエージェントを動かしたり、ブロックを設置したり、エンティティをスポーンさせてみたりと、普段遊んでいるゲームの中で手軽にプログラミングが体験できるのは面白いなと思いました。
今回は全く触りませんでしたがMakeCodeはJavascriptにも対応しているので、ちょっと応用みたいなこともできるかもしれません。ここまで読んでいただきありがとうございました。
#参考資料
MakeCodeのwebドキュメント
https://minecraft.makecode.com/setup
RustでマストドンのBotを作ったお話

# 分散型SNSマストドン

私は分散型SNSのマストドンによく参加しており最近ではよくRustを用いてマストドン関連のサービスを書いていたりしました。その中の一つでBotを作ったので使い方などを説明したいと思います。

リポジトリ
https://github.com/nacika-ins/nanachibot

# Mastodonのベースとなるライブラリ「[Mammut](https://github.com/Aaronepower/Mammut)」

Mammutは、Mastodon APIのラッパーライブラリです。マストドンにアプリを登録したり、フォローやタイムラインの取得などができます。一通りの[エンティティ](https://docs.rs/mammut/0.9.0/mammut/entities/index.html)も揃っており、これだけでマストドンのAPIが簡単に叩く事ができます。

# Mammutで出来なかったこと

Mammutでは一通りのマストドンのAPIを叩く事ができますが、マストドンの特徴であるリアルタイムなストリーミングによるタイムラインの自動取得が出来ません。通信をキープすることで自動取得が実現できるのですがそのようなコードが見当たりませんでした。😢

ないなら作れとforkしたのがこちらです。

# [nacika-ins/Mammut](https://github.com/nacika-ins/Mammut/tree/develop)

こちらのリポジトリでは、まだちゃんとコード整理出来てないですが [get_user_streaming](https://github.com/nacika-ins/Mammut/blob/develop/src/lib.rs) というメソッドを用意しました。`thread` と `loop` と `channel` を用いて `websocket` によって常に通信を監視するようになっています。かなり試行錯誤しました。😓

マストドンがまだ1系の頃は pingに対してpongを送らなくても通信が維持されていたりしていたのがいつのまにかpingに対して正しくpongを返さないと切断されるようになっていたり、rust の `websocket`自体が仕様変更で改修が必要だったりとなかなかうまく行きませんでした。

もしもwebsocketの通信が切断されても、loop によって再試行されます。


# 数回の実行でアプリの簡単登録出来るようにした


[Bot側のコード](https://github.com/nacika-ins/nanachibot/blob/master/nanachibot/src/main.rs)では、まだ`config.toml`が作成されていない場合はアプリ作成の問い合わせを行うようになっています。複数回実行することで、`config.toml`の中のキーが自動的に設定されます。ただ、アクセストークンだけは手動で貼り付ける必要があります。
`config.toml`が満たされているとBotが起動します。

# ストリーミングの実行部分

```rust
let (srx, nrx) = mastodon.get_user_streaming();
```

ユーザータイムラインのストリーミングを開始すると、2つのReceiverが渡されます。
左がHTL（ホームタイムライン）、右が通知です。それぞれ `Status`というエンティティを扱いますが、

HTLと通知では若干構成がことなるので注意が必要です。Mammut標準のエンティティだと型が違っていてエラーになっている箇所があったので修正している[部分](https://github.com/nacika-ins/Mammut/commit/758dce07880e36a37b5c90e305a22c1c4e7920f1)があります。

Receiverから受信するとThreadがそこで待機状態になってしまうので、新しいThreadを作成しそこで受信するようにしています。肝心のBotの部分は、

```rust
let nanachi_arc = Arc::new(Mutex::new(nanachi));
```

Arc Mutexを用いて、スレッドを一時的にロックしHTLと通知用のスレッドでそれぞれ共通で使っています。
そこまでリソース食わないし状態を持たないので2つ作っても問題はないです。


# Botの投稿

Botに何か投稿させる処理は別なチャンネルで行うようにしました。投稿自体はMammutの機能を使い、`StatusBuilder`で`Status`を作成し、`new_status`で投稿します。 `.in_reply_to_id`は、ユーザーIDではなく、返信先のステータスIDのようです。

# 今後やってみたいこと

まだLTLや連合のストリーミングに対応していないので今後対応させて、自動的に学習させたりしてみようかと考えています。
これからはじめるTeX生活

久しぶりの投稿です．

4年生にとってはぼちぼち卒論の時期ですね..

僕たちも書き始めているのですが，macを使っているとwordに限りなくストレスを感じてしまいます．
(すぐにフリーズしたり，図や表がずれたり，数式の番号を意図した位置に置きにくかったり...)

こんな状況を打破するために，僕たちのグループではTeXを使っていますので，ちょっとご紹介します．


たぶんですが，情報工の人は自分の好きなエディタやキーバインドがあったりすると思います．

TeXはエディタを選ばないので，vimやvscode，atomなどなんでも書けるため，普段のエディタを使えます．


今回の内容は大学の先生が提供しているTeXのフォーマットを使っているので，git cloneしてください．
https://github.com/takago/pd_report

## MacTexのインストール
```brew cask install mactex```

これでtexshop， TexLiveUtility， Excaliburが自動インストールされます．

TexStudioをダウンロード & インストールでも良いですが，若干重いかもしれないため，自分の好きなエディタで書くことをおすすめします．

先程のgitリポジトリの中身はabstractディレクトリが予稿，paperディレクトリが本稿です．

提供されているフォーマットではすでにいくつかのプラグインが導入されています．

上記のリポジトリでコンパイルに必須なものはlistingsパッケージのはずです．

それはこちらからダウンロードできます．
https://ctan.org/tex-archive/macros/latex/contrib/listings

ダウンロードしたディレクトリにはおそらく以下のファイル類が入っています．

* .sty スタイルファイル(パッケージの本体)
* .ins インストーラ (sudo latex ○○.ins)
* .dtx

基本的にはzipを展開したディレクトリをそのまま
```/usr/local/texlive/texmf-local/tex/latex/local/```
に移動すれば大丈夫です．

その後に

```sudo mktexlsr```

を実行することで，パッケージのリストを更新し，使用することができます．

パッケージはTeXファイルの先頭などに```\usepackage{○○}```とすることで利用できます．
提供されているフォーマットではすでにスタイルファイルもしくはクラスファイルに記述されています．

また，「髙」などの特殊文字を書くにはotfパッケージを入れる必要があります．
otfstableはこちらにあります．
<http://psitau.kitunebi.com/otf.html>

## TeXの段落について
TeXで段落を分けたいときは空行をいれる

段落をわけずに(インデントせずに)改行したいときは文末に```\\```をつける

改ページしたいときは```\newpage```をつける


## TeXのコンパイル
上記のリポジトリにはMakefileがあります．
しかし，僕の環境では動かなかったので，今はこちらを使っています．

```Makefile
all:
        ptex2pdf -s -l -ot '-synctex=1 -halt-on-error -file-line-error' main.tex
        ptex2pdf -l -ot '-synctex=1 -halt-on-error -file-line-error' main.tex
        rm -fr qt_temp.* *.synctex.gz *~ *.aux *.log *.dvi *.lol
        latexmk -c
pdf: all
        dvipdfmx -v -O 3 main.dvi
distclean:
        latexmk -C
```
abstractやpaperのディレクトリ内にMakefileを作り，そこでmakeしてください．

これでもコンパイルできないときはパッケージが足りていない可能性もあるので，適宜エラーを確認してください．

## 図や表の入れ方

* 図の入れ方
abstractではこんな感じです．

```
\begin{Figure}
	\centering
	\includegraphics[width=\linewidth]{fig/○○.pdf}
	\captionof{figure}{タイトル}\label{ラベル名}
\end{Figure}
```

図を参照するときは```\ref{ラベル名}```とすることで，番号を意識することなく，文章を書くことができます．

番号の割り当てはTeX側がやってくれます．

本稿ではこんな感じです.

```
\begin{figure}[htbp]
	\centering
	\includegraphics[width=3.5in]{chap/fig/~.pdf}
	\captionof{figure}{title}\label{label Name}
\end{figure}
```
[htbp]は図を入れる場所の優先順位の指定です．

* h: here,　その場に入るサイズであれば入れる
* t: top, ページのトップに入れる
* b: bottom, ページの下部に入れる
* p: page, 次のページに入れる

コンパイル時に最初にhereを試し，無理ならtopに．．．
みたいな感じで適宜配置されます．

### 数式の書き方

```
\begin{eqnarray}
	\label{ラベル名}
	T_h=3600・\frac{V_2・Q}{W_N+W_S}
\end{eqnarray}
```
例えばこう書くとこんな感じになります．
<img width="541" alt="スクリーンショット 2017-12-22 4.49.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/79967/3415a1df-fc29-df0c-703f-178273977cf0.png">

自動で数式番号を式のいい感じの位置に配置してくれます．
(wordではかなり苦労しますよね...)

当然，数式も```\ref{ラベル名}```とすることで文章中で参照できます．

### 参考文献の書き方
main.texの最下部に追加していく．

```
\begin{thebibliography}{99}
\bibitem{本1(自由に変更)}
\bibitem{本2(自由に変更)}
      .
      .
      .
\end{thebibliography}
```
上記で追加したものを呼び出すときは```○○は~~とされている\cite{本1}．```のように書くことで，自動的に番号が振られます．

TeXの基本はこんな感じだと思います．

それでは，皆さんもwordで消耗しないTeXライフを送ってください！
Wio LTEにGrove Co2センサーを繋げる

Co2の濃度が測れるCo2センサーがGroveのモジュールとして売られています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/a6f56366-c7d1-0bd5-47ee-669de26c76ac.png)

このCo2センサーをWio LTEに接続して、値を取得してみたいと思います。
だがしかし、事前にスペックを確認したら単純には繋げられませんでしたので接続方法を紹介します。

#Co2センサーの電源
[スペック](https://www.seeedstudio.com/Grove-Carbon-Dioxide-Sensor%28MH-Z16%29-p-1863.html)を確認すると電源電圧が4.5～6Vと書いてあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/9abbe713-e9a8-afad-6fff-28c908cd036b.png)

Wio LTEのGroveコネクタから出力されているのは3.3Vなので、そのまま繋げても動きません。
USBの電源が5Vなので、それを電源として扱うための基板を作りました。
こんな感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/fce4c94c-dcd8-49b9-3a33-fcc0e70c009b.png)

Groveのモジュールとマイコン間に入れて使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/a3f1819c-236e-7fba-8fa7-2cb1c477799e.png)

ちなみにCo2センサーはシリアル（UART）でWio LTEと通信します。この信号のレベルは3.3Vとなってました。それなので信号線はそのまま繋げています。
（Wio LTEに搭載されているマイコンは５Vトレラント入力対応なので、信号レベルが5Vだとしてもそのまま繋げられます。）

#プログラム
プログラムは[Co2センサーのWikiページ](http://wiki.seeed.cc/Grove-CO2_Sensor/)にあるものを参考に作りました。Co2センサーから取得したCo2値と温度をコンソールに出力します。

```Arduino
#include <WioLTEforArduino.h>
#include <WioLTEClient.h>
#include <stdio.h>

HardwareSerial* Co2SensorSerial;
const unsigned char cmd_get_sensor[] =
{
    0xff, 0x01, 0x86, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x79
};

unsigned char dataRevice[9];
int temperature;
int CO2PPM;

void setup() {

  Co2SensorBegin(&Serial);

};

void loop() {

  if(dataRecieve())
  {
      SerialUSB.print("Temperature: ");
      SerialUSB.print(temperature);
      SerialUSB.print("  CO2: ");
      SerialUSB.print(CO2PPM);
      SerialUSB.println("");
  }
  delay(1000);
};


void Co2SensorBegin(HardwareSerial* serial)
{
  Co2SensorSerial = serial;
  Co2SensorSerial->begin(9600);
}

bool dataRecieve(void)
{
    byte data[9];
    int i = 0;

    //transmit command data
    for(i=0; i<sizeof(cmd_get_sensor); i++)
    {
        Co2SensorSerial->write(cmd_get_sensor[i]);
    }
    delay(10);
    //begin reveiceing data
    if(Co2SensorSerial->available())
    {
        while(Co2SensorSerial->available())
        {
            for(int i=0;i<9; i++)
            {
                data[i] = Co2SensorSerial->read();
            }
        }
    }

    for(int j=0; j<9; j++)
    {
        SerialUSB.print(data[j]);
        SerialUSB.print(" ");
    }
    SerialUSB.println("");

    if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7]))) != data[8])
    {
        return false;
    }

    CO2PPM = (int)data[2] * 256 + (int)data[3];
    temperature = (int)data[4] - 40;

    return true;
}

```

実行した結果は、こんな感じです。息を吹きかけるとCo2が上がっていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/7523f86c-a924-b43f-d4aa-7a1d6559000d.png)
GitHub Identiconでライフゲームする-その1~Identiconについて~

# はじめに
4記事目になりました。(下書きに置きっ放しでだいぶ遅くなってしまった。。)
超離散のお話は一旦休憩。~~時間があれば戻ります。~~
2回分くらい使って、GitHubの初期Iconでライフゲームする(予定)。
本稿では、GitHubの初期Iconがどのように生成されているのかを紹介します。

# Motivation
Icon変えたいなーと思っていたらこんな記事を見つけたので、MacUserの自分にも動かせるように作ろうと...
([GitHub の自動生成されたユーザーアイコンでライフゲーム](http://pronama.azurewebsites.net/2015/09/19/game-of-life-of-identicon/))
ちなみに, JavaFXで作る予定です。

# Identicon
GitHubの初期IconはIdenticonというものだそう。
https://github.com/blog/1586-identicons
まず、Identiconとは何なのか。
>From Wikipedia:
>An **Identicon** is a **visual representation** of a **hash value**, usually of an IP address, that serves to identify a user of a computer system as a form of avatar while protecting the users' privacy.

つまり、IPアドレスなんかの個々を識別するための値を、可視化したもの。こんなのです。↓
![identicon](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Identicon.svg/300px-Identicon.svg.png)


# GitHubのIdenticon
自分のIconはGitHubの初期Iconから変えていないので、これもIdenticon。
![14970374.png](https://qiita-image-store.s3.amazonaws.com/0/137522/2cbec359-8b9b-ff2d-1e62-84c58ace42fd.png)
GitHubのIdenticonは、正方形を$5\times5$に並べたもの。
色のついた正方形をおく場所と、その色によって差別化が図られています。

## 生成方法
GitHubのIdenticonは以下の方法で生成されている(らしいです)。
1. GitHubのUserIDをMD5([wikipedia](https://ja.wikipedia.org/wiki/MD5))で128bitのHash値に変換。
(UserIDは http://caius.github.io/github_id/ でわかります。)
2. 形を決める。左右対称なので、左から3列目までを決めればよい。3→2→1列目の順で上から下に、変換後の先頭15文字の偶奇で決める(偶数ならそこに色をつける)。
3. 128bitの末尾 7 文字を使って色を決める。
(詳しくは http://blog.atgw.jp/archives/3025)

## ちなみに...
GitHubのIdenticonは

```
https://identicons.github.com/(User名).png
```

に残っているそうです。Iconを変えてしまった人は、お試しあれ。
Android版のプライムビデオアプリでプライム会員の認証されない時の原因と対処方法

# はじめに
年末年始となってきましたね。
そろそろ寝正月の準備をしようと思いAndroid版プライムビデオアプリの準備をしていたら
プライム認証にハマってしまったのでTipsを残しておきます。

## やること
Android版のAmazonプライムアプリでプライム会員の認証を行うこと。

## 必要なもの
* Android版プライムアプリが入っているAndroid端末
* Amazonプライムの「ID/PW」

## 原因
Android版のAmazonプライムアプリでプライム会員の認証を行うことができませんでした。
原因は古いパスワードでAmazonへのログインをしていたことです。
そのため、正しくプライム会員として認証されておりませんでした。

私の場合プライム会員のアカウントに２種類のパスワードが紐付いておりました。
・ 古いパスワード
・ 新しいパスワード


私がはじめにログインで使用したパスワードは古い方のパスワードでログイン処理をしていました。
その結果、動画詳細ページに移動するとプライム会員のアカウントなのにプライム会員登録を要求されてしまいました...

**トップページ （トップページではプライム会員であるか判定しにくい ><）**
![プライム非会員ページ.png](https://qiita-image-store.s3.amazonaws.com/0/56169/8f844e37-9623-78a0-1d7b-b574cdca4480.png)

**動画の詳細ページ (あれ…プライム会員じゃない？？)**
![プライム非会員_ページ2.png](https://qiita-image-store.s3.amazonaws.com/0/56169/27484014-8353-4059-f0a4-5eabbc8d71f8.png)

## 解決方法
新しい方のPWでログイン処理をすることでプライム会員として認証されます。
私の場合、これで無事プライム会員として動画を見ることができました。
(「ゆゆゆ」がトップページに表示されてますね＾＾)

もし、私の行った処理でログインできない場合はプライム会員に紐付いているアカウントのパスワードを変更して再度アプリからログインしてください。


![プライム会員ページ.png](https://qiita-image-store.s3.amazonaws.com/0/56169/ba72f468-fec6-85b0-9389-13394db10297.png)


# 最後に
この解決にはAmazonのコールセンターにかけた電話代がかかっております。
また、その際のやり取りとコールセンターでの教えてもらった対策方法についてお伝えしておきます。
（午前２時でも対応してくれます。常識的におかしいよ...）

## コールセンターでの本人確認方法
1. アカウントID（登録されているメールアドレス）
2. 郵便番号から住所
3. 名前
4. SMSに送られてくるワンタイムパスワードの読み上げ

## 指示されたこと
本人確認後、以下の指示を受けました。
1.アプリ版でエラーが発生しているのか
→　渡しの場合はエラーコードを吐いておりませんでした。


2.プライム会員に紐付いているパスワードの変更
→ コールセンターのお兄さんの指示ではプライム会員のアカウントのパスワードを変更して
Android版のプライムアプリで再ログインしてくださいとのことでした。

予想ですが正しいパスワードを入力してもらうよりもパスワードを変更した方が
手っ取り早いと思われます。


## コールセンターのお兄さんへ
対応ありがとうございました。
深夜２時の対応でもしっかり答えてくれました。
このお陰で無事に、プライム会員の認証を行うことができました。

以上となります。
rosparam.get_param()でプライベート参照ができない

# 問題
pythonでパラメータを扱う時に，プライベート参照("~param")ができなかった．

### launchファイル


```*.launch

<node pkg="hoge" name="fuga" type="foo.py">
 <param name="~parameter" value="1" />
</node>
```

### pythonファイル

```foo.py
rosparam.get_param("~parameter")
```
だとエラーが出る．

# 解決方法
***rospy.get_param()*** を使う.

```foo.py
rospy.get_param("~parameter")
```

# おわりに
`rospy.get_param`ではなく`rospy.get_param()`を使用する．
dockerをbuildする際のMakefile

# はじめに

この記事は[MicroAd Advent Calendar 2017](https://qiita.com/advent-calendar/2017/microad)の21日目の記事です。

個人用でDockerイメージをビルドする場合はdockerhubに連携すればチョロで終わるんですが、仕事用だとプライベートレジストリにPushする必要があったり、タグを色々つけたりと何かと面倒が多いです。

ということで、ビルド手順をMakeでラップすることが多いのですが、そんなMakefileの一例のご紹介です。

## Dokerfile

 echoするだけの単純なDockerImageを前提に説明します。

```dockerfile
FROM alpine:3.6

ENTRYPOINT ["/bin/echo"]

ARG GIT_REVISION=unkown
ARG GIT_ORIGIN=unkown
ARG IMAGE_NAME=unkown
LABEL git-revision=$GIT_REVISION \
      git-origin=$GIT_ORIGIN \
      image-name=$IMAGE_NAME
```

ARGとLABELをつかってビルド時に情報埋め込んでます。
イメージの出処をわかりやすくするのが目的です。LABELの値はロギング・ドライバを通じてfluentdに渡せるので、いつのリビジョンでなんのイメージのログか？という情報が集約した際にわかりやすくなります。
ちなみに、Docker公式ではラベルには自分達のドメインのFQDNの逆順に名前空間を切って命名すること推奨しているのですが、私の場合Hiveにログを突っ込むケースがあるため、カラム名＝ラベル名にドットを入れたくないという事情があり、推奨とは反したラベル名にしています。

## Makefile

```makefile
NAME         := echo
REVISION     := $(shell git rev-parse --short HEAD)
ORIGIN       := $(shell git remote get-url origin)
TAGS         := $(REVISION)
RELEASE_TAGS := $(REVISION) 3.6 production
REGISTRY     := your.docker.registry.local
USER         := yourspace

.PHONY: build
build:
	docker build \
		--build-arg GIT_REVISION=$(REVISION) \
		--build-arg GIT_ORIGIN=$(ORIGIN) \
		--build-arg IMAGE_NAME=$(REGISTRY)/$(USER)/$(NAME) \
		$(addprefix -t $(REGISTRY)/$(USER)/$(NAME):,$(TAGS)) .

.PHONY: push
push:
	@for TAG in $(TAGS); do\
		docker push $(REGISTRY)/$(USER)/$(NAME):$$TAG; \
    done

.PHONY: release
release:
	@make build TAGS="$(RELEASE_TAGS)"
	@make push  TAGS="$(RELEASE_TAGS)"
```

MakefileではDockerで定義しているARGにビルド情報を渡しています。
また複数のタグをつけれるようにします。
gitのリビジョン、メインとなるミドルウェアのバージョン（3.6）、リリース用のエイリアス(production)でタグをつけることが多いです。
dockerのイメージタグをTAGSとRELEASE_TAGSで２箇所定義している理由としては、CI実行時においてテスト時はリビジョンタグのイメージのみをビルド、プッシュ、テストをして問題なければ、リリース時にリリース用のタグを諸々つけてビルド、プッシュする、みたいなのを実現するためです。

# おわりに

以上、こんな感じでDockerビルドしています。
Devise でフレンドリーフォワーディング

Devise を使用するとログインした時にログイン前に開いていたページに戻る、いわゆるフレンドリーフォワーディングと呼ばれる機能が最初からある程度有効になっているようだが、 Ajax -> JS のコンボでログインページにリダイレクトしたりすると効かなくなることがある。
解決法は[公式 wiki ](https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update)に書かれてる。

```rb:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :store_user_location!, if: :storable_location?
  # store_user_location!はauthenticate_user!より前に呼び出されている必要がある。
  before_action :authenticate_user!

  private

  def storable_location?
    # Turbo Framesを使う時はコメントを反転させる。
    request.get? && is_navigational_format? && !devise_controller? && !request.xhr?
    # request.get? && !turbo_frame_request? && is_navigational_format? && !devise_controller? && !request.xhr?
  end

  def store_user_location!
    store_location_for(:user, request.fullpath)
  end

  def after_sign_in_path_for(resource_or_scope)
    stored_location_for(resource_or_scope)
  end

  # ログアウトした時もフレンドリーフォワーディング
  def after_sign_out_path_for(resource_or_scope)
    stored_location_for(resource_or_scope)
  end
end
```
rsyslogのアクション指定'*'について

# 経緯
仕事でちょくちょくサーバ構築を行っているが、rsyslogの設定の一部に(多分RHEL7.4系から？)警告(warn)が出るようになっていたのでメモ

# 環境
- OSはRHEL7.4系

# 事象
rsyslogの設定について、「とりあえずpriority='emerg'ならオンラインの全ユーザに通知する」を設定するため、以下を/etc/rsyslog.confに記述したところ、変な警告が出てきた。

```:/etc/rsyslog.conf
## <facility名>.<priority>  <action> のフォーマットで記述する
*.emerg   *
```

出てきた警告は以下。

```:console画面
# systemctl status rsyslog -l
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since 金 2017-12-22 01:04:58 JST; 32s ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 2593 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           mq2593 /usr/sbin/rsyslogd -n

12月 22 01:04:58 [host名] systemd[1]: Starting System Logging Service...
12月 22 01:04:58 [host名] rsyslogd[2593]:  [origin software="rsyslogd" swVersion="8.24.0" x-pid="2593" x-info="http://www.rsyslog.com"] start
12月 22 01:04:58 [host名] rsyslogd[2593]: action '*' treated as ':omusrmsg:*' - please use ':omusrmsg:*' syntax instead, '*' will not be supported in the future [v8.24.0 try http://www.rsyslog.com/e/2184 ]
12月 22 01:04:58 [host名] systemd[1]: Started System Logging Service.
12月 22 01:04:58 [host名] rsyslogd[2593]: error during parsing file /etc/rsyslog.conf, on or before line 57: warnings occured in file '/etc/rsyslog.conf' around line 57 [v8.24.0 try http://www.rsyslog.com/e/2207 ]
```

なんか最後の行見ると構文エラーちっくな事が書いてあるな…と思いふと上数行を見ると、気になる一文が。

```
action '*' treated as ':omusrmsg:*' - please use ':omusrmsg:*' syntax instead, '*' will not be supported in the future
```

actionに'\*'を使うのは将来未サポートになるから'omusrmsg:\*'という記述にしてくれ、とのこと。

# 対応
素直に言われたとおりにaction部分の'\*'を'omusrmsg:\*'に変更したところ、警告が出なくなった。あっさり。

# omusrmsgとは？
「User Message Output Module」の略(多分)で、ログイン中ユーザのコンソールに通知を行うためのビルトインモジュールらしい。
ユーザを指定するactionを定義する場合は、omusrmsg:の後にユーザ名を指定するかアスタリスクを指定する必要がある。

```:例 
#root,user1,user2のコンソール画面に出力する
:omusrmsg:root,user1,user2   
```

# 補足
いつからこの仕様になったのかは正直良く調べていないが今のところは'\*'のままでも警告が出るだけで動きはする

- 上記の出力結果でも一応active(running)となっており、rsyslog自体は動いているっぽい

# 参考
[RHEL7.1 を rsyslog サーバとして動かす方法！](https://blog.neoflow.jp/server-implementation/rhel-7-1/1177/)
[User Message Output Module](http://www.rsyslog.com/doc/omusrmsg.html)
Uniposを導入してみてわかった４つのこと。

Classiアドベントカレンダー22日目は、人事の三戸です。組織が大きくなってくると必ず起こるのがコミュニケーション問題。今回は、感謝をきっかけに気軽にコミュニケーションが取れるUniposというツールを導入してみてわかった４つのことをご紹介します。

##Uniposとは

ピアボーナス（成果給）を「感謝」と共に従業員同士で贈り合うことのできるツールです。
少額の成果給の一部をポイントという形で贈り合うことができ、日頃の仕事の成果や、会社の行動指針に沿った良い行動に対して、従業員同士が成果給（ポイント）と「感謝」の言葉をリアルタイムに贈り合うことができます。そして、それぞれの「感謝」の言葉はタイムラインで全従業員に共有される仕組みになっています。

※[Unipos](https://unipos.me/ja/)
##導入するに至った経緯
Classiは、2014年4月に設立。来春で４期目を迎えるBenesseとSoftBankのジョイントベンチャーです。
十数名でスタートした小さな組織は、今や各社出向社員とClassi社員、外部のパートナーと合わせて100名を超える大所帯に！そんな中、以下のような声があがり導入することになりました。

***・人が増えて、会社が大きくなっていく中で、誰が何をしているのか、そしてどんな成果を上げているのかリアルタイムで分からない。***

***・成果は表には見えにくい、でもすごく重要な働きをしてくれているメンバーもいる。そんなメンバーにもスポットをあてたい！***

***・忙しい時も「感謝」をし合えるチームでありたい！***

##導入して二週間、その間にやったこと。
どんな使い方をされるのか、またどんな反応があがってくるのか全くイメージが湧かなかったので取り敢えずやってみよう！ということでスタート。

１、まずは、プロローグページを作成。
Uniposの紹介と導入目的、どんな時に投稿するのか？などの説明と、いろんな機能があるのでその使い方などがプロローグに記載できます。これを見ればUniposが何なのか瞬時にわかるようになっています。内容は、企業ごとにカスタマイズ可能です。
![スクリーンショット 2017-12-22 0.13.01.png](https://qiita-image-store.s3.amazonaws.com/0/223776/7489e506-2e72-8cdb-f1ce-092f1e5a1f1d.png)

２、従業員をUniposに招待。
slack連携しているので、従業員のアカウント発行がとても簡単です。一瞬でできます。また、対象者を選択して招待することもできます。

３、「感謝」と共にポイントを贈り合う。
Uniposとslack上で投稿、閲覧できます。日常的に使っているツールとの連携のおかげで、抵抗も少なく、徐々に投稿が増えて勝手に盛り上がっていきます。
![スクリーンショット 2017-12-22 0.36.59.png](https://qiita-image-store.s3.amazonaws.com/0/223776/727d7b32-2976-13e3-99ec-86d123cc8e5c.png)
以上。。。（とっても簡単！）

##Uniposを導入してみてわかったこと。
**１、運営サイドは全く手がかからない。**
最初のプロローグをしっかり作り込めば、それをもとに勝手にいじり始めてくれます。問い合わせは殆どありません。
![スクリーンショット 2017-12-22 0.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/223776/ad8e9dbf-56ec-1c19-921f-35ea04671485.png)

**２、「感謝」が可視化される。**
感謝をポイント共に贈るので、誰が何をしたのかが分かりやすい。また、第三者も「拍手」といった形で賞賛することができます。（Facebookの「いいね」のようなリアクションが可能。発信者、受信者に拍手の数だけポイントを付与することができます。）
感謝に対してポイントの数が増えていく様子が見て取れるので、貰った側はとても嬉しい気持ちになります。

**３、「感謝」が伝染する。**
徐々に投稿が増え、感謝をされた人はなぜか感謝のお返しをしたくなります。Happyの好循環が生まれます。

**４、目立つ人ではなく、ストーリーにスポットがあたる。**
感謝の内容に対して拍手を送れる仕様になっています。なので、贈る側は賞賛に値する人を見つけようとする思考が自然と生まれ、何に対して感謝をしているのかをしっかり明記し始めます。
![スクリーンショット 2017-12-22 1.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/223776/7b8ce181-e761-da1f-5dcb-69cbcb7bccdb.png)
![スクリーンショット 2017-12-22 1.08.23.png](https://qiita-image-store.s3.amazonaws.com/0/223776/2c7ae9dc-b8f9-5ee3-180a-b0c84388afe8.png)
![スクリーンショット 2017-12-22 1.03.30.png](https://qiita-image-store.s3.amazonaws.com/0/223776/a0ad293b-4d33-cc49-2c4a-acc4d865a5f6.png)

##最後に
想像以上の利用頻度で正直驚いています。

要所要所に投稿しやすい仕掛けがあり、それでいてシンプルなのでとても使いやすい仕様になっています。個人的には気に入っています。また、使いながら自分たち流の使い方を見つけていく流れができ始めているのが面白いなぁと感じています。

何でも急激な変化があるときは、それに伴い少なからず綻びが生じます。その綻びを「感謝」という形で埋めることができるUniposは組織課題を解決する新たな手法の一つになりそうな予感がしました。
debug用に全てのActivityに飛ぶ画面を作った

アプリのデバッグ時に、特定の画面に遷移したい時がありました。
いちいちソースコードを書き換えたり、何度も画面の操作をすることがめんどくさいです。
そこで、Manifestに登録されているActivityを自動で取得し、Listに並べ、タップするとその画面に飛ぶ物を作りました。


以下にソースコードを貼っておきます。
## ソースコード

```DebugActivity.java
package com.test.gao.debug;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

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

public class DebugActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_debug);
        ListView listView = (ListView)findViewById(R.id.listView);

        PackageInfo pInfo = null;
        try {
            // activity一覧を取得
            pInfo = this.getPackageManager().getPackageInfo(this.getPackageName(), this.getPackageManager().GET_ACTIVITIES);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        List<String> list = new ArrayList<>();
        for (ActivityInfo activityInfo : pInfo.activities){
            // ライブラリなどのactivityは表示しないように比較
            if (activityInfo.name.contains(getPackageName())) {
                // activity名のみ取得できるようにsplit
                String activityName = (activityInfo.name.split(getPackageName()+".", 0))[1];
                list.add(activityName);
            }
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                String activityName = (String)parent.getItemAtPosition(position);
                try {
                    // パッケージ名を追加してclassを指定
                    Class myClass = Class.forName(getPackageName()+"."+activityName);
                    Intent intent = new Intent(getApplicationContext(),myClass);
                    startActivity(intent);

                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        });

    }
}

```

```activity_debug.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</LinearLayout>
```