OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング学習記録52〜HTML、CSS、JavaScript〜

##今日やったこと
- 大学の講義でHTML、CSS、JavaScriptの概要を学ぶ

今日は地味に在籍しているオンライン大学の「Web入門」という講義動画を一気に見ました。

12月からプログラミングを勉強してきただけあって、入門レベルのプログラミングは余裕になりました。

以下、講義を受けて取った学習メモです↓
<br>
大学の講義でもインターネットとwebの違いに関する説明がありました。

この部分に関してはサルワカさんがめちゃくちゃわかりやすく解説してくれています。

Htmlで上の階層に行く時とターミナルで上の階層に行く時に「..」は共通なんだなと思いました。

###Input要素について
知らないtype属性をいろいろ知れてよかったです。

スライダ入力(type=“range”)がHTMLでできるのは知りませんでした。

あと、親要素にdisplay:flex;で横並びになるのは知らなかったです笑
ずっとfloatでやってました。

###CSS
３次元のアニメーションがCSSで表現できるのも知らなかったです。

###JavaScript
Javascriptの「!=」と「!==」の違いなどを復習できました。

例えば、1!="1"の場合は、１と"1"が等しいという判定なのでfalseになります。
ですが、1!=="1"の場合は、1と"1"が異なるという判定なのでtrueになります。

細かい文法の違いですが、改めて復習できてよかったです。
１つの単元の一気に進めるのはやはりいいものですね。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
tableau publicをスクレイピングしてキーワード検索結果をView数でソートする


## パッケージのインストール
今回不要なものもありますが私がいつも使ってるセットです。

```python
import time, sys, os, re
from time import sleep
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import requests
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
import csv
from operator import methodcaller
from lxml import html
import datetime
```

## キーワードとドライバーの設定
今回は「CRM」で検索してみたいと思います。

```python
main_url = 'https://public.tableau.com/en-us/search/vizzes/'
kwd = 'CRM'
options = Options()
driver = webdriver.Chrome(chrome_options = options)
driver.get(main_url+kwd)
```
    

## Vizの数


```python
soup = BeautifulSoup(driver.page_source, "lxml")
tab_count = soup.find_all('span', class_='search-tab-count')
c = str(tab_count[1]).split('"search-tab-count">')[1].split('</s')[0]
print(c)
```

    519
    

今回は519個のVizがあるようなので、26ページ（1ページ20個）分の検索結果画面があります。

## キーワード検索の結果すべてについてのView数とURLの取得


```python
dl = {'view': [], 'url': []}
d = pd.DataFrame(dl)

pages = list(range(1,int(c) //20 +1+1))

for j in pages:
    
    driver.get(main_url+kwd+'?page='+str(j))
    sleep(3)
    soup = BeautifulSoup(driver.page_source, "lxml")
    sru = soup.find_all('span', class_='search-result-url')
    
    for i in range(len(sru)):
        
        url_i = str(sru[i]).split('href="')[1].split('</a></span>')[0].split('">')[0]
        driver.get(url_i)
        sleep(1)
        view_i = str(BeautifulSoup(driver.page_source, "lxml").find_all('h3')[0]).split('{"COUNT": ')[1].split('}\'>views</span>')[0]
        d = d.append(pd.DataFrame({'view': [view_i], 'url': [url_i]}))
        
d['view'] = d['view'].astype(int) 
print(d.sort_values('view',ascending=False).head())
```
<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>url</th>
      <th>view</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>https://public.tableau.com/profile/efields#!/v...</td>
      <td>112839</td>
    </tr>
    <tr>
      <th>1</th>
      <td>https://public.tableau.com/profile/webveja#!/v...</td>
      <td>17710</td>
    </tr>
    <tr>
      <th>2</th>
      <td>https://public.tableau.com/profile/webveja#!/v...</td>
      <td>17073</td>
    </tr>
    <tr>
      <th>3</th>
      <td>https://public.tableau.com/profile/yerson.coll...</td>
      <td>13388</td>
    </tr>
    <tr>
      <th>4</th>
      <td>https://public.tableau.com/profile/lokadata#!/...</td>
      <td>13305</td>
    </tr>
  </tbody>
</table>
</div>

tableau publicをview数でソートして事例を探したいという方はお試しあれ！
Swift UITableView UITableViewCell にUIImageViewとUITextViewを入れて　写真付き記事一覧の実装手順

+ StoryBoardに　UITableView UITableViewCell を入れる

+ UITableViewCellのIdentifierをmycell設定
<img width="291" alt="スクリーンショット 2019-04-09 20.09.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/125746/c29e28e6-9ad4-112a-4786-83ff921d9c97.png">

+ UITableViewCellにUIImageView、UITextViewを入れる

+ Drag&DropでUITableViewCellのmyTableviewリレーションを作成（ViewController.swift参照）

<img width="600" alt="スクリーンショット 2019-04-09 20.02.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/125746/fa897be7-c7da-45e9-71bc-c247764f8a9d.png">

+ CustomCellTableViewCellクラスを作成

```swift:CustomCellTableViewCell.swift
import UIKit

class CustomCellTableViewCell: UITableViewCell {
    
    
    @IBOutlet weak var myImageView: UIImageView!
    
    @IBOutlet weak var myTextView: UITextView!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
```
+ UITableViewCell のclass をCustomCellTableViewCell 設定
<img width="374" alt="スクリーンショット 2019-04-09 20.03.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/125746/850e127a-1534-5b5b-0841-0bd3f7fcdce6.png">

+ Drag＆DropでリレーションmyImageView myTextView を連結

+ Assets.xcassetsにImage1を追加

```swift:ViewController.swift

import UIKit
import AlamofireImage

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    

    @IBOutlet weak var myTableview: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        myTableview.dataSource = self
        myTableview.delegate = self
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    func numberOfSections(in tableView: UITableView) -> Int { // sectionの数を決める
        return 1
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        // Cellの高さを決める
        
        return 50
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // セルを取得する
        let cell: CustomCellTableViewCell = tableView.dequeueReusableCell(withIdentifier: "mycell", for: indexPath) as! CustomCellTableViewCell
        // セルに表示する値を設定する
        cell.myTextView?.text = "これは富士山の写真です"
        cell.myImageView?.image = UIImage(named:"Image1")!
        
        return cell
    }
    


}

```

+ 実行

<img width="344" alt="スクリーンショット 2019-04-09 20.04.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/125746/950b4257-a689-db4f-f560-871d2350c820.png">
今年の言語はRust その４


Rustを学びます

![144px-Rust_programming_language_black_logo.svg.png](https://qiita-image-store.s3.amazonaws.com/0/62413/00cd0f4b-2fb9-436f-1752-31c135ea5f00.png)



勉強ページは日本語ドキュメント参考
[プログラミング言語Rust](https://doc.rust-jp.rs/)

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル
https://doc.rust-lang.org/book/



## 3. Common Programming Concepts

## 3.5 フロー制御

### if!!

```rust
fn main(){

    let number = 3;
    
    if number < 5 {
        println!("condition was true");
    }else{
        println!("condition was false");
    }
    
}
```

条件式はboolのみです。0とか1を代用できません。
```rust
fn main(){

    let number = 1;
    
    if number  {
        println!("condition was true");
    }else{
        println!("condition was false");
    }
    
}

===
error[E0308]: mismatched types
 --> src/main.rs:5:8
  |
5 |     if number  {
  |        ^^^^^^ expected bool, found integer
  |
  = note: expected type `bool`
             found type `{integer}`

error: aborting due to previous error


```

let文内でif式を使う
```rust

fn main(){

    let condition = true;
    
    let number = if condition{
        5
    }else{
        6
    };
    
    println!("number is {}", number);
    
}

```


### loop!!

```rust
fn main(){

    let mut count: i32 = 0;
    
    loop{
    
        println!("loop {}", count);
        
        if count >= 1_000 {
            break;
        }
        
        count += 1;
    }
    
}



```

### whileでfor

```rust
fn main(){

    let a = [10, 20, 30, 40, 50];
    let mut index = 0;
    
    while index < 5 {
        
        println!("value is {}", a[index]);
        
        index = index + 1;
    }
    
}

```

### for

```rust
fn main(){

    let a = [10, 20, 30, 40, 50];

    for elem in a.iter(){
    
        println!("value is {}", elem);
        
    }
    
}

```

range関数(start..end)

```rust

fn main(){

    for number in (1..4) {
        println!("number is {}", number);
    }

    for number in (1..4).rev() {
        println!("number is {}", number);
    }
}

==
number is 1
number is 2
number is 3

// rev
number is 3
number is 2
number is 1
```


![rustacean-flat-happy.png](https://qiita-image-store.s3.amazonaws.com/0/62413/7c2ffe00-66e2-0b91-3dc2-d92e38529cd8.png)




イエス！
ユニットテストで自動で clearstatcache する

# ユニットテストで自動で clearstatcache する

## 何がしたいの？

下記のようなテストがあります。

```php:ExampleTest.php
<?php
class ExampleTest extends \PHPUnit\Framework\TestCase
{
    function test()
    {
        // mtime を 1234567890 に更新します
        touch(__FILE__, 1234567890);
        // その値になっているはずです
        $this->assertEquals(1234567890, filemtime(__FILE__));

        // mtime を 1234567899 に更新します
        touch(__FILE__, 1234567899);
        // その値になっているはずです
        $this->assertEquals(1234567899, filemtime(__FILE__));
    }
}
```

まぁ特に意味はないんですが、実際は何かのテストでファイルシステムをいじってると思ってください。
このテスト、一見通りそうですが、**通りません**。

```plain:出力
F                                                                   1 / 1 (100%)

Time: 138 ms, Memory: 6.00MB

There was 1 failure:

1) ExampleTest::test
Failed asserting that 1234567890 matches expected 1234567899.
```

原因は php が stat コールをキャッシュするからで、こういったテストには `clearstatcache` を呼び出す必要があります。
（分かってはいるんだけど毎回忘れる）。

```php:ExampleTest.php
<?php
class ExampleTest extends \PHPUnit\Framework\TestCase
{
    function test()
    {
        // mtime を 1234567890 に更新します
        touch(__FILE__, 1234567890);
        clearstatcache();
        // その値になっているはずです
        $this->assertEquals(1234567890, filemtime(__FILE__));

        // mtime を 1234567899 に更新します
        touch(__FILE__, 1234567899);
        clearstatcache();
        // その値になっているはずです
        $this->assertEquals(1234567899, filemtime(__FILE__));
    }
}
```

なんとなく不格好ですし、やはり忘れやすいです。
今回はこれをなんとかしようというお話です。
（まぁテストメソッドを分ければ [PHPUnit がクリアしてくれる](https://github.com/sebastianbergmann/phpunit/blob/8.1.0/src/Framework/TestCase.php#L829)んですがね…）。

## 実際にとった方法

stat キャッシュを無効にする方法や設定はどうやら無いようです。
ただ、 php には [ticks](https://www.php.net/manual/ja/control-structures.declare.php#control-structures.declare.ticks) という各ステートメントごとに処理を挟む機能があるのでそれを使用します。

PHPUnit の bootstrap.php あたりに下記を追加します。

```php:bootstrap.php
register_tick_function(function () {
    clearstatcache();
});
```

これは tick 関数を追加するだけで、実際には declare 宣言が必要なので Test ファイルの冒頭に下記を追加します。

```php:ExampleTest.php
<?php
declare(ticks=1);

class ExampleTest extends \PHPUnit\Framework\TestCase ...
```

これだけでテストが通るようになります。

```plain:出力
.                                                                   1 / 1 (100%)

Time: 107 ms, Memory: 6.00MB

OK (1 test, 2 assertions)
```

ただ、所感ですが毎ステートメントで登録された処理が呼ばれるので、なんとなくテスト時間が増大しそうです（**未計測**）。
ファイルシステム関係以外のテストでは `clearstatcache` を実行する必要はないので省きたいです。

まぁファイル単位でも良いんですが、 declare 宣言はブロックで局所的に当てることができるので下記のようにもできます。

```php:ExampleTest.php
<?php
class ExampleTest extends \PHPUnit\Framework\TestCase
{
    function test()
    {
        declare(ticks=1){
            // mtime を 1234567890 に更新します
            touch(__FILE__, 1234567890);
            // その値になっているはずです
            $this->assertEquals(1234567890, filemtime(__FILE__));

            // mtime を 1234567899 に更新します
            touch(__FILE__, 1234567899);
            // その値になっているはずです
            $this->assertEquals(1234567899, filemtime(__FILE__));
        }
    }
}
```

`register_tick_function` は処理を登録するだけで、実際に declare しなければ何も動作に影響は与えないはずです。
これで本当に「局所的に自動 clearstatcache」が実現できます。
クエリビルダ、Eloquent ORM　の返り値

以下、取得結果は同じ

## Eloquent ORM
（Modelを継承したクラス内で）

```
self::all();
self::select('*')->get();
self::raw('*')->get();
```
object(Illuminate\Database\Eloquent\Collection)が返却される。

## クエリビルダ
```
DB::table('users')->get();
DB::table('users')->select('*')->get();
DB::table('users')->select(DB::raw('*'))->get();
```
object(Illuminate\Support\Collection)が返却される。

## クエリビルダ
```
DB::select('select * from users');
```
array(n) { [0]=> object(stdClass)～　が返却される。
queryでNewbieがハマったポイント

#おのれ憎きQueryめ…
プログラムの書き方はわかるけど、データベースからクエリを書いてデータを引っ張るのは…
って人多いと思います。
多いよね？
そうだよね？？
**…はい、多いということで**
僕もそんな中の一人です。
1つのカラムを検索して、レコード1行引っ張ってくる。
くらいなら出来るけど、実践レベルではまだまだです。
そんな僕がハマったqueryのポイントを紹介します。

##SQLには書き順がある。
知ってました？
適当に書いちゃ駄目なんですよSQL。
**やめてください、当たり前体操を踊らないでください！**
書く順序は

```sql
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
```

です。

間違ってもこっちのほうが見栄えが良いからと言って

```sql
SELECT * FROM table_name ORDER BY user_id DESC WHERE user_type = 'men'
```

とか書いちゃ駄目です。
上記の場合`ORDER BY`が`WHERE`よりも前に来てしまっています。
なので

```sql
SELECT * FROM table_name WHERE user_type = 'men' ORDER BY user_id DESC
```

って書くのが正しいです。

##プレースホルダはまとめて確保する感じで書く。
PHPでクエリを書く時にセキュリティの観点からPDOを利用すると思います。
PDOのクエリの書き方は少し独特で、変数をクエリに含めることは悪い事です。
なので変数の代わりにプレースホルダーというものを利用するわけですが

```sql
SELECT * FROM table_name WHERE user_id = :id
```

って感じに書きます。
おそらくこのクエリは`:id`というプレースホルダーが確保されているので
クライアントから何かしらのパラメータを受け取って動的なクエリを実行しようとしているのでしょう。

ではクライアントから受け取ったパラメータを元にLIKE検索したい時はどうするでしょう？

```sql
SELECT * FROM table_name WHERE user_name LIKE '%:text%'
```

あー、なるほど、`:text`というプレースホルダーがそこに入る感じで書いたんですね～
**駄目です、エラーが出ます、このクエリは絶対悪です。**

正解は

```sql
SELECT * FROM table_name WHERE user_name LIKE :text
```

とクエリは書いて、バインドする際は

```php
bindValue(':text','%'.input_text.'%',PDO::PARAM_STR);
```

と書いて`execute()`しましょう。

##プレースホルダーはそれぞれ固有である。
プレースホルダーの話が続きます。

```sql
SELECT * FROM table_name WHERE (user_name LIKE :text OR user_addr LIKE :text OR user_mail LIKE :text)
```

```php
bindValue(':text','%'.input_text.'%',PDO::PARAM_STR);
```

なるほど、`user_name`と`user_addr`と`user_mail`から検索するようなクエリを書いてますね。
プレースホルダーは同じ`:text`を確保してますね。
**一見動きそうですが、これも動きません。**

正しくは

```sql
SELECT * FROM table_name WHERE (user_name LIKE :text1 OR user_addr LIKE :text2 OR user_mail LIKE :text3)
```

```php
bindValue(':text1','%'.input_text.'%',PDO::PARAM_STR);
bindValue(':text2','%'.input_text.'%',PDO::PARAM_STR);
bindValue(':text3','%'.input_text.'%',PDO::PARAM_STR);
```

です。
プレースホルダーはそれぞれ固有のものなので、`:text`だけでズルして楽するのは駄目です。
なのでそれぞれ別のプレースホルダーを確保し、それぞれバインドします。

#編集後記
入社7日目
任された案件、一日半あれば終わるやろ、とかなめてたらqueryにハマって終わりませんでした…
なめてたよquery、君も強い…
僕は弱かったよ。
クエリをシュババってスマートに書けるおじさんになりてぇ。
Cognos Analytics レポート グラフとリストを自在に配置する

#グラフとリストを自在に配置する
以下のように、リストやグラフなどを置きたい場所に、サイズを調節して配置する手順を学びます。
![020.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/4310327b-f56e-5a8a-53b1-ade284c2a646.jpeg)


#手順
A1で作成したレポートからスタート
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/af9af2dc-be50-a7a1-6464-901c22de8878.jpeg)

「ツール・ボックス」タブから「視覚化」をキャンバスに配置。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/cdd988e4-b552-3613-315b-88a92fb8b96f.jpeg)

「11.1の視覚化」は最新の機能であるが、ここでは最も使用実績の多い「グラフ」を使用する。赤枠のプルダウンから「グラフ」を選択。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/20e5848d-f4d2-0755-cc37-39fd48fce178.jpeg)

表示が変わるので、「縦棒グラフ」をクリックし「クラスター縦棒グラフ」を選択し「OK」。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/9d9ae7fc-9bd5-e1d3-c775-908680981748.jpeg)

「ソース」タブから、デフォルトの数値データに「収益」、データ系列に「製品ライン」、カテゴリーに「年」を配置。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/c1e5f248-a1d4-265c-bf69-4cf72b9b1845.jpeg)

レポートを一回HTML実行してみると以下の表示になる。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/8160a2ac-c05b-cdb1-170c-9c983c5cc16a.jpeg)

リストの右側にグラフを配置したいので、ツールボックスから「テーブル」をキャンバスに配置。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/fb445712-3f02-be27-7af1-11ed96f61767.jpeg)

列数＝2、行数＝1で「OK」。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/0692b653-59c0-e2bc-082f-6c9ee00d4f6b.jpeg)

リストの左上の赤枠のあたりをつかみ、ドラッグ&ドロップで、テーブルの左側のセルに配置。
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/4cd0feb0-6500-7e19-35e9-f16f73a5f924.jpeg)

同様にグラフをテーブルの右側のセルにドラッグ&ドロップ。
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/6f5e4e39-548b-19f3-5517-248f78b3ffe8.jpeg)

レポートをHTML実行で、この様にリストの横にグラフが表示される。
![011.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/65a6f71d-b5ab-8989-1a3e-7bcd1c503393.jpeg)

グラフはもっと横長の方が見栄えが良いので、グラフを選択しプロパティの「サイズおよびオーバーフロー処理」の「・・・」を選択し、幅を「900px」に指定し「OK」。
![012.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/5cce5285-bd4e-af81-b8b8-f05bb5a72c42.jpeg)

見栄えが改善される。
![013.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ff13eeca-abd1-b972-aff0-044c03e65ca3.jpeg)

さらにリストとグラフの下に折れ線グラフを置きたいので、どちらかのセルを選択した状態で赤枠の「・・・」から「挿入」「行を下に挿入」を選択。
![014.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e6922b91-87f0-3c41-b7f2-23d943bbda93.jpeg)

行数を「1」で「OK」。
![015.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/015679b1-2a76-7c71-e39e-b04af5d2a670.jpeg)

二つのセルをマージするため、個々のセルを「Ctrl」ボタンを押しながら選択し、赤枠のアイコンの「セルを結合」。
![016.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/91b22b14-cf68-1a31-922b-3b23469d8eb4.jpeg)

マージされたセルに「クラスター折れ線グラフ」を配置。
![017.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/1cf0f4bb-748d-dec4-5cf4-3626609aee51.jpeg)

デフォルトの数値データに「総利益」、カテゴリーに「月キー」を置き、グラフのプロパティからサイズの幅を「1200px」に指定。
![018.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/14a6a1a3-9168-fd4a-c0ce-06d88ae30bfb.jpeg)

レポートをHTML実行してみると、以下の表示となる。
![020.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/31450d96-4a55-e52a-b985-e80dfe2bfe0c.jpeg)



#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
Cognos Analytics レポート リストに計算式追加

#リストのクエリーに計算式を追加しリストに表示する
新規に計算式として「収益予実差」を作成し、リストに追加します。
![012.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/832290eb-3479-4353-2028-67575454e0f8.jpeg)

#手順
A1のレポートの続きから行う。
※A1レポートをコピーして、A2に名前を変更している。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/459eb4bc-d1b7-8fce-3d19-24bdf144c663.jpeg)

リストで使用しているクエリーを確認する。
リストの左上隅の辺りを選択すると、図のように右側にプロパティが表示され、クエリー表示されている「クエリー1」という名称のクエリーがリストで使用されている事がわかる。
※プロパティウィンドウが表示されない場合、右上の赤枠の「プロパティーを表示」アイコンで表示ができる
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/a8066183-c998-7140-ba90-80ae9202ede6.jpeg)

「レポート」という文字の右側の「^」からプルダウンで「クエリー1」を選択すると、クエリー1で使用されているデータアイテムが表示される。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/bf899f95-d82e-6456-80bc-dc42b620f229.jpeg)

このクエリーに対して、直接計算式のデータアイテムを追加する。

「ツールボックス」アイコンを選択し、「クエリー計算」を図のようにデータ・アイテムウィンドウにドロップする。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/2fde50fa-958e-e3aa-1b1b-e09be846b61a.jpeg)

名前に「収益予実差」と入力し、図のように「収益」を式の定義にドロップ、「-」を右側に記載、さらに右側に「計画収入」を配置する。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/de58d44e-16b1-9542-cbfd-94661b1c2b88.jpeg)

計算式の文法が正しいかをチェックするため、赤枠の「検証」アイコンをクリックすると、問題が無ければ情報ウィンドウに「エラーはありません。」と表示されるので「OK」。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/f763d553-e3f2-a159-2da7-fe0b7226c079.jpeg)

クエリー1内に「収益予実差」が作成されている。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/41992ebe-385a-46a6-fe1c-6d591d217847.jpeg)

「収益予実差」のプロパティで、詳細集計と概要集計を「算出」に変更。
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/fe3047f7-54e6-e858-22d2-3f7f2a9777b7.jpeg)

リストに「収益予実差」を配置するため、「ページ1」を選択。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d01e05c5-5aa9-e16a-a4c3-3fb2de6d05c4.jpeg)

この時点ではまだ「収益予実差」はリストに含まれていない事がわかる。
「データ・アイテム」アイコンを選択すると、レポート内のクエリーとデータアイテムが表示されるので、リストのクエリーである「クエリー1」から「収益予実差」をリストに配置する。
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/3b852adf-19c0-1a93-5c53-26e8797ce437.jpeg)

この状態で、レポートをHTML実行。
![011.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ba708281-1e0c-bcbe-4743-d1244a31bf26.jpeg)

計算された「収益予実差」がリストに表示される。
![012.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/17e8e393-a92c-e701-a1a6-a5029407f032.jpeg)


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
Cognos Analytics レポートでリストを作成し保存する

#レポートにリストを作成する
レポートの機能でリストを作成し、Cognosサンプルのパッケージのデータアイテムを配置し、リストを表示する手順を説明します。
![015.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/200fe1e2-8d0f-b98d-5302-698538d98089.jpeg)


#手順
「新規」→「レポート」
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/5af08c1e-611b-91aa-c069-3ad819b1faff.jpeg)

「空白」を選択し「OK」
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/8e3bd0f9-2b84-d03c-78b7-88dba8c5b7d0.jpeg)

使用するパッケージを選択するため「＋」を選択し、ファイルを開くウィンドウで赤枠の様に「チーム・コンテンツ > サンプル > モデル > GO データウェアハウス(クエリー)」と辿り「開く」
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/0f4dfa4f-b65f-065a-15b8-f627935b28aa.jpeg)

以下の様にパッケージの中身が表示される。「V」をクリックすると、アイテムが展開表示される。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/16dcee0e-ae46-a16b-cefd-deb418c69308.jpeg)

「ツールボックス」アイコンを選択し、図のように「リスト」をドラッグ&ドロップでキャンバスに置く。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/1f9e52f4-3e91-d366-7718-646d954b10be.jpeg)

リストの名前とリストで使用するクエリー名が指定できるが、このままで「OK」
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/98d0e0e9-a984-cb15-38f3-db331f1eccdc.jpeg)

「ソース」アイコンを選択し、「製品ライン」をリストにドラッグ&ドロップ。
※ドロップ先の表示が、赤枠のような縦三本線になっている状態でドロップする事が大事
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/55af75d0-40e7-fda9-c852-a6b689e9f48e.jpeg)

同様に「年」をリストに配置
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/990f96f1-9358-d6dc-85a5-edbd0f5bf315.jpeg)

「数量」も配置
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/8f81a7c9-4c04-d4a4-8001-f22088a8c6e0.jpeg)

レポートを保存する。赤枠の「保存」アイコンを選択し、任意のフォルダとレポート名を指定し「保存」
※「＋」アイコンで、フォルダを作成する事も可能
![010.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/06ade6ea-e24e-90d9-fa3d-d2c64d24c3de.jpeg)

赤枠のようにレポート名が表示されるようになる。
このレポートを、レポート作成画面から実行してみる。赤枠の「実行オプション」から「HTMLを実行」を選択
![011.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/85ddc0de-9165-ad03-eb59-ac24300df67b.jpeg)

以下のように別タブでレポートの実行イメージが確認できる。
「A1.Report」タブを選択し、レポート作成画面に戻る。
![012.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/aea95abd-a0cc-e53e-d8a3-22edbae22ad4.jpeg)

レポート作成画面を閉じるには、レポート名の右側のVをプルダウンし「X」を選択
![013.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/f3fc3553-0d07-88af-f3cd-8e5102cfd2f8.jpeg)

ポータルが表示される。
保存指定したフォルダにレポートが存在する事が確認できる。
![014.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/2365db23-c07b-2e26-c9bb-41b7f2c38cf2.jpeg)


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
【Rails5 + Font Awesome5】テキストボックスのplaceholderにアイコンを表示する

# はじめに
Railsアプリ開発でplaceholderにFont Awesomeのアイコンを表示しようと思い、方法をあれこれ調べててもなかなかうまくいかずにオオン！？ってなったので備忘録。

# 準備
RailsでFont Awesomeを使用する準備。
以下をGemfileに追加し`bundle install`。

```ruby:Gemfile
gem 'font-awesome-sass'
```

以下をapplication.scssに追加。

```scss:app/assets/stylesheets/application.scss
@import "font-awesome-sprockets";
@import "font-awesome";
```

これでFont Awesomeを使う準備は完了。
以下のようにして簡単にFont Awesomeを使用することができる。便利ですね。

```erb
<%= icon('fa', 'search', '検索') %>
<%# => <i class="fa fa-search"></i> 検索 %>
```
<img width="72" alt="スクリーンショット 2019-04-03 7.07.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/349145/97993fe6-331c-724d-1cc5-e20e82f3e819.png">
↑こんな感じになる。

# いざplaceholderにアイコンを表示
馬鹿なのでとりあえずそのままplaceholderにぶち込んでみる。

```erb
<%= text_field_tag(:name, nil, placeholder: icon('fa', 'user'))  %>
```

<img width="148" alt="スクリーンショット 2019-04-03 7.14.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/349145/e6d05cf4-ab7e-748b-0dfc-b66b4603c95c.png">
オオン！？！？

# 解決
まぁそりゃそうだということで、正しい方法を。
[Font Awesomeの公式ページ](https://fontawesome.com/)から好きなアイコンを探し、Unicodeを調べる。
<img width="1229" alt="スクリーンショット 2019-04-03 8.15.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/349145/575a217f-737f-79a8-47c3-761201b2bf8f.png">
ユーザーのアイコンだと`f007`だそうです。

これを`placeholder`に以下のようにUnicodeとして記述すればいいみたい。
**そして`class属性`に`fa`を指定しないと反映されないので注意。**
僕はこれに気づかずにあれやこれやと悩んでいた。

```erb
<%= text_field_tag(:name, nil, placeholder: "\uf007", class: 'fa')  %>
<%# classの指定を忘れずに！！！！ %>
```
<img width="178" alt="スクリーンショット 2019-04-03 7.38.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/349145/9dbdd888-b3c1-fc81-2159-33ea38baf773.png">
↑いい感じ
文字列も一緒に表示したいときは普通に`"\uf007 User Name"`みたいに続けて書けばいいです。

# 参考
[Rails5でplaceholderにfont-awesomeのiconをいれたい](https://teratail.com/questions/98033)
Win10 に xgboostをインストールする

xgboostをWin10にインストールする手順をメモしておきます。
Cコンパイラでmakeしないとインストールできないようで、Windows環境だとちょっと面倒です。

以下の手順そのままです
https://www.kaggle.com/questions-and-answers/31960

## 試行環境
Windows10
python 3.6

## 手順
1. git をインストールする
2. winMW をインストールする
3. gitでcloneしてコンパイルする

## 1. git をインストールする

git bash がない場合は以下からダウンロードします
https://gitforwindows.org/
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/907aa9b8-db4e-b83c-bb0f-71dd9b03e3cb.png" width=50%>

ダウンロードしたファイルを実行してインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/cdd9b017-a4f1-3877-763b-cf09885eb96b.png)

## 2. winMW をインストールする

Ｃコンパイラをインストールしていない場合は winMW をインストールします。
http://iweb.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe

ダウンロードしたファイルを実行してインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/e330190a-93ba-4eac-15dc-8c6a9284fbc9.png)
64 bit OS の場合、Architectureは x86_64を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/c05f7f5c-921c-687a-1893-176f094729c5.png)

minGWのインストーラーはパスを通してくれないので、環境変数のPATHに追記します。
minGW-8.1.0の場合は「C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin」ですがバージョン上がるとpathが変わるようなのでエクスプローラで確認して追記します。

パスが通ったらコマンドプロンプトから確認しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/090fcad2-62d5-0bc2-5f84-3f3d41ea8e33.png)
無事通ったようです。

## 3. gitでcloneしてコンパイルする

git bashを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/3c692ca8-fdf4-6561-94ae-c56d2f6444ce.png)

xgboostのファイルを置くフォルダに移動したら、git cloneします。

```
git clone --recursive https://github.com/dmlc/xgboost
```
cloneしたxgboostフォルダに移動してコンパイルします。

```
cd xgboost
alias make='mingw32-make'
cd dmlc-core
make
```
```
cd ../rabit
make lib/librabit_empty.a
```
```
cd ..
cp make/mingw64.mk config.mk
make
```
```
cd python-package
python setup.py install
```

最後にpipでインストールするしたら完了です。

```python:python
pip install xgboost
```
Androidのライフサイクルについて

Andorid開発をしているとよく聞くライフサイクルですが、どんなものか分からないと、どのメソッドにどんな実装をしないといけないのかわからない、あるいは間違えるということが起こるので、まとめたいと思います。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/239560/62dac8e7-7f12-5fc8-c4da-1a9695d963b2.png)

上記の画像がライフサイクルの図です。

Activityはユーザーができる画面を提供します。
Viewの表示やボタンをクリックしたときのアクション等を記載します。

Activityは作られて破棄されるまで状態が変化して、この変化がライフサイクルです。
画像に記載されているonCreate()やonStart()などはコールバックメソッドと呼ばれていて、私たちが実装するコードではoverrideして使われます。
実際にソースコードを見てみると、onCreate()やonStart()が存在していると思います。

###onCreate
画面が表示されるとき行われる処理です。
画面の初期化が行われます。
どの画面を表示させるかの設定等を行います。

onCreateの処理が完了したら、onStart()が呼ばれます。

ソースコードでは下記のような処理を行います。

```
setContentView(R.layout.activity_task_edit)
```
###onStart
Activityが開始された時に呼ばれます。
この時点ではActivity生成されたがユーザーには見えない状態です。

onStart()ではデータの読み込み開始などを記述します。データの読み込みの必要がない場合は特に実装はしないかと思います。

###onResume
Activityが前面にきて、ユーザーとのやりとりを始められるようになる直前に呼び出されます。
画面が使えるようになります。


###onPause
他のアプリが前面にきて、Activityがバックグラウンドに隠れるときに、呼ばれます。
データの変更をコミットしたり、CPU を消費する可能性のあるその他の動作を停止したりする際に使用されます。

Activityが前面に戻るときは onResume() が後に続き、Activityが非表示になるときは onStop() が後に続きます。

###onStop
画面がユーザーから見えなくなったときに呼び出されます。
ホーム画面に戻ったり、画面遷移したり、アプリが見えなくなるときに呼ばれます。

###onDestroy
Activityが破棄される直前に呼ばれます。
DBの接続を終了したりはここで行います。

###onRestart
ActivityがonStop()の後、復活するときに呼び出されます。
例えば、端末がスリープ状態になり、再び始めたり、端末のホームボタンを押して起動中のアプリを再び始めるときに使われます。

今回はざっくりとした概要になってしまいましたが、また気になったことがあれば、思考の整理がてら記載したいと思います。

##参照
Android Developers --  https://developer.android.com/guide/components/activities?hl=ja

(ライフサイクルの図は上記サイトにあります)
TypeScript 3.4 で Array (string[]) を Union Type に変換する Tips

参考: https://stackoverflow.com/questions/45251664/typescript-derive-union-type-from-tuple-array-values

TypeScript 3.4 で組み込まれた `as const` を使ってより簡潔に実装できるようになった

```typescript
const directionList = ['east', 'west', 'south', 'north'] as const
// -> Readonly ['east', 'west', 'south', 'north']

type Direction = typeof directionList[number]
// -> 'east' | 'west' | 'south' | 'north'
```

独自定義の Type Guard と組み合わせたりするのに便利そう

```typescript
const isDirection = (obj: any): obj is Direction => {
  return directionList.includes(obj)
}

const doSomething = (data: any) => {
  // validation
  if (!isDirection(data.direction)) {
    throw new Error('direction is not found')
  }

  // do something
}
```
CSSアニメーションと背景画像で空に雲を流す

# 実現したいこと

<img src="https://qiita-image-store.s3.amazonaws.com/0/127338/9a9b9358-35f8-9c95-69a8-3952b0e3aec3.png">

- 上図のような雲が浮かぶ空を作りたい。
- 雲はアニメーションで流れてほしい。
- 空の色はCSSで変えたい。

# 実装方法

以下のような雲の画像を用意します。（黒は透過チャンネルです。）

<img src="https://qiita-image-store.s3.amazonaws.com/0/127338/615a8609-b1f4-aa37-fb73-d3fc53b2df4f.png">

スタイルシートを作成します。

```css
/* 1. 雲が浮かぶ空を作成 */
.sky {
  animation: cloud 25s linear infinite;
  background: url(../images/cloud.png),
    linear-gradient(#bbe4fa, hsl(171, 40%, 91%));
  background-position-x: 0%;
  background-position-y: 35%;
  background-repeat: repeat-x;
  background-size: 800px auto;
  height: 560px;
}
/* 2. keyframeを使って、雲が流れるように。 */
@keyframes cloud {
  from {
    background-position-x: 0;
  }
  to {
    background-position-x: 800px;
  }
}
```

1. 画像とグラデーションを背景に敷いて雲が浮かぶ空を作成。
2. 雲の背景画像をアニメーションで横に移動させる。

`linear-gradient`の色を変更すれば、夕方の空とかも作成できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/127338/737c8bb3-2172-af67-68d6-6f54be8ce548.png">

簡単なので、みなさんぜひやってみてください。
「nand2tetris」3入力AND回路を作る。

#はじめに
ツールセットの使い方を知るために2入力ORから作ろうとしたのですが、結局わからなかったのでもとからあるANDを使って3入力AND回路を作ろうと思います。

#ソース
```And3.hdl
CHIP And3 {

	IN in1, in2, in3;
	OUT out;

	PARTS:
	And(a = in1, b = in2, out = c0);
	And(a = in3, b = c0, out = out);
}
```
#実行
1. `HardwareSimulator`を起動します。パスを通しておいて、コマンドプロンプトから起動します。
2. 左上の`File`から`Load Chip`を選択し、上のソースを読み込みます。
 ![hdl1.png](https://qiita-image-store.s3.amazonaws.com/0/246294/c616fdef-8dd9-6da4-4e62-07d2bc53b59d.png)
3. `Input pins`の値を指定して`F5`で実行します。
4. 停止するときは上の四角い停止ボタンを押します。

#おわりに
今後はスクリプトも書いていきます。

[日記一覧へ](https://qiita.com/C_Assembly/items/baf577959a53d9da765e)
量子計算シミュレータ、つくってみた

 勉強がてら、量子計算シミュレータをつくってみたよ。
[qlazy - Quantum Computer Simulator]
(https://github.com/samn33/qlazy)

[Interface2019年3月号](https://shop.cqpub.co.jp/hanbai/books/MIF/MIF201903.html)にC言語での実装例が出ていたので、参考にさせていただきました。まず、Linuxコマンドとして実装して、その後、ctypesでPythonからも呼び出せるようにしました。

使い方は至ってシンプル。

```foo.qc
init 2
h 0
cx 0 1
m
```

というファイルを用意しておいて、

```sh
$ qlazy -qc foo.qc
```

とやると、

```sh
frq[00] = 45
frq[11] = 55
last state => 00
```
という結果が得られます。何をやっているかというと…
* １行目：量子ビットを2つ用意し、|00>に初期化
* ２行目：0番目の量子ビットにアダマールゲートを適用
* ３行目：0番目と1番目に制御NOTを適用
* ４行目：全量子ビットを観測（デフォルトでは100回測定してその頻度を出して、100回目の測定結果をlast stateとして表示します。上の例では|00>だったのが45回、|11>だったのが55回で、100回目の結果は|00>でした、という意味）
…です。

また、行の途中で、

```sh
show
```
とやると、そのときの量子状態を出力することもできます。例えば、上のfoo.qcの制御NOTゲートの後にshowを入れると、

```sh
c[00] = +0.7071+0.0000*i : 0.5000 |+++++
c[01] = +0.0000+0.0000*i : 0.0000 |
c[10] = +0.0000+0.0000*i : 0.0000 |
c[11] = +0.7071+0.0000*i : 0.5000 |+++++
```

という感じで、各状態の確率振幅とその絶対値の2乗（と棒グラフ）を表示してくれます。というわけで、この例の場合、「量子もつれ」の様子がわかります。実際の量子コンピュータでは、こんな芸当はできないですが、シミュレータならではの機能ですね。

あと、ファイル読み込みではなく、対話モードでも実行できます。

```sh
$ qlazy
>> init 2
>> h 0
>> cx 0 1
>> show
c[00] = +0.7071+0.0000*i : 0.5000 |+++++
c[01] = +0.0000+0.0000*i : 0.0000 |
c[10] = +0.0000+0.0000*i : 0.0000 |
c[11] = +0.7071+0.0000*i : 0.5000 |+++++
>> m
frq[00] = 45
frq[11] = 55
last state => 00
>> quit
$ 
```

Pythonから使う場合は、以下のように書けば、同じようなことができます。

```python
from qlazypy.basic import QState

qs = QState(2)
qs.h(0)
qs.cx(0,1)
qs.show()
md = qs.m()
md.show()

del qs
```

とりあえず、基本的なゲートは実装できた気になっています。以下に置いたので、ご興味あれば触ってみてください。諸々不具合あるかもしれませんが、フィードバックいただけると、とてもうれしいです。

[qlazy - Quantum Computer Simulator]
(https://github.com/samn33/qlazy)

## 補足(2021.9.5)

最新版の仕様は[qlazy](https://github.com/samn33/qlazy)の[ドキュメント](https://samn33.github.io/qlazy-docs/index.html)をご覧ください。

以上
【作業メモ】MeCab

# 目的
例えば、以下のようなマンガの感想を集計したcsvデータが複数ファイルあると想定して、その分析をします。

|番号      |       作品タイトル |    感想    |
|:-----------------|------------------:|:------------------:|
| 1|              ワンピース|        面白い|
| 2|            ワンピース|       ドンッ！|
| 3|              わさび|        俺もブラジャーを買いに行こう|
| 4|                暗殺教室|         悪意こわい|
| 5|             嘘解きレトリック|       弁当が飯テロ|
| 6|           ランドリーオール|      リドの出番増やして|

# MeCabのインストール

[PythonでMeCabを使ってみる(Windows10 64bit)](https://qiita.com/wanko5296/items/eeb7865ee71a7b9f1a3a)

有志の方が作成された64bit向けのインストーラーmecab-0.996-64.exeを以下からダウンロードして実行してください。

[MeCab 0.996 64bit version (旧)]:https://github.com/ikegami-yukino/mecab/releases/tag/v0.996

次にコマンドプロンプトで以下を実行してください

```
pip install mecab-python-windows
```

PythonでMeCabがインポートできれば、以下の実行に成功します。

```python
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("すもももももももものうち"))
```

# CSVファイルの読み込み

口コミデータは複数のcsv形式ファイルで保存されています。
まずは、これらのファイルを結合ます。
ここではファイルの保存フォルダを"comments"とします。

```python
import glob
import csv
import pandas as pd

DATA_PATH = "./comments/"
all_Files = glob.glob('{}*.csv'.format(DATA_PATH))

list = []
for file in all_Files:
    infile = open(file, encoding="shift_jis", errors='ignore')
    list.append(pd.read_csv(infile))
df = pd.concat(list, sort=False)

df.to_csv('merged_comment.csv', encoding='utf_8')
```

以上により、全てのcsvファイルがmerged_comment.csvにまとまります。

次にcsvファイルからデータを読み込みます。

```python
files = open('merged_comment.csv', encoding="utf-8", errors='ignore')
data = pd.read_csv(files)
```
以下のようなデータが取得できます。




次にdataから'作品タイトル'列中に'暗殺教室'を含む行だけ抜き出します。

```python
data = data[data['作品タイトル'] == '暗殺教室']
```

続いて、その中から作品へのメッセージのみを抽出します。

```python
message = data['感想']
```



抽出した感想を、MeCabに渡すために文字データへ変換します。

```python
messagelst = message.astype(str).tolist() # 文字列のリストに変換
messagestr = ' '.join(messagelst)         # 空白文字で結合
print(messagestr) 
```

# 形態素解析

MeCabを用いて、抽出したメッセージを形態素解析します。

```python
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse (messagestr))
```

メッセージが単語単位に区切られ、名詞や動詞などのラベルがつけられています。
次に、これらから名詞だけを抜き出して、頻度順に並べます。

```python
import re
mecab = MeCab.Tagger()
parse = mecab.parse(messagestr)
lines = parse.split('\n')
items = (re.split('[\t,]', line) for line in lines)

# 名詞をリストに格納
words = [item[0]
         for item in items
         if (item[0] not in ('EOS', '', 't', 'ー') and
             item[1] == '名詞' and item[2] == '一般')]

from collections import Counter
# 頻度順に出力
counter = Counter(words)
for word, count in counter.most_common():
    print(f"{word}: {count}")
```
以下のように使用されている名詞が、頻度順に並びます。
Amazon データベースサービスの基礎とユースケースの比較

#データベース#

大きく分けて2つに分けられる。

- これまでのDB → リレーショナルDB（RDBS）、データ間の関係性が定義されたデータを取り扱う一般的なDBシステム
- ビックデータ向けDB → NoSQL 、リレーショナルデータ構造を持たずSQLを利用しないDBの総称


#データベースの全体像#
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/728cb9c6-cb5e-0afa-a3ac-86b9d6e6d945.png)

|DB|AWS|説明|
|---|---|---|
|リレーショナルDB（RDB）|RDS|業務システム向けのDBの基本はリレーショナルデータベース|
|データウェアハウス（DWH）|Redshift |構造化データを利用した経営分析向けのデータベース|
|分散型DB／データレイク |S3 |ビッグデータやIoTデータを蓄積して高速処理を可能にするDBとストレージの組合せ　|
|KVS :キーバリュー型 |ElastiCache |シンプルなデータ構造にすることで高速処理を可能にしたDB　|
|ワイドカラム型 |DynamonDB |キーに対してカラムを大規模に登録できるのがワイドカラム型　|
|ドキュメントDB |Amazon DocumentDB |キーに対してドキュメント指向でXMLなどのデータを格納する　|
|インメモリデータグリッド|ElastiCache　|KVSの仕組みをメモリを利用してより高性能にしたDB　|
|全検索型エンジン×分散DB　|Elasticsearch　|データの全検索エンジンであるElasticsearchは分散データベースと連携してデータ全検索処理が可能　|
|グラフDB　|Amazon Neptune 　|グラフ構造でデータ間のつながりを検索・可視化するDB　|
|分散OLTP（RDB）　|Amazon Aurora　|オンライントランザクション処理（Online TransactionProcessing）を分散化する次世代DB　|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/73aad29d-a684-22ab-75f0-cb37361bc130.png)

#主要DBサービスのユースケースの比較表#
|比較項目|RDS|DynamonDB|ElastiCache|Redshift|
|---|----|----|----|---|
|リレーショナルデータベース|○|×|×|○|
|データベースキャッシュ|△|○|○|×|
|メタデータ検索|○|○|○|×|
|セッションなどの状態管理|△|○|△|×|
|大容量データ分析|△|×|×|○|
|リアルタイムデータ分析|△|○|○|×|
|低レイテンシー|△|○|○|×|
|モバイルバックエンドデータベース|△|○|△|×|

汎用性が高いのはRDS
低レイテンシーやキャッシュ要件の場合は、DynamonDB,ElastiCache
大容量のデータ分析は Redshift

#参考#
[Amazon RDS](https://qiita.com/leomaro7/items/9ac81ae543689a15b322)
[Amazon DynamoDB](https://qiita.com/leomaro7/items/383c1aa287c7daf49518)
[Amazon ElastiCache](https://qiita.com/leomaro7/items/f031cfdd7d12d5d5ccc5)
[Amazon Redshift](https://qiita.com/leomaro7/items/d72eca73154f0609bf61)

#AWSのデータベース２０２０#
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-01_AWS_Summit_Online_2020_DAT01.pdf
![スクリーンショット 2020-10-13 21.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/55f5c666-9788-3337-d09e-44dd955d4a9c.png)
「コンピュータシステムの理論と実装」HDLとかのメモ

#はじめに
`コンピュータシステムの理論と実装`という書籍を購入しました。
この書籍で使用されている開発環境のメモです。

#環境 (2019/04/09)現在
OS : Windows 10
ツールセット : [Nand2tetris](https://www.nand2tetris.org/)

#メモ一覧
(1) [3入力AND回路と基本操作](https://qiita.com/C_Assembly/items/2880c308b9ae58defbd1)
ラプラス変換とフーリエ変換の関係

# はじめに

理工学部の学生にとって、フーリエ変換、ラプラス変換は必須の科目であろう。しかし、フーリエ変換については物理的な意味がわかりやすく、変換もきれいなので受け入れられる学生さんも多いのだが、ラプラス変換については「逆変換の積分がなぜ複素平面を「縦」に、しかも軸がずれて走るのかわからない」とか「微分をラプラス変換するとゴミがでるのが気持ち悪い」など、「フーリエ変換に比べると美しくない」と感じる人がいるようだ。

しかし、ラプラス変換とフーリエ変換はきってもきれない仲である。本稿では、あまり話題にされないラプラス変換とフーリエ変換の関係についてまとめておく。

# フーリエ変換

まず、フーリエ変換を定義しておこう。変換前の変数を$x$、変換後は$k$としよう。これは実空間と波数空間に対応する。関数$f(x)$のフーリエ変換は以下のように定義する。

$$
\mathcal{F}[f] \equiv \tilde{f}(k) = \int_{-\infty}^\infty dx f(x) \mathrm{e}^{-ikx}
$$

フーリエ変換後の関数には「ハット」をつけることが多いが、後でラプラス変換と区別するために「チルダ」をつけて$\tilde{f}$と表記していることに注意。

フーリエ逆変換は以下のように定義する。

$$
\mathcal{F^{-1}}[\tilde{f}] \equiv \frac{1}{2 \pi} \int_{-\infty}^\infty dk \tilde{f}(k) \mathrm{e}^{ikx}
$$

ここまでは単に定義の確認である。

# ラプラス変換

さて、フーリエ変換ができる条件は、関数$f$が絶対可積分であることなどはご存知であろう。この条件はかなり厳しい。そこで、こんな変換により、関数$f(x)$から新たな関数$g(x)$を定義する。

```math
g(x) = 
\left\{
\begin{matrix}
0 & x < 0 \\
f(x) \mathrm{e}^{-ax}& x \geq 0
\end{matrix}
\right.
```

つまり、$x<0$ならゼロとし、$x\geq 0$なら$\mathrm{e}^{-ax}$をかける、という変換である。ただし$a$は実数である。これにより、関数がだいぶ「おとなしく」なることが想像できると思う。

さて、この関数$g(x)$をフーリエ変換してみよう。

```math
\begin{align}
\mathcal{F}[g(x)] &= \int_{-\infty}^\infty dx g(x) \mathrm{e}^{-ikx}\\
&= \int_0^\infty dx f(x) \mathrm{e}^{-(a+ik)x}
\end{align}
```

ここで、$s = a + i k$と定義すると、

```math
\begin{align}
\int_0^\infty dx f(x) \mathrm{e}^{-(a+ik)x} &= 
\int_0^\infty dx f(x) \mathrm{e}^{-sx} \\
&= \mathcal{L}[f]
\end{align}
```

これは$f(x)$のラプラス変換の定義にほかならない。簡単のため$\mathcal{L}[f]=\hat{f}$と表記することにしておこう。つまり、

$$
\mathcal{F}[g] = \tilde{g} = \mathcal{L}[f] = \hat{f}
$$

である。


$f(x)$がフーリエ変換が不可能な関数であったとしても、$a$を十分に大きく取れば$g(x)$がフーリエ変換可能になる場合がある。これがラプラス変換がフーリエ変換より「広い」範囲の関数を受け入れる理由である。

さて、$f(x)$のラプラス変換とは、$g(x)$のフーリエ変換$\mathcal{F}[g]$であった。これをフーリエ逆変換すれば、$g(x)$に戻るはずである。そのままフーリエ逆変換の定義に突っ込んでみよう。

$$
\begin{aligned}
g(x) &=  \mathcal{F^{-1}}[\mathcal{F}[g]] \\
&= \frac{1}{2\pi}\int_{-\infty}^{\infty} dk \hat{f}(s) \mathrm{e}^{ikx}
\end{aligned}
$$

さて、$x>0$なら、$g(x) = \mathrm{e}^{-ax} f(x)$であるから、

$$
\mathrm{e}^{-ax} f(x) = \frac{1}{2\pi}\int_{-\infty}^{\infty} dk \hat{f}(s) \mathrm{e}^{ikx} \\
$$

よって、

$$
 f(x) = \frac{1}{2\pi}\int_{-\infty}^{\infty} dk \hat{f}(s) \mathrm{e}^{(a+ik)x} \\
$$

ここで、$s= a + ik$であったから、$ds = idk$に注意して積分変数を$k$から$s$に取り直すと

$$
f(x) = \frac{1}{2 \pi i} \int_{a -i\infty}^{a + i\infty} ds \hat{f}(s) \mathrm{e}^{sx}
$$

これはラプラス変換逆変換に他ならない。変数変換により、積分が縦に、つまり虚数軸に並行に、しかも$a$の分だけずれた場所を走ることがわかるであろう。

ここで、$a$は、積分

$$
\int_0^{\infty} dx \mathrm{e}^{-ax} |f(x)|
$$

が収束するように選ばなければならない。これは$g(x)$がフーリエ変換可能であることからくる要請であり、$a$が$f(x)$のすべての極より右側にくることを意味する(ここでは詳細に立ち入らないので教科書を参照せよ)。

# まとめ

関数$f(x)$にたいして、$x<0$ならゼロに、$x\geq 0$なら$\mathrm{e}^{-ax}$をかけて、「より収束しやすく」した上でフーリエ変換したものがラプラス変換である。ラプラス変換が、軸の中途半端なところを「縦に」積分しなければならない理由も、フーリエ逆変換と$k$から$s$への変数変換から理解できるであろう。

フーリエ変換もラプラス変換も線形微分方程式を解くのに極めて重要であるが、特に工学応用上では初期値問題、つまり「時刻$0$での状態と、その後の時間発展を記述する微分方程式が既知である時に、時刻$t$での振る舞いを知りたい」というニーズが多いことから、ラプラス変換の方がよく使う気がする。

本稿が少しでも「ラプラス変換気持ち悪い」と思ってる人の役に立てば幸いである。
404ページの分岐方法

404ページだけheaderを変えたい時などにつける分岐方法です。
「CakeError」で判別できるので

~~~php
<?php if($this->name == 'CakeError'): ?> 
<h1>Not Found</h1> 
<?php else: ?> 
<h1><?php echo str_replace("｜" . $siteConfig['name'], '', $this->BcBaser->getTitle()) ?></h1> 
<?php endif; ?>
~~~

これで分岐することが出来ます。
openコマンドにはoをエイリアスに当てると便利な件

## openコマンドにはoをエイリアスに当てると便利な件
openコマンドは、ターミナルからファインダーを開くことが出来るコマンドです。

人によってはよく使いコマンドではないでしょうか。
僕もその一人です。

そこで僕は.zshrcに次のようなaliasを設定をしています。
`alias o='open'`
`o`に紛らわしさはありません。便利ですのでぜひ使ってみてください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Travis CIの導入

Travis CIを使ってみたので、導入をまとめておく。

# 前提
* GitHubのアカウントがある
* Publicリポジトリを持っている（Privateリポジトリは無料でできないので、諦めてPublicリポジトリにしよう）

# Travis CIとの連携許可
https://travis-ci.org/ にアクセスする。

![travisci01.png](https://qiita-image-store.s3.amazonaws.com/0/355990/40a4df93-3c20-73d3-74a6-666aa0200451.png)

「Sign Up」を押す。

![travisci02.png](https://qiita-image-store.s3.amazonaws.com/0/355990/a7d5d1e4-0580-f996-1cdf-f5f422a98523.png)

GitHubの認証をするページが表示されるので、GitHubのアカウント情報を入力する

![travisci03.png](https://qiita-image-store.s3.amazonaws.com/0/355990/f474688b-51fa-a0b0-f910-26fc16c1ee86.png)

認証が成功するとメイン画面に移る。
右上の「Settings」を押す。

![travisci04.png](https://qiita-image-store.s3.amazonaws.com/0/355990/58e07e3a-1d0a-a719-442a-62da351320b8.png)

Publicリポジトリが一覧で表示される。CIしたいリポジトリをチェックする。
これで連携は完了。これ以降に、連携したリポジトリのいずれかのブランチにPushするとジョブ（※）が実行される。
※CIで実行する一連の処理のこと

# .travis.ymlの作成
ジョブの実行にはTravis CIの設定ファイルである.travis.ymlが必要となる。
Node.jsならこんな風に書いておけばとりあえずOK

```yaml:.travis.yml
language: node_js
node_js:
  - "lts/*"
```

作成した.travis.ymlをリポジトリのルートに配置してPushする。
1分ぐらいすると、メイン画面に実行中の情報が表示されるようになる（画像３枚目のようになる）
成功すれば緑色で、エラーが出るなど失敗すれば赤色で表示される。

# GitHub AppsのTravis CIって？
GitHubのMarketplaceに「Travis CI」っていうアプリケーションがある。
これをインストールすると、 https://travis-ci.com/ と連携するようになる。 
今は https://travis-ci.com/ も無料プランが存在するので、こっちでいいとおもう。
[Vuex]actionからactionの呼び出しはdispatchで書く

# やりたい事
1. hogeAPIを実行するActionを実行
2. hogeAPIのレスポンスにfugaURLが書いてある場合、そのURLを実行するActionを実行
3. Storeに格納

# 実装
hogeのAPIレスポンスに、fugaUrlがあるか調べてあればactionをdispatch

```vue.js
// 呼び出し
created () {
  getHoge()
},
methods: {
  ..mapActions({
    setHoge: 'setHoge'
  }),
  getHoge() {
    this.setHoge({payload: "hogeAPIのURL"})
  }
}
```

```actions.js
export const setHoge = ({ dispatch, commit }, payload) => {
  Vue.http.get(payload).then((hogeResponse) => {
    let fugaUrl = indexResponse.hoge.fugaUrl
    if (fugaUrl) {
      dispatch('setFuga', fugaUrl) // setFugaを呼び出し
    }
    commit()
  })
}

export const setFuga = ({ commit }, payload) => {
  Vue.http.get(payload).then((fugaResponse) => {
    commit()
  })
}
```
ssh公開鍵を渡す

■昔、ssh公開鍵をssh接続したいサーバに登録する場合は、authorized_keysに直接viで開いて登録していましたが、こんなコマンドがあるみたいです。(知らなかった)

①接続元サーバ
[root@localhost .ssh]# ssh-copy-id root@192.168.3.11
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.3.11's password:　　　　　

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.3.11'"
and check to make sure that only the key(s) you wanted were added.

②接続先サーバでauthorized_keys確認
[root@localhost .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOvhwndvXeXQZxXdFi1h1sSLGcPmjw9UuC21JXwwFpeQ7pKAsFl8O2kQmX6xRLyKjMD7/HuHINerEfLgwiALZFtEUGzgzzcCoKUqms5/Oe8Enag1/IfXr/SN5ArR7xNnhLpDb3C/aQ95htPAy8OJrsoqR4U45j8/cIusNKODTWAhKb2k9liyze88s22D5CKlfyoFPaC4NyMwftMP1IogcRMnCARI911QgJdxES46ZpiZvLsOLytpRG+UNzDG+DUdEv9YYxryT/I0dv8sQ1EXr8xmMYxLte+XJyb8JboTmYJJiE4ZIKIm36WGkxrGnIM6ugWTTs6z3s/XXXXXXXXXXXXX root@localhost.localdomain
Gitでローカルリポジトリのmasterを削除し、origin/masterから再度masterを作成する


masterブランチに要らないコミットをしてしまったときの対処法などとして使えます。
※masterブランチが汚くなってしまったときの最終手段です。

master以外のブランチにcheckoutし、masterを削除。

```
git branch -D master
```

origin/masterが最新かどうかを確認する。

```
git log origin/master
```

最新でない場合はfetchする。

```
$ git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
From github.com:XXXXXXX/XXXXXXX
   04b9e144..19268083  master     -> origin/master

```

再度ローカルリポジトリのmasterを作成し、checkoutする。

```
$ git checkout -b master origin/master
Switched to a new branch 'master'
Branch master set up to track remote branch master from origin.
```
Ruby on Rails Active Record

##Active Recordとは？
Active Recordは、SQL文を記述することなくデータベースのデータを扱える
Ruby on Railsの機能です。
Railsは、この機能を記述だけでデータベースが扱えてしまうので、非常に便利なので一通り覚えてしまいましょう！
##メソッド一覧

* all
* find
* find_by


###all
テーブルの全てのレコードを検索する

```
user = User.all
```
###find
id等の主キーが一致するレコードを取得する

```
user = User.find(1)
```
###find_by

```
user = User.find_by(name: 'yamada')
```
###where
条件が一致する全てのレコードを取得する

```
User.where(name: 'yamada')
```
###order
取得したレコードを特定のカラムを基準に並べ換える

```
user = User.order('id DESC')
```
###delete_all
テーブルのすべてのデータを削除する

```
User.delete_all
```
EC2インスタンスのスケジュール起動がお手軽に実現できるようになっていた！

# 概要
EC2 インスタンスのスケジュール起動を設定するのに、改めて調査したらすごく簡単に実現できるようになっていたので設定方法を紹介します。
この方法は CloudWatch の設定だけなので **プログラム不要!!** 10分程度で設定可能です。

# やりたいこと
EC2 インスタンスを必要なとき以外は停止して料金を節約したい。

# 設定手順
## EC2 インスタンス停止
### CloudWatch ルール作成
1. CloudWatch の ルールを新規作成する。
2. スケジュールのCron式で停止時間を設定する。
3. ターゲットを追加し「EC2 StopInstances API 呼び出し」を選択する。
4. 停止したいEC2インスタンスのIDを設定する。
5. 複数のEC2を停止したい場合はターゲット追加を押して、3〜4を再度設定する。

画像の設定は毎日 PM 18:00 に停止する例です。
![スクリーンショット 2019-04-09 18.21.49.png](https://qiita-image-store.s3.amazonaws.com/0/132495/81dab761-7959-49f0-41de-b9cfc71ece5e.png)

## EC2 インスタンス起動
### CloudWatch ルール作成
1. CloudWatch の ルールを新規作成する。
2. スケジュールのCron式で起動時間を設定する。
3. ターゲットを追加し「SSM Automation」を選択する。
4. Documentで「AWS-StartEC2Instance」を選択する。
5. 定数のInstanceIdに起動したいEC2インスタンスのIDを設定する。
6. 複数のEC2を起動したい場合はターゲット追加を押して、3〜5を再度設定する。

画像の設定は月〜金の AM 9:00 に起動する例です。
![スクリーンショット 2019-04-09 18.20.24.png](https://qiita-image-store.s3.amazonaws.com/0/132495/20c8646b-4d28-2e17-5ade-b97515a4a40c.png)


# まとめ
一度こちらの手順で CloudWatch ルールを作成しておけば、あとは停止・再開したいインスタンスを追加するだけで良いので便利!
皆さんもどんどん節約しましょう。
Windows10でPython3.7.2とPyInstaller3.4でExe作るとTypeError: expected str, bytes or os.PathLike object, not NoneType

# Pyinstallerでexe化するとエラーが・・・

[この記事](https://qiita.com/zeropfac/items/0e258549851c72e7ec90)でバイナリ検索とリスト出力処理を作成したのですが、
同僚への配布用にWindowsのExe化をしましたが・・・

**TypeError: expected str, bytes or os.PathLike object, not NoneType** が発生してexeが作成できていませんでした。

# 環境
Windows 10 Pro
Python 3.7.2
PyInstaller 3.4

# TypeErrorが発生した際のexe化までの手順
1.python -m venv venv で仮想環境を作成した。
2.```.\venv\script\activate.bat``` で仮想環境へ切替した。
3.pip install PyInstaller
4.[この記事](https://qiita.com/zeropfac/items/0e258549851c72e7ec90) のソースを書いた。
5.```pyinstaller SearchLCovd.py --onefile```　でexe化できると信じて実行した。
<font color="Red">TypeError: expected str, bytes or os.PathLike object, not NoneType</font> が発生！！

# 解決にたどり着いた

いろいろ備忘録日記さんの[Pythonメモ-97 (python 3.7 + pyinstaller 3.4 + venv で TypeError が出る件)(expected str, bytes or os.PathLike object, not NoneType)](https://devlights.hatenablog.com/entry/2019/03/20/131234) で解決にいたりました。

# どうするのか？
詳しくは[こちらに情報](https://devlights.hatenablog.com/entry/2019/03/20/131234)をご覧いただきたいのですが・・・

1.自分の環境の Lib/PyInstaller/depend/bindepend.py　（私の場合はvenvしていたので、```venv\Lib\site-packages\PyInstaller\depend\bindepend.py```）をテキストエディタで開く
2.紹介されているgithub.comの[pyinstallerプルリク](https://github.com/pyinstaller/pyinstaller/pull/3956)ソース変更内容を「1.」で開いたソースファイルへ追記する。
3.テキストエディタを上書き保存して、閉じる。
4.改めて```pyinstaller SearchLCovd.py --onefile```　でexe化できると信じて実行しました。
<font color="Red">今度はExeが出来上がりました。</font>


・・・英語が読めれば、すんなり検索できたり、解決できたりするんでしょうね・・・
コンソールアプリを.NET Framework 4.5とNETCore2.1に両対応させつつ、GlobalTool化する方法

コンソールアプリを.NET Framework 4.5とNETCore2.1に両対応させて、NETCore2.1のほうをGlobalToolパッケージ化しました。

プロジェクトファイル（*.csproj）を

```xml:projectname.csproj
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<!-- 通常の設定、すべての対応フレームワークを書く -->
<PropertyGroup Condition="'$(GlobalTool)' != true">
  <TargetFrameworks>netcoreapp2.1;net45</TargetFrameworks>
</PropertyGroup>
<!-- グローバルツール向けの設定、.NETCore2.1以降のみを書く -->
<PropertyGroup Condition="'$(GlobalTool)' == true">
  <PackAsTool>true</PackAsTool>
  <TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>

<PropertyGroup>
    <OutputType>Exe</OutputType> <!-- ここ重要。これがないと.NETCoreは実行できない -->
</PropertyGroup>

</Project>
```

こうするとうまくいきます。
ビルド後イベントに`dotnet pack /p:GlobalTool=true -c Release`を入れてみると失敗します。
ビルドしてから、`dotnet pack /p:GlobalTool=true -c Release`を実行すると、無事GlobalToolができます。

この対応をしたプロジェクトがこちら
https://github.com/reniris/UI_Generator/tree/ekUIGenMod
そのうち本家にプルリクエスト投げる予定

サンプルプロジェクトを追加しました（2019/4/13）
https://github.com/reniris/GlobalToolSample

参考にしたサイト
[.NET Core Global Tools Configuration](https://johan-v-r.github.io/2018/09/05/NET-Core-Global-Tools-Configuration/)