OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby　Timeクラスで今日の日付と曜日を出力する


#Timeクラス　　
Timeクラスとはrubyが用意している標準ライブラリのことで、日付・曜日の出力に使われます。
Rubyの日付に関する標準ライブラリには他にもDateクラスやDatetimeクラスが存在します。
今回はTimeクラスを使用して、日付と曜日を出力してみます。

#今日の日付を出力する
Timeクラスを使用すると、簡単に、今日の日付を出力することができます。

```Ruby
now = Time.new  
p now   #2021-04-22 14:15:37 +0900
```
また、「年」だけ取り出したい、「月」だけ取り出したい、「日」だけ、、、といった感じで、以下のような記載方法でTimeオブジェクトを切り出すことができます。

```ruby
now = Time.new
p now.year  #2021（年）
p now.month #4（月）
p now.day   #22（日）
p now.hour  #14（時）
p now.min   #15（分）
p now.sec   #37（秒）
p now.wday  #4 (木曜日のこと)
p now.zone  #JST（日本時間）
```
#曜日を出力する
先程、`now.wday　#4 (木曜日のこと)`と記載しましたが、`.wdayメソッド`を使うと、曜日を０（日曜）から６（土曜）で数字で表現することができ、曜日を表示させるためには、日曜日から土曜日までの配列を作成して、そこから出力してやります。

```ruby
now = Time.new
week = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
p week[now.wday] #木曜日
```
#今日の日付と曜日をそれっぽく出力する
以上の記事をまとめて、日付と曜日をそれっぽく出力してみます。

```ruby
now = Time.new
week = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
week[now.wday] #木曜日

p "今日の日付は西暦#{now.year}年#{now.month}月#{now.day}日、#{week[now.wday]}です。"
#今日の日付は西暦2021年４月２２日、木曜日です。
```
本日、初めて記事を投稿させていただきました。
これから、自分の学習内容などを投稿していこうと思います。
ご覧いただき、ありがとうございました。
mysqldumpをするときによく使うオプションとリストア方法

## 概要
- mysqldumpする時に色々と気をつける必要があるけど結構忘れがちなのでメモ
- オプションは、mysql5.6公式リファンレスに記載の内容をベースとして設定。 
    - https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html

## 手順
###  事前準備
- `--default-character-set`でどの文字コードで mysqldump を取得するか、対象 DB の現在の文字コードを確認する

```
$ mysql -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} -e 'show variables like "character_set_database";'
```

### mysqldump取得
#### 圧縮しない時
- テーブル単位の取得の場合

```
$ mysqldump -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines ${DB_NAME} ${TABLE_NAME_1} ${TABLE_NAME_2} > hogehoge_`date +%Y%m%d`.sql
```

- DBスキーマ単位で取得の場合

```
$ mysqldump -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines --add-drop-database --databases ${DB_NAME} > hogehoge_`date +%Y%m%d`.sql
```

#### 圧縮する時
- テーブル単位の取得の場合

```
$ mysqldump  -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines ${DB_NAME} ${TABLE_NAME_1} ${TABLE_NAME_2} | gzip > hogehoge_`date +%Y%m%d`.sql.gz
```

- DBスキーマ単位で取得の場合

```
$ mysqldump -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} --single-transaction --default-character-set=${CHARASET} --routines --add-drop-database --databases ${DB_NAME} | gzip > hogehoge_`date +%Y%m%d`.sql.gz
```

## 各オプションの内容
###  single-transaction
- 対象がinnodbのときのみ有効（myIsamでは効果がない）
- dump取得時にテーブルロックをしないため、更新時の待ちが発生しない。

### default-character-set
- dump時の文字コードを指定する。
- 指定した文字列に変換してdumpを作成する。
- 指定しない場合、サーバー側で指定されているデフォルト文字コードが自動指定されるため、取得側とリストア側で文字コードのデフォルトが違う場合には、文字化けが起きる可能性が高まる。

### routines
- ストアドルーチン (プロシージャーおよび関数) も一緒にdumpに含める。

### add-drop-database
- 指定したDBスキーマを`drop database`（削除）するクエリをdumpに含める。

## リストア方法
### TABLEのリストア
```
$ mysql -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST}  -D ${DB_NAME} < hogehoge_`date +%Y%m%d`.sql
```

### DBのリストア
```
$ mysql -u${DB_USERNAME} -p${DB_PASSWORD} -h${DB_HOST} < hogehoge_`date +%Y%m%d`.sql
```
開閉センサーと3Dプリンターで、あれ？玄関の鍵閉めたっけ？解消

 |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/7e005096-9cde-fd93-eb41-6aad0acdaca7.png" width="300">| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/00200f48-0561-05b3-7866-ff83321a5b74.png" width ="300"> | 

前回の[Apps ScriptとQRコードで、あれ、どこにしまったっけ？解消](https://qiita.com/quantum_cpa/items/2b50b0167f73252a7233)に続きLifehack系エンジニアリングです。

### 作ったもの
玄関の鍵が閉まっているかスマホから確認する仕組み

### 使い方
- パナソニックの「ﾎｰﾑﾈｯﾄﾜｰｸ」アプリ(スマホに表示されるアプリ名が驚愕の半角カナ)で、鍵が閉まっているか確認する

閉まっているとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/c3ceb5f7-7ba1-71c8-5285-e2e4eaf7fd2b.png)
開いているとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807289/5d5298ac-4d3e-62d4-28e8-da9de5597a60.png)


### 使ったツール
1. [開閉センサー Panasonic](https://amzn.to/3dF81HF)
1. [ホームユニット Panasonic KX-HJB1000-W](https://amzn.to/2Pfswl0)
1. iOSアプリ：「ﾎｰﾑﾈｯﾄﾜｰｸ」(アプリ名が戦慄の半角カナ)　Android版もある
1. 3D プリンター

### 作り方
1. [こちら](https://github.com/KODOMOTO/lockchecker)に置いた部品を3Dプリンターでプリント　(Lixilの玄関ドアで使ってますが、共通なのかは不明)
1. プリントした部品に、開閉センサーの磁石を貼り付け
1. 部品を玄関の鍵部分に取り付け
1. 玄関ドアに開閉センサーを貼りつけ
1. 開閉センサーをホームユニットに登録

### 感想
- 専用のデバイスもあるが、月々お金がかかるものが多い模様。この仕組みはセンサーだけなら3,600円(我が家はホームユニットが既にあり)とお得
- ノギスで測ってから3Dモデルを作ったものの、一度は失敗して微調整が必要だろうなと思っていたが、一回で成功して感動
その① Swift OpenWeatherAPI 天気情報APIを取得して表示

API情報をJSON式で表示すると見やすくて快適ですよね！
今回は「OpenWeather」のAPI(無料)を使用したコードを書いてみました。

制作理由
「明日雨が降るので服装は〜、交通手段は〜」などといった天候に応じての提案を前日に通知してくれれば便利だなと思って、天気APIとユーザー通知を組み合わせたIOSアプリを制作することにしました。


環境
 Swift version 5.3
 Xcode Version 12.0.1 (12A7300)
 

目的 
 1. OpenWeatherのAPIを場所を指定し取得、天気情報を表示
 2. 現在時刻だけではなく、翌日の天気情報も同様に取得&表示できるようにする
 3. APIで組み込んだ天気情報をユーザー通知で前日に通知できるようにする
   

手順
 ① Podfileに書き加え: AlamofireとSwiftyJSONライブラリをダウンロード
 ② workspaceからxcodeを開き、Alamofire、JSONライブラリをインポート
 ③ 地域毎の天気情報を取得できるようにコードを書き、ピッカーで動的に表示できるようにする









それでは早速取り掛かっていきましょう！

① Podfile書き換え
まずはXcodeを開き、アプリを作成します
とりあえず名前を付けるだけです。

次にFinderから先ほど作成したアプリのフォルダにアクセスし、同フォルダ内のPodfileを開きます。
![Podfileの確認用スクショ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684837/2c48d410-f5e5-41ec-c0b9-c3e348432339.jpeg)




Podfileを書き換えられるので、以下の二行を付け加えます。

```diff
 pod 'Alamofire', '~> 5.2'
 pod 'SwiftyJSON', '~> 4.0'  
```
数字はバージョン名なので、順次最新のものをダウンロードすることを推奨します

Alamofireの最新ソースコード: https://github.com/Alamofire/Alamofire
SwiftyJSONの最新ソースコード: 
https://github.com/SwiftyJSON/SwiftyJSON
                 
上記リンクのGitHubソースコードから最新バージョンを確認しましょう

Alamofireの最新バージョン
![Alamofireの最新バージョン確認用スクショ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684837/a262541a-b24d-1486-c94e-d593fa6a1dc3.jpeg)






SwiftyJSONの最新バージョン
![SwiftyJSONの最新バージョン確認用スクショ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684837/495f1c2a-e6f9-586d-bba9-30ae82a08a81.jpeg)
   ※上記は2021年1月時点での最新バージョンです




② workspaceからxcodeを開き、Alamofire、JSONライブラリをインポート

ここからXcodeでの作業です。
Finderからworkspaceを開く必要があるので、下のスクショ通りに開いてください
＊projectで開くとインポートしたライブラリが使えないため
![workspaceの確認用スクショ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684837/363d45e3-6b6e-1233-236d-48e62e637bce.jpeg)






次にAPIを取得するSwiftファイルに以下の二文を書き込みましょう

```diff_swift
  import UIKit
+ import Alamofire
+ import SwiftytJSON
```

storyboardにcomponentから最低限度の機能(textFieldとbutton)をドラッグ＆ドロップして制約を設定しましょう。


API情報が正確に取得できるかターミナルで確認します(事前にブラウザでも確認)


```diff_swift
let apiKey = "(あなたのAPIキーをStringで書いてください)"
```



```diff_swift
func getWeather(){
let baseURL = "https://api.openweathermap.org/data/2.5/
weather?appid=\(apiKey)&q=tokyo"
print baseURL
}
```

以上のコードで東京の天気情報のAPIが取得できたかターミナルで確認できます
取得、もしくはビルドできない場合は、①URLの間違い、②APIKeyの間違い、③ネットに繋がっていない、のどれかが原因なのでチェックしましょう。


以上APIの取得についてでした。
続きはStoryboardでの作業になります！
Power Apps を Teams のメンバー限定で共有する

#Power Apps を全社ではなく、特定のチームのメンバー限定で公開する
Power Apps の共有先を限定にしたいことはあると思います。
Teams のグループと関連付けて限定公開するのが結果的に楽かなと設定した時の方法です。

グループの人数が多いと、そもそも一人ずつメアドを入れるのも面倒であり、人の出入りへの対応も大変です。
グループで指定しておくとこの辺りの煩雑さが解決できます（出来るはずです）

※ Share Point へのアクセス権などを設定しておけば、**Power Apps にアクセスできてもデータを見れない**という設定にはなりますが、Apps の中を覗かれるのも気持ち悪い、そもそもアプリ一覧に表示されたくない、という方はこの方法で限定公開とした方が良いと思います。

##普通にやると
特定のユーザーをメアドで指定するか、Everyone として組織内の全員に公開するか。の選択肢になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/bd72766f-42de-51e9-b553-0acfa774944d.png)

##グループで指定するには
要は **グループのメアド宛に共有する** です。

以下そのやり方です。
## Azure AD Portal からチームのメアドを取得します。
[Azure AD Portal](https://aad.portal.azure.com/)
Aure AD Portal からチーム（グループ）のメアドを取得し、そのメアド宛にAppsを共有します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/e731ce1d-1652-24c4-c179-95607334387c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/4d35ce93-b6be-1741-1b19-45644ff1a923.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/e6b74dce-f3da-5dbf-3db7-731585e19295.png)

##PowerShell からSecurity 設定を変えます。
グループメアドを共有しようとすると、「メアドが存在しません」とエラーになること
SecurityEnabled = true にしておきます。
詳しくはこちら → Microsoft Docs: [Share an app with Microsoft 365 groups](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/share-app#share-an-app-with-microsoft-365-groups)

Power Shell より
`connect-AzureAD`
サインインを求められたら組織のアカウントでサインインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/be509942-f9e4-84e8-3f51-df55d5dfda95.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/d6f77038-41cb-1b58-4611-6c67127ce5ec.png)
`Get-AzureADGroup -ObjectId <ObjectID\> | select *`
これで、現在の設定を確認します。

`Set-AzureADGroup -ObjectId <ObjectID> -SecurityEnabled $True`
これで、Security をTrueに変更します。

SecurityEnabled を True にすると、共有相手のメアドでグループのメアドを使えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/85505f66-88b1-2e0d-e7d9-026cba82c8ba.png)
##アプリを共有する
グループメアドを指定できるようになったら、あとは個人宛の共有と同じやり方です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/2b9efcc4-8f68-8794-f3de-cac19119c178.png)
CSS記述方法【3タイプまとめ】

# CSSの記述方法は3種類
- １．style要素として記述
- ２．style属性として記述
- ３．拡張子.cssの外部ファイルに記述

##１．style要素として記述
###ポイント
head要素、body要素のどちらに記述してもいいけど、head内が推奨されてる。

###メモ
＜style type="text/css"＞の「type="text/css"」は付けなくても問題なし。


例）

```html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>style要素として記述</title>

<!--ここから-->
<style>
h2 {
color: red;
}
</style>
<!--ここまで-->

</head>
<body>
ここに記述しても適用される
<h1>テキスト</h1>
<h2>テキスト</h2>
</body>
</html>
```

##２．style属性として記述
###ポイント
html内の要素に直接記述する。変更があると全部の要素を書き直さないといけないので大変。

例）

```html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>style属性として記述</title>
</head>
<body>

<!--ここから-->
<p style="font-size: 25px;">
      テキストテキストテキスト
</p>

<p style="font-weight: bold;">
      テキストテキストテキスト
</p>
<!--ここまで-->

</body>
</html>
```

##３．拡張子.cssの外部ファイルに記述
###ポイント
head要素にlink要素で追加する。
cssファイルの中身は先頭に「@charset "utf-8";」などの文字コードを追加する以外は1のstyle要素の記述方法と同じ。

例）

```html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>拡張子.cssの外部ファイルに記述</title>

<!--ここから-->
 <link rel="stylesheet" href="ファイル名.css">
<!--ここまで-->

</head>
<body>
<h1>テキスト</h1>
<h2>テキスト</h2>
</body>
</html>
```
<br>
例）「ファイル名.css」の中身

```css
@charset "utf-8";

h2 {
color: red;
}
```

>SAMURAI ENGINEER Plus +  https://www.sejuku.net/plus/programs/4/chapters/26
Power Automate Desktopがなんとなく使える講座 #3 Excelデータの抽出 その２

前回に続けて、データ部分の書き込みを行います。

## Excelデータの繰り返し
　まず、一番最初のデータを書き込む位置のセルをアクティブにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/47d66100-9866-76c2-582f-8a6b0b8c0ee0.png)

　アクションペインのループから**For each**を選び、ExcelDataを反復処理します。ここで、新たに**CurrentItem2**という変数が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/3c38c61a-f236-e9b6-78fd-6899bebdec13.png)

## 条件分岐

　For eachとEndの間に、条件分岐を入れていきます。ここでは、年齢が40歳以上の人を抽出することにします。
　**if**を選択し、最初のオペランドに**CurrentItem2**の中の**年齢**の項目を比較対象にしたいのですが、このループに入った時の**CurrentItem2**の値を変数ペインから確認してみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/edb4a2c6-6a90-cb95-7505-7a4cf3c39eb5.png)
　このような**Datarow**の形式で入っています。
　年齢の項目は8番目なので、配列と同じように、**CurrentItem2[7]**と指定してやることも出来ますが、**Datarow**は列名を指定して取り出すことも出来ますので、

```
%CurrentItem2["年齢"]%
```
　と入れます。40歳以上なので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/0afadf13-598c-0713-a937-d6be299cdd8f.png)
　となります。

　ワークシートの**CurrentItem2**を1列目の**アクティブなセル上**に書き込みを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/982ba78a-1279-207a-a401-8e40ff4a6d86.png)
　書き込んだ後は、次の書き込みのために、**相対位置**指定で、アクティブなセルを1行下に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/a127854f-38d5-a6c5-1b7d-3a6c50f47879.png)

　以上で、フローは以下のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/5562e76b-a330-0604-6866-ded652ac6b5b.png)

　動作は、以下のようになります。後半は、早回しになってます。

![motion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/9da9202c-b86d-05f4-1721-449cacbc6a08.gif)
Protocol Buffers

とあるGoogleのサービスを使うのに出てきた、Protocol Buffersについて調べた。

Protocol Buffers
Google が作ったxmlやjsonのような通信、保存用のシリアライズデータ形式。
XMLと比較してデータが軽量なのが特徴らしい。Google社内では様々な情報交換にこれ使ってるらしい。
インストール必要で、ブラウザ外部からの利用には不向きで、サービス内部の利用がメインらしい。

参考）
https://developers.google.com/protocol-buffers
https://ja.wikipedia.org/wiki/Protocol_Buffers
https://www.slideshare.net/yuichi110/protocol-buffers-61413028
ActiveHashの導入の手順について

# 概要
### Webページで都道府県や商品のカテゴリーなどで使用されるActiveHash。その導入の手順についてここに記述します。
### ※マイグレーションファイルやHTMLはすでに作ってある前提です。

# 手順
### 1.GemfileにActiveHashを記述
### 2.モデルを作成する
### 3.ActiveHash::Baseに変更
### 4.アソシエーションを設定

# 1.GemfileにActiveHashを記述
### Gemfileに「gem 'active_hash'」を記述。
```Gemfile.
gem 'active_hash'
```
###  新しいGemを入れたのでターミナルで「bundle install」をする。
```ターミナル.
bundle install
```

# 2.モデルを作成する
```ターミナル.
rails g model モデル名(例として都道府県のモデルarea.rbを作ります)
```

# 3.ActiveHash::Baseに変更
```area.rb
class Photo < ActiveHash::Base
 
end
```
# 4.アソシエーションを設定
### 関連しているモデルにアソシエーションを記述(例としてitem.rbとします。)
```item.rb
class Item < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :area
end
```
### belongs_to_active_hashを定義するためにextend ActiveHash::Associations::ActiveRecordExtensionsを記述。

```area.rb
class Area < ActiveHash::Base
    self.data = [
  
      {id: 1, name: '--'},
      {id: 2, name: '北海道'}, 
      {id: 3, name: '青森県'}, 
      {id: 4, name: '岩手県'},
      {id: 5, name: '宮城県'}, 
  #中略
     
    ]
    include ActiveHash::Associations
    has_many :photos
end

```
### area.rbにもアソシエーションを記述。以上でActiveHashを導入することができる
アドミニストレーター認定の準備: アプリケーション、活動、モバイル ⇒ デスクトップおよびモバイル管理の復習

１．Salesforce 認定アドミニストレーター試験のうち、「デスクトップとモバイルの管理」セクションが占める割合は何パーセントですか?
２．Salesforce 認定アドミニストレーター試験の「デスクトップとモバイルの管理」セクションで取り上げる主なトピックはどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/89e425ce-8615-3a43-2101-9fc7d6a98c4f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/e7f36a4e-882b-46a4-af65-80964773e7db.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/8eb02e7d-3cba-b559-c598-3592c5adeba7.png)
Dockerを起動しようとしたら、: no space left on device担ったときの解決法

DockerをRuby on RailsとMysQLの環境で起動しようとしたら

```
ERROR: failed to register layer: Error processing tar file(exit status 1): write /usr/bin/myisamchk: no space left on device
```

になってしまってDockerの起動すらできない上にビルドすらできないという減少になってしまいました。
いろいろな記事を参考にして、イメージとコンテナを削除してみたもののだめでした。
しかしある方法を使ったらできるようになりました。

#解決策

イメージ、コンテナ両方ダメならキャッシュファイルが原因ですので、それを削除しましょう


そのコマンドは

```
docker builder prune
```
になります。
これを削除したら56.01GBのキャッシュを削除できました。
その後にもう一度

```
docker-compose build
```
を実行してDockerコンテナを起動したらなおりました。
皆さん是非試してみてください
PowerShellでのシステム情報取得

ハードウェアなど、システム情報をあれこれ取得することがあるかと思います。
PowerShellにてWMI Win32クラスを参照することでいろいろと情報が取得可能となります。

####基本文型####

```PowerShell:GetSysteminfo.ps1
   Get-CimInstance -ClassName Win32クラス
```

####例：インストール済みの修正プログラムの一覧表示####

```PowerSHell: 
Get-CimInstance -ClassName QuickFixEngineering

Source        Description      HotFixID      InstalledBy          InstalledOn               
------        -----------      --------      -----------          -----------               
              Update           KB4601050     NT AUTHORITY\SYSTEM  2021/04/19 0:00:00        
              Update           KB4562830                          2020/11/18 0:00:00        
              Security Update  KB4570334                          2020/11/18 0:00:00        
              Security Update  KB4580325                          2020/11/19 0:00:00        
              Security Update  KB4586864                          2020/11/19 0:00:00        
              Update           KB4594440                          2020/11/19 0:00:00        
              Security Update  KB5001405     NT AUTHORITY\SYSTEM  2021/04/15 0:00:00   

```

####主なWin32Class####
　１．ハードウェア関係
　・Win32_BIOS：BIOS情報の取得
　・Win32_Processor：CPU情報の取得
　・Win32_ActiveRoute：ルーティング情報の表示
　・Win32_ComputerSystem：コンピューターの製造元および型番の一覧表示
　・Win32_BaseBoard：マザーボード情報の一覧表示

　２．システム関係
　・Win32_QuickFixEngineering：インストール済みの修正プログラムの一覧表示
　・Win32_Environment：システム環境の表示
　・Win32_UserProfile：ユーザプロファイル情報の一覧表示

※参考サイト：
 [Microsoft コンピューターに関する情報の収集](https://docs.microsoft.com/ja-jp/powershell/scripting/samples/collecting-information-about-computers?view=powershell-7.1 "Microsoft コンピューターに関する情報の収集")
 [WMI Fun!!](http://www.wmifun.net/library/index_win32.html)
　※WMI win32 classについて記載あり。
CMake | find incorrect CUDA/cuDNN version

###Found CUDA: {incorrect version}
11.0をinstallしたのに、installされてない9.2が見つけ出された。
####解決策
https://cmake.org/cmake/help/v3.12/module/FindCUDA.html
```cmake -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda```

###Found cuDNN: v?

####解決策
バージョンはcudnn_version.hにcudnn.h記載されている
正しいパスに入れ替える
https://github.com/pytorch/pytorch/issues/40965
PHP Warning: 'vcruntime140.dll' 14.0 is not compatible with this PHP build linked withのエラー

phpでパスが通ったか確認した時に出たエラー。
検索するとよく出るやり方では解決しなかったのでメモ。
まずはよくあるやり方から。

#VisualStudio2019のMicrosoft Visual C++ 再頒布可能パッケージをインストール
おなじみのやり方である。

https://visualstudio.microsoft.com/ja/downloads/
その他のツールとフレームワークから再配布可能パッケージを選択。
ダウンロード、インストール、再起動。
前はこれで解決したが、今回はまだ同じエラーが出た。

#php.iniの編集
php.ini-developmentからコピーして作るphp.iniだが、さらに編集する必要がある。

```
extension_dir = "ext"  //コメントアウトを外す
```
私はこれでphp -vの結果が出るようになった。
Railsの環境構築についてのまとめ(Mac)

#Railsの環境構築をまとめてみました！:helmet_with_cross:

###1.事前準備
・Apple IDを用意
・PCのパスワードを準備
###2.OSがCatalina以降の方は、以下のコマンドを実行

```
# zshをデフォルトに設定
% chsh -s /bin/zsh
```
# ログインシェルを表示
```
% echo $SHELL
```
# 以下のように表示されれば成功
```
/bin/zsh
```
###3.Command Line Toolsを用意しよう

```
% xcode-select --install
```  
###4.Homebrewをインストール

```
% cd  # ホームディレクトリに移動
% pwd  # ホームディレクトリにいるかどうか確認
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" # コマンドを実行
```

###5.Homebrewがインストールされているか確認
```
% brew -v
	
% brew update

%  sudo chown -R `whoami`:admin /usr/local/bin
```

###6.Rubyのインストール

```
# rbenv と ruby-buildをインストール	
% brew install rbenv ruby-build

# rbenvをどこからも使用できるようにする
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc

# zshrcの変更を反映させる
% source ~/.zshrc

# readlineをinstall
% brew install readline

# readlineをどこからも使用できるようにする
% brew link readline --force

# rbenvを利用してRubyをインストールする
% RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
% rbenv install 2.6.5

# 利用するRubyのバージョンを指定
% rbenv global 2.6.5

# rbenvを読み込んで変更を反映させましょう
% rbenv rehash

# Rubyのバージョンを確認
% ruby -v
```

## MySQLのインストール

```
% brew install mysql@5.6

# MySQLの自動起動設定をしましょう
% mkdir ~/Library/LaunchAgents 
% ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 

#Mysqlコマンドをどこからでも実行できるようにする
% echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc 
# mysqlのコマンドを実行できるようにする設定
% source ~/.zshrc
 #  設定を読み込むコマンド
% which mysql
 # mysqlのコマンドが打てるか確認する
# 以下のように表示されれば成功
/usr/local/opt/mysql@5.6/bin/mysql

# MySQLの起動を確認しましょう
% mysql.server status # MySQLの状態を確認するコマンド

# 以下のように表示されれば成功
 SUCCESS! MySQL running
```

## shared-mime-infoをインストール
```
% brew install shared-mime-info
```

#Railsを用意

```
# bundlerをインストールしましょう
% gem install bundler --version='2.1.4'

# Railsをインストールしましょう
% gem install rails --version='6.0.0'

#  rbenvを再読み込みしておきましょう
% rbenv rehash

Railsが導入できたか確認しよう
% rails -v

```

#Node.jsをインストール

```
brew install node@14

#Node.jsへのパスを設定
% echo 'export PATH="/usr/local/opt/node@14/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc

#Node.jsが導入できたかを確認
% node -v
```
#yarnをインストール

```
% brew install yarn

 # yarnが導入できたか確認
% yarn -v
```
binding.pryが実行できない!?

binding.pryを実行しようとすると、このようなエラーが
![スクリーンショット 2021-04-22 13.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1286751/1dbc96da-9c08-ca2f-a7c4-4295b66f4760.png)

エラー文をググってみると、単にgemの導入忘れでした。

```Gemfile.
gem'pry-rails'
```
bundle installを実行し
無事に実行できました。
Elasticsearch で cluster_block_exception "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"

Elasticsearch に insert/update してこんなエラーが出たら、disk full近いよ的な。デフォで70%超えるとエラーになるぽい。

```js
{ 
	"error": { 
	"root_cause": [
		{ 
			"type": "cluster_block_exception", 
			"reason": "blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"
		}
	], 
	"status": 403}
```


# 不要なデータを探す方法
indexをリスト

```
GET _cat/indices?pretty
```
リスト眺めて、容量が多いindexを探す。心当たりがない場合は、最後に入ったデータを見てみる

```json
GET your_index_name/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ],
  "_source":"@timestamp"
}
```

これが1年前とかだったら、なんかのテストで入れて今は使ってないやつだね！ 消しちゃいましょう。

```json
DELETE your_index_name
```

# 警告自体を消してしまう

それでもだめな場合は最終奥義   *この％はまったく動作保証されませんので

```js
GET /_cluster/settings

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "92%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%"
  }
}


PUT _cluster/settings
{
  "cluster.routing.allocation.disk.threshold_enabled": false
}

PUT _all/_settings
{
  "index.blocks.read_only_allow_delete": null
}

```

偉そうに言えるほど物を知らないので説明は割愛。実行する前に内容確認してね。


早めにdisk空いてるESに移転しましょう。
Gitコマンド集

# よく使うGitコマンド集
私の使用頻度が高いコマンドを随時追加していきます。

取り消し関連の操作は他メンバーのコミットを破壊することがあるので注意してください。

## 既存ディレクトリのGit管理開始

### ローカルリポジトリの作成
ローカルリポジトリしか使わない場合のみこちらを実行する。
既存ファイルは消えないので、恐れずに実行する。

```
git init
```

## リモートリポジトリの作成

GitHubやGitLabなどのホスティングサービスを使わない場合はこちらを実行して、リモートリポジトリを作成する。
Dドライブにリモートリポジトリを作成し、Cドライブにローカルリポジトリを作る等の使い分けをすると、リスク分散できる。

```
git init --bare remote.git 
```

## ワークツリーのリモートリポジトリ確認

```
git remote -v
```

## リモートリポジトリ設定
### リモートリポジトリの追加

```
git remote add リモートリポジトリURI
```

### リモートリポジトリの切り替え

```
git remote set-url origin 切り替え先リモートリポジトリURL
```

## リモートリポジトリの最新変更内容を取得
ワークツリーの編集済みファイルは反映されないので注意

	git pull ブランチ名



## リポジトリ登録済みのファイル・ディレクトリの削除
単にファイルを削除するだけでは反映されないので、以下のコマンドでファイルを削除したことをローカルリポジトリに記録する。

```
git rm ファイル名
git rm -r ディレクトリ名
```

## 指定ブランチへの切り替え
	git checkout ブランチ名

## ブランチ確認
### 現在のブランチを確認する
	git branch
### ブランチ一覧を確認する
	git branch -a


## リモートリポジトリの情報を取得
新しいブランチが見えないときに使う

	git fetch

## 変更内容確認
	git status
	
## コミット打ち消し
	git revert [打ち消したいコミットID]

## 直前のコミットを取り消す
直前のコミット

```:windows
git reset --hard HEAD"^"
```

```
git reset --hard HEAD^
```

指定のコミット

```:unix
git reset --hard コミットID
```

## 直前のコミットのコメントを修正したい場合

```
git commit --amend
```
	
## コミットログの確認

```
git log
# コマンド実行後はキーを受け付けなくなるので、qを押すとログモードから抜ける
```

	
## 変更したファイルを最後のコミットの状態まで戻す

```
git restore ファイルパス
```
	
## ブランチの切り替え

```
git switch ブランチ名
```
※checkoutでも可だが、switchを使用するのがモダンな方法

## mergeを取り消したい場合（mergeの直前に戻す）
マージ実行直後のみ有効で、ファイル編集すると使えなくなります。

```
git merger --abort
```

## mergeを取り消したい場合（前のコミットまで戻す）

```
git reset --hard HEAD
```

# ステージング
## 変更したファイルのステージング（インデックス付与）
ファイル個別指定

```
git add ファイル名 ファイル名 ファイル名 …
```

全て対象(「.gitignore」で指定したファイルを除く)

```
git add .
```

## 誤ってステージングしてしまった場合
reset でステージングを解除できる

```
git reset ファイル名 ファイル名 ファイル名 …
```


# 参考リンク
### 除外対象定義.gitignoreの書き方
https://qiita.com/anqooqie/items/110957797b3d5280c44f
### コンフリクト発生時の解消手順
https://www-creators.com/archives/1938
WebViewで複雑なアプリを実装することについて思うこと


## 修正

- 2021/04/22
    - タイトル修正
        - 元タイトル: WebViewを実装してアプリとするのはもうやめにしませんか。

---

## （元タイトルから）なぜそう思ったのか

Android、IOSのアプリの多くの案件がWebサービスのスマホ版としてWebViewを実装してHTMLを表示させたいという要望が多い気がします。
確かにAndroid、IOSのWebViewは便利です。

Javascriptやカスタムスキーム を駆使してWeb版よりもユーザビリティに優れた機能を実装することもできるでしょう。

しかしながら、それらのユーザビリティに優れた機能は詰まるところ`アプリ側`に実装する機能であり、
HTTPプロトコルを`アプリ側`がスパゲティな実装で監視したり、`アプリ側`がリクエストを処理している間にWebViewが画面遷移しないようにブラウザバックなどを制御したり、Javascriptがうまく動かなかったり、HTMLデザインチームとうまく連携できなかったり、画面サイズの問題でHTMLが崩れたり、アプリ申請時に本番に穴を開けれなくてリジェクトされたり。。。
ということになって結局言葉で説明することが非常に難しい自体に陥りやすいと思います。

私たちは十分に経験しました。。
WebViewは万能ではないと。。

---

## じゃどうするかって？

決まってます。
HTMLでやりたかったことをきちんとアプリの画面で実装しましょう。
サーバではAPIを実装して、
アプリでそれを叩きましょう。

お金がないからWebViewなんだ？
ちゃんと見積もって話しましょう。結局あれこれ問題が出て、おんなじくらいお金と時間がかかることになると思います。

---

## それでも WebView じゃなきゃダメなんだ

WebView実装で気をつけなければならないところリスト

- Javascript を実行してアプリに処理を戻す時
	- Jsを実行できたとしてもサーバ側の都合で画面遷移したりするのでレスポンスを返す処理の場合は念入りに設計した方がいいですよ。
	- WebViewからJSを利用する場合はセキュリティリスクがあります。
		- 詳しくはこちら → 
		- [WebView でのウェブアプリの作成]（https://developer.android.com/guide/webapps/webview?hl=ja#BindingJavaScript)
	- IFを複雑にするとサーバ側とアプリ側の両方の管理が非常に厄介になりがちです。シーケンシャルに実行しなければならない時などデバッグも大変です。留意しておきましょう。
- iframe は鬼門です。全く制御できないと思っていた方がいいでしょう。
- HTMLで再生している外部サービスの動画は鬼門です。全く制御できないと思っていた方がいいでしょう。
- 複雑な業務系の場合はWebViewは全く向いていないことを理解してもらった上で、覚悟して実装しましょう。

---

## おわりに

WebViewはせいぜい利用規約の表示や頻繁にデザイン更新が必要な起動時の広告などに利用する程度のものだと思います。
アプリとしてWebViewのみに頼った実装は最初は楽かもしれませんが、最後の最後でアプリの申請につまづき、その頃には機能の追加修正を行う時間はなくなり、設計もままならぬままえいやで実装する。。そこはもう後戻りできない砂地獄のように、全てを巻き込んでぐちゃぐちゃになったカオスしか残らないと思っています。
簡単なものなら、、まぁ、、アリかとも思う。。
[python] 辞書の結合

※Python3.9以降はもっと簡単な方法があるので、[追記：Python3.9以降の場合](#追記python39以降の場合)を参照ください！

## Case1: 片方の辞書にもう片方を追加する (上書き)
### 結論
以下のように、update()メソッドを使う。

```python
d1 = {'one':1, 'two':2}
d2 = {'two':'ii', 'three':'iii'}
d1.update(d2)
print(d1)
# {'one': 1, 'two': 'ii', 'three': 'iii'}
```
重複するキーがある場合は、update()の中身が優先(中身で上書き)される。

なお、２つの辞書を同時に追加する場合は、以下のようにする。

```python
d1 = {'one':1, 'two':2}
d2 = {'two':'ii', 'three':'iii'}
d3 = {'three':'III', 'four':'IV'}
d1.update(d2,**d3)
print(d1)
# {'one': 1, 'two': 'ii', 'three': 'III', 'four': 'IV'}
```
アスタリスク２つ(`**`)が何か、は後述の[アスタリスク２つの正体](#アスタリスク２つの正体)を参照。
なお、３つ以上の辞書でupdate()することはできない模様。

## Case2: 2つの辞書を結合した新しい辞書を生成する
### 結論
以下のようにする。

```python
d1 = {'1':1, '2':2}
d2 = {'2':'ii', '3':'iii'}
d3 = dict(d1, **d2)
print(d3)
# {'1': 1, '2': 'ii', '3': 'iii'}
```
上書きの場合と同様に、重複するキーがある場合は、後ろに指定された辞書の中身が優先(中身で上書き)される。
なお、３つ以上の辞書を結合することはできない模様。

また、python3.5以降ならば、`dict()`の代わりに`{}`が使える。
`{}`を使って以下のようにすれば３つ以上の辞書を同時に結合できる。

```python
d1 = {'one':1, 'two':2}
d2 = {'two':'ii', 'three':'iii'}
d3 = {'three':'III', 'four':'IV'}
d4 = {**d1, **d2, **d3}
print(d4)
# {'one': 1, 'two': 'ii', 'three': 'III', 'four': 'IV'}
```

## アスタリスク２つの正体
イテレータにアスタリスク(`*`)を付けると、関数の引数としてアンパックできるらしい。

特に辞書に対してアスタリスク２つをつけると、キーワード引数としてアンパックできる。

```python
some_list = ['aaa', 'a', 'aaaa', 'aaaaa', '']
option = {
    'key':len,
    'reverse':True
}
some_list.sort(**option)
print(some_list)
# ['aaaaa', 'aaaa', 'aaa', 'a', '']
```
この例では、並び替えの基準(`key`)と昇順/降順(`reverse`)を辞書で定義して、sort()関数のキーワード引数にアンパックしている。

ちなみに、アスタリスク１つだと、辞書のキーのみがアンパックされる。(リストの場合と同様の動きになる。)

```python
option = {
    'key':len,
    'reverse':True
}
print(*option)
# key reverse
option_list = ['key', 'reverse']
print(*option_list)
# key reverse
```

## 追記：Python3.9以降の場合
3.9以降では上記のような複雑なことせずに、論理和の演算子`|`を使ってとても簡単に実装できるようです！
@shiracamus さんに教えていただきました！

```python
d1 = {'one':1, 'two':2}
d2 = {'two':'ii', 'three':'iii'}

# Case1: 片方の辞書にもう片方を追加する (上書き)
d1 |= d2
print(d1)
# {'one': 1, 'two': 'ii', 'three': 'iii'}

# Case2: 2つの辞書を結合した新しい辞書を生成する
d3 = d1 | d2
print(d3)
# {'one': 1, 'two': 'ii', 'three': 'iii'}
```
普段触れている業務システムはPython3.6で動いているので、使えないですが、便利や～ :cry:
【javascript】フィボナッチ（トリボナッチ等）数列をワンライナーで（追記コード1個）


#引数

 - `f`　…　2：フィボナッチ、3：トリボナッチ、4：テトラナッチ　……
 - `n`　…　配列の長さ

#コード（追記）

```javascript
const nacci = (f,n) => [...Array(n-2)].reduce((p,_,i) => 
	(p.push(p[i+f]*2 - p[i]), p), [...Array(f-1).fill(0),1,1] ).slice(f-1);
```

コメントで指摘を受けて追記。
先のものよりは軽くなったと思う。

#コード

```javascript
const nacci = (f, n) => 
	[...Array(n-1)].reduce(p => p.concat( p.slice(-f).reduce((s,x)=>s+x) ), [1]);

console.log( nacci(2, 15) );
// [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
```

※表示の都合上、改行してます

#感想
`reduce`楽しい。
先頭の`0`は残した形の方が良いのでしょうか？


ワンライナーにこだわらなければ


```javascript
const nacci = (f,n) => {
	const a = [...new Int8Array(f-1),1,1];
	for (let i=0; i<n; i++) a.push(a[i+f]*2 - a[i]);
	return a.slice(f-1,-2);
};
console.log( nacci(2,15).pop() );
```
C# ~標準入出力~ Cランクレベルアップメニュー

システムエンジニアの研修の１つに「paizaBランク問題をクリア」があるのでその目標を達成するまでの過程を備忘録として残します。

今後業務に参加していく際に記述方法を忘れてしまった未来の自分に向けて、メモを残すと同時にこの記事がC#を学習している方、同じ箇所で躓いている方の参考になればと思っています。
ですので内容に誤りがある場合やより良い記述をご存知の方はコメントで共有していただけると嬉しいです。

それでは本編に入ります。
今回はPaizaラーニング、レベルアップ問題集「標準入力」の問題をC#で回答したときの内容になります。


## STEP1単純な入出力
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step1

```c#:paiza.cs
using System;
class Program
{
    static void Main()
    {
        var line = Console.ReadLine();
        Console.WriteLine(line);
    }
}
```

## STEP2複数行にわたる出力
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step2

```c#:paiza.cs
using System;
class Program
{
    static void Main()
    {
        var line = int.Parse(Console.ReadLine());
        for(var i = 1; i <= line; i++){
            Console.WriteLine("paiza");
        }
    }
}
```

## STEP: 3 複数行にわたる入力
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step3

```c#:paiza.cs
using System;
class Program
{
    static void Main()
    {
        var line = int.Parse(Console.ReadLine());
        for(var i = 1; i <= line; i++){
            Console.WriteLine(Console.ReadLine());
        }
    }
}
```

## STEP: 4 入力の配列による保持
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step4

```c#:paiza.cs
using System;
class Program
{
    static void Main()
    {
        var line = int.Parse(Console.ReadLine());
        int[] array = new int[line];
        int max = array[0];
        for(var i = 0; i < line; i++){
            array[i] = int.Parse(Console.ReadLine());
            if(max < array[i]){
                max = array[i];
            }
        }
        Console.WriteLine(max);
    }
}
```

## STEP: 5 半角スペース区切りでの出力
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step5

```c#:paiza.cs
using System;
class Program
{
    static void Main()
    {
        var line = int.Parse(Console.ReadLine());
        for(var i = 1; i <= line; i++){
            if(i == line){
                Console.Write("paiza");
            }else{
                Console.Write("paiza ");
            }
        }
    }
}
```

## STEP: 6 改行区切りでの出力
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step6

```c#:paiza.cs
using System;
class Program
{
    static void Main()
    {
        var line = int.Parse(Console.ReadLine());
        var line2 = Console.ReadLine();
        string[] array = line2.Split(' ');
        for(var i = 0; i < line; i++){
            Console.WriteLine(array[i]);
        }
    }
}
```

## FINAL問題 標準入出力
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_step1

```c#:paiza.cs
using System;
class Program
{
    static void Main()
    {
        // 自分の得意な言語で
        // Let's チャレンジ！！
        var line = int.Parse(Console.ReadLine());
        for(var i = 0; i < line; i++){
            // nameAgeに名前と年齢を格納
            string[] nameAge = Console.ReadLine().Split(' ');
            // 年齢に1歳加える
            int age = int.Parse(nameAge[1]) + 1;
            Console.WriteLine(nameAge[0] + " " + age);
        }
    }
}
```
Rails Console上でバージョン確認

コンソール閉じるのめんどくさい
以下rails console上で入力

## Railsのバージョン確認
```.rb
Rails.version
=> "6.0.0"
```
## Rubyのバージョン確認
irbでも可

```.rb
RUBY_VERSION
=> "Ruby 2.7.3"
```
【Kotlin 初心者】物理ボタンで戻れないようにする onKeyDown


## やりたいこと
Androidの物理ボタン（呼び方がこれでいいのかは不明）で一つ前の画面に戻ることを防ぐために、`onKeyDown`の関数を使います。

```kotlin
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
　　//条件分岐やモーダル表示などの処理を書きます
　　return false
}
```
PHP動作環境の作成(M1)

#PHP動作環境の作成
M1でPHPの学習を始めるにあたり、動作環境を作成します。

##動作環境
- OS:Mac(M1)
- ブラウザ:Chrome
- エディタ：VisualStudioCode
- 仮想環境:mamp

##参考書籍

[よくわかるPHPの教科書 PHP7対応版](https://www.amazon.co.jp/%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8BPHP%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%80%90PHP7%E5%AF%BE%E5%BF%9C%E7%89%88%E3%80%91-%E3%81%9F%E3%81%AB%E3%81%90%E3%81%A1%E3%81%BE%E3%81%93%E3%81%A8/dp/4839964688)
![Something went wrong]()

##MAMP

###ダウンロード
MAMPダウンロード[(公式サイト)](http://www.mamp.info/en/inde.html)

1. 「Free Download」をクリック
1. 「MAMP & MAMP PRO 6.3」をクリック

###セットアップ

1. ダウンロードした「.pkg」拡張子のファイルを展開
1. 「続ける」を選択
1. 「続ける」を選択
1. 「Continue」を選択(日本語は選択肢にないため、English)
1. 「Agree」を選択
1. 「インストール」を選択
1. 「パスワードを入力」
1. 「閉じる」を選択
1. 「ゴミ箱に入れる」を選択

###起動

1. Finderからアプリケーションを選択し、「MAMP」フォルダをクリック
<br>
※「MAMP PRO.app」は有料版になります。さらにM1ではエラーになります。
1. フォルダ内の「MAMP.app」を起動
1. アプリケーションを起動した段階で、apacheが自動起動しています。右上に「Stop」と表示されていれば現在「Start」状態です。


###ページの表示

1. 実行したいファイルは「Finder」→「アプリケーション」→「MAMP」→「htdocs」内に保存します。(初期状態ではindex.phpが入っています)
1. リクエストするときには、「 http://localhost:8888/index.php 」のようにURLを入力します。


##Visual Studio Code
こちらは既にインストール済みだった為、割愛します

##Chrome
こちらは既にインストール済みだった為、割愛します


##他記事リンク
- [PHPの基本操作①<br>「簡単な出力と構文、配列、連想配列、少数、フォーマット」](https://qiita.com/kunrenyouAcount/items/7a3bb6e5769ba94a7dc5)

- [PHPの基本操作②<br>「ファイルの読み込み、ファイルの書き込み、XMLの読み込み、JSONの読み込み」](https://qiita.com/kunrenyouAcount/items/bec393cae5901e32ec70)

- [PHPの基本操作③<br>「入力欄、ラジオボタン、チェックボックス」](https://qiita.com/kunrenyouAcount/items/1c66ccee97c33f320fb2)

- [PHPの基本操作④<br>「数字かどうかの判定、正規表現、別ページにジャンプ」](https://qiita.com/kunrenyouAcount/items/5b292d8481a76386fd1e)

- [PHPの基本操作⑤<br>「クッキーとセッションの保存と取得」](https://qiita.com/kunrenyouAcount/items/7324fad1d3d1845de075)

- [PHPの基本操作⑥<br>「電子メールの送信」](https://qiita.com/kunrenyouAcount/items/2172f03af0d8d8a32cc6)

- [PHPの基本操作⑦<br>「ファイルアップロードの受信をする」](https://qiita.com/kunrenyouAcount/items/dece31f962472fb23610)
S3のアクセスログをAthenaで分析


### 目的
アクセスログが有効化されているS3に対して、Athenaでログ分析を行うための手順。



### 手順

athenaのクエリ画面で以下を実行する。

```bash:athenaのクエリ画面でDBを作成
create database s3_access_logs_db
```

```bash:athenaのクエリ画面でS3のアクセスログのスキーマ定義を行う
CREATE EXTERNAL TABLE `s3_access_logs_db.mybucket_logs`(
  `bucketowner` STRING,
  `bucket_name` STRING,
  `requestdatetime` STRING,
  `remoteip` STRING,
  `requester` STRING,
  `requestid` STRING,
  `operation` STRING,
  `key` STRING,
  `request_uri` STRING,
  `httpstatus` STRING,
  `errorcode` STRING,
  `bytessent` BIGINT,
  `objectsize` BIGINT,
  `totaltime` STRING,
  `turnaroundtime` STRING,
  `referrer` STRING,
  `useragent` STRING,
  `versionid` STRING,
  `hostid` STRING,
  `sigv` STRING,
  `ciphersuite` STRING,
  `authtype` STRING,
  `endpoint` STRING,
  `tlsversion` STRING)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://awsexamplebucket1-logs/prefix/'
```


- [AWS公式の設定手順](https://aws.amazon.com/jp/premiumsupport/knowledge-center/analyze-logs-athena/)
AzureFunctionsをnode14でローカルで動かそうとするとエラーがでて動かない

# はじめに

なかなか検索に引っかかってこないので他で困っている人のためにメモしておく。

これまでnode12でFunctionsを動かしてきたのですが、Functionsv3の推奨がnode14ですので意気揚々とはじめました。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-node?tabs=v2#node-version

functions core tools v3で`func start`したところ以下のエラー

```
LanguageWorkerConsoleLog[error] Incompatible Node.js version (v14.16.1). Refer to our documentation to see the Node.js versions supported by each version of Azure Functions: https://aka.ms/functions-node-versions
```

色々と試したのですが、時間がないので結論だけ。

# 結論

Azure Functions Core Toolsのバージョン

```bash
$ func -v
3.0.2881
```

functions core toolsを最新に

```bash
sudo apt-get update
sudo apt-get install azure-functions-core-tools-3
```

私の場合はWSLだったのでこんな手順ですが他のプラットフォームの場合の手順はこちら
https://github.com/Azure/azure-functions-core-tools

更新後のバージョン

```bash
$ func -v
3.0.3442
```

うごいた

```bash
$ func start

Azure Functions Core Tools
Core Tools Version:       3.0.3442 Commit hash: 6bfab24b2743f8421475d996402c398d2fe4a9e0  (64-bit)
Function Runtime Version: 3.0.15417.0


Functions:

        hello: [GET,POST] http://localhost:7071/api/hello

・・・
```

マイナーバージョンでも結構動き変わるから油断するなよ。という記事でした。
Jotai v0.16.1に入ったRedux integrationとは何か

先日 [jotai](https://github.com/pmndrs/jotai) v0.16.1 をリリースしました。

https://twitter.com/dai_shi/status/1383081420092960773

実験的位置付けの3つのintegrationバンドルが含まれています。

- jotai/valtio
- jotai/zustand
- jotai/redux

混乱させないか悩んだところでもあるのですが、利用シーンはあると思うので入れました。

jotai/reduxの例を紹介します。実装はシンプルです。v0.16.2で少し修正しましたが、こんな感じです。

```js
export function atomWithStore(store) {
  const baseAtom = atom(store.getState())
  baseAtom.onMount = (setValue) => {
    const callback = () => {
      setValue(store.getState())
    }
    const unsub = store.subscribe(callback)
    callback()
    return unsub
  }
  const derivedAtom = atom(
    (get) => get(baseAtom),
    (_get, _set, action) => {
      store.dispatch(action)
    }
  )
  return derivedAtom
}
```

これをどのように使うかですが、もっとも簡単なstoreを考えてみましょう。

```js
import { createStore } from 'redux'

const initialState = { count: 0 }
const reducer = (state = initialState, action) => {
  if (action.type === 'INC') {
    return { ...state, count: state.count + 1 }
  }
  return state
}
const store = createStore(reducer)
```

これを、react-reduxで使う場合は、次のようになると思います。

```jsx
import { Provider, useSelector, useDispatch } from 'react-redux'

const Counter = () => {
  const count = useSelector((state) => state.count)
  const dispatch = useDispatch()
  return (
    <div>
      count: {count}
      <button onClick={() => dispatch({ type: 'INC' })}>button</button>
    </div>
  )
}

const App = () => (
  <Provider store={store}>
    <Counter />
  </Provider>
)
```

同じものをjotai/reduxで書くと次のようになります。

```jsx
import { Provider, atom, useAtom } from 'jotai'
import { atomWithStore } from 'jotai/redux'

const storeAtom = atomWithStore(store)
const countAtom = atom(
  (get) => get(storeAtom).count,
  (_get, set, action) => set(storeAtom, action)
)

const Counter = () => {
  const [count, dispatch] = useAtom(countAtom)
  return (
    <div>
      count: {count}
      <button onClick={() => dispatch({ type: 'INC' })}>button</button>
    </div>
  )
}

const App = () => (
  <Provider>
    <Counter />
  </Provider>
)
```

違いがわかりますか。ほとんど違いがないと思った方がいらしたら、それは正解です。同じように使えることを目指したので。

違いは何か、atomになったので、他のatomと合わせたり、他のjotaiの関数が使えることになります。いかがでしょう。新規にアプリを作る場合はあまり使わないとは思いますが、既存のreact-reduxアプリからの移行は簡単になるかもしれません。

jotaiはv1リリースを目指して最終段階の開発中です。興味がある方はぜひ試してみてください。

「React Fan」というコミュニティを立ち上げていて、そのSlackでもjotaiに関する議論や質問ができますので、よろしければご参加ください。

詳しくは、下記のページをご参照ください。

[React開発者向けオンラインサロン「React Fan」の入り口ページ](https://react-fan.axlight.com/)

Slackへの招待リンクも上記ページにあります。
①FizzBuzzゲーム

#オブジェクト(指示を出す相手)
JSが指示を出すろ考えて、〇〇はの主語に当たる。
ブラウザにはhistory,window,location,document,consoleがあります。
これらは、JSが〇〇はなになにしての主語の部分になります。これをオブジェクトといいます。
今回、のプロンプトはJSがWindowにしてほしい命令です。

#メソッド（させたいこと）
これは、オブジェクトにさせたいことです。これをメソッドといいます。指示を出します。
プロンプトとは動作するよう促すことです。それぞれのオブジェクトでできるメソッドは決まっています。
カッコの中には、何をさせるのかについて指示を出します。

window.promptの場合
JSがWindowにユーザに何かこの部分が▶（）してほしいと促す
のような流れになります。


#今回の実装
①　Promptにユーザが数値を入力した値をインプット
②　それを判別して（加工）
③　ユーザーにFIzzBuzzを返す (promptにあたりアウトプット)

の流れのゲームをプログラミングする。

FizzBuzzuソース引用
> [Qiita](https://qiita.com/kiubu/items/24cf3abf019028708d42)
ディレクトリのファイル数上限

#ディレクトリのファイル数の上限

そもそも記憶ディスク事体のinode数を超えたファイル数を作成することはでない．ディスの容量を超えてファイルを保存することもできない．

ディスクのinode数，容量を調べる．

```
$ df -i -h
```
```
$ df  -h
```

inode数を食っているディレクトリを調べる．

```
$ find . -type f | wc -l
```
```
$ echo "### `pwd` ###"; for i in `ls -1`; do echo -n "--- $i --- "; echo "(`find ./$i -type f |wc -l`)"; done | sort -r
```
１つのディレクトリに保存できるファイル数にも上限がある．運用上は100万以上では保存しない方がよさそう．
できれば１万以下にした方がよい？

#大量の連番ファイルを子ディレクトに分類する

pythonを用いて大量の連番ファイルを分類する例を以下に示す．

分類してファイルを生成する

```:mk.py
import shutil
import os
import math
for num in range(1,100):
    dirname  = "./data/"+str(math.floor(num/10)).zfill(5)
    os.makedirs(dirname, exist_ok=True)
    filename = "dirname" + "/" + "file_" + str(num).zfill(10) + ".txt"
    with open(filename, 'w') as f:
        f.write("txt")
```

既に存在したファイルを分類する

```:mv.py
import shutil
import os
import math
for num in range(1,100):
    dirname  = "./data/"+str(math.floor(num/10)).zfill(5)
    os.makedirs(dirname, exist_ok=True)
    filename = "./data/" + "file_" + str(num).zfill(10) + ".txt"
    #with open(filename, 'w') as f:
    #    f.write("txt")
    shutil.move(filename, dirname)

```
【Next.js】Next.jsをのビルドでwebpack4を使うと失敗するので5に切り替える方法


以下エラーが出てBuildができない場合の対処方法のメモ


## 発生したエラー

```console
❯ yarn build                                                                                                  7.3s  Thu Apr 22 12:00:15 2021
info  - Using webpack 4. Reason: future.webpack5 option not enabled https://nextjs.org/docs/messages/webpack5
info  - Checking validity of types  
info  - Creating an optimized production build  
Failed to compile.

ModuleNotFoundError: Module not found: Error: Can't resolve '/Users/pcuser/Documents/GitHub/country-shrine-map/node_modules/@babel/runtime/helpers/construct' in '/Users/pcuser/Documents/GitHub/country-shrine-map/.yarn/$$virtual/next-virtual-eb3227ff4d/0/cache/next-npm-10.1.3-435c930891-7e12ae9ea2.zip/node_modules/next/dist/client'

> Build error occurred
Error: > Build failed because of webpack errors
    at /Users/pcuser/Documents/GitHub/country-shrine-map/.yarn/$$virtual/next-virtual-eb3227ff4d/0/cache/next-npm-10.1.3-435c930891-7e12ae9ea2.zip/node_modules/next/dist/build/index.js:17:924
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async Span.traceAsyncFn (/Users/pcuser/Documents/GitHub/country-shrine-map/.yarn/$$virtual/next-virtual-eb3227ff4d/0/cache/next-npm-10.1.3-435c930891-7e12ae9ea2.zip/node_modules/next/dist/telemetry/trace/trace.js:5:584)
```

## 対処方法

webpack 4だと必要なモジュールがないためエラーになるのでwebpack 5を有効化する。
[エラー時にInfoで出力されていたURL](https://nextjs.org/docs/messages/webpack5)を確認しnext.config.jsにfutureの設定を記述する。

```javascript
module.exports = { 
    future: { 
      webpack5: true, 
    },  
} 
```

## 確認方法

こんな感じのログが出ればOK

```console
❯ yarn build                                                                                                 59.6s  Thu Apr 22 12:06:13 2021
info  - Using webpack 5. Reason: future.webpack5 option enabled https://nextjs.org/docs/messages/webpack5
info  - Checking validity of types  
info  - Creating an optimized production build  
info  - Compiled successfully
info  - Collecting page data  
info  - Generating static pages (4/4)
info  - Finalizing page optimization  

Page                             Size     First Load JS
┌ ○ /                            310 B          64.8 kB
├ ○ /404                         3.44 kB        67.9 kB
└ ○ /second                      310 B          64.8 kB
+ First Load JS shared by all    64.5 kB
  ├ chunks/210.af2b05.js         6.82 kB
  ├ chunks/759.8e4335.js         13.5 kB
  ├ chunks/framework.281044.js   42 kB
  ├ chunks/main.3f7708.js        152 B
  ├ chunks/pages/_app.361545.js  1.03 kB
  └ chunks/webpack.8b2eb6.js     909 B

λ  (Server)  server-side renders at runtime (uses getInitialProps or getServerSideProps)
○  (Static)  automatically rendered as static HTML (uses no initial props)
●  (SSG)     automatically generated as static HTML + JSON (uses getStaticProps)
   (ISR)     incremental static regeneration (uses revalidate in getStaticProps)
```

#development/nodejs
iPhone、iPad、iPod touch をバックアップする方法


iPhone、iPad、iPod touch をバックアップしておけば、デバイスを交換、紛失、損傷したときも大切な情報のコピーがあるので安心です。

一、バックアップの方法を選択する
まず、iCloud バックアップと、コンピュータで作成するバックアップの相違点について確認した上で、どちらの方法が適切かを判断してください。バックアップの予備を取っておく必要がある場合は、iCloud で 1 つ作成し、コンピュータを使ってもう 1 つ作成しておけます。

二、iCloud でバックアップする方法
1、デバイスを Wi-Fi ネットワークに接続します。
「設定」>「[ユーザ名]」の順に選択し、「iCloud」をタップします。
「iCloud バックアップ」をタップします。
「今すぐバックアップを作成」をタップします。バックアップが終わるまで、Wi-Fi ネットワークに接続したままにしておいてください。
進行状況を確認し、バックアップが終わったか確認できます。「設定」>「[ユーザ名]」>「iCloud」>「iCloud バックアップ」の順に選択します。「今すぐバックアップを作成」の下で、最後のバックアップの作成日時を確認できます。
バックアップの作成に関するサポート情報についてはこちらの記事（https://support.apple.com/ja-jp/ht203516）を参照してください。

三、iCloud バックアップで自動的にバックアップする
iCloud で毎日デバイスのバックアップを自動的に作成するには、以下の準備が必要です。
「設定」>「[ユーザ名]」>「iCloud」>「iCloud バックアップ」で、「iCloud バックアップ」がオンになっているか確認します。
デバイスを電源に接続します。
デバイスを Wi-Fi ネットワークに接続します。
デバイスの画面がロックされていることを確認します。

iCloud のストレージにバックアップ分の空き容量が十分にあることを確認します。iCloud にサインインすれば、5 GB 分のストレージを無料で利用できるようになります。iCloud ストレージが足りなくなった場合は、iPhone、iPad、iPod touch、Mac から有料でプランをアップグレードできます。月々 130 円で 50 GB からプランをご用意しています。

もしバックアップしていない重要な写真や動画などのデータを誤削除されてしまいましたら、専用ソフトiMyFone D-Back（https://jp.imyfone.com/iphone-data-recovery/）を利用することで写真などのデータを復元できます。
AWS DVA 直前対策【自分用】

#【AWS DVA 直前対策】

##試験問題サンプルから。

####1、自動ローテートは、Secrets Manager

DBへの接続情報の格納、定期的な周期でDBユーザーパスワードをLamdbaによって、ランダム値に自動更新する。

####2、リアルタイムフィードバックを受け取るのは、GraphQLとWebSocket

AppSysncは、GraphQL APIを高速開発
API Gatewayは、WebSocket APIを構築

####3、Cognito関連にIAMユーザーなど追加出来ない。

####4、Lamdbaに認証と許可を与える手順。IAMロールの設定が必要。

IAMを使用して、Lamdba実行ロールを作成する。
IAMポリシーを上記のロールにアタッチする。
Lamdba実行ロールをLamdba関数に割り当てる。

####5、Auroraのクロスリージョンコピーの手順

DBのスナップショットを同リージョン内に作成する。
これスナップショットを別リージョンにコピーする。
そして、そのリージョン内のKMSキーを指定する。
コピーしたスナップショットからからDBを復元する。

※既に暗号化しているAurora DBの暗号化の無効化は出来ない。
※Aurora スナップショットの暗号化は、そのリージョンのKMSマスターキーを使用する。

####6、API Gateway ステージ変数とLamdbaエイリアスで安全・迅速リリース

これによって、1つのAPIで管理することが可能になる。
リリースにおいては、Lamdbaのエイリアスとバージョンの紐付けを変更するだけ。
　→　ロールバックも容易である。
PowerShellでMicrosoft SQL Serverへ接続し、テーブル一覧を取得する。

PowerShellでMicrosoft SQL へ接続し、DBのデータを取得する必要がありましたので作成しました（ほぼ、自分への覚書用として…）

内容としてはデータベースへ接続し、DBのテーブル一覧を取得するというものです。

##注意点（はまったこと）##
　１．「テーブル一覧取得クエリ定義」の部分で、DBを明示的に指定しないと意図しないDBのリストを取得するので注意。
　２．本来であればDBへの接続情報は2つ記述する必要はないのですが、DB接続用の情報ではSQLの実行がうまくいかなかった為、2つに分けました。

##サンプルスクリプト##

```PowerShell:GetTableList.ps1
    #スクリプト実行パスを取得
    $CurrentDir = Split-Path $MyInvocation.MyCommand.Path


    # DB接続情報設定（SQL実行用）
    $strServer   = '＜DBサーバIP＞';  # サーバーを指定
    $strDatabase = '＜DB名＞';       # データベースを指定
    $strUserId   = '＜接続ユーザ名＞';    # ユーザーIDを指定
    $strPassword = '＜接続パスワード＞';   # パスワードを指定


    # DB接続情報設定(DBオープン用）
    $ConnectionString=New-Object -TypeName System.Data.SqlClient.SqlConnectionStringBuilder
    $ConnectionString['Data Source'] = "＜DBサーバIPアドレス＞"
    $ConnectionString['Initial Catalog'] = "＜DB名＞"
    $ConnectionString['Integrated Security']= "TRUE"


    #DB接続準備
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection($ConnectionString)
    $SqlCommand = New-Object System.Data.SqlClient.SqlCommand($TableListQuery, $SqlConnection)

    #DBスオープン
    $SqlConnection.Open()

    #テーブル一覧取得クエリ定義（※「hoge」はDB名）
    $TableListQuery="select name from hoge.dbo.sysobjects Where xtype = 'u' order by name"
    #テーブル一覧取得SQL実行
    $TableList=Invoke-Sqlcmd $TableListQuery

  #テーブルデータ一覧から1行づつテーブル名を取得する。
    foreach($oneTable in $TableList.name ){
       Write-host $oneTable
    }

    #DBクローズ
    $SqlConnection.Close()
```
Gitのコミット時にコメントのフォーマットを表示する

## 課題

Git のコミット時のメッセージは気をつけているものの、毎回バラバラなフォーマットで入力してしまい、見直した際に確認しづらい。

## 対策

コミット時にフォーマットのサンプルを表示して、参考にして記述できるようにする。

#### サンプルとなるフォーマット
[Semantic Commit Messages](https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716) と言うらしい。

## 導入

#### テンプレートファイルを作成する

まずは個人的な統一を目標とするので、自分のHomeディレクトリに作成。

```:~/.git_comment_template
# feat: add hat wobble
# ^--^  ^------------^
# |     |
# |     +-> Summary in present tense.
# |
# +-------> Type: fix, docs, style, refactor, perf, test, build, ci, chore, or revert.
# 
# feat - A new feature
# fix - A bug fix
# docs - Documentation only changes
# style - Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
# refactor - A code change that neither fixes a bug nor adds a feature
# perf - A code change that improves performance
# test - Adding missing tests or correcting existing tests
# build - Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
# ci - Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)
# chore - Other changes that don't modify src or test files
# revert - Reverts a previous commit
```

#### テンプレートの適用

全プロジェクトで使用したいので ```--global``` オプションを使用する

```
git config --global commit.template ~/.git_comment_template
```
アドミニストレーター認定の準備: アプリケーション、活動、モバイル ⇒ 活動管理とコラボレーションの学習

１．Salesforce 認定アドミニストレーター試験のうち、「活動の管理とコラボレーション」セクションが占める割合は何パーセントですか?
２．Salesforce 認定アドミニストレーター試験の「活動の管理とコラボレーション」セクションで取り上げる主なトピックはどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/91ae79da-326a-b40e-68f6-ca8afa2e0894.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/c839047f-0773-dc7a-a027-849e5626af32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/be2dc230-1fb1-3cd7-dbba-24bb1c5e3596.png)
スクレイピングの実践 (編集中)

環境構築
・Gitの初期設定
https://qiita.com/wnoguchi/items/f7358a227dfe2640cce3
https://qiita.com/nog/items/c79469afbf3e632f10a1
→基本中の基本ですが行っておくと便利です。

・GitHub
https://github.com
→リポジトリを作成しておきます。

・Python3
https://qiita.com/ms-rock/items/72b8f1abc661c539bb09
→必要なバージョン（3.X.X）をインストール。

・Miniforges
https://zenn.dev/osuzuki/articles/380be0f682d72d
→M1 Mac向けのPythonパッケージなどを提供するプラットフォーム

・VS Code
https://hombre-nuevo.com/python/python0082/
→エディタ


Step1
hogehoge