<![CDATA[Startialab Dev Blog]]> https://dev.startialab.blog/ Sun, 18 Apr 2021 20:21:53 +0900 Wed, 31 Mar 2021 17:38:06 +0900 CMS Blue Monkey http://blogs.law.harvard.edu/tech/rss <![CDATA[QuickSightの計算フィールドを利用する]]> https://dev.startialab.blog/etc/a131 前書き

QuickSightで提供される関数と演算子を利用して、計算フィールドの集計を作成できます。ここではよく利用される関数をまとめていきます。

ifelse関数

```
ifelse(
  {product_type}=1, "apple",
  {product_type}=2, "orange",
  NULL
) ```

concat関数

```
concat(
  '1-3ヶ月: ', toString({product_count}),
  ', ',
  '4-6ヶ月: ', toString({product_count})
) ```

formatDate関数

```
formatDate(
  {product_date},
  'yyyy-MM'
) ```

sumOver関数

```
sumOver(
  count(product),
  [{month}]
) ```

dateDiff関数

```
dateDiff(
  {first_date},
  {last_date},
  'DD'
) ```]]>
Wed, 31 Mar 2021 17:38:06 +0900
<![CDATA[【Linux】mailxコマンド]]> https://dev.startialab.blog/linux/a136 インストール ```
yum install mailx -y
```

よく使うオプション


-v verbose メール配信内容詳細表示
-s subject サブジェクト
-c cc CC メールアドレス
-b bcc    BCC メールアドレス

送信例

```
echo "メール本文
メール本文
メール本文
メール本文
メール本文
メール本文" | mailx -v from=from-mail-address -s "サブジェクト" to-mail-address
```]]>
Wed, 31 Mar 2021 17:01:16 +0900
<![CDATA[【パフォーマンス】ab コマンドの使い方]]> https://dev.startialab.blog/linux/a135 Apache Bench とは WEBサーバの性能確認ツールです。

使い方

一般 -n -c -p -H がわかれば問題ないです。
-n リクエスト数
-c クライアント数
-p ポストファイル
-H ヘッダー

GET


```
ab -c 10 -n 1000 http://localhost
```
同時10クライアントで1000リクエストをGETします。

POST

```
ab -c 100 -n 10000 -p data.json -H ‘Content-Type:application/json’ http://localhost
```
同時100クライアント・10000リクエストでdata.jsoをPostします。

]]>
Wed, 31 Mar 2021 17:01:05 +0900
<![CDATA[three.jsでWebXR - Hit-Test のソースを確認する]]> https://dev.startialab.blog/WebAR/a134
目次

three.jsのWebXR Exampleソース

前回、three.jsのソースをWebXR(VR)に対応させる方法を記載しました。
https://dev.startialab.blog/WebVR/a128

今回はそれに加えて、WebARの機能であるHit-Testを使うための設定箇所について説明します。

題材とするのは、three.js Examplesにある「webxr_ar_hittest.html」で、
WebXR対応およびHit-Testに必要な設定箇所を解説いたします。
https://github.com/mrdoob/three.js/blob/dev/examples/webxr_ar_hittest.html
(2021/03/29時点のソースを元にしています)

WebXRの設定

WebARの設定を追加します。前回がVRButton.jsに対して今回はARButton.jsです。
違いはARButton.jsの設置時の設定だけで、他は同じになります。

ARButton.jsライブラリの取得

ソースコード18行目
ARを許可するボタンの設置と、WebXR設定を行ってくれる「ARButton.js」を読み込みます。

import { ARButton } from './jsm/webxr/ARButton.js';

RendererのWebXR設定

ソースコード50行目
rendererのxrプロパティを有効化します。

renderer.xr.enabled = true;

ARButtonの設置

ソースコード55行目
上記で読み込んだARButtonライブラリを設置します。

VRButtonと違うのは、第二引数にhit-testを設定しています。

document.body.appendChild( ARButton.createButton( renderer, { requiredFeatures: [ 'hit-test' ] } ) );

アニメーションループ実装の変更

ソースコード106行目
アニメーションループの実装を行います。

通常Three.jsでは「window.requestAnimationFrame」を利用してループ処理を実装します。
WebXRではsetAnimationLoopでフレームごとの処理を設定します。

ここまでは、VRButtonでVR対応した際とほとんど同じです。

renderer.setAnimationLoop( render );

ループ内の実装

ここからは、hit-testを使って床面や側面を検知した結果をレチクルに反映する機能実装となります。
setAminationLoopで設定した関数である「render」を、1フレーム毎に実行していきます。
このrender関数のcallbackとして2つの値が渡されます。

 ・timestamp:前フレームから今フレームまでに経過した差分時間msec
 ・frame:session情報など、1フレーム内で様々な処理を行うために必要な情報を取得することができます。

ここからはWebXR Device APIの考え方の理解がいくつか必要となってきます。
簡単に説明しますが、詳し句知りたい方は以下のURLを参考にされてください。
https://developer.mozilla.org/ja/docs/Web/API/WebXR_Device_API

hitTestSourceの取得

ソースコード114〜138行目
session.requestReferenceSpace( 'viewer' ) で取得した ReferenceSpace情報を元に
session.requestHitTestSource( { space: referenceSpace } ) で hitTestSourceを取得しています。

取得したhitTestSourceはsessionが完了するまで保持します。

ReferenceSpaceがよくわからないかと思います。
どのような空間でAR表示する想定かを表しています。
詳細については以下参照ください
https://developer.mozilla.org/ja/docs/Web/API/XRReferenceSpace

session.requestReferenceSpace( 'viewer' ).then( function ( referenceSpace ) {

session.requestHitTestSource( { space: referenceSpace } ).then( function ( source ) {

hitTestSource = source;

} );

} );

hitTestResultsの取得

ソースコード140〜157行目
frame.getHitTestResults( hitTestSource ) でhitTest結果を取得しています。
hit.getPose( referenceSpace ).transform.matrix で位置、回転、スケール情報を格納した行列を取得します。
フレーム毎にレチクルオブジェクトへ反映することで、水平面や垂直面に沿うような動きを実現しています。

const hitTestResults = frame.getHitTestResults( hitTestSource );

if ( hitTestResults.length ) {

const hit = hitTestResults[ 0 ];

reticle.visible = true;
reticle.matrix.fromArray( hit.getPose( referenceSpace ).transform.matrix );

} else {

reticle.visible = false;

}

まとめ

hit-testを使って簡単に水平面、垂直面を取れるようになりました。
思っていたよりも実装量が少なくて拍子抜けしたかもしれません。

水平面、垂直面を取れるようになるとAR表現の幅がグッと広がると思います。
Three.jsには他にもWebXRのExamplesはありますので、参考にされると良いかと思います。
https://threejs.org/examples/

]]>
Wed, 31 Mar 2021 17:00:57 +0900
<![CDATA[AWS php SDK SQS Messageの取得]]> https://dev.startialab.blog/php/a133 # aws access key 設定 ```
aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

# php install

```
amazon-linux-extras install php7.4 -y
php --version
```

# composer install

```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer --version
```

# フォルダ作成

```
mkdir phpsqs
```

# php sdk 導入

```
composer require aws/aws-sdk-php
```

# ファイル作成


```
# vim get_queue_worker.php

require 'vendor/autoload.php';

use Aws\Sqs\SqsClient;
use Aws\Exception\AwsException;

$queueUrl = "QUEUE_URL";

$client = new SqsClient([
'profile' => 'default',
'region' => 'ap-northeast-1',
'version' => '2012-11-05'
]);

try {
$result = $client->receiveMessage(array(
'AttributeNames' => ['SentTimestamp'],
'MaxNumberOfMessages' => 1,
'MessageAttributeNames' => ['All'],
'QueueUrl' => $queueUrl, // REQUIRED
'WaitTimeSeconds' => 0,
));
if (!empty($result->get('Messages'))) {
var_dump($result->get('Messages')[0]);
$result = $client->deleteMessage([
'QueueUrl' => $queueUrl, // REQUIRED
'ReceiptHandle' => $result->get('Messages')[0]['ReceiptHandle'] // REQUIRED
]);
} else {
echo "No messages in queue. \n";
}
} catch (AwsException $e) {
// output error message if fails
error_log($e->getMessage());
}
```

# 実行
```
php get_queue_worker.php
```

]]>
Tue, 30 Mar 2021 17:57:45 +0900
<![CDATA[【Linux】curlでグローバルIPを確認 (まとめ)]]> https://dev.startialab.blog/linux/a132 # ifconfig.io ifconfig.me ```
$ curl ifconfig.io
92.203.52.140
$ curl ifconfig.me
92.203.52.140
IPv4 固定
$ curl ifconfig.io -4
92.203.52.140
$ curl ifconfig.me -4
92.203.52.140

$ curl ifconfig.io/all.json
{
"country_code": "JP",
"encoding": "gzip",
"forwarded": "92.203.52.140",
"ifconfig_hostname": "ifconfig.io",
"ip": "92.203.52.140",
"lang": "",
"method": "GET",
"mime": "*/*",
"port": 2538,
"referer": "",
"ua": "curl/7.64.1"
}
```

# ipinfo.io

```
$ curl ipinfo.io
{
"ip": "92.203.52.140",
"hostname": "fp5ccb348c.fkol216.ap.nuro.jp",
"city": "Tokyo",
"region": "Tokyo",
"country": "JP",
"loc": "35.6910,139.7679",
"org": "AS2527 Sony Network Communications Inc.",
"postal": "101-0047",
"timezone": "Asia/Tokyo",
"readme": "https://ipinfo.io/missingauth"
}
```

# inet-ip.info

```
$ curl inet-ip.info
92.203.52.140

$ curl inet-ip.info/ip
92.203.52.140

$ curl inet-ip.info/json
{
"IP": "92.203.52.140",
"Hostname": "[fp5ccb348c.fkol216.ap.nuro.jp.]",
"CountryCode": "DE",
"CountryName": "Germany",
"Accept": ["*/*"],
"AcceptEncoding": null,
"AcceptLanguage": null,
"UserAgent": ["curl/7.64.1"],
"Via": null,
"XForwardedFor": ["92.203.52.140"],
"XForwardedPort": null,
"XForwardedProto": ["http"],
"RequestURI": "/json"
}
```

# ip-api.com

```
$ curl ip-api.com
{
"status" : "success",
"continent" : "Asia",
"continentCode": "AS",
"country" : "Japan",
"countryCode" : "JP",
"region" : "40",
"regionName" : "Fukuoka",
"city" : "Fukuoka",
"district" : "",
"zip" : "819-0001",
"lat" : 33.5895,
"lon" : 130.3197,
"timezone" : "Asia/Tokyo",
"offset" : 32400,
"currency" : "JPY",
"isp" : "Sony Network Communications Inc",
"org" : "Sony Network Communications Inc.",
"as" : "AS2527 Sony Network Communications Inc.",
"asname" : "SO-NET",
"mobile" : false,
"proxy" : false,
"hosting" : false,
"query" : "92.203.52.140"
}
```

# httpbin.org

```
$ curl httpbin.org/ip
{
"origin": "92.203.52.140"
}
```

余談:

digコマンドの場合
```
$ dig o-o.myaddr.l.google.com @ns1.google.com txt +short
"92.203.52.140"

$ dig myip.opendns.com @resolver1.opendns.com +short
92.203.52.140
```
]]>
Tue, 30 Mar 2021 17:53:58 +0900
<![CDATA[pandasライブラリでif条件の適用]]> https://dev.startialab.blog/python/a130 前置き

pandasライブラリではif条件を適用する方法がいくつかあります。ここではまとめていきます。

Lambdaを使って処理する

```
import pandas as pd

data = {'title': ['t1','t2','t1','t1','t2']}
df = pd.DataFrame(data)
df['title_t1'] = df['title'].apply(lambda x: 1 if x == 't1' else 0)
print(df) ```

以下に結果を示します:

```
   title title_t1
0   t1   1
1   t2   0
2   t1   1
3   t1   1
4   t2   0 ```

locを使って処理する

```
import pandas as pd

data = {'title': ['t1','t2','t1','t1','t2']}
df = pd.DataFrame(data)
df.loc[df['title'] == 't1', 'title_t1'] = 1
df.loc[df['title'] != 't1', 'title_t1'] = 0
print (df) ```

以下に結果を示します:

```
   title title_t1
0  t1  1.0
1  t2  0.0
2  t1  1.0
3  t1  1.0
4  t2  0.0 ```]]>
Tue, 30 Mar 2021 10:55:12 +0900
<![CDATA[QuickSightでコントロールを設定する]]> https://dev.startialab.blog/etc/a129 前置き

Amazon QuickSightでは、コントロールという機能を使用すると、閲覧者はドロップダウン、日付セレクターなどのUIを使用してパラメーターの値を変更できます。こちらはこの便利な機能の設定手順をメモしておきます。

コントロールを設定する

「Parameters」ボタンをクリックし、新しいパラメータを追加する。

QuickSight

パラメータ名を入力し、データ型と値を選択したら、「Create」をクリックする。

QuickSight

「Control」を選択する。

QuickSight

表示名を入力し、スタイルを選択する。

QuickSight

ドロップダウンの場合は、特定の値を定義することができる。データセットフィールドへもリンクできます。

QuickSight

設定したら、コントロールがAnalyses画面に表示される。

QuickSight

フィルタを設定し、「パラメータを使用」にチェックを入れて、コントロールと紐付ける。

QuickSight]]>
Mon, 29 Mar 2021 16:44:19 +0900
<![CDATA[three.jsのソースをWebXRに対応させる方法]]> https://dev.startialab.blog/WebVR/a128
目次

three.jsのWebXR Exampleソース

前回まででA-FrameのWebXR対応方法について記載しました。
今回はThree.jsのWebXR対応方法について記載いたします。

題材とするのは、three.js ExamplesにあるWebXR対応ソースです。
比較的簡素なソースである「webxr_vr_sandbox.html」をベースにして、
WebXR対応に必要な設定箇所を解説いたします。
https://github.com/mrdoob/three.js/blob/dev/examples/webxr_vr_sandbox.html
(2021/03/29時点のソースを元にしています)

VRButtonライブラリの取得

ソースコード16行目
VRを許可するボタンの設置と、WebXR設定を行ってくれる「VRButton.js」を読み込みます。

import { VRButton } from './jsm/webxr/VRButton.js';

RendererのWebXR設定

ソースコード118行目
rendererのxrプロパティを有効化します。

renderer.xr.enabled = true;

VRButtonの設置

ソースコード121行目
上記で読み込んだVRButtonライブラリを設置します。

document.body.appendChild( VRButton.createButton( renderer ) );

アニメーションループ実装の変更

ソースコード140行目
アニメーションループの実装を行います。

通常Three.jsでは「window.requestAnimationFrame」を利用してループ処理を実装します。
WebXRではsetAnimationLoopでフレームごとの処理を設定します。

renderer.setAnimationLoop( render );

まとめ

思ったよりも簡単にWebXR対応できたかと思います。
今回はVR表示の実装を行いましたが、VRButton.jsをARButton.jsに変えることで、AR表示も可能です。
興味のある方は、ARButton.jsを利用したExamplesを確認してみてください。

]]>
Mon, 29 Mar 2021 13:57:36 +0900
<![CDATA[k近傍法(k-Nearest Neighbor)で分類してみる]]> https://dev.startialab.blog/python/a122 はじめに

今回はscikit-learnを使って、機械学習アルゴリズムk近傍法(k-Nearest Neighbor)で単純なデータを分類してみました。

k近傍法のメリットとデメリット

メリット

  • 精度が高い
  • 外れ値に鈍感
  • データに関する仮定なし

デメリット

  • 計算量が大きい
  • 大量のメモリが必要

k近傍法の実装

```
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from sklearn.neighbors import KNeighborsClassifier

# サンプルデータとラベルを作成する

data = [
    [1.0, 1.2],
    [1.0, 1.0],
    [0.0, 0.2],
    [0.0, 0.0]
]

labels = ['A1', 'A1', 'A2', 'A2']

# クラスを予測する

knn = KNeighborsClassifier(n_neighbors=2)
knn.fit(data, labels)
print(knn.predict([[1.0, 1.1]]))

```

結果を確認します。

```
>>> ['A1']
```]]>
Mon, 29 Mar 2021 13:57:31 +0900