OmniAICreator/Qiita-1.07M huggingface dataset:
アルゴリズム力UP!『ABC 103 D - Islands War』を解いてみよう

# 記事を読むとわかること
- 記事の作者の『ABC 103 D - Islands War』の解法がわかる
- 記事の作者のアルゴリズム問題へのアプローチがわかる

# 今回の問題 

**ABC 103 D - Islands War**　→ [問題文はこちら](https://atcoder.jp/contests/abc103/tasks/abc103_d)

# 記事の作者の回答のコード
```python
from operator import itemgetter

# ==============================================================
  # return: N個の島とM個の島と島を行き来させない要望が与えられた時、最低何個の橋を取り除けば良いのか出力
  # pre:  5 2   
        # 1 4
        # 2 5
  # post:　1 -> 2と4の間の橋のみを取り除けば1,4 2,5の行き来ができなくなる。
  # ==============================================================

  # ★ step1  問題文をN,Mをint型にして変数にする
  # ★ step2  与えられたa,bの要望をbが小さい順にソートする
  #                      -> 実装:与えられた要望a bの間の橋を取り除き、行き来ができないようにする。
  #                         idx a b
  #                      -> 0:  1 3                  　1 2
  #                         1:  2 4　なら2,3の間を除外    2 3  なら 1,2 2,3の間を除外
  #                      ->前bのより次のaが小さければ橋を1つ除外, 前bのより次のaの値以上であれば橋が２つ除外
  #                      ->bを小さい順にソートして、前のbの値を次のaの値でみて橋を取り除くかどうかみれるようにする
  # ★ step3 次のaの値が前のbの値以上であるかどうか判定
  # ★ step4 次のaの値が前のbの値以上であれば取り除く個数をインクリメントさせ前のbの値を現在のbの値で更新させる


#NとMを取得
N, M = map(int, input().split())

#M個の島のindexのa,bの行き来させない要望 を配列として取得
ab_requests =  [tuple(map(int, input().split())) for _ in range(M)]

#bの値が小さい順にソートする
#documentをみると key=itemgetter(num)が良さそう -> https://docs.python.org/3/howto/sorting.html
ab_requests_sorted = sorted(ab_requests,key=itemgetter(1))


prev_b = -1
next_a = -1
removed_counts = 0

for a, b in ab_requests_sorted :
  #次のaとして利用する
  next_a = a
  #次のaの値が前のbの値以上であるかどうか判定
  # より大きいケース[(1,2),(3,4)] と 以上のケース[(1,2),(2,3)]に注意
  if prev_b <= next_a :
    #取り除く橋の個数をインクリメントさせる
    removed_count += 1
    #前のbを更新させ、次のaと値を比べられるようにする
    prev_b = b 

#結果を出力
print(removed_count)

```
# 回答の解説

## 記事の作者が思う今回のアルゴリズム問題の回答ポイント

- 実際にイメージできるように具体的な数を入れてみて、どのような場合に取り除く数が増えるのか否かを検証する。(今回であれば前のbの値が次のbの値を比べることで取り除く数が変化する。)
AndroidとiOSですぐに使えるコマンドなど

■iOS
 [debug]  @@ 【 @self.dynamicType@ %B 】hitcount:%H

lldb
n ステップオーバー
s ステップ実行
c 再開

po 変数表示

command ,で設定
command ↓で開く
command ↑で上へ移動
https://www.msng.info/archives/2012/02/keyboard-shortcuts-for-mac-beginners.php

■Android
adb logcat -c ; adb logcat -s debugTst:* AndroidRuntime:E

■各種コマンド
adb shell dumpsys activity | grep -B 1 "Run #[0-9]*:"
->アクティビティを確認
adb shell pm list packages | grep "rakuten"
->パッケージ名確認
adb shell am force-stop jp.co.rakuten.comm.dugong.app.stg
->プロセスをkill
adb shell ps | grep "rakuten"
->killされたことを確認
adb shell am kill jp.co.rakuten.comm.dugong.app.stg
->効果なし

adb shell dumpsys battery unplug
->充電しない状態にする
adb shell dumpsys battery
->給電状態を確認
adb shell dumpsys battery reset
->給電状態をリセット
adb shell dumpsys activity service KeepAliveService
サービス監視
GoogleChatAPIを使ってBotにSlashCommandを追加してみるよ。

こんにちは:relaxed:
あけましておめでとうございます:relaxed:
今年もいっぱい実装して、いっぱい勉強して、こつこつ賢くなっちゃうよ:relaxed:

今日は、GoogleChatAPIを使って作ったBOTにSlash Commandを自作できるようになっていたので、
公式通り追加してみたいと思います。超簡単。

>公式
>[Google Chat API: Developing Slash Commands](https://developers.google.com/hangouts/chat/how-tos/slash-commands)

今回はBotが出来上がっている前提から進めます。
GoogleChatでBotを作る方法は、個別に投稿しているのでそちらを参考にしてくださいー
[GoogleChat の一番簡単なBotを公式通り作ってみるよ](https://qiita.com/akky-tys/items/5b22f93b7bb8872836c5)
[GoogleChatAPIを使って問い合わせを転送するBotを作ったよ](https://qiita.com/akky-tys/items/57b7668dc3af6ad1cab1)




## SlashCommandを追加するよ
まずは[GoogleGloudPlatform](https://console.cloud.google.com/?hl=ja)で作業をするよ。

1.該当のプロジェクトを選んで、hangoutChatAPIの管理画面を開く。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/27c41f83-7bed-1693-625e-9dcc2712244f.png">


2.設定画面よりスラッシュコマンドを追加する。

* Name ・・ /から始まるコマンドの名前。これをChatの画面で選択するのに使用される
* CommandId ・・ uniqueな値。PGMの中でshashCommandの区別をする
* Description ・・　コマンド選択画面で表示される説明。　追加された後の画面を見るとわかりやすいかも。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/bc695654-1755-d095-9ffd-05e390e7d90a.png">

今回は画像の通りの内容で追加、保存を押したよ。

この状態でBotをみてみるよ。メッセージ画面での表示はこんな感じ。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/e419116f-2e05-83c5-a9b1-249645f74163.png">


## GoogleAppScriptで処理を追加するよ。
次にこのコマンドを選択した場合の動きを追加するよ。
onMessage(event)で取得されたevent.messageの中に、slashCommandの情報が入ってくるよ。
commandId = 1 = "hello"がきた場合は、テキストを返すようにしてみるよ。

```js:slashCommandTest
function onMessage(event) {
  
  /// コマンド情報が含まれている場合
  if (event.message.slashCommand) {

    // 設定画面で決めたcommandIdで判別をするよ
    switch (event.message.slashCommand.commandId) {
      case 1:
         return {"text" :"おはよう"}
         break;  
     }
}
```
これで試してみるとこんな感じ。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/238f3323-3334-f2f3-dd81-413bf891d87d.png">


超簡単だね :relaxed: 

###まとめ
公式そのままコピーで簡単に追加ができたね。
/でメニューが出ると、それだけでBotぽいので、活用していくと面白いね。


###参考にさせていただいたもの
公式大好き。リンクバグってるけれど、そこも味だね:relaxed:

>公式
>[Google Chat API: Developing Slash Commands](https://developers.google.com/hangouts/chat/how-tos/slash-commands)
[Flutter] アプリがフォアグランドになった時のイベントを検知する

## やること
1. StatefullWidgetを使用する
2. with WidgetsBindingObserver
3. initState()に処理を追加
4. didChangeAppLifecycleState()をoverride
5. disposeの設定をする

## 内容
```dart
class SampleClass extends StatefulWidget {
  SampleClass({Key key}) : super(key: key);

  @override
  _SampleClassState createState() => _SampleClassState();
}

// 1. with WidgetsBindingObserver
class _SampleClassState extends State<SampleClass> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    // 2. initState()に処理を追加
    WidgetsBinding.instance.addObserver(this);
    });
  }

  // 4. disposeの設定をする
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  // 3. didChangeAppLifecycleState()をoverride
  @override
    Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
      if (state == AppLifecycleState.resumed) {
         // TODO： フォアグランドに来たときの処理
      }
    }
  
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}


```
ISO8601形式で一カ月分の日付を生成する


# 月の集計で使う日付文字列を作りたい

JSONの日付部分だけ置き換えて一か月分のデータ集計をするため、日付文字列を生成したい。
先にカレンダーをリテラルで用意したり、毎日分雑に31回決め打ち処理…はかっこわるいので、日付関係のオブジェクトを利用する。西向く侍もうるう年も心配ないようにする。


# ISO8601形式

日付表現は日付＋時刻のISO8601形式を使う。
日付の取り扱いでよく使う形式。詳しくは省略。

```:ISO8601
20210104T00:00:00      #基本
2021-01-04T00:00:00    #拡張
```



# DateTimeオブジェクトの生成

```powershell:DateTimeオブジェクトの生成
$Year = "2021"
$Month = "1"        #"01"でなくてもよい
$Day = "1"

$Date1 = Get-Date -Year $Year -Month $Month -Day $Day
$Date1.GetType()    #DateTime型
$Date1              #時刻は現在時刻になる

$Date2 = New-Object DateTime $Year,$Month,$Day
$Date2.GetType()    #DateTime型
$Date2              #時刻は00:00:00になる
```

`Get-Date`コマンドレット、または`New-Object DateTime`で年月日を指定してDateTimeオブジェクトを生成する。
`Get-Date`コマンドレットだと指定しない時刻部分はシステムの現在時刻になる。
`New-Object DateTime`だと指定しない時刻部分は00:00:00になる。

時刻は主に00:00:00で使うので`New-Object DateTime`で出したくなるのだが、時刻は時刻で別途指定する場合があるので、生成した日付＋時刻から日付部分だけ取り出すことにする。
なので、今回はどちらの方法で生成しても同じである。


# 日付オブジェクトを一か月分回す

`AddDays`メソッドで日付を加算減算できる。月の末日に1日加えると翌月になってくれるので、翌月になったら処理終了にする。

```powershell:日付を進める
$Year = "2021"
$Month = "1"
$Day = "30"
$Date = Get-Date -Year $Year -Month $Month -Day $Day

$Date               #2021年1月30日
$Date.AddDays(1)    #2021年1月31日
$Date.AddDays(2)    #2021年2月1日
```


# ISO8601拡張形式で一カ月分の日付を生成

```powershell:ISO8601拡張形式で一カ月分の日付を生成
#ユーザー入力
Write-Output "年と月を入力"
$Year = Read-Host "年 yyyy"
$Month = Read-Host "月 MM"
$Day = "1"
$Date = Get-Date -Year $Year -Month $Month -Day $Day

#日付の入った配列生成
$ThisMonth = $Date.Month
$Calendar = New-Object System.Collections.ArrayList
while($Date.Month -eq $ThisMonth){
    $Calendar.Add($Date.ToString("yyyy-MM-dd")) > $NULL
    $Date = $Date.AddDays(1)
}

#配列に文字列型で入っているので、あとから時刻を付け足す

#表示だけなら
$Calendar | ForEach-Object{
    "${_}T00:00:00"
}
#2020-01-01T00:00:00
#～(中略)～
#2020-01-31T00:00:00
```
【Java】フォルダの権限を取得する方法

#プログラミング勉強日記
2021年1月4日
ファイルにアクセスしたらファイルの権限がなく、プログラムが実装できないことがある。フォルダも同様に権限を取得する必要があるので、その方法を簡単にまとめる。

#java.ioでフォルダの権限を取得する方法
　java.ioは古いAPIである。
　フォルダの権限はjava.io.FileクラスのcanWtriteメソッドやisHiddenメソッドで取得する。

```java
import java.io.File;

public class Sample {
    public static void main(String[] args) {
        File file = new File("c:\\test");
 
        if (file.canWrite()) {
            System.out.println("書き込みできます");
        } else {
            System.out.println("読み取り専用です");
        }
 
        if (file.isHidden()) {
            System.out.println("隠しファイルです");
        } else {
            System.out.println("隠しファイルではありません");
        }
    }
}
```


#java.nioでフォルダの権限を取得する方法
　java.nioはJava7から機能を改善した新しいAPIである。
　フォルダの権限はjava.nio.FilesクラスのgetAttributeメソッドで取得する。

```java:サンプルコード
import java.nio.Files;

public class Sample {
    public static void main(String[] args) {
        Path path = Paths.get("c:\\test");
 
        // 読み取り専用なら”true”
        System.out.println(Files.getAttribute(path, "dos:readonly"));
 
        // 隠しファイルなら”true”
        System.out.println(Files.getAttribute(path, "dos:hidden"));

    }
}

```



#参考文献
[【Java入門】フォルダを作成する方法（java.nio.file）](https://www.sejuku.net/blog/20071)
JUCEで作ったプラグインをiOSデバイスで起動する

##問題##
JUCEで作ったプラグインはシミュレーターではそのままで動作するが、実デバイスで動かすにはプロジェクトの設定を変更する必要がある。

##前提##
ProjucerでAudio Pluginを作成している。
AppleにDeveloper登録をして然るべきアカウントの設定はしてある。

##解決方法 1##
ProjucerのiOSのExporter設定でDevelopment Team IDに自分のTeam IDを記入しておく。
![Screen Shot 2021-01-04 at 14.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/a6c182a6-23e5-1b89-f769-69605a6c4eae.png)

##解決方法 2##
Build SettingsのSigningでCode Identityを削除する。下記の部分を選択してdeleteキーを押す。
![Screen Shot 2021-01-04 at 13.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/671efee8-f283-ea2d-723b-3413135e60d5.png)

Signing & CapabilitiesでAutomatically manage signingをオンにする。
![Screen Shot 2021-01-04 at 13.41.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/25aa90f9-5be7-9613-0a97-65e9cac560c2.png)

Enableしていいかどうか聞かれるのでEnable Automaticをクリック。
![Screen Shot 2021-01-04 at 13.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/f2f88f73-591b-aff3-6cc7-9bfa63c32965.png)

Statusが!になっているので、Teamを選択。
![Screen Shot 2021-01-04 at 13.41.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/bb7eadb3-8437-9ca2-6dfc-a60b761ac8cf.png)

このようになっていればたぶんOK。この設定はStandaloneとAUv3(必要なら)の両方で行う。
![Screen Shot 2021-01-04 at 13.42.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107818/38ab11c3-d797-95e6-9d14-7ac819dff22d.png)
自分用メモ

#CodePipelineについて


・複数のCodeBuildを使用
・buldspec.ymlが置いてあるリポジトリとアプリのソースが別
・特定のリポジトリのコミットIDをCodePipelineに組み込んだ各CodeBuildで変数として利用したい

→CodePipelineのソース取得ステージでアクションを増やし、アクションプロバイダにGitHubを指定することで複数のソースを取得するように設定できる。

この時変数の名前空間を設定しておく。
今回はSecondSourceVariables。


CodePipeline上の各CodeBuild設定部分で環境変数を指定
（CodeBuildで設定するのではなくCodePipelineで設定）
Key: COMMIT_ID（任意）
Value: #{SecondSourceVariables.CommitId}　　　##{変数の名前空間.CommitId}

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-variables.html


#gitのコミットIDについて

「.git/refs/heads」のブランチの中に格納されている
CodeBuild上でソースリポジトリ2つの場合下記で行ける模様。
CODEBUILD_SRC_DIR"*_APP*"はソース識別子。

      - HEAD_VALUE=$(cat ${CODEBUILD_SRC_DIR_APP}/.git/HEAD)
      - echo ${HEAD_VALUE}
      - IMAGE_TAG=$(echo ${HEAD_VALUE} | head -c 7)
ツイッターのツイートURLのリンクがAndroidのChromeで上手く表示できなかった件

## ０．初めに

既知で当たり前なのかもしれませんが、TwitterのAPIでツイート検索したURLをAndroidのChrome上で開こうするとおかしくなったのでメモ。

私はGASで試しているときに発見しましたが、GASだけの話ではないと思われます。

おま環の可能性もありますが、一応投稿します。

## １．事象

GASでTwitter Standard search APIで検索して生成したツイートのURLが以下の形式だとAndroidのChromeでは開けない。

[GET search/tweets | Docs | Twitter Developer](https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/api-reference/get-search-tweets)

```
https://twitter.com/i/web/status/（ツイートID）
```

このURLで利用したHTMLのAタグのリンクをタップすると、一瞬、ツイッターのAndrodアプリが起動しようとしますが、結局何も起こりません。

以前はこのURLのリンクを生成すれば、問題なくツイートが表示できました。

当たり前かもしれませんがWindows10では、このような問題は発生せず、普通にリンクが開きます。

## ２．対策案

この対策が正しいのかどうかは不明ですが、以下のようにツイートのURLを生成すればうまく行きました。

```
https://twitter.com/(ユーザーID)/status/（ツイートID）
```

GASの場合なら以下のようにURLを生成すればOKでした。

```javascript
url = 'https://twitter.com/'+json.statuses[i].user.id+'/status/'+json.statuses[i].id_str        
```

※　user.idではなくuser.nameではだめだった。

## ３．終わりに

同じようなことで困っている人がいないような気がするので、違う解決方法があるのかもしれません。

以　上
ubuntuでVScodeでPython3使うときに困った話

GCPを利用してubuntuを使えるようにしてみた。
使い慣れたVSCodeでpythonコードをgithubから落としてきたが、python3がそのままでは使えなかったのでメモ。

codeの左下にPythonのバージョンが表示されているのでクリックするとコマンドパレット（上側の検索バー）にpythonのバージョンが選択肢として表示される。
ココでpython3を選択すれば良いはずなのですが、、、ターミナルでpython --versionを打つと旧バージョンのpython2ですよと表示されます。

下記コマンドを打つとデフォルトを変更できるようです。
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 9

以下、参考サイトです。
https://qastack.jp/unix/410579/change-the-python3-default-version-in-ubuntu
エラー時の対処法

1. エラーメッセージがどこに表示されているのかがわかるか？
2. エラーメッセージに書かれている英語は読めるか？
3. エラーメッセージの言っている意味はだいたいはわかるか？
4. エラーがどこで起こっているかわかるか？
5. エラーの種類(原因)はなんとなくわかるか？
6. エラーを解消するためにどういったアプローチが必要かなんとなくでもわかるか？
7. エラーを解消するための具体的なコードの記述がわかるか？

参考 [プログラミングスクールのメンターを辞めました](https://qiita.com/rhiroe/items/4349b9f412364aa2c729)
arduinoと7SEG

おはよーございます。
こんにちは。
こんばんわん！

今日はarduinoでセンサーを使う時に数値をデジタル表示する方法です。

使ったのは、これ。

7セグメント
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B07L1X5BHR/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07L1X5BHR&linkCode=as2&tag=yukidarumon-22&linkId=31dd27cb486bd87d661067ff24375fe3"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07L1X5BHR&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=yukidarumon-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=yukidarumon-22&l=am2&o=9&a=B07L1X5BHR" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

詳細はコチラを参考に。
https://www.denshi.club/cookbook/output/led/7seg/7led74-tm1637.html

tm1637用のライブラリがあるんですね。
すごく簡単に表示できちゃいました。

これを今使ってるセンサーと組み合わせてなんか作ってみたいです。

以上！！
質問の仕方

## メンターや上司に質問する際は、情報を整理し質問
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/b6337ced-a536-b1c0-a9ae-1282881b3ed3.png)

#### 最低限必要
質問したいことのスクショ等
解決したいこと
調べた内容と立てた仮説
仮説をもとに行なった作業内容

■ 今何をしているか
現時点で自分が何をしようとした時に、この問題または疑問が生じたのかを書く

■ どのような問題が生じているか
どのような問題または疑問が生じているのかを、具体的に書く

#### 説明するためにまとめてたりすると解決出来ることも多いはず

### ★「直接見てもらうから言語化はしなくていい」 と思う方
自身で生じている問題の言語化ができないと、いつまでも人に頼ってしまう
JavaScriptのif文を三項演算子を「使わずに」一行で書く

三項演算子を使ってif文を一行にするというTipsはよく見ます。しかし、僕はelseのない通常のif文すらも一行にしたい…といつも思っていました。これが実はいとも簡単に実現できたので、ここに残したいと思います。

#まずは基本フォーマットから
通常のif文はこちら。

```Javascript:三項演算子を「使わない」基本フォーマット
if (a === b) {
  console.log("Yesなら処理");
} else {
  console.log("Noなら処理");
}
```

これを三項演算子を使って一行にしようとすると、下記のようになります。

```Javascript:三項演算子の基本フォーマット
a === b ? console.log("Yesなら処理") : console.log("Noなら処理");
```

#elseのない通常のif文を一行で書く
```Javascript:三項演算子を使わずに1行で書く
a === b && console.log("Yesなら処理");
```

え？って思うかも分かりませんが、（条件文）&&（処理） とするだけでOK。この「&&」はif文の条件文内で、複数条件が「全て正の時」とする際に使います。しかし、本当の意味は、「左辺が正の時、右辺を処理する」です。よって、上記の条件式では、「a === b」が正なら、「console.log("Yesなら処理")」を処理する、という意味になり、逆に「a === b」が誤なら、「console.log("Yesなら処理")」を処理しません。

実はこれには応用が効きます。「&&」を、おなじみの「||」にすれば、逆の意味、つまり「左辺が誤の時、右辺を処理する」となります。

```Javascript:三項演算子を使わなずに1行で書く
// a === b が誤なら （a !== b なら） console.log("Noなら処理")を処理する
a === b || console.log("Noなら処理");
```

便利ですね！これでかなりコードを短く、かつシンプルで分かりやすくすることができます。最近流行りのReact.jsでも同様に使えます。
基礎力

# 「セルフマネジメント能力・コミュニケーション能力・思考力」の３つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958284/df60597f-0d02-81ce-ace1-8c21c179a661.png)

### セルフマネジメント能力とは
●確かな動機付けのもと自律的な行動や学習ができる
●自分自身をメタ認知し感情と行動をコントロールできる...

### コミュニケーション能力とは
●他者やチームと主体的に対話し信頼関係を構築できる
●自分の意見や価値ある情報を効果的にアウトプットできる...

### 思考力とは
●柔軟にアイデアを発想し新しい価値を創出できる
●適切な問題発見を行い効果的な解決策を実行できる...

# ★思考力を養う行動マインドセット

### [フレームワーク思考]で論理的に考える
フレームワーク思考とは、論理的な枠組みに当てはめて効率よく思考を整理する手法のこと
例えば「そら-あめ-かさ」のフレームワークは「事実／解釈／行動」を分離して捉える思考法
「Why So?／So What?」「演繹／帰納」の関係性は論理構築の基本的なアプローチとして使用

思考のフレームワークを使って、論理的な思考を養っていく

### [ユーザー視点]で創造的に考える
Webサービスを開発するということは、ユーザー体験を実現するということ
エンジニアの現場では、常に高感度の[ユーザー視点]が求められる
自身のクリエイションが
最終的にユーザーのどのような体験(UX)を実現するものなのかを念頭に置く必要がある

まずは、既存のWebサービスを観察し
「使いやすさ・見やすさ・心地よさ」がどのようにデザインされているのかを考察

制作物の構造・動作・外観がどうあるべきかを様々な視点でイメージする力を養うことができる

### [何を解決するのか]を明確にする
問題解決というゴールに向けてゼロイチでものづくりをするのがエンジニアの仕事
また、仕事の大部分は問題解決の積み重ね

常に全体と各部分について[何を解決するのか]を意識することが求められる

特に重要なのは、事実を的確に捉え、解くべき問題を見極めること
[問い]自体が確かな事実に基づいていないと問題解決のプロセス全体は曖昧なものになる

[確かな事実と良質な問い]こそが問題を解決するためには重要

### 日頃から[これは何を解決するものなのか]と考える習慣をつけ問題解決の素養を鍛えていく...
apple silicon macにhomebrewでシェル環境を作る覚え書き

# 追記: 2021/2/11
2/5にリリースされたhomebrew 3.0のインストールスクリプトでは、動作しているアーキテクチャを判別して、

- apple silicon macなら`/opt/homebrew`へ
- intel macなら`/usr/local`へ

インストールを行なうようになったため、「`/opt/homebrew`にarm64なhomebrewをインストール」の項目にある手順は不要になった模様。

なお、rosetta2上での環境の共存が必要な場合に他の項目は有効なため、この記事は残しておく。
参考: https://brew.sh/2021/02/05/homebrew-3.0.0/

# はじめに
なんとなく固まってきたのでメモ。
ベストプラクティスとかわからん。

# 環境
- macOS BigSur (11.1)
- MacBook Air (M1 2020)


# `/usr/bin/local`にx86なhomebrewをインストール
~~未検証だけど、~~terminal.appをrosetta2で動かさなくてもいける~~（はず？）~~
→動作を確認

```bash
arch -x86_64 /bin/bash -c \
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

# `/opt/homebrew`にarm64なhomebrewをインストール
https://docs.brew.sh/Installation
https://qiita.com/usamik26/items/601f5612bd3f8a21cc41
これらを参考に

```bash
cd /opt
sudo mkdir homebrew
sudo chown ${USER}:staff homebrew
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

# `.zshenv`などに書き込む諸々

```bash
# x86かarm64か
function runs_on_ARM64() { [[ "$(uname -m)" = 'arm64' ]]; }
function runs_on_X86_64() { [[ "$(uname -m)" = 'x86_64' ]]; }

# homebrewのインストール先パスのチェック
BREW_PATH_OPT='/opt/homebrew/bin'
BREW_PATH_LOCAL='/usr/local/bin'
function brew_exists_at_opt() { [[ -d ${BREW_PATH_OPT} ]]; }
function brew_exists_at_local() { [[ -d ${BREW_PATH_LOCAL} ]]; }

# パス周り
setopt no_global_rcs #disable path helper
typeset -U path PATH
path=($path /usr/sbin /sbin)

if runs_on_ARM64; then
    # /opt/homebrewを上位にpathに追加、ディレクトリの確認は(N-/)
    path=($BREW_PATH_OPT(N-/) $BREW_PATH_LOCAL(N-/) $path)
    # /opt/homebrew/bin以下、/usr/local/bin以下にある場合
    if brew_exists_at_opt && brew_exists_at_local; then
        # /usr/local/bin 以下を明示して実行
        function lbr() { ${BREW_PATH_LOCAL}/$@; }
        # arch コマンドを使って切り替え
        function x86() { arch -x86_64 $@; }
        function arm() { arch -arm64 $@; }
    fi
elif runs_on_X86_64; then
    # x86_64上で動作している場合、/opt/homebrewのチェックは行わない。
    # arm64上で動作するzshの上でrosetta2のシェルが動作した場合、/usr/local/binが上位に。
    path=($BREW_PATH_LOCAL(N-/) $path)
fi
```
PythonでFTPを使う方法


#はじめに

Pythonでftpを使用する機会がありましたのでメモとして残しておきます。



###FTP接続

```.py
import ftplib

ftp = ftplib.FTP(IP_ADDRESS)
ftp.set_pasv('true')
ftp.login(USER, PASSWORD)
```
*処理の最後には、`ftp.close()`を忘れずに




###ファイルのアップロード(テキスト)

```.py
with open("a.txt", "rb") as f:
    ftp.storlines("STOR /aa.txt", f)
```
*`rb`バイナリーモードで開く必要あり(バイナリー)

###ファイルのアップロード(binary)

```.py
with open("b.txt.zip", "rb") as f:
    ftp.storbinary("STOR /bb.zip", f)
```

###ファイルのダウンロード(テキスト)

```.py
with open("b.txt", "w") as f:
    ftp.retrlines("RETR /aa.txt", f.write)
```

###ファイルのダウンロード(binary)

```.py
with open("b.txt.zip", "wb") as f:
    ftp.retrbinary("RETR /bb.zip", f.write)
```
`with` を使用しない場合はこんな感じ

```.py
# バイナリは rb、テキストの場合は r 
f = open(filename, 'rb') 
ftp.storbinary('STOR {}'.format(PATH), f)
```
*この場合は、必ず`f.close()` をして下さい

###ディレクトリ作成

```.py
ftp.mkd("XXX")
```


###ファイルの一覧の取得

```.py
file_list = ftp.nlst(".")
print(file_list)
```

###エラー処理

```.py

try:
    # process
except ftplib.all_errors as e:
        print('FTP Error :', e)
```

#参考文献

- [[Python] PythonからFTPを実行する](https://www.yoheim.net/blog.php?q=20170401)
- [ftplib](https://docs.python.org/ja/3/library/ftplib.html)
fairseqで推論するときのクラス

ずっとinteractive.pyを改変してやってきましたが、公式にいい関数がありました。

以前の方法
[fairseqのinteractiveをクラス化する](https://qiita.com/izso/items/ea7a23205264079eea7d)

## コード

```python
from fairseq.models.transformer import TransformerModel

class Interactive:
    def __init__(self, spm_path, data_path, checkpoint_path, checkpoint_name):
        #同時処理文数
        self.num = 32

        self.ltos = TransformerModel.from_pretrained(
            checkpoint_path,
            checkpoint_file=checkpoint_name,
            data_name_or_path=data_path,
            bpe='sentencepiece',
            sentencepiece_model=spm_path,
            no_repeat_ngram_size=2
            )

    def inference(self, texts: list):
        result = []
        n = self.num
        for t in [texts[i*n:(i+1)*n] for i in range(len(texts))]:
            result += self.ltos.translate(t)
        return [r.replace("_", " ") for r in result]
```

### 解説

- 基本的には `fairseq.models.transformer.from_pretrained.translate` で推論を行うだけです。
- 100文くらいを同時処理しようとするとメモリを食うせいか遅くなるので、複数文に分けて与えています。
- CPUは搭載数の半分しか使わないみたいです。

今までのコードの5倍くらい早くなりました。
VS CodeとArduinoが喧嘩して文字化けした話

> **Note:** この記事は[しろくま＠胡瓜's Blog](https://shirokuma-89.github.io/20210104/)をQiita向けに再編したものです。よろしければそちらもご覧ください。

<p>遅くなりましたが、あけましておめでとうございます！しろくま＠胡瓜です。</p>

<h2 id="化けた件について">化けた件について</h2>

<p>自分はVS CodeにArduino拡張機能を入れてArduinoのプログラミングを行っているのですが、先日コンパイルしてみると、こんな現象が起こりました。</p>

![](https://shirokuma-89.github.io/img/001-010/004/001.png)

<p>文字化けしてます(´;ω;｀)</p>

<h2 id="環境">環境</h2>

<ul>
  <li>Windows10 Home 20H2</li>
  <li>Visual Studio Code 1.52.1</li>
  <li>拡張:Arduino(Microsoft) 0.3.4</li>
  <li>やる気もりもりの白熊</li>
</ul>

<h2 id="解決方法">解決方法</h2>

<p>まず、以下のディレクトリにアクセスします。</p>

<figure class="highlight"><pre><code class="language-none" data-lang="none">%USERPROFILE%\.vscode\extensions</code></pre></figure>

<p>すると、中に</p>

<figure class="highlight"><pre><code class="language-js" data-lang="js"><span class="nx">vsciot</span><span class="o">-</span><span class="nx">vscode</span><span class="p">.</span><span class="nx">vscode</span><span class="o">-</span><span class="nx">arduino</span><span class="o">-</span><span class="nx">hogehoge</span></code></pre></figure>

<p>というフォルダがあるので、その中にさらにある、</p>

<figure class="highlight"><pre><code class="language-js" data-lang="js"><span class="p">.</span><span class="o">/</span><span class="nx">out</span><span class="o">/</span><span class="nx">src</span><span class="o">/</span><span class="nx">common</span><span class="o">/</span><span class="nx">util</span><span class="p">.</span><span class="nx">js</span></code></pre></figure>
<p>を開きます。</p>

<p>そして、そのファイルの215行目からの</p>

``` js:
if (os.platform() === "win32") {
    try {
        const chcp = childProcess.execSync("chcp.com");
        codepage = chcp.toString().split(":").pop().trim();
    }
    catch (error) {
        outputChannel_1.arduinoChannel.warning(`Defaulting to code page 850 because chcp.com failed.\
        \rEnsure your path includes %SystemRoot%\\system32\r${error.message}`);
        codepage = "850";
    }
}
```

<p>を丸ごとコメントアウトします。</p>

<p>そして、VS Codeを再起動して再コンパイルしてみると</p>

![](https://shirokuma-89.github.io/img/001-010/004/002.png)

<p>勝利です！</p>

<h2 id="おわりに">おわりに</h2>

<p>Arduinoともっと仲良くしたいです。</p>
JavaScriptの関数定義と使い方

#はじめに
ポートフォリオを作成するに当たってJavaScriptの必要性を感じたので勉強を始めました。

JavaScriptの関数定義についてアウトプットしていきたいと思います。

####さっそく書いていきます。


コンソールに名前を出力したい場合には

```main.js
console.log('hello yamada');
```

問題ないですね。 hello yamada と出力されます。
この名前の部分を動的に変えたい場合は変数を使います。
例えば

```main.js
let name = 'yamada';
console.log('hello' + name);
```
さきほどと同様にhello yamadaと出力されます。では、この名前の部分をほかの名前でどんどん出力したい場合はどうしたらいいでしょうか！

```main.js
let name = 'yamada';
console.log('hello' + name);
let name2 = 'yamada2';
console.log('hello' + name2);
```

hello yamada
hello yamada2 と出力されます。
このように記述するやり方もあるのですが、このような記述はプログラム的には良くないケースみたいです。記述量も多くなりますし、バグを生みやすくなります。
そのような時に関数を使用します！

```main.js
function hello(name) {
   console.log('hello' + name);
}

hello('yamada');
hello('yamada2');
```

この関数の記述でも、さきほどと同様に
hello yamada
hello yamada2
と出力されます。
hello();と記述することにより、helloという関数にnameという変数を渡してあげて、どんどん渡された変数がconsole.logに実行される仕組みになります！
()は関数の実行を意味するので、このようにhello();とすることで、定義した関数を実行することができます！
hello という関数には変数を渡せますので、こちらに先ほどのyamadaという文字列を渡してあげます。
nameの部分は引数と呼ばれていて、この引数は複数いれることもできます！
例えば、

```main.js
function hello(name, age) {
   console.log('hello' + name + age);
}

hello('yamada', 10);
hello('yamada2', 20);
```
hello yamada10
hello yamada220となりました。


#おわりに
今回は簡単に関数の使い方について、アウトプットさせていただきました。
関数の記述の仕方はほかにも色々あるので、また別で解説できたらと思います。
深層学習に関する論文執筆をする時に使えるML Visualが100 種類以上のデータビジュアライズを実現してくれる！（日本語翻訳）

PythonのLINEコミュニティーにて、ROM参加していた窪田です。深層学習の論文を読んでいるとよく出てくる格好良いデータビジュアライズってあると思うんですね。それについて質問をしたところ、りむさんがとても良い参考文献を教えてくれました。

ML Visual
https://github.com/dair-ai/ml-visuals

そこで、この内容に感動して、日本語翻訳したものをお送りしたところ、<a href="https://qiita.com/shibafu">shibafu</a>さんにQiitaで書くべきと言っていただけたので、初のQiitaにビビりながら、執筆しております。以下、ML VisualのREADME.mdを日本語翻訳したものになります。りむさん良い文献紹介をありがとうございました！<a href="https://qiita.com/shibafu">shibafu</a>さん、初めてのQiitaを後押ししていただきありがとうございました！

それでは、以下が実際の日本語翻訳版になります。

# ML ビジュアル
[ML Visuals](https://docs.google.com/presentation/d/11mR1nkIR9fbHegFkcFq8z9oDQ5sjv8E3JJp1LfLGKuk/edit?usp=sharing) は、専門的で説得力のある適切なビジュアルや図形を無料で提供することで、機械学習コミュニティが科学コミュニケーションを改善するのを支援するための新しい共同作業です。現在、100以上の図があります（すべてオープンなコミュニティの貢献です）。あなたの機械学習のプレゼンテーションやブログ記事でビジュアルを自由に使用することができます。ビジュアルの使用許可を求める必要はありませんが、デザイナー/著者へのクレジット（スライドノートに記載されている著者情報）を提供していただければ幸いです。以下のビジュアルのバージョンをチェックしてください。

これは[dair.ai](https://dair.ai/)コミュニティによって作られたプロジェクトです。Googleのスライドの最新バージョンは、このGitHubリポジトリにあります。私たちのコミュニティメンバーは、今後のバージョンでより一般的な数字や基本的な要素を追加していきます。これは自由でオープンな成果物やテンプレートであり、自由に簡単にダウンロードしたり、コピーしたり、配布したり、再利用したり、自分のニーズに合わせてカスタマイズしたりすることができると考えてください。

ML Visuals は現在，修士・博士課程の学生や論文（ [今回のようなもの](https://arxiv.org/abs/2010.05113)）などで使用されている 100 種類以上の図の動力源として使用されています．

# どのように使用するのか？
基本的には、すべてのビジュアルと図を維持するためにGoogle Slidesを使用しています（以下のバージョンを確認してください）。独自のカスタム図を追加するには、単に新しいスライドを追加し、基本的なビジュアルコンポーネントのいずれかを再利用します（編集権限を要求することを忘れないでください）。また、スライドのコピーを作成して、好きなようにカスタマイズすることもできます。私たちは、著者/デザイナーがここに彼らのビジュアルを追加し、他の人がそれらを再利用できるようにすることをお勧めします。他の人が他の場所（例えば、ブログ/プレゼンテーション）でビジュアルを使用した場合にクレジットを提供できるように、あなたの著者情報（スライドのノートセクションに）を含めることを確認してください。また、ユーザーがそれがどのようなもので、どのように使用できるのかを理解するのに役立つように、ビジュアルの簡単な説明を記載してください。編集」の許可が必要な場合は、「表示専用」ツールバー（Google Slides）の下にある「編集アクセスを要求する」オプションをクリックするか、ellfae@gmail.com までメールでご連絡ください。

スライドのいずれかから図をダウンロードするのは簡単です。ファイル→ダウンロード→（フォーマットを選択）をクリックするだけです。

図をカスタマイズする際に助けが必要な場合や、他の人にとって価値のあるものを考えている場合は、私たちがお手伝いします。[ここ](https://github.com/dair-ai/ml-visuals/issues/new) で課題を開いていただければ、私たちは最善を尽くしてビジュアルを考え出します。ありがとうございます。

Slackグループへの招待については、 [Twitter](https://twitter.com/omarsar0)で私に連絡してください。

# バージョン
- [Version 1.0](https://docs.google.com/presentation/d/11mR1nkIR9fbHegFkcFq8z9oDQ5sjv8E3JJp1LfLGKuk/edit?usp=sharing)

# 貢献するには？
この研究プロジェクトに関連した進行中のタスクや問題を見るために、  [プロジェクトページ](https://github.com/orgs/dair-ai/projects/8)をチェックすることができます。メインの ml_visuals タグを探してください。良い最初の課題タグを持つ課題は、始めるのに良いタスクです。
また、[課題タブ](https://github.com/dair-ai/ml-visuals/issues)をチェックすることもできます。
このプロジェクトに関連することは何でも私たちの Slack グループで質問することができます。
Slackチャンネル。#ml_visuals

## ビジュアライズの例

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602591/fcee979c-52e9-2ddc-ac36-fa221ab222c6.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602591/b4266df6-4433-24ae-dc43-240e6327f0f8.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602591/c4f9f2b2-f5e8-a856-096f-a03b507f3f96.png)
Postfixadmin MySQL8系 でアカウントを100件以上登録すると起きるエラーの対処

### 事例
MySQL 8系 環境へpostfixadminをアカウント登録が100件を超えるとエラーが出る問題を調査しました。
アカウントの制限(mailboxs)は 「400」 で設定
「100」以内だと、エラーは出ませんが101件(100以上)になると以下のエラーが出る。

```
環境
AmazonLinux2
Apache: 2.4系
PHP: 7.4系
MySQL: 8.0系
postfixadmin: 3.0

エラー
----
DEBUG INFORMATION:
Invalid query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'row FROM mailbox LEFT JOIN alias ON mailbox.username=alias.address LEFT JOIN' at line 2
----
```

### 対策
githubにあるように、MySQL 8系では `functions.inc.php` で使用されている　"row" がmysql8.0.2以降で予約語になっているので、エラーが出ていました。
シングルクォーテションで囲ってあげることで解決します。
[参考]
https://github.com/postfixadmin/postfixadmin/pull/175
https://sourceforge.net/p/postfixadmin/discussion/676076/thread/616c1d25/

```
diff -u functions.inc.php functions.inc.php.org
----
--- functions.inc.php	2021-01-04 11:48:25.273799115 +0900
+++ functions.inc.php.org	2021-01-04 11:48:02.077786591 +0900
@@ -502,7 +502,7 @@
     $page_size_zerobase = $page_size - 1;
     $query = "
         SELECT * FROM (
-            SELECT $idxfield AS label, @row := @row + 1 AS 'row' $querypart
+            SELECT $idxfield AS label, @row := @row + 1 AS row $querypart
         ) idx WHERE MOD(idx.row, $page_size) IN (0,$page_size_zerobase) OR idx.row = $count_results
     ";
----
```

```
■general_log でアドレス一覧を押した時の実行クエリを確認。
----
2021-01-04T03:04:20.873792Z	286377 Query	SELECT count(*) as counter FROM (SELECT mailbox.username  FROM mailbox
 LEFT JOIN alias ON mailbox.username=alias.address  LEFT JOIN vacation ON mailbox.username=vacation.email
 WHERE  mailbox.domain='hogehoge.com'
 ORDER BY mailbox.username ) AS tmp
2021-01-04T03:04:20.874919Z	286377 Query	SET @row=-1
2021-01-04T03:04:20.875065Z	286377 Query	SELECT * FROM (
            SELECT mailbox.username AS label, @row := @row + 1 AS 'row'  FROM mailbox
 LEFT JOIN alias ON mailbox.username=alias.address  LEFT JOIN vacation ON mailbox.username=vacation.email
 WHERE  mailbox.domain='hogehoge.com'
 ORDER BY mailbox.username
        ) idx WHERE MOD(idx.row, 100) IN (0,99) OR idx.row = 100
----
```
Docker for Windowsで時刻ズレ対策

# 概要
事故用メモ

1. WSL2をバックエンドにしたDockerDesktopでaptが`Release file for is not valid yet`エラーを吐いた。

2. [WSL2統合されたDocker for WindowsでaptがRelease file for xxx is not valid yetなエラーになった場合の対処](https://qiita.com/kazuhiro1982/items/8284dec3f892d0fc715a)
の記事に記載の方法である`wsl -d`可能なディストリに対して`hwclock -s`しても解決しない場合の対策として、コンテナ内で時刻調整が有効だった。

# バージョン

Windows 10 build 19042
Docker Desktop 2.5.0.1

# 事象と解決手段

## 事象

`ubuntu:20.04`コンテナに対して以下のコマンドを実行

```bash
apt install build-essential
```
結果、`Release file for xxx is not valid yet`エラー（ログを取り損ねたのがおそらくlibc6）。

WSL側の時刻ズレが原因との記事が多く見られたので以下のコマンドを実行したが解決せず。

```powershell
wsl -d docker-desktop
hwclock -s
```

## 解決手段

WSL側ではなくコンテナ側で`ntpdate`による時刻合わせを行い解決を図ることにした。

```bash
ntpdate ntp.nict.jp
```

を叩くも`Can't adjust the time of day: Operation not permitted`と怒られた。これはコンテナに権限が不足していることに起因している。

`docker run`に`--privilaged`オプションを渡して解決。

```bash
docker run -itd --privilaged --name hoge ubuntu:20.04 
```

権限が多すぎるので危険だけど趣味環境なのでとりあえずこれで解決とする。(SYS_TIME, NET_ADMINだけでは不足だった)
TensorFlow/KerasとPytorch間でモデルを移植する際の注意点

#はじめに

PytorchのモデルとTensorFlow/Keras間でモデルを移植してみても、同じような動作にならないことがある。筆者が気づいた点を記事にする。

#相違点

以下3点について記載する。

* BatchNormalizationのデフォルト値が違う
* WeightDecayの処理
* 入力データの形式の違い

##BatchNormalizationのデフォルト値

tf.kerasのBatchNormalizationのほうが大量にパラメータがある点でも違うのだが、影響が出そうなのは以下の二つのデフォルト値と思われる。


| FrameWork | momentum | epsilon | 
|---|---|---|
| tf.keras | 0.99 | 0.001 |
| PyTorch | 0.1(0.9) | 0.00001 |

PyTorchのmomentumがかなり小さいのは解釈が異なるためで、(1.0-momentum)と計算するとtf.kerasと同じになるようだ。つまりデフォルト値はtf.keras換算で0.9ということになる。

##Weight Decay

Weight DecayはPyTorchではOptimizerの機能として実施される。
一方tf.kerasでは各レイヤーのregularizerで指定する。kernel_regularizerに(必要ならbias_regularizerにも)、tensorflow.keras.regularizers.l2を設定すれば同じ動作になるようだ。

Weight DecayをOptimizerで実施するか、Layerに組み込むかは一概にどちらが良いかは言えないと思われるが、SGDW/AdamWのもとになった論文([Decoupled Weight Decay Regularization](https://arxiv.org/abs/1711.05101))によるとOptimizerの計算前にWeght Decayがあると、SGD以外ではうまく機能しないとされている。tf.kerasのようにregularizerをlayerに内蔵してしまうのはこれにあたるので、PyTorchの実装のほうが結果的に良かったのかもしれない。この論文以降、新しいOptimizerのWeght Decayはこのような問題を回避する方法で実装されているようだが、そうなると移植する際に単純にkernel_regularizerとWeghtDecayの数値を同じにすればよいという話ではなくなってくる。

##入力データの形式の違い

これはもう常識のようだが念のため。
PyTpochではCNN等での画像入力はNCHW形式になる。TensorFlow/KerasではNHWCがデフォルト。
エンジニア向けApple Silicon動作確認 (随時更新)

# Google Chrome
![Screen Shot 2021-01-04 at 12.22.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44018/c70a58bf-971c-94ac-dcb5-0f0c33237a85.png)

[ダウンロードページ](https://www.google.com/intl/ja_jp/chrome/)からUniversal Binaryをダウンロード可能

# Firefox
[ダウンロードページ](https://www.mozilla.org/ja/firefox/new/)からUniversal Binaryをダウンロード可能

# Homebrew
公式インストーラーが対応してのでだいぶ楽になった。
基本的には公式サイトに載っているワンライナーを実行するだけ。

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

Rosseta版を入れたい場合はarchコマンドを使うだけ。

```
arch -arch x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

# Docker

[Download and Try the Tech Preview of Docker Desktop for M1](https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/)の本文中**[Download it here.](https://desktop.docker.com/mac/m1preview/Docker-AppleSilicon-Preview7.dmg)**からプレビュー版をダウンロードできる。

# Python

Python 3.9からネイティブでApple Siliconに対応。Homebrewを入れてる場合は`brew install python`で簡単にインストールできる。

# Node.js

HomebrewからインストールするとApple Siliconバイナリが降ってくる。

# Go

1.16BetaからApple Siliconにネイティブ対応。Homebrewでインストールすると1.15.6という扱いになっているが中身は1.16Betaになっている。　　
[ダウンロードページ](https://golang.org/dl/)からもApple Silicon版を入手できる。

# Parallels

[16.3.1-50393テクニカルプレビュー](https://www.parallels.com/blogs/parallels-desktop-apple-silicon-mac/)で動くようになった。とうとうM1 MacでもWindowsの動作が可能。ただし、ARM版Windowsのみでx86 Windowsは動作しないので注意。
ARM版Windowsは一般向けには配布がないので、[ここ](https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64)からInsider版をダウンロードする。

# Slack

![Screen Shot 2021-01-04 at 12.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44018/6cf256c1-80a0-9a7d-4ee4-1890d711ef23.png)

[ダウンロードページ](https://slack.com/intl/ja-jp/downloads/mac)からApple Silicon版を入手できる。App Store版は私が試した時はIntel版だった。

# Visual Studio Code
![Screen Shot 2021-01-04 at 12.20.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44018/127770a0-e880-8c55-a476-58769e43501f.png)

今のところStable版はRosseta2で動作。これでも十分高速に動くが、Apple Siliconネイティブで動かした場合は[Insiderバージョンをダウンロード](https://code.visualstudio.com/insiders/)するとApple Siliconバイナリを入手できる。上記画像のARM64の小さなボタンをクリックするとダウンロード可能。大きいボタンは通常のIntelバージョンになるので注意。

# Postgres.app

今のところRossetaで問題なく動作している。[公式サイトからダウンロード](https://postgresapp.com/)可能。

# Electron
![Screen Shot 2021-01-21 at 10.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44018/5aa150ab-4c0c-a392-3b1d-5399951771fd.png)


既にStableバージョンがApple Siliconネイティブになってました。

# Heroku CLI

[公式ドキュメント](https://devcenter.heroku.com/ja/articles/heroku-cli)に書いてある手順でインストール可能。特に不具合もなく動いている。
下記のコマンドで簡単に入る。
`brew tap heroku/brew && brew install heroku`
Node.jsを勉強する④ - npmモジュールを使う

##はじめに

前回は[Javascriptファイル間の連携](https://qiita.com/arata0520/items/5396b514876e542334bc)についてまとめました。
今回はnpmモジュールの使い方を記事にします

##教材
Udemy
The Complete Node.js Developer Course (3rd Edition)
https://www.udemy.com/course/the-complete-nodejs-developer-course-2/

##npmモジュールを開始する
ルートディレクトリでnpm initのコマンドを実行することでコンフィギュレーションファイルを作成し、npmモジュールの使用を開始する


```terminal:ターミナル
npm init
```

するとpackage.jsonという名前のファイルが作られます。

```JSON:package.json
{
  "name": "notes-app",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

```

##npmモジュールをダウンロードする
https://www.npmjs.com/ にアクセスして、使用したいパッケージを探します。
今回はvalidatorを使います。validatorとサーチして、ページに飛んだら、右上のインストール用のコードをコピーします。
![validator-npm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360425/dff643bc-f716-765c-a636-33885a1dbc10.png)

ルートディレクトリでこちらのコードを実行します。

```terminal:ターミナル
npm i validator
```

すると、package-lock.jsonファイルが追加され、さらには、package.json内のdependenciesの中にvalidatorが表示されます。
これで、インストールが完了しました。

##Validatorを使う
それでは、validatorを使ってみます。validatorを使いたいjsファイルに変数validatorを定義し、require('validator')を代入します。今回は、app.jsとファイルを名付けました。

```javascript:app.js
const validator = require('validator')
```

こちらで、準備は完了です。実際に使ってみます。
仮にtest2021@example.comがEmailとしての要件を満たしているか調べて、結果を出力します。

```javascript:app.js
const validator = require('validator')
console.log(validator.isEmail('test2021@example.com'))
```

```terminal:ターミナル
node app.js
true
```
Emailとしての要件を満たしているので、trueが出力されます。
その他のメソッドは、Validatorの使い方は、[公式](https://www.npmjs.com/package/validator)に記載がありますので、その都度参照します。
Flutterで作ったAndroidアプリをFirebaseで配布する



## 目次
 1. アプリをビルドする
     1. 事前準備
     2. APKのビルド
 2. APKファイルをFirebaseコンソールから配布

## 参考

- https://qiita.com/kasa_le/items/d23075d817f42e869778
- https://flutter.dev/docs/deployment/android


## 事前準備

### 1. build.gradleの変更

```
buildTypes {
  debug {
    resValue "string", "app_name", "(d)アプリ名"
    applicationIdSuffix ".debug"
    versionNameSuffix "-d"
  }
  release {
    resValue "string", "app_name", "アプリ名"
  }
}
```

### 2. マニフェストファイル変更

```xml
// AndroidManifest.xml

<application
	android:name="io.flutter.app.FlutterApplication"
	android:label="@string/app_name"
	android:icon="@mipmap/ic_launcher">
```

### 3. アプリアイコンの作成

- [flutter_launcher_icons](https://pub.dev/packages/flutter_launcher_icons) パッケージを利用する

```yaml
// pubspec.yml
dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_launcher_icons: "^0.8.0"

flutter_icons:
  ios: true
  android: true
  image_path: "assets/icon/launch_icon.png"
```

- パッケージを実行

```shell
$ flutter pub get
$ flutter pub run flutter_launcher_icons:main
```

- ファイルが生成される
  - `android/app/src/main/res`
  - `ios/Runner/Assets.xcassets/AppIcon.appiconset`



## APKのビルド

### 1. アップロード鍵の用意(証明書の作成)

[![Image from Gyazo](https://i.gyazo.com/da7cb45197f65ff376e4d3ba4b188655.png)](https://gyazo.com/da7cb45197f65ff376e4d3ba4b188655)

- 作成したkeyを `android/app` 下に配置する

### 2. 署名情報ファイルを作成
`android/`直下に`keystore.properties`ファイルを作成する

```keystore.properties
storePassword=パスワード
keyPassword=パスワード
keyAlias=alias_name
storeFile=release.jks
```

### 3. build.gradleを編集

```
// 追加する
def keystorePropertiesFile = rootProject.file("keystore.properties") 

android{
   ...

    defaultConfig {
        ...
    }
    
    signingConfigs {
        release {
            if (keystorePropertiesFile.exists()) {
                def keystoreProperties = new Properties()
                keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
    }
    
    buildTypes {
        debug {
            ...
        }
        release {
            resValue "string", "app_name", "アプリ名"

            // 以下を追加
            signingConfig signingConfigs.release
            // 追加ここまで
        }
    }
 ...
}

```

### 4. .gitignoreに追加

```
# Android key
*.jks
keystore.properties
```

### 5. APKビルド

```sh
$ flutter build apk

# main.dartを変えたい場合
$ flutter build apk --target lib/main_production.dart
```


## APKファイルをFirebaseコンソールから配布

1. Firebaseコンソールに接続
2. (なければ)Androidアプリを登録(applicationIdが必要)
3. AppDistribution > APKドラッグ＆ドロップ > 配布

## 結び

- Androidを配布＆公開したことがなかったので知らないことが多かったです
- ただ思っていたよりも記事も多かったのでサクサク進みました。皆々様に感謝。
ブラウザから Azure 上の仮想マシンに接続してみる：Azure Bastion の構築

# 1. はじめに

業務において Microsoft Azure 上に仮想ネットワークを構築することになった。
セキュリティの観点から、各仮想マシンにはパブリック IP を割り当てないこととしたのだが、その際に「各仮想マシンに実際に接続して設定等を行いたいのだが、どうすればいい？」というところで詰まったので、その備忘として記載する。

実現したいこととしては、VMware において仮想マシンへ接続する際に、ブラウザから直に接続できるけど、それを Azure でも実現したい！！って感じ。

どうやら、Azure には [Azure Bastion](https://yoshitaku-jp.hatenablog.com/entry/2019/07/12/170000) という踏み台サーバ的なもの？があるらしく、それを使えば Web ブラウザから直に仮想マシンへ接続できるらしい。ということで、その構築メモ。

# 2. 構築環境

* 使用端末：MacOS
* 使用ブラウザ：Google Chrome
* 構築仮想マシン：Linux および Windows10

※ ものすごい簡潔なイメージは以下の通り。
「パブリック IP 割り当ててないけど、仮想マシンにアクセスできるじゃん！」って状態にしたい。
業務で構築予定のネットワークには、以下に加えてサブネット作成とかファイアウォール設定が入ってくるので、もうちょい複雑。

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/d62d8da1-8fbd-44c5-52a1-2e0c187b080d.png)


# 3. Azure Bastion 構築手順

大まかに以下の 4 手順になるかと思われる。

>① アドレス空間を設定
② Azure Bastion 用のサブネットを作成
③ 仮想マシンを構築後、Bastion で実際に接続
④ 対象仮想マシンへの接続を確認

以下、詳細。

<b>① アドレス空間を設定</b>

Amazon Web Service とか Google Cloud Platform とかも同様かと思うが、
仮想マシンの作成前にまずは仮想ネットワークの作成からやるのが良さげ。
Azure の場合、「アドレス空間」作成 → 「サブネット」作成、という手順になるぽい。
Azure Bastion のための専用サブネットが必要なので、その作成準備。

![figure2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/ab377ee6-10d0-9e4f-8131-36b9e0a20389.png)

<b>② Azure Bastion 用のサブネットを作成</b>

![figure3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/7aa4a02e-9d43-7c79-3e9b-02b284ff66c6.png)

なんか色々他にもサブネットがあるけど、今は無視いただければ。

<b>③ 仮想マシンを構築後、Bastion で実際に接続</b>

仮想マシンを構築し(多分 Bastion とは別のサブネットを用意の上、そのサブネット上に作成する必要あり)、その仮想マシンの詳細画面へ。
「接続」タブがあるのでそこから Bastion を選択。
ユーザ名・パスワードを入力し、接続。

![figure4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/a9bcfd71-a768-ba1e-5795-dceccd693749.png)

<b>④ 接続確認</b>

以下のように、Google Chrome ブラウザにて、Windows10 に接続できる。

![figure5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/b8e6ff63-8524-03c1-bc92-fb1c07062827.png)


以上で、ブラウザから Azure 上の仮想マシンへの接続が実施できる。

# 4. まとめ

* ここまでの手順により、以下のようなネットワークが構築されているはず。
1 つの仮想ネットワークの中に、Bastion 用と仮想マシン用のサブネットの合計 2 のサブネットが構築されている。
![figure6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/18cdf4fa-bedc-619e-56e3-77cbd9dc101d.png)
* 調べたところ、Azure Bastion は有料。
以下によると 1 時間あたり 20 円強。停止もできない(常時起動 or 削除)みたいなので、コストは注意が必要そう。<br>
https://azure.microsoft.com/ja-jp/pricing/details/azure-bastion/
* 今回は Azure で確認を行ったが、AWS と GCP で同様に「ブラウザからの仮想マシン接続」ができるのか？は調べてみたい(正直怪しい感じはしているが)。気が向けばこの調査結果も記事として投稿するかも。
* また、ファイアウォールも駆使してもうちょいセキュアなネットワーク構築も試す予定。Azure では一度経験済なのだが、AWS とか GCP ではまた勝手が違いそう。

今回は以上。
参考になれば幸いです。
WordPressのコメントが表示されないと思ったら...

# jetpackがオフでワードプレス設定してもコメント出なかった

![fqkn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135794/701785e9-1928-0c1c-2742-38a138da1365.png)
M1 MacBookProでDocker Desktopが起動できなかったときの対処法

## M1 MacBookProでDocker Desktopが起動できなかったときの対処法

### エラー内容
M1チップ搭載の新しいMacBookProを買ってみたが、[Docker Desktop（Preview7）](https://docs.docker.com/docker-for-mac/apple-m1/)が以下のようなエラーで起動しなかった。。
![errorImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117130/26e0f524-4554-c6b7-4ee2-09b01e1f3b61.png)

ターミナルで見るとこんなエラー

```console:
docker --version
zsh: bad CPU type in executable: docker
```

### 対処法
ターミナルからRosetta2をインストールするとDockerが無事起動した。

```console:
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
```

### 参考
https://www.gitmemory.com/issue/docker/for-mac/5155/748248913
マカフィーリセーブのファイアーウォール設定の例外追加

# マカフィーリセーブのファイアーウォール設定の例外追加

タスクバーの 上向き矢印をクリックして赤丸をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/e023367c-74f3-16d8-d756-ff1bebd7d362.png)

`マカフィーリセーブを開く` を選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/78ba03f2-cc6e-b0ba-06d7-e4b3972cbff9.png)

`セキュリティ` タブを選び、`ファイアーウォール` を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/99f3846d-fcd0-b45c-5e0d-750269c38d28.png)

`ポートとシステムサービス` を選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/00c2baed-8060-ee4b-3378-116e173f2b32.png)


`追加` を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/cd35cb45-f6e7-6488-9cf0-16d196703868.png)


赤丸のところでスクロールバーがあり、必須のポート設定の部分が初期状態で隠れている。
`単一のポート番号をカンマ区切りで入力するか、ダッシュ記号を使ってポート範囲を入力します` の説明が、次のページの、`ローカルTCP/IPポート:` と `ローカルUDPポート:` にかかっているが、それがぱっと見でわからない。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/961037c7-207f-8f4a-e29e-7ce95c11ebe4.png)

スクロールすると、TCP のポートの設定や UDP のポートの設定が現れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/88185b96-861f-b6a4-9411-5f0e362162f7.png)

もうちょっと、このインターフェースは改善の余地があるように思う。

* 必須でない、サービスの説明を次のページする
* 二段組にして1ページに収まるようにする
* 設定が 2ページに分かれていることがわかるような表記をする

など

`詳細を見る` のリンクがあって https://smarthelp.mcafee.com/help/mcafee/18.8/ui/total%20protection/ja-jp/GUID-B767F9C8-78F0-4F1E-83E0-33AA951C5218.html のヘルプを開くことができるが、文字だけでスクリーンショットがない。

以上。
行動の習慣化

# 行動を習慣化する理由
　- 合理的な学習行動を身につけることで、より高い学習成果を得ることができる
　- エンジニアとしての思考特性や行動特性を養うことができる
　- 行動習慣を徹底し継続することで、自己肯定感を高めることができる

# 行動習慣ルール
このルールを日々意識して徹底
これらのルールについて確認し自己評価する
決めたことに対して理由も設定してあげる

#例えば

### どんな状態を目指すか
[生活習慣と心身のコンディションについて]
 -1日6時間以上の睡眠時間を確保
 -朝の身支度を整えた上で、学習や仕事開始10分前には準備が完了

[学習環境について]
 -雑音が入らないよう工夫
 -関係のないものが視界に入らないようにする

[学習中の行動について]
 -学んだことはアウトプットする

### なぜ必要か
 -1日6時間以上の睡眠時間を確保
→睡眠は心身のコンディションに直結しているため

 -雑音が入らないよう工夫
→雑音を遮断することで、集中の導入と維持に大きな効果が期待できるため

 -学んだことはアウトプットする
→知識を定着、理解を深めるため
GoogleWorkspaceでユーザが二段階認証で入れなくなった場合の対応方法

# はじめに
ユーザが二段階認証ができなくなった場合、管理者の操作を書いてみました。
Googleの記事は[こちら](https://support.google.com/a/answer/9176734?hl=ja)。

# 手順
1. [Google 管理コンソール](https://admin.google.com)にアクセス
2. [ユーザ](https://admin.google.com/AdminHome#UserList:org)にアクセス![スクリーンショット 2021-01-04 11.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/fa1241ea-4072-7cf0-a1d2-1bfd20aeb577.png)

3. 該当ユーザを探す![スクリーンショット 2021-01-04 11.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/30cc5c89-1a33-aaf9-efdf-b172e4149203.png)

4. 該当ユーザの「セキュリティ」まで移動して、選択する。![スクリーンショット 2021-01-04 11.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/563166bc-99f4-1d78-1372-08cd4a2b1d01.png)

5. 出てきた画面から、「バックアップコードの確認コードを取得」を選択![スクリーンショット 2021-01-04 11.18.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/abd29e9b-6d84-7006-eade-ce2350bdc3a6.png)

6. 出てきたバックアップ確認コードコピー、ユーザに送る![スクリーンショット 2021-01-04 11.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/2269d635-59d1-2111-460a-b4be0e50b3c6.png)

7. いつもどおりのログインのあと、確認コードを入れる画面が出るので、そこで先程のバックアップコードを入力する。
8. ユーザに二段階認証の設定をしてもらう

# 終わりに
機種変更などで、アクセスできなくなった場合、この方法を使えばアクセスもできるようになります。
また二段階認証を導入するときに、ユーザがすっ飛ばした場合も同じです。（何故飛ばしたのか、、、）
ぜひご活用ください。
Docker、Railsでcreated_atやdatetimeなどの時間が日本時間で保存されないときに確認すること

#### 結論
Docker、Railsでcreated_atやdatetimeなどの時間が日本時間で保存されないときはrubyのコンテナ内のtimezoneを確認しよう。

このようにconfigに書くといいとぐぐるとたくさん出てくる。
環境がhomebrewだとこれでいくと思われる。

dockerだとコンテナ内のtimezoneをAsia/Tokyoにする必要が出てくる。

```config/application.rb
module App
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    config.time_zone = 'Asia/Tokyo'
    config.active_record.default_timezone = :local
```

なのでこちらを追加する。

```:rubyのDockerfile
ENV TZ Asia/Tokyo <= こちらを追加(docker-comopse.ymlのほうでもよい)
```

もし、これでもうまくいかなかったらDBのコンテナのtimezoneも確認して'Asia/Tokyo'にする必要があるかもしれません。

参考ページ
[Dockerコンテナのタイムゾーン設定を変更する \- 箱のプログラミング日記。](https://www.y-hakopro.com/entry/docker_timezone)

[RailsでTime\.nowが日本時間にならないときはTZを確認しましょう \| TOMILOG](https://blog.ryou103.com/post/rails-docker-timezone/)

[RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い \- Qiita](https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)

[Railsと周辺のTimeZone設定を整理する \(active\_record\.default\_timezoneの罠\) \- Qiita](https://qiita.com/joker1007/items/2c277cca5bd50e4cce5e)

[Docker\+Rails6でTimeZoneをUTCからJSTに変更する方法！設定方法はとても簡単！ – himakuroブログ](https://himakuro.com/modify-timezone-to-jst-in-rails#i-2)

[MySQL :: MySQL 5\.6 リファレンスマニュアル :: 10\.6 MySQL Server でのタイムゾーンのサポート](https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.html)
【Rails6 + ActionMailbox】ActionMailboxで受けとったGmailのプレーンテキスト抜き出した方

#課題
ActionMailboxで受けとったGmailは簡易版か否かでプレーンテキストの抜き出し方が違う。
恐らく他のメーラーもどちらかに該当する。。。。はず。

#結論
プレーンテキストのそれぞれ抜き出し方。
Gmail簡易版 -> mail.body.decoded
Gmail現行版 -> mail.text_part.body.decoded


```ruby:plain_text抜き出し例
def plain_text
  mail.text_part.nil? ? mail.body.decoded : mail.text_part.body.decoded
end
```

最初 gem 'sanitize' でも必要かと思って焦りました。
常識の範囲の知見なのに思いの外つまづいた。
エラーが出てpush出来なくなった！！[error: failed to push some refs to]


●現象
エラーが出て、pushが出来ない

●エラー内容
error: failed to push some refs to "~~"

●原因は？
コンフリクトが出来ていたのをgit lab上で直したため、
リモート上のコミット履歴と、ローカルでのコミット履歴に差ができてしまいエラーが起きている。

以下のような状況です。

■ローカル
コミット履歴B(レビューの修正事項)
コミット履歴3
コミット履歴2
コミット履歴1

■リモート
コミット履歴A(コンフリクトの解消)
コミット履歴3
コミット履歴2
コミット履歴1


●対処法は？

今回は以下の手順で解決しました。
①修正作業をしたローカルの[sample_branch]をコピーし、[sample_branch_copy]を作成
②ローカルの[sample_branch]を削除
③リモート上の[sample_branch]をローカルに反映(コンフリクト解消したコミット履歴Aを獲得)
④コピーした[sample_branch_copy]から、修正作業を取り出す
⑤新しく反映したローカルの[sample_branch]に、取り出した作業内容も追加反映
⑥[sample_branch]を改めてコミット、pushする

●操作コマンド

```
git branch sample_branch_copy
# コピーを作成

git branch -d sample_branch
# ローカルのブランチを削除

git fetch
# リモートブランチをローカルに反映(リモートのsample_branchを取得)
```

```:ブランチ名：sample_branch_copy
git reset --soft HEAD^
#コミットを取り消し、作業中の状態に戻す(直線のコミットの取消)

git stash
# 修正した作業を取り出す
```

```:ブランチ名：sample_branch
git stash pop
# 修正した作業内容を反映
```

```
git branch
git log
# 上記コマンドでブランチ・コマンドの状況を常に確認する
```

●エラーを今後起こさないためには、、、

今回のケースでは、git lab上でコンフリクトを修正したため起こってしまいました。
そのため、今後はローカル上でコンフリクトを修正することで回避することが可能です。