OmniAICreator/Qiita-1.07M huggingface dataset:
【salesforce】 テストクラス でのユーザグループ作成

サンプルは以下の通り。

@isTest
global class SampleTestClass
{
    public static TestMethod void TestSampleMethod()
    {
        Test.startTest();     
 
        //Create Parent Group
        Group grp = new Group();
        grp.name = 'Test Group1';
        grp.Type = 'Regular'; 
        Insert grp; 
 
        //Create Group Member
        GroupMember grpMem1 = new GroupMember();
        grpMem1.UserOrGroupId = UserInfo.getUserId();
        grpMem1.GroupId = grp.Id;
        Insert grpMem1;
 
        //Create Sub group
        Group subGrp  = new Group();
        subGrp.name = 'Test Group2';
        subGrp.Type = 'Regular'; 
        Insert subGrp; 
 
        //Assign Role To Parent Group
        GroupMember grpMem2 = new GroupMember();
        grpMem2.UserOrGroupId = subGrp.Id;
        grpMem2.GroupId = grp.Id;
        Insert grpMem2;  
 
        //Create Group Map Data
        Map<String,Id> groupNameRoleIdMap = new Map<String,Id>();
        for(Group gp: [SELECT Id, Name FROM Group WHERE Type = 'Role']){
            groupNameRoleIdMap.put('SuperAdmin', gp.Id);
        }     
 
        //Assign role to parent group
        GroupMember grpMem3 = new GroupMember();
        grpMem3.UserOrGroupId = groupNameRoleIdMap.get('SuperAdmin');
        grpMem3.GroupId = grp.Id;
        Insert grpMem3; 
 
        //Create Group And Sub Group Map Data
        Map<String,Id> groupNameRoleAndSubordinatesIdMap = new Map<String,Id>();
        for(Group gp: [SELECT Id, Name FROM Group WHERE Type = 'RoleAndSubordinates']){
            groupNameRoleAndSubordinatesIdMap.put('Admin', gp.Id);
        } 
 
        //Assign Role To Parent Group
        GroupMember grpMem4 = new GroupMember();
        grpMem4.UserOrGroupId = groupNameRoleAndSubordinatesIdMap.get('Admin');
        grpMem4.GroupId = grp.Id;
        Insert grpMem4;             
         
        //Execute your method here with Group and Group Member Test data
         
        Test.stopTest();
    }
}
Coggleでstruts構成を管理してみた


#前提
1. 自己学習

#目的
1.業務効率化に向けた予習

#利用ツール
[https://gsuite.google.com/u/0/marketplace/app/coggle/884143833690?hl=ja&pann=drive_app_widget](https://gsuite.google.com/u/0/marketplace/app/coggle/884143833690?hl=ja&pann=drive_app_widget)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/d0a2dff6-65c7-9fc8-e71f-066899f4dd62.png)


# 実践
## Strutsサンプルで試してみる

### 構成図を作成する上で参考
[https://qiita.com/RIKIgigasu/items/56745ae2d29dc992f662](https://qiita.com/RIKIgigasu/items/56745ae2d29dc992f662)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/7870ea07-98b5-440a-7ff4-9cdc8b240d9a.png)

# まとめ
> 無料版だと、複雑なブランチ構成やブランチの色指定についてはできなかった

> 有料版は、月$5との記載が出てきたので使いやすいツールだが悩ましいところ
【基本情報技術者】コンピューターにおける誤差5種類の解説


この記事は、コンピューターの世界における「誤差」についてまとめたものです。
大体こんなモノがあるという資料にしていただけたら嬉しいです。

#Q,そもそも誤差はなぜ生じる？

A,ビットで表現しないといけないコンピューターの都合上、桁数が非常に大きくなる計算（0.333333…みたいな無限小数とか、無限に続く円周率とか）をしようとすると、無限に計算し続けないといけません。

**正確性を求めて無限に計算を続けていては、計算が出来ない**ということで**ある程度の正確さで妥協する仕組み**が存在しています。それがコンピューターにおける**誤差**です。

#桁あふれ誤差

与えられたビット数よりも、多くの数を入力しようとした時に、表現しきれなかった数が切り捨てられてしまう誤差。

##-桁あふれ誤差の例
電卓で言うと、「99999999*9999999999」のような計算をした際に、**液晶モニターに表現しきれなくなる症状**がコレに近いです。
なお、桁が大きい方にあふれる事を**「オーバーフロー」**、桁が小さい方にあふれることを**「アンダーフロー」**と表現します。


#丸め誤差

整数で表現する場合、無限に数が続いてしまうものをビット上で表そうとする場合、どこまでもビットを必要としてしまいます。
その時に、**ある程度の桁数まで計算して残りを切り捨てる事で生じる誤差**を、丸め誤差といいます。

##-丸め誤差の例
電卓でいうと、1/3を計算した時なんかが丸め誤差を生じさせる起因になります。
分数を数字に戻した場合、0.33333333333333333333（以下略）といった具合になるはずですが、正確な計算をすればどこまでも「3」が続いてしまいます。
そうさせない為に、**ある程度の部分で計算を切り落とす**事を、丸め誤差と言います。

飲み会の会計の際に合計金額が６５０１円だった事を友人に伝える際、「６５００円」と表現するでしょう。コレも丸め誤差です。


#打ち切り誤差

**計算時間があまりにも長い処理になった場合、途中で計算を打ち切られる事によって生じる誤差**を、打ち切り誤差といいます。

##-打切り誤差の例

たとえば円周率なんかが、打切り誤差の例になります。
3.411592…と、円周率は続きますが正確にやろうとすれば無限に続くため計算が終わらないということになってしまいます。
そうならない為に、**終わらない計算は、ある程度の所で計算が打ち切られる**のです。

これには、上記の丸め誤差とかぶる部分もあります。
1/3の計算は、3がどこまでも続きますから、丸め誤差として処理されなかったとしても時間のかかりすぎで、打切り誤差として処理されてしまうでしょう。


#桁落ち

**大きな桁数かつ似ている数字の、差を求めた時に起こる誤差です。**

例えば有効数字(表現できる桁数)が、7桁の数を比較するとしましょう。
「0.555555（以下無限に5が続く）」と、「0.555554(以下無限に4が続く)」の差を求めた時に、出てくる結果は、「0.000001」です。

でもよく考えてみてください。
**小さい桁の誤差を求める場合、その小さな誤差を精微に測りたいからな場合も出てくる**はずです。
でも、上記の有効数字7桁の縛りのせいで、「0.000001」という数字以上の誤差が計算から外されてしまうのです。

##-桁落ちの例

桁落ちは僅かな誤差の計算で解る桁数が大幅に下る減少です。

わかりやすく言えば、一般的な定規で、精密機器がやるような誤差判定をするようなものです。
**定規ならミリ単位の誤差はわかりますが、マイクロメートルや、ナノメートルの誤差は測れません。それと同じです。**


#情報落ち

絶対値の大きな数と、絶対値の小さな数を加算したり減算したりすると、絶対値の小さな数がなかった事にされるものです。

有効数字7桁で表現される数字で考えてみましょう。
「1234.567」に対して、「0.000123」を足し合わせた場合、**大きい方から7桁までしか計算せずそれ以下の数字は切り捨てる処理が行われる為、「1234.567」**になります。
大きい数の上位8桁に、小さい数の8桁がかぶらなかったせいで、小さい方の数が全て切り捨てられてしまいました。


##-情報落ちの例

追加される数字が、あまりにも小さい為反映されないのが情報落ちです。
**1kgのパン粉の塊を、1g単位で測れる秤に載せているとして、そこに「パン粉の粒1粒分」を追加しても、軽すぎて秤に反映されない**のに近いです。

#まとめ
**コンピューターは「無限に続く数」や「桁数の大きな計算」が苦手で、そういった計算を振ると「大体これくらいでしょ？」という数字を出す事がある。**
GulpでSassのコンパイル(Autoprefixer,server,watch)

# はじめに
タスクランナーのgulpを初めて導入してsassの自動コンパイル、ベンダープレフィクスの付与、サーバ起動、自動リロードプロジェクトを作ってみた

★プロジェクトはこちら
[GitHub リポジトリ(GulpSassCompiler)](https://github.com/sakamotoyuya/GulpSassCompiler)

## 参考
以下のサイトを参考に本プロジェクトを作成。
- [参考サイト１](https://qiita.com/nabe_kurage/items/b3f154a09962f692df14)
- [参考サイト2](https://www.npmjs.com/package/gulp-autoprefixer)
- [参考サイト3](https://webdesign-trends.net/entry/10069)
- [参考サイト4](https://3owebcreate.com/web/coding/webpack_autoprefixer_setting)
- [参考サイト5](https://satoyan419.com/gulp-v4/)
- [参考サイト6](https://codecodeweb.com/blog/459/)
- [参考サイト7](https://www.tweeeety.blog/entry/2018/06/18/060030)

## require
node.js
gulp

## 備忘録
必要なプラグインのインストール

```コマンドライン.cmd
npm init
npm install gulp --save-dev
npm install gulp-sass --save-dev
npm install browser-sync --save-dev
npm install gulp-plumber --save-dev
npm install --save-dev gulp-autoprefixer
```
 
```Gulpfile.js
var gulp = require("gulp");
var sass = require("gulp-sass");
var browser = require("browser-sync");
var autoprefixer = require("gulp-autoprefixer");
var plumber = require("gulp-plumber");

gulp.task("server", function(db) {
  browser({
    server: {
      baseDir: "./"
    }
  });
  db();
});

gulp.task("sass",function(db){//タスクの登録("sass"タスクを登録する)
  gulp.src("sass/**/*.scss")//gulp.src()...読み込むファイルを設定する
  .pipe(plumber())
  .pipe(sass({outputStyle:'expanded'}))//pipe()...srcで取得したファイルに行う処理を記載する。
                                      //sass()...コンパイルの実行をする。outputStyleで吐き出すcssのスタイルを設定する。
  .pipe(autoprefixer({
    cascade:false
  }))
  .pipe(gulp.dest("./css"))//gulp.dest()...出力したい場所を記載する。
  db();
});

gulp.task("reload",function(db){
  browser.reload();
  db();
})

gulp.task("watch",function(db){
  gulp.watch("sass/**/*.scss",gulp.parallel(["sass","reload"]));
  gulp.watch("./**/*.html",gulp.series(["reload"]));
  //watch(['監視するファイル'],['実行したいタスク名'])
  //タスク名をdefaultにするとコマンドにタスク名を入れる必要がなくなり便利です。
  db();
});

gulp.task('default',gulp.series(gulp.parallel(['sass','watch','server'])));

```

package.jsonの修正

```package.json
{
  "name": "gulptest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "browser-sync": "^2.26.7",
    "gulp": "^4.0.2",
    "gulp-autoprefixer": "^7.0.1",
    "gulp-plumber": "^1.2.1",
    "gulp-sass": "^4.1.0"
  },
  //★ここにautoprefixerの設定を追加
  "browserslist": [
    "last 2 version",
    "> 5%",
    "ie >= 9"
  ]
}

```
SymPyで組み合わせの総数を計算

(参考)pythonで組み合わせの総数を計算
https://qiita.com/yu01lemo/items/53ec14e5fb2b412c4764
(参考)SymPy 1.5.1 documentation » SymPy Modules Reference » Functions »
https://docs.sympy.org/latest/modules/functions/combinatorial.html
以下で検索
.nC
ドキュメントについて、わかる人には、わかるかも。教えて下さい。


```
from sympy.functions.combinatorial.numbers import nC
from sympy.utilities.iterables import multiset_combinations
print(nC(4, 2))
# 6
print(nC(3, 2))
# 3
# リスト形式で,渡すことはできませんでした
# print(nC([4, 2],[2,1]))
# TypeError: unhashable type: 'list'
```
小数点を起点に文字列を分割（index.Of , substring使用）

#背景
小数点の前と後で計算方法を変えたいときに少し躓き、解決したのでメモしておきます。

#環境
Eclipse Neon 4.6.3
Java8

#使用クラス
・文字列に小数点が含まれているかどうか
　int 変数名 = 文字列の変数.indexOf("調べたい文字");

・小数点の前後の文字列の取得
　文字列の変数.substring(x , y);
　x = 初めの文字の位置
　y = 終わりの文字の位置(省略可)

#使ってみた
```
public class strPractice {

    public static void main(String[] args) {        
        
        String a = "12345.6789";
        
        //文字列に"."が含まれているか
        //含まれていればその場所(0から始まる)、なければ-1を返す
        int b = a.indexOf(".");
        System.out.println((b + 1) + "番目に含まれています。");
        
        //調べた文字を起点に分割
        //前半
        String c = a.substring(0 , b);
        System.out.println("小数点までの文字は" + c + "です。");
               
        //後半
        String d = a.substring(b + 1);
        System.out.println("小数点から後の文字は" + d + "です。");

    }

}
```

実行結果

```
6番目に含まれています。
小数点までの文字は12345です。
小数点から後の文字は6789です。
```

#まとめ
formで受け取った小数を二進数に変換する場合にこの方法を使いました(二進数は小数点以下の計算が特殊なため)。普通は住所とかで使うのではないかと思いました。
Let's Encryptでの自動更新

CentOS7でのLet's Encrypt自動更新の記述のみ記載

1.cron登録ファイルの編集

```
$sudo vi /etc/cron.d/letsencrypt
```

2.実行内容の設定
毎週月曜の23時に実行。
Webサーバを停止しないとエラーになるようなので、
--pre-hookに停止コマンド、--post-hookに起動コマンドを追加。

```
00 23 * * 1 root /usr/bin/certbot-auto renew --pre-hook "systemctl stop httpd" --post-hook "systemctl start httpd"
```


以上
[Xcode] Simulatorでキーボードから@が入力できない時の対処法

#はじめに
Xcodeのシミュレーターを起動して、キーボードからTextFieldに "@" を入力したときに "[" が入力される時の対処法を紹介します。
(":" や "¥" など他の記号に対しても適用されます。)

@と打ちたいのに[が入力される。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/b16f93f9-6924-3920-3822-f4de2e081086.png">


##対処法
I/O → Keyboard → Connect Hardware KeyBoardのチェックを一度外し、もう一度チェックすると解決します。(command+shift+Kを2回押してもできます！)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/cb22bb9e-c08d-915a-ba26-d37648789b5f.png)

##原因
おそらく、シミュレーターを起動時はキーボードがJIS配列ではなく、US配列として認識されているからだと思います。
Connect Hardware KeyBoardのチェックを外すとOSのキーボードが正しく読み込まれます。
vuex の $store にある配列を操作すると怒られる(半解決)

(旧題 : vuex の $store に直接値をぶっこむと怒られる )

# だめな例

```javascript
export const state = () => ({
  arr: [],
})

export const mutations = {
  setArr (state, { arr }) {
    state.arr = arr
  }
}

export const getters = {
  arr (state) {
    return state.arr
  }
}
```

なんも考えずにこう書いてしまうと怒られてしまう

```
Error: [vuex] do not mutate vuex store state outside mutation handlers.
```

なんでやねん。ちゃんとmutationの中で更新してるがな。と思いながらウンウン唸ってたんです。
当たり前だけどこういうコードは通る。

```javascript
export const state = () => ({
  obj: {},
})

export const mutations = {
  setHoge (state, { hoge }) {
    state.obj.hoge = hoge
  }
}
```

なんとなーくなんだけど、これ **オブジェクトの参照が変わるような代入が許されない** んじゃないかなーと予想。たしかに後から引数に使われたオブジェクトに変更が加わると store の中身が変更されてしまう  **可能性** がある。
(いや、後者のコードでも十分にありえるんだけど、それを制限/検知するのは技術的に不可能なんだろうなーと。)

# やっぱりだめな例

というわけで以下のようにコードを変更

```javascript
export const state = () => ({
  arr: [],
})

export const mutations = {
  setArr (state, { arr }) {
    // 配列の中身を全て消去
    state.arr.splice(0)
    // 引数で渡された配列をまるごとpush
    state.arr.push(...systems)
  }
}

export const getters = {
  arr (state) {
    return state.arr
  }
}
```

```
Error: [vuex] do not mutate vuex store state outside mutation handlers.
```

なんでーーーーー????
[公式ページ](https://ja.nuxtjs.org/guide/vuex-store/)に書いてあることと同じ事しかしてないよーーーーー????

# 結局
[nuxtのissue](https://github.com/nuxt/nuxt.js/issues/1917)にこんな解決方法が書いてありました。

```javascript
export const strict = false // <- これ!!!!!
export const state = () => ({
  arr: [],
})

export const mutations = {
  setArr (state, { arr }) {
    // 配列の中身を全て消去
    state.arr.splice(0)
    // 引数で渡された配列をまるごとpush
    state.arr.push(...systems)
  }
}

export const getters = {
  arr (state) {
    return state.arr
  }
}
```
うーん……なんかコレジャナイ感があるんだよなぁ……
だって公式のガイドと同じ事して怒られるんだよ……?多分もっといい解決方法があるはず……
NoMethodErrorが出てview、controllerをいじっても解決できない時(備忘録)

NoMethodErrorが出た時は、基本的にcontrollerでメソッドが定義できていないかviewとの対応があっていない（タイプミスなど）場合が多い。

ただ、viewやcontrollerを見直してもエラーが消えない時がある。

そんな時は、ネストしたときにmodelで記述する
「has_many」と「belongs_to」で書かれている部分が間違っている可能性がある。

以下に「review」が「hotel」に属しているmodelを例に、注意するべきことをメモに残す。

①has_manyの後ろは複数形でなければならない。

```ruby:&nbsp;hotel.rb
class Hotel < ApplicationRecord
	has_many :reviews
end
```
②belongs_toの後ろは単数系でなければならない。

```ruby:&nbsp;review.rb
class Review < ApplicationRecord
	belongs_to :hotel
end
```

以上。
Windows Terminal逆引きメモ

必要に迫られたWindows Terminalの逆引きメモです。

## 「"globals"プロパティは廃止されました。設定を更新する必要が有る場合があります。」が表示される場合の対処

Windows Terminalの起動時に"ユーザー設定の読み込み中にエラーが発生しました"と表示されて「"globals"プロパティは廃止されました。」とメッセージが表示される問題。

1. Windows Terminalを一旦終了して`settings.json`の名前を`settings.json.back`などの適当な名前に変更。
2. Windows Terminalを起動。
3. settings.jsonが作成されていることを確認。
4. 必要な設定を新しく作成されたsettings.jsonへ移す。

## 参考
[Windows Terminal Preview v0.11 Release
](https://devblogs.microsoft.com/commandline/windows-terminal-preview-v0-11-release/)
Microsoft Remote Desktopの使い方


#はじめに
RDPをリモートで使われる機会が増えたので、RDPの使い方をまとめます。

##前提
①会社のネットワークと[VPN](https://qiita.com/kotadora/items/049ca405d37b35783cd4)等で接続されていること。
②会社で使っているPCの「IPアドレス」「ユーザ名」「パスワード」がわかっていること。（わからなければ会社の担当者に聞きましょう！）

## 注意
・　リモート画面がネットワークとかの関係で落ちても、心配しない。（再度アクセスすれば元のまま。）
・　データ(ファイル)とかRDPを通して送ると時間がかかるので、できれば他の方法を使う。

# セットアップ
## Windows 10
1. windowsマークの右の検索欄に「リモートデスクトップ」と入力し、上に出てきた「リモートデスクトップ接続」を選択する。![image (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/91f5e7f9-bb4f-e21b-666e-aa1645d042c3.png)
2. コンピュータの部分に「IPアドレス」を入力して、「接続」を選択する。![image (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/2385a7bd-76d2-7560-e0ab-385d2a160935.png)
3. ユーザにリモート先のPCの「ユーザ名」を、同様に「パスワード」を、それぞれ入力する。![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/df7b5f83-ea23-1d3b-beb9-a2233349459a.png)
4. このエラー画面が出た場合は「はい」を選択する。![image (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/ba7f9d1f-7853-c552-cece-cafcd259ed32.png)
5. リモート先PCで作業する。
6. 終わったら、スタートから「切断」を選択する。![image (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/74f65994-617a-e04a-c6e3-66302cd9ac09.png)

## Mac (Catalina)
1. AppStoreを開く。
2. 右上検索窓に「microsoft remote desktop」と入力。![スクリーンショット 2020-05-08 19.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/f660b159-c784-b7ad-6dee-6157fd419962.png)
3. 右上の「入手」を選択![スクリーンショット 2020-05-08 19.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/2cef9e6e-591d-2270-dbdd-8e5d639e097f.png)
4. Dockから「LanchLanchpad」を開く。![スクリーンショット 2020-05-08 19.27.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/5568ed18-5ea5-c5c8-e219-5c297664b10c.png)
5. Lanchpadから「Microsoft Remote Desktop」を開く。![スクリーンショット 2020-05-08 19.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/b802e7ae-63d5-3449-dd4d-be394d86a61a.png)
6. 上の「＋」をクリックして、「add PC」を選択する。![スクリーンショット 2020-05-08 19.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/5ea63425-d203-dfbe-e781-e8b535b001e0.png)
7. 出てきたウィンドウに「IP」と、自分がわかりやすい「パソコン名」を入力する。![スクリーンショット 2020-05-08 19.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/578e6ea6-24b0-4a68-853d-2e58efe89ec5.png)
8. アイコンが生成されて、次の画面が出てくるので、アイコンをクリックする。![スクリーンショット 2020-05-08 19.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/a2f602c3-7071-df9f-eaf4-f49be23cfab7.png)
9. 実際にリモート先でログインするPCの「ユーザ」と「パスワード」を入力する。![スクリーンショット 2020-05-08 19.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/5cee1af3-8d7b-a785-e535-b138e7822ff0.png)
10. ログイン先で楽しむ。
11. 使い終わったら「スタート」から「切断」を選択する。![image (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166400/dc616136-a601-7cbf-623e-f7156d4e143b.png)

#おわりに

コロナで自宅作業が多いかもしれませんが、一緒に乗り切りましょう！
もし良ければ、LGMTしてくださると嬉しいです！
TinyCCとVSCodeを連動させる方法

#略語？一覧
|略語       | 正式名称  |
|-------|--------------------|
|VSCODE | Visual Studio Code |
|TCC | Tiny C Compiler |

#目的
VSCodeとTCCをVscodeのタスク機能を使ってF7で簡単に実行ができるように
タスクを構成する

#利用ツール
TCC [DL](https://bellard.org/tcc/) `0.9.27`
VSCode [DL](https://code.visualstudio.com/) `v1.45.0`

#環境
TCC/VSCodeはすでにインストール済み
OSはWindows_NT x64 10.0.18363（win10 home）

#本編
##tasks.jsonを作成する
tasks.jsonを開いて、以下の内容を json上の`tasks`のどこかに入れる
たぶんコマンドパレット出して、`launch`と入れたら出ます
※コメントは読み替えてください

```jsonnet:tasks.json
{
   "label": "実行",
   "type": "shell",
   "command": [
       //ここにtcc.exeへのパス、パスが通っていたら'tcc'だけ,
       //ここにインクルードディレクトリ
       //ここにコンパイルオプション
       //DLL等を含めたいときにここにディレクトリ
       "${file}",
       "-o","${fileBasenameNoExtension}.exe",
       "&",
       "${fileBasenameNoExtension}.exe",
       //ここに実行時の引数
       "&",
       "del","${fileBasenameNoExtension}.exe"
   ],         
   "problemMatcher": []
}
```

一応${～～}の説明

|名前|内容|
|----|----|
|file|現在開いているファイル名|
|fileBasenameNoExtension|現在開いているファイルの拡張子を無視したベースファイル名|

[参考元](https://code.visualstudio.com/docs/editor/variables-reference)


## キーボードショートカットを登録する
実はtasks.jsonを作るだけだとF7を押した時に反応してくれません
なのでキーボードショートカットを登録して、F7を押すとタスク「実行」を実行させるようにします
まずはkeybindings.jsonを開いてください
方法は、コマンドパレットで、keyboardとカまでいれて探すか、GUIのショートカット編集画面でjsonに切り替えるかです
keybindings.jsonを開いたら下記を入れてください

```keybindings.json
{
    "key": "f7",
    "command": "workbench.action.tasks.runTask",
    "args": "実行"
}
```
,がないというエラーが出た場合は、適切な場所に追加してください


## 終わり
これでCファイルを開いている状態でF7を押すと、コンパイル&実行&exeの削除をするタスクを登録できました
お疲れ様です、ありがとうございました


#少し番外編
実は、task.jsonで、コンパイルして実行して、削除するというちょっと複雑な方法でしたが、dllなどをリンクしない場合はもっと簡単に書けます
それがこちら

```jsonnet:tasks.json
{
   "label": "実行(簡易)",
   "type": "shell",
   "command": [
       //ここにtcc.exeへのパス、パスが通っていたら'tcc'だけ,
       //ここにインクルードディレクトリ
       //ここにコンパイルオプション
       "-run","${file}",
       //ここに実行時の引数
   ],         
   "problemMatcher": []
}
```

読み替える部分が多すぎてわかりにくくてすみません
##終わり
今度こそ終わりです
すみませんでした
cameraを読み込み

# code

```c++

#include<stdlib.h>
#include<opencv2\opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;



void open_camera()
{
	Mat frame;//フレームレート
	VideoCapture capture(0);//カメラを開ける
	double fps;
	char string[10];
	namedWindow("FPS");
	double t = 0;

	while (1)
	{
		t = (double)getTickCount();
		if (capture.isOpened())
		{
			capture >> frame;//フレームを読み取る
			t = ((double)getTickCount() - t) / getTickFrequency();// tはコードがそこで実行されるのにかかる時間（秒単位）で、fpsはその逆数
			fps = 1.0 / t;
			sprintf_s(string, "%.2f", fps);
			std::string fpsString("FPS:");
			fpsString += string;
			putText(frame,
				fpsString,
				Point(5, 20),
				FONT_HERSHEY_SIMPLEX,
				0.5,
				Scalar(255, 255, 255));
			imshow("FPS", frame);
			waitKey(30);
		}	
	}
}


void save_vedio()
{
	VideoCapture capture;//現在のカメラのビデオ情報を取得する
	capture.open(0);//カメラを開ける
	Size size = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH),capture.get(CV_CAP_PROP_FRAME_HEIGHT));//ビデオパスを開き、基本情報を設定する
	VideoWriter writer;//保存関数をインスタンス化
	writer.open("out.avi", CV_FOURCC('M', 'J', 'P', 'G'), 10, size, true);//保存情報を設定する

	Mat frame;
	namedWindow("output", CV_WINDOW_AUTOSIZE);

	while (capture.read(frame))//フレームを読み取る
	{
		imshow("writing vedio", frame);
		writer.write(frame);//フレームごとに保存する
		waitKey(30);
	}

}

void open_vedio()
{
	VideoCapture capture;
	capture.open("out.avi");//保存した動画読み出す

	while (1)
	{
		Mat frame;
		capture >> frame;
		if (frame.empty())
		{
			break;
		}
		imshow("reading vedio", frame);
		waitKey(30);
	}

}
int main()
{
	open_camera();//問題1+2
	//save_vedio();//問題3、動画像をファイルに保存
	//open_vedio();//問題3、動画を読み出して
}

```
AWS初心者が在宅勤務中にAWSの資格を取る記録 part3

#5/4(Mon)
・Udemy（2h）
　・5/3に解答した問題の復習
　・セクション1：まずは知ってみるの受講

★受講しているコース
　「これだけでOK！AWS認定 ソリューションアーキテクト アソシエイト試験突破講座（SAA-C02試験対応版）」
https://www.udemy.com/course/aws-associate/learn/lecture/13377796

##感想
今日は休息日としたので、少しだけ。

#5/5(Tue)
・Udemy（3h）
　・セクション2～セクション4まで

##感想
クラウドプラクティショナーの勉強をしたおかげで、特に詰まることもなく進められている実感がある。

#5/6(Wed)
・Udemy（4h）
　・セクション4～セクション6まで
　・基本①～応用②までの65問×4を再度実施
　　結果
　　基本① 63/65 96%
　　基本① 61/65 93%
　　基本① 60/65 90%
　　基本① 58/65 89%

##感想
特になし。
明日は試験なのでそこそこにしておく。

#5/7(Thu)
・Udemy
　・今まで解いてきた問題の復習
　　→まとめてきたノートを見返し等
　・模擬試験2回（高難易度）
　　→60%とちょっとだけの達成率

##感想
業務後、クラウドプラクティショナー試験受けました！
結果は合格で一安心。。（874/1000 でした）
見たこと、聞いたことない問題や、自信をもって答えられない問題が数問ありましたが何とか絞り切りました。

受かるための勉強ではなく、業務に活かせる勉強をしてきたつもりなので、時間がかかりました。。
このままSAA取得まで突っ走ります！

#5/8(Fri)
・Udemy
　・SAA試験対策講座の受講
　　→EC2、VPC

##感想
めぼしいサービスを利用したシステムの構築を体験する趣旨のハンズオン自体は一度、別のUdemy講座で実施済なので「ふーん」という感じで進められている。

コロナウイルスの影響で出社することがなくなったため、肉体と精神に余裕がある。
夜ごはん後に1時間ほど散歩をしたり、毎日1本映画を見たり、勉強に時間を割いたりと有意義に過ごせている。

コロナのお陰で、というのも変な感じではあるが、いい精神状態ではあるので来週にはSAAが受けられるように進める。
AWS 認定ソリューションアーキテクト – プロフェッショナル 合格への道#21

#学習
##20
###Amazon Redshift リザーブドノードの購入

> AWS では、Amazon Redshift を使用するために発生する料金はコンピューティングノードに基づいています。各コンピューティングノードに対して、時間料金で課金されます。時間料金は、リージョン、ノードの種類、ノードに適用されるのがオンデマンドノード料金であるかリザーブドノード料金であるかなどの要因によって異なります。

##21
ある会社ではEBSボリュームに保存されている暗号化されたファイルを処理するEC2インスタンスをベースとしたアプリケーションを開発しています。RAID 0構成を設定することにより、IOPSパフォーマンスを向上させていますが、インスタンスのネットワーク帯域幅がボトルネックとなってスループットが低下し始めています。 このネットワーク上のボトルネックに対処して、スループットを向上させることが必要です。

この問題に対処するための最適な方法を選択してください。

> AWSでは拡張ネットワーキングとしてシングルルートI / O仮想化（SR-IOV）を使用して、サポートされているインスタンスタイプで高性能のネットワーキング機能を提供します。

シングル ルート I/O 仮想化 (SR-IOV) のインターフェイスはPCI Express (PCIe) 仕様の拡張機能です。 SR-IOV は、HYPER-V 仮想化スタックのソフトウェア スイッチ レイヤーをバイパスするネットワーク トラフィックを使用できます。 VF は、子パーティションに割り当てられているため、ネットワーク トラフィックは VF と子パーティション間で直接フローします。 結果として、ソフトウェア エミュレーション レイヤー入出力のオーバーヘッドは減少し、非仮想化環境と同様にほぼ同等のパフォーマンスとネットワークパフォーマンスを発揮します。SR-IOVによりネットワークスループットの向上、CPU使用率の低下、ホストごとのVMのサポート、ホストでのネットワーク帯域幅利用率の向上などが達成できます。

### Redundant Array of Independent Disk

* RAID 0
    * RAID 0はストライピングとも呼ばれます。
データをブロック単位に分割し、複数のディスクに分散して配置することで読み込み／書き込み速度を向上します。ただし、RAID 0には冗長性がない為、ディスクに障害が発生した場合、すべてのデータが失われます。
* RAID 1
    * はミラーリングとも呼ばれます。
同じデータを二つのディスクに書き込むことで、片方のディスクに障害が発生した場合でも、データが失われません。
* RAID 0+1
    * RAID 0とRAID 1を組み合わせた方式です。

##22
IAMとACMの使い分け

> IAM はACM でサポートされていないリージョンで HTTPS 接続をサポートする必要がある場合にのみ、証明書マネージャーとして使用

##23
SNS サブ解除

> 通知には、ユーザーへの通知にはユーザーが直接使用可能な購読解除URLが付与されており、このURLからユーザー自身で購読を解除する設定を操作することが可能

> サブスクリプションが不要になった場合は、まずトピックからのサブスクリプション解除を行います。これによってマネージャー向けのサブスクリプション設定を削除することができます。SNSトピックから該当ユーザーのサブスクリプションを削除すると、ユーザーが通知を受け取ることはありません。

##24
A社は顧客管理アプリケーションをAWSを利用して構築しています。これらはWEBサーバーとしてEC2インスタンスを利用して、ストレージとしてAmazon S3を使用して構成されています。EC2インスタンスには、開発と本番の両方のS3バケットにデータを保存するためのIAMロールが割り当てられています。また、このEC2インスタンスにはAWS CLIもインストールされています。

設定範囲が変わったため、EC2インスタンスが本番のS3バケットにアクセスできないように設定変更することになりました。そこで、あなたは開発用のS3バケットにのみアクセスする権限を付与する新しいIAMロールを、当該EC2インスタンスに割り当てました。しかしながら、アクセス状況をテストしてみたところ、この新しいIAMロールを割り当てたEC2インスタンスは、両方のバケットにデータを保存できてしまいます。

この問題の最も可能性の高い要因を説明してください。
> インスタンスで実行されているアプリケーションは、AWS CLIにアタッチされているアクセス認証情報または古いIAMロールを使用する場合があります。

##25
Amazon Kinesis ビデオストリーム は、デバイスから AWS クラウドへのビデオのライブストリーミングに使用したり、あるいはリアルタイムのビデオ処理やバッチ指向のビデオ分析のためのアプリケーションを構築できるフルマネージド型サービスです。AWS マネジメントコンソールでライブストリームをモニタリングし、Kinesis ビデオストリーム API を使用してライブビデオを表示するモニタリングアプリケーションを開発することもできます。Amazon Kinesis ビデオストリームは以下の３つの形式を利用できます

* GetMedia
    * GetMedia API を使用して、Kinesis ビデオ ストリームを処理する独自のアプリケーションを構築します。GetMedia は低レイテンシーのリアルタイム API です。GetMedia を使用するプレーヤーを作成する場合は 、自分で構築する必要があります。 
* HLS
    * HTTP Live Streaming (HLS) は、業界標準の HTTP ベースのメディアストリーミング通信プロトコルです。HLS を使用して、ライブ再生またはアーカイブ済み動画の再生用に Amazon Kinesis ビデオストリーム を表示できます。
* MPEG-DASH
    * Dynamic Adaptive Streaming over HTTP (DASH) (MPEG-DASH とも呼ばれる) は、従来の HTTP ウェブサーバーから配信されたインターネット経由で高品質のストリーミングを可能にする適応ビットレートストリーミングプロトコルです。 

##26
Link Aggregation Group (LAG) 

* リンクアグリゲーションとは？
    * LANスイッチ間を接続し、複数のパソコンやサーバで通信を行った場合、輻輳が発生する事があります。
        * 回線がパンク
AWS Lambda Layer(NodeJS)の作り方

# NodeJSを動かすのにライブラリが不足する事態発生
- 説明端折りますが、どうやらLayerというものを入れれば良いと検索して分かる。
- 作り方が色々書いてあって、最初間違っているサイト（バージョンが古い？）を閲覧してしまったハマったので自分の方法を記載します。

# バージョン
- Node 12.16.03　※13を使っていたのですが、Lambdaが執筆時は13をサポートしていなかったので、12にダウングレードしました。
- ダウングレード方法は、ここを見て下さい。
https://qiita.com/realtakahashi/items/a398e83a961c8dcfa109

# 闇雲に作ってはいけない。決まりがあった
- 決まった方法やディレクトリ名で作る
- ディレクトリ名は「nodejs」※それ以外は多分NG

```
mkdir nodejs
cd nodejs
```
- ディレクトリ内でnpm initをします。　※全てデフォルト、エンターでOKです。
- そして、必要なライブラリをインストールします。※例では３つ（require、puppeteer-core、chrome-aws-lambda）をインストールしています。
- インストール後にls -l すると、「node_modules」ディレクトリが作成され、モジュールが入っていればOKです。

```
npm init
npm i require puppeteer-core chrome-aws-lambda 
```
- インストールしたら、nodejsディレクトリをzipにします。zip名はたぶん何でも良いはずですが、他は試していません。

```
cd ../
zip -r modules.zip nodejs  
```

# あとはZipをLambdaのLayerにアップロードすれば使えます。
- 随分ハマったので、どなたかのお役に立てれば幸いです。
Flutterで“Running Gradle task 'assembleDebug'… ”というエラーが出る

コマンドラインで`flutter run`をした際や、Android StudioでRunボタンを押しても、`Running Gradle task assembleDebug`というエラーが出て実行されない問題について。

環境：WindowsOS
#解決法
Windowsのファイアウォールに、Flutterの実行を許可させる。
`コントロールパネル>システムとセキュリティ>Windows Defender ファイアウォール>Windows Defender ファイアウォールを介したアプリまたは機能を許可` に移動し、別のアプリの許可ボタンからAndroid Studioを許可する。
筆者の場合は、`C/Program Files/Android/Android Studio/bin`配下にある、**studio.ext**と**studio64.exe**を許可したところ、正常に作動した。
@State について

SwiftUIを使いはじめて戸惑ったのが@Stateであった。
備忘録として@Stateを使ったコードを残す。

```swift
import SwiftUI

struct state: View {
    @State var text = 1
    var body: some View {
        VStack {
            Button("button", action: {
                self.text += 1
                print("a")
            })
        
        Text("\(text)")
        }
    }
}

struct state_Previews: PreviewProvider {
    static var previews: some View {
        state()
    }
}
```
@Stateをつけることで変数の変更が可能になる。
AnsibleTower workflow内のjob間で変数を引き継ぐ

# はじめに
AnsibleTowerでワークフローを利用していると、後続のジョブに前のジョブの結果を引き渡したいことがある
ついつい`set_fact`で変数を定義して引き継ごうとしてしまうが、これだと別のジョブへは変数を引き渡すことができない

# 対策

`set_stats`で変数を定義することで、後続のジョブに変数を渡すことができる

以下の例で`persistent_variable`が引き継ぎされる

```yaml
  - name: "Set variable"
    set_stats:
      data:
        persistent_variable:  "<data>"
```

# 参照
公式ドキュメントに答えがあった
Workflows: https://docs.ansible.com/ansible-tower/latest/html/userguide/workflows.html
【Swift】処理時間を計測するクラスを作ってみた

めっちゃ構造体

# Code

```swift
struct StopWatch {
    
    var time: TimeInterval = 0
    
    private var startDate: Date = Date()
    private var endDate: Date = Date()
    
    init() {}
    
    mutating func start() {
        self.startDate = Date()
        self.time = 0
    }
    
    @discardableResult
    mutating func stop() -> TimeInterval {
        self.endDate = Date()
        self.time = self.endDate.timeIntervalSince(self.startDate)
        return self.time
    }
    
    mutating func reset() {
        self.time = 0
        self.startDate = Date()
        self.endDate = Date()
    }
}

```
VisualStudio 特定の型やメンバが使われたときに警告を表示する

## このドキュメントの内容

VisualStudio の支援機能を使って、使用してほしくない型やメソッドに対して警告が表示されるようにする方法を二つ紹介します。

## 例

次のような Execute メソッドがあるとします。
コネクションを指定しない場合は既定のコネクションを使用するメソッドを提供していましたが、何らかの理由でこのメソッドを使用しないようにしたいと考えているとします。

```c#
public static class DbHelper
{
    /// <summary>
    /// 指定されたコマンドを実行します。<--このメソッドを使わせたくなくなった。
    /// </summary>
    /// <param name="commandText">コマンドテキスト</param>
    public static void Execute(string commandText)
    {
        Execute(commandText, CreateDbConnection());
    }

    /// <summary>
    /// 指定されたコマンドを実行します。
    /// </summary>
    /// <param name="commandText">コマンドテキスト</param>
    /// <param name="connection">コネクション</param>
    public static void Execute(string commandText, IDbConnection connection)
    {
        // 割愛
    }

    private static IDbConnection CreateDbConnection()
    {
        // 割愛
    }
}
```

## 方法

### ObsoleteAttribute 属性を適用する

型やメンバが廃止予定であることをマークするための属性です。
抑制したい型やメンバが廃止予定である場合、この属性を適用します。
対象の型やメンバに属性を適用するわけですから、自分たちが開発している型とその型のメンバにしかこの方法は使えません。

```c#:ObsoleteAttribute属性を適用
    /// <summary>
    /// 指定されたコマンドを実行します。
    /// </summary>
    /// <param name="commandText">コマンドテキスト</param>
    [Obsolete("Execute(string, IDbConnection)を使用してください。")]
    public static void Execute(string commandText)
    {
        Execute(commandText, CreateDbConnection());
    }
```

対象のメソッドを使用するとコードエディタ上に次のような警告が表示されるようになります。
![obsolete.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280969/6d1fc39e-a508-1ee2-e449-8c9d1d351d60.png)


### BannedApiAnalyzers アナライザを利用する

Roslyn アナライザによって抑制したい型やメンバに対して警告を表示します。
ObsoleteAttribute 属性とは異なりソースコードに対して記述するわけではないため、標準ライブラリや OSS などで提供されている型やメンバにも適用できます。

1. Nuget などで対象のプロジェクトに Microsoft.CodeAnalysis.BannedApiAnalyzers を追加します。
2. 対象のプロジェクトに BannedSymbols.txt という名前のテキストファイルを追加します。
3. BannedSymbols.txt 内に抑制したい型やメンバを列挙します。記述書式は `種類:シグネチャ;メッセージ` です。詳しくは参考リンクを参照してください。

```text:BannedSymbols.txt
M:mxProject.DbHelper.Execute(System.String);Execute(string, IDbConnection)を使用してください。
```

対象のメソッドを使用するとコードエディタ上に次のような警告が表示されるようになります。和訳の結果がやや残念ですが、意図は十分伝わると思います。
![bannedSymbols.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280969/075daa4c-d88c-0e9e-bc1d-643fd52f491d.png)


## 参考リンク

【Cygames Engineers' Blog】[ZLogger – .NET CoreとUnityのためのゼロアロケーション構造化ロガー](https://tech.cygames.co.jp/archives/3401/)
【Qiita】[How to use Microsoft.CodeAnalysis.BannedApiAnalyzers](https://github.com/dotnet/roslyn-analyzers/blob/master/src/Microsoft.CodeAnalysis.BannedApiAnalyzers/BannedApiAnalyzers.Help.md)
【CORS】gem rack-corsとクロスオリジンについて


#はじめに
gem grapeでAPIを作成する際に、色々な記事に書いてあったCORSについて調べ、学んだのでまとめておく。

#CORS (Cross-Origin Resource Sharing)
オリジンというものがあり、それを（Cross）またいで情報を共有すること。

##オリジンって？
リソース自身のURLの「スキーム」「ホスト」「ポート」の3つの組み合わせを「オリジン」という。

`http://example.com:8080`
このオリジンの場合、

|   http  |      スキーム | 
|:-----------------|:------------------|
|    **example.com**       |   **ホスト** |
|        **:8080**    |     **ポート**   |

これらのどこかが違うと、異なるオリジンということになる。

#nslookupコマンド
これは、ドメイン名からIPアドレスを調べたり，その逆にIPアドレスからドメイン名を調べたりするときに使うコマンドで、

```shell
nslookup http://example.com:8080
```
などとして、ドメイン名からコンピューターが通信時に使用するIPアドレスを検索する（名前解決という）した際に、異なるIPアドレスである場合は、クロスオリジンと言える。

この異なるIPアドレス同士がリクエストを送ることをクロスオリジンと言う。

#gem rack-cors
これはgrape等でAPIを作成した際に、他のオリジンからのアクセスを制御する設定を行うもので、gemを追加し`bundle install`し`config/application.rb`に簡単な設定を追加するだけですぐに使える。
[こちら](https://github.com/cyu/rack-cors#configuration)を確認し、以下のように設定する。

```ruby:config/application.rb
module app_name
  class Application < Rails::Application
    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*', headers: :any, methods: [:get, :post, :options]
      end
    end
  end
end
```

こちらのorigins等の"*" というのは、全部、という意味で、この場合は他のすべてのオリジンからのアクセスを許可している事になる。

逆に、本番環境時にここに、自分のドメイン名を入れたりする事で、
他のサイトから自分の作ったAPIが参照出来なくなったり、という制御が可能になる。



###参考にさせて頂いた記事
- [【 nslookup 】コマンド――ドメイン名からIPアドレスを調べる](https://www.atmarkit.co.jp/ait/articles/1710/27/news021.html)

###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
DRF + gunicorn でDjango-Adminの静的ファイルが404になった時にやったこと

**結論 [WhiteNoise](http://whitenoise.evans.io/en/stable/) をインストールしたらいけました**
## 手順

pipなどでインストール

```
pip install whitenoise
```

`settings`に以下を追加

```
MIDDLEWARE = [
    ...
    'whitenoise.middleware.WhiteNoiseMiddleware',
    ...
]

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
```

以上

デバッグモードや `runserver`で起動してる場合は発生しないので、気がつきにくく結構ハマったのでメモ的に
Postmanを使ってStravaのAPIをたたいてみる

# はじめに
Postmanを使ってStravaのAPIを叩き、アクティビティ情報を取得するまでの流れを説明する記事です

以前、[StravaのAPIにアクセスしてアカウント情報を取得する](https://qiita.com/satodayo/items/d0077936aa16b6dfd4b7)の記事で、StravaのAPIをたたくまでの一連の流れを説明しました。
ただ、使う際にいちいちソースコード書いたりすることが面倒に感じ、今回Postmanを使ったお手軽API体験をしたので記事に残します。

# Postmanとは
[Postman.com](https://www.postman.com/)
気軽にAPIを叩ける超便利ツールです。
今回初めて使ったのですが、思った以上に便利で簡単に使えました。

# Stravaとは
参照：
[StravaのAPIにアクセスしてアカウント情報を取得する](https://qiita.com/satodayo/items/d0077936aa16b6dfd4b7)

# 本題

##～Stravaへのアプリ登録まで
参照：
[StravaのAPIにアクセスしてアカウント情報を取得する](https://qiita.com/satodayo/items/d0077936aa16b6dfd4b7)

今回はこのような内容として登録してあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/a6ca5c37-f078-b99a-7552-8746c289834a.png)


##AccessToken取得
stravaにアプリを登録すると以下の情報が与えられます。

- クライアントid
- クライアントシークレット
- アクセスToken

そもそもこの与えられたアクセスTokenを使えば簡単にWebAPIを叩けるのですが、アクセス範囲が**範囲：読み取り**で固定となっています。
そのため簡単なアスリート情報などは取得できるのですが、アクティビティ情報などは見ることができません。

アクティビティを参照するためには**activity:read**のスコープにおけるアクセスTokenが必要となるので、
このアクセスTokenをPostmanを利用して取得していきたいと思います。

###PostmanによるアクセスToken取得

###インストール部分は省略します
- ユーザー登録？を求められますが特に登録は必要ないです。
- とりあえず使いたい場合でも、Collectionの作成、Requestの登録を行わなくちゃいけないのが少しわかりづらかった。
    - これまで使ってたAdvanced REST Clientはそういうのなかったので

###リクエスト作成


新規にRequestを作成したら**Authorization**のタブを選択し
TYPEを**OAuth2.0**とし、*Get New Access Token*のボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/2b15f764-bc2a-5aad-b7ec-29aaeb29dfd1.png)

すると、AccessTokenを取得するために必要なパラメータが求められるので
アプリ登録時に与えられた以下の情報を入力していきます。

- クライアントid
- クライアントシークレット

ちなみにAuthURLや、AccessTokenURLなどに関しては公式ドキュメントに記載がありました。
また、Scopeに関しては自分が取得したい情報に合わせて設定します。
今回はアクティビティ情報を取得したいので**activity:read**としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/d36ccbf6-b16c-5620-eab2-c3bc84549b94.png)

入力が完了したら、**Request Token**を押します。
そうするとPostman上でStravaへのサインインが求められるかと思うのでサインインを行い、認証の承認も行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/49d06ee0-7a92-05d8-ca4f-23a888cf639e.png)

すると、以下のような画面に遷移するかと思うので**Use Token**を押せば自動でAccessTokenがセットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/8e379865-c8ee-43ea-9531-2bce3f191813.png)

##WebAPIの利用

ここまでこればあとはURLを叩くだけです。

1. Postmanの[Get]となっている部分に利用したいAPIのURLを記入
2. 必要となるパラメータを追加
3. Sendボタンを押す

を行えば完了です。
無事Activity情報を取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137041/615cf287-bedc-2e77-2b18-613ea8a67e59.png)

# 最後に
Postmanを利用すれば簡単にWebAPIを利用することができました。
気軽にWebAPIを叩いて個人開発に活かしていきたいですね。

また、StravaのWebAPIのDocumentは個人的に少しわかりづらかったので
この記事で少しでも気軽に使えるようになってもらえればと思います。
Oculus Quest開発為の準備作業

#◆はじめに
最近Oculusを購入する方が結構増えました。
ナビゲーションがあるので、使い方は特に、大きな問題がないはずですが、
開発用に使うには若干な設定が必要となります。

今回は、Oculus QuestのAPP開発用に使う時の準備すべき作業を記録します。
#◆開発者モード
まず最初に、Oculusに自作のAPPを起動するには、「開発者モード」になる必要があります。
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/4db63c1b-c282-2cba-af11-12b252c3002b.jpeg)
スマホのOculus APPを起動し、右下の「設定」を選択し、「その他の設定」に入り、
開発者モードを選択、オンにします。
Oculusバージョン更新した時、開発者モードはたまにリセットせれますので、ビルドできない場合、開発者モードをチェックしましょう。

PCと繋ぐさいは、Oculus側で「USBデバッグを許可しますか？」のダイアログが表示しますので、チェックしてください。
Oculusはモニターはない為、色々忘れずに、確認する必要があります。

音量を若干上下ておくと、何かあれば音出ますので、わかり易いと思います。
#◆アプリをビルドするには
[【UnityでOculus Quest向けのアプリを作る】APPをビルドして、動作確認する](https://qiita.com/Kujirai_sakananosuke/items/7874318d3f5ce24e9c63)
では、やり方と注意事項などを全部書いているので、参考して下さい。
#◆手の表示について
[【UnityでOculus Quest向けのアプリを作る】物を掴む為には](https://qiita.com/Kujirai_sakananosuke/items/8dabe6bbeb4658efb426#1%E6%89%8B%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)
昔の記事で、製作方法は書いた事がありますので、今回は製作方法ではなく、
OculusのアプリのIDの発行についてです。

（個人なので、個人としてやります）
OculusのAPPに登録したアカウト使ってログインし、
[Oculus Developer Dashboard](https://dashboard.oculus.com/organizations/create/)
にアクセスします。
![ED022687-71CF-4B13-AB26-BC4CBCB68968.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/65606f4a-3c19-da88-9b76-0e1156159f46.png)
![8803BAE9-6A21-4B8F-B761-1B2ACB54E905.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/3f0d8b8f-d0c4-6d2c-749d-af2db99e4932.png)
組織名を入れて、 
協定をチェックしましょう。

![8A1890D2-5357-41DD-8D38-416DCF201C86.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/259af7c3-ba50-ef2b-e1a9-baa9222ea65a.png)
「Create New App」を選択します。
![WeChate584c51cd1df6d73d5f384bd1c991b0d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/fcaecd3e-c278-cb7d-f27f-f358d51c11b5.png)
「App　Name」入力し、「Platdorm」は「Oculus　GO　＆　Gear VR」選択します。
確認を押して、次の画面に偏移します。
![1CC08402-FE18-457A-A70F-E20F1C77D3DC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/122c3672-abfe-e608-a14f-4973283298e1.png)
これで、IDがもらえたので、
上記（link）の方法と合わせ、App開発できる様になります。
#◆補足
Oculusに関しては、今まだ成長段階なので、アセットもよく変化します。
変化に応じて使用方法も変わりますので、新しい情報を常にチェックした方がいいですね。

上の三点＋以前の記事で、準備作業としては充分だと思いますが、何があればまだ補足します。
【JavaScript】filterを使って任意のデータを抽出

# filterメソッド

javascriptの配列メソッドの１つ。配列の内容を特定の条件で絞り込む。
抽出したいデータの条件を関数（コールバック関数）としてfilterメソッドの引数に与え、配列要素に対して実行、指定した条件と一致したものを抽出して配列を生成する。 

###### コールバック関数とは
関数の引数の中に別の関数を指定する処理。

[関数と引数についてはこちら](https://qiita.com/smkhkc/items/5e3729cffab6591f34c6#%E9%96%A2%E6%95%B0function%E3%81%A8%E3%81%AF)

###### 基本の書き方

```sample.js
var items = [配列];
// 上記で定義した配列itemsから任意のデータを抽出
// ( )内が抽出したいデータの条件
items.filter(コールバック関数);
```

🌟 8より小さい数字を抽出

```sample.js
var numbers = [4,1,6,5,8,9,10,19];
// 配列numbersから8より小さい数字を抽出して変数resultに格納
// 配列の値valueを引数として渡す
var result = numbers.filter（function (value) {
return value < 8;
}）;

console.log(result);

// 結果は　[4,1,6,5]
```


### filterメソッドの引数として使われるもの
value ・・・配列の値
index ・・・配列要素のインデックス番号
array ・・・現在処理している配列
windows + anaconda で tensorflow が入らない。

pipでは入るんだ。でもいやだ。仮想環境の意味がない。

```
conda install tensorflow
```

原因はこれ
https://github.com/conda/conda/issues/7203
必要ファイルのパスが長くなりすぎてwindowsのパスの長さ制限に引っかかる。

解決策は二つ提示されていて、

 * レジストリをいじって長いパスを参照できるようにする。https://knowledge.autodesk.com/support/autocad/learn-explore/caas/sfdcarticles/sfdcarticles/The-Windows-10-default-path-length-limitation-MAX-PATH-is-256-characters.html
 * anaconda のパッケージを指定したフォルダにする。

どう考えても後者がおすすめ
anaconda の設定ファイルを触る。なければ以下で　`C:\Users\ユーザ名\.condarc`が作られる。

```
conda config
```

ここに以下を記述

```
pkgs_dirs:
  - c:\conda-pkgs
```

windows + anaconda にはほぼ必須の設定に思える。
【Qiita】限定公開記事の編集履歴を見る方法

方法だけ知りたい人は[こちらをクリック](#結論)。


# 何が起きたか
私は記事を書く際に、限定公開で作成→更新(ブラッシュアップ)→全体公開のプロセスを踏んでいる。
今回、ブラッシュアップ中に記事の一部をうっかり消してしまったので、編集履歴から消した内容を確認しようとしたが、限定公開の記事メニュー(歯車アイコン)には「編集履歴」が見つからなかった。

| 全体公開の記事メニュー | 限定公開の記事メニュー |
|:-:|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407847/f83a3cd0-70ad-bc1a-e9ec-6755df267abe.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407847/e29f5d95-75ae-e4af-12b7-dd82efaebbc0.png) |
| 「編集履歴」がある | 「編集履歴」がない |


# どうしたか
内容を完全にロストした！？と不安になったが、メニューに表示されてないだけで機能はあるのではないかと思い、落ちついてURLを見てみた。

* 全体公開記事
https\://qiita.com/ユーザ名/items/記事ID

* 全体公開記事の編集履歴
https\://qiita.com/ユーザ名/items/記事ID/**revisions**

* 限定公開記事
https\://qiita.com/ユーザ名/private/記事ID

ふむ。
なら、限定公開のURL末尾に **/revisions** を付けたらどうだ？ということで

https\://qiita.com/ユーザ名/private/記事ID/**revisions**

を試した。

目的は達成された。


# 結論
https\://qiita.com/ユーザ名/private/記事ID/**revisions** で編集履歴が表示できた。
ただ公式に公開されている方法ではないため、そのうち使えなくなる可能性はある。
Railsのroutes.rbでリダイレクトさせるときのformatの維持のさせ方

routes.rb内でリダイレクトの記述していたときに複数のformatを持つパスのリダイレクトに躓いたのでメモ代わりに。
# 内容
```ruby:config/routes.rb
# jsonがデフォルトで、`/samples.xml`でアクセスされるとxmlで処理する
get :samples, to: 'sample#index', defaults: { format: :json }
```
という設定を

```ruby:config/routes.rb
get :samples, to: redirect('new_samples', status: 301)
```
に置き換える。

この場合、`/samples`に接続すると問題なく`/new_samples`にリダイレクトされるが、
`/samples.xml`に接続すると`/new_samples`にリダイレクトしてしまいjsonで処理してしまいます。
# 対応したこと
二通りありました。
## ブロック処理
[Rails Routing from the Outside In #3.12 Redirection](https://guides.rubyonrails.org/routing.html#redirection)を見るとredirectにはブロックを指定できるようなので、ブロック内で無理やり実現しました。

```ruby:config/routes.rb
get :samples, to: redirect { |params|
  "new_samples#{params[:format].present? ? ".#{params[:format] : ''}"
}, status: 301
```
どうも、よくある

```ruby:config/routes.rb
get 'samples/:id', to: redirect('new_samples/%{id}', status: 301)
```
のような指定で

```ruby:config/routes.rb
get :samples, to: redirect('new_samples.%{format}', status: 301)
```

みたいにしてみると`/samples.xml`に接続した時はうまく`/new_samples.xml`にリダイレクトするんですが、
`/samples`に接続するとエラーになります。

かなり力技になっているのと、上記のようにパス内に`id`みたいなパラメータがある場合、`%{id}`の書き方が使えなくなってしまい、

```ruby:config/routes.rb
get 'samples/:id', to: redirect { |params|
  "new_samples/#{params[:id]}#{params[:format].present? ? ".#{params[:format] : ''}"
}, status: 301
```

というように書かないといけないです。
## ２つに分割
`format`がある場合とない場合とで分ける方法です。

```ruby:config/routes.rb
get 'samples', to: redirect('/new_samples', status: 301), format: false
get 'samples(.:format)', to: redirect('/new_samples.%{format}', status: 301), format: true, as: :samples_format
```
`format`がある場合のリダイレクトのほうは`as`で別名をつけてあげないと`〜〜_path`のメソッドが名無しになってしまいます。


# 最後に
いずれのパターンも力技な感じなので、もっとスマートな書き方ご存知でしたら教えて下さい。
Gitのmasterブランチから新しくブランチを作ろうとしたらエラーになった：fatal: Not a valid object name: 'master'.

### 1. 事象の整理
gitで新規リポジトリを作成後、新しくブランチを切ろうとしたら、下記のエラーが表示された。

```
fatal: Not a valid object name: 'master'.
```

#### 時系列(1~3)をを整理します。
#### 1. gitをインストールしたPC上で以下のコマンドを入力：リポジトリを作成

```
$ git init test
Initialized empty Git repository in C:/Users/kuroiwa-t/Desktop/test/.git/
```

#### 2. 作成したリポジトリに移動し、git statusコマンドを入力
まだcommitがないよ～と言っている。リポジトリから一度もcommitしないと出る。

```
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
```

#### 3. masterから派生したブランチを作成しようと思い、git branch [ブランチ名]とコマンドを入力した所・・・冒頭で書いた「fatal: Not a valid object name: 'master'.」のエラーが表示されました。

```
$ git branch test/test1
fatal: Not a valid object name: 'master'.
```

### 2. 対処方法
・なんでもいいので、masterブランチにファイルをadd→commitしよう！（今回は適当なファイル作ってcommitします） ※ user情報登録し忘れたので、追加しておきますｗ

```
$ touch test.txt
$ git add test.txt
$ git commit -m 'テストcommit'
*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'kuroiwa-t@LAPTOP-A9TFBTAC.(none)')

$ git config --global user.email "XXXXXX@XXXXXX.net"
$ git config --global user.name "XXXXXX XXXXXX"

$ git commit -m 'テストcommit'
[master (root-commit) b168399] テストcommit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
```

masterにファイル追加後は、リポジトリの作成が可能です。

```
$ git branch test/test1 ←作成完了
$ git checkout test/test1 ←ブランチ切り替え
Switched to branch 'test/test1'
```

### 3. まとめ
コマンドの練習で「リポジトリ作成→ブランチ新規作成、切り替え」なんかはよくやると思うんですが、その時にここら辺で躓く人もいるかもしれないですねｗ自分への自戒を込めてメモしておきます。

####【用語復習】  
・**リポジトリ**：Gitによって管理されているフォルダのこと
・**コミット**：ファイルやフォルダの追加、変更をリポジトリに記録する

#### ＜コミットまでの簡単な流れ＞
1. ワークツリーにて修正内容を登録
2. ステージ（ステージングエリア）に移動："ステージはリポジトリにコミットする準備をするための場所"
3. ステージからリポジトリにコミット


> 引用
> サルでもわかるGit入門　https://backlog.com/ja/git-tutorial/
P5.js 日本語リファレンス(model)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の model関数を説明します。

## model()

### 説明文

3Dモデルを画面にレンダリングします。

### 構文

model(model)

### パラメタ

- model  
p5.Geometry：レンダリングされるロードされた3Dモデル

### 例

```javascript
//回転するティーポットを描画します
function preload(){
  // normalizeパラメータをtrueに設定してモデルをロードします
  teapot = loadModel( 'https://dl.dropbox.com/s/29mn2slkvn3ojra/teapod.obj', true, loadingOk());
}

function setup(){
  createCanvas(100, 100, WEBGL);
}

function draw(){
  background(200);
  scale(0.4); //モデルをキャンバスに合わせるためにスケーリング
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  
  // X軸に面するサーフェスは赤、Y軸に面するサーフェスは緑、
  // Z軸に面するサーフェスは青に設定
  normalMaterial();
  
  model(teapot); // 読み込んだモデルで描画
}

function loadingOk(loadModel){ 
  alert("モデルを読み込完了しました");
  return;
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/S0VxKrhAp


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
ESLint prefer-readonly-parameter-types の対応


ESLintのエラー対応のメモです。

prefer-readonly-parameter-typesというルールを設定しているとこのようなエラーが出ます。

```
ESLint: Parameter should be a read only type(@typescript-eslint/prefer-readonly-parameter-types)
```

読み取り専用の変数（上の場合関数の引数）には `readonly` をつけろ、というものです。

プリミティブな型の場合は

```
const hoge = (fuga:Readonly<string>) => {
}
```
というように書いてやればOKなのですが、引数に独自のインターフェースを持ったオブジェクトの場合は、

```
const hoge = (fuga:MyObject) => {
}
```

オブジェクトのプロパティまで全てread onlyにしてやらないといけないのです。
インターフェースの中に更に別のインターフェースを型にもち、読み取り専用でなかったすると厄介です。

どうしたものかと調べると便利そうなパッケージがありました。

https://github.com/sindresorhus/type-fest

こちらのReadonlyDeepによりオブジェクトの中のプロパティまでreadonlyに変換することが出来ます。

```
const hoge = (fuga:ReadonlyDeep<MyObject>) = {
}
```

今回はとりあえずこれで回避。

付け焼き刃な対応なので `prefer-readonly-parameter-types` を設定するなら事前に型の設計をちゃんとやらないとダメですね:innocent:
博士課程中退28歳が就職先で FileMaker に出会ってから3ヶ月が過ぎた

## はじめに

この記事は、縁あって2020年1月から働き始めた純粋数学出身元大学院生のド新人プログラマが体験した思い掛けない出会い（ソフトウェア的な意味で）とその後を淡々と綴るものです。過度な期待はしないでください。

### 三行で
* 研究の道を断念して民間で就活し、色々あって Web エンジニア職で拾って頂けた
* いつの間にか見知らぬ有能ソフトウェアとマブい友達になっていた
* FileMaker はいいぞ。

というわけで、本記事は就職して初めて知った **FileMaker** くんとのまだ短い付き合いからその機能を紹介するものです。
現状ググって参考にできるほど先人の知見が蓄積されているとはお世辞にも言い難いので、魅力を世に発信することであわよくば FileMaker Pro のユーザが増えたらいいな、とも考えています。 

### 想定している読者
* FileMaker のユーザ・将来のユーザ
* 大まかにプログラミングに興味のある方
* 似たような年齢・経歴の方々
* 未来の自分

#### 玄人の方へ
筆者自身もまだ学習中の身ですので、多少の心得違い等ご容赦願います。
「こういう機能もあるよ」などコメントを頂けると大変助かります。


## FileMaker あれこれ

### FileMaker is 何？
* Claris 社が開発しているデータベース管理ソフトウェア  
（弊社[^2] では2020年5月現在 FileMaker Pro 17 Advanced を利用）
* ライセンスは有料（≒ちょっと入手して遊んでみようというユーザが少ない）
* 直感的に扱いやすい
* 機能が充実している（後述）
* Win と Mac に対応

弊社では社内システムの一部を FileMaker に依存しているだけでなく、新人研修に FileMaker の仕様や取扱のイロハが含まれており、程度の差こそあれ全職員必須のスキルと言えます。
逆に言えば、複雑なスクリプト（後述）をブラックボックスとして利用するユーザが一部に存在しても組織としては差し支えなく、PC の操作が得意でない人に忌避感をそれほど与えない見た目であることも長所の一つです。

更に1つのファイルを疑似的な Web ページのように構築したり[^w] 、共有ファイルを仮想的なスケジュール表として利用したりすることも可能で、データ管理に限らないユーザ側の工夫の余地が多く残されているように感じます。

### どんな機能があるの？
1. 自由度の高いデータベース管理
見た目を一言で表現するなら「1行[^3]1ページでセルの配置が自由な Excel」
（表形式での表示との切り替えが任意）

1. 視覚的なわかりやすさと GUI への優しさ
可視化されたデータ多大な機能（文字入力以外の操作をマウスだけ行うことも一応可能）

1. 別テーブルとの連携（リレーション）
別テーブル（別ファイルでも可）の特定の項目との条件付けでデータを参照できる
⇒いちいち複数のテーブルを見比べる必要がない

1. 他形式のデータとの連携
インポート(MySQL, CloudSQL etc.)・エクスポート（csv, tsv, xml etc.）が容易

1. ファイル共有とセキュリティ
ファイルをホストコンピュータ上に置くことで、管理者が各ユーザに閲覧・編集権限を付与する形で共有が可能（ファイルを開く際のパスワードはユーザごとに設定させる）

1. スクリプト
日本語ベースで記述され、選択肢からコマンドを選ぶことで[^s] メニュー内の操作や「ここに指定した内容を書き込む」等のステップを組み合わせて処理を自動化することができる FileMaker の華（1ステップずつのデバッグも可能）

所謂「開発側」の仕事はスクリプトを用いて種々の事務的な処理を自動化することが主で、筆者も既にスクリプトの作成に関与しています。
触った感触としては、どのような機能が存在するか（完璧に網羅する必要はありません）及び If 文や Loop 処理さえ把握していれば単純明快です。後々掘り下げてお話をする機会を作りたいと思います。


## 次回予告

次回の投稿から本題である機能の紹介に入ります。

FileMaker には特有の用語が沢山ありますが、基礎的な部分（フィールド、レコード、テーブル、レイアウト等）を押さえつつ、見本ファイルの画像を貼りながら解説していきたいと考えています。

下手に一から説明して入門書の下位互換になってしまっても詮ないので、私が経験したような実践から入れる形も視野に入れています（それが必ずしも読者への優しさに繋がるとは限りませんが……）。迷走や試行錯誤が続くかもしれませんが、初学者のたわごとと思ってご容赦ください。

なお、既に FileMaker の知識をお持ちの方向けには、弊社の先輩が投稿した記事をお読み頂くことを強くお勧めします。いずれも独自性と読み応えがあります。

ひとまず、隔週更新ぐらいで続けられればいいなと思っています。
それでは次の記事でお会いしましょう。

<!-- %%%%%%%% 以下脚注 %%%%%%% -->

[^2]: 筆者の所属は所謂「会社」ではなく「弊協会」などと書くのが正式ですが、便宜上このような表現を用いる場合もあります。

[^w]: 分かる人向けの註：レイアウトを移動する設定をしたボタンが並んだ「メニュー」という名前のレイアウトから各テーブルを見に行くようなイメージです。

[^3]: 本来はデータベースの言葉で「レコード」と呼ぶのが適切です。本記事の段階では、より多くの人に伝わる表現を用いたり普及率の高い Excel に喩えたりしています。

[^s]: 実際は、最初の数文字を入力して補完機能がサジェストする中から選択することがほとんどです。
P5.js 日本語リファレンス(loadModel)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の loadModel関数を説明します。

## loadModel()

### 説明文

OBJファイル(頂点、法線などの情報が格納されているファイル)またはSTLファイル(3次元の立体形状を小さな三角形の集合体で表現しているファイル)から3Dモデルをロードします。

loadModel() は preload() 内に配置する必要があります。これによりそれ以降のコードが実行される前にモデルを完全にロードできます。

OBJおよびSTL形式の制限の1つは, 組み込みのスケール感がないことです。つまり, 異なるプログラムからエクスポートされたモデルは, サイズが大きく異なる可能性があります。モデルが表示されない場合は, 正規化されたパラメータを true に設定して loadModel() を呼び出してみてください。これにより、p5に適したスケールにモデルのサイズが変更されます。また、scale() を使用してモデルの最終的なサイズを変更することもできます。

カラーSTLファイルのサポートもありません。色付きのSTLファイルは、色のプロパティなしでレンダリングされます。

### 構文

loadModel(path, normalize, [successCallback], [failureCallback])

loadModel(path, [successCallback], [failureCallback])

### パラメタ

- path
String：ロードするモデルのパス

- normalize
Boolean：trueの場合、ロード時にモデルを標準サイズにスケーリングします

- successCallback
function(p5.Geometry)：モデルが読み込まれると呼び出される関数。 3Dモデルオブジェクトが渡されます(オプション)

- failureCallback
function(Event)：モデルの読み込みに失敗した場合、イベントエラーで呼び出されます(オプション)

### 戻り値

p5.Geometry：p5.Geometryオブジェクト

### 例1

```javascript
//回転するティーポットを描画します
function preload(){
  // normalizeパラメータをtrueに設定してモデルをロードします
  teapot = loadModel( 'https://dl.dropbox.com/s/29mn2slkvn3ojra/teapod.obj', true, loadingOk());
}

function setup(){
  createCanvas(100, 100, WEBGL);
}

function draw(){
  background(200);
  scale(0.4); //モデルをキャンバスに合わせるためにスケーリング
  rotateX(frameCount * 0.01);
  rotateY(frameCount * 0.01);
  
  // X軸に面するサーフェスは赤、Y軸に面するサーフェスは緑、
  // Z軸に面するサーフェスは青に設定
  normalMaterial();
  
  model(teapot); // 読み込んだモデルで描画
}

function loadingOk(loadModel){ 
  alert("モデルを読み込完了しました");
  return;
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/S0VxKrhAp

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。