OmniAICreator/Qiita-1.07M huggingface dataset:
GateIoライブラリを使ってみる

#### GateIoライブラリを使ってみる

https://github.com/gateio/gateapi-csharp

Nugetから必要なライブラリをインストールする

```
RestSharp - 106.10.1 or later
Json.NET - 12.0.1 or later
JsonSubTypes - 1.5.2 or later
System.ComponentModel.Annotations - 4.5.0 or later
```

#### RestSharpバージョン107にはRestSharp.Deserializersがない

RestSharpバージョン107にはありませんでした。バージョン106を使います。


```c#
using System;
using System.Diagnostics;
using Io.Gate.GateApi.Api;
using Io.Gate.GateApi.Client;
using Io.Gate.GateApi.Model;

namespace GateioApp
{
    class Program
    {
        static void Main(string[] args)
        {
          
            Configuration config = new Configuration();
            config.BasePath = "https://api.gateio.ws/api/v4";
            var apiInstance = new SpotApi(config);
            var currencyPair = "ETH_BTC";  // string | Currency pair

            try
            {
                // Get details of a specifc order
                CurrencyPair result = apiInstance.GetCurrencyPair(currencyPair);
                Console.WriteLine(result);
            }
            catch (GateApiException e)
            {
                Debug.Print("Exception when calling SpotApi.GetCurrencyPair: " + e.Message);
                Debug.Print("Exception label: {0}, message: {1}", e.ErrorLabel, e.ErrorMessage);
                Debug.Print("Status Code: "+ e.ErrorCode);
                Debug.Print(e.StackTrace);
            }
        }
    }
}
```

#### Wallet情報の取得

Walletなどの個人の情報を取得する場合はAPIキーとシークレットキーが必要になります。
APIキーはGateIoのMyPageから取得できます。

```c#
 Configuration config = new Configuration();
            config.BasePath = "https://api.gateio.ws/api/v4";
            config.SetGateApiV4KeyPair("YOUR_API_KEY", "YOUR_API_SECRET");

            var apiInstance = new WalletApi(config);
            var currencyPair = "BTC_USDT";  // string | Specify a currency pair to retrieve precise fee rate  This field is optional. In most cases, the fee rate is identical among all currency pairs (optional) 

            try
            {
                // Retrieve personal trading fee
                TradeFee result = apiInstance.GetTradeFee(currencyPair);
                Debug.WriteLine(result);
            }
            catch (GateApiException e)
            {
                Debug.Print("Exception when calling WalletApi.GetTradeFee: " + e.Message);
                Debug.Print("Exception label: {0}, message: {1}", e.ErrorLabel, e.ErrorMessage);
                Debug.Print("Status Code: "+ e.ErrorCode);
                Debug.Print(e.StackTrace);
            }
```

Sampleが充実している

https://github.com/gateio/gateapi-csharp/blob/master/docs/DeliveryApi.md


ここからGateIoに登録すると**GateIoの取引手数料が30%割引**になります。

<a href="https://www.gate.io/ja/?ref=4868726"><img width="250" alt="gateio_h_en.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/042fc82f-7609-d7e9-23b7-4a45824d9cb3.png"></a>

[Gtkアプリ３　開発する上ので注意点　随時更新](https://qiita.com/iota_11/items/57596e1ccd8a0b889b2a)に続く
【nginx】CloudFront, ALBどちらからのリクエストでも適切なremote_addrを取得する【php-fpm】

## 本記事の趣旨
とあるアプリケーションの前段にCloudFrontを挟む作業をしていたのですが、CloudFrontが挟まるとnginx側でシンプルに `X-Forwarder-for`を使用してuser側のIPを取得することができませんでした。

一部にALB越しでのアクセスが存在しており、かつ無停止でalbからcloudfrontへ移行する必要がありました。  
なので、nginx側でcloudfront越しのIPとalb越しのIPどちらのIPも適切なものを所得できる必要がありました。

一部のブログでは`set_real_ip_from`ディレクティブに `0.0.0.0/0`を挿入し、すべてのIPを信頼するといったやり方が紹介されていますが、 `X-Fowarded-For`は偽装可能なので今回は使用を避けました。
(もちろんアプリケーションの仕様によってはこちらを採用しても良いと思います。)


そこで、cloudfrontのカスタムヘッダである `CloudFront-Viewer-Address`を使用しクライアントのIP:Portを取得し、そのままだとport番号まで文字列に含まれているので一部加工してからアプリケーションへ渡すことにしました。

また、alb cloudfrontともに対応するために該当ヘッダが存在するかどうかで最終的に渡すipを決めています。


## 前提
`X-Forwarded-for`とかそのあたりの使用は既に理解しており、その上でタイトルのことを実現したい人に向けて書いてます。  
`X-Fowarded-For`周りに関しては下記ブログがわかりやすいのでおすすめです。
[こんばんは、X-Forwarded-For警察です - エムスリーテックブログ](https://www.m3tech.blog/entry/x-forwarded-for)

## 構成
![Screenshot_2022-04-27 17.23.48_iQP5qr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270408/6674a31c-4621-d94c-e97e-183f80fd7c53.png)


## 解決方法
### CloudFrontのカスタムヘッダを使用する
[Amazon CloudFront はクライアント IP アドレスと接続ポートヘッダーのサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2021/10/amazon-cloudfront-client-ip-address-connection-port-header/?nc1=h_ls)
2021年のアプデでCloudFrontのカスタムヘッダとして、**リクエスト元のIPとPort**をヘッダ情報に記載してCloudFrontの後ろのリソースへアクセスを送信することができるようになりました。

```
# 以下の形で登録される
CloudFront-Viewer-Address: 127.0.0.1:4430
```

が、このままだとportも記述されており、IPだけがほしいのでnginx上でluaを使用し取り出します。

```conf
# server ディレクティブの中に記述
    set $real_ip "";
    set_by_lua_block $real_ip {
      local cfip = ngx.req.get_headers()["CloudFront-Viewer-Address"]
      n = string.find(cfip, ":")
      ip = string.sub(cfip, 1, n-1)
      return ip
    }
```

本来であればこの `$real_ip`を `real_ip_header`に文字列として挿入したいのですが、syntaxとしてサポートしていないので別の方法を考えます。

今回はphp-fpmを使用しているので `fastcgi_param`として `REMOTE_ADDR`を `$real_ip`で上書きしてあげます。

```
fastcgi_param REMOTE_ADDR $real_ip;
# や
fastcgi_param HTTP_X_FORWARDED_FOR $real_ip;
# や
fastcgi_param HTTP_X_REAL_IP $real_ip;
# など
```
参考
[CloudFront=>ELB=>EC2(nginx) で、接続元 IP アドレスを取得する - Qiita](https://qiita.com/ooxif/items/7827506b9f8edda90de6)

### CloudFront, ALBどちらでも正しいクライアントIPを取得する
httpディレクティブ内でnginxの変数 `$remote_addr`にIPが入るように設定を行います。

```conf
    set_real_ip_from  <VPC CIDRレンジとか>;
    real_ip_header    X-Forwarded-For;
```

次に、例のluaスクリプト部分でカスタムヘッダが存在するかどうかで `$real_ip`の中身を決めます。

```conf
# server ディレクティブの中に記述
    set_by_lua_block $real_ip {
      if (ngx.req.get_headers()["CloudFront-Viewer-Address"]) then
        local cfip = ngx.req.get_headers()["CloudFront-Viewer-Address"]
        n = string.find(cfip, ":")
        ip = string.sub(cfip, 1, n-1)
        return ip
      else
        return ngx.var.remote_addr
      end
    
```

その後は同じ様にfastcgi等に `$real_ip`を渡します。


## 余談
今までnginxのdocker imageを使用していましたが、luaが使えなかったので今回はopenrestyのdocker imageを採用しました。
【Markdown】<summary>タグ内でコードスパン（インラインコード）を使う

## はじめに
`<summary>` タグの中でバッククォート ``` `` ``` を使用すると[コードスパン](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#code-spans---%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B9%E3%83%91%E3%83%B3)として機能せずそのまま表示される。

~~~markdown:コード
<details><summary>`text`</summary>

```
code
```
</details>
~~~

<details><summary>`text`</summary>

```
code
```
</details>

## 解決策
バッククォートではなく `<code>` タグを使う。

~~~markdown:コード
<details><summary><code>text</code></summary>

```
code
```
</details>
~~~

<details><summary><code>text</code></summary>

```
code
```
</details>


## 関連
[Code spans - コードスパン](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#code-spans---%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B9%E3%83%91%E3%83%B3)
[Details - 折りたたみ](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#details---%E6%8A%98%E3%82%8A%E3%81%9F%E3%81%9F%E3%81%BF)
curlで複数同時に送信するコマンド


例えば `https://hogehoge.com` に対して、200個のGETを同時に送信したい場合、

```
$ seq 1 200 | xargs -P 200 -I {} curl "https://hogehoge.com" -o /dev/null -w '%{http_code}\n' -sS
```

ただし、みだりに送信し過ぎると攻撃とみなされるので注意しましょう。
（自身が管理しているサーバー宛なら大丈夫ですが）
docker exec -it [コンテナ名] bashコマンドの意味

# はじめに
Docker上でLaravelを使う度に打つコマンドでしたので調べてみました

## execコマンド

### execコマンドとは？
docker --helpをするとこう書いてあります
```
exec        Run a command in a running container
```
「**ある稼働中のコンテナにてあるコマンドを実行する**」

### execコマンドの使い方
```
% docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
```
さて問題のコマンドを上の文脈で翻訳すると
「**◯◯◯コンテナにて△△△オプションの元bashコマンドを実行する**」

## itオプション
これは**iオプション**と**tオプション**に分けられます
### iオプションとは
```
-i, --interactive          Keep STDIN open even if not attached
```
**STDIN**って何？
>標準入力 【standard input】 stdin

標準入力とは[IT用語辞典](https://e-words.jp/w/%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B.html#:~:text=%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B%20%E3%80%90standard%20input%E3%80%91%20stdin&text=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E5%85%A5%E5%8A%9B%E8%A3%85%E7%BD%AE%E3%82%84,%E3%81%95%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%A4%9A%E3%81%84%E3%80%82)曰く
>コンピュータの入力装置やOSが提供するデータ入力機能・経路などを指す

つまりかなり大まかに言えばキーボードのことです
([この記事](https://wa3.i-3-i.info/word11636.html)読むともっと理解が深まります)
直訳するなら
「**例えアタッチしてなくても標準入力は開き続けて**」

**attach**という新しい概念が出てきましたが、
これは**exec**ではない方法でコンテナに入るもう1つのコマンドになります
今回は**exec**を調べることが主眼ですので違いが気になる方はこちらの[Qiita](https://qiita.com/leomaro7/items/649732faf2f632419f11)を参照してみてください

僕なりの言葉で**iオプション**をまとめると
「**キーボード入力できるようにしといて**」

### tオプションとは
```
-t, --tty                  Allocate a pseudo-TTY
```
"pseudo"とは「**偽りの**」という意味です

**pseudo-TTY**って何？
以下は[IBMのDocumentation](https://www.ibm.com/docs/en/zos/2.2.0?topic=files-pseudoterminal)から引用
>Pseudoterminals (pseudo-TTYs) are used by users and applications to gain access to the shell

これは「**シェルにアクセスする時にユーザーやアプリケーションが使うもの**」という風に翻訳できます
例えばMacユーザーの場合はターミナルのことです

ということは--helpの参照が返してくれた文章は
「**シェルにアクセスするための窓口を割り当てといて**」みたいなイメージになります

ですので"**-it**"の2つのオプションをまとめると
「**キーボードの入力によってシェルを操作できるようにして**」
## bashコマンド
このコマンドは**bashを起動する**時に使うもの
bashもコマンドなので、あれやこれやオプションをさらにつけることはできますが
ほとんどのケースでオプションは指定されないので今回は特に気にしなくてよいようです

# まとめ
コンテナの中に入る時に使うコマンドが
```
% docker exec -it [コンテナ名] bash
```
でしたが、こちらは

コンテナに入る＝**コンテナでbashを起動しキーボードを元にシェルに命令を出せるように設定する**

という意味になります
class属性とid属性 

# 目次
1. class, idとは何か
1. 違いと使い分け
1. 参考

## 1. class, idとは
どちらもHTMLにおいて用いられる属性である。
CSSのセレクタとして、`h1`や`p`要素を用いることもできるが、同一要素の中でもさらに特定のものを指定したいときにこれらの属性を用いるのが一般的である。

## 2. 違いと使い分け
ひとつのWebページ内において、class属性は複数回用いることが可能な一方、id属性は重複して複数回用いることができないという違いがある。
一見、class属性を用いれば問題が無いようにも思えるが、使い分けをすることにより大規模なソースに対しても何がどこに適用されるのかを読み取りやすくなるというメリットがある。

使い分けの基準は簡単で、その装飾を複数箇所にあてたいのならclass、単一箇所でよいのならidというものである。(ほかの考え方も勿論あり、各人さまざまであることに注意。)
例として、classを使えるようなものとしては段落ごとの章の名前、本文など。id属性を使えるようなものとしてはヘッダー、フッターなどがある。

## 参考
https://allabout.co.jp/gm/gc/23897/2/
https://techacademy.jp/magazine/28544#ta-toc-4
AZ-204 受験体験記

## はじめに
[「AZ-204: Developing Solutions for Microsoft Azure」](https://docs.microsoft.com/ja-jp/learn/certifications/azure-developer/)資格に合格したので、私が学習に使用した教材や学習方法を記録として残しておきます。

自分のAzure経験としては3年ほど前からLogicAppを中心にアプリケーションよりのサービスをちょくちょく触って社内の業務を自動化したりしていたレベルで、商用の本番環境などは触ったことありませんでした。
AZ-900は取得していたのでAzureを広く浅くは理解してはいました。

そんな私が中級者資格として最初に選んだAZ-900の難易度は、、

>AZ-204 の難易度は、高め。主要な Azure PaaS サービスを理解し、クラウド ネイティブなアプリケーションの開発、配置、保守について、幅広い知識が求められます。また、Azure の各サービスのデプロイと構成、また、その上で動作するアプリケーション コードの作成方法や監視についての理解も必要です。
抜粋：https://jinzai.edifist.co.jp/article/az-204_developing-solutions-for-microsoft-azure/

と、少々難易度は高めの模様。

実際に受験した感想としては触れたことがないC#言語の穴埋め問題や、リソースをCLIコマンドで作成する際の並び替え問題、プランによる機能の差異と、詳細な知識が求められるのでかなり厳しかったです。

## 勉強方法
- [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-204)
    - 公式のラーニングパス
    - 日本語の翻訳が不親切な部分があってとっつきにくいが、出題範囲のサービスを把握できるので一周実施
    - 初めて触れるサービスはラーニング内のハンズオンを実施
    - 約10時間
- Udemyの模擬試験（おすすめ）
    - [AZ-204: Developing Solutions for MS Azure Practice Tests](https://www.udemy.com/course/az-204-practice-tests/)
    - 6回分の模擬試験が利用できる
    - キャンペーン時は1500円程度で購入可能
    - すべて英語のため適宜翻訳ツール（Chromeの翻訳機能やDeepL）を使いながら実施
    - すべての回で90%以上取れるようになるまで繰り返し実施
    - 約10時間
- Microsoftの公式ドキュメントやその他日本語のブログ
    - わからない単語や機能が出てきたら[公式のドキュメント](https://docs.microsoft.com/ja-jp/)を参照するようにしました
    - 公式も前述の通り翻訳が分かりづらいものがあれば適宜日本語のブログを検索して理解を深めるようにしました

## 受験結果
都内某試験センターで受験

獲得スコア
| 受験日 | スコア/合格点/満点 | 結果 |
|:-:|:-:|:-:|
|  2022/4/5 | 779/700/1000 | 合格 |

**Udemyの模擬試験がそのまま出題されたケース**もあり、一発で合格することができました！

## 出題内容
- ケース問題
    - 先に要件が提示され、その要件を満たす回答を選択する形式
    - 要件をしっかり読もう！ほとんどのケースで「コストは最小限」など書かれているゾ
    - 出題形式と画面領域の問題で「要件」と「設問」を並べて見れないので何度も往復する羽目になる
    - ケース問題から次の形式の設問へ進むと見直しができないので注意
- 多項選択式問題
    - 基本的な選択問題
    - 複数選択するような問題もあるのでしっかり確認しよう
    - 並べ替えや、ドラッグ&ドロップ、プルダウンなど様々な形式があるがびっくりせずによく読めば対応できます
- セット問題
    - 複数問で同じ「○○な要件」に対して「○○を行いました」（ここが問題によって変わる）、要件は満たせましたか？のような問題
    - 2、3問出題されるが各問の見直しは不可（全部並べて見たらどれが正解・不正解かは何となくわかってしまうため）

## さいごに
受験を検討している方にとって少しでも役に立てば幸いです。
今年中に順番は逆だったかもしれませんがAZ-104の取得と、次のステップのAZ-500取得を目指そうと思います！
ECSのログインでInvalidParameterExceptionのエラーになった際の解決方法

# 概要
ECSにログインしようとしたらエラーで弾かれるため、その解決方法のメモ。

# 前提条件
- AWSのECSを組んでいること
- ECSログインを試みるとエラーになること

# エラーの事象
## ECSログインコマンドでのエラー

```bash
$ aws ecs execute-command  \
    --region ap-northeast-1 \
    --cluster  {cluster名}  \
    --task {task名}  \
    --command "sh" \
    --interactive 

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running. Wait and try again or run a new task with execute command enabled and try again.
```

## エラー原因の確認方法
enableExecuteCommandの設定値を確認する。
設定値が大量に表示されるので、 `| grep enableExecuteCommand`をコマンド末尾に追加して、enableExecuteCommandだけ確認できるようにしておくのがオススメです。

```bash
$ aws ecs describe-tasks  \
    --region ap-northeast-1 \
    --cluster  {cluster名}  \
    --task {task名}  \
| grep enableExecuteCommand

"enableExecuteCommand": false,
```
`enableExecuteCommand`が`false`になっていたらこれが原因の可能性があります。

# 対応方法
## 1. enableExecuteCommandをtrueへ更新
```bash
$ aws ecs update-service \
--cluster {cluster名} \
--service {service名} \  
--enable-execute-command
```

### 権限がないと怒られる場合
IAMユーザーに権限がないとエラーになります。
```bash
aws ecs update-service \
--cluster {cluster名} \
--service {service名} \    
--enable-execute-command 

An error occurred (AccessDeniedException) when calling the UpdateService operation
```
この場合、下記IAMポリシーを作成して、対象のIAMユーザーにアタッチしてあげると更新できるようになります。

- ECS用IAMポリシー用JSON
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "UpdateService",
            "Effect": "Allow",
            "Action": [
                "ecs:UpdateService"
            ],
            "Resource": "arn:aws:ecs:ap-northeast-1:{AWSアカウントID}:service/httpd-cluster/{ECSサービス名}"
        }
    ]
}
```
参考：https://dev.classmethod.jp/articles/github-actions-ecs-ecr-minimum-iam-policy/#toc-7

## 2. タスクの再起動を行う
enableExecuteCommandの設定値を更新後、ECSタスクの再起動を行います。

サービスの更新から「新しいデプロイの強制」にチェックを入れて再起動します。

![スクリーンショット 2022-04-27 16.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562723/00f31b06-876d-7cf9-92d3-f92f0cb37bd9.png)

## 3. enableExecuteCommand設定値の再確認
enableExecuteCommandを再確認するとtrueに変わっているはずです！
```bash
$ aws ecs describe-tasks  \
    --region ap-northeast-1 \
    --cluster  {cluster名}  \
    --task {task名}  \
| grep enableExecuteCommand

"enableExecuteCommand": true,
```

## 4. ログイン確認
ログインしてみると成功します。
```bash
$ aws ecs execute-command  \
    --region ap-northeast-1 \       
    --cluster  {cluster名}  \
    --task {task名}  \
    --command "sh" \
    --interactive 
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-068a203129a208fa0
```
【備忘録】スクリーンショットの保存先の変更(Mac編)

### Macでスクリーンショットの保存先を変更する
ターミナルを開き、下記コマンドを実行する。
```shell: スクリーンショットの保存先変更
~ $ defaults write com.apple.screencapture location /Users/kawamurakouji/Desktop/screenshot

コマンドの説明
defaults write com.apple.screencapture location スクリーンショットの保存先
```
これでスクリーンショットの保存先が変更されます。スクリーンショットの保存先を変更しておくとフォルダが汚くならないので便利です！！
Nuxt.jsでCSSとJSを別々のファイルに出力する方法

Nuxt.jsのデフォルトの設定では、CSSとJSが同一のファイルに出力されます。
本記事では、CSSとJSを別々のファイルに出力する方法を解説します。

CSSファイルのみをキャッシュさせたい場合などに有効かと思います。

## nuxt.config.jsにextractCSSを追加する

```js:nuxt.config.js
export default {
  build: {
    /*
     ** You can extend webpack config here
     */
    extend() {},
    extractCSS: true /* 追加 */
  }
}
```
Nuxt.jsの`nuxt.config.js`ファイルに`extractCSS: true`を追記します。（デフォルトではfalse）

上記の設定でJSとCSSを別ファイルで出力することができます。

## 出力するファイル名やディレクトリを指定する

出力するファイル名やディレクトリを指定することもできます。

```js:nuxt.config.js
export default {
  build: {
    extend() {},
    extractCSS: true,
    filenames: {
      app: ({ isDev }) => (isDev ? '[name].js' : '[id].[contenthash].js'),
      chunk: ({ isDev }) => (isDev ? '[name].js' : '[id].[contenthash].js'),
      css: ({ isDev }) => (isDev ? '[name].css' : 'css/[contenthash:7].css')
    }
  }
}
```
[https://nuxtjs.org/docs/configuration-glossary/configuration-build/#filenames](https://nuxtjs.org/docs/configuration-glossary/configuration-build/#filenames)

### 出力するファイル名を固定にする

```js:nuxt.config.js
export default {
  build: {
    extend() {},
    extractCSS: true,
    filenames: {
      app: () => '[name].js',
      chunk: () => '[name].js',
      css: () => '[name].css'
    }
  }
}
```
固定のファイル名にした場合は、ブラウザにキャッシュされて変更を検出できない可能性があるので注意が必要になります。

## 参考

https://nuxtjs.org/ja/docs/configuration-glossary/configuration-build/#extractcss
世界一短いMFCダイアログのタブコントロールサンプル

**※アカウント統合により過去記事再掲：元の投稿日 2016年04月01日**



MFCアプリケーションを作る時にいつも思うのが、本当にありがた迷惑なんですよね、あれ。
ダイアログアプリケーション一つ作るにもソースが見辛いったらありゃしない。

で、ちょっとタブ切り替えをやりたいだけなのに、これが意外と面倒くさい。というか分かりづらいんですよね。

結局のところ、TCN_SELCHANGEをハンドリングして表示非表示を自分で切り替えるとかいう面倒くさーい、わかりづらーい考え方なんですよネ。

と、いう事で。

ヘッダファイルだけでダイアログアプリケーションを書いてみました。
で、タブ切り替えもやっときました。

こんな作り方したらクラスウィザードは使えなくなっちゃうんですけどね。でもまあメッセージハンドラくらい手打ちで追加しても意外と大したことなかったりするんですよね。

※前提として以下記事の"inlineMap.h"を使います。

https://qiita.com/Teramonte4/items/2904b0cad4affc2b2305


```cpp:SimpleDlg.hpp
#pragma once

#include "resource.h"
#include "inlineMap.h"

class CSimpleDlg : public CDialogEx
{
	INL_BEGIN_MESSAGE_MAP(CSimpleDlg, CDialogEx)
		ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, &CSimpleDlg::OnTcnSelchangeTab)
	INL_END_MESSAGE_MAP()

public:
	CSimpleDlg(CWnd* pParent = NULL) : CDialogEx(CSimpleDlg::IDD, pParent) {
		m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	}

	enum { IDD = IDD_SIMPLEDLG_DIALOG };

protected:
	HICON m_hIcon;

	virtual BOOL OnInitDialog() {
		CDialogEx::OnInitDialog();

		SetIcon(m_hIcon, TRUE);
		SetIcon(m_hIcon, FALSE);

		// タブコントロールをなんかする
		tab.SubclassDlgItem(IDC_TAB, this);

		tab.InsertItem(0, _T("たろう"));
		tab.InsertItem(1, _T("じろう"));
		tab.InsertItem(3, _T("マイケル"));

		// タブに貼っつける奴らをなんか作ったりする
		dlg[0].Create(IDD_DIALOG1, &tab);
		dlg[1].Create(IDD_DIALOG2, &tab);
		dlg[2].Create(IDD_DIALOG3, &tab);

		// なんか場所の調整
		CRect rect;
		tab.GetWindowRect(rect);
		tab.AdjustRect(FALSE, rect);
		tab.ScreenToClient(rect);

		dlg[0].MoveWindow(rect);
		dlg[1].MoveWindow(rect);
		dlg[2].MoveWindow(rect);

		// 初回たろうを表示
		OnTcnSelchangeTab(NULL, NULL);

		return TRUE;
	}
	afx_msg void OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult) {
		auto cur = tab.GetCurSel();
		for (int i = 0; i < 3; i++) {
			dlg[i].ShowWindow(i == cur ? SW_SHOW : SW_HIDE);
		}
	}

	afx_msg HCURSOR OnQueryDragIcon() {
		return static_cast<HCURSOR>(m_hIcon);
	}

private:
	CTabCtrl tab;	// 親たぶ
	CDialog dlg[3];	// たぶの子供3枚
};

class CSimpleDlgApp : public CWinApp
{
public:
	virtual BOOL InitInstance() 
	{
		CWinApp::InitInstance();

		CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

		CSimpleDlg dlg;
		m_pMainWnd = &dlg;

		dlg.DoModal();

		return FALSE;
	}
} theApp;
```

ちょっとダイアログ一個作るのにソースファイルの数が多すぎて半ギレのあなた！　そういうちょっぴり心の狭い、あなたと私のために87行で書いてみました。
【Pega】テーブルの内容をCSVファイルとして出力

## １　はじめに
本記事では、画面に表示しているテーブルの内容をCSVファイルとして出力する実装を紹介する
<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/f63faf03-f22c-f7f7-bd6b-84c4ce5bb921.png">

## ２　テーブルの実装
テーブルのData sourceはPage Listで定義しているProperty（StudentInfoCSV）として実装
<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/145c8854-2ad0-bf51-11be-f57b73f68086.png">
・Data sourceの実装
<img width=50% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/d1f4c50d-1c4c-0884-5a6e-e68980b1b6ff.png">
・Property定義
<img width=50% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/90597318-d15f-3dff-6c5e-e4bbfdd2fa12.png">

## ３　CSVファイルをダウンロードするボタンの実装
#### ３．１　CSV Downloadボタンの実装（日本語文字化け考慮しない）
<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/f9b0792f-836c-e119-ad70-def11c48a6c9.png">

Actionsは下図のように実装
・Use Page：チェックする
・Activity：pxConvertResultsToCSV（OOTBメソッド）
・Activityのパラメータ設定（抜粋）
|パラメータ名|設定内容|説明|
|---|---|---|
|CSVProperties|"ID,Name,Age,Sex,Class,Comment"|出力Property|
|CSVPropertyTypes|"String,String,String,String,String,String"|出力Propertyのタイプ|
|PageListProperty|"StudentInfoCSV"|参照するPageList名|
|FileName|"CSVDownload"|出力CSVファイル名|
|AppendTimeStampToFileName|true|出力CSVファイル名にTimeStampを追加|
<img width=50% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/98639d3b-8abf-46da-6150-465557faedfc.png">

#### ３．２　CSV Download 2ボタンの実装（日本語文字化け考慮する）
・Activity【pxConvertResultsToCSV】をSave asし、別名で保存
<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/8cc6c780-5c9e-5da2-7ca3-1bd62b00f3c0.png">
・Step5のJavaは下記のように編集
<img width=50% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/0030e799-740a-3a7c-5094-ff99a6781d65.png">
・Actionsの実装は３．１と同様
<img width=80% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/2aed41d0-e307-21aa-fe83-24b97a1d1060.png">
<img width=50% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/2967eefb-b2a6-205a-c1a7-e68190148b53.png">

## ４　実装結果確認
・CSV Downloadボタンの実行結果（日本語文字化け考慮しない）
<img width=100% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/cc09e631-f83e-10b1-3641-295a84878ee0.png">

・CSV Download 2ボタンの実行結果（日本語文字化け考慮する）
<img width=100% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/6e97542d-ffa9-d9f8-6704-50a50c654c6d.png">

#### ・Pega環境
　Pega 8.6.1

#### ・キーワード
　Export CSV File in Pega
MFCでメッセージマップをヘッダに書くマクロ

**※アカウント統合により過去記事再掲：元の投稿日 2016年04月01日**


MFCでちょっとしたツールを作ろうとする。
果たして、C#とかJavaとかばっか触ってたせいか.hと.cppでファイルを分けるのが鬱陶しくてたまらない今日この頃。

予算やサービサビリティ豊富な上層部のおかげで.NETとか許さないざんすなんて事は[稀によくある](http://dic.nicovideo.jp/a/%E7%A8%80%E3%81%AB%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B)わけですったら。


```cpp:inlineMap.h
#pragma once

#define INL_BEGIN_MESSAGE_MAP(theClass, baseClass) \
	PTM_WARNING_DISABLE \
	virtual const AFX_MSGMAP* GetMessageMap() const \
		{ return GetThisMessageMap(); } \
	const AFX_MSGMAP* PASCAL GetThisMessageMap() const \
	{ \
		typedef theClass ThisClass;						   \
		typedef baseClass TheBaseClass;					   \
		static const AFX_MSGMAP_ENTRY _messageEntries[] =  \
		{

#define INL_END_MESSAGE_MAP()					END_MESSAGE_MAP()
```

これを使ったサンプルはこちら。

```cpp:xwnd.hpp
#pragma once

#include "inlineMap.h"

template<typename T>
class XWnd : public T
{
	INL_BEGIN_MESSAGE_MAP(XWnd, T)
	ON_WM_DROPFILES()
	ON_WM_CTLCOLOR_REFLECT()
	INL_END_MESSAGE_MAP()

protected:
	virtual void PreSubclassWindow()
	{
		ModifyStyleEx(0, WS_EX_ACCEPTFILES);
		T::PreSubclassWindow();
	}

public:
	~XWnd()
	{
		if (m_bkgndBrush != NULL)
			::DeleteObject(m_bkgndBrush);
	}

	void SetBkgndBrush(COLORREF col) {
		if (m_bkgndBrush != NULL)
			::DeleteObject(m_bkgndBrush);

		m_bkgndBrush = ::CreateSolidBrush(col);
	}

private:
	HBRUSH m_bkgndBrush = NULL;

protected:
	HBRUSH CtlColor(CDC *pDC, UINT nCtlColor)
	{
		if (m_bkgndBrush != NULL)
			pDC->SetBkMode(TRANSPARENT);

		return m_bkgndBrush;
	}

	void OnDropFiles(HDROP hDropInfo)
	{
		TCHAR buffer[MAX_PATH];
		buffer[0] = 0;

		CString str;

		int count = ::DragQueryFile(hDropInfo, -1, buffer, MAX_PATH);

		for (int i = 0; i < count; ++i)
		{
			if (str.GetLength())
				str += ';';

			::DragQueryFile(hDropInfo, i, buffer, MAX_PATH);
			str += buffer;
		}

		SetWindowText(str);

		T::OnDropFiles(hDropInfo);
	}
};
```

上記は背景色の設定とか、ドラッグアンドドロップの受け取りとか出来るようにした奴。

ダイアログとかに`XWnd<CStatic> m_lavel;`とかしてSubclassDlgItemして使う感じ。

やー楽になった。良かった良かった。
Oracle Analytics Cloud - 自動インサイトについて

皆さん、こんにちは。久しぶりの投稿です。
今回はOracle Analytics Cloud の新機能、Auto Insigtについて少しだけ書きます。
ドキュメントには自動インサイトと記載されていますが、正直、Auto Insightのほうが言いやすいというか、Autonomous(オートノマス)という読み方もじわじわ浸透してきているので、こちらのほうが個人的にはしっくりきます。

さて、調べる前にまずは自動デモを見てみました。
https://www.youtube.com/watch?v=JpQ9V9p2hMI

英語はわからなくても、BIなので画像を見れば一目瞭然。
なるほど、自分でやってみよう。と、サンプルデータでやってみました。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/af075b18-7dcb-74aa-3568-58f0d7b9e90e.png)

赤い〇の部分をクリックするだけで拍子抜けするくらい簡単に、インサイトが表示されました！
USのサンプルデータを元にしたため、どんなデータが入っているのかわかりませんでしたが
赤く囲った部分がAuto Insightで表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1251127/06b1e03e-bf51-cc5f-9b2b-aaa1328b29b9.png)

公開可能なサンプルデータが英語しかなかったので、英語表記ですが次回は日本語データを探してやってみます！
WordPress 自作テーマ作成時に使用した技術まとめ

WordPressの基本事項は過去記事に記載
[WP基本事項](https://qiita.com/H-Toshi/items/b591967720d496b5c201#%E7%99%BA%E5%B1%95%E7%B3%BB%E3%81%AE%E5%86%85%E5%AE%B9)

### 投稿ページ一覧作成
[参考記事](https://rmtmhome.com/blogs-archive-1820)
デフォルトでは投稿記事の一覧ページはトップページになっている為、ベット投稿ページ一覧を作りたいときは以下のコードをfunctions.phpへ記入する。
```php

/* 投稿アーカイブページの作成 */
function post_has_archive( $args, $post_type ) {

	if ( 'post' == $post_type ) {
		$args['rewrite'] = true;
		$args['has_archive'] = 'blogs'; //任意のスラッグ名
	}
	return $args;

}
add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );
```
この後、管理画面の「設定」→「パーマリンク設定」→「変更を保存」をクリックすることで、
```http://ブログサイトのURL/blogs/```
で投稿記事のアーカイブページが表示されるようになる。
特段設定していなければarchive.phpがあればそれにあてがわれる。

* [while文投稿件数変更](https://bambooworks.co/wordpress-loop/)




## 詰まった所
* カスタム投稿の一覧や通常の投稿一覧にページネーションを作成した時詰まった話。
作成する際、phpのファイル上で
```php

            <?php
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
            $the_query = new WP_Query(array(
                'post_status' => 'publish',
                'post_type' => 'work', //カスタム投稿タイプ名
                'paged' => $paged,
                'posts_per_page' => 3, // 表示件数
                'orderby'     => 'date',
                'order' => 'DESC'
            ));


            if ($the_query->have_posts()) : ?>
```
上記の様に表示件数を３件にしていたが、管理画面の設定では１ページに表示する記事を4件としていた。
そしてたまたま、投稿記事数が４件出会った為、phpファイル上では3件表示になってページネーションでの遷移先```hoge.com/work/page/2```は存在しないと表示された。
これは管理画面では1ページに割り当てされるのが4件のため、page/2が生成されていなかった。
WPの作成時はphpファイルと管理画面の紐付きも考慮が必要。
RedHatで自作アプリにファイルを関連付ける

**アカウント統合により過去記事再掲：元の投稿日 2016年02月26日**


GUIで使っているが、特定の拡張子のファイルを自作アプリに関連付ける方法が意外と手間がかかったため記録しておく。

実際にやったのはJavaアプリで、実行用のシェルスクリプトを書いているため、実行権を与えたshファイルに関連付ける。今回はお試しで中からgedit呼ぶだけにしてあるけど、実際は`java -jar honyarara.jar`とかなんかやって成功したのよ。ほんとだよ。

てなわけで、取り敢えずシェルの中身は以下でやってみる。
こんくらいなんで、まあviで。

`$ vi hello.sh`

```hello.sh
#!/bin/sh
gedit $1
```

取り敢えず実行権を与えて、
`$ chmod +x hello.sh`

ではこいつを/usr/bin/以下に突っ込むのだが、先にフォルダを作る。
`$ su`　←rootで作業
`# mkdir /usr/bin/myapp` ←フォルダ作って
`# cp hello.sh /usr/bin/myapp/`　←コピる

次に.desktopファイルを作る。取り敢えず今回はviでも大した量じゃない。
`# vi /usr/share/applications/myapp.desktop`

```myapp.desktop
[Desktop Entry]
Name=myapp
Exec=/usr/bin/myapp/hello.sh %U
Type=Application
Icon=/usr/share/icons/gnome/48x48/apps/accessories-dictionary.png
NoDisplay=true
```

こんな感じ。

ほんでなんか更新する。
`# update-desktop-database /usr/share/applications`

rootは抜けてよし。
今回は.hogeなんかに関連付けちゃおうって事でね。

`$ vi ~/hoge.hoge`

ま、ファイル作ったあとは、GUI作業。
このhoge.hogeを右クリックして、「プロパティ」の「開き方」から、今作ったmyappを「デフォルトに設定する」なんてしちゃうわけ。

すると、*.hogeがmyappに関連付けられる、と。
そういうお話。

詳しくは↓を参照されたし。MIMEタイプとかも載ってます。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Desktop_Migration_and_Administration_Guide/File_Formats.html
機械学習ツール「Dataiku」のAutoML

## はじめに

このブログをご覧いただきありがとうございます。
今回は機械学習ツール「Dataiku」のAutoMLについて、簡単に紹介しています。
最後まで、読んでいただけると嬉しいです。

## 本ブログの目的

#### ・機械学習プラットフォーム「Dataiku」の紹介

#### ・AutoML機能の概要説明

## １．Dataikuとは

「Dataiku」（データイク）は、全工程を一つのUIでカバーする
データサイエンス・機械学習プラットフォームです。

2013年にフランスのパリで設立された「Dataiku社」が提供しています。
同社は2019年にユニコーン企業として評価され急成長している会社です。



2020年と2021年には、ガートナー社の評価で２年連続「Leader」に選定されました。

Dataikuのコンセプトは、データサイエンティストから初級アナリストまで様々な
メンバーで構成されるデータ分析チームの誰もが扱いやすいコラボレーション
データサイエンスプラットフォームです。

1つのプラットフォームで関係者全員が共同で問題を解決することができ、
クリックのみで簡単にデータの加工や機械学習モデルの作成ができます。

## 2.　AutoMLについて

AutoMLとは「Auto Machine Learning」の略で、機械学習モデルの設計や
構築を自動化することを意味します。

Dataikuの代表的なAutoML機能を紹介したいと思います。

#### ■モデル作成前

##### ・Feature handling、Ferture generation

学習させる際にどの変数を使用するか、変数の選択をする必要があります。

Dataikuでは、「Feature handling」や「Ferture generation」の機能があります。

「Feature handling」は、学習する時、必要な変数を選択することができる機能です。
また選択した変数をスケーリングしたり、データの欠損値に平均値や中央値などを代入できたり、欠損値を含むデータの行を学習から除外したりできます。

![Qiita_scaling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610573/1f68c96f-79c1-ca8f-e446-4b62d54244f8.png)
![Qiita欠損値の代入一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610573/6bfa222d-a327-6b07-08e6-c7988975eb80.png)

「Ferture generation」は、特徴量を新たに作成することができる機能です。
例えば、カラム同士の足し算や引き算、掛け算などした結果のカラムを新たな変数として使用することができます。

また、Dataikuでは学習結果に影響を与えない変数を自動で除外します。（例：全て一緒の値、全て違うデータ、etc...)

##### ・アルゴリズム選定

Dataikuでは、Kaggleの勝者が良く使用する主要なアルゴリズムを用意しています。

![Qiita_Algorithms_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610573/44399c3c-2b3e-5991-7a29-37c42491a824.png)

またPythonで独自のアルゴリズムを追加することもできます。
![Qiita_Algorithms_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610573/70b078ad-8c5d-4ce3-5c44-e35562213927.png)

#### ■モデル作成後

##### ・Variables importance
予測モデルの性能に最も影響を与える説明変数を示す機能です。

![Qiita_Variables importance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610573/6440111f-0595-8fe7-de3b-e9e46ac7a7d2.png)

##### ・Individual Explanations
この機能はDataikuならではの強みです。
各データが、なぜそのような推論結果（確率）になったのか、その根拠を示す機能です。
これで、エンドユーザへ予測結果の根拠を説明することが可能となります。

![Qiita_Individual explanations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610573/ea3c0a02-707c-04fc-229e-249ee0d3ca38.png)
## ３．まとめ

今回は、機械学習プラットフォーム「Dataiku」の紹介とAutoML機能の概要を説明しました。
ご興味を持たれた方・ご質問がある方は、お気軽にお問い合わせください。

本ブログを読んでくださり、ありがとうございました。

Have a good day!
PHPで簡易的なサーバーを立ち上げる

# 概要
PHPで素早くlocalhostでページを確認したい！
MAMP使う時間もない！
という時に簡易的なサーバーを立ち上げる時の流れです。

## 手順
どこでも良いので、フォルダを作成します。
vscodeを立ち上げて作成したフォルダをドラッグアンドドロップします。
フォルダの中にindex.phpファイルを作成します。
```
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>ウェブサーバーのテスト</title>
  </head>
  <body>
    <p>HelloWorld!</p>
  </body>
</html>
```

上のターミナルから新しいターミナルを立ち上げてコマンドを入力(ポート番号はなんでもOK)
```
php -S 127.0.0.1:8080
```
127.0.0.1:8080にアクセスすると
![スクリーンショット 2022-04-27 16.35.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586109/a9b92b57-f553-2c94-3bb0-f18df1b71f1e.png)

が表示されました！
Grub2からOS Xをbootする

**※アカウント統合により過去記事再掲：元の投稿日 2016年02月26**

# さあ、やってしまった！
Mac miniをRedHatとのデュアルブートにしようとして、RedHatしか立ち上がらなくなってしまった。

このまま起動音のカッコイイLinuxとして使うのも一案だが、Macを捨て去るのも悲しい話。LinuxのCUIをパチパチやってると仕事してる風に見えて遊んでられてとても素敵なのだが、現実にiPhoneアプリの開発なんかをやる時にはやっぱMacいるじゃんという話になるわけで、さてどうしようか。

ブートメニューに「OS X」を追加すりゃいいじゃん、って事でやってみた。
#まずはGrubコンソールに入って
Grubのメニューが表示されている所で **C** を押すと、コンソールに入れる。

`grub>`

と出てきたらこっちのもんだ。取り敢えず **ls** しとく。

`grub> ls`

```
(hd0) (hd1) (hd1,gpt6) (hd1,gpt5) (hd1,gp4) (hd1,gpt3) (hd1,gpt2) (hd1,gpt1)
```

こんな感じで表示される。
で、どれがOS Xだったかなーと。

**/System/Library/CoreServices/boot.efi**

取り敢えず↑のファイルがあるパーテーションを探す。
ま、片っ端から見ていくか、と。

`grug> ls (hd1,gpt6)/System/Library/CoreServices/`

※英字キーボードになってるんで、()のキーの位置とか右にズレてたりするのでしょっちゅう打ち間違えるけどあんま気にせずやろう

`error: file '/System/Library/CoreServices/' not found.`

無かったね。はい気にしない。
↑キーを押して次々やっていこう。

`grug> ls (hd1,gpt3)/System/Library/CoreServices/`

```
./ ../ .disk_label .disk_label.contentDetails .disk_label_2x .root_uuid
boot.efi PlatformSupport.plist SystemVersion.plist
```

お？
boot.efiあるじゃん。

しかし騙されてはいけない。こいつを使ってブートしようとしたら失敗したので、こいつはなんか別の奴なのだ。別のなんなのかは俺は知らん。

`grug> ls (hd1,gpt2)/System/Library/CoreServices/`

```
./ ../ .disk_label .disk_label.contentDetails .disk_label_2x AddPrinter.app/ AddressBookUrlForwarder.app/ AirPlayUIAgent.app/ AirPort Base Station Agent.app/
(略）
BluetoothUIServer.app boot.efi cacheTimeZones
(略)
--MORE--
```

これやんけ！　多分これやろ！　一杯あるからこれや！
と、言うわけで **(hd1,gpt2)** と、これを覚えておこう。

では *esc* でブートメニューに戻ってよろしい。

# Grubの設定ファイル的なのを書き換える
当然rootでの作業。
`# vi /etc/grub.d/40_custom`

```bash:40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
```

このファイルに追加する。**I**で挿入モードに入って以下を追加。

```bash:40_customに追加
menuentry "OS X" {
    insmod hfsplus
    set root='(hd1,gpt2)' # さっき確認したパーテーション
    chainloader /System/Library/CoreServices/boot.efi
}
```

**esc**で戻って**:wq**で上書き。
最後にgrub.cfg ファイルを更新する。

`# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg`

再起動して・・・
`# reboot`

# ででーん！
![IMG_4067.JPG](https://qiita-image-store.s3.amazonaws.com/0/104780/deb852fb-036f-2261-8fb2-192dcedc6465.jpeg)

これで **OS X** を選択したら、あの食いかけのリンゴのマークが表示されるはず。
はい、お疲れ様でした。

# 後日談
しばらく使っているとOS Xがbootしなくなってしまった。
なんでですかね？
grubコンソールからlsで確認してみると、それまでhd2だったのがhd1になってたんですよね。
だからまあ、40_customファイルを書き換えてまた起動できるようにはしましたが、なんでこの辺変わっちゃったんですかね。イマイチ分かってないんですよね。
【Windows Terminal】タブの名前が変わらないようにする

## 環境
+ Microsoft Windows 10.0.22000.613（21H2）
+ Windows Terminal 1.12.10983.0

## 現象
エクスプローラーのアドレスバーで `cmd` と入力してコマンドプロンプトを開くと Windows Terminal のタブ名がコマンドプロンプトのパス `C:\Windows\System32\cmd.exe` となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/700ba57a-a9e6-ff22-5ce8-2ff8bef0a8fc.png)

## 設定方法

<details><summary><code>settings.json</code> を編集する場合</summary>

各シェルの設定で `"suppressApplicationTitle": true` を追加する。
</details>

`Ctrl+,` で設定を開く。対象のシェルの設定で詳細設定を開く。「タイトルの変更を表示しない」をオンにして保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/40835fbd-ca61-7250-3328-85e132c4c8b2.png)

## 確認
もう一度、エクスプローラーのアドレスバーで `cmd` と入力してコマンドプロンプトを開くと Windows Terminal のタブ名が `Command Prompt` になっている。（タブ名として設定しているものが表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946472/42aaa43c-6492-de2d-ffdb-367f9febda8b.png)
Laravel Controller作成時のオプション

# コントローラー作成時に便利なコマンド
大体のプロジェクトはCRUD処理を使うと思うのでアクション設定の記述をしなくても
勝手に作ってくれる！
二つ目はAPI用

```
php artisan make:controller SampleController --resource
php artisan make:controller ApiController --api
```
便利！
[MySQLのエラーを解決したお話] (2003, "Can't connect to MySQL server on 'None' ([Errno -3] Temporary failure in name resolution)")

## 状況
dockerでmysqlのコンテナを立ち上げて、flaskでDBにアクセスしようとしたがエラーが出る

## エラー内容
```
(2003, "Can't connect to MySQL server on 'None' 
([Errno -3] Temporary failure in name resolution)")
```

## 解決
**環境変数** を確認する

バックエンド側またはMySQL側に、環境変数が設定されているか確認しましょう
Ethereum（イーサリアム）とはなんぞや

# 簡潔に
スマートコントラクト機能を備えた分散型アプリケーションプラットフォーム
# ん？私の知らない単語が...
分散型アプリケーション　→　スマートフォンやノートPCのアプリ
スマートコントラクト　　→　ブロックチェーン上で契約を自動的に実行する仕組み
ブロックチェーン　　　　→　暗号技術を使ってリンクされたブロックと呼ばれるレコードの増大するリスト

>スマートコントラクトを日常で例えると、自動販売機で、利用者が商品ごとに決められた額のお金を入れることで、自動的に売買契約が成立するみたいな感じです。

ゲームを作ったり、あらゆる“契約”の自動化によってDeFi（分散型金融）を実現しているそうですよ？

# 特徴
- スマートコントラクト機能により、ブロックチェーン上にアプリケーションを記録したり、契約の内容を保存したりできる
- ブロックチェーン上で管理するため、1人の力では改ざんが不可能

# 記事について
内容浅さ！！
何か調べててまとめるも何も、難しくなってしまいました。
これから成長していきます。
色々な方々、迷惑を掛けますが、ご教授お願い致します。
Franka BilateralController.exe

### Touchのチェックボックスをチェック
```cpp
// TouchRelative選択の場合
OnBnClickedCkTouch()
	RunTouch()
		staticTouchRelativeThread()
			TouchRelativeThread()
```
### TouchRelativeThread()
```cpp
// TouchXの現状の状態を取得
hdScheduleSynchronous(copyDeviceDataCallback, &currentData, HD_MIN_SCHEDULER_PRIORITY);

// ボタン開放からボタン押下の変化でフィルター初期化
lowpass[i].Initialize(1.0, 0.001, last.val[i]);

// 前回からの変化を計算
Matrix16 vec = pos - last;

// 変化をロボット用軸に合わせて送信データとする
out.val[12] = m_ckXaxis ? -vec.val[14] * scale : 0.0;
out.val[13] = m_ckYaxis ? -vec.val[12] * scale : 0.0;
out.val[14] = m_ckZaxis ? vec.val[13] * scale : 0.0;

// 送信データをリングバッファに書いてトリガ発行
m_txring.Write((const unsigned char*)&rc_index, sizeof(rc_index));
m_txring.Write((const unsigned char*)&out, sizeof(out));
::PostMessage(this->m_hWnd, WM_UpdateDeviceData, 0, 0);
```
### OnUpdateDeviceData()
```cpp
// リングバッファのデータを読み
m_txring.Read(ptr, sizeof(double))

// ロボットに送信
const int tx = m_robottx.SendTo(txbuf, txbuflen, (const SOCKADDR*)&m_robottxaddr, txaddrlen, 0);
```
### OnRobotReceive(int nErrorCode)
```cpp
// ロボットの状態を受信する
const int rx = m_robotrx.ReceiveFrom(rxbuf, rxbuflen, (SOCKADDR*)&m_robotrxaddr, &rxaddrlen, 0);

// 最新状態を保持する
case rs_O_T_EE:memcpy(&m_O_T_EE, ptr, databyte);break;
case rs_O_T_EE_d:memcpy(&m_O_T_EE_d, ptr, databyte);break;
case rs_tau_J:memcpy(&m_tau_J, ptr, databyte);break;
case rs_q:memcpy(&m_q, ptr, databyte);break;
case rs_q_d:memcpy(&m_q_d, ptr, databyte);break;
case rs_dq:memcpy(&m_dq, ptr, databyte);break;
case rs_dq_d:memcpy(&m_dq_d, ptr, databyte);break;
case rs_joint_contact:memcpy(&m_joint_contact, ptr, databyte);break;
case rs_cartesian_contact:memcpy(&m_cartesian_contact, ptr, databyte);break;
case rs_tau_ext_hat_filtered:memcpy(&m_tau_ext_hat_filtered, ptr, databyte);break;
case rs_theta:memcpy(&m_theta, ptr, databyte);break;
case rs_dtheta:memcpy(&m_dtheta, ptr, databyte);break;
```

### OnBnClickedBuTouchConnect()
```cpp
// コールバック関数を設定
m_hAsyncCallback = hdScheduleAsynchronous(GeneralCallback, NULL, HD_MAX_SCHEDULER_PRIORITY);
```

### GeneralCallback(void* ptr)
```cpp
// ロボットへの外力を表現
CMFCApplication15Dlg::c_pInstance->RobotTauCallback();
```

### RobotTauCallback()
```cpp
// ロボットへの外力を計算
const Double7& tau = m_tau_ext_hat_filtered;
for (i = 0; i < sizeof(tau.val) / sizeof(tau.val[0]); i++) {
	Amplitude += fabs(tau.val[i]);
}

// 係数を掛ける
Amplitude *= m_EdTauAmp;

// スタイラスに力を加える
hdSetDoublev(HD_CURRENT_FORCE, force);
```
WordPressで時間がずれてしまう

# 前提
WordPressでcurlコマンドを使用し外部APIから日時を取得し表示したいが、
時間がずれてしまう、、、
WordPressの管理画面でTimeZoneの設定が出来るらしいが、
筆者はWordPressの設定に詳しくないので
コードを書いて実装したいと思いました。

## 対処
一般的な記述をすると世界標準時が表示され9時間程ずれる。
```
date(“Y-m-d H:i:s”)；
```

```
$hoge = $get_response_data['datetime'];
$timezone_tokyo_hoge = DateTime::createFromFormat('Y-m-d\TH:i:s+',$hoge);
$timezone_tokyo_hoge->setTimezone(new DateTimeZone('Asia/Tokyo'));

echo date_format($timezone_tokyo_hoge,"Y年m月d日 H時i分");
```
とりあえずこの変数内ではtimezoneの設定が出来ている。
BigQueryClientを用いて1レコードずつの読み取りを行う

# 初めに
.NETのBigQuery APIライブラリ（NuGetパッケージだとGoogle.Cloud.BigQuery.V2）を用いて、BigQueryからレコードを取得する場合、サンプルソースなどではジョブの完了を待って結果を読みだす方法が書かれている。
一方、IDataReaderのReadメソッドの様に、一件ずつレコードにアクセスしたい場合もアプリケーションの仕様として求められる場合がある。
後者の場合、どのようなコードになるのかをこの投稿では例示する。

# ジョブ完了まで待つ場合のコードサンプル
コードサンプルというか、Googleのページにあるサンプルそのまま。
```c#:GetAtOnce
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryQuery
{
    public void Query(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        string query = @"
            SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013`
            WHERE state = 'TX'
            LIMIT 100";
        BigQueryJob job = client.CreateQueryJob(
            sql: query,
            parameters: null,
            options: new QueryOptions { UseQueryCache = false });
        // Wait for the job to complete.
        job.PollUntilCompleted();
        // Display the results
        foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
        {
            Console.WriteLine($"{row["name"]}");
        }
    }
}
```
これだと、全件の件数が多すぎた場合にも途中で打ち切ることなくレコードを取得しなくてはいけない。

# 一件ずつ読み込むコードの例

```c#:GetOneByOne
public class BigQueryQueryOneByOne
{
    public void Query(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        string query = @"
            SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013`
            WHERE state = 'TX'
            LIMIT 100";
        BigQueryJob job = client.CreateQueryJob(
            sql: query,
            parameters: null,
            options: new QueryOptions { UseQueryCache = false });
        // Wait for the job to complete.
        BigQueryResults results = client.GetQueryResults(job.Resource.JobReference, queryResultOptions).ThrowOnAnyError();
        IEnumerator<BigQueryRow> recordEnumerator = results.GetEnumerator();
        // Display the results
        int rowCount = 0;
        while(recordEnumerator.MoveNext())
        {
            if(rowCount > 1000)
            {
                // 読み込みを1000件で打ち切る。
                break;
            }
            BigQueryRow row = recordEnumerator.Current;
            Console.WriteLine($"{row["name"]}");
            rowCount++;
        }
    }
}
```
こんな感じになる。
Apexバッチのサンプル

質問の答えにできるようなシンプルなコードを準備しておきたいと思います。


[Write a Batch Apex to Update all the Accounts with Industry as "Banking" to "Energy".](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000GiCiBSAV)

```
public class BAT_Update_Account implements Database.Batchable<sObject> {

    public Database.QueryLocator start(Database.BatchableContext BC) {
        // collect the batches of records or objects to be passed to execute

        String query = 'Select Id,Name From Account where type =\'Banking\'';
        return Database.getQueryLocator(query);
    }

    public void execute(Database.BatchableContext BC, List<Account> accList) {

        System.debug('******** accList ' + accList);
        List<Account> updateAccountList = new List<Account>();

        for (Account a : accList ){
            Account acc = new Account();
            acc.Id = a.Id;
            acc.Type ='Energy';
            updateAccountList.add(acc);
        }

        

        try {       
               

            if(updateAccountList.size() > 0) update updateAccountList;

        } catch(Exception e) {
            System.debug(e);
        }

    }  

    public void finish(Database.BatchableContext BC) {
    }

}
```
基数変換

## 進数
<b><font color =blue>10進数</font> - 0~9までの数字を使い、9の次で桁上がりする。
<font color =blue>2進数</font> - 0と1を使い、1の次で桁上がりする。
<font color =blue>8進数</font> - 0~7までを使い、7の次で桁上がりする。
<font color =blue>16進数</font> - 0~9までとA~Fまでを使い、Fの次で桁上がりする。
↓それぞれの関係
![radix_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/fce79809-83a3-06e1-4c4c-3f9e19df3d0d.png)

## 基数と重み対応表
<b><font color =blue>基数</font>は各桁の重み付けの基本となる数。
例：10進数123.45を表現する際、
1×10² + 2×10¹ + 3×10⁰ + 4×10-¹ + 5×10-²と表せる。
このように、N進数の基数はNです。

## N進数から10進数への基数変換
<b>ある進数で表現されている数値を別の進数で表現しなおす事を<font color =blue>基数変換</font>という。
2進数101.101を10進数で表すと5.625。
1 0 1 . 1 0 1 - 2進数
× × ×   × × ×  
4 2 1   ½ ¼ ⅛ - 2進数の重みをかける
4+0+1 + 0.5+0+0.125 = 5.625 - 足す
N進数の値を10進数で表すには、各桁にN進数の重みを掛けて足す。

## 10進数からN進数への基数変換（割り算 ・ 掛け算ver）
### 10進数から2進数への基数変換
<b>10進数5.625を2進数101.101へ基数変換
①整数部と小数部に分ける
(5と0.625)

<b>②整数部の変換 - 2で割って余りを<font color = blue>下から並べる</font>。※商は引き継いでいく
5/2 = 2 余り1
2/2 = 1 余り0
1/2 = 0 余り1
整数部は101

<b>③小数部の変換 - 2を掛けて整数部を<font color = blue>上から並べる</font>。※小数部のみ引き継いでいく
0.625 * 2 = 1.<font color = blue>25</font> ->この場合は小数部の0.25を引き継ぐ
0.25 * 2 = 0.<font color = blue>5</font> -> この場合は0.5
0.5 * 2 = 1.0 - 小数部分が0になったら終了。
小数部は101

このように10進数の値をN進数で表すには、<font color = blue>整数部はNで割り余りを下から並べる。
小数部はNを掛け整数部を上から並べる</font>。

### 注意点
<b>10進数で桁数が有限な小数を2進数に変換する場合、有限桁数で表現できるとは限らない。

## 2進数と8進数・16進数の関係
### 2進数を8進数に変換
<b><font color = blue>小数点を基準</font>に2進数3桁は8進数1桁で表現する。
例：2進数1100.01を8進数で表現すると14.2になる。
①1100.01 - 2進数
②<font color = blue>00</font>1|100|.|01<font color = blue>0</font>※青字は補っている数字 - 3桁ずつ区切り、足りないなら0で補う。
③0 0 1 |1 0 0|.|0 1 0
　× × ×　× × × 　× × ×
　4 2 1　4 2 1　4 2 1 - それぞれに2進数の重みを掛ける。
④0+0+1|4+0+0|.|0+2+0| - それぞれを足す
⑤14.2になる - 8進数

### 2進数を16進数に変換
<b><font color = blue>小数点を基準</font>に2進数4桁は16進数1桁で表現する。
例：2進数1100.01を16進数で表現するとC.4になる。
①1100.01 - 2進数
②1100|.|01<font color = blue>00</font>※青字は補っている数字 - 4桁ずつ区切り、足りないなら0で補う。
③1 1 0 0|.| 0 1 0 0
　× × × ×　× × × × 
　8 4 2 1 　8 4 2 1　- それぞれに2進数の重みを掛ける。
④8+4+0+0.|0+4+0+0| - それぞれを足す
⑤C.4になる - 16進数　※12ではなく、Cになる

参考文献：イメージ&クレバー方式でよくわかる 栢木先生の基本情報技術者教室
ERROR: Pool overlaps with other one on this address space　が出た時の対処

## 事象
dockerの環境構築時、

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

をやったら

```
ERROR: Pool overlaps with other one on this address space
```

が表示された場合

## 対処
利用されていないネットワーク設定を削除する

```bash
docker system prune
```


[使用していない Docker オブジェクトの削除（prune）](https://docs.docker.jp/config/pruning.html)
【図解】なぜ活性化関数が必要なのか

# 対象読者
- ディープラーニングの概要をある程度把握している方
- 活性化関数がなぜ必要なのか分からない方
- 雑な説明でも許せる方

# 問題
活性化関数はディープラーニングの重要な要素の一つです．
ですが何故必要なのでしょうか？
- 複雑にしたいなら層を増やせば良いだけなのでは？
- なぜ非線形関数である必要があるの？

などの疑問が湧くと思います．
そんな疑問を一緒に紐解いていきましょう!

# 解説
## まず1層の場合を見てみましょう
入力を$x$，重みを$w$，バイアスを$b$とすると，層は
$xw+b$と表せます．
![Untitled Diagram-Page-4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1737204/1f902f09-2d89-946f-20df-1991913725b9.png)

簡単ですね．
## 次に2層の場合を見てみましょう

$w_1$は1層目の重み，$w_2$は2層目の重みです．
![Untitled Diagram-Page-4.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1737204/41ccb4f3-c8ff-15d2-ec3c-09554d68f731.png)

式は $(xw_1+b_1)w_2+b_2$ となります．
1層目の出力を2層目に入れただけです．
簡単ですね.

## 本題
上の2層の場合を変形していきます．
線形代数の分配法則から次のように展開できます．
$w_2$を赤と青の部分にそれぞれ掛けていきます．
![Untitled Diagram-Page-4.drawio (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1737204/5117652b-012b-9cd8-a5a3-5ee85e470045.png)

次に結合法則から黄色と緑の部分を先に計算してしまいます．
![Untitled Diagram-Page-4.drawio (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1737204/364c1b0f-6269-d456-f023-0e4bb06ed9c3.png)


どうでしょうか，
2層の複雑な図が1層のようにスッキリと表すことができました．
気持ちいいですね！

気持ちいいまま止まっていてはいけません．
ここでスッキリした図をよくみてみましょう.
1層の時と同じ形ですね.

**つまり，活性化関数がない場合どんなに層を深くしても1層と同じ式に変形できてしまうのです．**

これで層を深くしても活性化関数がなければ複雑にならないことがわかりましたね.

では活性化関数を使った場合はどうでしょうか？
## 活性化関数を使った場合
![Untitled Diagram-Page-4.drawio (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1737204/5298a206-2bcb-c4d6-f504-9724656b96a2.png)

はい，こんな感じです．展開できずスッキリしませんね．
**ここで重要なのは活性化関数が非線形な点です．**
線形だと展開できてしまいますからね．

これで活性化関数が非線形である必要がわかりましたね．

# 終わりに
自分自身勉強し始めた際ここで躓いて苦労しました．
誰かの支えになれたら幸いです．
訂正などがありましたら遠慮なく言ってください．私が成長できます．
Nuxt 3 RC の SSG ( generate ) を使ってみた。

# この記事の内容
昨年 Nuxt 3 Beta が出てわりと話題になっていたのですが、generate が実装されておらず使えないなーと思って放置していました。
が、先日やっとRCが出て、generateもできるようになったとのことで、早速試してみました。

※2022/04/24時点の記事です。

追記：2022/05/25
こちらに書かれているgenerateの問題は RC3 で解決したようです。RC3 では従来どおりの階層（サブディレクトリ内のindex.html）にファイルが出力されます。

# 手順

## 環境
- node v16.14.2
- VSCode
  - Veturは無効にし、Volarを有効に。
- Ubuntu 21.10

## Hello World
まずは デフォルトプロジェクトで動作確認。
```
npx nuxi init nuxt-app
cd nuxt-app/
yarn install
yarn dev
```
ブラウザで http://localhost:3000/ にアクセス。デフォルトのトップページが表示されます。特に問題ありません。

新規のトップページを作ります。
```pages/index.vue
<template>
  Hello World.
</template>
```
app.vueでpagesを参照するようにします。
```app.vue
<template>
  <div>
    <NuxtPage />
  </div>
</template>
```
Hello World. と表示されます。

## テスト用にいくつかのページを作成
```pages/page1.vue
<template>
  Page1
</template>
```
```pages/page2.vue
<template>
  Page2
</template>
```
```pages/index.vue
<template>
  <a href="/page1">page1</a> /  <a href="/page2">page2</a>
</template>
```
※ちなみに Nuxt 3 は Vue 3 ベースなので template 内を一つの div で囲むようなことは不要です。

ブラウザで表示させ、リンクでページ遷移することを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90225/f2d5af83-6689-e0df-cfea-1a74a777f906.png)
こんな感じです。

## Generate してみる
```
yarn generate
```
↓このように作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90225/56b10c29-3470-a4b5-825d-a6a68ca8a899.png)
↓Nuxt2の際はデフォルトでは以下のようになっていたかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90225/7137a524-befb-bc06-8ad0-439f1132a579.png)

追記：2022/05/25
こちらに書かれている問題は RC3 で解決したようです。RC3 では従来どおりの階層（サブディレクトリ内のindex.html）にファイルが出力されます。


ここで、一見「あー、シンプルになったなー。良い良い。」と思ったのですが、よく見てみると、index.htmlのリンクは
```index.html
...
<a href="/page1">page1</a> / <a href="/page2">page2</a>
...
```
という出力になっており、拡張子「.html」がついていません。なので、このままではリンク先が404になります。困った。

## 考えられる対策
- Nuxt2方式で出力するようにconfigで設定する。
  - →できるかどうか不明。Nuxt2に倣って「subFolders: true」などとやってみたがうまく行かず。
- 毎回出力されたファイルを書き換える。
  - →やりたくない
- SSGでの挙動を優先し、最初から拡張子付きのリンクにする（SPAではリンク切れ）
  - 最悪これかな？
- その他
  - 何か方法あるんですか？ :href とかでリアクティブに書けば行けるかもしれないけどさすがに面倒くさくないですか？
  - ※誰かベストプラクティスを知ってる方、教えてください。

## SSGでだけリンクされるように書く(SPAはあきらめる)
思いつかなかったので（時間がなかったので）2番目の案でやってみます。
```index.vue
<template>
  <a href="/page1.html">page1</a> /  <a href="/page2.html">page2</a>
</template>
```
これで一見うまく行きそうですが、実はうまく行きません。これでは generate しても page1.html と page2.html が出力されません。リンク先が外部ファイルだとみなされファイル出力対象から外れてしまうからですね。

というわけで、こうやってみました。
```index.vue
<template>
  <a href="/page1.html">page1</a> /  <a href="/page2.html">page2</a>
  <div style="display:none">
    <a href="/page1">page1</a> /  <a href="/page2">page2</a>
  </div>
</template>
```
これで行きました。

ダサい！ダサすぎる！！

## 余談：Windows 10 の場合
Windows 10 ＋ Git bash で generate を実行してみると、以下のようなエラーになりました。
```
 ERROR  Only file and data URLs are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'd:'
```
これはうちの環境だけ（Git bashの設定など）の問題でしょうか？

とりあえずこの問題も未解決のまま放置しています。

# 考察
というわけで、今のところこのダサい案でやっています。
もっといい方法きっとあると思うのですが、ご存知の方は誰か教えてください。