OmniAICreator/Qiita-1.07M huggingface dataset:
clang で -CC オプションを使用すると関数形式のマクロの引数部分にブロックコメントがある場合にエラーとなる

# 対象

clang は 8.0.0 を使用。

```console
~$ clang-8 --version
clang version 8.0.0-3~ubuntu18.04.1 (tags/RELEASE_800/final)
Target: i686-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```

`-CC` オプションは以下の通り。

http://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-cc

> -CC, --comments-in-macros
> Include comments from within macros in preprocessed output

確認には以下の内容の test.c を使用。関数形式のマクロ `aaa` の引数部分にブロックコメントがある。

```c:test.c
#include <stdio.h>

#define aaa(/* comment */ a, b) a = b

int main(int argc, char* argv[]) {
  int x = 0;
  int y = 1;
  aaa(x, y);
  printf("x = %d\n", x);
  return 0;
}
```

# 問題

`-CC` オプションを使用すると以下のように "error: invalid token in macro parameter list" とエラーになる。

```console
~$ clang-8 -E -CC -o test.txt test.c
test.c:3:13: error: invalid token in macro parameter list
#define aaa(/* comment */ a, b) a = b
            ^
1 error generated.
```

`-C` オプションや通常のコンパイルでは以下のようにエラーにならない。

```console
~$ clang-8 -E -C -o test.txt test.c
~$ clang-8 test.c
```

gcc でも以下のようにエラーにならない。

```console
~$ gcc-7 -E -CC -o test.txt test.c
```

# 対処方法

わからない。

# 関連

以下のリンク先のように報告済みだった。

* https://bugs.llvm.org/show_bug.cgi?id=33609
KiCad PCB基板ファイルからfootprintライブラリを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a907fb00-1f0b-7c62-9239-5fe1ee19b16e.png)


BLEトレーニングボードのアオノドンです。これをモジュールとして使えるようにフットプリントライブラリを作ります。


以下の記事を参考に
「Is there a way to convert whole PCB in new footprint?」
https://forum.kicad.info/t/is-there-a-way-to-convert-whole-pcb-in-new-footprint/6615/16

記事の中に貼ってあった
pcb_to_footprint.py
を試したところ、Python3で動作しませんでした。

なので書き換えて使えるようにしたものを公開します。
https://github.com/nanbuwks/kicad_pcb_to_footprint3

# 環境
- Ubuntu 18.04
- Kicad5.1.4
- Python3.6

:::note

2023/07/08追記


- Ubuntu 22.04
- KiCad 7.0.6

 で実行するとエラーが出ました。
以下の記事で別のやり方で対応しています。

「KiCad7 で PCB基板ファイルを元に footprint ライブラリを作る」
https://qiita.com/nanbuwks/items/fb2850fbe81a64d4ceeb

```
:::

# 使いかた

kicad_pcb_to_footprint3-master.zipをダウンロードして適当な場所に展開します。

特に指定しなければ kicad_pcb_to_footprint3-master というディレクトリができるはずです。

次に、
https://github.com/pointhi/kicad-footprint-generator からも、
ZIPをダウンロード、kicad_pcb_to_footprint3-master フォルダの中に
解凍します。

```

kicad_pcb_to_footprint3-master
├── README.md
├── pcb_to_footprint3.py
├── kicad-footprint-generator-master
│   ├── AUTHORS.md
│   ├── KicadModTree
.
.
.
```

となるようにします。

# pcb_to_footprint.py を編集

フットプリントに反映したいパーツを羅列します。

```

connector_refs = ("P1",P2","U1","U5","P3","BT1","U4","P4","P5","P7","P8")
```


その上で、PythonコンソールをPCBNEWから出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/10578b5b-918d-fb8a-c507-440fd207b281.png)


以下のようにしてpcb_to_footprint3.pyのあるディレクトリに移動します。


```

>>> pwd
/home/nanbuwks
>>> cd Downloads
/home/nanbuwks/Downloads
>>> cd kicad_pcb_to_footprint3-master
/home/nanbuwks/Downloads/kicad_pcb_to_footprint3-master
>>> ls
README.md
kicad-footprint-generator-master
pcb_to_footprint3.py
```

kicadプロジェクトのあるフォルダを以下のようにして入力します。

```

>>> import sys
>>> sys.argv = ['','/home/nanbuwks/storage/KiCad/MDBT50QSTICK/test']
```

ここではプロジェクトファイルのあるディレクトリを指定していて、出力する footprint ファイルの場所はプロジェクトファイルの場所になりますが、

```

>>> import sys
>>> sys.argv = ['','/home/nanbuwks/storage/KiCad/MDBT50QSTICK/test/MDBT50QSTICK.pro']
```
とプロジェクトファイルを指定すると、出力する footprint ファイルの場所がカレントディレクトリになります。

なお、プロジェクトファイルの場所はpcbnewのタイトルを参照。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e477f1a9-c3ef-be94-5504-c84456efb062.png)


実行します。

```

>>> exec(open("pcb_to_footprint3.py").read())

```

```

Found project /home/nanbuwks/storage/KiCad/MDBT50QSTICK2019/test/MDBT50QSTICK
Found pcb: /home/nanbuwks/storage/KiCad/MDBT50QSTICK2019/test/MDBT50QSTICK.kicad_pcb
origin 32, 75
writing /home/nanbuwks/storage/KiCad/MDBT50QSTICK2019/test/MDBT50QSTICK.kicad_mod
>>> 
```


フットプリントエディタを起動し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f4f44c4e-2b26-cd5d-3c9a-7d9fa416e3f9.png)


「File」-「Import Footprint from KiCad File...」
でインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/95d205f2-173c-1577-fa51-935d12b3b3d5.png)


Edit-Footprint Properties
でプロパティを調整、
パッド番号を調整などをして、
Save as ... で保存するライブラリを指定して保存します。
ターミナルのコマンドを実行してGithub Pagesでサイトを公開する方法

自分でちょっとつまづいて、忘れそうなので備忘録として書き残しておきます。

Github Pagesでサイトを公開する方法です。

Github Pagesでポートフォリオサイトを作成したけど、GithubDesktopでGitHubへプッシュするときに下記のエラーメッセージが出て、プッシュができないという状況になりました。

どうしようかと思って色々調べていると、ターミナルから下記のコマンドを実行したら、プッシュができました。

リポジトリにコミット
```
$ git add --all
$ git commit -m "任意のメッセージ"
```
GitHubへプッシュ
```
$ git push -u origin master
```
パスワードを入力して、実行できました。
Babelの基本的な使い方

## 何をするツール?
JSコードを別の形のJSコードに変換するツールです。
* 新しい文法を使って書かれたコードを古い文法を使うコードへの変換
* ブラウザーが準拠していないAPIを使うためのpolyfillへの変換
* コードの最適化
など、様々な用途に使えます。

## 使い方
babelにはコア機能を提供する@babel/coreパッケージと、それをターミナルから操作するための@babel/cliがあります。
まずはこれらをインストールします。
`yarn add @babel/core @babel/cli`
そして、以下のようにしてbabelを実行します。
`./node_modules/.bin/babel src --out-dir dist`
上の例だと、srcがソースディレクトリでdistが変換したコードを出力するディレクトリです。

試しに以下のmain.jsを古いブラウザでも動くように変換して見ようと思います。

```
const addOne = (x) => x + 1;
console.log(addOne(2))
```

変換する前に、babelに変換ルールを設定する必要があります。今回は「古いブラウザでも動かせるようにする」という目的の下、設定を書きます。
以下の設定は公式サイトのチュートリアルで使用されている設定です。

```
const presets = [
  [
    "@babel/preset-env",
    targets: {
      edge: "17",
      firefox: "60",
      chrome: "67",
      safari: "11.1",
      ie: '16'
    },
    useBuiltIns: "usage"
  ]
];
module.exports = { presets };
```

１つずつ解説していきます。
babelの変換ルールはpluginと呼ばれ@babel/plugin-<xxx>のような名前のpackageとして提供されます。そして、それらのpluginをまとめたものがpresetsです。
上の例では@babel/preset-envをというpresetsを使っています。
preset-envはアロー関数などの比較的新しいJSの文法を古いバージョンのブラウザでも動作するように変換するpluginをまとめたものです。targetsに渡しているオブジェクトはJSを動作させるブラウザの最低バージョンです。つまり、edgeの17以上やfirefoxの60以上で動くようにコードは変換されます。
useBuiltinsはpolyfillをどのように扱うかのオプションです。
詳しい事は省略しますが、"usage"を指定するとpolyfillが必要なコードが含まれているファイルに、apiを含んだモジュールのimport文を挿入してくれます
`./node_modules/.bin/babel main.js --out-dir dist`を実行するとdist/main.jsというファイルが作成されます。中身はこんな感じです。

```
"use strict";

var addOne = function addOne(x) {
  return x + 1;
};

console.log(addOne(29));
```

変数addOneに代入しているアロー関数が、functionキーワードを使って定義された関数に変換されている事が分かります。


## 参考資料
[Babel](https://babeljs.io/docs/en/)
blender2.8でドミノを作ってみた

3DCGを触ってみようと思い立ち、初めてblenderというソフトをダウンロードしました。
物理演算等もできるようだったので、試しにドミノを作ってみました。

初めてダウンロードして碌に調べずに触ってみた感想レベルで記事を書いているので、用語とか知識とか色々間違ってるかもしれません。
実際にやってみると、変なところで詰まったり、全然説明しているサイトに辿りつけなかったりしたので、完全に備忘で、作業の流れに沿って書いています。

なお、画面配置等書いてますが、設定によって変わるらしいので、場合によって全然違う位置にある可能性もあります。

##そもそもblenderとは
3DCG作成ソフトです。
「blender ダウンロード」とかで検索すれば出てきます。無料でダウンロードできます。

## 作成の流れ
####オブジェクトの削除
初期画面だとなんか立方体がいるので削除しました。
オブジェクトを選択してdeleteキーで削除できます。

####オブジェクトの作成
左上の「追加」を押すと追加できます。
床と、ドミノのピースとなる立方体を並べていきます。
床は、最初メッシュの「平面」でやっていましたが、なぜか「平面」だとドミノがすり抜けていきました。
なので、立方体を薄くして、床にしています。

####接触判定の設定
リジッドボディを設定します。これが、接触する両方のオブジェクトに設定されていないと、すり抜けます。
ドミノには「アクティブ」を設定することで、重力の影響を受けて落下するようになります。
床には「パッシブ」を設定します。「パッシブ」だと、その場に留まりつつ、リジッドボディ同士で接触するようになります。

なお、接触判定のためには、他にもコリジョンとかあるらしいです。
ソフトボディだとコリジョンは設定が必要そうですが、リジッドボディ同士だと不要なようです。


####オブジェクトを並べる
ドミノのピースをShift+Dで複製して、そこそこの間隔に並べておきます。
ドミノの最初のピースは、勝手に倒れるように、前のめりになるよう、斜めに回転して配置します。

####ボールの配置
板が倒れていくだけだと面白みがなかったので、終着点に球体を置きました。
どっちでも良いと思ったので、今回はICO球を使っています。
作ってから調べて知りましたが、ポリゴン数が少ない場合、UV球の方がICO球より綺麗に見えるらしいです。

ボールは、ドミノに勢いよく飛ばされるよう、重量を0.1kgに設定しました。
デフォルトは1kgなので、デフォルトの1/10の重さです。
設定前後で、速さは10倍とかいかないまでも、明らかに勢いが良くなってました。

####板の追加
せっかくなので、ボールが板にあたって、上段にあるドミノが折り返して倒れるようにしました。
物理演算が効いているので、長い板の下部分にボールが当たると、板が滑って倒れてきます。



#### 画像出力
地味に詰まりました。
レンダリングを実行すると、下記画像の場所のファイルフォーマットで、画像入力フォームのパスに勝手に出力されるようです。
てっきりレンダリングした後に出力するものかと勘違いしていたせいで、色々探し回るはめになりました。

![レンダリング出力画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451284/4b3509cc-40af-2e88-23af-5b5ea241342d.png)




##結果
![ダウンロード_10fps.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451284/4f9164e8-7316-b2f3-7e7d-d8ee7a0255e1.gif)

##まとめ
3Dモデリングソフトを触ろうと思い至ったはずなのに、なぜか物理演算で遊ぶ結果になってしまいました。
しかし、変な箇所で詰まることが多々ありましたが、やり方さえ分かってしまえば、割と簡単にできました。
色々できそうで面白そうなので、ちゃんと3DCGも作成しようと思います。

もし興味がありましたら、blenderをダウンロードしてみるのも良いかもしれないです。
VisualStudioの拡張機能をうまく活用すると人生が楽になる 【VisualStudio】【Unity】




![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/31c7d395-d099-207e-bbe9-fe759105ee58.gif)
floatの変数0.0fで初期化、stringはstring.Emptyで初期化...など
コードを書くときある程度プロジェクト毎にお約束のテンプレートがあったりすると思うのですが、何回も書くのが少し面倒になる時があります。

VisualStudioの拡張機能SnippetDesignerを利用すると自分の好きなコードのテンプレートが作れ、その問題が解決されます。　

実装手順
-------------------
######1.[ツール] ->[拡張機能と更新プログラム] ->[オンライン]からSnippetDesignerをインストール
![snippet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/1d3851f8-5f11-9b36-d954-9ce1f528803e.png)

######2.テンプレート化したいコードを選択して右クリックからExportasSnippetを選択
![prop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/3d1fb2e1-03e4-afc0-5d08-d35e5831c10b.gif)

######3.最後に名前など書き換える必要のある部分を$$で囲みShotcut名を付ければ完成!
![shotcut.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/9b54c3cc-d865-13fc-7537-e40c1c8928d4.png)

使用した結果
------------------

![gif2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/466a4e69-5926-21e4-6b45-591c2a9a9ab1.gif)

早い

よく使うコーディングに利用すれば大幅に効率を上げることが出来そうです。
プロジェクト内でしか利用できないショートカットを作ったとしても後で編集や削除が容易にできるのでどんどん活用していきましょう!
そもそもJSONファイルってなんぞや : AzureやAWSのコードを理解するための第一歩

#きっかけ
AzureやAWS初心者の筆者が送る体験談
EC2インスタンスをGUIでポチポチ作成していたが、コードで書いてみたくなった
しかし、JSONファイルなるものを理解しなければ、このコードを読み解くのも困難であろう…
リファレンスを参照すると何となく「ここを変更すればいいんだなー」って思うものの、気合入れて読まなきゃいけない現状・・・

というわけで、JSONファイルって何ぞやと思い調べてみました

#参考文献
JSON の紹介
https://www.json.org/json-ja.html

JSON入門
http://www.tohoho-web.com/ex/json.html


#JSONとは
JavaScript Object Notation(正式名称）
データを交換するフォーマット
KeyとValueがセットになっている（KVSと呼ばれる）
配列のしくみを利用する

#文法
##1データを交換するフォーマット
{
・・・・・・
}

##2KeyとValue（KVS）
{
Key : Value
}

文字列は「" "」(ダブルクォーテーション）
数値はそのまま
階層構造を持てる

##3配列のしくみ
{
Key : [・・・配列・・・]
}
WordPressをEC2のBitnamiを使ってSSL（https）する際に聞かれるメッセージの備忘録

BitnamiでWordpressを導入した場合、Let's EncryptのSSL証明書を取得するコマンドが事前に提供されており、SSHでサーバーに入って `sudo /opt/bitnami/bncert-tool` をたたけば一発OKです。

始めてコマンドを叩いたときは衝撃的だった。
本当に全部やってくれます。

ただ初めてやるときは何を聞かれるか（私はすごーく）不安なので、そのコマンド上のメッセージをメモ。ただそれだけです。きっとニーズはあるはず。

## 環境
記事投稿時のAmazon マシンイメージ (AMI)

```
WordPress Certified by Bitnami and Automattic
 (114)| 5.3-0 on Ubuntu 16.04 以前のバージョン | 担当 Bitnami
Linux/Unix, Ubuntu 16.04 | 64 ビット Amazon マシンイメージ (AMI) x86 | 更新済み: 2019/11/14
```

下記、そのやりとり。
英語に自身ないのでGoogle翻訳などで解釈ください。

### 質問: 1つ目
```
----------------------------------------------------------------------------
Welcome to the Bitnami HTTPS Configuration tool.
----------------------------------------------------------------------------
Domains

Please provide a valid space-separated list of domains for which you wish to 
configure your web server.

Domain list []: 
```
> your-domain.com

（SSLしたいドメインを入力する）

### 質問: 2つ目
```
The following domains were not included: www.your-domain.com. Do you want to add them? [Y/n]: 
```
> n

（wwwをつけるかは好みで）

### 質問: 3つ目
```
Warning: No www domains (e.g. www.example.com) or non-www domains (e.g. 
www.example.com) have been provided, so the following redirections will be 
disabled: non-www to www, www to non-www.
Press [Enter] to continue:
```
> (Enterを押す)

### 質問: 4つ目
```
Enable HTTP to HTTPS redirection [Y/n]: 
```
> Y

（httpへのアクセスはhttpsにリダイレクトを設定するか。）

### 質問: 5つ目
```
1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains: your-domain.com
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: your-domain.com
5. Enable HTTP to HTTPS redirection (example: redirect http://your-domain.com to https://your-domain.com)
6. Start web server once all changes have been performed
```
> Y

（1〜6を行うけど問題ないかの確認。cronまで設定してくれるっぽい）

### 質問: 6つ目
```
Please provide a valid e-mail address for which to associate your Let's Encrypt 
certificate.

Domain list: your-domain.com
Server name: your-domain.com
```
> your-mail@mail.com

（自身のメアドを入力）

### 質問: 7つ目
```
The Let's Encrypt Subscriber Agreement can be found at:

https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf

Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]: 
```
> Y

（同意しますか？）

### 質問: 8つ目
```
The configuration report is shown below.

Backup files:
* /opt/bitnami/apache2/conf/httpd.conf.back.201912031526
* /opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf.back.201912031526
* /opt/bitnami/apache2/conf/bitnami/bitnami.conf.back.201912031526

Find more details in the log file:

/tmp/bncert-201912031526.log

If you find any issues, please check Bitnami Support forums at:

https://community.bitnami.com

Press [Enter] to continue:
```
> (Enterを押す)


### 参考
* https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/

おしまい！
RxSwift MVVM における ViewModel 設計

自分は RxSwift で ViewModel はどうやって設計していくか下記三つ分けて書いていこうと思います。

- Immutable
- テストのしやすさ
- プロトコルの読み取りやすさ

## Immutable

- 可変を避けるため struct を使う。
- Observable, PublishSubject など値が流れ流けど不可変にする。
  - Protocol には var で定義されるが、struct では let で宣告します。

## テストのしやすさ

テストしやすく、 mock しやすくするため、 外部リソースはできれば全て DI できるようにします。
例えばデータ処理、API 叩きなどが書いてある struct や class らはコンストラクタの引数で渡します。
そして、 ViewModel 自身の中身に、全域的なオブジェクトやクラスを直接使用すること、できればしないようにします。

## プロトコルの読み取りやすさ

- インプットとアウトプットを分けて定義する

### RxSwift コンポーネントの使い分け

- インプットは PublishSubject を使う
- アウトプットは Driver を使う
    - 出口は UI なので Driver の方が良い
    - Driver はコンストラクタで初期化する

## 実装例


``` swift
import RxSwift
import RxCocoa

protocol MyViewModelInput {
    var titleChanged: PublishSubject<String?> { get }
    var contentChanged: PublishSubject<String?> { get }
}

protocol MyViewModelOutput {
    var titleLength: Driver<Int> { get }
    var contentLength: Driver<Int> { get }
}

typealias MyViewModelType = MyViewModelInput & MyViewModelOutput

struct MyViewModel: MyViewModel {
    let titleChanged = PublishSubject<String?>()
    let contentChanged = PublishSubject<String?>()

    let titleLength: Driver<Int>
    let contentLength: Driver<Int>

    init() {
        titleLength = titleChanged
          .map { title in
              guard let title = title else { return 0 }
              return title.count
          }
          .asDriver { _ in .empty() }


        contentLength = contentChanged
          .map { content in
              guard let content = content else { return 0 }
              return content.count
          }
          .asDriver { _ in .empty() }
    }
}

```

## ViewModel 以外は？

アウトプットがある場合、相手は UI 出なければ Observable や Single でしておいて大体問題ないと思います。


## 結

わかりにくい、説明不足ところや間違えたところあればぜひコメント欄にコメントしてください。
「初めてのGraphQL」を読んだので理解したことをまとめてみた

本投稿は [品川Advent Calendar 2019](https://qiita.com/advent-calendar/2019/shinagawa) の4日目です。

[初めてのGraphQL](https://www.oreilly.co.jp/books/9784873118932/) を読んだので、理解したことや試したことを書いています。

# GraphQLとは？
色々な記事が既に投稿されているので、ざっくり説明です。

- Web APIの1つ
- REST APIの課題を解決するために考案および開発された
- グラフ理論（無向グラフとか有向グラフとかのあれです）の知見を活用（しているらしい）
- [Facebook](https://developers.facebook.com/docs/graph-api) や [GithubのAPIバージョン4](https://developer.github.com/v4/) のAPIで採用されている
- SQLっぽいクエリでAPI呼び出しを行う

# REST APIの課題
REST APIの発展により、昨今、目的のデータに辿り着くのが難しくなっているのが課題のようです。

- レスポンスに不要なデータが含まれており、通信時間やアプリケーション上での処理コストが高くなってしまう
 - レスポンスが何百行にもなっていたりネストがやたら深かったりして、目的のデータに辿り着くのに時間がかかった経験はありませんか？
- レスポンスに必要なデータが含まれておらず、他のいくつかのAPIを呼び出さないと目的のデータが取得できない
 - APIが細分化されているせいで、目的のデータを取得するためにわざわざシリアルで複数のAPIを利用した経験はありませんか？ 

# GraphQLによるREST APIが持つ課題の解決
上で挙げたREAT APIの課題解決のために、GraphQLはこんな感じで目的のデータを取得できます。

```
# ID:5 の人の名前、身長、体重、住所（国のみ）を取得
query {
  person(personID:5){
    name
    height
    weight
    address {
      country
    }
  }
}
```
```
# レスポンスデータ
{
  "data": {
    "person": {
      "name": "taro",
      "height": 170,
      "weight": 70,
      "address": {
        "country": "Japan"
      }
    }
  }
}
```
REST APIだと、レスポンスに性別や全ての住所といったデータが返ってくるように設計されていることが多いと思いますが、GraphQLだと目的のデータだけを指定して取得することが可能です。

# GraphQLの問い合わせ（クエリ）を試してみる
## お試しできる環境
- [SWAPI](https://graphql.org/swapi-graphql) スターウォーズAPI
- [Github API](https://developer.github.com/v4/explorer/) 要ログイン
- [snowtooth](https://snowtooth.moonhighway.com/) 架空のスキー場のGraphQL APIを試せる環境
 - [GraphQLのクエリを基礎から整理してみた](https://qiita.com/shunp/items/d85fc47b33e1b3a88167) にクエリ種別の説明やクエリを試した結果が記載されており、参考になります
- [その他いろいろ](https://github.com/APIs-guru/graphql-apis) 

# 現状の所感
- API利用者としては、目的のデータにすぐにアクセスできるのでGood!
- 構造的な問い合わせができること、スキーマを考慮したデータの授受ができることは、元DBエンジニアの自身個人としてはしっくりくる

# まとめ
今回はAPI利用者目線で理解したこと、試したことを書いていますが、今後はAPI開発者目線やAPI管理などの目線で色々試してみたいと考えています。

APIマネジメント製品でどう管理していくのかも調査してみたい。
Python用の設定ファイルを書くときのメモメモ：configparser

最近Laravel vuejsにハマってます。Pythonも書いてますが、ちょっと減り気味。
携わってたサービスが少し前に進みそうで嬉しい。

なんか良くこれ彷徨う気がするので自分用のメモ。
なんかiniファイルとか読み込むときの簡易サンプルである。

これいいね。これが欲しかった。ってか何でライブラリで機能提供されてないの。
https://qiita.com/suto3/items/db6f05f943cc2ea2ef59

```python:
#!/usr/bin/env python                                                                                                                                         
# -*- coding:utf-8 -*-                                                                                                                                        
import os
import configparser

config = configparser.SafeConfigParser()
#絶対パス使え。（たぶん）
path = os.path.dirname(os.path.abspath(__file__))
path = os.path.join(path, 'hoge.ini')

print(path)
config.read(path)

value = config.get('general', 'hoge1')
print(value)

#======

def get_config(ini):
    for section in ini.sections():
        keys, values = get_section(ini, section)
    return keys, values

def get_section(ini, section):
    keys, values = [], []
    for key in ini.options(section):
        key, value = get_by_key(ini, section, key)
        keys.append(key)
        values.append(value)
    return keys, values

def get_by_key(ini, section, key):
    return [key, ini.get(section, key)]

keys, values = get_config(config)
print(keys, values)



```


```:hoge.ini
[general]
name1=名前だよ
path=/home/user/hoge/
```
rails install:webpackerができない件について

## 環境
* rails 5.2.3
* ruby 2.6.3
* yarn 1.19.2

## エラー内容

railsでvue.jsを追加するために、rails install:webpackerをしようとしたところ

```
rails aborted!
Sprockets::Railtie::ManifestNeededError: Expected to find a manifest file in `app/assets/config/manifest.js`
But did not, please create this file and use it to link any assets that need
to be rendered by your app:

Example:
  //= link_tree ../images
  //= link_directory ../javascripts .js
  //= link_directory ../stylesheets .css
and restart your server
/Users/user/railsProjects/vuejs-on-rails/config/environment.rb:5:in `<main>'
/Users/user/railsProjects/vuejs-on-rails/bin/rails:9:in `<top (required)>'
/Users/user/railsProjects/vuejs-on-rails/bin/spring:15:in `require'
/Users/user/railsProjects/vuejs-on-rails/bin/spring:15:in `<top (required)>'
./bin/rails:3:in `load'
./bin/rails:3:in `<main>'
Tasks: TOP => app:template => environment
(See full trace by running task with --trace)
```

このようなエラーがでました。

## 対応

調べたところ、[【Rails】rails webpacker:install に失敗する場合の対処法](https://qiita.com/sanriyochan/items/52780af6a9d77d8a14ba)にたどり着き、書いてある通りにconfigにwebpacker.ymlを追加したところ、エラーが変わりませんでした😇

その後、yarnのupgradeをしても変わりませんでした😇

下記のエラーを確認

```
Expected to find a manifest file in `app/assets/config/manifest.js`
```

app/assets/config/manifest.jsに

```rails:app/assets/config/manifest.js
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
```

を追加

### 無事にrails install:webpackerが通りました。

## 参考

* [【Rails】rails webpacker:install に失敗する場合の対処法](https://qiita.com/sanriyochan/items/52780af6a9d77d8a14ba)
* [【rails sできない解決法】rails aborted! Sprockets::Railtie::ManifestNeededError: Expected to find a manifest file](https://qiita.com/kaorioka09jm/items/5b70c0567fa393aeef6a)
SteamVR unity Plugin v2系で詰まったところ覚え書き

#この記事の目的と背景
本記事はノンプログラマ(グラフィッカー)である筆者が
SteamVR Unity Pluginでコントローラのボタン入力などを
取ろうとして詰まったところとその対応の忘備録である。

#実行環境
unity 2017.4.28f1
SteamVR Unity Plugin - v2.4.5 (sdk 1.7.15)

HTC VIVE
steamVR1.8.21
OS:windows 10
Google Chorome

筆者スペック：unity歴2年(グラフィッカー)


#実施内容
##参考にした記事と手順
VIVEのコントローラからボタン入力を出来るようにしたいと考え調べたところ、
下記記事で丁寧に方法が紹介されていた。
https://qiita.com/htpn/items/9838f5cb5d78de90a5c2


##詰まった所
ただし、Open binding UIをクリックしても

>このサイトにアクセスできませんlocalhost で接続が拒否されました。
>localhost 8998 dashboard controller binding を Google で検索してください
>ERR_CONNECTION_REFUSED

と表示されるだけで先に進めなかった。
何らかのローカルパスエラーとして調べたが、
どこが問題なのか判然としなかったので
別の解決手段を探った。

##対応
https://steamcommunity.com/games/250820/announcements/detail/3809361199426010680?l=japanese
steamコミュニティの方にコントローラバインドについての記事があったので
HMDを被り、settingを開き、コントローラ割り当てを選択。
コントローラのバインドの編集のアプリケーションからunityで制作中のアプリ[testing]を選択すると
コントローラのバインド設定画面を呼び出すことができ、unity側で登録したアクションを設定できた。

(HMDでの設定画面についてはスクリーンショットの取り方がわからなかった。画像が無くて申し訳ない)

##まとめ

今回の環境と時間内で調べた限りでは、
これがバージョンなどによるものなのか、環境によるものなのか等は解らなかったが
いちいちHMDを被って設定を行うのは面倒くさいので、出来ればブラウザで完結できるようにしたい。
引き続き時間を見つけて調査と作業を進めていく。
消せない、スタイル（Excelで削除できないスタイルが発生した場合）

# 現象

SIerが大好きなExcelファイル（.xlsxファイル）。しかし編集を重ねるうちにいつの間にか大量の**スタイル**を抱えたメタボファイルになってしまいます。

- ちなみに、こうなってしまう原因の一つに「保護されたビュー」機能があるようです。
（名前定義もマクロもないブックが重くなる原因
  https://qiita.com/atmospheri/items/a3d0adb9bc82a4c6c8a2 ）

やたらと重いし下手に顧客名などを推測できる名前が含まれた状態でよそに出したら情報漏洩事故です。
ということで不要なスタイルは削除するわけですが…**消えない。**
秘伝のタレと化した大量のスタイルの中には往々にして、リボンから個別に削除してもVBAからDeleteしても決して消えないスタイルがあるものです。

# 原因
このようなことが起きる原因のひとつとして、スタイルの名前の末尾に何らかの原因でスペースが入っている場合があります。
ただしExcel上でスタイルの名前を直接変更しようとしても元のスタイルとは別に「消せるスタイル」が複製されてしまい、うまくいきません。

# 対処方法
**注意：.xlsxファイルの内部構造を壊してしまうおそれがあるので事前にファイルのバックアップを取っておくこと。**
用意するものは以下の2つ。
・ 7-zip（zipファイルを編集→更新できるアーカイバであれば他のものでも可）
・ サクラエディタ（正規表現で後方参照を使った置換ができるエディタであれば他のものでも可）
※サクラエディタは7-zipのツール→オプション→外部ツールから編集用外部プログラムとして設定しておく必要があります。

- 7-zipで対象の.xlsxファイルをアーカイブとして開きます。<br><img width="311" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494347/eeaba509-7368-e3b1-942c-693f7aa155ca.png">

- アーカイブ内の「xl\styles.xml」ファイルを選択し、編集（F4）を実行します。<br><img width="138" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494347/51aa57b1-6ed9-cf3e-3b74-beecae726dd9.png">

- エディタで見ると以下のように名前の末尾にスペースが入ったスタイルが見つかるはずです。<br><img width="358" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494347/040706fe-f5e5-aad0-68de-15f5d54be9d5.png"><br>
そこで、以下の条件で「すべて置換」を行います。（下記の正規表現では念のため先頭にスペースが入っている場合も削除しています）

|項目|値|
|:--:|:--:|
|置換前|name=" \*\(.\*?) \*"|
|置換後|name="\1"|
|正規表現|オン|
<img width="275" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494347/0e4cd528-3033-7e19-df7d-cab36b4b49eb.png">

- ファイルを保存してエディタを閉じます。
- 7-zipがファイルの更新を検知し、アーカイブの更新可否を尋ねてくるので「OK」を選択します。<br><img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494347/38b95069-6c75-6a61-0a20-34719e753c1b.png">

- 7-zipを閉じます。 
- Excelで.xlsxファイルを開き、不要なスタイルを削除します。

##備考
とにかくまずExcelファイルを外部に出すときは「ドキュメント検査」機能を使いましょう。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494347/eef9cd2c-aad8-bd74-438c-de5af1b1f047.png">
ドキュメント検査で指摘されるのに見つけにくい隠れデータとしては他にも以下のようなものがあります。

- Visible=falseが設定された名前の定義
- Visible=xlSheetVeryHiddenが設定されたシート

xls形式はもう捨てましょう…
Javascript コールバック関数の理解に関する備忘録

#Javascript コールバック関数の理解に関する備忘録

##コールバック関数、意味がさっぱりわからなかった
ProgateのJavascript編を学習していて、オブジェクト、クラスあたりから理解が怪しくなりコールバック関数のところ （JavascriptⅥ,Ⅶ）でついに意味が全くわからなくなった。

いくつか解説記事を読んで、コードを眺めていたら理解できた気がしたので、備忘録をQiitaでの初投稿も兼ねて書いておく。

今後、初学者のうちから積極的にメモとしてQiitaに投稿していきたい。


▼Progate Javascript Ⅶ.1より

```Javascript
const printWanko = () => {
  console.log("にんじゃわんこ");
};

const printHitsuji = () => {
  console.log("ひつじ仙人");
};

const call = (callback) => {
  console.log("コールバック関数を呼び出します。");
  callback();
};

// 引数をprintHitsujiに書き換えて出力を確認しましょう
call(printHitsuji);
```
▼出力

```
コールバック関数を呼び出します。
ひつじ仙人
```
▼この部分で、"call"という関数を定義して、他の関数が入る箱として"callback"という引数を準備する。

```js
const call = (callback) => {
  console.log("コールバック関数を呼び出します。");
  callback();
```

▼関数 "call"を"printHitsuji"を引数として実行
→（"callback"の部分に"printHitsuji"が代入される)

```js
const call = (callback) => {
  console.log("コールバック関数を呼び出します。");
  callback();
};

// 引数をprintHitsujiに書き換えて出力を確認しましょう
call(printHitsuji);
```

→console.log（"コールバック関数を呼び出します")が実行される
続いて"printHitsuji();"が実行される

...メモとして成立してるのか怪しくなってきた。
そもそも書いてみたらこれメモとして残すほどのものか？と思った。
でもさっきまで恥ずかしながら理屈が全くわかってなかったんだ。
多分またちょっと複雑なコードになったらわからなくなると思う。

他の未経験から学び始めた人たちのことはわからないけど、たぶん今のところ自分のプログラミングの理解スピードかなり低い方だと自覚してる。

先ほどtwitterでフォローしているエンジニアの方が、閾値を超えるとプログラミングがわかるようになってきてそこから勉強が楽しくなった。というようなことをツイートしていて勇気づけられた。

愚直に学習を継続してはやく1人前になりたい。
Angularスキル獲得のために始めたこと、始めること

お仕事だったり同期と作ったアドベントカレンダーだったりのおかげで、Angularを触る機会を得た小生でございます。
今までフロントどころか、Webアプリの制作もしたことがなかったので、これをいいことにいろいろと勉強していってる最中です。

# Angularを触るにあたって何を知っていたか
* HTML
* CSS
* Javascript
* Node.js

HTML、CSSはお猿さんと同じくらいの知識がありました。
JavascriptはほぼNode.js触ってから覚えた感じ。
元々プログラミング経験があったので、ここらへんはなんとか理解しつつ進めております。

# Angularを理解するためには
* **[公式：入門チュートリアル](https://angular.jp/start)**(Angular未経験者向け)
* **[公式：基礎チュートリアル](https://angular.jp/tutorial)**(入門チュートリアルをやった人向け)
* **[2020年のフロントエンドマスターになりたければこの9プロジェクトを作れ](https://qiita.com/rana_kualu/items/915345b8f3f870cfe2aa)**(公式チュートリアルを終えて基礎がわかった人向け)

特に**[2020年のフロントエンドマスターになりたければこの9プロジェクトを作れ](https://qiita.com/rana_kualu/items/915345b8f3f870cfe2aa)**はめちゃくちゃ面白いです。
Angularに限らず、フロントのフレームワークの基礎押さえたなら、それぞれ作っていくべきだと思います。
元記事ではフロントエンドマスターになるために様々なフレームワークを紹介していますが、まずは一本極めていくのが自分のやり方なので、Angularで絞ってやっていきます。

# 始めたこと：公式チュートリアル制覇
入門チュートリアルでは、Angularがどんな感じで動いているのかを理解できました。
基礎チュートリアルでは、**コンポーネント指向**に置いて説明がされている印象を受けました。
コピペだけで作れなくはないですが、用語が分からずともしっかり説明を読んで、ちょこちょこコードをいじったりするとより理解が深まります。

# 始めたこと：[Build a movie search app](https://www.freecodecamp.org/news/how-to-build-a-movie-search-app-using-react-hooks-24eb72ddfaf7/)
とっかかりとして、Angularで映画情報を検索するWebアプリを作りました。できたものはこんな感じです。

![movielist01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69245/0843fac4-ce3f-a744-e511-307306101873.png)

ガッツリ参考URL載せてるくせに、実は一度も読みに行ってません…
貼られてたスクショを元に、機能を想像しながら、真似た物を作ってみました。

検索フォームにキーワードを入力すると…

![movielist02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69245/611ca9b8-16f5-cb58-19c3-141aec419b57.png)

関連する映画が表示されます。

![movielist03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69245/925374f0-7690-b7ae-5678-0a6964031be1.png)

ページ移動とかもちゃんと機能します。どれでもいいので映画をクリックすると、

![movielist05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69245/dcb85867-1e6a-77bf-fa23-2dc532706db3.png)

このような形で、映画の詳細情報がでます。

Angularの勉強は楽しいのですが、なにぶんCSSをしっかり書いたことがないもので…
詳細情報ページだけ、間に合わせのtableで凌いでます。
（検索フォームはなぜか真ん中に来ないのでおこです😡）

# 始めたこと：AngularでWebアプリを設計するには
もうこれはWebデザイン全般に言えることかもしれないんですけど、
**設計図を書きましょう** もっというと、**画面図を書きましょう**ですね

![movielist06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69245/956db435-2269-f425-a941-cf707f3133a3.png)

Angularはコンポーネント指向でアプリを作るので、どのコンポーネントがどの部分に来るか、明確にイメージしていないとすぐこんがらがります（一人で作る場合）
最初に必要なコンポーネントをがーっと作って、その後設計を考えながら組み立てるのも悪くないですが、あとからたくさん修正が必要そうになるので、概要くらいは決めておいた方が良いです。

# 始めること：アウトプット、アウトプット、アウトプット
やっぱり手を動かさないと始まらない、ということで当面の目標は**サンプルアプリを作り続ける**です。
嬉しいことにコードを書くスピードが上がっているのを実感できているので、アドベントカレンダー最終日までにあと２つはサンプルを作りたいと思います。
併せて、**Bootstrap**についても勉強を始めようと思います。
とりあえず次回の記事は、今回紹介したサンプルアプリの詳細と、次に作るアプリの設計について書いていきます。
dt.exeを使ってCosmosDBへのデータインポートする際に思ったような性能が出ない場合の対処

# 前提
CosmosDBにバージョンってあるのか不明ですが、2019/12/3時点の内容です。
SQL（コアAPI）を利用する場合で、かつ、パーティションありのContainerへデータインポートする際のお話です。

（参考）
dt.exeを使ってCosmosDBへのデータインポートする際に"PartitionKey value must be supplied for this operation."が出る場合の対処
https://qiita.com/taka_22/items/7f6ee9bfe492a83d1f24

# 事象
数カラムしかないCSVファイルで、ContainerのRU、dt.exeの引数のRUいずれも10,000とかに設定しているのに、50records/sec程度のスループットしか出ない。

# 対処
オプション/t.ParallelRequestsを設定する。
/t.ParallelRequests:500
など。

ParallelRequestsを増やし過ぎると、RequestRateTooLargeExceptionが発生するので、その場合はRUを上げるかParallelRequestsを下げるとよい。

/t:DocumentDBBulkの場合は、/t.BatchSizeというのを設定してあげるとよいそうです。（同僚の方に教えていただきました）

# 結果
RU=10,000、ParallelRequests=500の条件で、500～600records/sec出るようになりました。
【初心者用】ウェルノウンポートの意味とよく使われるポート番号一覧

## はじめに
TCP/IPについて勉強中、よく使われるウェルノウンポートは一覧にしておくと便利だと思い一覧にしました。

※主に自分用メモとして活用します。

## 1.ウェルノウンポートとは？
- ポート番号**0番〜1023番**(System Ports)のこと
- **TCP/IP**で使用されるポートのうち、特によく利用されているポート
- 各プロトコル・サービスが利用するために**予約**されている
- サービス毎に設定でポート番号を変更することも出来るが、**混乱を招く**のでそのまま使用が推奨
- **IANA**（Internet Assigned Number Authority）が管理している

## 2.登録済ポート番号（レジスタードポート番号）とは？

- ポート番号**1024番〜49151番**(User Ports)のこと
- 特定のアプリケーションで使われている
- ウェルノウンポート同様**IANA**が管理しているが、IANAに登録されていないものも多く**競合**することがある。
- 競合してしまう場合は設定を変更し、**どちらかのポート番号をずらす**必要がある

## ウェルノウンポート(TCP)一覧（抜粋）

|ポート番号|プロトコル名|
|:-:|:-:|
|20|FTP(データ転送)|
|21|FTP(コントロール)|
|22|SSH|
|23|Telnet|
|25|SMTP|
|53|DNS|
|80|HTTP|
|110|POP3|
|443|HTTPS|

## ウェルノウンポート(UDP)一覧（抜粋）

|ポート番号|プロトコル名|
|:-:|:-:|
|53|DNS|
|67|DHCP(サーバ)|
|68|DHCP(クライアント)|

## 登録済ポート番号（自分で使うもの抜粋）

|ポート番号|アプリケーション名|
|:-:|:-:|
|3000|Ruby on Rails|
|3306|MySQL|
|5432|PostgreSQL|
|9000|PHP-FPM|

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

ポート番号の競合が発生しても、**よく使うポート番号**が分かっていれば原因に気づいて対処する時間が短縮出来そうですね:thinking:

※自分用メモとして都度追記していきます。どなたかのメモ代わりにもなれば幸いです。

## 参考にさせて頂いたサイト・書籍（いつもありがとうございます）
[TCPやUDPにおけるポート番号の一覧 - Wikipedia](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7#cite_note-IANA-1)
[Amazon.co.jp： Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版: 玉川憲, 片山暁雄, 今井雄太, 大澤文孝: 本](https://www.amazon.co.jp/gp/product/4822237443/)
簡単な今年の振り返り

# 目的

- 簡単に今年を振り返り、どんなことをしたか、それをしてどうだったか、これからどうしたいかをまとめる

# どんなことをしたか

1. 多数のエンジニアイベントに参加
1. 転職に伴う活動
1. 継続的なアウトプット
1. チャレンジ(登壇 技術同人誌のコラムを書かせてもらった)

# どうだったか

1. 初体験したこと
    - たくさんの方と会ったり話したり経験したりして明らかに知見が広がった。
    - 同じ考えを持っている人たちと仲良くなれることがあった。
    - 初めての勉強会は死にそうに緊張した記憶がある。
    - 現在は少しづつではあるがイベントで知り合った人と情報交換をできるようになった。
    - 他のイベントで知り合った方が増えてきてメンタル的にも楽になってきた。
1. 転職に伴う活動
    - ちょっと難航中、ほんとは2019年中に完了しようと思っていた。
    - 一緒に転職活動していた人たちがどんどん転職完了していて正直焦っているし、ちょっと心細い。
    - 企業の考え方なども含めてさらに知見が広がっている。
    - 緊張するがそこまで面接は嫌いではないためそこまで辛くはない。
    - アジュアル面談などは転職後も落ち着いてから行うつもりである。
1. 継続的なアウトプット
    - 気がついたら7月からqiita連続投稿してた。
    - 最初は結構軽いノリでやっていたが気がついたらくせになっていた。
    - 最近アクションがつくようになってきて嬉しい。
    - Google analitycsできてくれる人の動向を探ったりしているがウケがいい投稿よりとにかく投稿することを考えている。
    - 発信する技術がなくなるまでやるつもりである。
    - qiitaだけでなくはてなブログを始めた、こちらは週一投稿を実施中である。こちらも発信する技術がなくなるまでやるつもりである。
1. チャレンジ(登壇 技術同人誌のコラムを書かせてもらった)
    - qiitaでアウトプットして行くうちに新しいアウトプットにチャレンジしてみたくなった。
    - 人前で話すこととは難しいが得られる経験が段違いであることがわかった。
    - 文章でわかりやすく簡潔に書くこともとても難しいと感じた。
    - 登壇や技術同人誌の執筆も初めてであったが本当にやっていて楽しい、継続して実施するつもりである。

# これからどうしたいか

1. アウトプットに関しては継続する。転職後にPodcastの発信もしたいと考えている。(ちょっと今は流石にキャパオーバー)
1. 転職を完了させる。
1. プログラミング初心者のハードルを下げる活動をする。
1. 知り合いの輪を広げる。
1. Podcastに出たい。
1. イベントの参加も積極的に行う。
Elm SPAの初歩

趣味のWebアプリでサーバサイドレンダリングベースでElmを部分的に使うというのをやっていたがSPAはロクにやったことがない。

Elm SPAというと何かと、

https://github.com/rtfeldman/elm-spa-example

このelm-spa-exampleを参考にしましょうという情報を見るのだけど正直難しすぎて挫折すると思う (した) 。
どうにもページごとにPageモジュールを作るというのが入門の壁になっている気がする。

https://guide.elm-lang.jp/webapps/structure.html

Elm Guideでも

> ブログ投稿のWebアプリケーションを作っているとすると、私なら次のようなモジュール構成で作り始めると思います。
> Main
> Page.Home
> Page.Search
> Page.Author

といったことが書いてあってSPAではPageモジュールを切らないといけないのかなと先入観を持ってしまう。
(このすぐ下に `予め計画を練ってはならない` と書いてはあるが・・・)

しかし個人的にはSPAの場合でもMainモジュールオンリーで書き始めて、必要を感じた段階でモジュールを切れば良いんじゃないかとも思う。
というわけで最低限の構成を組んでみる。

https://guide.elm-lang.jp/webapps/navigation.html

Elm SPAで最低限必須な知識は

- `Browser.application` モードを使う
- URLを変更する
- URL変更イベントを検知してなにかする

の3点。

### 決まりごと

https://guide.elm-lang.jp/webapps/navigation.html

> URL が変わるたびに新たな HTML を読み込むのを避けるため、Browser.elementやBrowser.documentを使ったプログラムを作成する代わりに、Browser.applicationを使うといいでしょう。

SPAをする場合は `Browser.application` を設定する。

また、Modelに `Browser.Navigation.Key` を持たせておく。

```elm
type alias Model =
    { key : Nav.Key -- Browser.Navigation.Key
    , route : Route
    }
```

> ナビゲーション『キー』(Key)は、URL を変更する(pushUrlのような)ナビゲーションコマンドを生成するのに必要です。Browser.applicationでプログラムを作成したときだけKeyを取得することができ、プログラムが URL の変更を検出する用意があることを保証します。

キーの存在理由については正直腹落ちしてないのだが、一旦これらは決まりごととして受け入れる。

### URLの変更を指示する

`Browser.Navigation.pushUrl` 関数の第1引数に `Browser.Navigation.Key` 第2引数にURLを渡す。
リンクをクリックすると `onUrlRequest` イベントが発火するので、そこで上記を実行する。

```elm
update msg model =
    case msg of
        LinkClicked urlRequest ->
            case urlRequest of
                Browser.Internal url ->
                    ( model, Nav.pushUrl model.key (Url.toString url) )

                Browser.External href ->
                    ( model, Nav.load href )
```

### URLの変更直後の検知

URL変更直後のタイミングで `onUrlChange` イベントが発火する。
そこでURLを読み取り、UpdateでModelの状態を変化することで描画も意のままにできる。

```elm
type Route
    = Top
    | About
    | NotFound
```

このようなURLパスと合致するRoute型を用意しておき、

```elm
routeParser : Parser (Route -> a) a
routeParser =
    oneOf
        [ Url.Parser.map Top Url.Parser.top
        , Url.Parser.map About (Url.Parser.s "about")
        ]


parseUrl : Url.Url -> Route
parseUrl url =
    let
        parsed =
            parse routeParser url
    in
    case parsed of
        Just route ->
            route

        Nothing ->
            NotFound
```

これらRoute型の補助関数を定義しておくというのがよくある手法の一つのようだ。
今回は下記を参考にした。

https://gist.github.com/yuizho/c0b08ee59d3da81891426b17209fff4d

UPDATE内で下記のように利用する。

```elm
        UrlChanged url ->
            let
                route =
                    parseUrl url
            in
            ( { model | route = route }
            , Cmd.none
            )
```

### 完成形

https://github.com/dyoshikawa/elm-spa-playground

当然規模にもよるが、このようにメインモジュール一本でSPAを構築することは趣味の小さなWebアプリ程度ならまず問題ないと感じた。
これからElm SPAをやってみようという方は大仰な初期構成を目指して躓く前に試してみると良いかもしれない。
【編集中】WebDeployでDCに配布しようとすると接続エラー...

# TODO
- [ ]  解決策と詳細を記載!!　※今は配布できているはず...思い出せたら追記...

# はじめに
後で詳細は書くとして、とりあえず参考サイトのみ


# 参考サイト

◆ASP.NET > WindowsServer > Web Deployの設定
　https://qiita.com/sugasaki/items/914eb0f2fa4e9337614e

◆ワークグループ環境の Windows Server 2016 への Enter-PSSession がエラーになる問題対応
　https://www.vwnet.jp/Windows/WS16/2017062701/EnterPSSession4WGWS16.htm

◆PowerShell でリモート接続する ( Enter-PSSession )
　http://hensa40.cutegirl.jp/archives/677

◆[WinRM] トラブルシュートはエラーとイベントビューアから確認を開始するべし
　https://blogs.technet.microsoft.com/jpilmblg/2010/10/13/winrm/


# 解決に向け試してみる...

```sh:try.bat

```

# 結果

Coming Soon...
Google Cloud Platformでのバッチ処理をサポートするスクリプト

GCPの[プリエンプティブルインスタンス](https://cloud.google.com/compute/docs/instances/preemptible)で大量の数値計算を行う際に、自動化するスクリプトを作って利用しています。以下は、[GitHub](https://github.com/tadakado/gcp_batch)に置いたスクリプトの説明(のコピー)です。
____
# Batch scripts for Google Cloud Platform
### Google Cloud Platformでのバッチ処理をサポートするスクリプト。
____

# システム全体について

Google Cloud Platform(GCP)において、完全に並列化可能で、条件の異なる大量の処理を、できるだけ短い時間で実施することを目的に開発した。
システムは、費用削減効果の高いプリエンプティブ仮想マシンを用いることを前提に設計しているが、通常の仮想マシンでの実行も可能。

自動化のために、以下の機能を実装した。
- 処理(以後、解析と呼ぶ)の条件(以後、パラメータと呼ぶ)を登録
- 解析を行うワーカインスタンスを複数立ち上げ
  - パラメータを取得し、解析プログラムを実行
  - 解析プログラムの結果ファイルをクラウドストレージにアップロード
  - ワーカインスタンスを再利用して、起動にかかるオーバーヘッドなく、次のパラメータで解析プログラムを実行
  - 後からワーカインスタンス数を増やすと、自動的にジョブを割り当てる
- ワーカインスタンスを監視し、異常終了したワーカインスタンスを再起動
  - 実行中のパラメータや解析途中ファイルをクラウドストレージに退避
  - 退避したパラメータや解析途中ファイルを再起動時に復元
- ワーカインスタンスの状態をログに残す
- バッチ登録時に、解析プログラムのバージョンチェックを行う

## 準備

GCPに新しいプロジェクトを作成し、ディスクイメージなどの設定をする。
[`doc/settings.md`](https://github.com/tadakado/gcp_batch/blob/master/doc/settings.md)を参照

## 解析

キューに解析パラメータを複数登録してワーカインスタンスを立ち上げると、キューに登録した解析パラメータにしたがって、ユーザの解析プログラムを逐次実行する。
[`doc/execution.md`](https://github.com/tadakado/gcp_batch/blob/master/doc/execution.md)を参照

## サンプル

`doc/execution.md`内のインストラクション通りに進めると、逆行列の計算を行い結果をファイルに出力する。
`script/inverse_matrix.sh`が、pythonの環境設定や解析結果フォルダの作成を行い、パラメータを変えて`script/inverse_matrix.py`を複数回実行する。

# リソース

## リソース割り当て

大量の処理を並列に行うため、利用申請が必要になることがある。

- Cloud Console `IAMと管理` > `割り当て`  
  Preemptible CPU, In-use IP address, Local SSDを編集する。
  - CPU : 必要な量 * 2 (Hyperthreadingのため) 例: 3000 CPU
  - IP  : # of CPU / 8 CPU (PreemptibleインスタンスのCPU数) 例: 380 IP
  - SSD : # of IP * 375 GB (SSDのサイズ) 例: 142500 GB
- 価格の安いリージョンは us-west1, us-central1, us-east1

リクエストが処理されるまで一週間ほどかかる。
(個人の契約では3000CPUに対して、利用前に$450ドルの入金が必要だった。(2016年))

# 利用リソース

## Coupute Engine
- インスタンス
- マシンイメージ

## Cloud Storage
- 解析結果の保存
- ジョブ管理情報(runフォルダ)
  - インスタンス起動オプション(INSTANCE_OPTIONS.txt)
  - スクリプト(script.tar.bz2)
  - ログ(logs/)
  - ジョブパラメータの一時保存(params/)
  - 停止インスタンスの一時結果(results/)
  - インスタンスの状態(workers/)

## Logging
- インスタンス&ジョブ管理情報
  - リソース: グローバル
  - ログ
    - instance-up/down/upexpected-down: マシンの起動と停止の情報
    - worker: ジョブの開始と終了の情報

## Pub/Sub
- ジョブ管理情報

## リソース不足について

たくさんマシンを立ち上げた際は、足りないリソースがないか確認する。使用量でソートすると分かりやすい。

# その他

## メンバに必要な権限

- Project: 参照者
- Compute Engine: Computeインスタンス管理者(v1)
- Service Accounts: サービスアカウントユーザー
- Logging: Logging管理者
- Pub/Sub: Pub/Sub管理者
- ストレージ: ストレージ管理者

## 実行中のバッチのクリーンアップ(手動)

- インスタンスの削除
- ストレージ
  - `run/worker`フォルダの削除
  - `run/params` `run/results`フォルダの削除(未完了の解析を再開する場合には削除しない)
- Pub/Subのトピックとサブスクリプションの削除

## バージョン管理について

- `gcp/master/config.sh`内の`VERSION_CHECK`を有効にすると、バージョン管理されていないファイルがある場合は停止する。
- このレポジトリのバージョン管理は消しておく。
🏰【Laravel6】日本語化

## 環境

PHP 7.3.10
Laravel 6.5.0

## 内容

laravelにコマンドで追加した認証処理とかを日本語化したい

## やったこと

1.設定ファイルのlocaleをjaに変更

```config/app.php
    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'ja',

```

2.コマンド実行
https://readouble.com/laravel/5.6/ja/validation-php.html
にある下記コマンドをコマンドプロンプト/VSCodeターミナルで実行するとディレクトリが作成される
（Windows環境ではまだ試していません。）とあるが問題なく可能

```.sh
php -r "copy('https://readouble.com/laravel/5.6/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
```
3.jsonファイル追加

下記を追加して、それぞれの置き換え文言を追加していく

```resources/lang/ja.json
{
    "Register": "参加登録",
    "Login": "ログイン",
    "Name": "名前",
    "E-Mail Address": "メールアドレス",
    "Password": "パスワード",
    "Confirm Password": "パスワード再入力",
    "Remember Me": "ログイン情報を記録",
    "Forgot Your Password?": "パスワード忘れの場合",
    "Reset Password": "パスワードリセット",
    "Send Password Reset Link": "パスワードリセットメールを送信",
    "Verify Your Email Address": "メールアドレスを認証してください",
    "A fresh verification link has been sent to your email address.": "新規の認証リンクを再度送信しました",
    "Before proceeding, please check your email for a verification link.": "送信メール内の認証リンクをから認証を行ってください。",
    "If you did not receive the email,": "メールが届いていない場合、",
    "click here to request another.": "こちらクリックで再度メール送信します。"
}
```
dt.exeを使ってCosmosDBへのデータインポートする際に"PartitionKey value must be supplied for this operation."が出る場合の対処

# 前提
CosmosDBにバージョンってあるのか不明ですが、2019/12/3時点の内容です。
SQL（コアAPI）を利用する場合のお話です。

# 事象
https://docs.microsoft.com/ja-jp/azure/cosmos-db/import-data#CSV
の記事に従ってCSVファイルをCosmosDBにインポートしようとすると、

> "PartitionKey value must be supplied for this operation."

というエラーが出てインポート出来ない。
なぜか、チュートリアルのものは出来る。

# 対処
/t:DocumentDBBulk
の代わりに
/t:DocumentDB
を使って、
/t.PartitionKey
を指定する。

dt.exeを引数なしで起動するとヘルプが表示されますが、該当箇所だけ引用すると下記です。

> DocumentDBBulk: Uploads data into one or more single partition DocumentDB collections in batches
> DocumentDB: Uploads data into partitioned DocumentDB collection

というわけで、パーティショニングされたデータベースに対しては、DocumentDBとして扱うのが正しいようです。
Rstudioの環境をきちんと構築しようとしたら意外と面倒だったメモ

#君は誰？
「condaって何？」レベルの初心者です

#やりたかったこと
AnacondaからRStudioを起動できるようにしたかった。

#理由
RとPython、その他ライブラリを手当たり次第にインストールした結果、Pythonが３つ存在するなど環境が滅茶苦茶なことになっていた。こんな感じである。

Win
┣Python
┣R
┣Anaconda
┃┣JupyterNotebook
┃┗Python
┗Rstudio
　┗R
　　┗dplyr等
WSL
┣Python
┗R

躓くたびにライブラリやワークスペースを確認することすら億劫。なのでスッキリさせることにした。こんな感じに。

Win
┗Anaconda
　┣JupyterNotebook
　┃┗Python
　┗Rstudio
　　┗R
　　　┗dplyr等

#躓いた所
GUIではAnacondaにRStudioをインストールできなかった。

困ったときはエラーメッセージでググりましょう。そのエラーメッセージが無いんですが…？
途方に暮れて”Anaconda Rstudio インストールできない”などで検索した結果、以下のページがヒットした。

https://amazing-quest.com/2019/05/18/anaconda%E3%81%8B%E3%82%89rstudio%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/
https://www.guru99.com/download-install-r-rstudio.html

英語サイトの指示通り、AnacondaPrompt上でcondaコマンドからrとrstudioをインストールすることで概ね解決した。有難うございます。すんなり行かなかった所を以下補足。

#conda install　を1回実行するだけではインストールが始まらない。
2回セットで実行したら始まった。理由は不明。

#ライブラリのDLがしばしば停まったり、スキップされたりする。
Ctrl+C、またはEnterキーを押すと進むことが有る。
スキップされたライブラリが有る場合、最後に

Proceed([y]/n)?

と尋ねられるので、 n を入力する。

#rstudioインストール時にcondaが諦める
https://qiita.com/jordi/items/cd974b668e7ecf312543
に従い、

conda update

を実行した後、

conda install -c r rstudio

を実行。
updateとinstallを3ループ程繰り返した結果、rstudioがインストールされた。
Julia小ネタ: IterTools.jl

Juliaの小ネタとして，IterTools.jlを紹介します．Pythonのitertools的なものです．実装の中身は知りませんが．今回は与えられた整数リストの冪集合を見てみましょう．


## 情報など

- https://juliacollections.github.io/IterTools.jl/stable/

## 例題その1

- 特に理由はないですが，空集合は面倒なので取り除きました (continue)

```julia
using IterTools

n = 4
I = collect(1:n)

for ss in subsets(I)
  length(ss) == 0 && continue
  @show ss
end
```

出力です

```txt
ss = [1]
ss = [2]
ss = [1, 2]
ss = [3]
ss = [1, 3]
ss = [2, 3]
ss = [1, 2, 3]
ss = [4]
ss = [1, 4]
ss = [2, 4]
ss = [1, 2, 4]
ss = [3, 4]
ss = [1, 3, 4]
ss = [2, 3, 4]
ss = [1, 2, 3, 4]
```


## 例題その2

- ある集合$I$を考えます (上のソースだとI)
- 要素$i\in I$には重さ$w_i$がランダムに設定されているとします
- 取ることのできる重さの総量は$W$だとします
- 集合$S\subseteq I$のうち，総量制約を満たすものを取り出してみます

```julia
using Random
using IterTools

# 集合I
n = 4
I = collect(1:n)

# 総量 (ランダム)
W = rand(7:13)

# 個別の重さ (ランダム)
w = [rand(1:10) for _ in 1:n]

# 和が総量以下になる部分集合
for ss in subsets(I)
    length(ss) == 0 && continue
    Ws = sum(w[i] for i in ss)
    Ws > W && continue
    @show ss, Ws
end
```

出力の例です

```txt
(ss, Ws) = ([1], 9)
(ss, Ws) = ([2], 5)
(ss, Ws) = ([3], 2)
(ss, Ws) = ([1, 3], 11)
(ss, Ws) = ([2, 3], 7)
(ss, Ws) = ([4], 1)
(ss, Ws) = ([1, 4], 10)
(ss, Ws) = ([2, 4], 6)
(ss, Ws) = ([3, 4], 3)
(ss, Ws) = ([2, 3, 4], 8)
```

以上です
DenoでReact Server Side Renderingした話

## 概要
最近何かと注目が集まってるDenoですが、なんとDenoでjsxが動くみたいなのでDenoでReactが動くかやってみました。

## Denoってなんぞや
これについては、今Deno Advent Calendarにて@kt3kさんが [Deno ってなんだっけ?](https://qiita.com/kt3k/items/e1647683ad08ff6b6e95)と言う記事をあげているので、そちらを参考にしてみてください。

## Denoのインストール
何はともあれ、Denoを導入してみましょう！

```
brew install deno
```
インストールが完了したら、`deno -v`で以下のような画面が出てきたらインストール完了です。
<img width="400" alt="スクリーンショット 2019-12-03 23.26.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105049/9367b03d-df3f-447f-2c12-0c97f0229388.png">

## コードを書いてみよう
早速コードを書いていきたいわけですが、今回二つファイルを作ります。

- index.tsx
- App.tsx

### App.tsx

こちらはいつも通りのreactコンポーネントです。一つ違うのはDenoはnode_modulesではなく直接ダウンロードする方式ですね。後のコードはいつも通りです。

```tsx:Apptsx
import React from 'https://dev.jspm.io/react';

const App = () => <div>Hello Deno React</div>;
export default App;
```

### index.tsx

次にindexファイルですが、

```tsx:index.tsx
import { createRouter } from 'https://denopkg.com/keroxp/servest/router.ts';
import React from 'https://dev.jspm.io/react';
import ReactDOMServer from 'https://dev.jspm.io/react-dom/server';

import App from './app.tsx';

const router = createRouter();
router.handle('/', async req => {
  await req.respond({
    headers: new Headers({
      'content-type': 'text/html; charset=UTF-8',
      status: 200,
    }),
    body: ReactDOMServer.renderToString(
      <html>
	<head>
          <title>deno react ssr</title>
	</head>
	<body>
          <App />
	</body>
      </html>
    )
  })
});

router.listen(':8000');
```

ファイルの準備は以上になります。
ここで、以下コマンドを実行した上でhttp:/localhost:8000/にアクセスしてみましょう！

```
deno index.tsx --allow-net // denoの起動
```

これで画面上に `Hello Deno React`が出れば成功です！
Deno、未来ありますよね！では！
Haskell個人メモ【リスト】

#Haskellおべんきょメモ
Haskellを学習している私の個人的なメモ。
おしごとで使わないので、単純に趣味と実益を兼ねたみたいな。

#リスト
- リストは再帰的
- `head`は要素を取り出す
- `tail`は先頭の要素を取り除いた別のリストを生成する    
- - 故に`空のリスト[]`に対して上記の操作をするとエラー発生
- `:`はコンスという(リストを作るための`+`だと思えばいいかな)

~~~list.hs
--この関数の動きを具体的にすると
head [1, 2, 3, 4, 5]
-> 1
tail [1, 2, 3, 4, 5]
-> [2, 3, 4, 5]

--こういうことなのか
head 1 : 2 : 3 : 4 : 5 : [] --先頭の1要素を取り出す(つまり1が取れる)
tail 1 : 2 : 3 : 4 : 5 : [] --先頭の1要素を取り除いたリストを生成(1が取り除かれてくっつく→リストになる) 

~~~

ほえぇ

- リストのプレリュード関数は部分適用もできるっぽい
- 二項演算子で部分適用する場合は、右オペランド・左オペランドどちらの引数を待っているかを考えること



#再帰
- 再帰のコツは終了条件を先に決めておくこと
- これ以上はとくにないかな…(再帰的な処理をまだ実務でも実装したことがないから意味は分かるが現状知識的な部分だけもらっておく)

#パターンマッチング
- 引数を調べるだけ
- `case x of`と似ているけど`case x of`の方は**引数によって処理が実行**まで含まれる

~~~patern.hs
--これがcase文
chigai x = case x of
    1 -> putStrLn "引数が1だったので実行されました"
    2 -> putStrLn "引数が2だったので実行されました"
    _ -> putStrLn "引数が3以上だったので実行されました"

Prelude> chigai 2
引数が2だったので実行されました

--パターンマッチング
--引数が偶数かを調べる
chigai x | x `mod` 2 == 0 = True
         | otherwise = False

Prelude> chigai 5
False
Prelude> chigai 4
True
~~~
まあ、こんな感じで使っていけばええか…

#感想
再帰はむずかしい。
けれど使いこなせたらカッコいいと思う。
今日は終わり。
【VBA】特定の色のセルを全てクリアする


シート内の全セルに対して、特定の色だけをクリアしたいという要望がありました。
難しそうに聞こえますが、以下サイトを参考に10分ほどで実装できました。

[指定色のデータを一気に消したい](http://www.excel.studio-kazu.jp/kw/20060203150946.html)

##イメージ
#####Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/5c8c64e1-5563-6cb0-f263-876f700d685b.png)

#####After
わかりにくいですが、ヘッダーの色はクリアされていないことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/1d4247ee-d4e3-84c1-3610-79ee9a3af967.png)

##実装
#####クリア対象の色のRGBを調べる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/f51ef8f0-ba97-0b20-1347-95d38c0f1f65.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/9ab2a6dc-49c2-1477-cdcb-a40cce691d24.png)

#####実装したコード

```vb:sample
Sub main()
    Call clearColor(RGB(221, 235, 247))
    Call clearColor(RGB(226, 239, 218))
End Sub

Function clearColor(ByVal clr As Variant)
    Dim r As Range, ff As String
    With ActiveSheet.UsedRange
        Application.FindFormat.Interior.Color = clr
        Set r = .Find("", searchformat:=True)
        If Not r Is Nothing Then
            ff = r.Address
            Do
                r.Interior.ColorIndex = 0
                Set r = .Find("", after:=r, searchformat:=True)
                If r Is Nothing Then Exit Do
            Loop
         End If
    End With
End Function
```

##ポイント
```vb
    With ActiveSheet.UsedRange
        Application.FindFormat.Interior.Color = clr
        Set r = .Find("", searchformat:=True)
    （中略）
    End With
```
**ActiveSheet.UsedRange**で使用されているセル範囲を取得します。
A1から、使用されているセルのうち一番右下のセルまでの範囲が対象となります。

**Application.FindFormat.Interior.Color**では、セル色が指定した色になっているセルを検索するように条件を設定しています。

**.Find("", searchformat:=True)**で、指定した書式となっているセルを検索しています。
特定の Anypoint Studio をダウンロードする方法

MuleSoft で開発する際に必須の統合開発環境（IDE）である Anypoint Studio のうち、特定のバージョンをダウンロードする方法をご紹介します。

# 自己紹介
Salesforce の開発者歴が 10 年ほどですが、MuleSoft は勉強中です。よって、今回の投稿内容は小ネタどころが極小ネタであることをご了承ください。

Salesforce の前は、新入社員の頃からずっと Java の開発をしていたので、Salesforce の開発言語である Apex コードや Visualforce ページは違和感なく入ることができました。また、Anypoint Studio のベースは Eclipse ですし、Connector は Java で開発できるようなので、これからの勉強も楽しみです。

# 最新の Anypoint Studio のダウンロード方法
説明するほどのことはなく、[MuleSoft のサイト](https://www.mulesoft.com/lp/dl/studio)から OS ごとの最新版をダウンロードすることができます。

![MuleSoft_AnypointStudio_Download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202823/365ea7ae-53e1-7392-c853-41280e3ce87a.png)

上記画像の左部分で、お使いの OS を選択し、ライセンス契約の同意などにチェックし、ダウンロードボタンを押下すれば、自動的にダウンロードが開始されます。

この記事の執筆時点では、「AnypointStudio-for-win-64bit-7.4.1-201911261732.zip」がダウンロードできるので、解凍したら開発を開始できます。
（Java 8 の実行環境をインストールしておく必要があります。）

# 私に起こった出来事
しかし、私の場合はここで問題が、、、。

私が会社で使っている PC 、、、64bit ちゃう、、、32bit や、、、。

そう、MuleSoft のサイトから Windows を選択してダウンロードできるのは 64bit 版です。私も実行して、以下のエラーが出るまで気づきませんでした。

![MuleSoft_AnypointStudio_32-64bit_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202823/f923ce09-aafb-8999-db06-099a9dee3a96.png)

ファイルサイズが 1.5GB ほどあるからダウンロードも解凍も時間がかかったのになーと思いつつも自分の不手際なので 32bit 版をダウンロードしなおそうと MuleSoft のサイトに戻ります。しかし、ダウンロードのサイトを見ても、MuleSoft のサイト内検索をしても、Google 先生に聞いても 32bit 版のダウンロード方法が見つかりません。

# 特定の Anypoint Studio のダウンロード方法
そうこうしているうちに、MuleSoft の掲示板などの情報を総合すると、以下の法則であることがわかりました。

```
https://mule-studio.s3.amazonaws.com/「バージョン番号」-「リリース種別」/AnypointStudio-for-「OS名」-「32bitか64bitか」-「バージョン番号」-「ビルドID」.zip
```

バージョン番号やビルド ID は、[リリースノート](https://docs.mulesoft.com/release-notes/studio/anypoint-studio)を見ることで調べることができます。OS 名は、「win」もしくは「linux」もしくは「macosx」です。リリース種別（仮）は、「EA」（Early Access）なのか、「RC」（Release Candidate）なのか、「GA」（General Availability）なのか、「U1」（Update 1）なのかを示しているようです。

なので、Windows 32bit 向けのバージョン 7.3.4 は、以下の URL になります。

```
https://mule-studio.s3.amazonaws.com/7.3.4-U4/AnypointStudio-for-win-32bit-7.3.4-201905081644.zip
```

# ところがどっこい
この記事の執筆時点ではバージョン 7.4.1 が最新なのですが、32bit 版の URL でアクセスしてもダウンロードできませんでした。ダウンロードする方法をご存知の方、教えてください（涙）

# 最後に
今回ご紹介した方法は、MuleSoft が公式に案内しているものではありません。自己責任で行ってください。（そもそも最新版以外や 32bit 版を使う機会はほとんどないとは思いますが、念のための注意書きです。）