OmniAICreator/Qiita-1.07M huggingface dataset:
Emmetを使いこなして効率化

#はじめに

UdemyでHTML・CSSを復習していて **「Emmet」**という補完機能を知りました。

当たり前のように使っていたものをありましたが知らないでめちゃくちゃ便利なコマンドもありましたのでまとめていきます。

#Emmetとは

HTML・CSSのコーディングをする際に、コマンドを入力すると簡単にテンプレートが作成されたり、予測変換のような形で記述してくれたりする機能です。

Visual Studio Codeのエディターにはすでに含まれています。

[Emmet公式サイト](https://emmet.io)

下記の公式サイトを見ていただければコマンドが記載されております。
[Emmetチートシート](https://docs.emmet.io/cheat-sheet/)

#HTMLのテンプレートを呼び出す

head の中に色々記述しての時間が一瞬で**ぱっ！**って以下の記述を呼び出す事ができます。

```.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
<body>

</body>
</html>
```

###記述方法

```
! + Tabキーを押す
```

これだけ。

一瞬でHTMLの準備が整いました。


#id・classのついたdivタグを作りたい場合

```.html
<div id="container"></div>
<div class="cls"></div>
```
このような記述も簡単に作成できます。

###記述方法

**idの場合**

```
# + id名（今回は"container"） + Tabキーを押す
```

**classの場合**

```
. + class名（今回は"cls"） + Tabキーを押す
```


##spanタグの場合

```.html
<span class="cls"></span>
```


###記述方法

```
span + . + class名　+ Tabキーを押す
```

#同じ要素を複数用意したい場合

```.html
<div id="container">
    <div class="cls"></div>
    <div class="cls"></div>
    <div class="cls"></div>
    <div class="cls"></div>
    <div class="cls"></div>
</div>
```

今まではmacのショートカットキーでコピー・貼り付けをしてましたがそんな必要ありませんでした。

###記述方法

```
# + id名 + > + . + class名 + *必要な数

#container>.cls*5
```

#終わり

様々な書き方があるのでチートシートを見ながら自分で使えそうなものを選ぶのが良いかと思います！
任意の色をくり抜いて画像を合成する方法 1

python、OpenCV(cv2)、そしてNumPyを使って２枚の画像を合成する方法を記録します。
自分のやりたいことを調べた際、ある程度の記事が見つかるにもかかわらず知識がなく、意味が理解できないことが多くあったので、初心者でもわかりやすいように記述できるよう心がけます。

なお、筆者は画像関係について深く学んだことはなく、数学の知識は高校３年生レベル(又はそれ以下)です。

###参考にさせていただいた、サイトのURLを無断で記述させていただいております。
インターネットで調べたら出てくるので良いのではないかという認識ですが、問題がございましたら、直ちに修正させていただきます。


まず画像合成にあたり、筆者が試した方法を記述します。
(知識が全くない状態でしたので、インターネットで調べ、出てきたコードをくっつけたキメラです。)

###アプローチ１
```python
def getdata3(originalImg: Image, materialImg: Image, transparentColor: str):
    h = transparentColor.lstrip('#')
    transRGB = tuple(int(h[i:i + 2], 16) for i in (0, 2, 4))

    width, height = materialImg.size
    imgdata = materialImg.getdata()
    for i in range(height * width):
        x = i % width
        y = int(i / width)
        pixdata = imgdata[i]
        if pixdata == transRGB:
            continue
        originalImg.putpixel((x, y), pixdata)

    originalImg.show()

def highCostChromaKey():
    original = cv2.imread(
        "original.png")
    orImg = Image.fromarray(cv2.cvtColor(original, cv2.COLOR_BGR2RGB))
    material = cv2.imread(
        "transparent_1920x1020_FF0000.png")
    mrImg = Image.fromarray(cv2.cvtColor(material, cv2.COLOR_BGR2RGB))
    # stratTime = time.time()
    getdata3(orImg, mrImg, "#FF0000")
    # print(time.time() - stratTime)
```

[参考]
- https://kuranabe.hatenablog.com/entry/2018/08/18/234355 (getdata3の大部分を引用、一部改変)
- https://stackoverflow.com/questions/29643352/converting-hex-to-rgb-value-in-python (getdata3の一行目、二行目。一部引用、改変)
オリジナルというものが貼り付け先、マテリアルが貼り付けるものです。
マテリアルのパスの最後にFF0000と書いてあると思うのですが、これは透過する色を示しています。
合成の手法としては、マテリアルの全ピクセルにアクセスして、FF0000ではない色だったらオリジナルの同じ位置に書き込もう。というもので、1920x1080の画像でテストしているのですが、すごく時間がかかります。一枚加工するだけならこのゴリ押し手法でも良いのですが、複数枚となると、現実的ではない時間がかかってしまいます。

私の実現したいことは時間に敏感なので違う方法を考えなければなりませんでした。
そこでマスク合成というものを試しました。


時間がないので、動くコードだけ載せます。

```python
def mixWithMask():
    # オリジナルと、色付きマスクを読み込む
    start_time = time.perf_counter()
    original = cv2.imread("original.png")
    colorMask = cv2.imread(
        "mask_text_in_box.png")

    # 色付きマスクをモノクロマスクに変換。
    bgrLower = np.array([0, 0, 255])  # 抽出する色の下限(BGR)
    bgrUpper = np.array([0, 0, 255])  # 抽出する色の上限(BGR)
    MonoMask = cv2.inRange(colorMask, bgrLower, bgrUpper)
    MonoMaskBW = cv2.bitwise_not(MonoMask)

    cv2.imwrite("./resources/color2mono_mask.png", MonoMask)
    cv2.imwrite("./resources/color2mono_maskBW.png", MonoMaskBW)
    mixed = cv2.bitwise_and(colorMask, colorMask, mask=MonoMaskBW)
    cv2.imwrite("./resources/mixed.png", mixed)

    orImg = Image.open("thumb-1920-1003880.png").convert("RGBA")
    mrImg = Image.open("./resourcesmixed.png").convert("RGBA")
    msImg = Image.open("./resources/color2mono_mask.png").convert("L")

    im_2 = Image.new(mode=orImg.mode, size=mrImg.size, color=(0, 0, 0))

    im = Image.composite(orImg, mrImg, msImg)
    print("perf_counter = {:.7f}".format(time.perf_counter() - start_time))
    im.show()
```

[参考]
- https://rikoubou.hatenablog.com/entry/2019/02/21/190310
- https://qiita.com/Takayoshi_Makabe/items/1fbbeeb41cc4d6a5f1e2
POWERSHELL　ファイルをコピーしてファイル名をリネーム


```powershell
# コピー元を指定
Set-Location \\199.22.99.00\test

# コピー先を指定
$locallink = "コピー先URLを設定"

# 本日の日付を取得　例）20210101
$formatted_date = (Get-Date).ToString("yyyMMdd")

# コピーしたいファイル名を設定　例）テスト2021.xlsx
$copyfilename = "テスト" + $formatted_date + ".xlsx"

# コピーしたいファイルをコピー先URLにコピー
Copy-Item -Path $copyfilename -Destination $locallink

# リネームするファイルのURLを設定
$renamelink = $locallink + "\" + $copyfilename

# リネーム後のファイル名を設定 例）テスト20210101_テスト.xlsx
$renamefile = "テスト" + $formatted_date + "_テスト" + ".xlsx"

# リネーム
Rename-Item $renamelink $renamefile


```
【PowerShell】ディレクトリ構成のみコピーする


↓のDOSコマンドと同じことをPowerShellでやりたい場合の覚え書き

```c
xcopy /t /e "コピー元フォルダ" "コピー先フォルダ"
```
#ソース

```powershell
# コピー元
$source_dir = "D:\HOGE\HOGE"
$source_dir_name = Split-Path $source_dir -Leaf
# コピー先
$target_dir = "D:\FUGA"
# コピー先の存在有無
$target_dir_exsist = Test-Path $target_dir
# 全てのファイルを除外してコピー
Copy-Item $source_dir $target_dir -Recurse -Exclude *.*

# コピー先フォルダが先に存在した場合、コピー先フォルダの中にコピー元フォルダを含んだ階層が作られてしまう
# コピー先が存在しなかった場合と動作を合わせるためにコピー後に一つ上の階層に移動させる
if( $target_dir_exsist )
{
    $source_dir = Join-Path $target_dir $source_dir_name
    Get-ChildItem -Path $source_dir | Copy-Item -Destination $target_dir -Recurse -Container
    Remove-Item $source_dir -Recurse
}
```
【javascript】シンプルな動的selectの生成、option（選択肢）の追加

#やりたいこと

一次元配列からselectの選択肢を動的に作成


#中身

selectにondblclickクリックで、optionをselectに追加
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="hfmst" data-slug-hash="LYWBOJJ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="createselect">
  <span>See the Pen <a href="https://codepen.io/hfmst/pen/LYWBOJJ">
  createselect</a> by Hirofumi Sato (<a href="https://codepen.io/hfmst">@hfmst</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#コード

```html:index.html
<select id="test" ondblclick="create_op()"></select>
```

```javascript:js.html
function create_op(){
  let arr = ["赤","青","緑","黒","白"];      //適当な配列用意
  let sl = document.getElementById('test'); //対象のselect取得
  
 if(sl.length<arr.length){    //selectが空の時のみ関数実行
    for(let num in arr){      //arrの要素数を0から順にnumに入れて繰り返し処理
      let op = document.createElement('option');  //optionを新しく毎回作る
      op.text = arr[num];                         //optionのテキストに配列[num番目]の値を入れる 
      sl.appendChild(op);                         //optionをselectに追加
    }
  }
}
```
光速を越えて動く点Pを物理的に実現する方法

# 独り歩きする「光の速度は越えられない」

「光の速度を超えることはできない」というのは、現代の人類の間では、地動説の次くらいに有名な科学的常識となっている。
相対論を認める限り、それは覆せない。

けれど実は「光速を越えて動いて**いるように見える**」ものの存在は、相対論では禁止されていない。

ここで重要なのは、光速を越えて動いているように見えるものを使って「光速を越えて情報を伝えることができない」ということだ。
相対論で要請しているのは、真空中の光の速度を越えて「情報を伝えることができない」ということであり、情報さえ伝わらなければ、何らかの抜け道はあっても構わない。

# クソデカレーザーポインタとクソデカ黒板

地球上に、回転台に載ったクソデカレーザーポインタを構築する。レーザーポインタ自体がクソデカである必要はないが、クソ遠くにあるクソデカ黒板に点Pを照らせるほどのレーザーを考えるので、それなりのデカさになるだろう。

この回転台は、1秒間に180度回転させることができるとする。
このようなレーザーポインターと回転台を作ることに問題があるだろうか。いや、ない。

さらに、宇宙にクソデカ黒板を置く。「置けるのか?」という疑問はあるが「原理的には可能」という回答になるのではないかと思う。
地球を取り囲むように、クソデカ黒板を置く。

黒板は、レーザーポインターから10万キロメートル離れたところに半円状に置く。途中でレーザーポインターを遮る邪魔な星々があれば、点Pを表示する上で弊害になるので、すべて除去して欲しい。これもおそらく、原理的には可能であろう。

ここで、黒板の全長はπ * 10万km ≅ 31.4万kmとなる。

つまり、こういう状況ができあがった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/d7bdd94d-c3ec-1da8-9140-f239bd8ba276.png)

# 光速を越えて動く点P

現在、黒板の左端には、点Pが煌々と輝いている。ここで、回転台を動かすときが来た。この回転台は、1秒間に180度動くのであった。つまり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/7ff21196-b159-40e9-00f0-e3e20ceec3d5.png)

**点Pが動いた！！**

1秒間で点Pが黒板の左端から右端まで、点Pは1秒間で31.4万km/sで動くのだから、これは光速を越えている。

**点Pが光速を越えて動いた！！**

もし「xxを考慮すれば、これでは少し足りないのでは?」などの疑問がある人がいれば、黒板をより遠くに置いたり、回転台をより早くしてもよい。
また、回転台の回転角を小さくして、黒板をより遠くに置くか、回転台をより速く回すことで、黒板はこのような半円状ではなく、近似的に平面にすることもできる。

いずれにせよ、光速を越えて動く点Pは、物理的に実現可能だ。

**ただし、左端にいる人から右端にいる人に、何一つ情報を伝えることはできていない。**
なので、光速を越えて動く点Pの存在が、相対論を脅かすことはない。

## 追記
[超光速運動](https://ja.wikipedia.org/wiki/%E8%B6%85%E5%85%89%E9%80%9F%E9%81%8B%E5%8B%95)という、見かけの上で光速を超える現象が実際にあることをTwitterで教えていただいた。

# 全く関係のない話
光通信が「速い」のは、光の速度が速いからなのだろうか?

普段は、通信の速い・遅いはビットレート、つまりMbpsなどで測ることが多い。
Mbpsという単位は、「光の速度は越えられない」で言っている「時間あたりに進む距離」の単位とは関係がない、「時間あたり、どれだけの数のビットを運べるか」という単位だ。

なので、光通信よりも「速い」通信は作ることができる。
つまり、今、私は、トラックにSSDを満載して高速道路を爆走するという話をしている。

## さらに関係のない話
なお、さらに余談となるが。光の速度は屈折率により変わる。
光速度不変の法則で言っている光の速度とは「真空中の光の速度」のことを言うので、例えば水の中で光が遅くても、水の中を光よりも速く動く物質があっても、そこに物理的な矛盾はない。
ところで、光通信には普通、光ファイバーが使われるが、光ファイバーはガラスでできており、ガラスの屈折率は1.5もある。
つまり、真空中の光の速度は秒速約30万kmであるのに対し、光ファイバーの速度は秒速約20万kmしかない!!

空気中の光の速度は、真空中の光の速度とほとんど変わらないので、km/sで測った意味の速度であれば、無線通信や、あるいは、文字を書いた紙を掲げる通信方法の方が、光ファイバーよりも1.5倍速いと言える。

紙はともかく、無線通信については、ゲーマーやトレーダーなどの回線の遅延を気にする人にとっては「光ファイバーより無線通信の方が速い」という時代は来る(あるいは来てる)かもしれない。

# まとめ
光速は 場合によっては 越えられる
resizeもしくはwindow.matchMediaを用いてウィンドウの幅に合わせてJavascriptの処理を変える方法

#はじめに
こんにちは。
私はフロントエンジニアとして働いていますが、未経験であるため現在課題を出されています。
その課題で「**ウィンドウの幅に合わせてJavascriptの処理を変えたい！**」ということがあったのでその方法を書いておきます。

#jQueryのresizeを使用した方法
まず、方法として考えられるのが**jQuery**の`resize`メソッドです。
`resize`はウィンドウの幅が変わると実行するメソッドで、ウィンドウの幅に合わせて処理を変えたい時に使用できます。

```Javascript

$(window).resize(function(){
        //windowの幅をwindow_widに代入
        let window_wid = $(window).width();
        //windowの分岐幅をmdに代入
        let md = 1024;
        if (window_wid >= md) {
            //md以上の処理
         }else{
            //md未満の処理   
         }
})


```

上記のようにコードを書くとウィンドウの幅に合わせて処理を変えることができます。
しかし、大きな**デメリット**があります。
それは、**ウィンドウのサイズが変わるたびにこの処理が実行されてしまう**ことです。(`console.log`で確認するとわかりやすいと思います。)
resizeはウィンドウのサイズが変わるたびに発火するので、無駄が多いです。


#window.matchMedia
もう一つの方法として`window.matchMedia`を用いた方法があります。
こちらを使用することでブレークポイントを通過した時のみ処理を走らせることが可能です。
無駄が無くなることと、cssと同じ指定ができることがメリットとして挙げられます。

```javascript
const md = window.matchMedia('(min-width: 1024px)');

function checkWindow(wid){
    if (wid.matches) {
        //min-width: 1024pxに合致する処理 
    } else {
       //min-width: 1024pxに合致しない処理 
    }
}

//load時にも処理を走らせる。
checkWindow(md);
md.addListener(checkWindow);
```

#終わりに
ブレークポイントで処理を分けて実行したい場合には`window.matchMedia`が便利かなっと思います。
`resize`でも工夫をすればブレークポイントを通過したときだけ処理を実行することが可能なようですが、どうしても必要なとき以外は`window.matchMedia`で問題ないかと思います。

#参考文献
[window.matchMediaによる、メディアクエリに応じたJavaScriptの実行](https://qiita.com/shouchida/items/a077b0c5d2ebceef9d9d)
[window.matchMedia をそろそろ活用してもいい頃](https://qiita.com/amamamaou/items/a29b29f5267196a5e4ea)
グラフのフォントを変更し、出力PDFに埋め込むための設定(matplotlib, ggplot2)

Rやpythonで作図したグラフを論文で使用する際に、フォント周りで苦労しないように設定方法をメモしておく。

## Python matplotlib 3.3.4

スタイルシートmatplotlibrcに以下の設定を加える

```{python:.matplotlibrc} 
font.family : sans-serif
font.sans-serif : Helvetica #(or your favorite)
pdf.fonttype : 42
# 同様にrcParamsを変更すれば自分のデフォルトテーマを設定可能
```
matplotlibの初期フォント設定は、"DejaVu Serif"でType 3のフォント形式となっている。フォントの形式の詳細に関しては勉強不足なので割愛。

スタイルシートの書き方は下記参考：
https://note.nkmk.me/python-matplotlib-matplotlibrc-stylesheet/


## R ggplot2 3.3.3

themeのbase_familyで指定する。
Rが起動する時に読み込まれる.Rprofileに好きなthemeを定義し、theme_set()で設定しておくと楽。


```{R:.Rprofile}
# dplyrのselectやfilterがマスクされないように後からtidyverseを読み込む
options(defaultPackages = c(getOption('defaultPackages'), "MASS", 'tidyverse'))

# 無いとtheme_setが見つからないとエラーが出た
library(ggplot2)

# マイテーマの記述　フォント以外の設定もお好みで
my_theme <- function(TXTSIZE = 24, LEDSIZE = 18, LINEWIDTH = 2) {
  theme_bw(base_family="Helvetica") + theme(
  axis.text=element_text(color="black",size= TXTSIZE),
  panel.border = element_rect(color = "black", fill = NA, size = LINEWIDTH),
  legend.text = element_text(size= LEDSIZE)
  # ...
  )
}

# マイテーマの設定
theme_set(my_theme())
```

Rprofileの書き方は下記参考：
https://stats.biopapyrus.jp/r/devel/rprofile.html
ファイルダウンロードのAPIリクエスト送信を実装してみたら無限ループになった件

## 問題
ダウンロードボタンを一回押したら、無限に自動ダウンロードすることになりました

```html
<a id="id1" href="javascript:void(0)" onclick="handleDownload('/', 1)">ダウンロード</a>
```

```javascript
const downloadFile = (path, params) =>
    new Promise((resolve, reject) => {
        axios({
            url: path,
            method: 'GET',
            responseType: 'blob',
            params: params,
        }).then((res) => {
            const url = URL.createObjectURL(new Blob([res.data], { type: 'text/csv' }));
            const link = document.getElementByID('id1');
            link.href = url;
            const filename = 'filename'; //なんらかのファイル名処理
            link.setAttribute('download', `${filename}.csv`);
            link.click();
            URL.revokeObjectURL(url);
        }).then((res) => {
            resolve(res);
        }).catch((e) => {
            reject(e);
        });
    });

const handleDownload = (path, id) => {
    const params = {
        id: id,
    }
    await downloadFile(path, params).catch((e) => window.alert(e));
```

## 原因
ボタン押下する → onclickイベント着火 → handleDownload実行 → link.click()実行 → aタグのonclickイベント着火 → handleDownload実行 → link.click()実行 → aタグのonclickイベント着火...
の無限ループに入ります！

## 解決方法

```html
<span onclick="handleDownload('/', 1)">ダウンロード</span>
```

```javascript
/**
* downloadFile関数の中でgetElementでaタグ要素を取得するのではなく、
* 代わりにjsの中でaタグ要素を作成して、ダウンロード実行の後に削除する
*/
const link = document.createElement('a');
...
document.body.appendChild(link);
link.click();
URL.revokeObjectURL(url);
link.parentNode.removeChild(link);
```
MariaDB で カラム名変更

カラム名を変更しようとするとエラーが出る

```

MariaDB [test]> ALTER TABLE B RENAME COLUMN id to c;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'COLUMN id to c' at line 1
MariaDB [test]> 
```

# 環境

- MariaDB 10.3.29-MariaDB-0ubuntu0.20.04.1
- Ubuntu 20.04 LTS


# トラブルシュート

以下は問題ない。


```

ALTER TABLE A RENAME TO B
ALTER TABLE B ADD COLUMN d int;
ALTER TABLE B DROP COLUMN d;


```


https://stackoverflow.com/questions/53735305/how-to-rename-a-column-name-in-maria-db

によると、 

> Starting with MariaDB 10.5.2 you should be able to do

ということらしいです


```

MariaDB [(none)]> select version();
+----------------------------------+
| version()                        |
+----------------------------------+
| 10.3.29-MariaDB-0ubuntu0.20.04.1 |
+----------------------------------+
1 row in set (0.001 sec)
```

ということなので、対応していないということですね。

```

MariaDB [test]> ALTER TABLE B CHANGE COLUMN id c INT;
Query OK, 0 rows affected (0.008 sec)
Records: 0  Duplicates: 0  Warnings: 0

```
として代わりとします。
Terraform 1.0 へアップグレードする方法の覚書

この度、めでたく Terraform がバージョン 1.0 に到達しました。

- [Announcing HashiCorp Terraform 1.0 General Availability](https://www.hashicorp.com/blog/announcing-hashicorp-terraform-1-0-general-availability)
- [[祝]TerraformがついにGAになりました | DevelopersIO](https://dev.classmethod.jp/articles/terraform-1-0-general-availability/)

> ようし、我が社でも Terraform のバージョンを 1.0 に上げるぞ！

と意気込んでいる人も多いと思いますが、一方で、

> 何か社内がバージョンを上げる雰囲気になっているが、何をすればいいのか分からない

という人も少なくないと思います。

# アップグレードする必要は無いが、慎重になる必要もない

そもそも、Terraform は、JavaやRubyといったプログラミング言語と違い、「脆弱性が発見されWEBサービスが外部からの攻撃の危険にさらされる」といったことはありません（多分）。なので、急いで 1.0 に上げる必要はありません。

一方で今回の 1.0 は 0.15 から大きな変更があったわけではないので、慎重になる必要もありません。プログラミング言語のように

> 最初のマイナーアップデートを待ち、様子を見てからアップデートする

なんてことをする必要は無いでしょう。

# アップグレードの手順

詳細は公式サイトを参照してください。

- [Upgrading to Terraform v1.0 - Terraform by HashiCorp](https://www.terraform.io/upgrade-guides/1-0.html)

Terraform はバージョンごとに言語仕様だけではなく、stateファイルの仕様も変わっています。そのため `0.12 → 1.0` のような一足飛びの更新はできず、`0.12 → 0.13 → 0.14 → 0.15 → 1.0` と1バージョンずつ更新することになります。

とはいえ、バージョンごとに `terraform 0.13upgrade` のようなコマンドも用意されているので、更新自体は難しくありません。

なお[エムスリー式の本番/DEV環境で.tfファイルをシンボリックリンクで共有するスタイル](https://www.m3tech.blog/entry/2020/07/27/150000#%E5%85%A8%E4%BD%93%E6%A7%8B%E6%88%90)の場合には落とし穴があります。**バージョンを１つ上げる毎に全環境のstateファイルを更新(`terraform apply`を実行)**しなければなりません。

> DEV環境だけ先に `1.0` に上げて、後から本番を `0.12 → 1.0` とアップグレードする

なんてことはできません。

> ファイルを 0.13 に合わせて変更する
> DEV で terraform apply を実行
> 本番 で terraform apply を実行
>
> ファイルを 0.14 に合わせて変更する
> DEV で terraform apply を実行
> 本番 で terraform apply を実行
>
> （以下略）

と、並行してアップグレード作業をすることになります。
【Javascript】戻り値が関数である関数（学習ノート）

# 初めに
関数を戻り値にする関数について学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

# 試してみる
次のようにcalculatesという関数の戻り値が関数である場合を考えてみます。

```javascript
const calculates = function (a, b) {
  return function (c) {
    console.log(a + b * c);
  }
}
```
calculatesに引数を1と２を渡し、変数exampleに格納します。この時、exampleはcという引数を取る関数になります。

```javascript
const example = calculates(1, 2);
//exampleはfunction(c)と同様
example(3);
example(4);
```
![スクリーンショット 2021-06-09 11.03.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/386c804d-03d6-fa0c-93c4-f0975e7f179e.png)
これはfunction(a,b)の戻り値はfunction(c)になるので連続して書くこともできます。

```javascript
calculates(1,2)(3);
calculates(1,2)(4);
```
結果は先ほどと同じです。
![スクリーンショット 2021-06-09 11.03.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/386c804d-03d6-fa0c-93c4-f0975e7f179e.png)

アロー関数を使えば、次のようにさらに短く書くことも可能です。

```javascript
const calAttr = (a, b) => (c) => console.log(a + b * c);
calAttr(1,2)(3);
calAttr(1,2)(4);
```

#参考サイト
https://code-graffiti.com/functions-returning-functions-in-javascript/
インタープリタを作る その17

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
条件分岐を動かす。ループしてみる。


#方針

sregの内部表現に合わせる。

|sreg|フラグ|
|:--|:--|
|sreg[0]|c|
|sreg[1]|z|
|sreg[2]|n|
|sreg[3]|v|
|sreg[4]|s|
|sreg[5]|h|
|sreg[6]|t|
|sreg[7]|i|



cpi,breq,brneを実装する。

#cpiの実装

zフラグのみ

```
	cpi: function(_Rd, K) {
		K = hen(K);
		var Rd = this.dataspace[_Rd];
		var R = [false, false, false, false, false, false, false, false];
		var SREG = this.dataspace[this.sreg];
		R[0] = !!(Rd[0] ^ K[0]);
		R[1] = !!(Rd[1] ^ K[1]);
		R[2] = !!(Rd[2] ^ K[2]);
		R[3] = !!(Rd[3] ^ K[3]);
		R[4] = !!(Rd[4] ^ K[4]);
		R[5] = !!(Rd[5] ^ K[5]);
		R[6] = !!(Rd[6] ^ K[6]);
		R[7] = !!(Rd[7] ^ K[7]);
		SREG[1] = !R[7] && !R[6] && !R[5] && !R[4] && !R[3] && !R[2] && !R[1] && !R[0];
		this.PC++;
		this.dataspace[this.sreg] = SREG;
	},
```

#breqの実装

```
	breq: function(k) {
		if (this.dataspace[this.sreg][1] === true) 
		{
			this.PC = this.PC + k;
		}
		this.PC++;
	},
```

#投入したソース

レジスタ１６が、９になるまでループする。
レジスタ３１の値が、０から９まで変化する。

```
avr.ldi(16, 0x00)
avr.ldi(31, 0x30)
avr.inc(16)
avr.inc(31)
avr.cpi(16, 0x09)
avr.brne(-4)
```

#実行結果

```
0123456789
```

#成果物

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

以上。
mavenでspotbugsが急に動かなくなった話

昨日まであんなに元気にビルドできていたのに急に何故こんなことに。ぴえん。
っていうのはよくある話です。

私もいつものようにバグチェックで mvn spotbugs:sptbugs
ってコマンド叩いたらなんか、エラー出た。

```
なんかエラー
PS C:\Users\hoge\source\repos\hoge-prj> mvn spotbugs:spotbugs
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.852 s
[INFO] Finished at: 2021-06-01T09:52:19+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] No plugin found for prefix 'spotbugs' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C:\Users\hoge\.m2\repository), central (https://repo.maven.apache.org/maven2)] -> [Help 1]
org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException: No plugin found for prefix 'spotbugs' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C:\Users\hoge\.m2\repository), central (https://repo.maven.apache.org/maven2)]
    at org.apache.maven.plugin.prefix.internal.DefaultPluginPrefixResolver.resolve (DefaultPluginPrefixResolver.java:95)
（中略）
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException
```
最初は、pom.xmlの記載不備とか社内ネットワークproxyが不通になったのかとか色々調べたけど
ハタと気づいて、コマンド発行するパスを間違えてるのではってことで、

```
PS C:\Users\hoge\source\repos\hoge-prj> cd .\JavaProject\
PS C:\Users\hoge\source\repos\hoge-prj\JavaProject> mvn spotbugs:spotbugs

[INFO] Fork Value is true
[INFO] Done SpotBugs Analysis....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  07:26 min
[INFO] Finished at: 2021-06-01T10:05:23+09:00
[INFO] ------------------------------------------------------------------------
```
ってことで、無事に動きました。
どうやら、pom.xmlが存在するパスでやらないとダメっぽかったです。
mvn compileは、パスが違っていても通っていたので気づけなかった。

みなさん、カレントパスには気を付けましょう。
【javascript】シンプルな動的tableのinputの値取得

#やりたいこと

　table内のinputからの記事取得
　
　下記参考でわかりやすく解説して下さってますが、inputと値が混同して条件分岐があったため、
　ここではinputのみで、よりシンプルな例で解説しています。
　

###●ひとつ前の記事
[javascriptでシンプルなtableの動的行追加・削除（ボタンクリックで行追加・削除）](https://qiita.com/forever---beginner/items/7901217dc811d72687f8)


###●参考

[【JavaScript】テキストボックスを含むTableからテキストを取得する](https://qiita.com/yamamo_yamayama/items/2a06d6a00023c6e97224)

<br>
#完成

二次元配列に値格納してます。二次元配列はconsoleからご確認下さい。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="hfmst" data-slug-hash="abJjLpv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="table getdata">
  <span>See the Pen <a href="https://codepen.io/hfmst/pen/abJjLpv">
  table getdata</a> by Hirofumi Sato (<a href="https://codepen.io/hfmst">@hfmst</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

<br>

#コード
前回との変更部分だけです。（input取得のみ）
行追加・削除は[前の記事](https://qiita.com/forever---beginner/items/7901217dc811d72687f8)から確認ください。

```javascript:js.html
//inputデータ取得
function getdt(){
  
  let vals = [];     //二次元配列の変数用意
  
  let alltr = tbl.querySelectorAll('tr');   //すべてのtr取得➡alltrに代入。ここはヘッダーもふくんでます。
  
  alltr.forEach(tr=>{                       //alltrから一つずつ取り出してtrにいれて処理
    let alltd = tr.querySelectorAll('td');  //trからtd全部取得
    let arr =[];                            //空の一次元配列を作成（←ここにおいて、forEachで毎回初期化します。
    
    alltd.forEach(td=>{
      arr.push(td.firstElementChild.value); //td一つずつ取り出し、値取得してarrにpush
    })
    vals.push(arr);
  })
  vals.shift();      //ヘッダー削除 
  
  alert(vals);       //確認用
  console.log(vals); //確認用

  return vals;
  
}
```
where、find、find_byはどう違う？

曖昧な理解を正せるようにまとめてみました。
この記事は基礎中の基礎なので、詳細はこちらの記事が分かりやすかったです！
[【Rails】find・find_by・whereについてまとめてみた](https://qiita.com/nakayuu07/items/3d5e2f8784b6f18186f2)

#①結論

**主キー(id)のレコード（データ）を取得したい→find**
**id以外のカラムを検索条件としてレコードを取得したい→find_by**
**id以外のカラムを検索条件として、複数のレコードを取得したい場合→where**

#②findメソッド

主キー(id)のレコード（データ）を取得

```ruby
> Quiz.find(37)

=> #<Quiz:0x00007fb1deaf03d8
 id: 37,
 question: "destroy",
 correct: "破壊",
 incorrect1: "消去",
 incorrect2: "怪獣",
 answer_description: "壊す・破壊です。",
 user_id: 2,
 created_at: Tue, 01 Jun 2021 09:14:50 UTC +00:00,
 updated_at: Tue, 01 Jun 2021 09:14:50 UTC +00:00,
 category_id: 5>
```

条件に当てはまるデータが無ければArgumentError（例外）が投げられる

```ruby
> Quiz.find(132)
ActiveRecord::RecordNotFound: Couldn't find Quiz with 'id'=132
```

#③find_byメソッド

主キー以外を検索条件としてレコードを取得(主キーでも可)
ただし返ってくる結果は、**最初にヒットした１件のみ**

```ruby
> Quiz.find_by(question: "margin")
=> #<Quiz:0x00007fb1dd10eb90
 id: 47,
 question: "margin",
 correct: "余白",
 incorrect1: "マジ",
 incorrect2: "白",
 answer_description: "マージンは外側の余白です。paddingは？",
 user_id: 1,
 created_at: Thu, 03 Jun 2021 03:03:42 UTC +00:00,
 updated_at: Thu, 03 Jun 2021 03:03:42 UTC +00:00,
 category_id: 3>
```

複数の検索条件を指定可

```ruby
> Quiz.find_by(category_id: 3, user_id: 1)
=> #<Quiz:0x00007fb1dd1f68f0
 id: 45,
 question: "background",
 correct: "背景",
 incorrect1: "後退",
 incorrect2: "地面",
 answer_description: "バックグラウンドです",
 user_id: 1,
 created_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
 updated_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
 category_id: 3>
```
条件に当てはまるデータが無ければnilが返ってくる

```ruby
> Quiz.find_by(correct:"時計")
=> nil
```

#④whereメソッド

主キー以外を検索条件として該当するレコードを全て取得
ただし**配列で返ってくる点に注意**

```ruby
> Quiz.where(category_id: 3)
=> [#<Quiz:0x00007fb1ab4ca630
  id: 45,
  question: "background",
  correct: "背景",
  incorrect1: "後退",
  incorrect2: "地面",
  answer_description: "バックグラウンドです",
  user_id: 1,
  created_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
  updated_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
  category_id: 3>,
 #<Quiz:0x00007fb1ab4ca4a0
  id: 46,
  question: "border",
  correct: "境目",
  incorrect1: "ボード",
  incorrect2: "線",
  answer_description: "ボーダーの服は、境目だらけの服ですね",
  user_id: 1,
  created_at: Thu, 03 Jun 2021 03:02:42 UTC +00:00,
  updated_at: Thu, 03 Jun 2021 03:02:42 UTC +00:00,
  category_id: 3>]
```

条件に当てはまるデータが無ければQuiz::ActiveRecord_Relation
が返ってくる（空の配列ではない）

```ruby
> Quiz.where(user_id: 15)
=> []

> Quiz.where(user_id: 15).class
=> Quiz::ActiveRecord_Relation
``` 

#⑤おわりに

Quiz::ActiveRecord_Relationについての理解が0でした。
普通に空の配列だと思ってた...要勉強！
Pythonで全モジュール共通のグローバル変数を扱う方法

#Pythonのグローバル変数
Pythonを使っていると、モジュール間共通のグローバル変数を使いたくなるシーンがあります。

このグローバル変数がとても扱いにくく
関数内からグローバル変数を書き換える場合、
使用前にglobalで変数を宣言しなければいけません。

```python:main.py
global val1

def func1():
    global val1
    val1 = 100

def main():
   global val1
   func1()
   print(val1)
```

扱う変数の量が増えると、行頭のglobal宣言だけで数行埋まってしまいます。

プログラムをクラス化すれば良いのですが、Pythonではクラス変数の前にself.をつけなければいけないという制約があるため、コードが冗長になってしまいます。


また、モジュール外から他のモジュールのグローバル変数にアクセスしようとしても、思うようにいきません。

```python:my_function.py
def func1():
    global val1
    val1 = 100
```

```python:main.py
from my_function import *
global val1

def main():
   func1()
   print(val1)
```

このように書いてもグローバル変数を別モジュールから書き換えることが出来ません。


#共通のファイルをインポートしてas gとする
これらの問題を解決する、とっておきの方法を思いつきました。

global_value.pyという中身空っぽのファイルを作成します(名前は何でも良いです)

```python:global_value.py
#中身は空っぽ
```

使う側で、それをgとしてimportします
そして、グローバル変数をg.val1のように使用します。

```python:my_function.py
import global_value as g

def func1():
    g.val1 = 1
```

```python:main.py
import my_function
import global_value as g

def main():
   func1()
   print(g.val1)
```

こうすることでglobalの宣言は一切必要なくなり
g.をつけた変数はグローバル変数として扱えるようになります。

この変数は、他のモジュールからでも、クラス内からでも自由にアクセスできます。

変数名はやや冗長になりますが、ローカルとグローバルを明示する前置詞として働くため、プラスの効果も大きいと思います。

#グローバル変数のメリット
Pythonはスクリプト言語です。

スクリプト言語は遅いだの、レベルが低いだの難癖を付けられがちですが
他の言語にはない強力な機能が用意されています。

それが、文字列をコードとして扱えるeval関数とexec関数です。

```python
exec("g.val=100")
```
とすれば、g.valの値を100に書き換えることが出来ます。

これがtkinterと変数の同期処理で輝きます。

tkinterウィジェットを管理する辞書のキー値に変数名を用いることで決まったループ処理１つで変数とGUIの同期ができます。

```python:my_gui.py
widgets = dict()
widgets["g.val1"] = widget1
widgets["g.val2"] = widget2
widgets["g.val3"] = widget3

def UpdateValue():
    for key in widgets.keys():
        exec(key+"="+str(widgets[key].data.get()))
  

```
実際はウィジェットクラスに適切な文字列を返すget_data_textメソッドを用意したほうが良いです。

この壁になっていたのが、グローバル変数問題でした。

どうにかしてウィジェットクラス内部から、メインプログラムのグローバル変数を書き換えられないかと悩んでいたら、この方法を思いつきました。

これが、誰かのお役に立てば幸いです。
ActiveHashのデータを使ってプルダウン検索する機能

今回オリジナルアプリの作成で、投稿したコンテンツをジャンル別に表示する機能を調べて実装できたのでここに記録。

こちらもransackというgemを導入することで実装できた。

ransackは複雑な検索機能を可能にするgemで、今回は実装しなかったがソート機能も可能

Gemfileに`gem "ransack"`と記載

ターミナルでbundle install

次に新しいアクションをルーティングに設定するためにroutes.rb

```ruby
get '/movie/genre', to: "movies#genre"
```

genreアクションが実行されると、ジャンル検索結果のページが表示されるように設定。

controllerにbeforeアクションを設定

```ruby
　before_action :search_genre_movie, only: [:index, :genre]

　（省略）

  private

  def search_genre_movie
    @q = Movie.ransack(params[:q])
  end
```

privateメソッドにsearch_genre_movieメソッドを作成。これを実行すると、@q = Movie.ransack(params[:q])という検索オブジェクトが作成される。

次にアクションの定義

```ruby
def genre
    @movies = @q.result
    genre_id = params[:q][:genre_id_eq]
    @genre = Genre.find_by(id: genre_id)
  end
```

genreメソッド内に@movies = @q.resultを記入し、検索結果を取得。この時、binding.pryでparams[:q]にはcategory_id_eqの中にidが入っていることを確認。

次に検索ボックスを作成　今回はindex.html.erbに記載

```ruby
<%= search_form_for @q, url: photo_category_path do |f| %>
    <%= f.collection_select :category_id_eq, Category.where.not(id: 0), :id, :name, include_blank: "カテゴリー検索" %>
    <%= f.submit '検索' %>
<% end %>
```

ransackのヘルパーメソッドsearch_form_forメソッドで、検索フォームを作成。引数に検索オブジェクト@qを渡し、urlのパス名はgenreアクションのパス名(rails routesで確認を)。

パスの指定が完了したので次は実際に検索を行なった後のビューの作成
今回はgenre.html.erbにindex.html.erbと同様のビューに設定。

```Ruby
<ul class='movie-lists'> 
  <%@movies.each do |movie| %>
    <% if current_user.id == movie.user_id %>
      <li class="movie-contents"> 
        <div class="box-movie-genre">
         <%=movie.genre.name%>
        </div>
         <%= link_to movie_path(movie.id), class:"link"  do %>
          <div class="box-movie-image">
           <%= image_tag movie.image, size: '200x210',class: "movie-img" %>
        </div>
        <div class="box-movie-title">
          <%= movie.title %>
        </div>
       <%end%>    
      </li>
     <%end%>
  <%end%>
 </ul>
```

これでプルダウン検索機能実装


補足情報として、３行目のif文に関しては、今回各ユーザーが他者の投稿内容は一切閲覧できない使用にするため。検索で得たgenre_idを持つmoviesの中から、現在のユーザーと投稿したユーザーが同一であれば表示するという条件で表示。こうすることで異なるユーザーの投稿は表示されない。
Ruby クラスとインスタンスの概念を使用したコードの記述

## 問題

```ruby
class Archive

  def initialize(name, title, content)
    @name = name
    @title = title
    @content = content
  end

end
```

上記のコードに追加を行い、以下の出力結果を得られるようにしてください。ただし、クラスとインスタンスを使用するものとします。

```
チャンネル名: Nene Ch.桃鈴ねね
タイトル: 【 #桃鈴ねね3D 】🍑桃鈴ねね3Dお披露目！🍑【ホロライブ/桃鈴ねね】
本文: ホロライブ5期生オレンジ担当、桃鈴ねねです🍑
```

##　回答

```ruby
class Archive

  def initialize(name, title, content)
    @name = name
    @title = title
    @content = content
  end

  def name
    @name
  end

  def title
    @title
  end

  def content
    @content
  end

end

archive = Archive.new("Nene Ch.桃鈴ねね", "【 #桃鈴ねね3D 】🍑桃鈴ねね3Dお披露目！🍑【ホロライブ/桃鈴ねね】", "ホロライブ5期生オレンジ担当、桃鈴ねねです🍑")
puts "チャンネル名": #{archive.name}"
puts "タイトル: #{archive.title}"
puts "本文: #{archive.content}"
```

## 解説

```ruby
  def name
    @name
  end
```

これで@nameというインスタンス変数の宣言。
変数は該当のメソッド、クラス外では使用できないので、

```ruby
  def initialize(name, title, content)
    @name = name
    @title = title
    @content = content
  end
```

にて@name,@title,@contentがある以上、それぞれインスタンス変数を宣言しなければいけない。

```ruby
archive = Archive.new("Nene Ch.桃鈴ねね", "【 #桃鈴ねね3D 】🍑桃鈴ねね3Dお披露目！🍑【ホロライブ/桃鈴ねね】", "ホロライブ5期生オレンジ担当、桃鈴ねねです🍑")
```

この部分でArchiveというクラスにて.newメソッドを使用して、インスタンス変数の生成。
この時のname,title,contentはそれぞれ()で記述しているものが格納される。

```ruby
puts "チャンネル名": #{archive.name}"
```
最後出力。
変数を文字列として出力したい場合は#{}で記述する。
【Salesforce】SalesforceのVisualforceにてPDF出力した際は外字の表示ができない

#問題

取引先責任者の名前が「Arial Unicode MS」でサポートされていない外字を使用していた。

PDFで取引先責任者の名前を使用し、請求書などを作成していた。

#解決策

無し

または要件定義時に「外字は無理」と固めておく必要がある。

#根拠

Salesforceサポートに問い合わせたところ、「本事象を回避して頂く方法はご用意がございません。」と返答有り。

#参考

[PDF出力時の外字について](https://developer.salesforce.com/forums/?id=9060G000000MTF4QAO)

[PDFの作成方法について](https://help.salesforce.com/articleView?id=000335647&type=1&mode=1)

[外字（旧漢字）一覧表](https://toyodo.jp/gaizi_kigou/)
数値計算Ⅰ　朝倉書店　新谷尚義先生

```{r}

#Frame 法

A=matrix(c(202,-176,228,-262,440,-462,-369,504,-561),ncol=3)

row=nrow(A)

a=c(-sum(diag(A)))

A2=A

for(j in 1:(row-1)){

As=A2+diag(a[length(a)],row)

A2=A%*%As

a=c(a,-sum(diag(A2))/(j+1))

}

lam=Re(sort(polyroot(c(a[length(a):1],1)),decreasing=T)) 

Q=function(x){

mat=diag(x^(row-1),row)

a=c(-sum(diag(A)))

A2=A

for(j in 1:(row-1)){

As=A2+diag(a[length(a)],row)

mat=mat+As*x^(row-1-j)

A2=A%*%As

a=c(a,-sum(diag(A2))/(j+1))

}

return(mat)

}


v=array(0,dim=dim(A))

for(j in 1:row){

v[,j]=Q(lam[j])[,1]

}

```
Vue で編集、リバート可能なテキスト

* 普段はテキストだけどダブルクリックするとテキストボックスになるよ
* Enterかフォーカスアウトで確定されるよ
* 渡した値はリアクティブに変更されるよ
* 大丈夫！リバートもできるよ
* 値が変更された時は一応通知が行くよ
* 値が空になった時はプレースホルダが表示されるよ
* リバートボタンとプレースホルダは `<tamplate>` でカスタマイズできるよ

そのうちnpm化してちゃんとドキュメント書きます

```vue
<template>
  <span>
    <!-- bootstrap-vue 使ってたからこれになってるけど普通のinputに差し替えてもいいよ -->
    <b-form-input
      v-if="isEditable"
      ref="content-input"
      :value="value"
      size="sm"
      class="box"
      type="text"
      :style="inputWidth"
      @keypress.enter.native="editableOff"
      @blur="editableOff"
      @input="$emit('input', $event)"
    />
    <span
      v-else
      ref="plain-text"
      class="box"
      @dblclick="editableOn()"
    >
      <span
        v-if="value"
      >
        {{ value }}
      </span>
      <slot
        v-else
        name="placeholder"
      >
        :none:
      </slot>
    </span>
    <span
      v-if="isEdited()"
      @dblclick="revertValue()"
    >
      <slot
        name="revert"
      >
        :rev:
      </slot>
    </span>
  </span>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      require: true,
      default: ''
    },
    identify: {
      type: Object,
      require: false,
      default: () => {}
    }
  },
  data () {
    return {
      isEditable: false,
      originText: '',
      textWidth: null,
      inputWidth: {
        'min-width': ''
      }
    }
  },
  mounted () {
    this.originText = this.value
  },
  methods: {
    editableOn () {
      this.textWidth = this.$refs['plain-text'].clientWidth
      this.isEditable = true
      this.$nextTick(() => {
        // table の中とかにあると input になった時に縮んじゃう事があるから元のテキストのサイズに合わせるようにしている
        this.inputWidth['min-width'] = (this.textWidth * 1.1) + 'px'
        this.$refs['content-input'].select()
      })
    },
    editableOff () {
      // Enterした時にフォーカスアウトで2回ここに来るからガードつけておく
      if (!this.isEditable) {
        return
      }
      this.isEditable = false
      if (this.isEdited()) {
        this.$emit('editedValue', this.identify, this.value, this.originText)
      }
    },
    isEdited () {
      return this.value !== this.originText
    },
    revertValue () {
      this.$emit('input', this.originText)
      this.$emit('revert')
      this.isEditable = false
    }
  }
}
</script>

<style>
</style>
```
GitHubの活動履歴を捏造するアプリを作ったよ

クソアプリ駆動開発中のもぐみです。
この世に無駄なアプリを量産するべくこの活動をひっそり行なっていました。
でも人生に無駄って必要だと思うんですよ。
無駄こそが人生を豊かにすると思います。
それはいいとして。

## 今回作ったアプリ

**自分のGitHubの活動履歴、めっちゃ草生えてる！
自分めっちゃ開発してる！えらい！**

・・・という気分を味わうための、GitHubの活動履歴を捏造するアプリを作りました。

![スクリーンショット 2021-06-08 13.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/39845285-1d4e-b553-77b8-43b498bb6e27.png)

https://mgmgmogumi.github.io/GrowGrass/

使い方は簡単で、草を生やしたい部分をクリックすると緑に変わります。
クリックするごとに濃くなってめっちゃ開発してる人になります。

**・・・ただそれだけです(ヤケ）**

**ほら見て！めちゃくちゃ開発してる！えらい！(※コラージュ)**
![スクリーンショット 2021-06-08 13.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/4fcb2f9f-8b80-f70f-20bd-f6db4233d0b7.png)



コードも**クソ汚い**んですが公開しておきます

https://github.com/mgmgmogumi/GrowGrass

## 最後に
ちなみにクソアプリ開発は今後も続く予定なので、次回作をお楽しみに！

〜弊社の宣伝〜
火曜午前は技術研究の時間に充てられていて有志で開発できるよ！
もぐみと一緒にクソアプリを作りませんか？
https://www.person-link.co.jp/

おしまい
KBID 1 - Path traversal (LFI)をやってみた。

Owaspのやられサイトで勉強してみた。
[KBID 1 - Path traversal (LFI)](https://github.com/blabla1337/skf-labs/tree/master/LFI)

#やられサイトの構築
requirements.txtでパッケージを一括でインストールする。

```
$ pip3 install -r requirements.txt
```

pythonでLFIをたちあげる。

```
$ python3  LFI.py
```

#Reconnaissance
Intro, Chapter 1とChapter 2を選択するプルダウンメニューがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114969/1c929d70-b53e-fb52-2bbb-5f81592eabb8.png)

valueはintro.txtファイルから取得されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114969/e390d9f7-42a5-379c-fdbd-58e6680992b5.png)

`filename`パラメータはシステム内のファイルからコンテンツを取得するために利用されている。
`filename`をユーザーが操作できる状態にあるため、想定外の機密情報を盗まれる可能性がある。

```LFI.py
@app.route("/home", methods=['POST'])
def home():
    filename = request.form['filename']
    if filename == "":
        filename = "text/default.txt"
    f = open(filename,'r')
    read = f.read()
    return render_template("index.html",read = read)
```

#Exploitation

text/default.txtを../../../../../etc/passwdに書き換える。
ペネトレーションテストではLFIの証明によく/etc/passwdを取得しようとする。らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114969/36fd0da0-857e-a140-08f9-834391716f51.png)

Submit buttonをクリックすると/etc/passwd情報が表示される。成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114969/151bec06-a408-b08c-b193-3fd85b34bf65.png)
SoracomBeamのUDP → HTTP/HTTPS エントリポイントを経由してAWS API Gatewayからレスポンスを取得する

SoracomBeamのUDP → HTTP/HTTPS エントリポイント + Raspberry Piを使用してAWS API Gatewayからレスポンスを取得する方法をまとめました

# はじめに
## SoracomBeam UDP → HTTP/HTTPS エントリポイントとは？
SoracomBeamのエンドポイントにUDPリクエストを送るとSoracomBeam側でHttpのPOSTリクエストに変換してくれる機能
この機能では嬉しいことにレスポンスを返してくれるため、UDPを使用しているにも関わらずHTTPのレスポンスを受け取ることができる
詳細は
https://users.soracom.io/ja-jp/docs/beam/udp-http/
に記載されています。

なお、ポイントとしては

```
リクエストBeam は送信されたメッセージを Base64 エンコードしたうえで以下のような JSON にし、HTTP POST リクエストのボディに設定します。
```
の2点
- SoracomからはPOSTでメッセージは送られる
- メッセージはBase64にエンコードされる

# SoracomBeam とRaspberry Piのセットアップについて

## Soracom初期セットアップ
https://soracom.jp/recipes_index/4171/#SORACOM_Air
を参照してセットアップします

# API側の用意
以下の記事を参考にAPIGatewayのサンプル環境を作成
https://users.soracom.io/ja-jp/docs/beam/aws/
ただし
- 今回はUDP → HTTP/HTTPS エントリポイントを使用するのでメソッドはPOSTを設定
- メッセージはBase64に変換されてSoracomからAWSに送信されてくるためLambda側でBase64をデコードする必要がある
があるためLambda関数を以下のように変更しました

```sample.js
// initialize SDK and document client
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context) {
  // insert imsi and timestamp into item object

  console.log(event);
  event.item.imsi = event.imsi;
  event.item.timestamp = event.timestamp;
  const payload = Buffer.from(event.item.payload, 'base64').toString('ascii');
  const obj = JSON.parse(payload);
  event.item.a = obj.a;
  event.item.b = obj.b;
  event.item.c = obj.c;

  // build API parameter
  var params = {
    Item: event.item,
    TableName: 'BeamDemo'
  };
  
  // call PutItem operation
  docClient.put(params, function(err, data){
    if (err)
      context.fail(err);
    else
      context.succeed({Item:params, Result:'success'});
  });
};
```

### 実際にUDPで送信してみる
以下のサンプルプログラムを作成して送信してみます

``` udp_send.py
from datetime import datetime
import socket


print('The client started at', datetime.now())

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b'{\"a\":100,\"b\":200,\"c\":30}', ('beam.soracom.io', 23080))
data, addr = client.recvfrom(1024)
print("at", datetime.now(), "data: ", data, "addr: ", addr)
client.close()

```

### レスポンスについて
```
pi@raspberrypi:~/Downloads $ python3 udp_send.py 
The client started at 2021-06-24 00:52:02.142770
at 2021-06-24 00:52:03.846639 data:  b'{"Item":{"Item":{"payload":"eyJhIjoxMDAsImIiOjIwMCwiYyI6jjjlkg","imsi":"12345678","timestamp":1624463522314,"a":100,"b":200,"c":30},"TableName":"BeamDemo"},"Result":"success"}'
```
上記のようにUDPの送信に対してAWSからのレスポンスを受け取れました。
実際にDynamoDB側にも送信した値が保存されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140658/06ce5a60-f4f1-7b67-a097-b1f0c27dfcbf.png)

# まとめ
SoracomBeamのUDP → HTTP/HTTPS エントリポイントを使用してRaspberry Pi経由でAWS側からレスポンスを受け取れることをまとめました。
参考になれば幸いです
PHP: TCPDF で日本語を取り扱う

Ubuntu 21.04 で確認した方法です。

必要なライブラリーのインストール

```bash
sudo apt install php-tcpdf
```

```php:pdf_create.php
#! /usr/bin/php
<?php
// ----------------------------------------------------------------
//
//	pdf_create.php
//
//
//						Jun/09/2021
//
// ----------------------------------------------------------------
require_once ('/usr/share/php/tcpdf/tcpdf.php');

// ----------------------------------------------------------------
function dict_append_proc ($dict_aa,$id,$name,$population,$date_mod)
{
	$dict_unit = array ();
	$dict_unit['name'] = $name;
	$dict_unit['population'] = $population;
	$dict_unit['date_mod'] = $date_mod;
	$dict_aa[(string)$id]= $dict_unit;

	return	$dict_aa;
}

// ----------------------------------------------------------------
function dict_to_pdf_proc ($pdf_file,$dict_aa)
{
	$pdf=new TCPDF();
	$pdf->setPrintHeader( false );
	$pdf->AddPage();
	$font_path = '/usr/share/fonts/opentype/ipafont-mincho/ipamp.ttf';

	if (file_exists($font_path)) {
		$font = new TCPDF_FONTS();
		$fontX = $font->addTTFfont($font_path);
		$pdf->SetFont($fontX , '', 10,'',true);
		}

	$width = 40;
	$height = 10;

	foreach ($dict_aa as $key => $value)
		{
		$name = $value['name'];
		$population = $value['population'];
		$date_mod = $value['date_mod'];

		print "$key\t";
		print "$name\t";
		print "$population\t";
		print "$date_mod\n";

		$pdf->Cell($width,$height,$key,0,0);
		$pdf->Cell($width,$height,$name,0,0);
		$pdf->Cell($width,$height,$population,0,0);
		$pdf->Cell($width,$height,$date_mod,0,1);
		}

	$pdf->Output($pdf_file,'F');
}

// ----------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");

$dict_aa = array ();

$dict_aa = dict_append_proc ($dict_aa,'t2381','名古屋',72534,'2002-5-14');
$dict_aa = dict_append_proc ($dict_aa,'t2382','豊橋',63473,'2002-8-12');
$dict_aa = dict_append_proc ($dict_aa,'t2383','岡崎',57982,'2002-9-01');
$dict_aa = dict_append_proc ($dict_aa,'t2384','一宮',46329,'2002-10-29');
$dict_aa = dict_append_proc ($dict_aa,'t2385','蒲郡',31765,'2002-7-14');
$dict_aa = dict_append_proc ($dict_aa,'t2386','常滑',29184,'2002-6-12');
$dict_aa = dict_append_proc ($dict_aa,'t2387','大府',82197,'2002-4-17');
$dict_aa = dict_append_proc ($dict_aa,'t2388','瀬戸',91578,'2002-3-24');
$dict_aa = dict_append_proc ($dict_aa,'t2389','犬山',79461,'2002-7-8');


$pdf_file = $argv[1];
dict_to_pdf_proc ($pdf_file,$dict_aa);

fputs (STDERR,"*** 終了 ***\n");
// ----------------------------------------------------------------
?>
```

実行コマンド

```bash
./pdf_create.php /tmp/cities.pdf
```

作成された　PDFファイル
![cities_jun09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/59855caf-548a-30d4-f91a-6abf6c039f51.png)
Dockerコンテナ内からホストのIPアドレスをホスト側から知る

Docker コンテナ内からホストのIPアドレスを知りたいことがあって調べていたのですが、  Qiita の記事 [Docker コンテナ内からホストの IP アドレスを知る](https://qiita.com/jiz/items/ca584ac2012ba6955552) にたどり着きました（感謝）。

が、コンテナ側には、 ip コマンドも route コマンドもありません。 コンテナ側で iproute などのパッケージインストールしても良いのですが、なんかそれも面倒だなあと思いました。

記事を読むとどうも、Gateway の IP がホストのIPになるっぽいと思われます。
なんか無いかと思って調べてみたら、コンテナ側に何もインストールしなくても調べる方法がわかったので、ここにメモしておきます。

## `docker network list` でネットワークを確認

```
$ docker network list
NETWORK ID     NAME                               DRIVER    SCOPE
6c3def7568c1   docker-test_default                bridge    local
```

## `docker network inspect` から、 Gateway を抜き出す

```
$ docker network inspect docker-test_default | grep -i gateway
                    "Gateway": "172.28.0.1"
```

ここでは、172.28.0.1 がコンテナから見たホストのIPアドレスになります。
Beanstalkプラットフォームバージョンアップの手順書

# 経緯
Beanstalkを運用しているとなんやかんやアップデートが結構発生します。
その中でもプログラムのプラットフォームも自動的にアップデートしてくれるので
それについていく必要があります。
今回はPHPのプラットフォームのマイナーバージョンアップでした。
java、pythonなどのプラットフォームも同様だと思います。
イメージとしてはプログラム言語のバージョンアップと言う感じですね。
ですから例えばPHP7からPHP８に上げる場合などは
互換性のテストをしてからアップデートする必要があります。

そして過去バージョンはいずれサポートされなくなります。
※最後に廃止予定スケジュールのURLを貼っています。


# 手順
Beanstalkコンソール画面のプラットフォーム変更ボタンから
最新バージョンを選んで実行するだけ。


# 構成
CloudFront下のBeanstalk環境でテストしました。

# 更新時の動き
更新にかかった時間は約9分。（作業時間は日本時間の平日早朝6時40〜）
更新の際、定期的にブラウザのスーパーリロードを繰り返してみたが
ダウンタイムは発生せず、サイトは表示され続けていました。
おそらくインスタンスを新規に立ち上げ→切り替え→旧インスタンス削除のような動きでスムーズに変更してくれているのだと思います。ログを見る限り。
おそらくCloudFrontなくてもダウンタイムなしで行けそうな感じでした。

# 備考
.elasticbeanstalk/config.ymlファイルを変更してeb deployしてみたのですが
反映されませんでした。createでは反映されていたような気がします。
もしどなたかyamlからeb deployで更新出来たという方いればコメントでツッコミをお願いいたします。

# 参考｜公式
[Elastic Beanstalk 環境のプラットフォームバージョンの更新](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.platform.upgrade.html)
[最新プラットフォーム](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.PHP)
[廃止予定のスケジュール](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/platforms-support-policy.html)
レビューする時に意識したこと

### はじめに
入社3年目ということで、新入社員の課題をレビューをするという役目がついに僕にも回ってきました。そんな僕が数ヶ月程度ですが、レビュー中に意識したことをいくつか書いていこうと思います。

### 1. 画像を使う
文字での説明が難しかったり、文章が長々となりそうな時は画像を使って説明することをしました。画像を使うことで文字よりも何倍も情報量を込められますし、何よりレビューイの理解も早まると思い行っていました。
百聞は一見に如かずってやつですね。

### 2. 要約 + 参考記事
レビューする人のスタイルにもよると思うのですが、僕は参考になりそうな記事のリンクを共有かつ、その記事を自分なりに要約していました。ポイントは要約を書くという所で、そうした方がレビューイが最短距離で今直面している問題について知れるからです。
自分が1年目の時は参考記事の共有だけでは理解できないことが多かったので意識して要約するようにしてみました。

### 3. かっちりした文章にしすぎない
本を執筆しているわけではないし、無機質にただ伝えるだけでは色々とだめな気がするんですよね。
あくまで、人対人のやり取りなので自分らしく簡潔に伝わるようにを常に心がけていました。

### 4. わからないことは周りに聞く
調べる時間が取れなかったり記事を漁っても説明できそうにないことは正直沢山あるので、その時は周りに聞いていました。
時間がたつと聞きづらいので早いと吉です。

### まとめ
人それぞれレビューのスタイルはあると思いますが、自分の中で意識することを決めておくと矛盾なく無駄なくレビューができると思います。
僕の意識していたことでなにか1つでもためになったことがあったら幸いです。
よかったら最後まで見てくださった方の意識していることなども聞いてみたいです！
顔のランドマーク検出のために Dlib をインストールしたときの記録

### 出発地

Python実践データ分析100本ノック

https://www.shuwasystem.co.jp/book/9784798058757.html

の「ノック86:　画像内の人がどこに顔を向けているのかを検出してみよう」で用いられているライブラリ
dlib
のインストールで迷ったので記録しておきます。
環境によって対処方法が異なると思いますが、私の場合はこうでした。

### 環境
OS: windows 10.0
python: 3.7.3
Anaconda: conda 4.10.1

### 実施日
2021/06/09

### 利用ツール
Anaconda Prompt を管理者として実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/58a833a5-7ab0-3733-fb75-c5166cf19508.png)


### 実施コマンド
```
conda install -y -c conda-forge dlib
```

### 到着地
dlib: 19.22.0


```
conda list
# packages in environment at C:\ProgramData\Anaconda3:
#
# Name                    Version                   Build  Channel
（中略）
dlib                      19.22.0          py37h38cb4a7_0    conda-forge
（後略）
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/d51d4469-2c8b-3c25-8754-34d8449efe3b.png)
ちょっとマイナーだけど知っておくと便利なXcodeのショートカット

Xcodeで開発する際に知っておくと便利かつ「こんな機能あったんだ！」と、思うようなショートカットもまとめました。
使いこなしていければ、「へー、そんな機能あったんですか！」等言われたり、開発効率も上がりオススメです。


## ナビゲーターエリア

| ショートカット | 機能 |
|:-:|:-:|
|cmd + 0  |ナビゲーターエリア表示/非表示   |
|cmd + 1   |ナビゲーターエリアのプロジェクト表示   |
|cmd + 2   |ナビゲーターエリアのリポジトリ表示   |
|cmd + 3   |ナビゲーターエリアのシンボル表示   |
|cmd + 4   |ナビゲーターエリアの検索表示   |
|cmd + 5   |ナビゲーターエリアの問題ナビゲータの表示   |
|cmd + 6   |ナビゲーターエリアのデバックの表示   |
|cmd + 7   |ナビゲーターエリアのデバッグナビゲータの表示   |
|cmd + 8   |ナビゲーターエリアのブレークポイントの表示   |
|cmd + 9   |ナビゲーターエリアのレポートナビゲータの表示   |

## エディターエリア
| ショートカット | 機能 |
|:-:|:-:|
|cmd + L   |Line Numberの表示   |
|cmd + Shift + Y   |console表示/非表示   |
|cmd + Shift + L   |UIパーツ選択画面   |
|cmd + Shift + [ or ]   |ミニタブの移動   |
|cmd + control + ← or →   |前に開いていたファイルに移動する   |
|cmd + ,   | Settings > Text Ediditngを開く   |
|cmd + option + N   |ナビゲーターエリアの新規グループ作成   |
|cmd + option + ←   |コードの折りたたみ   |
|cmd + option + →   |コードの折りたたみ解除   |
|cmd + ¥   |ブレークポイントを貼る   |
|cmd + option + [ or ]   |ラインを１行上or下に移動する   |
|control + I   |フォーマット整形   |
|shift + option + ドラッグ   |部分的に複数行選択   |
|shift + control + クリック   |部分的に複数選択   |
|control + command + クリック   |Jump to Definition   |
|shift + cmd + 1   |プロジェクト選択画面を開く   |
|shift + cmd + 2   |デバイス,simulatorsウィンドウの表示   |
|shift + cmd + 8   |画面上にTouch Barの表示   |
|shift + cmd + 0   |documentationの表示   |
|shift + cmd + (-)   |コード画面縮小   |
|shift + cmd + (+)   |コード画面拡大   |
|control + option + cmd + return   |選択したstoryboardのアシスタントエディタを開く   |


## Simulator
| ショートカット | 機能 |
|:-:|:-:|
|cmd + Shift + A   |simulator起動時ライト/ダーク切り替え   |
【Gatsby】え？令和に手動でrel="noopener"付けてるの？それはもうチョベリバ！

# はじめに
こんにちは。先日、知らないうちに**ゆいレール**が延伸しててびっくりしました、しかも最近とかではなく、結構前に...。沖縄に行かなきゃ！筆者です:smile:

さて、先日以下の記事を書いたわけですが、対応として、Contentfulで管理している記事に対して、全記事、ぺちぺち手動で追加して対応したのですが、なんかそれくらいスクリプトでできる気がした次第です。

https://qiita.com/akitkat/items/afab0af057f9bbb213a4


そして、それくらい先人の方々が既に行っているのでは:thinking:
と思ったら、案の定見つけましたので、記事にします！

自分のように**運用でカバー**みたいなことする人が1人でも減ることを切に願っております:pray:

# 外部リンクに自動でrel="noopener"付けるよ！
これで実現できます！

https://www.gatsbyjs.com/plugins/gatsby-remark-external-links/

## 1. まずは以下パッケージのインストール.

**npm**の方:pray:

```sh
$ npm install gatsby-remark-external-links
```

**yarn**の方:pray:

```sh
$ yarn add gatsby-remark-external-links
```

## 2. gatsby-config.js 編集.
noopener未対応ブラウザのために、**noreferrer**も付けました:ok_hand:

```js:gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: `gatsby-transformer-remark`,
      options: {
        plugins: [
          {
            resolve: `gatsby-remark-external-links`,
            options: {
              rel: 'noopener noreferrer'
            }
          },
        ],
      },
    },
  ],
};
```

## 3. build :+1:
buildしましょう :heart_eyes: 

# おわりに
いやー、自動って素晴らしい:smile:
手動なんて大っ嫌いだぜ！

それでは！