OmniAICreator/Qiita-1.07M huggingface dataset:
内向きDNSで宅内専用サーバを構築する：メモリ換装〜通電確認編

こんにちは(๑╹ω╹๑ )

自宅サーバ欲しい！
けどもいきなりパブリックにするのは怖い😥

ということで内向きのDNSで宅内サーバ構築することにしました🤗

### 経緯諸々

つい最近実家へ帰省した際のことです。
父が元々使っていたDELL PC（Inspiron 14z:P35G）が外部からの衝撃により壊れてしまったみたいで、
後付で空きスロットに挿していたバルク品の4GB RAMを有効活用したいなと思ったのが事の始まりでした。

Chromium OSをインストールしているロースペックなお古のパソコンが余っていたので、
そちらにRAMを換装してCentOSで遊びたい！というのが経緯の全容？です😂

### 壊れたPCの部品取り

![IMG_5258 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/1f8d7df1-d839-2df4-aea0-61b04f699e36.png)

※ バーコードやシリアルナンバー、QRコード等はモザイクしています

とりあえず使えそうなパーツは取っておきます。

- 光学ドライブ：2.5インチベイより（RW対応のため外付けで再利用する）
- HDD 500GB:2.5インチシャドウベイより（これも外付けで再利用できる）
- 2GB RAM（既製品）:PC3L-12800（いつかのために捨てないでおく）
- 4GB RAM（バルク品）：PC3L-12800（このRAMで換装する）

### 換装先PCのスペックについて

![IMG_EAB9166185EA-1 (1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/37a50ce8-e542-a4b1-af48-7299d8367735.jpeg)


型番：ASUS X551M
CPU: Celeron N2815（CUIだったら多分十分なはず）
TDP:7W（省電力で電気代も安心）
RAM:2GB（これを4GBに換装する）
RAM 規格:PC3L-12800
RAM スロット数：1
HDD:500GB（基本的にDockerで遊ぶからこれくらいあると安心）
OS:Windows 8（換装前はChromium OS）
Inch:15.6

### RAMを換装していく

#### まずは中を見てみる！

![IMG_B26B9954AA0F-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/756624bd-d930-113c-9e84-aaa9dc3dd007.jpeg)


ざっと、

- HDD:2.5インチシャドウベイより
- 光学ドライブ:2.5インチ（何かあればブータブルUSBで事が済むので回収して再利用する）
- Wi-Fiカード（有線専用機とするため回収する）

を確認できました。

#### 分解してみる！

この時点で、RAMスロットが見当たらなかったので、
基盤裏だと知ります笑

フレキシブルケーブルを慎重に扱って外します。

天板裏
![IMG_B2BEEDC82B61-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/1a867ffd-d75a-a80c-1033-4df2c659e726.jpeg)

基盤側
![IMG_C695FF484C2E-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/163ad130-1aa6-d8c3-6a0e-6e3289a3b093.jpeg)

#### 基盤裏のRAMスロット発見！

やっとお目当てのRAMスロットにたどり着きました！
![IMG_C35B9C318427-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/840fbf8c-ec63-f3a2-5b16-7d150874f7dc.jpeg)

無事（物理的）に換装完了
![IMG_6856ACBC4BAB-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/f3e66ada-b7cb-faa2-021d-f5407acf2f1a.jpeg)

#### 通電確認と起動確認

バッテリーと電源ケーブルの通電確認をしました
![IMG_B316321C854D-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/2fc312fd-813a-607d-573f-6cb562b8902d.jpeg)

最後にドライバーで電源をショートさせて起動確認しました！
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560692/f31bc293-9b8b-8f73-fde2-735b07938aad.gif)

### まとめ

フレキシブルケーブルの取り付けは精密なので怖いですが、
何とかがんばります笑

今回の帰省ではここまでしかできなかったので、
年末に↓の順でまた取り組んでみようと思います！

- RAM換装（内部的に）完了〜CentOSインストール
- 内向きDNSサーバの構築〜WAF設定
- Docker環境構築〜オンプレCI・CD導入

#### 余談

ヒートシンクを冷却するファンにほこりが溜まっていたので、
次は掃除から取り掛かろうと思います！
Laravel 6.x HTTPメソッドを指定するルーティングをまとめてみた get post put patch etc.

#はじめに

この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。

#HTTPメソッドを指定するルーティング

|記述|アクセス|内容|
|:---|:---|:---|
|Route::get();|GET|通常のアクセス。データを取得する基本的なもの。|
|Route::post();|POST|データの追加に使用。FORMの送信で使用する。主に新規作成。|
|Route::put();|POST|データの更新に使用。FORMの送信で使用する。|
|Route::patch();|POST|ほぼPUTと同じだが、ごく一部を更新。FORMの送信で使用する。|
|Route::delete();|POST|データの削除に使用。FORMの送信で使用する。|
|Route::options();|POST|使えるメソッド一覧を取得。|
|Route::match(['get', 'post', 'put'], '/top');||複数のメソッドを指定する場合に使用。|
|Route::any();||全メソッドでアクセスを許可。|

#「PUT」「PATCH」「DELETE」「OPTIONS」使い方
###★ポイント★
「PUT」「PATCH」「DELETE」「OPTIONS」データを送信する際は、「_method」にデータを追加する。

##「_method」にデータを追加する方法
###方法① hiddenを使ってデータを追加する。

```HTML
<form action="/top" method="POST">
    <input type="hidden" name="_method" value="PUT">
</form>
```

###方法② bladeのディレクティブを使ってデータを追加する。

```HTML
<form action="/top" method="POST">
    @method('put')
    @csrf
</form>
```
Flutterでエラーが発生した時の解決方法

# はじめに
[Flutter](https://codezine.jp/article/detail/12718)とはネイティブアプリを開発するためのフレームワークとして2018年にGoogleが発表しました。今回はFlutterでbuildしているときにエラーが発生したときにするべきことを書こうと思います。

# 最初に、、  【エラー状況を知る】
実際にどういうエラーなのかなどの詳細を知るためには以下のコマンドを入力してください。これでflutter runコマンド実行中の詳細ログを表示します。

```
$ flutter run --verbose
```

# 手段1 【flutter clean】
Flutter build errorが発生したときに一番最初にやるべきことはflutter cleanです。

```
$ flutter clean
```

30%のエラーはこの方法で解決します。手段2以降はこの方法でもうまくいかなかった人向けです。

# 手段2 【Pod関連を再インストール】


```
$ flutter clean
$ rm -Rf ios/Pods
$ rm -Rf ios/.symlinks
$ rm -Rf ios/Flutter/Flutter.framework
$ rm -Rf ios/Flutter/Flutter.podspec
$ rm ios/Podfile
```

# 手段3 【Flutterのバージョンを更新】
次はFlutterのバージョンを更新します。

```
$ flutter upgrade
$ flutter clean
```

# 手段4 【Pod update】
次はFlutterのバージョンを更新します。

```
$ pod update
$ flutter clean
```



# 手段5 【FlutterのChannelを変更】
次はFlutterのChannelを変更します。FlutterのChannelはmaster、beta、stableなどがありますが基本的にstableにしていた方がバグやエラーが少ないです。

```
# flutter channel
$ flutter channel stable
$ flutter clean
```

# 手段6 【Xcodeのキャッシュ削除】
Tip: Xcodeがフリーズする場合などに解決策として使われるコマンドのようです。

```
$ rm -rf ~/Library/Caches/com.apple.dt.Xcode
```


# 手段7 【DerivedData（中間生成ファイル）の削除】
DerivedDataとはXcodeで生成される中間生成ファイルが保存されるディレクトリの名前です。

```
$ rm -rf ~/Library/Developer/Xcode/DerivedData/
```

# 手段8 【Xcode Toolsによるキャッシュ削除】
DerivedDataとはXcodeで生成される中間生成ファイルが保存されるディレクトリの名前です。

```
$ xcrun --kill-cache
```

# 手段9 【シミュレータにインストールしたアプリ、設定を削除】
```
$ xcrun simctl erase all
```


# 手段10 【CocoaPodsのキャッシュ削除】
```
$ pod cache clean --all
```

# 手段11 【CocoaPodsを削除して再インストール】
```shell
$ pod deintegrate
$ pod install
```
laravelでルートにnameをつけて、 ルートをnameで呼び出す方法

#ルートにnameをつける方法
```
Route::get('/home', [HomeController::class, 'index'])->name('home');
```
#ルートをnameで呼び出す方法
```
route('home')
```  

##引数が欲しい場合
実際laravelで使う場合はこんな感じになる 
詳細画面の例でルートを指定するとこうなる

```web.php
Route::get('/post/{post}', [PostController::class, 'show'])->name('show');
```
呼び出す方法はこうなる

```show.blade.php
<a href="{{route('show',['post'=>$id])}}">ホーム</a>
```
コントローラーに引数を書くことを忘れないように注意が必要です

```PostController.php
public functin show($post){
}
```
##補足
resourcesを使ってパスを書いた場合は自動的に名前がつけられているので`php artisan route:list`でnameを確認しましょう
ゲストログイン機能の追加

#はじめに
オリジナルアプリを作成するにあたって、中身を見てもらいやすくするためにボタン一つでログインできるように**ゲストログイン機能**を追加した時の備忘録です。
新規登録やログイン機能は**devise**を使用しています。

#guest user 実装

```models/users.rb
  def self.guest
    find_or_create_by!(username: 'ゲスト', email: 'guest@example.com') do |user|
      user.password = SecureRandom.urlsafe_base64
    end
  end
```

まずはルーティングの設定を行います。

```routes.rb
  devise_scope :user do
    post 'users/guest_sign_in', to: 'users/sessions#new_guest'
  end
```
`new_guest`,アクションを`users/sessions_controller.rb`に追加します。`users`ディレクトリは`controllers`に追加。

```users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  def new_guest
    user = User.guest
    sign_in user
    redirect_to root_path, notice: 'ゲストユーザーとしてログインしました。'
  end
end
```
最後にボタンなどviewを追加すれば、実装完了。

```application.html.erm
<p class="control">
  <%= link_to 'ゲストログイン', users_guest_sign_in_path, class: "button is-warning is-fullwidth", method: :post %>
</p>
```

#最後に
ポートフォリオ(オリジナルアプリ)を見てもらうためにはとても重要な機能の追加。比較的簡単に実装が出来ました。
最後まで読んでいただきありがとうございます:grin:
Android NDKのCMakeを使用したProductFlavorごとにネイティブコードを分ける方法

# TL;DR
build.gradleのproductFlavorsでFlavorごとに引数を与えてCMakeListsで分岐させる。

# Android NDKとは
Android NDKは、C / C++（ネイティブ コード）をAndroidアプリに埋め込むことができるツールです。
重い演算処理、ネイティブコードに秘匿情報を記述しデコンパイルしても見えないようにする、等に使用されます。

# CMakeとは
コンパイラに依存しないビルド自動化のためのツールです。androidで言うところのgradleですかね・・・・(レイヤーが違う気もする(anroidはjava自体がコンパイラに依存しないので)がビルドツールという点では一緒)

# ProductFlavorとは
[ProductFlavor](https://developer.android.com/studio/build/build-variants?hl=ja#product-flavors)
環境依存のコード(API endpointやその他環境変数)を難しいことをせずにソースファイルごとまるっと差し替えるときに使用します。

# 通常のjavaコードまたはkotlinコードを差し替える場合
パッケージを変えることによって実現できます。
例えば下記のようにproductFlavorsが定義されてるとします。
例 app/build.gradle

```gradle 
android {
    ...
    defaultConfig {...}
    buildTypes {
        debug{...}
        release{...}
    }
    // ココでProductFlavorの種類を定義する
    flavorDimensions "flavor"
    productFlavors {
        "flavor1" {
        }
        "flavor2" {
        }
    }
}
```
上記の様に定義すると
```src/flavor1/```
```src/flavor2/```
配下にjava, kotlinコードを配置するとbuildする際に指定したproductFlavorによって自動でコードを差し替えてくれます。

# Android NDKのコードを差し替える場合はどうするのか
上記の様にソースファイルを差し替えられるのかなと思ったらどうやらできないご様子・・・・。

Cmakeを使用する場合はapp/build.gradleに下記のようにCmakeLists.txtへのパスを記載するのですが、CmakeはproductFlavorを感知しないので先述のやり方でソースコードを差し替えることはできませんでした(やり方あるのかもしれませんが・・・)。

```gradle
android {
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}
```

じゃあCmakeする際に引数を与えて、CmakeLists.txt内で分岐させよう！となりました。
各ProductFlavor内のCmakeを定義する部分に独自引数を追加します。

```gradle
android {
    ...
    flavorDimensions "flavor"
    productFlavors {
        "flavor1" {
            externalNativeBuild {
                cmake {
                    // ココ！
                    arguments += "-DFLAVOR=FLAVOR1"
                }
            }
        }
        "flavor2" {
            externalNativeBuild {
                cmake {
                    // ココ！
                    arguments += "-DFLAVOR=FLAVOR2"
                }
            }
        }
    }
}
```

ここでは``` -DFLAVOR ```という引数を追加してあげています。
cppファイル自体は
```src/main/cpp/flavor1```
```src/main/cpp/flavor2```
に配置しました。
そして、CmakeLists.txt内で読み込むcppファイルを差し替える分岐を作ってあげます。



```cmake
if (${FLAVOR} STREQUAL "FLAVOR1")
    message("adding the source code for Flavor1...")
    add_library( # Sets the name of the library.
            hello-lib

            SHARED

            // 差し込んでるcppファイルが違う！       
            ${CMAKE_CURRENT_SOURCE_DIR}/flavor1/hello-lib.cpp)
elseif (${FLAVOR} STREQUAL "FLAVOR2")
    message("adding the source code for Flavor2...")
    add_library( # Sets the name of the library.
            hello-lib

            SHARED

            // 差し込んでるcppファイルが違う！
            ${CMAKE_CURRENT_SOURCE_DIR}/flavor2/hello-lib.cpp)
endif ()
```

このようにしてndkで使用するcppファイルをProductFlavorごとに差し替えることができました！

サンプルプロジェクトをGitHubに置いておくので参考にしてください。
[NdkFlavor](https://github.com/RyuNen344/NdkFlavor)
Node.jsのインストール

# 概要
* MacにNode.jsをインストールする。
* ターミナルでHomebrewを使ってインストールする。

# 前提
* Homebrewをインストール済
* ログインシェルがzsh

# 手順
1. nodebrewをインストールする
2. Node.jsをインストールする
3. パスを通す

## 1. nodebrewをインストールする
下記を実行する

```shell:terminal
brew install nodebrew
```

※補足：nodebrewのバージョン確認

```shell:terminal
nodebrew -v
```

## 2. Node.jsをインストールする
### 2.1 nodebrewでNode.js（安定版）をインストールする
下記を実行する

```shell:terminal
nodebrew install-binary stable
```

※補足：下記のような結果が出て、インストールができなかった場合

```shell:terminal（結果）
Fetching: https://nodejs.org/dist/v14.14.0/node-v14.14.0-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /Users/[username]/.nodebrew/src/v14.14.0/node-v14.14.0-darwin-x64.tar
Warning: .gz: No such file or directory

curl: (23) Failed writing body (0 != 980)
download failed: https://nodejs.org/dist/v14.14.0/node-v14.14.0-darwin-x64.tar.gz
```

下記を実行する（.nodebrewディレクトリがない場合、-pオプションをつける）

```shell:terminal
mkdir -p ~/.nodebrew/src
```

その後、再度2.1を実行

### 2.2 インストールしたバージョンを使用するようにする
#### 2.2.1 インストールしたバージョンを確認する
下記を実行する

```shell:terminal
nodebrew ls
```

```shell:terminal（結果）
v14.14.0

current: none
```

※「current: none」は、現在使用に指定しているバージョンはないという意味

#### 2.2.2 インストールしたバージョンを使用するようにする
下記を実行する

```shell:terminal
nodebrew use v14.14.0
```

再度下記を実行

```shell:terminal
nodebrew ls
```

下記の通り、インストールしたバージョンが使用に指定されていることを確認

```shell:terminal（結果）
v14.14.0

current: v14.14.0
```

## 3. パスを通す
### 3.1 Node.jsを使えるように、下記を実行しパスを通す

```shell:terminal
echo "export PATH=$HOME/.nodebrew/current/bin:$PATH" >> ~/.zshrc
```

下記を実行し、ファイルを読み直す

```shell:terminal
source ~/.zshrc
```

### 3.2 使用可能かを確認する
下記を実行する

```shell:terminal
node -v
```

下記のような結果が出れば完了

```shell:terminal（結果）
v14.14.0
```
ArduinoでFreeRTOSを使ってみる(1) 一番単純なプログラム


マリオカートハッキングが流行っていて、久しぶりにSTM32のことを思い出しました。
STM32で大規模プログラムを書くために必要なFreeRTOSを、まずはArduinoで勉強してみます。

# FreeRTOSとは
オープンソースの組み込み用リアルタイムOS。
非常に軽量（6K～12KB）であることと、複数のマイコン（Arm、AVR(Arduino)、PICなど）に対応していることが特徴的。
2017年にAmazonに買収されているため、AWSとの密な連携が可能となる。

FreeRTOSの公式ドキュメント (https://docs.aws.amazon.com/ja_jp/freertos/latest/userguide/what-is-freertos.html) には、アーキテクチャとして以下の図が掲載されている。MQTTやBLEなどの通信ライブラリやAWS関連の機能があるのが心踊る。
（※ただしこれはFreeRTOSの全体図であり、Arduinoで使えるのはおそらくFreeRTOS Kernelの部分だけ(?)だと思われる。要調査。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/9ff24863-dd17-06ed-ab15-4465a1f082fc.png)


# ArduinoにFreeRTOSをインストールして遊ぶ
## インストールする方法
こちらの記事 (https://qiita.com/infinite1oop/items/aac04a70c1ed71cb83cc) を参考に、ライブラリマネージャからFreeRTOSをインストール。簡単。FreeRTOSライブラリのインストールが完了すると、Arduinoのファイル>スケッチ例からFreeRTOSのサンプルプログラムが選択できるようになる。

## マルチタスクをやってみる
### 2つのタスクを約1秒おきに実行するプログラム
シリアル出力で「A」と表示する<タスクA>と「B」と表示する<タスクB>だけのプログラムを作った。

```FreeRTOS_task.ino
#include <Arduino_FreeRTOS.h>

void TaskA( void *pvParameters );
void TaskB( void *pvParameters );

// the setup function runs once when you press reset or power the board
void setup() {
  
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB, on LEONARDO, MICRO, YUN, and other 32u4 based boards.
  }

  // Now set up two tasks to run independently.
  xTaskCreate(
    TaskA
    ,  "TaskA"   // A name just for humans
    ,  128  // This stack size can be checked & adjusted by reading the Stack Highwater
    ,  NULL
    ,  2  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
    ,  NULL );

  xTaskCreate(
    TaskB
    ,  "TaskB"
    ,  128  // Stack size
    ,  NULL
    ,  1  // Priority
    ,  NULL );

}

void loop()
{
  // Empty. Things are done in Tasks.
}

void TaskA(void *pvParameters)  // This is a task.
{
  (void) pvParameters;

  for (;;) // A Task shall never return or exit.
  {
    Serial.print('A');
    vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second
  }
}

void TaskB(void *pvParameters)  // This is a task.
{
  (void) pvParameters;

  for (;;)
  {
    Serial.println('B');
    vTaskDelay( 1000 / portTICK_PERIOD_MS ); // wait for one second
  }
}
```

サンプルプログラムの「Blink_AnalogRead.ino」を修正して作った。
setup()の中でxTaskCreate関数を呼んでタスクを生成し、loop()には何も書かずに各タスクに処理を書くのが基本構成。
優先度が高いタスクは、vTaskDelay()を使用して、待ち状態を意図的に作る必要がある。

上のプログラムをシリアルモニタで見てみる。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/7d6e8278-9de7-4850-c6d7-1e209f4b4c73.png)
だいたい1秒おきにAとBが出力されている。Aの方が優先度が高いので、ちゃんとAが先に実行されている。


上記のプログラムでは、タスクAが実行して1秒待つ→その間にタスクBが実行される→タスクAが実行される、という構成のため、タスクAの処理時間だけ1秒間隔がずれてしまっている。50ms～100msくらいずれているので、組み込みの世界では致命的になりかねない。次は「できる限り正確に」1秒周期で実行するタスクを実行するする方法について書きたい。
オフライン環境構築 VirtualBox編

[オフライン環境構築 目次へ](https://qiita.com/kannkyo/items/1e5f8362ed591ebda33d)

# インストール

[公式サイト](https://www.virtualbox.org/)からインストーラをダウンロードし、実行する。

# インストール時のWindowサイズの変更方法

以下のサイトを参考にする。

<https://qiita.com/mittsukan/items/d8535dbd7285766f1bda>

## VirtualBox Guest Additionsのインストール方法

以下のサイトを参考にする。

<https://qiita.com/take88/items/a85a95ba392565b2353b>

## 既知の問題

### EPEL

> Note: Do not choose Server with a GUI as your base environment. There is a known issue that will prevent the graphical desktop from starting
> 
> see: https://developers.redhat.com/rhel8/install-rhel8-vbox


https://www.dot-plus.com/server/linux/1663/
オフライン環境構築まとめ

1. [オフライン環境構築 Ansible編](https://qiita.com/kannkyo/items/255c0b8744a0ca7f4a13)
2. [オフライン環境構築 bower編](https://qiita.com/kannkyo/items/2f393c2e86c0c9661c6a)
3. [オフライン環境構築 npm編](https://qiita.com/kannkyo/items/5ec7ad14d0b99b4f5de8)
4. [オフライン環境構築 Nexus Repository編](https://qiita.com/kannkyo/items/5195069c65350b60edd9)
5. [オフライン環境構築 Vagrant編](https://qiita.com/kannkyo/items/4491d14824366fada963)
6. [オフライン環境構築 CentOS編](https://qiita.com/kannkyo/items/ebf33743376edeaeb7ae)
7. [オフライン環境構築 Ruby編](https://qiita.com/kannkyo/items/bd641bc279ad4f502fba)
8. [オフライン環境構築 VirtualBox編
](https://qiita.com/kannkyo/items/1d88459491b8e3a271a9)
9. [オフライン環境構築 pip編](https://qiita.com/kannkyo/items/aca48ed928a433c7ca4c)
9. [各種パッケージマネージャのキャッシュクリア方法](https://qiita.com/kannkyo/items/5715e4785b1098397579)
オフライン環境構築 Ruby Gem編

[オフライン環境構築 目次へ](https://qiita.com/kannkyo/items/1e5f8362ed591ebda33d)

# はじめに

オフラインでRuby gemを使いたい人のための手順。

# gem

オンラインで以下のコマンドを実行し、gemファイルをダウンロードする。

```bash:ogem-get.sh
name=$1
version=$2
wget https://rubygems.org/downloads/$name-$version.gem
```

オフラインでgemファイルをロードするときは以下のコマンドを実行する。

```bash:ogem-load.sh
name=$1
version=$2
gem install -l $name-$version.gem
```
[day: 2]目標設定の方法

# 目標設定の方法
## はじめに
2020/4/1にエンジニアになりました。
scala/Play、TypeScript/Angular
ほぼ日記みたいな内容です。
毎日の学習のアウトプットが目的です。

## 目標設定の仕方を学びました
学習する際に具体的な目標やアクションを設定できずに何をやっているのかわからなくなってしまうことがよくありました。
自分が何のために何を学ぶべきかを迷わないために、目標設定の方法について学びました。
### MACの法則
`Measurable`(測定可能性である)、`Actionable`(実行可能である)、`Competent`(適格である)
の頭文字をとってMACの法則と呼ばれています。
#### Measurable
目標を数値で測れるようにする。
例) ~~やせる~~ -> 5キロやせる

#### Actionable
行動に移せる具体的なアクションを設定する。
例) ~~頑張る~~ -> 毎日30分ランニングする

#### Competent
その目標が自分の価値観に合っているかを確認する。
その目標を本当に達成したいと思うか？
その目標は達成しなければいけないのか？
と自問自答することでその目標が本当に正しいのかを判別する。

これらの要素に沿って目標や行動を決めることで明確に設定することができるようになります。
[海外大学が証明。たった3つの「事前準備」で目標達成率が大きく上がるワケ。]
(https://studyhacker.net/columns/mac-housoku)

## 実際に目標設定をする
会社での人事評価であるGradeをあげたいのでそれが今季の目標の核です。
具体的な行動は必要となるスキルをマインドマップで分解し洗い出します。
### 目標
2021/2/28までにGrade5-3に上がれる力をつける
現在のGradeは6-3
※(6-3 -> 6-2 -> 6-1 -> 5-3)

### 行動
月に100時間、週に25時間の学習時間を確保する。†
必要な書籍を毎週1冊以上読む
毎晩1時には寝る
朝は7時に起床する
mindNode(マインドマップ)に書き出した事柄を一つずつ達成する

## 毎日投稿について
- 完全な自己満足
- アウトプットの習慣づけ
- インプットした内容の記憶の定着を促進
- 継続 > クオリティ
- 昨日の自分より成長している実感を得る
画像をぼかす方法(超簡単)

#簡単！背景画像をぼかす方法
![144f999b1a92884d6f066877ca4bb31e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/d7127d81-577e-5768-194e-a49e45e0f97e.jpeg)
#CSSに一言だけ付け足せばOK!
```java:index.html.erb
<%= image_tag "star.webp", class:"bgimage" %>
```
##上記のclass名はお好みで！次はCSS!!
```java:○○.css
.bgimage{
  filter: blur(5px);
  width: 100%;
}
```
##上記の通り<font color="Red">filter: blur(5px);</font>を追加すればOK!
##<font color="Red">5px</font>となっていますが、1にするにも10にするにもぼかしの濃さを調整できますのでお好みで！
## widthは100%にしておくと画面幅がぴったりになると思うのでこちらも忘れずに！
#現場からは以上です！
Vue CLI で axios を使って通信する方法

# 【Vue.js】Vue CLIでaxiosを使って通信する
Vue CLIでaxiosを使って通信する際に躓いたため、メモ程度にまとめたのでどうぞ

# バージョンなど
vue/cli 4.5.6
axios 0.20.0

# 手順
1.プロジェクトの作成（本題ではないため割愛）
2.axiosのインストール
3.vueでaxiosの読み込み
4.テスト

# やってみよう
## 1.プロジェクトの作成（本題ではないため割愛）
今回はaxiosの導入の仕方なのでプロジェクトが作成されている前提で進めます。
まだプロジェクトが出来ていない場合は[こちらを参考](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)に...

## 2.axiosのインストール
プロジェクトに`axios`をインストールします。
インストールするにはプロジェクトのディレクトリに移動して

`npm install axios`

を実行するだけです。

```console

+ axios@0.20.0
added 1 package from 1 contributor and audited 1306 packages in 4.757s

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

found 0 vulnerabilities
```

このような表示が出ればOKです。

## 3.vueでaxiosの読み込み
次に`axios`を読み込みます。
`src/main.js`を編集します。

```js


import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'  // 今回追加

Vue.config.productionTip = false

Vue.prototype.$axios = axios  // 今回追加

new Vue({
  axios, // 今回追加
  render: h => h(App),
}).$mount('#app')

```

`今回追加` のコメントの行を追加してください

次に通信を行いたいページ（今回はテストなのでデフォルトでプロジェクト作成時に作られるsrc/App.vue）に記述します

```js

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  // ここから
  created(){
    this.$axios
      .get('https://api.coindesk.com/v1/bpi/currentprice.json')
      .then(
        response => (
          console.log(response)
        ))
  }
  // ここまで追加
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

```

`ここから`　と　`ここまで追加` の間が今回追加したコードです
ページが読み込まれた時にhttps://api.coindesk.com/v1/bpi/currentprice.json と通信してBitcoin の価格を取得してコンソールに表示しています。

## 4.テスト

作成したプロジェクトを起動させ表示させてみてください。
`コンソール` に画像のような通信結果が表示されていたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126512/f5614fca-672d-737d-3b91-fa028abff05b.png)


# 参考にさせていただいたサイト
https://jp.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html

https://public-constructor.com/how-to-create-spa-with-vue/#toc9


最後まで見ていただいてありがとうございました。
【RSpec】mailer(パスワードのリセット処理)のテストを書いたときにはまった点

最近RSpecにも割と慣れてきて油断しているところに、見たこともないエラーが出てきて少し詰まったのでここで共有したいと思います。
リクエストスペックでmailer(パスワードのリセット処理)のテストを書いたときの話です！

##エラー内容
```bash

 Failure/Error: expect(mail.body.encoded).to match user.reset_token

       expected "\r\n----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9\r\nContent-Type: text/plain;\r\n charset=UTF...\nL2E+CgogIDwvYm9keT4KPC9odG1sPgo=\r\n\r\n----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9--\r\n" to match "HAY"
       Diff:
       @@ -1,2 +1,32 @@
       -HAY
       +
       +----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9
       +Content-Type: text/plain;
       + charset=UTF-8
       +Content-Transfer-Encoding: base64
       +
       +SEFZCuOBggoK
       +
       +----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9
       +Content-Type: text/html;
       + charset=UTF-8
       +Content-Transfer-Encoding: base64
       +
       +PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgaHR0
       (省略)
       +L2E+CgogIDwvYm9keT4KPC9odG1sPgo=
       +
       +----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9--
```
こんな感じのエラーが出てきました。
どうやらRSpecでメール本文のエンコード処理が正しくできていないせいで、期待している値と一致せずにテストに失敗しているようです。

##解決策
パスワードのリセットトークンを作る時、Base64を使ってエンコードしているので、それを元に戻して比較するとうまくいきました。(デコード）

```ruby:password_resets_request_spec.rb
RSpec.describe UserMailer, type: :mailer do
  let(:user) { FactoryBot.create(:user, email: 'mailer_tester@example.com') }

  describe "パスワードリセット処理" do
    let(:mail) { UserMailer.password_reset(user) }
    # Base64 encodeをデコードして比較できるようにする
    let(:mail_body) { mail.body.encoded.split(/\r\n/).map{|i| Base64.decode64(i)}.join }

    it "ヘッダーが正しく表示されること" do
      user.reset_token = User.new_token
      expect(mail.to).to eq ["mailer_tester@example.com"]
      expect(mail.from).to eq ["noreply@protuku.com"]
      expect(mail.subject).to eq "パスワードの再設定"
    end

    # メールプレビューのテスト
    it "メール文が正しく表示されること" do
      user.reset_token = User.new_token
      expect(mail_body).to match user.reset_token
      expect(mail_body).to match CGI.escape(user.email)
    end
  end
end
```

##最後まで読んでいただきありがとうございます！
実は、この情報にたどり着くのに少し手間取ったため、記事にしました。

同じようなところで困っている方のお力になれれば幸いです！
ご指摘などあればコメントいただけますと嬉しいです。
ラズパイにSSHするときに毎回パスワードを入力するのが面倒くさいので鍵認証の設定をしてみた。(mac/Windows)

やってみると意外と簡単。
パスワード入力が不要になるので、やって見る価値はあるかと。

# SSHされる側（ホスト側のRaspberry Pi）での設定

## SSHサーバーの設定変更

デフォルトでは鍵認証が有効になっていないので、設定を変更します。

```console:RaspberryPi
sudo sed -i 's/#PubkeyAuthentication/PubkeyAuthentication/g' /etc/ssh/sshd_config
sudo sed -i 's/#AuthorizedKeysFile/AuthorizedKeysFile/g' /etc/ssh/sshd_config

sudo systemctl restart sshd.service
```

## SSHで使用する鍵の作成

```console:RaspberryPi
pi@raspberrypi4:~ $ ssh-keygen -t rsa -b 4096 -C "moritalous"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/pi/.ssh/id_rsa.
Your public key has been saved in /home/pi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxx
The key's randomart image is:
+---[RSA 4096]----+
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
+----[SHA256]-----+
pi@raspberrypi4:~ $ 
```

`~/.ssh/`にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されます。

公開鍵の方をauthorized_keysに登録します。

```console:RaspberryPi
cat .ssh/id_rsa.pub >>  ~/.ssh/authorized_keys
```

# SSHする側（クライアント側のmac/Windows）での設定

## 秘密鍵の配置と権限変更

ホスト側で作成したid_rsa(秘密鍵)を持ってきます。
私は`~/.ssh/raspberrypi4/`の配下(Windowsの場合は`%USERPROFILE%\.ssh\raspberrypi4`)に保存しました。

権限変更はmacの場合のみ。Windowsの場合は不要でした。

```console:macのみ
chmod 600 ~/.ssh/raspberrypi4/id_rsa
```

## 設定ファイルの作成

macの場合もWindowsの場合も、IdentityFileの指定は同じです。Windowsだからといって`%USERPROFILE%`と書いたり、エスケープ文字が`\`(円)になったりしません。

```text:~/.ssh/config
Host raspberrypi4.local
  HostName raspberrypi4.local
  User pi
  IdentityFile ~/.ssh/raspberrypi4/id_rsa

Host raspberrypi3.local
  HostName raspberrypi3.local
  User pi
  IdentityFile ~/.ssh/raspberrypi3/id_rsa
```

これで、パスワードなしでSSH接続できます。

```console:mac/Windows
$ ssh pi@raspberrypi4.local
Linux raspberrypi4 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Sun Oct 18 16:26:01 2020 from 192.168.0.8

pi@raspberrypi4:~ $ 
```

VSCodeのSSH接続の拡張機能([Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh))を使った場合もパスワード無しで、接続されます。
わーい
EC2の接続に必要な鍵もこうやって管理すればいいんですね。
online-judge-toolsをインストールしたのにacc check-ojを実行してonline-judge-tools is not available.と出力された場合の解決方法

# はじめに
* [atcoder-cli](https://github.com/Tatamo/atcoder-cli) と[online-judge-tools](https://github.com/online-judge-tools/oj)が連携できているかを確認する``acc check-oj``コマンド実行時に以下のエラーが出力された場合の対処方法について記載します。

```
$  acc check-oj
online-judge-tools is not available.
```

# このエラーについて
メッセージの内容そのままにatcoder-cli側でonline-judge-toolsが見つからない場合に出力されます。

# 確認観点
- oj -hを実行してonline-judge-toolsがインストールされているか念の為確認
- ojがインストールされている場合は``which oj``等を実行してonline-judge-toolsのインストールパスを確認
- acc configを実行してoj-pathの値を確認して上で確認したインストールパスが正しいか確認

## atcoder-cliの中身を見てみると
[oj.ts](https://github.com/Tatamo/atcoder-cli/blob/develop/src/facade/oj.ts) 側の処理を確認するとacc configでoj-pathの値を指定していない場合はonline-judge-toolsのインストール場所を検索するので、このエラーが発生する場合は過去にacc configを実行してoj-pathを指定したことがあって、かつその後online-judge-toolsのインストール場所を変更した場合に発生します。
UWPでメッセージボックスを表示したいとき

UWPでMessageBox.Show()したいとき

各ダイアログの表示確認ようにUWPアプリ作りました。
[ソースコード](https://github.com/Yuki4-dev/MessageBox_Sample "ソースコード")

##MessageDialog
シンプルなメッセージ表示ダイアログです。

```MessageDialogSample.cs
var dialog = new MessageDialog("コンテンツ", "タイトル");
_= dialog.ShowAsync();

```
こんな感じでモーダルで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/a515d2db-06d6-b04c-f313-1800109815be.png)
アラートなどユーザーに何かを伝えたいときに便利です。

##ContentDialog

* ボタン1つの場合


```ContentDialogSample1.cs
var dialog = new ContentDialog()
{
    Title = "OK Dialog Here!!",
    Content = "Click Ok Button Dialog",
    CloseButtonText = "Ok"
};
 var result = await dialog.ShowAsync();
```
こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/8a1b4bce-b105-21d0-9a67-0ec8df883cdc.png)

* ボタン2つの場合

```ContentDialogSample2.cs
    var dialog = new ContentDialog()
    {
        Title = "Yes No Dialog Here!!",
        Content = "Click Yes No Button Dialog",
        PrimaryButtonText = "Yes",
        CloseButtonText = "No"
    };
    var result = await dialog.ShowAsync();
```
こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/271a3a75-7f95-be86-9889-1786a97990af.png)

* ボタン3つの場合

```ContentDialogSample3.cs
    var dialog = new ContentDialog()
    {
        Title = "3 Button Dialog Here!!",
        Content = "Click 3 Button Dialog",
        PrimaryButtonText = "Allow",
        SecondaryButtonText = "Delete",
        CloseButtonText = "Cancel"
    };
    var result = await dialog.ShowAsync();
```
こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/497fb8a4-ce07-9f0c-12f7-971c408fd62c.png)

###ContentDialogのShowAsync()の戻り値について
```C#
namespace Windows.UI.Xaml.Controls
{
    [ContractVersion(typeof(UniversalApiContract), 65536)]
    [WebHostHidden]
    public enum ContentDialogResult
    {
        None = 0,
        Primary = 1,
        Secondary = 2
    }
}
```
ContentDialogのプロパティに設定した値に対応するボタンが押された際、下記の戻り値を返却します。

|プロパティ|コマンド|戻り値|
|:---:|:---:|:---:|
|CloseButtonText|CloseButtonCommand|None|
|PrimaryButtonText|PrimaryButtonCommand|Primary|
|SecondaryButtonText|SecondaryButtonCommand|Secondary|
また、それぞれコマンドプロパティも実装されているので、コマンドを作成してプロパティに設定することも可能です。

MessageDialogクラスがsealedクラスであるのに対してContentDialogクラスは継承できるのでレイアウトを拡張したり、好きなコントロールを配置可能なので使いやすいと思います。

###応用　InputDialog
ContentDailogクラスを拡張して1つのテキストボックスを持つダイアログクラスを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/f065fafa-0823-9be1-f0aa-e55c6d730ed8.png)
Jest の beforeEach() / test() と Promise と setTimeout() の関係

# 要約

-   `beforeEach()` は常に `Promise` が (`then()` まで含め) 全部満たされてから `test()` に移る。
-   `setTimeout()` は呼ばれない。

# 実行例

```javascript:test.js
describe('async test', () => {
  let called;

  function promise() {
    console.log(called = 'function');

    setTimeout(() => {
      console.log(called = 'setTimeout()');
    }, 0);

    return new Promise(resolve => {
      console.log(called = 'Promise()');
      resolve();
    }).then(() => {
      console.log(called = 'then()');
    });
  }

  describe('test() only', () => {
    test('without await', () => {
      promise();
      expect(called).toBe('Promise()');
    });
  });

  describe('test() only', () => {
    test('with await', async () => {
      await promise();
      expect(called).toBe('then()');
    });
  });

  describe('beforeEach() and test()', () => {
    beforeEach(() => {
      promise();
    });

    test('without await', () => {
      expect(called).toBe('then()');
    });
  });

  describe('beforeEach() and test()', () => {
    beforeEach(async () => {
      await promise();
    });

    test('with await', () => {
      expect(called).toBe('then()');
    });
  });
});
```

```
yarn run v1.22.10
$ jest --verbose
 PASS  ./test.js
  async test
    test() only
      ✓ without await (12 ms)
      ✓ with await (2 ms)
    beforeEach() and test()
      ✓ without await (1 ms)
      ✓ with await (7 ms)

  console.log
    function

      at promise (test.js:5:13)

  console.log
    Promise()

      at Promise.then.console.log.called (test.js:12:15)

  console.log
    then()

      at test.js:15:15

  console.log
    function

      at promise (test.js:5:13)

  console.log
    Promise()

      at Promise.then.console.log.called (test.js:12:15)

  console.log
    then()

      at test.js:15:15

  console.log
    function

      at promise (test.js:5:13)

  console.log
    Promise()

      at Promise.then.console.log.called (test.js:12:15)

  console.log
    then()

      at test.js:15:15

  console.log
    function

      at promise (test.js:5:13)

  console.log
    Promise()

      at Promise.then.console.log.called (test.js:12:15)

  console.log
    then()

      at test.js:15:15

Test Suites: 1 passed, 1 total
Tests:       4 passed, 4 total
Snapshots:   0 total
Time:        0.979 s, estimated 1 s
Ran all test suites.
✨  Done in 1.83s.
```

# 参考

-   [Microtasks](https://ja.javascript.info/microtask-queue)
【Ruby】配列

# 配列とは
- 複数の情報を順番にまとめて管理するもの
- 1つの変数で複数の値を持つことができる
- 配列の中には複数の値を入れることができる

入力

```
names = ["田中","山田","佐藤"]

puts names
```

出力

```
田中
山田
佐藤
```

# 値の追加（<<）
配列の一番後ろに値を追加する。

入力

```
names << "鈴木"

puts names
```
出力

```
田中
山田
佐藤
鈴木
```

# 配列の値の取得
添字を指定し取得する。
入力

```
name = names[0]
puts name

name = names[2]
puts name
```
出力

```
田中
佐藤
```

# 配列の値の変更
入力

```
puts name[1]
names[1] = "佐々木"
puts name[1]
```
出力

```
山田
佐々木
```
RAIDの情報ってどこに保存されているの？

## 勉強前イメージ

RAIDってそもそもHDDの組み込み方法を決めてるけど、そもそもその情報ってどこにあるのかと....
HDDに入れたら故障したらデータなくなっちゃって危ないから、RAIDの情報専用のデータ保存するところある気がする....

## 調査

### RAIDとは

HDDの構成情報のようなもの。
どうやってデータ保存するかって。

### RAID構成情報の保存方法

RAID構成情報についてはRAIDが管理しているHDDに書き込まれます。
HDDに置く理由としては、HDDだけでなくRAIDコントローラーも故障するので
交換の際に、RAIDコントローラーにデータがあればHDDの構成情報がなくなるのでHDDに持っていると言うことです。
実際には、RAIDコントローラーが故障した際に構成情報も壊れていたり
絶対にHDDに保存しているとは限らないそうですが、
基本的にはRAIDコントローラーを修理することはできそうです。

## 勉強後イメージ

別にデータ持ってると思ってたけど、HDDに書き込まれるのね。
壊れないためには、RAIDコントローラーも冗長化するのが良い気がする....	

## 参考

- [RAIDコントローラが故障した場合にどのようにして復旧するか](https://nas-rescue.com/blog/index.php?QBlog-20160208-1)
SessoinとCookieの違い

# 最初に
記録用にQiitaに投稿
# Sessionとは？
>アクセスの開始から終了までの一連の通信のこと。簡単に言えばこんにちはからさよならまで。
>基本的にサイトにアクセスしてから一定時間経過し通信が終了します。これを１セッションとします。
セッションにおける一番のポイントは”一連”の通信であることです。
たとえば、あるWebサイトにアクセスして、そのサイト内で3ページを閲覧して離脱したとします。3ページ閲覧したものの、これは一連の通信の中で行われたものなので、1セッションになります。

>セッションを識別するためのID（セッションID）を生成し、その内容をCookieに保存します。
このセッションIDにユーザー情報や処理状況を紐付けておき、通信時にCookieに保存したセッションIDを読み取ることで、その通信がどのユーザーからのもので、どういった処理状態にあるのかを把握することが可能になります。

・WebサーバはCookieを受け取ると格納されたセッションIDを元に、メモリ上にあるログイン状態を復元する。
・Cookieと紐づくことで高い安全性が保たれる





# Cookieとは？
>ブラウザを訪問した際に、ブラウザのデータを記憶しておく仕組みのこと。CookieにはCookie IDが記載されており、そのIDによって固有のブラウザであることを特定しています。
Webサイトにアクセスした時に、WebサーバーからCookieがブラウザに送られ、ブラウザに保存されます。次回同じwebサイトにアクセスした時、ブラウザ上のCookieがWebサーバーに送られ、サーバー側に保存されているユーザー情報とCookieが紐づきます。

・webページでログインした時の情報を保存して次回ログイン時に手間を省いてくれる仕組み
・Cookie内には個人情報などがあるためセキュリティ上危険。そのためセッションにより安全に情報を保持する。

# SessionとCookieの違い
・Cookieはブラウザに保存され、セッションはWEBサーバーに保存される。
・sessionはブラウザを閉じた時点で破棄される
・cookieはブラウザにファイルで保存している為、時間制限があるがブラウザを閉じても破棄されない

一度ブラウザを閉じれば、再度ログイン画面に戻ると言った動きに使用できます。
Djangoの導入~Anaconda+Pycharm~



#Anacondaのインストール
以下よりダウンロードしてください
https://www.anaconda.com/products/individual

Anacondaインストール後こんな画面にたどり着くと思います。

![スクリーンショット 2020-10-18 22.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/b3569d42-92b4-2e46-9b2f-874cdf7554d9.png)

#Pycharmのインストール

上の画像だとLaunchになっていますが、各々の画面だとPycharmの部分がInstallになっているはずなのでそこからインストールしてください。

#仮想環境構築
左のタブからEnvironmentsを選択して下さい。

![スクリーンショット 2020-10-18 23.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/fb59a7d3-b0f6-b1e0-b30b-0785f42f24ed.png)

こんな画面になると思います。画面下側のCreateから新たに環境を構築します。
そうすると右側にインストール済みのライブラリ一覧が表示されます。Serach PackegesからDjangoと検索すればヒットするのでインストールをします。

#プロジェクト作成
使用する環境の緑の三角ボタンをからOpenTerminalを押します。

次にターミナルからプロジェクトを作成したいディレクトリまで移動し、以下のコマンドを実行します。


```
django-admin startproject project .
```
これでDjangoプロジェクトの生成が完了しました。

#アプリケーション作成
先ほどプロジェクトを作りました。次に中身となるアプリケーションを作ります。

先ほどのディレクトリで以下のコマンドを実行します

```
python manage.py startapp "任意のアプリケーション名"
```

#Pycharmでプロジェクトを開く
Pycharmを起動して先ほど作ったプロジェクトを開いて下さい。
![スクリーンショット 2020-10-18 23.35.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793703/c694ac2c-de5c-2fc0-7bd6-2c746df1c3fe.png)

Project Interpreterから環境を選んだら準備完了です。あとはプログラムをゴリゴリ書いていくだけです。

それではみなさん良いPythonライフを
行政データや複数APIを使って写真サイトを立ち上げて学んだこと

経済産業省のプロジェクト「FIND/47」の写真（２次利用OK）を利用し、NTTのCotohaやGoogleのAPIを使用してランダムに国内風景写真を表示するサイトを作った。自分で言うのもアレだけど、個人開発の制作30時間で良い感じのサイトができた。

[旅行好きのためのランダム風景写真サイト JP-ictures](https://jpictures.kuma-server.com/home/)


####どういうサイトかと言うと
サイトの訪問時・更新時におおよそ1000枚の写真から１枚をランダムで選択し、表示する。その写真の撮影場所のマップと関連するワードの解説を入れる。というシンプルなサイト。
旅行の行き先を探している人や直感で旅行に行こう！って人に向けたサイトであり、写真を見て旅行欲を刺激して広告収入を得れたら良いなー程度で作り上げた。暇つぶしにするのも最適。


####このサイト作成を通して伝えたいことは

- 開発期間の短縮のために利用できるAPIは利用すべし
- 行政関係は無料で使えるデータが多い


ということ。特に初心者に伝えたい。


####開発期間の短縮のために利用できるAPIは利用しろ
個人開発は納期などの制限もなく伸び伸びとできるのがメリット。しかし、長期間ではモチベを保ちきれない。そのために目的に沿い利用できる企業・行政のシステムは利用した方が効率がいい。
このサイトでもNTTのCotohaとGoogle Map、国土地理院などのAPIを利用。(APIではないがDBPediaなども)これらのおかげで開発期間をかなり短縮できた。

実際、上記に挙げたAPIはすでに使い方の解説や実例を紹介した記事もQiitaに多いため、手を出しやすい。開発期間の短縮と勉強にもなり、一石二鳥。


####行政関係は無料で使えるデータが多い

サイトのメインで使用している写真の引用元であるFIND/47は経済産業省、上記に挙げた国土地理院も行政関係であり、無料で使えるデータやAPIが多い。
個人開発では資金にも限りがあるため、無料で使用可能なデータやシステムが多い行政関係はありがたい存在になる。（もちろん企業でも無料で提供しているものも多い。）



以上が伝えたいこと。

####最後に

個人開発エンジニアでWebサービスだと、相手の便利を追求するサービスが多い。だが、それはエンジニアとして当たり前のことであり、便利さを追求するのがエンジニアの極意だとも思っている。だからこそ、こんな息抜きにもなる暇つぶしサイトが一つぐらいあってもいいんじゃないか。と思って作った。

そのため、開発の息抜きにでも見てほしい。そして、使った感想やコメントなどがあったら是非ください。あともっとDjango仲間増えてほしい。

[旅行好きのためのランダム風景写真サイト JP-ictures](https://jpictures.kuma-server.com/home/)
plantFEMで作ったメッシュオブジェクトをmatplotlibで描画する。

plantFEMで以下のようなスクリプトを実行すると、円筒型のメッシュオブジェクトが作られます。

```fortran
! server.f90
program main
    use plantFEM
    implicit none

    type(FEMDomain_) :: domain

    call domain%create(meshtype="Cylinder",x_num=10,y_num=10,z_num=10,x_len=10.0d0,y_len=3.0d0,z_len=2.0d0)
    call domain%json(name="domain.json",endl=.true.)


end program main
```
実行コマンドはこちらです。

```shell

./plantfem run
```

このメッシュオブジェクトはjson形式で保存されています。
これを、matplotlibで描画してみます。

以下が描画用スクリプトです。

```python
import json
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

json_file = open('domain.json', 'r')
json_object = json.load(json_file)

# メッシュオブジェクト中の節点座標配列を取り出す

nodcoord = np.array(json_object["mesh"]["nodcoord"])

# 以下、matplotlibで描画
#x軸とy軸にラベル付け
fig = plt.figure()
ax = Axes3D(fig)

ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

# 節点を描画

x = nodcoord[:,0]
y = nodcoord[:,1]
z = nodcoord[:,2]
ax.plot(x,y,z,marker="o",linestyle='None')

# 図を表示

plt.show()
```

なお、ここではjsonファイル名をdomain.jsonとしています。

スクリプトを実行すると、3次元の円筒メッシュの節点が描画されています。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489195/3be59c30-c45b-8a23-0049-675062c9d302.png)
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489195/7ddeb416-ab96-739b-4a5d-3fc4f1d67234.png)


今後は、

```python
json_object["mesh"]["elemnod"]
```
にはコネクティビティ情報が格納されていますので、今後はそちらを使ってメッシュの描画を行いたいと思います。
ABCのちょっと昔の問題を解く (ABC 040 C 柱柱柱柱柱)


#[ABC040 C 柱柱柱柱柱](https://atcoder.jp/contests/abc040/tasks/abc040_c)

最近○柱というのが巷で流行っている。
水柱さん、風柱さん、岩柱さん、炎柱さん、嘘柱誇張しのぶさんだのいろんな柱の方がいてポケモンみたい。
ちなみに私は炎柱さんが好きです。(今回の話に○殺隊は一切関係ありません)
なので(?)今回はちょっと古い2016年の問題
[ABC040 C 柱柱柱柱柱](https://atcoder.jp/contests/abc040/tasks/abc040_c)
をC++で解いてみた。
(2016年はちょっと前だよね？まだ古いって程ではないよね？？)

**問題文**
>
$N$本の木の柱が左から右へ一列に並んだアスレチックがあります。左から$i$本目の柱の高さ$a_{i}$センチメートルです。高橋君は左から$1$本目の柱からスタートし、右へ柱を渡っていき$N$本目の柱まで行こうとしています。高橋君がある柱にいるとき、次には現在の柱から$1$個もしくは$2$個右にある柱のどちらかへ移動することができます。移動するときには、現在いる柱の高さと、移動後の柱の高さの差の絶対値のぶんだけコストがかかります。$N$本目の柱まで行くとき、コストの合計の最小値はいくらになるでしょうか。
>
制約
$2≦N≦100,000$
$0≦a_{i}≦10,000$
$a_{i}$はすべて整数である。

#解法(壱ノ型)

パッと見典型的な動的計画法の問題だなあという印象。
${\rm dp}[i]:=i$本目の柱に着いた時のコストの合計の最小値
とすれば漸化式がたてられます。
状態の遷移を考えて漸化式を立てるというのは大学受験でも割とよくある問題(だと思う)。
具体的には

```math
{\rm dp}[i] = min({\rm dp}[i-1]+ \left|a_{i}-a_{i-1}\right|,\ {\rm dp}[i-2]+ \left|a_{i}-a_{i-2}\right|)
```

のように$i-1$番目から来る場合と$i-2$番目から来る場合の２通りのうち最小な方を選べば良い。
実装する時には配列${\rm dp}[]$に予め巨大な数を入れておいて、それを順番に更新していく。注意としては$i=1$では$i-2$番目が存在しないので取り除かないといけないことぐらいだろうか。
ちなみに巨大な数ってなんぼやねんというと

```C++
INF = 1ll <<60 
```
とするといいらしい。が、なんでかはよくわかってないので勉強しないといけない。

以上を踏まえて実装したものがこちら


```C++
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

const long long INF = 1ll<<60;
 

long long N;
long long a[100010];
long long dp[100010];

int main(){
    cin >> N;
    for(int i = 0; i < N; i++){
        cin >> a[i];
    }
    /*初期化*/
    for(int i = 0; i < 100010; i++){
        dp[i] = INF;
    }
    dp[0] = 0;
    for(int i = 1; i < 100010; i++){
        dp[i] = min(dp[i], dp[i-1] + abs(a[i] - a[i-1]));  
        if(i > 1){
            dp[i] = min(dp[i], dp[i-2] + abs(a[i] - a[i-2]));
        }
    }
    cout << dp[N-1] << endl;
}
```
入力例

```C++
9
314 159 265 358 979 323 846 264 338
```
出力

```C++
310
```
とりあえずこれでACになったのでヨシ！
そういえば配列を定義する時、今まで上限を格納するのに必要な最低限数だけ確保してたが、いろんな人のコードを見ると[上限+ちょっと]としてる人が多い(なので今回は$a[100010]$や${\rm dp}[100010]$にしてみた)
なんとなくぴったりにしてた方が何か間違いがあった時エラーでわかるんちゃうかという適当な認識だが、ここら辺もちゃんと勉強しないといけない。

※追記
そもそもvectorで書いたらあかんのか？と思って下のように書いたら普通に通った、しかもこっちのがわずかに速い。が、通ったというだけでもしかしたらいけないことをしている可能性もあるので勉強しよう…

```C++
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;

const long long INF = 1ll<<60;
 

long long N;

int main(){
    cin >> N;
    vector<long long> a(N);
    vector<long long> dp(N);
    for(int i = 0; i < N; i++){
        cin >> a[i];
    }
    /*初期化*/
    for(int i = 0; i < N; i++){
        dp[i] = INF;
    }
    dp[0] = 0;
    for(int i = 1; i < N; i++){
        dp[i] = min(dp[i], dp[i-1] + abs(a[i] - a[i-1]));  
        if(i > 1){
            dp[i] = min(dp[i], dp[i-2] + abs(a[i] - a[i-2]));
        }
    }
    cout << dp[N-1] << endl;
}

```

#解法(弐ノ型)
もしなんか思いついたら書く

#感想
鬼滅の刃面白いよね
CsvHelperを使ったcsvファイル出力を汎用化できないかの試み

#初めに
C#でcsvを扱うとき、Csvhelperというモジュールをよくつかうのですが、以下の記事を参考に出力についても汎用化できないかを試して見て一応できたので、備忘録として記事にします。
正直Genericsについてはあまり理解できていないので、もっといい書き方があるかも。。

参考記事：
[CsvHelperでのcsv読み込みを、Genericsを使って汎用化](https://qiita.com/ko-da-k/items/307518ad9741a6a20851)
[ C# によるプログラミング入門  [オブジェクト指向] ジェネリック](https://ufcpp.net/study/csharp/sp2_generics.html)
[CsvHelper](https://joshclose.github.io/CsvHelper/getting-started)

#汎用化したつもりのコード

```C#
    public static class CSV出力クラス
    {
        public static void CSV出力<CMAP,T>(string f_Path,IEnumerable<T> 出力リスト)
            where CMAP : ClassMap
            where T: class
        {
            using (var csv = new CsvWriter(new StreamWriter(f_Path), CultureInfo.InvariantCulture))
            {
                csv.Configuration.HasHeaderRecord = false;
                csv.Configuration.RegisterClassMap<CMAP>();
                csv.WriteRecords(出力リスト);
            }
        }


    }

```
ClassMap(CMAP)とIEnumerableの型(T)を指定するとそれらに対応したCSVファイルを出力できる。
→出力したいCSVファイルのレイアウトが複数あっても、レイアウトごとの出力ロジックを書く必要がなくなる！！
引数は
　f_Path：（出力先のフォルダパスとファイル名を合わせたもの）
　出力リスト：CSVファイルにしたいリスト
上記を渡すだけ。

#例えばこんな感じ
格納クラス

```C#
    public class SampleCsv
    {
        public int ID { get; set; }
        public string 項目1 { get; set; }
        public string 項目2 { get; set; }
        public string 項目3 { get; set; }
        public string 項目4 { get; set; }

    }

```
マッピングクラス

```C#
    public class SampleCSV_Mapping:ClassMap<SampleCsv>
    {
        private SampleCSV_Mapping()
        {
            Map(x => x.ID).Index(0);
            Map(x => x.項目1).Index(1);
            Map(x => x.項目2).Index(2);
            Map(x => x.項目3).Index(3);
            Map(x => x.項目4).Index(4);
        }
    }

```

出力処理

```C#
            string 出力フォルダ = @"C:\temp\test";
            string ファイル名 = "SampleCsv.csv";

            var 出力リスト = new List<SampleCsv>
            {
                new SampleCsv{ID = 1,項目1="a",項目2="aa",項目3="aaa",項目4="aaaa"},
                new SampleCsv{ID = 2,項目1="b",項目2="bb",項目3="bbb",項目4="bbbb"},
                new SampleCsv{ID = 3,項目1="c",項目2="cc",項目3="ccc",項目4="cccc"},

            };

            CSV出力クラス.CSV出力<SampleCSV_Mapping, SampleCsv>(Path.Combine(出力フォルダ, ファイル名), 出力リスト);
```

出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704336/70155f97-827e-d607-0710-e1656afcc774.png)

※ダブルクォーテーションをつけたり、ヘッダーをつけたりすることも可能だがここではしない

#まとめ
・CsvHelperを使ったcsvファイル出力機能の汎用化

#感想
Genericsについてはまだ理解できたとは言えないのですが、
[CsvHelperでのcsv読み込みを、Genericsを使って汎用化](https://qiita.com/ko-da-k/items/307518ad9741a6a20851)の記事を見て
出力するときもいけるんじゃね？と思ってやってみたらいけました。

そんなに出力するCSVのレイアウトが多くないのであれば汎用化する意味もそんなにないかもだけど、、
レイアウトが増えるたびに出力ロジック書くのも大変だなと思ったのでやってみました。
セマンティック バージョングについてのメモ

# セマンティック バージョング

API のバージョンの付け方に関するルールに `セマンティック バージョング` = **Semver** (Semantic Versioning) というガイドラインが存在する。

> **セマンティック バージョニング 2.0.0**  
> 
> **概要**  
>
> バージョンナンバーは、メジャー.マイナー.パッチ とし、バージョンを上げるには、  
>
> 1. APIの変更に互換性のない場合はメジャーバージョンを、
> 2. 後方互換性があり機能性を追加した場合はマイナーバージョンを、
> 3. 後方互換性を伴うバグ修正をした場合はパッチバージョンを上げます。
> 　プレリリースやビルドナンバーなどのラベルに関しては、メジャー.マイナー.パッチ の形式を拡張する形で利用することができます。  
> 
> [出典：セマンティック バージョニング](https://semver.org/lang/ja/)

適当にバージョンをふってしまう前に、こちらを参照したほうがよさそう。（戒め）
package.json に記述される チルダ ^ や キャレット ~ について

# チルダ `^` と キャレット `~`

package.json に記述されているバージョン情報の チルダ `^` や キャレット `~` は以下の意味になります。

- バージョン固定
  - ex) `3.2.1`
- チルダ `~`： マイナーバージョンまでの挙動を保証
  - ex) `~3.2.1` = `3.2.x`
- キャレット `^`： メジャーバージョンまでの挙動を保証
  - ex) `^3.2.1` = `3.x.x`
- latest： 全てのバージョンでの挙動を保証
  - ex) `*` = `x.x.x`


# npm install 時の挙動

サンプルとして `3.2.1`, `3.2.2`, `3.3.0`, `4.0.0` のバージョンがリリースされている npm パッケージ（a, b, c, d）があるとします。

そして、package.json を以下のように記述されているとします。

```json:package.json
{
  （省略）
  "dependencies": {
    "a": "3.2.1",
    "b": "~3.2.1",
    "c": "^3.2.1",
    "d": "*"
  },
  （省略）
}
```

このときに `npm install` コマンドを実行した場合、インストールされるバージョンは以下のようになります。


|記述方法|key|value|理解しやすい表記|インストールするバージョン|
|:----|:----|:----|:----|:----|
|バージョン固定|a|`3.2.1`|`3.2.1`|`3.2.1`|
|チルダ指定|b|`~3.2.1`|`3.2.x`|`3.2.2`|
|キャレット指定|c|`^3.2.1`|`3.x.x`|`3.3.0`|
|latest|d|`*`|`x.x.x`|`4.0.0`|

※ 前提として a, b, c, d のリリースされているパッケージのバージョンは `3.2.1`, `3.2.2`, `3.3.0`, `4.0.0` とした時。

# 豆知識

ちなみに npm のバージョン管理は **セマンティック バージョニング** に準拠しているはずのため、ほとんどがキャレット `^` 指定のバージョンが package.json に記述されます。

【参考】
[セマンティック バージョングについてのメモ](https://qiita.com/sugurutakahashi12345/items/68e9dfb11e84d20acc6d)
【Java】 文字列の一部を切り出すsubstringの使い方


#開始位置を指定する場合

```
String.substring(int beginIndex)
```


```java
public class Main {
 
    public static void main(String[] args) {
        String sports = "soccer,baseball,basketball";
 
        System.out.println(sports.substring(7));
    }
 
}
```

**実行結果**

```
baseball,basketball
```
#開始、終了位置を指定する場合

```
String.substring(int beginIndex, int endIndex)
```

```java
public class Main {
 
    public static void main(String[] args) {
        String sports = "soccer,baseball,basketball";
 
        System.out.println(sports.substring(7, 15));
    }
 
}
```

**実行結果**

```
baseball
```
# 参照
[Java(tm) Platform, Standard Edition 8 API仕様](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#substring-int-)
git rebaseの使い方

# git rebaseとは
Git には、ブランチを統合するための方法がmergeとrebaseの２つあります。rebaseは、作業が完了したブランチを分岐元のブランチにくっつける時に使う機能です。mergeとの違いも含めて、rebaseについて解説していきます。

# リベースを使うと何がいい？
ずばり、コミット履歴が綺麗になることです！！
より具体的には、

+ コミット履歴が一直線になってわかりやすくなる
+ 複数のコミットを一つに統合できる

などといったメリットがあります。

# リベースはコミットが一直線になる

今、branchAとbranchBという２つのブランチがあるとします。
![スクリーンショット 2020-10-18 22.17.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683215/86910093-46ee-a967-8749-5113bf4be04b.png)

#### マージの場合
まずはmergeを使って、branchBへbranchAを取り込む場合を見ておきましょう。

```zsh

git checkout branchB
git merge branchA
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683215/454c5016-b232-b310-adc3-34faa17fcaa3.png)

マージだとコミット履歴が枝分かれした後、合流するといった形になり、一直線にはなりません。

#### リベースの場合
では、branchBをbranchAにリベースしてみます。

```zsh
git checkout branchB
git rebase branchA
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683215/eeac771e-8192-b2ed-cb66-ff5d06028ce3.png)

同じ内容の別コミットC'、D'が指定したブランチの先から作られることで、一直線になります。

# リベースは複数のコミットを１つのコミットにまとめられる
今、４つのコミットABCDを持つbranchがあるとします。
これら４つのコミットはそれぞれが微修正であるため、ひとまとめにしたいです。
そんなときは、rebaseの「-i」オプションを利用するといいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683215/929b8d46-a98b-3f34-da96-fc416c882c07.png)

```zsh
git checkout branch
git rebase -i startのcommitID(or commit名)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683215/5321ebf2-c928-95db-e286-7b96a2971b85.png)
「新規コミットE」として、指定した複数のコミットをまとめられました。

# リベースの注意点
綺麗で見やすいコミット履歴を作成するのに、とっても役立つリベースですが、注意点もございます。
それは、rebaseコマンドは処理を作り直してしまうため、既存のコミットへ影響を与えてしまうことです。
安易に使用すると、誰かのコミットを勝手に作り直すことになり、チームに混乱を招くことに繋がります。
pushして誰かの目に触れた処理や、他の人の手の入っている箇所では、rebaseでなくmergeを使用するようにしましょう。
そして、誰にも影響を与えないローカルの開発内容のみ、rebaseを使用するようにするといいと思います。
CSSでラジオボタンの表示形式のカスタム

# CSSでラジオボタンの表示形式のカスタム

デフォルトのラジオボタンの表示形式を変更させる際、
`style="display: none;"`を設定したうえ、デフォルトのラジオボタンの表示形式を無効にして、
表示したい形式のCSSを指定すれば、表示形式が変えられます。
※具体的には下記の例をご参照ください。

```html
<html>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
</script>
<script>
$(document).ready(function(){
  $("#female").click(function(){
    alert($("#female").val());
  });
  $("#male").click(function(){
    alert($("#male").val());
  });
});
</script>

<style type="text/css">
<!--
. ui-radio {
padding: 6px 5px;
}

.ui-radio+label{
background:green;
padding: 7px 60px;
}


.ui-radio:checked+label{
background:yellow;
padding: 7px 60px;
}
-->
</style>
<div>
    <h1>Radioボタン</h1>
    <input type="radio" id="female" class="ui-radio" name="sex" style="display: none;" value="女性"/>
    <label for="female">女</label>              
    <input type="radio" id="male" class="ui-radio" name="sex" style="display: none;"  value="男性"/>
    <label for="male">男</label>
</div>
</html>


```

### 表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801198/80e12db8-ac93-33c7-dc4a-4e0fce0e96eb.png)