OmniAICreator/Qiita-1.07M huggingface dataset:
Folding@homeをUbuntu 18.10+にインストールするときに起きる厄介なこと

## はじめに
**この手法はあくまでもワークアラウンドです。パッケージの依存関係を意図的に汚染している点にご注意ください。**

2000年から稼働を開始した**Folding@home**という名前の分散コンピューティングプロジェクトがあります。
このプロジェクトは、ある特定のタンパク質が**どのような立体構造に折りたたまれるか**[^folding]、という課題を解決するために**全世界の余剰計算資源**を使って分子動力学シミュレーションを走らせるものです。
このプロジェクトの一部には、~~昨今世間を悪い意味で賑わせている~~**新型コロナウィルス（SARS-CoV-2）に対する取り組み**も含まれており、2020年4月初頭においても急激に参加者が増えている現状です[^good]。

一方で、Linux環境用のFolding@homeクライアントは、サポート終了したPython2系の依存関係を含んでおり、Ubuntu 16.04 LTS/18.04 LTS以外のUbuntu環境[^or-debian]において、GUI用のパッケージ（FAHControl）が**上手くインストールできない問題**が発生しています。

クライアントのコアパッケージ部分であるFAHClientのみをインストールし、ホームネットワークのWindows等からリモートアクセスする形態が一番安全な策ではあるのですが、諸般の事情によりそのような回避策が使えない、もしくはどうしてもローカル上でGUIを表示したい場合もあるでしょう。
したがって今回、debパッケージングにおけるフェイクパッケージという手法を用いてこの問題を回避します。

## TL; DR
```shell-session
$ cd ./SOMEWHERE/TO/WORK/DIRECTORY
# apt install equivs
$ equivs-control python-gnome2
$ vi python-gnome2  # L9 -> "Package: python-gnome2", L10 -> "Version: 2.28.1", L18 comment-out
$ equivs-build python-gnome2
# apt install ./python-gnome2*.deb
# apt install ./YOUR/DOWNLOAD/DIR/fahcontrol*.deb
```

## 問題と解決
予め`fahclient*.deb`, `fahcontrol*.deb`, `fahviewer*.deb`はダウンロードしておく。

```shell-session
# apt update && apt upgrade -y  # いつもの
# apt install ./fahclient*.deb  # これは成功する
# # apt install ./fahcontrol*.deb  # これが失敗する、失敗すると面倒なので実行しない
```

依存関係の解決に失敗するのは`python-gnome2`という名前のパッケージがUbuntuのサポートから外されてしまっているため。
実はこいつがなくても（見た目上）FAHControlは動作する。
したがって、パッケージマネージャに**`python-gnome2` がインストールされている**と思い込ませるだけで問題ない。
この作業に役立つのが`equivs`パッケージ。

```shell-session
# apt install equivs
$ equivs-control python-gnome2  # カレントディレクトリにpython-gnome2ファイルが生成される
$ vi python-gnome2  # 編集（後述）
$ equivs-build python-gnome2  # カレントディレクトリにフェイクパッケージpython-gnome2*.debが生成される
# apt install ./python-gnome2*.deb
# apt install ./fahcontrol*.deb ./fahviewer*.deb  # work well!
```

python-gnome2の要編集ポイントは以下の通り。

- L9: `Package: <package name; defaults to equivs-dummy>` -> `Package: python-gnome2`
- L10: コメントアウト -> `Version: 2.28.1`
    - 念の為16.04/18.04に準拠したバージョン[^by-now]にしておく
- L11: コメントアウト -> `Maintainer: Your Name <yourname@example.com>`
    - ここは趣味、どっちでも
- L18: コメントアウト -> `Architecture: all`
- L27-: `Description: A fake package to make FAHControl Install`
    - ってことが後から見て分かればいいので文面はご自由に

## あとがき
Debianあんまりわからないので間違いあったら指摘してください。

## 参考
[Debian 管理者ハンドブック - 15.2. 最初のパッケージのビルド](https://debian-handbook.info/browse/ja-JP/stable/sect.building-first-package.html)
[StackExchange - How to install folding at home (Folding@home FAHControl) on Ubuntu 19.10
](https://askubuntu.com/questions/1217195/how-to-install-folding-at-home-foldinghome-fahcontrol-on-ubuntu-19-10)

[^folding]: フォールディングといいます
[^good]: いいことです
[^or-debian]: またはそれに類するDebian系Linuxディストリビューション
[^by-now]: 執筆時点2020/04/05現在
Arduinoと8ビットシフトレジスタで LEDを制御する

### シフトレジスタとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/72d26ead-5919-ed4a-b59e-98d71d7f3a9c.png)

一言で説明すると「少ないピンでより多く出力できる」
Arduinoの場合GPIOの数が限られていますので、シフトレジスタを使うことで配線がスッキリすると思います。
動作原理を理解するのは大変ですが、まずは手を動かして確認してみましょう
[この記事が大変参考になります。
](https://qiita.com/elyoshio92/items/b207d8e534e7169854f7)

### LEDを制御してみる
配線図は下記の通りです. 3線の出力で8個のLEDを制御しています 
![425CC0A9-1C78-4A7E-A867-30DBED7F4C7C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/e60930f9-156a-70c0-9568-3ab25a290871.png)

まずは1個だけ点灯するコード

```c
#define SRCLK   (5)//シフトレジスタのクロック信号
#define RCLK    (6)//ストレージレジスタのクロック信号
#define SER     (7)//シリアル入力

void setup() {
  pinMode(SRCLK, OUTPUT);
  pinMode(RCLK,  OUTPUT);
  pinMode(SER,   OUTPUT);
  
  byte b = B00000001;
  
  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST , b);
  digitalWrite(RCLK, HIGH);

}

void loop() {
   
}
```


連続で点灯するコード

```c
#define SRCLK   (5)//シフトレジスタのクロック信号
#define RCLK    (6)//ストレージレジスタのクロック信号
#define SER     (7)//シリアル入力

void setup() {
  pinMode(SRCLK, OUTPUT);
  pinMode(RCLK,  OUTPUT);
  pinMode(SER,   OUTPUT);
}

// パターン
const uint8_t PATTERNS[] = {
  0b00000001,
  0b00000010,
  0b00000100,
  0b00001000,
  0b00010000,
  0b00100000,
  0b01000000,
  0b10000000,
};

void loop() {
  
  // パターンの数
  int pattern_num = sizeof(PATTERNS)/sizeof(PATTERNS[0]);

  for (uint8_t i=0; i<pattern_num; i++) {
    // 8ビット分のデータをシフトレジスタへ送る
    shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]); 

    // シフトレジスタの状態をストレージレジスタへ反映させる
    digitalWrite(RCLK,  LOW);
    digitalWrite(RCLK,  HIGH);

    delay(500);
  }
}

```
PHP【Laravel】：POSTの設定とCSRF対策について

PHPのフレームワークLaravelでPOSTを使い値を送信する際の注意点について学んだのでメモ。

POSTを使うなんてプログラミングを学び始めの頃、見よう見まねでできたのに、何今頃つまずいているんだと凹みながら色々調べていたら、Laravelでは少し勝手が違うようだった。

まず、以下のコードを書きを実行したら、「419のHTTPステータスエラー」が出た。

###ビュー

```php:sample.blade.php　
<h1>タイトル</h1>
      <p class="name">ようこそ！{{$msg}}さん</p>

  <form method="POST" action="/sample">
     名前を入力してください<br>
    <input type="text" name="msg">
    <input type="submit">
  </form>
```

###ルーティング

```php:web.php
Route::get('/sample', 'SampleController@test');
Route::post('/sample', 'SampleController@test');
```

###コントローラ

```php:SampleController.php
class SampleController extends Controller
{
  public function test(Request $request){

    $data['msg'] = $request->msg;

    return view('sample.sample', $data);
    //
  }
```



###原因はCSRFトークン：
原因はCSRFトークンでした。
Laravelでは、クロスサイトリクエストフォージェリ対策として、CSRFトークンを使用することができます。

[CSRFについて](http://e-words.jp/w/CSRF.html)

Laravelではミドルウェアにデフォルトで

```php:kernel.php
 \App\Http\Middleware\VerifyCsrfToken::class
```
という記載があります。



```php:kernel.php
protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
```

なのでCSRF対策の仕組みを実際に使う必要があります。


###修正
ビューに@csrfを追記。

```php:sample.blade.php
<h1>タイトル</h1>
      <p class="name">ようこそ！{{$msg}}さん</p>

  <form method="POST" action="/sample">
    @csrf
     名前を入力してください<br>
    <input type="text" name="msg">
    <input type="submit">
  </form>
```

もしくは、ミドルウェアで無効化（コメントアウト）。


```php:kernel.php
protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            //　\Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,

           // \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
```
Python で JSON ファイルを読み書きする

## サンプルコード

```py
import json


print('********** JSONファイルを書き出す **********')

# 辞書オブジェクト(dictionary)を生成
data = dict()
data['message'] = 'Hello, world.'
data['members'] = [
  {'name': 'アリス', 'color': '#FA3E05'},
  {'name': 'ボブ',   'color': '#FFFFAA'}
]

# 辞書オブジェクトをstr型で取得して出力
print(json.dumps(data, ensure_ascii=False, indent=2))

# 辞書オブジェクトをJSONファイルへ出力
with open('mydata.json', mode='wt', encoding='utf-8') as file:
  json.dump(data, file, ensure_ascii=False, indent=2)


print('********** JSONファイルを読み込む **********')

# JSONファイルからテキストストリームを生成
with open('mydata.json', mode='rt', encoding='utf-8') as file:
  print('file: ' + str(file))

  # 辞書オブジェクト(dictionary)を取得
  data = json.load(file)
  print('data: ' + str(type(data)))

  # JSONデータから必要な箇所を出力
  print('message: ' + data['message'])
  for member in data['members']:
    print(member['name'] + ': ' + member['color'])
```

## 実行結果

Python 3.8.2 で実行した結果。

```
********** JSONファイルを書き出す **********
{
  "message": "Hello, world.",
  "members": [
    {
      "name": "アリス",
      "color": "#FA3E05"
    },
    {
      "name": "ボブ",
      "color": "#FFFFAA"
    }
  ]
}
********** JSONファイルを読み込む **********
file: <_io.TextIOWrapper name='mydata.json' mode='rt' encoding='utf-8'>
data: <class 'dict'>
message: Hello, world.
アリス: #FA3E05
ボブ: #FFFFAA
```

出力したJSONファイル

```json
{
  "message": "Hello, world.",
  "members": [
    {
      "name": "アリス",
      "color": "#FA3E05"
    },
    {
      "name": "ボブ",
      "color": "#FFFFAA"
    }
  ]
}
```

## 参考資料

[json \-\-\- JSON エンコーダおよびデコーダ — Python 3\.8\.2 ドキュメント](https://docs.python.org/ja/3.8/library/json.html)

> json の API は標準ライブラリの marshal や pickle のユーザに馴染み深いものです。

[組み込み型 — Python 3\.8\.2 ドキュメント](https://docs.python.org/ja/3.8/library/stdtypes.html)

> 辞書は key: value 対のカンマ区切りのリストを波括弧でくくることで作成できます。例えば: {'jack': 4098, 'sjoerd': 4127} あるいは {4098: 'jack', 4127: 'sjoerd'} 。あるいは、 dict コンストラクタでも作成できます。
VLCを使ってmp3変換をバッチ処理

# 概要
VLCはプレイヤーとしてだけでも便利ですが、変換機能も便利ですよね。動画から音声だけを抜き出すのに使ってます。
１ファイルだけでもちょっと操作が面倒なのですが、ファイルが沢山あるとさらに面倒なので、windowsのバッチファイルにして引数で指定できるようにしました。

# ソース

``` conv.bat
@echo off
set VLC="C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"
set INPUT_FILENAME="%1"
REM 拡張子3文字固定
set OUTPUT_FILENAME=%INPUT_FILENAME:~0,-5%.mp3"

%VLC% --no-repeat --play-and-exit -I dummy -vvv %INPUT_FILENAME% --sout "#transcode{vcodec=none,acodec=mp3}:file{dst=%OUTPUT_FILENAME%}" vlc://quit
if exist %OUTPUT_FILENAME% (
	echo Done.
) else (
	echo Error.
)
```

# 呼び出し

``` cmd
$> conv.bat hoge.mp4
```

# ポイント
普通にコマンドラインで呼ぶと、ずっと処理が返らないことがあります。これには２つ原因があります。

１つは、処理が終わった時にVLCを終了する指定。
今回は--play-and-exit, vlc://quit の両方をつけておきましたが、どちらか１つだけでも大丈夫でした。汎用的には後者のほうが良さそうです。

もう１つはループ。デフォルトなのか保存された設定なのかわかりませんが、全曲リピート指定されていると、処理がずっとループしてしまいます。--no-repeat でリピートしない指定にしています。

# 補足
- 面倒なので拡張子は3文字固定で、それをmp3に変えるようにしました。
- サンプリングレート、チャンネル数なども指定できますが今回は省略。
- 出力ファイルが出来たかどうかは出力するようにしておきました。


# 参考リンク
- [VLC公式](https://www.videolan.org/vlc/)
- [VLC command-line help - VideoLAN Wiki](https://wiki.videolan.org/VLC_command-line_help)
- [Windowsバッチまとめ - Qiita](https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f)
- [The Strange Storage: VLCを使ってWMAファイルをMP3へ変換する方法](https://www.storange.jp/2019/02/vlcwmamp3.html)
Microsoft Teams | 10分でできる 授業で利用するチームの準備する

関連記事は[**「Microsoft Teams の授業での活用」**](https://qiita.com/hisaho/items/12837a169bd6f1d90d5c)をご参照ください。

#　はじめに

本記事は Microsoft Teams を授業で利用する手順に関して解説いたします。
はじめての方は以下の記事を参照してください。

- [10分でできる Office 365 Education A1 の利用開始手続き](https://qiita.com/hisaho/items/74b6ba9ba9b4f501f74c)
- [10分でできる Office 365 Education のユーザー登録](https://qiita.com/hisaho/items/58e4e4024ee73280ece7)

# Teams にログインする

- Webブラウザから[https://teams.microsoft.com](https://teams.microsoft.com)にアクセスします。
Microsoft Teams はWebブラウザもしくはアプリ(Windows, iOS, Android)から利用可能です。本記事ではWebブラウザから利用する方法で説明していきます。**[代わりにWebアプリを使用]**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/99cf42b2-ffdd-b858-cc3f-05ec5474a2ab.png)

- はじめて利用する人は以下のような画面が表示されます。**[次へ]**を順番にクリックして、最後に**[参加する]**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/27e1e3fa-a742-c3f7-7055-5ae0baf68358.png)

- **[参加する]**をクリックすると以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/d1866d82-8b02-0760-c248-b2bd5ec76c93.png)


# 授業用のチームを作成する

- 画面左の**[チーム]**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/561a11f2-69eb-f9c4-c04f-5e600c47ba65.png)

- **[チームを作成]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/959c89f7-2c63-f767-8e70-9fe8cac200da.png)

- 授業で Teams を利用する場合は、**[クラス]**を選んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/f9de675f-2687-67e1-eac4-63e4906ad03e.png)

- チームの名前、説明を記入したら**[次へ]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/bbef6180-afc5-ad3f-7d90-03b3c5c50a2b.png)

- **「ユーザーを追加」**の画面が表示されますが、ここではユーザーを追加しませんので、**[スキップ]**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/871d5494-53af-4dd9-ceb6-479d175a1b12.png)

- 新しく作成したチームの画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/2cc3e059-d1f1-0629-c5d3-43b91fc6dbf4.png)

# 学生をこのチームに招待する

- チームの所有者は、チーム名の横の**[その他のオプション]**の**[...]**→**[チームの管理]**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/699b6fbd-eea2-d45a-6ee1-3bf061f64b1f.png)

- **[設定]** をクリックし、**[チームのコード]** の **[生成]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/1f534c19-439d-0428-0477-bba8429e3bfc.png)


- チームのコードが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/e65d5f9c-9b8a-ba7b-ab3d-605c36d42813.png)


# 学生がこの授業に参加するには

- 学生は、Teams のトップ画面からチームのコードを入力すれば、この授業のチームに参加できす。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/6a625fb5-8fe0-06d8-3e52-5db49b466087.png)
GIMP & Pythonで画像編集　～　画像の回転

# はじめに - この記事でやりたいこと
写真の撮影時に生じた傾きを補正したい。これ自体は各種レタッチソフトでできる。
しかし、枚数が増えると1枚1枚角度を指定するのが面倒。
そこでGIMPのPythn-Fuを利用して、ある程度の操作を自動化することにする。
（PhotoShopの「ものさしツール」のようなことをやりたい）

▼左画像の赤線のように水平の基準を指定して回転させたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/dac38bd4-c765-7986-da26-6f1d1423692a.png)

# 方法
以下のような方法でやりたいこと実現します。

### 回転の基準となる直線を選択する
GIMPでは直線を選択することはできないので矩形選択で代用します。
時計回りの場合は右上と左下を結んだ直線、反時計回りの場合は左上と右下を結んだ直線が基準の直線になります。

### 作成したPython-fuを実行する
Python-fuの処理は以下のような流れです。

1. GIMPのUIで時計回り・反時計回りを選択する（引数で主処理へ渡す）
1. 回転角度を算出する。
1. 回転後のサイズに合わせて描画領域を拡大する。
1. 回転処理を実行する。

# ソース

```.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import math
from gimpfu import *

# 画像の回転
################
def rotate_image(img,radian):
    # レイヤーの選択
    lay=img.active_layer
    
    # 回転時に必要となる余白の計算
    width=img.width
    height=img.height

    abs_radian = abs(radian)
    new_width=int(round(math.cos(abs_radian)*width+math.cos(math.pi/2-abs_radian)*height,0))
    new_hight=int(round(math.sin(abs_radian)*width+math.sin(math.pi/2-abs_radian)*height,0))
    
    # リサイズ・移動
    img.resize(new_width,new_hight,0)
    lay.translate((new_width-width)/2, (new_hight-height)/2)
    
    # 回転
    pdb.gimp_item_transform_rotate(lay ,radian ,TRUE ,0 ,0)

# 主処理
################
def plugin_main(image, layer,radio):

    # undoグループの開始
    pdb.gimp_image_undo_group_start(image)

    # 処理対象の画像を取得
    img=gimp.image_list()[0]
    
    #回転角度の算出
    ## 選択範囲の座標を取得
    non_empty,x1,y1,x2,y2=pdb.gimp_selection_bounds(img)

    ## ラジアンの導出
    if radio=="0":
        # 反時計回り
        radian = math.atan2(y1-y2, x2-x1)
    else:
        # 時計回り
        radian = math.atan2(y2-y1, x2-x1)
        
    ## 選択範囲が残ったままだと回転時に選択範囲のみが回転対象となるのでクリア
    pdb.gimp_selection_none(img)
    
    # 回転の実行
    rotate_image(img, radian)
    
    # undoグループの終了
    pdb.gimp_image_undo_group_end(image)

register(
    "rotate",#コマンドラインまたはスクリプトから呼び出す場合のコマンドの名前
    "rotate",#プラグインの説明
    "rotate",#プラグインの詳細な説明
    "am(author)",#プラグインの作成者
    "am(author)",#プラグインの著作権保有者
    "2020/04/05",#著作権の日付
    "<Image>/Filters/Languages/Python-Fu/rotate", #メニューの中でプラグインに使用されるラベル
    "RGB*, GRAY*", #プラグインで処理する対象となる画像のタイプ
    [(PF_RADIO, "PF_RADIO", "direction of rotation?", "clockwise", (("clockwise", "1"), ("anticlockwise", "0"))),],#引数
    [], # 戻り値
    plugin_main) # メソッド名

main()
```

# 残課題

- 複数レイヤーを扱う場合
今回はデジカメで撮影した画像の編集、という目的なのでレイヤは1枚であることが前提です。
複数レイヤを扱う場合、修正が必要になります。

- 複数画像を開いている場合
**gimp.image_list()[0]**で取得される画像はGIMPで最後に開いた画像になります。
本来であれば、Python-Fu実行時点でアクティブな画像を取得できるのが望ましいですが、どうやら簡単に取得する方法はないようです。**active_layer**のように取得できれば楽なのですが。
参考：[Get currently active image in python (2012) — GIMP Development — gimpusers.com](https://www.gimpusers.com/forums/gimp-developer/14183-get-currently-active-image-in-python)


# 参考にした記事

[GIMPのスクリプト（python-fu）のつくり方について書くで？🤜🤛 - Qiita](https://qiita.com/am10/items/5c62cda827c405932064)
テンプレートはこちらから拝借しました

[GIMP Library Reference Manual](https://developer.gimp.org/api/2.0/libgimp/index.html)
GIMPのライブラリリファレンス
0からAngularプロジェクトを作る方法

### はじめに
本記事は初心者向け、Angularプロジェクトの環境構築、作る方法などを説明します。

### 環境準備
下記のソフトウェアを予めインストールしてください。

- 開発IDE: [WebStorm ](https://www.jetbrains.com/webstorm/)（任意）
- [NodeJs](https://nodejs.org/en/)　（必須）
- Angular/Cli　（必須）

Nodejsをインストールしたら、下記のコマンドでAngular/Cliをインストールできます。
> npm install -g @angular/cli
バージョンを指定し、インストールしたい場合は：
> npm install -g @angular/cli@バージョン

すべてのインストールが終ったら、コマンドで確認してください。以下のような情報が出たら、OKです。
> ng -v
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/f409cbfa-df82-fc6d-dfef-0e7ac44143c3.png)

### ブランクプロジェクトを作る
下記のコマンドでブランクプロジェクトを作ります。
> ng new プロジェクト名
たとえばね、
ng new tasker

コンソールを見たら、無事に作成しました。

### 起動
下記のコマンドでAngularプロジェクトを起動します。
> ng serve

また、ポートを変更したい場合は下記のコマンドでもいいです。
> ng serve --port 4200

http://localhost:4200/ をブラウザで開くと、画面がうまく表示すれば、OKだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/23b3f6cf-998c-61ed-7041-5f50f689a4f8.png)

ここまで行くと、Angularのブランクプロジェクトを作り終わります。

### 最後に
最近は、私もAngularを勉強したきっかけでGithub上でオープンソースのプロジェクトを作って開発し続けます。
https://github.com/Hyman1993/tasker
フロントエンドに趣味がある皆さん、一緒に頑張りましょう。
【UE4】C++で独自のゲームモード作ってみる【UnrealEngine】【C++】


C++超入門レベルの内容になります。
今回はゲームモードをC++で実装します。


1.初めに
---------------------------------
まずはゲームモードクラスを継承したオリジナルのゲームモードクラスを作る

コンテンツブラウザを右クリック->新規C++から
![GameModeClass.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/562e097f-3f6d-987b-df9a-d8d7c72d6161.png)

↓　C++のゲームモードが出来ていると思います
![C++Game.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/27a132d2-c75e-9fa0-9e94-8bbbf42ea0fc.png)


2.C++でオリジナルの処理を加える
----------------------
VisualStudioを立ち上げ何も関数が書かれていないオリジナルのゲームモードクラスのヘッダーファイルに 

####virtual void StartPlay() override; と記入 この関数は起動時に最初の一回のみ呼び出さる関数です。Unityでいう所のStart関数です。
![StartPlay.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/6ca4f9bd-6b81-a7a7-b21b-786d0a721e8b.png)

####StartPlay関数で GEngine->AddOnScreenDebugMessageで文字を表示させる処理を追加してみる
![C+文字表示.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/6a9f82fa-e8a5-2ac0-22f4-691cd34c0736.png)
GEngineは”Engine.h”をインクルードする必要があります。

###処理を書き終えたらしっかりコンパイルを押そう
![コンパイル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/bfe174f8-2045-3de6-1193-9b3eee482bf9.png)
※コンパイルを押さない限りUE4側に反映されないので忘れずに最後に押す必要があります。

3.さっそく今のレベルで使ってみる
------------------------
![ゲームモード追加.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/8a22cba9-c8e8-38b4-6052-321c7bb34411.gif)

C++版オリジナルゲームモードを今のレベルに設定した起動してみると・・・
![表示されてた.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/03ccc049-9c54-cb9d-7c46-f020a3ccc5f5.png)
しっかり画面に文字が表示されてますね。

4.C++で作ったゲームモードをベースにしてブループリントにする
------------------------------------
「この機能はC++で実装したいけど、あの処理はBluePrintで実装したい。。」と感じた時は、
作ったオリジナルゲームモードをベースにしてブループリントで編集することができます。
![ベースにして.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/7d7ed489-6531-9c46-06eb-bb2d7aeedcb1.gif)


ブループリント内で文字を表示させる処理を書いて実行するとブループリントとC++両方から文字が呼び出されます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/dd4961fe-6ee9-a2cc-2810-3754d5327c15.png)
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/ce881049-e314-637c-66c1-2514ea4c7c18.png)

無限の可能性を感じる。

終わりに
---------------
初歩の初歩ですが、
各クラスをC++で拡張して作れる独自のブループリントは上手く活用できたらとても便利そうです。

ここのチュートリアルから覚えた事を記事にしてます
https://docs.unrealengine.com/ja/Programming/Tutorials/index.html
VS CodeのRemote-SSHでWSL上の設定を使う

# 目的

最近のVisual Studio Code (VSCode)ではRemote-WSLを始め，Windows Subsystem for Linux (WSL)との連携が強化され，WindowsでありながらほとんどLinuxのような使用感を得ることができるようになりました．Remote-Developmentの機能の一部であるRemote-SSHでは，サーバー上のファイルをVSCodeで直接編集できるようになります．

ただしWindows版VSCodeのRemote-SSHでは，デフォルトではsshをWindows上にインストールしないと行けないらしく，鍵や設定も`C:\Users\[ユーザー名]\.ssh`を見にいきます．これをWSL上でsshに切り替えられないかというのが今回のモチベーション．

# やり方

少なくともissueが出ています．

https://github.com/microsoft/vscode-remote-release/issues/937


暫定的には以下のバッチファイルをsshの変わりに実行しましょう．

https://gist.github.com/diablodale/54756043c395d712053cf0d50a86086a

configファイルの場所を指す`remote.SSH.configFile`は`\\\\wsl$\\Ubuntu\\home\\username\\.ssh\\config`が良いそうですが，私の環境では途中にシンボリックリンクがあるためか動かなかったので，`$HOME/.ssh/config`に設定しました．ssh実行前はWindows上なので残念ながらconfigに記入されたホストが表示されませんが，sshが実行されるときはWSL上なのでWSL上のconfigファイルが読み込まれます．
Visualforceページで読み込んだLWCでページ遷移が動かない現象への対策

# はじめに
Lightning用に開発したLWCをVisualforceで読み込んでClassic向け画面の開発工数を抑えたい場面があるかと思います。
そんなときにLWCで「Navigation」機能を使用した画面遷移のイベント処理が上手く動かない事象にぶち当たりました。
将来的に「Navigation」機能の挙動自体が修正されると有り難いですが、auraコンポーネント側に画面遷移処理を実装することで回避できましたので、実装例を共有します。

# 素直に実装してみる
「Navigation」で画面遷移するLWC、Lightning Outするaura、これらを組み込んだVFを作成します。

## LWC
* sample.html

```
<template>
    <lightning-button label="test" onclick={navigateToObjectHome} class="slds-m-left_x-small"></lightning-button>
</template>
```

* sample.js

```
import {LightningElement} from 'lwc';
import {  NavigationMixin} from 'lightning/navigation';

export default class Sample extends NavigationMixin(LightningElement) {
  navigateToObjectHome() {
     this[NavigationMixin.Navigate]({
       type: 'standard__objectPage',
       attributes: {
         objectApiName: 'Account',
         actionName: 'home',
       },
     });
  }
}
```

## aura
* SampleApp.app

```
<aura:application access="GLOBAL" extends="ltng:outApp">
</aura:application>
```

## VF
* SampleVF.page

```
<apex:page >
    <apex:includeLightning />
    <div id="lt_comp" />

    <script>
      $Lightning.use("c:SampleApp", function () {
        $Lightning.createComponent("c:sample", {}, "lt_comp", function (cmp) {});
      });
    </Script>
</apex:page>
```

タブを追加するなどしてVFページの挙動を確認するとページ遷移が行われないのがわかると思います。


# 回避策
LWCでイベントをディスパッチし、LWCをラップするauraを新規追加してイベント処理を実装します。
合わせてVFからは追加したauraを読み込む修正を実施します。

## LWC
* sample.js

```
import {LightningElement} from 'lwc';
import {  NavigationMixin} from 'lightning/navigation';

export default class Sample extends NavigationMixin(LightningElement) {
  navigateToObjectHome() {
    // this[NavigationMixin.Navigate]({
    //   type: 'standard__objectPage',
    //   attributes: {
    //     objectApiName: 'Account',
    //     actionName: 'home',
    //   },
    // });
    const movePageEvent = new CustomEvent('movePage');
    this.dispatchEvent(movePageEvent);
  }
}
```

## aura


* SampleWrapper.cmp

```
<aura:component >
    <c:sample onmovePage="{!c.handlemovePage}" />
</aura:component>
```

* SampleWrapperController.js

```
({
  handlemovePage: function (cmp, event) {
    if( (typeof sforce != 'undefined') && (sforce != null) ) {
      // Componet を Application に読み込んでいるときにはこっち
      sforce.one.navigateToURL('/001');
    } else {
      // クラシック
      window.open('/001', "_top");
    }
  }
})
```


## VF
* SampleVF.page

7行目 「c:sample」を「c:SampleWrapper」に変更

```
<apex:page >
    <apex:includeLightning />
    <div id="lt_comp" />

    <script>
      $Lightning.use("c:SampleApp", function () {
        $Lightning.createComponent("c:SampleWrapper", {}, "lt_comp", function (cmp) {});
      });
    </Script>
</apex:page>
```

# 参考リンク
[LWCをVFで読み込む実装例](https://jappy.hatenablog.com/entry/2019/01/21/220410)
[LWC Navigation機能ヘルプページ](https://developer.salesforce.com/docs/component-library/bundle/lightning-navigation/documentation)
discord.pyサイトに載っていなくて困ったコードメモ

#discord.py メモ
随時更新したいと思います
discordで私が困ったこと(サイトを探しても見つからなかったもの)
をメモしときます参考までにどうぞ～
##前書き
python 3.8.1
windows10
※discord.clientを使用し関数から直接書き始めます


##コード一覧
意外と乗っていなかったコードたち

###①リアクションした絵文字ごとに役職を付与するコード
今回はメッセージを受け取った時のイベント(on_message)を使いますがそのほかでも応用可能です
このコードは時間を指定します
これを使用するには

```python

import asyncio
```

を宣言する必要があります

```python:discord.py
@client.event
async def on_message(message):
    guild = message.guild
    if message.content == '/role':
        reaction_message = await message.channel.send('pls reaction good or bad')
        reaction_message_id = reaction_message.id
        ad_role_good = guild.get_role(YOUR_ROLE_ID)
        ad_role_bad = guild.get_role(YOUR_ROLE_ID)

        def check(reaction,user):
            return user == message.author and reaction.message.id == reaction_message_id
        try:
            reaction, user = await client.wait_for('reaction_add', timeout=120.0, check=check)
        except asyncio.TimeoutError:
            await message.channel.send('時間切れです！！！')
        else:
            if str(reaction.emoji) == "\U0001f44d":
                await message.author.add_roles(ad_role_good)
                await message.channel.send('good')
            elif str(reaction.emoji) == '\U0001f44e':
                await message.author.add_roles(ad_role_bad)
                await message.channel.send('bad')
            else:
                 await message.channel.send('対応してません')
```
※絵文字に関しては
[参照ページ](http://www.fileformat.info/info/unicode/char/search.htm)
こちらをご覧ください
【Swift】配列内の要素の合計

## 使用例
配列内の要素を求めるときに、使えそうなものを備忘録として残しておこうと思いました。タプル型を例に以下に記述していきます。

```swift:Zoo.swift
//定義
var zoo:[(label: String, value: Int)] = [
    (label: "リンゴ", value: 100),
    (label: "ゴリラ", value: 200),
    (label: "ラッパ", value: 300)
]

var sumValue = 0
```

### 1. for文
```swift

for item in zoo {
    sumValue += item.value
}

print(sumValue) //結果: 600
```

### 2. forEach
```swift

zoo.forEach { (item) in
    sumValue += item.value
}

print(sumValue) //結果: 600
```

### 3. reduce
```swift

let sum = zoo.reduce(0) { (result, item) -> Int in
    return result + item.value
}

print(sum) //結果: 600
```

####※reduce補足
どのようにresultに値が代入されていくかについて説明します。

```swift

let sum = zoo.reduce(0) { (result, item) -> Int in
    print("result", result)
    print("value", item.value)
    return result + item.value
}

print("sum", sum)

//実行結果
result 0
value 100

result 100
value 200

result 300
value 300

sum 600
```

## まとめ
今回備忘録としてまとめました。間違ってる部分などがあればご指摘ください。
WebViewのvideoで表示されるあの画像（▶）を消す方法

WebViewの動画再生で見たことあるであろう「あの画像」を消す方法のメモ。

ちなみにこちらのことです↓
![▶.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/7f4b81d0-81d2-8b45-1235-1a371d9d236b.png)

# `WebChromeClient` の `getDefaultVideoPoster` を指定すればOKだった

`WebChromeClient` の `getDefaultVideoPoster` で適当なBitmapを返すことで、実質消すことができるようでした。

```
override fun getDefaultVideoPoster(): Bitmap? {
    return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
}
```

# Before/After

▶の画像が消え、チラつかなくなりました。

Before|After
:------------------:|:------------------:
![1586051504.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/850d60b5-40d1-c005-28f1-6d9150fc655e.gif)|![1586051528.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/5c47629f-d1af-ad63-bdd0-4df1721045cb.gif)

# 参考
https://developer.android.com/reference/android/webkit/WebChromeClient.html?hl=ru#getDefaultVideoPoster()
https://stackoverflow.com/questions/18271991/html5-video-remove-overlay-play-icon
[Python / AWS Lambda layers] AWS Lambda Layersでmoduleだけを使い回したい

# 概要

ピンポイントでやりたいことだけがまとまっている記事がなかったので、メモとして作成

[AWS Lambda Layersでライブラリを共通化](https://qiita.com/t_okkan/items/394a15577bd1aad46ec3) という記事のやり方とほぼ一緒なのですが、 **自作ソースを一切含めずに `pip install` される module だけを lambda 上で使い回したい場合** の方法を探しても見つけられなかったので、記事化。
（私が何回も使いたいので！）

# 手順


## 1. modules を zip にまとめる

```bash
$ mkdir python

# 他にも欲しい module があれば、全部 python ディレクトリに入れておく
$ pip install module_name -t ./python

# pythonディレクトリの中身を layer.zip へと圧縮
$ zip -r layer.zip python/
```

## 2. S3にアップロード

S3のバケットは先に作っておく

### (1) GUIで行う場合

GUIのAWSコンソールでアップロードするのは簡単なので、省略

### (2) コマンドラインで行う場合

ファイルサイズが大きい時や、通信回線が貧弱な時（！）は、コマンドライン経由でアップロードしないと失敗する

[aws-cli v2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html) をインストールしておき、その上で以下のコマンドを実行

```bash
# backet名を確認
$ aws s3 ls
2019-05-07 19:04:54 xxxxxxxxxxxxx # <= バケット名

# s3へのupload実行
# aws s3 cp アップロードしたいファイル名 バケット名
$ aws s3 cp ./layer.zip s3://xxxxxxxxxxxxx
```

待つ( ˘ω˘)ｽﾔｧ

# 3. layersを作成
# 4. lambda関数からlayerを呼び出す


3, 4 については、先ほど[概要](#概要)で紹介した記事の、 [Lambda関数にLayerを追加する](https://qiita.com/t_okkan/items/394a15577bd1aad46ec3#lambda%E9%96%A2%E6%95%B0%E3%81%ABlayer%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B) 以降の通りにすれば大丈夫でした。

（雑ですみません。記事を作成して下さった @t_okkan さん本当にありがとうございます！）
ようやくJQueryも発火できた。

かれこれ何日も悩んでたJQueryの発火に成功した。

解決方法は以下の通り。



#1 まずはyarn add jquery
そしてwebpackのenvironment.jsを編集して、node_modulesのjquery/src/jqueryを読みこませる。



#2 次にapplication.jsにimport文を書いて読み込ませたいjqueryのファイルを指定。

この時app/javascript/jquery/src/jquery.jsに指定し、jquery.jsにimportを書くことでフォルダ内の他のjqueryも読み込めるようにする。



#ようやく動いた。しかし、もし今後つまずいたら？

何処で止まってしまっているのかを把握することが大事だと気付いた。今回の場合はapplication.jsにjquery文を書いたら動いていたので、webpackでのjquery追加はできているしenvironment.jsも問題ないと思った。

一つ一つ段階的に建設的に。
puppeteer 画像保存 (fs, path)

#puppeteerで画像を保存する#
##結論##
```app.js
const puppeteer = require('puppeteer');
const fs = require('fs');
const path = require('path');

(async () => {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.goto('目的の画像サイトのURL');
  await page.waitFor(5000);

  let images = await page.evaluate(() => 
    Array.from(document.querySelectorAll('.pict')).map(a => a.src)
  )
//↓これ絶対冗長だからなおしたい
  let imagesPop = await page.evaluate(() => 
    Array.from(document.querySelectorAll('.pict')).map(a => a.src.split('/').pop())
  )

  for(let i = 0; i < images.length; i ++){
    let localfilefullpath = path.join(__dirname, imagesPop[i]);
  
    const viewSource = await page.goto(images[i]);
    fs.writeFile(localfilefullpath, await viewSource.buffer(), (error) => {
      if (error) {
        console.log(error);
        return;
      }
      console.log('保存できたよ！');
    });
    await page.waitFor(1000);
  }
  await browser.close();
})();
```
##概略##
###evaluateで要素を２種類取得###
①images = https~から始まるやつ
②imagesPop = 一番最後の/から~.jpgとかで終わるやつ
###画像の保存###
①ローカルファイルのフルパスとimagesPopを連結する
②ローカルファイルに直接保存させちゃう（本当はfs.mkdirSyncでフォルダ作った方がいいと思う）

#誤解があったらご指摘ください#

##解説##
インストールするnpmは
`puppeteer` `fs` `path`の３つ

ブラウザで確認できるように
`const browser = await puppeteer.launch({headless: false});`に

目的のページにたどり着いてからローディングのぐるぐるが一旦止まるくらい待つ
`await page.waitFor(5000);`
セレクタで待つ方法、Xpathで待つ方法、ページ遷移で待つ方法、など様々あるが、簡単なのでこの方法。バンされちゃったらいやなので。安全に。

複数の要素を取得
`let images = await page.evaluate(() => 
    Array.from(document.querySelectorAll('.pict')).map(a => a.src)
  )`
このevaluate, Array.from, querrySelectorAll, mapの流れはめっちゃ使う
ほかにも$xで指定する方法もあるがいつも混乱してしまうから個人的にはあまり好まない

ローカルファイルのフルパスと画像URLの最後の部分を連結
`let localfilefullpath = path.join(__dirname, imagesPop[i]);`

バイナリデータを扱うときは`buffer()`を使うんかなおそらく
`fs.writeFile(localfilefullpath, await viewSource.buffer())`
第一引数で保存場所、第二で保存したい画像URLに`.buffer()`を追加

#参考文献#
https://qiita.com/Ancient_Scapes/items/5f63bcfc2b5108313f77
https://qiita.com/KawamotoShuji/items/878ae659a5c6e540343e
http://info-i.net/fs-writefile
https://wa3.i-3-i.info/word1146.html
ソフトウェア開発における「終了」や「停止」に関する英単語

新しい単語見つけたら随時追加していきます。状態ではなく動詞に着目しています。

# 正常系
## quit, exit
- アプリケーションなど、操作中のプロセスを終了

e.g. IntelliJ IDEAの終了
<img width="236" alt="スクリーンショット 2020-04-05 13.21.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2160/efa3d8d3-e840-5f90-470c-3e403c3585f2.png">

e.g. Python REPLの終了コマンド
<img width="505" alt="スクリーンショット 2020-04-05 13.26.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2160/9a23e349-ee39-e36e-d666-33d98620d9d3.png">

## end, complete, finish, close, shut down
- ある範囲の操作・プロセス等が、開始から終了まで正常に完了
- closeは特に、ネットワークコネクションやワークフローの終了時に使われる
- shut downは特に、コンピュータの終了時に使われる

## cancel
- ある範囲の操作・プロセス等が、開始から終了まで正常に完了
- だが、ユーザー命令によって通常とは別の終了状態に移行させる
- 日常的に繰り返されるルーティンオペレーションの選択肢としてcancelがあり、変更は保存されない
- cancelは[abort](#abort)よりも気軽に利用できるアクションを表す

e.g. 操作の取り消し

## stop
- 正常に開始してたのを、ユーザ操作で正常終了
- 常駐プロセスとかに使うイメージ
- [terminate](#terminate)と異なり必ずしも永久的な停止を意味せず、同じプロセスを再起動できることがある
- 再開されることをより強く意識させる場合、[pause](#pause)を使うことがある

e.g. `systemctl stop xxx` でサービスxxxを停止 
e.g. EC2のstopは再起動可能

## terminate
- 正常に開始してたのを、ユーザ操作で正常終了
- 常駐プロセスとかに使うイメージ
- [stop](#stop)と異なり永久的な停止を意味し、同じプロセスは再起動できない

e.g. EC2のterminateは再起動不可能

参考：EC2の状態遷移図
![Instance Lifecycle - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/images/instance_lifecycle.png)


# 異常系
## abort
- 緊急停止
- ある一連のプロセスが途中まで完了しているものの、ロールバックが求められたときに使われる
- ソフトウェア側で異常があって終了する場合に使うことが多いが、ユーザ操作によって緊急停止する場合に使うこともある
- [cancel](#cancel)よりも実施が大変なアクション（ロールバック処理が重かったり、関係者の調整が必要だったり等）
- 堕胎を想起する単語で日常的に使うには不適切なため、ユーザー向けに表示する場合はcancel, stop run等を使うのが良いという意見もある

## kill
- ユーザー操作で強制終了
- 殺害を想起する単語で日常的に使うには不適切なため、ユーザー向けに表示する場合はforce quit等を使うのが良いという意見もある

e.g. [killコマンド](https://ja.wikipedia.org/wiki/Kill)

# あまり見かけないがsynonymによく現れる単語
- halt
- cease


# [余談] 中断に関する単語
## pause
- 中断
- プロセスは動き続けているが、GUIのアニメーション処理やユーザーの操作受付等を停止している状態
- 再開されることが[stop](#stop)よりも強く意識された言葉

## break
- ループ処理の中断

## hibernate
- 休止状態にする
- プロセスの持つ状態を一旦ディスク等に退避することで実現することが多い

## suspend
- 休止状態にする
- プロセスの持つ状態を一旦RAM等に退避することで実現することが多い

## interrupt
- CPUの割り込み


# 参考文献
- [Should I avoid using “abort” in favor of its synonyms?
](https://ux.stackexchange.com/questions/75694/should-i-avoid-using-abort-in-favor-of-its-synonyms)
- [Instance Lifecycle - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html)
- [プログラミングでよく使う英単語のまとめ【随時更新】](https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923)
DOM, Node, Elementについて

備忘録です。
間違いなどございましたらご指摘ください。

##DOMとは
HTMLとXMLドキュメントへのAPI
（わかりやすくいうと、プログラムからHTMLやXMLを自由に操作するための仕組み、インターフェイス)

JavaScriptからHTMLに要素を追加したり、ボタンクリック時のイベントを登録したり、スタイルや属性を追加したり、要素のサイズや位置を追加したり、こういったものはすべてDOMのAPIを使うことで操作できる。

**DOMツリー**
DOMはHTMLドキュメントを『オブジェクトのツリー』として扱っている。これを『DOMツリー』という。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500259/da0e5aba-9084-f7cc-9069-abde1f062d5b.png)

##Nodeとは
ノードとは各要素(HTMLではエレメントやタグという)自体のことを表す。（つまり、上の図のひとつひとつのボックスがNode）

特定のノードを基準としたときに、その上にあるノードを「親:parent」ノードと表現し、その下にあるノードを「子:childまたはchildren」ノードと表現する。
例えば「そのタグの子ノード全体を取得して、その親ノードから削除する」のような言い方ができる。 

firstChildやparentNodeなどのプロパティ、appendChild、removeChildなどのメソッドはNodeが提供している機能。

**Nodeの種類**
- Document(Document型Node・ドキュメントノード)
- Element（Element型Node・エレメントノード）
- Attr（Attribute型Node・属性ノード）
など

##Elementとは
さきほどNodeにはいくつか種類があると説明した。
ElementはそのNodeの中のひとつ、Element型のNodeのこと。

HTMLの要素はElementを継承しておりElement<-HTMLElement<-HTMLDivElementのようになっている。

classListやinnerHTMLなどのプロパティ、getElementByIdやquerySelectorAll、setAttributeなどのメソッドはElementが提供している機能。

##まとめ
**DOM**
- HTMLドキュメントとJavaScriptをつなぐインターフェース
- DOMツリーはNode構成されている

**Node**
- DOMツリーを意識して操作を行うときのオブジェクト
- 例: appendChild、removeChild、parentNodeなど

**Element**
- HTMLドキュメントの要素を意識して操作を行うときのオブジェクト
- 例: style、attribute、width、heightなど

##参照
https://kuroeveryday.blogspot.com/2018/11/difference-between-dom-and-node-and-element.html
https://eng-entrance.com/what-is-dom
【React Hooks】stateの使用からみたクラスコンポーネントと関数コンポーネントのコード比較

これまでは、stateはクラスコンポーネントのみが持ち、関数コンポーネントの中では使用することができませんでした。
しかし、hookを導入することで関数コンポーネントの中でもstateが使えるようになりました。(hookはReact16.8で追加された機能です。)
今回は、stateを使用するクリックカウントコンポーネントを作成する場合の、クラスコンポーネントと関数コンポーネントのコードを比較をしていきたいと思います。

# 全体のコード
**クラスコンポーネントの場合**

```Class.js
import React from 'react';

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}
```

**関数コンポーネントの場合**

```Function.js
import React, { useState } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
```

関数コンポーネントの方がコード量が少なく、見やすい印象を受けます。
それでは２つの違いを詳しく見ていきましょう。

# １．stateの設定方法
クラスコンポーネントでは、コンストラクタ内でthis.stateにstate(count)を設定しています。

```Class.js
class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
```

関数コンポーネントでは、**useStateフック**を使用して、state(count)と、stateを更新する関数(setCount)を分割代入で受け取っています。
useStateの引数には初期値を渡します。

```Function.js
import React, { useState } from 'react';

function Example() {
  const [count, setCount] = useState(0);
```

# ２．stateの読み出し
クラスコンポーネントで現在のcountの値を表示する場合、**this.state.count**とします。

```Class.js
<p>You clicked {this.state.count} times</p>
```

関数コンポーネントでは、countとして**直接**呼び出せます。

```Function.js
<p>You clicked {count} times</p>
```

# ３．stateの更新
クラスコンポーネントでは、**this.setState()**を使用します。

```Class.js
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
  Click me
</button>
```

関数コンポーネントでは、useStateの分割代入で受け取った**setCount**を使用します。

```Function.js
<button onClick={() => setCount(count + 1)}>
  Click me
</button>
```

# まとめ
以上、クラスコンポーネントと関数コンポーネントをstateの使用から見て比較をしてみました。
関数コンポーネントの方が、stateの読み出しも更新も、「this」を介さずそのまま使用できるのですっきり見えます。
最後まで読んでいただきありがとうございました。
PHPエラー一覧

趣味でphpを実装して遊んでいます。（初心者）
それにあたり出力されたエラーと、その原因と対処法を記載していきます。

#実施環境
- Windowsのエディション：Windows 10 Home
- PHPのバージョン：PHP 7.4.2
- 使用しているエディタ：Visual Stadio Code

#エラー一覧

### Notice: Undefined index
- エラー
 Notice: Undefined index: A1_No in C:\xampp\~~\index.php on line 7

- 原因
 呼び出した配列のキーがセットされていませんよ。と言っている。

```php:index.php
//$_POST[]の中の"A1_No"を表す
$A1_No = $_POST["A1_No"]
```

- 対処法
 - 配列のキーが必ずセットされるように修正する。（※修正方法は実装によるため、ここでは割愛） 
 - issetメソッドを使用して配列が呼び出されていることを確認し、配列がセットされていない場合の対処を埋め込む。以下の例の場合は、エラーを無視する処理を埋め込む。
 
```php:index.php
<?php
    //フォームより送信された値を取得する
    $A1_Yes = null;
    $A1_No = null;
    $_POST[] = null;
    
    //配列がセットされている場合はtrueを返す
    if(isset($_POST["A1_No"])){
        $A1_No = $_POST["A1_No"];
        echo '$_POST["A1_No"]はセットされています。';
    } else {
        //エラー制御演算子'@'（エラーを無視する）
        @$A1_No = $A1_No;
    }
?>
```
GitHubのリポジトリを削除する方法

自分はGitHubを使い始めてから間もないのですが、GitHubでリポジトリを削除するのに少し迷ったので、備忘的に残すことにしました。

# リポジトリを削除する手順
**削除すると元に戻せないのでご注意ください**

- リポジトリのページにアクセスして、Settingsタブにアクセスする
![スクリーンショット 2020-04-05 12.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609175/76b76cbd-782d-b42d-f07c-de2bf0f622fc.png)

- SettingsタブのDelete This Repositoryのボタンを押下する
![スクリーンショット 2020-04-05 12.18.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609175/794af8c7-eba1-46c7-e10d-e2fb3cc2b909.png)

- Delete This Repositoryのボタンを押下すると確認画面が表示されます
- 削除したら元に戻すことはできないことが英語で記載れています
- 問題なければ削除するリポジトリ名を入力して「I understand〜」のボタンを押下します
- パスワードを入力する画面が表示されるので、自身のアカウントのパスワードを入力してボタンを押下すると削除完了です
![スクリーンショット 2020-04-05 12.21.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609175/293812dd-6b63-2d7f-77a3-5e0a769f2e66.png)
桁DPのテンプレ

[AtCoder Beginner Contest 161 D問題] (https://atcoder.jp/contests/abc161/tasks/abc161_d) を桁DP問題だと勘違いして大爆死したため、供養のために放流します。
状態を0~9毎に持っているので使い勝手がいいと思います。


```C++
ll digit_dp(ll k) {
    const int DIGIT_MAX = 30;
    vector<vector<vector<ll>>> dp(DIGIT_MAX, vector<vector<ll>>(2, vector<ll>(10, 0)));
    vector<ll> digits(DIGIT_MAX);
    {
        int i = 0;
        while (k > 0) {
            ll m = k % 10;
            digits[i] = m;
            k /= 10;
            i++;
        }
        reverse(digits.begin(), digits.end());
    }

    int first_i = 0, first_j = 0;
    rep(i, DIGIT_MAX) {
        if (digits[i] == 0) continue;
        first_i = i;
        first_j = digits[i];
        break;
    }
    rep(i, 10) {
        if (i == 0) continue;
        if (i < first_j) dp[first_i][true][i] = 1;
    }
    dp[first_i][false][first_j] = 1;

    // Kより小さいことが......

    for (int i = first_i; i < DIGIT_MAX - 1; i++) {
        int d = digits[i];
        int n = digits[i + 1];
        assert(d < 10);
        assert(n < 10);
        // 未確定から未確定
        dp[i + 1][false][n] += ??? //  dp[i][false][d];など

        // 未確定から確定
        for (int jp = 0; jp < 10; jp++) {
            for (int jn = 0; jn < 10; jn++) {
                assert(jn < 10);
                assert(jn >= 0);
                if (jn >= n) continue;
                ??? // dp[i + 1][true][jn] += dp[i][false][jp];など
            }
        }
        // 確定から確定
        for (int jp = 0; jp < 10; jp++) {
            for (int jn = 0; jn < 10; jn++) {
                ??? //  dp[i + 1][true][jn] += dp[i][true][jp];など
            }
        }

        // この桁が初めての0以外の数字の場合
        for (int j = 1; j < 10; j++) {
            dp[i + 1][true][j] +=  ??? // 1など;
        }
    }

    ll sum = 0;
    for (int i = 0; i < 10; i++) {
        sum += dp[DIGIT_MAX - 1][true][i];
    }
    for (int i = 0; i < 10; i++) {
        sum += dp[DIGIT_MAX - 1][false][i];
    }

    return sum;
}
```
YouTrack でだれでもプロジェクトにアクセスできるようにする

Jetbrains 社の課題管理サービス YouTrack を使い始めました。

デフォルトだと、ログインしたユーザーにしかプロジェクトや課題にアクセスできできないようなので、「GitHub の Issues の代わりに使おう」というようなケースには不便です。

これを解消するため、表題の件を調査しました。

# 手順

大きく 2 ステップあります。

## ステップ1: YouTrack インスタンス自体の公開

https://09v.myjetbrains.com で試しています。
下記の設定をしないと、上記 URL にアクセスした時点でログインが求められます。

1. 右上のナットメニューから **ACCESS MANAGEMENT** > **Users** を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603093/c2d61969-18c8-5596-de3a-acd52c39040d.png)
2. **guest** アカウントが **banned** 状態になっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603093/b9da3d8c-ce8a-c338-5e00-4a9933511370.png)
3. **guest** をクリック
4. 画面右上の **uban** ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603093/d3c19884-67a0-da97-5ae3-934c1161b6fc.png)

ここまで設定すると、 https://09v.myjetbrains.com にアクセスしてもログインが求められなくなります。
が、プロジェクトや課題にはアクセスできませんので、次の「ステップ2」のように設定します。

## ステップ2: プロジェクトの公開

YouTrack インスタンスには複数の「プロジェクト」を含めることができます。
「ステップ1」で設定した **guest** ユーザーに対して、プロジェクトごとに閲覧権限を付与すると、「ログインなしでプロジェクト情報を閲覧」することが可能になります。

このステップの設定をすることで、たとえば、 https://09v.myjetbrains.com/youtrack/issue/SJS-1 のような課題を、ログインなしで閲覧できるようになります。

1. 公開したいプロジェクトの設定画面を開き、 **Access** タブを表示します
2. **Grant role...** ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603093/64743cac-6dae-e865-553c-3678a6e788f3.png)
3. ダイアログが開くので、 Role を **Issue Reader** に、 To user or group に **guest** を設定し、 **Grant** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603093/e3abb71e-e269-1538-2efc-c024316ba50a.png)
4. これで **guest** ユーザーに **Issue Reader** ロール (≒ 閲覧権限) が付与されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603093/9932afa9-80ad-cd92-4294-b3e2a8e5d8e3.png)

以上で、 https://09v.myjetbrains.com/youtrack/issue/SJS-1 のような課題に、ログインなしでアクセスすることができます。

# 情報源
* [Manage the Guest User Account - YouTrack Standalone 2020.1](https://www.jetbrains.com/help/youtrack/standalone/Managing-Guest-Users.html)
Pyhon、len()と、randint()について


len()とrandint()についてメモ。
#（１）len()
リスト型を引数にすると、その要素を取得できる。

```.py
list = [0,1,2,3,4,5]
print(len(list))

#6が出力される
```

#（２）randint()
乱数を発生させる。

```.py
import random
r = random.randint(1,100)
print(r)

#1から100までのうちの乱数を生成
```
Python で日付のイテレータを返すジェネレータを利用してループする

## サンプルコード

```py
from datetime import date, datetime, timedelta

# date オブジェクトのイテレータを返すジェネレータ関数
# 開始日: begin
# 終了日: end
def date_iterator_generator(begin, end):
  # 終了日と開始日の timedelta から日数を求める
  # 終了日を含むように+1
  length = (end - begin).days + 1
  # 0から日数分の数値シーケンス
  for n in range(length):
    yield begin + timedelta(n)

# 開始日・終了日
begin = datetime.strptime('20200331', '%Y%m%d').date()
end   = date.today() # 今日の日付

# ジェネレータを生成
gen = date_iterator_generator(begin, end)
print('gen: ' + str(gen))

# 日付を出力
for target in gen:
  print(target.strftime('%Y%m%d'))
```

## 実行結果

Python 3.8.2 で実行した結果。

```
gen: <generator object date_iterator_generator at 0x104e0f900>
20200331
20200401
20200402
20200403
20200404
20200405
```

## 参考資料

[関数型プログラミング HOWTO — Python 3\.8\.2 ドキュメント](https://docs.python.org/ja/3.8/howto/functional.html)

> ジェネレータは、イテレータを書く作業を簡単にする、特殊な関数です。標準的な関数は値を計算して返しますが、ジェネレータが返すのは、一連の値を返すイテレータです。

[組み込み型 — Python 3\.8\.2 ドキュメント](https://docs.python.org/ja/3.8/library/stdtypes.html)

> range 型は、数のイミュータブルなシーケンスを表し、一般に for ループにおいて特定の回数のループに使われます。

[datetime \-\-\- 基本的な日付型および時間型 — Python 3\.8\.2 ドキュメント](https://docs.python.org/ja/3.8/library/datetime.html)

> timedelta オブジェクトは経過時間、すなわち二つの日付や時刻間の差を表します。
【Docker】Railsサーバが起動しない場合の対処

#はじめに
とあるDockerの教材を学習していた時に表題の通り
railsサーバが起動しなかったため備忘録として記載していますrails&Docker初心者のため間違った見解があればご指摘いただけると嬉しいです。
#結論
忙しい人のために先にどうやって解決したかを記載します

▼server.pidファイルを削除

```
$ rm tmp/pids/server.pid
```

▼削除確認されるので「yes」

```
$remove tmp/pids/server.pid? #yes
```

▼コンテナを立ち上げる

```
$docker-compose up -d
```

サーバー起動で無事解決♪

#問題
【Docker】を使ったrailsの環境構築を以下の流れで設定

```
$docker-compose run web rails new . --force --database=mysql
//省略//

$docker-compose build 
//dockerfileからイメージをビルド//

$docker-compose up -d
//現在のディレクトリにあるdocker-compose.ymlに基づいて
コンテナを起動する//

$docker-compose run web bundle exec rake db:create
//railsで使用するデータベースをMySQLサーバ上に作成//

$rails s
//立ち上がらない...//

```

#状態
▼`$docker-compose ps`でコンテナの起動状態を確認

```
$docker-compose ps
     Name                   Command              State           Ports       
-----------------------------------------------------------------------------
original_db_1    docker-entrypoint.sh mysqld     Up       3306/tcp, 33060/tcp
original_web_1   bundle exec rails s -p 300      Exit 1    
```
`original_web_1 `のStateがExit1になっていました...


▼`$docker logs original_web_1` でログを確認

```
$docker logs original_web_1
=> Booting Puma
=> Rails 5.0.7.2 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
A server is already running. Check /app/tmp/pids/server.pid.
Exiting
```
サーバはすでに立ち上がっていて
`Check /app/tmp/pids/server.pid.`を確認してくれーと言われています

###server.pid とは
WEB開発サーバを起動するときに書き込まれ、停止すると削除されるファイルみたいです。
server.pid に pid が書かれていると開発用WEBサーバが起動中と判断されてしまいます。
今回はこのserver.pidが書き込まれている状態のため、railsサーバーが起動しなかったんですね〜

#解決策
ということで

```
$ rm tmp/pids/server.pid
```
で**server.pidファイル**を削除で無事解決しました♪
現場についていくための数学備忘録 #4

## 行列
今回は行列について簡単にまとめていこうと思います。

## 行列とは
その名の通り「行」と「列」で構成されているものを言います。
具体例をいうと下記のような物になります。

```
[5, 13]
[4, 6]
[20, 7]
```
この場合、「行」は[5,13]。
列は[5, 4, 20]のことを言います。

## 行列の加減
２つの行列の加減は要素同士で加減ができます。
具体例) pythonではnumpyのmatix関数で行列を定義できます。

```
>>> A = np.matrix([[5, 13], [4, 6], [20, 7]])
>>> B = np.matrix([[8, 15], [9, 10], [20, 8]])
>>> print(A)
[[ 5 13]
 [ 4  6]
 [20  7]]
>>> print(B)
[[ 8 15]
 [ 9 10]
 [20  8]]
>>> C = A + B
>>> print(C)
[[13 28]
 [13 16]
 [40 15]]
```

## 行列の掛け算
行列の掛け算は加減よりちょっと面倒です。
掛けるものが、単純に1つの実数であれば、各要素に掛ければできます。

```
>>> print(A)
[[ 5 13]
 [ 4  6]
 [20  7]]
>>> print(A * 2)
[[10 26]
 [ 8 12]
 [40 14]]
>>> 
```

しかし、下記のように行列かける行列だと、単純に要素同士というわけにはいきません。

```
>>> print(A)
[[ 5 13]
 [ 4  6]
 [20  7]]
>>> print(D)
[[1 2]
 [3 4]]
>>> print(A * D)
[[44 62]
 [22 32]
 [41 68]]
>>> 
```

上記で何をやっているかを見ていきます。

まず、行列Aの1行目にあたる、[5, 13]を見ます。
そこに、行列Dの1列目にあたる、[1, 3]を要素ごとに掛け合わせて、合計を足すという動きをしています。
行列A2の2,3行目と行列Dの2列でも同じことをやります。
具体的には、

```
[5 * 1 + 13 * 3] = 44
[4 * 1 + 6 * 3] = 22
[20 * 1 + 7 * 3] = 41
[5 * 2 + 13 * 4] = 62
[4 * 2 + 6 * 4] = 32
[20 * 2 + 7 * 4] = 68

[44 62]
[22 32]
[41 68]
```

また、行列の掛け算には掛ける側と掛けられる側の順番を入れ替えると、値が変わってしまうという性質があります。
[Go] Realizeで実行ファイルを指定する

## Realizeとは
realizeが分からない人はぜひこちらのページをみてください
https://qiita.com/enta0701/items/9f60ad18600acab8c93d

## Ralizeでのディレクトリ指定
go言語にはディレクトリ構成のスタンダードがあり、実行ファイルはcmd配下、他のファイルはinternalなどの配下に保存するようです。
参考：https://qiita.com/sueken/items/87093e5941bfbc09bea8


しかし、プロジェクトルートでrealizeを起動したところ、以下のエラーが出てしまいました

```console
$ realize start
[01:09:22][GO_BASE_REST] : Watching 7 file/s 15 folder/s
[01:09:22][GO_BASE_REST] : Install started
[01:09:23][GO_BASE_REST] : Install 
 build .: cannot find module for path .
```

なにも設定しなかった場合、```go build .```が実行されてモジュールがないと怒られているのかと思い
.realize.yamlの場所を変えようかと思ったのですが、go.modなどもプロジェクトルートに置いてあり、それもrealizeのために移動させるのは少し嫌だったので  

以下のように.realize.yamlに設定を追加したところ問題なく動くようになりました。

```yaml:.realize.yaml
settings:
  legacy:
    force: false
    interval: 0s
schema:
- name: go_rest
  path: .
  commands:
    build:
      status: true
      method: go build -o cmd/go_rest/main cmd/go_rest/main.go
    run:
      status: true
      method: ./cmd/go_rest/main
  watcher:
    extensions:
    - go
    paths:
    - /
    ignore:
      paths:
      - .git
      - .realize
      - vendor
```

methodに記入すると、本来のコマンドと置き換えられて実行されるようになり、
上記ではbuildで実行ファイルを作成、runで実行ファイルを起動しています。  

なんとなく気持ち悪いので他にもやり方があるのかもしれませんが、私は分からなかったです！
もっといい方法を知っている人がいたら是非教えて欲しいです！