OmniAICreator/Qiita-1.07M huggingface dataset:
phigasui という文字列を作りたかっただけ Python編

私のアカウント名は @phigasui です。

成果物は下記の通りです。

```python
import this;''.join(this.d[c]for c in'cuvtnfhv')
```

```python
''.join([c.__doc__[ord(c)] for c in '\x95j13L\x00$1'])
```

## `this` Module に頼る
まずは何らかの文字列があればそこから `p`, `h`, `i`, `g`, `a`, `s`, `u` を取り出せれば良いなと思いました。

### 文字列を得る

Python の built-in で文字列って何があったかなーと思って思い出したのが。

```python
import this
```

Zen of Python が表示されるアレですね。

この `this` Module には `c`, `d`,  `i`, `s` の謎の4つの属性があります。

```python
>>> dir(this)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'c', 'd', 'i', 's']
```

`this.d` には `dict` 型のデータ、`this.s` には謎の文字列、 `this.c` `this.i` には謎の数字が入っています。

何が行われているかは `this.__file__` を開けばわかるのですが
`this.d` には特定のアルファベットとそのアルファベットの Unicode コードポイントを13ずらしたアルファベットの組みが入っているようです。

<details><summary>`this.py`の内容</summary><div>

```python
s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))
```
</div>
</details>

`c`, `i` はその `dict` を作った時の残骸ですね。
で、`this.s` を `this.d` に従って変換すると Zen of Python が完成するようになっています。

私がやりたかったことをやっている...

ということで、`this.d` を使えば簡単に任意の文字列抽出できそうなことがわかりました。

### 任意の文字を抽出する
'phigasui' の文字のキーを取り出したいので、`this.d` をひっくり返してとってきます。

```python
d = {v: k for k, v in this.d.items()}
print(''.join([d[c] for c in 'phigasui']))
```
```python
'cuvtnfhv'
```
無事、`this.d` から `phigasui` を得るための文字列を得ました。

完成 :tada:

```python
import this;''.join(this.d[c]for c in'cuvtnfhv')
```

`this.s` を使うでもいいなと思いつつせっかくなので他の文字列を探します。

## docstring に頼る
コード中に存在している文字列といえば docstring（ドキュメンテーション文字列）ですね。
Python では各オブジェクトに `__doc__` の属性を持っています。

これを使って `phigasui` の各文字の index をとってくれば良さそうです。
index の数字のリストだと冗長なので文字列にします。

```python
print(''.join([chr(''.__doc__.find(c)) for c in 'phigasui']))
```
```python
'\x95j13L\x00$1'
```

無事、`str` docstring から `phigasui` を得るための文字列を得ました。

完成 :tada:

```python
''.join([c.__doc__[ord(c)] for c in '\x95j13L\x00$1'])
```


---


もっとおもしろいのあったらぜひ教えてください :pray:

本当は Julia ではじめたので Julia 編もそのうち。
Djangoで簡単な検索機能を作ってみた

##1.まず扱うデータテーブルを作る
####・モデル
`myapp/search/models.py`

```
from django.db import models

class People(models.Model):
  name = models.CharField(max_length=20)
  def __str__(self):
      return self.name
```
####・views.py
`myapp/search/views.py`

```
from django.shortcuts import render
from .models import People
from django.views.generic import ListView
  
class PeopleList(ListView):
    model = People

```
注）ここで使うtemplateの名前は自動で`people_list.html`となる



####・urls.py
`myapp/search/urls.py`

```
from django.urls import path
from . import views

urlpatterns = [
    path('', views.PeopleList.as_view(), name='people'),
]

```


####・表示テンプレート
`myapp/search/templates/search/people_list.html`

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>people_list</title>
</head>
<body>
  <table border="1">
    <tr>
        <th>name</th>
    </tr>
    {% for people in object_list %}
    <tr>
        <td>{{ people.name }}</td>
    </tr>
    {% endfor %}
</table>
</body>
</html>
```

####・出力結果
データはadmin画面から適当に登録する
![スクリーンショット 2021-07-02 213156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719742/b71590b5-284d-6169-6032-1639567109b6.png)

##2.検索機能を作る
`models.py と urls.pyは変更なし`

####・views.py
`myapp/search/views.py`

```
from django.shortcuts import render
from .models import People
from django.views.generic import ListView


class PeopleList(ListView):
    def get_queryset(self):
        query = self.request.GET.get('query')

        if query:
            people_list = People.objects.filter(
                name__icontains=query)
        else:
            people_list = People.objects.all()
        return people_list
```
`__contains`は小文字大文字の区別がある
`__icontains`は小文字大文字の区別がない
これらは、完全一致ではなく含まれるものを取得してくれる




####・表示テンプレート
`myapp/search/templates/search/people_list.html`

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

    <!-- formを追加 -->
    <form action="" method="get">
      <input name="query" value="{{ request.GET.query }}" type="text" />
      <button type="submit">検索する</button>
    </form>

    <table border="1">
      <tr>
        <th>name</th>
      </tr>
      {% for people in object_list %}
      <tr>
        <td>{{ people.name }}</td>
      </tr>
      {% endfor %}
    </table>
  </body>
</html>
```
`request.GET.query`でURLのパラメータを取得している
つまり、`http://127.0.0.1:8000/?query=<検索ワード>`のようなパラメータを取得できる


####・出力結果

![スクリーンショット 2021-07-02 220000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719742/46984960-aad9-1b64-8827-5ff6aaaf5805.png)

しっかり検索出来ている
やったぁ

[今回作ったもののgithub](https://github.com/haruki00000000/search_practice)

##参考元
https://noumenon-th.net/programming/2019/12/18/django-search/
すぐに対応できそうな PWA をより良くするための API を調べてみた

この記事は Qiita の記事投稿イベント「こんなことまで！？ブラウザでできること選手権」の記事です。

https://qiita.com/official-events/be8c5ab5a9ddf90055cd

最近、PWA でできることがより増えてきてるな〜と思い、明日からでも既存の PWA を進化させれそうな機能ってないのかなと思ったので調べてみました。
この記事はそれをまとめたものです。

## App shortcuts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/9f0db1b3-27ef-ec74-d2b3-c550c0144c8e.png)

アプリアイコンを長押ししたときにショートカットを表示できる。
しかも、`manifest.json`に以下の追記をするだけで対応できる。

```diff_json
{
  "name": "Player FM",
  "start_url": "https://player.fm?utm_source=homescreen",
  …
+  "shortcuts": [
+    {
+      "name": "Open Play Later",
+      "short_name": "Play Later",
+      "description": "View the list of podcasts you saved for later",
+      "url": "/play-later?utm_source=homescreen",
+      "icons": [{ "src": "/icons/play-later.png", "sizes": "192x192" }]
+    },
+    {
+      "name": "View Subscriptions",
+      "short_name": "Subscriptions",
+      "description": "View the list of podcasts you listen to",
+      "url": "/subscriptions?utm_source=homescreen",
+      "icons": [{ "src": "/icons/subscriptions.png", "sizes": "192x192" }]
+    }
+  ]
}
```

### ブラウザの対応状況

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/24d277d9-40f6-383d-f607-b76c2faf4519.png)

Android Chrome は対応している様。Edge, Chrome は Windows のみでの対応。
よく使いそうなスマホで対応しているので、導入を検討しても良いかも。

### リンク

https://web.dev/app-shortcuts/

https://chromestatus.com/feature/5706099464339456

https://developer.mozilla.org/en-US/docs/Web/Manifest/shortcuts

https://caniuse.com/?search=manifest%3A%20shortcuts

## Badging API

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/c3c63904-3545-8d9f-f66e-02bd4893e35f.png)

通知バッジを付けることができる。
Push Notification と組み合わせると、よりネイティブアプリに近づけそう。

```javascript
// Set the badge
const unreadCount = 24;
navigator.setAppBadge(unreadCount).catch((error) => {
  //Do something with the error.
});

// Clear the badge
navigator.clearAppBadge().catch((error) => {
  // Do something with the error.
});
```

### ブラウザの対応状況

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/140e8c33-2005-af9d-c543-c11b9d05179c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/d57689d2-041e-7fe6-822d-ff05f7d21403.png)

Windows と Mac の Chrome くらいしかサポートしていない。
スマホでは対応していないが、PC 向けの PWA（Slack みたいなチャットツールとか？）であれば導入の余地がありそう。

### リンク

https://web.dev/badging-api/

https://chromestatus.com/feature/6068482055602176

https://developer.mozilla.org/en-US/docs/Web/API/Navigator/setAppBadge

https://developer.mozilla.org/en-US/docs/Web/API/Navigator/clearAppBadge

https://caniuse.com/?search=setAppBadge

https://caniuse.com/?search=clearAppBadge

## さいごに

Project Fugu を見たりしてると、PWA がネイティブアプリと同等の機能を持つ日が近づいてきているのかなと感じてきます。
まだまだ、ブラウザのサポートが追いついていない部分もありますが、いつか PWA が当たり前のように使われる日が来るといいですね。

## 参考

https://web.dev/fugu-status/

https://fugu-tracker.web.app/
Azure Sphere MT3620 Starter Kitを開けてみた


# Avnet Azure Sphere MT3620 Starter Kit
こちらになります。
![DSC_0366.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/bdaf7753-666c-eede-ff5d-3929b151211e.jpeg)

以下のサイトからは、「Azure Sphere 開発キット」としては、３種類あるみたいですが、今回は、「Avnet Azure Sphere MT3620 Starter Kit」を開けてみます。

https://azure.microsoft.com/ja-jp/services/azure-sphere/get-started/


どうやら、V2があるらしいですが、今回はその前の品になります。

https://www.element14.com/community/community/designcenter/azure-sphere-starter-kits/

# 内容物
中身はこんな感じです。
![DSC_0367.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/ac34023c-388e-8243-1b51-4d8a93525076.jpeg)

# 基板の表面
![DSC_0368.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/94e05b72-326f-1f9b-dca1-59e813a08ca1.jpeg)

※mikroBUSは初めて聞いたのですが、少し調べてみると米国のMikroElektronika社が提唱している規格らしくて、それなりに対応させているボードもあるみたいでした。

https://www.mikroe.com/mikrobus

# 基板の裏面
![DSC_0369.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/137a394e-2662-dd80-55eb-82cbab312f77.jpeg)

# 今後
今回は、とりあえず開けてみただけなので、今後はいろいろ触ってみようと思います。
面接の反省点

#1.自己紹介

初めて記事を投稿するA-seatと申します。

私はWebエンジニアへの転職を目指し、転職活動中です。

高校卒業後してからコンクリートの研究開発に約4年携わってきました。

転職活動状況
・応募数　約200社
・面接　約30社
・内定　1社

上記の数の面接を受けていく中で文章力、地頭、コミュニケーション能力が自分には足りないと実感しました。
Qiitaに投稿する理由としては文章力や地頭をつけたいためです。また、雑食サロンが運営しているもくもく会に参加して、プログラミング学習だけでなく会った人と雑談をしてコミュニケーション能力を高めている最中です。

さて、本題ですが本日受けたWebマーケターの企業さんから実際に聞かれた質問のところで今日、自分が改善した方がいいと思ったものを記載します。

#2.実際聞かれた質問および実際に回答した内容
・前職を選んだ理由
→高校時代に化学部で実験と報告書を書いた経験があり、前職でもコンクリートを研究する上で実験や報告書を書くことをするので自分自身の経験が活かせると思いました。

・学生時代はどういう軸で就活していたか。
→特にないです。

・転職先に求めるもの
→Webの開発業務に携わりたいです。

・どういう社風で働きたいか
→暖かく、会議の際、チャットでやりとりする等効率が良いところです。(正直に回答しました)

・今の人生に力を入れていること
→プログラミング学習です。

・学生時代に力を入れたこと
→自分自身の努力した証として、資格の取得に励みました。


#3.改善した内容
・前職を選んだ理由
→2.の通り

・学生時代はどういう軸で就活していたか。
→部活動の実験、C言語を扱った経験から、正確さが求められる仕事を軸に就活してました。

・転職先に求めるもの
→ユーザに長く使って貰えるようなサービスを開発し、提供できる環境で働きたいです。

・どういう社風で働きたいか
→企業の求める人物像や雰囲気から自分が共感できる範囲で企業ごとに考える必要があると思いました。
（例として企業側が新しいことに積極的にチャレンジすることを推奨していた場合：自分は色々な業務に携わり、力をつけたいので新しいことにチャレンジしやすいところがいいです。）

・今の人生に力を入れていること
→プログラミング学習で得たことをSNSへのアウトプットすることに力を入れたことで、様々な人と繋がりを持てるようになり、学習を継続しやすい環境を手にすることができました。

・学生時代に力を入れたこと
→2.の通り

##最後に、まだまだ道のりは厳しいですが、粘り強く転職活動をすることで自分の納得する企業へ入れるように頑張ります！！
fork-exec1

# dup() call

man page

```
$ man 2 dup

       int dup2(int oldfd, int newfd);

dup2()
       The dup2() system call performs the same task as dup(), but
       instead of using the lowest-numbered unused file descriptor, it
       uses the file descriptor number specified in newfd.  In other
       words, the file descriptor newfd is adjusted so that it now
       refers to the same open file description as oldfd.

Linux                          2021-03-22                         DUP(2)
```

```
$ man 2 dup

       int dup2(int oldfd, int newfd);

dup2()
       dup2() makes newfd be the copy of oldfd, closing newfd first if necessary, but note the following:

Linux                          2012-02-14                         DUP(2)
```

## Writing redirection case

In the case of using pre-hunted descriptor like pipe, set it as __oldfd__ and __stdout as newfd__.
The principal of thought is, the value itself is unchangeable.
The description of the dup() function is often wrote as `copy the file descriptor`, but it's not clear to be understood.

The dup's arguments are fixed values, but the __function of__ the old value is copied to new one, so that new value itself has the same behavior as old one.

### example

Let't assume that we've got __5__ as pipe writing target fd.

Then to be is

```
dup2(5, 1);
```

1 is reserved as global stdout fd, but __dup2() closes 1 and make the number itself working as 5__.

The most important is the function of original fd __oldfd__, i.e 5.
We want to make __1__ behaves as the same as __5__.
So at first, function side value is reserved, then mimicking side value is specified.

Typical usage of `execve()` redirecting.
We cannot stop execve() putting their contents to 1 (i.e stdout), but 1 itselves behavior is changeable by the call of dup().

### TODO
How to do the same as above with dup(oldfd) ?
dup() returns new file descriptor value by itself. It means the value cannot be specified.
So pre-hunted pipe value is not usable in this scenario.
seed値入力

```rb
100.times do |n|
  email = Faker::Internet.email
  password = 'q12345'
  User.create!(email: email,
               password: password,
               password_confirmation: password,
               )
end
```

```rb
require 'faker'

100.times do |n|
  family_name = Gimei.last.kanji
  last_name = Gimei.first.kanji
  family_name_prono = Gimei.last.katakana
  last_name_prono = Gimei.first.katakana
  postal_code = Faker::Lorem.characters(number: 3, min_numeric: 3) + '-' + Faker::Lorem.characters(number: 4, min_numeric: 4) 
  prefecture_id = Faker::Number.between(from: 2, to: 48)
  address = Gimei.address.city.kanji
  street = Gimei.address.town.kanji + Faker::Lorem.characters(number: 1, min_numeric: 1) + '-' + Faker::Lorem.characters(number: 2, min_numeric: 2) 
  phone_number = '0'+ Faker::Lorem.characters(number: 10, min_numeric: 10)
  sex = Faker::Number.between(from: 1, to: 2)
  body_weight = Faker::Number.between(from: 45, to: 115)
  tall = Faker::Number.between(from: 135, to: 205)
  birthday = Faker::Date.between(from: '1959-1-1', to: '2001-12-31')
  Profile.create!(family_name: family_name,
               first_name: last_name,
               family_name_prono: family_name_prono,
               first_name_prono: last_name_prono,
               postal_code: postal_code,
               prefecture_id: prefecture_id,
               address: address,
               street: street,
               phone_number: phone_number,
               sex: sex,
               body_weight: body_weight,
               tall: tall,
               birthday: birthday,
               user_id: User.find(n+1).id,
               )
end
```

![20210703-214143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/d6c72cd1-48e9-4bfc-2e17-0a666b1980ca.png)

上記csvをデータインストール

```rb
require "csv"

CSV.foreach('db/本表-表1.csv', headers: true)  do |row|
  FoodStuff.create(
  food_stuff: row['food_name'],
  calorie: row['calorie'],
  protein: row['protein'],
  carbohydrate: row['carbohydrate'],
  sugar_content: row['sugar_content'],
  salt: row['salt'],
  lipid: row['lopid'],
  fiber: row['fiber'],
)
end
```
[BDSX] 統合版マインクラフトの公式サーバソフトの構築とプラグイン作成 - サーバ構築編

:::note warn
書く書く詐欺してたらBDSX終わっちゃった…
:::

## 背景
統合版マインクラフトのサーバソフトは以前まであったPocketMine-MP, Nukkit に加え，公式からBedrock Dedicated Serverというサーバソフトが満を持して登場しました。
この公式サーバソフトは前のプラグインを追加できる二つのサーバソフトとは異なりバニラでの運用がメインとなっていました。こちらは公式が出していることもあり，軽量でさらにMobのAIが標準でついているという利点がありましたが,プラグインで機能を追加するということができませんでした。

せっかくMobがうごくのにもう少し拡張性がほしいなー。
プロキシ上でプラグインが動作するようにしたらええんじゃね？

なんて考えていましたら，BDSXなるものがGithubで公開されているのを発見しました。
こちらはBDSをNodejsで拡張をしており、TypeScriptでプラグインを作成できるようです。

というわけでBDSXの構築方法とそのプラグインのつくり方を備忘録てきな感じで紹介したいと思います。

誤りがある場合はお知らせください。

## サーバ構築 
BDSXはWindows向けにつくられているようで，Windowsでは比較的簡単に使うことができます。
LinuxではWineというWindowsアプリケーションをLinuxで動かせるソフトを使用して構築できるようです。

### Linuxでの構築
まずはLinuxの方のみが行うことです。
私は Ubuntu Linux 20.04 LTS にて構築を行いました。
**Linuxで行う際はGUI環境が必要なようです。**

#### 1. Wineのインストール
以下を参考に行います。

 https://kazuhira-r.hatenablog.com/entry/2021/01/16/004828

#### 2. NodeJs, npmのインストール

```shell
sudo apt update
sudo apt install nodejs npm
```

#### 3. gitのインストール　
 
```shell
sudo apt install git
```

#### 4. BDSXのダウンロード 

```shell
git clone https://github.com/bdsx/bdsx.git
```

#### 5. BDSXインストール 

```shell
cd bdsx
./bdsx.sh
```

プライバシーポリシーに同意するとBDSがダウンロードされます。 
Wineの初回起動時にGeckoとMonoのインストール画面が立ち上がります。
BDSのダウンロードが終了するとサーバが起動します。

#### 6. サーバを止める
```shell
stop
```

で止まります

### Windowsでの構築
お次はWindowsでの構築です。

#### 1. NodeJS, npmをインストールする
以下を参考にインストールを行ってください。 

https://qiita.com/echolimitless/items/83f8658cf855de04b9ce

#### 2. BDSXをダウンロードする

https://github.com/bdsx/bdsx

こちらからzipダウンロードができます。
(もちろんlinux時同様gitを使用してもできます)

zipを解凍しフォルダに移動

#### 3. BDSXインストール

```shell
./bdsx.bat
```

Linuxと同様です。


### LinuxとWindows共通設定

bdsx.bat , bdsx.sh
と同階層にあるindex.tsを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178346/e6486184-2f44-a36b-02e0-486811c4db84.png)
ここではサンプル機能が呼び出されていますので

```ts
//import './example_and_test';
```

のようにコメントアウトしておきましょう.

これでサーバ構築編の終了です。
お疲れ様でした

プラグイン作成編を絶賛カキカキ中です。
【HashiCorp Vault】vault-k8sをデプロイした外部K8sクラスタへの認証を通す

前提として、Vaultサーバとは別のK8sクラスタからVaultのシークレットを取得するようなアーキテクチャを想定しています。
認証を通すのに必要なものは、vault-k8sがデプロイされているクラスタのホストURI、CA証明書、vault-k8sに紐づくService Account Tokenです。
この記事ではこの3つの調べ方を備忘録としてまとめておきます。

- クラスタのホストURI

```bash
kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.server}'
```

- CA証明書

```bash
kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.certificate-authority-data}' | base64 --decode
```

- Service Account Token

```bash
- 1. serviceaccountを確認 (vault-k8sのnamespaceがvaultの場合)
kubectl -n vault get serviceaccounts

- 2. serviceaccountに紐づくsecretsを確認 (1で確認したvaultのServiceAccountがvaultの場合。agent-injectorではない方を選択)
kubectl -n vault describe serviceaccounts vault

- 3. JWTを確認 (2のTokensに記載されているsecretを指定)
kubectl -n vault describe secrets vault-token-*****

-- 3実行後に表示されるtokenの内容がService Account Token
```

以上が分かれば、vaultサーバで次のコマンドを実行します。

```bash
vault write auth/kubernetes/config \
        token_reviewer_jwt={Service Account Token} \
        kubernetes_host={ホストURI} \
        kubernetes_ca_cert={CA証明書}
```

UIでの設定は、前に投稿した「[EKSにHashiCorp Vault with ConsulをHA構成でデプロイしてSecret管理させてみる](https://qiita.com/ttksm/items/a169bca90862a15a5a33#kubernetes%E8%AA%8D%E8%A8%BC%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%A8%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)」の記事をご覧ください。

ちなみに、今回紹介した方法はVault公式ガイド「[Integrate a Kubernetes Cluster with an External Vault](https://learn.hashicorp.com/tutorials/vault/kubernetes-external-vault?in=vault/kubernetes)」に載っていますので合わせてご覧ください。
Visual Studio Codeでhttpsでlive Serverを使う

html, css, jsファイルだけ手元にあって、
でもとりあえずlocalhostで確認したいときに、
楽な方法ないかねと思いこんなのを発掘。

https://qiita.com/massie_g/items/2913066e596dae197539

VS Codeで見れるのかってことで、live Server使うことにしたけど、
ChromeでHTTPSで見るまでの道のりが思ったより長かったので、備忘録も兼ねて。

## live Serverのインストール
https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer

まずはここから。いれるだけ。
いれただけだと、```https://```ではみれない。
ただこれだけだと、```ws://```かなにかから始まるもので、
肝心の```https://``` or ```http://``` から始まるやつではみれない。

なので、
①live Serverでhttpsで見れる設定をする必要がある。

でも、httpsで見れる設定をしただけだとChromeとかで保護されない通信になり諸々エラーで苦しむ。
なので、
②Chromeで自己証明書をパスするように設定しないといけない。

②→①の順で設定したらOK。

## 自己証明書作成
Chromeで見るのに自己証明書（オレオレ証明書）を用意。
とりあえず何も考えず証明書用意しただけだと通らず。
Chromeの仕様で、SAN(Subject Alternative Name)を設定した証明書じゃないといけない。
Chromeのバージョンが変わって仕様も変わったらここも変わることはありそう。

見た範囲ではこれが一番楽だった。
https://qiita.com/nis_nagaid_1984/items/b8f87d41ea108d47af61

とりあえず適当な場所に次の手順でkey, cer, crt, txtを作っていく。

### keyファイル作成
```
openssl genrsa -out server.key 2048
```
```-des3```オプションつけるとパスを設定する -> パス削除になるけど、
オプションつけなければパス設定削除しなくてよいので上でOK。

### csrファイル作成
```
openssl req -new -key server.key -out server.csr
```

### san.txt
```
subjectAltName = DNS:localhost, IP:127.0.0.1
```
localhostでみたいので、上でOK。

### crt 作成
```
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt -extfile san.txt
```

この後、証明書ブラウザにインポートする必要があるのだが、
その前にlive Serverの設定して、一旦サーバ起動しないといけない。

## VS Codeでlive Serverの設定
詳細は

https://github.com/ritwickdey/vscode-live-server/blob/master/docs/settings.md

VS Codeのsetting.jsonに下記をぶちこむ。
```Ctrl + Shift + P``` -> setting で見つかるファイル。

```
{
    "liveServer.settings.https": {
        "enable": true,
        "cert": "", // つくったserver.crt をフルパスでいれる
        "key": "", // つくったserver.key をフルパスでいれる
        "passphrase": ""
    }
}
```

## 自己証明書をブラウザに登録
これで Go Liveすると、ちゃんと開くが、証明書をブラウザにいれてないので、
赤い保護されてない通信のエラーが出るけど、ブラウザに登録する。
手順はここがわかりやすい。

https://kekaku.addisteria.com/wp/20190327053337

## 完了
登録後、ブラウザを再起動して、Go Liveしたら
保護された通信で表示ができる。

今回、情報がバラバラした情報を調べて試していたら2時間ぐらいかかったけど
一通りの手順さーっとするのはそんなに時間がかからないと思う。
Linux基本学習まとめ１

# ディレクトリについて
Linuxは、ファイルを保存する場所のことを「ディレクトリ」と呼びます。
全て「/」で表されるルートディレクトから枝分かれするようにディレクトリが階層構造化されており、この構造を「ディレクトリツリー」と呼んでいます。
Windowsと違い、全てルートディレクトリから階層構造化されているのが特徴です。


# Linuxコマンド
よく使用するLinuxコマンド

```
$ cd　　ディレクトリを移動
$ ls　　　子ディレクトリの表示　 -lオプション　パーミッションの確認 
$ pwd　　ディレクトリ構造の表示
$ cat　　ファイルの展開
$ touch　　ファイルの作成
$ mkdir　　ディレクトリの作成
$ rm    ファイルの削除　　-rオプション　ディレクトリの削除
$ cp　ファイルやディレクトリの複写
$ wc 行数、語数、文字数を表示
$ grep 文字列の検索コマンド
$ chmod 権限の変更を行う
$ sudo スーパーユーザーとしてコマンド実行
$ yum パッケージをインストールする際に使用するコマンド
$ yum install パッケージ名　　パッケージをインストール（sudoが必要な場合がある）
$ yum remove パッケージ名　　　パッケージのアンインストール（sudoが必要な場合がある）
```

# リダイレクトについて
リダイレクトとは、入出力先を変更する機能のこと。
「<」標準入力の際に使用するコマンド

```:使用例
$ cat < /hoge/fuga
# fugaというファイルをcatコマンドに渡してあげる、つまりfugaファイルの中身を表示させるコマンド 
```

「>」標準入力際のに使用するコマンド

```:使用例
$ ls /bin > /hoge/fuga.txt
# binディレクトリ内をfuga.txtというファイルに出力させるコマンド
```

# パイプライン「｜」
複数のコマンドを連結させるコマンド

```
$ ls /bin | wc
#binディレクトリ内の行数と語数と文字数を表示させる意味　lsコマンドとwcコマンドを連結させている
$ ls /bin | grep file
#binディレクトリ内の「file」を含むファイルを検索してlsコマンドにわたす
```

# パーミッションについて
linuxには、ディレクトリやファイルごとにパーミッションと呼ばれるアクセス権限が付与されており、権限のレベルに応じて実行できるコマンド等が異なってくる

####権限の種類(パーミッション記号)としては

  - w　書き込み 
  - r　読み込み
  - x　実行

####権限付与する際の記号として

- u 　所有者対象
- o　その他のユーザ対象
- g　グループ対象
- a　すべてのユーザ
- +　権限付与
- -　権限削除
- = =の後に記述した権限を付与する

### 具体例

```
$ chmod o+r ファイル名　
# ファイル名というファイルに対してその他のユーザに読み込み権限を付与することを意味する。
```
Windows10環境でiTunesから『バックアップが壊れているため、(デバイス名)をバックアップできませんでした』というメッセージが出てバックアップが出来なくなったときの最終手段

現在(2021/07/02)ではiTunesのバージョンに関係なく発生するみたいです

# はじめに
最近発生したトラブルが調べても出てこない珍しいものだったのでMarkdownの練習も兼ねて纏めてみました、初めての記事なので間違っている点やアドバイス等あればぜひコメントとかで教えて頂けると助かります。

# エラー内容
iTunesでiOSデバイスをバックアップしようとすると『バックアップが壊れているため、(端末)をバックアップできませんでした』というメッセージが出てバックアップができない

# 原因
既に存在しない過去のバックアッファイルを参照しようとしている
 
# 引っかかった箇所
- 設定ファイルが普通にユーザーから見えるとこでは消せなかった
    - 普通は『環境設定』内からバックアップ履歴を消せば解決するらしいがまず履歴自体が表示されない
- 設定ファイルがある場所が特定できなかった
    - それっぽいファイルはあるもののiTunesは使うときだけその都度入れ直していた結果バージョン違いや個人フォルダーを移動させた結果色んな場所に残骸が残ってしまった

そこで自分はiTunesをiOSのバックアップと復元にしか使用してこなかったので消えて困るものはないし一度iTunesを真っ白な状態まで初期化すれば良いんじゃないかという考えに至るも

- iTunesは普通にアンインストールしても設定は消さない
    - だから以前のファイルが残ってる
- iTunesはインストールするときに過去の設定ファイルを見つけて読み込む
    - だからアンインストール前の状態が復元される

というループに閉じ込められることになった
# 解決方法
色々考えあぐねた結果Microsoft Storeアプリ版なら`アプリと機能`の`詳細オプション`内にあるリセットで初期化出来るんじゃ無いかと思いつき試した結果無事に初期化できた

<font color="Red">注意:以下の手順を行うとiTunesのデータが全て消えるので必要に応じて予めバックアップを取るなど対策してから実行してください</font>

1. まずMicrosoft Store版ではない場合一度iTunesをアンインストールしてMicrosoft Store版をインストールする
1. `スタート`から`設定`を開き`アプリ`内の`アプリと機能`のアプリ一覧からiTunesを見つけ選択し`詳細オプション`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73456/8f2b979d-e163-0d04-a1bf-43b55980d9c6.png)
1. 下にある`リセット`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73456/0564a85f-584d-8077-82b6-43a1855745eb.png)
1. 一応再起動しておく

そしてiTunesを起動すると全てが初期化されておりエラーメッセージも出なくなっている筈

# 最後に
今回ぼくの環境でこんな面倒くさいことにこんな事になったのはバージョン違いやx86版とx64版やMicrosoft Store版のiTunesを入れたり消したりしたことやバックアップ先をシンボリックリンクでファイルサーバに飛ばすなどいらんことしまくったのが原因なので基本的にググったら出てくる他の方法でなんとかなると思うしそっちの方は多分データも消えずにすむので本当にどうしようも無くなったときの最終手段と思っていてください
for文を１行でスマートに書きたい！

#はじめに

最近つよつよエンジニアの方のコードを見る機会が多々あり、そのコードの中にfor文が１行で書かれていた。
これまで難しそうと思って避けてきたがレベルアップのためだと思い、調べてみたら意外にも簡単で便利だった。

#Q : どのようなときに使える？
## 　A : イテラブルに値を代入するとき
イテラブル（繰り返し可能な）なデータであるリストや辞書などに利用することができ、この表記法を内包表記という。

### リストの場合
```python
# a = [代入したい値 for 代入したい値 in イテラブルオブジェクト (if文)]

abc_list = [0, 1, 2, 3, 4]
a = [i for i in abc_list]

"""
a = []
for i in abc_list:
    a.append(i)
"""
print(a)

b = [j for j in abc_list if j > 2] # 2より大きい値のみbに代入されている

"""
b = []
for j in abc_list:
    if j > 2:
        b.append(j)
"""
print(b)

c = [k + 2 for k in abc_list] # abc_listの各要素に２が加算された値がcに代入されている

"""
c = []
for k in abc_list:
    c.append(k + 2)
"""
print(c)
```

```
[0, 1, 2, 3, 4]
[3, 4]
```

### 辞書の場合
```python
#a = {キーに代入したい値: 値に代入したい値 for キーに代入したい値, 値に代入したい値 in　イテラブルオブジェクト}

fruit = ["apple", "banana", "peach", "greep", "orange"]
a = {key: 0 for key in fruit}

"""
a = {}
for key in fruit:
    a[i] = 0
"""

print(a)

good_or_bad = ["good", "bad", "good", "good", "bad"]
b = {key: emotion for key, emotion in zip(fruit, good_or_bad)} # キーにfruit配列が、emotionにgood_or_bad配列が代入されている

"""
b = {}
for key, emotion in zip(fruit, good_or_bad):
    b[i] = j
"""
print(b)

good_or_bad = ["good", "bad", "good", "good", "bad"]
c = {key: emotion for key, emotion in zip(fruit, good_or_bad) if emotion == "good"} 
 # good_or_badがgoodの位置にあるfruitの要素のみcに代入

"""
c = {}
for key, emotion in zip(fruit, good_or_bad):
    if emotion == "good":
        c[key] = emotion
"""
print(c)
```

```
{'apple': 0, 'banana': 0, 'peach': 0, 'greep': 0, 'orange': 0}
{'apple': 'good', 'banana': 'bad', 'peach': 'good', 'grape': 'good', 'orange': 'bad'}
{'apple': 'good', 'peach': 'good', 'grape': 'good'}
```
zip関数は辞書にキーと値の二つを代入することができる
AtCoderログ：0003 - ABC 064 A

# 問題

https://atcoder.jp/contests/abc064/tasks/abc064_a

## 問題文
> AtCoDeer君は、赤、緑、青色のカードを持っています。
> それぞれのカードには $1$ 以上 $9$  以下の整数が書かれており、赤色のカードには $r$、緑色のカードには $g$、青色のカードには $b$ が書かれています。
> $3$ つのカードを左から順に赤、緑、青色の順に並べ、左から整数を読んだときにこれが $4$ の倍数であるか判定しなさい。

## 制約
> $1 \le r,~g,~b \le 9$

## 収録されている問題セット
- [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ([第01問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-1-%E5%95%8F--abc-086-a---product-100-%E7%82%B9))

# 回答
## 回答1 (AC)
赤、緑、青のカードの値を取り込ん3桁の整数を求め、それが4の倍数になっているか、つまり4で割り切れるかを判定すれば良いでしょう。ここで、百の位が $r$, 十の位が $g$、一の位が $b$ である3桁の整数は $100r+10g+b$ と表せることを利用して、以下のようにコーディングしました。無事、ACでした。

```C++:abc064a-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int r, g, b;
  cin >> r >> g >> b;

  if ( (100*r+10*g+b)%4==0 ) {
    cout << "YES" << endl;
  } else {
    cout << "NO" << endl;
  }
}
```

## 回答2 (AC)
回答1でACになりますが、ちょっとだけ改良が可能です。ある整数が4の倍数であるかを判定するには、下2桁が4の倍数かを判定すれば良いことが知られています。これは、3桁目以上の部分は100の倍数、つまり4の倍数であるため、下2桁が4の倍数かを判定することで、整数全体が4の倍数であるかを判定することができるのです。従ってこの問題の場合、十の位が $g$、一の位が $b$ である2桁の整数が4の倍数であるかを判定すれば良いでしょう。コードは以下のようになりました。本来なら変数 $r$ は不要なのですが、何となく残してしまいました。

```C++:abc064a-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int r, g, b;
  cin >> r >> g >> b;
  
  if ( (10*g+b)%4==0 ) {
    cout << "YES" << endl;
  } else {
    cout << "NO" << endl;
  }
}
```

# 調べたこと
## [AtCoderの解説](https://atcoder.jp/contests/abc064/tasks/abc064_a/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/abc064/editorial.pdf)
回答1と同じ解法でした。

# 学んだこと
## 倍数の判定法
- 2の倍数：下1桁が2の倍数(偶数)ならば整数全体も2の倍数
- 3の倍数：各桁の数字の和が3の倍数ならば整数全体も3の倍数
- 4の倍数：下2桁が4の倍数ならば整数全体も4の倍数
- 5の倍数：下1桁が5の倍数ならば(0 or 5)整数全体も5の倍数
- 6の倍数：整数が2の倍数かつ3の倍数ならば整数全体は6の倍数
- 8の倍数：下3桁が8の倍数ならば整数全体も8の倍数
- 9の倍数：各桁の数字の和が9の倍数ならば整数全体も9の倍数

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0002 - ABC 086 A](https://qiita.com/RoadLynton/items/b50fcf597e2a12083fa0)
- 次の記事 → [AtCoderログ：0004 - ABC 088 A](https://qiita.com/RoadLynton/items/58906355ec8f8e0112c0)
【Rails】COLLATE=utf8mb4_binなテーブルを作成するマイグレーションファイルの書き方

MySQLには[寿司ビール問題](https://bugs.mysql.com/bug.php?id=76553)があります。
データベースの DEFAULT COLLATE を変更できれば一番いいんですが、それができない場合も多いと思います。
暫定対策として、`COLLATE=utf8mb4_bin`なテーブルを作成するマイグレーションファイルの書き方です。

## 環境

- Rails 6.1.3.2
- MySQL 5.7.16

## マイグレーションファイル

create_table に `options: 'COLLATE utf8mb4_bin'` を渡せばOKです。

```rb
class CreateTags < ActiveRecord::Migration[6.1]
  def change
    create_table :tags, options: 'COLLATE utf8mb4_bin' do |t|
      t.string :name, null: false, index: { unique: true }
      t.timestamps
    end
  end
end
```

## db/schema.rb を確認

ちゃんと `collation: "utf8mb4_bin"` が入ってますね。

```rb:db/schema.rb
  create_table "tags", charset: "utf8mb4", collation: "utf8mb4_bin", force: :cascade do |t|
    t.string "name", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["name"], name: "index_tags_on_name", unique: true
  end
```

## テーブル構造を確認

本当に `COLLATE=utf8mb4_bin`が設定されているか、mysql上でも確認してみましょう。

```sql
mysql> SHOW FULL COLUMNS FROM tags;
+------------+--------------+-------------+------+-----+---------+----------------+---------------------------------+---------+
| Field      | Type         | Collation   | Null | Key | Default | Extra          | Privileges                      | Comment |
+------------+--------------+-------------+------+-----+---------+----------------+---------------------------------+---------+
| id         | bigint(20)   | NULL        | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| name       | varchar(255) | utf8mb4_bin | NO   | UNI | NULL    |                | select,insert,update,references |         |
| created_at | datetime(6)  | NULL        | NO   |     | NULL    |                | select,insert,update,references |         |
| updated_at | datetime(6)  | NULL        | NO   |     | NULL    |                | select,insert,update,references |         |
+------------+--------------+-------------+------+-----+---------+----------------+---------------------------------+---------+
4 rows in set (0.01 sec)
```

`name` カラムの Collation が `utf8mb4_bin` になってますね。

## 🍣 ≠ 🍺 になっているか確認

🍣 と 🍺 をINSERTしてみましょう。

```sql
mysql> INSERT INTO tags (name, created_at, updated_at) VALUES ('🍣', NOW(), NOW());
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tags (name, created_at, updated_at) VALUES ('🍺', NOW(), NOW());
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags;
+----+------+----------------------------+----------------------------+
| id | name | created_at                 | updated_at                 |
+----+------+----------------------------+----------------------------+
|  1 | 🍣     | 2021-07-02 11:45:15.000000 | 2021-07-02 11:45:15.000000 |
|  2 | 🍺     | 2021-07-02 11:45:30.000000 | 2021-07-02 11:45:30.000000 |
+----+------+----------------------------+----------------------------+
2 rows in set (0.00 sec)
```

無事両方入りました！ :sushi: :beer: 

## 参考

https://railsguides.jp/active_record_migrations.html
『DBカラムデータを改行して表示する方法

#DBカラムデータを改行して表示する

こんにちは！
今回はBD関連の記事になります。
是非、参考にしていただければ幸いです。

##■問題点
textareaで入力した改行されたデータをテーブルに保存し、そのデータを表示すると、改行がされていなかった。

##■検証
テキストエリアで下記のように入力し、保存してみました。
あいうえお
かきくけこ
さしすせそ
たちつてと
すると、DB内では下記のように、登録されています。
![スクリーンショット 2021-06-13 17.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661515/9754a60c-0bf1-a924-38d1-dfb50a2a1d39.png)


文字間の、下記のマークが改行を意味しています。
![スクリーンショット 2021-06-13 17.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661515/e0042587-37c3-3eb0-a4bf-c8898ecd6cf7.png)

そこで、ブラウザに表示させてみました。
すると、改行がスペースに変換されています。
![スクリーンショット 2021-06-13 17.17.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661515/2565dd04-5eb4-c175-f485-0596953474c7.png)

##■解決策
CSSを指定することで解決できます。
下記を指定することで、DBで保存されていたス改行をブラウザに表示することができます。
white-space: pre-wrap

white-spaceは、要素内の半角スペース、改行の表示を指定する。

##■参考記事
https://saruwakakun.com/html-css/basic/white-space
Android Studioのバージョンを落とす方法

最新版のAndroid Studioへアップデートした後で不具合が発覚するなどした際に、その対処法として下位のバージョンを使うための方法を紹介します。
今回は例としてバージョン4.2.1から4.1.3へ戻す方法を取り上げます。
また、Android Studioのダウングレードに伴いkotlinのバージョンも1.5.10から1.4.32に下げています。

## Android Studioのアーカイブページへアクセス
まずhttps://developer.android.com/studio/archive.html にアクセスします。
利用規約を読み、ページ下部の「ライセンス契約に同意する」を選択してください。

## 過去のバージョンをダウンロード
過去のバージョン(アーカイブ)一覧が表示されるので、その中からダウンロードしたいものを選択します(今回は「Android Studio 4.1.3」)。
![スクリーンショット 2021-07-02 205708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261074/8f132888-1711-d3a9-5c10-0ac7f3722d01.png)

そうするとzipファイルがダウンロードが開始されるので、ダウンロードが終わったらzipファイルを任意のディレクトリに配置し、解凍してください。

## ダウンロードしたAndroid Studioを起動
「ルートフォルダ(zipファイルと同じ名前) > android studio > bin」にある「studio64.exe」を選択してください。
ダウンロードしたAndroid Studioが起動します。

## バージョン確認
プロジェクトを選択し、「Help > about」からバージョンを確認してください。(アーカイブページで選択したバージョンになっていればOKです)

## gradleの修正
最後にプロジェクトレベルの「build.gradle」を修正します。
今回は以下のようにしています。

```build.gradle
buildscript {
    ext.kotlin_version = '1.5.10'
    ↓
    ext.kotlin_version = '1.4.32'
    
    ...省略...
    
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.1'
        ↓
        classpath 'com.android.tools.build:gradle:4.1.3'
        ...省略...
    }
}
```

上記の「build.gradle」の修正を同期してビルドできれば完了です。

参考：https://minpro.net/android-studio-downgrade
[Android] Android Emulator 30.7.5アップデートしたら起動しないし、Kill Processことを解決した方法。

久しぶりです。
Android studio4.2.2アップグレードしたら、
Android　エミュレーターもアップデートしました。
でも起動しない。。。

これなんか vulkan-1.dllの問題ありました。

## 解決した方法。

```advancedFeatures.ini
Vulkan = off
GLDirectMem = on

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/c21c26d0-a93e-8240-2373-13915bc41a44.png)


これでまたエミュレーター使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/449706b7-7a95-2585-666a-556f8c9e04c6.png)
Pythonのローカルインストール

# はじめに
ここでいうローカルインストールの想定としては、ネットワーク接続が制限されたサーバー（Linux）に、SSHなどで接続できる状態にあり、ネットワークに制限なく接続できるクライアントPC（Windows）でダウンロードなどを行う。

# Python本体のインストール
公式サイトからお好みのバージョンのPythonをお好みのsource releaseでダウンロード。
https://www.python.org/downloads/

ダウンロードしたファイルをSCPでアップロード。
おなじみのconfigure, make, make installを行う。

# 各モジュールのインストール
## 各モジュールのダウンロード
### 仮想環境を作成
```python
python -m venv (仮想環境名)
```
仮想環境を作成することで、現在の環境にインストールされているモジュールの影響を受けなくなります。

### 仮想環境を起動
```
(仮想環境名)/Scripts/activate
```
Windows環境での起動例

### wheelを保存するフォルダを作成
```
mkdir -p wheels/(各モジュール名)
```
どのように保存するかは自由ですが、各モジュールごとに分けて保存したほうが便利だと思います。

### 各モジュールをダウンロード
```python
python -m pip download -d (wheelを保存するフォルダ) (モジュール名)
```
## 各モジュールのインストール
SCPでwheelフォルダをサーバーにアップロードし、各モジュールに対し、以下を実行する。

```python
python -m pip install --no-index --find-links=(wheelがあるディレクトリ) (モジュール名)
```
EC2にアクセスできなかったのでRoute AnalyzerとVPC Reachability Analyzerを使ってトラブルシュートしてみた

こんにちは！

今回はEC2を使っていて特定のインスタンスにSSHできなかったのでVPC Reachability AnalyzerとRoute Analyzerを利用してトラブルシューティングを行いましたので、メモ的に残しておきます。

結論は、Security Groupの問題でした (-_-;)

## 今回の構成

![access-check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675393/d7c1422a-17ea-34f7-a948-9b5fc2735649.png)

- トランジットゲートウェイを利用している
- SSHを利用して接続を試みる

## 状況

Instance AからInstance BへSSH接続を試みたが、結果は接続ができない状態となります
（Security Groupはこの時点で確認しているが設定を見逃している）
ここでAWSのいろいろなサービスが出てたなぁっと思い以下のサービスを試してようと思いました！

- Route Analyzer
- VPC Reachability Analyzer

## 実施事項

### VPC Reachability Analyzerの利用

VPC Reachability Analyzerを利用して通信の分析を行いました。結果は以下のエラーが表示されました。。。

VPC Reachability Analyzerの構成

- 送信元 : Instance A
- 送信先 : Instance B

![スクリーンショット 2021-07-02 18.16.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675393/b08d3710-8cee-ea79-bf43-8244704d6fc4.png)

表示されたエラー

```bash
PATH_THROUGH_TGW_UNSUPPORTED
```

![スクリーンショット 2021-07-02 18.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675393/2ac82ed4-b4a2-b400-b24b-fc5cb1b81683.png)

### エラー内容の調査

「PATH_THROUGH_TGW_UNSUPPORTED」の内容を確認してみました。
ドキュメントは[こちら](https://docs.aws.amazon.com/vpc/latest/reachability/explanation-codes.html)です。
VPC Reachability Analyzerではまだ、トランジットゲートウェイ経由の通信は、まだサポートされていないようです。代わりに Route Analiyzerを使ってくとのことだったのでそちらを確認したいと思います。

### Route Analyzerの利用

こちらはトランジットゲートウェイ経由の通信の可視化が可能でした。
結果は、通信はできるようでした。

![スクリーンショット 2021-07-02 18.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675393/fecc9c80-94b0-226f-25be-3c3c5fb2b6a1.png)

### 再度VPC Reachability Analyzerの利用

トランジットゲートウェイを経由できなかったので、送信元をトランジットゲートウェイに変更して実施しました。実施した結果、エラー内容が変わりました。

VPC Reachability Analyzerの構成

- 送信元 : Trangit Gateway
- 送信先 : Instance B

![スクリーンショット 2021-07-02 19.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675393/707e82a4-a77a-07b0-1fcc-0b90ac935ed2.png)

表示されたエラー

```bash
次のセキュリティグループの ingress ルールはいずれも適用されません: sg-0040f33a3117f8c5b。
```

![スクリーンショット 2021-07-02 19.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675393/a4a73fba-d9c4-5690-2328-8499a0bfbef9.png)

### エラー内容を参考にSecurity Groupを調査

SSHのポートがあいてませんでした  orz

## まとめ

はじめてRoute AnalyzerやVPC Reachability Analyzerを利用してみました。通信が可視化されてみえることで、トラブルシューティングのためになりましたし、解決までの時間を短縮できたと思います。機会があればまた活用しようと思いました！！!
Dockerのnetwork数上限はCIDRブロック指定で回避できる

# 何の記事？
先日、dockerのnetworkを作ろうとしたときに次のエラーに遭遇しました。

```bash
Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
```

調べたところ「[docker networkを限界まで作る](https://qiita.com/tksugimoto/items/e42b0d6931898671734f)」という記事にもありますが、独自のdockerのnetworkはデフォルトで29個までしか作ることができないらしいことが何となく分かりました。
ちなみに、自分の環境では独自ネットワークを30個作ったところで限界を迎えていました（`独自 + bridge + host + null = 33`）。

```bash
$ docker network ls | wc -l
33
```

ただし、CIDRブロックを指定することで限界突破できることがわかったので、知見を簡単にまとめることにしました。
※内部実装がどうなっているかみたいなことには触れません（知りません）。

# 環境
- Docker version 18.06.1-ce
- Amazon Linux 2

# CIDRブロックを指定する

dockerのnetworkのCIDRブロックは何も指定しなければ、

- `172.*.0.0/16`
- `192.168.*.0/20`

のどちらかで作られます。
したがって、以下のようにして引っかからなければそのブロックを使用可能です。

```bash
docker network inspect $(docker network ls -q) | grep Subnet | grep 172.33
```

（ちなみに、`*`の部分は連番になっているかと思い調べてみましたが、172系は連番になっていて、192.168系は連番になっていませんでした。）

使えるCIDRブロックが分かったらネットワークを作る際にオプションとして指定します。

```bash
docker network create qiita_test_nw --subnet=172.33.0.0/16
```

たったこれだけです。
ちなみに、network数を調べると限界突破できています。

```bash
$ docker network ls | wc -l
34
```

# 注意点
上のやり方が通用したのは172系のサブネットのみで、192.168系のサブネットは上限を超えて作ることができませんでした。
感情を持ったAIを作ってみたい(0)

#なぜ感情を持たせたいのか
・簡単に言うと、感情を持たせたAIは何を考えるのか気になったため
・AIが人と共存する未来が見たいと思った
・AIは人を愛せるのか？という疑問が浮かんだ
・逆に人はAIを愛せるか？という疑問が浮かんだ
これらの理由ですね。

#本日は？
・まだ知識、技術が揃っていませんが、少し自分の考え、手法について記載しながらコメントで意見、手法が適切かなどのフィードバックをいただきたいと思っています。
(詳しくは後の[挨拶]の部分で記載します)

#どんな手法があるの？
###機械学習の知識が欲しいよ！！と言う方は？
・こちらも様々なユーザー様が解説しているので、説明は省かせていただきます。
　知りたい方はこちらをご覧ください。
　https://qiita.com/ishizakiiii/items/d422019b52d973e0e28d
###強化学習ってなにさ？
・様々なユーザー様が説明しているので、説明は省きますね。
　もし強化学習のことを知りたいぞと言う方はこちらをご覧ください。
　https://qiita.com/icoxfog417/items/242439ecd1a477ece312

#何を使ってやろうとしているの？
・個人的な意見になってしまいますが、教師あり学習で感情をデータ化したものを学習させるのが、簡単なのではないか？と最初は考えました。
　ここで考えたのが、感情データを収集するものですが最近では感情を分析するアプリなどで人の顔を読み込ませ、データベース等で収集し再度、学習させるのがいいのではと考えていました。
###喫煙中に考えたこと
・また個人的な意見ですが、人は我慢するものなので細かい動作、表情の動きから嘘を見抜くのは難しいので？と考えました。(学習させてば何とかなる程度かも知れませんが)
・例えば感情を分析するアプリで、嘘の笑顔をされると精度が悪ければそれは笑顔＝元気というカテゴリに入ってしまうので正しい情報ではなくなってしまう？と考えました(個人的な考え、また新参者なので現在ではそういった細かい動作、仕草なのでわかるアプリやサービスがあるかも知れませんが)
###教師ありではなく強化学習だったらどうなんだろうか？
・ここで強化学習の話ですね。経験と報酬、ミス等の細い部分をどこに置くかという話になりますね。
　強化学習については、[どんな手法があるの？]でリンクがありますのでそこから確認してください。
・今までの話から路線がずれるかも知れませんが、人間にある五感(味覚はいるか？と思いますが、まぁ人間に近いものにしたいのでそこはおいておきます)思考するためのニューラルネットワークの構築を行うことができれば最適な考え方、行動を理解してくれるのでは？と思いました(ですが、トライ&エラーをしながら試行錯誤、路線変更しないといけないところなのであくまで一個人の考えです)

#強化学習から深層強化学習へ
###深層強化学習ってなに？
・下記サイト様より


>深層強化学習とは強化学習と深層学習の手法を組み合わせた物で、代表的な手法に、Deep-Q-Network(DQN)があります。DQNは、Q学習における行動価値関数(Q関数)を、畳み込みニューラルネットワークに置き換えて近似したものです。

>ただ単純にQ関数を畳み込みニューラルネットワークを置き換えても、学習がうまくいくわけではないので、学習を収束させるための工夫がなされています。

https://avinton.com/blog/2017/10/basic-deep-reinforcement-learning/

というものを最近知りました。

・感情を持たせるということ、人間に近い考え方を持たせるにはまだ足りないと思いますが、今後はこちらに記載されている手法で
>Experience Replay
>DQNの学習を収束させるための工夫として、Experience Replayがあります。Experience Replayは、エージェントが経験した過去の体験をreplay memolyに一定期間保存して置き、過去の経験をランダムにサンプリングして学習を行う手法です。データ間に強い相関があると学習が収束しなくなってしまうことを防ぐために、学習に使用するデータの偏りを無くすのが目的です。

こちらを利用し、使用してみようと考えています。

#結論
###結局何が言いたいの？
・感情を持たせるにはまず、人間の行動原理などを学ばせるのが良いのでは？と考えています(そこまで万能ではないので細かい路線変更、手法の変更をするのは明らかですが…)
・ニューラルネットワークを人間の脳に近いものを形成することでどの部分にどの作用に反応があるかを見るのが良いのでは？そこから経験を積ませる、最適な行動をとることで近いものになるのでは？と考えています。



#挨拶

はじめまして、挨拶ということで、
組込みエンジニアとして、とある企業におります粉です。

・では、組込みエンジニアがなんでAIなの？という疑問を持たれる方もいらっしゃると思います。
簡単に説明させていただきますと、元はAIを作ってみたい、社会問題、労働に関してもっと働きやすい環境が必要なのではないか？と考えたため様々な課題をAIなどの先端技術でアプローチをかけてみたいと思い、AIエンジニアを目指しました。
ですが、今やっているのは組込みエンジニアのため、使用する技術、言語が違うといったことから、独学でやってみようと思いまして、今回から記事を投稿させていただいています。

・私よりも、知識、技術が豊富な先輩方から新鮮な意見をいただけることを楽しみにしています。

・まだまだ新参者、理解が足りていない部分もあるので記事を書きながら、修正を繰り返して理解を深めれればと思っております。(AIを研究している企業や研究機関に転職したいです(個人的な話)

・こんな手法もあるぞ、やり方はこうだ！！などの意見も募集しております。
MySQLで複数のカラムの最大値を取るときはGREATESTが使える

同じカラムの最大値を取るときにはMAXが使えますが、複数のカラムにまたがった値の最大値を取るにはGREATESTが使えます。

```sql
select GREATEST(a, b, c, d) from hoge_table
```
a,b,c,dの部分は数字だけじゃなくて時間とかでもいけます。

最小値を取るときにはLEASTが使えます。

```sql
select LEAST(a, b, c, d) from hoge_table
```

しかしa,b,c,dのどれかがnullだと結果がnullで返ってきてしまって残念。気を利かせてほしかった。
SQLAlchemy とは

## 勉強前イメージ

全然わからん。聞いたことなかったので調べる。

## 調査

### SQLAlchemy とは

Pythonを使ってDB操作を行うツールで、ORMの1つです。
Pythonを使うとDBのテーブルの関連付けが出来ます。

### ORM とは？

Object Relational Mapper の略で、
RDBとオブジェクト指向プログラミング間の違いを変換してくれるライブラリになります。
また、SQLを直接記述せずに操作できます。

### SQLAlchemy の機能

- ORM

上記で記載したものになります。

- データベースへの接続、SQLの実行

SQLAlchemyを使用すると様々なDBに接続することが出来ます。
Microsoft SQL Server、MySQLやPostgreSQLなどよく使用されるものは利用可能です。

- メタデータ

テーブルとPythonのモデルクラスをマッピングする機能にメタデータと呼ばれるものがあります。
Pythonのコードとテーブルを完全同期させることが可能です。

## 勉強後イメージ

pythonを書いてる時、DBに接続したいときに使われる。
あといろんなDBに対応してる。
初めて聞いた。。。

## 参考

- [SQLAlchemy入門 SQLAlchemyとは](https://www.python.ambitious-engineer.com/archives/1469)
- [ORMライブラリの使い方（SQLAlchemy）](https://myafu-python.com/orm/)
vscode用golang開発用モジュール一覧

# 概要

Vscodeのremote containerをGoの開発環境として利用する場合、formatterやlinterに必要なモジュールが多数存在する。
remote-containerのデフォルトにあるGo環境ならすべてそろっているが、自前のDockerfileを利用する場合、自分で明示的にdownloadする必要がある。
以下に入れておいたほうがよいgomoduleの一覧を記載する。

vscode公式のGoコンテナの開発用搭載モジュールは以下に記載されています。

https://github.com/microsoft/vscode-dev-containers/blob/main/containers/go/history/dev.md

# 環境
Go 1.15~1.16

# Dockerfile

```
RUN go get -v\
    golang.org/x/tools/gopls@v0.7.0\
    honnef.co/go/tools@v0.2.0\
    golang.org/x/lint@v0.0.0-20210508222113-6edffad5e616\
    github.com/mgechev/revive@v1.0.8\
    github.com/uudashr/gopkgs@v1.3.2\
    github.com/ramya-rao-a/go-outline@v0.0.0-20210608161538-9736a4bde949\
    github.com/go-delve/delve@v1.6.1\
    github.com/golangci/golangci-lint@v1.41.1
```
とりあえず、開発環境用Dockerfileに上を追記すればok
iOS14.5でsandboxによる課金処理で躓いたこと

## 投稿の経緯
`sandbox`を使って課金処理のテストを実行するで[こちらの記事](https://spinners.work/posts/ios-sandbox/)を参考に実行していましたが、**iOS14**からの表記の違いなどで少し手こずったので記事に残します。

## 環境
Swift version 5.4.2
Xcode version 12.5.1
iOS 14.6

## 手こずった箇所①
**`iTunes StoreとApp Store`**という項目がiPhoneの設定にない。
iOS14からiTunes StoreとApp Storeから**`メディアと購入`**に変わったみたいです。
設定のアカウントページから移動できます。

## 手こずった箇所②
`設定>AppStore`の最下部に**『SANDBOXアカウント』**という欄が表示さない。
これは対象のアプリの課金処理をおこなった場合に表示されるユーザーIDとパスワードを求められる認証で、SANDBOXアカウントのIDとパスワードを入力することで表示されます。

この認証を突破すれば無事、課金処理のテストをおこなえます。

## お知らせ
現在、iOSアプリ開発の週末バイトや、就業後にできる開発案件（副業）を探しております。
ご依頼はTwitter DMまでお願いします。
Bootstrapを使ってフォームを作成していたらSyntaxErrorになった

#はじめに
Bootstrapを導入して投稿フォームを作ってみようと思いました。

⇩⇩⇩日本語版

https://getbootstrap.jp/

しかし、構文エラーになってしまいました。
結論、Bootstrapの記述方法が間違えてました。
解決策をアウトプットしていきます。

![スクリーンショット 2021-07-02 18.52.36（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/2a6ceef1-953b-ee52-f76a-07c8b8e58e91.png)

###前提

- 既にBootstrapを導入している事。

- 下の画像のようなフォームを作りたいのでコードをコピー

![スクリーンショット 2021-07-02 18.57.35（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/c270c117-841f-e6c5-0ec6-d57f5dbaa9fd.png)

```.html
<form>
  <div class="form-group">
    <label for="formGroupExampleInput">Example label</label>
    <input type="text" class="form-control" id="formGroupExampleInput" placeholder="Example input">
  </div>
  <div class="form-group">
    <label for="formGroupExampleInput2">Another label</label>
    <input type="text" class="form-control" id="formGroupExampleInput2" placeholder="Another input">
  </div>
</form>
```

#エラーが起きた原因

この記述をrailsでも使えるように記述し直さなければなりません。

```erb
<div class="form-group">
  <%= f.label :faclity_name,"施設名" %><br />
  <%= f.text_field :faclity_name, class="form-control" id="formGroupExampleInput" placeholder="Example input"%>
</div>
```

railsのヘルパーメソッドである`form_with`で記述した情報を送信するようにこのように記述しました。


###間違えていた考え

このフォームを使うためには<form.text_field>タグ内の`class名`、`id名`を変えてはいけないと思っていました。

```erb
 <%= f.text_field :faclity_name, class="form-control" id="formGroupExampleInput" placeholder="Example input"%>
```

この`<div>`で囲った中にフォームを記述をすればpreview通りに使う事ができます。

```erb
<div class="form-group">
  フォームの処理
</div>
```



もう一つの間違えは`html.erb`内の記述の仕方です。
class名やid名を`:`ではなく`=`で記述していました。

訂正すると

```erb
<%= f.text_field :faclity_name, class: "form-control" id: "formGroupExampleInput" placeholder: "Example input"%>
```

最終的に下記の記述でフォームを出す事ができました。

```erb
div class="form-group">
  <%= f.label :faclity_name, "施設名" %><br />
  <%= f.text_field :faclity_name, class: "form-control", placeholder: "〇〇遊園地" %>
 </div>
```

![スクリーンショット 2021-07-02 19.36.24（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/732a8dfe-df00-ac8e-88f8-9dac92f26aea.png)
Fastlaneをインストールでハマった話

Fastlaneをインストールでハマった話

```bash:origon.co.jp
$ sudo gem install fastlane
```
```bash:origon.co.jp
$ fastlane match development --readonly
```
以下の表示まま、ハマりました！

```bash:origon.co.jp
[02:22:08]: Cloning remote git repo...
[02:22:08]: If cloning the repo takes too long, you can use the clone_branch_directly option in match.
```
理由は以下の記事に記載されていましたが、解決策のリンクが無効になったので、この解決策を追記いたします。
https://qiita.com/jollyjoester/items/e8df75f28b92eb90371c

以下のようにGithubに設定されたssh公開鍵があった場合、
そのファイルと一緒に生成された秘密鍵ファイル(id_rsa)ファイルを以下のディレクトリに配置します。

```bash:origon.co.jp
$ cp -p id_rsa ~/.ssh/
```

後、パーミッション設定を0600に変更します。

```bash:origon.co.jp
$ cd ~/.ssh
$ chmod 600 id_rsa

$ ssh-add ~/.ssh/id_rsa
```

もう一度、
iOSブロジェクトファイルが格納されたディレクトリ下に移動して、以下コメントを実行します。

```bash:origon.co.jp
$ fastlane match development --readonly
```

以下のように、パスプレーズを聞かれますので、登録されれたid_rsdのパスプレーズを入力いたします。

```bash:origon.co.jp
[18:59:22]: If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.
[18:59:25]: Checking out branch master...
[18:59:26]: Enter the passphrase that should be used to encrypt/decrypt your certificates
[18:59:26]: This passphrase is specific per repository and will be stored in your local keychain
[18:59:26]: Make sure to remember the password, as you'll need it when you run match on a different machine
[18:59:26]: Passphrase for Match storage: ********
[18:59:30]: Type passphrase again: ********
```

上記パスワードが通ったら、以下のように無事にプロビジョニングファイルがインストールされました。

```bash:origon.co.jp
+---------------------+--------------------------------+--------------------------------+

[19:03:59]: All required keys, certificates and provisioning profiles are installed 🙌
```
Ruby gem mysql2が `ld: library not found for -limported_openssl` で失敗する問題

＃ 問題

```
gem install mysql2
```

するとき以下のエラーが出てきた：

```
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2
...

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2
```


# 解決

調べると、いろいろ方法がありそうですが（参考リンクは一番後ろに添付）、一番いい解決はopensslをインストール、エクスポートと思います：

```
brew install openssl
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/
```

そうしたら

```
bundle install
```

無事解決しました。

# 参考資料

https://qiita.com/choripon/items/b59e568b614e7e67d1af
https://stackoverflow.com/questions/43523389/cannot-install-mysql2-gem-for-rails-project