OmniAICreator/Qiita-1.07M huggingface dataset:
NCMBとFlutterでチャットアプリを作る（その2：認証実行）

NCMBとFlutterを使ってチャットアプリを作ります。以前はPieSocketを使ってチャットアプリを作っていたのですが、現在PieSocketは無料での利用枠がなくなっています。そこで今回は[goofmint/ruby-websockets-chat-demo](https://github.com/goofmint/ruby-websockets-chat-demo)をベースにチャットアプリを作ります。これはごく単純なWebScoketサーバーで、Herokuにデプロイできるものです。Herokuの無料枠内での利用が可能です。

[前回の記事では画面の説明とSDKの導入までを進めました](https://qiita.com/goofmint/items/2e8b73ca0f2479c58118)ので、今回は認証周りを解説します。

## コードについて

今回のコードは[NCMBMania/flutter\_chat: Flutter SDKを使ったチャットアプリです](https://github.com/NCMBMania/flutter_chat)にアップロードしてあります。実装時の参考にしてください。

## MyHomePageについて

MyHomePageでは認証状態に応じてLoginPageとChatPageを読み込みます。

```dart
class _MyHomePageState extends State<MyHomePage> {
  NCMBUser? _user;
	@override
	Widget build(BuildContext context) {
		return _user != null
				// ログインしている場合
				? ChatPage(
						user: _user!,
					)
				// ログインしていない場合
				: LoginPage(
						// ログインした際に呼ばれるイベント
						onLogin: checkLogin);
	}
}
```

認証をチェックする場合には `NCMBUser.currentUser()` を使います。認証済みであればNCMBUserが、認証されていない場合は null が返ってきます。

```dart
// ログインチェックを行う処理
void checkLogin() async {
	final user = await NCMBUser.currentUser();
	setState(() {
		_user = user;
	});
}
```

## LoginPageについて

認証されていない場合に読み込まれるのがLoginPageです。このページでは認証処理を実行して、その結果をMyHomePageに返します。

```dart
class _LoginPageState extends State<LoginPage> {
  var _name = ''; // 入力してもらう表示名

  // ログイン処理
  void anonymousLogin() async {
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text('Login')),
        body: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
          const Text(
            'チャットの名前を入力してください',
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              SizedBox(
                width: 250,
                child: TextField(
                  onChanged: (value) {
                    setState(() {
                      _name = value;
                    });
                  },
                ),
              ),
              TextButton(onPressed: anonymousLogin, child: const Text("ログインする"))
            ],
          )
        ]));
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/c5e0d840-9a8f-8d7d-9184-c79a48d04d17.png)


### 認証処理について

匿名認証処理は `NCMBUser.loginAsAnonymous()` だけで完了します。NCMBの管理画面で匿名認証が有効になっていれば、これだけでNCMBUserが返ってきます。

認証が完了したら、LoginPageで入力された名前をdisplayNameに適用し、更新します。その後、ログイン完了イベントを呼びます。

```dart
// ログイン処理
void anonymousLogin() async {
	// 匿名認証でログイン
	final user = await NCMBUser.loginAsAnonymous();
	// 入力された表示名をセット
	user.set('displayName', _name);
	// 情報更新
	await user.save();
	// 完了イベントを呼ぶ
	widget.onLogin();
}
```

これで認証処理が完了し、ChatPageが表示されます。

## まとめ

今回はチャットアプリの認証周りについて解説しました。次は[チャット画面周りを解説](https://qiita.com/goofmint/items/97031d9219d22202fe3a)します。
Django初心者がSNSアプリを作る　その2

前回 https://qiita.com/YuDachi/items/2c46930fe33c4c7e70bb
元記事 https://note.com/saito_pythonista/n/n6550f5c2a07b

今回から、元記事の「4.2 CRUD機能」を、ユーザー関連の機能を除いて実装する。

# 投稿一覧ページの実装

元記事の「4.2.1 ①投稿記事の"一覧"ページ表示機能」に相当する部分を実装する。

## Templateの作成

前回も書いたが、効率性を無視してとことんわかりやすいところから実装する。まずはページの表示"のみ"を目標にしよう。

templates下にlist.htmlを作成し表示したいのだが、今後の便宜のためにちょっとした準備をする。HTMLに関する共通しそうな設定はすべてbase.htmlに書き、それをextendsで個々のHTMLファイルに引っ張るという形式を採用する。こうすることで同じ設定を何度も書かずに済む。

### templates/base.html

```templates/base.html
{% load static %}

<!doctype html>
<html lang="ja">

<head>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.1/css/all.css" integrity="sha384-vp86vTRFVJgpjF9jiIGPEEqYqlDwgyBgEF109VFjmqGmIY/Y4HV4d3Gp2irVfcrp" crossorigin="anonymous">
    
{% block customcss %}
{% endblock customcss %}

<title>SNSアプリサンプル</title>

</head>

<body>

{% block content %}
{% endblock content %}

</body>

</html>
```
これで customcss, content 以外の部分を共通化できる。次にlist.htmlを作成し、base.htmlの内容をextendsで持ってくる。表示させることが目標なので中身は適当。

### templates/list.html

```templates/list.html
{% extends 'base.html' %}
{% load static %}

{% block content %}

    <h1>THIS IS LIST</h1>

{% endblock content %}
```
このあたりの実装も書籍「現場で使える Django の教科書《基礎編》」に書いてあった。

## viewとURLの設定

作ったテンプレートを表示するためviewとURLを設定する。
元記事ではListViewを用いているが、modelがないとエラーで動かないっぽいので、代わりにTemplateViewを使った。冗長だと思う人はmodelを作成して最初からListViewを使えばいいと思う。

### snsapp/views.py

```snsapp/views.py
from django.http import HttpResponse
from django.views.generic import TemplateView # 追加

...

# 追加
class Home(TemplateView):
    template_name = "list.html"
```

### snsapp/urls.py

```snsapp/urls.py
from django.urls import path

from .views import Home # 追加

urlpatterns = [
    path('', Home.as_view(), name='home'),　# 訂正
]
```

これで"ページの表示"という目標が達成できた。

次回はlist.htmlをもう少しいじって、投稿一覧ページのイメージを作成する。
【Swift】Storyboardでバージョンに関する警告

# はじめに
以前あげた[こちら](https://qiita.com/SNQ-2001/items/7151fdcb8e9f8c2c42c2)の記事を見ながらネイティブ広告を実装してる際にStoryboardに警告が出ていたので修正方法を記載しておきます。

# 警告
```
warning: Unsupported Configuration: This file is set to build for a version older than the deployment target. Functionality may be limited.
```
![スクリーンショット 2022-08-15 22.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7fd2eb6d-07a1-97bb-c688-42668591e056.png)

# 原因

![スクリーンショット 2022-08-15 22.17.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/27de8f60-dc28-8c3b-2937-08606dfab7be.png)


![スクリーンショット 2022-08-15 22.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5ecc5392-edcd-1fd9-64f3-97b5f8777258.png)

Storyboardの「Interface Builder Document」に設定されているバージョンが、
「iOS Deployment Target」に設定しているバージョンより低いと警告が発生します。

# 解決方法
「Interface Builder Document」に「Deployment Target」を設定する。
![スクリーンショット 2022-08-15 22.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0c4b8faf-30d0-3c88-c281-b06998863fbb.png)

# 参考記事
http://s-prism3.seesaa.net/article/437772589.html
🔧【Google Spanner】ALTER文の実行できる場所、できない場所




ALTER文自体に問題はないが、下記のエラーで実行できない
```
クエリは失敗しました: Statement not supported: AlterTableStmt at line 1, column 1
```

↓

テーブル一覧の「DDLを記述」から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/caa5d8dd-193a-ac9d-b324-64a0de15d6a8.png)

「DDL ステートメントの記述」ページの「DDLテンプレート」入力欄にSQLを入力して実行することで可能
Ansible uri モジュールを使用してPowerVC API で token を発行する

#### はじめに

PowerVC で Ansible の uri モジュールを用いて API での token 発行方法を確認しました。

参考：[Supported OpenStack Identity (Keystone) APIs](https://www.ibm.com/docs/en/powervc/2.0.2?topic=apis-supported-openstack-identity-keystone)

----
#### 環境


・PowerVC 2.0.1 (RHEL 8.4, ppc64le on S824)
・Ansible 2.13.1, python 3.10.5  (Mac に導入して実行)

----
#### 実行スクリプト

次の tokenissue.yml を作成。

```tokenissue.yml
---
- name: token issue
  hosts: localhost
  tasks:
   - name: Get auth token
     uri:
       url: "https://<PowerVC IP address>:5000/v3/auth/tokens"    #<= 要編集
       method: POST
       headers:
         Accept: application/json
       body: "{{ lookup('template', 'token.json') }}"      #<= token.jsonは外部ファイル
       body_format: json
       return_content: yes
       status_code: 201
       validate_certs: no
     register: auth_token

   - name: Set Variable OS_TOKEN
     set_fact: OS_TOKEN="{{ auth_token.x_subject_token }}"

   - name: show previous stdout
     debug:   
       msg: "{{ OS_TOKEN }}"
```

tokenissue.yml の中で呼んでいる token.jsonは以下です。

```token.json
{
    "auth":{
       "scope":{
          "project":{
             "name":"ibm-default",
             "domain":{
                "name":"Default"
             }
          }
       },
       "identity":{
          "methods":[
             "password"
          ],
          "password":{
             "user":{
                "domain":{
                   "name":"Default"
                },
                "name":"<user name>",                  #<= 要編集, 実行ユーザー
                "password":"<user password>"           #<= 要編集　実行ユーザーのパスワード
             }
          }
       }
    }
}
```


---

#### 実行

PowerVC サーバーに対して tokenissue.yml を実行します。
(ansible.cfg, inventory の書き方は省略します)

```
$ ansible-playbook tokenissue.yml

PLAY [token issue] *******************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************
ok: [localhost]

TASK [Get auth token] ****************************************************************************************************************
ok: [localhost]

TASK [Set Variable OS_TOKEN] *********************************************************************************************************
ok: [localhost]

TASK [show previous stdout] **********************************************************************************************************
ok: [localhost] => {
    "msg": "gAAAAABi_DACmemTb-Vrk5PUaIUktUxxxxTs0jiNGc2xB2lF3G4J_QOYrmtdZ6trLxxxxxcvonS9XqE9dsSWSjnYCTg_Xl0tpxxxxx12pLVX4XQ__xc7fOHGPvDlE9pa3xxxxxROQqKPl3Kpzvxwfuek30801b_w"
}

PLAY RECAP ***************************************************************************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```


---

Ansible uri モジュールで token 発行 API を実行し、OS_TOKEN 変数として fact で代入することができました。
こちらを使用して、他のAPIを実行する方法を確認しようと思います。



以上です。
NCMBのFlutter SDKを少しだけ使いやすくしました

FlutterはDartで書かれたフレームワークになります。元々iOSやAndroidといったスマートフォン向けでしたが、今ではWebやWindows、macOSといったマルチプラットフォームで動作します。Flutter/Dartを覚えることで、多くの環境に対してアプリケーション開発が可能になります。

NCMBでは公式SDKを提供していませんが、非公式に開発を進めているFlutter SDKがあります。だいたいの機能は実装してきましたが、今回はより使いやすくするためのメソッドを追加しました。実際に使っていく中で感じた不便さを解消するものなので、ぜひお使いください。

[ncmb | Dart Package](https://pub.dev/packages/ncmb)

## データストアでフィールドがない場合にチェックするcontainsKeyメソッド

FlutterのMapで、キーの存在をチェックするのに使われるのがcontainsKeyメソッドです。データストアではユーザー自身が自由に項目を追加できるので、そのフィールドが実は存在しない場合があります。

これまではdefaultValueと組み合わせて対応してきました。

```dart
if (object.getString('field_name', defaultValue = 'no') == 'no') {
	// フィールドなし
} else {
	// フィールドあり
}
```

ただ、この方法では実際にデータが `no` だった場合に問題なので、containsKeyメソッドを追加しました。

```dart
if (object.containsKey('field_name')) {
	// フィールドあり（型は不明）
} else {
	// フィールドなし
}
```

## getDoubleでdouble型のデータを取得する

Dartではint型のデータをdoubleにキャストできません（[Allow integer literals in double contexts, and allow all integer constants supported by platform. · Issue #34355 · dart-lang/sdk](https://github.com/dart-lang/sdk/issues/34355)に関連すると思われます）。

そこで、NCMBObjectのgetDoubleメソッドを以下のように修正しています。intの場合は toDouble を使います。それ以外の型の場合は as でキャストを試みます。

```dart
double getDouble(String name, {double? defaultValue}) {
	if (!_fields.containsKey(name) && defaultValue != null) return defaultValue;
	if (_fields[name].runtimeType == int) {
		return (_fields[name] as int).toDouble();
	}
	return _fields[name]! as double;
}
```

これで安全に `object.getDouble('field_name')` が利用できます。

## まとめ

NCMBのFlutter SDKは開発者にとって使いやすいSDKを目指して日々開発を進めています。APIレベルの実装は落ち着いてきたので、より細かなメソッドを実装して使いやすさを向上させています。

ぜひ使っていただき、フィードバックください！

[NCMBMania/ncmb-dart: NCMB library for Dart and Flutter.](https://github.com/NCMBMania/ncmb-dart)
Element Plusのel-uploadにてアップロードするファイルとは別にパラメーターを付属させるやり方

#### 概要
Element Plusのel-uploadを使用していますが、ファイルアップロード時におまけでパラメータを付属させてサブミットする方法でハマったので、備忘録として残しておきます。

#### テンプレート側
```
<el-upload
    ref="upload"
    :data = {option:additionalOptions}
    :auto-upload="false"
    :file-list="fileList"
    :headers="updateHeaders"
    :limit="1"
    :on-change="handleChange"
    :on-error="handleError"
    :on-exceed="handleExceed"
    :on-progress="handleProgress"
    :on-success="handleSuccess"
    :show-file-list="false"
    action="api/hoge/fuga"
    drag>

...省略...

</el-upload>

...省略...

<el-button
    @click="submitUpload"
>
</el-button>
```
ポイントは「:data = {option:additionalOptions}」の部分です。
- optionのところはパラメーターのkeyとなる文字列です。好きな名前で定義してくだい。
- additionalOptionsは変数名なので名前はなんでもいいです。

#### 処理側
```
const upload = ref()
let additionalOptions = ref('')

const submitUpload = () => {
  additionalOptions.value = "FooBar"
  upload.value.submit()
}
```

とすると、サブミットされた先のサーバーサイドで（※例えばRailsの場合）
```
params['option']
```
のように参照すると
```
"FooBar"
```
といった形で設定した値を取得することができる。
Google Chrome をシークレットモードで起動するようにする

擬似的にGoogle Chromeをシークレットモードで起動するようにする方法
※自前PCを業務に利用するなどで、業務に関するアカウント情報などを残したくないなど

# 内容
Automatorを利用してアイコン(アプリケーション）を作成する

## Automator 設定
Launchpad > その他 > Automator を起動

「書類の種類を選択してください」が表示されるので、「アプリケーション」を選択
![スクリーンショット 2022-08-17 10.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209017/89fe2ae3-a889-58f5-cf39-8a78ba5b02b6.png)

項目から「シェルスクリプトを実行」を選択
![スクリーンショット 2022-08-17 10.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209017/47e3c5d6-dca5-cf69-9ce8-729304a3e878.png)

右側に表示される「シェルスクリプトを実行」に以下のコマンドを入力して保存する ※名前はお好みで

![スクリーンショット 2022-08-17 10.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209017/ce0e1336-5b56-5739-6fe5-eca873d9eecd.png)

### コマンド
```
open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args -incognito
```

#### オプション
```
a: ファイルを開くのに使用するアプリケーションを指定する
n: 既にアプリケーションが起動していても、新しいインスタンスを開く
```

## アイコン設定
Automatorで作成するとロボットのようなアイコンで見栄えが悪いのでアイコンを変更する

1. 作成したアプリケーションを右クリック > 「情報をみる」
1. Google Chromeを右クリック > 「情報をみる」
1. Google Chrome側のヘッダーに表示されているアイコン画像を、作成したアプリケーション側のアイコンにドラッグ&ドロップ
1. 作成したアプリケーションのアイコン画像がGoogle Chromeのものに置き換わる

※Google Chrome側のヘッダーに表示されているアイコン画像の位置
![スクリーンショット 2022-08-17 10.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209017/56a79c4d-5e64-3a41-110b-daa9ece7acfe.png)

# さいごに
備忘録的に残してみました
Django初心者がSNSアプリを作る　その1

以下のサイトを参考に、初心者が完成までの道筋を辿ってみる。

https://note.com/saito_pythonista/n/n6550f5c2a07b

このサイトをコピペすれば、初心者視点にとってはかなり完成度の高いSNSアプリが作れるが、このレベルのアプリを自分で1から作成する自信はない。その自信をつけるために、このアプリの作成過程を想像しながら、その手順をこのページに書き記しておくことにした。

# ディレクトリ構成

元ページの「3. ディレクトリの構成とファイルの設定」をそのまま辿る。
プロジェクト名のみ「snsproject」→「snsproject_mine」に変更した。

## 概要

- 設定ディレクトリ、アプリディレクトリの作成
- settingにアプリを追加
- urlどうしの紐づけ
- static, templatesディレクトリの設定

## 完成形

```
snsproject_mine                   #プロジェクトディレクトリ                     
├── config                        #設定ディレクトリ
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py              
│   └── wsgi.py 
├── snsapp                        #アプリディレクトリ
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations  
│   ├── models.py
│   ├── tests.py
│   ├── urls.py                   #追加
│   └── views.py
├── static                        #追加
│   └── style.css                 #追加
├── templates                     #追加
│   └── base.html                 #追加
└── manage.py
```

公式チュートリアル等をもとに進めるとstaticとtemplatesはsnsapp下に配置することになるが、4つ目の設定を行うことでsnsproject直下に配置できる。今回は該当しないが、アプリケーションを複数作成するときに便利な構成である。

書籍「現場で使える Django の教科書《基礎編》」でもこの構成を採用していた。

# うまくいっているか確認

元記事ではそのままコードの解説に入っているが、うまくいっているか不安なのでrunserverでページが表示されるか確認する。現段階でrunserverするとURLが見つからないとエラーを吐くので、URLを設定する。

## snsapp/urls.py

```snsapp/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

上記のURLで参照するviewも設定。

## snsapp/view.py
```snsapp/view.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

これでrunserverをすると、ページが無事に表示された。

![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643756/e383fa81-3f86-4ce3-6cc0-b41e353e61c1.png)


## 参考
https://docs.djangoproject.com/ja/4.0/intro/tutorial01/#write-your-first-view

# 今後の方針
さて、問題はここからである。元記事では淡々と、

1. 認証機能
2. CRUD機能
3. いいね・フォロー機能

の順に実装を行っているが、その通りに進めるとデバッグができない(少なくとも自分は方法を知らない)のである。そこで、本記事では効率性を全く考えずに以下の順番で実装を進めていくことにした。

1. CRUD機能(ユーザー関連の機能を除く)
2. 認証機能
3. 1と2を結びつける
4. いいね・フォロー機能

CRUDを最初に実装することで、動作確認をブラウザ上で簡単に行いたいという魂胆がある。実際どうなのかは知らない。

というわけで次回はCRUD機能の実装を行っていく。
Salesforceのフローを作成しよう～フローを使用してキューを再割り当てする方法

こんにちは。

今回はUsman Ali氏の書かれたSalesforceナレッジを和訳します

（元のヘルプはこちら）
Re-assign cases back to the queue using flow
https://help.salesforce.com/s/articleView?id=000366396&type=1


## やりたいこと
ケースの作成時に所有者だったキューがあります。
ケースのクローズ時に、ケースをキューに再割り当てしたいことがあります。
さあ、どうしましょう。

例：
キュー- USサポート キュー　がありました。
Tomさんは US サポート キューの一員です。

最初はUSキューが所有者としてケースが作成されました。
その後Tomさんはレコードを受け入れることで所有権を取得します。
その後、しばらくしてケースがクローズされた場合は、Tomさんから US サポート キューに再度ケースの所有者を割り当てたいと考えています

## 前提
ケースオブジェクトにカスタム項目（テキスト）が必要です
これはキューのIDを格納するための項目です
カスタム項目名称は「Initial Queue ID」（API参照名　Initial_Queue_ID）とします
なお、このカスタム項目はページレイアウト上で表示させないでください

## 解決策

・フローを作成し自動化を作成します

a.設定から「フロー」を選択

b. [新規フロー] ボタンをクリックし、[レコード トリガー フロー] を選択して [作成] ボタンをクリックします。

![フロー01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/063dc557-2c9b-0cbf-2078-f03c43b75400.png)

c.今回使用する数式を確認しましょう

```
AND(ISCHANGED({!$Record.OwnerId}),LEFT(PRIORVALUE({!$Record.OwnerId}),3) = '00G' ,LEFT({!$Record.OwnerId}, 3) = '005')
```


d.以下のスクリーンショットのすべての手順に従ってください
- オブジェクトでケースを選択
- [フローをトリガーする条件] セクションで [レコードが作成または更新された] を選択します。
- [条件の要件] セクションで [数式の評価がTrueになる（Neｗ）] を選択します。
- 上記の式 (手順 c) を [数式] セクションに貼り付けます
- 「構文を確認」ボタンを押して「有効」になることを確認しましょう

![ケース作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1840905b-7d38-af7e-8701-37ab926c4a26.png)

e. +ボタンをクリックし、トリガーレコードの更新をクリックします
![フロー02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7af1351a-60bd-4054-f428-fed64bc1e951.png)

（レコード更新例）
![change01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6c17390d-6cbd-d0c7-e2db-84012e24e63a.png)
![change02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/927927e2-d9d7-ac78-1862-f96b452ea127.png)


数式
```
PRIORVALUE({!$Record.OwnerId})
```


f.フローを保存し、任意の名前を付けてアクティブ化します。


・次に、Tom さんからのケースを元のケース所有者 ID (USサポート　キュー) に割り当てる別のレコードトリガーフローを作成します。

-フローから [新規] ボタンをクリックし、[レコードトリガーフロー] を選択して [作成] ボタンをクリックします。

![フロー01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/063dc557-2c9b-0cbf-2078-f03c43b75400.png)


- [+] ボタンをクリックし、[トリガー レコードの更新] をクリックして更新フローを作成します
![クローズドケース002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8cb2a539-bf71-200d-6ae7-cd7885bc8eef.png)




- フローを保存し、任意の名前を付けてアクティブ化します。


## 謝辞
今回この記事を執筆した　Salesforce Answers LeaderのUsman　Ali様、本当にありがとうございます。
そしてこの記事を公開してくださったSalesforce様、本当にありがとうございます。

Thank you　Usman　Ali！

Usman　Ali氏についてはこちら

Usman Ali is a Salesforce Architect at Dubai Holding Asset Management. He brings more than 10+ years of Salesforce ecosystem experience to the table, with several nominations for good measures. He enjoys being challenged and engaged with projects and team that requires him to work outside of his comfort and knowledge set. He takes pride in helping other trailblazers in the Trailblazer Community and is the group leader of Developer Group, Dubai, UAE.
Nuxt3でFirestoreを利用した際のエラーハンドリング

# はじめに
Nuxt3において、Firestoreを使った際のエラーハンドリング方法

## バージョン
    "nuxt": "3.0.0-rc.6"
    "firebase": "^9.9.1"
今後バージョンによって挙動が変わる可能性はあります。

# やりたいこと
パラメータに指定されたキー(DocumentID)を元に、Firestore内のDocumentを取得して、なかったら404として画面表示をしたい。

参考：Nuxt3における、Firebaseの初期設定方法は以下を参考にしています。

https://github.com/nuxt/framework/discussions/2404

## やったこと
`composables`に定義した取得処理内でFirestore内にデータがなかった場合は[createError](https://v3.nuxtjs.org/guide/features/error-handling#createerror)でエラーを生成してthrowするようにしています。
ただ、この状態だとクライアント側でコンソール上にエラーが表示されるだけでした。（呼び出し元は割愛）

```composables/useHoge.ts
export const useHoge = () => {
    const db = useState<Firestore>('db').value
    const fetchData = async (key: string) => {
        try {
            const docRef = doc(collection(db, COLLECTION_NAME), key)
            const docSnap = await getDoc(docRef)

            if (!docSnap.exists()) {
                throw createError({ statusCode: 404, statusMessage: 'invalid parameter' })
            }
            return docSnap.data()

        } catch (e) {
            throw e
        }
    }

    return {
        fetchData
    }
}
```

クライアント側で、throwされたエラーを補足して、ハンドリングするためにpluginsに[errorHandler](https://v3.nuxtjs.org/guide/features/error-handling#example-with-global-error-reporting-framework)を作成し、そこで`throwError`することで、任意のエラー画面を表示することができました。


```plugins/error.ts
export default defineNuxtPlugin((nuxtApp) => {
    nuxtApp.vueApp.config.errorHandler = (error, context) => {
        throwError((error as Error).message)
    }
})
```

```error.vue
<script setup lang="ts">
import { useError } from 'nuxt/app';
const error = useError()

</script>

<template>
    {{ error.message }}
</template>
```
AWS LambdaのPythonアップデート手順について

# はじめに
LambdaにおけるPython3.6のサポート終了についてAWSから通知があり、
Python3.6からPython3.9にアップデートする必要がありました。
アップデート作業の備忘として、AWSコンソールでの操作手順をまとめてみました。

# アップデート対象の確認

AWSコンソールにログインし、Lambdaの関数一覧画面に遷移します。
「ランタイム」欄に使用している言語のバージョンが表示されています。
今回はPython3.6を使用している「cwlog_S3export」を例に記載します。
![Lambda_update1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/d5f4167f-1fb7-d6a5-bebc-0eb5badec70f.png)

# アップデート作業

関数名を押下し、関数の詳細画面を表示します。
デフォルトで「コード」タブが表示されており、最下部にスクロールすると「ランタイム設定」欄が表示されます。
「ランタイム設定」欄の「編集」を押下し、設定画面に遷移します。
![Lambda_update2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/96a82c43-56ac-36ef-5664-06f51382c0b0.png)



「ランタイム」欄のプルダウンからPython3.9を選択し、右下の「保存」を押下します。
![Lambda_update3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/b06ee05a-f7fd-e0db-960f-ea35ffbd1088.png)

数秒後、"正常に更新されました"というメッセージが画面上部に表示されます。
又、最下部にスクロールし、先程の「ランタイム」欄を参照するとPython3.9と表示されています。
![Lambda_update4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/c71b88e9-d1d7-94f2-917b-6d3c2ee8a33e.png)


以上でアップデート作業完了になります。

# 考慮事項など
・事前の稼働確認
　　事前にアップデート後の稼働確認を別環境で実施することを推奨します。

・ダウンタイム
　　即時適用の為、ダウンタイムは無し。

・アップデート後の稼働確認
　　テスト機能を使用して意図的にアップデート後のLambda関数を実行でき、
　　初回稼働時の検証が可能です。
　　ものによっては不用意に実行できないものもあると思いますが、
　　その場合は自然体での初回稼働を待って検証する形になります。
Lambdaのレイヤーの参照方法

Layerに配置したファイルは `/opt`で参照可能。
試しに表示してみる。


Google fontから[Noto Sans Japanese](https://fonts.google.com/noto/use#how-are-noto-fonts-organized)をダウンロードし、`.font.zip`にしてLayerにアップロード。
Lambda側でLayer参照の設定をしてから以下を実行

```js
const fs = require('fs');

exports.handler = function(event, context){
    fs.readdir('/opt/', function(err, files){
        console.log(files);
        context.done(null, err);
    });
}
```

Cloud Watchに以下のように出力される
```
[ '.font' ]
```

さらに`.font`ディレクトリの中身を表示してみる
```js
const fs = require('fs');

exports.handler = function(event, context){
    fs.readdir('/opt/.font/', function(err, files){
        console.log(files);
        context.done(null, err);
    });
}
```

出力結果
```
[
  'NotoSansJP-Black.otf',
  'NotoSansJP-Bold.otf',
  'NotoSansJP-Light.otf',
  'NotoSansJP-Medium.otf',
  'NotoSansJP-Regular.otf',
  'NotoSansJP-Thin.otf'
]
```

参照できたことがわかった
2022-08-11 Docker 上の PHP コンテナから、ホストの PostgreSQL データベースに接続する

## 環境


```
$ docker --version
Docker version 20.10.6, build 370c289
$ cat /etc/os-release | head -n 2
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
```



## やりたいこと

Ubuntu のホスト上で Docker エンジンを動かし、さらにその上で PHP のコンテナを動作させている。

Ubuntu のホスト上で別途 PostgreSQL を動作させており、通常 127.0.0.1 のアドレスで接続できる状態である。

Docker エンジン上の PHP コンテナから、 ホストOS 上の PostgreSQL データベースに接続したい。


## 方法

以下の stackoverflow の回答でうまく行った。

[https://stackoverflow.com/a/52591177](https://stackoverflow.com/a/52591177)


### PostgreSQL 側の設定

pg_hba.conf で、Docker のネットワークからの接続を許可する。私の場合は 172.16.0.0/12 のサブネットだったので、 172.16.0.0/12 の範囲を広く許可した。


```
# "local" is for Unix domain socket connections only
local   all         	all                                 	peer
# IPv4 local connections:
host	all         	all         	127.0.0.1/32        	md5
host	all         	all         	172.16.0.0/12       	md5
```


postgresql.conf を編集し、すべてのインターフェースで接続を待ち受けるように設定した。


```
 #listen_addresses = 'localhost' 	# what IP address(es) to listen on;
                 	# comma-separated list of addresses;
                 	# defaults to 'localhost'; use '*' for all
                 	# (change requires restart)
 listen_addresses = '*'  	# what IP address(es) to listen on;
```



### Docker 側の設定

docker0 インターフェースに指定されたアドレスを確認し、これをデータベースのホストアドレスとして指定する。


```
$ ip address show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
	link/ether 02:42:31:7f:15:4c brd ff:ff:ff:ff:ff:ff
	inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
```


その上で、 `--network=host` の引数を与えて `docker run` コマンドを実行したところ、データベースへの接続が成功した。


```
docker run --network=host --env-file .env <container-name>
```



## Ref

[https://stackoverflow.com/a/52591177](https://stackoverflow.com/a/52591177)
2022-08-04 PostgreSQL で実行されたクエリのログを出力し、確認する

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.339 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Fri Aug 05 2022 01:03:40 GMT-0700 (PDT)
* Source doc: 2022-08-04 PostgreSQL で実行されたクエリのログを出力し、確認する
* Tables are currently converted to HTML tables.
----->


## 環境


* CentOS7
* PostgreSQL 9

```
# cat /etc/redhat-release 
CentOS Linux release 7.8.2003 (Core)
# postgres --version
postgres (PostgreSQL) 9.2.24
```




## 手順

[logging - How to log PostgreSQL queries? - Stack Overflow](https://stackoverflow.com/questions/722221/how-to-log-postgresql-queries) に記載がある通り、 postgresql.conf を編集する。

postgres ユーザで `$PGDATA` 変数の値を確認すると、 postgresql.conf が存在するディレクトリが確認できる。


```
# su - postgres
$ echo $PGDATA
/var/lib/pgsql/data
```


log_statement を all に設定。


```
#log_statement = 'all'
```


logging_collector はデフォルトで on だった。


```
logging_collector = on
```



```
#log_directory = 'pg_log'
```


log_directory も、特に変更する必要はなさそうだった。

設定を済ませて postgresql を再起動する。


```
# systemctl restart postgresql
```


pg_log ディレクトリにログファイルが吐かれていることが確認できる。


```
$ ls /var/lib/pgsql/data/pg_log/
postgresql-Wed.log
```
【Next.js】Storybookの導入

## プロジェクトの作成
Next.jsのプロジェクトを作成します。

```:ターミナル
$ yarn create next-app --typescript プロジェクト名
```

## Storybookのインストール
プロジェクトのルートディレクトリで以下のコマンドを実行してStorybookをインストールします。
```:ターミナル
npx storybook init
```
このコマンドを実行することで、パッケージの他`package.json`の`scripts`にコマンドが追加されます。

```package.json
{
  "scripts": {
    "story-book": "start-storybook -p 6006",
    "build-storybook": "build-storybook"
  }
}
```
バーコード をSalesforceで使う

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [BarcodeScanner API を使用した画面フローのバーコード スキャナー](https://automationchampion.com/2022/06/08/barcode-scanner-for-screen-flow-using-the-barcodescanner-api-2/)

+ [How to Generate QR code for any Salesforce Object](https://merfantz.com/blog/how-to-generate-qr-code-for-any-salesforce-object/)



# QRコードの作成

+ [Google Chart APIを使ってQRコードを作る](https://atmarkit.itmedia.co.jp/ait/articles/1602/26/news037.html)

私の覚えpartialのコールアウト管理というコンポーネントで実験　2022-08-23

試にAura コンポーネントに表示できるかを確かめてみます。

```
<img src="http://chart.apis.google.com/chart?cht=qr&chs=130x130&chl=http://www.atmarkit.co.jp/ait/subtop/win/" />
```

保存できないですねぇ。相変わらず意味不明。やる気を削ぐことだけは超一流ですな。

Failed to save fkd_callout.cmp: ParseError at [row,col]:[317,76] Message: The reference to entity "chs" must end with the ';' delimiter.: ソース


&が悪さしているようだ。&amp;に置き換えます。
```
<img src="http://chart.apis.google.com/chart?cht=qr&amp;chs=130x130&amp;chl=http://www.atmarkit.co.jp/ait/subtop/win/" />
```
おお、そのまま表示できたぞ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a7e74f0d-3d1a-9409-7fff-361c3a882575.png)

# VF PageのPDFに使えるか？

アカン、アイコンが壊れている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6373bfef-bb37-004f-5fb3-888b5b9236b4.png)

+ [Visualforce ページを使用した PDF での画像のレンダリングが断続的に失敗する](https://help.salesforce.com/s/articleView?id=000314461&type=1)

>PDF の場合、Google に対するクライアントの IP は、セールスフォースの外部 IP アドレスです。
HTML の場合は、クライアント マシンの IP アドレスです。

>無料アクセスの制限は、クライアントの IP アドレスに基づいています。そのため、データセンター内の多くのユーザー/組織が Google マップを使用している場合、無料アクセスの制限を簡単に超えてしまう可能性があります。

しかし会社のホームページにある会社のロゴでも同じエラーになる。これが原因でないかな？

+ [PDF としてレンダリングすると外部画像リンクが壊れる](https://salesforce.stackexchange.com/questions/120704/external-image-link-broken-when-rendering-as-pdf)

問題は、PDF レンダリング エンジンが Apex と同じセキュリティ制限の下で実行されることでした。つまり、外部 URL は、レンダラーによって使用されるリモート サイトの設定で許可されている必要があります。

+ [PDF でレンダリングされたページで画像が機能しない](https://salesforce.stackexchange.com/questions/332859/image-not-working-on-pdf-rendered-page)

リモートサイトの設定したんだけど、うまく表示されないですね。

+ [Saved PDF (VF rendered as pdf) has broken image](https://developer.salesforce.com/forums/?id=906F0000000MKY6IAO)
これではないなぁ。

googleの方はリモートサイトの設定で機能した。
何で会社のサーバーはダメなんだ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/20558ab8-a983-cca0-a633-d8da5dd81b6f.png)

画像ファイルが svgだったから？　jpegにしたら表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1abd9f37-ac18-c581-fa5c-501467992a6e.png)

```
http://chart.apis.google.com/chart?cht=qr&chs=130x130&chl=https://fukadadenki--dev2.lightning.force.com/lightning/r/CustomObject1__c/a126D000000N7LVQA0/edit

https://chart.apis.google.com/chart?cht=qr&chs=130x130&chl=https://fukadadenki--dev2.lightning.force.com/lightning/r/CustomObject1__c/a126D000000N7LVQA0/edit

https://chart.apis.google.com/chart?cht=qr&chs=130x130&chl=https://fukadadenki--dev2.lightning.force.com/lightning/r/CustomObject1__c/a126D000000N7LVQA0/edit?count=2&backgroundContext=%2Flightning%2Fr%2FCustomObject1__c%2Fa126D000000N7LVQA0%2Fview
```
確率論的リスク解析の数理と方法　コロナ社　金野秀敏先生

```r
#p.65 多重ワイブル分布　最尤法
library(survival)

data=data.frame(lung)
data=na.omit(data)

t=data$time
t0=min(t)
status=data$status-1

x=cbind(rep(1,nrow(data)),data$age,ifelse(data$sex==1,1,0),ifelse(data$sex==2,1,0),data$ph.karno,data$pat.karno,data$meal.cal/100,data$wt.loss)

ite=5*10^4
eta=10^(-6)
beta=rep(10^(-9),ncol(x))
m=0.5

for(l in 1:ite){
  
lam=log(t^m/t0)+x%*%beta  
ptx=1-exp(-exp(lam))  

dptx1=t(x)%*%c(exp(lam)*exp(-exp(lam))*status/ptx)
dptx2=-t(x)%*%c(exp(lam)*exp(-exp(lam))*(1-status)/(1-ptx))
dptx=dptx1+dptx2
dm=sum(c(log(t)*exp(lam)*exp(-exp(lam))*status/ptx)-c(log(t)*exp(lam)*exp(-exp(lam))*(1-status)/(1-ptx)))
m=m+eta*dm
beta=beta+eta*dptx
loglik=sum(status*log(ptx))+sum((1-status)*log(1-ptx))

#print(loglik)
}

avet=(1/m)*(log(t0)-x%*%beta)+log(gamma(1+1/m))

accuracyvec=c()
values=seq(0.1,0.9,0.01)

for(j in 1:length(values)){
accuracy=sum(ifelse(ptx>values[j],1,0)==status)/length(status)
accuracyvec=c(accuracyvec,accuracy)
}

plot(values,accuracyvec)

```

```r

#SIRの離散近似計算　p.97
#確認中
t=c(1:20)
I=c(2,3,4,5,6,7,8,9,10,9,7,5,4,3,2,1,1,1,1,1)
S=c(18,17,16,15,14,13,12,11,10,10,rep(10,10))
R=20-(I+S)
r0=1

N=S[1]-S

beta=N[length(N)]/sum(S*I)
rinv=sum(I)/(R[length(R)]-r0)
r=1/rinv

#Pr(dN(t)=1,dR(t)=0|St-)
beta*S*I

#Pr(dN(t)=0,dR(t)=1|St-)
r*I

#sig(beta)
beta/sqrt(N[length(N)])

#sig(rinv)
rinv/sqrt(R[length(R)]-r0)



```
2022-08-16 log_errors を off としているのに、 PHP のエラー出力が行われる

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.36 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Tue Aug 16 2022 02:09:02 GMT-0700 (PDT)
* Source doc: 2022-08-16 log_errors を off としているのに、 PHP のエラー出力が行われる
* This is a partial selection. Check to make sure intra-doc links work.
* Tables are currently converted to HTML tables.
----->



#  log_errors を off としているのに、 PHP のエラー出力が行われる

## 環境

* PHP 5.4

## 発生した事象

PHP で作成したコマンドラインアプリケーションにおいて、「Warning: Division by zero」のゼロ除算エラーが発生した。

このアプリケーションでは、 “log_errors“ の設定を “off“ にすることで、エラー出力がされないことを保証していた。具体的には、 `ini_set('log_errors', false);` の文をコードに含めていた。

にも関わらず、以下のようにエラーの内容が出力された。


```
Warning: Division by zero in - on line ...(略)
```



## 原因

“log_errors” の設定は “off” であったが “display_errors” の設定が “on” となっており、これによってエラーの内容が標準出力されていた。


```
# cat a.php
<?php
echo 'start' . PHP_EOL;
var_dump(1 / 0);
echo 'end' . PHP_EOL;
```

このスクリプトを、 "display_errors" を "on" に設定して実行すると以下のような出力が行われる。


```
# php -d 'log_errors=off' -d 'display_errors=on' a.php
start

Warning: Division by zero in /root/work/a.php on line 3
bool(false)
end
```


なお、「Warning ~」の出力は標準出力 (stdout) に出力されている。


```
# php -d 'log_errors=off' -d 'display_errors=on' a.php 1> /dev/null
```


“log_errors” についても “on” にしてコードを実行すると、以下のように同じエラーが二つ出力される形となる。

「PHP Warning: ~」が “log_errors” のものであり、「Warning: ~」が “display_errors” のものである。


```
# php -d 'log_errors=on' -d 'display_errors=on' a.php
start
PHP Warning:  Division by zero in /root/work/a.php on line 3

Warning: Division by zero in /root/work/a.php on line 3
bool(false)
end
```


なお、「PHP Warning: ~」の “log_errors” の出力は、標準エラー出力に出力されている。


```
# php -d 'log_errors=on' -d 'display_errors=on' a.php 2> /dev/null
start

Warning: Division by zero in /root/work/a.php on line 3
bool(false)
end
```



## error_log ディレクティブの設定について

"log_errors" で有効化されたエラーがどこに出力されるかは、 "error_log" ディレクティブで設定される。

環境を確認したところ、 “error_log” の設定はされていなかった。

> If this directive is not set, errors are sent to the SAPI error logger. For example, it is an error log in Apache or stderr in CLI.

とあった。 “log_errors” を “on” に設定すると標準エラー出力されるのは、コマンドライン実行であり、かつ “log_errors” ディレクティブの設定がされていなかったためであると思われる。
英語キーボード使用のWindows(日本語)からxrdpにつなぎ、キーボードレイアウトをUSに固定する

# 英語キーボード使用のWindows(日本語)からxrdpにつなぐとキーボードレイアウトが狂う

日本語環境のWindowsを英語キーボード(HHKBなど)で使用していて、Linux環境にxrdpで接続すると、Linuxの側でキーボードレイアウトを英語のものにしていても、日本語レイアウトに変更される。これにより、存在しない物理キーに割り当てられる'_'(アンダースコア)などの入力は特に困る。

![local_keymap_file2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729778/74a9aa39-23f0-48ec-01e3-25499fbf3c72.jpeg)

'/var/log/xrdp.log'でxrdpのログを確認すると、日本語のキーボードレイアウトを設定しようとした上、ビルトインのキーマップと整合せず、結果としてローカルのキーマップファイルを使用した、とある(赤枠部分)。

![keyboard_preferences.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729778/2adf9133-4cbf-b0c7-4a52-7846e6d8796a.jpeg)

このとき、'Keyboard References'のレイアウトは、'Generic 101-key PC'を設定している。ここで、レイアウトを設定しなおせば、その場限りでUSレイアウトになるが、接続の都度、この作業を行うのは煩わしい。

# とりあえずの対処

![default_layout_map2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729778/28aa88ee-366e-204c-e046-f2a7c00def92.jpeg)

英語キーボードしか使用しないのであれば、日本語環境から接続されたと判別されたときの標準のレイアウトをUSにするのが簡便。

'/etc/xrdp/xrdp_keyboard.ini'の'[default_layouts_map]'のセクションの'rdp_layout_jp'の値を'us'に変更する(赤枠部分)。

変更後、安全のためには、Linuxを再起動して再接続する。xrdpで接続した状態でのxrdpサービスの再起動では、再接続の際、画面がブラックアウトすることがあるので注意。

:::note info
xrdp接続からログアウトした上で、別にターミナル接続してxrdpサービスを再起動すれば、Linuxの再起動は必要ないはずだけど、未確認。
:::

:::note info
動作確認環境
- xrdp 0.9.17-2ubuntu2
- Ubuntu 22.04.1 LTS
- Windows 10
:::
【Power Automate】ファイルが作成されたとき（プロパティのみ）のトリガー、実はファイル名・フォルダ名取得できてます

Excel Onlineコネクタの「ファイルが作成されたとき（プロパティのみ）」トリガーの出力を後続のアクションで利用しようと動的なコンテンツをみるとファイル名など表示されません（検索で名称がHITすれば表示される模様）。
こんなときはtriggerOutputs()を利用して式を直接入力をします。

### 実行履歴からトリガーの出力をダウンロードしてみる

出力（動的なコンテンツのbodyに相当）の”ダウンロードします”をクリックしてJSONを見てみます。
お目当ての項目がいればその項目名を式の直接入力で指定します（triggerOutputs()?['body/ 以下の1～4のプロパティを指定 ']）

1. "{Name}"　：ファイル名
2. "{FilenameWithExtension}"　：拡張子付きのファイル名
3. "{Path}"　：ファイルのあるフォルダ名
4. "{FullPath}"　：ファイルのあるフォルダ名/拡張子付きのファイル名
Windows10が勝手にスリープする原因はプレインストールの節電ソフトだった

# 現象

Windows10が一定時間経過すると勝手スリープする。

2022年08月06日あたりに行った『WindowsUpdateと各種ソフトのアップデート適用』あたりから発生。

# Windows10のスリープ系設定をしても直らず

下記に設定しても直らず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fff462e7-23a0-8178-0438-33fbe7320bc0.png)

下記に設定しても直らず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2d490e8b-9b3c-89e3-336c-7236efd9280c.png)

下記に設定しても直らず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0930c96b-d460-685a-2cdf-0029e4d99010.png)

（『システム無人スリープタイムアウト』はレジストリー変更して初めて電源オプションに表示される隠し項目）

# Windowsログ

下記ログになっていた。

Kernel-Power 42
システムがスリープ状態になります。
スリープの理由: Application API

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/61604f35-240c-bd56-a3dd-3bd8f1b3612f.png)

# 原因は節電ソフト

IPM＋という節電ソフトが動いてた。
そこに『1時間で休止』の設定がされていた。
『無し』に設定したら勝手にスリープされなくなった。

IPM＋とはHP製のパソコンにプレインストールされている節電ソフト。
このソフトが動いているとWindows10の設定とは無関係にスリープされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/538c6af9-4370-d83a-6e7d-1443cb54fe0f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9c870064-deaa-f30e-56f2-971565611fcb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2c91fd02-aac5-3873-71b1-408804037818.png)



# 参考サイトさん

https://ascii.jp/elem/000/002/001/2001809/

https://itojisan.xyz/trouble/20480/

https://min117.hatenablog.com/entry/2020/06/29/222617

https://tooljp.com/qa/Windows10-shutdown-suddenly-096E.html

↓ありがとうございます

https://isokkko.hatenablog.jp/entry/2017/08/24/114141

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
/dev/nullは透明なハードディスク

コマンド実行時のエラー（標準エラー出力）を表示させたくないとき、次のように`2>/dev/null`と書きます。

```shell
hogehoge 2>/dev/null
```

よく「空のファイルに書き込む」と説明されますが、ではなぜ`/dev/null`と書くのでしょうか？

これを理解するとLinuxのファイルシステムについて少し詳しくなれたので、Qiitaにも残しておくことにしました。

## /devディレクトリとは？

/devディレクトリには、**デバイスを表すデバイスファイル**が入っています。

さて、「デバイスファイル」とは何でしょうか。

Linuxは、なんでもファイルとして処理します。ハードウェア＝デバイスを操作する（ex.HDDに書き込む）ときも、デバイスに直接触れるのではなく、デバイスファイルにアクセスすることで実現しています。

つまり**デバイスファイルは、かならずなにかしらのデバイスを表している訳です。**

そんなデバイスファイルの格納されているディレクトリが、/devディレクトリです。

## /dev/nullって？

上記の前提をおさえると、`/dev/null`に対する理解が一気に進みます。すなわち、

**「/dev/nullはどのデバイスを表しているのか？」**

という問いが、本記事のテーマです。

そしてこの問いは「何もない」が正解になります。`/dev/null`はどのデバイスも表しません。

> ところで、デバイスファイルと呼ばれていても対応するデバイスがないものもあります。例えば/dev/nullがそうで、このファイルは読み込むと常に空、何かを書き込むとどこかに消えてしまうという不思議なファイルです。
(青木峰郎『ふつうのLinuxプログラミング 第2版　Linuxの仕組みから学べるgccプログラミングの王道』、p41)

このように進めると、/dev/nullは透明なハードディスクのデバイスファイルである、とイメージできるでしょう。

「空のファイルである」とほぼ同じ結論ですが、そこまでの道のりで学べることは多かったです。

## 参照

- 青木峰郎『ふつうのLinuxプログラミング 第2版　Linuxの仕組みから学べるgccプログラミングの王道』

## 備考

- ここに書いたデバイスファイルは、なんらかの文字列が記録されている「狭義のファイル」ではありません。/devディレクトリには、テキストファイルのようなものはありません。このあたりを把握すると、Linuxの世界がすこし見えてくる気がしました。
新人エンジニアの2ヵ月間の感想

## はじめに
この記事は新人エンジニアが2ヵ月で学んだことを記した内容です。  
同じ新人やエンジニアを目指す方たちの参考になればと思い投稿しました。

### この記事を書いている人
* 新人エンジニア(2ヵ月経過)
* プログラミングは独学(Java、Railsチュートリアルなど)
* 共同開発作業は就職後に初めて経験

### 対象読者
* 新人エンジニアの業務の一例を知りたい人
* 新人は何を考えているのかサンプルとして知りたい人

### おことわり
* 技術よりも感想がメインの記事です。
* 私が経験した内容は業務の一例として参考にしてください。

## 担当は修正作業がメイン
担当：フロント修正・改良　(JavaScript(CoffeeScript)、Vue.js、MySQLなど)

SQLでモデル値の確認やデバッグ機能でのエラー対処などをしました。    
SQLは使う機会が多い基本的な技術だと思いました。
システム開発に携われたのでとても嬉しかったです。  

[MySQLのインストール手順(Windows)](https://sukkiri.jp/technologies/databases/mysql/mysql_install.html)
[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)

## 社内ドキュメントが役に立った
社内ドキュメントはシステム機能の把握に一番役立ちました。  
最初からソースコードを見始めても内容やロジックを理解しづらいので、  
まずは資料を探す作業から始めました。
* 社内ドキュメントの保管場所の一例
    * Googleドライブなどの共有フォルダ
    * 事業部のWiki

## メモをする＆頭を空にする
作業予定・進捗・感想を思いついたままメモとして書き残しました。   
メモを残すと頭の中を一旦カラっぽにできるので気持ちがとても楽になりました。
また、素直な感想を書いたほうが当時の心境が蘇りやすいので内容を思い出しやすかったです。  

メモには紙を使っていましたが、メモの量が多くなった段階からエディタに変更しました。  
最近は文章が見やすくなるマークダウン形式でなるべく書いています。　　
(※この記事もマークダウン形式ですね。)

[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[QiitaのMarkdownパーサー変更にともなう注意点について](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)

## 業務で便利に感じたツール  
* プロジェクト管理ツール：[Backlog](https://backlog.com/ja/)
  弊社ではBacklogを使ったプロジェクト管理を行っています。  
  タスクの進捗や期限の確認、担当者の変更によるタスクの依頼など機能が豊富です。  

* チャットツール：[Slack](https://slack.com/intl/ja-jp/)
  口頭よりも文章での相談のほうが順序立てた会話ができました。
  また、チャットを使うと進捗の周知報告にもなるので一石二鳥です。

* エディタ：[Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)、ソースコード管理：[Git](https://git-scm.com/)  
  画面を使ってコーディング相談ができるので便利でした。

![qiita_スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743373/40e43bec-6b7d-d901-f4b7-7b7391f99e26.png)

# まとめ
エンジニアの業務を始めてまだ2ヵ月ですが覚えることが沢山ありました。  
その中でも「周囲とのコミュニケーションを図ること」が一番大切だと思いました。  
幸いにも、歓迎会や勉強会など周囲と打ち解けられる機会を多く用意してもらい、
業務の話題だけでなく雑談も多くできました。

まずはどの業務にも活かせられる知識から身に付けようと思います。  
早くチームの戦力になれるよう頑張ります！
cronを使わず定期的にコマンドを実行する小技

# シェルスクリプトだけでコマンドを定期実行したい

Dockerコンテナでバックアップなどのコマンドを定期的に実行したいときがありますが、cronを使うのは手順が多くて面倒に感じていました。

そこでシンプルなシェルスクリプトで、定期的にコマンドを実行をする方法を考えたのでメモします。

```bash
#!/bin/bash

# 12時間ごとに実行する場合(秒数)
EVERY=$(( 60 * 60 * 12 ))
# 日本時間(+0900)に調整
OFFSET=$(( 60 * 60 * 9 ))

while true; do
  # 次のタイミングまでスリープ
  TS=$(( $(date "+%s") + $OFFSET ))
  sleep $(( ($TS / $EVERY + 1) * $EVERY - $TS ))

  echo "ここで好きなコマンドを実行"
done
```

上の例では毎日、日本時間の0時と12時に指定のコマンドを実行します。

機能面でcronにはもちろん敵いません。でも「ラフにn時間ごとみたいな定期実行したい」、みたいなときはこの方がわかりやすいかなと思いましたが、どうでしょうね。
bootstrapのクラス一覧

# Bootstrapとは？
米Twitter社が開発したもので、自分のHTMLのコードにBootstrapの
公式URLを貼り付けることで公式ページにアクセスし、
css・jQuery・javascriptのコードをHTMLに貼り付けます。

## bootstrapの使い方（クラス）

例 : 
&lt;div class="w-25">テキスト</p&gt;

divタグに対して特定のクラスを宣言することにより
width（横幅）を全体の25％に設定します

### 要素のサイズ（Widht , height)

| クラス名 | 横幅 |
| :--: | :-: |
|w-25|Width 25%|
|w-50|	Width 50%
w-75|	Width 75%
w-100|	Width 100%
w-auto|	Width auto
Python,JavaScript,PHP,Ruby,Perlのインストールの比較 | プログラミング言語比較

<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,JavaScript,PHP,Ruby,Perlのインストールの比較

# Python

https://qiita.com/disk131/items/a4f74ea9aa9c173cc71a

# JavaScript

https://qiita.com/sefoo0104/items/0653c935ea4a4db9dc2b

# PHP

https://qiita.com/yuya00/items/45312f386a7a0d5d76de

# Ruby

https://qiita.com/Rock22/items/31ab75c87fcf3122f357

# Perl

https://perlzemi.com/blog/20180820153471.html
【夏休み企画】#IT用語一問一答【毎朝投稿9日目】浮動小数点数

# この記事を読むと、、
- 「関連用語」を使って「浮動小数点数」を説明できるようになる
- 「浮動小数点数」がもっと好きになる(多分)

# 関連用語
単精度浮動小数点数 / 倍精度浮動小数点数 / IEEE754 / 下駄はき表現 / けち表現 / 非正規化数

[**復習用**] 記事の内容を見る前に上記の言葉で「浮動小数点数」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/c23add51378d93ea2d3c

# 浮動小数点数とは
浮動小数点数 = コンピュータにおける小数の表現形式

- 使われるbit数にバリエーションがあるがよく使われるのは
    - **単精度浮動小数点数** = 32bitで表現される浮動小数点数
    - **倍精度浮動小数点数** = 64bitで表現される浮動小数点数

- **IEEE754**による規格が広く用いられている。以下はIEEE754での話

- 小数を格納するbit列を以下の3つに分けて表現する
    - 符号部 = sign = 1なら＋、0なら−を意味する
    - 指数部 = exponent
        - 単精度なら8bit, 倍精度なら11bit
    - 仮数部 = fraction
        - 単精度なら23bit, 倍精度なら52bit

- **下駄履き表現** = バイアス = 指数部の値が常に正になるように調整する手法
    - 単精度であれば2の補数表記で-126~+127になるところを127を足して1~254とする
    - 小数の大小を容易に比較できる
    - 指数部を0や255にすることで±0, ±∞, NaN, 非正規化数を表せる
        - **非正規化数** = denormalized number = 浮動小数点方式において$1.??? * 2^q$の形 = 正規化で表現できないほど0に近い数


- **けち表現** = 仮数部の小数点の左の1を省略することで1bit削減する手法
    - 0は指数部、仮数部ともに0とすることで表現する


# 参考資料
- https://ja.wikipedia.org/wiki/IEEE_754
- https://ja.wikipedia.org/wiki/%E9%9D%9E%E6%AD%A3%E8%A6%8F%E5%8C%96%E6%95%B0
UbuntuでPythonのバージョンをダウングレードする方法

この記事では、UbuntuでPythonのバージョンを任意のものにダウングレードする方法を説明します。


```makefile
実行環境

VMware: Ubuntu22.04
Python 3.10.2 → 3.6.15
```

※他のバージョンでも同様の手順で実行可能だと思われますが、未検証です。

多くの記事を参考にしながらバージョン変更を試みましたが、導入できず詰まりました。その結果、エイリアス設定と**update-alternativesの利用**が必要だと分かりました。ここではその手順を順に説明します。


# 流れ


以下は手順の概要です。
※「バージョン」は導入したいPythonバージョン（例: 3.6.15）を指します。


↓
`sudo nano .bashrc`
(`alias python=pythonバージョン`、
`alias python3=pythonバージョン`)
↓
**ソースコードからのPythonインストール**
`/opt/python/バージョン/bin/python -V`
`sudo ln -s /opt/python/バージョン/bin/python /usr/bin/pythonバージョン`
`sudo update-alternatives --install /usr/bin/python python /usr/bin/pythonバージョン 1`
↓
`python -V`
`python3 -V`

以下から説明していきます


# おまじない

ターミナルにて以下を入力。
```
sudo apt update
sudo apt upgrade
```

ホームディレクトリにて。ここら辺はとりあえず念のためやっておきましょう。

# .bashrcの編集(エイリアスの設定)
```
sudo nano .bashrc
```
を打ってもらい、nanoエディタ(ここではnanoを使ってますがviなど任意可)を起動し.bashrc設定ファイルの編集。

画面が出てくると使い方に戸惑うと思いますが、
コードの編集画面が出てきたらctrl+End、または下矢印で一番下まで移動してもらい、
```
alias python=pythonバージョン
alias python3=pythonバージョン
```
こちらを追記してもらい、`Ctrl+X  → y → Enter`
 
# Pythonのインストール・パスを通す・バージョンの登録


Pythonのインストールに入っていきます。

[**Build, compile and install Python**](https://www.build-python-from-source.com/)のサイトから、自身の使用するPythonのバージョン・環境を選択していただき、
(基本はデフォルトの設定ですが、
&nbsp;・update Pip, Setuptools and Wheel packages,
&nbsp;・add some soft links for comfortable usage,
&nbsp;・install required OS packages and developer tools &nbsp;
だけはオンにしてください)

注意点として、一番下は通常だと`AmazonLinux2`になってるのでUbuntuに切り替えるのを忘れないでください。
生成されたコードをコピー&ペーストし、ターミナルに貼り付けEnterキーを押します。
しばらく時間がかかりますが待ちます。

おわりましたら、`/opt/python/バージョン/bin/python -V` にてバージョンの確認
**＊これ以降は、ホスト名の横にtmp/バージョンなんちゃらと出てないと失敗する可能性があります。**

`sudo ln -s /opt/python/バージョン/bin/python /usr/bin/pythonバージョン` 
を入力しパスを通す。sudoで管理者権限で打たないと、エラーがおきるので注意。


そして、`sudo update-alternatives --install /usr/bin/python python /usr/bin/pythonバージョン 1` を打ち、Pythonを指定します。
<br>

これにて完了で、一度ターミナルを閉じて起動し直し
`python -v`  (-vオプションは、--versionの省略)
`python3 -v`
などで自分の好みのバージョンがはいってるか確認してください。


# まとめ
Python3.6.15 など任意のバージョンが表示されていれば成功です。

無駄な工程が入ってる可能性はありますが、こちらを一通り試せば問題ないかと思われます。

`update-alternative`は再起動すると選択が戻ると聞いており、そのままになる理由はつかめてないですが、分かりしだい追記いたします。
レコード数/ユニークなID数をカウントする(SPSS Modeler データ加工逆引き7-8)

# レコード数/ユニークなID数をカウント（レコードカウント）

![スクリーンショット 2022-08-03 10.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4ac6aa57-e9b1-5f21-f00e-8c28b0c0f6db.png)

## 1.想定される利用目的

・読み込んだデータの概要確認

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/record_count.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-03 10.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3598573d-46f9-9a85-4494-755f272f723a.png)

#### [テーブル]ノードのウィンドウにレコード数（行数）とフィールド数（列数）

a.入力するデータは以下の通りです。[テーブル]ノードのヘッダーに[2フィールド,93レコード]と表示されるためこの時点でテーブル全体が93行だとわかります。
![スクリーンショット 2022-08-03 10.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7396d325-b133-c14f-2e8e-79ee3d34d070.png)

#### レコード集計を設定しないでプレビューする

b.[レコード集計]ノードを何も設定しないでプレビューします。読み込んだデータの行数を最も早く知る方法です。SQLプッシュバックが有効の場合はSQLで集計済みの値のみを返すため高速処理が期待できます。
![スクリーンショット 2022-08-03 10.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c60f5c45-0758-0928-b434-66b64e67e457.png)

SQLプッシュバックは以下の記事で解説しています。

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-02/

c.bと同じで何も設定していません。
![スクリーンショット 2022-08-03 10.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fa796c17-325c-6ea0-9a79-b1580a29d786.png)

d.[テーブル]を実行します。bと同じレコード数のみが表示されます。
![スクリーンショット 2022-08-03 10.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9741c7f5-4f50-4a5d-7267-0cbc199e5e4e.png)

#### IDのユニーク数を確認する

e.[レコード集計]ノードを編集します。[キーフィールド]に[ID]を選択し、[フィールドにレコード度数を含める]からチェックを外します。
![スクリーンショット 2022-08-03 10.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6bea1212-06a4-43f8-1fca-a8a8fbc44720.png)

[プレビュー]します。IDをキーにしたのでIDのリストが表示されます。
![スクリーンショット 2022-08-03 10.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8ea017a7-4dc2-c743-9819-a6b76b563d35.png)

f.[レコード集計]ノードを編集します。ひとつ前のテーブルのレコード数がIDの行数になるため[キーフィールド]をブランク、[フィールドにレコード度数を含める]にチェックを入れます。
![スクリーンショット 2022-08-03 10.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6e41288c-576d-bf36-4200-b1820bd44710.png)

g.[テーブル]ノードを実行します。
![スクリーンショット 2022-08-03 10.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/99ac4649-e8fd-fdcf-5938-fd26e69440ca.png)

#### 注意事項

aで読み込むテーブルの規模が小さい場合には問題ありませんが、大規模な場合全レコードを表示するのに時間がかかり、Serverやクラウドにデータが存在する場合トラフィックに負荷がかかります。そのためレコード集計とサンプリングを効果的に利用してデータ理解を進めることをお勧めします。

## 4.参考情報

#### [レコード集計]ノードを扱った記事

https://qiita.com/416nishimaki/items/eba427686b4af9b7d41c

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
VMwareからフロッピーディスクを消す方法

[**公式ドキュメント**](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.security.doc/GUID-600D24C8-0F77-4D96-B273-A30F256B29D4.html)にも記載はありますが、わかりやすく説明すると、

![スクリーンショット 2022-08-17 050542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456876/91816004-fd24-b00f-fbc1-135c3982b64e.png)

VMwareでフロッピーの表示が消えない際は

![スクリーンショット 2022-08-17 052154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456876/460ab8ad-df3c-05ba-78ef-166816c7afc5.png)

仮想マシンの設定から選択し、削除で表示されなくなります。
(ここではVMware Workstationで行ってますが他も似た表記かと)

CD・DVDにしても、BIOSから消す方法も紹介されてますが、
とくにその必要もないです
PHP_EOLで改行されないの対処方法

# 対処法
PHP_EOLは単体で使わない。
```
<?php
PHP_EOL;
```
ではなく、
```
<?php
echo PHP_EOL;
```
か、
```
<?php
echo "こんにちは", PHP_EOL;
```
のように、カンマで区切って使う。
# 気づき
やり方は、すっごく簡単な方法だったけど、勉強になった。