OmniAICreator/Qiita-1.07M huggingface dataset:
【アルゴリズム】JavaScriptでフィボナッチ数列問題を解く

#はじめに
Qiitaの競技プログラミング研究月間ということで、アルゴリズムの記事を書いています。
今回はフィボナッチ数列問題をまとめました。

JavaScriptでアルゴリズムの勉強をされている方の参考になれば幸いです。
記事を順次まとめていきますので、その他の記事についてはマイページからご覧ください。

https://qiita.com/suzuki0430

https://qiita.com/official-events/5a0502a2d94ed6a00c30

#フィボナッチ数列
フィボナッチ数列のn項目を求めてください。

```
   fib(4) === 3
```

##解答
2つの解法を試してみました。

以下では、n項目までのフィボナッチ数列を計算して、配列`result`に格納しています。

```js:index.js
function fib(n) {
  const result = [0, 1]; //初期状態

  for (i = 2; i <= n; i++) {
    const a = result[i - 1];
    const b = result[i - 2];

    result.push(a + b);
  }
  return result[n];
}
```

以下は再帰関数を使って解く方法です。

```js:index.js
function fib(n) {
  if (n < 2) {
    return n;
  }

  return fib(n - 1) + fib(n - 2);
}
```
これをテストしてみると、`n=3`では1msしかかかりませんが、`n=15`だと588msもかかってしまいます。
1つ目の解法だとforループを1回まわすだけなので計算量がO(N)で済むのですが、再帰関数だと同じ計算を何度も行うので、引数nの値が大きくなるほど計算量が膨大になってしまいます。

```
 PASS  fib/test.js
  ✓ Fib function is defined (2 ms)
  ✓ calculates correct fib value for 1
  ✓ calculates correct fib value for 2
  ✓ calculates correct fib value for 3 (1 ms)
  ✓ calculates correct fib value for 4
  ✓ calculates correct fib value for 15 (588 ms)
```

再帰関数を使ったフィボナッチ数列の計算量を減らすためには、同じ引数に対する答えをメモ化します。

例えば、fib(6)を実行するとfib(4)が2回実行されますが、fib(4)が1回実行された時点でその答えをどこかに格納(メモ化)するようにします。
そして、fib(4)が2回目に実行されるときに再帰呼び出しを行わず、メモ化した値を直接返すようにします。
その結果、forループと同じO(n)の計算量で実装することができます。

以下でメモ化する関数`memorize()`を追加しています。

```js:index.js
function memorize(fn) {
  const cache = {};
  return function (...args) {
    if (cache[args]) {
      return cache[args];
    }

    const result = fn.apply(this, args);
    cache[args] = result;

    return result;
  };
}

function fib(n) {
  if (n < 2) {
    return n;
  }

  return fib(n - 1) + fib(n - 2);
}

fib = memorize(fib);
```
これをテストしてみると、`n=15`で1msしかかかっていません。

```
  ✓ Fib function is defined
  ✓ calculates correct fib value for 1
  ✓ calculates correct fib value for 2
  ✓ calculates correct fib value for 3 (1 ms)
  ✓ calculates correct fib value for 4
  ✓ calculates correct fib value for 15 (1 ms)
```

#参考資料
https://www.udemy.com/share/101WNkCEEZd11VRno=/
\377\376hって何?

この記事では、

`Bad configuration option: \377\376h`

が表示されたときに何が起こっているか、そしてどうすれば直るかを説明します。

原理はいいから解説を見たい！という人は「解決策」までスクロールしてください。

#前提知識その1 Unicode
Unicodeとは、簡単に言うと「コンピュータで文字を管理しやすくするために、世界中(※一部地域を除く)の文字に0番から65535番までの番号を付けた規格」です。
「A」はU+0041、「麻」はU+9EBB、・・・のように、「U+」の後に番号を表す4桁の16進数を付けて表現することが一般的です。

文字列を扱うときは、これらの文字の番号を並べて表します。例えば`青い鳥`という文字列の文字の番号を並べると
`9752 3044 9CE5`
となりますが、`青い鳥`と書かれたtxtをバイナリエディタで開いてもこれがそのまま見えるわけではありません。

#前提知識その2 エンディアン
コンピュータで2バイト以上の数を扱うときは、2種類の保存方法があります。**ビッグエンディアン**と**リトルエンディアン**です。

##ビッグエンディアン
バイトを「左から順」に並べる方法です。例えば0x01020304(十進数の16,909,060)は
`01 02 03 04`
という順序で保存されます。ビッグエンディアンは、人間が書くのと同じようにメモリに保存されるので、人間にとってわかりやすいというメリットがあります。

##リトルエンディアン
バイトを「右から順」に並べる方法です。例えば0x01020304(十進数の16,909,060)は
`04 03 02 01`
という順序で保存されます。リトルエンディアンは、コンピュータの内部で処理するのに都合がいいというメリットがあります。

#前提知識その3 BOM
では、保存されたデータがビッグエンディアンなのかリトルエンディアンなのかを判断するには、どうすればよいでしょうか? そのために、Unicodeには特殊な文字が用意されています。それが、Byte Order Mark、通称BOMと呼ばれる、U+FEFF(65279番)の文字です。この文字は見た目上は何もありませんが、コンピュータ上でビッグエンディアンとリトルエンディアンを区別するために使われます。
実際には、テキストの最初にこの文字を最初に置くことで、`FE FF`であればビッグエンディアン、`FF FE`であればリトルエンディアンとして区別できます。

しかし、必ずしもBOMがテキストの最初にあるとは限らないので、「最初の文字がたまたまU+FFFEだったら逆に認識されるのではないか?」という疑問が生まれます。そこはすでに対策済で、「U+FFFEは「文字ではない」とする」ことで解決しています。つまり、意図的にそうしない限りU+FFFEがテキストに現れることはないので、U+FFFEを見たらU+FFEFを間違ったエンディアンで読んだものだとわかる、というわけです。

#前提知識その4 \\+3桁
CやRubyなどのプログラミング言語では、バックスラッシュ(`\`、フォントによっては円記号として表示される)の後に0～7の数字を1個～3個続けることで、「八進数でその値をUnicodeの番号として持つ文字」を表すことができます(ただし、八進数の`400`以上の数を指定した場合に実際にどうなるかは言語や環境に依存します)。
たとえば、`\63`と書くと八進数の63、つまり51番の文字(数字の3)になり、`\123`と書くと八進数の123、つまり83番の文字(大文字のS)になります。

#前提知識その5 UTF-8
UTF-8というエンコーディング方式があります。これもUnicodeを基にしているのですが、少し特殊で「0番から127番までは番号を1バイトでそのまま表せる」という性質があります。

#以上の知識をまとめると・・・?
では、`\377\376h`について考えていきましょう。八進数の`377`は十六進数で`FF`、八進数の`376`は十六進数で`FE`です。そのままつなげると`FF FE`ですが、これはエンディアンを間違えたBOMですね。逆順に並べると`FE FF`となり、この2文字がBOMであることがわかります。逆順なので、リトルエンディアンですね。

`h`はおそらく本来のテキストの最初の文字です。ということは、BOMを外してあげればコンピュータに認識できそうですね。

#解決策
UTF-8に置き換えれば解決します。UTF-8に変換する場合、自動的にBOMが外れることが多く(少なくとも私の使っているエディタはそうでした)、元のテキストがASCII文字であればUTF-8でもASCIIでも同じバイト列になるため、コンピュータも「なんだこの文字は！？」というエラーを出すことがなくなります(今度は内容に対するエラーが出るかもしれませんが)。
カルマンフィルターその4

# 状態変数のフィルタリング値の直感的な意味
前回のブログでは、t-1期の情報からt期の状態変数の予測値$\hat \beta_{t|t-1}$ と、状態変数の予測値の分散$\hat \Sigma_{t|t-1}$の式展開を説明した。今回はt期の情報からt期の状態変数の推定値、すなわち、フィルタリングを説明する。この状態変数のフィルタリング値を $\beta_{t|t}$ と書くことにするが、この導出は若干、複雑になる。
このため、今回は2変量正規分布の特性からフィルタリング値の直感的な導出を行い、式展開による $\beta_{t|t}$ の導出は、次回以降のブログに譲ることにする。

## 2変量正規分布
2つの確率変数 $ Z, Y$があり、各々正規分布に従うとする。すなわち、$ Z ～ N(\mu_z, \sigma_z^2)$, $ Y ～ N(\mu_y, \sigma_y^2)$とする。このとき、
* 無条件の期待値は各々、$\mu_z = E(Z)$, $\mu_y = E(Y)$
* 無条件の分散は各々、 $\sigma_z=Var(Z)=E[(Z-\mu_z)^2]$, $\sigma_y=Var(Y)=E[(Y-\mu_y)^2]$
* 無条件の共分散は、$\sigma_{zy}=\sigma_{yz}=Cov(Z,Y)=E[(Z-\mu_z(Y-\mu_y))]$
* 無条件の相関は、$-1\leqq \rho_{zy}=\frac{Cov(Z,Y)}{\sqrt{Var(Z)}\sqrt{Var(Y)}}=\frac{\sigma_{zy}}{\sigma_z \sigma_y}\leqq1$
となる。

## 条件付き期待値、条件付分散
まず、2変量正規分布に従う確率変数を考える。ある観測値 $Y=y$ が得られたとする。このとき、確率変数Zの期待値は次のようになる。

$E(Z|Y=y)=\mu_{z|Y=y}=\mu_z + K (y-\mu_y) \tag{11}$
$K = \frac{Cov(Z,Y)}{Var(Y)} \tag{12}$

(11)条件付期待値の右辺の意味は$Z$の無条件期待値 $\mu_z$ に**実現値$y$ と Yの期待値$\mu_y$との差(新しい情報の価値)**から得られている。
(12)の$K$の意味は単回帰係数$\beta$と同じ意味であり、平たく言えば2つの変量間の傾きである。すなわち、新しく得られた情報$Y=y$に基づいて$Z$を推定していることになる。尚、$Cov(Z,Y)=0$、つまり無相関ならば、$K=0$となり、条件付分散 $E(Z|Y=y)=\mu_z$ となる。つまり、無条件期待値と同じになり、変数Zにとっては、Yの情報の価値はないということになる。

次に2変量正規分布に従う、確率変数Zの条件付分散は次のように示すことができる。
$Var(Z|Y=y) = \sigma^2_{z|Y=y}=(1-\rho^2_{zy})\sigma_z$

これは$\rho_{zy}\neq0$であれば、条件付分散$\sigma^2_{z|Y=y}$は無条件分散$\sigma^2_z$よりも小さくなることを意味する。新しい情報$Y=y$を得たことで推定の精度が向上していることを示している。

## 状態変数のフィルタリング値
上記の例に従い、状態変数と観測変数の関係について述べる。
状態変数$\beta_t$と観測変数$Y_t$の関係も2変量正規分布と同様の関係といえる。唯一の違いは、各変数が時間変化する変数となる点である。すなわち、 次のようになる。

$\hat \beta_{t|t}= \hat \beta_{t|t-1}+ K_t (Y_t - \hat Y_{t|t-1}) \tag{13}$

(13)の右辺の意味は$\beta$の1期前からの期待値 $\hat \beta_{t|t-1}$ に**実現値$Y_t$ と Yの1期前の期待値$\hat Y_{t|t-1}$との差(新しい情報の価値)**から得られている。また2変量正規分布と同様に$K_t$が2つの変数間の間をつなぐ役割を果たしている。この$K_t$をカルマンゲインといい、後日このブログで解説する。

最後に、状態変数のフィルタリング値の分散を示すと以下のようになる。

$\hat \Sigma_{t|t}= (1 - X_t K_t) \hat \Sigma_{t|t-1}\tag{14}$

カルマンゲインの解説で示すが$0\leqq X_t K_t\leqq1$となるため、$X_t K_t\neq0$であれば、フィルタリング値の分散$\hat \Sigma_{t|t}$は1期前の情報から予測した分散$\hat \Sigma_{t|t-1}$よりも小さくなることを意味する。新しい情報$X_t$を得たことで推定の精度が向上していることを示している。ここで、唐突に$X_t$が出てきたと思われる方もいるかもしれないが、これは[第2回のブログ](https://qiita.com/yukio_takagi/items/ec321d0fffd556e11c62)の観測方程式(1)の$Y_t$の説明変数$X_t$である。$X_t$が得られたことで推定値の精度がよくなることを意味する。
【VBA】シートモジュール内でPrivateキーワードを使用する場合の注意

#はじめに
シートモジュール内で`Private`キーワードを付けたプロシージャの呼び出しに失敗したので、記事に残しておきます。
同じモジュール内であっても、オブジェクト名や`Me`キーワードを付けると、プロシージャを呼び出すことができないみたいです。
#標準モジュール
```vb
'＠標準モジュールModule1
Private Sub TestPrivate()
    Debug.Print "private"
End Sub

Sub Test1()
    TestPrivate '=> private
End Sub

Sub Test2()
    Module1.TestPrivate '=> private
End Sub
```

モジュール名を付けても付けなくても、プロシージャを呼び出すことができました。
#シートモジュール
```vb
'＠シートモジュールSheet1
Private Sub TestPrivate()
    Debug.Print "private"
End Sub

Sub Test1()
    TestPrivate '=> private
End Sub

Sub Test2()
    Sheet1.TestPrivate
    '=> コンパイルエラー：メソッドまたはデータメンバーが見つかりません。
End Sub

Sub Test3()
    Me.TestPrivate
    '=> コンパイルエラー：メソッドまたはデータメンバーが見つかりません。
End Sub
```

オブジェクト名や`Me`キーワードを付けてプロシージャを呼び出すと、コンパイルエラーが発生します。
他のモジュールからプロシージャを呼び出したような動きになっているみたいです。
ちなみにブックモジュールでも同様の結果となりました。
#クラスモジュール
```vb
'＠クラスモジュールClass1
Private Sub TestPrivate()
    Debug.Print "private"
End Sub

Public Sub Test1()
    TestPrivate
End Sub

Public Sub Test2()
    Me.TestPrivate
End Sub
```

```vb
'＠標準モジュールModule1
Sub Test1()
    Dim cl As Class1
    Set cl = New Class1

    cl.Test1 '=> private
End Sub

Sub Test2()
    Dim cl As Class1
    Set cl = New Class1

    cl.Test2
    '=> コンパイルエラー：メソッドまたはデータメンバーが見つかりません。
End Sub
```

シートモジュールと同様、`Me`キーワードを付けてプロシージャを呼び出すと、コンパイルエラーが発生します。
#おわりに
シートモジュール内で不必要に`Me`キーワードをたくさん書いていたため、このような失敗をしてしまいました。
詳細はよくわかりませんが、シート(オブジェクト)モジュールについて注意しなければならない、というよりは、特定のオブジェクトを持たない標準モジュールの方が特殊なのかもしれませんね。
ちなみにプロシージャだけでなく、変数も同じような挙動をとります。
Discord APIの備忘録集

# この記事は何？
自身がDiscord BOTの開発を通して得た、忘れがちな知識をまとめておく記事です。
ご覧になる皆さんにとって、参考になるかは分かりませんが共有しておこうと思います。
内容は、随時更新されます。

なお、サンプルコードなどを載せる際は、基本的にライブラリは[discord.js](https://discord.js.org/)を使用します。

# 目次
- **[リクエスト系](#リクエスト系)**
  - [Create DM](#create-dm)
  - [Get Channel Message](#get-channel-message)
- **[イベント系](#イベント系)**
  - [MESSAGE_REACTION_ADDイベント](#message_reaction_addイベント)
- **[スレッド関係](#スレッド関係)**
  - [thread_metadataのlockedプロパティ](#thread_metadataのlockedプロパティ)
  - [その他わかっていること](#その他わかっていること)
- **[その他](#その他)**
  - [BOTのトークンからIDを取り出す](#botのトークンからidを取り出す)
  - [トリビア](#トリビア)

# リクエスト系
## Create DM
[Create DM](https://discord.com/developers/docs/resources/user#create-dm)はDMチャンネルが無くても作成済みでもDM Channelのデータが得られますが、DMチャンネルを新規作成する際に `CHANNEL_CREATE` イベントは発火しません。

## Get Channel Message
[Get Channel Message](https://discord.com/developers/docs/resources/channel#get-channel-message)は基本的にMessageを構成するすべてのデータが手に入りますが、一部のデータは別途取得する必要があります。

### Channelのデータ
Channel自体のデータは得られず、`channel_id`プロパティとしてチャンネルのIDだけが得られます。
ほとんどのライブラリは、Discordへの接続時にチャンネルデータをキャッシュしていて、ライブラリ内でデータを補完するため、気にする必要はありませんが、必要に応じて[`GET/channels/{channel.id}`](https://discord.com/developers/docs/resources/channel#get-channel)でデータを別途フェッチして取得する必要があります。

### Userのデータ
`author`プロパティとして、`id` `username` `avatar` `discriminator` `public_flags`プロパティを含むオブジェクトが得られます。
（対象のユーザがBOT場合のみ`bot`プロパティが含まれす。）
そのため、ギルド内・DM内のメッセージに関わらず、User/Memberのデータどちらの完全なデータを得たい場合でも、別途フェッチして取得する必要があります。

### メンションのデータ
`mentions`プロパティとして[Userのデータ](#userのデータ)と同様のデータが配列で、`mention_roles`プロパティとしてロールのIDが配列で得られます。

### Reactionのデータ
`reactions`プロパティとして、`emoji` `count` `me`のプロパティを含む**全リアクションの**オブジェクトの配列が得られます。
更に`emoji`プロパティは、`id` `name`プロパティを含むオブジェクトが得られます。

なお、リアクションしたユーザーに関するデータは一切含まれないため、必要に応じて[`GET/channels/{channel.id}/messages/{message.id}/reactions/{emoji}`](https://discord.com/developers/docs/resources/channel#get-reactions)でデータを別途フェッチして取得する必要があります。

# イベント系
## MESSAGE_REACTION_ADDイベント
リアクションされたメンバーや各種IDのデータが得られますが、Guild、Channel、Message、Roleなどのデータは別途取得する必要があります。

### 各種IDのデータ
リアクションされたメッセージの`guild_id` `channel_id` `message_id`、リアクションしたユーザーの`user_id`が得られます。

### User/Memberのデータ
`member`プロパティとして、完全なMemberのデータが得られます。
なお、Memberのデータに含まれる`user`プロパティは、[Userのデータ](#userのデータ)と同様の内容のものが得られます。

### Emojiのデータ
`emoji`プロパティとして、`name` `id` プロパティを含むオブジェクトが得られます。

# スレッド関係
## thread_metadataのlockedプロパティ
設定時間発言が無かった場合に起こる自動アーカイブと `スレッドの管理` 権限を持たないユーザーによる手動アーカイブでは `false`、`スレッドの管理` 権限を持ったメンバーによる手動アーカイブでは `true` となる。

## その他わかっていること
- スレッドがアーカイブされる時間は正確ではなく、数分ほどのタイムラグがある。

# その他
## BOTのトークンからIDを取り出す
Discordのトークンは先頭から最初の `.` までがbase64にエンコードされたBOTのIDになっているので、最初の `.` 以降を取り除いてデコードすれば元のIDが得られる。

```js
atob('YOUR_BOT_TOKEN'.replace(/\..+/, ''));
```

## トリビア
- Slash Commandsの使用に、『チャンネルを見る』権限は不要
- メッセージ内でURLが重複している場合は、同URLに対して1つまでしか埋め込みが表示されない
【Rails】Bootstrapを活用し、アイコンを押すと指定のリンクに飛ばす方法

# はじめに
今回はBootstrapで使用できるアイコンを押すと、
指定のパス先へ飛ぶ方法について書かせていただきます。

BootstrapのアイコンURL：https://icons.getbootstrap.jp/

下記イメージです！
このようなヘッダーの人型のアイコンを押すと、ユーザー詳細ページに飛ぶような場合

![スクリーンショット 2021-06-13 12.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623096/eedee7b4-4fa2-e9de-5572-2a6b1e36de15.png)

※今回はBootstrapの基本的な使い方等は割愛させていただきます。

# 開発環境
Bootstamp バージョン５
Ruby on Rails バージョン2.6.5

<!-- 各チャプター -->
# 記述方法
通常Railsでパスを指定する際には下記のlink_toメソッドを使用します。

```:link_toメソッド
  <%= link_to '表示させる文字列', （指定のパス）_path, method: :メソッド, class: "" %>
```

最初、自分は”表示させる文字列”の部分にアイコンのHTMLを差し込めば表示させれるかなと思い、記述してみましたがうまくいきませんでした。
（式展開でHTMLを記述しましたが、コードがそのまま表示されてしまいました💦）

解決策としてlink_toメソッドの記述の仕方を下記に変更することで問題が解決しました！

```:link_toメソッド
 <%= link_to( 指定のぱす _path)  do %>
    表示させる文字
 <% end %>
```

# 完成形

```:完成形
<%= link_to(user_path)  do %>

# アイコンの記述
  <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30"fill="currentColor" class="bi bi-person-circle mx-3 text-dark" viewBox="0 0 16 16">
    <path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
    <path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
  </svg>

<% end %>
```

この書き方で先程のフッダー画像の人型のアイコンを押すとユーザー詳細ページへ飛ぶように設定できました！
CSSでテキストのデコレーションを消さないと、アイコンが青色のリンク色になってしまうので気をつけてください！
Oracle実験室 / Oracle Database 19c (19.3) / 各種操作

# データファイル移動
## 実験用データファイル作成
```SQL
ALTER TABLESPACE USERS
  ADD DATAFILE '/u01/app/oradata/ORCLCDB/users01.dbf' SIZE 100M AUTOEXTEND ON NEXT 500K MAXSIZE UNLIMITED;
```
## DBA_DATA_FILESビューで確認
```SQL
SELECT t.FILE_ID, t.FILE_NAME FROM DBA_DATA_FILES t;
```
|FILE_ID|FILE_NAME|
|---|---|
|9|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/system.276.1075069671|
|10|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/sysaux.277.1075069671|
|11|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/undotbs1.275.1075069671|
|12|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/users.279.1075069691|
|14|<font color='red'>/u01/app/oradata/ORCLCDB/users01.dbf</font>|
## データファイル移動
```SQL
ALTER DATABASE MOVE DATAFILE 14 TO '+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/users01.f';
```
## DBA_DATA_FILESビューで確認
```SQL
SELECT t.FILE_ID, t.FILE_NAME FROM DBA_DATA_FILES t;
```
|FILE_ID|FILE_NAME|
|---|---|
|9|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/system.276.1075069671|
|10|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/sysaux.277.1075069671|
|11|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/undotbs1.275.1075069671|
|12|+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/users.279.1075069691|
|14|<font color='red'>+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/users01.f</font>|
## データファイル移動
```SQL
ALTER DATABASE MOVE DATAFILE 14 TO '+DATA/ORCLCDB/C4929741FD3938D6E0536538A8C01E30/DATAFILE/users01.f';
```
# 初期化パラメータ
## 確認
- 初期化パラメータの確認
```SQL
select v.NAME,
	   v.VALUE,
	   v.ISDEFAULT,
	   v.ISSES_MODIFIABLE,
	   v.ISSYS_MODIFIABLE,
	   v.ISMODIFIED
from V$PARAMETER v;
```
'/tmp/mysql.sock' (2)エラー解決方法

#環境
Rails6.1.3
Ruby3.0.1
MySQL8.0.23

#エラー内容

時々、

```
ActiveRecord::ConnectionNotEstablished (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)):
```
というソケットに接続できないエラーが出ることがあります。


#原因
原因の一つとして考えられるのが、Mysqlサーバーが起動していないことです。
MySQLサーバーの状態を確認してみます。

```
% mysql.server status
 Permission denied
 ERROR! MySQL is not running, but PID file exists
```

PIDファイルはあるが、サーバーが動いていないと表示されました。
`PID`とは`プロセスIDのことで、プロセスを管理するための識別子のこと`です。実際にファイルの中身をみてみると整数が割り当てられていると思います。
PIDファイルもない場合は、ファイルを作成することになります。

#解決方法
サーバーを動かすために以下のコマンドを入力します。

```
% sudo mysql.server start
Starting MySQL
 SUCCESS! 
```

これでもうまくいかない時は、

```
% sudo mysql.server restart
```

も試してみてください。
CIFS SAMBAでfstabに設定したのに書き込めない時に見るページ

フォルダを

```
writable = yes
writeable = yes
```
としているか？同じようで違う単語、機能は同じなのかまでは調べていない。


fstabでマウント設定を書いた後、mount -aでcifsは前のマウントをumountしてくれない。手動でumountすべし。その後、再度mount -aや。

例：

```
sudo umount /mnt/cifs
sudo mount -a
```
Laravelのnull判定系の処理実装（is_null, isset, optional）

null判定系をよく使うのですが、使い方によってメソッドが異なるので、いくつか整理していこうと思います


|値|if($var)|isset|empty|is_null|
|:--|:--:|:--:|:--:|:--:|
|$var=1|**true**|**true**|*false*|*false*|
|$var="";|*false*|**true**|**true**|*false*|
|$var="0";|*false*|**true**|**true**|*false*|
|$var=0;|*false*|**true**|**true**|*false*|
|$var=NULL;|*false*|*false*|**true**|**true**|
|$var|*false*|*false*|**true**|**true**|
|$var=array()|*false*|**true**|**true**|*false*|
|$var=array(1)|**true**|**true**|*false*|*false*|



# is_null(), isset()

```php:is_null()
if(is_null($test_answer)) {
  // 実行させたい処理を記述
  echo 'nullですよ'
}

if(!is_null($test_answer)) {
  // 実行させたい処理を記述
  echo 'nullじゃない'
}
```

```php:isset()
if(isset($test_answer)) {
  // 実行させたい処理を記述
  echo 'nullじゃないですよ'
}
```

# optional()の使い方
`optional(値がnullでない場合実行, nullの場合はnullを返す)`

```php
$street = ($user->address) ? $user->address->street : null;
```

```php:リレーションやメソッドを引き出す場合
$street = optional($user->address)->getStreet();
```

```php:関数やメソッドを利用する場合
return optional($date, fn() => Test::parse($date)) ?? [];
```


````php:メソッドを実行する場合
return optional(User::find($id), function ($user) {
    return new DummyUser;
});
````
flaskの仮想環境の作り方

前提
MAC os
Anacondaをインストールしていること


仮想環境をflaskenv2という名前で、Python3.8で作成
conda create -n flaskenv2 python=3.8


作成されているか、確認をする。
conda env list


仮想環境を有効化する
conda activate flaskenv2

成功すれば、以下のように変わる

(flaskenv2) yusuke@mbp

現在インストールしている環境の確認
conda list

# Name                    Version                   Build  Channel
ca-certificates           2021.5.25            hecd8cb5_1
certifi                   2021.5.30        py38hecd8cb5_0
libcxx                    10.0.0                        1
libffi                    3.3                  hb1e8313_2
ncurses                   6.2                  h0a44026_1
openssl                   1.1.1k               h9ed2024_0
pip                       21.1.2           py38hecd8cb5_0
python                    3.8.10               h88f2d9e_7
readline                  8.1                  h9ed2024_0
setuptools                52.0.0           py38hecd8cb5_0
sqlite                    3.35.4               hce871da_0
tk                        8.6.10               hb0a8c7a_0
wheel                     0.36.2             pyhd3eb1b0_0
xz                        5.2.5                h1de35cc_0
zlib                      1.2.11               h1de35cc_3

flaskがないので、flaskをインストール

pip install flask

現在インストールしている環境の確認
conda list

# Name                    Version                   Build  Channel
ca-certificates           2021.5.25            hecd8cb5_1
certifi                   2021.5.30        py38hecd8cb5_0
click                     8.0.1                    pypi_0    pypi
flask                     2.0.1                    pypi_0    pypi
itsdangerous              2.0.1                    pypi_0    pypi
jinja2                    3.0.1                    pypi_0    pypi
libcxx                    10.0.0                        1
libffi                    3.3                  hb1e8313_2
markupsafe                2.0.1                    pypi_0    pypi
ncurses                   6.2                  h0a44026_1
openssl                   1.1.1k               h9ed2024_0
pip                       21.1.2           py38hecd8cb5_0
python                    3.8.10               h88f2d9e_7
readline                  8.1                  h9ed2024_0
setuptools                52.0.0           py38hecd8cb5_0
sqlite                    3.35.4               hce871da_0
tk                        8.6.10               hb0a8c7a_0
werkzeug                  2.0.1                    pypi_0    pypi
wheel                     0.36.2             pyhd3eb1b0_0
xz                        5.2.5                h1de35cc_0
zlib                      1.2.11               h1de35cc_3

flaskのインストールが確認できた。
SSHのパブリックキー認証でパスワードを要求される


# SSHログインでパスワードが求められる！

ある計算機（クライアント）から別の計算機（サーバー）へSSHでログインする際にパスワード入力を省略するために，クライアントのユーザーのRSA公開鍵をサーバー側の ~/.ssh/authorized_keys に追加したけれど，相変わらずパスワード入力を求められる。
~/.ssh/authorized_keys のパーミッションは 600 に，~/.ssh/ は 700 にしている。

# 原因

原因は，サーバー側計算機の当該ユーザーのホームディレクトリそのもののパーミッションが 777 となっていたこと。これを 755 としたらパスワード入力なしでログインできるようになった。


# 環境

・CentOS 7.5

Qiita，ssh の man ページを含め調べてみたが，この情報は見当たらなかったので書いておく。
→ sshd (8) の man ページに記述があった。（ angel_p_57 さんよりコメント，ありがとうございます。）

# リンク

・Qiita: [「SSHの公開鍵ってなに?」の「公開鍵の登録」の章](https://qiita.com/angel_p_57/items/19eda15576b3dceb7608#公開鍵の登録)
[OutSystems]Associate Reactive Developerのサンプル問題について解説 3/4(#11-#15)

Associateは入門レベルの試験で、この試験の合格が他の試験の受験資格にもなっています。
Reactiveとついている通り、Reactive Web App開発の基礎的な知識を問われる試験。

試験問題は、
https://www.outsystems.com/learn/certifications/
の、「Associate Reactive Developer (OutSystems 11)」項目のリンク「Exam Details」でダウンロードできる資料から。解凍したら、Japaneseフォルダにあるファイル「Associate Reactive Developer Sample Exam - JP.pdf」を開いてください。

[Associate Reactive Developerのサンプル問題について解説 1/4(#1-#5)](https://qiita.com/jyunji_watanabe/items/b9c88df3c5a97853ae5f)
[Associate Reactive Developerのサンプル問題について解説 2/4(#6-#10)](https://qiita.com/jyunji_watanabe/items/95fc314f04c06d98449d)
Associate Reactive Developerのサンプル問題について解説 3/4(#11-#15)
[Associate Reactive Developerのサンプル問題について解説 4/4(#16-#20)](https://qiita.com/jyunji_watanabe/items/1c7d603b5e66d0aa305a)

#11 画面のウィジェット（Dropdown）
Dropdown Widgetの基本的な使い方は、

- Listプロパティ：選択肢を持つList型の変数を設定。一般的にはAggregateやData Actionの戻り値
- Options Textプロパティ：List変数の各レコードの属性から、実行時にUIに表示するものを設定
- Options Valueプロパティ：List変数の各レコードの属性から、UI上でその選択肢が選ばれたときに、Variableに値として設定するものを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d1bcc153-73a4-db49-4806-7cc4cf9ac988.png)

設問はOptions Textの設定を聞いていて、UI上では色の名前を出したい。
紐付けているListがStatic Entityで、しかも属性がデフォルトのまま。この場合、Label属性に表示するべきテキストが入っているはず。
よって選択肢D（Color.Label）が正解。

#12 画面のウィジェット（Button）
ButtonのOn Clickプロパティに設定できるのは、
画面（選択肢A）、Client Action（選択肢B。ただし設定できるのはScreen Action）、外部サイト（選択肢D。UI Flow内に作るExternal Siteを設定する。ビルトインのテンプレートから作ったアプリケーションにはRedirectToURLというのが最初からある）
が該当します。

設問は設定できないものを聞いているので選択肢C（ブロック）が正解。

#13 ロジックフローと例外処理処理（Switch）
Action FlowにおけるSwitchの使い方についての問題。
SwitchはIfに似ていますが、分岐が2つではなく、可変の複数個になります。

Switchから出ている線についているテキストが「1(N>0)」となっていますが、これは、この分岐は「N>0」の結果がTrueであるときに選択されるものであることを示している。
先頭の数字（この場合は1）は、分岐判定の優先順位を示している。この数字が若い順に条件をチェックして、最初にTrue出会った分岐へ進みます。

ではどの条件にも合致しなかった場合は、というと、「Otherwise」の分岐へ進む。

Switchの各分岐を見ると、

1. N>0のとき、abs=N
1. N<0のとき、abs=N*-1 (符号を逆転させている）
1. それ以外（つまりN=0）のとき、abs=0

であるから、N=0のとき、abs=0であるから選択肢C（入力パラメータ（N）が0のとき。）が正しいですね。

#14 ロジックフローと例外処理処理（例外）
問題の条件に従って、フローを追ってみましょう。

1. 「GetEmployeeById Aggregateがレコードを返さなかった場合」、GetEmployyById.EmptyはTrueになります（結果が空であることを判断するためのプロパティなので）。
2. つまり、三角形のアイコン（Raise Exception）で「RecordNotFound」ExceptionをTrigger。
3. Exception Handlerは2つ置いてありますが、より具体的なハンドラが優先して機能します。この場合は、RecordNotFoundのHandlerに到達

選択肢B（RecordNotFoundフローが実行される。）が正解ですね。

#15 クライアントアクションとサーバーアクション（クライアントアクション）
Functionプロパティは、Actionを式の中で呼び出せるようにするというプロパティです。
このプロパティをYesに設定したActionはUI上のExpressionや、Action Flow中の式などで以下のように書くことができます。

```
AddDays(CurrDateTime(), 1)
```

Output Parameterは1つでないといけません。

各選択肢を見ていきます。
A：○。上の説明の通り、出力パラメータは1つに限定される
B：×。Noにすると他のモジュールで使えなくなるのは、Publicプロパティです
C：×。Publicかどうかと、Functionかどうかは独立の設定
D：×。特にそういう成約はなく、Action Flowの中で普通のAction呼び出しとして、あるいは式の中で使えます

よって正解は選択肢A（FunctionプロパティをYesにすると、アクションの出力パラメータが1つのみに制限される。）。


-
gemパッケージのインストール先を表示させる


`gem env gemdir` でインストール先のパスが表示される。

```
$ gem env gemdir
/Users/yusaku/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0
```

```
$ ls `gem env gemdir`
build_info	doc		gems
cache		extensions	specifications
```
Redditの日本語版サイト（ようなもの）作ってみた

![スクリーンショット 2021-06-13 104311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480294/fb949204-1d3d-3a76-33dd-9c34a6832134.png)

#はじめに
[reddit](https://reddit.com)という海外の掲示板サイトの日本語版のようなものを作ってみました。

https://fiddet.com/

#概要
5chのような掲示板サイトです。登録をすると自分の立てたスレの通知や一覧が見れたりします。

#工夫した点
登録なしでもありでも使えるようにすること。
Vuexまとめ

#目次
[1.はじめに](#1-はじめに)
[2.Vuexの項目](#2-内容い)
[3.Vuexの流れ](#3-内容ろ)
[4.どういう使い方をするか](#4-どういう使い方をするか) 

#1. はじめに
Vuexの必要性を感じたのでノート的にまとめて頭を整理していきます。

**Vuexとは**
コンポーネント間の共通の処理を記述する場所（現在のイメージ）。
#2. Vuexの項目
| 項目|役割|
|:-------|------|
| state | データを保持する。Vueのdataに該当|
| getters|算出プロパティ。Vuex内ののcomputed。|
| mutations|Vuex内の値であるstateを変更する。原則ここ経由以外でのstateの変更はしてはいけない|
| actions |非同期処理を行う。action以外の項目は同期処理|


#3. Vuexの流れ
同期処理と非同期処理でこの辺は変わる。

**同期処理**
① ``mutations``でstateの値を変更する処理を記述
↓
②``state``の値を変更


**非同期処理**
① ``actions``で非同期処理の記述とmutationのメソッドを実行
↓
② ``mutations``でstateの値を変更する処理を記述
↓
③``state``の値を変更

**流れのまとめ**
- 同期処理
 ``mutations``→ ``state``

-非同期処理
``actions``　→ ``mutations``　→ ``state``

#5. どういう使い方をするか

今回は外部APIを使用するので,
非同期処理の流れになる。

①　actionでリクエストを送信
②　mutatioinでstateの配列に受け取ったデータを保存
③　データを保存してある配列を他のコンポーネントで呼び出し使用
ケルベロス認証 とは

## 勉強前イメージ

なんかの認証方法？
イメージつかない

## 調査

### ケルベロス認証 とは

地獄の番犬、ケルベロスが由来であり
ネットワーク認証方式の1つで、サーバとクライアント間の身元確認のために使用される認証・認可のプロトコルです。
TCP:88 番ポートを使います。
現在ではKerberosバージョン5が主に使用されているので、 `KRB5` とも呼ばれています。

クライアントとサーバ間での通信を暗号化できるます。
ケルベロス認証では、一度ログインすると次からはID,パスワードは入力の必要はありません。

### ケルベロス認証の構成要素・用語

ケルベロス認証の構成要素として、
`KDC、AS、TGS、プリンシパル` があります。

- KDC

Key Distribution Centerの略で、サーバとユーザに関する情報を一括管理するデータベースになります。
どのIDがどのサーバに対する権限を持っているかなどを見ています。

- AS

Authentication Serverの略で、IDとパスワードの認証を行うサービスになります。

- TGS

Ticket Granting Serverの略で、チケット発行を行うサーバになります。

- TGT

Ticket Granting Ticketの略で、身分証のようなチケットのことです。

- プリンシパル

KDCが、サーバとユーザに関する認証を行う際に使用する
ユーザやサーバのことを指します。

- レルム

ケルベロス認証で扱うグループを表します。
ケルベロス認証では、レルムをグループ名として論理ネットワークを定義します。
シングルサインオンの一種になります。

### ケルベロス認証の流れ

1. ユーザが正しいIDとパスワードをAS(IDとパスワードの認証を行うサービス)に送信。
2. 認証が成功するとTGS(チケット発行を行うサーバ)からチケットが発行されます。
   ケルベロス認証では、アクセス権などはチケットを使用して確認します。
3. 発行したチケットをユーザに送ります。
4. ユーザはそのチケットを使用して、特定のファイルサーバへの要求を行います。
5. チケットが問題なければファイルサーバ用のチケットをユーザに送ります。
6. 特定のファイルサーバ用のチケットを使用して、ファイルサーバはアクセスを許可します。


## 勉強後イメージ

なんかかっこいい名前だなぁ・・・
ID、パスワードは最初だけで、その後はチケットで管理してるのか

## 参考

- [Kerberos Authentication](https://www.infraexpert.com/study/security18.html)
- [【図解】初心者にも分かるKerberos認証とspnegoの仕組み ～SSOのシーケンス,統合windows認証について～](https://milestone-of-se.nesuke.com/sv-advanced/activedirectory/kerberos-spnego/)
- [Kerberos認証とは？基礎知識3つのわかりやすい解説をご紹介！](https://www.fenet.jp/infla/column/network/kerberos%E8%AA%8D%E8%A8%BC%E3%81%A8%E3%81%AF%EF%BC%9F%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%983%E3%81%A4%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E8%A7%A3%E8%AA%AC%E3%82%92%E3%81%94/)
Pythonでcsvを扱う方法


#はじめに
機械学習関連の開発で、大量に出力されたCSVデータを扱う機会があったので、Pythonでcsvデータを扱う方法を備忘録としてまとめてみました。

#CSVファイルの中身を1行ずつ表示する
csvファイルを扱うにはpythonに標準的に備わっているcsvモジュールを使用します。
csvファイルを指定して、行の内容をリストとして表示するには以下のように書きます。

```python
import csv

#読み出したいファイルのパス
f = open("C:\\Users\\redpe\\Desktop\\XXXXX.csv")
reader = csv.reader(f)

#1行ずつ出力させる
for row in reader:
     print(row)

f.close()
```

#ヘッダーの行を読み飛ばす
csvファイルを処理する際に、先頭のヘッダ部分は使わないことがあります。
その時は以下のように読み飛ばす処理を入れます。

```python
import csv

#読み出したいファイルのパス
f = open("C:\\Users\\redpe\\Desktop\\XXXXX.csv")
reader = csv.reader(f)

#1行ずつ出力させる
for row in reader:

     #1行目を読み飛ばす場合
     if reader.line_num == 1:
         continue

     print(row)

f.close()
```

#CSVファイルにデータを追記する
もともとのCSVファイルにデータを1行追加したい場合には以下のようにします。
指定したCSVファイルに ['2021/6/13', '11:00', '30', '60', 'piglet']の行を追加しています。

```python
import csv

#追記したファイルのパス
f = open("C:\\Users\\redpe\\Desktop\\XXXXX.csv",mode="a",newline="")
writer = csv.writer(f)

#追記したいデータリストを作成
data = ['2021/6/13', '11:00', '30', '60', 'piglet']

#データを追記する
writer.writerow(data)

f.close()
```
【LINE/Kakaoログイン編(Firebaseカスタムログイン)】Flutter と Firebaseで開発者一人でマッチングアプリを開発する

こんにちわ、語学マッチングアプリ『CROSSER』の開発者です:relaxed:
この『CROSSER』なのですが、FlutterとFirebaseを用いて開発しております。
今回は、CROSSERのログイン機能をどのように開発したのかを書いていきますので、是非参考にしてみて下さい!:clap:



#はじめに
語学マッチングアプリ『CROSSER』の概要についてはこちらを参照ください！

https://qiita.com/crosser202008/items/0ca7e9c190bc3dff7516




#『CROSSER』のログイン方法
以下の6つのログイン方法があります。
- 電話番号
- Facebook
- Apple
- LINE
- Kakao
- 電話番号/Facebook/Apple/LINE/Kakao + G-mail連携ログイン



#今回書くもの
今回はFirebaseを用いてLINE/Kakaoログインを行う方法を書きたいと思います。
というのは、電話番号/Facebook/AppleログインはFirebaseに標準サポートとなっているため、
他の方の記事で十分参考になると思います:thumbsup:
しかし、LINE/KakaoログインはFirebaseのサポート対象外となっており、少し実装が変わります。
これらを実装するに当たり、自分自身が苦戦したので、今回はLINE/Kakaoログインについて取り上げたいと思います。



#使ったもの
Firebase Authでサポートされていないログイン方法でログインする方法として、
customログインという方法があります。
こちらを利用することでLINE/Kakaoログインのが可能となります。:clap:
Cloud Functionが登場する理由は後述します。

- Firebase Auth customログイン
- Firebase Cloud Function
- flutter_line_sdk
- flutter_kakao_login

こちらにSDKのリンクを貼っておきます。
https://pub.dev/packages/flutter_line_sdk
https://pub.dev/packages/flutter_kakao_login



#どう実装するのか？
①ユーザーにLINE/Kakaoログイン画面または認証許可画面を表示する。
②ユーザーが認証許可する。
③LINE/Kakaoサーバーからトークンが発行される。
④発行されたトークンでFirebaseのカスタムトークンを発行する。
⑤発行したカスタムトークンでcustomログインを行う。

これだけです!:clap:
この④のカスタムトークン発行なのですが、こちらは自前のサーバーで行う必要があります。
そのため、今回、Firebase Cloud Functionを利用して実装を行いました。
実装の詳細については後日、記載していこうと思います。



#まとめ
- Firebase Authのcustomログインを使用すると非対応のサードパーティログインでもログイン可能！
- カスタムトークン発行は自前サーバーを用意する必要がある。

語学マッチングアプリ『CROSSER』もよろしくお願いします。:two_hearts:
評価もいただけると嬉しいです！
iOS/Androidモバイル対応
https://instabio.cc/crosser
Rails　消費税計算


プログラミングの学習を始めて３ヶ月、
Ruby on Railsでの、消費税計算についてまとめます。

前提として、
商品（Product）とカート（Cart）の作成が終えていて、
Productにはsales_priseのカラムがあります。

<h2>モデルに記載</h2>

Productモデルに記載します。


```ruby:Product.rb
def add_tax_sales_price
  (self.sales_price * 1.10).round
end
```

Productのカラムである　sales_price　の前に
必ず　add_tax_　を記載してください。

私はそれで　rails s　した時に永遠にループしてしまい
serverが起動せず大変な目にあいました。

<h2>viewに記載</h2>

消費税を計算して反映させたい部分に


```ruby:
<%= @product.add_tax_sales_price.to_s(:dalimited) %>
```

Productモデルに　* 1.10　(2021年6月現在)の税率のため、
変更があった場合はmodelを変更するだけでviewページは反映されます。

(:dalimited)は数値を3桁区切りにしてくれます。
例：　12,345,678
      1,234円
標準出力、標準エラー出力の出力先をチェック

#### 背景

標準出力と標準出力エラーを /dev/null にリダイレクトして破棄する時、正しく記述できているか不安になることが個人的によくあります。

```title:which_is_correct?
$ script 2>&1 /dev/null

$ script > /dev/null 2>&1
```

手軽に動作確認をする手段として、以下のようなスクリプトを用意します。

```title:stdcheck
#!/bin/bash

echo "This is stdout"
echo "This is stderr" 1>&2
```

#### 確認例

##### 1. 標準出力、標準エラー出力の両方を出力
```
$ stdcheck 
This is stdout
This is stderr
# リダイレクトしなければ、両方出力される
```

##### 2. 標準出力のみを捨てる
```
$ stdcheck > /dev/null
This is stderr

$ stdcheck 1> /dev/null
This is stderr
```

##### 3. 標準エラー出力のみを捨てる
```
$ stdcheck 2> /dev/null 
This is stdout
```

##### 4. 標準出力、標準エラー出力の両方を捨ててみる(1)
```
$ stdcheck 2>&1 > /dev/null
This is stderr
#-> 標準エラー出力が捨てられていない（期待する動きではない）
```

##### 5. 標準出力、標準エラー出力の両方を捨ててみる(2)
```
$ stdcheck > /dev/null 2>&1

#-> 標準出力、標準エラー出力の両方が捨てられている！
```

##### 6. 標準出力、標準エラー出力の両方を捨ててみる(3)
```
$ stdcheck 2>&1 | cat > /dev/null

#-> パイプを通すと、この順番でも捨てられている！
```
RPMパッケージの管理

★はじめに
RPMの勉強のためのメモです

####■RPMとは
Red hut社が開発したパッケージ管理システム
多くのディストリビューションに搭載されている
Red Hut Enterprise Linux,Fedora,CentOS,openSUSE,SUSE Linux Enterprise等

####ファイル名
次のようになっている
base-4.2.46-30.e17.x86_64.rpm
↓説明
1.パッケージ名称　 例　base
2.バージョン番号　例　4.2.46
3.リリース番号　例　30.e17
4.アーキテクチャ　例　x86_64
5.拡張子　例　rpm

####コマンド

#####インストール
|オプション|説明|
|:-:|:-|
|-i パッケージ名|インストールする|
|-U パッケージ名|アップグレードする|
|-F|インストールされていればアップグレードする|

・インストール/アップグレードのオプション

|オプション|説明|
|:-:|:-|
|-v|詳細情報を表示|
|-h(--hash)|進行状況を「#」で表示|
|--nodeps|依存関係を無視してインストールする|
|--force|既存ファイルを上書きする|
|--test|テストを実施する。（実際にインストールしない）|

#####アンインストール
|オプション|説明|
|:-:|:-|
|-e パッケージ名|アンインストールする|

・オプション

|オプション|説明|
|:-:|:-|
|--nodeps|依存関係を無視してアンインストールする|

#####照会
|オプション|説明|
|:-:|:-|
|-e パッケージ名|インストールされているか確認する|

・オプション

|オプション|説明|
|:-:|:-|
|-a|インストール済みパッケージを表示する|
|-f ファイル名|指定したファイルを含むパッケージを表示する|
|-p パッケージファイル名|対象ファイルを指定する|
|-c(--configfiles)|設定ファイルのみ表示する|
|-d(--docfiles)|ドキュメントのみ表示する|
|-i(info)|指定したパッケージ情報を表示する|
|-l|指定したパッケージに含まれるファイルを表示する|
|-R|指定したパッケージに依存しているファイルを表示する|
|--changelog|変更履歴を表示する|

####■yumとは
・基本はrpmと同じでパッケージの管理をする
・内部ではrpmコマンドが実行される
・自動で依存関係を解決してくれる
・パッケージファイルの準備が不要

上記より通常はyumを利用するほうが便利である

#####rpmとyumの特徴、違い

|項目|rpm|yum|
|:-:|:-|:-|
|依存関係|-|自動で解決してくれる|
|パッケージファイル|自身で準備<BR>インターネット経由は自分がURL指定する。|リポジトリから取得<BR>インターネット経由はURL指定不要|
|未インストール情報|依存するパッケージ名は分かるが、そこからすぐにインストールしたり情報を取得できない|未インストールパッケージを参照、検索可能。<BR>マシンに無いパッケージ情報を参照できる。|

★yum設定ファイル
・/etc/yum.conf　：ファイル
・/etc/yum.repos.d　：リポジトリ用ファイルのディレクトリ

####■dnfとは
CentOS7以降でyumの後継コマンド。Fedoraは22以降
基本的にはyumと変わらない

★設定ファイル
・/var/cache/dnf　：キャッシュファイル
・/etc/dnf/dnf.conf　：設定ファイル
・/etc/yum.repos.d/　：リポジトリ用ファイルのディレクトリ


####■Zypperとは
openSUSEで利用されているコマンド。
UbuntuやRaspbianでPython3をデフォルトにするDebian的方法

現在配布されているRaspbianOSなど主要なUbuntuから派生したディストリビューションは今もPhyton2.7がデフォルトでPython3を使うには明示的に``python3``とコマンドを打たなければいけないことが多いです。普段の用途では``python``いえば``python3``なので、``python``コマンドで``python3``を起動したいところです。Ubuntuを含むDebian系では複数のコマンドが一つのコマンド名を使う時の調停の仕組みとして``update-alternative``というシステムが用意されていますが、なぜか```/usr/bin/python```だけはこの仕組みを利用していないようなので、```alternative```を使った方法を紹介します。おそらくDebian的により正式な方法です

普通に``python``コマンドの``alternative``を変更しようとすると以下のように出てきます。

```
$ sudo update-alternatives --list python
update-alternatives: error: no alternatives for python
```

エラーにひるまず``alternative``を設定します。

```
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 10
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 20
```

あとは``update-alternatives --config python``をするとpythonのデフォルトを聞かれるようになります。

```
$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3   20        auto mode
  1            /usr/bin/python2   10        manual mode
  2            /usr/bin/python3   20        manual mode
```

``pip``は自動的に追随してくれるようです
JavaScript 電卓 オブジェクト指向

### ES6のクラス構文でオブジェクト指向な電卓を実装
JavaScriptやオブジェクト指向の初心者のため、不備やより良い記法があればご指摘いただけると幸いです

コードの全容は以下
https://github.com/dstnk0208/CalclatorOOP/

#### JavaScriptのクラス構文について
- ES6から導入
- 実態はprototypeベースのシンタックスシュガー
- 以下の記事が大変参考になる
  - https://www.hypertextcandy.com/object-oriented-javascript

#### 仕様概要
- 四則演算ができる
- 演算は入力順に行う
  - 1 + 2 * 3 = 9とする (7ではない、いわゆる逆ポーランド記法には非対応)
- 小数点は非サポート(入力や演算結果で出力はされるが、実装では表示のコントロールなどはしない)

#### クラス設計
データ構造にはスタックを採用。Arrayオブジェクトを流用でき、逆ポーランド記法でも使われてるため
0除算のエラーなどにカスタムエラークラスを実装
カスタムエラーの実装には以下を参考した
- https://qiita.com/necojackarc/items/c77cf3b5368b9d33601b

### 実装
#### Stackクラス
```js
class Stack {
    constructor() {
        this._a = [];
    }
    push(a) {
        try {
            // NaN or undefinedでカスタムエラーをスロー
            if ((!(a === a)) || (a === void 0)) {
                throw new InvalidInputException();
            }
            this._a.push(a);
        } catch (e) {
            if (e instanceof InvalidInputException) {
                console.log(e);
            } else {
                console.log('other error');
            }
        }
    }
    ...中略...
```

#### Calcクラス
```js
class Calc {
//...中略...
    _div(v1, v2) {
        // 0除算でカスタムエラーをスロー
        if (v2 == 0) {
            throw new ZeroDevideException("Devided zero");
        }
        stack.push(v1 / v2);
    }
}
```

#### ZeroDiviceExceptionクラス
```js
class ZeroDevideException extends Error {
    constructor(...params) {
        super(...params);
        Object.defineProperty(this, 'name', {
            value: this.constructor.name,
        });
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, ZeroDevideException);
        }
    }
}
```
カスタムエラーはErrorをextendsするだけでは、カスタムエラーのErrorTypeがスタックトレースから欠落するため、constructorのnameプロパティを上書きする

- constructorのnameプロパティを上書きしなかった場合

```console
Error
    at Calc._div (main.js:62)
    at Calc.calc (main.js:46)
    at onPushEqual (main.js:153)
    at HTMLButtonElement.onclick (index.html:32)
```
- 上書きした場合

```console
ZeroDevideException
    at Calc._div (.././main.js:61:23)
    at Calc.calc (.././main.js:46:18)
    at onPushEqual (.././main.js:154:10)
    at HTMLButtonElement.onclick (.././index.html:32:45)
```


# まとめ
- ES6のクラス構文を使ってオブジェクト指向な電卓を実装した
- カスタムエラークラスも実装してみた

# 参考
- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes
- https://www.hypertextcandy.com/object-oriented-javascript
- https://qiita.com/necojackarc/items/c77cf3b5368b9d33601b
goofys S3をマウントする

# 初めに

goofys を使うと、S3 をファイルシステムとしてマウントすることができる。FSx for Lustre ではレプリケートされたオブジェクトを取り込むことができなかったが、goofys であれば取り込むことができた。

https://github.com/kahing/goofys

# インストール～マウント

インストール

```
sudo curl -L https://github.com/kahing/goofys/releases/latest/download/goofys -o /usr/local/bin/goofys
sudo chmod a+x /usr/local/bin/goofys
sudo yum install golang fuse git -y
```

認証情報の設定

```
$ aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXX
AWS Secret Access Key [None]: YYYYYYYYYYYYYYYYYYY
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

マウント

```
mkdir ~/dir
goofys account-a-bucket-0525 ~/dir
```

ファイルシステムを確認

```
$ df -h | grep 'dir'
account-a-bucket-0525  1.0P     0  1.0P   0% /home/ec2-user/dir
```

# レプリケーションオブジェクトにアクセス

レプリケーションオブジェクトであることを確認

```
$ aws s3api head-object --bucket account-a-bucket-0525 --key test_upload_4.txt --version-id JQnupBy2kZdOxhFHZ5v9VU9cvknOKOeA
{
    "AcceptRanges": "bytes",
    "ContentType": "text/plain",
    "LastModified": "Thu, 10 Jun 2021 14:27:50 GMT",
    "ContentLength": 13,
    "ReplicationStatus": "REPLICA",
    "VersionId": "JQnupBy2kZdOxhFHZ5v9VU9cvknOKOeA",
    "ETag": "\"2e0d1f90dbe874f1217a0bbf644219e9\"",
    "ServerSideEncryption": "aws:kms",
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:0123456789012:key/xxxxxxxxxx",
    "Metadata": {}
}
```

レプリケーションオブジェクトにアクセス

```
$ cat dir/test_upload_4.txt
test upload
```

# プライベートサブネットからマウントできない

**プライベートサブネット**

プライベートサブネットからではマウントできない。

```
$ goofys account-a-bucket-0525 ~/dir
2021/06/13 00:43:11.956051 main.FATAL Unable to mount file system, see syslog for details
```

**パブリックサブネット**

マウントしてからインタネットゲートウェイをルートから外してみる。マウントできていることを確認。

```
$ df -h | grep 'dir'
account-a-bucket-0525  1.0P     0  1.0P   0% /home/ec2-user/dir
```

**パブリックサブネット**

マウントポイントにアクセスできる。

```
$ ls dir
sample.txt       test_upload_2.txt  test_upload_4.txt  test_upload_6.txt
test_goofys.txt  test_upload_3.txt  test_upload_5.txt  test_upload.txt
```

**プライベートサブネット**

マウントポイントにアクセスできない。

```
$ ls dir
ls: reading directory dir: Input/output error
```

# ゲートウェイ型S3エンドポイント 

プライベートサブネットからはゲートウェイ型・インターフェース型のS3エンドポイントを使ってもマウントできない。

**ゲートウェイ型S3エンドポイント付きプライベートサブネット**

マウント後であればゲートウェイ型のS3エンドポイントを使用すればマウントポイントにアクセスできる。

```
$ ls dir
sample.txt       test_upload_2.txt  test_upload_4.txt  test_upload_6.txt
test_goofys.txt  test_upload_3.txt  test_upload_5.txt  test_upload.txt
```

**インターフェース型S3エンドポイント付きプライベートサブネット**

インターフェース型のS3エンドポイントではマウントポイントにアクセスできない。

```
$ ls dir
ls: reading directory dir: Input/output error
```

# まとめ

(1) goofys はレプリケーションオブジェクトにアクセスできる。

(2) プライベートサブネットから goofys を使うには、

1. パブリックサブネットでマウントする
2. ゲートウェイ型S3エンドポイント付きのプライベートサブネットに切り替えてマウントポイントにアクセスする

という流れ。

|サブネット|マウント|マウントポイントアクセス|
|---|---|---|
|パブリックサブネット|〇|〇|
|プライベートサブネット（ゲートウェイ型S3エンドポイント）|×|〇|
|プライベートサブネット（インターフェース型S3エンドポイント）|×|×|
|プライベートサブネット（エンドポイントなし）|×|×|

# 参考記事

https://github.com/kahing/goofys

https://qiita.com/charon/items/114601c585616c43e718

https://qiita.com/hamingcode/items/5ae5e7928b4a3e62294d

https://bftnagoya.hateblo.jp/entry/2021/03/08/175242
JavaScript 日付ありオブジェクトの配列をソートする

##概要
DynamoDB で日付を含むデータを取得し、新しい順で並び変えたときの備忘録です。

##ソースコード
```
var Items = [
    {
        userId: "0001",
        createdAt: "2021-06-03T06:10:18.782Z"
    },
    {
        userId: "0002",
        createdAt: "2021-06-03T07:06:47.336Z"
    }
];

Items.sort((a,b) => new Date(b.createdAt) - new Date(a.createdAt));

console.log(Items);
```

##結果
```
[ { userId: '0002', createdAt: '2021-06-03T07:06:47.336Z' },
  { userId: '0001', createdAt: '2021-06-03T06:10:18.782Z' } ]
```
SharePoint Online のちょっと便利な小ネタ集

SharePoint Online のちょっとした小ネタ集です。
小ネタ「集」といいながら、まだネタは少ないですが😅、今後、少しづつ増やしていきます

##リストをサイトコンテンツ一覧に表示したくないとき

PowerShell の PowerPoint Online で以下のコマンドを実行すれば、リストが表示されなくなります。
テナント内の一般の利用者に、見せる必要がない（あまり見せたくない）リストがあるときは便利です。

例えば、以下の TestList を見せたくないときは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/0c404bb7-77bc-ca3b-c9c7-25e29eed8b21.png)
以下のコマンドを実行します。
（以下は TestList という名前のリストを対象にした場合の例）

```PowerShell
Set-PnPList -Identity TestList -Hidden $true
```

一覧には表示されなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/393cb465-055c-0613-7aca-c8562506fbec.png)
元に戻したい場合は以下を実行します。

```PowerShell
Set-PnPList -Identity TestList -Hidden $false
```

PnPOnline を使う以外に List の Hidden 属性を変更する他の手段(Javascript, CSOMなど)でも操作は可能です。
実は、Teams の Wikiタブの裏リストなどは、これと同じように Hidden されてます。

※尚、この操作は、一覧で非表示にするだけで、リストにアクセスできなくなるわけではありません。
リスト名(リスト内部名）やリストの ID (GUID) を知っている人は、アクセスできますのでご注意ください。
リスト自体を見せたくない場合は、リストのアクセス権を適切に設定してください。


※PnPOnline のインストール方法や使い方などは以下を参考ください。
https://docs.microsoft.com/ja-jp/powershell/sharepoint/sharepoint-online/connect-sharepoint-online?view=sharepoint-ps
https://qiita.com/Kayo1984/items/a2a52afde890c57333a7

会社のサイトなどで多要素認証が必要な場合は、UseWebLogin のオプションをつけると手軽に認証できます。

```PowerShell
Connect-PnPOnline -Url https://(テナント名).sharepoint.com/sites/(サイト名)/ -UseWebLogin
```

##ライブラリでサムネイル（縮小表示）を表示したいとき

こちらはよく知られた、裏Tips ですが、手軽で便利なので重宝しています。
以下のようにライブラリ（ドキュメントライブラリなど）のファイルの中身のサムネイルを表示することができます。
画像ファイルだけでなく、PowerPoint なども１ページ目のサムネイルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/79af8595-637b-112e-7c2b-6900fdb53d01.png)

やり方は、"Thumbnail" という名前の１行テキストのフィールド(列)追加するだけです。
ただし、私の場合は、モダン表示の「列の追加」では、なぜかうまくいかないときがありました。
そんな時は、素直に「ライブラリの設定」の画面上から「列の作成」で「１行テキスト」を追加してください。

https://shanqiai.weblogs.jp/sharepoint_technical_note/2020/06/doclib-thumbnail.html


##モダンページで画像データを手軽に貼り付けたいとき
テキストのWebパーツ上で画像データをペーストすればOKです。
詳細は以下を参照ください。保存先がどこかもわかるので、他のページからの再利用も可能です。

https://qiita.com/TNx/items/b14f3a24091b4f015ad8
SORACOMとラズパイで郵便受けの中身を確認できるようにする(V2)

前回の記事 : https://qiita.com/daikunjp/items/5fa52b2870d44f0585d4

SORACOMとラズパイを使って郵便受けの中身を確認できる仕組みを作りましたがモバイルバッテリーの保ちがいまいち…ということで改良版をつくりました。

## 主な改良点

### バッテリー消費量の低減

V1ではモバイルバッテリーが休止にならないようにLEDライトを常に点灯させていましたが、モバイルバッテリーを間欠動作させるUSBモジュール([USBload2](https://www.switch-science.com/catalog/6463/))を使うことで24秒毎に電流を少しだけ流すようになりバッテリー消費量を低減させることができました。

あわせてLEDライトはラズパイに接続することで間欠動作(1時間毎)時にのみ点灯するようになっています。 

V1では20000mAのバッテリーで約3.5日しか持ちませんでしたが、V2では3日経過してもバッテリーのランプの3/4が点灯していたので2週間くらいは持つのではないかと思います。

### ケースの改良

前は銅線や部品を直接ガムテープで貼り付けていたのですが、荷物がいっぱい投函されると破損することがあったのでケースを見直しました。

![PostCameraV2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142746/58060a91-7487-91a5-c90e-deb264e11e75.jpeg)

100円ショップで買ってきた透明なプラスチックケースにすべて入れてみました。
ラズパイカメラは角度を調整しやすいように小麦粘土で固定しています。

![PostCameraV2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142746/c7f3e439-6f0f-1f75-8e61-168ce94c32e9.jpeg)

実際に郵便受けの天井部分に設置した写真がこちらです。ほんとは磁石などで固定できるようにしたかったのですが…うちの郵便受けはアルミ製だったらしく磁石がくっつきませんでした。しかたなくガムテープで落ちないように貼り付けました。

## 用意したもの

|品名|スイッチサイエンスでの価格|備考|スイッチサイエンスURL|
|---|---|---|---|
|Raspberry Pi Zero|1,848円|今回はZeroを使いましたがもちろん普通のRaspberry PiでもOKです|https://ssci.to/3646|
|Raspberry Pi Zero用スパイカメラ|3,135円|普通のラズパイカメラでもOKです|https://ssci.to/3323|
|USBドングル AK-020(※)|5,500円|SORACOM SIMで通信をおこなうためのモジュールです|https://ssci.to/5253|
|OnOffSHIM|1,100円|ボタンスイッチでRaspberry Piの電源操作ができます|https://ssci.to/3295|
|M5 ATOM Lite|1,300円|ESP32搭載で ~~RTCもついてる~~ DeepSleepが使えるので間欠動作のコントロールをさせます|https://ssci.to/6262|
|M5Stack用ミニリレーユニット|400円|ATOM Liteにつないでボタンスイッチの操作をさせます|https://ssci.to/4054|
|USB LEDライト|100円|郵便受けの中を明るくして撮影しやすくします|100円ショップで売ってます|
|USBload2<font color="Red">(New!)</font>|1,500円|モバイルバッテリーが休止しないように間欠動作させます|https://ssci.to/6463|


## 全体構成図

構成図はこのようになりました。
V1と比較するとモバイルバッテリーとM5 ATOM Liteやラズパイの間にUSBload2が入っています。
またLEDライトはラズパイに接続されています。

![ポストカメラv2全体構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142746/e0c1ca3d-e0de-b9e0-fdcd-6ecb9ea97c89.png)

## 構築手順

構築手順についてはV1の手順と変わらないので前の記事を参照してください。
[SORACOMとラズパイで郵便受けの中身を確認できるようにする](https://qiita.com/daikunjp/items/5fa52b2870d44f0585d4)
Flutter と Firebaseで開発者一人でマッチングアプリを開発する

こんにちは！CROSSERの開発者です:grinning:
2021年4月にAndroid、2021年5月にiOSを語学マッチングアプリ「CROSSER」をリリースしました。
ここではFlutterとFirebaseを用いた開発〜リリース〜運用で参考にした資料、つまづいた点などを共有したいと思います。



#アプリ概要
- 語学学習目的で語学を教えてくれるパートナー探し
- 世界規模
- 性別、年齢、国籍、自分からの距離で相手を探せる
- 収益方法はアイテム内課金、アプリ内広告
- iOS、Androidモバイル対応(iPadはこれから)

ダウンロードはこちらからお願いします:blush:
https://instabio.cc/crosser

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1642184/91bf4307-5695-8d21-0194-269058f3614d.png" width=50%>


#チーム構成
開発者1名で開発しました。:sweat_smile:

- 非開発者(1名)
- 開発者(1名)
  - バックエンド開発経験4年
  - フロントエンドの開発経験無し


#主なアプリ機能
- ログイン(電話番号、Facebook、Apple、LINE、Kakao)
- ログインアカウントをG-mail連携
- アプリ内課金(消費型、サブスクリプション型)
- メッセージ
- ユーザーブロック
- ユーザー通報
- カードスワイプ(Tinder風)
- 位置情報検索
一般的なマッチングアプリと同じような機能だと思います。


#どうしてFlutterとFirebaseだったか？
開発者が1名、かつ半年以内にiOS版、Android版を同時リリースということが目標でした。（結果的には1年かかりましたが。。:sweat_smile:)
半年以内にiOS版、Android版をネイティブアプリで開発するのは厳しいなと思い、Cross Platformで開発をすることを考えました。（平日は会社にいるので、開発はほぼ土日しかありませんでした:sweat_smile:)
最初はMonacaを使ってサーバー側はゴリゴリに構築・開発していました。
。。が！バックエンド開発しかしたことがない者としてバリバリcss, jsを使って開発することがストレスで。。。半年、ずっと戦っていました。。。
そんなある日、会社の先輩がFlutterいいよ！と話があったので、ちょっと触って見たところ、おぉお！これだ！と感動し、ほぼMonacaで完成していたアプリをGitから削除し、Flutterで開発することを決心しました:joy:
(Javaを触ったことがある方にFlutterは持ってこいです！しかもPackageも沢山あるため、簡単に映えるUIを作れます！)
その流れで、リリース後のメンテを現実的に考えてFirebaseを採用しました。(←最初から考えとけよ:joy:)


#Firebaseで使用している機能
どれをどの機能に使ったかは別記事で詳しく説明します:muscle:
Firebaseの各機能についてはこちらの記事が分かりやすいです！:clap:
https://qiita.com/shibukk/items/4a015c5b3296563ac19d


- RealTime Database
- Cloud Firestore
- Firebase Hosting
- Analytics
- Firebase Authentication
- Cloud Storage for Firebase
- Firebase Cloud Messaging
- Firebase In-App Messaging
- Firebase Remote Config



#まとめ
Flutter、Firebase最高:heart_eyes:
Google最高:heart_eyes:
今後はこのページに新規記事のリンクをつけて知見を共有していこうと思いますので、よろしくお願いします。

みなさん、是非、語学マッチングアプリCROSSERのダウンロードお願いします:heartbeat:
評価もしていただけると嬉しいです！(高評価だともっと嬉しです！)

https://instabio.cc/crosser



#追記
関連する追加記事情報を載せます。
- FirebaseでLINE/Kakaoログインする方法https://qiita.com/crosser202008/items/ed240474439aca7f7cec

- Firebaseでプッシュ通知をする方法
https://qiita.com/crosser202008/items/4074177b69960c67bcf5
stack machineを愛でる。 その4

#概要

stack machineが、好きだ。
俺仕様アセンブラで、helloworld書いてみた。

#サンプルコード

```
  push  "x"
  push  "Hello World!"
  set
```

#説明

変数xに、テキストを代入すると、表示される仕様です。
変数に、テキストを代入するには、setを使います。
setは、スタックの二番目を変数として、一番目の値をセットしますので
pushで、"x"と"Hello World!"をスタックに積んで、setを実行します。


以上。
stack machineを愛でる。 その3

#概要

stack machineが、好きだ。
ruffleを使って、ボタンを押したら、swfを生成するを作る。

#サンプルコード

```
function run() {
	var b = _arrayBufferToBase64(swf21);
	var l = '" type="application/x-shockwave-flash" width="300" height="300"></embed>';
	var swf = '<embed src ="' + tob(b) + l;
	document.write(swf);
}

```

#成果物

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

以上。
powershell 配列の比較

# 概要
　powershellで配列の比較についてのいろいろ

# -eq

```powershell
 1,2,1,3 -eq 1
 答え 1,1
```
つまり、一致した配列が帰ってくる。一致しない場合は次

```powershell
 $a = (1,2,1,3 -eq 5)
 答え 
```
この場合$a.lengthとしてみると0になっているので、つまりは空の配列が応答される。

# -in,-countains
```powershell
 1,2,1,3 -contains 1
 答え true
 1 -in 1,2,1,3
 答え true
```
-inと-containsはパラメータが逆
まあ、これはtrueだけを返すので、どこにいるのかを判別するには別途処理が必要となる。

# -match
こいつがなかなか有用

```powershell
"Bag", "Beg", "Big", "Bog", "Bug"  -match 'b[iou]g'
答え　Big, Bog, Bug
```
不思議なことに-likeは配列には対応していないようである。
答えの結果は$matchesにも格納されているので詳しくはググりましょう

# indexof
```powershell
$a=1,2,1,3
$a.indexof(2)
答え 1
$a.indexof(5)
答え -1
```
見つかった最初のindexを応答するわけで、見つからなかったら-1が帰る
# $a|? {$_ -eq 1}
?=where-object 
まあ、もしかすると、これがわかりやすいかなあ。codeも少ないし
STM32L010とWS2812BとPython 3.7.6(PC)で光らす。


目的
PCからマイコンを通してWS2812Bをコントロールする。

前提、まず、STM32L010とWS2812Bのシリアコントールを構築
STM32L010とWS2812Bを使い、シリアルから入力された値で光らす。


https://qiita.com/caa45040/items/e44ea0008f5e4584671a


https://qiita.com/caa45040/items/8ca3039282e750a17876


https://qiita.com/caa45040/items/81920aae3fb80e06183c


![serial_ws2812_010_1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/177958c7-8d41-c1be-700d-09eeb95c901a.jpeg)



![dwtsssss6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/53866d4c-7109-ebf3-692b-ee1498d02a97.jpeg)



![selial_ws2812_303_1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d47002fc-1b31-eb91-ecda-d7297f54dd23.jpeg)




```python


import serial
import time
ser = serial.Serial('COM6',9600,timeout=None)
print ("tttt")
time.sleep(0.1)
ser.write(b'123')
time.sleep(2)
ser.write(b'a!!')
print ("rrr")
time.sleep(2)
ser.write(b'!a!')
time.sleep(2)
ser.write(b'!!a')
ser.close() 



```
【エラー備忘録】LaravelでGoogle認証のコールバックを受け取る際「localhostで接続が拒否されました」のエラー

## 状況・エラー内容
Laravelのアプリケーションに、OAuthとSocialiteを使って、Googleアカウントでログインする機能を実装しているとき。
Googleアカウントを選択する画面までは表示できているが、アカウントを選択してログインしようとすると「このサイトにアクセスできません。localhostで接続が拒否されました。」となる。

![S__92987395.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208065/00eff88b-c2e3-8364-abdd-f526ffe75ab1.jpeg)
![スクリーンショット 2021-06-12 20.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208065/65320e81-9b42-295f-4f37-ff53ea005b3d.png)


## 原因
Googleから承認済みのリダイレクトを受け取るURLをGoogleに設定しているが、そのURLにlocalhostのポート番号を指定していなかった。
![スクリーンショット 2021-06-12 20.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208065/b4b4e942-f9d8-1beb-9bd2-3ad86eab6bd9.png)
ここではローカル開発環境はMAMPを使っている為、
「http://localhost:8888/login/google/callback」
と設定しなおす。

すると今度は別のエラー画面が表示される。
![スクリーンショット 2021-06-12 20.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1208065/f3113deb-a929-b0ad-0748-d0e5aa44b78c.png)

これはLaravelで設定しているAPP_URLが原因だったので、以下のようにenvファイルを修正する。

```:env
APP_URL=http://localhost:8888
```

これで無事、コールバックを受け取り次の画面へ進むことができました。