OmniAICreator/Qiita-1.07M huggingface dataset:
[java入門]クラスの基礎

## クラスの基礎

#### クラス：　
  ・プログラム実行のための処理をまとめたオブジェクト
  ・クラスの処理の中にメンバ変数や処理を実行するためのメソッドがある
    class クラス名 { 実行処理 }

####メンバ変数：　
・クラス内で使用する変数
####メソッド：　
  ・メンバ変数などを使用して行う処理を一まとめにしたもの

####オブジェクト：
  ・オブジェクト指向のプログラミング言語では処理をまとめたクラスの実行には
    そのクラスのオブジェクトを生成する必要がある。
  ・生成したオブジェクトからメンバ変数を参照したりメソッドを呼び出す。
    class ClassSample {
      メソッド宣言・定義
      void methodSample(){ 実行処理 }}
    オブジェクトの生成
    classSample cl = new ClassSample();
    メソッドの呼び出し
    cl.methodSample();
  ・クラス名の後にオブジェクト名を記述。オブジェクトにはnew演算子を使用して生成するインスタンスを格納。
  ・クラスのオブジェクトは異なるオブジェクト名でいくつでも生成可能

####クラスの基本コード：

```
  TestClass.javaファイル
  class TestClass {
    メンバ変数
    public String name = "データ";
    メソッド
    public String testMethod() { 実行処理 };
  }
  Main.java
  public class Main {
    public static void main(String[] args) {
      クラスのオブジェクトを生成
      TestClass c = new TestClass();
      メンバ変数を参照する
      String str1 = c.name;
      メソッドの呼び出し
      String str2 = c.testMethod();
      結果を出力
      System.out.println(str1 + str2);
  }
  }
```
#### 引数ありコンストラクタ：
  ・インスタンス生成の際に引数を使用して値を渡せる
  ・引数ありコンストラクタが必要となる

```
    class TestClass {
      public String name;
      public TestClass(String name) {
        this.name = name
      }
      public String testMethod() {
        return "返り値";
      }
    }
```
#### staticなメンバをクラス名から呼び出す:
  ・static修飾子をつけると、オブジェクトを生成しないでメンバ変数・メソッドを呼び出せる

```
    class nTestClass {
      public static String name = "samurai";
      public static String testMethod() {
        return "engineer";
      }
    }
    public Class Main {
      public static void main(String[] args) {
        String str1 = TestClass.name;
        String str2 = TestClass.testMethod();
        System.out.println(str1 + str2);
      }
    }
```
AtCoder Beginner Contest 225

##[A - Distinct Strings](https://atcoder.jp/contests/abc225/tasks/abc225_a)

O(N!)

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    string s;
    cin >> s;

    sort(s.begin(), s.end());
    set<string> st;

    do{
        st.insert(s);
    }while (next_permutation(s.begin(), s.end()));

    cout << st.size() << endl;

    return 0;
}
```

##[B - Star or Not](https://atcoder.jp/contests/abc225/tasks/abc225_b)

O(N)
無方向グラフのデータを作成。
サイズを比較します。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    int n;
    cin >> n;
 
    vector<set<int>> graph(n);
    rep(i, n-1){
        int a, b;
        cin >> a >> b;
        a--;
        b--;
        graph[a].insert(b);
        graph[b].insert(a);
    }
 
    rep(i, n){
        if(graph[i].size() == n-1){
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
 
    return 0;
}
```

##[C - Calendar Validator](https://atcoder.jp/contests/abc225/tasks/abc225_c)

O(N)
行が10^100なので配列を使い判定することはできません。
列は７個、Aの必要な箇所を数式で作成します。
Bの行列と判定します。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

void solve(ll n, ll m, vector<vector<ll>> B){
    ll x = (B[0][0]-1) % 7;
    ll y = (B[0][0]-1) / 7;
    rep(i, n) rep(j, m){
        int v = (y+i)*7+x+j + 1;
        if(B[i][j] != v || x+j >= 7){
            cout << "No" << endl;
            return;
        }
    } 
    cout << "Yes" << endl;
}

int main() {
    int n, m;
    cin >> n >> m;

    vector<vector<ll>> B(n);
    rep(i, n){
        B[i].resize(m);
        rep(j, m){
            cin >> B[i][j];
        }
    } 

    solve(n, m, B);

    return 0;
}
```
【保存版】レバレジーズとレバテックの違いを解説！実際に相談してみた感想

- レバレジーズとレバテックの違いが知りたい
- レバテックで案件を紹介してもらった人の感想が知りたい

こういった思いを持つ人に向けてこの記事を書いていきます。


参考）[レバテック公式サイト](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.1054&dna=16106)

## レバレジーズとレバテックはどう違う？

結論から言うと、レバテックとレバレジーズの違いは以下の通りです。

| 名称 | 概要 |
|:-:|:-:|
|[レバテック](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.1054&dna=16106)| エンジニア界隈で有名な転職・フリーランス紹介サービス|
|レバレジーズ |レバテックを始め様々な事業を保有する親会社|

**レバテックはレバテック株式会社が提供するサービス名**であり、**レバレジーズはレバテックの株式を保有している親会社**、という構図ですね。

レバレジーズは持株会社のような立ち位置であるため、厳密には「レバレジーズでエンジニア案件を紹介してもらったよ」というような言い方は誤りです。
（ただ、実際はこのような言い方をしても多分普通に通じるので、あまり気にする必要はないかもしれません。）



### レバレジーズ株式会社が運営するレバテック以外のサービス

レバレジーズはレバテックの他にも色々な事業を保有しています。
例えば、下記のものです。

|  |  |
|:-:|:-:|
|オフィスサポート|レバレジーズグループの業務サポートやマーケティング|
|メディカルケア| 医療分野の人材派遣や人材紹介  |
|M&Aアドバイザリー | M&Aコンサルティング  |

この他にも、インドやメキシコを対象にした海外向け人材サービスも保有しています。

## レバテックのサービス内容

先述のように多様な事業を展開しているレバレジーズ株式会社ですが、やはりIT業界の我々にとって馴染み深いのはレバテックですよね。
なお、知らない人の為に説明しておくとレバテックは**案件数と単価に定評のあるエンジニアの仕事紹介サービス**です。
下記のように様々なニーズをカバーしています。

・[レバテックキャリア](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.1054&dna=16106) (IT実務経験者の転職サービス)
・[レバテックフリーランス](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.3602&dna=55857) (フリーランス案件紹介)
・[レバテックルーキー](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.7876&dna=102958) (新卒向けIT就職支援)
・[レバテッククリエイター](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.8522&dna=109382) (Web＆ゲーム系クリエイター向け案件紹介)

上記の中でも一番有名なのが転職サービスの[レバテックキャリア](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.1054&dna=16106)かフリーランス向けの[レバテックフリーランス](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.3602&dna=55857)でしょう。
YouTubeのエンジニア系のチャンネルや、各種ブログなどでも良く言及されているので、この2つは特に知名度が高い感じがします。


## 実際にレバテックを利用してみた感想

実は、**かく言う僕自身もレバテックを利用したことがあります。**
2年ほど前に、Python案件を探していたので、レバテックフリーランスのエージェントに相談しました。

今でこそ公式サイトからもある程度案件が見られるようになっているようですが、当時は直接の面談でしか案件が見られなかったようで（この辺記憶が曖昧なので間違っていたらすみません）渋谷のレバテックのオフィスまで面談に向かいました。
提示された案件は月単価80万円以上のものもゴロゴロしていて中々に魅力的だったのですが、僕の方で稼働条件が合わず泣く泣く応募を断念したという経緯があります。

面談自体は1時間もかからず、相談にあたって特に費用等は発生しませんでした。
「普通に優良業者だな〜」というのが実際に使ってみた僕の所感です。

ただし、当然のことながら担当者に当たりハズレはあるはずなので、その点は留意してください。

参考）
・転職希望者向け：[レバテックキャリア]((https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.1054&dna=16106))
・フリーランス向け：[レバテックフリーランス](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.3602&dna=55857)

## まとめ

最後にまとめです。
レバレジーズはレバテックなどの人材関連サービスを保有する会社です。
子会社のレバテックと名前が似ているので混同しないように注意しましょう。

レバテック系のサービスの中でも、特に[レバテックキャリア]((https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.1054&dna=16106))と[レバテックフリーランス](https://www.rentracks.jp/adx/r.html?idx=0.40653.302742.638.3602&dna=55857)は有名です。
後者は僕も利用したことがありますが、普通に優良エージェントだと感じました。


## 関連記事

転職にレバテックを利用しようと考えている方はこちらの記事もどうぞ。

- [【経験談】レバテックはやばい？実際にエンジニア案件を見て感じたこと](https://qiita.com/ykimura517/items/b0ef9f40d7e284d364ef)
- [【経験談】レバテックに相談だけすることは可能？実際に使ってみた結果](https://qiita.com/ykimura517/items/9d987df31f3729b101cd)
RailsのAPIをブラウザのコンソールから呼ぶ

### POST
```js
await (await fetch('/example/api', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'X-CSRF-Token': document.querySelector("meta[name='csrf-token']").getAttribute('content')
  },
  body: JSON.stringify({
    params1: 'パラメータ1',
    params2: 'パラメータ2',
  })
})).json()
```


### GET
```js
await (await fetch('/example/api')).json()
```
Perlの変数宣言について

# はじめに
実務でperlのファイルを書くことが多く、今までなんとなくノリで乗り切ってきた部分を実験しながら備忘録として残しておく。


## Perlの変数の基本

| 接頭詞 | 意味 |
| :---: | :--- |
| $    | スカラー(数値や文字列などの値)|
| @    | 配列 |
| %    | ハッシュ |

## スカラーの宣言
```perl
my $a = 1;
printf $a;
# 1

my $b = "test";
printf $b;
# test
```

#### 配列やハッシュを代入 
```perl
my $c = (1,2,3,4,5);
printf $c;
# 5 <=要素数

my $d = ("first" => "yamada","last" => "taro");
printf $d;
# taro <= 要素の中身の一つ
```

#### リファレンス
```perl
my $e = [1,2,3,4,5];
printf $e;
# ARRAY(0x7f907d80b6b8) <= 配列のリファレンス

my $f = {"first" => "yamada","last" => "taro"};
printf $f;
# HASH(0x7fefe080b6b8) <= ハッシュのリファレンス
```

## 配列の宣言
```perl
my @a = (1,2,3,4,5);
printf @a;
# 1 <=先頭の値が出力される
printf "@a";
# 1 2 3 4 5 配列の中身が出力される

printf @a[2];
# 3 3番目の要素が出力される

printf @a[-1];
# 5 最後の要素が出力される

my $b = @a;
printf $b;
# 5 要素数が出力される

my @c = [1,2,3,4,5];
printf @c;
# ARRAY(0x7fd41700b6b8) <= 配列のリファレンス 但、なんか値取り出せない
```

## ハッシュの宣言
```perl
my %a = (first=>"yamada",last=>"taro");
printf %a;
# first 要素の中の一つ

printf "%a"
# %a そのまま出力される

printf %a->{first};
# yamada そのキーの値が出力される

printf %a->{"first"};
# yamada そのキーの値が出力される

my %b = {first=>"yamada",last=>"taro"};
printf %b;
# HASH(0x7f8bc200b6b8) <= ハッシュのリファレンス 但、なんか値取り出せない
```

## リファレンス
#### 配列
```perl
my @a = (1,2,3,4,5);
my $b = \@a; #リファレンス
my $b = [1,2,3,4,5]; #リファレンス

printf $b->[3];
# 4 要素の取り出し

printf "@$b"; #デリファレンス
# 1,2,3,4,5 
```
#### ハッシュ
```perl
my %a = (first=>"yamada",last=>"taro");
my $b = \%a; #リファレンス
my $b = {first=>"yamada",last=>"taro"}; #リファレンス

printf $b->{first};
# 4 要素の取り出し

printf %$b; #デリファレンス
# first 
```

## 色々と実験してみて分かったこと
・見た目だけじゃ結構わからない。
・リファレンスを@や%の接頭詞に代入するとなんか中身取り出せなくなるので大人しくスカラー変数に入れといた方が良い。
【Python】機械学習で使える簡単な教師データ作成

## 概要

セグメンテーションタスクで使える入力画像・教師画像を作るのがいつもめんどくさいと感じていたため、保存用としておいておきます。
ランダムな場所にランダムな丸を作成するプログラムです。

- 丸の大きさはテキトーにしてるので、都度直してください。
- cv2.circleだけでなく、cv2.rectangle等を混ぜるとより良いかも。

こんなものができます（ちっちゃい！）。
![input](https://user-images.githubusercontent.com/93382642/139674105-68889d73-669d-4d6d-a551-658b13f6985c.png)    ![correct](https://user-images.githubusercontent.com/93382642/139674024-c9d08e2c-42a4-4b66-acc1-e10de635b38e.png)




## 想定内容
今回は図形（丸）の色を塗りつぶすセグメンテーションタスクを想定しています。
今回のソースをベースにしたら色んなパターンに応用できると思います。


## ソースコード
OpenCVのthicknessを１（枠線１）と-1（塗りつぶし）にすることで２種類の画像を作成。
位置や丸の大きさはランダムに設定していますが、閾値等は使い方に合わせてください。

```python:python
import cv2
import random

size = 32
dataNum = 500
imgDir = ./data

for i_num in range(dataNum):
        
    img = np.zeros((size, size))
    corImg = np.zeros((size, size))
        
    x, y = random.randint(0, size), random.randint(0, size)
    cclSize = random.randint(3, 8)
        
    cv2.circle(img, (x, y), cclSize, 255, thickness=1)
    cv2.circle(corImg, (x, y), cclSize, 255, thickness=-1)
        
    inputPath = imgDir + "/inputs/" + str(i_num).zfill(4) + ".png"
    correctPath = imgDir + "/corrects/" + str(i_num).zfill(4) + ".png"
    cv2.imwrite(inputPath, img)
    cv2.imwrite(correctPath, corImg)
```

## その他

ソースコードはGitHubにもありますので是非。

https://github.com/khfkd/makeLearningData.git
webインスペクタを使って、mac pcとandroid端末にてchromeの実機検証を行う

はじめに：
開発者向けオプションをandroid側で、onにする。→端末情報を何回かクリックすると開放。
USBデバッグの設定をonにして、デバッグモードを使えるようにする。
これを行うと開発者用モードを使用できるようになる。

webインスペクタ:
参考URL上では、USB接続と言ってますが、type cで繋げています。(androidがtype cなので)

デバッグモードが使えるようになっていれば、chrome://inspect/#devicesにアクセスすると、Remote Targetの下に自分の端末が出ているはず。

##### ※このときに、type c同士の接続でうまくいきました。一方がtype c 一方がusbの形のケーブルだとdebugツールが反応してくれませんでした。なので、うまくいかない時には、ケーブルなどを変えてみてはいかがかと!

設定がうまくいけば、Remote Targetの下にandroid側で開いているタブ一覧が表示されるので、inspectをクリックします。

すると、pc側で以下のような画面が現れます。実際に動かしたり、html,cssをいじることも可能です。いじると、android側でも表示が変化するのでweb inspect完成です。同期されているため、pc上でscrollすると、android側でもscrollします。

![スクリーンショット 2021-11-01 21.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274417/213bd4d5-66de-721f-0d3e-a111f1b05959.png)


参考：
https://developer.chrome.com/docs/devtools/remote-debugging/
https://ascii.jp/elem/000/001/006/1006268/

デバッグのURL:
chrome://inspect/#devices
gitignoreでディレクトリを無視して、その中の一部を無視しない方法

# はじめに
gitignoreでディレクトリ一式無視するのはそのままディレクトリを記載すれば良いが、その中の一部だと書き方がトリッキーで忘れるのでメモしておきます

# 何がしたいか


```
├── gradle
│   ├── caches
│   │   ├── 7.0.2
│   │   ├── jars-8
│   │   ├── journal-1
│   │   ├── modules-2
│   │   └── transforms-3
│   ├── daemon
│   │   └── 7.0.2
│   ├── jdks
│   ├── kotlin-profile
│   ├── native
│   │   ├── 53dbd7edfb1c66fb8903c78663c9afc45aea4f116125fa6feffd364cf09443e8
│   │   ├── 8bec1ad78214c89d9ad589b4d07fe93259594b29d510b10fafb7a158f7737e5d
│   │   └── jansi
│   └── wrapper
│       ├── dists
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties

```

上記のディレクトリでgradleのgradle-wrapper.jarとgradle-wrapper.propertiesは無視しないでそれ以外は一式無視したい場合。

まず無視をする場合はディレクトリをそのまま書きます

```
/gradle/*
```

無視をしない場合は!を先頭につけます

```
!/gradle/wrapper/gradle-wrapper.jar
```

であれば下記で良さそうだが、これではうまく行きません。

```
/gradle/*
!/gradle/wrapper/gradle-wrapper.jar
!/gradle/wrapper/gradle-wrapper.properties
```

ではどうするか、、、正解は

```
/gradle/*
!/gradle/wrapper
/gradle/wrapper/*
!/gradle/wrapper/gradle-wrapper.jar
!/gradle/wrapper/gradle-wrapper.properties
```

終わり
Windows10のマウススクロール方向を逆にする

フリーソフトを使わずにレジストリを編集して制御します。

### 環境
OS: Windows 10 Pro (10.0.19043)

### 参考
https://qiita.com/aki3061/items/95d4e92d1c5cf41dc70a

### 方法
#### 1. マウスのハードウェアIDを確認する
- コントロールパネル→ハードウェアとサウンド→マウス
![コントロール パネル 2021-10-31 15.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/63c2fc5f-b73b-9c1f-aee0-cc49730c4291.png)

![ハードウェアとサウンド 2021-10-31 15.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/a729861f-169d-7f79-e1a8-53ab4a42b12c.png)

- 「ハードウェア」タブ→該当のデバイスをダブルクリック
![マウスのプロパティ 2021-10-31 15.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/94334e3a-0202-d49a-4451-1ef0227ece40.png)

- 「詳細」タブ→プロパティで「ハードウェアID」を選択。デバイス名が表示さるのでその値（HIDから始まる）をメモする。複数表示されてどれか分からないときは全てメモしておけば良いと思います。


![HID 準拠マウスのプロパティ 2021-10-31 15.16.49_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/a9c2b41f-dad3-1459-04c9-a10df832f3d8.png)

#### 2. レジストリを修正する
- Windowsの検索バーに「regedit」を入力する。レジストリエディターが表示されるのでクリック。
![HID 準拠マウスのプロパティ 2021-10-31 15.16.49 2021-10-31 15..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/da84f003-27b5-7ba8-e26c-1f44bfc914e5.png)

- 「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID\Device Parameters」まで進み「FlipflopWheel」をクリック（「Flipflop **Scroll**」ではないので注意）。

![レジストリ エディター 2021-10-31 15.38.59_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/fa1ef7be-21bc-b355-080c-725bc5780354.png)



- 「値のデータ」がデフォルトでは「0」になっているので「1」に変更する
![DWORD (32 ビット) 値の編集 2021-10-31 15.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/3e98031d-e290-91f5-b281-2c114cb9734e.png)

#### 3. PCを再起動する
Power Platform: 出来るシリーズ無償版

# 背景

無償版でも十分使えるので。

# 検索URL

https://www.google.com/search?q=%E3%81%A7%E3%81%8D%E3%82%8BPower+site%3Ahttps%3A%2F%2Finfo.microsoft.com+&biw=1793&bih=1009&ei=1LJvYdyLD5PahwPNtZiYDA&ved=0ahUKEwjcxdyTqtjzAhUT7WEKHc0aBsMQ4dUDCA4&uact=5&oq=%E3%81%A7%E3%81%8D%E3%82%8BPower+site%3Ahttps%3A%2F%2Finfo.microsoft.com+&gs_lcp=Cgdnd3Mtd2l6EAM6BwgAEEcQsANKBAhBGABQmF5YmF5gv2BoAnACeACAAcABiAHAAZIBAzAuMZgBAKABAcgBCMABAQ&sclient=gws-wiz

## 出来るシリーズ
https://info.microsoft.com/JA-PowerApps-CNTNT-FY21-01Jan-08-PowerAutomatecan-SRGCM4179_01Registration-ForminBody.html

何故か、こいつはPDFで直接DLも・・

https://info.microsoft.com/rs/157-GQE-382/images/JA-CNTNT-eBook-SRGCM4179.pdf

https://info.microsoft.com/JA-PowerAuto-CNTNT-FY22-09Sep-30-Power-Automate-Desktop-SRGCM4999_LP01-Registration---Form-in-Body.html?aaid=portal

https://info.microsoft.com/JA-PowerApps-CNTNT-FY20-12Dec-03-Dekirupowerapps-SRGCM3106_01Registration-ForminBody.html

## 自習書

https://info.microsoft.com/JA-RapidApps-CNTNT-FY22-07Jul-23-Make-with-Power-Apps-Business-application-self-study-book-for-universities-SRGCM4815_LP01-Registration---Form-in-Body.html?aaid=YT
【Vue.js】条件付きレンタリング　v-ifとv-else

#はじめに
こんにちは！
今回は【Vue.js】v-ifとv-elseについてアウトプットしていきます！

#v-ifとv-elseとは
真偽値により要素の表示/非表示を切り替えることができる。

#書き方・解説
```HTML:HTML
<div id="app">
  <p v-if="toggle">
    YES
  </p>
  <p v-else>
    NO
  </p>
</div>
```
```Vue.js
 var app = new Vue({
   el: "#app",
   data: {
     toggle: true
   }
 })
```

![スクリーンショット 2021-10-24 14.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/a1de2520-a61c-9473-1bf3-e740c950aa4e.png)

`toggle`が`true`なのでYESと表示されています。
`toggle`が`false`なのであればNOと表示されます。


#まとめ
このように真偽値を使って表示させるものを切り替えることができます。

#最後に
今回はv-ifとv-elseについてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
canvas重ねあわせ、文字描画(vue+NUXT)

```
<template>
  <div justify="center" align="center">
      <form justify="center">
        <v-card class="canvasbase" id="canvas_base" align="left" flat outlined>
          <canvas id="board" height="462px"></canvas>
        </v-card>
        <div>
          <button type="button" @click="download()">
            写真に保存
          </button>	          	        
        </div>
      </form>
  </div>
</template>

<script>

export default {
	layout: "home",
  
	data() {
		return {
            imgURL:'',
		}
	},
	created() {

	},
	mounted() {
        this.initialize()
	},
	methods: {
    async initialize() {
        this.onload()
    },
    download(){
      // ダウンロード用エレメント:aタグ
      var dlLink = document.createElement('a');

      dlLink.href = this.imgURL;
      var tmpextension = dlLink.href.split(";")[0]
      const fileName = `画像.${tmpextension.replace("data:image/", "")}`;
      dlLink.download = fileName;

      document.body.insertAdjacentElement("beforeEnd", dlLink);
      dlLink.click();
      dlLink.remove();

      setTimeout(function() {
        window.URL.revokeObjectURL(dlLink.href);
      }, 1000);      
    },
    onload(){
      // canvas準備
      const board = document.querySelector("#board");  //getElementById()等でも可。オブジェクトが取れれば良い。

      var images = []
      var srcs=[
        "url１",
        "url2",
      ]

      //ロード済Imageオブジェクト数のカウンタ
      var loadCount = 0;

      // Canvas上に画像を表示
      for (var i = 0; i < srcs.length; i++) {
        // Imageのインスタンスを生成し、それぞれの画像を設定
        images[i] = new Image();
        images[i].src = srcs[i];
        const _this = this;
        // 画像の読み込みが終わったら
        images[i].onload = function () {

          // カウントを取る
          loadCount = loadCount + 1;

          // 画像全てloadが終わったら
          if (loadCount === images.length) {
            // ロード後の処理
            _this.loadProcess(images, board);
          }
        };
      }
    },
    // ロード後の処理
    loadProcess(images, canvas){
        // canvasをクリアにする
        let ctx = canvas.getContext("2d");
        var baseHeight = document.getElementById('canvas_base').clientHeight

        // キャンバスに画像を描画
        this.drowImage(images, ctx);

        // canvasを画像に変換
        this.canvasToImage(canvas);
    },

    // キャンバスに画像を描画
    drowImage(images, ctx){
      var maxCanvasWidth = 0;
      if(images.length >= 2){
        var x_shift = (images[0].naturalWidth - images[1].naturalWidth)/2;
      }          
      for (let i = 0; i < images.length; i++) {
        if(i==0){
          ctx.drawImage(images[i], 0, 22);
          images[i] = null;
        }
        else if(i==1){
          ctx.drawImage(images[i], x_shift, 156);
          images[i] = null;
        }
      }
      //キャンバスに文字を描画
      ctx.fillStyle = "white";
      ctx.font = "bold 10px \'Noto Sans JP\',serif"
      ctx.fillText("表示したい文字",85,438)
    },
    // canvasからImgに変換
    canvasToImage(canvas) {
        // canvasを画像に変換
        this.imgURL = canvas.toDataURL('image/png');
    }           
}
}
</script>


<style>

.canvasbase{
  font-size:16px;
  margin-top:28px;
  height:465px;
}
</style>

```
Django Logginについて 覚え書き

logを作ろう。
setting.py(設定ファイル)にlogを書く。
Djangoのlogはpythonのライブラリを元に作られているらしいので大まかなところは変わらないらしい.....

LEVELが存在する。以下の5種類

```
DEBUG ：デバッグ目的の低レベルシステム情報
INFO ：一般的なシステム情報
WARNING ：発生した軽微な問題を説明する情報。
ERROR ：発生した重大な問題を説明する情報。
CRITICAL ：発生した重大な問題を説明する情報。
```

```
ロガー
- ログを記述する働き
ハンドラ
- ログをどのように動かすかを決めれる。
フォーマッター
- どのようにログに表示するかの書式を決めれる
```


```

#logging setting
LOG_BASE_DIR = os.path.join('/Users','name','projects','test','log')
LOGGING = {
    'version':1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{asctime} {levelname} {module} {process:d} {thread:d} {message}',
            'style': '{',
        }, #verboseはただの名前で詳細という意味らしい。
        'simple': {
            'format': ' {asctime} {levelname} {filename} {message}',
            'style': '{',
        },
    },
    #formatterは、書式を設定する。
    'handlers':{
        # 'console':{ コンソールに書き込む
        #     'class':'logging.StreamHandler',
        # },
        # 'file':{ # fileに書き込む
        #     'level':'INFO',
        #     'class':'logging.FileHandler',
        #     'filename':str(BASE_DIR)+'/log/debug.log',
        # },
        'debug':{
            'level':'DEBUG',
            'class':'logging.FileHandler',
            'filename':os.path.join(LOG_BASE_DIR,'debug.log'),
            'formatter':'verbose',
        },
        'info':{
            'level':'INFO',
            'class':'logging.FileHandler',
            'filename':os.path.join(LOG_BASE_DIR,'info.log'),
            'formatter':'simple',
        },
        'warning':{
            'level':'WARNING',
            'class':'logging.FileHandler',
            'filename':os.path.join(LOG_BASE_DIR,'warning.log'),
            'formatter':'simple',
        },
        'error':{
            'level':'ERROR',
            'class':'logging.FileHandler',
            'filename':os.path.join(LOG_BASE_DIR,'error.log'),
            'formatter':'verbose',
        },
        'critical':{
            'level':'CRITICAL',
            'class':'logging.FileHandler',
            'filename':os.path.join(LOG_BASE_DIR,'critical.log'),
            'formatter':'verbose',
        }
    },# 5種類のハンドラを設定し、それぞれレベルがcriticalならcritical.logなどに書き込まれるように設定。
    #ハンドラは、ロガーから受け取る
    'loggers':{
        'django':{
            'handlers': ['debug','info','warning','error','critical'],
            'level': 'INFO',
            # 'level': 'DEBUG',
            # 'propagate': True, 祖先ロガーのハンドラに渡されるらしい..
        },
    },
    #ロガーは、ベース
}
```


verbose は'詳細'という意味で、デバッグなどの際に使用する書式です。
ちなみに、verbose以外の名前でも大丈夫でsampleやnameとかでもいいぽい(自分で決められる)。


参考：https://docs.python.org/3.8/library/logging.html#logrecord-attributes
Linux上のDockerでMicrosoft SQL Serverを立ち上げる

#はじめに
Ubuntu上で動いているDockerで、コンテナ化されたMicrosoftのSQL Server 2019を立ち上げてみたときの手順を書きます。
すでに同じような記事が溢れてると思いますが、自分なりにまとめました。

#環境

- Kubuntu 20.04
- Docker version 20.10.10, build b485636

#つかったコンテナ
GitHubにて公開されている「**[Microsoft Container Registry](https://github.com/microsoft/containerregistry) (MCR)**」の
「server:2019-latest」 を使用しました。

#手順

1. イメージをPullする

```sh
docker image pull mcr.microsoft.com/mssql/server:2019-latest
```

2.Docker runする

```sh
docker container run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=パスワードをここに入れる' -p 1500:1433 --name sqltestcontainer -d mcr.microsoft.com/mssql/server:2019-latest
```

あとはコンテナに内蔵されている`sqlcmd`や、SSMSなどを使ってコンテナ内で実行されているSQL Serverへ接続するだけです。

bashなどのシェルでコンテナ内のsqlcmdを使いたいときは、

```sh
docker container exec -it sqltestcontainer bash
```

を実行し、コンテナにアタッチできたら

```sh
/opt/mssql-tools/bin/sqlcmd -U SA -P 'パスワードをここに入れる'
```
を実行することで、おなじみのSAユーザでSQLを叩くことができます。

#ちなみに
コンテナ内で実行されているSQL Serverのバージョンは以下のとおりです。

```sh
Microsoft SQL Server 2019 (RTM-CU13) (KB5005679) - 15.0.4178.1 (X64) 
        Sep 23 2021 16:47:49 
        Copyright (C) 2019 Microsoft Corporation
        Developer Edition (64-bit) on Linux (Ubuntu 20.04.3 LTS) <X64>  
```

以上になります！
読んでくださり、ありがとうございました！
Qiita Advent Calendar 2021 リニューアル秘話

![01-qiita_advent_calendar-ogp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b4ead327-cc4b-d12e-f555-9a498ab58a95.png)
こんにちは。Qiitaのデザイナーの[出口](https://qiita.com/degudegu2510)です。

今回はQiita Advent Calendar 2021がどのようにリニューアルされたのかを公開します。
この記事の内容は以下の通りです。

1. Qiita Advent Calendar について
2. デザインのリニューアル
2. サイトのリニューアル
3. 機能のリニューアル

## Qiita Advent Calendar について

Qiita Advent Calendarとは、クリスマスまでの期間に日数を数えるために使用されるカレンダーである「アドベントカレンダー」の慣習にもとづいて、毎年12月1日から25日までの期間限定で「Qiita」で開催される記事投稿イベントです。

2021年はより多くのユーザーに楽しんでいただけるように、 **UIを一新** し、 **新しい機能を追加** し、 **様々なコンテンツ** を提供します。
また、昨年に引き続きオンラインライブ配信も実施する予定です。

是非アドベントカレンダーに参加して、最高に盛り上がる年末にしていきましょう🎉

https://qiita.com/advent-calendar/2021

## デザインのリニューアル
これまでのAdvent Calendarのデザインは、:qiitan: Qiitanを使って、イラストっぽく仕上げていました。

今年からは切り絵をモチーフにデザインに、クリスマスの表現や、冬の表現がより表せられるようにしています。


また、Qiita Advent Calendarのロゴも
フォントスタイルがバラバラだったものを、[ブランドフォント(Codec)](https://help.qiita.com/ja/articles/others-brand-guideline)に合わせています。

|2020年|2021年|
|----|----|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/52d51544-2a53-b00f-3508-9a344fbb4dbd.png" width="800px" />|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b4ead327-cc4b-d12e-f555-9a498ab58a95.png" width="800px" />|


## サイトのリニューアル
リニューアルされたデザインに合わせて、UIを一新しました。

### Topページ
旧デザインのTopページでは、以下のような様々な課題がありました。

 - 旧デザイン
    1. どんなイベントかいまいちわからない
    2. 参加方法がいまいちわからない
    3. カレンダーが、探しにくい
    4. シンプルにダサい
    5. 盛り上がっているカレンダーがわからない

新デザインでは、それらの課題を解決出来るように設計し、UIを変更しています。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/ca56b639-7736-f646-6b49-a85ca789387a.png)


#### ファーストビュー
ファーストビューでは、
新しくなったQiita Advent Calendarに合わせて、デザインを一新し
雪を降らせるアニメーションを追加しています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/xDui5KJcGUU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#### 参加中のカレンダー
「参加中のカレンダー」のセクションでは、
自分の参加しているカレンダーが一覧できるだけではなく、
登録したカレンダーの横にある▼←ここから、登録しているカレンダーごとに表示することができます。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b62dec39-b913-3a8c-df8e-9ae7b0653581.png)

### 他のページもトンマナに合わせて変更しています
![Frame 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/b29da24c-b5b7-6b91-38d6-fa61d7fbee95.png)

## 機能のリニューアル
### シリーズ機能
シリーズ機能では、カレンダーに10人以上の参加者がいる場合、シリーズとしてカレンダーを増やすことができる機能です。

今までのアドベントカレンダーでは、25日分埋まると、その１、その２と別のアドベントカレンダーが追加されていました。
そのため、同じ言語カレンダーなのに、その１は追えてたけど、その２までは追えないといったことがおこっていたと思います。

今回からカレンダーに10以上参加者が埋まった場合は、さらに新たなシリーズを追加することができるので、今年は人気のカレンダーは何人でも参加ができます。

### 参加中のカレンダー

TOPページの中に **参加中のカレンダー** のセクションを追加しました。
これによって、自分が参加しているカレンダーへのアクセスがしやすくなりました。


## 最後に
今回はQiita Advent Calendar 2021がどのようにリニューアルされたのかを公開しました。

2021年はより多くのユーザーアドベントカレンダーに参加して、最高に盛り上がる年末にしていければ幸いです。

是非、下記のリンクからQiita Advent Calendarにご参加ください。

https://qiita.com/advent-calendar/2021
【Python】動画をコマ送りで見る方法をOpenCVで実装

## 概要
動画をじっくりしっかり見たい！と思っても、なかなか
**１コマ１コマ止めながら**とか、**ズームしたい！**ってできませんよね。
動画の細かい部分を見たい時があったので、デバッグ用として作成しました！
（エラー処理は超ゆるいです）

## 使い方
次のコマに進めるには何かしらのキーを押さないといけない。
キーを押すまでは**imshow**によりズームなり何なり可能。
"q"で再生終了。

## ソースコード

```python:debugVideo.py
import cv2

video = cv2.VideoCapture("output.mp4")

while video.isOpened():

    ret, frame = video.read()

    cv2.imshow("Preview", frame)

    if cv2.waitKey() & 0xFFF == ord('q'):
        break

video.release()
```



## 詳細

GitHubにも載せています。

https://github.com/atchicken/videoFrame_advance
フォルダを監視して更新があるとマージしてepubファイルを作るボイラープレート

# 概要

フォルダを監視して更新があるとマージしてepubファイルを作るボイラープレートです。

長文というかepubファイルを作る環境を整えたかったので作ってみました。

コマンド部分をいじることでpdfやwordなどにも応用可能です。

# 場所

[https://github.com/mi-ki-ri/writing-repository-boilerplate-python](https://github.com/mi-ki-ri/writing-repository-boilerplate-python)

# 使い方

上記リポジトリをDownload ZIPします。

（この方法がおすすめです。フォークなどもできるかとは思いますが）

フォルダをリネームします。

フォルダ内で、

```sh
$ brew install pandoc
$ python3 -m venv venv
$ . venv/bin/activate
$ pip install -r requirements.txt
$ sh app.sh
```

をそれぞれ実行します。

（Mac版です。Winではpandocのインストール方法が違うと思われます）

srcフォルダ内にあるmdファイルを書き換えます。

すると自動的に更新を検知して、distフォルダにepubが現れるはずです。

cover.pngを上書きすることでカバーを、CSSを追記することでスタイルを変えることができます。

# しくみ

## sh

主となるのはapp.shです。

中には長いコマンドが入っています。

```sh
watchmedo shell-command -W --recursive --pattern '*.md' --command 'cat src/*.md > dist/master.md && pandoc -f markdown -t epub3 dist/master.md --css ./style.css -o dist/epub.epub --epub-cover-image=cover.png' src
```

_watchmedo_ がフォルダ監視を司っているコマンドで、 _watchman_ をインストールするとついてきます。

最後の _src_ のところで監視するフォルダを指定しています。

_--command_ の部分が更新のたびに走るスクリプトで、今回は長いコマンドを書きました。

その部分

```sh
cat src/*.md > dist/master.md && pandoc -f markdown -t epub3 dist/master.md --css ./style.css -o dist/epub.epub --epub-cover-image=cover.png
```

の前半はマージの処理で、src内のmdファイルをdist内の _master.md_ に上書き書き込みしています。

後半はpandocにより、マークダウンからepub3へと変換をかけています。

## venv

先ほどの

```sh
$ brew install pandoc
$ python3 -m venv venv
$ . venv/bin/activate
$ pip install -r requirements.txt
$ sh app.sh
```

の多くをしめていたのはpythonの命令です。

これは何をしているのかというと、仮想環境を作っています。

`. venv/bin/activate` を実行した場合、この仮想環境でpythonやpipが実行されることになります。

その後 `pip install -r requrements.txt` により _watchman_ をインストールしています。

_watchman_ をインストールすると _watchmedo_ が使えるようになります。

# 感想

セーブするたびに更新処理が走るのはちょっとやりすぎかなあという気もしました。

おそらく Github Actions で pandoc を走らせることができるので、そちらを採用するかもしれないです。

とりあえずこのリポジトリは置いておきます。

使いたい方は使ってください。
Warning: SSL: certificate subject name 'localhost.localdomain' does not match target host name ~~ in~~にはまった件

##環境
* OS ：AmazonLinux2
* 証明書 ：AWS ACM 
##事象
自サイト内でPHPcURLコマンドでファイルを読み込んでいる際に、以下のエラー文が表示されて画面上にコンテンツが表示されなかった。


    Warning: SSL: certificate subject name 'localhost.localdomain' does not match target host name ~~ in ~~

curlコマンドで疎通する場合にはSSL通信を行うようですが、その際に証明書の名前とターゲットの名前に差分があるとのエラー。
localhost.localdomainなんて証明書をアタッチするのは違うと思うので、サーバー側の修正で対応。

##対処方法
target host name ~~ に記載のホスト（hogehoge.jp）を読み込むようにhostsファイルを修正

```vim:/etc/hosts
127.0.0.1 ここにホスト名(hogehoge.jp) localdomain localhost.localdomain localhost
```

networkingにホスト名追加

```vim:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ここにホスト名（hogehoge.jp）

```

サーバーを再起動する

```
sudo reboot
```

上記の対応で、問題なくコンテンツが表示されるようになった。


##参考資料
https://aws.amazon.com/jp/premiumsupport/knowledge-center/linux-static-hostname-rhel-centos-amazon/
EC2でRedmine4.2を立てる

## EC2を使った経緯
ちゃんとしたバックアップが取りたくてさくらのVPSからの移行先として選んだ。
AWSBackupで全自動バックアップだ！

バージョンは最新の4.2を使う。
2要素認証もあるしな。

もともとは記事化する気はなかったが色々収穫があったので記事化。
ちなみに、データを持ち出すのが面倒なので、移行じゃなくて新規で立てた。

## インスタンスタイプについて

以前さくらのVPSで立てた時はアイドル時で400MBくらいのメモリ消費量だったので`t2.nano`で良いかなと思ったが、500MBだと途中のビルド作業が無理だったので、`t2.micro`にした。
`t2.micro`ならサインアップしてから1年間無料だし、とりあえずこれで。

EC2側の手順は探せばたくさんあると思うので割愛。
固定IPとか色々やってコマンドラインで操作できるところまで持っていく。

## 手順

Ubuntu大好きマンなのでUbuntuで立てる。
下記ページを参考にさせていただいた。

https://blog.redmine.jp/articles/4_2/install/ubuntu/

## つまづいたところと補足

### メモリ不足

冒頭にも書いたが、t2.nanoの500MBではgemパッケージのインストールが無理だったのでt2.microにしてメモリ増やしたが、今度はPassengerのビルドが途中で止まる。
何かおかしいなと思って`htop`で監視しながらビルドしてみると、それでもメモリが不足していることが分かった。

AWS標準イメージのUbuntuServerではSwapが無いので、下記手順で追加で1GB確保してやったらギリギリ通った。
ストレージのIOPSとかを気にする人は普通にメモリ増やしてください。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/

### HTTPS化

certbotにApache用のプラグインがあるらしい。

https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04-ja

適当にFQDNを`/etc/apache2/sites-available/000-default.conf`の`ServerName`に突っ込んで`sudo certbot --apache`とすると、証明書を引っ張ってきた後色々設定を書き換えてくれる。
cron組まなくても証明書の更新自動なのか。便利。

#### 2022/1/26追記

9日前に「期限迫っててヤバいぞ」的なメールがとどくが、証明書の自動更新は期限の5日前に動く模様。
以下コマンドにて何時頃動くか確認できる。

```
sudo systemctl status certbot.timer
```


### メール送信

せっかくEC2なので、無料枠のあるAmazonSESを使ってメール送信してみる。

Redmine側の設定手順は以下の参考にさせていただいた。

https://qiita.com/evakichi/items/738d1c55c8c3e0b5cd20

メール送信テストで554とかのエラーが出たらメールアドレスの認証エラーだ。
まず、SESでは悪用防止のために送信元メールアドレス(Redmineのメール送信設定画面で設定するやつ)の所有権を確認しないと送れない事になっている。
これはSESの管理コンソールで`Verified identities`からメールアドレスを登録し、送られてきたメールのURLをクリックする必要がある。URLをクリックしないと利用可能なメールアドレスにならないので、受信できるアドレスを登録すること。

で、初期設定だと、悪用防止のために送信先メールアドレスも登録が必要である。
同様に登録しておくこと。

送信先メールアドレスについては、申請をすれば制限を解除できるがここでは触れない。

## あとがき

ちょいちょい詰まったが、思ったよりはスムーズに立てられた気がする。
Let'sEncryptのやつは初めて知ったが、Apacheの設定ファイル編集が自動なのが超便利だった。

ポートの変更とかは前回の記事を参考にしてください。

https://qiita.com/min06s/items/c19f23b6118d8ff08d12
LPIC Level1 & CCNA 2ヶ月合格ルート

# スペック

* 事業会社の総合職としてほどほどのキャリア（主に内勤部署）
* データ分析にはまる過程でITに興味を持ち情シスに希望異動
* 2021年11月現在でインフラ系情シス歴1年半

# 受験の経緯
インフラの体系的な知識が欲しいと思いベンダー資格スタンプラリーを始めました。インフラエンジニアの登竜門と言われるLPIC Level1とCCNAを最初のターゲットに設定。

# 1-2週目：LPIC 101-500
* インプット：[Linux教科書 LPICレベル1 Version5.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version5-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C-ebook/dp/B07P5S98SK)の前半を3日くらいで通読。
* アウトプット：[Ping-t](https://ping-t.com/)で試験日までひたすら演習。試験3日前で模擬テスト9割突破。コマ問は最後まで7割程度。
* 試験：2週目の週末に受験して合格。
* 次への教訓：コマンドまる覚えより理解が大事。コマ問よりも選択式を理解しながら解く方針に軌道修正。

# 3-4週目：LPIC 102-500
* インプット：[Linux教科書 LPICレベル1 Version5.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version5-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C-ebook/dp/B07P5S98SK)の後半を2日くらいで通読。
* アウトプット：[Ping-t](https://ping-t.com/)で試験日までひたすら演習。試験3日前で模擬テスト9割突破。コマ問は気分転換程度。
* 試験：4週目の週末に受験して合格。
* 次への教訓：インプットよりアウトプットに時間をかけるのが大事。教科書通読はさくっと終わらせて演習に移る方針に軌道修正。

# 5-8週目:CCNA 200-301
* インプット：[シスコ技術者認定教科書 CCNA 完全合格テキスト&問題集](https://www.amazon.co.jp/%E3%82%B7%E3%82%B9%E3%82%B3%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E6%95%99%E7%A7%91%E6%9B%B8-CCNA-%E5%AE%8C%E5%85%A8%E5%90%88%E6%A0%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%AF%BE%E5%BF%9C%E8%A9%A6%E9%A8%93-200-301/dp/4798165778)を5日で通読。分からないところも気にせず進めるように意識した。
* アウトプット：[Ping-t](https://ping-t.com/)で試験日までひたすら演習。試験4日前で模擬テスト9割突破。
* 試験：8週目の週末に受験して合格。
* 次への教訓：6週目くらいでping-t生活がマンネリ化してきたので、別分野のインプットもまじえながら進めた方が良かった。

# 受験を終えて感じたメリット
* 実務を通してなんとなくで理解していた知識が整理された
* 実務であまり使わない技術も基本をつかむことができた
* LPICとCCNAを続けて取ることでサーバー・ネットワークについて知識の土台ができた

# 今後の目標
仮想化（**VCP-DCV**）、セキュリティ（**SSCP**）、クラウド（**AWS-SAA**）を順にスタンプラリーする予定です。そこまで取れれば、サーバー・ネットワーク・セキュリティの基本をカバーできると思うので、その先はどこか専門分野を作りたいところ。CISSPまで取ってセキュリティを強みにしようかな、なんて考え中です。
stop all docker container

```
docker stop $(docker ps -q)
```

## 一括コンテナ削除
```
docker rm $(docker ps -q -a)
docker rm -f $(docker ps -q -a)
```

## 一括イメージ削除
```
docker rmi $(docker images -q)
Docker イメージ削除 'image has dependent child images' への対処
docker rmi -f $(docker images -q)
``` 

## ALL
docker stop $(docker ps -q) && docker rm $(docker ps -q -a) && docker rmi $(docker images -q)
未使用のvolumeを削除する場合は、以下となります。

docker volume prune

## 強制削除
docker volume prune -f
docker volume prune
 
## 強制削除
docker volume prune -f
未使用のnetworkを削除する場合は、以下となります。

docker network prune
一括でimage、volume、networkを削除する場合は、以下となります。

docker system prune
Build Cacheを削除する場合は、 以下となります

docker builder prune
Build Cache容量確認

docker system df
[heroku]　アプリケーションの詳細の見方



herokuでアプリケーションの詳細を見る場合はこのコマンドを打ちます。

````
heroku apps:info
`````
下記のように、公開されたアプリケーションの詳細を見ることができます。



```
% heroku apps:info

===アプリケーション名
Addons:         cleardb:ignite
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/ajax-app-123456.git
Owner:          sample@sample.com
Region:         us
Repo Size:      165 KB
Slug Size:      56 MB
Stack:          heroku-18
Web URL:        https:/アプリケーション名.herokuapp.com/

````
Web URL: https://アプリケーション名.herokuapp.com/
の部分のURLへアクセスすれば、公開されたページを見ることができます。


-------
その他公開されたページを見る方法
-----

```
heroku open
````

開きたいデプロイ済みのディレクトリーのところでこのコマンドを打ってみてください
公開されたURLが表示されます。
aptで使うプロキシを設定する

非常によく忘れるので、メモ。

確認環境。

```shell
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.3 LTS
Release:	20.04
Codename:	focal

$ uname -srvmpio
Linux 5.4.0-89-generic #100-Ubuntu SMP Fri Sep 24 14:50:10 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```

aptのプロキシの設定を行うには、`/etc/apt/apt.conf.d`配下に以下のような設定ファイルを作成します。

```shell:/etc/apt/apt.conf.d/30proxy
Acquire::http::proxy "http://[your-proxy-host]:[your-proxy-port]/";
Acquire::https::proxy "http://[your-proxy-host]:[your-proxy-port]/";
```

設定ファイル名は、これ以外でもOKです。

# dnfの場合は？

こちらへ。

https://qiita.com/charon/items/24f218007d57ac8bdfa0
【Linux】ランレベルについて

# 概要
SysVinitを採用しているシステムでは、ランレベルと呼ばれるいくつかの動作モード存在。
ランレベルごとに、どのようなサービスを起動させるのか(起動させないのか)を決定できる。

---

# Red Hat Enterprize Linux, CentOSでのランレベル

|ランレベル|説明|
|---|---|
|0|停止|
|1|シングルユーザモード|
|2|マルチユーザモード|
|3|マルチユーザモード|
|4|未使用|
|5|マルチユーザモード|
|6|再起動|

---

# Ubuntu, Debianでのランレベル

|ランレベル|説明|
|---|---|
|0|停止|
|1|シングルユーザモード|
|2|マルチユーザモード|
|3|マルチユーザモード|
|4|マルチユーザモード|
|5|マルチユーザモード|
|6|再起動|

--- 
# ランレベルの確認
現在のランレベルを確認するには`runlevel`コマンドを使用

```
# runlevel
N 3
```

runlevelコマンドは現在のランベルト、その前のランレベルを表示する。
上記コマンドは、現在のランレベルは「３」その前のランレベルは「N」。
起動直後でランレベルが設定されていないため「N」になっている。

---
# ランレベルの変更
ランレベルの変更はrootで`init`または`telinit`コマンドを使用。

```
# init 1
```
上記コマンドはランレベル1「シングルユーザモード」へ移行している。

---
# 補足
## SysVinitについて
SysVinitとは、システムの電源を入れてからLinuxが起動するまでの初期プロセスのこと。

SysVinitの他にも
- Upstart
- systemd

がある。
package-lock.json の name プロパティに差分が出る

# TL;DR

npm を 7.20.6 以降に更新する。

# 現象

複数で開発をしていて、チェックアウト直後に `npm install` すると、別の人がコミットした package-lock.json に対して次のような1行だけの差分が出る。

```diff_json
 {
   "name": "test",
   "version": "1.0.0",
   "lockFileVersion": 2,
   "requires": true,
   "packages": {
     "": {
+        "name": "test",
         "version": "1.0.0",
         ...
```

# 情報

- 原因： https://github.com/npm/cli/issues/2264
- 解決したバージョン： https://github.com/npm/cli/releases/tag/v7.20.6

# 解決例

```sh
npm install -g npm@7.20.6
```
DeprecationWarning: executable_path has been deprecated, please pass in a Service object   browser  = webdriver.Chrome(CHROME_DRIVER, options=options)の解決


#スクレイピングのこと

このコードだと

```python:scraping.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

CHROME_BIN = "/usr/bin/chromium-browser"
CHROME_DRIVER = '/usr/lib/chromium-browser/chromedriver'

options = Options()
options.binary_location = CHROME_BIN
options.add_argument('--headless')

browser = webdriver.Chrome(CHROME_DRIVER, options=options)
browser.get("https://www.google.co.jp")
print(browser.title)
browser.quit()
```

```text:結果
scraping.py:15: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  browser  = webdriver.Chrome(CHROME_DRIVER, options=options)
Google
```
というワーニングがでる。
以下の修正でそれが解消される。

```python:scraping2.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# Options
CHROME_DRIVER = '/usr/lib/chromium-browser/chromedriver'
options = Options()
options.headless = True
service = Service(CHROME_DRIVER)

browser = webdriver.Chrome(options=options, service=service)
browser.get('https://google.com')
print(browser.title)
browser.quit()
```

```text:結果
Google
```
ついでにbinary_locationを指定する意図が何か他にあるとして、スクレイピングするだけならbinary_locationの指定は不要で動いた。
そのためchromium-chromedriverをインストールすればchromium-browserも不要で動く。
syslogから指定した日時を検索してテキストファイルへ抽出

syslogから指定した日時を選択・検索しテキストファイルへ抽出する方法のメモです。

#1.環境・抽出日時
サーバー：AlibabaCloud広州リージョンECSecs.s6-c1m1.small（CentOS8.3 64bit）
抽出日時：Oct 18 00:00:00　～　Oct 18 23:59:59

#2.対象syslogファイル
```
root@hoge:/var# more proxy.log
INFO      Apr 16 00:00:01 [599]: Shutting down.
ERROR     Apr 16 00:00:01 [599]: No more children left. Shutting down.
INFO      Apr 16 00:00:01 [4943]: Initializing tinyproxy ...
INFO      Apr 16 00:00:01 [4943]: Reloading config file
INFO      Apr 16 00:00:01 [4943]: Binding outgoing connection to incoming IP
INFO      Apr 16 00:00:01 [4943]: Adding Port [443] to the list allowed by CONNECT
INFO      Apr 16 00:00:01 [4943]: Adding Port [563] to the list allowed by CONNECT
INFO      Apr 16 00:00:01 [4943]: listen_sock called with addr = '(NULL)'
INFO      Apr 16 00:00:01 [4943]: trying to listen on host[0.0.0.0], family[2], socktype[1], proto[6]
INFO      Apr 16 00:00:01 [4943]: listening on fd [0]
INFO      Apr 16 00:00:01 [4943]: trying to listen on host[::], family[10], socktype[1], proto[6]
INFO      Apr 16 00:00:01 [4943]: listening on fd [1]
INFO      Apr 16 00:00:01 [4943]: Now running as group "root".
INFO      Apr 16 00:00:01 [4943]: Now running as user "root".
INFO      Apr 16 00:00:01 [4943]: Setting the various signals.
INFO      Apr 16 00:00:01 [4943]: Creating child number 1 of 40 ...
INFO      Apr 16 00:00:01 [4943]: Creating child number 2 of 40 ...
INFO      Apr 16 00:00:01 [4943]: Creating child number 3 of 40 ...
INFO      Apr 16 00:00:01 [4943]: Creating child number 4 of 40 ...
```
#3.grepコマンド

```
cat proxy.log | grep -E 'Oct 18 ([0-9]{2}:[0-9]{2}:[0-9]{2})' >>result_1day
```
説明：grepオプションの-Eで正規表現で検索した結果をファイルへ出力します。
[0-9]{2}:[0-9]{2}:[0-9]{2}
0～9の間でマッチする数字[0-9]を繰り返し回数2回{2}で指定

#4.抽出結果
```
root@hoge:/var# more result_1day
INFO      Oct 18 00:00:01 [2514777]: Shutting down.
ERROR     Oct 18 00:00:01 [2514777]: No more children left. Shutting down.
INFO      Oct 18 00:00:01 [2518098]: Initializing tinyproxy ...
INFO      Oct 18 00:00:01 [2518098]: Reloading config file
INFO      Oct 18 00:00:01 [2518098]: Binding outgoing connection to incoming IP
INFO      Oct 18 00:00:01 [2518098]: Adding Port [443] to the list allowed by CONNECT
INFO      Oct 18 00:00:01 [2518098]: Adding Port [563] to the list allowed by CONNECT
INFO      Oct 18 00:00:01 [2518098]: listen_sock called with addr = '(NULL)'
INFO      Oct 18 00:00:01 [2518098]: trying to listen on host[0.0.0.0], family[2], socktype[1], proto[6]
INFO      Oct 18 00:00:01 [2518098]: listening on fd [0]
```
Svelte Shield 拡張機能のリリースと Toymorphism デザインの話

## はじめに

この記事は [Svelte Advent Calendar 2021](https://qiita.com/advent-calendar/2021/svelte) の２日目の記事です。

今年に開発した Svelte 製 OSS を二つご紹介させていただき、全体を振り返ってみてどうだったか、をまとめようと思います。



## Svelte Shield 拡張機能

Svelte Shield は去年リリースした、「目線移動無くサクサク日本語文を読めるツール」です。

この拡張機能版を今年の 2021/05 にリリースしました。

ページ内テキストを選択し、右クリックから実行できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85111/594cb19c-df9b-e6ef-0481-d136bf704a82.gif" alt="drawing"/>



* [Svelte Shield 拡張機能 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/svelte-shield-%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%B
  D/ogdlcilfgiojgaoglhhilbhnghchnceo?hl=ja)
* [GitHub](https://github.com/ampcpmgp/svelte-shield)



個人的には相当使っていて、だいぶインターネット記事を読むのが快適になりました。

[ウェブ版](https://ampcpmgp.github.io/svelte-shield/) で利用している [Neumorphism UI](https://demo.themesberg.com/neumorphism-ui/) はグローバルスタイルに影響し合うため、ページ埋め込み型のこの拡張機能には使えず、質素なスタイルになっています。

Neumorphism ライブラリでは Svelte 版や Web Components 版が無さそうで、いつか時間があるときに作りたいと感じていました。



## Toymorphism

こちらは「ウェブページをオモチャっぽくして楽しもう」という思想のもとに開発を始めた、コンポーネントライブラリです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85111/d2eaa7c3-ebf4-8cda-f471-4f8988d1efdf.png" alt="drawing"/>

* [Toymorphism](https://ampcpmgp.github.io/toymorphism/#/)
* [GitHub](https://github.com/ampcpmgp/toymorphism)



鋭意開発中で、今後はこれにガイドラインなどを定義していき、小さなデザインシステムを構築していこうと考えています。

最低限のものを一通り揃えた時点で、 Svelte日本や公式ディスコードで紹介したいです。

この開発に当たり IBM Carbon Design System や GitHub Primer のドキュメント・ソースコードを眺めました。 
Carbon Design System では sveld という svelte & js 向けの型強化ライブラリがとても便利で、 Toymorphism にも利用しました。また、GitHub Primer では CI 周りを参考にして、 changesets を利用することにしました。

将来的に Web Component 版や React 版も対応出来たら良いなと思い、 monorepo 構造にしています。こちらは svelte-kit の monorepo 構造を参考にさせていただきました。

成果はあまり出せてないですが、非常に学びが多く、良い経験になっています。


## 全体を振り返って

コンポーネントライブラリを作ってみたことで、 Svelte が苦手なこと（共通スタイルの定義など) も一部見えてきましたが、それでも総合的なメリットは小さくないと考えています。

また、今年は去年よりも Svelte のコードを書く時間が増えました。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85111/bcc48d38-1226-674e-c922-e7cc7dfde0a6.png) |
| ------------------------------------------------------------ |



上記は今年にコーディングした、各言語ごとの割合です。 (１カ月だけ WakaTime に課金してデータを取得しました)

TypeScript のコーディング時間のうち、半分くらいは React です。週４の React 案件と同じくらいコーディング時間を割けるようになったのはとても嬉しいです。

来年も Svelte 書く時間を増やしていけたら良いなと思います。

また、今後も使いやすくシンプルな Svelte の発展を期待しています。


最後まで閲覧いただきありがとうございました 🙇‍♂️🙇‍♀️🙇

🌈🏳️‍🌈🎨
【rails】 selfとはなにか？を解説しようと思う。

#selfとは。

備忘録も兼ねて記録を残そうと思います。

ここ２か月くらいselfってなんぞや？と思ってなんとなく
コードを記述していたのですが、ようやく全貌が見えてきました(笑)
(もっと早く理解をしろ！）←　って話ですね。

まぁそんな難しい話ではないので、サクッと説明をしていきます。

##まずselfとは？

selfという言葉の意味から解説をできればと思います。

selfって英語でもあると思うのですが自分自身とは私達自身って時に
youself、myself、themselves...なんて使い方をしますよね

「自身」という風に考えるのがポイント！

##selfってどこでつかわれるの？

では、selfってどこで使われるの？って話になりますが
モデルのメソッドで書く時に使いますよ！

？？？？

って感じだと思いますので、コードをみていきましょうか。

##selfの事例

では、コントローラーとモデルに記載をした例を
みていくとしましょう！

```php/コントローラー

  def create
    @post = current_user.posts.new(post_params)
    #:postはpostで投稿されてきた際にパラメーターとして飛ばされ、その中の[:tag_id]を取得して、splitで,区切りにしている
    tags = params[:post][:tag_id].split(',')
    if @post.save
    #@postをつけることpostモデルの情報を.save_tagsに引き渡してメソッドを走らせることができる
      @post.save_tags(tags)
      redirect_to root_path, success: t('posts.create.create_success')
    else
      render :new
    end
  end

```

```php/モデル

  # タグ付けの新規投稿用メソッド
  def save_tags(tags)
    tags.each do |new_tags|
      # selfは明示的に記載していてこの場合だとコントローラーの@postになる
      # tag_relationshipsがthroughしているのでtagsでアソシエーションを指定すると中間テーブルを通過した際に保存される。
      self.tags.find_or_create_by(name: new_tags)
    end
  end

```

まずはコントローラーのこちらに注目です。
@post.save_tags(tags)
この@postにはPost.find(params[:id])で
ある特定のpostの情報が入っています。

そして、.save_tags(tags)はメソッドです。
メソッドがなにかというと、
自分で作れる処理のまとまりのことです。
つまり自作した処理のコードをモデルに書いて
それをコントローラー側で呼び出すことができます。

こうすることでコントローラーの記述が
スッキリして見やすくなるのでリーダブルコードになりますよ！

次にモデルの中のメソッドの記述をみていきます。
どこでselfが使われているかというと下のココという箇所。

def save_tags(tags)
    tags.each do |new_tags|
      # selfは明示的に記載していてこの場合だとコントローラーの@postになる
      # tag_relationshipsがthroughしているのでtagsでアソシエーションを指定すると中間テーブルを通過した際に保存される。
ココ ⇒ self.tags.find_or_create_by(name: new_tags)
    end
  end

このselfっていったいなんぞや？ということですが
実はコントローラー側で@post.save_tags(tags)と
インスタンス変数を記載しましたよね？

モデルにメソッドを書く時に@postと書かなくても
モデルには@postの情報をselfと書くことで
Post.find(params[:id)を引き渡せるんですね。

つまりselfというのは、@post = Post.findなので
@post = self = Postモデルということになります。

インスタンス変数にPost findと書いているので
Postモデルに記載をすることでpost自身だからselfと
いう風な書き方をすることができます。

ちなみにselfは書いても書かなくてもいいのですが
書いた方がpostモデルの情報を引き継いでいるんだな！と
見やすく分かりやすくなるので書いた方が親切です。

selfがなくても、処理自体はコントローラーで
@post.save_tagsと書いているので@postの情報を
引き継いだままsave_tagsメソッドを走らせることはできます。

##selfのまとめ

以上でselfの解説を終わりにしようと思います。

いかがでしたでしょうか？

selfをもう一度まとめると。

・自分自身という意味
・コントローラーで指定したモデル名とメソッドを各モデルが一致していたらselfが使える
・一致していない場合は、selfは使えずモデル名の指定が必要

それでは、簡単に説明しましたがいかがでしたでしょうか？

もし誤りなどがあれば気軽にコメントくださいね！

それではチャオ！
C++でJavaのThread風に使えるクラスを実装する

#JavaのThread感覚で使えるクラスがC++でも欲しい
Javaでマルチスレッドプログラミングを行う際の基本といえば、Threadクラス(もしくはRunnableインターフェース)を継承(実装)し、run()メソッドをオーバーライドするというものです。

C++でもC++11から標準でstd::threadが使えますが、個人的にはJavaのThreadクラスのほうが使いやすいと思っています。

C++でもQtなどを使えばQThreadが同じような感覚で使えますが、C++標準のthreadを使って同じようなクラスを作成することは可能です。

#C++で作るThreadクラス
```cpp:Thread.hpp
#ifndef THREAD_HPP_INCLUDED
#define THREAD_HPP_INCLUDED

#include <thread>

class Thread
{
public:
    Thread() {}
    ~Thread() {}

    void start()
    {
        _th = std::thread(&Thread::run, this);
    }

    void join()
    {
        _th.join();
    }

protected:
    virtual void run() = 0;

private:
    std::thread _th;
};

#endif
```

スレッドに行わせる処理はrun()関数に定義するので、これは純粋仮想関数にしておきます。

実際に使用する際は、このThreadクラスを継承します。

```cpp:ThreadImpl.hpp
#include <iostream>
#include "Thread.hpp"

class ThreadImpl : public Thread
{
public:
    ThreadImpl() {}
    ~ThreadImpl() {}

protected:
    void run() override;
};

inline void ThreadImpl::run()
{
    std::cout << "Thread is doing some work...\n";
}
```

```cpp:main.cpp
#include <iostream>
#include "ThreadImpl.hpp"

int main()
{
    ThreadImpl th;
    th.start();
    th.join();

    return 0;
}
```
M1 ProでFlutterプロジェクトのベンチマークをとってみた

## MacBook Proが発売された！

MacBook Pro 16インチ M1 Pro搭載モデル届きました！　
本当に待ちました。。。もう1年近くSSDの容量不足に悩まされ、プロジェクトのビルド時間も気になってきていたので、早くでてくれないかと思っていました。
本日データ移行やらアプリのインストール作業を行なっているときにベンチマークもとったので、共有してみます。

## 比較PCスペック

#### 旧PC
MacBook Pro 15インチ 2017 
2.8GHz クアッドコア Intel Core i7
メモリ 16G

#### 新PC
MacBook Pro 16インチ 2021 
M1 Pro
メモリ 32G

## ベンチマーク対象

sqfliteなど、簡単なライブラリを使ったFlutterアプリ。

## ベンチマーク方法

`flutter clean`後に`pub get`し、その後にAndroid Studioから、iPhone, Androidの実機それぞれに再生ボタンを押しから、ビルド〜実機インストール、画面にアプリの最初の画面が表示されるまでの時間を計測しました。
また、インストール後に停止ボタンを押して、キャッシュのある状態で、再生〜画面が表示されるまでの時間も計測してみました。

## 結果
|   |iPhone  |iPhone<br/>(キャッシュあり)  |Android  |Android<br/>（キャッシュあり）  |
|---|--:|--:|--:|--:|
|旧PC  |89秒  | 55秒 |56秒  | 17秒  |
|新PC  |51秒  | 25秒  |26秒 | 10秒  |

## まとめ

ざっくり2倍くらいでしょうか？ flutterはhot reloadもあるので、それほど頻繁にビルドしないかもですが、新しくライブラリを入れたり、initStateを修正したりしたときに、ちょいちょい停止、再生作業が必要なので、この速さは嬉しいです。

M1 Proを検討している方に参考になれば幸いです。