OmniAICreator/Qiita-1.07M huggingface dataset:
AWS 認定ソリューションアーキテクト – アソシエイト合格できたので記念に記事を書いてみる。

皆さん初めまして、エンジニア見習い(2年目突入）のSawada(@AtSw0524)と申します。
Qiita に登録だけしておいて何も書かないというのもどうかと思いますので、AWS 認定ソリューションアーキテクト-アソシエイト(以下、SAA-C01)に合格した記念に一つ記事を書いてみたいと思います。

同じ資格を目指している方々に少しでも参考になれば幸いです。

##自己紹介
　実務歴は2年未満の自社サービス(クラウド関係)のエンジニア。
　持ってる資格
　　　- CCNA/LPIC-Level3/AWS SAA-C01。
　何ができるの？
　　　- 個人レベルで、Webサーバの構築やネットワークの設計構築の経験はあり。現在自宅ではゲームサーバを公開して、増えるトラフィック量をみてにやける日々を送っています。
　　　　学生時代は主にネットワーク関係とLinuxを重点的に学んでいたので、プログラミング言語は独学で少し触っている程度です。

##AWSについての前提知識
　まっっっったくなかったです。
　強いて言えば、自社サービスとして展開しているクラウドとAWSを連携させてサービスを展開させているお客様がいらっしゃいましたので、その中で出てきたサービス名を覚えていたくらいですね。

##勉強にあたって
　勉強にあたって参考にした書籍類は以下のものです。

■ 合格対策 AWS認定ソリューションアーキテクト - アソシエイト（[リンク](https://www.amazon.co.jp/b/ref=student_matome?node=5367902051&pf_rd_p=63989370-9d78-47f8-8da4-e0df9a07556e&pf_rd_s=detail-ilm&pf_rd_t=201&pf_rd_i=486594043X&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=7HRCFBN3RCNQVK3JH2NQ&pf_rd_r=7HRCFBN3RCNQVK3JH2NQ&pf_rd_p=63989370-9d78-47f8-8da4-e0df9a07556e)）
　この本に関して、現在増え続けているAWSのサービスに追いつけていない部分もありますが、新旧問わずサービスを知る原点の一つになるのでは、と思い一応紹介させて頂きます。

■ AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト([リンク](https://amzn.to/2WEcgwp))
　最強の一冊。
　私はこの本で合格できたといっても過言ではありません。
　章末の「本章のまとめ」が非常にわかりやすく、知識を固めるにはこの一冊ではないでしょうか。
　また、新サービスに関しても記載があり、図もわかりやすく丁寧に作られているので、図を見ながら視覚的に学びたい人などは楽しんで読めるかと思います。

■Amazon Web Services実践入門 (WEB+DB PRESS plus)([リンク](https://www.amazon.co.jp/Amazon-Web-Services%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-PRESS-plus/dp/4774176737/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=AWS+%E5%AE%9F%E8%B7%B5&qid=1560621416&s=books&sr=1-1))
　とりあえず手を動かしてみたい人へ。
　AWSコンソールを利用したEC2の起動から簡単なサービスの立ち上げまで経験できます。
　他にも、AWS CLI のインストールからCLIを利用した設定時のパラメータ、コマンドの実行結果などが詳しく書かれているので、AWSに慣れるにはもってこいだと思いました。


基本的に、読んだのは上記の3冊だけです。

あとは公式のホワイトペーパーを軽く読んでみたりしてました。

##学習期間

　学習期間は8カ月くらいですかね。もうちょっと短いかもしれません。
　サービス覚えたりするよりも、知らない単語が多すぎたせいで辺に時間を取られてしまいました。(特にDB周り！！)
　
　私の場合は基礎知識が足りなかったので、出てきた用語を一個ずつ調べながら意味を理解し、そのうえでAWSサービスの理解を深める、といった流れでしたので、結構時間が掛かってしまいました。

##試験について

　私が受験に利用したテストセンターでは、他の受験者が言っていたような試験官とのチャットなどは特にありませんでした。監視カメラが部屋の上四隅についているだけの部屋に案内され、黙々と問題を解くだけでした。（日本語で受験したから？）

・試験時間は140分。
・問題数は65問程度(?)
・日本語はcisco試験のようにおかしなところはあまりなく、十分理解できる。

　設問の問題文が長く、シナリオ仕立てになっているので読み解くのに時間が掛かってしまいました。
　おそらく人によって出題される傾向は違うとは思いますが、私の場合は
　　・可用性のある設計
　　・RDSについて
　　・ストレージ(この要件ならどのストレージタイプを使いますか、みたいな)
　　・IAMについて
　　・VPC(ACLやセキュリティグループ)

　が多く出題された印象があります。参考程度に。

　VPCに関しては、もともとネットワークの知識はあったので特別難しくは感じなかったですが、RDS周りがちょっと怪しかったです。
　
　実際に回答に使った時間は80分程度で、60分近く時間を余らせてしまいました。
　すべての問題を解き終わった後には、別画面へと遷移したのちアンケートが9問ほどありますので、そちらを回答し終えたら合否の発表画面へと遷移します。

　ちなみに、受けた後テストセンターではスコアレポートが出ないので、自分のAWSアカウント(申し込みの時に使ったアカウント)から確認しに行きましょう。
　私の場合は8時間程度経ってから反映されました。
　メールで合格通知が来たのは24時間後でしたので、気長に待ちましょう。

##まとめ

　モチベーションを上げるためにとった資格でしたが、思いのほか苦戦してしまいました（笑）
　特に業務でAWSに触らせてもらえるわけでもないですが、自宅ラボのサーバとS3接続して遊んだり、そのうちAlexaとDynamoDBとかを連携させて遊んでみたりしてみたいですね。

---------------------
　初めてQiita、というかこのような投稿サイトに自分の言葉で何かを投稿するのは初めてなので、読みづらい点があるとは存じますが目をつむってくだされば幸いです。

　SAA-C01を受けるにあたって気になる事があればtwitterやコメントで連絡頂ければできるかぎりお答えしますので、お気軽にどうぞ！
　これから受ける方は頑張ってください！！応援しております！
Discord bot「雲さん」に占い機能を追加した

# はじめに
以前記事にしたDiscord bot「雲さん」へ追加した機能のご紹介です。
詳しくは「[Discord bot「雲さん」を作ってみた](https://qiita.com/charichuma_hack/items/dfcdd422be46ffc311aa)」をご参照下さい。

# 追加機能
- 「Web ad Fortune 無料版API」を使った占い機能  
  - powerd by <a href="http://jugemkey.jp/api/">JugemKey</a>
  - 【PR】<a href="http://www.tarim.co.jp/">原宿占い館 塔里木</a>

# 関数本体
- 関数の呼び出しは`text.find("座") > -1`とかにして使って下さい。
- Discordの絵文字はSlack`:hoge:`とすることで表示できるため、簡単にそれっぽい見た目になっていい感じでした。

```horoscope.py
# Horoscope
def uranai(text):
    response_string = ''
    seiza = 100
    date = datetime.datetime.today().strftime("%Y/%m/%d")
    index_st = text.find(' ')+1
    index_ed = text.find('座')+1
    search_text = text[index_st:index_ed]
    print(search_text)
    seiza_list = ("牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座", "蠍座", "射手座", "山羊座", "水瓶座", "魚座")
    seiza_list2 = ("おひつじ座", "おうし座", "ふたご座", "かに座", "しし座", "おとめ座", "てんびん座", "さそり座", "いて座", "やぎ座", "みずがめ座", "うお座") 
    try:
        seiza = seiza_list.index(search_text)
    except:
        try:
            seiza = seiza_list2.index(search_text)
        except Exception as e:
            response_string = "君の星が…見えない… :cloud:"
    try:
        res = requests.get(url='http://api.jugemkey.jp/api/horoscope/free/'+ date)
        txt = res.json()["horoscope"][date][seiza]
        job = emoji(int(txt["job"]), "job")
        money = emoji(int(txt["money"]), "money")
        love = emoji(int(txt["love"]), "love")
        total = emoji(int(txt["total"]), "total")
        response_string = "今日の**" + txt["sign"] + "**の運勢は。。。**" + str(txt["rank"]) + "位**！\n" + txt["content"] + "\nラッキーアイテムは**" + txt["item"] + "**で、ラッキーカラーは**" + txt["color"] + "**。\n仕事運："+job+"\n金　運：" + money + "\n恋愛運：" + love + "\nトータルは..." + total + "です！良い一日を！"
        #print(response_string)
    except Exception as e:
        print("君の星が…見えない… :cloud:")
    return response_string

def emoji(number, category):
    res = ''
    for i in range(number):
        if category == 'job':
            res += ':briefcase: '
        elif category == 'money':
            res += ':moneybag: '
        elif category == 'love':
            res += ':heart: '
        elif category == 'total':
            res += ':star: '
    return res
```

# おまけ

めちゃめちゃ単純なおみくじ。

```omikuji.py
# Omikuji
def omikuji():
    response_string = ''
    lots = ["大吉", "吉", "中吉", "小吉", "半吉", "末吉", "末小吉", "平", "凶", "小凶", "半凶", "末凶", "大凶", "未分"]
    random.shuffle(lots)
    lot = lots[0]
    print(lot)
    response_string = "あなたの運勢は...ｶﾞｼｬｶﾞｼｬｶﾞｼｬｶﾞｼｬ...\n\n　　　　" + lot + "　ですね！"

    return response_string
```

# 使い方
- 雲さん 双子座の今日の運勢は？
<img width="854" alt="スクリーンショット 2019-06-16 03.19.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82393/42d27aaa-6516-405c-83a7-8b5cd58fb48e.png">

- 雲さん 占い！
<img width="535" alt="スクリーンショット 2019-06-16 03.20.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82393/f5def293-ddca-c7e4-ac02-5d19f2a4432f.png">



# 参考
- [Web ad Fortune 無料版API](http://jugemkey.jp/api/waf/api_free.php)
データベース正規化　大事なとこだけ

正規化とは
データベースのデータ構造をシンプルする手順。
効率的で重複や無駄のないデータ構造にできる。

正規化は、非正規形、第一正規形、第二正規形、第三正規形という順番で行う。
第三正規形以降には、ボイスコッド正規形、第四正規形、第五正規形と続くが、
パフォーマンスが低下するので（小さなテーブルが増えSQL発行回数が増え速度が低下）、
必要最低限のレベルである第三正規形までで留めることが多い。
また、第二正規形と第三正規形は非常に似ており、その違いは複雑であるため第二正規形は割愛する。

## 非正規形のテーブル

|id|student|homeroom|class1|class2|class3|
|:-:|:-:|:-:|:-:|:-:|:-:|
|0|A|1-1|Japanese|English|Math|
|1|B|1-2|Japanese|English|Math|


## 第一正規形にする：同種のカラム一つにする

|id|student|homeroom|class|
|:-:|:-:|:-:|:-:|
|0|A|1-1|Japanese|
|0|A|1-1|English|
|0|A|1-1|Math|
|1|B|1-2|Japanese|
|1|B|1-2|English|
|1|B|1-2|Math|

## 第三正規形にする：重複する値があれば束ねる。そのためにテーブルを分ける。

student table

|id|student|homeroom|
|:-:|:-:|:-:|
|0|A|1-1|
|1|B|1-2|


class table

|id|name|student_id|
|:-:|:-:|:-:|
|0|Japanese|0|
|1|English|0|
|2|Math|0|
|3|Japanese|1|
|4|English|1|
|5|Math|1|
トリアエーズなClassモジュールの使い方。

# VBAのClassモジュールの使い道

そんなに技術があるわけでもないので初心者向けのクソTIPSしか書けないかなしさ。
Classモジュールは非常に便利だから多用したくなるのはよくわかるけども、あまりカッチリした設計ができないうちから多用しているとアリの巣のようにゴッチャゴチャしたコードになってしまって、メンテナンスが非常にめんどくさい。
だから、可能な限りどのマクロにも共通で利用できるような作り方をしてドンドン流用するようにした方がいいかも。

## 参照設定の呼び出しに便利
その考え方でいくと、これが最も理にかなっている使い方と思っている。
通常、FSOやWSHなどのオブジェクトを使うときは、参照設定でこいつらにチェックを入れてると思う。
ただし、それだと他のユーザが使うことを考慮すると、あまり効率的とは言えない。
当然、そのマクロを使うときに参照設定をONにしないといけないからだ。
そのために使われているのがCreateObject。これでオブジェクトを定義してやれば、参照設定をする必要がない。

ただ、問題はコードがめっちゃ長くなるのが好きじゃない。
このオブジェクトを有効化するために絶対2行に使うし、一行が長くなる。
工夫するとややこしくなるし。

そこで提案したいのがこちら。

## ClassモジュールのGetプロパティを活用する。

例えば以下のように記述する。

```ruby:ClassモジュールでFSO呼び出し
'Classモジュール名は「CallObject」

Property Get FSO() as Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
End Property
```

こいつを標準モジュールに組み込む場合、こうなる。

```ruby:マクロブックが存在するフォルダの全ファイル名を表示
sub ShowFileName ()
 dim obj as New CallObject
 for each File in obj.FSO.GetFolder(thisworkbook.path).Files
   msgbox File.Name
 next
end sub
```

Classモジュールを使わなかったらこんな感じ。

```ruby:マクロブックが存在するフォルダの全ファイル表示
sub ShowFileName ()
 dim FSO as Object
 Set FSO = CreateObject("Scripting.FIleSystemObject")
 For each File in FSO.GetFolder(thisworkbook.path).Files
   msgbox File.Name
 next
end sub
```

ん？そんな変わらんのじゃないかって？
これならClass作る方が手間じゃね？って？

じゃあ次行きましょうか。

## 複数のオブジェクト呼び出し時こそ真骨頂

FSOやWSHなど、複数のオブジェクトを呼び出すときこそ効果を発揮する。

```ruby:FSOとWSHをClassで呼び出す
'Classモジュール
''FSOのプロパティ
Property Get FSO() as Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
End Property

''WSHのプロパティ
Property Get WSH() as Object
  Set WSH = CreateObject("Wscript.Shell")
End Property

'ここから標準モジュール
''マクロブックに存在するファイルを全部コピー
sub CopyFile()
 dim obj as new CallObject

 For each File in obj.FSO.GetFolder(thisworkbook.path).Files
   obj.WSH.Run "cmd.exe /c XCOPY " File.path & " " & "backup_" & File.path
 next
end sub
```

見てお分かりと思いますが、Classモジュールを一つ呼び出すだけで、二つのオブジェクトを呼びだしています。
コードは非常に簡略化され、可読性が向上していると思います。
また、この用途の場合、別のマクロ書くときにそのまま流用できるのがよいところです。

## 問題点
当然お気づきの人もいると思いますが、上記の使い方の場合、FSOやWSHを使うたびにわざわざオブジェクトを呼び出しています。
例えば、マクロブックフォルダ配下に5個ファイルがあるとすると、マクロ内では
`set WSH = CreateObject("Wscript.Shell")`
を5回繰り返すことになります。
リソース食いまくるので開発するコードが短ければよいですが、長い場合処理速度に影響がでるかもしれません。
ただ、100行程度のマクロにはほぼ影響がないです。影響が出るようなら
呼び出したオブジェクトを変数に格納すればいいと思います。

以上
【個人的メモ】Javaの開発環境が整った

#ようやく開発環境できました(06/16追記)

今まではProgate上でしかJavaを書いてなかったので、自PC上に開発環境を構築していなかった。
これから自分で作成していくことも必要になるので、ようやく開発環境を構築することに。

##用意したもの
- Pleiades All in One

とりあえずこちらの記事（[【Java初心者必見！】Javaの開発環境を構築する方法を解説！](https://www.sejuku.net/blog/12236)）で紹介されていた「Pleiades All in One」というのをダウンロードしてEclipseをインストールした。
起動できたため、簡単なコードを書いて実行しようということに。

「新規」→「Javaプロジェクト」
から適当なプロジェクト名を入れて作成。
「新規」→「パッケージ」
ここも適当なパッケージ名を入れて作成。
「パッケージ」→「新規」→「クラス」
ここも適当に入力して作成。

試しに一文だけ表示するプログラムを書いて「実行」。
が、エラーを吐いて実行されない。

色々と対処法を探すことに。

##結局
何がいけなかったかっていうと、
**そもそもJDKが入っていなかった。(呆れ)**

元はといえば、横着しようとして「Pleiades All in One」で済むわ！
ってやっちゃったのが原因でした。

すぐさまJDKの12.0．1をダウンロード・インストール
Eclipseの設定から「インストール済みのJRE」にJDK12.0.1を追加して事なきを得ました。

---
###※追記
記事を書いた時は、jdkとjreをどうやらごっちゃに考えてしまっていたようで、
>この環境と厳密に互換性のあるワークスペースにインストールされた JRE がありません。

って警告は出たままになっていたわけです。
その後、「インストール済みのJRE」から「Pleiades All in One」に入っているjreを検索して設定をし直したところ、無事警告が出ることなく実行することができました。（今度は違うエラーが出てしまったけれど、それはまた別のお話ってことで）

##教訓
- 初心者の癖に横着しようとするのはいけないなと思いました(小並感)。

なにはともあれ、これで開発環境は整ったので、色々やっていこうと思います。
-1, 0, 1, 2, 3, ... , nullの順にソートしたかった話

# やりたかったこと

Laravelで

```php:
$array = [null, 1.5, 1.0, 0.5, 0, -1.0];
```

のような配列を

```
[-1.0, 0, 0.5, 1.0, 1.5, null]
```

のように数値は昇順にしつつ、nullを最後に持っていきたかった。

JavaScriptなら

```js:
let arr = [null, 1.5, 1.0, 0.5, 0, -1.0];
console.log(arr.sort()); // [-1, 0, 0.5, 1, 1.5, null]
```

`sort()`を使えば良いようだ。

# 環境

- PHP 7.2.16
- Laravel 5.5.45

# やってみる

```php:
$collection = collect([null, 1.5, 1.0, 0.5, 0, -1.0]);
```

Laravelなので、配列をコレクションにして取り扱うことにする。

```php:
$sorted = $collection->sort()->values();
```

`sort()`メソッドを使ってみるが、


```
// $sortedの中身
=> Illuminate\Support\Collection {
     all: [
       null,
       -1.0,
       0,
       0.5,
       1.0,
       1.5,
     ],
   }
```

nullが最初に来てしまう・・・。

# こうしてみた

```php:
$sorted = $collection->sortBy(function($item){
    return $item === null ? PHP_FLOAT_MAX : $item;
})->values();
```

`sortBy()`は指定したキーでソートしてくれる。
関数を渡し、それをもとにソートさせることも可能だ。

`PHP_FLOAT_MAX`はPHP7.2.0から登場し、浮動小数点の数値として最大を表す。

これらを利用し、コレクション中のnullを最大値として見せかけることにした。

```php
// $sortedの中身
=> Illuminate\Support\Collection {
     all: [
       -1.0,
       0,
       0.5,
       1.0,
       1.5,
       null,
     ],
   }
```

作戦成功。

数値は昇順に並びつつ、nullが最後に来てくれた。
DjangoのHTMLテンプレートに文字列をハードコードするのを辞めたい

# はじめに
僕がやめたいのは、HTMLテンプレートに記述してる赤枠みたいなやつ。
サーバのレスポンスによって表示する値を変える必要があるものは対象外です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/37cfc33c-1893-9517-61c0-44c9c90db8e9.png)
  
最近Djangoのプロジェクトに携わらせてもらっているのですが、HTMLが文字列のハードコードだらけで阿鼻叫喚中です。

なぜそこにそんなに違和感を抱いているかといいますと、
前のプロジェクトでは、HTML(JSP)はおろか、サーバーサイドでも文字列のハードコーディングは原則禁止されていたからです。

ちなみに、前プロジェクトはJavaのフレームワークSeasar2を使用した業務アプリ開発で、以下のような感じにしてました（LabelKeys.javaとかMessageKeys.javaとかもありますが、伝わればいいので省略）。
>■HTMLに表示するものは「label.properties」にキーとバリューを定義し、Labels.javaにそこから取得するためのメソッドを定義
  
>■メッセージ関連は「messages.properties」にキーとバリューを定義し、Messages.javaにそこから取得するためのメソッドを定義
  
>■JSP, サーバーサイドは上記Labels.javaおよびMessages.javaを使用することで文字列のハードコーディングを抑制する
  
Djangoもカスタムテンプレートタグを作成できるので、その機能を使用して同じようなことをしたいと思ったわけです。
  
共通のlabel.pyを作成、各アプリケーションにもtemplatetags/label.pyを作成して各々のテンプレートで'{% load label %}'を差し込めばいけるなと思ってました。
***しかし、せっかくなら全てのアプリケーションから使用できるラベルを作りたい！！！***
と思ったので作ってみました。

# バージョン情報
Django: 2.1.5
Python: 3.7.2
  
# 全てのアプリケーションから共通で使用できるラベルを作成
プロジェクト直下にlabelsフォルダを作って、そこにlabel.pyを作成。

```labels/label.py
from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter()
@stringfilter
def label(key):
    value = label_keys.get(key)
    if value is None:
        value = ""
    return value

label_keys = {
    #########################
    # 共通のラベルとか
    #########################
    'common_update': '更新',
    'common_regiter': '登録',
    'common_cancel': 'キャンセル',
    'common_delete': '削除',
    #########################
    # app1のラベル
    #########################
    'app1_title': 'Qiita（テンプレート使用）',
    'app1_description': 'Qiitaに投稿（テンプレート使用）',
}
```
  
各アプリケーションから使用できるようにsettings.pyのTEMPLATESに追記
`'libraries'`がすでに記述されている場合は、そのなかに追記してあげてください。

```
...
..
.

TEMPLATES = [
    {
        ...
        ..
        .
        'OPTIONS': {
            ...
            ..
            .
            'libraries': {
                'label': 'labels.templatetags.label'
            }
        },
    },
]
...
..
.
```
  
テンプレートから使用してみる
`{% load label %}`にはsettings.pyに指定した値（今回はlabel）
その下の埋め込み変数は`{{key | 使用するメソッド名}}`としてあげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/8fe07dc8-fcb4-c9c5-4938-7f2978fca0e8.png)

できた(｀・ω・´)
まあ、結局キー値をハードコードしてるんですけどね。。。(　´Д｀)=3
エクセルファイルかなんかでキーバリュー管理して、関数で埋め込み変数を生成してあげたり、スクリプト使ってlabel.pyを自動生成したりできるので、個人的にはかなり嬉しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/6896f595-cdb5-d22f-2901-ae18051d08dd.png)
  
[つづきはこちら](https://qiita.com/Butterthon/items/01f6bc95c979c518b105)
  
# 参考
https://qiita.com/Thort/items/88ed3150339090ef0c98
microsoftの新言語bosqueの開発環境をセットアップ

##bosque languageとは
複雑性を回避し、人間にとっても機械にとっても単純明快に推論しやすいコードになるように設計されているらしいです。
「機械にとっても」、というのは先進性を感じます。誰かが書いたコードは、もはや人間が見るかどうかわかんないんですね。

主な特徴は以下。
・すべての変数がimutable
・参照の透過性（すみません、意味わかんないです。誰かおしえてください）
・ループレス

ループがないってのはインパクトあります。
「bosque7.2リリースでループが追加される」みたいなジョークがあるくらいです。

## 要件
 - 64 bit Operating System
 - The LTS version of node.js（node8では動かないので注意。私はそれで、はまった）
 - Typescript(install with: npm i typescript -g)

## インストール
 1. [microsoft/BosqueLanguage](https://github.com/microsoft/BosqueLanguage)からgit cloneします。
 2. Typescriptをインストールします。`npm install -g typescript`
 3. cloneしたフォルダ直下のref_implフォルダ内で`npm install && npm run-script build && npm test`

```
$ git clone https://github.com/microsoft/BosqueLanguage.git
$ npm install -g typescript
$ cd ref_impl
$ npm install && npm run-script build && npm test
```

## ビルドと実行
ref_implフォルダ直下で以下を実行します。

```
node bin/test/app_runner.js {ファイル名}
```
ちなみに、bosque言語のファイルの拡張子は「.bsq」。

## Visual Studio Code の設定
microsoftの言語なので、vscodeへのサポートがあります。まだまだこれからの言語なんで、現状はしょっぱい。サポートされているのは、予約語の強調表示くらいです。
`git clone`したフォルダ内に「bosque-language-tools」フォルダがありますが、これをvscodeのルート設定である「.vscode\extensions」フォルダにコピーします。
windowsの場合、"C:\Users\\{ログインユーザー名}\\.vscode\extensions"です。
Cドライブ前提に書きましたが、Cドライブじゃない方はvscodeと相談してください。
うまくいくと、以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/a36487f3-53ce-66b9-4570-757905757b4c.png)
diverta 2019-2C

#はじめに
予定していなかったが、とりあえずやってみて惨敗。Python仕様の不理解によりバグっていただけであった。
Cまで進まなかったので、反省のためCをやる。

#C - Successive Subtraction
問題：数列が与えられ、その中の2個x,yを取り出して、x-yを書き込み、繰り返し最後に残る1個の最大値と操作を答えなさい。

最後の計算でx,yの差が最大であればよいため、xlast=最大値high、ylast=最小値lowになる必要がある。
負数列[m1,m2,m3・・・]、正数列[p1,p2,p3・・・]とすると以下のように表される。

```math
high=x_{0}-m_{1}-m_{2}-m_{3}-\cdots\\
low=y_{0}-p_{1}-p_{2}-p_{3}-\cdots
```

x0は数列の最大値、y0は数列の最小値から持ってくればよい。なお、x0,y0の符号はどうでもよい。
後は、上記式から負数だったらhighから引き、正数だったらlowから引いて行くだけである。
操作に関してはリストに入れておく。

```python:atcoder.py
n = int(input())
a = list(map(int,input().split()))

ans = []
a.sort()
low = a[0]
high = a[-1]
for i in a[1:-1]:
    if i>0:
        ans.append([low,i])
        low = low - i
    else:
        ans.append([high,i])
        high = high - i

ans.append([high,low])
print(high-low)
for x,y in ans:
    print('{0} {1}'.format(x,y))
```
データ分析未経験SEがデータサイエンティストを目指す No.1 [Python]

#記事の概要

データサイエンティストに向けての勉強に当たり、しばらくの間Codecademy等でのインプットを中心に行ってきましたが、インプットするだけではなく、ちゃんと知識を集約してアウトプットすることが大事ということで、本格的に学んできたことの発信をしていきたいと思います。
第1回はPython言語の基本的な性質について、私のなじみ深いJava等の言語に比べた違いを主に紹介します。

#Pythonとは

Pythonは動的型付け言語であり、for文などを書かなくとも1行でループ処理を含む処理が書けるようにさまざまな特徴的な文法が存在する。
数値計算・データ可視化・機械学習・ディープラーニングなどを簡単に扱えるライブラリが多数存在し、データ分析を行う際のデファクトスタンダードといえる言語である。

#基本的な文法

###割り算

Javaのint型割り算と同じように、余りを切り捨てて整数にしたい場合には「//」を使う。

```python
print(12 / 5) #2.4
print(12 // 5) #2 
```

###累乗

累乗は「**」で簡単に計算可能。

```python
print(12 / 5) #2.4
```

###複数行文字列

ダブルクォーテーションを3つ続けたもので囲うと、複数行の文字列を表現できる。

```python
multi_line = """
あいうえお
かきくけこ
さしすせそ
"""
```

###複数戻り値

Pythonの関数は複数の戻り値を返すことが可能。

```python
def square_point(x_value, y_value):
  x_2 = x_value * x_value
  y_2 = y_value * y_value
  return x_2, y_2

x, y = square_point(2, 3)
```

#リスト

###zipメソッド

zipメソッドは、同じ要素数をもつ1次元リスト2つ以上を引数にとり、各要素をペア(引数2つの場合)とした2次元リストを返す。

```python:In
names = ['Jenny', 'Alexus', 'Sam', 'Grace']
heights = [61, 70, 67, 65]

names_and_heights = zip(names, heights)
print(names_and_heights)
```

```:Out
[('Jenny', 61), ('Alexus', 70), ('Sam', 67), ('Grace', 65)]
```

###rangeメソッド

range(l, r, d)は、開区間[l,r)までの数について、lからスタートしてdずつ増えた数列をリストとして返す。

```python:In
my_range = range(1, 100, 10)
print(list(my_range)
```

```:Out
[1, 11, 21, 31, 41, 51, 61, 71, 81, 91]
```

###slice

リストのスライス[l:r]は、開区間[l,r)の要素を抜き出した新たなリストを返す。
lまたはrを省略した場合、それぞれ最初から、最後までを抜き出す。
また特殊な記法として[-x:]と書くと、最後からx個の要素を抜き出す。

```python:In
fruits = ['apple', 'banana', 'cherry', 'date']
print(fruits[0:3])
print(fruits[:3])
print(fruits[2:])
print(fruits[-3:])
```

```:Out
['apple', 'banana', 'cherry']
['apple', 'banana', 'cherry']
['cherry' , 'date']
['banana', 'cherry', 'date']
```

###countメソッド

リスト内に指定の要素がいくつ存在するかを簡単に取得する方法として、countメソッドがある。

```python:In
letters = ['m', 'i', 's', 's', 'i', 's', 's', 'i', 'p', 'p', 'i']
print(letters.count('i'))
```

```:Out
4
```

###ソート
リストを並び替えるにはsortメソッドを使う。
また、sortedメソッドは、元のリストを並び替えた新しいリストを返す。

```python:In
names = ['Xander', 'Buffy', 'Angel', 'Willow', 'Giles']
sorted_list = names.sorted()
print(sorted_list)
names.sort()
print(names)
```

```:Out
['Angel', 'Buffy', 'Giles', 'Willow', 'Xander']
['Angel', 'Buffy', 'Giles', 'Willow', 'Xander']
```

zipメソッドで作成した2次元リストやディクショナリで特定のインデックス（キー）を指定してソートしたい場合は、Lambda式を使うか、itemgetterを使う方法がある。詳細は[この記事](https://qiita.com/tag1216/items/485217b5c88dfcf00d34)が詳しい。

###リスト内包表記

Pythonで簡単にリストを作る方法にリスト内包表記がある。

```python
new_values = [value + 100 for value in my_values]
```

後置ifを使用して、特定の要素のみのリストを作成するなど、様々な応用がある。詳細は[この記事](https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7)が詳しい。

---

第1回はこの程度で。次回はNumPy, Scipyあたりになります。
Pythonからgitのブランチ名とhashを取得する！

# とどのつまり

```python
import subprocess
cmd = "git rev-parse --short HEAD"
hash = subprocess.check_output(cmd.split()).strip().decode('utf-8')
print(hash)
```

![python_git_hash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/c18c56d0-89c6-82f4-a047-490675ed0a30.png)

- subprocess使えば何も迷うことはなかった…

## 追記
- `hash`はpythonの予約語だったので気をつけてください…

## 追記

ブランチ名の取得

```python
import subprocess
_cmd = "git rev-parse --abbrev-ref HEAD"
branch =　subprocess.check_output(_cmd.split()).strip().decode('utf-8')
branch = "-".join(branch.split("/"))
```

- スラッシュは適当に置き換えないと、pythonから `os.mkdir()` とかする時にエラーになるので注意。

# 参考
- https://stackoverflow.com/questions/14989858/get-the-current-git-hash-in-a-python-script
【Atcoder】divertaB

diverta全然出来なかった・・・:cloud_snow:
今日の問題は[こちら](https://atcoder.jp/contests/diverta2019-2/tasks/diverta2019_2_b)

*n*個のボールを*x,y*座標でソートし、*n*個から2個選んだベクトルの中で最頻値のものは移動コストが0になるというもの。

##解法
```python
import collections
N = int(input())
if N == 1:
  print(1)
elif N == 2:
  print(1)
else:
  #入力
  ball = [tuple(map(int, input().split())) for _ in range(N)]
  #x,y座標でソート
  ball.sort(key=lambda x:(x[0], x[1]))
  #n個から2個選んだボールのそれぞれの対について、ベクトルを出力
  diff = [tuple((ball[i][0] - ball[j][0], ball[i][1] - ball[j][1])) for i in range(N) for j in range(i + 1, N)]
  c = collections.Counter(diff)
  #最頻のベクトルの個数をカウント
  ans = c.most_common()[0][1]
  print(N - ans)
```

精進します:angel_tone2:
lambda上でseleniumを動かしたときに異常に時間がかかる問題

lambda上でseleniumを動かしたときに異常に時間がかかる問題があったので、原因と解決策のメモ。

### 問題
lambda上で、google.comにアクセスし、titleをとってくるだけのコードで5分近くかかっていた。

### 原因

lambdaに割り当てているメモリが少なかった(128MB)

### 解決策

lambdaに相応のメモリを割り当てる(512MBくらい)

### 改善後

実行時間が10秒程度に減った(これでも十分遅いが、メモリをもっと割り当てればそのぶん早くなりそう)

#### 懸念
メモリを増やすとlambdaの価格がめちゃくちゃ上がるのでは...？
→ yes。ただ、めちゃくちゃ、というわけではない
→ メモリを2倍にすれば、価格も二倍になるよ、という感じ。
→ そもそもが安いので、そんな長時間動かさないのであれば誤差程度。

https://aws.amazon.com/jp/lambda/pricing/
pythonで日付操作

  

# ライブラリのインポート
    
    from datetime import datetime
    import dateutil.parser

# 現在時刻取得（datetime型で）

    dt = datetime.now()

# 任意時刻をdatetime型で

    dt = datetime(2019,6,16,12,34,56) #年,月,日,時,分,秒

# 文字列 ⇒ datetime型へ
フォーマットにあっていないとエラーになる

    tstr='2019-06-16 12:34:56' 
    dt = datetime.strptime(tstr, '%Y-%m-%d %H:%M:%S')


# 文字列 ⇒ dateutil.parser.parseを利用してdatetime型へ
strptimeより柔軟だが、strptimeより遅い。（6倍弱）

    tstr='2019/6/16 12:34' 
    dt = dateutil.parser.parse(tstr)

# datetime型 ⇒ unixtimestamp型へ

    ts = dt.timestamp()

# unixtimestamp ⇒ datetime型へ
    dt = datetime.fromtimestamp(ts)

# datetime型　⇒　日付文字列（書式指定）

    tstr1 = dt.strftime('%Y-%m-%d %H:%M:%S') # 2019-06-16 12:34:56
    tstr2 = dt.strftime('%Y%m%d_%H%M')       # 20190616_1234
    tstr3 = dt.strftime('%Y-%m-%d')          # 2016-06-16  日付だけ
    tstr4 = dt.strftime('%H:%M')             # 12:34       時刻だけ
golang: no new variables on left side of := が出力

goを最近やり始めました。ハマった事項をめもめも。

# エラーになったコード
```golang
fmt.println("AAAAA")
_, err := fmt.Scanln(&val1)
fmt.println("BBBBB")
_, err := fmt.Scanln(&val2)
fmt.println("CCCCC")
_, err := fmt.Scanln(&val3)
```

2回目の`_, err := fmt.Scanln(&val2)`で`no new variables on left side of :=`

fmt.Scanlnは、
`func Scanf(format string, a ...interface{}) (n int, err os.Error)`
でリターンがあるが、最初の"n"は使わない。
なので、"_"にすると、このエラー。

同じ変数を繰り返し上書きする、手抜きコードはダメなんですね。

# 修正したコード
```golang
	if asktype == "s" {
		fmt.Print("Server Name? ")

	} else if asktype == "p" {
		fmt.Print("Port Number? ")

	} else {
		fmt.Print("Token? ")

	}
	_, err := fmt.Scanln(&value)
	if err != nil {
		log.Fatal(err)
	}
	return value
```

エラーを1箇所に集約すれば、できた。
という解釈であっているのか？
Raspbianでnode-gamepadのインストールにコケる場合の回避



**JYM(自分用メモ)**

サクッとスイッチ類付けたいときにゲームパッドばらす事なんて人生のうちで10回や20回程度あるはずですが、Raspbianにそのまま``npm install node-gamepad``した場合、node-gypのmake時にコケる場合があるようです。

```
sudo apt-get install libudev-dev libusb-dev libusb-1.0-0-dev

```

とりあえず上のパッケージ追加で直った。
Amazon Simple Notification Service (SNS)のオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)](https://www.slideshare.net/AmazonWebServicesJapan/20190604-aws-black-belt-online-seminar-amazon-simple-notification-service-sns)」の自分向けメモ
SNS使ったことあるレベルの人向け


## 前提
### 背景
 - 密結合の業務システム⇒疎結合のシステムにした場合
    - キューを保持する機能が必要
    - ポーリング処理の負荷が大きくなる
 - 疎結合＋ファンアウト（一括送信）とすることで分散処理構成でもポーリングは不要

### pub-sub
 - メッセージの発行者と購読者をトピックを間に挟んで分離できる


## SNSの機能
### Mobile Push（プッシュ通知）
 - ユーザーに通知
 - モバイルアプリが起動していなくても通知可能

### pub-sub
 - 分散アプリの統合に利用可能
 - 構成要素は以下
    - Topic Owner
        - Topicの作成、管理者
    - Subscriber
        - Topicから任意のメッセージを受け取る購読者
    - Publisher
        - 任意のメッセージをTopicに送る発行者


 - SNS操作のAPIも用意されている

## 始め方
 1. Topic作成
 - SubscriberがTopicに登録
 - PublisherがTopicに送信

## 利用方法
### アクセスコントロール
 - Topicへのアクセス制限が可能
 - デフォルトではTopic Ownerのみアクセス可能

### フィルター
 - Publisherが指定したメッセージ属性を基にSubscriberはメッセージを部分的に受信可能
 - Filter Policyはホワイトリスト、ブラックリストどちらも可能

### 配信方法
 - PublisherはSubscriberの購読プロトコルに合わせて、メッセージのカスタムが可能
 - デフォルトは購読プロトコルに関わらず、同一メッセージ

### リトライ
 - Retry設定は4種類
 - 購読プロトコルがHTTP/Sの場合、Subscriberは購読単位でJSON形式でRetry Policyを指定可能
 - Topic OwnerはTopic単位でHTTP/SのRetry PolicyをJSON形式で指定可能
    - SubscriberのRetry Policyを無効化する

### プライベート発行
 - VPCからプライベートにメッセージを発行する
 - VPCエンドポイントからTopic発行

## アプリケーション統合
### CloudWatch Eventsからの発行
 - 発行者にEventsが指定可能

### Step Functionsからの発行
 - Stateから発行可能

### S3からの発行
 - S3オブジェクト操作をトリガーにTopic発行が可能
    - 通知が他処理のトリガー

### SQS
 - SQSに保持してポーリングすることで確実に処理する
 - SNSと連携がとりやすい

### Lambdaとの連携
 - SNSより複雑な処理の実行が可能
 - Lambdaを通じて、多くのAWSにファンアウトが可能
 - 処理後の情報を後続トピックに発行することで高度なフィルターやメッセージカスタマイズが可能

### 配信ステータスロギング
 - 成功時、失敗のログを確認可能
    - 失敗時は配信できなかった購読者の確認が可能
    - 試行回数も確認可能

### Moblie Push（プッシュ通知）
 - プッシュ通知を構成するならSNSではなくPinpoint推奨

## 価格
 - Publish無料枠：100万件/月
    - 以降、0.50USD/100万件
 - Eメール無料枠：1000件/月
    - 以降、2USD/10万件
 - データ転送量はほぼ無料
 - Lambda、SQSは無料


## まとめ
 - アーキテクチャの簡素化できる
 - 簡単にファンアウトできる
 - ワークロードをスケーラブルにできる
IEで position: sticky っぽい動作をさせる

## やりたいこと
- `position: sticky` のような、ある程度スクロールしたらヘッダが画面に追従するようなことをしたい
- 非常に遺憾ながらIE11に対応する必要がある

## 試したこと（ダメだったパターン）
https://codepen.io/lc-shimazaki/pen/XLXxEX
ある程度のスクロール位置に届いた後、JSで対象オブジェクトを `position: fixed` にする。
しかし、この場合は何故か画面がガタつくような現象が発生。
よくよく見てみると、fixedにした瞬間に対象オブジェクトに依存するオブジェクトが上にずれていた。
絶対位置のオブジェクトにすることで、依存オブジェクトの座標ズレが発生するぽい。

## 改善策
https://codepen.io/lc-shimazaki/pen/LKGJXV
依存オブジェクトの座標ズレが発生しないようにダミーオブジェクトを配置すればスムーズにstickyっぽい動作になる。

細かく書いた方が良さそうだけど、コード量も短いし全部CodePenにまとめました。
しかし調べるとIE11で `position:sticky` が使えるようなライブラリもあるっぽいのでそっち使うのがいいのかな…。
うんこみたいなCSSの書き方なのでご指摘いただけるとありがたいです。
Python課題わからない文字集

未来電子テクノロジーでインターンをしているもーなです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。



```
<html lang="ja">
```
langは言語コードを指定することで、jaは日本語を意味しています。

```
<meta charset="utf-8">
```

charsetは文字コードを表しており、「Shift_JIS」「EUC-JP」「UTF-8」の３つがホームページでよく使われています。

```
input sys
```
sysは、コード中でバージョンを取得するという意味です。

```
required
```
必須チェックを行い、エラーを出す

```
placeholder
```
入力時に初期表示する内容を表示する

```
chmod 755
```
chmodは権限を動かすコードです。
755は前から、所有者・グループ。その他の人の権限を表しています。
読み込み・書き込み・実行全ての権限を与える場合は7です。
読み込みと実行の権限が与える場合は5です。
Hello World~自己紹介~

#はじめに

　初めまして！
　2020年より新社会人になるものです。
　職種は総合職とプログラミングはあまり関係ありませんが、趣味や業務の効率化に役立てればと思い勉強をはじました。

　知識の定着のためにちょくちょく発信していこうと思います。
　よろしくお願いします。
#現状

　ちょくちょく勉強していたことがあり、現状は以下の通り
　・python
　　└基本的なことしかできない
　・GAS（google app script)
　　└ネットの記事を参考にしないと何もできない
　・SQL
　　└データの抽出のみ
#目標

　何か成果物を作成できるようになりたいです。
　そのためにメインとなるであろうpythonをしっかりと勉強して行きます。
　また、それと並行しGASを使えるようになり、実務で使えるレベルまで習得しようと思います。
　目先の目標としては、pythonの検定試験の合格を目指してみます。
#さいごに
　これから定期的に投稿していきプログラマーとしての能力をupしていきます。
　今後ともよろしくお願いします。

　最後まで読んでいただきありがとうございます！！
カウントソート・ビンソート

# カウントソート
- 出現頻度を数えることでソート
- 整列対象の列に登場する値が$0$から$m-1$の整数に限定されている状況を想定すると，その列にそれぞれの値がどの程度登場するかを数えることでソートできる
- 登場頻度の累積を計算しておくことで，整列対象の配列中の値$x$に対して，その値$x$を累積度数配列におけるインデックスとして引くことで，その値$x$がソートされた配列においてどこにいるべきなのかがわかる

```go
func CountSort(target []int, max int) []int {
	counter := make([]int, max)
	ret := make([]int, len(target))
	for _, ele := range target {
		counter[ele] += 1
	}
	for i := 0; i < max-1; i++ {
		counter[i+1] += counter[i]
	}
	for i := len(target)-1; 0 <= i; i-- {
		counter[target[i]]--
		ret[counter[target[i]]] = target[i]
	}
	return ret
}
```

# ビンソート
- 「リスト」を使って列を表現した上で，出現頻度を数えることでソートする
- 「安定（＝同じキーを持つデータが二つ以上あるとき，整列前の順序の通りに整列される）」なソートになる

``` go
func BinSort(target []int, max int) []int {
	listhead := make([]int, max)
	for i := range listhead {
		listhead[i] = -1
	}
	next := make([]int, len(target))
	for i := range next {
		next[i] = -1
	}
	ret := make([]int, len(target))
	for i := len(target)-1; 0 <= i; i-- {
		j := target[i]
		next[i] = listhead[j]
		listhead[j] = i
	}
	i := 0
	for j := 0; j < max; j++ {
		p := listhead[j]
		for p != -1 {
			ret[i] = target[p]
			i++
			p = next[p]
		}
	}
	return ret
}
```
[JS] 即時関数をアローにしてワンラインに納めたら、「( )」だらけになりつつも、問題なく実行できた件

# 即時関数とは
関数を定義し、そのまま同時に実行してしまう構文。

# 「ふつうの関数＋関数実行」を、即時関数で書く
```javascript:ふつうの関数＋関数実行
function test(){
	console.log('あああ');
}
test(); // => あああ
```
一度、test関数を定義した上で、最後の行で実行させている状態。
これを即時関数にすれば…

```javascript:即時関数
(function test(){
	console.log('あああ');
})(); // => あああ
```
ちょっとだけ短く書けます。
書き方は、関数全体を「()」でくくりつつ、最後に「();」を追記する。
追記部分は、見るからに関数の実行をしていそうな書き方です。
# 即時関数をアロー関数の形にして、ワンライナーで書くと動くか
```javascript:即時関数をアロー関数で書いてみた
(v => console.log('あああ'))(); // => あああ
```

いけた。
ちょっと、ぱっと見何か分からないけど、本当に関数をアロー関数をしただけです。
vは何でもOKです。
ちなみに、複数行の処理を書くなら、こんな形になるかと。

```javascript:複数行のアロー関数を即時関数で書いた例
(v => {
	console.log('あああ');
	console.log('いいい');
})(); // => あああ いいい
```

何の役に立つか分かりませんが、せっかく試したので、残しておきます。
ありがとうございました。
GOOS本　Openfire On MacOS Mojave 環境構築メモ

MAC で　GOOS本 の　環境構築した時に困ったメモです。
-----
MacOS Mojave 10.14.5
openfire 4.3.2

###Openfireインストール
インストールした後に起動してもエラーが出て起動しなかった。
起動スクリプトは、/usr/local/openfire/bin/openfire.shのようなので、直で起動してみたところ、
Error: JAVA_HOME is not defined correctly.
  We cannot execute /System/Library/Frameworks/JavaVM.framework/Home/bin/java
で落ちてしまっていた。
なんだかMacOSがよくわかっていないけど、そんなJAVAは存在してないので、起動できない模様。

ゆえに直接起動スクリプトを修正。
- JAVACMDを直接指定に変更
 
```shell:/usr/local/openfire/bin/openfire.sh

if [ -z "$JAVACMD" ] ; then
        if [ -n "$JAVA_HOME"  ] ; then
                if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
                        # IBM's JDK on AIX uses strange locations for the executables
                        JAVACMD="$JAVA_HOME/jre/sh/java"
                else
                        #編集
                        #JAVACMD="$JAVA_HOME/bin/java" 
                        #直接指定 
JAVACMD="/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/bin/java"
                fi
```
これで再度直接実行したところ、admin consoleが起動。
IntelliJ IDEA でのBash

## IDEA のターミナルでBash利用時のALT (Option) キー


- ALT-f をタイプすると  "ƒ"  (次の単語に移動　を期待)
- ALT-b をタイプすると "b"  (前の単語に移動　を期待)
- ...

*iTerm2では通常通りの動きなのでIDEAの挙動

### 取り急ぎの解決

**~/.inputrc**

```
"ƒ": forward-word
"∫": backward-word
"≥": yank-last-arg
"∂": kill-word
"˙": backward-kill-word
```

Terminal再ログインで意図する挙動になりました
足りない部分は随時追記しようと思います。
###### 参考サイト
[bashショートカットキー備忘録](https://qiita.com/facel/items/d42e4159ff7d1220713d)

### 取り急ぎの解決策というのは・・・
SSH でリモートサーバーにログインすると同じ症状が発生。
IDEAの設定or仕様なのでしょうが根本解決できず。。。

解決策ご存知の方教えていただければ幸いです。

---
〜言語処理100本ノック No.00-04〜

## はじめに

タイトルのままです。
IT業界に関わっているのに全然かけない！
簡単なものなら読めるが複雑だと読めないし、何よりかけない
どうしてこうなったし...
このままでは恥ずかしすぎるので[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/#)というとてもとても素敵な教材(東北大学の 乾・岡崎研究室のトレーニング教材)を見つけたので時間がかかるかもしれませんが挑戦してみた備忘録です。
恥ずかしコードですがお許しください。

## 環境

Python 3.7.1

## 00. 文字列の逆順

> 文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．

```python
a = 'stressed'
for i in range(len(a)):
    print(a[len(a)-i-1], end="")
print()
```

##### `後日追記`:こんな簡単な方法あるやんけ!!

```python
a = 'stressed'
print(a[::-1]) ## -1で逆順
```

## 01. 「パタトクカシーー」

> 「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．

```python
a = 'パタトクカシーー'
i = 0
for i in range(0,8,2): #1以上8未満の数字の中で2ずつ増える
    print(a[i], end ="")
print()
```

##### `後日追記`:こっちも一行でかけるやんけ！！

```python
a = 'パタトクカシーー'
print(a[0:8:2])
```

## 02. 「パトカー」＋「タクシー」＝「パタトクカシーー」

> 「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

```python
a = 'パトカー'
b = 'タクシー'

for i in range(len(a)):
    print(a[i] + b[i], end="")
print()
```

## 03. 円周率

> "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．

```python
a = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
mylist = list()
for i in a.split(" "):
    mylist.append(len(i.strip('.,')))
print(mylist)
# [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
```

## 04. 元素記号

> "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，
> 1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，
> 取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

```python
a = 'Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.'
mylist = list()
mydict = {}

# 単語を空白で分割し、カンマやコロンを削除
for i in a.split(" "):
    mylist.append(i.strip('.,'))

# 先頭1文字のリストを作る
num_list = [1, 5, 6, 7, 8, 9, 15, 16, 19] # コピペでHPのリストを貼り付ける
num_list = list(map(lambda x: x - 1, num_list)) # lambda関数で全部1引いたリストを作る

for i in range(len(mylist)):
    str = mylist[i]
    if i in num_list: # num_list番目の単語は先頭1文字
        atom = str[0]
    else: # それ以外は2文字
        atom = str[0:2]
    mydict[i+1] = atom
print(mydict)
#{1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mi', 13: 'Al', 14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', 20: 'Ca'}
```

#####`後日追記`

以下のようにstrにリストを格納していますが、これをすると
stringに変換するstrを実行するとエラーが発生する。
`TypeError: ‘str’ object is not callable`
これはstr()を呼び出したときに、変数strが呼ばれてしまってこのエラーがでる。
つまり、予約後を変数にするようなナンセンスなことをやってはいけないということですね。。。


```python

str = mylist[i]
```

## 05. n-gram

> 与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．

!?  
突然の宇宙語。突然球早くないっすか...
次回n-gramから...

※もしお気づきの点ありましたら、コメントいただけるとうれしいです！！
[UE4] Texture Streaming Pool Over Budgetの意味

(本記事はUE4.22を用いて検証及び調査しております)

# Texture Streaming Pool Over Budgetの誤解

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/0de1d1fe-cce6-7bd3-3d78-f233bdc4058b.png)
Textureが大量にあるシーンなどで、"Texture Streaming Pool Over XXX MiB Budget"という警告が画面左上に出たのを見たことがある人も多いと思います。**この警告とその値は、「テクスチャがPool Sizeを越えてメモリを確保していて、そのメモリ量を表示している」という意味ではありません。** この警告は、**「ストリーマが本来ほしいと思っているメモリ量がストリーミング用のPool Sizeをオーバーしているよ。」という警告です。** 実際にテクスチャストリーマは、足りないという警告を出しながらも実際はPool Sizeに収まる様にメモリを取っていることがほとんどです。

# Required Pool と Wanted Mips

実際にストリーマがどれだけのメモリを使っているか確認する場合、stat streaming のWanted Mipsを見ると良いと思います。

**stat streaming**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/04515978-a0e6-5673-6ef4-50a58264e8e5.png)

上記の場合、Streaming Poolは300に設定されていますが、テクスチャストリーマが本来は必要とするMipである**Required Pool**は 438です。しかし、実際にストリーマが使用するテクスチャのメモリ量**Wanted Mips**は300ギリギリまでしか取っていません。

そして、警告ではこの超過した、438-300 = 138 (貼った画像だと若干ずれてますが)表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/f390c3bd-eaa2-758a-c4ae-8eba0d61c18b.png)

ですので、この警告の意味するところは、**メモリを越えて確保しているのではなく、メモリに収まる様に確保したらそれだけのMiB足りないからどこかのテクスチャボケてるよ**というものになると考えられます。

#まとめ

- Texture Streaming Pool Over Budgetという警告は、「プールサイズを越えたメモリを確保している」という警告ではない
-「ストリーマが必要とするテクスチャを読み込もうとするとこれだけメモリを越えちゃうよ」という警告
- 結果、どこかのテクスチャがボケている状態となっているはず
- ストリーマがほしいメモリは「Required Pool」、実際に読み込んでいるメモリは「Wanted Mips」をみよう (stat streamingより)

簡単にですがまとめさせていただきました。
emacs派のためのvimrc

# 対象
- emacs、mac、linuxのキーバインドでvimのカーソル移動をしたい
- なんらかの事情でvimを扱う必要があるが、vimのキーバインドに慣れない(特にカーソル移動)


# vimrcのリマップ
これを~/.vimrcに貼り付ければOK

```:~/.vimrc
noremap <C-p> <Up>
noremap <C-n> <Down>
noremap <C-b> <Left>
noremap <C-f> <Right>
noremap <C-a> <HOME>
noremap <C-e> <END>
noremap <C-d> <Del>
noremap <C-h> <BS>
noremap <C-k> <Esc>D
noremap <C-u> <Esc>dd

noremap! <C-p> <Up>
noremap! <C-n> <Down>
noremap! <C-b> <Left>
noremap! <C-f> <Right>
noremap! <C-a> <HOME>
noremap! <C-e> <END>
noremap! <C-d> <Del>
noremap! <C-h> <BS>
noremap! <C-k> <Esc>D
noremap! <C-u> <Esc>dd
```

# 解説
## 設定したキーバインド
| コマンド| 動作 |
|:-----------|:------------|
| ctrl + p | 1行上にカーソル移動|
| ctrl + n | 1行下にカーソル移動|
| ctrl + f | 1行右にカーソル移動|
| ctrl + b | 1行左にカーソル移動|
| ctrl + a | 行の先頭にカーソル移動|
| ctrl + e | 行の末尾にカーソル移動|
| ctrl + d | カーソルの右の一文字を削除(delete)|
| ctrl + h | カーソルの左の一文字を削除(back space)|
| ctrl + k | カーソルから行末まで削除|
| ctrl + u | 1行削除|
※ctrl + kが連続使用できない(とりあえず妥協)
※page up,down系はhhkbのキーバインドで不便していないので省略

## vimのマッピング
どうやらvimにはノーマル、ビジュアル、選択、オペレータ待機、挿入、コマンドラインなどのモードがあるようだ
noremapとnoremap!で大体カバーできるみたいなので、容赦なくリマップする

```
     コマンド                    モード
:map   :noremap  :unmap     ノーマル、ビジュアル、選択、オペレータ待機
:nmap  :nnoremap :nunmap    ノーマル
:vmap  :vnoremap :vunmap    ビジュアル、選択
:smap  :snoremap :sunmap    選択
:xmap  :xnoremap :xunmap    ビジュアル
:omap  :onoremap :ounmap    オペレータ待機
:map!  :noremap! :unmap!    挿入、コマンドライン
:imap  :inoremap :iunmap    挿入
:lmap  :lnoremap :lunmap    挿入、コマンドライン、Lang-Arg
:cmap  :cnoremap :cunmap    コマンドライン
:tmap  :tnoremap :tunmap    端末ジョブ
```
参考
https://vim-jp.org/vimdoc-ja/map.html#map-overview

# さいごに
いろんなサーバに入ることが多いのですが、emacsは当然入っていません。
コーディングはIDEで行っているので、最低限のカーソル移動系のキーバインドだけどうにかしたいと思い設定しました。

本当のemacs派の人には物足りない設定になっているでしょうが、そこはすみません
(追記したほうがいいものがあれば教えてください)
Storybook＋NuxtJsでWebフォントを当てる際の備忘録

# 問題
nuxt.config.jsで読み込みを設定していたWebフォントが、
Storybookの画面で読み込みが行われなかった。

```js:nuxt.config.js

  head: {
    titleTemplate: '%s - Nuxt.js',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: 'Meta description' },
    
//Webフォント部分
    link: [{
      rel: 'stylesheet', 
      href: 'https://fonts.googleapis.com/css?family=Noto+Sans+JP&display=swap'
    }]
  }
}
```

[Nuxt.js公式 head プロパティ](https://ja.nuxtjs.org/api/configuration-head)
[Google Font (Noto Sans JP)](https://fonts.google.com/specimen/Noto+Sans+JP)

# やり方

.storybook 配下にpreview-head.htmlというファイルを作成し、
nuxt.config.jsに記述した内容で記述する。（というか、普通にHTMLで読み込ませるときの記述をする。）

```html:preview-head.html

<link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP&display=swap" rel="stylesheet">
```


これでStorybookで読み込みが行われるので、
font-familyなりで適応させることができます。

# default.vueでFontを当てていた場合
Storybookではdefault.vueが読み込まれないので、
.sotrybook/style.cssに読み込みを記述すれば解決します。

```css:.storybook/style.css
html {
  font-family: 'Noto Sans JP', sans-serif;
  font-size: 16px;
  word-spacing: 1px;
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
  -moz-osx-font-smoothing: grayscale;
  -webkit-font-smoothing: antialiased;
  box-sizing: border-box;
}

*,
*:before,
*:after {
  box-sizing: border-box;
  margin: 0;
}
Jetson Nanoのファン購入に気をつけろ！

# はじめに

本記事はJetson Nanoで「失敗した！」と感じた部分を共有するためのものである。その筆頭がファン購入である。

Jetson Nanoは小さいけど熱をそれなりに発生するのでファンは必須である。そのため「小さくて静かなファン」を探したところ「NF-A4x20」を見つけることができた。価格は2000円前後。通常のファンの倍くらいの価格帯だけれども奮発して購入した。

# 取り付けられない

自宅に届いてから即取り付けようとしたが

<b>ネジがない</b>

のである。しまったと思いつつ、結局買いに行く暇がないのでネジをAmazonで購入したが、これが全然届かない。10日以上経ったがまだ届かない。ネジを買うのを忘れないように。仕方がないので配線だけしてJetson Nanoの隣に置いて送風しているが、なんとも悲しいものがある。

# ファンが回らない

最初に接続したとき、ワクワクしながら電源をONしたが

<b>ファンが回らない</b>

のだった。これはFAQに近いと思うが`jetson_clocks`コマンドでパフォーマンス最大にしないとファンが回らないらしい。ところが同コマンドを試したが回らない。指で軽く回してあげると、その後自動的にくるくると回り始めた。音が静かで感動した。

# ケースに入れられない

ようやく回り始めたその一方で疑問がよぎる。

<b>指で回さないと回らないファンってケースに入れられないんじゃ・・・。</b>

不良品を掴んだか！？と思ったが、回り始めた後は普通に動作している。つまり駆動時のみパワーが足りないのである。

# ファンにもいろいろある

インターネットでアレコレと調べていたら「ファンは5V用を買わないとダメだ」という書き込みを見つけた。型番「NF-A4x20」って複数あるの?と自分の購入したのを恐る恐る見てみると・・・

![fan_12v.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/e455033b-5d32-a932-efaf-95662b5fe33b.jpeg)

パッケージからでは分からないと思われるが<b>12V</b> PWMだった。。。実際ラインナップには5V PWMも、さらにはPWMではない5Vもあった。紛らわしい！ 

https://noctua.at/en/products/fan

# 値段に幅がありすぎる

マジかーと思いながらAmazonで5V PWMのものを購入しようとしたら7000円だった。販売元は正規代理店と書いてあった。元々2000円前後の商品なのに完全に足元を見られている。流石にこの値段を出すくらいなら別のものを買いたいので、送料と時間はかかるけれどもebayで購入することにした。送料込みでEUR 22.80、日本円換算で2,792円である。内訳は商品が1,824円、送料が967円。そして届いたのがこちら。

![fan_5v.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/4a805a26-0fb0-e5d7-a74b-ce7b737be1c6.jpeg)

パッケージはほとんど同じである。が確かに5V PWMと書かれている。写真だけでみると紛らわしいので気をつけて購入すべし。

# まとめ

ファン「NF-A4x20」を購入するときは下記の3つに気をつけること。

- 5V PWM用を買う
- ネジも一緒に買う
- インターネットで探して安いものを買う

# 後日談

5V PWMを取り付けたらあっさりと回った。ネジも届いた！
AEの簡単な落とし方

#AEを確実に落とす方法を紹介します。
2019年6/15に開催されたAE_OFFにて紹介されていたものです。

**修正しました**
手順のカウントが違う、あと注意点が不明瞭というアドバイスいただきましたので簡単に修正します!


#0手目　AEの起動
AEを起動します。持ってない方は買いましょう！
購入は以下のリンクから！！
https://www.adobe.com/jp/creativecloud/plans.html?promoid=5JRH8JTG&mv=other

<img width="741" alt="スクリーンショット 2019-06-14 11.10.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/48c6af8e-a691-dd92-aa88-8b65821a4a79.png">



#1手目　コンポジッション1の作成
新規コンポジッションを作成します！！

ボタン操作も可能ですが一応ショートカットキー置いときます（これ見てる人は知ってる気もしますが...）

```
Win
Ctrl + N

Mac
Command + N
```

<img width="1440" alt="スクリーンショット 2019-06-15 23.14.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/2692b317-e83f-9d90-19ec-251f6b35a2fd.png">

名前をつけると遅いのでそのままにしておきましょう！！


#2手目 新規平面レイヤーを作成

新規平面レイヤーを作成を作成します

ショートカットキーはこちらです

```
Win
Ctrl + Y

Mac
Command + Y
```

<img width="1440" alt="スクリーンショット 2019-06-15 23.14.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/a8d748b8-c0be-82d0-cdc6-04d3fb559dff.png">



#3手目　コンポジッションの複製(コンポジッション２の作成)

Ctrl(Command)+Dなどでcomp1を複製しcomp2を作成します。

<img width="1440" alt="スクリーンショット_2019-06-15_23_14_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/03127d4f-5328-132e-fcf3-daeb5ec0e91f.png">


#4手目　コンポジッション２を開く
複製したComp2を開きましょう

<img width="1440" alt="スクリーンショット_2019-06-18_21_12_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/ffa32871-0ca8-cc40-619c-8912f91897d4.png">


#5手目　コンポジションビューアをロック

下の写真の矢印の先にある鍵付きのアイコンをクリックしましょう！
鍵が締まればロック完了です！！

<img width="1440" alt="スクリーンショット_2019-06-15_23_15_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/e93664d3-18f3-4c9e-d3f3-71afe712739e.png">

#6手目　コンポジッションの切り替え
Comp1というところをクリックしてタイムラインを最初に作成したComp1に切り替えましょう！！

<img width="1440" alt="スクリーンショット_2019-06-18_21_12_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/c042a244-98f9-9456-1602-76d6c36e2272.png">



#7手目　ショートカットキーの打ち込み
comp1に戻り平面レイヤーを選択した状態で以下のショートカットキーを打ち込んでください

Windowsの場合

```
Ctrl+Home
```

Macの場合

```
Function + Command + 左キー
```
<img width="1440" alt="スクリーンショット 2019-06-15 23.15.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/a71870f9-3781-ca9c-5651-f88d11cdec82.png">


#結果
AEが落ちます
やったぜ！！
保存するチャンスはくれません
<img width="444" alt="スクリーンショット 2019-06-15 23.15.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318447/6e69ca31-9656-7066-2c6e-0255b6c19ccc.png">

#まとめ
こんなことしてないで作業しましょう！
AE_OFFの運営の方々ありがとうございました！
Reactで画像をプリロードする方法

## React で 画像をプリロードする方法
環境
- react v16.8.6

Reactで画像を扱う際に、プリロードしてスムーズな表示をする方法を調べました。

### 画像をプリロードする
jsx に描画する前に、Imageオブジェクトを予め生成します

```jsx
const img = new Image()
```

生成した Imageオブジェクト に画像へのパスを渡します。
渡した時点で Imageオブジェクトはプリロードを始めます！

```jsx
const src = "public/assets/sample.jpg"
img.src = src // ここでプリロードが始まる
```

onload にコールバックを渡して、読み込みが終わったら描画をするようにもできます。

```jsx
img.onload = () => { // 読み込み完了時に発火する関数
    this.setState({ preload: true }) // 例えばこんな風に
}
```

### ビフォーアフター
プリロードした場合としない場合で、どのような違いがあるのかを見てみましょう。
ボタンを押したら画像が表示されるようなコンポーネントを作成しました。
画像はunsplashから重そうなものを選びました。
#### ビフォー

```jsx
import React, { Component } from 'react';

const imgPath = 'https://images.unsplash.com/photo-1444703686981-a3abbc4d4fe3?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2550&q=80'
class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      show: false
    }
    // const img = new Image()
    // img.src = imgPath
  }

  render () {
    const { show } = this.state
    if (show) {
      return (
        <div>
          <img style={{ width: '100%', height: '100%'}} src={imgPath} alt='sample image' />
        </div>
      )
    }
    else {
      return (
        <div>
          <button type="button" onClick={() => this.setState({ show: true })} >show image</button>
        </div>
      )
    }
  }
}
```

ボタンを押すと画像の読み込みが始まります。
<img width="653" alt="before.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/baa22603-24a4-b5bc-45ae-6fe52abacfb5.png">

<img width="662" alt="スクリーンショット 2019-06-15 22.53.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/c0ff42a1-3269-9199-56d5-367142c64bd2.png">

読み込まれるまで真っ白な画面が表示されます。

#### アフター
```jsx
import React, { Component } from 'react';

const imgPath = 'https://images.unsplash.com/photo-1444703686981-a3abbc4d4fe3?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2550&q=80'
class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      show: false
    }
    const img = new Image()
    img.src = imgPath // プリロードする
  }

  render () {
    const { show } = this.state
    if (show) {
      return (
        <div>
          <img style={{ width: '100%', height: '100%'}} src={imgPath} alt='sample image' />
        </div>
      )
    }
    else {
      return (
        <div>
          <button type="button" onClick={() => this.setState({ show: true })} >show image</button>
        </div>
      )
    }
  }
}
```

描画する前から読み込まれています。
<img width="649" alt="after1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/39f410d5-2b0c-1383-9183-f807de7692d2.png">

キャッシュを利用するので、素早く描画することができます。
<img width="653" alt="after2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172077/6ef934ab-3efb-25cf-8344-662184418984.png">

以上です。
もっと良い方法があれば、ご教授お願いしますmm
[JS]thisは1階層上のオブジェクトを指すと思えば覚えやすい件

#いきなりポイントから
先輩に教わったのだが、JavaScriptにおいて**thisは1階層上のオブジェクトを指す**らしい。
その軸で、色々と確認してみよう。

```javascript:とりあえずthisを出力してみた
function test(){
	console.log(this);
}
test(); // window{......}
```
とりあえず、thisをconsole.logしてみたら、「window」というものが出て、相当長いものが出力されました。
調べてみたら、これはグローバルオブジェクトというものが出力されたみたい。
ちなみに、ブラウザにおいては、このグローバルオブジェクトはwindowオブジェクトと呼ばれているらしい。
つまり、この際のthisは、**testメソッドの1階層上であるグローバルのオブジェクトを指した**ようだ。
# メソッドの呼び出し
よくある、オブジェクト内のメソッドを呼び出すパターン。

```javascript:1.簡単な例
const obj = {
	value: 'あああ',
  show : function(){
  	console.log(this.value);
  }
}
obj.show(); // =>あああ
```
ここでのthisには「obj」が入っています。
↓試しに、この「this」をobjに変えても、実行されます。

```javascript:2.試しに「this」を「obj」に変えてみた
const obj = {
	value: 'あああ',
  show : function(){
  	console.log(obj.value); //thisをobjに書き換えてる
  }
}
obj.show(); // =>あああ  // これでもうまく実行される
```
やはり、**thisは1階層上のものを指している**ということで説明できそう。
# 結論
他にも様々な、例外パターン等もありそうだけど、一旦こう覚えておくと良さそう。
**thisは1つ上の階層のオブジェクトを指していることが多い**
初心者なので、ツッコミあればぜひコメントください。
よろしくお願い致します。
#ちなみに
windowオブジェクトに直接代入していみたら、いけました。

```javascript:
window.test = 'あああ';
console.log(this.test); // => あああ
```
Dockerで自分のコンテナだけ作り直す方法

- 環境(ホスト)
    - CentOS Linux release 7.6.1810 (Core)
    - Docker version 18.09.6, build 481bc77156

# `docker-compose.yml`には他の人のコンテナ情報も書いてあり、

```yml:docker-compose.yml
version: "3.7"
services:
  ponsuke:
    build:
      context: .
# 省略
  usagi:
    build:
      context: .
# 省略
```

# 他の人のコンテナも可動している状態で
```bash
$ docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                    NAMES
5aa1affa8d97        host-doubutu_usagi   "/usr/sbin/init"    19 hours ago        Up About an hour    0.0.0.0:8081->8080/tcp   usagi
1492c544d745        1a83763d4bd9         "/usr/sbin/init"    2 days ago          Up About an hour    0.0.0.0:8082->8080/tcp   ponsuke
```

# 自分のコンテナだけビルドして作り直す
```bash
$ docker-compose up -d --build ponsuke
Building ponsuke
Step 1/56 : FROM centos:7.6.1810
 ---> f1cb7csd5qb7
# 省略
Successfully built 12b702919589
Successfully tagged host-doubutu_ponsuke:latest
Recreating ponsuke ... done
```
Nuxtでvuetify-loaderを導入する方法

## Nuxtでvuetify-loaderを導入する方法
NuxtでVuetifyを使っている時にvuetify-loaderを導入する方法です。

調べていくと、NuxtコミュニティのVuetifyモジュールを導入すれば自動的に入っていることが分かりました。これを使いましょう。

こちらがレポジトリです。(treeShakeがvuetify-loaderにより行われると書かれています。)
https://github.com/nuxt-community/vuetify-module

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Apple Safariの閲覧履歴をエクスポートする

前回、[Google Chromeの履歴をエクスポートする方法](https://qiita.com/MURAMASA2470/items/d081e71d79c4dc36671e)を記事にしました。
今回は要望があったSafari版を書いていこうと思います。

Microsoft Edge版については、こちらにまとめてあります。

https://qiita.com/MURAMASA2470/items/35cf540cf44a3c1617ab


## 履歴データの保存場所

Safariの履歴は以下のディレクトリにあります。

```
~/Library/Safari/
```

この中に`History.db`というファイルがあるのでそれが履歴ファイルです

## 履歴データを開くための準備

Google Chromeの履歴の場合は問題ないですが Safariの場合、履歴の保存されている場所にTerminalでアクセスができません。
Mac本体の設定を変更することによりアクセスはできますが、少々危険が伴うため今回は別の方法を紹介します。
※`chmod`などを使用しても不可です。

```
> cd ~/Library/Safari/

// Finderでディレクトリを開く
> open .
```

Finderで開きましたら、その中にある`History.db`というファイルを任意の場所にコピーします。
**コピーは必ずSafariを完全に終了してから行ってください。(ファイルが正しく開けない時がありました)**
※今回はデスクトップにコピーしたものとします

コピーが完了したら、そのディレクトリに移動して作業の再開です。

```
> cd ~/Desktop/

> sqlite3 History.db

// テーブル一覧の表示
sqlite> .tables

```

今回は各テーブルの説明は省きます。
今回使うテーブルは`history_items`と`history_visits`の二つを使います。

```sqlite3
// .mode [モード名] でモード指定
sqlite> .mode csv

// .output [ファイル名].csv でファイル名指定
sqlite> .output result.csv

// ヘッダーをつける
sqlite> .headers on

// 抽出(アクセス時間、ドメイン、タイトル、URL)
 sqlite> select datetime(v.visit_time + 978307200, 'unixepoch', 'localtime') as date, i.domain_expansion, v.title,  i.url from history_items i left join history_visits v on i.id = v.history_item order by date desc;
```

sqliteを抜けると現在のディレクトリにresult.csvというファイルができています。



以上です。