OmniAICreator/Qiita-1.07M huggingface dataset:
2019年のErgoDox EZはWebサイト＆GUIアプリだけでキー配列カスタマイズが完了するよ

# TL;DR

1. キー配列はC言語のソースコードで記述→ウェブ上で設定、hexファイルのダウンロードが可能に
2. hexファイルの書き込みは専用のGUIアプリで可能に

# 序

肩こりに悩んでいまして、最近HHKB Pro2から左右分離式エルゴノミクスキーボードの[ErgoDox EZ](https://ergodox-ez.com/)へ移行しました。
ErgoDox EZのデフォルトの配列は[割と独特](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ergodox_ez/keymaps/default_osx)で、大体の人と同様にキー配列のカスタマイズを試みました。

Qiitaなどを見ていると流行ったのが2016年頃のようでそのときとはキーカスタマイズの方法が変わっていたので2019年現在の状況を書いておきます。

本体の購入も以前は[クラウドファンディングのサイト](https://www.indiegogo.com/projects/ergodox-ez-an-incredible-mechanical-keyboard#/)で買えたようですが、
現在は「公式サイトに行ってね」というリンクだけで買えなくなっています。

# キー配列はC言語のソースコードで記述→ウェブ上で設定、hexファイルのダウンロードが可能に

2016年と同様、現在も[QMK Firmware](https://github.com/qmk/qmk_firmware)による設定もできます (makeの引数やディレクトリ構造は変わってるようです）が、そこまで複雑な設定をしないのであれば、公式サイトからいける[ORYX](http://configure.ergodox-ez.com/)というサイトを使うと良いと思います。

<img width="800" alt="oryx.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8846/5f947dc1-9260-90ff-7590-663c37553616.jpeg">

特長として

- Webブラウザ上でキーカスタマイズが可能
  - C言語のソースコードでの書き換えをちまちまやらなくてもOK
  - 日本語配列特有の「英数」「かな」キーなども設定可能
- hexへのコンパイルをやってくれるのでダウンロードするだけ
  - そのためコンパイラなどのツールのインストールが不要
- コンパイルしたときごとにキー配列履歴がサーバー上に残る（バージョン管理）

などとりあえずカスタマイズする上では十分な機能がついています。

以前は[ブラウザ上でカスタマイズできた](https://www.massdrop.com/ext/ergodox)ようなのですが、現在は使えない様子？よくわかってないです。

ちなみに[私のキー配列](https://configure.ergodox-ez.com/ergodox-ez/layouts/0WZV6/latest/0)もウェブ上で確認できます。

# hexファイルの書き込みは専用のGUIアプリで可能に

ErgoDox EZをUSBで接続した状態でhexを書き込むのは変わらないですが、[Teensy](https://www.pjrc.com/teensy/loader.html)よりも
ユーザーフレンドリーな[Wally](https://ergodox-ez.com/pages/wally)というツールが提供されています。

<img width="630" alt="wally.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8846/f870f264-ddcc-ec81-1c15-8932e4a3e18d.jpeg">

GUI版しか試してないですが、画面に表示されているようにhexファイルの選択 or ウィンドウへのD&D、リセットボタンの操作を行うだけで書き込みが完了するためTeensyのGUIよりも専用に作られてるだけあってわかりやすかったです。

# 最後に

左右分離型HHKB Pro2の発売を心よりお待ちしております。
【mac】XAMPP7.3.11環境構築_アンインストール

### ＜＜更新日：：2019年11月10日＞＞

XAMPP.appをアンインストールする
---
仮想環境なので、やることは簡単。
　　

1.Finder > Applications から XAMPP.appをゴミ箱に移動する

![Screenshot 2019-11-10 16.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394058/97213bf2-17c2-bb59-ce75-db1f86b633c1.png)

　　
　　

2.`.bitnami`系ファイルを削除する

```
 ~ sudo rm -rf ~/.bitnami   
```



　　
　　

最後に
---
古いバージョンで直接ローカルにXAMPP環境を構築している場合は、キャッシュなどもキチンと削除する必要がある。その点、仮想環境は簡単だ。

普段できないような実験を、環境を作っては壊しをして大量に試そう。
そもそもXAMPPを使っている本来の目的はそこ。

質問・不明点・間違いなどがあればご連絡ください。
Railsでいいね機能（ajax処理）のRSpecの書き方

# 概要

ローカルで成功していたいいね機能（ajax）のRSpecテストがDockerで環境作成してテストを行ったら、失敗し解決したので書き残しておきます。

# 作ったいいねボタン

いいねボタンは、アイコンをクリックすると色が変わリ、いいね押したユーザ数がわかるように実装しました。

<img width="617" alt="スクリーンショット 2019-11-10 16.33.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439934/f0ef534e-2278-138d-b752-108e94b5e5be.png">
<img width="617" alt="スクリーンショット 2019-11-10 16.30.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439934/3aab90cc-761b-38ad-7881-c03d65e74a8c.png">


```html
<div id="like-post-1">
	<a class="post_unlike" data-remote="true" rel="nofollow" 
	   data-method="delete" href="/posts/1/like">
	 	<i class="fas fa-heart"></i>
	</a>1
</div>
```

# RSpec

テストは、css要素をもとに２つ実装しました。

```ruby
context 'いいねをクリックした場合' do
  it 'いいねできる' do
    find('.far').click
    expect(page).to have_css '.fas'
    expect(page).to have_css "div#like-post-#{post.id}", text: '1'
  end
end
```

```ruby
context 'いいねを削除した場合' do
  it 'いいねを取り消せる' do
    find('.far').click
    find('.fas').click
    expect(page).to have_css '.far'
    expect(page).to have_css "div#like-post-#{post.id}", text: '0'
  end
end
```

# 発生したエラー

```ruby
Failure/Error: expect(page).to have_css '.fas'
	expected to find css ".fas" but there were no matches
```

# 解決方法

作成したテストに、`js: true`を追記するだけで解決しました。

```ruby
context 'いいねをクリックした場合', js: true do
  it 'いいねできる' do
    find('.far').click
    expect(page).to have_css '.fas'
    expect(page).to have_css "div#like-post-#{post.id}", text: '1'
  end
end
```

```ruby
context 'いいねを削除した場合', js: true do
  it 'いいねを取り消せる' do
    find('.far').click
    find('.fas').click
    expect(page).to have_css '.far'
    expect(page).to have_css "div#like-post-#{post.id}", text: '0'
  end
end
```

# 試したこと

エラー原因が、ajax処理が終わる前にテストが実行されているのかと思いajax処理が完了を待つような処理を記述しようとしました。

・下記の記事を参考し、実行してみたのですが自分の環境ではうまくいかず

`evaluate_script`をcapybaraはサポートしていないとエラーが出てしまいました。

`https://thoughtbot.com/blog/automatically-wait-for-ajax-with-capybara`

・Driverをcapybara-webkitに変更してみたり、色々試してみたのですがなかなかうまくいかなかったです。

# 最後に

ここまで読んでくださりありがとうございます。

Ruby on Railsのポートフォオを作成をしていく中で、様々な記事に助けられることが多いです。自分も誰かの助けになればと思い些細なエラーですが記事を書いてみました。
MacOSXでCPUのコア数をコマンドで取得するには

## 実現したいこと

```
cat /proc/cpuinfo | grep proccess
```
LinuxでCPU数をシェルを利用して取得するときに利用する上記のコマンドのようにMacOSXでも同様にCPU数を所得したい。


## 実行コマンド

```
system_profiler SPHardwareDataType | grep Cores
```

もしくは

```
 system_profiler SPHardwareDataType | grep Cores | awk '{print $NF}'
```

## 補足

* 特になし

## 情報源

* https://mba-hack.blogspot.jp/2013/11/maccpu.html
Xibを使ったView遷移

xibを使ったVeiw遷移のやり方をいつも忘れるので備忘録としてここに記す。

# xib作成
xibとSwiftファイルを作成後、SwiftファイルにUIクラスを継承させないとxibファイルと結びつけることはできない
<img width="257" alt="スクリーンショット 2019-11-10 16.45.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302540/5fab50d6-a878-c6b5-74e4-9c57d59b9951.png">
<img width="279" alt="スクリーンショット 2019-11-10 16.44.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302540/d6f6a47a-cbc4-187c-789b-069fddfe134b.png">

#ViewController側
VeiwController側でxibを呼び出し、呼び出したコントローラーのviewに設定する

```swift

let view1: UIView = UINib(nibName: "CustomeView", bundle: nil).instantiate(withOwner: self, options: nil).first as! UIView
        self.view.addSubview(view1)
```

#全体図

```swift

    @IBOutlet weak var buttonaction: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
    }

    
    @IBAction func buttonAction(_ sender: Any) {
        let view: UIView = UINib(nibName: "CustomeView", bundle: nil).instantiate(withOwner: self, options: nil).first as! UIView
        self.view.addSubview(view)
    }
    
```
クライアントPCのメモリ(8GB)ではAndroid Emulatorが遅いのでリモートPC(16GB)上のDocker-Androidでデバッグする

#経緯
クライアントPC(Windows10)はメモリ8GBであり、Android Emulatorを起動しつつ開発を行うと重くて話にならない。Android EmulatorはクライアントPC以外で起動したい。

#前提
1. Android Studioがインストール済みであること

#手順
[リモートPC]
1. docker-androidからイメージをpull ```docker pull budtmo/docker-android-x86-7.0```
2. 起動する `docker run --privileged -d -p 6080:6080 -p 5554:5554 -p 5555:5555 -e DEVICE="Samsung Galaxy S6" --name android-container  budtmo/docker-android-x86-7.0`

[クライアントPC]
3. adbコマンドをpathに通す 
4. adbコマンドでdeviceを接続する `adb connect (リモートPCのIPアドレス):5555`
5. adb devicesでdeviceが追加されていることを確認

```shell
adb devices
List of devices attached
192.168.0.xx:5555       device
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46533/61b85568-e37a-716d-761c-2e461e54cd6f.png)
[C#]クラス作成時にメソッドチェインを使用する


# 結論から言うとBuilderパターン
メソッドチェインでつないで一行で設定を入れて、実際にほしいクラスを作成します。MQTTnetとかで使うやつです。
今回はただ一秒ごとにカウントアップするカウンタークラスを作成します。
使うときはこんな感じになります。

```c#
        static void Main(string[] args)
        {
            var option = new CounterOptionBuilder().Start(10).Duration(5).End(40).Build();
            var countObject = new Counter(option);
            countObject.Start();
        }
```

作成するクラスは以下の３つ

- Counterクラス
  - 実際に使いたいクラス
- CounterOptrionsクラス
  - Counterクラスに設定する値が入ったクラス
- CounterOptionBuilderクラス
  - CounterOptionBuilderクラスをメソッドチェインで作成するクラス

# サンプルコード
次は実際にほしいクラスです。

```c#
    class Counter
    {
        private readonly CounterOptions option;

        public Counter(CounterOptions option)
        {
            this.option = option;
        }

        public void Start()
        {
            var c = option.start;
            while(option.end >= c)
            {
                Console.WriteLine($"counting...{c}");
                Thread.Sleep(1000);
                c += option.duration;
            }
        }
    }
```
次がBuilderパターンの肝です。
Builderパターンではメソッドは自分を返します。*return this;*の部分です。
これによってメソッドチェインを実現します。

```c#
    class CounterOptionBuilder
    {
        private readonly CounterOptions options = new CounterOptions();
        private int start;
        private int end;
        private int duration;

        public CounterOptionBuilder Start(int value)
        {
            start = value;
            return this;
        }

        public CounterOptionBuilder End(int value)
        {
            end = value;
            return this;
        }

        public CounterOptionBuilder Duration(int value)
        {
            duration = value;
            return this;
        }

        public CounterOptions Build()
        {
            options.start = start;
            options.end = end;
            options.duration = duration;
            return options;
        }
    }
```
次は設定したい項目をクラス化したものです。Builderパターンでは設定項目をクラスに分離することが多いです。

```c#
    class CounterOptions
    {
        public int start { get; set; }
        public int duration { get; set; }
        public int end { get; set; }
    }
```
[Xamarin] アプリ内に簡単な値を保存

アプリ内ストレージに簡単な値を保存しておく場合、ブラウザーのクッキー的な存在で使う例。

こちらを参照しました。
https://docs.microsoft.com/en-us/xamarin/essentials/preferences?context=xamarin%2Fxamarin-forms&tabs=android

# Essentials

Eseentials ライブラリーを参照

```csharp
using Xamarin.Essentials;
```

# 書込み
```csharp
Preferences.Set("my_key", "my_value");
```
# 読込
```csharp
var myValue = Preferences.Get("my_key", "default_value");
```
何もないときは default_valueを返します
# 削除
```csharp
Preferences.Remove("my_key");
```
# すべての値を削除
```csharp
Preferences.Clear();
```
#書込み可能な変数タイプ

- bool
- double
- int
- float
- long
- string
- DateTime
Go言語でPKCEのCodeVerifierからChallengeに変換する

# はじめに
業務でOAuth2のPKCEの対応(Mobile側)をすることになった。
当方はAndroidエンジニアだが、サーバサイドとの疎通がうまくいかない。
レスポンスを見る限りPKCEのCodeVerifierからChallengeに変換できていないようだ。
サーバサイドからおかしなところがあったら指摘してくれ、と言われたので与えられている情報から修正案を作ってみた。
なお、Go言語はSoftware Designの記事で少し触ってみただけで業務で使ってないので俺に聞くなというスタンス。

# PKCEとは
簡単に言えば認可コード横取りを防ぐ仕組みです。
この記事がわかりやすいと思います。
https://qiita.com/samiii/items/9574d1e237228c718cd6

# どんなことが起こっていたか
最初にコードを取得するところは問題ない。(Mobile側で作ったChallenge渡すだけなので)
実際にtokenを取得する際に *"不正なCodeVerifier"* と言われている。
ただ、Mobile側で(確認用に)使用しているCodeVerifierとCodeChallengeは以下の資料に載っているものなのでこちらが間違っているとは考えにくい。
https://tools.ietf.org/html/rfc7636#appendix-B
サーバサイドから与えられた情報から判断すると、CodeVerifierをsha256にかけた後は
`13d31e961a1ad8ec2f16b10c4c982e0876a878ad6df144566ee1894acb70f9c3`
となっており同じなのでおそらく正しい。
となるとBase64にかけたときに問題が起こっている。
期待値は以下。
`E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM`
かけた結果として提示された値が以下。
`MTNkMzFlOTYxYTFhZDhlYzJmMTZiMTBjNGM5ODJlMDg3NmE4NzhhZDZkZjE0NDU2NmVlMTg5NGFjYjcwZjljMw`

# そもそもChallengeはどうのようにして作られるか
1. 48~128までの値Aを用意します。
2. Aに対しsha256をかけた値をBとします。
3. Bに対してunpaddedかつurl-safeなかたちでBase64をかけた値をCとします。
4. CをChallengeとして使います。

# どのようにして実装したか
```go
package main

import (
	"fmt"
	"encoding/base64"
	"crypto/sha256"
)

func main() {
	codeVerifier := "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
	codeChallenge := "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM"

	converted := sha256.Sum256([]byte(codeVerifier))

	fmt.Println(converted)

	based := base64.RawURLEncoding.EncodeToString(converted[:])

	fmt.Println(based)

	result := codeChallenge == based

	fmt.Println(result)
}
```

# 何がいけなかったか
ソースコードは見てないので断定できませんが、おそらくconvertedをhexでstringにしてそれをさらに[]byteにしたものをbase64にかけていたのだと思われる。
(このやり方だと提示された結果と同じ結果が得られた)

# 終わりに
とりあえず動くようにはできたので満足。
担当範囲おかしくなってない？とか思ったりもするけれどGo言語の勉強にもなったのでそれで自分を納得させている。
わりとGo言語好きかもしれない。
PKCEとは、っていう記事はそこそこ見るものの、PKCEをどう対応するか、とかは少ないのでもっと増えるといいなと思ったりする。
まぁMobileはAppAuthがあるのでそれを使ったら終わりなんですが…
Goの様々な知見

# 自分がGoぶつかった課題の解答をまとめます

## #1ファイルをGCSに上げるときにぶつかった

```go
//リクエストのファイル取得
file, handler, err := this.Ctx.Request.FormFile("file")
//コンテキスト作成
ctx := context.Background()
//トークン使ってクライアント作成
client, err := storage.NewClient(ctx, option.WithCredentialsFile("/go/src/keipass-api/conf/xxx.json"))
//バケットと名前指定して
writer := client.Bucket("xxx").Object("xxx.png").NewWriter(ctx)
//保存
writer.Write(file)　<-ファイルがバイナリじゃないって怒られる
```

multipart.Fileはio.Readerインターフェースを実装しているため、次のようにそのコンテンツをbytes.Bufferにコピーする。

```go

file, header, err := ctx.Request.FormFile("file")    
defer file.Close()
if err != nil {
    return nil, err
}

buf := bytes.NewBuffer(nil)
if _, err := io.Copy(buf, file); err != nil {
    return nil, err
}
```

## #2 Google Storageの権限付与 

```go
client, err := storage.NewClient(ctx)
writer :=　client.Bucket("xxx").Object("xxx.png").NewWriter(ctx)
//ACLに権限情報を埋め込む
writer.ACL = []storage.ACLRule{{Entity: storage.AllUsers, Role: storage.RoleReader}}
```
CentOS VPSのrootログイン禁止設定

##SSHでのrootログインは危険
VPSでサーバーを立ち上げるとほとんどのサーバーでrootログインができるようになっています。

そうしないと、初期設定ができないので…。

サーバーを立ち上げたらまずはrootログインを禁止したいところです。

##サーバー環境
代替のLinuxで同じことが可能ですが、下記の環境を前提としています。

- サーバー：ConoHa VPS
- OS：CentOS 7.7

##root以外のユーザーからssh接続する

###ログインユーザー作成

管理者ユーザー（srvadmin）を作成。名前は何でもOK。

```
# useradd srvadmin
```

パスワードを設定

```
# passwd srvadmin
```

管理者のwheelグループに追加

```
# usermod -aG wheel srvadmin
```

### rootログインの禁止設定

wheelグループのみがroot昇格可能に。

```
# vi /etc/login.defs
```

以下の行を最終行に追加して変更を保存します。

```/etc/login.defs
SU_WHEEL_ONLY yes
```

rootでのログインを禁止に。

```
# vi /etc/ssh/sshd_config
```

```/etc/ssh/sshd_config
PermitRootLogin yes -> noに変更
```

### SSHDのリスタート

```
# service sshd restart
```

##おわり

以上です。簡単に終わると思います。
他にもSSHDのポートを22から変更する、パスワードではなく証明書でsshログインを許可するなどありますが、パスワードを10文字以上英数字大小+記号で組み合わせればそう簡単に破られるものではありません。
【Rails】Slack通知

RailsでSlackに通知を送ってみたいと思います。
今回 `slack-notifier` というGemを使用します。
また、環境変数を `dotenv` Gemを用います。

## Slack-notifierインストール

Gemfileに下記を追加

```ruby:Gemfile
gem 'slack-notifier'
gem 'dotenv'
```

bundle install

```bash:
$ bundle install
```

## Slack WebHooks URL取得

WebHooksURLを取得します
まずはSlackの`歯車`>`アプリを追加する`をクリックします

<img width="992" alt="スクリーンショット 2019-11-10 16.05.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217504/d90de4ec-4927-3461-bd12-97db0924b2ee.png">

次に、`Incoming WebHooks` を検索し、インストール

<img width="719" alt="スクリーンショット 2019-11-10 16.06.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217504/d6980b10-7ba3-f77d-727d-c96aa0c951c4.png">

そして、Slackに追加をクリック

![スクリーンショット 2019-11-10 16.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217504/bbe3536d-82a0-c2f5-5b4a-371e2987b567.png)

追加すると、チャンネル選択画面に遷移するので通知をさせたいチャンネルを選択しましょう

![スクリーンショット 2019-11-10 16.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217504/174894e8-1a9a-9482-4c5d-26ac1b33b27c.png)

`Incoming Webhookインテグレーションの追加` を押すと次の画面で、
`Webhook URL` が表示されるので、コピーしておきましょう


## Slack-notifier実装

使用する環境変数を `.env` に追記
先ほどコピーした`Webhook URL`と通知させたいチャンネルを環境変数にする

```ruby:.env
WEBHOOK_URL=https://hooks.slack.com/...
CHANNEL=general
```

slack-notifierを実装する
通知させたい場所に下記を追記する

```ruby:
notifier = Slack::Notifier.new(
  env['WEBHOOK_URL'],
  channel: '#' + env['CHANNEL']
)
notifier.ping '通知するテキスト'
```

これで通知処理が実装できました！
すごく簡単に実装できて楽だな〜と思いました
宇科連63から見た超小型衛星／CubeSatの制御を行うOBC（OnBoard Computer）の動向

[第63回宇宙科学技術連合講演会](https://branch.jsass.or.jp/ukaren63/)［主催 日本航空宇宙学会 2019/11/06-08 アスティとくしま（徳島市）］に11/7～8の２日間参加しました。 聴講した講演の中から超小型衛星／CubeSatの主制御を行うOBC（OnBoard Computer）について記します。

![20191106_233753243_iOS.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112480/a1745335-f598-ac42-d75b-a1b654e51ac0.jpeg)

## 全体を通して

　もう、FPGA搭載はあたり前になったようです。放射線に対する信頼性の点で使われないというイメージだったのですが、古い話だったのかもしれません。インタフェースや信号処理に用いるとCPUよりも高速化できますし、カスタマイズができますから、利点は計り知れません。ただ、SoCではなく、CPU + FPGA という使われ方のようなので、CPUはFPGAとバス接続ができるものに限定されてくると思います。

　ユーザサイドとして、放射線耐性への関心が高いようで、ボードやモジュールを開発するにあたってはトータルドーズとシングルイベントの試験結果が問われていた。

## 講演より
### 2M12 並列処理指向型光再構成型ゲートアレイVLSIにおける回路実装
〇伊藤 嘉俊,渡邊 実（静岡大）

 FPGAのコンフィグレーションはリセット解除毎に行う必要があり、データ転送をシリアルで内部回路上を数珠つなぎで行うため、放射線によりどこかがダメージを受けるとコンフィグレーションができなくなるという欠点がある。コンフィグレーションの手段として、ゲートアレイ上に発光素子を配置し、発光によって書き込むしくみのようである。

### 2M13 超小型衛星搭載用ソフトコアプロセッサの検討
〇名座 広一,伊与田 健敏（創価大）

Negai☆（2010年打ち上げ）以来の衛星で、民生品FPGAの宇宙実証を目指す。

　FPGAのプロセッサコアとしてRISC-V（32IM）を採用、ARMと比べ、オープンソース、簡潔性が高い、モジュラー型で粒度が高いという利点がある。一方、ソフトウェア開発環境はLinux（Ubuntu）上でクロスコンパイルとなり、環境構築に苦労したそうだ。
　MAX10＋RISC-Vコアの構成（うろ覚え）で、CanSatの投下実験を行った。SPI I/Fの不調でSDにデータが記録されなかったが、現在この問題は解消された。

### 3K06 高機能CubeSat用OBCの軌道上実証
谷本 和夫,萱場 英毅,〇永峰 健太（明星電気）

 明星電気さんはこれまでに宇宙機搭載用デバイスを開発してきたが、CubuSat用OBCの問い合わせを数多く受けている。CubuSat用のOBCは数多くあるもののユーザは海外製品や内製化に頼っているのが現状だそうである。

ユーザの要望として

* カスタマイズできる
  * ミッションが多様でありそのまま使えることはまれ
* 軌道上実績や信頼性がある
  * OBCの実証が目的ではないので、実績のあるものを利用したい
* 国産である
  * クイックレスポンスや輸出入管理の問題

が挙げられる。
そこで、CubeSat用OBCを革新的衛星技術実証２号機で打ち上げられる3U CubeSatに搭載し、軌道上実証を行う。

　PC/104規格に穴位置を合わせた２段スタック、CPUはSH2の車載用グレード（国立大学の衛星すら具体的なデバイスを明かさないなか型名を外部公開するのはめずらしい）で、FPGAによりデバイスとのインタフェース（UART, SPI, GPIO, etc.）が提供される。また、通信プロトコル(?)としてCCSDSがサポートされる。ユーザが利用できるようドライバAPIとサンプルプログラムが提供される予定。
　FPGAも車載用なら宇宙でもいけそうとのことだった。

### 3K07 高専連携技術実証衛星KOSEN-1について
〇今井 一雅（高知高専）,平社 信人（群馬高専）,高田 拓（高知高専）,北 村 健太郎（徳山高専）,中谷 淳（岐阜高専）,村上 幸一（香川高専）,徳光 政弘（米子高専）,KOSEN-1 チーム

　高専スペース連携のCubeSatとして、こちらも革新的衛星技術実証２号機で打ち上げられる予定

　メインOBCは、Raspberry Pi ZEROをSO SIMMカードのようにしたRaspberry Pi Compute Module (CM1)とCM1用アダプタボードを元に(?)CubeSat用にカスタマイズした「CubePi」からなる。CM1は、ZEROのピンヘッダよりもI/Fが拡張されているようだ。

メインミッション

1. DUALリアクションホイール
逆方向に回転させると打ち消しあう性質があるので、回転に差を持たせることにより高精度の姿勢制御が可能になる。また、使用しないときは回転を止める使用しないときは停止できる。

2. 木星電波の観測
巻き尺方式で収納したダイポールアンテナを展開し、ダウンコンバータ＋SDRで受信する。

　通信系は西無線の送信機＋受信機＋CubeCom（I/Fボード）。西無線は小型化されたあたらしいものとのこと

### 3K08 ソニー製 超低消費電力プロセッサ搭載ボード「SPRESENSE」の宇宙へのチャレ ンジ
〇太田 義則（ソニーセミコンダクタソリューションズ）,堀井 昭浩（ソニー）

* SPRESENSE
  * ARM Cortex-F4Fコアを６個を搭載した低消費電力マイコン
  * オープンソースハードウェアとして各社から対応したモジュールが出されている。
* 宇宙用ではなく民生用
  * 放射線耐性は、500km軌道上のシングルイベントで、マイコンが月に１回程度、カメラは１回未満となっている。
  * 搭載にあたってはJAXAのサポートにより多数決回路等を搭載する。

目的「宇宙を近くする。AIを身近にする」

* GUIツールで作詞絵したAIをSPRESENSEで動作させることができる。
* 軌道上で撮影した地球画像を地上で学習させ、位置を割り出したり、収集したデータとサンプルをデータセットとして公開し、活用してもらったりコンテスの開催を考えているようだ。

本記事は、講演の聴講メモを元にしており、記憶違い、聞き違いにより記述内容に誤りがある恐れがあることをお断りしておきます。
【React】学習記録（１）

React学習の日々の学びをアウトプットします。

####状態
>■学習教材：Progate　React学習コース
■学習目的：React nativeを利用してAndroid,iOSで両方使えるアプリを作れるようになる
■学習レベル：学習１日目
■プログラミング学習歴：６ヶ月
■プログラミングスキル：
初心者
java scriptの基本的文法学習済
ruby on railsでwebアプリが作れる
swiftで簡単なiOSアプリを作れる

##React基本形
```react:sample.js
import React from 'react';

class App extends React.Component {
 render() {
//JSでのコメント
   return (
{/* JSXでのコメント　*/}
      <div>
       <h1>Hello World</h1>
       <p>Study React</p>
     </div>
   );
 }
}

export default App;
```
・その中はJSX（HTMLのようなもの）で表記されている
・return内は1つの要素にまとめる必要あり


##その他お約束
```react:sample.js
import React from 'react';

class App extends React.Component {
 render() {
const text = 'Hello World'
   return (
      <div>
      {/*JSX内では{}でJSが表記できる*/}
       <p>{text}</p>
     </div>
   );
 }
}

export default App;
```

##イベントについて
```react:sample.js
<button イベント名={()=>{処理}}></button>
```
`()=>{処理}`の部分がJSのアロー関数のため、{}で囲む必要あり
[アロー関数についてはこちらから](https://qiita.com/mejileben/items/69e5facdb60781927929)

##Stateについて
ユーザーの動きによって変わる値を`state`と呼ぶ
stateは、`constructor`の中で、オブジェクトとして定義する

```react:sample.js
constructor(props) {
    super(props);
//this.state = {プロパティ名:値}
    this.state = {name:'Hi！'}
  }

//stateの変更
//this.setState({プロパティ名: 変更する値})
this.setState({name: 'Hello!'})
```
##メソッドについて
```react:sample.js
constructor(props) {
    super(props);
    this.state = {name: 'Hi！'};
  }
  
  // メソッドを定義
  Click(name){
    this.setState({name: name});
  }
.
.
.
//this.メソッド名()とすることで、イベント内でメソッドを呼び出す
<button onClick={() => {this.Click('Hello')}}>Hello</button>
```
New Gradle Sync is not supported due to containing Kotlin modules

IntelliJで掲題のエラーが出た際のメモ

私の場合は下記のように解決

[IntelliJ IDEA] -> [Preferences...] -> [Languages&Frameworks] -> [Kotlin] 
ここでプラグインをダウンロードを押下、処理終わり再起動すると下記のような画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8350/4fe048dd-913d-4846-ca28-0cf9a17e94b0.png)

上記がKotlinPluginのバージョンであるため、上記のバージョンに `build.gradle` も合わせる必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8350/b2058394-8102-84a3-7f7c-771be3aadd62.png)

こんな感じ、とりあえずこれで解決
Jenkins Scripted PipelineとDeclarative Pipnelineについて

こちらは[Jenkins Advent Calendar](https://qiita.com/advent-calendar/2019/jenkins) 1日目の記事になります。

JenkinsのDeclarative PipelineとScripted Pipelineについて説明します。

JenkinsはJobをシェルスクリプトやGroovyで定義します。

JenkinsのPipelineはGit等のバージョン管理でJobを定義したスクリプトファイルを管理し、必要に応じてそのファイルを呼び出し実行することが出来るJenkins 2から導入された機能です。


## Scripted Pipeline

パイプラインを命令型プログラミング（手続き型プログラミング）で記述されます。Groovyでのプログラミングに依存しエラーのチェックや例外処理等もGroovyで実装されます。

### 利点

* コードの記述量が少なく済み構造を決めなくても良い
* 手続き型プログラミングでコードが書ける
* Jenkins本来のPipelineの書き方に近い
* 柔軟性があり複雑な処理を書きやすい

### 注意点

* プログラミングスキルが要求される
* シンタックスチェックがプログラムに依存しユーザー側で実装する必要がある
* 処理によってはDeclarative Pipelineで記述するより複雑になる場合がある

## Declarative Pipeline

宣言型プログラミングで記述されます。Pipelineを構成するそれぞれのセクションが構造的に明確に分離された記述になります。

### 利点

* 構造的でプログラムが書きやすい
* Pipelineのコードを読んだ時に（一般的にはScripted Pipelineより）読みやすい
* Pipelineの中に通知、Post処理等の機能が組み込まれているため自分で実装しなくても良い
* シンタックスチェックがありエラー出力が読みやすい
* 順次処理が書きやすいためPipelineに一貫性を持たせることが出来る

### 注意点

* プログラムの書き方が制限させる
* 比較的新しい技術のため未対応のJenkinsの機能やプラグインがまだまだある
* 複雑な処理は書きにくい

## どちらのスタイルを採用するか

１つの指針としてはDeclarative PipelineはJenkins Pipeline初心者には理解しやすく学習コストも低い傾向にあります。初心者はDeclarative Pipelineから採用すると良いかと思われます。

ただDeclarative Pipelineは制限も多いためDeclarative Pipelineでは処理を実装しにくい場合はScripted Pipelineを採用すると良いでしょう。
「ポモドーロ・テクニック」を1週間やってみた感想

# ポモドーロ・テクニックとは

簡単に言うと**作業(めっちゃ集中して25分)→休憩(5分)**を１ポモドーロとし、4ポモドーロ繰り返したら**休憩(20分)**といったような流れで作業を進めていくテクニックです。
元々、ソフトウェア・エンジニアの方が発明したテクニックで、最近ではメンタリストDaiGo氏の書籍↓でも紹介されています。
[自分を操る超集中力](https://www.amazon.co.jp/dp/4761271760/ref=cm_sw_r_tw_dp_U_x_.L6XDbAKG1N9X)

# 実際にやってみて

相性が**良い**と思ったもの

- 勉強
- 読書
- 単純作業

相性が**悪い**と思ったもの

- プログラミング
- クリエイティブな作業

正直、プログラミングやクリエイティブな作業にはあまり向かないかなと思いました。プログラミングについては思考を止めずひたすら考え込む時間というのはとても大切になってくるので、25分で区切られたら逆に効率は出ないと感じました。。

**しかし！！勉強とか読書については本当に素晴らしいテクニックだと思いました！！**
あくまで私個人の感想という前提ですが**約３倍**程の効率アップを感じました！
この25分っていう時間設定が絶妙なのでしょうね！これ以上、多い時間でも少ない時間でもダメな気がします。
ただ、これめっちゃ疲れます。。私は休日に試してみたのですが、4ポモドーロが限界でした。それでも、その日予定していた勉強量を遥かに凌駕する結果を得られたのですが。

# まとめ

私がこのポモドーロ・テクニックなるものを知ったきっかけは以下の本です。
[SOFT SKILLS　ソフトウェア開発者の人生マニュアル   ジョン・ソンメズ ](https://www.amazon.co.jp/dp/B01GDS0994/ref=cm_sw_r_tw_dp_U_x_he7XDbESPJYTY)
この本には、エンジニアとして身に着けるべき色々な技術が記載されていて、とてもためになりました。ぜひエンジニアの方には読んでいただきたい一冊です！

この本の著者も実践しているポモドーロ・テクニックですが、著者自身も最初は6ポモドーロが限界だったようです！
ただ、実践していくうちに自分の集中力も鍛えられていくようで、今では1日10ポモドーロ、1週間で50ポモドーロを実践し莫大な生産性を上げているようです。
私もまだまだ4～5ポモドーロでへばっていますが、コツコツ頑張って**1日10ポモドーロ**を目指して頑張っていこうと思います！
この記事を読んでくださった皆様もぜひお試しあれ！！

# 参考
ポモドーロ・テクニックをサポートするアプリも色々あるみたいです。
[無料で使えるポモドーロアプリ](http://app-field.com/pomodoro-technique-app)
[Xamarin] Essentials

Xamarin開発において端末APIにアクセスすることができる便利なクラス

こちを参照しました
https://docs.microsoft.com/en-us/xamarin/essentials/

すべてを使ったことがあるわけではありませんが、下記が一覧。むしろ使ったことないもののほうが多いので、使うときにまた別途詳しくまとめます。

# Essentials

| 名前 | 概要 |
|:--|:--|
|Accelerometer | Retrieve acceleration data of the device in three-dimensional space.
|App Information | Find out information about the application.
|Barometer | Monitor the barometer for pressure changes.
|Battery | Easily detect battery level, source, and state.
|Clipboard | Quickly and easily set or read text on the clipboard.|
|Color Converters | Helper methods for System.Drawing.Color.|
|Compass | Monitor compass for changes.|
|Connectivity | Check connectivity state and detect changes.|
|Detect Shake | Detect a shaking movement of the device.|
|Device Display Information | Get the device's screen metrics and orientation.|
|Device Information | Find out about the device with ease.|
|Email | Easily send email messages.|
|File System Helpers | Easily save files to app data.|
|Flashlight | A simple way to turn the flashlight on/off.|
|Geocoding | Geocode and reverse geocode addresses and coordinates.|
|Geolocation | Retrieve the device's GPS location.|
|Gyroscope | Track rotation around the device's three primary axes.|
|Launcher | Enables an application to open a URI by the system.|
|Magnetometer | Detect device's orientation relative to Earth's magnetic field.|
|MainThread | Run code on the application's main thread.|
|Maps | Open the maps application to a specific location.|
|Open Browser | Quickly and easily open a browser to a specific website.|
|Orientation Sensor | Retrieve the orientation of the device in three-dimensional space.|
|Phone Dialer | Open the phone dialer.|
|Platform Extensions | Helper methods for converting Rect, Size, and Point.|
|Preferences | Quickly and easily add persistent preferences.|
|Secure Storage | Securely store data.|
|Share | Send text and website uris to other apps.|
|SMS | Create an SMS message for sending.|
|Text-to-Speech | Vocalize text on the device.|
|Unit Converters | Helper methods to convert units.|
|Version Tracking | Track the applications version and build numbers.|
|Vibrate | Make the device vibrate.|
【ショートカット実践】VSCodeにVimを入れるまで

#前書き
ここ最近いろいろ面倒です。
正直ポインターを動かすことすら億劫に感じます。
なので、ショートカットとコマンドを駆使して、
ポインターをできるだけ使わない方法を模索してみようと思いました。
その手始めとして、VSCodeにVimのプラグインを入れてみることにしました。

#以下手順

##電源を入れる
電源ボタンをポチッ。

##パスワードを入力する
キーボードをカタカタ。

##検索を開く
Win + s

##VSCodeを開く
「vscode」 -> ENTER

##Extensions（拡張機能）を開く
CTRL + SHIFT + x

##プラグインを検索する
「vim」

##プラグインを選択する
CTRL + ↓ -> ENTER

「Vim」というプラグイン名だったらOK

##プラグインをインストールする
最初にして最後のポインター操作。
インストールボタンをポチッとな。

これでVSCodeにVimのプラグインを入れることができました。

#まとめ
ショートカットを利用すれば、起動してからインストールまで
ほとんどポインターを動かすことなくできるということが分かりました。
また、ショートカットであれば操作内容が一意に決まるということも
一周回って初学者にやさしいのかもしれないと思いました。

今度はコマンド実践の記事を書けたらと思います。

#参考資料
・[Windows のキーボード ショートカット](https://support.microsoft.com/ja-jp/help/12445/windows-keyboard-shortcuts)
【備忘録】GitHubのアカウント削除手順

# 概要
GitHubのアカウントを削除する時の備忘録です。
残しておく必要があるものはバックアップしておきます。
アカウント削除は自己責任でお願いします<(_ _)>

# GitHubのアカウントを削除する
[GitHub](https://github.com/)のページを開き、「Sign in」を行います。
右上のプルダウンメニューから「Settings」を選択します。
![アカウント削除1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/da052cc2-bbc4-2773-6404-1aad1268a2a9.png)
Settingsページの左端メニューで「Account」を選択します。
![アカウント削除2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/6bd9aeb4-a878-926a-0c73-9777d58be6c7.png)
一番下の「Delete your account」を選択します。
![アカウント削除3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/574712e3-5bab-f790-c7cd-6e85263d065f.png)
2段目の入力欄に「delete my acount」と入力して「Cancel plan and delete this account」を押下します。

以上です。
railsアプリを新規作成し、gitで管理する


#本日学習したこと
- railsプロジェクトを新規で始める際のGit & GitHubの使い方





まず、自分のGitHubアカウントにログインします。
ログインしたらヘッダーの右側のプラス(＋)アイコンをクリックするとプルダウンメニューが表示されるので[New repository]をクリックします。


[![Image from Gyazo](https://i.gyazo.com/30ff7d37cc9f4835365df6e731d104e0.png)](https://gyazo.com/30ff7d37cc9f4835365df6e731d104e0)



そうするとリポジトリを新しく作成する画面に遷移するので[Repository name]に作成したいアプリケーションの名前を入力します。

[![Image from Gyazo](https://i.gyazo.com/0cc5b7c994e87ed1c22726e30c5befcc.png)](https://gyazo.com/0cc5b7c994e87ed1c22726e30c5befcc)


リポジトリの名前を入力したら[Create repository]をクリックするとリモートリポジトリが作成されます。

作成したリポジトリのTOPページに遷移し、[Clone or download]をクリック、httpsのURLをコピーしておきます(ローカルとリモートのリポジトリをリンクさせるのに使います)

[![Image from Gyazo](https://i.gyazo.com/52f2007c9fde6fe7c9b4bb7e5e0f6ae3.png)](https://gyazo.com/52f2007c9fde6fe7c9b4bb7e5e0f6ae3)

```ruby:ターミナル

#現在のディレクトリにローカル用のリポジトリを新規作成する(まだあまり理解できてない;;)
$ git init

#DBはmysqlを使用してrailsアプリを新規作成している(クローンしたディレクトリを上書きする)
$ rails new ProjectName -d mysql
#railsのバージョンを指定する場合
$ rails _〇.〇.〇_ new ProjectName -d mysql #〇にrailsのバージョンを指定する

#変更したファイルをGitの管理下に置く
$ git add .

#git add .で管理下にしたファイルをリポジトリに反映させる(allow-emptyオプションを使用するとソースを変更していなくてもコミットできる)
$ git commit --allow-empty -m "first commit"

#どのリモートリポジトリと接続するか設定する
$git remote add origin 先ほどコピーしたURL

#ローカルリポジトリの変更をリモートリポジトリへ反映している(masterブランチで作業したので自動的にMargeされている)
$ git push
```

projectを作成し、gitとGitHubで管理もできたので早速 rails s コマンドで
applicationを起動しようと思います。


[![Image from Gyazo](https://i.gyazo.com/9fe5b14dab9083cf2e6da1925bba8ddc.png)](https://gyazo.com/9fe5b14dab9083cf2e6da1925bba8ddc)

Errorが表示されました。
これはよくネットでも転がってるやつなので簡単に処理できました。
データベースがないと言われてます。
なのでデータベースを作成しようとおもいます。

```ruby:ターミナル
#DB作成
$ rake db:create

#サーバー起動
$ rails s
```

[![Image from Gyazo](https://i.gyazo.com/d26fe96510cd7fa32d2c2e171d9a2a46.jpg)](https://gyazo.com/d26fe96510cd7fa32d2c2e171d9a2a46)

でけた！



# 本日の反省
- gitコマンドがまだよくわかっていない。(使ったコマンドについては詳細を学習しておく)
- git remote addコマンドを使ってできるようにもなっておきたい(なるべくコマンドで操作したい)




初学者なのでたくさん間違ってるところやもっと簡略化、もしくは別の方法がいいなどの意見があると思います。そういったご意見、ご指摘をいただけると励みになります。
ローカル環境なのでたくさん間違えてたくさん学習するをモットーに頑張っていきます。






#追記
2019/11/17
ローカルとリモートの接続の仕方がおかしかったみたいなので修正しました。

- 修正前の手順

>```ruby:ターミナル
># 新しく作成したリモートリポジトリをローカル環境にクローンする
>$ git clone 先ほどコピーしたURL
>
>#現在のディレクトリにローカル用のリポジトリを新規作成する(まだあまり理解できてない;;)
>$ git init
>
>#DBはmysqlを使用してrailsアプリを新規作成している(クローンしたディレクトリを上書きする)
>$ rails new ProjectName -d mysql
>
>#変更したファイルをGitの管理下に置く
>$ git add .
>
>#git add .で管理下にしたファイルをリポジトリに反映させる
>$ git commit -m "first commit"
>```



わざわざクローンした上で新しいプロジェクトを作成して上書きしている。;;
【VBA】【関数】効率化のためのメモ

##全般的なこと

####ボタン
リボン＞開発を表示する
挿入＞選ぶ
マクロ名選択
移動とか編集とかするときは、開発＞デザインモード

####VBEditor ショートカット
VBEditorを開く：`Alt + F11`
ヒント表示：`Ctrl + I`
入力補完：`Ctrl + Space`
変数一覧(ローカルウィンドウ)：`Alt → V → S`
エディタ設定： `Alt → T → O`
　キーワードをピンクにするのがオススメ。
実行：`F5`
一行ずつ：`F8`
ブレークポイント：`F9`

##具体的なコード


####インプットボックス
`Application.InputBox(Prompt:="必要な列数は？(1～8)", Type:=1)`
Type:=1は数値。2は文字列。4はTrue/False

####列の非表示
`Range(Columns(Honsu + 3), Columns("J")).Hidden = True`
+3は、1列目(D)までの固定列

####一列目・一番下のデータの次のセル
`Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select`

####選択範囲の可変値(=関数以外)を削除する
```vb
Sub 可変値削除()
Dim ra As Range
Range("C3", "J53").Select  '対象範囲を選択。範囲が増えたらここも増やす必要あり
For Each ra In Selection
    If ra.HasFormula Then
        ra.Interior.Color = RGB(220, 220, 220) '関数だったら灰色にする
    Else
        ra.ClearContents '関数じゃなかったら値を消去する
    End If
Next
Cells(3, 3).Select
End Sub
```
\`\`\`vb
この中にVBAのマクロを書くと、上のようにスタイリッシュになるなんて知らなかった。
\`\`\`

##関数

####横方向に並んだデータを、縦方向に並べ替える
`=OFFSET($A$1,0,ROW()-2)`
元データは、A1、B1、C1…と並んでいて、それをA2、A3、A4…に転記する場合の例。
末尾の2は、並べ替え先の始点となるセル(ここではA2)の行番号。始点セルだと2-2=0になり、A1の値を返す。並べ替え先の次のセルでは、ROWが1つ増えて3-2=1でOFFSETの列指定が1つ増え、B1の値を返す。
元データの始点を絶対参照にすることで、A2の関数をA3、A4…にコピーしても動作する。
####縦方向に並んだデータを、横方向に並べ替える
`=OFFSET($A$1,COLUMN()-2,0)`
縦横(行・列)を逆にしたもの。OFFSETの行指定のところに、列＝COLUMNを参照した値を入れることで、列の移動を行の移動に置き換えることができる。

####関数の置換
A1セルに「=元データ!\$C$1」という関数が入っていて、それを上記の関数に置換したい時。
`="=OFFSET("&SUBSTITUTE(FORMULATEXT(A1),"=","")&",0,ROW()-2)"`
FORMULATEXT関数で、関数の結果ではなく関数自体を参照できる。
あとはコピーして値貼り付けして、F2→Enterを繰り返す
レイマーチングで使われるSDFを解釈する~Part1~

#はじめに

- Part1(基礎編)(ここ)
- Part2(円柱編)
- Part3(角柱編)
- Part4(SDFの加工編)


こんにちは、アドベントカレンダー9日目の避雷です。レイマーチングをするにあたって必要不可欠な関数に「距離関数」というものがあります。コピペや暗記してしまえば何も考えずに使えるこれらの関数ですが、ちゃんと考察してみると面白い気づきがあったりします。
今回はレイマーチングにおいて描画処理の根幹を担う距離関数について数学的な解釈をしたいと思います。
#本編
##そもそもSDFとは
SDFとはSignedDistanceFunction（符号付距離関数）の略で、一般に以下の形で定義される関数です。

```math
f:R^n \rightarrow R　(nは通常2,3) \\
f(r) < 0 (rが物体内面にあるとき) \\
f(r) > 0 (rが物体外面にあるとき) \\
|f(r)| = 物体表面からの距離
```

要するにある点Pと描画対象の物体との距離を取り、内側なら-1 外側なら 1 をかけるって感じの関数です。内側・外側の概念がある以上取り扱えるのは閉曲面だけな気もしてきますが、そこらへんは上手く誤魔化すことができます。
定義だけ見てもイマイチピンとこないと思うので、実際の関数を見てみましょう。

##球
球の描画は以下の関数で行われます。

```glsl
float map(vec3 p,vec3 origin,float radius){
	return length(p - origin) - radius;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/1da5897e-e2a1-2830-8943-6f1e55a1a288.png)

「距離」の定義によっては同等な式でも全く違う図形が出力されます。glslのlengthでは距離を以下のように定義しています。

```math
d(a,b) = \sqrt{(a_1 - b_1)^2 + (a_2 - b_2)^2 + (a_3 - b_3)^2}
```

コレとは別に自前でlength_2みたいなものを定義してあげると、例えばManhattan距離での実装ができたりします。

```math
d(a,b) = |a_1 - b_1| + |a_2 - b_2| + |a_3 - b_3|
```

Manhattan距離での実装だと球はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/e6eeb49f-2d85-d6b5-a3c4-1f548e0067c6.png)


新しく作る「距離」はある程度滅茶苦茶でも良いのですが、描画結果が納得いくものであるためには距離の公理を満たしていると良いと思います。集合位相論的な「距離」についてはここでは詳しく扱いません。
##AND|OR演算について
レイマーチングでは 引数の最大値を返すmax,引数の最小値を返すminを使って複数の立体の合成、くり抜き、共通部分のみ抽出、という操作をすることができます。

##直方体
よく使われる直方体のSDFはこんな感じです。

```glsl
float map(vec3 p,float size){
    return max(abs(p) - size / 2.);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/6075f593-8196-5a13-3b88-5347ed51be97.png)

これは実は近似的な関数です。下のような例を見れば、このSDFは厳密には誤りであると言えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/c7aea1e2-508b-7c3f-1632-8e16d0821da3.png)

どうですか？結構雑じゃない？　この近似がなぜ許されているかと言うと、近似との誤差が出る部分は全部最短距離が辺の上に乗るため実質描画されないからです。

この関数の別の解釈としては、先述のAND|OR演算を利用して、3枚の壁の共通部分のくり抜き、とすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/4ca6257d-2c1c-aa63-cb44-e7fdd1c3a51e.png)



##法線取得
レイマーチングについて、物体表面の法線ベクトルの取得は以下の関数`getNormal`で行われます。

```glsl
const float EPS = 0.001;
vec3 getNormal(vec3 p) {
    return normalize(vec3(
        map(p + vec3(EPS, 0.0, 0.0)) - map(p + vec3(-EPS,  0.0,  0.0)),
        map(p + vec3(0.0, EPS, 0.0)) - map(p + vec3( 0.0, -EPS,  0.0)),
        map(p + vec3(0.0, 0.0, EPS)) - map(p + vec3( 0.0,  0.0, -EPS))
    ));
}
```

この関数で行っていることはシンプルで、x,y,z成分での偏微分を求め、その値をx,y,z成分に持つベクトルを生成しています。ベクトル解析を齧ったことがある人ならGradientを算出している、と表現するとわかりやすいと思います。
#おわりに
ざっくり基礎的な部分について書いてみました。次回はもうちょっと複雑な図形についても解説が出来たらよいなと思います。
開発やデバッグが捗るPythonライブラリ6選

# 目次

1. [概要](#a)
2. [動作環境](#a)
3. [紹介するPythonライブラリ](#a)
  - flake8
  - pyformat
  - isort
  - mypy
  - bpython
  - ipdb
4. [最後に](#a)

# 概要

仕事でよくつかうパッケージからプライベートで開発するときに、必ずインストールしているパッケージをまとめて紹介してみた。
データサイエンス系の人はJupyterを使うと思うのでWeb開発向きだと思います。
DjangoなどWebフレームワークを使うときは便利な専用のパッケージもありますが本記事には記載してないです。
パッケージ管理はPipenvやpoetryなど有名なものがあるがこの記事では書いてないです。

## 動作環境

筆者の動作環境。
環境に依存したパッケージはないはずだが念の為。

MacOS
Python 3.8.0
anyenv 1.1.1
pyenv 1.2.15-1-g49bf5952

# 紹介するPythonパッケージ

## flake8

https://pypi.org/project/flake8/

```bash

$ pip install flake8
```

プロジェクト内のコードがpythonのコーディング規約「PEP8」に沿ったスタイルになっているかチェックしてくれるライブラリです。
いわゆるLinter（リンター）の一つです。
Linterには普通の「pep8」や「pyflakes」というものがありますが,
flake8はこの２つのLinterの機能を合わせ持っており、より厳格にコーディングチェックができます。
なので、誰が書いても良い意味で同じようなコードになり見通しの良いコードを書くことに繋がります。

## pyformat

https://pypi.org/project/pyformat/

```bash

$ pip install pyformat
```

formatter（フォーマッター）の一つです。
Pythonのコーディング規約に則って、コードを自動で整形してくれます。
コーディングスタイルを整える時間を減らすことができ開発に専念できます。
flake8と合わせて使うと強力でしょう。
他にも「autopep8」「yapf」「black」というツールもありますが、
自分の好みやプロジェクトに合わせて選択してください。
筆者はpyformatのスタイルが好きで使ってます。

## isort

https://github.com/timothycrosley/isort

```bash

$ pip install isort
```

インポートをソートすることに特化した自動整形ツールです。

Pythonでは

```Python:sample.py
from hogehoge import foo
import sample
```

のようにインポートしてライブラリを使います。
このインポートの順番を自動でソートしてくれます。
通常のフォーマッターにはインポートの順番まで整えてくれるものがないので「isort」を使うことでそこを補います。

## mypy

https://github.com/python/mypy

```bash

$ pip install mypy
```
大規模なプロジェクトではPythonのような動的型付言語ではコードが理解しにくくなっていきます。
そこでmypyを使うと静的言語のような型を指定しチェックができるようになります。

## bpython

https://bpython-interpreter.org/

```bash

$ pip install bpython
```

pythonの対話型shellでコードの補完。文字のハイライトをしてくれる
似たもので「ipython」があるが筆者はbpythonが見やすくて使ってます。

```bash
$ bpython
```

<img width="717" alt="bpython1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299151/72cf97c8-14cc-ee5b-f371-cce53a4fa7f0.png">




## ipdb

https://pypi.org/project/ipdb/

```bash

$ pip install ipdb
```

pythonには標準で「pdb」というデバッガーツールがありますが、コード補完やハイライトはしてくれません。
そこでipythonライクにハイライト、補完してくれるのが「ipdb」です。

set_trace()でコード内にブレークポイントを設置でき、そのコードのスコープ内で宣言されている変数等がちゃんと補完されます。

# 最後に

まとめてpipインストール

```
$ pip install flake8 pyfortmat isort mypy bpython ipdb
```

Pythonには似たようなライブラリが多く技術選定に迷いがちです。
効率良く、そして気持ちよく開発するために参考になれば良いと思います。

ここのリンクには有名なライブラリがまとまっているので参考にしてみても良いかも知れません。

Awesome Python：素晴らしい Python フレームワーク・ライブラリ・ソフトウェア・リソースの数々
https://qiita.com/hatai/items/34c91d4ee0b54bd7cb8b
windows10でMAMPを起動できない備忘録

windows10でMAMPをダウンロードして、startしようとしてもエラーで起動できなかった

# 環境

・windows10

MAMPのインストール先：C:\MAMP 

#エラー状況
MAMPのスタートボタンで起動しようとすると、apache serverボタンが一瞬点いて消える→MySQLボタンだけ点灯する

apache_error.logを見てみると、

```txt:apache_error_log
[warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[warn] pid file C:/MAMP/bin/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
```


と表示

#対処
[stackOverflow](https://stackoverflow.com/questions/58296601/apache-server-will-not-start-on-mamp)
↑の人が自分と全く同じ状況
回答通り、**httpd.conf**内の**php version**を
`7.3.7` から `7.2.14`　に変更 

MAMP起動した！
理屈はほぼわかっていない
DataBase(SQL) 制約とは-概要と使い方

Databaseにて制約を実装するにあたり確認した内容を備忘録もかねてまとめてみます。
必要に応じて追記などさせていただきます。

#制約とは
制約：特定のデータの保存を許さないためのバリデーションであり、テーブルのカラムに対して制約をかけることで不正なデータや予期せぬデータが保存されることを防ぐこと。

種類は以下の通り。（主な４種類をまとめます）
- NOT NULL制約
- 一意性制約
- 主キー制約
- 外部キー制約

以降にて各項目の内容と使い方を説明します。
基本的に制約を実装した後は以下のように**マイグレーション**を行いましょう。

```terminal
$rails db:migrate
```

##NOT NULL制約
カラムに設定する制約。カラムの値にNULL（空の値）を入れられなくなる。絶対に値が必要のあるカラムに対して使う制約。
以下のようにカラムにnull: falseを追記することで実装できます。

```rb:migrate.file
t.string :カラム名, null: false
```

##一意性制約
テーブル内で重複するデータを禁止する制約。
カラムに対してadd_indexメソッドを用いることで一意性制約を付けることができます。

```rb:migrate.file
add_index :テーブル名, :カラム名, unique: true
#複数の時は以下のように記述します。
add_index :テーブル名, [:カラム名１, :カラム名２], unique: true
```

##主キー制約
主キーである属性値が必ず存在してかつ重複していないことを保証する制約。
(NOT NULL制約+一意性制約)
*Railsでテーブル作成時、主キー制約は元々実装されており、Railsの主キーは「idカラム」として自動で作成されているため、idは必ず存在して、重複しない。

##外部キー制約
外部キーに対応するレコードが必ず存在することを保証する制約。
*外部キーは異なるテーブルのレコードと関係性（リレーション）を持つ場合に必要なカラムであり、外部キーは他のテーブルのレコードとの関係性を表すために用います。

外部キーとなるカラムを追加するときにはマイグレーションファイル内に、「foreign_key: true」と記述することで、外部キー制約を設定することができます。

```rb:migrate.file
t.references :user, foreign_key: true
```

以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。
Djangoの公式チュートリアルを最初からやってみる

#どんな人に読んで欲しいか
- Djangoを気になってるけどチュートリアルが難しそうでやれずにいる人
- エラーが出て諦めた人
- 説明はいいからとにかく終わらせたい人

##環境設定は飛ばします
必要なものは
1. Python3 ->　公式サイトにzipファイルがあるのでそれで入れましょう
2. Django -> "pip"が入っている場合は"pip install django" をターミナルを起動して直ぐコピペしてください。pipがないなら入れてください

##説明の書き方について
ゼロからでもわかりやすいように下記の点を前提とします
- コードをどこに書くかはファイルパスとして書きます
- コードの自分で変えていい部分は一々明記します
- ファイルのどこどこをこう変えろ、というと変える場所がわからないかもしれないので、基本的にファイルを書き換える場合は書き換え後のファイルの中身をそのまま書きますので全選択からコピペでおkです

##１プロジェクトを作成
```
django-admin startproject mysite
```
これをターミナルに入れてください、djangoが必要なファイルを作成して規定の位置に配置します。"mysite"の部分は好きに変えてokですが"test"などの名前はシステムが後で使うのでエラーになります。ある程度固有のものにしてください。

##２サーバーを起動
```
python manage.py runserver
```
これもターミナルにコピペしてください、これをするとブラウザーからプロジェクトを見れるようになります。

```
localhost:8000
```
これをブラウザーにURLとして入れるとアクセスできます。

##３アプリケーション作成
今作ったファイル達をプロジェクトといいこの中に一つずつアプリを作っていきます。

```
python manage.py startapp polls
```

これもターミナルにコピペ。pollsという投票アプリを作っていきます。

##４viewを作る
viewとはユーザがアクセスした時に見せる物です。

``` python:view.py
from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

pollsフォルダ内のviewsファイルを上記のようにしてください、上のやつをそのままコピペして既存のやつは消しておk。
そしたらpolls/urls.pyを下記のようにする。

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

urlpatterns = [
    path('', views.index, name='index'),
]
```

最後にmysite/urls.pyを

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

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
```

となるように編集すればおkです。

後は

```
python manage.py rumserver
```
をターミナルに入れてからlocalhost:8000/pollsをブラウザで見てください、Hello, world. You're at the polls index.と出ていれば完成です。続きは次の投稿で。

### おまけ
４番のviewを作る時のHello, world. You're at the polls index.をhtml文法で書く事もできます、例えば

``` python:view.py
from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse("<h1>My First Heading</h1><p>My first paragraph.</p>")
```
これなら文章がhtmlとして表示されます。
Cookieについて

## 概要
Cookieについて調べたので備忘録として。

## Cookieとは

- ステートレスであるHTTP通信にステート(状態）を持たせる仕組み
- ログイン後のセッションIDなどの状態情報をブラウザに記録できる
- ブラウザの機能として、Cookieがセットされたら同ドメインへのリクエストに自動で一緒に送信する

## HTTP通信
<img width="915" alt="Screen Shot 2019-11-07 at 9.33.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469184/1205c1b5-40dd-37b9-d6eb-e66a9bd3a526.png">

- リクエストしてレスポンスを受け取るだけ
- 前後のリクエストは現在のリクエストと無関係 = ステートレス
- FTPはコネクションの状態を保持する = ステートフル

## 属性

|属性|意味|
|---|---|
|Name|名前 |
|Value|値 |
|Domain|ドメイン |
|Path|ドメイン下の特定のパス |
|Expires/Max-Age|保持期間 |
|HttpOnly|JavaScriptで触れるか |
|Secure|SSL/TLS(https)のリクエストにのみ付与|
|SameSite|外部ページからのリクエストに付与するか |

## セット方法
1. Set-Cookie
   サーバ側からのレスポンスヘッダーに記載

1. document.cookie
   クライエント側のJavaScriptでセット

## 保存場所
- Chromiumベースのブラウザはまずメモリに保持し30秒ごとにSQLiteに保存  
例) 
- Windows   
  C:/Users/user/AppData/Local/Google/Chrome/User/Default
- Mac  
  ~/Library/Application Support/Google/Chrome/Default

\* Expires=Session のCookieはメモリにのみ保持し、SQLiteには書き込まれない。

## Cookie関連の動向
- GDPRの施行でCookieを使ったトラッキングに規制する傾向がある。
- Safari、Firefoxは現在デフォルトでサードパーティCookieはセットされない。
  
- Google Chrome77からSameSite=None属性でSecure属性がついていないCookieのセットに警告がでる。
- Chrome80からは明示的に指定しなければ、デフォルトでSameSite=LaxでCookieがセットされ、他ドメインへのリクエストに対してCookieが付与されなくなる。

## 参考
[The Chromium Projects CookieMonster](https://www.chromium.org/developers/design-documents/network-stack/cookiemonster)
[Today’s Firefox Blocks Third-Party Tracking Cookies and Cryptomining by Default](https://blog.mozilla.org/blog/2019/09/03/todays-firefox-blocks-third-party-tracking-cookies-and-cryptomining-by-default/)
製薬企業研究者がRにおける変数についてまとめてみた

# はじめに
ここでは、R初心者向けに、「変数」について解説します。

# 変数の定義

変数を定義する際には「変数名 <- 値」という書き方をします。
真ん中の記号は、右辺を左辺に代入するという意味を持った矢印だと考えても良いでしょう。
他の多くのプログラミング言語と同様に、「変数名 = 値」という書き方もできます。

```variable_1.R
var.str = "Hello, World!"
var.int = 123
var.bool = TRUE
```

変数名には、半角英数字、ピリオド（.）、アンダースコア（_）が使えます。
変数名が2単語以上になる場合は、ピリオドでつなぐのが一般的です。
どんな値が格納されているのか、誰が見てもすぐに分かるような変数名をつけるようにします。

詳しくは下に書きますが、変数は値を更新することができます。
一方で、値を更新しないことを前提として変数（定数）を定義する場合は、変数名を全て大文字にしておくと、値の更新がない定数であることが分かりやすくなります。

```constant.R
CONST <- "定数" # 仕様上値を更新することはできる。
```

# 変数の値の参照

変数名をprint関数の引数に指定することで、値を参照することができます。

```variable_2.R
var.str = "Hello, World!"
print(var.str)

var.int = 123
print(var.int)

var.bool = TRUE
print(var.bool)

print("var.str") # 「var.str」と出力される。
```

変数名をクォーテーションで囲んでしまうと、変数の値ではなく、変数名そのものの文字列として出力されてしまうので、注意が必要です。


# 変数の値の更新

既に定義されている変数に対して、「変数名 <- 値」または「変数名 = 値」とすることで、変数の値を更新することができます。

```variable_3.R
var <- "Hello, World!"
print(var) # 定義
var <- "Hello, R!"
print(var) # 更新
```

# まとめ

ここでは、Rにおける変数について解説しました。
色々な場面で使うものなので、実際にスクリプトを書きながら理解を深めると良いと思います。

# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)
【未使用ユーザーに優しい??】Rのパッケージ強制インストール と 読み込み関係小技【R言語】

#社内、R言語してますか？

たとえばEXCELオンリー分析な社内で、
EXCEL分析から卒業してR言語分析をしていきましょ！
と言っても、今までRを使ったことない人に突然使えと言っても浸透なんてしないわけで・・・
せっかくRをインストールしてくれても、新言語は小さいこともハードルに感じてしまうもの。

そんなときは**自分で調べてみて**とか言わずに、こちらから歩み寄ることになるのが理想だよなぁ、と思ったりしてまして、
経験的に一番理解してくれるのはいくつかサンプルでコード組んで公開すること。

R言語の、動かして図が出来ていく様子や書き足されていく過程は見ていて面白いし、
コードと図が結び付くと一気に構文が理解できるようになるもの。

#しかし

サンプルコード中にライブラリとか入ってると

**「動かないよ。こっち来て教えて。」**

になってしまいかねないので、強制インストールさせてしまえばいいのでは？と。


#強制インストール!

読み込みはrequireを使います。

requireはパッケージがあればTRUEを返してからロードしてくれるので、IF文が使えます。

こんな感じにしたら

```R
if(require("zoo")){update.packages("zoo")} else { install.packages("zoo");require("zoo")}
```

もしも入っていなければインストールを動かせや。
入ってるならアップデートしろや。

という内容で走らせることができます。
公開スクリプトに書いておけばパッケージインストール方法とか説明しなくてもいいわけです！

インストールだけさせて、あとでlibrary指定するならもっとシンプルに

```r
if (!require("zoo")) install.packages("zoo")
library(zoo)
```

でもええと思います。


#そのほか


```R
.libPaths()
```

ライブラリがどこに保存されているのかを調べます。


```R
packageVersion("zoo")
```

バージョンを調べます。
分析内容のエビデンスを残すならこれでバージョンを書き留めておきます。
パッケージが無いぞ、とか言われたら、

```R
packageVersion("zoo",lib="パッケージのpath")
```

明示してあげましょう

```R
remove.packages("zoo")
```

相手のPCが容量不足になることがどうしても心配なら毎回消してあげましょう。

#以上
【初心者】JavaScript　ファイル分割／相対パス／パッケージ【備忘録１３】

##11/08～11/09に勉強したこと
###ファイルの分割
コード量が増えてくると一つのファイルでの管理が大変になるので
ファイル分割をするとわかりやすくなる。

ただ単に分割するだけでは、互いのクラスで紐づけしている場合が
多々あるので、インポート・エクスポートを行わなければならない。

【例】Animal,Dogクラスがある場合・・・Animalクラスをエクスポート

```js

class Animal{...
}

export default Animal;
//クラス定義の後でexportを書く。この形はデフォルトエクスポートと呼ばれる。

```

【例】Animal,Dogクラスがある場合・・・Animalクラスをインポート

```js

//ファイルの一番先頭に書く。
inport Animal from "./animal";

//一番はじめのAnimalはクラス名、語尾のanimalはファイル名。

```

###値のエクスポート
クラスだけでなく、値もエクスポート可能。
先ほどのクラス名のところに「定数名」を入れればOK！

###名前付きエクスポート
上記で説明しているデフォルトエクスポートは、１つのファイルにつき
１つしか使用できない！いくつか使用する際は下記のように書く。

【例】

```js

export {dog};
//定数名の間を[,]で区切ると複数もOK！ [default]不要なので気を付ける！

import {dog} from "./dogData";

```

###相対パス
同じディレクトリ内にファイルが存在する場合、インポート時の語尾は
"./animal";などでよいが、他のディレクトリ同士の場合は書き方が変わってくる。

-　上記などで書いてきた物は、srcというファイルの中に同列で４つのファイルが
存在している状態の時に使える書き方。
-　例１の場合と例２の場合は、ファイルの存在する場所が違う。

【例】
【srcファイル】に【dataファイル】【classファイル】＜script.jp＞が存在。
【dataファイル】⇒dogData.js
【classファイル】⇒dog.js

★例１⇒scriptをdogDataへ
★例２⇒dogDataをdogへ

```js

//★例１
import {dog1,dog2} from "./data/dogData";

//★例２
import Dog from "../class/dog"
//　　　　　　　　↑一つ上の階層に行く場合は ../

```

###パッケージ
JavaScriptの世界では、他の方が作った便利なプログラムが
パッケージとして公開されてて、自分のプログラムに組み込むことが可能。
それぞれコラムもあり、調べてみると使用方法も掲載されている。

一例として、、、
- chalk⇒コンソール出力の文字に色！
- readline-sync⇒コンソールに値を入力！　質問文⇒入力⇒出力のような形がとれる。

【例】chalk

```js

import chalk from"chalk";
//クラスの文頭に書く。

console.log(chalk.yellow("Hello!"));
//文字が黄色に！
console.log(chalk.bgCyan("Hello!"));
//文字の背景が水色に！

```

【例】readline-sync

```js

import readlineSync from "readline-sync";

const name = readlineSync.question("名前を入力してください:");
//年齢など、整数を入力してほしいときは、readlineSync.questionInt 

console.log(`${name}です。`);

```
JavaScriptの基本箇所についての復習：寄り道（オブジェクト）

#はじめに
[前回の記事](https://qiita.com/Moon1126Snow/items/f518b149cb025c8583be)にて***配列***について説明させていただきましたので、今回はそれと似た***オブジェクト***について解説します。
#注意
本記事は一部未完成なため、近日修正します。
#実行
配列は次のように書くのでした。(筆者の好きな女性声優です)

```javascript
var VoiceActhor = ["小岩井ことり","悠木碧","佐藤聡美","井口裕香","小松未可子"];
```
このように、配列は***同じ種類のデータの集まり***となります。
そのため、違う種類のデータを集まりとしては使いにくいところがあります。
例えば、声優さんの名前・年齢・デビュー作・代表作・趣味を一つの配列に代入するとします。

```javascript
var VoiceActhor1 = ["小岩井ことり", ２９, "青の祓魔師", "アイドルマスターミリオンライブ！","釣り・作詞作曲・ＤＴＭ"];
```

これだと、デビュー作と代表作がどっちがどっちなのか分かりにくいですね。
このように、違う種類のデータを扱う場合は、配列ではなく***オブジェクト***を使用します。
呼び方は違いますが***Rubyでいうハッシュオブジェクトと同じようなもの***と思ってください。

前述の配列をオブジェクトで書き直すと次のように書きます。

```javascript
var VoiceActhor1 = {name: "小岩井ことり", age: ２９, debut_title: "青の祓魔師", famous_title: "アイドルマスターミリオンライブ！",hoby: "釣り・作詞作曲・ＤＴＭ"};
```

配列との違いは```[]```で囲っていたところを```{}```で囲っているところ。
そして、それぞれの情報の前に```name:```等の　```:```付の項目が追加されているところです。
この場合```name:```を***プロパティ名***,```小岩井ことり```の部分を***値***と言います。２つ合わせて***プロパティ***といい、この場合はプロパティ名がnameなので***nameプロパティ```といったりします。

配列は要素の一つを出力する場合は並び順を指定してやれば良かったですが、オブジェクトの場合はプロパティ名を指定します。
例えば、"小岩井ことりさんおデビュー作は「青の祓魔師」です"と出力したい時は

```javascript
var VoiceActhor1 = {name: "小岩井ことり", age: ２９, debut_title: "青の祓魔師", famous_title: "アイドルマスターミリオンライブ！",hoby: "釣り・作詞作曲・ＤＴＭ"};
console.log(VoiceActhor1.name + 'さんのデビュー作は「' + VoiceActhor.debut_title + '」です');
```
とすればいいです。
Ubuntu 18.04 + cuda 10.0 + cudnn7.4 での機械学習環境の構築

kaggle 用に PC を自作したのですが、環境構築に結構戸惑ったので備忘録としてまとめておきます。

ちなみに、ubuntu に関しては 18.04 より 16.04 のほうが参考文献が多くて今の所は環境構築が楽そうだったので後々すこし後悔したという…

# 環境
OS : ubuntu 18.04
GPU : RTX2060SUPER

# 古いバージョンを消す

```bash
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
sudo apt-get --purge remove cudnn-*
sudo apt-get --purge remove libnvidia-*
sudo apt-get --purge remove libcuda-*
sudo apt-get --purge remove libcudnn-*
sudo apt-get autoremove
```

以下を実行して何も出なければ OK です。

```bash
dpkg -l | grep nvidia
dpkg -l | grep cuda
dpkg -l | grep cudnn
```

# ドライバのインストール
下記のページより自分の環境に適したドライバを選択してください。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

```bash
sudo apt install nvidia-driver-430
sudo reboot
```

`nvidia-smi` で GPU を認識していれば OK です


# cuda
バージョンは以下を参考に適宜変えてください。
https://developer.nvidia.com/cuda-toolkit-archive

```bash
wget "https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64"
mv cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64 cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
sudo apt update
sudo apt install cuda-10-0
```
`usr/local` 下に cuda があれば OK です。

# cudnn
下記のページから4つの必要なバージョンのパッケージをダウンロードしてください。(ログイン必須)
自分の場合は以下の4つでした。
- cudnn-10.0-linux-x64-v7.4.1.5.tgz
- libcudnn7_7.4.1.5-1+cuda10.0_amd64.deb
- libcudnn7-dev_7.4.1.5-1+cuda10.0_amd64.deb
- libcudnn7-dov_7.4.1.5-1+cuda10.0_amd64.deb

https://developer.nvidia.com/rdp/cudnn-archive

```bash
sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb
tar -zxf cudnn-10.0-linux-x64-v7.4.2.24.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp -R cuda/lib64/* /usr/local/cuda/lib64/
```

以下で `Test passed!` が出れば設定完了です。

```bash
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
./mnistCUDNN 
```

# path を通す
最後に PATH を通して完了です。

```bash
echo -e "\n## CUDA and cuDNN paths"  >> ~/.bashrc
echo 'export PATH=/usr/local/cuda-10.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
```

`nvcc -V` でバージョンが確認できれば OK です。