OmniAICreator/Qiita-1.07M huggingface dataset:
データ分析で役立つPandas DataFrameへの置換操作のやりかた(簡単)

pandas でデータ置換を行うときに見る個人メモ。
whereは使いにくいのでもっとわかりやすく書きたかった。

## 結論
```python
# pandas : data_x
data_x.width = data_x.width.replace('めっちゃ高い', 333)
```

これで'めっちゃ高い'を333に置き換えることができる。

'pandasのデータ'.'対応する列名'.replace('対象データ', '置換したいデータ')という構造
OpenLDAPで最後にログインした時間を記録させる方法

# やりたいこと
OpenLDAPでユーザが最後にbindした時間を記録したい！


## 環境

OpenLDAP 2.4

```
slapd -V
@(#) $OpenLDAP: slapd  (Ubuntu) (Nov 16 2020 13:41:27) $
        buildd@lgw01-amd64-021:/build/openldap-tdJ5yB/openldap-2.4.42+dfsg/debian/build/servers/slapd

```

## 手順

### 1. モジュールの読み込み
lastbindモジュールを読み込む
下記のようなコンフィグ用ldifを作成

```ldif:load_lasbind.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleload
olcModuleLoad: lastbind.la
```

ldapaddする

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f load_lasbind.ldif
```

### 2. オーバーレイの有効化
lastbindにhookさせてauthTimeを追加するオーバーレイを有効化する。

```ldif:lastbind.ldif
dn: olcOverlay=lastbind,olcDatabase={1}mdb,cn=config
objectClass: olcLastBindConfig
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: lastbind
olcLastBindPrecision: 60
```

ldapaddする

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f lasbind.ldif
```

### 3. slapd再起動

```
systemctl restart slapd
```


### 4. おわり
試しにuserでbindしてみると以下のような要素が増えていることがわかる。

```
# slapcat | grep auth
authTimestamp: 20210121005115Z
authTimestamp: 20210121004901Z
authTimestamp: 20210121005041Z
authTimestamp: 20210121005128Z
authTimestamp: 20210121004613Z
authTimestamp: 20210121005019Z
...
```


## 参考
[Symas OpenLDAP How-to Guides](https://3bmahv3xwn6030jbn72hlx3j-wpengine.netdna-ssl.com/wp-content/uploads/2018/11/Configure-LastBind.pdf)
ArgumentParserの使い方のシンプルな例

Pythonで初めてArgumentParserを使ってみました。

使い方に関する記事はいろいろありましたが、取り急ぎやりたいことを調べるのに、時間がかかって、あきらめそうになったので、メモとして残します。

実現したいことは、
* 対象とするデイレクトリをパラメータとして渡す
* 通常は条件に一致したファイルを対象とするが--allと指定されたらすべてを対処とする 

下記を実行した時は、testDir内のすべてのファイルを処理対処として

```
$ python3 check.py testDir  --all
```

--allを指定せず実行した時は、testDir内のすべてのファイルのうち特定のファイルを処理したい

```
$ python3 check.py testDir
```


##### ディレクトリをパラーメータとして渡す
まずは初歩の初歩　最初の一歩として

```
parser.add_argument('directry', help='input directry')
print(args.directry)
```
実行結果

```
$ python3 check.py testDir
testDir
```

##### 実行する条件も指定する
次にオプションとして“--all”を指定できるようにする
--allが指定された時は、「True」が返るように「action='store_true'」を指定した
（値を指定しないオプションの時は「action='store_true'」か「action='store_false'」を指定する）

```
parser.add_argument('directry', help='input directry')
parser.add_argument('--all', help='Existence check',action='store_true',required=False) 
print(args.directry)
print(args.all)
```

実行結果

```
$ python3 check.py testDir --all
testDir
True
$ python3 check.py testDir
testDir
False
```
JavascriptでSlackbotにリアクションをさせよう

本記事はJavaScriptでSlackbotにリアクションさせる方法を紹介するものです。
![リアクションする](https://miyabi-knock.com/tools/wp-content/uploads/2019/02/JavaScript_slackbot_react1.png)

Pythonでリアクションをさせる方法については「[Slackbotにリアクションをさせる〜PythonでのBot開発〜](https://miyabikno-jobs.com/slackbot-react/)」をお読みください。

## Slackの絵文字リアクション機能について
Slackの機能で自分や他の人に投稿したコメントに対してマークをつけることができます。
リアクションのマークをつけることで相手に同意や反対の意思を示すことが可能です。

下記のように一つのコメントに対して複数のリアクションをすることも可能です。
![昼はカレーかラーメンか](https://miyabi-knock.com/tools/wp-content/uploads/2018/12/bot_reaction2-300x97.png)



## JavaScriptでSlackbotにリアクションをさせる方法
**◆Botのリアクションの記述**

JavaScriptでSlackbotにリアクションさせる場合の記述例は以下の通りです。
 
```
controller.hears(['ご機嫌いかが'], 'direct_message,direct_mention,mention', function(bot, message) {

    // nameに絵文字を指定する
    bot.api.reactions.add({
        timestamp: message.ts,
        channel: message.channel,
        name: 'smile',
    }, function(err, res) {
        if (err) {
            bot.botkit.log('Failed to add emoji reaction :(', err);
        }
    });
});
```

**◆実行結果**
![リアクションする](https://miyabi-knock.com/tools/wp-content/uploads/2019/02/JavaScript_slackbot_react1.png)

このままだとかなり長いので関数化しておきましょう。

```
controller.hears(['ご機嫌いかが'], 'direct_message,direct_mention,mention', function(bot, message) {
    bot_react(bot, message, 'smile')
});

function bot_react(bot, message, emoji) {
    bot.api.reactions.add({
        timestamp: message.ts,
        channel: message.channel,
        name: emoji,
    }, function(err, res) {
        if (err) {
            bot.botkit.log('Failed to add emoji reaction :(', err);
        }
    });
}
```

1度に複数のリアクションをさせることも可能です。

<pre class="lang:default decode:true " >controller.hears(['ご機嫌いかが'], 'direct_message,direct_mention,mention', function(bot, message) {
    bot_react(bot, message, 'smile')
    bot_react(bot, message, 'robot_face')
});</pre> 

**◆実行結果**
![リアクションを2つする](https://miyabi-knock.com/tools/wp-content/uploads/2019/02/JavaScript_slackbot_react2.png)

### 絵文字について
Slack絵文字の代替文字を指定します。
代替文字は以下の画面の下に表示されている「::」で囲まれている文字です。

![リアクション一覧](https://miyabi-knock.com/tools/wp-content/uploads/2018/12/reaction_list-257x300.png)

Slack内から打つ場合は、「:スマイル:」など日本語での記述も可能ですが、Botにリアクションさせる場合はNGです。

**◆この記述はエラーとなる**

```
@respond_to('^ご機嫌いかが？$')
def question_1(message):
    # 日本語はNG
    message.react('スマイル')
```

以上、JavaScriptでBotのリアクションをさせる方法についてでした。

**◆関連記事**
[SlackbotをJavaScriptで作成しよう](https://miyabikno-jobs.com/implement-slackbot-javascript/)
[Slackbotにリアクションをさせる(Python)](https://miyabikno-jobs.com/slackbot-react/)
Mac の DBeaver に Emacs のキー設定をする

# キー設定

  - [User Interface]-->[キー]-->
      - スキームを 「Emacs」 に変更
      - 「前を削除」 に 「Ctrl+H」 を設定
      - 「Ctrl+M」 （アクティブ・ビューまたはエディターの最大化） をアンバインドする
      - 「Ctrl+Space」（マークの設定）をアンバインドする
      - 「Ctrl+Space」（コンテンツ・アシスト）に「Shift+Space」 に変更（Macの入力ソース切り替えショートカットと重複するため変更する）

# その他 オススメ設定

- SQL書式
  - [エディタ]-->[SQLエディタ]-->[SQL書式設定]-->
      - 「キーワードケース」 を 「Upper」 にする（SQL命令が大文字になる）
      - 「インデント幅」を 2 にする

- プラグイン追加
  - [ヘルプ]-->[新規ソフトウェアのインストール]--> 「作業対象」にそれぞれ以下を入力してインストールする
    - 「office」 と入力したら候補がでるので選択する （xlsx形式エクスポートできるようになる）
    - 「svg」 と入力したら候補がでるので選択する （svg形式エクスポートできるようになる）
PostgreSQLインストールと初期設定

PostgreSQLをインストールしてDBへ接続する

##はじめに
　　[本シリーズの目次はこちら](https://qiita.com/miyamura-figeo/items/57246bc5d32bd91af5ed)

##やりたいこと

PostgreSQLをインストールし、コマンドプロンプトから以下のコマンドを実行する
詳細は各記事を参照してください。

1. 接続  
`psql -h localhost -p 5432 -U postgres -d postgres`
2. DB作成
`CREATE DATABASE test_db;`

3. ロール作成　
`create role test_admin with login password 'pw_admin';`
`ALTER ROLE test_admin WITH SUPERUSER;`
`create role test_user1 with login password 'pw_user1';`
`ALTER ROLE test_user1 WITH LOGIN;`
4. 作成したユーザで再度ログイン
`exit;`
` psql -h localhost -p 5432 -U test_admin -d test_db`
5. スキーマ作成
`CREATE SCHEMA test_schema;`


##１．PostgreSQLをインストールする
　　　　[PostgreSQLインストール方法](https://qiita.com/miura31/items/debc5d0145b18de0108e)

##２．コマンドプロンプトからPostgreSQLを使用するための設定

##３．DBを作成する



##参考
* [PostgreSQLインストール手順](https://qiita.com/tom-sato/items/037b8f8cb4b326710f71)

* [環境変数に追加](https://qiita.com/wb7
* 73/items/c2fd0e1e0349a41b5844)

* [PostgreSQLでのデータベース作成方法&削除方法](https://qiita.com/suzuki_y/items/e1e8a63e1b2bece82f8b)

* [PostgreSQLのロールとは](https://qiita.com/nuko_yokohama/items/085b75ee4c0938936ab9)

* [PostgreSQLでユーザー（ロール）を追加してテーブルにアクセスする](https://qiita.com/wb773/items/248e6e083b2fe12e820a)
公益財団法人日本薬剤師会の医薬分業進捗状況（保険調剤の動向）のPDFをCSVに変換する

公益財団法人日本薬剤師会の[医薬分業進捗状況（保険調剤の動向）](https://www.nichiyaku.or.jp/activities/division/faqShinchoku.html)のPDFをCSVに変換する

```python
import pathlib
import time
from urllib.parse import urljoin

import pandas as pd
import pdfplumber
import requests
from bs4 import BeautifulSoup
from tqdm.notebook import tqdm

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
}

def fetch_soup(url, parser="html.parser"):

    r = requests.get(url, headers=headers)
    r.raise_for_status()

    soup = BeautifulSoup(r.content, parser)

    return soup

def fetch_file(url, dir="."):

    p = pathlib.Path(dir, pathlib.PurePath(url).name)
    p.parent.mkdir(parents=True, exist_ok=True)

    # 同一ファイル名の場合はダウンロードしない
    if not p.exists():

        # サーバー負荷軽減のため3秒待機
        time.sleep(3)

        r = requests.get(url)

        with p.open(mode="wb") as fw:
            fw.write(r.content)

    return p

# スクレイピング

url = "https://www.nichiyaku.or.jp/activities/division/faqShinchoku.html"

soup = fetch_soup(url)

# PDFのURLを抽出
links = [urljoin(url, i.get("href")) for i in soup.select("section.section a.btn-pdf")]

# PDF変換

table_settings = {
    "vertical_strategy": "lines",
    "horizontal_strategy": "text",
    "intersection_tolerance": 5,
}

for link in tqdm(links):

    # PDFファイルをダウンロード
    path_pdf = fetch_file(link, "pdf")

    with pdfplumber.open(path_pdf) as pdf:

        page = pdf.pages[0]

        # PDFの表をテキスト変換
        table = page.extract_table(table_settings)

        # CSV加工用に一時pandasで読み込み
        df = pd.DataFrame(table)

        # ヘッダー1行目の結合セルを補完
        df.iloc[0] = df.iloc[0].fillna(method="ffill")

        # 保存用にPDFファイル名の拡張子をCSVに変更
        path_csv = pathlib.Path("csv", path_pdf.with_suffix(".csv").name)
        path_csv.parent.mkdir(parents=True, exist_ok=True)

        df.to_csv(path_csv, encoding="utf_8_sig", index=False, header=False)
```
【#PowerApps Tip's】あらためてヘルプボタンが便利な件

Power Apps は、ほぼ毎週ぐらいの頻度で何らかの Update が実施されております。機能や影響の大小はありますが。本日は、ふとしたことで「あれ？こんなのあったっけ？」という画面の変化に気づいた件です。

あるいは、初心者・初学者の方には便利なお助け機能の紹介です。
個人的には VerUp で変化があった”その前”が思い出せない気持ち・・・ですｗ

# Power Apps Studio 画面
SharePoint Online カスタムリストから自動生成したアプリです。何か気づきませんか？
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/11960058-a3e3-15f3-d6a3-f387d07028a4.png)

# 右ペインにハテナマーク
当方が「あれ？こんなのあったけ？」ってなった箇所です。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/9de27aba-925c-21c3-507d-6893ed06a5d2.png)
あ、はい。「こまけぇよ！」って言わないで😅

## ハテナをクリックすると…
ハテナアイコンをクリックすると吹き出しが表示されます。いま選択しているコントロールの概要と[詳細情報]というリンクです。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/e4ee71d2-ec93-fcc9-b3b0-9d48b97ec1ab.png)

## 吹き出しのリンクをクリックすると…
該当コントロールの Docs が別タブで表示されます。しかも（おそらく）Power Apps 側の言語設定を判別して、その言語になるようです。（当方は日本語環境なので”ja-jp”になっている）
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/e485f5a7-5da6-d46a-eb1c-58c642361c97.png)
参考までに、画面（Screen）の詳細情報で開くURLを下記に。

[Power Apps での画面コントロール
](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/controls/control-screen?WT.mc_id=BA-MVP-5004053)

### ”例”があるコントロールも…
詳細情報だけでなく[例]という選択肢が追加表示されるコントロールもあります。下画像はテキストインプットです。
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/a99e9498-345b-e9bc-e3b3-6b566264cabb.png)
全部調べたワケではないですが、基本的に Docs に利用例だったり、よく利用するであろう関数と組み合わせた例のセクションに飛ぶようです。

## ハテナが無いコントロールもある…
”四角形”などの図形系などはハテナマークが表示されません。きっと、該当の Docs が無いのかな？という個人的感想です。
![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/ccdfbc0c-db46-69fd-8ca2-9d2d0dfbe72f.png)

# 前からあったけ...？
何となく気づかなかっただけなのか？
ある日突然追加されたのか？
チョッときになりますよね。調べてみました。

2019年1月に投稿した [こちらの記事](https://qiita.com/yamad365/items/c0ece19ab5919b934a0e#%E5%8F%82%E5%8A%A0%E8%80%85%E4%B8%80%E8%A6%A7%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E9%85%8D%E7%BD%AE) の手順No.3 が当方が公開している記事で一番初めに右ペインが登場してました。よーくみると、プロパティ等を表示する右ペインのさらに右端にハテナマークさんいますね。

![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/819be3d5-41be-5fb1-b6f7-fa5d142e23e9.png)
少なくとも2019年にはあったんですね、ハテナマークさん。
ぜんぜっん気づいてませんでしたｗｗｗ
ごめんよ、気づいてあげられなくて😂

もしかしたら、過去の当方はそのハテナをクリックして動作確認したのかもしれません。しかし、まったく記憶にありません。そして、細かな機能なので動作確認をしたスクリーンショット等も手元にありませんでした。当時も同じような動作だったのかなぁ（遠い目

# まとめ
- Power Apps Studio の右ペインは選択されているコントロールの種類が表示されている
- ハテナマークが表示されるモノがある
    - ハテナマークをクリックすると概要＋Docs（所謂 Helpページ）へのリンクが表示される
    - 該当コントロールの利用例が追加表示される場合もある
- 四角形のような図形など、ハテナマークが無いコントロールもある

わざわざコントロール名などで検索して利用方法を探す必要がないので、これは結構便利なのでは？と思いました。とくに、初心者・初学者の方はコントロールの機能や属性などピンとこないトコも多々あると思います。有志のBLOG等で情報を得るのも良いのですが、やはり公式情報もあわせて確認いただくと、より良い学びが得られるんじゃないかな、と個人的には考える次第です。

普段から Power Apps 沼に居る住民ですら全てのコントロールとプロパティを把握しているワケでもない（そんな超越せし者も居るのかもしれませんが）でしょうから、こういう「ちょっとした便利機能」って良いですよね。小さな変化で便利な機能に気づいた、というトコで。

それでは、皆さま。素晴らしい Power Platform Life を！
INTER-Mediatorをコンテナで利用するベストプラクティス(編集中)

#はじめに
2021年1月20日で話題にのぼったINTER-Mediatorをコンテナで利用するベストプラクティスをまとめます。INTER-MediatorのSlack - containerでの内容を踏まえて更新しつつ、作成中。私自身dockerは初心者なので、勉強しながらなのでちょっと時間がかかります。勉強に当たって参考にしたサイトやブログはリファレンスにまとめておきます。

一応、2021年1月28日現在の最新バージョンでコンテナを利用したINTER-Mediatorの構築が目的です。INTER-Mediatorフレームワークは、PHP,　Web Server,　Databaseを使ってWebアプリケーションが作成できます。


#方針
Docker公式のイメージを利用していきます。Web Server用のコンテナとして、『PHP-apache』、Database用のコンテナして、『PostgreSQL』,『MariaDB』用意します。また、永続化データ用コンテナ『Data』も用意します。

永続するデータは、一旦『Data』コンテナと紐付けます。『Data』コンテナは、ゲストOSのディレクトリに保存して、永続化します。永続化するデータは次の通りです。

- Web Serverのドキュメントルート（INTER-Mediatorを含む)
- PostgreSQLのデータ
- MariaDBのデータ
- 各コンテナからのログ

INTER-Mediatorの入手は、GithubのINTER-Mediatorからできます。ここでは、『INTER-Mediator 6』をフォークして構築を進めます。フォークしたリポジトリをクローンします。

docker-composeとDockerfileを使って構築します。


#

###システム
- マシン: MacBook Air (Intel)
- マシンOS: macOS 10.15
- 仮想: VertualBox 6.1
- ゲストOS: Ubuntu Server 20.04.1 LTS (x86_64)

###ユーザ環境
- ユーザ: developer
- ユーザディレクトリ: /home/developer
- 作業ディレクトリ: ~/docker


###インストール
- [Github - INTER-Mediator]() 
- [docker.com - Docker](https://docs.docker.com/engine/install/ubuntu/)
- [Github - docker-compose]()
- [Docker Hub - php](https://hub.docker.com/_/php)
- [Docker Hub - MariaDB](https://hub.docker.com/_/mariadb)
- [Docker Hub - PostgreSQL](https://hub.docker.com/_/postgres)


###~/docker以下のディレクトリ構成

```bash:ゲストOS内のディレクトリ構造

~/docker
|
|--/config
|    |
|    |--/mariadb
|    |   |--Dockerfile
|    |
|    |--/postgres
|    |   |--Dockerfile
|    |
|    |--/php
|    |   |--Dockerfile
|    
|--/data
|    |--/php
|    |--/mariadb
|    |--/postgres
|
|--/docker-compose.yml
|
|--/source

```



#インストールとセットアップ

##INTER-Mediator
INTER-MediatorをGitHubからフォークします。のちほど、Apacheのドキュメントルートにクローンします。


##ゲストOS


##Docker

##docker-compose






#リファレンス
##Docker Documnets
- [docker doc(公式)](https://docs.docker.com)
- [Docker ドキュメント日本語化プロジェクト](https://docs.docker.jp)

##Docker Hub
- [Docker Hub 上の公式イメージ](https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/official_images/)
- [Docker Hub - php](https://hub.docker.com/_/php)
- [Docker Hub - MariaDB](https://hub.docker.com/_/mariadb)
- [Docker Hub - PostgreSQL](https://hub.docker.com/_/postgres)
- []()
- []()

##Dockerのお勉強
###データの永続化
- [docker doc(公式) - Manage data in Docker](https://docs.docker.com/storage/)
- [Docker ドキュメント日本語化プロジェクト - コンテナでデータを管理](https://docs.docker.jp/engine/tutorials/dockervolumes.html?highlight=マウント)
CentOS終了に対する大ブーイングでRHELが一部無償になるらしい

<font color="red">2021/03/02追記</font>
オープンソースプロジェクト向けにRHELを無償提供するRed Hat Enterprise Linux (RHEL) for Open Source Infrastructureが発表されました。
[Extending no-cost Red Hat Enterprise Linux to open source organizations](https://www.redhat.com/ja/blog/extending-no-cost-red-hat-enterprise-linux-open-source-organizations?source=bloglisting)

<font color="red">2021/02/10追記</font>
新しいRed Hat Developer ProgramでRHELをインストールした記事を書きました。
[Red Hat Developer Programに登録して最大16台までRHELを使おう](https://qiita.com/yamada-hakase/items/dc39d29fda693238d113)

# CentOS終了その後
2020年12月8日のCentOS終了のアナウンスは衝撃が大きかったようで、筆者が書いた以下の記事が好評だ。

**[CentOSからCentOS Streamへ。CentOS終了の衝撃](https://qiita.com/yamada-hakase/items/1629d511ab4199d253b4)**

その後オルタナティブCentOSとして、Rocky Linuxなど、いくつかのRHEL互換ディストリビューションの発表が続いていた。

すると、2021年1月20日のRED HAT BLOGに以下の記事がポストされた。

**[New Year, new Red Hat Enterprise Linux programs: Easier ways to access RHEL](https://www.redhat.com/ja/blog/new-year-new-red-hat-enterprise-linux-programs-easier-ways-access-rhel)**
![rhelfree01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/994501fb-db06-c46f-0a5c-7fc2b9c0ce4c.png)

2021/01/22追記：ZDNet JapanやPublickeyも取り上げていますね。

* [ZDNet Japan: レッドハット、開発／小規模本番ワークロード向けにノーコスト版RHELを導入へ--Red Hat Developerプログラム](https://japan.zdnet.com/article/35165365/)
* [Publickey: 個人開発者はRed Hat Enterprise Linuxを無料で最大16システムまで利用可能に、本番環境もOK。Red Hatが開発者向けプログラムの拡大を発表](https://www.publickey1.jp/blog/21/red_hat_enterprise_linux16okred_hat.html)

# RHELは一部無償になる？

詳しくは上記ブログを読んでほしいが、重要なところを抜き出すと以下のとおり。

* **開発者向けのRed Hat Developer programでは、これまでも1台のマシンで無償利用できた（開発目的に限る）。**
* **Red Hat Developer programの条文（Individual Developer subscription for RHEL）を拡張し、今後は最大16台のマシンを本番運用目的で利用できるようになる。2021年2月1日以降までには実施予定。**
* **新しいDeveloper programはオンプレミスだけでなく、AWSやGoogle Cloud、Azureなどでも利用できる。**

~~プログラムが正式に開始されたわけではないので、詳細は今後次第だろう。~~<font color="blue">正式発表された条文は、ほぼ事前予告のとおり。</font>とりあえず個人ユーザーや小規模ユーザーは助かるかもしれない。

とはいえ、CentOSを大規模利用しているエンタープライズユーザーは世界でもけっこう多そうなのだけれど…。

なお、Red Hat Developer programのFAQやTerms and Conditionsはこちら。

* [FAQs for no-cost Red Hat Enterprise Linux](https://developers.redhat.com/articles/faqs-no-cost-red-hat-enterprise-linux)
* [Red Hat Developer Program Terms and Conditions](https://developers.redhat.com/terms-and-conditions)
VScodeにインストールするべき拡張機能

テキストエディタであるVScodeには多くの拡張機能があり、
自分が使う言語や記述の仕方によって好きな機能をインストールすることでより便利に使うことができます。

私は``html,css,ruby,rails``を勉強しています。
そんな私が個人的におすすめな初心者向けの拡張機能についてまとめてみました。
もし他にもありましたら、コメントで教えてください:cry:

#インストールのやり方
拡張機能のインストール方法はとても簡単です。左側にある1番下の四つの四角のマークを押し、検索してインストールすることができます。

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

##おすすめ拡張機能７つ
##①Japanese Language Pack for Visual Studio Code
VScodeをインストールしたときに1番最初に入れるべき機能です。入れずにやられている方は本当に尊敬します（笑）
英語表記になっている物を日本語表記にしてくれます。

##②HTML Snippets
HTML、CSSを使うときにとても便利な拡張機能で、入力したい言葉の頭文字を入れると、履歴から自動に頭文字が同じ言葉を候補として一覧で出してくれます。スペルミスを格段に少なくしてくれますね。

##③Ruby
Rubyの構文をチェックし、間違った箇所を指摘してくれます。

##④zenkaku
全角スペースをグレーに色付けし、知らせてくれます。
日本語で文字を打った後、そのままにして進もうとしてしまうので、いつも助けられています（笑）
[![Image from Gyazo](https://i.gyazo.com/d01dffcbd59f67cdb32fc9874399ce9d.gif)](https://gyazo.com/d01dffcbd59f67cdb32fc9874399ce9d)

##⑤Code Spell Checker
コードのスペルをチェックしてくれます。

##⑥Draw.io Integration
ER図作成のツールです。他にもER図のための機能はあるので、自分にあった物を使うのがいいと思いますが、簡単にER図を描くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023082/ab98316e-7b12-22da-c61b-cd232dcc014a.png)

##⑦Auto Rename Tag
対になっているタグの変更を同時に行ってくれます。時間の短縮になりますね。
[![Image from Gyazo](https://i.gyazo.com/2c7e71e80742e9f22327c74706d160f9.gif)](https://gyazo.com/2c7e71e80742e9f22327c74706d160f9)


以上７つの機能の紹介でした。拡張機能を入れるだけでエラーを減らすことができ、コードが書きやすくなりますよね。数多くの機能があるため、私も全ては知らないのですが、少しでもお役に立てたら嬉しいです！
[SwiftUI] SceneDelegate を消して ApplicationDelegate だけにする

# これはなに

iOS 13 環境で ReplayKit & UIScene の相性が悪いため、泣く泣く UISceneDelegate を消して UIApplicationDelegate だけにしたときのメモです。

[ReplayKit & UIScene: Assertion when calling RPSystemBroadcastPickerView · Issue \#438 · twilio/video\-quickstart\-ios](https://github.com/twilio/video-quickstart-ios/issues/438)

> If you must use RPSystemBroadcastPickerView then you should consider not using UIScene, and going back to UIApplicationDelegate.

# やったこと

## SceneDelegate をバッサリ削除

Info.plist から `UIApplicationSceneManifest ` をバッサリ削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/ef6bd5b8-dd00-2382-4b27-9d1e675ceb2c.png)

その後、`SceneDelegate.swift ` も不要になるので削除します。（SceneDelegate でやっていたことがある場合は AppDelegate に移行する必要がある）

## AppDelegate から UIHostingController経由で SwiftUI の View を開く

AppDelegate.swift を次のように書き換えます。


```swift
import UIKit
import SwiftUI

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow(frame: UIScreen.main.bounds)
        window!.rootViewController = UIHostingController(rootView: ContentView)
        window!.makeKeyAndVisible()

        return true
    }
}
```

このとき、`    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
` のような UISceneSession Lifecycle が残っているとうまくアプリが動かないので注意です。

これで一応アプリが起動するようになりますが、動作を保証するものではありません。あくまで自己責任で！
【読書感想】『Railsの学び方、あるいは本の書き方、そして教え方』

こちらを読んだ感想。

https://speakerdeck.com/igaiga/ginza-rails27-igaiga


# 詳細

> Railsの学び方の基本的な流れ

Rails始める人、やってる人は必見。

> わからないことをわかる技術

メタ認知的なこと。自分の視野外の知見は人に教えてもらう or 書籍の必要性。

> 良い名つけが分からない

命名がよくないことが多いので、「名前つけ大全」を読んで広めたい
https://www.amazon.co.jp/WEB-DB-PRESS-Vol-110-PRESS%E7%B7%A8%E9%9B%86%E9%83%A8-ebook/dp/B07QXHLSJZ

> GraphQLをRailsで使う体系的な資料

読みたい。

> 本はDRYに書いてはいけない

繰り返し大事。

> 人間は全て別の処理系

仕事の上でも前向きになれる良い言葉。


# まとめ

いろいろな処理系を知っている人は、優しくて強い。
【Swift】前の画面へ値の受け渡し（TabBarControllerがある場合）

## 概要
[こちらの記事](https://qiita.com/wadaaaan/items/acc8967c836d616e3b0b?fbclid=IwAR33-PeIjKggtc5zZpRlqJa8brq8feMhEO7GPe4qja2w8riyrNQSCQByJRo)を参考にアプリを作っていたところ、TabBarControllerの中に埋め込んだ場合の記事もあると便利かなぁと思ったので書きました。
![画面構成](https://i.gyazo.com/55c5275956988deecf0df1c90a818390.png)


## コード
```.swift
let preTBC = self.presentingViewController as! UITabBarController
let preNC = preTBC.customizableViewControllers?[0] as! UINavigationController //何番目のTabか指定（今回は0番目）
let preVC = preNC.viewControllers[preNC.viewControllers.count - 1] as! PreviousViewController

/*

ここに値を渡すコード

*/
```

「TabBarController」 → 「NavigationController」 → 「一つ前の画面」の順に定義していく感じです。

## 参考
[【Swift】前の画面への値の受け渡し方](https://qiita.com/wadaaaan/items/acc8967c836d616e3b0b?fbclid=IwAR33-PeIjKggtc5zZpRlqJa8brq8feMhEO7GPe4qja2w8riyrNQSCQByJRo)
railsでカスタムヘルパーの使い方

>引用先
>[Railsチュートリアル](https://railstutorial.jp/)

#カスタムヘルパーとは
Railsでは多くの組み込み関数が使えますが、使いたいメソッドがなかった時にオリジナルのメソッドを作成できます。
この新しく作ったメソッドのことをカスタムヘルパーといいます。

#ファイルの場所

```ruby:app/helpers/application_helper.rb
module ApplicationHelper

end
```

ファイルの位置は app/helpers/application_helper.rb
最初はこのようなファイル構造になっています。

#使い方

例えばこのように記述する。

```ruby:app/helpers/application_helper.rb
module ApplicationHelper

  def full_title(page_title = '')
    base_title = "Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end
end
```

application.html.erbファイルの呼び出したい箇所へ記述。
今回はタイトルタグに記述します。

```ruby:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
  </head>
  <body>
    <%= yield %>
  </body>
</html>
```

このように記述すれば、タイトルタグにヘルパーファイルに記述したこのコードが呼び出されます。

```
def full_title(page_title = '')
    base_title = "Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end

#　コード解説 
if文によって、page_titleが.empty?(入れ物が空→true,入れ物がある→false)

→true:base_title(Sample App)を表示
→false:page_title|base_title(Sample App)を表示
```

今回はコードの量が多くないため恩恵を感じにくいですが、コードを別ファイルに分けることでコードが見やすくなりますね。
深層学習。OpenVINOのFPGA対応の変遷

#OpenVINOのFPGA対応の変遷

現在(2020/01/21)、OpenVINOで、FPGAのサポートが消えていることに気づいたので記事にする。
詳細、調査未。

##2021.2

**FPGAがない。**

https://docs.openvinotoolkit.org/2021.2/openvino_docs_IE_DG_inference_engine_intro.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/7ce3acd6-db55-bfd2-2297-39eb3c0dc50c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/970b7760-e002-1fab-12a9-154e72f9fe66.png)

##2020.4
https://docs.openvinotoolkit.org/2020.4/openvino_docs_IE_DG_inference_engine_intro.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/bd97cd1e-8d45-d5db-7bf5-81bc8c4330ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/dcd49563-c79d-047d-08e9-1033f45e6a4e.png)

FPGA部分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/659ea3cb-88de-b945-5726-1c11345cdab5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/93e00b6a-fa3a-8181-b649-6f853372a1d0.png)


##2019.3
https://docs.openvinotoolkit.org/2019_R3/_docs_IE_DG_inference_engine_intro.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/e03d9611-2404-518f-3dca-584ec51ac5f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/51eb09d3-53ff-a17e-6799-81c0821e0e58.png)

FPGA部分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/265e28ce-c995-b3a9-ecec-e6e58937d7d2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473789/c744bcf4-8568-525e-6925-330f8d469b14.png)

#何がおこっているのか？

推論処理でFPGAは、中心的な役割を果たす気もするが。。。
あくまで、CPU中心なのか？

#あとがき
特になし。
情報があれば、追記する。
[Docker]Alpineでの容量可視化ツール「duf」の導入

## はじめに
- システム内での容量確認のため、[dfやdu](https://qiita.com/t_o_d/items/a15a5ca851039575465d)コマンドを利用する事は多い。
- そこで[duf](https://github.com/muesli/duf)という容量可視化ツールをmacで利用していた。
- 便利であったため、同様にDocker内のalpineへも展開する必要が発生。
- 今回は、Docker内のAlpineLinuxへの**duf**の導入を記録する。

## 環境
- alpine:edge

## 手順

### 必要ファイルの取得
- 以下のコマンドで、任意の場所に必要なバイナリを取得する。
    - **apkのパッケージとして用意されていないため。**
    - `wget`コマンドがなければ、`curl`コマンドで代替。

```bash
# 取得場所の作成・移動
mkdir ~/work
cd ~/work
# バイナリの取得
wget https://github.com/muesli/duf/releases/download/v0.5.0/duf_0.5.0_linux_amd64.apk
```

- **※ `wget: bad address 'github.com'`のようなエラーが出た場合のみ、`/etc/resolve.conf`を以下のようにを変更**

```bash:/etc/resolve.conf
# This file is included on the metadata iso
nameserver 8.8.8.8  # 変更
```

### 導入
- 以下のコマンドで、バイナリから`duf`を取得。

```bash
# dufの取得
apk add --allow-untrusted duf_0.5.0_linux_amd64.apk 
```

- **※error出力が出るが、利用可能状態ではある。**

### 確認
- 以下の画面のコマンドのように利用可能か確認。

![image](https://user-images.githubusercontent.com/44114228/105147795-01713700-5b45-11eb-8b31-dec0a03d4590.png)

- **※以下、各便利オプションの例。[詳細はこちらを参考](https://github.com/muesli/duf)**

![image](https://user-images.githubusercontent.com/44114228/105148364-a2f88880-5b45-11eb-860f-98c16743a0c6.png)



![image](https://user-images.githubusercontent.com/44114228/105148682-02569880-5b46-11eb-9f3a-d396d2981bf8.png)



![image](https://user-images.githubusercontent.com/44114228/105148923-48136100-5b46-11eb-9c85-93657ee67f9e.png)

## 参考
- [Github](https://github.com/muesli/duf)
- https://qiita.com/reoring/items/116e0c19705f602d8f56
- https://www.cyberciti.biz/open-source/command-line-hacks/duf-disk-usage-free-utility-for-linux-bsd-macos-windows/#comments
discordrbで音声が使用できない場合の対処

# 環境
- OS: Windows10(**64bit**)
- Ruby: ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [**i386-mingw32**]

# 起動時にこんなエラーが出る！
```
libsodium not available! You can continue to use discordrb as normal but voice support won't work.
Read https://github.com/shardlab/discordrb/wiki/Installing-libsodium for more details.
```

# 対処
URLに記載の方法だと、何度やっても解消しない(おそらくx64-mingw32版Ruby用の説明のため)。
`C:\Windows\System32`ではなく、`C:\Windows\SysWOW64`に**32bit用**の`libsodium.dll`を`sodium.dll`にリネームして入れてやる。

libopusも入っていなければついでに`libopus.dll`を`opus.dll`にリネームして入れると良いと思います。

# あとがき
こんな情報、私の検索能力ではどう調べても出てこなくて数日悩んで試行錯誤の上やっと気づきました（笑）
つよつよ開発者の方々はこんなこと当たり前に分かるのかなぁ、ともっと精進しなければと思わされました..

# 参考URL
libsodium: https://download.libsodium.org/libsodium/releases/
libopus: https://dsharpplus.github.io/natives/index.html
(覚書) クリーンアーキテクチャ 第1部 イントロダクション

構成は各章毎に分けて、要約・独自の解釈・具体的なコード等を挟み、なるべく腑に落ちやすい形を目指す。
独自の解釈を挟む際は冒頭に "ダブルコーテーションをつける。

# 第1部 イントロダクション

## 第1章 設計とアーキテクチャ

> 設計とアーキテクチャの違いは何か？　何も違いはない。

"アーキテクチャ又は設計とは、ソースコードのような具体的な下位レベルの話から、UMLやドメインモデルなどの抽象的な上位レベルの話までの連続的な領域を指す。どこか一部分だけを切り離して定義することは出来ない。

### 目的は？

> ソフトウェアアーキテクチャの目的は、求められるシステムを構築・保守するために必要な人材を最小限に抑えることである。

"私達がアーキテクチャを学ぶ目的は事業的な理由に他ならない。

### ケーススタディ

"
実際の企業のデータから、アーキテクチャの重要性を確認する。

一般的には、メジャーバージョンがインクリメントされる度に、必要とされるエンジニアの数は増える。

![Market-leading Software Product Lifecycle](http://3.bp.blogspot.com/-1UGY_Ne9pSQ/ThLzXaV9KAI/AAAAAAAAAGA/i89oAN4wuWU/s1600/0009.jpg)


しかし、インクリメントされるにあたって、前バージョンと比較するとソースコードの増加量は頭打ちになっていく。

![Market-leading Software Product Lifecycle](http://3.bp.blogspot.com/-iMdTG_561kI/ThLz6If1QoI/AAAAAAAAAGE/yudAIYveJz0/s1600/0010.jpg)

つまり人材は増加していくが、機能追加などの生産性は鈍重なものとなり、改修コストが跳ね上がるようになる。

当然ながら私達はコードを書く以上に、今後増えるであろう保守運用コストをいかに安く抑えられるかが期待される。

#### "どうすれば良いのか？

私達は常に開発に追われている。そのため後でコードをクリーンにするなんてことはしない。

早くコードを書くコツは、クリーンなコードを書くことだ。

TDD(テスト駆動開発)を使った実験では、TDDを用いた方が作業が早く終わることが分かった。
![Roman Numerals Kata](http://3.bp.blogspot.com/-T7qO90n1FVM/ThL2iqAxLNI/AAAAAAAAAGY/WDnTtFemDmA/s1600/0018.jpg)

自信過剰になってはいけない。

> 速く進む唯一の方法は、うまく進むことである。
自信過剰による再設計は、元のプロジェクトと同じように崩壊する。


### まとめ

- 開発組織が自らの自信過剰を認識すること
- ソフトウェアアーキテクチャの品質と真剣に向き合うことが最善の選択肢
- 真剣に向き合うには優れたアーキテクチャを知る必要がある

※ 記事中での画像は[Agile Wave](http://agileage.blogspot.com/2011/07/slow-and-dirty-rant-by-jason-gorman-at.html) からお借りしました。

#### 余談 バグとコストのお話

以下は[Agile Wave](http://agileage.blogspot.com/2011/07/slow-and-dirty-rant-by-jason-gorman-at.html)からの抜粋になります。

- コードの品質と、サービスの配信コストの関係性
  - ソフトウェアのバグ取りは95%前後が最適値であり、100%を目指すにつれて、コストは指数関数的に増加する。
![Percentage of Bugs removed before Release](http://3.bp.blogspot.com/-XYktXu1cs94/ThLvnJ8ckAI/AAAAAAAAAFs/GOCSUNGC_pY/s1600/0004.jpg)

- 開発のライフサイクル（フェーズ）とバグ取りに要するコストの関係性。
  - 要件定義の段階ほど修正は容易く、リリース後は困難を極める事がとても良く分かる図。
  - 実装においても、ペアプログラミングやTDDを用いることでバグ取りのコストを抑える事に役立つのが見て取れる。
![Cost of Bug Fixed through Development Lifecycle and Feedback loop - 1](http://2.bp.blogspot.com/-CO7LOJ-T3_M/ThLwZNOrzUI/AAAAAAAAAFw/F_MjZ3LPREo/s1600/0005.jpg)

![Cost of Bug Fixed through Development Lifecycle and Feedback loop - 2](http://1.bp.blogspot.com/-ouAo40_GF7w/ThLwxJaYaAI/AAAAAAAAAF0/l7pITcDx8ac/s1600/0006.jpg)

## 第2章 2つの価値のお話

### 大きな価値

> ソフトウェアシステムはステークホルダーに2つの価値を提供する。「振る舞い」と「構造」だ。

「振る舞い」とはマシンがどのように動くのかをを指す。仕様書の通りに動くようにプログラミングを行う。

「構造」とはアーキテクチャの事を指す。変更が容易であること（つまりソフトなプロダクト）は、その構造自体に価値がある。

どちらが価値が大きいか？ 結論は「構造」だ。

なぜなら第1章のコストで取り上げたように、変更のコストがメリットを上回ると、変更が事実上できない事態に陥るからだ。

### アイゼンハワーのマトリックス

「重要度と緊急度のマトリックス」とは問題を以下の4つのいずれかに分類する。

1. 緊急かつ重要
2. 緊急ではないが重要
3. 緊急だが重要ではない
4. 緊急でも重要でもない

「構造」は 1 と 2。 
「振る舞い」は 1 と 3 に位置する。

よくやる間違いは、3 を 1 に昇格させてしまうこと。
つまり重要ではない事を優先し、重要な「構造」に関することを無視してしまうのだ。

開発者が 1 と 3 を明確に認識し、「振る舞い」の緊急性よりも「構造」の重要性を強く主張する責任がある。

> ソフトウェア開発者もステークホルダーであることは忘れてはいけない。
ゲッターとセッターをの理解をごっちゃにしないために【なんでもかんでもアクセサを使わない！】

ゲッターとセッターの解説記事は何個かあるので、そこはお任せするとして、
あと、アクセサという便利なコードもありますが、使い分けについて書かれてる物がすくなかったので、初学者編の基礎として振り返ろうと思って書きました。

まずはよくある車を設計する所です。

## アクセサを使える場合

```ruby:車の設計
class Car
  attr_accessor :model, :color, :option
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

#=> すべて変更可能

```
これだったら、`attr_accessor` でまとめてしまっても良いのですが、
例えば **「もう車作ってるのに、車種と色変えられたら困るよ！！！(オプションだけだったらいいけど・・・）」** という場合の書き方は、

## ゲッターとセッターを使う場合
```ruby:車の設計
class Car
  attr_reader :model, :color, :option
  attr_writer :option 
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

#=>オプションだけ変更可能
```
っていう書き方が普通になりますけど、
アクセサを使って更にスマートに書くのであれば、

## アクセサとゲッターを使うのがスマート

```ruby:車の設計
class Car
  attr_accessor :option
  attr_reader :model, :color 
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

#=>オプションだけ変更可能
```
になります。

ちなみに、
## 車の車種を変更しようとすると・・・

```ruby:車の設計
class Car
  attr_accessor :option
  attr_reader :model, :color 
  def initialize(model, color, option)
    @model = model
    @color = color
    @option = option
  end
end

car = Car.new("Benz", "white", "ホイール")

car.model = "BMW"
#=>NoMethodError (undefined method `model=' for #<Car:0x00007fc009900440>)
```
という風に怒られます！！**「車種変えるんじゃねぇよ！もう作ってるんだよ！」**という事ですね。色を変えようとしても同じようなエラーになります。

## まとめ
という事で、Ruby初学者が勉強するゲッター、セッター、アクセサの使い分けについて振り返っていきました。
初学者の方の参考になれば幸いです。ありがとうございました！！
Selenium DOM要素をホバー&クリックする方法

## Seleniumを使用してDOM要素をホバーしてからクリックする方法について明記します。

SeleniumはWebサイトやWebページの閲覧を自動化することができます。
今回は、抽出したDOM要素をホバーしてからクリックする方法について明記します。
要素をホバーすることでプログラム上、`マウスカーソルがDOM要素に重なっている状態`を擬似的に表現します。

```qiita:Java
import org.openqa.selenium.interactions.Actions;

public static void autoHoverClick(WebDriver driver, WebElement element){
	Actions act = new Actions(driver);
	act.moveToElement(element).perform(); // 指定したDOM要素をホバーする(hover)
	element.click(); // DOM要素をクリック
}

```
LEGO WeDo2.0ソフトウェアのバージョンの違い

WeDo2.0ソフトウェアのバージョンの違いによって、ロボットの動きが異なることが分かったので、整理しておきます。

WeDo2.0ソフトウェアには、それぞれのデバイスに対して次のようなものがあります。						
	
| デバイス| ソフトウェアの種類 | 入手先 |
|:-:|:-:|:-:|
|Window10   |アプリ版   |Microsoft Storeからインストール   |
|Window10   |ダウンロード版   |LEGO社HPからダウンロードしてインストール   |
|MacOSX   |ダウンロード版   |LEGO社HPからダウンロードしてインストール   |
|iPad   |アプリ版   |App Storeからインストール   |
|Chromebook   |アプリ版   |Google Playストアからインストール   |
|Android   |アプリ版   |Google Playストアからインストール   |

WeDo2.0ソフトウェアは、バージョンによって、ロボットの動きが異なるので、注意が必要です。

次のような旧バージョンと、新バージョンでは、ロボットの動きが異なります。
 　　　　　　　　　　　　　　　　　　　　　　※--は、未調査

| デバイス| ソフトウェアの種類 | 旧バージョン | 新バージョン |
|:-:|:-:|:-:|:-:|
|Window10   |アプリ版   |--   |ver1.9.385以降 |
|Window10   |ダウンロード版   |ver1.9.3   |ver1.9.385以降|
|MacOSX   |ダウンロード版   |ver1.9.12   |ver1.9.348以降|
|iPad   |アプリ版   |ver1.9.42   |無し|
|Chromebook   |アプリ版   |ver1.9.21|ver1.9.303以降|
|Android   |アプリ版   |--   |ver1.9.385以降|
　　　　　　　　　　　　　　　　　　　　　※（2021年1月21日現在）

#◯どのような違いがあるのか？
##１．モータの動きについて
　　Windows版(ver1.9.3）、MacOSX版（ver1.9.12)、iPad版(ver1.9.4.2)、Chromebook版（ver1.9.21)では、次のようなプログラムは正常に動作しますが、
それ以外のバージョンでは正常に動作しません。

![1モータの挙動_旧バージョンだけ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153020/e181eedb-7c45-aa4f-e756-1cddc05c7cc8.jpeg)
　※1秒毎に順回転と逆回転を行うプログラムですが、
　　一瞬だけ、順回転をして、2秒間逆回転をしてしまいます。

上記【Windows版(ver1.9.3）、MacOSX版（ver1.9.12)、iPad版(ver1.9.42)、Chromebook版（ver1.9.21)】以外をお使いの方は、
プログラム作成時に、次の様なプログラミングブロックの組み合わせに変更する必要があります。
　※モーターパワーブロックを使うときは、必ず、パワーブロックの後に、モータ回転ブロックを使ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153020/dca52fd3-1957-af5b-26b9-d35d73dc351e.png)

　　動きの違いについての動画は[こちら](https://youtu.be/tk25YW2Tfyk "https://youtu.be/tk25YW2Tfyk")



##２．加算ブロックの動きについて
　　Windows版(ver1.9.3）、MacOSX版（ver1.9.12)、iPad版(ver1.9.42)、Chromebook版（ver1.9.21)では、次のようなプログラムは正常に動作しますが、
それ以外のバージョンでは正常に動作しません。

![2加算.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153020/5dd23ca0-3936-9827-e711-675557056e79.jpeg)
　※スタートブロックを押すと、数字が足されていくプログラムですが、
　　スタートブロックを押すと、値がクリアされて、常に1になってしまいます。

Windows、MacOSXをお使いの方は、[こちら](http://afrel.co.jp/support/wedo2.0 "http://afrel.co.jp/support/wedo2.0")より、Windows版（ver1.9.3）、Mac版（ver1.9.12）をダウンロードしてお使いください。

　　動きの違いについての動画は[こちら](https://youtu.be/zc_IoUywPU8 "https://youtu.be/zc_IoUywPU8")
【Elixir/Phoenixプロダクトへリプレイス②】フロント部分：JavaScriptをTypeScriptにリプレイスする例

# 概要
こちらの　[「Elixir/PhoenixでTypeScriptを使えるようにする。」](https://qiita.com/akkiii/items/435e3b399e425176bff2)を実装したPhoenixプロダクトのJavaScript部分をTypeScriptにリプレイスする手順を残しておく。





# 手順
リプレイス前のjsファイルを`filename.js`とする。

## 1. filename.jsを`assets/js`配下に配置
JSファイルをコピーしてペースト

## 2. ファイル名filename.jsを`filename.ts`に変更


## 3. html部分を書き換える

`filename.html.eex`

```diff
-<a href="javascript:void(0);" onclick="CallScript();">JS呼び出す</a><
+<a href="javascript:void(0);" id="call_script">TS呼び出す</a>
```

## 4.`filename.ts`をTypeScriptに書き換える

`filename.ts`

```diff
+class Filename {
+    constructor() {
+        let call_script = document.getElementById("call_script");
+        call_script!.addEventListener("click", (e: Event) => this.CallScript());
+    }
+
-function CallScript() {
-  console.log("OK");
-};
+    CallScript() {
+        console.log("OK");
+    }
+}
+new SayonalaJa();
```


# 5.`webpack.config.js`に記述

```diff
    entry: {
      'app': './js/app.js',
+     'filename': './js/filename.ts',
    },
```

# 6.`layout`部分でsrcを読み込む実装を追記

例えば、`app.html.eex`で読み込む。

```diff
    <script src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>
+   <script src="<%= Routes.static_path(@conn, "/js/filename_ja.js") %>"></script>
  </body>
```
PowerShell パイプラインと配列部分式演算子

# はじめに

.NET は10年以上前にかじった程度なので構文に自信がない上、PowerShellはJavaと比べて個人的に理解しづらいなぁ・・・と悩む日々を送りながらも、なんだかんだ最近PowerShellにはまってます。

特にPowerShellのパイプライン処理、簡潔でいいですねぇ～。
使っていくうちに、JavaのStream APIの方が冗長なんじゃねぇか？と錯覚するような気分に陥っていきます。

ただそのパイプライン処理にかける配列の要素数と配列部分式演算子`@()`の関係で苦しんだことがあるので、これから述べていきます。

# 要素数が2以上のとき

要素数が2以上のときは、次のコードのように配列部分式演算子なんか気にせずに記述しても期待どおりの出力が得られます。

```PowerShell:
$array = "hoge", "huga"
$array1 = $array | % { $_ }
$array3 = if ($array) { $array | % { $_ } }
echo ($array1.Length, $array1[0] -join ",") # 出力：2,hoge
echo ($array3.Length, $array3[0] -join ",") # 出力：2,hoge
```

# 要素数が1のとき

問題はこのケースです。前述したノリでそのまま処理しようとすると・・・、

```PowerShell:失敗例
[array]$array = "hoge"
$array1 = $array | % { $_ }
$array3 = if ($array) { $array | % { $_ } }
echo ($array1.Length, $array1[0] -join ",") # 出力：4,h
echo ($array3.Length, $array3[0] -join ",") # 出力：4,h
```

こうなります。出力が`1,hoge`とはなりません。
これは、**パイプライン処理全体**を配列部分式演算子で囲めばうまくいきます。ただし、if文やif-else文などの制御構文のブロック内にパイプライン処理が存在する場合は、**その制御構文全体**を囲まないとうまくいきません[^1]。

```PowerShell:成功例
[array]$array = "hoge"
$array2 = @($array | % { $_ })
$array4 = @(if ($array) { $array | % { $_ } })
echo ($array2.Length, $array2[0] -join ",") # 出力：1,hoge
echo ($array4.Length, $array4[0] -join ",") # 出力：1,hoge
```

# なぜこうなるの？

出力が`4,h`と出てくるものだから、てっきり`$array`配列の要素が一文字ずつ分解されて、長さ4の新たな配列が生成されたのかと思っていました。

ただ、`echo $array1.GetType()`を実行してみると・・・

```
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
```

・・・これはつまり、文字列ですけぇ？
パイプラインは要素1の奴が来ると、配列を文字列にしてしまうのか・・・。
更に、**文字列に添字**というちょっとよくわからない概念をいきなり突きつけられたので、試しに適当な文字列で試してみたら、

```PowerShell:
echo "hoge"[1] # 出力：o
```

何だこれは。
まるでJavaの`String#charAt`メソッドみたい。

添字って、配列の要素のインデックスのことじゃないのか？
それとも、これはそもそも添字とは違う概念なのか・・・？
はたまた、PowerShellではこれも添字とするのか・・・？
いまいち、整理がつきません。

# 追記

@ktz_alias さんより、自動ラップ・アンラップに関する情報をご提供いただきました。ありがとうございます！

パイプラインの出力結果を代入する変数に対し明示的に型指定を行うことでも、String型へのアンラップを防げるとのことでした。

```PowerShell:
[array]$array = "hoge"
[array]$array1 = $array | % { $_ }
[array]$array3 = if ($array) { $array | % { $_ } }
echo ($array1.Length, $array1[0] -join ",") # 出力：1,hoge
echo ($array3.Length, $array3[0] -join ",") # 出力：1,hoge
```

更に、パイプラインに流し込むと、暗黙的に配列にラップされるようです。パイプラインは如何なるときも必ず配列を処理するということなのでしょうかね。

```PowerShell:
$array = "hoge"
echo $array | % { $array.GetType() }
```

```
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
```

[^1]: このとき、制御構文のブロック内にあるパイプライン処理全体が配列部分式演算子で囲まれているかどうかによって、出力結果が変わることはないようです。
Node.jsのmodule.exportsの仕組みを理解する

# はじめに

こちらは、[エンジニアの新たな学びキャンペーン](https://qiita.com/official-events/716dbcb617afc83e9555)に向けた記事となります。

[Node.js + Express で作る Webアプリケーション 実践講座](https://www.udemy.com/course/web-application-with-nodejs-express/)を参考にしながら、
`module.exports`について理解を深めたことを記事にします。

# 実行環境

- Node.js v12.16.3
- Express 4.16.1
- 10.4.11-MariaDB

# 本記事の概要

私は今現在、Webアプリケーションの開発をしていますが、ある問題を抱えています。
その問題とは、1つのファイル内のソースコードが膨らみすぎて可読性が落ちているというものです。
これはデータベースへの接続、ミドルウェアの呼び出し、レスポンスの処理内容など、あらゆる情報を`app.js`内に書き込んでいることに由来します。

そこで、`app.js`内のソースコードを削減することを目的に、
データベース接続を行う関数を別ファイル`dbConnect.js`に記述し、
`module.exports`を使ってそれを`app.js`から呼び出すようにリファクタリングしました。

本記事では、はじめに`module.exports`について例題を用いて解説し、
その後で応用として、データベース接続用の関数を`module.exports`を使って呼び出します。

# 対象のUdemy講座で学んだこと

対象の講座で学んだことのうち、特に本記事へと反映する内容は以下となります。

- `module.export`の使い方
- `require`の使い方

# module.exportsとは

JavaScript(Node.js)において、
あるファイルに存在する変数や関数を、別のファイルで実行する機能です。

似たようなものに`exports`がありますが、本記事では触れません。

# (例) sub.js内の関数をmain.jsで実行する

`sub.js`で宣言した変数を`main.js`で実行します。

(\*`var`や`let`ではなく`const`で宣言しているので、厳密には変数ではなく定数です。)

```main.js
const foo = require("./sub.js");// sub.jsからmodule.exportsで指定した変数を読み込み、変数fooに代入する

foo("bee");

// bee
```

```sub.js
const hoge = function(bar){
    console.log(bar);
}

module.exports = hoge;  // main.jsからrequireされたら、hogeという変数を渡す
```


# (実践) データベース接続用の関数を、別ファイルに配置する

`app.js`にすべてのソースコードを書き込んでいた状態から、
`app.js`と`dbConnect.js`の2つにソースコードを分割します。


## リファクタリング前のソースコード

```app.js
const express = require("express");
const app = express();
const mysql = require("mysql");
const dbcn = mysql.createConnection({
    host:"localhost",
    user:"root",
    password:"1234",
    database:"idea"
})
app.set("view engine", "ejs");

app.get("/", (req, res)=>{
    const sql = "select * from ideatext";
    dbcn.query(sql, function (err, result, field){
        if(err) throw err;
        console.log(result);
        res.render("index", {idea : result});
    })
})

app.listen(3000);
```

## リファクタリング後のソースコード

```app.js
const express = require("express");
const app = express();
const mysql = require("mysql");
const dbcn = require("./dbConnect.js")
const connection = dbcn.dbcn;

app.set("view engine", "ejs");

app.get("/", (req, res)=>{
    const sql = "select * from ideatext";
    dbcn.query(sql, function (err, result, field){
        if(err) throw err;
        console.log(result);
        res.render("index", {idea : result});
    })
})

app.listen(3000);
```

```dbConnect.js
const mysql = require("mysql");

const dbcn = mysql.createConnection({
    host:"localhost",
    user:"root",
    password:"1234",
    database:"idea"
})

module.exports= dbcn;

```

# 参考
[Node.js + Express で作る Webアプリケーション 実践講座](https://www.udemy.com/course/web-application-with-nodejs-express/)
LaravelアプリをAWSにデプロイする

#### LaravelアプリをAWSにデプロイする手順をメモ書き程度に残す


####事前準備
laravelのアプリを作成して、githubにpushする
https://github.com/RyotaIhara/aws_app

####手順
|番号|リンク|
|:---|:---|
|1|[EC2でインスタンスを立ち上げ、アプリケーション設置を行う。](https://qiita.com/RyotaIhara/items/440eb4ca7ffb949d43ab)|
|2|[Webサーバー・データベースの設定を行う](https://qiita.com/RyotaIhara/items/b0cfdc7b6098b2ff06c9)|
|3|[アプリケーションを動作させる](https://qiita.com/RyotaIhara/items/bc72fd1656d2400adef4)|
|4|[SSL設定をする](https://qiita.com/RyotaIhara/items/92772264f46f6ae37ff4)|
Ubuntuでタイムゾーンを変える方法

## 現在のタイムゾーン確認

```
date
```

## タイムゾーン変更

```
sudo dpkg-reconfigure tzdata
```

そしてAsia/Tokyoを選択

![スクリーンショット 0003-01-21 1.12.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/3c1d1e41-5ed4-a877-bcdd-fb689e80a644.png)


最後はターミナルで`date`を実行して、JSTになったら良いです。

```
Thu Jan 21 01:12:17 JST 2021
```
PythonでS3バケット内の一覧を取得し、特定のKeyで検索　Key名と最終更新日、カウント数をファイルに出力

所用で必要になったので

```
# -*- coding: utf-8 -*-
import boto3

PUBLIC_S3_BUCKET_NAME_TEST = 'バケット名'

def access_count():
    count = 0
    with open('file.txt', 'w') as f:
        # バケットの一覧取得
        S3 = boto3.resource('s3')
        S3BUCKET = S3.Bucket(PUBLIC_S3_BUCKET_NAME_TEST)

        for obj in S3BUCKET.objects.all():
            if '検索名' in obj.key:
                count += 1
                print(count, obj.key, obj.last_modified, file=f)

        print('total=' + str(count), file=f)
```
「システム コールに渡されるデータ領域が小さすぎます」について

#はじめに
`OpenCL`を用いた演習をしていて，タイトルにある通り, エラーに悩まされていましたが，不意に解決しました．
使用教材は[**C#によるOpenCL並列プログラミング**](http://www.cutt.co.jp/book/978-4-87783-297-1.html)という本です．
#環境
```
Visual Studio 2019
```

#概要
入力された画像に対して, カーネルプログラムで書いた`ラプラシアンフィルタ`を適用するプログラムです．
以下のようなエラー文が出力されていました．

```bash:console
System.Runtime.InteropServices.COMException (0x8007007A): システム コールに渡されるデータ領域が小さすぎます。 (HRESULT からの例外: 0x8007007A)
```

本の通りにタイピングしたつもりだったのですが...

色々調べてみてもBufferの確保の話だとか，UTF-8関連の話だとか様々でした.

他にもコンソールアプリケーションとあまり関係なさそうなものまでヒットしてわけわかめでした.

#コード
カーネルプログラムは以下のようになっていました.

```c:lap8.cl
__kernel void
clCode(__global const unsigned char in[],
		__global unsigned char out[],
		__const int width)
{
	int yx[3][3];        // 二次元配列

	size_t x=get_global_id(0);
	size_t y=get_global_id(1);

	int stride=4*width;

	for(int dY=0; dY<3; dY++)
		for(int dX=0; dX<3; dX++)
			yx[dY][dX]=(y+dY)*stride+(x+dX)*4;

	for(int rgb=0; rgb<3;rgb++)
	{
		int data=(int)(
			-in[yx[0][0]+rgb] -in[yx[0][1]+rgb] -in[yx[0][2]+rgb]
			-in[yx[1][0]+rgb] +in[yx[1][1]+rgb]*8 -in[yx[1][2]+rgb]
			-in[yx[2][0]+rgb] -in[yx[2][1]+rgb] -in[yx[2][2]+rgb]
		);

		out[yx[1][1]+rgb]=convert_uchar_sat(data);
	}
}
```

他のカーネルプログラムは問題なく実行できていたため，おそらくカーネルが悪いのだろうという結論になり5時間くらい長考していました...()

#結論
5時間調べ物をしていてふとした瞬間に
「UTF-8? bufferのメモリ? コメントアウトいる?」
みたいな思考になり，`// 二次元配列`を消してみました．

するとあら不思議．頑なに動かなかったプログラムが動くではないですか．

ちなみに英語でコメントした場合問題なく動いたので，どうやら'UTF-8'の日本語入力でコメントを打つとうまくいかないみたいです．

カーネルプログラムは以下のようになりました.

```c:lap8.cl
__kernel void
clCode(__global const unsigned char in[],
		__global unsigned char out[],
		__const int width)
{
	int yx[3][3];

	size_t x=get_global_id(0);
	size_t y=get_global_id(1);

	int stride=4*width;

	for(int dY=0; dY<3; dY++)
		for(int dX=0; dX<3; dX++)
			yx[dY][dX]=(y+dY)*stride+(x+dX)*4;

	for(int rgb=0; rgb<3;rgb++)
	{
		int data=(int)(
			-in[yx[0][0]+rgb] -in[yx[0][1]+rgb] -in[yx[0][2]+rgb]
			-in[yx[1][0]+rgb] +in[yx[1][1]+rgb]*8 -in[yx[1][2]+rgb]
			-in[yx[2][0]+rgb] -in[yx[2][1]+rgb] -in[yx[2][2]+rgb]
		);

		out[yx[1][1]+rgb]=convert_uchar_sat(data);
	}
}
```

コメントアウトが消えただけですね.

日本語の影響で使用するメモリサイズに対して確保したメモリの大きさが足りなくなったような感じなのですかね？

検証は重ねていませんが，カーネルプログラムでは日本語入力に気をつけようって話でした.

私が忘れないうちにここにメモしておきます.[:file:](https://qiita.com/RoaaaA/items/06e2619050e4c353cbdd)

それでは:wave:
【unity】OculusQuest用アプリをスマホ向けにビルドする

#サマリ
UnityのOculus Quest用アプリをスマホ向けにビルドした際のメモです。

##目次
1. XR Settingsの変更
1. API Levelの変更

#1.XR Settingsの変更

Player Settingsを開きInspectorでXR Settingsを開く。
Virtual Reality SDKsでOculusが組み込まれているので-ボタンで削除し、+ボタンでCardboardを追加する。

#2.API Levelの変更

ビルドしたapkファイルをAndroidスマホにインストールしようとすると[INSTALL_FAILED_OLDER_SDK]で失敗する。

インストールしようとしたスマホはAndroid6.0だったのでPlayer SettingsのOther SettingsのMinimum API LevelをAndroid7.1からAndroid6.0に変更。

ビルドし直してAndroidスマホにインストールし、二眼VRアプリとして無事動作しました。

#　
チームハイエナ <img width="120" alt="hyaeninae_tomei.png"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933978/99b448d3-7ff0-58f3-302b-8528cf339b8d.png">
vscodeのGitHub Themeのダークモードの色をもとに戻したいときの対処法


1月20日にvscodeの拡張機能の `GitHub Theme`の2.0.0へのアップデートがあり、ダークモードの色が以前のものと変わりました。

アップデート前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386018/4ce26ce3-efbb-e13d-84a1-4a8d6ab5acd0.png)

アップデート後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386018/1a250b7b-1a60-71e2-2b25-00d47b24f3ac.png)

僕としては以前のGitHubThemeのダークモードの色が気に入っていたので、以前の色に戻す方法を調べたので共有します。

## GitHubThemeのダークモードの色をもとに戻す方法
**1.以下のURLの `github-vscode-theme-dark-classic-1.1.5.vsix` をクリック**
https://github.com/primer/github-vscode-theme-dark-classic#user-content-install

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386018/0fe01428-104b-2f2d-f926-cec5a56f1616.png)

**2.vscodeの拡張機能の右上の...から `VSIXからのインストール`をクリック**
**3.先程ダウンロードしたファイルを選択**
**4.CODE > 基本設定 > 配色テーマ > `GitHub Dark Classic` を選択**

以上で以前のテーマの色に戻せます。
[Javascript] 配列の主な操作をまとめてみた

##はじめに
Javascriptの配列の操作方法について調べてみたので備忘録として残す

##配列を操作するメソッド

###※配列を作成
下記の配列をもとに進める

```
let test = ['a', 'b']

console.log(test.length)
// 2
```

###位置を指定して配列にアクセスする
```
test[0]
// a

test[fruits.length - 1]
// b
```

###配列に値を追加
```
test.push('c')
// ['a', 'b', 'c']
```

###配列に末尾を削除
```
test.pop()
// ['a', 'b']
```

###配列に銭湯に値を追加
```
test.unshift('z')
// ['z', 'a', 'b']
```

###要素の添字を取得
```
test.indexOf('a')
// 1
```

###要素の添字を取得
```
test.indexOf('a')
// 1
```

###配列をコピー
```
let testCopy = test.slice()
// ['z', 'a', 'b']
```

###配列の長さを取得
```
test.length
// 3
```

###配列を逆に入れ替え
```
test.reverse()
// ['b', 'a', 'z']
```


##参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array
Cloud Runでカスタムドメインの設定方法（Route53編）

Cloud Runでカスタムドメインの設定方法（Route53編）
ドメインはさくらインターネットで取得した

**Cloud Run コンソールからカスタムドメインを管理をクリック**
![custom_domain1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/04aec12e-f325-aea2-407e-cad96ef5b8b7.png)

今回はベースドメインをtoyscreation.jp サブドメインをweekend-hackathonにする
toyscreation.jpと入力して続行

![screencapture-console-cloud-google-run-domains-2021-01-20-23_30_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/e1f9aabb-03e6-2212-770c-d58e52b6423c.png)

ドメイン所有の確認、TXTレコードをコピー
![custom_domain2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/da09f8e0-429f-7b71-485b-ded3b277e924.png)

AWS Route53 コンソールに移動してTXTレコード作成
![custom_domain3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/6f207bf8-7440-d31a-97df-63dd1b4e4f89.png)

設定後、確認を押すと認証完了になる
![screencapture-google-webmasters-verification-verification-success-2021-01-20-23_32_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/8e1cd4c2-2473-14b6-c95e-2d090a9fd8f3.png)

サブドメインにweekend-hackathonを入力し続行
![custom_domain4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/63e78e68-9e35-ff6b-7dcd-32806aa3f084.png)

DNSレコードが表示されるのでRoute53 で設定

![custom_domain5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/2eb05cdd-290a-8c8e-61ff-0735872b03d4.png)

Route53でA、AAA DNSレコードを設定

![custom_domain3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/6f207bf8-7440-d31a-97df-63dd1b4e4f89.png)

20~30分待つと完了しドメインの紐付けが完了
![screencapture-console-cloud-google-run-domains-2021-01-21-00_31_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/09e9c2b7-c0a0-2ea8-f07d-d5b149fffef4.png)