OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi OS 64bitβ版にSSDスワップ　動作確認

前々回 [Raspberry Pi OS 64bitβ版にポータブルSSD増設swap](https://qiita.com/cluster_4b/items/8820a8d53a4d23424da7) では外部USBに接続したSSDにSwapを設定しました。そして今回は、前回の[整数型で高次方程式を解く](https://qiita.com/cluster_4b/items/906efb35d83944266c52)の10000次方程式のpythonプログラムを使って、スワップ動作を確認しました。

結果は、外部USBに接続したSSDにSwapを移動した場合にも、Raspberry Pi OS 64bitベータ版に同梱のThonnyで10000次方程式のpythonプログラムが稼働すること、さらにメモリースワップ機能が正常に動作することが確認できました。以下に確認状況を示しています。

#swap起動
SwapをSSDに移動させていますから、起動時はSwapが０になっています。この状態では本体のメインメモリ８ＧＢだけの状態です。手動でSwapを起動します。次の2個のコマンドです。

```
sudo dphys-swapfile setup 
sudo dphys-swapfile swapon
```
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/8f04fe4e-e1be-5441-303a-38aaa2c3861d.png)

Swapのtotalに184.31GBが現れます。Swapのused(使用中)は、Swap起動直後なので、まだ０です。メインメモリーMemの空き(free)は7.03GBあります。その右のshared、buff/cache、availableは今回ふれません。

#メインメモリー枯渇前処理
メインメモリーMemに空きがある時は、メインメモリーMemだけで処理します。Swapは使いません。メインメモリーMemが枯渇状態になってからSwapが動き始めます。今回のテーマは、pythonプログラム稼働中、Swap動作の確認です。そこでpythonプログラム稼働前に、あらかじめメインメモリーMemを枯渇状態にする前処理をしておきます。こうしておけばpythonプログラムが稼働を始めた時、既にメインメモリーMemは枯渇していますから、Swapがすぐに動作を始めます。実際にメインメモリーMemを枯渇状態にする前処理は、760MBのBMP画像を10個openするだけです。Commandのfreeで確認したのが下図です。
![b0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/e7ff1c76-cdaa-00bf-311d-3634b8d7929c.png)
メインメモリーMemの空き(free)は135MBまで減少しています。そしてSwapのusedが937MBとなり、Swapが動作を始めていることがわかります。

#ThonnyでPythonプログラム開始
Raspberry Pi OSの64bitベータ版に同梱のThonnyで10000次方程式のpythonプログラムを開始します。pythonプログラム開始直後を、Commandのfreeで確認したのが下図です。
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/37bda562-71d1-182d-ec67-6676db2c51b2.png)
Swapのusedが1049MBとなり、Thonny起動そしてpythonプログラム稼働中も、Swapが正常動作していることが確認できます。


#計算部分終了時
10000次方程式のプログラム途中のCalculation Finishedの時です。Commandのfreeで確認したのが下図です。
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/69347353-5b10-3d5a-24e7-6862d9b80bec.png)
Swapのusedが1293MBまで増えています。


#プログラム全体終了時
10000次方程式のプログラム全体が終了した時です。Commandのfreeで確認したのが下図です。
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/167a1036-2bde-905a-e253-6a6bf946ec23.png)
Swapのusedが1921MBまで増えています。またThonny上で稼働させた10000次方程式のpythonプログラムは、解10000個をprintして正常に終了しています。

#全アプリ終了しメモリー開放
Thonnyとopenしていた760MB画像ファイル10個、全てのアプリを終了し、メモリー開放した時です。Commandのfreeで確認したのが下図です。
![e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960318/fe0e1009-3155-1a44-ce8a-5620f798e47b.png)
Swapのusedが1921MBから79MBまで急減しています。メインメモリーMemの空き(free)が7.29GBまで回復しています。

以上、SSDに移動したSwapは、Thonnyで10000次方程式のpythonプログラムを稼働させた時も、正常に動作することが確認できました。10000次方程式のpythonプログラム自体が40minutesかかりますから、100MB毎のスワップアウトのタイムラグである2～3秒は全く意識されませんでした。それよりも、メインメモリー枯渇によるプログラム停止が回避可能となったことが大きな意義でした。


最後までご覧いただきありがとうございました。


次回、「整数型で高方程式を解く＝分散並列処理＝」では、Raspberry Pi 4台のsocket通信を使った分散処理により、計算時間を短縮する試行を予定しています。
1 / fで七色にゆらぐPhilips Hueをやってみた 

電子工作なんもできんマンです。

今朝[1 / f で七色にゆらぐLED照明を電子工作する（入門レベル）](https://qiita.com/Gan0803/items/ac8c54ba75428d64f448)をみて, 「Philips Hueを使えば, 電子工作なんもできんマンでもできるのでは?」と思ってやってみました。

## 1 / fのゆらぎとは

... なんもわからん...。
なんとなくフーリエ変換したら, 強度が周波数に反比例するっぽいことだけはわかった...。
元記事でも参照されていますが, [新規鉄道模型レイアウト制作状況その2：星のゆらぎ表現](https://ktblog820.blog.fc2.com/blog-date-201403-1.html)の記事で, 詳細な説明があります。(ありがてぇ)

グラフのおかげで完全に理解した。

## 作る

(材料一覧)
![材料](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217902/b07f45b5-3853-30b1-9ac2-8613a434998b.jpeg)

Philips Hueをプログラムで制御する方法として, パッと思いつくものとしては, Pythonで使える[phue](https://github.com/studioimaginaire/phue)か, Node.jsの[cylon.js](https://cylonjs.com)があります。
今回はphueの方を使って, 手早く実装していきましょう。

Philips Hueの色空間はHSVです。
我々人類にとってRGB以外の色空間は未知の世界。まさに宇宙。しかし, pythonには標準ライブラリ[colorsys](https://docs.python.org/ja/3/library/colorsys.html)にRGBからHSVに変換する`rgb_to_hsv`があります。

退屈なことはPythonにやらせましょう。

こうして, ゆらぎについてや, HSV色空間など分からないものをすっ飛ばして, チャチャッと仕上げたものがこちら。

```python
# ipythonで実行
!pip install phue
from colorsys import rgb_to_hsv
from random import uniform, randint
from time import sleep
from phue import Bridge


IP_OF_MY_BRIDGE = "192.168.0.1"  # Philips Hue BridgeのIPアドレス
GROUP = [1,2,3,4]  # 操作したい電球のidリスト
MAX_RGB = 255
FLUCTUATION_THRESHOLD = 0.01  # 元記事でいう大きすぎたり小さすぎたりすると変化しなくなる問題の回避のための閾値 (好みで小さくしてみた)


def init_rgb():
    return [randint(0, MAX_RGB) for _ in range(3)]
 
def fluctuate(x):
    if x < 0.5:
        x = x + 2 * x * x
    else:
        x = x - 2 * (1.0 - x) * (1.0 - x)
    if x < FLUCTUATION_THRESHOLD or x > 1 - FLUCTUATION_THRESHOLD:
        x = uniform(0.1, 0.9)     
    return x

def convert_rgb_to_next_state(rgb_list):
    for idx, rgb in enumerate(rgb_list):
        rgb_list[idx] = round(fluctuate(rgb/MAX_RGB) * MAX_RGB)
    return rgb_list

def set_right(light_idx,r:int, g:int, b:int):
    hsv = rgb_to_hsv(r/MAX_RGB, g/MAX_RGB, b/MAX_RGB)
    light = lights[light_idx]
    #print(hsv)
    light.hue = round(hsv[0] * 65535)  # max hue is 65535
    light.saturation = round(hsv[1] * 255)  # max saturation = 255
    light.brightness = round(hsv[2] * 255)  # max brightness = 255
    light.transitiontime = 10  # 1 second
    
    
def main():
    bridge = Bridge(IP_OF_MY_BRIDGE)
    bridge.connect()
    lights = bridge.get_light_objects('id')
    right_rgb_states = [init_rgb() for _ in GROUP]
    while True:
        sleep(1)
        for idx, right_rgb_state in enumerate(right_rgb_states):
            set_right(GROUP[idx], *right_rgb_state)
            right_rgb_states[idx] = convert_rgb_to_next_state(right_rgb_state)        
main()
```

朝にぴったりな遊びでした。
なんも分からなくても意外となんとかなるもんですね。
Philips Hueの活用方法をもっと考えていきたいです。
また, 実装中, 「人類的にはRGBは0-255がええか」と思っていましたが, 実装後に見ると, 普通に小数でいい気がしました。
電子工作にも入門してぇ…。


## 結果(GIF)
![ezgif.com-video-to-gif-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217902/53e68939-cc07-4d20-6f16-0f67b7d9899a.gif)
なぜだ！？actionsの引数で、どうしてもundefiendになってしまった時の話

皆さんこんにちは！

今回は、エラー備忘録として書いていきます。

同じエラーに苦しんでいる方の参考になればなと思います。

まず、初めに以下の二つのコードを見ていただきたいと思います。

```sotre/index.js
changeUserPhotoURL({ commit }, {updatePhotoURL}) {
      commit('changeUserPhotoURL', updatePhotoURL)
    },
```

```sotre/index.js
changeUserPhotoURL({ commit }, updatePhotoURL) {
      commit('changeUserPhotoURL', updatePhotoURL)
    },
```

実行結果は

``{updatePhotoURL}``は``undefiend``
``updatePhotoURL``にはしっかりと値は受け取れてます。

なぜ、このような結果になるのかは分かりません。。。

分かる方がいたら、ぜひコメント欄にて教えて頂くと幸いです。
【HTTP】ステートレスとかステートフルとかのお話

## ステートレスとは
``ステートレス = 「状態を保持しない」``
HTTPでは、HTTPリクエスト・HTTPレスポンスのこの１往復のやりとりで一つの処理として完結する。
よって複数の処理に関連を持たせることができない。

## では、ステートフルとは
``ステートフル = 「状態を保持する]``
要するに、状態を保持して次の処理でも前の処理で行われた内容を反映させることをいう。

### ステートフルのデメリット
ステートフルにはデメリットがある。例えば、複数のクライアントが同時にWEBサーバーへリクエストを行った場合に、WEBサーバーはその内容を保持する必要がある。すると、WEBサーバー１つに対して、複数クライアントの情報を保持する必要があるため、応答に多くの時間を必要としてしまう。
【HTTP】HTTPレスポンスに含まれるステータスコード

## ステータスコードとは
WEBブラウザからHTMLファイルや画像などのデータをWEBサーバーに要求した際に、WEBサーバーはHTTPレスポンスとして応答する。HTTPレスポンスには、その要求(HTTPリクエスト)に対する処理の結果が含まれている。これが、ステータスコード。このステータスコードは、100番から、500番台の３桁の数字となっている。私たちが普段WEBサイトを正常に閲覧できている時は、``200番``のステータスコードがHTTPレスポンスとして返ってきている。

## HTTPレスポンスに含まれる代表的なレスポンスコード

|  ステータスコード  |  内容  |
| ---- | ---- |
|  100 continue  |  リクエスト継続中  |
|  200 OK |  リクエストが正常に受理された  |
|  301 Moved Paramanetly  |  リクエストされたコンテンツが移動した  | 
|  302 Found  |  リクエストされたコンテンツが一時的に移動  | 
|  304 Not Modified  |  リクエストされたコンテンツが未更新であること。WEBブラウザに一時保存されたコンテンツが表示  |
|  400 Bad Request  |  リクエストが不正  | 
|  404  Not Found  |  リクエストされたコンテンツが未検出  |
|  500 Internal Server Error  |  リクエスト処理中にサーバー内部でエラーが発生したこと  |
|  503 Service Unavailable  |  アクセス集中やメンテナンスなどの理由で一時的に処理不可  |
【Mono Depth】DF-Net : Optical FlowでUnspervise Trainingの精度をあげる

<h1>DF-Net: Unsupervised Joint Learning of Depth and Flow using Cross-Task Consistency</h1>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5ab4fe66-8894-9474-a18e-faa00346348b.png)

Mono DepthをUnsupervisedでTrainigしたい人向けの論文だった
Ground Truthを使ってTrainingするよ〜って人はこの論文は意味ないかも


<h1>新規性</h1>
紫でカコった所がNew Update

1. Flow NetでForward-Backward FlowとForward-Backward　Maskを推定する。
2. Ground TruthのOptical FlowとFoward-Backward Maskのかわりにlossを計算する事が出来る。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/04df4cf9-5240-d752-bc23-690aafe64443.png)
forward-backwardとcross-task lossを使うと精度が高くなってる。


<h1>結論</h1>
・Ground Truthが無い場合のシステムにはOptical Flowを推定するのは効果的。

<h1>参考文献</h1>
DF-Net: Unsupervised Joint Learning of Depth and Flow using Cross-Task Consistency
https://arxiv.org/pdf/1809.01649.pdf
【自己学習用】はじめてのGo1

#参考元

[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)
[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
qiitaに書くのは初めてなのでMarkdown記法もついでに学習。
[はじめてのGo](https://gihyo.jp/dev/feature/01/go_4beginners/0001)

#Go言語の特徴
- 2009年にGoogleにより発表されたオープンソースのプログラミング言語
- シンプルな言語仕様であるため学習が比較的容易
- 豊富な標準パッケージが同梱されている
- 巨大なコードでも高速にコンパイルできる
- Windows，OS X，Linuxなどの環境に合わせた実行ファイルを生成するクロスコンパイルのしくみがある
- 並行処理のサポートも充実しており，ミドルウェアの開発などにも適している

#言語仕様について
- 他の言語が持つような機能の多くを削り、言語をシンプルに保っている
- 繰り返し構文はfor文しかなく，while文やdo/while文などはサポートされていない
- ifの波括弧は省略できず，三項演算子もない:thumbsup:
- ポインタなし
- 暗黙の型変換なし
- 宣言されたものの使われていない変数があるとコンパイルが通らない
- 例外（try/catch構文）がない。発生した異常を戻り値として呼び出し側に返す方針

#インストール
はじめてのGoに従って進めていきます。
[インストーラ](https://golang.org/doc/install)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546752/6a7d2450-3603-dcf9-fb3f-8f087afc4c14.png)
msiファイルをダウンロード→実行。
全部デフォルトでOK。
![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546752/b5b812c7-c398-ab56-4082-8be5d6830c8a.jpeg)

コマンドでver確認。

```
$ go version
go version go1.15.6 windows/amd64
```

#hello world
hello.goを作成。
環境はとりあえずVSCODE。

```
package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}
```

作成したフォルダにcdして実行。

```
$ go run hello.go
hello world
```

helloされた。

#コンパイル
`go build`でコンパイル。
exeファイルができる。

```
$ go build hello.go
```

#フォーマット
`go fmt`でフォーマット。
Goでは，標準のコーディング規約があるのでそれに従ってフォーマットされる。
半角スペース派とタブ派の永遠の争いはgoでは起きない。

```
$ go fnt hello.go
```

#Goのプロジェクト構成とパッケージ
共通のファイルを使用するためにはGOPATH以下にファイルがないと認識されない。

> まず，myprojectディレクトリを起点に，次のようにbin，pkg，srcという3つのディレクトリを作成します。
> 次に，myprojectディレクトリのパスをGOPATHという環境変数に指定します。

とあるがインストール時に環境変数がユーザ\go以下に設定されているので
それをそのまま使うことにする。環境変数変更するのはなんかやだし。

#gosampleパッケージ
ユーザ\go\src\gosample\gosample.goを作成する。

```
package gosample

var Message string = "hello world"
```

#mainパッケージ
任意の場所（自分はgithub管理フォルダ）/myproject\src\main/main.goを作成する。

```
package main

import (
	"fmt"
	"gosample"
)

func main() {
	fmt.Println(gosample.Message) // hello world
}

```

#ビルドと実行

```
$ cd myproject\src\main
$ go run main.go
```

`go install`コマンドを用いると，生成されたファイルが$GOPATH/binに自動的に格納される。

```
$ cd ユーザ\go\src\main
$ go install
```

ここまでの成果物は以下にUP。
https://github.com/yusuke-nomura-cosmoroot/GoStudy
OracleBronze　勉強記事14

#はじめに
最初の記事のはじめにを参照
https://qiita.com/miyanoShiho/items/ef6dd74478ee2c6a4fea
#今日間違えた問題の復習
##INSERT VALUES
・副問い合わせOK
　→ただし１行結果のみ
##OUTER JOIN
・LEFT OUTER JOIN
 →左側の表の情報が結合条件関係なくすべて表示される
・RIGHT OUTER JOIN
 →右側の表の情報が結合条件関係なくすべて表示される
・FULL OUTER JOIN
 →左右両方の表の情報が結合条件関係なくすべて表示される
##1つのSQLで重複する名前およびIDを取得する考え方
・自己結合　または　副問い合わせ
##副問い合わせ
・複数列問い合わせ可
・1件も戻らない場合、エラーではなく0件が戻る。
##>ANY()
・いずれかの1つよりも大きければ TRUE
　= リスト内の最小値よりも大きい
##ROLLBACK TO
・戻って、トランザクションは継続する
OracleBronze　勉強記事13

#はじめに
最初の記事のはじめにを参照
https://qiita.com/miyanoShiho/items/ef6dd74478ee2c6a4fea
#今日間違えた問題の復習
##カンマ、小数点
・G→カンマ
・D→小数点
・(G,D)と(カンマと小数点)は両方使うとエラーになる。
##DECODE
・DECODE内で、比較は使えない
##NVL2の仕様
・NVL2(式1,式2、式3)
　→式2と式３はデータ型を一致させる必要がある
##count仕様
・countはnull無視
・グループ関数+CASE式は使用できる
・WHENは複数可
##自然結合
・結合列の表別名NG
##結合
・JOIN条件は決める必要がある
OracleBronze　勉強記事12

#はじめに
最初の記事のはじめにを参照
https://qiita.com/miyanoShiho/items/ef6dd74478ee2c6a4fea
#今日間違えた問題の復習
##TO_CHAR()
・fm(埋め込みモード解除) 空白や0を消す
　→07 → 7
##ネストした関数の考え方
・SYSDATE 現在
 →LAST_DAY　最終日
  →NEXT_DAY　次の土曜日（今回は引数が土曜指定だったので）
   →NEXT_DAY　次の土曜日（今回は引数が土曜指定だったので） = 第二土曜日

##COLALESCE(リスト)
・リスト内のNULL以外のものを返していく
##NVL2()
・NVL2(式1,式2、式3)
 式1 NULL以外　 式2
 式1 NULL　　　 式3
LISPでGPGPU(1)

#Lisp復活計画
イースター計画というのを個人的に立ち上げています。自作、ISLispの処理系EISLにGPGPUの機能を追加、Deep-learningが使えるようにするという計画です。

#とりあえず動いたよ。
cublasと簡単なカーネルが動きました。行列積と行列和です。


行列積でベンチをとってみました。３０００×３０００の積です。

```
Easy-ISLisp Ver1.70

> (defglobal a (create-array '(3000 3000) 0.1 t))
A
> (time (gpu-mult a a))
Elapsed Time(second)=0.080779
<undef>
> (time (gpu-mult a a))
Elapsed Time(second)=0.058530
<undef>
> 


```

まずまずの成績を出せました。

まだ行指向のCUDAに合わせてないので計算結果はあっていません。


#2021年前半
以前作成してElixir用のGPGPUライブラリをすっかりEISLに移植、お手軽に高速なGPGPUをLISPで実現させます。

https://github.com/sasagawa888/eisl
正確な時間測定(Java)

## 方法

以前まではcurrentTimeMills()メソッドを使って、時間計測を行っていた。
しかし、非常に短い時間で行われる処理の計測をする場合、ミリ秒単位でしか測れないのでは
正確な時間測定ができない。
そのため、ナノ秒単位で時間測定を行えるnanoTime()メソッドで時間測定を行う。

```java
long start = System.nanoTime();
// 計測したい処理を記述
long end = System.nanoTime();

long timeSeconds = TimeUnit.NANOSECONDS.toSeconds((end - start));
```

## currentTimeMillis()との比較

|  |  currentTimeMillis  |  nanoTime  |
| ---- | ---- | ---- |
| 特徴 |  1970年1月1日午前0時0分0秒からの経過秒数をミリ秒で表したもの | 時間測定だけに特化したメソッド。|
| メリット | スレッドセーフである。(複数のスレッドから呼び出されても安全なメソッドであること。) | ナノ秒単位で測れるので、currentTimeMillisよりも正確な時間測定が可能 |
| デメリット | 過去のある時点からの時間計測をする際に、うるう秒を含んでないため、測定結果がずれる可能性がある | スレッドセーフではない。|
圧縮ファイルだと時刻が消滅する問題

#はじめに
フォレンジッカー以外にはあまり意識されないと思いますが、タイムスタンプというのは非常に重要です。
ファイルシステムによって保持されるタイムスタンプは異なりますが、ファイルの作成日時、ファイルの最終更新日時といった情報がファイルごとに保持されています。
本記事では、あるファイルをZIPで圧縮した場合、最終更新日時しか保持されないという問題を取り上げます。
（実際には問題ではなくZIPの仕様ですが、フォレンジック調査においては割と問題になるので、ここでは問題と記載しています）

#検証
まずは実際に検証してみましょう。以下のようにLinux上でファイルを作成します。
Linuxの場合は、ファイルシステムはext3かext4、XFSあたりがほとんどだと思います。
以下はext4での例です。

```
$ echo test > test.txt
$ stat test.txt 
  File: test.txt
  Size: 5               Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1966092     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    kali)   Gid: ( 1000/    kali)
Access: 2020-06-17 22:54:33.330254678 +0900
Modify: 2020-06-17 22:54:33.330254678 +0900
Change: 2020-06-17 22:54:33.330254678 +0900
```

ファイルを作成した段階では、ext4が保持する3つのタイムスタンプはすべて同じです。
ではこのtest.txtをzip圧縮してから別の場所に解凍してみます。

```
 $ stat test/test.txt 
  File: test/test.txt
  Size: 3               Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1976419     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    kali)   Gid: ( 1000/    kali)
Access: 2020-06-17 22:54:33.000000000 +0900
Modify: 2020-06-17 22:54:33.000000000 +0900
Change: 2020-06-17 22:57:16.396726759 +0900
 Birth: -
```

Changeが元のタイムスタンプから変わっているのがわかります。
実はAccessとModifyも小数点以下の値が変わっています。厳密には3つのタイムスタンプすべてが変わっていることになります。

#ケーススタディ
実際の調査を行う際には、元のファイルがなく、圧縮されたファイルしかないというケースが想定されます。
この例では、mtimeは保持されますが、ctimeが保持されません。mtimeはファイルを変更すると変わってしまうため、作成された日時が特定できなくなります。

例えばLinux上でWebサーバが運用されており、何らかの方法で侵害され、WebShellが置かれてしまった場合を想定してみましょう。
このインシデントに気づいた管理者は、WebShellをzipで圧縮後、削除してしまったとします。圧縮ファイルの中にあるWebShellは、最終更新日時しかわかりません。
ただし、WebShellが変更されることは通常考えにくいことから、このケースでは最終更新日時は作成日時であると考えても良いでしょう。これが通常編集されるファイルの場合は、作成日時が消滅してしまうことになります。

#原因
この現象は、Zipファイルの仕様上、圧縮されたファイルは最終更新日時しか保持しないために起こります。

#対策
消滅してしまった情報はどうしようもありませんが、他のアーティファクトから作成日時を特定できる可能性はあります。（Linuxの場合は難しいかもしれません）

また、マルウェアを発見した場合、すぐに隔離したくなりますが、その場合はファイルの圧縮は避け、できればすぐにディスクイメージを作成する、それが難しい場合は、例えばlsコマンドの-cオプションでctimeを取得すると良いと思います。Windowsの場合はdir /TCで作成日時とファイル名をリスト表示できます。
[AWS][S3] S3 から pprefix 付きでファイルをコピーする

CloudFront のログから特定の日時のものだけコピーしようとしても `aws s3 sync` だとディレクトリ単位でしかコピーできない。
そんな時は、以下の感じで

```
#! /bin/bash
S3_BUCKET_NAME='__S3_BUCKET_NAME__'
CF_DIST_ID='__CLOUDFRONT_DISTRIBUTION_ID_HERE__'

BASEURL="s3://${S3_BUCKET_NAME}/CloudFrontLogs/"
FILTER="${CF_DIST_ID}.2021-01-01

for F in $(aws s3 ls $BASEURL/$FILTER | awk '{print $4}'); do
  echo $F
  aws s3 cp $BASEURL/$F .
done
```
高位合成言語アセンブラを作る。 その18

# 概要

高位合成言語アセンブラを作る。
７セグメントLEDのデコーダを書いてみる。

# コードを投入。

```
lut 12
lin 4
lout 8
code 0 7E
code 1 30
code 2 6d
code 3 79
code 4 33
code 5 5b
code 6 5f
code 7 72
code 8 7f
code 9 7b
```

# 生成したコード


```
module lut(input wire [3:0] data, output reg [7:0] code);
	always @(data)
	begin
		case(data)
		4'h0:
			code = 8'h7E;
		4'h1:
			code = 8'h30;
		4'h2:
			code = 8'h6d;
		4'h3:
			code = 8'h79;
		4'h4:
			code = 8'h33;
		4'h5:
			code = 8'h5b;
		4'h6:
			code = 8'h5f;
		4'h7:
			code = 8'h72;
		4'h8:
			code = 8'h7f;
		4'h9:
			code = 8'h7b;
		endcase
	end
endmodule

module testbench;
	reg [3:0] data;
	wire [7:0] code;
	lut u(.data(data), .code(code));
	initial
	begin
		$display("data code");
		$monitor("%h  %b", data, code);
		data = 4'h0; #10;
		data = 4'h1; #10;
		data = 4'h2; #10;
		data = 4'h3; #10;
		data = 4'h4; #10;
		data = 4'h5; #10;
		data = 4'h6; #10;
		data = 4'h7; #10;
		data = 4'h8; #10;
		data = 4'h9; #10;
		$finish;
	end
endmodule

```

# 実行結果


```

data code
0  01111110
1  00110000
2  01101101
3  01111001
4  00110011
5  01011011
6  01011111
7  01110010
8  01111111
9  01111011


```

# 成果物

https://embed.plnkr.co/plunk/drWC7s9Nbtiloxqg


以上。
会計システム

#会計システムの位置付け

基幹システムの中心

販売管理システム:顧客から受注を登録して、出荷、納品、売上計上を行うシステム

購買管理システム:仕入れ先への発注を登録して、原材料や商品を検修して仕入計上するシステム

#会計システムの機能
債権管理システム:得意先に対する売掛金の請求、入金による消込

債務管理システム:仕入先からの買掛金。支払い。請求書の受領。

固定資産管理システム

経費管理システム

資金管理システム:現金を管理するシステム。売掛金の入金予定や、買掛金、人件費、借入金の返済予定などを記録し、資金が不足しないように資金の出入りを管理する。

原価管理システム

総勘定元帳システム

####紙の保存
・証憑:請求書、領収書
・帳票:仕訳帳、総勘定元帳

証憑
①仕訳の登録
②回覧
③承認処理
④保管(ファイリング)

電子媒体でも良くなった
①スキャン
②仕訳の登録、電子商標の添付
③承認依頼の通知
④承認処理

帳票
日頃会計システムに個別取引を登録してれば問題ない(遡れればOK)
(まとめて仕訳登録している場合はNG)

#会計システムについて

###キャッシュフロー計算書
キャッシュフロー計算書は新しい様式(2000)のため、複式簿記の仕組みから作成することは想定されていない。
→会計システムに機能を追加する必要がある。

####直接法と間接法
直接複式簿記に記入し計算する。

(例)営業活動によるキャッシュフロー、商品の販売による収入

売上高70,000,000円
期首売掛金残高　3,000,000円
期末売掛金残高  5,000,000円

70,000,000 +3,000,000 - 5,000,000 =68,000,000

というような計算となるので、仕訳計上時に増減理由コードを記入することで、期末にキャッシュフローが作られる。


間接法
主流は間接法。直接法が現金主義なのに対し、間接法は発生主義。

営業活動によるキャッシュフローの場合、

当期純利益 = 当期売上高 - 当期仕入高
売掛金増減額　= 期首売掛金残高 -期末売掛金残高
買掛金増減額　= 期首買掛金残高-期末買掛金残高

を計算し、求める。

#他システムとの連携

##販売管理システム
受注、出荷、売上計上

####出荷トランザクション
出荷により、在庫が減少し、売上原価という費用が発生。

在庫管理システムの出庫トランザクションにも連携

####売上計上トランザクション
在庫の出荷により売上が発生し、売上に対応する売掛金という資産が増加。

債権管理システムの計上トランザクションにも連携
(売掛金)

その他　返品　割り戻し

##購買管理システム

仕入れ先への発注を登録。原材料や商品を検収。仕入計上。

####仕入トランザクション
入庫により在庫という資産が増加し、買掛金という債務が増加する。

在庫システムの入庫トランザクションとも連携。

##在庫管理システム
購買品の受入れ、原材料の製造工程への払い出し、倉庫間の在庫移動、完成した製品の入庫など。

→在庫の入庫処理と出庫処理に区別

入庫
購買品の受入れ、完成品の入庫、倉庫間移動による在庫の受入れ

出庫
製造工程への原材料の払出し、倉庫間移動による在庫の払出、返品による出庫、在庫棚卸しに基づく減耗品の出庫、廃棄による在庫の出庫

####原材料払出しトランザクション
原材料の出庫により、原材料という資産が減少し、仕掛品増加

生産管理システムの原材料投入トランザクションと連携

##債権管理システム
売掛金、未収金などの債券の情報を管理し、入金消込を支援する

####入金消込トランザクション
入金により現預金という資産が増加し、入金消込により債権という資産が減少する
Redmineでチケット担当者のデフォルト設定

#管理ページでの一括設定ではなく、プロジェクトごとの設定だよ

プロジェクトの **設定** ⇒ **チケットトラッキング** ⇒ **デフォルトの担当者** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6f8ece85-bc95-2490-6c91-961297218962.png)

#担当者を設定せずにチケット作った時のデフォルトだよ

デフォルトの担当者を設定しても、チケットの作成画面は下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/735fa25b-0a3f-fd49-374c-8b7626f71627.png)

**担当者を未選択でチケットを作った時** にデフォルトの担当者の設定が反映されます。
**作成画面で誰がデフォルトで選択されるか** ではないです。

#<<自分>>設定の勘違い

例えば下記のように設定して保存すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/10595747-f150-9d80-904c-4e06334bef2a.png)
デフォルトの担当者は **ログインしているユーザー** の固定値になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/baaf157a-57b7-8fe3-003d-d78ffba8b1db.png)

最初↓こんな勘違いしてました。

* <<自分>> っていう特殊設定がある。
* デフォルトの担当者を <<自分>> に設定しておけば、**デフォルトの担当者は動的にログインユーザーになる** 。

Aさんがチケット作成したらデフォルトの担当者はAさん、Bさんがチケット作成したらデフォルトの担当者はBさん、みたいにできるのかな…なんて。
そうじゃないです。


#蛇足

複数人で使う時はとにかくデフォルト担当者を設定しておいて **担当者が決まってなくて放置状態** を防いだ方がいいかなって思います。
誰のチケット一覧にも出てこなくて **見逃す** ってのも怖い。

一つ一つのプロジェクトの設定画面を開かないといけないから、変更するプロジェクトの数多いとちょっと面倒。
データベースのどっかのカラムを一括更新するSQL流せばいけそうな気はする…。

#バージョン
CentOS Linux release 8.3.2011
Redmine 4.0.6.stable
素人の失敗ssh通信中のvimコマンドでのペースト

#今回私がハメられた事

- ssh通信したら、タブ補完が効かなくなる
- 確認したら`/`の使用率が100%
- どこかわからないが思い当たる原因は1つ
- ssh通信中に、viコマンドでペースト中にペースト内容が重すぎて通信断
- そのviコマンドのキャッシュが原因

# 今回起きたエラー
タブ補完が効かずに、以下エラー
`bash: cannot create temp file for here-document: No space left on device`

# 原因
エラー内容から、メモリ不足とわかった。

```bash:使用したコマンド
// ディスクの使用状況確認
#df
// メモリ確認
#free
```

`/`の使用率が100%となっていた。
思い当たる事が、前回セッション時の途中切断となったvim操作
###VIMのバッファがディスクを圧迫している！！

# 解決策
`~/.vimrc`内で設定していなければ、バッファを操作中のフォルダ内に作成される。(デフォルト設定)
作成されているバッファを削除し、ディスク容量を確認。

削除コマンド `#rm ファイル名`

解決！！

# 終わり
阿呆すぎて、悲しい！
が、vimだと気付くまでに、時間がかかった。
泣きたい・・・ぐぬ。
Spacemacsの漢字だけ中国語フォントになる問題

2021年1月15日16時更新
原因がある程度わかったため修正しました

# 概要
## 症状

* MacOSにて発生する
* (自分で確認した限り)Spacemacsでしか起きない
* Noto系フォント以外では日本語フォントであっても漢字が中国語フォントになる

## 対処法

* unicode-fontsレイヤーを追加しない

かつ1.、2.1、2.2のいずれか
2.は自己責任でお願いします

1. /usr/local/Cellar/emacs-plus@xx/xx.xx.xx/Emacs.app/Contents/MacOS/Emacsで起動する(ターミナルから起動する場合も同様。ターミナルのemacsコマンドは/usr/local/bin/emacs -> /usr/local/Cellar/emacs-plus@xx/xx.xx.xx/bin/emacsで中身は1.のパスのエイリアスであるため)
1. Emacs.app/Contents/Resources/English.lproj/の削除
    2. Emacs.app/Contents/Info.plistの削除
    3. Info.plist内の"Localization native development region"項目を"Japan"にするか削除



# はじめに
日本語のファイルを書こうとした時、最近文字の出力がおかしいことに気づきました。その間にOSのアップデート、パッケージの更新など色々行ったのでどの時点で変わったかは不明です。

## 環境(問題発見当時)
Mac OS Mojave 10.14.6
emacs(emacs-plus) 26.3~28.0
spacemacs 0.300.0

# 調査

## 経緯

原因と解決方法の調査中にDockから起動すると確定で発生することが判明しました。試行錯誤の結果Emacs.app/Contents/Info.plistとEmacs.app/Contents/Resources/English.lproj/を削除すると治ることが判明しました。この中で、Info.plistに設定されている"Localization native development region"項目を削除すると治ることが判明しました。

また別個の問題としてunicode-fontsレイヤーを追加すると同様の症状が発現しました。

## 推測

恐らくロケールがEnglishのままだと他言語が正しく出力されないことが伺えます。またlprojが言語ファイルであることからEnglish.lprojの問題によって発生し、これを削除することで修正できると考えられます。(しかし名前とかバージョンとかの情報しか入ってないのでなぜ発生するかがわかりません...)
/usr/local/Cellar/emacs-plus@xx/xx.xx.xx/Emacs.app/Contents/MacOS/Emacsで起動すると治るのはロケールの設定をしないからだと考えられます。

unicode-fontsレイヤーの方は恐らく中国語フォントとの競合によって起こる問題だと推測できますが確証はありません。
JavaScriptの__proto__とは一体なんなのか？

私はJavaScriptを使用している時に、理解せずにずっと放置していた。
`__proto__`と言う謎の物体。これを理解せずに放置している人は多いと思う。
今回はそれを[この記事](https://medium.com/javascript-in-plain-english/what-is-proto-b15f16e10b72)をきっかけに理解を試みた。

#`__proto__`とは一体なんなのか？
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/5b835cc9-6007-e555-acfd-28d9e589c380.png" />

空のオブジェクトを作成したはずなのに、`__proto__`が出てくる。

##`Objects.prototype`だった
JavaScriptでは<b>作成された全てのオブジェクトの`__proto__`に対して、</b>
<b><font color="OrangeRed">自動的に`Objects.prototype`プロパティが付属</font></b>している。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/ea21b345-3032-1bba-15e8-43a4ad873763.png" />

`Objects.prototype`をみてみると。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/d86df4ac-cb75-13c1-919b-9414bfd49b72.png" />

<b><font color="OrangeRed">`__proto__`と`Objects.prototype`が全く同じプロパティを持っている</font></b>ことがわかる。
これは`x`が`Objects.prototype`から同じ<b><font color="OrangeRed">`__proto__`を継承</font></b>していると言うことである！

##新しい機能を割り当てることも可能
`Object.prototype`を変更することで、<b><font color="OrangeRed">その後に作成される全てのオブジェクトにも変更が含まれる</font></b>。
新しい関数を与えてみると。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563930/1d1ae384-31d5-77b9-b988-48b5c6ee0b6c.png" />

このように<b>新しい機能を割り当てると、その後のオブジェクトではその機能を持つ</b>ことが可能となる。

##オブジェクトだけじゃない`__proto__`
オブジェクトだけが`__proto__`を持っているわけではなく、<b>他にも存在する</b>！

<ul>
<li>Array.prototype</li>
<li>Number.prototype</li>
<li> String.prototype</li>
<li> Boolean.prototype</li>
</ul>


##最後に
この`__proto__`の機能を使うことは<b><font color="OrangeRed">非推奨</font></b>なので、使う際には十分注意をしていただきたい。

[developer.mozilla](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto)
[参考](https://medium.com/javascript-in-plain-english/what-is-proto-b15f16e10b72)
IPython, Jupyter-lab で C native module を autoreload するメモ

## 背景

ipython, jupyterlab での autoreload 便利ですよね.

ipython を起動しながら自作モジュールを修正した場合
https://qiita.com/Accent/items/f6bb4d4b7adf268662f4

でも, native module(C module)では使えません 

https://ipython.org/ipython-doc/3/config/extensions/autoreload.html

> C extension modules cannot be reloaded, and so cannot be autoreloaded.

:cry: :cry: :cry: :cry: :cry:

処理のかかる部分を高速化したい時や Vulkan みたいな API 叩きたいときにはどうしても native module が必要です.

そしてその開発を rapid にするために, ipython, jupyterlab でも native module の自動リロード(autoreload)したいです!

あとは, データロードとかに時間かかったりするようなものだと, 再度プロセス起動だと時間かかってしまうので, 計算ロジックだけリロードしたいという需要もあります.

## 方法

Posix 環境(e.g. Linux, macOS)を想定します. Linux, macOS で動作確認しました.

Python 側から呼ぶ native 関数は, 基本それ自体で処理は完結(state 状態などを持たない)とします.

とりあえずはいくらか wrap スクリプトを書いて, 

* 関数が呼ばれるごとに dlopen して dll をロード
* dll 内の関数を呼び出す
* `dlclose` で dll のインスタンスを手動で close する

の方法で対処します. Windows の場合も対応する Win32 API を使うようにすれば対応できるでしょう.



https://stackoverflow.com/questions/21770419/free-the-opened-ctypes-library-in-python

最近の python? ですと, native c module? の `_ctypes`(`_` prefix がついている)に `dlclose` があるので, それを使います.
(macOS だといつの間にやら `/usr/lib/libc.dylib` などはなくなっているため, `libc` をロードして `dlclose` を呼ぶというのができない)

簡単な native module を作ります.

```c
// mymod.c
double add(double a, double b)
{
  return a + b;
}
```

```
$ clang -shared -fPIC -o mymod.so mymod.c
```

対応する python module です.

```py
# pymod.py
from ctypes import *
import _ctypes

def myadd(a, b):
    dll = cdll.LoadLibrary("./mymod.so")
    print(dll._handle)

    dll.add.argtypes = [c_double, c_double]
    dll.add.restype = c_double

    ret = dll.add(a, b)

    _ctypes.dlclose(dll._handle)

    return ret


# test
if __name__ == '__main__':
    ret = myadd(4.2, 5.3)
    print(ret)
```

ipython で動かしてみます.

```python
$ ipython 
Python 3.9.1 | packaged by conda-forge | (default, Dec  9 2020, 01:07:47) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import pymod

In [2]: pymod.myadd(4.2, 5.3)
4630007152
Out[2]: 9.5
```

ここで, mymod.c を変え, `mymod.so` を作り直してみます.

```c
double add(double a, double b)
{
  return 2.0 * a + b;
}
```

ipython で続けます.

```python
In [3]: pymod.myadd(4.2, 5.3)
5184901120
Out[3]: 13.7
```

Voila! :tada:

いけました!



## その他の方法

RPC や HTTP 通信(e.g. JSON-RPC, WebSocket)とかにして, python と native module でプロセス分離してプロセス間通信するという手もあります. ただコード量が増えてめんどいですよね.
(特に C++ などの native 側)

## pybind11 module(numpy array を受け渡し) の場合

https://github.com/pybind/pybind11/issues/2511

現状ぱぱっとできる方法はありません.

numpy のデータ構造(Python buffer protocol)を C/C++ world で自前でデコード/エンコードするなりが考えられますが, 面倒です.

python interface の API は固定して, pybind11 側(C++ 側)で C++ world で dlopen/dlclose するか, やはりリロードしたい部分は RPC なりで別プロセス化が楽でしょうか.


## TODO

* [ ] inotify あたりでファイルをウォッチする仕組みと組み合わせて, dll が更新された時のみ dll リロードを行うようにする
管理画面生成gem Administrate の紹介と導入

Railsで管理画面を作るとき、どうしてますでしょうか。
ちゃんと作りたいなら自作のがよいと思いますが、個人開発など、そこまで工数割けないよ！という時のために、
管理画面生成gem Administrate を紹介したいと思います。

# Administrate とは
管理画面を自動生成するRailsライブラリ。
技術者以外のユーザーに、アプリケーション内の任意のレコードの作成、編集、検索、削除をできるクリーンなインターフェースを提供します。（[公式より](https://administrate-prototype.herokuapp.com/)）

文面を見ても分からないと思うので、[公式のデモ](https://administrate-prototype.herokuapp.com/admin)を触るのが早いです。

公式サイト(英語): https://administrate-prototype.herokuapp.com/
公式デモ: https://administrate-prototype.herokuapp.com/admin
公式Github (thoughtbot/administrate): https://github.com/thoughtbot/administrate


### ※注意
version 1.0 以前なので、APIに大きな変更が加えられる可能性があります。
updateする前に[リリースノート](https://github.com/thoughtbot/administrate/releases)を確認した方がよさそうです。
> Administrate is still pre-1.0, and there may be occasional breaking changes to the API.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275134/e5da4a30-10b3-3606-7538-326a3c44ccbb.png)

# 導入
Gemfileに追記

```
# Gemfile
gem "administrate"
```

bundle install 後、インストラーを実行する

```
# デフォルト設定での install (デフォルトのnamespace: admin)
$ rails generate administrate:install

# 任意のnamespaceを使いたいとき (namespace: supervisor)
$ rails generate administrate:install --namespace=supervisor
```

`config/routes.rb` に `/admin`のルートが追加され、`app/controllers/admin/application_controller.rb`が生成されます。
また、ActiveRecordリソースごとに Dashboard と Controller が生成されます。

- app/controllers/admin/foos_controller.rb
- app/dashboards/foo_dashboard.rb

### ※namespaceを指定した際は、ルートもディレクトリ名も変わります

```
# --namespace=supervisor の場合
http://localhost:3000/supervisor
app/controllers/supervisor/application_controller.rb
```

# 終わりに
これで導入が完了し、一通りの機能（作成、編集、検索、削除）が使えるようになりました。
Administrateは、使いやすいように色々とカスタマイズ出来るので、次回いくつか紹介したいと思います。
コマンドプロンプトで複数プロセスの同一ファイル出力


コマンドプロンプトで複数プロセスから同じログファイルにまとめて出力って意外と大変そう。。。
ちょっと考えたら考慮することが多い。。。

- 単純にリダイレクトだと長い処理にファイルロックされてミスりそう

- 処理事にファイル出力してログファイルに結合、結合ミスったらリトライしたい

- リトライで永久ループではまったときのために pid で kill したい、自身の pid 取得がやっかい

----

処理の流れとしては以下の感じで対応、たぶん大丈夫そう！

```
@echo off
set LOGFILE=C:\logs\cmd.log
set LOGSUBFILE=C:\logs\cmd_subxxx.log
set PIDFILE=C:\logs\pid.log

rem pid出力(powershell 実行して親プロセス取得で cmd のpid取得)
rem # taskkill /pid %pid% で強制終了できるように念のため...
powershell "Get-WmiObject win32_process -filter processid=$pid | ForEach-Object{$_.parentprocessid;}" > %PIDFILE%

rem 処理事のログファイル
echo 実際の処理(コマンド読んだり、ps実行したり) > %LOGSUBFILE%

:RETRYCOPY
    rem ログファイルに結合(失敗したらリトライ)
    copy /b %LOGFILE% + %LOGSUBFILE% %LOGFILE%
    if not "%ERRORLEVEL%" == "0" (timeout 1 & goto RETRYCOPY)

rem pid, sub ファイルは削除
del %PIDFILE%
del %LOGSUBFILE%

exit 0

```
Vuexでオブジェクトのプロパティの値の変更を検知したいときの対処法！！

今日は、Vuexについての記事を書いていこうかなと思います。

Vuexでオブジェクトのプロパティの値を変更しても、値の変更は検知されません。（これで３,４時間くらい時間食われた）

これは、Vue本来の仕様にになっておりどうしようもすることはできません。

では、どうやってプロパティの変更を検知してくれるのでしょうか？

結論から言うと、**オブジェクト自体を書き換える**という動作をします。

めんどくさいですよね。

でも大丈夫！

同じようなことで頭を抱える人に、とっておき解決策をご用意しております。

ぜひ皆さんのお力になれればなと思います！！

それでは、順を追って説明していきます。

#オブジェクトのコピーを作成#

今回は、``user``というオブジェクトを例に挙げて説明していきます。

```store/index.js

state: {
    user: {}, // user情報
  },

changeUserPhotoURL(state, payload) {
      let user = Vue.util.extend({}, state.user)
    },
```

``Vue.util.extend``でコピーを作成し、第一引数には肩を定義します。第二引数には、コピーする対象を選択します。

#プロパティの値を変更し、元のオブジェクトに代入#

今回は、ユーザーのプロフィール画像（photoURL）を変更します。

```store/index.js

state: {
    user: [], // user情報
  },

changeUserPhotoURL(state, payload) {
      let user = Vue.util.extend({}, state.user)
      user.photoURL = payload
      state.user = user
    },
```

``state.user = user``この部分は、元のオブジェクト（state.user）にコピー、編集したオブジェクト（user）を代入しています。

#ページの読み込み#

```
this.$router.go()
```

最後に、routerなどを使ってページのリロードを行いましょう！

このようにして、オブジェクトのプロパティの値の変更を検知してくれます。

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

これで時間を潰すなんてもったいないですよね？？

なので、この記事を参考にしてぜひ学習を進めていってください！

以上、「Vuexでオブジェクトのプロパティを変更したいときの対処法！！」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
Raspberry Piに接続したカメラをコマンドラインでセットアップ

## 概要

Raspberry Piに接続したカメラをコマンドラインでセットアップする方法について記載します。

## 手順

### 有効化

1. カメラを有効化する。

    ```shell
    sudo raspi-config nonint do_camera 0
    ```

1. リブートする。

    ```shell
    sudo reboot
    ```

### 無効化

1. カメラを無効化する。

    ```shell
    sudo raspi-config nonint do_camera 1
    ```

1. リブートする。

    ```shell
    sudo reboot
    ```

### 確認方法

1. 接続されているカメラが有効か確認する。

    ```shell
    raspi-config nonint get_camera
    ```

- カメラが有効な場合

    ```text
    0
    ```

- カメラが無効な場合

    ```text
    1
    ```
JavaScriptの引数と戻り値の基礎中の基礎

プロゲートのJavaScript 学習コース |||でつまずいた箇所がありましたので記事に整理してみました。
関数の引数と戻り値の理解に難しさを感じられている方のお力になれれば幸甚です。

JavaScriptは関数から理解するのが段々と酷になってきました。

もともとインフラ周りのエンジニアをやっておりましたので、関数の概念自体は理解しておりましたが実際にコードで書くとなるとやはり難しいです(笑)

何らかの数値や文字列を格納する変数と同じ入れ物であり、実行する処理を格納するのが関数であるという理解で差し支えありません。

単純に関数を定義して使うだけならば、条件分岐で習ったIf文に近しい下記のような書き方ですが、引数と戻り値という概念が加わるので混乱することがあります。

##関数の定義とは

```Javascript
const introduce = fuction(){
  console.log("こんにちは")；
}；
introduce();
```

定数introduceを定義してfunction(){};の{}内に処理を記載します。
これだけで関数の出来上がりです。ここまでを**「関数の定義」**と呼びます。

『定数名();』と記載することで関数内の処理が実行されます。
 処理であるconsole.log("こんにちは")；が関数introduceに格納されており、introduce();と書くことでそのまま中の処理が実行されて「こんにちは」と表示されます。

*※JavaScriptのES6バージョンから「function()」の部分を「() =>」とするだけで関数が定義できるようになっており、この関数の書き方をアロー関数と呼びます。*

ややこしくなるかもですが、JavaScriptの仕様で予め用意された関数も存在しており、オリジナルの関数を使いたい場合に定義が必要になります。

私と同様に引数と戻り値によって苦しむ初学者の方もいらっしゃると思いますので、こちらで私の体験談を踏まえながらどのように学習したのかをご紹介させて頂きます。

引数とは関数に与える追加情報のようなものであり、戻り値とは呼び出し元で受け取る関数の処理結果のことです・・・と言われてもピント来ませんよね。

正確に理解しようとして調査して考えていても難しいと思いますので、手を動かして「こういうものだ」と一種のおまじないだと思ってコードを書いてみると理解できるようになります。
##関数の定義とは

```JavaScript
const greet = (name) => {
  console.log(`こんにちは、${name}さん`);
};
greet('田中');
```
上記のコードで「こんにちは、田中さん」と表示されます。

ロジックとしてはアロー関数の() =>{};にある()の中に引数としてnameを記載します。
そして定義したgreet関数を呼び出す際に()内に値を入れてgreet('田中');と記載することで、引数nameに渡されます。

すると、greet関数内のconsole.log(`こんにちは、${name}さん`);のnameにも値が反映されて、greet関数を実行すると上記の処理結果になります。
##戻り値とは

```JavaScript
const add = (a, b) => {
  return a + b;
};
const sum = add('1,3');
console.log(sum);
```
上記のコードで「4」と表示されます。

「return 値」で指定するとその値が戻り値として、呼び出し元であるadd関数に戻ります。上記のコードでは、add('1,3')が関数を呼び出しており、そのまま戻り値に置き換わります。

つまり、return 「a + b;」のaとbにadd('1,3')の1,3が入るので4が呼び出し元であるadd関数に戻ります。

そして、定数sumの中に代入されて、sumを実行して4が出力されるという仕組みです。

プロゲートで私が理解するのに時間がかかった問題「6.戻り値とは」のコードを参考に引数と戻り値の応用例を解説致します。
##引数と戻り値を扱った応用コード

```javascript

const half = (number) => {
  return number / 2;
};
const result = half (130);

console.log(`130の半分は${result}です`);
```
上記のコードで「130の半分は65です」と表示されます。

half関数を定義して引数にnumberを指定してありますね。
そうしたら、returnでnumber / 2を戻り値として返しています。

half(130)にてhalf関数の引数に130を加えたので、numberに130が代入されます。
ここで私は躓きましたが、もっと引数の扱い方が定着していればスムーズでした。
result定数にそのまま代入しているので、出力結果は「130の半分は65です」になります。

理解をしようとするよりも**「習うよりも慣れろ」**的な話だと思います。
数学の勉強方法に近しいものがあり、新しい公式を使って取り敢えず問題を解きながら覚えるのが習得時間の短縮に繋がりました。
Python計算関係ライブラリチートシート ~itertools編~

## Why？

競技プログラミングで全探索をする際に知らないと解く手がかりを得られなかったりするので、これを機会にPandasやNumpyなども少しずつ押さえておこうと思ったからです。
とりあえず、今回は座標に関する問題が出たのでitertoolsから以下を抜粋。


## itertools.count()
<details><summary>書いたコード</summary><div>

```python

import itertools

# count()で第1引数に指定した数から第2引数で指定した数ずつ返すことができる。
list1 = []
for i in itertools.count(0,2):
    list.append(i)
    if i == 20:
        break
print(list1) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

# 少数を設定することもできる
list2 = []
for i in itertools.count(0,2.5):
    list2.append(i)
    if i == 20:
        break
print(list2) # [0, 2.5, 5.0, 7.5, 10.0, 12.5, 15.0, 17.5, 20.0]



```

</div></details>

## itertools.cycle()

<details><summary>書いたコード</summary><div>

```python

import itertools

# cycle()は引数で指定したiterableを無限にコピーし続ける。
sample = []
count = 0
text = 'TEST'
for i in itertools.cycle(text):
    sample.append(i)
    count += 1
    # 例えばcount == 3だとsample = ['T', 'E', 'S']となる
    if count == len(text)*4:
        break
print(sample) # ['T', 'E', 'S', 'T', 'T', 'E', 'S', 'T', 'T', 'E', 'S', 'T', 'T', 'E', 'S', 'T']


```

</div></details>

## itertools.accumulate()

<details><summary>書いたコード</summary><div>

```python

import itertools

# accumulate()は引数で指定したiterableについて以下のような処理を行う
sample = range(1,6)

result = list(itertools.accumulate(sample))
print(result) # [1, 3, 6, 10, 15]

# つまり[sample[0], sample[0]]+sample[1], sample[0]]+sample[1]+sample[2] .......]ということ


```

</div></details>

## itertools.chain()

<details><summary>書いたコード</summary><div>

```python

import itertools

# chain()は引数で指定したiterableを結合させることができる
sample = 'ABC'
sample2 = 'DEF'

result = list(itertools.chain(sample, sample2))
# join()と違って一文字ずつに格納
print(result) # ['A', 'B', 'C', 'D', 'E', 'F']

# リストに対して使いたい場合はこちら

sample3 = ['ABC', 'DEF']

result = list(itertools.chain.from_iterable(sample3))
print(result) # ['A', 'B', 'C', 'D', 'E', 'F']


```

</div></details>

## itertools.combinations()

<details><summary>書いたコード</summary><div>

```python

import itertools

# combinations()は引数で指定したiterableを第2引数で指定した数での組み合わせを返してくれる

l = [4,4,9,7,5]
new_list = []

# 重複アリの場合はcombinations_with_replacement()と書く
for i in itertools.combinations(l,3):
    new_list.append(i)
print(new_list) # [(4, 4, 9), (4, 4, 7), (4, 4, 5), (4, 9, 7), (4, 9, 5), (4, 7, 5), (4, 9, 7), (4, 9, 5), (4, 7, 5), (9, 7, 5)]




```

</div></details>

## 最後に

また問題を問きながらPandas,Numpy含めどんどんアウトプットしていきたいと思います。

## 参考

公式ドキュメントと以下の記事が簡潔にまとまっていてよかったです。

[itertools --- 効率的なループ実行のためのイテレータ生成関数](https://docs.python.org/ja/3/library/itertools.html#itertools.tee)
[itertools、more-itertoolsの紹介](https://qiita.com/SaitoTsutomu/items/ddb5076ef62745f03b56)
【AZ-900】「料金プランとサポート」についての整理

## 本記事の目的
* 本稿はAZ-900を受験するにあたり参考とした教材「合格対策 Microsoft認定 AZ-900:Microsoft Azure Fundamentalsテキスト&問題集」について学習した内容を、自身の備忘録としてまとめたものです。
    * 参考(amazon url)：[合格対策 Microsoft認定 AZ-900:Microsoft Azure Fundamentalsテキスト&問題集](https://www.amazon.co.jp/dp/4865942319/) 
* AZ-900は2020年11月9日に試験内容が変更されており(詳しくは[公式サイト参照](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900))、上記本は2020年3月8日時点での内容のため、章の構成が最新状況と異なります。
* しかし、求められているスキルを確認すると、**求められる内容自体に大きな変化はない** ため、こちらの参考書は未だ有効であると判断しました。
    * 試験内容を日本語訳した記事もQiitaで作成しました。→ [【AZ-900】試験範囲の変更内容の翻訳【2020年11月9日更新内容】](https://qiita.com/picato0511/items/114693650c9eb062c0f5)
* この記事を参考にされる方は、上記背景をよくご理解の上、ご活用ください。

## サブスクリプション

### Azure サブスクリプション

* ユーザーアカウントと、それらのアカウントで作られたリソースをグループ化する
* アカウントは複数のサブスクリプションを保有する事が可能
    * 目的によって使い分けるため(開発部門、テスト目的、本稼働用など)
    * リソース数の制限を緩和するため(1サブスクリプションの制限以上のリソースを持つため、サブスクリプションを2つ以上契約する)
    * アクセスを分割するため(開発部のサブスクリプション管理者を、営業部サブスクリプションのリソースにアクセスさせない)
* サブスクリプション内のリソースは、**別のサブスクリプションに移動可能**
    * ユーザー自身が実施する必要あり
    * 全てのリソースを移動できるわけではない(ごく一部のリソースは移動できない)
    * リソースの移動中でもリソースの操作は可能のため、ダウンタイム（稼働停止時間）は無い
    * リソース移動中、リソースグループがロックされる(グループ無いのリソースの作成や削除はできない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462467/3ca987df-38c7-ae12-f4d3-d3c909ff40cb.png)
 画像引用：[Azure Learn：Azure サブスクリプション、管理グループ、リソース、リージョンの概要](https://docs.microsoft.com/ja-jp/learn/modules/azure-architecture-fundamentals/overview)

### 無料試用版サブスクリプション

* ユーザーは1度だけ無償使用版サブスクリプションを作成できる
* すべてのAzureサービスを無償で使用できる
* サインアップから30日が経過、あるいは22,500 円分のリソースを使用すると終了
    * 途中で有償版にアップグレードすることで、無償版で作成したリソースを継続利用できる

## コスト

### 料金のかかる条件

* 仮想マシンの実行時間（秒単位）
* 仮想マシンに関連するOS、データディスク、送信データ量、パブリックIPアドレス
* データを保存した、ストレージアカウント（データサイズ分）
* VPNゲートウェイの作成やピアリング接続の利用
* 有料プランのAzure AD

### Azure Cost Management

* 契約中のサブスクリプション内のリソースでかかっているコストを分析し、集中管理する
* Azure ポータルから利用可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462467/49d3d5a2-3e47-ee14-3c9c-70c6458aa362.png)
画像引用：[Azure Learn：コスト分析を使用してコストを評価する](https://docs.microsoft.com/ja-jp/learn/modules/analyze-costs-create-budgets-azure-cost-management/3-evaluate-costs-using-cost-analysis)

## サポート

### サポートプラン

サポートプランの種類によって、受けられる技術サポート内容が異なる

* Basic
    * 無料プラン
    * 技術サポートは受けられない
* Developer
    * 営業時間に電子メールでのみ技術サポートを受けられる
* Standard
    * 24時間365日、電話と電子メールで技術サポートを受けられる
* Professional Direct
    * Standardと同様の技術サポート＋設計やオペレーションのサポート
    * webセミナーによるトレーニングが提供される
* Premier
    * Microsoft全般の製品に対する技術サポート
    * クリティカルな問題への最短15分以内の対応
    * Microsoft技術者とのレビューや設計支援などのオンサイトサポート

### サービスレベルアグリーメント（SLA）

* Azureの基本的なSLAは99.9 %
* 仮想マシン(SSDストレージ使用)では99.9 %以上
* 可用性セットに作成された仮想マシンでは、99.95 %以上
* 可用性ゾーンに作成された仮想マシンでは、99.99 %以上
* 有料のAzure AD(Azure AD Premium)では、99.9 %
* 異なるSLAを持つサービスを組み合わせて運用している場合のSLAは、ことなるサービスのSLAの掛け算で決定される
* 無料のサービスにはSLAの保証はない
* 障害によってSLAが守られなかった場合、ユーザーに対してサービスクレジットという形で支払われる
    * Azureの支払いに利用できるクレジット（例えば来月の請求金額をサービスクレジットで支払える）
Qiitaアイコンをhtmlに挿入したい

# はじめに
![Qiita　ファビコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698479/b551ca84-3de9-2e40-5ceb-c2d7f90bb8f6.png)
この画像かわいいですよね！！
まだまだですが，ポートフォリオ作るときにQiitaのリンクをはろうと思ったのです．
ただ，公開されてるのがこれだけなので，とりあえず，貼るのにちょうどいい画像に変換してから，乗っけました．
３Dペイントとかも使えるみたいですがよくわからなかったのでpythonで画像加工のプログラムを書きました．
たぶん大丈夫だと思うのですが，これがガイドライン的にアウトだったら教えてください
早急に消します

# pythonプログラム

```python
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFilter,ImageOps,ImageChops

# 元画像を読み込み最大値を255，最小値を0にする
im_gray = cv2.imread('qiita-icon.png', cv2.IMREAD_GRAYSCALE)
imtype = im_gray.dtype
im_gray -=np.min(im_gray)
valmax = 255 / np.min(im_gray)
im_gray = im_gray * valmax

# 白黒反転
im_gray = 255 - im_gray 
#型変換してしまうので元に戻す
im_gray = im_gray.astype(imtype)
#Image型に変換
img_p = Image.fromarray(im_gray)

# 黒画像を作り，アルファ値の設定
im_a = Image.new("RGB", img_p.size, (0,0,0))
im_a.putalpha(img_p)
crop = im_a.split()[-1].getbbox()
im_a.crop(crop)
im_a.save('qiita-icon.png')

```
# htmlへの実装
html

```html
<div class="btnce">
  <a href="https://qiita.com/#" class='btn'><img class="qiiicon" src="img/qiita-icon.png"/> Qiita</a>
</div>
        
```

css

```css
  .qiiicon{
    height: 1rem;
    width: auto;
    filter: invert(100%);
  }
```

filterで色を変えたことくらい
他の色のやり方はafterとかなのでしょうか？
うまくいかなかったです
やり方知りたい...

# 結果
こんな感じになりました
まあまあいい感じにはなったと思うので及第点とします
少しずれてるのでアドバイスあればお願いします
![実行結果のボタンイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698479/2c79bc70-80c5-53c7-4427-34e2280360bc.png)

# 参照
[ブランドガイド](https://help.qiita.com/ja/articles/others-brand-guideline)
[🖼【CSS】filterのみを使用して黒い画像を任意の色に変更する](https://qiita.com/eltociear/items/39bcd78befdbd2c4b58c)
Symbolテストネットで委任ハーベスティング開始時に公開鍵エラーが発生する

### Symbolテストネットでデリゲートハーベスティングを試みるもいきなりコケる
Symbolのデスクトップ・ウォレットをインストールして、フォーセットからテスト用のXYMを取得して、さぁデリゲートハーベストにトライしてみよう！と思った矢先、「 **Failure_Core_Zero_Public_Key** 」なるエラーでいきなりコケる。具体的には、デリゲートノードを選択して「開始」を押したタイミングでエラーになる。

### 落ち着いてトランザクションを作りましょう
ようは「署名者公開鍵が存在しませんよ～」と怒られているがそれもそう、まだ一度も取引してないので自身の公開鍵が生成されてない。落ち着いてフォーセットアドレス宛にテスト転送してトランザクションを作る。
![スクリーンショット 2021-01-15 004730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285378/413caabe-4457-5ffd-701d-c94d7d7110b7.png)

### 無事にデリゲートハーベスティングが開始できました
![スクリーンショット 2021-01-15 003523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285378/3525a3f1-09b4-705f-ae98-a75a42c24c9e.png)
Windwos Python 右クリックメニューからEditWithIdleが消えたときの応急処置

Pythonの環境初期化が目的でアンインストール後再インストールした際に
右クリックメニューからEdit With Idleの項目が消えてしまい割と困っていました
自分のインストールバージョンは3.9.1ですがほかのversionでも同様の対処が有効なのかは検証していません
あくまで自分の環境ではこれで動いたという参考程度の処置です
細かい経緯は置いておいて早速応急処置についてですが

Ctrl+r またはスタートメニューのWindwos管理ツールないにあるレジストリエディタ（regedit.exe）を起動して
レジストリを編集します
ざっくり説明すると下記のツリーになるようキーを作成しました
「HKEY_CLASSES_ROOT」
　↳「**」
　　↳「shell」
　　　↳「edit with idle」
　　　　↳「command」(既存)REG_SZ「"（自分のPythonインストールパス）pythonw.exe" -m idlelib "%L" %*」

以下は作成したレジストリキーをエクスポートしたものです

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\edit with idle\command]
@="\"（自分のPythonインストールパス）pythonw.exe\" -m idlelib \"%L\" %*"

1.HKEY_CLASSES_ROOT\*\shellにedit with idle（任意に書き換えてもOKです）を右クリックメニューの新規＞キーで追加します
2.edit with idleにキーを追加して名前をcommandに変更します
3.commandの（規定）を右クリックして修正を選択、表示された小窓のデータの値にpythonw.exeのパスと-m idlelib \"%L\" %*"を引数にしてOKを押して完了です

自分の環境ではこの設定の直後に適当なファイルを右クリックしてedit with idleが表示されるようになり
右クリックしたファイルをIdlで開けるようになりましたが、.pyファイル以外のファイルでもIdleで開けそうな雰囲気になっていますが
テキストファイル以外は開かないほうが無難かと
Shapely+PyprojでLineString座標列を一括変換(WGS84->UTM)する

PythonでのWKT形式LineStringの座標変換処理(WGS84->UTM)の実装に関しての備忘録

# 実行環境
Python: v3.8.5
利用ライブラリ：Shapely=1.7.0, Pyproj=3.0.0.post1

# 処理内容・実装コード
Shapelyで読み込んだLineStringの座標列について、指定EPSGコードにてPyprojのTransformer.itransformerで一括座標変換

```transform_linestr.py
from pyproj import Transformer
from shapely import wkt
from shapely.geometry import LineString

WGS84_EPSG = 4326
UTM_EPSG = 6691


def main():
    # WKT形式LineStringロード
    linestr_wkt = "LINESTRING (138.385554841666 34.9748902437125, 138.385886903329 34.9752925491883, 138.38621257919 34.9757140120678, 138.386397767425 34.97612270334488)"
    linestr = wkt.loads(linestr_wkt)

    # WGS84からUTMへ座標変換
    trans_linestr = transform_linestr(linestr, WGS84_EPSG, UTM_EPSG)

    # UTMからWGS84へ座標再変換(元座標の精度が高い場合に若干値が変化する可能性有)
    re_trans_linestr = transform_linestr(trans_linestr, UTM_EPSG, WGS84_EPSG)

    print("Load WKT:  ", linestr)
    print("WGS84->UTM:", trans_linestr)
    print("UTM->WGS84:", re_trans_linestr)


def transform_linestr(linestr: LineString, from_epsg: int, to_epsg: int) -> LineString:
    """指定EPSGコードにおけるLineString座標変換処理

    Args:
        linestr (LineString): 座標変換元LineString
        from_epsg (int): 変換元EPSGコード
        to_epsg (int): 変換先EPSGコード

    Returns:
        LineString: 座標変換後LineString
    """
    transformer = Transformer.from_crs(from_epsg, to_epsg)
    trans_coords = transformer.itransform(linestr.coords, switch=True)
    return LineString(trans_coords)


if __name__ == "__main__":
    main()
```

実行出力結果

```
Load WKT:   LINESTRING (138.385554841666 34.9748902437125, 138.385886903329 34.9752925491883, 138.38621257919 34.9757140120678, 138.386397767425 34.97612270334488)
WGS84->UTM: LINESTRING (3873381.187880124 261326.0666616608, 3873425.024292707 261357.5560269007, 3873471.001297946 261388.5176213919, 3873515.897231507 261406.6137873351)
UTM->WGS84: LINESTRING (138.385554841666 34.9748902437125, 138.385886903329 34.9752925491883, 138.38621257919 34.9757140120678, 138.386397767425 34.97612270334487)
```

Shapely+Pyprojでとても簡単に座標列変換処理を実装できた。Pyproj便利。

# 参考
- [Pyproj API Documentation Transformer](https://pyproj4.github.io/pyproj/stable/api/transformer.html)
- [Pyprojで測地系変換を高速に行う](https://qiita.com/R_28/items/53aefcf3f2efcca54629)
Docker for MacでLaravelを速くする方法

皆さんこんにちは。tyamahoriです。Docker for Mac使って開発してますか？遅くてキレ散らかしてませんか。。？

そんなあなたに朗報です。
2021年1月、tyamahoriはDocker for Mac が遅い問題に立ち向かいました。LaravelのサンプルプロジェクトをGitHubにあげておりますので見てください。

# vendorディレクトリをそのままマウントしない！
composer install したら、vendorディレクトリができます。これをコンテナにマウントするさいに一工夫必要です。

# じゃあどうするか？
ローカル開発だと、 docker-composeをほとんどの場合使うと思います。その際には、volumesを使うようにして、Macローカルにファイルを置かないようにします。

# 落とし穴。。
ただ、ローカルにvendorディレクトリがないと、PhpStormなどで補完が効きません。。いくらスピードが速くなるといえ、補完が聞かないと意味ないですよね。。。？

# さらなる一工夫
コンテナ内でcomposerインストールをしたあとに、vendorディレクトリをMacのローカルに持ってきます。`docker cp` のコマンドがあるので、それを使って、コンテナないから、Macローカルにディレクトリをコピーします！

# 細かいところ
じゃあ、いつのタイミングで`docker cp`やるのか？ 新しくcomposer install でなにか追加した場合どうするのか。。などなどあります。そういうときは、スクリプトを組んで、色々と試行錯誤をしましょう。サンプルプロジェクトにスクリプトを置いてありますので、参考にしてみてください。

# 我慢するところ
`docker cp`でvendorディレクトリをMacローカルに持ってきたら、PhpStormはvendorディレクトリを読み込みます。その際にMacのファンがブンブン回るので、そこだけは我慢する必要があります。。

# 結論
本当に速くなるかはまず試してもらえればと思います。サンプルプロジェクトをクローンして、Docker for Macを使って、立ち上げて見てください！皆様のご感想お待ちしております！



# GitHubでのプロジェクト
https://github.com/tyamahori/laravel8-sample
２つの帽子を知る

# ２つの帽子
**２つの帽子とは、Kent Beckが考案したリファクタリングを行う作業を区分した例えです。**


Kent Beckは、ソフトウェア開発でリファクタリングするときは下記の二つに作業を区分すべきと言っています。

## 機能追加
**機能追加時に気をつけること**

* 既存のコードを変更してはいけない
* 単に機能を拡張することに専念する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/c382391c-ed82-88b4-8bfa-5b827ed0e650.png" width="300px">


## リファクタリング
**リファクタリング時に気をつけること**

* 機能追加を行ってはいけない
* コードの再構築に専念する
* テストの追加をしてはいけない(テストケース漏れの追加, インターフェース変更への対象は例外)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/f4302402-bbd5-2069-b697-6e3a49814be4.png" width="300px">


# 帽子のかぶり方
普通、人は帽子を一つしかかぶらないはずです (僕が知る限りでは)
そのため2つ帽子があるときは、どっちをかぶるか考えないとです。

## ユースケース

* 新しい機能を追加するタスクが発生
* 既存のコードの構造を少し変更するだけで簡単に機能追加ができることを発見
* **リファクタリングの帽子をかぶる**
* コードの改修が終了
* **機能追加の帽子をかぶる**  
・  
・  
・  
* 機能追加をしていたら少し分かりづらい箇所があることに気づく
* **リファクタリングの帽子をかぶる**

---
## いつリファクタリングをすべきか
### 三度目の法則
* 初めは単純な作業を行う
* 2度目に以前と似たようなことをしていると気づいたら、**意識はしつつ**作業を続行する
* 3度目に同じようなことをしていると気付いたらリファクタの開始  

つまり、仏の顔も三度までということですね。。w


# 参考文献
今回参考にした文献は下記なのですが、こちらとてもいい本なのでおすすめです。
初版は、Javaでの解説だったのですが、第２版はjavaScriptを利用しています。
javaScriptの為のリファクタリング本ではないので、そこは気を付けてください。

[リファクタリング(第2版): 既存のコードを安全に改善する](https://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B-OBJECT-TECHNOLOGY/dp/4274224546)
【Unity】URP環境でポストエフェクトを追加する方法

UnityでURPを導入したときにPostProcessingを適用する手順についてのメモになります。

### 1.CameraのPost Processingにチェックを入れる。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/eaca516e-f2b2-af57-1903-69ef43aec7e1.png)

### 2.Hierarchyを右クリックしVolume > Global Volumeを選択しGlobal Volumeを追加する。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/934f1ca8-cfec-ad1f-c0bd-33f9b3c3d9c0.png)

### 3.追加したGlobal VolumeのProfileを追加しAdd Overrideボタンから追加したいエフェクトを選択する。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76537/43b9a50f-3eeb-bc61-db6b-b46e1fb90c96.png)

以上です。
iOSのlaunchImageNameで大ハマりしたメモ

iOSでローカル通知に画像を表示したい時に、launchImageNameを使用してくださいという記事がいくつもある。

しかし、実際は動かないし、使い方を書いてある記事は一つも無かった。

https://developer.apple.com/documentation/usernotifications/unnotificationcontent/1649870-launchimagename

僕と同じようにハマってほしくないので、launchImageNameは使えないよ。とメモをここに残します。
GitHubの草、偽物の草？

# GitHubの草、偽物の草？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/e6f0c0c8-d9b4-faa4-bf8b-9b6ba9351e3a.png)

2021年になり、毎日コツコツ作業しているのですが
偽の草というものを知り「なに！」と思ったので記事を書いていきます！

### 草を生やすとは
GitHub には Contributions という「これだけ活動したよ」を可視化する機能がある
この芝生に緑色を増やすには、Contribution（GitHub上での活動のうち芝生に反映される活動）を行う必要がある
この行為を 「草を生やす」 という

#### 流れ
```
(準備：GitHub上でリモートリポジトリを作成)
❶branchの準備
❷ローカル環境でファイルの変更をする
❸共有したいファイルをindexする
❹ローカルリポジトリにcommitする
❺GitHub上に公開=pushする
❻GitHub上でpull,mergeをする=草が生える
❼ ❻で生まれた差分をローカルに取り込む
```

#### 例.1月1日→コミット/2日→コミット/3日→コミット/4日→コミット,プッシュ
1~4日分は各コミットした日がちゃんと記録される

#### おまけ
PrivateリポジトリへのコミットをGithubの草に反映するかどうかをオプトインで選択できる

### 偽物の草
```
GitHubに偽の草を大量に生やしてしまうGoogle Chrome拡張「人工芝」がリリースされる
```

インストールすると草が生えていなかった部分に偽の草が生えるよう...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/3b8d1256-4938-3709-cea5-054b16565123.png)


え...と思った反面、なかったものを発想して形にできた事実にリスペクト
セレクターについて改めて勉強し直した③

#はじめに

昨日の投稿の続きです。
[セレクターについて改めて勉強し直した②](https://qiita.com/TerToEer_sho/items/2d2e80222cb96ce6ae7e)

##今回も逆引き方式で

###親要素の直後の子要素にのみスタイルを適用させたい

```html:HTML
<h1>テスト</h1>
<p>テスト1</p>
<p>テスト2</p>
```

```css:CSS
h1 + p {}
```

h1要素の直後のp要素にのみスタイルが適用される。2つめのp要素にはスタイルが適用されない。


###要素名は違うけどクラス名が同じ場合

```html:HTML
<p class="section">テスト</p>
<h1 class="section">テスト</h1>
```


```css:CSS
p.section {}
h1.section {}
```

`.クラス名`の前に要素名を入れる。
いや、そもそも同じクラス名を付けない方がいいって話ですね。