OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift]Realmファイル内容の確認方法

#1. この記事を書いた理由

iOSアプリを作るぞ！
→ Realm Swiftを使ってみよう！
　→ 実装してみたけどRealmファイルがちゃんと作られているかわからないよ〜！
　　→ **確認しよう！ (今ここ)**



#2. 実行環境
- MacOS Catalina : 10.15.7（19H2）
- Xcode : Version 12.0.1 (12A7300)
- Realm Studio : バージョン ~~5.0.1 (5.0.1.6)~~  10.0.0 

(2020年11月03日: Realm Studioのバージョンが10に上がりましたね)

#3. 手順

目次
3.1. 前提条件
3.2. Realm Studioのインストール
3.3. Realmファイルの居場所を確認
3.4. Realmファイルの確認


###3.1.前提条件
- シミュレータ上で実行。実機では試していません。(実機手順は3.3章の公式ドキュメントに記載あり)
- Realm Swiftを用いて、Realmファイルの生成までは済んでいる状態。以下は生成の例。

```example.swift
            let realm =  try! Realm()
            let data = "save data"

            try! realm.write {
                realm.add(data)
            }
```

###3.2. Realm Studioのインストール

#####3.2.1. インストール
[公式HP](https://realm.io/jp/products/realm-studio/#download-studio,'')よりRealm Studio-x.x.x.dmgをダウンロード。実行してインストール。

#####3.2.2. 起動
Launchpadより Realm Studioを起動する。

※「発行元が信頼されていないため、起動できません」という旨の警告が表示されて起動できない場合は、以下手順を実施。

>「システム環境設定」
　→「セキュリティとプライバシー」
　　→「一般」
　　　→「ダウンロードしたアプリケーションの実行許可」
　　　　　にRealm Studioが表示されているため、許可する。

#####3.2.3. 起動後
サインアップを求められるので、メールアドレスを登録。
![スクリーンショット 2020-10-23 20.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/812363/53fbbc3f-c017-3a9b-4ef9-400bc960fb45.png)


###3.3.Realmファイルの居場所を確認
公式情報によると、以下フォルダに生成されるとのこと。
>/Users/\<username>/Library/Developer/CoreSimulator/Devices/\<simulator-uuid>/data/Containers/Data/Application/\<application-uuid>/Documents/default.realm

引用元：[公式ドキュメント](https://realm.io/docs/javascript/latest/#realm-studio,"Realm")→[How to find my realm file?](https://stackoverflow.com/questions/28465706/how-to-find-my-realm-file/28465803#28465803,"")

ファイルの場所を確認する方法は、シミュレータ使用時にコマンド実行することで可能。
以下に説明していく。


#####3.3.1. Realmファイル生成後のタイミングにbreakポイントを張ってアプリを実行
![スクリーンショット 2020-10-23 7.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/812363/80682ca6-4eb0-5f10-66c5-09d0e33dfcad.png)


停止すると下部に(lldb)というコンソールが出る。

![スクリーンショット 2020-10-23 8.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/812363/3e4b16de-28b8-0ea0-90d2-bd100b9a4145.png)

#####3.3.2. lldbコンソールにてコマンド実行
```
po Realm.Configuration.defaultConfiguration.fileURL
```

![スクリーンショット 2020-10-23 8.12.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/812363/0e28a07e-76df-3c18-7b8c-813612c34123.png)

するとファイルパスが出力されます。




###3.4. Realmファイルの確認
ターミナルを開き、以下のコマンドを実行する。
(前手順で調べたRalmファイルパスをopenコマンドで開く)

```
open /Users/<username>/Library/Developer/CoreSimulator/Devices/<simulator-uuid>/data/Containers/Data/Application/<application-uuid>/Documents/default.realm
```

すると Realm Studio画面が起動して・・・
**ファイル内容が見れた！！！**　こうなってるんですね〜。
![スクリーンショット 2020-10-23 6.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/812363/81d1ad7c-5f31-7b73-4bec-b8f86e15950f.png)


#4. おわりに
お読みいただきありがとうございました。
iOSアプリ開発(勉強)を初めてまだまだ新米で分からないことだらけですが、少しずつ出来ていくのが楽し〜です。
本記事もどこかの同じようなアプリ開発者の参考になれば幸いです。

またQiita記事も初投稿でしたが、こちらもこれからもっと発信していきたいな〜と思います。
もし良かったらLGTM/フォロー等のアクションいただけるとスゴい嬉しいです！😂
【初心者でもわかる】セレクトボックスをselect要素を使わず、CSSとjsで再現する方法

# どうも7noteです。select要素にcssが使いにくいので、他の方法を考えてみました。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/selectbox/
Mayaの起動画面のロゴが旧バージョンになってしまった場合の対応方法

Windows10環境にて、アンインストールされていた Maya2017を再インストールしたところ、Maya2018 / Maya2020 の起動スプラッシュ画面が2017になってしまい、その後アプリも正しく起動せず下記のような画像が表示されるだけとなってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/fbae6d40-0bf8-f2ce-d4d7-ed6635d7113b.png)
Maya2017ではないのにmaya2017のフォルダを参照してしまっていますね。

---

ここで考えます。何かの共通変数を読んでしまってるに違いないと。環境変数が怪しいと。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/e1cf77e2-d0f3-2a24-df63-57259c402ead.png)
こんなのがいました。とても怪しいです。


https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2015/JPN/Maya/files/Environment-Variables-File-path-variables-htm.html

>MAYA_LOCATION
>Maya のインストール ディレクトリへのパス。この変数を設定しない場合、既定で/usr/autodesk/maya<バージョン番号> (Linux)またはC:¥Program Files¥Autodesk ¥Maya<バージョン番号> (Windows)が使用されます。

この変数を削除してみると、、、


正しくMaya2018もMaya2020も立ち上がりました。Maya2017のセットアップがお行儀悪いんですかね。ニントモカントモ！
Power AutomateでExcelのクエリを行う際に、Excelの列名で気をつけること

# はじめに

SharePointやExcelのデータを扱う際に、複数データを一括で読み込む事は多々あるかと思いますが、その際、全件ではなく特定のフィルタで予め絞り込みをしたほうが便利な事も多いです。

SharePointの場合は列名が分かれば大体なんとかなるのですが、Excelの場合、列名によってはフィルタクエリがエラーになる事があるようです。

ハマると結構ドツボにハマるので、メモを残します。

# 基本の書き方

フィルタークエリの欄に次の形式で書きます。

`列名 比較演算子 '値'`

列名はそのまま表記、値はシングルクォーテーションで囲います。
一例です。

`名前 eq '田中'`

![Screenshot 2020-10-23 at 20.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/85532448-6f6f-cc9f-067f-74f262e8d8ab.png)

これだけならシンプルなのですが、この列名が曲者で、Excelで列名を修正しないとフィルタークエリの実行が難しいケースが多々ありました。

# フィルタ可能な列名の例

次に示すパターンの列名の場合、問題なくフィルタクエリを実行できます。

- 日本語
    - 例）名前
- 日本語＋数字
    - 例）住所1
- 英字
    - 例）Status
- 英字＋数字
    - 例）SP1
- 英字+_+数字
    - 例）PA_01

![Screenshot 2020-10-23 at 20.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/82818f7e-23f5-065f-dc72-1e85af89dcef.png)

# フィルタがエラーになる列名の例

次に示すパターンに該当すると、フィルタクエリがエラーになります。

- 改行が入っている
    - 例）<br>名前<br>(フリガナ)
- 数字で始まる
    - 例）10月
- ハイフンがある
    - 例）R2-10月

![Screenshot 2020-10-23 at 21.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/1722ea89-7a7f-a0d7-88a3-48126f892605.png)

ちなみに、Power Automateのエラーメッセージは文字化けしてしまい、何が悪いのかはっきりわかりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/7c7eaebf-3d8d-977d-8bae-55ee9d7fb3a7.png)

もしかしたら書き方があるのかもしれませんが、Excelの列名を修正してしまうほうが早いと思います。

# おわりに

時々自分でも忘れて苦しみます。同じ苦労をしている方に届けば幸いです。
AWSの構成図からワンクリックでリソースを作成できるサービスを作ってみた

# この記事について
AWSを学習しているときに構成図を見て、「この構成図にタグとかスペックを設定できて、ここから直接リソースを構築できたらいいのに！！」と思ったことがあるのは私だけでしょうか？
今回は、そんなサービスを作ったのでその紹介になります。

URL: https://guinfra.app
フィードバック: https://forms.gle/iqHVrFQRjkNKWefA8

(グラフ作成機能があったりキーの入力等の操作が必要だったりするので、PCからのアクセスを推奨しています！スマホからの方すみません🙇‍♂️)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381785/104431a4-2704-03a4-00e1-f716ae95efaf.png" />
# 自己紹介
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381785/a5fa1ee8-10b9-6676-1dba-81c6e824c8f9.png" width="400" />

鎌谷天馬と申します。N高等学校の3年生です。
2020年度の未踏ジュニアに採択していただき、今年の6月から「GUInfra」というクラウドインフラ学習サービスを開発してました。

[Twitter](https://twitter.com/tenma_0628) ← フォローしてください！

# GUInfraとは

## クラウドインフラについての現状と課題
昨今、AWSやGCPをはじめとする**クラウドインフラ**が盛り上がっています。AWSが落ちたときはTwitterのトレンドにも上がったりと、ITについての知識の有無に関わらずとも最低限知っている単語の一つにもなっているようです。
クラウドインフラを学習することで、個人開発をしたサイトのデプロイができるようになったり、単純に雇用が増えたりと様々な利点が存在します。にもかかわらず、巷ではAWSなどのクラウドインフラは難しいといった意見が多いようです。

そこで、私はこの原因を以下の二つに分析しました。
①VPCやIAMなどの、独自概念を理解するのが難しい
②コンソールが複雑。初学者にとって選ぶ必要のない選択肢も多数存在する

GUInfraは、以上の課題を解決するサービスです。

## どんなサービス？

GUInfraは、自作のグラフ作成ツールを提供してAWSの構成図を作成してもらい、実際にキーを入力してリソースの構築、破棄ができるようにしてそれを繰り返していただくことで、クラウドインフラ(現在はAWSのみに対応)の学習をサポートします。
また選択できるリソースやそのプロパティを初学者にとって学ぶのに必要な**最小限のもののみに限定**しているため、複雑なコンソールに悩むことなしにスムーズに学習を進めることができます。リソースは、「自力でネットワークを構築してEC2に静的なサイトをデプロイできる最低限のリソース」を意識して6つに選び抜きました。

## 実装について
以下にコード公開しています。
https://github.com/tenmakamatani/GUInfra-web

**Next.js / TypeScript**で実装していて、デプロイは[now](https://vercel.com)を利用しています。
グラフ作成の部分は、[react-rnd](https://www.npmjs.com/package/react-rnd)と言うライブラリを、そしてAWSとの通信はAWSが公式で出している[aws-sdk](https://www.npmjs.com/package/aws-sdk)を利用しています。
デプロイに利用したnowはNext.jsにも対応していて、コマンド一発で簡単にデプロイできるだけでなく、Dev環境とProd環境を分けることができたり、Prod環境の方にドメインを設定できたりと、開発体験がめちゃくちゃ上がるのですごくおすすめです！

# 今後の展望、課題
- リリースしたばかりなので、まずはユーザの生の声を聞きたいと思っています。使っていただけた方、是非右下のフィードバックフォームから感想を送っていただければと思います！！
- このバージョンではVPCやEC2などの基本的な知識については前提となっているため、本当に初学者の方に対する誘導はまだ存在しません。なので、各リソースへの説明や教科書的なものを実装したいと思っています。

# 作ってみて
グラフ作成機能やAWSとの通信機能など、シンプルなWebサービスとは違った独特な機能に開発が手こずったことはあったものの、私が求めていた機能を実現することができました。しかしまだ私の仮説を実現した段階であるため、様々な人からのフィードバックを得て、より良いサービスに進化させていきたいと思っています！
使っていただけた方、最初に貼ったフォームからフィードバックをくださるとめちゃくちゃ嬉しいです！！
Rails Tutorial 第2章学習編

#Rails Tutorial 第2章で(。´・ω・)ん?って思ったところ

>演習
CSSを知っている読者へ: 新しいユーザーを作成し、ブラウザのHTMLインスペクター機能を使って「User was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?

Google Chrome　Shift+Ctrl+I or (F12)　or 右クリックした中にある検証をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808789/6e9943cb-fe49-2b6f-861f-59269d41133f.png)
HTML・CSSコードが見れます、
この機能を使って「User was successfully created.」を調べろって事だと思います('ω')ノ
もう少し詳しく知りたい方は⇒[こちら](https://www.youtube.com/watch?v=qmfIMa8eFlE)をどうぞ 

##簡単な内容のおさらい。

#####ユーザー登録機能を作る
<b>魔法のコマンド <font color="red"> 『 Rails g scaffold 』<font color="black">( scaffoldは日本語で足場という意味 ) 　


```terminal
$ rails generate scaffold User name:string email:string
$ rails db:migrate
```

このたった２つコマンドを叩くだけでこんなページが出来上がる。
ユーザー登録が出来る・・・もはや魔法の領域。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808789/8ecd7d6d-f56b-6a4a-8362-082f711bcdac.png)

<b> Scaffoldの欠点

* データ検証がない。(空欄・でたらめなアドレスでも登録できちゃう)
* ユーザー認証がない。(ログイン・ログアウト機能はない。誰でもユーザーページにアクセスできちゃう)
* レイアウトやスタイルが整っていない。
* テストが書かれていない。
* 理解が困難。

#####投稿機能を作る

```terminal
$ rails generate scaffold Micropost content:text user_id:integer
$ rails db:migrate
```
先ほどと同じく２つコマンドを叩くだけとはいかない。
※ルーティングを追加する必要がある。

```ruby　config/routes.rb
Rails.application.routes.draw do
  resources :microposts　# ←これを追加するとurl/micropostで投稿ページにアクセスできる
  resources :users
  root 'users#index'
end
```

#####models/micropost.rbにvalidatesを追加する事で検証機能を実装できる

```ruby　app/models/micropost.rb
class Micropost < ApplicationRecord
  validates :name, length: { maximum: 140 }　#入力できる文字列は140文字まで
                   presence: true　#文字列が入力されている事を確認する
end
```
#####異なるデータモデル同士の関連付ける

```ruby　app/models/user.rb
class User < ApplicationRecord
#ユーザーはマイクロポストを沢山持ってるのでhas many :micropostを追加
  has_many :microposts
end
```

```ruby　app/models/micropost.rb
class Micropost < ApplicationRecord
#マイクロポストはユーザーに紐づいているのでbelongs_to :userを追加
  belongs_to :user
  validates :content, length: { maximum: 140 }
end
```

これでRDBの関連付けが完了する。わ～い簡単( *´艸｀)

#####Rails Console (Railsアプリを対話的に操作できる便利ツール)

```terminal
# Rails コンソール
$ rails c
>> #ここにRubyコード記述をすると実行してくれる

>> first_user = User.first # Userテーブルからidが1のユーザーを変数first_userに格納

コマンドの処理内容
User.first
↓　(自動的にデータベースを操作するSQLコマンドに変換される。)
User Load (0.2ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC
  LIMIT ?  [["LIMIT", 1]]
↓　SQLの実行結果
 => #<User id: 1, name: "Michael Hartl", email: "michael@example.org",
 created_at: "2020-10-23 00:39:14", updated_at: "2020-10-23 00:41:24">
↓　
SQLの実行結果をfirst_userに格納

>> first_user.microposts #先ほどのユーザーが投稿したmicropostを全部取り出す。
Micropost Load (3.2ms)  SELECT "microposts".* FROM "microposts" WHERE
  "microposts"."user_id" = ? LIMIT ?  [["user_id", 1], ["LIMIT", 11]]
 => #<ActiveRecord::Associations::CollectionProxy [#<Micropost id: 1, content:
 "First micropost!", user_id: 1, created_at: "2020-10-23 02:04:13", updated_at:
 "2020-10-23 02:04:13">, #<Micropost id: 2, content: "Second micropost",
 user_id: 1, created_at: "2020-10-23 02:04:30", updated_at: "2020-10-23
 02:04:30">]>

>> micropost = first_user.microposts.first #first_userの1番目の投稿を変数micropostに格納

```

##感想
この章はあまり躓かなかったです。('ω')ノ
git＆herokuの便利さに惚れ惚れしてきました。
anacondaのPATHの微妙な違い

ubuntu18.04.5

コマンドプロンプト立ち上げ時、
.bashrcに指定されたパスのファイルがない云々のエラーが出る。
勢い余って.bashrc編集時にanaconda関連のPATHを削除→保存。
再度設定しようとするも、anaconda3のディレクトリがそもそもどこにもない。
(え？昨日まで使うことができてたあのconda環境は幻......?)

再度インストールするけどPATHが通らない。
「condaコマンドなんかない」「ないわけないやん！」

<h3>解決法

試行錯誤の末、

```
export PATH="$home/anaocnda3/bin:$PATH"
```
じゃなくて

```
export PATH="~/anaconda3/bin:$PATH"
```
だとパス通った。

<h3>追記

おそらくミスだろうが、まず一つ目のPATHが/(root)開始じゃないことが気になる。
そしてそもそも、ホームディレクトリとhomeディレクトリは必ずしも＝ではない。
むしろ、UbuntuやRed Hutはユーザ・プライマリ・グループという設計方式を採用しており、/homeディレクトリ内にそれぞれのユーザ所有のホームディレクトリが作成されるので、基本的には(ユーザ名がuser01なら)/home/user01/が~/と等しい。
【JavaScript】Javascript使うなら知っておくべき型意識



あるレスポンス値から取得した配列から、ある条件に合致した要素オブジェクトを取得したい。

そんな時の条件式で、気をつけなければならないことをまとめます。


# 様々な条件式での取得

```javascript:
data () {
  return {
    staff_id: "",
  }
}
```

```javascript:
/// 取得できる
const staff = res.data.find((staff) => staff.id == this.staff_id);

/// 取得できる
const staff = res.data.find((staff) => staff.id == Number(this.staff_id));

/// 取得できない
const staff = res.data.find((staff) => staff.id === this.staff_id);

/// 取得できる
const staff = res.data.find((staff) => staff.id === Number(this.staff_id));
```


# 型まで合致させるかさせないか

`==`は、型は一緒じゃなくてもいいが、中身が一緒であればtrue
`===`は、型も中身も一緒な場合のみ、true

つまり3番目の条件式では、中身は一緒だけど型まで一緒なやつはいないよという言われることになります。


# 型を合わせるメソッド

```javascript:
/// 文字列→数値
Number('123');
parseInt('123')

/// 数値→文字列
String(123)
123.toString

```
ラバーダック・デバッグってなあに？

##ラバーダック・デバッグとは
ラバーダック・デバッグとはプログラミングにおけるコードのデバッグ手法の一つです。

プログラマーがラバーダックを持ち歩き、アヒルにコードを1行ずつ説明することによってデバッグを行うという話が由来です。
この手法には多くの別名があり、様々な無生物が用いられています。

##ラバーダックデバッグの利用方法
この手法の使い方はシンプルで、ラバーダックのように、無生物の物体に、コードを説明するだけです。
言葉にすることで、頭の中で問題が整理されて、その問題を突破することができるかもしれません。

## 実際プログラミングに当てはめてみると
実際にプログラミングに当てはめてみると、以下のようか効果があるかもしれません。

- 目的のコードと実際の挙動を説明することで、その違いに気付くことができる。

- 問題を説明することで、その解決策を思いついたりすることができる。

##ラバーダックデバッグを正しく行うために
ラバーダックと問題を正しく共有するためには、わかりやすく、明確に説明をする必要があります。

また、アヒルに話かける時は、知識や経験がない素人に話しかけるのと同じです。
素人に話すのと同じように、専門用語を避けて、相手がイメージしやすいように話さなければいけません。
それを意識して言葉にすることで、より頭がクリアになり、問題に直面できるようになります。

##最後に
ラバーダックデバッグはプログラミング以外の場面でも、問題に直面した場合に役に立つかと思います。

プログラミングはもちろん、プログラミング以外の場面でも何かに行き詰まった場合にはぜひアヒルに話しかけて見てください。
きっと頭が整理されて、問題解決につながると思います。
ゼロトラストネットワークについて語る

#1.初めに

ネットワーク、セキュリティ、機械学習など、総合的知識が求められるゼロトラストネットワークシステムを個人で作ってみようという企画。
知識のベースはオライリー社の出版する<a href="https://www.oreilly.co.jp/books/9784873118888/">ゼロトラストネットワーク -境界防御の限界を超えるためのセキュアなシステム設計-</a>から得られる理論体系をベースに、オリジナルでゼロトラストネットワークのシステムを構築してみようというものである。

※本記事の殆どはメモみたいなものですが、ゼロトラストネットワークの認識共有のためにお使いください。

ゼロトラストネットワークの様々な要素はまだ標準化されておらず、「ゼロトラストネットワークを作ろう！」なんて本は存在しないため、構築には手探りな作業が不可欠である。そのため、長期プロジェクトになると予感される。
今回のプロジェクトを通して、システム設計の手法、機械学習の手法、ネットワークセキュリティへの理解を深めていきたい。
<h3>【注意】:ゼロトラストを語るには未熟すぎることは100も承知です。間違った解釈などの指摘は僕の将来のためになるので、遠慮なくコメントの方をよろしくお願いします。</h3>

#2.ゼロトラストネットワークとは？
ゼロトラストネットワークは現在のファイアウォールに代表される境界型ネットワークの脆弱性を見つめ直した、新しいネットワークセキュリティの形である。ゼロトラストとは誰も信用しないという意味合いである。
新しいものを語るためには古いものを語らなければならない。まずは境界型ネットワークについて考える。
##2.1.境界型ネットワーク
ネットワークについて造詣の深い人ならば当然といってしまえばそうなのであるが、会社などの大規模システムを運用する場所では以下に示すように、ルータから送られてくる外部からの通信をファイアーウォールによって管理し、外部に公開するシステムをDMZ(非武装地帯)、外部に公開してはいけないサーバ群を内部ネットワークに設置する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/504fdd14-47d8-ab00-e28d-4491c5b50006.png" width=80%>
※簡単な組織のネットワークモデルwith侵入者
<h3>境界型ネットワークの脆弱性</h3>
境界型ネットワーク(=FWによる防御)の脆弱性は単に（´-`）.｡oO（境界内部のネットワークなら安全!)という(思考が止まった)考え方に起因している。内部のネットワークに一度侵入を許してしまえば、侵入者は内部ネットワークのサーバを好き放題できる。
先ほどの内部ネットワークのところにいる悪魔は某国のハッカーかもしれないし、セキュリティ観念の杜撰な年功序列だけでのし上がった無能社員かもしれない。情報を漏らしてしまえば、両者の扱いは(ほぼ)同じだ。

内部ネットワークにアクセスできる人間も、もしかしたら会社に恨みを抱き、内部の機密データを盗んでやろうという陰謀に燃える人間かもしれないからだ。内部にも外部にも敵はあり得るのだ。






##2.2.ゼロトラストネットワーク
<h3>例えば....</h3>
例えば、銀行の口座情報を口座管理の部署の新米配属の人がアクセスする、なんて事態は聞いただけでもぞくっとするだろう。新人にそのような権限を与えるのはもってのほかである。

では、管理職の人間が、駅の通信が暗号化されない公衆ネットワークから口座管理のデータベースにアクセスするのはどうだろうか？

権限的にはアクセス管理は正しいのかもしれないが、VPNなどで暗号化通信を利用していても、機密性の高い情報にそんな場所にアクセスするのは(おそらく)間違いであろう。

また、管理職が友人のPCからアクセスするのもおかしい。しかし、現段階の認証ではそのようなアクセスも通ってしまうだろう。そのような現段階のネットワークセキュリティの脆弱性を対処療法的ではなく、根本から見つめ直す仕組みが「ゼロトラストネットワーク」である。

<h3>境界型の脆弱性をカバーするための基本原則。</h3>
まずはゼロトラストネットワークの基本原則をみてみる。

・ネットワークは常に安全ではないとみなされる
・ネットワーク上には外部及び内部の脅威は常に存在する
・ネットワークを信用できると判断するにはローカルネットワークでは不十分である
・デバイス、ユーザ、ネットワークフローは一つ残らず認証及び認可される
・ポリシーは動的であり、できるだけ多くの情報源に基づいて作成されなければならない

※ <a href="https://www.oreilly.co.jp/books/9784873118888/">ゼロトラストネットワーク -境界防御の限界を超えるためのセキュアなシステム設計-</a>より抜粋

ゼロトラストネットワークの基本原則＝境界型の根本的な問題のカバーとも考えられるだろう。

#3.じゃあゼロトラストって結局のところなんなの?
ゼロトラストの真髄は「信頼、信用を動的に管理」することにあるように思える。

境界型ネットワークの静的な認証・認可(この人なら大丈夫、このアクションなら大丈夫、内部なら安全のような考え方)に加え、動的な信頼値(場所、端末、日時、管理権限(の詳細なスコア)、IPアドレスなどから導き出されるスコア)を加える。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/3fcec9b6-2a74-0bd3-1c80-9505fa9c8a45.png" width=80%>
そんな仕組みを現在の境界型ネットワーク上に覆いかぶさる形で実装するシステムが、「ゼロトラストネットワークである」

手もつかれてきたのでここで一旦おわり。
次はどうやってゼロトラストシステムを作るの？っていうのを考えていこう。
PostgreSQLにてビューの権限だけで別スキーマの実テーブルの中身は参照可能か

## 概要
PostgresSQLでスキーマBの実テーブルを参照するビューをスキーマAにつくったとき、
スキーマAの参照権限しか持たないユーザーはビューを介してスキーマBの実テーブルの中身を参照ができるのかを知りたい。
通常のビューとマテリアライズドビューで違いがあるかも把握しておく。

（ぱっと見つからなかったけど、ドキュメントで仕様明記されている箇所が見つかったらリンク貼る）

## 準備（superuserにて）
### スキーマAと確認用テーブルを作成（schema_a）

```sql
CREATE SCHEMA schema_a;

CREATE TABLE schema_a.test_users
(
id serial not null,
name varchar(200)
);

INSERT INTO schema_a.test_users (id, name) VALUES (DEFAULT, 'テスト太郎');
```

### スキーマBと検証用のビュー元テーブルを作成（schema_b）

```sql
CREATE SCHEMA schema_b;

CREATE TABLE schema_b.main_users
(
id serial not null,
name varchar(200)
);

INSERT INTO schema_b.main_users (id, name) VALUES (DEFAULT, 'メイン太郎');
```

### スキーマAに通常のビューを作成

```sql
CREATE VIEW schema_a.main_users_normal_view AS SELECT * FROM schema_b.main_users;
```

### スキーマAにマテリアライズドビューを作成
```sql
CREATE MATERIALIZED VIEW schema_a.main_users_materialized_view AS SELECT * FROM schema_b.main_users;
```

### 検証用ユーザーを作成し、スキーマAのテーブル・ビューの参照権限を付与
```sql
CREATE USER test_user PASSWORD 'XXXXXXXXXX';
GRANT ALL ON ALL TABLES IN SCHEMA schema_a TO test_user;
GRANT USAGE ON SCHEMA schema_a TO test_user;
```

## 検証（作成したtest_userにて）
### 権限のあるスキーマAの実テーブル（念のため見れることを確認）
```sql
SELECT * FROM schema_a.test_users;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1403/ed9ca683-570f-97b2-604c-2c08a2d1bad1.png)

→ 見れる


### 権限のないビュー元スキーマBの実テーブル（念のため見れないことを確認）
```sql
SELECT * FROM schema_b.main_users;
```

```bash
ERROR: permission denied for schema schema_b
```

→ 見れない


### スキーマAの通常のビュー
```sql
SELECT * FROM schema_a.main_users_normal_view;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1403/d5be886d-2d27-d85a-40ec-376a61b444f3.png)


→ 見れる


### スキーマAのマテリアライズドビュー
```sql
SELECT * FROM schema_a.main_users_materialized_view;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1403/f7833ae1-f721-f39c-7a81-170b3fbec5aa.png)

→ 見れる



## まとめ
通常のビュー・マテリアライズドビューどちらの場合も、実テーブルの参照権限がなくともビューの権限があれば見れる。

|対象|結果|
|:-:|:-:|
|通常のビュー|見れる|
|マテリアライズドビュー|見れる|

元テーブルの一部カラムだけ見せたいケースや、複数のスキーマから統合したビューを見せたいときなどに使えそう。
[Ruby] 二次元配列の取り出し

この記事ではmacOS Catalina10.15.6にインストールしたRuby 2.6.5を使っています。

#二次元配列とは
- __配列の中に配列が入っている形__です。
- items_priceのハッシュの中にそれぞれのアイテムが配列として格納されています。
- さらに、１つ１つのアイテムの中にも名前と値段の配列が入っています。

```ruby
items_price = [["pen", [100, 200, 120]], ["book", [120, 150, 220]], ["pen_case", [1000, 1500]]]
```

#二次元配列を取り出すには
- each文を使ってハッシュを取り出します。
- 今回は二次元なので2回each文を使っているのですね。

```ruby
items_price = [["pen", [100, 200, 120]], ["book", [120, 150, 220]], ["pen_case", [1000, 1500]]]

items_price.each do |item|
  sum = 0
  item[1].each do |price|
    sum += price
  end
  puts "#{item[0]}の値段は#{sum}円です。"
end
```
では、penを例に取って一つずつみていきます。

### 1回目のeach(2行目)
```ruby
items_price.each do |item| ~ end
# => items_price配列の中の["pen", [100, 200, 120]]を取り出し、ブロック変数itemに代入
```
### 2回目のeach(4行目)

```ruby
item[1].each do |price| ~ end
# => item配列の中の[100, 200, 120]を取り出し、ブロック変数priceに代入
```
- ちなみに、item[1]はprice配列の要素の数、つまりここでは3回繰り返すことになります。

### 出力する
```ruby
puts "#{item[0]}の値段は#{sum}円です。"
```
- item[0]はitem配列の添字が0、["pen", [100, 200, 120]]の"pen"の部分になります。

#結果
```
penの値段は420円です。
bookの値段は490円です。
pen_caseの値段は2500円です。
```
ラズパイ4にUbuntu20.04.1を入れる


Raspberry Pi Imagerを使えばGUI上で簡単にSDにimageを入れることができます。
https://www.raspberrypi.org/downloads/


##そのほか
全体の流れ
https://qiita.com/quailDegu/items/63114ba1e14416df8040

ネットワーク設定で参考にしたサイト
https://www.yokoweb.net/2018/05/09/ubuntu18-network-fix-ip-address/

その際に起きたエラー。lan serviceがうまく動いていないみたい。。。

```
Failed to start netplan-wpa-wlan0.service: Unit netplan-wpa-wlan0.service not found.
Traceback (most recent call last):
  File "/usr/sbin/netplan", line 23, in <module>
    netplan.main()
  File "/usr/share/netplan/netplan/cli/core.py", line 50, in main
    self.run_command()
  File "/usr/share/netplan/netplan/cli/utils.py", line 179, in run_command
    self.func()
  File "/usr/share/netplan/netplan/cli/commands/apply.py", line 46, in run
    self.run_command()
  File "/usr/share/netplan/netplan/cli/utils.py", line 179, in run_command
    self.func()
  File "/usr/share/netplan/netplan/cli/commands/apply.py", line 173, in command_apply
    utils.systemctl_networkd('start', sync=sync, extra_services=netplan_wpa)
  File "/usr/share/netplan/netplan/cli/utils.py", line 86, in systemctl_networkd
    subprocess.check_call(command)
  File "/usr/lib/python3.8/subprocess.py", line 364, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['systemctl', 'start', '--no-block', 'systemd-networkd.service', 'netplan-wpa-wlan0.service']' returned non-zero exit status 5.
```
###解決策

```
sudo systemctl start wpa_supplicant
shutdown now
sudo netplan generate
sudo netplan apply
```
FizzBuzzプログラム（２種類）

#要件１
・正の整数（自然数）の入力を求める。
・与えられた数字が15の倍数の場合は、"FizzBuzz"と出力
・3の倍数の場合は、"Fizz"と出力
・5の倍数の場合は、"Buzz"と出力
・それ以外の倍は、そのまま数字を出力

###コード例

```rb
num = gets.to_i

def fizzbuzz(num)
  if num % 15 == 0
    puts "FizzBuzz"
  elsif num % 3 == 0
    puts "Fizz"
  elsif num % 5 == 0
    puts "Buzz"
  else
    puts num
  end
end

fizzbuzz(num)
```

#要件２（さきほどのコードの改良版）
・自然数の入力を求める。
・1からその数まで、"Fizz","Buzz","FizzBuzz","数字"のいずれかを出力する。
**例）入力値が９　→ 1,2,Fizz,4,Buzz,Fizz,7,8,Fizz**
・0や文字列を与えられた場合は、再度入力を求めることができる。

###コード例

```rb
puts "０以外の数字を入力してください"

input_number = gets.to_i
num = 1

def fizzbuzz(input_number,num)
  input_number.times do
      if num % 15 == 0
        puts "FizzBuzz"
      elsif num % 3 == 0
        puts "Fizz"
      elsif num % 5 == 0
        puts "Buzz"
      else
        puts num
      end
        num += 1
  end

  if input_number == 0
      puts "０または文字列が入力されました。もう一度入力してください。"
      input_number = gets.to_i
      fizzbuzz(input_number,num)
  end
      
end

fizzbuzz(input_number,num)
```
DockerでMariaDBが起動しない【 InnoDB: Failed to set O_DIRECT on file ./ibdata1: OPEN: Invalid argument, continuing anyway. O_DIRECT is known to result in 'Invalid argument' on Linux on tmpfs】


Dockerにて、下記のエラーによりMariaDBが起動しない時の対処した方法です。

```
[Warning] InnoDB: Failed to set O_DIRECT on file ./ibdata1: OPEN: Invalid argument, continuing anyway. O_DIRECT is known to result in 'Invalid argument' on Linux on tmpfs
[ERROR] Plugin 'InnoDB' init function returned error.
mariadb_1 
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
mariadb_1  
[Note] Plugin 'FEEDBACK' is disabled.
mariadb_1  
[ERROR] Could not open mysql.plugin table. Some plugins may be not loaded
mariadb_1 
[ERROR] Unknown/unsupported storage engine: InnoDB
mariadb_1   
[ERROR] Aborting
```

## docker-compose.ymlを修正することで解決

```yml:docker-compose.yml
mariadb:
    build: ./mariadb
    volumes:
      - ./mariadb/data:/var/lib/mysql
    ports:
      - 3306:3306
```
↓↓↓↓↓↓↓

```yml:docker-compose.yml
mariadb:
    build: ./mariadb
    volumes:
      - ./mariadb/data:/var/lib/mariadb #変更
    ports:
      - 3306:3306
```

`/var/lib/mysql`を`/var/lib/mariadb`に変更することでMariaDBを起動することができました。
predicateとは？表示されたときの対応方法

#predicateとは？表示されたときの考え方

Google Chromeのconsoleで関数を入力した時に表示されるpredicateについて。

例えば、以下のように`findIndex関数`を入力したときに表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/247dbcb8-c3fb-182c-b2c2-9ed0959dd4ae.png)


vscodeだと以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/f2412367-1222-d14c-59e3-f0f8f3fda71b.png)


##predicateとは？
**「真偽値を返す関数」**のこと。

ググると述語などと出てしまう。プログラミング用語なので、wikipediaで見ると納得できる。

>a predicate is commonly understood to be a Boolean-valued function P: X→ {true, false}


##真偽値を返す関数とは？

よく使われるのは、比較を行っている式。（==, >, < など）

```js:
a = [1,3,2,5,4]
a.findIndex((x)=> x==3)

#1
```

x==3かどうかを判定している。Yesならtrue、Noならfalseとなる。



<br>

##アロー関数　`((x)=> x==3)`
カッコ内の式はアロー関数。functionで書く関数を簡易化したもの。

xは任意の値。findIndexの場合、オブジェクトで指定した配列の要素が一つ一つ入る。(for文で回している状態と同じ)

このxが３と等しいかを判断してる。



```js:アロー関数を使わない場合
a.findIndex(function(x){
    return (x==3)
})
```
Raspberry Pi に Ubuntu 20.10 をヘッドレスインストール

Raspberry Pi に Ubuntu をインストールする方法です。
インストールしてログインすると、次のようになります。
![ubuntu_oct23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f0ea4a97-cfb7-49db-8838-e5c80684bb36.png)

```text
$ uname -a
Linux violet 5.8.0-1006-raspi #9-Ubuntu SMP PREEMPT Fri Oct 16 12:55:30 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
uchida@violet:~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.10 (Groovy Gorilla)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.10"
VERSION_ID="20.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=groovy
UBUNTU_CODENAME=groovy
```

1) ダウンロード

[ubuntu-20.10-preinstalled-server-arm64+raspi.img.xz](https://cdimage.ubuntu.com/releases/20.10/release/ubuntu-20.10-preinstalled-server-arm64+raspi.img.xz) をダウンロード

2) 解凍

```bash
unxz ubuntu-20.10-preinstalled-server-arm64+raspi.img.xz
```

3) SD へ書き込み

```bash
sudo dd bs=4M if=ubuntu-20.10-preinstalled-server-arm64+raspi.img of=/dev/mmcblk0
```

4) SD をマウント

```text
/dev/mmcblk0p2   2893600  1908752    818148  70% /media/uchida/writable
/dev/mmcblk0p1    258095    77906    180189  31% /media/uchida/system-boot
```

5) wifi を有効にする為に /media/uchida/system-boot/network-config を編集

```text:/media/uchida/system-boot/network-config
（省略）
wifis:
  wlan0:
    dhcp4: true
    optional: true
    access-points:
      "HomeNet":
        password: "12345678"
（省略）
```

6) Raspberry Pi にSD を挿してブート

7) 10分程待つ　（これが重要です）

8) Raspberry Pi の電源を入れ直す

9) ssh 接続

```bash
ssh ubuntu@192.168.1.10
```

パスワードは ubuntu です。
IP アドレスは、ping であたって探しました。

インストール後は、avahi-daemon をインストールして、次のようにして、ログインできます。

```bash
ssh ubuntu@violet.local
```

参考ページ
[Installing Ubuntu in Raspberry Pi 4 (Normal and Headless)](https://iot4beginners.com/installing-ubuntu-in-raspberry-pi-4-normal-and-headless/)

タイムゾーンを JST に変更

```bash
sudo timedatectl set-timezone Asia/Tokyo
```
SQL Server: ヒープ+非クラスタ化インデックスで構成されるテーブルのDELETEが遅い

#背景

```sql
delete from Table where Column1 = 'xxxx' 
```

このクエリ起因でブロッキングが数分間継続して発生したため、原因について調査しました。
いつもは1分以内に完了するクエリなのですが、たまに原因不明で10分以上実行されることがあり、そのタイミングで他のクエリをブロックしているようでした。

# テーブル構成
ヒープ＋Column1がキーの非クラスタ化インデックス
レコード数：約20万行

# 調査方法
[こちら](https://qiita.com/maaaaaaaa/items/6ac29bf213732e0b383d)の方法で1分毎にDMVのダンプをテーブルに保存していき、事象が再現した時の実行状態の遷移を確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/3a01d2f4-637c-ca3e-049d-48f7e17ab78d.png)

1分毎のスナップショットの情報なので、間の状態遷移は正確にはわかりませんが、すべてstatus=runnable/last_wait_type=PAGELATCH_EXであることから、10分間ずっとこの状態であったと予想されます。

また、レコード数は20万行ほどしかなく、インデックスの容量も20MB程度しかないのですが、logical_reads（論理読み取り）のサイズが非常に大きく、最終的に10GB以上読み取っているという特徴もみられました。

そのタイミングだけレコード数が非常に多かったのでは？という気もしたので、レコード数の推移についても確認ましたが、大きな変化はみられませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/c842a57e-4a68-01c2-bc77-6f1ba1a78226.png)

テーブルサイズは常に約２０万レコードくらいで14-20MBくらいであるにもかかわらず、10GBオーバーの論理読み取りが発生しているということは、実行プランがおかしくなっていてスローダウンしている可能性が考えられます。

query_plan_hashは、実行プランが同じなら、再生成されても同じになります。そのため、はやいときと遅いときとでquery_plan_hashに違いがあるかを見てみることで、「実行プランがおかしくなったか」についてはある程度確度を高められそうだと思い、確認してみました。

```sql
select * from
dm_exec_requests_dump with(nolock)
where command_text like '%delete from Table where Column1 = %'
order by collect_date
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/ef380e48-a12b-3cb2-ecc4-77d83fa0045f.png)
hash値は速いときも遅いときも同じようでした。ということは、実行プランが変わったわけではなさそうです。

ここで調査は行き詰ってしまいました。
何らかの要因で、速いときと遅いときがあるようなのですが、その要因にはたどり着けませんでした。

# ヒープ vs クラスタ化インデックス
今回のテーブルはヒープでしたが、クラスタ化インデックスで構成されているテーブルのほうがプロダクション環境で圧倒的に多く、この両者のDELETE時の論理読み取り数にどれだけ差があるか調べてみました。

その結果、「ヒープ＋非クラスタ化インデックス」テーブルのDELETEは、「クラスタ化インデックス」テーブルのDELETEよりも、論理読み取りが約30倍ほど多いという結果となりました。

一般的な傾向として、ヒープで構成されたテーブルのほうが、同一レコード数であってもDELETE時の論理読み取りページ数はかなり大きくなるようです。ただし、だからといって20万レコードのテーブルのDELETEがブロックされずに10分以上かかる理由にはなりません。

# 実施した対応
「ヒープ特有の何か」が原因でDELETEにいつもよりかなり時間がかかることがあると考え、最終的な対応としてはクラスタ化インデックスを作成しました。

これにより今のところ突発的なDELETEクエリのスローダウンは起きていません。

同じようにヒープを使ったテーブルで原因不明のスローダウンに悩まされている方はクラスタ化インデックス化すると解消される可能性があります。
【python】numpy.empty 初期値設定

numpyで初期値設定をするときにいつも numpy.zeros か numpy.ones しか使ってなかった。
この他にも初期値設定する方法 numpy.empty があったので書く。
また、初期値設定の使い方を確認する。

#環境
linux
pyhton
#numpy.empty
これの引数↓
>numpy.empty(shape, dtype=float, order='C')

__実験1__
引数に何も持たせない。

```python:
>>> import numpy
>>> numpy.empty()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: empty() missing required argument 'shape' (pos 1
```
shapeの引数がないというエラーが出る。

__実験2__
shapeを持たせる。

```python:
>>> import numpy
>>> numpy.empty(shape=1)
array([0.])
>>> numpy.empty(shape=2)
array([-5.73021895e-300,  6.93125508e-310])
>>> numpy.empty(shape=3)
array([0., 0., 0.])
>>> numpy.empty(shape=4)
array([0., 0., 0., 0.])
>>> numpy.empty(shape=5)
array([4.66352184e-310, 4.03179200e-313, 4.66352172e-310, 5.54048513e+228,
       7.56680154e+168])
>>> numpy.empty(shape=6)
array([4.66352179e-310, 5.72938864e-313, 6.93125428e-310, 6.93125428e-310,
       0.00000000e+000, 1.16707455e-072])
>>> numpy.empty((2,3))
array([[4.66352179e-310, 5.72938864e-313, 6.93125428e-310],
       [6.93125428e-310, 0.00000000e+000, 1.16707455e-072]])
>>> numpy.empty(5.6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object cannot be interpreted as an integer
```
できた。。。このことから、shape=はなくても良い、数字に少数はできない、初期値はshapeによってすべての値が0になることもある、ということがわかった。

__実験3__
dtypeを持たせる。実験1からshapeは必須ということが分かるのでshapeも持たせた。

```python:
>>> import numpy
>>> numpy.empty(2,dtype=float)
array([-5.73021895e-300,  6.93125508e-310])
>>> numpy.empty(2,dtype=int)
array([-9093133594791772939,      140290164735896])
>>> numpy.empty(2,int)
array([130238442063002869,    140290164735896])
```

このことから、dtypeをfloatにしたら初期値が少数に、intにしたら初期値が整数になることがわかる。また、引数のdtype=の部分は省略してもよいこととが numpy.empty(2,int) からわかる。

__実験4__
order='C'を変える。

```python:
>>> import numpy
>>> numpy.empty(2,dtype=float,order='C')
array([-5.73021895e-300,  6.93125508e-310])
>>> numpy.empty(2,dtype=float,order='F')
array([5.73021895e-300, 6.93125508e-310])
>>> numpy.empty(2,dtype=float,order='E')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: order must be one of 'C', 'F', 'A', or 'K' (got 'E')
>>> numpy.empty(2,dtype=float,order='A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: only 'C' or 'F' order is permitted
```

このことから、order='C'かorder='F'しか使えないことが分かる。また、order='C'とorder='F'の違いは見られなかった。そのため、どちらでも良いのではないかと思った。
Azure の致命的なバグか致命的な仕様を見つけた気がする（日本語をリソースグループ名で使えるが全体的にシステム動作不良）

#リソースグループ名で日本語を入力できるのだが・・・どうもおかしい

最近、VMやSQLなどオーソドックスで一般的に広く使われていそうではなさそうな機能を使い始めたのですが、どうも挙動がおかしい事態に遭遇。再現性100％の問題の迂回策を見つけた状況からするとリソースグループ名に日本語であれ何でも入っちゃう仕様に問題がある気がしてきました。オーソドックスな機能では問題なく動くのですが最近リリースまたは大幅改修が行われた機能が追い付いていない気がします。

（１）Log Analytics WorkspaceのAdvanced Settings画面。リソース名は日本語入らないのですけどね。Edgeは画面読み込み丸ごとNG、IEではなぜか正常表示、ChromeやFirefoxは中途半端に読み込めなかった事例（設定上のID、名前等は一部削除しています）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/08dfc8d7-f95d-50b1-cadb-db8749b529f5.png)

（２）VPN GWを何度構築しようとしてもエラーで止まり東日本リージョンは30分以上待たされて顕著なエラーメッセージはわからなかったが米国西部2リージョンでは直ぐにエラーとなりエラーログで特殊文字禁止の表示が（設定上のID、名前等は一部削除しています）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/3cd450aa-9fad-08bd-dfe2-96af1254db82.png)

日本語はspecial characterというほど特殊文字なのかな・・・？ リソース名に特殊文字は入っていないのですけどね。

（３）リソースグループの中身の表示は空っぽだがリソースグループを削除しようとするとリソースがあるが消していいかの画面（設定上のID、名前等は一部削除しています）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/1da3c029-a5c3-48a7-2019-5975b90a22ae.png)

Azure設定で日本語入力をすると多種多様な場所に悪影響しそうなことはわかった。
状況からするとURIの処理が上手く回っていないように見えるしURIが上手く回らないとセキュリティ的に何か問題がないのか気にはなる。
Microsoftのサポートでも頑張ってくれたと思うのですが時間がかかり直ぐに回答が来なかった、正確にはまだ来ていないので設定作業が私の方で滞っていた。別の作業をしようとしたら今度はそこが滞るようになりそれが原因で迂回策が分かった状況。アルファベットと特殊ではなさそうな記号オンリーのリソースグループを作成し時間をかけてこまめにリソースを移動。これでなんとか正常に動きそうだ。各種設定で日本語の入力はできてしまっても（！！）、普通にVMやSQLが動いても（！！）使用は控えよう。AWSで同じような問題ってあるのかな？一応「バグ」フィックスはしておいてと依頼はしておきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/3c830517-894a-9395-02f5-bd7f2f127a31.png)
sign in with apple JS を使用して日本語のボタン生成やボタンデザインのカスタマイズ方法

# Sign in with Apple JS を使用して日本語のボタン生成やボタンデザインのカスタマイズ方法

みなさんAppleは好きですか
僕は嫌いです。

## Sign in with Apple JS の使用方法

[ドキュメント](https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/displaying_sign_in_with_apple_buttons)に基本的な使い方が記載されてます。

公式から転載

```html
<html>
    <head>
        <meta name="appleid-signin-client-id" content="[CLIENT_ID]">
        <meta name="appleid-signin-scope" content="[SCOPES]">
        <meta name="appleid-signin-redirect-uri" content="[REDIRECT_URI]">
        <meta name="appleid-signin-state" content="[STATE]">
    </head>
    <style>
        .signin-button {
            width: 210px;
            height: 40px;
        }
    </style>
    <body>
        <div id="appleid-signin" class="signin-button" data-color="black" data-border="true" data-type="sign in"></div>
        <script type="text/javascript" src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
    </body>
</html>

```

これでボタンが出ます。

ですが、metaを使用したくない場合は以下のようなjsファイルを作成し、htmlに読み込ませると表示されます。ダミーデータでも表示されます（ちょろい）
APIとjsの読み込み順に気をつけてください。

```js
AppleID.auth.init({
  clientId : "xxx",
  scope : "xxx",
  redirectURI: "xxx",
  state : "xxx"
});
```

基本は以上ですが、他言語のAPIについてやサインアップボタンはどうやって表示するのか一切記載されていないのでどこを見ればいいのかまとめておきます。

## 日本語API

以下が日本語のAPIです。
https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/ja_JP/appleid.auth.js

なので読み込むjsを変更すれば日本語になります。

```html
<!--英語-->
<script type="text/javascript" src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>

<!--日本語-->
<script type="text/javascript" src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/ja_JP/appleid.auth.js"></script>
```

## ボタンデザインのカスタマイズ

こちらのボタン生成のページが用意されています。はい。ドキュメントには記載されていないページですね。
ちなみにapple公式のページです。

ボタン生成
https://appleid.apple.com/signinwithapple/button#center-align-button-section

こちらのページの「Download」を押すと今表示されているボタンのPNGファイルがダウンロードされます。
PNGでボタンを作りたい場合はダウンロードした画像はボタンデザインのガイドラインに沿ってるのでそのまま使用して問題ないです。

jsを使用する場合は表示されているボタンの下に<div>タグのコードが表示されているのでそれをそのままhtmlに載せると同じように表示されます。

```html
<div
  id="appleid-signin"
  data-mode="center-align"
  data-type="sign-in"
  data-color="black"
  data-border="false"
  data-border-radius="15"
  data-width="200"
  data-height="32"
></div>
```

ロゴを左に寄せたい場合

```html
data-mode="left-align"
```

なぐり書きですが、そこまで難しくはないと思います

Apple製品は嫌いではないですが、仕事で Sign in with Apple を調査・使用することになりドキュメントを舐めまわしてましたが、ドキュメントに記載されていないことが多々あったので嫌いです。
デザインの規約も多すぎです。少しは妥協できんのか…
Jitsi Meetをdocker-composeでAzure上に構築するメモ 


jitsi meetのセルフホスティングを試してみてます。 (WIP)

> 書きかけだけど一旦公開

freenomで取得したドメインとの紐付けまでやってみます。

## Jitsi Meet

フリーで使えるビデオチャットツールです。
セルフホスティングが可能です。

## 1. 下準備

ドメインとサーバーの下準備です。

### AzureのVMインスタンスを作成

AzureでUbuntuサーバー(v18系)を作成します。

立ち上げ時にSSH,HTTP,HTTPSのポートを許可しておきます。

作成したらパブリックIPアドレスが発行されるのでアドレスを控えておきます。

### freenomで無料ドメイン取得

freenomで無料でドメインを取得します。

`https://hogehoge-meet.cf`を取得しました。

DNSの設定で先程のAzureのVMのIPアドレスを指定します。

## 2. ubuntuにJitsiをインストールしていく

ubuntuにdocker-compose経由でJitsiをインストールします。

### 2-1. docker-composeを利用できるようにする

今回はdocker-composeでインストールします。その辺の準備から

#### dockerのインストール

```bash
curl -fsSL https://get.docker.com -o get-docker.sh

sh get-docker.sh
```

#### docker composeのインストール

```bash
sudo apt install docker-compose -y
```

### 2-2. Jitsiのダウンロードと設定

#### docker-jitsi-meetをcloneする

cloneしたフォルダ内に入ります。

```
git clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet
```

#### .env設定

`docker-jitsi-meetフォルダ`内での作業です。

```
cp env.example .env
```

```
sudo vim .env
```

編集

### 2-3. Jitsiのインストール

イメージを落としてきます。

```
sudo docker-compose pull
```

以下で立ち上げましょう。

```
sudo docker-compose up -d
```

一見、処理が終わったように見えますが、プロセスが完了するまで少し時間がかかります。

以下で

```
sudo docker-compose logs -f web
```

## 3 動作

起動してアドレスにアクセスすると無事にスタート画面が表示されました。

> ![](https://i.gyazo.com/4ea2648d6e065ec95f3ce0bde109996e.jpg)

## 4. 失敗した場合

URLにアクセスしてもうまくいかない場合は`.env`を再度編集などして、シャットダウンして再起動してみましょう

```
sudo docker-compose down
```

だいたいが`.env`の設定か、ファイヤーウォールの設定が原因だと思います。


ちなみに`--rmi all`でイメージごと削除できます。

```
sudo docker-compose down --rmi all
```
Mayaのpythonでprint命令自体がエラーになる場合の対処法

以下、Windowsの特定のMayaバージョンだけに関連する話です。Macや最近のバージョンのMayaではでくわしたことがありません。

---
![{55B3F311-97DE-4B88-944A-B52411ACC23C}.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/e1e8a7fd-92ae-9240-fb5c-0175bcd23d8d.jpeg)
そんな馬鹿な！？
---

上記のようにprint命令自体がエラーになるいう謎現象にあった場合、システム環境変数に MAYA_NO_CONSOLE_WINDOW が設定されていないか確認しましょう。

これはコンソールウィンドウを表示しなくするために設定する環境変数です。
https://support.borndigital.co.jp/hc/ja/articles/360002474194-Maya-%E3%81%AE-Output-Window-%E3%82%92%E9%9D%9E%E8%A1%A8%E7%A4%BA%E3%81%AB%E3%81%99%E3%82%8B

MAYA_NO_CONSOLE_WINDOWが設定されているとMaya2017 Update 5など（正確な対象バージョンはわかりませんが）一部の環境でprint文が通らなくなります。自分が試した限り、設定数値が１ではなく０であってもダメでした。

printが通らない状況というのは、stdout 設定がおかしくなっているときのようで、コンソールウィンドウを表示しない事で割り当てがなくなってしまうのでしょうね。

一応、下記のコード実行でFIXできますが、他何かおかしくなってるかもしれないので、MAYA_NO_CONSOLE_WINDOW 定義をなくすほうが良さそうです。

``` python
# https://stackoverflow.com/questions/43633433/maya-python-ioerror-errno-9-bad-file-descriptor
import maya.utils as utils
 sys.stdout = utils.Output()
```

特定の環境だけ不具合が起こるというのがいやらしいです。


---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/68dc51b4-76c7-f22b-e4b9-24a6be32eb95.png)
FIXED!
---
MutableLiveData は双方向データバインディングにも使える

[データバインディング](https://developer.android.com/topic/libraries/data-binding?hl=ja)を利用して EditText に入力した内容を ViewModel に通知する処理を実装していました。

```xml
<EditText
    android:id="@+id/form_user_name_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@{viewmodel.userName}" />
```

```kotlin:FormViewModel.kt
class FormViewModel : ViewModel() {
    var userName = ObservableField<String>()
}
```

上記の実装だと、`FormViewModel`から`userName`を変更すると View に反映されますが、逆に画面からテキストを入力しても`FormViewModel`の`userName`に反映されません。
つまり、ViewModel -> View は対応しているが、View -> ViewModel には対応していません。

# 双方向データバインディング

上記の問題を解決するためには、「双方向データバインディング」にする必要があります。
名前の通り、ViewModel -> View だけでなく、View -> ViewModel にも対応するための仕組みです。

# 対応方法

それぞれ以下のように変更します。

```xml
<EditText
    android:id="@+id/form_user_name_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@={viewmodel.userName}" />
```

xml の方は`@`と`{`の間に`=`を追加するだけです。

```kotlin:FormViewModel.kt
class FormViewModel : ViewModel() {
    val userName = MutableLiveData<String>()
}
```

ViewModel の方は`FormViewModel`の`userName`を`MutableLiveData<String>`に変更するだけです。
また、MutableLiveData を使わない、従来型の方法（[公式サイト記載](https://developer.android.com/topic/libraries/data-binding/two-way?hl=ja)）もあります。

```kotlin:FormViewModel.kt
import com.example.simplemvvmapp.BR

class FormViewModel : BaseObservable() {
    @Bindable
    var userName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.userName)
        }
}
```

ですが MutableLiveData を使う方が簡単に書けますし、ライフサイクルにも考慮してくれるので、MutableLiveData を使うことをお勧めします。

# まとめ

MutableLiveData は双方向データバインディングにも使えるということがわかりました。
普通にデータバインディング以外にも使えるのでもっと積極的に使っていきたいです。

# 参考 URL

- [【Android】MutableLiveData と ObservableField の違い - Qiita](https://qiita.com/orimomo/items/fffc74e311eaa0ffe0b1)
- [LiveData の概要  |  Android デベロッパー  |  Android Developers](https://developer.android.com/topic/libraries/architecture/livedata?hl=ja)
Shift + EnterでUITextViewを改行

SmartKeyboardなども発売され、iPadにはずっとキーボードを接続して利用している。というユーザーも多いのではないかと思いますが、そのような市場の様子を見て「`enter`を確定や直下の新規作成操作とし、`shift + enter`で改行操作」と思った場合、素直に対応したAPIがあれば良いですが`UITextViewDelegate`には該当するものが存在しないため、少し工夫をする必要があります。

この記事ではその実現方法について解説します。

# 方針
こちらの[Stackoverflowの質問](https://stackoverflow.com/questions/27933898/detect-shift-enter-on-ios-keyboard)が参考にしましたが、

**「UIKeyCommandをoverrideしてインターセプトし、shift + enterで独自の改行アクションを実行する」**という方針になります。

# 実装
コードはこちらの[gist](https://gist.github.com/yosshi4486/ff37ffee79886fd2beabde375f65ba9a)に投稿しましたので参考にしてください。

今回は`UITextView`のサブクラスを利用して実現を図りました。

## ポイント1: keyCommandsのoverride

システム定義以外のあるキーが押されたとき、システムは`responderChain`を探して該当するキーに対応する`UIKeyCommand`が実装されているか確認し、存在すればそのアクションを実行します。

以下の実装では、`shift + return(enter)`を受け取ると`newLine(sender:)`というアクションを実行するようなコマンドを返しています。

```swift
override var keyCommands: [UIKeyCommand]? {
// キーボードへのinputは、returnなので"\r". うっかり"\n"としてしまう事があるが、それは押下したキーではないため.
        return [UIKeyCommand(input: "\r", modifierFlags: .shift, action: #selector(newLine(sender:)))]
 }

```

`UITextViewDelegate`の`textView(_:shouldChangeTextIn:replacementString:)`を実装している場合であっても、この`keyCommands`の実装がインターセプトするため、テキスト入力まで辿り着かずデリゲートメソッドは呼ばれません。

なので、任意の文字列を追加した後にデリゲートが動いて欲しいときは、手動で呼んであげるようにすると良いでしょう。

## ポイント2: アクションの実装
`UITextView`の`text`プロパティに直接`\n`を代入したいところですが、`firstResponder`が外れてしまう上に予期しない挙動を引き起こしてしまいます。

そのため、現在アクティブな`UITextView/UITextField`のテキストに変更を加える場合は、`UIKeyInput`プロトコルに属している[insertText(_:)](https://developer.apple.com/documentation/uikit/uikeyinput/1614543-inserttext)メソッドを利用しましょう。

このメソッドは、テキストの現在カーソルが当たっているindexに対してStringの挿入をして、その後テキストを表示し直してくれます。(バッキングストアなどについて気になる場合は、[TextKit](https://developer.apple.com/documentation/appkit/textkit)をご参照ください)

```swift
@objc func newLine(sender: UIKeyCommand) {
    // プログラム経由のテキスト更新はデリゲートメソッドは呼ばれない
    insertText("\n")
}
```

プログラム経由でテキスト更新をした場合にはデリゲートメソッドは呼ばれないことに注意してください。

# まとめ
以上のような2つのポイントを抑えて実装することで、`Shift + Enter`での改行操作が実現可能となります。

もしもっとスマートな実装方法などご存知の場合は、ご教授頂けると助かります。
「2進数」①　2進数の足し算と引き算

##2進数の足し算
###10進数の足し算から考える
2進数の足し算について考える前に、私たちが普段使っている10進数の足し算を参考にしてみたいと思います。
ここでは例として「1456＋55」という足し算について考えてみましょう。
※この計算において、繰り上がりの数を「①」のように表示し、他の数と区別しやすくしています。

![スクリーンショット 2020-10-23 18.20.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/139483cb-d475-3954-f207-72f4f4dab715.png)

このように、10進数の計算においては1桁で10以上の数を表現することができません。だから、1桁の計算で「10」以上の数になる場合はその数の1の位の数をそのまま残し、上の位に数を繰り上げるという操作を行っています。

###2進数の足し算
2進数の足し算について考えるため、例として「1011＋111」という足し算をしてみたいと思います。
2進数の足し算も、10進数の足し算と同様の流れで行います。つまり、1桁の計算で「10」以上の数になる場合はその数の1桁目の数をそのまま残し、上の位に数を繰り上げるという操作を行います。
※この計算において、繰り上がりの数を「①」のように表示し、他の数と区別しやすくしています。また、「0」と「1」が混同されやすいため、各桁の計算ごとに色分けしています。

![スクリーンショット 2020-10-23 18.21.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/29b5c589-aece-438b-1d77-1be4750d8983.png)

この図のような計算を経て、2進数「1011＋111」の値は「10010」と求められました。

##2進数の引き算
###10進数の引き算から考える
2進数の引き算について考える前に、私たちが普段使っている10進数の引き算を参考にしてみたいと思います。
ここでは例として「5249−1553」という引き算について考えてみましょう。
※この計算において、繰り下がりの数を「−①」のように表示し、他の数と区別しやすくしています。

![スクリーンショット 2020-10-23 18.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/38aec064-e532-5807-884b-159ad710f7b5.png)


このように、複数桁の10進数の計算においては、そのうちのある桁の計算が「2ー5」のように負の数なってしまう場合、その桁だけを「−（マイナス）」を使って表現することができません。だから、負になってしまう桁のもう1つ上の桁から「10」をもらって改めて計算し、もらった上の位の数を繰り下げるという操作を行います。

###2進数の引き算
2進数の引き算について考えるため、例として「1010−111」という引き算をしてみたいと思います。
2進数の引き算も、10進数の引き算と同様の流れで行います。つまり、複数桁のうちのある1桁の計算で負の数になる場合はそのもう1つ上の桁から「10」をもらって改めて計算し、もらった上の位の数を繰り下げるという操作を行います。
※この計算において、繰り上がりの数を「①」のように表示し、他の数と区別しやすくしています。また、「0」と「1」が混同されやすいため、各桁の計算ごとに色分けしています。

![スクリーンショット 2020-10-23 18.08.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657974/f9247700-fbfa-fff6-f316-0e82963d871a.png)

この図のような計算を経て、2進数「1010−111」の値は「11」と求められました。

##参考にさせて頂いた書籍
きたみりゅうじ 『キタミ式イラストIT塾 基本情報技術者平成31/01年』 技術評論社 2019年

##学習してみて
2進数の足し算・引き算はなかなか難しそうでしたが、繰り上がり・繰り下がりの仕組みを10進数を元にすれば理解しやすいのではないかと感じました。
ただ、それでもやはり2進数の繰り上がり・繰り下がりの部分は独特で、一桁ずつ丁寧に追っていかなければ混乱しそうになりますね。今後も練習問題を解いて慣れていこうと思います。
次回は2進数の補数表現というこれまたさらに独特な表現方法について学習したいと思います。
[PHP] XMLを解析する SimpleXMLElement の使い方

環境：PHP Version 7.4.9

##XML文字列の読込

```php
$xmlString = <<<EOM
    <hoge>
        <moge></moge>
    </hoge>
EOM;
$xml = simplexml_load_string($xmlString);
```

`simplexml_load_string()` でXML文字列を読み込める。
パラメータにはXML文字列を指定する。
<br>
##XMLファイルの読込

```php
$xml = simplexml_load_file($xmlFilePath);
```

`simplexml_load_file()` でXMLファイルを読み込める。
パラメータにはXMLファイルのパスを指定する。
<br>
##子ノードへのアクセス

```php
$xmlString = <<<EOM
    <hoge>
        <moge></moge>
    </hoge>
EOM;
$xml = simplexml_load_string($xmlString);
$child = $xml->moge;
```

`アロー演算子`でアクセスできる。
<br>
##プロパティへのアクセス

```php
$xmlString = <<<EOM
    <hoge PropA="1" PropB="2">
    </hoge>
EOM;
$xml = simplexml_load_string($xmlString);
$propA = (string) $xml->attributes()->PropA;
$propB = (string) $xml->attributes()->PropB;
```

`attributes()` で属性一覧を取得したあと、アロー演算子でアクセスする。
また、そのままでは値として扱いにくいので `string` へのキャストも併せて行う。
<br>
##ノード名の取得

```php
$xmlString = <<<EOM
    <hoge>
    </hoge>
EOM;
$xml = simplexml_load_string($xmlString);
$name = $xml->getName();
```

`getName()` で名前を取得できる。
今回の例なら「hoge」が取得できる。
<br>
##全ての子ノードを取得してループ

```php
$xmlString = <<<EOM
    <hoge>
        <moge></moge>
        <moge></moge>
        <moge></moge>
        <sage></sage>
        <sage></sage>
    </hoge>
EOM;
$xml = simplexml_load_string($xmlString);
$children = $xml->children();
foreach ($children as $val) {
   // 何らかの処理
}
```

`children()` で全ての子ノードを取得できる。
<br>
##特定の子ノードを取得してループ

```php
$xmlString = <<<EOM
    <hoge>
        <moge></moge>
        <moge></moge>
        <moge></moge>
        <sage></sage>
        <sage></sage>
    </hoge>
EOM;
$xml = simplexml_load_string($xmlString);
foreach ($xml->moge as $val) {
   // mogeのみに何らかの処理
}
```

`アロー演算子`を用いて特定の子ノードに対してのみループを行える。
<br>
##JSONへの変換

```php
$xmlString = <<<EOM
    <hoge>
        <moge></moge>
        <moge></moge>
        <moge></moge>
        <sage></sage>
        <sage></sage>
    </hoge>
EOM;
$xml = simplexml_load_string($xmlString);
$json = json_encode($xml);
foreach ($json as $val) {
   // 何らかの処理
}
```

`json_encode()` でJSON形式への変換ができる。
<br>
<br>
以上。
Databricks Community Edition サインアップ方法

# Databricks Community Edition サインアップ方法

Databricks Community Editionとは

・Databricks Community EditionはアメリカのDatabricks社が提供するDatabricks Platformの無償版である。

・Databricks社について簡単に記載すると、Apache Sparkの生みの親であるマテイ・ザハリアと共に、アリ・ゴディシが2013年に設立した企業。データエンジニアリング、データサイエンス、データ分析のためのオープンな統合プラットフォームの開発・提供を行っている。



### <u>★**サインアップ**<u></u></u>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/1d54ecf1-8fb8-d4e0-3e75-f1c680cc5467.png)


https://databricks.com/jp/

にアクセスして、無料トライアルをクリック。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/28b0dca0-1d53-05a8-2b68-fbe54a4cf7d1.png)



必要項目を入力し、サインアップ押下



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/0af94cb8-04b8-ebe2-9fee-0d29601a57f1.png)


・画面遷移した先に、２つのDatabricksのプラットフォームが表示される。

・右側に表示されているCOMMUNITY EDITION下のGET STARTEDをクリック。

・登録したメールアドレスにDatabricks からのメールが届く。

・メール内にあるリンクに遷移し、パスワードの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/9c4f7aad-8036-7f3b-0bb4-51411d9e3f54.png)


<u>※*初回登録でも Reset Password になっている。*</u>

<u>*大文字含めた半角英数字と記号を組み合わせたパスワードの設定が必要。</u>*

Reset passwordをクリックして、サインアップ完了。すぐに、コンソール画面が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/34f9973d-f542-d653-9360-6b1044d6f64d.png)


以上がサインアップまでの流れになります。

株式会社メソドロジック
川名智士 @kawana-satoshi
LAMMPSの任意のバージョンをインストールする方法(Linux)

# 概要
~~linuxに特定のバージョンのLAMMPSをインストールする方法をまとめておきます。
間違い等あれば、コメントからご連絡ください。m(_ _)m~~
この方法は使えなくなりました。 https://lammps.sandia.gov/tars/ へのソースコードのアップロードがなくなったため


## 手順

lammps-3Mar20の場合、以下を順に実行
### STEP.1 ソースコードをダウンロード
```bash
wget https://lammps.sandia.gov/tars/lammps-3Mar20.tar.gz
tar -zxvf lammps-3Mar20.tar.gz
cd lammps-3Mar20/src
```
### STEP.2 使うpackageを追加

```bash
make yes-class2 yes-kspace yes-misc yes-molecule yes-rigid yes-user-reaxc ...
```

現在使っているパッケージを確認するには`/src`で`make ps`と入力する。（初期はすべてNOに設定されている）
新しいデバイスに、現在使っているのと同じ設定でビルドしたい場合は、もとのLAMMPSの設定を参照すると良い。

### STEP.3 インストール
serialとmpiがある。どちらかしか使わない場合は片方のみインストールすれば良い。

```
make serial
make mpi
```
### STEP.4 動作を確認
`./lmp_serial`もしくは`./lmp_mpi`と入力して実行されることを確認
`LAMMPS (3 Mar 2020)`と出力されればOK

確認できたら、`ctrl+C`でキャンセルすると良い。
### STEP.5 PATHを通す
`~/.bashrc`に`export PATH=${HOME}/lammps-3Mar20/src:$PATH`を記載する。