OmniAICreator/Qiita-1.07M huggingface dataset:
Azure 仮想マシンを 106 日本語キーボード配列へ対応させる

#概要

　Azure Marketplace にある Windows 10, Windows Server 2016, Windows Server 2019 を展開すると初期状態で 101 US キーボード配列となっています。日本語キーボードの端末からリモートデスクトップでアクセスすると " が @ になるなどキー入力にストレスを感じます。これを解消するのが以下のレジストリ設定となります。

# レジストリ設定

　仮想マシン側で Registry Editor (regedit.exe) を起動し HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411 にある Layout File の値 KBDJPN.DLL を KBD106.DLL に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/b8f1d443-30cd-a0c9-54db-81e6991ff0bd.png)
　上の KBDJPN.DLL 部分を下の KBD106.DLL に変えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/06a3b00f-421a-8443-8e0f-38cb5aa9d176.png)
　仮想マシンを再起動します。これでキーボード配列が 106 日本語キーボード対応となります。

#日本語入力の追加
　レジストリを変更する事で日本語配列のキー入力になりましたが、日本語そのものを入力したい場合には、日本語の追加が必要です。

１．設定の [ Time & Language ] を選択します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/7d4058cc-0a41-c790-5830-9bd3fcad5bd6.png)

２．[ Language ] から [ Add a language ] を選択し、[ 日本語 ] を追加します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/de4fcda0-a0c9-63eb-7d0f-39382b1537ea.png)

３．[ 日本語 ] 追加の際に [ Windows display language ] を日本語にするチェックを入れる事で、以下ように表示も日本語となります。優先する言語の一番上に日本語が来ている事を確認します。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166732/fd808274-0d2f-4ca6-95d2-454f081bf6b0.png)

　以上の設定で日本語の入力が出来るようになります。必要に応じて [ 日付と時刻 ] でタイムゾーンの変更や [ 地域 ] の設置で [システムロケールの変更](https://win-tab.net/misc/lang_change2_1511202/#2)などを行ってください。
【Rails】Form  Objectを使ったログイン機能のサンプル

## Form Objectとは
Formで使うためのモデルみたいなやつ。

Railsのフォームは基本的にActiveRecordのモデルに依存している。
1つのフォームで複数モデルの操作をしたいときにForm Objectを使うと、処理がすっきりかける。

またログインに関する処理など、既存のモデルが使えない処理もForm Objectに書くと良い場合がある。

あんまり使わない方が良いって意見もある。

https://zenn.dev/yukito0616/articles/d3b7032e9f1e90

## ログイン機能にform_objectを使う場合のサンプル
https://qiita.com/d0ne1s/items/7c4d2be3f53e34a9dec7

Railsチュートリアルとかで解説されてる、`bcrypt`等を使ったログイン機能にForm Objectをいれることを想定。

### form_object
```bash:
$ mkdir app/forms
$ touch app/forms/login.rb
```
```rb:app/forms/login.rb
class Login
    include ActiveModel::Model 

    attr_accessor :email, :password #使うカラム

    validates :email, presence: true 
    validates :password, presence: true 

    def save 
        return false if invalid?
        true
    end 
end
```

### controller
```rb:app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  def new
    @login = Login.new
  end

  def create 
    @login = Login.new(login_params)
    if @login.save && (@user = User.find_by(email: @login.email)) && @user.authenticate(@login.password)
      login @user
      redirect_to users_path
    else 
      render :new 
    end 
  end 

  private

  def login_params
    params.require(:login).permit(%i[email password])
  end
end
```

### view
```erb:app/views/sessions/new.html.erb
<%= form_with model: @login, url: login_path, local: true do |f| %>
  <%= f.text_field :email %>
  <%= f.password_field :password %>
  <%= f.submit "ログイン" %>
<% end %>
```

### locale
```bash:
$ touch config/locales/models/login.ja.yml
```
```yml:config/locales/models/login.ja.yml
ja:
  activemodel:
    attributes:
      login:
        email: メールアドレス
        password: パスワード
```

### カスタムバリデーションを追加
```rb:app/forms/login.rb
class Login
    include ActiveModel::Model 

    attr_accessor :email, :password

    validates :email, presence: true 
    validates :password, presence: true 
    validate :valid_combination

   # ユーザーが見つからない、またはパスワードに誤りがある場合にエラーを返す
   def valid_combination
      @user = User.find_by(email: email)
      errors.add(:base, 'メールアドレスとパスワードの組み合わせが正しくありません。') unless @user&.authenticate(password)
   end

    def save 
        return false if invalid?
        true
    end 
end
```
slee-Pi3（ラズパイ用電源管理/死活監視モジュール）の使用 I2C アドレス変更

[slee-Pi3](https://mechatrax.com/products/slee-pi/) は、ラズパイの電源管理や死活監視の設定を I2C 経由で行います。
今回は**パワーマネジメントモジュール設定用の I2C アドレス**の変更方法をご紹介します。
slee-Pi3 と他デバイスの併用で I2C アドレスが被ってしまう際に利用できる便利な機能です。

# パワーマネジメントモジュール設定用のI2Cアドレス変更
slee-Pi3 のハードウエア詳細は [こちら](https://github.com/mechatrax/slee-pi3/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2) を参照ください。
I2C アドレス変更は DIPSW1 を使用します。DIPSW1 は基板上の赤丸部分に配置されています。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/517212ab-d88b-6583-363c-73804179bb95.png)
出荷時状態では DIP1 , DIP2 どちらも OFF で I2C アドレスの 0x6E に設定されています。
DIP1 , DIP2 の ON , OFF の組み合わせで I2C アドレスを切り替えます。
以下の通り 0x6E , 0x6D , 0x6B に変更可能です。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/870e744a-6535-6fc8-9e91-7b521b73bd1a.png)

ラズベリーパイ起動後に下記コマンドを実行すると 0x6E に認識されているのがわかります。
```bash
i2cdetect -y 1
```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/d546472e-00af-0ae7-a263-1aff02525aa0.png)
今回は **0x6E → 0x6D** への変更を例に紹介します。

## [手順1]DIPSW1 の DIP 切り替え
① ラズベリーパイをシャットダウン
② DIPSW1 の DIP1 を ON 側にスライド
③ JP4 のジャンパピンを付け替える → 3ピンの内、左側2本に付ける ※JP4 詳細は [こちら](https://github.com/mechatrax/slee-pi3/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2#jp4)
④ slee-Pi3 の設定をリセットするために一度復電 
⑤ JP4 のジャンパピンを元に戻して再度復電

## [手順2]sleepi3 設定ファイルの書き換え
/etc/default/sleepi3 ファイル中盤の下記箇所を書き換えます。
I2C_ADDRESS=**0x6E** を **0x6D** に書き換え後保存して、再起動
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/356eb0c8-f309-dc9b-9ac0-426ee1f900c3.png)
再起動後に i2cdetect コマンドを実行すると 6E → 6D にアドレスが変わったのが確認できます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/cd8fc91a-9f39-9bcb-547e-c07949ceee81.png)
※再起動前に i2cdetect コマンドを実行しても、上記のようにアドレス変更はされますが、sleepi3ctl コマンドを実行するとエラーになりますのでご注意ください。

以上が変更方法の紹介でした。
ご覧いただきありがとうございました。
Mac M1での pod install エラーの簡単解決方法

## エラー事象1
```
...
LoadError - dlsym(0x7fcfc87783a0, Init_ffi_c): symbol not found - /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.0/lib/ffi_c.bundle
...
```

## 解決方法
`ffi` をインストールします。

```sh
arch -x86_64 sudo gem install ffi
```


## エラー事象2
```sh
% pod install

...
LoadError - dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.0/lib/ffi_c.bundle, 0x0009): missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.0/lib/ffi_c.bundle - /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.0/lib/ffi_c.bundle
...
```

## 解決方法
アーキテクチャを指定すれば、問題なく実行できます。

```sh
arch -x86_64 pod install
```
BigQuery 正規表現で〜を含まないマッチング

# REGEXP_CONTAINS を使う
例えばアクセスログテーブルから、画像へのアクセスを省きたいときは以下のようにする・

```sql
SELECT
    url
FROM
    access_log
WHERE
    REGEXP_CONTAINS(url, ".(png|jpg|jpeg||gif)") = false
```

否定的先読み(?!pattern)、否定的後読み(?<!pattern)などを使わずできる。
(そもそもBigQueryで先読み・後読みって使える?)
AWSでのデプロイ時によく使うコマンド

# AWSでデプロイ時によく使うコマンドまとめ

最近AWSのEC2でデプロイした際によく使ったコマンドを忘れないように記録します。

・EC2インスタンスにログイン

```
ssh -i キーペアの名前.pem ec2-user@EC2インスタンスと紐付けたElastic IP
```

・データベースの状態を確認（今回はMySQL,MariaDBを使用）

```
sudo systemctl status mariadb
```

・デプロイ予定の開発中アプリケーションへ移動

```
cd  /var/www/開発中アプリケーション
```

・railsの起動

```
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

・Unicornのプロセスを確認

```
ps aux | grep unicorn
```

・Unicornのエラーログを確認（shift + g で最新のログへ）

```
less log/unicorn.stderr.log
```

・EC2内でのエラーログ確認（shift + g で最新のログへ）

```
less log/production.log
```

自動デプロイ（Capistranoの導入後）

```
bundle exec cap production deploy
```


# まとめ

個人的によく使うコマンドをまとめました。
こういったコマンドは忘れやすいので、定期的に学習したことは投稿していきたいと思います。
xed コマンドが使えない

コマンド実行すると、エラーが出ましたので、一応解決方法書き残します。

## エラー
```sh
% xed .

xcode-select: error: tool 'xed' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
```

## 解決方法
```sh
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
```
bundle install できない！！

#bundleができない時の対処法
下記のエラー文が含まれていたら、この記事を読んでください。

```
$ xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

##原因
現在有効になっている開発者ツール用のpathが有効でないと、このエラーが発生します。macOSのメジャーバージョンアップ後によく発生するエラーです。Xcodeの開発者ツールが見当たらないのです。

つまり、コマンドラインから開発者ツールを見つけたり、実行したりする``` xcrun ```というコマンドを使うためにpathを有効にする必要があります。

##対処法
###Xcode Command Line Tool のインストール
```
$ xcode-select --install
```
インストールを終えると、``` /Library/Developer/CommandLineTools ``` 以下に開発者ツールがインストールされ、xcrun から参照できるようになります。

ここではコマンドの意味を割愛させていただきます。
気になる方はGoogleで調べてください。

これで ``` bundle install``` ができるようになります。
備忘録 - ループ処理 【VBA】

## For Each構文の文法

```vb
For Each エレメント In グループ　' エレメントは繰り返す変数・グループはコレクション（配列）
'処理は中に記述
Next エレメント
```

##具体例
VBAが書かれているワークブック内のワークシートをすべて保護する

```vb
    Dim Sh As Worksheet

    For Each Sh In ThisWorkbook.Worksheets
        Sh.Protect
    Next Sh
```
備忘録 - シートの保護 【VBA】

##文法

ワークシートを保護する（編集できなくする）

```vb
ワークシート.Protect

'解除の際に必要なパスワードを設定
ワークシート.Protect Password:="password"

'セルの書式変更を可能に（文字の色や大きさ・フォントの変更）
ワークシート.Protect AllowFormattingCells:=True
```

ワークシートの保護を解除する

```vb
ワークシート.Unprotect

'パスワードを入力して保護を解除
ワークシート.Unprotect "password"
```
Androidでtcpdumpを取得する

パケットログを取得する必要があったので、パケットログを取得するためのメモ。
パケットログを取得させるには、emulatorでtcpdumpすると取得することができます。

```bash
$ emulator -tcpdump <出力先ファイルパス> -avd <emulator名>
```

emulator名は下記のコマンドで確認することができます。

```bash
$ emulator -list-avds
```
QNAP NAS 機種変更

# QNAPのNASを機種変更したメモ

## 概要

* 採用機種 TS-231P → TS-251D 
* HDDは変更なし 内蔵6T×2(RAID1) + 外付けUSB4T(バックアップ用) を旧機種からそのまま移行


## 背景とこれまでの経緯

* TS-231Pは2020年3月導入 自宅での初QNAP
* 自炊書籍、写真、MP3等デジタル化した各種ファイルの管理がメイン用途
* バックアップとスナップショットは以下で運用
 * スナップショット：メインのストレージプールに5%の領域を確保してスマートスナップショットを運用。ふだんは主にWindows EXplorerから接続しての操作が多く、あやまって上書きや削除した場合に「以前のバージョン」を取り出すために使っている
 * クラウドバックアップ：写真とMP3以外をMicrosoft OneDrive（容量1T）へ圧縮設定で一方向同期（ミラー・世代管理なし）。毎日深夜実施。
  * （写真はGooglePhoto、MP3はYoutubeMusicに保存しているので OneDriveへは保存せず）
 * ローカルバックアップ：全ファイルを外付けUSB HDへ週に1度、世代管理・削除なし・圧縮ありでバックアップ。このジョブが最後に正常に完了できたのは2021/3/7であり、少し以前の状態。最新状態ではエラー落ちでジョブが正常終了しない状態に。。。

* 機種変更にいたった理由
 * 全文検索QSearch を使いたい（TS-231Pは動作対象外）
 * 重い処理で止まることが増えた（週次バックアップがエラー落ちする、起動に1ｈ近く掛かる、常にメモリ不足）

## やったこと・はまったこと

* 新NASに対して念のためメモリの増強。初期2G×1 → 8G×2に載せ替え。
* QNAP公式サイトではそのままHDDを入れ替えて機種変更できると書かれていたが、単純に接続しQTS(OS)を自動更新するのではいくつかの問題が出た
 * バックアップアプリ HBS3が起動しない（エラー落ち）
 * 起動に1h近くかかる（機種変更する前から起きていた問題 … たぶんOSの構成が以前からおかしくなっていたのだろうと推測。上のHBS3起動しないのもそうなのかもしれない）
 
* この時点で、全初期化を決断。TS-231Pの機種のままで一度やっておいてもよかったのかもしれない。
 * データの復元は、クラウドおよび外付けUSBから行うこととし、メインのストレージはRAIDごと破棄することに。
 * 本当であれば、念のため最新状態をバックアップしておきたいところだが、HBS3が起動しない＆記憶によれば最後のバックアップ以降に変更がないはずなのでメインストレージのデータは捨てる決断
* 全初期化を実施。HDDを抜いてNASを起動、案内にしたがいOS初期化、ディスクを挿入しフォーマット実施。各種設定をやりなおし。
 * 全初期化を実施したことでスナップショットは消えたのが悲しいがやむを得ない。
* データの復旧（復元）
 * 復旧もHBS3から行う。復元ジョブを作って実行。どのバックアップからどのフォルダに戻すかを指定するだけなので非常に簡単。
 * 毎日のミラーがあるデータはクラウドから復旧。これは長時間かかったまる2日程度。データ量と回線速度のせいと両面があると思われる。
 * 週次バックアップにしかないデータはUSB HDDから復旧。

## わかったこと

* QNAPは多機能なOSとアプリ群、多数のハードウェア構成のモデルを提供している。しかし低スペックのモデルにはそのOSとアプリ群はマッチしていない。負荷が高いため低スペックモデルでは運用に支障が出る場合がある。買い換えコストを考えるとメモリ交換ができなく、かつメモリ搭載2G以下のモデルは地雷ではないかと思った。
* クラウドバックアップはリスク分散の意味でも有効で、ハードウェアを用意しなくてよいなど利点が多いが、復旧には長時間が必要になる。
* わかったこと（というかわかっていたが後まわしにしていて結局できていなかったこと）として、バックアップからの復旧テストがある。復旧手順が若干不安だったのと、バックアップのフォルダ構成が最適ではなく復旧に一手間かかる構成になっていた。安心と安全のためには面倒がらずにやっておく必要がある。
【GCP】請求先アカウントをわかりやすくまとめてみた

参考URL：
https://apps-gcp.com/gcp-basic-01-preparation/#i
https://zenn.dev/koke/articles/5416f45f4cdfbd
TOPGATEのよくあるご質問

GCPを利用したい場合、最低限、以下が必要です。
・Google アカウント
・GCP プロジェクト
・請求先アカウント

請求先アカウントがなぜ必要かについて説明します。
・GCP は、使用した分だけ請求が発生する従量課金制。
・料金はプロジェクト単位で発生。
・プロジェクトで発生した料金の、請求管理やどこに請求させるかといった機能を担っているものが「請求先アカウント」
・プロジェクトに請求アカウントを紐付ける事で、始めて有料インスタンスの立ち上げが可能となる。

請求先アカウントの主な機能は以下。
・発生した請求をなにで支払うかの定義（クレジットカード）
・どのプロジェクトが請求先アカウントに紐付いていて、プロジェクトごとにどういったサービスでどの程度料金が発生しているか確認が可能。
・発生した課金のデータをcsv/json のいずれかのファイル形式でダウンロードしたり、BigQuery にエクスポートして分析できる。
・プロジェクトごと、GCP サービスごとに予算を設定し、設定した予算から任意の利用料でアラートメールを出すよう設定可能。(例えば予算100万円のうち50万円(50%)までいったらアラートメールが送信される。)
※詳細は公式ドキュメントにもあります

ただ、請求先アカウントには、請求先サブアカウントというものも存在します。
請求先サブアカウントは、販売パートナー(リセールなどを行う企業)が使用するためのアカウントです。
必要性について以下に説明します。
・親の請求アカウントがあり、その下に請求先サブアカウントを作成する
・請求先サブアカウントをプロジェクトに紐づけることで、請求先サブアカウントでの使用料金は、親の請求アカウントに請求される

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/8656b7f3-efcd-3306-ead5-97a71527a78a.png)

請求先サブアカウントにした時のメリットは
・請求を親の為替に合わせられること。日本円なら日本円で払える。

請求先サブアカウントは、閲覧機能などが制限されるので請求先サブアカウントにどの権限を付与するかは考えないといけません。
請求先アカウントユーザーの権限だと、アラートを設定できなかったり、レポートの機能もすべて使えなかったりと、かなり制限されます。

請求先サブアカウントは、あくまで販売パートナー(リセールなどを行う企業)が使用するためであり、プロジェクトに紐づけるのが請求先アカウントではなく、請求先サブアカウントになる。ということがわかっていれば問題ないと思います。
GitHub Actionsを使ってsetup.cfgをもとに_version.pyを更新する

[pipとpipenvとpoetryの技術的・歴史的背景とその展望](https://vaaaaaanquish.hatenablog.com/entry/2021/03/29/221715)という記事を読みました。Pythonのビルドシステムに微妙さを感じている自分には

> 単一のtomlファイルをrequirements.txtやそれらを参照するsetup.pyの代替とする事が出来るようになっている

という一文に心がぴょんぴょんしました。

偶然にも(本当に偶然だぞ!)新しくPythonのプロジェクトを作る機会があったので、試しに`pyproject.toml`を使ってみました。
そしたら、初手で詰みました。バージョンの指定がつらかったからです。

## よくある`setup.py`でのバージョン読み込み
Pythonパッケージでは、よく、`パッケージ名.__version__`で、パッケージのバージョンを取得できるようになっています。
これは自動でそうなるのではなく、人手でそのように書かれていて、そういう風に書くという作法になっています。

そして、バージョンを`setup.py`にも書かなければならないのですが、`パッケージ名.__version__`との二重管理を防ぐために、

```py:パッケージ名/_version.py
__version__ = "0.4.2"
```

```py:setup.pyの最初の方
with open("パッケージ名/_version.py", "r", encoding="utf-8") as f:
    exec(f.read())
```

のように`setup.py`に黒魔術を仕込んでいることが多いです。

では、`setup.py`を使わない場合、これはどうすればいいでしょう。
`setuptools`では、バージョンは`setup.cfg`に書くことになります。その際、[`attr:`という機能](https://setuptools.readthedocs.io/en/latest/userguide/declarative_config.html#specifying-values)を使えばバージョンが読めそうなのですが、そうするとビルド時に自身を`import`することになり、ビルド環境に自身の依存関係をインストールしないといけなくなるようでした。

それは避けたいのですが、かといって、`setup.cfg`と`_version.py`の両方に同じことを書くのはもっと避けたいです。ということで、今回、GitHubアクションを使って機能を実現することにしました。

# `master`ブランチの`setup.cfg`が更新されたとき、`_version.py`を更新し、pushする

というアクションを書きました。それにより、`setup.cfg`さえ更新すれば`_version.py`のことはGitHub Actionsにおまかせできるようになりました。どのブランチにするかなどは、プロジェクトによって違うので、適宜、プロジェクトに合わせて書き換えてください。

```yml:.github/workflows/update_version_file.yml
# This is a basic workflow to help you get started with Actions
name: "Update _version.py"

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ master ]
    paths:
      - "setup.cfg"
  pull_request:
    branches: [ master ]
    paths:
      - "setup.cfg"

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      # ！！！！runの行の > 以降を、_version.pyのパスに書き換え！！！！
      - name: Update version
        run: sed -n 's/^version\s*=\s*\(.*\)/__version__ = "\1"/p' setup.cfg > bqbraket/_version.py

      - name: Commit version file
        uses: EndBug/add-and-commit@v7.1.0
        with:
          author_name: "コミットに使う名前"
          author_email: "コミットに使うメールアドレス"
          message: "コミットメッセージ"
          add: "上で指定した_version.pyのパス"
```

## ライセンス
本YAMLファイルはBlueqatプロジェクトが[こちら](https://github.com/Blueqat/braket-backend/blob/4b934e11f20ee01829ed222d31e405f79cd66941/.github/workflows/update_version_file.yml)でオープンソースとして公開しており、ライセンスも同パッケージに準じて、Apache-2ライセンスとします。
WindowsServer2016の更新とセキュリティがクラッシュする問題の解決

# 事象
WindowsServer2016で、
設定 > 更新とセキュリティ
を開くと、一瞬画面が見えたように思えたが落ちてしまう。

# 原因
`Update Orchestrator Service for Windows Update`サービスが無効になっていた。

WindowsServer2016の場合、有効にしなければならないサービスは
`Windows Update`だけではないみたい。


#解決方法
検索バーで「service」を検索し、`サービス`をクリック。
`Update Orchestrator Service for Windows Update`を【無効→手動】に変えたら解決した
“５G”のビジネス・モデル

**　ICTビジネスは 「今、米国で起きている事が３～５年後に日本で起きる」「今や中国が最も進んでおり、それを追いかける日本」 と考えられがちですが、５Gのビジネスはそうとは言えない状況にあります。以下では、それを解説しました。**
##§１“5G”の基礎知識
**　▶ ５Gは「一強独占のインターネット型のビジネス・モデル」を変える**
####1. “５G”で 「何ができるか？」
**　▶ “インターネット”で出来なかったことが“5G”で出来る。**
**　▶ ❶スライシング、❷ MEC、❸ローカル５G を使って実現する。**

https://www.slideshare.net/MMurakamiMurakami/1-g-245311727

####2. “５G”に 「いつ着手するか？」
**　▶ “５G環境”は前倒し ⇒ ５Gビジネスでの先行者利益が得られる時期**

**　【モビリティ分野】　法整備で先行した日本は、欧米より先行する事例も
　　　　　　　　　　　 “運転士がいらない自動運転（レベル４）”の実用化が来年に実現**
**　【建設分野】　遠隔施工の“道路工事”“ダム建設”“ビル建設”が実用段階へ**
**　【医療分野】　遠隔手術も現実的に**

https://www.slideshare.net/MMurakamiMurakami/2-g-245312366

####3. “５G”の 「ビジネス・モデル」
**　▶ “インターネット型ビジネス”と、“5G型ビジネス”は、ビジネス・モデルが異なる**
**　▶「オプト・イン」か？「オプト・アウト」か？**
　　　・トロントで失敗したgoogle　（「オプト・アウト」に住民が反発）
　　　・”プライバシーより国が優先”するため「オプト・アウト」が可能な中国
　　　・日本は「オプト・イン」

https://www.slideshare.net/MMurakamiMurakami/3-g-245312807

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585213/2f0caf7d-26e9-5f4f-403c-e7327c7f0d12.png)

##§２　ケーススタディ
**　　　　　TBA**
Elmer の 物理モデル定義ファイル の 追加方法

# はじめに
何故か`FEM`をやることになりました。
# Elmer
[OpenFOAMによる熱移動と流れの数値解析](https://www.morikita.co.jp/books/book/2779)を図書館で借りて読んで、その勢いで[「Elmer」ではじめる連成解析](http://www.kohgakusha.co.jp/books/detail/978-4-7775-2128-9)を買いました。

Qiita先輩諸氏の、[書評：｢Elmer｣ではじめる連成解析](https://qiita.com/Sagittarius_Chiron/items/cae5439c0e0434f6a294)なども参考にさせていただいております。
# 物理モデル定義ファイルの追加１
```ba.sh
sudo cp /usr/share/ElmerGUI/edf-extra/elasticplate.xml /usr/share/ElmerGUI/edf/
```
コマンドラインで`edf-extra`から`edf`に定義ファイルをコピーします。
# 物理モデル定義ファイルの追加２
![20210330a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/f78c848e-d960-d76b-1427-29aa48f3d3c8.png)
`GUI`の`File -> New project...`からダイアログを開いて定義ファイルを追加します。
# まとめ
+ FEMをやる
+ 遠心力による変位を知りたい
プログラミング学習を手助けしてくれる無料の有料サイトなど


#Python
###『退屈なことはPythonにやらせよう』
Pythonの使い方から説明してくれて、使えたらこんなことができるとイメージしやすい本。
プログラミングのオープンチャットで聞いた。

英語なら無料↓
https://automatetheboringstuff.com/


#Git, Github
###[サル先生のgit入門](https://backlog.com/ja/git-tutorial/pull-request/06/)
gitのプルリクについていまいちよくわかっていなかったので、
調べたところこのサイトにたどり着いた。
すでにgit初心者ではなかったが、このサイトは初心者にはとても良いのでは無いかと思います。



#Docker


#良質なコードを書くことを手助けしてくれるサイト

海外の会社CLOUDFOURの技術ブログ↓

https://cloudfour.com/thinks/


[Breaking Out With Viewport Units and Calc](https://cloudfour.com/thinks/breaking-out-with-viewport-units-and-calc/)という記事で、.contaner で覆わずとも

```
  margin-left: calc(-50vw + 50%);
  margin-right: calc(-50vw + 50%);
```

で全画面表示できるよ〜とか、なかなか無い情報が載ってる。
OpenSSHデバッグ方法

# 事象
WindowsServerにOpenSSHを入れて、外からSFTP通信を試みたが、
上手く行かない。SSHサーバーのログが見たい。

# ログ取得方法
① sshd.exe実行によるプロセスの二重起動を防ぐため、
以下のサービスを停止。

* OpenSSH Server
* OpenSSH Authentication Agent

② powershellで以下のコマンドレット実行。
OpenSSHのパスを通していない場合は、OpenSSHが格納されているフォルダまでcdする。
`sshd.exe -ddd`

オプションの`d`の数が増えるほど詳細なログを取得できる（MAX3つまで）
`Server listening on 0.0.0.0 port 22`
と表示されたら、ログ取得準備完了。

③ この状態で外からSFTP通信を実行すると、
powershellの続きにログが吐かれることを確認できる。
【5分でデプロイ】Deno Deployを使ってみた

<a href="https://gyazo.com/251c307f125017ac51ad1f371ba50722"><img src="https://i.gyazo.com/251c307f125017ac51ad1f371ba50722.png" alt="Image from Gyazo" width="969"/></a>

## Deno Deployとは

https://deno.com/deploy

## サインインする

<a href="https://gyazo.com/136f12a439a981fe65b92ebd5ece4221"><img src="https://i.gyazo.com/136f12a439a981fe65b92ebd5ece4221.png" alt="Image from Gyazo" width="969"/></a>

GitHub アカウントのログイン＆連携が求められるので許可します。

## プロジェクトを作成する

<a href="https://gyazo.com/c197ba9ded2ac144d31d353f09ba227d"><img src="https://i.gyazo.com/c197ba9ded2ac144d31d353f09ba227d.png" alt="Image from Gyazo" width="969"/></a>

<a href="https://gyazo.com/0671e4589f20570982a04b2b475c1d40"><img src="https://i.gyazo.com/0671e4589f20570982a04b2b475c1d40.png" alt="Image from Gyazo" width="969"/></a>

<a href="https://gyazo.com/e63799cf2381e1a7f85f272a0407f3d3"><img src="https://i.gyazo.com/e63799cf2381e1a7f85f272a0407f3d3.png" alt="Image from Gyazo" width="969"/></a>
プロジェクトが作成されました。

## デプロイするアプリを登録する

<a href="https://gyazo.com/9da07457f5fb0af1d13378940a56949d"><img src="https://i.gyazo.com/9da07457f5fb0af1d13378940a56949d.png" alt="Image from Gyazo" width="969"/></a>

本記事では、公式のサンプルアプリを登録してみます。
公式のリポジトリを Fork します。

<a href="https://gyazo.com/f947cd67818185aacaf2b7774e2505f2"><img src="https://i.gyazo.com/f947cd67818185aacaf2b7774e2505f2.png" alt="Image from Gyazo" width="969"/></a>

<a href="https://gyazo.com/de6fb403a360b9d47450633797d15d80"><img src="https://i.gyazo.com/de6fb403a360b9d47450633797d15d80.png" alt="Image from Gyazo" width="969"/></a>

Fork したリポジトリにある

<a href="https://gyazo.com/debcecc869894fbb7cccae654f76d9c4"><img src="https://i.gyazo.com/debcecc869894fbb7cccae654f76d9c4.png" alt="Image from Gyazo" width="969"/></a>

<a href="https://gyazo.com/674ff65529d7ad3c89650255769ca6fb"><img src="https://i.gyazo.com/674ff65529d7ad3c89650255769ca6fb.png" alt="Image from Gyazo" width="969"/></a>

デプロイ対象のリポジトリのみにアクセス可能にします。
（全リポジトリにアクセス可能にしたい場合は、`All repositories`でも OK）

<a href="https://gyazo.com/ebb705d83635634f0eee4cb9f339b0fc"><img src="https://i.gyazo.com/ebb705d83635634f0eee4cb9f339b0fc.png" alt="Image from Gyazo" width="969"/></a>
Deno Deploy とリポジトリがリンクされました。
<a href="https://gyazo.com/097eb6bdf91b25cb4d4343000af91835"><img src="https://i.gyazo.com/097eb6bdf91b25cb4d4343000af91835.png" alt="Image from Gyazo" width="969"/></a>

## デプロイしたアプリにアクセスしてみる

プロジェクトページに戻り、`Visit`をクリックします。
<a href="https://gyazo.com/8ffebb817efa95eea82a659815e4f762"><img src="https://i.gyazo.com/8ffebb817efa95eea82a659815e4f762.png" alt="Image from Gyazo" width="969"/></a>

<a href="https://gyazo.com/5373f20464ddc8e18eea4d9217dbfc81"><img src="https://i.gyazo.com/5373f20464ddc8e18eea4d9217dbfc81.png" alt="Image from Gyazo" width="969"/></a>
デプロイしたアプリの画面が表示されました！
<a href="https://gyazo.com/89947456cf4f7d4c80d4b285a27f08a5"><img src="https://i.gyazo.com/89947456cf4f7d4c80d4b285a27f08a5.png" alt="Image from Gyazo" width="969"/></a>

## まとめ

Deno Deploy にサンプルアプリをデプロイする手順を説明しました。
アプリを Deno で書いておけば、非常に簡単にデプロイできます。

[POSTも受け取れる](https://github.com/denoland/deploy_examples/blob/main/post_request/mod.js)ので Webhook エンドポイントとして動かすのも良いですね。
フォームHTMLでAuthenticity_tokenが生成されるのはなぜなのか

##はじめに
この記事では、Railsチュートリアル第7章で登場したフォームのHTMLソースの2つ目のタグの中にある、Authenticity_tokenが生成される理由について記します。
#なぜ生成されるのか?
大雑把に言えば、ユーザーが本当にそのフォームに記入をする意思を持ってフォームを呼び出したことを明確にするためです。逆にユーザーの意思に反してフォームへの記入がされる場合とは何かというと、「クロスサイトリクエストフォージェリ」という攻撃を受けた場合です。これについても大雑把な説明になってしまいますが、何らかの悪意を持った攻撃者が被害者を誘導し、特定のページにPOSTリクエストを送るプログラムを被害者に実行させる攻撃をクロスサイトリクエストフォージェリと呼びます。この攻撃によって為されたPOSTリクエストは、事前のフォームページへのGETリクエストを伴いません。そのため、攻撃と区別するために、ユーザーが意思を持ってフォームを記入する場合は、事前にフォームページをGETリクエストで取得した証拠をアプリケーションのサーバー側に示すことが必要になり、その証拠としてAuthenticity_tokenが使われます。以上がAuthenticity_tokenが生成される理由になります。
FastapiをDockerで動かすときはuvicornのroot pathが必要

# はじめに
タイトルの通りのままですが、fastapiをDockerで動かそうとすると404エラーが出ました。
原因としてはルートの場所がどこか別の場所か場所を解決できないことが原因だったようでした。

# 解決法

下記のようにしたらうまくいきました。

```
uvicorn main:app --reload --host 0.0.0.0 --port ポート --root-path="絶対path"
```
AWS Lambda基本

#AWS Lambdaとは？
**「サーバーのプロビジョニングや管理の必要なしにコードを実行できるコンピューティングサービス」**

#サーバーレスの特徴
**①インフラのプロビジョニング、管理が不要**
**②自動でスケール**
　・リクエスト数に応じて自動的に起動数がコントロールされる
**③価値に対する支払い**
　・事前に必要なコストが存在しない
　・リクエスト数並びに処理実行時間に対しての課金
　・コスト効率がよく、コストゼロからのスタート可能
**④高可用かつ安全**

##**Lambda関数（ファンクション）**
・Lambaで実行するアプリケーション
・それぞれが隔離されたコンテナ内で実行される
・利用する言語の関数もしくはメソッドをハンドラーとして指定し、実際の際に呼び出す
・コードは依存関係も含めてビルド、パッケージングした上でアップロード
　**ZIP形式**
　アップロードしたものは**S3**に保存され実行時以外は暗号化される

##**Lambdaファンクション-基本設定-**
・メモリ：**128MBから3008MB**の間で設定可能
　　　　容量に応じてCPU能力なども比例
・タイムアウト：**最大900秒**まで
・実行ロール：必要なAWSリソースへのアクセスを許可するIAMロール
　　　　　　指定されたIAMロールにそってLambdaファンクションからAWSリソースへのアクセス許可される。

##Lambdaファンクションの制限
・インバウンドネットワーク接続はブロックされる
・アウトバウンドはTCP/IPとUDP/IPソケットのみ
・TCP25番ポートのトラフィックはブロックされる

##イベントソース
**イベントの発生元となるAWSサービスまたはユーザが開発したアプリケーション**
・Lambda関数の実行をトリガーする

**イベントソースにはタイプがある**
・ポーリングベース
　さらにストリームベースとそれ以外がある
  ポーリングをして処理するデータがある場合にLambda関数を実行
・その他
　Lambda関数はイベントソースから呼び出される

*ポーリングとは*
複数のプログラミング通信に対し、一定のタイミングの問合せがあった場合に送受信処理を行う通信方式。一旦中継点に通信内容をためておいて、受信側のタイミングが良い時は通信を行う。

*ストリーム*
通信ネットワークの分野では、データを送受信する際にデータ全体の受信完了を待たずに受信したデータから順番に処理を行う送受信方式（**ストリーミング**）や、そのように送受信される連続的なデータの流れを**ストリーム**という

AWSサービスの場合、呼び出すLambdaファンクションの設定情報を保持する（イベントソースマッピング）

##呼び出しタイプ
**非同期呼び出し**
・InvocationTypeはEvent
・レスポンス内容はリクエストが正常に受け付けられたかどうかのみ

**同期呼び出し**
・InvocationTypeはRequestResponse
・実行完了時にレスポンスが返ってくる。レスポンス内容はLambdaファンクション内でセット

##Lambda関数のリトライ
エラーの種類、イベントソース、呼び出しタプによって異なる

**ストリームベースではないイベントソース**
・同期呼び出し
　エラー発生時にはレスポンスのヘッダにFunctionErrorが含まれる
・非同期呼び出し
　自動的に２回間でリトライされ、その後イベントは破棄される
　リトライには遅延がある

**ポーリングベースでストリーミングベースのイベントソース**
・データの有効期限が切れるまでリトライ
・失敗したレコードの有効期限が切れるか処理が成功するまで、新しいコードは読み込みは行われない

**ポーリングベースでストリームベースでないイベントソース**
・バッチのメッセージは全てキューに返り、処理が成功すれば、キューから削除される
・新しいメッセージの処理はブロックされない

##VPCアクセス
・VPC内のリソースへインターネットを経由せずにアクセス可能
・VPC内リソースにアクセスさせたいLambdaファンクションに対してVPCサブネットおよびセキュリティグループを設定
・Elastic Network Interface(ENI)利用


**VPCアクセスの注意点**
設定した時点でインターナットアクセスは不可となる
・パブリックIPアドレスは割り当てられない
・必要な場合NATインスタンスを用意する、もしくはAmazon VPC NATゲートウェイを利用すること
充分な数のENIまたはサブネットIPがない場合、リクエスト数が増えた場合失敗する

##アクセス許可、実行ロール
**LambdaファンクションがAWSのサービスやリソースにアクセスするためのアクセス許可**
・最低でもログ出力用にAmazon CloudWatch Logsへのアクセス許可が必要
・Lambdaファンクション作成時に指定することで呼び出された時にLambdaによってロールが引き受けられる
・IAMを利用して作成
　信頼されたエンティティとしてAWS Lambdaを利用

**アクセス許可-リソースポリシー**
Lambdaファンクションおよびレイヤー用にリソースベースのアクセス許可ポリシーをサポート
・リソースごとに他のアカウントに使用許可を付与することが可能
・AWSのサービスによる関数の呼び出しを許可することも可能

##同時実行数
・ある時点における実行中のLambda関数の数
・アカウントに対してデフォルトで1000で制限されている
・制限緩和することが可能
・同時実行数を超えてリクエストされた場合、スロットリングエラーが返却される

**同時実行数の見積もり**
**ボーリングベースかつストリームベース**
・シャード数と同じ

**シャード**
**「インデックスを分割したもの」**
*-なぜシャードがいるのか？-*
レプリケーションを行うため
インデックスのコピーを別サーバに保持していた場合、サーバ障害時でも可用性が維持できる。
こういった利用の場合、元のインデックスをプライマリーシャード、複製しているものをレプリカシャードと呼ぶ。

**ポーリングだがストリームベースではない**
・同時実行数までポーリングを自動的にスケールアップ

##自動スケーリング
・トラフィックの増加に応じて許可された同時実行数まで動的にスケール
・負荷が増加した時は、負荷が落ち着くもしくは同時実行の制限に到達するまで1分ごとに500ずつ同時に実行していく
・初期値はリージョンごとに異なるが、東京リージョンの場合1000
・この値は制限緩和不可
Gitコマンドでいつもお世話になるリンク(随時更新予定)




ブランチがローカルに溜まり過ぎてしまったときに便利。

```bash:terminal
git branch | grep -v '残したいブランチ1' | grep -v '残したいブランチ2' | xargs git branch -D
```
> [【Git】ローカルで特定のブランチ以外を一括で削除する - fv17の日記 - Coding Every Day](https://forest-valley17.hatenablog.com/entry/2019/07/25/113559)
docker で rails する

https://docs.docker.com/compose/rails/

上に書いてあることを適当に流用しますが、docker-compose と PostgreSQL を使わずに docker で rails だけを動かしてみます。

# 用意するもの

```bash
$ tree .
.
├── Dockerfile
├── entrypoint.sh
├── Gemfile
└── Gemfile.lock

```

# ファイルの中身

```dockerfile:Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp


COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000


CMD ["rails", "server", "-b", "0.0.0.0"]
```

```Gemfile:Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5'
```

```bash
touch Gemfile.lock
```

```sh:entrypoint.sh
#!/bin/bash
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"
```


# 作業

まずビルド

```
$ docker build --tag docker-rails-app .
```

マウントさせながら rails new して、ファイル群を生成する

```
$ docker run --rm -v (pwd):/myapp docker-rails-app rails new .
```

もういちどビルドして、bundle install させておく

```
$ docker build --tag docker-rails-app .
```

rails s する

```
$ docker run --rm -it -v (pwd):/myapp -p 3000:3000 docker-rails-app bundle exec rails server -b 0.0.0.0
```

これで、 `http://localhost:3000` で下の画面にあえる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45822/bab584a9-a585-2320-c8af-5280c2305552.png)
Rspecの入門[簡易版](単体・統合テスト)

#modelのテスト(単体)

```ruby:
require 'rails_helper'

RSpec.describe 'モデルのテスト', type: :model do
  describe 'バリデーションのテスト' do
    subject { (モデル名).valid? }

    let(:user) { create(:user) }
    let!(:(モデル名)) { build(:(モデル名), user_id: user.id) }

    context 'カラム' do
      it '空欄でないこと' do
        (モデル名).(カラム名) = ''
        is_expected.to eq false #falseが返ってきたらok
      end
    end

      it '100文字以下 :100文字は〇' do
        (モデル名).(カラム名) = Faker::Lorem.characters(number: 100)
                                                  #文字列100入れる
        is_expected.to eq true #trueが返ってきたらok
      end
      it '100文字以下 :101文字は×' do
        (モデル名).(カラム名) = Faker::Lorem.characters(number: 101)
                                                 #文字列101入れる
        is_expected.to eq false #falseが返ってきたらok
      end
    end
  end

  describe 'アソシエーションのテスト' do
    context 'Userモデルとの関係' do
      it 'N:1となっている' do
        expect((モデル名).reflect_on_association(:user).macro).to eq :belongs_to
      end
    end

    context '(モデル名)モデルとの関係' do
      it '1:Nとなっている' do
        expect(User.reflect_on_association(:(モデル名)).macro).to eq :has_many
      end
    end
  end
end


```

#統合テスト

##showページのテスト
```ruby:

describe 'current_userのitem/showページのテスト' do
  before do
    visit item_path(item) #このページへ遷移した時のテスト
  end

  context '表示内容の確認' do
    it 'URLが正しい' do
      expect(current_path).to eq '/items/' + item.id.to_s
     #URLが'/items/' + item.id.to_sなっているか
    end
    it 'ユーザーの名前のリンク先が正しい' do
      expect(page).to have_link item.user.name, href: user_path(item.user)
     #'item.name'が表示されていてそのリンク先が[user_path(item.user)]
    end
    it 'itemの編集リンクが表示される' do
      expect(page).to have_link 'アイテムを編集', href: edit_item_path(item)
     #'アイテムを編集'表示されていてリンク先が[edit_item_path(item)]
    end
  end
end

```

##editページのテスト

```ruby
context '編集成功のテスト' do
  before do
    @item_old_genre_id = item.genre_id
    @item_old_name = item.name    
    genre_id = Faker::Number.between(from: 1, to: 6)
    #ジャンルIDが6まで表示する
    select Genre.find(genre_id).name, from: 'item[genre_id]'
    #Genreの中からnameが表示されているものを一つ選択する
    fill_in 'item[name]', with: Faker::Lorem.characters(number: 10)
    #10文字のランダム文字を入れてる
    click_button '更新する'
    #更新するをクリック
  end

  it 'ジャンル名が正しく更新される' do
    expect(item.reload.genre_id).not_to eq @item_old_genre_id
  end
  it 'アイテム名が正しく更新される' do
    expect(item.reload.name).not_to eq @item_old_name
  end
  it 'リダイレクト先が、更新したアイテムの詳細ページになっている' do
    expect(current_path).to eq '/items/' + item.id.to_s
    expect(page).to have_content 'アイテムの詳細'
  end
```
Java学習　基礎編　コンストラクタとは？

Java学習の備忘録になります。
内容は初心者なので基礎的な部分となります。
Javaに興味がある方やJava学習初心者の参考になれば幸いです。

* * *
#### コンストラクタとは？

前回、インスタンスの生成から、インスタンスフィールドの値をセットする方法あたりを行ってきましたが、このインスタンスフィールドが増えると記述も面倒だし、わかりづらかったりします。

そこで登場するのが**コンストラクタ**です。

詳しく説明すると、クラスにはコンストラクタというものがあり、**newを使ってインスタンスを生成した後に自動で呼び出される特別なメソッド。**

#### コンストラクタの定義方法

下記2つの決まりを守ること。

**①コンストラクタ名は、クラス名と同じにする
②戻り値を書いてはいけない
(voidも書かない)**

```Person.java
class クラス名{
  コンストラクタ名() { // コンストラクタ名はクラス名と同じにする
  // インスタンス生成時に行いたい処理
  }
}
```
■具体例

```Main.java
Person person = new Person();

// 出力結果
インスタンスが生成されました
```

```Person.java
class Person{
  public String name;
  Person() { // インスタンス生成時に行われる処理
    System.out.println("インスタンスが生成されました");
  }
}
```
#### インスタンスフィールドの値セットを楽にする

下記のよな場合に、newでインスタンス生成した後に、自動で実行されるコンストラクタの中で、各フィールドに値をセットするようにする。

```Main.java
Person person = new Person();
Person.name = "Sasaki"; // 下記コンストラクタ内でセットしたい
```

```Person.java
class Person{
  public String name;
  Person() { 
    // ここでセットしたいのよ
  }
}
```

##### コンストラクタに情報を渡す

newでインスタンスを生成する際に、**new クラス名( )**の**( )**には引数を渡すことができる。そして、その引数は直後に呼び出されるコンストラクタに受け渡される。

下記のように、インスタンスを生成する際に、インスタンスフィールドにセットしたい値 ("Sasaki")を引数に渡し、コンストラクタでセットするよにする。
コンストラクタ内でも**this**を用いてインスタンスを利用することができる。
※**this**については後ほど解説


```Main.java
Person person = new Person("Sasaki");
System.out.println(person.name);

// 出力結果
Sasaki
```

```Person.java
class Person{
  public String name;
  Person(String name) { // String型 "Sasaki"を受け取る
    this.name = name; // インスタンスフィールドnameへ"Sasaki"をセット
  }
}
```
* * *
#### thisとは？
※はじめに、今回は長くなってしまうので詳しくは別記事で投稿したいと思います。

**this**とは、メソッド内でインスタンスフィールドにアクセスするために用いる特殊な変数のこと。
thisは、クラス内のメソッドの定義の中でのみ使用できる。
thisは、メソッドが呼ばれたときに、そのメソッドを呼び出しているインスタンスに置き換えられる。

■具体例

```Main.java
Person person = new Person("Sasaki");
person.name = "Sasaki";
person.hello();

// 出力結果
こんにちは、わたしはSasakiです
```

```Person.java
class Person{
  public String name;
  public void hello() {
    System.out.println("こんにちは、わたしは" + this.name + "です");
  }
}
```
* * *
#### おわりに
ちょっと複雑になってきましたが、確実に理解し使えるようにしていきたいですね。
なお、ご指摘などございましたら、遠慮なくお願いいたします！！
OSごとにフォントのサイズが違う場合の対処法


目次
---

1.	はじめに
2.	修正方法
3.	まとめ

はじめに
---

Konyでは、AndoridとiPhoneでラベルのフォントサイズを別々に設定することができるため、多人数での開発だと他のメンバーがAndroid・iPhoneどちらかのフォントサイズを変更してしまい、意図せずOS間で差が生じてしまうことがあります。

フォントサイズがずれる場合には、以下の2パターンが考えられます。  

1. skinがforkされていて、OS間で差が生じている
2. skinのjsonファイル内でiOS / Andoridのフォントサイズに違う値が設定されている

1は意図してiOSとAndoridの表示を分けているパターンだと思いますが、
2の場合は、意図せずフォントサイズがずれてしまっている可能性があります。  

この状態でビルドすると、同じ画面でもフォントのサイズが異なって表示されてしまいます。

|iPhone|Android|
|---|---|
| <img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/85304a6d-bd4b-1334-a0fe-5a3803008640.png" width=300px">| <img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/d27ce9d3-2c4b-82fe-abb3-272ef94e7a81.jpeg" width=300px">|




修正方法
---


### 1. skinがforkされていて、OS間で差が生じている場合

Konyはマルチプラットフォームのため、OS毎に異なるSkinやFormを表示する というFork機能があります。詳細はこちらをご覧ください。

https://docs.kony.com/konylibrary/visualizer/visualizer_user_guide/Content/Forking.htm


**1** の場合、AndroidもしくはiOS専用にSkinがForkされているはずです。

下の例では、対象のSkin選択後、Platform横にAndroid Nativeと記載されています。
また、右のリンクアイコンが外れているため、Android用の設定に切り離されていることが分かります。
ここでPlatform横の「...」をクリックします。

![スクリーンショット 2021-06-07 18.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/bf99840d-29bd-c5a4-bc9d-69c51318be6d.png)



Fork Skin ダイアログが表示されるので、OS間で差異がないように統一したい場合は、全てのチェックを外してください。  
![スクリーンショット 2021-06-07 18.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a0954544-b0b1-2b7d-589c-d1cf1dd777e6.png)

その後、一度フォントサイズを変更する事で、iOS / Andoridのフォントサイズを統一することができます。 

![image014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e827066d-5abf-1817-7fe1-7f7464b86e3e.png)


### 2. skinのjsonファイル内でiOS / Andoridのフォントサイズに違う値が設定されている

この場合、対象のskin.jsonを開いてみると、forkされていないのにiOS / Andoridでフォントサイズがずれてしまっていることがわかると思います。 
![スクリーンショット 2021-06-04 11.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/9b7777ea-0cf0-8491-fe2a-a4b02095cf26.png)

この場合は一度フォントサイズを変更する事で、iOS / Andoridのフォントサイズを統一することができます。  

#### Step 1

修正が必要なラベルを選択します。
![image008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/4dd6ae8a-6a48-4b21-b22e-c5e0bea435ef.png)

 

#### Step 2

画面右のSkinタブを選択し、フォントサイズを正しい値に修正します。
Andorid、iOSどちらを選択している状態でも、一度フォントサイズを変更すれば、フォントサイズが統一されます。  
![image014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e827066d-5abf-1817-7fe1-7f7464b86e3e.png)

 

#### ビルド結果

|iPhone|Android|
|---|---|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/1ea8e59d-5e67-a767-6e12-e1226e246ee6.png" width=300px">| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/e72d9449-5d08-af8c-3890-c27e1411cc56.png" width=300px">|








まとめ
---

この記事では、AndroidとiPhoneの間でフォントサイズがサイズが違う場合の対処法を紹介しました。複数プラットフォームを開発できるKonyだからこそ、OSごとのレイアウト確認は重要になりますね。
今回は以上です。この記事がお役に立てると嬉しいです:sunny:
【Python】pipコマンドのセットアップとライブラリのインストール方法

#`pip`コマンドとは
`pip`の正式名称は、`Pip Install Packages`で、パッケージ管理システムです。
Python2.7.9以降とPython3.4以降にデフォルトで付属されており、

`PyPI(Python Package Index)`に登録されているwheel形式のPython外部パッケージ
をpipを使用することで、インストールできます。

- `wheel形式`:Pythonのパッケージの形式（フォーマット）。 実態はzip形式のアーカイブで、`PEP427`で定義されている


#`pip`のセットアップ
##bash_profileにpythonコマンドのPATHを通しておく
```bash
# vimでbash_profileを編集
$ vi ~/.bash_profile

# insertモードで下記を追加(※versionは任意)
export PATH=$PATH:/Users/username/Library/Python/3.8/bin

# vimを抜ける => escを押してから:wqで保存

# bash_profileの更新を反映
$ source ~/.bash_profile
```

##pipのインストール
```bash
# get-pip.pyのダウンロード。任意のディレクトリに保存
$ mkdir ./pip
$ cd pip
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

# 保存したディレクトリで実行
$ python get-pip.py

# インストールの確認(version確認)
$ pip -V
```

#ライブラリのインストール
試しに、[requests](https://pypi.org/project/requests/)パッケージをインストールしてみます。
(2021/03/30時点)

```bash
# カレントディレクトリにrequestsをインストール
$ pip install requests -t .

Collecting requests
  Downloading requests-2.25.1-py2.py3-none-any.whl (61 kB)
     |████████████████████████████████| 61 kB 2.2 MB/s 
Collecting certifi>=2017.4.17
  Using cached certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
Collecting chardet<5,>=3.0.2
  Downloading chardet-4.0.0-py2.py3-none-any.whl (178 kB)
     |████████████████████████████████| 178 kB 3.3 MB/s 
Collecting idna<3,>=2.5
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.4-py2.py3-none-any.whl (153 kB)
     |████████████████████████████████| 153 kB 1.3 MB/s 
Installing collected packages: urllib3, idna, chardet, certifi, requests
Successfully installed certifi-2020.12.5 chardet-4.0.0 idna-2.10 requests-2.25.1 urllib3-1.26.4
```

#まとめ

ハマったところは

- 事前にpythonのPATHを通しておく必要があった
- `get-pip.py`を自分でダウンロードして、ダウンロードしたディレクトリでその展開が必要だった

`pip`って響き、なんかかわいい✨

以上、ありがとうございました。
Raspberry Pi 4にubuntu server 18.04のインストールをしてみる

Raspberry Pi 4 Model Bにubuntu server 18.04をインストールに苦戦したのでその議事録。

それと筆者はQiita投稿初なので読みにくい点があると思いますがご容赦ください。

# 作業環境&必要な道具

作業はwindows10のノートパソコン、Raspberry Pi 4 Model B(4GB RAM)を使用します。
他に今回の作業に使うハードウェアです。

- ノートパソコン関連
    - microSDカードリーダ搭載USBハブ

- Raspberry Pi関連 
    - microSD 32GB
    - ACアダプタ
    - キーボード(US配列)
    - microHDMI-HDMI変換アダプタ

# ubuntuイメージファイルのダウンロード

今回はubuntu18.04を書き込みます。しかし、[ubuntu公式のRaspberry Piのインストールガイド](https://ubuntu.com/download/raspberry-pi)では20.04or20.10のイメージしかダウンロードできません。

そこで、[wiki](https://wiki.ubuntu.com/ARM/RaspberryPi)から18.04のイメージをダウンロードします。

今回は__arm64の18.04.5 LTS__になります。

# microSDへの書き込み

イメージのダウンロードが終了後、Raspberry Pi公式の書き込みツール[Raspberry Pi Imager](https://www.raspberrypi.org/software/)を使ってmicroSDへイメージファイルを書き込んでいきます。

ノートパソコンに

Imagerを起動後、__CHOOSE OS__のUse customからダウンロードしたファイルを選択。

__CHOOSE SD CARD__から書き込むmicroSDカード選択し、 __WRITE__をクリックして書き込みます。

# Raspberry Piで起動

書き込み終了後、microSDをRaspberry Piに差し込み起動します。

少し待つと、ログイン画面が出てきます。デフォルトのパスは両方__ubuntu__です。
また、同時にパスワードを変更を行います

```
Login incorrect
ubuntu login: ubuntu
Password: ubuntu
(current) UNIX password: ubuntu
Enter new UNIX password: 新しいパスワード
Retype new UNIX password: もう一度新しいパスワード
```
ちなみに、login以外の入力内容は表示されない形になります。

パスワードの変更が成功したら、ubuntu serverの操作が可能になります。

# まとめ

以上でRaspberry Pi 4にubuntu server 18.04のインストールが出来ます。

本当はネットワーク設定についても触れたいですが、今回が初記事なのでここまでとします。

ネットワーク設定等はまた別記事としてあげます。

非常にありふれた内容ですが、誰かの助けになれば幸いです。

# 参考文献

[Raspberry Pi 4 Model BにUbuntu 18.04 をインストールする ](https://rt-net.jp/mobility/archives/12773)

[Raspberry Pi4 (メモリ4GB): Ubuntu18.04 + Xubuntu Desktopのインストールと設定](https://demura.net/education/17957.html)
【kintone】標準機能のドロップダウンとkintone UI Component v1のドロップダウンを連携させる

今回はkintoneの標準機能のドロップダウンと、kintone UI Component v1 のドロップダウンを連携させるサンプルです。



kintone UI Component v1 のドキュメントはこちら

https://kintone-ui-component.netlify.app/docs/components/desktop/dropdown



# アプリの準備

ドロップダウン、スペース、文字列(1行)フィールドをフォームに配置します。

| フィールド種類 | フィールド名 | フィールドコード |備考|
|:-:|:-:|:-:|:-:|
|ドロップダウン|会社|会社|選択肢は、任天堂、スクエニ、コナミ　など|
| スペース  |  -- | spDropdown  ||
| 文字列(1行)  | 好きなゲーム  | 好きなゲーム  ||


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b1bacd91-96e0-21ad-f1ae-c82f6fe6b42d.png)

# kintone UI Component v1 の準備
`JavaScript / CSSでカスタマイズ` に
kintone UI Component v1 のCDNを追加しておきます。

CDN : `https://unpkg.com/kintone-ui-component/umd/kuc.min.js`

# JavaScript

新規追加＆編集画面でドロップダウンが動くようにします。

```js
kintone.events.on(
  ["app.record.create.show", "app.record.edit.show"],
  (event) => {
    // コードを書くところ

  }
);
```

## スペースフィールドにドロップダウンを設置

kintone UI Component v1 でドロップダウンを設置します。
itemsを空っぽにしておくことと、idを設定しておくのがポイントです。
また、ドロップダウン変更イベントで文字列(1行)フィールドに選択した値を表示するようにしておきます。
（addEventListenerで書けます～）

```js
// ドロップダウンを設置するスペースフィールドの要素を取得
const spDropdown = kintone.app.record.getSpaceElement("spDropdown");
// ドロップダウンをつくる
const drGame = new Kuc.Dropdown({
  label: "ゲーム",
  requiredIcon: true,
  // items はからっぽにしておく
  items: [],
  // changeイベントで拾えるようにidを設定しておく
  id: "drGame",
  visible: true,
  disabled: false,
});
// スペースフィールドにドロップダウンを置く
spDropdown.appendChild(drGame);

// ドロップダウンを選択したときのイベント
drGame.addEventListener("change", () => {
  const r = kintone.app.record.get();
  // ドロップダウンで選択した値を文字列(1行)フィールド（フィールドコード：好きなゲーム）にコピー
  r.record.好きなゲーム.value = r.record.会社.value + "：" + drGame.value;
  kintone.app.record.set(r);
});
```

## 標準機能のドロップダウンのフィールド値変更のプログラム

標準機能のドロップダウンの値を変更したときはフィールド値変更イベントが発生します。
選択した値によってドロップダウンの中身を変更します。

```js
// ドロップダウンを変更するイベント
kintone.events.on(
  ["app.record.create.change.会社", "app.record.edit.change.会社"],
  (event) => {
    // ゲームドロップダウンの要素取得
    const drGame = document.getElementById("drGame");

    // 選択した会社によって、ドロップダウンのitemsを変更する
    switch (event.changes.field.value) {
      case "任天堂":
        drGame.items = [
          { value: "マリオ" },
          { value: "ゼルダ" },
          { value: "ポケモン" },
        ];
        break;
      case "スクエニ":
        drGame.items = [
          { value: "ロマサガ" },
          { value: "FF" },
          { value: "ドラクエ" },
        ];
        break;
      default:
        drGame.items = [
          { value: "ゴエモン" },
          { value: "ポップンミュージック" },
          { value: "メタルギアソリッド" },
        ];
    }
  }
);
```

全体的なコードは以下です。

https://gist.github.com/juridon/8b60015d3988aef62f9c12ca13ae906e

# 動作確認 ＆ まとめ

こんな感じに動きましたでしょうか？

![c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/1cfb2cbe-86c9-eae8-327d-0b7106dc4a3c.gif)

標準機能のドロップダウンとkintone UI Component v1 で作るドロップダウンが連携しています。

他のアプリのレコードをドロップダウンの選択肢にすることもできます。
↓こちらもご参考にどうぞ

https://qiita.com/juri_don/items/1d3910ac662597d7956b

kintone UI Component v1 を活用すればいろんなアプリが作れそうです＾＾ぜひチャレンジしてみてくださいね！
KiCad Mac備忘録

しばらく使ってないと忘れてしまうので自分用備忘録です
定期的に追加していきます。
KiCadでの基板作成から発注までは [シナモン&黒猫師匠さん](https://www.youtube.com/playlist?list=PLsyW_BP2JamO2kK_AF0CpfMbBZqKR53MW) の動画が大変参考になりますのでそちらをぜひご覧ください。

## シルク層に画像を入れたい

簡単に説明すると
ビットマップコンポーネントコンバーターを使用し、画像をPCBコンポーネントへ変換。
黒い部分が白く印刷されるので文字などがある場合はネガにチェックを入れ,分かりやすいフォルダに保存

PCBレイアウトエディタを開き
設定-->フットプリントライブラリを管理-->グローバルライブラリ-->保存したフォルダを追加

PCBレイアウトエディタに戻り、フットプリントを追加を押すと読み込まれます
追加したフォルダの名前が表示されているのが確認できれば成功です。

ビットマップコンポーネントコンバーターでは表示される予定の画像サイズが表示されるので適宜調整をしてください。
ちょっとずつわかりやす画像を追加していきたいと思います。

## ガーバーファイルの出力
今回オープンソースになってるArduinoUNOで制作しました。
基板外形は 54mm x 70 mm

PCBレイアウトエディタ-->プロット ここでガーバーファイルを作成していきます
今回Arduino Unoのプロジェクトを変換し読み込んでいるため通常 F.cu, B.cu となっている場所が Top, Bottom になっていますが発注した際特に問題なかったので問題ないと思います。
選択項目は一般的に 下記の8個のファイルになるようです。

```:[選択項目8個]
F.cu
B.cu
F.SilkS
B.SilkS
F.Mask
B.Mask
Eco2.User
Edge.Cuts
```
ガーバーファイル出力時の設定は下記のとおりです。
また画像２枚目のようにビックリマークが出ますがRefillで問題ないと思います。詳しい方教えて下さい。
![スクリーンショット 2021-03-30 16.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/fbfc071d-3601-01c7-0a8f-d0b3ecd7b371.png)
![スクリーンショット 2021-03-30 16.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/abe29ff4-43b5-7da2-b299-924bf7954fb0.png)
プロットを選択しガーバーファイルを出力できたら次はドリルファイルの出力です。
設定は下記画像のように設定し、ここでは先程は選択しなかったアウトプットフォルダーをクリックし出力フォルダの選択、ドリルファイルの作成をクリックし出力してください。今回は同じプロジェクトファイル内を指定し出力しました。
![スクリーンショット 2021-03-30 16.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/1a73aee8-0e21-c861-d38d-8d76ad072d4b.png)
ここまでできたらガーバーファイル8個 + ドリルファイル1個の 合計9個のファイルができていると思います。
![スクリーンショット 2021-03-30 16.38.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/bb9c0ccf-7f63-4d07-2620-993b4e9b63b1.png)

ガーバーファイル8個とドリルファイル１個は拡張子が以下のようになっています。

```:[ガーバーファイル一覧8個]
Top.gtl
Bottom.gbl
F_SilkS.gto
B_SilkS.gbo
F_Mask.gts
B_Mask.gbs
Eco2_User.gbr
Edge_Cuts.gm1
```

```:[ドリルファイル一覧1個]
.drl
```
ここまでできたら次のガーバーファイルの確認の項目でガーバーファイルに問題がないか確認をしてください。

## ガーバーファイルの確認
ここではGerbViewを使用して作成したガーバーファイルの確認をしていきます。
![スクリーンショット 2021-03-30 16.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/9bd9d416-0f18-5e6b-124a-bc04ce00875d.png)
上記画像のように左から3つ目のところをクリックし作成したガーバーファイルを選択します。このときドリルファイルを選択しないように注意してください。
次に左から4番目をクリックしドリルファイルを読み込み、右のレイヤータブから問題がないかチェック確認してください。
![スクリーンショット 2021-03-30 16.48.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/7a014562-4719-47f1-33e9-e52b8e0ae2fd.png)
お疲れさまでした。ここまでで特に問題がなければ作成した9個のファイルをフォルダにまとめzip圧縮し製造業者へ渡せばプリント基板になって届きます。ただし業者によっては事細かく設定が決まっていたりするのでその業者ごとにしっかり確認をして発注してください。
WSL2に外部からアクセスしたい

#WSL2に外部からアクセスする

ひとまず備忘録後で編集する
基本的にはpowershell管理者権限実行

やること
ファイアーウォールの設定
開放

```
$ New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 22 -Action Allow -Protocol TCP
$ New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP
```
設定削除

```
$ Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock'
```

ポートフォワード設定
ここでは22番

```
$ netsh interface portproxy add v4tov4 listenport=22 connectport=22 connectaddres=(wsl hostname -I).trimend() 
```

確認方法

```
$ netsh.exe interface portproxy show v4tov4
```

設定削除

```
$ netsh.exe interface portproxy delete v4tov4 listenport=22
```
macOS Big Surでpython 3.7.2のインストールがエラーになる

以下のエラーでpython 3.7.2がインストールできなかった。 (3.7.10, 3.8.8, 3.9.2は問題なくインストールできた)

```shell
% pyenv install 3.7.2
:
./Modules/posixmodule.c:8409:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        ret = sendfile(in, out, offset, &sbytes, &sf, flags);
:
```

ググってみたところ以下の解決策を見つけたので試してみたがうまく行かなかった。
- https://qiita.com/hisa_shim/items/abb4936f1f676fe6a7b8
- https://teratail.com/questions/323061

Pythonのソースを眺めていたところ、上記解決策にあるパッチファイルの行数がずれているようだったので修正したらうまくできました。

```patch:/tmp/a.patch
From 8ea6353f60625c96ce96588c70ff24a77f8c71f9 Mon Sep 17 00:00:00 2001
From: Ronald Oussoren <ronaldoussoren@mac.com>
Date: Thu, 25 Jun 2020 16:55:48 +0200
Subject: [PATCH] BPO-41100: Support macOS 11 when building (GH-21113)

---
 Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst | 1 +
 configure                                                       | 2 +-
 configure.ac                                                    | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)
 create mode 100644 Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst

diff --git a/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ded66b567a92db0b9266a8718dcf1ad60a89c5ed
--- /dev/null
+++ b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst
@@ -0,0 +1 @@
+Support macOS 11 when building.
diff --git a/configure b/configure
index c51f396824b63521034929cf98a37cee40b86254..5024860ca4395aa3a71de307a0e8335ceb2d77da 100755
--- a/configure
+++ b/configure
@@ -3375,7 +3375,7 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h
   # has no effect, don't bother defining them
   Darwin/[6789].*)
     define_xopen_source=no;;
-  Darwin/1[0-9].*)
+  Darwin/[12][0-9].*)
     define_xopen_source=no;;
   # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but
   # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined
diff --git a/configure.ac b/configure.ac
index 70deefb6b9aea660350ee3c0a52c5e701037464b..5a3e340aa3e72b5effe0bc3b69690a828122b9dd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -490,7 +490,7 @@ case $ac_sys_system/$ac_sys_release in
   # has no effect, don't bother defining them
   Darwin/@<:@6789@:>@.*)
     define_xopen_source=no;;
-  Darwin/1@<:@0-9@:>@.*)
+  Darwin/@<:@[12]@:>@@<:@0-9@:>@.*)
     define_xopen_source=no;;
   # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but
   # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined
```

```shell
% pyenv install --patch 3.7.2 < /tmp/a.patch
```
Redmineへのプラグイン追加(オフライン)とSVN連携

##オフラインでのEasy Gantt追加
社内プロキシ認証がコマンドプロンプトから突破できず、
RedmineにEasy Ganttをオフラインで導入する必要がありました。
基本は[こちら](https://qiita.com/waka_itsu/items/06d17ae191ccbe35aa34)を参照させて頂き導入することができましたが、
最後のインストールコマンドで下記を入力する必要がありました。

```linux-config
> cd C:\Bitnami\redmine\apps\redmine\htdocs
> bundle install  --path vendor/bundle --local
> bundle exec rake redmine:plugins:migrate RAILS_ENV=production
> bundle exec rake db:migrate RAILS_ENV=production
```

##SVN連携
SVNのリポジトリがWindows共有サーバかつ日本語名が入っていたため、
Redmine上でSVNサーバを起動させることしました。

###SVNのインストール
インストーラをダブルクリックにて実行し、下記画面にて、
`command line client tools`をインストールする設定に変更する。
※デフォルトではインストールされないようになっているため注意
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235333/6887cf02-aa9b-0b39-0803-535a91f7cf71.png" width=50%>

###svnserveコマンド実行
コマンドプロンプトを起動して下記コマンドを実行する。
サーバとして起動させるため、実行後はコマンドプロンプトをそのままにしておく。

```linux-config
> svnserve -d -r "\\fileserver\SVNリポジトリ"
```

###Remineの設定
**「プロジェクト > [PJ名] > 設定 > リポジトリ > 新しいリポジトリ > URL」**にて、
`svn://localhost/trunk`と入力して保存します。

##SVN文字化け対応
Redmineでソースの差分を確認したところ、日本語が文字化けされてました。
**「Redmine > 管理 > 設定 > ファイル > 添付ファイルとリポジトリのエンコーディング」**にて、
`utf-8,cp932,euc-jp`と入力して保存します。

ただし、キャッシュが残っているようなので、リポジトリの再登録が必要となります。
**「プロジェクト > [PJ名] > 設定 > リポジトリ > 削除」**を実施した後に再登録します。
【エラー備忘録】npm installの際「found 1 high severity vulnerability」といわれる

$ npm install コマンドを実行した際、

```

found 1 high severity vulnerability
run `npm audit fix` to fix them, or `npm audit` for details
```
と忠告されました。

```
$ npm audit
```
として修正が必要な点を探ります。
すると、

```
# Run  npm install --save-dev resolve-url-loader@3.1.2  to resolve 1 vulnerability
```
教えてくれたので、

```
$ npm install --save-dev resolve-url-loader@3.1.2
```
を実行します。

あとは、$ npm installを実行して実際にパッケージを更新します。

```
$ npm install
```