OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング学習記録82〜パングラム〜

##今日やったこと
- ドットインストール「詳解JavaScriptDOM編」復習
- ドットインストール「初めてのJavaScript」復習
- ドットインストール「JavaScriptでおみくじを作ろう」復習
- ドットインストール「JavaScriptでタイピングゲームを作ろう」復習
- パングラムの単語を取り入れたタイピングゲーム作成

###基礎文法復習
基礎文法の復習として、DOM編を３倍速で復習してみました。

DOM編は今日で3周目なので、３倍速でも問題なく理解できました。

３周してみて、大体理解できたので、DOM編の復習は今日で終わりにしたいと思います。

###「はじめてのJavaScript」
基礎文法編、オブジェクト編、DOM編をそれぞれ３周した後に「はじめてのJavaScript」の動画を見てみたら、ヌルヌル理解できました。

やはりいくらプログラミングは作りながら身につけていくとはいえ、最低限の基礎知識はないとダメですね。

divタグの作り方だったり、toggle等の理解が深まりました。

あと、わかっているようでわかっていなかったdatasetもDOM編をしっかりやったおかげでわかるようになりました。

datasetを使うと、好きな名前で属性をつけることができるので、これが使えるようになると作れるものの幅も格段に広くなります。

###「JavaScriptでおみくじを作ろう」
「JavaScriptでおみくじを作ろう」もヌルヌル理解できました。

おみくじの確率の調整方法だけ強いて言えば少し難しいかな〜ぐらいであとは基礎編をやっていれば簡単ですね。

###「JavaScriptでタイピングゲームを作ろう」
また、最初に「JavaScriptでタイピングゲームを作ろう」で理解できなかったsubstringも理解できるようになりました。


タイピングゲームの仕組みが理解できたので、全体をちょっとだけいじってアレンジしてみました。

フォントは、WindowsではTimes New Roman、MacではTimesが表示されるようにしました。

時間は3秒だと短すぎるので、30秒にしました。

そして、出てくる単語をパングラムに出てくる単語にすることで、A〜Zまでを全て含んだタイピングゲームにしました。

パングラムとは、A〜Zまでが全て含まれている文章です。

日本語では「いろはにほへと」の歌がパングラムとして知られています。

参考にしたパングラムの文章は以下のものです。
`The quick brown fox jumps over the lazy dog.`

これにより、このタイピングゲームを繰り返しプレイすることで、日本語ではあまり使わないQやLを打つ練習ができます。

実際にタイピングゲームで遊んでる様子を撮ってみました。
https://youtu.be/lNOiiM5LjxQ

ソースコードはこちらです。
https://github.com/yuta-kinu/MyTypingGame

自分なりにコードの解説を書いてみたら、頭の中が整理されてよかったです。

関数が増えてきて、コードが複雑になってきてもコードの意味を日本語で書いてコメントアウトしておけば、理解しやすくなることに気づきました。

現代文や英語の問題を解いている時のような感覚で翻訳しながら進めていくのがいい気がします。


今日はいろいろできてよかったです。

明日も引き続き頑張ります。

おわり
riscv-tests のメモリマップを調査した際のメモ

最近 RISCV のエミュレータを書いているのだが、その時に riscv-tests (https://github.com/riscv/riscv-tests) メモリマップを調べたのでメモ。

手元で使っている riscv-tests は数か月以上前にチェックアウトしたものなので、今は変わっているかもしれない。

# 物理アドレス空間

アドレスは RV32 のもので、RV64 では符号拡張したアドレスが使われる。

|アドレス|サイズ|名称|備考|
|---|---|---|---|
|0x80000000|0x80000000|RAM||
|0x80001000|0x4|tohost|riscv-tests の一部では、アドレスの下位 16 bit が 0x2000 / 0x3000 になる|

# カーネル論理アドレス空間
VM 有効のテストにおける、カーネルアドレス空間。

## RV32

|アドレス|サイズ|内容|備考|
|---|---|---|---|
|0xffc00000|0x400000|RAM||
|0xffc01000|0x4|tohost|一部のテストでは、アドレスの下位 16 bit が 0x2000 / 0x3000 になる|

## RV64

|アドレス|サイズ|内容|備考|
|---|---|---|---|
|0xffffffff_ffe00000|0x200000|RAM||
|0xffffffff_ffe01000|0x4?|tohost|一部のテストでは、アドレスの下位 16 bit が 0x2000 / 0x3000 になる|


# ユーザー論理アドレス空間

VM 有効のテストにおける、ユーザー論理アドレス空間。

## RV32

|アドレス|サイズ|内容|備考|
|---|---|---|---|
|0x00000000|0x400000|RAM||
|0x00001000|0x4|tohost|riscv-tests の一部では、アドレスの下位 16 bit が 0x2000 / 0x3000 になる|

## RV64

|アドレス|サイズ|内容|備考|
|---|---|---|---|
|0x00000000_00000000|0x200000|RAM||
|0x00000000_00001000|0x4?|tohost|riscv-tests の一部では、アドレスの下位 16 bit が 0x2000 / 0x3000 になる|

## ソースコード

アドレス変換は以下のマクロで行われる。uva2kva の引数が pa でややこしいけど、たぶん引数は uva が正しいのだと解釈。
ソースコードはいつぞやの https://github.com/riscv/riscv-tests からの引用だが、コメントは自分で入れている。

```
// vm.c
#define pa2kva(pa) ((void*)(pa) - DRAM_BASE - MEGAPAGE_SIZE)
#define uva2kva(pa) ((void*)(pa) - MEGAPAGE_SIZE) // i.e. uva = kva + MEGAPAGE_SIZE
```

DRAM_BASE, MEGAPAGE_SIZE の値を当てはめると以下のようになる。

```
// encoding.h

// RV32
#define pa2kva(pa) ((void*)(pa) - 0x80400000)
#define uva2kva(pa) ((void*)(pa) - 0x400000)

// RV64
#define pa2kva(pa) ((void*)(pa) - 0x80200000)
#define uva2kva(pa) ((void*)(pa) - 0x200000)
```

DRAM_BASE, MEGAPAGE_SIZE の定義は以下の通り。

```
// riscv_test.h
#define DRAM_BASE          0x80000000
```

```
// riscv_test.h
#if __riscv_xlen == 64
# define MSTATUS_SD MSTATUS64_SD
# define SSTATUS_SD SSTATUS64_SD
# define RISCV_PGLEVEL_BITS 9
# define SATP_MODE SATP64_MODE
#else
# define MSTATUS_SD MSTATUS32_SD
# define SSTATUS_SD SSTATUS32_SD
# define RISCV_PGLEVEL_BITS 10
# define SATP_MODE SATP32_MODE
#endif
```

```
// riscv_test.h
#define PGSHIFT 12
#define PGSIZE (1UL << PGSHIFT) // 0x1000
```

```
// riscv_test.h
#define PTES_PER_PT (1UL << RISCV_PGLEVEL_BITS) // RV32: 0x400, RV64:0x200
#define MEGAPAGE_SIZE (PTES_PER_PT * PGSIZE) // RV32: 0x400000 (4MB), RV64: 0x200000 (2MB)
```

# ページテーブル

ページテーブルは以下のように定義されている。

```
#define l1pt pt[0]
#define user_l2pt pt[1]
#if __riscv_xlen == 64
# define NPT 4
#define kernel_l2pt pt[2]
# define user_l3pt pt[3]
#else
# define NPT 2
# define user_l3pt user_l2pt
#endif
pte_t pt[NPT][PTES_PER_PT] __attribute__((aligned(PGSIZE)));


// PTES_PER_PT is (RV32: 0x400, RV64:0x200)
// NPT is (RV32: 2, RV64:4)
// sizeof(pte_t) is (RV32: 4, RV64: 8)
// sizeof(pt[0]) is (RV32: 0x1000, RV64: 0x1000)
// sizeof(pt) is (RV32: 0x2000, RV64: 0x4000)
```

ページテーブルは2次元配列 pt であるが、これはアドレスがコードで指定されているわけではない（リンカスクリプトでも指定されていないようだ）。
リンカが決定するのだと思われる。

参考までに、先日 rv64ui-v-add を動かしたときは以下のようになっていた。


||物理アドレス|
|---|---|
|pt|0x80004000|
|l1pt|0x80004000|
|user_l2pt|0x80005000|
|kernel_l2pt|0x80006000|
|user_l3pt|0x80007000|
WindowsにおけるVSCode拡張機能sftpの秘密鍵指定

# VSCodeのプラグインsftpにおけるWindowsでのパスの指定  
sftpプラグイン、便利ですよね。　　
普段Linux環境(Ubuntu/WSL)でプログラムを書くことが多いのですが、Windows環境でも書こうと思ったときに、秘密鍵を指定するときのパスってどう表記するのが正しいんだろう？と思って一瞬だけ躓いたのでメモです。  

Windowsのエクスプローラーを開いて、フォルダの階層をクリックすると
`F:\key`
みたいに表示されるので
`F:\key\rsa`
というような感じでsftpの指定をしたところVSCodeに間違ってるよって怒られたので、（バックスラッシュがエスケープだと認識されてるのだと思うのですが）、バックスラッシュをスラッシュに置き換えて、
`F:/key/rsa`
のようにしたら上手く動きました。というお話。

---
SublimeText3をメインに使ってたけどVSCodeも見やすいしショートカットキーもSublimeの使えるしこっちにメインエディター移そうかなぁ…
TWA(Trusted Web Activity) で BuildTypes によって表示するページを変更する

# 環境
macOS High Sierra - 10.13.6
Android Studio - 3.4

# 変更する方法

#### build.gradle に TWA の設定を debug、release それぞれ記述します

```gradle:build.gradle
android {
    ...
    buildTypes {
        debug {
            ...
            manifestPlaceholders = [
                    hostName       : "*****",
                    defaultUrl     : "debug用のURL",
                    assetStatements: '[{ "relation": ["delegate_permission/common.handle_all_urls"], ' +
                            '"target": {"namespace": "web", "site": "debug用のURL"}}]'
            ]
        }
        release {
            ...
            manifestPlaceholders = [
                    hostName       : "*****",
                    defaultUrl     : "release用のURL",
                    assetStatements: '[{ "relation": ["delegate_permission/common.handle_all_urls"], ' +
                            '"target": {"namespace": "web", "site": "release用のURL"}}]'
            ]
        }
    }
}
```

#### AndroidManifest.xml の android.support.customtabs.trusted.DEFAULT_URL を build.gradle から取得するようにします

```xml:AndroidManifest.xml 
<activity android:name="android.support.customtabs.trusted.LauncherActivity">
    <meta-data android:name="android.support.customtabs.trusted.DEFAULT_URL"
               android:value="${defaultUrl}" />

    ...

    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="https"
              android:host="${hostName}"/>
    </intent-filter>
</activity>
```

debug、release を切り替えて実行してみて、表示されるページが変わっていたら対応完了です！
Pure JSでAM、PM表記への変換書いてみた

`hh:mm` 表記の時刻を `AM` 、 `PM` 表記に変換する。
まず、全体のコードはこちら、 

```javascript
// 実装した関数
const convertMeridian = time => {
  const [h, m] = time.split(":");
  const meridian = ["AM", "PM"][Math.floor(h / 12)];
  return meridian + [h % 12, m].map(v => ("0" + v).slice(-2)).join(":");
}

//実行例
const time = "12:19";
console.log(convertMeridian(time));
// 出力 PM00:19
```

# 解説

```javascript
const [h, m] = time.split(":");
// h = 12, m = 19

const meridian = ["AM", "PM"][Math.floor(h / 12)];
// ["AM", "PM"] と言う配列を生成
// h は0-23なので、12で割って0.xx、1.xxという小数にし、
// Math.floorで切り捨てることで 配列のIndex を指定する

return meridian + [h % 12, m].map(v => ("0" + v).slice(-2)).join(":")
// 時間を 12 で割った余りと、分を2桁の文字列にフォーマット
// ":" で間をつないで AM、PMを追加
```
dns_tkey_negotiategss: TKEY is unacceptable の解消方法

[ここ](https://wiki.samba.org/index.php/Setting_up_Samba_as_an_Active_Directory_Domain_Controller "Setting up Samba as an Active Directory Domain Controller")と[ここ](https://wiki.samba.org/index.php/BIND9_DLZ_DNS_Back_End "BIND9 DLZ DNS Back End")を参考に、Samba4でActive Direcotryを構築しました。

|項目|内容|
|:-:|:-:|
|OS|CentOS7.6.1810|
|Samba|4.9.6(ソースからコンパイル)|
|BIND|9.9.4|
|DNSバックエンド|BIND9_DLZ|
|AD機能レベル|2008_R2|

一通りの設定が完了し、`samba_dnsupdate --verbose --all-name`を実行したところ、DNSレコード毎に`dns_tkey_negotiategss: TKEY is unacceptable`と出力され、アップデートに失敗している模様。

```
# samba_dnsupdate --verbose --all-names
-- 中略 --
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; UPDATE SECTION:
ad01.example.co.jp.	900	IN	A	192.168.0.1

dns_tkey_negotiategss: TKEY is unacceptable 
Failed nsupdate: 1
-- 中略 --
```

[こちら](https://wiki.samba.org/index.php/BIND9_DLZ_DNS_Back_End "BIND9 DLZ DNS Back End")の手順にもあるとおり、`dns.keytab`ファイル自体の読み取り権限は付与していたのですが、よくよく調べてみると、`dns.keytab`を配置したディレクトリに対してBIND実行ユーザ(named)の読み取り権限が無いことが判明。
当該ディレクトリの所有グループをnamedに変更して読み取り権限を付与することで解決しました。

```
変更前
# ls -ld /usr/local/samba/private/
drwxr-x--- 7 root root 4096  4月 23 17:20 /usr/local/samba/private/

所有グループ変更
# chown root:named /usr/local/samba/private
# ls -ld /usr/local/samba/private/
drwxr-x--- 7 root named 4096  4月 23 17:20 /usr/local/samba/private/
# ls -l /usr/local/samba/private/dns.keytab
-rw-r----- 2 root named 787  4月 23 18:32 /usr/local/samba/private/dns.keytab
```
プログラミング初心者がprogate rubyを受講したあとで疑問に思いそうなことまとめ

Q attr_accessorって何してるの？
A ある処理を省略する為に記述している

attr_accessorを使用しない場合は、以下のように書く必要がある

```ruby
class Person
  def name
    @name　#インスタンス変数の宣言
  end

  def name=(str) #書き込みメソッド
    @name = str
  end
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

```

毎回上記のように宣言するのは読みにくいしめんどくさいので省略する記法が存在する
以下は上記の動作と全く同じ動作をする

```ruby
class Person
  attr_reader :name
  attr_writer :name
end
```

さらに短縮する記法はattr_accessorだ

```ruby
class Person
  attr_accessor :name
end

```

参考　http://bryankawa.hatenablog.com/entry/2017/01/28/150537


Q Rubyでは＋＋演算ができない理由は？
A 変数がオブジェクトでないRubyでは導入しにくいので現在はできない

参考　http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/5323

Q クラスメソッドとインスタンスメソッドの使い分けがよくわからない
A 個人の見解では、クラスメソッドはクラス自身に関する情報の変更や参照をするときに使うと良いと思います

参考　https://qiita.com/tbpgr/items/56eb65c0ea5882abbb07
「絶対パス」「相対パス」「ルートパス」ってなに？

プログラミングを学んでいく上でよく出てくる「パス」についてですが、
わかっている様でわかってない様な。。（わかってないやん）
ルーティングやビューを記述する際に出てくるので、改めてまとめてみました！

## 「パス」とは
目的のファイルの場所までの道筋を示したもの。
インターネットでサイトを開くと、上に `http://site.com/about/index.html.erb`
の様にURLが表示される→これがパス。
パスには、「**絶対パス**」「**相対パス**」「**ルートパス**」の３つがある。

## 絶対パス
`http://site.com/about/index.html.erb`
**最上階層**から目的のファイルまでの場所を示す。
住所で例えると、全国の誰から見ても変わらない住所。
→http://〜県/〜市/〜町/〜丁目/〜番/マンション名/〇〇号室
みたいな感じ。httpで始まっていたら、絶対パス。
自分のサイトに外部リンクを貼り付けたい時などに使用する。

## 相対パス
`about/index.html.erb`
**今いる階層**を基準として目的のファイルまでの場所を示す。
自分から見た同じマンションの〜さんの住所。→同じマンション/〇〇号室　みたいな感じ。
短いパスなので書く手間が省けて作業効率がUPする
→開発では、相対パスが一番メジャーに使われる。

##ルートパス
`/about/index.html.erb`
「ルート」は一番上のディレクトリ（フォルダ）のこと。
**一番上のディレクトリ**から目的ファイルまでの場所を示す。
Webサイトの場合、ドメイン直下からの指定となる。
/から始まっていたらルートパス。

##まとめ
３つのパスにはメリット・デメリットがあり、
開発する案件の規模やタイプなどによって指定がある様です。
（大体は相対パスを使っての開発が多いみたいです）
個人的にアプリ開発などする際に、意識して使ってみるといいですね＾＾

##参考サイト
[絶対パスと相対パスとサイトルートパス - 絵でわかるWebプログラミング入門](http://html2php.starrypages.net/programming/path)
[絶対パス、相対パス、ルートパスの違いってなに？メリット・デメリットは？](https://fastcoding.jp/blog/all/frontend/path/)
[【初心者向け】絶対パスと相対パスの違いをイラストを使って解説！ | webliker](https://webliker.info/78726/)
#vim でカーソル上にあるキーワードを検索する ( * or # )

こんなに簡単だったんですね。

![image](https://user-images.githubusercontent.com/13635059/57440224-93a6ae00-7282-11e9-8fc9-8399cbffad7a.png)
![image](https://user-images.githubusercontent.com/13635059/57440227-94d7db00-7282-11e9-9dec-f5f0b11d8feb.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1740








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
あいちのかおり　を起点にした調査（予定）

あいちのかおり　を起点にした調査を予定している。

遺伝子データの入手方法を調査中。

# 0 あいちのかおり(愛知70号)
　https://life.ja-group.jp/food/okome/detail?id=141

## 1 ハツシモ
https://www.pref.gifu.lg.jp/sangyo/nogyo/nosanbutsu/11423/gifukome.html

### 2 東山24号
https://www.agri-exp.pref.shizuoka.jp/newtech/pdf/373_H13.pdf

#### 3 名倉穂
#### 3 旭(朝日)

### 2 近畿15号（農林８号）
http://www.chikyu.ac.jp/sato-project/news_letter/news_letter_30.pdf
>「農林 8 号」は、「コシヒカリ」の母親である「農林 22 号」の母親。

#### 3愛国(銀坊主)
#### 3旭(朝日)

## 1ミネノアサヒ（中部１７号）水稲農林２６０号
http://okome.nyancoroge.info/ミネアサヒの歴史と名前の由来と特徴/

### 2関東７９号　ガンマ線照射による突然変異
#### 3コシヒカリ（越南１７号）

### 2 喜峰(40-11)
#### 3銀藤B(34-11B)
#### 3秋晴(34-15B)

# 未確認事項

米の遺伝子データをどう入手すればいいか未確認。

遺伝子データがあれば、いろいろ計算できるんですが。

「ガンマ線照射による突然変異」部分のデータ確認ができるとよい。


# 参考資料
イネ縞葉枯病・穂いもち抵抗性を導入した水稲準同質遺伝子系統「あいちのかおりSBL」
井澤 敏彦, 朱宮 昭男, 工藤 悟, 愛知県農業総合試験場・山間技術実験農場 
https://ci.nii.ac.jp/naid/40005504850

池田彰弘　テクノロジーの力でお米の品種改良
https://agri.project.cc/portfolio/ikeda/

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　 20190519
ver. 0.02 ありがとう追記 20230604
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
MacでModuleNotFoundError: No module named 'yaml.resolver' エラー


# 解決策
ひとまずPyCharm等のIDEの環境やvenvの効いていない、素のターミナル立ち上げて開いて↓を叩く。

```bash
python -m pip install PyYaml
```

または

```bash
python pip install PyYaml
```

# エラー

```bash
Traceback (most recent call last):
  File "/Users/sot528/.pyenv/versions/3.6.1/bin/aws", line 27, in <module>
    sys.exit(main())
  File "/Users/sot528/.pyenv/versions/3.6.1/bin/aws", line 23, in main
    return awscli.clidriver.main()
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/clidriver.py", line 58, in main
    driver = create_clidriver()
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/clidriver.py", line 69, in create_clidriver
    event_hooks=emitter)
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/plugin.py", line 44, in load_plugins
    modules = _import_plugins(plugin_mapping)
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/plugin.py", line 61, in _import_plugins
    module = __import__(path, fromlist=[module])
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/handlers.py", line 27, in <module>
    from awscli.customizations.cloudformation import initialize as cloudformation_init
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/customizations/cloudformation/__init__.py", line 13, in <module>
    from awscli.customizations.cloudformation.package import PackageCommand
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/customizations/cloudformation/package.py", line 22, in <module>
    from awscli.customizations.cloudformation.artifact_exporter import Template
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/customizations/cloudformation/artifact_exporter.py", line 26, in <module>
    from awscli.customizations.cloudformation.yamlhelper import yaml_dump, \
  File "/Users/sot528/.pyenv/versions/3.6.1/lib/python3.6/site-packages/awscli/customizations/cloudformation/yamlhelper.py", line 15, in <module>
    from yaml.resolver import ScalarNode, SequenceNode
ModuleNotFoundError: No module named 'yaml.resolver'

```

# 環境
- Python 3.6.1
- macOS Mojave 10.14.4 (18E226)
#vim でテキスト置換が面倒くさいときの入力モード ( gR ) ( 仮想置換モード )

次々と1文字ずつ置換できるのがお分かりだろうか。

![image](https://user-images.githubusercontent.com/13635059/57439590-4b3ac080-7281-11e9-93ff-0b5ecba48ec0.png)

![image](https://user-images.githubusercontent.com/13635059/57439594-4d048400-7281-11e9-8c4a-40cea572b983.png)
![image](https://user-images.githubusercontent.com/13635059/57439592-4bd35700-7281-11e9-8ba6-ebb037fbf3cd.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1739








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VisualStudio2019でパッケージを復元しない時

VisualStudio2019で新規にXamarinプロジェクトを作成した際、
ビルドができず、Nugetのパッケージを復元できませんでしたとのメッセージが出て困った。

コンソールを見ると下記メッセージが...

```
Unable to get repository signature information for source https://api.nuget.org/v3-index/repository-signatures/4.7.0/index.json.
```
## 解決方法

VisualStudioを再起動してプロジェクトを開き直すとこの問題は解決した。

## 原因
VisualStudio2019で新規プロジェクトを作成すると、
プロジェクト配下のobjフォルダ以下に
nuget.targetsやnuget.props, project.assets.jsonが生成されないみたい。

２０１７の時はこんな事なかったのになぁ。。
#vim でキーワードを一個ずつ置換する  ( `:%s///gc` )

# command

```
:%s/keyword/replaced/gc
```

# howto

y 置換する
n 次に進む
a 全部置換する
q 置換モードを終了する

```
replace with wow (y/n/a/q/l/^E/^Y)?
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1738








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
es6でclassの定数を扱う。インスタンスメソッドからclassの定数を参照する

# 結論から書く

- インスタンスメソッドから定数を参照するには下記のようにconstructorを経由する必要があります。

```typescript
export default class {
  static TEISU() { return 1; }

  instanceMethod() {
    // インスタンスメソッドから参照するにはconstructorを経由する必要がある
    alert(this.constructor.TEISU());
  }
}
```

# staticな変数にすることもできるが定数にはならないので注意が必要

```typescript
export default class {
  static TEISU = 1;

  instanceMethod() {
    this.constructor.TEISU = 2;// ここで値が書き換えられてしまう
    alert(this.constructor.TEISU);
  }
}
```

# ちなみに、クラス名を指定している場合はクラス名.TEISU()のように呼べる

```typescript
class Teisu {
  static TEISU() { return 1; }

  instanceMethod() {
    alert(Teisu.TEISU());
  }
}
```

# 参考文献
- [static - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/static)
- [javascript – ES6クラスの静的定数を宣言しますか？](https://codeday.me/jp/qa/20181211/58899.html)
ADALINEのソースコードメモ書き(Python機械学習プログラミング第2章)


#はじめに

前回と同じ部分は、はしょりました！
ADALINEのソースコードについてメモ書きを残します。

#ADALINE(ADaptive LInear Neuron)

単層パーセブトロンと違う点は、**連続値のコスト関数の定義**と、**その最小値の求め方**
(学習過程で最適化するもの**目的関数**といい、中でも最小化したいものは**コスト関数**)

#AdalineGDクラスの冒頭

```python

class AdalineGD(object):
    """ADAptive LInear NEuron classifier.
    cost_ : list
      Sum-of-squares cost function value in each epoch.
    """
    def __init__(self, eta=0.01, n_iter=50, random_state=1):
        self.eta = eta
        self.n_iter = n_iter
        self.random_state = random_state
```

#fit関数

```python

    def fit(self, X, y):
        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
        self.cost_ = []

        for i in range(self.n_iter):
            net_input = self.net_input(X)
            # Please note that the "activation" method has no effect
            # in the code since it is simply an identity function. We
            # could write `output = self.net_input(X)` directly instead.
            # The purpose of the activation is more conceptual, i.e.,  
            # in the case of logistic regression (as we will see later), 
            # we could change it to
            # a sigmoid function to implement a logistic regression classifier.
            output = self.activation(net_input)
            errors = (y - output)
            self.w_[1:] += self.eta * X.T.dot(errors)
            self.w_[0] += self.eta * errors.sum()
            cost = (errors**2).sum() / 2.0
            self.cost_.append(cost)
        return self
```

net_input:総出力 W.T * X = z
output:総出力と恒等 φ(W.T * X) = φ(z)
errors:正解ラベルと、総出力の差 yi - φ(zi) 2次元かも？ 

> self.w[1:] += self.eta * X.T.dot(errors)

X.T.dot(errors)はXの転置行列とerrorsの積。Xが100*2行列、errorsが2*1行列

▼X.T.dot(errors)
https://deeplearning-benkyotyu.hatenablog.com/entry/2018/04/14/181441

> self.w[0:] += self.eta * errors.sum()

self.w[1:]とself.w[0:]の役割は単純パーセプトロンと同じであるが、
更新タイミングが違う。重みの更新は（サンプル毎に重みを小刻みに計算するのではなく）
トレーニングデータセットの全てのサンプルに基づいて計算される。
このアプローチが**「バッチ」勾配降下法**

```python

    def net_input(self, X):
        """Calculate net input"""
        return np.dot(X, self.w_[1:]) + self.w_[0]

    def activation(self, X):
        """Compute linear activation"""
        return X

    def predict(self, X):
        """Return class label after unit step"""
        return np.where(self.activation(self.net_input(X)) >= 0.0, 1, -1)
```

activation関数；恒等関数


▼端的要約
http://forgetzimbnot.com/2014/03/post-134.html

▼i=3ver
https://thinkit.co.jp/article/10666?nopaging=1
VirtualBoxでk3OSを動かしてみた

# TL;DR
Rancherが軽量版kubernetes(k8s)である[k3s](https://github.com/rancher/k3s)をリリースしたのは記憶に新しいと思いますが、そのk3s用のOSである[k3OS](https://k3os.io/)がリリースされたので、とりあえずVirtualBoxで動かしてみました。
※内容的には大したことないので悪しからず。(初投稿なのでまずはジャブ程度)
※VirtualBoxのインストールは説明しないので、インストールしてない人は適宜調べてください。

# Version
* CPU: Intel Core i5-7500
* OS: Windows 10 Pro ver.1809
* VirtualBox: 6.0.6 r130049
* k3OS: 0.2.0

# Context
1. ISOイメージのダウンロード  
k3OSのISOイメージをダウンロードする https://github.com/rancher/k3os/releases  
今回は最新版であるv0.2.0の`k3os-amd64.iso`を使う
2. 仮想マシンの作成  
VirtualBoxのコンソールを開き、新規ボタンから仮想マシンを新規作成する(メモリは適宜)  
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401611/225df49a-743d-3198-b4c7-cc3f3753f366.png width=70%>
3. ISOイメージのセット  
仮想マシンを作成したら、作成した仮想マシンの設定ボタンを押し、ダウンロードしたISOイメージを光学ドライブにセットする  
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401611/6bf2754c-0749-6d11-d1ae-f1d874610784.png width=70%>
3. 起動!!  
無事に起動すれば`rancher`ユーザでログインできる  
既に`kubectl`がインストールされており、OSをインストールするだけでk3sが使える(簡単！)
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401611/7174356f-e93e-4004-c000-2e4c73fad8cd.png width=70%>

# Impression
凄い簡単にkubernetesの環境が手に入るので、ローカルのデバック用とかに使えそうな予感がしました。
何より一番驚いたのがISOイメージのサイズ！なんと約400MB！！軽いですよね～
[README](https://github.com/rancher/k3os)には更に設定を変更したりする方法も書いてあるのでまだまだ遊べそうです。
次回はラズパイで動かしてみようかなとか考えてます。ではでは～
Httpエラー時レスポンス取得できない時の対処法

Httpエラー時、GetResponse()処理がエラー発生、エラー処理に行くため、レスポンス取得できないです。
そのため、エラー処理を下記のようにする必要がある。


        public Verify_Response Verify(string url, Verify_Request jsonRequest) {
            Verify_Response result = new Verify_Response();

            HttpWebRequest req = req = (HttpWebRequest)WebRequest.Create(url);
            req.ContentType = "application/json";
            req.Method = "POST";

            try
            {
                string jsonString = JsonConvert.SerializeObject(jsonRequest);

                using (var streamWriter = new StreamWriter(req.GetRequestStream()))
                {
                    streamWriter.Write(jsonString);
                    streamWriter.Flush();
                    streamWriter.Close();
                }

                HttpWebResponse res = (HttpWebResponse)req.GetResponse();

                using (var streamReader = new StreamReader(res.GetResponseStream()))
                {
                    result = JsonConvert.DeserializeObject<Verify_Response>(streamReader.ReadToEnd());
                }

                return result;
            }
            catch (System.Net.WebException ex)
            {
                //HTTPプロトコルエラーかどうか調べる
                if (ex.Status == System.Net.WebExceptionStatus.ProtocolError)
                {

                    System.Text.Encoding enc =
                        System.Text.Encoding.GetEncoding("shift_jis");

                    //HttpWebResponseを取得
                    System.Net.HttpWebResponse errres =
                        (System.Net.HttpWebResponse)ex.Response;

                    System.IO.Stream st = errres.GetResponseStream();
                    System.IO.StreamReader sr = new System.IO.StreamReader(st, enc);
                    string return_str = sr.ReadToEnd();
                    //閉じる
                    sr.Close();

                    result = JsonConvert.DeserializeObject<Verify_Response>(return_str);

                    return result;
                }
                else
                {
                    TestLog.WriteLog(instanceId, LogLevel.EERROR, ex.Message);
                    return result;
                }
            }
            finally {
                req.Abort();
            }
        }
本日学んだこと Ruby編　繰り返し処理

**・upto**
nからmまで数値を１ずつ増やしながら何かしらの処置を実行したいときに使う。

**開始値.upto(終了値）{繰り返し実行したい処理}**
例　`10.upto(14) { |n| puts n　}`

**・downto**
nからmまでの数値を１ずつ減らしながら何かしらの処理を実行したい場合に使う。

**開始値.downto(終了値）{繰り返し実行したい処理}**
例　`14.downto(10) { |n| puts n }`

**・step**
nからmまでxずつ値を増やしながら、何かしらの処理を実行したいときに利用する。

**開始値.step(上限値,一度に増減する大きさ）{}**
例　`1.step(10, 2) { |n| puts n }`

**・loop**
あえて無限ループを作りたい時に利用する。

**loop do
繰り返し実行したい処理
end**
例

```rb
i = 0 
loop do
 puts i
 i += 1
end
```

**・break if**
ループをそこで終わらせる処理。

例

```rb
i = 0
loop do
 puts i
 i += 1
 break if i == 10
end
```

**・next if**
そこの条件に当てはまるのはスキップして繰り返しを実行する処理。

例

```rb
numbers = [1, 2, 3, 4, 5]
numbers.each do |n|
 next if n % 2 == 0
 puts n
end
```

`next if n.even?` →　偶数
`next if n.odd?` →　奇数
ECSクラスターにEC2インスタンスをアタッチする

#やりたいこと
ECSクラスターを作った後、追加でEC2インスタンスをアタッチしたい。

#EC2インスタンスの設定
ECSクラスターはすでに作ってあるという前提で話を進める。
クラスターにアタッチするために、インスタンスにはいくつか設定が必要だ。

###1. IAMロールは、`ecsInstanceRole`にする。

起動時にロールの設定項目がある.
`ecsInstanceRole`が存在しない場合は、[公式](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/instance_IAM_role.html)を参考に自分で作成する。

###2.  [ECSコンテナエージェント](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_agent.html)をインストールする。 

インスタンス起動後にsshして、[GitHub](https://github.com/aws/amazon-ecs-agent)から入手できる。

###手順2を省略する方法

インスタンスのAMIを[Amazon ECS-Optimized Amazon Linux 2 AMI](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/al2ami.html)に設定すれば、手順2は不要。

###3. コンフィグファイル等を設定する。

手順1、2を踏んだ上でインスタンスを作成すると、インスタンスは、aws側が自動で生成する`default`という名前のクラスターに自動的にアタッチされる。自分で作成したクラスターにアタッチするには、インスタンスのコンフィグを書き換えなければならない。
インスタンスにsshして、`/etc/ecs/ecs.config`を編集する。

```:/etc/ecs/ecs.config
ECS_CLUSTER=YOUR_CLUSTER_NAME
```

`YOUR_CLUSTER_NAME`は、アタッチしたいクラスターの名前にする。

###4. コンフィグの変更を適応する

私が詰まったポイントはココ。
インスタンスのログは、`/var/log/ecs/ecs-agent.log.timestamp`にあるのだが、そこを見ると

```
[CRITICAL] Data mismatch; saved cluster 'default' does not match configured cluster 'YOUR_CLUSTER_NAME'. Perhaps you want to delete the configured checkpoint file?
```

と出力される。`セーブされてるクラスターとコンフィグのクラスターが一致してないよー`と書いてある。
要するに、**先程コンフィグに書いたクラスター名は、まだインスタンス上ではセーブされていない**ということ。

ということで、`rm /var/lib/ecs/data/*` でチェックポイントファイルの削除を行う。
チェックポイントファイルは、インスタンスの起動時に自動で生成されるので、削除して問題ない。

削除をした後は、忘れずにインスタンスの再起動を行うこと。

#これでOK
以上の設定をすれば、クラスターはECSインスタンスと自動でつながる。
クラスターのコンソールのECSインスタンスのところに、アタッチされたインスタンスが表示されるはずだ。
curlコマンドでIBM Cloud Object Storage(ICOS)にファイルをアップロードして公開する

curlコマンドでIBM Cloud Object Storage(ICOS)にファイルをアップロードしてインターネットに向けて公開する方法です。

基本的には下記docsの通りではありますが、ICOSのEndpointが新しくなってる？とか、Bearer tokenってどうやって取得すればいいの？とか、ちょっと調べる必要があったので、備忘録として書いておきます。
https://cloud.ibm.com/docs/services/cloud-object-storage/iam?topic=cloud-object-storage-iam-public-access

bucketの公開設定は上記docsや、下記の手順で行います。
https://qiita.com/testnin2/items/6379e5bc5ea165212e15

# ICOSのエンドポイント
ICOSのエンドポイント情報はこちらにあります。
https://cloud.ibm.com/docs/services/cloud-object-storage?topic=cloud-object-storage-endpoints#endpoints
TOKは s3.jp-tok.cloud-object-storage.appdomain.cloud ですね。
従来の s3.jp-tok.objectstorage.softlayer.net もありますが、新しいほうを使うのが無難でしょう。

# Bearer tokenを取得

下記URLの手順でbearer tokenを入手します。
https://cloud.ibm.com/docs/iam?topic=iam-iamtoken_from_apikey

上記で使うapikeyをまだ持っていない場合は、下記画面で作成します。
Manage > Access(IAM) で、左側メニューから、IBM Cloud API Keysを選択。
https://cloud.ibm.com/iam#/apikeys

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/c4c8bb86-f3b2-08b5-5508-0ce8fc65bfa0.png)

Bearer tokenを取得するコマンド


curl -k -X POST   --header "Content-Type: application/x-www-form-urlencoded"   --header "Accept: application/json"   --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey"   --data-urlencode "apikey=[上記で作成したapikey]"   "https://iam.cloud.ibm.com/identity/token"


その出力。access_tokenの文字列をbearer tokenとして使います。略していますが、結構長いです。


{"access_token":"eyJraWQiOi・・・・・・略・・・・・・wcggXEqI6-0QqCg","refresh_token":"ReXaaamPhX・・・・・・略・・・・・・・rsXVSxGiS8A","ims_user_id":74xxxxx,"token_type":"Bearer","expires_in":3600,"expiration":1557396995,"scope":"ibm openid"}
 

上記で入手したaccess_tokenを使って、下記URLにあるcurlコマンドを組み立てます。
https://cloud.ibm.com/docs/services/cloud-object-storage/iam?topic=cloud-object-storage-iam-public-access

-Tオプションを使っている点が上記URLと違いますが、このオプションで、ローカルにあるアップロードしたいファイル名を指定します。成功すると、特にメッセージなくプロンプトが返ってきます。


$ curl -X PUT https://[自分のbucket名].s3.jp-tok.cloud-object-storage.appdomain.cloud/index.html -H "x-amz-acl: public-read" -H "Authorization: Bearer eyJraWQiOi・・・・・・略・・・・・・wcggXEqI6-0QqCg" -H "Content-Type: text/html" -T index.html
$


画像をアップするときはContent-Typeを image/png とかにすればOKです。


$ curl -X PUT https://[自分のbucket名].s3.jp-tok.cloud-object-storage.appdomain.cloud/cloud.png -H "x-amz-acl: public-read" -H "Authorization: Bearer eyJraWQiOi・・・・・・略・・・・・・wcggXEqI6-0QqCg" -H "Content-Type: image/png" -T cloud.png
$


ブラウザから、アップロードしたファイルが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/2b67992c-8540-77a9-3247-b0208589266a.png)


以上
属性セレクタでVue.jsのstyleを整理する

# 概要

Vueのコンポーネントにおいては要素のclass属性に対してv-bindを使うことで動的にスタイルの切り替えが可能になっています。
v-bindを使うのでJSの力をフルに活用できますが、templateの中に条件分岐が増えてくると把握が難しくなります。
そこでそれをほぐすためのCSSの属性セレクタを使う手法を解説します

# 複雑なclassの問題

以下[公式の解説](https://jp.vuejs.org/v2/guide/class-and-style.html)で紹介されているサンプルです

```sample.vue

<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

<div v-bind:class="[{ active: isActive }, errorClass]"></div>
```

これぐらいのコードであれば実際にはそこまで読みにくいわけでもないですが、実際のアプリケーションではもっと条件が複雑になっていきます。
条件分岐を含むクラスが破綻しやすくなる理由としては単純で、「恒常的なスタイル」と「一時的な状態・性質のためのスタイル」が混在するからです。

- 恒常的なスタイル
    - コンポーネントのサイズ、位置など
- 一時的な状態・性質のためのスタイル
    - ローディング中、 クリック可能か、など
   
一時的な状態や性質のためのスタイルは大抵の場合条件分岐が絡みます。
そこでそれらを三項演算子ではなく属性セレクタによって分離すると、template側もstyle側もコードの見通しがスッキリします

# 属性セレクタを利用したスタイリング

先程の例を[属性セレクタ](https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors)を利用して書いてみます

```sample.vue
<div class="sample" :aria-disabled="''+disabled" :data-has-error="''+hasError">

<style lang="scss" scoped>
  .sample {
    color: green;

    &[aria-disabled="true"] {
      color: grey;
    }

    &[data-has-error="true"] {
      color: red;
    }
}
</style>
```

恒常的なスタイルと可変的なスタイルが分離されて、コードの意図が明瞭になったのではないかと思います
このようにすると、[WAI-ARIA](https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA)で用意されているような性質の場合にはそれを使うことでアクセシビリティ対応も同時にできるという利点もあります。
適切なaria属性がない場合には[data属性](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/dataset)を使うようにするといいのではないかと思います。

一つ気をつけないといけないのはv-bindでbooleanをバインドする場合、falseが入ると属性自体が消えてしまうので、バインドする値は文字列に変換しておくほうが安全です。

```sample.vue
<template>
    <div class="sample" :aria-busy="loading">  # 良くない例。loadingがfalseだとaria-busyが付与されないため動かない </div>
    <div class="sample" :aria-busy="''+ loading">  # 良い例。一度文字列に変換する。 :aria-busy="`${loading}`"のようにも書ける </div>
</template>

<script>
data() {
    return {
        loading: false;
    }
}
</script>

<style lang="scss" scoped>
.sample {
  &[aria-busy="false"] {
    color: blue;
  }
        
  &[aria-busy="true"] {
    color: grey;
  }
}
</style>
```
Ubuntu18.04にNVIDIAとCUDAを入れ直すことに

# 事の発端
何でもかんでも新しいことをしてみたくなる私は研究室の自分のUbuntuのバージョンもすぐに16.04から18.04にアップデート！

が、しかし！！！

教授「あ、これ18.04になってるからgpuが上手く使えてませんね。cudaを入れ直す必要がありますよ...かなり面倒ですが」

私「...か、かなりですか！？」

教授「はい、かなり面倒ですが...やりますか？（ニッコリ）」

私「...はい（涙目）」

ってことで、ちょっと色々調べてやったので、メモを残しておきます。

## ステップ1
NVIDIA, CUDA, cuDNNのアンインストール。
自分のPCにはcuDNNが入って無かった？っぽいのでアンインストールしたのは前者2つのみ！

`sudo apt-get --purge remove nvidia-*`
`sudo apt-get --purge remove cuda-*`

## ステップ2
CUDAを[ここから](https://developer.nvidia.com/cuda-10.0-download-archive)ダウンロード。
Ubuntu18.04だとcuda-10.0らしいよ？

※教授曰く、debファイルよりrunファイルを使用した方が楽だそうで、私はrunファイルをダウンロードしました。

## ステップ3
リポジトリの登録？
これは必要なのかはわからないけど、自分は一応しておいた。

`sudo add-apt-repository ppa:graphics-drivers/ppa`
`sudo apt-get update`

## ステップ4
Ubuntuの再起動！

## ステップ5
ステップ2でダウンロードしてきていたファイルを実行する。

`sudo ./cuda_10.0.130_410.48_linux.run`

何か色々出てくるけど、とりあえずYesかAcceptしておけばOK...だと思うよ？笑

## ステップ6
ステップ5でNVIDIAとCUDAがインストールされた筈なので次にcuDNNのインストールに入る。
cuDNNをインストールするには[ここから](https://developer.nvidia.com/rdp/cudnn-download)登録してダウンロードする必要がある。

俺がダウンロードしたファイルは以下の３つ。
`libcudnn7_7.5.1.10-1+cuda10.0_amd64.deb`
`libcudnn7-dev_7.5.1.10-1+cuda10.0_amd64.deb`
`libcudnn7-doc_7.5.1.10-1+cuda10.0_amd64.deb`

## ステップ7
ステップ6でダウンロードした3つをインストール（`sudo dpkg -i ○○○`）する。

※上記に記載しているファイルの順番にインストールすること！
　間違ってdevやdocを先にインストールしないように！！！

## ステップ8
cuDNNがきちんとインストールできているのか以下の手順でサンプルを試してみる。

1.サンプルをホームディレクトリにコピーする。
`$ cp -r /usr/src/cudnn_samples_v7/ $HOME`  
2. mnistCUDNNフォルダに入る。
`$ cd  $HOME/cudnn_samples_v7/mnistCUDNN`  
3. サンプルのmnistCUDNNをコンパイルする。
`$ make clean && make`  
4.実行する。
`$ ./mnistCUDNN`

もし、何も問題が無ければ以下のようなメッセージが出ます。
Test passed!

## ステップ9
終了！
お疲れ様でした〜！
Julia その２ 文字列関係

## 文字列と文字

Juliaでは文字列リテラルはダブルクォートで、文字リテラルはシングルクォートで書く。それぞれの型は`String`と`Char`だ。
この辺は、CやJavaなどと同じで、Pythonのように、どちらも文字列で適当に使い分ける、というようにはなっていない。

```
julia> typeof("test")
String
julia> typeof('t')
Char
```


`String`も`Char`も、Unicodeを表現する事ができる。ただし、`Char`は個別のUnicodeポイントを表現しているのに対して、`String`はUTF-8エンコードされたバイト列を格納している。`String`が**Charの配列ではない**ことに注意する必要がある。このあたりはRustも同じ。


文字列リテラルには任意のUnicode文字列がそのまま使える。関数`length`でUnicode文字列としての長さを得ることができる。

```
julia> s = "てすと"
"てすと"
julia> length(s)
3
```
## 文字列の結合と繰り返し

文字列の結合は、まあどんな言語にも用意されていて、普通は`+`演算子を使う。JavaもPythonもそうだ。が、Juliaではなぜか`*`演算子を使う。

```
julia> "abc" + "def"
ERROR: MethodError: no method matching +(::String, ::String)

julia> "abc" * "def"
"abcdef"
```
文字列を複製して繰り返す演算もいくつかの言語に用意されているが、普通はこちらに`*`を使う。Juliaではなんとべき乗の演算子である`^`を使う。

```
julia> "abc" ^ 3
"abcabcabc"
```
なんでだ。どこから来たんだこの言語仕様。。。

## Unicode文字列のインデックス

ここからがちょっと胡散臭い。文字列は配列のようにアクセスできるのだけど、その時のアクセスは**バイト単位**のインデックスとなる。
UTF-８エンコードは1文字が1バイトから4バイトまでの可変長表現なのでバイト単位でインデックスすると、そこが正しい文字境界である保証がない。
なので、エラーが起こる。。

```
julia> s[1]
'て': Unicode U+3066 (category Lo: Letter, other)
julia> s[2]
ERROR: StringIndexError("てすと", 2)
```

有効なインデックスを取得するには`nextindex`関数を用いる。最初と最後の有効なインデックスはそれぞれ`fistindex`, `lastindex`で得られるので次のようにすると一文字ずつ取り出すことができる。面倒臭すぎる。

```
julia> function pick1by1(s)
           index = firstindex(s)
           while index <= lastindex(s)
               println(s[index])
               index = nextind(s, index)
           end
       end
pick1by1 (generic function with 1 method)

julia> pick1by1(s)
て
す
と
```

### 所感
文字列のUnicode対応はいろいろ面倒。かつてJavaはcharを16bitにしてみなを驚かせたが、その後Unicodeが16bitでは足りなくなって、身動き取れなくなっているようだ。どうすんだあれ。

一般に、Unicode文字列への対応方法としては 1) 1文字に3-4バイト割り当てて、文字の配列として保持する 2)  UTF-8 などのエンコードにしてバイト列で保持する、の2択。

Python３は前者、Rust、Juliaは後者になっている。前者だとascii文字のみを格納する場合にデータ量が4倍になる。Rustのような性能命の言語ではこれは致命傷なので、後者を選択するのは妥当だと思うのだけど、Juliaのようなエンドユーザ向けの言語では、前者のほうが良かったんじゃないのかなあ。。
Cloud Load Balancing+GCE+Cloud NATで出口IPを固定して外部APIへアクセス

#やりたいこと
#####1.自サービスから、IP制限のある外部APIに接続したい
#####2.自サービスはGAEで動いており接続元IPが固定できないので、GCEを中継サーバ + Cloud NATで出口のIPを固定
#####3.自サービス(GAE)→中継サーバ(GCE)はサブドメインを用意し、SSL接続したい

###簡単に図にすると・・・
※「internet」の前段には自サービス(GAE)が居ます
![API構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/c25f5be4-ac3f-9800-fa10-b0847276149c.png)

#GCEインスタンスグループの設定
まずインスタンステンプレートを作成し、そのテンプレートを元にインスタンスグループを生成します。
インスタンスグループ作成時、オートスケールする/しない や インスタンス数(スケールしない場合のみ)を選択します。
デプロイ時、ダウンタイムを発生させたくない場合ローリング更新を行います。
ローリング更新するとき、【リージョンの数 > インスタンス数】にしておかないと、同時に全部更新されます。
(1リージョンに対して2つ以上のインスタンスが配置されているリージョンが最低1つ必要？)
![スクリーンショット 2019-05-08 14.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/f3def6fe-6cbd-8a32-0467-f4fbcc84563e.png)

#Cloud Load Balancingの設定
今回はHTTP(S) 負荷分散を作成していきます。
![スクリーンショット 2019-05-08 14.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/30271e3f-952e-cc93-5fe9-336c9c494856.png)

![スクリーンショット 2019-05-08 14.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/9c61f9e8-f105-e856-85a8-eff88bbab493.png)

#####バックエンドの設定
新たにバックエンドサービスを作成します。
先ほど作成したGCEインスタンスグループを選択します。
今回の場合、APIが8080で起動しているので、ポートは8080としました。
バックエンドサービス作成時、ヘルスチェックを新規作成します。同じくポートは8080としました。
![スクリーンショット 2019-05-08 14.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/090d8280-6e44-a8ff-7e30-27284f73f030.png)

#####ホストとパスのルール
今回はデフォルトのままとしました。

#####フロントエンドの設定
IPを固定する場合、外部IP アドレスを開き、IPアドレスを確保してからフロントエンドに割り当てます。
![スクリーンショット 2019-05-08 14.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/a1ddf8f4-833f-b55a-15ef-1542befaa0d3.png)
（IP固定しない場合エフェメラルを選択します。）

HTTPSプロトコルにしたい場合、既存の証明書をアップロードするかSSL証明書を新規作成します。
![スクリーンショット 2019-05-08 14.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/b4f03deb-64e2-1693-a451-45494e921cab.png)

今回は、先程確保した固定IPアドレスに対して、ドメインを紐づけてあるので、その情報で証明書を新規作成します。
![スクリーンショット 2019-05-08 14.22.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/1a08c151-2de7-b076-196e-2df0f2b986df.png)

#####完了ボタンを押してしばらく待ちます。
ロードバランサの詳細を開いて、バックエンドの「n/n個のインスタンスが正常です」と表示されていれば成功です。
![スクリーンショット 2019-05-08 14.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/db8b0926-ba65-bfc4-dd2f-df50059be575.png)

###ファイアウォールの設定
※ロードバランサから各インスタンスへのヘルスチェック時、ヘルスチェックのソース元IPアドレスを許可しないといけません。
IP範囲は公式ドキュメントに記載されています。
https://cloud.google.com/compute/docs/load-balancing/health-checks?hl=ja

#Cloud NATの設定
インスタンスグループが外部に出ていくときのIPアドレス=NATのIPアドレスとなるように設定をします。
Cloud Routerの選択で、
・VPCネットワーク(今回はdefault)
・リージョン(任意のリージョン)
・Cloud Router
を入力し、作成を完了させます。

![スクリーンショット 2019-05-09 16.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/2573c85d-93f7-c9a5-de05-7f918243761a.png)

Cloud Routerはnameを決めて作成するだけです。
![スクリーンショット 2019-05-09 16.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/ae45ee9e-09b9-4d07-e431-710f3f7c4691.png)

確保しているIPアドレスをNATのIPアドレスとして設定してあげます。
![スクリーンショット 2019-05-09 16.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/b24658b1-c90a-c3ea-90de-e93562a5bdb3.png)
Ubuntu 18.04 + apt clang 8.0.1 で hipify-clang をビルドする

`hipify-clang` は, CUDA コードを HIP に変換するユーティリティです.

`hipify-perl` は ROCm の apt パッケージ(or HIP apt パッケージ?)で入りますが, C++ 構文レベルでの変換に対応してより確実に変換できる(はず)の `hipify-clang` を使ってみたいですが, `hipify-clang` は prebuilt バイナリがありません.

`hipify-clang` のビルドには LLVM+Clang が必要になります. 

https://github.com/ROCm-Developer-Tools/HIP/tree/master/hipify-clang

によると, 2019 年 5 月 9 日時点では LLVM+Clang 8.0.0 との組み合わせが最新 stable です.

ソースからビルドするのは面倒なので, llvm+clng を apt で入れます.
 
https://apt.llvm.org

にあるように key を入れて, `/etc/sources.list` あたりに clang8 の deb list を追加します.

```
$ sudo apt update
$ sudo apt install clang-8 clang-8-dev
```

2019 年 5 月 9 日時点では 8.0.1 がインストールされました.
`clang-8-dev` を入れないとヘッダーファイルが入らないので忘れないようにしましょう.

あとは hipify-clang のドキュメントにあるようにしてビルドします.


```
cd hipify-clang
mkdir build dist
cd build

cmake \
 -DCMAKE_INSTALL_PREFIX=../dist \
 -DCMAKE_BUILD_TYPE=Release \
 ..

make -j install
```
[光るボタン]特定のセクションで実行 or 一定時間毎に実行

自分用メモです

キラっと光るボタン、CSSのanimationで光らせると間隔が短いので
自由なタイミングで実行させます。バリエーションは下記の二通り。
・特定のセクションまでスクロールしたらその度光る
・一定時間毎に光る

下記サイトを参考
[jQueryでつくるキラッと光るボタン](https://nakazilab.com/shiny-button/)
[jQueryで長いページの区切り（セクション）ごとに背景を変化させる](https://www.webopixel.net/javascript/487.html)


#特定のセクションで実行
共通のHTML、CSSは後述（ほぼ参考サイトままです）
特定のセクションまでスクロールしたら光らせるため、
任意のセクションに`class="shiny-section"`をつける。

```javascript:jQuery

  var shinyObj = '.button a span.shiny';
  var shinySpeed = 1000;
   
  $(function() {
    var pageTop = $('html, body');
    var secTopArr = new Array();
    var current = -1;
    $('.shiny-section').each(function (i) {
        secTopArr[i] = $(this).offset().top;
    });
    //スクロールイベント
    $(window).scroll(function () {
        for (var i = secTopArr.length-1; i>=0; i--) {
            if ($(window).scrollTop() > secTopArr[i]) {
                chengeBG(i);
                break;
            }
        }
    });

    function chengeBG(secNum) {
        if (secNum != current) {
            current = secNum;
          $(shinyObj).animate({left:'+=350px'},shinySpeed).animate({left:'-60px'}, 0);
        }
    }
  });
```

#一定時間毎に実行
（ほぼ参考サイトまま）

```javascript:jQuery
  var shinyObj = '.button a span.shiny';
  var shinySpeed = 1000;
  var interval = 10000;
  
  $(function() { setTimeout('shinybutton()', 1000 ); });
  function shinybutton(){
    $(shinyObj).animate({left:'+=350px'},shinySpeed).animate({left:'-60px'}, 0);
    setTimeout('shinybutton()',interval);
  }
```

一応共通のHTMLとCSS。ほぼ参考サイトまま（スタイルは若干適当）

```html:html

<section>
    <div class="button">
        <a href="#">
            <span class="shiny"></span>
            <span class="btn">shiny button</span>
        </a>
    </div>
</section>

```

```css:css

.button a {
	background: #d43029;
	padding: 10px;
	overflow: hidden;
	position: relative;
	display: block;
}
.button a span.shiny {
	position: absolute;
	left: -60px;
	top: -50px;
	z-index: 30;
}
.button a span.shiny { /*shiny*/
	display: block;
	width: 38px;
	height: 150px;
	margin-top: 7px;
	-webkit-transform: rotate(30deg);
	-moz-transform: rotate(30deg);
	-o-transform: rotate(30deg);
	background-image: -webkit-gradient(linear, left top, left bottom, from(left), color-stop(0%, rgba(255,255,255,0)), color-stop(50%, rgba(255,255,255,1)),to(rgba(255,255,255,0)));
	background-image: linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 50%,rgba(255,255,255,0) 100%);
 	background-image: -webkit-gradient(linear, left bottom, right bottom, color-stop(0%,rgba(255,255,255,0)), color-stop(50%,rgba(255,255,255,1)),color-stop(100%,rgba(255,255,255,0)));
}
```
git hub desktop 1.6でマージしたのに変更分がこのブランチに反映されていない

マージしたのに変更分がこのブランチに反映されていない
というのは、
update from masterは上部メニューバーなどで行う仕様に変更したことが問題である。

リモートmasterからローカルmasterへは、origin fetchボタンがあるので更新可能だが、
作業ブランチに関してはupdate from master（上部メニューバー）でないとmasterの変更分がブランチに反映されない謎仕様。

ちょっと、使いづらさはあるかなぁと思いました。
Fedora30 アップグレードガイド(コマンドライン編)

Fedora 29 からFedora 30 へコマンドラインでアップグレードする方法
================================================================

`dnf upgrade` プラグインを使うことでアップグレードすることができます。
今回はこの`dnf upgrade` を使ってFedora 29 からFedora 30
にアップグレードする手順を紹介します。

現行のパッケージのアップデートとバックアップ
============================================

Fedora 30 へのアップグレードを実施する前に現行のFedora29
のパッケージを最新にしします。

``` console
$ sudo dnf upgrade --refresh
```

その他必要なデータにつては適宜バックアップを取得しておくようにしてください。

DNF プラグインのインストール
============================

DNF プラグインを下記コマンドでインストールします。

``` console
$ sudo dnf install dnf-plugin-system-upgrade
```

DNF によるアップデート開始
==========================

パッケージのアップデートとDNF
プラグインのインストールが環境したら以下のコマンドでFedora 30
へのアップグレードを開始することができます。

``` console
$ sudo dnf system-upgrade download --releasever=30
Before you continue ensure that your system is fully upgraded by running "dnf --refresh upgrade". Do you want to continue [y/N]:   <- y で回答する
......
```

上記コマンドを実行するとアップグレードに必要なファイルをローカルにダウンロードします。
もしパッケージに問題(依存関係の破損や既にメンテナンスされていないパッケージ等)がある場合、`--allowerasing`
フラグを付けることでDNF
にアップグレードの妨げになっているパッケージの削除を許可するようになります。
今回自分の環境でも`--allowerasing`
フラグをつけてアップグレードすることになりました。

再起動とアップグレード
======================

system-upgrade コマンドの実行が完了したら、アップグレードboot
プロセスに入るために以下のコマンドを実行します。

``` console
$ sudo dnf system-upgrade reboot
```

上記コマンドを実行するとシステムがシャットダウンしてアップグレードが走ります。この間数十分はかかるので気長に待ちましょう。。。
アップグレードが完了すれば自動的にreboot
してシステムが起動するようになります。

以上でアップグレードは完了です。大抵のユーザの場合はこれでFedora 30
を楽しめるようになっています。
残りの手順は、細かい警告などを取り除くために必要に応じて実施するようにしてください。

rpm/dnf ツールを実行するたびに警告が出る
----------------------------------------

rpm/dnf
ツールを実行するたびに警告が出るようになってしまう場合は何かしらの理由でdatabase
が競合を起こしてしまっている可能性があります。そのときは`/var/lib/rpm/`
ディレクトリを念の為バックアップした上で以下のコマンドを実行します。

``` console
$ sudo rpm --rebuilddb
```

distro-sync をつかって依存関係問題を解決する
--------------------------------------------

システムアップグレードツールとしてdistro-sync
メソッドが標準で使用されます。あなたのシステムが部分的にアップグレードから取り残されてしまったり依存関係の問題を見つけた場合は、他のdistro-sync
コマンドを手動で実行することで解決するかもしれません。
このコマンドはインストール済みのパッケージを、ダウングレードすることになったとしても、リポジトリの利用可能なバージョンと厳密に同じにできるかどうかを試行します。

``` console
$ sudo dnf distro-sync
```

より強い指定として`--allowerasing`
オプションを指定することもできます。これを指定することによりDNF
によりパッケージの削除を許可するようになります。
本当に削除して大丈夫なパッケージかどうかは責任を持って実施するようにしてください。

``` console
$ sudo dnf distro-sync --allowerasing
```

最新のSELinux ポリシーで再ラベル化する
--------------------------------------

現在のSELinux
ポリシによりいくつかの操作が許可されない場合は、いくつかのSELinux
のパーミッションが誤っている可能性があります。
これは何かのバグ起因で発生したか、過去にSELinux
を停止していた期間があることによる可能性があります。 すべてSELinux
の権限を再ラベルする場合は以下のコマンドを実行することで可能です。

``` console
$ sudo fixfiles onboot
```

参考
====

Upgrading Fedora 29 to Fedora 30
<https://fedoramagazine.org/upgrading-fedora-29-to-fedora-30/>

<!-- -->

Taking smart backups with Duplicity
<https://fedoramagazine.org/taking-smart-backups-duplicity/>

<!-- -->

Resolving post-upgrade issues
<https://fedoraproject.org/wiki/DNF_system_upgrade#Resolving_post-upgrade_issues>
不確定性原理の物理的解釈を説明する。

# Introduction 
量子力学における根本の一つ、「不確定性原理」。それを電子に電磁波をぶつけることを例にわかりやすく解説します。

# 観測する = 光(電磁波)をぶつける。
よく人が物体を視覚として捉える説明として、光の「反射・屈折・吸収」なんてものがありますよね。つまり、人が物体を観測したり、測定したりするためには光が必要なのです。

# 光とはあるエネルギーを持った波動である。
光の振動数を$\nu$とすると、そのときの光のエネルギーは$h \nu$になることが知られています。これを電子にぶつけてみましょう。

# 光(電磁波)とは電場と磁場が振動する波である。
磁場によるローレンツ力は電場に比べて非常に小さい(光の速度分の1)のでそれは無視します。つまり電子君は電場によって加速され、振動運動を始めることになりますね。

# 電子が受け取った運動エネルギーから不確定性原理をざっくり計算してみよう。
電子が受け取ったエネルギーを$\Delta E$とすると、これは光の持つエネルギーに大体等しいはずですね。だって電子と光が出会ったことで生まれた運動エネルギーですから。

```math
\Delta E \simeq h \nu
```

ここで$\nu$が光の振動数であることを思い出しましょう。電子の位置や運動量を観察しようと光をぶつけたのに、電子はこの振動数で運動することになります。光の振動数、もとい電子の運動の振動数は光の周期$\Delta t$を用いて$1/\Delta t$と書けますから、

```math
\Delta E \Delta t \simeq h 
```

という不確定性原理のエネルギー・時間バージョンが導けました。

# さらに変形。
運動エネルギー

```math
E = \frac{p^2}{2m} \ \Longrightarrow \ 
\Delta E = \frac{p}{m} \Delta p = v \Delta p 
= \frac{\Delta x}{\Delta t} \Delta p
```

を代入すれば、皆様おなじみの

```math
\Delta x \Delta p \simeq h
```

という不確定性原理を導くことができました。

# 総括
電子に光をぶつけて観察する、という物理的に理解しやすい現象から不確定性原理を説明してみました。結果、電磁波がぶつかることで電子にもその波動の物理が適用されることがわかりました。もちろんこれは直感的にわかりやすく不確定性原理を理解するためのものであって、不完全な説明です。なぜなら「じゃあ電荷を持たない素粒子はどう説明するの？」となるからです。それを理解するには数学的導出やオブザーバブルな量についての知識が必要になります。つまりこの説明は古典的な説明にすぎません。もし興味が沸いたら、そのうちまた記事を投下します。
[Rails] deviseの導入手順

## 手順1

```ruby:Gemfile
gem 'devise'
```

```console:ターミナル
$ bundle
$ rails g devise:install
#これをすると以下のようになる

===============================================================================
Some setup you must do manually if you haven't yet:
  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:
       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
     In production, :host should be set to the actual host of your application.
  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:
       root to: "home#index"
  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:
       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>
  4. You can copy Devise views (for customization) to your app by running:
       rails g devise:views
===============================================================================

```

## 手順2
・ビューの作成

```console:ターミナル
$ rails g devise:views
```

・Userモデルの作成

```console:ターミナル
$ rails g devise User
# この時にmigrationファイルが作成されるのでusersテーブルに追加したいカラムを記述すると良い。
# 今回はnameカラムを追加するとする。

$ rails db:migrate
```

## 手順3
手順2で追加したnameカラムを使用できるように設定します。

app/controllers/application_controller.rb

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  #このコードがあると、Railsで生成されるすべてのフォームとAjaxリクエストにセキュリティトークンが自動的に含まれます。セキュリティトークンがマッチしない場合には例外がスローされます。(Railsガイド)
  protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  
  #configure_permitted_parametersはストロングパラメータを設定するメソッド。
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
end

```

基本的な操作は以上。


## 番外編
ユーザー編集をパスワード無しで行う。

```ruby:registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController

  protected

  def update_resource(resource,params)
    resource.update_without_password(params)
  end
end
```
上のコードを使うにはroutingを変更しないといけない。

```ruby:routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: "registrations" }
end
```