OmniAICreator/Qiita-1.07M huggingface dataset:
1つのSpring Project内に複数のMainクラスを入れる

# 概要
プロジェクトに複数のバッチ処理がある場合、1つのプロジェクトに複数のバッチを入れる、複数のプロジェクトに分けるなどの選択肢があります。
この記事では、前者の1つのプロジェクトに複数のバッチを入れるのアプローチで、Mainクラスを分ける方法を試しました。

# 前提
```
>gradle -v

------------------------------------------------------------
Gradle 6.5
------------------------------------------------------------

Build time:   2020-06-02 20:46:21 UTC
Revision:     a27f41e4ae5e8a41ab9b19f8dd6d86d7b384dad4

Kotlin:       1.3.72
Groovy:       2.5.11
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.2 (Oracle Corporation 11.0.2+9)
OS:           Windows 10 10.0 amd64
```

STS 3.9.9.RELEASE（いい加減4系にしないと・・・）

# プロジェクト構成
multiple-main
└src/main/java
　└com/example/dem
　　├MultipleApplication.java
　　└MultipleApplication2.java

# Mainクラスの呼び分け方法
## STSの場合
Spring Applicationを実行しようとすると、下図のようにMainクラスを選ぶ画面が出てくるので、実行したい方を選ぶ。
![スクリーンショット 2020-11-03 094542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/5d83b644-42b8-a2df-edf2-5242bbfaf5fb.png)

## Gradleの場合
applicationプラグインを読み込ませたうえで、mainClassを指定する。
いちいちbuild.gradleを書き換えないといけないので不便ですね。
（参考リンク1）

```gradle
plugins {
	id 'org.springframework.boot' version '2.3.5.RELEASE'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
	id 'application'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
mainClassName = "com.example.demo.MultipleMainApplication2"

repositories {
	mavenCentral()
}
```

## jar実行の場合
```
java -cp multiple-main-0.0.1-SNAPSHOT.jar -Dloader.main=com.example.demo.MultipleMainApplication org.springframework.boot.loader.PropertiesLauncher
```
（参考リンク2）

PropertiesLauncher is 何者？という感じですが、build.gradleのmainClassがMultipleMainApplication2の状態でも、MultipleMainApplication（無印）の方を起動することが出来ました。

# まとめ
一応出来なくもないけど、筋悪な気がしました。
Mainクラスだと、Spring管理下のBeanを扱いづらい（扱えないわけではない）ので、1つのプロジェクトに複数の処理を入れるのであれば、下記の記事を参考にRunnerを切り替える方法が良いと思います（現場でもこの方法を採用した）。

[Spring Bootの実行可能jarに複数のCommandLineRunner/ApplicationRunner実装クラスを入れて、起動時のプロパティで実行するクラスを切り替える - Qiita](https://qiita.com/ksby/items/ef21b717e75b7c5b9988)

# 参考リンク
1. [第45章 アプリケーション プラグイン](http://gradle.monochromeroad.com/docs/userguide/application_plugin.html)
2. [Spring Boot:メインクラスの設定](https://www.codeflow.site/ja/article/spring-boot-main-class)
3. [Spring Bootの実行可能jarに複数のCommandLineRunner/ApplicationRunner実装クラスを入れて、起動時のプロパティで実行するクラスを切り替える - Qiita](https://qiita.com/ksby/items/ef21b717e75b7c5b9988)
sessionを使ったログイン管理まとめ

すぐに忘れて調べなおすことになるので自分用にまとめ

#ログインhtml画面
```
<form method= "post" action="login_check.php">
<input type="text" name="name" placeholder="名前を入力してください">
<input type="password" name="password" placeholder="パスワードを入力してください">
<input type="submit" value="ok">
</form>
```

#チェック動作
```php

$name = $_POST['name'];
$pass = $_POST['password'];

if( ){
   //パスワード、名前のバリデーション
}else{
   session_start();
   $_SESSION['login'] = 1;
   $_SESSION['name'] = $name;
   header('Location: login_top.php');
  exit();
}
```
#ログイン必須にしたい画面
```login_top.php
<?php 
session_start();
session_regenerate_id(true);

if(isset($_SESSION['login']) == false){
	print 'ログインしてください';
    exit();  //これでログインしていない人は以下の画面を見られなくなる
}else{
	print $_SESSION['name'];
	print 'さん、ようこそ';
}

?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>トップ</title>
</head>
<body>
ログインした人にだけ見られるページです。
</body>
</html>
```

ログインした人にだけ見せたいページはこんな感じ。

冒頭部分を

```
if(isset($_SESSION['login']) == false){
	print 'ログインしてください';
}
```
にする（exit()を抜く）とその後のhtml画面も見えてしまうので注意。
初めてのGit（バージョン管理）

 
## 説明
今までは、SVN(TortoiseSVN)を利用していて、そろそろ
Gitの勉強をしないとやばいと思ったのでその備忘録です。


## 概要
    作業場所
    ↓ add
    ステージング
    ↓ commit
    リポジトリ(ローカル)
    ↓ push
    リポジトリ(リモート)

Gitでは、SVNにはなかったpushの作業が増えるので似たようなバージョン管理システムでしょ。　って思ってる人は注意が必要です。

## 作業の流れ
    githubでリポジトリ(リモート)を作成
    ↓ clone or pull
    それを自分のローカル環境に持ってくる（リポジトリ(ローカル)の作成 = clone
    リモートリポジトリが更新された場合は、リポジトリ(ローカル)も更新 = pull
    ↓
    ローカルで開発
    ↓
    上記の概要の作業を行う

## コマンド一覧
コマンドは、たくさんあるのですが、一度に多くは覚えられないので下記のみで。

#### ローカルリポジトリをプッシュしてリモートリポジトリへ反映
    git push origin main

#### リポジトリの作成
    git init 
    git init フォルダ名

#### リポジトリのクローン
    git clone リポジトリフォルダへのパス

#### コミット時のユーザー名とメルアドの設定
    git config

#### ステージングに登録してた内容を取り消す
    git reset

#### リモートリポジトリをプルしてローカルリポジトリへ反映
    git pull origin main
Qiitaはじめました。

こんにちは。
プログラミングを学び始めて、4ヶ月のかおりです。

長い人生、好きなことしたい。
やりたくない事はやりたくない。
楽したい。楽って、悪いことのように聞こえてしまいそうですが、
❝ムダを省くこと❞だと思います。

ムダを省くという課題を、どうすれば解決できるか考えたところ、
プログラミングという手段を知りました。

私は、プログラミングでムダを無くしたいと思っています。
自動化、高速化することで、空いた時間を好きなこと、新しい経験をするために使いたいと思っています。

これまで勉強してきて、プログラミングは決して簡単では無いと感じています。
でも、Pythonのように初心者が取り掛かりやすい言語も存在しますし、分からないことを調べるうちに、ITの周辺知識が身に着き、共通言語を使ってエンジニアさんと会話することができるようになり、つまり、ITリテラシーを養うことができます。

逆に、ITリテラシーが無いと、「 あいつはリテラシーが無いから、仕事を依頼するのをやめとこう。」なんて、チャンスを失ってしまうのは嫌だなぁ。なんて考えてしまいます。

なので、プログラミングは、やって損する事なんて一つも無いと信じています。
少しずつ動くプログラムを作り、アウトプットすることで、成長したいと思っています。

これから成長過程を素直に綴っていきたいと思います。

よろしくお願いします ´  `
vmware イメージの圧縮

# vmware イメージ (vmdk ファイル) の圧縮

vmware の仮想環境を使っていると、ファイルを削除しても、削除済みの印をつけるだけで実際のデータが削除されないので上限として指定したサイズまで仮想イメージが大きくなる。非常に使いにくくなるので、使っていない領域を解放して、vmware イメージを圧縮する方法を説明する。

`ubuntu 20.04` と`ubuntu 20.10` で `VMware workstation 15 player` 上で確認した。
**この手順を行うときは、vmware イメージ全体のバックアップを取って、仮に失敗しても問題ないようにして行うこと。**

## 手順

```
sudo -i 
dd if=/dev/zero of=./zero bs=4k status=progress; \
  rm -f ./zero; \
  vmware-toolbox-cmd disk shrink /; \
  shutdown -h now
```

* dd の操作は、空き容量が尽きるまで実行されるので最終的にコマンドは失敗となるので `;` で連結し、コマンドの実行結果にかかわらず `rm` が実行されるようにする。
* dd の操作～ `vmware-toolbox-cmd disk shrink` コマンドは実行に時間がかかるので、前のコマンドの実行後に自動的に実行する。
* `vmware-toolbox-cmd disk shrink /` の操作の後、画面が真っ黒になって操作できなくなることがあるので、自動的にシャットダウンする。

## 説明

### テストのために意図的にディスクを使う

まず効果があるかどうか確認するために意図的に大きなファイルを作る。

```
dd if=/dev/urandom of=./out1 bs=1M count=10000 status=progress
dd if=/dev/urandom of=./out2 bs=1M count=10000 status=progress
dd if=/dev/urandom of=./out3 bs=1M count=10000 status=progress
dd if=/dev/urandom of=./out4 bs=1M count=10000 status=progress
```

### 確認

シャットダウンして vmware のフォルダサイズが増えているのを確認する

```
sudo shutdown -h now
```

### ディスクを圧縮する

#### 後始末

ダミーで作成したファイルを削除する

```
rm out*
```

#### root ユーザーに切り替える。

root ユーザーに切り替える。

```
sudo -i 
```

#### 空き領域に 0 を書く (重要)

以下コマンドを実行することにより、空きディスクにすべて zero のファイルを書き込んで削除する。
ディスク容量が不足しているという警告が出るが、直後に削除するので気にしない。

この手順がないと、`vmware-toolbox-cmd disk shrink` を行ってもディスクは圧縮されない。

```
dd if=/dev/zero of=./zero bs=4k status=progress; rm -f ./zero
```

#### vmware のディスクを圧縮する

以下コマンドで vmware のディスクを圧縮する。
※ このコマンドを実行しただけでは圧縮はできず、この前の手順である dd で zero 埋めする操作が必要。

```
vmware-toolbox-cmd disk shrink /
```

### 確認

シャットダウンして vmware のフォルダサイズがもとに戻っているのを確認する

```
shutdown -h now
```


## 参考リンク

* https://rin-ka.net/thin-provisioning-disk-difference/
* https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=VMWare+Player+%A4%C7%A5%C7%A5%A3%A5%B9%A5%AF%A5%A4%A5%E1%A1%BC%A5%B8%A4%F2%B0%B5%BD%CC%A4%B9%A4%EB
MsTestのprivateメンバ操作

## テスト対象
``` C# 
/// <summary>
/// テスト対象クラス
/// </summary>
public class TestTargetClass
{
    /// <summary>
    /// Privateメンバ変数
    /// </summary>
    private int _privateMember = 0;

    /// <summary>
    /// PrivateStaticメンバ変数
    /// </summary>
    private static string _privateStaticMember = "";

    /// <summary>
    /// Publicメソッド
    /// </summary>
    /// <param name="param"></param>
    /// <returns></returns>
    public int PublicMethod(int param)
    {
        return param + 1;
    }

    /// <summary>
    /// Privateメソッド
    /// </summary>
    /// <param name="val1"></param>
    /// <param name="val2"></param>
    /// <returns></returns>
    private int PrivateMethod(int val1, int val2)
    {
        return _privateMember + val1 + val2;
    }

    /// <summary>
    /// Privateメソッド(非同期)
    /// </summary>
    /// <param name="val1"></param>
    /// <param name="val2"></param>
    /// <returns></returns>
    private async Task<int> PrivateMethodAsync(int val1, int val2)
    {
        await Task.Delay(0);
        return val1 + val2;
    }

    /// <summary>
    /// PrivateStaticメソッド
    /// </summary>
    /// <returns></returns>
    private static string GetPrivateStaticMember()
    {
        return _privateStaticMember;
    }
}
```

## テストコード
### Publicメソッド
通常ケース  

``` C#   
[TestMethod()]
public void PublicMethodTest()
{
    var instance = new TestTargetClass();
    var ret = instance.PublicMethod(1);
    Assert.AreEqual(ret, 2);
}
```
### Privateメソッド+Privateメンバ変数
PrivateObjectのSetFieldOrProperty()でメンバ変数を変更．
またはSetField()，SetProperty()．
privateObject.Invoke()でメソッド呼び出し．第2引数以降で呼び出したいメソッドの引数を設定．

``` C#   
[TestMethod()]
public void PrivateMethodTest()
{
    var instance = new TestTargetClass();
    var privateObject = new PrivateObject(instance);

    // メンバ変数値変更
    privateObject.SetFieldOrProperty("_privateMember", 100);
    // Privateメソッド呼び出し
    var ret = privateObject.Invoke("PrivateMethod", 100, 200);
    Assert.AreEqual(ret, 300);
}
```
### Privateメソッド(非同期)
呼び出しを戻り値の型でくるんでawait．  

``` C#   
[TestMethod()]
public async Task PrivateMethodAsyncTest()
{
    var instance = new TestTargetClass();
    var privateObject = new PrivateObject(instance);
    // 戻り値の型でくるんでawait
    var ret = await (privateObject.Invoke("PrivateMethodAsync", 100, 200) as Task<int>);
    Assert.AreEqual(ret, 300);
}
```
### PrivateStaticメソッド+PrivateStaticメンバ変数
PrivateTypeのSetStaticFieldOrProperty()とInvokeStatic()を使用．
基本は通常のPrivateのときと同じ．  

``` C#   
[TestMethod()]
public void GetPrivateStaticMemberTest()
{
    var privateType = new PrivateType(typeof(TestTargetClass));
    // static変数値変更
    privateType.SetStaticFieldOrProperty("_privateStaticMember", "ヨシッ！");
    // staticメソッド呼び出し
    var ret = privateType.InvokeStatic("GetPrivateStaticMember");

    Assert.AreEqual(ret, "ヨシッ！");
}
```
【個人開発】自分の悩みをシェアするアプリ「complexshare」をリリースしました

#はじめに

こんにちは。たつやと申します。

Laravelを使ってwebアプリケーションを作成したので見ていただけたら幸いです。


#サービスの概要

今回私は、自分の悩みをシェアすることができるプラットホームを作りたいと思い
***complexshare***というwebサービスを作成しました。

###なぜ作ろうと思ったのか
自分自身コンプレックスや悩みをなかなか家族や友達に話すことができませんでした。
そこでwebサービスを利用すれば自分のコンプレックスや悩みを表現できると思いました。
また***同じコンプレックスを抱えている同士***と繋がってそこから交流を深めていきたいと思い
作成しました。

* アプリのURL：　http://complexshare.com

* Githubのリポジトリ：　https://github.com/twry0617/complexshare


#使い方
トップページです。ここから新規登録やログインを行うことができます
<img width="1426" alt="スクリーンショット 2020-10-23 23 16 46" src="https://user-images.githubusercontent.com/62969621/97930884-c82ff300-1daf-11eb-9ed6-40ada6ec4aa1.png">

投稿一覧です。ここでみんなが呟いた投稿を閲覧することができます。
<img width="1435" alt="スクリーンショット 2020-11-03 8 39 35" src="https://user-images.githubusercontent.com/62969621/97931123-4ab8b280-1db0-11eb-9913-c77f8414d341.png">

投稿詳細です。コメントを残すことができたりいいね機能を実装しています。
<img width="1430" alt="スクリーンショット 2020-11-03 8 43 55" src="https://user-images.githubusercontent.com/62969621/97931421-e813e680-1db0-11eb-8b69-d15b9debb55e.png">

投稿の新規作成画面です。タイトルと本文を入力することができます。
<img width="1436" alt="スクリーンショット 2020-11-03 8 47 10" src="https://user-images.githubusercontent.com/62969621/97931618-5a84c680-1db1-11eb-9119-d67fb0d8a4e8.png">

マイページ画面です。自分の投稿した内容とコメントが表示されます。
<img width="1431" alt="スクリーンショット 2020-11-03 8 54 24" src="https://user-images.githubusercontent.com/62969621/97931985-3c6b9600-1db2-11eb-86a9-cb19d21f518a.png">

以上がメイン機能になります。

#complexshareを使うことで得られるメリット
1.***自分の悩みやコンプレックスを思う存分呟くことができる***
匿名なので気軽に呟くことができます

2.***アドバイスや共感を得られることができる***
誰かがコメントを残してくれると励みや共感を得ることができコンプレックスの解消や悩み
の解消になります。

3.***同じ悩みを持った仲間ができる***
仲間ができることで1人で悩む必要がなくなり安心感を得られるようになります。

# 使用した言語・技術
 
* インフラ
  *  AWS(VPC,EC2,Route53,RDS,S3)
* フロントエンド
  *  HTML / CSS / SCSS / JavaScript / jQuery
* バックエンド
  *  PHP 7.3 / Laravel 5.8
* データベース
  *  mysql 8.0
* その他
  *  docker / docker-compose /  

#インフラ構成図
インフラはAWSを利用しました。
開発環境は
Dockerを利用しています。
![Untitled Diagram](https://user-images.githubusercontent.com/62969621/97932745-22cb4e00-1db4-11eb-938a-0e2bc9dc8356.jpg)

#今後complexshareに実装したい機能

***もっと気軽に呟けるチャット機能***
ローカル環境ではある程度は実装できていますが、デプロイした時にうまくいかないので
今後修正していきたいです。

***様々なリアクション機能***
現状いいねしかリアクションがないので、バリエーションを増やしたリアクションを追加
していきたいです。

#おわりに
まだまだ未熟なサービスなのでこれから機能を増やしたりユーザーに使いやすいUIにしていき
たいと思っています。

たくさんのユーザーに使っていただきたいので頑張ります！！
WordPressのテーマの作り方

###WordPress
![スクリーンショット 2020-11-03 8.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633943/12417c6d-737d-ad8a-175e-893cc2e2c81b.png)

```html:index.php
<?php get_header(); ?>

<main>

<p>ここに動かしたいプログラムを書く</p>

</main>

<?php get_footer(); ?>
```

```php:index.php
<?php
  if(have_posts()):
    // 記事を繰り返し表示するプログラムをここに記述します
  else:
  ?>
  <div class="post">
    <h2>記事はありません</h2>
    <p>お探しの記事はありませんでした</p>
  </div>
<?php
  endif;
?>
```
EPEL,Remi のことを詳しく

## 勉強前のイメージ

たまにインストール出来ないときにEPEL使って入れるけど、
実際よく分かってない....
参照先が違うとかそんな感じ？

## 調査

### そもそもインストールするのはリポジトリから

CentOSやRedhatで、yumでインストールする際はyumを叩くことが多いと思います。
[yum](https://qiita.com/miyuki_samitani/items/9ac04ca2b783575d8371)はパッケージ管理システムです。
rpmファイルの依存関係を解決したりします。
yumコマンドを使用してパッケージをインストールする際には、OSのデフォルトのパッケージが置いてあるリポジトリからインストールを行います。

### EPEL,Remiとは？

EPEL,REMIとは、リポジトリのことを指します。
↑で「パッケージをインストールする際には、OSのデフォルトのパッケージが置いてあるリポジトリからインストールを行います。」と書きましたが、
デフォルトではない、 `サードパーティ製のリポジトリ` というのが存在します。
それがRPELやRemiのことを指します。

下記の図のように、
デフォルトでは、デフォルトのリポジトリを参照。
パッケージによって、RPELリポジトリやRemiリポジトリを参照し、インストールを行います。

![2020-11-02Untitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/808f771d-6774-c91d-ea74-9ade17e267f3.png)

[ここ](https://wiki.centos.org/AdditionalResources/Repositories) にCentOSで利用可能なリポジトリが書かれています。
「Third Party Repositories」 の箇所に 「Extra Packages for Enterprise Linux (EPEL)」が存在しています。

![AdditionalResources_Repositories - CentOS Wiki - G.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1c89db05-af65-d14e-d831-fe7cc4ec9aaa.png)

そこに書かれている通り、EPELだけじゃなく他にも色々存在します。

### EPELを使う

- EPELのインストール

```
yum install epel-release
```

- デフォルトリポジトリの無効化

```
vi /etc/yum.repos.d/epel.repo
==========
...
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1 ★ ここを1にし、無効化する
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
...
==========
```

- EPELを使ってインストール

```
yum install 【パッケージ名】 --enablerepo=epel
```

## 勉強後イメージ

参照先が違ったのは合ってた。
リポジトリがそもそも違った。
ちゃんと調べてからインストールしないといけないけど、なんとなくでやってしまってたなぁ...
リポジトリって何個もあるなんて知らなかった....

## 参考

- [CentOSなどで使う、EPELってなんだ？](https://qiita.com/charon/items/f5732694515d174851b3)
- [EPELリポジトリ(レポジトリ)とは](https://livescamp.com/learn/epel#:~:text=EPEL%E3%81%AF%E3%80%81Extra%20Packages%20for,%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E6%8F%90%E4%BE%9B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82)
- [Available Repositories for CentOS](https://wiki.centos.org/AdditionalResources/Repositories)
- [Linux yum を基礎から理解する](https://www.kimullaa.com/entry/2020/01/19/101928)
- [yumとは？コマンドの使い方やリポジトリの指定、追加、一覧、rpmの違いなど](https://kitsune.blog/yum-summary)
- [CentOS : EPEL リポジトリ追加](https://server.etutsplus.com/centos-7-epel-repository-install/)
HTTPとHTTPSについて小学生でもわかるように説明してみた

##HTTPとは?
ホームページ(Webブラウザを起動して最初に表示されるページ)を見るときの使うルールの1つ。
正式名称はHyperText Transfer Protocol（ハイパーテキスト・トランスファー・プロトコル）
ホームページのファイルとかを受け渡しするときに使うルールです。これが俗にいう**通信プロトコル**です。



##通信プロトコルとは?
○○通信をするときは××なルールに従ってやり取りしようねという事。
プロトコルを日本人に例えると「会話する時は日本語使いましょう」みたいな感じ。
いきなり宇宙語で話されても99%の人が理解できないですよね?
会話1つとってもルールが自然と出来上がるものです。
![スクリーンショット 2020-11-02 23.06.28（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/dbe002cd-99df-93a3-ad2f-e2fe04f8a683.png)
##ホームページを見る時のルール
ホームページを見るときに使うWebブラウザ(Chromeなど)がホームページのファイルが置いてあるコンピュータ（Webサーバ）に「このページが見たい」とお願いを出します。この一連の流れにもルールが存在し、その名称がHTTPです。
![スクリーンショット 2020-11-02 23.07.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/ebd709ae-dd16-d3ec-fee8-38bfb7d2eb3b.png)



##HTTPだとどうなるのか?
通常のHTTPは通信内容が暗号化されておらず、悪い人によって通信内容の盗聴や改ざんが行われる可能性があります。暗号化とは言葉の通りデータを送受信する時に人に分からない内容に書き換える事です。例えば

>東京都新宿区西新宿２丁目８−１

というデータを送受信したら都庁だって1発でわかると思います。

![スクリーンショット 2020-11-02 23.10.07（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/6f10e040-3b90-09da-bc90-ecfe961d6502.png)

##HTTPSで暗号化してバリアの精度を上げる
では住所をわからないようにするにはどうしたらいいのか?そこでやり取りする内容を暗号化する、HTTPと似ているルールが新しく作られました。それがHTTPS化です。
先程の都庁の住所を暗号化したら下記のようになりました(今回はバイナリ→16進数を実施)
>1f8b08000000000000ff7b3677e3935d6b5e36ef7d366dc3d375fb9ff6ec7ab1743f84fd7ecfa4273b1a9fcf5ef77ecf8c471d93deef990800661b0fd42d000000

これを都庁の住所だと人にはわかりませんね。
![スクリーンショット 2020-11-02 23.11.37（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/acb4a444-f82d-7b8c-6a16-8fe48a12265c.png)

##HTTPSで身分証明証を作成する
HTTPSのもう1つのメリットとしてホームページの所有者の正確に主張することができます。
ドメイン(ネットの住所)の使用権があることを証明することもHTTPSの重要な役割です。
ドメインについては[こちら](https://qiita.com/miumi/items/030faeaebcf22a580899)をご覧ください。
この通信先のサーバが正当な所有者のものであることを保証するものを**SSLサーバ証明書**といいます。ざっくりとした言い方をすると

**自分は怪しいものではないです。ほらこれが身分証(SSLサーバ証明書を見せる)**

といった感じ。役所の窓口など身分証明証がないと利用できないサービスや施設がいくつか有りますよね。
ネットの世界も同じで悪い奴が増えたからHTTPS化してないサイトは危ないかも!?と警告を出すようにしました。
それがGoogleの2018年にHTTPサイトに警告表示です。詳しくは[こちら](https://webmaster-ja.googleblog.com/2018/07/marking-HTTP-as-not-secure.html)
ORACLE_SQLのIF文

#SQLにおけるIF文：CASE ~　WHEN
・「単純 CASE 式」と「検索 CASE 式」の2通りの記述方法がある。
・SELECT結果を条件に応じて表示する値を変えたり、条件にあうデータをUPDATEしたり出来る。


##書式
**単純CASE式**
条件判断の対象列が1つで、「~と等しい」という条件で利用。

```SQL
CASE 処理対象の列名
    WHEN 条件1 THEN 戻り値1
    WHEN 条件2 THEN 戻り値2
    ・・・
    ELSE　全条件に一致しないときの戻り値
END
```
**例文1**

```SQL
SELECT name,
       price * sold AS "売上高",
       CASE
           WHEN price * sold >= 5000 THEN '売れ筋商品'
           WHEN price * sold >= 3000 THEN '売上良好'
           ELSE '売上不調'
       END AS "評価"
FROM sales;

●実行結果
NAME       売上高      評価
----------------------------------
みかん      3500　　　　売上良好
バナナ      2000　　　　売上不調
いちご      6000　　　　売れ筋商品
```

**検索CASE式**
条件判断の対象が複数の場合や、「＝」以外の比較演算子を使いたい場合に利用。

```SQL
CASE 処理対象の列名
    WHEN 列名1　<比較演算子> 条件1 THEN 戻り値1
    WHEN 列名2　<比較演算子> 条件2 THEN 戻り値2
　　・・・・
　　ELSE 全条件に一致しないときの戻り値
END
```

**例文1**

```SQL
SELECT height, gender
       CASE
           WHEN height <= 150  THEN '子供'
           WHEN height <= 170  THEN '大人'
           WHEN gender = 'F'   THEN '女'
           WHEN gender = 'M'   THEN '男'
       　　ELSE　                    'その他'
       END status
FROM family;

●実行結果
HEIGHT    GENDER    STATUS
145       F         子供
160　　　　M         大人   
```
npx create-react-appで詰まったところ

##開発環境
・Mac catalina 10.15.7
・node v14.15.0
・npm 6.14.8

##エラー内容
npx create-react-appで開発をしようとしたところ

```
error Couldn't find package "@svgr/webpack@5.4.0" required by "react-scripts" on the "npm" registry

Error: Couldn't find package "babel-eslint@^10.1.0" required by "react-scripts" on the "npm" registry.

Error: Couldn't find package "babel-plugin-named-asset-import@^0.3.7" required by "react-scripts" on the "npm" registry.

Error: Couldn't find package "babel-jest@^26.6.0" required by "react-scripts" on the "npm" registry.

Error: Couldn't find package "@babel/runtime@^7.11.2" required by "eslint-plugin-jsx-a11y@^6.3.1" on the "npm" registry.
```
エラー文だけピックアップしました、
他にもパッケージが見当たらないよとのエラーがいっぱい出ました。

##解決方法

```
$ npm update
```
アップデートを実行して再び　npx create-react-app　をしたところできました。
Arch Linux に Minecraft をインストール

こちらのページを参考にしました。
[Minecraft](https://wiki.archlinux.jp/index.php/Minecraft#Java_Edition_.E3.82.B5.E3.83.BC.E3.83.90.E3.83.BC)

1) クライアントのインストール

```bash
yay minecraft-launcher
```

起動

```bash
minecraft-launcher
```

![minecraft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/40c65133-0fb0-da1e-1121-b47e37d93041.png)

Email とパスワードは公式ページで登録する必要があります。

2) Java Edition サーバーのインストール

```bash
yay minecraft-server
```

起動

```bash
sudo systemctl start minecraftd.service
```
30代　IT業界未経験者の転職活動進捗

某スクールカリキュラムを経て2020年10月の転職活動開始から1ヶ月。
同時期に転職活動開始した人で既に自社開発企業などへ内定をGETしている方もいる。
これから転職活動を行う30代overに向けて実際に1ヶ月求職活動をして思ったことを綴ります。
ポートフォリオは課題のままで自作アプリは未完成。

# 1.現在の状況（2020年11月時点）
|求人媒体|エントリー数|書類通過|一次通過|二次通過|内定|
|---|---|---|---|---|---|
|doda|37|2||||
|en転職|8|1|
|enｴｰｼﾞｪﾝﾄ|8|0|
|green|3|0|
|wantedly|7[^1]|4|1|
|type|30|3|1|||
|AMBI|2|0|
|キャリコネ転職|1|0|
|openwork|1|0|
|直接問合せ|6|2|
|某スクール|4|0|
|合計|107|12|2|0|0|

[^1]: wantedlyは「話を聞いてみたい」を倍以上押した中で返信があった数

上記以外に聞いたことのないエージェント経由で数十社応募していますが音沙汰なし
現状、ない内定。

# 2.応募の軸
・開発系でキャリアアップしたいと考える
YouTube動画の影響で　自社開発＞受託＞SES　の感じでエントリー
ゲーム、インフラ系など除外していた

法人営業など別業種求人は全てブロック、シャットアウト
会社評判、口コミは一応チェック
じっくり見ると気分が落ちていくので☆2以上であれば気にせずエントリー

# 3.企業研究
応募要項、HP、代表者、ポートフォリオ、求める人材象など簡単にノートにまとめた

# 4.考え方の変化
スクールの求人は週1、2社に対して80人近く応募殺到の高倍率
自分で見つけないとヤバイ、危機感が募る

- 直接企業の方から話を聞く
- エージェントから話を聞く
- YouTubeから情報を得る
- 勉強会、セミナーから情報を得る

下記は会社ごとに異なると思います、私見なのであくまで参考程度に
## 【人事担当者から聞いたこと】
- エージェント経由で入社が決まると、企業はエージェントへ年棒半年分程度を手数料として払う
- 無料の求人媒体に掲載するのも2、3週間で数百万近く費用がかかる
- ハロワは無料だが求職者の質がヤバイ（冷やかし応募も多い）
- 月に100エントリー以上来るが、採用枠1,2名が限度
- 実際にサービス開始しているポートフォリオが複数あればベスト
- ポテンシャル採用なので当然入社後も赤字スタート

## 【SES企業から聞いたこと】
- コロナショック後、開発案件減少
- インフラ案件はあまり影響がなかった
- チーム開発未経験者を開発案件に入れる難易度の高さ
- （経験者と抱き合わせ、報酬費用0円でも構わないなど各企業、工夫しているぽい）
- 5割リモートワークで客先ではなく自社で作業
- 客先常駐決まらず、社内に待機者がいる企業もある
- 案件参画時期は1週間以内に決まったり、半年以上後の場合もある
- 最初は客先常駐（運用保守管理、電波基地、家電販売、事務、コールセンターなど）へいく
- 実務経験重視、客先常駐の面談時、実務に関わる資格はPRするのに最低限いる
- （例：基本情報、javaシルバー、オラクルゴールドなど）
- 社内SNS、帰社日、社内研修、社外研修など各社独自にやっている（）

# 5.自分の立ち位置
- YouTube動画でボロクソに言われている情報弱者

- 同じ未経験なら新卒に近い子から優先される
- 大手の関連会社、中小企業中心に探すことになる（企業は費用をかけず採用したい）
- 求人サイトを使わない方が反応が良い気がする
- 前職業界と関わりある企業だと志望動機に一貫性を持たせやすい
- 平均年齢が若い、スタートアップ系企業はきつい
- 平均年齢が自分より上だと嬉しい
- WEB系開発企業がとても人気（穴場を攻めれば可能性が増えるかも）

 # まとめ
書類選考で落ちまくっている時が辛かった
一次選考、面接で（ダメそうと思ったら）人事の方に半ば相談気味に情報収集
自分を欲しいと言ってくれる企業に会えればオールOK
落ち込んだり、悩んだりするより問題解決に向けて仮説、検証、実践あるのみ！

:::note 
「如何に自分を営業していくかが大切
　1日も早く働き出せるようにみなさん頑張りましょう」
:::

昼夜逆転生活で眠れなかったので書きました。
感想、意見などコメントいただければ幸いです。
tar の --transform オプションは有能


## TL;DR

- パスを正規表現で置換すればいかようにも展開できる
- Dockerのファイル展開とか一行でシュッと書けて楽になるよ

## Examples

説明のためのhoge.tar.gzの中身

```
$ tar ztf hoge.tar.gz
hoge/
hoge/dist/
hoge/dist/index.html
hoge/dist/index.js
hoge/LICENSE
hoge/README.md
hoge/src/
hoge/src/include/
hoge/src/include/util.h
hoge/src/main.cpp
hoge/src/main.h

```

- hoge/無しに直接展開したい。--strip-components=1 と等価。
  - EXPRESSION末尾のxで正規表現を指定できる。

```
$ tar zxvf hoge.tar.gz --transform="s,^[^/]+/,,x" --show-transformed-names
hoge/
dist/
dist/index.html
dist/index.js
LICENSE
README.md
src/
src/include/
src/include/util.h
src/main.cpp
src/main.h
```

- hoge/ではなくhuga/がいい。ルートディレクトリ名の変更 

```
$ tar zxvf hoge.tar.gz --transform="s,^[^/]+,huga,x" --show-transformed-names
huga/
huga/dist/
huga/dist/index.html
huga/dist/index.js
huga/LICENSE
huga/README.md
huga/src/
huga/src/include/
huga/src/include/util.h
huga/src/main.cpp
huga/src/main.h
```

- .hは.hppに、.htmlは.htmに変えよう。;で複数の変換を並べる。

```
$ tar zxvf hoge.tar.gz --transform="s,\.h$,.hpp,x;s,\.html$,.htm,x" --show-transformed-names
hoge/
hoge/dist/
hoge/dist/index.htm
hoge/dist/index.js
hoge/LICENSE
hoge/README.md
hoge/src/
hoge/src/include/
hoge/src/include/util.hpp
hoge/src/main.cpp
hoge/src/main.hpp

```

- *.hや*.cppは捨てよう。/dev/nullの活用。

```
tar zxvf hoge.tar.gz --transform="s,.*\.(h|cpp)$,/dev/null,x" --absolute-names --show-transformed-names
hoge/
hoge/dist/
hoge/dist/index.html
hoge/dist/index.js
hoge/LICENSE
hoge/README.md
hoge/src/
hoge/src/include/
/dev/null
/dev/null
/dev/null
```

## 応用例

SDL2の各種ライブラリからbin/、include/、lib/以下を抜き出して直下に配置する。

```
$ ls
SDL2-devel-2.0.12-mingw.tar.gz  SDL2_image-devel-2.0.5-mingw.tar.gz
$ find -name "SDL2*.tar.gz" | xargs -I{} tar zxvf {} --transform="s,^[^/]+/x86_64[^/]+/(bin|include|lib),\1,x;s,^SDL2,/dev/null/,x" --absolute-names --show-transformed-names
...
$ ls 
SDL2-devel-2.0.12-mingw.tar.gz  SDL2_image-devel-2.0.5-mingw.tar.gz bin include lib
```

## あとがき

存在しないディレクトリとかtarが適当に用意してくれます。mkdirもcpもmvも不要で楽です。
すばらしいfind/47サイトの画像をPythonを使って取得する(その2/2: 対象リストをgithub公開しました)

##記事公開後の追記
githubリポジトリに、スケルトンとして、jpg以下、地域(地方)別-都道府県別の空フォルダをアップロードしました(2020/11/3, 11:30)。これで少し手間が省けたかと思います。

##前回の記事を受けて
[前回の記事](https://qiita.com/dk4130523/items/c2555a8e45bcea7179e8)を受けて、対象リストをgithubで公開しました。スクリプトを公開してむやみに[find/47](https://find47.jp/)へのアクセスを増加させるよりも当方が取得して参考公開したほうがいいと判断しました。画像はオープン投稿ではなく審査方式であり、1080枚でいったん落ち着いているようですので、当面はこれで十分でしょう。

- https://github.com/cj3029412/find47-image-url-index

###ファイルの説明
02.csvが、簡単なスクリプトを書いて画像を得るのに簡便かと思います。

- 第1列:ダウンロード先(取得元)URL
- 第2列:直下jpgディレクトリに、地域と都道府県別にダウンロードzipファイルを保存する場合の指定例(find/47の階層を忠実に再現したもの。githubリポジトリにスケルトンを用意したので、よろしければお使いください)

01.csvは、02.csvの原型です。前回の記事のアウトプットがこれです。

- 第1列:find/47が使用する地域分類コード。0が北海道、7が九州沖縄
- 第2列:find/47が使用する都道府県コード。0が北海道、46が沖縄
- 第3列:find/47が画像に固有付与している識別名
- 第4列:xl,l,m,sのうち提供されている(ダウンロード可能な)最大サイズ。xlまでは不要、保存容量を節約したいといった場合は、ここをsに変えてください。ざっと調べたところ、サイズsとサイズmはすべての画像で提供されているようです。サイズlは(一部ですが)提供されていない画像があります。

壁紙目的であれば、地域や都道府県ごとに段階的に取得する、あるいは指定整数倍のindex行だけFizzBuzzぽく取得するなどが、お勧めです。

と、以上、CSVファイルの中身とこの説明だけを見て、画像取得の実装がピンと来る方のみお使いいただければという素っ気ない説明でした。ご理解のほど。

##注意事項
02.csvを使ってこのまま画像を取得すると1080枚の画像が、各画像の取得し得る最大解像度(多くはXL)で得られます。この場合の必要ストレージ容量は10GB前後あるいはそれ以上です。ダウンロードしたzipファイルには画像のjpegファイルと説明のtxtファイルが含まれ、元のzipとtxtを削除し、jpegのみ残す場合でも、およそ10GBが必要になります。また、十分なアクセスウェイトを置いて1080枚すべての画像を取得する場合、僕の運用では、完了までに1晩(8-10時間程度)かかりました。画像は、zipから取り出したままの状態のファイル名とサイズの参考に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159724/a2b34501-ba66-9360-2345-300994961f55.png)

##補足
当方、1080枚から増えていないかときどき最新状況を確認し、githubでリストを更新していく予定です。また、次回2+回の記事を最終回とし、[variety](https://peterlevi.com/variety/)を使用して壁紙を自動変更する設定に軽く触れます。
AnsibleでGithubのプライベートリポジトリを取得する方法

クラウド上にIaC(Infrastructure as Code)、TerraformとAnsibleを利用してネットワークとインスタンスを自動構築させる中で、Githubプライベートリポジトリのコードを取得する必要があり、以下の方法で実現した。どなたかの参考になれば幸いです。

[最終版のgistはここです。](https://gist.github.com/yasuflatland-lf/9956bf000a69b30e92a227b6f82327d8)

### 前提条件
以下がインストール済であること

- Ansible 2.7.7
- Git 1.2.20

### テスト環境
- Debian 10 (GCEのVMインスタンス）
- Mac

### Github Access Tokenの取得
1. `Settings -> Developer Settings -> Personal access tokens`へ移動
2. `Generate new token`で新規鍵を生成
3. 表示されるAccess Tokenを書き留める。**作成された直後の一度しか表示されない。書き留め忘れた場合は再生成してください。**

### ansible-pullを利用して取得
[最終版のgistはここです。](https://gist.github.com/yasuflatland-lf/9956bf000a69b30e92a227b6f82327d8)ファイルが２つありますが、ここではコードの詳細な説明をしていきます。

```cmd.sh
ansible-pull -e 'ansible_python_interpreter=/usr/bin/python3' \
-U https://<上記で取得したGithub Access Token>:x-oauth-basic@github.com/<組織名>/<プライベートリポジトリ名> \
-d /tmp/<プライベートリポジトリ名> ./local.yml
```

- `ansible_python_interpreter`ですが、環境によって`Python`がインストールされるディレクトリが異なるかと思います。`Ansible`はデフォルトだと`/usr/bin/phthon`を見に行ってしまうので、何も指定しないと、実行時にエラーが表示されることがあります。必要であればこのように利用するバイナリの場所を指定してあげます。
- `Github Access Token`を指定する部分は、セキュリティ的によろしくないので、直にトークンを書き込むのではなく、環境変数などに詰めて渡してください。
- 組織名のところですが、組織でない場合、ここは個人名でもいけるのかは試していません。
- `-d /tmp/<プライベートリポジトリ名>`の部分は、出力先の任意のディレクトリを指定してあげてください。上の例では便宜上、tmpディレクトリの下に展開しているだけです。

```local.yml
---
- hosts: all
  vars:
    ansible_python_interpreter: /usr/bin/python3
  become: true
  become_method: sudo
```

- `ansible-pull`は何かしらAnsibleのプレイブックが必要なので、ここではダミーとして`local.yml`を渡しています。中身は何も実行しないのであればどんな記述でも構いません。

###おまけ
Ansible, Terraformで上記のコードを利用する場合、値を環境変数に設定する必要があるとおもうが、参考として取得方法を以下にメモしておきます。

#### Ansibleでの環境変数取得方法

`ansible_env`で値が取れる。例えば`image_id`という環境変数が設定されていれば、`ansible_env.image_id`　として取得できる。
公式資料 : [Module Index](https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html)

#### Terraformでの環境変数取得方法
`TF_VAR_名前`、例えば`TF_VAR_image_id`というように設定すると、環境変数として、`*.tf`ファイル内部で`var.image_id`という形で取得できる。
公式資料 : [環境変数の設定方法](https://www.terraform.io/docs/commands/environment-variables.html#tf_var_name)
pivot_tableの簡単なサンプルです。


#テストデータ
```

data=[
{"日付":"1/2" , "氏名":"山田" ,"デザート" : "りんご"  ,"おかず"  :"餃子" },
{"日付":"1/3" , "氏名":"山田" ,"デザート" : "りんご"  ,"おかず"  :"餃子"   },
{"日付":"1/4" , "氏名":"山田" ,"デザート" : "ばなな"  ,"おかず"  :"煮魚"   },
{"日付":"1/5" , "氏名":"山田" ,"デザート" : "りんご"   ,"おかず"  :"餃子"  },

{"日付":"1/2" , "氏名":"佐々木" ,"デザート" : "ミカン"   ,"おかず"  :"餃子"  },
{"日付":"1/3" , "氏名":"佐々木" ,"デザート" : "りんご"   ,"おかず"  :"餃子"  },
{"日付":"1/4" , "氏名":"佐々木" ,"デザート" : "りんご"   ,"おかず"  :"餃子"  },
{"日付":"1/5" , "氏名":"佐々木" ,"デザート" : "りんご"   ,"おかず"  :"シチュー"  },

]

import pandas as pd
df=pd.DataFrame(data)
df

    日付   氏名 デザート   おかず
0  1/2   山田  りんご    餃子
1  1/3   山田  りんご    餃子
2  1/4   山田  ばなな    煮魚
3  1/5   山田  りんご    餃子
4  1/2  佐々木  ミカン    餃子
5  1/3  佐々木  りんご    餃子
6  1/4  佐々木  りんご    餃子
7  1/5  佐々木  りんご  シチュー

```

#「氏名」毎の「デザート」を数えます。

```
df.pivot_table(values= 'おかず', index='氏名', columns='デザート' , aggfunc="count" , fill_value=0)
```
values= 'おかず'を入れないと残っているcolumns毎に集計される 
aggfunc="count" で件数
fill_value=0　を入れないと0件のところがNaN  になる。

# 結果

```
デザート  ばなな  りんご  ミカン
氏名                 
佐々木     0    3    1
山田      1    3    0
```


参考
[note.nkmk.me](https://note.nkmk.me/python-pandas-stack-unstack-pivot/)
[pandas.pivot_table](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html)
PC-8001のディスプレイ

昔買ったPC-8001を久しぶりに使えないか考えてみました。

当時グリーンディスプレイを使っていたのですが、壊れてしまって表示できません。

PC-8001のカラーディスプレーは15K RGBなのですが、これを現代の表示機器に写すには。

15K RGB -> VGA
15K RGB -> NTSC(コンポジット/S端子)
15K RGB -> D端子
15K RGB -> HDMI

などの作戦があります。

いろいろ調べて見るとLCDディスプレイを使う方法は以下があるようです。

1. 15K対応のディスプレイに接続する
2. アップスキャンコンバーターを使う
3. PC-8044(家庭テレビ用カラーアダプタ)か相当品([秋月が互換キット](https://twitter.com/gorry5/status/1129281355957694465)を販売していたようです)を使いNTSCが表示できるディスプレイを使う

1はケーブルの自作が必要で、2はAmazonなどで購入する必要があり、3はオークションなどで入手するか自作するかで、どれもすぐにはできません。

AD724や[AD725を使って](http://rklab.fc2web.com/crim/kousaku/ad725_video_encoder/)もNTSCで表示できるようです。

PlayStation Iにもチップがのってたみたいなんですが、知らずに捨てちゃいました。

昔は秋月でCXA1645Pの取り扱いがあったようですが、すでに無いようなのでISAのボードのCXA1645を[再利用する方法](http://niga2.sytes.net/msx/RGBYC.html)もヒントになりそうです。

[CLDPでRGBをコンポジットにする](https://picavr.uunyan.com/vhdl_composite.html)実験もありました。

USER'S MANUALを読んでいたところ白黒CRTインターフェースにコンポジット信号(VIDEO OUT)が出ている事に気がつきました。

|端子番号|信号名||方向|
|:--|:--|:--|:--|
|1|VDD|+12V|出力|
|2|GND|信号グランド||
|3|VIDEO OUT|ビデオ出力信号|出力|
|4|HSYNC|水平同期信号|出力|
|5|VSYNC|垂直同期信号|出力|

付属のケーブルでNTSCが表示できる[壊れたサムスンのディスプレイ](https://qiita.com/yamori813/items/738f704efdc9b6a63bc5)につないでみました。

![IMG_20201103_051004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4c8693f4-46fa-8ecf-0ad5-29615d702657.jpeg)

三十数年ぶりのご対面です。

当時のカタログを見てみたのですが、家庭用テレビを使う場合はアダプタ(PC-8044)が必要としか書いてないです。

1000円くらいのFPGAでアップスキャンコンバーター作れないかな？

画面の解像度は430x262くらいのようです。
pyenvでPythonのAnaconda環境構築

Homebrewを使用します｡

1, pyenvのインストール


```Terminal.
$ brew install pyenv
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$exec $SHELL -l
```

2, Python(Anaconda)のインストール

Python 3系を今回は使用します｡

```Terminal.
$ pyenv install anaconda3-2019.10
$ pyenv global anaconda3-2019.10
```

3, バージョン確認

```Terminal.
$ pyenv versions
```

4, まとめ

```
# インストール可能な一覧
$ pyenv install -l

# インストール
$ pyenv install バージョン

# すべてのフォルダで実行
$ pyenv global バージョン

# 特定のフォルダで実行
$ pyenv local バージョン
```

5, Anaconda コマンド

```
# ヘルプ
$ conda -h

# 仮想環境のリスト
$ conda info -e

# 仮想環境作成
$ conda create -n 環境名 
$ conda create -n 環境名 python=バージョン

# 仮想環境を切り替える
$ activate 環境名

# 仮想環境を終了する
$ deactivate

# 現在の仮想環境のパッケージ全リスト
$ conda list
```
VS CodeでApache Flexのデスクトップアプリをデバッグする

# はじめに

Visual Studio Code（VS Code）を使って、Apache Flexのデスクトップアプリをデバッグします。

## VS Codeでのデバッグイメージ

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/4d803b21-7e5c-9974-cb70-298a9f333dbb.png)

## 試した環境/バージョン

- VS Code 1.50.1
- Windows 10
- Apache Flex 4.16.1
- Adobe AIR 32.0.0.116

# 事前準備

以下を実施していること

- [Apache FlexでHelloWorldアプリを作り、配布できるようにパッケージングするところまで（AIR for Desktop）](https://qiita.com/lune1122/items/b58b7580666b74e4c19d)

VS Codeに以下の拡張機能をインストールしていること

- [ActionScript & MXML](https://marketplace.visualstudio.com/items?itemName=bowlerhatllc.vscode-as3mxml)
- [Debugger for SWF](https://marketplace.visualstudio.com/items?itemName=bowlerhatllc.vscode-swf-debug)

# アプリのデバッグ

## asconfig.jsonの作成

```asconfig.json
{
	"config": "air",
	"compilerOptions": {
		"output": "Main.swf",
		"debug": true
	},
	"application": "application.xml",
	"files": [
		"src/Main.mxml"
	]
}
```

## .vscode\launch.jsonの作成

```.vscode\launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "swf",
      "request": "launch",
      "name": "Launch SWF"
    }
  ]
}
```

## デバッグ

VS CodeでMain.mxml等があるフォルダーを開く

Ctrl + Shift + Enter を押下する

Quick Compileによりコンパイルが行われて、アプリがデバッグで起動する

※VS Codeのキーボードショートカットの設定で、Ctrl + Shift + Enterを別のキーに変更すると楽かもしれません。（個人的にはF6に変更しています）

## 補足：Quick Compileについて

ActionScript & MXMLの拡張機能による機能です。
コンパイルに関する情報をVS Codeのメモリに保持することで、2回目以降のコンパイルを通常よりも速く行うための機能のようです。
2倍ぐらい速くなっているように思います。

とりあえず今回はここまで
Java9から追加されたStreamクラスのiterateメソッドの第三引数でインクリメント

#概要
本記事はJava9から追加されたStreamクラスのiterateメソッドの第三引数でインクリメントした際の挙動についてまとめたものです。
#1.Streamクラスの入力引数を三つ持つiterateメソッドについて
Streamクラスの入力引数を三つ持つiterateメソッドの使い方として、以下のようなコードで紹介されるのをよくお見かけします。

```java:Stream.iterate使い方のサンプルコード
// ０～９までの数値を出力するコード
Stream.iterate(0, i -> i < 10, i -> i + 1).forEach(System.out::println);
```
```:実行結果
0
1
2
3
4
5
6
7
8
9
```
iterateメソッドの引数はそれぞれ以下の通りです。
**第一引数**:初期値
**第二引数**:次のStreamの要素を返すための条件を返却するクラス（サンプルコード上はラムダ式で記載）
**第三引数**:次のStreamの要素を返却するクラス(サンプルコード上はラムダ式で記載)
従来のfor文に書き直すと以下のようになります。

```Java:サンプルコードを従来のfor文に書き直したコード
for (int i = 0; i < 10; i++) {
     System.out.println(i);
}
```
初めて知った当時はStream APIでfor文ライクなものが使えると感動しました。

JavaのAPIドキュメントは以下のリンク先です。
[JavaのAPIドキュメントよりStream.iterateの仕様](https://docs.oracle.com/javase/jp/9/docs/api/java/util/stream/Stream.html#iterate-T-java.util.function.Predicate-java.util.function.UnaryOperator-)
#2.第三引数でのインクリメント
第三引数についてインクリメントを使わずにi->i+1でよく説明されることについて疑問に思い、以下のような記載をしました。

```java:サンプルコードの第三引数を書きかえたコード？
Stream.iterate(0, i -> i < 10, i -> i++).forEach(System.out::println);
```
すると実行結果は以下のようになりました。

```:実行結果
0
0
0
0
0
0
0
0
～～～～～～～～～～～～～～～～～～～～～～
以下、延々と０が出力され続けるため省略
～～～～～～～～～～～～～～～～～～～～～～
```
i=0のまま結果が出力されることになり、無限ループが発生します。
Stream.classで第三引数に指定したUnaryOperatorクラスのapplyメソッド(サンプルコード上ではラムダ式で記載)を利用しているため、第三引数で値をインクリメントする前に返却してるのですね。
どうしてもインクリメントにしたい場合は以下のように後置から前置に書き直す必要があります。

```java:サンプルコードの第三引数を書きかえたコード
Stream.iterate(0, i -> i < 10, i -> ++i).forEach(System.out::println);
```
#おわりに
インクリメントについてこのような特徴があるから紹介するときはi->i+1で書いてるのかもしれませんね。
個人的に書く場合はインクリメント使いそうです。
そもそも私は9以降のJavaについて個人でしか使ってませんが……
【Qiitaマークダウン】nCrの書き方

##nCrの書き方

${}_nC_r$の書き方が分からなくて少し困ったのでメモとして残しておきます。
 
 
> \`\`\`math
> {}_nC_r
> \`\`\`

```math
{}_n C_r
```

　



下付き文字の使い方を応用して{}_nとしているだけですね。

##参考記事
[Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)
Optitrack（motive）からVRMモデルへデータのストリーミング

参考文献　Optitrack wiki
https://v22.wiki.optitrack.com/index.php?title=OptiTrack_Unity_Plugin
IBUKI blog
http://studioibuki.blogspot.com/2019/08/optitrackunity.html

#どうして記事にまとめるのか
VRMをOptitrackで使うのは難しいと聞いていたけれど、意外とそうでもなかったので、忘れないうちにメモ
とりあえず、動けばいいという人向け

#使用するもの
motive
Unity
VRMモデル
UniVRM

#手順

0.motiveセットアップ
Skeleton CoordinatesをLocalにする。
Bone Naming Conventionをmotive

1.ファイヤーウォールを叩き切る。

2.Unityを立ち上げる。

3.UniVRMをimportして、モデルデータを読み込む。

4.適当なGame objectを作り、そのGame objectの中にモデルデータを入れます。

Game object
L モデルデータ

以上の並びになっているはずです。

5.Game objectにOptitrackStreamingClient、モデルデータにOptitrackSkeletonAnimatorをアタッチする。

6.OptitrackStreamingClientのlocal addressとServer AddressにMotivePCのIPアドレスを書き込む。

7.OptitrackSkeletonAnimatorのSkeleton aseet nameにMotiveで付けたスケルトンの名前を入れる。
Destination Avatarのところにモデルの.Avatarを入れる。

8.元々モデルについてたアニメーションをオフにする。

9.Unity 再生
Node.jsについて簡単に解説(学習まとめ)

##はじめに

今更ながら、今回は「Node.js」について解説していこうと思います。
それでは早速、お付き合いのほど、よろしくお願いいたします。

##本文

「Node.js」とは、サーバーサイドでJavaScriptを実行する環境(’エンジン’とでもいうべきもの)で、内部にChromeのJavaScript実行エンジンである「V8」を持ちます。
ApacheやNginx上で動作します。(※Node.js単体でも動作します)(※Node.jsでWebサーバーを作ることもできます)。
「ノンブロックIO」と「イベントループ」という二つの仕組みで大量のアクセスを捌くことができます。したがってリアルタイムで高速に動作します。
「ノンブロックIO」とは、ハードディスク(≒データベース)などへのアクセスでブロック(処理が完了するまでの待機動作)を発生させないということです。したがって、データの取り扱いは非同期に行われます。
「イベントループ」とは、外部からのアクセスをイベントとみなして、そのイベントを順次処理していく(発生順にキューに格納してから、これを順番に取り出して処理していきます)。
Node.js本体は、このイベントループをシングルプロセス＆シングルスレッド上で実現しており、決められたポートの背後で、外部からのアクセス(＝イベント)を待ち受けていて、実際にイベントが発生するとこのループの中でイベントを”ガチャガチャ”と処理していく流れとなります。
Node.js本体は動作が軽く、一度に大量のアクセスを捌けるため、スマホアプリやWebサービスに使われます(これらの土台として活躍してくれる)。
クライアントサイドでの実行ではセキュリティの都合上、ファイルシステムなどのOSの一部の機能にアクセスできませんが、サーバーサイドのJavaScriptであるNode.jsでは、これが可能となります。
ちなみに、クライアントサイド(＝ブラウザ上)と比較すると、多少コードの書き方に違いがあります。


##おわりに

今回はNode.jsについて簡単に解説してみました。
いかがでしたでしょうか？
また懲りずに記事を書いていこうと思います。
それではまた。
DNSキャッシュのクリア

```sh
# Yamaha
show dns cache
clear dns cache

# windows
ipconfig /flushdns

# ubuntu
sudo systemd-resolve --flush-caches

# mac
sudo killall -HUP mDNSResponder
```


```sh
# chrome
chrome://net-internals/#dns

-> "Clear host cache" ボタンを押下
```

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/985ba040-16f8-da9d-57dd-f603c7627127.png)
Goのグローバル変数とスコープでハマった話

グローバル変数使わないといけないときってありますよね。たとえば、テストのときの初期化に必要ですよね(今回はこれでハマった)
あとで私がハマった現実的なシチュエーションを説明します(たぶん、同じことでハマった人100人くらいはいる)がひとまずクイズ形式で気楽にいきましょう。

## クイズ
皆さんは以下のmain関数の出力は何だと思いますか？

```go
package main 

import (
	"fmt"
)

var global string

func main(){
	global = "initial state"
	fmt.Println(global)
}
```
「馬鹿にしてるのか？」という声が聞こえてきそうですね。
念のため答えは

```console
initial state
```
です。
じゃあ、次はこちらです。(次からimportとかは省きます)答えを予想してくださいね？

```go
var global string

func main(){
	global = "initial state"
	global ,err := double()
	if err != nil{}
	fmt.Println(global)
}

func double()(string,error){
	return "double",nil
}
```

まだ、簡単です。
答えは

```console
double
```

です。
さて、ここで出力された`global`は本当にグローバルで定義された`global`なのでしょうか？
ちなみにこのような書き方をする例としてグローバルに定義した`*sql.DB`なんかがあります。(私はこういう書き方をした場合には未定義のerrだけが新しく定義されると思ってました。)
次が本題になります。

```go
var global string

func main(){
	global = "initial state"
	global ,err := double()
	if err != nil{}
	mistake()
	fmt.Println(global)
}

func double()(string,error){
	return "double",nil
}
func mistake(){
	global = "mistake"
}
```
答えは`mistake`と`double`のどちらだと思いますか?
正解は

```console
double
```
です。
`mistake()`のなかの`global`とmain関数の中で`:=`を使ってしまった`global`とは別の変数として扱われるようです。こうなるとmain関数の中からグローバルな`global`を参照する方法はあるんでしょうか...

## いつ困るか?
こんなクイズみたいな状況いつ困んねんって感じですがかなり現実的な状況でかなり困りました。
下の例を見てください。テストで使う`*sql.DB`を初期化をするための`setUp`関数を定義しています。
でも、これだとグローバルな`Db`とは別の`setUp`関数の中だけの新しい`Db`が定義されてグローバルな`Db`は更新されないんですよね。

```go
var Db *sql.DB
func TestMain(m *testing.M){
	var t *testing.T
	setUp(t)
	code := m.Run()
	tearDown()
	os.Exit(code)
}
func setUp(t *testing.T){
	Db, err := sql.Open("mysql", "mysql:mysql@/mission")
	if err != nil {
		t.Error("Error: Could not connect database",err)
	}
}
```

なので、こう書かなくてはなりません。(ベストプラクティスかどうかは知らない。)

```go
var Db *sql.DB
func TestMain(m *testing.M){
	var t *testing.T
	setUp(t)
	code := m.Run()
	tearDown()
	os.Exit(code)
}
func setUp(t *testing.T){
    var err error
	Db, err = sql.Open("mysql", "mysql:mysql@/mission")
	if err != nil {
		t.Error("Error: Could not connect database",err)
	}
}
```
これでSetup関数の中で`Db`が新しく定義される問題を回避することができ、テスト全体で共通の`Db`を使えるようになりました。

## まとめ
言語の仕様を理解していないと思わぬところでハマってしまいますね。
【そろそろ冬なので】CPU温度を調べるコマンドと熱くなったMacを冷ます方法

# 目次
1. [やたら熱かったので。](#anchor1)
1. [CPU温度の測り方](#anchor2)
1. [適切なCPU温度](#anchor3)
2. [熱かった場合の対処法](#anchor4)

<a id="anchor1"></a>

# やたら熱かったので。
Dockerを使用しているくらいでとくに重たそうなことはしていないのに、
やたら熱くなっていたので温度を知りたくなった。

<a id="anchor2"></a>

# CPU温度の測り方

```
$sudo gem install iStats -n /usr/local/bin
$istats
```

そうすると、こんな感じの画面が表示されます
![スクリーンショット 2020-11-03 1.11.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320677/4e508ba5-888f-b30b-e6f1-38285f61d584.png)

GitHubはこちら
https://github.com/Chris911/iStats

<a id="anchor3"></a>

# 適切なCPU温度
CPU温度の目安は
低負荷時は40℃～50℃、中負荷時は50℃～60℃、高負荷時には60℃～、という感じらしいです。

<a id="anchor4"></a>

# 熱かった場合の対処法
１、重たいアプリを止める。
２、涼しい部屋で使用する。
MacBook proなどは、周辺温度が１０度〜35度の場所で使うようにと、公式で書かれているそうです。
３、充電をしている場合は充電をやめる。

❌氷や保冷剤を使って冷却する。
保冷剤などを使用した場合は、MacBook内部が結露してしまい、水没に近い状態になるらしいです。

# まとめ
冬になると暖房などで室温も高く、作業も年末に向けて大詰めになってきます。
適切な管理をしてPCを大切にしたいですね。


引用:
https://tanweb.net/2018/04/04/20433/#:~:text=%E4%BD%8E%E8%B2%A0%E8%8D%B7%E6%99%82%E3%81%AF40,%E3%81%AB%E3%81%AF%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%81%AF%E3%81%9A%E3%81%A7%E3%81%99%E3%80%82

https://apple-like.xyz/macbook-pro%E3%81%8C%E7%86%B1%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95%E3%80%904%E9%81%B8%E3%80%91/
福岡県の Go To EATの加盟店一覧をスクレイピングしてCSVに変換

[Go To Eatキャンペーン福岡](https://gotoeat-fukuoka.jp/)は[こちら](https://gotoeat-fukuoka.jp/csv/fk_gotoeat_UTF-8.csv)にCSVデータであるのでジャンルを変換

```python
import pandas as pd

df = pd.read_csv("https://gotoeat-fukuoka.jp/csv/fk_gotoeat_UTF-8.csv")

df["13.店舗情報ジャンル"] = df["13.店舗情報ジャンル"].replace(
    {
        1: "和食・寿司",
        2: "洋食",
        3: "中華料理",
        4: "フレンチ・イタリアン",
        5: "ラーメン・餃子",
        6: "焼肉・ホルモン・韓国料理",
        7: "すき焼き・しゃぶしゃぶ",
        8: "アジア・エスニック・各国料理",
        9: "カフェ・スイーツ",
        10: "ファミリーレストラン・食堂",
        11: "居酒屋",
        12: "バー・ダイニングバー",
        13: "ファーストフード",
        14: "うどん・そば・丼",
        15: "その他",
    }
)

df.to_csv("fukuoka.csv", encoding="utf_8_sig")
```
ERESOLVE unable to resolve dependency treeの解決方法

### 背景

Dockerのnodeコンテナ内で、create-react-appでReactプロジェクトを作成し、
その後にmaterial-uiをインストールしようとしたときに、発生したエラーでした。

※調べてみた感じ、npm installで、インストール元のパッケージのバージョンが最新(latest)で、
インストールするパッケージの最新バージョンが同等(peer)でなかったときに発生するエラーのようでした。

## 結論

そのライブラリを**インストールしたい**場合は、npm installのあとに、**--save --legacy-peer-deps**を追加してあげましょう。
もしくは、インストール元のプロジェクトの**ダウングレード**を検討しましょう。。

## 経緯

```bash
# material-uiをインストールしようとしたら。。
npm install @material-ui/core
```

```bash
# このようなエラーが発生。。
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: my-app@0.1.0
npm ERR! Found: react@17.0.1
npm ERR! node_modules/react
npm ERR!   react@"^17.0.1" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0" from @material-ui/core@4.11.0
npm ERR! node_modules/@material-ui/core
npm ERR!   @material-ui/core@"*" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR! See /root/.npm/eresolve-report.txt for a full report.
```

上のログを確認すると、reactのバージョンが17.0.1であるのに対し、
material-ui/core@4.11.0がサポートしているreactのバージョンは16.8.0でした。（＝最新のReactプロジェクトに対応していない。）
なので、依存関係を解決できずエラーになって、インストールができないことに。。

ここで、npm install のあとに、オプションで、**--save --legacy-peer-deps**を追加しました。
すると、インストールが無事に完了します。

npm installする際に、インストールするライブラリのバージョンが、インストール先のプロジェクトのバージョンに対応していない場合、
オプションで、**--legacy-peer-deps**を使うことで、半強制的に？installできるようになるようです。
ただ、インストール後に、そのパッケージが期待通りに正しく動くかを、しっかり確認する必要がありそうです。

```bash
npm install --save --legacy-peer-deps @material-ui/core

added 29 packages, removed 2 packages, and audited 1720 packages in 18s

117 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
```

## 所感

ライブラリを使うときは、そのライブラリの最新版が、どのバージョンと対応しているのか、
実装する前にしっかり調べておくべきなんだなー、、と改めて感じました。
安直に最新版！はアブナイ。。

参考になった記事：https://github.com/mui-org/material-ui/issues/23306
curl を最新版にアップデートする方法

[curlのメモリリーク](https://qiita.com/CloudRemix/items/a918367f980fed714d1e)が止まらないので、curlを最新版にアップデートする。

# city-fanリポジトリを使う

現バージョンを確認

```
$ curl -V
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.44 zlib/1.2.7 libidn/1.28 libssh2/1.8.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets 
```

リポジトリを追加して、yum -y install ただそれだけ

```
rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/rhel7/x86_64/city-fan.org-release-2-1.rhel7.noarch.rpm
yum -y install libcurl libcurl-devel --enablerepo=city-fan.org
```

バージョンアップを確認

```
$ curl -V
curl 7.73.0 (x86_64-redhat-linux-gnu) libcurl/7.73.0 NSS/3.44 zlib/1.2.7 libpsl/0.7.0 (+libicu/50.1.2) libssh2/1.9.0 nghttp2/1.33.0
Release-Date: 2020-10-14
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz Metalink NTLM NTLM_WB PSL SPNEGO SSL UnixSockets
```
.git/indexが壊れたときの対処法



soucetree上でブランチを切り替えようと思ったらエラーが発生してどのブランチにも移動できなくなってしまった

## エラー文

```
'git status' failed with code 128:'error: bad signature
fatal: index file corrupt
```
index fileが破損しているようだ。


```
$ git status
error: bad signature
fatal: index file corrupt
```
ターミナルでも同様のエラーを確認


## 解決方法
1. indexファイルを削除する
1. `git reset`で前の状態に戻す

```
$ rm .git/index
$ git reset

It took 4.00 seconds to enumerate unstaged changes after reset.  You can
use '--quiet' to avoid this.  Set the config setting reset.quiet to true
to make this the default.
```
## 再度git statusで確認
```
$ git status 
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean 
```

これで無事にブランチを切り替えられるようになりました


## まとめ
なぜ.git/indexが破損したのかは不明だが、一旦削除し元に戻すことで解決できた。


## 参考
[Gitリポジトリのインデックスが壊れたら](http://www.nowhere.co.jp/blog/archives/20130822-205501.html)
[【Git入門】resetでコミットを取り消す方法を解説！](https://www.sejuku.net/blog/71512#:~:text=git%20reset%E3%81%A8%E3%81%AF%E3%80%81%E4%B8%80,%E3%81%AB%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%99%E3%80%82&text=git%20reset%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E4%B8%BB,%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
Visual Studio 2019のショートカット メモ

# 時は金なり

仕事の成果は技術力だけでは決まりません。
コミュニケーションや段取り等が最も重要ですが、
技術的スキルは長期的に見て費用対効果が高いため
早いうちに身に着けたほうが得です。

最近、そんなことを痛感して日々小さな改善に取り組んでいます。
仕事ではVisualStudioを常に使っているわけですが、
最近学んで役にたったショートカットを共有します。
私と同じような下流工程に携わるエンジニアにとっては役に立つかと思います。

## VisualStudio 2019のショートカット

### 参照系
コードリーディングで役に立ちます。

| キー | 内容 |
|---|---|
| F12 | 定義へジャンプ |
| Shift + F12 | 参照をすべて表示 |
| Alt + F12 | 定義をカーソル下に表示 |
| Ctrl + F12 | 実装にジャンプ |

特に
・「F12」での定義へジャンプと
・「Shift + F12」での参照をすべて表示がとても便利でした。
それまではマウスカーソルで関数定義まで移動していたので非常に時間がかかり、
なによりとてもストレスでした。

### 移動系

| キー | 内容 |
|---|---|
| PageUp/Down | 画面移動 |
| Ctrl + - | 前のカーソル位置に戻る |
| Ctrl + Shift + - | 先のカーソル位置に進む |
| Ctrl + Alt + L | ソリューションに移動 |
| Ctr+ + G | ジャンプ |
| Ctrl + F12 | 実装にジャンプ |
| Ctrl + Alt + F7 | コミット(チームエクスプローラー) |

ショートカットといえないと思いますが、
PageUp/Downキーがとても便利であることに気づきました。
それまでマウスでスクロールバーをクリックして操作していました...
スクロールバーが小さいため選択するのがとてもつらかったです。

次に「Ctrl + -」もF12や検索と合わせることで非常に強力でした。
関数の定義までジャンプして編集後に戻ってくるときにとても便利です！！

### コーディング支援

| キー | 内容 |
|---|---|
| Ctrl + . | クイック操作 |
| Ctrl + Shift + Space | パラメータヒントの表示 |
| Alt + 方向キー上下| カーソルのある行を上下に移動 |

### まとめ

忘備録代わりに書きましたのでボリュームと質がともに良くないかと思いますが、
今後も定期的に更新していこうと思います。

### 参考にした記事

* [Visual Studio の既定のキーボード ショートカット](https://docs.microsoft.com/ja-jp/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2019)
* [VisualStudio 便利なショートカット](https://qiita.com/kengop/items/ac9b57404d30e0cfdd20)
* [Visual Studio の役に立つショートカット ～マイクロソフトのカンファレンスより～](https://troushoo.blog.fc2.com/blog-entry-170.html#:~:text=Ctrl%20%2B%20F2%20%E3%81%A7%E3%80%81%E3%83%8A%E3%83%93%E3%82%B2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%90%E3%83%BC,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
'v-slot' directive doesn't support any modifierとエラーが出たときの対処方法。

Nuxtを利用していると、プロジェクトの立ち上げ時に、ESLintというLintingツールをいれると、
v-slotで書いたとき部分に下記のようなエラーが出た。

```
'v-slot' directive doesn't support any modifier
```

実際に実行したかったコードはこれ↓。

```Vue.js
<template>
  <v-data-table dense :headers="headers" :items="items" class="elevation-1">
    <template v-slot:item.actions="{ item }">
      <v-btn @click="deleteRow(item)">delete</v-btn>
    </template>
  </v-data-table>
</template>

<script lang="ts">
import { Component, Vue } from 'nuxt-property-decorator'
import axios from 'axios'

@Component({})
export default class AxiosPractice extends Vue {
  items: any[] = []

  headers = [
    { text: 'id', value: 'id' },
    { text: 'name', value: 'name' },
    { text: 'email', value: 'email' },
    {
      text: 'Actions',
      value: 'actions',
      sortable: false,
    },
  ]
  deleteRow(item: any) {
    let index = this.items.findIndex((it) => it.email === item.email)
    this.items.splice(index, 1)
  }

  async mounted() {
    const response = await axios.get(
      'https://jsonplaceholder.typicode.com/posts/1/comments'
    )
    this.items = response.data.map((comment: any) => ({
      id: comment.id,
      email: comment.email,
      name: comment.name,
    }))
  }
}
</script>
```

コードのアウトプットとしてはこんなのを考えていた。
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630652/f1d1cb47-3324-533e-109f-89386ff4fa89.png)



調べてみるとどうやら、ESLintではv-slotという書き方はご法度らしい。

これはESLint的には×
```Vue.js
<template v-slot:item.actions="{ item }">
```
これならＯ
```Vue.js
<template v-slot:[`item.actions`]="{ item }">
```

v-slotの部分を書き換えたことで、無事に実行できました。
Lintingツールって必要だろって、周りに流されて入れてしまったが、
がっつり躓いた。
皆さんもお気を付けください。

（v-slotの記述方法は https://stackoverflow.com/questions/61344980/v-slot-directive-doesnt-support-any-modifier より引用）
wordpressでcssとjsをfunctions.phpで読み込むときに気をつけること

WordPressではfunctions.phpで一括でcssやjsの読み込みを管理することが多いです。
たまにcss/jsが反映されていないときには、$handle名をみてあげましょう！
実際に、このようなコードでは同じハンドル名が２つ存在してしまうので、正しく読み込むことができません。

```functions.php
    wp_enqueue_style('my', get_template_directory_uri() . '/css/style.css', array(), '1.0.0', 'all');
    wp_enqueue_style('my', get_template_directory_uri() . '/css/tomorrow-night-eighties.css', array(), '10.3.2', 'all');

```

`my`が２つ存在しています。
こちらは別の名前に変更すると反映されるようになります！

```functions.php
    wp_enqueue_style('my', get_template_directory_uri() . '/css/style.css', array(), '1.0.0', 'all');
    wp_enqueue_style('my１', get_template_directory_uri() . '/css/tomorrow-night-eighties.css', array(), '10.3.2', 'all');

```
コピペでやっていると結構見落としがちなところなので、反映しないときはまっさきに疑ってもいいかもしれません。