OmniAICreator/Qiita-1.07M huggingface dataset:
【Google Apps Script(GAS)】スプレッドシートの内容をJSONデータ、APIにして他のスプレッドシートへ渡す方法　

スプレッドシートのデータをAPI化して他のスプレッドシートで活用できないかと思い、
色々と試行錯誤していた中で一旦
スプレッドシートをJSONデータにして他のスプレッドシートへ情報を入れるまではできたので、その記録です。


まずスタンドアロンスクリプトで作っていたので下記のスクリプトを記載。

```javascript

function getData() {
  
  var ssId = '******';
  var shtName = '******';
  
  var values = SpreadsheetApp.openById(ssId).getSheetByName(shtName).getDataRange().getValues();
  return values;
}

function doGet(e) {
  
  var data = getData();
  
  var res = ContentService.createTextOutput(); 
  res = res.setMimeType(ContentService.MimeType.JSON);　//※1
  res = res.setContent(JSON.stringify(data, null, 2)); //※2
  
  return res;
}
```

※1
Mimeタイプの種類は下記URLを参照
https://developers.google.com/apps-script/reference/content/mime-type.html

※2
JSON.stringify()は引数を3つとることができるようです。
2つ目の引数については下記が参考になります。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

ただ上記は難しかったので私が参考にしたのは下記です。
https://www.sejuku.net/blog/79911
なくても動きますが、インデントをいくついれるかを数字で指定が可能。


上記のコードを「ウェブアプリケーションとして公開」します。
そこで作成されたURLを使って下記のコードを書きます。


```javascript

function setData() {
  var url = 'https://script.google.com/macros/s/******/exec'; //上記で作成されたURL
  
  var res = UrlFetchApp.fetch(url);
  var values = JSON.parse(res.getContentText());
  
  var ssId = '******'; 
  var shtName = '******';
  var values = SpreadsheetApp.openById(ssId).getSheetByName(shtName ).getRange(1,1,values.length,values[0].length).setValues(values);
  
}

```

上記で実装完了。
ただ、日付データや時間データが入る場合はJSONデータにエンコードした際に、
世界標準時間に変更されてしまうので注意！
つまり、時間が-9時間されてしまいます。

例えば下記の様なA列に日付データ、B列に時間データが入っている場合は次のように処理します。

![2019-10-27_16h59_26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/35f2c77e-2f1e-f76a-7c6a-26b3f1676e38.jpeg)


```javascript

function setData() {
  var url = 'https://script.google.com/macros/s/******/exec'; //上記で作成されたURL
  
  var res = UrlFetchApp.fetch(url);
  var values = JSON.parse(res.getContentText());
  
  values.forEach(function(row, i) {
    //1行目にタイトルが入っているのでそれ以外の行で実行
    if(i !== 0){ 
      var date = new Date(row[0].substr(0,10)); //※3
      date.setDate(date.getDate() + 1);
      values[i][0] = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd');
      
      var time = new Date('1899/12/30 '+row[1].substr(11,8)); ※3
      time.setHours(time.getHours() + 9);
      values[i][1] = Utilities.formatDate(time, 'JST', 'HH:mm:ss');    
    }
  });
  
  var ssId = '******'; 
  var shtName = '******';
  var values = SpreadsheetApp.openById(ssId).getSheetByName(shtName ).getRange(1,1,values.length,values[0].length).setValues(values);
}

```

※3
JSONデータにすると日付/時間データはそれぞれ下記のように変わっているので
substrで必要なところだけデータを文字だけを抽出

![2019-10-27_17h07_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428239/f282739e-315e-5620-8a6e-c75372dbf7f2.jpeg)
javascriptの配列操作（for文で出力）


javascriptの主要な配列操作をメモします。
for文を使ってconsole.logしてみます。


##for文
数値の比較を条件式を使って、指定した範囲の回数だけ繰り返すように指定できる。

```javascript:
var list = [1,2,3];

for(var i=0; i < list.length; i++){
  console.log(list[i]);
}
```


```html:for文出力
1
2
3
```

##unshift()
配列先頭の要素を追加します。この場合”A”を追加しています。

```javascript:
var list = [1,2,3];
var change = list.unshift("A")

for(var i=0; i < list.length; i++){
  console.log(list[i]);
}

```


```html:for文出力
"A"
1
2
3
```

##shift()
配列の先頭の要素を削除する。
この場合[1,2,3]の１を削除している。


```javascript:
var list = [1,2,3];
list.shift();

for(var i=0; i < list.length; i++){
  console.log(list[i]);
}

```


```html:for文出力
2
3
```


##push()
配列の末尾に要素を追加することができます。


```javascript:
var list = [1,2,3];
list.push("A");

for(var i=0; i < list.length; i++){
  console.log(list[i]);
}
```


```html:for文出力
1
2
3
"A"
```


##pop()
配列の末尾の要素を削除できます。


```javascript:
var list = [1,2,3];
list.pop();

for(var i=0; i < list.length; i++){
  console.log(list[i]);
}
```


```html:for文出力
1
2
```



##splice()
 配列の任意の場所に要素を削除したり、追加したりできる。
splice(インデックス,削除する数,[,要素][,...]);
第一引数...配列に追加、削除したい要素のインデックスを指定
第二引数...配列から削除する要素の数を指定（０は要素削除しない）
第三引数...第三引数以降に配列に追加したい要素を指定

```javascript:
var list = [1,2,3];
list.splice(1,0,"A","B");

for(var i=0; i < list.length; i++){
  console.log(list[i]);
}
```


```html:for文出力
1
"A"
"B"
2
3
```

##slice()

slice();
第一引数で指定した要素から第二引数で指定した要素までを返す
slice(開始インデックス,[終了インデックス])

```javascript:
var list = [1,2,3];
var get = list.slice(1,3);

for(var i=0; i < get.length; i++){
  console.log(get[i]);
}

```


```html:for文出力
2
3
```
ネイティブPHPいろいろやってみたシリーズまとめ（随時更新）

ネイティブPHPについていろいろ調べたこと、試したことなどをここにまとめていきます。随時更新です！

# PHPの基本書式

PHPの基本的な書式を理解する。JSの書式と比較しています！

※参考：[PHPの基本を理解するためにJSと比較する](https://www.i-ryo.com/entry/2018/01/08/132643)

# オンラインIDE（ideone、repl.it、Paiza.io）

フロントエンドでいうCodePenのようなPHPが使えるオンラインIDEを求めていろいろ検証。「ideone」「repl.it」「Paiza.io」の比較。

※参考：[ブログに埋め込めるオンラインIDE比較（サーバサイド版のCodePenを探して）](https://www.i-ryo.com/entry/2019/01/17/005627)

# Sourcetree、GitHub、Heroku

ローカル環境に書いたPHPをターミナル（黒い画面）を使わずにSourcetreeからGitHubにプッシュ。さらにHerokuにデプロイできるかやってみた。

※参考：[ローカル→Sourcetree→GitHub→Herokuに同期する方法（黒い画面不要！）](https://www.i-ryo.com/entry/2019/01/20/220031)

# フォームPHP

PHPでフォームを作る！`$_GET`と`$_POST`の違いを理解する。

※参考：[フォームPHPはじめの一歩（$_GETと$_POSTの違い）](https://www.i-ryo.com/entry/2019/01/27/204046)
スタイルシートが反映されなかった原因と対処法

## 昨日アップしたファイルに反映されない
昨日、HTMLとCSSを使って作成した自己紹介ページに、翌日修正を加えて、再度アップしました。
（サーバーはロリポップを使っています。）
すると、スタイルシートで指定した部分が全く反映されていないことが分かり、そこから修正できるまでに結構な時間を要しました。

## 原因はブラウザのキャシュ
結論は、ブラウザとして使用していたグーグルクロームのキャッシュでした。

## 対処方法
1. 更新したいサイトをグーグルクロームで開く
2. [F12]を押してデベロッパーツールを開く
3. ブラウザのリロードボタンを右クリック→「キャッシュの消去とハード再読み込み」をクリック

こちらのサイトで問題の解決に至りました。ありがとうございます。
https://saruwakakun.com/it/web/google-chrome
範囲内か調べる・範囲内に収めるメソッド（between?・clamp）


##between?メソッド
レシーバの値が範囲内にあるかどうか調べるメソッドです。

```ruby
obj.between?(min, max)
#次のコードと同義
obj >= min and obj <= max
```

レシーバの値が引数minとmaxの間に含まれればtrue,そうでなければfalseを返します
レシーバの値がminまたはmaxと等しいときはtrueを返します。

```ruby
3.between?(1, 5)    #=> true
6.between?(1, 5)    #=> false
5.between?(1, 5)    #=> true
```

##clampメソッド
レシーバの値を範囲内に収めるメソッドです。
レシーバの値が引数minより小さければminを、レシーバの値が引数maxより大きければmaxを返します。
引数minとmaxの間に含まれればレシーバの値をそのまま返します。

```ruby
7.clamp(0, 10)   #=> 7
12.clamp(0, 10)  #=> 10
-3.clamp(0, 10)  #=> 0
```
between?とclampメソッドは共にComparableモジュールのメソッドです。
なのでComparableモジュールをインクルードしている数値クラスやString、Timeなどでも使うことができます。

```ruby
'b'.clamp('a', 'f')      #=> 'b'
'g'.clamp('a', 'f')      #=> 'f'

```

>引用元
>Ruby 2.6.0 リファレンスマニュアル module Comparable
>https://docs.ruby-lang.org/ja/latest/class/Comparable.html
nginxのSSL切れてたので慌ててLet's Encryptで更新して、かつ自動化する。

#やべぇHTTPS出来てないやん！
久々にマイサーバー弄りをしようと思って、ウェブページを確認したら

ブラウザが「このページを危ないで」って表示されて
無理やりアクセスしようとすると403エラー…

「まさかコレはSSL証明書の期限切れなのでは？」

と思ったのでLet's Encryptで更新処理をしてみます。

##SSL証明書の更新処理をする

###まずnginxを止める

```bash
sudo nginx -s stop
```

ウェブサーバーを止めないとLet's Encryptの更新処理でエラーがこのように出ます

```
error: Problem binding to port 80: Could not bind to IPv4 or IPv6.. Skipping.
```


###Let's Encryptで更新する
まずは```certbot-auto```のパスを調べる必要があります。

```bash
sudo find -name certbot-auto
```

と打つと```certbot-auto```のパスを吐くので
そのパス（今回は```/home/s4kd0r/certbot-auto```）を元に

```bash
sudo /home/s4kd0r/certbot-auto renew --force-renew
```

というコマンドを1行流すだけです。

###nginxを起動する

停止していたnginxを起動します

```bash
sudo nginx
```

##更新作業を自動化する
上記の更新作業をすると証明書が作業日から90日間までの期間で有効になります
が3ヶ月ごとに作業するのも面倒だし、何より今回みたいに「やべっ」って事があるので
cronで自動化します。

```bash
* 3 1 * * sudo nginx -s stop;sudo /home/s4kd0r/certbot-auto renew --force-renew;sudo nginx;
```

毎月1日の3時に更新するようにしました。
力技ですね笑
UnityでListの中身を表示する

#はじめに
初投稿です。よろしくお願いします。

Unity2019.2.0f1
Windows10 64bit

#概要
ボタンを押してListに情報を入れ、Consoleに中身を表示する機能を作成します。
今回はenumと組み合わせてListに情報を入れていきます。
![MIRS_Test-SampleScene-PC_-Mac-_-Linux-Standalone-Unity-2019.2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520446/32a8fade-2704-5d99-54d2-4b5f0df09487.gif)

##作成手順
###前提
Listやenumについて詳しく書いている方がたくさんいらっしゃるので、ここでは簡単な使い方のみ列挙します。<br>
- **List**

以下のようにListを宣言します。

```c#:sample.cs
private List<"型名"> "List名" = new List<"型名">();
```
Listへの入力は次のように行います。

```c#:sample.cs
"リスト名".Add("オブジェクト名"."列挙子");
```

- **enum**

以下のようにenumを定義します。

```c#:sample.cs
public enum "オブジェクト名"
{      
    "列挙子1",
    "列挙子2",
    "列挙子3",
    "列挙子4"
}
```
###非同期処理
このままではリストの中身が一気に表示されてしまうため、非同期処理を用いて2秒ごとに1つずつ表示するようにします。また、リストの中身はToString()を用いてString型にします。

```c#:sample.cs
async void "関数名"()
{
    foreach ("オブジェクト名" A in "リスト名")
    {
        Debug.Log(A.ToString());
        await Task.Delay(2000);    //遅延処理
    }
}
```

###ソースコード
以下が全体のソースコードです。それぞれのボタンの関数を当てはめることで実際に動かすことができます。

```c#:sample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;

public class sample : MonoBehaviour
{
    private List<Direction> Dirlist = new List<Direction>();     //Listの宣言

    public enum Direction
    {      //enumの定義
        Straight,
        Back,
        Left,
        Right
    }

    public void StraightButton()
    {
        Dirlist.Add(Direction.Straight);
    }

    public void BackButton()
    {
        Dirlist.Add(Direction.Back);
    }

    public void RightButton()
    {
        Dirlist.Add(Direction.Right);
    }

    public void LeftButton()
    {
        Dirlist.Add(Direction.Left);
    }

    public void SearchButton()
    {
        Search();
    }

    async void Search()
    {
        foreach (Direction dir in Dirlist)
        {
            Debug.Log(dir.ToString());
            await Task.Delay(2000);
        }
    }
}

```

#おわりに
いかがでしたでしょうか。Listやenumを取り入れれば、可能性の幅はもっと広がると思います。
models.pyの設定方法

#内容
djangoでwebサービスを作る際に使用するmodels.pyの記述方法をまとめる。

まずmodels.pyを編集する。
今回は簡単なブログ投稿サービスを想定して、
投稿に紐付く、日付・タイトル・本文をmodelに記載する。

```
from django.db import models
from django.utils import timezone #djangoではdatetime.nowの代わりにtimezone.nowで現在時刻を取得する

# Create your models here.
class Day(models.Model):
    title = models.CharField('タイトル',max_length=200)
    text = models.TextField('本文')
    date = models.DateTimeField('日付',default=timezone.now)
```
そしてターミナルでmodels.pyへの変更を読み込む。

```
python3.7 manage.py makemigrations myblog
Migrations for 'myblog':
  myblog/migrations/0001_initial.py
    - Create model Day
```
成功した場合このように表示されるので、migrateして反映する。以下のようになれば成功。

```
python3.7 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, myblog, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
```
以上。
Maya XGen, XGen IGS からポリゴンメッシュを作るメモ

## 背景

XGen の hair/fur を幅を持たせてポリゴンにしたい.
今回は Maya の標準機能だけで行う

## 制約

* XGen, XGen IGS ともに, 短冊状ポリゴンのみで, tube 状は作れない模様.
* 生成されるテクスチャ UV は strand ごとに同じである

## XGen

`Generate` -> `Convert XGen primitives to Polygons` を使う.
(XGen Editor の `Preview/Output` -> Operation "Create Geometry" も同等)

XPD でファイルからデータを読んでいるばあい, width の変更はできないので注意(width ramp は変更できるが, [0.0, 1.0] の範囲の値に限られる).

Preview での表示パーセントの設定で, Generate mesh することができる(たとえば表示率を 10% にすると, 全体の 10% の strands に対してメッシュが生成される.

Combine Mesh が off だと, Strand ごとに node が生成されるため, 本数が多いと時間がかかる(e.g. 1 万 strands など).
`Combine Mesh` on だと高速であるが, 一つのメッシュになるため, その後 strand ごとにポリゴン面を選択して処理がやりずらくなります.

## XGen igs


ポリゴン生成は `Generate` -> `Convert Interactive Groom to Polygons` で行けます.

width の設定で少し幅を持たせておくとよいでしょう.

XGen のように preview percentage の機能は無い(?)ようなので, 本数制御はできない模様.
(Density parameter で調整は, 動くときと動かないときがある?)

### XGen IGS -> XPD -> XGen?

igs を XGen に変換すれば, preview percentage で生成本数制御できます.

XGen igs -> XPD は, XGen SDK にあるプログラムで変換できる

https://qiita.com/syoyo/items/c596296d61d8e50d7dcc

ただし, XGen SDK サンプルコードでは width taper の設定は適切に設定されていないため, 以下のように少し変更が必要です.

https://github.com/lighttransport/glTF-Maya-Exporter/blob/hot-reload/src/hotreload/XGenSplineToXPD.cc#L585

また, width ramp の設定は XPD ファイルに記述できないため, python script などで別途 export/import が必要です.

## 生成された strand mesh の本数を減らす.

Python でランダムにノード選択 -> 削除でいけるでしょう.

## TODO

* Ornatix などの hair plugin を使えばよりよいポリゴン化機能があったりするかしら?
* XGen の開発は止まっているようでこれ以上の改善は期待できないため, Alembic 書き出しして自前でポリゴン化するプログラムを書く
  * e.g. tube 状ポリゴンを生成など
* 生成したポリゴン面に, hair のシェーディングを bake するプログラムを書く
  * ptex を使うなどして, strand ごとに unique な UV をアサインする
気象×Python　〜AMeDASの地点データ自動取得（番外編）〜

以前AMeDASデータ自動取得についての記事を書きましたが、また違った方法も最近知ったので、メモ程度に残します。

<font color="OrangeRed">**※追記：下の記事で紹介しているやり方でより効率良くダウンロードできると思います。**</font>
>気象×Python　〜天気データ取得からスペクトル解析まで〜
https://qiita.com/OSAKO/items/d25b8484d35ef4fe19e0

csvダウンロード時のNetworkパネルより、Form Data→view sourceを参照。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354874/1853a285-cd32-1f90-2329-c726d3e9c8bf.png)

```
$ curl -s -X POST https://www.data.jma.go.jp/gmd/risk/obsdl/show/table -d "stationNumList=%5B%22s47646%22%2C%22s47662%22%2C%22s47670%22%2C%22s47682%22%5D&aggrgPeriod=1&elementNumList=%5B%5B%22201%22%2C%22%22%5D%5D&interAnnualFlag=1&ymdList=%5B%222019%22%2C%222019%22%2C%229%22%2C%2210%22%2C%2223%22%2C%2222%22%5D&optionNumList=%5B%5D&downloadFlag=true&rmkFlag=0&disconnectFlag=0&youbiFlag=0&fukenFlag=0&kijiFlag=0&huukouFlag=0&csvFlag=0&jikantaiFlag=0&jikantaiList=%5B1%2C24%5D&ymdLiteral=1&PHPSESSID=fjfj83om1h1t41prpof3rijfh1" | iconv -c -f shift_jis -t utf-8
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354874/9eb50ebc-8550-9805-e488-a0d939f3f02e.png)
LinuxからCanon TS8230が見つからない

#困ったこと
新しく買ったCanonのプリンターTS8230がキャノンのサイトからダウンロードしたインストーラで認識されない。

#環境
Ubuntu 18.04.3 LTS
Linux Kernel 4.15.0-48-generic
Canon TS8230
IJ Printer Driver Ver. 5.70 for Linux


#試したこと
インストーラで必要なパッケージのインストールはできたので、手動で登録してみる。
そのために、`/usr/lib/cups/backend/cnijbe2`を実行してみるも、何も表示されない。
※`/usr/lib/cups/backend/cnijbe2`は、Canon製のプリンターのCUPS向けバックエンド（多分）。そのまま実行すると、プリンターを検出して教えてくれる。

#原因
初歩的なことで、ファイアウォールのせいだった。
なんとなく一応ufwでファイアウォールをかけていたため、これをすべてオフにしたら検出され、印刷もできるようになった。
先に挙げた`/usr/lib/cups/backend/cnijbe2`の挙動を見たところ、どうやらUDPの40000~59999くらいの番号のポートでプリンターと通信しているようで、しかも`lsof -i`でみたところこの範囲からランダムにポートを選んでいる（なにか規則があるのかもしれないが）。
また、印刷時も同じことが言えるようで、CUPSのポートを開けておくだけじゃ純正ドライバでは印刷できないようだ。
とても面倒くさい。

#結論
Canonのプリンターで、純正のドライバを使うならポートの開放はCUPSだけではダメ。
40000~59999くらいを開けておけばいけるかもしれない。
ファイアウォールは邪魔。
Linuxで特定のプロセスだけファイアウォールを回避するってできるんだっけ？　知ってる人がいたら誰か教えてほしいです。
pythonでサービスを作る際の初期設定

#内容
pythonでサービスの作り方を一通り学んだので、実際にやってみる。
勉強中なので間違いがあれば教えて頂けると嬉しいです！

参考にした動画はこちら→https://www.udemy.com/share/101XAaBEYfd1tWRnw=/

まずはファイルを選択して以下のコマンドを打つ

```
django-admin startproject project
```
次にディレクトリを移動してアプリケーションを作成する。

```
cd project
python3.7 manage.py startapp myblog
```
作成されたファイルをeditorで展開して、
以下の点を変更する。
まずはアプリケーションを登録するために、
INSTALLED_APPSに「アプリケーション名.apps.アプリケーション名先頭大文字Config」とする

```
INSTALLED_APPS = [
    'myblog.apps.MyblogConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```
次にTITME_ZONEとLANGUAGE_CODEを変更する。

```
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
```
urls.pyを編集する事で、アプリケーションのurlsを読み取ることができるようにする。デフォルトではadminの読み取りしか書かれていないので、include関数を使うことで作成したアプリケーションを読みとる。これにより自ら指定したurlを使用できる。

```
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myblog/', include('myblog.urls'))
]
```
アプリケーションフォルダ内にurls.pyファイルを作成し、
関数のimportとpathの設定を行う。

```
from django.urls import path
from .import views

app_name = 'myblog'

urlpatterns = [
    path('',views.index,name='index'), #/myblog
]
```
次にviews.pyを編集する。
urls.pyに指定した関数を作成し、requestに対して返すurlを決める。

```
from django.shortcuts import render

# Create your views here.
def index(request):
    return render(request,'myblog/myblog_list.html')
```
myblog_list.htmlを作成する必要があるので、
アプリケーションファイル>templatesファイル>アプリケーション名ファイル配下にbase.htmlとmyblog_list.htmlを作成する。
base.htmlは全てのviewに共通している要素が書かれており、cssやbootstrap使用時のurlなどを記載する。
myblog_list.htmlで反映したい箇所には、

```
{% block content %}
{% endblock %}
```
を記載し、myblog_list.htmlには

```
{% extends 'myblog/base.html' %}

{% block content %}
<h1>ブログ記事一覧です</h1>
{% endblock %}
```
このような形で挿入する内容を書く。

#まとめ
djangoを使って作成する上で基本的な初期設定をまとめた。
この後はviewにhtmlを追加してurls.pyを変更していく流れでページを増やしていく。
NodeMCU ESP-32 MotorShield FULL IO Extension Board組み立てマニュアル

NodeMCU ESP-32 MotorShield FULLの組み立てマニュアルになります。

#基板
![DSC_0474 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3254f440-0ba8-d300-d877-5a7e61667d91.jpeg)
#部品一覧
(赤枠部品は、分割ロングソケットへ変更しました）
![DSC_0477 (2)-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ee9c2ea3-0fe6-5f4b-4477-4522694d99a1.jpeg)
#NodeMCU ESP-32
![DSC_0478 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/770bc944-2291-9028-499c-25dd9709bec4.jpeg)

#回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/564397c6-0caf-0859-e499-67118da67281.png)

#１、自動書き込み対策
NodeMCUにおいて自動書き込み機能が搭載されていますが、稀にうまく書き込みが出来ないものが存在します。
C11に付属のチップコンデンサ(1uF)を取り付けることで、自動書き込みが出来るようになるケースがあります。
取り付けておくことをお勧めします。
（なお、稀に1uFでも動作しない場合があります、この際は適切なサイズなコンデンサを入れて対策してください）
*Ver1.1で対応

##２、モータードライバーの使用の決定
組み立てに当たり、モーターを何台動かすかを決めます。
本モータードライバーは、２種のDCモーターを動かすことが可能です（A,Bの２種類）
基板には、２種類を動作可能になっていますが、そのために、GPIOポートが６本占有されています。
A:GPIO 12,13,14
B:GPIO 25,26,27
モーターを使用しない場合は、R7.R8の抵抗を外すことで、モーターを使用しないことが可能です。

##３、ダイオード
１Aのショートカットキーバリアーダイオードを搭載しています。
１A以上で使用したいなどの場合は、D1を取り外し、ショートさせるか、大きなダイオードなどに交換してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e13dab17-68d6-db7f-85bf-9a20a119fa33.png)

##４、ピンヘッダーの取り付け
ピンヘッダーは、２列のものを２x３に分割してはんだ付けすると良いようです。
１列のものは数が少ないので、確認しながら分割してください。

なお、12,13,14、25,26,27については、モータードライバーに使用するようになっているので付けないでも構いません
（モータードライバーにつながっていても、使う事も可能です）

##５、コネクタ
コネクターは、極性の指定がありません。
モーターには、＋－と記述していますが、どちらにつないでも問題ありません（回転方向が逆になる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/81abb957-c294-96d3-66d0-9b0b126c7273.png)
XHのコネクタは、上下で逆につながるようになっています。
*Ver1.1で対応
モーターを左右、または、平行に取り付けた際に、逆方向を向くためにこの仕様にしています。

##６、スイッチ
スイッチは、上下向きがあります。
写真の形状が、外側に向くように取り付けてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d41cffd1-3a10-f8d3-35b9-acd315d12416.png)

##7、NodeMCUの取り付け
分割ロングピンソケットに変更しました。
19ピンずつに分割して取り付けます。

初期製品は、１０ピンと９ピンのピンソケットを使用しています。
この為、基板側のピンヘッダーをペンチ等で曲げて取り付けてください。

#完成見本
![DSC_0403 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ffce774a-21f1-5575-13f8-6cac859eeb17.jpeg)

#８、ジャンパーピン
使用条件によりジャンパーピンを差し替えてご使用ください。

#９、オプション
表面には、力率向上や、安定化のためのチップコンデンサを取り付けることが
背面には、電力安定化のためにチップコンデンサを追加出来るようになっています。

#１０　使用において
基本5Vの入力を前提としていますが、設計上は12Vをレギュレータを経由することで使用可能にしています。
NodeMCUに直接12Vを引加すると、コンデンサ等が壊れるケースがある為、必ず、本ボードなどで5V程度にしたうえでご使用ください。
JSライブラリ&フレームワークを試してみたシリーズまとめ（随時更新）

JSのライブラリやフレームワークをいろいろ試してみるシリーズをここにまとめます。随時更新中です！

JSの基本書式についてはこちら
※参考：[【HTML、CSS、JSの書式】これを読めばコードが読める！書ける！まとめ！](https://qiita.com/i-ryo/items/c8527759c2f490f2dade)

ReactでWebアプリ作る人に、俺はなる！（**2019/3/19追加**）
※参考：[ReactでWebアプリを作るシリーズまとめ](#react)

# ライブラリ

## jQuery

私がWebデザイナーになったとき大変お世話になったライブラリ！プログラミングの入り口。これがなければWebサイトを作れていなかった。

### 卒jQueryのためのソース読み解き

ライブラリ、フレームワークとは何か？jQueryのコードも生JS（ネイティブJS）と同じ書式で書かれていることを理解する。これは脱jQueryなんかじゃない「卒jQuery」だよと言いたい！

※参考：[【卒jQueryへの道】生JSとライブラリとフレームワークの理解](https://www.i-ryo.com/entry/2017/12/05/073044)

### jquery.inview.jsでスクロールアニメ

jQueryプラグイン「jquery.inview.js」とCSSアニメを組み合わせてスクロールするとフワッと動くアニメーションを作る。

※参考：[スクロールするとフワッと現れたり動いたりするアニメーション【jquery.inview.js & transition】](https://www.i-ryo.com/entry/2018/04/02/015103)

## チャートライブラリ

データをビジュアル化するチャートライブラリたち。

### Chart.js（Canvas要素のチャートライブラリ）

JSでチャートを作るライブラリのうち、Canvas要素ベースのライブラリChart.jsをこと始める。

※参考：[Chart.jsをGettingしてStartedする](https://www.i-ryo.com/entry/2018/06/15/222123)

### C3.js（SVGのチャートライブラリ）

JSでチャートを作るライブラリのうち、SVGベースのライブラリC3.jsをこと始める。

※参考：[SVGの方のチャートライブラリ「C3.js」をGettingしてStartedする](https://www.i-ryo.com/entry/2018/08/10/225837)

### Google Charts（ググドラから読み込めるチャートライブラリ）

C3.jsと同様SVGベースだが、Googleドライブからデータを読み込めるチャートライブラリ。Google製。

※参考：[Google ChartsをQuickにStartする](https://www.i-ryo.com/entry/2018/12/10/073520)

## Three.js（ブラウザで3D）

WebGL（ブラウザ3DCG）に憧れて、ライブラリThree.jsに取り組む。（**※2019/12/31他の記事に独立させました！**）

※参考：[【WebGL】Three.jsを習得するためにやったことまとめ（随時更新）](https://qiita.com/i-ryo/items/97d51d232b89e11f03c9)

## p5.js（ビジュアルコーディング）

Javaのライブラリ「Processing」をルーツとする。ユーザーの操作に反応するインタラクティブなコンテンツが作れる。（ボリュームがあるため、他の記事でまとめます！）

※参考：[【ビジュアルコーディング】p5.jsを習得するためにやった事 まとめ（随時更新）](https://qiita.com/i-ryo/items/6cca56d4b2ef9947d4d8)

## Tone.js（ブラウザサウンド）

Web Audio APIを使ってブラウザで音楽を作れるライブラリ。（ボリュームがあるので別の記事でまとめます！）

※参考：[【Web Audio】Tone.jsを習得するためにやったことまとめ（随時更新）](https://qiita.com/i-ryo/items/340b9f3b791b7c2f7d18)

# フレームワーク

### フレームワーク比較

フレームワークって何？ライブラリと何が違うの？3大フレームワークって何？3つのうちどれがいいの？調べたり触ったりしてみた（Vue.jsを最初にやってみることに決めた）

※参考：[三大フレームワークとかSPAとか仮想DOMとかわかりにくかったのでHellow Vue.jsしてみた！](https://www.i-ryo.com/entry/2018/06/22/013052)

### Vue.js

JS3大フレームワークの一つ！（ボリュームがあるため、他の記事でまとめます！）

※参考：[Vue.jsを習得するためにやった事 まとめ（随時更新）](https://qiita.com/i-ryo/items/baa50cf0a6647fe8bd2e)

### React

三大フレームワークの二つ目！（ボリュームがあるため、他の記事でまとめます！）（2019/12/31追加）

※参考：[Reactを習得するためにやったことまとめ（随時更新）](https://qiita.com/i-ryo/items/1573b71313e1b3660c04)

Webアプリ作る人に、俺はなる！（**2019/3/10追加**）

※参考：[ReactでWebアプリを作るシリーズまとめ（随時更新）](https://qiita.com/i-ryo/items/5edc45c9b652f251d000)
Laravelのログイン機能について

# Laravelのログイン機能について
Laravel 6.x.xになってから，ログイン機能の扱いが変わったと聞いたので，
自分でも試してみて，その手順とかをまとめてみようと思った。

## 環境
- Windows10 Home
- php 7.3.9
- Laravel 6.3.0

## 準備
[参考記事[1]](https://qiita.com/kotti/items/6d63be351c0565a0dae4)を参考に，`HogeHogeProject`という名前で，Laravelのプロジェクトを作成した。

## 検証内容
### ログイン機能を実装
※手順については，[参考記事[2]](https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5)を参照してください。

laravel 6.x.xから，`php artisan make:auth`が使えなくなったみたいで，npmとかいろいろインストールしなくちゃいけなくなった。

インストール後，`php artisan serve --host localhost`でアクセス。
Laravelのwelcomeページから，ログイン画面に遷移できるようになった。

### ログインに関する設定の変更
Laravelのwelcomeページからでないとログインできなかったり，ログイン後の遷移先が，
`home.blade.php`だったりしていたので，それらの設定を変更した。

`\HogeHogeProject\app\Http\Controllers\Auth`直下の複数のファイルに，リダイレクト先を設定している箇所がある。そこを変更してあげればいい。

### ログアウト時の遷移先変更
ログアウト後の遷移先がwelcomeページとなっていたので，ログイン画面に遷移するように設定を変更した。
`\HogeHogeProject\app\Http\Controllers\Auth`内の，`LoginController.php`が参照している`AuthenticatesUsers.php`にそれらしき記述を発見。

```AuthenticatesUsers.php
public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->invalidate();

    return $this->loggedOut($request) ?: redirect('/'); // ←ここをredirect('/login');に変更
}
```
該当する箇所を変更することで，ログアウト後の遷移先をログイン画面にすることができた。

## 参考記事
- [1][Laravelのプロジェクトをローカル環境で作成してみた](https://qiita.com/kotti/items/6d63be351c0565a0dae4)
- [2][Laravel6.0「make:Auth」が無くなった 〜Laravel6.0でのLogin機能の実装方法〜MyMemo](https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5)
【5章】RailsチュートリアルでBootstrapが導入できない時の解決方法

**Railsチュートリアル**の5章で**Bootstrap**がどうしても導入できず、
色々やった結果解決できたので、対処法をご紹介します。

(**エラー**: *bootstrap-sprocketsのimportに失敗と書いてある*)
<img width="1440" alt="スクリーンショット 2019-10-27 14.44.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520738/e1319c4d-b9d0-33ab-607e-b216ef6be23d.png">

以下、解決方法を載せます。


1. **Gemfileの記載を確認し、再度bundle installを実行**

    ```gem:Gemfile
    source 'https://rubygems.org'

    gem 'rails',          '5.1.6'
    gem 'bootstrap-sass', '3.3.7'
     .
     .
     .
    ```
<br>
2. **bootstrapが正確にimportされているか確認**
 
    ```css:app/assets/stylesheets/custom.scss
  @import "bootstrap-sprockets";
  @import "bootstrap";
```
<br>
3. **rails serverを再起動**
<br>
4. **Cloud9を再起動**
<br>
5. **GemfileとApplication.jsを変更**(僕はこれで解決しました！)

    ```gem:Gemfile
# 以下を追加
gem 'autoprefixer-rails'
```

    ```Javascript:app/assets/javascripts/application.js
// 以下を追加
//= require bootstrap-sprockets
```

    忘れずに、**bundle install**を実行！
<br>
6. **custom.scssをcustom.sassに名称変更**

あまりオススメはしませんが、どうしても解決しない場合は
scssファイルをsassファイルに変更することで解決することがあります。

<br>

(*正常にbootstrapが導入できると下のような画面になります*)
<img width="1440" alt="スクリーンショット 2019-10-27 14.54.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520738/d47b60ac-9975-21f4-8c6f-8cc7e649cdcb.png">

<br>
以上、参考になれば幸いです！
ホスト環境を汚さないNginxのデバッグ環境を作る

# 概要

Docker上でNginxをビルド＆起動して、起動したNginxのworker processにgdbserverをアタッチ。
そして、ホストのVSCodeからNative Debugを使ってgdbserverに接続して、デバックできる環境を作ります。

# 対象環境

* Ubuntu 19.10
* VSCode 1.39.2（Native Debugをインストール済み)

# 手順

作業ディレクトリの作成   
  
```console
$ mkdir nginx-debug
$ cd nginx-debug
```

ビルドに必要なソースコードをダウンロードする

```console
$ wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
$ wget http://zlib.net/zlib-1.2.11.tar.gz
$ wget http://www.openssl.org/source/openssl-1.1.1c.tar.gz
$ wget https://nginx.org/download/nginx-1.17.4.tar.gz
```

Dockerfileを作成する

```dockerfile
FROM centos:centos7
EXPOSE 80 18081

RUN yum update -y
RUN yum install -y gcc gcc-c++ make perl gdb-gdbserver

COPY *.tar.gz /usr/local/src/

RUN cd /usr/local/src && tar -zxf pcre-8.43.tar.gz && cd pcre-8.43 && ./configure && make && make install
RUN cd /usr/local/src && tar -zxf zlib-1.2.11.tar.gz && cd zlib-1.2.11 && ./configure && make && make install
RUN cd /usr/local/src && tar -zxf openssl-1.1.1c.tar.gz && cd openssl-1.1.1c && ./config && make && make install && echo '/usr/local/lib64' > /etc/ld.so.conf.d/lib64.conf && ldconfig

RUN cd /usr/local/src && tar -zxf nginx-1.17.4.tar.gz && cd nginx-1.17.4 && ./configure --with-debug --with-cc-opt='-O0 -g' --with-pcre=../pcre-8.43 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-stream && make && make install

CMD /usr/local/nginx/sbin/nginx && gdbserver :18081 --attach "$(ps -e -o pid,cmd | grep '[w]orker process' | awk '{print $1}')"
```

イメージをビルドする

```console
$ docker build -t hazy/nginx-debug:1.0 .
```

コンテナを起動する

```console
$ docker run -d -p 18081:18081 -p 10080:80 --cap-add=SYS_PTRACE hazy/nginx-debug:1.0
```

Nginxのソースコードを展開してVSCodeで開く

```console
$ tar -zxf nginx-1.17.4.tar.gz
$ code nginx-1.17.4
```

デバック構成を書く

```json
{
    "configurations": [
        {
            "type": "gdb",
            "request": "attach",
            "name": "Attach to gdbserver",
            "target": "localhost:18081",
            "remote": true,
            "cwd": "${workspaceRoot}",
            "valuesFormatting": "parseText"
        },
    ]
}
```

以上。

# デバッグ画面

処理を調べたい場所にブレークポイントを置いて `curl localhost:10080` とかすると、デバッグできる。

![Screenshot from 2019-10-27 15-58-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59180/78215c21-88e2-e1ca-878f-16168e8fb018.png)

# 参考

* https://docs.nginx.com/nginx/admin-guide/monitoring/debugging/
【Heroku】Deploy error

# はじめに
HerokuのDeployではまったエラーまとめた。
本記事に載っている方法でも解決しない可能性もある。
ちなみに、アプリケーションはNode.jsで作成していた。

## ``R10 (Boot timeout)``
```
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of lunch
Stopping process with SIGKLII
Process exited with status 137
State changed from starting to crashed
```

ポート番号を``process.env.PORT || 5000``に変更。
HerokuはPORT番号が毎回変わるらしいので、このように設定。

```js:index.js
const port = process.env.PORT || 5000;

app.listen(port, () => {
  console.log("Start sever port: " + port);
});
```

## ``Stopping all process with SIGTERM`` ``Process exited with status 143``
```
Stopping all process with SIGTERM
Process exited with status 143
```

怒られているけれど、動く。

## エラー内容忘れた…
``Procfile``というファイルを作ってアプリケーションのルートディレクトリに置く。
下記の内容を書けば何とかなる場合がある。（らしい）

```Procflie
web: bundle exec thin start -p $PORT
```
【PostgreSQL】よく使うコマンド一覧

# はじめに
個人的によく使うPostgreSQLのコマンド一覧をまとめる

## ログインからデータベース作成まで
```:command
# ログイン
psql -U postgres

# パスワード入力（入力しても何も変化ないように見えるがEnter押せばログインできる）

# データベース一覧表
\l

# データベース作成
CREATE DATABASE staff;

# ログアウト
\q

# ログイン
psql -U postgres staff;
```

## テーブル操作
```
# 作成
CREATE TABLE users (
id int,
name text,
age int,
height int,
PRIMARY KEY(id)
);

# 外部キー参照して作成
CREATE TABLE teams (
id SERIAL,
user_id int REFERENCES users(id)
);

# テーブル名変更
ALTER TABLE users RENAME TO characters;

# 主キー変更
ALTER TABLE users DROP PRIMARY KEY, ADD PRIMARY KEY (age);
```

## レコード操作

```:command
# 追加
INSERT INTO users (id, name, age, height) VALUES (1, 'Taro', 12, 140);

# 表示
SELECT * FROM users;
SELECT name FROM users;
SELECT age FROM users WHERE id = 1;

# 更新
UPDATE users SET name = 'JIRO' WHERE id = 1;

# 削除
DELETE FROM users;
DELETE FROM users WHERE height = 180;
```

## ``WHERE``部分

```:command
# aかつb
SELECT * FROM users WHERE age = 12 AND height = 150;

# aまたはb
SELECT * FROM users WHERE age = 12 OR height = 150;
```

## カラム（列）操作

```:command
# カラム名変更
ALTER TABLE users RENAME COLUMN height TO weight;

# カラム追加
ALTER TABLE users ADD COLUMN place text;

# カラムを削除
ALTER TABLE users DROP COLUMN age;
```

# さいごに
よく使うように感じるコマンドをまとめた。
よく使うコマンドが増えたら更新する。

# 参考サイト
* https://www.postgresql.jp/document/8.3/html/ddl-alter.html
    * テーブル操作
Jetson Nano用ファン　NF-A4x20 代替編 PWM 5v 40x40x20

Jetson Nanoには標準でファンがついていません。
メーカー推奨のNF-A4x20は値段が非常に高い上に、品切れでした。
2019年６月時点で９月以降にならないとメーカーも在庫なしとのことでした。
多分、そのころには別メーカーから廉価品が出ると考えていましたが、見事に正解となりました。

検索キーワード例
PWM  4PIN for NVIDIA Jetson Nano　5v

Aliexpressで２個で１２ドル程度です。
（購入時¥ 1,397でしたが、10月27日時点では1208円です・・・）
私が買ったのはこちらです。
https://www.aliexpress.com/item/4000218064590.html?spm=a2g0s.9042311.0.0.231c4c4dMBpfB7

![DSC_0530 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c77b4a18-7d82-5e01-76af-69beb5490164.jpeg)
Waveshareのはタッピングのようですが、こちらは、ボルトです。
取り付けは、ピンセットやペンチでナットをクランプしてネジを締めるだけ
ヒートシンクにナットを落とすミスを繰り返しても１０分かからないでしょう・・・
（なお、ナットは5個入っているようです）
![DSC_0531 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/92b1f11d-569d-9baa-aaba-c5ac39586c37.jpeg)

5vのPWM制御ですので、からあげさんのFAN制御の方法を参照してください。
https://qiita.com/karaage0703/items/b14c249aa33112669ee4

起動時にちょっと動いて、停止
コマンドを送って回れば正常です。

うちのJetbot Rotsonには問題なく取り付けできました。
が、やはり20㎜は高さが高いのでお邪魔なのと、隙間が空いているので、吸排気の空気を感じられはしません。
【Nuxt】pluginを用いてグローバルな定数を定義する

# はじめに

NuxtでSPAの開発をしていたときのある日の出来事

先輩「ページのパスは定数ファイルかなにかに一箇所にまとめて、どこからでもその定数呼び出せるようにしておいて」

ワイ「おかのしたー」


ｶﾀｶﾀｶ･･･ん？Nuxtでグローバルな定数の定義ってどうやるんだ？

こんなことがあったので、Nuxt.jsでルーティングのパスとかをconfigファイル（Rubyでいうconfig/initializers/constants.rb）みたなものを作成して、そこに定数として定義する方法を調べてやってみました。

# 参考
https://jp.vuejs.org/v2/cookbook/adding-instance-properties.html
https://qiita.com/waterada/items/9ae9d977a543bda1214f

# ざっくりやり方
\plugins配下に定数ファイルを作成

```javascript:urls.js
import Vue from 'vue'

Vue.prototype.$urls = {
  // トップ画面
  top: '/',
  // メッセージ画面
  message: '/message',
  // お知らせ画面
 information: '/information',
  // 設定画面
  settings: '/settings',
  // エラー画面
  error: '/error',

}

```

そしてnuxt.config.jsに以下の内容を追記

```javascript:nuxt.config.js

// ～～～上記省略～～～

  plugins: [
    '~/plugins/urls',
  ],

```

これで全vueコンポーネントで

```javascript
this.$urls.message // '/message'
```

といった感じで、先程作ったpluginから定数を引っ張り出すことができるようになりました。


初投稿なので至らない点だらけではありますが、誰かの助けになれば幸いです。
また、間違っている点等ありましたら、コメントいただけるとありがたいです。

以上でーす！
[Linux] reboot と shutdown の違い

社内LTで使った資料

https://docs.google.com/presentation/d/e/2PACX-1vR5daeBXSCkZOK13i1s1HmbwwQ1TrHARV0s80sZgRvpmL5AbU66VRmRb1WBXcG6kPxyys3JIeoom4oz/pub?start=false&loop=true&delayms=3000
Eclipse MicroProfileの始め方

# 概要

Spring Bootのスターターとしておなじみの[Spring Initializr](https://start.spring.io/)と同じようなものがEclipse MicroProfileでも公開されているので、紹介します。

使い勝手はSpring Initializrと同じ感じです。

## 始め方

以下のリンク先で公開されています。

https://start.microprofile.io/

MicroProfileのバージョンを選択することができます。この選択によって、選べるMicroProfile RuntimeやExamplesの種類が決まります。

<img width="1038" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/3cdb89b3-b91d-7236-c982-139ef44eb00b.png">

簡単な例として、MP3.0、RuntimeとしてHelidonを選択してDOWNLOADを押してみます。

<img width="411" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/41efd315-b6a1-edc5-ba48-3022366f808c.png">

プロジェクトとしてソースコードがZipでダウンロードできます。

<img width="431" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/67139159-8614-f938-43be-f37efaf9bca7.png">

Zipの中身はこんな感じです。

<img width="384" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/78b19792-c15c-d2e0-e613-f2d16423348f.png">

Mavenプロジェクトになっています。readme.mdに動作確認方法やリンクなどが含まれてますので、そちらを見ながら動かすことができます。

手取り早く動かすには
``mvn clean package``でjarを作成し
``java -jar target/demo.jar``で実行です。実行可能Jar形式になっているのでアプリケーションサーバの起動＆デプロイの手順を踏まずに１コマンドで実行できます。

コマンド実行時にはカレントディレクトリがdemo直下になっていることを確認してください。
（上記例の場合）

起動後、``http://localhost:8080`` にアクセスし、以下画面が出ればOKです。
<img width="387" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/18441ed0-f46b-3236-2322-9dd927d3e36f.png">

リンク先押下すると、、

<img width="576" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/35abc57b-2a7f-f03e-fa12-6630bc44c1b9.png">

Hello worldできましたね！


## まとめ

SpringBootと同じ数ぐらいの手順でMicorProfileを試すことができたと思います。

今回はJAX-RSぐらいしか含まれてませんが、Samplesのチェックを増やすことにより他の仕様もソースコードから確認することができます。

また、JavaEEの学習をしたいがアプリケーションサーバを構築するのが面倒という人にも、MicroProfileはJavaEE仕様の一部を取り込んでいますので、手元で動かしながら仕様を試す環境としては選択肢の一つとなりうるかと思います。
#Rails + #rspec でメール送信数をテストする

- change 記法で `deliveries.count` が増えたことを検証すれば良さげ。
- `expect(SomeMailer.deliveries.count).to eq 1` とか書いてしまうと、exampleごとにメール送信数をクリーンする処理を rails_helper に書く必要がありそう。

```
 expect { subject }.to change { SomeMailer.deliveries.count }.by(1)
```

[ruby on rails 3 - How to test with Rspec if an email is delivered - Stack Overflow](https://stackoverflow.com/questions/7284413/how-to-test-with-rspec-if-an-email-is-delivered)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2628








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MySQL8から認証方式が変わったらしいが従来の認証方式に戻す


# ローカル環境でMySQL8.0をAdminerから確認する

DB(MySQL8.0)を見るためにPHPのビルトインサーバー`php -S localhost:8000`を起動して**[Adminer](https://www.adminer.org/)**から確認しようと思いログインすると以下のエラーが発生。

```
The server requested authentication method unknown to the client
```

ログインできない

# MySQL8から認証方式が変わった

デフォルトの認証方式が`mysql_native_password`から*ハッシュ化方式`caching_sha2_password`へ変更されたらしい
で、それが原因でエラーがでるらしいのでとりあえず以前の認証方式へ戻す対応をします。

以下のコマンドをMySQLにログインし後実行

```
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
```

**※今回はローカルかつ重要でないテスト用の環境なので上記のパスワード設定ですが本番環境などでは推奨できません**

# ついでにMariaDBについて

ローカル環境はMySQL8を使用して、仮想環境にはCentoOS7にデフォルトで入っている**MariaDB**を使用したのですが、その際にもエラー（`1045: Access denied for user 'root'@'localhost' (using password: YES)`）が出たので以下のコマンドを追加で実行した


## 権限テーブルの再読み込み

DBにログインし、上記の**認証方式へ戻すコマンド**を実行後以下のコマンド（権限テーブルの再読み込み）実行

```
flush privileges;
```

## サービスの再起動

```
systemctl stop mysqld
systemctl start mysqld
```

これでMariaDBも動くようになった（はず）

# 参考URL
- [【Docker】MySQL8.0系を使う時に発生する問題について - websandbag ブログ](https://blog.websandbag.com/entry/2018/05/17/121730)
- [MySQL8.0 認証方式を変更する(Laravel5) - Qiita](https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917)
- [Adminer / Discussion / Help: "The server requested authentication method unknown to the client"](https://sourceforge.net/p/adminer/discussion/960418/thread/01cd4c4ed9/)
- [CentOS7での『mysqlパスワード初期化』 | まったりエンジニアの備忘録](https://www.rite.jp/post-1451/)
- [MariaDBのインストール/初期設定 [CentOS7] - Qiita](https://qiita.com/ponsea/items/9578659009b434c60959)
【Git】ファイルの変更の一部をcommitしたい場合

## git add -p で変更の一部をステージにあげる
変更した1ファイルの中の一部分のみを commit したい場合、git add に p オプションをつけることで、hunk (変更した範囲) ごとにステージにあげるかどうかを聞いてくれる。

```sh
git add -p <file_path>
```

一気にファイル変更しちゃったけどコミットは分けておきたい、なんて時に便利。ファイルパスを指定しない場合、**変更したファイルすべてについて聞いてくれる。**

実行すると以下のような画面になる。

```diff
@@ -9,7 +9,7 @@ class Sample
   def bb
   end


-  def method1
+  def method2
   end
 
   def xx
Stage this hunk [y,n,q,a,d,K,j,J,g,/,e,?]?
```

この hunk どうする？って聞いてくるので、**y** でステージにあげる、**n** であげないようにする。コマンドを入れると次の hunk に進む。**q** を押すか最後まで行くと、指定された hunk がステージに上がって終了。
基本的に**y, n, q (終了), e (手動で指定)**ができれば十分。よくわからん場合は**何も入れずにenter押すとコマンドの説明が見られる。** 

## e (手動で指定) を選んだ場合
vimが立ち上がり、hunk の編集モードに入る。

```diff

# Manual hunk edit mode -- see bottom for a quick guide.
@@ -9,7 +9,7 @@ class Sample
   def bb
   end


-  def method1
+  def method2
   end

   def xx
# ---
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
```

**反映させたくない部分を消し**、それ以外はそのままにする。
"-" 行を反映させたくない場合は、**行頭の"-"を消す。**
"+" 行の場合は、**該当する行を消す。**

終わったら`:wq`で終了。

## コマンドリスト
コマンド|内容
:---:|---
**y**|反映して次へ進む
**n**|反映させずに次へ進む
**q**|終了
a|今のファイルの hunk を全て反映
d|今のファイルの hunk を全て未反映
j|何もせず次へ進む
J|何もせず次の未指定 hunk へ進む
k|何もせず前に戻る
K|何もせず前の未指定 hunk に戻る
g|飛びたい hunk を選択
/|正規表現で hunk を検索
**e**|手動で指定
?|各種コマンドの説明
DjangoでMySQLを使うためには

# はじめに
Djangoでは、デフォルトでSQLite3が使用できる様になっていますが、パフォーマンスの観点からMySQLの方を使用したいという方もいると思います。この記事では、DjangoでMySQLを使うための準備を説明していきます。

# 環境
Mac OS Mojave 10.14.5
Homebrew 2.1.15
python 3.7.4
Django 2.2.6
pip 19.3.1

# MySQLのインストール
まず最初にMySQLをインストールしていきます。下記のコマンドの実行でインストールすることができます。

```
$ brew install mysql
$ mysql --version
mysql Ver 8.0.17 for osx10.14 on x86_64 (Homebrew)
```

# MySQLの起動
以下のコマンドでMySQLの起動を行います。起動できたら接続できるか確認してみましょう。

```
$ mysql.server start
Starting MySQL
. SUCCESS!

$ mysql -u root
...
mysql>
```

このまま今回のプロジェクトで使用するデータベースを作成しましょう。mysqlに接続した状態で以下のコマンドを実行します。

```
mysql> create database database_name;
```

実行したら作成できているか確認しましょう。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| database_name      |
| sys                |
+--------------------+
6 rows in set (0.01 sec)
```

# Djangoの設定ファイルの編集
Djangoプロジェクトの中のsettings.pyという設定ファイルを編集してMySQLを導入します。今回は先ほど作成した"database_name"という名前のデータベースを使用します。

```[settings.py]
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

...省略...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 変更
        'NAME': 'database_name', # プロジェクトで使用するデータベース名
        'USER': 'root', # パソコンにインストールしたMySQLのユーザー名
        'PASSWORD': '', # 同上。そのパスワード
    }
}

...省略...
```

# ドライバのインストール
最後の準備として、pythonがMySQLに接続するためのドライバをインストールする必要があります。ドライバには主要なものとして以下の４種類が存在します。

- PyMySQL（PurePythonを謳うドライバ）
- mysql-connector-python（MySQLの公式ドライバ）
- MySQL-Python（昔からあるがpython3に未対応）
- mysqlclient（MySQL-Pythonをpython3に対応させたOSS。Djangoの推奨ドライバ）

どれを採用するかは自由ですがpython3に未対応のMySQL-Pythonを採用するという選択肢はないでしょう。この記事ではDjangoの推奨ドライバであるmysqlclientを採用します。
（ちなみにPyMySQLを採用する場合は必要な作業が一つ増えます。）

ということでmysqlclientをインストールします。

```
$ pip install mysqlclient
```

# データベースを構築する
準備が完了したのでmigrateでDjangoでデータベースを構築します。（仮想環境のアクティベートを忘れずに！）

```
$ python manage.py makemigrations
$ python manage.py migrate
```

ここまでの手順で問題なくデータベースが作成できると思います。

# おわりに
この記事でDjangoに関する投稿は２つ目になりました。Djangoを用いた開発では他にも躓いてしまうポイントは多々あると思うので、ご要望があればコメントしていただけると助かります！
Ubuntuで"End-to-end Recovery of Human Shape and Pose"

# "End-to-end Recovery of Human Shape and Pose"とは？
CVPR2018にて投稿された内容で，簡単に言えば2次元画像から3次元モデルへの復元を行います．
プロジェクトページ：[Human Mesh Recovery](https://akanazawa.github.io/hmr/)
これが中々すごい！ぜひプロジェクトページの動画を見て下さい．

# どうやってるの？
私もまだざっくりとしか理解しておりませんが，
- 2D画像の入力
- 入力された2次元画像から3次元関節位置と体型の推定
- 復元された3次元モデルを”人間識別器”へ入力
- ”人間識別器”において，復元されたモデルを人間 or notの判断を下す（例えば，関節角度がおかしくないかなど）
”人間識別器”はいわゆるGANになっており，繰り返し学習を行うことでもっともらしい関節可動域や体型を学習していきます．
3次元モデルの復元にはSMPLを用いております．
プロジェクトページ：[SMPL](https://smpl.is.tue.mpg.de/)
3次元モデルを生成するうえで問題となるのは，異なる体重で同じ手足の長さをもつ場合がある点です．
ざっくりSMPLを説明すると，SMPLは関節位置が身体の3Dサーフェスとどのように関連しているかを示し，
解剖学的な関節を表現するわけではなく表面頂点の関数として表現しております．

話をHMRに戻しますが，この論文のすごいところは学習において関節位置がアノテーションされた2次元画像と3次元画像のペアを必要としないところです．
というわけで，早速デモを動かしてみましょう．

# 環境構築
基本は著者の方が公開されているGithubの内容でいけますが，諸々躓いた点があるので簡単に解説していきます．
Github:[HMR](https://github.com/akanazawa/hmr)
## まずはPythonの設定
デモ自体はPython2.7が推奨されています．
Anaconda等で仮想環境を作りましょう．

```terminal:terminal
conda create -n py27 python=2.7 anaconda
```
## モデルのダウンロード
Githubの解説の通りです．
HMRのディレクトリ内でダウンロードしましょう．

```terminal:terminal
cd hmr-master
wget https://people.eecs.berkeley.edu/~kanazawa/cachedir/hmr/models.tar.gz && tar -xf models.tar.gz
```

## モジュールのインストール
とりあえず，

```terminal:terminal
python -m demo --img_path data/im1954.jpg
```

でデモを動かしてみましょう．
色々モジュールが無いと言われると思うので，エラー文に従って入れていきます．
ここで何点か躓いたので，
### Tensorflowのバージョンは1.3.0

```terminal:terminal
pip install tensorflow==1.3.0
```

※GPUあれば

```terminal:terminal
pip install tensorflow-gpu==1.3.0
```


Githubに書いてあったにも関わらず見落としてましたね...
TF最新版だとcontribが無くなった影響でエラーが吐かれます．
参考：[Design Documentから見たTensorFlow 2.0の変更点](https://qiita.com/nuka137/items/6966efeddceb96012819)
ちなみにPython3系だとTensorflow1.3.0は見つからないです．
あと，WindowsだとPython2系にはTensorflowが公開されておりません．
Github上でも"Windows Setup with python 3 and Anaconda"と書いてあるのが納得できます．

### Opendr
ここが一番躓きました．直接Githubからとってきてもエラーでたりと...
結局，一番簡単なpip経由のインストールで通るという...

```terminal:terminal
pip install opendr==0.77
```

## デモの実行
一通りモジュール入れ終わったら，もう一度デモを実行していきましょう．

```terminal:terminal
python -m demo --img_path data/im1954.jpg
```

恐らく，下記のようなエラーがでます(2019/10/27時点，エラー出なかったら無視でいいです）．

```terminal:terminal
absl.flags._exceptions.DuplicateFlagError: The flag 'log_dir' is defined twice. First from absl.logging, Second from src.config.  
Description from first occurrence: directory to write logfiles into
```

log_dirというflagを2回定義していると言われているので，src/config.pyの59行目あたりにある，

```python:src/config.py
flags.DEFINE_string('log_dir', 'logs', 'Where to save training models')
```

をコメントアウトしましょう（これでエラー回避できますが，どこに影響がでるかは調べきれていません）．
また，src/tf_smpl/batch_smpl.pyでもencodingという引数は定義されていないと出ると思います．

```python:src/tf_smpl/batch_smpl.py
dd = pickle.load(f, encoding="latin-1") 
```

これ自体はpython2系で作ったモデルをpython3系で使う際に必要らしいので，
"encoding="latin-1""の部分を消せばいいです．

```python:src/tf_smpl/batch_smpl.py
dd = pickle.load(f) 
```

以下のような画像がでてきたら成功です．
![Screenshot from 2019-10-27 15-01-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/64c0e4bd-ffbf-b5da-7bb2-f597f26c595d.png)

以上になります．
この分野はものすごい速さで発展していってて，めちゃくちゃ圧倒されますね...
【Python】初学者が学習の為にトランプゲームを作成する(第2回)

※この記事は初学者である筆者の備忘録的扱いのものです。

↓↓↓前回の記事↓↓↓
[【Python】初学者が学習の為にトランプゲームを作成する(第1回)](https://qiita.com/mega_lala_/items/16a185f8a1e6e4a38625)

#はじめに
私は実務でPythonを使うことになり、勉強をしています。
トランプゲームを作成することによって、配列、関数、制御文等を学ぶことが出来ると考え、
作成を始めました。

現在は、デッキの部分を作成中。。。

#前回の反省
[【Python】初学者が学習の為にトランプゲームを作成する(第1回)](https://qiita.com/mega_lala_/items/16a185f8a1e6e4a38625)
前回の記事で@shiracamusさんにコメントをいただきまして、
至らない部分が本当に多くて勉強になりました。
ありがとうございました。

その後、アドバイスをもとに改良を加えた部分と
必要だと気付いた部分がありましたので、今回はそれについて書きます。

#改良した部分
まずは完成したデッキマスタ

```py
import random


MARK = "♤", "♧", "♡", "♢"
NUMBER = [1,2,3,4,5,6,7,8,9,10,11,12,13]
NUMBER_4 = [1,2,3,4,5,6,7,8,9,10,11,12,13]*4


def card_deck():
    deck_list = [f'{mark}{number}'
                 for mark in MARK
                 for number in NUMBER]

    deck_master = dict(zip(deck_list, NUMBER_4))
    random.shuffle(deck_list)

    return deck_master, deck_list
     

def draw(deck_list, n):
    player_card = deck_list[:n]
    del deck_list[:n]
    
    return player_card
```

まず、関数の共通化です。これは完全に見落としでした。
引数でデッキと手札枚数を渡すドロー関数として作成しました。
↓↓↓↓↓

```py
def draw(deck_list, n):
    player_card = deck_list[:n]
    del deck_list[:n]
    
    return player_card
```

次にデッキの作成部分ですが、リストに文字列として格納するだけだと
トランプの数値比較ができない？と考えたので。。。
このようにしました。
↓↓↓↓↓

```py
def card_deck():
    deck_list = [f'{mark}{number}'
                 for mark in MARK
                 for number in NUMBER]

    deck_master = dict(zip(deck_list, NUMBER_4))
    random.shuffle(deck_list)

    return deck_master, deck_list
```

まずdeck_listにマークと数値を格納します。
deck_listをkeyとして、valueに1~13を与えるようにしました。
出力させるとこうなります。
↓↓↓↓↓

```py
{'♤1': 1, '♤2': 2, '♤3': 3, '♤4': 4, '♤5': 5, '♤6': 6, '♤7': 7, '♤8': 8, '♤9': 9, '♤10': 10, '♤11': 11, '♤12': 12, '♤13': 13, '♧1': 1, '♧2': 2, '♧3': 3, '♧4': 4, '♧5': 5, '♧6': 6, '♧7': 7, '♧8': 8, '♧9': 9, '♧10': 10, '♧11': 11, '♧12': 12, '♧13': 13, '♡1': 1, '♡2': 2, '♡3': 3, '♡4': 4, '♡5': 5, '♡6': 6, '♡7': 7, '♡8': 8, '♡9': 9, '♡10': 10, '♡11': 11, '♡12': 12, '♡13': 13, '♢1': 1, '♢2': 2, '♢3': 3, '♢4': 4, '♢5': 5, '♢6': 6, '♢7': 7, '♢8': 8, '♢9': 9, '♢10': 10, '♢11': 11, '♢12': 12, '♢13': 13}
```

※今回はマークでの上下関係は考慮していません。

これで、プレイヤーが引いたカードをkeyにして値を取得し、比較できるようになるかな？(未確認)
という感じです。

それから

```py
NUMBER_4 = [1,2,3,4,5,6,7,8,9,10,11,12,13]*4
```

この部分ですが、

```py
deck_master = dict(zip(deck_list, NUMBER_4))
```

を作成する際に、deck_listにはマークごとに1~13で持っているので
NUMBERのリストだと1~13までしか作成できませんでした。。。
いろいろ調べてみたけどこれに落ち着きました。。。
いい方法があれば教えていただきたいです。


#最後に

今回は前回の記事の改良で終わってしまいましたが、次回はゲーム作成に入っていきます。
現在はブラックジャックで処理を考え中です。

今後の目標としてはKotlin反映、アプリ作成です。

では、進捗がありましたら更新いたします。
CSSでドット絵マリオを作るシリーズまとめ（随時更新）

画像を一切使わずいドット絵だけでマリオを作れるのか？そしてそれを動かせるのか？を試しているシリーズのまとめです（随時更新中！）

# imgタグに色を付ける

liタグの中にimgタグを無数に入れて、:nth-childで「○行目の○番目のimg」といった指定で色を付ける。

※参考：[CSSだけでドット絵マリオを描けるのか](https://www.i-ryo.com/entry/2018/06/13/223029)

# CSS変数でルイージを作る

色をCSS変数に置き換えることでルイージを簡単に作る。

※参考：[CSS変数でドット絵マリオをルイージにしたった！](https://www.i-ryo.com/entry/2018/07/05/225439)

# 立ちポーズ作成と切り替え

16マスドットを量産して、ジャンプポーズを作り、hoverアクションで切り替える。

※参考：[【CSSドット絵】マリオ立ちポーズとジャンプポーズの切り替え](https://www.i-ryo.com/entry/2018/10/30/215225)

# マリオをジャンプさせる（CSS animationとJS）

CSS animationを使ってマリオのジャンプループアニメを作る。:hoverと:actionを試すが相当通りにならず、JSのイベントリスナでclassの追加、削除して実現。

※参考：[CSSドット絵マリオをCSSアニメでジャンプさせてみる](https://www.i-ryo.com/entry/2018/12/23/103004)

この次は、Tone.jsで「トゥ〜ン」というジャンプ音を作って鳴らしてみたいと思っています…
【SQLite3】SQLite3のインストールとコマンドラインツールの使い方

SQLite3を操作する際に必要なコマンドを記録していきます。
私自身SQLite3初心者なので、基本的なところから勉強して少しずつまとめて更新していきます。

なお、使っているOSがUbuntu18.04なので、WindowsOSの方と表示等に若干の差異があるかと思いますが、ご了承ください。

## SQLite3のインストール

```shell
sudo apt install sqlite3
```

## コマンドラインツール

### コマンドラインツールの起動
```shell
sqlite3 sample.sqlite3
```
上記のコマンドを入力することでSQLite3のコマンドラインツールが起動して下記のように表示され、ターミナル上でSQLite3の操作を行うことができます。

```shell:実行結果
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> 
```

### コマンドラインツールの見た目確認

SQLiteコマンドの.showを使うとコマンドラインツールでのデータ表示の見た目を確認できます。

```shell
.show
```
```shell:実行結果
sqlite> .show
        echo: off
         eqp: off
     explain: auto
     headers: off
        mode: list
   nullvalue: ""
      output: stdout
colseparator: "|"
rowseparator: "\n"
       stats: off
       width: 
    filename: sample.sqlite3
sqlite> 
```

### コマンドラインツールの終了
```shell
.exit
```
このコマンドでSQLite3のコマンドラインツールを終了します。
Ubuntu18.04ではショートカット（ctrl+D）でも終了することができます。

---

### 本記事目次ページ
[【データベース】SQLite3・JDBCまとめ](https://qiita.com/tsweblabo/items/8fa21f3e9e30885be034)


### 参考サイト
- [DBOnline 初心者でもわかりやすいサイトSQLite入門](https://www.dbonline.jp/sqlite/)
[KVM]Windows10ゲストインストール時にVirtIOドライバーをインストールする

## はじめに
KVMゲストに対して高性能なディスクアクセスを提供するVirtIOですが、Windowsは標準でVirtIOを使用するドライバーを持っていません。
そこで、VirtIOをWindowsゲストで使用する方法を残します。

## ドライバーのダウンロード
以下のページの[Direct downloads]からvirtio-winをダウンロードします。
https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html

## KVMホストにアタッチ
ダウンロードしたvirtio-win.isoをwindowsゲストにアタッチします。
<img width="737" alt="capture 2019-10-27 14.27.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213392/319919db-2d79-841d-940b-4f5c88c756db.png">

## マウントディスクの読み込みをVirtIOに
Windowsが使用するディスクをVirtIOに変更します。

<img width="737" alt="capture 2019-10-27 14.28.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213392/e11c58af-abc6-4f3a-335e-07419593d083.png">

## ドライバーを読み込む
通常通りインストールディスクからインストールを行います。
「Windowsのインストール場所を選んでください」のステップで、ディスクが表示されない状態になります。
<img width="737" alt="capture 2019-10-27 14.30.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213392/10f8ddb4-96a1-54c9-d70e-79c6c0436b55.png">

`ドライバーを読み込み` をクリックして、ドライバーの選択画面から`Red Hat VirtIO SCSI controller (E:\amd64\w10\viostor.inf)` を選択します。
(3種類表示されていますがw10と表示されていものを選びます)
 <img width="812" alt="capture 2019-10-27 14.35.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213392/74053872-80b6-3faf-409f-efe82380eb9a.png">

以上で完了です。あとはいつも通りWindowsをインストールすれば終了です。
カスタムHtmlHelperの作り方メモ

TagBuilderを使用しないカスタムHtmlHelperの書き方を忘れそうなのでメモ。

環境は以下

- Visual Studio 2019
- .NET Framework 4.7.2

---

### [カスタムHtmlHelperクラスの定義部分]
実際に内部で呼び出されるのは従来のHtmlHelper。

```c#:Helper.cs

using System;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Linq.Expressions;

namespace HtmlHelperTest.Models
{
    public static class Helper
    {
        public static MvcHtmlString CustomTextBoxFor<TModel, TProperty>
                (this HtmlHelper<TModel> helper
                , Expression<Func<TModel, TProperty>> expression)
        {
            var htmlAttributes = new Dictionary<string, object>();
            // アトリビュートの追加
            htmlAttributes.Add("class", "custom");
            htmlAttributes.Add("style", "background-color: #00ff7f");

            return InputExtensions.TextBoxFor<TModel, TProperty>(helper, expression, htmlAttributes);
        }
    }
}

```
---
### [View（.cshtml）]
書き方は従来のHtmlHelperと同じ。
カスタムHtmlHelperを定義したクラスのnamespaceの読み込みを忘れずに。

```html:Index.cshtml
<!--ヘルパークラスのnamespace読み込み -->
@using HtmlHelperTest.Models

<!-- プロパティの読み込み -->
@model HtmlHelperTest.ViewModels.HelperViewModel

@using (@Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div>
        <div>
            @Html.LabelFor(model => model.TmpProperty)
        </div>
        <div>
            <!-- 定義したカスタムHtmlHelper -->
            @Html.CustomTextBoxFor(model => model.TmpProperty)
        </div>
    </div>
}
```

---
### [Property]

```c#:HelperViewModel.cs
using System.ComponentModel.DataAnnotations;

namespace HtmlHelperTest.ViewModels
{
    public class HelperViewModel
    {
        [Display(Name = "サンプルプロパティ")]
        public string TmpProperty { get; set; }
    }
}
```