OmniAICreator/Qiita-1.07M huggingface dataset:
IntelliJ IDEA 備忘録



# ショートカット
### Edit
* `Ctrl+Shift+Z`でRedo

* `Ctrl+Shift+F`: プロジェクト内のファイルを検索できる（Find in Path）

### View
* `Ctrhl+Shift+S`: Sbt Shell(Tool Window)

* `Ctrl+Shift+F12` : ツールウィンドウをすべて非表示にして、エディタウィンドウのみを表示する（Enter Distraction Free Mode. )

* Enter Presentation Mode. コードを見せるときに便利。




### Navigate
* `Ctrl+Alt+H`：Call Hieralchy（呼び出し元の確認）

* `Ctrl+H` : 型の構造（Navigate to type hierarchy）

* `Ctrl+Shift+T`でテストとテストサブジェクトの間を移動できる。  https://pleiades.io/help/idea/navigating-between-test-and-test-subject.html

* `Ctlr+Shift+M`で対応する括弧に移動できる(Move Caret to Matching Brace)。
https://pleiades.io/help/idea/navigating-to-braces.html

* `Ctrl+N`: クラス検索（Navigate to class）

* `Ctrl+Shift+N` : ファイル検索（Navigate to file）

* `Ctrl+E` : 最近のファイルを検索（Recent files）

* `Ctrl+G` : 指定した行数に移動（Navigating to Line）

### Code
* `Ctrl+Alt+O`で最適なインポート文に変更してくれる（Optimize Imports）


### Quick pop-ups

* `Ctrl+Q` : ScalaDocを閲覧（Documentation）

* `Ctrl+Shift+Q` : Implicit conversions

* `Ctrl+Shift+P` : Implicit parameters

* `Ctrl+Shift+I` : Quick Defenition（メソッドの定義を確認）

### Help
* `Ctrl+Shift+A` : Find Action

### その他
* `Shift+Escape` : ツールウィンドウを非表示にする

* `Alt+Right`, `Alt+Left` : タブ切り替え（Navigate between opened tabs）

* メソッド引数部分で`Ctrl+P`：パラメタ情報を表示

* 矩形選択：`Alt`を押しながら or マウスの中央ボタンを押しながら選択（Ubuntuで`Alt`を押しながらドラッグすると、ウィンドウが移動してしまう）

* 
### Project View
* Auto Scroll to Source: 開いているファイルが、プロジェクトツリービューに表示される



# Scala関係

https://www.jetbrains.com/help/idea/discover-intellij-idea-for-scala.html
https://www.jetbrains.com/help/idea/run-debug-and-test-scala.html

### プロキシ環境でのIntelliJ IDEA with SBT
設定箇所が多いです。
[プロキシ環境でのIntelliJ IDEA with SBT](http://jetbeaver.hatenablog.com/entry/2016/05/24/220048)


### `libraryDependencies`が反映されない
`build.sbt`に`libraryDependencies`を書いたけど、そのライブラリが使えない場合
⇒[Refresh Project]を実行
https://stackoverflow.com/questions/41372978/unknown-artifact-not-resolved-or-indexed-error-for-scalatest

### sbt shellで日本語が文字化けしてしまう
`idea.exe.vmoptions`, `idea64.exe.vmoptions`設定ファイルに`-Dfile.encoding=UTF-8`を記述する。

https://syobochim.hatenablog.com/entry/2014/05/11/145757 参照


# Gradle関係

### プロジェクト生成時に`src/main`フォルダが生成されない。
Gradleの設定で、"Create directories for empty content roots"チェックをONにすると、`src/main`フォルダが自動的に生成されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/37903/20ec085d-65f0-3d44-9fa2-327baec72d44.png)

# その他

### ツールチップのコピー
`Alt+左クリック`でできます。 
https://teratail.com/questions/118916


# Setting

### 改行コード（Line Separators）の設定
https://www.jetbrains.com/help/idea/configuring-line-endings-and-line-separators.html

### コードの折り畳み（Code Folding）の設定
https://pleiades.io/help/idea/code-folding-settings.html

### [WIP] 保存していたGitのパスワードを変える
https://stackoverflow.com/questions/28142361/change-remote-repository-credentials-authentication-on-intellij-idea-14

### [WIP] 保存していたGitのパスワードを変える
https://stackoverflow.com/questions/12278663/remove-all-breakpoints-in-intellij-idea

### typoのWarningを解除するため、単語を定義する
https://www.jetbrains.com/help/idea/spelling.html

# プラグイン
* CamelCase：キャメルケース、スネークケースをショートカットキーで変更可能
    - https://plugins.jetbrains.com/plugin/7160-camelcase
    - `Shfit+Alt+U`で切り替え
riot.js tag間の連携

### callerを登録して解決する。
reactは双方向だが、vueやriotは片方向なので、全体を横通しにするモジュールが必要。

```js
bell.add('xyz',(obj)=>{this.obj=obj; this.update()})
bell.call('xyz',obj);
```
```js
;(function(root){
var o={bells:{}}
o.add=async function(name,caller){return o.bells[name]=caller}
o.call=async function(name,obj){return (o.bells[name])?o.bells[name](obj):null}
root.bell=o
})(this)
;
```

### 全部
```html
<script src="https://gnjo.github.io/riot.js"></script>
<count></count>
<loop></loop>
```
```js
;(function(root){
var o={bells:{}}
o.add=async function(name,caller){return o.bells[name]=caller}
o.call=async function(name,obj){return (o.bells[name])?o.bells[name](obj):null}
root.bell=o
})(this)
;
riot.tag(`count`
,'<progress max={max} value={value} title={value}></progress>'
,'progress{position:fixed;top:0;left:0;width:50rem}'         
,function(opt){
 let self=this; max=30;value=0;
 //self mean... escape the strong bind
 bell.add('countnew',function(d){ value=d; self.update()})
})
riot.mount('count')
;
riot.tag(`loop`
,`<ul>
<li onclick={click}>+</li>
<li each="{item in items}">{item}</li>
<li onclick={del}>-</li>
</ul>`
,function(opt){
 items=[0]
 click=function(ev){
  items.splice(items.length,0,items.length)
  bell.call('countnew',items.length)
 }
 del=function(ev){
  items.splice(-1,1)
  bell.call('countnew',items.length)
 }
})
riot.mount('loop')
;
```
Rubyで単純なtailを書いてみた

Qiita初投稿〜:v:


Rubyの勉強の為に、単純な`tail`をRubyで書いてみた。

### プログラム

```ruby:tail.rb
def tail(lineNo, fileName)
    File.open(fileName) do |file|
        lines = file.readlines
        lines.drop(lines.size - lineNo).each do |line|
            puts line
        end
    end
end

tail(ARGV[0].to_i, ARGV[1])
```

File.readlinesでファイルの内容を全行読み込んで、
Enumerable.dropを使って最終行から指定した行までの配列を作ってる。



### 実行結果

```sh
$ ruby tail.rb 5 ChangeLog
indent-tabs-mode: t
tab-width: 8
change-log-indent-text: 2
end:
vim: tabstop=8 shiftwidth=2
```


### 環境情報

#### Ruby
```sh
$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-darwin17.4.0]
```

#### Mac OS X
```sh
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.3
BuildVersion:   17D102
```
ｍｉｃｒｏ：ｂｉｔも始めよう！

日本Androidの会秋葉原支部ロボット部　関　昌充（Ｐ酒）
(この文書のライセンスはCC BY-NC 4.0です)
# Ｗｈｙ？　ｍｉｃｒｏ：ｂｉｔ

前回、前々回とＰＩＣＡＸＥについての簡単な記事を書いたのですが、今回は前から気になっていたｍｉｃｒｏ：ｂｉｔについて紹介させていただきます。

## 本体とＰＣ等の開発環境があれば色々できる。

[]( scale=0.5 )![1000000000000332000002CB48E71C1EB642230C.png](https://qiita-image-store.s3.amazonaws.com/0/195351/60120ad1-865d-3874-c560-e40ee7ddbfe7.png)

[]( scale=0.5 )![10000000000002EB0000025F1C4E0D1BBB31EA47.png](https://qiita-image-store.s3.amazonaws.com/0/195351/1158b487-c9b8-a714-30d6-3cf60bbc27d8.png)


ＡｒｄｕｉｎｏやＰＩＣＡＸＥで何かしようとすると、本体以外にＬＥＤ、スイッチ、センサー等の部品を買ってきて接続して、という流れになりますが、ｍｉｃｒｏ：ｂｉｔの場合は、標準で、ＬＥＤアレイ、スイッチ、タッチセンサー（端子）、温度センサー、加速度センサー等が入っていますので、本体と開発環境があれば色々試せます。



## Ｗｅｂベースの開発環境（JavaScriptブロックエディター）でブロックプログラミングができる。

[]( scale=0.5 )![10000000000003580000029627CD3CCFB8D7E1F4.png](https://qiita-image-store.s3.amazonaws.com/0/195351/f07faaee-e685-0f47-8c75-c663f2fce607.png)


これは「ＡｒｄｕＢｌｏｃｋ」を入れたＡｒｄｕｉｎｏＩＤＥや、ＰＩＣＡＸＥ　Ｅｄｉｔｏｒ等でもできます。違いは、ボタン１つでブロックとＪａｖａＳｃｒｉｐｔを相互に切り替えできる点でしょうか？
（ＡｒｄｕｉｎｏＩＤＥではコードに変換してからコンパイルするのでコードを見ることができますし、ＰＩＣＡＸＥ　ＥｄｉｔｏｒでもブロックをＢａｓｉｃのコードに変換することはできます。［逆は不可］）


[]( scale=0.5 )![100000000000035700000297B96D54485D4262CE.png](https://qiita-image-store.s3.amazonaws.com/0/195351/cc8c6265-67a5-4ccf-7f61-dd5cb0db019d.png)

ただ、Ｗｅｂベースということもあり、動作がやや遅と思います。
Ｗｅｂベースにしたのは．．．ユーザエクスペリエンスの収集目的なのかなぁ？バージョン管理の煩わしさ回避なのかなぁ？

## 本体なしでもシミュレーションができる。
これはＰＩＣＡＸＥ　Ｅｄｉｔｏｒ等でもできるのですが、チップレベルのシミュレーションなので、外付けのＬＥＤやセンサー等を含めたシミュレーションはできません。
ｍｉｃｒｏ：ｂｉｔの方は、ハードウェアの仕様が統一されているため、センサー等も含めたシミュレーションができるのだと思います。

## スマホ（だけ）でも開発できる。

ＢＬＥ対応のＡｎｄｒｏｉｄかｉＰｈｏｎｅである必要がありますが、残念ながら筆者のＡｎｄｒｏｉｄタブレットはＢＬＥに対応していないため動作確認はしていません。


# ｍｉｃｒｏ：ｂｉｔを始めるために（最低限）必要なもの

## ｍｉｃｒｏ：ｂｉｔ本体

開発環境（JavaScriptブロックエディター）があればシミュレーションもできるので、本体が無くてもプログラミングはできるのですが、やはり実機で動かしたいですよね。

## 開発環境

###JavaScriptブロックエディター
　　　　https://makecode.microbit.org/#lang=ja
Mac，Windows PC，Chromebook，Linux　で使えるようです。
エディターで作成したプログラム（ｈｅｘファイル）をｍｉｃｒｏ：ｂｉｔにダウンロードする際には、ｍｉｃｒｏ：ｂｉｔをＵＳＢケーブルでＰＣ等に接続し、ドライブとして表示されるｍｉｃｒｏ：ｂｉｔにｈｅｘファイルを「送り」、書き込みが終了すると実行されます。
前のプログラムは消えます。
初期設定に戻すには、以下のｈｅｘファイルとのこと。

https://twsu-production.s3.amazonaws.com/files/BBC-MicroBit-First-Experience-1460979530935.hex

###Pythonエディター
　　　http://python.microbit.org
こちらもＷｅｂベースなので同様に使えるのではないかと思います。

###スマホアプリ
BLEに対応していれば、開発したプログラムをBLE経由でｍｉｃｒｏ：ｂｉｔにダウンロードできます。
　　　https://play.google.com/store/apps/details?id=com.samsung.microbit
　　　https://itunes.apple.com/gb/app/micro-bit/id1092687276?mt=8


# 拡張するには

##コネクタ
上述のように、ｍｉｃｒｏ：ｂｉｔは、スイッチやＬＥＤアレイ等を備えていますが、他のセンサーもつなぎたい、ＬＥＤ等も拡張したい、というようなときには、コネクタで信号を引き出します。端子の形が変わっているので、特殊なコネクタ？と思いきや、普通のカードエッジコネクタのようです。使っている端子だけ引き出せばいいんですね。
[]( scale=0.3 )![10000000000002D1000003E36C39E69AA6F142B5.png](https://qiita-image-store.s3.amazonaws.com/0/195351/0033bc84-d90b-9f91-9ff9-666901408d51.png)

　

##テスター（ほぼ必須）
前回のＰＩＣＡＸＥの記事でも紹介しましたが、コネクタで外部にセンサー等を接続する際には、配線チェックを充分に行った方がいいです。下手をするとＰＣやｍｉｃｒｏ：ｂｉｔ本体を壊します。

##オシロスコープかＯＳＣ
これもＰＩＣＡＸＥの記事でも紹介しましたが、信号を見るのにあると便利です。


# 次回予告

## コネクタの改造
上の写真だと解りづらいのですが、基板の下にヘッダピンを付けて直接ブレッドボードに挿そうとすると、左側の３列分のパターンが邪魔になります。切っちゃえ！と思ったのですが、裏の配線パターンを見ると微妙な位置に信号線？がありました。次回はその辺りに触れたいと思います。

## Ｉ２Ｃデバイス
これは前回のＰＩＣＡＸＥの記事の最後でも予告していたのですが、諸般の事情により実現できませんでしたので、是非次回。
IDEAで Scala Play プロジェクトを作ってHelloWorld

# 環境
- OSX HighSierra
- Java8インストール済
- Intellij IDEA Ultimate 2018.1

# Scalaとsbtインストール
```
brew install scala
brew install sbt
```

# IDEAプロジェクト作成
まずIDEAにScalaプラグインを入れる。
その後`create project`から`Scala`の`Play2.X`を選択しプロジェクト作成。

# (クソ長い)ビルド
初期設定は済んだ状態なので早速ビルド。右上の下矢印ボタンを押す。
かなり長いビルドが始まる。
僕の場合は20分かかった。

![スクリーンショット 2018-04-09 23.58.40.png](https://qiita-image-store.s3.amazonaws.com/0/176237/99ce8b7f-4889-db3b-4139-123110d6d58e.png)

風呂入って出てまだビルドしてたので何かの間違いかと思ったがScalaの初回ビルドはそんなものらしい。
右上の再生ボタンを押すとローカルサーバーが起動する。
`localhost:9000`アクセスで`Welcome to Play`画面を拝める。

# 参考
https://qiita.com/zaramme/items/af3c92075f1259410c25
Petalinux imagesフォルダ内ファイルについて理解を深めよう

Petalinuxを使用する上で、imageフォルダ内のファイルの意味を曖昧な理解しかしてなかったので、一度勉強することにしました。


# Petalinux Imageファイル内容

+ zynq_fsbl.elf
Petalinuxで作ったFSBL。Petalinux以外ではXilinx SDKで作成する。

+ （name）.bit
HDFファイル内のビットストリームファイル　

+ u-boot.elf
Linuxブート用のブートローダー

+ u-boot.bin
U-Boot本体のRAWバイナリ。
U-Bootが何してるか理解できてないので後日まとめよう

+ vmlinux
elfのオブジェクトファイル。
zImageを圧縮する前のカーネルイメージ

+ zImage
gz圧縮されたカーネルイメージファイル。という説明が多いですがそれは少し違うようです。
vmlinuxからシンボル情報が欠落しているので、zImageからvmlinuxに逆変換することはできないみたい。

+ rootfs.cpio
cpio形式でアーカイブされたルートファイルシステムのイメージファイル

+ rootfs.cpio.gz
圧縮されたルートファイルシステム。

+ system.dtb
デバイスツリーファイル

+ image.ub
カーネルイメージとデバイスツリーをまとめたファイル
　　
ただのメモでした

#参考ページ
[おべんきょうブログ](http://mako-limone.blogspot.jp/2009/10/kernel.html)
[vmlinuxとzImageの関係](http://blog.kmckk.com/archives/2257939.html)
[技術/Linux/手作りLinuxシステム/04. Boot from CD (kernel-2.6.x)](https://www.glamenv-septzen.net/view/953)
[7.5 Device Tree Blob (Flat Device Tree)](http://www.informit.com/articles/article.aspx?p=1647051&seqNum=5)
Admin以下のviewファイルでmethod: :delete出来ない件について。

# 原因

admin以下のviewファイルで `rails-ujs` を読み込めていなかった。

```application.js
...
//= require rails-ujs
...

```

# 解決

```controllers/admin/application_controller.rb
class Admin::ApplicationController < ActionController::Base
  # ↓追記
  layout 'application'
end

```

# 解説

`rails-ujs` を読み込むよう書いてある `application.html.erb` (rails new時に作成済)を、
admin下viewファイルのレイアウトに指定する。

```views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>AppName</title>
    <%= csrf_meta_tags %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```
Mastodonでクトゥルフ神話な発狂プレイを楽しめるgemを作ってみた

#はじめに

[前回の記事](https://qiita.com/S_H_/items/fb285710e8073f9714bb)で不穏な単語を「にゃーん」と変換するものを作ったりしましたが、今回は逆にクトゥルフ神話な発狂プレイが楽しめるようにしてみました。

#作ったもの

[RubyGems](https://rubygems.org/gems/mastodon_cthulhu)

なお、ソースは[こちら](https://github.com/S-H-GAMELINKS/MastodonCthulhu)

#導入方法

[前回の記事](https://qiita.com/S_H_/items/fb285710e8073f9714bb)とほぼ同様。

Mastodon のGemfileに以下のように追加

```
gem 'mastodon_cthulhu', '~> 0.1.1'
```

その後、config/initializers内にmastodon_cthulhu.rbを作成します。

```ruby:mastodon_cthulhu.rb
MastodonCthulhu.setup do |status|	
  	
　# クトゥルフ神話機能	
  fortune = MastodonCthulhu::Random.new('[ 　\n]?#(クトゥルフ神話)[ 　\n]?', %w(いあいあくとぅるぅ いあいあはすたぁ いあいあつとぅぁぐぁ ふんぐるいむぐるうなふ うがふなぐる ふたぐん))
  status = fortune.convert(status) if fortune.match(status)	

end
```

インストールはこれで終了です。

#クトゥルフ神話 というハッシュタグを追加してつぶやくだけで、クトゥルフ神話ごっこが楽しめます。

#参考資料

[mastodon_command](https://github.com/kenchiki/mastodon_command)

制作にあたって参考(おおよそそのまま使ったとも言う)にさせていただきました。
誠にありがとうございます。

#終わりに

楽しいクトゥルフ神話なMastodonライフをこれで過ごせますね！
いあ！いあ！はすたぁ！！！
【Ruby】DaemonSpawn小さなサンプルメモ

# インストール

```
$ gem install daemon-spawn
```

# サンプルメモ

```ruby
require 'daemon_spawn'

class MyDeamon < DaemonSpawn::Base
  def start(args)
    p "start"
    sleep(5)
    p "start end"
  end

  def stop
    p "stop"
  end
end

MyDeamon.spawn!({
    :working_dir => "./",
    :pid_file => "./pid.log",
    :log_file => "./daemon.log"
                })

```

# 実行
```sh
% ruby deamon.rb start
MyDeamon started.
% cat pid.log 
21928
% cat daemon.log 
"start"
"start end"
```

# 参考
Rubyのdaemonを手軽に作る - ぱろっと・すたじお http://parrot.hatenadiary.jp/entry/20110804/1312448036
UnityのRawImageのテクスチャサイズをスクリプトから変更する方法

UnityでのRaw Imageのテクスチャサイズ変更についてです
#Inspectorから行う方法
Canvasのなかにある、変更したいRaw Imageを選択
InspectorのRaw Image(Script)のなかにある、UV Rectを見る
XYでテクスチャの端点を決められ、WHでテクスチャサイズを変更できる

#スクリプトから行う方法

```c#:RawImage.cs
using UnityEngine.UI;
private GameObject rawImage;

void Start(){
  rawImage=GameObject.Find("___");
}

void ChangeRawImageSize(){
  rawImage.GetComponent<RawImage>().texture = "___";
  rawImage.GetComponent<RawImage>().uvRect=new Rect(x,y,w,h);
//xはインスペクタ上のUV RectのXです、y,w,hも以下同文
}
```
Kindleで間違った購入した商品をキャンセルした話

## 概要

Amazonで本を購入したのですがKindle (Paperwhite)には対応しておらず、どうしよーって思ってたら迅速なご対応で返金処理をしていただきました。というお話です。(ただのアホ)

## ほったん

普通に本を購入したら　「この端末には対応しておりません」の文字が。。よく見るとAmazon上でも配信先がKindleではないところに設定されていました。

#### 普通(?)の本

<img width="280" alt="スクリーンショット_2018-04-09_23_09_31.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/2e75f771-598e-8ccd-2b05-279b3ceeb5c4.png">

#### 今回の本

<img width="286" alt="スクリーンショット_2018-04-09_23_08_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/6d8c28e8-0bae-dc50-9c14-237116e38e76.png">

#### 解決までの流れ..

まじかよっ！！と思い、さっそく「kindle 購入 キャンセル」と調べました。すると、以下のサイトがヒット。

[Amazon.co.jp ヘルプ: Kindle本を返品する](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201252620)

> Kindleストアでご購入いただいたKindle本は、購入間違いなどの場合、注文日から7日以内に限りAmazonの裁量にて返金を承っております。
> 
> Kindleストアでご購入いただいたKindle本については、購入間違いなどの場合、注文日から7日以内に限りAmazonの裁量にて返金を承っております。返金をご希望の場合は、カスタマーサービスにご連絡ください。

なるほど！ではカスタマーサービスで問い合わせよう。

「Amazon カスタマーサービス」で検索。

[Amazon.co.jp ヘルプ: お問い合わせ方法](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=202003590)

このページ内にある、以下のボタンをタップ。

<img width="571" alt="スクリーンショット 2018-04-09 23.14.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/a6dcb30b-647a-73d4-836b-dd4d009ee0d8.png">

すると、先程購入した本が出てきました！
「お問い合わせ内容について」の内容を選択します。

<img width="973" alt="スクリーンショット_2018-04-09_23_15_40.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/a128a1a8-060d-6936-9cbf-9c4b04db4e79.png">


すると、3通りのサポートが受けられるみたいです。

<img width="972" alt="スクリーンショット 2018-04-09 23.15.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/17e0f654-fc65-a1dc-281c-6c38eb733c0c.png">

今回はチャットをサポートしました。以下、サポートの内容です。お問い合わせ内容の間抜けさ...笑

```
お問い合わせ内容： Kindleで読もうと思い、購入したのですが未対応を見逃しており返品を希望します。
<サ>(Amazon): 大変お待たせいたしました。お問い合わせいただきありがとうございます。Amazonカスタマーサービスの<サ>でございます。 
amazon.co.jpのアカウントにご登録のお名前をお願いします。
RINDO: 「[名前]」で登録しています。
<サ>: ご協力ありがとうございます。アカウントの確認をいたしました。
<サ>: 本日ご注文いただきました『[Kindle商品名]』を誤って購入したため、返金をご希望でよろしいですか？
RINDO: はい、間違いありません。
<サ>: かしこまりました。ただいま手続きをいたします。少々お待ちください。
RINDO: お手数おかけしてしまい申し訳ありません。よろしくお願い致します。
<サ>: とんでもないです。もう少々お待ちくださいませ。
RINDO: はい。よろしくお願いします。
<サ>: 大変お待たせいたしました。

商品名：『[Kindle商品名]』
注文番号：XXX-0000000-1111111

上記ご注文の商品代金2,160円を全額返金するよう手配いたしました。
<サ>: 返金手続きが完了するまでには通常2-3日かかります。返金手続きが完了しだい、Eメールをお送りしますので、いましばらくお待ちください。
なお、返金完了後は、アカウントサービスの注文履歴にある「注文の詳細」リンクをクリックしていただくと、「払い戻し」の項目で返金をご確認いただけます。 
RINDO: ありがとうございます。
<サ>: お時間いただき、ありがとうございます。他にご不明な点はありますか？
RINDO: ありません。迅速なご対応、ありがとうございました。
<サ>: とんでもないです。温かいお言葉ありがとうございます。
<サ>: それではこのままウィンドウを閉じて、チャットを終了してください。
Amazon.co.jpをご利用いただき、ありがとうございました。
RINDO: ありがとうございました。
```

### ちなみに...

自分は焦ってウィンドウすぐ閉じてしまいましたが、購入直後であれば「注文をキャンセル」からキャンセルできます。 (↓返金処理後、対応版を購入しました笑)

<img width="1010" alt="スクリーンショット_2018-04-09_23_33_24.png" src="https://qiita-image-store.s3.amazonaws.com/0/29844/43419674-0c38-59d9-8820-e4948034cc4d.png">


## まとめ

結果的に、間違えて購入してしまいましたが爆速でキャンセル & 返金処理までしていただけました。担当者様、迅速なご対応ありがとうございました！！！
ServiceNowでiTunesのRestAPIを使用する(中編）

# 上編のおさらい
[上編](https://qiita.com/sukkyxp/items/18f950231d73d329fc04)では、OutBound IntegrationsのREST Messageを作成し、iTunes Search APIを起動するテストまで実施している。今回は、上編で作成したREST MessageをUI Pageのサーバーサイドスクリプト(Processing Script)から起動して、画面から入力したキーワードの検索結果を表示する画面を作成する。

# （１）早速画面の作成
Studioの「File」「Create File」で表示される画面で、Form & UIカテゴリーの「UI Page」を選択してCreateをクリック。
UI Pageの設定画面が表示されるので、Nameに「iTunesSearchPage」を入力する。

# （２）HTMLの入力
（１）で作成したUI PAGEのHTMLに次の通り入力する。

```html:html
<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"></link>
	
		<g:ui_form>
  <div class="form-group">
    <label for="searchWord">検索ワード</label>
	  <input type="text" class="form-control" name="searchWord" placeholder="検索ワード" value="${searchWord}"></input>
  </div>


			<button type="btn" class="btn btn-primary" name="search" value="search" >検索</button>

		</g:ui_form>
		<div class="container">
			<div class="table-responsive">
           <table class="table table-striped table-bordered table-hover"> 検索結果
			   <tr><th>#</th><th>ジャケット</th><th>曲名</th></tr>
             <j:forEach items="${parsed.results}" var="jvar_item" indexVar="i">
				<g:evaluate jelly="true" object="true">
					var trackName = jelly.jvar_item.trackName;
					var jacketUrl = jelly.jvar_item.artworkUrl60;
					var idx = jelly.i + 1 + '';
				</g:evaluate>
				 <tr>
					 <td>${idx}</td>
					 <td><img src="${jacketUrl}" /></td>
					 <td>${trackName}</td>
				 </tr>
             </j:forEach>
            </table> 
			</div>
	</div>
</j:jelly>
```

# （３）サーバーサイドスクリプトを入力する。
（１）で作成したUI PageのProcess Scriptに次の通り入力する。
なお、ここで入力したREST Messageの起動部分のソースは１から入力したのではなく、REST Messageの設定画面の「Preview Script Usage」をクリックして表示したソースを貼り付けてから加工している。

```javascript:ProcessingScript
try { 
	var r = new sn_ws.RESTMessageV2('x_58872_needit.iTunesSearch', 'Default GET');

	var searchWord = searchWord;
	gs.info('searchWord = ' + searchWord);
	r.setStringParameterNoEscape('term', searchWord);
	r.setStringParameterNoEscape('country', 'jp');
	r.setStringParameterNoEscape('lang', 'ja_jp');
	r.setStringParameterNoEscape('media', 'music');
	r.setStringParameterNoEscape('attribute', 'artistTerm');
　
	var response = r.execute();
	var responseBody = response.getBody();
	var httpStatus = response.getStatusCode();

	var parser = new global.JSON();
	var parsed = parser.decode(responseBody);


}
catch(ex) {
 var message = ex.getMessage();
}
```

# 実行用にNavigatorを作成し実行
（１）で作成したUI Pageを起動するためのNavigatorを作成し、起動して動作確認を実施する。

![iTunesSearchResult2.png](https://qiita-image-store.s3.amazonaws.com/0/197947/e6b08a1e-a1f8-a1f5-cfa7-e5647ad8f808.png)



# ソースコードの解説

ソースコードの解説は次回の[下編](https://qiita.com/sukkyxp/items/9f6fb732e70eaed969f5)で実施する。

# さいごに
iTunes Search APIのレスポンスの検索結果は１回の処理でデフォルトで50件までとなっている。ここに記載したサーバースクリプトではレスポンスが正常以外の場合(http status codeが200以外の場合）の処理を記載していない。またページネーション処理も実施していない。
Microsoft365(Office365)の自動保存をオフにする方法

**参考URL**
https://support.microsoft.com/ja-jp/help/4036334/how-to-disable-autosave-in-office-365-proplus


上記URLのページがなくなってもいいように、以下に方法を記載。

**手順**
1.「Windowsキー」+「R」でファイル名を指定して実行ダイアログを表示する。

2.「regedit」と入力して「OK」をクリックする。
　※ユーザアカウント制御が表示されたら「はい」をクリックする。

3.自動オフにしたいフォルダの最下層まで移動する。
　※例えばExcelの場合は「HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Excel\」まで移動する。

4.以下画像の黄色部分で右クリックする。
![regedit.png](https://qiita-image-store.s3.amazonaws.com/0/52022/1bc63c68-a548-4c22-455a-5dee825e66cd.png)

5.以下画像の通り「新規」→「DWORD(32ビット)値」をクリックする。
![regedit2.png](https://qiita-image-store.s3.amazonaws.com/0/52022/53428367-5eb7-8f82-f800-a6df56eb04eb.png)

6.以下の画像のようになるので、「新しい値 #1」を「DontAutoSave」に名前を変更する。
![regedit3.png](https://qiita-image-store.s3.amazonaws.com/0/52022/ea5ecf81-8ecf-4acb-7302-bd59f3b0f4bb.png)
　　　　　　　　　　　　　　　　　↓

![regedit4.png](https://qiita-image-store.s3.amazonaws.com/0/52022/e73c6c8a-14aa-ae72-f480-5e87e1fd0d6d.png)

7.「DontAutoSave」をダブルクリックして、値のデータを「1」に変更して「OK」ボタンをクリックする。
![regedit5.png](https://qiita-image-store.s3.amazonaws.com/0/52022/6ac75561-b259-93ee-c1e0-b5789a69a391.png)

8.赤枠部分が「1」になったらOKです。
![regedit6.png](https://qiita-image-store.s3.amazonaws.com/0/52022/d21cd946-88d1-ef52-9ba2-e2faca2e4507.png)


**Microsoft Word の場合:**　※99.9はインストールされているバージョンによる
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\99.9\Word\DontAutoSave

**Microsoft Excel の場合:**　※99.9はインストールされているバージョンによる
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\99.9\Excel\DontAutoSave

**Microsoft PowerPoint の場合:**　※99.9はインストールされているバージョンによる
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\99.9\PowerPoint\DontAutoSave

DWORD 値が “1” である場合に、自動保存が無効となります。
電子回路の回路図エディタ Fritzing を試してみた

ゆえあってラズベリーパイを始めるきっかけを頂きました。
で、ラズパイ始めてみた記事も追って公開したいと思うのですが今回は手始めにFritzingについて書いてみたいと思います。

ご存知の方も多いとは思いますがFritzingはブレッドボード、電子回路、プリント基板の3種類で同じ回路の記述ができます。
合わせて、関連するプログラムコードを記述する機能もあります。

まずは[ここからダウンロード](http://fritzing.org/download/)します。
![fritzing_download.png](https://qiita-image-store.s3.amazonaws.com/0/248779/2f03b5d3-5ac1-db8f-a915-0bebf54c33d2.png)

寄付の意思表示する必要があります。
Donationとは日本語で寄付。指定の金額をpaypalで寄付できるようです。
今回寄付をしない場合は「No Donation」をチェックして「Download」をクリックします。

次のページで使用中のOS環境を選択すると、対応のパッケージがダウンロードできます。
私はウインドウズ環境で試しました。（他の環境の方は展開方法が違ってくるかもしれません。）
ダウンロード後zipファイルを展開すると、フォルダの中にFritzing.exeが含まれています。

これを実行するとFritzingが起動できます。
![fritzing_open.png](https://qiita-image-store.s3.amazonaws.com/0/248779/669eaa18-128c-ec4f-0249-112f109dc040.png)


簡単にラズベリーパイとLEDランプ1点の回路を描いてみました。
まずはブレッドボード図
![breadboard.png](https://qiita-image-store.s3.amazonaws.com/0/248779/21dc908e-2189-5e8f-f87c-32a8a5291ae8.png)

次に回路図
![electronic_circuit.png](https://qiita-image-store.s3.amazonaws.com/0/248779/0ad3bd91-cdc8-0e9f-dc0c-823af565c33f.png)

そしてプリント基板
![printed_circuits.png](https://qiita-image-store.s3.amazonaws.com/0/248779/92545aa4-d498-cbbf-58cd-8f6efd55022c.png)

一つの画面で回路を描くと、ほかの画面でも同じ内容の回路が書かれています。
ですが、自動で書かれる図は配線が見ずらいですので、手作業の修正が必要と思います。ここで例示した内容は、修正後のものです。

さらに、
もう一つの画面codeです。
ここでは、関連するプログラムコードを記述することができます。
![fritzing_code.png](https://qiita-image-store.s3.amazonaws.com/0/248779/ed00ea24-425f-9c49-c797-ec7e3e228ea7.png)
ここでは、あくまでサンプルとして極めて単純にLED1点を点灯させるだけのプログラムを記述しています。HIGH/LO逆な様な気もしていますが、まだまだ不慣れなもので。ご容赦下さい。

回路図のワイヤー表示色を個別に変更する機能とか、回路図の画像出力とか、他にも補助機能があるようです。
興味のある方は試してみてはいかがでしょうか。

と、一応現状の私の限界を書いてみました。
何かの参考になれば。

# Donation 変更後のダウンロードについて
2019/11/14 情報提供があり、寄付必須になったようです。
で、無償ダウンロードできないか？と相談いただきました。

確認した所、一応ダウンロードリンクが残っていましたので報告いたします。
もしかしたら、公式によるリンクを切る作業忘れの可能性もありますので今後継続的に利用できるかは不明です。
必要な方は、今のうちにダウンロードされてはいかがでしょうか。

という事で、以下のリンクが参考になれば幸いです。
![20191114x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/64e7440d-1a92-0d30-1030-621239d0d689.png)
[リリースノートのページ](http://fritzing.org/download/0.9.3b/)にv0.9.3bへのリンクが残っていました。
[Linux 32bit](http://fritzing.org/download/0.9.3b/linux-32bit/fritzing-0.9.3b.linux.i386.tar.bz2)
[Linux 64bit](http://fritzing.org/download/0.9.3b/linux-64bit/fritzing-0.9.3b.linux.AMD64.tar.bz2)
[Max OS X](http://fritzing.org/download/0.9.3b/mac-os-x-105/Fritzing0.9.3b.dmg)
[Windows 32bit](http://fritzing.org/download/0.9.3b/windows/fritzing.0.9.3b.32.pc.zip)
[Windows 64bit](http://fritzing.org/download/0.9.3b/windows-64bit/fritzing.0.9.3b.64.pc.zip)

以上追記でした　:airplane:
[Python]Dark Skyを使用した天気予測をCSV化する

# 概要
* 建築物のエネルギーデータを予測するにあたって、空調機の消費電力量が与える影響は非常に大きい。
* 外乱のあるデータを予測するには単変量解析では限界がある。多変量にすべき？
* 翌日の外気温度使えば空調機の消費電力量の予測精度ってもっと上がるかも？と思ったので手軽に集める方法を実装した。

# 手法
* [Dark Sky](https://darksky.net/)のAPIを使って、気温の予測データを集めます。
* [日本気象株式会社](https://n-kishou.com/corp/)の方が予測精度は良さそうだけど、ランニングコストがかかるため、今回はなし。
* API叩いて、1時間間隔のデータをひっぱってきて、整形してcsv出力

# 実装
DarkSkyのアカウントは[ここ](https://darksky.net/dev)からつくります。FAQ大事！
以下のような感じで、設定値ファイルを作って、諸々の情報を読み込みます。
(それぞれのパラメータはconfigparserでパースします。）
経度・緯度指定じゃなくて、都市名で指定したかった。（今後の課題）

```:/etc/init.txt
[darksky]
APIKEY = hogehoge
LONGITUDE = hoge経度
LATITUDE = hoge緯度
UNITS = si
EXCLUDE = currently,minutely,daily,alerts,flags
```

get_forecastを呼び出して、出てきたjsonをパースします。jsonの内容は[ここ](https://darksky.net/dev/docs)に書かれています。
jsonに格納されている予測のタイムスタンプは[UNIXtime](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)で書かれているので、JSTに直さないとダメでした。

```python:API関連
import json
import urllib.request
import datetime
import time
import configparser

inifile = configparser.ConfigParser()
inifile.read('../etc/init.txt')
APIKEY = inifile['darksky']['APIKEY']
LONGITUDE = inifile['darksky']['LONGITUDE']
LATITUDE = inifile['darksky']['LATITUDE']
UNITS = inifile['darksky']['UNITS']
EXCLUDE = inifile['darksky']['EXCLUDE']

#print (APIKEY)

def get_forecast():
    try:
        url = 'https://api.darksky.net/forecast/' + APIKEY + '/' + LONGITUDE + ',' + LATITUDE + '?' + 'units=' + UNITS + '&exclude=' + EXCLUDE
        res = urllib.request.urlopen(url)
        # json_loads() でPythonオブジェクトに変換
        data = json.loads(res.read().decode('utf-8'))
        print(r'dataの取得を完了しました。')
    except urllib.error.HTTPError as e:
        print('HTTPError: ', e)
    except json.JSONDecodeError as e:
        print('JSONDecodeError: ', e)

    return data

def convert_Unix_to_JST(date):
    try:
        ans = datetime.datetime.fromtimestamp(date)
        # print('UnixからJSTに変換しました。')
        return ans

    except:
        print('なんかエラー')

```

dataはAPI叩いて得たjson,itemlistは['date','温度']を突っ込んでいます。
タイムスタンプと温度以外は必要なかったので決め打ちです。
下記は、取ってきたjsonをcsvに整形して出力しています。

```python:csvに整形
import numpy as np
import pandas as pd
import Utils.API_Control as apcon


def combine_data(data, itemlist):
    df = pd.DataFrame(columns=itemlist)
    for icnt in np.arange(0, len(data['hourly']['data']), 1):
        add_weather_forecastser = pd.Series([str(apcon.convert_Unix_to_JST(data['hourly']['data'][icnt]['time'])),
                                             data['hourly']['data'][icnt]['temperature']],
                                            index=df.columns)
        df = df.append(add_weather_forecastser, ignore_index=True)

    df.index = df['date']
    df = df.drop('date', axis=1)

    return df

```
出来上がったものが[こちら](https://github.com/snuow/get_datasystem)

# 今後の予定
* 天気予測データを得たうえで、予測精度向上のためにどうやって組み込むか。
* せっかく天気予報データ得られたし、天気予報を通知するLINEBOTを練習で作る。
* 実測したデータと各社の予測値（外気温度）がどの程度の精度をもっているか検証
Access VBA Cmをポイントに変換する ポイントをCm、ｍｍに変換するユーザー定義関数

#AccessにはCentimetersToPointsがない
Excelにはあるのに、Accessにはありません

##Excelとデータ型に差が
このためPublisherがある人はPublisherを、ない人はWordを使いますが、
DoubleではなくSingleのデータ型になります。まあこれはExcelを使えばいいのですが、こんどはポイントをCmにする関数がありません。

#PublisherとWordの差
速度的には不明ですが、PublisherはQuitをつけなくても終了します。
しかしWordは終了しません。タスクマネージャで見るといっぱい起動します。
PublisherはOulookと同じで1個しか起動しません。このため増えないのです。
なのでOffice365 Soloを持っているとか会社でOfficeを使っている人はPublisherを使う方が良いようです。しかし汎用性ではWordに負けますが、WordはQuitを入れないと大変なことになるので注意してください。

##端数処理

AccessにはExcelのRound関数はありません。このためFixを使っています。


```visualbasic

Public Function CmToPoint(CentiMenterUnitNum As Single) As Single
On Error Resume Next
Dim CentiMeterDouble As Double
CentiMeterDouble = CDbl(CentiMenterUnitNum)
If Err.Number = 0 Then CmToPoint = CentimetersToPoints(CentiMeterDouble) Else CmToPoint = 0
End Function
Public Function PtToCM(PointUnitDouble As Double) As Single
On Error Resume Next
Dim PointSingle As Single
'Dim wApp: Set wApp = CreateObject("Word.Application")
Dim pApp: Set pApp = CreateObject("Publisher.Application")
PointSingle = CSng(PointUnitDouble)
If Err.Number = 0 Then PtToCM = Fix((wApp.PointsToCentimeters(PointSingle) * 100000) + 0.5) / 100000 Else PtToCM = 0: Debug.Print Err.Number, Err.Description: Err.Clear: Exit Function
'wApp.Quit: Set pApp = Nothing
Set wApp = Nothing
End Function


Public Function PtToMM(PointUnitVariant As Variant) As Single
On Error Resume Next
Dim PointSingle As Single
'Dim wApp: Set wApp = CreateObject("Word.Application")
Dim pApp: Set pApp = CreateObject("Publisher.Application")
PointSingle = CSng(PointUnitVariant)
If Err.Number = 0 Then PtToMM = Fix((pApp.PointsToMillimeters(PointSingle) * 100000) + 0.5) / 100000 Else PtToMM = 0: Debug.Print Err.Number, Err.Description: Err.Clear: Exit Function
Set pApp = Nothing
'wApp.Quit: Set wApp = Nothing
End Function
マイグレーションのreferenceの挙動まとめ

#　目的
railsのマイグレーションで外部キーを作成する時に、`reference`をよく使うけど、「あれ、`foreign_key: true`必要なんだっけ？」 「`index`って勝手につくんだっけ？」　っていつもなるから、まとめておく。

# 前提
- mysql5.7.18 (DBが違うと挙動が違うことがあるので注意)
- rails5.1.6

# まず試す

## テーブルの作成から

```bash
rails g model test_model test_column:references
```

とすると、以下のファイルが生成される。

```ruby:db/~~~create_test_models.rb
class CreateTestModels < ActiveRecord::Migration[5.1]
  def change
    create_table :test_models do |t|
      t.references :test_column, foreign_key: true

      t.timestamps
    end
  end
end
```

`bundle exec rake db:migrate` で、、

```ruby:db/schema.rb
ActiveRecord::Schema.define(version: 20180409130332) do
  ...
  create_table "test_models", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.bigint "test_column_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["test_column_id"], name: "index_test_models_on_test_column_id"
  end
  ...
  add_foreign_key "test_models", "test_columns"
  ...
end
```

`references`使ったら`index`は自動でつきますね、、
`foreign_key`は指定してあげないとつかないみたい。

## 一応`foreign_key: true`がない場合でもやってみよう。

```ruby:db/~~~create_test_models.rb
class CreateTestModels < ActiveRecord::Migration[5.1]
  def change
    create_table :test_models do |t|
      t.references :test_column, null: false

      t.timestamps
    end
  end
end
```

`bundle exec rake db:migrate` で、、

```ruby:db/schema.rb
ActiveRecord::Schema.define(version: 20180409130332) do
  ...
  create_table "test_models", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.bigint "test_column_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["test_column_id"], name: "index_test_models_on_test_column_id"
  end
  ...
end
```


やはりforeign key制約はついてない。

## `add_reference`もやってみよう。

```bash
rails g migration AddAdditionalColumnToTestModels additional:references
```

↓

```ruby:db/~~~add_additional_column_to_test_models.rb
class AddAdditionalColumnToTestModels < ActiveRecord::Migration[5.1]
  def change
    add_reference :test_models, :additional, foreign_key: true
  end
end
```

同じ感じ。 `foreing_key: true`　がついているので、

```ruby:db/schema.rb
ActiveRecord::Schema.define(version: 20180409130332) do
  ...
  create_table "test_models", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.bigint "test_column_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "additional_id"
    t.index ["additional_id"], name: "index_test_models_on_additional_id"
    t.index ["test_column_id"], name: "index_test_models_on_test_column_id"
  end
  ...
  add_foreign_key "test_models", "additionals"
  ...
end
```

`index`も`foreign key`もついてる。

# 結論

`t.reference`自体は`index`は貼ってくれるが、foreign_key制約までは面倒をみてくれない。だから、自分で書くときは`foreign_key: true`を忘れずに。
02: Raspberry PiでスイッチのOnで何かを動かす

# はじめに
こちらは
[Arduino と Raspberry Pi の違いのまとめ](https://qiita.com/KZ2/items/5e0e79f84e4dd26bd373)
の二つ目の個別記事で、Raspberry Pi で push switch の入力を検知する。

# 目的
push switchで何か機能を動作させるときの方法である。Arduinoのswitch制御の例は省く。ArduinoのIEDのexampleを見れば十分だろう。

## hardware
- LED は、GPIO25とGNDに接続する
- Push Switch は、GPIO24と抵抗でpull downしてGNDに接続する

にそれぞれ接続したとき。Push Switch は、抵抗で pull down した。しかし、Raspberry Pi では、pull downもpull upもソフトウェアで設定することができるため、実際の抵抗を使う必要性はない。
ちなみに　Raspberry PiのGNDのピンはたくさんアサインされている。GND のピン数は、Arduino以上に多い。

スイッチの検出のポイントはこちらである。見れば分かるのでこちらでおしまい。

```python

        if GPIO.input(PIN_SW1) == GPIO.HIGH:
```


## software
とりあえずswitch動作でLEDを光らせるもの。

```python:02_LED_SW.py
import RPi.GPIO as GPIO
from time import sleep

PIN_LED1 = 25
PIN_SW1 = 24

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_LED1, GPIO.OUT)
GPIO.setup(PIN_SW1, GPIO.IN)

try:
    while True:
        if GPIO.input(PIN_SW1) == GPIO.HIGH:
            GPIO.output(PIN_LED1,GPIO.HIGH)
        else:
            GPIO.output(PIN_LED1,GPIO.LOW)
        sleep(0.01)

except KeyboardInterrupt:
        pass

GPIO.cleanup()
```    


# 親記事
[Arduino と Raspberry Pi の違い](https://qiita.com/KZ2/items/5e0e79f84e4dd26bd373)
VBA 一般的な配列内の数字の並べ替えをするユーザー定義関数と謎


## 乱数を発生させて、配列にいれて配列を並び替えて配列に入れます。
今回は[tipsfound](https://www.tipsfound.com/vba/02020)のSubプロシージャを関数にしてみました。
配列が代入され、配列で返る。
この時にソートする方法はいくつかあるので TipFoundのサイトを見てください。今回は２つ関数化しました。

## 謎

###アルゴリズムの流れ
arに乱数を代入していきます。
この時にaarに同じものを代入します。
Brに関数でソートして配列で返します。
すると
### 予想：arは元のバラバラのまま、aarは元のバラバラのまま brはソート済み
ところが実際は
### 結果 aarのみバラバラ ar、brは配列がソートされてしまう
という結果になりました。

###ByrefでもByvalでもソートされます。
さらに言うと、
### arを別の配列に入れてもarはソートされる
みたいです。

###正直tipsfoundのようにSubで受けても変わらないのかも。
という結果になりましたので、みなさんtipfoundを見てください。

#ソートの使い道は3月から4月と1月
たとえば次のような定番の文章があります。

みなさま2018年4月になりました。2017年度も終わり、新しい年度が始まりました。文書ファイルを作成するときは注意しましょう。文書の保存期間の起算点は2019年度です。このため満5年後の期限の文書は2023年度末、3年後の期限の文書は2021年度末です。
この文書から正規表現で4桁の数字を抜きます。

##かならず4桁の西暦のパターン文字列
西暦は1900年から2999年まであれば大体普通の文章は間に合います。
すると[0-9]{4}ではありません。
最初は1,2しかないからです。のこり3桁が0-9です。
すると必ず西暦が4桁しかない場合のパターン文字列は
[1-2]{1}[0-9]{3}
です。

```visualbasic

buf = 'さっきに文章を代入してください(てぬき)
Dim M , Mc, SMc
With CreateObject("VbScript.RegExp")
.Pattern = "[1-9]{1}[0-9]{3}"
.Global=True
.MultiLine = True
Set Mc = .ExeCute(buf)
End With
```

とやるとMCは2017 2018 2019 2022 2023
が入ります
#西暦を置換するときの絶対の法則
##最大の年から次の年にずらす
というのが重要です。
これは2ケタでも変わりません。例外は 99-00のあたりくらいです。
最小の2017から2018にするとダブってしまいます。
このため配列をソートして、最大の西暦を求め、それからReplaceしなければなりません。
このため正規表現とともに、並べ替えが必要になるというわけです。

#コード

```visualbasic

'乱数を発生させ配列に代入します
Sub MakeRndArray()
Dim ar(99), br, aar(99)
Const low As Long = 1
Const high As Long = 99
Dim i As Long
For i = 0 To 99
ar(i) = Rnd()
aar(i) = ar(i) 'Copy And Keep Index Keep Array
Next
’どちらかの関数に代入します
br = InsertionSort(ar, LBound(ar), UBound(ar))
'br = QuickSort(ar, LBound(ar), UBound(ar))
Stop
End Sub

```
# 関数はここから

```visualbasic

Function InsertionSort(ByRef data As Variant, ByVal low As Long, ByVal high As Long)
'https://www.tipsfound.com/vba/02020 Data Temp は型をLongに合わせると早くなる
Dim i As Variant
Dim k As Variant
Dim temp As Variant
For i = low + 1 To high
temp = data(i)
If data(i - 1) > temp Then
k = i

Do While k > low
If data(k - 1) <= temp Then
Exit Do
End If

data(k) = data(k - 1)
k = k - 1
Loop

data(k) = temp
End If
Next
InsertionSort = data
End Function

Function QuickSort(ByRef data As Variant, ByVal low As Long, ByVal high As Long)
'’https://www.tipsfound.com/vba/02020
Dim l As Long
Dim r As Long
l = low
r = high

Dim pivot As Variant
Dim temp As Variant
pivot = data((low + high) \ 2)



Do While (l <= r)
Do While (data(l) < pivot And l < high)
l = l + 1
Loop
Do While (pivot < data(r) And r > low)
r = r - 1
Loop

If (l <= r) Then
temp = data(l)
data(l) = data(r)
data(r) = temp
l = l + 1
r = r - 1
End If
Loop
If (low < r) Then
QuickSort = QuickSort(data, low, r)
End If
If (l < high) Then
QuickSort = QuickSort(data, l, high)
End If
QuickSort = data
End Function
```
ゲッターPHP

[真・ゲッター 真・セッター](https://twitter.com/tomoya_shibata/status/983250912931033088)

やるしかないと思った。

```php
<?php

/**
 * すかさずPHPerオープンゲットでござるよ。
 * PHPerマジックメソッドで抽象化した後力ずくでimplodeするでござる。
 * いつだってPHPerの若い命は真っ赤に燃えているのでござるな。
 */

namespace 早乙女研究所\ゲッターロボ;

function 真 () {
	return 真::class;
}

class 真 {
	const チェンジ！！      = '(チェンジ!!)';

	protected $ケッターマシーン     = null;

	public function __construct ($getter) {
		$this->ケッターマシーン = [
			basename(str_replace("\\", '/', static::class)),
			static::チェンジ！！,
			$getter
		];
	}

	public function オープンゲット！ () {
		return static::class;
	}

	public static function ゲッター () {
		return new static(__FUNCTION__);
	}

	public function __call ($name, $args) {
		$this->ケッターマシーン[3]      = $name;
		return $this;
	}

	public function __toString () {
		return implode('', $this->ケッターマシーン);
	}
}

echo 真()::ゲッター()->ロボ(), \PHP_EOL;
echo 真()::ゲッター()->ロボ()->オープンゲット！()::ゲッター()->ワン(), \PHP_EOL;
```

```php
<?php

namespace 早乙女研究所\ゲッターロボ;

class 真 {
	const チェンジ！！      = '(チェンジ!!)';

	protected $ケッターマシーン     = null;

	public function __construct ($getter) {
		$this->ケッターマシーン = [
			basename(str_replace("\\", '/', static::class)),
			static::チェンジ！！,
			$getter
		];
	}

	public function オープンゲット！ () {
		return static::class;
	}

	public function __get ($name) {
		$this->ケッターマシーン[3]	= $name;
		return $this;
	}

	public static function ゲッター () {
		return new static(__FUNCTION__);
	}

	public function __toString () {
		return implode('', $this->ケッターマシーン);
	}
}

echo 真::ゲッター()->ロボ, \PHP_EOL;
echo 真::ゲッター()->ロボ->オープンゲット！()::ゲッター()->ツー, \PHP_EOL;
```
FluentdをDocker Composeで立ち上げてみる

# はじめに

ちょっと [Fluentd](https://www.fluentd.org/) を使いたい用事ができたのでさくっとセットアップしようと思った。普通にセットアップするは面倒だったので[Docker Hubにあるイメージ](https://hub.docker.com/r/fluent/fluentd/) から立ち上げようと思った。それならばあとで他のコンテナも使うかもしれないからDocker Composeで立ち上げれるようにしたら便利やん。と思っていい感じの `docker-compose.yml` が書いてないか探したけどいまいち見つからない。

なので書いてみた。やったあとであんまり目的に会ってない気がしたが、せっかくなのでメモを残しておく。

# docker-compose.yml

```docker-compose.yml
version: "2"

services:
  fluentd:
    image: fluent/fluentd:latest
    ports:
      - "24224:24224"
    environment:
      - 'FLUENTD_CONF=fluentd.conf'
    volumes:
      - ./tmp/fluentd:/fluentd/log
      - ./etc:/fluentd/etc
```

とりあえず `fluentd.conf` は任意のものに変更したいので `FLUENTD_CONF` で起動時にローカルのものをコピーするようにする。

# ディレクトリ構成

`etc`ディレクトリに`fluentd.conf` を配置。 `tmp` にfluentdのログのボリュームが置かれるようにする。

```
tree .
.
├── docker-compose.yml
├── etc
│   └── fluentd.conf
└── tmp
    └── empty
```

# 起動する

```
docker-compose up -d

Creating network "fluentddockercompose_default" with the default driver
Pulling fluentd (fluent/fluentd:latest)...

(中略)

Status: Downloaded newer image for fluent/fluentd:latest
Creating fluentddockercompose_fluentd_1 ... done
```

接続してみる

```
docker exec -it fluentddockercompose_fluentd_1 /bin/sh
/ # ls
bin      fluentd  media    root     srv      usr
dev      home     mnt      run      sys      var
etc      lib      proc     sbin     tmp
```

`fluentd.conf`をみてみる

```
# vi fluentd/etc/fluentd.conf
```

ローカルに配置したものになっていれば成功

# まとめ

やったあとで気づいたがこういうのは最近は[Kubernetes](https://kubernetes.io/)でやるんだろうか。なのでDocker Composeでの設定が見つからなかったのか？ 記述が簡単で手軽なのでDocker Composeは好きなんだけど。しかしまあ、ちゃんとシステム開発して運用のスケーラビリティを視野に入れたら最初からk8sでやっといたほうがいいんだろうなあ。今度からそうしよう。
RailsをWindows Subsystem for Linuxで動かしてみる

Windows10から搭載されたWindows Subsystem for Linuxを使ってRuby on Railsの開発環境を作れないかと思ってやってみました。
手軽にやるにはまぁありかなという印象。

すでに同様のことをされている先人様がいっぱいいらっしゃいますね。
たぶん他記事との違いは後半の[Dドライブに入れようとして失敗した部分](#windows%E7%AE%A1%E7%90%86%E5%8C%96%E9%83%A8%E5%88%86%E3%81%A7rails%E5%8B%95%E3%81%8B%E3%81%99%E5%A0%B4%E5%90%88)ぐらい。

# WSLの導入
昔は"Bash on Windows"と言われていたのものが進化して、いろんなlinuxディストリビューションが導入できるようになっています。

 Windows Storeで"bash on windows"とか"ubuntu"とか"linux on windows"とか適当に検索すると”WindowsでLinuxを実行する”というページにたどり着けます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83530/2aefc27b-e9fc-cb06-dcdb-8fb40f48038d.png)

ここでお好みのディストリビューションを選んで、ポチッとインストールを押すと導入されます。
随分楽になってますね。

今回はUbuntuを選択しました。

# Rails環境構築
## 各種アップデート
Ubuntuを起動すると、まずはパスワード設定が求められるので入力します。
その後、各種アップデートと必要なライブラリを導入しておきます。

```bash:初期設定
sudo apt update
sudo apt upgrade

sudo apt install -y build-essential

sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev libsqlite3-dev
```

## rbenvの導入
Rubyの導入・複数バージョンの管理を楽にしてくれるrbenvを導入します。
[rbenv](https://github.com/rbenv/rbenv)

```bash:rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

source ~/.bash_profile
rbenv --version
```

バージョンが表示されればOK

## Node入れておく

NodeJSの最新のものも入れておきましょう。

```bash:node
curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs
```

## Ruby

rbenvを使ってRubyの導入を行います。

```bash:ruby
# インストールできるものリスト
rbenv install --list
# バージョンを指定してインストール
rbenv install 2.5.1
# 確認
rbenv versions
# 利用するバージョンの設定
rbenv global 2.5.1
```
gemを管理するbundlerも入れておきます

```bash:bundler
gem install bundler
```

## Rails
Rails自体も複数バージョンが混在することを想定して
Railsが動く環境を構築 → その中でRailsアプリケーションを構築の手順で導入してみます。
気にしない場合は`gem install rails`で入れてしまってもOK

```bash:rails
# testディレクトリ内に設定してみる
mkdir test
cd test

bundle init
# 作成されたGemfileの
gem "rails" #を有効にする

bundle install --path vendor/bundle
```

```bash:rails
bundle exec rails new rails_test

cd rails_test
bundle install --path vendor/bundle
bundle exec rails s
```

### Windows管理化部分でRails動かす場合

WSLではWindowsが管理している領域にもアクセス可能です。
/mnt/に各ドライブがマウントされているので、そちらで作業することもできます。
Windows側からソースコードの参照や開発する場合その方が便利ですね。

ただ、bundle installする先がwindows管理下の場合、失敗する場合が多い（おそらくビルドする必要があるライブラリとかが正しくビルドされない）ので、ライブラリのインストール先はlinux管理下にします。

```bash:rails
# Dドライブ下に作ってみる
cd /mnt/d
mkdir test
cd test

bundle init
# 作成されたGemfileの
gem "rails" #を有効にする

bundle install --path ~/tmp/vendor/bundle

bundle exec rails new rails_test

cd rails_test
bundle install --path ~/tmp/rails/vendor/bundle
bundle exec rails s
```

これで、D://test/rails_testのソースコードをお好みのエディタでがりがり書いていくとRailsアプリケーションが作れますね。
Colaboratoryの目次をインデント表示させる方法

# やりたかったこと

下記のように目次をグルーピングしてインデント表示したかった。

|![1_indent.png](https://qiita-image-store.s3.amazonaws.com/0/165884/b1b4aa4e-75ab-51e5-6142-cb86e48238c8.png)|
|:--|

# 方法

テキスト内でマークダウンの見出しとして設定すれば良い。

|![2_how.png](https://qiita-image-store.s3.amazonaws.com/0/165884/24f1beff-bc1f-0781-1df8-ebf35a093308.png)|
|:--|


# 雑記

最初はやり方が分からなくて右側のセクションをドラッグしてみたり色々試行錯誤してた。
見出しレベルを設定すれば下記のようにマークダウン(というかHTMLのhタグ)で指定出来る6レベル分が表示出来る。

|![3_level.png](https://qiita-image-store.s3.amazonaws.com/0/165884/af035b67-41cd-3873-8f5b-ce2da4e9ea57.png)|
|:--|

また、本文側で見出しを閉じていればセルを上下に動かす際に邪魔にならないので便利。
MotionEventのgetYとgetRawYの違い

### 概要

[MotionEvent](https://developer.android.com/reference/android/view/MotionEvent.html)で`getY` と `getRawY`を扱うことがあったのですが、若干取得できる値が違ったので調べてみました。

### Android座標系

(調査中)

Androidにはいくつかの座標系があるみたいです。 「`Android 座標系`」で検索すると、いくつか記事が出てきますが公式のドキュメントには日本語ではひっかからないように思います。(キーワードが悪いだけ?)

[Android開発のメモ: 座標系について](http://kurokuroandroid.blogspot.jp/2010/12/blog-post_24.html)によると、Androidには以下の2つの座標系があります。

* スクリーン座標系
* ローカル座標系

![blog7.jpg](https://qiita-image-store.s3.amazonaws.com/0/29844/6d8a9a1b-dfc8-94c5-3790-359b2ce80793.jpeg)

出典: [Android開発のメモ: 座標系について](http://kurokuroandroid.blogspot.jp/2010/12/blog-post_24.html)

### 本題

さて、問題のMotionEventの2つのメソッドを比較してみましょう。

[MotionEvent#getY](https://developer.android.com/reference/android/view/MotionEvent.html#getY())

> getY(int) for the first pointer index (may be an arbitrary pointer identifier).

[MotionEvent#getRawY](https://developer.android.com/reference/android/view/MotionEvent.html#getY())

> Returns the original raw Y coordinate of this event. For touch events on the screen, this is the original location of the event on the screen, before it had been adjusted for the containing window and views.

どうやら、 `getY` はローカル座標系を、 `getRawY` はスクリーン座標系を返すようです。ちなみに、ローカル座標系を親のローカル座標系に直す場合は、自分のLeftを加算してあげる必要があります。

### 宿題

* Androidの座標系についてもう少し詳しく調べる
* AndroidのPointer Index, Data Indexについて調べる

### 参考

* [MotionEvent | Android Developers
](https://developer.android.com/reference/android/view/MotionEvent.html)
* [Android開発のメモ: 座標系について](http://kurokuroandroid.blogspot.jp/2010/12/blog-post_24.html)
* [Androidでマルチタッチを使う - Qiita](https://qiita.com/tobira-code/items/a4e97ee775921da3334e)
2018年4月現在MacにJava8を入れる手段

筆者はOSX HighSierraです。

# Oracle公式から
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

# Homebrewから
`brew cask install java`だと10が落ちてきてしまう。
`brew search java1.8`とか`brew search java8`しても見つからない。

ググったらJava7を`brew install`する比較的最近の記事を発見。

https://qiita.com/jyotti/items/22f07d807fb95fd24330

同じ要領で

```
brew cask install caskroom/versions/zulu8
```

と叩いたらインストールできた。
zuluが何かよくわかってないけどOpenJDKっぽい何からしい。

# 追記

@jyottiさんよりbrewで最新以外のjavaを入れる方法をご教示頂きました。

```
# jdk10(oracle)
brew cask info java
# jdk9(oracle)
brew cask info java9
# jdk8(oracle)
brew cask info java8
```
C♯のjson文字列の中で式展開したいとき

* 引用符はバックスラッシュ（`\`なり`¥`なり）でエスケープします。
* `{}`を2つずつ重ねると文字列として扱われます。

```csharp
var data = "something";
var json = $"{{\"hoge\":\"{data}}}\"";
```
GBDKによるゲームボーイソフト制作-5回 背景を動かす-

前回：[GBDKによるゲームボーイソフト制作-4回 背景表示-](https://qiita.com/blackpman/items/12258e6a9ee9f2d032de)
次回：まだ
## 背景を動かしてみる
第3回のキー入力と前回との合わせ技で、十字キーの横入力に応じて背景を横に動かしてみる。
### ソースコード
前回のものをこんな感じに改造。

```C++:main.c
#include <gb/gb.h>
#include <gb/drawing.h>
#include "tiles.c"
#include "image.c"

void main() {
	UINT8 pad, pos_x, pos_y;

	pos_x = 0;
	pos_y = 0;

	HIDE_BKG;	// 背景非表示
	set_bkg_data(0, 1, g_tiles);
	set_bkg_tiles(0, 0, 40, 18, g_image);
	move_bkg(pos_x, pos_y);
	SHOW_BKG;	// 背景表示

	while (1) {

		wait_vbl_done();	// 画面更新を待つ
		pad = joypad();		// キー入力状況の取得

		if (pad & J_LEFT) {
			pos_x -= 1;
		}

		if (pad & J_RIGHT) {
			pos_x += 1;
		}
		move_bkg(pos_x, pos_y);
	}
}
```

### 解説
#### 7行目 変数宣言
UINT8（8bit符号なし整数）型の変数を3つ定義。
それぞれキー入力取得用、背景座標X、背景座標Y（今回は常に0）。
#### 15行目 move_bkg
現在の背景を指定した座標に移動させる。
前回は明示的に指定しなかったが、デフォルトは0,0のようなのでとりあえず初期はデフォ値にしておく。
#### 20行目 wait_vbl_done
以前にwhileを扱った時はこの関数は使っていなかった。
これは何をしてるかというと、画面の更新を待つことで以降の処理を意図的に遅延させている。
私たちが普段使うPCもモニタは一定の速度（一般的なものは60回/秒）で画面を更新していて、ゲームボーイもそれは同様の仕組みとなっている。
画面更新を無視して裏側の処理を行うと処理速度が安定しなかったりする。
それを避けるため、ループ内の処理の実行を1回の画面更新につき1回に合わせている。
（大体こんな感じだと思います。間違ってたらごめんなさい。）
詳しくは「垂直同期」などでググると良い。
#### 21～30行目
この辺りは以前のキー入力のプログラムと同様で、joypad関数で受け取った結果のJ_RIGHTまたはJ_LEFTのビットが立っているかチェックし、立っていればそれぞれに応じてmove_bkgでX座標を変化させている。
### コンパイル
前回と同様。
コマンドプロンプトでソースファイルのあるディレクトリにcdして、
```lcc -o game.gb main.c```
※ROMファイルを"game.gb"、ソースファイルを"main.c"とした場合
### 実行結果
![result.png](https://qiita-image-store.s3.amazonaws.com/0/246149/feab8ecd-06ec-a466-7b4f-1a2a38ea676e.png)
こればかりは実際に動かしてみないとよくわからない。
十字キー左右に対応するキーを押すことで画面が動く。
動かしてみると背景がループしていると思うが、どうやらデフォルトでリピートするらしい。

ということで今回はここまでです。
CentOS7へAnsibleでVulsをインストールする

AnsibleでCentOS7へVulsをインストールするPlaybookを書きました。ローカルホストで実行する場合のみ対応しています。

Vulsの公式の [インストール手順](https://vuls.io/docs/ja/install-manually-centos.html) に従っています。

### 動作環境

以下を基本として説明します。

CentOS7.4 以降
Ansible 2.5 以降（2.4以前には対応していません）


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

rootで実行します。sudoを利用する場合は適宜変更します。

```
# yum -y install epel-release
# yum -y install ansible
# ansible --version
```

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

コマンドはrootで実行します。sudoを利用する場合は適宜変更します。

まず初めに始めにvulsユーザーを作成します。その後私が管理しているGithubのリポジトリよりplaybookを取得します。

```
# useradd vuls
# cd /home/vuls
# git clone https://github.com/TomonoriMatsumura/ansible-vuls.git
# cd ansible-vuls
# ansible-playbook -i localhost.cfg site.yml
```

### vulsを実行する

vulsユーザーでのみ実行可能です。

```
$ su vuls
$ vuls
```

### varsファイルについて

ansible playbookを実行する際に設定する変数は以下が設定されています。パスは「ansible/vars/vuls/install/default.yml」です。

```
work_dir: /tmp/vuls-install-dir
vuls_user: vuls
go_path: "/home/{{ vuls_user}}/go"

first_year: 2018
```

- work_dir

作業用ディレクトリ

- vuls_user

Vulsを実行するユーザー名

- go_path

Golangのインストールパス

- first_year

脆弱性ファイルを取得するための期間を設定します。期間の最初のみ指定出来ます。期間の終わりの年はPlaybook側で自動で取得されます。

初期設定は2018年～2018年になっています。（2018年現在）この値を適宜変更します。2016年～現在の年くらいの約3年間程度の設定が妥当かと思われます。

### Golangについて

Vulsが利用するGolangは常に最新のバージョンがインストールされます。Golangの[Dockerfile](https://github.com/docker-library/golang/)より最新のGolangのバージョン情報を解析して取得しています。

### 参考サイト

- [Install Manually on CentOS · Vuls](https://vuls.io/docs/ja/install-manually-centos.html)
- [docker-library/golang: Docker Official Image packaging for golang](https://github.com/docker-library/golang/)
関数定義におけるパターンマッチング - Haskell vs Elm vs Elixir


　Elmでちょっと嵌りまして、関数の定義でパターンマッチングは使えなかったんですね。コンパイラに怒られて、少し呆然としました。
[Cannot use pattern matching in function definition - elm-lang/elm-compiler] (https://github.com/elm-lang/elm-compiler/issues/973)


　Haskellだと以下のように書けます。きれいですね。

```haskell:factorial
factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial (n - 1)
```

　しかしElmだと以下のようになります。関数の定義で場合分けができないから、caseで分けます。ちょっとHaskellより見劣りします。

```elm:factorial
factorial : Int -> Int
factorial n =
  case n of
    0 ->
      1
    _ ->
      n * factorial (n - 1)
```

　Elixirで書くと以下のようになりますね。Haskellに似ています。と言うか、一般的にElixirはHaskell以上に関数定義でのパターンマッチングを推奨しているような気もしますが。

```elixir:factorial
defmodule Fact do
  def factorial(0), do: 1
  def factorial(n) when n > 0 do
    n * factorial(n - 1)
  end
end
```

　以上です
JavaScriptのclassによるprototypeチェーン図解

##Classの仕組みの図解
classによって生成されるPrototypeチェーンを図解します。

対象読者は既にprototypチェーンについて学習したことがある人です。

そもそもの説明は[こちらなどが参考になります](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)


##classAを生成
```javascript

class A {
	constructor (){
    	thits.a = "a";
    }
}
```

上記のコードによって以下のような関係が生成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/178c3ef4-c061-2939-df1f-ea51f109157b.png)

##Aを継承したclassBを生成

```javascript
class B extends A {
	constructor (){
    	super();
    }
}

```

Aを継承したBを生成すると以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/b6633c80-cabb-5327-604b-5c604af16f87.png)


##instance b を生成

```javascript
b = new B();
```

instance b を生成すると以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/200431/280c1492-f9ce-33cb-b717-4335f578735f.png)

.\_\_proto\_\_,  .\_\_proto\_\_ で繋がっていく部分がプロトタイプチェーンです。
最終的にObject.prototypeにつながるので、bはObject.prototypeに定義されている全てのメソッドにアクセスできます。




##classを使わずprototypeで記述する場合

classを使った上の記述は以下のprototypeを使ったコードとほぼ同義となります。

```javascript
function A(){
	this.a = "a";
}

function B(){
	this.a = "a";
}
B.prototype.__proto__ = A.prototype;
b = new B();

```