OmniAICreator/Qiita-1.07M huggingface dataset:
なぜブロックチェーンが革新的なのか

## これは何
社内LT大会で話すスライドです。
せっかくなのでQiita記事としても公開しておこうと思います。

## スライド

<script async class="speakerdeck-embed" data-id="366a6492ff7340bea66b4cc1138976cd" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>



# 資料の要約


## お金とは何か
- 取引の種類
    - 物々交換→もらった対価を別の対価で支払う
    - 現金取引→お金を仲介して対価の交換をする
    - 信用取引→あとで「対価をもらえる」ことを信じて取引を行う
- お金とは「取引」をするための手段の一個
    - 物の価値をお金の単位で表現できる
    - 物が持つ価値をお金と交換できる→交換したお金は同じ価値を持つ物と交換できる
    - お金は貯蓄ができる→賞味期限とかない

## 通貨や決済システムにはほぼ全てのものに管理者がいる
- お金は国によって管理されている
- クレジットカードも運営会社がある
- 電子決済もサービス提供者を信用して使うもの
- →管理者が信頼できないとお金の役割を果たさなくなるリスクがある

### 仮想通貨は「管理者のいない通貨」を実現したシステム
- 現金としての取引をシステムだけで実現する


## 重要→日本人は仮想通貨の凄さが理解しにくい
- 日本人が理解しにくい理由→お金も電子決済サービスも「信用」できるから

## 仮想通貨の普及してる国ランキング
1. ウクライナ
2. ロシア
3. ベネズエラ
4. 中国
5. ケニア

## 仮想通貨のコンセプト→誰にも管理されない
- 管理者がいない→管理者によって取引を操作されない
    - 取引を改竄される、取り消しされるとか
    - 誰かが恣意的にお金の価値を操作したりもできない
- サービス終了や障害などの影響を受けない
    - 障害起こって取引がうまくできなかった、とかが起こらない
    - 取引した事実は（仮想通貨を使う人がいる限り）未来永劫残り続ける
- システムさえ信用できれば、誰も信用しなくて良い

## 仮想通貨を作るときに考えないといけないこと
- 管理者がいない時に考えないといけないこと→どうやって取引が正しいことを証明する？
- 管理者がいる場合→管理者が取引の保存とチェックを行えばいい。いない場合は？


## ブロックチェーンがどう仮想通貨を実現するか
- 管理者がいない=逆にいうと全員が管理者になれば良い→P2Pと分散台帳
- P2P→参加者同士が直接通信をして取引を行う
    - 管理サーバーとかがない
- 分散台帳→全員が全く同じ全員の取引履歴を管理する
    - みんなが持っていれば嘘もつけない
    - データも（ほぼ）なくなることはない
- これによって「信用できるシステム」を作り上げ

## 分散台帳の作り方
- ブロックチェーンはこの分散台帳を色々なテクニックで実現する
    - コンセンサスアルゴリズム
    - ハッシュ関数
- やっていることのイメージはこんな感じ
    - 個々人で取引が正しいことをチェックできる証明書を作る
    - 証明書は今までの取引履歴全てのデータを用いて作る
    - 証明書の作成にコストがかかるようにして、0から履歴を作りなすのをほぼ不可能にする

## 仮想通貨の未来について
- 仮想通貨の裏テーマ→世界の通貨の一本化
- どこに住んでいても誰とでも取引ができる
- 全人類が同じ仮想通貨を使えば「為替」なんてものもなくなる
- その未来は本当にくる？→多分こない
- 実は通貨の一本化実験はすでにやられている→EU。そしてギリシャ危機


## ギリシャ危機
- 一般的な国であれば、金融危機になった時に金融政策ができる
    - 流通する貨幣の量を増減
- 通貨が国に管理されなくなると金融政策ができなくなる
    - ギリシャがこの影響をモロに受けた
- 通貨が管理されないのは逆にリスクもある

## 仮想通貨から仮想物々交換へ
- 現在のブロックチェーン界隈の話題は「スマートコントラクト」
- ブロックチェーン上に契約自体を保存する
    - 契約書
    - 証明書
    - 権利書
- これはもはや対価の物々交換
    - 通貨でも物々交換でも自由に取引が行える未来が来ている

## まとめ
- 仮想通貨は「本来の意味の通貨」を作るもの
- ブロックチェーンは仮想通貨のコンセプトを実現するための技術
- 仮想通貨のメリットデメリットを理解して使いましょう
- ブロックチェーンってすごいわ！


## 参考文献
- https://www.ide.go.jp/Japanese/IDEsquare/Column/ISQ000011/ISQ000011_007.html
- https://coinpost.jp/?p=181383
laravel８に画像をアップロードするやり方②

#前回の概要
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/71964b00-2278-b5e0-c44b-8bea19cff3d0.png)
#今回行いたいこと
* 画像をデータベースに保存する

#データベースに保存する
Controller フォルダ内にある UserController.php 内の内容を変更する。今回は、Eloquentメソッドの fill を使ってデータベースに保存しました。

```UserController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Image;


class UserController extends Controller
{

    public function edit2(Request $request)
    {
        return view('edit');
    }
    

    public function update(Request $request)
    {   
        // 画像のアップロード
        $path = $request->file('image')->store('public/avatar');
        $image_path = basename($path);
        
        // // DBにアップロードする
        $image_path2 = new Image();
        $image_path2->fill([
            'user_id'=>1,
            'image_name'=>'',	
            'image_path'=>$image_path,
            ]);
        $array_2=(array)$image_path2;
        $image_path2->fill($array_2)->save();    


        return redirect("/users/edit")->with("message", "アップロードに成功しました。");
        // $image_path2->image_pass = $image_path;
        // $image_path2->save();
    }
}
```
```UserController.php
$array_2=(array)$image_path2;
$image_path2->fill($array_2)->save();    
```
上のコードの一行目で、 image_path2 を型変換して配列に変えています。その後、fill に入れています。

ちなみに今回のテーブルの構成は下のようになっています。

```Image.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    // use SoftDeletes;
    protected $dates = ['created_at', 'updated_at', 'deleted_at'];
    protected $fillable = [
        'user_id',
        'image_name',
        'image_path',
    ];
    public function user()
    {
        return $this->belongsTo(user::class);
    }
}
```
#今回のまとめ
![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/746b0211-cad0-7d7f-4c29-4620df1fccd7.png)
#次回に向けて
まだシンプルな中身なので、次はコメント履歴とコメントを作成したいと思います。
もしよろしければ、フォローお願いします！！！！！
【Chrome】Seleniumでページ全体のスクリーンショットを撮る

[Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/)というものがあることを知り、Seleniumからも利用できるようなので、試してみました。

せっかくなのでページ全体のスクリーンショットを取得してみます。
ページ全体のスクリーンショットは、[こちらの記事](https://qiita.com/memakura/items/20a02161fa7e18d8a693#%E3%83%9A%E3%83%BC%E3%82%B8%E5%85%A8%E4%BD%93%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88)で紹介されている方法で取得できますが、これをChrome DevTools Protocolを使って実現してみます。

```python:cdp_screenshot.py
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import base64

def take_full_screenshot(driver, file_path):
    width = driver.execute_script("return document.body.scrollWidth;")
    height = driver.execute_script("return document.body.scrollHeight;")
    viewport = {
        "x": 0, 
        "y": 0,
        "width": width,
        "height": height,
        "scale": 1
    }
    # Chrome Devtools Protocolコマンドを実行し、取得できるBase64形式の画像データをデコードしてファイルに保存
    image_base64 = driver.execute_cdp_cmd("Page.captureScreenshot", {"clip": viewport, "captureBeyondViewport": True})
    image = base64.b64decode(image_base64["data"])
    with open(file_path, 'bw') as f:
        f.write(image)

# Webdriver ManagerでChromeDriverを取得
driver = webdriver.Chrome(ChromeDriverManager().install())

driver.get('https://qiita.com/')
take_full_screenshot(driver, 'screenshot.png')

driver.close()
driver.quit()
```

- [Page.captureScreenshot](https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-captureScreenshot)を使うことでスクリーンショットが撮れるようです。
- `clip`パラメータにページ全体のサイズを渡しただけでは、見えている範囲のみしか取得できなかったため、`captureBeyondViewport`というパラメータを`True`に設定しました。
  - `captureBeyondViewport`は、実験的なパラメータのようなので、今後利用できなくなる可能性はあります。
  - とりあえず、手元のMacのChrome 90.0.4430 では動作しました。

# 参考
- [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/)
- [execute_cdp_cmd | Selenium Python Bindings 2 documentation](https://selenium-python.readthedocs.io/api.html#selenium.webdriver.chrome.webdriver.WebDriver.execute_cdp_cmd)
- [Selenium Webdriver + Chrome DevTools Protocolを使って情報を取得してみる | Qiita](https://qiita.com/oh_rusty_nail/items/8a182926f3b177cd45c4)
競技プログラムで最後の行の要素だけスペースを空けない方法

AtCoderやpaiza様などの競技プログラムで最後の行（2次元配列の行の要素の一番最後など）をスペースで空けない方法をpaiza様の2重ループ特訓の問題集で練習したプログラム例を掲載いたします。
（私は競技プログラミングは主にC++のプログラム言語を使っています)

```C++
#include <iostream>

using namespace std;
int main(void){
    // 自分の得意な言語で
    // Let's チャレンジ！！
    int M,N;
    cin >> M >> N;
    int a[M][N];
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            cin >> a[i][j];
        }
    }
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            if (j == N-1){
                cout << a[i][j] << endl;
            } else {
                cout << a[i][j] << " ";
            }
        }
    }
}
```
【初心者でもわかる】iphoneでtransparentを指定したグラデーションが黒っぽくなってしまう原因と対策方法

#どうも7noteです。iphone特有の仕様（不具合）で、グラデーションが黒くなってしまう原因と対策方法を解説

iphoneで以下のようなグラデーションを指定します。

```style.css
div {
  background-image: linear-gradient(transparent, #FFF);
}
```

通常は白っぽいグラデーションになるはずです。
しかしiphoneなどのios端末で見ると、なぜか黒っぽいグラデーションになってしまいます。

## グラデーションが黒っぽくなる原因

iphoneなどのios端末では**`transparent` = `rgba(0,0,0,0)`**と認識されてしまうようです。

そのため**「透明の黒 → 白」へのグラデーションになってしまい黒っぽさがでてしまう**ようです。


## 解決

**解決方法は簡単で、`transparent`を使わなければいいのです。**

つまり、`transparent`を`rgba`に書き換えてしまいましょう。

```style.css
/* ダメな例 */
div {
  background-image: linear-gradient(transparent, #FFF);
}

/* 良い例 */
div {
  background-image: linear-gradient(rgba(255,255,255,0), #FFF);
}
```

上のソースでは透明→白のグラデーションを作成したいので、もともと`transparent`を指定していた箇所をrgbaで書き直しました。

rgbで白を再現する場合は`rgb(255,255,255)`になるので、これに透明度のaを足して**`rgba(255,255,255,0)`と書くことで白いグラデーションをiphoneでも黒っぽくならずに済みます。**


## まとめ

ios端末では**`transparent` = `rgba(0,0,0,0)`**と認識されてしまう。
なので`transparent`は使わずグラデーションにしたい色の`rgba()`に書き直して使う！

たとえば赤いグラデーションなら`transparent`の代わりに、`rgba(255,0,0,0)`を指定しましょう。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【AWS】MySQLサーバーの設定で使うコマンド

#プログラミング勉強日記
2021年5月20日
MySQLを設定するときにコマンドを使うので、そのコマンドを備忘録としてまとめる。

#MySQLサーバーの設定
　MySQL8.0版のリポジトリをローカルに保存してインストールの準備をするコマンド。ローカルインストールというコマンドでリポジトリのローカルにファイルをダウンロードする。

```:URL先からMySQLのファイルをダウンロードする
yum localinstall https //dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
```

```:MySQLのコミュニティエディションをインストールする
yum install mysql-community-server -y
```

```:MySQLサーバーを起動する
systemctl start mysqld
```

```:インスタンスを起動・MySQLサーバーを自動的に起動するように設定
systemctl enable mysqld
```

#MySQLサーバーのデータベースの作成
　設定ができれば実際にMySQLのデータベースを作成する必要がある。まずは、インストールしたMySQLにアクセスするためのパスワードとユーザ名が必要になる。(ルートユーザで入れる)

```:MySQLのローカルホストからログインするときの初期パスワードを取得する
cat/var/log/mysqld.log | grep localhost
```

```:ルートユーザを指定してパスワードを入力してログインする
mysql -u root -p
```

　MySQLのコマンド(`ALTER USER`)を使ってローカルホストに居るルートユーザの変更を行う。(これ以降はすべてMySQLのコマンドなので最後にセミコロンを忘れないよう注意する。)

```:パスワードを変更する
ALTER USER root@localhost IDENTIFID BY 'パスワード';
```

```:MySQLサーバー内にデータベースを作成
create database データベースの名前;
```

```:作成したデータベースの確認
show  databases;
```
VSCodeのIntellisenseのSuggestionで表示された候補が、括弧 '(' やカンマ ',' やスペースでオートコンプリートされるのを防ぐ

# 概要

VSCodeのコーディングをしていると、Intellisenseがいい感じのSuggestionsを出してくれる。
それは素晴らしい機能なのだが、新しい関数を書いている時のような、
Suggestionsからオートコンプリートをされたくない場合がある。
しかし、関数名を書き終えて括弧 '(' やカンマ ',' やスペースを入力すると、関数名がオートコンプリートで上書きされてしまう。
それをさせないための方法について記載する。

# 結論
VSCodeのSettings.jsonに下記を追加する。

```json
"editor.acceptSuggestionOnCommitCharacter": false
```

もしくは設定から、下記のチェックボックスをオフにする。
![スクリーンショット 2021-05-20 19.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322546/b70f7658-1984-3ce0-f1d1-fb04805b4dd5.png)

どちらかで良い。

## 具体例

```javascript
//入力したいのは test()
test //まで入力したタイミングで、suggestionsの最上部に、TestSchedulerのような、ライブラリのクラスが表示されている。
```

この状態で、 括弧'('を入力すると、TestSchedulerでオートコンプリートされてしまう。

```javascript
// test(と入力した瞬間、下記の値でオートコンプリートされる。
TestScheduler
```

# 最後に
2時間ほど調べてもヒットしなかったためStackOverFlowで質問したところ、すぐに回答をもらえた。
日本語での情報がなかなか見つからなかったので、誰かの助けになれば。
JavaScriptライブラリ・CSSフレームワークを調べてみる

自分メモです('ω')

まだCodePenでお試しWebアプリを触り始めたレベルですが、どうも世のなかには便利なJSライブラリ・CSSフレームワークが沢山あるらしい（JSに限らずですが）ということで、参考記事をストックしていきます。（随時更新予定）

##勉強になりそうな記事

https://qiita.com/hatai/items/5bf899bfe8f5d86d2096

↑ 何だか用途・種類別に書かれていて、これを読んでいくだけでも十分用語の勉強になりそう。

https://qiita.com/rana_kualu/items/e8a0f8f5589ff082539d

↑ こういう記事も、トレンドとか見れて良さそうですね。

https://paiza.hatenablog.com/entry/2018/12/26/%E5%80%8B%E4%BA%BA%E3%81%A7Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%AA%E9%AB%98%E6%A9%9F%E8%83%BDJavaScript%E3%83%A9%E3%82%A4

↑ こちらは、少し古い記事ですが、画面イメージやコードサンプルなど少しでも載っているだけで、全然違いますね。こんな感じで私に優しいページをどんどん探していかないと。

https://qiita.com/aiandrox/items/4196c8f5b564d29fdce7

↑ こちらはCSSフレームワークに始まり、カラーパレットツールやアイコン・フォントまで、UI周りの良さげな情報が盛りだくさん！

https://getbootstrap.jp/docs/5.0/getting-started/introduction/

↑ 人気のBootstrap使い始めました。日本語の公式ドキュメントも充実していて、すごく助かります。

https://saruwakakun.com/html-css/basic/linear-radial-gradient

↑ CSSグラデーションの使い方まとめページ。

##気になった・使ってみたいライブラリ

- [lightgallery.js (https://sachinchoolur.github.io/lightgallery.js/)](https://sachinchoolur.github.io/lightgallery.js/)

> ギャラリー系のJavaScriptライブラリはたくさんあるなかで、必要な機能が全部入りで拡張性も高い優秀なライブラリが「Lightgallery.js」です。複数の画像を分かりやすいUIで閲覧できる機能を提供してくれて、PC・スマホでも利用できるレスポンシブ対応のデザインでタッチ操作もサポートされています。

ギャラリーに何かの素材にしたい写真候補やアイデアの候補を並べて、投票できるようにするとか。
DTGradientButtonライブラリを使ってみた

DTGradientButtonを使ってボタンをアレンジしてみました

#環境
・Mac Book Pro(macOS:BigSur)
・Xcode(ver:12.5)

#実装例
![スクリーンショット 2021-05-20 19.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864623/7f7af711-482a-5e6d-e1f5-62ed4183ad02.png)

#コード例
```ruby:ViewController.swift
class ViewController: UIViewController {

    @IBOutlet weak var gradientButton1: UIButton!
    @IBOutlet weak var gradientButton2: UIButton!
    @IBOutlet weak var gradientButton3: UIButton!
    @IBOutlet weak var gradientButton4: UIButton!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        let colors1 = [UIColor(named:"Color1")!, UIColor(named: "Color2")!]
        let colors2 = [UIColor(named:"Color3")!, UIColor(named: "Color4")!]
        let colors3 = [UIColor(named:"Color5")!, UIColor(named: "Color6")!]
        let colors4 = [UIColor(named:"Color7")!, UIColor(named: "Color8")!]
        
        gradientButton1.setGradientBackgroundColors(colors1, direction: .toTop, for: .normal)
        gradientButton1.layer.cornerRadius = 10.0
        gradientButton1.layer.masksToBounds = true
        
        gradientButton2.setGradientBackgroundColors(colors2, direction: .toBottom, for: .normal)
        gradientButton2.layer.cornerRadius = 10.0
        gradientButton2.layer.masksToBounds = true
        
        gradientButton3.setGradientBackgroundColors(colors3, direction: .toBottomLeft, for: .normal)
        gradientButton3.layer.cornerRadius = 10.0
        gradientButton3.layer.masksToBounds = true
        
        gradientButton4.setGradientBackgroundColors(colors4, direction: .toBottomRight, for: .normal)
        gradientButton4.layer.cornerRadius = 10.0
        gradientButton4.layer.masksToBounds = true   
    }
}

```
連想配列のkeyとvalue、更にkey同士を繋げてStringで出力する

最近はVue.jsをやっていますが、連想配列の扱いで毎回躓くので備忘録を込めての投稿です。
今回はペアのkeyとvalueは"="で、他のkey同士は"&"でつないでみます。
# How to

```javascript
const URL_QUERIES = {'title': 0, 'byline': 1}
const queries = Object.keys(URL_QUERIES).map(key => [key, URL_QUERIES[key]].join('=')).join('&')

console.log(queries)
// 出力：title=0&byline=1
```
### 05/20追記
上記の様なURLのオプションで扱う場合はURLSearchParamsという便利なものがあるそうです。
共有ありがとうございますm(_ _)m

```javascript
const queries = new URLSearchParams({'title': 0, 'byline': 1}).toString()

console.log(queries) // title=0&byline=1
```

# どういう時に使うか
例で示した通りですが、vimeoなどの動画投稿サイトでは、シェアする際にタイトル表示しなかったり、ボタン表示しなかったりとオプションがあるのですが、
それをURL内で記述する必要があります。なので、URLの連想配列にこのQueriesを保持しておけばオプションを選択・統一することができます。

何事も一発で書けると気持ちが良いですね。

# 参考
- [Joining javascript key-value objects as string.](https://gist.github.com/lucasdavila/4331999)
Markdown（マークダウン）まとめ

これからQiitaに投稿をしていく方々の参考になればと思い、Markdownについてまとめていきます。


#●Markdown（マークダウン）とは
Markdown(マークダウン)とは、「# 見出し」「* リスト」など、シンプルな書き方で文書構造を明示でき、装飾されたHTML文書に変換できる軽量マークアップ言語のこと。



#■見出し
##●書き方
```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```

##●表示結果

# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6


#■文字の装飾
##●書き方
```
**太字**
*斜体（Italic）*
<font color="Red">赤字</font>
~~打消し~~
```

##●表示結果
**太字**
*斜体（Italic）*
<font color="Red">赤字</font>
~~打消し~~

#■リスト表示
##●書き方
```
- 箇条書きリスト
    - ネスト 箇条書きリスト
        - ネスト 箇条書きリスト
        - ネスト 箇条書きリスト
- 箇条書きリスト
- 箇条書きリスト


1. 番号付きリスト
    1. 番号付きリスト
1. 番号付きリスト
    1. 番号付きリスト
    1. 番号付きリスト
```

##●表示結果
- 箇条書きリスト
    - ネスト 箇条書きリスト
        - ネスト 箇条書きリスト
        - ネスト 箇条書きリスト
- 箇条書きリスト
- 箇条書きリスト

1. 番号付きリスト
    1. 番号付きリスト
1. 番号付きリスト
    1. 番号付きリスト
    1. 番号付きリスト



#■リンク挿入
##●書き方例
```
[タイトル](URL)
[Qiita](https://qiita.com/tags/qiita)
```

##●表示結果

[Qiita](https://qiita.com/tags/qiita)


#■引用
##●書き方例
```
> あいうえお
>> あいうえお
```

##●表示結果

> あいうえお
>> あいうえお


#■テーブルの挿入（基本）
##●書き方例
3x3　←「テーブル挿入」クリック

または

```
|項目1|項目2|項目3|
|:-:|:-:|:-:|
|1|2|3|
```

##●表示結果
| 1 | 2 | 3 |
|:-:|:-:|:-:|
|   |   |   |
|   |   |   |
|   |   |   |


|項目1|項目2|項目3|
|:-:|:-:|:-:|
|1|2|3|


#■テーブルの挿入（表示寄せ）
##●書き方例
```
|左寄せ|中央寄せ|右寄せ|
|:-|:-:|-:|
|1|2|3|
```
##●表示結果
|左寄せ|中央寄せ|右寄せ|
|:-|:-:|-:|
|1|2|3|
IntelliJ初心者のメモ(mac利用)

ずっとWindows+EclipseでJava開発してきたのですが、
mac+IntelliJで開発する機会があったので覚書としてメモします。※初歩的な内容多め

※公式がIntelliJとEclipseとの比較ページを作っているので、
Eclipseユーザだった人は一読をオススメします。
https://pleiades.io/help/idea/migrating-from-eclipse-to-intellij-idea.html

# 前提
- macOS Catalina
- IntelliJ IDEA 2021.1 Ultimate Edition
- 開発言語:Java
- ビルド:Gradle

# 1. 初回セットアップ時にやっておくと良さそうなこと
## 英語から日本語へ変更
日本語プラグインを入れれば日本語になる。まずはこれを入れる
https://pleiades.io/pages/pleiades_jetbrains_manual.html
> 1. Welcome 画面または Settings/Preferences から Plugins を開く
> 2. Marketplace の検索で "japan" と入力
> 3. Japanese Language Pack の Install ボタンクリック
> 4. Restart IDE ボタンをクリックして再起動

## コンパイルエラーを自動検知
Eclipseだとデフォルトでついているけど、IntelliJでは設定が必要。

1. `⌘,` あるいはメニューバーのIntelliJ IDEA→Preferences...
2. コンパイラー→自動的にプロジェクトをビルドする→OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702192/d8e34d40-603f-0cb3-6064-a6392d99856b.png)

3. 表示→ツールウィンドウ→問題 を押下 or `⌘6`にてプロジェクトエラータブ表示。コンパイルエラー内容が表示される。

参考
https://www.it-swarm-ja.com/ja/java/intellij%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F/1041509977/

# 2. 開発時に知っておくと楽になりそうなこと

## ショートカットキー一覧
https://pleiades.io/help/idea/mastering-keyboard-shortcuts.html#advanced-features

※IntelliJ公式からリンクのあるqiita
https://qiita.com/cypher256/items/8ce0527a46bd7cfe43eb

## 表示しているクラス内のメソッド確認（一覧）
`⌘7`
https://pleiades.io/help/idea/viewing-structure-of-a-source-file.html

## パッケージ形式で表示したい
1. プロジェクトタブ右側の歯車押下
2. 「パッケージのフラット表示」にチェック  
![画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702192/735f4e3e-d290-0760-e4cc-aafbdbad8226.png)

※ここで色々と表示制御できるので見てみるのをお勧めします。「メンバーの表示」を押すと、クラスに紐づくメンバーが見えるようになったり


## 利用されているクラス・メソッドの中身を確認したい
`⌘`押下+クラス・メソッドをクリック。※パス通さないと飛べない

## 矩形選択
Option+ドラッグ
https://qiita.com/_Hammer0724/items/0f93a0fd8ecb6b771c34

矩形選択してペーストしたり、中身の書き換えもできるので便利。
Smarty テンプレートの中で変数定義

###記事はこちらに移動しました。

https://murakamiaya.com/rastaya/%e3%80%90smarty%e3%80%91%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e3%81%ae%e4%b8%ad%e3%81%a7%e5%a4%89%e6%95%b0%e5%ae%9a%e7%be%a9%e3%80%90php%e3%80%91/
IBM Security Verify API で CSVを使用したユーザー登録を行う

# はじめに
IBM Security Verify(ISV) APIを利用して、CSVからユーザー登録を行う方法についてご紹介します。

# APIのリファレンス
APIのリファレンスは、以下のURLから確認できます。
https://<自分のテナント名＞.verify.ibm.com/developer/explorer/#

# 1.事前準備について
APIクライアントの準備や、アクセストークンの発行は、「IBM Security Verify API で ユーザーのアカウントを無効化する」と同じです。以下をご参照ください。
https://qiita.com/fitz/items/7874a95245eea3ecef13

# 2.CSVの準備

CSVには1行目に属性値を記載し、2行目から登録するデータを指定します。
登録したい属性値にあわせて1行目を変更します。

```user.csv
preferred_username,given_name,family_name,email,work_number
testuser01,uesr01,test,mail@address,"+81-80-xxxx-xxxx"
testuser02,uesr02,test,mail@address,"+81-80-xxxx-xxxx"
```
![csv (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/ca41d86f-4f8b-d7cf-8bd0-ffdd79878126.png)



# 3.CSVによるユーザー登録

CSVのインポートは、/v2.0/CSV/importUsers を利用します。
![csv (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/0447df55-5490-4a81-ee45-a25736b99c13.png)


実行するリクエストは以下のような形になります。

```
curl -i -X POST https://<テナント名＞.verify.ibm.com/v2.0/CSV/importUsers  -H "Content-Type: multipart/form-data;charset=UTF-8" -H "Authorization: Bearer <アクセストークン>" -F file=@<CSVのファイルパス＞
```

![csv (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/4c993223-2de0-a0e5-6655-fd367537bd57.png)

戻り値としてrequest IDが返ってきます。
![csv (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/b70c6881-b085-ca12-4fe6-431bba2fa824.png)


# 4.処理結果の確認
CSVの処理結果は、/v2.0/CSV/jobs で確認できます。

```
curl -X GET https://<テナント名＞.verify.ibm.com/v2.0/CSV/jobs/<request ID> -H "Authorization: Bearer <アクセストークン>"
```

![csv (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/a01a1072-35c4-e7da-37f8-5faff475bfff.png)

# 最後に
IBM Security VerifyのAPIを利用してCSVからユーザーを一括登録する方法についてについてご紹介しました。
DockerでいままでインストールできたElyraがこけるので環境を見直してみた

# はじめに

Dockerのbuildでインストールしていたライブラリがいきなり失敗することは時々おきます。
本来ならしっかりとバージョンを指定して、いつでも同じ環境にする必要があります。
しかし、私が今回触っていた環境では`Elyra`がバージョン指定されておらず、インストールができなくなってしまったので、解決方法をまとめます。

# 環境
- windows
- Docker
- Python3

Elyraの環境は[この記事](https://zenn.dev/amazyra/articles/a9d01b7dd91d1bb3604c)を参考に作成されています。


# 問題

`Dockerfile`の以下の部分で以前は動いていたのですが、エラーが起きました。

```
# install elyra
RUN conda install -c conda-forge elyra
RUN jupyter lab build --dev-build=False --minimize=False
```

エラーは以下の通りです。

```
 > [ 4/21] RUN conda install -c conda-forge elyra:
#7 2.620 Collecting package metadata (current_repodata.json): ...working... done
#7 17.16 Solving environment: ...working... failed with initial frozen solve. Retrying with flexible solve.
#7 164.5 Solving environment: ...working... failed with repodata from current_repodata.json, will retry with next repodata source.
#7 293.4 Collecting package metadata (repodata.json): ...working... done
#7 337.2 Solving environment: ...working... failed with initial frozen solve. Retrying with flexible solve.

#7 1554.1 Found conflicts! Looking for incompatible packages.
#7 1554.1 This can take several minutes.  Press CTRL-C to abort.
#7 1554.1 failed
#7 1554.1
#7 1554.1 UnsatisfiableError: The following specifications were found to be incompatible with each other:
#7 1554.1
#7 1554.1 Output in format: Requested package -> Available versions
#7 1554.1
------

```

Conda環境の中で何かがコンフリクトを起こしているようでした。
こちらについて調べてのですが、よくわからず。別の方法で対処することにしました。

# 解決方法

## 1. 以前のバージョンを調べて指定する

以前利用していたElyraのバージョンを調べたところ`1.5.3`でした。

ですので、以下のように指定することでインストールができました。

```
# install elyra
RUN conda install -c conda-forge elyra=1.5.3
RUN jupyter lab build --dev-build=False --minimize=False
```

しかし、別の同じような環境では同じエラーを起こしたり、1.5.3は`JupyterLab`の3系(Python3)に対応していないこともあり、パイプライン上で`.ipynb`を利用することができませんでした。

https://qiita.com/Sicut_study/items/f0cdaee36581dd99aaca

以前にそちらについて述べた記事を上げています。

ですので、別の方法も試してみました。

## 2. そもそも`Conda`でなく`pip`でインストールできないか試してみる

`datascience-notebook`が`conda`でライブラリ管理されてるとのことで、`Conda`を利用してインストールされていましたが、Pythonのライブラリをインストールする際に`RUN pip3 install ○○`としていたため、`pip`でインストールできるのでは？と思い試しました。

`pip`でのインストールであれば、JupyterLabの3系に対応した最新版を入れることができます。

```
## install elyra
RUN pip3 install --upgrade elyra==2.2.4
RUN jupyter lab build --dev-build=False --minimize=False
```

無事できました。また、最新版をいれているため3系に対応しています。
ですので、パイプラインで`.ipynb`を動かすこともできました。

そして、自動でコードチェックが走るため`flake8`をわざわざJupyterのために入れる必要もありません。

結果として以前よりも使いやすい環境になりました。

# さいごに
そもそもライブラリのバージョンを指定していれば起きていなかったので、改めて重要だなと感じました。

Elyrahはまだまだわからないことが多く、どのようにすればターミナルに標準出力できるのか。などドキュメントが英語しかない分調査できていないです。

今後もっと注目されたら嬉しいなと思っております。


# 参考文献

https://zenn.dev/amazyra/articles/a9d01b7dd91d1bb3604c

https://qiita.com/Sicut_study/items/f0cdaee36581dd99aaca
phpMyAdminのエラーコード#1067を解消する方法

## 発生しているエラー
既存のテーブルにカラムを挿入しようとしたら、次のエラーが発生した。
![スクリーンショット 2021-05-20 113740.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/f716f2a1-ce70-18df-13c8-60ba768a9720.jpeg)

## エラーが発生している原因
SQLモードの **`NO_ZERO_DATE`** が有効になっている事。
`NO_ZERO_DATE`が有効になっていると、サーバーが`0000-00-00`を有効な日付として挿入を許可する。
ただ、他のカラムで更新日などを管理している場合、新規挿入するカラムの更新日として挿入される`0000-00-00`と更新日を管理するカラムのデフォルト値などが競合してしまうため、`phpMyAdmin`がエラーとして警告を出している。
(自分はこう認識したが、正しいかどうかは自信がない…)

## エラー解消法
自分は`XAMPP`から`MySQL`や`phpMyAdmin`を利用しているため、その環境での解消法を記す。

 1. `XAMPP`のコントロールパネルから`MySQL`の`config`ボタンを押し、`my.ini`を開く。
 2. `my.ini`の中に`sql_mode=~`という文字列があるため、その中にある`NO_ZERO_DATE`を削除する。

    ```my.ini
    ## UTF 8 Settings
    #init-connect=\'SET NAMES utf8\'
    #collation_server=utf8_unicode_ci
    #character_set_server=utf8
    #skip-character-set-client-handshake
    #character_sets-dir="C:/xampp/mysql/share/charsets"
    sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION
    log_bin_trust_function_creators=1
    ```

 3. `XAMPP`のコントロールパネルから`MySQL`を再起動。
 4. 追加したかったカラムを挿入できるか確認。

## 参考資料
- [mysql - Can't create table on phpmyadmin #1067 error - Stack Overflow](https://stackoverflow.com/questions/42712336/cant-create-table-on-phpmyadmin-1067-error) 
- [MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date) 
- [MySQL｜SQLモードの確認と変更 - わくわくBank](https://www.wakuwakubank.com/posts/414-mysql-sqlmode/)
VercelでFirestore + Next.js のアプリをデプロイしたら Error: Metadata string value "projects/

この記事を参考にして Firestore x Next.js アプリをVercelにデプロイ

https://qiita.com/centerfield77/items/49b029d4d1618dfeedb6

Vercelに環境変数設定してデプロイすると以下のエラー

```
(node:469) UnhandledPromiseRejectionWarning: Error: Metadata string value "projects/[project_id]
...
contains illegal characters
```

##原因

FIREBASE_PROJECT_ID にスペースと改行が入ってた。
![スクリーンショット 2021-05-20 18.17.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242610/914bef05-c97f-7711-1191-b407f7d55a4c.png)

##その他

Promiseをcatch()でhandleしてない云々とも怒られたが、原因は環境変数だけだった。
node.jsでファイルをtouchする

linuxのtouchコマンドと同じ機能を実行したい場合、node.jsからどうすれば良いかを調べた結果をメモする。
これで行ける。

```javascript
import * as fs from 'fs';

export touchFileSync = (fileName) => {
  try {
    const time = new Date();
    fs.utimesSync(fileName, time, time);
  } catch {
    fs.closeSync(fs.openSync(fileName, 'w'));
  }
};
```
【Dusk】テストメソッドの実行毎にセッションをクリアする方法


# バージョン情報

* Laravel8.x
* Dusk

# やりたいこと

同じクラス内の次のテスト関数の`loginAs()`を実行した時、別のユーザーとしてログインしたい。

例えば、下記のような`testUser1()`,`testUser2()`でテストを実施する場合
`testUser2()`で作成したユーザーでログインしたい。

```php:MyPageTest.php
class MyPageTest extends DuskTestCase
{
    use DatabaseMigrations;

    public function testUser1()
    {
        // テストデータ作成
        $user = User::factory()->create();
        $this->browse(function (Browser $browser) use ($user) {
            // ログイン
            $browser->loginAs($user)
                // 画面遷移
                ->visit('/mypage')
                // 遷移先のスクリーンショット
                ->screenshot("mypage_1");
        });
    }

    public function testUser2()
    {
        // テストデータ作成
        $user = User::factory()->create();
        $this->browse(function (Browser $browser) use ($user) {
            // ログイン
            $browser->loginAs($user)
                // 画面遷移
                ->visit('/mypage')
                // 遷移先のスクリーンショット
                ->screenshot("mypage_2");
        });
    }
}
```

しかし、公式の記載では、セッションを残すのが仕様となっています。
[Laravel 8.x Laravel Dusk](https://readouble.com/laravel/8.x/ja/dusk#authentication)
> Note: loginAsメソッドを使用した後、ファイル内のすべてのテストでユーザーセッションを維持します。

# 対応方法

テスト実行毎のクリーンアップする関数でセッションを消しすことで実現できました。

```php:DuskTestCase.php
abstract class DuskTestCase extends BaseTestCase {

    /**
     * 次のテスト実行前のクリーンアップ処理
     */
    public function tearDown(): void
    {
        parent::tearDown();
        foreach (static::$browsers as $browser) {
            $browser->driver->manage()->deleteAllCookies();
        }
    }

}
```
Docker内でGD使いたい ~elfinderが動くまで~


## モチベ
ckeditorで画像をアップロードしたいので、elfinderを使いたい、というのが始まりでした。
画像のリサイズもelfinderのプラグイン`autoResize`でやっちゃいたい!

elfinder上でjpegの画像をアップロードすると...

```
Fatal error: Call to undefined function imagecreatefromjpeg()
```

なんかおかしい。

## 原因
GDによるjpegの操作がうまくいってないっぽい。

### GDとは？
イメージ処理に関する関数が含まれているライブラリです。
これを使うことでPHPが画像処理ができるようになります。

https://www.php.net/manual/ja/book.image.php


## 0.状況の確認
`php -r 'print_r(gd_info());'`

`-r`コマンドは

```
  -r <code>        Run PHP <code> without using script tags <?..?>
```
とのことなので、 <? ?>コマンドいらずでphpコードを実行できます。
`gd_info()`はGDに関する諸々のconfigをチェックできます。
以下実行結果


```
(
    [GD Version] => bundled (2.1.0 compatible)
    [FreeType Support] => 
    [FreeType Linkage] => with freetype
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPEG Support] => 
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] => 
    [XBM Support] => 1
    [WebP Support] => 
    [BMP Support] => 1
    [TGA Read Support] => 1
    [JIS-mapped Japanese Font Support] => 
)
```

`JPEG Support`と`FreeType Support`がOKになってない!!


## 1.必要なパッケージを落とす

https://tt-computing.com/docker-php-gd

こちらのサイトがめっちゃ参考になりました。

今回はpng,jpeg,freetypeを使えるようにしたかったので
- zlib
- libjpeg62-turbo-dev
- libfreetype6-dev

などが必要でした。

docker内部でインストールする場合は、

```
apt-get install zlib libjpeg62-turbo-dev libfreetype6-dev
```
Dockerfileに書き込むももよし。



## 2.`docker-php-*` コマンドで諸々指定（全てを指定すること）

```
docker-php-ext-configure gd --with-freetype --with-jpeg
```

`docker-php-ext-configure`とは？
php extensionというphp拡張用モジュールの諸々の設定を変更できるコマンドらしいです。
これでgdのfreetypeとjpegを有効にします。


まだ設定ファイルを変更しただけなので、gdをインストールし直します。

```
docker-php-ext-install gd
```

docker Hubのサンプルには `-j$(nproc)`がついていますが、
これについては[参考サイト](https://tt-computing.com/docker-php-gd)を読んで、さらっと流しておきました。
速度の計測なども今後行いたいですね。

>$(nproc) というのは nproc コマンドの結果で、CPU 数になります。


再度 `php -r 'print_r(gd_info());'` を走らせると、

```
(
    [GD Version] => bundled (2.1.0 compatible)
    [FreeType Support] => 1
    [FreeType Linkage] => with freetype
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPEG Support] => 1
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] => 
    [XBM Support] => 1
    [WebP Support] => 
    [BMP Support] => 1
    [TGA Read Support] => 1
    [JIS-mapped Japanese Font Support] => 
)
```
JPEGとFreeTypeが有効になっているのが確認できる。



![スクリーンショット 2021-05-20 16.03.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/eea20d1f-d315-88be-7192-34da92d1223c.png)

ですが、上記のように `php_info()`だといらっしゃいません...?
elfinderも正常に動きませんでした。



dockerをrestartすると復活🎉
![スクリーンショット 2021-05-20 16.28.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/5c81a2e5-ad50-098c-511e-48f59b9fda32.png)


無事elfinderも正常に動き、jpegをリサイズすることができました!!


## 参考資料
https://pentan.info/php/gd_jpeg.html

https://tt-computing.com/docker-php-gd
【At Corder】【初心者】ABC083B - Some Sums をRuby で解いてみた


#はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ - Qiita](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日１問を目標としてコツコツやってきます:thinking:

わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください:baby:


https://atcoder.jp/home
#問題文

1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるものの総和を求めよ

##制約

1≤N≤$10^4$

1≤A≤B≤36

入力はすべて整数

##入力

```ruby
N A B
```

##出力

１以上N以下の整数の内、10進法での各桁の和がA以上B以下であるものの総数を出力せよ

入力例

```ruby
20 2 5
```

出力例

```ruby
84
```

20以下の整数の内、各桁の和が2以上5以下なのは、2,3,4,5,11,12,13,14,20だ。これらの和は84

#回答

```ruby
N,A,B = gets.split.map(&:to_i)
number = 0

(1..N).each do |i|
  sum = i % 10 + i / 10 % 10 + i / 100 % 10 + i / 1000 % 10 + i / 10000 % 10
  number += i if A <= sum && sum <= B
end

  
puts number

```

#感想

$10^4$を1000だと勘違いしてエラーが。
なかなかエラーの原因がわからず、他の方の回答を見て、sum = ~ の処理が一桁足りないことに気が付き、解決に至った。🙄
【備忘録】 IntelliJ IDEA にて .editerconfig を適応させる方法

■ メモ記事

1. 設定画面を開く
1. `エディター > コード・スタイル` を確認
1. `EditerConfig のサポートを有効にする` にチェックを入れる

![スクリーンショット 2021-05-20 18.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441218/0e03254f-b209-8234-1dc6-39490e2466bf.png)
Dockerで作った環境に"localhost"だけでアクセスできるようになって幸せになった話

# はじめに
私は普段`Python`の機械学習環境を`Docker`を利用して構築することが多いです。
普段は`localhost:〇〇〇〇`というIPアドレスでアクセスをしていますが、ある問題をきっかけに`localhost`のみでアクセスするようになり、IPを入力する時間を短縮できるようになりました。

今回はlocalhostでアクセスするようになった経緯とやり方について教えます。

# 環境
- Docker for windows
- JupyterNotebook
- Python

[こちら](https://goodbyegangster.hatenablog.com/entry/2020/01/11/071107)の記事で作成されている環境に似たものを作成したあと、`jupyter_notebook_config.py`を[追加](https://qiita.com/yasthon/items/2f1c2d485ecaf5a20796)してトークンの設定を無効化しています。

# 問題
ある時、他の方が作成した環境でJupyterNotebookにアクセスするときに問題がおきました。
いつものようにコンテナを起動してIPアドレスを入力してもページが応答しないのです。

利用していた環境では、`docker-compose up`を行うと、アクセスするIPアドレスが出力されます。
以下のように出力されていました。

```
notebook_1  | [I 17:48:19.719 NotebookApp] Jupyter Notebook 6.1.5 is running at:
notebook_1  | [I 17:48:19.719 NotebookApp] http://7fc4b7bb8202:8888/
```

私は、Docker for windowsを利用しているため、`localhost:8888`でアクセスすれば普段ならアクセスできるのですが、今回はなぜかできません。

その代わりにReadmeによると`localhost/lab`とIPアドレスに入力すると`JupyterLab`に接続できるとありました。
どこでそのような設定をしているのか。そしてどのようにすれば設定できるのか。わかりませんでした。

もし、設定できるならとても便利だなと思い調べましたが、すぐに記事にたどり着けませんでした。

# 解決方法

ポート番号なし`http://localhost/`でアクセスした場合、
ポート番号がないため、ウェブブラウザは自動的にデフォルトである`80番ポート`にアクセスします。

`docker-compose.yml`を確認したところ、

```
    ports:
      - "80:8888"
```

となっていました。なるほど！

というわけで、`localhost`でアクセスしたい場合は、`ports`の左側を`80`に設定すれば設定できます。

初めて知りました。

# さいごに

この解決方法を見つけられたのは`tratail`という質問掲示板に投稿した質問に回答があったおかげでした。
とりあえず、わからないことがあったら質問を投げてみるのも手だと思います。

良きDockerライフを！

# 参考記事

https://teratail.com/questions/edit/339333

https://goodbyegangster.hatenablog.com/entry/2020/01/11/071107

https://qiita.com/yasthon/items/2f1c2d485ecaf5a20796
【小ネタ】Visual Studio CodeのターミナルからMSVCを使う

# 目的

諸事情あって Visual Studio CodeでコーディングしてMSVCでコンパイルしたい。
そのため、Visual Studio Codeのターミナルから`cl`や`nmake`コマンドを使用できるようにしたい。

# 方法
### 前提

- Visual Studio Code がインストール済みであること
  - `code`コマンドが有効であること
- Visual Studio (のビルドツール)がインストール済みであること

### 手順

1. 使用したいバージョンの「開発者コマンドプロンプト」または「Native Tools コマンドプロンプト」または「Cross Tools コマンドプロンプト」を起動する。
1. `code`コマンドにより Visual Studio Code を開く。
1. 任意のフォルダやワークスペースを開く。

### 確認

1. Visual Studio Code 上でターミナルを開く。
1. `cl`コマンドを引数無しで実行する。
1. 以下のように目的のコンパイラのバージョン情報が表示されればOK。

```
>cl
Microsoft(R) C/C++ Optimizing Compiler Version 19.28.29915 for x64       
Copyright (C) Microsoft Corporation.  All rights reserved.

使い方: cl [ オプション... ] ファイル名... [ /link リンク オプション... ]
```

# 参考

- [Configure Visual Studio Code for Microsoft C++](https://code.visualstudio.com/docs/cpp/config-msvc)
rbenvを用いたrubyの環境構築手順

rbenvをインストール

```
apt install rbenv -y
```

.bash_profileファイルへ以下の２行を追加

```
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"
```

設定を反映させる。

```
source ~/.bash_profile
```

rubyの3.0.1をインストール。

```
rbenv install 3.0.1
```

rubyを3.0.1に設定する。

```
rbenv global 3.0.1
```
IBM Security Verify API で 複数ユーザーのアカウントを一括無効化する

# はじめに
IBM Security Verify(ISV) APIを利用して、複数ユーザーを１つのAPIリクエストで無効化する方法についてご紹介します。

# APIのリファレンス
APIのリファレンスは、以下のURLから確認できます。
https://<自分のテナント名＞.verify.ibm.com/developer/explorer/#

# 1.事前準備について
詳細は「IBM Security Verify API で ユーザーのアカウントを無効化する」をご参照ください。
https://qiita.com/fitz/items/7874a95245eea3ecef13

# 2.Bulk APIによるユーザーの無効化
ユーザー管理に関する複数のリクエストを一括実行するためには、/v2.0/Bulk APIを利用します。
![bulkapi (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/e5cc8a0a-d7f2-251d-8803-8cda77e528ea.png)

POST/PATCH/DELETEなどのリクエストにより必要な値がかわるため、モデルをご確認ください。
![bulkapi (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/9d7a97fe-d0c1-5ff5-d1ac-2a53bf77af36.png)

/v2.0/Bulk APIには以下の制限があります。

```
The maximum number of operations is 1000 and the maximum payload size is 1048576
```


今回は/v2.0/Bulk APIを利用して2ユーザーを無効化します。

schemasの設定は、モデルの説明の通り"urn:ietf:params:scim:api:messages:2.0:BulkRequest"とします。

```
"schemas": [
        "urn:ietf:params:scim:api:messages:2.0:BulkRequest"
    ]
```

Operationsに、個々のユーザーを無効化するための内容を記載します。

- "method"にはPOST/PATCH/DELETEなどリクエストの種類を指定します。
- "path"に"/users/<無効化するユーザーのユーザーID>"を指定します。
- "data"にデータ変更する内容を指定します。今回はActive属性をFalseに指定します。

```
"Operations": [
        {
            "method": "PATCH",
            "path": "/Users/64000xxxxx",
            "data": {
                "schemas": [
                    "urn:ietf:params:scim:api:messages:2.0:PatchOp"
                ],
                "Operations": [
                    {
                        "op": "replace",
                        "path": "active",
                        "value": false
                    }
                ]
            }
        },
        {
            "method": "PATCH",
            "path": "/Users/65000xxxxx",
            "data": {
                "schemas": [
                    "urn:ietf:params:scim:api:messages:2.0:PatchOp"
                ],
                "Operations": [
                    {
                        "op": "replace",
                        "path": "active",
                        "value": false
                    }
                ]
            }
        }
    ]
```

実行するリクエストは以下のような形になります。

```
curl -X POST https://<テナント名＞.verify.ibm.com/v2.0/Bulk  --header "Content-Type: application/scim+json" --header "Authorization: Bearer <アクセストークン>" --data-raw "{\"schemas\":[\"urn:ietf:params:scim:api:messages:2.0:BulkRequest\"],\"Operations\":[{\"method\":\"PATCH\",\"path\":\"/Users/<userid>\",\"data\":{\"schemas\":[\"urn:ietf:params:scim:api:messages:2.0:PatchOp\"],\"Operations\":[{\"op\":\"replace\",\"path\":\"active\",\"value\":false}]}},{\"method\":\"PATCH\",\"path\":\"/Users/<userid>\",\"data\":{\"schemas\":[\"urn:ietf:params:scim:api:messages:2.0:PatchOp\"],\"Operations\":[{\"op\":\"replace\",\"path\":\"active\",\"value\":false}]}}]}"

```

Bulk APIで実行したリクエストの結果は、リクエスト単位で表示されます。
![bulkapi (3) .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/0373c6b8-d9b0-2c0b-d1ff-80883a154c67.png)

# 最後に
IBM Security VerifyのBulk APIを利用してアカウントを一括無効化する方法についてご紹介しました。
Vagrant upでマウントが失敗するときの対処法（Oracle VM VirtualBoxを使用してる方で）

#内容
下記記事を参考にさせて頂き、エラーを解決しようと思ったのですが**Oracle VM VirtualBox**を使用しているからか、解決しませんでした。
**Oracle VM VirtualBox**を使用している方が、自分のように躓かないようにとこの記事を書きました。

>https://qiita.com/KZ-taran/items/663054683cd7818aea71



#上記記事の"リロード"の部分で

```
> vagrant reload default
```

を実行すればと書いていたのですが、自分は**Oracle VM VirtualBox**を使っているからか解決しませんでした。



#解決方法
Oracle VM VirtualBoxの下記を削除をして、再度vagrant upを実行すると解決しました。


![スクリーンショット 2021-05-20 17.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/736274/a71e3135-8283-c3a8-e2b7-c2c87a0739df.png)
【AWS】HTTP5xx と ELB5xx の違い 

ロードバランサーの画面で、HTTP 5xxs は増加しているのに、ELB 5xxs は増えていない現象を目の当たりにした。
この２つの違い、というか区別されていたこと自体を認識できていなかったのでちゃんと調べる。

↓ロードバランサーのモニタリングタブより
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/0ee230a0-7960-b8b3-f65d-706b748c9d60.png)


# 結論
 ELB 5xxs = ロードバランサーが返す 5xx
 HTTP 5xxs = ターゲットが返す 5XX

# ドキュメントを見てみる
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html#load-balancer-metrics-alb

5xx で引っ掛けて検索すると2つヒットした。

### HTTPCode_ELB_5XX_Count
ロードバランサーが返すステータスコードのようだ。ELB 5xx がこれかな、きっと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/e7555f5b-7460-8ffd-d998-4efd33fbe03a.png)

### HTTPCode_Target_5XX_Count
こっちはターゲットが返すステータスコード。これが、HTTP 5xxs かな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/ef4a4336-3bea-f153-6491-f5c5c6ea7b1d.png)


# CloudWatch メトリクスを見てみる
確認のために、メトリクス名と中身を照らし合わせる。

↓HTTPCode_ELB_5XX_Count
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/55b976e8-d1cf-0a14-d139-0211c03664fd.png)


↓HTTPCode_Target_5XX_Count
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/8f24072f-14b9-5101-f234-a447d86057c9.png)

これにより、それぞれのメトリクスが下記に対応していることが分かった。

|  CloudWatch メトリクス名  |  ロードバランサーのモニタリング画面  |
| :----: | :----: |
|  HTTPCode_ELB_5XX_Count  |  ELB 5xxs  |
|  HTTPCode_Target_5XX_Count  |  HTTP 5xxs  |

# まとめ
ロードバランサのモニタリング画面を雰囲気でしか見てなかったので反省。
「HTTP 5xxs」は分かりにくいので、「Target 5xxs」に改名してほしい。
【Go】プログラム内で定期実行させるライブラリ Cron

docker コンテナ内でcrontabがうまく動作しなかったので、Goプログラム内で定期実行をさせた。

# 実行環境
* golang 1.16.4-buster コンテナ

# インストール
```bash
go get github.com/robfig/cron/v3@v3.0.0
```
# Cron
まず、コード例

```go:main.go
package main

import (
        "fmt"
        "github.com/robfig/cron/v3"
)

func main() {
	c := cron.New()

	// 3秒ごと、「Hello World!!」と出力される
	c.AddFunc("@every 3s", printHelloWorld)

	// 毎日、午前8時に「Hello World!!」と出力される
	// cron式でもスケジューリングの設定ができる
	c.AddFunc("0 8 * * *", printHelloWorld)
	
	//追加したジョブを開始
	c.Start()

	// プログラムを即終了させない
	runtime.Goexit()
}

func printHelloWorld() {
	fmt.Println("Hello World!!")
}

```

# 参考記事
* https://github.com/robfig/cron
* https://pkg.go.dev/github.com/robfig/cron
【JavaScript】配列の操作

# 概要
JavaScriptの基本的な配列の操作についてまとめる。
# 配列の操作（先頭or末尾）
```javascript
unshift() //先頭に追加
shift() //先頭から削除
push() //末尾に追加
pop() //末尾から削除
```
- 追加したい要素を（）内に記入する。
- 削除は１つずつになるため、（）内に数字は入れない。

# 配列の操作（位置を指定）
```javascript
splice(変えたい位置, 削除数, 追加する要素) //追加する要素がなかったら、空白に
```
youtube-dlでのYoutubeの動画のダウンロード

#はじめに

研究に使うデータ収集のためにyoutubeの動画をダウンロードする機会があったので、記事にしてみました。

この方法は簡単で安定してyoutubeの動画をダウンロードできます。

#環境
Windows10

#youtube-dlとは
Youtubeから動画をダウンロードするためのコマンドラインのプログラムです。
WindowsではPythonがインストールされていれば動作します。


#youtube-dlのインストール

```ruby:インストール
$ pip install youtube-dl
```

インストールが完了したら一度バージョンを見て、最新のものになっているか確認してください。

```ruby:バージョン確認
$ youtube-dl --version
```

バージョンが最新のものでなければアップデートをする必要があります。


```ruby:アップデート
$ pip install -U youtube-dl
```

#Youtube動画のダウンロード

youtube-dlのインストールができたら、以下の方法でYoutubeの動画のダウンロードができます。
また、ディレクトリは動画を保存したい場所にしてください。

```
$ youtube-dl "ダウンロードしたい動画のURL"
```

#最後に
今回、初めてではありますが、自分のやったことを共有できたらと思い投稿しました。

不明な点や、改善すべき点などがあればコメントでお願いします。
他にも共有できることがあれば投稿してみようと思います。
MySQL書き方レクチャー

①MySQLの構文を打つ時にコメントアウトする方法

⑴「--」

```
-- select * from products;
```

⑵「/* */」これは複数の構文を一気にコメントアウトも可能。

```
/* select * from products; */
```

②whereを使う
whereは抽出したい条件を指定する時に使う。
下記の場合は、priceが9800円以上のもののみが表示される

```
select name,price from products where price >= 9800;
```

idが１の行を取得したいとき

```
select * from products where id=1;
```

idが１か2か3の行を取得したいとき

```
select * from products where id in(1,2,3);
```

idが１か2か3ではない行を取得したいとき

```
select * from products where id not in(1,2,3);
```

名前が「商品0003」の行を取得したいとき

```
select * from products where name='商品0003';
```

priceが100でない行を取得

```
select * from products where price <> 100;
もしくは
select * from products where price != 100;
```


priceがnullでない行を取得

```
select * from products where price is not null;
```

priceがnullである行を取得

```
select * from products where price is null;
```

priceが1000から1900である行を取得

```
select * from products where price between 1000 and 1900;
```

論理積
betweenを使わなくても取得できる。

```
select * from products where price >= 1000 and price <= 1900;
```

論理和
orを使ってどちらかがtrueなら結果を表示する。

```
select * from products where price = 1000 or price = 2000;
```

③フィールド名を変える
もともとデータがあると仮定して。例えば、nameとpriceがある。
この二つの表氏名を変更したい場合はasを使う。

```
select name as 名前,price as 価格 from products;
```

④もともとあるデータに変更を加える。
priceのデータを税込価格で表示したい場合

```
select name as 名前,price as 価格,price * 1.08 as 税込価格 from products;
```

⑤パターンマッチング
likeを使って、そして「%」か「_」を使う
下記の場合は「中」から始まるuserを取得している

```
select * from users where last_name like '中%';
```

「中」を含む人を取得したい場合

```
select * from users where last_name like '%中%';
```

名前が子で終わるuserを取得したい場合

```
select * from users where first_name like '%子';
```

名前が３文字で最後が子で終わるuserを取得したい場合
下記の場合は「_」を２つ書いている

```
select * from users where first_name like '__子';
```

⑥limitを使って取得数を制限する

下記は0番目から１０番目までのproductsのデータを取得している

```
select * from products limit 10;
```

10番目から10個取得したい場合
初めの数字が何番目から取得するかで次の数字は何個まで取得するかである。
実際PCは0から数えるので今回だと11番目のところから始まる。

```
select * from products limit 10, 10;
```

記述順序がある（必ずこの順序で書く必要がある）
1, select（取得行（カラム）の指定）
2, from （対象テーブルの指定）
3, where （絞り込み条件の指定）
4, group by （グループ化の条件を指定）
5, having （グループ化した後の絞り込み条件を指定）
6, order by （並び替え条件の指定）
7, limit （取得する行数の制限）

⑦新しくデータベースを作成する方法

```
create database データベース名;
```

データベース一覧を見る方法

```
show database
```

データベースにテーブルを追加する方法

```
use データベース名
```

```
create table books(id int not null auto_increment primary key, title varchar(255) not null)
```
intは整数という意味です。
not null はnullを許可しないという意味です。
primary keyはこのidが主キーという意味です。
titleのvarchar(255)は255文字までという意味です。

下記でテーブルが存在するか確認できる。

```
show テーブル名（今回はbooks）;
```
下記でテーブルの構造が確認できる

```
show columns from  テーブル名（今回はbooks）;
```
列を追加したい場合(今回だとidのあとに追加できる)

```
alter table テーブル名（今回はbooks）add price int after id;
```

列名を変更したい場合（今回はpriceという列名を変更する）

```
alter table  テーブル名（今回はbooks）change price unit_price int;
```

列の削除

```
alter table  テーブル名（今回はbooks）drop unit_price;
```

テーブルの削除

```
drop table テーブル名（今回はbooks）;
```

データベースの削除(今回のデータベース名はbook_storeにする)

```
drop database book_store;
```
【salesforce】レコードページでメッセージを表示させる方法

この記事では、Salesforceで環境をカスタマイズする際に役立った小ネタをご紹介したいと思います。


#レコードページでのメッセージ表示

レコードページを見ていると、注意喚起やお知らせのメッセージを表示したいことはありませんか。

例えば、リードから取引を開始するとき、取引先や取引先責任者で引き継ぎたい項目があり、その入力を前もって促しておきたいとします。

これの実現方法としては、入力規則が考えられます。
しかし、もしその項目が必ずしも埋まるものではないとしたら、入力を必須にする入力規則は不適切です。

そうなると、次に考えられるのは項目にヘルプテキストを付けて注意喚起することです。
しかし、ご存知の通りヘルプテキストはそのマークにマウスオーバーしないとメッセージ自体出てきません。
入力する人が必ずしも見るとは限りませんし、なにより目立ちません。

**入力必須ではないけど、見る人に必ず注意喚起はしておきたい。**
そうなると**レコードページにメッセージをそのまま表示**したいですよね。

#レコードページにメッセージを表示

実は、レコードページにメッセージをそのまま表示することは可能です。

では、実際にやりながら見てみましょう。

まずは、変更前の画面を確認しておきましょう。
![⓪初期画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/b9e48b1e-b5ed-40fc-b94d-467d41d28a44.png)
今回入力を促したいのは「評価」項目と「Product Interest」項目とします。
![①最初の画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/fd65e011-811c-3a5a-4ad4-f057d877c436.png)

確認できたところで、編集ページを開きます。
![②編集ページへ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/43c82957-b11a-b622-d0fd-8984609bb17c.png)

画面左のコンポーネントからリッチテキストをドラック＆ドロップで画面上に配置します。
そして、画面右に編集画面が出るので、そこに出したいメッセージを入力しましょう。
文字の大きさやフォントなども変えられるので、任意で調整します。
![③リッチテキスト作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/342bc7ea-b650-0209-ee87-8480e1bdd8fd.png)

最後に保存と有効化を行います。

手順はこれで完了です。
では、変更後の画面を見てみましょう。
![④編集後画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261412/f9d65090-4450-08f6-28c8-dd5a3684aa44.png)

しっかりとメッセージとしてレコードページに表示されていますね。

#問題点も…

さぁ、これで見る人全員にメッセージを伝えることが出来そうです。

ですが、この方法には**欠点**もあります。
それは**見る人の言語設定によって、表示される文言が変わらないこと**です。

例えば、日本人のユーザは日本語で、アメリカ人のユーザは英語で言語設定していると思います。
このとき、上述のやり方では、文字をベタ打ちしてしまっているため、誰もが同じ文字を見ることになります。
つまり、もし文字を日本語で書いていれば、アメリカのユーザが同じページを見たとき、その部分だけが日本語で表示されるということですね。

これでは、色々な国のユーザが想定される環境では使えないですね。
1か国限定の環境です...

では、どうすればいいのか。

もちろん解決策はありますが、記事が長くなってきました。
~~後日、その記事も書きたいと思いますのでそれまで少々お待ちください。
書けた際は、ここにも改めてリンクを貼らせていただきたいと思います。~~

追記

解決の記事は[こちら](https://qiita.com/Supply-net/items/5362d2606879fc0c3a88)です。
ぜひご覧ください！
スシローのセットの要素の価格を推定

https://docs.google.com/spreadsheets/d/1B7o0XhjEKsJZga1gsGqdMc6cFz92FreOfjuCiT-Uy58/edit?usp=sharing

のような情報から、どれがお得か判定したい。
手動で正規化するのは辛かったので、注文ページから文字列をnetaにコピペしてpythonでスプリットする方針で。


```python
import pandas as pd
df=pd.read_clipboard()
neta=df.neta.apply(
    lambda x:
             x.replace("◇","").split("・")
            )        

```

sklern.ppのMultiLabelBinarizerというので、楽に正規化できた。

問題は、ネタの数(ncol=31)に比べて単品のを付け加えても、データが31件と少ない。
単純に連立方程式が解けない事がわかるし、線形モデルのX^tXが正則にならない。

飲食店のメニューが
M1={x1,x3,x4...}
M2={x2,x4}
みたいな感じで、メニュー数が十分な数が無い事が多いので、この問題はありがちだと思われる。

リッジ回帰がその解決策の一つで、試してみた

```python
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()

tdf=df.join(
    pd.DataFrame(mlb.fit_transform(neta),
        columns=mlb.classes_,
         index=df.index)
)
tdf=pd.concat([tdf,pd.Series([1]*tdf.shape[0])],axis=1)

from sklearn.linear_model import Ridge
import numpy as np
#clf = Ridge(alpha=1.0,fit_intercept=True)
clf = Ridge(alpha=1.0,fit_intercept=False)

clf.fit(tdf.iloc[:,3:], tdf.price)
res=pd.DataFrame({"name":tdf.iloc[:,3:].columns,"coef":clf.coef_,"ecoef":np.exp(clf.coef_)})

res.sort_values("coef").iloc[::-1]

22	特ネタ大とろ	191.038970	9.271941e+82
21	特ネタ中とろ	177.280521	9.816398e+76
13	まぐろ	137.828883	7.216449e+59
4	うなぎの蒲焼き	117.117830	7.305117e+50
0	1貫いくら	112.259368	5.670535e+48
17	大えび	102.708073	4.032267e+44
24	生サーモン	102.708073	4.032267e+44
25	赤えび	102.708073	4.032267e+44
1	1貫かに本身（持ち帰り専用）	101.991049	1.968565e+44
12	ほたて貝柱	91.096206	3.652411e+39
10	はまち/寒ぶり	90.756435	2.600273e+39
7	たい	88.708073	3.352946e+38
16	上穴子	81.144683	1.740556e+35
18	漬けまぐろ	68.538970	5.835750e+29
26	軍艦ねぎまぐろ	66.109740	5.141562e+28
11	びん長まぐろ(持ち帰り専用）	63.721606	4.720001e+27
15	ジャンボとろサーモン	39.331794	1.206650e+17
14	サーモン	37.181204	1.404726e+16
2	いか	32.197520	9.620672e+13
5	えび	32.197520	9.620672e+13
9	たまご	32.197520	9.620672e+13
8	たこ	29.809387	8.831864e+12
20	煮あなご	29.809387	8.831864e+12
23	甘えび	28.838339	3.344502e+12
27	0	21.701684	2.660244e+09
6	えんがわ	19.037291	1.852638e+08
3	いくら	16.649158	1.700738e+07
19	焼とろサーモン	14.219927	1.498428e+06

```

モデルは、対数をとらず、切片をつけるのが一番マシな感じ。
安いのは１皿１００円程度で１カン50円程度。
32円のいか以下（）はちょっと安すぎじゃないかと思う。高いのが高めに出過ぎてる感じ。
まぐろは130円と高く出過ぎ(単品110円）。

これをやるならベイズ一択だろうけど、なんとなくpython,pandasあたりを最近触っていなかったので
RSpecの実装準備

### 1.RSpecを使用するためのGemを導入します
---

下記をGemfileの:development, :testのグループの中に記述しました。

```
gem 'rspec-rails'
```
続けて、bundle install

```
% bundle install
```

### 2.RSpecを導入
---
gemを導入しただけではアプリケーション内でRSpecを用いることはできません。下記のコマンドを実行。（specディレクトリや.rspecファイルが生成されます。）

```
% rails g rspec:install
```
### 3.テストコードをターミナル上で可視化するための設定
---
.rspecファイルに下記の記述をすることでターミナル上にRSpecの実行結果が見られるようになります

```
--format documentation
```
### 4.FactoryBotとFakerのgemを導入
---
FactoryBotは繰り返し作成するインスタンスをまとめて記述するために、Fakerはランダムな値を生成するために必要なgemです。Gemfileの:development, :testのグループの中に記述しましょう。

```
  gem 'factory_bot_rails'
  gem 'faker'
```

続いて、bundle install

```
% bundle install
```
### 5.ダミー用の画像を用意します（今回は画像投稿ができるアプリケーションのため）
---
画像のファイル名はtest_image.pngとします。publicディレクトリ内にimagesディレクトリを作成し、その中にダミー画像を保存しました。

---
これまでの作業でRSpecを用いてテストを記述する準備が整いました。