OmniAICreator/Qiita-1.07M huggingface dataset:
【Salseforce】thisキーワードの謎

# はじめに
Apexには[thisキーワード](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_keywords_this.htm)が用意されています。
`this`付きで変数にアクセスすることで、その対象変数がクラスのメンバ変数であることを明示できます。（ローカル変数と区別できる）

```apex
public class Sample {

  //クラスのメンバ変数
  String color = '赤';

  public void printColor() {
    //ローカル変数
    String color = '青';
    System.debug('ローカル変数color -> ' + color); // 青
    System.debug('メンバ変数 this.color -> ' + this.color); // 赤 
  }
}
```
上記はプリミティブ型（String）メンバ変数の例となりますが、
一方で、**`SObject`型メンバ変数**へアクセスする際、`this`キーワードの有無で異なる動きが観測されたので備忘録として残しておきます。


# なにがわかったのか？
簡単に言うと、**SObject型メンバ変数がNullの場合でも、thisを付けてアクセスするとNullPointerExceptionが発生しない**ことがわかりました。

まず、以下のコードはNullPointerExceptionが発生します。
```apex
public class Sample {

  //クラスのSObjectメンバ変数
  public Contact sampleContact;

  public void printContactName() {
    // sampleContactはNull（非インスタンス）なのでName項目にアクセスできず例外発生
    System.debug(sampleContact.Name); // <- System.NullPointerException: Attempt to de-reference a null object
    System.debug('finish'); // <- 表示されない
  }
}

Sample sample = new Sample();
sample.printContactName();
```

しかし、以下のように`this`を付与してメンバ変数にアクセスするとNullPointerExceptionは発生しません。
```apex
public class Sample {

  //クラスのSObjectメンバ変数
  public Contact sampleContact;

  public void printContactName() {
    // sampleContactをインスタンス化していないが、Name項目を参照可能
    System.debug(this.sampleContact.Name); // <- 結果はNullだが、NullPointerExceptionは発生しない
    System.debug('finish'); // <- 表示される
  }
}

Sample sample = new Sample();
sample.printContactName();
```

もちろん、thisあり/thisなしの2つは同一データです。
```apex
public class Sample {

  //クラスのSObjectメンバ変数
  public Contact con;

  public void printContactName() {
    System.debug(this.con === con); // <- true
  }
}
Sample sample = new Sample();
sample.printContactName();
```

以上のように`this`キーワードの有無で挙動が異なるのですが、原因は不明です。

その他にも色々試してみました。

## １．SObjectメンバ変数のリレーション項目へアクセスしてみる
リレーション項目も`this`をつければアクセスできます。もちろん、`this`無しはNullPointerExceptionが発生します。
```apex
public class Sample {

  //クラスのSObjectメンバ変数
  public Contact con;

  public void printContactName() {
    // Contactのリレーション項目Accountの名前にアクセス
    System.debug(this.con.account.name); // <- 結果はNullだが、NullPointerExceptionは発生しない
    System.debug('finish'); // <- 表示される
  }
}
Sample sample = new Sample();
sample.printContactName();
```


## ２．メンバ変数をクラス外から直接参照してみる
クラス外からNullのSObjectメンバ変数に直接アクセスした場合、こちらもNullPointerExceptionは発生しないようです。
```apex
public class Sample {
    public Contact con ;
}

Sample sample = new Sample();
// Sampleクラスのメンバ変数
System.debug(sample.con == null); // <- true
// 項目
System.debug(sample.con.name == null); // <- true
// リレーション
System.debug(sample.con.account == null); // <- true
// リレーション項目
System.debug(sample.con.account.name == null); // <- true
```

# さいごに
以上、`this`キーワードの謎についてでした。
クラスをnewした際にSObjectメンバ変数の初期化のような処理が行われるのだろうか・・🤔？と考えましたが、理由はわかりません・・
とりあえず、
クラス内部からSObject型メンバ変数にアクセスする場合、常に`this`キーワードを付与することでNullPointerExceptionが発生しないようになるため、忘れずに付与したいところです。
Linux: nohupと&の違い


## `nohup` と `&` の違い

`python test.py` というコマンドで説明しますと、

| コマンド                 | `ctl+c`                    | ターミナルを終了           |
| :----------------------- | -------------------------- | -------------------------- |
| `python test.py`         | コマンドが中断される       | コマンドが中断される       |
| `python test.py &`       | コマンドが**中断されない** | コマンドが中断される       |
| `nohup python test.py`   | コマンドが**中断される**   | コマンドが**中断されない** |
| `nohup python test.py &` | コマンドが**中断されない** | コマンドが**中断されない** |

中断されなく残ってしまう場合は、ちゃんと kill しましょう。

```bash
ps -ef | grep test.py
kill -9 {pid}
```

## 参考記事

[Linux 中的 nohup 和&区别](https://juejin.cn/post/7070388683240636452)

## 元記事

[Linux:nohupと&の違い](https://aifan.jp/2022/03/09/linux-nohupと-の違い/)
AngularでBootstrap iconsを利用する

BootstrapのiconをAngularで使うための方法を試してみました。
Angularで使いやすくするためのライブラリは特にないようですが、なくても簡単に使えます。
1,500以上のアイコンが使えて、SVGやアイコンフォントでの表示のどちらでも利用できます。

ドキュメント: [Bootstrap Icons](https://icons.getbootstrap.jp/)
GitHub: [Bootstap Icons](https://github.com/twbs/icons)

## インストール方法
公式サイトに記載されているとおり、npmでインストールできます。2022/3/11時点の最新は、1.8.1です。

```json
npm install bootstrap-icons@1.8.1 --save
```

## アイコンフォントで使用
AngularのStyleをSCSSにしている場合は、styles.scssにimport設定します。

styles.scss
```scss
/* Importing Bootstrap Icons SCSS file. */
@import '~bootstrap-icons/font/bootstrap-icons';
```

Alarmアイコンの表示してみます。
html
サイズと色を指定してみます。
```html
<i class="bi-alarm" style="font-size: 2rem; color: cornflowerblue;"></i>
```

表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48495/10357862-0ccc-d284-f387-ea8c93a4da01.png)

## SVGスプライトで使用
SVGのスプライトを使う場合は、svgファイルをassetsに設定します。

angular.json
スプライトの場合は、bootstrap-icons.svgを取り込みます。
```json
            "assets": [
              "src/favicon.ico",
              "src/assets",
              {
                "glob": "bootstrap-icons.svg",
                "input": "./node_modules/bootstrap-icons/",
                "output": "."
              }
            ],
```
この場合、buildすると、dist直下にコピーされます。

html
```html
    <svg class="bi" width="2rem" height="2rem" fill="cornflowerblue">
      <use xlink:href="/bootstrap-icons.svg#alarm"/>
    </svg>
```

表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48495/10357862-0ccc-d284-f387-ea8c93a4da01.png)


その他、個々のSVGファイルを使いたい場合は、assetsの記述を変えるだけで、svgファイルをコピーでき、useのhrefの先を変えるだけです。


## 所感
使い方はすごくシンプルでした。また、アイコンの種類も多く、デザインもシンプルなので扱いやすいです。  
ちょっとした使い方であれば、アイコンが楽だと思います。大きくアイコンを表示したい場合は、SVGを使った方が綺麗に出せると思います。
Excel VBA スタンダード

2022年1月30日にExcel VBA スタンダードを受験しました。
合格したので記事を書いておきます。
次受ける方の参考になれば幸いです。

## 受験理由
■１ 仕事でVBAを作成するため
■２ Excel VBA ベーシックをとったのでそのついで

## 感想
■１ Excel VBA ベーシックよりも当然難しいです。ただ、1週間もあればテキストと模擬テストを一通り終えることができると思います。学習方法はベーシックと基本同じです。また学習期間もベーシック同様、1週間ほどで終了しますが、2週間ほど学習したほうが良いです。
■２ ベーシックとは異なり、実際にコードを記述する問題が増えていますので、コードを書けるようにしておいた方がよいです。VBE（エディタ）で書くこともありましたが、エディタで書く時間を確保できないこともあり、ほとんどの時間（移動や通勤などの時間）は頭の中でコードを書いたり、小声でコードをつぶやいたりして覚えました。
	
## 学習教材
■１ VBAエキスパート公式テキスト Excel VBAスタンダード（田中 亨, 2019, オデッセイコミュニケーションズ）
■２ [Reo WorksのExcel VBA スタンダード](https://reoworks.stores.jp/)

## 学習方法
■１ VBAエキスパート公式テキスト実施
・・・まずは公式テキストを1周して、そのあとに模擬テストを受けました。
■２ Reo WorksのExcel VBA スタンダード実施
・・・こちらで問題を解きまくりました。

## 反省点
■１ 特になし。

## 試験前にやっておいてよかったこと等
■１ Reo WorksのExcel VBA スタンダードで間違えた問題をギリギリまで繰り返し解いたこと。
■２ スタンダードが終わった後に、ベーシックの模擬テストと問題の苦手分野も軽く学習したこと。
本日のRuby基礎練習問題(22/3/11)

# 本日のRuby基礎練習問題(22/3/11)
**問題**
FizzBuzz問題
1〜100までの数字をターミナルに出力してください。
ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、
3と5の倍数である「15の倍数」のときはFizzBuzzと出力してください。
プログラムのひな形は以下です。
```question1.rb
def fizz_buzz
  # ここに処理を書き加えてください
end

fizz_buzz
```
ヒント
① 問題文で与えられている仕様を整理すると以下のようになります

数字の1~100を出力する
値が3の倍数のときだけ、"Fizz"という出力に置き換える
値が5の倍数のときだけ、"Buzz"という出力に置き換える
値が3と5の倍数のときだけ、"FizzBuzz"という出力に置き換える
②「〇〇の倍数」を導き出す時は剰余演算子を用いましょう

③条件を指定して繰り返し処理をする場合は、whileというメソッドを使いましょう

# 私の回答
```ruby:qiita.erb
def fizz_buzz
  x = 1
  while x <= 100
   if x % 3 == 0 && x % 5 == 0
    puts "FizzBuzz"
   elsif x % 3 == 0
    puts "Fizz"
   elsif x % 5 == 0
    puts "Buzz"
   else
    puts x
   x += 1
   end
  end
end

fizz_buzz
```
# 解説
まずxに1を代入します。
そしてWhileメソッドで1~１００までの繰り返し処理を記述します。
もし3の倍数かつ5の倍数=15の倍数である場合は、"FizzBuzz"と出力し、
３の倍数の場合は"Fizz"と出力し、
５の倍数の場合は"Buzz"と出力し、
それ以外はxを出力する。
その後xに1をプラスすることで1ずつ増やす繰り返し処理を行う。


# 模範回答
```ruby:qiita.erb
def fizz_buzz
  num = 1
  while num <= 100 do
    if num % 15 == 0
      puts "FizzBuzz"
    elsif num % 3 == 0
      puts "Fizz"
    elsif num % 5 == 0
      puts "Buzz"
    else
      puts num
    end

    num = num + 1
  end
end

fizz_buzz
```

# 模範解説
この問題は条件分岐と条件の組み合わせを利用し、実装します。その実装の流れの一例を紹介します。
まずは、1〜100までの数字をターミナルに出力するためのプログラムを書きます。
```ruby:qiita.erb
def fizz_buzz
  num = 1
  while num <= 100 do
    puts num

    num = num + 1
  end
end

fizz_buzz
```
続いて、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzzと出力するようにします。
```ruby:qiita.erb
def fizz_buzz
  num = 1
  while num <= 100 do
    if num % 3 == 0    # 3の倍数のとき
      puts "Fizz"
    elsif num % 5 == 0    # 5の倍数のとき
      puts "Buzz"
    else    # それ以外のとき
      puts num
    end

    num = num + 1
  end
end

fizz_buzz
```
そしてここに「15の倍数（3と5の倍数）」の時についての条件式を追加します。しかし、このまま下に追加してしまうと上記4行目の「3の倍数であるか」または6行目の「5の倍数であるか」という条件式が真になり、FizzまたはBuzzと表示されてしまいます。

したがって、if文の最初に「15の倍数」のときはFizzBuzzと出力する条件を追加します。
```ruby:qiita.erb
def fizz_buzz
  num = 1
  while (num <= 100) do
    if num % 15 == 0    # 15の倍数のとき
      puts "FizzBuzz"
    elsif (num % 3) == 0    # 3の倍数のとき
      puts "Fizz"
    elsif (num % 5) == 0    # 5の倍数のとき
      puts "Buzz"
    else    # それ以外のとき
      puts num
    end

    num = num + 1
  end
end

fizz_buzz
```
別解としては、「15の倍数であるとき」の条件式をnum % 15 == 0からnum % 3 == 0 && num % 5 == 0のように置き換えることができます。

# 感じたこと
条件分岐が完全に終了した後に＋１を記述するところだけ間違えた。
細かい箇所だが１つのミスだけで出力エラーにつながるので、基本に忠実に記述することを意識したい。
また繰り返し処理は頻繁に使用されるのでしっかりと復習していこうと思う。
Yolo V5のアノテーションtxtファイルの覚書

- 座標は画像の左上が(0,0)で右下が(1,1)

```txt:[ 画像ファイル名（拡張子なし）].txt
<LabelNum> <ボックスの中心x> <ボックスの中心y> <ボックスの幅x> <ボックスの高さy>
```

```yaml:data.yaml
train: data/train/images #学習用画像のパス
val: data/valid/images #検証用画像のパス

nc: 3 #ラベルの数
names: [ '<ラベル名>', '<ラベル名>', '<ラベル名>' ]
```
AIの基本の基本

# AIを一言でまとめると
__人間のような知能を持ったコンピューター__ のことです。
と言ってもAIにも得意不得意があり現時点で総合的に人の知能を超えることはありません。
__2045年問題__ と言って2045年に人工知能の性能が人間を上回ると主張する意見もありますが、一方で永遠に人間の知能を上回ることはないと主張する意見もあり、正に神のみぞ知ると言えるでしょう。


# 概要
AIはArtificial Intelligenceの略で直訳すると人工知能となります。
Artificial：人工的な、Intelligence：知能

# AIの歴史
__・1950〜1970年代：ニューラルネットワーク__
パズルや簡単なゲームのような明確なルールを持つ問題に高い性能を発揮します。
人間の神経細胞(ニューロン)を模している

__・1980〜2010年代：機械学習__
コンピュータが大量のデータを学習し、分類や予測などのタスクを遂行します。
アルゴリズムやモデルを自動的に構築する技術も持ちます。

__・現在：ディープラーニング__
ニューラルネットワークを多層に結合することで、表現や学習能力を高めたモノです。
日本語では深層学習と訳されます。

年代別にトレンドを分けましたが、以下のような部分集合的な関係性と思ってください。
__AI ⊃ 機械学習 ⊃ ニューラルネットワーク ⊃ ディープラーニング__

# 自然言語処理
AIのほとんどが __自然言語処理__ と __ディープラーニング__ に大別されます。

自然言語処理とは、__自然言語(人が日常で使っている言葉)をコンピュータで分析するシステム__ のことです。
代表的なところで言うと、SiriやGoogle翻訳に使われています。

これを実現するためには、以下の2つが必要です。
__機械可読辞書__ ：コンピュータが語彙を理解するために必要な辞書
__コーパス__ ：言語の使用方法を記録・蓄積した分集合

# ディープラーニング
ディープラーニングとは、 __十分なデータ量があれば、人間の力なしに機械が自動的にデータから特徴を抽出してくれる__ ディープニューラルネットワークを用いた学習のことです。
一言でディープラーニングと言ってもアルゴリズムには種類があり、それぞれ得意不得意があるため実際に使用する際にはどのアルゴリズムを使うのかよく検討する必要があります。

# 終わりに
AIは幅が広すぎるため概略しか説明できませんでした。
また、機会があれば1つの分野を深掘りした記事を投稿したいです。

最後までお付き合いくださりありがとうございました。
週に最低１回は記事を書こうと思った話

タイトルにある通り。
頓挫しているプライベートプロジェクトがいくつかあって、
Qiitaにもやりかけの記事があって、
長い間放置している。

ここ以外の発信も最近全然してなくて、
Twitterさえ投稿頻度が落ちている。
つまり、全然発信していない。

ちょっとづつ、どんな些細な内容でもいいから、
週に最低１回は記事を書こうと思った、という話。

そんなわけで、すこしづつ、書いていこうと思います。

つづけー、がんばれー、わたし！
【エラー備忘録】Windowsローカル環境で$rails db:resetできない場合にマイグレーションを行う手順

# 目次
- 状況、前提
- エラー内容
- 原因
- 解決方法
- 参考リンク

# 状況、前提
Railsでポートフォリオを作成している最中、マイグレーションしなおそうと$rails db:resetした際にエラーにハマる。
Windows 11
Ruby 3.0.2
Rails 6.1.4

# エラー内容
```
Permission denied @ apply2files - C:/myapp/db/development.sqlite3
Couldn't drop database 'db/development.sqlite3'
rails aborted!
Errno::EACCES: Permission denied @ apply2files - C:/myapp/db/development.sqlite3

Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)
```

# 原因
Windowsではrailsコマンドでファイルを削除できないのが原因。

# 解決方法
Windowsのdelコマンドで一度DBファイルを削除して、マイグレーションする。
```
$del db\development.sqlite3
$rails db:migrate
```

シードも更新する場合
```
$del db\development.sqlite3
$rails db:migrate
$rails db:seed
```

テスト環境へのマイグレーション
```
$del db\test.sqlite3
$rails db:migrate RAILS_ENV=test
```

# 参考リンク

https://teratail.com/questions/67393


https://teratail.com/questions/268166
Excel VBA ベーシック

2022年1月15日にExcel VBA ベーシックを受験しました。
合格したので記事を書いておきます。
次受ける方の参考になれば幸いです。

## 受験理由
■１ 業務で何となくしかVBAを使っていなかったので、基礎から理解するため。

## 感想
■１ 仕事でPythonを少し書いていることもあり、公式テキストは2日ほどで読み終えました。他のプログラムを書いた経験がある人にとってはそこまで難しくないと思いますが、エクセル独特の仕様などもありますので、その点が苦手な方はまずエクセルの勉強をしてからのほうがすんなり理解できるかもしれません。
■１ 学習自体は1週間もあれば終わりますが、余裕をもって2週間ほど勉強しました。
	
## 学習教材
■１ VBAエキスパート公式テキスト Excel VBAベーシック（田中 亨, 2019, オデッセイコミュニケーションズ）
■２ [Reo WorksのExcel VBA ベーシック](https://reoworks.stores.jp/)

## 学習方法
■１ VBAエキスパート公式テキスト実施
・・・まずは公式テキストを1周して、そのあとに模擬テストを受けました。
■２ Reo WorksのExcel VBA ベーシック実施
・・・こちらで問題を解きまくりました。

## 反省点
■１ 特になし。

## 試験前にやっておいてよかったこと等
■１ Reo WorksのExcel VBA ベーシックで間違えた問題をギリギリまで繰り返し解いたこと。
プログラムの引数と定数マクロ

# プログラムの修正
色々なことに関してプログラムの修正は必要になると思われます。特に、関数の引数とかは以下の場合によく変更することが多いと思われます。
- ほかの関数へ値／文字列を渡したい
- 新たに変数を追加して処理する必要が増えた
- 処理がいらなくなって引数を減らす必要がある

その際、修正するプログラムをまとめて変更というのは、ほかの関数の影響もあるためヒューマンエラーを起こしてしまうことがあります。それに対する策を私なりの視点で書いてみます。

# 定数マクロ
この言葉自体を聞くこと自体は少ないかもしれませんが、何回か使用したことがある人は多いと思います。具体例は以下のような感じです。
```c++:example.cpp
#define N 500
```
保存するデータ数やある条件に対する値をして用いられるプログラマが設定できる値ですね。プログラマが独自の名前を設定できるため、直感的な理解ができるのが利点だと思います。

# プログラムの仕様と定数マクロの関係
プログラムの修正と定数マクロについてなにが関係しているのかが疑問に浮かぶ人が多くいると思います。処理に対しては関係ありませんが、修正する際によく必要になると思います。私の場合は以下の例を使用します。処理のイメージなのでだいぶ省略しています。
```c++:example.cpp
#include <iostream>
#define ENV 1
...
#if ENV == 1
func(int n1, int n2, int n3){
...
}
#elif ENV != 1
func(int n1, int n2){
...
}
#endif
```
上記のように定数マクロを設定することによって、処理する内容、箇所を設定することができます。この場合は定数マクロENVが1の場合は#if内の処理、そうでない場合は#elif内の処理が適用されます。
使用するエディタによっては処理されない部分は別の色で表示されたりといったこともあるので、もし必要がなくなった場合はその部分を削除すれば何ごろもなかったかのように修正ができます。

# 終わりに
Qiitaに記事を書くことが初めてで、自分が使っている点について記事にしてみました。これからは独自の視点を踏まえたうえで記事をかけるよう精進いたします。
ドットインストールでCSS Flexboxをやってみた

# ドットインストールCSS Flexbox編です
要点だけまとめてみたので、後で振り返り用としておきます

### Flexbox
- サイトのレイアウトをする際には必須な技術

### 用語の整理
- 並べた要素 = flex item
- その親要素 = flex container
- Flexboxの設定
    - container の方に 例: display: flex;
- 主軸
    - 左から右
- 交差軸
    - 主軸に直交する形で上から下

- flex-aline
    - 交差軸に対してのプロパティ

:::note
覚える所が多すぎる・・・
参考にさせて頂きます。
[Qiita CSS flexboxチートシート](https://qiita.com/7dt/items/29f45132cc7c0c4a6d19)
:::

- flexbox ではマージンの相殺が起きない
- flexboxの利点
    - 要素の大きさが変わったとしても対応出来る

:::note warn
全ては覚えきれないので作りたい、やりたい事に対して調べるので良さそう
各プロパティがどういった動きをするのかの理解はある程度しておかなくてはならない・・・
:::
Vimのビジュアルモードを活用したTips集

## これは何
Vimにはノーマルモード、インサートモード、コマンドラインモード、ビジュアルモードという4つのモードが存在します。
ビジュアルモードは便利なのですが、他のモードに比べて使い所が比較的知られていない気がするので、Tipsとして便利な使い方をまとめます。

## V-LINEモード
V-LINEモードは、行全体を選択できるモードです。
基本的にはノーマルモードで`Shift + v` を入力することでV-LINEモードにできるはずです。
V-LINEモードは、行単位で操作を行いたいときにとても便利です。
簡単な使い方例を紹介します。

### 選んだ行を削除する
V-LINEモードに入った後、削除した行を選択し、`d`を入力することで選んだ行の一括削除ができます。
下のようなイメージです。

<script id="asciicast-hUdHjrA9CLT4dCzEAs49gQNBK" src="https://asciinema.org/a/hUdHjrA9CLT4dCzEAs49gQNBK.js" async></script>

### 選んだ行の置換を行う
V-LINEモードに入った後、置換を行いたい行を選択し、`:`を入力してコマンドラインモードに入ります。ここで`s/置換したい文字列/置換後の文字列/g`と入力することで、選んだ行のみ置換を行うことができます。
下のようなイメージです。

<script id="asciicast-qjkSN16M1H2xzaxqz1da1h1Jb" src="https://asciinema.org/a/qjkSN16M1H2xzaxqz1da1h1Jb.js" async></script>

## V-BLOCKモード
V-BLOCKモードは、矩形選択を行えるモードです。
基本的にはノーマルモードで`Ctrl + v`を入力することでV-BLOCKモードに入ります。このモードでは、矩形選択を行って複数行一括で同じ操作をしたいときに便利です。

### 選んだ範囲を削除する
V-BLOCKモードに入った後、範囲を選択し、`d`を入力すると、選んだ範囲の削除を行うことが可能です。
下のようなイメージです。

<script id="asciicast-2eRZrZBDvDr3ojO4nNPUTdypT" src="https://asciinema.org/a/2eRZrZBDvDr3ojO4nNPUTdypT.js" async></script>

### 選んだ範囲に挿入する
V-BLOCKモードに入った後、範囲を選択し、`Shift + i`を入力してインサートモードに入ります。
インサートモードに入り、挿入したい文字列を入力した後ノーマルモードに戻ると、選択した範囲に文字列を入力することができます。
下のようなイメージです。

<script id="asciicast-6pka9DufusSiPLBwIHS1dPetA" src="https://asciinema.org/a/6pka9DufusSiPLBwIHS1dPetA.js" async></script>


### 選んだ範囲を置換する
V-BLOCKモードに入った後、置換を行いたい範囲を選択し、`:`を入力してコマンドラインモードに入ります。ここで`s/置換したい文字列/置換後の文字列/g`と入力することで、選んだ範囲のみ置換を行うことができます。
下のようなイメージです。

<script id="asciicast-qBRz0RW1pt37sJXWXTRV5pcqL" src="https://asciinema.org/a/qBRz0RW1pt37sJXWXTRV5pcqL.js" async></script>
WindowsでPythonをはじめるための開発環境準備

# はじめに
Pythonの開発環境構築から基本的な知識をまとめてみました。
Pythonはとても人気があり需要が高い言語、習得できればきっと役に立ちます。
まずは、Pythonでお約束のHello worldを表示させましょう。

# Pythonの実行環境
今回はWindowsで開発環境を作りますが、PythonのプログラムはWindows以外のプラットフォームでも実行できます。
実際に、Windowsで開発してLinuxで定期実行させたりしています。
* Windows
* macOS
* Linux/Unix
* iOS/iPadOS
* Android
* その他

# 無料で開発環境を準備する
### Python3 （実行環境）
* [ここから]( https://pythonlinks.python.jp/ja/index.html )Python3のどれかをダウンロードしてインストール
* 今回はPython3.7を使用してますが、3.8でも3.9でも良いでしょう
* 複数のバージョンのPython環境が同居可能
### Visual Studio Code （エディタ）
* マイクロソフト製の無料ソースコードエディタ
* 読み：ビジュアル スタジオ コード（または、ブイエスコード）
* [ここから](https://code.visualstudio.com/download)ダウンロードしてインストール

# 実際にコーディングする
### とりあえずソースコードを置くフォルダを作る
今回は「Python_Sample」というフォルダを任意の場所に作成します。
  
### Pyhon_SampleのフォルダでVisual Studio Codeを起動する
先程作成した空のPython_Sampleフォルダ上で右クリックメニューを表示して「Codeで開く」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602022/e037f5e3-bd3b-7d9f-d7d6-6af48d80494d.png)

「Codeで開く」のメニューが無い場合は、Visual Studio Codeを起動し、「Alt+F」から「フォルダーを開く」メニューで「Python_Sample」を指定してください。

### いよいよのHello Worldを表示させる
* 「Python_Sample」フォルダ内に「main.py」というファイルを作り、コーディングします。
```Python #main.py
print("Hello world")
```
* Visual Studio CodeのターミナルでPower Shellで実行
```powershell
py ./main.py
```
```Console
Hello World
```
# まとめ
Hello worldが表示されたら、無事にPython開発の準備が整いました。
次回はもう少しPythonプログラミングを深堀りして行けたらと思います。
[簡易]ローカルイメージをECRにpushする手順

#### 手順

- ECRリポジトリの作成
- ECRレジストリの設定(拡張スキャンなど)
  拡張スキャンの「連続スキャン」は、ECRへのプッシュ時の初期スキャンと、関連する新しいCVEが公開され たときの自動再スキャンが含まれる

- ECRアクセス用のIAMユーザー(プログラムアクセス)作成
- `aws cli --profile xxxx`でprofile作成
- ECRレジストリに対してDockerクライアントを認証する
```sh
aws ecr get-login-password --region [region] | docker login --username AWS --password-stdin [aws_account_id].dkr.ecr.[region].amazonaws.com
```
- ECRレジストリに保持する用にイメージにタグをつける
```sh
docker tag image_id [aws_account_id].dkr.ecr.[region].amazonaws.com/[my-repository:tag]
```
- ECRにpush
```sh
docker push [aws_account_id].dkr.ecr.[region].amazonaws.com/[my-repository:tag]
```
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html
データサイエンティスト検定 リテラシーレベル

2021年9月26日にデータサイエンティスト検定 リテラシーレベルを受験しました。
2021年11月2日に合格通知が来たので記事を書いておきます。
次受ける方の参考になれば幸いです。

## 受験理由
■１ データサイエンスの理解を深めるため

## 感想
■１ SQL、統計学、データサイエンスのビジネスへのアプローチ方法などを勉強しますので、G検定とは少し毛色が異なりました。このページ( URL: https://www.jdla.org/lp/04/ )を見るとこの資格の位置づけがわかります。
■２ 2021年9月に開始した試験のため、情報があまりありませんでしたが、スキルアップAIの基礎講座( URL: https://www.skillupai.com/ds/ )と公式テキスト『最短突破 データサイエンティスト検定(リテラシーレベル)公式リファレンスブック』を理解できていれば問題なく解けると思います。学習期間は2週間ほどでした。

## 学習教材
■１ DS検定リテラシーレベル対応　データサイエンティスト基礎講座( URL: https://www.skillupai.com/ds/  )
■２ 最短突破 データサイエンティスト検定(リテラシーレベル)公式リファレンスブック（菅など, 2021,  技術評論社）

## 学習方法
■１ データサイエンティスト基礎講座を受講
・・・一度通しで受講します。
■２ 公式テキストを読む。
・・・公式テキストを1周実施、苦手分野を2、3週実施。試験前日に全内容確認。

## 反省点
■１ ER図の理解が不十分だったので、もう少しデータベース関係を勉強すればよかった。

## 試験前にやっておいてよかったこと等
■１ 試験前日に公式テキストの全範囲に目を通したこと。
Elastic IP

# 調べる前のイメージ
伸縮自在なIPアドレス。
直訳したがどんなものかイメージがつかない。。。
# Elastic IP
静的な IPv4 アドレス。
通常EC2インスタンスを停止すると、それまで使用していたIPアドレスは保持できなくなるが、Elastic IPはEC2インスタンスが停止しても変更されない。
利用時は無料だが、停止中の場合は、時間単位で料金が発生する。
# （補足） パブリックIPとの違い
ECインスタンスが停止した場合、IPアドレスが変更される。無料。
# 調べた後のイメージ
調べた後だと、直訳のイメージがつきやすくなった。というか言葉の意味のままだなと思った。
discord.pyでボイスチャンネルにいるメンバーを取得する

ボイスチャンネルにいるメンバーを取得する方法について色々とたらい回しにされたので参考までに書いておきます。

~~~
vch = client.get_channel(チャンネルid)
~~~
としているとき

~~~
vch.voice_states.keys()
~~~

でメンバーの一覧を取得できます。
<br>
もちろん、

~~~
for member in vch.voice_states.keys():
~~~
とすることで、メンバー各々に対しての処理を行えます。

<br>
作成したdiscordbotから抜粋です。


```python:例
      vch = client.get_channel(vid)
      memlist = []
      if vch is not None:
        if len(vch.voice_states.keys()) == 0:
          return
        for member in vch.voice_states.keys():
            memlist.append(member)
        ram = random.randrange(len(memlist))
        user = await client.fetch_user(int(memlist[ram]))
        if user.bot:
            await channel.send('夜が明けました。昨晩の犠牲者は、いませんでした')
        else:
            person = '<@!'+str(memlist[ram])+'>'
            await channel.send(f'本日処刑される人は{person}さんになりました。{person}さんは幽霊となって、以後は発言をせずにゲームを傍観してください.') 
```
ここでは取得したユーザーがbotかどうかを判定しています。
MusicBotなどがボイスチャンネルにいる場合があるからです。
```python:
        user = await client.fetch_user(int(memlist[ram]))
        if user.bot:
```

<br>
誰かの何かのお役に立てれば...
PowerAutomate: 配列の積集合を取得する（ホワイトリストにある要素だけを抜き出す）

# やること
以下での積集合のサンプル

https://qiita.com/baku2san/items/39e7a40c1a1fb327362a

# 結果イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/73bbc0e1-852d-9410-4abc-fc1c8e7e39a4.png)

# フロー
説明は不要かなってぐらいに単純なフローです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/4db7817d-4ad0-0d08-fcd6-bdf60ac4090e.png)

```automate:積集合
intersection(variables('MailList'),variables('WhiteList'))
```

# あとがき
差集合なら、こんなのも。
Office Scripts ですが・・

https://qiita.com/baku2san/items/d05321012e0cbf833f2b
新規登録画面　エラー出力

  &nbsp;&nbsp;記事では、Rails６.０.４.６を使用

 ブログ投稿画面より、新規登録画面に遷移した際に出力されたエラー

   ```Ruby:feed.rb 
undefined method url for "#<ActionDispatch::Http::UploadedFile: >":String
```

　&nbsp;【原因】
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app/models/feeb.rb


　モデムにアップローダ機能を定義する
　mount_uploader :image, ImageUploader
　の記載が抜けていた。
AmplifyのIAMでauth-roleとunauth-roleってなに?

## なぜこのような記事を書こうと思ったのか

Amplifyって便利ですよね。いつものように、さぁローカルで開発したものをGithubにプッシュしてAmplifyでビルドしよっ! と軽い気持ちでgit pushすると以下のようなエラーが…



```
2022-03-10T12:01:33.847Z [INFO]: UPDATE_FAILED UpdateRolesWithIDPFunction AWS::Lambda::Function Thu Mar 10 2022 12:01:29 GMT+0000 (Coordinated Universal Time) Template error: IAM role amplify-hogehoge-prod-12155-authRole-idp doesn't exist
2022-03-10T12:01:33.933Z [INFO]: 
2022-03-10T12:01:33.934Z [INFO]: UPDATE_ROLLBACK_IN_PROGRESS amplify-hogehoge-prod-12155-apihogehoge-GD1BRHGL04QW AWS::CloudFormation::Stack Thu Mar 10 2022 12:01:29 GMT+0000 (Coordinated Universal Time) Initiated by parent stack
2022-03-10T12:01:43.845Z [INFO]: 
2022-03-10T12:01:43.847Z [INFO]: UPDATE_FAILED               apihogehoge                AWS::CloudFormation::Stack Thu Mar 10 2022 12:01:40 GMT+0000 (Coordinated Universal Time) Resource update cancelled

### 以下同じようなROLLBACK系のログが大量に出る ###

2022-03-10T12:02:24.057Z [WARNING]: ✖ An error occurred when pushing the resources to the cloud
2022-03-10T12:02:24.057Z [WARNING]: ✖ There was an error initializing your environment.
2022-03-10T12:02:24.063Z [INFO]: ResourceNotReady: Resource is not in the state stackUpdateComplete

### どうでもよさそうなログなので割愛 ###

2022-03-10T12:02:24.122Z [ERROR]: !!! Build failed
2022-03-10T12:02:24.123Z [ERROR]: !!! Non-Zero Exit Code detected
2022-03-10T12:02:24.123Z [INFO]: # Starting environment caching...
2022-03-10T12:02:24.123Z [INFO]: # Uploading environment cache artifact...
2022-03-10T12:02:24.243Z [INFO]: # Environment caching completed

```



このログを見ていて、特に以下の部分が気になりました。

```
Template error: IAM role amplify-hogehoge-prod-12155-authRole-idp doesn't exist
```



なんでかというと、直近で、IAMのロール、なんかゴミがいっぱいあるから使って無さそうなのけしちゃえ! と思って不要そうなものを消してしまったら。でもこれ、消しちゃいけなかったっぽいです。



## authRole/unauthRoleとは何者なのか 

authRoleとunauthRoleは一番最初にamplify initをしたときに生成されるIAMのポリシーだそうです。以下に記載があるように、アプリにログインするユーザーに適用されるauthRoleとゲストユーザーに適用されるunauthRoleということです。

Amplify CLIで自動で生成される「team-provider-info.json」にも書かれているように、これらのポリシーはCloudFormationでリソースを作成する際にも使われるため、これがないとビルドプロセスのバックエンドのフェーズでコケるのではと思います。

```
{
  "dev": {
    "awscloudformation": {
      "AuthRoleName": "hoge-authRole",
      "UnauthRoleArn": "arn:aws:iam::hoge:role/hoge-unauthRole",
      "AuthRoleArn": "arn:aws:iam::hoge:role/hoge-authRole",
      "Region": "ap-northeast-1",
      "DeploymentBucketName": "amplify-hoge-deployment",
      "UnauthRoleName": "amplify-hoge-unauthRole",
      "StackName": "amplify-hoge",
      "StackId": "arn:aws:cloudformation:ap-northeast-1:014913632072:stack/amplify-hoge/hoge",
      "AmplifyAppId": "hoge"
    },
    "categories": {
      "auth": {
        "hoge084cdc0e": {}
      }
    }
  }
}
```



## 対処

新しくIAMを作成した上で上記team-provider-info.jsonのAuthRoleName、AuthRoleArnなどを書き換えてAmplify pushした後にビルドしたがうまくいきませんでした。結局、amplify initをやりなおして両ポリシを再生することでうまくいきました。恐らくもっと良い方法があるのですが、正直、amplify initからやり直しちゃったほうが初心者にはわかりやすくて良いように思います。
[Devise] 更新をpasswordなしで可能にする

## はじめに
認証機能で有名なRuby on Railsの gem `Devise`を使ったので記事を残そうと思います。
`update_without_password`を使った方法は`password`の更新ができなくなってしまうので、`update_without_current_password`というメソッドを自作して適応します。
これによりpassword自体の変更も可能にします。

## 環境
M1 Mac
VScode
ruby 3.1.0
rails 6.0.4.7
devise 4.8.1

## routingを追加

```rb:routes.rb
devise_for :users, 
  controllers: { registrations: 'registrations' }
```

## registrations_controllerを追加
```shell:terminal
# vscodeを使っている場合は下記で作成+開く
$ code app/controllers/registrations_controller.rb

# unixコマンドを使う場合下記で作成したのち開いてください
$ touch app/controllers/registrations_controller.rb
```

```rb:app/controllers/registrations_controller.rb
# 下記の内容を追加
class RegistrationsController < Devise::RegistrationsController

  protected

  def update_resource(resource, params)
    resource.update_without_current_password(params)
  end
  
  # ユーザー詳細ページをリダイレクト先に設定
  def after_update_path_for(resource)
    user_path(resource)
  end
end
```

## Userモデルにメソッドを追加
```rb:app/models/user.rb
def update_without_current_password(params, *options)

  if params[:password].blank? && params[:password_confirmation].blank?
    params.delete(:password)
    params.delete(:password_confirmation)
  end

  result = update(params, *options)
  clean_up_passwords
  result
end
```

## 終わりに
`registrations_controllerを追加`で個別にコントローラーを作成せずに`rails g devise:controllers users`コマンドを利用する場合

routineは下記になります
```rb:routes.rb
devise_for :users, 
  controllers: { registrations: 'users/registrations' }
# usersが増えていますね。 
# touchコマンドで生成すればusersディレクトリが作成されないので階層を深くせずに済みます
```

## 参考

https://wcf-drill.com/devise%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E6%9B%B4%E6%96%B0%E3%81%8C%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84-752.html
Webスクレイピングでオリコンから好きなアーティストの最新10ニュースを取り出す



学生の選んだ題材が，Webスクレイピングでオリコンから好きなアーティストの最新10ニュースを取り出すというものだったので，Pythonを使って作ってみたものは次のようなものでした．

```Python
import re 
import requests
from bs4 import BeautifulSoup

url = 'https://www.oricon.co.jp/search/result.php?types=article&search_string=Aimer'
#オリコンの検索ボックスに「Aimer」と入れた時の記事タイトル検索画面で，記事が２１件並ぶページのリンクを変数urlに代入
res = requests.get(url)
#変数urlに代入されているリンクからHTMLデータをダウンロード
res.text
#テキスト化
soup = BeautifulSoup(res.text, "html.parser")
#解析器（パーサー）に通している
titles = soup.find_all('h4')
#タイトルに当たる部分は「h4」というHTMLのタグ（最小見出しの役割）で割り当てられているのでそれがついているものを全て見つける
links = soup.find_all(href=re.compile("www.oricon.co.jp/news/"))
#ニュース記事のリンクは全て"www.oricon.co.jp/news/"で始まっていることがわかるので，それで始まるものを指定
for i in range(10):
#iが0から9までの10個の間
  print(titles[i].text)
#配列titlesを順にテキストだけ出力
  print(links[i].attrs['href'])
#配列linksを順にリンクの部分だけ出力
```
こんな出力が出ます．(2022/3/11)
```
韓国発グループが続々ランクイン 
https://www.oricon.co.jp/news/2227110/
Aimer「残響散歌」1億回再生突破 
https://www.oricon.co.jp/news/2227171/
3/7付週間SGランキング 
https://www.oricon.co.jp/news/2226358/
三浦大知、Da-iCEと初コラボ　 
https://www.oricon.co.jp/news/2226391/
SixTONES「FASHION」上位初登場 
https://www.oricon.co.jp/news/2226275/
2/28付週間SGランキング 
https://www.oricon.co.jp/news/2225414/
Aimer、合算シングル1位返り咲き 
https://www.oricon.co.jp/news/2225765/
Aimer「残響散歌」3週連続V 
https://www.oricon.co.jp/news/2225433/
Aimer「残響散歌」デジタル2冠　 
https://www.oricon.co.jp/news/2225475/
2/14付週間SGランキング 
https://www.oricon.co.jp/news/2224016/
```

これをいくつか条件がえしてみたいと思います．
まずは違うアーティストに

```Python
import re
import requests
from bs4 import BeautifulSoup

url = 'https://www.oricon.co.jp/search/result.php?types=article&search_string=Ado'
#検索結果をAdoに変更
res = requests.get(url)
res.text
soup = BeautifulSoup(res.text, "html.parser")
titles = soup.find_all('h4')
links = soup.find_all(href=re.compile("www.oricon.co.jp/news/"))
for i in range(10):
  print(titles[i].text)
  print(links[i].attrs['href'])
```
出力結果
```
3/14付週間アルバムランキング 
https://www.oricon.co.jp/news/2227216/
3/7付週間アルバムランキング 
https://www.oricon.co.jp/news/2226360/
ORIHARA描き下ろし『モービウス』 
https://www.oricon.co.jp/news/2226529/
浜辺美波×Ado、共通点は好物 
https://www.oricon.co.jp/news/2226044/
2/28付週間アルバムランキング 
https://www.oricon.co.jp/news/2225416/
Aimer「残響散歌」デジタル2冠　 
https://www.oricon.co.jp/news/2225475/
まふまふトリビュート 全曲発表 
https://www.oricon.co.jp/news/2225195/
2/21付週間アルバムランキング 
https://www.oricon.co.jp/news/2224798/
2/14付週間アルバムランキング 
https://www.oricon.co.jp/news/2224017/
2022年1月のラジオ界 
https://www.oricon.co.jp/news/2223779/
```
カタカナアーティストはどうしたら？
また続きは更新してみます．
[react-modal] モーダルにtransitionを設定する。

簡単そうですが意外とうまくいかなかったので、記事にしておきます。

結論ModalコンポーネントにcloseTimeoutMSを設定して、global.cssにてopacityしてからtransitionを設定すればOKです。

```tsx
<Modal
  ~~
  style={customStyles}
  closeTimeoutMS={200}
>
	~~
</Modal>

const customStyles = {
  content: {
    ~~
  },
  overlay: {
    ~~
    transition: 'opacity 200ms ease-in-out',
  },
};
```

global.css

```css
.ReactModal__Overlay {
  opacity: 0;
}

.ReactModal__Overlay--after-open {
  opacity: 1;
}

.ReactModal__Overlay--before-close {
  opacity: 0;
}
```

[ドキュメント]([https://reactcommunity.org/react-modal/](https://reactcommunity.org/react-modal/))見て、closeTimeoutMS使う必要あるのはすぐわかったのですが、overlayClassNameとか使いながらやろうとしたのですが、なかなかうまくいかず...

emotion使っていて、できればコンポーネントにてスタイリングして、global.cssに書かない方がいいかなと考えていました。ただ、冷静に考えると、たいした記述でもないし、他に影響及ぼす設定でもないので、上記で書いたようにパパッと書いちゃった方がわかりやすいなと思いました。
STM32L010とMCP9701で温度をシリアルに出力 (ソフトウェアシリアル)(STM32)(Keil)


x MCP9701-E/TO 販売コード 103199

x Mbed2
x あまり正確では、ない

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を出力する。

構成
MCP9701-E/TO I-03199

説明
MCP9701は、
0℃の時、400mV
1℃あたり19.5mV
精度は、±4℃
電線が引き出しやすい位置のPA4をアナログ入力にする
計算には、容量削減の為に浮動小数点となるべく割り算は、使わない
MCP9700は、ファミリー、オフセット500mV、10mV/1℃ 今回は、使わない

19.5は、1℃あたりの電圧
3300は、ADCの電圧
400は、0℃

3300/19.5=169.2
400/19.5=20.5

(4096*1692)/4096=1692


![o_con261.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e7e26848-baa1-d7b7-3370-69a3eaff1cf3.jpeg)



```c++


//温度

#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//アナログ入力の設定
AnalogIn adc_vbat(A3); //PA_4

//RawSerial pc(PA_2, PA_3); //010


#define UART_DELAY 101 //  1/9600 98-105

DigitalOut TX(PA_2);

//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch)
{

    TX=1;
    TX=0;//Start
    wait_us(UART_DELAY);

    for(int ii=0; ii<8; ii++) { //Data x 8
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);

    return(0);

} //pc_putc

//文字列の表示 nana_seg
int pc_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //一文字出力
        pc_putc(*str1 ++);

    } //while

    //戻り値
    return(0);

}//ns_printf


//メイン関数
int main() {

    int s;  //ADCの値
    int n0; //温度　小数点以上
    char data_read[8]; //バッファー

    //無限ループ
    while(1) {

        //adcの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);
//s=2048;
        //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
        s=((s*1692)>>12)-205;

        //小数点以上と小数点以下を分ける
        n0=DVI10(s);    // 小数点以上
        s =(s-(n0*10)); // 小数点以下

        //温度の表示
        data_read[0] = '0' + DVI10(n0);
        data_read[1] = '0' + (  n0-(DVI10(n0)*10)  );
        data_read[2] = '.';
        data_read[3] = '0' + s;
        data_read[4] = '\r';
        data_read[5] = '\n';
        data_read[6] = 0;
        //pc.printf(data_read); //010
        pc_printf(data_read); //010
        //1秒の待ち
        wait_ms(1000);

    } //while

} //main

//容量削減
void error(const char* format, ...){}


```
PowerAutomate: SharePoint Lists のユーザー列をクリアする方法（Rest API より簡単に）

# はじめに
[Rest API でやる方法](#一応rest-api-でのクリア方法は以下) 以外にもやる方法がありますよってお話

Rest API に慣れてるなら、リスト名や列のID 取得も問題ないんですが、
ローコード開発って考えると、なるべく使わずにやる方が良いかな、というお話。

# 概要
- [Update Item を動的更新にする](#update-item-を動的更新にする)
- [JSON でユーザーをクリア](#json-でユーザーをクリア)

# 詳細
## [Update Item](https://docs.microsoft.com/ja-jp/connectors/sharepointonline/#update-item) を動的更新にする
一番簡単なのは、List Name の変数化<br>![List Name の変数化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/fefa714d-6f43-0e15-af77-5f83f44488e8.png)

## 補足：上記の List Name の取得方法
[Get_items](https://docs.microsoft.com/ja-jp/connectors/sharepointonline/#%E9%A0%85%E7%9B%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B) でアイテム一覧取得してあるとして、
以下で、Get_items で利用した List Name (Table ID) を取得

![List Name 取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/7291c830-c7c4-730b-2f2f-9cb591bd6fdc.png)

```automate:Get items で利用した List Name 取得
actions('Get_items')?['inputs/parameters/table']
```


# JSON でユーザーをクリア
以下の用に、"User" 列を null 指定してやるだけ

![null じゃなくて "" でもOK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/9d19a320-636c-2609-db3f-32cd37dbcc4e.png)

```json:ユーザーをクリア
{
  "User": null
}
```

:::note info
null じゃなくて "" でもOK
:::



# よくある躓きに対する説明
## 単純に null() で Clearした場合
上手くいったようにみせかけて、何も処理されない！ってなりませんか？


では、他の更新したくない列ってどう設定してますか？
update item は更新したくない列は放置 = null ですよね？

明示的に null() を渡してるつもりが、
コネクターとしては、値が空っぽなので更新したくないって認識してるんだと思います。

User 自体を事前にチェックしているからこそ、以下のようなエラーも出るわけですしね。

## 頑張って色々やると「そんなユーザーなんていない！」と怒られる
"User": に渡される値でユーザー検索して見つからないってことなんだろうな、と
以下の場合であれば、改行コード :laughing: 

で、null() 設定すると、上述のように、"User": 毎除外されるので更新されない、と。

![そんなユーザーなんていない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/c0de4a1b-2573-c4f5-bfa3-df3bfd585f5b.png)

# 一応・・Rest API でのクリア方法は以下
こんなの毎回やるの面倒だよね？ってお話でした。
## 元ネタ
https://powerusers.microsoft.com/t5/General-Power-Automate/How-to-clear-SharePoint-quot-Person-or-group-quot-field/m-p/53326#M32861

## 実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8cbe11af-4851-af7e-a700-3f67d5418005.png)

```url:Uri
/_api/web/lists/GetByTitle('StoreOfTeamsAttachements')/items(1)
```
```json:ClearHeader
{
  "Content-Type": "application/json;odata=verbose",
  "X-HTTP-Method": "MERGE",
  "IF-MATCH": "*"
}
```

```json:ClearBody
{
  '__metadata': { 'type': 'SP.Data.StoreOfTeamsAttachementsListItem' },
  'UserStringId': '',
  'UserId': -1
}
```

## 説明

List 名

> StoreOfTeamsAttachements

type/Id/StringId 等の取得方法
`https://shimakuma.sharepoint.com/sites/<siteName>/_api/web/lists/GetByTitle('<listName>')/items`

を実行した結果の xml から取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/289c9f24-0867-afcb-4dce-9ed7723cb84e.png)



# あとがき
Excel コネクタの update とかと同じ考えですね。困ったら、動的設定で、JSON 指定へ。

# keyword
how to clear "person or group" column in sharepoint lists
入院期間を伸ばすことで仕事から離れる方法

エッセンシャルワーカーでもないかぎり、巨大なイースター島でモアイ像を作る程度の仕事しか存在しない。俺は普段からかなり疲れているし、狂気でも演じて入院して休むことにした。入院期間をできるだけ伸ばすために<b>何を看護師や医者に伝えればいいのか</b>、そのテクニックを書こうと思う。

# 入院初期
- 「このベッド、フランスベッドって言うんですか？フランス産ですか？日本産は使いたくありません」
- 「トイレの水って飲んでみると意外に飲めるものですね」
- 「なぜか時間が止まることがあるんです。時間が止まっていないことを確認するために、ここにあるトイレットペーパーを丸めてちぎって、時間を物理的に保存してカウントしています」
- 「看護師さん、あなたが私の部屋を通るとき、私に呼び止められるのが面倒だから忍び足をしているのを知っていますよ。逃げても無駄です。常にあなたを呼び止めますからね」
- 「この扉の向こうに何があるかを知っていますよ。地獄って言うんですけど」
- 「私がこうやってフランスベッドで動くダニを潰すたびに、他のバリエーションの世界が核戦争で滅びるんです。知ってましたか？」

# 他の患者とやり取りできるようになった段階
- 「看護師さん、あの患者さんをついさっきファックしたところです。もちろん虚偽記憶や妄想という可能性もあるんですけど」
- 「看護師さん、私ジャンケンが弱くて、他の患者さんと合計100回ジャンケンをしたら全敗してしまったんです」
- 「看護師さん、この重い枕を持ってください。なんで枕が重いんでしょうか。催眠術ではないと思いますが...あなたがかかっているんですけどね」
- 「看護師さん、あの狭い部屋にまた戻るのが嫌なのでこの廊下で寝ます。おやすみなさい」
- 「看護師さん、実は私、火星に住んでいる家族とテレパシーで会話できるようになったんですよ」

# より広いスペースでボードゲームしたりテレビを見たりできるようになった段階
- 医師「将棋をやっているんですか？」私「はいそうです。こちらがアメリカ軍で、あちらが日○軍なんですけど、今日○軍を核攻撃しようとしているところです。たぶん、あっちが負けたら東○に核が落ちますよ」
- 医師「7並べですか。懐かしいですね」私「そうなんです。私が全ての状況を支配していて、あいつらはパスしかできません。あいつらがあと一回パスをしたらゲームが終了し、私の勝ちになるんです。ところで、人間を支配するって最高の気分ですね」
- 医師「ダウトですか。なかなか終わらないんですよね」私「終わりますよ。終わらないと思っているバカはきっとアルゴリズムについて何の知識もない哀れな連中でしょう。そういう人たちは決まって、精神医学という体系的な妄想を信じているらしいのですが、まあ私には関係の無い話ですね」
- 看護師「ミュージック・ステーション面白いですか？」私「まさか。他の哀れな患者が「君ももんだいガール」という歌詞を聞いて、自分の妄想が自分に問題があると真実を悟っているのを見るのが楽しいんです」
- 看護師「またあなたですか。そういう行動は迷惑ですよ」私「それはたぶん、あなたの被害妄想だと思いますよ」

# 再び牢獄に閉じ込められたとき
- 看護師「なにか大きい音がしましたが、壁を蹴りましたか？」私「さあ？幻聴じゃないですかね」
- 看護師「またトイレの水をばらまいているんですか」私「サタンが撒けと命じました。悪魔崇拝に目覚めたんです」
- 看護死「寝てないんですか？寝ないと体調を壊しますよ」私「ああ、もう一つの人格のキャシーの方が起きていたので、私は寝ていましたよ」

# まとめ
イースター島で環境資源を浪費してゴミを生産するよりもマシ
if文とswitch文の違いと使い分け

if文とswitch文はそれぞれどういう場合に使うのかわからなかったため、調べたことを簡単にまとめます。

## if文
if文を使用するメリットとしては、条件式を複数書くことができる点だ。
if文は複数の条件を持ち、その条件に合うところまで下りてきたらその中の処理を実行する。

## switch文
>switch文はある特定のデータの値のパターンをチェックするため、複数の比較値で条件分岐する際はswitch文を使うほうがベター

1つのデータに対して複数の値をチェックし、その値によって処理を変えたい場合はswitch文を使うほうがよさそうだ。
また、switch文のメリットはその書き方ゆえコードが長くなっても読みやすい点にある。


参考
[分岐処理のすすめ～用途で使い分ける～](https://eng-entrance.com/%E5%88%86%E5%B2%90%E5%87%A6%E7%90%86%E3%81%AE%E3%81%99%E3%81%99%E3%82%81%EF%BD%9E%E7%94%A8%E9%80%94%E3%81%A7%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%82%8B%EF%BD%9E)

[条件分岐はif文、switch文を使い分けろ！](https://blog.senseshare.jp/if-switch.html)
「オブジェクト指向を用いた線形常微分方程式の数値計算..1..」を参考にWolframAlphaとsympy でやってみた。




オリジナル

https://qiita.com/itotomball/items/8c25ffa93070603af794


# WolframAlpha で

y'' -(1/x)*y'+(1/x^2)* y = x^2

https://ja.wolframalpha.com/input?i=y%27%27+-%281%2Fx%29*y%27%2B%281%2Fx%5E2%29*+y+%3D+x%5E2&lang=en

Differential equation solution

y(x) = c_1 x + c_2 x log(x) + x^4/9


# SymPy Liveで(Pycharmでも)

以下サイトに、ソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/


```python
from sympy import *
var('x')
y = Function('ｙ')(x)
print("#",        dsolve(diff(y,x,2)-(1/x)*diff(y,x,1)+(1/x**2)*y-x**2)      )
print("#",expand((dsolve(diff(y,x,2)-(1/x)*diff(y,x,1)+(1/x**2)*y-x**2).rhs)))
# Eq(ｙ(x), x*(C1 + C2*log(x) + x**3/9))
# C1*x + C2*x*log(x) + x**4/9
```

# 参考

https://qiita.com/gamasenninn/items/8d845236c1b6f7b5b481

https://pianofisica.hatenablog.com/entry/2020/05/15/133000
Kotlin KoansでKotlin入門　第７回：Nothing type

# はじめに
公式の問題集[「Kotlin Koans」](https://play.kotlinlang.org/koans/overview)を解きながらKotlinを学習します。

過去記事はこちら
- [第０回：Kotlin Koansについて](https://qiita.com/kosuke1/items/41d192af63485bfc8cb8)
- [第１回：Simple Functions](https://qiita.com/kosuke1/items/5862a3ece96082a62e67)
- [第２回：Named arguments](https://qiita.com/kosuke1/items/2af11262852ee41b5da7)
- [第３回：Default arguments](https://qiita.com/kosuke1/items/16cb8ac780df58dc8054)
- [第４回：Triple-quoted strings](https://qiita.com/kosuke1/items/52cfeed2c49b0252d40e)
- [第５回：String templates](https://qiita.com/kosuke1/items/0221bbbc5bc70847be6f)
- [第６回：Nullable types](https://qiita.com/kosuke1/items/aa96e422c5313b6961bc)

# 問題
[Nothing type](https://play.kotlinlang.org/koans/Introduction/Nothing%20type/Task.kt)

failWithWrongAge関数にNothing戻り値型を指定してください。
Nothing 型を指定しないと、コンパイラは年齢が NULL である可能性を想定するため、checkAge 関数がコンパイルされません。


修正前のコードです。
```Kotlin
import java.lang.IllegalArgumentException

fun failWithWrongAge(age: Int?)    {
    throw IllegalArgumentException("Wrong age: $age")
}

fun checkAge(age: Int?) {
    if (age == null || age !in 0..150) failWithWrongAge(age)
    println("Congrats! Next year you'll be ${age + 1}.")
}

fun main() {
    checkAge(10)
}
```


# 問題のポイント
常に例外を投げる関数の戻り値型として、[Nothing型](https://kotlinlang.org/docs/exceptions.html?&_ga=2.92361437.1175051479.1646963407-1976109019.1644486873#the-nothing-type)を使用することができます。
この関数を呼び出すと、コンパイラは、実行がその関数の先まで続かないという情報があるためコンパイルが通ります。

# 解答例
```Kotlin
import java.lang.IllegalArgumentException

fun failWithWrongAge(age: Int?): Nothing {
    throw IllegalArgumentException("Wrong age: $age")
}

fun checkAge(age: Int?) {
    if (age == null || age !in 0..150) failWithWrongAge(age)
    println("Congrats! Next year you'll be ${age + 1}.")
}

fun main() {
    checkAge(10)
}
```
DockerfileでDocker Hub上のイメージから特定のファイルをコピーしてみる

こんにちは！こんばんは！

今回はDockerfileで特定のイメージから特定のファイルをコピーする方法を紹介したいと思います！

## まえがき

Dockerfileを書いていると特定のイメージから特定のファイルを今ビルドしているイメージ内に収めたいことが時々あります。

たとえば、Laravelの実行環境をDockerで作りたいってなったときに、[Composer](https://hub.docker.com/_/composer)のイメージから `composer` の実行ファイルをもらってきて、それを使って`composer install`したいといった使い方があるかと思います。

wgetなどを上手く使って、公開元のGitHubのレポジトリから取って来るなど様々なやり方があるかと思いますが、今回は公開されているイメージから特定のファイルのみをコピーする方法でやりたいと思います。

## イメージ間のファイルのコピーは通常通りCOPYで出来る
今回は`composer:2.2.7`のイメージからcomposerの実行ファイルを取ってきて、ビルドしている対象のイメージにcomposerをコピーしてインストールしてみます。

```Dockerfile
COPY --from=composer:2.2.7 /usr/bin/composer /usr/bin/composer
```

はい、なんとこれだけで出来ます。

マルチステージビルドをしていると同じ書き方で別のステージからファイルを持ってくるやり方がありますが、これと似た書き方でDocker Hub上で公開されているイメージからファイルを取ってくることが出来ます。

## どういう時に使うか？
個人的には特にマルチアーキテクチャ(x86_64、aarch64等)に対応したイメージをビルドしたいときには特に使える技じゃないかと思います。

たとえば、ビルド済みのバイナリを特定のイメージから取ってきて入れたいといったときには、対象のアーキテクチャを意識する必要があります。

今回の方法だとコピー元のイメージがビルド対象のアーキテクチャに対応していれば、何も指定しなくてもそのまま合ったものを取ってきてくれるので考えることが一つ減って嬉しいですね。

## さいごに
今回の手法を使うことで、wgetや複雑なワンライナーを使う必要すらなく簡単にファイルをコピーすることが出来ました。

是非、Dockerfileを書く時に活用してみてください！
formタグだけじゃない$_POST

formタグにおいてpostメソッドを指定するとフォームに入力された値が連想配列としてPHP $_POSTで使用出来るというのがこれまでの理解でした。

今回jQueryのAjaxでもPOST送信が出来て、PHP $_POSTで使用可能と学んだので備忘録とします。

```Javascript
$.ajax({
        url: 'xxxxxx',
        type: 'post'
        data: {'fruits': apples},
       })
```
上記の場合宛先となるurl('xxxxxx')にdata('fruits': apple)をPOST送信することができ、
PHPでecho $_POST['fruits']する事でapplesが出力されます。
1 snapshot file obsolete from 1 test suite. To remove it, run `yarn test -u`. はエラーっぽく見えないけどjest失敗する原因

`1 snapshot file obsolete from 1 test suite. To remove it, run 'yarn test -u'.`は
一見単なる通知に見えるが、これが原因でjestのテストは失敗したと判断される

![スクリーンショット 2022-03-11 19.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/7a017117-0c89-ab49-5f0d-f5faf986c6a4.png)

もちろん、警告通り`yarn test -u`をするとエラーが解消される。
テスト失敗しているならerror表記や赤字にしてほしい。INFOログ的にエラー出されても。。。
【PHP】PHP5でusortの比較結果が等しくなる要素の時に配列の並び順が変わってしまう

# 結論
usortの比較結果が等しくなる時(callbackが0を返す時)は配列の順番は変わらないと思っていたがPHP5ではそれが変わってしまう。
※公式ではPHP8.0.0より前のバージョンで起こるとのこと。

https://www.php.net/manual/ja/function.usort.php

# 試したこと

## 検証コード
```php
$vals = ['first', 'second', 'third'];

usort($vals, function($a, $b) {
   return 0; 
});

print_r($vals);
```

## 期待した出力
```php
Array
(
    [0] => first
    [1] => second
    [2] => third
)
```

## 実際の出力
```php
Array
(
    [0] => third
    [1] => second
    [2] => first
)
```

# PHPのどのバージョンから並び順が変わるかを確認した
[3V4L](https://3v4l.org/)を使って各バージョンの挙動を確認した。
![Screen Shot 2022-03-11 at 19.52.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272706/3f95482a-156a-af6d-c18b-498584f4d90b.png)
php5では並び順が変わってしまうらしい。
findで検索されたファイルをワンライナーで削除する

## 環境
Ubuntu20.4

## やったこと
まずはテスト用のファイルを３つ作成する。
```
touch test{1..3}.txt
```

作成されていることを確認する。
```
ls -l test*.txt
```

作成した３つのファイルが検索できることを確認する。findでワイルドカードを使うとき、ダブルクォーテーションで囲んであげないとエラーになります。
```
find . -name "test*.txt"
```

つまり、このような記述だとコマンドエラーになります。
```
find . -name test*
```

逆に、lsの場合は、ls -l "test*.txt"とするとエラーになります。

さて、３つのファイルを削除してみましょう。
```
find . -name "test*.txt" -exec rm -fv {} \;
removed './test1.txt'
removed './test2.txt'
removed './test3.txt'
```

ファイルが表示されていなければOK。
```
ls -l
```

もう一度、テストファイルを作成します。
```
touch test{1..3}.txt
ls -l test*.txt
```

このコマンドでも、同じように削除できます。
```
find . -name "text*.txt" | xargs rm -fv
removed './test1.txt'
removed './test2.txt'
removed './test3.txt'
```

ファイルが表示されていなければOK。
```
ls -l
```
Vue.jsでトランジションの内容を特定イベント時にのみ変更する

v-ifもしくはv-showで要素の表示切替を制御している場合、それをtransitionラッパーコンポーネントで囲みクラスを調整すると簡単にアニメーションが実装できる。

ただ、特定の操作でのみ要素をアニメーションさせたい場合、つまり、他の操作による要素の表示切替ではアニメーションさせたくない場合は少し工夫が必要になる。

```test.js
new Vue({
  el: '#app',
  data: {
    accBtnFlg       : false,
    navToggle        : false,
    navAnime         : 'toggle-no-anime'
  },...
  methods: {
    toFalseAccFlg : function(){
      this.accBtnFlg = false;
    },
    toggleAcc: function(e){
      this.navToggle = !this.navToggle;
      this.accBtnFlg = true;
    },
  }
});  
```

```test.html
<span class="button" @click="toggleAcc" :class="{active : navToggle}">ボタン</span>
<transition :name="accBtnFlg ? 'toggle' : 'toggle-no-anime'" @after-enter="toFalseAccFlg" @after-leave="toFalseAccFlg">
  <div class="cnt" v-show="navToggle">
  </div>
</transition>
```

1. .buttonクリック時の.cntの表示切替時にのみクラスを付け替えたいので、判定用の変数accBtnFlgを用意し、イベント時にtrueにする
2. accBtnFlgの値によってクラスの値を切り替える。「toggle-no-anime」ではdurationを0にする
3. アニメーション終了後はクラスを元に戻す必要があるので、after-enter/after-leaveにaccBtnFlgをfalseに戻すtoFalseAccFlgを設定

JavaScriptフックを使ってもタイミングが合わない…と試行錯誤していたけど、こういう時のためのデータバインディングでした。
【AWS】MFAの設定中にキャンセルしてしまったときの対処法

# これは何？
下記公式ドキュメントのIAMユーザーにMFAを強制させるポリシーを付与したのですが、
その際誤って、中断してしまいMFAが設定できなくなったのでその対処法です。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html

# 事象
MFAの設定中に中断してしまい、下記画像の様なエラーが出て再度MFAを設定できなくなった。
![20220304_174726887_chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/c0d44d3a-ce5e-acd6-12ee-af01be04cf98.png)


# 解決方法
下記手順にてMFAのリセットができ再設定することが出来ました。

## 設定に失敗したMFAのSerialNumber確認
`aws iam list-virtual-mfa-devices`コマンドで設定に失敗したMFAデバイスを特定する。
設定に失敗しているMFAデバイスは成功したものと比べ、表示される情報が少なくなっています。

```
root@kurono:~# aws iam list-virtual-mfa-devices 
{ 
   "VirtualMFADevices": [ 
 { 
   "SerialNumber": "arn:aws:iam::12345678910:mfa/kurono-test-mfa" 
 }, 
 { 
   "SerialNumber": "arn:aws:iam::12345678910:mfa/root-account-mfa-device", 
   "User": { 
   "UserId": "12345678910", 
   "Arn": "arn:aws:iam::12345678910:root", 
   "CreateDate": "2017-07-27T06:47:31+00:00", 
   "PasswordLastUsed": "2017-07-27T06:47:59+00:00" 
  }, 
   "EnableDate": "2017-07-27T07:03:10+00:00" 
  },
 ] 
} 

```

## 設定に失敗したMFAの設定削除 
手順1の確認で失敗したMFAデバイスのSerialNumberを引数として削除コマンドを実行する。
```
root@kurono:~# aws iam delete-virtual-mfa-device --serial-number 
"arn:aws:iam::12345678910:mfa/kurono-test-mfa"

```

## 失敗したMFAが削除されているか確認
再度、`aws iam list-virtual-mfa-devices`コマンドを実行し、失敗したMFAデバイスが削除されていることを確認する。
```
root@kurono:~# aws iam list-virtual-mfa-devices 
{ 
   "VirtualMFADevices": [ 
 { 
   "SerialNumber": "arn:aws:iam::12345678910:mfa/root-account-mfa-device", 
   "User": { 
   "UserId": "12345678910", 
   "Arn": "arn:aws:iam::12345678910:root", 
   "CreateDate": "2017-07-27T06:47:31+00:00", 
   "PasswordLastUsed": "2017-07-27T06:47:59+00:00" 
  }, 
   "EnableDate": "2017-07-27T07:03:10+00:00" 
  },
 ] 
} 
```
Herokuはどうなっているのか

## 1. はじめに
なんとなくRailsを始めて、なんとなく自分なりのWebアプリを作ってみて、なんとなくHerokuにデプロイしてということをしてきたが、いまいちHerokuの仕組みについてはよくわかっていないのでまとめてみる。

## 2. 前提
まず前提として、Herokuにデプロイした際にドメインが与えられるが、そのHerokuアプリには**固定IPアドレスが与えられていない**。

## 3. dynoとは何か
dynoとは軽量のLinuxコンテナであり、デプロイしたアプリはこのdynoの中で実行される。(ほぼサーバー）
dynoは言ってみればアプリケーションを動かすための箱のようなものであるため、dynoのグレードによってできることが変わってくる。dynoにはFree, Hobby, Standard, Performanceがある。Railsを始めてそれほど経ってない自分みたいなペーペーがデプロイするのは大体Free dyno。

dynoのグレードを上げる（例えばFreeからHobbyに変更する）ことを垂直方向への拡張といい、dynoの数を増やすことを水平方向への拡張という。垂直方向への拡張はサーバーを強くすることみたいな感じで、水平方向への拡張はサーバーの台数を増やすことによって負荷を分散するみたいな感じ。

dynoにはグレードがあるが、種類もある。web dyno, worker dyno, one-off dynoの３つである。
web dynoはwebプロセスを実行するタイプのdynoであり、HTTPのリクエスト・レスポンスを処理するものである。従って大半の処理はweb dynoによって行われる。Procfileに書く[web:]から始まるコマンドはまさにこれのためのもの。

worker dynoはバックグラウンド処理を行う為のdyno。バックグラウンド処理っていうのは外部の API またはサービスとの通信 (Amazon S3 へのファイルのアップロードなど)、リソース消費の大きいデータ操作の実行 (画像やビデオの処理など)のこと。詳しくは[Worker dyno、バックグラウンドジョブ、キューイング](https://devcenter.heroku.com/ja/articles/background-jobs-queueing)

one-off dynoはよくわかりません:)

（なおFreeプランHobbyプランではdynoは1つしか動かせないからweb dynoのみ）

## 4. HerokuにおけるHTTPルーティング
で、ブラウザから検索されたときにそのdynoまで届くのか。（ここが1番謎だった）
1. リクエストがあったときにまず到達するのはロードバランサー
2. ロードバランサーはルーター（複数ある）うちの１つにリクエストを送る
3. ルーターはweb dynoを特定し、dynoに対してHTTPリクエストを送る（web dynoが複数ある場合は独自のアルゴリズムを用いてランダムに選択される。）

参考：
[HTTP ルーティング
](https://devcenter.heroku.com/ja/articles/http-routing)[Rubyアプリケーションを毎分1000リクエストにスケールさせる： 初心者ガイド
](https://scoutapm.com/blog/scaling-ruby-apps-to-1000-rpm-ja)