OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】【SAA対策】RDS

# RDS(Relational Database Service)
## サービス概要
リレーショナルデータベースを簡単にセットアップ、運用、スケーリングできるウェブサービス。
費用対効果に優れた拡張機能を備え、一般的なデータベース管理タスクを管理。

## 特徴
- サーバーを購入するときは、CPU、メモリ、ストレージ、IOPS をすべて一緒にまとめて入手可能。
- バックアップ、ソフトウェアパッチ、自動的な障害検出、および復旧を管理。
- 自動バックアップ実行可能。または、手動で独自のバックアップスナップショットを作成可能。これらのバックアップを使用してデータベースを復元可能。
- プライマリインスタンスと同期しているセカンダリインスタンスがあると、問題が発生したときにセカンダリインスタンスにフェイルオーバーできるため、高可用性を実現できる。
- MySQL、MariaDB、PostgreSQL、Oracle、Microsoft SQL Server など既に使い慣れたデータベース製品を使用可能。
- IAMを使用してユーザーとアクセス許可を定義すると、RDSデータベースにアクセスできるユーザーを制御可能。また、VPCに配置すると、データベースを保護できる。
- DBインスタンス
 - クラウド内の独立したデータベース環境。
 - DB インスタンスには、ユーザーが作成した複数のデータベースを含めることができる。
 - MySQL、MariaDB、PostgreSQL、Oracle、および Microsoft SQL Serverが実行可能。
 - ストレージには、マグネティック、汎用 (SSD)、Provisioned IOPS (PIOPS) の 3 タイプがある。
 - 汎用SSDはボリュームサイズによって、ボリュームのベースパフォーマンスレベルや I/O クレジットを取得する速さが決まる。
- マルチAZ配置＝複数AZのDBインスタンスを実行可能。AmazonによりセカンダリスタンバイDBインスタンスが別AZで自動的にプロビジョニングされる。
- プライマリDBインスタンスは、同期的にAZ間でセカンダリインスタンスにレプリケートされる。データの冗長性およびフェイルオーバーサポートを提供し、I/Oフリーズを排除して、システムのバックアップの際のレイテンシーのスパイクを最小限に抑える。
- セキュリティグループにより、DB インスタンスへのアクセスを制御する。制御するには、アクセスを許可する IP アドレスの範囲または Amazon EC2 インスタンスを指定。
 
## 種類やタイプ
#### ストレージタイプ
|                  |   レイテンシー        |   ユースケース        |
|:-----------------|:------------------|:-------------------|:-------------------|
| 汎用 (SSD) | ベースラインI/Oパフォーマンスは1GiB あたり3IOPS。ボリュームが大きいほどパフォーマンスが向上する。 |      さまざまなワークロードで最適。       ||
| マグネティック  | 下位互換性としてサポートされているストレージ。 |利用にはいくつかの制限が設けられており、非推奨。    ||
| Provisioned IOPS (PIOPS)| DB インスタンスの作成時に、IOPS レートとボリュームのサイズを指定。 |      高速で一貫した I/O 性能を必要とする本稼働アプリケーション。  ||


## 類似サービスとの比較
|                  |   RDS       |    DynamoDB       |Redshift|ElastiCache|
|:-----------------|:------------------|:-------------------|:-------------------|:-------------------|
| 概要             | ・リレーショナルデータベース。<br>・主なDBエンジンをサポート、ツールがそのまま使えるため、オンプレからの移行に便利。<br>・データベースソフトウェアのパッチは自動パッチが可能。|  ・NoSQL データベースサービス。<br>・結果整合性<br>・write直後のreadでは整合性が取れない場合あり。<br>・「強い整合性」オプションを指定すると性能は落ちる。<br>・レコードのサイズに上限あり。<br>・リージョンサービスでありプライベートネットワークからはNAT経由でアクセスする必要あり。    |・データウェアハウスタイプ<br>・スケーラブル<br>・高パフォーマンス|・メモリーキャッシュタイプ<br>・Memcached：Key-Value Store形式のメインメモリキャッシュ。マルチノートのキャッシュクラスタ。<br>・Redis：Memcached：Key-Value Store形式のメインメモリキャッシュ。|
| 場所          |   AZ サービス（VPC内に配置） |      リージョン      |	AZ サービス|	AZ サービス（VPC内に配置）|
| バックアップ             |  スケージュールで1日1回取得可能(手動可)※ただし、バックアップ中はI/O停止、止めたくない場合はマルチAZ利用する必要あり |       -      |-|(memcached)バックアップ機能はなし(Redis)Snapshotによる永続化|
| ユースケース             |  OS以下レイヤの管理不要、高可用性な、既存データベースの利用など |  大量のオンライントランザクション処理など|大容量データの分析など|DBの負荷低減用のメモリキャッシュ|

## ベストプラクティス
- RDSリードレプリカ（非同期レプリケーション）を利用することで以下の効果を期待できる。
 - DBインスタンスの読み取り頻度の高いDBのワークロードを緩和することで、全体の読み込みスループットを向上させる。
 - 必要に応じてスタンドアロンDBに昇格させ、マスターDBのバックアップとして使用できる。
 - リードレプリカを使用して、マスターDBやスタンバイDBへ影響することなく、レポート生成をできる。
- データベース作成時にRDSの暗号化オプションを有効化することで、インスタンスとスナップショットを暗号化できる。暗号化には「データ保存時の暗号化」と「通信アクセスの暗号化」()がある。
- メモリ、CPU、ストレージの使用状況をモニタリングする。Amazon CloudWatchで通知するように設定し、システムのパフォーマンスと可用性を維持する。
- 自動バックアップを有効にし、1 日のうちで書き込み IOPS が低くなる時間帯にバックアップが実行されるようにバックアップウィンドウを設定する。
- 読み取りリクエストの増加によるRDSインスタンスの負荷を抑えるには下記の方法などがある。
 - RDSリードレプリカの作成
 - RDSインスタンスのタイプを高性能なものにする。

## 参考例
## 用語
【予習】業務で『RPA』に携わるから、どんなモノか調べてみた

>この記事では、《&ensp;RPA（Robotic Process Automation）&ensp;》について、
業務を通して学習した内容をまとめています。

- __『RPA』とは…？__
- __なぜ今、『RPA』が必要とされているのか…？__
- __『RPA』による業務自動化の３つのメリット__

こういった内容についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

##そもそも、RPA（Robotic Process Automation）ってなに…？

![rpa_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/d6e91813-d83d-965b-af7e-c4a0b6f80861.jpeg)

>RPA(Robotic Process Automation)は、これまで人間のみが対応可能と想定されていた作業、もしくはより高度な作業を、__人間に代わって実施できるルールエンジンやAI、機械学習等を含む認知技術を活用した業務を代行・代替する取り組み__です。

>人間の補完として業務を遂行できることから、__仮想知的労働者（Digital Labor）として、2025年までに全世界で1億人以上の知的労働者、もしくは1/3の仕事がRPAに置き換わると言われています。__
引用：[日本RPA協会](https://rpa-japan.com/)

要は・・・

__"ロボットによる業務自動化の取り組みを表す言葉"__

といった感じです。

##【背景】なぜ今、『RPA』が必要とされているのか…？

![rpa_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/bb953068-29c7-b801-6a55-d4dfe69234c7.png)

上記のグラフの通り・・・

日本は、__2060年には国民の約2.5人に1人が65歳以上の高齢者__になるという、世界でも類を見ない超高齢化社会になると予想されています。

そのため・・・

日本経済に与える影響を軽減するために、__生産年齢人口の減少をカバーする必要があります。__

そこで・・・

現在、注目を集めているのが__『RPA』__になります。

##『RPA』による業務自動化の３つのメリット

![career-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/b681a018-689f-782c-35ba-a8d1aa3d3c47.jpeg)

__『RPA』による業務自動化のメリット__としては、例えば下記の__３つ__があります。

1. &ensp;__品質・コスト・納期（リードタイム）の最適化__
2. &ensp;__売上UP__
4. &ensp;__人材不足の解消__

###メリット①：品質・コスト・納期（リードタイム）の最適化

『RPA』は、__品質・コスト・納期（リードタイム）の最適化__を可能にします。

人間が行う作業では、ミスを完全にゼロにすることは難しく、意図せずミスが起こってしまうこともあります。

>人間が集中できる時間は限られていますし、特に繰り返し作業の場合は、ミスをしていても気付かない場合があります。

しかし・・・

『RPA』で作成したデジタルレイバー（仮想知的労働者）は、__一度登録した作業を正確に再現してくれるので、ミスなく仕事をこなします。__

また・・・

人間が行うよりも、__数倍から数十倍のスピードで業務を実行するため、リードタイムの短縮も可能__です。

###メリット②：売上UPに繋がる

『RPA』を導入することで、日々の単純作業から解放されるので、

人間は、クリエイティブな業務やコミュニケーションが必要な業務など…

__"売上UPに繋がる仕事（人間にしかできない仕事）"__

に集中できるようになります。

###メリット③：人材不足の解消

![rpa_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/bb953068-29c7-b801-6a55-d4dfe69234c7.png)

>繰り返しになりますが、上記のグラフの通り・・・

>日本は、__2060年には国民の約2.5人に1人が65歳以上の高齢者__になるという、世界でも類を見ない超高齢化社会になると予想されています。

>そのため・・・

>日本経済に与える影響を軽減するために、__生産年齢人口の減少をカバーする必要があります。__

『RPA』は、__日本が抱える生産年齢人口の減少の問題解決にも貢献します。__

『RPA』で&ensp;__"人間が作業しなくても問題ない業務"__&ensp;を自動化すれば…

人間が行っていた日々の業務量が削減され、より効率的に働くことが可能になります。

>『RPA』は、働く時間の制限も無く、24時間作業可能で、一度作成すれば繰り返し作業を行ってくれるので…

>特に、__ホワイトカラーの人材不足の問題解消が期待されています。__

## 【将来性】『RPA』がビジネスと市場に与える影響

![rpa_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255884/c9377537-daa6-dda6-35fa-212532346e28.png)

出典：[ITR](https://www.itr.co.jp/company/press/181025PR.html)

最近では、__世界中で『RPA』が急速に普及していて、日本企業でも導入企業が増えています。__

それに伴って、市場規模も上記のグラフからも分かるように、2017年頃から成長し始め、現在も成長し続けています。

>ちなみに・・・
マッキンゼー・アンド・カンパニーでは、世界における『RPA』の市場規模は…

>__"6.5 trillion dollars"__

>__"日本円で約650兆円の市場規模になる"__

>と予測しています。 

そのため・・・

今後は、__大企業だけではなく、中小企業まで『RPA』の普及・大衆化が進んでいく可能性が高い__らしいです。

##【おまけ】『RPA』のツール【３つ紹介】

1. &ensp;__[UiPath｜RPA業界で世界的なトップベンダー](https://www.uipath.com/ja/)__
2. &ensp;__[WinActor｜NTTグループによって開発された純国産RPAツール](https://winactor.com/)__
3. &ensp;__[BizRobo!｜国内実績No1 のRPAサービス]()__
Rails 5.2~ credentials.yml.enc/master.key の扱いについて（備忘録）

# credentials.yml.enc / master.keyとは何か
Rails 5.2 ~ からはsecret.ymlが廃止され、credentials.yml.enc / master.keyが導入されました。credentials.ymlはmaster.keyによって暗号化、復号化されます。secret.ymlは暗号化されておりませんでしたので、セキュリティ的にはより強固なものとなったようです。

## 特徴
 - Rails 5.2 ~ 
 - credentials.yml.encはmaster.keyとペアであり、master.keyによって暗号化されている。
 - credentials.yml.enc, master.key共にデフォルトでgitignoreに追加されている。

# 編集及び取得方法
## 編集方法

```
$ cd [アプリケーションのディレクトリ]
$ sudo EDITOR=vim bin/rails credentials:edit
```

初めてこのコマンドを叩くとcredentials.yml.encとmaster.keyのペアが自動生成されます。
編集コマンドを叩いて次のような画面が出てきたらOK

```
# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: *******************************************************
```
ここにAWSやその他のサービスを使う際に必要となるaccess_key_id, secret_access_keyの情報を入力する。

```
aws:
  access_key_id: ***
  secret_access_key: ***

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: *******************************************************
```

##取得方法
credentials.yml.encに書き込んだ情報はmaster.keyによって復号化され取得されます。その際の取り出し方について。

```
Rails.application.credentials.***
```

例 AWSの場合

```
Rails.application.credentials.aws[:access_key_id]  # アクセスキーID
Rails.application.credentials.aws[:secret_access_key] # シークレットアクセスキー
```

##実際に取得できるか試してみる
credentials.yml.encに入力した情報の取得が成功しているかを判定する際に非常に便利なコマンドがあります。

```
$ rails c
$ [1] pry(main) > Rails.application.credentials.aws
$ => { :access_key_id=>"123", :secret_access_key=>"456" }
```

このように表示されていればOK!

# チーム開発におけるcredentials.yml.encとmaster.keyの扱いについて

チーム開発においては、master.keyを信頼できる開発メンバーにファイル共有ソフト等を用いて共有します。credentials.yml.encは本番環境にデプロイしてもmaster.keyによって暗号化されているため問題ありません。
本番環境ではmaster.keyを絶対にアップロードしないで下さい。

##本番環境でのmaster.keyの値を取得方法
本番環境にはmaster.keyは当然アップロードすることは出来ません。代わりに環境変数に設定してcredentials.yml.encを復号化します。

```
$ cd ~   #本番環境
$ sudo vim /etc/environment  #環境変数の設定
```

環境変数は必ず、RAILS_MASTER_KEYとして設定して下さい。
また、デフォルトでcredentials.yml.encはgitignoreに追加されてしまっているので、この記述をコメントアウトします。

``` 
 .gitignore
 # config/credentials.yml.enc
 config/master.key   #マスターキーは絶対にgit addしない。

```
POJ 2386 をpythonで解く

#POJ2386 LakeCounting をpythonで解く
DFS(深さ優先探索)を学習中。
蟻本だけでは分からなかったので備忘録として。
`.replace('.','0').replace('W','1')`はしなくてもよい。

```2386.py
n,m=map(int,input().split())
a=[list(map(int,list(input().replace('.','0').replace('W','1')))) for i in range(n)]

def dfs(x,y):
  a[x][y]=0
  for dx in [-1,0,1]:
    for dy in [-1,0,1]:
      nx=x+dx
      ny=y+dy
      if 0<=nx<n and 0<=ny<m and a[nx][ny]==1:
          dfs(nx,ny)

cnt=0
for i in range(n):
  for j in range(m):
    if a[i][j]==1:
      dfs(i,j)
      cnt+=1
print(cnt)
```
Railsで既存のテーブルのカラムを追加・編集・削除する方法


今回は「users」というモデルのカラムを色々いじくりたいとします

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

```terminal
rails generate EditColumn
```

db ディレクトリ配下にできたマイグレーションファイルをいじっていきます

###「name」カラムを追加するとき

```20200301090906_edit_column.rb
class EditColumn < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :name, :string
  end
end
```

###既存の「age」カラムを「nenrei」に変更するとき

```20200301090906_edit_column.rb
class EditColumn < ActiveRecord::Migration[5.2]
  def change
    rename_column :users, :age, :nenrei
  end
end
```

###既存の「age」カラムを削除

```20200301090906_edit_column.rb
class EditColumn < ActiveRecord::Migration[5.2]
  def change
    remove_column :users, :age, :string
  end
end
```
[Oracle Cloud] 新たなセキュリティ機能の Network Source を触ってみた

# はじめに

一昨日、2020年2月28日に、Oracle Cloud Infrastructure(以下OCI) に、Network Source という概念が追加されました。リリースノートはこちらです。

https://docs.cloud.oracle.com/en-us/iaas/releasenotes/changes/d05f31db-a3c7-40dc-bcfd-6f3404e2b197/



Network Source をざっくり説明します。OCI 上の様々なリソースへの操作について、アクセス可能なネットワークを制限する仕組みです。例えば、社内のNWからのみリソースへの操作を制限することが出来ます。これによって、更なるセキュリティ向上が出来るようになりました。

Network Source は、OCI IAM に追加された概念になります。OCI IAM 上で、アクセス可能なネットワークの情報を定義した上で、OCI IAM の Policy でコントロールする仕組みです。

文章だけではわかりにくいので、どういう挙動になるのか確認してみました。


**制限事項 : 2020年3月1日時点で、対応しているリソースは、Object Storage のみです。今後どんどん対応リソースが増えていって、より便利になっていくのではないかなと思っています**



# IAM Group, User の構成

IAM の Policy で制御する仕組みのため、動作確認のために適当に IAM ユーザーと グループを作成します。group01 に、user01 が所属するように、適当に作ります。

- Group : group01
- user : user01



# Network Sources の作成

OCI IAM の配下に、Network Sources が追加されています。これをクリックします。

![1583053062960.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3d1cb2c9-3d0c-bed0-8f23-8018a44838b9.png)



パラメータを入力します。

- name : `networksource01`

Network Type は 2種類から選べます。

- Virtual Cloud Network : VCN を指定できます。
- Public Network : インターネット上の Public なネットワークを指定できます。



今回は自宅からアクセスするので、Public Network を指定して、自宅の Public IP を指定してみます。自宅の Public IP は確認くんなどで適当に調べます。

https://kakunin.net/kun/

![1583051246431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3aaaf4f1-01c8-e8af-9f60-a17a099d6f32.png)



Network Source の詳細画面はこんな感じです

![1583051349280.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/90928bca-9cc9-c635-59a7-0f3f22848dcb.png)



# IAM Policy

IAM Policy の中で、Network Source を指定します。現時点では、Object Storage しか対応していないため、以下のように設定します

```
allow group group01 to manage object-family in tenancy where request.networkSource.name='networksource01'
```



# 該当ユーザーでアクセステスト

Network Source で指定されているネットワークからアクセスした時は、Object Storage の画面が表示されています

![1583051787117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a2fff184-ff23-9d47-39f5-e5edf972f388.png)



Network Source を、正しいものから適当に使わないアドレスに変更してみます

![1583051868549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b8a66ad4-7518-57bb-3f3a-ca7f527b5e8a.png)



そうすると、Object Storage が表示されなくなりました。Network Source が正しく動作していることが分かりますね。特定のネットワークからでないと、表示することが出来ませんでした。

![1583051905281.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1ecfc128-8791-0c98-9c45-6df09c141638.png)



# まとめ

Network Source の動きを確認することが出来ました。Document を見るだけだといまいちわかりにくい部分がありましたが、IAM Policy の制御の中で、Network Source を利用することが出来ると考えるとわかりやすいですね。今はまだ Object Storage しか使えませんが、今後の進化を期待しています。



# 参考 URL

https://docs.cloud.oracle.com/en-us/iaas/Content/Identity/Tasks/managingnetworksources.htm
【Udemy Python3入門+応用】　11.文字列

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■基本の文字列
```python:print_standard
print('hello')
print("hello")
```
```:result
hello
hello
```
`print()`内で文字列を指定する場合は、`''`でも`""`でもよい。

<br>

##■文字列内に「'」がある場合
#####◆`""`で括る
```python:print_'
print("I don't know.")
```
```:result
I don't know.
```
`""`で括った場合は、きちんと出力される。

#####◆`''`で括るとエラーになる
```python:print_'
print('I don't know.')
```
```:result
    print('I don't know.')
                 ^
SyntaxError: invalid syntax
```
`''`で括った場合、文字列中の「'」が括りの終わりと判定されてしまい、エラーとなってしまう。

#####◆`\`を使ってエラーを回避する
```python:print_'
print('I don\'t know.')
```
```:result
I don't know.
```
文字列中の`'`の前に`\`を入れてやることで、括りとしての判定を回避できる。

```python:print_'
print('say "I don\'t know."')
print("say \"I don't know.\"")
```
```:result
say "I don't know."
say "I don't know."
```
応用。

<br>

##■文字列内に「\n」がある場合
#####◆改行の`\n`
```python:print_\n
print('Hello. \nHow are you?')
```
```:result
Hello.
How are you?
```
`\n`が「改行」となるのは以前扱った。

#####◆誤って`\n`と判定される
```python:print_\n
print('C:\name\name')
```
```:result
C:
ame
ame
```
「C:\name\name」を表示させたかったのに、`\n`の部分が改行判定されてしまった。

#####◆`r`を用いた判定回避
```python:print_\n
print(r'C:\name\name')
```
```:result
C:\name\name
```
その際は、"raw"の頭文字である`r`を文字列の先頭につけることで、文字列をそのままprintすることができる。

<br>

##■改行
```python:new_line
print("""
line1
line2
line3
""")
```
```:result

line1
line2
line3

```
上のように`""" """`を用いることで、`\n`を使って一行で記述せずとも、見やすいコードが書ける。

```python:new_line
print('#######')
print("""
line1
line2
line3
""")
print('#######')
```
```:result
#######

line1
line2
line3

#######
```
ただし、この書き方だと文字列の上下に空白行が挿入されることになる。

```python:new_line
print('#######')
print("""\
line1
line2
line3\
""")
print('#######')
```
```:result
#######
line1
line2
line3
#######
```
`\`をこのように入れてあげることで、「次に書くコードは次の行から始めてね」という意味になる。

<br>

##■演算子を用いる
#####◆文字列と演算子
```python:operator
print('Hi.' * 3 + 'Mike.')
print('Py' + 'thon')
print('Py''thon')
```
```:result
Hi.Hi.Hi.Mike.
Python
Python
```
文字列に対し、演算子を組み合わせることもできる。
単純に文字列同士を接続する場合、`+`を記述しなくても接続してprintされる。

#####◆変数と文字列の並列
```python:operator
prefix = ('Py')

print(prefix'thon')
```
```:result
    print(prefix'thon')
                     ^
SyntaxError: invalid syntax
```
ただし、変数に文字列を代入した場合は`+`を省略することはできない。

```python:operator
prefix = ('Py')

print(prefix + 'thon')
```
```:result
Python
```
`+`できちんと接続することができた。

#####◆`+`の省略が好まれる場合
```python:operator
print('aaaaaaaaaaaaaaaaaaaaaaaaaaa'
      'bbbbbbbbbbbbbbbbbbbbbbbbbbb')
```
```:result
aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbb
```
長い文字列をつなげて表示させる場合は、このように記述するとコードが見やすくなる。
(1行で書くと画面サイズに収まりきらない場合があったりして見にくい。)
4D SYSTEMS の 4Duinoを試す (GUI・タッチパネルお試し編)4/5

## 趣味でGUIやるのは避けてきた

正直、とても面倒な印象がありました。
今回は意外とそうではない気がしてくる結果でした。



## 例によってサンプルコードでお勉強

今回もサンプルコートから読解していきます。
使用するのは4duino > Basic Graphics > Buttonです。

正常に接続されていれば、そのままファイルを読み込んでこんぷんろーどすると動くと思います。

![Capture15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/fb4dc1d7-bb0b-96bf-45d0-a8d53c1c62e2.jpeg)

既に画像では僕の改変が施されていますが、タッチレスポンス等々のメインコードはここです。

①Touch Screen情報の更新
`state = Display.touch_Get(TOUCH_STATUS);               // get touchscreen status`
"Display.touch_Get(TOUCH_STATUS);"でstateにon/off情報を格納しています。

②押離しした時点でのtouch point座標を取得
`if((state == TOUCH_PRESSED) || (state == TOUCH_MOVING))  `
コードを解読して知りましたが、ボタンは指が離れた時の座標によって操作できるみたいです。
つまり、ボタンの位置から押し始めてドラッグしてボタン外のほうに行ってしまうと反応せず、ボタン外から、ボタン内に入って押離しすると反応するという仕組み。

③ボタンの入力を格納
`Bstate = !Bstate ;`    
変数Bstateにボタン入力動作を格納しています。!は論理否定ですかね。
押したら論理が反転してif分岐する。と。分岐先に処理が書いてあります。

④ボタンの表示
`Display.gfx_Button(Bstate, 44, 40, PLUM, YELLOW, FONT3, 2, 2, "Press Me") ;  // Width=141 Height=33
ここでは、ボタンオブジェクトの表示命令とそのサイズ、色、文字に関してが書いてあるんだと思います。



## 結果
![IMG_1685.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/d7112181-2c72-0c14-e987-f3c9dc794bdd.jpeg)

サンプルコードに手を加えて、押した回数を表示させました。
この回数の処理は一個前の投稿の変数の扱いをそのまま流用しています。

## 終わりに

とりあえず、スタートラインには立てたような気がします。
ただ、このボードはESPを積んでいるのでWifiを扱えるんですよ。次の投稿では4duinoをLanにWifiで接続してみて、取得した時刻情報を表示する段階に行きたいと思います。
uim-mozc vs ibus-mozc

Debian 10 では uim-mozc がデフォルトのようですが、システムトレイにアイコンを表示することができませんでした。独立したツールバーであれば、表示させることができますが、他の画面と重なると下の文字が読めません。

ibus-mozc をインストールしたところ、システムトレイにアイコンが表示されました。 ibus-mozc の方が良さそうです。
CatalinaでReadOnlyになったrootに書き込む

自分用のメモです

SIPを無効にして
`sudo mount -uw /`

---
参考
>https://news.mynavi.jp/article/osxhack-242/
>https://www.reddit.com/r/MacOS/comments/caiue5/macos_catalina_readonly_file_system_with_sip/
AWS AmplifyのAPI認証はどれがいいのか？

# はじめに
`Amplify add api`をすると、API認証の種類を選ぶことができる。
設定できるオプションの特徴をまとめる。

# 比較

### API Key
**一番手軽。テスト用。**
必ず指定した日にちごとに再設定しなければならない。
-1を指定すると自動更新されるとの記事を見かけたが、自分の環境では更新されなかった。


### Cognito User Pools
**本番にも使える。基本はこれにしておけば間違いない。**
ユーザごとのアクセス制御である。Amplifyのユーザー認証と組み合わせて、ログインしたユーザに対してアクセスできるリソースを指定して用いる。


### IAM
**未認証ユーザにも使える。公開APIにしたいときにおすすめ。**
ロールベースのアクセス制御である。Amplifyの場合、デフォルトだと、authRole, unAuthRoleが生成されるので、それぞれ認証ユーザ、未認証ユーザにアクセスさせたいリソースを指定して用いる。


### OIDC Auth
**外部の認証を使いたいときに使う。**
上記3認証方式と組み合わせて使うと良い。

# おまけ
UserPoolとIAMのユースケースの違いは、Amazon公式にまとまっている。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-user-pools-identity-pools/
AWS日記①

# AWSの利用の動機
 - 無料利用枠がある
 - 機械学習・深層学習のサービスを利用できる
 - Lambdaを利用してサーバレスなWEBサービスを作成できる

# AWSのアカウント登録
#### [AWS](https://aws.amazon.com/jp/)の「無料サインアップ」をクリックし、以下の項目を入力・選択していく
 - E メールアドレス
 - パスワード
 - AWS アカウント名
 - アカウントの種類
  - パーソナル
 - フルネーム
 - 電話番号
 - 国/地域
 - アドレス
 - 市区町村
 - 都道府県または地域
 - 郵便番号
 - クレジット/デビットカード番号
 - 有効期限日
 - カード保有者の氏名
 - 請求先住所
 - 検証コードをどのように受け取りますか?
 - 国またはリージョンコード
 - 携帯電話番号
 - セキュリティチェック 

##### アカウント登録が完了すれば「AWS マネジメントコンソール」に入れるようになります

# 終わりに
住所・クレカ・スマホ(電話番号)を持っていればAWSのアカウントを作成できます
無料利用枠だけ使用したい場合でもクレカ情報の入力を求められます
UE4 Python VSCodeに入力補間を効かせてみた

#はじめに
 UE4でPythonが使用できるようになりました、VSCodeでソースを書いてきたのですが、入力補間がないとつらい・・・。ということで入力補間する方法を検証しました。
UE4.24+VSCodeにて検証しています

##UE4設定

### プラグインを有効にする
Edit/Pluginsより
Python Editor Script Pluginを有効にする

![image1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594253/1bd0880c-3619-88c0-ff4c-3f57a9d0f438.png)

### Pythonのスタブを作成する
Python Editor 
Edit/ProjectSettingより
![image2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594253/b1643707-c39b-8c08-e644-cf9f331d69e0.png)
Python/DeveloperModeを有効にします。

こちらを有効にすることによって、UE4を再起動後、ProjectPath\Intermediate\PythonStub以下に入力補間で使用するためのPythonスタブデータが作成されます。
![image5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594253/79231d67-b0cf-148a-4672-1453717c5738.png)

##VSCode設定

### Pythonスタブファイルを参照できるようにパスを設定
File/Preference/Settingsを開きます
![image3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594253/a0157c59-3866-3176-9aa2-4a3d30d8bcc6.png)

SettingsよりPython.AutoCOmplete:ExtraPathsを選択
![image4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594253/828d177b-a681-5b40-70a3-02190bb037fd.png)

settings.jsonに
```
"python.autoComplete.extraPaths": [
   "${workspaceFolder}/../../Intermediate/PythonStub/unreal.py"
 ],
"python.jediEnabled": false,
```
上記の設定を追加します。
python.autoComplete.extraPathsはUE4から出力されたPythonのスタブファイルへのパスを指定します。
VSCodeデフォルトのインテリジェンスだと解析に失敗し使用できませんでしたので
"python.jediEnabled": false,
に設定してMicrosoftのインテリジェンスを使用するようにします。
![image8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594253/9557df07-7724-d7de-bd34-9b57732ec7a4.png)

## 実際に使用してみる
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594253/581c2e42-3ddf-f615-f6a1-db128f9f266e.png)

unreal.と入力すると入力補間が効いていることが確認できます。
これでunrealのヘルプを見に行かなくてもある程度のコードは書いていけいるようになります。

## 問題点
入力補間が効くようになったのはいいが、補間速度が遅い、
thinkpad x1 yoga 2018
Intel Corei7 8650Uの環境で試したのですが補間が効くまで10秒弱かかります。
それでもヘルプを調べに行くよりかは楽にソースが書けるようになりました。
dockerでOracle Database18cの開発環境構築してみた

## 背景
とある調査を実施のためにlocalにOracle Databaseを構築してみました、という話です。
今回は、その備忘録です。

## 開発環境
- Windows10
- Docker Desktop for Windows
- Oracle Database 18c (18.3.0) Express Edition (XE)

## 手順
1. oracle databeseの公式repositoryを取得

	docker imageをbuildするためのscriptは、Oracleがgithub上で公開をしています。今回は、そのscriptを利用してdocker imageの作成を行います(手順は後述)。

    ```
    cd ${projecty root}/build/docker/oracle/
    git clone https://github.com/oracle/docker-images.git
    ```

2. oracle database本体の取得

	[oracle database 18c(18.3.0)](https://www.oracle.com/technetwork/jp/database/enterprise-edition/downloads/index.html)にて公開されているバイナリを取得します。

    ![キャプチャ_oracle database18.3.0バイナリ取得元.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488212/16b06852-3dc4-46bd-6f99-0e15f5513e69.png)

3. downloadファイルを配置

    ```
    cd ${projecty root}/build/docker/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/18.3.0
    cp ~/Download/linu.x64_180000_db_home.zip .
    ```

4. docker imageのbuild

    git cloneで取得したshell scriptにて、docker imageを作成します。

    ```
    cd ${projecty root}/build/docker/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles
    sh biuldDockerImage.sh -v 18.3.0 -e
    ```
    
    以下のメッセージが出力されることを確認できれば、docker imageの作成を行います。
    
    ```
    Oracle Database Docker Image for 'ee' version 18.4.0 is ready to be extended:

    --> oracle/database:18.4.0-ee

  	Build completed in 928 seconds.
  	```

	ここで、以下のエラーが発生した場合は、docker imageを作成する際に実行するshell scriptの改行コードが`LF`から`CRLF`に変更されている可能性があります。対象のshell scriptの改行コードを`LF`にします。
    
    ```
    MD5 for required packages to build this image did not match!
    Make sure to download missing files in folder 18.3.0.
    ```

5. imageの出力確認

	作成されたdocker imageを確認します。

    ```
    docker images
    REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
    oracle/database                                     18
    3.0-ee         c90d8241c96d        3 hours ago         5.98GB
    ...省略...
    ```

6. docker-compose.ymlに構成の記述

    ```yaml
    version: '2'

    services:
      db:
        image: oracle/database:18.3.0-ee
        environment:
          ORACLE_SID: ORCL
          ORACLE_PDB: SAMPLE
          ORACLE_PWD: password
          ORACLE_CHARACTERSET: AL32UTF8
          ORA_SDTZ: Japan
        ports:
          - "1521:1521"
          - "5500:5500"
        volumes:
          - ./build/docker/oracle/oradata:/opt/oracle/oradata
    ```

7. docker containerの起動

    docker-composeコマンドでcontainerの起動をします。
    なお、この処理には時間がかかります。(30分程度)

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

    起動が確認できれば、構築は完了です。
中学2年生がYoutubeAPIをつかって解析させるLINEBot作った

<h1>どんなLineBotか</h1>

<h4>会話してくれるLineBot</h4>
![コメント 2020-03-01 172942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/40168e4b-a68e-741f-b107-235edf27ac20.png)




<h4>youtube解析もできる！</h4>
![コメント 2020-03-01 171848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/13ec9a5c-699b-65ed-d3ed-77c2a7a91019.png)

<h2>ただ、こんなLineBot(くろrailsBot)にも弱点がある。</h2>

<h4>ひらがな（一部カタカナやアルファベット対応）しか対応していない</h4>

そうなんです。。べつに機械学習したわけではないので。
このようにひらがなのみ対応です。
そして、別に高性能でもない　かなり低知能です。

でもおはよう！　とか　こんにちは！とか　基本的な会話はできると思いますよ。(たぶん。。。。。ｗ)

<h2>最後に</h2>

Railsで作ったんですけど、やっぱりpythonで作ったほうが
なんか　ザ　BOT　って感じがするんですけどね。。
まぁいいでしょう。　いやー疲れた。
3/0(昨日)
10時間くらい機能のつけたししまくってましたｗｗｗｗ
本当にお疲れ様でした。

くろrailsBotのLINE追加はこちら　⇃

![107hstht.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/fc8e78da-290d-99b0-8ca9-f9e0300df8c5.png)

くろrailsBotのソースコード　⇃

https://github.com/HTMLjsgit/linebot
Flutterでボタンとかテキストを隠す方法

# FlutterでボタンとかのHideってどうやるの？
最近、趣味でFlutterを使ってアプリ開発をやるようになって、ふとボタンやテキストを隠したくなった時に「そもそもFlutterではどうやってWidgetを隠すんだ？」と思ったので、そのまとめ(＋備忘録)です。

## 結論: 「Visibility Widget」で対象のウィジェットをラップする
解決方法はめっちゃ簡単で「Visiblity」というウィジェットで隠したいウィジェット(ボタンとかテキストとか)をラップするだけ

```dart
Visibility(
  child: Text('隠れるよ'),
  visible: false, // ここで隠すか表示するかを選択する
)
```

ね？簡単でしょ？

Flutterの[公式](https://api.flutter.dev/flutter/widgets/Visibility-class.html)をみてみると
> By default, the visible property controls whether the child is included in the subtree or not; when it is not visible, the replacement child (typically a zero-sized box) is included instead.

要するに、`visible`プロパティーが`false`(=表示しない)の場合は`child`に設定されているウィジェットの代わりに高さゼロの`SizedBox`が設定されるらしい。

## 実例
実際にどうやって`visible`を制御するのかを、Flutterのデフォルトのサンプルを改良して「カウントが10以上になると、新たに`Text`ウィジェットが追加される機能」を実装してみる。

```dart:main.dart
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  // 追加
  bool _isVisible = false;

  void _incrementCounter() {
    setState(() {
      _counter++;
      // 追加
      _isVisible = (_counter >= 10);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
            // 追加
            Visibility(
              child: Text('Count is 10 or more'),
              visible: _isVisible,
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
```

変更点をひとつづつみていくと、、、

```dart
  // 追加
  bool _isVisible = false;
```

ここでは、新たに追加するウィジェットを表示するかどうかの変数を新たに定義している。

```dart
  void _incrementCounter() {
    setState(() {
      _counter++;
      // 追加
      _isVisible = (_counter >= 10);
    });
  }
```

ここでは、`_incrementCounter()`が呼び出されるたび(プラスボタンが押されるたび)に`_counter`が10以上でないかをチェックして値を反映している。


```dart
// 追加
Visibility(
  child: Text('Count is 10 or more'),
  visible: _isVisible,
)
```

ここでは、新たにカウントが10以上になったときに表示するウィジェットをツリーに追加している。
また`visible: _isVisible`の部分でここでウィジェットの表示・非表示を設定している。


## 終わりに
宣言的UIのフレームワークを今まであまり使ったことがなかったので、ボタンとかを隠すときに「どうやんねんこれ？」って思ったんですが、意外に簡単にできたので「やっぱりFlutterは使いやすいなぁ」と安い感想を思い浮かべました。

最近、Flutterを使ったアプリ開発がかなり楽しいので引き続き頑張って学習していこうと思います(英語も...)
Maya で XGen igs から生成したメッシュに unique な UV 座標を割り当てるメモ 

## 背景

XGen igs から, Convert interactive grooming で生成するメッシュは, すべての strand に `[0, 1]^2` で UV が割り当てられる. これを strand ごとに unique な UV を持つようにしたい.

## 方法

https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2018/JPN/Maya-Modeling/files/GUID-73BF7546-3BF2-44F3-9192-15A024CEC173-htm.html

基本は UV の自動生成(UV editor -> Create -> Automatic)でうまくいくはず.
spacing も設定できる.


## TODO

* [ ] light map(bake)用の設定でなにか使えるものがあるか調べる(e.g. テクセル密度一定など)
Firestoreで500件以上のデータをBatchで書き込む


FirestoreのBatch()では一度に書き込めるデータ数は500件以下しか書き込めない制限があります。

500件以上一気に書き込みをやろうとすると、失敗になります。

当たり前ですが、失敗のときどういう挙動になるかというと、 1~500件は成功して、それ以上は失敗するみたいな挙動ではなく、 **全ての書き込みに失敗します。**


https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja


## 500件以上書き込みをする

では、どうやって500件以上を書き込みをするかという、 **500件以上ある場合は、データを分割して書き込みを行います。**

分割して、書き込むサンプルは下記です。


```typescript

const followerList = follower.docs;

  const batchArray: FirebaseFirestore.WriteBatch[] = [];
  batchArray.push(db.batch()!);
  let operationCounter = 0;
  let batchIndex = 0;

  followerList.forEach(async (doc: FirebaseFirestore.DocumentSnapshot) => {
    const timelineDoc = db
      .collection("timeline")
      .doc(doc.id);
    batchArray[batchIndex].set(timelineDoc, copyedData);
    operationCounter++;

    if (operationCounter === 499) {
      batchArray.push(db.batch());
      batchIndex++;
      operationCounter = 0;
    }
  });

  batchArray.forEach(async batch => await batch.commit());

```
ActiveRecordとrubyの感嘆符！は意味が違う件について

# はじめに
`ruby`のメソッドに対して使う！と、`Rails`のメソッドに対して使う！では、意味が異なるので簡単にまとめてみました。

# 簡潔に言うと...
●`ruby`の場合
注意喚起。今からオブジェクトに対して何らかの変化を加えますよ〜とういう合図。
例：uniq! reverse!

●`ActiveRecord`の場合
メソッドを実行した結果の返却値がnilの場合に例外を発生させる。
例：save! update!

# ● rubyの場合
```ruby
hoge = [1,2,2,3,3]
hoge.uniq! #たまに見かけるこれ！
```
### ●`uniq`と`uniq!`何が違うの?
`uniq` 配列から重複した要素を取り除いた新しい配列を返す。
`uniq!`　削除を破壊的に行い元の配列をの値を操作する。

```ruby
hoge = [1,2,2,3,3]

hoge.uniq
p hoge #-> [1,2,2,3,3]

hoge.uniq!
p hoge #-> [1,2,3]
```
#### ●まとめると...
`!`は配列を破壊的に操作すると言う注意喚起を意味しています。
(慣習的に!は注意喚起に使われることが多い様です。)
`uniq`の場合は、`！`をつけることで、配列そのものに変更を加えています。

# ● ActiveRecordの場合
```ruby
def update
 @hoge = Hoge.find(params[:id])
 @hoge.save! #よく見かけるこれ！
end 
```
#### ● `save`と`save!`何が違うの?
`save` レコードの保存に失敗　→　**nil**を返す
`save!` レコードの保存に失敗　→　**例外**を発生させる

#### ●まとめると...
`!`はメソッドの処理が失敗した場合に、**例外処理**を行うと言う意味を持たせています。

## 番外編
#### ● 例外処理とは
>例えば、「入力された2つの数を足し合わせて結果を返す」コードがあるとき、利用者が入力欄に「あ」と書き入れると数値の足し算の処理は実行不可能となる。
このようなプログラムが通常の処理では想定していない事態や事象を「例外」（exception）と呼び、例外が生じた時の対応を記述したコードを例外処理という。

つまり、何らかの予期せぬエラーが発生した際に、別の処理を行うこと。
製薬企業研究者がPHPの基本的な文法についてざっくりまとめてみた

# はじめに

ここでは、PHPの基本的な文法をざっくりとまとめてみます。


# 基本的な記述方法

PHPは`.php`という拡張子のファイルに記述します。
HTMLのソースコードの中で`<?php`から始まる部分がPHPのコード部分になります。
PHPでは文末にセミコロン`;`が必要になります。
コメントを書くときは、`//`を使います。
また、複数行に渡るコメントは`/* */`を使って書くことができます。
オブジェクトの値を出力するときは、`echo`を使います。


# 変数とデータ型

変数は、`$変数名 = 値;`として宣言します。

```php:variable.php
<?php

$str = '文字列'; // 文字列
echo $str;

$num = 123; // 数値
echo $num;

$isBoolean = true; // 真偽値
echo $isBoolean;

$arr = array('Python', 'R', 'JavaScript', 'PHP'); // 配列
echo $arr;

$dict = array(
    'Python' => 'AI',
    'R' => 'statistics',
    'JavaScript' => 'web',
    'PHP' => 'WordPress'
); // 連想配列
echo $dict;

?>
```


# 制御文

## 条件分岐

### if文

if文は、`if (条件) {処理}`と記述します。
さらに場合分けするときは、`else`や`else if`を使います。

```php:if.php
<?php

num = 3;

if ($num == 1) {
    echo '1';
} else if ($num == 2) {
    echo '2';
} else if ($num == 3) {
    echo '3';
} else {
    echo '1でも2でも3でもない';
}

?>
```


### switch文

if文で場合分けが多くなる場合は、switch文を使うと簡単に書けます。
switch文は、`switch (変数) {case 値: 処理; ・・・}`と記述します。

```php:switch.php
<?php

$num = 3;

switch ($num) {
    case 1:
        echo '1';
        break;
    case 2:
        echo '2';
        break;
    case 3:
        echo '3';
        break;
    default:
        echo '1でも2でも3でもない';
        break;
}

?>
```

なお、`break`を書かないと、条件に合った場合でも後続の`case`の処理が走ってしまうので注意が必要です。


## 反復処理

### for文

一定回数だけ繰り返し処理を実行する（繰り返し回数があらかじめ分かっている）ときは、for文を用います。
for文は、`for ($変数名 = 初期値; $変数 <= 最大値; $変数の値の更新)`と記述します。

```php:for.php
<?php

for ($i = 1; $i <= 5; $i++) {
    echo $i;
}

?>
```

ここで、`$i++`となっているのは、`$i = $i + 1`すなわち反復処理を繰り返すごとに変数`$i`を1ずつ大きくしていくことを示しています。これは、`$i += 1`とも書けますが、変数の値を1ずつ更新していく場合は、この書き方はあまりせず、`$i++`または`$i--`と書きます。変数の更新幅が1以外の場合は、`$i += 2`のように書きます。

また、`foreach ($配列 as $変数名) {処理}`とすると、配列の要素を一つずつ取り出すことができます。

```php:foreach.php
<?php

$arr = array('Python', 'R', 'JavaScript', 'PHP');

foreach ($arr as $lang) {
    echo $lang;
}

?>
```


### while文

ある条件を満たす間だけ処理を繰り返す場合は、while文を用います。
while文は、`while (条件) {処理}`と記述します。

```php:while.php
<?php

$i = 1;

while ($i < 5) {
    echo $i;
    $i++; // 変数の値の更新
}

?>
```


# 関数

関数は、`function 関数名(引数){処理}`とすることで作成できます。

```php:function.php
<?php

function copyNumber($num) {
    return $num;
}

echo copyNumber(123);

?>
```


# クラス

クラスは、`class クラス名 {プロパティ、メソッドなどの内容}`とすることで作成できます。
`new`を使うことで、新しいインスタンスを生成できます。

```php:class.php
<?php

class Human {
    public $name;
    public $age;
    public function introduceMyself() {
        return 'I am ' + $this->name + ' and ' + $this->age + ' years old. ';
    }
}

$yukiya = new Human();
$yukiya->name = 'Yukiya';
$yukiya->age = 31;


echo $yukiya->name;
echo $yukiya->age;
echo $yukiya->introduceMyself();

?>
```


# まとめ

ここでは、PHPの基本的な文法について解説しました。
ウェブページのソースコードを見るときに役立ちます。
Maya でオブジェクト間で UV を転送するメモ

## 背景

Maya から, .obj などにエクスポートして, UV を割り当てなおしたメッシュがある.

UV を元の Maya のメッシュに戻したい

## 方法

https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2018/JPN/Maya-Modeling/files/GUID-BEB29BE8-E961-4DB3-B3EE-18ECE05F28EA-htm.html

http://ti0memo.blog.fc2.com/blog-entry-33.html?sp

ありがとうございます.

UV は current に設定しないとうまくコピーできないかも.

## TODO

* [ ] Pymel あたりで python で UV 配列を直接編集して UV 転送する.
【備忘録】controlキーを用いた便利なショートカット集/commandキー/Clipyも

【備忘録】【controlを用いた便利なショートカット集】

🔴【システム環境設定→キーボード→ショートカットで割当てをするもの】

個人的な割当て（デフォルトで設定されているもの含む）

［Spotlight］
・control＋Sキー：Spotlight検索を表示（Spotlightの頭文字の”S”を使用）


［LaunchpadとDock］
・control＋Dキー：Dockを自動的に・・・/非表示のオン/オフ（Dockの頭文字の”D”を使用）

・control＋Qキー：Launchpadを表示（頭文字は関係ないが、左手のみで操作できるように、controlキーの近くのQを使用）


［Mission Control］
・control＋上矢印キー：Mission Control（多分デフォルトで設定されている）

・conrtol＋左/右矢印キー：左/右の操作スペースに移動（これむっちゃ便利です！）

・control＋1〜5の数字キー：デスクトップ1〜5に瞬時に切り替え（上記の左右矢印キーのより便利かもです！！）

・control＋Zキー：デスクトップを表示（デフォルトで設定/今回追加したので未知数）






🔵【デフォルトで設定されているもの（別枠）】

・control＋Fキー：１文字分進む/右矢印キーと同じ役割（Forwardの頭文字の”F”を使用）

・control＋Bキー：１文字分戻る/左矢印キーと同じ役割（Backの頭文字の”B”を使用）

・control＋Pキー：１行分上に移動する/上矢印キーと同じ役割（Previous Lineの頭文字の”P”を使用）

・control＋Nキー：１行分下に移動する/下矢印キーと同じ役割（Next Lineの頭文字の”N”を使用）

・control＋Aキー：行または段落の先頭に移動する（alphabetの先頭の”A”）

・control＋Eキー：行または段落の末尾に移動する（Endの頭文字の”E”を使用）

・control＋Kキー：現在のカーソル位置から、行または段落の末尾までの範囲にあるテキストを削除する（Killの頭文字の”K”を使用）※削除したものは、クリップボードとは別の場所に保存される

・control＋Yキー：control＋Kで削除したものを貼り付け（ペースト）できる（Yankの頭文字の”Y”を使用）



参考：
https://bit.ly/2vkIKzo

キル&ヤンク
https://bit.ly/2uIGcuz








ーーーーーーー
【別枠１/commandを用いた一般的なショートカット集】

・command＋Cキー：コピー（Copyの頭文字の”C”を使用）

・command＋Vキー：ペースト（Cキーの右隣にあるから）

・command＋Xキー：切り取り（Cキーの左隣にあるから）

・command＋Zキー：直前のコマンドを取り消す（Xキーの隣にあるから）

・shift＋command＋Z：command＋Zで行った行為を元に戻す

※下記のApple公式サイトには他のショートカットも多数あります。


command＋VのVは難の略か
https://bit.ly/2vskjzV

Appleの公式サイトより
https://apple.co/3aiVHIM








ーーーーーーーーー
【別枠２/Clipyを用いたショートカット】

・option＋command＋下矢印キー：Clipyのメイン

・option＋command＋Vキー：Clipyの履歴



ーーーーーーーーー
【control＋Kの補足／control＋Kの本当の理解】

もうご存知の方も多いと思いますが、


control＋Kで切り取りできるのって、
「行または段落の終わりまでの範囲」なので、

例えば

あああああ
いいいいい
ううううう

👆

これだと、あの行で、control＋Kを押しても「い」や「う」の行は切り取りされず、「あ」の行のみ切り取りされます💡
（※Enterキーを押して改行しているから）


一方、

ああああああああああああああああああああああああああああああああああああああああああああああいいいいいいいいいいいいいいいい

👆

この場合は、control＋Kを「あ」の行で押すと、後ろ全てが切り取りされます💡
（※Enterキーを押していない(改行していない)為）


この事実に先程気づきました😅

読解力が弱いのが原因なんですが、

これでより効率的に文字打ちができるので、僕と同じ様に勘違いされていた方に向けてシェアしました💡

お役に立てれば幸いです🙇‍♂️✨
4D SYSTEMS の 4Duinoを試す (サンプルコードお試し編)3/5

## プログラミング独学の王道とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/a0bc7c7b-4939-54f5-2cd3-93f75aafbf25.png)

私のような趣味プログラマ(というのもおこがましいくらいの人間)は学校でちゃんとプログラミングを習ってないので、Readable Codeとか気にしません。というかそのような能力を持ち合わせておりません。そして、十分な知識を持ち合わせていないので、サンプルコードからそれらしい法則を見つけて、やりたいことだけをできるような知識を付けていきます。まさに付け焼刃。

今回も例によってサンプルコードを見ていきます。

## 意外と充実しているサンプルコード群

![Capture13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/04fc5704-8e8f-3d63-63fe-7e0b46046761.jpeg)

親切にもサンプルコードが充実しているので、いろいろ試していきました。
まずはやっぱり"Hello World"でしょう。
![IMG_1679.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/9d4388c1-37e0-ff35-7d1a-28e13579c020.jpeg)
これを実行すると、Hello Worldが表示されました。
色がloopごとにランダムで変わるようなコードなので、結構サイケディックな感じに仕上がっておりテンションを上げてくれます。

次に試したのは![IMG_1680.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/3a8d4da1-e7a2-c83b-2a3d-c88742a09c87.jpeg)
いっぱい表示させてみた。


なるほどなるほど・・・。
変数の扱いは？？というと、
![IMG_1681.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/c3b901bd-9599-c826-7b81-7a2eab9bc9e2.jpeg)
Count upして数字を変数表示しています。いい感じですね。

こんな感じでサンプルコードをベースにいろいろ遊んで慣れていきました。

僭越ながらコードについてコメントさせていただくと、
変数を表示させたいときはC言語みたいにやるのではなく、変数普通に宣言して
`Display.print(hogehoge) ; `
のように、Display.printを使うとうまくいきます。
サンプルコードのテキスト表示のコマンドは
`Display.putstr("Hello world") ;`
なので、ただ変更するだけではだめでした。

で、ループごとに文字を書き換えたい場合は文字コード
`\r`
を文末に入れてください。
入れないと、画面が文字だらけになります。カラフルできれいですけどね。

画面をクリアしたいときは↓も使えます。が、多分処理的に重いやつです。これはリセットの時に使うようにしましょう。
`Display.gfx_Cls();            //clear the screen`


## 結果
きれいな感じにできたので満足

## 終わりに
次の記事ではGUIの導入をします。
とりあえずボタンを表示してタッチパネルからの入力を反映する的な動作をしていきます。
あ、言ってなかったですが、このDisplayはタッチパネルなんですよ。

[次の記事](https://qiita.com/yuta4807/items/97e3f45e1625a7db9268)
node.jsをインストールの際、Chocolateyの提案を受けたのでインストールしてみた

#概要
windowsでnode.jsをインストールしてみた。
ネットのインストール画像にはない、Chocolateyに関するインストール確認がでてきたたため、合わせてインストールしてみた。

#環境
windows 10
node-v12.16.1-x64



#インストール画面
![Node.js Setup 2020_03_01 17_06_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/911ee6a3-6c57-109f-a137-05ff3f55860f.png)
![Node.js Setup 2020_03_01 17_06_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/25c8c6a0-a768-d98f-ec94-3520f8d9f59f.png)
![Node.js Setup 2020_03_01 17_06_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/6b75b404-4de4-7ee5-50c5-3bdd5bc57543.png)
![Node.js Setup 2020_03_01 17_06_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/2d951ab1-0bfa-348f-69f5-46955a1202a8.png)

以下が、Chocolateyに関するインストールの確認。
チェックをいれると、インストールされる。
![Node.js Setup 2020_03_01 17_06_59 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/977ed1ad-4f0e-fa15-fda1-6b9e4900a387.png)


Some npm modules need to be compiled from C/C++ when installing. If you want to be able to install such modules, some tools (Python 2 and Visual Studio Build Tools) need to be installed.
一部のnpmモジュールは、インストール時にC / C ++からコンパイルする必要があります。 
そのようなモジュールをインストールできるようにするには、いくつかのツール（Python 2およびVisual Studioビルドツール）をインストールする必要があります。



Automatically install the necessary tools. Note that this will also install Chocolatey. The script will pop-up in a new window after the installation completes.
必要なツールを自動的にインストールします。 これにより、Chocolateyもインストールされることに注意してください。
インストールが完了すると、スクリプトが新しいウィンドウにポップアップ表示されます。


Alternatively, follow the instructions at https://github.com/nodejs/node-gyp#on-windows to install the dependencies yourself.
または、https：//github.com/nodejs/node-gyp#on-windowsの指示に従って、依存関係を自分でインストールします。




![Node.js Setup 2020_03_01 17_08_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/d83faadd-2ede-f0da-0686-1e2f2492ca9e.png)

![Node.js Setup 2020_03_01 17_09_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/b37abdc5-9ced-8301-09b8-4700880c80c6.png)

この後には、以下の画面でChocolateyのインストールが始まった。
![管理者_ Windows PowerShell 2020_03_01 17_14_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/5c3ee857-2f16-3390-0168-ac4c890271cd.png)


なお、以下の画面ではなぜかエンターキーを押さないと処理が進まなかった。
![管理者_ Windows PowerShell 2020_03_01 17_21_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/35543b79-57b8-0fb1-992b-a88b0a4d79a6.png)

最後はこの画面でexitと入力してエンター
![管理者_ Windows PowerShell 2020_03_01 17_29_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222043/e2198c14-50e0-f27f-d190-910ab628a0c9.png)
GNOMEデスクトップでHiDPIディスプレイに対応する

# はじめに
MacBook AirのVMware FusionにWindowsをインストールした環境をサブ機として使用していますが、せっかくなのでLinuxも加えてみました。しかし、画面の解像度が高いため、やたらと文字が小さくて見づらい問題にあたりました。老眼になったときに困るので、今のうちにHiDPI対策をしておきます。

## 環境
- VMware Fusion バージョン 11.5.1
- CentOS 7
- GNOMEデスクトップ 3.28.2

<img width="1440" alt="スクリーンショット 2020-03-01 16.58.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/b9e81d3b-ba37-3d44-1b6e-970ba01565a8.png">
図　GNOMEデスクトップのフル解像度画面
メニューバーがとても小さい。

<img width="648" alt="スクリーンショット 2020-02-29 21.38.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/aaa1f71d-3a3e-beb2-816f-f9c350963a15.png">
図　VMware Fusionのディスプレイ設定
Retinaディスプレイのフル解像度を使用にチェックを入れると、2880x1800の設定が可能になる。

# スケールを変更する
スケールを２倍、３倍にするのは簡単で、設定＞デバイス＞ディスプレイ＞Scaleを200%にすればそれなりにいい感じなりました。ただし、100%、200%、300%の３つ設定しかできず、例えば150%などの間の設定はできないようです。

<img width="1440" alt="スクリーンショット 2020-03-01 16.59.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/68e153a9-ec8d-1b12-379b-dede67b7e92f.png">
図　Scale 200%の画面

# テキストスケールを変更する
個人的に200%よりもう少し小さくしたいので色々探したところ、GNOMEの設定変更で満足のいく画面になりました。GNOMEの一部設定は、テキストからdconfというデータベースに変わったらしく、ツール経由で変更する必要がありました。

```
$ gsettings set org.gnome.desktop.interface text-scaling-factor 0.75
```

<img width="1440" alt="スクリーンショット 2020-03-01 17.02.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/99c5b5fc-e432-a2fe-51f1-4f2ce0128b4b.png">
図　Scale 200%とtext-scaling-factor 0.75の画面

# GTKアプリケーションのスケールを変更する

GTKを使用したアプリケーションは上記では小さいままだったので、以下を追加します。

```
$ export GDK_SCALE=2
```

# まとめ
GNOMEデスクトップのスケールを変更することでHiDPIに対応させました。

アプリケーションによっては、スケーリングされないことがあるかもしれません。

# 参考
1. https://wiki.archlinux.jp/index.php/HiDPI
中学2年生がRailsでyoutube動画共有サービスを作った

<h1>１　おれtubeというサービスをつくった</h1>

<p>おれtubeっていうのは自分の好きなyoutube動画を投稿して。
それをユーザー同士で共有しあうみたいなサイトです。</p>

https://oretube.herokuapp.com/

↑　おれtubeのリンク

以前に遊びサーチというサービスを公開しましたが、
やはりあのサイトはデザインが。。ｗ

なのでちょっとデザインもシンプルにしてみました。

![コメント 2020-03-01 165632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/16bde369-a6c7-2c4c-a9e4-3a2b35f280df.png)

![コメント 2020-03-01 165819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/889d803a-9042-457f-4cf3-9753aee59986.png)

それとGoogleのみログインできるようにしました。


<h1>２ どのように作ったか</h1>
<br>
<h3>youtubeAPIを使う</h3>
<p>これがないと何もできないですね！</p>
<p>youtubeの動画埋め込みにはyoutubeAPIは使ってないんですが</p>
<p>youtubeの視聴回数や高評価　タイトルなどを取得するためにyoutubeAPIをつかっています</p>

```rb
'https://www.googleapis.com/youtube/v3/videos?id=' + url + '&key=' + ENV['YOUTUBEAPIKEY'] + '&part=snippet,contentDetails,statistics'
		json = open(jsonURL).read
```
これでjsonを取得してここからタイトルや本文を取ってくるって感じです。

<h1>最後に</h1>
遊びサーチに比べてあまり時間がかかりませんでした。
遊びサーチはあんなに時間かけてデザインひどいし、
最悪でしたね。。。　
ですが、その反省をしっかりいかすことができました。
本当に良かったです。

ツイッターやっています。　よかったら見ていってください
https://twitter.com/Kuro_on_Rails
複数グラフが１ウィンドウに重なって表示されてしまう（python）

#問題
２つのグラフを個別のウィンドウに分けてプロットするつもりが、１つのウィンドウに重ねて表示されてしまう。
###ソースコード
```
import matplotlib.pyplot as plt
a = [a for a in range(10)]
b = [-a for a in a]
a = plt.plot(a)
b = plt.plot(b)
plt.show()
```
###実行結果
本来は別々のウィンドウに表示したいが、同じウィンドウに別の線として描画される。
青線：aデータ
橙線：bデータ
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594953/167389e6-3d18-d3cf-d787-eaa38a524ce3.png)


#正しい書き方
新しく別ウィンドウを作成して描画したい場合は、plt.figure()を実行する必要がある。
plt.figure() メソッドは何も描画されていない新しいウィンドウを描画する機能。

###ソースコード
```
import matplotlib.pyplot as plt
a = [a for a in range(10)]
b = [-a for a in a]
plt.figure()   #新しいウィンドウを描画
a = plt.plot(a)
plt.figure()   #新しいウィンドウを描画
b = plt.plot(b)
plt.show()
```

###実行結果
２つのウィンドウに分割されて表示される。
上グラフ：aデータ
下グラフ：bデータ
![after_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594953/509578e0-f2a5-4922-8d93-19a674ed4197.png)
![after_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594953/6dc23f1a-bb60-3a86-5ebb-6a69831ce411.png)
4D SYSTEMS の 4Duinoを試す (Workshop4 導入編)2/5

## 初めて使うけど

![Captur4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/ad7af740-3e7d-d446-0c1d-25d047756d68.jpeg)

4DuinoのGUI開発をするためにWorkshop4を導入します。
こちら4D Systemsが無料で配布するIDEです。独特なUIデザインですが、とりあえず受け入れていきましょう。

## 最初の問題
Installをする前から癖の強さを見せつけてくれるこのソフトです。
冒頭からこれ。Install exeを起動するとまずサプライズ。
![Capture6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/f0c6ee27-569f-7187-dbb1-ba5e94df2518.jpeg)

さあ、自己責任の領域に突入しますので、ここからは人柱PCでお試しすることをお勧めします。
こうなっちゃってる原因はSoftwareにpublisherの署名がないからみたいです。(いやいやいや・・・。)

## 始まってしまえば簡単

自己責任の壁を超えることができればあとはNextを連打してFinishするだけ。
すぐにWindows Vista風のAeroデザインに再会することができるでしょう。違和感は慣れてください。

まず確認するのは
`File > Option > Arduino`
を確認して、4Duinoの名前があるか確認しましょう。
![Capture8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/c50e2fc4-73d2-823d-ebfb-a14ac5df77fb.jpeg)

名前があればOKです。なければIDEの方の設定がミスってます。
そして、Arduinoタブがそもそも開けない場合はWindows app版をInstallしてしまっているので、ArduinoIDEとWorkshop4をUninstallして、ArduinoIDEのインストールからやり直しましょう。

コンパイラとしてArduinoIDEを使用しているのだと思います。
そのため、4duinoの開発をするためにはArduinoIDEとの連携が必要です。

## 接続の確認方法
取説を読むとCommタブに
<img width=500％ alt="Capture9.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/2dbc56fc-9d9c-1bdd-5cb9-6c2ef50465c9.jpeg">
これがあって、「紫の丸をクリックするとチェックできるよ」とあるのですが、これをやるとなんか失敗します。
<img width=500％ alt="Capture10.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/b7a23d29-8e72-51ea-b74a-76077dcab085.jpeg">

なので、無視してテストプログラムをコンパイルしてUploadしましょう。

## Lチカの儀

ArduinoIDEでテストしたプログラムがこちらのIDEで再現するかを確認します。
なお、この時点ではDisplayには何も指示していません。

![Capture11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/da7b4abb-5f35-d46a-5fd3-7bc8c2597e86.jpeg)

さっきのコードをコピペして
![Capture11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/903ca779-16f8-764e-8502-83148627e9bd.jpeg)

こんぷんろーど！！ (Compile and Load)

すると何度かPCからデバイスの再接続の音がして、Logが流れます。
![12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193066/468f87ce-05d2-91fa-06c7-14378d7096b4.jpeg)

内容はとにかく、最後にCompleted RC = 0が表示されてればエラーなしで終了していることを意味しています。
ここが Completed RC = 1 とかCompleted RC = -1だとコードのどこかにバグがあるので、logを参考にdebugしてください。

## 結果
動作OK

## 終わりに

4duinoのGUIを開発できるWorkshop4の導入が終わりました。
後は開発するだけです。次にポイントになるのは PICASOっていうLiblaryを含むコードを理解することでしょうか。。。


[次の記事](https://qiita.com/yuta4807/items/09bc2e047917a89d5ff2)
Raspbianの準備

# Raspbianの準備

- Raspberry Pi hoge の準備
- micro SD カードの準備
- Raspbian OS イメージファイルの準備
- SDカード書き込みのためのソフトの準備
- HDMIケーブル
- モニター
- USBキーボード
- USBマウス

## 今回用意したもの

- Raspberry Pi 3B+
- 専用の電源用ACアダプター（安定した電力供給のため）
- micro SDカード
- Win32DiskImager
- SD Card Formatter

## 起動の準備
OSのイメージファイルをダウンロードします。（結構時間がかかる）
https://www.raspberrypi.org/downloads/raspbian/

今回はRaspbian Buster with desktopを使用します。

## micro SDカードにイメージファイルを書き込む
上記で紹介したフォーマットソフト、書き込みソフト等を利用し、micro SDカードにイメージファイルを書き込みます。

## 起動
書き込み済みのmicro SDを基盤に取付、モニター、マウス、キーボード、電源アダプターを装着し、電源を入れます。
OSが起動し、デスクトップが表示されると使用言語やWiFiのアクセス等の初期設定の画面が表示されるので設定をしていきます。

以上でセットアップは終了です。
karabiner設定方法（超簡単な必要最小限ver.） 

backquoteの位置が気に入らなかったので。

長々しい説明を省いた超簡易バージョン！

## 設定ファイルを開く

```bash
# vscodeで設定ファイルを開く場合
code -n ~/.config/karabiner/karabiner.json
```

## json形式で設定を追加

※この例は"alt + backslashでbackquote"にする場合

```javascript

{
    "description": "alt + backslashで `",
    "manipulators": [
        {
            "type": "basic",
            "from": {
                "key_code": "backslash",
                "modifiers": {
                    "mandatory": [ "left_alt" ]
                }
            },
            "to": [
                {
                    "key_code": "grave_accent_and_tilde"
                }
            ]
        }
    ]
},

```

詳細を知りたい方はこちら
[Karabiner\-Elementsの設定項目をまとめました \- Qiita](https://qiita.com/s-show/items/a1fd228b04801477729c)
CSVファイルを作成してrails db:seedで大量のデータを投入する

栄養価を意識したレシピ投稿サイトを作っています
大量の食材を一つ一つデータに投入するのは面倒です
そこで食品成分表２０１５のデータを使って（そこらへんにあります）、
自分の使いたいデータを抽出してcsvファイルにまとめてrails db:seed で一気にデータを入れます

僕のPCはMacbookなのでGoogleスプレッドシートを使います

## 手順
1. 使いたいデータをgoogleスプレッドシートに入れます<img width="1388" alt="486742c34028055b0dc040753a47b657.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594198/a97919f8-057c-6852-4363-59da05c7f031.png">

2.左上の「ファイル」→「ダウンロード」→「カンマ区切りの値（.csv、現在のシート）」でcsvファイルを保存

3.保存したファイルをrailsのdb/csvのなかに保存

4.db/seedsrbに書き込み

```rails:db/seeds.rb

require "csv"

CSV.foreach('CSVファイルのパス',headers: true) do |row|
  モデル名.create(
    カラム名:     row['csvファイルの列'],
    〜
    〜
  )
end

```

5.rails db:migrate →　rails db:seedでデータ呼び込み


以上
初めてcsvファイルを触りましたが思ってたよりカンタンに導入できました

いつものことですが、もし間違ってたらご指摘いただけると助かります
VBAで一つのフォームを使い回すときの小技

初投稿です。
#一つのフォームを使い回すときの小技
VBAぐらいしか使えるものがない環境でフォームを使ってGUIを作るときにフォームの見た目を違う処理で使い回す場合に使っている小技。

##使い回せないやり方
```visualbasic:Class1.cls
Private WithEvents MyForm As UserForm1
```
フォームをそのまま上記のように書いてもUserForm1自体はイベントを持っていないので動作しない。

```visualbasic:Class1.cls
Private WithEvents MyForm As MSForms.UserForm
```
のようにMSFormsのUserForm型を指定すれば一部のイベントは有効になるが、ActivateやQueryCloseなどの機能が使えない。
以前はここでUserForm1側に処理の実態を書いていたが、同じような見た目でラベル名などを変えて使い回すときに不便。

##今回考えたやり方
そこで考えたのがUserForm1自体にそのイベントをリレーさせるためのイベントを用意するという方法。

```visualbasic:UserForm.frm
Public Event Activate()
Public Event QueryClose(ByRef Cancel_ As Integer, ByRef CloseMode_ As Integer)
Private Sub UserForm_Activate()
    RaiseEvent Activate
End Sub
Private Sub UserForm_QueryClose(ByRef Cancel As Integer, ByRef CloseMode As Integer)
    RaiseEvent QueryClose(Cancel, CloseMode)
End If
```
この方法ならクラス側で最初の例のようにUserForm1型でイベントをキャッチできるようになる。
必要なイベントだけリレー用の処理を書けばいい。
この処理を書いたUserForm1を他のクラス上でNewして新規に渡せば同じフォームをベースにした複数のフォームを独立して使用できる。

※UserForm1などのフォームはただのVB_PredeclaredIdがTrueになってるクラスなのでクラスで使う場合は個別にNewする。
複数の場所でSet MyForm = UserForm1をしてしまうと同じインスタンスを参照することになる。

```visualbasic
Set MyForm = New UserForm1 '新規インスタンス
Set MyForm = UserForm1 'PublicなUserForm1という名前の変数に作成されたインスタンス
```
##ちょっと凝ったことをする場合
そのまま渡すとちょっと引数が分かりにくいので下記のように自分で発行するイベントの引数の型はわかりやすいように変更してもいい。

```visualbasic:UserForm1.frm
Public Event QueryClose(ByRef Cancel As Boolean, ByRef CloseMode As VbQueryClose)
Private Sub UserForm_QueryClose(ByRef Cancel As Integer, ByRef CloseMode As Integer)
    Dim RefCancel As Boolean
    Dim RefCloseMode As VbQueryClose
    RefCancel = Cancel
    RefCloseMode = CloseMode
    RaiseEvent QueryClose(RefCancel, RefCloseMode)
    Cancel = RefCancel
    CloseMode = RefCloseMode
End Sub
```
ただしBooleanはともかく、VbQueryCloseはEnumであるためIntegerの範囲外の値を入れられる。
わざと作らない限りはエラー処理は不要だがIntegerの範囲外の値を戻すことも一応は可能なので必要に応じて範囲外の値を弾く処理を入れることもあるかもしれない。