OmniAICreator/Qiita-1.07M huggingface dataset:
Power Query(for Desktop)のオススメショートカットキーまとめ

# はじめに
Power Queryのショートカットキーは、以下公式ドキュメントにまとめられている。

https://docs.microsoft.com/en-us/power-query/keyboard-shortcuts

しかしながら、このページはPower Query Onlineでしか利用できないショートカットキーも多数含んでいる。
そこで、「自分の実務ではExcelやPower BI Desktopしか使わない」といった方に向けて、デスクトップアプリでも使用可能なショートカットのみをまとめてみた。
※excelのバージョンによって、少々相違する点があります。あらかじめご了承ください

# Power Query Editor(基本画面)
- `F2` 列名・ステップ名・クエリ名の編集
- `Alt ↓` フィルター
- `Ctrl ↓` 型の変換
- `Ctrl(またはShift) 左クリック` 複数列の一括選択

※`F2`、`Alt ↓`、`Ctrl(またはShift) 左クリック` は、Excelと同じような挙動であるため、Excel慣れしている方にとっては馴染み深い。


# Power Query Editor(詳細エディター)
- `Alt ダブルクリック` 複数箇所に散在している同一単語の一括編集
- `Ctrl /` コメントアウト

※VScode慣れしている方は、VScodeのショートカットキーをほとんどそのまま転用できる(はず)。

# ワークシート(通常のExcel画面)
- `(テーブル内の任意のセルを選択してから)右クリック→R` テーブルの更新(ピボットテーブルでも可)
- `(テーブル内の任意のセルを選択してから)右クリック→B→E` Power Query Editorの起動


# 最後に
デスクトップアプリでは、アクセスキーやクイックアクセスツールバーを積極的に利用することで、ショートカットキー不足を補完できる。
### アクセスキーで補おう
- `Alt A P N L` Power Query Editorの起動
- `Alt A P N F W` ExcelをデータソースとしてPower Query発動
- `Alt A P N F F` フォルダをデータソースとしてPower Query発動
- `Alt A F T` Csv(またはテキストファイル)をデータソースとしてPower Query発動


※「アクセスキーって何？」という方は以下ページをご覧ください。

https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-1798d9d5-842a-42b8-9c99-9b7213f0040f

### クイックアクセスツールバーを使おう
私は、以下4つをクイックアクセスツールバーに登録している。

- 詳細エディターの起動
- プレビューの更新
- クエリの依存関係
- カスタム列
InteliJでOutOfMemoryErrorが出たときの対処法

# JVMの`Maximun heap size, MB`を設定する
`メニューバーのIntelliJ > Preferences > Build, Execution, Deployment > Build Tools > sbt`の`Maximun heap size, MB`を設定する(下の設定画面では4086に設定している).
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963596/dc7bddac-d6f0-e5a7-a0f2-23fdfb8364d8.png)

# `idea.vmoptions`ファイルの設定を書き換える
`メニューバーのHelp > Edit Custom VM Options...`をクリックすると`~/Library/Application Support/JetBrains/IdeaICxxxx.x/idea.vmoptions`が開かれるので`-Xmx`項目の数値を変更する(下のコードでは4086に設定している).

```
-Xms128m
-Xmx4096m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
-XX:+UseCompressedOops
-Dfile.encoding=UTF-8

-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof
```
Couldn't find Schedule without an IDを解決する

rails初学者です。現在、オリジナルアプリを作成中で、削除機能をつけようとした時に、
Couldn't find Schedule without an IDという「IDがありませんよ！」　というエラーが出ました。

まず最初にbinding.pryで

```ruby:schedules_controller
 binding.pry
 schedules = Schedule.find(params[:id])
 schedules.destroy
```
paramsの中身を確認したところ、
pramsにはidではなく、formatが代入されていました。


そこで、routes.rbを確認すると

```ruby:routes.rb
resources :posts do
    resource :schedules, only: [:update, :edit, :destroy]
  end
```
とschedulesのresourceが単数系になっていて、このままではIDを付与してくれないので、resourcesの複数形に直し、

```ruby:index.html.erb
resources :posts do
<% @schedules.order(:date).joins(:memory).each do |s| %>
            <tr>
              <td><%=  s.schedule %></td>
              <td><%= s.post.text  %></td>
              <td><%= link_to s.post.range, post_path(s.post) %></td>
              <td><%= s.post.time %></td>
              <td>[ <%=  link_to '編集する', edit_post_path(s.post,s) %> ]</td> 
              <td>[ <%= link_to '完了する', post_schedules_path(s.post,s), method: :delete, data:{ confirm: '本当に完了していいですか？' }%> ]</td>
            </tr>   
          <% end %> 
```
の完了するのリンクのpost_schedules_pathをpost_schedule_pathの単数系に直すと、無事解決しました。

反省:
エラーが出てきた時にidが無いと言われたのでparamsの中身を確認せずに、モデルやDBを色々確認していて、エラーを直すのに少し時間がかかってしまった。　次からはparamsをbinding.pryで見ることを忘れずにする。
[Unity] 簡単に2Dスクロール背景を実装する方法

# 動作環境
Unity 2019.4.24f1

# 1.事前準備
1.適当なスプライト(パターン画像)を選択
　今回はこちらからお借りしました。
　http://bg-patterns.com/

2.`Inspector`から
　・Mesh Type->Full Rect
　・Warp Mode->Repeat
　をそれぞれ選択

※ドット画像の場合は
　・Filter Mode->Point(no filter)
　・Compression->None
　も選択

![1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2231777/c5ab7368-f2fc-d79f-7811-4a9b3729350c.png)

# 2.マテリアルの作成
1.`Project`からCreate->Materialを作成
2.ShaderからUnlit->Transparentを選択
3.右側の四角をクリックして、スクロールしたい画像を選択

![1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2231777/e964821a-9963-09d9-81cb-c79db8d69cdf.png)

# 3.スクリプトの作成
1.`Project`からCreate->C# Scriptを作成
2.以下のコードを記述

```cs:BackScroll.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BackScroll : MonoBehaviour
{
    private Renderer rend;

    [SerializeField]
    private float m_speed;

    // Start is called before the first frame update
    void Start()
    {
        rend = GetComponent<Renderer>();
    }

    // Update is called once per frame
    void Update()
    {
        //自動でスクロール
        float x = Mathf.Repeat(Time.time * m_speed, 1);
        Vector2 offset = new Vector2(x, 0);

        rend.sharedMaterial.SetTextureOffset("_MainTex", offset);
    }
}
```

# 4.スプライトの表示
1.`Hierarchy`からCreate Emptyを作成
2.`Add Component`からSprite Rendererを選択
3.マテリアルをドラッグして適用
4.`Sprite Renderer`から
　・Sprite->スクロールしたい画像
　・Draw Mode->Tiled
　・Size->画面に合うサイズ
　をそれぞれ選択
5.スクリプトをアタッチしてSpeed(変数)に適当な数字を入れる

![1_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2231777/74bec1bf-0b29-0ac0-1a07-959c2e36785a.png)

# 5.完成

![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2231777/94caa484-7413-9be4-12bc-0a17790d16bc.gif)

これで自動的にスクロールするようになります。
`Sprite Renderer`にこのような警告が表示されることがありますが、気にしなくても動くので大丈夫です。

![1_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2231777/27617e6c-bc1c-82a5-72ce-6a4dc29db591.png)

# おまけ
![ダウンロード (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2231777/747b5bce-b8b0-6cf8-fa33-00a144c1694d.gif)

画像を**座標軸**でスクロールしたいときは以下のコードを追加するとできます。
これらはスクリプトで動かしているので応用しやすいです。いろいろできると思うので試してみてください。

```cs:BackScroll.cs
        //座標軸でスクロール
        float moveX = transform.position.x * m_speed;
        float x = Mathf.Repeat(moveX, 1);
```

# 参考サイト
https://pafu-of-duck.hatenablog.com/entry/2017/05/23/165804
Sync Gateway利用方法：ユーザーとロールの作成・管理

[Couchbase Mobileアプリケーション開発へのロードマップ](https://qiita.com/yoshiyuki_kono/items/6a5bbad1b02196a25417)もご覧ください。


## はじめに

[エッジコンピューティングを実現するCouchbase Mobile紹介：Sync Gatewayによるデータ同期におけるアクセス制御モデル](https://qiita.com/yoshiyuki_kono/items/b9eb6ddae93fc98f4f7b)にも書いた通り、Sync Gatewayでは、ユーザーとロールが重要な役割を持ちます。



## 機構
ドキュメントの配布とユーザーアクセスを構成する方法には以下があります。


- 3.0ベータ以前（静的）：
 - 構成ファイルを利用
- 3.0ベータ以降（動的）：
 - 管理者RESTエンドポイント：　
 - 同期関数(`sync（）` function)内部で、APIを利用


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/f19bac2b-b829-0f19-6f4e-bf420306d098.png)

同期ゲートウェイ構成ファイル内で静的に構成するオプションを使用するには、`disable_persistent_config`フラグを`true`に設定してSync Gatewayを実行する必要があります。


ここでは、管理者RESTエンドポイントを利用した構成方法を中心に紹介します。

## ユーザーの作成

### 概要
ドキュメントへのアクセスを許可する前に、Sync Gatewayでユーザーを作成する必要があります。

ユーザー作成については、OIDCを利用し、IDトークンの検証が成功した後にユーザーを自動登録するようにOIDC認証を構成することもできます。

### 構成方法

#### 管理REST API


POSTリクエストをAdmin　Rest Api_userエンドポイント`（{db}/_user/{name}`）に送信して、新しいユーザーを作成します。URLの最後にユーザー名を含めます。既存のユーザーを更新する場合は、代わりにPUTを送信します。

```BASH
$ curl -vX POST "http://localhost:4985/mydatabase/_user/" -H
"accept: application/json" -H "Content-Type: application/json" -d
'{"name": "Edge1User", "password": "pass"}' ①

$ curl -vX PUT "http://localhost:4985/mydatabase/_user/Edge1User" -H
"accept: application/json" -H "Content-Type: application/json" -d
'{"name": "Edge1User", "admin_channels": ["RandomChannel"]}' ②
```

①新しいユーザー「Edge1User」を追加します。
②既存のユーザー「Edge1User」を更新し、`admin_channels`データを追加します

#### OIDC

```shell
curl --location --request PUT 'http://localhost:4985/ourdb/_config' \
--header 'accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
  oidc: {
    providers: {
      google_implicit: {
        issuer:https://accounts.google.com,
        client_id:yourclientid-uso.apps.googleusercontent.com,
        register:true 
      },
    },
  }
}'
```

`register:true`設定により、検証が正常に完了すると、Sync　Gatewayユーザーが自動的に作成されます。


## ロールの作成

### 概要
ロールの作成はオプションです。ユーザーを論理的にグループ化する必要があるかどうかは、ユースケースによって異なります。

### 構成方法

#### 管理REST API

`/{tkn-db}/_role/`エンドポイントを使用して新しいロールを作成します。

```BASH
$ curl -vX POST "http://localhost:4985/mydatabase/_roles/" -H
"accept: application/json" -H "Content-Type: application/json" -d
'{"name": "Edge1", "admin_channels": ["channel1", "channel3"]]}' 
```

ここでは、「Edge1」ロールを追加しています。

## ユーザーのロールへの割り当て

### 概要
ユーザーをロールに（またはロールから）割り当てる（または削除する）ことができます。

ロールを削除すると、そのロールが関連付けられているチャネルへのアクセスが事実上取り消されます。

### 構成方法

#### 管理REST　API

```BASH
$ curl -vX PUT "http://localhost:4985/mydatabase/_user/{user}" -H 
"accept: application/json" -H "Content-Type: application/json" -d
'{ "admin_roles": ["Edge1"]}' 
```

`{user}`は、更新するユーザー名です（例：「Edge1User」）。
n8n.cloudを社内の定型業務を全自動化する基盤にした

## n8n.cloud

n8nはノーコードのオンプレミスiPaaS（Integration Platform as a Service）です。

https://github.com/n8n-io/n8n

でも、やっぱりホスティングしてもらいたいので私の会社ではn8nのホスティングサービスであるn8n.cloudを契約しました。

https://www.n8n.cloud/

近々リブランディングされるらしいのでアツイです。

## 背景

私の所属している会社では、毎週製品の売り上げに関する客観的な指標を会議で共有していました。目的は期末までに目標を達成することで、数値が予定通り進んでいるかどうかで追加のアクションを取るべきか決定しています。いわゆるOKR（Objectives and Key Results）というものを運用しています。

私がこれの自動化に取り組む前は、販売プラットフォームが提供している簡素なレポートツールからOKRの管理ツールに値を転記していました。レポートツールの値がそのまま転記できるのであれば良いのですが、期によって今期のチャーンレートだけ含みたいとか特定のホスティングタイプは含まないようにしたいなど色々カスタマイズの要望が出てきて、レポートツールから値を取得するとき毎回検索条件を細かく指定して値を取得するという運用になってしまっていました。

これが、例えば期に一回だけ行うということであれば自動化しなくても全く問題ないのですが、毎週行っていたので各プロダクトマネージャー（私以外のエンジニアは全員プロダクトマネージャーです）の結構大きめな負担になっていました。そこで、私がそれらの定型作業を自動化し、PMの負担の軽減することに着手しました。

## n8n.cloudを選定した理由

n8n.cloudを選定した理由はいくつかあります

- さまざまなクラウドサービスとワンクリックで連携できる - Google SheetsやSlackやHTTP Basic AuthがWeb GUI上で設定できることが絶対条件でした
- HTTPリクエストが出せる - 他にもノーコードプラットフォームはたくさんありますが、HTTPリクエストが出せるものはほとんどありません
- 自力でホスティングする必要がない - オンプレミス版であるn8n.ioをAWS上で動かすことも考えましたがサービス間の連携が煩雑になるのでやめました
- 安い - 月20ドルで20個ワークフローが動かせるのは非常に安いです

## n8nのワークフローの例

これがn8nのワークフローの例です。濃い青色のノードがレポートツールのREST APIを叩いていて、右端の緑色のノードが結果をGoogle Sheetsに出力しています。他のノードは全てデータ変換のノードです。

![n8nワークフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35580/57f18f5b-083f-20c5-6725-bcb5bccaf76d.png)

## Functionノード

Get current quartarノードは一番面倒臭い処理を行っているコードが書かれているノードです。私の会社はなぜか3月が会計年度の始まりなので、現在時刻に基づいて私の会社における現在の期の始まりと終わりの日程を取得しています。このように、ノーコードプラットフォームでありながら、必要に応じてNode.jsのコードが書けるのもn8nの特徴です。（あまり多用すると遅くなります）

```js
const QUARTER_OFFSET = 1;
const QUARTERS = [
  { start: [-1, 1], end: [2, 0] }, // Q4
  { start: [2, 1], end: [5, 0] }, // Q1
  { start: [5, 1], end: [8, 0] }, // Q2
  { start: [8, 1], end: [11, 0] }, // Q3
  { start: [11, 1], end: [14, 0] }, // Q4
];

const now = new Date();
const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
const params = QUARTERS[Math.floor((now.getMonth() + QUARTER_OFFSET) / 3)];
const quarterStart = new Date(...[now.getFullYear(), ...params.start]);
const quarterEnd = new Date(...[now.getFullYear(), ...params.end]);
return [yesterday, quarterStart, quarterEnd].map(date => ({ json: { date } }));
```

## 将来の展望
現在は全てのデータをレポートツールのREST APIから直接取得しているのですが、将来的には一旦Google BigQueryに格納してから取得する方向に持っていきたいです。ワークフローの数が増えすぎて、レポートツールからアクセス制限を食らってしまうことがたまに起こっています。n8nはBigQueryもデータソースにすることができるので、一部の自動化業務はCloud FunctionsやCloud Workflowsで実装することになるかもしれませんが、n8n.cloudのサービス関連連携が容易であるという利点はGoogle Cloud Platformに勝るので、これからもn8n.cloudを利用していく予定です。
VSCode から Redmine の REST API を実行する

# はじめに

VisualStudioCode の拡張機能「REST Client」を使って Redmine の REST API を実行する方法をまとめました。

* [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client)
* [Redmine API - redmine](https://www.redmine.org/projects/redmine/wiki/Rest_api)

# 拡張機能「REST Client」の導入

1. VSCode　の「拡張機能」タブで「REST Client」と入力し検索
1. 以下の拡張機能をインストール（未インストールの場合 Install ボタンが表示されるのでクリック）
![cap_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1986053/96db0eee-39ba-ce81-11d4-0ed10098b420.png)

# リクエストの投げ方

1. 新規作成した Untitled.txt を拡張子を「.rest」に変更して保存
1. 実行したいリクエストを書く
1. Send Request をクリックによってリクエストを送信  
（[F1] -> [Rest Client: Send Request]　でも可能）  
![cap_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1986053/13e8606d-cede-3d02-8622-e4dd8e89f3a4.png)  
1. 右側にレスポンスの内容が表示される  
![cap_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1986053/1d2a95c9-ac70-a7b5-a827-42068afedaa7.png)


# 各リクエストの書き方

### GET

* key : API アクセスキー

```
GET http://localhost:3000/issues/12345.json HTTP/1.1
content-type: application/json

{
    "key":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
```

### PUT
* key : API アクセスキー
* subject : 「タイトル」
* status_id : 「ステータス」の ID （一覧は GET /issue_statuses で取得）

チケットの様々な項目が設定できます。詳細に関しては [こちら](https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue) を参考にしてください。

```
PUT http://localhost:3000/issues/12345.json HTTP/1.1
content-type: application/json

{
    "key":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "issue": {
        "subject":"Bug yyyy Fixed",
        "status_id":"3"
      }
}
```
Dockerとは

# Dockerとは何か
・コンテンツ型仮想環境を作成・実行・管理するためのプラットフォーム
・Dockerのソフトウェアを使って素早くコンテナを起動し、様々なアプリケーションを実行することができる
※コンテナとは仮想環境のこと
・異なる環境で簡単に同じ仮想環境を再現できる
・Dockerのソフトウェア自体はGo言語で書かれている。

# Dockerのユースケース
・アプリケーションの開発環境
・検証環境、本番環境
・Webサーバ、データベースサーバなどの構築
・各種プログラミング言語の実行環境
・その他さまざまなミドルウェアの環境構築

#Dokerを利用するメリット
・プログラムの実行環境を素早く立ち上げることができる。
　⇒ 起動までが数秒程度
・再現性のある環境を用意できる
　⇒ PCで開発したプログラムをサーバーで動かす場合も差異が生まれにくく、トラブルになりにくい。
・設定ファイルを共有することでプロジェクトメンバー間で同じ環境を立ち上げることができる。
・PCの環境を汚さずに済む。
　⇒ PCのソフトウェアのバージョン管理などを行わなくて済む

# ホスト型仮想化とコンテナ型仮想化のメリットとデメリット
・ホスト型は仮想マシンのハードウェアも含めてエミュレートしているため、非常に処理が重く起動や停止も時間がかかる
・コンテナ型仮想化はアプリケーション実行に必要なものだけなため非常に処理が軽量であるため起動や停止に時間がかからない
・ホスト型は仮想マシンの環境の違いによりアプリケーションが動作しなくなることがまれに発生する
・コンテナ型仮想化は特定のアプリケーションを動作させるために必要なものはDockerにまとまっており、同じDockerイメージからコンテナを起動する限り環境が変わっても同様に起動する
・ホスト型は任意のOSを動作させることができるがコンテナ型仮想化はできない。
FlutterでImage.networkの画像サイズを取得する。

# FlutterでImage.networkの画像サイズを取得する。
Flutterで画像をWidgetとして表示させる方法は主に2つあると思います。一つは登録したてある画像を`Image.asset`で読み込む方法。そしてもう一つが`Image.network`を使用し，画像URLから表示させる方法です。
この`Image.network`を使用する方法は画像の登録等の手間がかからないためお手軽に画像を表示させることができるのですが画像サイズの取得が簡単にはできません。なので自分が2時間くらい様々な記事を見てできた方法を紹介します。

```.dart
import 'dart:async';
import 'dart:ui' as ui;

    Future<Size> getImageSize() async {
      final Image image = Image.network('画像URL');
      final Completer<Size> completer = Completer<Size>();
      image.image.resolve(ImageConfiguration.empty).addListener(
        ImageStreamListener(
              (ImageInfo image, bool synchronousCall) {
            final ui.Image myImage = image.image;
            final Size size = Size(
                myImage.width.toDouble(), myImage.height.toDouble());
            completer.complete(size);
          },
        ),
      );
      return completer.future;
    }
```

この関数を使用することで画像サイズが非同期ですが取得できます。



#　参考文献
[Flutterで画像を表示する方法【まとめ】](https://qiita.com/yu124choco/items/a2710ec004d3425a2a0b)
[How do I determine the width and height of an image in Flutter?](https://stackoverflow.com/questions/44665955/how-do-i-determine-the-width-and-height-of-an-image-in-flutter)
[How to get size from a NetworkImage in flutter](https://stackoverflow.com/questions/61410677/how-to-get-size-from-a-networkimage-in-flutter)
MAX7219 8x32ドットマトリックスLEDディスプレイモジュールで漢字表示で気が付いたこと

#MAX7219 8x32ドットマトリックスLEDディスプレイモジュールで漢字表示させようと、美咲フォントを使おうと思ったけど。

###MDParolaFontEditor の記事が無かったのでメモ！

![8x8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77496/86c493d0-aa17-0558-16e0-05091175c5bb.png)

##動作イメージは下記

https://youtu.be/10bWmhak8MI


##美咲フォントは 8x8ドットのフォントなので使おうと思ったが・・・・・・

https://littlelimit.net/misaki.htm#information

横：8ドット、縦：12ドットのフォントなので、この、8x32ドットマトリックス2個の構成ではそのまま使えないのに気がついた。

##縦：8ドットのディスプレイで使用するのに便利な、MDParolaFontEditor があるので、そちらで検証してみました。

https://pjrp.github.io/MDParolaFontEditor

###MD_Parolaのサンプルに入っている「fontKatakana」を読ませると、下記のような「千」「万」「円」は標準で入っていました。

https://github.com/MajicDesigns/MD_Parola/blob/master/examples/Parola_Fonts/Parola_Fonts_data.h


![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77496/b6dfd459-d57b-8b59-4b10-6882e89c29c6.png)


##美咲フォントを読ませると、縦が12ビットで都合が良いように作ってた。

![misaki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77496/eb5a6c74-f953-9e12-704e-4acff5d53408.png)

###また、美咲フォントを使うには、90度回転させる必要があります。

#ここまで
スクロールした分だけ、NavigationBarをせり上げる

# NavigationBarをスクロールしたときに`NavigationBar`を非表示する


https://github.com/Jelly-and-removes/ClimbBar/blob/main/doc/demo.mov.gif


表題の件を実現するには、apple側で実装されている下記プロパティーを利用する

https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621883-hidesbarsonswipe

上記の方法ですと、スワイプで`NavigationBar`を非表示にすることはできますが、スワイプさせた分だけ、`NavigationBar`をせり上げることや、非表示にしていくことはできません🤦🏽‍♂️　OMG😇

そこで、下記のライブラリーを用いることでそれを実現できます。

https://github.com/Jelly-and-removes/ClimbBar

このライブラリーは[UIScrollViewDelegate](https://developer.apple.com/documentation/uikit/uiscrollviewdelegate)を用いていないので、干渉する事なく動作します。

# ClimbBar

# Overview

UITableViewやUIWebViewなどのスクロール可能な要素を持つビューを拡張できるiOSライブラリ。

スクロール可能なビューをスワイプすると、スワイプされた値が「emit」から返されます。
したがって、スクロール可能なビューをスワイプすると、それに応じて「navigationBar」が上昇します。

|github page build| status |
|:----|:------|
|result|![build](https://github.com/keisukeYamagishi/ClimbBar/workflows/build/badge.svg)|

## Gif



## Cocoapods

```
pod 'ClimbBar'
```

## git clone

***SSH経由***：定期的に直接コミットを行う予定の場合、SSHを介したクローン作成により、エクスペリエンスが向上する可能性があります（SSHキーをGitHubにアップロードする必要があります）。

```
$ git clone git@github.com:keisukeYamagishi/ClimbBar.git
```
***https経由*** ソースを読み取り専用としてチェックアウトする場合は、HTTPSが最適です。

```
$ git clone https://github.com/keisukeYamagishi/ClimbBar.git
```

## Sample code

```Swift
override func loadView() {
        super.loadView()
        title = "ViewController"
        let statusBarHeight = UIApplication.statusBarHeight
        let toHeaderBottom = statusBarHeight + (navigationController?.barHeight ?? 0)
        // 下記のクラスに範囲を指定することでその範囲内でのみスクロール値が変動するようになります
        let conf = Configuration(range: statusBarHeight ... toHeaderBottom)

        climbBar = ClimbBar(configurations: conf,
                            scrollable: tableView)

        climbBar.emit { [weak self] state in
            guard let self = self else { return }
            self.navigationController?.setAlpha(alpha: CGFloat(state.progress))
            let navigtionFrame = CGRect(x: 0,
                                        y: state.originY,
                                        width: self.view.frame.size.width,
                                        height: 44)
            self.navigationController?.navigationBar.frame = navigtionFrame
        }
    }
```

```Swift
extension UIApplication {
    static var statusBarFrame: CGRect {
        UIApplication.shared.connectedScenes
            .filter { $0.activationState == .foregroundActive }
            .map { $0 as? UIWindowScene }
            .compactMap { $0 }
            .first?
            .windows
            .filter { $0.isKeyWindow }.first?
            .windowScene?
            .statusBarManager?
            .statusBarFrame ?? .zero
    }

    static var statusBarHeight: CGFloat {
        statusBarFrame.size.height
    }
}
```
laravel 確認事項　レビューしてもらう前に見直し用メモ！

#JIRAを書くとき

入力値がある場合はテストを怠らない
ファイルでテスト内容を書く

#PRを出すとき

確認事項
・getメソッドのものはviewが必要なので、getはちゃんとリンクがひらけるかの確認
・リソースの関数名を参考にして関数名を決める
・コメントアウトして何の処理を書いたか書く

・openとcloseの位置はちゃんとなっているか

Formについて
・idはブラウザ側から送るもの
・Formで送れる値はinputタグに書いてあるものだけ

Formでidを送れる
→hidden input使う

```php
{!! Form::hidden('article_id',$articles->id) !!}
```

#php docの書き方

（例）：

```php
    /**
     * 記事詳細画面表示機能
     * @param Request $request
     * @param int $id
     * @return view 記事詳細ページ
     */
```

@parmが２個ある時は1個づつ書くと、見やすい

#エラー編

MethodNotAllowedHttpException
→POSTとかGETがちゃんと設定できているか確認する


#PR出した後
github上でよく確認すること
[SQLite3]データベース操作の基本的なSQL

前回PythonからSQLite3を操作する基本的な使い方を紹介した。
PythonからSQLを実行するためには、executeメソッドの引数にSQL文指定することで実行できる。

```python
cursor.execute(<SQL文>)
```

今回は、テータベースを操作する基本的なSQL文について紹介する。

###■ テーブルを作成
テーブルを作成する場合は、***CREATE TABLE***を使って次のように書くことができる。

```python
CREATE TABLE <テーブル名> (<カラム名 型>) 
# 例
CREATE TABLE sample_table (id INTEGER, name TEXT)    // テーブル名:sample_table
```

###■ データの追加
データを追加する場合は、***INSERT INTO***を使って次のように書くことができる。

```python
INSERT INTO <テーブル名> (<カラム名1,カラム名2...>) VALUES(値1,値2...)
# 例
INSERT INTO sample_table (id, name) VALUES(10,'ryota')  
```

###■ データの取得
データを取得する場合は、***SELECT***を使って次のように書くことができる。また、すべての列のデータを取得する場合は「***\****」を使用する。

```python
SELECT * FROM <テーブル名>
# 例
SELECT * FROM sample_table
```

###■ データの削除
データを削除する場合は、***DELETE***を使って次のように書くことができる。さらに、***where***の後に削除したいデータの条件を指定する。

```python
DELETE FROM <テーブル名> WHERE カラム名 = 値
# 例
DELETE FROM sample_table WHERE id = 10
```
【Flutter】Textウィジェットの余分なパディング(余白)を調整したい

#はじめに

Columnで２つのTextを並べた際に、PaddingやSizedBox等でマージンを入れてないにも関わらず
"合計スコア"と"190"の間に意図せぬパディングが発生しています。


![スクリーンショット 2021-11-01 14.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/dde3a0dc-6163-0af0-912e-916d744ac3d9.png)
### 該当部分のコード

```dart:sample_widget.dart
Column(
          children: const [
            Padding(
              padding: EdgeInsets.only(top: 18),
              child: Text(
                '合計スコア',
                style: TextStyle(
                    color: Colors.white,
                    fontSize: 14,
                    fontWeight: FontWeight.w500
                    ),
              ),
            ),
            Text(
              '190',
              style: TextStyle(
                  fontFamily: 'Mplus1p',
                  fontSize: 52,
                  fontWeight: FontWeight.w800
                  ),
            ),
          ],
        ),
```

# Flutter Inspecterで該当部分を見てみると...

![スクリーンショット 2021-11-01 15.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/2c1a6469-f6dd-8966-a346-7cd16269332c.png)
画像を見ると分かる通りTextウィジェットが文字と共に上下のスペースまで含んでいることがわかります。
これは特殊文字に対応するためのスペースであるため、実際にはパディングがあるわけではないようです。
そのためTextウィジェット内の空白を取ることは不可能とのこと:disappointed_relieved:

参照:https://en.m.wikipedia.org/wiki/Ascender_(typography)

# じゃあどうする？ (解決策)
TextStyleのheightプロパティに値を設定してあげることで、今回の余白を調整することができました。
参照:https://api.flutter.dev/flutter/painting/TextStyle/height.html

![スクリーンショット 2021-11-01 15.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/503300f2-9e48-22f3-34b6-4cd07ea8a338.png)

### 該当コード

```dart:sample_widget.dart
            Text(
              '190',
              style: TextStyle(
                  fontFamily: 'Mplus1p',
                  height: 1.0, // heightプロパティを追加。 任意の値を設定して調整する
                  fontSize: 52,
                  fontWeight: FontWeight.w800 
                  ),
            ),
          ],
        ),
```


#参照リンク
https://stackoverflow.com/questions/57008822/flutter-how-do-i-remove-unwanted-padding-from-text-widget
rviz立ち上げ時に設定ファイルを指定

コマンドラインからconfigファイルを指定してrvizを開くときは以下のように行います。

```
rviz -d rviz/aaaa.rviz
```

rosrunから実行する場合
```
rosrun rviz rviz -d /home/dev/catkin_ws/src/web_viz/rviz/config.rviz
```

（参考）launchファイルから、設定ファイルを指定して立ち上げ

https://qiita.com/hoshianaaa/items/1c84039d3ab7324ec9d4
【初心者】アップロードサイズ上限の変更方法｜AWSのlightsailのWordPressで

AWSのlightsailのWordPressのメディアへ大きめのファイル（動画とか）をアップロードしようとした際に、「このサイトのアップロードサイズ上限を超えています。」というエラーが出た場合の対処方法についてです。

「wordpress　アップロードサイズ上限」とかでググると、`.htaccess`に追記したりやら、`php.ini`を変更したりやら、色々と方法が出てきます。

では、**AWSのlightsailのWordPressの場合**は、どうすればよいか...


# 答え
[How can I increase the PHP upload size limit in my Lightsail Bitnami WordPress instance?（Lightsail Bitnami WordPress インスタンスで PHP のアップロードサイズ制限を増やすにはどうしたらいいですか？　）](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lightsail-bitnami-wordpress-upload-limit/)

# ざっと手順
## 1）「php.ini」の一部変更
`php.ini`のある場所は`/opt/bitnami/php/etc/php.ini`です。

## 2）「post_max_size」と「upload_max_filesize」の変更

```ini:php.ini
; デフォルトの値
; 694行目付近
post_max_size = 40M

; 846行目付近
upload_max_filesize = 40M 

```

デフォルトでは、`post_max_size`も`upload_max_filesize`も、`40MB`となっています。この値を、任意の数値へ変更してください。

```ini:php.ini（例）
post_max_size = 128M
upload_max_filesize = 64M
```

注意点は`post_max_size`の値が`upload_max_filesize`の値以上であること。

```txt:注意点
post_max_size >= upload_max_filesize ※注意！
```

`upload_max_filesize`は、1つのファイルあたりの最大アップロードサイズで、

`post_max_size`は、アップロード1回あたりのファイル合計サイズの制限のこと。

`php.ini`を書き換えたら保存。

## ３）インスタンスの再起動
次のコマンドでサーバーを再起動してください

```terminal:terminal
$ sudo /opt/bitnami/ctlscript.sh restart
```

## 4）確認
`ツール > サイトヘルス > サーバー` の中で変更後の`upload_max_filesize(アップロードの上限ファイルサイズ)`と`post_max_size(PHP POST サイズ上限)`を確認できます。

![img1111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/ffc87404-d010-4a11-ac9c-8af896afcc16.png)
vue.js gtmでgoogle広告のコンバージョン測定

Googleを出稿してコンバージョンを測定したい。

参考

https://qiita.com/ma7ma7pipipi/items/c07b4a85a2b597b58e78

https://www.kwm.co.jp/blog/cv_tag_setting2019/

# 1 サンクスページを作成

今回は、以下のページにユーザーがアクセスしたらコンバージョンとする。

pro-nail.me/info-nailist?gtm=on


https://pro-nail.me/info-nailist?gtm=on

# 2 サンクスページの設定

GTM管理画面
https://tagmanager.google.com/#/home

トリガー > 新規 > トリガーの設定 > ページビュー > 一部のページビュー

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/199b82bd-f974-ff2f-467d-f781d3c72268.png)



page url 含む info-nailist?gtm=on

とする。

# 3 コンバージョン完了を設定

タグ > 新規 > タグの設定 > コンバージョンリンカー

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/bfead3ef-db4d-f2b6-21eb-e0a77b3e1c7f.png)

# 4 Google広告の設定

ツールと設定 > 測定 > コンバージョン
でコンバージョンを作成する

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/12a8f543-7a70-d6fb-7be1-15b93f8d6ae7.png)


作成後に表示される
Googleタグマネージャーを使用するをクリックして

・コンバージョンID
・コンバージョンラベル

の2つをメモ

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/a09b9fc3-5673-1868-1d5a-124ba639e8fd.png)

# 5 GTM側での作業


タグ > 新規 > Google 広告のコンバージョントラッキングを選択

コンバージョンID
コンバージョンラベルを

それぞれ入れる。

トリガーは②のトリガーを設定。

`OK`

# 6 公開

ここまでで、
・コンバージョンリンカータグが全ページに追加
・url に `info-nailist?gtm=on` があればコンバージョンとなる

それでは公開

![koukai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/bda49fc9-e49b-d28d-0bf8-4046d124b34d.png)



# 7 嬉し恥ずかしお役立ち情報

GTM管理画面のプレビューを押せばデバッグができる。
（ちゃんとタグが有効かどうかチェックできるよ）

Google広告側のコンバージョンのステータスが

`未確認`

だった場合サンクスページに直接アクセスすれば
`最近のコンバージョンはありません`
に切り替わる。
[卒業済み]テックキャンプを学んでみて。

テックキャンプ103期生です。！8月15日に卒業して今回無事に就職が決まったので、テックキャンプに入ってからの感想を書き残しておきたいと思います。
私は学生のことからプログラミングに興味があったのですが経済的に厳しくプログラマーの道を一度は断念しました。
ですが諦めきれず26歳夏頃に決心してテックキャンプ（短期集中オンライン）への入学をいたしました。！
最初の頃は何も分からず不安で同じチームのメンバーと仲良くやっていけるかなど不安要素が多くビクビクしながら入学しました。（笑）
しかし、日数を重ねていく上でそんな不安も解消されていき、メンバー達とも仲良く勉強会を開いたりなどするほど仲良くなれました。！

学習面ではプログラミングは難しい認識がすごくあったのですが実際にやってみて最初の頃は難しかったです。！ですが、慣れとでも言うのでしょうか？やって行く上で分からない所はメンターさんがしっかりと教えてくれるので安心して勉強することができました。
勉強方法やメンタルが辛い時などライフコーチさんに相談するとしっかりと対応して頂き、どうすれば良いかなど解決策などを一緒に考えてくれたりしてすごく助かりました。
学習して行く上でカリキュラムに乗っていない部分を独学で勉強することが大事だと思い勉強をしてみたのですがこれが意外と難しかったです。
その面でチームメンバーのは凄く助けられました。
今思えばライフコーチさんいなかったら心折れてたかもしれませんね。（笑）

そして8月15日に無事に卒業。！卒業後はチームのメンバーとzoomを使って飲み会でした。！テックキャンプじゃければチームの皆んなと会えてなかったと思うと感謝の気持ちでいっぱいです。！
卒業後は、周りは就職が決まって行く中で私は中々に決まりませんでした。
私は東京ではなく地方で探していたのですが地方で未経験を雇ってくれるところが中々に少なく心が折れかけていました。。。。
キャリアアドバイザーの方が一緒になって最後まで探してくれたおかけで今回、地方での開発に就職することができました。
もし将来プログラマーを目指している方で地方勤務の希望の方などいましたら諦めずに探してみてください。！
卒業生の方も諦めずに探してみると意外とあるもんですよ。！笑

テックキャンプに入り良かったと思います。！無事就職もでき夢に向かって進むことができるようになりました。！
もし、オンラインスクールを探している方がいるのであればテックキャンプおすすめです。！

以上！私の感想でした。
PowerBI パラメーターで「〇〇以上〇〇以下」をする

#PowerBIのパラメーターを使ってフィルターをかける
品質管理の方からの、ダッシュボード作成依頼がきっかけ。
「Aの指標は〇〇以上、Bの指標は〇〇以下のデータが見たい」
「パラメーターをクライアント側で調整できるようにしたい」

これをPowerBIならパラメーターで実現できた。
Excelなら「フィルターの詳細設定」あたりでできそう。

#パラメーターを表（マトリックス）に使う
今回は、「__気温〇〇度以上、湿度〇〇度以下__」を
指定できる表を作ってみる。

##データを用意する
日別の気温と湿度のデータを用意する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/b48be44e-ef07-7368-8fbd-561d6d0ddbf6.png)
ExcelのRAND関数で用意したので正しい季節性はない。
PowerBIに取り込んでおく。

##パラメーターを作る
今回は__気温用__と__湿度用__のパラメーターを2つ作る。
モデリングのタブから、新しいパラメーターをクリックする。
![pbi01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/c06364f8-1753-a00f-f013-76b16d419b14.png)

すぐにポップアップが出て、初期値は以下が入力されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/ec20aac4-54d0-1cda-7473-bd6b7db0bcb2.png)

増分を10にしたり、既定値を20にしたり、好きなように設定できる。
2つ作るとフィールドにはこのように作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/b972084d-7217-3068-0d40-17bdfac6e9bc.png)

```
パラメーター = GENERATESERIES(最小値, 最大値, 増分)
パラメーター 値 = SELECTEDVALUE('パラメーター'[パラメーター], 既定値)
```
「パラメーター 値」の名前を変更して使用することも可能。
「このページにスライサーを追加する」をチェックすると
レポートにスライサーが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/c7230486-316f-bde1-0ff3-e154ac51598e.png)
フィールドにおくパラメーターを変更することもできるので、
2回目以降はスライサーは新しく作らず、
書式を固めたらコピーしてフィールドを変更する方が楽だと思う。

今回は、以下のようにした。

・温度用（0～70℃までを、1℃ずつ指定できる。規定は30℃）

```
パラメーター = GENERATESERIES(0, 70, 1)
パラメーター 値 = SELECTEDVALUE('パラメーター'[パラメーター], 30)
```
・湿度用（0～100％を1％ずつ指定できる。規定は50%）
※ユーザーが入力しやすいよう整数にしたが、10進数も可能。

```
パラメーター 2 = GENERATESERIES(0, 100, 1)
パラメーター 値 2 = SELECTEDVALUE('パラメーター 2'[パラメーター], 50)
```

##表（マトリックス）を作っておく
視覚化からマトリックスを選び、表示したいフィールドを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/591fdcf3-a789-26b2-c338-86d21eb2215f.png)

##作ったパラメーターを入力できるようにする
スライサーの書式をお好みに変更して、マトリックスの近くに設置する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/a90c3537-236c-634a-72a1-d2727a04e87e.png)
説明のテキストボックスと、スライサーを2つ並べてみた。

##絞り込み用のメジャーを作る
パラメーターを使ってフィルタリングできる仕組みを作る。
先ほど用意した、「パラメーター 値」と「パラメーター 値 2」を使う。

```
tmp_prm = IF( 
                    AND(
                        sum(data[気温]) >= [パラメーター 値], 
                        sum(data[湿度]) <= [パラメーター 値 2]/100
                        ), 
                    sum(data[気温]), 
                    BLANK()
                    )
```
解説すると、
①AND関数で、以下を確認してBool値を取得。
・気温 が パラメーター　値  より大きいか
・湿度 が パラメーター　値 2より小さいか
②TRUEの時は「気温」を表示（湿度や、「1」でもよい）
③FALSEの時はBLANK（空白）を表示

##表（マトリックス）に反映させる。
先ほど作った「tmp_prm」を
マトリックスのフィルターに追加し、「__空白でない__」にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/6f31e77e-df3f-7d9b-d2a8-7492ca5e1832.png)

#結果
「__気温〇〇度以上、湿度〇〇度以下__」の日付が特定できるようになった。
![goo dd(ss1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217989/00a17c49-beaa-0d94-76fb-d431d972c182.gif)
もっといいやり方がある気がしつつも、
急いでいる人にはおすすめ。
docker-compose ログの確認方法

#背景
Docker-compose を使用してコンテナを作成する場合、うまくいかない時は多々あると思います。
その時に確認するのがログです。今回はログをすぐ確認するための方法について書きました。

#確認方法
```
docker-compose logs 
```

これで作成したサービス全てのログを確認することができます。
特定のサービスのみ表示したい場合はサービス名を追記する必要があります。

```
docker-compose logs サービス名
```

なお、サービス名はdocker-compose.yml に記載してあるものです。

例としてdocker-compose.yml にてrails mysql nginx と３つのサービスを作成した場合で考えてみます。nginx のログが確認したい場合、はどのようになるでしょうか。

```docker-compose.yml
version: '3'
services:
  app:
    build: rails
    tty: true
    environment:
      APP_DATABASE_HOST: db
      APP_DATABASE: app_development
      APP_DATABASE_USER: root
      APP_DATABASE_PASSWORD: ***
    depends_on:
      - db
  db:
    build: mysql
    environment:
      MYSQL_ROOT_PASSWORD: ***
  web:
    build: nginx
    ports:
      - 80:80
    depends_on:
      - app
```

上記の場合、nginx のログが確認したい場合は以下のようになります。

```
docker-compose logs web
```

これでnginx のログのみ表示できます。
ログを見ることは必ずといってあるので、素早く確認することが大切です。

自分も細かい操作を忘れてしまうので、備忘録として書きました。
本番環境で写真投稿をすると500エラーが出る

##使用技術
Rails6.0.3
nginx
puma
AWS s3

##発生した問題
本番環境で写真投稿をすると何故か500エラーが出てしまい、またnginxのログなどをみても何も表示されない。

##やったこと
まず初めにaws s3のセッティングができていなかったのでそれをいろいろな記事をみて実装した。しかしそれでも写真を投稿することができず、同じエラーに見舞われた。

##解決方法
いろいろ調べているうちにこの記事（ https://fuen-works.hatenablog.jp/entry/2018/04/18/100154 ） に出会った。ここには/etc/nginx/nginx.confの所有者と/var/lib/nginxの所有者を一致させることで解決したと書いてあり、僕の場合、前者はec2-user、後者はrootになっていたので、それをこの記事をみながらコマンドで修正したところいきなり写真を投稿できるようになってしまった。

##感想
まったく何がどのように動作して今回の問題が発生したのか全くわからずの解決だったがとりあえず写真がアップできて嬉しいです笑。デプロイは今回が初めてで、開発環境では当たり前に動いていなかった物がいきなり動かなくなったりといろいろ苦労しました。この問題を持って全て解決したので一つ目のポートフォリオ完成しました!
Xcode13のインストールが終わらない

Xcode13の インストールが終わらないため何度も再起動したが、それでも終わらない。

Xcodeのインストールの進捗状況を確認できれば何かわかるかもと調べたら、
下記のファイルにインストール進捗状況が出力されているようです。

かなりの時間がかかるがインストールが進んでいる状況が分かって、Xcodeインストール完了。

```
 /var/log/install.log
```
【mt4/mql4】口座情報（証拠金、残高、ほか）を表示する

 はじめに

システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
証拠金額や残高など、様々な口座情報を表示させる方法です。
実際には、有効証拠金や残高などを使ってロット単位のロジックを組むケースが多いと思いますが
まずはざっと関連情報を表示させ、ログにも残すことで
その後の挙動解析などをやりやすくすることが必要かと思ってます。


ちなみに、稼働させるとMT4のコンソールにはこんな感じで表示されます。
56万くらい入れてるテスト用口座です。ちなみにoandaでポジション無し時

![test.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2204212/e6ee7e4f-6207-e050-9e9d-554561a412ab.png)


<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらがソースコードです。
int OnInit()の中でなくてももちろん動きますが、EA設定時の最初に出力しておいたほうが使いやすいと思います。（ログの追跡などにも）


```c++:test.mq4

int OnInit()
  {
//---口座情報出力
   printf("口座残高/ACCOUNT_BALANCE: %G",AccountInfoDouble(ACCOUNT_BALANCE));
   printf("クレジット/ACCOUNT_CREDIT: %G",AccountInfoDouble(ACCOUNT_CREDIT));
   printf("評価損益/ACCOUNT_CREDIT: %G",AccountInfoDouble(ACCOUNT_PROFIT));
   printf("有効証拠金/ACCOUNT_EQUITY: %G",AccountInfoDouble(ACCOUNT_EQUITY));
   printf("必要証拠金/ACCOUNT_MARGIN: %G",AccountInfoDouble(ACCOUNT_MARGIN));
   printf("余剰証拠金/ACCOUNT_FREEMARGIN: %G",AccountInfoDouble(ACCOUNT_FREEMARGIN));
   printf("証拠金維持率(%%)/ACCOUNT_MARGIN_LEVEL: %G",AccountInfoDouble(ACCOUNT_MARGIN_LEVEL));
   printf("マージンコールレベル/ACCOUNT_MARGIN_SO_CALL: %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL));
   printf("マージンストップレベル/ACCOUNT_MARGIN_SO_SO: %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_SO));
   printf("ログインID/ACCOUNT_LOGIN: %d",AccountInfoInteger(ACCOUNT_LOGIN));
   printf("トレードモード/ACCOUNT_TRADE_MODE: %d",AccountInfoInteger(ACCOUNT_TRADE_MODE));
   printf("レバレッジ/ACCOUNT_LEVERAGE: %d",AccountInfoInteger(ACCOUNT_LEVERAGE));
   printf("注文上限/ACCOUNT_LIMIT_ORDERS: %d",AccountInfoInteger(ACCOUNT_LIMIT_ORDERS));
   printf("アカウントマージンモード/ACCOUNT_MARGIN_SO_MODE: %d",AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE));
   printf("アカウントの取引許可/ACCOUNT_TRADE_ALLOWED: %d",AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
   printf("EA取引許可/ACCOUNT_TRADE_EXPERT: %d",AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
   printf("アカウント名/ACCOUNT_NAME: %s",AccountInfoString(ACCOUNT_NAME));
   printf("アカウントサーバー名/ACCOUNT_SERVER: %s",AccountInfoString(ACCOUNT_SERVER));
   printf("口座標準通貨/ACCOUNT_CURRENCY: %s",AccountInfoString(ACCOUNT_CURRENCY));
   printf("口座開設会社/ACCOUNT_COMPANY: %s",AccountInfoString(ACCOUNT_COMPANY));
   
//---
  }
```



皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です
【MySQL】MySQLでCSVファイルを読み込もうとした時に、--secure-file-priveエラーが発生した時の対処法

## エラー内容

LOAD DATA INFILEコマンドでCSVファイルを読み込もうとしたら下記エラーが発生する。

```
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

## 開発環境
OS：Mac M1（BigSur11.5.2）
MySQL:5.7.34

## 解決法
secure-file-priv optionの設定を確認。

```
mysql> SELECT @@global.secure_file_priv; 
 
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+
```
ここがNULLなのが良くないらしいです。
修正するためにはmy.cnfファイルの編集が必要ですが、MySQLのバージョンによって設定方法が異なります。


MySQLのバージョンを確認。

```
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.34    |
+-----------+
```

5.7以降:自身でmy.cnfファイルを新規作成&設配置する必要があります。

ファイルパス

```
/MAMP/conf/my.conf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2054587/d5d85f9c-b99f-82a4-a0b0-8711dbb60923.png)


ファイルに記載する内容

```
[mysqld]
secure-file-priv = ""
```


配置できたら**「MySQLを再起動」**すること。
（MAMP右上の"stop"→"start"を押せばOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2054587/d684ef92-3d4c-32c3-f2a9-db259f55b578.png)

再度設定を確認すると、NULLがなくなりました！

```
mysql> SELECT @@global.secure_file_priv;   
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
|                           |
+---------------------------+
```
LOAD DATA INFILEコマンドも無事実行できました。




>
参考：[【MYSQL】データをエクスポートしようとしたらsecure-file-privがどうのこうのって言われたときの対処法](https://qiita.com/chatrate/items/f29569a6d25df940d522)
参考：[MAMP(MacOS)でのmy.cnfファイルの作成方法](https://qiita.com/yyy752/items/60d00ce945b58e48fde0)
【Jetpack Compose】ロングタップ時に Ripple Effect を表示する方法

Jetpack Compose で任意の Composable にロングタップ時の操作をさせたい場合について、公式では下記のように記載されています（2021 年 11 月 1 日時点）。

```kotlin
Modifier.pointerInput(Unit) {
    detectTapGestures(
        onLongPress = { /* ロングタップ時に呼ばれる */ }
    )
}
```

引用元：[操作  |  Jetpack Compose  |  Android Developers](https://developer.android.com/jetpack/compose/gestures#tapping)

ですが、これだとロングタップ時に Ripple Effect が表示されず、どこがロングタップされたのかがわかりづらいです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/ff8aaa79-e64f-b59e-1f0d-a38ea4011302.gif" width="300" />

# 解決方法

`Modifier.combinedClickable`を使用してください。
[Compose Foundation  |  Android デベロッパー  |  Android Developers](https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=ja)

```kotlin
Modifier.combinedClickable(
    onClick = { /* タップ時に呼ばれる */ },
    onLongClick = { /* ロングタップ時に呼ばれる */ }
)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/9b7d14d7-32f0-b67d-ad3b-b87e3b2ad4da.gif" width="300" />

`Modifier.combinedClickable`では、ロングタップ時に加えて通常のタップ時の処理も記載できます。

ただし、この関数は`@OptIn(ExperimentalFoundationApi::class)`を付与しないと使用できないため、将来的に変更や削除の可能性があります。
導入の際は慎重に検討してください。
Firebase JS SDK 9の新スタイルへの移行は必須？いつまでに完全移行するべきなのか？

久々にFirebase WEB SDKをインストールすると、SDK Versionが9.Xになっていました。
どうやらmodularスタイルの追加など、推奨される書き方が従来のやり方と大幅に異なります。

https://qiita.com/kiyopikko/items/f1da74f4f921ea778a61

わざわざ破壊的変更を予定していることを考えると、この変更はFirebaseコミュニティ全体に相応のメリットがありそうです。

しかし、**変更する必要はあるのでしょうか**。例えば、古いバージョンを使えばいいのでは？
なるべく学習コストを最小にしたいので、もし必要なければ現状維持をしたいのが人間の性。



# TL; DR

### 公式ドキュメントでは9.Xへの移行が強く進められている。

https://firebase.google.com/docs/web/modular-upgrade?hl=en

>Apps currently using Firebase Web SDK version 8 or earlier should consider migrating to version 9 using the instructions in this guide.


### 互換性はいずれ削除される
また、将来のメジャーリリースでは、8.Xのスタイルのコードの互換性は削除されると記述されている。
2021/11/01で現在では9.Xには8.Xスタイルとの互換性が保持されているが、これは一時的な策であるとのこと。

>Keep in mind: the compat libraries are a temporary solution that will be removed completely in a future major SDK version (such as version 10 or version 11). Your ultimate goal is to remove compat code and keep only version 9 modular-style code in your app.

# いつまで8.Xのスタイルが利用できるのか(予想)

過去のリリースノートを参考にしましょう。

https://firebase.google.com/support/release-notes/js


```:過去のメジャーバージョンのリリースのタイミング
Version 9.0.0 - August 25, 2021
Version 8.0.0 - October 26, 2020
Version 7.0.0 - September 26, 2019
Version 6.0.0 - May 7, 2019
Version 5.0.0 - May 8, 2018
```

メジャーバージョンが１つ上がるごとに平均で`301.25 days`経過しています。

互換性の削除が行われるタイミングは
>such as version 10 or version 11
であると公式ドキュメントに書いていることを念頭に置くと


```:10.X,11.Xの出るタイミングの予想
10.0.0: 2022/06/22
11.0.0: 2023/04/19
```

ということで、naiveな予測になりましたが、

シナリオA. 2022年の6月頃
シナリオB. 2023年の4月頃

には9.Xで登場した**新しいスタイルに移行しないヤバイかもしれない**ということが示唆されましした。


# 免責
この予測はあくまで過去５年間の傾向に基づく個人的な予測です。
この予測に従ったことによりプロジェクトに生じる出来事に関しては責任は負いかねます。

また、もっと信頼できる予測がありましたら、コメント欄などでお教えいただけますと幸いです🙏😭😂
Ubuntu18 ローカルサーバーの時刻を手動で変更する方法


# 環境
Ubuntu 18.04 LTS

# はじめに
ローカルサーバーでNTPサーバーが無い環境だと、時刻が少しずつずれていきます。
その時刻を手動で修正するための記事です。
タイムゾーンを設定する記事は多くありますが、時刻設定をする記事はあまり見かけないように思います。
本記事では、以下の条件での時刻設定を対象としています。

- インターネットに繋がっていない
- NTPが設定されていないし、使用しない
- 他の現在時刻とずれている
- タイムゾーン設定は正しい
- date -s　コマンドで設定したのに時刻が戻ってしまう

NTPが設定されていない状態とは、以下の状態です。

```bash
sudo cat /etc/systemd/timesyncd.conf

[Time]
#NTP=
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
```


## 失敗するコマンド

date -s では、成功した感じなのに実際の時刻が変更されません。

```
$ sudo date -s "11/1 12:10 2021"
$ date 
Mon Nov  1 12:33:52 JST 2021
```

timedatectl set-time では、Failedが表示されます。
"Automatic time synchronization is enabled"が表示されていたら、今回の方法が効くと思います。

```bash
$ sudo timedatectl set-time "2021-11-01 12:50:00"

Failed to set time: Automatic time synchronization is enabled
```


#設定方法

##自動時刻同期を確認する

```
$ timedatectl status
                      Local time: Mon 2021-11-01 12:54:41 JST
                  Universal time: Mon 2021-11-01 03:54:41 UTC
                        RTC time: Mon 2021-11-01 03:54:41
                       Time zone: Asia/Tokyo (JST, +0900)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no
```

- System clock synchronized: yes
- systemd-timesyncd.service active: yes

この部分が、自動時刻同期がオンになっている事を表しています。
UbuntuではNTPの設定をしなくても、時刻同期がされるようです。

##自動時刻同期をオフにする

```bash
$ sudo timedatectl set-ntp no
```

##timedatectlで時刻を設定する

timedatectl set-time　以下のように時刻を変更します。
その後、timedatectl status で設定結果を確認します。

```bash
$ sudo timedatectl set-time "2021-11-01 12:10:00"
$ timedatectl status
                      Local time: Mon 2021-11-01 12:10:05 JST
                  Universal time: Mon 2021-11-01 03:10:05 UTC
                        RTC time: Mon 2021-11-01 03:10:05
                       Time zone: Asia/Tokyo (JST, +0900)
       System clock synchronized: no
systemd-timesyncd.service active: no
                 RTC in local TZ: no
```

- Local time に設定したかった時間が入っている事
- RTC time: Mon 2021-11-01 03:10:05 がUTCの時間と合っている事
- System clock synchronized: no　になっていること
- systemd-timesyncd.service active: no になっていること

これで、時刻設定が出来ました。
再起動しても、設定後の時刻で動いています。

##失敗例

時刻設定時にdate -s を使用すると失敗します。

```bash
sudo date -s "11/1 12:10 2021"

$ timedatectl status
                      Local time: Mon 2021-11-01 12:10:06 JST
                  Universal time: Mon 2021-11-01 03:10:06 UTC
                        RTC time: Mon 2021-11-01 04:09:19
                       Time zone: Asia/Tokyo (JST, +0900)
       System clock synchronized: no
systemd-timesyncd.service active: no
                 RTC in local TZ: no
```

RTC time と　Universal time がずれているのがわかります。
この状態ですと、再起動時にRTC timeを基準にした時間に戻ってしまいます。
【RubySilver対策】Ruby特化のクイズサービスを作りました。

#はじめに

ポートフォリオとしてRubyの問題を提供するクイズアプリ**『RubyMania』**をリリースしました。
資格勉強でなくてもご利用頂けるかと思います。

https://www.rubymania.info

私自身プログラミング未経験ではございますが、学習を始めて5ヶ月くらいの頃にRubyを体系的に学んでみたいと思ったのがきっかけでRubySilverとRubyGoldを取得させて頂きました。　　

RubySilverとRubyGoldを取った時の話はまたどこかで記事に出来ればと思います！

当時資格を勉強していて感じた事としては、  
①知ってるメソッドが一つ増えると読めるコードが増えるので勉強が楽しい
②初学者が資格取るとモチベーション上がってもっと頑張ろうって思える
③でも資格教本の問題やネットにある問題をやり尽くしてしまってこれ以上どうして良いか分からない
④しかも答えと問題を暗記してしまってこれ以上どうして良いか分からない

そんな楽しさの共有と悩みを持つ方の一助となれたら嬉しいなと思ってこのサービスを作りました。  

難易度としては
①Progateで勉強しててRuby何となくわかった！
②自分の理解度の確認で少し肩慣らししたい！
という方に向けてなので初学者寄りの難易度となっています。

※オブジェクト指向というカテゴリーは少し難易度が高いかもしれません。

#サービス概要

ご希望のカテゴリーを選択して問題を解いて頂くことができます。
ログイン不要なのでお気軽にチャレンジしてみて下さい。

現状実装したカテゴリーは. 
①文字列(String)
②数値(Integer)
③配列(Array)
④ハッシュ(Hash)
⑤基礎編総合
⑥オブジェクト指向
⑦正規表現(Regexp)
と７つのカテゴリーを実装しました。

問題は毎回ランダムに出題されて10問形式と一問一答形式を選ぶことが出来ます。
[![Image from Gyazo](https://i.gyazo.com/675f1709f4d349dd32e082d706703bd5.gif)](https://gyazo.com/675f1709f4d349dd32e082d706703bd5)

#Githubログイン
このアプリはGithubログインを採用しております。
githubログインして頂くと下記のメリットがございます。

①自身の今までの記録や点数がチャート上に反映されます。
②レベルアップ機能があります。
③それぞれのカテゴリーでご自身の偏差値も確認することが出来ます。

[![Image from Gyazo](https://i.gyazo.com/a33f9721c0f176d02e7b6d24e20b775c.gif)](https://gyazo.com/a33f9721c0f176d02e7b6d24e20b775c)
本気で受験を希望している方や、勉強したいという方は是非ログインして遊んでみてください！

# こだわったポイント

### ①問題作成周り
一番気合と根性が必要だったのが問題作成周りです。

総問題数は350問を超えるのですが問題数と解説を350問考えて選択肢を一つも問題につき４つ考えます。
最も楽しかった反面苦労したポイントの一つです。

### ②トップページ

パッと見て面白そう！と思ってもらえることを意識して作成しました。
スライダーでくるくるさせたりフワッと要素を出現させたりしてなるべく見た目を楽しく整えました。

ここでは
①swiper.js
②ScrollReveal.js
③Chart.js
④particles.js
を使用しています。
[![Image from Gyazo](https://i.gyazo.com/cdf691417abbb71a2cc16848a05c5a04.gif)](https://gyazo.com/cdf691417abbb71a2cc16848a05c5a04)

### ③問題がカテゴリー毎にランダムに生成される

自分の以前の悩みとして問題の順番が定型化していて問題と答えを暗記してしまうという悩みを抱えていました。

なのでなるべくカテゴリーを分けて毎回ランダムに問題が解ける様にしています。
これでも何回もやれば暗記してしまうことは必至ではありますがなるべく暗記出来ないように実装させて頂きました。


#使用技術やGem等
###主な技術
Ruby 3.0.2
Rails 6.1.4
Bootstrap5
JavaScript
jQuery

###主なGem
sorcery
meta-tags
draper
seed_fu
等

###ER図
[![Image from Gyazo](https://i.gyazo.com/c1ffbeb25e6e504b17ab5ce0dc385791.png)](https://gyazo.com/c1ffbeb25e6e504b17ab5ce0dc385791)

#最後に

特に初学者の方は勉強していて分からなさすぎて自信が無くなってしまったり、どうして良いか分からない、効率の良い勉強方法はないか、色んな悩みあると思います。

でもまずは脳死でとにかくテキスト読むだったりごちゃごちゃ考えないでとにかく勉強ってスタンスも時には大事だと思います。

そんな時は是非**RubyMania**で遊んでみてください。
脳死でメソッド覚えましょう。

https://www.rubymania.info


またこのポートフォリオに関しては設計の段階から様々なアドバイスを頂き、何とかリリースをすることが出来ました。
使用した感想や、バグを発見して下さった皆様本当にありがとうございます。

このサービスを通して少しでも資格取得の役に立ったり初学者の方の自身に繋がると嬉しいです！
自分もまだまだ向上心を持って勉強頑張ります！

最後までご覧頂きありがとうございました！
2021Google PlayストアアプリリリースUnity

GooglePlayアプリリリースに苦戦したので、試したことをまとめておきます。

・ARM64オン
・AABオン
・IL2CPP選択、x86オフ
・AndroidStudioをインストール
・AndroidStudioでAPI30をインストール
・Unityで対象API30選択
・Unityでsdkファイルパス指定
・AndroidStudioでsdkをダウングレード（最新のものは壊れているらしい）
・キーストア

以上でできました。
【Javascript】即時関数から見る, Javascriptの関数の宣言と式と文法など

即時関数はこのようなものですね

```js
// function
(function () {
    console.log("foobar");
})();

// アロー
(() => {
    console.log("foobar");
})();
```

ワンセットで覚えても良いですが, それでは応用が効きませんし, 何よりJavascriptの関数の文法理解が進んでいません. というわけでこれを分解してみます.

## 構造

```js
//  ↓   関数本体  ↓   ↓呼び出し
  ( function () {} )()
//↑   関数式を評価  ↑

// 改行する
(
    function () {
        // ...
    }
)() // ← この()が関数の呼び出し
```

つまり, 関数本体と, それを囲む括弧と, その関数を呼び出すための括弧で構成されています.

## 最初の括弧の役割

```js
//↓   ここ  ↓
  ( /*...*/ )();
```

この括弧は, `( 式 )` という構造をとります. この括弧は演算子であり, `( 式 )`とすることで四則演算のときと同じように評価され, 結果が返ってきます. 即時関数を使うには, この**評価される**というのが非常に重要です.

### functionの場合

`(1)`の結果が1,  `( 数値 )`は入れた数値そのものが返ってくるように, `( 関数 )`とすればその関数が返ってきます. そのまま同じものが返ってくるのであれば括弧を省略できそうな雰囲気があります.

```js
function () {
    // ...
}();
// Uncaught SyntaxError: Function statements require a function name

function a() {
    // ...
}()
// Uncaught SyntaxError: Unexpected token ')'
```

しかし, これはできません. 無名関数とするには, その関数が式として評価される必要があり, 関数宣言として評価されてしまうと無名にできません. 

式の場合, すぐに呼び出す, 代入によって後から間接的に名前が付くなどあります. しかし, 関数の宣言としか評価できない場合は名前がないと使えないためです.

```js
function a() {} // 関数の宣言. 名前が必須

{
    function b() {} // 関数の宣言 名前が必須
}

(function () {}) // 括弧内は式 名前が不要. (function a() {}) も文法上は可. やらないけど.

hoge(function() {}, ...) // 実引数はそれぞれが式 名前が不要. ちなみにカンマ(,)も演算子. コールバック関数入れたりはこれ

const fuga = function () {}; // = の右辺は式
```

また, 関数が式の場合, 評価されると関数が作成されます. しかし, `function a() {}()`は式として評価しきっていないのに呼び出そうとしている状態で, 文法上間違いです (若干語弊があるかもその1). 

呼び出せる状態にするためにはどうすればよいかというと, 関数の式を評価したものを利用すれば良いです (若干語弊があるかもその2).

```js
function a() {
    return function () {}; // 返すときに評価される
}
a()(); // returnで評価済みのものを () で呼び出せる
const c = a(); c(); // 代入時に右辺を評価して, その結果をcに代入. それをc()で呼び出し

const b = function () {}; // 代入時に評価される
b(); // 評価されたものが入っているので呼び出せる

(function () {})() // 括弧はその中を評価するので, 括弧の外では評価済みになる. そのため, (関数)()で呼び出せる. 即時関数!!!!
((((function () {}))))() // もちろん評価済みをもう一度評価しても良いのでこれもいける. 限界を知りたいが, 限界を知った記事があったような気がする
```

### アロー関数の場合

アローの場合, functionと違って必ず式になります. 宣言ではないため直接名前をつけるのは無理で, 代入をすることで間接的に名前をつけます.

```js
() => {}; // 式

{
    () => {}; // 式
}

(() => {}); // 括弧内は式

hoge(() => {}); // 実引数は式

const fuga = () => {}; // = の右辺は式
```

functionと同様に, 式として評価してしまえば同じように括弧をつけると呼び出せます.

```js
function a() {
    return () => {}; // 返すときに評価される
}
a()(); // returnで評価済みのものなので () で呼び出せる

const b = () => {}; // 代入時に評価される
b(); // 評価されたものが入っているので呼び出せる

(() => {})() // 括弧はその中を評価するので, 括弧の外では評価済みになる. そのため, (関数)()で呼び出せる. 即時関数!!!!
((((() => (() => (1)))))())() // ひええええ
```

## 応用

即時関数は, 関数を作ってすぐに呼び出している, という構造であると把握すれば少し応用がききます.

```js
const hoge = 100;

((foo) => {
    const fuga = foo + 200; // 100 + 200が代入される
})(hoge)
```

これは,

```js
(foo) => {
    const fuga = foo + 200;
}
```

という関数がまずあって, これを `( 関数 )`で評価し, `(hoge)`で呼び出している, という構造だとわかります. jQueryで`$`が衝突するときにたまに使うことがあると思います.

また, 次の2つはhogeという名前の変数を作る以外の挙動が同じです (多分速度が違うとかは無しで). というよりステップを増やしただけです

```js
// 代入して呼び出し
const hoge = (a) => { console.log(a); }
hoge(5);

// 即時関数
((a) => {
    console.log(a);
})(5);
```

## さいごに

院時代に研究でJavaのASTを触っていましたが, すでに色々とうろ覚え状態だったので間違っている部分があるかもしれません. ご指摘いただけると嬉しいです.

プログラミング始めたてだと, 関数の呼び出し結果ではなく, 本体を代入できることを知らなかったりすると思いますし, 自分がそうだった時代が懐かしいです.