OmniAICreator/Qiita-1.07M huggingface dataset:
C# implicit explicit

implicit
暗黙のうちに変換。
宣言してもいい。

explicit
暗黙のうちに変換はできない。
明示的変換はできる。

使い方

```
public class Hoge
    {
        // intをhogeにしたとき
        public static implicit operator Hoge(int a) => new Hoge();
        // Hogeをintにしたとき
        public static implicit operator int(Hoge h) => 3;
    }

    private void Test()
    {
        Hoge h = new Hoge();
        // キャストする必要がない暗黙のうちに変換される。 しても良い。
        int i = h;
        h = i;
        i = h;
    }
```

```
public class Sample
{
    public class Hoge
    {
        // intをhogeにしたとき
        public static explicit operator Hoge(int a) => new Hoge();
        // Hogeをintにしたとき
        public static explicit operator int(Hoge h) => 3;
    }

    private void Test()
    {
        Hoge h = new Hoge();

        // int i = h; コンパイルエラー
        int i = (int)h; // OK

        // h = i コンパイルエラー
        h = (Hoge)i; // OK

        // i = h; コンパイルエラー
        i = (int)h // OK
    }
}
```
初記事

#はじめまして
はじめてこういったサイトに登録。
お仕事で触れた技術や将来必要になりそうな事などをひっそりと記録して
いこうと思います。

とりあえず目下気なるキーワード等

1. AWS(Route53,RDS,EC2,S3,CloudFront)
2. ansible,Vagrant
3. Wordpress

よろしくお願いします。
モチベーションがなくなった時、人はどうなるか

#全てのマネージャー職に捧ぐ
これは私が経験した実体験です。
人は心が折れた時にどういう状態になるかというサンプルケースで見て頂けると嬉しいです。

#未経験の業務のリーダー
ある日の話。
自社パッケージについて、顧客からの調査が必要な問い合わせ件数が40件以上に膨れ上がり（この時点でおかしい)、問題解決のためマネジメントする人間を据える必要が出てきました。
そこで、当時リーダー希望だった私にマネジメントをするリーダーをやってくれと、白羽の矢が立ちました。
とはいえ私は当時入社6か月でパッケージの知見はあまりありません。しかも、顧客の問い合わせが捌ききれないほどひどい現場にいたことがなかったのです。(そもそも月に3件問い合わせがあるかないかでした)
それでも、業務指示ということもあり、かつリーダー経験が積めるという思いもあり、引き受けることにしました。

しかし、悲しいことに自社内でのフォローもあまりなく、PM(課長)は多かれ少なかれの問題全て(マウスクリック一つについても)に怒声を浴びせるばかりで、どうしたらよいか日々悩む状態が続きました。

#自分の体に起こった異変
リーダー担務から2ヶ月が経ち、私の体に異変が起こりました。
・休日や昼休みに体を使うことを極端に嫌がる。例えば、社外に出て他店舗で食事をとることが億劫になり、仕出し弁当を使い始める
・頬や瞼が痙攣する
・立っているのも苦痛
・頭に靄がかかり、思考力が極端に落ちる
・3か月で15kgの体重増加
・服装や清潔感に頓着しなくなり、風呂に入れないことも増え、土日は家事ができないことが増えた
・髪の毛が細くなった

特に、この頭に靄がかかる状態には苦労させられました。200文字程度の文章がなかなか纏まらず、同僚に文章を書いてもらうこともありました。

#そして心療内科へ
色々な方から心配され、心療内科を受診することになりました。その診断結果はというと
・適応障害の入口に立っている状態
。改善するには心を変えるか、2か月休暇を取るか、場所を変えるかしかない
ということでした。
これを元にPMより上の部長に話をし、無事PMと関係のない業務をする方向で部署移動することになりました。

不思議なことに、最初の1ヶ月は細かった髪の毛が太くなりました。また、靄がかかっていた状態がなくなったことで、客観的にチームの課題を発見・分析することができるようになりました。ちょっとしたレビューでレビュアーが納得できるような指摘をすることも出来る様になりました。これらは、部署移動前には真っ当にできなかったことでした。

これでめでたしめでたし、となれば良かったのですが、悲しいことに今もストレスを抱えています。当時から時間が経ってはいるのですが、やはり一度心の健康を崩すと今まで通りにはいかないのかもしれません。

#伝えたいこと
部下のモチベーションは業務効率に大きく寄与します。
色々なマネジメントを扱う研修や書物で話されていますが、部下のモチベーションの改善はマネジメント職の大事な業務です。個人に何か問題が起きたときは、チームの問題として個人に責任を追及せず改善を考えるようにしてください。
その手間を大事にすると、短期的な効率アップだけでなく、長期的な効率アップにも繋がります。もちろん、プロジェクトの利益にも。
※もちろん、部下の側もフォローしてくれる上司に対して報いる姿勢は必要です。
初学者によるプログラミングMemo　#17 scanメソッド

#はじめに
今回はscanメソッドを使用するお話です
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

#目次
- "scan"メソッドについて
- 正規表現での特徴

##"scan"メソッドについて
scanメソッドは「ある文字列に対して、マッチさせたい文字を指定し、マッチした部分文字列を配列として返す」メソッドです
使い方を具体的に見てみましょう

###基本

```.rb
"調べる元となるの文字列".scan"調べたい文字列（or正規表現）"
```

以下のような記述があるとします

```sample1.rb
word = "foobar"

p word.scan(/ba/)
# p word.scan("ba") これも同じ結果

=> ["ba"]
```

結果として得られるのは["ba"]です
文字列を変えてみましょう

```sample2.rb
key = "foobarbarbazz"

p key.scan(/ba/)

=> ["ba", "ba", "ba"]
```
この場合、"ba"は３回出てくるため、sample1.rbから結果は変わりました
このように、ある文字列に対してその文字が入っているか検索をかけてくれると考えてもいいでしょう
ただし、結果は配列で返ってくるため、単純に回数だけ知りたい場合は"length"メソッドをつけましょう

```sample3.rb
key = "foobarbarbazz"

p key.scan(/ba/).length

=> 3
```
###ブロックに渡して実行する
配列として返さない方法もあります

```sample4.rb
hoge = "foobarbazfoobarbaz"

hoge.scan(/ba/) {|s| p s }

=> "ba"
   "ba"
   "ba"
   "ba"
```

##正規表現での特徴
正規表現を使用するとき、"()"でくくってやると、その部分にマッチした「部分文字列の配列」の配列を返します
ややこしいので実際に挙動を見ましょう

```sample5.rb
hoge = "foobarbazfoobarbaz"

p hoge.scan(/(ba)(.)/)

=> [["ba", "r"], ["ba", "z"], ["ba", "r"], ["ba", "z"]]
```
こんな感じです
マッチした「部分文字列の配列」の配列を返してくれています
もちろんブロックパターンも使えます

```sample６.rb
hoge = "foobarbazfoobarbaz"

hoge.scan(/(ba)(.)/){|s| p s }

=> ["ba", "r"]
   ["ba", "z"]
   ["ba", "r"]
   ["ba", "z"]
```
#さいごに
問題をやろうかと思いましたが、なんか簡単なものしか思いつかなかったのでやめました

よくテレビなんかで「歌詞に"BABY"が最も入っている曲第一位は」とかやってますよね
小さい頃は「数えるの大変やったんやろうなー」なんて思っていましたが、これを使えばそんな心配は全くないですね
Goでduを高速化してみた

# 背景
後輩: ホームディレクトリのディスク使用率が100%になったみたいです！新規でログインできなくなりやした！
ワタシ: 犯人をさがせー
後輩: dfしたけど100%ってことしかわからんとです....
ワタシ: duで調べるんやで！ -sk？オプションはググって！
後輩: ググって実行したんですけど、めっちゃ時間かかって返ってこないっす....
ワタシ: 待つしかないなー＼(^o^)／


ワタシだけかもしれませんが、`du`ってオプション覚えられなくないですか？
あと、遅くないですか？

# こんな出力にしたいな
`ファイルパス　ファイル数　容量`
grepableにしたいよね〜


# 実装
Goにはゴルーチンという必殺の武器があるので、並列実行で早くなりますな！
https://github.com/kuritayu/infra-tools/blob/master/cmd/rapidu/main.go

# ベンチマーク
環境はMac、timeの出力結果。ファイル数`598909`、容量`129755.2 MB`。

```
du -sk /Users  0.58s user 11.63s system 57% cpu 21.387 total
```

```
/Users 598909 files 129755.2 MB     # 実際の出力結果
rapidu /Users  5.44s user 27.37s system 232% cpu 14.114 total
```

7秒早くなった。出力結果をシンプルにできた！
【C#】Listの使い方まとめ

##### 初期化
[型] 変数名 = new List<型>();

要素を指定して初期化するとき
[型] 変数名 = new List<型>({要素});

##### 位置のindex番号で要素を追加
var list = new List<string>();
list.Insert(index, item);

##### 要素のindex番号で要素を削除
var list = new List<string>();
list.RemoveAt(index, item);
【Laravel】条件付きで必須チェックの組み合わせを実現する。

### 「hoge 且つ fuga()」 が真の時に、hogeの必須チェックを有効にする

```php

    /**
     * 条件付き必須チェックの組み合わせを実現。
     * @param Validator $validator
     */
    public function withValidator(Validator $validator)
    {
        // 「hoge 且つ fuga」の時には必須チェックを有効にする
        $validator->sometimes('hoge', ['nullable', $this->fuga()], function ($o) {
            return $o->hoge == true;
        });
    }
```
【Rails】セキュアパスワード（has_secure_passwordメソッド）について

#概要
個人的にアプリ作成時にテーブル設計で`password_digest`をカラムとして、セキュアパスワードを利用する前提でテーブル作成していましたが、改めてセキュアパスワードについて理解しておくためまとめていきます。

#セキュアパスワードとは
パスワードの値をDB上にそのまま保存することはセキュリティ上問題があります。
そのためセキュアパスワードという**パスワードとパスワード確認をユーザーに入力させて、
その２つの値をハッシュ化したものをデータベースに保存するという方法**で脆弱性を回避します。

このハッシュ化というのは{key => value}のハッシュではなくて、ハッシュ関数というものを利用して入力されたパスワードを異なる値に変更する処理のことを指します。
パスワードをランダムな文字列に変換して、DBに保存するということ。


#セキュアパスワードの実装方法

##has_secure_passwordメソッドをモデルに記述

`has_secure_password`メソッドを利用して、`password_digest`カラムにハッシュ化した値を保存するという方法を行います。

ユーザーモデルに`has_secure_password`を記述します。
ついでに一般的なパスワードのバリデーションも追記しておきましょう。

```models/user.rb
class User < ApplicationRecord
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }
end
```

この記述によって、Userモデルは`password`と`password_confirmation`の２つの属性が使えるようになります。
さらに、ハッシュ化したパスワードをDB内の`password_digest`に保存するようになります。

## bcryptをinstall

次に`gem'bcrypt'`（ビークリプト）をインストールします。
has_secure_passwordメソッドを使用するためにbcryptが必要になります。
bcryptによってパスワードをハッシュ化するための関数が提供されます。

```Gemfile
gem 'bcrypt', '3.1.13'
```

Gemfileに追記して、

```
$ bundle install
```

# 確認

セキュアパスワードの設定をしてから、登録したユーザーのpasswordは以下のようにハッシュ化されて`password_digest`に保存されるようになります。

```
irb(main):001:0> User.last
  User Load (0.4ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> #<User id: 18, name: "testttt", email: "testtt@a.com", 
password_digest: "$2a$10$C/nH7reWZY/8QwbN8YFcaOjQSPtqW3aEDGrNuG.8ePP...", 
created_at: "2020-01-20 15:05:43", updated_at: "2020-01-20 15:05:43", 
password: nil, password_confirmation: nil, admin: false>
```
JavaScriptの正規表現


|正規表現記号|意味|
|:-:|---|
|.|任意の一文字|
|+|直前の文字を1回以上繰り返す最長の文字列|
|*|直前の文字を0回以上繰り返す最長の文字列|
|?|直前の文字を0~1回繰り返す最長の文字列|
|+?|直前の文字を1回以上繰り返す最短の文字列|
|*?|直前の文字を0回以上繰り返す最短の文字列|
|??|直前の文字が0~1回繰り返す最短の文字列|
|｜|OR|
|\|直後の正規表現記号をエスケープ|
|[　]|括弧内のいずれか一文字|
|[^　]|括弧内の文字列以外|
|[a-Z]|括弧内のみで使える文字の範囲指定|
|(　)||
|{n}|直前の文字をn回繰り返す|
|{n,}|直前の文字を繰り返す最小回数|
|{n,m}|直前の文字を繰り返す最小回数と最大回数の範囲で最長の文字列|
|{n,m}?|直前の文字を繰り返す最小回数と最大回数の範囲で最短の文字列|


|標準エスケープ文字|意味|
|:-:|---|
|\t|タブ|
|\r|改行|
|\n|改行|
|\d|全ての数字|
|\D|全ての数字以外の文字|
|\s|垂直タブ以外の全てのスペース|
|\S|全てのスペース以外の文字|
|\w|アルファベット、アンダーバー、数字|
|\W|アルファベット以外、アンダーバー以外、数字以外|

|位置の指定|意味|
|:-:|---|
|^|直後の文字が行頭|
|$|直前の文字が行末|
|\<|単語の先頭|
|\>|単語の直継|
|\b|単語の先頭か末尾|
|\B|単語の先頭以外か末尾以外|
|\A|ファイルの先頭|
|\z|ファイルの末尾|
|\G|直前の一致文字列の末尾|

|置換・変換|意味|
|:-:|---|
|\0|一致した文字列全体に置換|
|\1-\9|一致した文字列の1-9番目に対応する文字列に置換|
|\l|直後の一文字を小文字に変換|
|\L...\E|挟まれた文字列を小文字に変換|
|\u|直後の一文字を大文字に変換|
|\U...\E|挟まれた文字列を大文字に変換|

|用例|結果|
|:-:|---|
|a....a|abcdefa|
|a*a|aa<br>aaaaaaaa|
|a.*a|aba<br>abbbbbbbbba|
|a+a|aaa<br>aaaaaaaaaaa|
【css】:hoverでちょっとした吹き出しを表示

#やりたい事
- リンクを:hoverした際に上にテキストを表示させる。
- テキストの文字数が変わっても崩れない。
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="kkkarin" data-slug-hash="LYEXedW" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="LYEXedW">
  <span>See the Pen <a href="https://codepen.io/kkkarin/pen/LYEXedW">
  LYEXedW</a> by KARIN (<a href="https://codepen.io/kkkarin">@kkkarin</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

参考：[意外と知らないvisibilityの活用方法！](https://www.mitsue.co.jp/knowledge/blog/frontend/201912/14_0000.html)

##補足

:warning:**content(擬似要素)にテキストを入れる場合の注意**

>デメリットとしては、SEO的な側面になりますが、疑似要素に指定された文言はテキストとしてみなされないという点です。
>
>googleのクローラーはHTMLのコードを解析し、テキストに何が書かれているか把握しています。
>
>CSSの疑似要素で文字を追加しても、その部分はテキストとしてみなされません。大切なことは疑似要素ではなく、HTML内に記述するようにしましょう。

引用元：[CSSの疑似要素の使い方！ befor・after をマスターしよう](https://wunderstand.net/1145/)
Vue.js で 変更したページから遷移する際、編集破棄確認メッセージを出力したい

## 色々とやっつけですが、書きました。

* （アンチパターンかと思いますが、）下記コードを **mixinとしてまとめて使ってます。**
* ページコンポーネントで、mixinをimportして使ってください。
* 適したタイミングで `addWatchEventsFor` メソッドを呼びます。引数で渡した名前のプロパティの値が変更されたら、フラグが立ちます。
* フラグが立った状態でページ遷移をしようとすると、「よろしいですか？」のメッセージが出ます。

```confirmEditDiscard.js
export default {
  data() {
    return {
      //対象オブジェクトが変更されたか
      isWatchPropChanged: false
    };
  },
  /**
   * 対象オブジェクトの変更監視イベントを追加する。
   */
  methods: {
    addWatchEventsFor(watchPropName) {
      this.$watch(
        watchPropName,
        // 変更があったらフラグを立てる
        function() {
          this.isWatchPropChanged = true;
        },
        { deep: true }
      );
    }
  },
  beforeRouteLeave(to, from, next) {
    // 確認画面へは、チェックせずページ遷移
    const componentName = this.$options.name;
    if (componentName === to.name.replace("Confirm", "")) {
      next();
      return;
    }
    // 変更がない場合も、チェックせずページ遷移
    if (!this.isWatchPropChanged) {
      next();
      return;
    }

    window.confirm("編集データは破棄されます。よろしいですか？")
      ? next()
      : next(false);
  }
};

```
JetBrains_学習ノート_002

# HUAWEI MateBook D 2018モデルを購入しました!
- Huawei homepageに載せたイメージ
![huawei matebook D](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/129e87df-aef4-6087-0240-75ebd932e5f7.png)

- Amazon の配送状況
![配送](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/626a32b5-fa9b-31bd-7ae1-16b93a72be1d.png)

- これからこの新しいパソコンで勉強になります。期待しています。

- 新品入手しました。
    - スクリーン （15.6インチ非光沢）
![screen](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/5e3f7ecb-7d10-eb17-f4bd-dd65bef0343d.jpeg)

    - キーボード（macのキーボードと似ている）
![keyboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/714a852d-32bb-83dd-8c7d-9bd4176befb4.jpeg)
Google Datastore 1500bytes制限と回避方法（PHP）

#概要
Google Datatstoreは、型定義もテーブル定義もせずがんがんデータ突っ込めます。
が、デフォルトのままデータ入れていると、1500バイトを超えたところで、PHPの場合、500エラーで止まります。
エラーメッセージは、`The value of property "data" is longer than 1500 bytes` という感じ。

#なぜエラーが出るか、大きなデータは突っ込めないのか。
Datastoreは、何も指定しなければ、インデックスが貼られます。
インデックスが貼られているデータは、1500バイトまでという制限があります。
つまり、インデックスを貼らなければOK

#データ挿入時にインデックス対象から外す
事前のテーブル定義がないので、データ挿入時にインデックスしない、という指定をするしかなさそう。

##コード
PHPのライブラリでデータをINSERTするときのコード。
以下のコードの場合、answerdetailだけインデックスしません。

```php
$dbKey = $datastore->key($GLOBALS['DB_prefix'].'groupexamlog');
$dbData = $datastore->entity(
	$dbKey,
	[
		'groupid' => $groupid,
		'userid' => $userid,
		'score' => $score,
		'scoremax' => $scoremax,
		'duration' => $duration,
		'answertime' => $answertime,
		'answerdetail' => $answerdetail
	],[
		'excludeFromIndexes' => ['answerdetail']
	]
);
$result = $datastore->insert($dbData);

```

##参考
https://cloud.google.com/datastore/docs/concepts/indexes?hl=ja
Laravel で バリデーションルールに Twitter のTweetのルールを使う

#やりたいこと
Twitter連携アプリを作成しており、入力をフロントで`twitter-text.js`を使ってバリデーションしましたが、サーバー側でも行いたい。

公式からはPHP向けのが公開されていませんが、PHP向けのを公開していただけている方がいるので、ありがたく使わせていただきます。
メンテンナンス頻度も高いです。

#インストール

```
composer require nojimage/twitter-text-php
```

#Laravelで独自ルール作成

```
php artisan make:rule TwitterTextRule
```

```php:TwitterTextRule
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Twitter\Text\Parser;

class TwitterTextRule implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $parser = new Parser();
        $parse_result = $parser->parseTweet($value);
        //weightedLengthに文字数、validにツイートできるか
        return $parse_result->valid;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return ':attributeはTweetできません。';
    }
}
```

あとはバリデーションルールに指定する
JetBrains IDEの右上のツールバーに、特定Git操作のショートカットButtonを追加したい


# 雑記

* 日本語で検索してHITして、少しでも誰かの時間が減ったらいいなーと思って、雑ですが書きました。<br>手順は[参考サイト](https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000520760-Add-a-Git-push-button-to-the-toolbar)を見てください。

## 余談

* 当方は fetch と pull を右上に設置してます。
* いろいろなバリエーションを設定できるようなので、可能性は無限大にありそう。
[Android]アプリ開発でのSonarQube~Java~

はじめに
==
JavaでAndroidアプリの開発を行うときにSonarQubeを導入した時の手順を記載していきます。
ミニマムで導入した手順です。
Kotlinはもう少しシンプルにできると思います。

環境
==
OS：Windows 10(64bit)
Java：11
Android Studio：3.5

SonarQube
==
SonarQubeとは静的解析ツールの一つでJava, Kotlin, Swift, Goなど25以上の言語をサポートしているようです。
JenkinsやAzure DevOpsと連携することでCIツールの強化を図ることができるようです。

詳細は[公式ドキュメント](https://www.sonarqube.org/)を参照してください。

導入手順
==
基本的には公式の[Get Started in Two Minutes Guide](https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-gradle/)に沿って行きます。

1.SonarQube Serverのインストール
-
以下のリンクからDownloadします。
[Download SonarQube](https://www.sonarqube.org/downloads/)

適当な場所に展開します。
今回は以下の構成にします。
C:\SonarQube\SonarQubeServer

2.SonarQubeServerを起動
-
以下にあるbatを実行するだけです。
C:\SonarQube\SonarQubeServer\bin\windows-x86-64

```
C:\SonarQube\SonarQubeServer\bin\windows-x86-64>StartSonar.bat
```
http://localhost:9000/ にアクセスするとSonarQube Serverの画面を確認できます。
<img width="945" alt="sonarqubeserver_notdone.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/3fb5bd59-baed-3f3b-0ffd-53729abde84e.png">


3.Gradleの設定
-
プロジェクト配下のbuild.gradleの編集を行います。
build.gradleの先頭に以下を追記します。

```
plugins {
  id "org.sonarqube" version "2.7"
}
```


4.gradle.propertiesの設定
-
ここからはアプリ側の設定を行っていきます。
公式では[SonarScanner for Gradle](https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-gradle/)を参考にしてます。
gradle.propertiesに以下を追記します。

```
# gradle.properties
systemProp.sonar.host.url=http://localhost:9000
 
#----- Token generated from an account with 'publish analysis' permission
systemProp.sonar.login=<token>
```

tokenはSonarQube Serverから取得します。

5.Tokenの取得
-
SonarQube Serverに戻ります。
(1) 右上のLog inからログイン

```
ユーザー名：admin
パスワード：admin
```
(2) 右上のユーザーアイコンのMy Accountから管理者画面に移動
(3) Securityのタブを選択
(4) Tokensのところにプロジェクト名を入れてTokenを取得

6.実行
-
以下のいずれかで静的解析を実行
(1) Android SrudioのGradle > app > Tasks > other > sonarqubeをダブルクリック
<img width="317" alt="sonarqube.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/5d5ab9d0-8bb4-586c-8564-09981dc68828.png">


(2) プロジェクト配下で以下を実行

```
./gradlew sonarqube
```

7.確認
-
http://localhost:9000 にアクセスしてappが表示されれば完了
<img width="946" alt="sonarqubeserver.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/a0627377-a711-56dc-1baf-43accc5552ad.png">

参考文献
=
・[公式](https://www.sonarqube.org/)
・[SONNARQUBEでソースコードの品質を解析する](https://t246osslab.wordpress.com/2016/11/20/sonnarqube%E3%81%A7%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%93%81%E8%B3%AA%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B/)
　　最初にSonarQubeを導入するにあたって参考にさせていただきました。Kotlinのプロジェクトはこちらの記事で解析まで行うことができました。
68日目 【Kaggle入門】ランダムフォレストは単純なやつでした。

前回、性別だけモデルでランダムフォレストで予想したところ、男性全員死亡、女性全員生存というずいぶんな結果になりました。
[67日目 【Kaggle入門】ランダムフォレストを使ってみたが？](https://qiita.com/robamimim/items/302216707e24c944dbd2)

#ランダムフォレストとはいったい何者なのか。
いろいろ実験してみました。


##性別&クラスモデルの作成
前回作成した性別だけモデルに`Pclass`を加えます。

```21.py
(前略）
#Dataframeを作る
#性別、等級
train_df = train_df.loc[:,['PassengerId','Survived','Sex','Pclass']]
test_df = test_df.loc[:,['PassengerId','Sex','Pclass']]
（以下同文）
```

その結果`Public Score:0.75598`・・・下がりました。[タイタニック \(客船\)のWikipedia](https://ja.wikipedia.org/wiki/%E3%82%BF%E3%82%A4%E3%82%BF%E3%83%8B%E3%83%83%E3%82%AF_(%E5%AE%A2%E8%88%B9))をみる限りでは、等級ごとに死亡率は大きく異なるはずなのに、不思議です。

>生存者と死者の割合のうち、三等船室を利用していた客の死者が多い。三等船室が下部の前方と後方に分断されて配置されており、沈没の際、前方の客室にいた客が脱出するためにはそのまま真上に上がるか、もしくはそのまま船体を突っ切って後方に移動してから真上に上がる2つの方法があった。ところが前者はその真上に一等船室があったためドアが施錠されており、後者の方法だけしかなかったのが、死者が増えた原因だという説もある。

（メモ）三等船室を前室と後室に分けられたら予測をあげられそうです。

##クラスだけモデルを確認

```22.py
（前略）
#Dataframeを作る
#等級
train_df = train_df.loc[:,['PassengerId','Survived','Pclass']]
test_df = test_df.loc[:,['PassengerId','Pclass']]
（以下同文）
```

`Public Score:0.65550`

さらに下がりました。おそらく、性別だけモデルのように、等級だけモデルでは0か1にまとめられている気がします。確かめてみます。

####訓練データ

```23.py
print(train_df.groupby(['Pclass','Survived']).count())

                 PassengerId
Pclass Survived             
1      0                  80
       1                 136
2      0                  97
       1                  87
3      0                 372
       1                 119
```
####テストデータ

```24.py
##確認のため予測結果(submission)にクラスを追加する。
submission['Pclass'] = test_df['Pclass'] 
print(submission.groupby(['Pclass','Survived']).count())
                 PassengerId
Pclass Survived             
1      1                 107
2      0                  93
3      0                 218
```

訓練データではクラスの中に０と１がありましたが
テストデータ（予測結果）は０か１にまとめられています。

#ランダムフォレストは、訓練データの多い方に予測をまとめてしまうようです。

##性別＆クラスモデルを確認

####訓練データ

```25.py
print(train_df.groupby(['Sex','Pclass','Survived']).count())
                    PassengerId
Sex Pclass Survived             
0   1      0                  77
           1                  45
    2      0                  91
           1                  17
    3      0                 300
           1                  47
1   1      0                   3
           1                  91
    2      0                   6
           1                  70
    3      0                  72
           1                  72
```

####テストデータ

```26.py
#確認のため予測結果(submission)に性別とクラスを追加する。
submission['Sex'] = test_df['Sex'] 
submission['Pclass'] = test_df['Pclass'] 
print(submission.groupby(['Sex','Pclass','Survived']).count())
                     PassengerId
Sex Pclass Survived             
0   1      0                  57
    2      0                  63
    3      0                 146
1   1      1                  50
    2      1                  30
    3      0                  72
```

訓練データにあったばらつきが、テストデータではまとめられています。
ランダムフォレストは多い方にまとめてしまうようです。
Vue.js(Vuex) で mapActions に別名（エイリアス）を付けて扱う

## 例

* `update/index.js` に定義されている`update`というアクションを、<br>
このインスタンスの中では `this.updateAction` とCallできる。

* エイリアスは同名でも、問題なし。

* 名前が衝突すると、無限ループになったりするので、そういう時に使った。

```javascript

import { mapActions } from 'vuex'

export default {
  // ...
  methods: {
    ...mapActions("update", {
      updateAction: "update",
      clearForms: "clearForms"
    }),
  }
}

```
Node.js(Express) + Multer + S3で画像をフォームからアップロードする

#目的
フォームから画像やファイルをクラウド上(今回はS3)にアップロードするため

#背景
最近Nodeを触っていて、ググっても色々情報はあるものの、フォームからS3に上げるどうこうっていうのはまとまってなかったので。

#前提条件
・AWS
・S3
・環境変数、aws-sdk, multer, multer-s3をインストールしておくこと
上記のセットアップが終わっていること。

#コード


```node.js
var express = require('express');
var router = express.Router();
var path = require('path');
var AWS = require('aws-sdk');
var multer = require('multer');
var multerS3 = require('multer-s3');

const s3 = new AWS.S3({
  accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID, 
  secretAccessKey: process.env.AWS_S3_SECRET_KEY,
  Bucket: '自分のバケット'
});

const profileImgUpload = multer({
  storage: multerS3({
    s3: s3,
    bucket: '自分のバケット',
    metadata: function (req, file, cb) {
      cb(null, {fieldName: file.fieldname});
    },
    key: function (req, file, cb) {
      cb(null, Date.now() + file.originalname);
    }
  }),
  limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
  fileFilter: function (req, file, cb) {
    checkFileType(file, cb);
  }
}).single('フォーム上のnameのパラメータ');

function checkFileType (file, cb) {
  // Allowed ext
  const filetypes = /jpeg|jpg|png|gif/;
  // Check ext
  const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
  // Check mime
  const mimetype = filetypes.test(file.mimetype);
  if (mimetype && extname) {
    return cb(null, true);
  } else {
    cb('Error: Images Only!');
  }
}

router.get('/', function (req, res, next) {
  var data = {
    title: '画像アップロード',
  };
  res.render('index', data);
});

router.post('/profile-img-upload', (req, res, next) => {
  profileImgUpload(req, res, (error) => {
    if (error) {
      console.log('errors', error);
      res.json({ error: error });
    } else {
      // If File not found
      if (req.file === undefined) {
        console.log('Error: No File Selected!');
        res.json('Error: No File Selected');
      } else {
        // If Success
        const imageName = req.file.key;
        const imageLocation = req.file.location;
        // Save the file name into database into profile model
        res.json({
          image: imageName,
          location: imageLocation
        });
      }
    }
  });
});

```

```index.pug
form(action='/profile-img-upload', enctype='multipart/form-data', method='post') 

h3 プロフィールイメージ
 input(type='file', name='profileImage')
 input(type='submit', value='登録')

```

#感想
バババッと適当に書いてしまったので、もし質問等あれば、コメントください！

何を思ったのか急に投稿してみようって思ったので、初投稿です。
大した記事でないけれど、次回以降は丁寧に書いて、価値のある記事を書きます
【CSS】position: absolute; と position: relative;

## position: absolute;
:sunny: 要素の配置位置を決められる
:sunny: サイトの左上部分を基準とし、そこから top と left を用いて指定
:sunny: right や bottom を用いることも可
:sunny: 要素どうしを重ねて表示することもできる

<img width="114" alt="スクリーンショット 2020-01-20 22.19.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/383affc5-1207-a01d-559f-93bcfad8279f.png">

普通に作成すると上記のようになります。
これを position: absolute; を使って移動させます。

赤い四角の方を・・・

```赤い四角.css
position: absolute;
top: 100px;
left: 50px;
```

青い四角の方を・・・

```青い四角.css
position: absolute;
top: 170px;
left: 100px;
```

<img width="213" alt="スクリーンショット 2020-01-20 22.48.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/ca60c5b6-f4b2-63d4-f7cc-e18b95504fe7.png">

このようになります:smile:
なぜこのような位置になるかというと

<img width="208" alt="スクリーンショット 2020-01-20 22.28.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/535dc7c9-f820-ef5b-9236-efefe4fd552d.png">

サイトの左上を始点・・・ゼロとします。
赤い四角で言えば、そのゼロの位置から top は 100px 下のところになるよ。
そして left は 50px 左に行ったところになるよ。
ということです。

## position: relative;
:sunny: 指定した**親要素の左上部分を基準位置**とすることができる
:sunny: その親要素を基準として子要素の配置位置を決めることができる

さきほど position: absolute; で基準位置はサイトの左上と言いましたが
この基準位置を変更できるのが position: relative; です。

<img width="213" alt="スクリーンショット 2020-01-20 22.48.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/052d5a40-b644-115a-e6b4-7f3f366bae00.png">

さきほどの図をつかって説明します。
赤い四角を親要素としますね:smile:

あ、どちらかを必ず親要素にしないとダメです。
このまま赤い四角を position: relative; しても青い四角は動いてくれないです。
必ず基準位置にしたいものを親要素にしてくださいね:smile:
動かしたい子要素は親要素の入れ子にしてコード記入したら大丈夫です:smile:

こんな感じ
↓

```例.html
    <div class="red">赤い四角
      <div class="blue">青い四角</div>
    </div>
```

話を戻しまして、赤い四角を親要素とし
青い四角を子要素としたときの CSS はこんな感じ

```赤い四角.css
.red {
  width: 100px;
  height: 100px;
  background-color: red;
  text-align: center;
  line-height: 100px;
  position: absolute;
  top: 100px;
  left: 50px;
  position: relative;
}
```

position: relative; 追加しただけです:sweat_smile: 
で、青い四角はというと

```青い四角.css
.blue {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  text-align: center;
  line-height: 100px;
  position: absolute;
  top: 170px;
  left: 100px;
}
```

なにも変更していません:sweat_smile: 
どうなったかというと
<img width="268" alt="スクリーンショット 2020-01-20 23.37.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/f9971c54-13e0-102f-6d93-7b78fdd30977.png">
こうなりました:smile:

さきほどはサイトの左上を基準としましたが
今回は赤い四角の左上を基準としたため
そこから top は 170px 下のところになり
そして left は 100px 左に行ったところに青い四角は配置されました:smile:
LocalAvatarの手が表示されなくなった時の解決策

# 現象
LocalAvatarの手が表示されない。

# 解決策
Oculus > Avatars > Edit SettingsでIdを設定する。
（Forumの回答者によると、Idは有効なものでなくても良い。）

AppIdを取得したい場合は、下記Create New AppからId取得可能。
https://dashboard.oculus.com/




---
参考
https://forum.unity.com/threads/oculus-local-avatar-hands-not-visible.730457/#post-5185838
https://qiita.com/shiena/items/0b7735a80e7d4358e5fb
[Python3 入門 13日目]7章 文字列（7.1〜7.1.1.1）

#7.1 文字列
##7.1.1 Unicode

- コンピュータの記憶の基本単位は**バイト**で、8個のビットを使って256種類の一意な値を表現できる。
    - ビット:2進数（0と1、バイナリ）で表した数字の桁数。4ビットは4桁、8ビットは8桁の2進数であり、それぞれ2の4乗(16)、2の8乗(256)通りの数字を表せる。
    - バイト:8ビットで1バイト。1バイトを表すのに16進数を使うと分かりやすい。 

- Unicodeは世界の言語の全ての文学と数学、そのほかの分野の記号を定義しようという発展途上の国際標準。

###7.1.1.1 Python 3のUnicode文字列

- Python3の文字列はUnicode文字列であり、バイト列ではない。
- 文字のUnicode IDまたは名前を知っている場合、Python文字列でそれを使うことができる。
- Pythonのunicodedataモジュールには双方向ほ変換関数が含まれている。
    - lookup():名前（大文字と小文字を区別しない）を与えると、Unicode文字が返される。
    - name():Unicode文字を与えると、大文字の名前が返される。

```py

>>> def unicode_test(v):
...     import unicodedata
#文字から名前を引き出す
...     name=unicodedata.name(v)
#名前から文字列を引き出す。
...     v2=unicodedata.lookup(name)
...     print("v=%s,name=%s,v2=%s"%(v,name,v2))
... 
>>> unicode_test("A")
v=A,name=LATIN CAPITAL LETTER A,v2=A

#UnicodeのASCII記号
>>> unicode_test("$")
v=$,name=DOLLAR SIGN,v2=$
#Unicodeの通貨記号
>>> unicode_test("\u00a2")
v=¢,name=CENT SIGN,v2=¢
>>> unicode_test("\u20ac")
v=€,name=EURO SIGN,v2=€
#代替記号の表示
>>> unicode_test("\u2603")
v=☃,name=SNOWMAN,v2=☃

```

```py

>>> place = "cafe"
>>> place
'cafe'
>>> import unicodedata
>>> unicodedata.name('\u00e9')
'LATIN SMALL LETTER E WITH ACUTE'
>>> unicodedata.lookup('LATIN SMALL LETTER E WITH ACUTE')
'é'
#コードにより文字列指定
>>> place = "caf\u00e9"
>>> place
'café'
#名前により文字列指定
>>> place = "caf\N{LATIN SMALL LETTER E WITH ACUTE}"
>>> place
'café'

>>> u="\N{LATIN SMALL LETTER U WITH DIAERESIS}"
>>> u
'ü'

#len()はバイト数ではなく、Unicodeの文字数を数える。
>>> len("&")
1
>>> len("\U0001f47b")
1


```
 

#感想
エンコーディングやデコーディング、バイト列等聞いた覚えがないような言葉が結構出てきた。一つ一つ調べながらやろう。


######参考文献
「Bill Lubanovic著 『入門 Python3』(オライリージャパン発行)」
イベント メモ

EventHandlerとEventArgsについて調べたのでそれのメモ。

```
using System;

public class EventTest
{
    // イベントに何をするかを登録する。
    private void Start()
    {
        var sample = new EventSample();
        sample.HogeHappend += DoSomething;
    }

    // 何をするかの中身
    private void DoSomething(object sender, HogeEventArgs e)
    {
        Console.Write(e.Text);
        Console.Write(e.Num);
    }
}

// イベントを着火する側のクラス。
public class EventSample
{
    public void DoSomething()
    {
        // 引数を用意して着火();
        var e = new HogeEventArgs();
        OnEventHappend(e);
    }

    private void OnEventHappend(HogeEventArgs e)
    {
        // もしイベントがあれば実行。
        HogeHappend?.Invoke(this, e);
    }

    public event EventHandler<HogeEventArgs> HogeHappend;
}

// イベントの引数に持たせる情報。
public class HogeEventArgs : EventArgs
{
    public string Text;
    public int Num;
}
```
オブジェクトの配列から、特定Keyのみの配列をつくる

### JavaScript でオブジェクトの配列から、特定のKeyのValueで配列を作る

```javascript

const hoge = [
 { a : 1, b : 4 },
 { a : 2, b : 5 },
 { a : 3, b : 6 }
];

const fuga = hoge.map((obj) => obj.a);

console.log(fuga); // [1,2,3]
```
Vue.jsコンポーネント内でLaravelの .envを使用する方法

#これまで
[axiosインスタンスの作成（カスタム設定）](https://github.com/axios/axios#axioscreateconfig)をしたいときの`baseURL`の記述部分で直接記述しても良いのか？という疑問に当たりました。

また、本番環境・開発環境などとこれから設定値も切り替えたいものでもありました。

```javascript
let $axios = axios.create({
    baseURL: 'http://localhost:8000',
    timeout: 5000,
    headers: {
        'Content-Type': 'application/json'
    }
})
```


#対処

`process.env.[変数名]`でアクセスできる.

[Laravel環境変数](https://laravel.com/docs/5.7/mix#environment-variables)

```javascript
let $axios = axios.create({
    baseURL: process.env.MIX_BASE_URL,
    timeout: 5000,
    headers: {
        'Content-Type': 'application/json'
    }
})
```
```:env
MIX_BASE_URL=http://localhost:8000
```

#所存
環境で変化するものはenvに入れてみようかなと思います（仮）

#参考
https://medium.com/@patrickcurl/using-laravel-env-variables-inside-vue-js-components-29faa9a344c5
CO-LABO SAKURAのシェアオフィス に行ってきました

## 前置き
佐倉市にいくつかコワーキングスペースがありますが、[CO-LABO SAKURA](http://www.city.sakura.lg.jp/sakura/sop/)は市内で初めての本格的なコワーキングスペースです。
施設が整っていて、コワーキングスペースの必要最低限を押さえています。

以下の期間ですが無料で利用できますのでぜひ。私も数日行ければと思っています。

##  無料期間案内
----
実施期間　1/25(土)～1/31(金)
URL ： http://www.city.sakura.lg.jp/0000025921.html

    佐倉市は、東京都が提唱する「冬のスムーズビズ実践期間」に賛同し、多様な働き方を応援します！
    下記期間中は、CO-LABO SAKURAのコワーキングスペース時間利用料金(最大1,500円／日)を無料にします！
    ぜひこの期間にテレワークのお試し利用などをご検討ください！
----

何度かお邪魔させてもらっていますがいいところと、改善したらいいとろを重要度順に列挙します。
ちなみに私の業種はITです。

##  **いいところ**
1. 駅から近い
2.  スーパー(オーケー)近くてお昼もおやつも飲み物も安く買い放題
3.  駐車場無料
4. 駐輪場無料(バイク・自転車) 
5.    まだ人が少なくて快適
6.    お湯は自分で作れる
7.    レンジあり
8.    月額会員だと相当お得(8800円/月)
9.    二人部屋借りても3.5万(現在空き無し)
10.冷蔵庫あり（後述あり）
11.    市の出張所がありいざというとき時間を取られない
12.    映画館がある、マックがある、美味しい中華料理屋がある

##  **改善したらより良くなること**
1.    自販機を含め飲み物の提供が一切ない
2.    ティッシュ・キッチンペーパーなどの備品が無い
3.    冷蔵庫が小さい(スペースが広いので大きいほうが良い)
4.    電話部屋に仕切りがない(秘密の話ししたいです)
5.    椅子がしょぼい
6.    トイレの利用者が多いようで、掃除がまにあっていないときがある
7.    会議室が一つだけ(規模に対して少ない)
8.    会計にカードなどキャッシュレスの手段が使えない
9.    カードをかざす位置が低すぎる。その他キッチン等も何故か低い
10.    工作室は使わない、、、
11.    通常のコンビニはない(ユーカリが丘駅に小さいファミマのみ）

## 利用提案
静かなため中学生くらいの人が学習スペースとして使っているのが印象的。
朝早くから開けて(現在8時半から)朝食でも提供すれば仕事に行く前の方が集まりそうです。
ホテルのロビーのような使い方ができるかもしれません。

## 改善点に関して
**改善点はオフィスに必要なものは何か**を今一度洗い出すと解消しそうです。
市が作ったとはいえ、オフィスワークしたことない人が作ったのではないかと思う部分があります。
自販機は外部の方と共用でもいいのでほしいですねぇ。。。干上がりますよ。

## 料金
月額の料金が安すぎると思います。コワーキングスペース月額8,800円って。
比べても仕方ないですが東京のWeworkなんて月額65,000円位からスターとですぜ。
せめてもう10%くらい値上げしてキッチンペーパーなど高頻度消耗品購入に当てていただきたい。
市役所と一緒に購入すれば結構安く入れられるのではないだろうか。
また、部屋の月額料金が単純に広さの比例で決まっている。広いほうが単価が安いほうが良さげな気がします。
商売っ気がないというかなんというか。

## 周囲の音
近くに子供が遊べるスペースがありますが、気を乱されるほどの騒がしさは聞こえません。
必要ならより奥にある4箇所の仕切りのあるスペースを利用されるといいかと思います。

## 便利すぎて太る
私はスーパーで買物ができて幸せです。ATMもあるし大抵のものは揃います。
現状週に一度くらいが限度ですが、もう少し頻度を上げてここで働きたいですね。
しかし建物内が便利でそうそう歩かないことと、スーパーのせいで体重が増えてきました。
でもご安心を「ルネサンス」があります！(行く気ないけど)

## お気に入り
仕切りのある部屋の壁は、焼き物が塗り込められています。これは職人さんが一個ずつ壁に貼ったようで、相当な手間が掛かっているように思えます。
壁紙ではありません、職人さんすごい！
![2020-01-19 09.49.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106545/d5fda859-b1dd-2830-b5e1-c954da7bb43d.jpeg)


## イベントスペース
このコワーキングスペースの中には実はイベントスペースがあります。
山万(不動産開発デベロッパー)が所有するイベントスペースで、Max30人位入れそうです。通常は立ち入りできません。
イベントの裏方やってた身からすると、スーパーが真下にあるのは大変うれしいです。
**食べ物も、アルコールもエレベーター降りたただけで買いに行けて、カートを借りれば運搬も超絶楽です。**
中華料理屋（やぜず）さんが昼間に弁当の配達をしているので、もしかしたら夜に届けてもらうこともできるかも。
とても美味しい中華料理屋さんです。
まぁユーカリが丘でITのイベントやるグループは無いと思いますが。開催してくれたら行きたいな。

## さいごに
2020年4月で開設1年になり、それを期に業務委託になる可能性があるそうです。
いい方向に変わるといいのですが、業務委託になると大幅な施設の改修が難しくなるでしょう。
コワーキングスペースという業態が世間ではまだまだ認知段階なので細くてもいいので続けていただけると嬉しいです。
最終的には業務時間外で、街の集会所的に使われるといいのかなとか思っています。
docker


設定メモ
![スクリーンショット 2020-01-20 23.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201107/41629a7d-befb-8546-b1b7-9968f4c4f34a.png)



起動時のファイル共有がうまくいったのでメモ

```
$ docker run -itd --name nuxt4 -v ~/work/:/work -p 80:80 nuxt-image 
```




参考
https://qiita.com/y_kawase/items/1de690b40553ef76acb3
https://www.bravesoft.co.jp/blog/archives/3942
https://qiita.com/momoto/items/1992d68de8baa7e29bb5
https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2
http://kouji1981.hatenablog.com/entry/2014/09/22/%E3%80%90Docker%E3%80%91_%E3%83%9B%E3%82%B9%E3%83%88%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B
クリスマスなので、ツイッターでコラボしてみた


### クリスマス爆発しろ
表題の通りですが、例年通り、SNSランドに住み着いている通りのカメでした。
長く住み着きすぎたので、クリスマスアプリを実装してみました

---

### ツイッターでコラボ
今回は、ツイッターのちょまど (https://twitter.com/chomado) さんの子をお借りして、Unityの３Dアプリ開発の学習を兼ねてコラボをしてみました

---

# どんなアプリ
キャラクターが壁になっていて、壁で見て回れるアプリです
近未来できるといいなーと思いながら、エフェクトの学習も兼ねてみました

---

# 完成品
unityroom
https://unityroom.com/games/chirstmas_bakuhatsu

---
C# メモ 任意の3点を通る平面と２点間を通る直線、その交点を求めるのに使ったのを残すためのメモ。

実際にはPlaneとRayだけでやれる。
軸が違うので変換or変数入れ替えしないといけない。
(このコードでは高さがz奥行きがy、幅がx,unityでは高さy,奥行きz,幅x向きも違う。)

```

using UnityEngine;

public class StraightLine
{
    public readonly float XParamCoefficient;
    public readonly float XConstant;
    public readonly float YParamCoefficient;
    public readonly float YConstant;
    public readonly float ZParamCoefficient;
    public readonly float ZConstant;

    public StraightLine(float XParamCoefficient, float XConstant,
                        float YParamCoefficient, float YConstant,
                        float ZParamCoefficient, float ZConstant)
    {
        this.XParamCoefficient = XParamCoefficient;
        this.XConstant = XConstant;
        this.YParamCoefficient = YParamCoefficient;
        this.YConstant = YConstant;
        this.ZParamCoefficient = ZParamCoefficient;
        this.ZConstant = ZConstant;
    }

    public static StraightLine Make(Vector3 p1, Vector3 p2)
    {
        var d = p2 - p1;
        return new StraightLine(d.x, p1.x, d.y, p1.y, d.z, p1.z);
    }
}
```

```
using UnityEngine;

public sealed class Plane
{
    private readonly float p;
    private readonly float q;
    private readonly float r;

    private readonly float x0;
    private readonly float y0;
    private readonly float z0;

    private Plane(float p, float q, float r, float x0, float y0, float z0)
    {
        this.p = p;
        this.q = q;
        this.r = r;
        this.x0 = x0;
        this.y0 = y0;
        this.z0 = z0;
    }

    public static Plane Make(Vector3 a, Vector3 b, Vector3 c)
    {
        var ab = b - a;
        var ac = c - a;
        var n = new Vector3(ab.y * ac.z - ab.z * ac.y,
                            ab.z * ac.x - ab.x * ac.z,
                            ab.x * ac.y - ab.y * ac.x);

        return new Plane(n.x, n.y, n.z, a.x, a.y, a.z);
    }

    public Vector3 GetIntersection(float XParamCoefficient, float XConstant,
                                   float YParamCoefficient, float YConstant,
                                   float ZParamCoefficient, float ZConstant)
    {
        var param = (p * (x0 + XConstant) + q * (y0 + YConstant) + r * (z0 + ZConstant))
                    / (p * XParamCoefficient + q * YParamCoefficient + r * ZParamCoefficient);

        return new Vector3(XParamCoefficient * param - XConstant,
                           YParamCoefficient * param - YConstant,
                           ZParamCoefficient * param - ZConstant);
    }
}
```
backstopjsをgulpで実行する


## はじめに
タイトルの通りです。
readmeで真っ先に出てくるのが`backstop init`、`backstop test`、`backstop approve`あたりで、そっちに目がいってしまいgulpで実行する方法を見失ってしまいがちなので、備忘録までに。
https://github.com/garris/backstopjs#the-backstopjs-workflow

**backstopjsを一回でも動かしたことがある人、backstopjsで何が出来るか知っている人向けの内容です**

## backstopjs
https://github.com/garris/backstopjs
ヘッドレスブラウザを用いて変更前と変更後のURLからスクリーンショットを取得し、視覚的に差分を抽出してくれるビジュアルリグレッションテストツール

## 結論
https://github.com/garris/backstopjs#since-the-backstop-returns-promises-so-it-can-run-natively-as-a-task-in-build-systems-like-gulp

gulpfile.jsに下記の内容を書いてgulpで実行できます

```js
const gulp = require('gulp');
const backstop = require('backstopjs');

gulp.task('backstop_reference', () => backstop('reference'));
gulp.task('backstop_test', () => backstop('test'));
```

## もうちょっと詳しく

#### バージョン
- macOS mojave
- node v11.4.0
- npm version 6.9.0
- backstopjsとgulpは202001時点で最新をいれます

#### 前提

- プロジェクトフォルダで`npm init`までしている

#### 手順
##### backstopjsをインストールする

```bash
$ npm install --save-dev backstopjs
```


##### backstopjsの初期設定

```bash
$ npx backstop init
```
`backstop.json`が出来るはず。
差分抽出のURLにデフォルトで`https://garris.github.io/BackstopJS/`がはいっています。が、この記事ではそのあたりに触れないのでそのままいきます。


##### gulpをインストールする

```bash
$ npm install --save-dev gulp
```

##### gulpfile.jsを作成する

```bash
$ touch gulpfile.js
```

もしくは右クリック→新規作成で中身空の`gulpfile.js`を作成する

##### gulpfile.jsに書いて保存する

作成した`gulpfile.js`に下記の内容を入れる

```js
const gulp = require('gulp');
const backstop = require('backstopjs');

gulp.task('backstop_reference', () => backstop('reference'));
gulp.task('backstop_test', () => backstop('test'));
```

##### gulpタスクのbackstop_referenceを実行する
```
$ npx gulp backstop_reference
```

修正**前**のURLのスクリーンショットを取得しています（`$backstop reference`と同じことをやってる）
`backstop_data/bitmaps_reference`に画像が追加されていればOKです:ok_woman:


##### gulpタスクのbackstop_testを実行する
```
$ npx gulp backstop_test
```

修正**後**のURLのスクリーンショットを取得しています（`$backstop test`と同じことをやってる）
今度は`backstop_data/bitmaps_test/yyyymmdd-hhmmss`に画像が追加されていればOKです:ok_woman:
同時に`backstop_data/bitmaps_reference`の画像と比較され、`html_report`配下にレポートが出力されます。


## まとめ
gulpで走らせられたら運用が楽なのかなと思って調べてみたらちゃんとreadmeに書いてあったのでありがたかった
ssh接続のすヽめ

# はじめに
最近インフラの勉強をする中でsshを叩く機会が増えてきたので自分のアウトプットの場としてここでサーバーを扱う上では必須となるssh接続について書いていこうと思います！

ここでは深い原理的なところよりも実践的な設定や、使い方の話をメインにしたいと思います！

# 環境
* OS: MacOS Mojave 10.14.6

# sshとは？
そもそもsshとは何でしょうか？
sshとは　`secure shell`　の略で、鍵と呼ばれる暗号を用いてサーバー側の情報と照合を行い、合致すればそのサーバーと暗号化された通信を行うことができるコマンドのことです。

要はサーバーをコマンドライン上で操作できるようにするためのコマンドって感じです。
原理的に関しては以下の記事なんかを参考にしてみてください！
参考 -> https://www.kagoya.jp/howto/rentalserver/ssh/

# 使い方

```bash
ssh -i {KEYFILE_NAME} {USER_NAME}@{HOST_NAME}
```

オプションは-i以外にもいくつかあるようですがまずこれだけ覚えておけば大丈夫です。
基本的には上記の形で使用します。
{KEYFILE_NAME}には鍵のファイルを、{USER_NAME}にはサーバーのユーザー名を、{HOST_NAME}にはサーバーのホスト名を指定します。

例えば~/.ssh/keys/amazon_linux.pemという鍵ファイルを用いてec2-userというユーザーとして123.456.789.012というホストのサーバーに接続したい場合コマンドは以下のようになります。

```bash
ssh -i ~/.ssh/keys/amazon_libux.pem ec2-user@123.456.789.012
```

# configファイル
macOSでは~/.ssh/の中にあるconfigというファイルにssh接続に必要な情報を記述することでsshコマンドをより簡潔にすることができます！
先述の例をconfigファイルに記述すると以下のような感じです。

```conf
// ~/.ssh/config

Host linux // Host名、自分で決めていい
  User ec2-user // ユーザー名
  HostName 123.456.789.012 // ホスト名
  IdentityFile ~/.ssh/keys/amazon_linux.pem // 鍵ファイルのパス
  IdentitiesOnly yes // 鍵が必要かどうか
```

このように記述すると先に書いたコマンドの代わりに下記のコマンドを叩区ことで同様の接続ができます！

```bash
ssh ec2-user@linux
```

今回は以上になります！
ここまでご覧いただきありがとうございました！
自分自身まだまだ未熟なので訂正、指摘等ございましたらコメントにてよろしくお願いします🙇‍♂️
もちろんその他ご意見ご要望ご質問等もお待ちしております！
それではまた次回の記事でお会いしましょう🙌
Ultima Online(2D)のマクロ管理をgit化

githubと改行ルールが違って二重管理になるため、ここにはgithubのREADME.mdのコピペを載せます。
(githubにあっても検索で探せないため。)
https://github.com/github895439/uo_macro

```plaintext:README.md
本内容を利用した場合の一切の責任を私は負いません。

オリジナルはSJISだが純粋ではないため、そのままだとテキストファイルなのにgit管理できない。
0x00に対応することでgit管理できるようにする。

登録
オリジナルのmacros2d.txtをサクラエディタで開き、org2git.macマクロを実行し、UTF-8で別名保存する。
保存したファイルをgitに反映する。

使用
gitのマクロファイルをサクラディタで開き、git2org.macマクロを実行し、SJISで保存する。
保存したファイルをオリジナルと置き換える。

注意
マクロ内容を見てわかる通り、0x00を一括変換している。
このため半角ではない日本語に含まれた0x00も変換してしまうため、日本語を発言するマクロ等は誤動作することになる。
```
テンプレートマッチングを用いた画像レジストレーションをした



##テンプレートマッチングを用いて画像レジストレーション 

特徴点によるレジストレーションでは難しかった以下のような空と雲の画像(可視画像と赤外画像)に対してレジストレーションの方法を考えてみました.
以下githubに全コードをのせています.
[githubリンク](https://github.com/be-m1ya/image_registration)

![空と雲](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/01c975b4-6eb5-8ad8-2152-ccae7e71d23d.png)

ちなみに特徴点を用いたレジストレーションをした結果はこんな感じです.
![特徴点によるレジストレーション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/43d0f59f-8780-b214-617d-0c953d566590.jpeg)

変換後(!?)
![aligned.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/ae553288-690c-c9f8-ce0a-f1a6862ecccf.jpeg)


#目的
多少違う画像でも,最も似ている点をテンプレートマッチングで見つけて画像レジストレーションできないか？
![テンプレ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/5c3cd469-b698-6d36-d7b6-c441a5795577.png)

#手法 
・2つの画像でテンプレートマッチングしそうな範囲を適当に選択(赤と青のボックス).
・赤ボックスのテンプレートと最も似ている領域青ボックスの領域から探し,2つの画像の対応する点を数点見つける. 
・対応する点を使い,射影変換(もしくはアフィン変換)による画像レジストレーションを行う.

#結果
対応する点は以下のようになりました.
![対応点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/0c38ecc3-3e76-a9d1-ad04-dfc682c057af.png)

実際に片方を青,片方を赤にして重ねてみました(これでもイマイチわかりにくい...).
かなり傾いていてもともとズレが結構あったことがわかります.
![check_gap_p_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/31ec0740-10bf-5344-3df7-aa70bfb349ff.jpeg)

#おわり
特徴点によるレジストレーションでは全く上手く行かなかったのですが,この手法でかなり改善されました.
なにか使えないかな.
【Rails】Strong Parametersの書き方について


#概要

Strong Parametersについて、セキュリティに強い値の取り方というくらいの認識で
あまり意識せずに書いていたため、改めて必要性と書き方について纏めてみました。

#Strong Parametersについて

Web上から入力された値をセキュリティ面で安全に受け取るための仕組みであり、値の正当性をチェックしてくれます。
そうして指定した値以外を受け取らないようにすることで、攻撃を防ぐというセキュリティ対策です。
1つのモデルに対して属性をまとめて取得するというRailsに元々搭載されているマスアサイメント機能の脆弱性を防ぐためにできた機能です。

例えば、UserコントローラーでCreateアクションを起こすとき、
渡すカラムが増えた場合、都度paramsを追加していくのは手間がかかります。

```ruby
def create
  User.create(name: params[:user][:name], email: params[:user][:emails], password: params[:user][:password])
end
```

上記のコードはこのように書き換えられ、値を纏めて渡すことができます。

```ruby
def create
  User.create(params[:user])
end
```

これが**マスアサイメント機能**です。

しかし、これはuserに紐付いた値であれば全ての値をcreateメソッドに渡すことになるため、セキュリティ面で問題があります。
例えば、悪意のあるユーザーがChromeの検証ツールからtrueの値を渡してadmin権限を変更したり、外部からシステムを自由に操作できてしまいます。

そこで登場したのが**「Strong Parameters」**です。
rails4以降に登場した機能です。

StrongParametersを使用すれば、渡す値を指定することができるので外部からの悪意のある攻撃を防ぐことができます。



#書き方

```ruby
def create
  User.create(params.require(:user).permit(:name))
end
```

この場合、userキーのnameだけ受け取り許可するということになります。

Email,passwordも受け取る場合は

```ruby
def create
  User.create(params.require(:user).permit(:name, :email, :password))
end
```


<br>

最後に、Strong Parametersはupdate,destroyアクションなどでも利用でき、コードが重複するのでメソッドとして記述するのが一般的です。

```ruby
 private

 def user_params
   params.require(:user).permit(:name, :email, :password)
 end
end
```

尚、そのクラス内でしか呼び出すことができなくするためにprivateメソッドとして記述します。
外部から`user_params`を呼び出したい場面はありませんので。

下記参考の通りですが、privateメソッドはレシーバをつけて呼び出すことができないので
例えばUserクラスで指定したprivateメソッドは、Userクラス以外のレシーバから呼び出すことができません。

参考：Ruby の private メソッドとは
http://secret-garden.hatenablog.com/entry/2015/07/02/000000
DNSのdigコマンド

### digコマンドを使って権威DNSサーバーを直接調べるとき
`+norec`と`-x`オプションを付ける
`+norec`は非再帰検索を実行
`-x`は逆引き検索でIPアドレスを直接指定できる

```shell
$ dig +norec @localhost -x 192.0.2.100
```
### digコマンドの使い方
* 解決したDNSサーバを確認したい場合は+identifyオプションを追加
* デフォルトはAレコード検索。 NSレコード指定じは nsをつける
* トレースは+traceオプション
Dockerを使ってRuby2.7&Rails6を構築

# はじめに
2020/01/20時点での最新安定版のrails開発環境の構築の記事がなかったので。

[【Imagemagick対応】Dockerを利用して、Rails環境を作成](https://qiita.com/NA_simple/items/5e7f95ae58eec5d20e1f)

基本上記の記事のままです。
ただ、上記の記事はRuby2.6&Rails5.2.2で、そのままバージョンを書き換えるだけではうまく動作しなかったので、動作できるようにしたインストール資材を記載しておきます。
参考までに上記記事からの変更点も記載しておきます。

コンテナ立ち上げ以降は参考記事の手順のまま実施できます。

# インストール資材
## Dockerfile
```:Dockerfile
FROM ruby:2.7

ENV RUNTIME_PACKAGES="linux-headers libxml2-dev libxslt-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql" \
    DEV_PACKAGES="build-base curl-dev" \
    HOME="/myapp"

WORKDIR $HOME

# Counter Measure to Error:"Autoprefixer doesn’t support Node v4.8.2. Update it"
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs

# yarnパッケージ管理ツールインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn

RUN apt-get update && \
    apt-get install -y default-mysql-client \
    postgresql-client \
    sqlite3 \
    --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

ADD Gemfile      $HOME/Gemfile
ADD Gemfile.lock $HOME/Gemfile.lock

RUN bundle install

ADD ./ $HOME
COPY ./ $HOME

CMD ["rails", "server", "-b", "0.0.0.0"]
```

### 変更点①：ruby2.6⇒2.7


### 変更点②：mysql-client⇒default-mysql-client
`mysql-client` はインストールできなくなっていたので、代わりに`default-mysql-client`をインストールします。
`mysql-client`がインストールできない理由は以下の記事が参考になります。

[Circle CI で mysql-client が apt-get install できなくなってCI環境が壊れた話](https://yourmystar-engineer.hatenablog.jp/entry/2019/07/15/140644)

### 変更点③：yarnを追加でインストール
エラーメッセージは控えていませんでしたが、参考記事のままインストールしようとしたら`yarn`がないと怒られました。そのため、`# yarnパッケージ管理ツールインストール`　のところでインストールしています。

## docker-compose.yml

```yml:docker-compose.yml
version: '3'
services:
  db:
    container_name: db
    image: postgres:latest
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
  web:
    container_name: app
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

```

### 変更点①：passwordありユーザーの設定
セキュリティ的にpasswordありユーザーがほしかったので、`environment`のところでrootユーザにpasswordを付与しています。

## Gemfile

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

gem 'rails', '~> 6.0.2', '>= 6.0.2.1'
```

Imagemagickは使用しないのでGemfileから削除しています。

## Gemfile.lock

```Gemfile.lock
```
こちらは空のまま。
S3を使わずにEC2のストレージを利用して、ファイルを保存する

某expertスクールを卒業後、同じようなやり方で簡易的にpythonでapiをアップロードしようとしたら、権限周りで失敗したので備忘録として

# EC2の種類
簡易的にpythonのapiを作成するため、S3を使わずストレージ中にapiで出てきたファイルを保存します。

- tタイプ
- ubuntu 18.04

# EC2ログイン後
スクールのカリキュラムでは、/var/www/を作成して、その中にアプリを入れていましたが、それでは権限周りでエラーが出てしまうので、ログイン後のhome/ubuntu/直下にgit cloneしましょう。

```terminal
$ ssh -i /path/my-key-pair.pem ubuntu@x.xxx.xxx.xxx(IPv4アドレス)
# ユーザー名部分はubuntuなので注意(ec2-userではない)

(ログイン後)
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

$ sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev zlib1g-dev
$ pyenv install 3.6.2(ここでpythonのバージョンを選ぶ)
$ pyenv global 3.6.2
$ pyenv rehash

$ apt-get -y update
$ apt-get install -y --fix-missing
$ apt-get install build-essential
$ apt-get install software-properties-common
$ git clone クローン元のURL
```

# apiをバックグラウンドで起動
通常通りにpython run.appすると、PCを閉じたり、EC2をログアウトした際にアプリもとまってしまうため、下記コマンドでバックグラウンドで起動します。

```terminal
$ nohup python main.py &
```
基本情報14週目(１月２０日)

##目標と結果##
•１月２６日の基本情報技術者の午前免除試験に合格します。
•しっかりと時間を確保し平成30年の問題中心的にやります。
•大学の試験も始まったので両立させます。
##結果##
不合格でした。

##振り返り##
テクノロジー系のテストでは点数が取れたものの、最後のマネジメント系の問題で間違いが多かった。今後の勉強のやり方の方針を変えていきたいと考えております。
__Keep__
１日1時間以上最低でもしっかりと勉強すること。
__Try__
もう一度見直す。しっかりと復習した上で試験に挑みます。
__Problem__
過去問題をやりこなせていなかったです。
##次週 and more...##
[1/13基本情報](https://qiita.com/Comitakato0515/private/75dbc2dcb40d032df6d0)
[全体計画]
(https://qiita.com/Comitakato0515/private/4ae8c631dcd3a42aa826)
ラズパイに良さそうなSDカード調べ＠202001

ラズパイで使うSDカードの良さそうメモ
有名所？のみで


### 確認したいな要件

CLASS10の転送速度が良いようです

- CLASS10：読み書き時のデータ転送速度が最低 10MB/秒
- 転送速度：大きいほうが良いですねらしい



### Team microSDHCカード 32GB 高速転送UHS-1 日本国内10年保証 SD変換アダプター付属 正規品 Team 

ラズパイが公式で良い感じってしてるやつらしい

https://www.amazon.co.jp/dp/B07DJ374SH/ref=cm_sw_r_tw_dp_U_x_W7zjEbSDQT426

![000333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/7e84d704-a42b-9568-6e41-3813f2292013.png)



### 32GB TOSHIBA 東芝 microSDHCカード CLASS10 UHS-I対応 R:100MB/s 海外リテール 東芝(TOSHIBA) 

国内正規より安くて読み込み100MBって。。下のやつとは違うのかな？

https://www.amazon.co.jp/dp/B078NQ5BQ5/ref=cm_sw_r_tw_dp_U_x_l8zjEbHKKJKPN

![000222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/9045f0e0-e80d-0388-70cf-f15fa2d2bed1.png)



### 東芝 microSDHCカード 32GB Class10 UHS-I対応 (最大転送速度48MB/s) 国内正規品 Amazon.co.jpモデル T... 

正規品やから高いのかな？

https://www.amazon.co.jp/dp/B07FCBB8BB/ref=cm_sw_r_tw_dp_U_x_vgAjEb444MYVD

![00111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/d68fcd26-1db0-aa87-5755-f49de6b011b4.png)


|メーカ|記載されている読み出し速度|価格(2020.01の時)|スピードクラス記載|
|---|---|---|---|
|Team |80MB/s|￥698|CLASS10(SDカードに対応してるマークはついてる)　UHS-1|
|東芝　海外リテール|100MB/s|￥598|CLASS10　UHS-I|
|東芝　国内正規品|48MB/s|￥1,880|CLASS10　UHS-I|


### 参考サイト

SDカードの違い
https://jp.toshiba-memory.com/howto/sd/sd_memory_cards.htm

ラズパイのSDカード相性
https://elinux.org/RPi_SD_cards
Zephyr > GPIO > STM32L476 > User Button (PC13)の押下検知 > プロジェクトとdtsでのボタン定義 (user_button)

```txt:動作環境　
Ubuntu 18.04 LTS
Board: STM32L476 Nucleo_64 (hereafter STM32L476)
Zephyr 2.1.99
```

### 概要

- ボタンの押下処理を試した
    - `samples/basic/button/`
- User Button (PC13)が使われる

### ボード

- [ST Nucleo L476RG](https://docs.zephyrproject.org/1.12.0/boards/arm/nucleo_l476rg/doc/nucleol476rg.html)

> USER_PB : PC13

という定義がある。

### サンプルプロジェクトの実行

```
$ west build -p auto -b nucleo_l476rg samples/basic/button/
$ west flash
$ west flash
```
(Note: west flashは一回だと失敗することがあるので二回実施）。


別のターミナルにて下記を実行する。

```
$ sudo screen /dev/ttyACM0 115200
```

User Button (青色のボンタ）押下のたびに下記の出力一行が追加される。

```
Button pressed at 1149016013
Button pressed at 1226942740
Button pressed at 1261369171
```

### ボタンの定義

`./boards/arm/nucleo_l476rg/nucleo_l476rg.dts`にてボタンの定義がされている。

```
	gpio_keys {
		compatible = "gpio-keys";
		user_button: button {
			label = "User";
			gpios = <&gpioc 13 GPIO_INT_ACTIVE_LOW>;
		};
	};
```

west buildの後には`./build/zephyr/include/generated/generated_dts_board.conf`が生成される。そこに定義が見つかる。

```
DT_GPIO_KEYS_BUTTON_GPIOS_CONTROLLER="GPIOC"
DT_ALIAS_SW0_GPIOS_CONTROLLER="GPIOC"
DT_GPIO_KEYS_SW0_GPIOS_CONTROLLER="GPIOC"
DT_GPIO_KEYS_BUTTON_GPIOS_PIN=13
DT_ALIAS_SW0_GPIOS_PIN=13
DT_GPIO_KEYS_SW0_GPIOS_PIN=13
...
```

これらの定義はsrc/main.cで使われている。