OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase Dynamic Links について

# はじめに

Firebase Dynamic Links で Android の Deeplink を実装することになったので、そのメモとして残しておきます。

# Android プロジェクトに Firebase を追加する

公式に手順がまとめられているの
https://firebase.google.com/docs/android/setup?hl=ja

※ SHA-1 情報は Firebase Dynamic Links で必要になるため忘れないようにする。さらに App Links を利用する場合は、 SHA-256 情報も必要になる。
※ ディープリンク URL は有効な URL でなければならない。

# google-services.json をダウンロードして設定
```
app
└── src
    ├── main
    │   ├── AndroidManifest.xml
    │   ├── java
    │   └── res
    ├── dev
    │   └── google-servicesjson.json
    ├── stg
    │   └── google-services.json
    └── prd
       └── google-services.json
```

# DynamicLinks の設定

コンソール上で作成する

or

手動で以下のようにする

```
{DynamicLinksのURL}/
?link={http(s)://で始まるリンク、主にアプリ用のURLエンコード済みのDeepLinkURL}
&apn={Androidアプリパッケージ名}
&ibi={iOSアプリバンドルID}
&isi={iOSアプリストアID}
&ius={iOSアプリをフックするカスタムスキーム}
&dfl={デスクトップ用リンク}
```

※ クエリパラメータを使う場合には基本的には後者を利用する

詳しくは以下をご覧ください
https://firebase.google.com/docs/dynamic-links/create-manually

# Android で Firebase Dynamic Links を受信する
https://firebase.google.com/docs/dynamic-links/android/receive?hl=ja#kotlin+ktx

# おわりに

まだ、きちんとした実装に入っていないため、追記＋修正すると思います :sunglasses:
「 $i = $i++;」が使えないことを知った話

※自分用メモです
#はじまり
事の始まりは、実行すると無限ループするfor文から。
内容としては
1.要素数「4」の配列に、乱数(0～9)を利用して値を格納する。
2.格納した内容はループを利用して出力する。
の簡単なものだ。
終了条件がおかしくなっているように思うのでそこを見てみた。この1行である。
`    for($i=0; $i<=3; $i=$i++)`

全くわからなくてTwitter上でアドバイスを求めたところ、一人の先輩からこんなアドバイスをいただいた。
「`$i=$i++`は`$i++`でいいよ」

#なぜ
上のアドバイスと一緒に、理由も書いてくれているページを教えてもらった。
[なぜ i = i++; としてはいけないか](https://blog.cles.jp/item/6362) 
ここを読んで自分なりに考えた結果、以下のような解釈に至った。
(注:コメントで正確な話を教えていただきました!ありがとうございます!)

 (「;」といういわゆる副作用完了点という存在を知った前提で)
一度に、
1. iへの代入をしようとした
2. i+1をしようとした
    つまり、「iという変数を１つの副作用完了点と副作用完了点の間で2回書き換えようとしたこと」が原因だと解釈した。
    つまり、PHPに限らずある副作用完了点から、その次の副作用完了点までの間で1つの変数を複数回書き換えるような動作は認められていないために、ほかの言語でこれ(\$i=$i++)をやってもアウトだと考えた。
SCSSの始め方

ここの内容はちょっと古いので、最新版はこちらをご参照ください。

https://anteku.jp/blog/develop/sass%e3%81%ae%e5%a7%8b%e3%82%81%e6%96%b92022%e5%b9%b4%e7%89%88/

昔はこんなんだったなー、と懐かしむ目的で残しておきます！

# はじめに

いつの間にか「アンテク技術ブログ」が公開されていたので、ﾎｴｰ、っと眺めていたら、 [cssの拡張言語scssが面白くて便利だった(初級編)](https://anteku.jp/blog/develop/scss1/) という記事がありまして、SCSSへの感動が溢れかえっており心を打たれたんですけど、はじめ方が割愛されていたので、せっかくだからワイが書くかと補足記事的に書くことにしました。

# SCSSって何？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57811/8e3605a5-cc0a-728f-0556-8f75c02d4354.png)

もともとは中括弧大嫌いなRuby界隈で爆誕した「**インデント構文で書けるCSS**」である、Sassというスタイルシート言語の拡張版です。セレクタをネストさせて書けたり、変数が使えたり、mix-inという機能で関数的に記述を使いまわせたり、それは大変便利なものなのでした。（どう便利なのかは [cssの拡張言語scssが面白くて便利だった(初級編)](https://anteku.jp/blog/develop/scss1/) を読んでください）

Sass自体はこれまたインデント記法で書けるHTMLテンプレート構文であるHamlの相棒みたいなもんです。（更にそれのJavascript版が謎にアンチの多いCoffeeScriptですね）
要はもともとは **そうまでして死んでもブロック構文書きたくない** というお気持ちが爆発している人たちのものでした。彼らの気持ちは大変よくわかります。。。

ですが、いかんせん **インデント記法が非プログラマには敷居が高すぎる** ということでSCSSが生まれました。というか、Sass側がライバル的なスタイルシート言語 **LESS** の構文をガツッとパクってきただけ、というのはあるのですが、これと **Compass** というCSSフレームワークの台頭によりSass勢は一気に利用者を増やすことになりました。

Compassが流行ったのはIEとFirefoxとSafariとChromeとOperaでそれぞれCSSの記述方法が微妙に違う（ベンダープレフィックスを付けないといけない）という地獄の時代があったからです。それについてはこちらの記事を読むといいでしょう。 **今はベンダープレフィックスはいらないです。**
[CSSが超絶便利になる！Compassについてまとめてみた](https://qiita.com/masamitsu-konya/items/8ae3ed489aef1388814a)

# 始め方は2つある

Ruby on Rails以外ではSCSSはコンパイル（やってることはトランスパイルなんだけど）しないとCSSとして使えないので、そのコンパイラというのを入れるわけですが、実装はいくつかあるわけなのです。今回はよく使われているであろう2種類を紹介します。

* Rubyの`sass`というgemを使う
* Node.jsの`node-sass`というパッケージを使う

## Rubyの`sass`というgemを使う

RubyはMacだと最初からインストールされているのですが、Windowsだと自分で頑張ってインストールする必要があります。
https://www.ruby-lang.org/ja/downloads/

そしたらこのコマンドをターミナルで実行したら `sass` コマンドが使えるようになっています。
参考: https://rubygems.org/gems/sass

```
$ gem install sass
```

インストールできたら、ターミナルで以下のコマンドを実行するとSCSSをCSSに変換できるようになっているはずです。

```
$ sass [input.scss] [output.css]
```

細かいコマンドの使い方はこちらをご参照ください。
[Ruby Sass Command-Line Interface](https://sass-lang.com/documentation/cli/ruby-sass)

watchオプションとかは変更を自動検出してコンパイルしてくれるので便利ですよ！

## Node.jsの`node-sass`というパッケージを使う

Node.jsはMacでもWindowsでもインストールしないといけません。
まあ、でも難しくはないのでここからダウンロードしてきましょう。
https://nodejs.org/ja/download/

そしたらこのコマンドをターミナルで実行したら `node-sass` コマンドが使えるようになっています。
参考: https://www.npmjs.com/package/node-sass

```
$ npm install -g node-sass
```

インストールできたら、ターミナルで以下のコマンドを実行するとSCSSをCSSに変換できるようになっているはずです。

```
$ node-sass [input.scss] [output.css]
```

細かいコマンドの使い方はこちらをご参照ください。
[Command Line Interface](https://github.com/sass/node-sass#command-line-interface)

watchオプションとかは変更を自動検出してコンパイルしてくれるので便利ですよ！（デジャヴュ）

# エディタ側

エディタ側は色々あるのですが、PhpStormを入れれば特になんにもしなくても使えるので買うのが一番早く、生産性が高いと思われます。PHP使わないならお安い版のWebSrormというのもあるのでぜひご検討ください！
https://www.jetbrains.com/ja-jp/phpstorm/
https://www.jetbrains.com/ja-jp/webstorm/

VSCodeだと「Live Sass Compiler」というプラグイン入れたらそれで終わりのようですね。これ入れたらさっきのgem入れたりnode module入れたりすらいらなさそう。。。
[VS CodeでScssを書くための環境構築方法](https://webdesign-trends.net/entry/9295)
Unity 3D入門 #10 [Skyboxの非表示 &円形のゲージ実装]

unityの地平線が少し明るくなっていることが気になるので、プレイヤーが持つ懐中電灯以外の光源を全て消したいと思います。

<img width="606" alt="スクリーンショット 2020-07-29 23.07.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/7603f391-d7b4-2f94-d54c-15e627b01a4b.png">

unityでは広大に広がる世界を見せるために画面全体をskyboxというラッパーで覆われています。そのため、地平線にはskyboxがあり、それが夕暮れのような地平線を演出しています。

http://ws.cis.sojo-u.ac.jp/~izumi/Unity_Documentation_jp/Documentation/Manual/Cameras.html のクリアフラグの項目を見ればわかりますが、デフォルトの設定ではスクリーン上の描き残された部分はskyboxが表示されるようになっています。

そのため、メインカメラのClear Flagsの設定をSkyboxからSolid Colorに変更し、BackGroundを黒色にします。
<img width="376" alt="スクリーンショット 2020-07-29 23.10.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/86d32351-05d6-72a9-0115-dc48cce03113.png">

これで、地平線が真っ暗になりました。

また、ドアのロックを解除する時などに利用する円形のゲージの作成を行います。
参考URL：https://clrmemory.com/programming/unity/circle-gauge-meter-p1/

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/7f7ae990-4083-1587-9f12-e3c3792b83b5.png)
![gauge2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/bf87cc03-cb68-99bd-5a13-7b7a6b586d94.png)

上の画像を用いてゲージを作成します。（qiita上ではうまく表示されませんが、１枚目はダウンロードすると透過背景に白いドーナツ状の円の画像となっています）

UI->Imageのsource imageに作ったpngファイルが入らない場合は、そのpngファイルのTexture TypeをSprite(2D and UI)に変更してください。
参考URL：https://teratail.com/questions/98383

また、スクリプトでUI->Imageを取得したい場合(参考URL：http://chnr.hatenablog.com/entry/2015/03/17/130223)

```
private Image gauge;
void Start(){
    gauge = GameObject.Find("gauge").GetComponent<Image>();
}
```

今回の進捗GIF
![ezgif-7-386be090408b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670403/82961350-8760-8b38-44d2-1a47b419f758.gif)
やっとIBM iにもmanページが来ましたよ！

# やっとIBM iにもmanページが来ましたよ！
@kadler_ibm さんがmanページをついに、**IBM i**でも使える様にしてくれたようです。
[Just shipped man-db on #IBMi!...](https://twitter.com/kadler_ibm/status/1288508021073743877)
早速インストールしましょう！

```sh
> yum install -y man-db
---インストール---

> man git
GIT(1)                                                Git Manual                                                GIT(1)

NAME
       git - the stupid content tracker

SYNOPSIS
       git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

DESCRIPTION
       Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides
       both high-level operations and full access to internals.

       See gittutorial(7) to get started, then see Everyday Git[1] for a useful minimum set of commands. The Git
       User’s Manual[2] has a more in-depth introduction.

       After you mastered the basic concepts, you can come back to this page to learn what commands Git offers. You
       can learn more about individual Git commands with "git help command". gitcli(7) manual page gives you an
       overview of the command-line command syntax.

       Formatted and hyperlinked version of the latest Git documentation can be viewed at
       http://git-htmldocs.googlecode.com/git/git.html.

OPTIONS
       --version
           Prints the Git suite version that the git program came from.

       --help
           Prints the synopsis and a list of the most commonly used commands. If the option --all or -a is given then
           all available commands are printed. If a Git comm
```
JavaScriptで、配列・連想配列から要素を削除する時に使える文法！

# はじめに
こんにちは！プログラミング初心者なのですが、今日は、初めてQiitaに記事を投稿します。
現在、ReactでToDoListアプリケーションの作成に挑戦しているのですが、今日はその途中で、配列の要素の削除に関してプチ「アハ体験」をしたので、備忘録も兼ねて投稿します！

# 一般的な配列から要素を削除する方法
JavaScriptの入門書等によく書いてある、要素の削除方法は次の2つ。
<ol><li>pop()
配列の末尾の要素を取得し、削除する。</li>
<li>shift()
配列の先頭の要素を取得し、削除する。</li></ol>

<ol><li>pop()</li>

```JavaScript:sample.js
let arry = ["a", "b", "c", "d", "e"];
let poppedArry = arry.pop();

console.log(arry); // ["a", "b", "c", "d"]
console.log(poppedArry); // e
```
上記のように、配列の末尾にある要素、今回の例では「e」を取得してきて、それを変数poppedArryに格納し、元の配列arryからは、「e」が削除されています。

<li>shift()</li>

```JavaScript:sample.js
let arry2 = ["あ", "い", "う",  "え", "お"];
let shiftedArry2 = arry2.shift();

console.log(arry2); // ["い", "う", "え", "お"]
console.log(shiftedArry2); // あ
```
上記のように、配列の先頭にある要素、今回の例では「あ」を取得してきて、それを変数shiftedArry2に格納し、元の配列arry2からは、「あ」が削除されています。

# 本来は削除のための文法ではないけど削除できる文法その1! 
```JavaScript:sample.js
let arry3 = [1, 2, 3, 4, 5];
let splicedArry3 = arry3.splice(1,3);

console.log(arry3); // [1, 5]
console.log(splicedArry3); // [2, 3, 4]
```
上記の例では、spliceメソッドを使っています。このspliceメソッドとは、
splice(開始インデックス番号, 開始からn番目, 置き換え1, ...置き換えn);
のように、要素を置き換える働きを主にします。
しかし、上記の例にあるように、**開始インデックス番号と開始からn番目の2つのみ**を指定し、置き換える要素を指定しなければ、それらの指定された区間(開始~n番)の要素が削除されるのです！

# 本来は削除のための文法ではないけど削除できる文法その2! 
```JavaScript:sample.js
let arry4 = [
{ id: 1, title: "絵本"},
{ id: 2, title: "小説"},
{ id: 3, title: "参考書" }
]
let filteredArry4 = arry4.filter(arry4 =>
    arry4.id !== 2);

console.log(filteredArry4); 
/* 
{id: 1, title: "絵本"}
{id: 3, title: "参考書"}
*/
console.log(arry4); 
/* 
{id: 1, title: "絵本"}
{id: 2, title: "小説"}
{id: 3, title: "参考書"}*/
```
上記の例では、filterメソッドを使っています。このfilterメソッドとは、
filter(function(value, index, array){
return 条件
});
のように、条件に合った要素で新たに配列を形成する働きを主にします。
しかし、上記の例にあるように、「連想配列のidが2ではない」を条件として、その条件に
合う要素を、変数filteredArry4に**条件に合う要素のみを集めた新しい配列**として格納します。元の配列arry4を見てみると、こちらでは、削除は実行されず、元のままです。

# まとめ
JavaScriptで、配列・連想配列から要素を削除する時に使える文法には、
<ul><li>pop()</li>
<li>shift()</li>
<li>spliceメソッド</li>
<li>filterメソッド</li></ul>
の4つがあります！<br>
個人開発などにおいて、配列や連想配列から要素を削除する機能を付けたいということが多々あると思います。そんな時に、通常のpop()やshift()だけでなく、spliceメソッドやfilterメソッドを選択肢に入れてみてください！
拙い投稿ですが、最後まで読んでくださり、ありがとうございます！

# 参考文献
山田祥寛著 『改訂新版 JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで』(2018)
※第1刷は、2016年。
VercelにデプロイしたNextアプリからSendGridを使ってメールを送信する

# はじめに
JavaScript界隈ではすっかり地位を確立したJAMSTACK。

**僕も大好きです。**

最近の休日は、ほぼ全てJAMSTACK開発に費やしています。
静的ホスティングサービスはコストパフォーマンスに優れたものも多く、ブログや簡単なショッピングサイトなどをJAMSTACKでサクッと作ってしまうことで得られるメリットも多いと思います。

**ブログやショッピングサイトにはメールが必須ですよね。**

とはいえ、まだまだ参考文献が少ないのが現状です。。
今回は、NextプロジェクトをVercelにデプロイした際に、どのようにSendGridと連携してメールを送信するかを書きたいと思います。

# 前提条件
既に構築済みのNextプロジェクトに組み込むことを想定しているので、以下の環境構築は既に完了済みと想定して話を進めていきます。

* SendGridのアカウント作成（APiキーの作成も完了済み）
* Next.jsの基本的な構築

Vercelへのデプロイは各自に任せます。
メールの送信テストは `npm run dev` でも検証可能です。

# SendGridモジュールのインストール
プロジェクト配下で以下のコマンドを実行して必要なモジュールをインストールします。

```
$ npm i @sendgrid/mail
```

# サーバーレス関数の作成
**静的ホスティングサービスってPOST出来ないんでしょ？**

という意見を耳にすることがありますが、可能です。

Vercelでは任意の関数をサーバレス機能として展開することができ、バックエンドの言語のHTTPリクエストを取得し、応答を提供することができます。

サーバーレス関数を使うことで、ユーザー認証、フォーム送信、データベースクエリ、カスタムSlackコマンドなどを処理することが可能です。

まず `/pages/api` 配下に `send.js` というファイルを作成します。


```send.js
const sgMail = require('@sendgrid/mail')

export default async function(req, res) {
  sgMail.setApiKey('SendGridで作成したAPIキー')

  const { email, message } = req.body

  const content = {
    to: email,
    from: '任意のメールアドレス（実現するもの）',
    subject: 'メールのタイトルです',
    text: message,
    html: `<p>${message}</p>`
  }

  try {
    await sgMail.send(content)
    res.status(200).send('Message sent successfully.')
  } catch (error) {
    console.log('ERROR', error)
    res.status(400).send('Message not sent.')
  }
}

```

これでメールの送信処理の作成が完了しました。

# メールを送信する
あとは任意のファイルの中で作成したサーバーレス関数にPOSTするだけでメールが送信できます。
必要に応じて `async/await` などの非同期処理を行ってください。

```index.js
import fetch from 'node-fetch';

fetch('/api/send', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        email: 'test@exsample.com'
        message: 'Test mail.'
      })
    })
```

# 最後に
まだまだ開発が活発に行われており、変化に柔軟に対応していかなければならないNext.jsですが、本当に面白い技術なので、皆さんも是非触ってみてください。

この記事が、不安や懸念を振り払うお手伝いになれたら幸いです。

### 参考文献
[Create and Deploy a SendGrid-Powered Next.js and Node.js Contact Form with ZEIT Now](https://docs-git-success-185-add-nextjs-sengrid-guide.zeit.now.sh/guides/deploying-nextjs-nodejs-and-sendgrid-with-zeit-now)
[AWS] NLB経由でFTP接続する際の注意点

# 内容
* AWSにおいて、ロードバランサー配下のEC2でFTPサーバを稼働させて外部からFTP接続する際の注意点
* FTPはパッシブモード、暗号化方式はexplicit(明示的)モードを使用する
* FTPサーバは、vsftpdを使用する

# 構成
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/8153a704-9364-7a07-40be-11ff058b3845.png)

# こうしたかった理由
* EC2はウェブサーバとして使用していて、ACMを使用してサーバ証明書を安価に使用したかった（ACMはEC2には使えない）
* NLBをかますことで、EC2に外部IPアドレスを付与させないようにしたかった

# NLBの設定
1. リスナーの追加
 制御ポート：21(TCP)
 データ転送用ポート：60001(TCP)
 データ転送用ポート：60002(TCP)
 データ転送用ポート：60003(TCP)

2. ターゲットグループの追加
　1．で設定したリスナーに対して、バックエンドのEC2に繋ぐようにそれぞれターゲットグループを作成する

# セキュリティグループの設定
セキュリティグループを追加して、EC2インスタンスに設定する。

|タイプ|プロトコル|ポート範囲|ソース|
|---|---|---|---|
|カスタムTCP|TCP|21|外部から接続してくるユーザのグローバルIPアドレス|
|カスタムTCP|TCP|60001-60002|外部から接続してくるユーザのグローバルIPアドレス|

# EC2の設定
* vsftpdをインストールする

```
sudo yum install vsftpd
sudo systemctl enable vsftpd.service
sudo systemctl start vsftpd.service
```

* vsftpdの設定をする

```
sudo vim /etc/vsftpd/vsftpd.conf
```

```
listen=YES
listen_ipv6=NO

ssl_enable=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES

pasv_enable=YES
pasv_min_port=60001
pasv_max_port=60003
pasv_addr_resolve=YES
pasv_address=<NLB DNSホスト名 or NLBのAレコードを設定したホスト名>
tcp_wrappers=NO
```

* ***vsftpdの起動スクリプトを修正する（注意点）***

このままでも動作するが、EC2を再起動した際にvsftpdが自動起動に失敗する事象が発生した。

```
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2020-07-30 03:50:54 UTC; 58s ago
  Process: 787 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=2)

Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: Starting Vsftpd ftp daemon...
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal vsftpd[787]: 500 OOPS: cannot resolve host:corpweb.common.hk-test.net
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: vsftpd.service: Control process exited, code=exited status=2
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: vsftpd.service: Failed with result 'exit-code'.
Jul 30 03:50:54 ip-10-221-233-5.ap-northeast-1.compute.internal systemd[1]: Failed to start Vsftpd ftp daemon.
```

pasv_address に登録したホスト名の名前解決ができていないのが原因らしい。
サービスの起動順序では、networkサービスの起動後にvsftpdが起動するように設定されているが、それでも名前解決に失敗する。
何かしらのサービスの起動順序に依存しているのだろうと思うが、そのサービスを特定できなかった。
しかたないので、vsftpdの起動スクリプトで一定時間待機（私は30秒にした）させることで、名前解決できるようにした。
もっといい解決策をご存知の方がいれば教えて下さい。

```
sudo  vim /etc/systemd/system/multi-user.target.wants/vsftpd.service
```

```
# ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
ExecStart=/usr/bin/bash -c "sleep 30; /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf"
```

以上。
Railsで開発中にLocalのMySQLのバージョンを8系から5.7に変更したらいろいろハマった

現在Railsでポートフォリオ作成中のたか(@ktkr7195)です。

Sequel Proを使ってDBの情報を参照しようとしたら、MySQL8系だと繋がらない問題に打ち当たり、バージョンを5.7にすれば治るらしいという記事を拝見し、変更したら事件が起きました。

#環境
- Rails 5.2.4
- macOS 10.15.5
- MySQL 5.7
- ruby 2.5.1

#状況
まずHomebrewで`brew install mysql`でMySQLをインストールしてローカルで開発をしていました。おそらく、バージョン指定しないと最新の8系がインストールされます。`rails db:create`や`rails db:migrate`等無事に成功し、アプリケーションが表示されるようになりました。開発を進めていく中でDBを参照することが多くなったのでSequel Proを使おとしたら弾かれてしまい[こちらの記事](https://pqtomblog.com/2018/09/20/connecting_mysql_by_sequelpro/)を参考に修正したら`rails db:migrate`ができなくなったのでMySQLのバージョンを落とすことに。

#手順
①Mac MySQLをきれいにする
まずは[こちら](https://e-joint.jp/639/)の記事を参考にMySQLをきれいにして、インストールし直す。この際自分は[こちら](https://weblabo.oscasierra.net/mysql-57-homebrew-install/)を見て5.7をインストールしました。

②bundle doctorで原因を調べる
[こちら](https://qiita.com/onoblog/items/4d67b3731debffcf6b2d)の記事を参考に。

#感想
自分の場合は上の手順で解決しましたが、ここまで来るのに結構時間を使ってしまったので、同じような境遇の人がいたら参考になれば嬉しいです。

#参考
- https://pqtomblog.com/2018/09/20/connecting_mysql_by_sequelpro/
- https://qiita.com/onoblog/items/4d67b3731debffcf6b2d
- https://qiita.com/renny1398/items/5df494a2b2f5d74b24f4
- https://qiita.com/hayte/items/cea0b7762d3adf096b8b
- https://qiita.com/SatoMaru/items/986aa0a63af28a8b6273
- https://www.takafumitaba.com/mysql-already-exists
- https://weblabo.oscasierra.net/mysql-57-homebrew-install/
ブラネイ・クリドル法の計算方法　―気温データのみで蒸発散量が計算できる？？―

# 移転のお知らせ

こちらの記事は下記のサイトに移転しました。

> [NNテックブログ](https://nnhiroba.xsrv.jp/nnTechBlog/Article/Article?ID=30)
HTTPでrobocopyやrsyncみたいなの！オレトラストネットワークでちゃっちゃとファイル共有Ⅱ

# 前回

[オレトラストネットワークでちゃっちゃとファイル共有](https://qiita.com/ykato/items/0939cbae9ce338a26914)

の続きです。前回の載せたら、

*「Syncthingに似てる気がするけど知ってる？参考になるかもよー見てみたら？？」*

というありがたいレスが。~~知らないので調べてみますわーってレス書いた後で過去にQiitaのSyncthin記事にがっつりLGTM入れてた！~~

# Syncthingつよい

僕のツールのがニッチで良い部分もありつつ見習いたい点が多々出てくる出てくる

- 同期状況とか完了したかどうかサーバー、クライアント両方で見れる
- 接続中のサーバーを見れる
- 全通信をプロトコルで暗号化したり効率化してる
- 同期対象のディレクトリ対応
- 中継SaaS持ってるのでinbound通信を開放しなくていい
- GUI持ってるので操作が分かりやすい
- バックグラウンドで同期してくれる
- 設定が保存できるので前回と同じ同期がやりやすい

洗い出しできたところで、ワイツールも既存のHTTP Proxy挟めるなど利点があるので

- 同期状況とか完了したかどうかサーバー、クライアント両方で見れる
- 接続中のサーバーを見れる
- 同期対象のディレクトリ対応
- 設定が保存できるので前回と同じ同期がやりやすい

これを盛り込んで改良することにした！機能以外にUXも必要だよね、とか勉強になるね！

# Go言語つえー

絞り込んで改良する事にしたーで、4日で実装できた！やっぱGo言語サイコーや！！

[![yasutakatou/doukie2 - GitHub](https://gh-card.dev/repos/yasutakatou/doukie2.svg)](https://github.com/yasutakatou/doukie2)

使い方は[前回記事](https://qiita.com/ykato/items/0939cbae9ce338a26914)やリポジトリを参考にしてほしいですが、

要するに**CUI**で**HTTP(S)**使ってフォルダを同期してくれる君というやつです。
強みとしては**バイナリ**いっこで動くし、**マルチOS**対応だし、、

# 推し

自動同期モードというのが目玉？でして。
マルチキャスト通信で同期先を見つけてくれます！

![autosync.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/ffb61c0a-51dc-f887-87e3-5a9d294ae197.gif)

これで**同期先のIPとポートを調べてみたいな手間なく、ツールを動かせばあとはよしなに同期**してくれます
### やったね！

# いいわけ

前回のツールがよわかったのはスマホ版の実装がうまくいかんかったので、
機能制限かけたってのが大きい。でも、色々弄ってたら今回の機能拡張に追従できるっぽい事が分かってきた。

# 意気込み

続いてスマホ用クライアントもバージョンアップすっぞ！
前回開発みたいにスマホ版にここから数倍の時間がかかりそうだけどここまできたらやるっきゃないっと

## 次号、スマホ用クライアント開発編Ⅱに続く！
Javascript知らない男のGAS 1

#経緯
LINEの機能でトークに投げた内容をLINE keepに保存してくれる機能があります。
これのGoogle Keep版を作りたかった学生の話です。
結果として、Google KeepはGASに対応しておらず、公式APIがないので
Google ドキュメントに保存することになりました。
文字と画像の保存に対応しています。
(動画も画像同様対応可能ですが書いてません。需要があれば解説します。)
コードだけ参照したい方は....
https://github.com/hinawakasonoko/desktop-tutorial/blob/master/Code.gs
コード解説はその2にまとめたので記事下のリンクをどうぞ。
#LINE側の準備
まずはLINEのAPIを使わないとどうしようもないので、LINE Business IDで公式アカウントを作成します。
https://account.line.biz/signup
作成は流れで入力なりボタン押すなりするだけなので割愛。

LINE Developersのサイトで
- messaging APIを有効にする
- Webhook送信をオンにする
- 自動応答メッセージをオフにする
- アクセストークン(ロングターム)を発行する
これらを行えばOKです。取り扱いmessaging APIのタブ探せば間違いないです
アクセストークンはGAS内に入れるのでメモをお忘れなく。

#Google側の準備
https://drive.google.com/drive/u/0/my-drive
一方Google側ではDriveにアクセスし、左上の新規ファイルの作成ボタンを押し、
その他にある、アプリを追加を選びます。
Google Apps Scriptを検索してインストールし、流れのままセットアップすると、先ほどのその他の中にGoogle Apps Scriptが追加されます。
同時に、メモを保存するためのドキュメントも作成しておいてください。
その際、ドキュメントを開いているときのURLの
docs.google.com/document/d/**文字列**/edit の文字列部分もメモしておいてください。GASで使います。



その2ではコードと、LINEで使うための手順を解説します。(qiitaって連続投稿できないんですね....)
その2 https://qiita.com/nuyuyuri/items/3e1e76980c1d8f5c6812
【関数初心者】関数を使って、コピペなしで参照する！(notGASbut関数)


結論(同じスプレッドシート内でシートを超える場合)
---

```javascript:別シートへ
=query("シート名!A2:B","select A, B where A = '検索ワード'")
```
"シート名!A2:B"の部分がオレンジ色になっているか確認する。
されていなければ、範囲（特に:Bの部分）が正しくない可能性がある。（M列までしかないのにZ列まで指定する時などに起こる）


結論（別スプレッドシートから参照する場合）
----
```javascript:別ファイルへ
=query(importrange("スプレッドシートのid", "シート名!A2:B"), "select Col1, Col2 where Col1 = '検索ワード'")
```

※「A列」や「B列」ではなく、「Col1」や「Col2」という表記にすることに注意。
奇数×奇数の魔方陣を作るプログラム

　あるいは、なでしこ３で配列をどうこうしたり、表を作ってみたりする。

# 発端
　なんで突然そういうことになったんだったか覚えてない（汗）
　しかし、折角学んだので、書き記しておく。

# うぃきぺでぃあ先生に教えを請う
> [奇数×奇数の魔方陣の作り方](https://ja.wikipedia.org/wiki/%E9%AD%94%E6%96%B9%E9%99%A3#%E3%83%92%E3%83%B3%E3%82%BA%E3%83%BC%E3%81%AE%E9%80%A3%E7%B6%9A%E6%96%B9%E5%BC%8F)

　**ヒンズーの連続方式**と言うそうです。
　ルールは簡単そう。やってみます。

# 準備（魔方陣用の二次元配列を作る）
　とりあえず一番簡単な３×３の魔方陣を作ることとし、魔方陣用の空配列を用意して、初期化します。
　なでしこ１では配列を宣言しなくても動きましたが、なでしこ３では絶対必要です。

```
　魔方陣＝空配列。価＝０。
　３回
　　魔方陣[回数-1]＝空配列。
　ここまで。
```

# 0,0から数字を置いていく
　うぃきぺでぃあさまの教え通りならば、まずは「上段の中央を1にする」というところなのですが、プログラム的には座標も価も０スタートが分かりやすい。

```
　９回
　　列＝価%３。行＝価/３を切捨。
　　x＝行*-1+列。y＝行*2-列。
```
1. 上段の左端、[0,0]の位置に0を仮置き。
2. 価が１増えるごと、x方向に＋１。y方向へは-1。
　いきなりマイナスですが、気にしません！
　そして、折り返したときの開始位置が重要です。
　ここです。
![魔方陣1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561177/9783ad5e-a454-f5bc-623a-85da510acdff.jpeg)

3. 前回の開始位置より、x方向に-1、y方向に+2の位置になります。
　ここからまた同様にして価を置いて行き、３×３で９回繰り返して全ての数字を置いたらこうなります。
![魔方陣2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561177/90595beb-1a0a-4ca1-7261-585bf1e88af1.jpeg)


# はみ出した数をスライドさせる
```
　　x＝(x+(３/２を切捨)+３)%３。
　　y＝(y+３)%３。
```

##### まず簡単なｙの方から。

1. 全てのｙに３を足す。
　これで、ｙの位置が全て整数になりました。
![魔方陣3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561177/611f4134-4613-d5fa-9b7b-14a2c64e041b.jpeg)

2. それを割った余りがｙの座標と言うことになります。
![魔方陣4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561177/08df5174-2ca9-524d-0fc0-7613d597e230.jpeg)


##### 次にｘです
1. 全てのｘに１を足す。(３/２を切捨)
　これで、0が上段中央に来ました。あとちょっと。

2. 全てのｘに３を足す。
　これで、ｘの位置が全て整数になりました。
![魔方陣5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561177/6368a747-cbe8-bf04-0cdc-51aabca53276.jpeg)

3. それを割った余りがｘの座標と言うことになります。
　できました！
![魔方陣6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561177/906037c9-ca5a-646f-5e88-0af2307b0c2d.jpeg)



# コード
　任意の数で魔方陣を作れるようにする。

```
「魔方陣のサイズ」を尋ねる。数＝それ。
もし、(数の変数型確認)＝「string」ならば、数＝数を半角変換してそれを整数変換。

もし、数%2＝1ならば、　#奇数
　数の奇数次魔方陣作成。
違えば、
　「奇数を入力して下さい」と言う。
ここまで。

●(数の)奇数次魔方陣作成
　魔方陣＝空配列。価＝０。

　# 魔方陣用の二次元配列を作る
　(数)回
　　魔方陣[回数-1]＝空配列。
　ここまで。

　(数*数)回。
　　# 0,0から数字を置いていく
　　列＝価%数。行＝価/数を切捨。
　　x＝行*-1+列。
　　y＝行*2-列。

　　# はみ出した数をスライドさせる
　　x＝(x+(数/2を切捨)+数)%数。
　　y＝(y+数)%数。

　　魔方陣[y][x]＝価＋１。
　　価＝価＋１。
　ここまで。
　魔方陣の表作成。
ここまで。

＃二次元配列でテーブルを作成（タイトルなし）
●(Aの)表作成
　表＝「<table>」
　Aを反復
　　表＝表に「<tr>」を追加。
　　対象を反復
　　　表＝表に「<td>{対象}</td>」を追加。　　
　　ここまで。
　　表＝表に「</tr>」を追加。
　ここまで。
　表＝表に「</table>」を追加。
　表をDOM親要素にHTML設定。
ここまで。
```

# 動作確認
https://n3s.nadesi.com/id.php?278

　実際に作った３＊３の魔方陣と同じになることを確認出来たので、数を７にしてみて、うぃきぺでぃあさまの例と同じになっていることを確認。（価が１からになるように配列へ代入時に１を足しています）

# おわります
　なでしこさんで魔方陣作れました。やったね！
　そういや思い出したけど、こうじゃ無かった。
　なでしこ３には ~~配列合計無いじゃん！~~ (v3.2.9で実装されました)
　表列合計はあるのになんでだ……と思いながら、魔方陣を入力したら合ってるかを判定するの作ろうとしてたんだったわ（バカ）
Ruby on rails とは？

#Ruby on railsとは
Ruby on railsはWebアプリケーションを開発するためのフレームワークです。

「フレームワーク」は「ひな形」のことで、アプリケーション開発に必要な機能を簡単な手順で
設定できるようになっています。
たとえば、Webサイトを制作する際、「ブログ」機能を使うと、HTMLやCSSを一つひとつ書かなくてもサイトが完成します。
ブログには、あらかじめ必要な機能が用意されているので、それに従ってテキストや画像を組み込むだけで完成できます。

同様に、フレームワークでも必要な機能があらかじめ用意されているので、
ルールに従って記述していくだけで、プログラムを一つひとつ書くよりも効率的にWebアプリケーションを開発できます。
フレームワークは他にもありますが、Rubyでは、Ruby on Railsを利用するのが一般的です。

#Ruby on railsの特徴
1.生産性が高い
あらかじめ基本的な構造が組まれているので、必要最低限のプログラミングだけで済ませられます。
記述するコード量は、フレームワークを使わなかった場合とではまったく違います。よりコンパクトに記述できるので、機能開発の生産性も向上します。

2.メンテナンスが容易
フレームワークには、記述ルールがありますので、
ルールに従ってコードを書くことで、一貫性を保ちやすくなります。

#Ruby on railsの設計理念
 Ruby on railsには2つの設計理念があります。

1.DRY(don't repeat yourself)
DRYは「同じ記述を繰り返さない」を意味します。
同じコードや似たようなコードがあちこち散らばると、メンテナンスや修正がしにくくなります。

2.CoC（Convention over Configuration）
Cocは「設定より規約」を意味します。
開発者が考えたり決定すべきことを極力少なくして、ロジックに集中させる思想のことです。
アプリケーションの設定を行うファイルや項目は、増えれば増えるほど仕組みが複雑化していきます。
CoCの思想を徹底することで、アプリケーションの実装に集中できるようになります。
Android: VideoをBitmapに変換する

## はじめに
Android で、Video のデコードは、`MediaCodec`で、簡単に実装できる。
が、`MediaCodec`ではデコード結果は、`Image`か`ByteBuffer`として取得できる。
これをBitmapに変換する方法に苦労したので知見をここに残す。


## 開発環境
Android, Kotlin

## コード
サンプルコードは https://github.com/kenmasumitsu/VideoToImages 参照

## 解説
一言で言うと、
[Android CameraXのドキュメント](https://developer.android.com/training/camerax/take-photo) で言及されている、`YuvToRgbConverter.kt` を使って、 `Image` を `Bitmap` に変換のがポイント。

ググると、

* https://stackoverflow.com/questions/41775968/how-to-convert-android-media-image-to-bitmap-object
* https://stackoverflow.com/questions/44486188/android-convert-image-object-to-bitmap-does-not-work

など見つかるが、うまく動かない。

* https://stackoverflow.com/questions/52726002/camera2-captured-picture-conversion-from-yuv-420-888-to-nv21/52740776#52740776

は、正しく動くが、処理時間が長い。`YuvToRgbConverter.kt`  の 約6倍。 (Pixel 3)



## 補足

https://bigflake.com/mediacodec/ で紹介されている、https://bigflake.com/mediacodec/ExtractMpegFramesTest_egl14.java.txt でも、同程度高速に正しく動作する。
Dock上のアイコンにファイルをドラッグし、アプリ側で受け取る方法

# 概要
- Dock上のアイコンにファイルをドラッグし、アプリ側で受け取る方法を紹介します。

<img width="512" alt="image" src="https://i.imgur.com/aiZL1Au.jpg">

# 参考
- [iOS 11からのアプリ間ファイル共有](https://www.slideshare.net/kenjitanaka58/ios-11-77296973)
    - `Document Types`・`Exported and Imported UTIs`などの全体の解説がありがたいです。
- [Dropping Files onto Dock Icon in Cocoa](https://stackoverflow.com/questions/2489961/dropping-files-onto-dock-icon-in-cocoa)
- [Document Types vs\. Exported and Imported UTIs](https://stackoverflow.com/questions/24958021/document-types-vs-exported-and-imported-utis)
- [\[iOS\]今からはじめるドキュメントベースApp \- Qiita](https://qiita.com/gachalatte/items/b5a7839cb53eb34415d2#document-types)
- MIMEとは
    - [拡張子とMIMEタイプ](http://www.tohoho-web.com/wwwxx015.htm)

# 実装
- **注意**: 設定に問題ないのに動作が変更されない、というときは一度クリーンアップ（`Shift + Command + k`）しましょう。
- まずは`TAEGETS`>`Document Type`に下記の通り追加します。
    - `Name`は任意ですね。
- `identifier`に目的のUTIを記述します。
- 複数ある場合はカンマ区切りで記述します。
- UTIを確認したい場合は以下を参照。
    - [System\-Declared Uniform Type Identifiers](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1)
    - [クリップボードから画像を取得する - NSImageのUTIを確認する \- Qiita](https://qiita.com/IKEH/items/6c456a1e7730e5c4f68a#nsimage%E3%81%AEuti%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)
    
![-w824](https://i.imgur.com/gzNZ5ZQ.jpg)

- ちなみに`info.plist`的には以下の通りになります。
- ただしplistを直接編集したときに、上記画面との同期が怪しいです。
- 一旦Xcodeを閉じないとうまく行かなかったりするので、`info.plist`を直接編集するのは避けたほうが良さそうです。

```xml
<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeExtensions</key>
			<array/>
			<key>CFBundleTypeIconFile</key>
			<string></string>
			<key>CFBundleTypeName</key>
			<string>ImageType</string>
			<key>CFBundleTypeRole</key>
			<string>Editor</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>public.jpeg</string>
				<string>public.png</string>
			</array>
		</dict>
		<dict/>
	</array>
```

- または`Extensinons`に開きたいファイルの拡張子を設定することも可能です。
- ただし問題点として以下の例では`*.JPG`は受け取れますが`*.jpeg`が受け取れません。
    - `jpeg`を`Extensions`に追加すればいいですが網羅することが難しくなるので、やはりUTIで指定するのが便利そうですね。

![](https://i.imgur.com/eeVxldN.jpg)

- 最後に`AppDelegate.swift`に以下を記述します。
- それぞれ、単ファイル・複数ファイルを受け付けた場合の処理をここに記述できます。
    - [application\(\_:openFile:\)](https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428612-application)
    - [application\(\_:openFiles:\)](https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428742-application)

```swift
func application(_ sender: NSApplication, openFile filename: String) -> Bool {
    print(filename)
    return true
}

func application(_ sender: NSApplication, openFiles filenames: [String]) {
    print(filenames)
}
```

- 以上でファイルをDock上のアイコンにドロップして受け取れるようになりました。
MongoDBとElasticsearchをJDBCドライバで連携する

#はじめに

Elasticsearchは、すべての種類のドキュメントをほぼリアルタイムで検索する際に使用できる検索エンジンです。
また、MongoDBも非常に利用者の多い NoSQLデータベースで、こちらはデータ保存にJSONデータモデルを使用しますが、標準SQLでMongoDBをCRUD操作できればより良いかもしれません。

この記事では、DataDirect コネクタを活用し、MongoDBからElasticsearchにJDBCでデータ連携。リアルタイムに分析する方法について記述します。DataDirectコネクタについては、<a href="https://www.ashisuto.co.jp/datadirect/connectors/mongodb.html" target="_blank">DataDirect for MongoDB JDBCドライバ</a>でもご覧ください。

記事の前提
Elasticsearch 2.3.4
MongoDB

データをお持ちでない場合は、MongoDBが提供する <a href="https://docs.mongodb.com/getting-started/shell/import-data/" target="_blank">Restaurantサンプルデータ</a> を使用ください。 

#DataDirect for MongoDB JDBCコネクタのインストール

お試しとして、<a href="https://www.ashisuto.co.jp/datadirect/app_download/" target="_blank">こちら</a>から DataDirect MongoDB 用コネクタ をダウンロードします。

PROGRESS_DATADIRECT_JDBC_MONGODB_WIN.zip
を解凍後、

PROGRESS_DATADIRECT_JDBC_INSTALL.exe

を実行し、MongoDB用コネクタをインストールします。

#Elasticsearch用 JDBCインポーターの設定
1. <a href="https://github.com/jprante/elasticsearch-jdbc" target="_blank">こちら</a>から、Elasticsearch用のJDBCインポーター をダウンロード＆解凍します。

2. DataDirect MongoDB JDBCコネクタ（mongodb.jar）
を
C:\ProgramFiles\Progress\DataDirect\JDBC_60\lib
から
\\path\elasticsearch-jdbc-2.3.4.0\libフォルダにコピーします。

3. \\path\elasticsearch-jdbc-2.3.4.0\bin
に移動し、batファイルを以下のスクリプトで作成し、保存します。

```console
@echo off

set DIR=%~dp0
set LIB=%DIR%..\lib\*
set BIN=%DIR%..\bin

REM ???
echo {^
"type" : "jdbc",^
"jdbc" : {^ "url" : "jdbc:datadirect:mongodb://:27017;DatabaseName=;TransactionMode=Ignore",^
"user" : "",^
"password" : "",^
"sql" : "select BOROUGH, RESTAURANT_ID, CUISINE, NAME, _ID from restaurants",^
"elasticsearch" : {^
"cluster" : "elasticsearch",^
"host" : "localhost",^
"port" : 9300^
},^
"index" : "restaurants"^
}^ }^ | "%JAVA_HOME%\bin\java" -cp "%LIB%" -Dlog4j.configurationFile="%BIN%\log4j2.xml" "org.xbib.tools.Runner" "org.xbib.tools.JDBCImporter"
```


#MongoDBデータをElasticsearchにインポート
1, 接続が確立したら、Elasticsearchインストールフォルダに移動し、まだ実行されていない場合はコマンドを使用して実行します。

```console
bin\elasticsearch.bat
```

2, \\path\elasticsearch-jdbc-2.3.4.0\bin
に移動し、先ほど作成したバッチファイルを実行して、MongoDBからElasticsearchへのデータのインポートを開始します。結果はログフォルダ内のjdbc.logで確認できます。


#データの検索
これで、MongoDBデータはElasticsearchノードにあるため、自由自在に検索できます。
参考としていくつかの例を示します。

（これらのリンクは、上記の手順でローカルのElasticsearch環境をセットアップした後にのみ有効です。）

http://localhost:9200/restaurants/
http://localhost:9200/restaurants/_search
http://localhost:9200/restaurants/_search?q=CUISINE:Chinese


簡単ですね！
Laravel 認証機能 (日本語化編)

#認証に関わるメッセージ等を日本語に
デフォルトだと「Login」「Register」など英語で表示され、日本人を対象とするサイトでは、日本語の方が好ましいので。
→認証機能自体の実装は[Laravel 認証機能 (インストール編)](https://qiita.com/uzued/items/bb22b5c753ab7ff78e00)を参照。

##手順概要
1. 「app.php」で、「locale」を設定。
1. メッセージ等のマスターとなるファイルを作成、保存。

##手順詳細
1.「config」内の「app.php」に記述された「'locale' => 'en'」を「'locale' => 'ja'」に変更する。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646252/2c0947f4-34ee-6b91-bd1d-e5f89f2189e8.png)

2.「lang」直下に「ja.json」というファイルを作成し、下記の内容を記述する。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646252/f3400b95-5186-20d8-102a-2209a2bbb989.png)

※コピーする場合は、こちらをご利用ください。

```ja.json
{
    "Login": "ログイン",
    "Register": "新規登録",
    "Forgot Your Password?": "パスワードを忘れた場合",
    "Reset Password": "パスワード再設定",
    "Send Password Reset Link":  "パスワード再設定URLを送信",

    "Logout": "ログアウト",
    
    "Name": "お名前",
    "E-Mail Address": "メールアドレス",
    "Password": "パスワード",
    "Confirm Password": "パスワード(確認用)",
    "Remember Me": "ログイン状態を保存",
    
    "Hello!": "ご利用ありがとうございます。",
    "Reset Password Notification":  "パスワード再設定のお知らせ",
    "You are receiving this email because we received a password reset request for your account.": "あなたのアカウントでパスワード再発行のリクエストがありました。",
    "This password reset link will expire in :count minutes.": "再設定URLの有効期限は :count 分です。",
    "If you did not request a password reset, no further action is required.": "もしパスワード再発行をリクエストしていない場合、操作は不要です。",
    "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser: [:actionURL](:actionURL)": "\":actionText\"ボタンを押しても何も起きない場合、以下URLをコピーしてWebブラウザに貼り付けてください。\n[:actionURL](:actionURL)",
    "Regards": "よろしくお願いいたします"
}
```
※表示する文章の内容は、修正可能です。

3.日本語に切り替わります。

[変更前]
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646252/b51108b1-b060-700e-fb1e-3e6983631d17.png)

[変更後]
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646252/05ce7dd1-26c0-81ce-7ee2-5681ff3f6e29.png)
MACでGit周りの操作まとめ【メモ】

Gitっていろいろ操作ありますが、毎回忘れて都度ググっているので自分用のメモとしてよく使う操作とコマンドを記載していきたいと思います。
Gitlab使っているのでGitlabの操作基準で書いてます(最初のセットアップ以外はほぼ変わらないと思いますが)。
都度更新します。

# Git登録
Gitlabのアカウントはある状態でPCにGitが登録されていない場合の手順

## gitあるかどうかの確認
バージョン返ってくればOK
ない場合はbrew install git とかインストールできるはず(ググって)

```terminal:terminal
$ git --version
git version 2.24.2 (Apple Git-127)
$
```

##Git初設定
ユーザ名とメールアドレスを登録

```terminal:terminal
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
```

##SSH Key発行&登録
GitlabにSSH Key情報を登録させる(これしないとクローンとかできない)
Gitlabの右上のアイコンから「Settings」→左ペインの「SSH keys」でkeyのところにid_rsa.pubの内容をペーストして「Add key」ボタン押下(GUI画面はめんどうなので省略)

```terminal:terminal
$ cd ~/.ssh
$ ssh-keygen -t rsa -C tk-shiina@kddi.com
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):  (そのままEnter)
Enter passphrase (empty for no passphrase):  (自分で決めたパスワード入力)
Enter same passphrase again:  (パスワード確認にもう一度入力)
Your identification has been saved in ~/.ssh/id_rsa.
Your public key has been saved in ~/.ssh/id_rsa.pub.
The key fingerprint is:
************************************************** your@email.com
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
$ ls
config		id_rsa		id_rsa.pub	known_hosts
(※id_rsaが秘密鍵なので管理注意)
$ cat id_rsa.pub
(中身をまるごとコピー)
```

#Gitクローン
既存のプロジェクトの内容をクローンするとき
GitlabのレポジトリでClone→「Clone with SSH」の右のクリップボードアイコンをクリックしてURLコピー

```terminal:terminal
$ cd (クローンしたいディレクトリ)
$ git clone (コピーしたURL)
```

#Gitブランチ
現在のブランチの確認(※がついているのが今いるブランチ)
リモート含めてすべてのブランチを確認したいときは-aオプションをつける

```terminal:terminal
$ git branch 
* master
  Develop
$ git branch -a
* master
  Develop
  remotes/origin/Develop
  remotes/origin/Developer/A
  remotes/origin/HEAD -> origin/master
  remotes/origin/Developer/B
$
```
git branchのあとに適当な名前をつけると新しいローカルブランチを作成できる

```terminal:terminal
$ git branch test(新規作成するローカルブランチ名)
$ git branch
* master
  Develop
  test
```
ローカルブランチの削除方法

```terminal:terminal
$ git branch -d test(削除するローカルブランチ名)
Deleted branch test (was 679b53b).
$ git branch
* master
  Develop
```

#Gitチェックアウト
ブランチを切り替えたいとき

```terminal:terminal
$ git branch 
* master
  Develop
$ git checkout Develop(チェックアウトするブランチ名)
Updating files: 100% (1088/1088), done.
Switched to branch 'Develop'
Your branch is up to date with 'origin/Develop'.
$ git branch 
  master
* Develop
```
ローカルブランチない状態でリモートブランチ切り替えたいときは-bオプション
ローカルブランチを作成した上でチェックアウトしてくれる

```terminal:terminal
$ git checkout Developer/A(作成するローカルブランチ名) origin/Developer/A(リモートブランチ名)
Updating files: 100% (1088/1088), done.
Branch 'Developer/A' set up to track remote branch 'Developer/A' from 'origin'.
Switched to a new branch 'Develop/A'
$ git branch
  master
  Develop
* Developer/A
```
Laravel 任意のディレクトリ直下にモデルファイルを作成する

# 目的

- 実務でモデルファイルを作成する時に`アプリ名ディレクトリ/app`に作成することよりも`アプリ名ディレクトリ/app/Models`直下に作成することが多いため、方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 前提条件

- 実施環境と同じLaravelローカル開発環境が構築されていること。

# 前提情報

- 特になし

# 読後感

- モデルファイルを`アプリ名ディレクトリ/app`直下の任意のディレクトリ内に作成することができる。

# 例

1. アプリ名ディレクトリに移動して下記コマンドを実行する。

    ```terminal
    $ php artisan make:model app直下のモデルファイルを作成したいディレクトリ名/モデルファイル名
    ```

# 具体例

1. `アプリ名ディレクトリ/app/Models`直下にTestというモデルファイルを作成したい時はアプリ名ディレクトリで下記コマンドを実行する。(Modelsディレクトリが存在しない時は自動で作成されてその中にモデルファイルが格納される)

    ```terminal
    $ php artisan make:model Models/Test
    ```

# モデルファイルを移動してエラーが出た話

- `アプリ名ディレクトリ/app`直下にモデルファイルを作成後に手動でモデルファイルを`アプリ名ディレクトリ/app/Models`に移動しただけだと下記の様なエラーが発生する可能性があるので注意する。
    - [Laravel Eloquantでデータを得ようとしたらエラーが出た話](https://qiita.com/miriwo/items/846dd35f4f472469c6a3)
Node.js新規アプリケーション作成時の初期設定手順


**前提条件**
・node.jsがインストールされていること

# 手順
1: 任意の場所に、アプリケーションを格納するフォルダを作成する
・・・今回はデスクトップにnodeフォルダを作成
　

2: コマンドプロンプトにて下記コマンドを入力し、package.jsonを生成する

```sh:入力
> cd C:\Users\yamapi1012bs\Desktop\node
#              ↑ユーザー名

> npm init --yes
# package.jsonがフォルダに生成される
```

```sh:
#以下のように出力されればOK
Wrote to C:\Users\yamapi1012bs\Desktop\node\package.json:

{
  "name": "node",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

>
```
　
　
3: npmパッケージをインストールする

```sh:入力
> npm install express ejs nodemon
# 今回は、expressとejsとnodemonの3つのパッケージをインストール
```

```sh:
# 以下のように出力されればOK

> node --harmony ./postinstall.js

Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)

npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN node@1.0.0 No description
npm WARN node@1.0.0 No repository field.

+ express@4.17.1
+ ejs@3.1.3
added 65 packages from 44 contributors and audited 65 packages in 18.403s
found 0 vulnerabilities

>
```
　

nodeフォルダ内に

- node_modules（フォルダ）
- package.json
- package-lock.json

が生成されていれば設定完了
　
# 実行してみる
1: nodeフォルダ内に以下を作成

- index.js
- views（フォルダ）
    - sample.ejs（viewsフォルダ内）




```javascript:index.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.render('sample.ejs');
});

app.listen(3000);
```    

```html:sample.ejs
<h1>Hello World</h1>
```


2: コマンドプロンプトにて下記コマンドを入力

```sh:入力
> node index.js
```

3: ブラウザを開いて「localhost:3000」にアクセス
   sample.ejs（Hello World）が表示されればOK


# ファイル更新時に自動でサーバーを再起動させる
※必須ではないですが、デバッグ時に役立ちます
　
この設定をしておらず30分近くハマったことがあるのは内緒


**前提条件**
・nodemonパッケージがインストールされていること

1: package.jsonのscripts欄を下記の通り修正する

```.json:package.json
"scripts": {
    "start": ".\\node_modules\\.bin\\nodemon app.js"
  },
```

2:コマンドプロンプトにて下記コマンドを入力

```sh:入力
> npm run start
```


終わり。
内部アプリ共有したアプリでGoogleログインができない

# 結論
内部アプリ共有では、ビルド時に指定した署名ファイルのSHA-1フィンガープリントではなく、内部アプリ共有用のフィンガープリントで、OAuthクライアントを指定してやる必要がある。

# 手順
AndroidでGoogleログインする際には、Google Developer ConsoleにてOAuthクライアントの認証情報を設定してやる必要がありますよね。
その際に、アプリの署名のSHA-1フィンガープリントを設定する項目があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102032/8636dbf5-6a80-2662-f82a-a082cb5f1503.png)

内部アプリ共有でテスターにアプリを配信する際、この項目を内部アプリ共有用のSHA-1フィンガープリントにしてやる必要があります。
本番用の設定を変更して本番のアプリが動かなくなっても困るので、「内部アプリ共有用」とでも名前をつけたOAuthクライアント認証情報を新たに作成してやるのがいいかと思います。
パッケージ名は認証情報同士で重複しても平気なようです。

# 内部アプリ共有用のSHA-1フィンガープリント
で、その内部アプリ共有用のSHA-1フィンガープリントがどこで手に入るかというと、GooglePlay Consoleです。
内部アプリ共有の中に「アプリの証明書」というタブがあるので、その中にある「SHA-1 証明書のフィンガープリント」をコピーしてGoogle Developer Consoleに設定してあげてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102032/8e0f0de7-361c-dfbe-83e3-af93678f7a32.png)

# 背景
ローカルでUSB経由で実機にデプロイしたリリースビルドだと動作するのに、内部アプリ共有だとGoogleから「DEVELOPER_ERROR」が返ってきて何事だよ…と思ったらこういうことでした。
ちょい技(Oracle VM virtualBox)

###VirtualBoxのファイルをwinscpでアクセスする

**前提条件**
・winscpで使用する予定のユーザーがSSH接続できる状態にすること
(自分はSSHが使えるかどうかは、TeraTermでアクセスして確認しました。)
 -> 自分はCentOS7のrootを使用したので以下を参照しました
[Linux(CentOS7)でSSHを利用する](https://qiita.com/sango/items/816136188387221f05b3)

**手順**
①VirtualBoxのネットワーク設定をいじる
使う仮想マシーンに対して行います。
設定 -> ネットワーク 
-> "アダプター"を選択(割り当ては"NAT") -> 高度(D) 
-> "ポートフォワーディングルール"表示される 
-> 設定を追加(右の"+"を押す) 
-> 名前(任意)とプロトコル(TCP)とホストポート(任意)とゲストポート(任意)を設定する。 
-> OK

②winscpの以下設定をいじる
・通信プロトコル:(SCP)
・ホスト名:(localhost もしくは  127.0.0.1でもいいかも←試していない)
・ポート番号:(①で設定したホストポートかゲストポート)同じポートにしておけば問題ない
※現在使われていないポート番号にすること、大体22でいいと思う。
・ユーザー名/パスワード:(前提でSSH接続設定状態にしたユーザー名とそれのパスワード)

③接続完了

---
Swift：macOSの環境設定の各項目に飛ぶ

基本的にはこの[StackOverflowの記事](https://stackoverflow.com/questions/52751941/how-to-launch-system-preferences-to-a-specific-preference-pane-using-bundle-iden)の通り

ワンポイントとして、`NSWorkspace.shared.open(URL(fileURLWithPath: "x-apple.systempreferences:com.apple.preference"))`のようにすると飛べるとあるが、これは実際には動かない。

`NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preference")!)`なら飛べた。URL(fileURLWithPath: )だとあくまでファイルへのパスになってしまうのかもしれない。
Xcode11で作成したプロジェクトをiOS12に対応させる方法


## はじめに
久しぶりに新規にプロジェクトを作ったのですが、iOS12で動かなかったのでその対応方法です。
Xcode11から SceneDelegate というものがテンプレートで生成されるようになりました。iOS13以降で同一アプリを複数表示するSceneという概念が導入されたことに伴う変更なのですが、iOS12ではSceneの概念がないためクラッシュします。
そのため、iOS12に対応させるためにはひと手間必要になってしまいました。iPhone5sやiPhone6など、まだまだ現役なので対応させない手はありませんよね。

## 開発環境
- Xcode11.5
- Swift

## 対応内容
    

### AppDelegate

UISceneSession Lifecycleの２つのメソッドをiOS13以降のみビルドされるように修正します。また、SceneDelegateで定義されるようになったUIWindowをAppDelegateに追加します。

```swift:AppDelegate.swift
@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow? // この行を追加

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        return true
    }

    // MARK: UISceneSession Lifecycle
    @available(iOS 13.0,*) // この行を追加
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    @available(iOS 13.0,*) // この行を追加
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
}
```

#### SceneDelegate
SceneDelegateはiOS12に対応していないため、クラスごとiOS13以降にします、

```swift:SceneDelegate.swift
@available(iOS 13.0,*)  // この行を追加
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  :
}
```

## 最後に
プロジェクトをゼロから作ることが案外少ないため、久しぶりにテンプレートから作成したらいきなり動かなくてびっくりしました。
iOSは進化が早いというか、後方互換性が切り捨てられるというか、ついていくのが大変ですね。
【メモ】GitHubのアカウントを切り替える

既出でしょうが、自分用メモ。

## やりたいこと

社内用アカウントと個人のアカウント等、複数アカウントを切り替える必要がある場合に、一つの端末で複数のアカウントを使用したい。

## 準備

### ssh認証の設定

メインアカウント、サブアカウントの両方にssh keyを登録します。

#### sshキーの作成

まず、GitHubのSSH認証の設定に用いる公開鍵と秘密鍵のペアを生成します。

```
$ ssh-keygen -t rsa
```

```
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):
```

なんて聞かれるので適当なお名前を付けておきましょう。
ここでは「id_rsa_git」とします。

```
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):C:\Users\username/.ssh/id_rsa_git
```
もしくは ディレクトリ.sshにいる状態で

```
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):id_rsa_git
```

こんな感じでいいと思います。

あとは適用にパスフレーズを入力し（入力しなくてもok）、

key fingerprintや、RSA 2048の夜空のようなimageが表示されれば成功です。

#### GitHubに公開鍵の登録

GitHubの個人設定ページへ行きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542522/24de59d8-98ca-6c29-6396-82b80fed7092.png)

「SSH and GPG keys」の項目でSSH keyの登録ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542522/906be31b-2ce1-9e6c-9b23-d69f2626dc12.png)

適当にtitleを付けて、先ほど生成したssh keyの.pubがついてるほう（公開鍵）の内容をKeyにつっこみましょう。

![202007291106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542522/fd7df867-56b8-05cf-5948-96892c21ec6f.png)

これでメインアカウントのSSH認証の設定が完了です。

同様にして再度ssh keyを生成し、サブアカウントの方にもSSH keyの設定をしておきましょう。

ここで、先ほど生成したkeyと名前がかぶったりしないように命名を変えておくことに気を付けましょう。

```
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):C:\Users\username/.ssh/id_rsa_git_sub
```

ディレクトリを分けるのも個人的にアリだと思います。（.ssh/configをちゃんと記述しないと認識してくれないので、そこだけ注意）

```
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):C:\Users\username/.ssh/git_sub/id_rsa
```

## アカウント分けるための設定

無事アカウントの設定が完了したら、アカウントごとのssh認証の設定を行います。

#### Hostについての~/.ssh/configファイルの作成

.ssh直下に以下の内容のファイルを置いておきましょう。

```
Host github.com                       # メインアカウントに関する記述
  HostName github.com 
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa_sub      # メインアカウントに登録している公開鍵に対応した秘密鍵
  TCPKeepAlive yes
  IdentitiesOnly yes
Host github.com.sub                   # サブアカウントに関する記述
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_rsa_git_sub  # サブアカウントに登録している公開鍵に対応した秘密鍵
  TCPKeepAlive yes
  IdentitiesOnly yes
```

ちゃんと設定できているか確認します。以下のコマンドを実行。

```
$ ssh -T git@github.com       # メイン
$ ssh -T git@github.com.sub   # サブ
```

こんなメッセージが返ってきたらうまくいってます。

```
Hi (username)! You've successfully authenticated, but GitHub does not provide shell access.
```

### ディレクトリごとにユーザー情報の設定

以下コマンドでリモートのホストをリポジトリに対応するものに変更します。

```
$ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git     # メイン
$ git remote set-url origin git@github.com.sub:USERNAME/REPOSITORY.git # サブ
```

## アカウント情報(~/.gitconfig)の設定

最後にcommit等に残るアカウント情報の設定を行います。

自分はよく使う方のアカウントはglocalで登録しておいて

```
git config --global user.name {main_username}
git config --global user.email {main_useremail}
```

あんま使わないほうはリポジトリごとに登録したりしています。

```
git config --local user.name {sub_username}
git config --local user.email {sub_useremil}
```

以上でいい感じにアカウントの使い分けができると思います。やったね。

## 余談

TypeScriptの記事書きたいけど全然かけへん。。
もっと使いこなしたいね。

## 参考になりそうな記事

ssh認証の設定について詳しく書いてくれてる記事:
https://qiita.com/shizuma/items/2b2f873a0034839e47ce
2進数と16進数の変換(基礎)

### 2進数と16進数の変換方法
2進数から、16進数の相互変換の計算方法の基礎をメモしておきます.
(ほぼ自分用です.)

```
00111110
```
この2進数を16進数に変えて表記したい場合

まずは、**4bit(桁)ごとに分割**します.

```
0011, 1110
```
この際、4bit(桁)に満たない場合は、先頭から0を置きます.

この分割した部分ごとに、16進数に変換します.

#### 16進数の基礎
ここから簡単に16進数の基礎の説明に入るので、すでにわかってるマンは飛ばしてください.

**16進数は、
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
で表記**します.

10進数の、10 ~ 15までをアルファベットで置き換えてるわけです.

16進数なので、16から次の桁になるので、F(15)までしかありません.

さて、では先程の2進数を変換していきましょう.

```
0x3, 0xE
```
16進数なので、**0x**をつけ忘れずに

このあとは、変換した値をつなげます.

```
0x3E
```

これで、00111110という2進数が0x3Eという16進数に変換できました.

逆の場合も同様です.

```
0x3E
```
0xを省き、3Eを分割します.

```
3, E
```
それぞれを2進数に変換します.

```
0011, 1110
```
これら2つをつなげて完成です.

```
00111110
```
Pythonで簡単な貪欲法を書く

# 貪欲法

貪欲法とはある基準を設けてその場その場で最適な解を選択し続けて最適解を求める方法です。短時間である程度最適な解を求める時に効果的だと思っております。貪欲法自体広い意味で使われているので、こういう時に使えるというのが難しいですが、個人的には

- 一つある値Aを固定させて別の値(B,C...)と比較することによって解が得られそう

な時に使えるかなと思っております。

# 今回の問題
AtCoderの[B - Magic 2](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_b)を貪欲法で解いていきます。


>**問題文**
M君は、以下の 3枚のカードを持っています。
>
- 整数Aが書かれた赤のカード
- 整数Bが書かれた緑のカード
- 整数Cが書かれた青のカード
>
彼は天才的な魔術師なので、以下の操作をK回まで行うことができます。
>
- 3枚のうちいずれか1枚のカードを選び、書かれた整数を2倍する。
>
操作を行った後、以下の条件が同時に満たされれば、魔術は成功です。
>
- 緑のカードに書かれている整数は、赤のカードに書かれている整数より真に大きい。
- 青のカードに書かれている整数は、緑のカードに書かれている整数より真に大きい。
>
魔術を成功させることができるかどうか判定してください。
>
**制約**
>
- 1≤A,B,C≤7
- 1≤K≤7
- 入力はすべて整数


要はK回以内に`赤<緑`かつ`緑<青`を達成すれば良いと考えられます。この問題では、`緑を赤に超えるまで2倍した回数`+`青が緑を超えるまで2倍した回数`がKより以下であれば条件を満たす事が出来ます。

先ほどの`一つの値を固定させる`をこの問題的に言うと

- 赤の値を固定させて比較する

と解きやすくなるかなと思います。

# 自分の解答
```B-Magic2.py
nums = input().split() #A,B,Cを入力

A = int(nums[0])
B = int(nums[1])
C = int(nums[2])

K = input() #Kを入力
k = int(K)

cnt = 0 #kより回数が以下だと魔術は成功するので比較するための整数cntを定義

while A >= B: #Bを2倍してA以上になる回数を記録
    cnt += 1
    B *= 2

while B >= C:  #Cを2倍してB以上になる回数を記録
    cnt += 1
    C *= 2


if cnt <= k:
    print("Yes")
else:
    print("No")


```

```入出力
7 4 2    #A,B,C入力
3        #K入力
No       #出力
```

# 終わりに（メモ書き）
AtCoderでは難しい問題になってくるとそのまま問題の条件を書き移しても解答にたどり着かないので、問題の読解力と数学的思考力の両方が必要だなと思った。自分が高校まで国語を疎かにしていたつけが今来ている感じですね。ああ読解力が欲しい...
## 参考記事
https://studyhacker.net/reading-comprehension

https://www.naganomathblog.com/entry/2018/08/21/071918
「 内容 」をメールサーバー名で入力してください。【MXレコード】の対処法

## 問題

自分で取得したドメインでGSuiteの利用を開始した際に、取得したドメインの管理先でGSuiteの設定を行う必要がある。そのなかで、MXレコードの設定時に下記エラーが起きて困ったので共有する。

私は保有するドメインはすべてムームードメインで管理しており、この問題もムームードメイン固有の可能性が高いので需要が少ないかもしれない。

```
「 内容 」をメールサーバー名で入力してください。【MXレコード】の対処法
```

## 対処法
GSuiteのMXレコード設定ページの通りに設定すると下記のようになるのだけど、問題の原因は COMの後ろのドット（.）らしい。なので、下記から一番最後のドット(.)を取り除くことでエラーは解消できる。


| 種別 | 内容 | 優先度 |
|:--|:--|--:|
| MX | ASPMX.L.GOOGLE.COM. | 1 |
| MX | ALT1.ASPMX.L.GOOGLE.COM. | 5 |
| MX | ALT2.ASPMX.L.GOOGLE.COM. | 5 |
| MX | ALT3.ASPMX.L.GOOGLE.COM. | 10 |
| MX | ALT4.ASPMX.L.GOOGLE.COM. | 10 |


## 参考

[ERR:「 内容 」をメールサーバー名で入力してください。](https://sefuumi.hamazo.tv/e2161211.html)