OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 18.04 を入れたRaspberryPi 3 Model B+でGPIOを有効化する

#GPIO使えないRaspberryPiって存在価値あるの？
ないです(無慈悲）というわけで、有効化していきたいと思います。
やることは簡単で、wiringPiをインストールするだけ。
<font color="White">正直ここから先は自分で調べてもいいような気はしている。ただ調べられる人はこんな記事見ないで自分で調べるよね</font>
[前の記事](https://qiita.com/frafrakki/private/a80cd39fbf1db09e0d21)

## 下準備
今回の方法でUbuntu18.04をただインストールしただけだと致命的にできないことがあります。`make`です。
wiringPiだけでなく、今後いろいろなところで必要になるので、インストールしていきます。

```shell:
sudo apt install build-essential
```
これで`gcc`と`make`が使えるようになります。~~essentialっていうくらいなんだから最初からインストールしておいてくれ~~
さらに、[前回の記事](https://qiita.com/frafrakki/private/a80cd39fbf1db09e0d21)でVSCode入れた人にはあまり関係ないかもしれませんが、`git`の導入が必要なので、今一度やっておきます。もうすでに入っていたら、そういわれるだけなので。

```shell:
sudo apt-get install libi2c-dev
sudo apt-get install git-core
```
これにて下準備はおわりです。
##wiringPiのインストール
`pip`でもインストールできるやつがあるらしいけど、今回インストールするwiringPiはパッケージではなくライブラリなので、いつものインストール手順とは若干違います。
`git`からcloneしたものをbuildするという形をとっているものです。本稿ではホームディレクトリにcloneしていますが、別にここじゃなくてもいいはずです。お好きなように。

```shell:
cd ~
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
```
以上のコマンドにより、インストールが実行されます。

```shell:
gpio -v
```
を実行して、バージョン情報が正しく表示されればインストール完了です。
先ほど記述した通り、今回インストールしたwiringPiはライブラリ、特にC言語のライブラリなので、このままでもCによるコーディングは可能なはずです。
##番外編
これまでの操作でGPIOは有効化されました。が、ついでにGPIOを利用可能にするpythonモジュール`RPi.GPIO`を導入しましょう。pythonはかなりとっつきやすい言語なんでね。
これは`pip`や`apt-get`で問題なくインストールできます。自分はpython3を使いたいので以下のコマンドで実行しました。

```shell:
sudo pip3 install rpi.gpio
```
これでコーディングできるよやったね。

---
以上の手順でUbuntu18.04でもGPIOが使えるようになると思います。思いますというのはまだ試してないからです（爆）
近日中に試して追記します。ごめんなさい。

2019/07/26
追記しました [Ubuntu18.04をインストールしたRaspberryPi 3 Model B+でGPIOを使う](https://qiita.com/frafrakki/private/709d95e05d802d3d19b5)

2019/08/13
どうやらwiringPiのcloneでgit側の問題でエラーが起きるらしいです。
そこで、ミラーリングされていたリポジトリを発見しましたので一応追記しておきます。

```
git clone https://github.com/WiringPi/WiringPi
cd WiringPi
./build
```
これで導入できるはずです。
こっちは本気で試していないので、頑張ってください。
復旧するのを待ってみてもいいとは思います。
一応WiringPiの公式ページを下部リンクに追加します。

##参考になるサイトがあるこの世の中って最高だよね
[【Ubuntu 18.04 LTS Server】gcc, make などの開発ツールをインストールして使う](https://www.yokoweb.net/2018/05/04/ubuntu-18_04-gcc-makme-install/)
[WiringPiとWiringPi-PHPのインストール～ SOCKET SERVER 'HAL'](http://www.feijoa.jp/work/hal/wiringPi/)
[Raspberry PiでPythonのRPi.GPIOを使ってLチカする](https://qiita.com/masato/items/715e28e0c0c945a54297)
[WiringPi Official](http://wiringpi.com/)
Firebase Hostingにムームードメインのドメインを設定する

# はじめに

ムームードメインで取得したドメインをFirebase Hostingで公開した自分のサイトにドメイン設定する方法です。

# Firebaseの管理コンソールでTXTレコード設定を取得

TXTレコードはDNSに設定するコメントのようなものですが、これを設定できるということはドメインの保有者ということということになります。

1. Firebaseの管理コンソールにログインし、Hostingを選択します
2. サイトの管理のページから"ドメインを接続"ボタンを押下します
3. ムームードメインで取得したドメインをドメインテキストボックスにセットします<br><img width="724" alt="fh02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/22272612-404e-096f-2ba1-f42d82902325.png">
4. 値をコピーします<br>![fh03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/db72e1ce-2412-af0e-2707-8105eba996ab.png)

# ムームードメインにTXTレコードを設定

1. ムームードメインのコントロールパネルを開きます
2. ドメイン管理-ドメイン操作から、ムームーDNSを選択します<br><img width="180" alt="fh04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/15fa8f95-5203-5f7b-589f-4dd0bf98db64.png">
3. サブドメインを空に種別をTXTに、内容にFirebseの管理コンソールでコピーした値をセットします<br>![fh05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/a59d437f-89c9-085c-e4b7-f88029e4f9b1.png)
4. 設定を保存します

DNSの設定なので浸透するのに少し時間がかかりますが、経験上10分もかからないと思います。

# Firebaseの管理コンソールで2つのAレコード設定を取得

1. Firebaseの管理コンソールに戻って確認ボタンを押します<br>![fh03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/db72e1ce-2412-af0e-2707-8105eba996ab.png)
2. すると2つのIPアドレスが表示されるので2つともコピーします

このIPアドレスは1つでも通信は可能ですが1つだけ設定しただけだとFirebaseから警告メッセージが出ます。2つとも設定しましょう。

# ムームードメインにAレコードを設定

1. ムームードメインのコントロールパネルに戻り、ドメイン管理-ドメイン操作から、ムームーDNSを選択します<br><img width="180" alt="fh04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/15fa8f95-5203-5f7b-589f-4dd0bf98db64.png">
2. IPアドレスを2つ登録します(8行目と9行目)<br>![fh06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64294/0902545e-be06-aba2-b115-a94ebc2aafd5.png)

# Firebase Authenticationの匿名認証も設定

Firestoreなどの機能を使うにあたって、セキュリティを強化するために匿名認証とセキュリティルールを設定することがあると思います。
そういう場合には、認証可能なドメインを登録しないと認証されないため、Authenticationのログイン方法で、匿名認証が有効になっていることを確認し、認証済みドメインに今回使えるようにしたドメインを追加しましょう。
Amazon Linuxで(普通の)ユーザーを追加する

TL;DR
=====

```sh
# local

# Generate an SSH key pair.
ssh-keygen -t rsa -b 4096 -C "your_name@your.domain" -f /path/to/new_key_pair.pem

# remote

# Add a new user.
sudo adduser new_user
sudo su - new_user  # Log in as the new user.

# remote (new_user)

mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
cat >> .ssh/authorized_keys
# Here, paste "/path/to/your_key_pair.pem.pub", Enter (for a new line), Ctrl+D (to exit cat)
exit

# local

ssh -i /path/to/new_key_pair.pem new_user@public_dns_name_of_EC2_Linux_instance
```


.pem.pubがないとき？
===================

```sh
# 秘密鍵から公開鍵を表示する。
ssh-keygen -y -f /path/to/new_key_pair.pem
```


アカウント期限を設定
====================

```sh
# アカウント作成時に期限を設定する。
sudo adduser -e 2020-09-30 new_user

# 後からアカウント期限を変更する。
sudo chage -E 2020-12-31 new_user

# 確認する。
sudo chage -l new_user
```


参考
====

- [SSH アクセスを行える新しいユーザーアカウントを Amazon EC2 Linux インスタンスに追加するには?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/new-user-accounts-linux-instance/)
- [お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
【ServiceNow】UI Actionのボタンの色を変える

# UI Action
UI Actionとは、**NowPlatform上でのボタンやリンク**のことです。
これをトリガーとして、WorkflowやTaskの状態遷移に映るので、実装上必須です。
今回は、UI Actionを着色します。

# 完成イメージ
![UI Action before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/bbe65215-13c7-7fc7-1775-dd1b0853ff7d.png)
これを
![UI Action After.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/e59154ab-7afa-4a04-ecde-c892230318c2.png)
こうします！

# 実装
### 1.client scriptの作成
**system definition > client script** に移動する。
client script テーブルの**New**をクリックする。
![app_store_learnv2_automatingapps_madrid_workflow_images_wf_checkout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/01a0b9fa-da87-551f-9759-8580e0b1dae1.png)
name:change button color
table:incident
type:onLoad
script:

```javascript:changeButtonColor.js
function onLoad() {
     //resolve incidentボタンの色を変える
     changeButtonColor('resolve_incident', '#f0f8ff');
     //aaaaaaaaaボタンの色を変える
     changeButtonColor('aaa', '#ffffe0');
}
//第一引数:buttonID=>UI ActionでのAction nameの値,を指定
//第二引数:カラーコードを指定
//カラーコード:https://www.colordic.org/
function changeButtonColor(buttonID, backgroundColor) {
     try{
           //buttonIDからbuttonを特定して 背景色を変更
           $$('button[id=' + buttonID + ']').each(function(elmt) {
                 elmt.style.backgroundColor = backgroundColor;
                 elmt.style.color = '#ffffff'; //ボタンのテキスト色を変更
           });
     }catch(e){}
}
```
これで、クライアントスクリプトは実装OK

changeButtonColor()の第一引数である、UI ActionのAction nameは下記です！
![Action name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/a711ad78-92d7-ba25-8bed-f150bd0eaba8.png)



### 2)client scriptのグローバル適用設定
クライアントスクリプトを書くだけでは実行されず、下記のinfo messageが表示されるため、もう一つ手順を踏む。
>New client-scripts are run in strict mode, with direct DOM access disabled. Access to jQuery, prototype and the window object are likewise disabled. To disable this on a per-script basis, configure this form and add the "Isolate script" field. To disable this feature for all new globally-scoped client-side scripts set the system property "glide.script.block.client.globals" to false.

クライアントスクリプトの適用範囲をIsolate->Globalに変更してやる必要がある。
client script のリストレイアウトからIsolate scriptをtrue/falseで設定できるため、falseにする。
![isolate script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/044c502c-557d-3752-e3fd-7c469f5583d7.png)

これで完成！下記のように！着色の仕方は応用が利くので様々な場面にてご利用ください。
![UI Action After.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/e59154ab-7afa-4a04-ecde-c892230318c2.png)

# 参考文献
#### 1)Community
- ["glide.script.block.client.globals" error](https://community.servicenow.com/community?id=community_question&sys_id=5e6a9d9bdb26a740656a5583ca9619b5)
- [Change UI action button color](https://community.servicenow.com/community?id=community_question&sys_id=ecdd4f6ddb9cdbc01dcaf3231f9619d6)

#### 2)カラーコード:

- [原色大辞典](https://www.colordic.org/)
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 

**org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hoge':**
というエラーに物凄く苦しめられて、物凄く時間を奪われました。

二度と悪夢を見たくないので備忘録として書いておきます。

【気をつけたいこと】
➡︎このエラーが出てきたとき、
これはbean記述ファイルに問題がある場合もあるが、
それよりも、
build.gradleや、Amazon S3にアクセスできていないこと等が原因であることがある。

Error creating bean with name 'hoge'が大量発生したとしても、build.gradleの特定の一行だけを消したり、
S3コンソールから設定をするだけで一瞬で解決してしまうことがあり得る。

エラーメッセージを間に受け、山崎屋の技術メモなどを参考にして、beanのところを生真面目に血眼になって見ていて数日無駄にしてしまいました。。。

（参考：山崎屋の技術メモ）
https://www.shookuro.com/entry/2016/08/10/092234

## 数年後に追記

（当時はSpring BootのDI（依存性の注入）についてまるで理解していなかったため、わけもわからずこの様な投稿をしていたのですが、）
要は、Spring Bootの起動時に、DIコンテナ（アプリケーションコンテキストとも呼ばれることがある）にインスタンスを登録する処理がフレームワークの仕組みとして走るわけですが、この時に「Error creating bean with name 'hoge'」の'hoge'が取得できなかった、という意味のエラーです。

なぜ'hoge'を取得できなかったのか？を辿る必要があります。
UnsatisfiedDependencyExceptionの原因は非常に広く、実装不備である場合もありますが、環境不備であることも多々あります。すぐ特定できる場合もあれば、そうでない場合もあります。
原因さえわかれば解消には時間がかからない場合が多いです。

【考えられる（ありがちな）原因例】
・pom.xml,build.gradleのdependencyの記述漏れ（必要なモジュールがない）
・pom.xml,build.gradleのモジュール（dependency）間のバージョンの不整合
　（一例としては、springのバージョンとmybatisのバージョンが噛み合わずにエラーになる、という場合があったりします）
・必要なアノテーションをつけていない
　（@Autowiredをつけているが、対応する@Component、@Service等が存在しない場合など）
・application.propertiesの記述誤り、記述漏れ
・データベースのレコードが取得できない
　（@ConfugurationでDBから取得する処理があるが、取得結果が0件だった場合など）
・Amazon S3にアクセスするシステムだが、接続できない

一般的には、開発初期段階では実装不備のことが多いでしょうし、開発後半では環境不備の方が多いでしょう。
【Ma_gician #03】代替画像はデザイナーさんにお任せ

## エラー時の代替画像

* `<img>` に指定した `src` の画像がエラーになった場合、代替画像に差し替える実装がよくあります。

```
    <img src="xxxx.jpg">
```

---

## ブラウザ標準のエラー表示

* `<img src="xxxx.jpg">` で `xxxx.jpg` という画像が存在しない場合、下のようにブラウザ標準のエラー表示になります。

    <img src="xxxx.jpg">

---

## デザインの統一性

* ブラウザ標準のエラー表示は、
サイトデザインの統一性を崩してしまう。

* デザインの統一性を保持するため
「No Image」を意味する画像に差し替える。

---

## Pure JavaScript による対応

* 以下の`<script>`で、画像ロードに失敗した時に「No Image」画像を差し替えてくれます。

```HTML
<img id="xxx" src="xxxx.jpg">
<script>
  document
    .getElementById('xxx')
    .addEventListener('error',
      event => event.target.src = 'no-image.gif'
    )
</script>
```

---

## 画像ロードエラー時の処理

* エラー時の代替画像を差し替える処理は全部同じ。

* `<img>`の数だけ同じコードを書く。

---

## 必要なのは・・・？

---

## 代替画像 URL だけ !!

---

## Ma_gician の実装

* `<img>` に直接代替画像 URL を指定します。

```HTML
<div><img src="xxx.jpg"></div>

<div><img src="xxx.jpg"
          x-fallback="no-image.gif" _></div>
```

* Lightning Talk では、ここでライブコーディングします。

---

## 一括指定

* 全画像に共通の「No Image」を指定したい場合は、`bo_otstrap.js`ファイル内で指定したファイルがディフォルトで代替画像として使われます。

```HTML
<script src="assets/js/bo_otstrap"></script>
```

---

## いいこといろいろ

1. Ma_gician を使えば、代替画像の差し替え処理は「代替画像 URL」を指定するだけになる。

2. デザイナーさんが HTML を作成する場合、代替画像を指定した状態で納品できる。

3. 代替画像差し替えに関して、学習コストが理論上の最小になる。

---

## Ma_gician を作った人
* 名前: Stew Eucen （悉生 游漩）  
読み方： しちゅう ゆうせん
* 国籍: 日本

## SNS
* Twitter: [@StewEucen](https://twitter.com/StewEucen) 
* Facebook: [Stew Eucen](https://www.facebook.com/stew.eucen)

---

## 募集
* オープンソース活動を支援していただけるスポンサーを募集してます。

---

## ご静聴ありがとうございました!!
golangで[]byte(uint8)をfloat64にconvertする方法


# TL;DR

コメントいただいた方法でアップデートしました！
~~とりあえずこうしてみたけど、もっといいやり方ありそうなので、有識者な方教えてください。~~

```
f := *(*float64)(unsafe.Pointer(&out[0]))
```

# モチベーションと背景

Prometheusを使ったサーバリソースモニタの環境整備を進めており、既存exporterでカバーできないMetricsが欲しくなったのでexporterを自作してみることにしました。
golang自体がまったく初めてで、先週末に初めてhello worldしてみたところです。

exporterを作成するにあたりいくつかの言語でフォーマットやライブラリがありましたが、どうせならgolangでやってみようと思い入門し、公式のチュートリアルを一通りやってから、参考にした記事を見つつexporterを作成してみました。
成果物は [コチラ](https://github.com/mollinaca/exporter/blob/master/example.go)

# Metrics取得にbashコマンドを利用

golangでの低レイヤの情報取得は別の機会に学習しようと思い、LinuxサーバのMetrics取得についてはbashのコマンドを使いました。
参考記事： 
[Golangで外部コマンドを実行する方法まとめ](https://qiita.com/tanksuzuki/items/9205ff70c57c4c03b5e5)
[Goで外部コマンドをパイプして実行する](https://qiita.com/yuroyoro/items/9358cd25b5f7fe9dd37f)
[golang で UNIX コマンドパイプラインを扱う(Big Sky)](https://mattn.kaoriya.net/software/lang/go/20151030131242.htm)

最終的には、mattnさんが公開されている [go-pipeline](https://github.com/mattn/go-pipeline) を使って、UNIXコマンドのパイプ処理を書きました。

# go-pipeline の戻り値が []byte 

bashコマンドを実行できたのはよいものの、その戻り値が []byte(uint8) で返ってくることがわかりました。
exporterの出力には、数値をfloat64で渡さないといけないらしく、[]byteからfloat64へのconvertが必要になりました。

# []byte から float64 への convert 方法

とりあえずざざざっとググってみると、
[Convert byte array “[]uint8” to float64 in GoLang(StackOverFlow)](https://stackoverflow.com/questions/22491876/convert-byte-array-uint8-to-float64-in-golang)
[Convert a byte array to float64(StackOverFlow)](https://stackoverflow.com/questions/46019359/convert-a-byte-array-to-float64/46019457#46019457)
というStackOverFlowの記事があり、どうやらなんかライブラリとか関数一発でできなくて、バイナリ列をどうにかこうにかしてる模様、、ええあまりしたくないなぁ。

ライブラリでいうと、 [strconv](https://golang.org/pkg/strconv/) を使うのが近そうというのがわかりました。
試行錯誤した結果、[]byte を一度stringにして、その際にできてしまう末尾の \n をchompして、得られたstringをstrconvでfloat64にParseすることで、対応できました。が、ほんとにこれだけのためにこんないろいろしなきゃいけないの？というのはちょっと懐疑的。。

```example.go
package main

import (
	//  "fmt"
	"flag"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"log"
	"net/http"

	"github.com/mattn/go-pipeline" // go-pipeline : https://github.com/mattn/go-pipeline
	"strconv"
	"strings"
	"unsafe"
)

~~ 中略 ~~

func get443Estab() float64 {
	out, err := pipeline.Output(
		[]string{"netstat", "-n"},
		[]string{"grep", "ESTABLISHED"},
		[]string{"grep", ":443"},
		[]string{"wc", "-l"},
	)
	if err != nil {
		// PIPESTATUSの中に一つでも0以外が含まれると err : exit status ${status} になるので注意
		return float64(0)
	}
	f, err := strconv.ParseFloat(strings.TrimRight(*(*string)(unsafe.Pointer(&out)), "\n"), 64)
	if err != nil {
		return float64(0)
	}
	return float64(f)
}

~~ 略 ~~

```

もっといいやり方あったら、教えてください m(_ _)m

# versionなど

```
 # go version
go version go1.10.4 linux/amd64
```
SVNからSpringプロジェクトをチェックアウトすると、Springアノテーションエラーだらけになる

##SVNからSpringプロジェクトをチェックアウトすると、Springアノテーションエラー祭りになる問題について

備忘録として書いておきます。

###【対処】
①まずは、プラグインとして、
STSをインストールしていることを確認する。

②
ビルドツールとして、
マーケットプレイスからbuildshipプラグインをインストールしている場合
➡︎Gradleプロジェクトのリフレッシュを実行。

ビルドツールとして、
Gradle IDE Packをインストールしている場合
➡︎プロジェクト右クリック＞Gradle(STS)＞依存関係のリフレッシュ

これでアノテーションエラー解消できるはず。

※プロジェクト右クリック＞Gradle(STS)が表示されていない場合
➡︎構成＞「gradleプロジェクトへ変換」を押下する。

###参考記事
この記事の本線とは関係ないですが、勉強になりました。。
[Gradle IDE pack(STS Gradle plugin)とbuildshipの比較](https://qiita.com/n_slender/items/0ea4bc2ed8722229fc0c)
エラー： メイン・クラスが見つからなかったかロードできませんでした

Eclipseで、
**「エラー： メイン・クラスが見つからなかったかロードできませんでした」**
というエラーが出ました。

➡︎おそらく.classファイルがおかしいように思われる。
➡︎.classは自動生成されるファイルなので、開発者はあまりいじりたくない。

【対処】
①いったんEclipseのパッケージエクスプローラから削除する（ディスクからは消さない）。

②次に、
パッケージエクスプローラ右クリック
＞インポート
＞一般
＞既存プロジェクトをワークスペースへ
＞削除したプロジェクトのフォルダを選択
して復活

これで直るはず。

なお、削除したプロジェクトがSVNの管理下にあったものでも、同様の手順で復活すれば大丈夫だった。

こちらのページにそのまま助けて頂きました。

http://dqn.sakusakutto.jp/2013/12/java_error_mainclass_not_loaded.html
ShellScript 変数の中に格納された文字列の置換 シェルスクリプト 

# 目的
- ShellScriptで変数の中に格納された文字列を置換する方法をまとめる。  
※置き換えたい文字列をすべて置換する方法を記載する。

# 書き方の例
- ShellScriptでの文字列置換の例を下記に記載する。

``` shell
${変数の名前//置換対象の文字列/置換対象と置換したい文字列}
```

# より具体的な例
- 変数`test`に「aaabbbaaabbb」の文字列が格納されている。
- 変数`test`のbをaに置換したい。
- 下記にShellScriptでの文字列置換方法を記載する。

``` shell
${test//b/a}
```

- 上記の処理だけでは置換した値が再び変数`test`に入ることはない
- 下記のようにすることで置換した後の値を再び変数`test`に格納することができる。

``` shell
test=`echo ${test//b/a}`
```

# 2019/07/28追記
- 置換した後の値を再び変数`test`に格納する方法の合理的な方法を教えていただきましたので下記に記載します！
- 下記にShellScriptでの文字列置換方法を記載する。

``` shell
test="${test//b/a}"
```

教えていただいた[angel_p_57](https://qiita.com/angel_p_57)様本当にありがとうございます！    
※誠に勝手ながらお名前とHomeへのリンクを張らせていただきました。ご迷惑でしたらコメントください。
Railsのroutesを確認するコマンドを紹介します

## Railsのroutesを確認するコマンドを紹介します
コマンドは`rails routes`です。
便利ですのでぜひご活用ください。
この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
CADから点群データを作る

##はじめに
PCLで簡単な物体認識を行う際，自前で点群データを作成する必要があります．
点群データの作成には，様々な方法があるのですが，今回は，CADデータでモデリングしたオブジェクトを点群データに変更する手順を紹介．

##動作環境
今回の記事は，windows10側でモデルを作成．ubuntu18.04で点群データに変換しました．
仕様は表にまとめています．

共通

| 項目 | 値 |
|:-:|:-:|
| CPU | core i7-6820HQ |
| RAM | 16GB |
|GPU|NVIDIA Quadro M1000M |

windows側

| 項目 | 値 |
|:-:|:-:|
| OS | Windows 10 pro |
| CAD | Solid Works 2018-2019 |

Ubuntu18.04側

| 項目 | 値 |
|:-:|:-:|
| OS | Ubuntu18.04 |
| 変換ソフト | Meshlab |
| pcl | 1.8 |
| ROS | melodic |

##CADでモデルを作成　(.STL)形式で保存 
windows側での操作
今回はSolid Worksを使用しました．
Solid Worksは幅広い分野で使用されCADソフトの中でも，シェア率が結構高めです．
AUTOCADやFUSION360等を使用しても大丈夫だと思います．

Solid Worksは学生であれば，ほぼ無償で使用することができます．
とりあえず，認識する対象をCADで作成してみました．
今回は，おもちゃの飛行機をリバースエンジニアリングしました．
こんな感じです．
![air_pcl.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467962/0ac2e59e-b011-e50a-5187-09c581f51252.png)
このパーツファイルを(.STL)形式で保存します．
アセンブリしたものを使用する際は，一度，指定保存で（.SLDAEM）をパーツファイル(.SLDPart)に変換．その後変換したパーツファイルを(.STL)形式として，指定保存します．

##点群データ(.pcd)形式に変換
ここからはubuntu側での作業となります．
参考にしたサイトは[こちら](https://demura.net/%E6%9C%AA%E5%88%86%E9%A1%9E/14130.html)
変換には，`pcl_tools`が必要となります
インストールしていない場合は，

```
sudo apt-get install  pcl-tools
```

でインストールできます．

1. まずmeshlabを開き，(.STL)形式のデータをインポートします．
1. 次に，(.obj)ファイルでエクスポート(指定保存)します．
1. 一度，meshlab閉じ，再び起動させ(.obj)形式のデータをロードします．
1. 次に，スケールを合わせます.
 Solid Worksでは一般的に`[mm]`でモデルを作成することが多いです．しかしmeshlabの基本単位が`[m]`なので，スケールサイズを変換する必要があります．

meshlabの`Filters`→`Normarls,Cnrvatures and Orientation`→`Transform:scale`を選択します．![scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467962/d1aa17a1-c5df-3c16-fefe-f0e916df101a.png)
このとき各軸を図のように0.1倍づつしてあげて，`Apply`をクリックし`close`します．
`Aplly`をクリックしないと，モデルに適用されないので注意してください．
ここまでできたら，(.obj)形式で再度上書き保存し，一度meshlabを閉じてください．

5.再びmeshlabを開いて`3`の操作を行ってください．これにより，サイズを`[mm]`
に合わせることができます．※一度で，スケールサイズを0.001倍すると自分の場合うまく行きませんでした．

6.(.obj)から(.pcl)形式に変換．
変換は以下のように行います．

```
pcl_mesh_sampling input.obj  output.pcd -leaf_size 0.001
```
引数とかは，参考サイトに書いてあるので割愛．
これで，(.pcl)形式の自前データを作成することができました．
グラフィカルに確認したい場合は，

```
pcl_viewer output.pcd
```
で見ることができます．
すごく見づらいですけど，こんな感じ
![air_plane.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467962/29c0ab81-e16f-002f-0fea-afc501b70131.png)

生データを見たい場合は，

```
gedit output.pcd
```
で見ることができる．
こんな感じ(一部を抜粋)．

```output.pcd
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z
SIZE 4 4 4
TYPE F F F
COUNT 1 1 1
WIDTH 43185
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 43185
DATA ascii
0.0087611452 -0.050566815 0.0059146006
0.0059727603 -0.049213119 0.0059028571
0.0011607565 -0.04599423 0.0059653334
0.036394902 -0.044901699 0.0059582125
0.037355382 -0.044040166 0.0059934631
-0.0069311424 -0.040136784 0.00594847
-0.0087683918 -0.039120279 0.0058913622
-0.0094063086 -0.038501743 0.0059710327
-0.015966881 -0.030564643 0.0059039053
```
このように，PCLでは`[m]`が基準となって，データが格納されている．

##終わりに
Solid Worksとmeshlabでデータをインポートした際に，スケールサイズか変わっていることに気づかず，苦労しました．．．
自前で作成したデータをもとに，PCLで簡単な物体認識をする内容は，また今度書きたいと思います．
トランザクションをコミットする前に非同期処理を実行しないほうがいいケース

説明用に、主にRailsを使っている場合を例として取りあげます。次のコード

```ruby
Task.transaction do
  task = Task.create(task_params)
  NotificationJob.perform_later(task)
end
```

は、ときどき以下のようなエラーを発生させることがあります。

```
ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find Task with 'id'=1
```

DBからデータをオブジェクトとしてデシリアライズしようとして失敗しています。この原因を説明します。

まず、RDBではデフォルトのトランザクション分離レベルがread committedかそれより厳密であることが多いです[^1]。read committedの場合、あるトランザクションでコミットされたデータは別のトランザクションからも読み取ることができます。

[^1]: [PostgreSQL](https://www.postgresql.jp/document/11/html/transaction-iso.html)ではread committed、[MySQL (InnoDB)](https://dev.mysql.com/doc/refman/8.0/en/set-transaction.html) では、もう一段階厳密な分離レベルであるrepeatable readがデフォルト

また、`Task` のレコードは `Task.transaction` のブロックを抜けるまではコミット済みになりません。このとき、トランザクション内でActive Jobの `perform_later` を実行すると、キューにジョブが入り、ワーカーがキューからジョブを取り出して処理します。

ワーカーがジョブを取り出すタイミングによっては、`Task` のレコードを保存するトランザクションがコミットされる前に非同期処理が実行されることがありえます。これが起きると、非同期処理はデータを保存しようといているトランザクションとは別のトランザクションとなり、また、分離レベルがread committed以上であることから、まだDBから読み取ることができないデータをしばしばオブジェクトとしてデシリアライズしようとし、結果的にデータが見つからずに失敗となります。

次のような処理の構造にすると、この問題を回避できます。

```ruby
# トランザクション内ではレコードの保存だけ実行する
task = Task.transaction do
  Task.create(task_params)
end

# 確実にコミット済みのデータを非同期処理の中で読み取る
NotificationJob.perform_later(task)
```
仙台CTF2018 Mal.2 検体２ エクセル文書 100

#問題

http://ctf.sectanlab.jp/2018/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/11b1e4c5-4443-f2d5-d7c0-e5c917f00313.png)

#解いてみた

ダウンロードするとExcelファイルがあります。

マクロを自動実行しないようにしてExcelを実行します。
そしてマクロを見ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/41b0c7e8-f292-afb1-8dd5-61a7b80a00df.png)

ちょっとホネが折れそうですがSub Workbook_Open()の最後のところ、でshellと書いてあって何か実行しそうです。
その横のlasmessaudを見ると

```
lasmessaud = "cm" + virtualkeybbs(3)　～～～
```

と書いてあります。
virtualkeybbs(3)は分かりませんが、cmd的なことをやりそうだなと。
とりあえずこれもShellのところをコメントにして、echoしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fc25121c-3a3b-45f6-f70d-0f529ba86682.png)

とりあえずはこんな感じでいいんじゃないですかね。
実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7d00e609-7b17-6925-5675-e264ae6c0b13.png)

1つ目はcmdからpowershellを呼び出しているみたいです。
次の行が実際に実行されるコマンドのようです。
これをechoしてみます。

とか言う前に2行目に答え載ってました。
URLとその見方

#URLとは
正式名称はUniform Resource Locator。その名が示す通り、ネットワーク上のリソースの場所を示します。

#URLの見方
```URL:URL
https://bucket.xx.aomurasakico.com:555/prefix/index.html?versionId3'
```
URLは前から分けて

+ 「スキーム名」・・・https://

+ 「FQDN」・・・bucket.xx.aomurasakico.com

+ 「ポート番号」・・・555

+ 「ファイルパス」・・・/prefix/index.html

+ 「クエリパラメーター」・・・?versionId3'

にわけられる。
URLを見るだけでアクセスしようとしているファイルが **「どこにあり」「どういう意味合いのものか」
わかる** ことから広く使われている。
Optional型について備忘録

唐突にSwiftを使うことになり、Optional型と初めて遭遇したのでその走り書きをまとめてみました。
解釈が間違っているところ、不足しているところなどありましたらコメント頂けますと幸いです。


# `Optional<Wrapped>型`とは  
Swift は nil（JavaでいうところのNull)を許容しない。
しかし nil を使いたい場面はある。そんなときに Optional型（データ型の１つ） を使う。 
`Optional<Wrapped>`の`<Wrapped>`はジェネリクス

```swift
// nilを許容しない
var s: String = "hello world"   // "hello world"
s = nil                         // error
//　?を型につける→下記のコードの省略形
var s: String? = "hello world"  // "hello world"    ※
s = nil                         // nil
// ※のString?と全く同じ処理
var s: Optional<String> = "hello world" 
```

## アンラップ（値の取り出し）  
Optional型の変数はそのままでは通常の変数としては扱えない。  

Optional型の値を通常の値に変換する _アンラップ_ という方法が必要となる。  

>そもそもOptional(値)とはどのような状態でしょうか。
>Optionalは値を包み込むラップ(包み紙)のイメージです。オプショナル型は値をOptionalというラップ1枚で包み込んでいます。
すると、たとえ中身がない(=nil)状態でも包み紙だけは存在するため、とりあえず扱うことができます。
>オプショナル型の値がnilでも使えるのは、この包み紙が存在しているためです。
>しかし、この便利な包み紙があるために値はラッピングされ、直接扱うことができません。扱うためにはラップを取り除き、中身の値を取り出さなくてはいけません。
>この包み紙を取り除き、値を取り出すことをアンラップと言います。

## オプショナルバインディング（if-let文による値の取り出し） 
`Optional<Wrapped>型`の値の有無に応じて処理を切り替えて値を取り出す処理

```Swift
let year: Int? = Int("2020")        
if let y = year {                   // yというOptional型に値が存在した場合に処理をする
    print("あと\(y - 2016)年")
} else {
    print("エラー")
}
```

## ?? 演算子
`Optional<Wrapped>型`に値が存在しない場合のデフォルト値を指定する時に使う演算子  

```Swift
let optionalInt: Int? = 1
let int = optionalInt ?? 3
//結果は１

let optionalInt: Int? = nil
let int = optionalInt ?? 3
//結果は３
```

左辺の`Optional<Wrapped>型`に値が存在すれば左辺の値を、  
存在しなければ右辺の値を返す

## 強制アンラップ
！演算子によって`Optional<Wrapped>型`から値を取り出す方法

```Swift
let x: Int? = 1
let y: Int? = 1
x! + y!
//結果は２
```

`Optional<Wrapped>型`に値が存在しなければ実行時エラーとなるリスクがある  
だから使い所としては以下の状況以外では避けるべき

    - 値の存在が明らかな箇所
    - 値が存在しないならばプログラムを終了したい箇所

## オプショナルチェイン
アンラップを伴わずに値のプロパティやメソッドにアクセスする記法  


```Swift
let optionalDouble = Optional(1.0)

// **********オプショナルバインディングを使用時********
let optionalIsInfinite: Bool?
if let double = optionalDouble {
    optionalIsInfinite = double.isInfinite
} else {
    optionalIsInfinite = nil
}
// *****************************************

// ----------オプショナルチェインを使用時-------------
let optionalIsInfinite = optionalDouble?.isInfinite
// ----------------------------------------------

print(String(describing: optionalIsInfinite))
//結果は同じ；false
```

`Optional<Wrapped>型`の変数や定数がnilだった場合は`?`以降に記述されたプロパティやメソッドへアクセスは行われずに`nil`が返される

## 暗黙的なアンラップ  
変数の宣言時に`!`をつける  
アンラップせずにアクセスできる

```Swift
var number: Int!
number = 10
print(number) //強制的にアンラップ
// 10
```

# まとめ  
`?`と`!`の違いはアンラップを強制的に行うかどうか
どちらも同じOptional型である
特に`!`は使い所をしっかり確認しなければ実行時エラーとなる


## 参考
どこよりも分かりやすいSwiftの"?"と"!"
https://qiita.com/maiki055/items/b24378a3707bd35a31a8#optional%E5%80%A4
SwiftのOptional(オプショナル)が少しややこしいのでまとめてみた
https://qiita.com/ToraDady/items/6079b9f07bebece672eb
WSL 上の Ubuntu で wget した時のエラー

こういうエラーが出てきて困った

```
yuki12:~$ wget https://google.co.jp/
Will not apply HSTS. The HSTS database must be a regular and non-world-writable file.
ERROR: could not open HSTS store at '/home/yuki12/.wget-hsts'. HSTS will be disabled.
```

`~/.wget-hsts` というファイルのパーミッションが 666 になっていたのが原因だった。
`chmod 660 ~/.wget-hsts` で解決した。
ヘルパーメソッド

本日の学習でヘルパーメソッドなる単語が出てきたので何だろうと調べてみました。

Railsでよく見かけるメソッドたちでした。
ヘルパーメソッドとは
```helper(ヘルパー)はその名前の通り、
ある動作を処理する場合にメソッド化して扱えるようにRailsにあらかじめ組み込まれた機能です。```
簡単にいうと「ビューのコードを簡単にかけるようにしてくれるもの」です。
progateや書籍でよく見かけるヘルパーメソッドを少しまとめてみました。

***
link_toメソッド
リンク先を指定してくれるメソッド
link_to("名称","url")

***

form_tagメソッド
基本的な入力フォームで値を送信するときに使うメソッド
form_tag,{ method:'path'}
methodを指定しない場合は自動でpostになる。

***

submitメソッド
サブミットボタンを生成
submit([ボタンの名前 , オプション])

***

text_field_tag
name,value属性が必要

***

text_area_tag
テキストエリア(行数のあるもの)
text_field_tagと同じ使い方

もっとありますが
今回は自分が今まで学習中に使ってきたメソッドだけでもまとめてみました。
今後、知識が深まったら更新して行きます。

参考
https://www.sejuku.net/blog/28563
【お名前.com】EC2の紐付け

# 概要
お名前.comで取得したドメインをAmazon EC2で運用する場合の方法です。
手順としては、EC2のHost ZoneでIPを固定してNSを設定、その値をお名前に設定という流れになります。
一度やってしまえばなんてことないのですが、初めてだと色々とわからないことがあるかもしれません。
# EC2の設定

## Hosted Zoneの作成
### Elastic IP
EC2は、デフォルトはPublic IPのため、時間とともに変わる可能性があります。
そのため、Elastic IPを設定する必要があります。

### Elastic IPの設定
Elastic IPをクリックし、「割り当て」をクリックします。
「Elastic IP」を割り当てたら、「プライベート IP アドレス」を割り当てます。
Route 53の設定で使うので、「Elastic IP」をメモします。

## Route 53
### ネームサーバーを設定
マネージメントコンソールから「Route 53」をクリックします。
続いて「DNS management」をクリックします。
左メニューの「Hosted zones」から「Create Hosted zones」をクリックします。
画面が切り替わったら上の「Create Hosted zones」をクリックします。

- Domain Name: 取得したドメイン名
- Comment: 空
- Type: Public Hosted Zone

NSレコードとSOAレコードが生成されるます。
お名前の設定で使うので、NSの4つをメモします。

### Record Setの設定
Route 53の画面からCreate Record Setをクリックします。
メモしたElastic IPをペーストし「Save Record Set」をクリックします。

- Name: 空
- Type: A - IPv4 address
- TTL (Seconds):300
- value:Elastic IP

# お名前.comの設定
お名前にログインし、「ドメイン設定」→「ネームサーバーの設定」→「ネームサーバーの変更」をクリックします。
「他のネームサーバーを利用」→「ネームサーバー情報を入力」をクリックします。
メモしたネームサーバーの情報を入力します。
※終わりが「.」の場合は「.」は削除します。

# 最終確認
digコマンドでチェックします。
digはDNS（ネームサーバ）の情報を出すコマンドです。
ここにEC2のアドレスが出ていれば72時間以内に反映されます。

```
$ dig hogehoge.com
```

# 参考情報

## 用語説明
|用語  |説明  |
|---|---|
|Elastic IP  |アカウントに割り当てることができるパブリック IP アドレス  |
|プライベート IP  |プライベート IP アドレスは、インターネットから到達できない IP アドレス  |
【Heroku】独自ドメイン設定

## はじめに

Herokuでアプリを公開する際には、appname.heroku.comというHeroku URLで接続ができます。これをお名前.com等のレジストラで取得した好きなドメイン名で公開する方法について書きます。

私のブログをLokkaというブログアプリを使って、Heroku上で動作したときの設定をベースに手順をご紹介します。

## お名前.comの設定

まず、hirotaka.meというドメインを取得します。お名前.comでドメインを取得すると、無料でレンタル[DNSレコード設定]というDNSサーバのサービスを利用できます。ここでは、この[DNSレコード設定]というサービスを使った設定をします。

また、設定するドメインは下記の通りになります。

Heroku URL: blog-hirotaka.heroku.com
設定する独自ドメイン: hirotaka.me, www.hirotaka.me, blog.hirotaka.me

Rootドメイン(hirotaka.me)はTypeをAとして登録し、サブドメイン(www.hirotaka.me, blog.hirotaka.me)はHeroku URLのCNAMEとして登録します。

まず、ドメインNaviにログインをして、[ドメイン設定]から[ネームサーバの設定]-&gt;[レンタルDNSレコード設定]の画面を開きます。設定するドメイン名のラジオボタンを選択し、[入力画面へ進む]を押すとDNSレコード入力画面が表示されます。

下記のとおりレコードを登録します。

ホスト名: (空欄).hirotaka.me
TYPE: A
VALUE: 75.101.163.44
優先: (空欄)
状態: 有効

ホスト名: (空欄).hirotaka.me
TYPE: A
VALUE: 75.101.145.87
優先: (空欄)
状態: 有効

ホスト名: (空欄).hirotaka.me
TYPE: A
VALUE: 174.129.212.2
優先: (空欄)
状態: 有効

ホスト名: blog.hirotaka.me
TYPE: CNAME
VALUE: blog-hirotaka.heroku.com
優先: (空欄)
状態: 有効

ホスト名: www.hirotaka.me
TYPE: CNAME
VALUE: blog-hirotaka.heroku.com
優先: (空欄)
状態: 有効<

これらのIPアドレスは<a href="http://devcenter.heroku.com/articles/custom-domains#dns_setup" target="_blank">Herokuのドキュメント</a>に記載されているIPアドレスになります。

以上のレコードを追加し、[確認画面へ進む]を押して内容を確認します。問題がなければ「設定する」を押して設定を反映します。

設定した内容を手元のPCで確認します。DNSレコード設定のみの場合はすぐに確認できますが、ドメインを取得した直後だと設定の反映に時間がかかるかもしれません。

Rootドメインを確認します。

```
$ host hirotaka.me
hirotaka.me has address 75.101.163.44
hirotaka.me has address 174.129.212.2
hirotaka.me has address 75.101.145.87
```

サブドメインを確認します。

```
$ host blog.hiraka.me
blog.hirotaka.me is an alias for blog-hirotaka.heroku.com.
blog-hirotaka.heroku.com is an alias for proxy.heroku.com.
proxy.heroku.com has address 174.129.20.208
proxy.heroku.com has address 184.73.171.204
proxy.heroku.com has address 50.16.215.20
proxy.heroku.com has address 50.16.215.67
$ host www.hirotaka.me
www.hirotaka.me is an alias for blog-hirotaka.heroku.com.
blog-hirotaka.heroku.com is an alias for proxy.heroku.com.
proxy.heroku.com has address 174.129.20.208
proxy.heroku.com has address 50.16.215.20
proxy.heroku.com has address 50.16.215.104
proxy.heroku.com has address 107.22.233.248
```

## Herokuの設定

次にHeroku側の設定をします。画面から設定する方法もありますが、ここではコマンドラインから設定する方法をご紹介します。

アプリに受け付けるドメインを追加します。

```
$ heroku domains:add hirotaka.me
$ heroku domains:add blog.hirotaka.me
$ heroku domains:add www.hirotaka.me
```

もし、間違って登録してしまった場合はremoveで削除します。

```
$ heroku domains:remove test.hirotaka.me
```

追加したドメインを確認します。

```
$ heroku domains
Domain names for blog-hirotaka.heroku.com:
www.hirotaka.me
blog.hirotaka.me
hirotaka.me
```

以上で設定したドメインで接続できるようになりました。

## おわりに

.meドメインが年間980円で、それ以外は無料です。年間980円で独自ドメインのこんなすてきな環境が手に入るとは素晴らしすぎです。
JavaのプロセスをkillするShell

Spring Bootの内臓サーバでアプリを立ち上げたときにサーバの落とし方がわからなかったので、shellを書きました。
javaでポートを使用しているプロセスをkillします。
パラメータにポート番号を追加すると指定されたポートのプロセス、なにも指定しないとポートを使用している全てのプロセスを削除します。


```shell:コード
#!/bin/bash

# パラメータ:ポート番号
port=$1

# javaのプロセスIDを取得する
lines=($(lsof -i -P | grep "java.*${port}.*LISTEN" | awk '{print $2}'))

# linesで取得できたプロセスIDをkillする
for i in ${lines[@]}
do
  kill ${i}
　ret=$?
  if [ ! $ret -eq 0 ]; then
    exit 1
  fi
done

exit 0
```

参考：
[macでLISTENとして使用しているポートを調べる方法](https://qiita.com/yokozawa/items/dbcb3b31f9308e4dcefc)
Javaで制限つきのFizzBuzz問題を解いてみる

# 何をするか

Qiitaのアカウントを作成したものの、何も書いていなかったので
記事投稿の練習も兼ねて枯れるほど語り尽くされている[FizzBuzz問題](https://ja.wikipedia.org/wiki/Fizz_Buzz#FizzBuzz%E5%95%8F%E9%A1%8C)をJavaで解いてみる。
そのまま普通に解いたのでは、本当に意味のないものになってしまうので、
今回は以下のルールに従って作ってみた。

* [条件分岐なし（三項演算もなし）](#条件分岐なし)
* [除算（/）と余剰演算(%)なし](#除算と余剰算なし)
* [繰り返し文なし](#繰り返し文なし)

# 条件分岐なし

```java
String[] fizz = new String[]{"Fizz", " ", " "}; // index 1～2には半角スペースが入ってます
String[] buzz = new String[]{"Buzz", " ", " ", " ", " "}; // index 1～4には半角スペースが入ってます

for (int i = 1; i <= 100; i++) {
    System.out.println((fizz[i % 3] + buzz[i % 5]).replaceAll("^\\s+$", String.valueOf(i)).trim());
}
```

3, 5, 15で割り切れるときは0、それ以外1って言う処理を書ければ空白文字列が入っているところスッキリさせられるんだけど
思い浮かばなかった・・・

# 除算と余剰算なし

```java
int fizzCounter = 0;
int buzzCounter = 0;

for (int i = 1; i <= 100; i++) {
    fizzCounter++;
    buzzCounter++;
    if (fizzCounter != 3 && buzzCounter != 5) {
        System.out.print(i);
    }
    if (fizzCounter == 3) {
        System.out.print("Fizz");
        fizzCounter = 0;
    }
    if (buzzCounter == 5) {
        System.out.print("Buzz");
        buzzCounter = 0;
    }
    System.out.println();
}
```


15進数にして最後の桁を見たほうが早いでしょって話なんだけど、僕にはそういう難しい話はわかりません


# 繰り返し文なし

```java
public static void main(String[] args) {
    printFizzBuzz(1);
}

static void printFizzBuzz(int num) {
    if (num % 15 == 0) {
        System.out.println("FizzBuzz");
    } else if (num % 3 == 0) {
        System.out.println("Fizz");
    } else if (num % 5 == 0) {
        System.out.println("Buzz");
    } else {
        System.out.println(num);
    }

    if (num < 100) {
        printFizzBuzz(num + 1);
    } else {
        return;
    }
}
```

---

どんなに語り尽くされていて、どんなに効率的でスマートな書き方が出回っていても、
自分が思いつくロジックで実際に書き起こして動かしてみるのってすごい大事だと思うの。
仙台CTF2018 Mal.1 検体１ JavaScript 100

#問題

http://ctf.sectanlab.jp/2018/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4a74445b-c0be-f344-a8b6-ccdc83957b31.png)

#解いてみた

検体をダウンロードして解凍します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/246edf4e-0259-fbe4-0d94-7d0b3380129d.png)

jsファイルです。

何かコマンドを実行するようです。
なので最後のところをコメントにして、かつコンソールに表示するようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6746e7f2-10a7-72ac-461d-8be82483b868.png)

実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/bb44e2f4-785a-3265-a010-87b4bfb314ab.png)

そのまま表示されただけです。
難読化がデコードされているたらうれしかったんですが、そのままです。
jsからpowershellが呼び出されているようなので、そっちでデコードされるんでしょう。
powershellでechoしてみます。

セミコロンで改行してみたところ1つだけ長い行がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cb08b5b6-f6d5-8f29-f919-307b1d0691ee.png)

スペースや大文字小文字を織り交ぜでるだけでURLになってるみたいです。
この文字列をechoして、全部小文字にすれば正解です。
Office365のサインイン履歴をユーザーが自分で確認する方法

AzureADのログイン履歴って何かの形で終えるようにしている組織は多いと思う。[Azure ADのPowerBIコンテンツパック](https://docs.microsoft.com/ja-jp/azure/active-directory/reports-monitoring/howto-power-bi-content-pack)を使ってある程度追えるようにしていたり、Azure AD P2で不正ログイン対策していたりするところも多いんじゃないかな。知らんけど。


そんな折、Twitterで[自分が所属する組織から、Office365の不正ログインに注意してねって連絡がきた（意訳）](https://twitter.com/MURA_omura/status/1154188885200494592?ref_src=twsrc%5Etfw")という内容のツイートを見た。


**自分のアクセスログ、自分で見てるやん。**


え、そんな機能あるの？このツイート主、使い方を知ってるってことやん。どーやったら見れんの？

・・・ということで、ググって出てきたのがこちらのブログの投稿。

[MCT's NoteBook　Office 365 サインイン履歴](http://mnote365.com/2018/12/office-365-signin/)

ということで、この記事を参考に早速試してみた。多謝です。


#ユーザーが自分のログインログを見る方法（組織アカウント）

このアドレスを開く。めっちゃ簡単。
https://mysignins.microsoft.com/

どこから(場所やIP)、OSやアプリ(アプリはある程度）も教えてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/f0190c8a-b070-2462-a906-5cece278438f.png)

自分のログは結構みえる。ログイン失敗があって、身に覚えがないものがあれば何かされてる！？と疑うには十分。ユーザーがとりあえず見る分には十分かも。


ただ、フェデレーションさせてる場合はログインに成功しているものしか出ない（条件付きアクセスではじかれていれば別）。失敗している場合、認証サービス側ではじかれているので失敗ログは認証サービス側にある。その場合は身に覚えのないログインがある時点で、既にやられているので、パスワード変えて、即報告。





#おまけ１　ユーザーが自分のログインログを見る方法（マイクロソフトアカウント）

このアドレスを開く。めっちゃ簡単。
どこから(場所やIP)、OSやアプリ(アプリはある程度）も教えてくれる。
https://account.live.com/Activity

#おまけ２　ユーザーが自分のログインログを見る方法（Googleアカウント）

ついでに、自分のGoogleアカウントを調べてみた。
ちょっと情報量が足りない気もするが、ヤバそうなセキュリティイベントはちゃんと教えてくれる。
https://myaccount.google.com/security-checkup
execute factoryresetでも消えないログがある(Fortigate)

Fortigateは、execute factoryresetコマンドで初期化できるというのが通説です。しかし、どうやらこのコマンドでは、一部のログがクリアされていないようです。試しに、diagnose debug crashlogを実行するとfactoryreset以前のcrashlogが表示されることがありました。

ヤフオクで何台か中古を入手したんですが、diagnose debug crashlogの結果、前の持ち主に関連すると思われるドメイン名やメールアドレスがcrashlogの情報として残されていました。Fortigateを処分するときには、忘れずにcrashlogの初期化もお願いします。

```
fortigate # diagnose debug crashlog clear
fortigate # diagnose debug crashlog 
何も表示されなければおｋ
fortigate #
```
https://kb.fortinet.com/kb/viewContent.do?externalId=FD40302&sliceId=1
LINUX　基本のファイル操作コマンド　コマンドの意味

#ファイルの操作コマンド　
##find  ~ -name  ~
###指定した名前のファイルを指定したディレクトリ以下から検索する
>```
$ find ディレクトリ名　-name　ファイル名
```

##grep
grep　は　globally search a regular expression and print　
（全体から正規表現に一致する行を検索し表示する）の略。
###指定した文字列が含まれる行をファイルから抜き出して表示する
>```
$ grep 文字列パターン　検索対象ファイル
```

## head 
### 指定したファイルの先頭10行を表示する
>```
$ head ファイル名
```

## locate
 locate　は　見つけるの意味。
###指定した名前のファイルの検索
>```
$ locate  ファイル名
```

## tail
 tail は　尾　の意味。
###指定したファイルの末尾10行を表示する。
>```
$ tail ファイル名
```


こちらの投稿を参考にさせていただきました↓
[Linuxコマンドは単語の意味を理解するとグッと身近なものになる](https://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02)

こちらの書籍を参考にさせていただきました↓
[LPICの基礎が学べる本](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7LPIC%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E7%AC%AC2%E7%89%88-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C-ebook/dp/B00IWNEWS8)
仙台CTF2018 For.4 ファイル復元 300

#問題

http://ctf.sectanlab.jp/2018/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/79f0d572-6e66-9452-8733-ad05522c8f5e.png)

#解いてみた

ファイルをダウンロードして解凍するとddファイルがありました。
FTK Imagerで開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/025a566f-5d19-e3d1-7a1b-508ac029cea2.png)

確かにファイルがあることは確認できました。
そしてサイズが0になってることも確認できました。

ファイルを削除してるんならすぐ復元できそうですが、サイズ0で上書きした場合ってどうやって復元するんでしょう？

ちょっとわからなかったので、自分の端末で同じことをやってみました。
一度テキストに文字を書いて、それを保存。
そのあと文字を全部消して保存。
そのあとFTKで読み込んで、検索。
ということをやってみましたが、結果はヒットしませんでした。

イメージの中にFirefoxのデータもあったので、Firefoxで何かIDとpassを入力したんでしょうか。
そうするともしかするとブラウザにIDとpassを記録しているかもしれません。

Roaming以下をすべてこれに入れ替えてFirefoxを実行して確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8a8fa267-152d-0a1d-26d1-400e5534c680.png)

ログインとパスワードのところを見てみましたが、結果的に何も登録されていないようです。
Web履歴を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4fca6d6b-12a0-7221-989a-6a1c11088ae2.png)

ほとんどyahooしか見てないです。
問題になってたマルウェアにアクセスしていることもわかります。

んー。
もしかして$MFTに直接書かれてる？
確か、短い文字ならそのまま書かれたはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4c0d078f-1a4e-a548-9281-2c19bdba1dff.png)

それっぽいところを見つけました。
イマイチ仕様がよくわかってませんが、とりあえず「.」がないところの連続した文字列を入力したら正解でした。
laravelのログをプロジェクトディレクトリ外に出力する

logging.phpを下記のように書き換える。

```config\logging.php
        'daily' => [
            'driver' => 'daily',
            //'path' => storage_path('logs/laravel.log'),
            'path' => '/var/log/laravel.log', // ←のように書き換える
            'level' => 'debug',
            'days' => 14,
        ],
```

念のためキャッシュクリアする

```
$ php artisan config:cache
```

ログが/var/log以下に出るようになる

```
$ ls -lt /var/log/
total 9136
-rw-r--r-- 1 apache apache    1169 Jul 25 22:07 laravel-2019-07-25.log
```
ユーザーが iPhone 機種変更すると、UserDefaults や CoreData の中身はどうなるか？

##機種変更の場合
私は最近 iPhone 7 から iPhone XR に機種変更しました。iCloud バックアップによって旧機種の環境を新機種に丸ごと移行しました。私が自作したアプリには幾つか UserDefaults や CoreData を使用したものがありますが、新機種でそれらを起動したら、ちゃんとデータは残っていました。
##アプリバージョンアップの場合
数年前に objective-c で作成し UserDefaults を利用したアプリは、機種変更後もデータがそのまま残っていました。先日、そのアプリを swift で書き換えてバージョンアップしました。objective-c では「NSMutableArray」で保存していましたが、swift 版では「Array」で読み出すことができました。Bundle ID と "Key" さえ一致していれば、objective-c から swift 版にバージョンアップしても UserDefaults に保存されていたデータは引き継がれました。
以上、ご報告致します。
JavaScript for命令についての質問

var result = 0; 　//resultに0を代入
for (var i = 1; 　//iに1を代入
	 i <= 100;　 //iの値が100より小さい間、ループ処理
	 i++) { 　//処理1回ごとに値を1ずつ増やしていく
	result += i;　 //resultにiを加算
	if (result > 1000) { break; } 　//resultの値が1000を超えたらループ中断
}
console.log('合計値が1000を超えるのは' + i);  //45


プログラミング初心者で、本を読みながら勉強を進めています。
上記のコードでなぜ「45」になるのか理解ができません。
本にも解説は乗っていなかったためこちらに質問しました。
解説よろしくお願いいたします。
Gitのリビジョンは（大体は）世界中でユニーク

## きっかけ
　今日、Gitでドジって初めてcherry-pickを使ってリカバリーすることになったのですが、別ブランチのコミットなのにブランチ名などの指定はせず、リビジョンのみ指定してcherry-pickできることに疑問を持ちました。
　リビジョンって同じリポジトリ内で名前衝突しないのかな？
　というわけで、@shyouheiに聞いてみたところをまとめました。

## Q&A
- Q1. Gitのリビジョンってユニークなの？
 - A1. 大体はユニーク。Gitのリビジョンはハッシュで生成されている。
- Q2. Gitのリビジョンを生成するハッシュアルゴリズムってどんなの？
 - A2. 一つ前のコミットオブジェクトと自身のコミットオブジェクトをシードにしてsha1でハッシュ化してる。
- Q3. 衝突したり飽和したりしないの？
 - A3. 衝突はごくたまにする。飽和は地球が滅びるくらいまであり得なさそう。
- Q4. もしかして、このリポジトリだからってことすら考慮に入れないでハッシュ作ってる？
 - A4. そう。むしろリポジトリの内容まで考慮に入れる方が難しい。
- Q5. とすると、リビジョンってリポジトリ内どころか世界中のGitで大体ユニーク？
 - A5. うん。ごくたまに衝突するけど、大体はユニーク。
- Q6. 同じリポジトリ内で衝突するとアウトだろうけど別のリポジトリ内で衝突してもセーフ？
 - A6. それはセーフ。同じリポジトリ内で衝突した場合どうなるかは知らない。

## まとめ
　Gitのリビジョンは（大体は）世界中でユニーク。
　知らなかったので勢いで記事にしてしまいました。
Talend小技（２）固定フォーマットの売上集計表に集計結果を出力する

#**tFileOutputExcelの活用**
Talend標準コンポーネントのtFileOutputExcelを活用して、あらかじめ用意したフォーマットのExcelファイルに売上集計結果を作成する方法を紹介します。

#**入力ファイル**
入力ファイルには、店舗名、商品名、１０日間の売り上げ数が記録されています。
![input_data.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/ef319ff8-834c-b4b5-c4a3-6966af673d23.jpeg)

#**出力先の売上集計表**
出力する売上集計表にはあらかじめタイトル行が設定され、１行目とＡ列には背景色と中央揃えが設定されています。
![Excel1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/80a5f26d-71ed-667e-ebe9-9741bec95f30.jpeg)

#**ジョブ構成**
ジョブは下図のような構成になります。
１．tFileInputDelimitedコンポーネントで入力ファイルを読み込む。
２．tAggregateRowコンポーネントで商品名(key1)をキーにして集計する。
３．tSortRowで商品名(key1)でソートする。
４．tFileOutputExcelで既存の売上集計表Excelファイルに集計結果を出力する。
![ジョブ構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/5ecf3140-681c-49af-d7b0-43b9d4f6e710.jpeg)

#**tFileInputDelimitedのスキーマ設定**
tFileInputDelimitedのスキーマには入力ファイルと同じ項目を設定します。
![tFileInputDelimited_Schema.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/c18b18d7-1a54-837f-0ef2-b4de607170cd.jpeg)

#**tAggregateRowの設定**
tAggregateRowでは店舗名(key)を削除して、商品名(key1)をキーにして各売り上げ数の合計を出力するように設定します。
![tAggregateRow設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/865d8610-d1e5-e552-33b8-e263bdc5bbdd.jpeg)

#**tSortRowの設定**
tSortRowでは商品名(key1)で昇順ソートに設定します。
![tSortRow設定jpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/f8192865-9e78-322c-ef01-37398bbc98f3.jpeg)

#**tFileOutputExcelの設定**
tFileOutputExcelでは以下の設定をデフォルト設定から変更します。
１．”Excel2007形式ファイル形式（xlsx）で書き込み”をチェックする。
　　注記：xlsファイルに出力する場合はチェックは不要
２．”既存のファイルに追加”をチェックし、”既存のシートに追加”をチェックする。
　　注記：ファイル名とシート名を間違わないように
３．”絶対Yポジション”をチェックし、”先頭セルY”を1に設定し、”既存のセルの書式を維持”をチェックする。
![ExcelOutput設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/e2bc0075-690c-b215-7b39-c82306750bcc.jpeg)

#**ジョブ実行結果**
Talend上での実行結果画面は下図の様になります。
![実行結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/170d529a-71de-d1dd-3a78-70a6b855c863.jpeg)

#**売上集計表への出力結果**
１行目とＡ列の書式は変更されずに集計結果が出力されました。
![Excel結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463924/34d7b3e7-f4b6-b573-0858-83d4b8e5cd3a.jpeg)

#**まとめ**
今回は簡単に１シートに出力しましたが、サブジョブを追加して複数の集計をシート別に分けて出力することもできます。
Javaのsetterとgetterについて．＜オブジェクト指向とのズレ＞

# オブジェクト指向の個人的解釈
クラスが現実世界のモノの概念だと考えて，インスタンス化はそのイメージの実体化だと考えています．
そしてカプセル化は実体物の存在を確定させる手段だと考えています．具体的には以下のようなコードです．

```Java
//人間という概念のクラス
public class Human {
    //人間には年齢，性別，力の３つの属性がある
	private int age = 0;
	private String gender = new String();
	private double power = 0.0;

    //人間の実体化には以上の３属性を必ず設定しなければならない
    //これらの属性がないのは人間ではないのです
	public Human(int age, String gender, double power) {
		this.age = age;
		this.gender = gender;
		this.power = power;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public double getPower() {
		return power;
	}

	public void setPower(double power) {
		this.power = power;
	}
}

```

このクラスをインスタンス化すれば一人の人間が誕生します．
# オブジェクト指向とsetter
setterの存在は誕生した一人間の一部を変更を出来るようにしているのです．
ここで疑問が生まれます．
人間という存在は何かの事象が関係して，属性の値が変化するはずです．なのになぜ一つの属性値を変更できるようにしているのでしょうか．まるで手続き型言語のような書き方に感じます．
例えば，`age`が変わるときは`power`にも影響があるかもしれません．その場合は`upAge()`のようなメソッドを用意するべきでしょう．
また，人間に服を着せた場合を想定して属性に`Clothオブジェクト`の`cloth`を追加したとしましょう．そして，服を着た時に`Clothオブジェクト`をsetterで渡すという流れです．しかし，これはオブジェクト指向では無いと考えられます．服は`Human`にとって付属的なものでしか無いはずです．服自体がオブジェクトの要素ではありません．こういった場合は，クラスの継承を行って`ModernHumanクラス`を作るべきです．
多くの場合，setterはオブジェクト指向にはミスマッチな書き方ではないでしょうか．
少なくとも，スーパークラスには入れない方が良い気がします．
# setterの存在意義
しかし，setterにも存在意義はあります．JavaBeansでは必須の書き方とされています．そのお陰でjspのファイル内のEL式等でrequestの要素を呼び出す際は可読性が高い書き方が可能です．その他，私の知らないAPIでも推奨されている書き方です．

また，C言語からの移行過程で必要とされていたというお話も聞き及んでおります．

#まとめ
Javaを勉強して半年の私の意見です．これが必ず正しいとは思っていませんが，個人的には筋は通っていると感じています．どなたか私を矯正してくださる方がいらっしゃれば幸いです．以上です．
docker-compose で、簡単にサンプルのプログラムを実行できるようにやってみた

ふと、サンプルで書いたプログラムを、簡単に実行できるようになったらいいなーっと思ったので、
`docker-compose`を使ってやってみました。

# 下記のようにファイルを作成する

```
/hoge_directory
    |_ docker-compose.yaml
    |_ php_sample.php
```

# docker-compose.yaml を書く

```:docker-compose.yaml
version: '3'
services:
  php7.2:
    image: php:7.2-cli
    volumes:
      - ./php_sample.php:/php_sample.php
    command: php php_sample.php
```

# PHPのサンプルのプログラムを書く

```:php_sample.php
<?php

echo phpversion() . "\n";
echo "PHPだよ" . "\n";
```

# docker-compose で、サービスを実行する

```
$ docker-compose run php7.2
```

```:実行結果
7.2.20
PHPだよ
```

実行できたー！！！

#### `docker-compose`なら、別バージョンのphpの実行も簡単にできるんじゃない？
と考えたので、やってみた


# docker-compose.yaml に別バージョンのphpを実行するサービスを追加する

```:docker-compose.yaml
version: '3'
services:
  php7.2:
    image: php:7.2-cli
    volumes:
      - ./php_sample.php:/php_sample.php
    command: php php_sample.php
  php5.6:
    image: php:5.6.0-cli
    volumes:
      - ./php_sample.php:/php_sample.php
    command: php php_sample.php
```

# docker-compose で、別バージョンのphpのサービスを実行する

```
$ docker-compose run php5.6
```

```:実行結果
5.6.0
PHPだよ
```

# 終わり

`docker-compose`を使えば、簡単にサンプルのプログラムを実行できて、
プログラミング言語の別バージョンも実行できて便利だな〜

#GitHub
https://github.com/tubutubumustard/samplecode_docker.git
スプレッドシートのCOUNTIF関数でワイルドカードが使える

COUNTIF関数でワイルドカードが使えることを知ったのでメモ
https://support.google.com/docs/answer/3093480

| | A |
|:-----------------|:------------------|
| 1 | たこ,いか |
| 2 | たこ,えび |
| 3 | えび |

たこ、いか、えびのカウントを取得するのに以下のように関数を書きます。

```
=COUNTIF(A1:A3, "*たこ*")
=COUNTIF(A1:A3, "*いか*")
=COUNTIF(A1:A3, "*えび*")
```

セルの値を使ってもできますね。

| | A |
|:-----------------|:------------------|
| 4 | たこ |
| 5 | いか |
| 6 | えび |

```
=COUNTIF(A1:A3, "*" & A4 & "*")
=COUNTIF(A1:A3, "*" & A5 & "*")
=COUNTIF(A1:A3, "*" & A6 & "*")
```

うーん、便利。
Angularコンポーネント基礎

## コンポーネント基礎

Angular では基本的に、一つのコンポーネントは以下の 3 つのファイルから成り立ちます。

```
xxx.component.ts  - ロジックを記述　　
xxx.component.html - 表示する内容を記述  　
xxx.component.less - スタイルを記述
```
  
### ts
```xxx.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-xxx',
  templateUrl: './xxx.component.html',
  styleUrls: ['./xxx.component.css']
})
export class XxxComponent {
  title = 'テストタイトルです';
}
```    
  
.tsファイルでは、そのコンポーネントの定義やロジックを記述します。
`@Component({})`内部にて、上の3つのファイルがそのコンポーネントを構成するファイルであることを定義して関連付けています。
  
| 要素                 | 説明       |  
|-----------------|------------|
| selector | そのコンポーネントが他のHTMLから参照されるときのタグ名になる。上の例では、`<app-xxx></app-xxx>`と記述すれば、このコンポーネントが表示される。           |  
| templateUrl | そのコンポーネントを構成するHTMLのパスを記述する。        |  
| styleUrls   |  そのコンポーネントに適用するスタイルシートのパスを記述する。       |  
  
また、`export class`以下でそのコンポーネントのクラスを定義します。
ここにそのコンポーネントの持つ値やロジックを記述していきます。  

ここでは、`title = 'テストタイトルです'`というプロパティを定義しています。
   
### html  
```xxx.component.html  
<h1>{{ title }}</h1>  
```  
  
htmlファイルにはそのコンポーネントを構成するHTMLを書いていきます。テンプレートとも呼ばれます。  
あるHTMLにこのコンポーネントのセレクタ`<app-xxx></app-xxx>`を記述すると、実際にはこのhtmlの内容が表示されることになります。  
  
また、このhtmlファイルはxxxコンポーネントののテンプレートであると`xxx.component.ts`ファイルで定義されているため、`xxx.component.ts`で定義したクラスのプロパティを表示することができます。  
  
ここではtsファイルで定義されている`title`というプロパティを表示しています。`{{}}`の中にプロパティ名を記述することで表示することができます。

### less  

```xxx.component.less  
h1 {
  font-size: 48px;
}  
```    

lessファイルではそのコンポーネントのhtmlに適用するスタイルを定義します。
Python

VSCode: https://code.visualstudio.com/

Python Tutorial: https://docs.python.jp/3/tutorial/index.html

GitHub: https://github.com

Basic Linux Commands for Beginners: https://www.techbrackets.com/basic-linux-commands/

Mastering Markdown https://guides.github.com/features/mastering-markdown/

pytorch samples: https://github.com/pytorch/examples