OmniAICreator/Qiita-1.07M huggingface dataset:
ことりんと一緒 Springもね - 5. Actuator

## 概要 / 説明
[ことりんと一緒 Springもね - 4. REST API デザイン](https://qiita.com/shinyay/items/119b4b02e9816edd6948)までで Spring Boot を触ってきました。アプリケーションを動かす観点では、非常にシンプルですが動くようにする手順をみました。一方で、アプリケーションをモニタリングする観点では何も対応をおこなっていません。
Spring Boot では、簡単にモニタリングツールを実装する機能として、**Actuator** というものがあるので使ってみる事にします。

ところで、ここで使っている Spring Boot のバージョンは **2.x系**でした。
1.x系と2.x系ではいろいろな改善があり異なっている点があります。今回、使ってみようとしている Actuator も1.x系と2.x系で異なる点があるので、違いについても見たいと思います。

## 前提 / 環境
### ランタイムバージョン
- Kotlin : 1.3.0
- SpringBoot : 2.1.0.RELEASE

### Spring Dependencies
- Web
- Actuator

### 開発環境
- OS : Mac
- IDE : IntelliJ IDEA
- Build : Gradle

## 手順 / 解説
### Spring Actuator の利用
Spring Actuator を使えるようにするには、build.gradle に次の依存を定義します。

```gradle
implementation('org.springframework.boot:spring-boot-starter-actuator')
```

これだけで使えるようになります。
あとは、次のドキュメント 「[Endpoints](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints) 」に記載のあるエンドポイントにアクセスする事で様々な情報をHTTP経由で取得することが出来るようになります。

例：HEALTH

```bash
$ curl 'http://localhost:8080/actuator/health' -i -X GET

HTTP/1.1 200
Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 11 Nov 2018 13:08:00 GMT

{"status":"UP"}
```

### Spring 1.x と 2.x の差異
異なる点はいろいろありますが、1.x から 2.x にマイグレーションした時に遭遇しがちな代表的な点をいくつか見てみます。

#### アクセスベースパス
1.xでは、エンドポイントに直接アクセスして情報を表示していました。: `http://localhost:8080/health`
2.xでは、エンドポイントの前にベースパスを指定してアクセスを行います。: `http://localhost:8080/<ベースパス>/health`

デフォルトでは、ベースパスは **/actuator** です。

変更するには、設定ファイル(application.yml)に定義を行います。
以下のように定義することでベースパースを変更できます。以下の例では、ベースパスが `/admin` になっています。

```yaml
management:
  endpoints:
    web:
      base-path: /admin
```

#### 公開エンドポイント
1.xでは、エンドポイントは予め公開されていました。
2.xでは、公開されているエンドポイントは、`/health` と `/info` のみになりました。[->参考](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints-exposing-endpoints)

2.xでも、予め全て公開しておくには次のように設定ファイル(application.yml)に定義を行います。

```yaml
management:
  endpoints:
    web:
      exposure:
        include: "*"
```

例では、公開対象をアスタリクス(\*)で指定していますが、個別に指定する場合は、対象のエンドポイントを記述する事で公開できます。

```yaml
        include: beans, env
```

## まとめ / 振り返り
Actuator は依存を追加しておくだけで使用できる便利なツールです。
そのため、多くの場面で使う機会があると思うのですが、1.x系と2.x系でのアクセスの仕方や対象が変わっているので、2.x系へのマイグレーションを行う際には 404 にならないように気をつけたいです。

### 今回のソース
- [spring-just-rest-kotlin/tree/first-actuator](https://github.com/shinyay/spring-just-rest-kotlin/tree/first-actuator)
「わかばちゃんと学ぶGit使い方入門」を読んで見た感想とまとめ

# はじめに
今働いている職場ではGitを使うことはなく、「GitとGitHubなんて同じものじゃないの？」とか思いながら業務外の時間でGitを利用していました。
なので、全然Gitについて理解できてないなと思ったので基礎から学びたいと思い書籍を買って読んで見ました。
この本を選んだ理由としてAmazonのレビュー評価が高く、マンガでわかりやすそうという単純な理由です。
非常にわかりやすくGitについて解説されており、初心者でも十分に理解できる内容なので是非読んで見てください。(最低限でも3章まで読んで欲しいです。)

[わかばちゃんと学ぶ Git使い方入門](https://www.amazon.co.jp/dp/B071D4D6XX/)(Amazon)




また、本を読む前はこんなことしかGitについてできていませんでした。

- CUIのみでコマンドをググりながらMasterブランチだけで利用していた
- Git自体ソースコードのバックアップ用途だと思っていた
- GitHubはソースコードを自慢する場所みたいな感覚しかなかった

# 各端末に各自のリポジトリを持てる
まず、Gitってコミットした後にプッシュするものだと思っていたので、いつも以下のようにコマンド打って利用していました。
1. git commit -m "comment"
2. git push origin master
だが、本来は**コミットしたらローカルリポジトリ**に反映されて、**プッシュすればリモートリポジトリ**に反映されるとわかりました。
- ローカルリポジトリ：自分の端末のリポジトリ(コミット)
- リモートリポジトリ：GitHubやBitBucketなどのクラウド系のリポジトリ(プッシュ)

なので、ネットワークに繋いでいない環境でもコミットすればチェックアウトなどが可能になるのでGit自体の機能は利用できる...ということです。
また、PCなどが故障してバックアップを取っていない状況でもリモートリポジトリからプルして新しいPCに反映するのもよし、他の作業者のPCのリポジトリが無事ならその人の環境をプッシュした後新しいPCにプルするなどバックアップも便利だなと思いました。

# GitHub Flowとプルリクエスト
本書のコラムにあったGitHub Flowの考え方で運用ルールを決めれば開発作業も効率的になることがわかりました。
具体的にはmasterブランチとtopicブランチを併用する方法です。
- master：本番環境にデプロイできる内容に更新するためのブランチ
- topic：新機能の追加や修正するためのブランチ

masterブランチは本番の環境なので、新しいブランチをマージするときはプルリクエストを送ってレビューして反映させてもらうという開発方法になるので今どんな作業やっているのか把握できるのが良いと思いました。

また、この**プルリクエスト**は働いている場所関係なく利用できていい機能だなと思いました。
開発のレビューもGitHubのコミュニティでできたり、外部のSlackなどのツールで連絡を取り合うことも可能なので最近流行り？の**リモートワーク**に適しているなと思いました。
時々[connpass](https://connpass.com/)で勉強会やハンズオンなどに参加してWeb業界で働いている方と話をするのですが、リモートワークで働いている方を何人か聞いているのでその人たちはプルリクエストなどの機能使って他のメンバーとコミュニケーションを取って開発をしていると考えさせられました。
(そう思っているとWeb業界への憧れが...)
# その他
本書の4章以降は応用編またはQ&Aのような形なのですが、スカッシュとスタッシュとチェリーピックは便利な機能だと思いました。
スカッシュに関しては自分のGitHubを見ると同じ名前で何度もコミットするってことが多いので一度にコミットをまとめられる方法が知れて良かったです。
スタッシュは複数人で開発しているときに他の人の作業を手伝う時には非常に便利な機能だと思いました。
チェリーピックはブランチしたコミットを間違えても取り返しのつかない事にはならないのが良いと思いました。

# 不満点・疑問点
1. 紹介された機能については主にSourceTreeでやるときの方法なので、他のGit用GUIソフトでも同じ操作方法では対応できない事
2. 4章にある**リベース**は使用どころや使う意義があるのかどうかわかりませんでした。(実際の業務で使うことがあるのか誰か教えて欲しいです。)
3. あくまでも初心者向けの本書なのでCUIのコマンドについての記載はありませんでした。
4. Gitには関係ないが本書に出てくる謎の生命体というキャラクターの存在感が薄かったw
JavaScriptで同期的にsleepする方法 (通常用途には使わないでください)

JavaScriptでsleepするには通常、`setTimeout()` を使用します。

```js
setTimeout(() => {
    // do something after 100ms.
}, 100);
```

`setTimeout()`に渡したコールバック関数は、JavaScriptランタイムのメッセージキューに登録されます。
`setTimeout()`の呼び出し元は、コールスタックのすべての関数が`return`することで、ランタイムに処理が戻ります。
ランタイムは、メッセージキューにすぐに実行できる関数があれば実行し、なければ待ちます。

メッセージキューには `setTimeout()`で登録されたもののように、一定時間後にならなければ実行できないものと、`setImmediate()`や`Promise`で登録されたもののように即座に実行できるものがあります。

メッセージキューが空になると、Node.jsの環境であればプログラムが終了します。

## setTimeout()のスリープで何が問題か?

`setTimeout()`は、上述の通り現在のコールスタックがすべて`return`しなければ処理が始まらないのですから、現在のコールスタックを維持しなければならない場合、sleep後に何かが呼ばれても意味がありません。

私の場合は、インタープリタを作っていて、ブレークポイントでデバッガの関数を起動し、標準入力(TTY)から入力を待つという状況で問題となりました (そのコールスタックに積まれたものをデバッグしたい)。

## でも、Promise化して await で待てるんじゃないの?

確かに、すべての呼び出し元が `async` となるように設計すれば可能ですが、すべての呼び出しがメッセージキュー経由となるオーバーヘッドは許容できませんし、また、同インタープリタではユーザーの任意のJavaScript関数もインタープリタの関数として組み込める機構となっているため、利便性からもNGでした。

## 同期的に待つ方法

[Atomics.wait() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
[SharedMemory と Atomic API について](https://qiita.com/yosuke_furukawa/items/923f8d40c451713dfbd3)

比較的新しい機能である worker の、worker間で共有メモリを利用して通信するための `SharedArrayBuffer` `Atomics` を使用することで、同期的にsleepすることができます。

```js
const sab = new SharedArrayBuffer(8);
const s32ar = new Int32Array(sab);
Atomics.wait(s32ar, 0, 0, 100); // 100ms待つ
```
> 注意(2020/3/9追記)
> SharedArrayBufferはSpectre脆弱性対策として一部ブラウザでは引き続き無効化されています
> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer


## 副作用 (大変危険)
イベントループが回らないので、非同期I/Oがすべて止まります。
Promiseに依存した処理も止まります。
NodeのAPIも、どれが動いてどれが動かないか確実なことは言えません。
ただ、システムコールの薄いラッパーになっているAPIは動作すると考えられます。
Node 10,11 の環境で、 `fs.readSync` `fs.writeSync` `process.stdout.cursorTo` `process.stdout.clearScreenDown` が動作することは確認できました。

## 結論
軽い気持ちで使うと、開発チームメンバーからしばかれること必至です。
普通のsleep目的で使ってはいけません。
もやしのGame a week挑戦記 1週間目

＝＝＝＝＝＝パクリクラフト＝＝＝＝＝＝＝
一週間目はマインクラフトっぽい何かを作りたいと思ってマインクラフトの超超超超超超超劣化版を作ってみました（属にいうバカゲー
是非ダウンロードして感想お待ちしております。リンク↓
https://www.dropbox.com/s/1yjxgn12qnitzdu/1weel.zip?dl=0
![bandicam 2018-11-11 22-26-29-068.jpg](https://qiita-image-store.s3.amazonaws.com/0/311207/4a7b2d38-4246-f292-d0eb-4484b044b4ff.jpeg)

![bandicam 2018-11-11 22-23-58-262.jpg](https://qiita-image-store.s3.amazonaws.com/0/311207/e426914e-f042-e50a-080c-eb399a60a8e4.jpeg)


![bandicam 2018-11-11 22-24-04-575.jpg](https://qiita-image-store.s3.amazonaws.com/0/311207/c92b9399-697d-f11f-8bd9-158210015e1a.jpeg)
![bandicam 2018-11-11 22-26-43-057.jpg](https://qiita-image-store.s3.amazonaws.com/0/311207/533d2d77-ca04-f063-7536-ffc7aa1af02e.jpeg)


　・学んだこと
＊テキストボックスを表示、非表示をさせられた
　（マイクラでコマンド打てるあれです/helpと書くともう一個のテキストボックスに表示されます

＊StandardAssistのFPSCameraをつかって自分の目線で動けるようになった

＊自分の座標の地点をtextに表示させることができた。

＊FPS値をTextに表示させられた。

＊ブロックを左クリックで置けるようにした。（壊せるとは言ってない

＊画像を表示させられた。

　・わからなかったこと（お願いします教えてくださいなんでもしますから

＊テキストボックスを表示非表示させることができたが一度非表示にしたらもう一　度表示させることができなかった。
　表示非表示はこんなコードで作りました
        if (Input.GetKey(KeyCode.Space))
        {
            textbox1.SetActive(false);
        }
        if (Input.GetKey(KeyCode.T))
        {
            textbox1.SetActive(true);
        }
textbox1はgameObject textbox1;で定義しました

＊ブロックにテクスチャを張ろうとしたが全面同じ画像になってしまった。

＊ブロックを置くことはできたが上に積んでいくと斜めにおかれたり空中にブロッ　クを置けたり地面に置くときも均等におくことができなかった。


＊ブロックを壊せるようにしたかったが右クリックでブロックを壊せるようにしよ　うとするとブロックはprefabでつくっているので全部のprefabが消えるように　　なった。またクリックしたオブジェクトを消せるようにしたら一番手前にあるカメラがまず消されるようになって萎えた。

＊最初目線カメラにしなかった時cubeを動かせるようにしたのだがジャンプをさせるためのコードがわからなかったのでそこで断念してしまったのでプレイヤーがジャンプできるコードを書いていただいたり教えていただけたらありがたいです！
　
このような感じで一週間目のバカゲー完成しました
AWS S3のCORS設定でハマった話

S3でCORSを設定する必要がでてきたのですが、ちょっとしたミスに気づけず、しばらく手間取ってしまいました。

## TL;DR（結論）

`<AllowedOrigin>`に指定するドメインの末尾には、スラッシュを**付けてはいけない**。

## 経緯

いままでCORSの設定をしていなかったS3のバケットに対して、CORSヘッダを設定する必要が出てきました。設定方法はAWS公式のヘルプにも載っていたので、それに従ってコンソールを開き、バケットの権限設定のCORSのところへ、必要な情報をXML形式で書き込む、というようになっていました。通すオリジンはデフォルトで`*`にしてもいいかと思ったのですが、念のために特定のドメインを指定しておくことにしました。

```xml
<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>https://jkr2255.some-service.example/</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>
```

これだけ設定して実際にアクセスを飛ばしてみるも、CORSが必要なリクエストは失敗してしまいました。あちこち調整した挙げ句、1文字が余計だったことに気づきました。

```xml
<CORSConfiguration>
 <CORSRule>
    <!-- 最後にスラッシュなし -->
   <AllowedOrigin>https://jkr2255.some-service.example</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>
```

確かにお手本を見ればスラッシュはついていませんでしたが、ミスしそうなところなのに誰も言及していなかったので、ここにメモしておくこととします。

## CORSの簡単なチェック方法

カスタムヘッダをセットできるツールでテストしてもいいのですが、当該のサイトを開けるなら、そこでコンソールを開いて、以下のように打てば他のツールなしでもレスポンス状況を確認できます。

```js
fetch('https://path.to/file').then(console.log.bind(console));
```

まず最初に`then`の返す`Promise`が表示されますが、通信が終わったあとに、CORSが通っているなら`type: "cors"`と明記されたオブジェクトが出力されます。CORSでの通信ができない場合、エラーとなります。

## 外部リンク

* [バケットで CORS を設定する方法（AWS公式）](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/cors.html#how-do-i-enable-cors)
VirtualBoxでIE8のテスト環境構築

1.下記Microsoft公式サイトからVMをダウンロードして解凍する

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/
Virtual Machine : IE8 on Win7 (x86)
Select Platform : VirtualBox

＊注意：ページ内も書いてありますが、ライセンスが切れでも利用できるよう、
スナップショットを取って置いてください。
These virtual machines expire after 90 days. We recommend setting a snapshot when you first install the virtual machine which you can roll back to later.

2.最新版VirtualBoxをダウンロードする
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

3.解凍したVMイメージファイルをVirtualBoxにimportする
参照手順：https://docs.oracle.com/cd/E26217_01/E35194/html/qs-import-vm.html
ファイル形式に関するエラーが出る場合、こちらに参照：
http://cosol.jp/techdb/2012/11/import_ovf_format_vm_template.html

4.ネットワーク設定：Host-only Adapterを選択する
参照資料：https://blogs.oracle.com/scoter/networking-in-virtualbox-v2

5.index.htmlファイルをVMにコピーする
VirtualBox共有フォルダーの機能で実現する。（*WinSCPでもOK）
参照手順：http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-set-up-shared-folder-of-virtualbox-in-mac.html

6.VM上に画面確認ができるための設定
-ローカルPC
    アプリ内ホスト名を指定する場所に、host="＊"へ変更する

-IE8-Win7 VM
    index.htmlファイルをエディターで開き、
    "localhost"を書いてある場所→"ローカルPCのIPアドレス"へ変更する。

7.ローカルPCからサーバーを起動して、VM上に画面の動作確認をしてみる



以上
Mac標準のApacheにhomebrewでインストールしたPHPモジュールを指定するとエラーになる問題の解決方法



homebrewでインストールしたPHPのApacheモジュールをMac標準のApacheで使用するために以下のように記述したとします。

```apache
LoadModule php7_module /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so
```

そして再起動すると以下のエラーが発生して失敗します。

> httpd: Syntax error on line 179 of /private/etc/apache2/httpd.conf: Cannot load /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so into server: dlopen(/usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so, 10): no suitable image found.  Did find:\n\t/usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so: code signature in (/usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.\n\t/usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so: stat() failed with errno=22

エラーメッセージが長いですが、要は libphp7.so のロードに失敗していて、その理由は署名されていないからということです。codesign コマンドで確認すると確かに署名されていません。

```shell-session:homebrewでインストールしたlibphp7.soの署名
$ codesign -vd /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so
/usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so: code object is not signed at all
```

なぜエラーになるかというと、以下のように /usr/sbin/httpd が署名されるようになり、それによってロードされる .so も署名されている必要が出てきたということのようです。署名していない .so がロードできたら署名しているコードと全く関係ないコードが実行し放題になってしまうので、そういうことはできないということなのでしょう。おそらくHigh Sierra以降で署名されるようになったようです。

```shell_session:標準でインストールされているApacheの署名
$ codesign -vd /usr/sbin/httpd
Executable=/usr/sbin/httpd
Identifier=com.apple.apache.httpd
Format=Mach-O thin (x86_64)
CodeDirectory v=20100 size=6599 flags=0x0(none) hashes=202+2 location=embedded
Platform identifier=5
Signature size=4485
Info.plist entries=6
TeamIdentifier=not set
Sealed Resources=none
Internal requirements count=1 size=72
```

ということで標準のApacheではhomebrewでインストールしたPHPモジュールは使用できません。解決方法としては署名されていないApacheをインストールしてそちらを使うということになります。幸いhomebrewでApacheもインストールできるので、以下のようにしてhomebrewのApacheを使用できるようにすることができます。

```shell
# homebrewでApacheをインストールする
brew install httpd
# 標準でインストールされているApacheを停止する
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
# homebrewの方のApacheを起動する
brew services restart httpd
```
VSCodeやVimのTerminalでCtrl+Cのコマンドキャンセルが使えない問題

結論：とりあえずpowershellの場合はCtrl+Uで代用

正式名称はわからないんですが、BashやPowerShellなどのシェルでコマンドを間違えたりしたときにCtrl+Cを押して入力をキャンセルし新しいプロンプトを出すことができます。以下この動作をコマンドキャンセルと呼びます。（実行後のコマンド中断ではなく実行前のキャンセルです）

単に間違えたコマンドをBackspaceで消すよりも早いし間違えた入力が画面に残るので後でコピペとかもできるという利点があります。

私はこの動作を多用するんですが、VSCodeやVimのTerminalでcmdかpowershellを起動するとCtrl+Cを押しても何故かコマンドキャンセルにはなりません。
powershellの場合は^Cと表示されますし、Bashの場合はコマンドキャンセルになるのでキー入力がVSCodeやVimに取られているわけではなさそうです。
ただなぜかCtrl+Cを受け取ってもコマンドキャンセルしないのです。

検索しても特にこの問題に言及している記事がないのでコマンドキャンセルを使う人は少ないのだろうか。

いろいろ試行錯誤してみましたが、解決には至らず、偶然見つけたCtrl+Uでカーソルの左の入力を全て削除というショートカットを使うことにします。
でもこれだと画面からも消えちゃうんだよな。
helpful links

https://qiita.com/moris/items/02c01a239b9701336260 
ubuntuにgcc, binutilsなどを一括インストール

https://qiita.com/nagayaoh/items/d15b0e5836e23060a976
設定保存可能なlive usbを作る

https://unetbootin.github.io/
unetbootinツール
gitで日本語の文字化けを解消できない場合の対処法

`git log` コマンドでリポジトリの履歴を取得しようとしたときに、日本語文字列が文字化けしてハマってしまった。

対処法を検索すると、`core.pager`と`core.quotepath`が影響してるようで、gitconfigに以下の記述をすると良いという記述が多々見つかった。

```json:gitconfig
[core]
    pager = "less cm"
    quotepath = false
```

しかし、私の環境ではこれらの設定をしても、文字化けを解消できなかった。

…が、このような場合でも上手くいった方法が一つあった。
それは、 "`--no-pager`指定をする" こと。

以下、コマンド例。

```json:sample
$ git --no-pager log --pretty=format:"%cd,%H,%cn,%s" TAG1...TAG2
```

暫定的な対応ではあるものの、てっとり早くマトモな文字列とご対面したい場合には使えるかと。
ubuntuでcudnnをaptでインストール

(2023/11/23追記)
ubuntu22.04向けにはmachine-learning/repos/ubuntu2204が無いため以下の方法は使えなくなったが、いつのまにか普通にCUDAを入れるとlibcudnnなどもインストールできるようになった模様。

----

なぜだかよくわからないが以下のNVIDIA DIGITSインストール方法記載のrepoを追加することでlibcudnnのインストールがaptでできるみたい。
  https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildDigits.md

以下だけ実行すればOK。

```shell:
$ curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | apt-key add -
$ echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list
$ apt-get update
$ apt-cache search libcudnn
libcudnn5-dev - cuDNN development libraries and headers
libcudnn5 - cuDNN runtime libraries
libcudnn6-dev - cuDNN development libraries and headers
libcudnn6 - cuDNN runtime libraries
libcudnn7-dev - cuDNN development libraries and headers
libcudnn7 - cuDNN runtime libraries
libcudnn7-doc - cuDNN documents and samples
```

ver upが出てもapt-get upgradeで対応できるので楽。
なぜcudnn公式のインスール方法でこれを書かないんだろう？
GROUP BYでまとめたデータを全件表示する最善手法

#GROUPCONCATを使って複数行のカラムを一つにまとめた時の全文表示方法
mysqlで登録ユーザーの趣味の情報をセレクトしてくる際に、一人が多くの趣味を登録していたため一度に情報を引っ張ってこれませんでした。
つまりGROUP BYするとユーザー、一人につき一つの趣味しか表示することができない...
言葉ではうまく伝えられないのでuserテーブルの構造を載せます

![1541941121607.jpg](https://qiita-image-store.s3.amazonaws.com/0/315102/1e29c60c-51d3-804e-a20f-ca173d4abef7.jpeg)

上記を見ると、ユーザーID35番の人は2,7,14,21の趣味を持っている（2はお酒、7は野球観戦などと決めている）


しかしユーザーID35番でGROUP BYするとすべてまとまってしまい2(お酒)しか取り出すことができない
理想は2/7/14/21と表示されることです...
##ここでGROUPCONCAT
```php:db_function.php
$SQL = "SELECT GROUP_CONCAT(carevery_id separator '/') FROM user where user_id = '35' GROUP BY user_id"
```
上記のように書くと2/7/14/21と取り出すことができます

またseparatorの後ろ('/')の部分を変えることで区切り文字を変更することも可能です
はっきり言ってめちゃくちゃ便利なので皆さん是非とも活用してください。

以上です。
少しでもお役に立てれば幸いです。
何か間違っている部分等御座いましたら、ご意見よろしくお願いします！
【挫折する前に】Ruby 配列オブジェクトとハッシュオブジェクトのイメージ

この記事では**配列オブジェクトとハッシュオブジェクトの違いってなに？？？**
という方向けに解説していきたいと思います。
最初はなかなかわかりづらいこの２つのオブジェクトですが、頭の中でイメージができるようになると理解が早まると思います。

## この記事が参考になりそうな人
- 配列オブエクトとハッシュオブジェクトの違いがイマイチわからない人
- 配列オブエクトとハッシュオブジェクトのイメージが掴めない人

## 配列オブジェクトのイメージ
まずハッシュオブジェクトから解説していきます。
配列オブエクトとは**複数のオブジェクトに対して番号をふる形で格納するオブジェクト**です。
CDアルバムを例えに説明してみます。
CDアルバムはタイトルがあって、その中に曲が入っていますよね？
下記のようなイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/295487/08ebd27a-4dd2-7f12-d391-bcbc348700cf.png)
`RIOT ON THE  GRILL`というタイトルのCDのなかに`１曲目RedHot` `2曲目モンスター` `3曲目Snake Fighting`という風に曲が並んでいます。※ここではアーティスト名はおいておいてください。

これを配列オブジェクトで書くと

```Ruby:sample.rb
riot_on_the_grill = ["Red Hot",  "モンスター", "Snake Fighting"]
```
となります。

ただここで一つ注意点があります。
それは**配列オブジェクトのインデックスは０からスタートする**ということです。
要するに左から順番に`Red Hotには0` `モンスターには1`という風に番号がふられます。
これはコンピューターの数の数え方に準じていますのでそう覚えてしまいましょう。

###配列オブジェクトから値を取り出してみる
配列オブジェクトから値を取り出すには`配列名　 = [インデックス]`という構文を使います。
例えば`Red Hot`を取り出すには以下のようになります。

```Ruby:sample.rb
riot_on_the_grill = ["Red Hot",  "モンスター", "Snake Fighting"]
puts riot_on_the_grill[0]
=> Red Hot # Red Hotが出力される
```

##ハッシュオブジェクトのイメージ
続いてハッシュオブジェクトです。
**ハッシュオブジェクト**には配列オブジェクトのように１番目・２番目・・・という**順番がありません**。
その代わり`オブジェクト`と、それを取り出すための`キー`がセットになります。
`キー => "オブジェクト"`という形式で書きます。
先ほどのCDの例で説明します。
CDには`アルバム名`と`アーティスト名`がありますよね。
アルバム名"RIOT ON THE GRILL"というオブジェクトに`title`という`キー`を指定、
アーティスト"ELLEGARDEN"というオブジェクトに`artist`という`キー`を指定します。
それを**song**というハッシュ名で書くと以下のようになります。

```Ruby:sample.rb
song = {:title => "RIOT ON THE GRILL", :artist => "ELLEGARDEN"}
```

`:title`というキーに`RIOT ON THE GRILL`が入り、`artist`キーに`ELLEGARDEN`が入っていますね。
これでハッシュにキーを持たせてオブジェクトが格納できました。
###ハッシュの省略記法
ちなみに省略形での記法もあり、こちらを使うのが一般的です。

```Ruby:sample.rb
song = {title: "RIOT ON THE GRILL", artist: "ELLEGARDEN"}
```

###ハッシュオブジェクトから値を取り出してみる
ハッシュから値を取り出すには`ハッシュ名[キー]`で取り出せます。

```Ruby:sample.rb
song = { title: "RIOT ON THE GRILL", artist: "ELLEGARDEN" }

puts song[:title]
=> RIOT ON THE GRILL #出力される
puts song[:artist]
=> ELLEGARDEN #出力される
```
それぞれの値が取り出せています。
おすすめのプログラミング言語

20200225追記しました。
#この記事の前提
最近プログラミング言語についておすすめ記事をよく見るので自分も書いてみようかと思いました。
ちなみに私はSES系の中小SIerで４年位働いてるSEです。
主にサーバーサイドをいじることが多いです。
WEB系業界のことについても知ってる範囲で書いていきたいと思います。
（間違ったこと言ってたら訂正ください）

以下のことを前提に読んでいただきたいです。
・基本私が触ったことがある言語を中心に触れていきます。ないからと言って良くない言語というわけではないです。
・主に「習得のしやすさ」「習得後の需要」の２点を中心におすすめしたいと思います。

##JavaScript（習得のしやすさ：６～８点、習得後の需要：９点）
主に画面側で動きをつけるために使われる言語
最近はサーバー処理になどにも使われるようになり、そちらも含めて習得なると習得難易度は上がると思います。
フロントとサーバーどちらをメインに仕事にするかによるかによりますがhtml、cssと一緒に最低限身につけておいて損はない言語だと思います。
（html、cssは今回触れませんが最低限読めるようにはなりましょう）
###20200225追記
これを書いた当時はjQueryくらいしか知らなかったのですがJSはFWの切り替わりが早い分ずっと現役な気がします。
Angular、Reactとか・・・
ネイティブなJSのことを知らずにFWベースで習得すると毎回違う言語を勉強している感覚になるのでJSの基礎から勉強するとあとから楽になると思います。

##PHP（習得のしやすさ：８点、習得後の需要：８点）
おそらく未経験社会人でできるだけ早く仕事を見つけたい人に一番オススメの言語
言語として難易度が高くない点、教材が豊富な点、成果物を作りやすい点など身に着けやすい言語です。
またWEB系企業で一番使われている言語なので首都圏で中小企業への就職に抵抗がなければ実用性も高いです。
（地方だとWEB系企業の数そのものが少なかったりするのでSIerへ行こうとすると評価されないかもしれません）

##Java（習得のしやすさ：６点、習得後の需要：７点）
PHPとは逆にSIer業界で一番使われている言語
昔からある言語なので学習のための情報はたくさんあるけどPHPにくらべ成果物は作りにくいです。
言語のほうがバージョンアップしてもエンジニアのほうが古いままのことが多い気がします。
静的型付け言語であまり好きではないですがメリットはたくさんあるんですよね・・・
~~求人数など見ると下り坂の言語なので今から未経験で身につけるというのはあまりコスパは良くないかもしれません。~~
でもJavaで作られている大規模システムというのは多いので、改修に関わる仕事はなくなりませんし、SIerへの就職を考えている人にはおすすめです。
（SIerへの就職自体はおすすめしません笑）
###20200225追記
JavaはSpringbootで開発することで今まで弱点だった開発環境などの問題がある程度クリアされた感じがします。
一部WEBでも使われることを考えるとコスパ高いし、つぶしが利く言語だなって思います。
以前書いた通り、今後Javaが広がる未来はあまり見えないのが難点です。

##C言語（習得のしやすさ：５点、習得後の需要：４点）
主に組み込み業界で使われる言語（他にWEBシステムの一部コンポーネントに使われたりすることがありますね）
組み込み系はハード面の知識等も必要になるのでCでコーディングだけできればOKというわけではないので就職には直結しないと思います。
また言語として難易度が高めなのでプログラミングを知らない最初に挑戦すると挫折する可能性が高いです。
ただスクリプト言語だけを勉強していたら触れない体系的な部分に触れることができるので学生のうちに勉強教材的に使うのはありだと思います。
私も学生の時にCをやっていてそのあとに他の言語の習得役立ったと感じています。

##C＃（習得のしやすさ：６点、習得後の需要６点）
習得の難易度等はJavaと同程度といった感じ
私のいる業界だと.net系のウェブシステム開発で使われている
求人数とかを見るとJavaよりは少ないです。
ただ最近開発環境VisualStudioを提供しているマイクロソフトの影響かゲーム開発、アプリ開発にも使われるようになっているようです。
今後使われる幅が広がる言語かもしれません。

##Python（習得のしやすさ：８点、習得後の需要５点）
機械学習に使われる言語（ウェブ開発にも使われますね）
特徴としてはわかりやすい記述方法だと思います。
一方で処理自体はそこまで早くないので（ぶっちゃけ遅い）どこまでつかわれるようになるか未知数です。
機械学習に興味ある人は少し勉強しておいたほうがいいと思います。
でもAIとかそういうのって日本でどれくらいの人が開発に関わるようになるんでしょうね？
Pythonの習得自体は簡単ですがそれが主に使われる機械学習とかは高度な数学の知識が必要になるのでそちらも合わせて理解となるととても大変です。

##その他あまり知らない言語たち
###Swift
iOSアプリケーション開発にはほぼ必須の言語（Object-Cって今は使わないんですかね？）
iOSアプリの開発に興味があれば必須ですがかかわらないならおそらく不要になると思います。
登場したばかりのとき少し触ったんですが個人的には難しいといった印象が強いです。
アプリ開発に使われるということは環境整備とか整って使いやすくなったのかな？
後で調べて追記するかもです。

###Ruby
PHPと同じかそれ以上にWEB系企業で使われている言語
Ruby on Railというフレームワークをほぼ固定で使ってるのでフレームワークに関する学習までできると思います。
（というかせざる得ない？）
WEB系企業への就職を考えてるならかなり需要が高い言語だと思います。

###GO言語
いままでWEBシステムでCが担ってた役割を代替し始めた言語
Cよりはわかりやすかったです。
PHPとかしかできない人からすると少しハードルが高いかも？
天下のGoogle様が開発した言語なので今後需要は増えていくのかな？と思います。
個人的には言語としては微妙な部分が目立つので深く触るのは控えさせて頂いてます。

#最後に
今の時代として１つの言語にとても詳しくなる（資格で言うゴールドとかプラチナレベルになる）より複数の言語を使えるようになったほうがいいと思います。
複数の言語を学習することでAではこうだったのにBではこうだったんだというふうに差分が見えて両方の言語への理解が深まります。
（使わないと忘れるしごっちゃになって大変ですけどねｗ）
また複数の言語を学習するとき動的な言語と静的な言語を早い段階で身につけるべきだと思います。
WEB系企業に入った場合、お仕事の都合でPHPとRubyが使えるようになったとしても両方動的言語なのでもう一つ静的言語
たとえばGo言語とかを身につけるべきかなと思います。
node-red(enebular)でobnizを動かしてみた


周りにnode-red派がたくさん出てきたので、obnizも動かしてみました
node-redを独自サーバーで動かすのも大変なので、実行環境としてenebularを使わせてもらいました。
[enebular Advent Calendar](https://qiita.com/advent-calendar/2018/enebular)にも登録してしまったので、その準備運動でもあります

enebularを使ってますがまだenebular独自のところは使ってなく、node-redとしてしか使えていません・・・.

## node-red(enebular)とobnizを繋げる方法

ざっくり３パターンあるのかなと思ってます。

- 誰かがobnizノードを作ってくれるのを待つ
- websocketの通信内容をすべて頑張ってnode-redでかく
- HTTP REST APIで簡易的に使う


一番簡単なのは誰か作ってくれるのを待つことですねでもやっぱり今すぐ使いたいとなると無理があります。
Websocketの接続も[仕様が公開](https://obniz.io/doc/sdk/doc/websocket)されているので、作ろうと思えば作れますが、これまた根気がいりそうなので、とりあえず今すぐ簡単に使おう！ってことで[HTTP REST API](https://obniz.io/doc/about_obniz_api)で使うことにしました。

## node-red(enebular)のフローを書き始めるまで

[enebularにログイン](https://enebular.com)すると、ProjectとAssetってのが出てきました。
![スクリーンショット 2018-11-11 16.13.30.png](https://qiita-image-store.s3.amazonaws.com/0/227015/07f68184-c96e-8df9-f7d6-2cc3e3836066.png)


Assetってなんだ・・・？素材？画像とか置く場所？みたいなことを思いましたが、どうやらビジュアルで書くフロー１つ１つがAssetで、それをまとめたのがProjectという立ち位置のようです。



Projectを作って、その中のAssetを作って、そのAssetの画面のEditFlowを押したら本題のフローが出てくる・・・！　と思ったらなかなか出てこない・・・

こんな画面で止まりました。
![スクリーンショット 2018-11-11 16.19.07.png](https://qiita-image-store.s3.amazonaws.com/0/227015/e9f2becd-e3f3-6d8d-9302-0f8bed4e1c03.png)



[enebular meetup](https://enebular.connpass.com/event/102144/)の際に中の人に聞いたらMacのSafariだとだめらしいです・・・。
対応ブラウザが限定されるのは仕方ないですよね。

気を取り直してChromeでやったら出てきました。
![スクリーンショット 2018-11-11 16.20.15.png](https://qiita-image-store.s3.amazonaws.com/0/227015/566eeb15-704a-a705-417e-d85a71338fb2.png)



## フローの作成

obnizのHTTP REST APIはすごく簡単で、
`https://obniz.io/obniz/{obniz_id}/api/1`にPOSTでjsonをおくればいいようです。

サンプルがこんなのなので、それをそのまま使ってみます。

```
curl https://obniz.io/obniz/{obniz_id}/api/1 -H "Content-Type: application/json" -X POST -d '[{"display":{"clear":true, "text":"Works fine."}}]'
```



とりあえずinjectでボタンを押したらHTTP REQUESTが飛ぶようにしてみます。
![スクリーンショット 2018-11-11 16.22.39.png](https://qiita-image-store.s3.amazonaws.com/0/227015/342e41d0-d318-e712-66f4-e96238c1701d.png)




injectのボタンの中身が`[{"display":{"clear":true, "text":"Works fine."}}]`ですね

![スクリーンショット 2018-11-11 16.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/227015/93f8882c-ec59-1ff4-6e36-b3d3260b7f71.png)


HTTP REQUESTの方はPOSTに変えて、`https://obniz.io/obniz/{obniz_id}/api/1`へのアクセスにします

`{obniz_id}`のところは自分のobniz idに置き換えるのを忘れないように！

![スクリーンショット 2018-11-11 16.24.30.png](https://qiita-image-store.s3.amazonaws.com/0/227015/1c777ca5-6278-abcc-a5ec-7c5594580841.png)


これでボタンを押したらリクエストが飛んで、obnizのディスプレイの内容が変わるはずです

あと、右上のDeployボタンを押すのを忘れないようにしましょう。
押してなくてなんで動かないのかな？？とずっと悩んでました・・・・。

## 実行

ボタンを押したらディスプレイに文字が表示されました！
小さくてわかりにくいですがその時の画像です

![20181111_164956.GIF](https://qiita-image-store.s3.amazonaws.com/0/227015/fa76becb-9293-ff63-64d7-efa5ac740298.gif)

ディスプレイを消すコマンドは入れてないので、消したいときはobnizの
電源の抜き差しをする必要があります笑




## まとめ

HTTP REST APIを使えばnode-red(enebular)からも簡単にobnizを使うことができました！
ただ、これだと一方向の命令を与えるだけで、リアルタイム入力が難しいので、やっぱりwebsocketでつなぎたいですね。
[enebular Advent Calendar](https://qiita.com/advent-calendar/2018/enebular)までに間に合えば作りたい・・・とおもいつつ、全然間に合う自信がないので別ネタ考えときます。
Cisco IOS-XE ipv6自動設定Configのコピペ(RA,RDNSS)

# 何
- 最近のIOS-XEではRAにのせてDNSサーバーの情報を配れる(RDNSSと呼ばれる。RF8106)
    - これによってDHCPやDHCPv6が無くてもv6のネームサーバーを広告できる。。
- 設定方法忘れがちなので備忘録

## 環境
- ASR1001-X
- ```Cisco IOS XE Software, Version 16.05.01b```


# 答え
各Interafaceにこれを流す。

```
 ipv6 address FE80::1 link-local
 ipv6 address IPv6ネットワークアドレス::1/64
 ipv6 nd prefix IPv6ネットワークアドレス::1/64
 ipv6 nd ra dns server 2001:4860:4860::8888 # RDNSS
 ipv6 nd ra dns server 2001:4860:4860::8844 # RDNSS
```

## ちなみに
- ```ipv6 address FE80::1 link-local```を設定しなくてもこの検証環境であればSLAACによりリンクローカルアドレスを名乗れた。


## 参考
- [ipv6 source address selection](http://hy0.hatenablog.com/entry/2018/01/19/232911)
RectTransformUtility.ScreenPointToLocalPointInRectangleではまった

# やりたいこと
Canvas-RenderMode-Screen Space-Camera
で
UIをドラッグしたい

# はまった点
http://appleorbit.hatenablog.com/entry/2015/10/23/000403
を参考に Selectable ,IDragHandlerを追加して実装
以下の部分がドラッグの部分

``` EyeStone.cs
   public void OnDrag(PointerEventData eventData)
        {
            Vector2 localPos = Vector2.zero;
            var ii =RectTransformUtility.ScreenPointToLocalPointInRectangle(
               GetComponent<RectTransform>(),
                eventData.position,
                Camera.main,
                out localPos
            );
           _transform.localPosition = localPos;
        }
```

これで動かしてみると...
![RTU.gif](https://qiita-image-store.s3.amazonaws.com/0/150338/2486dd0a-70a0-dc35-9b46-52eb0ee1e0d3.gif)
すっごい荒ぶる... 

##　解決策 

以下のように変更したところ正常に動くようになりました

``` EyeStone.cs
public void OnDrag(PointerEventData eventData)
        {
            Vector2 localPos = Vector2.zero;
            var ii =RectTransformUtility.ScreenPointToLocalPointInRectangle(
               //親から取ってくる
               transform .parent .GetComponent<RectTransform>(),
                eventData.position,
                Camera.main,
                out localPos
            );
            _transform.localPosition = localPos;
        }
```

![RTU_Right.gif](https://qiita-image-store.s3.amazonaws.com/0/150338/9e61e6bb-a92c-2846-f5a7-adda59f26e13.gif)

イェイ！

### 原因

公式のドキュメントを再度見てみたところこのようにありました

https://docs.unity3d.com/ScriptReference/RectTransformUtility.ScreenPointToLocalPointInRectangle.html

>Transform a screen space point to a position in the local space of a RectTransform that is on the plane of its rectangle.

これ意味合い的には**あるRectTransfom内における**localPositionを返すって意味だと思うので、範囲とするRectTransform自体を動かすDragでは計算的におかしいのか、
もしくは、対象とするRectTransform外における計算値はおかしくなるのかもしれません。


##付録
ソースも上げておきます
https://gist.github.com/OhkuboSGMS/81e409393a67d114ed24347040e8de3d
AUTOSAR（Adaptive 18.10）を読んでいく（2）

# Explanation of Adaptive Platform
開いてみると80ページほど。Generalのページ数は一体何だったのか。。。
大まかな章構成は以下。これまた多いこと。

- Introduction to this document
- Technical Scope and Approach
- Architecture
- Operating System
- Execution Management
- State Management
- Communication Management
- RESTful Communication
- Diagnostics
- Persistency
- Time Synchronization
- Network Management
- Update and Config Management
- Identity and Access Management
- Cryptography
- Log and Trace
- Safety
- Core Types

とりあえずは上から順に見てみることに。
今回は、IntroductionとTechnical Scope and Approachの部分のみ。

# Introduction to this document
概要記述。ざっくり言うと以下のことが書いてある。

```
本文書では、AP(Adaptive Platform)の概要を示す。
具体的には、APの全体的な設計と、鍵となるコンセプトを、
APのユーザと実装者に示す。
```

ユーザと実装者の差がよくわかっていないけど、
ユーザ ≒ アプリの設計者（APを使う人）、
実装者 ≒ OSとかの設計者（APを作る人）っていうことかね？

まあ、概要レベルで良ければこの文書で合っているっぽい。

# Technical Scope and Approach
## Overview - a landscape of intelligent ECUs
```
今までのECUは、他のECUから信号をNetwork経由で受け取って、
電気的な出力信号を制御する機能を持っている。制御SWの多くは
ターゲットとなる自動車に対して設計及び実装され、自動車の
ライフタイムに置いて変化することはない。
```
まあ、組込み業界ではよくある記述。

```
高度自動運転などの機能を搭載した新たな自動車は、
超複雑で計算負荷もでかい。また、完全性やセキュリティ要求もある。
```
自動車業界も大変なんですね。

```
AUTOSAR Classic Platform（CP）の仕様では、複雑に組み込まれた
ECUの要求には対応しているけど、先述した要求は満たせていない。
そこで、AUTOSAR Adaptive Platform（AP）を策定した。
APでは、高精度な計算や通信メカニズムに加えて、
SWを柔軟に設定ができるようになる（例えば、over-the-air）。
```
なんとなくAPの立ち位置はわかった。この業界も大変だなぁ。。。
over-the-airが何を示すのかがよくわからなかったのでググった。
無線経由でSWを更新することを指すらしい。

## Technology Drivers
ぶっちゃけ「Technology Drivers」が何を示すかよくわからないが、
EthernetとかGPGPUに言及しているので、技術的に関連のあることがらと、
その背景を指しているっぽい。直接的には関係なさそうなので省略。

## Adaptive Platform - Characteristics
APの特徴について書かれている。大きくは以下。

- アプリケーションはC++で記述する。
- SOA(Service Oriented Architecture)に従って設計する。
- 異なるサービスは並列に処理（Parallel Processing）する
- 既存の仕様に置き換えられる機能を持つ
- SafetyやSecurityの要求に対応できる
- アプリケーションのインクリメンタル開発をサポートする
　（小さなイテレーションでSWを開発できるようになる）
- アジャイルベースのSW開発プロセスをターゲットにしているｚ

今まで自動車関連業務には携わってこなかったのであまり詳しくはないけど、
自動車業界で「アジャイル」が流行ってきてるというのは聞いたことがある。
原因は多分これなのかな・・・？

## Integration of Classic, Adaptive and Non-AUTOSAR ECUs
他のプラットフォーム（CPやNono-AUTOSAR）と共存できる旨の説明。
色々と細かいことを書いてはあるが、結局言いたいことは上記1文だけだったので詳細は省略。
Kotlin/NativeでHelloWorld

# tl;dr
基本的に以下のREADME通り進めばできる
https://github.com/JetBrains/kotlin-native

# Kotlin/Nativeを準備

以下からclone
https://github.com/JetBrains/kotlin-native


```
❯ git clone https://github.com/JetBrains/kotlin-native.git
```
READMEに書いてあることをそのまま実行するだけ

### 依存モジュールをダウンロード
結構時間がかかる

```
./gradlew dependencies:update
```

### コンパイラ・ライブラリビルド

READMEに1時間とあるが、自分のMBPで2時間かかった。。

```
./gradlew bundle
```

### PATHを通す

```
❯ export PATH=./dist/bin:$PATH
```

これで準備完了。

# 実際に使う

### コードを書く
```kotlin:hello.kt
fun main() {
    println("Hello World!")
}
```

### コンパイル
```
❯ kotlinc hello.kt -o hello -opt
```

### 実行
```
❯ ./hello.kexe
Hello World!
```


以上。
ブラウザのフォーカスをTabキーを使って逆移動する方法

Tabキーによって次の項目にフォーカスすることができます。この「進む」に対して、「戻る」をしたい場合は**Shift＋Tabキー**を使います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/284567/a401c65c-5321-9e6b-e3bf-454fc72617a7.gif" width="400">
UnityからiOSのステータスバーを動的にOn/Offする

UnityからiOSのステータスバーを動的にOn/Offしようとしたらそれなりに安全なやり方は一手間必要だった

# iOS 9からprefersStatusBarHiddenをoverrideする方式になった

- objective c - Hide the status bar in ios 9 - Stack Overflow https://stackoverflow.com/questions/32965610/hide-the-status-bar-in-ios-9
- iOS 9からprefersStatusBarHiddenをoverrideする方式になった
- prefersStatusBarHiddenを設定から読むoverride実装があるので参考にする
- FullScreenVideoPlayer.mmを参考にclass_replaceMethodでインスタンスのメソッドをreplaceする

# IOSUtil.cs

Assets/IOSStatusBar/Plugins/iOS/IOSUtil.csあたりに配置

```csharp:IOSUtil.cs
using System.Runtime.InteropServices;

namespace NativeUtil
{
    public static class IOSUtil
    {
#if UNITY_IOS && !UNITY_EDITOR
        [DllImport ("__Internal")]
	    static extern void _setStatusBarEnabled (bool isEnabled);
#endif

        public static void SetStatusBarEnabled(bool isEnabled)
        {
#if UNITY_IOS && !UNITY_EDITOR
            _setStatusBarEnabled(isEnabled);
#endif
        }
    }
}
```

# IOSUtil.mm

Assets/IOSStatusBar/Plugins/iOS/IOSUtil.mmあたりに配置

```objc:IOSUtil.mm
#import <Foundation/Foundation.h>
#include "Unity/ObjCRuntime.h"
#include "UnityAppController.h"

#define UIViewController_preferStatusBarHidden_Enc "B16@0:8"

extern "C"
{
    // ref. FullScreenVideoPlayer.mm
    static bool _isStatusBarHidden = false;
    static bool preferStatusBarHidden_Impl(id self_, SEL _cmd){
        return _isStatusBarHidden;
    }
    
    static bool _isStatusBarInited = false;
    void _setStatusBarEnabled(bool isEnabled)
    {
        NSLog(@"_setStatusBarEnabled %d", isEnabled);
        UIViewController *vc = GetAppController().rootViewController;
        if (!_isStatusBarInited) {
            _isStatusBarHidden = vc.prefersStatusBarHidden;
            class_replaceMethod([vc class], @selector(prefersStatusBarHidden), (IMP)&preferStatusBarHidden_Impl,
                                UIViewController_preferStatusBarHidden_Enc);
            _isStatusBarInited = true;
        }
        _isStatusBarHidden = !isEnabled;
        [vc setNeedsStatusBarAppearanceUpdate];
    }
}
```


#　つかいかた

`IOSUtil.SetStatusBarEnabled(bool);`

# Unityプロジェクト一式

https://github.com/youten/UnityiOSStatusBar に置いた

# License

Unity本体のObj-cなコード参考にしてる部分はたぶん普通のOSSライセンスで含められないのでCC0で放棄
Go言語を真剣に勉強してみた〜Revelでフラッシュメッセージ 等の出し方編〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
今回はRevelを使って、フラッシュメッセージやバリーデーションメッセージの出し方について書いていきます。

Revelを用いると簡単に出力できるので、早速やっていきましょう。
#フラッシュメッセージ
１回限りの通知をユーザに表示するメッセージの事。
##フラッシュメッセージの出し方
###コントローラー
```
c.Flash.Success("フラッシュメッセージの内容")
```
###テンプレート
```
{{ .flash.success }}
```
以上で完了。
##バリデーション
エラー処理のこと。
##バリデーションメッセージの出し方
###コントローラー
```
① c.Validation.Require(変数).Message(出力されるバリデーションメッセージ)

② c.Validation.MaxSize(変数).Message(出力されるバリデーションメッセージ)

③ c.Validation.MinSize(変数).Message(出力されるバリデーションメッセージ)

④ c.Validation.Match(変数, regexp.MustCompile("パターン")).Message(バリデーションメッセージ)
```
① : 必須項目
② : 最大文字数
③ : 最小文字数
④ : 正規表現

```
if c.Validation.HasErrors() {
	c.Validation.Keep()
	c.FlashParams()
	return c.Redirect(リダイレクト先)
}
```
- **Validation.HasErrors()** : コンテキストが空でない場合はtrueを返します。
- **Validation.Keep()** : ValidationErrorsをFlash Cookieにシリアル化するようRevelに指示します。

###テンプレート
```
{{ template "flash.html" . }}
```
##入力したものを残す処理
テキストボックスに入力した値はボタンを押すと消えてしまいます。
なので、テキストボックスに入力したものを記憶して、バリデーション戻りの際には値をテキストボックスに表示する方法を紹介しておきます。→ *ユーザビリティの向上。*
＊通常はセッションを使って行うがRevelを使うとこれも簡単にできる。

テンプレートに以下を記述するとバリデーション戻りの際に値が残っている。

```
{{ with $field := field "~~~~~" . }}
      <input type="text" name="~~~~~" id="~~~~~" value="{{ $field.Flash }}">
{{ end }}
```
以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。
条件付き期待値（確率）の素朴な定義と測度論的定義の関係（2）

<a href="https://qiita.com/Drums80992223/items/bb0be31b06d234683a5c">前回</a>の続きです．設定やNotationなどはそのまま引き継ぎますので，前回の記事をご覧になっていない方は，まずそちらをご覧くださいませ．
# 示したいこと
証明したいのは，
$$ \mathbb{E}[X|W] = \int_\mathbb{R} xf_{X|W}(x|w) \,dx $$
という関係式でした．以下この関係式を示します．

# 証明
条件付き期待値$\mathbb{E}[X|W]$は，その定義により$\sigma[W]$可測なので，あるBorel可測関数$\theta:\mathbb{R}\to\mathbb{R}$があって，
$$ \mathbb{E}[X|W] = \theta(W) $$
と書けています．そこで，この関数$\theta$の具体的な形を以下で求めます．

## Step 1
最初に，すべての有界Borel可測関数$g:\mathbb{R}\to\mathbb{R}$に対して，
$$ \mathbb{E}[X g(W)] = \mathbb{E}[\theta(W)g(W)] $$
が成立することを示しましょう．実際，$g$が定義関数のときは，上式は条件付き期待値の定義に他なりません．また，$g$が階段関数のときも期待値の線形性からO.K.なことが分かります．さらに，極限議論をすれば，結局すべての有界なBorel可測関数$g$に対して上の式が成立することが従います．

## Step 2
次に，Step 1でわかったことを密度関数の言葉で書いてみます．密度関数の定義から，
$$ \int_{\mathbb{R}^2} dx\,dw\, xg(w)f(x,w) = \int_{\mathbb{R}}dw\, \theta(w) g(w) f_W(w). $$
Fubiniの定理からこの左辺は
$$ \int_\mathbb{R} dw\,g(w) \int_{\mathbb{R}}dx\, xf(x,w)  $$
に等しいので，結局，すべての有界可測関数$g$に対して
$$ \int_\mathbb{R} dw\,g(w) \int_{\mathbb{R}}dx\, xf(x,w) =  \int_{\mathbb{R}}dw\, g(w)\theta(w) f_W(w)$$
が成立することになります．よって，変分法の基本補題から，Lebesgue測度についてほとんどすべての$w\in\mathbb{R}$に対して
$$ \int_\mathbb{R} dx\,xf(w, w) = \theta(w) f_W(w) . $$
特に，$f_W(w)>0$なる$w\in\mathbb{R}$に対して
$$ \theta(w) = \int_\mathbb{R} x\frac{f(x,w)}{f_W(w)}= \int_\mathbb{R} x f_{X|W}(x|w). $$
これが欲しい式でしたので，証明おしまいです．
Jupyter、Colaboratoryでパスワードを隠す方法

## はじめに
- JupyterやColaboratoryを他人に見せることを考えるとパスワードやトークンは隠したいですよね

## 良くないケース
- ハードコードやinputを利用する

![Screenshot from 2018-11-11 01-01-15.png](https://qiita-image-store.s3.amazonaws.com/0/3507/dd6fe301-2c55-d7ce-24d6-e47e044daac3.png)

- 普通に見えてしまう

## 良いケース
- getpassを使う

![Screenshot from 2018-11-11 00-30-02.png](https://qiita-image-store.s3.amazonaws.com/0/3507/93614c75-0b6c-869a-1903-72ecc2c47be1.png)

- バッチリですね

## 終わりに
- ファイルから認証情報を読み取っても良いと思います
- 何度も入力するのが面倒であればそちらのほうが良いかも？
WAI-ARIA 再入門。

## はじめに
 WAI-ARIA の読み方を答えられなかったので、 WAI-ARIA を学びなおす。 WAI-ARIA の読み方を答えられなかったそこのあなたも、この記事を読めばバッチリだろう。

## ARIA とは
ARIA とは、スクリーンリーダーのような支援技術に対して、各要素がどのような役割を持つものかを教え、**支援技術が Web ページの内容をより正しく、より詳細に知れるようにする**ものだ。
 ARIA を使うと、支援技術を使っているユーザに **Web ページの適切な情報を伝えることができる**。

ARIA を使う上で必要なのは、ロール、ステート、プロパティの3つだ。
これらについても説明しておく。
## ロールとは

ロールとは、`role`属性を使い、**その要素に役割を与えるもの**だ。
ロールは**不変でなければならない**。どうしても動的にロールを変更したい場合は、ロールを変更したい要素とその子孫要素を削除し、それらを新しい要素に置き換えた上で、改めてロールを付与すると良いだろう。

ロールは 82 種類存在し、これらは以下の 6 つのグループに分類される(括弧内の数値はグループが持つロールの個数)。

- 抽象ロール( 12 個)
- ウィジェットロール( 29 個)
- 文書構造ロール( 26 個)
- ランドマークロール( 8 個)
- ライブ領域ロール( 5 個)
- ウィンドウロール( 2 個)

### 抽象ロール
**すべてのロールを分類し、それらの意味を表す**ために作られたロール。すべてのロールは、例外なく抽象ロールを継承している。
実際に ARIA を使う場面で**抽象ロールを扱うことはない**し、あってはならない。

### ウィジェットロール
**UI の部品を表す**ためのロール。「スタンドアロン・ユーザーインターフェイスウィジェット」という、ひとつの独立した部品を表すロールと、これを複数組み合わせた「複合ユーザーインターフェイスウィジェット」の2つに分類される。部品を動作させる際に JavaScript を使うことが多い。

### 文書構造ロール
**文書構造を表す**ためのロール。これを使うと、要素に対して意味の追加、変更を行うことができ、文書構造を整理するのに役立つ。
意味だけでなく、見た目も変更する場合は CSS を使うことになる。

### ランドマークロール
文書の主要コンテンツや、グローバルナビゲーションなど、 Web ページ上で**ユーザが素早くアクセスしたいであろう領域を表す**ためのロール。

### ライブ領域ロール
**時間により内容や状態が変化する領域を表す**ためのロール。フォーカスの当たっていない要素の更新情報も支援技術に提供できる。

### ウィンドウロール
**Web ページ内でウィンドウとして機能する部品を表す**ためのロール。個人的には、ウィンドウロールのロールは別にウィジェットロールでも良いんじゃないかと思ってしまう(何かわかったら追記する)。

## ステートとは

ステートとは、**`aria-*`属性を使い、要素の状態を定義するもの**だ。そのため、`aria-*`属性の値は動的に変化する。ステートは要素の性質に影響を与えない。

## プロパティとは
プロパティとは、**`aria-*`属性を使い、要素の性質を現すもの**だ。そのため、`aria-*`属性の値は動的に変化する。

## ステートとプロパティの違い
たとえば、ステートでは、「この要素は**折りたたまれているかどうか**」を表す。
一方、プロパティでは、「この要素は**折りたたみ可能かどうか**」を表す。

## 暗黙の ARIA セマンティックス
幾つかの要素には、ユーザエージェントが既にロールやステート、プロパティを付与している。これを**暗黙の ARIA セマンティックス** といい、これと**一致する属性を明示的に設定することは非推奨**となっている。

## おわりに
さて、とりあえず入門としてはこんなところじゃないだろうか。
これで WAI-ARIA の読み方もバッチリ...？
Qiita 記事整理

記事記録

## Linux

* [awkで始めるシェル芸](https://qiita.com/ryuichi1208/items/e07be1996ed4c57b0540)

## C言語

## Python

* [Python スクレイピング/クローリングリファレンス](https://qiita.com/ryuichi1208/items/0f7e4e424d2eff8de1f8)
* [postgres × python (+ heroku)](https://qiita.com/ryuichi1208/items/8a631d6ffc55a03a400b)

## Go

## Perl

## Docker / Kubernetes

* [Docker Registry Hub にイメージをpush](https://qiita.com/ryuichi1208/items/4b2008da074d25faa6ca)
* [docker コマンドリファレンス](https://qiita.com/ryuichi1208/items/0d7bb34a97a9ddbea590)
* [docker-composeでGitBucket](https://qiita.com/ryuichi1208/items/f21d2f8c4bb9c3f1068a)
* [docker ポート番号じゃなくドメインでアクセスしたい](https://qiita.com/ryuichi1208/items/f1b9f5883440b3253543)
* [ubuntuにkubernetesをインストールしてdashboardを表示する方法](https://qiita.com/ryuichi1208/items/ed1a894b8757403031ae)
* [kubernetesのPersistent Volumesをnginxで使ってみた](https://qiita.com/ryuichi1208/items/e1a8b8a7ba4c64f72a7e)
* [macOS で minishift [導入から起動まで]](https://qiita.com/ryuichi1208/items/8df4fc39392d40775e2d)

## ラズパイ

* [raspberry piをファイルサーバー化](https://qiita.com/ryuichi1208/items/4420d40cac451a93228e)
* [【第一回】Raspberry piで並列処理を行う](https://qiita.com/ryuichi1208/items/c78a33d7929389083547)

## その他

* [新卒から2年間で読んだお勧め本Java](https://qiita.com/ryuichi1208/items/ed607d7ea3f4cdc0217c)
* [クラウドサービスについて](https://qiita.com/ryuichi1208/items/f1bc4630a9b3c1970599)
Bootstrapのレスポンシブルを使ってみった

# 初めに
BootstrapはTwitter社が開発したCSSの「フレームワーク」です。
ソースコードが分からなくても、見やすいサイトを簡単に作れるとのことです。
今回はBootstrapのレスポンシブ対応を試してみます。
# レスポンシブ対応とは
閲覧者の画面サイズまたはウェブブラウザに応じてデスクトップウェブページが閲覧できることを目指したウェブデザインの手法。つまり、PCブラウザ、スマートフォンなど、異なる画面でWebサイト表示を柔軟に調整し、最適な表示することが可能です。
# Bootstrap導入
## ホストされたファイルをインターネットから読み込む
HTMLのheadタグに下記のコードを挿入

```
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
```

## col-xs、col-sm、col-md、col-lgの仕組み
Bootstrapは画面の横幅を12等分にしたグリッドを用いて、PCブラウザやスマートフォンなどの異なる画面の表示を調整できます。
具体的には、col-xs、col-sm、col-md、col-lgを用いて各サイズ画面のレイアウトを役に立ちます。
- col-xs:スマートフォン (<768px)
- col-sm:ファブレッ (≥768px)
- col-md:PC (≥992px)
- col-lg:PC (≥1200px)

例えば、

```html

    <div class="row">
        <div class="col-xs-6 col-sm-3">
            <h3>first col</h3>
        </div>
        <div class="col-xs-6 col-sm-3">
            <h3>second col</h3>
        </div>
        <div class="col-xs-6 col-sm-3">
            <h3>third col</h3>
        </div>
        <div class="col-xs-6 col-sm-3">
            <h3>fourth col</h3>
        </div>
    </div>
```

"col-xs-6 col-sm-3"の数字は、画面の横幅を12等分にしたグリッドの数とのことです。
つまり、画面の横幅が<768pxの場合は、横幅の二分の一(6/12)を使うことになる

![767.png](https://qiita-image-store.s3.amazonaws.com/0/255229/60ef977a-7eb6-f134-760a-a738ebbc6e77.png)

画面の横幅が>=768pxの場合は、横幅の四分の一(3/12)を使うことになる
![768.png](https://qiita-image-store.s3.amazonaws.com/0/255229/4e5efc06-8c98-c811-ca51-790b5f39440e.png)


# まとめ
今回はBootstrapのレスポンシブル機能を使ってみった、@mediaと結構似ているイメージがありますが、確かに@mediaより画面を柔軟に調整できます。
Webpacker@Railsとvue-loader(v15)でmanifest.jsonが更新されない

表題の通りの件ですが、結局対応策が見つからずvue-loaderをv14にバージョン下げて対応しました。

## 現象
environment.jsなどの設定を正しく行っても(デフォ設定でも)manifest.jsonが作られない。
vue-loader(v15)を入れている時点でダメだった。

## 参考文献
- [webpackとvue-loader v15ではまって解決した](https://totechite.hatenablog.com/entry/2018/05/18/013825)
    - 実施したがダメだった。
- [[Vue.js]vue-loaderのバージョンを上げすぎてエラーが出た話](https://qiita.com/tosite0345/items/2b153049805190fc5d15)
    - これを見て、バージョン下げる決断に至った。
MacでApacheを立ち上げてみる

#0. 経緯
MacでローカルのWebサーバが使いたかったので調べながらやってみたのですが、ちょっと悩んだので自分なりにまとめてみました。

#1. 環境情報
・macOS Mojave 10.14.1

```terminal:terminal
$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.14.1
```

・Apache/2.4.34

```terminal:terminal
$ httpd -v
Server version: Apache/2.4.34 (Unix)
Server built:   Aug 17 2018 16:29:43
```

MacにはApacheが標準インストールされているみたいです。

#2. Apacheを起動してみる

とりあえず、Apachを起動してみましょう。

```terminal:terminal
$ sudo apachectl start
```

ブラウザで`http://localhost/`にアクセスしてみて「It works!」と表示されれば起動成功です！
`/Library/WebServer/Documents/index.html.en`が表示されているらしいです。

ちなみに停止するなら`$ sudo apachectl stop`
再起動するなら`$ sudo apachectl restart`です。

#3. ユーザディレクトリの有効化
`/Library/WebServer/Documents/index.html.en`を編集するにはroot権限が必要なので普段使いするにはあまり適していません。ログインした一般ユーザのホームディレクトリ配下のファイルにアクセスできるようにします。

まず、`httpd.conf`を編集します。

```terminal:terminal
$ sudo vi /etc/apache2/httpd.conf
```

```conf:/etc/apache2/httpd.conf（編集前）
#（前略）
#LoadModule userdir_module libexec/apache2/mod_userdir.so
#（中略）
# User home directories
#Include /private/etc/apache2/extra/httpd-userdir.conf
#（後略）
```

該当2行を有効化します。コメント`#`を消すと有効化できます。

```conf:/etc/apache2/httpd.conf（編集後）
#（前略）
LoadModule userdir_module libexec/apache2/mod_userdir.so
#（中略）
# User home directories
Include /private/etc/apache2/extra/httpd-userdir.conf
#（後略）
```

続いて、`httpd-userdir.conf`を編集します。

```terminal:terminal
$ sudo vi /etc/apache2/extra/httpd-userdir.conf
```

```conf:/etc/apache2/extra/httpd-userdir.conf（編集前）
#（前略）
#Include /private/etc/apache2/users/*.conf
#（後略）
```

該当1行を有効化します。コメント`#`を消すと有効化できます。

```conf:/etc/apache2/extra/httpd-userdir.conf（編集後）
#（前略）
Include /private/etc/apache2/users/*.conf
#（後略）
```

それから、`[ユーザ名].conf`を編集（作成）します。`[ユーザ名]`はログインユーザ名に置き換えてください。

```terminal:terminal
$ sudo vi /etc/apache2/users/[ユーザ名].conf
```

```conf:/etc/apache2/users/[ユーザ名].conf
<Directory "/Users/[ユーザ名]/Sites/">
AllowOverride All
Options Indexes MultiViews
Options +FollowSymLinks
Require all granted
</Directory>
```

#4. htmlファイルを作成してブラウザからアクセスしてみる

`index.html`を作成しましょう。その前にディレクトリを作ります。

```terminal:terminal
$ mkdir ~/Sites
$ vi ~/Sites/index.html
```

```html:~/Sites/index.html
<html><body><h1>Hello World!</h1></body></html>
```

Apachを再起動しましょう。

```terminal:terminal
$ sudo apachectl restart
```

ブラウザで`http://localhost/~[ユーザ名]/`にアクセスしてみて「Hello World!」と表示されれば成功です！

##【補足メモ】

`/etc`は`/private/etc`のシンボリックリンクでした。

```terminal:terminal
$ ls -l /etc
(中略) /etc -> private/etc
```

また、`vi`コマンドは`vim`コマンドのシンボリックリンクになっていました。

```terminal:terminal
$ ls -l $(which vi)
(中略) /usr/bin/vi -> vim
```

##【参考サイト】

▼Macでローカルサーバー構築あれこれ
https://qiita.com/YuukiWatanabe/items/f89fe047ace61d2d2b45

▼Macでローカルサーバを立ち上げる方法
http://qiita.com/shuntaro_tamura/items/bdabcb77926dc92617b1

▼MacでのApache起動について
https://qiita.com/macoto/items/08159691170c64f05f7a
First post

# Hello Qiita
I'm software engineer.

## My purpose
- Power up
- Fulfill curiosity
- To kill time
- Proof of ability

### Power up
1. Ability to write sentences
2. Knowledge in each field
3. Ability to tell people
4. Ability to investigate technology
5. Grouping things

### Fulfill curiosity
**Qiita is**

- [x] Many people community
- [x] Know the trend
- [x] Easy to understand
- [x] Can compare with others' ability

### To kill time
*Life is long*
*Life is short*
~~Silly~~
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315085/f4a2796e-99f8-446f-497e-8e391efa355f.png)

### Proof of ability
```c#
var isHero = true;
if(isHero)
    return "Guess who's back.";
````
SpriteKit学習のメモ(アクションの設定)

#アクションを用いてスプライトに動きをつける
##アクション(SKAction)とは？
ノード（Node）に動きをつけたい場合に、アクションを使う。アクションは、アクションを適用したノードの位置や回転、スケールなどといったプロパティを段階的に変化させることで実現している。
##基本的な使い方
１、**メソッドを使ってSKActionのインスタンスを生成する**
２、**アニメーションさせたいSKNodeのrunActionメソッドに、SKActionのインスタンスを渡す**
**(ex)基本的な使い方↓**

```swift:Sample.swift
// sample.pngイメージを生成
var player = SKSpriteNode(imageNamed: "sample")

// １秒かけてサイズを２倍にするSKActionを生成
let act = SKAction.scale(to: 2.0, duration:1.0)

// 対象ノードに渡して実行
player.runAction(act)

```
SKActionクラスには、**「動きをつけるメソッド」「効果をつけるメソッド」「拡大・縮小を行うメソッド」「透過を行うメソッド」「順序制御を行うメソッド」**などもある。
　これらのサンプルをもとに、宇宙船からレーザー光線が発射されるアクションを実装↓

```swift:GameScene.swift
  override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        // タッチ終了後に定数missileでheroからのみレーザー光線を宣言
        let laser = SKSpriteNode(imageNamed: "laserBlue01")
        laser.name = "laser"
        laser.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "laserBlue01"), size: laser.size)
        laser.physicsBody?.affectedByGravity = false
        laser.physicsBody?.categoryBitMask = 4
        laser.physicsBody?.collisionBitMask = 2
        laser.physicsBody?.contactTestBitMask = 1
        laser.position = CGPoint(x: self.hero.position.x, y: self.hero.position.y + 50)
        self.addChild(laser)
        // SKActionクラスを用いてアクションを作成
        let moveToTop = SKAction.moveTo(y: frame.height + 10, duration: 0.3)
        // SKActionクラスを用いてアクションを取りやめるアクションを作成
        let remove = SKAction.removeFromParent()
        // ２つのアクションを交互に呼び出すことでレーザー光線をうったり、やめたりすることが可能になる
        laser.run(SKAction.sequence([moveToTop, remove]))
    }
```
「**タッチが終了した時点でレーザー光線が発射できる**」を実装したいため、**touchesEndedメソッド**内に記述する。

詳しい説明は、また後日記載します。