OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのプログラミングコンテスト

※ これは、[こどもとプログラミング Advent Calendar 2018](https://adventar.org/calendars/3163) の[16日目](https://adventar.org/calendars/3163#list-2018-12-16)の記事です。

# 発表させたい（はっぴょうしよう）

CoderDojo Anjo （愛知県安城市）では、「つくろう！かんがえよう！はっぴょうしよう！」を標語に掲げ、小学生・中学生・高校生を対象としたプログラミング道場（Dojo）を定期開催しています。各回の最後に発表の時間を設けて、ニンジャーたち（参加者）がプログラミング作品を発表しています。
2018年10月から12月にかけて、ニンジャーたちに「コンテストに応募しよう！！」と声をかけてみました。私自身も親の願いとして、小学2年生の息子にもコンテストに応募させたく、3か月間をかけて、それとなーく製作に取り組むように、しむけてみました。
![CoderDojo名刺201711(おもて).png](https://qiita-image-store.s3.amazonaws.com/0/252891/dfbabdaf-0baf-54ff-5ca1-4801bda67621.png)
> CoderDojo は7〜17歳の子どもを対象にしたプログラミング道場です。2011年にアイルランドで始まり、世界では100カ国・1,900の道場、日本では全国に161以上の道場があります。(引用：[CoderDojo Japan](https://coderdojo.jp/))

# 組み合わせたり、リミックスしたり
「じゃ、テーマを考えて、作ってみて！」と言っても、テーマなんて考えられないし、作りたいモノもスグには思い浮かびません。普段でも、そうですが、自分のテーマを持って Dojo に参加するニンジャーは少ないです。毎回、季語などからキーワードを２つ選んでもらい、それらを組み合わせて、なんとなくテーマっぽいことを考えてもらっています。そうすると、発表作品にもテーマがなんとなく表現されてくるわけです。
それと、プログラミングの良いところは、そのソースコードを共有できるところです。そうすると、それをまた、改変し、再頒布することができます。これはオープンソースとして世界的に広く普及していますよね。Dojoでよく利用する Scratch にもこれがリミックス機能として用意されていますので、「シューティングゲームってどうやって作るの？」とか「ジャンプさせたいんだけど？」、「横スクロールさせたい」などのニンジャーの質問・要望に対して、「他の人の作品を見てみよう！」っていうことで、 Scratch で検索して、それをリミックスしたり、部分的にソースコードを参考にしたりしています。

# 工作（つくろう）
ここで作ろうとしているものは段ボールのmicro:bitベルトです。プログラミング開発でもプロトタイプを作ったりすることがありますよね。まずは、新聞の折り込み広告チラシで、プロトタイプの作成です。ベルトとベルトのバックルをハサミとのりとで切り貼りして作ってみました。
![48387806_1260345780783488_8644506626851602432_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252891/2587d612-95a7-39a6-423e-2c17c6a7362d.jpeg)
でも、実際にベルトとして腰に装着してみると、バックルが千切れてしまいました（写真はバックルの切り込みを入れているところ）。

# 工夫（かんがえよう）
バックルが千切れる失敗で、ベルトのバックル強度不足が明らかになりました。もっと強度のある構造はないかと、図書館にある工作の本を何冊か調べました。その中に「サン・サン・サンバイザー」の作り方があったので、試しに空き箱を壊したボール紙でサンバイザーを作ってみました。
![48375640_1260345844116815_6860282581078769664_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252891/d9283f83-3750-0bdc-ddab-dcac9886648e.jpeg)
作ってみたところ、このサンバイザーの構造がベルトのバックルにも使えそうですので、採用しました。

# 完成（micro:bitベルト）
![48355361_1260345880783478_3277843526192201728_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252891/6ec3d061-ebb9-aa0e-739d-fc475a6e3636.jpeg)
いよいよ、段ボールでの製作に取り掛かりました。腰に巻き付けられる長さに段ボールをカッターナイフでギコギコと切っていきました。実はボール紙より段ボールの方が柔らかくて切りやすいようです。
そして、micro:bitを入れるポケットとベルトのバックルを作って完成です。
![48376018_1260345924116807_3426413432872632320_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252891/998d8d73-76f8-5aca-b6ca-6c69564c0f47.jpeg)
![48366823_1260345954116804_7212377514604232704_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252891/7422d889-fef8-e099-4d9a-facac04fea5b.jpeg)

# 最後に
「おぃ、コンテストの話はどうなった！？」と思われるかもしれませんが、現段階で、プログラミングには全く手を付けていません。母親に「何をつくったの？」と聞かれ、息子は「わからん」と答えていました（サン・サン・サンバイザーとmicro:bitベルトを作ったジャン・・・）。
でも本当は、プログラミング作品のアイデアがあって、そのためのmicro:bitベルトなんですよ。
（コンテストへと、つづく・・・）
AOSPをビルドするのにopenstf/docker-aospを使ったら便利だった

# AOSPをビルドするのにopenstf/docker-aospを使ったら便利だった
以前 [AOSP環境構築 [備忘録]](https://qiita.com/natmark/items/09802c7f16733cd77f8e) という記事を書いたのですが、AOSPをビルドするのに用意しなければいけないものが多く、Dockerでビルドしたいと思っていたところ [openstf/docker-aosp](https://hub.docker.com/r/openstf/aosp/) が便利だったので、その紹介をしたいと思います。

## checkout-branch (repo sync)
`android9.0.0_r1` をダウンロードする場合、下のように利用できます。

```zsh
docker run -ti --rm -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v $PWD:/aosp -u $(id -u $USER):$(id -g $USER) openstf/aosp:jdk8 /aosp.sh checkout-branch --no-mirror android-9.0.0_r1 -j32
```

上の例では `openstf/aosp` に `jdk8` というタグを指定していますが、この部分は下の対応表に沿って対応したものを選ぶようにします。

| Branch | SDK | Docker image to build with |
|:--|--:|:--|
| android-2.3_r1 | 9 | openstf/aosp:jdk6 |
| android-2.3.3_r1 | 10 | openstf/aosp:jdk6 |
| android-4.0.1_r1 | 14 | openstf/aosp:jdk6 |
| android-4.0.3_r1 | 15 | openstf/aosp:jdk6 |
| android-4.1.1_r1 | 16 | openstf/aosp:jdk6 |
| android-4.2_r1 | 17 | openstf/aosp:jdk6 |
| android-4.3_r1 | 18 | openstf/aosp:jdk6 |
| android-4.4_r1 | 19 | openstf/aosp:jdk6 |
| android-5.0.1_r1 | 21 | openstf/aosp:jdk7 |
| android-5.1.0_r1 | 22 | openstf/aosp:jdk7 |
| android-6.0.0_r1 | 23 | openstf/aosp:jdk7 |
| android-7.0.0_r1 | 24 | openstf/aosp:jdk8 |
| android-7.1.0_r1 | 25 | openstf/aosp:jdk8 |
| android-8.0.0_r1 | 26 | openstf/aosp:jdk8 |
| android-8.1.0_r1 | 27 | openstf/aosp:jdk8 |
| android-9.0.0_r1 | 28 | openstf/aosp:jdk8 |

`/aosp.sh` というスクリプトファイルが用意されていて、
`/aosp.sh checkout-branch --no-mirror android-9.0.0_r1 -j32` のようにすることで、ブランチのチェックアウトが可能です。

※dockerでvolumeをマウントした際、作成されたファイルのownerがrootになってしまうのを防ぐため、`/etc/group` と `/etc/passwd` をマウントしています。(参考: [dockerでvolumeをマウントしたときのファイルのowner問題](
https://qiita.com/yohm/items/047b2e68d008ebb0f001#%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8F%E6%96%B9%E6%B3%952--etcpasswd%E3%81%A8etcgroup%E3%82%92%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AB%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B))

## build-all
```zsh
docker run -ti --rm -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v $PWD:/aosp -u $(id -u $USER):$(id -g $USER) openstf/aosp:jdk8 /aosp.sh build-all aosp_x86-eng -j32
```

ビルドも `/aosp.sh build-all aosp_x86-eng -j32` のように実行できます。

## openstf/docker-aospでできること
- `create-mirror [sync-options]`
    - AOSPのミラーを作成
- `checkout-branch [--no-mirror] <branch> [sync-options]`
    -  指定したブランチをチェックアウト、ミラーを利用しない場合[--no-mirror]オプションを付ける
- `build-all <target> [make-options]`
    - 全てのモジュールをビルド
- `build <target> <local-module> [make-options]`
    - 指定したモジュールをビルド

紹介した `checkout-branch` と `build-all` 以外にも上のような機能があります。

詳しくは、`docker run -ti --rm openstf/aosp:jdk8 /aosp.sh help` を確認してください。

## 参考
- https://github.com/openstf/docker-aosp
- https://github.com/openstf/minicap/blob/master/jni/minicap-shared/README.md
よく使うと便利なchrome検証機能！

chromeの検証機能、皆さんご存知でしょうか
このchromeの検証機能を利用すると本当に色々と便利です！
今日はchromeの検証機能について書いてみます！

#chromeの検証機能
一旦chromeの検証機能を利用する方法！
<img width="556" alt="notitle.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/d7ab564d-5178-871e-60a9-bcf0920c6b19.png">
(何で韓国語やねん！:frowning2: 申し訳ないです！)
ネットを開きます→右クリック→一番下の検証をクリックします

##Elements領域
<img width="328" alt="notitle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/7d437ed0-4f51-4ac2-6807-6b5828f23e1c.png">
検証機能で右にタブが出て上の方は現在画面のhtml要素が、下には画面のcss要素の確認ができます！
画面を構成してるHTML領域ではクラスやIDをつけたり、要素を修正、追加、削除ができます。下のCSS領域では当然、画面の飾り要素の修正ができます。

<img width="295" alt="notitle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/a42349d3-916b-64b2-78e1-96576bad72d8.png">
こういう風にですね！
右クリックしてもできますし、ダブルクリックとかでもできます！

<img width="329" alt="notitle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/9dd6f557-7217-a26a-c086-2f9147bad6c7.png">
下のcss修正では、今画面に見えてる要素のcss属性、それと:hovボタンをクリックして選択した要素のactive,hoverなどなどの飾り要素の確認ができます！今適用されているcssの修正はもちろん、追加、削除もできます！

これが、終わりか！

##console領域
<img width="488" alt="notitle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/c0ff8c14-ab2d-db20-644f-75fa45fca64f.png">

ここでは、javascriptで書かれているコンソールログの出力確認、ワーニング、警告などの確認ができます。また、直接javascriptのログも書けます！
スクショのconsole.log('wow')は、自分で書いたやつで、またここで変数宣言、変数の値確認までもできます！

##sources領域
<img width="525" alt="notitle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/ae985f5b-f678-a600-7440-daa8d14908ac.png">
このタブでは今画面を構成しているフロント要素の確認、ソースコードの確認ができます。Elementsのhtml内で呼ばれているjavascriptファイル、cssファイル,imgファイルなどなど、、全体のソース確認ができます。また、デバッグもできます！！

<img width="639" alt="notitle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/6e1661ff-c3f4-3271-4884-16bc64a14387.png">
例えば、こういう風にbreak pointをセットしてリロードすると実行するタイミングに合わせて画面が止まります。何個かを設定するとどの順番で実行されるのかも確認できます。また、ソースコード内にログをセットするとそれもconsole欄に見えるようになります！とても便利！！
あ、マウスを要素の上に置くと要素が持っている値の確認もできます！

##network領域
<img width="432" alt="notitle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/320945/fe3dd4ab-875c-7c8e-a8a0-da01dea82ad0.png">
network要素では、通信状態の確認や容量、かかる時間などの確認ができ、パラメータ、response値などの確認ができます。


じゃーこの検証機能を使って色々なサイトのソースコードを見て勉強したり、いじってみたりと、楽しんでみましょう！

今日の記事はここまでにしますー！
sequelize　ログの出力をやめる


sequelizeではデフォルトでSQLのログが出力される。
初期化時に以下のオプションを付けることで、ログ出力がされなくなる。

```js
var sequelize = new Sequelize(
  database, 
  username, 
  password,
  {
    logging: false
  }
)
```
脚本例子1

AppHa_healthCheck

\#!/bin/bash

LOOP_FLG=true

while \$LOOP_FLG
do
  ret=\`sh ./healthCheck.sh`
  status=\$?
  if [ $status = 1 ]
  then
    LOOP_FLG=false
  fi
  sleep 50
done

exit 0


#pxsctl

\#!/bin/sh

usage()
{
    echo >&2 ""
    echo >&2 " Usage: $0 {start | stop} "
    echo >&2 ""
}

\# Main
if [ $# != 1 ]; then
    usage
    exit 1
fi

EXEC_UNIX_USER=wlsadmin

username=\`id -u -n`
if [ ! \$username = \$EXEC_UNIX_USER ]; then
    echo >&2 ""
    echo >&2 " Executed it by user $EXEC_UNIX_USER."
    echo >&2 " aborting..."
    echo >&2 ""
    exit 1
fi

CHECK_INTERVAL_SEC=10
CHECK_RETRY_TIMES=2
AUTORUN=/shell/autoRun
LOG_FILE=/autoRun/log/log.log

get_log_line()
{
   if [ -s \$LOG_FILE ]; then
      wc -l \$LOG_FILE | awk 'BEGIN {}\
         {\
            len = length(\$0); \
            if ( len > 3 ) {\
            printf "LOG_FILE_LINES=%s ; export LOG_FILE_LINES\n", \$1;
         }\
      }' >> tmptmptmp_$$

      . ./tmptmptmp_$$
      rm tmptmptmp_$$
   else
      LOG_FILE_LINES=0 ; export LOG_FILE_LINES
   fi
}

start_check()
{
    sleep 3
    LOG_LINES_CHECK=\$LOG_FILE_LINES
    get_log_line
    if [ \$LOG_LINES_CHECK -gt \$LOG_FILE_LINES ]
    then
      LOG_FILE_LINES=0
    else
      LOG_FILE_LINES=$LOG_LINES_CHECK
    fi
    
    ###### Check if AUTORUN has exactly started.
    CHECK_CMD="tail -n +${LOG_FILE_LINES} ${LOG_FILE} | grep \"started normally\""
    count=$CHECK_RETRY_TIMES
    while [ $count -gt 0 ]
    do
      sleep $CHECK_INTERVAL_SEC
      eval $CHECK_CMD > /dev/null 2>&1
      if [ "$?" -eq 0 ]; then
        break
      fi
        echo $count
        count=`expr $count - 1`
    done
    ###### "$count==0" means AUTORUN starting-up failed.
    if [ $count -eq 0 ]; then
      echo "Starting AUTORUN failed."
      exit 1
    fi
    ########
    /bin/echo
    /bin/echo "AUTORUN has started!"
}

case \$1 in
'start')
        get_log_line
        /usr/bin/nohup ${AUTORUN}Start.sh > /dev/null 2>&1 &
	;;

'stop')
        ${AUTORUN}End.sh
	;;

*)
	usage
	exit 1
	;;
esac

case \$1 in
'start')
        start_check
        ;;
esac

exit 0
laravelからdynamodbを扱うライブラリ baopham/laravel-dynamodbを使ってみた

これは [laravel アドベントカレンダー#2](https://qiita.com/advent-calendar/2018/laravel-2) の15日目の記事となっています。
まだまだエンジニアとして未熟ですが、書いていきたいと思います。

# baopham/laravel-dynamodbとは

[laravelからdynamodbを扱うためのライブラリ](https://github.com/baopham/laravel-dynamodb) です。
Eloquent互換なので、Eloquentのメソッドなどがそのまま使えたりして便利です。

これをインストールから使い方と雑感までを記します。

__序盤までしかかけていなかったので、一旦公開して追記していこうと思います。__

## 前提

- laravelやDynamoDB-localのインストールやセットアップは終わっている
- ある程度laravelを知っている(formでPOSTとかできるくらい)
- DynamoDBについてはある程度理解している
- `DB_CONNECTION=sqlite`

## 環境

laravel 5.5.28
baopham/laravel-dynamodb 
dynamodb-local ←今回はlocalでのみ検証します。

### インストール

`composer require baopham/dynamodb`
で 持って来ます。
次に `config/app.php` の `providers` に以下を追記します。

```php:config/app.php
'providers' => [
    ...
    BaoPham\DynamoDb\DynamoDbServiceProvider::class,
    ...
];
```

その後、 `php artisan vendor:publish` を実行して、該当のProviderをpublishして利用する準備が整います。

### モデルの設定

`php artisan make:model <モデル名>` を使ってEloquentのモデルを作りましょう。今回は `Memo` というモデルを作ります。

実行したら `app/Memo.php` を以下のように編集します。
(**use部分をライブラリのモデルに書き換えるのを忘れずに！**)

```php:Memo.php
<?php

namespace App;

use BaophamModel¥DynamoDb¥DynamoDbModel as Model;

class Memo extends Model
{
    //テーブル名
    protected $table = 'memo';
    //プライマリキー(今回はメモを書いた人の名前)
    protected $primaryKey = 'user';
    //複合キーの設定(userをHashキー、dateをRangeキーにする)
    protected $compositeKey = ['user', 'date'];
    protected $fillable = [
        'user',
        'date', //Y-m-d H:i:sの形で保存する
        'day', //セカンダリインデックスのために用意。Y-m-dだけを保存する
        'content', //メモの内容
    ];
    //セカンダリインデックスの設定
    protected $dynamoDbIndexKeys = [
        'day_of_memo' => [
            'hash' => 'day'
        ],
    ];
}

```
ものを売るときには写真が大事だよっていう話

初めまして！オークファンのWEBデザイナーの@azneです。
[NETSEA](https://www.netsea.jp/)のデザインを担当しております。
Advent Calendarに参加するということで初めての公開記事です…！

なんかWEBデザインの話は他のデザイナーさんがやってくれるだろーと思うのでｗ
オークファンっぽいことを書いてみようと思います！

[オークファン](https://aucfan.com/)というのはヤフオク!の落札相場を見られるサイトです。
私もヤフオク!やメルカリで「安く買って、高く売る」ことで少しですがおこづかい稼ぎをしています。

売るためには、値付けやタイトルなど色々テクニックがあるのですが、
最近実感した「商品写真」についてお話します！

##とりあえず、写真を撮って出品

こちら、ヤフオク!に出品したドクターマーチンのブーツです。iPhoneのカメラで撮りました。

![IMG_0568.jpg](https://qiita-image-store.s3.amazonaws.com/0/59260/f4ab4ff1-7039-037c-bc8e-f98d1bc15061.jpeg)

![IMG_0569.jpg](https://qiita-image-store.s3.amazonaws.com/0/59260/7492ce29-a705-091e-bf6e-4a5663811850.jpeg)


くたびれたゴム長靴みたいに見えますね…(；´Д`)
自分ではそこそこキレイに撮ったつもりだったのですが、
何度再出品しても閲覧数は一桁、ウォッチリストも0件のまま。。。

##2ヶ月後、写真を撮り直して再出品
全く入札がないので、写真が悪いんだろうということで撮り直して出品しました。
再びiPhoneで撮り直した写真がこちら。

![IMG_1116.jpg](https://qiita-image-store.s3.amazonaws.com/0/59260/b56c0800-73b3-b9ef-c9ab-89f921cfedcd.jpeg)

![IMG_1117.jpg](https://qiita-image-store.s3.amazonaws.com/0/59260/f2a27211-eca6-26bf-5cbd-0083be91ff58.jpeg)

中に新聞紙を詰めて紐も結び直し、角度を変えてみました！
この写真ならブーツのかっこいいシルエットが分かりますね！（ちょっと背景黄色いですが…´∀`;）

この写真で出品した結果、閲覧数は100を超え、ウォッチリストは18件、
1ヶ月未満で落札されました！！ヽ(○´∀｀)人(´∀｀○)ﾉｲｪｰｲ♪

ちなみに写真以外は何も変更してません。
どれだけみんな画像で買うか判断してるかがわかりますね。


##まとめ
売れないのは写真のせいだ！と気づいてからは、角度に気をつけるようになりました。
靴によってカッコイイorカワイイ角度が違うので、メンズならちょっと靴同士を離して置いてみたり、レディースでは近くに置いてみたりして、「その靴を履いて立った姿が想像できるような写真」が撮れるように気をつけてます。

バナーのデザインなどで商品画像を使う際も、その商品が魅力的に見えるかどうか考えて画像を選んだり加工したりするのは大事ですよね！（可愛い女の子を入れてみたりね！）

ここまでお読みいただきありがとうございました！
golangでinterfaceを実装してみる

# はじめに
この記事はLinkbal Advent Calendar 2018の15日目の記事です。
何を書くか悩んだのですが、最近golangでinterfaceの実装をする機会があり、ちょっと調べたことがあったので、ここへ記事にすることにしました。

# 実装する内容
* 図形の面積を計算するものです。(例は三角形と長方形のみ)
* 三角形と長方形の構造体を定義します。
* interface（`Calculator`）には、面積を計算するメソッド(`calculate`)を定義し、定義した構造体のメソッドとして実装します。

# コード

```sample.go
ackage main

import "fmt"

// 計算メソッドを定義するinterface
type Calculator interface {
	calculate() int
}

// 三角形の構造体
type triangle struct {
	base, height int
}

// 長方形の構造体
type rectangle struct {
	height, width int
}

// 三角形の面積を計算する
func (t triangle) calculate() int {
	return t.base * t.height / 2
}

// 長方形の面積を計算する
func (r rectangle) calculate() int {
	return r.height * r.width
}

// Calculator typeを引数として各構造体の計算メソッドを呼び出す
func calculate(calc Calculator) int {
	return calc.calculate()
}

func main() {
	// 初期化
	t := triangle{base: 10, height: 10}
	r := rectangle{height: 10, width: 10}

	// 計算
	fmt.Println("triangle", t.calculate())
	fmt.Println("rectangle", r.calculate())

	// 同じinterface(Calculator)を実装しているので
	// 同じtypeで扱うことができる
	calcSlice := []Calculator{t, r}
	for _, c := range calcSlice {

		// switchで元のtypeに戻せる
		switch v := c.(type) {
		case triangle:
			fmt.Printf("%T", v)
		case rectangle:
			fmt.Printf("%T", v)
		}

		fmt.Println(c.calculate())
	}

	//構造体を直接して、計算を実行する
	fmt.Println("triangle", calculate(t))
	fmt.Println("rectangle", calculate(r))
}
```
実行結果

```
triangle 50
rectangle 100
---------------------------
main.triangle50
main.rectangle100
---------------------------
triangle 50
rectangle 100
```

# おわりに
いかがでしたでしょうか。golangは書き方シンプルでわかりやすいですね。
弊社ではエンジニア採用を強化しております。
golangの他に、RubyやPython、PHPなども利用しています。
ご興味ある方は、ぜひこちらからお問い合わせください。[こちら](https://hrmos.co/pages/linkbal/jobs?category=1130018088029294592)
宮古島がテック企業にとって（エンジニアにも）天国だった話！

これは、Classi AdventCalendar 2018 15日目の記事です。

はじめまして、Classiの広報の辻田です。
実は私、沖縄が大好きなんです。いつか、月の半分を東京で、もう半分を沖縄で過ごしたいと思っているほど。

ということで、先月仕事で行った宮古島が（ホントに仕事です）、テック企業にとって（おそらくエンジニアにとっても）、めっちゃよかったですよという話をご紹介します。

###なぜ、宮古島なのか？

私、いろんな会社の方と会う際に、沖縄Loveの話をするのですが（はい、迷惑ですね）、たまたま、Backlogを提供するヌーラボの人事の方に話をしたのですね。
すると、<b>「宮古島をおススメします！1度ぜひ行ったほうがいいですよ」</b>とのお話。同社では、宮古島にほれ込んだ結果、「リゾートワーク制度」という、宮古島でのリモート就業を支援する社内制度まで作ってしまったとのこと。

「これは、インナーコミュニケーション担当としては、絶対に行かなくては」と思い、宮古島まで行ってきてしまいました。
余談ですが、上司に「宮古島に行っていいですか？」と相談したら、一言「自分の胸に手を当てて考えてみろ！」とのこと（笑）。「これは行くべし」と
勝手に
判断していってきました（ホントいい会社です）。

東京から2,000キロ、沖縄本島からも300キロ離れた、６つの島からなる宮古島。青い海、白い砂浜といった観光地のイメージしかありませんでしたが、実は今、市を上げて、テック企業を歓迎している、とのお話。観光や農業以外の産業として、ITを第3の柱としたいと目論んでいるようです。
![IMG_0376.JPG](https://qiita-image-store.s3.amazonaws.com/0/321977/bcd12377-0ea2-70f8-3a79-baef011b14c2.jpeg)
今回は、市の「IT企業向け視察ツアー」を利用して、訪問させていただきました。もちろん選考はありますが、航空券・宿泊費の補助が出ること（上限あり）、行政としての考え方をわかりやすく説明していただけること（市長表敬訪問なんて時間までありました。）、効率的に各種施設などを視察できること、現地の学校の先生方や生徒との皆さんと交流する時間（EdTech企業としては非常にありがたい）があるなど、1人で訪問しただけでは決してできない経験をさせていただきました。

視察の中で一番印象に残っているのは、来年をめどにオープン予定の「宮古島ICT交流センター（仮称）」。実はここ、平成の大合併で宮古島市となった、旧下地町の庁舎だった場所。シェアオフィスやコワーキングスペース、イベントスペースなどを作る予定で、高速のネット環境やシャワーなども完備。1次的な個人利用などもできるそうなので、ちょっと仕事をというときにも便利です。

![IMG_0374.JPG](https://qiita-image-store.s3.amazonaws.com/0/321977/24fea2eb-65e2-4def-f5e6-78fde8ad6d7c.jpeg)
（センターは旧旧下地町庁舎の3階にオープン予定で、なんと町議会の議会場も残し、イベントスペースになるとのこと）

前述の現地の中学生・高校生との交流の際には、この場所をどういうスペースにしたらいいかをみんなでディスカッションしました。「某外資系コーヒーチェーンをつくったら、ぜったい人が集まると思う。島の人たちと内地の人の交流を加速できるのでは」といった、中学生のアイディアも飛び出すなど、単なる便利な施設という考えだけでなく、島のサードプレイスとしてどのような場にするのか、多くの人からの期待が集まっているようです。
![IMG_0365.JPG](https://qiita-image-store.s3.amazonaws.com/0/321977/bb8228c7-1720-5b90-b782-73115ded4c47.jpeg)
（世界有数の前原ビーチにも近く、このセンターからも海が見えます！）

###宮古島が天国だと思った理由ランキング！
我々のようなテック企業の人間にとって、宮古島がいいと思う理由を勝手にランキングすると・・・。

<b>●３位：目の前に広がる海、空、海岸線！</b>
青い空、青い海、広がる白浜。実際に、海岸で仕事してみましたが、気持ち良すぎて、仕事は全然はかどりません。「自然の中だといいプレスリリースが書けるんです。」と上司に言ったのに・・・。エンジニアの人なら、いいコードが書けるんでしょうか。どちらかというと、デジタルデバイスを脇に置いて、ぼーっと考え事をするのにいいかな、と思いました。企画はいっぱい考えられました。

<b>●２位：田舎過ぎず、都会すぎず・・・。</b>
離島とは言え、緊急時にも安心な総合病院、なんと大手家電量販店、総合スーパーなどもあります。自然を満喫しつつも、リモートワークで緊急時にちょっとしたものが欲しいと思ったときにも安心です。（ちなみに、私はPCのバッテリーを忘れてしまい量販店に駆け込みましたが、さすがになくてiPadで仕事しました・・・。）

<b>●１位：テックで解決できることがたくさんありそう！</b>
宮古島市がITを新たな産業にしたと考えているのは、若者が島を離れてしまうこと。高校卒業後は島を離れてしまう人が多いとのこと（18歳～22歳人口が少ないそうです）。同市は、そんな中、ITを中心とした新たな雇用を創出するべく、さまざまな仕掛けを行っています。協力を得ながら、農業や観光などの産業も、従来のやり方や文化を尊重しつつも、テックをうまく活用することで、課題の解決ができそうなわくわく感がこの島にはたくさんありそうなんです。

###最後に・・・。これから宮古島で何するのか？
実は、宮古島で何ができるのか、私の中でもまだまだ未知数で固まっていないんです。ごめんなさい。
まずは、第一歩として、社内で部活動の「沖縄部」を設立し、宮古島のファンを作ろうかと考えています。
現地の人ともたくさんお酒を飲んで知り合えたので、そこで聞きかじった話をもとに、いろいろとエンジニアのみんなにアイディアをもらおうかと画策中です。うまくいけば、ぜひ来年のアドベントカレンダーで報告したいと思います。

おわり
Django basic auth

[temy13さんの記事](https://qiita.com/temy13/items/1c294c7a284afc946f6b) を参考に少し直したもの。

* python3 で decodestring が使えないと言われたのを修正
* Userデータベースと authenticate メソッドを使ってコードを改善
* 変数の名前をちょっとわかりやすくした

```python
import base64
from django.contrib.auth import authenticate
.....
def _http401():
    response = HttpResponse("Unauthorized", status=401)
    response['WWW-Authenticate'] = 'Basic realm="basic auth username/password inalid"'
    return response


def _basicAuth(request):
    """
    :param request:
    :return: True is authenticated. Otherwise return False
    """
    if 'HTTP_AUTHORIZATION' not in request.META:
        return False
    (auth_scheme, base64_username_pass) = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
    if auth_scheme.lower() != 'basic':
        return _http401()
    username_pass = base64.decodebytes(base64_username_pass.strip().encode('ascii')).decode('ascii')
    (username, password) = username_pass.split(':', 1)
    user = authenticate(username=username, password=password)
    return user is not None


def sample_view_usage(request):
    if not _basicAuth(request):
        return _http401()
    ... 
```
Stringクラスのさまざまなメソッド

#はじめに
Java SE 8 Silver の試験勉強をしているがその際に学んだことをまとめようと思います。

今回はStringクラスのさまざまなメソッドについて整理していきます。

（文字列操作の記事が多いことを反省、、、汗）

##メソッドの種類

試験に出てくる主要なメソッドについてまとめてみました。

|メソッド名|説明|
|:----|:--|
|char charAt(int i)|iの位置にある文字を返す。|
|String concat(String str)|文字列を追加する|
|boolean endsWith(String suffix)|文字列が指定した文字列で終わっていればtrueを返し、異なればfalseを返す。|
|boolean equalsIgnoreCase(String str)|文字列を比較する。大文字小文字を区別することなく。|
|int indexOf(int ch)|実引数に入れた値が最初に出てくる位置を返す。|
|int lastIndexOf(int ch)|実引数に入れた値が最後に出てくる位置を返す。|
|int length()|文字列の文字数を返す。|
|String replace(char o, char n)|文字列中にある文字oを文字nに置換した結果の文字列を返す。|
|boolean startsWith(String prefix)|文字列が実引数に入れた値から始まっていればtrueを返す。|
|String substring(int i)|0 ~ 実引数に入れた値までの部分文字列を返す。（始点を指定できる。）|
|String toLowerCase()|大文字を小文字に変換する|
|String toUpperCase()|小文字を大文字に変換する|
|String toString()|オブジェクトが保持する文字列を返す。|
|String trim()|空白を除去する。（ただし全角のスペース記号は除去しない）|

##動作確認

私自身が理解に苦しんだメソッドについて掘り下げていきます。

・substring()メソッド

文字列を抽出するメソッドについてですが、範囲の指定の仕方を気をつけないと思い通りの出力になりません。

下記がサンプルコードです。

```Main.java
public class Main {

	public static void main(String[] args) {

		String str = "ぶたキムチがありました";

		//解説①
		System.out.println(str.substring(0, 5));

	}

}


```

出力結果

```Main.java
ぶたキムチ
```

解析①
"ぶたキムチ" だけを取り出していますが取り出す際は***1文字目の前に0があること***に

注意をしてください。 0〜5の範囲を示すことで取り出すことができます。


```
　　　　　ぶ  た  キ  ム  チ  が　　　あ　　　り　　　ま　　　し　　　た
　↑ 　　 ↑　　　 ↑　　　 ↑　　　 ↑　　　 ↑　　　　. . . .
　0  　　1  　2  　3  　4  　5
```

あと整理しておきたいのがtrim()メソッドです。

・trim()メソッド

文字列の前後の空白を除去するメソッドとなっております。

そのほか¥tといったタブ文字や、¥nまたは¥r、改行も除去します。

注意が全角スペースは取り除かないのと、文字列内の空白は除去しないので気をつけましょう。

##試験を受けるにあたって

Java Silverの問題を解いていてわかるのがひっかけ問題が多いです。

せっかくStringクラスの便利なメソッドを呼び出し、値を取り出したのに

代入していないので出力はメソッドを呼び出す前と変わらないといった意地悪な問題が多いです。

ですので試験を受ける際には余裕を持って挑みたいです。
Gitコマンド(Clone編)

# Gitコマンド(Clone編)

## カレントディレクトリ直下にリポジトリをコピーする

```bash
$ git clone <リモートリポジトリのアドレス>
```
### 例) GitHubにある、「sampleuser」ユーザの「samplerepo」リポジトリを「test」ディレクトリにコピーする

```bash
$ cd <testの親ディレクトリのパス>/test
$ git clone https://github.com/sampleuser/samplerepo-git.git
$ ls
samplerepo-git
```

## 指定したディレクトリにリポジトリの内容をコピーする

```bash
$ git clone <リモートリポジトリのアドレス> <宛先ディレクトリのパス>
```

### 例) GitHubにある、「sampleuser」ユーザの「samplerepo」リポジトリの内容を「test」ディレクトリにコピーする

```bash
$ git clone https://github.com/sampleuser/samplerepo-git.git
$ ls
src             test
```
(自分用メモ) Appiumのセットアップ, 使い方

# Appiumのセットアップ
* Node
    * https://nodejs.org/en/
    * Appiumインストールのため

* Appium
    * 公式
        * http://appium.io/docs/en/about-appium/getting-started/?lang=en
    * [$npm install -g appium] Permission deniedでインストール失敗した
        * [解決方法] https://stackoverflow.com/questions/48910876/error-eacces-permission-denied-access-usr-local-lib-node-modules-react?rq=1
    * [JDK インストール] https://www.oracle.com/technetwork/java/javase/downloads/index.html
    * [$npm install -g appium-doctor] Appium-doctor
        * appiumを使うために不足している設定を診断してくれる
    * 必要だった設定
        * Please install Carthage. Visit https://github.com/Carthage/Carthage#installing-carthage for more information.
        * Manually configure ANDROID_HOME.
        * Manually configure JAVA_HOME.
            * こんな風に指定できるらしい. https://qiita.com/seri_k/items/e978c1339ce51f13e297
        * Manually configure ANDROID_HOME and run appium-doctor again.

```
export ANDROID_HOME="~/Library/Android/sdk"
export JAVA_HOME=`/usr/libexec/java_home -v 11`
export PATH=$JAVA_HOME/bin:$PATH
```

* Appium desktop
   * https://github.com/appium/appium-desktop

# 使い方

## Screenrecord
* 使ってみようとしたところ上手くいかなかったが, 調べたりいろいろやってたら出来た
* [official] 
    * [start screen recording](http://appium.io/docs/en/commands/device/recording-screen/start-recording-screen/)
    * [stop screen recording](http://appium.io/docs/en/commands/device/recording-screen/stop-recording-screen/)

## Screenshot

## Adb log

# Memo
* 試してみる: appium-docker-android
    * https://github.com/appium/appium-docker-android
RailsのReferencesとindexについて

#初めに

Ruby on Railsを勉強していてよくrails g model post user:referencesみたいなのを見かける。

でもいまいちreferencesがなんなのかよくわからないので調べで見みた。

#とりあえず

とりあえずrails g model post body:text user:referencesを実行してみる。

マイグレーションファイルはこんな感じ

```ruby
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.text :body
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end
```

このreferences が何なのか、foreign_keyは何なのかだが

まずreferencesは今回の場合だとuser_id:integerを書くのと同じ。

だがmodel/post.rbにbelongs_to:userというのを自動的に追加してくれる。

foreign_key: trueについては外部キー制約とかいうらしくuser_idに何でも入れれるわけではなく実際にあるuser_idしか入れれないようにするものだそう....

なのでuser:referencesと書いたらモデルにbelogns_to: userと追加してしかも外部キー制約も行うマイグレーションファイルを作ってくれる感じなのだそう。

便利だね！


#indexについて

indexについてもよく見かけるがよくわかっていない。

なんか検索を行う際にあったら少し高速になるぐらいに思っていた。


調べてみたらこんな記事が出てきた。

データベースにindexを張る方法
https://qiita.com/seiya1121/items/fb074d727c6f40a55f22

この記事の最初にindexが何たるかが書いてあってテーブルの中の特定のカラムを複製し検索を早めるためにあるんだとか。

そしてむやみにindexを付ければよいわけではなく多いデータの良く検索されるカラムにindexを付与するのがよいそう

ちなみにindexを付与したい場合は

マイグレーションファイルに

```ruby
add_index :users, :name  
```

みたいに書けばいける。

またインデックスに一意制約を付けたい場合もある。

例えばuserのemailは一意制約がついているべき。

その時にindexに一意制約を付けるには


```ruby
add_index :users, :email, unique: true
```

と書く

またemailの場合すべてを小文字にして登録するといったことが行われる。

その際は

before_save { self.email = email.downcase }

と書けばOK

#おわり

rails の references と index　について理解が曖昧だったので調べながら書いてみました。

なにか間違っているところがあればご指摘いただけるとありがたいです。
Dockerで作成したWordpressをCodeceptionでE2Eテストする

# 備忘録として

## docker-compose.ymlの設定

```yml
version: '3.3'
services:
  codecept:
    image: codeception/codeception
    depends_on:
      - chrome
      - wordpress
    volumes:
      - .:/project

  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    networks:
      main:
        aliases:
          - db.mysql

  wordpress:
    depends_on:
      - db
    volumes:
      - ./:/var/www/html
    image: wordpress:latest
    ports:
      - 80:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    networks:
      main:
        aliases:
          - wordpress.demo

  chrome:
    image: selenium/standalone-chrome-debug
    ports:
      - 4444:4444
      - 5900:5900
    container_name: chrome
    privileged: true
    networks:
      main:
        aliases:
          - selenium.demo

networks:
  main:

volumes:
    db_data: {}

```

これで一旦Wordpress環境を作る。

`docker-compose exec wordpress bash`でコンテナ内に入り、
`composer require "codeception/codeception" --dev`でcodeceptionを入れる。

入れ終わったら`vendor/bin/codecept init acceptance`を実行する。

## codeception.ymlの設定

```yml

# suite config
suites:
    acceptance:
        actor: AcceptanceTester
        path: .
        modules:
            enabled:
                - WebDriver:
                    url: http://wordpress.demo/
                    browser: chrome
                    host: chrome
                    window_size: 1920x1200          
                    capabilities:
                        chromeOptions:
                        args: ["--headless", "--disable-gpu"]
                - \Helper\Acceptance
                
extensions:
    enabled: 
    - Codeception\Extension\RunFailed
    - Codeception\Extension\Recorder


params: 
    - env

gherkin: []    

# additional paths
paths:
    tests: tests
    output: tests/_output
    data: tests/_data
    support: tests/_support
    envs: tests/_envs

settings:
    shuffle: false
    lint: true
```
上記のように設定する。

完了したらば、`vendor/bin/codecept run`でテストを実行する。

## 参考
[codeception](https://codeception.com/quickstart)
[docker-codeception-example](https://github.com/imunew/docker-codeception-example)
Djangoのユーザをシェルで確認

こちらの記述を参考にしました。
[Djangoのユーザをシェルで確認する方法](https://qiita.com/NoriakiOshita/items/c1a6764232eff9078026)

GUI で見ると次のように見えるユーザーをシェルで確認します。
![user_dec15.png](https://qiita-image-store.s3.amazonaws.com/0/179446/fa061480-52c8-2d6e-29e4-f4f4db467366.png)

manage.py のあるフォルダーで次のように実行します。

```text
$ python manage.py shell
Python 3.7.1 (default, Oct 22 2018, 10:41:28) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from django.contrib.auth.models import User                             

In [2]: for user in User.objects.all(): 
   ...:     print(user.id,user.username,user.email) 
   ...:                                                                         
1 admin test@test.com
2 test01 
3 test02 
4 test03 

In [3]: quit
```

データベースに直接アクセスして確認するとこうなります。

```text
$ python manage.py dbshell
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 63
Server version: 10.5.12-MariaDB-1build1 Ubuntu 21.10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [django]> select id,username,email from auth_user;
+----+----------+---------------+
| id | username | email         |
+----+----------+---------------+
|  1 | admin    | test@test.com |
|  2 | test01   |               |
|  3 | test02   |               |
|  4 | test03   |               |
+----+----------+---------------+
4 rows in set (0.00 sec)
```
M5StackとNCIRモジュールで、飲み物の覚めすぎを防止する

この記事はM5Stack Advent Calendar 2018の15日目の記事になります。

# はじめに

冬の作業のお供はあったかい飲み物なのですが、冷めたお茶などを電子レンジで温めなおした際に、少々あたためすぎたりします。
で、冷めるまでと思って作業をしていたら、いつの間にか飲み物のことを忘れて覚めすぎていた　⇒　振出しに戻る　ってことがままあります。
これを防ぐ方法をM5Stackで簡単に実現する方法を考えてみます。

# 実現方法

最近、M5Stackから続々とGROVE互換インターフェイスのユニットが発売されています。その中に、赤外線をつかった非接触温度センサーユニットである、NCIR Unitがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51272/9d732bbe-34b3-ee5c-b0b6-a0b73a71a2b6.png)

これをM5Stack Fireに取り付ければ簡単に物体の表面温度を測ることができます。

M5Stack FireとNCIRユニットはレゴで簡単に取り付けられますので、ささっとデバイスが作れてしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51272/a1967233-5f62-0878-2d69-756163ecee97.png)

これでコップの液体があるあたりの表面温度を観測しておけばコーヒーの冷めぐわいもわかるかと思います。

# アプリケーション

M5StackにNCIRユニットから定期的に取得した値を表示します。センサーからは環境温度と物体温度が取得できます。[A] が環境温度(Ambient temperature)で、[O]が物体温度（Object temperature）です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51272/b83be008-e15a-677d-d7de-118392b18166.png)

次に、Aボタンを押すことで、現在の物体温度を目標値として保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51272/5ab7f161-7ce6-0582-6f79-e3fcb8c4756d.png)

Bボタン/Cボタンを押すことで、保存した目標値を±1℃ずつ変更させることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51272/78ec78b3-402d-b051-8d91-23d4335107e8.png)

値を決めたら、再度Aボタンを押すことで観測開始となります。
現在の物体温度が目標値を下回った際に、ブザーを再生させます。
これで、飲み物が覚めすぎる前に気づくことができます。

作成したコードは[こちら](https://github.com/lutecia16v/M5StackNcir)になります。

センサーからの値取得は、[AdafruitのMLX90614ライブラリ](https://github.com/adafruit/Adafruit-MLX90614-Library)を使用し、Platform I/Oを使って開発しています。

# 最後に

実際にコップを測定する場合、M5Stackの固定が問題になりますが、今回は100均の紙粘土を使って対応しました。
実際の様子はこちらになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/51272/ddda1d37-9d3e-f534-c36f-1fd6110a85ee.png)

実際につくってみると、いろんなものを測りたくなってきました。やはり、簡単に組み立てられるのがいいですね。

今後は、非接触温度センサーの使い道をいろいろ考えてみたいと思います。
mapとlambdaを組み合わせて配列の各要素を一度に操作する

自分で書いて感動したので共有。
AtCoderのABC問題を解いていて、配列に入っている各要素を一度に操作して値を確かめたかったので、これをmapとlambdaを使ってやってみた。

実際には「与えられた各文字列に特定の文字が含まれているかどうか確認し、いくつの文字列が該当するか答えよ」という趣旨の問題。
ここでは、 `a` という文字を含んだ文字列が配列中にいくつあったかを数えている。

```python
params = ['aaa', 'abc', 'bbb', 'bac', 'ccc', 'cac']
print(sum(map(lambda p: 'a' in p, params)))
```

こんな感じ。
map関数によってlambdaで定義された操作が各要素に適用され、 `a` という文字を含んでいたら `True`、なければ`False`を返す。
これにsumを適用すると、Trueの要素が数え上げられて合計数が計算される。

forを使って要素を一つずつ見ていってもよいが、簡単な操作を行うだけだったらこっちのほうが簡単に実装できる。

参考: [【Python】map()関数とlambdaでリストの要素をすべて変更する – サンプルコード付 | ITエンジニアラボ](https://it-engineer-lab.com/archives/122)
Plasma , Plasma Cash, Plasma XT, Plasma Prime, Plasma Snark

Plasmaに関して。
https://scrapbox.io/cryptoeconimicslab/Plasma%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

# Plasma

特定のチェーンにあるトークンやNFTを、別のチェーンに移動して扱う仕組み。
便宜上、トークンが生成されたチェーンを親チェーン、移動した先のチェーンを子チェーンと呼ぶ。
（なぜなら、階層的に移動ができるため、親子関係として扱うのが理解しやすい。

Plasmaは技術の名前で、実装や実現方法が複数ある。

- **Plasma MVP** Omise GOが実装したMinimal Viable Plasma（実現するための最小限の実装）
- **Plasma Cash** Plasma MVPの容量問題を、UXTOからStateにすることで解決した実装
- **Plasma XT** 
- Plasma Prime
- Plasma Snark
- Plasma Chamber

## 3行で

- 親チェーンにコントラクトを作り、小チェーンのブロックやトランザクションを定期的に読み込ませる
- 親でコントラクトにデポジット（送金）すると、デポジットされたトークンはロックされ、小チェーン側でその分のトークンが新規発行され、もらえる
- 小チェーン側でexit（小チェーンのトークンを親チェーンに戻すこと）要求をすると、親チェーン側で署名の検証などがされ、特に問題がない場合ロックされた分を得られる

→ 取引価格1:1で2 way pegされて常に検証可能なサイドチェーン


※例外的に、ERC20/721トークンを扱ったり、コントラクトのステートをやり取りできるものもあるが、今回は割愛
もう .gitignore で困らないぞ！！

## 結論

便利な .gitignore のテンプレートを GitHub が用意してくれています。
=> [github/gitignore: A collection of useful .gitignore templates](https://github.com/github/gitignore)

様々な環境に適した .gitignore がそれぞれ用意されているので、自分の使いたいものをコピペして使っちゃいましょう。

## あとがき

僕は普段 Node.js ベースのプロジェクトに関わることが多いので、[Node.gitignore](https://github.com/github/gitignore/blob/master/Node.gitignore) をよく使います。
Typescript, Parcel, Nuxt.js, Next.js など満遍なく対応してくれてるのでうれしい。
金属組織の粒度判定18/12/15

#背景
金属の表面をよく磨いて適切に腐食処理すると以下のような金属組織を観察することができる。![29kin20_3 - コピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/326593/3009b6e1-33f0-643c-3442-9ab4216db5a4.jpeg)
[引用元：http://www.iri.pref.niigata.jp/topics/H29/29kin20.html]

　太い線のようなものが『結晶粒界』、結晶粒界に囲まれた領域が『結晶粒』である。結晶粒の大きさはその金属の作られた過程（加熱温度等）により変化する。金属を売ることを生業にしている人たちは、この結晶粒の大きさが適切に制御されていることを保証しなければならない。出荷前には顕微鏡で金属を観察し、結晶粒の大きさを計測する必要がある。

　どのようにして大きさを計測するのか。やり方の一つにクロスセクション法と呼ばれる以下の方法がある。
![29kin20_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/326593/153b5197-35fe-af9b-f98a-0b7859511529.jpeg)

[クロスセクション法]
① 縦・横・斜め2方向に同じ長さの線を引く。
② 結晶粒界との交点の数を数え上げる。
③ 縦に引いた線と結晶粒界の交点の数を数える。
④ 線の長さ（150㎛）を交点の数で割る。これにより、結晶粒の縦方向の大きさの平均が出る。
⑤ ③④の流れを横と斜め2方向の線に対して行う。

以上の作業により結晶粒の縦横斜め方向の径の平均が算出される。ただ、実際には莫大な数の製品に対して莫大な部位の写真を調べる必要があり、これを毎回人の手でやるのは非常に困難である。

#やりたいこと

上述の写真を入力画像とし、クロスセクション法による処理を経て、縦横斜め方向の結晶粒の大きさの平均を算出するプログラムを組む。Python3.0 + OpenCVで実装する。

#やってみたこと
とりあえず二値化+ノイズ処理してみる。適切に粒界だけ取り出せればあとの作業は何も難しくない。

```python:GrainSize.py
img=cv2.imread("29kin20.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) #グレイスケール化
ret, th2=cv2.threshold(gray,0,255,cv2.THRESH_OTSU) #大津法で二値化
mask=cv2.medianBlur(th2,3) #ノイズ除去
```
[元画像]
![29kin20.jpg](https://qiita-image-store.s3.amazonaws.com/0/326593/af13c58d-8261-ac61-33ed-efa3cf9aff75.jpeg)
[処理後]
![aba.PNG](https://qiita-image-store.s3.amazonaws.com/0/326593/1bf20b08-7c68-fee7-50d5-b08d6d04b1ff.png)

#課題
![aba2.png](https://qiita-image-store.s3.amazonaws.com/0/326593/a697140a-a3de-bc46-c57e-872dbb289782.png)
①結晶粒内のポツポツは判定のノイズなので消したい。medianBlurでは消しきることが出来なかったので他の方法を探す必要あり。
②切れている結晶粒界は可能な限りつなげたい。点線を実線にするアルゴリズムとか落ちてないだろうか。

今日はここまで。
今年JIRAを使ってみて得たノウハウまとめ

#何が書いてあるか

かねてから開発プロジェクト管理にBacklog（ツール)を使っていましたが、今年の4月よりJIRAへ移行することが決まりました。
それから試験運用をスタートし、現在は通常の開発で運用出来るようになったので、試行錯誤したJIRA活用ノウハウを整理しました。

#会社の状況

ざっくりですが前提となる状況について書きます。

- 開発の案件には大きく分けて3種類ある
    - 通年で戦略的に計画されている比較的大きめな開発案件
    - 週次で起案されるアジャイル的に進める案件
    - 日々の問い合わせから起案される不具合修正などの案件
- 開発チームは開発対象のプロダクトで分けずに１チーム
- 複数のプロダクトを跨いで全ての案件の中で優先度を決めて柔軟にリソース調整したい
- マネジメント工数を抑えるためにも、スケジュール状況は常に可視化したい

#ノウハウまとめ
現在、こういう使い方をしていて運用回っているというノウハウを以下にまとめます。
皆さんのお役に立てるかどうかという視点で考えると、環境や状況にとても左右されることなのでマッチするしないがかなりあります。
これは自分にとっての備忘録でもあるので、使えるところがあったらラッキーくらいの気持ちでご覧ください。

###どの単位でJIRAプロジェクトを分けるか

- 通常の開発案件（通年案件＋週次案件）
- 不具合修正系

他にもインフラや開発に直接関わらないプロジェクトもありますがここでは割愛します。
通常の開発と呼んでいるものは、同じ土俵でリソース管理をしたいので１つのプロジェクトにしました。
不具合修正系は現状では案件の隙間でやるような感じで、やるチームは同じでもリソース管理としては別概念になるので分けています。

###チケットの種類をどう使い分けるか

現在はストーリーとタスクの２種類を主に使っています。

- 開発する案件（機能）単位でストーリーを切る
- ストーリー直下にタスクを切る

開発には、要件定義→設計→デザイン→実装→テスト→リリースという流れがあるので、最初は階層を設けていました。
XXXを実装する（ストーリー）
└設計（タスク）
　└PC（タスクかサブタスク）
　└SP（タスクかサブタスク）
　└App（タスクかサブタスク）
└デザイン
...

人によっては独自で更に階層を作って整理していたのですが、子チケットの進捗に合わせて上位チケットも一緒にステータスやスケジュールを管理するのが手間でした。
なので現在は 設計_App_xxxx という形でグルーピングを表現し、案件のメインチケットであるストーリーの直下に置くという運用をしています。
サブタスクも人によって使いどころが違うので基本的に使っていません。

###ステータスをどう使うか

チケットの種類によって変えています。

- ストーリーは`Backlog→要件定義済み→概算見積り済み→進行中→完了`
- タスクは`TODO→進行中→完了`

企画チームが見る際にはBacklogを含めて全ての案件を表示。開発チームでは要件定義済み以降のステータスのストーリーのみ表示するフィルターを使っています。
タスクはシンプルに手をつけたら進行中、終わったら完了です。WBSの表示では完了を非表示にしています。

###カスタム項目で何を追加したか

案件の各責任者が一目で分かるように、ストーリーへ`開発リーダー`/`メインエンジニア`/`メインデザイナー`を追加しました。
また、チケットのデフォルト項目である`担当者`にはPOを設定しています。

チケットの開始日/終了日をWBSの各項目に設定しますが、それとは別に期限日を追加しました。
どんなスケジュールでやるのかとは別に、そのチケットが完了すべき期限日を管理したかったためです。
ただし、現在はこの項目をほとんど使っていません。結局は、実際にいつ終わる予定なのかが重要なので、それが分かっていれば十分でした。

###管理のためのフィルター

主に3つのフィルターをよく使ってます。

- 全案件マスター

完了していない全ての案件を表示します。

- 自分がリーダーの案件で未完了の全タスク

『自分がリーダー』は私の場合なので別な条件に差し替えてもいいのですが、対象案件の配下にある未完了タスクを全て確認する時に使います。
こちらを参考にさせていただきました。
[JQLの副問い合わせ　エピック>タスク>サブタスクを抽出するフィルタ](https://qiita.com/Terurin/items/dca585d338489572e467)
プラグインが必要ですが非常に便利です。

**リーダー案件**
`status in (Backlog, "To Do", 要件定義済み, 概算見積済み, "In Progress") AND Leader in (currentUser())`
**その子タスク**
`issueFunction in linkedIssuesOfAllRecursive("filter={上記フィルタのid}") AND status in (Backlog, "To Do", 要件定義済み, 概算見積済み, "In Progress")`
**2つをがっちゃんこ**
`filter in (リーダー担当, リーダー担当子タスク)`
こんな感じで作れます。

- 個人の未完了タスク（プロジェクト跨ぎ）

WBSで担当者ごとにグルーピングできなかったので、リソース調整のために人単位でスケジュールを確認する時に使っています。
現在の人数ならまだ大丈夫ですが、人が増えると辛いので良い方法あれば知りたいです。

###運用ルール

その他、JIRA管理をするためにいくつかのルールを作っているので記載します。

・基本的に１チケットのスケジュール粒度は2日以内
・毎日、帰宅前に最新ステータスに更新する
・レビュー依頼もラベルにレビュー依頼を付けて都度チケットを切る
・作業が終わった後、確認待ち状態でもそのタスクのチケットは完了にし、追加で修正などあれば別チケットを切る

#終わりに

これらは難しい話ではないですが、記憶は薄れていくものです。
また違う現場でJIRA（もしくは違うツールでも）を使うことになった時には、自分でこの記事を振り返ってみます。
もし、『こういう時は他にこんな使い方ができるよ〜』といったご意見あれば是非教えてください！
【 ActiveRecord::NoDatabaseError 】が出たら試してみる事！

##$rails db:createを入力⇒下記のエラー発生##

`FATAL:  role "username" does not exist
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "username"=>"username", "password"=>"password", "host"=>"db", "database"=>"db_development"}
rails aborted!
ActiveRecord::NoDatabaseError: FATAL:  role "username" does not exist`

##解決策##

１.`$ psql -q -c'select * from pg_user' postgres`
⇒「username」のロールがあるか確認をする。

２.`createuser username`でロール作成

３.`$rails db:create`

##ポイント##

<b>FATAL: role "username" does not exist</b> とは、データーベースにusernameが無いから作成するように教えてくれてるんですね。
Laravelにおけるサービスコンテナとコードの美しさ

# はじめに

ここ１年間PHP+Laravelプロジェクトに携わっててやっと気づいたことについて語ってみたいと思います。
珍しくコードの美しさについてです。

# Love beautiful code?

Laravelの公式ホームページに接続すると、画面の真ん中に

>”Love beautiful code? We do too.”
>“The PHP Framework For Web Artisans”

って文言がポンと表示されます。それを少し言い換えてみると

「美しいコードで物をつくりたいウェブ職人のためのフレームワーク」

という意味になるでしょう。
初めて見たときは、ふつうに考えると、Powerful・Rapid・Smartなどの形容詞でフレームワークの凄さを誇るわけだけど
（もちろんスクロールダウンするとすぐに出てきます😅）
「あなたも美しいの好きでしょう？」と同意を求めてる文言って斬新だなーと思いました。
当時はそんなに気にならなかったですが、最近になってどんな意図を持っているのか知りたくなりました。
多分、今ソフトウェア職人（）という本を読んでいるので、そこからの影響があったと思います。
コードの美しさって美しい風景を眺める時のようにアプリの設計から似たような体験できるからかと思い、
改めてドキュメントの設計コンセプトを読んでみました。

# サービスコンテナ

サビースコンテナはLaravelアプリケーションを構成する概念、あるいは実装したそのものです。
Laravelが起動したらアプリ自体もコンテナとして扱えるので、Laravelはコンテナの集まりと言っても過言ではないです。
サービスコンテナは、名前通り特定のサービスに関わるビジネスロジックを含むクラスです。このサービスコンテナはサービスプロバイダによってアプリ起動時に登録され、
必要に応じて呼び出されてインスタンスが生成されます。これをかっこいい表現で依存性の注入（Depedency Injection）と言われています。
開発者は自分は書いてもないのに勝手に生成されるインスタンスを受け取り、活用するだけで済みです。これのことを制御の逆転（Inversion of Control）と言います。
まさにインスタンス生成の面倒さ・怖さからの開放ですね。
本書では具体的なサービスコンテナの使い方については記載しないので、詳しくはこのリンクを参考にしてください。

# 美しいコード

ということでService Containerについては分かりましたが、サービスコンテナを使うことで美しくなりますか？と聞かれると、
まずはコードの美しさとはなんなのか認識を合わせる必要があると思います。はっきりとは言いにくいですが、私が考える美しいコードの以下のような特徴を持ってると思います。

1. 人が読みやすい
1. 適切にモジュール化・抽象化されている
1. 重複コードがない

IT業界の古典であるClean Codeの内容をまとめると似たような結論に至るのではないかと思います。
上記の特徴を持ってることでそれぞれ

1. ロジックが理解しやすい
1. 修正・拡張する箇所がはっきり見える
1. メンテしやすい

という長所を得ることができます。
だからそれのどこが美しい？というと、人によって感じることが様々な芸術に比べてプログラムというものは同じ入力に対して同じ出力をだせないといけないわけです。
しかも一人でサービスができるウェブアプリはほとんどなくて、一人でやってるとしても、過去の自身が残したコードのせいで苦労する経験は開発者ならありますね。
またプログラム、特にウェブアプリケーションはユーザとのケミストリーが大事で、世の中の変化に応じて能動的に変化しないと価値を失ってしまいます。
コードの美しさとは抽象的なものではなく、その品質を担保しようとしてる行為だと思っています。
そのため、サービスコンテナなどの手法が生まれてきて、そこからコードの美学を感じるのではないかと思います。

# どうでもいいじゃない？

私は「むしろそういう無理矢理入れようとして正反対に複雑な構造になってしまうのでは？」と思ってた時期がありました。
また「デザインパターンってただGeekな人たちの言葉遊びじゃないか」と思ったこともありましたが、
構造化せず、整理せず書いたコードはサービスコンテナを理解するより難しくなってしまうんだと肌で感じました。
もう少しでもコードを美しいコードを意識しながら書いたコードは人を喜ばせるし、品質までつながるのではないかと思います。

# たまには美しくないコードが美しい時がある

もちろん心が折れそうな場合も多いですね。
ハードコードしてしまったり、設計する間もなく実装に追われて、リリースしてしまったりとか。
それはそれで理由のある対応なので、全然やる気失う必要はないです。
とにかく忘れてはいけないのは我々がつくるものはユーザの要件を満たすこと。
が、二度とそんな状況にならないように見直すことも大事ですね。

# 終わりに

残念ながら、ここ1~2年間書いたコードは恥ずかしくてたまらないくらいです。
やっといろんなカンファレンスに参加したり、本読んだり、周りにアドバイスをもらったりして
ソクラテスの言葉通り「知らないことを知っていると思い込んでいる」状態になったのかもしれません。
これからはせっかくLaravelの使っているので、LaravelのIlluminateのコードをちょっと読んでいこうと思っています。
Laravelぐらいの立派なものを磨いている人たちのコードを読んだらきっとレベルアップできますね。

けっこう文系感のある記事になってしまったんですが、
とにかくコードをきれいに書こうとする姿勢から生じるトレードオフはないと思うので
実践しながら少しずつでも成長できたら良いなーと望んでみます。
リストにある大量のデータをまとめて編集したい。

スプレッドシートなどに大量のデータが格納されており、
そのデータを一括で編集できたらいいな。と思ったことはありませんか？

例えば
スプレッドシートにあるデータ
番号と野菜があったとしよう。
そしてそのデータをまとめて使う際に、番号と名前の間に　カンマ（,）を入れたいという状況があったとしよう。
１つづつ編集するのは面倒くさいので何か手はないか？


<img width="911" alt="スクリーンショット 2018-12-15 19.11.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/282561/9889ad7a-b85a-90d3-afa9-877db1a8e1d8.png">


そんな時に使えるのが　正規表現を用いた置換だ。
エディタは　VS　code studio　を用いています。
編集したいデータを貼り付けてこんな感じで貼り付けます。
<img width="867" alt="スクリーンショット 2018-12-15 19.12.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/282561/41c3675f-5759-6abf-8bf8-0e2b2c792557.png">
しかし、そのまま貼り付けると、間にカンマがない。
番号と名前の間に半角スペースが空いているだけだ。
考え方としては、半角スペースをカンマ（,）に置き換える。ここで出てくる正規表現。順を追って見ていこう。


細かく見ていくと、
まずは　commandキー +　　F　で検索窓を出す

<img width="1440" alt="スクリーンショット 2018-12-15 19.12.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/282561/bc388ba0-1c88-6714-8d99-bd4723ac1d83.png">
検索窓にある　*アスタリスクみたいなマークを押し、正規表現を使用
正規表現を用いることでスペースみたいなのにも文字コードが割り振られる。
番号と名前の間にあるスペースの正規表現を用いた文字コードは　\t　で表すことができる。
ちなみにmacbook　usキーボードでのバックスラッシュ(\) 入力方法は
　optionキー　+　| キー（deleteキー真下）です。


<img width="1402" alt="スクリーンショット 2018-12-15 19.54.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/282561/b6743d9a-da70-bfde-cef8-ae105f5bbddb.png">

番号と名前の間の画像でいうとオレンジの部分が選択されました。
検索窓の右っちょにある矢印を押して
置換先であるカンマ（,）を書いていきましょう。カンマを書き入れたら全部に適用させるべく　abcと書いてあるボタン右側の方を選択して完了です。

<img width="1400" alt="スクリーンショット 2018-12-15 19.54.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/282561/23b0d8b4-ff1b-d664-7849-100f19ded004.png">
できたらこんなかんじ
まとめて編集できました。
便利なので使って見てください。
【備忘録】Ansible① 概要

## Ansibleとは

サーバー構築を自動化するツール

主に構成管理やアプリケーションのデプロイ、継続的デリバリーを自動で実行するためのツール（他の使い方もできる）

Playbookと呼ばれるPlaybookと呼ばれるファイルに設定したい情報を記載するだけで上述した自動化を実行できる。



Ansibleで操作できる対象

| 対象             | 操作                                                         |
| :--------------- | ------------------------------------------------------------ |
| 物理サーバー     | パワーON/OFF                                                 |
| OS               | パッケージインストール、設定ファイルの配布、設定値の変更、再起動 |
| ネットワーク機器 | インターフェース設定、VLAN設定など各種コンフィグの投入（やったことない） |
| ストレージ       | ボリュームの作成、編集、削除                                 |
| 仮想基盤         | 仮想マシン、仮想ネットワークの作成、編集、削除               |
| クラウド         | インスタンス、ネットワーク、セキュリティグループの作成、編集、削除 |

　  

ファイルの記述自体はとても可読性が高く、組織間での共有がしやすいかつ学習コストが低い。

Ansibleは、設定先のサーバーにエージェントのインストールが不要ないわゆるエージェントレスで利用できる

自動化ツール（ssh等で接続するための認証の設定は必要）



例）Apacheのインストール、httpd設定ファイル、Apacheの起動を自動化する場合

PlaybookはYAML形式で記述する。拡張子は yml

```YAML
- name: インストール、セットアップ、Apache起動
  hosts: localhost  # 対象サーバーを指定 ログインが必要なサーバーの場合は別途 ssh の設定が必要
  become: yes  # 管理者権限で実行する場合
  vars:
    http_port: 80  # ポート80を指定
  tasks:

  - name: Apache（httpd）のインストール  # 実行内容を記載
    yum:
      name: httpd  # yum install -y httpd と同義
      state: latest
    become: True

  - name: Apache（httpd）の自動起動設定
    systemd:
      name: httpd
      state: started
      enabled: True
    become: True
 
  - name: html ファイルの配置
    copy:
      src: files/index.html
      dest: /var/www/html/
  
  - name: Apache（httpd）の起動
    service:
      name: httpd
      state: started
    become: True

```



Playbookの管理、監視ツールとして Ansible Tower（OSS版はAWX）がある。
[](https://qiita.com/Kento75/items/a5e89c5034200310f98f)
[](https://qiita.com/Kento75/items/5175460b669cf1d1a325)
elm/http 2.0.0がインストールされない、またはelm.jsonの依存パッケージを更新、解決する方法


# 結論

[elm-dependencies-analyzer](https://www.markuslaire.com/github/elm-dependencies-analyzer/)という素晴らしいツールを作ってくれた方がいるのでこれを使って手作業で依存を解決して自分でelm.jsonを書き換えましょう

# 問題

elm/http 2.0.0が入らない問題が起こっているようです。`elm install`は現在の依存関係に加えて新しいpackageのバージョンを解決して入れるので元から古いのが入っていると新しいバージョンのものが入らないのです

ちょっと手元のelm.jsonを見てみましょう

```elm.json
{
    "type": "application",
    "source-directories": ["src"],
    "elm-version": "0.19.0",
    "dependencies": {
        "direct": {
            "elm/browser": "1.0.0",
            "elm/core": "1.0.0",
            "elm/html": "1.0.0"
        },
        "indirect": {
            "elm/json": "1.0.0",
            "elm/time": "1.0.0",
            "elm/url": "1.0.0",
            "elm/virtual-dom": "1.0.0"
        }
    },
    "test-dependencies": {
        "direct": {
            "elm-explorations/test": "1.0.0"
        },
        "indirect": {
            "elm/random": "1.0.0"
        }
    }
}
```

これは手元のcreate-elm-app@2.2.3で生成したelm.jsonです。現在は3.0.1のようですが生成されるものは一緒のようです
このelm.json結構問題で、ここから`elm install elm/http`すると1.0.0が入ってしまいます

次は`elm init`で作ったelm.jsonを見てみましょう

```elm.json
{
    "type": "application",
    "source-directories": [
        "src"
    ],
    "elm-version": "0.19.0",
    "dependencies": {
        "direct": {
            "elm/browser": "1.0.1",
            "elm/core": "1.0.2",
            "elm/html": "1.0.0"
        },
        "indirect": {
            "elm/json": "1.1.2",
            "elm/time": "1.0.0",
            "elm/url": "1.0.0",
            "elm/virtual-dom": "1.0.2"
        }
    },
    "test-dependencies": {
        "direct": {},
        "indirect": {}
    }
}
```

バージョン上がってますね。
ここからhttpを入れるとちゃんと2.0.0が入ります

じゃあこのバージョンに手作業で合わせれば万事解決じゃん！

# 解決策１：手作業

なんだかいい感じに手作業でバージョンをあげたり下げたりします。elmはそんなに複雑な依存は多分発生しないので適当にバージョン新しくしてけばゴールできるはずです

たぶん

# 解決策２：elm installをまっさらからやり直し

依存分叩きまくってください
たぶんゴールできますよたぶんね

# 解決策３；依存解決できるツールを使う

[elm-dependencies-analyzer](https://www.markuslaire.com/github/elm-dependencies-analyzer/)を使ってみよう

使い方はreadmeに書いてあります。
左のテキストエリアにelm.jsonの中身をはっつけてanalyzeボタンを押します。少し待ったら右になんかバージョンが表示されるのでconflictが解消されるまで存分にバージョンをいじくりましょう！

……手作業だね！

まあ、でも、そんなに？大変じゃないですたぶん

# 終わり

ほんとは`elm`コマンド本体にこういう機能があればいいんですけどね

宣伝

[elm-ui](https://qiita.com/miyamo_madoka/items/e29a97102df8770a6375)とか[elm-markup](https://qiita.com/miyamo_madoka/items/ff44bbec64bb07018948)の記事書いたりしてます
あと、[アドベントカレンダーが](https://qiita.com/advent-calendar/2018/elm)[３枚あって、](https://qiita.com/advent-calendar/2018/elm2)[まだ全然空きがある](https://qiita.com/advent-calendar/2018/elm3)のでよかったら参加してください
JavaScriptに挫折しかけてTypeScriptと出会った話

社会人1年目＆初投稿なので、温かく見守ってください。

# はじめに
JavaScriptの勉強をしているのですが、書き方が人によってまちまちで難しい。
さらに`動的型付け`なので変数の理解に時間がかかってしまう。
英単語がわかっていないのに、文法の勉強をしている気分です。
そんな時、静的型付けができるTypeScriptのことを知り、触ってみると面白かったので書いてみました。

# TypeScriptとは
Microsoftが開発したオープンソースのプログラミング言語です。
AltJS(Alternative JavaScript)の一種で、JavaScriptの書き方にルールをつけて開発の効率化や保守性の向上を図っています。
実行する際はJavaScriptにコンパイルされて動作します。

# 使うための準備
今回は`Node.js`のnpmコマンドを使ってインストールしました。

```terminal
npm install -g typescript
```
# 静的型付け
実際にTypeScriptを知るきっかけとなった静的型付けで変数を宣言してみます。

```javascript
// JavaScript
var message = "Hello World!!";
var num = 1;
```
```typescript
// TypeScript
var message: string = "Hello World!!";
var num: number = 1;
```
見た目上はほとんど変わりませんが、違う型の値を入れると以下のようにコンパイルエラーが発生します。
※ 使っているのは、[Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)というエディタです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/308848/c0d8f0c1-712a-552a-37db-16ab69ad37db.png)

ちなみに、型に`any`を指定するか何も型を指定しないと、動的型付けの変数になります。

JavaScriptだと変数名やロジック部分を読んでどんな型の数値が入れたいのか把握しないといけませんが、TypeScriptだと変数名の宣言時に明言されているのでとても分かりやすい。

# classの作成
JavaScriptでclassっぽい書き方ができるのを知っていましたが、functionやthisの使い方が複雑で理解しづらい。
TypeScriptだとclassが書きやすいとのこと。

というわけで、Carクラスを作ってみました。

```typescript:car.ts
// TypeScript
class Car {

  name:string;
  speed:number;
  
  constructor(name: string, speed: number) {
    this.name = name
    this.speed = speed
  }

  public acceleration() {
    this.speed = this.speed + 10
  }
}
```

ほとんどJavaみたいなもんですね。（筆者はJava経験者なので、とても読みやすいです）
これをコンパイルしてJavaScriptにして見てみます。

```terminal
// コンパイル方法
tsc car.ts
```

```javascript:car.js
// JavaScript
var Car = (function () {
    function Car(name, speed) {
        this.name = name;
        this.speed = speed;
    }
    Car.prototype.acceleration = function () {
        this.speed = this.speed + 10;
    };
    return Car;
}());
```

うーん。やっぱりJavaScriptだとゴチャゴチャしているように感じてしまいます。（主にfunctionのせい）

# その他TypeScriptでできること
- アクセス修飾子
- インターフェース
- enum
- ジェネリックス

などなど。他にもオブジェクト指向よりの機能が多くあります。

# 注意
JavaScriptに比べわかりやすいTypeScriptですが、
あくまでJavaScriptがベースなので、JavaScriptを全く触ったことがない人がTypeScriptをいきなり触るのはよくないです。
自分も、JavaScriptの理解度が低い状態でTypeScriptに手を出していますが、
コンパイルしてみてどのようなコードになっているかを確認する、
といったJavaScriptの学習補助的に触っているので許してください。

# 最後に
まだ触りだしたばかりですが、なかなか言語的におもしろく、JavaScriptに比べコードが書きやすかったり保守性に優れたりしているので、いい言語だなあと思います。
ただ、書きやすくなっているということは、その分自由度が減っているということなので、
TypeScriptではなくJavaScriptじゃないと書きづらいこともあるかもしれません。
JavaScriptの学習は続けつつ、今後のエンジニア人生の中でどんな言語が必要になってくるかわからないので、よさそうな言語探しをしていきたいと思います。

ひとまずTypeScriptで何ができるのかもう少し詳しく調べてみたいと思います。
~~JavaScriptの学習はどうした~~