OmniAICreator/Qiita-1.07M huggingface dataset:
チームの垣根を越境する「チーム間交換留学」

## □ 想定読者

この記事はこんな人におすすめです。

- リモートになってチーム以外と交流減ったなぁと感じる人
- 自分のチームのやり方がマンネリしてきたなぁと感じる人
- チームビルディングや文化作りに興味がある人

## □ チーム x 越境 = 異文化交流

チームを越境した「異文化交流」に一体どういう価値があるのでしょうか？

今は無き私のチームでは、「お疲れ会」や「毎週金曜の懺悔室」など様々なチームビルディングの施策を実施し、チームメンバー間での交流も活発に行われていました。
しかしその状態がずっと続き、ある日突然若干のマンネリ感を感じるようになり、刺激を欲するようになりました。
そこで考えたのが「他のチームから刺激を受けよう」というアイデアでした。

これは私個人の考えですが、チームとはいわば一つの「小さな組織」であり、チームごとに「独自の文化」があるものだと考えます。
そこで形成された「文化」は自分のチームとは全く違う歴史を歩んだ、完全なる「異文化」です。
この「異文化」と触れ合い・体験して得られる新しい気付きが、自分たちの文化をより発展させるきっかけとなります。

では、どのように「異文化」と交流すればよいでしょうか？LTやヒアリングも良いでしょう。しかし、今回私が考え、提案する方法はそれらとは違います。
私が提案する方法は「交換留学」を考えのベースとした「チーム間交換留学」です。
このやり方を取ることで、生の「異文化」と触れ合い・体験をすることが可能となりました。

## □ How to

やり方は単純です。
「別チーム（ホストファミリー）の朝会及び夕会などのイベントだけでなく、勤怠管理等も含めたすべてのやり方をホストファミリーに準拠して行う」というだけです。

留学期間は原則1週間としていますが、個人間の交流ではなくチーム単位で交流をする場合は2週間実施することを推奨します。
チーム間交換留学のスプリントは下記にあるように1ヶ月としています。

流れとしては
  1. 留学生公募
  2. 留学先選定
  3. 留学＆アンケート
  4. スプリント振り返り
という流れを取っています。
![スクリーンショット 2021-01-19 14.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/ee8e75ed-72e8-5dfc-4f89-6557bcbd7e48.png)
[▷ 詳細はこちらから](https://speakerdeck.com/dach/timufalseyuan-gen-woyue-jing-suru-timujian-jiao-huan-liu-xue?slide=6)


次に、各フローの詳細を説明します。

留学生公募はGoogleFormを利用して行います。
留学先の希望や目的、行きたくない所などを聞き、その情報を元に留学先をチームリーダー同士で協議し、留学先を選定します。
![スクリーンショット 2021-01-18 12.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/772ca65c-a209-226c-b120-271d0237f40b.png)


留学先が決まったら、留学生をそれぞれのチームのSlackチャンネルに招待し、チームで実施しているやり方を説明します。
事前説明は留学開始日前までに行います。
![スクリーンショット 2021-01-18 12.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/68d116f8-ec75-01e4-8a9c-c88a326969ca.png)


実際に留学が無事終わったらアンケートをGoogleFormから入力してもらいます。
これは留学生自身の振り返りでもあり、ホストファミリーとして迎え入れたチームにとっても第三者から見た自分たちを振り返るためのいい材料となります。
![スクリーンショット 2021-01-18 12.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/ce170d4e-f1fc-f38d-dcfb-eccb1f2147a1.png)


最後にホストファミリーやこの取組に協力しているチームのリーダーでスプリント振り返りを行います。
Jamboardを利用して各点を振り返り、課題と問題点を協議し、次のスプリントのカイゼンを行います。
![スクリーンショット 2021-01-18 12.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/247eb348-6375-82d8-89ea-2b164ce9da47.png)


以上がチーム間交換留学での実施全容となります。

## □ 実際にやってみて

実際にやってみると、文化形成がしっかりと出来ているチームと出来ていないチームの差が明確に出る結果となりました。
文化が発達しているチームからそうでないチームに行くと不満が多かったですが、その逆の場合だと満足度が高い結果となりました。
また、得られた学びとしても片方だけが得られる結果となり、文化レベルの引上が大きな課題として残りました。（この問題に対する対策として、チームリーダー交流会を実施しましたが、そのことについてはいずれ）

これらのことから「文化には進みの差があり、相互的に発展を促すためには双方が同じ文化レベルにまでいることが必要であった」、つまり、段階を経る毎に巻き込む範囲が「個人→チーム→別チーム」と進む必要があるという気づきも得ることが出来ました。

次なる一歩に進むためにも、まだチャレンジしてないかたは是非チャレンジしてみてはいかがでしょうか？
他にも「こういうやり方やったよ！」という方がいれば、皆さんのトライについても色々お聞きできればと思います。
Centos7 の ルート証明書インストール方法（Cybertrust）



## 証明書取得方法
```
su -
cd /etc/pki/ca-trust/source/anchors

wget https://www.cybertrust.co.jp/sureserver/download-ca/ovg4.txt
wget https://www.cybertrust.co.jp/sureserver/download-ca/scrca2.txt
```

## 証明書インストール方法
```
yum install ca-certificates
update-ca-trust enable
update-ca-trust extract
```

## 証明書確認方法
```
trust list | grep Security
       label: Security Communication RootCA2

trust list | grep Cybertrust
   label: Cybertrust Japan SureServer CA G4
   ```
Alpine Linux で edge computing を楽しむ

というわけで、
とうとう高みを目指しているプロジェクトの様子を伺おうと、ラップトップでマルチブートさせてみました。

日本語入力がibus-anthyだけでしたので、[mozc](https://github.com/google/mozc mozc)
がない理由を調べていました。ビルドのステップ自体は簡易化されています。
他のディストリビューションで普通に長らく使われてきたのですから、mozc本体には当然問題はありません。
LinuxやAndroid向けは、Docker上のUbuntuコンテナで動かし、バイナリを作る形のようです。

今はプロセスが明確化されて、パッケージもビルドも、メンテナンスしてくれている人たち。わかる人たちがいる限り、私達は恩恵を受け続けることができますね。
Alpine Linux上でもmozcの恩恵を受けようと思い立ちました。

edgeからgypがありませんでしたが、ビルドできました。
コンテナ内で最低限の最新の状態で、samurai(ninja)もエラーを出さず動いてくれました。

メンテナンスされている方々、ご苦労さまです。ありがとうございます。

手を加えたところは、clang前提のビルド環境でしたが、gccでもビルドできることを確認していたので、それに合わせて、gyp/common.gypiの中身を調整。
base/mutex.ccで、RECURSIVE_NPからRECURSIVEにするだけの、分岐の修正一箇所。

固有のヘッダーの場所を変えるなど、トリッキーなことをすれば、alpine上でclangでもビルドできることは確認しています。

あとはソースからインストールしても同じですが、abuildの仕組みを把握するために、ninjaのAPKGBUILDやibus-anthyさんのパッケージを参考にしました。

ibus-mozcのパッケージをaportsのtestingにのっけるには、、、手順を確認しないといけませんね。メールは送ったけど、~~ninjaがメンテナンスからedgeでは外れてるみたいなので、そこの関係を説明しないと、他の人もつまずくかもしれません。~~samuraiパッケージで動きました。

現状、alpine linux上で、ibus-anthyもibus-mozcも切り替えて、どちらも動作してくれました。
設定パネルも表示できて、普通に日本語入力ができるようになりました。
日本語だよ。わーい。本当にありがたい。
インストール方法については、[ibus-mozcのビルド記](https://pg-mana.net/blog/ibus-mozc-build/)が簡潔で参考になりました。

上記の参考サイトを参考にすれば、いろいろな環境で手動でもインストール可能かと思います。

パッケージはaportsのtestingが受け付けられたら、なのですが、ninjaとの関係も含めて整理しないとOKされないかなぁ。
またクリーンな素のalpineコンテナ上でビルドプロセスやパッケージの依存関係を確認して整理してみたいと思います。

みなさん、いろんな情報をまとめてくださっていて、ありがとうございます。
以上です。

['mozc google'](https://github.com/google/mozc)
['mozc branch alpine_edge'](https://github.com/phoepsilonix/mozc)

```
apk update
apk upgrade
apk add alpine-sdk clang samurai ibus-dev qt5-qtbase-dev gtk+2.0-dev \
        py3-core-api samurai pkgconf git clang

git clone --branch alpine_edge --single-branch --depth 1 --recursive https://github.com/phoepsilonix/mozc mozc
git submodule update --init

cd mozc/src
python3 build_mozc.py gyp
python3 build_mozc.py build -c Release package
~~~
xamppでバーチャルホストを設定する(laravel)

#概要
三か月前にエンジニアになったばかりですが、この前新規のプロジェクトでバーチャルホストとやらを設定し、開発をスタートして、これは便利だなーと感じたので記録しておきます。

###バーチャルホストとは？
その名の通り、仮想のホストのことですね。１つのサーバーで複数のドメインを運用できるみたい。
例えば、3つのプロジェクトを平行して開発しているとき、プロジェクトごとコードを書くたびにサーバーを切り替えるのはすごくめんどうだと。だからバーチャルホストを設定してプロジェクトaは「aaa.com」プロジェクトbは「bbb.com」プロジェクトcは「ccc.com」みたいにドメインを設定することができる。

###手順
手順はざっくりとこんな感じ。
この手順に入る前にapacheは停止させてくださいね。
1.hostsファイルの編集
2.httpd-vhostsファイルの編集
3.envファイルの編集

###1.hostsファイルの編集
hostsファイルの場所は下記。
C:\Windows\System32\drivers\etc\hosts

ただ、hostsファイルはそのままでは編集できません。
なので、一旦デスクトップへ移しましょう。
その際に警告が出ますが、「続行」を押して問題ないです。
デスクトップで編集したら、元の場所へ戻す。

hostsファイルの一番下に以下を追加
aaaの部分は任意の文字で。

```
127.0.0.1  aaa.com
```

###2.httpd-vhostsファイルの編集
ファイルの場所は下記。
C:\xampp\apache\conf\extra\httpd-vhosts

一番下に下記を追加。
htdocs配下に作業フォルダとかを作っている人はそのパス通りに。

```
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/aaa/public"
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/aaa/public"
ServerName aaa.com
</VirtualHost>
```

###3.envファイル編集
laravelにはプロジェクト直下に.envファイルというものがあるかと思います。
.env上部のAPP_URLとやらを手順1と2で設定したドメインを記述。

```
APP_NAME=aaa
APP_ENV=local
APP_KEY=それぞれ取得したkey
APP_DEBUG=true
APP_URL=aaa.com
```

これでapacheを立ち上げて、aaa.comをブラウザに入力すると表示されます。
Tableau関連のメモ

Tableau関連の自分用メモ。いつか綺麗にまとめたい。

# Tips系


# 技術解説系

## 地図に曲線を描く方法
https://www.flerlagetwins.com/2020/08/map-curves.html

#フォントについて

Tableau Publicでも安全なフォント一覧
https://public.tableau.com/views/TableauBrowser-SafeFonts/FontMenu?%3Aembed=y&%3AshowVizHome=no&%3Adisplay_count=y&%3Adisplay_static_image=y&%3AbootstrapWhenNotified=true#1


#色について

## COLOR PALLETTES FOR TABLEAU
ジェネレータではないが、Tableauに入れておいた方が良いもの。
https://public.tableau.com/profile/datavizard#!/vizhome/ColorPalettesforTableau/color

## Happy Hues
配色イメージが表示されるので選びやすい。
https://www.happyhues.co/palettes/5

## Coolers
色数を指定してカラーパレットが作れるのでディメンションの種類数に応じてジェネレートできるのが良い。
https://coolors.co/

## ColorSpace
１色選んだら相性の良い色を提示してくれる。コーポレートカラーなど使いたい色が決まっている時は便利そう。
https://mycolor.space/

## ColorDesigner
こちらも基本の色を選んでパレットを生成する。ColorSpaceより基本の色を選びやすい。
https://colordesigner.io/

# チャートタイプ

## 棒グラフのいろいろ
棒グラフの様々な表現方法がまとまっています。
https://public.tableau.com/profile/sparsonsdataviz#!/vizhome/FinessingBarCharts-arethinkonchartdesign/0_Introduction

# 英語対応

## 英語でグラフの推移を説明するには？
「30%増加」などグラフを説明するときの文章を英語でどう書けば良いかまとまっている
https://progrit-media.jp/408

# 便利ツール

## Excalidraw
https://excalidraw.com/
手書き風の絵が描ける描画ツール。ダッシュボードのラフ案作成などに便利。共同編集も可能。Figma, Adobe XDも便利だけどそれ以上に手軽に使える印象。ユーザー登録も不要。

# YouTube

## Andy Kriebel
https://www.youtube.com/channel/UCTlX7UpqASrldmx5_CpG3CA

## Information Lab
https://www.youtube.com/user/theinformationlab

## KT channel
https://www.youtube.com/channel/UCT4TxXWPoY_fKjvlXQhr_9Q

## Tableau TV
https://www.youtube.com/user/mekamasin628

# スニペット

## Trellis chart

```
//Columns
index()%(int(SQRT(SIZE())))

//Rows
int((index())/(int((SQRT(SIZE())))))
```

# e-Statのデータ

e-Statのwebコネクター
https://qiita.com/Arahabica/items/944427a26abfc48a83aa


# お気に入りViz

地図上にグラフを表現する
https://public.tableau.com/ja-jp/gallery/economic-output-us-counties?tab=viz-of-the-day&type=viz-of-the-day

IronViz
https://public.tableau.com/ja-jp/gallery/air-we-breathe?tab=viz-of-the-day&type=viz-of-the-day

# データを読み解くための知識について

## 摂氏、華氏の変換について
https://www.metric-conversions.org/ja/temperature/celsius-to-fahrenheit.htm
https://twitter.com/unbosoms/status/1352040666071670785?s=20

## 緯度経度について
度分秒表記と１０進数表記があるので注意。メッシュも。
PHP Portfolio　

#はじめに
らむです。
今回は、初めてQiitaで投稿します。
理由としては、ある程度、学習をしたのでポートフォリオを制作することにしました。
#目的
私は、現在転職するために独学で、プログラミングを勉強しています。
また、転職活動において他人と差別化できるように作成中のポートフォリオの説明や工夫点などをアウトプットしていきます。
#開発環境
■言語（製作中の現時点）
PHP 7.4.2
mysql  Ver 8.0.22
JavaScript (jQuery)
HTML
CSS 


■ローカル開発
MAMP

#ポートフォリオ概要
・機能
 　　ログイン機能、カレンダー、ToDoList
・細かな機能
　　ユーザー登録、ログイン、ログアウト
　　カレンダーの一般的な機能
　　日にち選択時にモーダルウィンドウ（予定入力欄）表示

■今後実装予定
入力した予定の保存、更新、削除機能
予定一覧に「成功」、「失敗」欄を追加し、選択により画面が変わる
その日の予定の進捗を0時前に表示させ○％以上成功したら、○％以下しか成功できなかったらとそれぞれ表示

#詳細
■ターゲット
13歳以上をメインターゲット

■ターゲット選定理由
13歳になると中学生になります。中学生になれば、自分で予定を組んだりしていく事が多いと思います。
12歳未満は主に保護者が予定を管理していると考えています。

■開発した理由
現職で工程管理、マネジメント業務を行っており、毎日予定を立て、業務をしています。
その中で、その日に計画した全ての予定を終わらせ、毎日こなしていくことは大変だと感じています。
なので、少しでもモチベーションを上げれるように考え方を変え、ミッション風にアレンジしようと思い具現化する為に実装しました。

■工夫点

一般的なスケジュール管理をゲーム感覚でできるように付加価値を与えた点。
13歳以上をメインターゲットにしているので、全てにおいてシンプルに制作しています。
　
引き続きポートフォリオ制作がんばります！
【Salesforce】SOQLのパフォーマンスチューニング（インデックスで実行速度を上げる等）

# Salesforce での SOQL パフォーマンスチューニング
SOQL のパフォーマンスをチューニングする方法およびツールを紹介します。

# インデックスを付与する

インデックスとは索引です。
このインデックスが割り当てられている項目は、DBの中で何がどこにあるかをざっくり把握しているようなイメージとなります。
なので、インデックスが付与されている項目を条件に加えるとSOQLの実行速度が上がります。

Salesforceでは、標準設定として以下の項目にはインデックスが振られております。
　・RecordTypeId
　・Division
　・CreatedDate
　・SystemModStamp(LastModifiedDate)
　・Name
　・Email(取引先責任者とリード)
　・ID
カスタム項目にインデックスを割り当てる事も可能です。
方法としては3つあります。

・カスタム項目にインデックスを割り当てる方法①：外部IDに設定する。
 　　項目定義にて「外部ID」にチェックを入れればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/5da8ea76-fa0d-a738-2f4a-e90980f92aba.png)

・カスタム項目にインデックスを割り当てる方法②：値をユニークに制限する。
　　項目定義にて「ユニーク」にチェックを入れればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/db25c9e1-f915-e4b1-54f1-bc26f2fc9d4b.png)

・カスタム項目にインデックスを割り当てる方法②：テクニカルサポートに依頼する。
　　外部キーもしくはユニーク制限をしたくない場合は、テクニカルサポートに依頼することでインデックスを付与する事が可能です。

# インデックス項目を条件に加える

以下のようにインデックス項目をSOQLの条件に加えれば、実行速度が上がります。

```sql

SELECT Id, Name, Phone
FROM Account
WHERE CreatedDate > 2020-10-08T01:02:03Z
```
# インデックスを使用しても、実行速度が上がらないパターン

注意が必要なのは、インデックス項目を使用しても実行速度が上がらないパターンがあります。
以下がそのパターンです。

・null 行に対するクエリ— 項目が空または null であるレコードを探すクエリ。

```sql
SELECT Id, Name FROM Account WHERE Custom_Field__c = null
```

・否定的な絞り込み演算子 — クエリ内での !=、NOT LIKE、EXCLUDES などの演算子の使用。

```sql
SELECT CaseNumber FROM Case WHERE Status != ‘New’
```

・先頭のワイルドカード — 次のように先頭にワイルドカードを使用するクエリ。

```sql
SELECT Id, LastName, FirstName FROM Contact WHERE LastName LIKE ‘%smi%’
```

・比較演算子を使用したテキスト項目 — テキストベースの項目での >、<、>=、<= などの比較演算子の使用。

```sql
SELECT AccountId, Amount FROM Opportunity WHERE Order_Number__c > 10
```

# SOQLの評価ツール「Query Plan」
SOQLの評価には、「Query Plan」という機能を使います。
まずは開発者コンソールにて、この機能を有効化します。
Help>Preferencesをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/47415f1e-6862-6388-8652-6a97658f3385.png)
Enabel Query Planにチェックを入れ保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/f7d7fefb-e61d-a24d-fcf6-8348ad745c6b.png)
これで、Query EditorタブのExecuteボタンの横に「Query Plan」ボタンが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/49b3587c-42ca-710d-dcda-28b203f8a713.png)

# Query Planの使い方
使い方は簡単、SOQLを入れて「Query Plan」を押下するだけです。

以下SOQLで試してみましょう。

```sql
SELECT Id, Name, Phone
FROM Account
```
「Query Plan」を押下すると、以下画面が立ち上がりました。
Leading Operation Typeを見れば分かるように、TableScanされています。
要はインデックス項目が条件に無いため、全てのレコードを検索してます。
Costとしては、2.593掛かっております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/7af9ea2e-2c4d-5372-06ed-cdc3ef27dc17.png)


では以下のSOQLだとどうでしょうか。
インデックス項目である「CreatedDate」を条件に加えております。

```sql
SELECT Id, Name, Phone
FROM Account
WHERE CreatedDate > 2020-10-08T01:02:03Z
```
2プラン表示されました。
SOQL実行時には最もCostが掛からないプランが採用されるので、当然Leading Operation TypeがIndexのプランが採用されます。
CreatedDateを検索条件に加えた事により、Costが2.593⇒0.8に下がりました。
Costが下がれば実行速度も上がります。
評価ツールによって、インデックス項目を条件に加えると実行速度が上がる事が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239535/5877f1c5-f786-5229-fae8-ceddd47d1bc6.png)
【備忘録】Unity既存プロジェクトダウングレード時に気をつけること

備忘

たまに下記のようなエラーが出てビルドができない時がある

Library/PackageCache/com.unity.textmeshpro@3.0.1/Scripts/Editor/TMP_PackageUtilities.cs(453,84): error CS0103: The name 'VersionControlSettings' does not exist in the current context

海外サイトを調べてみた結果、Unityの既存プロジェクトに対して、verを下げたりすると起きる可能性がある事象のよう
要するに「Unityのverと、packageのverが一致していないから、ver合わせてくれない？」というエラー

上記のエラーメッセージの場合、
「textmeshpro」というパッケージのver合わないという指摘となる

ので、

PackageManagerを開いて、InProject内を探せば良い
特に、パッケージ名の右側のボックスがチェックマークではなく、下向きの矢印になっているものは、ver合わせが必要だと思われる

※まだ事象に遭遇したことが無いが、おそらくチェック以外、上向きの矢印とかも存在するのでは？と予想
　つまり、パッケージのverを上げるにしろ、下げるにしろ、Unityのverで使えるものにしないと行けないということだと思う
VBAメモ：isDate曰く「”2月29日” は日付じゃないけど、"2/30" は日付」

タイトルのままなのですが、入力された内容が日付かどうか調べる時にハマったのでメモ。

# タイトルの解説

月日を明示的に指定した、`isDate("2月29日")`は基本`false`だ。
実行したのがうるう年の場合だけ、`true`を返す。
まったくもって期待通りである。

しかし、スラッシュ区切りの**`isDate("2/29")`は、うるう年と関係なく、常に`true`**だ。
そして、**`isDate("2/30")`も`true`**、日付であると判断されてしまう。

「書式は "月/西暦下2桁" かな？ 2030年2月ですね！」
と、**2030/2/1** のつもりでtrue。…正しいけど、そんなのは期待してない。

# 困ったこと：セルの判断とVBAのisDateの判断が一致しない

Excelのセルは、入力された値が日付っぽいときに、日付扱いしてくれる。
セルが日付扱いするかどうかと、VBAで`isDate`がそのセルを日付だと思うかどうかは、必ずしも一致しない。

## 存在する日付の場合

セルの書式設定で、「yyyy-mm-dd」を設定、「3/1」と入力する。
**当年の3月1日**だと判断され、表示は「2021-03-01」。すごく妥当。

VBAの`isDate`は、引数の文字列が日付なら`true`を返す関数。

```vb:vba
' A1セルの中身は日付かな？
If isDate(Cells(1, 1)) Then           
    ' 日付だったら変数にフォーマットした文字列を投入
    dstr = Format(Cells(1, 1), "YYYY-MM-DD")  ' dstr = 2021-03-01
End If
```

ちゃんと今年の3/1だと分かってくれている。

## うるう日の場合

同じセルに、「2/29」と入力してみる。

まずはセルの挙動。
入力したのが（パソコンのシステム日付が）うるう年、例えば2020年なら、「2020-02-29」になる。
うるう年でなければ、たとえ日付の書式設定をしていても、そのまま「2/29」と表示される。
**日付じゃない**と判断されているようだが、当年の2月29日は存在しないのだから、妥当だと言える。

次にVBAの挙動。
うるう年なら、先ほどのコードの`dstr`に「2020-02-29」が代入される、予想通り。
しかし、うるう年でなくても**`isDate`は`true`**になる。
なんでや。

```vb:vba
' A1セルの中身「2/29」は日付かな？
If isDate(Cells(1, 1)) Then           
    ' 日付だったら変数にフォーマットした文字列を投入
    dstr = Format(Cells(1, 1), "YYYY-MM-DD")  ' dstr = 2029-02-01 < どこから来た？
End If
```

`isDate`的にも`Format`的にも、「2/29」は「**2029年2月**」だと思っているようだ。
不足している日付を1日として補って、2029年2月1日って日付ですね？、とか言う結果。
つまるところ`isDate`は、「**月 / 西暦下2桁**」の書式を持ち出してきている。

日本人にあまり馴染みが少ないだけで、世界にはこの書式も存在する以上「不具合じゃなくて仕様」である。
が、思ってたんと違う。

## 日本人的には日付じゃない感じの入力をしてみる

| 入力 | シートの判断 | VBAの判断 |
|:-:|:-:|:-:|
| 2/0 | (日付じゃない)  | 2000-02-01 |
| 0/2 | (日付じゃない)  | 2000-02-01 |
| 2/30 | (日付じゃない) | 2030-02-01 |
| 30/2 | 1930-02-01 | 1930-02-01 |
| 13/30 | (日付じゃない) | (日付じゃない) |
| 0/0 | (日付じゃない) | (日付じゃない) |

セルが「2/30」は通さないのに「30/2」は通す、というのは何なんだろう。

VBAのisDateは、なんとか日付にならないかと精一杯やってくれる。
スラッシュの前後の数字がどちらも月にならない、となるとようやく諦めた。

## isDateはどこまで許容するのか

他にもいろんな文字列を`isDateに`投入してみた。

```vb:vba
' 年月日の単位を含めた文字列はどうか
isDate("3月1日")        ' true  日本式も認識可能
isDate("2月29日")       ' false 今年はうるう年でないから。
                        '　うるう年に実行すれば true
isDate("2020年2月29日") ' true  年まで入ってれば明白に日付

' 月名を使う欧米式
isDate("28 feb")       ' true 2019-02-28
isDate("29 feb")       ' true 2029-02-01
isDate("30 feb")       ' true 2030-02-01
isDate("feb 30")       ' true 2030-02-01
isDate("feb 50")       ' true 1950-02-01
```

本当に、一生懸命やってくれてるんだけどね、`isDate`は。

# 日付じゃないものを、感覚的に正しくハネるにはどうすればいいか

使う人にとっては、コード側の仕様が妥当かどうかとか関係ない。
見えているシート（の印象）と違う結果が出たら、「不具合あるんだけど直してよ」となる。

つまりは、シート上の見た目と、VBAの判断に違いがあるのが問題なのである。

* セルには日付の書式設定をする
* VBAでも同じフォーマットをしてみる
* 文字列として一致するかどうか比較する

という対応にしてはどうだろうか。

```vb:vba
' isDate的に、日付だと思う？
If isDate(Cells(tmpRow, tmpCol)) Then
    ' セルの値をそのまま日付として評価、セルと同じ書式にする
    d = Format(Cells(tmpRow, tmpCol), "YYYY-MM-DD")
    ' 一致しないということは、セルはそれを日付とみなしてない。
    If d <> Cells(tmpRow, tmpCol).text Then
        MsgBox "正しくない日付です。"
    End If
Else
    ' isDateにも拒否される、絶対日付じゃないやつ
    MsgBox "日付を入力してください。"
End If
```

「30/2」の入力は通ってしまうけど、**「1930-02-01」がセルに表示されている**ので、見たままですよと。

「**日付として妥当かどうか**はチェックしてます」
「部分的に入力した文字列が、具体的に何年何月何日なのかは、Excel側が判断して補ってます」
という説明で納得してもらえる（んじゃないだろうか（希望））。
【Laravel】文字列を直接CSVファイルでレスポンスする（動的に生成した文字列を直接ファイル形式でレスポンスする。）

自分用のメモとして残します。

文字列をダウンロードファイルとしてレスポンスを返す方法をメモ。
→つまりレスポンス用にわざわざファイルを保存しない。

#■やり方
\Responseクラスでレスポンス用のオブジェクトを明示的に作成する。

```php
$content = 'hoge,hoge,hoge';
$headers = [
    'Content-type'        => 'text/plain; charset=utf-8',
    'Content-Disposition' => 'attachment; filename="download.txt"',
];
$response = \Response::make($content, 200, $headers);

return $response;
```
初心者がLaravelでアプリを作るまで（２）

基本設計とテーブル定義の相談を終えて、コードを書いていくことに、、
でもいきなりコードを書いていくことは難易度が高すぎるので、スクールのカリキュラムで覚えたことに沿って少しずつ書いていく。

とりあえず、MVCモデルとルーティングの流れでページを作るということはわかっているので、まずviewの部分を書いて、
それからcontroller、routingという順番で書いていこう。
先生が言うには、順番は決まっているわけではないらしいので適当に決めてみました。
DBとmodelの部分は少し自分にとって難しいので、後で書くことにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008402/5500f017-1c76-5488-53d0-10e59ed33237.png)

とりあえず、投稿ページの形だけは完成。

形を整えるために、bootstrapを使ったけど、使うのが難しい。
しかも、スクールのカリキュラムにbootstrapに関する記述はほぼなかったので、質問投稿機能と自分で調べながら書いてみたけど、一ページ作るのに果てしない時間がかかりました、、

初心者は、フロントすらなかなか整えれない、、

それから、複数ページを時間をかけながらつくってみました。
何枚か画像を載せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008402/1fefa2c0-2473-a400-b85b-3b9ac3d5e707.png)

↑投稿一覧ページ
これはカリキュラムにやり方が、書いてあったので少し短めの時間で完成しました。
投稿する機能もついでに書いてみましたが、理解しにくい部分もありながら実装してみました。

何せ、一つのページに一つの機能をつけるのに時間がとてもかかる、、
書いてはエラー書いてはエラーの繰り返し、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008402/2a669ff5-eadf-a31b-2200-8d533e299028.png)

↑マイページ
あとは、マイページもつくってみましたがここから色々データを持ってくる機能だったり、内容を変更する部分を書いていかなくては、、


とりあえずフロント画面は徐々に完成していっているので、このままがんばります！
問題はページとページの中身をうまく遷移したりデータを持ってくるコードのとこやなあ
Project build error: Non-resolvable parent POM for

# 事象 : Mavenプロジェクトをインポートしたらpom.xmlで怒られた
- 環境
    - Windows10 Pro バージョン1909
    - java version "1.8.0_251
    - Eclipse IDE for Enterprise Java Developers Version: 2020-09 (4.17.0)


```text:[Markers]タブのメッセージ
Project build error: Non-resolvable parent POM for com.koproject:ko-project:2.4.0: Failure to find jp.go.meti.oya-project:oya-project:pom:2.15.0 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced and 'parent.relativePath' points at wrong local POM
```

## 原因 : parentで指定しているバージョンが親pom.xmlのバージョンと違うから

```xml:プロジェクトのpom.xml
    <parent>
        <!-- 省略 -->
        <version>2.15.0</version>
        <relativePath>../oya-project</relativePath>
    </parent>
```

```xml:親(../oya-project/pom.xml)
    <!-- 省略 -->
    <version>2.20.0</version>
    <packaging>pom</packaging>
```

### 対応 : parentで指定するバージョンを親pom.xmlに合わせる

```xml:プロジェクトのpom.xml
    <parent>
        <!-- 省略 -->
        <version>2.20.0</version>
        <relativePath>../oya-project</relativePath>
    </parent>
```

## 原因 : プロキシの設定
今回は違うけどいつかなったとき用にメモ
参考 : [Mavenのプロキシ設定 - Qiita](https://qiita.com/ccaiueo/items/a030b5826cb13e4d4aad)
WordPressループ処理、件数やカテゴリー指定

ループ処理の基本的な書き方と、カテゴリーや件数での条件を指定した書き方をまとめました


## ループ処理の基本的な書き方

```php
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

　<!-- 記事のループ処理 -->

<?php endwhile; ?>
<?php else : ?>

　<!-- 記事が無い場合 -->

<?php endif; ?>
```

## ループ処理の中身の一例

```php
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        <span><?php the_time('Y/m/d'); ?></span>
    <?php endwhile; ?>
<?php else : ?>
    <p>記事がありません</p>
<?php endif; ?>
```
この書き方では以下のようになります

#### 記事がある場合
- タイトルをaタグで囲んで表示、リンクは投稿先へ
- spanタグで日付を年/月/日で表示
- この処理を記事がある分だけ繰り返す
- ループ終わり

#### 記事が無い場合
- 「記事がありません」という文字列をpタグで囲んで表示
- ループ終わり

更に最初に少し書き加えると、条件を指定した表示ができます。

## カテゴリーを指定
'cat=○○'この部分に表示させたいカテゴリのIDを入れる

```php
<?php query_posts('cat=1'); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
　<!-- 記事のループ処理 -->
<?php endwhile; ?>
<?php else : ?>
　<!-- 記事が無い場合 -->
<?php endif; ?>
```

#### 複数のカテゴリを指定する場合はカンマで区切る
```php
<?php query_posts('cat=1,3,5'); ?>
```

#### 指定のカテゴリを表示しない場合
```php
<?php query_posts('cat=-1'); ?>
```


## 表示数を指定
'posts_per_page=〇〇'この部分に表示数を入れる

```php
<?php query_posts('posts_per_page=10'); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
　<!-- 記事のループ処理 -->
<?php endwhile; ?>
<?php else : ?>
　<!-- 記事が無い場合 -->
<?php endif; ?>
```

#### 指定のカテゴリの表示数を指定
```php
<?php query_posts('cat=1&posts_per_page=10'); ?>
```

## まとめ
規模の小さいコーポレートサイトやブログの更新システムは、この書き方で十分まかなえるかと思います。
iOSのLaunch Screen設定方法


#iOSのLaunch Screen設定

## react-native-splash-screenの設定

```
npm i react-native-splash-screen --save
```

AppDelegate.mへ上記パッケージの設定を追加

注意：#ifdef FB_SONARKIT_ENABLEDの後に入れないようにすること

```ios/プロジェクト名/AppDelegate.m

#import "AppDelegate.h"

#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import "RNSplashScreen.h"  // 追記

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // ...other code

    [RNSplashScreen show];  // 追記
    return YES;
}
```

##XcodeでのLaunch Screen設定

Images.xcassetsディレクトリを選択、右クリックし
'Image Set'を選択

![スクリーンショット 2021-01-19 13.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975737/b39d1127-2696-a5e4-8910-e019737df03a.png)

デザインに必要なロゴなどを登録する

## LaunchScreen.storyboardの編集

先程登録した画像を実際にLaunchScreen.storyboardへ登録する

右上にある＋ボタンから先程作成した画像を選択し、端末へドラッグ&ドロップする

![スクリーンショット 2021-01-19 13.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975737/2371529d-7fd1-d0ac-8cfa-31a4f40b89fc.png)

センタリングしたい場合は、下記赤枠のボタンを押下し
Horizontally in Container:0
Vertically in Container:0
を設定することで全端末の中心に配置することができる

![スクリーンショット 2021-01-19 13.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975737/92e748a8-44c8-647a-b442-5266cfba1ad4.png)

##App.tsxの設定

最後に、SplashScreenを消す処理を記載
基本的にはAppが用意できたら削除してあげるべきとのこと

```App.tsx
import React from 'react'
import SplashScreen from 'react-native-splash-screen';　//追記


export const App = () => {
  //useEffectを追記
  useEffect(() => {
    SplashScreen.hide(); 
  }, [])

  return (
      // ...other code
  )
}
```
##Androidについて
実施してみたら追記します
プログラミングで使われるなんちゃらケースってのを整理してみた

プログラミングのときに使われる「～～～ケース」ってやつを、整理してみます。


#キャメルケース

複数の単語をつなぐときに、先頭の単語の頭文字は小文字、2語目以降は頭文字を大文字で書くというルールです。

例

```
hello world -> helloWorld
programing language -> programingLanguage
osaka city -> osakaCity
```

利用例

・Javaのメソッド名や変数名


#スネークケース

複数の単語をつなぐときに、単語同士を「_（アンダーバー）」でつないで書くというルールです。

例

```
hello world -> hello_world
programing language -> programing_language
osaka city -> osaka_city
```

利用例

・リレーショナルデータベースのテーブル名やカラム名


#パスカルケース

複数の単語をつなぐときに、単語の頭文字を大文字で書くというルールです。

例

```
hello world -> HelloWorld
programing language -> ProgramingLanguage
osaka city -> OsakaCity
```

利用例

・Javaのオブジェクト（クラス）名称
Pythonの高速化

# はじめに

[Python コードの高速化のアプローチ](https://qiita.com/zettaittenani/items/3bb25752d6e6a458332e?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=621864e230-Qiita_newsletter_443_12_30_2020&utm_medium=email&utm_term=0_e44feaa081-621864e230-32810561)

Pythonの高速な書き方のことだと思って, うっかり見てしまったため, 気になって仕方がないのです. 競技プログラミングは知らないのですが, エレガントなアルゴリズムを考えて問題を解く競技だと思っていたのですが, 違うのですね.

アルゴリズムを改良して高速化することを考えます. そのためPythonはほとんど関係ないです, タイトル詐欺です. ほとんどの理由はまとめにあります.
多くの環境で速くならないと意味がないので環境は書きません.

# ベースライン

```python
import math

def is_prime(x : int) -> bool:
    if x <= 1:
        return False
    if x % 2 == 0:
        return x == 2
    upper = math.floor(math.sqrt(x)) + 1
    for i in range(3, upper, 2):
        if x % i == 0:
            return False
    return True

def minimum_prime_number(x : int):
    maxx = 10 ** 14 + 32
    for i in range(x, maxx):
        if is_prime(i):
            return i

if __name__ == '__main__':
    result = minimum_prime_number(100000000000000)
    print(result)
```

```
100000000000031
0.504 seconds
```

# ミラー–ラビン素数判定法
確率的判定法を追加しますが, ほとんど変わらず.

```python
def miller_rabin_test(n : int) -> bool:
    k = 50
    if n <= 1:
        return False
    if n % 2 == 0:
        return n == 2
    if n % 3 == 0:
        return n == 3
    if n % 5 == 0:
        return n == 5

    s, d = 0, n-1
    while d % 2 == 0:
        s, d = s+1, d>>1
    while 0<k:
        k = k-1
        a = random.randint(1, n-1)
        t, y = d, pow(a, d, n)
        while t != n-1 and y != 1 and y != n-1:
            y = pow(y, 2, n)
            t <<= 1
        if y != n-1 and t % 2 == 0:
            return False
    return True

def is_prime(x : int) -> bool:
    if False == miller_rabin_test(x):
        return False
    upper = math.floor(math.sqrt(x)) + 1
    for i in range(3, upper, 2):
        if x % i == 0:
            return False
    return True
```

```
100000000000031
0.501 seconds
```

# 3の倍数をスキップする
計算コストの方が上回ってしまった.

```python
def is_prime(x : int) -> bool:
    if False == miller_rabin_test(x):
        return False
    upper = math.floor(math.sqrt(x))
    count = 5
    step = 4
    while count<=upper:
        if x % count == 0:
            return False
        step = 6 - step
        count += step
    return True
```

```
100000000000031
0.569 seconds
```

# まとめ
そろそろ飽きてきたため終了です. C++を呼び出してしまったら, それはもうC++で書けということなのでやりません.
Pythonの試行錯誤について, 次の項以外では整数のサイズが可変なことが遅くなる一因なのかと推測しています.

## 試行錯誤 ループ
"インタープリタはループが遅い"は, 2021年でも有効な知見と思われます. MATLABなどもそうです. iteratorとgeneratorを試しています.

- iterator: 検索した例を基に作成しましたが, 1秒以上の計算時間で遅いです. 停止判定を例外で行うことが, 設計ミスだと思います. 参考にした例が悪いのかな.
- generator: 0.6秒程度でやはり遅いです. whileに比べて多くの処理が必要なのは仕方がないです. 利便性とのトレードオフです.
Qiitaのタグフィードの代わりにするやつ

#3月8日追記
結局2月26日にリリースされたアップデートでは、タグフィードの機能は削除されることはなく残されたようです。
ということで自分は再びタグフィードのほうを使うようになりました。

#はじめに

[Qiita大型アップデートのベータ版リリースのお知らせ - Qiita Blog](https://blog.qiita.com/qiita-2101-update-beta-release/)
によると次のQiitaのWebサイトのアップデートで「タグフィード」が削除されてしまう予定になっているそうです。
現在公開されているベータ版に切り替えて使用感を試してみたのですが、今まで「タグフィード」をほぼ常用している自分のような使い方の代わりになるようなページは用意されていないようです。

#そこで

ページ上部の検索欄に`tag:shellscript OR tag:シェル芸 OR tag:sed OR tag:awk OR tag:vim OR tag:tmux`のような形でマイタグをすべて検索対象として表示させ、表示順を「新着順」(`sort=created`)にして得られる下のようなURLをブックマークして使うことにしました。(便宜上タグは数個しか指定していませんが本当はめっちゃ多いです。)

```
https://qiita.com/search?q=tag%3Ashellscript+OR+tag%3A%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8+OR+tag%3Ased+OR+tag%3Aawk+OR+tag%3Avim+OR+tag%3Atmux&sort=created
```

[「tag:shellscript OR tag:シェル芸 OR tag:sed OR tag:awk OR tag:vim OR tag:tmux」の検索結果 - Qiita](https://qiita.com/search?q=tag%3Ashellscript+OR+tag%3A%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8+OR+tag%3Ased+OR+tag%3Aawk+OR+tag%3Avim+OR+tag%3Atmux&sort=created)


#おわりに

タグフィードってそんなに使われていないのかなあ…

#追記

URL作成を自動化するワンライナーを作ってみました。

[Qiitaでフォロー中のタグを全部指定した検索結果画面のURLを作るワンライナー - Qiita](https://qiita.com/hidezzz/items/dd0a94f843c023918860)
SQLのデータのソートって記述する順番が大事ですね【備忘】

#問題
2020年3月の注文金額が5,000円以上、かつ、ポイント割引が適応されている売上データ一覧を取得するSQL文を記述してください

という問題で、
・2020年3月以外も混ざってしまう
・割引データのないデータも抽出される
といった具合です。

データベースのカラムは
id, user, item, category, price, discount, total, orderDate
で構成されています。

| データ名 | 型| 意味 |
|:-----------|------------:|:------------:|
| id         | int         | id           |
| user       | varchar     | ユーザー名     |
| item       | varchar     | 商品         |
| category   | varchar     | 商品のカテゴリー |
| discount   | int         | 値引き額      |
| total      | int         | 注文金額      |
|orderDate   | date        | 注文日        |

最初に実際に書いたデータが下記です。

```sql
select * from orders_scv group by discount having sum(price) >= 5000 order by orderDate between 2020-03-01 and 2020-03-31;
```

データベースから
having sum(price) >= 5000で、値段の合計金額が5000円以上のdiscountというカラムを抽出します。
これでいいと思ったんですけどね...。だめでした。
discountカラムには-2000などintデータが格納されますが、この場合nullも抽出されます。
後から見てみると、そりゃnullを弾いたデータはとれないよなと思いました。

あとこの時点でpriceの合計が５０００円に満たないユーザーも抽出されていました。
そのユーザーの他月の注文データを確認すると、年間のトータルで５０００円を超えていましたので、抽出されたのだと思います。

ということは、先に期間を設定してから、discountカラムからnullを除外すればいいのですね。
したがって書くべきコードは

```sql
between 2020-03-01 and 2020-03-31 and discount is not null;
```

が確定します。
残すは、５０００円を超えるデータを抽出するコードを書いて、上記のコードを追加することで完成です。

```sql
select * from training2.orders where total => 5000 and between 2020-03-01 and 2020-03-31 and discount is not null;
```

ですね！これで解決しました。嬉しい！
久しぶりにQiitaに書き留めましたが、実際に文章にすることで問題が整理されて客観的に見れるのではと気がつきました。理解度も高まるように思えます。

理解が間違っていましたらすいません、ご指摘をいただけますと幸いです。
FlutterのWidgetの知識を深める

# どうやって深める？

YouTubeに「Flutter Widget of the Week(今週のウィジェット)」という動画がある。
この動画では、Widgetnとその使用例を1分程度の動画で教えてくれている。
Widgetの引き出しを増やしたい場合には一通り見るといいかも。

https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG
DBFS に関するメモ

Databricks Filesystem (DBFS) の内部構造の理解が曖昧だったので整理します。

### DBFS 概要
- Databricks Workspace にマウントされる
- オブジェクトストレージを抽象化したもの。以下の利点を持つ
    - 資格情報なしにデータにアクセス (資格情報はクラスタに付与されたものを使う)
    - ファイルをオブジェクトストレージに永続化するため、クラスタ終了後にデータが失われない
- DBFS のデフォルト保存場所は、DBFS ルートと呼ばれる

### DBFS ルートの利用が望ましくないファイル
DBFS ロートのデフォルトディレクトリ構造は以下の通り。
<font color="Red">**赤字**</font>はシステム上、手動でのファイル移動や削除が推奨されないディレクトリ。
<br>

- **/FileStore**
    - <font color="Red">**/jars**</font>
        - アップロードされたライブラリの格納先
        - このフォルダ内のファイルを削除すると、ワークスペース内のこれらのファイルを参照するライブラリが機能しなくなる可能性
    - <font color="Red">**/tables**</font>
        - UI を利用してインポートしたデータの格納先
        - このフォルダ内のファイルを削除すると、ワークスペース内のこれらのファイルを参照するテーブルを参照できなくなる可能性
    - **/plots**
        - plot や display コマンドを実行した際に生成される画像の格納先
        - このフォルダ内のファイルは削除可能だが、Notebook を再実行する必要がある
    - **/import-stage**
        - Notebook をインポートするときに生成される一時ファイル
        - インポートが完了すると消える
- **/databricks-datasets**
    - サンプルの公開データセット
    - Spark の学習やアルゴリズムのテストに
    - display(dbutils.fs.ls("/databricks-datasets"))
- **/databricks-result**
    - クエリの完全な結果をダウンロードして生成されたファイル
- **/databricks/init**
    - グローバル init スクリプト
- <font color="Red">**/user/hive/warehouse**</font>
    - 非外部 Hive テーブルのデータとメタデータ
    - 消去するとテーブルを参照できなくなるので注意

<br>
以下は要件に応じて別途構築

- **/mnt**
    - S3 などのオブジェクトストレージをマウントした場合、ローカルファイルにあるかのようにアクセスできる
    - mnt ディレクトリの下に、ストレージオブジェクトが並ぶ形
    - すべてのユーザーは /mnt 内のデータへのアクセス権を持つ


### 参照
[Databricks File System (DBFS)](https://docs.databricks.com/data/databricks-file-system.html)
[FileStore](https://docs.databricks.com/data/filestore.html)
TFSwitch terraformのバージョン管理

# TFSwitch 使いましょう

terraform のバージョン管理ツール
>[tfswitch](https://tfswitch.warrensbox.com/)

# 環境
OS環境：macOS Big Sur ver11.1

# インストール
brewコマンドにて、インストール

```
$ brew update
$ brew install warrensbox/tap/tfswitch
```

## Error
>エラーが発生しました。お使いのCLTはmacOS 11をサポートしていません。
>それは古いか、変更されています。
>CLTをアップデートするか、アップデートがない場合は削除してください。
>システム環境設定のソフトウェアアップデートからアップデートするか、実行してください。

```
$ softwareupdate --all --install --force
```

## アップデートは表示されなかったので

>それでもアップデートが表示されない場合は、以下のようにしてください。

```
$ sudo rm -rf /Library/Developer/CommandLineTools
$ sudo xcode-select --install
```

## Error
もともとterraformwpインストールしてしまっているとシンボリックリンクが貼られていてダメみたいですね。

```
$ brew unlink terraform
```

## バージョン確認
```
$ tfswitch -v
```

## terraform インストール
```
$ tfswitch
```
セレクトできるようになるので、インストールしたいバージョンの選択すると勝手にインストールされる。
今回は、`v0.12`へのアップデートを確認したいので、`v0.12`系をインストール

## バージョン確認
```
$ terraform -version
Terraform v0.12.30
```

# バージョンアップ対応
今回は、`v0.11` 👉 `v0.12`へのアップデートを調査

```
$ terraform 0.12upgrade

This command will rewrite the configuration files in the given directory so
that they use the new syntax features from Terraform v0.12, and will identify
any constructs that may need to be adjusted for correct operation with
Terraform v0.12.

We recommend using this command in a clean version control work tree, so that
you can easily see the proposed changes as a diff against the latest commit.
If you have uncommited changes already present, we recommend aborting this
command and dealing with them before running this command again.

Would you like to upgrade the module in the current directory?
  Only 'yes' will be accepted to confirm.

  Enter a value:
```
何も出なければ、正常完了で、既存のコードが修正されます。
エラーが出たら、その修正を行い再度、実行します。


AWS EBSの`gp3`を使用したいがために、`v0.14` 系まで上げるのしんどい。

とほほ。
Laravel カラム追加　外部キーカラムの追加と削除

# はじめに
・カラムを後から追加したい
・外部制約キーをつけたカラムを追加したい

向けの内容となっています

#マイグレーション　外部キーカラムを追加

1.migrationファイルの作成
例) offersテーブルにuser_idカラムを追加したい場合

```php:migration
$ php artisan make:migration add_user_id_to_offers_table --table=offers
```

命名規則は　add_(カラム名)_to_(テーブル名)_table --table=(テーブル名)
でファイル名を作成します

--table=(テーブル名)の部分では、カラムを追加のテーブルを指定して行っています。

``` php:migration
public function up()
{
    Schema::table('offers', function (Blueprint $table) {
      $table->integer('user_id')->unsigned();
      $table->foreign('user_id')->references('id')->on('users')->OnDelete('cascade');
    });
}
```
```
$ php artisan migrate
```

さあ、これでマイグレーションするとカラム作成だ!

```
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
```
と思いきや,うまく外部制約キーのカラムがうまく作成できません。

調べてみると、原因は、「users.idに存在しないデータがoffers.user_idに存在しているから」だそうです。
上記のマイグレーションをしたときはoffersテーブルにはuser_idのカラムが入っていましたが、user_idが0でした。


もともと外部キー制約は
**「参照元フィールドに存在するデータのみ参照先フィールドのデータに存在できる」**
という仕様です。

そもそも,user_idが存在しない場合にoffers.user_idが存在しているのは外部キーの設定ができるはずもありません。

# 解決方法

今回の場合の対策として
1. 整合性の取れないデータはdeleteする
2. usersにデータを追加する
3. offersテーブルのuser_idをnullにする

外部制約のキーでデータが一致しないとエラーになります。

そのときに
`php artisan migrate:refresh`
`php artisan migrate:fresh`
など一旦データを削除してまたmigrateをするとうまくいきますが、問題点として　<br>

`すでにあるデータを削除してしまう`
`毎回、データを削除しないといけない`
などがあります。

本来なら最初にちゃんとテーブル設計したらと思いますが、開発の途中で機能追加するときもこういった場面があるのではないかなと思い記事を書いてみました。

データを挿入するなら
・seedやfactoryを使ってデモデータを挿入する

などのやり方があります。

今回僕がやった方法は, 外部制約キーにnullableを追加して解決しました。

```php:migrate
public function up()
    {
        Schema::table('offers', function (Blueprint $table) {
            $table->integer('user_id')->unsigned()->nullable();
            $table->foreign('user_id')->references('id')->on('users')->OnDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('offers', function (Blueprint $table) {
            $table->dropForeign('offers_user_id_foreign');
        });

        // Schema::table('offers', function (Blueprint $table) {
        //     $table->dropColumn('user_id');
        // });
    }

```

nullable()を追加すれば、migrateがうまくいきます。 
down()のところには外部制約キーを削除できるように
```$table->dropForeign('offers_user_id_foreign');
```

に設定します。

ただ、外部キーをNullにするのはどうかなぁと考えてしまいます。
ここら辺はSQLの知識が必要だなと思っています。


外部キー制約カラムの追加を試している方はぜひ参考にしてみてください。

# 参考

・[Laravel7.x データベース: マイグレーション ](https://readouble.com/laravel/7.x/ja/migrations.html)

・[Laravelで、外部キー制約の処理で SQLSTATE[23000] エラーが出て、マイグレートできません。](https://ja.stackoverflow.com/questions/66169/laravel%e3%81%a7-%e5%a4%96%e9%83%a8%e3%82%ad%e3%83%bc%e5%88%b6%e7%b4%84%e3%81%ae%e5%87%a6%e7%90%86%e3%81%a7-sqlstate23000-%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%8c%e5%87%ba%e3%81%a6-%e3%83%9e%e3%82%a4%e3%82%b0%e3%83%ac%e3%83%bc%e3%83%88%e3%81%a7%e3%81%8d%e3%81%be%e3%81%9b%e3%82%93)
急に「firebase deploy」が上手く行かなかった時の話

昨日、今制作しているWebサイトの動作を確認するために、``firebase deploy``を実行したところ以下のようなエラーが出ました。

>Error: Task 750aaed1c51322d9c96d2b6efc43b4a712c97b958fd8bcc90ce119410b426b4b failed: retries exhausted after 6 attempts

英語は苦手ではないのですが、これは流石に英語力の問題ではない。。。

まぁ、こういう時はエラーメッセージをコピペして検索が一番早いので試したところ、StackOverflowに同じような質問と解決策が提示されていた。

読んでみると、**キャッシュの問題**らしい。

プロジェクトのフォルダーにある``.firebase``にある``hosting.ZGlzdA.cache``を消去すると解決するらしい。

消してみたところ上手く行った！！

時間がかからなくて良かった！！

同じエラーで悩んでいる人もぜひ``hosting.ZGlzdA.cache``を消去して見て下さい。

Thank you for reading
【Rails】ローカル環境でS3の画像投稿ができるのに、Heroku上でS3に切り替わらない問題

# 現象
ローカル環境でうまくS3に画像を保管出来た！！
しかし、Heroku側にマージしてもなぜかHerokuのDB上で画像を保管している。。。
エラーも出ない。。
なぜだろうか。。。

# 原因
今思えば当たり前の話なのですが、、
原因は<font color="Red">本番環境用(Heroku)のファイル</font>にActiveStorageの設定をしていないというものでした。

|種類|環境|設定ファイル|
|:---|:---|:--|
|開発環境|ローカル環境|development.rb|
|本番環境|Heroku|<font color="Red">production.rb</font>（⇦こっちに設定入れてなかった）|
*****　同じミスをしないように手順を残しておきます　*****




# ローカル環境での設定（※aws側の設定は割愛）

<h3>①S3を使用するために必要なGemfileを導入</h3>

```Gemfile.
gem "aws-sdk-s3", require: false
```

<h3>②追記したら、ターミナルにて開発中のアプリに入り「bundle install」を実行</h3>

```ターミナル.	
% bundle install
```
<h3>③development.rbとstorage.ymlファイルも更新</h3>

```config/environments/development.rb

# S3にて保存されるように設定を変更
# config.active_storage.service = :local
config.active_storage.service = :amazon
```

```config/storage.yml
# S3の設定を追記
amazon:
  service: S3
  region : ap-southeast-1  # リージョンをaws側で確認して記載
  bucket : furimabucket    # バケット名をaws側で確認して記載
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %> 
  secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
```
<h3>④環境変数の追記</h3>
③のstorage.ymlにて「AWS_ACCESS_KEY_ID」「AWS_SECRET_ACCESS_KEY」を設定しているので開発中のアプリにて環境変数を追記。

```ターミナル.	
% vim ~/.zshrc
```
「i」で編集モードにして２つの変数を登録

```ターミナル.	
export AWS_ACCESS_KEY_ID="Access key IDの値"
export AWS_SECRET_ACCESS_KEY="Secret access keyの値"
```
編集が終わったら、[ESC]→:wqで終了
続いて、環境変数の設定ファイルを読み込み直す

```ターミナル.	
% source ~/.zshrc
```

<h3>これで、ローカル環境でS3の画像投稿ができた!!!!!!:relaxed:<Br>
以降は、本番環境（Heroku）への反映手順となります。:writing_hand:</h3>

# 本番環境（Heroku）への反映

①まずは忘れずに<font color="Red">production.rb</font>の更新:point_up:
**storage.yml**は特に変更なし。

```config/environments/production.rb

# 本番環境でもS3にて保存されるように設定
config.active_storage.service = :amazon
```
②ターミナルにてHerokuにログイン

```ターミナル.	
% heroku login --interactive
```

③本番環境でも環境変数を設定
環境変数を確認したい場合は「% heroku config」

```ターミナル.	
% heroku config:set AWS_ACCESS_KEY_ID="Access key IDの値"
% heroku config:set AWS_SECRET_ACCESS_KEY="Secret access keyの値"
```

④あとはコミットして完了

```ターミナル.	
% git add .
% git commit -m "ストレージの変更（S3）"
% git push heroku master
```


<h3>:sparkles::sparkles::sparkles::sparkles:お疲れ様でした。:sparkles::sparkles::sparkles::sparkles:</h3>
【Laravel】.envファイルの値を確認する方法。env関数の使い方と注意点。

Laravelで.envファイルに記述した値が反映されているのか確認する方法について。


##envヘルパ関数
Laravelにデフォルトで用意されている関数。.envファイルの指定した値を呼び出せる。

・`env('環境変数名', 'デフォルト値')`

- 環境変数がnullの場合にデフォルト値が表示される。
- デフォルト値はなくてもいい。

値がきちんと読み込まれているか確認するにはデフォルト値を設定しておく方がわかりやすい。


**▼記述例**

```php:
env('DB_CONNECTION')

env('DB_CONNECTION', 'default')
```

<br>
##確認手順
実際にブラウザに表示してみる。

###1. ビューの作成
rousources > views > env.blade.php

テストとして、DBに関する３つの環境変数を表示してみる。

```php:env.blade.php
<p>{{ env('DB_CONNECTION', 'default')}}</p>
<p>{{ env('DB_HOST', 'default')}}</p>
<p>{{ env('DB_PORT', 'default') }}</p>
```

<br>
**▼（補足）対象のデータ**

```:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
```


###2. ルーティング
routes > web.php

```php:web.php
//env
Route::get('env', function () {
    return view('env');
});
```


###3. ブラウザに表示

```:ターミナル
#サーバー起動
php artisan serve
```

http://127.0.0.1:8000/env　にアクセス

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/8b1f4f3d-52ce-af92-d786-e881d238e79d.png)|
|:--|

環境変数の値が読み込まれていることが確認できた。


<br>
##表示されない場合の対処法
キャッシュが読み込まれてしまい、.envファイルが読み込まれない場合がある。

以下コマンドでキャッシュをクリアする。

・`$ php artisan config:clear`



|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/18833e5b-eb04-3cc5-ad4e-aa497f49a934.png)|
|:--|

　　↓

```:ターミナル
$ php artisan config:clear
Configuration cache cleared!
```

　　↓

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/8b1f4f3d-52ce-af92-d786-e881d238e79d.png)|
|:--|



<br>
##ローカル環境で実行してはいけないコマンド
`php artisan config:cache`を実行すると、`.env`ファイルを読み込みに行かなくなる。

すべての値が.envがきちんと記述されているのに、ブラウザの表示がnull（上記設定ではdefault）になる場合は、このコマンドが実行された可能性がある。


###`php artisan config:cache`とは？
本番環境用のコマンドで、すべての設定ファイルを一つにまとめることで高速化するためのコマンド。

設定が頻繁に変わる開発環境では推奨されていない。

また、実行すると、キャッシュが作成され、.envファイルを読み込みに行かなくなる点も注意が必要。

```
$ php artisan config:cache
Configuration cache cleared!
```

[Laravel公式 設定キャッシュ](https://readouble.com/laravel/5.5/ja/configuration.html)
Big Sur 11.1でGoogle File Streamが動作しない場合の対処法

# 環境
MacOS Big Sur 11.1
Mac mini (2018)

# 発生した問題
* Google File Streamのアプリ自体はインストール済み
* 起動してもGoogleの認証画面が表示されない状態

# 色々試した
* 終了→起動しても症状変わらず
* プロセスすべてkillしてから起動しても症状変わらず
* OSの再起動を行っても症状変わらず
* なんとなく機能拡張らへんのパーミッションが問題なんじゃないだろうかと思ってシステム設定 > セキュリティとプライバシーにてフルディスクアクセスとかをGoogle File Streamに許可したけどダメだった

# Googleで調べた
* googleのフォーラムで同様の問題が発生している人が多数いた。
* M1チップ搭載マシンでも同じ問題が発生しているらしい
* Googleも認識しているがまだ解消したバージョンは出てないらしい
* が！！解決方法があった（以下参照

# 解決した方法（あくまで私の場合）
* フォーラムに以下のコマンドやってみれというのがあったので試しに実行してみた。（なるほどね、改めてkextloadしてやると）

```
sudo kextload "/Applications/Google Drive File Stream.app/Contents/MacOS/dfsfuse.kext"
```

* 実行すると機能拡張の許可をするかどうかのダイアログが表示された（スクショ撮り忘れ）ので、許可。
* そして再起動（BigSurはこの機能拡張許可による再起動がかなり多いのでとても面倒）
* 無事にGoogle File Stream起動、ログイン画面が表示された
Cloud9でno space left on deviceが出た時の対応

## EC2インスタンスの再起動
まずはCloud9が動いているEC2インスタンスを再起動。
結果変わらず。

## エラーの原因
- ディスク容量を使い果たした
- inode の枯渇

のどちらか

## 問題の特定
### ディスク容量を使い果たした
```zsh
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        483M   60K  483M   1% /dev
tmpfs           493M     0  493M   0% /dev/shm
/dev/xvda1      9.8G  9.6G   68M 100% /
```
100%って書いてあるのでたぶんこれが原因。

### inodeの枯渇
> inode とは、ファイルのサイズとか、更新日時とか、属性情報が書かれたデータのことで、実ファイルとは別に存在している。このデータ領域がなくなることを「 inode の枯渇」と呼ぶ

```
$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
devtmpfs       123467    434 123033    1% /dev
tmpfs          126142      1 126141    1% /dev/shm
/dev/xvda1     655360 427041 228319   66% /
```
こっちは66%だから大丈夫そう。やはり原因はディスク容量

## どこが重いのか確認
ディスク容量を使い果たしているとのことなので、データを削除すればたぶん解決する。
削除の前にどこが重いのかを確認してみる。

```zsh
$ sudo du -sh /*
7.1M    /bin
72M     /boot
4.0K    /cgroup
60K     /dev
12M     /etc
2.1G    /home
209M    /lib
21M     /lib64
4.0K    /local
16K     /lost+found
4.0K    /media
4.0K    /mnt
12K     /nvm-install.txt
896M    /opt
du: cannot access ‘/proc/5597/task/5597/fd/4’: No such file or directory
du: cannot access ‘/proc/5597/task/5597/fdinfo/4’: No such file or directory
du: cannot access ‘/proc/5597/fd/4’: No such file or directory
du: cannot access ‘/proc/5597/fdinfo
/4’: No such file or directory
0       /proc
51M     /root
16K     /run
14M     /sbin
4.0K    /selinux
4.0K    /srv
0       /sys
96M     /tmp
2.9G    /usr
3.3G    /var
```

重いのは`home`、`usr`、`var`の3つ。
このうち`usr`と`var`はデフォルトでこれくらい重いっぽいので(新たにCloud9の環境を作って確認した)、`homes`内のファイルを削除していく。

## ファイルの削除
- `homes/environment`内に自分が作ったアプリがあるので、不要になったアプリを削除。
- 削除しないアプリに関しても、キャッシュは一旦`$ rails tmp:cache:clear`で削除。

これでとりあえず解決しました。

## その他
今回はファイルを削除して対応したけど、Cloud9の容量を増やして解決する方法もある。
なんかお金かかりそうだからなるべくやりたくないけど、いよいよ容量が足りなくなったらその方法しかなさそう。

## 参考
- [cloud9でno space left on deviceが出た時の対応](ps://zenn.dev/d0ne1s/scraps/2a83c362d097c0)
- [ディスク空き容量が不足してきた件 | そう備忘録](https://www.souichi.club/aws/out-of-disk-space/)
- [No space left on device エラーの原因 | AgoHack](https://agohack.com/no-space-left-on-device-error/)
【Ruby on Rails】yarn install --check-files

## 導入
Rails環境で、node_moduleをインストールしたら発生したエラー。

```shell
========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).

 
yarn check v1.22.5
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.
```

## 解決方法
このエラーは、package.jsonにあるパッケージコンテンツのバージョンとハッシュ値がyarn.lockに記載されているものと**一致しない場合**に表示される。
つまり、package.jsonとyarn.lockに記載しているもののバージョンを一致させれば良い。
※ [公式：コマンドリファレンス](https://classic.yarnpkg.com/en/docs/cli/check/#toc-yarn-check-integrity)

### 1. `yarn upgrade` を実行

```shell
# package.jsonで指定されたバージョン範囲に基づいて、依存関係を最新バージョンに更新。
$ yarn upgrade
```

### 2. package.jsonとyarn.lockを比較して、バージョンが一致しているかを確認
package.jsonとyarn.lockを比較すると、

- package.jsonでは、2.X.Xをダウンロードするように指定（当時、2.7.3が最新版）
- yarn.lockでは、package.jsonで`^2.7.3`と指定されているので、2.9.4をダウンロードしている。

※ 参考：[package.json：リファレンス](https://docs.npmjs.com/cli/v6/configuring-npm/package-json#dependencies)

```package.json
  "dependencies": {
    "chart.js": "^2.7.3"
  }
```

```yarn.lock
chart.js@^2.7.3:
  version "2.9.4"
  resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684"
  integrity sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==
  dependencies:
    chartjs-color "^2.1.0"
    moment "^2.10.2"
```

したがって、package.jsonのバージョン指定をyarn.lockのものと同様にする。

```shell
$ yarn upgrade chart.js@^2.9.4
```

```Diff
  "dependencies": {
-    "chart.js": "^2.7.3"
+    "chart.js": "^2.9.4"
  }
```

### 3. Railsを起動してみる

```shell
$ rails s
=> Booting Puma
=> Rails 6.X.X application starting in development
=> Run `rails server --help` for more startup options
[1] Puma starting in cluster mode...
[1] * Version 4.3.7 (ruby 2.X.X-p137), codename: Mysterious Traveller
[1] * Min threads: 5, max threads: 5
[1] * Environment: development
[1] * Process workers: 1
[1] * Preloading application
[1] * Listening on tcp://0.0.0.0:3000
[1] Use Ctrl-C to stop
[1] - Worker 0 (pid: 81) booted, phase: 0
```

### 4. Docker環境の場合
なぜ、解決出来たのかわからないが、Dockerを使用している場合
上記の方法でも解決出来なかったが、Dockerプロセスを削除し、再ビルドしたら解決する場合もあった。

```shell
$ docker rm (docker ps -q -a) # コンテナの全削除
$ docker-compose up
```

## 参考
[Yarn：公式サイト](https://classic.yarnpkg.com/en/)
Elixirのモジュール属性定義でパターンマッチがしたかったけどできなくて泣いちゃった

## 発端

プログラミングElixir 7章の練習問題でシーザー暗号を作る際に、モジュールで`'a'`と`'z'`の数値を定義しておきたかったので、パターンマッチしてくれねぇかなとおもったけど出来ませんでした

環境は以下

```
$ elixir -v
Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Elixir 1.11.2 (compiled with Erlang/OTP 23)
```

## 理想

```elixir
defmodule MyModule do
  [@a_val, @z_val] 'az'
end
```

ざんねんながらNG泣いちゃった。


```
** (SyntaxError) practice7/caesar.exs:4:20: syntax error before: "az"
    (elixir 1.11.2) lib/kernel/parallel_compiler.ex:315: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/7
```

## 最終的にこの形になりました

```elixir
defmodule MyModule do
  @a_val Enum.at('a', 0)
  @z_val Enum.at('z', 0)
end
```

動けばOKではありますけど、気持ち悪いので何か良い書き方とかあったらコメントいただけると嬉しいです
早く書き始めたい

Rangerがとても便利だったので，主にそれの紹介です．
私がファイルに書き始めるまでをその時系列に沿って説明します．

## 1. [Ranger](https://github.com/ranger/range)

- 1.1 **直接ファイルを開く場合**．コマンドは``l``です．``l``にはnvimが登録されています．
- 1.2 **作業ディレクトリを開く場合** ``S``で移動した後に``$nvim hoge.txt``とファイルを開くこともあります．その場合，以下の操作はいりません．
- 1.3 **Gvim(nvim-qtなど)の場合** [ranger-vim](https://github.com/francoiscabrol/ranger.vim)を使用して，1.1と同様にファイルを開きます．

## 2. 作業ディレクトリの移動(1.1, 1.3)
1.1, 1.3の場合vim内の作業ディレクトリを移動する必要があります．自作コマンド``:CD``(以下)を実行します．

```vim:init.vim
    " define current directory {{{
    " 参考: https://vim-jp.org/vim-users-jp/2009/09/08/Hack-69.html
    command! -nargs=? -complete=dir CD  call s:ChangeCurrentDir('<args>')
    function! s:ChangeCurrentDir(directory)
        if a:directory == ''
            lcd %:p:h
        else
            execute 'lcd' . a:directory
        endif

        if exists("g:NERDTree")
            exe "normal \<Plug>NerdTreeCWD"
        endif
    endfunction
    " }}}
```
MacbookでThinkPadキーボードを使用する際の設定メモ 

# これは何

MacbookでThinkPadのキーボードを使用する際に、「Alt-\`」で入力ソースの切替ができるようにしたかったので、Command-Space」の設定を活かしつつ、「Alt-\`」でも切り替えられるように設定しました。

一つの操作にたしいて複数のショートカットを設定することができなかったので、

1. 「前の入力ソースを選択」を「Command-Space」
2. 「入力メニューの次のソースを選択」を「Alt-`」

にそれぞれ割りあてました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191337/e0720f64-ed88-1c37-ddb0-dbe017b95331.png)


私の場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191337/c4bb3e54-8b5a-1b5b-8485-964935a7a22e.png)

と、入力ソースは２つなので問題ありませんが三つ以上の入力ソースを設定していると、手間が増えますね。


## Macの環境など

1. MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
1. macOS Big Sur バージョン 11.1（20C69）
2. Karabiner-Elements v13.1.0


## 設定内容
### Karabinar
左Altキー(Left option)を、Commandキー(Left Command)に

#### 手順



### Mac側
入力ソースの「入力メニューの次のソースを選択」のショートカットキーを「Command-`」に変更

#### 手順
1. システム環境設定->キーボード->ショートカット
2. 「入力メニューの次のソースを選択」のショートカットキーを「Command-`」に変更

## karabiner設定メモ

Karabinerのインストール後、

![スクリーンショット 2021-01-19 11.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191337/7a72127c-db84-1d67-eb68-bde0c21c375b.png)

と、入力監視とフルディスクアクセスに関する画面が表示されるのですが、入力監視の項目に
karabiner_grabberがありませんでしたので、パスを指定して追加する必要がありました。

karabiner_grabber、karabiner_observerとも以下の場所にありますので、+ボタンから追加します。

```sh
/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli
```